pax_global_header00006660000000000000000000000064120056311220014502gustar00rootroot0000000000000052 comment=d10991a9e0ec94b9a2efc551b0f922f21fa9e438 bzflag-2.4.2+ds1/000077500000000000000000000000001200563112200134375ustar00rootroot00000000000000bzflag-2.4.2+ds1/AUTHORS000066400000000000000000000226271200563112200145200ustar00rootroot00000000000000 -*- coding: utf-8 -*- BZFlag Contributors =================== The BZFlag development team would like to thank the many people who have contributed to BZFlag over the years. The game was initially and primarily written by Chris Schoeneman in 1992 while he was a Masters student at the Cornell Program of Computer Graphics. In 1999, Chris Schoeneman trasferred copyright and maintainership of the game over to Tim Riker, whom continues in that role today. Since the project was released as open source software around roughly the same time, a considerable number of other developers and contributors have become a part of the project as well. Over the project's lifetime, there have been many contributors to BZFlag. Listed below are the various individuals and groups that have provided their time, energy, and input. The contributors are characterized into different groups to indicate the level and type of involvement with the project: core developers, developers, code contributors, servers & infrastructure, corporate & organizational support, and special thanks. For each section, the contributors are listed in chronological order with the earliest contributors listed first. CORE DEVELOPERS --------------- Among all the developers are a core set of individuals that have dedicated themselves to the improvement of the game at some point in time, making a substantial and sustained impact on the game's development and on-going maintenance. If you review the commit logs, these are the names you will likely see the most. Chris Schoeneman Active: 1992-2000 Jeff Myers (JeffM2501) Active: 1997-Current Tim Riker Active: 1999-2005 Frank Thilo (chestal) Active: 2001-2004 David Trowbridge (purple_cow) Active: 2001-2004 Dave Brosius (MrApathyCream) Active: 2001-2005 Sean Morrison (brlcad, learner) Active: 2003-Current Alfredo Tupone (c3po) Active: 2003-Current Daniel Remenak Active: 2003-Current Jeff Makey (BulletCatcher) Active: 2008-Current Scott Wichser (blast007) Active: 2004-Current DEVELOPERS ---------- The developers of BZFlag are a widely diverse group of individuals from all around the world. These individuals have made multiple significant contributions to the game on a sustained basis. They become actively involved in the development discussions, and have otherwise actively helped to keep the game evolving and improving. -- 1992 -- Chris Schoeneman -- 1997 -- Jeff Myers -- 1999 -- Tim Riker -- 2000 -- Colin Bayer -- 2001 -- Jeremiah Moss (CobraA1) Frank Thilo (chestal) David Trowbridge (purple_cow) Dave Brosius (MrApathyCream) -- 2003 -- Lars Luthman (larsl) Sean Morrison (learner, brlcad) Alfredo Tupone (c3po) Daniel Remenak Bryan Jennings (bryjen) -- 2004 -- Ian Agar (lan56) Julio Jimenez (Manu, jujibo) -- 2005 -- Mark Thomas (menotume) Bernt Hansen (Thumper, bthansen) -- 2006 -- -- 2007 -- -- 2008 -- Jeff Makey (BulletCatcher) -- 2009 -- CODE CONTRIBUTORS ----------------- Code contributors includes individuals that have made useful yet limited source code contributions to the game. The range of contributions varies greatly here with some providing simple one-time patches and others providing several complex modifications. Regardless, these individuals are generally not involved in the on-going game development (yet). They have nonetheless provided some valued source code contribution to the game and certainly deserve mention and appreciation for their involvement. -- 1993 -- Phillip Ezolt Bjrn Augustsson Jed Lengyel -- 1997 -- David Hoeferlin Andrew White Tim Olson Tom Hubina -- 1999 -- Stea Greene Erik Andersen -- 2000 -- Daniel Lonard Daryll Strauss -- 2001 -- Frank Siegert Eric Anholt Kris Verbeeck Darrell Walisser Nick Sayer Valery Fouques Pier Donini Mathias Gumz -- 2002 -- Sal Gonzalez Harry Dodgson Janne Hassinen Chris Walters Andrew Greig Kefin Avila Janne Hassinen Andrea Mathis -- 2003 -- Isak Styf Michael Hoffman David Wollner (jbdigriz) Justin Zaun Adam Krell Franois Revol (mmu_man) Micah Dowty (scanline) Dennis Pedersen (dmp) Bernt Hansen (Thumper) -- 2004 -- Nils McCarthy (shkoo) Scott Wichser (blast007) Andrew Heyn -- 2005 -- David Vuorio Steve Krenzel (sgk284) Simon Richard Grint Angelina Carlton (bzgirl) Frederic Jolliton (cods) Matthew Sachs Andrew Keyser Frank Evers (pimpinella) Nathan Goings Karsten Behrmann Harry Keller Garrett Padera Mike Weisenborn (orange) Joshua Rogers Daniel Mulford Thomas Stauer -- 2006 -- Andrew McNabb (amcnabb) Stephan Hradek (Skeeve) Jon Brandvein (Workaphobia) Felix Monniger (Linuxx0r) (uso) Michael Sheppard (mike_s_) Thomas Matelich (sosedada) Geoffrey Sneddon (gsnedders) Petteri Aimonen (jpa) Markus (links_2004) Jim Melton (jwmelto/Flash) (harry666t) -- 2007 -- (randomparticle/snick) Lou Nigro (LouMan) Darek Dawidowski ([darek]) Joshua Bodine (Constitution) Phillip (the_vaxorcist) Christophe Henry (sbgodin) Chris Wible (L4m3r) Jrgen Pedersen Tjern (daxxar) -- 2008 -- Alexander Boyd (javawizard2539) James Lawrence (spldart) Istvan Szakats (Wyk3d) Luke Rewega (Lukstr) Steven Mertens (catay) Paul Blokus (Paul_PL) Eric M. McIntyre (mcintyem) Alexander Law -- 2009 -- Mathew Eis (Bulldozer) Mayur Bhosle (mayurbhosle) Russell Bryant (russellbryant) -- 2010 -- (cobrafast) -- 2011 -- David Anderson (mdskpr) Ben K. (McSpider) Tilmann Hentze (Moiree) Dagobert Michelsen Thomas Daede (TD-Linux) Brad Smith (War Pig) Karl Goetz Amrico Monteiro -- 2012 -- Kyle Mills (khonkhortisan) Ian Farr (Quol) Ryan Kavanagh (ryanakca) GOOGLE SUMMER OF CODE --------------------- BZFlag has been proud to take part in the Google Summer of Code (http://code.google.com/soc/) in 2007, 2008, and 2009. The student contributors for each year are listed. -- 2007 -- Chris Wible (L4m3r) Kornel Kisielewicz (epyon) Jude Nelson (jude) Jrgen Pedersen Tjern (daxxar) -- 2008 -- Luke Rewega (Lukstr) David Sanders (KingofCamelot) Joshua Bodine (Constitution) Harrison Reiser (bugQ) Istvan Szakats (Wyk3d) Kornel Kisielewicz (epyon) -- 2009 -- Istvan Szakats (Wyk3d) Mathew Eis (Bulldozer, KingRobot) Quentin Pradet (Cygal) William Hahne (Will07c5) SERVERS AND INFRASTRUCTURE -------------------------- Open Source Technology Group, Inc. SourceForge.net project resources Tim Riker original list server (rikers.org) Cameron Mandrake (nidhoggr) second generation list server (secretplace.us) Sean Morrison (learner) third generation list server (bzflag.bz) Scott Wichser (blast007) Fourth generation list server (list.bzflag.org) Tucker McLean (Noodleman) First Generation stats site (my.bzflag.org) Ian Farr (Quol) Second Generation Stats Site (stats.bzflag.org) Joe Van Overberghe (joevano) mediawiki site (wiki.bzflag.org) CORPORATE AND ORGANIZATION SUPPORT ---------------------------------- Below are organizational entities that have provided direct support to the game either through direct funding, legal and licensing support, network and hardware resources, or distribution channels. SGI (formerly named Silicon Graphics, Inc.) Free Software Foundation GNU General Public License GNU Lesser General Public License XiGraphics Package distribution providers Debian, FreeBSD, Gentoo Open Source Technology Group, Inc. SourceForge project services Peer-Directed Projects Center Freenode IRC network Google Inc Summer of Code 2007, 2008, 2009 SPECIAL THANKS -------------- Some people deserve special thanks for their involvement in the game that cannot be categorized into the other sections. This includes individuals that were instrumental in getting the game started, keeping it alive, and otherwise encouraging the spirit of the game. This also includes artists, web designers, and others working towards improving the BZFlag community. Tamar Cohen Dan Kartch Brian Smits Greg Spencer Kevin Novins Rick Pasetto Ben Trumbore Erin Shaw Don Greenberg Adam Rosen Nafees Bin Zafar Kyle Van Essen Mac OS X Disk Mounting Image Backgrounds: -- 1.7g0r6, 1.7g0r7 -- Reid Ellis -- 1.10.* -- Tupone Alfredo (c3po) -- 2.0.4 -- Mark Thomas (menotume) -- 2.0.6 -- Harry Keller (Saturos) -- 2.0.10 -- Harry Keller (Saturos) NOTES ----- hoeferlin, hubina, myers, olson are people Chris does not know that contributed code to 1.7 kartch, lengyel, smits, spencer were in the cornell graphics grad program when chris was lengyel added the jumping strauss ported to the 3Dfx cards cohen is a friend of chris' from cornell who made the tank models novins, pasetto, trumbore, shaw were also graphics grad students, but didn't contribute code shaw was chris' officemate and graciously put up with all the noise from the game rosen was a former coworker with some good suggestions trowbridge began work on bzedit circa 1999 --- If any corrections or additions need to be made, please contact one of the active core developers. Additionally, you may send inquiries, suggestions, and comments to the developer mailing list: bzflag-devel@lists.sourceforge.net bzflag-2.4.2+ds1/BUGS000066400000000000000000000001361200563112200141220ustar00rootroot00000000000000see the bug tracker on SourceForge http://SourceForge.net/tracker/?group_id=3248&atid=103248 bzflag-2.4.2+ds1/BZFlag.xcodeproj/000077500000000000000000000000001200563112200165405ustar00rootroot00000000000000bzflag-2.4.2+ds1/BZFlag.xcodeproj/Makefile.am000066400000000000000000000001071200563112200205720ustar00rootroot00000000000000EXTRA_DIST = \ project.pbxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/BZFlag.xcodeproj/Makefile.in000066400000000000000000000255251200563112200206160ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = BZFlag.xcodeproj DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ project.pbxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu BZFlag.xcodeproj/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu BZFlag.xcodeproj/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/BZFlag.xcodeproj/project.pbxproj000066400000000000000000000322361200563112200216220ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 1492F4E7079631460008E0BD /* bzadmin in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1492F4E6079631460008E0BD /* bzadmin */; }; 1492F4F3079631710008E0BD /* bzflag in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1492F4F2079631710008E0BD /* bzflag */; }; 1492F4F90796318B0008E0BD /* bzfs in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1492F4F80796318B0008E0BD /* bzfs */; }; 1492F52C079634140008E0BD /* MacBZFlag.icns in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1492F51E079633E10008E0BD /* MacBZFlag.icns */; }; 14CF6EB00798FF7A0071D7DA /* SDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14CF6EAF0798FF7A0071D7DA /* SDL.framework */; }; 14CF6ED50798FF880071D7DA /* SDL.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14CF6EAF0798FF7A0071D7DA /* SDL.framework */; }; 14CF6EFD0799EA370071D7DA /* libcrypto.0.9.7.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 14CF6EFB0799EA370071D7DA /* libcrypto.0.9.7.dylib */; }; 14CF6EFE0799EA370071D7DA /* libcurl.3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 14CF6EFC0799EA370071D7DA /* libcurl.3.dylib */; }; 14CF6F0A0799EA940071D7DA /* libcrypto.0.9.7.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14CF6EFB0799EA370071D7DA /* libcrypto.0.9.7.dylib */; }; 14CF6F0B0799EA940071D7DA /* libcurl.3.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14CF6EFC0799EA370071D7DA /* libcurl.3.dylib */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 1492F4DA079630A30008E0BD /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 6; files = ( 1492F4E7079631460008E0BD /* bzadmin in CopyFiles */, 1492F4F3079631710008E0BD /* bzflag in CopyFiles */, 1492F4F90796318B0008E0BD /* bzfs in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; 1492F527079634040008E0BD /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 7; files = ( 1492F52C079634140008E0BD /* MacBZFlag.icns in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; 1492F62B07978AF80008E0BD /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 14CF6F0A0799EA940071D7DA /* libcrypto.0.9.7.dylib in CopyFiles */, 14CF6F0B0799EA940071D7DA /* libcurl.3.dylib in CopyFiles */, 14CF6ED50798FF880071D7DA /* SDL.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1492F48D07962F620008E0BD /* BZFlag.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BZFlag.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1492F4E6079631460008E0BD /* bzadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; name = bzadmin; path = src/bzadmin/bzadmin; sourceTree = ""; }; 1492F4F2079631710008E0BD /* bzflag */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = bzflag; path = src/bzflag/bzflag; sourceTree = ""; }; 1492F4F80796318B0008E0BD /* bzfs */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = bzfs; path = src/bzfs/bzfs; sourceTree = ""; }; 1492F51E079633E10008E0BD /* MacBZFlag.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = MacBZFlag.icns; path = src/platform/MacOSX/MacBZFlag.icns; sourceTree = ""; }; 14CF6D6B0798A1510071D7DA /* BZFlag-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; name = "BZFlag-Info.plist"; path = "src/platform/MacOSX/BZFlag-Info.plist"; sourceTree = ""; }; 14CF6EAF0798FF7A0071D7DA /* SDL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL.framework; path = /Library/Frameworks/SDL.framework; sourceTree = ""; }; 14CF6EFB0799EA370071D7DA /* libcrypto.0.9.7.dylib */ = {isa = PBXFileReference; explicitFileType = compiled; name = libcrypto.0.9.7.dylib; path = /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libcrypto.0.9.7.dylib; sourceTree = ""; }; 14CF6EFC0799EA370071D7DA /* libcurl.3.dylib */ = {isa = PBXFileReference; explicitFileType = compiled; name = libcurl.3.dylib; path = /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libcurl.3.dylib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1492F48B07962F620008E0BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 14CF6EB00798FF7A0071D7DA /* SDL.framework in Frameworks */, 14CF6EFD0799EA370071D7DA /* libcrypto.0.9.7.dylib in Frameworks */, 14CF6EFE0799EA370071D7DA /* libcurl.3.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 147C9C3B0794FB1800910F8C = { isa = PBXGroup; children = ( 1492F5CB079788480008E0BD /* Frameworks & Libraries */, 1492F48E07962F620008E0BD /* Products */, 1492F51E079633E10008E0BD /* MacBZFlag.icns */, 14CF6D6B0798A1510071D7DA /* BZFlag-Info.plist */, ); sourceTree = ""; }; 1492F48E07962F620008E0BD /* Products */ = { isa = PBXGroup; children = ( 1492F4F2079631710008E0BD /* bzflag */, 1492F4F80796318B0008E0BD /* bzfs */, 1492F4E6079631460008E0BD /* bzadmin */, 1492F48D07962F620008E0BD /* BZFlag.app */, ); name = Products; sourceTree = ""; }; 1492F5CB079788480008E0BD /* Frameworks & Libraries */ = { isa = PBXGroup; children = ( 14CF6EFB0799EA370071D7DA /* libcrypto.0.9.7.dylib */, 14CF6EFC0799EA370071D7DA /* libcurl.3.dylib */, 14CF6EAF0798FF7A0071D7DA /* SDL.framework */, ); name = "Frameworks & Libraries"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1492F48C07962F620008E0BD /* BZFlag */ = { isa = PBXNativeTarget; buildConfigurationList = 4EF4667F0CB999BC00B52624 /* Build configuration list for PBXNativeTarget "BZFlag" */; buildPhases = ( 1492F4C10796300E0008E0BD /* ShellScript */, 1492F4DA079630A30008E0BD /* CopyFiles */, 1492F527079634040008E0BD /* CopyFiles */, 1492F62B07978AF80008E0BD /* CopyFiles */, 1492F546079634740008E0BD /* ShellScript */, 1492F48807962F620008E0BD /* Resources */, 1492F48A07962F620008E0BD /* Rez */, 1492F48B07962F620008E0BD /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = BZFlag; productName = BZFlag; productReference = 1492F48D07962F620008E0BD /* BZFlag.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 147C9C3F0794FB1800910F8C /* Project object */ = { isa = PBXProject; buildConfigurationList = 4EF466830CB999BC00B52624 /* Build configuration list for PBXProject "BZFlag" */; hasScannedForEncodings = 1; mainGroup = 147C9C3B0794FB1800910F8C; productRefGroup = 1492F48E07962F620008E0BD /* Products */; projectDirPath = ""; targets = ( 1492F48C07962F620008E0BD /* BZFlag */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1492F48807962F620008E0BD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXRezBuildPhase section */ 1492F48A07962F620008E0BD /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXRezBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 1492F4C10796300E0008E0BD /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "./autogen.sh 2>&1\n./configure --enable-universal --enable-shared --enable-debug 2>&1\nncpu=`sysctl hw.ncpu | awk '{print $2}'`\nif test \"x$ncpu\" = \"x\" ; then\n\tncpu=1\nfi\nmake -j$ncpu\nexit $?\n"; }; 1492F546079634740008E0BD /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "echo \"Creating dirs\"\nmkdir -p ${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\necho \"Copying data files\"\ncd ${PROJECT_DIR}/data\nfind . -type d -not -regex '.*\\.svn.*' -exec mkdir -p ${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/{} \\;\nfind . -type f -not -regex '.*\\.svn.*' -exec cp -pR {} ${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/{} \\;\necho \"Copying plugins\"\nmkdir -p ${BUILT_PRODUCTS_DIR}/${PLUGINS_FOLDER_PATH}\ncd ${PROJECT_DIR}\nfind plugins -name \\*.so -exec cp {} ${BUILT_PRODUCTS_DIR}/${PLUGINS_FOLDER_PATH}/. \\;\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin XCBuildConfiguration section */ 4EF466800CB999BC00B52624 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = "@executable_path/../Frameworks"; GCC_DYNAMIC_NO_PIC = YES; GCC_MODEL_CPU = ""; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; GCC_WARN_UNKNOWN_PRAGMAS = NO; INFOPLIST_FILE = "src/platform/MacOSX/BZFlag-Info.plist"; INSTALL_PATH = "$(USER_APPS_DIR)"; LIBRARY_STYLE = STATIC; MACOSX_DEPLOYMENT_TARGET = 10.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-framework", Carbon, ); OTHER_REZFLAGS = ""; PRODUCT_NAME = BZFlag; REZ_EXECUTABLE = NO; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wall"; }; name = Development; }; 4EF466810CB999BC00B52624 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = "@executable_path/../Frameworks"; GCC_DYNAMIC_NO_PIC = YES; GCC_MODEL_CPU = ""; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; GCC_WARN_UNKNOWN_PRAGMAS = NO; INFOPLIST_FILE = "src/platform/MacOSX/BZFlag-Info.plist"; INSTALL_PATH = "$(USER_APPS_DIR)"; LIBRARY_STYLE = STATIC; MACOSX_DEPLOYMENT_TARGET = 10.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-framework", Carbon, ); OTHER_REZFLAGS = ""; PRODUCT_NAME = BZFlag; REZ_EXECUTABLE = NO; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wall"; }; name = Deployment; }; 4EF466820CB999BC00B52624 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { FRAMEWORK_SEARCH_PATHS = "@executable_path/../Frameworks"; GCC_DYNAMIC_NO_PIC = YES; GCC_MODEL_CPU = ""; GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h"; GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO; GCC_WARN_UNKNOWN_PRAGMAS = NO; INFOPLIST_FILE = "src/platform/MacOSX/BZFlag-Info.plist"; INSTALL_PATH = "$(USER_APPS_DIR)"; LIBRARY_STYLE = STATIC; MACOSX_DEPLOYMENT_TARGET = 10.1; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ( "-framework", Carbon, ); OTHER_REZFLAGS = ""; PRODUCT_NAME = BZFlag; REZ_EXECUTABLE = NO; SECTORDER_FLAGS = ""; WARNING_CFLAGS = "-Wall"; }; name = Default; }; 4EF466840CB999BC00B52624 /* Development */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Development; }; 4EF466850CB999BC00B52624 /* Deployment */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Deployment; }; 4EF466860CB999BC00B52624 /* Default */ = { isa = XCBuildConfiguration; buildSettings = { }; name = Default; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 4EF4667F0CB999BC00B52624 /* Build configuration list for PBXNativeTarget "BZFlag" */ = { isa = XCConfigurationList; buildConfigurations = ( 4EF466800CB999BC00B52624 /* Development */, 4EF466810CB999BC00B52624 /* Deployment */, 4EF466820CB999BC00B52624 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; 4EF466830CB999BC00B52624 /* Build configuration list for PBXProject "BZFlag" */ = { isa = XCConfigurationList; buildConfigurations = ( 4EF466840CB999BC00B52624 /* Development */, 4EF466850CB999BC00B52624 /* Deployment */, 4EF466860CB999BC00B52624 /* Default */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; /* End XCConfigurationList section */ }; rootObject = 147C9C3F0794FB1800910F8C /* Project object */; } bzflag-2.4.2+ds1/COPYING000066400000000000000000000636421200563112200145050ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! bzflag-2.4.2+ds1/ChangeLog000066400000000000000000001563131200563112200152220ustar00rootroot00000000000000 BZFlag Release Notes ==================== BZFlag 2.4.2 "Doomsday Edition" (2012-07-28) --------------------------------------------- * Added UPnP option to configure server networking - Alfredo Tupone * Added an option to have both leading and lagging radar shot lines - David Anderson * Prevent prohibited solo bots from joining, rather than kick afterward - Scott Wichser, Jeff Makey * Add thiefControl plugin which prevents stealing flags from teammates - Bernt Hansen, Scott Wichser * Preserve shot-limited flag behavior on final shot - David Anderson * Remove the -zoom command line option from bzflag - Jeff Makey * Provide observer team chat in OpenFFA mode - David Anderson * Add fairCTF plugin - Chris Wible * Allow plugins to specify a color when firing world weapons - Chris Wible * Add option for chat on the left and radar on the right - Kyle Mills * Add autoFlagReset plugin - Chris Wible * Allow joystick hats as input on Evdev and SDL platforms - Kyle Mills * Added Fastmap Plugin - Jeffery Myers BZFlag 2.4.0 "Wake the Dead" (2011-07-03) ------------------------------------------ * Shot messages are synchronized with position - Alfredo Tupone * Added /playerlist for everyone - Thomas Stauer * Added message type for properly handling /me actions - Scott Wichser * Added BZDB option to hide flags on radar server side - David Anderson * Removed /setpass /register /identify - David Anderson * Handicap is computed on the server - Alfredo Tupone, Bernt Hansen * Allow plugins to register custom flag types - Daniel Remenak * Forced *image.bzflag.org for image downloads until user sets otherwise - David Anderson * Accepted patch from McSpider, added OpenFFA - David Anderson * Removed -requireUDP, now it is always required - David Anderson * Accepted patch from McSpider, removed client option to turn off fog - David Anderson * Accepted patch from McSpider, added -noTeamKills option - David Anderson * Removed -3Dfx, -no3Dfx. Moved -geometry -> -window - David Anderson * Add ricochet on a per object basis for .bzw files - trepan, David Anderson * serverControl plugin- Add option to ignore observers for server shutdowns - Bernt Hansen * serverControl plugin- Only report ban file access errors once - Bernt Hansen * serverControl plugin- Limit filesystem checks to once every 3 seconds - Bernt Hansen * LogDetail plugin-Add SERVER-MAPNAME with the public server description - Bernt Hansen * The bzfs -time command line option allows end time - Scott Wichser, Ian Agar * screenshots now compressed asynchronously - Daniel Remenak, randomparticle * Add /serverdebug command and plugin API - Bernt Hansen * Add bzfs -utc command line option to log timestamps using universal time - Bernt Hansen * Fix buffer overrun when using -ts micros on Linux - trepan, Bernt Hansen * Only players with POLL permission are eligible to vote - Bernt Hansen * Only allow a single end shot credit for holding the shield flag - Bernt Hansen * Do not inform hunters of stealthy prey - Ian Agar * All scores are controlled completely by the server - Daniel Remenak * Relabel player "email" string as "motto" - Jeff Makey * Require TALK privilege for player motto to be broadcast - Jeff Makey * Always require valid authentication for registered names - Jeff Myers, Scott Wichser * Move flag identification server side - Alfredo Tupone, Jeff Myers, Frank Evers, Scott Wichser * GM sanity checks - Alfredo Tupone * Added the -publickey requirement for publicly listed servers (and renamed the bzfs -public option to -publictitle) - trepan, Jeff Myers BZFlag 2.0.16 "No Foolin'" (2010-04-01) ---------------------------------------- * Fix command line options in Windows launcher - Scott Wichser * Fix regression in protocol handling by server - Jeff Makey, Scott Wichser * Add bullet tails as seen out the viewport - trepan * Add observer mouse controls for roaming and tracking modes - trepan * Add the /forceradar client-side command for observers - trepan * Minor cleanup of source and build system - Jeff Makey * Explicitly link to the dl library when needed - Jeff Makey * Remove unused dependency on Xi library - Jeff Makey * Clarify copyright assignment terms for developers - Jeff Myers * Allow only one Enter message per player instance - Jeff Makey * Add TimeLimit plugin - Steven Mertens * Remove broken vocaliser and obsolete torBlock plugins - Jeff Myers BZFlag 2.0.14 "This isn't the release you are looking for." (2010-02-15) ------------------------------------------------------------------------- * Add Options -> Display -> AntiFlicker option - trepan * Add Options -> Input -> Confine Mouse (MotionBox) - trepan * Adjust advanced ground rendering for texture flicker - trepan * Change the default stencil bitplanes to 1 to fix stencil shadows and various other stencil features - trepan * Backport fix for /idbanlist and /hostbanlist crashes - trepan * Add support for gcc-4.4 and libtool-2.2 - Jeff Makey * Update to Microsoft Visual C++ 9 from 8.0 - Jeff Myers * Update to directInput 8 from 7 - Jeff Myers * Fix player ghosting failure - Steven Mertens * Provide API support for using bz_moveFlag on team flags - Scott Wichser * Add pushstats plugin for future statistics gathering system - Jeff Myers * Increase restrictions on incompletely joined players - Jeff Myers, Scott W. * Announce saved file name in recordmatch plugin - Jeff Makey * Fix buffer overflow in menu subsystem - Jeff Myers * Fully support glob-style wildcards in hostbans and make name comparisons case insensitive - Bryan Jennings * Properly limit maximum message size in /showgroup command - Jeff Makey * Reset team scores in case of a capture during a countdown - Jeff Makey * Block spoofed /me messages - Scott Wichser * Keep flags within the world boundary - Jeff Makey * Add the "roamView" BZDB variable - trepan * Change fonts to DejaVu - Jeff Myers, Tim Riker * Source cleanup - Tim Riker BZFlag 2.0.12 "The release without a name." (2008-06-25) --------------------------------------------------------- * Fix build with -ffast-math avoiding use of isnan for fog - Alfredo Tupone * Fix for memory leaks - * libGLEW requirement controlled by --with-glew - Alfredo Tupone * Actually build with SDL_Image, if required - Alfredo Tupone * Remove extra dir separator from cache entries - Jeff Myers * Configurable "defaultFOV" (60 deg) for widescreen users - Jeff Myers * Adjust shown coordinate for observers - Jeff Myers * Use the foghack only if the config says - Jeff Myers * Queue spawns after flag captures - l4m3rthanyou, pacman97 * Fix kill callback when is coming from server - Jeff Myers * Fix intermix of chat messages and api callback - Jeff Myers * Various permission fixes - Jeff Myers * Plugins path fixed - Jeff Makey * Kerberos and thread removed (never used) - Alfredo Tupone * Event log fixed - Jeff Myers * Workaroung to a driver bug - Jeff Myers * Word filtering is case insensitive - * Correctly interface with c-ares 1.5.1 and lower - Alfredo Tupone * Not showing a "new rabbit" message when player ID == NoPlayer - blast007 * gcc-4.3 fixes - Tim Riker, Alfredo Tupone * MacOSX: Consistent search of resource files - Sean Morrison * MacOSX: update the project to XCode 2.4.1 - Sean Morrison * Added _countdownResumeDelay to control resume delay. - Thomas Stauer * Slot numbers on scoreboard now appear regardless of hideAdmin - Joshua Bodine BZFlag 2.0.10 "Never Say Never" (2007-11-16) --------------------------------------------- * Added a work around for buggy DRI open source ATI drivers and the narrow flag - Jeff Myers * Add /modcount command - Joshua Bodine, Anonymous * Fix bug where users get locked into autopilot mode - Joshua Bodine * Fix bug where poll results would not be announced - Joshua Bodine * Fix antikill notice bug - Joshua Bodine * Add -adminlagannounce and -lagannounce - Thomas Stauer * Check for talk permission for part/quit messages - uso * First map no longer ignored in Start Server menu - Ravu al Hemio * Implemented Confine Mouse for Windows platforms - Daniel Remenak * Implemented fullscreen->windowed mode toggle on Windows - Daniel Remenak * Add the rabidRabbit plugin - LouMan * Add packet loss kick and related admin commands - Thomas Stauer * Reclaim lost memory from sound sample - Tupone Alfredo * Fixed bashism on debian rules - Ryan Kavanagh * Add the rabbitTimer plugin - L4m3r * Fix some segfaults when re-joining - Tupone Alfredo * Compliance with gcc-4.2 - Tupone Alfredo * Fix the build system to be more distro friendly - Tupone Alfredo * Plugins get flag resets/spawns/grab/drop/transfer - Jeff Myers, Bernt Hansen * Fix compiler problem with gcc-4 - Tupone Alfredo * Fixed high fps problem - Frank Thilo * Added more info for observers - Jeff Myers, Frank Thilo * torBlock plugin added - Jeff Myers, blast007 * Optionally use mesh position and height for radar - Thomas Stauer * Add the regFlag plugin - Bernt Hansen * Fix memory leak from cURL - blast007 * Add the Phoenix plugin - Jeff Myers * Add favorite server - Frank Thilo * SDL sound rate fix - Alfredo Tupone * add bzID and server status to logDetail plugin - Bernt Hansen * Add -tkannounce to announce tk on admin channel - Bernt Hansen * Add the serverControl plugin - Bernt Hansen * Add keepaway plugin - LouMan * API calls to reset bzdb - Jeff Myers * API call to get the player pause state. - Jeff Myers * API calls to reload bans, and other files - Jeff Myers * API event for shot ends - Jeff Myers * API command to move a flag - Jeff Myers * add API exposure for lag, jitter, and packetloss - Jeff Myers * Add koth plugin - LouMan * Add timedctf plugin - LouMan * Add teamflagreset plugin - LouMan * Add wwzones plugin - LouMan * flagStay plugin added - Jeff Myers * Give everyone notice of pause messages - Jeff Myers * Fix for /silence command - Skeeve * Fix mousebox edge positioning - Mark Thomas * Fixed on spanish localization - xukosky@yahoo.es * Instructions to fix sound on ALSA added - Tupone Alfredo * Change filename format for easier location of matches - uso * Adding jitter kick and related admin commands - Thomas Stauer * Global banlist reload with local banlist - uso * Fix to spawned and lag attributes in bz_updatePlayerData - Matthew Marshall * Ability to change the killer in a PlayerDieEvent - Matthew Marshall * Added shotID to bz_PlayerDieEventData - Matthew Marshall * Expose the countdown and game time stuff to the api - Jeff Myers * Backport the record stop function from 2.1 - Jeff Myers * Backported WW GMs from 2.1 - Matthew Marshall * Converts box & pyramids to mesh if required - Anonymous * Allows leading face specification (x+,x-,y+,y-,z+,z-) - Anonymous * Authorization is invariant to case - Anonymous BZFlag 2.0.8 "Oops, Happy Mother's Day" (2006-05-13) ----------------------------------------------------- * Add a plugin to record matches - Jeff Myers. * Add an option to send out a UDP heartbeat message for observers behind flakey routers - Jeff Myers * Replaced admin message sound - Sean Morrison * Client and server now close http connections correctly - Daniel Remenak * Fixed crash when rogue autopilot picks up a team flag - Daniel Remenak * Fixed spawnpoint selection regression - Sean Morrison BZFlag 2.0.6 "Good enough for now" (2006-04-09) ------------------------------------------------ * game variables no longer accept invalid values. - Jeff Myers * Special Effects use tank (was team) color - Karsten Behrmann, Jeff Myers * /reset uses the values from the config and the map as default - Jeff Myers * Sreenshots now remember where they left off - Jeff Myers, Thomas Sowell * Have windows dump std::error out to a file - Jeff Myers * Various API enhancements - Jeff Myers and others ( from patches ) * Not applauding when capturing his own flag - Alfredo Tupone * Fixing crash on invalid captured flag - Alfredo Tupone * Fixed bots on a public server - Alfredo Tupone * Don't send admin the server password when wrong - Alfredo Tupone * Client config file can be saved on request - Alfredo Tupone * Allow for longer help files (50 lines) - Angelina Carlton * Allow selective /reload of databases - Bernt Hansen * Fix wrong kick if pausing having V and moving - Julio Jimenez * Prevent long distance tank warping through walls - Sean Morrison * Display paused state when screen capturing while playing - Sean Morrison * Added new logDetail plugin - Bernt Hansen * Fixed issue with denial-of-service message attacks - Sean Morrison * Support for -window on Mac command line executions - Sean Morrison * Show slot numbers in lagstats (if admin) - Mark Thomas, Mike Weisenborn * FPS limit energy saver option for laptops - Karsten Behrmann, Sean Morrison * Send admin channel warning if /password fails - Garrett Padera, Jeff Myers * Known players not authenticated are detected - Tupone Alfredo * Added /checkip command - Frank Thilo * "Enable Local Shot/Spawn Effects" affects "Driving with" - Daniel Remenak * Show shot reload indicators when driving with a tank - Daniel Remenak * Fix misc/bzfquery.pl to handle MsgGameTime - Tegan, Mark Thomas * Simple server list searching - Daniel Remenak * Added GUI option for email display length - Mark Thomas BZFlag 2.0.4 "Shiny" (2005-09-30) ---------------------------------- * Fixed server join bug when cached worlds disappear - Sean Morrison * Prevent phantom zoned players from pausing - Sean Morrison * Implemented multiple player hunt - Mark Thomas * Directional keys pressing works, even in joy/mouse mode - Tupone Alfredo * Jitter compensation removed. Too bad behaviour on ME players - Tupone Alfredo * Put spawn params in BZDB to let server owners mod them as needed - Jeff Myers * Fixed ban admin bug - Julio Jimenez * Added /sendhelp command - Mike Weisenborn, Mark Thomas * /ban /hostban take time keywords (short ...) too - Jeff Myers, Alfredo Tupone * Inertia style indicatio no more used - Alfredo Tupone * No more restriction on M (Momentum) flag - Alfredo Tupone * Fixing authentication when changing callsign/password - Alfredo Tupone * Fixing authentication when joining from command-line - Alfredo Tupone * Executing abbreviated server command '*' terminated - Alfredo Tupone * Getting one-line-help on server command '?' terminated - Alfredo Tupone * Fixing bzflag use of system-wide regex (--without-regex) - Alfredo Tupone * Adding destination info to chat message log - Alfredo Tupone * Adding syntax check to duration parameter of ban cmds - Alfredo Tupone * Hud outlines go transparent with the hud panel - Jeff Myers, Daniel Mulford * Better progress info when downloading textures - Garrett Padera, Jeff Myers * Add Quake3 BSP import to modeltool - Jeff Myers * Exit BZFS if -g is used with -mts or -mps - Joshua Rogers * Experimental server colorizing in server list - Frank Thilo * Added sort options to "/replay list" and "/record list" - Mark Thomas * Map mismatch fixed - Alfredo Tupone * Quick server command key works better - Alfredo Tupone * Default server side plugins added to windows build - Jeff Myers * Include web token verification script - Garrett Padera * Fix texture cache on windows. - Jeff Myers * Disallow + or @ as first char of callsign (bzfs) - Mark Thomas * Wait for reverse DNS and authentication to enter game - Alfredo Tupone * Antiban works even on IP number - Alfredo Tupone * Sort lagstat to have non-observer at the bottom - Thomas Stauer * Authentication credential are requested asap - Alfredo Tupone * Allow the use of game device sliders as axes on Windows - Daniel Remenak * Directional force feedback support - Daniel Remenak * New icon and menu arrow - Harry Keller, Jeff Myers * Special effects for many events - Jeff Myers, Daniel Remenak * Server-side plugin API and plugins - Jeff Myers * Join menu displays team icon - Daniel Remenak, Harry Keller * Implemented "-advertise" option for bzfs - Mark Thomas * The url now does not contain the password (sent with POST) - Tupone Alfredo * Fixing Tiny tank shooting from the world edge - Tupone Alfredo * Fixing client requesting lan server on some systems - Tupone Alfredo * Observer are no more hunted - Tupone Alfredo * Added 'Always Show Team Scores' option (GUI Options Menu) - Mark Thomas * Added beautify scores - Julio Jimenez * Added scoreboard sort option - Mark Thomas, Karsten Behrmann * Shots fired over the boundary wall end at the wall - Daniel Remenak * Increase range of radar size setting in GUI Option menu - Mark Thomas * Fixed Menu rendering when radar size is great - Sean Morrison, Mark Thomas * Fixed Linux name resolution (server list) problem - Sean Morrison * Fixed Jitter problem on Windows, clock was wrong - Alfredo Tupone * Windows platform can switch from SDL to native - Alfredo Tupone * Instruction for X-build from linux to windows - Alfredo Tupone * bzflag is much less blocking with libcurl - Alfredo Tupone * Using c-ares instead of adns for DNS resolving - Alfredo Tupone * Added CTF capture event trigger for world weapons - Jeff Myers, Nathan Goings * FlipZ on meshpyrs behaves as expected (like pyramids) - Daniel Remenak * Fixed /set and /reset command case bug - Daniel Remenak * Fixed crash on /ban without -banfile - Daniel Remenak * Shot reload timer on the HUD - Daniel Remenak * Added timestamp to bzfs DEBUG output, and new CL option (-ts) - Mark Thomas * Players without TALK can send to the Admin group - Sean Morrison * Fixed bzfs crash because poll kick/ban - Julio Jimenez * Allow additional group modify permission lines - Frank Evers * bzfs creates default groups before parsing groupdb file - Frank Evers * +ALL and -ALL adds/removes all perms from a group in groupdb - Frank Evers * Support for +,- and ! operators in bzfs' groupdb file - Frank Evers BZFlag 2.0.2 "Queen of Maybe" (2005-03-18) ------------------------------------------- * Added TALK, MUTE, UNMUTE permissions - Angelina Carlton * Added /mute, /unmute commands - Angelina Carlton * Automatic team try to fix bad player behaviour - Alfredo Tupone * bzadmin does not require opengl headers - Alfredo Tupone * bzfs handle both -mp specification - Alfredo Tupone * bzfs correctly handles ban time - Alfredo Tupone, Julio Jimenez * bzfs no more put jittered players as Not Responding - Alfredo Tupone * bzfs stop shot from dead player - Alfredo Tupone * Roaming switching between player goes even on Dead Player - Alfredo Tupone * Fixed bzfs crash associated to "Error adding player" - Alfredo Tupone * bzflag count a single -1 score for a tk (like server does) - Alfredo Tupone * Fixes on hostban handling - Alfredo Tupone * Fixed force feedback on Windows - Scott Wichser * New Kick/Ban options using slot numbers (rendered in client) - Julio Jimenez * Added EndShot cheat detection - Julio Jimenez * Avoid spawning on top of tanks with SR or BU - Daniel Remenak * Add fine-grained permissions control of polling - Daniel Remenak * Fixed loading of colormapped PNGs - Daniel Remenak * Add SPAWN permission, remove -requireidentify - Steve Krenzel, Tim Riker * A /say command for server messages - Julio Jimenez, Frank Evers * Rejoin permission for avoiding _rejoinTime limit - Frank Evers, Julio Jimenez * A player will auto ghost if they use global authentication - Steve Krenzel * Server announces who started a countdown - Angelina Carlton * Fixed server start menu for windows - Daniel Remenak * Message spam checking bug fixed - Alfredo Tupone * Fixed no flag on building - Alfredo Tupone * Fixed MsgQueryPlayer eventually sending AddPlayer to all - Alfredo Tupone * Removing kicking player for missing packet - Alfredo Tupone * Player is unpaused when coming alive - Alfredo Tupone * Observer of winner not updating the flag fixed - Alfredo Tupone * Fixed 2 flag per team selecting ctf on world & CommandLine - Alfredo Tupone * Fixed lag warning counted twice - Alfredo Tupone * Allow user to select which physical joystick axes to use - Daniel Remenak * Fix a number of server crash bugs - Daniel Remenak * ctf make restarting on base even when dead - Anonymous * Fixed weirdness on Console Panel when disabling chat display - Alfredo Tupone * Fixed a segfault with SDL and no audio - Alfredo Tupone * bzadmin wipes argv to hide possible password - Tim Riker * Lagstats and Playerlist no longer filtered - Steve Krenzel * print errors in red - Frank Thilo * simple scroll indicator for control panel - Frank Thilo * antiban perm actually counters a server ban now - Steve Krenzel BZFlag 2.0.0 "Falcor's Despair" (2005-01-17) --------------------------------------------- * Added a .desktop file - David Trowbridge * Tool for converting obj to bzw - Jeff Myers * Addition of converted ProFont font - Andrew Keyser * Added a file syntax section to bzw.5 - Fred Cods * Added a bzw.5 manpage to document world file format - Sean Morrison * Added /quit command - Angelina Carlton * Display player addr on join to admins - Sean Morrison * Make -debug a public client option - Frank Thilo * Communicate autopilot state, display in scoreboard - Frank Thilo * Observer counts and match times added to game queries - David Vuorio * Central authentication - Tim Riker * Avoid transfer flag cheat - Alfredo Tupone * Cheat client flag obfuscation and hiding - Alfredo Tupone * Added strong authentication via Kerberos - Alfredo Tupone * BZFlag renders frames and accepts commands during joining - Alfredo Tupone * Lag is computed only after entering game - Alfredo Tupone * CTF world used for FFA make bases into boxes - Alfredo Tupone * Allow elevated bases even without -fb - Alfredo Tupone * Added optional duration option to /countdown - Sean Morrison * Added shot mismatch cheat auto-kicking - Julio Jimenez * Improved double-jump response - Anonymous * Added physics drivers - Anonymous * Unlimited altimeter height - Steve Krenzel * Added /uptime command to print elapsed running time - Angelina Carlton * Countdown command now shows players 10 sec countdown - Angelina Carlton * Added a flapping sound for the wings flag - Sean Morrison * Adding ability to load world from url (http, ftp, file) - Alfredo Tupone * Reduce network load by buffering UDP packet (no delay) - Alfredo Tupone * Allow server to control lat and long (-synclocation) - Daniel Remenak * Added tank spawn expansion effect - Anonymous * Added tank squishiness - Anonymous, Dave Brosius * Added animated effects for T, N, TH, O, and CL flags - Anonymous * BZAdmin now tells more specific reasons why it could not connect - Ian Agar * MOTD from the master server - Jeff Myers, Daniel Remenak, Frank Thilo * Add generic URL retrieval class - Jeff Myers, Alfredo Tupone * Windows Multimedia and DirectInput joystick support - Daniel Remenak * bzfs can now announce to multiple public list servers - Sean Morrison * Global public server bans - Jeff M., Alfredo T., Daniel R., Sean M., Bryan J. * Linux event device joystick and force feedback support - Micah Dowty * Inform banned users of reason, originator, and source on login - Jeff Myers * Added the SHORTBAN bzfs privilege - Anonymous, Daniel Leeds * Added /date and /time to request server date and time - Ian Agar * Added arc, cone, and sphere map objects - Anonymous * Added user specified dynamic colors - Anonymous * Added user specified texture matrices - Anonymous * Improved BSP splitting algorithm - Anonymous * Added /part command for disconnecting from server - Angelina Carlton * Show status while trying to connect & download world - Daniel Remenak * Update old configs to avoid broken keybindings - Daniel Remenak * Config files are stored per-version, using older when needed - Jeff Myers * Faster tank and shot collision detection using an octree - Anonymous * Better linewrapping for control panel - Daniel Remenak * Configurable font size for control panel and scoreboard - Daniel Remenak * Textures are now reloaded on a mode change for optimal quality - Jeff Myers * Automatic team joins changed to encourage team-play - Alfredo Tupone * Fixed dropping flag while jumping from high places - Alfredo Tupone * Lag stats are now sorted by lag value - Alfredo Tupone * OpenGL context reloading bug fixed on SDL - Alfredo Tupone * Roaming switch between player is now consistent - Alfredo Tupone * Compensating jitter in Dead reckoning - Alfredo Tupone * Ping packet loss are like high lag for warn/kick - Alfredo Tupone * ColorBlindness now disable hunt flashing on radar - Alfredo Tupone * SDL is made default platform, static and shared linkage - Alfredo Tupone * Fixed bug where players get stuck on flipped pyramids - Alfredo Tupone * Compressed map data going over the network and into caches - Anonymous * Options to disable certain /poll's entirely on a server - Simon Richard Grint * Lighting menu option now has "None / Fast / Best" - Anonymous * Dev-C++ project files - Ian Agar, Daniel Remenak, Jeff Myers * Shot accuracy statistics dialog - Daniel Remenak * Faster zbuffer graphics using octree and dynamic occluders - Anonymous * Faster startup times by making the SceneDatabase on the fly - Anonymous * Autocompletion for commands & callsigns (ala bzadmin) - Ian Agar, Frank Thilo * /clientquery can now be requested on single individuals - Ian Agar * Added support for irc-like /me actions and /msg messages - Sean Morrison * Seer flag now can see Invisible Bullets - Anonymous * Added admin message sounds - Cameron Mandrake, Sean Morrison * Better shot reflections for non-square pyramids - Anonymous * Fixed collision detection impalement problem - Anonymous * anti perm for pollkick, pollban, kick, ban, deregister - Sean Morrison * antipoll bzfs anti perm to protect against poll kick/bans - Andrew Heyn * Server Start Menu now selects Rabbit Chase styles - Ian Agar * Tabbed Message Panel - Scott Wichser, Sean Morrison, Alfredo Tupone * Fonts settable via BZDB - Daniel Remenak * New font management system and fonts - Daniel Remenak, Jeff Myers * Reduce network utilization (tolerance) - Alfredo Tupone, Sean Morrison * WorldWeapons and EntryZones are saved client-side - Anonymous * Improved client map saves using map 'options' - Anonymous * Autopilot is now capable of playing CTF - Ian Agar * bzadmin can now send and receive team and admin messages - Lars Luthman * Added waterLevel (water-like feature for maps) - Anonymous * Added _noShadows (to disable shadows on a server) - Anonymous * bzadmin's curses menu will now update automagically - Lars Luthman * Added message filter editor for bzadmin using menu or cmds - Lars Luthman * Added team flag safety zones - Anonymous * Added MsgScoreOver and MsgTimeUpdate to BZAdmin - Ian Agar * Have BZAdmin allow whitespace in callsign and host - Ian Agar * Prevent message flooding/spamming - Ian Agar * Consolidated polling system bzfs options (-poll) - Ian Agar, Sean Morrison * Improved server pause cheat detection and reporting - Ian Agar, Sean Morrison * Changed the way Roaming keys drives the Observer - Alfredo Tupone * Fixing cross-correlation between driving keys - Alfredo Tupone * Added configuration of driving keys - Alfredo Tupone * Server is now valgrind-happy - Alfredo Tupone, Daniel Remenak, Sean Morrison * Limit quick rejoins - Anonymous * Added 'options' section to world maps - Anonymous * Added the '-set ' option to bzfs - Anonymous * Throw away bad or early links in world files - Tim Riker * Added Record/Replay feature - Anonymous * Added Random teleporter destinations - Anonymous * Poll to reset flags and Poll-cheating prevention - Ian Agar * Flag and Tank Entry Zones - Dave Brosius * Spawn improvements - Dave Brosius, Daniel Remenak * Added MAC's Agility (aka Dodge) flag - Sean Morrison * QuickTurn flag symbol changed from A to QT - Sean Morrison * Added MAC's handicap game style - Sean Morrison * Added ReverseControls bad flag - Sean Morrison * Added Wings good flag - Dave Brosius * Added BZDB variables to allow for more realistic friction - Nils McCarthy * Added ForwardOnly and ReverseOnly bad flags - Sean Morrison * No Jumping and Trigger Happy flags - Nils McCarthy * server option to disallow autopilot - Nils McCarthy * SDL interface to audio/video/input - Tupone Alfredo * /clientquery (was CLIENTQUERY) moved to server - Daniel Remenak * "Leave Game" menu item to leave a game without quitting - Daniel Remenak * Allow user to force input device to that of their choosing - Daniel Remenak * Tanks can drive over bumps - Dave Brosius * Remove Building scene nodes laying on the ground (or lower) - Dave Brosius * Rip out ref counted texture system, TM controls this now - Dave Brosius * Added Admin Message Queue - Michael Hoffman BZFlag 1.10.8 "lightning strikes back - list server returns" (2004-10-05) -------------------------------------------------------------------------- * New list server URL * Added admin message sounds - Cameron Mandrake, Sean Morrison * Throw away bad or early links in world files - Tim Riker BZFlag 1.10.6 "the little hop" (2004-05-14) -------------------------------------------- * Fixed the little hop on spawn at some sites - Alfredo Tupone * Fixed issue of players add/removing others from groups - Alfredo Tupone * Fixed false positive filter matches involving apostrophes - Sean Morrison * Curing ghost/duplicated/ungetable flag - Alfredo Tupone * Fixed 0 height flag, no more flags inside buildings - Alfredo Tupone * Observers see Masquerade tank with their true color - Alfredo Tupone * Password file now supports callsigns with non alphanumerics - Alfredo Tupone * Support for building BZAdmin with PDCurses on Windows - Daniel Remenak * Correctly read PNG textures with multiple IDAT chunks - Daniel Remenak * Add aggressive filtering support for all platforms - Sean Morrison * bans based on hostmask (/hostban, ...) when adns is available - Nils McCarthy * Fixed bug that allowed empty callsigns - Frank Thilo * server option to disallow autopilot - Nils McCarthy * Bots drive around corners faster - Frank Thilo * Bots aim better, try to evade shots - Frank Thilo BZFlag 1.10.4 "not a smurf" (2004-01-24) ----------------------------------------- * Allow user to define quickMessages via the menu system - Frank Thilo * Defaults vars are written to config but commented out - Dave Brosius * Added -show and -hide options to bzadmin for messages - Lars Luthman * Added support for more message types to bzadmin - Ian Agar, Lars Luthman * Added menu w/ BZDB editor and playerlist to bzadmin curses UI - Lars Luthman * can freeze tod in client, if allowed, via -time hh:mm:ss - Tupone Alfredo * Allow variable number team flags per team with +f bzfs option - Dave Brosius * Added private and team chat sounds - Sean Morrison * Specify a world file on the Start Server menu gui - Sean Morrison * Server sends warning to privmsg sender to an invalid target - Lars Luthman * bots now fully handle collision check - Tupone Alfredo * -filterCallsigns filters email too now - Lars Luthman * allow multiple team flags per team thru -c 5 - Dave Brosius * -maxidle handles idle / paused players the same - Frank Thilo * Added optional density to generated maps - Sean Morrison, Frank Thilo * Add pause time to /idlestats - Sean Morrison * Notify players when reassigned to a different team on join - Sean Morrison * Allow multiple bases per team - Dave Brosius * Use cyan for observer messages in old console color mode - Frank Thilo * Config file based auto-identify - Tupone Alfredo, Sean Morrison, Frank Thilo * List Server checks ip of requesting server - Tupone Alfredo * AutoPilot does not base path on stealth echo anymore - Dave Brosius * Alt-Tab & resolution changes does not mess up the screen - Tupone Alfredo * No shooting allowed if OO flag is lost in a building - Tupone Alfredo * Killed player stop drifting & clean dirty tank pieces - Tupone Alfredo * Rabbit score changed and values displayed on HUD - Tupone Alfredo * Sound samples are resampled since bzflag doesn't - Tupone Alfredo * Unclean client disconnects are recognized earlier - Tupone Alfredo * Async communication between bzfs and list server - Tupone Alfredo * Added bzfs -rabbit option selection algorithm support - Nils McCarthy * Added the REQUIREIDENTIFY permission - Nils McCarthy * Added bzfs option to deny clients that do not identify - Nils McCarthy * Color carried team flags according to their team - Sean Morrison * Start of better spawn positions based on tanks - Dave Brosius * PNG image writing for screenshots - Daniel Remenak * Texture Manager only loads textures when needed - Jeff Myers * Renamed and reorganized texture resources - Jeff Myers * BZDB alternate image dir added - Jeff Myers * Improved transparent proxy support - Alfredo Tupone, Sean Morrison * Ground Texture Repeat added to BZDB, default increased to 0.1 - Jeff Myers * Added ability to have and use per-team colored textures - Jeff Myers * Added support for colored and zoned ground textures - Jeff Myers * Hunter tanks try to use "hunter" texture if found - Jeff Myers * Hunter tanks are colored orange color if not using a texture - Jeff Myers * Menu uses its own image for the arrow, menu_arrow.png - Jeff Myers * Rename team based datafiles to have the team in the name - Jeff Myers * Map objects search for colored textures and use them if found - Jeff Myers * Bases search for colored team textures and use them if found - Jeff Myers * Added object-specified texture support for tanks & maps - Jeff Myers * Menu Arrow supports animations - Jeff Myers * Base wall and top textures - Jeff Myers * Hunter name used for kill, lock, and info messages - Jeff Myers * Increase resolution of textures to look better - Jeff Myers * Add experimental quality setting for enhanced effects - Jeff Myers * Tunf off tank LOD, and ground grid for experimental quality - Jeff Myers * Add sides to the body of the hightank model - Jeff Myers * Improve flag texture for high and experimental quality levels - Jeff Myers * Increase moon segments for exp. quality - Jeff Myers * Replace flag texture with one from pyBZFlag - Jeff Myers * Added ability to set flagpole width for exp. quality level - Jeff Myers * Don't do teleporter fog when roaming as an observer - Jeff Myers * Pull many world textures from pyBZFlag - Jeff Myers BZFlag 1.10.2 (2003-12-23) -------------------------- * improved transparent proxy support for server - Frank Thilo, Alfredo Tupone * Stop infinite spawn loop with complex worlds containing big pyramids * Misc Swear processing fixes - Sean Morrison * Allow banfile to be empty or not exist * Don't let zoned tanks flatten Burrowed tanks * Don't spawn in multiple locations based on multiple r-clicks * Don't get speed kicked ejecting from buildings due to expansion * Fix game style menu position * Take flipz collisions in account for pyramids * Fix Respawning after non-shot kills (Geno, Self Destruct, etc) * More caching of BZBD vars - Frank Thilo * ServerList uses strict http/1.1 - Frank Thilo * Fix playercounts in rabbit mode * GM now tracks player in slot 0 * Relax kick tolerances and soften kick messages - Sean Morrison * Better lag stats - Frank Thilo * Server-side Autoteam - Sean Morrison, Tupone Alfredo, Frank Thilo * Remove bad lite effects with Thief steal * Protect against crashes due to bad shot ids * Better key binding - Tupone Alfredo, Dave Brosius * Relax flag drop time for speed checking - Sean Morrison * Better unresponsive player removal messages * added kill messages as an option to bzadmin - Lars Luthman * let genocided players spawn again - Lars Luthman * auto team is now handled solely in the server - Frank Thilo * increase averaging for jitter and loss values in lagstats - Frank Thilo * mrtg script updated - Tim Riker BZFlag 1.10.0 "Break the world" (2003-12-09 was 1.9.x) ------------------------------------------------------- * control spawn on buildings with -sb - Frank Thilo * Initial Docbook documentation - Sean Morrison * Persistent bans with -banfile - Lars Luthman * Streamroll collision detection is now compressed in height - Alfredo Tupone * Rendering options are actuated immediately - Alfredo Tupone * Height of base thickness (in world files) goes over the wire - Alfredo Tupone * Fixed collision-detection for many cases - Alfredo Tupone falling through floor when lagging being stuck when tank expands shot going into the ground collision with pyramids * Avoiding stuck on connection - Alfredo Tupone * Web/Database based list server - Alfredo Tupone, ... * Fixed bugs in the bzfs manual and the bzfs help output - KR (through Lars) * Save world files from the client - Dave Brosius * Drop flags on pause after timeout - Sean Morrison * Set size of shots on radar - Sean Morrison * Server spawn positions - Dave Brosius * Added client-side automatic team selection - Alfredo Tupone, Sean Morrison * Calc jitter based on client timestamps in MsgPlayerUpdate - Frank Thilo * Add /reset var server cmd - Dave Brosius * Add /set var value server cmd - Dave Brosius * improved /ban /banlist added reason and time parsing - Dennis Pedersen * Shortened GM to 0.95 normal shot (tuneable) - Tim Riker * tarball now supports "rpm -tb .tar.gz" - Tim Riker * bzfs uses 1 port instead of 2 - Alfredo Tupone * bzflag is officially assigned port 5154 as default - IANA, Tim Riker * bots (-solo) game is by far more playable - Alfredo Tupone * Added client-side chat filtering - Sean Morrison * Configuration files and cache is stored in ~/.bzf/ on *IX - Lars Luthman * Added team ID to shots for TK reasons (1.9.2) - Jeff Myers * Changed version numbers to be xx.xx.xx and display the build OS & Date - Jeff Myers & others for auto tools * Added voting sytem with /poll, /vote, and /veto commands - Sean Morrison * Added bzadmin - Lars Luthman * Munitions now bounce off buildings/ground in z direction - Dave Brosius * World object and -worldsize parameters - Jeff Myers * Server side world parm (bzdb) file [clo] - Dave Brosius * MsgTeamUpdate, MsgFlagUpdate coalesced - Dave Brosius * Burrow Flag - Dave Brosius * Observer is a first class team - Dave Brosius * AutoPilot from 1.8 - Dave Brosius * Thief Flag - Dave Brosius * MsgPlayerUpdate now has order, reject ooo packets - Dave Brosius * Removed old UDP queueing code and headers - Micah Dowty * Convert closed FlagIds to flexible FlagType's - Micah Dowty, Dave Brosius, Tim Riker * Add back PNG support from 1.8 - Dave Brosius, Sean Morrison * Add back BZDB from 1.8 - David Trowbridge, Dave Brosius * Seer, Masquerade Flags - Dave Brosius * Don't broadcast single player messages - Dave Brosius * Customizable map size in maps - Jeff Myers * Drive and Shoot thru options in maps - Jeff Myers * Show Team kill score in Scoreboard - Dave Brosius * Beginnings of flag 'negotiation' - Dave Brosius * Pass reason in MsgKilled, add support for SR noise - Dave Brosius * Remove unnecessary MsgScore from player to server - Dave Brosius * Remove old lag pings - Dave Brosius * BeOS port - Franois Revol * Collision detection fixes - David Trowbridge, Jeff Myers * PlayerId -> ubyte - David Trowbridge, Frank Thilo * Get rid of reconnect port - David Trowbridge * Hunt opponent in HUD - Adam Krell, David Trowbridge * Flag system cleanup - Dave Brosius * Server-side callsign and improved chat filtering - Sean Morrison * Rabbit game style - David Trowbridge, Dave Brosius BZFlag 1.7g2 "Steely Eyed Banana" (2003-06-17 was 1.7g1) --------------------------------------------------------- * public release now under LGPL v2.1 - Tim Riker * change LICENSE to COPYING - Tim Riker * server administration stuff - Jeff Myers, Frank Thilo, David Trowbridge * admin-by-keys - Michael Hoffman * /help messages - Michael Hoffman, David Trowbridge * New super-bullet texture - Justin Zaun, Jeff Mills, David Trowbridge * IRIX fixes - David Trowbridge * cygwin/mingw32 fixes - Tupone Alfredo * Solaris fixes - David Trowbridge * OSX Fixes - Sean Morrison, David Wollner * server list cache - Michael Hoffman * E-mail field fixes - Lars Luthman * colorized console - Anonymous, David Trowbridge * automake/autoconf - Tupone Alfredo, David Trowbridge, Tim Riker * check for unknown message types - Frank Thilo * check incoming TCP for oversized messages and dump player - Frank Thilo * multiline server and ad messages with '\n' - Lars Luthman * -speedtol server option: specify tolerance for speed kick - Jeff Myers * /report server command - Lars Luthman * -sl server option: shot limit for flags - Michael Hoffman * limit /password tries - Jeff Myers * -tftimeout server option - Lars Luthman * put observers to the bottom of the scoreboard - Lars Luthman * resize mouse boxes - Frank Thilo * choose [un]silence - Michael Hoffman, Tim Riker * flag on radar/view on/off - Michael Hoffman, Tim Riker * -badword server support - Dave Brosius * resize radar/msg area - Frank Thilo * Drop team flags where player last was on exit - Dave Brosius * tanks driving too fast are kicked - Dave Brosius * remove non-printable characters in callsign in server - Frank Thilo * +f sw{5} syntax to add a bunch of flags - Dave Brosius * tanks which jump too high get kicked - Dave Brosius * server drops bogus shots (anti cheating) - Tim Riker, Dave Brosius, Frank Thilo * i18n support in client - Dave Brosius, Isak Styf * Optional config file interface for bzfs settings - Dave Brosius * inline editing of text fields (<- ->) - Dave Brosius, Frank Thilo * extend admin command -> /flag reset unused - Dave Brosius BZFlag 1.7g0 "Holy Dancing Monkeys" (2002-12-08 was 1.7e7) ----------------------------------------------------------- * -tkkr auto team killer - Dave Brosius * world file caching - Colin Bayer, Dave Brosius, others * optional tank labels for roaming - Frank Thilo, Tim Riker * draw tank lights correctly for (T)(N)(O) tanks - Dave Brosius * new GUI options menu - Frank Thilo * exclude observers from /idlestats list - Frank Thilo * server based scoring - Dave Brosius, Tim Riker * max. number of observers now defaults to 3 instead of 0 - Frank Thilo * Use high water marks for player cnts to reduce looping - Dave Brosius * new bzfs option -tk: team killers do not die - Frank Thilo * misc @observer mode fixes - Andrew Greig * Improved Mac OS X support - Kevin Avila * disallow dud flags (eg jump in a jump world) - Dave Brosius * self destruct key, for stuck tanks - Dave Brosius * team killers die - Tim Riker * increase max player and robot counts - Tim Riker * Fix 'Change Key Mapping' arrowkeys - Andrew Greig * show the time in upper right if no flag * opacity in config - Dave Brosius, Tim Riker * [UN]SILENCE - Dave Brosius, Tim Riker * revert lag falling patch - Tim Riker, Dave Brosius * teamgrab.wav - Dave Brosius * improved texture mapping - unknown * possible win32 installer bug - Chris Walters * gcc 3.1+ patches - David Trowbridge BZFlag 1.7e6 "Armoured Smashing Fist" (2002-06-19 was 1.7e5) ------------------------------------------------------------- * new HUD! - David Trowbridge, Tim Riker, many others * added temporary bans (minutes) - Dave Brosius * Can now build entire win32 installer from VC Workspace - Dave Brosius * non-listserver connection gave 0.0.0.0 as host: fixed - Dave Brosius * added private messages - Frank Thilo * modified / added roaming support for observers - Frank Thilo * added /idlekick server option - Frank Thilo * fix /ban and add /unban - Frank Thilo * allow both -mp # and -mp #,#,#,#,# - Frank Thilo * CTF flag returning to base fixes - Frank Thilo * sort teams by score, sort in self - Janne Hassinen, Tim Riker * observer hack, should be a team - Frank Thilo * /countdown, /lagwarn - Frank Thilo * PatchId fixes - Frank Thilo, Tim Riker * New lag measurement using pings - Frank Thilo * Reassign keyboard menu is now in two columns - Dave Brosius * Fix MsgMessage and CLIENTQUERY handling - Frank Thilo * -ban - David Trowbridge, Dave Brosius, Tim Riker * Mac OSX work - Kevin Avila * -cr random ctf maps - Tim Riker, Frank Thilo * bots in building fix - Tim Riker, Harry Dodgson * Pause and not responding on HUD - Frank Thilo * Message History buffer - Dave Brosius (cleaned by Tim Riker) * Nemesis set on direct receive - Frank Thilo * LT and RT command line aliases for shell impaired - Tim Riker * radar shade flags by altitude - Tim Riker (reworked from Jeremiah) * different kill msgs - Sal Gonzalez, Tim Riker * brighter radar colors - Tim Riker with much input from others * team colored shock wave - Tim Riker * team colored lasers - Dave Brosius * turn off ctf, if bases not found in world file - Dave Brosius * patchid optimization for new clients - Dave Brosius * udp request fix for later clients - Tim Riker * MsgEnter should not be patched for ID - Frank Thilo * Removed superfluous buffer copies in bzfs buffer sends - Dave Brosius * Better pack/unpack code for vectors [3] - Dave Brosius * Fix Teamflag drop over building when building at 0,0,0 - Dave Brosius * Fix flags spawning in pyramids - Dave Brosius * Fix client crashes with UNKNOWNS - Valery Fouques * fix patchMessage for MsgAlive - Dave Brosius * fix find closest flag (ID) with flags on buildings - Dave Brosius * scale flags bases on elevation - Tim Riker * don't scale radar based on screen res - Tim Riker * flag radar updated - Tim Riker * new admin commands - Tim Riker * -pr for reconnect port (two port tcp) - Tim Riker BZFlag 1.7e4 (2001-11-27 was 1.7e3) ----------------------------------- * ::memset() instead of bzero() - Bjrn Augustsson * win32 audio thread fix for win2k - crs * send to nemesis - Dave Brosius, Frank Thilo * USB joystick support - Nick Sayer * new (faster?) radar jamming code - Mathias Gumz * sort by score - Colin Bayer, Dave Brosius, Tim Riker * world file rad -> deg - Tim Riker * add player flag display to HUD - Tim Riker (prompted by Colin Bayer) * random height pyramids too - Tim Riker * dim rogue color when blind - Colin Bayer * colorize shots on radar - Colin Bayer * keyboard movement - Pier Donini * win32 connect thread - Valery Fouques * new sounds - Dave Brosius * warnings - Dave Brosius * safer placement - Frank Thilo * don't color shots when CB - Valery Fouques * jump while typing - Valery Fouques * don't lock on paused or not responding - Valery Fouques * -lagdrop server option - Colin Bayer * fix team flag display - Colin Bayer * add rogue team and radar colors to config - Valery Fouques * Shots as lines on radar - Valery Fouques, Tim Riker * CTF world from file - Colin Bayer, Tim Riker * patch playerIds to prepare for one tcp port - Tim Riker * missile sound effect - Dave Brosius * udp first then multicast, IRIX fix? (use -i <> for multicast) - Tim Riker * enhanced radar - Jeremiah Moss * don't relay read in player read - Frank Thilo, Tim Riker * -fb flags on box buildings - Tim Riker, Colin Bayer * networking code fixes - Tim Riker, Frank Thilo, etc. * new admin commands - Tim Riker * enhance SR - Tim Riker, Dave Brosius * rotated/elevated bases - David Trowbridge, Tim Riker * GM lock alert msg/sound - Tim Riker (prompted by Colin Bayer) BZFlag 1.7e2 (2001-04-17) ------------------------- * bzfs performance fix, wait loop removal - Frank Thilo, Tim Riker * limbo flag bugfix - Frank Thilo * *bsd cleanups from new ports maintainer - Nick Sayer * scrollback cleanups - crs * minimum size now 256x192 - Tim Riker * various bug fixes - many BZFlag 1.7e1 (2001-03-10) ------------------------- * optional UDP unicast networking, back-compatible w/ old TCP method - frank * GM now leave smoke trail - frank * Explosions are larger - frank * Scrollback and Line wrap (use pageup/down keys) - Digit1 * radar tank dots are larger - frank * robots have playerxx names and player's email - Tim Riker * colorize console messages - Tim Riker * robots score when killing 'owner' - Frank Thilo * flags under high buildings - Jeremiah Moss * "world" section in world from file - Jeremiah Moss * dim paused/nr tanks on radar - Frank Thilo * fix bzfls for servers on non-5155 - Tim Riker * pgup/pgdn support in help menu - Kris Verbeeck * stop using signal() as suggested by Frank Thilo - Tim Riker * Triple buffering support (actually n way buffering) - XiGraphics * Joystick support - XiGraphics * teleporter shot handling improved - chestal * udp network code reworking to select() on one server port - Tim Riker * rogue tank placement on enter - chestal * pseudo variable height buildings in cf mode - Tim Riker * don't drain and flush audio on solaris - frank * alpha Macintosh port - Darrell Walisser * quick message support - Kris Verbeeck * /kick and /lagstats server messages, -passwd - Frank Thilo BZFlag 1.7e release 000 (2001-01-26) ------------------------------------ * Tim Riker now maintainer * build now 3 digits so alpha sorts work (until we hit 1.10? ;-) * copyright and naming changes * save flaghelp and score state * FreeBSD patch - Eric Anholt * world creation reordering to support world from file * compilation with VC++6 - Jeremiah Moss * world from a file - Daniel Lonard * travel underneath floating buildings - Jeremiah Moss * radar update to not hide teleporters under buildings - Jeremiah Moss * teleporter player positioning - Jeremiah Moss * bottoms on floating buildings - Jeremiah Moss * Windows highest refresh rate on program switch - Jeremiah Moss * dns lookups on list server for faster server lists * non-blocking I/O for bzfs and name lookups - crs * phantom player fix - Frank Siegert BZFlag 1.7d release 9 (2000-02-01) ---------------------------------- * fixed bug in parsing arguments in bzfls * fixed reference counting bug in bzfls * improved win32 config file location - Daniel Lonard BZFlag 1.7d release 8 --------------------- * fixed bug in bzfs that caused the player table to fill up * fixed bugs in bzfls that left open sockets and leaked memory * fixed bug in bzfls that could cause one server to be listed multiple times * made bzfls more picky about format of messages * added uptime to bzfls statistics * changed bzfls protocol and bzfs to match deliberately not backwards compatible to force upgrades * gave flag help messages more space to avoid overlapping target box BZFlag 1.7d release 7 --------------------- * added sym link for bzfs in RPM spec file can't launch server from client without it * changed RPM naming scheme to be more standard (now named 1.7d.7) * fixes for solaris compiler * fixed tarball make target to include top level directory * fixes to avoid making OpenGL calls after exiting main * fixed mix-up between brightness and volume controls on options menu * fixed busy wait bug in linux sound code * incremented number of sound chunks on linux and fixed low water mark * reduced sound latency on linux * doubled sound volume * fixes for linux resolution changes (now destroys/recreates OpenGL contexts) * workaround for accelerated glx preventing screen redraw after exit * added -3dfx and -no3dfx bzflag options to set/unset MESA_GLX_FX BZFlag 1.7d release 6 --------------------- * now allows user to configure a non-optimized build (e.g. make linux-noopt) * added tarball make target to gather source tree into a tarball * modified spec file for RPM packaging - Tim Riker * more sound fixes now always writes sound even when silent (which simplifies things) now handles failure of SNDCTL_DSP_SETFRAGMENT BZF_NOAUDIO_POST env var disables latency workaround when SETFRAGMENT fails fixed bug that caused some truncated chunks * video format menu now uses multiple pages if lots of formats * now ungrabs mouse on pause and grabs on resume (if grabbing) * players now drop a team flag when pausing (prevents a cheat) * made some readouts more readable at low resolution (changed font) * changes to bzfs to make it more robust against network errors * fixed bzfs messages to bzfls (was only ever sending ADD messages) * bzfls now keeps traffic statistics (SIGUSR2 dumps to /var/tmp/bzfls.cnt) * added man pages for bzfls and bzfrelay BZFlag 1.7d release 5 --------------------- * now allows user to configure a debug build (e.g. make linux-i386-debug) * cleaned up some compiler warnings * fixed silliness in PIXELFORMATDESCRIPTOR stuff in win32 * fixed multicasting support * fixed sound volume bug (reset to zero in config if quit when paused) * fixed handling of window close under X windows * fixed several serious bugs in sound filtering coordinate system was totally wrong various calculations were incorrect * improved sound support on linux and got sound working on linux ppc * improved stereo panning filtering new transfer function does better directional attenuation * added inter-aural delay to enhance stereo separation * added support for brightness control (i.e. gamma correction) only available on PseudoColor or DirectColor visuals under X only available on win32 if using colormap or SetDeviceGammaRamp() works * added custom visual choosing algorithm on X (to prefer DirectColor over True) making it more likely to get a gamma correctable visual * added support for destroying/recreating OpenGL context on-the-fly required to support dynamic video format changing on win32 * support for dynamic changing of video format on xfree86 and win32 removed startup format picker on win32 -- change format through options * improved integration with win32 desktop (alt-tab, screen saver, etc.) minimizes on loss of focus; disables annoying key sequences * config file on win32 now saved in a consistent location BZFlag 1.7d release 4 --------------------- * changed LICENSE to the GNU GPL version 2 * server can now register itself with multiple list servers * client can now check multiple list servers at once * bzfls can now dump server list to a file (using USR1) * bzfls can now bootstrap server list from a file * now truncates descriptions that are too long; was rejecting server * fixed ref count bug in bzfls BZFlag 1.7d release 3 --------------------- * fixed truncation of server list reads * fixed menuing bug in find servers when no servers found * -geometry is no longer ignored for 3Dfx cards * turned off roaming and snapshoting in non-debug builds * `-list default' now resets server list url to default * simplified maintenance of version number * fixed output from -version on win32 * added window border on win32 when using -window * re-fixed bzfls query reading-freed-memory bug (regressed somehow) BZFlag 1.7d release 2 --------------------- * fixed reading-freed-memory bug in client querying of bzfls * replaced incorrect use of errno with getErrno() * fixed bug in ServerLink::read(); now won't try to recv() zero bytes BZFlag 1.7d release 1 --------------------- * starting from 1.7c release 2 patch 3 * preliminary support for bzfls, a server for listing bzfs servers * changed win32 installer to ignore errors when changing the registry * added extra help output when bzflag can't find font files * fixed badly matched braces that broke multicast code BZFlag 1.7c release 2 patch 3 ----------------------------- * fixed byte-order problem in bzfrelay - Tim Riker * unix portability fix: replaced cuserid() with getuid() - Erik Andersen * now links mesa as GL and GLU to support non-mesa * fixed bug in linux multicast support BZFlag 1.7c release 2 patch 2 ----------------------------- * final solaris sound support - Andrew White BZFlag 1.7c release 2 patch 1 ----------------------------- * added solaris to configuration list * preliminary sound support on Solaris - Andrew White * fixed 32 bit dependency; now works on 64 bit (alpha) linux - Phillip Ezolt * added missing entries in irix packaging (some data files) * added stacked stereo patch - Stea Greene BZFlag 1.7c release 2 --------------------- first official open source release. * misc. changes for solaris - Bjrn Augustsson * changed u_int* to uint* * replaced [ds]rand48() with [s]rand() * changed variable name `sun' with 'theSun' * changed ioctl FIONBIO to fcntl O_NDELAY * changed FNDELAY to O_NDELAY * glColor*() are macros; changed code that took address of function * no hstrerror * solaris defines SIG_PF * added unofficial solaris config - Bjrn Augustsson * porting is not complete * not included in platform list * made generic linux config - Phillip Ezolt * ifdef'd DEADLINE code for irix * static/dynamic libaudio fix for irix * friend class workaround for irix 7.2.1 compilers * fixed broadcasting and multicasting on linux BZFlag 1.7c release 1 --------------------- preliminary open source release. bzflag-2.4.2+ds1/DEVINFO000066400000000000000000000526631200563112200144700ustar00rootroot00000000000000 Information for the BZFlag Developer ==================================== BZFlag source code lives in the following directories: applications ------------ src/bzadmin - the BZFlag admin tool and chat client src/bzflag - the BZFlag client src/bzfs - the BZFlag server tools/ - various helper tools game dependent libraries ------------------------ plugins/ - optional server plugins src/game - core game logic game independent, platform independent libraries ------------------------------------------------ src/3D - 3D geometry (actually; not much 3D here, fonts and textures) src/common - general utility src/geometry - geometric mathematics src/mediafile - sound and image file support src/obstacle - collision detection src/ogl - wrapper classes for OpenGL src/scene - scene graph game independent, platform independent, external libraries ---------------------------------------------------------- src/other/ares - c-ares asynchronous resolver src/other/curl - cURL library for transferring data with a URL src/other/glew - OpenGL Extension Wrangler Library src/other/regex - BSD regular expression library src/other/zlib - Zlib compression library Developers should make only the most essential modifications in the BZFlag source tree to these third party packages. This means that we allow them to install extraneous files such as documentation and headers into the BZFlag binary tree. game independent, platform dependent libraries ---------------------------------------------- src/date - build dates and versioning src/net - networking src/platform - general platform dependent code "other stuff" ------------- BZFlag.xcodeproj/ - project definition for Apple XCode MSVC/ - project definitions for Microsoft Visual C data/ - images, sounds, fonts, translations include/ - public headers m4/ - configuration macros man/ - documentation in manual page format misc/ - kitchen sink of anything package/ - packaging aids for specific operating systems Note that only a few directories contain code directly related to the game BZFlag. In particular: bzflag, bzadmin, bzfs, plugins, and game. (And obstacle, but that will hopefully be made more general some day.) The rest of the code could potentially be used in a different game. If your code is BZFlag specific then it should go into one of the above directories (game if it can potentially be used by more than one app, otherwise into the appropriate app directory). If not then put it in one of the other directories or add a new directory. Coding conventions ================== If you plan on contributing any source code to BZFlag, we would like you to follow certain conventions. Contributions that don't conform are likely to be ridiculed and rejected until they do. Code Organization ----------------- Follow the above organization when introducing new files. Any code that would potentially be useful in another game goes outside of the app directories and outside the game directory. Platform dependent code normally goes into platform, net. Code that is specific to BZFlag should go into the game directory. There are README files in most all of the source directories that describe what belongs in those directories Header files that are private to a library go into that library's directory. Header files exported from a library go into the include directory off the top-level. Header files for classes introduced in an application directory should never go into a #include outside of that application directory. C files use the .c extension. C++ files use the .cxx extension for everything except plugins which use the .cpp extension. Header files for both C and C++ use the .h extension. Headers ------- Don't put interface headers into the common.h header. Class interface headers should include just what is necessary to make the interface work. The source implementation file should include it's interface and whatever else it might need specific to the implementation. For C code, the header file should include everything the C code needs (otherwise there's no point to the header) including prototypes for all non-static functions. The include order for headers within a header is common.h, system headers, common interface headers, and then local interface headers. The include order for headers within a source file is its own interface header if there is one, or common.h otherwise, system headers, common implementation headers, and then local implementation headers. Adhering to this order will avoid nasty ordering dependencies and makes it easy to change things down the road. Ideally, there should be one class per file. There are, of course, exceptions to this such as simple utility classes that are local to that same file's implementation. If it's a public class, though, it's usually best to separate it out into another file by itself. Avoid "extern" in C files. This prevents the compiler from type checking in most cases. If you need access to something, put it in a header. That's what headers are for. C++ features ------------ Earlier versions of BZFlag avoided certain features of C++ that have matured enough to be widely and well supported. These features are now permitted and encouraged including: bool -- the boolean type and True and False are gone standard C++ library -- use where appropriate (AList is gone) templates -- use sparingly where appropriate These should still be avoided: exceptions -- still poorly supported on old lame compilers run-time typing -- if you find yourself needing RTTI, its often a sign of bad design. Try to find another way to implement your idea. Multiple inheritance is strongly discouraged unless in the Java style of single implementation inheritance and multiple interface inheritance. Multiple inheritance otherwise can quickly lead to very hard to understand code. To prevent ambiguity, do not use the C++ "using" keyword just to avoid typing explicit references to the "std" namespace. Other namespaces, especially those defined in BZFlag code, may be introduced with "using" when it improves code readability. Only use standard C++ language features, at no time should any compiler-specific extensions be used (GNU or VisualC++ extensions). If an extension can not be avoided then it must be able to be disabled or replaced using a #define in config.h. BZFlag is a cross-platform application so it is important to remember that not all builds will use your specific compiler. This also includes not using features in C99 and C1x as the windows compiler only supports C++11 and there are some features in the later C versions that were not adopted by the C++ standard, namely the 'not' and 'or' keywords instead of ! and ||. Also MSVC seems to be a bit picky about what bits of older standards it supports. When the windows compiler supports this, we should stick with a consistent method and not mix AND with &&. Use the same type of operators that are in the existing code. Formatting ---------- Everybody has their own style and has things they don't like about any other style. Well, we can't have a zillion styles in the code, so follow the BZFlag style if you want your contribution included. The source code serves for examples of the following rules. 1) Indents are 2 characters. Tabs are 8 characters. There are vi and emacs settings in each file to adopt, enforce, remind, and encourage this convention. Suggestions are welcome here for setting up other environments. Here are the lines that should be included at the end of source files: // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 In emacs the the indent-region command (bound to C-M-\ by default) does a good job of making the needed changes to conform to this convention. Installing exTabSettings in MSVC will make it conform. 2) The opening brace of all blocks goes on the same line as the statement introducing it except for functions and classes where it goes on the following line. The closing brace is indented like the statement except for functions where it aligns with the open brace. For example: void foo() { for (;;) { if (expr) { } } } 3) An else clause goes on the same line (there are many unacceptable alternatives): if (expr) { } else { } *note that old code had the else on the next line, please clean this up wherever you may find it* 4) If *either* the if block or else block requires brackets then they both get brackets. if neither requires brackets then use brackets on both or neither at your discretion. In case both styles are allowed, don't change the existing code just because it is not coded like you prefer. 5) When using `delete' or `delete[]' don't bother to test the pointer if it's NULL first. use new and delete rather than malloc and free. 6) Data members should be usually private unless making plain old data. separate methods from data in class definitions with (possibly redundant) access specifiers. public c'tors/d'tors should be first, followed by public member functions, protected member functions, private member functions, and data members. 7) Macro names are all capitals, class names have the first letter of each word capitalized, all other names have the first letter of each word except the first capitalized. Only macros may use underscores, except for in the names of method parameters where a leading underscore is allowed to make it different from a member variable. #define FOO bar class MyClass { public: void addStuff(int addMe, int _y) { y = addMe + _y; } private: int y; }; 8) Put spaces after statements followed by expressions and spaces around operators. For example: if (a == b) not if(a==b) 9) Do not leave old commented code hanging around and do not submit patches with "// Added by foo on xx" comments. This is what version control software is for. 10) Do not code very long lines. Try to stay within 80 columns if possible, but don't go over 132 if you should raise that limit for some reason. Violations of these rules in the existing code are not excuses to follow suit. Non-conforming code may be fixed. Patches to non-conforming code should follow the non-conforming code's style if following the rules would cause an ugly mess. Performance ----------- If the code you are editing is in a performance-critical section of BZFlag (that is, if it is called multiple times per frame on the client, or per server loop on the server), you should profile the proposed changes. The new code does not necessarily need to be faster, but a quantitative analysis is required. Committing Changes ================== Make atomic changes in a way that a system will be working, or at least will compile successfully, before and after committing a set of changes. Try to separate out bigger commits into smaller ones. In particular, if a change involves multiple functionality changes, the commit should be broken up into smaller coherent chunks. This way if a bug or other issue with a particular commit is later encountered, the change can be more easily isolated and undone or fixed. Making Patches -------------- If you do not have source code commit access and would like to propose a change for inclusion, you should create a patch. Patches should be submitted to the SourceForge project site patches tracker at: https://sourceforge.net/tracker/?func=add&group_id=3248&atid=303248 You can create a patch for submission to SourceForge from a source checkout using the following command: svn diff > my_patch_name.diff If your patch requires the addition of new files, simply include these new files individually or in a tarball as part of the patch submission. In general, patches should be relatively small succinct changes that can be readily reviewed, tested, and applied. Patches that are difficult to review, test, or apply will likely not be accepted. That said, creating useful patches that have been discussed with the existing developers is one of the more immediate means to become a developer for BZFlag yourself. Licensing --------- By committing to a source code repository or submitting a patch, you the developer are giving the project maintainer (Tim Riker), and his successors various rights to the work submitted, as defined below. Grant of Copyright License. Each Contributor hereby grants to The Project Maintainer a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. Grant of Patent License. Each Contributor hereby grants to The Project Maintainer a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If the Contributor institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to the Contributor under this License for that Work shall terminate as of the date such litigation is filed. Submission of Contributions. Any Contribution intentionally submitted for inclusion in the Work by Contributors to the Project shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. Notes. As the original author you may distribute, modify, transfer, and relicense your copy of a submitted work as you see fit, provided it does not have additional licensing restrictions from being a derived work. You may not place any restrictions on how the project maintainer (Tim Riker) maintains or handles your submitted works. Works that are derivations of existing works in the project are subject to the current project license (LGPL). Authors that submit works must have the legal right to agree to these terms, either as original author or authorized licensee of derived works. Testing ======= If you have rendering problems, you might want to try setting: LIBGL_ALWAYS_INDIRECT=1 On many systems this will force software rendering. It will greatly reduce the performance, but may assist in solving rendering issues. A debug build may be specified via: ./configure --enable-debug A profile build is specified via: ./configure --enable-profile Sounds ====== Sounds are stored as uncompressed 22.050KHz WAV files. We will likely move to OGG someday. Images ====== Images are stored as portable network graphics (.png). Compression is okay, but no additional options such as interlacing. BZDB ==== BZDB is the generic name:value pair database within bzflag and bzfs. It is useful for data that can be serialized to a string that needs to be accessible to many areas of the code. It also provides facilities for saving persistent pairs to the config file and downloading variables from the server. BZDB is not an object broker, and isn't meant to be. If you have data within an object that needs to be accessible from a number of places, but don't want to pass the object around, you could store that data within BZDB (if accessed often, such as game variables like gravity, you will need a cached version anyway to avoid the overhead of lookup). Using BZDB adds unnecessary overhead if objects generally keep their data hidden without needing persistent state. Basically, if your data can be serialized to a string, and it makes sense to do so (eg: config file option, game variable downloaded from server), use BZDB. If you wanted an object broker, use a freakin' global. Version numbers =============== The BZFlag versioning info is defined in: include/version.h There are a number of #defines in that file that define the Major, Minor, and Revision versions, as well as the build type, build date, build user, and network protocol version. The BZFlag version number is in the format of: MajorVersion.MinorVersion.Revision All "development" versions use an odd number for the minor version number. All "release" versions use an even number for the minor version, e.g.. 1.9.x is a development version for a future 1.10 release. Release versions also use even revision version numbers. Maintenance work is done on odd numbered revisions and releases are even numbered. For development versions the revision version represents significant feature changes or stages in a development version, such as a change to the network protocol or a move to a definite testing stage. For "release" versions, the revision represents patches or bug fixes to the base release, but not new feature development. This allows the developers to "leave some room" for patches and emergency fixes to a release line. The network protocol version is a string. When changes to the protocol are made that render it incompatible with prior releases, the version number of the protocol must be changed. This is necessary to prevent incompatible clients from attempting connections. When a change is made, the network protocol version needs to be set to the application version that is current at that time. This is also when the revision of the application should be incremented. The displayed application version includes additional information in the format: Major.Minor.Revision-BuildOS-BuildType-BuildDate BuildOS is the operating system that the building system is running; on systems that use the automake build system this is automatically generated. BuildType is a string that represents the intended use of the build. For development releases, the build type is normally "SVN". For testing releases, the build type can be "testing", "beta", "releasecandidate", etc. For final release versions the build type should be "release". The build type provides a human readable keyword for the version and intended or expected stability of the build. BuildDate represents the date of the build in the format YYYYMMDD. This string is generated during runtime by the compiler's preprocessor __DATE__ macro. Making a Release ================ In order to make a release, there are handful of steps that need to be taken. If any step fails to be completed successfully, the release cannot proceed. A checklist of items to be completed follows: - All code is committed to the repository. - ChangeLog includes a comment for all items added since the previous release, preferably denoting who made what changes. - Man files, bzfs_conf.html, and bzfs.conf files are updated with latest changes. - Version numbers are updated to the next expected release number. This minimally includes updating README, ChangeLog, configure.ac, buildDate.cxx, and the title.png image. Version numbers in all other platform-specific README.* files should also be verified. - When BZ_PROTO_VERSION has already changed since the last release, increment it one more time in buildDate.cxx, bzfquery.*, and bzls.lua to distinguish the new release from development versions. - BZ_BUILD_TYPE is changed to MAINT in buildDate.cxx. - Update package/win32/nsis/*.nsi (for windows) and tools/TextTool-W32/TextTool.rc with appropriate version numbers. - Perform a "make distcheck" on multiple (preferably all) platforms. This will verify that a proper source distribution can be made. Also verify that all non-autotools builds build properly. - Tag the release. Tag format should be consistent with the other tags using the format of vMAJOR_MINOR_RELEASE e.g. svn copy bzflag \ https://bzflag.svn.sourceforge.net/svnroot/bzflag/tags/v2_4_0/ - Perform a "svn export https://bzflag.svn.sourceforge.net/svnroot/bzflag/tags/vMAJOR_MINOR_RELEASE" from somewhere else in the filesystem to obtain the tagged version of the sources. - Perform a "make dist" of that export to generate a source release tarball. - Verify that the source tarball can be expanded, builds, and runs. - Build platform-specific binaries from the source tarball. - Post the source tarball, zip and platform-specific binaries to SourceForge. - Increment and commit the version number in configure.ac and other files (see above) to the source repository so that later builds are immediately distinguished. Also, change BZ_BUILD_TYPE back to DEVEL in buildDate.cxx. - Notify the following (at least): bzflag-users@lists.SourceForge.net news on http://BZFlag.org/ news on http://sourceforge.net/projects/bzflag/ http://freshmeat.net/projects/bzflag/ (rank BZFlag here!) - Optionally notify the following: http://slashdot.org/ news@linuxgames.com - http://LinuxGames.com/ John Gowin (thanx for the review!) jd@linuxgaming.co.uk updates@superdownloads.com.br mail -s add LSM@execpc.com < bzflag.lsm Testing the server ================== An example line to use for bzfs testing is: src/bzfs/bzfs -c -d -d -d +f good +f bad -fb -j -ms 3 -password \ password -s 10 -sa -sb -sw 1 -st 15 -world misc/maps/hix.bzw bzflag-2.4.2+ds1/INSTALL000066400000000000000000000363321200563112200144770ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. bzflag-2.4.2+ds1/MSVC/000077500000000000000000000000001200563112200142075ustar00rootroot00000000000000bzflag-2.4.2+ds1/MSVC/Makefile.am000066400000000000000000000001561200563112200162450ustar00rootroot00000000000000SUBDIRS = build EXTRA_DIST = \ bzflag.ico \ resource.h \ bzflag.rc MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/MSVC/Makefile.in000066400000000000000000000436451200563112200162700ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = MSVC DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = build EXTRA_DIST = \ bzflag.ico \ resource.h \ bzflag.rc MAINTAINERCLEANFILES = \ Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu MSVC/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu MSVC/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/MSVC/build/000077500000000000000000000000001200563112200153065ustar00rootroot00000000000000bzflag-2.4.2+ds1/MSVC/build/3D.vcxproj000066400000000000000000000221001200563112200171640ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287} 3D Win32Proj StaticLibrary MultiByte StaticLibrary false MultiByte StaticLibrary MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ../../include;./;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 false EditAndContinue $(OutDir)3D.lib true X64 Disabled false ../../include;./;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 false ProgramDatabase $(OutDir)3D.lib true ../../include;./;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)3D.lib X64 ../../include;./;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)3D.lib bzflag-2.4.2+ds1/MSVC/build/Makefile.am000066400000000000000000000011101200563112200173330ustar00rootroot00000000000000EXTRA_DIST = \ bzflag.sln \ bzfs.sln \ fullbuild.sln \ ares.vcxproj \ ares_build.h \ 3D.vcxproj \ bzflag.vcxproj \ bzadmin.sln \ bzadmin.vcxproj \ bzfs.vcxproj \ common.vcxproj \ config.h \ curl/curlbuild.h \ date.vcxproj \ game.vcxproj \ geometry.vcxproj \ installer.vcxproj \ makehtml.vcxproj \ man2html.vcxproj \ mediafile.vcxproj \ net.vcxproj \ obstacle.vcxproj \ ogl.vcxproj \ platform.vcxproj \ regex.vcxproj \ scene.vcxproj \ libcurl.vcxproj \ zlib.vcxproj \ zlib.vcproj \ pdcurses.vcxproj \ makeHTML.bat MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/MSVC/build/Makefile.in000066400000000000000000000265031200563112200173610ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = MSVC/build DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ bzflag.sln \ bzfs.sln \ fullbuild.sln \ ares.vcxproj \ ares_build.h \ 3D.vcxproj \ bzflag.vcxproj \ bzadmin.sln \ bzadmin.vcxproj \ bzfs.vcxproj \ common.vcxproj \ config.h \ curl/curlbuild.h \ date.vcxproj \ game.vcxproj \ geometry.vcxproj \ installer.vcxproj \ makehtml.vcxproj \ man2html.vcxproj \ mediafile.vcxproj \ net.vcxproj \ obstacle.vcxproj \ ogl.vcxproj \ platform.vcxproj \ regex.vcxproj \ scene.vcxproj \ libcurl.vcxproj \ zlib.vcxproj \ zlib.vcproj \ pdcurses.vcxproj \ makeHTML.bat MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu MSVC/build/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu MSVC/build/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/MSVC/build/ares.vcxproj000066400000000000000000000307051200563112200176620ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C} ares Win32Proj StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\src\other\ares;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;CARES_STATICLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL true Level3 false EditAndContinue 4001;%(DisableSpecificWarnings) X64 Disabled false ..\..\src\other\ares;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;CARES_STATICLIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL true Level3 false ProgramDatabase 4001;%(DisableSpecificWarnings) ..\..\src\other\ares;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;CARES_STATICLIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase X64 ..\..\src\other\ares;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;CARES_STATICLIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzflag-2.4.2+ds1/MSVC/build/ares_build.h000066400000000000000000000211511200563112200175700ustar00rootroot00000000000000#ifndef __CARES_BUILD_H #define __CARES_BUILD_H /* $Id$ */ /* Copyright (C) 2009 - 2010 by Daniel Stenberg et al * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. */ /* ================================================================ */ /* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ /* ================================================================ */ /* * NOTE 1: * ------- * * See file ares_build.h.in, run configure, and forget that this file * exists it is only used for non-configure systems. * But you can keep reading if you want ;-) * */ /* ================================================================ */ /* NOTES FOR NON-CONFIGURE SYSTEMS */ /* ================================================================ */ /* * NOTE 1: * ------- * * Nothing in this file is intended to be modified or adjusted by the * c-ares library user nor by the c-ares library builder. * * If you think that something actually needs to be changed, adjusted * or fixed in this file, then, report it on the c-ares development * mailing list: http://cool.haxx.se/mailman/listinfo/c-ares/ * * Try to keep one section per platform, compiler and architecture, * otherwise, if an existing section is reused for a different one and * later on the original is adjusted, probably the piggybacking one can * be adversely changed. * * In order to differentiate between platforms/compilers/architectures * use only compiler built in predefined preprocessor symbols. * * This header file shall only export symbols which are 'cares' or 'CARES' * prefixed, otherwise public name space would be polluted. * * NOTE 2: * ------- * * Right now you might be staring at file ares_build.h.dist or ares_build.h, * this is due to the following reason: file ares_build.h.dist is renamed * to ares_build.h when the c-ares source code distribution archive file is * created. * * File ares_build.h.dist is not included in the distribution archive. * File ares_build.h is not present in the git tree. * * The distributed ares_build.h file is only intended to be used on systems * which can not run the also distributed configure script. * * On systems capable of running the configure script, the configure process * will overwrite the distributed ares_build.h file with one that is suitable * and specific to the library being configured and built, which is generated * from the ares_build.h.in template file. * * If you check out from git on a non-configure platform, you must run the * appropriate buildconf* script to set up ares_build.h and other local files. * */ /* ================================================================ */ /* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ /* ================================================================ */ #ifdef CARES_SIZEOF_LONG # error "CARES_SIZEOF_LONG shall not be defined except in ares_build.h" Error Compilation_aborted_CARES_SIZEOF_LONG_already_defined #endif #ifdef CARES_TYPEOF_ARES_SOCKLEN_T # error "CARES_TYPEOF_ARES_SOCKLEN_T shall not be defined except in ares_build.h" Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_already_defined #endif #ifdef CARES_SIZEOF_ARES_SOCKLEN_T # error "CARES_SIZEOF_ARES_SOCKLEN_T shall not be defined except in ares_build.h" Error Compilation_aborted_CARES_SIZEOF_ARES_SOCKLEN_T_already_defined #endif /* ================================================================ */ /* EXTERNAL INTERFACE SETTINGS FOR NON-CONFIGURE SYSTEMS ONLY */ /* ================================================================ */ #if defined(__DJGPP__) || defined(__GO32__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__SALFORDC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__BORLANDC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__TURBOC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__WATCOMC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__POCC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__LCC__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__SYMBIAN32__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T unsigned int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__MWERKS__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(_WIN32_WCE) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__MINGW32__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__VMS) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T unsigned int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 #elif defined(__OS400__) # if defined(__ILEC400__) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t # define CARES_SIZEOF_ARES_SOCKLEN_T 4 # define CARES_PULL_SYS_TYPES_H 1 # define CARES_PULL_SYS_SOCKET_H 1 # endif #elif defined(__MVS__) # if defined(__IBMC__) || defined(__IBMCPP__) # if defined(_ILP32) # define CARES_SIZEOF_LONG 4 # elif defined(_LP64) # define CARES_SIZEOF_LONG 8 # endif # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t # define CARES_SIZEOF_ARES_SOCKLEN_T 4 # define CARES_PULL_SYS_TYPES_H 1 # define CARES_PULL_SYS_SOCKET_H 1 # endif #elif defined(__370__) # if defined(__IBMC__) || defined(__IBMCPP__) # if defined(_ILP32) # define CARES_SIZEOF_LONG 4 # elif defined(_LP64) # define CARES_SIZEOF_LONG 8 # endif # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t # define CARES_SIZEOF_ARES_SOCKLEN_T 4 # define CARES_PULL_SYS_TYPES_H 1 # define CARES_PULL_SYS_SOCKET_H 1 # endif #elif defined(TPF) # define CARES_SIZEOF_LONG 8 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 /* ===================================== */ /* KEEP MSVC THE PENULTIMATE ENTRY */ /* ===================================== */ #elif defined(_MSC_VER) # define CARES_SIZEOF_LONG 4 # define CARES_TYPEOF_ARES_SOCKLEN_T int # define CARES_SIZEOF_ARES_SOCKLEN_T 4 /* ===================================== */ /* KEEP GENERIC GCC THE LAST ENTRY */ /* ===================================== */ #elif defined(__GNUC__) # if defined(__i386__) || defined(__ppc__) # define CARES_SIZEOF_LONG 4 # elif defined(__x86_64__) || defined(__ppc64__) # define CARES_SIZEOF_LONG 8 # endif # define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t # define CARES_SIZEOF_ARES_SOCKLEN_T 4 # define CARES_PULL_SYS_TYPES_H 1 # define CARES_PULL_SYS_SOCKET_H 1 #else # error "Unknown non-configure build target!" Error Compilation_aborted_Unknown_non_configure_build_target #endif /* CARES_PULL_SYS_TYPES_H is defined above when inclusion of header file */ /* sys/types.h is required here to properly make type definitions below. */ #ifdef CARES_PULL_SYS_TYPES_H # include #endif /* CARES_PULL_SYS_SOCKET_H is defined above when inclusion of header file */ /* sys/socket.h is required here to properly make type definitions below. */ #ifdef CARES_PULL_SYS_SOCKET_H # include #endif /* Data type definition of ares_socklen_t. */ #ifdef CARES_TYPEOF_ARES_SOCKLEN_T typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; #endif #endif /* __CARES_BUILD_H */ bzflag-2.4.2+ds1/MSVC/build/bzadmin.sln000066400000000000000000000223671200563112200174620ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzadmin", "bzadmin.vcxproj", "{CA597E05-FD07-4AE3-B963-81C858F26D56}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{57138F88-A81F-4FFB-8BDD-58DB1A1473F5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "date.vcxproj", "{93772A78-3C80-4635-AC84-983B8E0FECF3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "net", "net.vcxproj", "{7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obstacle", "obstacle.vcxproj", "{91C01688-CEB5-4CF3-B13D-6EF86D630523}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scene", "scene.vcxproj", "{1BAED535-4AEF-4041-9CB5-A7DC9C14E105}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{CC93828F-7156-4021-9C77-9951FC187E83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game", "game.vcxproj", "{B2B95537-A4CE-4510-96A6-00F7B7303922}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcxproj", "{6DD493F8-31E1-4958-A240-D157AFFCB07E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ares", "ares.vcxproj", "{417CB8F4-5AE3-45AC-B903-83DB1556303C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{CC93828F-7156-4021-9C77-9951FDADEE83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pdcurses", "pdcurses.vcxproj", "{948A0A16-9121-4CC5-828C-DC3417510068}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|Win32.ActiveCfg = Debug|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|Win32.Build.0 = Debug|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|x64.ActiveCfg = Debug|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|x64.Build.0 = Debug|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|Win32.ActiveCfg = Release|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|Win32.Build.0 = Release|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|x64.ActiveCfg = Release|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|x64.Build.0 = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.ActiveCfg = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.Build.0 = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.ActiveCfg = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.Build.0 = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.ActiveCfg = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.Build.0 = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.ActiveCfg = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.Build.0 = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.ActiveCfg = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.Build.0 = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.ActiveCfg = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.Build.0 = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.ActiveCfg = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.Build.0 = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.ActiveCfg = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.Build.0 = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.Build.0 = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.ActiveCfg = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.Build.0 = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.ActiveCfg = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.Build.0 = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.ActiveCfg = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.Build.0 = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.ActiveCfg = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.Build.0 = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.ActiveCfg = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.Build.0 = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.ActiveCfg = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.Build.0 = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.ActiveCfg = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.Build.0 = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.ActiveCfg = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.Build.0 = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.ActiveCfg = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.Build.0 = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.ActiveCfg = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.Build.0 = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.ActiveCfg = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.Build.0 = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.ActiveCfg = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.Build.0 = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.ActiveCfg = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.Build.0 = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.ActiveCfg = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.Build.0 = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.ActiveCfg = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.Build.0 = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.ActiveCfg = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.Build.0 = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.ActiveCfg = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.Build.0 = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.ActiveCfg = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.Build.0 = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.ActiveCfg = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.Build.0 = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.ActiveCfg = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.Build.0 = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.ActiveCfg = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.Build.0 = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.ActiveCfg = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.Build.0 = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.ActiveCfg = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.Build.0 = Release|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|Win32.ActiveCfg = Debug|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|Win32.Build.0 = Debug|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|x64.ActiveCfg = Debug|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|x64.Build.0 = Debug|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|Win32.ActiveCfg = Release|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|Win32.Build.0 = Release|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|x64.ActiveCfg = Release|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/MSVC/build/bzadmin.vcxproj000066400000000000000000001006511200563112200203520ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {CA597E05-FD07-4AE3-B963-81C858F26D56} Application false MultiByte Application false MultiByte Application false MultiByte Application false MultiByte <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(OutDir)bzadmin.tlb Disabled false ../../win32;../../include;../../src/bzflag;./;../../src/other/curl/include;./curl;../../src/other/PDCurses/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;BUILDING_BZADMIN;HAVE_CURSES_H;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)bzadmin.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzadmin.exe true true $(OutDir)bzadmin.pdb Console false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ X64 $(OutDir)bzadmin.tlb Disabled false ../../win32;../../include;../../src/bzflag;./;../../src/other/curl/include;./curl;../../src/other/PDCurses/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_CONSOLE;BUILDING_BZADMIN;HAVE_CURSES_H;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)bzadmin.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzadmin.exe true true $(OutDir)bzadmin.pdb Console false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ $(OutDir)bzadmin.tlb MaxSpeed OnlyExplicitInline ..\..\win32;..\..\include;..\..\src\bzflag;.\;../../src/other/curl/include;./curl;../../src/other/PDCurses/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;BUILDING_BZADMIN;HAVE_CURSES_H;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)bzadmin.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;%(AdditionalDependencies) $(OutDir)bzadmin.exe true libcmt;%(IgnoreSpecificDefaultLibraries) $(OutDir)bzadmin.pdb Console false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ X64 $(OutDir)bzadmin.tlb MaxSpeed OnlyExplicitInline ..\..\win32;..\..\include;..\..\src\bzflag;.\;../../src/other/curl/include;./curl;../../src/other/PDCurses/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_CONSOLE;BUILDING_BZADMIN;HAVE_CURSES_H;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)bzadmin.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;%(AdditionalDependencies) $(OutDir)bzadmin.exe true libcmt;%(IgnoreSpecificDefaultLibraries) $(OutDir)bzadmin.pdb Console false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) true true true true true true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) {5000550b-da03-4872-9975-1aa7ee3a40af} false {57138f88-a81f-4ffb-8bdd-58db1a1473f5} false {93772a78-3c80-4635-ac84-983b8e0fecf3} false {b2b95537-a4ce-4510-96a6-00f7b7303922} false {7b2595ed-ccb8-4d19-87f2-9a52c7f26ef8} false {948a0a16-9121-4cc5-828c-dc3417510068} false bzflag-2.4.2+ds1/MSVC/build/bzflag.sln000066400000000000000000000302511200563112200172720ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzflag", "bzflag.vcxproj", "{5000550B-DA03-4872-9975-1AA7EE3A40AF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{57138F88-A81F-4FFB-8BDD-58DB1A1473F5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "date.vcxproj", "{93772A78-3C80-4635-AC84-983B8E0FECF3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "geometry", "geometry.vcxproj", "{7009C42E-D693-4635-95CF-23ECBA63653C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mediafile", "mediafile.vcxproj", "{83AD1F75-22FD-477B-BB89-352F47286009}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "net", "net.vcxproj", "{7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obstacle", "obstacle.vcxproj", "{91C01688-CEB5-4CF3-B13D-6EF86D630523}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ogl", "ogl.vcxproj", "{E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "platform", "platform.vcxproj", "{12408598-00B6-487F-8F99-61B1300A15AF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scene", "scene.vcxproj", "{1BAED535-4AEF-4041-9CB5-A7DC9C14E105}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{CC93828F-7156-4021-9C77-9951FC187E83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3D", "3D.vcxproj", "{EA0EF759-C4CA-45F3-B744-7D26FF1EB287}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game", "game.vcxproj", "{B2B95537-A4CE-4510-96A6-00F7B7303922}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcxproj", "{6DD493F8-31E1-4958-A240-D157AFFCB07E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ares", "ares.vcxproj", "{417CB8F4-5AE3-45AC-B903-83DB1556303C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{CC93828F-7156-4021-9C77-9951FDADEE83}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|Win32.ActiveCfg = Debug|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|Win32.Build.0 = Debug|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|x64.ActiveCfg = Debug|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|x64.Build.0 = Debug|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|Win32.ActiveCfg = Release|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|Win32.Build.0 = Release|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|x64.ActiveCfg = Release|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|x64.Build.0 = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.ActiveCfg = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.Build.0 = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.ActiveCfg = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.Build.0 = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.ActiveCfg = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.Build.0 = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.ActiveCfg = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.Build.0 = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.ActiveCfg = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.Build.0 = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.ActiveCfg = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.Build.0 = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.ActiveCfg = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.Build.0 = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.ActiveCfg = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.Build.0 = Release|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|Win32.ActiveCfg = Debug|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|Win32.Build.0 = Debug|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|x64.ActiveCfg = Debug|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|x64.Build.0 = Debug|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|Win32.ActiveCfg = Release|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|Win32.Build.0 = Release|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|x64.ActiveCfg = Release|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|x64.Build.0 = Release|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|Win32.ActiveCfg = Debug|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|Win32.Build.0 = Debug|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|x64.ActiveCfg = Debug|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|x64.Build.0 = Debug|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|Win32.ActiveCfg = Release|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|Win32.Build.0 = Release|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|x64.ActiveCfg = Release|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|x64.Build.0 = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.Build.0 = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.ActiveCfg = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.Build.0 = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.ActiveCfg = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.Build.0 = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.ActiveCfg = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.Build.0 = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.ActiveCfg = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.Build.0 = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.ActiveCfg = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.Build.0 = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.ActiveCfg = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.Build.0 = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.ActiveCfg = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.Build.0 = Release|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|Win32.ActiveCfg = Debug|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|Win32.Build.0 = Debug|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|x64.ActiveCfg = Debug|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|x64.Build.0 = Debug|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|Win32.ActiveCfg = Release|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|Win32.Build.0 = Release|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|x64.ActiveCfg = Release|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|x64.Build.0 = Release|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|Win32.ActiveCfg = Debug|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|Win32.Build.0 = Debug|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|x64.ActiveCfg = Debug|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|x64.Build.0 = Debug|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|Win32.ActiveCfg = Release|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|Win32.Build.0 = Release|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|x64.ActiveCfg = Release|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|x64.Build.0 = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.ActiveCfg = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.Build.0 = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.ActiveCfg = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.Build.0 = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.ActiveCfg = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.Build.0 = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.ActiveCfg = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.Build.0 = Release|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|Win32.ActiveCfg = Debug|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|Win32.Build.0 = Debug|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|x64.ActiveCfg = Debug|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|x64.Build.0 = Debug|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|Win32.ActiveCfg = Release|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|Win32.Build.0 = Release|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|x64.ActiveCfg = Release|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|x64.Build.0 = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.ActiveCfg = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.Build.0 = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.ActiveCfg = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.Build.0 = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.ActiveCfg = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.Build.0 = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.ActiveCfg = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.Build.0 = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.ActiveCfg = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.Build.0 = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.ActiveCfg = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.Build.0 = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.ActiveCfg = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.Build.0 = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.ActiveCfg = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.Build.0 = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.ActiveCfg = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.Build.0 = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.ActiveCfg = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.Build.0 = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.ActiveCfg = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.Build.0 = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.ActiveCfg = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/MSVC/build/bzflag.vcxproj000066400000000000000000002657521200563112200202110ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF} bzflag Application false MultiByte Application false MultiByte true Application false MultiByte Application false MultiByte true <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false true $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false true $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(DXSDK_DIR)\include;$(IncludePath) $(DXSDK_DIR)\include;$(IncludePath) $(DXSDK_DIR)\include;$(IncludePath) $(DXSDK_DIR)\include;$(IncludePath) $(DXSDK_DIR)\Lib\x86;$(LibraryPath) $(DXSDK_DIR)\Lib\x86;$(LibraryPath) $(DXSDK_DIR)\Lib\x64;$(LibraryPath) $(DXSDK_DIR)\Lib\x64;$(LibraryPath) _DEBUG;%(PreprocessorDefinitions) true true Win32 $(OutDir)bzflag.tlb Disabled Default false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;../../src/other/glew/include/;%(AdditionalIncludeDirectories) _WINDOWS;WIN32;_DEBUG;GLEW_STATIC;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true $(OutDir)bzflag.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;dsound.lib;winmm.lib;glu32.lib;opengl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzflag.exe true %(AdditionalLibraryDirectories) true $(OutDir)bzflag.pdb Windows false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ _DEBUG;%(PreprocessorDefinitions) true true X64 $(OutDir)bzflag.tlb Disabled Default false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;../../src/other/glew/include/;%(AdditionalIncludeDirectories) _WINDOWS;WIN32;_DEBUG;GLEW_STATIC;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true $(OutDir)bzflag.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;dsound.lib;winmm.lib;glu32.lib;opengl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzflag.exe true %(AdditionalLibraryDirectories) true $(OutDir)bzflag.pdb Windows false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ NDEBUG;%(PreprocessorDefinitions) true true Win32 $(OutDir)bzflag.tlb MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;../../src/other/glew/include/;%(AdditionalIncludeDirectories) _WINDOWS;WIN32;NDEBUG;GLEW_STATIC;%(PreprocessorDefinitions) true MultiThreadedDLL true true $(OutDir)bzflag.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;dsound.lib;winmm.lib;glu32.lib;opengl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzflag.exe true %(AdditionalLibraryDirectories) LIBCMT;%(IgnoreSpecificDefaultLibraries) $(OutDir)bzflag.pdb Windows false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ NDEBUG;%(PreprocessorDefinitions) true true X64 $(OutDir)bzflag.tlb MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;../../src/other/glew/include/;%(AdditionalIncludeDirectories) _WINDOWS;WIN32;NDEBUG;GLEW_STATIC;%(PreprocessorDefinitions) true MultiThreadedDLL true true $(OutDir)bzflag.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;dsound.lib;winmm.lib;glu32.lib;opengl32.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) $(OutDir)bzflag.exe true %(AdditionalLibraryDirectories) LIBCMT;%(IgnoreSpecificDefaultLibraries) $(OutDir)bzflag.pdb Windows false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) \Documents and Settings\JeffM\Desktop\bzflag\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Documents and Settings\JeffM\Desktop\bzflag\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Documents and Settings\JeffM\Desktop\bzflag\win32;%(AdditionalIncludeDirectories) %(PreprocessorDefinitions) \Documents and Settings\JeffM\Desktop\bzflag\win32;%(AdditionalIncludeDirectories) {ea0ef759-c4ca-45f3-b744-7d26ff1eb287} false {417cb8f4-5ae3-45ac-b903-83db1556303c} false {57138f88-a81f-4ffb-8bdd-58db1a1473f5} false {93772a78-3c80-4635-ac84-983b8e0fecf3} false {b2b95537-a4ce-4510-96a6-00f7b7303922} false {7009c42e-d693-4635-95cf-23ecba63653c} false {cc93828f-7156-4021-9c77-9951fdadee83} false {83ad1f75-22fd-477b-bb89-352f47286009} false {7b2595ed-ccb8-4d19-87f2-9a52c7f26ef8} false {91c01688-ceb5-4cf3-b13d-6ef86d630523} false {e5030dd4-164d-4db0-a593-fa1c76f1f2d7} false {12408598-00b6-487f-8f99-61b1300a15af} false {1baed535-4aef-4041-9cb5-a7dc9c14e105} false bzflag-2.4.2+ds1/MSVC/build/bzfs.sln000066400000000000000000000174231200563112200167770ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzfs", "bzfs.vcxproj", "{7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{57138F88-A81F-4FFB-8BDD-58DB1A1473F5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "date.vcxproj", "{93772A78-3C80-4635-AC84-983B8E0FECF3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "net", "net.vcxproj", "{7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obstacle", "obstacle.vcxproj", "{91C01688-CEB5-4CF3-B13D-6EF86D630523}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{CC93828F-7156-4021-9C77-9951FC187E83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game", "game.vcxproj", "{B2B95537-A4CE-4510-96A6-00F7B7303922}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ares", "ares.vcxproj", "{417CB8F4-5AE3-45AC-B903-83DB1556303C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{CC93828F-7156-4021-9C77-9951FDADEE83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcxproj", "{6DD493F8-31E1-4958-A240-D157AFFCB07E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|Win32.ActiveCfg = Debug|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|Win32.Build.0 = Debug|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|x64.ActiveCfg = Debug|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|x64.Build.0 = Debug|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|Win32.ActiveCfg = Release|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|Win32.Build.0 = Release|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|x64.ActiveCfg = Release|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|x64.Build.0 = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.ActiveCfg = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.Build.0 = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.ActiveCfg = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.Build.0 = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.ActiveCfg = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.Build.0 = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.ActiveCfg = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.Build.0 = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.ActiveCfg = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.Build.0 = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.ActiveCfg = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.Build.0 = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.ActiveCfg = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.Build.0 = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.ActiveCfg = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.Build.0 = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.Build.0 = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.ActiveCfg = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.Build.0 = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.ActiveCfg = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.Build.0 = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.ActiveCfg = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.Build.0 = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.ActiveCfg = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.Build.0 = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.ActiveCfg = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.Build.0 = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.ActiveCfg = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.Build.0 = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.ActiveCfg = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.Build.0 = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.ActiveCfg = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.Build.0 = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.ActiveCfg = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.Build.0 = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.ActiveCfg = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.Build.0 = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.ActiveCfg = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.Build.0 = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.ActiveCfg = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.Build.0 = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.ActiveCfg = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.Build.0 = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.ActiveCfg = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.Build.0 = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.ActiveCfg = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.Build.0 = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.ActiveCfg = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.Build.0 = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.ActiveCfg = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.Build.0 = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.ActiveCfg = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.Build.0 = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.ActiveCfg = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/MSVC/build/bzfs.vcxproj000066400000000000000000001702061200563112200176750ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} Application false MultiByte Application false MultiByte Application false MultiByte Application false MultiByte <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ true $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ true $(OutDir)bzfs.tlb MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) _CONSOLE;WIN32;NDEBUG;INSIDE_BZ;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)bzfs.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)bzfs.exe true ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) LIBCMT;%(IgnoreSpecificDefaultLibraries) .$(OutDir)bzfs.pdb Console false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ copy $(OutDir)*.lib ..\..\bin_$(Platform)\ X64 $(OutDir)bzfs.tlb MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) _CONSOLE;WIN32;NDEBUG;INSIDE_BZ;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)bzfs.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)bzfs.exe true ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) LIBCMT;%(IgnoreSpecificDefaultLibraries) .$(OutDir)bzfs.pdb Console false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ copy $(OutDir)*.lib ..\..\bin_$(Platform)\ $(OutDir)bzfs.tlb Disabled false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) _CONSOLE;WIN32;_DEBUG;INSIDE_BZ;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)bzfs.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)bzfs.exe true ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) true $(OutDir)bzfs.pdb Console false MachineX86 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ copy $(OutDir)*.lib ..\..\bin_$(Platform)\ X64 $(OutDir)bzfs.tlb Disabled false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) _CONSOLE;WIN32;_DEBUG;INSIDE_BZ;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)bzfs.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;odbc32.lib;odbccp32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)bzfs.exe true ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) true $(OutDir)bzfs.pdb Console false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.exe ..\..\bin_$(Platform)\ copy $(OutDir)*.lib ..\..\bin_$(Platform)\ Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) {417cb8f4-5ae3-45ac-b903-83db1556303c} false {57138f88-a81f-4ffb-8bdd-58db1a1473f5} false {93772a78-3c80-4635-ac84-983b8e0fecf3} false {b2b95537-a4ce-4510-96a6-00f7b7303922} false {cc93828f-7156-4021-9c77-9951fdadee83} false {7b2595ed-ccb8-4d19-87f2-9a52c7f26ef8} false {91c01688-ceb5-4cf3-b13d-6ef86d630523} false {6dd493f8-31e1-4958-a240-d157affcb07e} false {cc93828f-7156-4021-9c77-9951fc187e83} false bzflag-2.4.2+ds1/MSVC/build/common.vcxproj000066400000000000000000001504701200563112200202220ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_VC_NET;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)common.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default 0x0409 $(OutDir)common.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_VC_NET;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)common.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default 0x0409 $(OutDir)common.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_VC_NET;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)common.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default 0x0409 $(OutDir)common.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/curl/include;./curl;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_VC_NET;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)common.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default 0x0409 $(OutDir)common.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) {cc93828f-7156-4021-9c77-9951fdadee83} false {6dd493f8-31e1-4958-a240-d157affcb07e} false {cc93828f-7156-4021-9c77-9951fc187e83} false bzflag-2.4.2+ds1/MSVC/build/config.h000066400000000000000000000062251200563112200167310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* win32/config.h. Generated by hand by Jeff Myers 6-12-03 */ /* this config is just for visual C++ since it doesn't use automake*/ // Don't complain about using "insecure" string functions. // This is safe, Microsoft says they will not be removed. #define _CRT_SECURE_NO_DEPRECATE 1 // We use some POSIX names, but defining _POSIX_ breaks some other code. // Tell VC8 to just shut up about it. This is possibly unsafe, as the // affected functions may be removed in the future. #define _CRT_NONSTDC_NO_DEPRECATE 1 #include /* Building regex */ #define BUILD_REGEX 1 /* Time Bomb expiration */ /* #undef TIME_BOMB */ /* Debug Rendering */ /* #undef DEBUG_RENDERING */ /* Enabling Robots */ #define ROBOT 1 /* On windows, strcasecmp is really strcmp */ #define HAVE_STRICMP 1 /* Use modern template for std::count */ #define HAVE_STD__COUNT 1 /* We have float math functions */ #define HAVE_ASINF 1 #define HAVE_ATAN2F 1 #define HAVE_ATANF 1 #define HAVE_COSF 1 #define HAVE_EXPF 1 #define HAVE_FABSF 1 #define HAVE_FLOORF 1 #define HAVE_FMODF 1 #define HAVE_LOGF 1 #define HAVE_POWF 1 #define HAVE_SINF 1 #define HAVE_SQRTF 1 #define HAVE_TANF 1 #define HAVE_LOG10F 1 /* but we don't have this one */ /* #undef HAVE_HYPOTF */ /* Define to 1 if you have regex stuff available */ /* undef HAVE_REGEX_H */ // define our OS #ifndef BZ_BUILD_OS #ifdef _DEBUG #define DEBUG #define DEBUG_RENDERING #define BZ_BUILD_OS "W32VC8D" #else #define BZ_BUILD_OS "W32VC8" #endif //_DEBUG #endif //BZ_BUILD_OS /* Define to 1 if you have the `WaitForSingleObject' function. */ #define HAVE_WAITFORSINGLEOBJECT 1 /* Define to 1 if you have the `Sleep' function. */ #define HAVE_SLEEP 1 /* Define to 1 if you have the `wglGetCurrentContext' function. */ #define HAVE_WGLGETCURRENTCONTEXT 1 /* Define to 1 if you have the `_stricmp' function */ #define HAVE__STRICMP 1 /* Define to 1 if you have the `_strnicmp' function */ #define HAVE__STRNICMP 1 /* Define to 1 if you have the `_vsnprintf' function */ #define HAVE__VSNPRINTF 1 /* Define to 1 if you have the header file. */ #define HAVE_SDL_SDL_H 1 /* Define to 1 if you have GL/glew headers. */ #define HAVE_GLEW 1 /* Define if you wish to build exporting the bzflag API for plugins */ #define BZ_PLUGINS 1 // define all the direct X stuff because we want it, not the SDL stuff #define HAVE_DSOUND_H 1 #define HAVE_STD__MIN 1 #define HAVE_STD__MAX 1 #define HAVE_ARES_LIBRARY_INIT 1 #define BUILD_ARES 1 #ifdef BUILD_ARES #define CARES_STATICLIB #endif #ifndef DEBUG_TRACE #define DEBUG_TRACE inline void W32_DEBUG_TRACE (const char* buffer ) {printf("%s",buffer);} #endif #ifndef in_addr_t #define in_addr_t unsigned long #endif #pragma warning( disable : 4351 ) bzflag-2.4.2+ds1/MSVC/build/curl/000077500000000000000000000000001200563112200162535ustar00rootroot00000000000000bzflag-2.4.2+ds1/MSVC/build/curl/curlbuild.h000066400000000000000000000156411200563112200204200ustar00rootroot00000000000000#ifndef __CURL_CURLBUILD_H #define __CURL_CURLBUILD_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ /* ================================================================ */ /* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ /* ================================================================ */ /* * NOTE 1: * ------- * * Nothing in this file is intended to be modified or adjusted by the * curl library user nor by the curl library builder. * * If you think that something actually needs to be changed, adjusted * or fixed in this file, then, report it on the libcurl development * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ * * This header file shall only export symbols which are 'curl' or 'CURL' * prefixed, otherwise public name space would be polluted. * * NOTE 2: * ------- * * Right now you might be staring at file include/curl/curlbuild.h.in or * at file include/curl/curlbuild.h, this is due to the following reason: * * On systems capable of running the configure script, the configure process * will overwrite the distributed include/curl/curlbuild.h file with one that * is suitable and specific to the library being configured and built, which * is generated from the include/curl/curlbuild.h.in template file. * */ /* ================================================================ */ /* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ /* ================================================================ */ #include #ifdef CURL_SIZEOF_LONG # error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined #endif #ifdef CURL_TYPEOF_CURL_SOCKLEN_T # error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined #endif #ifdef CURL_SIZEOF_CURL_SOCKLEN_T # error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined #endif #ifdef CURL_TYPEOF_CURL_OFF_T # error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined #endif #ifdef CURL_FORMAT_CURL_OFF_T # error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined #endif #ifdef CURL_FORMAT_CURL_OFF_TU # error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined #endif #ifdef CURL_FORMAT_OFF_T # error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined #endif #ifdef CURL_SIZEOF_CURL_OFF_T # error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined #endif #ifdef CURL_SUFFIX_CURL_OFF_T # error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined #endif #ifdef CURL_SUFFIX_CURL_OFF_TU # error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined #endif /* ================================================================ */ /* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ /* ================================================================ */ /* Configure process defines this to 1 when it finds out that system */ /* header file ws2tcpip.h must be included by the external interface. */ #define CURL_PULL_WS2TCPIP_H 1 #ifdef CURL_PULL_WS2TCPIP_H # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN # endif # include # include # include #endif /* Configure process defines this to 1 when it finds out that system */ /* header file sys/types.h must be included by the external interface. */ #define CURL_PULL_SYS_TYPES_H 1 #ifdef CURL_PULL_SYS_TYPES_H # include #endif /* Configure process defines this to 1 when it finds out that system */ /* header file stdint.h must be included by the external interface. */ #undef CURL_PULL_STDINT_H #ifdef CURL_PULL_STDINT_H # include #endif /* Configure process defines this to 1 when it finds out that system */ /* header file inttypes.h must be included by the external interface. */ #undef CURL_PULL_INTTYPES_H #ifdef CURL_PULL_INTTYPES_H # include #endif /* Configure process defines this to 1 when it finds out that system */ /* header file sys/socket.h must be included by the external interface. */ #undef CURL_PULL_SYS_SOCKET_H #ifdef CURL_PULL_SYS_SOCKET_H # include #endif /* The size of `long', as computed by sizeof. */ #define CURL_SIZEOF_LONG 4 /* Integral data type used for curl_socklen_t. */ #define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t /* The size of `curl_socklen_t', as computed by sizeof. */ #define CURL_SIZEOF_CURL_SOCKLEN_T 4 /* Data type definition of curl_socklen_t. */ typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; /* Signed integral data type used for curl_off_t. */ #define CURL_TYPEOF_CURL_OFF_T size_t /* Data type definition of curl_off_t. */ typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; /* curl_off_t formatting string directive without "%" conversion specifier. */ #define CURL_FORMAT_CURL_OFF_T "qd" /* unsigned curl_off_t formatting string without "%" conversion specifier. */ #define CURL_FORMAT_CURL_OFF_TU "qu" /* curl_off_t formatting string directive with "%" conversion specifier. */ #define CURL_FORMAT_OFF_T "%qd" /* The size of `curl_off_t', as computed by sizeof. */ #ifndef _WIN64 #define CURL_SIZEOF_CURL_OFF_T 4 #else #define CURL_SIZEOF_CURL_OFF_T 8 #endif /* curl_off_t constant suffix. */ #define CURL_SUFFIX_CURL_OFF_T LL /* unsigned curl_off_t constant suffix. */ #define CURL_SUFFIX_CURL_OFF_TU ULL #endif /* __CURL_CURLBUILD_H */ bzflag-2.4.2+ds1/MSVC/build/date.vcxproj000066400000000000000000000311061200563112200176410ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {93772A78-3C80-4635-AC84-983B8E0FECF3} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false .;.\..\..\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)date.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)date.lib true Touching buildDate.cxx... X64 Disabled false .;.\..\..\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)date.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)date.lib true Touching buildDate.cxx... MaxSpeed OnlyExplicitInline .;.\..\..\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)date.pch $(OutDir) $(OutDir) $(OutDir) Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)date.lib true Touching buildDate.cxx... type ..\..\src\date\buildDate.cxx > __bd.cxx type __bd.cxx > ..\..\src\date\buildDate.cxx del __bd.cxx X64 MaxSpeed OnlyExplicitInline .;.\..\..\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)date.pch $(OutDir) $(OutDir) $(OutDir) Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)date.lib true Touching buildDate.cxx... type ..\..\src\date\buildDate.cxx > __bd.cxx type __bd.cxx > ..\..\src\date\buildDate.cxx del __bd.cxx Disabled %(PreprocessorDefinitions) EnableFastChecks Disabled %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(PreprocessorDefinitions) MaxSpeed %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/fullbuild.sln000066400000000000000000001241761200563112200200210ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{57FFDC0F-E8B8-478D-8E12-474EDD2B381C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzadmin", "bzadmin.vcxproj", "{CA597E05-FD07-4AE3-B963-81C858F26D56}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzflag", "bzflag.vcxproj", "{5000550B-DA03-4872-9975-1AA7EE3A40AF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzfs", "bzfs.vcxproj", "{7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "common.vcxproj", "{57138F88-A81F-4FFB-8BDD-58DB1A1473F5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "date.vcxproj", "{93772A78-3C80-4635-AC84-983B8E0FECF3}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "geometry", "geometry.vcxproj", "{7009C42E-D693-4635-95CF-23ECBA63653C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "installer", "installer.vcxproj", "{0169213B-F29C-4244-8280-602EB17F55FB}" ProjectSection(ProjectDependencies) = postProject {AD285E14-AAA4-4D71-962D-4E7EDE796B58} = {AD285E14-AAA4-4D71-962D-4E7EDE796B58} {A109E817-5A7C-4274-87A3-7281A8C20AE4} = {A109E817-5A7C-4274-87A3-7281A8C20AE4} {F081A46D-3992-492A-BF68-05C18957A326} = {F081A46D-3992-492A-BF68-05C18957A326} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makehtml", "makehtml.vcxproj", "{91198429-3669-4C40-A294-B8593D7C4987}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "man2html", "man2html.vcxproj", "{23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mediafile", "mediafile.vcxproj", "{83AD1F75-22FD-477B-BB89-352F47286009}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "net", "net.vcxproj", "{7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obstacle", "obstacle.vcxproj", "{91C01688-CEB5-4CF3-B13D-6EF86D630523}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ogl", "ogl.vcxproj", "{E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "platform", "platform.vcxproj", "{12408598-00B6-487F-8F99-61B1300A15AF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scene", "scene.vcxproj", "{1BAED535-4AEF-4041-9CB5-A7DC9C14E105}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{CC93828F-7156-4021-9C77-9951FC187E83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3D", "3D.vcxproj", "{EA0EF759-C4CA-45F3-B744-7D26FF1EB287}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "game", "game.vcxproj", "{B2B95537-A4CE-4510-96A6-00F7B7303922}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "regex.vcxproj", "{6DD493F8-31E1-4958-A240-D157AFFCB07E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ares", "ares.vcxproj", "{417CB8F4-5AE3-45AC-B903-83DB1556303C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcurl", "libcurl.vcxproj", "{CC93828F-7156-4021-9C77-9951FDADEE83}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pdcurses", "pdcurses.vcxproj", "{948A0A16-9121-4CC5-828C-DC3417510068}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "airspawn", "..\..\plugins\airspawn\airspawn.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" ProjectSection(ProjectDependencies) = postProject {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} = {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "chathistory", "..\..\plugins\chathistory\chathistory.vcxproj", "{B629554E-D0E9-4400-909B-7130F116E15D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flagStay", "..\..\plugins\flagStay\flagStay.vcxproj", "{1FF80896-DD88-4992-8DB1-7070924091BF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hiddenAdmin", "..\..\plugins\hiddenAdmin\hiddenAdmin.vcxproj", "{2EAF7655-AE86-4407-8262-43496581E5B2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HoldTheFlag", "..\..\plugins\HoldTheFlag\HoldTheFlag.vcxproj", "{0D4F5307-9240-4880-A289-C30F112F99A1}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keepaway", "..\..\plugins\keepaway\keepaway.vcxproj", "{F493BA5D-252B-4825-8C15-36F75B4CE0AA}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "killall", "..\..\plugins\killall\killall.vcxproj", "{A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "koth", "..\..\plugins\koth\koth.vcxproj", "{3086EB1F-209A-43CF-91B7-0AECBA87B4D9}" ProjectSection(ProjectDependencies) = postProject {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} = {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logDetail", "..\..\plugins\logDetail\logDetail.vcxproj", "{6B10F1DA-CD6A-4994-8C29-95DAE215D331}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nagware", "..\..\plugins\nagware\nagware.vcxproj", "{2A9BC706-C839-4091-B3CE-36E6E324565F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Phoenix", "..\..\plugins\Phoenix\Phoenix.vcxproj", "{16D3208C-0A75-4CC3-A7C2-6A266127BB90}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playHistoryTracker", "..\..\plugins\playHistoryTracker\playHistoryTracker.vcxproj", "{81495CFD-E8CC-4F99-B285-4CBAEDB6D808}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "..\..\plugins\plugin_utils\plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pushstats", "..\..\plugins\pushstats\pushstats.vcxproj", "{EA71E096-B07B-4E02-855B-97870DA72EDD}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rabbitTimer", "..\..\plugins\rabbitTimer\rabbitTimer.vcxproj", "{A4F41740-C547-4696-B2B4-9FDF66FD9112}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rabidRabbit", "..\..\plugins\rabidRabbit\rabidRabbit.vcxproj", "{F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recordmatch", "..\..\plugins\recordmatch\recordmatch.vcxproj", "{1BE08800-933A-49E2-9090-11139ECC5AC8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regFlag", "..\..\plugins\regFlag\regFlag.vcxproj", "{43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RogueGenocide", "..\..\plugins\RogueGenocide\RogueGenocide.vcxproj", "{AD6040FD-F813-4DA7-8058-32022A58F79E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serverControl", "..\..\plugins\serverControl\serverControl.vcxproj", "{C2021BB4-EB46-4855-B26F-DBBDB97EE43C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shockwaveDeath", "..\..\plugins\shockwaveDeath\shockwaveDeath.vcxproj", "{71A8E9FF-58CE-459C-9BD7-9C5706DB6491}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "teamflagreset", "..\..\plugins\teamflagreset\teamflagreset.vcxproj", "{A7AF7B05-55FA-4995-A50A-1C120AC61FF6}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timedctf", "..\..\plugins\timedctf\timedctf.vcxproj", "{F82FE1A4-06D6-4358-8CD5-11E88922736F}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TimeLimit", "..\..\plugins\TimeLimit\TimeLimit.vcxproj", "{F0524257-1263-4511-A1F9-CA18758F1065}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wwzones", "..\..\plugins\wwzones\wwzones.vcxproj", "{453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "customflagsample", "..\..\plugins\customflagsample\customflagsample.vcxproj", "{1F43077E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fastmap", "..\..\plugins\fastmap\fastmap.vcxproj", "{F081A46D-3992-492A-BF68-05C18957A326}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fairCTF", "..\..\plugins\fairCTF\fairCTF.vcxproj", "{A109E817-5A7C-4274-87A3-7281A8C20AE4}" ProjectSection(ProjectDependencies) = postProject {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} = {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "autoFlagReset", "..\..\plugins\autoFlagReset\autoFlagReset.vcxproj", "{AD285E14-AAA4-4D71-962D-4E7EDE796B58}" ProjectSection(ProjectDependencies) = postProject {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} = {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|Win32.ActiveCfg = Debug|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|Win32.Build.0 = Debug|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|x64.ActiveCfg = Debug|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Debug|x64.Build.0 = Debug|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|Win32.ActiveCfg = Release|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|Win32.Build.0 = Release|Win32 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|x64.ActiveCfg = Release|x64 {CA597E05-FD07-4AE3-B963-81C858F26D56}.Release|x64.Build.0 = Release|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|Win32.ActiveCfg = Debug|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|Win32.Build.0 = Debug|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|x64.ActiveCfg = Debug|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Debug|x64.Build.0 = Debug|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|Win32.ActiveCfg = Release|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|Win32.Build.0 = Release|Win32 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|x64.ActiveCfg = Release|x64 {5000550B-DA03-4872-9975-1AA7EE3A40AF}.Release|x64.Build.0 = Release|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|Win32.ActiveCfg = Debug|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|Win32.Build.0 = Debug|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|x64.ActiveCfg = Debug|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Debug|x64.Build.0 = Debug|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|Win32.ActiveCfg = Release|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|Win32.Build.0 = Release|Win32 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|x64.ActiveCfg = Release|x64 {7FA170AC-5A33-41FC-9B3D-02F9E5173B0E}.Release|x64.Build.0 = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.ActiveCfg = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|Win32.Build.0 = Debug|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.ActiveCfg = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Debug|x64.Build.0 = Debug|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.ActiveCfg = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|Win32.Build.0 = Release|Win32 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.ActiveCfg = Release|x64 {57138F88-A81F-4FFB-8BDD-58DB1A1473F5}.Release|x64.Build.0 = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.ActiveCfg = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|Win32.Build.0 = Debug|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.ActiveCfg = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Debug|x64.Build.0 = Debug|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.ActiveCfg = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|Win32.Build.0 = Release|Win32 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.ActiveCfg = Release|x64 {93772A78-3C80-4635-AC84-983B8E0FECF3}.Release|x64.Build.0 = Release|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|Win32.ActiveCfg = Debug|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|Win32.Build.0 = Debug|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|x64.ActiveCfg = Debug|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Debug|x64.Build.0 = Debug|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|Win32.ActiveCfg = Release|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|Win32.Build.0 = Release|Win32 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|x64.ActiveCfg = Release|x64 {7009C42E-D693-4635-95CF-23ECBA63653C}.Release|x64.Build.0 = Release|x64 {0169213B-F29C-4244-8280-602EB17F55FB}.Debug|Win32.ActiveCfg = Debug|Win32 {0169213B-F29C-4244-8280-602EB17F55FB}.Debug|Win32.Build.0 = Debug|Win32 {0169213B-F29C-4244-8280-602EB17F55FB}.Debug|x64.ActiveCfg = Debug|x64 {0169213B-F29C-4244-8280-602EB17F55FB}.Debug|x64.Build.0 = Debug|x64 {0169213B-F29C-4244-8280-602EB17F55FB}.Release|Win32.ActiveCfg = Release|Win32 {0169213B-F29C-4244-8280-602EB17F55FB}.Release|Win32.Build.0 = Release|Win32 {0169213B-F29C-4244-8280-602EB17F55FB}.Release|x64.ActiveCfg = Release|x64 {0169213B-F29C-4244-8280-602EB17F55FB}.Release|x64.Build.0 = Release|x64 {91198429-3669-4C40-A294-B8593D7C4987}.Debug|Win32.ActiveCfg = Debug|Win32 {91198429-3669-4C40-A294-B8593D7C4987}.Debug|Win32.Build.0 = Debug|Win32 {91198429-3669-4C40-A294-B8593D7C4987}.Debug|x64.ActiveCfg = Debug|x64 {91198429-3669-4C40-A294-B8593D7C4987}.Debug|x64.Build.0 = Debug|x64 {91198429-3669-4C40-A294-B8593D7C4987}.Release|Win32.ActiveCfg = Release|Win32 {91198429-3669-4C40-A294-B8593D7C4987}.Release|Win32.Build.0 = Release|Win32 {91198429-3669-4C40-A294-B8593D7C4987}.Release|x64.ActiveCfg = Release|x64 {91198429-3669-4C40-A294-B8593D7C4987}.Release|x64.Build.0 = Release|x64 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Debug|Win32.ActiveCfg = Debug|Win32 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Debug|Win32.Build.0 = Debug|Win32 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Debug|x64.ActiveCfg = Debug|x64 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Debug|x64.Build.0 = Debug|x64 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Release|Win32.ActiveCfg = Release|Win32 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Release|Win32.Build.0 = Release|Win32 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Release|x64.ActiveCfg = Release|x64 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA}.Release|x64.Build.0 = Release|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|Win32.ActiveCfg = Debug|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|Win32.Build.0 = Debug|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|x64.ActiveCfg = Debug|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Debug|x64.Build.0 = Debug|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|Win32.ActiveCfg = Release|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|Win32.Build.0 = Release|Win32 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|x64.ActiveCfg = Release|x64 {83AD1F75-22FD-477B-BB89-352F47286009}.Release|x64.Build.0 = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.ActiveCfg = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|Win32.Build.0 = Debug|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.ActiveCfg = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Debug|x64.Build.0 = Debug|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.ActiveCfg = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|Win32.Build.0 = Release|Win32 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.ActiveCfg = Release|x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8}.Release|x64.Build.0 = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.ActiveCfg = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|Win32.Build.0 = Debug|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.ActiveCfg = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Debug|x64.Build.0 = Debug|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.ActiveCfg = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|Win32.Build.0 = Release|Win32 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.ActiveCfg = Release|x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523}.Release|x64.Build.0 = Release|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|Win32.ActiveCfg = Debug|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|Win32.Build.0 = Debug|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|x64.ActiveCfg = Debug|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Debug|x64.Build.0 = Debug|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|Win32.ActiveCfg = Release|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|Win32.Build.0 = Release|Win32 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|x64.ActiveCfg = Release|x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7}.Release|x64.Build.0 = Release|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|Win32.ActiveCfg = Debug|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|Win32.Build.0 = Debug|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|x64.ActiveCfg = Debug|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Debug|x64.Build.0 = Debug|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|Win32.ActiveCfg = Release|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|Win32.Build.0 = Release|Win32 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|x64.ActiveCfg = Release|x64 {12408598-00B6-487F-8F99-61B1300A15AF}.Release|x64.Build.0 = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.ActiveCfg = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|Win32.Build.0 = Debug|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.ActiveCfg = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Debug|x64.Build.0 = Debug|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.ActiveCfg = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|Win32.Build.0 = Release|Win32 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.ActiveCfg = Release|x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FC187E83}.Release|x64.Build.0 = Release|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|Win32.ActiveCfg = Debug|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|Win32.Build.0 = Debug|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|x64.ActiveCfg = Debug|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Debug|x64.Build.0 = Debug|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|Win32.ActiveCfg = Release|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|Win32.Build.0 = Release|Win32 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|x64.ActiveCfg = Release|x64 {EA0EF759-C4CA-45F3-B744-7D26FF1EB287}.Release|x64.Build.0 = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.ActiveCfg = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|Win32.Build.0 = Debug|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.ActiveCfg = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Debug|x64.Build.0 = Debug|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.ActiveCfg = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|Win32.Build.0 = Release|Win32 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.ActiveCfg = Release|x64 {B2B95537-A4CE-4510-96A6-00F7B7303922}.Release|x64.Build.0 = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.ActiveCfg = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.Build.0 = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.ActiveCfg = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.Build.0 = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.ActiveCfg = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.Build.0 = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.ActiveCfg = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.Build.0 = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.ActiveCfg = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|Win32.Build.0 = Debug|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.ActiveCfg = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Debug|x64.Build.0 = Debug|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.ActiveCfg = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|Win32.Build.0 = Release|Win32 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.ActiveCfg = Release|x64 {417CB8F4-5AE3-45AC-B903-83DB1556303C}.Release|x64.Build.0 = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.ActiveCfg = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|Win32.Build.0 = Debug|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.ActiveCfg = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Debug|x64.Build.0 = Debug|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.ActiveCfg = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|Win32.Build.0 = Release|Win32 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.ActiveCfg = Release|x64 {CC93828F-7156-4021-9C77-9951FDADEE83}.Release|x64.Build.0 = Release|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|Win32.ActiveCfg = Debug|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|Win32.Build.0 = Debug|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|x64.ActiveCfg = Debug|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Debug|x64.Build.0 = Debug|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|Win32.ActiveCfg = Release|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|Win32.Build.0 = Release|Win32 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|x64.ActiveCfg = Release|x64 {948A0A16-9121-4CC5-828C-DC3417510068}.Release|x64.Build.0 = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.Build.0 = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.Build.0 = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|Win32.ActiveCfg = Debug|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|Win32.Build.0 = Debug|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|x64.ActiveCfg = Debug|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|x64.Build.0 = Debug|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|Win32.ActiveCfg = Release|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|Win32.Build.0 = Release|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|x64.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|x64.Build.0 = Release|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|Win32.ActiveCfg = Debug|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|Win32.Build.0 = Debug|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|x64.ActiveCfg = Debug|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|x64.Build.0 = Debug|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|Win32.ActiveCfg = Release|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|Win32.Build.0 = Release|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|x64.ActiveCfg = Release|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|x64.Build.0 = Release|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|Win32.ActiveCfg = Debug|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|Win32.Build.0 = Debug|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|x64.ActiveCfg = Debug|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|x64.Build.0 = Debug|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|Win32.ActiveCfg = Release|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|Win32.Build.0 = Release|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|x64.ActiveCfg = Release|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|x64.Build.0 = Release|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|Win32.ActiveCfg = Debug|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|Win32.Build.0 = Debug|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|x64.ActiveCfg = Debug|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|x64.Build.0 = Debug|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|Win32.ActiveCfg = Release|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|Win32.Build.0 = Release|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|x64.ActiveCfg = Release|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|x64.Build.0 = Release|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|Win32.ActiveCfg = Debug|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|Win32.Build.0 = Debug|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|x64.ActiveCfg = Debug|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|x64.Build.0 = Debug|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|Win32.ActiveCfg = Release|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|Win32.Build.0 = Release|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|x64.ActiveCfg = Release|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|x64.Build.0 = Release|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|Win32.ActiveCfg = Debug|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|Win32.Build.0 = Debug|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|x64.ActiveCfg = Debug|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|x64.Build.0 = Debug|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|Win32.ActiveCfg = Release|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|Win32.Build.0 = Release|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|x64.ActiveCfg = Release|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|x64.Build.0 = Release|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|Win32.ActiveCfg = Debug|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|Win32.Build.0 = Debug|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|x64.ActiveCfg = Debug|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|x64.Build.0 = Debug|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|Win32.ActiveCfg = Release|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|Win32.Build.0 = Release|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|x64.ActiveCfg = Release|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|x64.Build.0 = Release|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|Win32.ActiveCfg = Debug|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|Win32.Build.0 = Debug|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|x64.ActiveCfg = Debug|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|x64.Build.0 = Debug|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|Win32.ActiveCfg = Release|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|Win32.Build.0 = Release|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|x64.ActiveCfg = Release|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|x64.Build.0 = Release|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|Win32.ActiveCfg = Debug|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|Win32.Build.0 = Debug|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|x64.ActiveCfg = Debug|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|x64.Build.0 = Debug|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|Win32.ActiveCfg = Release|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|Win32.Build.0 = Release|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|x64.ActiveCfg = Release|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|x64.Build.0 = Release|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|Win32.ActiveCfg = Debug|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|Win32.Build.0 = Debug|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|x64.ActiveCfg = Debug|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|x64.Build.0 = Debug|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|Win32.ActiveCfg = Release|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|Win32.Build.0 = Release|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|x64.ActiveCfg = Release|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|x64.Build.0 = Release|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|Win32.ActiveCfg = Debug|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|Win32.Build.0 = Debug|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|x64.ActiveCfg = Debug|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|x64.Build.0 = Debug|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|Win32.ActiveCfg = Release|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|Win32.Build.0 = Release|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|x64.ActiveCfg = Release|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|x64.Build.0 = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.Build.0 = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.ActiveCfg = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.Build.0 = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.ActiveCfg = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.Build.0 = Release|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|Win32.ActiveCfg = Debug|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|Win32.Build.0 = Debug|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|x64.ActiveCfg = Debug|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|x64.Build.0 = Debug|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|Win32.ActiveCfg = Release|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|Win32.Build.0 = Release|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|x64.ActiveCfg = Release|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|x64.Build.0 = Release|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|Win32.ActiveCfg = Debug|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|Win32.Build.0 = Debug|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|x64.ActiveCfg = Debug|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|x64.Build.0 = Debug|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|Win32.ActiveCfg = Release|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|Win32.Build.0 = Release|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|x64.ActiveCfg = Release|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|x64.Build.0 = Release|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|Win32.ActiveCfg = Debug|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|Win32.Build.0 = Debug|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|x64.ActiveCfg = Debug|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|x64.Build.0 = Debug|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|Win32.ActiveCfg = Release|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|Win32.Build.0 = Release|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|x64.ActiveCfg = Release|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|x64.Build.0 = Release|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|Win32.ActiveCfg = Debug|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|Win32.Build.0 = Debug|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|x64.ActiveCfg = Debug|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|x64.Build.0 = Debug|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|Win32.ActiveCfg = Release|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|Win32.Build.0 = Release|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|x64.ActiveCfg = Release|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|x64.Build.0 = Release|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|Win32.ActiveCfg = Debug|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|Win32.Build.0 = Debug|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|x64.ActiveCfg = Debug|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|x64.Build.0 = Debug|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|Win32.ActiveCfg = Release|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|Win32.Build.0 = Release|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|x64.ActiveCfg = Release|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|x64.Build.0 = Release|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|Win32.ActiveCfg = Debug|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|Win32.Build.0 = Debug|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|x64.ActiveCfg = Debug|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|x64.Build.0 = Debug|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|Win32.ActiveCfg = Release|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|Win32.Build.0 = Release|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|x64.ActiveCfg = Release|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|x64.Build.0 = Release|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|Win32.ActiveCfg = Debug|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|Win32.Build.0 = Debug|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|x64.ActiveCfg = Debug|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|x64.Build.0 = Debug|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|Win32.ActiveCfg = Release|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|Win32.Build.0 = Release|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|x64.ActiveCfg = Release|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|x64.Build.0 = Release|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|Win32.ActiveCfg = Debug|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|Win32.Build.0 = Debug|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|x64.ActiveCfg = Debug|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|x64.Build.0 = Debug|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|Win32.ActiveCfg = Release|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|Win32.Build.0 = Release|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|x64.ActiveCfg = Release|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|x64.Build.0 = Release|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|Win32.ActiveCfg = Debug|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|Win32.Build.0 = Debug|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|x64.ActiveCfg = Debug|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|x64.Build.0 = Debug|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|Win32.ActiveCfg = Release|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|Win32.Build.0 = Release|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|x64.ActiveCfg = Release|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|x64.Build.0 = Release|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|Win32.ActiveCfg = Debug|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|Win32.Build.0 = Debug|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|x64.ActiveCfg = Debug|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|x64.Build.0 = Debug|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|Win32.ActiveCfg = Release|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|Win32.Build.0 = Release|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|x64.ActiveCfg = Release|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|x64.Build.0 = Release|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|Win32.ActiveCfg = Debug|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|Win32.Build.0 = Debug|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|x64.ActiveCfg = Debug|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|x64.Build.0 = Debug|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|Win32.ActiveCfg = Release|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|Win32.Build.0 = Release|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|x64.ActiveCfg = Release|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|x64.Build.0 = Release|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|Win32.ActiveCfg = Debug|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|Win32.Build.0 = Debug|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|x64.ActiveCfg = Debug|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|x64.Build.0 = Debug|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|Win32.ActiveCfg = Release|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|Win32.Build.0 = Release|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|x64.ActiveCfg = Release|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|x64.Build.0 = Release|x64 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|Win32.ActiveCfg = Debug|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|Win32.Build.0 = Debug|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|x64.ActiveCfg = Debug|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|x64.Build.0 = Debug|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Release|Win32.ActiveCfg = Release|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Release|Win32.Build.0 = Release|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Release|x64.ActiveCfg = Release|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Release|x64.Build.0 = Release|x64 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Debug|Win32.ActiveCfg = Debug|Win32 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Debug|Win32.Build.0 = Debug|Win32 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Debug|x64.ActiveCfg = Debug|x64 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Debug|x64.Build.0 = Debug|x64 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Release|Win32.ActiveCfg = Release|Win32 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Release|Win32.Build.0 = Release|Win32 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Release|x64.ActiveCfg = Release|x64 {A109E817-5A7C-4274-87A3-7281A8C20AE4}.Release|x64.Build.0 = Release|x64 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Debug|Win32.ActiveCfg = Debug|Win32 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Debug|Win32.Build.0 = Debug|Win32 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Debug|x64.ActiveCfg = Debug|x64 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Debug|x64.Build.0 = Debug|x64 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Release|Win32.ActiveCfg = Release|Win32 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Release|Win32.Build.0 = Release|Win32 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Release|x64.ActiveCfg = Release|x64 {AD285E14-AAA4-4D71-962D-4E7EDE796B58}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {B629554E-D0E9-4400-909B-7130F116E15D} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {1FF80896-DD88-4992-8DB1-7070924091BF} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {2EAF7655-AE86-4407-8262-43496581E5B2} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {0D4F5307-9240-4880-A289-C30F112F99A1} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {F493BA5D-252B-4825-8C15-36F75B4CE0AA} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {3086EB1F-209A-43CF-91B7-0AECBA87B4D9} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {6B10F1DA-CD6A-4994-8C29-95DAE215D331} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {2A9BC706-C839-4091-B3CE-36E6E324565F} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {16D3208C-0A75-4CC3-A7C2-6A266127BB90} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {81495CFD-E8CC-4F99-B285-4CBAEDB6D808} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {EA71E096-B07B-4E02-855B-97870DA72EDD} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {A4F41740-C547-4696-B2B4-9FDF66FD9112} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {1BE08800-933A-49E2-9090-11139ECC5AC8} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {AD6040FD-F813-4DA7-8058-32022A58F79E} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {C2021BB4-EB46-4855-B26F-DBBDB97EE43C} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {71A8E9FF-58CE-459C-9BD7-9C5706DB6491} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {A7AF7B05-55FA-4995-A50A-1C120AC61FF6} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {F82FE1A4-06D6-4358-8CD5-11E88922736F} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {F0524257-1263-4511-A1F9-CA18758F1065} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {1F43077E-8AF6-486F-AEDF-6B350A6CE141} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {F081A46D-3992-492A-BF68-05C18957A326} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {A109E817-5A7C-4274-87A3-7281A8C20AE4} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} {AD285E14-AAA4-4D71-962D-4E7EDE796B58} = {57FFDC0F-E8B8-478D-8E12-474EDD2B381C} EndGlobalSection GlobalSection(DPCodeReviewSolutionGUID) = preSolution DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} EndGlobalSection EndGlobal bzflag-2.4.2+ds1/MSVC/build/game.vcxproj000066400000000000000000000256511200563112200176450ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {B2B95537-A4CE-4510-96A6-00F7B7303922} Win32Proj StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ../../include/;../;./;../../src/other/curl/include;./curl;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 false EditAndContinue $(OutDir)game.lib true X64 Disabled false ../../include/;../;./;../../src/other/curl/include;./curl;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 false ProgramDatabase $(OutDir)game.lib true ../../include/;../;./;../../src/other/curl/include;./curl;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)game.lib X64 ../../include/;../;./;../../src/other/curl/include;./curl;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)game.lib {cc93828f-7156-4021-9c77-9951fdadee83} false bzflag-2.4.2+ds1/MSVC/build/geometry.vcxproj000066400000000000000000001510071200563112200205620ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {7009C42E-D693-4635-95CF-23ECBA63653C} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)geometry.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)geometry.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)geometry.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)geometry.lib true Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL .$(OutDir)geometry.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)geometry.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL .$(OutDir)geometry.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)geometry.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/installer.vcxproj000066400000000000000000000412341200563112200207240ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {0169213B-F29C-4244-8280-602EB17F55FB} installer MakeFileProj Utility false Utility false Utility false Utility false <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(OutDir)installer.tlb X64 $(OutDir)installer.tlb $(OutDir)installer.tlb "$(VSInstallDir)..\nsis\makensis.exe" "$(ProjectDir)..\..\package\win32\nsis\BZFlag.nsi" X64 $(OutDir)installer.tlb "$(VSInstallDir)..\nsis\makensis.exe" /DBUILD_64 "$(ProjectDir)..\..\package\win32\nsis\BZFlag.nsi" Document %(Outputs) makensis /D BUILD_64 %(FullPath) {1f43075e-8af6-486f-aedf-6b350a6ce141} false {b629554e-d0e9-4400-909b-7130f116e15d} false {1f43077e-8af6-486f-aedf-6b350a6ce141} false {1ff80896-dd88-4992-8db1-7070924091bf} false {2eaf7655-ae86-4407-8262-43496581e5b2} false {0d4f5307-9240-4880-a289-c30f112f99a1} false {f493ba5d-252b-4825-8c15-36f75b4ce0aa} false {a9898aec-086b-4b9e-8978-c1bfe3ea56a6} false {3086eb1f-209a-43cf-91b7-0aecba87b4d9} false {6b10f1da-cd6a-4994-8c29-95dae215d331} false {2a9bc706-c839-4091-b3ce-36e6e324565f} false {16d3208c-0a75-4cc3-a7c2-6a266127bb90} false {81495cfd-e8cc-4f99-b285-4cbaedb6d808} false {645768be-97c8-4de4-9100-111bd2808b35} false {ea71e096-b07b-4e02-855b-97870da72edd} false {a4f41740-c547-4696-b2b4-9fdf66fd9112} false {f3055cd9-357a-4136-b9d8-09d6e5f2b4a6} false {1be08800-933a-49e2-9090-11139ecc5ac8} false {43a4f281-53e9-4e6d-abc0-09be6b592f0f} false {ad6040fd-f813-4da7-8058-32022a58f79e} false {c2021bb4-eb46-4855-b26f-dbbdb97ee43c} false {71a8e9ff-58ce-459c-9bd7-9c5706db6491} false {a7af7b05-55fa-4995-a50a-1c120ac61ff6} false {f82fe1a4-06d6-4358-8cd5-11e88922736f} false {f0524257-1263-4511-a1f9-ca18758f1065} false {453c1ff9-45d3-4c3a-8a51-5e1fbe65ef7e} false {ea0ef759-c4ca-45f3-b744-7d26ff1eb287} false {417cb8f4-5ae3-45ac-b903-83db1556303c} false {ca597e05-fd07-4ae3-b963-81c858f26d56} false {5000550b-da03-4872-9975-1aa7ee3a40af} false {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {57138f88-a81f-4ffb-8bdd-58db1a1473f5} false {93772a78-3c80-4635-ac84-983b8e0fecf3} false {b2b95537-a4ce-4510-96a6-00f7b7303922} false {7009c42e-d693-4635-95cf-23ecba63653c} false {cc93828f-7156-4021-9c77-9951fdadee83} false {91198429-3669-4c40-a294-b8593d7c4987} false {23dc26a8-35c0-4775-a2d6-e2092dab9bfa} false {83ad1f75-22fd-477b-bb89-352f47286009} false {7b2595ed-ccb8-4d19-87f2-9a52c7f26ef8} false {91c01688-ceb5-4cf3-b13d-6ef86d630523} false {e5030dd4-164d-4db0-a593-fa1c76f1f2d7} false {948a0a16-9121-4cc5-828c-dc3417510068} false {12408598-00b6-487f-8f99-61b1300a15af} false {6dd493f8-31e1-4958-a240-d157affcb07e} false {1baed535-4aef-4041-9cb5-a7dc9c14e105} false {cc93828f-7156-4021-9c77-9951fc187e83} false bzflag-2.4.2+ds1/MSVC/build/libcurl.vcxproj000066400000000000000000000601761200563112200203710ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {CC93828F-7156-4021-9C77-9951FDADEE83} libcurl DynamicLibrary false MultiByte DynamicLibrary false MultiByte DynamicLibrary false MultiByte DynamicLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false .\;.\curl;..\..\include;..\..\src\other\curl\lib;..\..\src\other\curl\include;..\..\src\other\ares;..\..\src\other\zlib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;BUILDING_LIBCURL;USE_ARES;CARES_STATICLIB;HAVE_ZLIB_H;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)libcurl.pch true Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;Advapi32.lib;wldap32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).dll ./ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) true false mkdir ..\..\bin_$(Platform) copy $(OutDir)*.dll ..\..\bin_$(Platform)\ MaxSpeed ..\..\include;..\..\src\other\curl\lib;..\..\src\other\curl\include;..\..\src\other\ares;..\..\src\other\zlib;.\;.\curl WIN32;_LIB;BUILDING_LIBCURL;USE_ARES;CARES_STATICLIB;HAVE_ZLIB_H;%(PreprocessorDefinitions) true MultiThreadedDLL $(OutDir)libcurl.pch Level3 false true Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;Advapi32.lib;wldap32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).dll ./ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) false mkdir ..\..\bin_$(Platform) copy $(OutDir)*.dll ..\..\bin_$(Platform)\ X64 Disabled false .\;.\curl;..\..\include;..\..\src\other\curl\lib;..\..\src\other\curl\include;..\..\src\other\ares;..\..\src\other\zlib;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;BUILDING_LIBCURL;USE_ARES;CARES_STATICLIB;HAVE_ZLIB_H;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)libcurl.pch true Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;Advapi32.lib;wldap32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).dll ./ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) true false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.dll ..\..\bin_$(Platform)\ X64 MaxSpeed ..\..\include;..\..\src\other\curl\lib;..\..\src\other\curl\include;..\..\src\other\ares;..\..\src\other\zlib;.\;.\curl WIN32;_LIB;BUILDING_LIBCURL;USE_ARES;CARES_STATICLIB;HAVE_ZLIB_H;%(PreprocessorDefinitions) true MultiThreadedDLL $(OutDir)libcurl.pch Level3 false true Default _DEBUG;%(PreprocessorDefinitions) 0x0409 ws2_32.lib;winmm.lib;Advapi32.lib;wldap32.lib;ares.lib;%(AdditionalDependencies) $(OutDir)$(ProjectName).dll ./ares_$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) false MachineX64 mkdir ..\..\bin_$(Platform) copy $(OutDir)*.dll ..\..\bin_$(Platform)\ {417cb8f4-5ae3-45ac-b903-83db1556303c} false bzflag-2.4.2+ds1/MSVC/build/makeHTML.bat000066400000000000000000000004241200563112200174000ustar00rootroot00000000000000..\..\man\man2html.exe < ..\..\man\bzw.5.in > ..\..\man\bzw.html ..\..\man\man2html.exe < ..\..\man\bzflag.6.in > ..\..\man\bzflag.html ..\..\man\man2html.exe < ..\..\man\bzadmin.6.in > ..\..\man\bzadmin.html ..\..\man\man2html.exe < ..\..\man\bzfs.6.in > ..\..\man\bzfs.html bzflag-2.4.2+ds1/MSVC/build/makehtml.vcxproj000066400000000000000000000305031200563112200205260ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {91198429-3669-4C40-A294-B8593D7C4987} makehtml MakeFileProj Utility false Utility false Utility false Utility false <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false true true building HTML copy $(SolutionDir)man2html_$(Platform)_$(Configuration)\*.exe ..\..\man\ call "$(ProjectDir)makeHTML.bat" $(OutDir)makehtml.tlb Copying HTML to Docs Dir mkdir $(SolutionDir)..\..\bin_$(Platform) mkdir $(SolutionDir)..\..\bin_$(Platform)\docs copy $(SolutionDir)..\..\man\*.html $(SolutionDir)..\..\bin_$(Platform)\docs\ building HTML copy $(SolutionDir)man2html_$(Platform)_$(Configuration)\*.exe ..\..\man\ call "$(ProjectDir)makeHTML.bat" X64 $(OutDir)makehtml.tlb Copying HTML to Docs Dir mkdir $(SolutionDir)..\..\bin_$(Platform) mkdir $(SolutionDir)..\..\bin_$(Platform)\docs copy $(SolutionDir)..\..\man\*.html $(SolutionDir)..\..\bin_$(Platform)\docs\ building HTML copy $(SolutionDir)man2html_$(Platform)_$(Configuration)\*.exe ..\..\man\ call "$(ProjectDir)makeHTML.bat" $(OutDir)makehtml.tlb Copying HTML to Docs Dir mkdir $(SolutionDir)..\..\bin_$(Platform) mkdir $(SolutionDir)..\..\bin_$(Platform)\docs copy $(SolutionDir)..\..\man\*.html $(SolutionDir)..\..\bin_$(Platform)\docs\ building HTML copy $(SolutionDir)man2html_$(Platform)_$(Configuration)\*.exe ..\..\man\ call "$(ProjectDir)makeHTML.bat" X64 $(OutDir)makehtml.tlb Copying HTML to Docs Dir mkdir $(SolutionDir)..\..\bin_$(Platform) mkdir $(SolutionDir)..\..\bin_$(Platform)\docs copy $(SolutionDir)..\..\man\*.html $(SolutionDir)..\..\bin_$(Platform)\docs\ %(RootDir)%(Directory)bzadmin.html;%(Outputs) %(RootDir)%(Directory)bzadmin.html;%(Outputs) %(RootDir)%(Directory)bzadmin.html;%(Outputs) %(RootDir)%(Directory)bzadmin.html;%(Outputs) Document %(RootDir)%(Directory)$bzflag.html;%(Outputs) %(RootDir)%(Directory)$bzflag.html;%(Outputs) %(RootDir)%(Directory)$bzflag.html;%(Outputs) %(RootDir)%(Directory)$bzflag.html;%(Outputs) Document %(RootDir)%(Directory)bzfs.html;%(Outputs) %(RootDir)%(Directory)bzfs.html;%(Outputs) %(RootDir)%(Directory)bzfs.html;%(Outputs) %(RootDir)%(Directory)bzfs.html;%(Outputs) Document %(RootDir)%(Directory)bzw.html;%(Outputs) %(RootDir)%(Directory)%(Filename).html %(RootDir)%(Directory)bzw.html;%(Outputs) %(RootDir)%(Directory)bzw.html;%(Outputs) %(RootDir)%(Directory)bzw.html;%(Outputs) Document {23dc26a8-35c0-4775-a2d6-e2092dab9bfa} false bzflag-2.4.2+ds1/MSVC/build/man2html.vcxproj000066400000000000000000000302731200563112200204520ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {23DC26A8-35C0-4775-A2D6-E2092DAB9BFA} Application false MultiByte Application false MultiByte Application false MultiByte Application false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ true $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ true ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ false $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ false $(OutDir)man2html.tlb Disabled WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug $(OutDir)man2html.pch $(OutDir) $(OutDir) $(OutDir) Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)man2html.exe true true $(OutDir)man2html.pdb Console false MachineX86 X64 $(OutDir)man2html.tlb Disabled WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebug $(OutDir)man2html.pch $(OutDir) $(OutDir) $(OutDir) Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)man2html.exe true true $(OutDir)man2html.pdb Console false MachineX64 $(OutDir)man2html.tlb MaxSpeed OnlyExplicitInline WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreaded true $(OutDir)man2html.pch $(OutDir) $(OutDir) $(OutDir) Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)man2html.exe true $(OutDir)man2html.pdb Console false MachineX86 X64 $(OutDir)man2html.tlb MaxSpeed OnlyExplicitInline WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreaded true $(OutDir)man2html.pch $(OutDir) $(OutDir) $(OutDir) Level3 true NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)man2html.exe true $(OutDir)man2html.pdb Console false MachineX64 bzflag-2.4.2+ds1/MSVC/build/mediafile.vcxproj000066400000000000000000000462251200563112200206530ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {83AD1F75-22FD-477B-BB89-352F47286009} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ MaxSpeed OnlyExplicitInline ..\..\include;..\..\MSVC;.\;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)mediafile.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)mediafile.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\MSVC;.\;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)mediafile.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)mediafile.lib true Disabled false ..\..\include;..\..\MSVC;.\;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)mediafile.pch $(OutDir) $(OutDir) $(OutDir) Level3 true true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)mediafile.lib true X64 Disabled false ..\..\include;..\..\MSVC;.\;../../src/other/zlib/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)mediafile.pch $(OutDir) $(OutDir) $(OutDir) Level3 true true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)mediafile.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) {57138f88-a81f-4ffb-8bdd-58db1a1473f5} false {cc93828f-7156-4021-9c77-9951fc187e83} false bzflag-2.4.2+ds1/MSVC/build/net.vcxproj000066400000000000000000000514561200563112200175240ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {7B2595ED-CCB8-4D19-87F2-9A52C7F26EF8} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)net.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)net.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)net.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)net.lib true X64 Disabled false ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)net.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)net.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)net.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)net.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) {417cb8f4-5ae3-45ac-b903-83db1556303c} false bzflag-2.4.2+ds1/MSVC/build/obstacle.vcxproj000066400000000000000000000630621200563112200205260ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {91C01688-CEB5-4CF3-B13D-6EF86D630523} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)obstacle.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)obstacle.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)obstacle.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)obstacle.lib true Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)obstacle.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)obstacle.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)obstacle.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)obstacle.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/ogl.vcxproj000066400000000000000000000514211200563112200175070ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {E5030DD4-164D-4DB0-A593-FA1C76F1F2D7} ogl StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;GLEW_STATIC;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)ogl.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)ogl.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;GLEW_STATIC;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)ogl.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)ogl.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;GLEW_STATIC;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)ogl.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)ogl.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;GLEW_STATIC;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)ogl.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)ogl.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/pdcurses.vcxproj000066400000000000000000000310571200563112200205610ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {948A0A16-9121-4CC5-828C-DC3417510068} pdcurses Win32Proj StaticLibrary MultiByte true StaticLibrary MultiByte StaticLibrary MultiByte true StaticLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled ../../src/other/PDCurses;../../src/other/PDCurses/win32;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;PDCURSES_EXPORTS;PDC_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;CURSES_LIBRARY;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase X64 Disabled ../../src/other/PDCurses;../../src/other/PDCurses/win32;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;PDCURSES_EXPORTS;PDC_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase MachineX64 MaxSpeed true ../../src/other/PDCurses;../../src/other/PDCurses/win32;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;PDCURSES_EXPORTS;PDC_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase X64 MaxSpeed true ../../src/other/PDCurses;../../src/other/PDCurses/win32;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;PDCURSES_EXPORTS;PDC_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 ProgramDatabase MachineX64 bzflag-2.4.2+ds1/MSVC/build/platform.vcxproj000066400000000000000000001131411200563112200205500ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {12408598-00B6-487F-8F99-61B1300A15AF} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)platform.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)platform.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)platform.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)platform.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)platform.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)platform.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)platform.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)platform.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) true true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) true true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/regex.vcxproj000066400000000000000000000220351200563112200200370ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E} regex Win32Proj StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ./;../;../../src/other/regex;../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL true Level3 false EditAndContinue $(OutDir)regex.lib ./;../;../../src/other/regex;../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)regex.lib X64 Disabled false ./;../;../../src/other/regex;../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL true Level3 false ProgramDatabase $(OutDir)regex.lib X64 ./;../;../../src/other/regex;../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)regex.lib bzflag-2.4.2+ds1/MSVC/build/scene.vcxproj000066400000000000000000000422731200563112200200300ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1BAED535-4AEF-4041-9CB5-A7DC9C14E105} StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)scene.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)scene.lib true X64 Disabled false ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)scene.pch $(OutDir) $(OutDir) $(OutDir) Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)scene.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)scene.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)scene.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;../../src/other/glew/include/;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)scene.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)scene.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/build/zlib.vcproj000066400000000000000000000472161200563112200175050ustar00rootroot00000000000000 bzflag-2.4.2+ds1/MSVC/build/zlib.vcxproj000066400000000000000000000756371200563112200177050ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {CC93828F-7156-4021-9C77-9951FC187E83} zlib StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte StaticLibrary false MultiByte <_ProjectFileVersion>10.0.40219.1 ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ ./$(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ $(ProjectName)_$(Platform)_$(Configuration)\ Disabled false ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)zlib.pch $(OutDir) $(OutDir) $(OutDir) true Level3 false true EditAndContinue Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)zlib.lib true MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)zlib.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)zlib.lib true X64 Disabled false ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL $(OutDir)zlib.pch $(OutDir) $(OutDir) $(OutDir) true Level3 false true ProgramDatabase Default _DEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)zlib.lib true X64 MaxSpeed OnlyExplicitInline ..\..\include;..\..\win32;.\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDLL true $(OutDir)zlib.pch $(OutDir) $(OutDir) $(OutDir) Level3 true Default NDEBUG;%(PreprocessorDefinitions) 0x0409 $(OutDir)zlib.lib true Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks Disabled %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) EnableFastChecks MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) MaxSpeed %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) bzflag-2.4.2+ds1/MSVC/bzflag.ico000066400000000000000000000111461200563112200161530ustar00rootroot00000000000000(Fhn   ( xţccc( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&ţccc( @pwwwpwppppppppppwpppwpppwpppwpppwpppwwppwwppwwwpppppppppwwww( @ʦkH%zbJs2PkHs%WUI=1%sPkkHH%%sPDZksHW%UI=1%sPԎkH%zbJs2PkH%ssPPkH%zbsJP2kHs%WUI=1s%PkkHH%%sPDZksHW%UI=1s%PԎkH%ܒzbsJP2kH%ssPPkH%zbJs2PksHW%UI=1%sPkkHH%%sPkHs%WUI=1s%PkH%ܒzbsJP2kH%ssPPzzznnnbbbVVVJJJ>>>222&&&/...---!,,  ///...---!,,,  ,////--!!,, ,,,////---!!,,,, ,,,,00//..-!!,,,,,,,!000/..,,,!!!0000/,!!!-0000/..."-----!!!!--0000/.------0000//------0000//------11000/"-----11100/."---"111.....""".1.....-.....!""""---/...,,,-----!!!!!,.,,,,----!!,,,,,,,!!!!,,,, ,,,,,,,  bzflag-2.4.2+ds1/MSVC/bzflag.rc000066400000000000000000000041361200563112200160060ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" ///////////////////////////////////////////////////////////////////////////// // English (United States) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_BZICON ICON "bzflag.ico" #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,4,1,0 PRODUCTVERSION 2,4,1,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x0L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Tim Riker" VALUE "FileDescription", "The BZFlag Client" VALUE "FileVersion", "2.4.2.0" VALUE "InternalName", "bzflag.rc" VALUE "LegalCopyright", "Copyright Tim Riker (C) 2012" VALUE "OriginalFilename", "bzflag.rc" VALUE "ProductName", "BZFlag" VALUE "ProductVersion", "2.4.2.0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED bzflag-2.4.2+ds1/MSVC/resource.h000066400000000000000000002070461200563112200162200ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by bzflag.rc // #define SW_HIDE 0 #define HIDE_WINDOW 0 #define WM_NULL 0x0000 #define WA_INACTIVE 0 #define HTNOWHERE 0 #define SMTO_NORMAL 0x0000 #define ICON_SMALL 0 #define SIZE_RESTORED 0 #define BN_CLICKED 0 #define BST_UNCHECKED 0x0000 #define HDS_HORZ 0x0000 #define TBSTYLE_BUTTON 0x0000 #define TBS_HORZ 0x0000 #define TBS_BOTTOM 0x0000 #define TBS_RIGHT 0x0000 #define LVS_ICON 0x0000 #define LVS_ALIGNTOP 0x0000 #define TCS_TABS 0x0000 #define TCS_SINGLELINE 0x0000 #define TCS_RIGHTJUSTIFY 0x0000 #define DTS_SHORTDATEFORMAT 0x0000 #define PGS_VERT 0x00000000 #define LANG_NEUTRAL 0x00 #define SUBLANG_NEUTRAL 0x00 #define SORT_DEFAULT 0x0 #define SORT_JAPANESE_XJIS 0x0 #define SORT_CHINESE_BIG5 0x0 #define SORT_CHINESE_PRCP 0x0 #define SORT_KOREAN_KSC 0x0 #define SORT_HUNGARIAN_DEFAULT 0x0 #define SORT_GEORGIAN_TRADITIONAL 0x0 #define _USE_DECLSPECS_FOR_SAL 0 #define _USE_ATTRIBUTES_FOR_SAL 0 #define __drv_typeConst 0 #define PSAPI_VERSION 1 #define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 #define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1 #define SW_SHOWNORMAL 1 #define SW_NORMAL 1 #define SHOW_OPENWINDOW 1 #define SW_PARENTCLOSING 1 #define VK_LBUTTON 0x01 #define WM_CREATE 0x0001 #define WA_ACTIVE 1 #define PWR_OK 1 #define PWR_SUSPENDREQUEST 1 #define NFR_ANSI 1 #define UIS_SET 1 #define UISF_HIDEFOCUS 0x1 #define XBUTTON1 0x0001 #define WMSZ_LEFT 1 #define HTCLIENT 1 #define SMTO_BLOCK 0x0001 #define MA_ACTIVATE 1 #define ICON_BIG 1 #define SIZE_MINIMIZED 1 #define MK_LBUTTON 0x0001 #define TME_HOVER 0x00000001 #define CS_VREDRAW 0x0001 #define CF_TEXT 1 #define SCF_ISSECURE 0x00000001 #define IDOK 1 #define BN_PAINT 1 #define BST_CHECKED 0x0001 #define TBSTYLE_SEP 0x0001 #define TTS_ALWAYSTIP 0x01 #define TBS_AUTOTICKS 0x0001 #define UDS_WRAP 0x0001 #define PBS_SMOOTH 0x01 #define LWS_TRANSPARENT 0x0001 #define LVS_REPORT 0x0001 #define TVS_HASBUTTONS 0x0001 #define TCS_SCROLLOPPOSITE 0x0001 #define ACS_CENTER 0x0001 #define MCS_DAYSTATE 0x0001 #define DTS_UPDOWN 0x0001 #define PGS_HORZ 0x00000001 #define NFS_EDIT 0x0001 #define BCSIF_GLYPH 0x0001 #define BCSS_NOSPLIT 0x0001 #define LANG_ARABIC 0x01 #define SUBLANG_DEFAULT 0x01 #define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 #define SUBLANG_ALBANIAN_ALBANIA 0x01 #define SUBLANG_ALSATIAN_FRANCE 0x01 #define SUBLANG_AMHARIC_ETHIOPIA 0x01 #define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 #define SUBLANG_ARMENIAN_ARMENIA 0x01 #define SUBLANG_ASSAMESE_INDIA 0x01 #define SUBLANG_AZERI_LATIN 0x01 #define SUBLANG_BASHKIR_RUSSIA 0x01 #define SUBLANG_BASQUE_BASQUE 0x01 #define SUBLANG_BELARUSIAN_BELARUS 0x01 #define SUBLANG_BENGALI_INDIA 0x01 #define SUBLANG_BRETON_FRANCE 0x01 #define SUBLANG_BULGARIAN_BULGARIA 0x01 #define SUBLANG_CATALAN_CATALAN 0x01 #define SUBLANG_CHINESE_TRADITIONAL 0x01 #define SUBLANG_CORSICAN_FRANCE 0x01 #define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 #define SUBLANG_CROATIAN_CROATIA 0x01 #define SUBLANG_DANISH_DENMARK 0x01 #define SUBLANG_DARI_AFGHANISTAN 0x01 #define SUBLANG_DIVEHI_MALDIVES 0x01 #define SUBLANG_DUTCH 0x01 #define SUBLANG_ENGLISH_US 0x01 #define SUBLANG_ESTONIAN_ESTONIA 0x01 #define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 #define SUBLANG_FILIPINO_PHILIPPINES 0x01 #define SUBLANG_FINNISH_FINLAND 0x01 #define SUBLANG_FRENCH 0x01 #define SUBLANG_FRISIAN_NETHERLANDS 0x01 #define SUBLANG_GALICIAN_GALICIAN 0x01 #define SUBLANG_GEORGIAN_GEORGIA 0x01 #define SUBLANG_GERMAN 0x01 #define SUBLANG_GREEK_GREECE 0x01 #define SUBLANG_GREENLANDIC_GREENLAND 0x01 #define SUBLANG_GUJARATI_INDIA 0x01 #define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 #define SUBLANG_HEBREW_ISRAEL 0x01 #define SUBLANG_HINDI_INDIA 0x01 #define SUBLANG_HUNGARIAN_HUNGARY 0x01 #define SUBLANG_ICELANDIC_ICELAND 0x01 #define SUBLANG_IGBO_NIGERIA 0x01 #define SUBLANG_INDONESIAN_INDONESIA 0x01 #define SUBLANG_INUKTITUT_CANADA 0x01 #define SUBLANG_ITALIAN 0x01 #define SUBLANG_JAPANESE_JAPAN 0x01 #define SUBLANG_KANNADA_INDIA 0x01 #define SUBLANG_KAZAK_KAZAKHSTAN 0x01 #define SUBLANG_KHMER_CAMBODIA 0x01 #define SUBLANG_KICHE_GUATEMALA 0x01 #define SUBLANG_KINYARWANDA_RWANDA 0x01 #define SUBLANG_KONKANI_INDIA 0x01 #define SUBLANG_KOREAN 0x01 #define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 #define SUBLANG_LAO_LAO 0x01 #define SUBLANG_LATVIAN_LATVIA 0x01 #define SUBLANG_LITHUANIAN 0x01 #define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 #define SUBLANG_MACEDONIAN_MACEDONIA 0x01 #define SUBLANG_MALAY_MALAYSIA 0x01 #define SUBLANG_MALAYALAM_INDIA 0x01 #define SUBLANG_MALTESE_MALTA 0x01 #define SUBLANG_MAORI_NEW_ZEALAND 0x01 #define SUBLANG_MAPUDUNGUN_CHILE 0x01 #define SUBLANG_MARATHI_INDIA 0x01 #define SUBLANG_MOHAWK_MOHAWK 0x01 #define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 #define SUBLANG_NEPALI_NEPAL 0x01 #define SUBLANG_NORWEGIAN_BOKMAL 0x01 #define SUBLANG_OCCITAN_FRANCE 0x01 #define SUBLANG_ORIYA_INDIA 0x01 #define SUBLANG_PASHTO_AFGHANISTAN 0x01 #define SUBLANG_PERSIAN_IRAN 0x01 #define SUBLANG_POLISH_POLAND 0x01 #define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 #define SUBLANG_PUNJABI_INDIA 0x01 #define SUBLANG_QUECHUA_BOLIVIA 0x01 #define SUBLANG_ROMANIAN_ROMANIA 0x01 #define SUBLANG_ROMANSH_SWITZERLAND 0x01 #define SUBLANG_RUSSIAN_RUSSIA 0x01 #define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 #define SUBLANG_SANSKRIT_INDIA 0x01 #define SUBLANG_SCOTTISH_GAELIC 0x01 #define SUBLANG_SERBIAN_CROATIA 0x01 #define SUBLANG_SINDHI_INDIA 0x01 #define SUBLANG_SINHALESE_SRI_LANKA 0x01 #define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 #define SUBLANG_SLOVAK_SLOVAKIA 0x01 #define SUBLANG_SLOVENIAN_SLOVENIA 0x01 #define SUBLANG_SPANISH 0x01 #define SUBLANG_SWAHILI_KENYA 0x01 #define SUBLANG_SWEDISH 0x01 #define SUBLANG_SYRIAC_SYRIA 0x01 #define SUBLANG_TAJIK_TAJIKISTAN 0x01 #define SUBLANG_TAMIL_INDIA 0x01 #define SUBLANG_TATAR_RUSSIA 0x01 #define SUBLANG_TELUGU_INDIA 0x01 #define SUBLANG_THAI_THAILAND 0x01 #define SUBLANG_TIBETAN_PRC 0x01 #define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 #define SUBLANG_TURKISH_TURKEY 0x01 #define SUBLANG_TURKMEN_TURKMENISTAN 0x01 #define SUBLANG_UIGHUR_PRC 0x01 #define SUBLANG_UKRAINIAN_UKRAINE 0x01 #define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 #define SUBLANG_URDU_PAKISTAN 0x01 #define SUBLANG_UZBEK_LATIN 0x01 #define SUBLANG_VIETNAMESE_VIETNAM 0x01 #define SUBLANG_WELSH_UNITED_KINGDOM 0x01 #define SUBLANG_WOLOF_SENEGAL 0x01 #define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 #define SUBLANG_YAKUT_RUSSIA 0x01 #define SUBLANG_YI_PRC 0x01 #define SUBLANG_YORUBA_NIGERIA 0x01 #define SUBLANG_ZULU_SOUTH_AFRICA 0x01 #define SORT_INVARIANT_MATH 0x1 #define SORT_JAPANESE_UNICODE 0x1 #define SORT_CHINESE_UNICODE 0x1 #define SORT_KOREAN_UNICODE 0x1 #define SORT_GERMAN_PHONE_BOOK 0x1 #define SORT_HUNGARIAN_TECHNICAL 0x1 #define SORT_GEORGIAN_MODERN 0x1 #define __drv_typeCond 1 #define VS_VERSION_INFO 1 #define VFFF_ISSHAREDFILE 0x0001 #define VFF_CURNEDEST 0x0001 #define VIFF_FORCEINSTALL 0x0001 #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 #define SW_SHOWMINIMIZED 2 #define SHOW_ICONWINDOW 2 #define SW_OTHERZOOM 2 #define VK_RBUTTON 0x02 #define WM_DESTROY 0x0002 #define WA_CLICKACTIVE 2 #define PWR_SUSPENDRESUME 2 #define NFR_UNICODE 2 #define UIS_CLEAR 2 #define UISF_HIDEACCEL 0x2 #define XBUTTON2 0x0002 #define WMSZ_RIGHT 2 #define HTCAPTION 2 #define SMTO_ABORTIFHUNG 0x0002 #define MA_ACTIVATEANDEAT 2 #define ICON_SMALL2 2 #define SIZE_MAXIMIZED 2 #define MK_RBUTTON 0x0002 #define TME_LEAVE 0x00000002 #define CS_HREDRAW 0x0002 #define CF_BITMAP 2 #define IDCANCEL 2 #define BN_HILITE 2 #define BST_INDETERMINATE 0x0002 #define HDS_BUTTONS 0x0002 #define TBSTYLE_CHECK 0x0002 #define TTS_NOPREFIX 0x02 #define TBS_VERT 0x0002 #define UDS_SETBUDDYINT 0x0002 #define LWS_IGNORERETURN 0x0002 #define LVS_SMALLICON 0x0002 #define TVS_HASLINES 0x0002 #define TVS_EX_MULTISELECT 0x0002 #define TCS_BOTTOM 0x0002 #define TCS_RIGHT 0x0002 #define ACS_TRANSPARENT 0x0002 #define MCS_MULTISELECT 0x0002 #define DTS_SHOWNONE 0x0002 #define PGS_AUTOSCROLL 0x00000002 #define NFS_STATIC 0x0002 #define BCSIF_IMAGE 0x0002 #define BCSS_STRETCH 0x0002 #define LANG_BULGARIAN 0x02 #define SUBLANG_SYS_DEFAULT 0x02 #define SUBLANG_ARABIC_IRAQ 0x02 #define SUBLANG_AZERI_CYRILLIC 0x02 #define SUBLANG_BENGALI_BANGLADESH 0x02 #define SUBLANG_CHINESE_SIMPLIFIED 0x02 #define SUBLANG_DUTCH_BELGIAN 0x02 #define SUBLANG_ENGLISH_UK 0x02 #define SUBLANG_FRENCH_BELGIAN 0x02 #define SUBLANG_GERMAN_SWISS 0x02 #define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 #define SUBLANG_IRISH_IRELAND 0x02 #define SUBLANG_ITALIAN_SWISS 0x02 #define SUBLANG_KASHMIRI_SASIA 0x02 #define SUBLANG_KASHMIRI_INDIA 0x02 #define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 #define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 #define SUBLANG_MONGOLIAN_PRC 0x02 #define SUBLANG_NEPALI_INDIA 0x02 #define SUBLANG_NORWEGIAN_NYNORSK 0x02 #define SUBLANG_PORTUGUESE 0x02 #define SUBLANG_QUECHUA_ECUADOR 0x02 #define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 #define SUBLANG_SERBIAN_LATIN 0x02 #define SUBLANG_SINDHI_PAKISTAN 0x02 #define SUBLANG_SINDHI_AFGHANISTAN 0x02 #define SUBLANG_SPANISH_MEXICAN 0x02 #define SUBLANG_SWEDISH_FINLAND 0x02 #define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 #define SUBLANG_TIGRIGNA_ERITREA 0x02 #define SUBLANG_URDU_INDIA 0x02 #define SUBLANG_UZBEK_CYRILLIC 0x02 #define SORT_CHINESE_PRC 0x2 #define __drv_typeBitset 2 #define VFF_FILEINUSE 0x0002 #define VIFF_DONTDELETEOLD 0x0002 #define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 #define SW_SHOWMAXIMIZED 3 #define SW_MAXIMIZE 3 #define SHOW_FULLSCREEN 3 #define SW_PARENTOPENING 3 #define VK_CANCEL 0x03 #define WM_MOVE 0x0003 #define PWR_CRITICALRESUME 3 #define NF_QUERY 3 #define UIS_INITIALIZE 3 #define WMSZ_TOP 3 #define HTSYSMENU 3 #define MA_NOACTIVATE 3 #define SIZE_MAXSHOW 3 #define CF_METAFILEPICT 3 #define IDABORT 3 #define BN_UNHILITE 3 #define LVS_LIST 0x0003 #define LVS_TYPEMASK 0x0003 #define LANG_CATALAN 0x03 #define SUBLANG_CUSTOM_DEFAULT 0x03 #define SUBLANG_ARABIC_EGYPT 0x03 #define SUBLANG_CHINESE_HONGKONG 0x03 #define SUBLANG_ENGLISH_AUS 0x03 #define SUBLANG_FRENCH_CANADIAN 0x03 #define SUBLANG_GERMAN_AUSTRIAN 0x03 #define SUBLANG_QUECHUA_PERU 0x03 #define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 #define SUBLANG_SERBIAN_CYRILLIC 0x03 #define SUBLANG_SPANISH_MODERN 0x03 #define SORT_CHINESE_BOPOMOFO 0x3 #define __drv_typeExpr 3 #define SW_SHOWNOACTIVATE 4 #define SHOW_OPENNOACTIVATE 4 #define SW_OTHERUNZOOM 4 #define VK_MBUTTON 0x04 #define NF_REQUERY 4 #define UISF_ACTIVE 0x4 #define WMSZ_TOPLEFT 4 #define HTGROWBOX 4 #define MA_NOACTIVATEANDEAT 4 #define SIZE_MAXHIDE 4 #define MK_SHIFT 0x0004 #define CF_SYLK 4 #define IDRETRY 4 #define BN_DISABLE 4 #define BST_PUSHED 0x0004 #define HDS_HOTTRACK 0x0004 #define TBSTYLE_GROUP 0x0004 #define TBS_TOP 0x0004 #define TBS_LEFT 0x0004 #define UDS_ALIGNRIGHT 0x0004 #define PBS_VERTICAL 0x04 #define LWS_NOPREFIX 0x0004 #define LVS_SINGLESEL 0x0004 #define TVS_LINESATROOT 0x0004 #define TVS_EX_DOUBLEBUFFER 0x0004 #define TCS_MULTISELECT 0x0004 #define ACS_AUTOPLAY 0x0004 #define MCS_WEEKNUMBERS 0x0004 #define DTS_LONGDATEFORMAT 0x0004 #define PGS_DRAGNDROP 0x00000004 #define NFS_LISTCOMBO 0x0004 #define BCSIF_STYLE 0x0004 #define BCSS_ALIGNLEFT 0x0004 #define LANG_CHINESE 0x04 #define LANG_CHINESE_SIMPLIFIED 0x04 #define SUBLANG_CUSTOM_UNSPECIFIED 0x04 #define SUBLANG_ARABIC_LIBYA 0x04 #define SUBLANG_CHINESE_SINGAPORE 0x04 #define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 #define SUBLANG_ENGLISH_CAN 0x04 #define SUBLANG_FRENCH_SWISS 0x04 #define SUBLANG_GERMAN_LUXEMBOURG 0x04 #define SUBLANG_SAMI_LULE_NORWAY 0x04 #define SUBLANG_SPANISH_GUATEMALA 0x04 #define SORT_JAPANESE_RADICALSTROKE 0x4 #define SORT_CHINESE_RADICALSTROKE 0x4 #define VFF_BUFFTOOSMALL 0x0004 #define SW_SHOW 5 #define VK_XBUTTON1 0x05 #define WM_SIZE 0x0005 #define WMSZ_TOPRIGHT 5 #define HTMENU 5 #define CF_DIF 5 #define IDIGNORE 5 #define BN_DOUBLECLICKED 5 #define LANG_CZECH 0x05 #define SUBLANG_UI_CUSTOM_DEFAULT 0x05 #define SUBLANG_ARABIC_ALGERIA 0x05 #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 #define SUBLANG_CHINESE_MACAU 0x05 #define SUBLANG_ENGLISH_NZ 0x05 #define SUBLANG_FRENCH_LUXEMBOURG 0x05 #define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 #define SUBLANG_SAMI_LULE_SWEDEN 0x05 #define SUBLANG_SPANISH_COSTA_RICA 0x05 #define SW_MINIMIZE 6 #define VK_XBUTTON2 0x06 #define WM_ACTIVATE 0x0006 #define WMSZ_BOTTOM 6 #define HTHSCROLL 6 #define CF_TIFF 6 #define IDYES 6 #define BN_SETFOCUS 6 #define LANG_DANISH 0x06 #define SUBLANG_ARABIC_MOROCCO 0x06 #define SUBLANG_ENGLISH_EIRE 0x06 #define SUBLANG_FRENCH_MONACO 0x06 #define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 #define SUBLANG_SPANISH_PANAMA 0x06 #define SW_SHOWMINNOACTIVE 7 #define WM_SETFOCUS 0x0007 #define WMSZ_BOTTOMLEFT 7 #define HTVSCROLL 7 #define CF_OEMTEXT 7 #define IDNO 7 #define BN_KILLFOCUS 7 #define LANG_GERMAN 0x07 #define SUBLANG_ARABIC_TUNISIA 0x07 #define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 #define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 #define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 #define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 #define SW_SHOWNA 8 #define VK_BACK 0x08 #define WM_KILLFOCUS 0x0008 #define WMSZ_BOTTOMRIGHT 8 #define HTMINBUTTON 8 #define SMTO_NOTIMEOUTIFNOTHUNG 0x0008 #define MK_CONTROL 0x0008 #define CS_DBLCLKS 0x0008 #define CF_DIB 8 #define IDCLOSE 8 #define BST_FOCUS 0x0008 #define HDS_HIDDEN 0x0008 #define TBSTYLE_DROPDOWN 0x0008 #define TBS_BOTH 0x0008 #define UDS_ALIGNLEFT 0x0008 #define PBS_MARQUEE 0x08 #define LWS_USEVISUALSTYLE 0x0008 #define LVS_SHOWSELALWAYS 0x0008 #define TVS_EDITLABELS 0x0008 #define TVS_EX_NOINDENTSTATE 0x0008 #define TCS_FLATBUTTONS 0x0008 #define ACS_TIMER 0x0008 #define MCS_NOTODAYCIRCLE 0x0008 #define NFS_BUTTON 0x0008 #define BCSIF_SIZE 0x0008 #define BCSS_IMAGE 0x0008 #define LANG_GREEK 0x08 #define SUBLANG_ARABIC_OMAN 0x08 #define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 #define SUBLANG_ENGLISH_JAMAICA 0x08 #define SUBLANG_SAMI_SKOLT_FINLAND 0x08 #define SUBLANG_SPANISH_VENEZUELA 0x08 #define SW_RESTORE 9 #define VK_TAB 0x09 #define HTMAXBUTTON 9 #define CF_PALETTE 9 #define IDHELP 9 #define DTS_TIMEFORMAT 0x0009 #define LANG_ENGLISH 0x09 #define SUBLANG_ARABIC_YEMEN 0x09 #define SUBLANG_ENGLISH_CARIBBEAN 0x09 #define SUBLANG_SAMI_INARI_FINLAND 0x09 #define SUBLANG_SERBIAN_SERBIA_LATIN 0x09 #define SUBLANG_SPANISH_COLOMBIA 0x09 #define SW_SHOWDEFAULT 10 #define WM_ENABLE 0x000A #define HTLEFT 10 #define CF_PENDATA 10 #define IDTRYAGAIN 10 #define HELP_CONTEXTMENU 0x000a #define LANG_SPANISH 0x0a #define SUBLANG_ARABIC_SYRIA 0x0a #define SUBLANG_ENGLISH_BELIZE 0x0a #define SUBLANG_SERBIAN_SERBIA_CYRILLIC 0x0a #define SUBLANG_SPANISH_PERU 0x0a #define SW_FORCEMINIMIZE 11 #define SW_MAX 11 #define WM_SETREDRAW 0x000B #define HTRIGHT 11 #define CF_RIFF 11 #define IDCONTINUE 11 #define HELP_FINDER 0x000b #define LANG_FINNISH 0x0b #define SUBLANG_ARABIC_JORDAN 0x0b #define SUBLANG_ENGLISH_TRINIDAD 0x0b #define SUBLANG_SERBIAN_MONTENEGRO_LATIN 0x0b #define SUBLANG_SPANISH_ARGENTINA 0x0b #define VK_CLEAR 0x0C #define WM_SETTEXT 0x000C #define HTTOP 12 #define CF_WAVE 12 #define HELP_WM_HELP 0x000c #define DTS_SHORTDATECENTURYFORMAT 0x000C #define LANG_FRENCH 0x0c #define SUBLANG_ARABIC_LEBANON 0x0c #define SUBLANG_ENGLISH_ZIMBABWE 0x0c #define SUBLANG_SERBIAN_MONTENEGRO_CYRILLIC 0x0c #define SUBLANG_SPANISH_ECUADOR 0x0c #define VK_RETURN 0x0D #define WM_GETTEXT 0x000D #define HTTOPLEFT 13 #define CF_UNICODETEXT 13 #define HELP_SETPOPUP_POS 0x000d #define LANG_HEBREW 0x0d #define SUBLANG_ARABIC_KUWAIT 0x0d #define SUBLANG_ENGLISH_PHILIPPINES 0x0d #define SUBLANG_SPANISH_CHILE 0x0d #define WM_GETTEXTLENGTH 0x000E #define HTTOPRIGHT 14 #define CF_ENHMETAFILE 14 #define LANG_HUNGARIAN 0x0e #define SUBLANG_ARABIC_UAE 0x0e #define SUBLANG_SPANISH_URUGUAY 0x0e #define WM_PAINT 0x000F #define HTBOTTOM 15 #define CF_HDROP 15 #define LANG_ICELANDIC 0x0f #define SUBLANG_ARABIC_BAHRAIN 0x0f #define SUBLANG_SPANISH_PARAGUAY 0x0f #define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16 #define VK_SHIFT 0x10 #define WM_CLOSE 0x0010 #define HTBOTTOMLEFT 16 #define WVR_ALIGNTOP 0x0010 #define MK_MBUTTON 0x0010 #define TME_NONCLIENT 0x00000010 #define CF_LOCALE 16 #define HELP_TCARD_DATA 0x0010 #define TBSTYLE_AUTOSIZE 0x0010 #define TTS_NOANIMATE 0x10 #define TBS_NOTICKS 0x0010 #define UDS_AUTOBUDDY 0x0010 #define PBS_SMOOTHREVERSE 0x10 #define LWS_USECUSTOMTEXT 0x0010 #define LVS_SORTASCENDING 0x0010 #define TVS_DISABLEDRAGDROP 0x0010 #define TVS_EX_RICHTOOLTIP 0x0010 #define TCS_FORCEICONLEFT 0x0010 #define MCS_NOTODAY 0x0010 #define DTS_APPCANPARSE 0x0010 #define NFS_ALL 0x0010 #define LANG_ITALIAN 0x10 #define SUBLANG_ARABIC_QATAR 0x10 #define SUBLANG_ENGLISH_INDIA 0x10 #define SUBLANG_SPANISH_BOLIVIA 0x10 #define VK_CONTROL 0x11 #define WM_QUERYENDSESSION 0x0011 #define HTBOTTOMRIGHT 17 #define CF_DIBV5 17 #define HELP_TCARD_OTHER_CALLER 0x0011 #define LANG_JAPANESE 0x11 #define SUBLANG_ENGLISH_MALAYSIA 0x11 #define SUBLANG_SPANISH_EL_SALVADOR 0x11 #define VK_MENU 0x12 #define WM_QUIT 0x0012 #define HTBORDER 18 #define CF_MAX 18 #define LANG_KOREAN 0x12 #define SUBLANG_ENGLISH_SINGAPORE 0x12 #define SUBLANG_SPANISH_HONDURAS 0x12 #define VK_PAUSE 0x13 #define WM_QUERYOPEN 0x0013 #define HTOBJECT 19 #define LANG_DUTCH 0x13 #define SUBLANG_SPANISH_NICARAGUA 0x13 #define VK_CAPITAL 0x14 #define WM_ERASEBKGND 0x0014 #define HTCLOSE 20 #define LANG_NORWEGIAN 0x14 #define SUBLANG_SPANISH_PUERTO_RICO 0x14 #define VK_KANA 0x15 #define VK_HANGEUL 0x15 #define VK_HANGUL 0x15 #define WM_SYSCOLORCHANGE 0x0015 #define HTHELP 21 #define LANG_POLISH 0x15 #define SUBLANG_SPANISH_US 0x15 #define WM_ENDSESSION 0x0016 #define LANG_PORTUGUESE 0x16 #define VK_JUNJA 0x17 #define LANG_ROMANSH 0x17 #define RT_MANIFEST 24 #define VK_FINAL 0x18 #define WM_SHOWWINDOW 0x0018 #define LANG_ROMANIAN 0x18 #define VK_HANJA 0x19 #define VK_KANJI 0x19 #define LANG_RUSSIAN 0x19 #define WM_WININICHANGE 0x001A #define LANG_BOSNIAN 0x1a #define LANG_CROATIAN 0x1a #define LANG_SERBIAN 0x1a #define VK_ESCAPE 0x1B #define WM_DEVMODECHANGE 0x001B #define LANG_SLOVAK 0x1b #define VK_CONVERT 0x1C #define WM_ACTIVATEAPP 0x001C #define LANG_ALBANIAN 0x1c #define VK_NONCONVERT 0x1D #define WM_FONTCHANGE 0x001D #define LANG_SWEDISH 0x1d #define VK_ACCEPT 0x1E #define WM_TIMECHANGE 0x001E #define LANG_THAI 0x1e #define VK_MODECHANGE 0x1F #define WM_CANCELMODE 0x001F #define LANG_TURKISH 0x1f #define VK_SPACE 0x20 #define WM_SETCURSOR 0x0020 #define SMTO_ERRORONEXIT 0x0020 #define WVR_ALIGNLEFT 0x0020 #define MK_XBUTTON1 0x0020 #define CS_OWNDC 0x0020 #define TBSTYLE_NOPREFIX 0x0020 #define TTS_NOFADE 0x20 #define TBS_ENABLESELRANGE 0x0020 #define UDS_ARROWKEYS 0x0020 #define LWS_RIGHT 0x0020 #define LVS_SORTDESCENDING 0x0020 #define TVS_SHOWSELALWAYS 0x0020 #define TVS_EX_AUTOHSCROLL 0x0020 #define TCS_FORCELABELLEFT 0x0020 #define DTS_RIGHTALIGN 0x0020 #define NFS_USEFONTASSOC 0x0020 #define LANG_URDU 0x20 #define VK_PRIOR 0x21 #define WM_MOUSEACTIVATE 0x0021 #define LANG_INDONESIAN 0x21 #define VK_NEXT 0x22 #define WM_CHILDACTIVATE 0x0022 #define LANG_UKRAINIAN 0x22 #define VK_END 0x23 #define WM_QUEUESYNC 0x0023 #define LANG_BELARUSIAN 0x23 #define VK_HOME 0x24 #define WM_GETMINMAXINFO 0x0024 #define LANG_SLOVENIAN 0x24 #define VK_LEFT 0x25 #define LANG_ESTONIAN 0x25 #define VK_UP 0x26 #define WM_PAINTICON 0x0026 #define LANG_LATVIAN 0x26 #define VK_RIGHT 0x27 #define WM_ICONERASEBKGND 0x0027 #define LANG_LITHUANIAN 0x27 #define VK_DOWN 0x28 #define WM_NEXTDLGCTL 0x0028 #define LANG_TAJIK 0x28 #define VK_SELECT 0x29 #define LANG_FARSI 0x29 #define LANG_PERSIAN 0x29 #define VK_PRINT 0x2A #define WM_SPOOLERSTATUS 0x002A #define LANG_VIETNAMESE 0x2a #define VK_EXECUTE 0x2B #define WM_DRAWITEM 0x002B #define LANG_ARMENIAN 0x2b #define VK_SNAPSHOT 0x2C #define WM_MEASUREITEM 0x002C #define LANG_AZERI 0x2c #define VK_INSERT 0x2D #define WM_DELETEITEM 0x002D #define LANG_BASQUE 0x2d #define VK_DELETE 0x2E #define WM_VKEYTOITEM 0x002E #define LANG_LOWER_SORBIAN 0x2e #define LANG_UPPER_SORBIAN 0x2e #define VK_HELP 0x2F #define WM_CHARTOITEM 0x002F #define LANG_MACEDONIAN 0x2f #define WM_SETFONT 0x0030 #define WM_GETFONT 0x0031 #define WM_SETHOTKEY 0x0032 #define LANG_TSWANA 0x32 #define WM_GETHOTKEY 0x0033 #define LANG_XHOSA 0x34 #define LANG_ZULU 0x35 #define LANG_AFRIKAANS 0x36 #define WM_QUERYDRAGICON 0x0037 #define LANG_GEORGIAN 0x37 #define LANG_FAEROESE 0x38 #define WM_COMPAREITEM 0x0039 #define LANG_HINDI 0x39 #define LANG_MALTESE 0x3a #define LANG_SAMI 0x3b #define LANG_IRISH 0x3c #define WM_GETOBJECT 0x003D #define LANG_MALAY 0x3e #define LANG_KAZAK 0x3f #define WVR_ALIGNBOTTOM 0x0040 #define MK_XBUTTON2 0x0040 #define CS_CLASSDC 0x0040 #define HDS_DRAGDROP 0x0040 #define BTNS_SHOWTEXT 0x0040 #define TTS_BALLOON 0x40 #define TBS_FIXEDLENGTH 0x0040 #define UDS_HORZ 0x0040 #define LVS_SHAREIMAGELISTS 0x0040 #define TVS_RTLREADING 0x0040 #define TVS_EX_FADEINOUTEXPANDOS 0x0040 #define TCS_HOTTRACK 0x0040 #define MCS_NOTRAILINGDATES 0x0040 #define LANG_KYRGYZ 0x40 #define WM_COMPACTING 0x0041 #define LANG_SWAHILI 0x41 #define LANG_TURKMEN 0x42 #define LANG_UZBEK 0x43 #define WM_COMMNOTIFY 0x0044 #define LANG_TATAR 0x44 #define LANG_BENGALI 0x45 #define WM_WINDOWPOSCHANGING 0x0046 #define LANG_PUNJABI 0x46 #define WM_WINDOWPOSCHANGED 0x0047 #define LANG_GUJARATI 0x47 #define WM_POWER 0x0048 #define LANG_ORIYA 0x48 #define LANG_TAMIL 0x49 #define WM_COPYDATA 0x004A #define LANG_TELUGU 0x4a #define WM_CANCELJOURNAL 0x004B #define LANG_KANNADA 0x4b #define LANG_MALAYALAM 0x4c #define LANG_ASSAMESE 0x4d #define WM_NOTIFY 0x004E #define LANG_MARATHI 0x4e #define LANG_SANSKRIT 0x4f #define WM_INPUTLANGCHANGEREQUEST 0x0050 #define LANG_MONGOLIAN 0x50 #define WM_INPUTLANGCHANGE 0x0051 #define LANG_TIBETAN 0x51 #define WM_TCARD 0x0052 #define LANG_WELSH 0x52 #define WM_HELP 0x0053 #define LANG_KHMER 0x53 #define WM_USERCHANGED 0x0054 #define LANG_LAO 0x54 #define WM_NOTIFYFORMAT 0x0055 #define LANG_GALICIAN 0x56 #define LANG_KONKANI 0x57 #define LANG_MANIPURI 0x58 #define LANG_SINDHI 0x59 #define LANG_SYRIAC 0x5a #define VK_LWIN 0x5B #define LANG_SINHALESE 0x5b #define VK_RWIN 0x5C #define VK_APPS 0x5D #define LANG_INUKTITUT 0x5d #define LANG_AMHARIC 0x5e #define VK_SLEEP 0x5F #define LANG_TAMAZIGHT 0x5f #define VK_NUMPAD0 0x60 #define LANG_KASHMIRI 0x60 #define VK_NUMPAD1 0x61 #define LANG_NEPALI 0x61 #define VK_NUMPAD2 0x62 #define LANG_FRISIAN 0x62 #define VK_NUMPAD3 0x63 #define LANG_PASHTO 0x63 #define VK_NUMPAD4 0x64 #define LANG_FILIPINO 0x64 #define VS_USER_DEFINED 100 #define IDI_BZICON 101 #define VK_NUMPAD5 0x65 #define LANG_DIVEHI 0x65 #define VK_NUMPAD6 0x66 #define VK_NUMPAD7 0x67 #define VK_NUMPAD8 0x68 #define LANG_HAUSA 0x68 #define VK_NUMPAD9 0x69 #define VK_MULTIPLY 0x6A #define LANG_YORUBA 0x6a #define VK_ADD 0x6B #define LANG_QUECHUA 0x6b #define VK_SEPARATOR 0x6C #define LANG_SOTHO 0x6c #define VK_SUBTRACT 0x6D #define LANG_BASHKIR 0x6d #define VK_DECIMAL 0x6E #define LANG_LUXEMBOURGISH 0x6e #define VK_DIVIDE 0x6F #define LANG_GREENLANDIC 0x6f #define VK_F1 0x70 #define LANG_IGBO 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define LANG_TIGRIGNA 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76 #define VK_F8 0x77 #define VK_F9 0x78 #define WHEEL_DELTA 120 #define LANG_YI 0x78 #define VK_F10 0x79 #define VK_F11 0x7A #define LANG_MAPUDUNGUN 0x7a #define VK_F12 0x7B #define WM_CONTEXTMENU 0x007B #define VK_F13 0x7C #define WM_STYLECHANGING 0x007C #define LANG_MOHAWK 0x7c #define VK_F14 0x7D #define WM_STYLECHANGED 0x007D #define VK_F15 0x7E #define WM_DISPLAYCHANGE 0x007E #define LANG_BRETON 0x7e #define VK_F16 0x7F #define WM_GETICON 0x007F #define LANG_INVARIANT 0x7f #define VK_F17 0x80 #define WM_SETICON 0x0080 #define WVR_ALIGNRIGHT 0x0080 #define CS_PARENTDC 0x0080 #define CF_OWNERDISPLAY 0x0080 #define HDS_FULLDRAG 0x0080 #define BTNS_WHOLEDROPDOWN 0x0080 #define TTS_CLOSE 0x80 #define TBS_NOTHUMB 0x0080 #define UDS_NOTHOUSANDS 0x0080 #define LVS_NOLABELWRAP 0x0080 #define TVS_NOTOOLTIPS 0x0080 #define TVS_EX_PARTIALCHECKBOXES 0x0080 #define TCS_VERTICAL 0x0080 #define MCS_SHORTDAYSOFWEEK 0x0080 #define LANG_UIGHUR 0x80 #define VK_F18 0x81 #define WM_NCCREATE 0x0081 #define CF_DSPTEXT 0x0081 #define LANG_MAORI 0x81 #define VK_F19 0x82 #define WM_NCDESTROY 0x0082 #define CF_DSPBITMAP 0x0082 #define LANG_OCCITAN 0x82 #define VK_F20 0x83 #define WM_NCCALCSIZE 0x0083 #define CF_DSPMETAFILEPICT 0x0083 #define LANG_CORSICAN 0x83 #define VK_F21 0x84 #define WM_NCHITTEST 0x0084 #define LANG_ALSATIAN 0x84 #define VK_F22 0x85 #define WM_NCPAINT 0x0085 #define LANG_YAKUT 0x85 #define VK_F23 0x86 #define WM_NCACTIVATE 0x0086 #define LANG_KICHE 0x86 #define VK_F24 0x87 #define WM_GETDLGCODE 0x0087 #define LANG_KINYARWANDA 0x87 #define WM_SYNCPAINT 0x0088 #define LANG_WOLOF 0x88 #define LANG_DARI 0x8c #define CF_DSPENHMETAFILE 0x008E #define VK_NUMLOCK 0x90 #define VK_SCROLL 0x91 #define LANG_SCOTTISH_GAELIC 0x91 #define VK_OEM_NEC_EQUAL 0x92 #define VK_OEM_FJ_JISHO 0x92 #define VK_OEM_FJ_MASSHOU 0x93 #define VK_OEM_FJ_TOUROKU 0x94 #define VK_OEM_FJ_LOYA 0x95 #define VK_OEM_FJ_ROYA 0x96 #define VK_LSHIFT 0xA0 #define WM_NCMOUSEMOVE 0x00A0 #define VK_RSHIFT 0xA1 #define WM_NCLBUTTONDOWN 0x00A1 #define VK_LCONTROL 0xA2 #define WM_NCLBUTTONUP 0x00A2 #define VK_RCONTROL 0xA3 #define WM_NCLBUTTONDBLCLK 0x00A3 #define VK_LMENU 0xA4 #define WM_NCRBUTTONDOWN 0x00A4 #define VK_RMENU 0xA5 #define WM_NCRBUTTONUP 0x00A5 #define VK_BROWSER_BACK 0xA6 #define WM_NCRBUTTONDBLCLK 0x00A6 #define VK_BROWSER_FORWARD 0xA7 #define WM_NCMBUTTONDOWN 0x00A7 #define VK_BROWSER_REFRESH 0xA8 #define WM_NCMBUTTONUP 0x00A8 #define VK_BROWSER_STOP 0xA9 #define WM_NCMBUTTONDBLCLK 0x00A9 #define VK_BROWSER_SEARCH 0xAA #define VK_BROWSER_FAVORITES 0xAB #define WM_NCXBUTTONDOWN 0x00AB #define VK_BROWSER_HOME 0xAC #define WM_NCXBUTTONUP 0x00AC #define VK_VOLUME_MUTE 0xAD #define WM_NCXBUTTONDBLCLK 0x00AD #define VK_VOLUME_DOWN 0xAE #define VK_VOLUME_UP 0xAF #define VK_MEDIA_NEXT_TRACK 0xB0 #define EM_GETSEL 0x00B0 #define VK_MEDIA_PREV_TRACK 0xB1 #define EM_SETSEL 0x00B1 #define VK_MEDIA_STOP 0xB2 #define EM_GETRECT 0x00B2 #define VK_MEDIA_PLAY_PAUSE 0xB3 #define EM_SETRECT 0x00B3 #define VK_LAUNCH_MAIL 0xB4 #define EM_SETRECTNP 0x00B4 #define VK_LAUNCH_MEDIA_SELECT 0xB5 #define EM_SCROLL 0x00B5 #define VK_LAUNCH_APP1 0xB6 #define EM_LINESCROLL 0x00B6 #define VK_LAUNCH_APP2 0xB7 #define EM_SCROLLCARET 0x00B7 #define EM_GETMODIFY 0x00B8 #define EM_SETMODIFY 0x00B9 #define VK_OEM_1 0xBA #define EM_GETLINECOUNT 0x00BA #define VK_OEM_PLUS 0xBB #define EM_LINEINDEX 0x00BB #define VK_OEM_COMMA 0xBC #define EM_SETHANDLE 0x00BC #define VK_OEM_MINUS 0xBD #define EM_GETHANDLE 0x00BD #define VK_OEM_PERIOD 0xBE #define EM_GETTHUMB 0x00BE #define VK_OEM_2 0xBF #define VK_OEM_3 0xC0 #define EM_LINELENGTH 0x00C1 #define EM_REPLACESEL 0x00C2 #define EM_GETLINE 0x00C4 #define EM_LIMITTEXT 0x00C5 #define EM_CANUNDO 0x00C6 #define EM_UNDO 0x00C7 #define EM_FMTLINES 0x00C8 #define EM_LINEFROMCHAR 0x00C9 #define EM_SETTABSTOPS 0x00CB #define EM_SETPASSWORDCHAR 0x00CC #define EM_EMPTYUNDOBUFFER 0x00CD #define EM_GETFIRSTVISIBLELINE 0x00CE #define EM_SETREADONLY 0x00CF #define EM_SETWORDBREAKPROC 0x00D0 #define EM_GETWORDBREAKPROC 0x00D1 #define EM_GETPASSWORDCHAR 0x00D2 #define EM_SETMARGINS 0x00D3 #define EM_GETMARGINS 0x00D4 #define EM_GETLIMITTEXT 0x00D5 #define EM_POSFROMCHAR 0x00D6 #define EM_CHARFROMPOS 0x00D7 #define EM_SETIMESTATUS 0x00D8 #define EM_GETIMESTATUS 0x00D9 #define VK_OEM_4 0xDB #define VK_OEM_5 0xDC #define VK_OEM_6 0xDD #define VK_OEM_7 0xDE #define VK_OEM_8 0xDF #define VK_OEM_AX 0xE1 #define VK_OEM_102 0xE2 #define VK_ICO_HELP 0xE3 #define VK_ICO_00 0xE4 #define VK_PROCESSKEY 0xE5 #define VK_ICO_CLEAR 0xE6 #define VK_PACKET 0xE7 #define VK_OEM_RESET 0xE9 #define VK_OEM_JUMP 0xEA #define VK_OEM_PA1 0xEB #define VK_OEM_PA2 0xEC #define VK_OEM_PA3 0xED #define VK_OEM_WSCTRL 0xEE #define VK_OEM_CUSEL 0xEF #define VK_OEM_ATTN 0xF0 #define BM_GETCHECK 0x00F0 #define VK_OEM_FINISH 0xF1 #define BM_SETCHECK 0x00F1 #define VK_OEM_COPY 0xF2 #define BM_GETSTATE 0x00F2 #define VK_OEM_AUTO 0xF3 #define BM_SETSTATE 0x00F3 #define VK_OEM_ENLW 0xF4 #define BM_SETSTYLE 0x00F4 #define VK_OEM_BACKTAB 0xF5 #define BM_CLICK 0x00F5 #define VK_ATTN 0xF6 #define BM_GETIMAGE 0x00F6 #define VK_CRSEL 0xF7 #define BM_SETIMAGE 0x00F7 #define VK_EXSEL 0xF8 #define BM_SETDONTCLICK 0x00F8 #define VK_EREOF 0xF9 #define VK_PLAY 0xFA #define VK_ZOOM 0xFB #define VK_NONAME 0xFC #define VK_PA1 0xFD #define VK_OEM_CLEAR 0xFE #define WM_INPUT_DEVICE_CHANGE 0x00FE #define SUBVERSION_MASK 0x000000FF #define WM_INPUT 0x00FF #define WM_KEYFIRST 0x0100 #define WM_KEYDOWN 0x0100 #define WVR_HREDRAW 0x0100 #define HDS_FILTERBAR 0x0100 #define TBSTYLE_TOOLTIPS 0x0100 #define RBS_TOOLTIPS 0x00000100 #define TTS_USEVISUALSTYLE 0x100 #define SBARS_SIZEGRIP 0x0100 #define TBS_TOOLTIPS 0x0100 #define UDS_HOTTRACK 0x0100 #define LVS_AUTOARRANGE 0x0100 #define TVS_CHECKBOXES 0x0100 #define TVS_EX_EXCLUSIONCHECKBOXES 0x0100 #define TCS_BUTTONS 0x0100 #define MCS_NOSELCHANGEONNAV 0x0100 #define WM_KEYUP 0x0101 #define WM_CHAR 0x0102 #define WM_DEADCHAR 0x0103 #define WM_SYSKEYDOWN 0x0104 #define WM_SYSKEYUP 0x0105 #define WM_SYSCHAR 0x0106 #define WM_SYSDEADCHAR 0x0107 #define WM_UNICHAR 0x0109 #define WM_KEYLAST 0x0109 #define WM_IME_STARTCOMPOSITION 0x010D #define WM_IME_ENDCOMPOSITION 0x010E #define WM_IME_COMPOSITION 0x010F #define WM_IME_KEYLAST 0x010F #define WM_INITDIALOG 0x0110 #define WM_COMMAND 0x0111 #define WM_SYSCOMMAND 0x0112 #define WM_TIMER 0x0113 #define WM_HSCROLL 0x0114 #define WM_VSCROLL 0x0115 #define WM_INITMENU 0x0116 #define WM_INITMENUPOPUP 0x0117 #define WM_GESTURE 0x0119 #define WM_GESTURENOTIFY 0x011A #define WM_MENUSELECT 0x011F #define WM_MENUCHAR 0x0120 #define WM_ENTERIDLE 0x0121 #define WM_MENURBUTTONUP 0x0122 #define WM_MENUDRAG 0x0123 #define WM_MENUGETOBJECT 0x0124 #define WM_UNINITMENUPOPUP 0x0125 #define WM_MENUCOMMAND 0x0126 #define WM_CHANGEUISTATE 0x0127 #define WM_UPDATEUISTATE 0x0128 #define WM_QUERYUISTATE 0x0129 #define WM_CTLCOLORMSGBOX 0x0132 #define WM_CTLCOLOREDIT 0x0133 #define WM_CTLCOLORLISTBOX 0x0134 #define WM_CTLCOLORBTN 0x0135 #define WM_CTLCOLORDLG 0x0136 #define WM_CTLCOLORSCROLLBAR 0x0137 #define WM_CTLCOLORSTATIC 0x0138 #define MN_GETHMENU 0x01E1 #define _WIN32_IE_IE20 0x0200 #define WM_MOUSEFIRST 0x0200 #define WM_MOUSEMOVE 0x0200 #define WVR_VREDRAW 0x0200 #define CS_NOCLOSE 0x0200 #define CF_PRIVATEFIRST 0x0200 #define HDS_FLAT 0x0200 #define TBSTYLE_WRAPABLE 0x0200 #define RBS_VARHEIGHT 0x00000200 #define TBS_REVERSED 0x0200 #define LVS_EDITLABELS 0x0200 #define TVS_TRACKSELECT 0x0200 #define TVS_EX_DIMMEDCHECKBOXES 0x0200 #define TCS_MULTILINE 0x0200 #define WM_LBUTTONDOWN 0x0201 #define WM_LBUTTONUP 0x0202 #define WM_LBUTTONDBLCLK 0x0203 #define WM_RBUTTONDOWN 0x0204 #define WM_RBUTTONUP 0x0205 #define WM_RBUTTONDBLCLK 0x0206 #define WM_MBUTTONDOWN 0x0207 #define WM_MBUTTONUP 0x0208 #define WM_MBUTTONDBLCLK 0x0209 #define WM_MOUSEWHEEL 0x020A #define WM_XBUTTONDOWN 0x020B #define WM_XBUTTONUP 0x020C #define WM_XBUTTONDBLCLK 0x020D #define WM_MOUSEHWHEEL 0x020E #define WM_MOUSELAST 0x020E #define WM_PARENTNOTIFY 0x0210 #define WM_ENTERMENULOOP 0x0211 #define WM_EXITMENULOOP 0x0212 #define WM_NEXTMENU 0x0213 #define WM_SIZING 0x0214 #define WM_CAPTURECHANGED 0x0215 #define WM_MOVING 0x0216 #define WM_POWERBROADCAST 0x0218 #define WM_DEVICECHANGE 0x0219 #define WM_MDICREATE 0x0220 #define WM_MDIDESTROY 0x0221 #define WM_MDIACTIVATE 0x0222 #define WM_MDIRESTORE 0x0223 #define WM_MDINEXT 0x0224 #define WM_MDIMAXIMIZE 0x0225 #define WM_MDITILE 0x0226 #define WM_MDICASCADE 0x0227 #define WM_MDIICONARRANGE 0x0228 #define WM_MDIGETACTIVE 0x0229 #define WM_MDISETMENU 0x0230 #define WM_ENTERSIZEMOVE 0x0231 #define WM_EXITSIZEMOVE 0x0232 #define WM_DROPFILES 0x0233 #define WM_MDIREFRESHMENU 0x0234 #define WM_TOUCH 0x0240 #define WM_IME_SETCONTEXT 0x0281 #define WM_IME_NOTIFY 0x0282 #define WM_IME_CONTROL 0x0283 #define WM_IME_COMPOSITIONFULL 0x0284 #define WM_IME_SELECT 0x0285 #define WM_IME_CHAR 0x0286 #define WM_IME_REQUEST 0x0288 #define WM_IME_KEYDOWN 0x0290 #define WM_IME_KEYUP 0x0291 #define WM_NCMOUSEHOVER 0x02A0 #define WM_MOUSEHOVER 0x02A1 #define WM_NCMOUSELEAVE 0x02A2 #define WM_MOUSELEAVE 0x02A3 #define WM_WTSSESSION_CHANGE 0x02B1 #define WM_TABLET_FIRST 0x02c0 #define WM_TABLET_LAST 0x02df #define CF_PRIVATELAST 0x02FF #define _WIN32_IE_IE30 0x0300 #define WM_CUT 0x0300 #define CF_GDIOBJFIRST 0x0300 #define WM_COPY 0x0301 #define _WIN32_IE_IE302 0x0302 #define WM_PASTE 0x0302 #define WM_CLEAR 0x0303 #define WM_UNDO 0x0304 #define WM_RENDERFORMAT 0x0305 #define WM_RENDERALLFORMATS 0x0306 #define WM_DESTROYCLIPBOARD 0x0307 #define WM_DRAWCLIPBOARD 0x0308 #define WM_PAINTCLIPBOARD 0x0309 #define WM_VSCROLLCLIPBOARD 0x030A #define WM_SIZECLIPBOARD 0x030B #define WM_ASKCBFORMATNAME 0x030C #define WM_CHANGECBCHAIN 0x030D #define WM_HSCROLLCLIPBOARD 0x030E #define WM_QUERYNEWPALETTE 0x030F #define WM_PALETTEISCHANGING 0x0310 #define WM_PALETTECHANGED 0x0311 #define WM_HOTKEY 0x0312 #define WM_PRINT 0x0317 #define WM_PRINTCLIENT 0x0318 #define WM_APPCOMMAND 0x0319 #define WM_THEMECHANGED 0x031A #define WM_CLIPBOARDUPDATE 0x031D #define WM_DWMCOMPOSITIONCHANGED 0x031E #define WM_DWMNCRENDERINGCHANGED 0x031F #define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 #define WM_DWMWINDOWMAXIMIZEDCHANGE 0x0321 #define WM_DWMSENDICONICTHUMBNAIL 0x0323 #define WM_DWMSENDICONICLIVEPREVIEWBITMAP 0x0326 #define WM_GETTITLEBARINFOEX 0x033F #define WM_HANDHELDFIRST 0x0358 #define WM_HANDHELDLAST 0x035F #define WM_AFXFIRST 0x0360 #define WM_AFXLAST 0x037F #define WM_PENWINFIRST 0x0380 #define WM_PENWINLAST 0x038F #define WM_DDE_FIRST 0x03E0 #define CF_GDIOBJLAST 0x03FF #define _WIN32_WINNT_NT4 0x0400 #define _WIN32_IE_IE40 0x0400 #define WM_USER 0x0400 #define WVR_VALIDRECTS 0x0400 #define HDS_CHECKBOXES 0x0400 #define TBSTYLE_ALTDRAG 0x0400 #define RBS_BANDBORDERS 0x00000400 #define TBS_DOWNISLEFT 0x0400 #define LVS_OWNERDRAWFIXED 0x0400 #define TVS_SINGLEEXPAND 0x0400 #define TVS_EX_DRAWIMAGEASYNC 0x0400 #define TCS_FIXEDWIDTH 0x0400 #define ctlFirst 0x0400 #define psh1 0x0400 #define _WIN32_IE_IE401 0x0401 #define psh2 0x0401 #define psh3 0x0402 #define psh4 0x0403 #define psh5 0x0404 #define psh6 0x0405 #define psh7 0x0406 #define psh8 0x0407 #define psh9 0x0408 #define psh10 0x0409 #define psh11 0x040a #define psh12 0x040b #define psh13 0x040c #define psh14 0x040d #define psh15 0x040e #define psh16 0x040f #define _WIN32_WINDOWS 0x0410 #define chx1 0x0410 #define chx2 0x0411 #define chx3 0x0412 #define chx4 0x0413 #define chx5 0x0414 #define chx6 0x0415 #define chx7 0x0416 #define chx8 0x0417 #define chx9 0x0418 #define chx10 0x0419 #define chx11 0x041a #define chx12 0x041b #define chx13 0x041c #define chx14 0x041d #define chx15 0x041e #define chx16 0x041f #define rad1 0x0420 #define rad2 0x0421 #define rad3 0x0422 #define rad4 0x0423 #define rad5 0x0424 #define rad6 0x0425 #define rad7 0x0426 #define rad8 0x0427 #define rad9 0x0428 #define rad10 0x0429 #define rad11 0x042a #define rad12 0x042b #define rad13 0x042c #define rad14 0x042d #define rad15 0x042e #define rad16 0x042f #define grp1 0x0430 #define grp2 0x0431 #define grp3 0x0432 #define grp4 0x0433 #define frm1 0x0434 #define frm2 0x0435 #define frm3 0x0436 #define frm4 0x0437 #define rct1 0x0438 #define rct2 0x0439 #define rct3 0x043a #define rct4 0x043b #define ico1 0x043c #define ico2 0x043d #define ico3 0x043e #define ico4 0x043f #define stc1 0x0440 #define stc2 0x0441 #define stc3 0x0442 #define stc4 0x0443 #define stc5 0x0444 #define stc6 0x0445 #define stc7 0x0446 #define stc8 0x0447 #define stc9 0x0448 #define stc10 0x0449 #define stc11 0x044a #define stc12 0x044b #define stc13 0x044c #define stc14 0x044d #define stc15 0x044e #define stc16 0x044f #define stc17 0x0450 #define stc18 0x0451 #define stc19 0x0452 #define stc20 0x0453 #define stc21 0x0454 #define stc22 0x0455 #define stc23 0x0456 #define stc24 0x0457 #define stc25 0x0458 #define stc26 0x0459 #define stc27 0x045a #define stc28 0x045b #define stc29 0x045c #define stc30 0x045d #define stc31 0x045e #define stc32 0x045f #define lst1 0x0460 #define lst2 0x0461 #define lst3 0x0462 #define lst4 0x0463 #define lst5 0x0464 #define lst6 0x0465 #define lst7 0x0466 #define lst8 0x0467 #define lst9 0x0468 #define lst10 0x0469 #define lst11 0x046a #define lst12 0x046b #define lst13 0x046c #define lst14 0x046d #define lst15 0x046e #define lst16 0x046f #define cmb1 0x0470 #define cmb2 0x0471 #define cmb3 0x0472 #define cmb4 0x0473 #define cmb5 0x0474 #define cmb6 0x0475 #define cmb7 0x0476 #define cmb8 0x0477 #define cmb9 0x0478 #define cmb10 0x0479 #define cmb11 0x047a #define cmb12 0x047b #define cmb13 0x047c #define cmb14 0x047d #define cmb15 0x047e #define cmb16 0x047f #define edt1 0x0480 #define edt2 0x0481 #define edt3 0x0482 #define edt4 0x0483 #define edt5 0x0484 #define edt6 0x0485 #define edt7 0x0486 #define edt8 0x0487 #define edt9 0x0488 #define edt10 0x0489 #define edt11 0x048a #define edt12 0x048b #define edt13 0x048c #define edt14 0x048d #define edt15 0x048e #define edt16 0x048f #define scr1 0x0490 #define scr2 0x0491 #define scr3 0x0492 #define scr4 0x0493 #define scr5 0x0494 #define scr6 0x0495 #define scr7 0x0496 #define scr8 0x0497 #define ctl1 0x04A0 #define ctlLast 0x04ff #define _WIN32_WINNT_WIN2K 0x0500 #define _WIN32_IE_IE50 0x0500 #define _WIN32_WINNT_WINXP 0x0501 #define _WIN32_IE_IE501 0x0501 #define _WIN32_WINNT_WS03 0x0502 #define _WIN32_IE_IE55 0x0550 #define _WIN32_WINNT_WIN6 0x0600 #define _WIN32_WINNT_VISTA 0x0600 #define _WIN32_WINNT_WS08 0x0600 #define _WIN32_WINNT_LONGHORN 0x0600 #define _WIN32_IE_IE60 0x0600 #define FILEOPENORD 1536 #define _WIN32_WINNT_WIN7 0x0601 #define _WIN32_IE_IE60SP1 0x0601 #define _WIN32_WINNT 0x0601 #define MULTIFILEOPENORD 1537 #define _WIN32_IE_WS03 0x0602 #define PRINTDLGORD 1538 #define _WIN32_IE_IE60SP2 0x0603 #define PRNSETUPDLGORD 1539 #define FINDDLGORD 1540 #define REPLACEDLGORD 1541 #define FONTDLGORD 1542 #define FORMATDLGORD31 1543 #define FORMATDLGORD30 1544 #define RUNDLGORD 1545 #define PAGESETUPDLGORD 1546 #define NEWFILEOPENORD 1547 #define PRINTDLGEXORD 1549 #define PAGESETUPDLGORDMOTIF 1550 #define COLORMGMTDLGORD 1551 #define NEWFILEOPENV2ORD 1552 #define NEWFILEOPENV3ORD 1553 #define NEWFORMATDLGWITHLINK 1591 #define IDC_MANAGE_LINK 1592 #define _WIN32_IE_IE70 0x0700 #define _WIN32_IE_IE80 0x0800 #define _WIN32_IE 0x0800 #define CS_SAVEBITS 0x0800 #define HDS_NOSIZING 0x0800 #define TBSTYLE_FLAT 0x0800 #define RBS_FIXEDORDER 0x00000800 #define SBARS_TOOLTIPS 0x0800 #define SBT_TOOLTIPS 0x0800 #define TBS_NOTIFYBEFOREMOVE 0x0800 #define LVS_ALIGNLEFT 0x0800 #define TVS_INFOTIP 0x0800 #define TCS_RAGGEDRIGHT 0x0800 #define LVS_ALIGNMASK 0x0c00 #define CS_BYTEALIGNCLIENT 0x1000 #define HDS_OVERFLOW 0x1000 #define TBSTYLE_LIST 0x1000 #define RBS_REGISTERDROP 0x00001000 #define TBS_TRANSPARENTBKGND 0x1000 #define LVS_OWNERDATA 0x1000 #define TVS_FULLROWSELECT 0x1000 #define TCS_FOCUSONBUTTONDOWN 0x1000 #define CS_BYTEALIGNWINDOW 0x2000 #define TBSTYLE_CUSTOMERASE 0x2000 #define RBS_AUTOSIZE 0x00002000 #define LVS_NOSCROLL 0x2000 #define TVS_NOSCROLL 0x2000 #define TCS_OWNERDRAWFIXED 0x2000 #define CS_GLOBALCLASS 0x4000 #define TBSTYLE_REGISTERDROP 0x4000 #define RBS_VERTICALGRIPPER 0x00004000 #define LVS_NOCOLUMNHEADER 0x4000 #define TVS_NONEVENHEIGHT 0x4000 #define TCS_TOOLTIPS 0x4000 #define IDH_NO_HELP 28440 #define IDH_MISSING_CONTEXT 28441 #define IDH_GENERIC_HELP_BUTTON 28442 #define IDH_OK 28443 #define IDH_CANCEL 28444 #define IDH_HELP 28445 #define LANG_BOSNIAN_NEUTRAL 0x781a #define LANG_CHINESE_TRADITIONAL 0x7c04 #define LANG_SERBIAN_NEUTRAL 0x7c1a #define IDTIMEOUT 32000 #define OCR_NORMAL 32512 #define OIC_SAMPLE 32512 #define IDI_APPLICATION 32512 #define OCR_IBEAM 32513 #define OIC_HAND 32513 #define IDI_HAND 32513 #define OCR_WAIT 32514 #define OIC_QUES 32514 #define IDI_QUESTION 32514 #define OCR_CROSS 32515 #define OIC_BANG 32515 #define IDI_EXCLAMATION 32515 #define OCR_UP 32516 #define OIC_NOTE 32516 #define IDI_ASTERISK 32516 #define OIC_WINLOGO 32517 #define IDI_WINLOGO 32517 #define OIC_SHIELD 32518 #define IDI_SHIELD 32518 #define OCR_SIZE 32640 #define OCR_ICON 32641 #define OCR_SIZENWSE 32642 #define OCR_SIZENESW 32643 #define OCR_SIZEWE 32644 #define OCR_SIZENS 32645 #define OCR_SIZEALL 32646 #define OCR_ICOCUR 32647 #define OCR_NO 32648 #define OCR_HAND 32649 #define OCR_APPSTARTING 32650 #define OBM_LFARROWI 32734 #define OBM_RGARROWI 32735 #define OBM_DNARROWI 32736 #define OBM_UPARROWI 32737 #define OBM_COMBO 32738 #define OBM_MNARROW 32739 #define OBM_LFARROWD 32740 #define OBM_RGARROWD 32741 #define OBM_DNARROWD 32742 #define OBM_UPARROWD 32743 #define OBM_RESTORED 32744 #define OBM_ZOOMD 32745 #define OBM_REDUCED 32746 #define OBM_RESTORE 32747 #define OBM_ZOOM 32748 #define OBM_REDUCE 32749 #define OBM_LFARROW 32750 #define OBM_RGARROW 32751 #define OBM_DNARROW 32752 #define OBM_UPARROW 32753 #define OBM_CLOSE 32754 #define OBM_OLD_RESTORE 32755 #define OBM_OLD_ZOOM 32756 #define OBM_OLD_REDUCE 32757 #define OBM_BTNCORNERS 32758 #define OBM_CHECKBOXES 32759 #define OBM_CHECK 32760 #define OBM_BTSIZE 32761 #define OBM_OLD_LFARROW 32762 #define OBM_OLD_RGARROW 32763 #define OBM_OLD_DNARROW 32764 #define OBM_OLD_UPARROW 32765 #define OBM_SIZE 32766 #define OBM_OLD_CLOSE 32767 #define WM_APP 0x8000 #define HELP_TCARD 0x8000 #define TBSTYLE_TRANSPARENT 0x8000 #define RBS_DBLCLKTOGGLE 0x00008000 #define LVS_NOSORTHEADER 0x8000 #define TVS_NOHSCROLL 0x8000 #define TCS_FOCUSNEVER 0x8000 #define SC_SIZE 0xF000 #define SC_SEPARATOR 0xF00F #define SC_MOVE 0xF010 #define SC_MINIMIZE 0xF020 #define SC_MAXIMIZE 0xF030 #define SC_NEXTWINDOW 0xF040 #define SC_PREVWINDOW 0xF050 #define SC_CLOSE 0xF060 #define SC_VSCROLL 0xF070 #define SC_HSCROLL 0xF080 #define SC_MOUSEMENU 0xF090 #define SC_KEYMENU 0xF100 #define SC_ARRANGE 0xF110 #define SC_RESTORE 0xF120 #define SC_TASKLIST 0xF130 #define SC_SCREENSAVE 0xF140 #define SC_HOTKEY 0xF150 #define SC_DEFAULT 0xF160 #define SC_MONITORPOWER 0xF170 #define SC_CONTEXTHELP 0xF180 #define LVS_TYPESTYLEMASK 0xfc00 #define SPVERSION_MASK 0x0000FF00 #define HTERROR -2 #define PWR_FAIL -1 #define UNICODE_NOCHAR 0xFFFF #define HTTRANSPARENT -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif bzflag-2.4.2+ds1/Makefile.am000066400000000000000000000034121200563112200154730ustar00rootroot00000000000000AUTOMAKE_OPTIONS = 1.6 dist-zip dist-bzip2 ACLOCAL_AMFLAGS = -I m4 traversal_dirs = \ data \ include \ man \ package \ src if BUILD_PLUGINS PLUGINS=plugins else PLUGINS= endif SUBDIRS = \ $(traversal_dirs) \ $(PLUGINS) DIST_SUBDIRS = \ $(traversal_dirs) \ m4 \ misc \ plugins \ tools \ MSVC \ BZFlag.xcodeproj EXTRA_DIST = \ autogen.sh \ authors.xml \ BUGS \ bzflag.lsm \ bzflag.spec \ DEVINFO \ PORTING \ README.BeOS \ README.IRIX \ README.Linux \ README.MINGW32 \ README.MacOSX \ README.SDL \ README.SOLARIS \ README.WINDOWS \ README.XMINGW DISTCLEANFILES = config.cache.* MAINTAINERCLEANFILES = \ aclocal.m4 \ configure \ bzflag.spec \ INSTALL \ Makefile.in \ m4/libtool.m4 \ m4/ltoptions.m4 \ m4/ltsugar.m4 \ m4/ltversion.m4 \ m4/lt~obsolete.m4 # delete files from m4 subdirectory here to prevent dependency problems .PHONY: package package: cd package && $(MAKE) targets # Remove unwanted files from the distribution. # Ensure that all files in the repository are also in the distribution. dist-hook: find $(distdir) -type f \( -name config.log -o -name config.status \) -exec rm -f {} \; find $(distdir) -type d \( -name .deps -o -name .svn -o -name autom4te.cache \) -prune -exec rm -rf {} \; rm -f $(distdir)/src/other/ares/ares_build.h \ $(distdir)/src/other/curl/include/curl/curlbuild.h entries=`find . -name entries -print | grep -v src/other/` ; \ files=`perl -wnle 'BEGIN {$$/ = "\f"} $$ARGV =~ m=^\./(.*/)\.svn/entries$$= and $$d = $$1 and /^\n([^\n]+)\nfile\n/ and print $$d,$$1' $$entries < /dev/null` ; \ missing=0 ; \ for file in $$files ; do \ if test ! -e $(distdir)/$$file ; then \ missing=1 ; \ echo "MISSING FROM DIST: $$file" ; \ fi ; \ done ; \ if test "x$$missing" = "x1" ; then \ exit 1 ; \ fi bzflag-2.4.2+ds1/Makefile.in000066400000000000000000000622201200563112200155060ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/bzflag.lsm.in \ $(srcdir)/bzflag.spec.in $(top_srcdir)/configure AUTHORS \ COPYING ChangeLog INSTALL NEWS TODO ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = bzflag.lsm bzflag.spec CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.6 dist-zip dist-bzip2 ACLOCAL_AMFLAGS = -I m4 traversal_dirs = \ data \ include \ man \ package \ src @BUILD_PLUGINS_FALSE@PLUGINS = @BUILD_PLUGINS_TRUE@PLUGINS = plugins SUBDIRS = \ $(traversal_dirs) \ $(PLUGINS) DIST_SUBDIRS = \ $(traversal_dirs) \ m4 \ misc \ plugins \ tools \ MSVC \ BZFlag.xcodeproj EXTRA_DIST = \ autogen.sh \ authors.xml \ BUGS \ bzflag.lsm \ bzflag.spec \ DEVINFO \ PORTING \ README.BeOS \ README.IRIX \ README.Linux \ README.MINGW32 \ README.MacOSX \ README.SDL \ README.SOLARIS \ README.WINDOWS \ README.XMINGW DISTCLEANFILES = config.cache.* MAINTAINERCLEANFILES = \ aclocal.m4 \ configure \ bzflag.spec \ INSTALL \ Makefile.in \ m4/libtool.m4 \ m4/ltoptions.m4 \ m4/ltsugar.m4 \ m4/ltversion.m4 \ m4/lt~obsolete.m4 all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): bzflag.lsm: $(top_builddir)/config.status $(srcdir)/bzflag.lsm.in cd $(top_builddir) && $(SHELL) ./config.status $@ bzflag.spec: $(top_builddir)/config.status $(srcdir)/bzflag.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # delete files from m4 subdirectory here to prevent dependency problems .PHONY: package package: cd package && $(MAKE) targets # Remove unwanted files from the distribution. # Ensure that all files in the repository are also in the distribution. dist-hook: find $(distdir) -type f \( -name config.log -o -name config.status \) -exec rm -f {} \; find $(distdir) -type d \( -name .deps -o -name .svn -o -name autom4te.cache \) -prune -exec rm -rf {} \; rm -f $(distdir)/src/other/ares/ares_build.h \ $(distdir)/src/other/curl/include/curl/curlbuild.h entries=`find . -name entries -print | grep -v src/other/` ; \ files=`perl -wnle 'BEGIN {$$/ = "\f"} $$ARGV =~ m=^\./(.*/)\.svn/entries$$= and $$d = $$1 and /^\n([^\n]+)\nfile\n/ and print $$d,$$1' $$entries < /dev/null` ; \ missing=0 ; \ for file in $$files ; do \ if test ! -e $(distdir)/$$file ; then \ missing=1 ; \ echo "MISSING FROM DIST: $$file" ; \ fi ; \ done ; \ if test "x$$missing" = "x1" ; then \ exit 1 ; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/NEWS000066400000000000000000000000371200563112200141360ustar00rootroot00000000000000see version entry in ChangeLog bzflag-2.4.2+ds1/PORTING000066400000000000000000000057241200563112200145140ustar00rootroot00000000000000PORTING guide for bzflag Follow these steps to port bzflag to a new platform. Say the new platform is named `foo'. * in src/platform/: * this step may be skipped if the platform you're porting to supports SDL and you do not want to have native graphics/audio, as there are preexisiting SDL* platform files. * implement the following files, as necessary, using an appropriate prefix instead of Foo. it may be possible to use existing files as is, or to reuse existing code (by copying). * FooPlatformFactory * FooDisplay * FooMedia * FooVisual * FooWindow * add the platform dependent files to Makefile.am with appropriate 'if' guards. * try building * modify configure.in for your platform - particularly to set the proper CFLAGS/CXXFLAGS and to insure that needed libraries (e.g. OpenGL, curses) can be found. * fix errors. errors are typically caused by missing include files and a missing/different BSD sockets API. make as few changes as possible to avoid breaking other platforms. avoid #if/#endif when you can. * fix warnings. (most) warnings are there for a reason. listen to what they're saying and fix the code. bzflag should compile cleanly (zero warnings). * in package: * create a makefile to build a package for your platform. a package includes all the files necessary for installing bzflag on the platform. some platforms provide a standard software management tool (e.g. RPM on RedHat Linux and swmgr on Irix); ideally, the package is built for that tool. On UNIX, a gzipped tar file with an install shell script may be sufficient. The Win32 package is a self extracting executable with a GUI front end. Most of the bzflag code is portable C++, but there are two API's that are not encapsulated: OpenGL and BSD sockets. The OpenGL API should not present a problem, unless you intend to port to some other graphics API for some reason, since it's identical on all platforms. GL/gl.h provides a #define to identify the version of OpenGL. All OpenGL code that's not version 1.0 compatible should be #ifdef/#endif guarded and, if possible, also implemented with version 1.0 code for platforms that don't support the later versions. The BSD socket API may cause some trouble if you're not porting to some flavor of UNIX. Encapsulating network code is on the to do list. Some platform differences are handled using #ifdef/#endif directives. These are to be avoided when possible as they make the code harder to read and can lead to platform differences when code is updated for some, but not all, platforms. Please make use of autoconf's HAVE_* defines rather than platform-specific predefines...code for features, not for platforms. Inherently non-portable code is under src/platform. It encapsulates windowing and audio subsystems. (It also includes code to read image and audio files, for historical reasons.) bzflag-2.4.2+ds1/README000066400000000000000000000460701200563112200143260ustar00rootroot00000000000000 BZFlag 2.4.2 http://BZFlag.org/ Copyright (c) 1993-2012 Tim Riker BZFlag is an Open Source OpenGL multiplayer multiplatform Battle Zone capture the Flag game. At its heart, the game is a 3D first person tank simulation where opposing teams battle for dominance. The game was originally written for SGI computers running Irix, but now runs and is actively maintained on Windows, Linux, Mac OS X, BSD, Solaris, and other platforms. The game is distributed under the LGPL license. This is the BZFlag README file. This file includes introductory build instructions, user community interaction references, information for getting involved in BZFlag development, a manifest of the source code layout, basic usage expectations, contact information, and more. Table of Contents ================= Introduction Table of Contents Obtaining BZFlag Compiling and Installation Short Version Long Version Communication Internet Relay Chat Mailing Lists Bulletin Boards Wiki Bug Reports and Support Providing Contributions Source Tree Organization Frequently Asked Questions Notes on "CHEAT" servers and network abuse Project History and Contributions Contact Obtaining BZFlag ================ Main BZFlag Website: http://BZFlag.org BZFlag Project Site: http://sf.net/projects/bzflag The main BZFlag website provides access to most all of the resources available for the game. The binary and source distributions of BZFlag are, however, provided on the SourceForge project site. Compiled versions are distributed as installable packages, disk images, and more, with details varying depending on the platform. Source code distributions are provided and archived in various formats as well. See the project site for the download links. BZFlag is also available directly from SVN. To obtain BZFlag from SVN, a bit more familiarity with software development is expected. Sometimes active BZFlag development is on SVN HEAD, sometimes it is on a branch, sometimes it's in multiple places. Inquire on the #bzflag IRC channel on irc.freenode.net or to the bzflag-dev mailing list as to where the current development activity resides. If you're familiar enough, anonymous SVN access is provided: svn co https://bzflag.svn.sourceforge.net/svnroot/bzflag/trunk/bzflag bzflag Compiling and Installation ========================== To compile a playable BZFlag, the following steps should get you up and running quickly if everything external to BZFlag is properly installed: ./autogen.sh ./configure make ./src/bzflag/bzflag If configure detected everything it needed to build the BZFlag client, after make the client will be sitting in src/bzflag as 'bzflag'. The game can be run from there, though you will probably want to "sudo make install" or otherwise become a privileged user and install the game properly for your system. If you're building on a platform that has a README.* file, you should consult that file as they usually contain additional instructions or details specific for building on that platform. There are often hints for common problems specific to those platforms as well. The Longer Version: To build sources checked out directly from SVN you need to create a configure script. You can skip this step if you grab an distribution of BZFlag that already has a ./configure script in it, such as from a source distribution tarball. To generate the configure script, you run the provided autogen.sh script: % sh autogen.sh The script will report whether sufficient versions of the GNU Build System tools (i.e. autoconf, automake, and libtool) that were detected and if successful, a configure script will be generated. If the script fails, submit a report to the developers containing the output of "sh autogen.sh -v". This will run autogen.sh in verbose mode. One of the most common failures is having insufficient versions or mismatched combinations of the GNU Build System tools, so make sure your tools are recent. If the previous step was successful you now have a script for configuring BZFlag. This command: % ./configure --help will list the variety of configuration options. The script adapts well to various system configurations, so it may be enough to simply run it as: % ./configure You may want to create a 'work' directory and configure from there to have all the build products and binary executables get placed in a directory separate from the sources. To do this, simply create a directory then run configure and make from there instead. After configure completes, it will report whether all the requisite packages were found that it needs in order to build the client and the server. The client is reliant upon the following external dependencies that should be installed before running configure: OpenGL 1.0+ libSDL 1.2+ If you're on an operating system that uses a packaging system (e.g. apt, portage, ports, etc), be sure to install the development kit versions of each of those (e.g. xlibmesa-gl-dev package) so that headers are made available. You may also want to manually install other dependencies that BZFlag automatically provides if you do not have them pre-installed: c-ares GLEW libCURL libregex (usually provided as part of libc) zlib The README.Linux file includes a detailed list of of the packages needed to compile and run BZFlag on some popular Linux distributions. The final summary at the end of running configure will report whether the client will be built or not. Once configure has been run, you may compile by simply running 'make'. If you have GNU Make and are on a multiprocessor system, you can build in parallel with the -j option: % make -j4 If compilation was successful, the client will be in src/bzflag and the server will be in src/bzfs as 'bzflag' and 'bzfs' respectively. You can run the client or the server directly from those locations with or without installing: % src/bzflag/bzflag BZFlag looks for data files in a path defined during compile, in ./data/ , or in the previously specified data path only. As part of the tarball/cvs checkout, the base data library is located in /bzflag/data. This means that to test in a working directory you need to tell bzflag where to find these files if there is not a 'data' directory in your current directory. This can be done with a symbolic link: % ln -s ./path/to/bzflag/data After testing you can install BZFlag by running 'make install' with sufficient system installation privileges. Use 'sudo', 'su', or similar methods to elevate your privileges when installing BZFlag system-wide: % sudo make install You should now have BZFlag in the system directory ready to run. If you do not have admin privileges on your platform, you can install files in a directory that you own; for this to work, you have to append to the configure command the prefix option: % ./configure --prefix=YourHomeDirectoryHere You will then be able to perform a "make install" without needing to elevate your privileges, and all bzflag executable files will be installed in the subdir bin of the specified path. For additional information on installing, see INSTALL file. Again, some platforms may be different. See the README file appropriate to your system for more information: Platform README file -------- ----------- UNIX, Linux README IRIX README.IRIX Solaris README.SOLARIS Mac OS X README.MacOSX Windows XP and up README.WINDOWS, README.MINGW32 You can also build an installable package using: % make package The package will be placed in ./dist; the exact form of the package depends on the platform. There are three cleanup targets: clean, distclean, and maintainer-clean. `make clean' removes intermediate files but leaves bzflag and other programs and any man pages. `make distclean' removes everything clean does and also programs and man pages. This should get things back to a tarball state. `make maintainer-clean' removes everything distclean does and also packages, directories created during the build, and the platform configuration; this should get the source tree back to its state in SVN. To build BZFlag for an unsupported platform, see PORTING. The ./configure script has a number of build options that you may find interesting. Communication ============= The BZFlag project has several resources set up for communicating both with other developers and with the community. There is an IRC channel, several mailing lists, bulletin boards, and a wiki. Internet Relay Chat ------------------- Most of the BZFlag development activity and discussions occur over IRC. Join the #bzflag IRC channel on the Freenode network (irc.freenode.net, port 6667) to get involved. See http://irc.bzflag.org for a web based interface for first-time users. Individuals that intend to stay in the channel are expected to get a non-web-based IRC client. See http://irchelp.org or search the web for IRC clients for your operating system. Mailing Lists ------------- There are several BZFlag mailing lists, but the two of particular interest to most are the user's list and the main developer's list. The former is for general BZFlag discussion and announcements. The latter is for coding and development discussion only. There are also lists dedicated to SVN activity, league discussions, and server administration. To join a mailing list, go to the SourceForge mailing list page on the project site: http://sourceforge.net/mail/?group_id=3248 and follow the links for joining the respective mailing lists that interest you. Bulletin Boards --------------- There are extensive and active bulletin boards used by players, server operators, administrators, and others available here: http://my.bzflag.org/bb/ Registering an account on the bulletin board presently also registers your callsign for use inside of BZFlag. Some servers require registration in order to play. See the board FAQ and Getting Started pages for new users. In addition to the main bulletin boards, there are forums on the SourceForge project site available here: http://sourceforge.net/forum/?group_id=3248 The main bulletin boards are considerably higher volume for day-to-day player discussions. The forums are often used for informally resolving issues with new users. Wiki ---- The main BZFlag website contains a wiki that may be edited by the community available at: http://BZFlag.org/wiki The wiki does require a simple registration in order to make modifications as a means to minimize abuse, but serves as a communication forum and ongoing discussion arena for the game's development. Bug Reports and Support ======================= For reporting bugs and unexpected behavior, please go to BZFlag bug tracking system at: http://sourceforge.net/tracker/?group_id=3248&atid=103248 Alternatively, you can email bug reports to the development mailing list or to Tim@Rikers.org but the web based method is preferred. See the BUGS file in the source distribution for other known issues. If you require assistance with some issue, please visit BZFlag support tracking system at: http://sourceforge.net/tracker/?group_id=3248&atid=203248 Alternatively, the IRC channel, discussion forums, and mailing lists are also viable avenues for resolving issues. Providing Contributions ======================= Patches should be entered into the BZFlag patch tracking system at: http://sourceforge.net/tracker/?group_id=3248&atid=303248 Patches are preferred in the unified diff format. From a SVN checkout, a unified diff patch file may be created as follows: % svn diff > patch.diff If you like, you may also send mail to either the BZFlag development mailing list or to Tim@Rikers.org (the development mailing list is preferred) to discuss contributions to the official BZFlag source code. Contributions are gladly accepted for modifications that do not affect the core gameplay. Interacting with the other developers in the IRC channel is recommended for any changes which will affect gameplay. Source Tree Organization ======================== After unpacking a source distribution, you should have at least the following files in the new 'bzflag' directory: README - this file README.* - platform specific details AUTHORS - project contributors BUGS - a list of known bugs BZFlag.xcode/ - Mac OS X XCode project COPYING - the license for BZFlag ChangeLog - source code changes since previous release DEVINFO - information for developers NEWS - history of visible changes for each release PORTING - a guide for porting BZFlag TODO - incomplete list of things to do autogen.sh - build system preparation script configure.ac - build system configuration script template data/ - data files (sounds, images, etc.) doc/ - partial documentation in Doxygen format include/ - include headers for libraries man/ - man pages misc/ - miscellaneous goo MSVC/ - stuff for building on the Windows platform package/ - stuff to build installable packages plugins/ - bzfs plugins src/ - bzflag, bzfs, etc. source code 3D/ - 3D code including texture manager bzadmin/ - bzadmin app source code (text admin/chat client) bzflag/ - bzflag app source code (game client) bzfs/ - bzfs app source code (game server) common/ - general purpose classes date/ - unified version and build date stamping for apps game/ - game library used by both the server and client(s) geometry/ - geometry rendering classes mediafile/ - classes for reading resources net/ - networking classes and functions obstacle/ - collision detection stuff ogl/ - OpenGL utility classes other/ - Third-party libraries platform/ - platform dependent code MacOSX/ - Mac OS X specific files scene/ - high level rendering algorithms tools/ - various helper utilities Note that include/ does not have all the include files. If a header is used entirely within a library (i.e. it doesn't directly provide functionality outside the library) then the header is found in the library's directory under src/. An include file goes in include/ only if it's required by another library or libraries or executables. While this complicates locating a header file (it can be in one of two places instead of just one place), you can instantly tell if a header file is (can be) used by clients of the library. Frequently Asked Questions ========================== - When I connect to a newer server with this client others report they can see me but I get 'black caps' after a few seconds for all other players? BZFlag requires both TCP and UDP unicast relay networking for most servers. Make sure that your router and any configured firewall is forwarding UDP traffic over the port you are connecting to on the server. - Every now and then the client seems to randomly crash. Is there anything that can be done about it? There are LOTS of reasons why the client might crash and unfortunately no means to readily diagnose the cause without developer tools. You can try to disable the 'Lighting' option in the menu, which is a known cause of issues on some platforms (e.g. Mac OS X). Otherwise, please report the issue and, if possible, provide a stack trace of the crash (these are auto-generated for Windows and Mac OS X platforms). Public Internet Servers and the "list server" ============================================= The bzflag project offers a public server listing service that allows players to find servers to play on. This service is run for the benefit of the project. As of Version 3.0, BZFLS servers that wish to be listed on the public list server must provide an authentication key that ties the server to a specific global user. This is done to provide contact information for players and project staff. Authentication keys are automatically generated at http://my.bzflag.org/listkeys/ Notes on "CHEAT" servers and network abuse ========================================== While the license for BZFlag certainly allows users to run any server modification that they wish or to modify the code in any way, we ask that people do not publish or host "cheat" clients or servers to the general public for use. We also expect that users will abide by basic usage guidelines of reasonable and tolerable behavior that are not detrimental to the game's heritage of a fun gaming environment for all. We understand the desire to expand, modify, and improve the game and its sources including the ability to test out new features publicly. These modified clients and servers generally provide some advantage over unmodified clients and are generally discouraged for widespread use. As such, we ask that anyone wishing to host or otherwise participate in a game that involves a modified client or server to register under a different network protocol than the current public release by modifying BZ_PROTO_VERSION in the src/date/buildDate.cxx file. This will let modified games be played and prevent modified clients from being used on public unmodified servers. Any individuals that are found to be contributing to abuse of the public services being provided may be subject to bans or other access restrictions. Abuse generally consists of any disruption to one of BZFlag's network services including denial of service attacks, spamming of BZFlag web sites or servers, disruptive gameplay on multiple public servers, intrusion attempts, password sniffing, or any other behavior that is deemed inappropriate. The BZFlag project administrators reserve the right to remove public listings of any game servers for any reason whatsoever, including removal of servers or banning of individuals that do not follow this request. Similarly, the BZFlag project administrators also reserve the right to limit access or otherwise block any players from public service access at any time. These actions may include the suspension or removal of global accounts and limiting access to the web site services including web site services, list server access, bulletin board forum access, and any league resources. In general, the entire network is provided by the community for the community as an entirely volunteer and contributed effort. We ask that all players recognize and respect the time, effort, and resources involved and that we're all generally here to have a good time. Project History and Contributions ================================= BZFlag was primarily originally authored by Chris Schoeneman in the early 1990's. After several years of development, Chris turned over copyright and maintainership of the game to Tim Riker. BZFlag continues today to be maintained and developed by the Open Source community under Tim's maintainership with contributions coming in from all over the world. See the AUTHORS file for more details on contributions to the project. Contact ======= Any of the core developers listed in the AUTHORS file are generally receptive to being contacted for most matters relating to the game. Internet Relay Chat (IRC) or e-mail is generally the expected method of interaction with IRC being generally preferred. The project maintainer is available for most legal matters and public relations: Tim Riker http://rikers.org/ Happy Shooting! The BZFlag Development Team bzflag-2.4.2+ds1/README.BeOS000066400000000000000000000017401200563112200151100ustar00rootroot00000000000000README for BeOS platforms ------------------------- (Franois Revol - 26/02/2004) BZFlag should now compile on BeOS R5 BONE, using the software renderer. It also works fine with MESA 6. It can also built for the "new" OpenGL kit that was to be in R5.1d0, the configure detects libGL2, though one should then have to replace src/platform/BeOSWindow.cxx by src/platform/BeOSWindow2.cxx. Note there are many issues with this beta GL stuff, and it's totally unsupported. I keep this one in SVN because I don't know which API will survive the other. net_server isn't supported yet, and I don't think it will ever be, though the configure script only links to BONE libs if they are present. I usually use: configure --prefix=/boot/home/config --enable-debug Current limitations include: - windowed mode only, and fixed size window. - buggy audio (samples get played in a loop, giving a headache after some minutes. SDL build (= without the native ui) under BeOS hasn't been investigated yet. bzflag-2.4.2+ds1/README.IRIX000066400000000000000000000057051200563112200151000ustar00rootroot00000000000000BZFlag README for IRIX ---------------------- NOTE: BZFlag likely no longer builds successfully on IRIX. However, we will keep this README file for now as a possible reference in case someone wants to try. Building on IRIX will work with either the SGI MIPS compiler or the GNU gcc3 compiler. The GNU compiler is available for download from SGI freeware. Note that the gcc-3.2.2 version picked up some 6.5.18-isms, so you may need to track down the older 3.1 release, or obtain a newer version yourself, if you are using gcc and are unable to compile. If both the GNU compiler and the SGI MIPS compiler are installed on the same system, the GNU compiler will be used by default. To use the SGI MIPS compiler, you will need to inform the configuration script of your preference. You can set the variables as environment variables, or provide them directly to configure as is shown (and preferred) below: # to use the MIPSPro compiler ./configure CC="cc" CXX="CC" CXXFLAGS="-O2 -OPT:Olimit=32768 -DEFAULT:abi=o32:isa=mips3:proc=r5k -LANG:std -FE:template_in_elf_section -ptused -prelink" CFLAGS="-O2 -OPT:Olimit=32768 -DEFAULT:abi=o32:isa=mips3:proc=r5k -LANG:std -ptused -prelink" make If you try to boost the optimization to -O3, it is likely that the compiler will crash or hang. The -OPT:Olimit option helps mitigate any crashes, but some may still be experienced and need to be compiled by hand with no optimization. Some files will simply take a very long time to compile no matter what optimization level, so be patient. ;) The -LANG:std, -ptused, and -prelink options are necessary for it to build properly. Without them, there will be serious problems linking the binaries with the template instantiations. The options are not strictly necessary on the CFLAGS variable (they are required for CXXFLAGS), but don't hurt. You may want to use the -no_autoinclude option on the CXXFLAGS and CFLAGS if your version of the compiler supports that option if you run into an error, but it should not be necessary. The last problem that you may encounter on older IRIX systems is a problem in the curses.h header. This problem will cause bzadmin to fail to build properly. If you have no need for bzadmin, you can ignore the failure as bzfs and bzflag will have completed before bzadmin. Otherwise if you do want bzadmin, the workaround is simple.. The header uses a symbol name that is not valid with the C++ compiler: cc-1084 CC: ERROR File = /usr/include/curses.h, Line = 611 The indicated declaration has an invalid combination of type specifiers. syncok(WINDOW *, int bool), The relatively simple work around involves actually editing the curses.h file. Copy the /usr/include/curses.h file to the bzflag include/ directory. Edit the file and replace "int bool" with "int b". The edited file should take precedence over the system header. Save the file, and restart make and the build should succeed. Best of luck. See the generic install instructions in README for more details. bzflag-2.4.2+ds1/README.Linux000066400000000000000000000070311200563112200154160ustar00rootroot00000000000000BZFlag README for Linux ======================= BZFlag is a network multiplayer 3D tank battle game. You can play against several other people anywhere on a TCP/IP based network, including the Internet. BZFlag is free and open source; please read the file COPYING in the bzflag- directory off the standard doc directory (probably /usr/share/doc). Both hardware and software rendering is supported. Hardware rendering is highly recommended, as software rendering is very slow. Hardware rendering is provided by the OpenGL drivers for your video card. ATI and NVIDIA are the primary chipsets for video cards in use today. Many Linux distributions do not ship with video drivers that properly support hardware acceleration on modern cards. Both ATI and NVIDIA provide Linux drivers for many architectures on there websites. In general they provide greater performance then the default drivers in many distributions. More information about BZFlag is available in the man pages for bzflag, bzfs, bzadmin, and bzw. Also check: http://BZFlag.org/ Different Linux distributions use different naming conventions for the packages that provide the dependencies needed to compile and run BZFlag. Known build requirements include: Debian & Ubuntu: apt-get install g++ libtool automake autoconf libgl1-mesa-dev \ libglu1-mesa-dev libsdl1.2-dev libsdl-sound1.2-dev libcurl3-dev \ libc-ares-dev libglew1.5-dev zlib1g-dev Fedora: yum install SDL-devel c-ares-devel libcurl-devel gcc-c++ \ glew-devel libidn-devel libtool ncurses-devel zlib-devel After any development packages are installed do a "make distclean" command once in the top-level BZFlag source directory. Then, when ./configure is run as usual it will recognize and use the newly installed packages. Known bugs in the Linux version: * screen redraw problems when using accelerated glx. normally only happens, if at all, when you change video format. the workaround is to press ctrl+alt+'+' or ctrl+alt+'-' after exit to change the video format. restart the X server if that doesn't work. this appears to be a problem in glx. Known issues: * rpm may complain about missing libGL and/or libGLU. just use --nodeps and make sure you've got Mesa installed. Mesa 3.1 provides these libraries while earlier versions provided libMesaGL and libMesaGLU. The earlier versions (starting with version 2.6) will work as long as there is a symbolic link from libGL to libMesaGL and from libGLU to libMesaGLU. * if rendering is very slow on your hardware, try turning off some rendering options. if you are using software rendering, turn off textures and shadows and lower your resolution, as they cause the largest load on the CPU. If you are using hardware rendering, make sure you have current video drivers for your video card's chipset. * some sound drivers don't support the SNDCTL_DSP_SETFORMAT ioctl. in this case bzflag uses SNDCTL_DSP_POST to flush partial buffers which may not work well on some drivers. use -mute to disable sound. Having sound problems? If you're using ALSA for sound, you may get better performance using "hw:0" instead of "plughw:0" or "default" for audio by specifying "hw:0" under the Options->Audio->Device menu in the game. This seems to be due to a bug in the SDL audio mixer. If you're using Debian, you may also have positive results replacing libsdl1.2debian-alsa with libsdl1.2debian-all via apt. Submit bug reports and comments on the SourceForge site http://sourceforge.net/projects/bzflag/ bzflag-2.4.2+ds1/README.MINGW32000066400000000000000000000137311200563112200153510ustar00rootroot00000000000000To build bzflag on Windows Intel you can use MinGW and MSYS, both Open Source and freely available from http://www.mingw.org There's a troubleshooting section at the end of this file in case you run into problems. *** Part I: Obtain MingW and MSYS MinGW stands for Minimalistic GNU for Windows it is a collection of library, header and a collection of GNU tools MSYS stands for Minimal SYStem it gives the ability to run shell based program (like configure) The MSYS DTK stands for the Developer's Toolkit it lets you use GNU autotools, and other utilities, on windows MinGW gives the ability to generate a truly native windows program, without any posix layer emulation (like the one in use by cygwin). Now, to build bzflag, you have to procure MinGW and MSYS. Get the whole MinGW, including the MSYS DTK (Development ToolKit), follow the instruction to install it and stay updated. *** Part II: Obtain necessary platform files If you would like to build BZAdmin in curses mode, you need to download PDCurses from http://pdcurses.sourceforge.net/. Build it according to their instructions for MingW, and rename the resulting library from pdcurses.a to libpdcurses.a. Then copy libpdcurses.a and curses.h to the appropriate subdirectories of your MingW32 install (lib and include respectively). If you want to build using SDL support, you should get SDL at libsdl.org and follow their instructions to install it under MinGW before configuring bzflag. Then move on to Part III. This is the suggested way of building BZFlag. If you want to build without using SDL, you have to get yourself a couple of header files to interface the MS DirectX subsystem. They are normally part of any Microsoft development kit; you can get from your Visual C installation if you have one, or from MSDN on internet. Any way you got these files, you should copy either on the MinGW installation, under the include directory or, if you don't like to clutter the MinGW installation, just put under src/platform. The files in question are dsound.h, dinput.h and ddraw.h. To get the needed DirectX header files from the Microsoft DirectX SDK: * Go to http://msdn.microsoft.com/downloads/ * Select the DirectX 9.0 Software Development Kit * Click on the Download link on the right * This is a 227 MB file! * Run the downloaded program * Click Unzip to extract it to the default location (C:\mssdk\temp) * Click "OK" and "Close" when the program finishes extracting the files * Copy ddraw.h, dinput.h and dsound.h from the SDK's include directory Note that we cannot redistribute these files separate of the entire SDK. *** Part III: Obtain BZFlag Make sure that your BZFlag sources have correct line endings. Use the source tarballs rather than zipfiles if you're building from a release. If you are using subversion, the line endings should be correct automatically except for src/date/buildDate.cxx, which you will need to convert with dos2unix or a similar tool before attempting to run ./configure. It's easiest to check out BZFlag into a subdirectory of wherever you installed MSYS, such as /bzflag. *** Part IV: Compile and Install BZFlag Once you have the files checked out correctly, you should run this command sh autogen.sh from the top bzflag directory, from inside the MSYS shell (run msys.bat from the MSYS directory). You should have all the automake, autoconf, m4, perl stuff - they are in DTK kit. They may not be up to date; there are sometimes more updated versions available if autogen refuses to run. If you are able to find a bzflag dist kit, just run the configure script, looking at the help (configure --help) for options. Then run ./configure (with any desired arguments, such as --without-sdl) make make install Compiled executable files are found in src/bzflag (bzflag.exe), src/bzfs/bzfs (bzfs.exe), and src/bzadmin (bzadmin.exe). When you are confident of the compilation result you can run make install and then make a link to the application (e.g. on your Desktop) to run this bejoux. --- Troubleshooting: Q. When I run autogen.sh, I get a message like "sh: aclocal: command not found" A. aclocal and associated programs are part of the GNU autotools package. This is included in the MSYS Developer's Tool Kit (DTK), which can be downloaded from http://www.mingw.org. BZFlag requires the autotools to build. Q. When I run ./configure, it reports "No C Compiler found" or similar. A. Make sure you install MingW32 before MSYS, and when installing MSYS, be sure to tell it where MingW32 is. If this does not work (or you don't want to reinstall), copy the MingW32 directory into the MSYS directory as mingw. E.g. if you have MingW installed to c:\MingW32 and MSYS to c:\msys\1.0, copy the MingW32 directory to c:\msys\1.0 and rename it mingw, so you have c:\msys\1.0\mingw with all the MingW files in it. Q. When I run ./configure, sed dumps the contents of version.h, configure continues normally for a while, and then I get repeated sed errors like "sed: : unterminated `s' command" and others. Make fails with "*** No targets. Stop." or similar. A. When checking out the bzflag sources from SVN, you must check them out with UNIX line breaks. For instructions for TortoiseSVN, see Part IV. Alternatively, use mingw's or cygwin's built-in SVN to check out the files. If you're using a source package, you need to use the tarball (.tar.bz2) not the zip package. You can extract it from within MSYS with "bunzip2 " and "tar -xvf ". Q. When I run make, it reports an error about not being able to find dsound.h. A. Follow the above directions to get the needed DirectX headers from the MS DX SDK, or follow the above instructions for "If you want to build using SDL support" Q. I get errors not mentioned in this file. A. File a support request at http://sourceforge.net/projects/bzflag or jump on #bzflag on irc.freenode.net and ask for help compiling on MingW. Be sure to include the first few lines of error if you file a support request. bzflag-2.4.2+ds1/README.MacOSX000066400000000000000000000075651200563112200154250ustar00rootroot00000000000000BZFlag README for Mac OS X ========================== BZFlag generally runs rather nicely on Mac OS X and is equivalent to the other fully-supported platforms. Included below are instructions on installing BZFlag both from a binary and from a released source distribution. Binary Distribution ------------------- See the project site downloads of BZFlag for Mac OS X http://sourceforge.net/project/showfiles.php?group_id=3248&package_id=53923 to obtain the latest binary distribution. Once you've obtained a binary distribution of BZFlag, installation should be a simple matter of copying the icon provided in the disk mounting image (the .dmg) to your Applications folder. If you cannot run the client at all (e.g. it starts to a black screen or the icon bounces but then nothing happens), you can try several things: 1) Remove any existing BZFlag directory in your personal application support folder: rm -rf "~/Library/Application Support/BZFlag" 2) Switch to a lower resolution before running the game. Some older cards don't have enough memory to run BZFlag (8+ MB is preferred) at higher resolutions. 3) Run the binary directly by using Terminal: /Applications/BZFlag-2.4.2.app/Contents/MacOS/BZFlag If you still have issues running the game, please submit a bug report to the project site bug tracker: http://sourceforge.net/tracker/?group_id=3248&atid=103248 If the game starts but unexpectedly crashes or locks up your system, please file a bug report with the details of what is occuring. You can try turning off the Lighting option in the game to see if that helps with the crashes. Source Distribution ------------------- It is recommended to build BZFlag using the XCode project in the top-level directory, which will provide you with a double-clickable BZFlag.app build. You may also compile from the command line using the usual autogen.sh (if building from SVN), configure, and make. Do NOT run 'make install' as this does not work properly on OSX. Instead, just run BZFlag out of the source directory by running 'src/bzflag/bzflag' in the terminal. It is highly recommended that sources be obtained from the Sourceforge project site: http://sourceforge.net/project/showfiles.php?group_id=3248&package_id=3165 You'll want the .tar.gz source tarball, NOT the .zip source file. For either build approach, you'll need to first install the SDL framework into your /Library/Frameworks folder. Mac OS X 10.6 (Snow Leopard) PRESENTLY REQUIRES SDL VERSION 1.2 and will likely not work with newer 1.3 or 2.0+ versions. The SDL framework can be obtained from http://libsdl.org/download.php where you will need the "Runtime Libraries" download for Mac OS X. Once SDL is installed, you may then proceed with compilation. To compile using the command-line approach, open up Terminal (which is located in your /Applications/Utilities folder) and run the following: ./autogen.sh && ./configure && make (Note: If running OS 10.5, you will need to provide the --enable-freetype-build argument to configure) Again, do NOT run 'make install' after you run 'make'. Alternatively, you may compile using the provided XCode project, which should result in a BZFlag application in the generated "build" folder if there were no compilation errors. NOTICE: If you're compiling from source, it is expected that you have sufficient/proficient understanding of how to compile applications on the command line or using XCode and how to perform compilation troubleshooting without assistance. This holds particularly true for all alpha/beta testing releases as well as for any sources pulled directly from the Subversion source repository checkout. If you have problems building from a checkout, you should try building from an official release that we have posted to SourceForge to see if you can duplicate the issue, and then ask us for assistance. See the instructions in README and INSTALL for more details. bzflag-2.4.2+ds1/README.SDL000066400000000000000000000014431200563112200147420ustar00rootroot00000000000000README for SDL platforms ------------------------ BZFlag has a working cross-platform SDL interface that may be used for graphics, event/input handling, media file support, and more. The SDL build is enabled by default on most platforms. To disable it, you must tell the configure script: ./configure --without-SDL For information on enabling SDL on windows builds, see README.WINDOWS See the BUGS and TODO files for known issues. --- The Simple DirectMedia Layer (SDL for short) is a cross-platform library designed to make it easy to write multi-media software, such as games and emulators. The Simple DirectMedia Layer library source code is available from: http://www.libsdl.org/ This library is distributed under the terms of the GNU LGPL license: http://www.gnu.org/copyleft/lesser.html bzflag-2.4.2+ds1/README.SOLARIS000066400000000000000000000063251200563112200154400ustar00rootroot00000000000000README for Solaris platforms ---------------------------- The Solaris port has contributions from Bjorn Augustsson and Andrew White. Bjorn found and fixed a number of problems, which crs merged into the first offical release. Andrew added platform dependent files and is implementing the sound code. Packaging code still needs doing, too. Bjorn's fixes included: * `sun' reserved on Solaris; had to rename some variables * SIG_PF doesn't need to be defined * sun's OpenGL uses macros for glColor*() (bzflag uses the address of glColor*() in one place; had to change that by wrapping glColor*() in a function.) * must use the defines for the float math functions * change fcntl FNDELAY to fcntl O_NDELAY * change ioctl FIONBIO to fcntl O_NDELAY * hstrerror() doesn't exist * changed u_int16_t and u_int32_t to uint16_t and uint32_t * INADDR_NONE not defined -- If you have a modern gcc and old Sun X headers, you may need to add -fpermissive to CFLAGS and CXXFLAGS in src/platform/Makefile. -- Due to changes and the new usage of std::map, gcc 2.95.2 no longer builds bzflag on solaris. gcc 3.x works fine. -- The following are the comments of Andrew White. 22nd June 1999 Changes: -------- - Sound now works ok. Only 16bit stereo is supported, so if your card isn't up to date then it won't work - sorry! Known Problems: --------------- - Still no package installation - bzflag doesn't work when I use WindowMaker - it displays a large window then core dumps! I still haven't figured this one out yet. It seems to be an intermittent problem. Try 'bzflag -window' instead of full screen. This "usually" works. Any ideas? 17th June 1999 This port is work in progress. Currently, there is no sound support, but should be available very soon. Known Problems: --------------- - Sound doesn't work! It's not been implemented yet! I have an almost working version but wasn't willing to release it until it's finished - can't have Chris's hard work core dumping now can we! - There's no package installation for Solaris Again, this isn't so important yet. You should be able to run bzflag quite happily from the build directory. - I have an Elite3D graphics card and an Ultra-60 with loads of memory, but bzflag runs really slow when I move the quality to medium or high? The Elite3D card was produced by Sun to fill market demand. Unfortunately, this demand doesn't involve doing the kind of texture mapping that you normally find in everyday games and simulations. In order to get superior performance for texture mapping, you have to place enough memory on the frame buffer to hold the textures. The Elite3D only permits a 16x16 tex map and holds ALL textures in the main memory of your workstation! As a result performance is particularly poor. The only way around this is to talk Sun into developing a leading edge graphics card that supports texture mapping, or, talk to some of the PCI card manufacturers - maybe one of them is willing to write the drivers for a voodoo card! - bzflag doesn't work when I use WindowMaker - it displays a large window then core dumps! I'm still looking into this one. Try using dtwm or olwm instead. For any comments please mail me at: andrew.white@sun.com bzflag-2.4.2+ds1/README.WINDOWS000066400000000000000000000053761200563112200154630ustar00rootroot00000000000000README for Windows (32- and 64-bit) platforms --------------------------------------------- **Compilers** BZFlag uses Microsoft Visual C++ for its prebuilt binary releases and project files are provided for it. The current compiler used is Visual C++ 2010 (VC10). Both the full and express versions will build just fine. Visual Studio 6.0, 7.1, 8.0 and 9.0 support has been discontinued, and no projects are provided for these versions. It is also possible to build on Windows using MinGW/MSYS or Cygwin, both of which use a unix-style autotools build system; for details, see README.MINGW32 (for MinGW) or the main README (for Cygwin). The most common way to build on windows is to use Visual C++. The freely available VC10 EE edition is well suited to users who wish to compile the client for personal use. It can be found at http://www.microsoft.com/express/download/. Please note that the free versions of Visual C++ do not allow for the re-distribution of compiled applications, and link to runtime libraries that only exist on systems that have the same VC EE version. If you wish to distribute pre-made binary images of bzflag, then you will have to ether use the full (retail, or student) versions of the compiler or use one of the other free solutions (minGW). For more info on compiling with minGW please see the README.MINGW32 that was included in this source package. The rest of this document will refer to the build process using Visual C++ 10.0 (2010). **Targets** There are a total of 4 build targets in the VC projects. Release and Debug targets are configured so that they will "build out of the box" for the majority of users. Both targets are provided for both 32 and 64 bit binaries. Please note that there is no real performance advantage in having a 64 bit BZFlag client, the game does not use that much ram. **Required Libraries** You will need the windows DirectX SDK (download at hhttp://www.microsoft.com/download/en/details.aspx?displaylang=en&id=6812) You may also need to install curses and NSIS to do a full distribution build. Public Domain Curses is at http://sourceforge.net/projects/pdcurses/files/ . The release notes file there explains which .zip file to use. **Running and Debugging** By default the compiler will copy the compiled executables to the root level of the source drive ( the same place that the data dir is at). From there you can simply double click the application to run it. If you wish to debug the program, you must set the debug executable path and working directory inside VC to use this executable and path. **Installer** If you wish to build the full release package using the fullbuild solution, you will need to have NSIS installed. The built installer will be placed in the _bin folder for the target in the root of the source tree. bzflag-2.4.2+ds1/README.XMINGW000066400000000000000000000061161200563112200153330ustar00rootroot00000000000000This README describe a way to build from a linux PC executable for M$ My favourite distribution is gentoo, so I'm going to go step by step on this. We need to emerge the 4 packet that build the cross platform factory: - xmingw-binutils - xmingw-gcc - xmingw-w32api - xmingw-runtime xmingw-binutils should be at least the version 2.15.90.0.2 This operation should be made by superuser. # emerge xmingw-runtime It seems the g++ is enabled only if you re-emerge xmingw-gcc. So, as bzflag is written in c++: # emerge xmingw-gcc Next operation are available to a non super-user too, so a normal user is the preferred way. Add to your path the cross compilation factory directory: $ export PATH=/opt/xmingw/bin:$PATH ------ c-ares Get c-ares source, untar them and create a directory where to build the c-ares. Go to this brand new directory and type: ../c-ares-1.2.1/configure \ --host=i386-mingw32msvc --build=i686-pc-linux-gnu \ --prefix=/opt/xmingw/i386-mingw32msvc make make install Last operation require /opt/xmingw being writeable ------ curl Get curl source, untar them and create a directory where to build the curl. There is a bug on curl when trying to detect the c-ares library. So go to the curl directory and apply the patch to configure.ac - LIBS="$LIBS -lcares" + AC_CHECK_LIB(cares, ares_cancel) then run autoconf from the same directory Go to the directory where to build and type: ../curl-7.14.0/configure --host=i386-mingw32msvc --build=i686-pc-linux-gnu \ --prefix=/opt/xmingw --enable-ares --disable-shared make make install apply the patch to /opt/xmingw/bin/curl-config: --- curl-config.orig 2005-05-22 22:52:16.000000000 +0200 +++ curl-config 2005-05-22 22:54:56.000000000 +0200 @@ -120,9 +120,9 @@ --cflags) if test "X${prefix}/include" = "X/usr/include"; then - echo "" + echo "-DBUILDING_LIBCURL" else - echo "-I${prefix}/include" + echo "-I${prefix}/include -DBUILDING_LIBCURL" fi ;; Last operations require /opt/xmingw being writeable ------ libSDL Get libSDL source, untar them and create a directory where to build it. Get some extra windows file that libSDL needs: http://www.libsdl.org/extras/win32/common/directx-devel.tar.gz Create a new directory and unpack the directx-devel file here. You'll have an include directory and a lib directory. Copy all the file from the include directory into /opt/xmingw/i386-mingw32msvc/include/ . You need su privileges to do that. Type ../SDL-1.2.8/configure --host=i386-mingw32msvc --build=i686-pc-linux-gnu \ --prefix=/opt/xmingw make make install ------ bzflag Now, time to get a copy of bzflag, from SVN or from source tarball. When you have your source tree exploded, go to the root of this tree and: $ sh autogen.sh Now create a build directory where you'll generate: $ mkdir ../distmw $ cd ../distmw and configure the build directory to use the cross-factory: $ ../bzflag/configure --host=i386-mingw32msvc --build=i686-pc-linux-gnu \ --without-x --enable-debug --disable-plugins --prefix=`pwd`/bindist $ make $ make install bzflag-2.4.2+ds1/TODO000066400000000000000000000001071200563112200141250ustar00rootroot00000000000000See Development Roadmap at http://wiki.bzflag.org/Development_RoadMap bzflag-2.4.2+ds1/aclocal.m4000066400000000000000000001031331200563112200153000ustar00rootroot00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/cache.m4]) m4_include([m4/curses.m4]) m4_include([m4/isnan.m4]) m4_include([m4/libcurl.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/mkdirp.m4]) m4_include([m4/sdl.m4]) m4_include([m4/stage.m4]) bzflag-2.4.2+ds1/authors.xml000066400000000000000000000013001200563112200156400ustar00rootroot00000000000000 Jeff Myers <JeffM2501@users.sourceforge.net> Tim Riker <Tim@Rikers.org> Frank Thilo <thilo@unix-ag.org> David Trowbridge <trowbrds@gmail.com> Sean Morrison <learner@brlcad.org> Alfredo Tupone <alfredo@tupone.it> Daniel Remenak <dtremenak@users.sourceforge.net> bzflag-2.4.2+ds1/autogen.sh000077500000000000000000001301431200563112200154420ustar00rootroot00000000000000#!/bin/sh # a u t o g e n . s h # # Copyright (c) 2005-2007 United States Government as represented by # the U.S. Army Research Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # # 3. The name of the author may not be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ### # # Script for automatically preparing the sources for compilation by # performing the myrid of necessary steps. The script attempts to # detect proper version support, and outputs warnings about particular # systems that have autotool peculiarities. # # Basically, if everything is set up and installed correctly, the # script will validate that minimum versions of the GNU Build System # tools are installed, account for several common configuration # issues, and then simply run autoreconf for you. # # If autoreconf fails, which can happen for many valid configurations, # this script proceeds to run manual preparation steps effectively # providing a POSIX shell script (mostly complete) reimplementation of # autoreconf. # # The AUTORECONF, AUTOCONF, AUTOMAKE, LIBTOOLIZE, ACLOCAL, AUTOHEADER # environment variables and corresponding _OPTIONS variables (e.g. # AUTORECONF_OPTIONS) may be used to override the default automatic # detection behaviors. Similarly the _VERSION variables will override # the minimum required version numbers. # # Examples: # # To obtain help on usage: # ./autogen.sh --help # # To obtain verbose output: # ./autogen.sh --verbose # # To skip autoreconf and prepare manually: # AUTORECONF=false ./autogen.sh # # To verbosely try running with an older (unsupported) autoconf: # AUTOCONF_VERSION=2.50 ./autogen.sh --verbose # # Author: Christopher Sean Morrison # ###################################################################### # set to minimum acceptible version of autoconf if [ "x$AUTOCONF_VERSION" = "x" ] ; then AUTOCONF_VERSION=2.52 fi # set to minimum acceptible version of automake if [ "x$AUTOMAKE_VERSION" = "x" ] ; then AUTOMAKE_VERSION=1.6.0 fi # set to minimum acceptible version of libtool if [ "x$LIBTOOL_VERSION" = "x" ] ; then LIBTOOL_VERSION=1.4.2 fi ################## # ident function # ################## ident ( ) { # extract copyright from header __copyright="`grep Copyright $AUTOGEN_SH | head -${HEAD_N}1 | awk '{print $4}'`" if [ "x$__copyright" = "x" ] ; then __copyright="`date +%Y`" fi # extract version from CVS Id string __id="$Id: autogen.sh 22324 2012-01-16 18:12:13Z bullet_catcher $" __version="`echo $__id | sed 's/.*\([0-9][0-9][0-9][0-9]\)[-\/]\([0-9][0-9]\)[-\/]\([0-9][0-9]\).*/\1\2\3/'`" if [ "x$__version" = "x" ] ; then __version="" fi echo "autogen.sh build preparation script by Christopher Sean Morrison" echo "revised 3-clause BSD-style license, copyright (c) $__copyright" echo "script version $__version, ISO/IEC 9945 POSIX shell script" } ################## # USAGE FUNCTION # ################## usage ( ) { echo "Usage: $AUTOGEN_SH [-h|--help] [-v|--verbose] [-q|--quiet] [--version]" echo " --help Help on $NAME_OF_AUTOGEN usage" echo " --verbose Verbose progress output" echo " --quiet Quiet suppressed progress output" echo " --version Only perform GNU Build System version checks" echo echo "Description: This script will validate that minimum versions of the" echo "GNU Build System tools are installed and then run autoreconf for you." echo "Should autoreconf fail, manual preparation steps will be run" echo "potentially accounting for several common preparation issues. The" echo "AUTORECONF, AUTOCONF, AUTOMAKE, LIBTOOLIZE, ACLOCAL, AUTOHEADER," echo "PROJECT, & CONFIGURE environment variables and corresponding _OPTIONS" echo "variables (e.g. AUTORECONF_OPTIONS) may be used to override the" echo "default automatic detection behavior." echo ident return 0 } ########################## # VERSION_ERROR FUNCTION # ########################## version_error ( ) { if [ "x$1" = "x" ] ; then echo "INTERNAL ERROR: version_error was not provided a version" exit 1 fi if [ "x$2" = "x" ] ; then echo "INTERNAL ERROR: version_error was not provided an application name" exit 1 fi $ECHO $ECHO "ERROR: To prepare the ${PROJECT} build system from scratch," $ECHO " at least version $1 of $2 must be installed." $ECHO $ECHO "$NAME_OF_AUTOGEN does not need to be run on the same machine that will" $ECHO "run configure or make. Either the GNU Autotools will need to be installed" $ECHO "or upgraded on this system, or $NAME_OF_AUTOGEN must be run on the source" $ECHO "code on another system and then transferred to here. -- Cheers!" $ECHO } ########################## # VERSION_CHECK FUNCTION # ########################## version_check ( ) { if [ "x$1" = "x" ] ; then echo "INTERNAL ERROR: version_check was not provided a minimum version" exit 1 fi _min="$1" if [ "x$2" = "x" ] ; then echo "INTERNAL ERROR: version check was not provided a comparison version" exit 1 fi _cur="$2" # needed to handle versions like 1.10 and 1.4-p6 _min="`echo ${_min}. | sed 's/[^0-9]/./g' | sed 's/\.\././g'`" _cur="`echo ${_cur}. | sed 's/[^0-9]/./g' | sed 's/\.\././g'`" _min_major="`echo $_min | cut -d. -f1`" _min_minor="`echo $_min | cut -d. -f2`" _min_patch="`echo $_min | cut -d. -f3`" _cur_major="`echo $_cur | cut -d. -f1`" _cur_minor="`echo $_cur | cut -d. -f2`" _cur_patch="`echo $_cur | cut -d. -f3`" if [ "x$_min_major" = "x" ] ; then _min_major=0 fi if [ "x$_min_minor" = "x" ] ; then _min_minor=0 fi if [ "x$_min_patch" = "x" ] ; then _min_patch=0 fi if [ "x$_cur_minor" = "x" ] ; then _cur_major=0 fi if [ "x$_cur_minor" = "x" ] ; then _cur_minor=0 fi if [ "x$_cur_patch" = "x" ] ; then _cur_patch=0 fi $VERBOSE_ECHO "Checking if ${_cur_major}.${_cur_minor}.${_cur_patch} is greater than ${_min_major}.${_min_minor}.${_min_patch}" if [ $_min_major -lt $_cur_major ] ; then return 0 elif [ $_min_major -eq $_cur_major ] ; then if [ $_min_minor -lt $_cur_minor ] ; then return 0 elif [ $_min_minor -eq $_cur_minor ] ; then if [ $_min_patch -lt $_cur_patch ] ; then return 0 elif [ $_min_patch -eq $_cur_patch ] ; then return 0 fi fi fi return 1 } ###################################### # LOCATE_CONFIGURE_TEMPLATE FUNCTION # ###################################### locate_configure_template ( ) { _pwd="`pwd`" if test -f "./configure.ac" ; then echo "./configure.ac" elif test -f "./configure.in" ; then echo "./configure.in" elif test -f "$_pwd/configure.ac" ; then echo "$_pwd/configure.ac" elif test -f "$_pwd/configure.in" ; then echo "$_pwd/configure.in" elif test -f "$PATH_TO_AUTOGEN/configure.ac" ; then echo "$PATH_TO_AUTOGEN/configure.ac" elif test -f "$PATH_TO_AUTOGEN/configure.in" ; then echo "$PATH_TO_AUTOGEN/configure.in" fi } ################## # argument check # ################## ARGS="$*" PATH_TO_AUTOGEN="`dirname $0`" NAME_OF_AUTOGEN="`basename $0`" AUTOGEN_SH="$PATH_TO_AUTOGEN/$NAME_OF_AUTOGEN" LIBTOOL_M4="${PATH_TO_AUTOGEN}/misc/libtool.m4" if [ "x$HELP" = "x" ] ; then HELP=no fi if [ "x$QUIET" = "x" ] ; then QUIET=no fi if [ "x$VERBOSE" = "x" ] ; then VERBOSE=no fi if [ "x$VERSION_ONLY" = "x" ] ; then VERSION_ONLY=no fi if [ "x$AUTORECONF_OPTIONS" = "x" ] ; then AUTORECONF_OPTIONS="-i -f" fi if [ "x$AUTOCONF_OPTIONS" = "x" ] ; then AUTOCONF_OPTIONS="-f" fi if [ "x$AUTOMAKE_OPTIONS" = "x" ] ; then AUTOMAKE_OPTIONS="-a -c -f" fi ALT_AUTOMAKE_OPTIONS="-a -c" if [ "x$LIBTOOLIZE_OPTIONS" = "x" ] ; then LIBTOOLIZE_OPTIONS="--automake -c -f" fi ALT_LIBTOOLIZE_OPTIONS="--automake --copy --force" if [ "x$ACLOCAL_OPTIONS" = "x" ] ; then ACLOCAL_OPTIONS="" fi if [ "x$AUTOHEADER_OPTIONS" = "x" ] ; then AUTOHEADER_OPTIONS="" fi for arg in $ARGS ; do case "x$arg" in x--help) HELP=yes ;; x-[hH]) HELP=yes ;; x--quiet) QUIET=yes ;; x-[qQ]) QUIET=yes ;; x--verbose) VERBOSE=yes ;; x-[vV]) VERBOSE=yes ;; x--version) VERSION_ONLY=yes ;; *) echo "Unknown option: $arg" echo usage exit 1 ;; esac done ##################### # environment check # ##################### # sanity check before recursions potentially begin if [ ! -f "$AUTOGEN_SH" ] ; then echo "INTERNAL ERROR: $AUTOGEN_SH does not exist" if [ ! "x$0" = "x$AUTOGEN_SH" ] ; then echo "INTERNAL ERROR: dirname/basename inconsistency: $0 != $AUTOGEN_SH" fi exit 1 fi # force locale setting to C so things like date output as expected LC_ALL=C # commands that this script expects for __cmd in echo head tail pwd ; do echo "test" | $__cmd > /dev/null 2>&1 if [ $? != 0 ] ; then echo "INTERNAL ERROR: '${__cmd}' command is required" exit 2 fi done echo "test" | grep "test" > /dev/null 2>&1 if test ! x$? = x0 ; then echo "INTERNAL ERROR: grep command is required" exit 1 fi echo "test" | sed "s/test/test/" > /dev/null 2>&1 if test ! x$? = x0 ; then echo "INTERNAL ERROR: sed command is required" exit 1 fi # determine the behavior of echo case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac # determine the behavior of head case "x`echo 'head' | head -n 1 2>&1`" in *xhead*) HEAD_N="n " ;; *) HEAD_N="" ;; esac # determine the behavior of tail case "x`echo 'tail' | tail -n 1 2>&1`" in *xtail*) TAIL_N="n " ;; *) TAIL_N="" ;; esac VERBOSE_ECHO=: ECHO=: if [ "x$QUIET" = "xyes" ] ; then if [ "x$VERBOSE" = "xyes" ] ; then echo "Verbose output quelled by quiet option. Further output disabled." fi else ECHO=echo if [ "x$VERBOSE" = "xyes" ] ; then echo "Verbose output enabled" VERBOSE_ECHO=echo fi fi # allow a recursive run to disable further recursions if [ "x$RUN_RECURSIVE" = "x" ] ; then RUN_RECURSIVE=yes fi ################################################ # check for help arg and bypass version checks # ################################################ if [ "x`echo $ARGS | sed 's/.*[hH][eE][lL][pP].*/help/'`" = "xhelp" ] ; then HELP=yes fi if [ "x$HELP" = "xyes" ] ; then usage $ECHO "---" $ECHO "Help was requested. No preparation or configuration will be performed." exit 0 fi ####################### # set up signal traps # ####################### untrap_abnormal ( ) { for sig in 1 2 13 15; do trap - $sig done } # do this cleanup whenever we exit. trap ' # start from the root if test -d "$START_PATH" ; then cd "$START_PATH" fi # restore/delete backup files if test "x$PFC_INIT" = "x1" ; then recursive_restore fi ' 0 # trap SIGHUP (1), SIGINT (2), SIGPIPE (13), SIGTERM (15) for sig in 1 2 13 15; do trap ' $ECHO "" $ECHO "Aborting $NAME_OF_AUTOGEN: caught signal '$sig'" # start from the root if test -d "$START_PATH" ; then cd "$START_PATH" fi # clean up on abnormal exit $VERBOSE_ECHO "rm -rf autom4te.cache" rm -rf autom4te.cache if test -f "acinclude.m4.$$.backup" ; then $VERBOSE_ECHO "cat acinclude.m4.$$.backup > acinclude.m4" chmod u+w acinclude.m4 cat acinclude.m4.$$.backup > acinclude.m4 $VERBOSE_ECHO "rm -f acinclude.m4.$$.backup" rm -f acinclude.m4.$$.backup fi { (exit 1); exit 1; } ' $sig done ############################# # look for a configure file # ############################# if [ "x$CONFIGURE" = "x" ] ; then CONFIGURE="`locate_configure_template`" if [ ! "x$CONFIGURE" = "x" ] ; then $VERBOSE_ECHO "Found a configure template: $CONFIGURE" fi else $ECHO "Using CONFIGURE environment variable override: $CONFIGURE" fi if [ "x$CONFIGURE" = "x" ] ; then if [ "x$VERSION_ONLY" = "xyes" ] ; then CONFIGURE=/dev/null else $ECHO $ECHO "A configure.ac or configure.in file could not be located implying" $ECHO "that the GNU Build System is at least not used in this directory. In" $ECHO "any case, there is nothing to do here without one of those files." $ECHO $ECHO "ERROR: No configure.in or configure.ac file found in `pwd`" exit 1 fi fi #################### # get project name # #################### if [ "x$PROJECT" = "x" ] ; then PROJECT="`grep AC_INIT $CONFIGURE | grep -v '.*#.*AC_INIT' | tail -${TAIL_N}1 | sed 's/^[ ]*AC_INIT(\([^,)]*\).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" if [ "x$PROJECT" = "xAC_INIT" ] ; then # projects might be using the older/deprecated arg-less AC_INIT .. look for AM_INIT_AUTOMAKE instead PROJECT="`grep AM_INIT_AUTOMAKE $CONFIGURE | grep -v '.*#.*AM_INIT_AUTOMAKE' | tail -${TAIL_N}1 | sed 's/^[ ]*AM_INIT_AUTOMAKE(\([^,)]*\).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" fi if [ "x$PROJECT" = "xAM_INIT_AUTOMAKE" ] ; then PROJECT="project" fi if [ "x$PROJECT" = "x" ] ; then PROJECT="project" fi else $ECHO "Using PROJECT environment variable override: $PROJECT" fi $ECHO "Preparing the $PROJECT build system...please wait" $ECHO ######################## # check for autoreconf # ######################## HAVE_AUTORECONF=no if [ "x$AUTORECONF" = "x" ] ; then for AUTORECONF in autoreconf ; do $VERBOSE_ECHO "Checking autoreconf version: $AUTORECONF --version" $AUTORECONF --version > /dev/null 2>&1 if [ $? = 0 ] ; then HAVE_AUTORECONF=yes break fi done else HAVE_AUTORECONF=yes $ECHO "Using AUTORECONF environment variable override: $AUTORECONF" fi ########################## # autoconf version check # ########################## _acfound=no if [ "x$AUTOCONF" = "x" ] ; then for AUTOCONF in autoconf ; do $VERBOSE_ECHO "Checking autoconf version: $AUTOCONF --version" $AUTOCONF --version > /dev/null 2>&1 if [ $? = 0 ] ; then _acfound=yes break fi done else _acfound=yes $ECHO "Using AUTOCONF environment variable override: $AUTOCONF" fi _report_error=no if [ ! "x$_acfound" = "xyes" ] ; then $ECHO "ERROR: Unable to locate GNU Autoconf." _report_error=yes else _version="`$AUTOCONF --version | head -${HEAD_N}1 | sed 's/[^0-9]*\([0-9\.][0-9\.]*\)/\1/'`" if [ "x$_version" = "x" ] ; then _version="0.0.0" fi $ECHO "Found GNU Autoconf version $_version" version_check "$AUTOCONF_VERSION" "$_version" if [ $? -ne 0 ] ; then _report_error=yes fi fi if [ "x$_report_error" = "xyes" ] ; then version_error "$AUTOCONF_VERSION" "GNU Autoconf" exit 1 fi ########################## # automake version check # ########################## _amfound=no if [ "x$AUTOMAKE" = "x" ] ; then for AUTOMAKE in automake ; do $VERBOSE_ECHO "Checking automake version: $AUTOMAKE --version" $AUTOMAKE --version > /dev/null 2>&1 if [ $? = 0 ] ; then _amfound=yes break fi done else _amfound=yes $ECHO "Using AUTOMAKE environment variable override: $AUTOMAKE" fi _report_error=no if [ ! "x$_amfound" = "xyes" ] ; then $ECHO $ECHO "ERROR: Unable to locate GNU Automake." _report_error=yes else _version="`$AUTOMAKE --version | head -${HEAD_N}1 | sed 's/[^0-9]*\([0-9\.][0-9\.]*\)/\1/'`" if [ "x$_version" = "x" ] ; then _version="0.0.0" fi $ECHO "Found GNU Automake version $_version" version_check "$AUTOMAKE_VERSION" "$_version" if [ $? -ne 0 ] ; then _report_error=yes fi fi if [ "x$_report_error" = "xyes" ] ; then version_error "$AUTOMAKE_VERSION" "GNU Automake" exit 1 fi ######################## # check for libtoolize # ######################## HAVE_LIBTOOLIZE=yes HAVE_ALT_LIBTOOLIZE=no _ltfound=no if [ "x$LIBTOOLIZE" = "x" ] ; then LIBTOOLIZE=libtoolize $VERBOSE_ECHO "Checking libtoolize version: $LIBTOOLIZE --version" $LIBTOOLIZE --version > /dev/null 2>&1 if [ ! $? = 0 ] ; then HAVE_LIBTOOLIZE=no $ECHO if [ "x$HAVE_AUTORECONF" = "xno" ] ; then $ECHO "Warning: libtoolize does not appear to be available." else $ECHO "Warning: libtoolize does not appear to be available. This means that" $ECHO "the automatic build preparation via autoreconf will probably not work." $ECHO "Preparing the build by running each step individually, however, should" $ECHO "work and will be done automatically for you if autoreconf fails." fi # look for some alternates for tool in glibtoolize libtoolize15 libtoolize14 libtoolize13 ; do $VERBOSE_ECHO "Checking libtoolize alternate: $tool --version" _glibtoolize="`$tool --version > /dev/null 2>&1`" if [ $? = 0 ] ; then $VERBOSE_ECHO "Found $tool --version" _glti="`which $tool`" if [ "x$_glti" = "x" ] ; then $VERBOSE_ECHO "Cannot find $tool with which" continue; fi if test ! -f "$_glti" ; then $VERBOSE_ECHO "Cannot use $tool, $_glti is not a file" continue; fi _gltidir="`dirname $_glti`" if [ "x$_gltidir" = "x" ] ; then $VERBOSE_ECHO "Cannot find $tool path with dirname of $_glti" continue; fi if test ! -d "$_gltidir" ; then $VERBOSE_ECHO "Cannot use $tool, $_gltidir is not a directory" continue; fi HAVE_ALT_LIBTOOLIZE=yes LIBTOOLIZE="$tool" $ECHO $ECHO "Fortunately, $tool was found which means that your system may simply" $ECHO "have a non-standard or incomplete GNU Autotools install. If you have" $ECHO "sufficient system access, it may be possible to quell this warning by" $ECHO "running:" $ECHO sudo -V > /dev/null 2>&1 if [ $? = 0 ] ; then $ECHO " sudo ln -s $_glti $_gltidir/libtoolize" $ECHO else $ECHO " ln -s $_glti $_gltidir/libtoolize" $ECHO $ECHO "Run that as root or with proper permissions to the $_gltidir directory" $ECHO fi _ltfound=yes break fi done else _ltfound=yes fi else _ltfound=yes $ECHO "Using LIBTOOLIZE environment variable override: $LIBTOOLIZE" fi ############################ # libtoolize version check # ############################ _report_error=no if [ ! "x$_ltfound" = "xyes" ] ; then $ECHO $ECHO "ERROR: Unable to locate GNU Libtool." _report_error=yes else _version="`$LIBTOOLIZE --version | head -${HEAD_N}1 | sed 's/[^0-9]*\([0-9\.][0-9\.]*\)/\1/'`" if [ "x$_version" = "x" ] ; then _version="0.0.0" fi $ECHO "Found GNU Libtool version $_version" version_check "$LIBTOOL_VERSION" "$_version" if [ $? -ne 0 ] ; then _report_error=yes fi fi if [ "x$_report_error" = "xyes" ] ; then version_error "$LIBTOOL_VERSION" "GNU Libtool" exit 1 fi ##################### # check for aclocal # ##################### if [ "x$ACLOCAL" = "x" ] ; then for ACLOCAL in aclocal ; do $VERBOSE_ECHO "Checking aclocal version: $ACLOCAL --version" $ACLOCAL --version > /dev/null 2>&1 if [ $? = 0 ] ; then break fi done else $ECHO "Using ACLOCAL environment variable override: $ACLOCAL" fi ######################## # check for autoheader # ######################## if [ "x$AUTOHEADER" = "x" ] ; then for AUTOHEADER in autoheader ; do $VERBOSE_ECHO "Checking autoheader version: $AUTOHEADER --version" $AUTOHEADER --version > /dev/null 2>&1 if [ $? = 0 ] ; then break fi done else $ECHO "Using AUTOHEADER environment variable override: $AUTOHEADER" fi ######################### # check if version only # ######################### $VERBOSE_ECHO "Checking whether to only output version information" if [ "x$VERSION_ONLY" = "xyes" ] ; then $ECHO ident $ECHO "---" $ECHO "Version requested. No preparation or configuration will be performed." exit 0 fi ################################# # PROTECT_FROM_CLOBBER FUNCTION # ################################# protect_from_clobber ( ) { PFC_INIT=1 # protect COPYING & INSTALL from overwrite by automake. the # automake force option will (inappropriately) ignore the existing # contents of a COPYING and/or INSTALL files (depending on the # version) instead of just forcing *missing* files like it does # for AUTHORS, NEWS, and README. this is broken but extremely # prevalent behavior, so we protect against it by keeping a backup # of the file that can later be restored. if test -f COPYING ; then if test -f COPYING.$$.protect_from_automake.backup ; then $VERBOSE_ECHO "Already backed up COPYING in `pwd`" else $VERBOSE_ECHO "Backing up COPYING in `pwd`" $VERBOSE_ECHO "cp -p COPYING COPYING.$$.protect_from_automake.backup" cp -p COPYING COPYING.$$.protect_from_automake.backup fi fi if test -f INSTALL ; then if test -f INSTALL.$$.protect_from_automake.backup ; then $VERBOSE_ECHO "Already backed up INSTALL in `pwd`" else $VERBOSE_ECHO "Backing up INSTALL in `pwd`" $VERBOSE_ECHO "cp -p INSTALL INSTALL.$$.protect_from_automake.backup" cp -p INSTALL INSTALL.$$.protect_from_automake.backup fi fi } ############################## # RECURSIVE_PROTECT FUNCTION # ############################## recursive_protect ( ) { # for projects using recursive configure, run the build # preparation steps for the subdirectories. this function assumes # START_PATH was set to pwd before recursion begins so that # relative paths work. # git 'r done, protect COPYING and INSTALL from being clobbered protect_from_clobber if test -d autom4te.cache ; then $VERBOSE_ECHO "Found an autom4te.cache directory, deleting it" $VERBOSE_ECHO "rm -rf autom4te.cache" rm -rf autom4te.cache fi # find configure template _configure="`locate_configure_template`" if [ "x$_configure" = "x" ] ; then return fi # $VERBOSE_ECHO "Looking for configure template found `pwd`/$_configure" # look for subdirs # $VERBOSE_ECHO "Looking for subdirs in `pwd`" _det_config_subdirs="`grep AC_CONFIG_SUBDIRS $_configure | grep -v '.*#.*AC_CONFIG_SUBDIRS' | sed 's/^[ ]*AC_CONFIG_SUBDIRS(\(.*\)).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" CHECK_DIRS="" for dir in $_det_config_subdirs ; do if test -d "`pwd`/$dir" ; then CHECK_DIRS="$CHECK_DIRS \"`pwd`/$dir\"" fi done # process subdirs if [ ! "x$CHECK_DIRS" = "x" ] ; then $VERBOSE_ECHO "Recursively scanning the following directories:" $VERBOSE_ECHO " $CHECK_DIRS" for dir in $CHECK_DIRS ; do $VERBOSE_ECHO "Protecting files from automake in $dir" cd "$START_PATH" eval "cd $dir" # recursively git 'r done recursive_protect done fi } # end of recursive_protect ############################# # RESTORE_CLOBBERED FUNCION # ############################# restore_clobbered ( ) { # The automake (and autoreconf by extension) -f/--force-missing # option may overwrite COPYING and INSTALL even if they do exist. # Here we restore the files if necessary. spacer=no # COPYING if test -f COPYING.$$.protect_from_automake.backup ; then if test -f COPYING ; then # compare entire content, restore if needed if test "x`cat COPYING`" != "x`cat COPYING.$$.protect_from_automake.backup`" ; then if test "x$spacer" = "xno" ; then $VERBOSE_ECHO spacer=yes fi # restore the backup $VERBOSE_ECHO "Restoring COPYING from backup (automake -f likely clobbered it)" $VERBOSE_ECHO "rm -f COPYING" rm -f COPYING $VERBOSE_ECHO "mv COPYING.$$.protect_from_automake.backup COPYING" mv COPYING.$$.protect_from_automake.backup COPYING fi # check contents elif test -f COPYING.$$.protect_from_automake.backup ; then $VERBOSE_ECHO "mv COPYING.$$.protect_from_automake.backup COPYING" mv COPYING.$$.protect_from_automake.backup COPYING fi # -f COPYING # just in case $VERBOSE_ECHO "rm -f COPYING.$$.protect_from_automake.backup" rm -f COPYING.$$.protect_from_automake.backup fi # -f COPYING.$$.protect_from_automake.backup # INSTALL if test -f INSTALL.$$.protect_from_automake.backup ; then if test -f INSTALL ; then # compare entire content, restore if needed if test "x`cat INSTALL`" != "x`cat INSTALL.$$.protect_from_automake.backup`" ; then if test "x$spacer" = "xno" ; then $VERBOSE_ECHO spacer=yes fi # restore the backup $VERBOSE_ECHO "Restoring INSTALL from backup (automake -f likely clobbered it)" $VERBOSE_ECHO "rm -f INSTALL" rm -f INSTALL $VERBOSE_ECHO "mv INSTALL.$$.protect_from_automake.backup INSTALL" mv INSTALL.$$.protect_from_automake.backup INSTALL fi # check contents elif test -f INSTALL.$$.protect_from_automake.backup ; then $VERBOSE_ECHO "mv INSTALL.$$.protect_from_automake.backup INSTALL" mv INSTALL.$$.protect_from_automake.backup INSTALL fi # -f INSTALL # just in case $VERBOSE_ECHO "rm -f INSTALL.$$.protect_from_automake.backup" rm -f INSTALL.$$.protect_from_automake.backup fi # -f INSTALL.$$.protect_from_automake.backup CONFIGURE="`locate_configure_template`" if [ "x$CONFIGURE" = "x" ] ; then return fi _aux_dir="`grep AC_CONFIG_AUX_DIR $CONFIGURE | grep -v '.*#.*AC_CONFIG_AUX_DIR' | tail -${TAIL_N}1 | sed 's/^[ ]*AC_CONFIG_AUX_DIR(\(.*\)).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" if test ! -d "$_aux_dir" ; then _aux_dir=. fi for file in config.guess config.sub ltmain.sh ; do if test -f "${_aux_dir}/${file}" ; then $VERBOSE_ECHO "rm -f \"${_aux_dir}/${file}.backup\"" rm -f "${_aux_dir}/${file}.backup" fi done } # end of restore_clobbered ############################## # RECURSIVE_RESTORE FUNCTION # ############################## recursive_restore ( ) { # restore COPYING and INSTALL from backup if they were clobbered # for each directory recursively. # git 'r undone restore_clobbered # find configure template _configure="`locate_configure_template`" if [ "x$_configure" = "x" ] ; then return fi # look for subdirs _det_config_subdirs="`grep AC_CONFIG_SUBDIRS $_configure | grep -v '.*#.*AC_CONFIG_SUBDIRS' | sed 's/^[ ]*AC_CONFIG_SUBDIRS(\(.*\)).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" CHECK_DIRS="" for dir in $_det_config_subdirs ; do if test -d "`pwd`/$dir" ; then CHECK_DIRS="$CHECK_DIRS \"`pwd`/$dir\"" fi done # process subdirs if [ ! "x$CHECK_DIRS" = "x" ] ; then $VERBOSE_ECHO "Recursively scanning the following directories:" $VERBOSE_ECHO " $CHECK_DIRS" for dir in $CHECK_DIRS ; do $VERBOSE_ECHO "Checking files for automake damage in $dir" cd "$START_PATH" eval "cd $dir" # recursively git 'r undone recursive_restore done fi } # end of recursive_restore ####################### # INITIALIZE FUNCTION # ####################### initialize ( ) { # this routine performs a variety of directory-specific # initializations. some are sanity checks, some are preventive, # and some are necessary setup detection. # # this function sets: # CONFIGURE # SEARCH_DIRS # CONFIG_SUBDIRS ################################## # check for a configure template # ################################## CONFIGURE="`locate_configure_template`" if [ "x$CONFIGURE" = "x" ] ; then $ECHO $ECHO "A configure.ac or configure.in file could not be located implying" $ECHO "that the GNU Build System is at least not used in this directory. In" $ECHO "any case, there is nothing to do here without one of those files." $ECHO $ECHO "ERROR: No configure.in or configure.ac file found in `pwd`" exit 1 fi ##################### # detect an aux dir # ##################### _aux_dir="`grep AC_CONFIG_AUX_DIR $CONFIGURE | grep -v '.*#.*AC_CONFIG_AUX_DIR' | tail -${TAIL_N}1 | sed 's/^[ ]*AC_CONFIG_AUX_DIR(\(.*\)).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" if test ! -d "$_aux_dir" ; then _aux_dir=. else $VERBOSE_ECHO "Detected auxillary directory: $_aux_dir" fi ################################ # detect a recursive configure # ################################ CONFIG_SUBDIRS="" _det_config_subdirs="`grep AC_CONFIG_SUBDIRS $CONFIGURE | grep -v '.*#.*AC_CONFIG_SUBDIRS' | sed 's/^[ ]*AC_CONFIG_SUBDIRS(\(.*\)).*/\1/' | sed 's/.*\[\(.*\)\].*/\1/'`" for dir in $_det_config_subdirs ; do if test -d "`pwd`/$dir" ; then $VERBOSE_ECHO "Detected recursive configure directory: `pwd`/$dir" CONFIG_SUBDIRS="$CONFIG_SUBDIRS `pwd`/$dir" fi done ########################################## # make sure certain required files exist # ########################################## for file in AUTHORS COPYING ChangeLog INSTALL NEWS README ; do if test ! -f $file ; then $VERBOSE_ECHO "Touching ${file} since it does not exist" touch $file fi done ################################################## # make sure certain generated files do not exist # ################################################## for file in config.guess config.sub ltmain.sh ; do if test -f "${_aux_dir}/${file}" ; then $VERBOSE_ECHO "mv -f \"${_aux_dir}/${file}\" \"${_aux_dir}/${file}.backup\"" mv -f "${_aux_dir}/${file}" "${_aux_dir}/${file}.backup" fi done ############################ # search alternate m4 dirs # ############################ SEARCH_DIRS="" for dir in m4 ; do if [ -d $dir ] ; then $VERBOSE_ECHO "Found extra aclocal search directory: $dir" SEARCH_DIRS="$SEARCH_DIRS -I $dir" fi done ###################################### # remove any previous build products # ###################################### if test -d autom4te.cache ; then $VERBOSE_ECHO "Found an autom4te.cache directory, deleting it" $VERBOSE_ECHO "rm -rf autom4te.cache" rm -rf autom4te.cache fi # tcl/tk (and probably others) have a customized aclocal.m4, so can't delete it # if test -f aclocal.m4 ; then # $VERBOSE_ECHO "Found an aclocal.m4 file, deleting it" # $VERBOSE_ECHO "rm -f aclocal.m4" # rm -f aclocal.m4 # fi } # end of initialize() ############## # initialize # ############## # stash path START_PATH="`pwd`" # Before running autoreconf or manual steps, some prep detection work # is necessary or useful. Only needs to occur once per directory, but # does need to traverse the entire subconfigure hierarchy to protect # files from being clobbered even by autoreconf. recursive_protect # start from where we started cd "$START_PATH" # get ready to process initialize ############################################ # prepare build via autoreconf or manually # ############################################ reconfigure_manually=no if [ "x$HAVE_AUTORECONF" = "xyes" ] ; then $ECHO $ECHO $ECHO_N "Automatically preparing build ... $ECHO_C" $VERBOSE_ECHO "$AUTORECONF $SEARCH_DIRS $AUTORECONF_OPTIONS" autoreconf_output="`$AUTORECONF $SEARCH_DIRS $AUTORECONF_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$autoreconf_output" if [ ! $ret = 0 ] ; then if [ "x$HAVE_ALT_LIBTOOLIZE" = "xyes" ] ; then if [ ! "x`echo \"$autoreconf_output\" | grep libtoolize | grep \"No such file or directory\"`" = "x" ] ; then $ECHO $ECHO "Warning: autoreconf failed but due to what is usually a common libtool" $ECHO "misconfiguration issue. This problem is encountered on systems that" $ECHO "have installed libtoolize under a different name without providing a" $ECHO "symbolic link or without setting the LIBTOOLIZE environment variable." $ECHO $ECHO "Restarting the preparation steps with LIBTOOLIZE set to $LIBTOOLIZE" export LIBTOOLIZE RUN_RECURSIVE=no export RUN_RECURSIVE untrap_abnormal $VERBOSE_ECHO sh $AUTOGEN_SH "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" sh "$AUTOGEN_SH" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" exit $? fi fi $ECHO "Warning: $AUTORECONF failed" if test -f ltmain.sh ; then $ECHO "libtoolize being run by autoreconf is not creating ltmain.sh in the auxillary directory like it should" fi $ECHO "Attempting to run the preparation steps individually" reconfigure_manually=yes fi else reconfigure_manually=yes fi ############################ # LIBTOOL_FAILURE FUNCTION # ############################ libtool_failure ( ) { # libtool is rather error-prone in comparison to the other # autotools and this routine attempts to compensate for some # common failures. the output after a libtoolize failure is # parsed for an error related to AC_PROG_LIBTOOL and if found, we # attempt to inject a project-provided libtool.m4 file. _autoconf_output="$1" if [ "x$RUN_RECURSIVE" = "xno" ] ; then # we already tried the libtool.m4, don't try again return 1 fi if test -f "$LIBTOOL_M4" ; then found_libtool="`$ECHO $_autoconf_output | grep AC_PROG_LIBTOOL`" if test ! "x$found_libtool" = "x" ; then if test -f acinclude.m4 ; then rm -f acinclude.m4.$$.backup $VERBOSE_ECHO "cat acinclude.m4 > acinclude.m4.$$.backup" cat acinclude.m4 > acinclude.m4.$$.backup fi $VERBOSE_ECHO "cat \"$LIBTOOL_M4\" >> acinclude.m4" chmod u+w acinclude.m4 cat "$LIBTOOL_M4" >> acinclude.m4 # don't keep doing this RUN_RECURSIVE=no export RUN_RECURSIVE untrap_abnormal $ECHO $ECHO "Restarting the preparation steps with libtool macros in acinclude.m4" $VERBOSE_ECHO sh $AUTOGEN_SH "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" sh "$AUTOGEN_SH" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" exit $? fi fi } ########################### # MANUAL_AUTOGEN FUNCTION # ########################### manual_autogen ( ) { ################################################## # Manual preparation steps taken are as follows: # # aclocal [-I m4] # # libtoolize --automake -c -f # # aclocal [-I m4] # # autoconf -f # # autoheader # # automake -a -c -f # ################################################## ########### # aclocal # ########### $VERBOSE_ECHO "$ACLOCAL $SEARCH_DIRS $ACLOCAL_OPTIONS" aclocal_output="`$ACLOCAL $SEARCH_DIRS $ACLOCAL_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$aclocal_output" if [ ! $ret = 0 ] ; then $ECHO "ERROR: $ACLOCAL failed" && exit 2 ; fi ############## # libtoolize # ############## need_libtoolize=no for feature in AC_PROG_LIBTOOL LT_INIT ; do $VERBOSE_ECHO "Searching for $feature in $CONFIGURE" found="`grep \"^$feature.*\" $CONFIGURE`" if [ ! "x$found" = "x" ] ; then need_libtoolize=yes break fi done if [ "x$need_libtoolize" = "xyes" ] ; then if [ "x$HAVE_LIBTOOLIZE" = "xyes" ] ; then $VERBOSE_ECHO "$LIBTOOLIZE $LIBTOOLIZE_OPTIONS" libtoolize_output="`$LIBTOOLIZE $LIBTOOLIZE_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$libtoolize_output" if [ ! $ret = 0 ] ; then $ECHO "ERROR: $LIBTOOLIZE failed" && exit 2 ; fi else if [ "x$HAVE_ALT_LIBTOOLIZE" = "xyes" ] ; then $VERBOSE_ECHO "$LIBTOOLIZE $ALT_LIBTOOLIZE_OPTIONS" libtoolize_output="`$LIBTOOLIZE $ALT_LIBTOOLIZE_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$libtoolize_output" if [ ! $ret = 0 ] ; then $ECHO "ERROR: $LIBTOOLIZE failed" && exit 2 ; fi fi fi ########### # aclocal # ########### # re-run again as instructed by libtoolize $VERBOSE_ECHO "$ACLOCAL $SEARCH_DIRS $ACLOCAL_OPTIONS" aclocal_output="`$ACLOCAL $SEARCH_DIRS $ACLOCAL_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$aclocal_output" # libtoolize might put ltmain.sh in the wrong place if test -f ltmain.sh ; then if test ! -f "${_aux_dir}/ltmain.sh" ; then $ECHO $ECHO "Warning: $LIBTOOLIZE is creating ltmain.sh in the wrong directory" $ECHO $ECHO "Fortunately, the problem can be worked around by simply copying the" $ECHO "file to the appropriate location (${_aux_dir}/). This has been done for you." $ECHO $VERBOSE_ECHO "cp -p ltmain.sh \"${_aux_dir}/ltmain.sh\"" cp -p ltmain.sh "${_aux_dir}/ltmain.sh" $ECHO $ECHO_N "Continuing build preparation ... $ECHO_C" fi fi # ltmain.sh fi # need_libtoolize ############ # autoconf # ############ $VERBOSE_ECHO $VERBOSE_ECHO "$AUTOCONF $AUTOCONF_OPTIONS" autoconf_output="`$AUTOCONF $AUTOCONF_OPTIONS 2>&1`" ret=$? $VERBOSE_ECHO "$autoconf_output" if [ ! $ret = 0 ] ; then # retry without the -f and check for usage of macros that are too new ac2_59_macros="AC_C_RESTRICT AC_INCLUDES_DEFAULT AC_LANG_ASSERT AC_LANG_WERROR AS_SET_CATFILE" ac2_55_macros="AC_COMPILER_IFELSE AC_FUNC_MBRTOWC AC_HEADER_STDBOOL AC_LANG_CONFTEST AC_LANG_SOURCE AC_LANG_PROGRAM AC_LANG_CALL AC_LANG_FUNC_TRY_LINK AC_MSG_FAILURE AC_PREPROC_IFELSE" ac2_54_macros="AC_C_BACKSLASH_A AC_CONFIG_LIBOBJ_DIR AC_GNU_SOURCE AC_PROG_EGREP AC_PROG_FGREP AC_REPLACE_FNMATCH AC_FUNC_FNMATCH_GNU AC_FUNC_REALLOC AC_TYPE_MBSTATE_T" macros_to_search="" ac_major="`echo ${AUTOCONF_VERSION}. | cut -d. -f1 | sed 's/[^0-9]//g'`" ac_minor="`echo ${AUTOCONF_VERSION}. | cut -d. -f2 | sed 's/[^0-9]//g'`" if [ $ac_major -lt 2 ] ; then macros_to_search="$ac2_59_macros $ac2_55_macros $ac2_54_macros" else if [ $ac_minor -lt 54 ] ; then macros_to_search="$ac2_59_macros $ac2_55_macros $ac2_54_macros" elif [ $ac_minor -lt 55 ] ; then macros_to_search="$ac2_59_macros $ac2_55_macros" elif [ $ac_minor -lt 59 ] ; then macros_to_search="$ac2_59_macros" fi fi configure_ac_macros=__none__ for feature in $macros_to_search ; do $VERBOSE_ECHO "Searching for $feature in $CONFIGURE" found="`grep \"^$feature.*\" $CONFIGURE`" if [ ! "x$found" = "x" ] ; then if [ "x$configure_ac_macros" = "x__none__" ] ; then configure_ac_macros="$feature" else configure_ac_macros="$feature $configure_ac_macros" fi fi done if [ ! "x$configure_ac_macros" = "x__none__" ] ; then $ECHO $ECHO "Warning: Unsupported macros were found in $CONFIGURE" $ECHO $ECHO "The `echo $CONFIGURE | basename` file was scanned in order to determine if any" $ECHO "unsupported macros are used that exceed the minimum version" $ECHO "settings specified within this file. As such, the following macros" $ECHO "should be removed from configure.ac or the version numbers in this" $ECHO "file should be increased:" $ECHO $ECHO "$configure_ac_macros" $ECHO $ECHO $ECHO_N "Ignorantly continuing build preparation ... $ECHO_C" fi ################### # autoconf, retry # ################### $VERBOSE_ECHO $VERBOSE_ECHO "$AUTOCONF" autoconf_output="`$AUTOCONF 2>&1`" ret=$? $VERBOSE_ECHO "$autoconf_output" if [ ! $ret = 0 ] ; then # test if libtool is busted libtool_failure "$autoconf_output" # let the user know what went wrong cat < url: http://BZFlag.org/ summary: multiplayer 3D tank battle game source: http://download.SourceForge.net/bzflag/%{name}-%{version}.tar.gz buildroot: /var/tmp/%{name}-%{version}-%{release} # all we want here is to remove glide, but RPM does not provide a way. ;-( # [crs -- mesa 3.1 now uses libGL.so.1 and libGLU.so.1. also, linking # against a mesa built without glide support avoids the glide dependency.] #autoreqprov: no #requires: ld-linux.so.2 libMesaGL.so.3 libMesaGLU.so.3 libX11.so.6 #requires: libXext.so.6 libc.so.6 libm.so.6 libstdc++.so.2.9 %description BZFlag is a networked multiplayer 3D tank battle game, combining both fast action and strategy. Free-for-all and capture-the-flag styles are available. %prep %setup -q %build %ifarch i386 i486 i586 i686 CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \ ./configure --prefix=%{prefix} --enable-robots \ --host=i386-pc-linux-gnu %else CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \ ./configure --prefix=%{prefix} --enable-robots %endif make %install make DESTDIR=$RPM_BUILD_ROOT install-strip %clean [ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} # note -- bzflag must be setuid root to use 3Dfx drivers without /dev/3dfx %files %defattr(-,root,root) %dir %{bzdatadir} %{bzdatadir}/* %doc %{bzmandir}/man6/* %doc %{bzmandir}/man5/* %attr(755,root,root) %{bzbindir}/* bzflag-2.4.2+ds1/bzflag.spec.in000066400000000000000000000042161200563112200161700ustar00rootroot00000000000000# BZFlag rpm spec file # # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. %define name bzflag %define version @VERSION@ %define release %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:0} %define prefix /usr %define bzbindir /usr/bin %define bzdatadir /usr/share/%{name}/ %define bzmandir /usr/man name: %{name} version: %{version} release: %{release} group: Recreation/Action copyright: Copyright (c) 1993-2012 Tim Riker packager: Tim Riker url: http://BZFlag.org/ summary: multiplayer 3D tank battle game source: http://download.SourceForge.net/bzflag/%{name}-%{version}.tar.gz buildroot: /var/tmp/%{name}-%{version}-%{release} # all we want here is to remove glide, but RPM does not provide a way. ;-( # [crs -- mesa 3.1 now uses libGL.so.1 and libGLU.so.1. also, linking # against a mesa built without glide support avoids the glide dependency.] #autoreqprov: no #requires: ld-linux.so.2 libMesaGL.so.3 libMesaGLU.so.3 libX11.so.6 #requires: libXext.so.6 libc.so.6 libm.so.6 libstdc++.so.2.9 %description BZFlag is a networked multiplayer 3D tank battle game, combining both fast action and strategy. Free-for-all and capture-the-flag styles are available. %prep %setup -q %build %ifarch i386 i486 i586 i686 CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \ ./configure --prefix=%{prefix} --enable-robots \ --host=i386-pc-linux-gnu %else CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \ ./configure --prefix=%{prefix} --enable-robots %endif make %install make DESTDIR=$RPM_BUILD_ROOT install-strip %clean [ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} # note -- bzflag must be setuid root to use 3Dfx drivers without /dev/3dfx %files %defattr(-,root,root) %dir %{bzdatadir} %{bzdatadir}/* %doc %{bzmandir}/man6/* %doc %{bzmandir}/man5/* %attr(755,root,root) %{bzbindir}/* bzflag-2.4.2+ds1/configure000077500000000000000000027141321200563112200153600ustar00rootroot00000000000000#! /bin/sh # From configure.ac Revision: 22524 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for BZFlag 2.4.2. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and http://BZFlag.org/ $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='BZFlag' PACKAGE_TARNAME='bzflag' PACKAGE_VERSION='2.4.2' PACKAGE_STRING='BZFlag 2.4.2' PACKAGE_BUGREPORT='http://BZFlag.org/' PACKAGE_URL='' ac_unique_file="src/bzflag/bzflag.cxx" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS subdirs LIBDIR CONF_CXXFLAGS CONF_CFLAGS CONF_CPPFLAGS ECHO BUILD_GLEW_FALSE BUILD_GLEW_TRUE GLEW_LIBS BUILD_CURL_FALSE BUILD_CURL_TRUE LIBCURL LIBCURL_CPPFLAGS _libcurl_config BUILD_ZLIB_FALSE BUILD_ZLIB_TRUE LIBZ BUILD_REGEX_FALSE BUILD_REGEX_TRUE LIBREGEX BUILD_ARES_FALSE BUILD_ARES_TRUE LIBCARES CURSES_LIB HAVE_CURSES_FALSE HAVE_CURSES_TRUE BZADMIN_INCLUDED_FALSE BZADMIN_INCLUDED_TRUE SERVER_INCLUDED_FALSE SERVER_INCLUDED_TRUE CLIENT_INCLUDED_FALSE CLIENT_INCLUDED_TRUE PPC_FALSE PPC_TRUE PC_FALSE PC_TRUE WIN32_FALSE WIN32_TRUE SOLARIS_FALSE SOLARIS_TRUE MACOS_FALSE MACOS_TRUE LINUX_FALSE LINUX_TRUE IRIX_FALSE IRIX_TRUE BEOS_FALSE BEOS_TRUE HPUX_FALSE HPUX_TRUE BUGGY_MIPSPRO_FALSE BUGGY_MIPSPRO_TRUE HAVE_SDL_FALSE HAVE_SDL_TRUE SDL_LIBS SDL_CFLAGS SDL_CONFIG BZFLAG_DATA GLIBS X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF FRAMEWORK_OPENGL CONFIG LIBMINIUPNPC LIBRT LIBDL HASPOD2MAN_FALSE HASPOD2MAN_TRUE HASPOD2MAN LIBTOOLFLAGS LIBTOOL_DEPS CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR DLLTOOL OBJDUMP NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL WINDRES CCACHE AR_FLAGS AR LN_S am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX BUILD_PLUGINS_FALSE BUILD_PLUGINS_TRUE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC CONFIG_CACHE CONF_TIME BZFLAG_DATE BZFLAG_VERSION MINOR_VERSION MAJOR_VERSION am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK MKDIR_P mkdir_p INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_xcurses with_curses enable_dependency_tracking with_SDL enable_plugins enable_threads enable_bzadmin enable_timebomb enable_robots enable_debug enable_profiling enable_client enable_ares_build enable_curl_build with_included_glew enable_regex_build enable_zlib_build enable_all_builds enable_UPnP enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock with_x with_sdl_prefix with_sdl_exec_prefix enable_sdltest with_libcurl ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP CXXCPP XMKMF' ac_subdirs_all='src/other/ares src/other/curl' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures BZFlag 2.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/bzflag] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of BZFlag 2.4.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-plugins do not compile plugins --disable-threads build without threading --disable-bzadmin do not build text client --enable-timebomb build exp Date --disable-robots disable robots --enable-debug turn on debugging --enable-profiling turn on profiling --disable-client server-only build --enable-ares-build Force compilation of ares --enable-curl-build Force compilation of curl --enable-regex-build Force compilation of regex --enable-zlib-build Force compilation of zlib --enable-all-builds Force compilation of all dependencies --enable-UPnP Use UPnP for server --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-xcurses Force the use of XCurses over ncurses --with-curses Force the use of curses over ncurses --without-SDL do not use Simple DirectMedia Layer --with-included-glew build with included GLEW library --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) --with-libcurl=PREFIX look for the curl library in PREFIX/lib and headers in PREFIX/include Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF BZFlag configure 2.4.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------- ## ## Report this to http://BZFlag.org/ ## ## --------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------- ## ## Report this to http://BZFlag.org/ ## ## --------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_type # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by BZFlag $as_me 2.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # When --libdir has not been used put plugins in bzflag's own directory. if test "x$libdir" = 'x${exec_prefix}/lib' ; then libdir="$libdir/bzflag" fi ac_aux_dir= for ac_dir in misc "$srcdir"/misc; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in misc \"$srcdir\"/misc" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # sed magic to get version numbers from src/date/buildDate.cxx MAJOR_VERSION=`sed -e 's/#.*define.*BZ_MAJOR_VERSION[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` MINOR_VERSION=`sed -e 's/#.*define.*BZ_MINOR_VERSION[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` REV=`sed -e 's/#.*define.*BZ_REV[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` CONF_DATE=`date -u +%Y%m%d` BZFLAG_DATE=`date -u +%Y-%m-%d` BZFLAG_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$REV" CONF_TIME="`date '+%H %M %S'`" # print out the title with a pretty box computed to wrap around title="Configuring BZFlag $BZFLAG_VERSION, Build $CONF_DATE" length="`echo x${title}x | wc -c`" separator="" while test $length -gt 1 ; do separator="${separator}*" length="`expr $length - 1`" done if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ***${separator}***" >&5 $as_echo "***${separator}***" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** ${title} ***" >&5 $as_echo "*** ${title} ***" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ***${separator}***" >&5 $as_echo "***${separator}***" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi # automake 1.10+ seems to use uppercase instead MKDIR_P="$mkdir_p" for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='bzflag' VERSION='2.4.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers include/config.h" # Let the C++ code know about OS cat >>confdefs.h <<_ACEOF #define BZ_BUILD_OS "$host_os" _ACEOF # automatically enable and load our configure cache file if available { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a configure cache exists" >&5 $as_echo_n "checking whether a configure cache exists... " >&6; } if test "x$cache_file" = "x/dev/null" ; then configure_cache=config.cache.${host_os}.${ac_hostname} CONFIG_CACHE="" if test -f "$configure_cache"; then if test "x`cat $configure_cache | grep ac_cv_env_CC_value`" != "xac_cv_env_CC_value=$CC" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found but compiler differs" >&5 $as_echo "found but compiler differs" >&6; } rm -f "$configure_cache" elif test "x`cat $configure_cache | grep ac_cv_env_CPPFLAGS_value`" != "xac_cv_env_CPPFLAGS_value=$CPPFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found but preprocessor flags differ" >&5 $as_echo "found but preprocessor flags differ" >&6; } rm -f "$configure_cache" else last_modified="`ls -Lt $configure_cache configure`" case "x$last_modified" in xconfigure*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found but out of date" >&5 $as_echo "found but out of date" >&6; } rm -f $configure_cache ;; esac fi if test -f "$configure_cache" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $configure_cache" >&5 $as_echo "found $configure_cache" >&6; } case $configure_cache in \\/* | ?:\\/* ) . $configure_cache ;; *) . ./$configure_cache ;; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi if test "x$host_os" != "xirix6.5" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: *** Automatically caching to $configure_cache ***" >&5 $as_echo "$as_me: *** Automatically caching to $configure_cache ***" >&6;} >$configure_cache cache_file="$configure_cache" CONFIG_CACHE="$cache_file" else { $as_echo "$as_me:${as_lineno-$LINENO}: Automatic caching is unavailable on IRIX" >&5 $as_echo "$as_me: Automatic caching is unavailable on IRIX" >&6;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cache_file" >&5 $as_echo "$cache_file" >&6; } fi _bc_stage="arguments" _bc_status="1 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi # provide a with-curses option, test for curses DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Check whether --with-xcurses was given. if test "${with_xcurses+set}" = set; then : withval=$with_xcurses; fi # Check whether --with-curses was given. if test "${with_curses+set}" = set; then : withval=$with_curses; fi mp_save_LIBS="$LIBS" CURSES_LIB="" if test "$with_curses" != yes -a "$with_xcurses" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses" >&5 $as_echo_n "checking for working ncurses... " >&6; } if ${mp_cv_ncurses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$LIBS -lncurses" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_ncurses=yes else mp_cv_ncurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_ncurses" >&5 $as_echo "$mp_cv_ncurses" >&6; } if test "$mp_cv_ncurses" = yes then $as_echo "#define HAVE_NCURSES_H /**/" >>confdefs.h CURSES_LIB="-lncurses" fi fi if test ! "$CURSES_LIB" -a "$with_xcurses" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working curses" >&5 $as_echo_n "checking for working curses... " >&6; } if ${mp_cv_curses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$mp_save_LIBS -lcurses" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_curses=yes else mp_cv_curses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_curses" >&5 $as_echo "$mp_cv_curses" >&6; } if test "$mp_cv_curses" = yes then $as_echo "#define HAVE_CURSES_H /**/" >>confdefs.h CURSES_LIB="-lcurses" fi fi if test ! "$CURSES_LIB" -a "$with_xcurses" != yes then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working PDcurses" >&5 $as_echo_n "checking for working PDcurses... " >&6; } if ${mp_cv_pdcurses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$mp_save_LIBS -lpdcurses" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_pdcurses=yes else mp_cv_pdcurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_pdcurses" >&5 $as_echo "$mp_cv_pdcurses" >&6; } if test "$mp_cv_pdcurses" = yes then $as_echo "#define HAVE_CURSES_H /**/" >>confdefs.h CURSES_LIB="-lpdcurses" fi fi if test ! "$CURSES_LIB" -a "$with_curses" != yes then xcurses_deplibs="-L$x_libraries -lXaw -lXmu -lXt -lX11 -lSM -lICE -lXext" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working XCurses" >&5 $as_echo_n "checking for working XCurses... " >&6; } if ${mp_cv_xcurses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$mp_save_LIBS -lXCurses $xcurses_deplibs" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_xcurses=yes else mp_cv_xcurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_xcurses" >&5 $as_echo "$mp_cv_xcurses" >&6; } if test "$mp_cv_xcurses" = yes then $as_echo "#define HAVE_XCURSES_H /**/" >>confdefs.h CURSES_LIB="-lXCurses $xcurses_deplibs" fi fi LIBS="$mp_save_LIBS" # check for SDL option (enabled by default now) # Check whether --with-SDL was given. if test "${with_SDL+set}" = set; then : withval=$with_SDL; fi if test x$with_SDL != xno; then with_SDL=yes fi # check whether plugins are desired # Check whether --enable-plugins was given. if test "${enable_plugins+set}" = set; then : enableval=$enable_plugins; fi if test "x$enable_plugins" != xno ; then $as_echo "#define BZ_PLUGINS 1" >>confdefs.h fi if test "x$enable_plugins" != "xno"; then BUILD_PLUGINS_TRUE= BUILD_PLUGINS_FALSE='#' else BUILD_PLUGINS_TRUE='#' BUILD_PLUGINS_FALSE= fi # check whether threads are desired # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; fi # do we want bzadmin? # Check whether --enable-bzadmin was given. if test "${enable_bzadmin+set}" = set; then : enableval=$enable_bzadmin; fi # build a binary set to stop functioning after some date # Check whether --enable-timebomb was given. if test "${enable_timebomb+set}" = set; then : enableval=$enable_timebomb; fi if test x$enable_timebomb = xyes; then $as_echo "#define TIME_BOMB \"3/13/1998\"" >>confdefs.h fi # Check whether --enable-robots was given. if test "${enable_robots+set}" = set; then : enableval=$enable_robots; fi if test x$enable_robots != xno; then $as_echo "#define ROBOT 1" >>confdefs.h fi # debugging and profiling # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi # Check whether --enable-profiling was given. if test "${enable_profiling+set}" = set; then : enableval=$enable_profiling; fi # profiling requires debugging if test x$enable_profiling = xyes; then enable_debug=yes fi if test x$enable_debug = xyes; then $as_echo "#define DEBUG 1" >>confdefs.h $as_echo "#define DEBUG_RENDERING 1" >>confdefs.h user_CFLAGS="$ac_save_CFLAGS" user_CXXFLAGS="$CXXFLAGS" # ac_save_CXXFLAGS is not set yet fi # do we want the bzflag client? # Check whether --enable-client was given. if test "${enable_client+set}" = set; then : enableval=$enable_client; fi # compile our own ares # Check whether --enable-ares_build was given. if test "${enable_ares_build+set}" = set; then : enableval=$enable_ares_build; fi # compile our own curl # Check whether --enable-curl_build was given. if test "${enable_curl_build+set}" = set; then : enableval=$enable_curl_build; fi # compile our own glew # Check whether --with-included-glew was given. if test "${with_included_glew+set}" = set; then : withval=$with_included_glew; enable_glew_build="$withval" fi # compile our own regex # Check whether --enable-regex_build was given. if test "${enable_regex_build+set}" = set; then : enableval=$enable_regex_build; fi # compile our own zlib # Check whether --enable-zlib_build was given. if test "${enable_zlib_build+set}" = set; then : enableval=$enable_zlib_build; fi # compile everything bz provides # Check whether --enable-all_builds was given. if test "${enable_all_builds+set}" = set; then : enableval=$enable_all_builds; fi # enable compilation of all bundled external dependencies if test "x$enable_all_builds" = "xyes" ; then enable_ares_build=yes enable_curl_build=yes enable_glew_build=yes enable_regex_build=yes enable_zlib_build=yes fi # enable UPnP for server # Check whether --enable-UPnP was given. if test "${enable_UPnP+set}" = set; then : enableval=$enable_UPnP; else enable_UPnP=no fi _bc_stage="programs" _bc_status="2 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi # cannot override LD directly, so warn (configure will override it) if test "x$LD" != "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: LD cannot be set directly yet it seems to be set ($LD)" >&5 $as_echo "$as_me: WARNING: LD cannot be set directly yet it seems to be set ($LD)" >&2;} fi #Checks for programs. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi # automake 1.10+ seems to use uppercase instead MKDIR_P="$mkdir_p" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "ccache", so it can be a program name with args. set dummy ccache; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CCACHE+:} false; then : $as_echo_n "(cached) " >&6 else case $CCACHE in [\\/]* | ?:[\\/]*) ac_cv_path_CCACHE="$CCACHE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CCACHE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CCACHE=$ac_cv_path_CCACHE if test -n "$CCACHE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCACHE" >&5 $as_echo "$CCACHE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$CCACHE" ; then CC="ccache $CC" CXX="ccache $CXX" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi # libtool shouldn't be generated until after LD is set. # AC_PROG_LIBTOOL goes poof in libtool 1.9, but that's not very # widespread at all. # LT_INIT enable_dlopen=yes case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4' macro_revision='1.3293' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' lt_prog_compiler_pic='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # quell the verbosity LIBTOOLFLAGS=--silent if test "x$LIBTOOL" != "x" ; then LIBTOOL="$LIBTOOL --silent" fi # Extract the first word of "pod2man", so it can be a program name with args. set dummy pod2man; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HASPOD2MAN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HASPOD2MAN"; then ac_cv_prog_HASPOD2MAN="$HASPOD2MAN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HASPOD2MAN="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_HASPOD2MAN" && ac_cv_prog_HASPOD2MAN="no" fi fi HASPOD2MAN=$ac_cv_prog_HASPOD2MAN if test -n "$HASPOD2MAN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HASPOD2MAN" >&5 $as_echo "$HASPOD2MAN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test $HASPOD2MAN = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: some man pages will not be generated" >&5 $as_echo "$as_me: WARNING: some man pages will not be generated" >&2;} fi if test $HASPOD2MAN = yes; then HASPOD2MAN_TRUE= HASPOD2MAN_FALSE='#' else HASPOD2MAN_TRUE='#' HASPOD2MAN_FALSE= fi _bc_stage="libraries" _bc_status="3 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi # FIXME: move other library checks here { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : LIBDL="-ldl" else LIBDL="" fi if test "x$enable_zlib_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compressBound in -lz" >&5 $as_echo_n "checking for compressBound in -lz... " >&6; } if ${ac_cv_lib_z_compressBound+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char compressBound (); int main () { return compressBound (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_compressBound=yes else ac_cv_lib_z_compressBound=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compressBound" >&5 $as_echo "$ac_cv_lib_z_compressBound" >&6; } if test "x$ac_cv_lib_z_compressBound" = xyes; then : LIBZ="-lz" else LIBZ="" fi fi if test "x$enable_ares_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ares_init in -lcares" >&5 $as_echo_n "checking for ares_init in -lcares... " >&6; } if ${ac_cv_lib_cares_ares_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcares $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ares_init (); int main () { return ares_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cares_ares_init=yes else ac_cv_lib_cares_ares_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cares_ares_init" >&5 $as_echo "$ac_cv_lib_cares_ares_init" >&6; } if test "x$ac_cv_lib_cares_ares_init" = xyes; then : LIBCARES="-lcares" else LIBCARES="" fi fi if test "x$enable_regex_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lc" >&5 $as_echo_n "checking for regcomp in -lc... " >&6; } if ${ac_cv_lib_c_regcomp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char regcomp (); int main () { return regcomp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_regcomp=yes else ac_cv_lib_c_regcomp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_regcomp" >&5 $as_echo "$ac_cv_lib_c_regcomp" >&6; } if test "x$ac_cv_lib_c_regcomp" = xyes; then : LIBREGEX="-lc" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lregex" >&5 $as_echo_n "checking for regcomp in -lregex... " >&6; } if ${ac_cv_lib_regex_regcomp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lregex $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char regcomp (); int main () { return regcomp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_regex_regcomp=yes else ac_cv_lib_regex_regcomp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_regex_regcomp" >&5 $as_echo "$ac_cv_lib_regex_regcomp" >&6; } if test "x$ac_cv_lib_regex_regcomp" = xyes; then : LIBREGEX="-lregex" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lcompat" >&5 $as_echo_n "checking for regcomp in -lcompat... " >&6; } if ${ac_cv_lib_compat_regcomp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcompat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char regcomp (); int main () { return regcomp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_compat_regcomp=yes else ac_cv_lib_compat_regcomp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_compat_regcomp" >&5 $as_echo "$ac_cv_lib_compat_regcomp" >&6; } if test "x$ac_cv_lib_compat_regcomp" = xyes; then : LIBREGEX="-lcompat" else LIBREGEX="" fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shm_open in -lrt" >&5 $as_echo_n "checking for shm_open in -lrt... " >&6; } if ${ac_cv_lib_rt_shm_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shm_open (); int main () { return shm_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_shm_open=yes else ac_cv_lib_rt_shm_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_shm_open" >&5 $as_echo "$ac_cv_lib_rt_shm_open" >&6; } if test "x$ac_cv_lib_rt_shm_open" = xyes; then : LIBRT="-lrt" else LIBRT="" fi # Check for the math lib { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf in -lm" >&5 $as_echo_n "checking for sqrtf in -lm... " >&6; } if ${ac_cv_lib_m_sqrtf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrtf (); int main () { return sqrtf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sqrtf=yes else ac_cv_lib_m_sqrtf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrtf" >&5 $as_echo "$ac_cv_lib_m_sqrtf" >&6; } if test "x$ac_cv_lib_m_sqrtf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # for BeOS - old network stack don't have those libs ( move it in the case switch ?) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostent in -lsocket" >&5 $as_echo_n "checking for gethostent in -lsocket... " >&6; } if ${ac_cv_lib_socket_gethostent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostent (); int main () { return gethostent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_gethostent=yes else ac_cv_lib_socket_gethostent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostent" >&5 $as_echo "$ac_cv_lib_socket_gethostent" >&6; } if test "x$ac_cv_lib_socket_gethostent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostent in -lbind" >&5 $as_echo_n "checking for gethostent in -lbind... " >&6; } if ${ac_cv_lib_bind_gethostent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostent (); int main () { return gethostent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_gethostent=yes else ac_cv_lib_bind_gethostent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_gethostent" >&5 $as_echo "$ac_cv_lib_bind_gethostent" >&6; } if test "x$ac_cv_lib_bind_gethostent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBIND 1 _ACEOF LIBS="-lbind $LIBS" fi fi # see if pthreads are in libc_r (as on FreeBSD) or libpthread { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 $as_echo_n "checking for pthread_create in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_create=yes else ac_cv_lib_c_r_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : LIBPTHREAD="-lc_r" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : LIBPTHREAD="-lpthread" else LIBPTHREAD="" fi fi # check for various IEEE and c99 standard math functions in libm { $as_echo "$as_me:${as_lineno-$LINENO}: checking for acosf in -lm" >&5 $as_echo_n "checking for acosf in -lm... " >&6; } if ${ac_cv_lib_m_acosf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char acosf (); int main () { return acosf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_acosf=yes else ac_cv_lib_m_acosf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_acosf" >&5 $as_echo "$ac_cv_lib_m_acosf" >&6; } if test "x$ac_cv_lib_m_acosf" = xyes; then : $as_echo "#define HAVE_ACOSF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for asinf in -lm" >&5 $as_echo_n "checking for asinf in -lm... " >&6; } if ${ac_cv_lib_m_asinf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char asinf (); int main () { return asinf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_asinf=yes else ac_cv_lib_m_asinf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_asinf" >&5 $as_echo "$ac_cv_lib_m_asinf" >&6; } if test "x$ac_cv_lib_m_asinf" = xyes; then : $as_echo "#define HAVE_ASINF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f in -lm" >&5 $as_echo_n "checking for atan2f in -lm... " >&6; } if ${ac_cv_lib_m_atan2f+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char atan2f (); int main () { return atan2f (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_atan2f=yes else ac_cv_lib_m_atan2f=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_atan2f" >&5 $as_echo "$ac_cv_lib_m_atan2f" >&6; } if test "x$ac_cv_lib_m_atan2f" = xyes; then : $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atanf in -lm" >&5 $as_echo_n "checking for atanf in -lm... " >&6; } if ${ac_cv_lib_m_atanf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char atanf (); int main () { return atanf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_atanf=yes else ac_cv_lib_m_atanf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_atanf" >&5 $as_echo "$ac_cv_lib_m_atanf" >&6; } if test "x$ac_cv_lib_m_atanf" = xyes; then : $as_echo "#define HAVE_ATANF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ceilf in -lm" >&5 $as_echo_n "checking for ceilf in -lm... " >&6; } if ${ac_cv_lib_m_ceilf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ceilf (); int main () { return ceilf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_ceilf=yes else ac_cv_lib_m_ceilf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_ceilf" >&5 $as_echo "$ac_cv_lib_m_ceilf" >&6; } if test "x$ac_cv_lib_m_ceilf" = xyes; then : $as_echo "#define HAVE_CEILF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cosf in -lm" >&5 $as_echo_n "checking for cosf in -lm... " >&6; } if ${ac_cv_lib_m_cosf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cosf (); int main () { return cosf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cosf=yes else ac_cv_lib_m_cosf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cosf" >&5 $as_echo "$ac_cv_lib_m_cosf" >&6; } if test "x$ac_cv_lib_m_cosf" = xyes; then : $as_echo "#define HAVE_COSF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf in -lm" >&5 $as_echo_n "checking for expf in -lm... " >&6; } if ${ac_cv_lib_m_expf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char expf (); int main () { return expf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_expf=yes else ac_cv_lib_m_expf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_expf" >&5 $as_echo "$ac_cv_lib_m_expf" >&6; } if test "x$ac_cv_lib_m_expf" = xyes; then : $as_echo "#define HAVE_EXPF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf in -lm" >&5 $as_echo_n "checking for fabsf in -lm... " >&6; } if ${ac_cv_lib_m_fabsf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fabsf (); int main () { return fabsf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_fabsf=yes else ac_cv_lib_m_fabsf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_fabsf" >&5 $as_echo "$ac_cv_lib_m_fabsf" >&6; } if test "x$ac_cv_lib_m_fabsf" = xyes; then : $as_echo "#define HAVE_FABSF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for floorf in -lm" >&5 $as_echo_n "checking for floorf in -lm... " >&6; } if ${ac_cv_lib_m_floorf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char floorf (); int main () { return floorf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_floorf=yes else ac_cv_lib_m_floorf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_floorf" >&5 $as_echo "$ac_cv_lib_m_floorf" >&6; } if test "x$ac_cv_lib_m_floorf" = xyes; then : $as_echo "#define HAVE_FLOORF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf in -lm" >&5 $as_echo_n "checking for fmodf in -lm... " >&6; } if ${ac_cv_lib_m_fmodf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fmodf (); int main () { return fmodf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_fmodf=yes else ac_cv_lib_m_fmodf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_fmodf" >&5 $as_echo "$ac_cv_lib_m_fmodf" >&6; } if test "x$ac_cv_lib_m_fmodf" = xyes; then : $as_echo "#define HAVE_FMODF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf in -lm" >&5 $as_echo_n "checking for hypotf in -lm... " >&6; } if ${ac_cv_lib_m_hypotf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char hypotf (); int main () { return hypotf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_hypotf=yes else ac_cv_lib_m_hypotf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_hypotf" >&5 $as_echo "$ac_cv_lib_m_hypotf" >&6; } if test "x$ac_cv_lib_m_hypotf" = xyes; then : $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf in -lm" >&5 $as_echo_n "checking for logf in -lm... " >&6; } if ${ac_cv_lib_m_logf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char logf (); int main () { return logf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_logf=yes else ac_cv_lib_m_logf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_logf" >&5 $as_echo "$ac_cv_lib_m_logf" >&6; } if test "x$ac_cv_lib_m_logf" = xyes; then : $as_echo "#define HAVE_LOGF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f in -lm" >&5 $as_echo_n "checking for log10f in -lm... " >&6; } if ${ac_cv_lib_m_log10f+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char log10f (); int main () { return log10f (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_log10f=yes else ac_cv_lib_m_log10f=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_log10f" >&5 $as_echo "$ac_cv_lib_m_log10f" >&6; } if test "x$ac_cv_lib_m_log10f" = xyes; then : $as_echo "#define HAVE_LOG10F 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf in -lm" >&5 $as_echo_n "checking for powf in -lm... " >&6; } if ${ac_cv_lib_m_powf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char powf (); int main () { return powf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_powf=yes else ac_cv_lib_m_powf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_powf" >&5 $as_echo "$ac_cv_lib_m_powf" >&6; } if test "x$ac_cv_lib_m_powf" = xyes; then : $as_echo "#define HAVE_POWF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sinf in -lm" >&5 $as_echo_n "checking for sinf in -lm... " >&6; } if ${ac_cv_lib_m_sinf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sinf (); int main () { return sinf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sinf=yes else ac_cv_lib_m_sinf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sinf" >&5 $as_echo "$ac_cv_lib_m_sinf" >&6; } if test "x$ac_cv_lib_m_sinf" = xyes; then : $as_echo "#define HAVE_SINF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf in -lm" >&5 $as_echo_n "checking for sqrtf in -lm... " >&6; } if ${ac_cv_lib_m_sqrtf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrtf (); int main () { return sqrtf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sqrtf=yes else ac_cv_lib_m_sqrtf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrtf" >&5 $as_echo "$ac_cv_lib_m_sqrtf" >&6; } if test "x$ac_cv_lib_m_sqrtf" = xyes; then : $as_echo "#define HAVE_SQRTF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tanf in -lm" >&5 $as_echo_n "checking for tanf in -lm... " >&6; } if ${ac_cv_lib_m_tanf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tanf (); int main () { return tanf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_tanf=yes else ac_cv_lib_m_tanf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_tanf" >&5 $as_echo "$ac_cv_lib_m_tanf" >&6; } if test "x$ac_cv_lib_m_tanf" = xyes; then : $as_echo "#define HAVE_TANF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for numeric type sizes" >&5 $as_echo_n "checking for numeric type sizes... " >&6; } # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short int" >&5 $as_echo_n "checking size of short int... " >&6; } if ${ac_cv_sizeof_short_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short int))" "ac_cv_sizeof_short_int" "$ac_includes_default"; then : else if test "$ac_cv_type_short_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short_int" >&5 $as_echo "$ac_cv_sizeof_short_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT_INT $ac_cv_sizeof_short_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long int" >&5 $as_echo_n "checking size of long int... " >&6; } if ${ac_cv_sizeof_long_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long int))" "ac_cv_sizeof_long_int" "$ac_includes_default"; then : else if test "$ac_cv_type_long_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_int" >&5 $as_echo "$ac_cv_sizeof_long_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_INT $ac_cv_sizeof_long_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long int" >&5 $as_echo_n "checking size of long long int... " >&6; } if ${ac_cv_sizeof_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long int))" "ac_cv_sizeof_long_long_int" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long_int" >&5 $as_echo "$ac_cv_sizeof_long_long_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG_INT $ac_cv_sizeof_long_long_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : else if test "$ac_cv_type_float" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 $as_echo "$ac_cv_sizeof_float" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } if ${ac_cv_sizeof_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : else if test "$ac_cv_type_long_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 $as_echo "$ac_cv_sizeof_long_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT_INT $ac_cv_sizeof_short_int _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_INT $ac_cv_sizeof_long_int _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG_INT $ac_cv_sizeof_long_long_int _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF _bc_stage="headers" _bc_status="4 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu for ac_header in \ cmath \ cstdlib \ cstdio \ cstring \ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_header in \ SDL/SDL.h \ bstring.h \ dlfcn.h \ dsound.h \ fcntl.h \ inttypes.h \ linux/input.h \ process.h \ sched.h \ stdint.h \ sys/param.h \ sys/socket.h \ netdb.h \ unistd.h \ values.h \ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # nameser_compat.h used by src/other/ares if test "x$enable_regex_build" != "xyes" ; then ac_fn_c_check_header_mongrel "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default" if test "x$ac_cv_header_regex_h" = xyes; then : $as_echo "#define HAVE_REGEX_H 1" >>confdefs.h fi fi if test "x$enable_UPnP" = "xyes"; then for ac_header in miniupnpc/miniupnpc.h do : ac_fn_c_check_header_mongrel "$LINENO" "miniupnpc/miniupnpc.h" "ac_cv_header_miniupnpc_miniupnpc_h" "$ac_includes_default" if test "x$ac_cv_header_miniupnpc_miniupnpc_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MINIUPNPC_MINIUPNPC_H 1 _ACEOF LIBMINIUPNPC=-lminiupnpc else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You need to install miniupnpc for UPnP to work" >&5 $as_echo "$as_me: WARNING: You need to install miniupnpc for UPnP to work" >&2;} fi done fi _bc_stage="types" _bc_status="5 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi #AM_CHECK_TYPES(socklen_t) #AC_CHECK_TYPES(socklen_t) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t type" >&5 $as_echo_n "checking for socklen_t type... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { socklen_t len = 42; return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_socklen_t=yes else ac_cv_type_socklen_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 $as_echo "$ac_cv_type_socklen_t" >&6; } if test $ac_cv_type_socklen_t != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking elsewhere for socklen_t type" >&5 $as_echo_n "checking elsewhere for socklen_t type... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { socklen_t len = 42; return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_socklen_t=yes else ac_cv_type_socklen_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_socklen_t" >&5 $as_echo "$ac_cv_type_socklen_t" >&6; } fi if test $ac_cv_type_socklen_t != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5 $as_echo_n "checking for socklen_t equivalent... " >&6; } if ${ac_cv_socklen_t_equiv+:} false; then : $as_echo_n "(cached) " >&6 else # Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername ac_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t unsigned long "unsigned long"; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int getpeername (int, $arg2 *, $t *); int main () { $t len; getpeername(0,0,&len); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_socklen_t_equiv="$t" break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done if test "x$ac_cv_socklen_t_equiv" = x; then as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_socklen_t_equiv" >&5 $as_echo "$ac_cv_socklen_t_equiv" >&6; } cat >>confdefs.h <<_ACEOF #define socklen_t $ac_cv_socklen_t_equiv _ACEOF else $as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h fi #CONFIG is only used for irix packaging case $host_os in irix*) CONFIG=irix-mips3; ;; esac ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_type "$LINENO" "std::wstring" "ac_cv_type_std__wstring" "#include " if test "x$ac_cv_type_std__wstring" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STD__WSTRING 1 _ACEOF fi ac_cv_search_glBegin=no ac_cv_search_gluScaleImage=no ac_func_search_save_LIBS=$LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL framework (Darwin-specific)" >&5 $as_echo_n "checking for OpenGL framework (Darwin-specific)... " >&6; } FRAMEWORK_OPENGL="" PRELIBS="$LIBS" LIBS="$LIBS -framework OpenGL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { glBegin(GL_POINTS) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : FRAMEWORK_OPENGL="-framework OpenGL" ; ac_cv_search_glBegin="-framework OpenGL" ; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$PRELIBS" # don't use X11 flags if we have an OpenGL framework if test "x$FRAMEWORK_OPENGL" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi CONF_CPPFLAGS="$CONF_CPPFLAGS $X_CFLAGS" LDFLAGS="$LDFLAGS $X_LIBS" fi case $host_os in solaris*) if test -d /usr/demo/SOUND/lib ; then GLIBS="-laudio $GLIBS" LDFLAGS="$LDFLAGS -L/usr/demo/SOUND/lib" fi GLIBS="-lresolv $GLIBS" LIBS="$LIBS -lsocket -lnsl -lresolv" LDFLAGS="$LDFLAGS -lresolv" # for hstrerror() ;; irix*) GLIBS="-lXsgivc -lX11 -laudio $GLIBS" ;; beos) GLIBS=" -lmedia -lgame $GLIBS" LIBS="-lbe" ;; macos|darwin*) ;; *) ;; esac # avoid using X11 in BeOS and Mac OS X case $host_os in macos|darwin*) ;; beos*) ;; *) CONF_CPPFLAGS="$CONF_CPPFLAGS $X_CFLAGS" if test x$no_x = x; then GLIBS="$X_PRE_LIBS -lX11 $EXTRA_LIBS $GLIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XextAddDisplay in -lXext" >&5 $as_echo_n "checking for XextAddDisplay in -lXext... " >&6; } if ${ac_cv_lib_Xext_XextAddDisplay+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $GLIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XextAddDisplay (); int main () { return XextAddDisplay (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_Xext_XextAddDisplay=yes else ac_cv_lib_Xext_XextAddDisplay=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XextAddDisplay" >&5 $as_echo "$ac_cv_lib_Xext_XextAddDisplay" >&6; } if test "x$ac_cv_lib_Xext_XextAddDisplay" = xyes; then : GLIBS="-lXext $GLIBS" fi for ac_header in X11/extensions/xf86vmode.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/xf86vmode.h" "ac_cv_header_X11_extensions_xf86vmode_h" "#include " if test "x$ac_cv_header_X11_extensions_xf86vmode_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XF86VMODE_H 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XF86VidModeQueryExtension in -lXxf86vm" >&5 $as_echo_n "checking for XF86VidModeQueryExtension in -lXxf86vm... " >&6; } if ${ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXxf86vm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XF86VidModeQueryExtension (); int main () { return XF86VidModeQueryExtension (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension=yes else ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" >&5 $as_echo "$ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" >&6; } if test "x$ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" = xyes; then : $as_echo "#define XF86VIDMODE_EXT 1" >>confdefs.h GLIBS="-lXxf86vm $GLIBS" fi fi done ;; esac for ac_lib in opengl32 GL GL2; do LIBS="-l$ac_lib $GLIBS $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { glBegin(GL_POINTS) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_glBegin="-l$ac_lib" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done if test "$ac_cv_search_glBegin" != no; then GLIBS="$ac_cv_search_glBegin $GLIBS" if test "$ac_cv_search_glBegin" = -lGL2; then $as_echo "#define BEOS_USE_GL2 1" >>confdefs.h fi LIBS="-framework OpenGL $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gluScaleImage(GL_RED,0,0,GL_INT,0,0,0,GL_INT,0) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_gluScaleImage="-framework OpenGL" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for ac_lib in glu32 GL GLU; do LIBS="-l$ac_lib $GLIBS $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { gluScaleImage(GL_RED,0,0,GL_INT,0,0,0,GL_INT,0) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_gluScaleImage="-l$ac_lib" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done if test "$ac_cv_search_gluScaleImage" != no; then GLIBS="$ac_cv_search_gluScaleImage $GLIBS" fi fi LIBS=$ac_func_search_save_LIBS # try out pthreads if it's enabled, disable it if we don't have it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working pthreads" >&5 $as_echo_n "checking for working pthreads... " >&6; } if test "x$enable_threads" != "xno" ; then tmpLIBS=$LIBS LIBS=$LIBPTHREAD cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { pthread_t thread; pthread_create(&thread, NULL, NULL, NULL); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : pthread_check="yes" else pthread_check="no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $pthread_check = "yes"; then $as_echo "#define HAVE_PTHREADS 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h LIBS="$tmpLIBS $LIBS" else LIBS=$tmpLIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pthread_check" >&5 $as_echo "$pthread_check" >&6; } fi case $host_os in mingw32*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for closesocket in -lws2_32" >&5 $as_echo_n "checking for closesocket in -lws2_32... " >&6; } if ${ac_cv_lib_ws2_32_closesocket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lws2_32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char closesocket (); int main () { return closesocket (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ws2_32_closesocket=yes else ac_cv_lib_ws2_32_closesocket=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_closesocket" >&5 $as_echo "$ac_cv_lib_ws2_32_closesocket" >&6; } if test "x$ac_cv_lib_ws2_32_closesocket" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBWS2_32 1 _ACEOF LIBS="-lws2_32 $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for timeGetTime in -lwinmm" >&5 $as_echo_n "checking for timeGetTime in -lwinmm... " >&6; } if ${ac_cv_lib_winmm_timeGetTime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lwinmm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char timeGetTime (); int main () { return timeGetTime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_winmm_timeGetTime=yes else ac_cv_lib_winmm_timeGetTime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_winmm_timeGetTime" >&5 $as_echo "$ac_cv_lib_winmm_timeGetTime" >&6; } if test "x$ac_cv_lib_winmm_timeGetTime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBWINMM 1 _ACEOF LIBS="-lwinmm $LIBS" fi GLIBS="-mwindows -lgdi32 -ldxguid -ldsound -ldinput $GLIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define DIRECTINPUT_VERSION 0x0700 #include int main () { IDirectInput7* directInput; HINSTANCE hinst = GetModuleHandle(NULL); HRESULT success = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION, IID_IDirectInput7, (void**)&directInput, NULL); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else $as_echo "#define BROKEN_DINPUT 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ;; esac # Remove ogg/vorbis dependencies until we actually need them. # # AC_CHECK_LIB(ogg, ogg_stream_init, [ALIBS="-logg $ALIBS"], [], $ALIBS) # AC_CHECK_LIB(vorbis, vorbis_info_init, [ALIBS="-lvorbis $ALIBS"], [], $ALIBS) # AC_CHECK_LIB(vorbisfile, ov_open, [ALIBS="-lvorbisfile $ALIBS"], [], $ALIBS) # AC_SUBST(ALIBS) if test $prefix = NONE; then prefix=$ac_default_prefix fi BZFLAG_DATA=`eval eval echo $datadir/bzflag` cat >>confdefs.h <<_ACEOF #define BZFLAG_DATA "$BZFLAG_DATA" _ACEOF savedLIBS=$LIBS LIBS="$GLIBS $LIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$enable_client" != xno -a "x$with_SDL" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL framework" >&5 $as_echo_n "checking for SDL framework... " >&6; } savedLDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -framework SDL" framework_SDL_flag_works=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else framework_SDL_flag_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $framework_SDL_flag_works" >&5 $as_echo "$framework_SDL_flag_works" >&6; } if test x$framework_SDL_flag_works = xno ; then LDFLAGS="$savedLDFLAGS" with_SDL=no fi if test x$with_SDL = xno ; then # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then : withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then : withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then : enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi PATH="$prefix/bin:$prefix/usr/bin:$PATH" # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SDL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=1.2.10 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_sdl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } with_SDL=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" with_SDL=no fi rm -f conf.sdltest if test x$with_SDL = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find an appropriate SDL version. BZflag will build without SDL" >&5 $as_echo "$as_me: WARNING: could not find an appropriate SDL version. BZflag will build without SDL" >&2;} fi fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu LIBS=$savedLIBS if test x$with_SDL = xyes; then $as_echo "#define HAVE_SDL 1" >>confdefs.h fi if test x$with_SDL = xyes; then HAVE_SDL_TRUE= HAVE_SDL_FALSE='#' else HAVE_SDL_TRUE='#' HAVE_SDL_FALSE= fi # dumb temp hacks to add missing linkage stuff case $host_os in macos|darwin*) if test x$with_SDL = xyes; then LIBS="$LIBS -framework Carbon -framework Cocoa -framework OpenGL" else LIBS="$LIBS -framework Carbon -framework AGL -framework OpenGL" fi ;; irix) if test x$host_cpu = xmips64; then LDFLAGS="$LDFLAGS -L$(ROOT)/usr/lib32" else LDFLAGS="$LDFLAGS -L$(ROOT)/usr/lib" fi ;; esac _bc_stage="compiler" _bc_status="6 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi using_mipspro=no if test "$build_vendor" = "sgi" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the MIPSPro compiler" >&5 $as_echo_n "checking whether we are using the MIPSPro compiler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if defined(sgi) && !defined(__GNUC__) && defined(_COMPILER_VERSION) this line should cause a compile failure when building with the MIPSpro compiler; #endif int main() { return 0; } ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : using_mipspro=no else using_mipspro=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $using_mipspro" >&5 $as_echo "$using_mipspro" >&6; } fi if test "x$using_mipspro" = "xyes"; then BUGGY_MIPSPRO_TRUE= BUGGY_MIPSPRO_FALSE='#' else BUGGY_MIPSPRO_TRUE='#' BUGGY_MIPSPRO_FALSE= fi # FIXME: these checks below are not compiler characteristics other # than the FLAGS they set. case $host_os in linux*) $as_echo "#define HALF_RATE_AUDIO 1" >>confdefs.h #FLAGS="$FLAGS -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings -Wconversion -Wredundant-decls" # time to use -Wextra instead of -W ? (gcc 3.4+) FLAGS="-Wall -W -Wundef -Wshadow" CONF_CFLAGS="$CONF_CFLAGS $FLAGS" CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS -ansi -pedantic" case $host_vendor in pc) if expr `$CC -dumpversion` \>= "3.4" > /dev/null ; then FLAGS=-mtune else FLAGS=-march fi # silly hack, should be a proper configure compiler option test if test x$host_cpu = xx86_64; then FLAGS="$FLAGS=k8" else FLAGS="$FLAGS=$host_cpu" fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; ppc) FLAGS="-mcpu=$host_cpu" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS";; esac;; cygwin) $as_echo "#define HALF_RATE_AUDIO 1" >>confdefs.h FLAGS="-Wall -W -mcpu=$host_cpu" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; mingw32*) $as_echo "#define HALF_RATE_AUDIO 1" >>confdefs.h FLAGS="-Wall -W" if expr `$CC -dumpversion` \>= "3.4" > /dev/null ; then FLAGS="$FLAGS -mtune=$host_cpu" else FLAGS="$FLAGS -march=$host_cpu" fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; solaris*) $as_echo "#define ETC_INET /**/" >>confdefs.h $as_echo "#define SUN_OGL_NO_VERTEX_MACROS /**/" >>confdefs.h ;; macos|darwin*) FLAGS="-pipe -Wno-long-long -W -Wall -Wundef -Wno-import" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS -pedantic";; irix) FLAGS="-Wall"; if test x$host_cpu = xmips64; then FLAGS="FLAGS -march=mips3"; else FLAGS="FLAGS -march=mips2"; fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS";; beos*) $as_echo "#define HAVE_DEFINED_TOLOWER 1" >>confdefs.h ;; esac if test x$enable_profiling = xyes ; then if test "$GCC" = yes ; then CONF_CFLAGS="$CONF_CFLAGS -pg" CONF_CXXFLAGS="$CONF_CXXFLAGS -pg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: profiling is disabled with non-GNU compiler" >&5 $as_echo "$as_me: WARNING: profiling is disabled with non-GNU compiler" >&2;} fi fi if test x$enable_debug = xyes ; then CONF_CFLAGS="$CONF_CFLAGS -Werror -g -O0" CONF_CXXFLAGS="$CONF_CXXFLAGS -Werror -g -O0" # revert automatic setting of CFLAGS and CXXFLAGS to prevent # override of "-g -O0" put into CONF_CFLAGS and CONF_CXXFLAGS above CFLAGS="$user_CFLAGS" CXXFLAGS="$user_CXXFLAGS" $as_echo "#define DEBUG 1" >>confdefs.h else if test "$GCC" = yes ; then OPTIMIZE="-fexpensive-optimizations" CONF_CFLAGS="$CONF_CFLAGS $OPTIMIZE" CONF_CXXFLAGS="$CONF_CXXFLAGS $OPTIMIZE" fi $as_echo "#define NDEBUG 1" >>confdefs.h fi search_paths_first_flag="-Wl,-search_paths_first -mdynamic-no-pic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands $search_paths_first_flag" >&5 $as_echo_n "checking if the compiler understands $search_paths_first_flag... " >&6; } search_paths_first_flag_works=yes PRELDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $search_paths_first_flag" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else search_paths_first_flag_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $search_paths_first_flag_works" >&5 $as_echo "$search_paths_first_flag_works" >&6; } if test "x$search_paths_first_flag_works" = "xno" ; then LDFLAGS="$PRELDFLAGS" fi _bc_stage="functions" _bc_status="7 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi for ac_func in \ CGLGetCurrentContext \ Sleep \ WaitForSingleObject \ _stricmp \ _strnicmp \ _vsnprintf \ atexit \ hstrerror \ sched_setaffinity \ select \ snooze \ usleep \ vsnprintf \ wglGetCurrentContext \ do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan" >&5 $as_echo_n "checking for isnan... " >&6; } bz_isnan_works=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_CMATH # include #endif int main () { float f = 0.0f; std::isnan(f); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bz_isnan_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$bz_isnan_works" = "xyes" ; then $as_echo "#define HAVE_STD__ISNAN 1" >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { float f = 0.0f; isnan(f); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : bz_isnan_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$bz_isnan_works" = "xyes" ; then $as_echo "#define HAVE_ISNAN 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bz_isnan_works" >&5 $as_echo "$bz_isnan_works" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int i = std::min(0, 1); i = i; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : $as_echo "#define HAVE_STD__MIN 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int i = std::max(0, 1); i = i; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : $as_echo "#define HAVE_STD__MAX 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char array[] = "test"; int i = std::count(array, array + 5, 't'); i = i; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : $as_echo "#define HAVE_STD__COUNT 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext _bc_stage="services" _bc_status="8 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi # FIXME: system service checks seem to be spread out everywhere above, # need to consolidate them to here. case $host_os in beos*) beos=true ;; hpux*) hpux=true ;; irix*) irix=true ;; linux*|kfreebsd*|freebsd*|netbsd*|openbsd*|dragonfly*) linux=true ;; macos|darwin*) macos=true ;; solaris*) solaris=true ;; cygwin|mingw32*|windows**) win32=true ;; esac if test x$hpux = xtrue; then HPUX_TRUE= HPUX_FALSE='#' else HPUX_TRUE='#' HPUX_FALSE= fi if test x$beos = xtrue; then BEOS_TRUE= BEOS_FALSE='#' else BEOS_TRUE='#' BEOS_FALSE= fi if test x$irix = xtrue; then IRIX_TRUE= IRIX_FALSE='#' else IRIX_TRUE='#' IRIX_FALSE= fi if test x$linux = xtrue; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test x$macos = xtrue; then MACOS_TRUE= MACOS_FALSE='#' else MACOS_TRUE='#' MACOS_FALSE= fi if test x$solaris = xtrue; then SOLARIS_TRUE= SOLARIS_FALSE='#' else SOLARIS_TRUE='#' SOLARIS_FALSE= fi if test x$win32 = xtrue; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi # wtf are these for? if test x$host_vendor = xpc; then PC_TRUE= PC_FALSE='#' else PC_TRUE='#' PC_FALSE= fi if test x$host_vendor = xppc; then PPC_TRUE= PPC_FALSE='#' else PPC_TRUE='#' PPC_FALSE= fi # Check for working FF_RUMBLE support in linux/input.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linux rumble joystick support" >&5 $as_echo_n "checking for linux rumble joystick support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct ff_effect x; x.u.rumble.weak_magnitude = 42; return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_ff_effect_rumble=yes else ac_ff_effect_rumble=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$ac_ff_effect_rumble = xyes; then $as_echo "#define HAVE_FF_EFFECT_RUMBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ff_effect_rumble" >&5 $as_echo "$ac_ff_effect_rumble" >&6; } # Check for working directional FF support in linux/input.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linux force feedback joystick support" >&5 $as_echo_n "checking for linux force feedback joystick support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct ff_effect x; x.direction = 0x4000; return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_ff_effect_directional=yes else ac_ff_effect_directional=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test x$ac_ff_effect_directional = xyes; then $as_echo "#define HAVE_FF_EFFECT_DIRECTIONAL 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ff_effect_directional" >&5 $as_echo "$ac_ff_effect_directional" >&6; } # if the client was enabled, make sure we have GL if test x$enable_client != xno; then have_gl=no if test "$ac_cv_search_gluScaleImage" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Client build is enabled, but OpenGL does not seem to be fully available ... disabling BZFlag client" >&5 $as_echo "$as_me: WARNING: Client build is enabled, but OpenGL does not seem to be fully available ... disabling BZFlag client" >&2;} if false; then CLIENT_INCLUDED_TRUE= CLIENT_INCLUDED_FALSE='#' else CLIENT_INCLUDED_TRUE='#' CLIENT_INCLUDED_FALSE= fi enable_client=no else if true; then CLIENT_INCLUDED_TRUE= CLIENT_INCLUDED_FALSE='#' else CLIENT_INCLUDED_TRUE='#' CLIENT_INCLUDED_FALSE= fi have_gl=yes fi else if false; then CLIENT_INCLUDED_TRUE= CLIENT_INCLUDED_FALSE='#' else CLIENT_INCLUDED_TRUE='#' CLIENT_INCLUDED_FALSE= fi fi # stub it for now, enable the server if true; then SERVER_INCLUDED_TRUE= SERVER_INCLUDED_FALSE='#' else SERVER_INCLUDED_TRUE='#' SERVER_INCLUDED_FALSE= fi # if bzadmin was enabled, make sure we have curses. if test x$enable_bzadmin != xno; then if test "x$CURSES_LIB" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a curses library, will build bzadmin without curses" >&5 $as_echo "$as_me: WARNING: could not find a curses library, will build bzadmin without curses" >&2;} fi if true; then BZADMIN_INCLUDED_TRUE= BZADMIN_INCLUDED_FALSE='#' else BZADMIN_INCLUDED_TRUE='#' BZADMIN_INCLUDED_FALSE= fi else if false; then BZADMIN_INCLUDED_TRUE= BZADMIN_INCLUDED_FALSE='#' else BZADMIN_INCLUDED_TRUE='#' BZADMIN_INCLUDED_FALSE= fi fi if test "x$CURSES_LIB" != x; then HAVE_CURSES_TRUE= HAVE_CURSES_FALSE='#' else HAVE_CURSES_TRUE='#' HAVE_CURSES_FALSE= fi # see if our ares callbacks match (they won't on ares <1.5) ares_works=no if test "x$enable_ares_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ares DNS lookup functionality" >&5 $as_echo_n "checking for ares DNS lookup functionality... " >&6; } PRELIBS="$LIBS" LIBS="$LIBS $LIBCARES" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void callback(void * /*arg*/, int /*callbackStatus*/, int /*timeouts*/, struct hostent * /*hostent*/) {} int main () { ares_channel aresChannel; in_addr requestedAddress; ares_gethostbyaddr(aresChannel, &requestedAddress, sizeof(in_addr), AF_INET, callback, NULL); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ares_works=yes else ares_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$PRELIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ares_works" >&5 $as_echo "$ares_works" >&6; } fi # enable_ares_build { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the included ares lookup library" >&5 $as_echo_n "checking whether to build the included ares lookup library... " >&6; } BUILD_ARES="no (using system)" if test "x$ares_works" = "xno" ; then $as_echo "#define BUILD_ARES 1" >>confdefs.h BUILD_ARES="yes" LIBCARES='${top_builddir}/src/other/ares/libcares.la' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_ARES" >&5 $as_echo "$BUILD_ARES" >&6; } if test "x$BUILD_ARES" = "xyes"; then BUILD_ARES_TRUE= BUILD_ARES_FALSE='#' else BUILD_ARES_TRUE='#' BUILD_ARES_FALSE= fi if test "x$BUILD_ARES" = xyes ; then $as_echo "#define HAVE_ARES_LIBRARY_INIT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ares_library_init in -lcares" >&5 $as_echo_n "checking for ares_library_init in -lcares... " >&6; } if ${ac_cv_lib_cares_ares_library_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcares $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ares_library_init (); int main () { return ares_library_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_cares_ares_library_init=yes else ac_cv_lib_cares_ares_library_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cares_ares_library_init" >&5 $as_echo "$ac_cv_lib_cares_ares_library_init" >&6; } if test "x$ac_cv_lib_cares_ares_library_init" = xyes; then : $as_echo "#define HAVE_ARES_LIBRARY_INIT 1" >>confdefs.h fi fi # see if we have regex functionality regex_works=no if test "x$enable_regex_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regular expression functionality" >&5 $as_echo_n "checking for regular expression functionality... " >&6; } PRELDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $LIBREGEX" if test "$cross_compiling" = yes; then : regex_works=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H # include #endif #include int main () { regex_t re; regcomp(&re, "abc", REG_EXTENDED); regexec(&re, "", 0, 0, 0); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : regex_works=yes else regex_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LDFLAGS="$PRELDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $regex_works" >&5 $as_echo "$regex_works" >&6; } fi # enable_regex_build { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the included regular expression library" >&5 $as_echo_n "checking whether to build the included regular expression library... " >&6; } BUILD_REGEX="no (using system)" if test "x$regex_works" = "xno" ; then $as_echo "#define BUILD_REGEX 1" >>confdefs.h BUILD_REGEX="yes" LIBREGEX='${top_builddir}/src/other/regex/libregex.la' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_REGEX" >&5 $as_echo "$BUILD_REGEX" >&6; } if test "x$BUILD_REGEX" = "xyes"; then BUILD_REGEX_TRUE= BUILD_REGEX_FALSE='#' else BUILD_REGEX_TRUE='#' BUILD_REGEX_FALSE= fi # assume zlib works if we found it. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the included zlib compression library" >&5 $as_echo_n "checking whether to build the included zlib compression library... " >&6; } BUILD_ZLIB="no (using system)" if test "x$LIBZ" = "x" ; then $as_echo "#define BUILD_ZLIB 1" >>confdefs.h BUILD_ZLIB="yes" LIBZ='${top_builddir}/src/other/zlib/libz.la' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_ZLIB" >&5 $as_echo "$BUILD_ZLIB" >&6; } if test "x$BUILD_ZLIB" = "xyes"; then BUILD_ZLIB_TRUE= BUILD_ZLIB_FALSE='#' else BUILD_ZLIB_TRUE='#' BUILD_ZLIB_FALSE= fi if test "x$BUILD_ZLIB" = "xyes" ; then CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/zlib" fi BUILD_CURL="no (using system)" LIBCURL="" if test "x$enable_curl_build" != "xyes" ; then # Check whether --with-libcurl was given. if test "${with_libcurl+set}" = set; then : withval=$with_libcurl; _libcurl_with=$withval else _libcurl_with=yes fi if test "$_libcurl_with" != "no" ; then for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[1]+256*A[2]+A[3]; print X;}'" _libcurl_try_link=yes if test -d "$_libcurl_with" ; then LIBCURL_CPPFLAGS="-I$withval/include" _libcurl_ldflags="-L$withval/lib" # Extract the first word of "curl-config", so it can be a program name with args. set dummy curl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path__libcurl_config+:} false; then : $as_echo_n "(cached) " >&6 else case $_libcurl_config in [\\/]* | ?:[\\/]*) ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in "$withval/bin" do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi _libcurl_config=$ac_cv_path__libcurl_config if test -n "$_libcurl_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 $as_echo "$_libcurl_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else # Extract the first word of "curl-config", so it can be a program name with args. set dummy curl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path__libcurl_config+:} false; then : $as_echo_n "(cached) " >&6 else case $_libcurl_config in [\\/]* | ?:[\\/]*) ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi _libcurl_config=$ac_cv_path__libcurl_config if test -n "$_libcurl_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_libcurl_config" >&5 $as_echo "$_libcurl_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$_libcurl_config != "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the version of libcurl" >&5 $as_echo_n "checking for the version of libcurl... " >&6; } if ${libcurl_cv_lib_curl_version+:} false; then : $as_echo_n "(cached) " >&6 else libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $2}'` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_version" >&5 $as_echo "$libcurl_cv_lib_curl_version" >&6; } _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` _libcurl_wanted=`echo 0 | $_libcurl_version_parse` if test $_libcurl_wanted -gt 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcurl >= version " >&5 $as_echo_n "checking for libcurl >= version ... " >&6; } if ${libcurl_cv_lib_version_ok+:} false; then : $as_echo_n "(cached) " >&6 else if test $_libcurl_version -ge $_libcurl_wanted ; then libcurl_cv_lib_version_ok=yes else libcurl_cv_lib_version_ok=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_version_ok" >&5 $as_echo "$libcurl_cv_lib_version_ok" >&6; } fi if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then if test x"$LIBCURL_CPPFLAGS" = "x" ; then LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` fi if test x"$LIBCURL" = "x" ; then LIBCURL=`$_libcurl_config --libs` # This is so silly, but Apple actually has a bug in their # curl-config script. Fixed in Tiger, but there are still # lots of Panther installs around. case "${host}" in powerpc-apple-darwin7*) LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` ;; esac fi # All curl-config scripts support --feature _libcurl_features=`$_libcurl_config --feature` # Is it modern enough to have --protocols? (7.12.4) if test $_libcurl_version -ge 461828 ; then _libcurl_protocols=`$_libcurl_config --protocols` fi else _libcurl_try_link=no fi unset _libcurl_wanted fi if test $_libcurl_try_link = yes ; then # we didn't find curl-config, so let's see if the user-supplied # link line (or failing that, "-lcurl") is enough. LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libcurl is usable" >&5 $as_echo_n "checking whether libcurl is usable... " >&6; } if ${libcurl_cv_lib_curl_usable+:} false; then : $as_echo_n "(cached) " >&6 else _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBCURL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { /* Try and use a few common options to force a failure if we are missing symbols or can't link. */ int x; curl_easy_setopt(NULL,CURLOPT_URL,NULL); x=CURL_ERROR_SIZE; x=CURLOPT_WRITEFUNCTION; x=CURLOPT_FILE; x=CURLOPT_ERRORBUFFER; x=CURLOPT_STDERR; x=CURLOPT_VERBOSE; ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : libcurl_cv_lib_curl_usable=yes else libcurl_cv_lib_curl_usable=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libcurl_cv_lib_curl_usable" >&5 $as_echo "$libcurl_cv_lib_curl_usable" >&6; } if test $libcurl_cv_lib_curl_usable = yes ; then # Does curl_free() exist in this version of libcurl? # If not, fake it with free() _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBS $LIBCURL" ac_fn_cxx_check_func "$LINENO" "curl_free" "ac_cv_func_curl_free" if test "x$ac_cv_func_curl_free" = xyes; then : else $as_echo "#define curl_free free" >>confdefs.h fi CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs $as_echo "#define HAVE_LIBCURL 1" >>confdefs.h for _libcurl_feature in $_libcurl_features ; do cat >>confdefs.h <<_ACEOF #define `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_cpp` 1 _ACEOF eval `$as_echo "libcurl_feature_$_libcurl_feature" | $as_tr_sh`=yes done if test "x$_libcurl_protocols" = "x" ; then # We don't have --protocols, so just assume that all # protocols are available _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP" if test x$libcurl_feature_SSL = xyes ; then _libcurl_protocols="$_libcurl_protocols HTTPS" # FTPS wasn't standards-compliant until version # 7.11.0 (0x070b00 == 461568) if test $_libcurl_version -ge 461568; then _libcurl_protocols="$_libcurl_protocols FTPS" fi fi # RTSP, IMAP, POP3 and SMTP were added in # 7.20.0 (0x071400 == 463872) if test $_libcurl_version -ge 463872; then _libcurl_protocols="$_libcurl_protocols RTSP IMAP POP3 SMTP" fi fi for _libcurl_protocol in $_libcurl_protocols ; do cat >>confdefs.h <<_ACEOF #define `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_cpp` 1 _ACEOF eval `$as_echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_sh`=yes done else unset LIBCURL unset LIBCURL_CPPFLAGS fi fi unset _libcurl_try_link unset _libcurl_version_parse unset _libcurl_config unset _libcurl_feature unset _libcurl_features unset _libcurl_protocol unset _libcurl_protocols unset _libcurl_version unset _libcurl_ldflags fi if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then # This is the IF-NO path : else # This is the IF-YES path : fi unset _libcurl_with fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the included curl library" >&5 $as_echo_n "checking whether to build the included curl library... " >&6; } if test "x$LIBCURL" = "x" ; then $as_echo "#define BUILD_CURL 1" >>confdefs.h BUILD_CURL="yes" LIBCURL='${top_builddir}/src/other/curl/lib/libcurl.la' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_CURL" >&5 $as_echo "$BUILD_CURL" >&6; } if test "x$BUILD_CURL" = "xyes"; then BUILD_CURL_TRUE= BUILD_CURL_FALSE='#' else BUILD_CURL_TRUE='#' BUILD_CURL_FALSE= fi if test "x$BUILD_CURL" = "xyes" ; then CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/curl/include" fi # GLEW if test "x$enable_client" != "xno" ; then # Check for the GLEW library (GL Extension Wrangler) if test "x$enable_glew_build" != "xyes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLEW library" >&5 $as_echo_n "checking for GLEW library... " >&6; } tmpLIBS=$LIBS GLEW_LIBS="-lGLEW" LIBS=$GLEW_LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (GLEW_VERSION_3_0) { glewInit(); } ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : glew_check="yes" else glew_check="no (missing, or older than version 1.5.1)" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "x$glew_check" != "xyes"; then GLEW_LIBS="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glew_check" >&5 $as_echo "$glew_check" >&6; } LIBS=$tmpLIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the included GLEW library" >&5 $as_echo_n "checking whether to build the included GLEW library... " >&6; } BUILD_GLEW="no (using system)" if test "x$GLEW_LIBS" = "x" ; then if test "x$enable_glew_build" = xno ; then BUILD_GLEW=no else BUILD_GLEW="yes" CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/glew/include" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BUILD_GLEW" >&5 $as_echo "$BUILD_GLEW" >&6; } else # enable_client BUILD_GLEW="no (clients disabled)" { $as_echo "$as_me:${as_lineno-$LINENO}: GLEW is disabled because no clients are being built" >&5 $as_echo "$as_me: GLEW is disabled because no clients are being built" >&6;} fi # enable_client if test "x$BUILD_GLEW" = "xyes"; then BUILD_GLEW_TRUE= BUILD_GLEW_FALSE='#' else BUILD_GLEW_TRUE='#' BUILD_GLEW_FALSE= fi if test "x$BUILD_GLEW" = xyes -o "x$glew_check" = xyes; then $as_echo "#define HAVE_GLEW 1" >>confdefs.h fi # make sure ECHO and ECHO_N got defined and substituted if test "x$ECHO" = "x" ; then ECHO=echo { $as_echo "$as_me:${as_lineno-$LINENO}: ECHO was not defined by configure so defining manually" >&5 $as_echo "$as_me: ECHO was not defined by configure so defining manually" >&6;} fi _bc_stage="output" _bc_status="9 of 9" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking ... $_bc_stage" >&5 $as_echo_n "checking ... $_bc_stage... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: ($_bc_status)" >&5 $as_echo "($_bc_status)" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi LIBDIR="\$(top_srcdir)/lib" # stash the current configuration args before adding additional ones # for subconfigure bz_configure_args="$ac_configure_args" subdirs="$subdirs src/other/ares" if test "x$BUILD_ARES$BUILD_CURL" = "xyesyes" ; then # instruct curl to use the included ares ac_configure_args="$ac_configure_args --enable-ares --disable-manual" case $host_os in solaris*) if test "$GCC" != yes; then # Solaris 10 SSL libraries are compatible only with gcc ac_configure_args="$ac_configure_args --without-ssl" fi ;; esac fi subdirs="$subdirs src/other/curl" ac_config_files="$ac_config_files BZFlag.xcodeproj/Makefile MSVC/Makefile MSVC/build/Makefile Makefile bzflag.lsm bzflag.spec data/Makefile data/fonts/Makefile data/l10n/Makefile include/Makefile m4/Makefile man/Makefile misc/Makefile package/Makefile package/irix/Makefile package/linux/Makefile package/rpm/Makefile package/win32/Makefile package/win32/nsis/Makefile plugins/HoldTheFlag/Makefile plugins/Makefile plugins/Phoenix/Makefile plugins/RogueGenocide/Makefile plugins/SAMPLE_PLUGIN/Makefile plugins/TimeLimit/Makefile plugins/airspawn/Makefile plugins/autoFlagReset/Makefile plugins/chathistory/Makefile plugins/customflagsample/Makefile plugins/fairCTF/Makefile plugins/fastmap/Makefile plugins/flagStay/Makefile plugins/hiddenAdmin/Makefile plugins/keepaway/Makefile plugins/killall/Makefile plugins/koth/Makefile plugins/logDetail/Makefile plugins/nagware/Makefile plugins/playHistoryTracker/Makefile plugins/plugin_utils/Makefile plugins/rabbitTimer/Makefile plugins/rabidRabbit/Makefile plugins/recordmatch/Makefile plugins/regFlag/Makefile plugins/serverControl/Makefile plugins/shockwaveDeath/Makefile plugins/teamflagreset/Makefile plugins/thiefControl/Makefile plugins/timedctf/Makefile plugins/wwzones/Makefile src/3D/Makefile src/Makefile src/bzadmin/Makefile src/bzflag/Makefile src/bzfs/Makefile src/common/Makefile src/date/Makefile src/game/Makefile src/geometry/Makefile src/geometry/models/Makefile src/geometry/models/tank/Makefile src/mediafile/Makefile src/net/Makefile src/obstacle/Makefile src/ogl/Makefile src/platform/MacOSX/BZFlag-Info.plist src/other/Makefile src/other/regex/Makefile src/other/zlib/Makefile src/platform/MacOSX/Makefile src/platform/Makefile src/scene/Makefile tools/Makefile tools/TextTool-W32/Makefile tools/TextTool-W32/res/Makefile tools/bzwtransform/Makefile tools/modeltool/Makefile tools/modeltool/MSVC/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_PLUGINS_TRUE}" && test -z "${BUILD_PLUGINS_FALSE}"; then as_fn_error $? "conditional \"BUILD_PLUGINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HASPOD2MAN_TRUE}" && test -z "${HASPOD2MAN_FALSE}"; then as_fn_error $? "conditional \"HASPOD2MAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_SDL_TRUE}" && test -z "${HAVE_SDL_FALSE}"; then as_fn_error $? "conditional \"HAVE_SDL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUGGY_MIPSPRO_TRUE}" && test -z "${BUGGY_MIPSPRO_FALSE}"; then as_fn_error $? "conditional \"BUGGY_MIPSPRO\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HPUX_TRUE}" && test -z "${HPUX_FALSE}"; then as_fn_error $? "conditional \"HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BEOS_TRUE}" && test -z "${BEOS_FALSE}"; then as_fn_error $? "conditional \"BEOS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IRIX_TRUE}" && test -z "${IRIX_FALSE}"; then as_fn_error $? "conditional \"IRIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MACOS_TRUE}" && test -z "${MACOS_FALSE}"; then as_fn_error $? "conditional \"MACOS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SOLARIS_TRUE}" && test -z "${SOLARIS_FALSE}"; then as_fn_error $? "conditional \"SOLARIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then as_fn_error $? "conditional \"WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PC_TRUE}" && test -z "${PC_FALSE}"; then as_fn_error $? "conditional \"PC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PPC_TRUE}" && test -z "${PPC_FALSE}"; then as_fn_error $? "conditional \"PPC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CLIENT_INCLUDED_TRUE}" && test -z "${CLIENT_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"CLIENT_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CLIENT_INCLUDED_TRUE}" && test -z "${CLIENT_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"CLIENT_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CLIENT_INCLUDED_TRUE}" && test -z "${CLIENT_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"CLIENT_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SERVER_INCLUDED_TRUE}" && test -z "${SERVER_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"SERVER_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BZADMIN_INCLUDED_TRUE}" && test -z "${BZADMIN_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"BZADMIN_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BZADMIN_INCLUDED_TRUE}" && test -z "${BZADMIN_INCLUDED_FALSE}"; then as_fn_error $? "conditional \"BZADMIN_INCLUDED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CURSES_TRUE}" && test -z "${HAVE_CURSES_FALSE}"; then as_fn_error $? "conditional \"HAVE_CURSES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_ARES_TRUE}" && test -z "${BUILD_ARES_FALSE}"; then as_fn_error $? "conditional \"BUILD_ARES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_REGEX_TRUE}" && test -z "${BUILD_REGEX_FALSE}"; then as_fn_error $? "conditional \"BUILD_REGEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_ZLIB_TRUE}" && test -z "${BUILD_ZLIB_FALSE}"; then as_fn_error $? "conditional \"BUILD_ZLIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_CURL_TRUE}" && test -z "${BUILD_CURL_FALSE}"; then as_fn_error $? "conditional \"BUILD_CURL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GLEW_TRUE}" && test -z "${BUILD_GLEW_FALSE}"; then as_fn_error $? "conditional \"BUILD_GLEW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by BZFlag $as_me 2.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ BZFlag config.status 2.4.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "BZFlag.xcodeproj/Makefile") CONFIG_FILES="$CONFIG_FILES BZFlag.xcodeproj/Makefile" ;; "MSVC/Makefile") CONFIG_FILES="$CONFIG_FILES MSVC/Makefile" ;; "MSVC/build/Makefile") CONFIG_FILES="$CONFIG_FILES MSVC/build/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "bzflag.lsm") CONFIG_FILES="$CONFIG_FILES bzflag.lsm" ;; "bzflag.spec") CONFIG_FILES="$CONFIG_FILES bzflag.spec" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/fonts/Makefile") CONFIG_FILES="$CONFIG_FILES data/fonts/Makefile" ;; "data/l10n/Makefile") CONFIG_FILES="$CONFIG_FILES data/l10n/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "misc/Makefile") CONFIG_FILES="$CONFIG_FILES misc/Makefile" ;; "package/Makefile") CONFIG_FILES="$CONFIG_FILES package/Makefile" ;; "package/irix/Makefile") CONFIG_FILES="$CONFIG_FILES package/irix/Makefile" ;; "package/linux/Makefile") CONFIG_FILES="$CONFIG_FILES package/linux/Makefile" ;; "package/rpm/Makefile") CONFIG_FILES="$CONFIG_FILES package/rpm/Makefile" ;; "package/win32/Makefile") CONFIG_FILES="$CONFIG_FILES package/win32/Makefile" ;; "package/win32/nsis/Makefile") CONFIG_FILES="$CONFIG_FILES package/win32/nsis/Makefile" ;; "plugins/HoldTheFlag/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/HoldTheFlag/Makefile" ;; "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;; "plugins/Phoenix/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Phoenix/Makefile" ;; "plugins/RogueGenocide/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/RogueGenocide/Makefile" ;; "plugins/SAMPLE_PLUGIN/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/SAMPLE_PLUGIN/Makefile" ;; "plugins/TimeLimit/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/TimeLimit/Makefile" ;; "plugins/airspawn/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/airspawn/Makefile" ;; "plugins/autoFlagReset/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/autoFlagReset/Makefile" ;; "plugins/chathistory/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/chathistory/Makefile" ;; "plugins/customflagsample/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/customflagsample/Makefile" ;; "plugins/fairCTF/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fairCTF/Makefile" ;; "plugins/fastmap/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fastmap/Makefile" ;; "plugins/flagStay/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/flagStay/Makefile" ;; "plugins/hiddenAdmin/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/hiddenAdmin/Makefile" ;; "plugins/keepaway/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/keepaway/Makefile" ;; "plugins/killall/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/killall/Makefile" ;; "plugins/koth/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/koth/Makefile" ;; "plugins/logDetail/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/logDetail/Makefile" ;; "plugins/nagware/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/nagware/Makefile" ;; "plugins/playHistoryTracker/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/playHistoryTracker/Makefile" ;; "plugins/plugin_utils/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/plugin_utils/Makefile" ;; "plugins/rabbitTimer/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/rabbitTimer/Makefile" ;; "plugins/rabidRabbit/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/rabidRabbit/Makefile" ;; "plugins/recordmatch/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/recordmatch/Makefile" ;; "plugins/regFlag/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/regFlag/Makefile" ;; "plugins/serverControl/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/serverControl/Makefile" ;; "plugins/shockwaveDeath/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/shockwaveDeath/Makefile" ;; "plugins/teamflagreset/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/teamflagreset/Makefile" ;; "plugins/thiefControl/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/thiefControl/Makefile" ;; "plugins/timedctf/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/timedctf/Makefile" ;; "plugins/wwzones/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/wwzones/Makefile" ;; "src/3D/Makefile") CONFIG_FILES="$CONFIG_FILES src/3D/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/bzadmin/Makefile") CONFIG_FILES="$CONFIG_FILES src/bzadmin/Makefile" ;; "src/bzflag/Makefile") CONFIG_FILES="$CONFIG_FILES src/bzflag/Makefile" ;; "src/bzfs/Makefile") CONFIG_FILES="$CONFIG_FILES src/bzfs/Makefile" ;; "src/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/common/Makefile" ;; "src/date/Makefile") CONFIG_FILES="$CONFIG_FILES src/date/Makefile" ;; "src/game/Makefile") CONFIG_FILES="$CONFIG_FILES src/game/Makefile" ;; "src/geometry/Makefile") CONFIG_FILES="$CONFIG_FILES src/geometry/Makefile" ;; "src/geometry/models/Makefile") CONFIG_FILES="$CONFIG_FILES src/geometry/models/Makefile" ;; "src/geometry/models/tank/Makefile") CONFIG_FILES="$CONFIG_FILES src/geometry/models/tank/Makefile" ;; "src/mediafile/Makefile") CONFIG_FILES="$CONFIG_FILES src/mediafile/Makefile" ;; "src/net/Makefile") CONFIG_FILES="$CONFIG_FILES src/net/Makefile" ;; "src/obstacle/Makefile") CONFIG_FILES="$CONFIG_FILES src/obstacle/Makefile" ;; "src/ogl/Makefile") CONFIG_FILES="$CONFIG_FILES src/ogl/Makefile" ;; "src/platform/MacOSX/BZFlag-Info.plist") CONFIG_FILES="$CONFIG_FILES src/platform/MacOSX/BZFlag-Info.plist" ;; "src/other/Makefile") CONFIG_FILES="$CONFIG_FILES src/other/Makefile" ;; "src/other/regex/Makefile") CONFIG_FILES="$CONFIG_FILES src/other/regex/Makefile" ;; "src/other/zlib/Makefile") CONFIG_FILES="$CONFIG_FILES src/other/zlib/Makefile" ;; "src/platform/MacOSX/Makefile") CONFIG_FILES="$CONFIG_FILES src/platform/MacOSX/Makefile" ;; "src/platform/Makefile") CONFIG_FILES="$CONFIG_FILES src/platform/Makefile" ;; "src/scene/Makefile") CONFIG_FILES="$CONFIG_FILES src/scene/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "tools/TextTool-W32/Makefile") CONFIG_FILES="$CONFIG_FILES tools/TextTool-W32/Makefile" ;; "tools/TextTool-W32/res/Makefile") CONFIG_FILES="$CONFIG_FILES tools/TextTool-W32/res/Makefile" ;; "tools/bzwtransform/Makefile") CONFIG_FILES="$CONFIG_FILES tools/bzwtransform/Makefile" ;; "tools/modeltool/Makefile") CONFIG_FILES="$CONFIG_FILES tools/modeltool/Makefile" ;; "tools/modeltool/MSVC/Makefile") CONFIG_FILES="$CONFIG_FILES tools/modeltool/MSVC/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # restore back after AC_OUTPUT for recheck ac_configure_args="$bz_configure_args" ################# # patch libtool # ################# case $host_os in darwin*) for script in $ac_top_builddir $ac_abs_builddir $ac_builddir . ; do if test "x$script" = "x" ; then libtoolscript="libtool" else libtoolscript="${script}/libtool" fi if test -f ${libtoolscript} ; then if test -w ${libtoolscript} ; then # remove any -all_load option. # provokes libtool linker bug with noinst C++ libraries. sed 's/-all_load.*convenience//g' < $libtoolscript > ${libtoolscript}.sed if test ! "x`cat ${libtoolscript}`" = "x`cat ${libtoolscript}.sed`" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Found -all_load in libtool script, removing" >&5 $as_echo "Found -all_load in libtool script, removing" >&6; } cp ${libtoolscript}.sed ${libtoolscript} fi rm -f ${libtoolscript}.sed else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libtool script exists but is not writable so not attempting to edit" >&5 $as_echo "$as_me: WARNING: libtool script exists but is not writable so not attempting to edit" >&2;} fi fi done ;; esac if test "x$enable_client" = "xno"; then if test "x$have_gl" = "xno" ; then build_bzflag="no bzflag client binary! (need OpenGL)" else build_bzflag="no bzflag client binary!" fi else if test x$with_SDL != xno; then build_bzflag="yes (with SDL)" else build_bzflag="yes" fi fi if test "x$enable_plugins" != xno ; then build_bzfs="yes (with plugins)" else build_bzfs="yes (without plugins)" fi if test "x$enable_bzadmin" = "xno"; then if test "x$CURSES_LIB" = x; then build_bzadmin="no bzadmin binary! (need Curses)" else build_bzadmin="no bzadmin binary!" fi else build_bzadmin="yes" fi prefix=`eval "echo $prefix"` prefix=`eval "echo $prefix"` bindir=`eval "echo $bindir"` bindir=`eval "echo $bindir"` libdir=`eval "echo $libdir"` libdir=`eval "echo $libdir"` mandir=`eval "echo $mandir"` mandir=`eval "echo $mandir"` if test -x "${srcdir}/misc/elapsed.sh" ; then time_elapsed="`${srcdir}/misc/elapsed.sh $CONF_TIME`" else time_elapsed="unknown" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Done." >&5 $as_echo "Done." >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: BZFlag-$BZFLAG_VERSION.$CONF_DATE configured with the following:" >&5 $as_echo "BZFlag-$BZFLAG_VERSION.$CONF_DATE configured with the following:" >&6; } if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Prefix: ${prefix}" >&5 $as_echo " Prefix: ${prefix}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Binaries: ${bindir}" >&5 $as_echo " Binaries: ${bindir}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Plugins: ${libdir}" >&5 $as_echo " Plugins: ${libdir}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Manual pages: ${mandir}" >&5 $as_echo " Manual pages: ${mandir}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CC = ${CC}" >&5 $as_echo "CC = ${CC}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CXX = ${CXX}" >&5 $as_echo "CXX = ${CXX}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CFLAGS = ${CFLAGS}" >&5 $as_echo "CFLAGS = ${CFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CONF_CFLAGS = ${CONF_CFLAGS}" >&5 $as_echo "CONF_CFLAGS = ${CONF_CFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CXXFLAGS = ${CXXFLAGS}" >&5 $as_echo "CXXFLAGS = ${CXXFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CONF_CXXFLAGS = ${CONF_CXXFLAGS}" >&5 $as_echo "CONF_CXXFLAGS = ${CONF_CXXFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CPPFLAGS = ${CPPFLAGS}" >&5 $as_echo "CPPFLAGS = ${CPPFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CONF_CPPFLAGS = ${CONF_CPPFLAGS}" >&5 $as_echo "CONF_CPPFLAGS = ${CONF_CPPFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: LDFLAGS = ${LDFLAGS}" >&5 $as_echo "LDFLAGS = ${LDFLAGS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: LIBS = ${LIBS}" >&5 $as_echo "LIBS = ${LIBS}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build ares ........: $BUILD_ARES" >&5 $as_echo "Build ares ........: $BUILD_ARES" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build curl ........: $BUILD_CURL" >&5 $as_echo "Build curl ........: $BUILD_CURL" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build glew ........: $BUILD_GLEW" >&5 $as_echo "Build glew ........: $BUILD_GLEW" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build regex .......: $BUILD_REGEX" >&5 $as_echo "Build regex .......: $BUILD_REGEX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Build zlib ........: $BUILD_ZLIB" >&5 $as_echo "Build zlib ........: $BUILD_ZLIB" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: BZFlag client .....: $build_bzflag" >&5 $as_echo "BZFlag client .....: $build_bzflag" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: BZFlag server .....: $build_bzfs" >&5 $as_echo "BZFlag server .....: $build_bzfs" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: BZAdmin client ....: $build_bzadmin" >&5 $as_echo "BZAdmin client ....: $build_bzadmin" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "x$time_elapsed" != "xunknown" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Elapsed configuration time: $time_elapsed" >&5 $as_echo "Elapsed configuration time: $time_elapsed" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ---" >&5 $as_echo "---" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $0 complete, type 'make' to begin building" >&5 $as_echo "$0 complete, type 'make' to begin building" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } # Local Variables: # tab-width: 8 # mode: autoconf # sh-indentation: 4 # sh-basic-offset: 4 # indent-tabs-mode: t # End: # ex: shiftwidth=4 tabstop=8 bzflag-2.4.2+ds1/configure.ac000066400000000000000000001175331200563112200157370ustar00rootroot00000000000000dnl C O N F I G U R E . A C dnl BZFlag dnl Copyright (c) 1993-2012 Tim Riker dnl dnl This package is free software; you can redistribute it and/or dnl modify it under the terms of the license found in the file dnl named COPYING that should have accompanied this file. dnl dnl THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR dnl IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED dnl WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. dnl dnl ****************************************************************** dnl *** BZFlag's configure.ac *** dnl ****************************************************************** dnl dnl Herein lies the venerable GNU build system configure template for dnl BZFlag. As best is reasonably possible, proper ordering and dnl separation of tests and settings should be maintained per the dnl recommended standard layout. The tests should be added to the dnl rather clearly labeled sections below so that they are as dnl follows: dnl dnl 0) information on the package dnl 1) check command-line arguments dnl 2) check programs dnl 3) check libraries dnl 4) check headers dnl 5) check types/structures dnl 6) check compiler characteristics dnl 7) check functions dnl 8) check system services dnl 9) output a summary dnl dnl You should use enable/disable arguments for build settings and dnl optional compilation components that are part of this package. dnl You specify with/without arguments for components that are not a dnl part of this package. dnl dnl TODO: This mess (still) needs serious cleaning up. dnl dnl Minimum version of autoconf required. Should coincide with the dnl setting in the autogen.sh script. AC_PREREQ(2.58) AC_INIT(BZFlag, 2.4.2, [http://BZFlag.org/], bzflag) AC_CONFIG_SRCDIR(src/bzflag/bzflag.cxx) AC_REVISION($Revision: 22524 $) AC_CONFIG_MACRO_DIR([m4]) # When --libdir has not been used put plugins in bzflag's own directory. if test "x$libdir" = 'x${exec_prefix}/lib' ; then libdir="$libdir/bzflag" fi AC_CONFIG_AUX_DIR(misc) # sed magic to get version numbers from src/date/buildDate.cxx MAJOR_VERSION=`sed -e 's/#.*define.*BZ_MAJOR_VERSION[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` MINOR_VERSION=`sed -e 's/#.*define.*BZ_MINOR_VERSION[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` REV=`sed -e 's/#.*define.*BZ_REV[^0-9]*\(.*\)/\1/' -e t -e d < \$srcdir/src/date/buildDate.cxx` CONF_DATE=`date -u +%Y%m%d` BZFLAG_DATE=`date -u +%Y-%m-%d` BZFLAG_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$REV" CONF_TIME="`date '+%H %M %S'`" # print out the title with a pretty box computed to wrap around title="Configuring BZFlag $BZFLAG_VERSION, Build $CONF_DATE" length="`echo x${title}x | wc -c`" separator="" while test $length -gt 1 ; do separator="${separator}*" length="`expr $length - 1`" done BZ_BOLD AC_MSG_RESULT([***${separator}***]) AC_MSG_RESULT([*** ${title} ***]) AC_MSG_RESULT([***${separator}***]) BZ_UNBOLD AC_CANONICAL_TARGET dnl Minimum version of automake required. Should coincide with the dnl setting in the autogen.sh script. Create the other archives dnl automatically when doing a make dist for convenience. AM_INIT_AUTOMAKE([1.6 dist-zip dist-bzip2]) dnl all configured definitions get written here AM_CONFIG_HEADER([include/config.h]) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(BZFLAG_VERSION) AC_SUBST(BZFLAG_DATE) AC_SUBST(CONF_TIME) # Let the C++ code know about OS AC_DEFINE_UNQUOTED(BZ_BUILD_OS, "$host_os", [BZFlag System Environment]) # automatically enable and load our configure cache file if available BZ_CONFIG_CACHE([config.cache.${host_os}.${ac_hostname}]) dnl *********************** dnl *** Check arguments *** dnl *********************** BZ_CONFIGURE_STAGE([arguments], [1 of 9]) # provide a with-curses option, test for curses MP_WITH_CURSES # check for SDL option (enabled by default now) AC_ARG_WITH(SDL, [ --without-SDL do not use Simple DirectMedia Layer]) if test x$with_SDL != xno; then with_SDL=yes fi # check whether plugins are desired AC_ARG_ENABLE(plugins, AC_HELP_STRING([--disable-plugins],[do not compile plugins])) if test "x$enable_plugins" != xno ; then AC_DEFINE(BZ_PLUGINS, 1, [Enable plugins]) fi AM_CONDITIONAL(BUILD_PLUGINS, test "x$enable_plugins" != "xno") # check whether threads are desired AC_ARG_ENABLE(threads, [ --disable-threads build without threading]) # do we want bzadmin? AC_ARG_ENABLE(bzadmin, [ --disable-bzadmin do not build text client]) # build a binary set to stop functioning after some date AC_ARG_ENABLE(timebomb, [ --enable-timebomb build exp Date]) if test x$enable_timebomb = xyes; then AC_DEFINE(TIME_BOMB, "3/13/1998", [Time Bomb expiration]) fi AC_ARG_ENABLE(robots, [ --disable-robots disable robots]) if test x$enable_robots != xno; then AC_DEFINE(ROBOT, 1, [Enabling Robots]) fi # debugging and profiling AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging]) AC_ARG_ENABLE(profiling, [ --enable-profiling turn on profiling]) # profiling requires debugging if test x$enable_profiling = xyes; then enable_debug=yes fi if test x$enable_debug = xyes; then AC_DEFINE(DEBUG, 1, [Debugging]) AC_DEFINE(DEBUG_RENDERING, 1, [Debug Rendering]) user_CFLAGS="$ac_save_CFLAGS" user_CXXFLAGS="$CXXFLAGS" # ac_save_CXXFLAGS is not set yet fi # do we want the bzflag client? AC_ARG_ENABLE(client, [ --disable-client server-only build]) # compile our own ares AC_ARG_ENABLE(ares_build, [ --enable-ares-build Force compilation of ares]) # compile our own curl AC_ARG_ENABLE(curl_build, [ --enable-curl-build Force compilation of curl]) # compile our own glew AC_ARG_WITH(included-glew, AC_HELP_STRING([--with-included-glew],[build with included GLEW library]), [enable_glew_build="$withval"], ) # compile our own regex AC_ARG_ENABLE(regex_build, [ --enable-regex-build Force compilation of regex]) # compile our own zlib AC_ARG_ENABLE(zlib_build, [ --enable-zlib-build Force compilation of zlib]) # compile everything bz provides AC_ARG_ENABLE(all_builds, [ --enable-all-builds Force compilation of all dependencies]) # enable compilation of all bundled external dependencies if test "x$enable_all_builds" = "xyes" ; then enable_ares_build=yes enable_curl_build=yes enable_glew_build=yes enable_regex_build=yes enable_zlib_build=yes fi # enable UPnP for server AC_ARG_ENABLE(UPnP, [ --enable-UPnP Use UPnP for server], , [enable_UPnP=no]) dnl ************************** dnl *** Check for programs *** dnl ************************** BZ_CONFIGURE_STAGE([programs], [2 of 9]) # cannot override LD directly, so warn (configure will override it) if test "x$LD" != "x" ; then AC_MSG_WARN([LD cannot be set directly yet it seems to be set ($LD)]) fi #Checks for programs. AC_PROG_MAKE_SET AM_PROG_MKDIR_P AC_PROG_CXX AC_PROG_CC AC_PROG_LN_S AC_CHECK_PROG(AR, ar, ar) AC_SUBST(AR) AC_SUBST(AR_FLAGS) AC_PATH_PROG(CCACHE, ccache) if test "$CCACHE" ; then CC="ccache $CC" CXX="ccache $CXX" fi AC_CHECK_TOOL(WINDRES, windres, :) # libtool shouldn't be generated until after LD is set. # AC_PROG_LIBTOOL goes poof in libtool 1.9, but that's not very # widespread at all. # LT_INIT AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) # quell the verbosity LIBTOOLFLAGS=--silent AC_SUBST(LIBTOOLFLAGS) if test "x$LIBTOOL" != "x" ; then LIBTOOL="$LIBTOOL --silent" fi AC_CHECK_PROG(HASPOD2MAN, pod2man, yes, no) if test $HASPOD2MAN = no; then AC_MSG_WARN([some man pages will not be generated]) fi AM_CONDITIONAL(HASPOD2MAN, test $HASPOD2MAN = yes) dnl *************************** dnl *** Check for libraries *** dnl *************************** BZ_CONFIGURE_STAGE([libraries], [3 of 9]) # FIXME: move other library checks here dnl explicitly link with the dl library when available AC_CHECK_LIB(dl, dlopen, LIBDL="-ldl", LIBDL="") AC_SUBST(LIBDL) dnl detect a usable system zlib compression library if test "x$enable_zlib_build" != "xyes" ; then AC_CHECK_LIB(z, compressBound, LIBZ="-lz", LIBZ="") fi dnl detect a usable system c-ares lookup library if test "x$enable_ares_build" != "xyes" ; then AC_CHECK_LIB(cares, ares_init, LIBCARES="-lcares", LIBCARES="") fi dnl detect a usable system regular expression library if test "x$enable_regex_build" != "xyes" ; then AC_CHECK_LIB(c, regcomp, LIBREGEX="-lc", [AC_CHECK_LIB(regex, regcomp, LIBREGEX="-lregex", [AC_CHECK_LIB(compat, regcomp, LIBREGEX="-lcompat", LIBREGEX="")] )] ) fi dnl detect a usable system -lrt library for shm_open() AC_CHECK_LIB(rt, shm_open, LIBRT="-lrt", LIBRT="") AC_SUBST(LIBRT) # Check for the math lib AC_CHECK_LIB(m, sqrtf) # for BeOS - old network stack don't have those libs ( move it in the case switch ?) AC_CHECK_LIB([socket], [socket]) AC_CHECK_LIB([socket], [gethostent], [], AC_CHECK_LIB([bind], [gethostent])) # see if pthreads are in libc_r (as on FreeBSD) or libpthread AC_CHECK_LIB([c_r], [pthread_create], LIBPTHREAD="-lc_r", [AC_CHECK_LIB([pthread], [pthread_create], LIBPTHREAD="-lpthread", LIBPTHREAD="")] ) # check for various IEEE and c99 standard math functions in libm AC_CHECK_LIB([m], [acosf], [AC_DEFINE([HAVE_ACOSF],[1],[libm includes acosf])]) AC_CHECK_LIB([m], [asinf], [AC_DEFINE([HAVE_ASINF],[1],[libm includes asinf])]) AC_CHECK_LIB([m], [atan2f], [AC_DEFINE([HAVE_ATAN2F],[1],[libm includes atan2f])]) AC_CHECK_LIB([m], [atanf], [AC_DEFINE([HAVE_ATANF],[1],[libm includes atanf])]) AC_CHECK_LIB([m], [ceilf], [AC_DEFINE([HAVE_CEILF],[1],[libm includes ceilf])]) AC_CHECK_LIB([m], [cosf], [AC_DEFINE([HAVE_COSF],[1],[libm includes cosf])]) AC_CHECK_LIB([m], [expf], [AC_DEFINE([HAVE_EXPF],[1],[libm includes expf])]) AC_CHECK_LIB([m], [fabsf], [AC_DEFINE([HAVE_FABSF],[1],[libm includes fabsf])]) AC_CHECK_LIB([m], [floorf], [AC_DEFINE([HAVE_FLOORF],[1],[libm includes floorf])]) AC_CHECK_LIB([m], [fmodf], [AC_DEFINE([HAVE_FMODF],[1],[libm includes fmodf])]) AC_CHECK_LIB([m], [hypotf], [AC_DEFINE([HAVE_HYPOTF],[1],[libm includes hypotf])]) AC_CHECK_LIB([m], [logf], [AC_DEFINE([HAVE_LOGF],[1],[libm includes logf])]) AC_CHECK_LIB([m], [log10f], [AC_DEFINE([HAVE_LOG10F],[1],[libm includes log10f])]) AC_CHECK_LIB([m], [powf], [AC_DEFINE([HAVE_POWF],[1],[libm includes powf])]) AC_CHECK_LIB([m], [sinf], [AC_DEFINE([HAVE_SINF],[1],[libm includes sinf])]) AC_CHECK_LIB([m], [sqrtf], [AC_DEFINE([HAVE_SQRTF],[1],[libm includes sqrtf])]) AC_CHECK_LIB([m], [tanf], [AC_DEFINE([HAVE_TANF],[1],[libm includes tanf])]) AC_MSG_CHECKING([for numeric type sizes]) AC_CHECK_SIZEOF(int) AC_CHECK_SIZEOF(short int) AC_CHECK_SIZEOF(long int) AC_CHECK_SIZEOF(long long int) AC_CHECK_SIZEOF(float) AC_CHECK_SIZEOF(double) AC_CHECK_SIZEOF(long double) AC_DEFINE_UNQUOTED(SIZEOF_INT, $ac_cv_sizeof_int, [sizeof int]) AC_DEFINE_UNQUOTED(SIZEOF_SHORT_INT, $ac_cv_sizeof_short_int, [sizeof short int]) AC_DEFINE_UNQUOTED(SIZEOF_LONG_INT, $ac_cv_sizeof_long_int, [sizeof long int]) AC_DEFINE_UNQUOTED(SIZEOF_LONG_LONG_INT, $ac_cv_sizeof_long_long_int, [sizeof long long int]) AC_DEFINE_UNQUOTED(SIZEOF_FLOAT, $ac_cv_sizeof_float, [sizeof float]) AC_DEFINE_UNQUOTED(SIZEOF_DOUBLE, $ac_cv_sizeof_double, [sizeof double]) AC_DEFINE_UNQUOTED(SIZEOF_LONG_DOUBLE, $ac_cv_sizeof_long_double, [sizeof long double]) dnl ************************* dnl *** Check for headers *** dnl ************************* BZ_CONFIGURE_STAGE([headers], [4 of 9]) AC_HEADER_STDC AC_LANG(C++) AC_CHECK_HEADERS( \ cmath \ cstdlib \ cstdio \ cstring \ ) AC_LANG(C) AC_CHECK_HEADERS( \ SDL/SDL.h \ bstring.h \ dlfcn.h \ dsound.h \ fcntl.h \ inttypes.h \ linux/input.h \ process.h \ sched.h \ stdint.h \ sys/param.h \ sys/socket.h \ netdb.h \ unistd.h \ values.h \ ) # nameser_compat.h used by src/other/ares if test "x$enable_regex_build" != "xyes" ; then AC_CHECK_HEADER(regex.h, AC_DEFINE(HAVE_REGEX_H,1,[Define to 1 if you have the '' header file]) ) fi if test "x$enable_UPnP" = "xyes"; then AC_CHECK_HEADERS( [miniupnpc/miniupnpc.h], [LIBMINIUPNPC=-lminiupnpc], [AC_MSG_WARN([You need to install miniupnpc for UPnP to work])]) fi AC_SUBST(LIBMINIUPNPC) dnl ********************************** dnl *** Check for types/structures *** dnl ********************************** BZ_CONFIGURE_STAGE([types], [5 of 9]) #AM_CHECK_TYPES(socklen_t) #AC_CHECK_TYPES(socklen_t) AC_C_BIGENDIAN AC_C_CONST AC_MSG_CHECKING([for socklen_t type]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[socklen_t len = 42; return 0;]])], [ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no]) AC_MSG_RESULT([$ac_cv_type_socklen_t]) if test $ac_cv_type_socklen_t != yes; then AC_MSG_CHECKING([elsewhere for socklen_t type]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[socklen_t len = 42; return 0;]])], [ac_cv_type_socklen_t=yes],[ac_cv_type_socklen_t=no]) AC_MSG_RESULT([$ac_cv_type_socklen_t]) fi if test $ac_cv_type_socklen_t != yes; then AC_MSG_CHECKING([for socklen_t equivalent]) AC_CACHE_VAL([ac_cv_socklen_t_equiv], [ # Systems have either "struct sockaddr *" or # "void *" as the second argument to getpeername ac_cv_socklen_t_equiv= for arg2 in "struct sockaddr" void; do for t in int size_t unsigned long "unsigned long"; do AC_TRY_COMPILE([ #include #include int getpeername (int, $arg2 *, $t *); ],[ $t len; getpeername(0,0,&len); ],[ ac_cv_socklen_t_equiv="$t" break ]) done done if test "x$ac_cv_socklen_t_equiv" = x; then AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) fi ]) AC_MSG_RESULT($ac_cv_socklen_t_equiv) AC_DEFINE_UNQUOTED(socklen_t, $ac_cv_socklen_t_equiv, [type to use in place of socklen_t if not defined]) else AC_DEFINE(HAVE_SOCKLEN_T, 1, [if socklen_t is defined, make note of it]) fi #CONFIG is only used for irix packaging case $host_os in irix*) CONFIG=irix-mips3; AC_SUBST(CONFIG) ;; esac AC_LANG(C++) AC_CHECK_TYPES([std::wstring],,,[#include ]) ac_cv_search_glBegin=no ac_cv_search_gluScaleImage=no ac_func_search_save_LIBS=$LIBS dnl check whether the OpenGL framework is available AC_MSG_CHECKING([for OpenGL framework (Darwin-specific)]) FRAMEWORK_OPENGL="" PRELIBS="$LIBS" LIBS="$LIBS -framework OpenGL" AC_TRY_LINK([#include ], [glBegin(GL_POINTS)], [FRAMEWORK_OPENGL="-framework OpenGL" ; ac_cv_search_glBegin="-framework OpenGL" ; AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)]) LIBS="$PRELIBS" AC_SUBST(FRAMEWORK_OPENGL) # don't use X11 flags if we have an OpenGL framework if test "x$FRAMEWORK_OPENGL" = "x" ; then AC_PATH_XTRA CONF_CPPFLAGS="$CONF_CPPFLAGS $X_CFLAGS" LDFLAGS="$LDFLAGS $X_LIBS" fi case $host_os in solaris*) if test -d /usr/demo/SOUND/lib ; then GLIBS="-laudio $GLIBS" LDFLAGS="$LDFLAGS -L/usr/demo/SOUND/lib" fi GLIBS="-lresolv $GLIBS" LIBS="$LIBS -lsocket -lnsl -lresolv" LDFLAGS="$LDFLAGS -lresolv" # for hstrerror() ;; irix*) GLIBS="-lXsgivc -lX11 -laudio $GLIBS" ;; beos) GLIBS=" -lmedia -lgame $GLIBS" LIBS="-lbe" ;; macos|darwin*) ;; *) ;; esac # avoid using X11 in BeOS and Mac OS X case $host_os in macos|darwin*) ;; beos*) ;; *) CONF_CPPFLAGS="$CONF_CPPFLAGS $X_CFLAGS" if test x$no_x = x; then GLIBS="$X_PRE_LIBS -lX11 $EXTRA_LIBS $GLIBS" fi AC_CHECK_LIB(Xext, XextAddDisplay, [GLIBS="-lXext $GLIBS"], [], $GLIBS) AC_CHECK_HEADERS(X11/extensions/xf86vmode.h, [AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryExtension, [ AC_DEFINE(XF86VIDMODE_EXT, 1, [XFree86 Video Mode Extension]) GLIBS="-lXxf86vm $GLIBS" ],, )],,[#include ] ) ;; esac for ac_lib in opengl32 GL GL2; do LIBS="-l$ac_lib $GLIBS $ac_func_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[glBegin(GL_POINTS)]])], [ac_cv_search_glBegin="-l$ac_lib" break],[]) done if test "$ac_cv_search_glBegin" != no; then GLIBS="$ac_cv_search_glBegin $GLIBS" if test "$ac_cv_search_glBegin" = -lGL2; then AC_DEFINE(BEOS_USE_GL2, 1, [Use new GL Kit for BeOS]) fi LIBS="-framework OpenGL $ac_func_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[gluScaleImage(GL_RED,0,0,GL_INT,0,0,0,GL_INT,0)]])], [ac_cv_search_gluScaleImage="-framework OpenGL"],[]) for ac_lib in glu32 GL GLU; do LIBS="-l$ac_lib $GLIBS $ac_func_search_save_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[gluScaleImage(GL_RED,0,0,GL_INT,0,0,0,GL_INT,0)]])], [ac_cv_search_gluScaleImage="-l$ac_lib" break],[]) done if test "$ac_cv_search_gluScaleImage" != no; then GLIBS="$ac_cv_search_gluScaleImage $GLIBS" fi fi LIBS=$ac_func_search_save_LIBS AC_SUBST(GLIBS) # try out pthreads if it's enabled, disable it if we don't have it AC_MSG_CHECKING([for working pthreads]) if test "x$enable_threads" != "xno" ; then tmpLIBS=$LIBS LIBS=$LIBPTHREAD AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[pthread_t thread; pthread_create(&thread, NULL, NULL, NULL);]])], [pthread_check="yes"], [pthread_check="no"]) if test $pthread_check = "yes"; then AC_DEFINE(HAVE_PTHREADS, 1, [posix-compliant threading is available]) AC_DEFINE(_REENTRANT, 1, [Enable reentrant code]) LIBS="$tmpLIBS $LIBS" else LIBS=$tmpLIBS fi AC_MSG_RESULT([$pthread_check]) fi case $host_os in mingw32*) AC_CHECK_LIB(ws2_32, closesocket) AC_CHECK_LIB(winmm, timeGetTime) GLIBS="-mwindows -lgdi32 -ldxguid -ldsound -ldinput $GLIBS" dnl MingW does some funny stuff with DirectX. dnl Test for a working DirectInput. AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #define DIRECTINPUT_VERSION 0x0700 #include ]], [[ IDirectInput7* directInput; HINSTANCE hinst = GetModuleHandle(NULL); HRESULT success = DirectInputCreateEx(hinst, DIRECTINPUT_VERSION, IID_IDirectInput7, (void**)&directInput, NULL); ]])],[],[AC_DEFINE(BROKEN_DINPUT, 1, [Define to 1 if your DirectInput headers and libraries are broken or mismatched.])]) ;; esac # Remove ogg/vorbis dependencies until we actually need them. # # AC_CHECK_LIB(ogg, ogg_stream_init, [ALIBS="-logg $ALIBS"], [], $ALIBS) # AC_CHECK_LIB(vorbis, vorbis_info_init, [ALIBS="-lvorbis $ALIBS"], [], $ALIBS) # AC_CHECK_LIB(vorbisfile, ov_open, [ALIBS="-lvorbisfile $ALIBS"], [], $ALIBS) # AC_SUBST(ALIBS) if test $prefix = NONE; then prefix=$ac_default_prefix fi BZFLAG_DATA=`eval eval echo $datadir/bzflag` AC_SUBST(BZFLAG_DATA) AC_DEFINE_UNQUOTED(BZFLAG_DATA, "$BZFLAG_DATA", [Data file directory]) savedLIBS=$LIBS LIBS="$GLIBS $LIBS" AC_LANG(C) if test "x$enable_client" != xno -a "x$with_SDL" = xyes; then AC_MSG_CHECKING([for SDL framework]) savedLDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -framework SDL" framework_SDL_flag_works=yes AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[]])], [],[framework_SDL_flag_works=no ]) AC_MSG_RESULT([$framework_SDL_flag_works]) if test x$framework_SDL_flag_works = xno ; then LDFLAGS="$savedLDFLAGS" with_SDL=no fi if test x$with_SDL = xno ; then AM_PATH_SDL(1.2.10, with_SDL=yes, with_SDL=no) if test x$with_SDL = xno; then AC_MSG_WARN([could not find an appropriate SDL version. BZflag will build without SDL]) fi fi fi AC_LANG(C++) LIBS=$savedLIBS if test x$with_SDL = xyes; then AC_DEFINE(HAVE_SDL, 1, [Using SDL]) fi AM_CONDITIONAL(HAVE_SDL, test x$with_SDL = xyes) # dumb temp hacks to add missing linkage stuff case $host_os in macos|darwin*) if test x$with_SDL = xyes; then LIBS="$LIBS -framework Carbon -framework Cocoa -framework OpenGL" else LIBS="$LIBS -framework Carbon -framework AGL -framework OpenGL" fi ;; irix) if test x$host_cpu = xmips64; then LDFLAGS="$LDFLAGS -L$(ROOT)/usr/lib32" else LDFLAGS="$LDFLAGS -L$(ROOT)/usr/lib" fi ;; esac dnl ****************************************** dnl *** Check for compiler characteristics *** dnl ****************************************** BZ_CONFIGURE_STAGE([compiler], [6 of 9]) dnl On SGI systems, figure out if we are using MIPSPro compiler using_mipspro=no if test "$build_vendor" = "sgi" ; then AC_MSG_CHECKING([whether we are using the MIPSPro compiler]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[#if defined(sgi) && !defined(__GNUC__) && defined(_COMPILER_VERSION) this line should cause a compile failure when building with the MIPSpro compiler; #endif int main() { return 0; } ]])],[using_mipspro=no],[using_mipspro=yes]) AC_MSG_RESULT([$using_mipspro]) fi AM_CONDITIONAL(BUGGY_MIPSPRO, test "x$using_mipspro" = "xyes") # FIXME: these checks below are not compiler characteristics other # than the FLAGS they set. case $host_os in linux*) AC_DEFINE(HALF_RATE_AUDIO, 1, [Half rate Audio]) #FLAGS="$FLAGS -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings -Wconversion -Wredundant-decls" # time to use -Wextra instead of -W ? (gcc 3.4+) FLAGS="-Wall -W -Wundef -Wshadow" CONF_CFLAGS="$CONF_CFLAGS $FLAGS" CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS -ansi -pedantic" case $host_vendor in pc) if expr `$CC -dumpversion` \>= "3.4" > /dev/null ; then FLAGS=-mtune else FLAGS=-march fi # silly hack, should be a proper configure compiler option test if test x$host_cpu = xx86_64; then FLAGS="$FLAGS=k8" else FLAGS="$FLAGS=$host_cpu" fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; ppc) FLAGS="-mcpu=$host_cpu" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS";; esac;; cygwin) AC_DEFINE(HALF_RATE_AUDIO, 1, [Half rate Audio]) FLAGS="-Wall -W -mcpu=$host_cpu" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; mingw32*) AC_DEFINE(HALF_RATE_AUDIO, 1, [Half rate Audio]) FLAGS="-Wall -W" if expr `$CC -dumpversion` \>= "3.4" > /dev/null ; then FLAGS="$FLAGS -mtune=$host_cpu" else FLAGS="$FLAGS -march=$host_cpu" fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS -fsigned-char";; solaris*) AC_DEFINE(ETC_INET, [], [hosts is in /etc/inet/]) AC_DEFINE(SUN_OGL_NO_VERTEX_MACROS, [], [Sun OpenGL No Macro Vertex]);; macos|darwin*) FLAGS="-pipe -Wno-long-long -W -Wall -Wundef -Wno-import" CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS -pedantic";; irix) FLAGS="-Wall"; if test x$host_cpu = xmips64; then FLAGS="FLAGS -march=mips3"; else FLAGS="FLAGS -march=mips2"; fi CONF_CFLAGS="$CONF_CFLAGS $FLAGS"; CONF_CXXFLAGS="$CONF_CXXFLAGS $FLAGS";; beos*) AC_DEFINE(HAVE_DEFINED_TOLOWER, 1, [tolower and toupper are not functions]) ;; esac if test x$enable_profiling = xyes ; then if test "$GCC" = yes ; then CONF_CFLAGS="$CONF_CFLAGS -pg" CONF_CXXFLAGS="$CONF_CXXFLAGS -pg" else AC_MSG_WARN([profiling is disabled with non-GNU compiler]) fi fi if test x$enable_debug = xyes ; then CONF_CFLAGS="$CONF_CFLAGS -Werror -g -O0" CONF_CXXFLAGS="$CONF_CXXFLAGS -Werror -g -O0" # revert automatic setting of CFLAGS and CXXFLAGS to prevent # override of "-g -O0" put into CONF_CFLAGS and CONF_CXXFLAGS above CFLAGS="$user_CFLAGS" CXXFLAGS="$user_CXXFLAGS" AC_DEFINE(DEBUG, 1, [Debugging enabled]) else if test "$GCC" = yes ; then OPTIMIZE="-fexpensive-optimizations" CONF_CFLAGS="$CONF_CFLAGS $OPTIMIZE" CONF_CXXFLAGS="$CONF_CXXFLAGS $OPTIMIZE" fi AC_DEFINE(NDEBUG, 1, [Debugging disabled]) fi dnl check for -search_paths_first linker flag when making dynamic libraries search_paths_first_flag="-Wl,-search_paths_first -mdynamic-no-pic" AC_MSG_CHECKING([if the compiler understands $search_paths_first_flag]) search_paths_first_flag_works=yes PRELDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $search_paths_first_flag" AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[], [search_paths_first_flag_works=no]) AC_MSG_RESULT($search_paths_first_flag_works) if test "x$search_paths_first_flag_works" = "xno" ; then LDFLAGS="$PRELDFLAGS" fi dnl *************************** dnl *** Check for functions *** dnl *************************** BZ_CONFIGURE_STAGE([functions], [7 of 9]) AC_CHECK_FUNCS(\ CGLGetCurrentContext \ Sleep \ WaitForSingleObject \ _stricmp \ _strnicmp \ _vsnprintf \ atexit \ hstrerror \ sched_setaffinity \ select \ snooze \ usleep \ vsnprintf \ wglGetCurrentContext \ ) dnl test for isnan() presence BZ_FUNC_ISNAN AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ int i = std::min(0, 1); i = i; ]])],[AC_DEFINE(HAVE_STD__MIN, 1, [Define to 1 if you have a conforming std::min])],[]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ int i = std::max(0, 1); i = i; ]])],[AC_DEFINE(HAVE_STD__MAX, 1, [Define to 1 if you have a conforming std::max])],[]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ char array[] = "test"; int i = std::count(array, array + 5, 't'); i = i; ]])],[AC_DEFINE(HAVE_STD__COUNT, 1, [Define to 1 if you have a conforming std::count, otherwise old version of count template is assumed])],[]) dnl ********************************* dnl *** Check for system services *** dnl ********************************* BZ_CONFIGURE_STAGE([services], [8 of 9]) # FIXME: system service checks seem to be spread out everywhere above, # need to consolidate them to here. case $host_os in beos*) beos=true ;; hpux*) hpux=true ;; irix*) irix=true ;; linux*|kfreebsd*|freebsd*|netbsd*|openbsd*|dragonfly*) linux=true ;; macos|darwin*) macos=true ;; solaris*) solaris=true ;; cygwin|mingw32*|windows**) win32=true ;; esac AM_CONDITIONAL(HPUX, test x$hpux = xtrue) AM_CONDITIONAL(BEOS, test x$beos = xtrue) AM_CONDITIONAL(IRIX, test x$irix = xtrue) AM_CONDITIONAL(LINUX, test x$linux = xtrue) AM_CONDITIONAL(MACOS, test x$macos = xtrue) AM_CONDITIONAL(SOLARIS, test x$solaris = xtrue) AM_CONDITIONAL(WIN32, test x$win32 = xtrue) # wtf are these for? AM_CONDITIONAL(PC, test x$host_vendor = xpc) AM_CONDITIONAL(PPC, test x$host_vendor = xppc) # Check for working FF_RUMBLE support in linux/input.h AC_MSG_CHECKING([for linux rumble joystick support]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct ff_effect x; x.u.rumble.weak_magnitude = 42; return 0;]])], [ac_ff_effect_rumble=yes],[ac_ff_effect_rumble=no]) if test x$ac_ff_effect_rumble = xyes; then AC_DEFINE(HAVE_FF_EFFECT_RUMBLE, 1, [we appear to have working support for rumble force feedback effects]) fi AC_MSG_RESULT([$ac_ff_effect_rumble]) # Check for working directional FF support in linux/input.h AC_MSG_CHECKING([for linux force feedback joystick support]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct ff_effect x; x.direction = 0x4000; return 0;]])], [ac_ff_effect_directional=yes],[ac_ff_effect_directional=no]) if test x$ac_ff_effect_directional = xyes; then AC_DEFINE(HAVE_FF_EFFECT_DIRECTIONAL, 1, [we appear to have working support for directional force feedback effects]) fi AC_MSG_RESULT([$ac_ff_effect_directional]) # if the client was enabled, make sure we have GL if test x$enable_client != xno; then have_gl=no if test "$ac_cv_search_gluScaleImage" = no; then AC_MSG_WARN( [Client build is enabled, but OpenGL does not seem to be fully available ... disabling BZFlag client]) AM_CONDITIONAL(CLIENT_INCLUDED, false) enable_client=no else AM_CONDITIONAL(CLIENT_INCLUDED, true) have_gl=yes fi else AM_CONDITIONAL(CLIENT_INCLUDED, false) fi # stub it for now, enable the server AM_CONDITIONAL(SERVER_INCLUDED, true) # if bzadmin was enabled, make sure we have curses. if test x$enable_bzadmin != xno; then if test "x$CURSES_LIB" = x; then AC_MSG_WARN([could not find a curses library, will build bzadmin without curses]) fi AM_CONDITIONAL(BZADMIN_INCLUDED, true) else AM_CONDITIONAL(BZADMIN_INCLUDED, false) fi AM_CONDITIONAL(HAVE_CURSES, test "x$CURSES_LIB" != x) AC_SUBST(CURSES_LIB) # see if our ares callbacks match (they won't on ares <1.5) ares_works=no if test "x$enable_ares_build" != "xyes" ; then AC_MSG_CHECKING(for ares DNS lookup functionality) PRELIBS="$LIBS" LIBS="$LIBS $LIBCARES" AC_TRY_LINK([ #include #include void callback(void * /*arg*/, int /*callbackStatus*/, int /*timeouts*/, struct hostent * /*hostent*/) {} ], [ ares_channel aresChannel; in_addr requestedAddress; ares_gethostbyaddr(aresChannel, &requestedAddress, sizeof(in_addr), AF_INET, callback, NULL); ], [ares_works=yes], [ares_works=no]) LIBS="$PRELIBS" AC_MSG_RESULT($ares_works) fi # enable_ares_build dnl figure out whether we need to build the included ares library AC_MSG_CHECKING(whether to build the included ares lookup library) BUILD_ARES="no (using system)" if test "x$ares_works" = "xno" ; then AC_DEFINE(BUILD_ARES, 1, [Build the included ares lookup library]) BUILD_ARES="yes" LIBCARES='${top_builddir}/src/other/ares/libcares.la' fi AC_SUBST(LIBCARES) AC_MSG_RESULT($BUILD_ARES) AM_CONDITIONAL(BUILD_ARES, test "x$BUILD_ARES" = "xyes") if test "x$BUILD_ARES" = xyes ; then AC_DEFINE([HAVE_ARES_LIBRARY_INIT],[1],[Define if libcares includes ares_library_init.]) else AC_CHECK_LIB(cares, ares_library_init, AC_DEFINE([HAVE_ARES_LIBRARY_INIT])) fi # see if we have regex functionality regex_works=no if test "x$enable_regex_build" != "xyes" ; then AC_MSG_CHECKING(for regular expression functionality) PRELDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $LIBREGEX" AC_RUN_IFELSE([ AC_LANG_PROGRAM([ #ifdef HAVE_SYS_TYPES_H # include #endif #include ],[ regex_t re; regcomp(&re, "abc", REG_EXTENDED); regexec(&re, "", 0, 0, 0); return 0; ]) ], [regex_works=yes], [regex_works=no], [regex_works=no] ) LDFLAGS="$PRELDFLAGS" AC_MSG_RESULT($regex_works) fi # enable_regex_build dnl dnl figure out whether we need to build the included regex library dnl AC_MSG_CHECKING(whether to build the included regular expression library) BUILD_REGEX="no (using system)" if test "x$regex_works" = "xno" ; then AC_DEFINE(BUILD_REGEX, 1, [Build the included regular expression library]) BUILD_REGEX="yes" LIBREGEX='${top_builddir}/src/other/regex/libregex.la' fi AC_SUBST(LIBREGEX) AC_MSG_RESULT($BUILD_REGEX) AM_CONDITIONAL(BUILD_REGEX, test "x$BUILD_REGEX" = "xyes") # assume zlib works if we found it. dnl figure out whether we need to build the included zlib AC_MSG_CHECKING(whether to build the included zlib compression library) BUILD_ZLIB="no (using system)" if test "x$LIBZ" = "x" ; then AC_DEFINE(BUILD_ZLIB, 1, [Build the included zlib compression library]) BUILD_ZLIB="yes" LIBZ='${top_builddir}/src/other/zlib/libz.la' fi AC_SUBST(LIBZ) AC_MSG_RESULT($BUILD_ZLIB) AM_CONDITIONAL(BUILD_ZLIB, test "x$BUILD_ZLIB" = "xyes") if test "x$BUILD_ZLIB" = "xyes" ; then CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/zlib" fi dnl figure out whether we need to build the included curl library BUILD_CURL="no (using system)" LIBCURL="" if test "x$enable_curl_build" != "xyes" ; then LIBCURL_CHECK_CONFIG fi AC_MSG_CHECKING(whether to build the included curl library) if test "x$LIBCURL" = "x" ; then AC_DEFINE(BUILD_CURL, 1, [Build the included curl library]) BUILD_CURL="yes" LIBCURL='${top_builddir}/src/other/curl/lib/libcurl.la' fi dnl LIBCURL_CHECK_CONFIG already specified AC_SUBSTs AC_MSG_RESULT($BUILD_CURL) AM_CONDITIONAL(BUILD_CURL, test "x$BUILD_CURL" = "xyes") if test "x$BUILD_CURL" = "xyes" ; then CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/curl/include" fi # GLEW if test "x$enable_client" != "xno" ; then # Check for the GLEW library (GL Extension Wrangler) if test "x$enable_glew_build" != "xyes" ; then AC_MSG_CHECKING([for GLEW library]) tmpLIBS=$LIBS GLEW_LIBS="-lGLEW" LIBS=$GLEW_LIBS AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[if (GLEW_VERSION_3_0) { glewInit(); }]])], [glew_check="yes"], [glew_check="no (missing, or older than version 1.5.1)"]) if test "x$glew_check" != "xyes"; then GLEW_LIBS="" fi AC_MSG_RESULT([$glew_check]) AC_SUBST(GLEW_LIBS) LIBS=$tmpLIBS fi AC_MSG_CHECKING(whether to build the included GLEW library) BUILD_GLEW="no (using system)" if test "x$GLEW_LIBS" = "x" ; then if test "x$enable_glew_build" = xno ; then BUILD_GLEW=no else BUILD_GLEW="yes" CONF_CPPFLAGS="$CONF_CPPFLAGS -I\$(top_srcdir)/src/other/glew/include" fi fi AC_MSG_RESULT($BUILD_GLEW) else # enable_client BUILD_GLEW="no (clients disabled)" AC_MSG_NOTICE([GLEW is disabled because no clients are being built]) fi # enable_client AM_CONDITIONAL(BUILD_GLEW, test "x$BUILD_GLEW" = "xyes") if test "x$BUILD_GLEW" = xyes -o "x$glew_check" = xyes; then AC_DEFINE(HAVE_GLEW, 1, [Using GLEW]) fi # make sure ECHO and ECHO_N got defined and substituted if test "x$ECHO" = "x" ; then ECHO=echo AC_MSG_NOTICE([ECHO was not defined by configure so defining manually]) fi AC_SUBST(ECHO) AC_SUBST(ECHO_N) dnl ************************************** dnl *** Configure Makefiles and output *** dnl ************************************** BZ_CONFIGURE_STAGE([output], [9 of 9]) AC_SUBST(CONF_CPPFLAGS) AC_SUBST(CONF_CFLAGS) AC_SUBST(CONF_CXXFLAGS) LIBDIR="\$(top_srcdir)/lib" AC_SUBST(LIBDIR) # stash the current configuration args before adding additional ones # for subconfigure bz_configure_args="$ac_configure_args" AC_CONFIG_SUBDIRS(src/other/ares) if test "x$BUILD_ARES$BUILD_CURL" = "xyesyes" ; then # instruct curl to use the included ares ac_configure_args="$ac_configure_args --enable-ares --disable-manual" case $host_os in solaris*) if test "$GCC" != yes; then # Solaris 10 SSL libraries are compatible only with gcc ac_configure_args="$ac_configure_args --without-ssl" fi ;; esac fi AC_CONFIG_SUBDIRS(src/other/curl) AC_CONFIG_FILES([ BZFlag.xcodeproj/Makefile MSVC/Makefile MSVC/build/Makefile Makefile bzflag.lsm bzflag.spec data/Makefile data/fonts/Makefile data/l10n/Makefile include/Makefile m4/Makefile man/Makefile misc/Makefile package/Makefile package/irix/Makefile package/linux/Makefile package/rpm/Makefile package/win32/Makefile package/win32/nsis/Makefile plugins/HoldTheFlag/Makefile plugins/Makefile plugins/Phoenix/Makefile plugins/RogueGenocide/Makefile plugins/SAMPLE_PLUGIN/Makefile plugins/TimeLimit/Makefile plugins/airspawn/Makefile plugins/autoFlagReset/Makefile plugins/chathistory/Makefile plugins/customflagsample/Makefile plugins/fairCTF/Makefile plugins/fastmap/Makefile plugins/flagStay/Makefile plugins/hiddenAdmin/Makefile plugins/keepaway/Makefile plugins/killall/Makefile plugins/koth/Makefile plugins/logDetail/Makefile plugins/nagware/Makefile plugins/playHistoryTracker/Makefile plugins/plugin_utils/Makefile plugins/rabbitTimer/Makefile plugins/rabidRabbit/Makefile plugins/recordmatch/Makefile plugins/regFlag/Makefile plugins/serverControl/Makefile plugins/shockwaveDeath/Makefile plugins/teamflagreset/Makefile plugins/thiefControl/Makefile plugins/timedctf/Makefile plugins/wwzones/Makefile src/3D/Makefile src/Makefile src/bzadmin/Makefile src/bzflag/Makefile src/bzfs/Makefile src/common/Makefile src/date/Makefile src/game/Makefile src/geometry/Makefile src/geometry/models/Makefile src/geometry/models/tank/Makefile src/mediafile/Makefile src/net/Makefile src/obstacle/Makefile src/ogl/Makefile src/platform/MacOSX/BZFlag-Info.plist src/other/Makefile src/other/regex/Makefile src/other/zlib/Makefile src/platform/MacOSX/Makefile src/platform/Makefile src/scene/Makefile tools/Makefile tools/TextTool-W32/Makefile tools/TextTool-W32/res/Makefile tools/bzwtransform/Makefile tools/modeltool/Makefile tools/modeltool/MSVC/Makefile ]) AC_OUTPUT # restore back after AC_OUTPUT for recheck ac_configure_args="$bz_configure_args" dnl # AC_OUTPUT won't update the config.h.in template timestamp if the dnl # file is unchanged. forcibly update the timestamp so autoheader dnl # doesn't try to invoke. dnl if test ! "x`cat include/config.h.in`" = "x" ; then dnl touch include/config.h.in dnl fi ################# # patch libtool # ################# case $host_os in darwin*) for script in $ac_top_builddir $ac_abs_builddir $ac_builddir . ; do if test "x$script" = "x" ; then libtoolscript="libtool" else libtoolscript="${script}/libtool" fi if test -f ${libtoolscript} ; then if test -w ${libtoolscript} ; then # remove any -all_load option. # provokes libtool linker bug with noinst C++ libraries. sed 's/-all_load.*convenience//g' < $libtoolscript > ${libtoolscript}.sed if test ! "x`cat ${libtoolscript}`" = "x`cat ${libtoolscript}.sed`" ; then AC_MSG_RESULT([Found -all_load in libtool script, removing]) cp ${libtoolscript}.sed ${libtoolscript} fi rm -f ${libtoolscript}.sed else AC_MSG_WARN([libtool script exists but is not writable so not attempting to edit]) fi fi done ;; esac dnl ********************** dnl *** Report Summary *** dnl ********************** if test "x$enable_client" = "xno"; then if test "x$have_gl" = "xno" ; then build_bzflag="no bzflag client binary! (need OpenGL)" else build_bzflag="no bzflag client binary!" fi else if test x$with_SDL != xno; then build_bzflag="yes (with SDL)" else build_bzflag="yes" fi fi if test "x$enable_plugins" != xno ; then build_bzfs="yes (with plugins)" else build_bzfs="yes (without plugins)" fi if test "x$enable_bzadmin" = "xno"; then if test "x$CURSES_LIB" = x; then build_bzadmin="no bzadmin binary! (need Curses)" else build_bzadmin="no bzadmin binary!" fi else build_bzadmin="yes" fi dnl dnl Expand the variables for summary reporting dnl prefix=`eval "echo $prefix"` prefix=`eval "echo $prefix"` bindir=`eval "echo $bindir"` bindir=`eval "echo $bindir"` libdir=`eval "echo $libdir"` libdir=`eval "echo $libdir"` mandir=`eval "echo $mandir"` mandir=`eval "echo $mandir"` dnl dnl Compute configuration time elapsed dnl if test -x "${srcdir}/misc/elapsed.sh" ; then time_elapsed="`${srcdir}/misc/elapsed.sh $CONF_TIME`" else time_elapsed="unknown" fi dnl use AC_MSG_RESULT instead of AC_MSG_NOTIFY to support old autoconf AC_MSG_RESULT([Done.]) AC_MSG_RESULT([]) BZ_BOLD AC_MSG_RESULT([BZFlag-$BZFLAG_VERSION.$CONF_DATE configured with the following:]) BZ_UNBOLD AC_MSG_RESULT([]) AC_MSG_RESULT([ Prefix: ${prefix}]) AC_MSG_RESULT([ Binaries: ${bindir}]) AC_MSG_RESULT([ Plugins: ${libdir}]) AC_MSG_RESULT([ Manual pages: ${mandir}]) AC_MSG_RESULT([]) AC_MSG_RESULT([CC = ${CC}]) AC_MSG_RESULT([CXX = ${CXX}]) AC_MSG_RESULT([CFLAGS = ${CFLAGS}]) AC_MSG_RESULT([CONF_CFLAGS = ${CONF_CFLAGS}]) AC_MSG_RESULT([CXXFLAGS = ${CXXFLAGS}]) AC_MSG_RESULT([CONF_CXXFLAGS = ${CONF_CXXFLAGS}]) AC_MSG_RESULT([CPPFLAGS = ${CPPFLAGS}]) AC_MSG_RESULT([CONF_CPPFLAGS = ${CONF_CPPFLAGS}]) AC_MSG_RESULT([LDFLAGS = ${LDFLAGS}]) AC_MSG_RESULT([LIBS = ${LIBS}]) AC_MSG_RESULT([]) AC_MSG_RESULT([Build ares ........: $BUILD_ARES]) AC_MSG_RESULT([Build curl ........: $BUILD_CURL]) AC_MSG_RESULT([Build glew ........: $BUILD_GLEW]) AC_MSG_RESULT([Build regex .......: $BUILD_REGEX]) AC_MSG_RESULT([Build zlib ........: $BUILD_ZLIB]) AC_MSG_RESULT([]) AC_MSG_RESULT([BZFlag client .....: $build_bzflag]) AC_MSG_RESULT([BZFlag server .....: $build_bzfs]) AC_MSG_RESULT([BZAdmin client ....: $build_bzadmin]) AC_MSG_RESULT([]) if test "x$time_elapsed" != "xunknown" ; then AC_MSG_RESULT([Elapsed configuration time: $time_elapsed]) fi AC_MSG_RESULT([---]) AC_MSG_RESULT([$0 complete, type 'make' to begin building]) AC_MSG_RESULT([]) # Local Variables: # tab-width: 8 # mode: autoconf # sh-indentation: 4 # sh-basic-offset: 4 # indent-tabs-mode: t # End: # ex: shiftwidth=4 tabstop=8 bzflag-2.4.2+ds1/data/000077500000000000000000000000001200563112200143505ustar00rootroot00000000000000bzflag-2.4.2+ds1/data/Makefile.am000066400000000000000000000042111200563112200164020ustar00rootroot00000000000000SUBDIRS = l10n fonts dist_pkgdata_DATA = \ automatic_icon.png \ blue_basetop.png \ blue_basewall.png \ blue_bolt.png \ blue_icon.png \ blue_laser.png \ blue_super_bolt.png \ blue_tank.png \ blend_flash.png \ boom.wav \ bounce.wav \ boxwall.png \ bubble.png \ burrow.wav \ bzflag.desktop \ bzflag-256x256.png \ bzflag-32x32.xpm \ bzflag-48x48.png \ caution.png \ clouds.png \ dusty_flare.png \ explode1.png \ explode2.png \ explosion.wav \ fire.wav \ flag.png \ flag_alert.wav \ flag_drop.wav \ flag_grab.wav \ flag_lost.wav \ flag_won.wav \ flap.wav \ frog.png \ green_basetop.png \ green_basewall.png \ green_bolt.png \ green_icon.png \ green_laser.png \ green_super_bolt.png \ green_tank.png \ hunt.wav \ hunt_select.wav \ hunter_bolt.png \ hunter_laser.png \ hunter_super_bolt.png \ hunter_tank.png \ jump.wav \ jumpjets.png \ killteam.wav \ land.wav \ laser.wav \ lock.wav \ menu_arrow.png \ mesh.png \ message_admin.wav \ message_private.wav \ message_team.wav \ missile.png \ missile.wav \ moon.png \ mountain1.png \ mountain2.png \ mountain3.png \ mountain4.png \ mountain5.png \ observer_icon.png \ phantom.wav \ pop.wav \ puddle.png \ puffs.png \ purple_basetop.png \ purple_basewall.png \ purple_bolt.png \ purple_icon.png \ purple_laser.png \ purple_super_bolt.png \ purple_tank.png \ pyrwall.png \ rabbit_bolt.png \ rabbit_laser.png \ rabbit_super_bolt.png \ rabbit_tank.png \ radar.png \ raindrop.png \ red_basetop.png \ red_basewall.png \ red_bolt.png \ red_icon.png \ red_laser.png \ red_super_bolt.png \ red_tank.png \ ricochet.wav \ roof.png \ rogue_bolt.png \ rogue_icon.png \ rogue_laser.png \ rogue_super_bolt.png \ rogue_tank.png \ shock.wav \ shot_tail.png \ snowflake.png \ spree1.wav \ spree2.wav \ spree3.wav \ spree4.wav \ std_ground.png \ steamroller.wav \ teamgrab.wav \ telelink.png \ teleport.wav \ tetrawall.png \ thief.png \ thief.wav \ title.png \ treads.png \ wall.png \ water.png \ zone_ground.png MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/data/Makefile.in000066400000000000000000000537401200563112200164260ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data DIST_COMMON = $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(pkgdatadir)" DATA = $(dist_pkgdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = l10n fonts dist_pkgdata_DATA = \ automatic_icon.png \ blue_basetop.png \ blue_basewall.png \ blue_bolt.png \ blue_icon.png \ blue_laser.png \ blue_super_bolt.png \ blue_tank.png \ blend_flash.png \ boom.wav \ bounce.wav \ boxwall.png \ bubble.png \ burrow.wav \ bzflag.desktop \ bzflag-256x256.png \ bzflag-32x32.xpm \ bzflag-48x48.png \ caution.png \ clouds.png \ dusty_flare.png \ explode1.png \ explode2.png \ explosion.wav \ fire.wav \ flag.png \ flag_alert.wav \ flag_drop.wav \ flag_grab.wav \ flag_lost.wav \ flag_won.wav \ flap.wav \ frog.png \ green_basetop.png \ green_basewall.png \ green_bolt.png \ green_icon.png \ green_laser.png \ green_super_bolt.png \ green_tank.png \ hunt.wav \ hunt_select.wav \ hunter_bolt.png \ hunter_laser.png \ hunter_super_bolt.png \ hunter_tank.png \ jump.wav \ jumpjets.png \ killteam.wav \ land.wav \ laser.wav \ lock.wav \ menu_arrow.png \ mesh.png \ message_admin.wav \ message_private.wav \ message_team.wav \ missile.png \ missile.wav \ moon.png \ mountain1.png \ mountain2.png \ mountain3.png \ mountain4.png \ mountain5.png \ observer_icon.png \ phantom.wav \ pop.wav \ puddle.png \ puffs.png \ purple_basetop.png \ purple_basewall.png \ purple_bolt.png \ purple_icon.png \ purple_laser.png \ purple_super_bolt.png \ purple_tank.png \ pyrwall.png \ rabbit_bolt.png \ rabbit_laser.png \ rabbit_super_bolt.png \ rabbit_tank.png \ radar.png \ raindrop.png \ red_basetop.png \ red_basewall.png \ red_bolt.png \ red_icon.png \ red_laser.png \ red_super_bolt.png \ red_tank.png \ ricochet.wav \ roof.png \ rogue_bolt.png \ rogue_icon.png \ rogue_laser.png \ rogue_super_bolt.png \ rogue_tank.png \ shock.wav \ shot_tail.png \ snowflake.png \ spree1.wav \ spree2.wav \ spree3.wav \ spree4.wav \ std_ground.png \ steamroller.wav \ teamgrab.wav \ telelink.png \ teleport.wav \ tetrawall.png \ thief.png \ thief.wav \ title.png \ treads.png \ wall.png \ water.png \ zone_ground.png MAINTAINERCLEANFILES = \ Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_pkgdataDATA: $(dist_pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-dist_pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_pkgdataDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_pkgdataDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_pkgdataDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-dist_pkgdataDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/data/automatic_icon.png000066400000000000000000000105031200563112200200530ustar00rootroot00000000000000PNG  IHDR@@iq IDATx[ytUխ@ a I \">Pxt'sA{< "zDQpX&(*TH<$KUG 8G9߷{+NKMM 3 诹LӦMcp2z pO>H[CC a6wM2JqȇRRRy/!з~$I矧lޙ|1!n߾JJXbJ8qb,ꂿvٳgQ}pU*!33W IIICZjwy<$hAvA R(>J:u*o0 !$MY3gQs='+Ly-{zz(j6CoTj&<ŋHz) ]8 r*(HPJ. tZ@ (1p:P[[ Q!B@dD >]:U*B!(( &-[&`E/ *-w*WN=ګiml4x)֭[[1@ x0gۿQQy"Ra $1!!hjh@~~>q]s'tRl޼ fsŀsqOā E.0qDTX+/Pe2QFnB `\q1v-57ヒׯGLL,qǝ#RS}g`M(3Ǐ_|Ou fggW^`]} ~.ha㊋a EEu5(ػw/,X.Li:(Oq󅛃Wl.&3/eYddd --ͯZv-6m4Ȁ޽ =v,uw#4y.wuZlinF0AĹsX؈QF޹sQ__"%9agq~y\vTwkF+ `ËpVNsÁ/"&&Fjtqq1*++]`HIIqVfČ30ydJO9Z}}=/] ˅D "$J,nj#!== wnL&/E駟c% p,vBpK8֬Z\%-ް,SJ9EUA-(ԗ 19`0Ptvv,i֢r]YpYʼn'^WA#$I8uꔟ\Bm4}>a6VG|_lO%7|f„`w: &uӋ xiJ(fϞ TPFiiJn`Akk;8lkZt= (/PU+r0 xa qx?{($ogΜ -7 R)z/8.H0Зݗq͉kpy&bM7n> ^U<~xUUyݠ@7Ji*@Mm*OKx?-CFYΟy? w"1q,z8Ap^75s5 r_YEqq1((fl2o{03_ǬYFme<|MR;4;GqnA[[[PŐVLSfԌТ2ԝ1" \v#$ܗq]ֿG֬*9.Ca׮wa61**r_{60 -[ Yg٬P4En/aL>K.qU `0`0x|رc>L %%f>Ͱ>қBsj5 X`c@)ő#H K+g%bbb4㆚EZS͛7c޽ض:u7""u+::ۻwԀAP+#( p%a''GH"8 ~|1҂_sw2>>>F1 IENDB`bzflag-2.4.2+ds1/data/blend_flash.png000066400000000000000000000024621200563112200173230ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?( F`dM#h F4F80@&h4p@ `M# 3J̣0r@V#h Fh FKh4p@ `M#  h FKh FKh4p@UJ0r@V#h F4F8F4  FKh 0@#h`-F864Zp@mh F#h F4F8F4  Fh4p@U4Zp@%4Zp@:0rЃ j3B=4:4@KbG d",E|bJ!\_pG9W16|f(p惑 h4 O@% @ }4F.qht$p5lba ~4o C@w4F. P3/cJ?GJFa%DLPENI DUmx @ $>oVZ\3fl"OB3ĉOلJ ZmFJGaZ0!c`  FH(h FKh4p@U4  Fh4p@ `M#h#pp@%4 FKh 0@#h`-F864Zp@mh4p@ `M#h#pp@U4F8*`-F8`-F8`M#h FJFa-F8`M#h0@6@14F80@&h4p@ `M#܌+G7IENDB`bzflag-2.4.2+ds1/data/blue_basetop.png000066400000000000000000013600701200563112200175310ustar00rootroot00000000000000PNG  IHDR{C pHYs  ZgAMA|Q cHRMz%u0`:o_F߮IDATxTy.kv>ܱiR)KV$,AmR&A g0`)Jl-d{CU=Z+^۷ZZi@UzaRuһ bIDS<99'DbR֔rJADE:SZ)00DqSp`fRJAU~Q"RU]a0}R)rJkm)Z벮"=[7D11t~g____/g41Z !ޙCYUZkD} OzB콵z"1DNO~___ki4Z)U՘OTDBjr{JT_=04M?~1__ݮ__|j-p9iady^ }ŗ"fSok{JKY ps-|_~?i===#̬҅ht_\.q>ZS9N޻TvO(f033Ř>y맧g3}}}/FDZk!лyiB{{]bx^1ff1Bk {o*H5U/^߽†Z!qz91< |>1VJQDD"T5efD$ )%U !",BHj2sL)͌C D1LdfLcV"${)?aHuXE!8"xaR35뽉hk {o1 MAUU R!V[) Zo:ϋ'0麮80JID>|d:L_+@# 4joUND4""1{w0Cq,0a(ܮ?q eUUQD\K!N*v>C1x8Cu]iԬ:p:K)Nx:BO>z"ReBRjUD8Z1N'oPj-f{_U3sJaDZ97!0sPq⍋RL@/̱{/eU[)eYޅJ)DhD1[9ֵZV|>fy,jcD49)"3!"IWU3#bNBY"BDdG$$$%zO1sN10cyos~y}KNy&fjMT!:`00e]a`&5DDEkm9{o  fyȄejDD5ي"AYKo`YfjmDx8Ly'b:&3bkt>eaRHL,լw!iBUޟOĬ*zZoyr /9gq4%`~"3A!ƐRQCb]zoT[륮HSRxC|kjJ) ^ւTE[oC9.8{DZ.]Hkr8b~8p8Բ~ͷt<\.>)-njHs]q轷&㉈}6QDK1!H6 3ITQ$f 4ffFr ULqgpオV[0Mt^.˲ޑ>{!{t">ZȻD壙 HD]eYDjkLm&S`p8o[L/\.9$SmƘL M! q-kW_!œ2j7{Œ>)2qJIU{4k)":Xbv}HUU/ՙ90ib DӜW[kD_)G1#OfL">ZUU< #313f .`bffVJEDL)yi,1F˅ۈ1hk5k> WXB@4Q;!R rxK R"#3-RK9Iz/tƱXLz0Unכ)gc(M㴬%ckBxrn`cQĿ4"":a:8(df6Qw6`"1iY&1UEUCXNFDӉj)'`1,)t*Df]zB>?C`bF!pL"Le]03n;)( Z~Im !": L~^'[k~ͼD721SZkc )Ej,cJaqU#"10v34}BH)fzSJx8z|!DDeCHfR&uDRS_8vsεb "oivRbHs8"r]R"ѻ^!`y E:Qmۍl7wꝈbL뺶V9H{C)/LDפRLS$ZZ8N4+wàjE{oÐT1< Zk1qj!Z!G$4@ iDtFͷu!rqP1 o{ٱ=+.~ͣ:jZeÔEk~EԬR}D4!C9IyUZ'UEdf 1,U+|:޸ *!J̈T4 Qk>/`rw?"-p/e!>==;bSJA}:Z=ODhf!߽;9iǺyf{)% i8ZF^|tns]J'fA'ƨ*11Coo]QB˲8lBt3F)eY[I!07?qpf"XqWc:qu=p\91&;i:oŘdF63'@49ޛ/>rNNUx< Cb˲nCr @a! !sZkL8vU!gDRe][m4J)^̬ffe]g!p`r:MUTaUSeSYWAz>?9!x0{RʵGU;Rq 3[bK{΃""Ðu@޻00+R9,{CνRRء#3@8B fVkQB43mA`63hJٿj6[ '>TDzuZD!U(+p"LT{wieYzHt:(.[qfkK)Ắş"ZOo5!k.:~tXץ mGw^q "Z !GQh|!eYRZb)OzC"Rjm4Z/)gLkYUv!ӓSZ>|x)7G`jtV?/-pb t8]33o3?뺈Jûwψͷ߉a:beJo3auEǏ/cX5mБZkk͏?xAAaaDRJqrATu&tjV@!33͌ zox_K)u]f>Ͻ} J",?CZu@0ϳ7,˲ ac-/Zښc̵6EK$QtkmTLTRj12u)8So-o7WXW E?[3sJu]@U5T6n\"z4HSU3DL1Qo=4w3;cwROz ReYc6JY`b("Sb&?c@bUoE 4J)S17ðWU!bX*81q۠\kt>?nrHET1ƔWx~~6.}e)?4o9=BH!ڼ""?9@M@ə$6QMRN(B{'Dʁt]軏ŘlYx4<;mPʁbL΋0|"bDPʩJȭuўbKYqdp8Zjx:@n.Ç4Oǃw~ "{^E|:j1u]}]o0V|:or@)?^d4`jDb$D`SDzO)1":1qyqr{cJi?cFt^ reeauym ˲LӴş3uIK)ڻxWk //)t>O̸~4v!ܜSm]g |JRV6t:Lӑ.7i4,qyFT"oU9Ɣ>2KT!%9 %ĘR\.)x:ĔO9/*"j8">d.x8eŸ́DKL~WD`wjB0Sf2Q\q\sΈ!9&u]0.ySUT:R Xdmq]g)eUqOӺ":O*zʢlɕWLHP5eBg )\Quͯck}YRj->ξRJYt콯˂H0+FJ6gSF3 ;3ĔWf1ZִRXAzǸ,˼< cɻa8Z˲,rb̵"!=ΫK[oTZGn֪//?rΈh7)&v,ƨB^X5,)XEjڻC&]Zo>3Bc=1rmDw׵,¡ 4x 1R=} *Ha< )#Ę.NykD"qղ^/!NӡKv%Sk)Rj7Bc` 0pH1ne{"Cf ӲDR[UU3 !c 9ח%ioR꺮OzEa]su8p7SUq& `k؝\vt:2S~j-.̜'/q' T,j1F'_?8@N?:gWCE>;[oJy]Z߿R[k9c EzJG |(qfpݝt!Try;)Ų3Y]N)r}^y^BBu1 !pp,8 9cfW `&_`0dZ1#1F3`y^ (shRCz˺"RL7zzc؀USʽvxkZE<̈Dwy0E(fjH{=OXÇw ֊89Z[m!ƍ;&@{BNC!b5U30+ @)EDy&"lR\@0SB18C~%cpOÐ90!>~H8hꮋ3FfNN9H}} !.9u]<ϢX2#4{cL~c] \ htlșKk!R׵b!06frYRh-p$Dx)O> `e5 Rz1ǣ6&z.1VKݿ!Rk^z>?ZV3;O.8xr?\`],ms~v9Mw`_uwEB.ܨL|>x}}}d.8tx:Zy9OOO{O?r"4zq+D"Rq[x@o_,]jZ֜s-k04M;ZrNG ߿"81v-k1So̕/otugRRJLoڥ3[L\LzKrI)'B)q˺.ib)>u)|rRi]W3x}{iZS֒R"q^^_8j}])0<GU9]~3;Eu1޵|:!񫯾>1v sYeYֵ<=O31:r}~%{3?Rɋ2"RZp8@D󼘁r]sίJ]iɛ"$"UcF9H1RA1ۏ׺ۭ֚s99?Z7]JY^__U|2#IV=o9B8޽[4 rnKq)ǣv>?Nc=N8}'_~fP:Bb#o"bL9^EC\kE@rw0.`*IkRC"*B<9CȎCShs!^J׷.}F47q)ZJqj4.9VR80@SJ>]B"bd#J}g>yA1D1m %EL X?>ynV]k l "stZ!}F&5Ә&p5jZg&rݩRV1g]Bp}]4h]bI)2\}1!!LL0C сlLj.gD0jh`!D^nW_}{@HTMa] "Z҈q|zzQ՘g.,c2޺.2ߗe]c_8t §s-Tc9%w/;H90oW[)EDk5".7rײ"[_~nMu.H)Fͥ)%)Z[-̞i۝k1R&n[kU2M|>M,эRZk!0Ezi5ePk5Rbi !+%-DQrb7úVwZ\{(b&"qNʑ\w?{ה8X⺥Md`&9gS Q]?#OܪRTmo ՙqD&~yyYV7I44f%"X֛nQ~2DDapeJ@B!Ds婈1Χ!%bhfJ9ͤ.}d'@LGD4RJo]EaC^K%j]Dt{%w݇3&5wB]J)tQnbTw0k"--';)c ѿ}FQU\2ܡݖNZ6z9g/*"" 13QՔUR;oc)uq1D9kuJÐ{Z8몪"bMme=wD @!l|6 83!)p@skx:RE$4Ϸ'|6vnw͑\E jH@m|MqSkO۲.뵷DTKUSg[Ď 9.}C8OOO)ye)BlOy[ (vޞ!Һ.503y@S;/of0^V~8Č~DSO3}wt<"9%^\Q핓!MӘZ1ޒjmEm)\k KtuKgb3xFfF$~숊#bBtF8V5٥nkZc̽GK).pHwZxfb)Iwuf"ow0a~/۲SPk!noVxo//@4ٜR "ЎaWoo2'S> \k]<*o {`W#>T~C`M8[k.pLƛZCSh`DZ3lK|w"mBcSk˫HSޛj'LD>n7'+{O)<z}uCen] /7hq(nx@yDĔ{)hF53S0s;Wu25 !"Z^_Mi]u]߿8jk뭋Z{sx<0Wi/˚sv=ϺA唢#K 8ٽ,ەjT !ե-˒sr6,h5Ӥw-i?۩n޷=\2)'}'~p/ ڲTy9KDp8>|xZID QMOح6fBM)}.ee/~!)*Zj SՋ1YJ o{')"D8#z1RJU>|DDE4Pʪ`E1\]]J[T'ae]jV3e¼,Ss9.)x}YTr&Qċc]B0dPEeYLL;A _3'ՔR]?f:0{sν{pH*>Zuy*!D1#Ot898BzopDAD&XռG?jqgYpo&o%$~rD$0So !2'\sN9yWU3-eE.>a W#r1]TgZ$: E"Ƽ4M%dq9X$H#׫_Ĥ  IzkX7yx8u$1LOO8k)~g=蔘)D8n?H{黏aTZWUU᷎}٧v^cyYl8O49e^kq:LNtJ)ץO>kp>z+WnuZb}6}|R2s>|;Bݮ6 v{B "K69C|YqHywfRkup]QZ1?"=s҃\oy}}~޿t<==?/ZW-bf2<<|}"TOK`90r-Vq<ǣw$ÐpWG5E} ñ2 jm1]7 C˲!ѕӮyD?a ithL yq۫߷v5y}nuX-(˲8S[Z!駵2&DѲ?'c"z[e t"x_ <וּv8(#Qu0#͊KKx)"2/n3秧0{Cq󧔙k<"[oGabbra=p8WqsP*OTK˲"x4\Qk]Gfqw8<c֢"Yeد|^H('uYxwuTϚ~{K՘(FM 1A9W[mfgEϞ7Z;VnzmMa 'W[N_秧A{Mf@^R.)SopQwW6vqzN28 lr`@hGZ׉1t=ȝRT<;׹U [kG~ ;ڪt>km˺Kp8[LCУj-.$uopu#S);]5p\#x\< 8 cr8HC>L.jf8ZZQ>{{~~zz|<w@28 Sz`{˺.Ä\WӤUe3.ywǃnɃ>U%\.7D1Qm0$6$;'B uH!9kB)0Z{JwU=MH |vEȗt>m4ϋ[p<"8 tDԳJ9Q jYEiKr^SE n]g34&)Z-Ł/T֥*0NkaeY C)<p<<Dn`v5LީDŵRy)^<)uFݮz&30@g!ViYVb'Y.[)n,r5OTc)z<O$"0ژa;@$7 q‹Zk}6ȴKi 1F6C >[NϿ^p5"R,bf=Sz-zqxRi!TېRaK/؅@!"1Q}*&"x+#"D`fe]Ռb48[ h~:^/e=Wӟp#Ef"U1>\jsԖ#+D|}}]Ņ[rJY?2ZO);1 >;W!^B3[UT&1B{~V31КV@԰0!u* @ahYg<} g!J(Bt-ga.]fC>2cco 1 P0z}Dz-f/`L`͇09R^Ke mUEqDQỏt,}?Ӽ%ݝsjUV%f4~߃,t:H"tNk:T.%CC^]=bCgfnyKJq?i^GvDžbLmSȌ{qK`ӏXs~_uq}9ׁKW3Nrކ!}a)#T`搙zM ]Lj歊A/KCS뺶khfJL>/ÿBT8?=vpciva3Zn acښ0SC>}Mồ#c#3i^s4ܻN?ZY8㣀͏2}7SB-m+")&)[ڲ˥l׽m>n;t)u]" !@JLt\.s뭷h5ǃgk[F#Uwdžn]u:?\U[ؽD{qcIaepͯYwkroǺa&RWo"eHΧ[S=N=G,s$Řev3G=Laxy}s~2ZmadraBCt;gNu[r];u$*t![SJ7]B;$ҙԤwO[@54MNxc< yP6$8.^qx{8@ה>UþqY8C*i9,߼~9 %?O?4%o|pO~PjDڲXJ3wm]E$< rNؓ{6غ%"z<cfp֚{Ljm]RBx<:ڶf).ţ ~.߼^t42|L)!BkԆ`nvBTBYNi-,wHĘs^ֺ,Ho u @f yQ$1>=?G$" Hz*n8g¶hTrZls{i^ֲwځ310n1(cmk\o֩~כ9bYJysZ챏xXW|

' K>3^oG 1H>=z!:Oi9^ qߒ ",<-tPQer*[oyWym $ƨgb=&1cgD_᧪a SU5D 9H)/Dôp@evnLjRjrrZ#"&G6x<\wUQM{Ύs\꣥|{4ݵL峝 ]Mkc _bo'=9H/챎>5 yRj)Ҩ]CޭytvlKWDuaȭV0ٍj<=?QrS^im j]%bB5Usv_6bj"VyPS4oD*[k| snɓ';Ư"Z r-0b)q4lh-ZJMm(7RsRlR.o!zq]K|)I|"|o~ q}~~RmVUv ]qsvZKeHit\ \,)'8, f&-6w"e1u[WGYDQ5Zq)[ejDxD=H^[wృhe|>V0xf=0cmQ1Ao]Mph)]_kw\ΗrBVgp<B=*¼ҕ Ǟ?Ӕ"nhgN<==nwR0w'7k9ZځM;_ͳ"yC몏;Ãkm 56dZ}Q3C jo )x F\?iH/us[iB$:ZZR`F:ax4{$"Om[@Ȫ(?>&35*vo#RP[ke}IM= ț#n'œӺz_ͫy73ǘjZ=o5q!OZķ9A y]?30ϋH7|ŒOOW_@M)㤪1V丶 O^KDe8D(,j`~ ٻ/TeEs;='/?hu`ڐT^Ы!Yr~/"nIl&Ty#!7ֿTKx5˞C׵oz]=sw#a}ڡG*) oNBy7 mCf&9 r'/& q2F G+D UaPDq+R1=cOt5o5`*RB8j%^ʽm "ﷸA Tb;S$`٤Qe T>>&2%_LUj฽ ՂHdEd~=](K4i*u{86J9$݉_T.~VITWH@nY2#*\ xS,}!"?~4 E5q[ې3_;i߱x:=xO1G=D՝%nbt[ɠ?1O$@oO? sS5&}0GՐ_Nd?$fN>{Hp _ڠR]D@.%pBmvVEŽ+&f}4Cw6$F(%}oC$$"dHR6+1 @a;Zdlژ qF"lL/.o?W4x6`}b~{~)ŘT߾_×16g:Z 8֛  „ U_^44{}W)>'*4"#0'dm[<{0redGA'`*O/18!qZ<1֤6 0/U.6hZW>yqzv0^@x{ !uuip߃>xAd^| s{ Q.uwl.&!#8x]X@W`.GUB`{!Zq*f%9Ͼ uYW_!En=цahx3ue^ou)t>{gYDL)F3|s]z8/?ɐOcz9AL ۙpHACoMP;9dRw7}Bၺn?֘QJ!>h͚wCWScgB;sUE a!}r0@uSLXnSG&z׵-5Ѵ2:HߏLăj`h=@ഏG8T~:xQڧ!/^/_uI1yn`-t>cJNt|O^!Kx:p|)_ZJ}|Z]ӻ""84wV? =Cn gڣ=wƲ|hwlsDW,Ҥk %[)GUKMVNɏ|)?Ԑ_a=@۰捻Rq#e 8ZC Qhh޷ƌ80uәK_ Fvd&!T|IaHj-;/}]\[D0 F|UgQ~;5&l䡞]qCֈ|8:9w}xN$tEw8ܻ E&0l:iW>lsD)0[ aaZ]B@DiMd+}i^LoǏIyPG'ZFZۆS0 1D;g@4 v/t""=6BlֽiS@dN6mJ*%6TpD@A" =߈#kf<fwah>6/fji]WZo{];K,j{ﮁuo`6yyYʺ!1ɟ0N?鴵{v@uﷺ=jF"J(mdk:wY7¼%|4>|v*Im|MasW4&ܺÿ9,\=v<*ba<ͽ!8<',,\_@!eCbjfݟesνo.>wHy,DGEq87b>xEĪu~߭31";+T+)uud$ G/^*uo7Իf5QOQ4T*uxuM;Q٣XcȂ'-6ㆹy smOPjUC#<^)>{~(P}5d9vىV؆c\v{/Di ۂCsq҆&s@{?suaeu!B#JQJS8%AD#sHя>R}R΃w,i8M1Ɵ+Ny >j<431EVZ뀇Ji|7ǯŸ-Mw{#EWC9FOw a/D5 gyZl{D:|g ZU%}6;]UCѭUt/C89p[fdj7 o^*٧rϬ7% ` !4? =5׼4W0Rj D_zW["b~Hsʽo.p7 %ȾJzPd؊঒ld~W>wdʜMKT6P"<8l!$.׎6?P`Rh;~~8nvF%dZ(RD Ꜷ]ʖn݁Xߏ x'#=8HBgz\o^3XEښ{[>? sC<Y!27@OqfAF;ǽsx+M7e"Oخuvn"" >(@L'_ƿ+>߬gL˲!#ʦu]'ts P=~_\>sTeې-L!p,DZ7:\F?{e)fd>!'"9y" FR v0 psZu_Oa"!k20F;8&vi+"MGoov2{G ]\5ЃY0V{1; 0)ʍ@)3 u?o 6))qۺOU!`fR4&!v9A='g|Oo}ާ=SڱWwboT0G0 F "K5^U.B$=I_~f "7jm<33gb$/;[됣JA]#%nuG36>H]EF79~ߙ.[T}>o&^06z>fU z,Rxlۯ#JfG'C~xv3zDve4;ߝ[FHCBe;W# v-k M+#I) CD|G-b|{ם @y[ץ5y$9 O qo*uÐ~?]RF4_OeZ+EsMT!D=},޻8-^Yɼ%t@q/@6 Dž_<0_ܺvX<Gϳcՙۙl^CV7VlCuIdH@́iSpc%'GHDտW]}=/ֺWz)jm)m^{s[k1%uЃ|?{zsm2G6(/m8#9HG{ CLya+.!d 8ԇLm1k\ٹ/Vn'O$dRFCw+Ε`7 } Ɇdn oS]kz6.~efߥ&tؤoe=w{(v{X2DFqd"ڇa~6.®ޝ?!mC_.7œcMn*Cf͵}@IrP6p~'~ot</{cB8yάV}aiەў3꤬R}UTir7ק}wo?t{zwaPJ3z!db]gc%1{F3]B~k*늈V 1G0}a}dEîV 7NթljADş@C\ή+v]b#Iuꘉ.և"hKĿ7Y#u˿1_3jҰYU=ەH|<}_z\u "艧?.S>0H,}vy+ۗ9]1P+~?00rV86ciەi345i[ܐ1>Y7z`S]i~|q֫w=.q|aOU-.zdZ8as*C H(! .7?h&>30mG:ԇ&~j;jw߂?L05!ݠ7L kimX~ҶMγ]޸쪺ya6aΔDw.vOcӟd햳sу"B"jwf[V{4͞<{6&#|\ "sJ)?7m;Y;ЛtyȘbaYHþ/NSZUBr >L?t/(qkX2֝2ݡ 4?Y$ۖuk9#IBD$cÀn﫶ʌ2t!STf*G;DV> )Yg~ f/CRQ ~JRm~"Ex2O4= Dq-ڔCo(629Q<|9aC:JC+V rvz 3[}M\ז?{.`+ǀ@b4ŜK2wmv'Ӌߦ)Jه?YpԼI?i+Ծs V@ʹ 6'=mb4shJ ء[+fmtW RKl%`  !zet,!IUO7㬹ڻhICZ]"i5@lJ.[WWi6JXjOCO4ԺX8w7Q;فL2$8vΓ_/c%{a)m$Pa G?,m]ZsJJ6"`BY9 k/]J>4,&+aΈ&>7lv\+Cۺnf4$b,%$fIMl`%h5d߱!yYaZ78}څJ1ݩZ%ڡ\TWh.} EmѷMB0I*}Eg; œ~镖,HYGEi\C=?}ٟb 1gD F2DRNDD6Դ%=; jdS,?^Hvn.2#}*; Uߖ\j+: &~-}!څcf7)R=r.mc$s[7]"]!qCS]¶1PŜ,Z]$BA[R#2XtO>kT' r ,qӶc:I+"}w]*OK{^{ĶSFK{l=`'Btv 3`3 65EKn]mXۅJ&h]>|s^z|:EyGHĨ"\JBviQ $2V̵,A|j}sR7~3`Fq*5{5ۀR03pB"$ަ)eFDL9uU.ec6 ;i?]Cte·J[9 _)W>lS-7\qETza8 h.v9hNJ·&tMd:hh;Y5},R֔/o*VUqTΤE;̀CfdSf\2S*+_[G~?`;2ޮnF^F[a-fT$fͦ]Q6/5wĩ D S\.+@ͪmR7P{[cwlw0AH\g}Ws;e] $a,[E}v>m( 'mmψc6 t+Ӑyhn=.Fn躪MD~_-NLr_‚;L^eS;Q&"=V/]͜6' t7\^՚Eؚ Hg?2x;ǢdK<8GZJ|TU)psl1ojjq6ilD9'~"uݬ¾q)m)ZJ̪Zt28Fӓc:׾ܢzvЖdl阢P]?CG^6 "ye5ÈmÜ<;wHd;}Em .ZG@[鳹۬f'PCR.9=gwI-c7/yX "Ru!F"*UxסּkLE᥏)cO*GZc6 )@;Kd_рv(XA6рZJ- }:I@vDbjZH*Q@DQ[暹&K -kDZ3m}VR}ԧ6&hlo+c{nI3f9kǑcv;JUNطSvOv(o'.} myRݯNOOp].OLkֆRg Zݠ=4SZT,.3YUf)֏myfےsd,Dn]Kb9?˜f;|s<[ "?R1F\|f(9[QFJnT+E Y ?rgUO~ry<{_0;}Ǚ!P43K9Ƅՙ:P ?;#*HMo.aߙ#oK7/XfRxg$6 ,|$ed/mo~/P^NUsɶ"`1Rpr""z瘍F)TW/_#E^: 7H^Ccs'ҍvv;0m"B%8{}Ek;)@_a.9?4*v&M)*!*dξލ(e'u?wڍCs޹yNl|EGZhl13 ;)N 2=[xut҆ao/;HuNz!PUUKA^;{iž2"XTْ8@]'- .^'F]}ZGq'hd$*۶#i)ƜgmKVlBzJ[bnLf~zz VZ: ZLx,q=Un"C*n3{? :ixV]״mpNSr:9,7)?PkN@ۇL d8 \lOqT+QOןYF#?8` ;?xmi&ngx쓨})#or:xlm6ՂpY֒m !DU(9o)TEUĻP< }x>ӦiV>kH}hs {vFwB?}@RKi0c > jke#ľ@/1k'@(l<U*aiuj[5L>jzC\':M!SlJi^]Rh;TĈCn} ÎZ[h_s-PXzB=A n!-ߦ@sa)l.Zv5T{hg,5MT֠4od}l).-o@ZS` #:`r]ڭ]MXl}GY+sM^ ~g~cn .vFdeǿflmy5V]JMQjVtt_זeyK昼gCGェ{6d9x<"Q]:R===Zq@sεu]Ƿde(m5\"e-q)"ܶwiK?db"{MAt6/ǃ֟ owii/ ͩw~A{j>2FjWB#*wD4^HuRmW!e 4dgY+ Iͽ%KN\і0(Èlzt?Tj><5W "JJz*dVJL1I;ol J5_uZC?^eKcrbq:ّ&:*F/[up}nhwW]ڻIHo'p;ߘ;Ė6<;Egr.D~eR]"}f?bOjjcP| ^b7f8rڭ5MX"*iǨɸ6]ۍTBiJk k{NjjiAV4"{5[#'1=kMl4l)SɎG+RtSIf ~ٟ$R|K~YN̮l|"ZJY 8s28M{?o[COo~g7 vEW[7ͰI|njH)`v?ڥUel6=H=#VBK!ȓz; -̄Y P-6)\{w_-6eNw*[U[̬[9@\vs&2 Pk\Mȟ2?XP)k;nW z,V$PgVjcڪ'͙C\bci)V$6;J6J͎&Ml~V RI:wU7{Iaj+ob6PT(\3ycX6ޤŲ^{nhⰓA@+ĦP}t:Np@7cŽk#˥̲H^26ݫmeKkW@tWjz~PŸLg?D¾؛UR)v#N۵<ϹB$<[49y^uWeY޽{[Z:d9&ι,?am N_?٠/Hkޙ81{g.i$")XӘĝcDp8RbT:MS1<f?|r'M=mvkNL`I VI74b;#>}b0ݘzdFg-NeOSh=j7Aq_@z:%ѩ-b㐜O8&DV[M!B cdbbfssHο%E^xT-vĝ@|W_SO/nvh~=W{lf-UB+e@if@׎oA=j엝bX1 rwm=kأ|>(5; r)RDZRN}]{:1w,|ikKQ6 jQNwE_#,MJfP{D)n@XПAV+kFHUxǁ w)ξӷ^c.Y̑b ?PiȦY,~lPmpn$GOg^I-8ϋWs.8xE떶6tR\H%BZ:"?&ϲr3n)5E؜If qDRTDӳs|8,V&70>Co.+sﲛ:]iښ]ATS,?u%ۜo<{I{Kwn 輑S;Ц)ݶ]]}Ϸ3[Zh3]0)Uּo~@DDh-]6wPcdi:0eAK4}oJU}/+WhB|e}fW+vnmSWhv~_Λ >VsC^}Mh4+G&b{nB 4Tun  ٯ{L)]Ժ(h Iݮ]זG>MI'P׫1ƻUy!uɾ+#C<ZCIMve6JmJٍ[klx5/F[|zŐIL4Qf2LVj}vX&5yK޵f+2Tvǵ&5LwKv+aЇo}γ0kD,k aXUDCJɜ89K}Ra98Ds۷RJG$eن_.s\JfǗdZKV/eKUUZx9Ύ=|?"_ڷqGtmWKuo'+t5_jYhneNhopu{\CvhvmD%[]J֡ٚj/śi%:[~Wu rNۿS-Zb+om\c1IN{%0C9\D?#]^GP{R=GV7D'eM{䖛2Qo GYO;i6AƴڤcĶtŽ-#{ k;o0rĮt]k29+Ti躋" WvnRms5oJ՘!ջyۈtFԍ8y۪m/^ZWv^D85mF^W{ziR܆Jb0>i:hKM7EѣST#7Ұu/SL*܃)n˗޹ywlyY#"T]{\kI9{׆1iK28KS.˶mxo_#I@)mӱR6&!^.g=D0YMu@|0M<*կa$C|w=*\-tl=hWm5Jw{e:MdGmR^ Լc;Ѝwͧ'-m.}2|bidⱅ'6ݭ{"I@ܷS;7kYeӛR (:/Xk][g3""ƉuͿYn[Ӂ)62dcDi7cn&ix v&MFmycJm^$TecZ7=uAuR$Aor ۀ;;tߡtՎ\wޣmW6v+]0ٱjeGh_5Jϳ6Pe܋nu|nMHf`6vwR˖qF%rrnO`j?~׽O0W q:RtUWjEQe:(w>_70~/a+쩯ȹ ڻjˏ@ۡ H\uc&ߑn"(u7[{lo^qBb=v}λ~{*)4ni.2mqR)韴aR(1157RzY}w3k~9a|tk]m֔BnyUSu"W ֽjkBBY~ gT `?f\4[7Ohn >#o@[c>OT~롪 mj4nn4&P|i=`z)V,èmݨ+j 4.mcŧ%iNv4^aC@Z}x gƯpKBM׺Skӻ$2=GM H5"ݸ{pa4tєgZBٕmB@ph5>-@n1d7~o܏ZusV<[7y,e?4M`չaSäZ\.fBd[_J?>?϶Ąm C>LCMC)Fk  33e7ڷ8~ܴ_qs߁۵z#֏z 6bVpZק}>VX=s_~h's!\e n>k#AӂZD=?zlgAINFG}ъH6O޲@FD'`5-ECTdS>0F\0]j ˛ u }|rMWXt6@~&zzzF+XKc98zqU**( 0p ]x%Mmղ6[;h׻T>:l34wS&MMO CTy^}t)Taj !Z˺.d6^84/sub9oq{[;Re]cc1x8NEr9o[zxںia1N00eҺD7s "HV+kvrTU Ň97\n͆6jWWInY;Xۇ-oْ~{OֺYPطJS2+es]! 4o! u99l#Mi>ɋ/cvuBHY#(>Z0~~||=QJc\;t~rRjk(;}t,u^؁z틸EȘekUA `ߧH43j8EVo@7>`#AY;[ς4պ8nߒ ?`a/>#{d}wl}dj05Rw[Z˦cH[qKJ}i;K%ElRu 3GCc huc2__+F{BnѽzY+ɿV[̪&ګDPR-"]hnR (pk QUvG݌{DQzBd(v;贿N͟|x8/|Q~~ُGT DSYUTJe۶R*]"cǡ֪!`V;縯\w.biaDp8궭>"꽟|Xc4MiΙC ⧧\8NLӿ_3LC Հ|mvY}D{u DF ƛpR=_ޮ$1q4Keͻ ;t/˝]D̀x=쒔 XZZ._WB/b|I.6n;]}SV?@&P\fi^З mR{32/n.AbA?~֖&w笿r;5D}?7j7oAko;f h5P ě(Q .Hq݉cvTl41tyT,Fhlҵ!<,viG2+^_62 olpE}F$wV@+QF(j͋ҌOUlfUs2azx$̟BN\a FBTRA.!v8'q (>{w~g?S糪ZT-BeYe379N5|)9aK)f&bRUn'f!8Z`9!RQ|)r>pc<۷g3" 1OwxL[: m-Hu+ok7*CuW/!땩-( B;[`GYa8DJyU0shrg@hhvl{mh-~6ZjاplnbrRpY=Qi]>|_EGD>Zr1&86*qY菾rWq|ɃBߥ VQt%xono>hOyu=_ *SP UCW[ J :˙h=9vͽO>q5A~c Pfa!η;P4^sM]vޮ7'W@"zзF00I!Hw-5+k6퐖"g0Ԅ:{;HxPhd$A؟|MaEL/=&f7 HU.t-LtWl@˞5AZ}(7)?}Iz#O~q[@S Vvv4\#ǩBp?8˺s]y>[cՔ9Zm!)!>x[Ygf!49O9:N֜S,38e~~~?W/*_? г:6PjߥQp nIR77`)nROrvtmVܖ1R=kWh)s n*?xyN'jw (x2,@O;є Ԫ֯~#!U#XH&fM+`*J˲3I|31l7eAFwu Hb;`h6+V^0-m ?IMf}14MU-r]/IR5hG *LC_V^s Hf̵m٧Yvy ](kB4vnO7h޲g]63o)Jkc;]}:˵Aڑɠù M%?/|Ϯm֊xsދ( Rq_ϿEM~ ^?zD~w]7֏4qwǯAͻH9UƠr꾠F~k wlVQj=_nԗޫ{k6DrDn `EWn"jT~= n>;T`K9\O-ůRCϷ-҉Lf4:EP=zp76G$#(r@m6&``5m+%k~Z䋨Z1fzS#S=i6 )`;LL%-f( j` ܢLw]i4tL؍g?m-s޽<|aaa`Ki/ 0{ݶ%K*DXy'{Ԝ3u/9WyS)yk-R S떴V^\ky>i^$ SRѮOHoVb{D # uxa+p[zEȉVkluI.Qy 6zw9[.y~.ڡKiCWa&!s-@뜹w+0/!bxzAB:k+aY`Z# T0 r&`:uR9mn6 dk>T)6!b㷿Ѻ|!Dfw>E0 0N9w>> ۖs0 pOӨ Va8JJ4զ!wȕ Rbm}@o8d;pZn^j0v~֏O~!WSeYbrڜs!Zq#VJZEU;i0\U\: UBmٌ@%5{7˗jRX뼈 Q.%ӏ?clIc)EMLKw]I$B/a6_`s*҃ Tzal'te=Gl1ugֲ(sSN{zտ:ND53mjl$f%ӲqvpzlNrHM J4l[}fnNTDv0D*b(hQ϶7>MQ% >L1󩁉=C#EDiEkJz;k%ED|HMS ]g}LDQ؋nIПngR>8u :SԲru RWm Z]+<֎\mPّ]~i!y"#3OTͻt~IMڥWhVaM>T٧5 CVyTCM;pM\n|Qڨ=BWQɁ'з$yڎwR]F!mHsdcP{*w>khYay3[JD<7{8L(.Vs.R8N)RuumqrY})"B ui:赕zJ)9UTQvtwwgUZuAH{YVnm#kksBo^к{,RnF"EfRO7)DZ( q-4$ET+E|I0/ IM΍6zsǃ (n|_ƯkvVeM P$YTɘv*vV >!-@}bكnHLYYT9Zƌ/ ZCݸ;4¶v_lU||ҳwTTÙq- ߕ*:ɤҙn7|Om]~knUm|Us7#"27wfs5Khk#=Z[k]Ѣ*;QM{J#0ml͗;5A2[@Rc[ˤ M"珶"ۦVmoC^VӅn؃x&O6Q`7^ݟ}puO~Z.ھr eZf ڛZ5`K(Z1(ف+d[wZV*#ϥUj5*pt===ʼ,Rp u]iRjW իZU1>>>2 ``˲h·Ém[eeY eϘY!Rm%mn[R߶jm Y"ֺ6Ui 9+^{\btjL!jٱ۶\N8?>TyVc09ܶf9Rswww"\-C/^< 1~uJD~^fD9?xO !νZj$VJVƩV`ڢuFPfu?6cvl=7a{5/~}WhV1Szww !{/Kx<SZe]W ay ҫWRJOǣaRtw̗eY9x ̤Aj>MF6kG)ET }H9R.AJIY ])T "{wPp= Q:M_;V Adv>A-ǿsfv)%9BZsNXksp8@Le !o8Ud۶icrX߼yt<^|R?_*w!Z+t^zUJy~~ZKqJJYDp8m}]@sDbm[ }ZJ rL1"a*G{7ϋ] ].YEiR0fIMi%aj=̗yD$PJm>O{yffjZy>ONׯ_o?g<>>=>9:.9VzJI?x;|mo2u-MLU^Gk3vȾ;¹\3vA{]Mt:)ďyK1fDwo_xqzMYUC*;" !8B$ s8t۶m[`]R8xY s)o OO6VEi6[x>;vخlR6Mȫ>>?큨āyax޽|M/H)3S{|8!RJg]y,˪ 1"LιׯSJ·i:M$Ub݉%"y罂nۦ!͇c|dɸ;@ iKe!bKq\9 1ؔZHab@J)r޶mRʩTkc';b&BZT[dYfZ ntu!4^Jl1b/OLo> BDV1qVI)jΥ|t٢BqKmkB"FH.Pl[p ^|<\JM)3%mۺn[Cvmۖes1N0 MS bM]_ B1x!2;"G1VU{oXj wyMr; HTJ&BbcJ 8#q<(!ZEdYgx\.o޼yzzaZ%DK)벥-===r<l뺥*OOMٱp[7i.yzz:@8Ⱥn9gxqODe]-e]b,C`"ocOrWȏzDjPn4hLdHy8bX 7vY3Q Zir:O}f'J\8N0x<b)~ '\4a&"-.˼,{.BL)yoQfG97G[m|W0y5ko^n0eF-Z>Ectܨd_U$wWu4IlDLS즷n><Ҹ-`R䜌κ,R{?s\JQU"RDTK)u*v1~]WyAsnfHn"6HEshZR*zwrΆ- UVPLl5h+{ح>;V>6&玭 { O;Wuq켳JEUʺ%vL HNQDU"OOe&ׯ>>>0)gpL9}ᇈ\J1֊mQ1z)h*Rk眭rU8d~iB 39gßZkʹ*Sݿ&!-* `$vrڶ; N$vi:LRٶ LD!0u.ơ|~V8L"jay!.Lsn]W[m1@CjQ${kw>>=8N'ϵ xsf@H)x]>|zEO9?>47en^JR:t պv<[$)$E@QD>a!2sNry9a99!LS; hr-6[֘y]7!ꜳcc4y@RRɜ7*宷-1'?uI"w]F:B^U5ͽg3Vu+y{IL'1lkL30a-*h00$"8GY慘y۶\2o<:Nvb-x3Še-g V*b"m"=̵ m]L,l)5dAˋ8DŽm Tuu̥R "˜星ku]Jy["US~>4M4:Ǫ!C-J-x> ``RvCy&Z84͗dR͛7۶RJJiKAۏ?DO[VUuKJ1 Wk!XZs,Zcvnv/ҤaBY Wh-s@bu CSoS_> 6>Mӈ퓟hgLC!Ld?Eqe)kk9oycj߁dS)V%Gb]W$C$Z+1عrSVK\rQdnUaZ :n 7SJ7( Ǫ5;pi/ЎQS(/ӊ<ܽ7~.|JjW- h*ҷpÏETD꺦Rk.%lUs"m۶Uf>݅1OaF]mͥ080lkdv8ȉ0D$U%D!q BߟsZC8Reu]{`b)69TfGv̹#VΒ3Z!B ;D̵V)24sn[7DUr.T`œmjmk˺."9SF˺/g{)ᇵ4ܝNRjn)%T18Z ;gIR.K)UUs,K)sPx.Qv+E{O~y~/nWejX@loػw|s $e '!@4EZ]j2k{-Ni.R$$WJN)yϗ^þ*l)NdC̹\.s)u]VtT_uD`,)^&cyaC|lf0 Q@n5sl"'[9m}s֝rnh&'`H<׿ՋsۣhսyVq<Ibwww0_f[j*뺊iR$3sJELWksff@#]<39x/"!FUڣ :Ka!YT8gFڷ2Z,;"0Ck iޑ[cSS}/y7m>Ͼ!BL`sfu<-#xrL"FHC >Rj3sγa]֔UPErww*].g۳Ețoe0B#0 ۶<,{m`\k٩ԽmiYf7Ey>249LӤ*T(NfRݝ޽{<0!RM˝㧧g 8iT#|!twwO` y^e&R=\fAZaUsNf2)>meweYJCaOh%0m \Jf&{U/;F8~cohk[zy7Rji5l{M;%6փk"Ue/SCH8 CmansΦ 1ڷxn(xEdGf "boTuGønk,e9iγbx><=>:ġZeM@HHTE߶$1D<-e,ox*c/RBZebϦn)MF  K)* Pk""94*UJݢs5k2%; {s$-/|h8#S0emgVi#$1؏ 28;$ lNScjZe^MZ=*ߟ/-өj,Z+ ð5s/sbORm&"= ͤd|#gWRJ"DDmn>UkcPй@DmH{1RADEVIi˹i>CtaG~\9gmgfFuYJB`fxй'Zr%MhK[N|\.e^haq =K1/FrFbjL*!lgD &H۶OT gv>>sJtTX8 -L@{mtif}s{se}[1;c qZ\8?3yTRv[kSiv9j۶Qxs\l<3a\jѤg&*%+f_mKԔ6kǧamis޽ydRys<&sլ9e$L) 30 èfR^ h?lS[o*rmkUTHD6o:sRH)Eo>/ MP-*[JE*9Mb+yFZf9vf'm)GkԘ-RWu7^O! `8)N=G}O~׎ ԔR)ZK%&K-!֪)J)ڠx̛wА}DdP͂ d3l[*y4po߾ݶMyz^.@4N8b-r-RqlMvrAi<9qTT`Wr<".ņ7";ua)b43 n[23!RJ T/-誺$PJ1ĎC/J98 _/sV"^_[Vf۶*lzD˺r:5^\.Rx,R@!F{ع\LaUHi ˝F 8!RC)Ţ&~wYKݧ_"i{n|CktuUTc"L9\@a۶{ɹT&zzzN)ݝsYUKiKqR#-Hj[F[#t1&-R˦H]UZE67e]l'@Dw}Io?SDeے]8,KJe'3)m/2 MHSJHt<CjWIC.882'{rZEjUsJ88D;06,"Q)m[)CiafUSTlFj`p ڋ!2лAFe[qk7 -Sfi{_߳]֪,l!!( C;grǺbc@!\J<8 R@/epYWyb|Qh*:RN̅B ||U|ɥU_|9n0P tmOyD[%6y7¼1RrbR)U?>>].x?[;5P89e7Aڵ:\RI%[͈j]-@@1zJ<u-{a<|}%}~zDZkY1W'tz}MQ-DxrΙۇ0RJ|8:/+yVͩuAҚRe[ZJ)%BJIjmdh-jފ[mPfm6)@m=̍ ԑ,ng.O#ub9Z5fU>YWKp|šn98;TAcUm9c@sNL8LyiB)eK)T8 ݫSεT3RZ"Tmŋ\jl!0mi+X+{?XDؕb>c4a!:R !jgr󺮫EyY˖VucrΧ14M벘"re]!?SyKjR?JrRfv%u]j4N'"z2/aqq`"h7iaN)՚y\mr۶m[[ 3DSZDw_&%?>>ɍ:\We FԚaz4tC1UkDAD,+3M̗x80e&eK)6s_̴m#b !WCxZ uSP`RdOJ!k`Žn9T$u 3"UdSRSR%K8LHBɲ%0 c"$S_ Cdf#(c۶er-6p8ls.%s0>?=v<f!N)-˲K.h[Dk q8(Tpbuj!Ĝ -jLM+2{nyu]ٹa&[-s.Xԣ\J1);U59Z* )!l +L_K6{d͵_CHjځE Hxz_fh>*<tpBtKnZlvȕɇyvw;Zo +q#jZ8NĴ.[)U,?D5!m/Z<2f~4U(4j~$U{IjV- D~5ӣHav9imK)0MGfs^湔 L1{p !HCmy\g3P/vQJF#(RrCTg]`rۺ"UKΪ|{Y[/3a X<ݰV5"B H5r)3׵YwLZ7uÕ@Q+{0;[4YD݈1?e]E `\K͗yYUMqΛw-lΫ?h}X/mzrxBRfK9&JiLH\k 1Ze!;GՖ1iF2/9\2/);r˺auF;.V3Ǟy,5fmK0Wj)FǧRĆCR̝|m6,KՌIhLL*ky,"4Nc_8!? cs1s.8 CTuYmۖyf4 AD9ǿs\fsK2q8-m͝j.y^UCy"ë'w?1'v[g]q(*iyDev)J :2=CչZke+$<-l;הOx۷o۷o-_r1ӳ9Oik&+Lw)9R }ۄvRJa:LR5 ˲1i:yYa~u(HF- lSjp"]7vAd&/HF8_ʇK洮9<.9`f @ΙR$EiBJ)`4NRԒYsr>_0sF"=1j)F] Tr.L"`xgpHd5l(4  6I&o^^}aڷz@N3SGx(ހnmcUnmoRӶ~Dÿ+Vd"dvV# \yZqBNs$cv0䜙ЖlUv!@j5UDEUiT8qҲ,qp8p<OiZt\bϪr+焈4q+"8D1jyؕ.RK)8 ݻt\.!c$"[Y˷@,hҐ0ZEDĮy&BC9 !FKqH|`;&NcX1kḬ۷!n)咇qtL4qY#]*ecF2M}uu"ιZ 8JK 쓃ZsH?E$Oٹq<|z|wimZcH9&Db_MYm}Bmw7-rsze6a9Qaj%/^(TuUW^YQqpaR3/Bཷ^XsJtT-}YZjNC D4İ_UflUʔfp&u:Z7u10М(3 |^&R7WOYsΌq1>u h (UJf3 ZJI9i4#sukp9#lGuD@} n*ըm%uȦa@ۖTk)]/眳xc>.j}T36zBbhֲV))}lc2|Y߾y[J Kq0>?=3 2/R5ndTQC5`ͭXrREb-ml!Qݶ 8vȹT!bZp`B>X8}P@{oT1hbfɢ2x]/uSLfV̶7Բh눶N`V/XٛP TK]{!LuegY.gXxx{x<ٛ{ 1NJݲx8 z]mKUxض5TJ>o jvf49²t<_*bs`D:CH{;˻ |˘JE "{z6"{?)"ysԜl Zk̓ ",H|\撝Ju5ZCB[UUɮ!޹ReےbɵAZS !m[B8DQ;B ؇`*Dj~;RWyRԪCbA8ډثT+"FDK]دv$",;{mn Vf&Zu_jլ)%E!wr9Twά{ չ8瘩 K?U)e" J-ޖ6ŤF9#{ ӡRԹ U}JW~g&8h9U8m)\% 뺚.im ;9c,ĈH)g¶i̤K9wwD`!dQ8N{bbC O1G!acbq dP[DZ'J3ry;樂=;6:H)3繧ƞha` =}z'^LZ& v; ۟Kj#U aV63Sl0q-΅K5r6κm6_NgL"9*rpsv(g>R:N2i| !,BH[L!F&6ZеYrC8uZ2/tTZr)L~z>#!m[6ŬBHe1l? ͇-cIq̹uی<݅ wv0_u˲[:LxRr @caV遯b{"bBP,\s y񑬱u-vŎk h7*ED988Kj{w4\k.= v+:鲱BϾ؃cW)sgL{Q:%Nc`r甒3=-ݻe.9%4 RJ_\wFE;:mUQ ^jgc?sի.p<|t7i[; *HA?V@lK$"}V"U4&_sa>"?B-?_D&.Ѻ,slXb޶;}?*=z:EdYQ-D1hRҥai!$~G 簃ǣ>4s5{O0ZEd̹\Yj ! [=Z뺬voXUTsiKRJЭBPQD3Y3b+38 ͘DH>=ۺN@^ޘ8?+~Tɴq8Lؖ6~ BCzv%a.ɛ?и$W?c{hxz8=>nB(Vb*EaQ|6A/*Ό8ϗZϯqJh1kݶ\ h.)a;g^j[odDe 1EMi)sM'87S{HaxH^_v`6b;׆a4*Fr:[S )g@HȴXe6bcKTAj!Rj巀3yS2U|` @qEVɹZYDن1<ֺm X7M& 9K Vkh. ^(dxۧ 0.9C2 sr8(JHcg"8N"sCctI;vPYOR }bض</鴮O!9% ߾| ޽{ h&HöY.هpw:lDHLi۴ghJ`֍m3`U SDmǩJ)ʺ;s;A`]b+2-m{q5!"ށlq*(?UU9_0 hXE IKD[JV")vsmK9mM)eJ[ڶKZKuY˅qr͗KgU* !!-Ff7; 2# ɹIjB*bRE5M:L>Fs׺q/ ՕH˛G_O }epѬ6 Lvde+rʎle2YA WJTEw @nKvBkVZyO!1FK.jZ?c bWcVsP6!Ov}A!F|JD`;wwZ2oFv/J5}+~ݪ=4R撿y%jĮd$-Uwz-LZ ;WJɥpCRj=#GB@&R.4wQ| 13;VΙ۲30MӁ̴kTso -㖒XU`GQ $C搏OE7a[Ws%X$24 4!P>.k$NsΓRZ!X@(3rk%GX+**!p"rK[m@5 -XS>rEZ{k-.#4MyaTg$* tK9%Df\2!VBy"8!ZvfqIZKU}M$;K]:ځ:k-W_qCsSO J}- :wef+KVZ,s%DK.%< Z}Ha[mmyh,6!J-s!84Q*!/=>=R1A(-߫&-|6*LLRgF "P릊*zieOU!9PDpHf _j/i*bl;"R89#7*\)c; "h,u]Ϋ`pTPqH̳6- ab,At"8Z[*^0lRU؜/q9@ED!fF6DOIKLoZ0\wq]%&D%97UJS%AT 1xN9VHT[JYcbռR aA9i:puL7zb 1(<ɚOǏ?HbѢd`ˈڙQdFP}z>!Ge\-ei\=N$2-96h,S{e-)e;zscHtma6Sj"AM%9֍8G6F n$"" s-EDrR.RR:?m`1NY 7RA;j6BZc &8O؟ʒeؚfgc 9g2E&[ Ы5/AрF&kʬb9nى"${#q7{ bDHfhkNYmC n H%,[wW;TH `lA AL11Z,{tW0PSʭ\" OvJt}pS%d:L̜e]ނ{J,=`TUMuIP@gBQOiD=2PՉ4-ZɬhT"> Q4ّϒZct"3џh[~ dwCIDI߅ pLov^3|_8"&t[%bJM@$ lf!Zݽ6}8LͶy>z:KCǘ۷4\ZQ/TN>á@<>̃j-0oper%I63b}IW]5%(s9_.Tp} JW8hۂ?#Fߘq &pxhT΅5b' <v-w}փ[Hѷ"M2۷w|,%HznYZĶx'N P,EKZцr)fh1#vCJ) Odn'tf)wSsR4MQ&b[Qkהi*e:<>F:FpDz` ,) !BHcqfs.!x7F:jYjʆ*anpbHtVt{)I6Sx޺F>ZpvCsiuchJǞ;7=\JF1zF/ݠh/0maD%D6سMЩ4%լH5kyA K/Z$)EM}phs.I"DŒa@7ňLz,j4H ZǗ,Pee3O'pr8\\Dɬ>$X($xa SBE zoc3p[C7pzZ$Vʍx$gZץiqWAD|^DbjAW]y1aeYGf5ޕH LJHBSEdkm9.9_%Ap}sG 7"m-حyc aIu݄k7 Oس-@(-}t\uelQ nTID{帩>Lf*\P,G"T$)˜x&2q3˹B#v<"}7)Ȳzؤ/0D9,ʹӹ7g3\TsHfYfwIQw@,l1 I"$;Eb{Ω/D%o$ʜڥ$r#ZkmP ՈYkU4mI42I.9&\_.ZJ{-ƍj/S9RL|YQ+|\j +s/u[t>9atw$Hb%'q훕LJLK)1FUDjLCuRx Z_e5w0}1kJ\ p|1ӜLS*4I k+%/ˎj;6zNc3{JW[\KrTi杉PQl{Y%2k=/yBh""6ma@L\#8lCGkhǫp"fw,7[zIz >ZvDd%%0sHΩ%y)33]K‚`)%U,w9B5Z[DV{,3EZDBo v BO ˷(rUjhQxF8n"<8f$Y&{p{9M'+"2DU#f+Vs6SA4M!ЎN9I"d9$&Z@SM=b`1x 7YbƶaS!RHj,\5jrɹZ32M@G}l {}ۻ.Y@Z0W0WFa`s%b n `:V9̷\}Cm떂H`Dnon޾{ W0F:O j[˔p8cSªY+;|ax8R.3 ֪{CRD85CPcWeY#bL4u=dٱ9 755fEPkD1TkM9!6sDp :Piq7E\bH,:CS97om11FQ}KέV"1t*x8uY.K8JN1 ׊̓RHNi# =$j{h[b5+iZ^.!{JnDމg w&K}|%9!" nFDnLe,$")O${(>!b!ǐSi:>lR]s^G( (J8HyFDJi]`; !D,9,} #6wX5U"~p \_ݘ;@e j$#>rJ)AgI9) ~br.D3WǜS{)v6!si0ϻ!Bob{Z8s6f֐qu@X*xٿ1b\t$b ̖M& :Zkua|>>nnnJ.%HJa>TG][#|u}u{p8@u]Oѕcr>ȮёR2+n07{ CIֵֺnB~i*15CM"ad9Ua ir$)ff \vB ƨ_ܹ7ҖPx<ARfzao"R| ;.%mc%@pn 0uzr  8>&.EcF PZRbB捇j1_ L)%-q3C܄`.܆`{Uf]B%PHXW <.պWcokpfLjec]\1ݭ#U,p4ڎWWr!1z D"ef{"kktww7O3Ln@<.F9iwنmD9Hw׌qee(T{E}di @Hݓ,!%4OYՄ!o߽ y2GJD}pFMes BP7hx<ĹЈޙRȦO)> D6{J9AT9r#;0{k ; 1߄7S}6[ӱp<`PNRDvaEH KBǍCDBq*rN?Ȳ"\jf77,|Ժ>{4̴̑fKȢ%v @<1!ZWD<h6Hڑ*csn3b .%o^0#`#ڈeM_ZO.w 7DA|tD $BӲH|UM9G\HZkJ)g;EH{X[2GlCxnboƭU1fep>zkusɓpZ H1:!N]DbJ(mrϘڙyJ|)6oK{%6OG*8MO `:.aR]yWb{Yfan![$y7,{k(tBF3աID23&a2i ˂7onJ#ƠnJrmtx ]uz^.0`e9\M@B] q!IQX1B#w Hb Bl)p@ yR& H ,MfJSfs iN)UR#69T}]@AƲ,Y‚K Co`Y /˒S>ֵ>e*e3k"Dz"02gt\hl+L`o<9ɭEC\j{ vj`.fJ[p&)o":N¡Ͱ%P8$9g$P|kk5|od5D^I[kj6s !ѸLARp3"s7c"U#0>:T6OSt>0TJɹau<7"z wp`fSfdpss6H s.˧$;Q'BrKM1F?* km93v3!uļE$$KUY2-8f.} bAUKYy]7:ZKP7)Jt1Ɔ I[zL=#XGSDP|A:([{deLWpVӠH LmY.YƨDƳ .}0pInFeb:ފy!"1]\gu 1cI4nDW^!b3<@i>iAt,CPsVčUGw×GGeh}=G 'NfjcXsp8TrN9LD׃jc1D23#p r,XZQB߼΀EA-ˊH)gJIbQ%Q kuRʞ؅0M<ϼ%E9O p C±8bXTS<,tfZn"bBoB$Ѯp5 VI~O.}SeƭSyL%&<)ǰя4:B˸rwʞ $r}}˟/tt>Aƃ|F T%v:IpRatdPmc("RtDdPJ#f9D#3ezBCrYV@T3Վ۠6#8R,JLDHXRumN,iS05B#I Z"ʺ1P_fr$%PH: r1$qU1džLL :wXk Rrp8DB0GqVB?߾:(eV$Nf]#6TēyC=+%BSZ;ϱʎ^J>RLT%yaԺ}:14TLR4 :֑ΧsDNӔKK=m,d#bǺ<2!G v&ܖ!*@ӻo =om @& VJ9Hj5$w5˥iRD-'w}{LZk墻&C}v4iNppBGe0YaD?2C/΁ A'\x<42֥BKPy1+IN=fOn~;2=Kz>ow*-[ ̞<HOO]0"?Pfly$1,X݃ӢoֆnS=߀(Q[;[p<c5?ݲeJ ܛHJ9aۣFv1>ZB{"!g$+M9fF{BiB)RؓZ6GKHjwoj?_.PJf"q! ޟ,t~Au :!OfV c\Ըd75dH6]QF$R&J¡PğJDzo%ij][mX.A<].Zk#|8á575}DߍѶ%e Έ _Z۫ׯZml%墣Won{q|u]H`IrzG˺@TJ9_]m2u57bѝkz^Xʓ-auCw$4 ɾ t`6B&)Ы[k0j툉`˓! /ar!y cDWEp8V= A60Za0"r\tW;crĄW3s!7]l4 Tk=L ~'nu9Tװ.d";X!_{q0!+Ƭ)1m}Qk,{jl%:<}jS:.8xpS1m Z>wuݸ]:u=/рOZ)e>z1xu}}jcx6SXNwf設pG߻=i+0Z.#D4&`>ܺyw7vQU?u5Sp]cX ;lm@bbIExsjN"]ujo 5 h9#v!!H GlF*bi{D9AC5µG6;7,B(f˺ĄvTY$%u",)INc+>Pm+}Q'6>"",)!akZk5&FW[kS/Qei9Odf2js{3 H``n%0ݍDrΥY'h#! sH253ӡ):˴0.VL$BхZt)Q<>")tJQ6V]Tje.׸6u\A&CL*j Dktcy1ǃN)0ԣGTU_|ɇxJRk_%st ":"%#\C},P~<2p8Dbxxg4D2]n13q(VI$1{hI nF\XU;9ޏHaDEF1]$:xFՂ?!ҲQ+,=~舨p8`@٘\—x?00p#..0mgw0e$I>B;m۷bU IT {"\[KX8H?~'wLsy ݱL: M@VR"Hp3Ok[_'~@\-mPR\<2<UP%XKfY\tߵ#1pW#=Kccf ƍKctxYnokdaYu'ls'1:6|A1hPb!p8E6rN.y,TJI58']SǖsbJ;گ:&rBf4T!0FzsZ VA|^J\*ӣP:\.5M)'O#w-  𻼅%*EڇڧsfY.vf&0MSQ5H`.CYȠ`%ATLWy#F/Q]DA"s$j=bݽՖm]eYTl{k90u1oĢC;(LiY,K.yr{n{OwLٳeY!6;?;0]X&ږ"Gkδew4lG@ ci##(u8tPF3K)>AuĚh]1F)p<֖e9$gqyJ&”d1T,KJr>PݗkiYRY%yIrɄ,B氚GD"& ɦZ[K"Hdv"jkA+=4TyOP.s~Al_g@/$o.;Fo_'; n##{Y9w)6CMNwӻV@|$߾} :"*r,9ě6XD2Su4tDrok[uZ`/TߝO3!!$t<\񷢕4SŁyiO3…7%mjuzej$Eq}沄P5:3Kk%8B(XS[8c6Fd:RJ侮xy!k\F-9HTSaH"5&[5!>GdMun$"á֚sb6)[ex#$ݫX3mapoͨc=t!BCBiQlo[_!vӕ( ?أۛS8HB,Ko!pwpW3ӒOSaqEH)3RJٶ-= [7fbdA1=B ѴGX׵2q&T5۝;{R( ݉kx@띐P1'#f\%}}s X罽c0AֱD@72mk_{F@8$i@Ĝmm+8վ7@gIy|9%)dI%"EB,$jhnn!xOiE{3huok]>䜅=}ǪqxhĐm$I}OL$m>TLjW:PDZo,;yBCD13ٷ)8 )x&b$q)ا́cj2KE4qcNGL4M,mw WjZr!fUY Y)YdJZIM 4Q^b^Zם/sN")XNw7ͦz0Ę%JZ+bCxjpD,އ03b}ni):h۲(jȼf9gZ^V޽pzH YfZ۪jݫ}$rzqy:x-q-C=t\o#FF EJWS^%ir)6UU$>conUs?pz-l9K)raۛZnouн5Y Lna"/qCMAZ) u@HiCDPSH6@$"%˜3FFѾT sxNe>Ds.p|>E_/Rʔ32 |T "Ģ,Dڍh_pW`ZkĒ,x !|f 5=)gwǨz1PHIRĺO( i%*DJ?ً1lO TN hO??u؍j[Ir*j77;\?bɇp#)Ky:qYw!CUn 뼘\TG]/1vu4ct#bfۗu9^~ \~SIp:G2 ⦩W5ժdXD!bM͘YrD*夫>]m]")IHܱ\4uu"WﭻrQ048=r:=%\3>L>(,S:̲5HΒhcݷ+֍nIhZ{yyi*XLuY$n1Zk`&1cgy!ʱW̑{hDI%9:qS7g zh7qm&p;r!d[4Y ֆލQl,;·AzdpP)%I}ؚڡreIw%7oq5DGѶi~rh'X$tr{y 2parۊn9l1,#0>Bs}].K%gB \rk-0)gS d 3$LtYP2'Sr1T$lA$kY֜KJJ8SR.I#7 8'6uYN#14[9vk\JLTj;ZMGFZcU6-9}W/O+KJ&xQڠD[J֗_$opd@bfd'ۗ>0}\ϟ~x2R*%rfD1yDEP;F9!XDGKv~"NCg !ޗNǏ:ܬ|Y/n9ߝ޽zů^-{wLnoգGb/"k3$jn;=X[J)#o#Vd@$m-*Oӻ^zy7XwWA=ai<ݧ\|uK_y9È 777$:B[s <IIRV+>޾}R"meIOǚD| 4i*ǫ+8-IYꮥL뺺[iqww\ifo:gf}$/e30- 6bio]DC.9 @^3,"~i/8j_Uqں<, n̜Z Dس| 6LI .7b̪ۈJ1ґ mJ$ȤZЃ7g| ",)%S)AzY&~ݏc̢Z1dv:1Y'֛W$Br@v:^rY6p;77E%WȀD%6Def @CԐuH@ےdL*v[fTԇ)"D'3cNIR%XbeD T{Ȃ"~LDZDTkukG伮ZMIR>ċޫh0\{o4󡏡cx et w-WumEH-P$;86l1\tR؄-L90efD/-n𱧃5׿gf![b/_|$GOoxyrW7Oj:\O}@3\t1- :E5HAf*)sۉ)تQ7TbtzoFF114G,ޏrr2BpH!<[jpeYCpEtPAs3$lL X>OrUV$vIMt Q]k췬@H}jtfec1=ǝAUX@ LZ׫caֱũ%)pZ"zsh9 %kJ2WC}fs9K !V746aw``fbDCuQHt,23e.:q-&b&Gi)e3c8KPBuPD^Xz0%f)ƾ1ñL9a>0!χCX(sʏ=B0qcӽǿD! 5mqUچzXp'bN\b.+4)Ό2eU'$7Dtm†d1s>BO8m)dj)q=Dx;p>xdSEh1Ea d`pP88s"$ Py=/{1;}D[Vp;n3/e9' pSzk)il]Wsk]SBd!E4>:"Z(7B%r.cp c:Ķ9-)lU{xOcqluDSP"JyJ88\>}_Nowwgߺ|gO'IC5u= QC#ܑ yYyP''BdSjyKov@Fj] j* Qׇ[0'4g|ЏaG#%yֵYJzk1zN){ݟ_>}4m.U\ 8!/xħv󽍰:DRHHmPWqvߟX^f:@"Sv$sČ t>^?Voo_^^%O߽r;`$5} H`zu' j ))I6ux}umnw4RJkV*Sټk PU4֙wy>"2' O8km`j:ky>{[;T;1b՗FTS7'p__.->,Mď?VIj,~%31j>|C;RHsJ>v `yRӵv)rnaEBD,xFoS^k1IfjiW0/9 BI S74<8:v?vHIꆾ{7 eD*f̼u]f1Z [ۅ4:z,ݫO?s]a~O?y:_Fqok`KCdى:"$$ Sjon{W_|񛗟޾oY~ß?"dyc6ELkꊀ$C֠<9qlM!f"Jhe%Pj,,)-B6|C|Q8E\ls1JɵXreuZ:|:=O>Z7D)KM-<̪$"YS^z,<̹+%''aדǏO,WFq.(fCRwc.{:qxs+oqp8qK 4M{cQ#9ӷ<9"ԸtzNu:X1I$aLᅀ^>5_ZVn)(v9S'r}Le sֵ攙Sܱf"As_Zr&bI1޵Fak/77s)/$j#6gEy 1Y,>zjJd "2z؅) !B[9íZ49.,[ރ5Ӝ wלh͈0莠'skkmCl7'2QD +yU}&(0YDe" !Ov w 0bΌ$H,`6IVJUhK,:cYV\sO[sLC !R[Jm]O? eЗRJ"ݽSwooo/֣'_m| c{mICQr]涇!"Uժ$& E8C5{{"YݽEFl/xC^kAj>GoCŋ_~zw?}<~o~x(.W6wE>\( c/n9U?CϞ$i43N4/eXsPea :yZ:榵v,Dt3-0{wWCH1T>@{矼oO>o7Oq߾YѫJ!R.3GJ8߿yů_ݽw_|˯~O>{qYC:Z[m+Bf^A3[- f= 1,K꺮MG8s$Z41t?zwiZsY%d\ZamӨ{ G83xFJĿ#*qakQʹ2Ϫ˶Q ܘ|=1KmtYpXl⮁:ʋ/q-{Dd]הSJ@i!]܄J-ǵL[ky.1w$,=w`Lo 7rOw*͚΃0!\1zbA,  ws6lrPֵI8lZ+ޖDu=veUy@!&-|^EBEIܚiox|Yהs^1!|rU-X.%%!<0sUǨumu`#:M#\~1^z,5w7wާc}1T|7׷ksav6"1B{G8G@bv8ǫ>"rO}H9z >~%h7Q&A^VV1Lֶ L%(-umߟ- \MSޚ;M[}(Z]KFޭ&q~'H[}Lf%~؎vmMKnǣ9MӴF'6Y)Dg}ޘ˦Ȭ&9 p@BqjRs]G\qƓ \M_[OIp* d6a0yƑjќ/V3d$*O}Ќs*)6FSMtX@#Jkkmv<0V/E)Nm"2\`DoC!w8`5Ի`4d6h~/'p{g{;?~uXB[88a2J}ץrןLfc=ɣD'H1Gv9\._n??'e:ȳ}]//>տ_ŧWW7,~xuL7<_^݆Sw:ں߼xo_|>}'Ǜ_{%"ߏ?Ndι׏S*![ ݖXͅ`{e:p)G_ӻowwb9|YxRJ’SV=92fz#޻#gzYK)SBAL&zhq>/'裔rYR7狻a)m(ձ[ͬ피\fe&̜¹z 3\U:3r  1sm5xqKuc0S7m]9rL{(STW$qp۲4@rq2X8SdȐ#X77 U2iDH,f$,* #퀈v5;Tx!chJT&ޗ%#b+\tG [$zNt<r\=3EwaܵCioL1Cw D 1Z`icpa"=QTUŭGJĠ..(Nc`<h@,jD32NSAe-!`J2R;, u ^ԼC(D8X/fzre)0{8cN츟BČv  LJ@k]/zG|Y*SXۘ)D2Sb}w;߽/Nܽ&}9_?z~ѳ%ÌܼW??oome0Zyog_G4}[O~ꦻb[}ݟ?7__?O~?VeYsCG){ϟX0u Ɣ&Uۄf Z|ic3IN9}kkSnDLa><65pgm.)vK{ wd(U@(HXRr1- S7_`ՏZМ uǰmN=t,:Mr%4H@f"Mu%ӐlbڶD΁ ň{#n%]!P6ܼFLIXrNewo 55pcR@ZCt"~:<^.&"XYbPXz׍wucCw^(yfX&p'*[<nj((D BQRm9[$6dB Q[ QLI{W$"AF(I:\ D8>_"D 39zP}bE*ƥ"93K$v=zl~죅rHb˥Lcc<y*_}v+?{L#nAt3d,9EL.n9U˻~/ŧo߼,eΜVz{pĈcsN~Yog7996f??}$o %Gt8Rxlהsv0?߿7qz%"l<@L,̪jdnb / tG住߽Oէ<}'|?z`]kT'2pݟNQO0SiӴ"[dՁ(˲ | 4TE2x)$ѡn^J9 1,Z/%f]WU,ZX#ZDs|rP[cTuEa1.UMąkd*E#zcw>W=*=3vLY` EPB3)#+qBJ1D"J.4zg!wjP"Fto'9<͡Q(zM$-s3EB!Z+a5|Y-ܙ ].]Dɬn0$p ā/ qA2ۮFBQ5wDRJMϥP QR2Rbȃssb&7ZykaJTM4G>TjTk$HF]#q>(zhsFek̺q(*3H&C,R )'7ۧ>yۧz#W8Ϳ 7'if{W7O7KBI|_Z :4{w~{({׿CljnaKiu\޾/޼㣁\Wo_ϧ7o_}?oG=H$ r =&jepztztGO?|޽ׯ^}#}][5&1kD5#@k![&,9abLBL"D yAia)뺆|< A}oƈ#E0c_ _t >L#$hDIZk{Ӏ$"cg8aRbqWGtd-Z|[R6SqäAUtNsP]eȩa6"R9OVRTk53K0,feS5g=HR" Szsru.g˾ J "#s,ug\ 7~|(p-av, Q}cRzk7v@ :90aA07E@\"7;Ȥ%`'C( {ct*Ih 3˥T$qR/)(E1Q1%fpY5c7Lcȫc(#w7>@UsV[kmrgZ8>~G?G?^6l[HL{6߯rp݋)MO}8n4?Ƨ͓~hY`z_:o-ǛԬͨb+G*@Y٤lq:?zϧR߼g}{t8ڞw޿?}~?NӵWXRSʢ^~wϠ!R<~7/n|w޾w_~VwON1F΄á6 22VD0Ω6tDVvmc鰎9{ҭ5攥[ &յy>Fk-WVr!@L@bMmnH K]"FW-G7qDW#Y9G"G LdC$Z[:1>D%j8{p>czC1@0UAbZȒ60l8bbDO9&bJ"ui̓z,L Z)nH S1ٌZ{,u-9h ̉é6۸{,4F7w4&w{>jϟ}'O~z|މaJ)i>gǽ{/~կg[&7~ӓfetӉI*?? ,rY.qwh̾} s|:w/eA3F!"8s>\rW` y9|>.]o>d7}:?W?׏??wo~s5<ݏպGoa60zn=գ?W򫛿y淿={K)Fc[iNc%Ѳ.vpZ5Rr;8}gRr(Ds;7"VRx4;[px2LSL9sb&1Cd1,gfAF*"Jʽ$)j7&Sډ$&1PdnkK#˼|C3KF8h:n寇6<H#13!v*ћ6̇`FLeƝa*.v89|wrWwIc7CyF` 6v;b M"@H[c#YhbsP!u0^ F@6ڴymDb>?Ms)9HсbWaC(3AF87eji  m; ģ\[o4pk-Di2 ({Ce%˲5p rBo6]C)HHfk]L=X=" Cu-oTg^~Gk1#C\?Oo}߽{=ݴ!"clld3{$o}|/4mXoo:b.iJryݏ}I%vњH*׷Ϧɏ_o?',p?WhkDHĒtֶ. fƢoW?+ӟmNw@mm,%aU1Zkk.IRں@6MmMӔRR9et\Η/1:"FEo)9Vݑ̒Sf[HE"E!,b]Yݘ9܈4>|:_]CAHnYXɴ1b 9|EL0lbnm>tp֦2{_]y6/_ZYk-Ĺ/j]K)9VW6͙w;j'N52ĔC*Ars)qSZ]t`)2t S7&KhrXv37x-$$>O=^~q4PZs.| |G@ b.9*k>5w jHl]wvx33sȏΝmwR&॔y轏ʛ7/o߾{|>>ه*y$o$D,yJ)ןRX2.jFBH9uv|{ElN!k|y?}rJs/&h)|߽%tsstarFI)P|{$Lnc#[' * R슝e3gۦF"‽7"Ib,K.9~\% 풒52MDCO{4IZz Pk.u*y5xͽkwEBq``AA5mֆm ppm 8ն"6%YMXާR<6:IU- D2;K#f6Z3v9h{i #}Y!+1sGk|T&4{O)fz1FJ;n5]| Qݎ'Y!Xk}ջWg|G?}ʒH[h,Ub )## X߾/?ջy\770ѷ%7sGO?(W[[tH:Lϐ>!)i};L>Wsn\Ob [ڻR趸<?v˓>?c)ަ2p}_-,Wς1hu7&_ZUo<~rѳןOO^?y;̬j)%I+$90"i]4h-!"9hKNnNRgRnfyORUG58%8@eH!^  {]k6zO)SȯXdu]Y81 z>r.@ ؖi0浻zt eg@Ml1{Vxxֵ"1!("\*ŭѕ 岌RJp8U|Sm Ք6TuhϗKLĆc_|xt*4Or90 =bz)wQ 512E/ mNAWoo DDg#֪$}spИ|Q)rrY߮e% '뺄bqX3 ^lK_xסognPÖe0htogEt $0tY.SM;bw|#'3D$ۢF v| Qbհƀ,SFTM-҇"1WmZ$B >T[}2;P!!mOԓP A$!$L>F6t+ɁIj]92MDR.jcI2X'mF%c~,˲4Ol9 ʵY)Dwtu9= A@ @HF7iQ՚%DfedVf(ZpsZ\ Ϭ hH8""ͮ{}(PL8; IzSP½w5>{vi蚥sWn9_aٛKf"? +$G_<ѳRK?O~p7Q#r1HD"O9.ɦ!Dsdgifu]]Ƙ@c\%u%@v1X2mo?*-M dLX9/2jB$g~|o7zLFRRuLTrՌ.|ou?"*\]o].jK ~ZZ'O91UU0([f0+TrΥ䪪DQI N9Fk:# cR!$QkdP(\0-w]gSJ˸_q`k})y6T>)fB`%B^brbL*w) j+(lPrI>ϝ^f9xzIsJ)s>ʡSF֐r(P]EL"wum)LBBm4m9[rNT)d& B7ؽc,%+łR9;_j}x }uy)WPE{ Y1sKt?PLTLIc%fleS؝TtB 3Whڮ3F uG2ur2NIBH)Z4ta$NRkPXdf5Jv\rC%S}U52 >LxBEZs^ Tr2}J9Kb.$Y89ޘEqBK99yq|r8~ᕋv%m]NAF\#u+ޯ>h69hesaֺڹ=jZR&VYfì45 k~ UU|6RgAds(P*ԫ|u*JDb'+Of'K Rh`$a>cɅ,;;T*'???\?wk-oJ9eg撴LuGzh]d{yO~W_ݺsm;lUס YȠcAtRaŔsqk])tq0HY'4ܒ3#C ц!҅#oԨKL]ۊ_b2i+3̥$(2Έ3mJL)TUU|N+]yȄ3Vkd6!D!KR8M%Y)SJ'\h$gBkԕb!$Ϗ2y>ˆ2"r$Kdh j>be&& S-U3(k4Vv||<Uus2;y5b +`0 Gm?{pY6%圵֦2(NGqΈ)d>RK^ah"1km(( l?!D> HxRTTui1,Z5"R/WR +leç,o\ue͍ Ts=gLB_F8=DZN`w7sZk_㻨?\ m] EX"`'N ㅵ4b)YRSs8Š:JQ1>]dF ({`2ZI$ DCt89%ry[cD޶m]עA.K95\TI(x$1>0cr_+VdD$B`!1w&LA%"2-҆Y s~o͓ Z0Dc sR`Ǐx [[篾q룅@TB7S1Pk*ǜɋ{=b[˯+%4kҫo|GAjD[x|2=/U >p{}5I]sKCϗވu=R J!l9K6c&'Yۥ8XJ!R1;ꅕͿcL:YI1V!>o?X;wM~kz~· ;ZZh 8imZ*˷KOz'6Ͻv` [d+e+ƶkD4Pld)rkQxd(JԚ8[ %'Dmab,Vqqw`(A@a?Qt ]Wx_%q!Gʅh`@elL2M4F~M!X%.Ewŧ"Zɡ%C(rg8%ŖJ.]Y hͬS5Tu.IZD:Q#zvffBI ^@;kSRXv#iƺOV2PFkʒ ԶϙD@B4uD+^Î?7VȶcJx[ SZh b9dEB2%b9EL2(r*j(H)*:}!A5D1]P N'S`Q+2)"$a3zbh.z*_O~rp| 箽qwF2B9=|32ƾjaPR/! RJY+`JaoNBLL%E[VfR{vx|x0=^ںz箾} )fW5j-\ӣ `C{ҍKn_V:шziSJ\7hyڹk}x}v\ ǘ B) Ϡc}&J1:lU }Lg?T9Fb9.R)sgfR];9yCWrHڮrJJAыK7]yX?GWͰjA?~ +[Wc\Ռr9E|NP h׃K{?{ُG7.f5RU u]'bD\^Zʹs)aWUNbI2pQHkTBġd!@YAIc1Ɗ}0hrzZlF8\JntcFຮDHZrfR⬝9W&t+&bZ"Wk&Y )Beo$2R U?#],_S0IQz{}EN*v*ŅC%Ɣ^eK1+X_WL&3c\$ɯ5 B}zPkmhP1IRLUŔ1FD9u9s ig ܻ 2jS[+MP"Sѩ RIbJ1)JtRs@<4j(,hS"*%+eakEf.%OR&A[H RkprrR9&KPU婗+k|6Fk dD)E@8dŅ`{{ϪWyWňj4"j_ Ov~Na_|5%x򫿶vl{>dpڅW(bQ$bfm,S%P`T7xݏ>su+ng[$Eb8<%:Q*dc163TUMTBZI\ sT-%g ڦ%^Phcd2ϤrF 4,^Yu$dEt'ޫ\ \)vևdÜb=Ո]k|jTLV%3%'N%wʔ9/N\d*cSQFTHTLL\JNѧ9#ydݬ,;s 5uNt]yHIol0t2uΥ8!8iD@MfT$\ m**'0G#iqɾW~P@i#Z;rB:8A? 1Qv%w5ds!=7LJes`0 R6ǽ9Xk!SLZrW)VX I1x5mۜK4Th6kD}\ZӤb&sΦ/8}ђԙUr:{/WVRJIgG9E^VVnŕfy'?ymD% G)Lۣ|=1vau+؉1P͍mZnd-j[UuXi4DZ_Mp)1L*1y $(xG+uE 5o7NMd5׍ _y{{Wtxi Fk"-)e%RXw[pjF|O~60WܼKɳs-\וֆ$=F6$eL)@ȩ+vE-Rǎ1*¥H@i00̽"UI)t]:WirSJU]V݈HWVRJI%0gI9 3w[u]F Qm*MHFk1r)1EGO:sbJ1mrYc.RѨi~:,f kzN*Q& D?/sb+3dz J"iָһ"hc^]DUyk-RH8%&s!"mL]WZ+fކRVBSbNt$cDfl_3BDk,"J`n@`TNvc "ZKH Ji}+[WoW=Q:/0j˧?3m߿}OU{F );.?_O=qjol`YjRT8q;;9sj P6"jA)E>gk?ڹ6 6% ׵LYh4hogRT\J.Jx_PF͡xhK?P5#Rj3"5h+OO(r\z86JWͷ}ybO>gL)B"JͰmRD,;01 l5u]PJD\9'_΢dTkWF;RFDP~ծG lIq!RX_UN *9*P(g*%K16ܵQ))PZ[Eb bLH*sكy>@TgP`eʤ{8EAy b6U S {e8o js>J<ͦӉ;45VkmnˬJzN kg3 VͺdCt:k[+}e!'o@>lTN݃~[0yJ1FHͨX,(XYDJsu/7F&Z;dMJqɐr#vNG_Ub)rijI.P`0d*Y J;_u]+ZIT*bl 5(4DeĞX (e>:>~{׷.qxYʥdlykm\ms~ppb2k&6s&4wىZZZRjy?]_$]|5㓃 pƋkJMHD; T:$ePD:f3Zkg PfdA5C%Mg7_NLTd&4 7\zR:tSH1X7-m]U}/~/N_r} ZKp Zg˹jN@IJ9rNrZ㊥@6sN j{ibFfkD0 ̅Hkdz###Y޷mkE1M'u]+e~2KUbZ#jRƖYSNm;3f䬋*Y+SR[R܇ h8)@-nөv\ H!l_>wA)i"g5ߚ+JuUktɔKR9"(l*PRYr>SĈ;ㅞW#rC1*P$yףGD+.hi_@NVshUJ&b.iτJ ,:kM+唛A-Z 8YO`Hrs)eRS;X/`dB݆Yٿٮ lXkHSѢRp||<4)ZbSP\r6eW"=GYܺ/UR SψDc;<|ыڵՋrX+ET {d޳+"깫>}18b2ڔ\@ŵý^=Yhsi]\\ϱ+Gm 4G QI;)v9ukqTw;*կdHsrK1,n'fv3=?,jsI)8V4p O#V] %PrL;Kftᕷy•&1ŧDXBbL=bH޹B3ȀB "EXk>OI(՘@d'1Cd*E*\9@MS-Y @IjQ b׈ *``|jn_JҡrZ{){ LN)b.z bʊ9Ģ LF]:!k몖.cL|Ub,269x2]sRwQF90P11wjd.D- US<LOyb4'x+d tQ\bc̲%TyRJuS˜p[MrϑZkԺ jsXB16DghccpA<<ܗ*% t>&$G1F6gmk ]B¬RLW.#he$.vDgVM@y,I(Ǎdw0֔B&N)CYCNNNtĔrB9SUW#Rʈc"dM)(u/tqu{o%z'1Qu9q3I7A87YIxξRPDA˻'BUUsjRI)YcpCHZYM%3"kJ9IDXֽkm hRJQBĆ'X.P.A%"zYΙnN^AB(TފBֺ?s`aߺZ=Xi+=w?{rgwpD{~?}kߖ Jvޣ'Y4U3Z;wm=h׻_,/ԣE0NfVISqΎh#_;)碍)D97+/2JG/ 6\Ik-O= j49Ľ~|ߜ@`cV)TrN+ kfяrNI :5H%!`UU!R&b!sFT)(JED/)pQ#E E-cJȈL$vmgP]5TT)BhRMj49#&P*j╀Q R=0Q7s`-H(Y$/ZW{,bu9眃6Nx_1q1RB@i6㸰A5"6ڈ,HJ̐RN1v!zוּmkN䀨XtZD1^cbS9CL҃眾'`. 7%Cr[4OvhcW6.m\ތ`ɗM=M$ƅh,Ż>Lgw#I 7">3}YZ;KPr:~RLΎkea-C`_=Σ/v~1h`ݓo~wqY)oE<(V")ۧNJY|w`Atd;OT@m7zX|=0ƅˤIlXp >mwYw]`Ţ1̦RZfchy;;k;PIDp:*R)%*]b 1F#h8뺝myRY[u4> զ F JsZ 29yگd @W-x+M#:"mƘbL2LuQBĜ)`*O,ыFf&fZkCs)ZuZz^Fpr2 1jsp60IFkf٩Jy_)fȬl_}W߸t㽵+(Qba5Ӎ'w?lr+[. Vxvb4Z)Oʘj6=JZ?,`ў=E%ܪ7/Å=Ow?韎G+F4|Iju{xrb`uskg?w>iejP GsWw?*-@DBYklt+[wIg?a6hFʌ\J!<۾KosַVl]zuʭvz|R`uU(%7V6SPۧﶳ3+Kd&+}u]הbJZ#mQQ.~ISY2W_TR\"PN){着J)1Pژt 8oJbJ5kDWbǐOFTrV;{[E 9jk2IӦ|@#a5v8mO>{ P{HXqe ؛~)gL ǓV)8 Ʋtz||̬3@vqTJjٍwR)-jzcEٯ\d+-t߃cNQ.Zr* ŻK)EQsRDKp$z{1cG!)Kԥ{{1$S)[,5꺎1I6~p{ڶMLs Jad ww>gos'8馔:yOݏbҫUTj<1l^{Nb!,̬jYJ <ȹĔ%N4ыgg$z.l-_Ԩ6S~OC ϒ *Zɕղpy͞NG{eދ{W7(v;緮j%KM#)ݘRy`+7Xf/|AT +o~.xwʭBhsIF4\')1)QO*@q:4p4kmSJT2BP1QZ2xrIvZR$eVu)RHj"֏FêX̬urt!f3qdc%㌉ ;Iց9cHoJ7?kOJnվ-5W‚J@aA)CmR⃙~Z^7f??RRuU#Rl1F+ik5u-wI.:bNkdb)sK)Z.bLI kƚ+V/B]գYuAObHZ1vkS۪y!*F]kF|sGтB@c vd}7Sm$*e m5$3G/_M6rЗ%f($R۶2 ! Ndf,1bjms ]׶dd2kN2ƀRDlR9F^%(9_m~ݧo^篽9^ްOc&W5`ʣ~OĿ5?"r޺rkʭϥ8+vޓ|ڳ7.Œ3i#/c۝Ox5zaTed*ąuU.c6ָ3e)(Gd@G-i3\\;w`=:Q) t兕ͳ̠#mdRJ!R:Kxۛ^gdhռo^޳{w?ܚh}Ռ)lگ]KO~'DǤB]1s.9HF٬䢍ɧ8QRx^#CsbstiaK :1 }Ӑnw{ɍܷ "ȉЅI(BBc̡̑u^k]J~5uy)yF%w@O;ٔ܂ؾ p=Bՙh~%;~̨p|tBjcbL]6$m]7غ:qMcE݅.$ m^4?{$Jhg%uiĦnjY=Wu?qyѹEc=t˓EP@#>XQJ}jkG%wɣwHƚMX竪rLXcT(uU9g1t: !9'Ro%,&6$dS̲ͺӬ1y兮Lg,")9xmcԕr wZ`?Neu-qSJ:هكsnn;Z\}&㪪]ٟζbJK/N!K_; gSr`͋ǻ$&Sf=kE%oȩ;*|)ƨhcк)F)Jv=^-kKNGi6βszp[d":gEq/v2~µ^I|<^޸7Ο}?| qTTLDDjFn{f>Ϸөmg1~0SB!c`0, ! DBFS_S)Q)  &J׳uA#zl6 !S]Zb%GQ)u!.FIB}5\Y;{ZJ'orio Ih%J(EѪ>FNK͔%@V)QmhfH~tpx( N{fPB D(V b?6ka{'ٜRq:R"q\&mџ6zCfCzs AYi%W&_ V6+h$]hcS.91bRJm;bG%;qΣYֿJN'zZ˶3l/-?c &*4 D=#A18^<j0C%[W]ڹO|ޓYW 7s Mzrַo|gw>LO(q6A]缵Ov ^OfvI"t:˹B!FPq< T.I6eyrW_Wzb׏q`N阡~?lw c&s[WwwBWO7/܇ Q vM:Y\ٺ7X1yi&{g9;\X;xv|ASG@8%}U= L)G㺪cL /βhM.F˯ٳ]!%ポ->l>zpK?Tl_IغmFOO|r ]$un\|߹|m.?@;TUU&'4Jإ2M$oFѨUU]׵ Y #bm~s:3(ڶ !tfRA#b)ڮ Daڻ#b)inaD|&m-}T.W7N{PfńRx9J+4j'yj\ GiƋO%u= A49'F,RoM(s{Vd)璋ʐ74 >)nBU[7>ȳPKHIuϊ5:Tγi<: Nf[od2 'ɂN3 AGۧ,9/D]ٽe BZ7 RyQ9gb4eAԥオ6Z%N/1Gcc.x29>0 @e%ha==bJ}'F*k^yڼj=s@cu὇;_0=]-X.Ź> WO.|-.~ŕUTUugx+'mۦ1U=>}re2hq휫<\3nSXg+SNXRB7,Z,[Ik-Bӻ3~Mw]ǣ"hjCTw1n~cq/4? ڸA3\,wdSz(=6!&vߺ|EN't*BmK#]@D]]Us)B ,Ji,D9gD-S\ip8 (,S B1􋚘G++ဈ"z;FXו.؅{v 4Zk$,[Õ/9Oeks 1ixz0 N)`J|Bs0(9GG 7۸OG§W9/0 Fx,̷B9Ŕbʹ`Jakgl6fFclhdqʋ.-V՚zkw$*1aǥcZ|OVVJ6M ɣ{osu1u]Vs.s\mR2H)朜wyo \S/*(B!Z&v D"l.؅(j\4ؿK)Z,ޔrIbB+;Tg“w=/x߼xq sT2j?UUKFŕGl{NgGпFx/_ ]YcDH%<>28qi*gJ3$[0(qugܾR(Օ lvxzoѿ}(5H Z=,ݧϿr5%p89ںֹPp & IlhtOvvvU#B[rFč 7^}7Hގ]f1 $1r+V1͹ĘK))gLʧKmkY\\F.Zk[U@7ْ樔rWUMD-!,LW6Jek6Y'X7u7?n)]>X\s\1m2;]53_k$,9;k4j9?um[qH4M]MUUEgML'1Fb }CӓT|=5Qn􁙄)Yؠ@kO%j~b,p] qw ja;}r\KdDQ(Ki)m m/>)KIҥvLXCUUyy(62AyBJ* !f3R=i8\JJ1siێ{_ Ŭ@2IS\Rɣ/>p+K7K$||szvtj˥H:\}ÇJ> G)e۸xYxyGi:{vp 2RFNx,m]$d*u|6"|;g;gӀv#&׬aHaq`v2=T5(捷RJu'wjm4RH$82f[7߻pnӿ+btVmw'/>9JusֆJeRZu߻McOwK%S3I.Z'ͥxcu];_c؎\ (pa%Ť )uWڹ mNDmDc.Sd/%a 0¤lvւ8֐Kш-on(7>RZ_R0ӁpҌ0ecP22*T"C'a"m6Bny'b%645J)@khCmʻ:? z<Q۶*@Tv_5T+yv*WLbe/j@+P7YN9gx<֨sJ9gw*m J)+6'-IbaVT$N[Qk1 3U$ڒ/!U$&c 3Vfc4+KϬz0s.4tA*F&xъPrOO?zv+oխ+:H%kcتUPNN}W>j囮mœ)7,]yV,`_}﷛ՍݝG2:y9g>) E{D\T)]׵3e^ݼr\)Rg4yrtLzȊC&I l9bd q{~'HOw[g撋4{'n3^^?OrJxrC²N*Đ;=yOgXo5 6Űv߹71?;>>:> QQإ۶b@_wVR"@(sC"+U(9E FԯmוBmj9gXRqCD*NFU!b5Q)rΥ $8RąžXCZ7)pS<ԥL"G8M7Al.J9Le86 cD *}:,+FTl̬BLmצTr!mL.׺HF֙i@dbY^^O h4%Jri@/A˔txS̔V뽔b0lhu׿minoH15Ɯb6Z/D}i`Xt"Һ_U1[#YxP9B:T29J$(M]kcdyb9^T)R=O;KR&D*R*)%&*Mlx> 敫vwDXSJㇷ 9d!Cҥyvr? wpq>yf0MOzxwh8Z 'gc4r@]m+W7l[;"V%3FMper2)E篎Ϻ@)>!+6f":<ܝ[Y\=@Naٽ\?oL#~RxwS(WrbŲaƮl^w.|/1ýL\M] 眬u4)eŲ9#0g&R]bL>(.Th0 W)v֊zHf`Q1p8FkyzbV҆YUs^<,1^ kϦOJi>/mp$D+&Z0yӐ Q`m o`0:os"x1{ׅ.b*%&ѿ[,FxQg hW9ɴ1_ۓ.}u(E}yEG*+Rt|6aW.tGQy ض뺮8\r Q},Rk%J+sa)Ya3"z "|Cz9ȁJ&f_U( GYʄS-̙Z1~qi̪m[*Dŝ/ݼ7.uOsS\彽jv:P!L)Xnj`tBf{vjke"m]vR/ g9R|Z6Νͩ}OO^lkUZX0t]h,n% %i+2I_4 ֺã8oϨ<9dr/,R%v[>`Nw\բSleыLYnz\6uA0ɤ;L)e,.9klzrbA4C-M_bnvrbH)P||i"V!F7Z8wͳLl}\5+%>YV^x3>ًǟa׵"'b+]ZZdygϰUKs؜Rz߹|''gDHws9'"BDISɴBIj*Ĭ*%BMcW}wVs *R{sPu1R$ë$*]kR($AQ)Ե-+*RyehSr.%YۯwmD"aŽ&JbR9UEc2SׂK%Ρjxs.G9g[v4Wu%]b_gmۏAHiM3kgDW*J^JM&I̹4'b#9*&b1@ٳե}ӈfa[  "su-(LܐܫpB"D~sL$QZmԨsTZK5ƚr]U٬~UU….M{{ uB ]P_kR'?ztk hU~sow^i명MS5xeR~4Z|oFK8>Y`(k\[M;;Y2T]5z0\X:Kʣ/?8}v_<;X\;_ZRpٳgkkfĊ_? +N]ӿĻɋ 7>)gnpS|p}ȟH)>?\|mƜLwm|wkg/KIOꔶ.x)>LJ^}}jc.,'ef 陆XWJ:~4^YZ^ishruն]vQ!mcfY+")CT4,(L,=ZqmpԶ-;gSJ@L)EDF2җ F LXE@h6H^Y.l1n fx=SpB hh2֎X ; H)tΛo塈!ʗ lwA596BEUP;JkG D  T!S1I fQ@]kgOW67M]dZWuL1KIQkb(%DcYIGkZ%L#BUUHY۔=5b."f1qTUXi#m>;D451&ҳbB}y磧ۏ\;箼_J6VJ?lu.$uMƺ-tOr膣*QkkAsp] (g`apo4"V O6XX^\="X|W4hW~Pɓ;EvR--WP,=tRdϟ^pk<^ιXcHiauKs^f_bNv}N/]zQ>˯P}Ow~f*;V6/Qy|hm1YS+9<[|xTʆx筵 P) {~7_yY;L^:OTr iU1t;;u5p{D߇HpBO1bO' fQrHJactA9gaq1m"3WO)!RJNRUΥPJQԀ5#"0GhRy|45M52ֺ3Q)!st$0GsRkq_I30v8u~z76 i-QJ#*2wS)!R6 fZ> QJy4V\\#0!ms ?NW{{O/^p㝳윥eyrǷ_]>WWqn>Nƾ- ,goskz9+D<Ͷq+}cf]ՌW6._2hqUkHF"z|bnv<Xp@xdK1n+\JiqxRK6<"VU%bJGiƊ)"hRgQRiU5|\zǙb8B> e꫈Qǘ$ Jl=k (6t|F0Yvt^0T||kIFaΧ^bcb}du[ֱH~µ?~33)V 5JϨZG?ko|ןRJm\xվZ+';];wڼ*w?r}f<'Sa6=9(]W:`L=2jr_re*MC7C%fv8ޯ7b5KU=B}=ZONvb;=co//$LfW/vu6Rjvr $UJƸ%eW1ZZ?Yt}s磁*wk9ر뷾;"NW^N7}l\!XiDL+%1sh|uvzLTX}ӥ`3i ($Zp1M䭭)-! O)I 7 &іD1%R @, R%koVd\RΪRrN bѥSlarE&Xi\B .䦮Ff+#Vֿb2 <)(E'#RM}Ea)e&cɽO~ ;{ۣѺZ_9c"*"ޓ5^qW~.jRP R\W`\ %s>bEr'rQxܶWZc *Ta2 juu%i6k0ckG9mFT`s>ެ+|51!RlI"tLIvDdEC)zjkt:ue#O;K' J3Oxuś'U ;tYe_z| ƟS˹+?-89<|?[ݺuM~ҫOTDAĩm}ճxQխ–R巟~;U3J՛yJ1=~3RBahkŬ/&}P`ڊ­G2sbdrrbhk'QM=+/ܰwWb73I_g=7n=yޏW(UJ<]}ۻx孍7~+&G/Дu Zˤ޳W_xycWÒ3woA W!{_+1qNIs2S;=yjnۮ\[ޒۥ33嬨N1% ԧ;5jrN9ct:NJqUUƘp8t]+œ9KnrjUl4h%v `eBD#cFcFJ)IǯQZps ΗjS^jeu͜OM0DQ2B\AT:Y"ߘ}Foy)/6 G˥[G/|Ռ7.||AT~ijN 3Ni}ڃd $:vz|r{r{rwrMBv8f8\\m R1couR!cK9k79>n&ĝ'{;/kkbIQR3Qqu`wU~xrcC]m7yAu҅ %ǜl>o]r[Kd$Q=_Ӻju7ǡ|`WJL$vɧ/>^rSN<%ET]׳-ħwxRL֕)Ib4M#5:BNh4@PA4!čF#loyaTpi4=8BE6'#Z$͸뺦io{K9O}ݽ5VB ~J&5 dXɺPd!_bLuEJp|mr{d„ BI9iֲ/l)mL,`|*DԈɲ4($ȔbUuK?Re @Im>_Y8x .Ŝu]߭)9[g}囦1ƜVL*̙n8v]63:B45Y;/_"^4Sb*D51pZSxwIKQ#jݧw}p˯~cm ȁYbUR<<:9\]\I13?m{?Z E9 sN̰8^N{Oփ1ňzeWB(ݽo|Kb=x:=sןogK[b*)NdC+! k[WύWfuj*^eK*Tr7;fRrNa69﷓g't;ԃͦfF)>9{p}Յ^٬;:ܽv3V̴ҖPܣz-lfw>=[[ު|"qض9|Ѭ_ίVs5*w'{Ol^!q+UrTZ[(9 篽1>'~ U5X냹/%D*v  8Btm X)ON9/--\p8MNNUU9o, "Ƴ)ETP)c P@LR O3"\Y#ɋ:kBr;gc E6Y;^'Tz / n~ZT?}Ɉq* IXW|aZ09 є1ޜK ド^+d$AY7k%KO29ƈSI2nrǬ8\4F\m H `^0 ・tڶ~} ^Y1R%$;-`<EaVE;oP)LڜRLi6 RSuuEFԵ:D,1um׵UU|),>4B]7Tu u!  DRrm 2Gp{ctܵ+k7Jq8HTI *AO-_w7.z逨ȦQp4>!SF?pխg?RU3:̓0qΗ0rqVekgK]y㛟MO$9Nx+xTrmh"O^xRs~~ƥ+˛`\^D,s҆_X?Z\NýpXKokJ<.-.9ߤRg6S.L nxkis /?P];XhL_)ژ҃ _j0×q02370;y鏜s~w P5vzh6_}7s iBvF# !8g]릦SJb p[S.6.Tčo 1*&6"bLI)̈syD뺐R<::u]mhbLHLDuA)5h⒓|Q%n-R5c/`N"O!%VU >1B*0IT̹i*sΥтBD1*@uLQs3+Dz1HNbJ|Oի}ܕ[%`0 RɢEpiݴAFU՜yqg߿Յ~m+x%'bzr7U胟ŵs_-)1Ύv|㇟?~qY>wߺ;篿yڛo,}5r_._4JQcf4/-l-_XX/Y_6Dphŋ'm;ڎF !Wumagd^_ oxr { u=P5(hoyFK{>/ýO2u1uV-% +)}5ԡn?{GD@Uy|Jk.jLQ b#,@x1U1QR F5$!JEU19D1ƹ>T:saJDq 594FV&fBm$P^c7E%e3q[kKl)E)WZ~)j#QpYJDty ^i2,WJJdT+#"T]Uw?QFsCQsD)b:c1V _TJfl| 1 hA(fR UxUWFBd9"*Va"c% #hBDL# Lr'E+u{ÅUԾj}G`dFZz0w p?DsUch' 5mmI5^MoX_=~GݠgGպi)S)xO|{OOvmS_zko~kߺt㝍 7V.Ur?77.n]^֕JHΣO^>9)V{7/[Kw>jvk`lg깫 }/~Vy )OWn}svFxɗ?KE z$WJKe^>2VR/?}|wa8-Ybk4mۻKi{'5i%){aKbJT`jrr̓ RuzKv[reZs.&E&+#Y$HI-u{ݷo_IHQ,қ{e3 D?tQ <;biyk8CcLLX4 Ck-e1ǎ1FNTĥnhӄRQ@14MckX@1"d2aO2+T Pabz虳JND۱9LDMeRn1P˒a.&SIE1w^t{{f}R[ ьuVlY9rdVZ`팱eR:Tס v $ "o/q@$PZV,r_1]&%9$Meb EQj UU1+ ɠaVZA- dBk݄0*k+断L(bJ(z>>:xpL9_ڢH)by> ͷ~ Oxrv,,9Cթ-2h314eobAih59A1Fc"R)-{iINXc- /Hi4k4> L+!BefMۺϭ^!"pFjwEO6~_.g_EZյ|1dbu"KWv6x?)93w'L1OP n;/ o=/&LֳÿCg=;9X|s]z7%b\tlO/a{aKETrnvYeY)ɱCsˇ{ozg.\?i51⥗OW=|,Jspb^:*/\x˷gV{&)PM86h6՘RъsJ3kŚ1)uLc{8ml?`~̹^g^:>Č3CsKn={n>9?p'-)ãmP0Ɠjq8荈Y;?|gr~Zlpif~q~UssT> g{AV1 /zoLg~a]^sN.l=rRRyk-I7!$hUJ9C9kk@hg(̝RJZ%BULU 1r@ VJfYs1D#+ZT(.4E#9ֆI KmXU竵a,?1%"ԔuYy-)fw)) ڂ?ǘ1}\ G H$=ZAVJk@'gLPO!il6+ʩviꬓOl73$n:@4EP$e)h$yh̜s(:XpXBG2#*S6h3$/rH2F'yH"3DCI@P _W?XXj{NX˾HSll?:rNGt<ԈRHˤeF=xRӟw/9gbgHGtr4|w*94崿^? adV߽ޟz㧗or=DVޞBMý0>O7NwıOJU9$ dmzSX0ЂU-M(rJiOTTaLRS$`S D)A]pvq04tim0fٗ;k)$ M-]XZZF *8Xxk//bg_=4@6~v?Wo<a?|Ek#4Mr=XxP:()E+(xbeuc;?J2D'@Dc]J,8S/ &FeYz}*%,swL)d vC2@`J&)'n`o@I:8#9^8-nj)duh (G F0 c$GDMS+'_8gMLIfuUub7l_t:e3Kt^ʵ>`%FkΧZL9bz6kuѴYEkADfvu-19L'c͹{'^ 4V)hChzs 1Yc5Js9Uα4M{Q& e)g5Xoǧo_kw/#+z7/|_z;\ptvAhH$cwךX.]2?hEonƣPM9gfU7.^U~l) K Gݻ7_z /1KgG;/?\>Q4m F^1CD+cFq<SZxY0^$xes'';u `}{47ͯ fg/ Ow>HݸH3PK6OP?6khֻXt-x'܅ WsJ*-EY`+)ίh@@bSTYt\'㓃tIY ѠL)L\^)PI d:93M)fF";==ӊh% B2qVk12dt[kʲ6(Q7b@ST߀3Xi hd-3gfzPrQRr7qBh]!׭B` M"t]_U:+?_Z1rJA?xG,E#;@$6+Q`r@%WA Ep 3Cֵ2hTZ!BNI1ǘDW 3Ƹ3Qt:ms$8gLZMӤLZjsJhԕ(ƈMTI&t;HNߓnm'QI~U6v'gISJ LZlQz덮;I* vÝ{O]V8k`00x'g19_8%:D9֮ g6Ac]O1oo=_=]CR_2^t/r w^o>{UjxʁxgJD1ZㄢN-5Ue)RJb֠A(4@JIi-CYlC#%nˬj,\{]GsƸxr~xfvYs`8]2ֽmշpda܍`ꝗz泯|\*9ѮD)gVx'so9k )Ra&Wqǻk3~9 5X#U"cLDYgaRJm:RZr/:n(PE]7MSKu',a/ EDJ,1ƠĜɠQBGz|%Lp֔CUpJcZ^b,nM[2[8Oj:mLJDAsf'58┩i?[JqN$3b6/esB4Z+&ꑱvD,ژ~˞BJ?)Jx1 Ks]A\NS0)* )g5QxmU("fD$#Tfs:^e'FmK!4 !ZD"9߉];s%+ ˚M!S0C۲+gPJ.@ 14mދngSrc<,;W7pAn{Ik Y_W'_W_,t?-ŋ׋fz6Cf: u ?w?/zCmWӲ#JNlr8[kI1ЌO?|~t?v罥 7odउZJ \=SQkd@C34J':G:^Jhn4<|M`07ǽ`F_Ch7h?oO_OhvyI)!@'*drz9rUnD4&(o%SV$Z+UOE}R 3kM-24Ak7sΡ D{uIXc$i|􆈚6.,Lazra"1n8ɨ:(3mbJ1)fV,#,-E!3kd2}q97bJ)@uJi0m:e"=IRAmOV%A΢2xg~mtGL9gbZ4%Oijl9ɱ.`*j+@XV$6f%)c7MfJikb\R~&rNfj%S{ fR]J Pdɀ9iS6gghZҥMѲJ)%}Xb$V]5͔;&8İp|6z?DO<Z7xwqSO/ߞ_L4<]k,._=ruc^hYoѠYͤMaӔco4C`?0 )NJY_tvr xo}kNGW_}?ڏW{b&ǻۏo(WMuT(BcVq*R.mu(р!Dq c4h*sJQf睆6ZrK2&1 30RRJ* /sKzùݵ~oWx8{6{?%g}TO[o/93MN>]ݼPz:d!jblB݀7ǟUJZiXf㓭㣅ze|||%8i4&SfEy=Vqt S1e3y礿$jQɂ7(XMFTmDA̙bL:DK ,uVZYYc4EaED:^#BĠ+r"$3˦I]a72K#ȜCΛ3R,޴2V Ϳw ^9\cZk tʿRi)<& ^FeBm<@#(4eʯ)ẽ0+u;9h4uZ+ORJk]JQq>c PJ)4B!Dk, @L5LjّHKgibY )e Cx6asg}͢7td·?;/v^>j..\~r;ZkcR,p~g)i5xAR.^Xu=> QoxshnIu㦞zr'_xo+޾rK/K)o>up4t#!؄ vSZUD짴V!4A`:h%tUP&iHDJKl.R^ yxV Au.圳0HpOw'GϾ,ʁ Hr eׄgo|o׈gk_hALۻO;rnWƓ/6x╕嫒Wj#̓ꍻ?^xcfae~<I5>Yh)g@e?ӦnY^oTxХoF)%t)֓u9Ǻ+^(mX)74$0d$ǂ,RZ)%H3Q0@UOs{Dz~Dk}qy9S]s3XQ4Ŷ3 smkRaA&7I1źcmSfnFUg\(!ȣ)"W2CgGbR/ZRu&&J)Mn] ,}N#ʲўƂh%K f%`hu.&\ 9A 1z=uAVmv Qˮ8e '<7M# &R6!ʎ&ܑUGL[ώ ^zh^g\)3`fa~+zwr[#( 1ǽ?;LR1%t-<quzDvjuK9g묜E@!SE_a/|xZk@,/gg{듣}?^߮|_?XhGolqﱣl>ŗ0xc 9ѷ^{gW3x=aAk [%p uut|zt 県I֠56Đ3y 3eDZMV- ercRʽ^OYȔcb,b;F &9GD)FF^SJ3[!dQRYŔgg9ܜu>4 "|r))rEbJw\xІ9 bѕ"ǎ!C VW;?`WsNi% 9/_9 (LP➶n&Fk2o#wsl@R9&AedL9k-YAaWSuBDbR,Q4؎)e睵|g(1ؾJiLZ{XXhe̊=Y5xGkw+ʁV7pE WHG{ 5{b/?>ܩc̾R #_;z_ c5xtu諝;H+w}?;sK+߂w}g]Ԙue']4FbyΓV4 +Mp#&gägNlZjWge1t4^%&8"̗8CY 5tHQFԄ\7|L* xДhvi~ro0wtu69=N(*-Ŧo}la]׊?+_m?kӄd|2> hʅ Ņ믊Cė{ώ._%nvZ(j|x)#k:gU%v*d]JkDx AeI6 i9kD"y;*He*%YUA h,;/B:krJ=3Ad:n\z.(&r4y rͥ J몪 sN0Yik Yu08E:Uu;ojc)VhN E8@tg$t@iyq5Q^+ s;RJD^B)"Ee/"Q{L6r.ʒ12J^Y11Z# n`D)K$|XdcdvhSJww7?M9O~R6O\ї_mݷڝe?wWw_pf?!( Ҫ;@)5|y2>zs @kL*hhgkh?}p`eg[Ǜ6; 0+D#qZA&R!~ @JXJ!ۼsk(E(̜z>fLH?|RJ W1+Q&Vh|T-rUMj Wn?(f=r3O)pWO Ycpk1GAqdm' d!1%DsrzltDK-FcVho0pRܪ*Xhocwk~y,`RRHt6 s@qKcAm`B>tUUh{oeŠxZY7HMS5=hCU(St[#DmDp6mФͻaN9wnFy'SJ":sohmYBRT) cR2Zb%b 1iŀ(r{j5UUcr꺮N͙Bv0!`01Mg|JhΕWޙ]XEc;3{roh|z8zuʝƧ=PKƋ39J ڰ,zκ-wkc3 ?ZP <E?;\_Ϋ;-]uϟ~MX1h4`S7"m)+V.w1BK-50VɁbM)KF4x_Q&kz*;)SJ|S7!4ιeFQJ眝w!Ʈ"-1ˊ*hB|{9/,\8<|nRMSO֟TGW/ZaM(\{g/v}27]Y_0NMtrt7V3?Cc> iAGb@WC3>Z_E@ B1FV*B>&k1'ʔm )ȳvDc e(iр޻S]R@7&(/"9vX1kB^S5({/S_@\]QTBK0]ٿjhGO\7jC,b=yư8(cJM1crfϿ҈KR4}J3GY\v:2om4Zʵ @VXS8SNi|zJ1Z'nxR9AcD[IVvD$i$Ř@iw(vRUDDll VJᲤjHpUuSRZʞ{h5{;?(_`+BF9 ZtRM=m.\2s<^o]1]hK}NppT!C0* =yڗ;|㧗Ϳ̽29=|{ه.6[vSN13ƤLi=mQ=$28o8ucKcWmG@Ycv$gB&#TuW!Di+u[3V:sdY!J*QL1r$AhU}:pe>Bo8|9oߟG~83\[)"T߬~C5'k>^W yS_o̯?M4<\CٹjXϔscZZ+ M=*w0sY1”/M(Zv ` Ҡ bA"9u "cu]#J7`U@"Zk:P0mtbJE(Ȕc̾peY~yrQN7+8@:cJkAk QЊ9+m@ 2JbUU)lGb&e/_v&"O$cB%Jh (;aAiCZ 'hyMEZZ}Unr]VPR܄Q/sئijhK<\k@ZI[ +9WN ڃ$ҁHtrz=.1 |J ٠ Cⳳ-~T"&Ac|s36&z 7$=Ώ]ٯ4skqp?νN$x{WG~qor?O/DxzޗteZUChLJȫ.%C8E9yҬA@<)%YICCDQ vIY9t[8S{ IJFR> ?HA߹Lt*$l_Niue4ZfL/]35M=~y?z58}hauZYbX!o.]{'ZfϪFc{ùO) _kJQ9ܿp[olvRS/IyysRVg'Ѽ[{>8ZK_yo9txg988LaQS1l3Ԙ9r5]D(!r dtv+dR1%& Upɂ˘,dKp|$j-)9% ER}iV&f Epw֦{?N}TΪ+]Fi7]*{#`s8s1M'[ś?̓Ӄ{WV.,\6;q)MNǡ>W+bvTsqZU.1:YDvjө ӳNO]}E0լ)zuJ,J1 MfoŸp>9k9ITJsz_3Y"qY1ŪJ$OO'SyH7baySE Ȋ$)$3iƔ힀n$} 2m{*̸v `sC;/)S¿BTZeg/ kG4 )ot`0eZ$#)ڈFLPnnL^I5b1-_R3פKQA :D"!&TI}SpJh&"b {CH!Ʈ!J"C92t)m~+sګ3)߈ӏfПN+clQ'{` Ys .^[Gnff^,ӳ=w,lrlMy?rAbΎ7~~lhGZ٪brNj8)K_I/(>> 2V p2sfB7BK;SBz/AClBXȘN+DާCj}|,V, 6fq hq"cevƳݭoj*jhn=4fkgJV̿rj`,",߉d__;qNWѧؾt(>vF,x9T2hYnAF݀v79DVkƊ[~V[m1m$<8 #@;6bc:1":ΙK 8Imm6R)FV:PYU L[+şq]];GsmeZ1;swfӽQo x`K~[2 ?'Gss+b#$dRMg!x:}d:7^}k\pn ~iW]\Qb2{e/՜%M)9kĔvB<33#Fx9/yi]7\ 9'K k a,sBLz>194u]7;v!V "qJ)e@!_s}J::<8X_;E!)?{ٙIuxvٟ <g'>۾,QL?ӫw.pNLp?\zÝ2s!Fl}A9o=|wvW<*1ʀE.r4 "9Mnt9gႀΣi19Y>b2xXQ+Tι!iL *b)HBH9L@&L-"ZϻH3ɽmI D(4>XNZikL&iȿ4(͟|!2ɟ^kl)]+ElmN`4ԐsۿìVsW-8rYYu?u6][ s!BNYR+C֘s܊I1 -A_eL!A@\1&AMIlR;KWWz嶱^EDTa|rw0ũu> &{KLؿevRofhpy邵9a[r MSO6Ͽ"o|M=]t|jṴ̏?΍c`9)˲d[ץnݹZ(e&CɈ A).Bg"*fInr]"ek]UJBʲ6McUV BR*EB?y'c" )'f.:Sz1F)n,˜t<.}cR<[B3 DhUy^vwvʕRQl6Zhƛ?tͲ?C`:x?x!rȝjQ4hsϾD 3_Z_<Zq ]V"T`{G+R9_UR;ꏶx^}s ,.^qpc8=< M$"<04ԗQBSMNv|jnw=_{O}p|6ӛ+|O4\7u$VQ4J_;uS~IQ9gv[k&]J] oP1D!E}J)uNYbLQȗlpCINׁ\V$9e j:%A.rΤ5(oZJkTf2>.f߳SA4|9El+b8۟Y6B;qG{ݿtuql,cv^St͛ol~ ^=q:n<~y҅ Wao}7fe[2ekk mFz,  Gk`s ɖHk4$:2eE,<5M#[\f `(EQ%Np4MCm= ;z bB;94(ᘢs6'zt%1Bp(++ҚrFYN6 H4,𪕊Zf"Ms~uK5Bx)>;;UJ} )):goK:Թ:9XXbRVZ6VĔMDf4 C0:%& @8&өدAɠFeOKj9""d ~ybL!49yl߬`-2Q>8^Y,] +Q+23 t9{/=tyaI)QJ14J`{͖}X{e_]v7P|#s!!XULOD9Ŝbh'[m<[~/,]PaO&fHYkE:u漷5F!9 ѤΔ t:M1[girκnJ˲3ք@b01 G$Ɣ(U͈}RHU.B4{4;kclJ1dTގ5UB3N]= Lǟ-]<;;-a[|1[??|p(Gs MbZy>x;/]doڽp佧US-^~EN))Jل}쯿xLO.0p(?L)#@jYfFЄ&fqiЧ''ĤX9Q*E:fBD|||(k9OƓi5 U51 ,~_M've@7I1ijd}r~8+h\(XZ,d=aY>#SB;s)F9ۄT7ր_@叭XkZ[7#(PJKBѝ2ܤDā&A-2hDkw!bbv9h۝>R ZK7M--=SJ)1 VZXL%%!tR_+sZQ7Kb(x4vv=+--8l9bRZ)493hĽv8 eD$XД6"u;'S`<$.g0%BFY D\׀nRTT ;@qUA40뺮%QNof{i*z<?{l9wucM*'ǟ@-|zvlf/~GdK׬-Áb)J) fL$BSO7zf;d)SL1ʲR'SN:%wzrzW~qֺ(_L7}x?Gadr0;t?^X}O`MVٲi4<R:mOd4!0(VWcV9;WIZgLI .>fVQn!`=T'_ Bh{Op`~Л\Y5>mWYXnr~OpW4>eJ37NcjvPrw1Lnԓ`vfȕ,Њrf"Vj2(ʲ'bA_xkf<r*4( w:g2J#iUו֒Lc EQ̈`($ /J( RŜ/SDYI:Fa[emʺU1(nա::SJ\g,)9Sr/\_97EcVNiZS/L $sq PE9ɫEӷ]#΍՟6ho:,^/c5FŴ%U]׹_g51ʟH_s^kJl fLt'{ۗosZ5Ƣ"Z]כϾZ/.鏎5 hklaV9ebq0?"Q|$~N/#kҪ,g> 7^[?_t{n΃HD!4<ʲ1Gx.۵Rz8*:tZLM4Z旜FcL}upQ~RK%Vke͹U `oL1Fbxhd/cPG "sC1(FchBr&1@l^)&XcmZGD!,R5bn='k>>|:ݼ|jhBh;~2g>n>Zsiއ&J-3/1sNYϺ"x~v;?})G=V(1!DkAT!͛,b5w`L)dH,̝PDWE+\UL iS:߄:%!Ɣs`4ƚt2zXx@im [uBJL_ ^n. > j Yk/ݕ5IZT5޻oϦ.H#vb4Mh1eObfJFz!N@ZjD{M, )jbvH1'8I1 L1eM6wtafAƔB2a&YBBhhBt޵Q064T1E!"ĶݪhΙ2Ch&LQPXB:5i M L;U1L0{agG;/#,\Vg?S6/K`1nl<zҭb0Ŀn>z׮g4C#hH9O&9֓r0EG,43:|-X鉌8Jq, IgРZfN1u%)U=8(!TQB&MY7,4 eZAN{s,>ԕ/(h0V#43bsfʀ8iıMP+yD h%]xȖ/jLY圓VAm??Ac4hf:"~y7QLJ#8 lS:aSt9`y.9[03S^3me./}3#n Ģ %-HZ wiwSU8ORdx ~˭k]…sOΎVz;h$8_sKG ~09MC:SJ\X^Q}pRҹJX|r8,{?_Ѝ[r_矼~Ӎ/?,)L|bL1eĔ+zرDˆ&V0(nsJ1%fbk46ZqJ eǐ8۵cTZsN#wYc,S%6&B؅(UU--"l8 _*VD&~qAFew鯴_ xtxqj 3R^y^$tލc pvˁ Em,Uc;/u NO`֗<( Wj\MΨ-L-H)"olcZkDWJMTQxe!DPZW`!Dl !*Ń{+/:fff" TJO'S1Ĕ,{!bҀ>~Kt*EB_VLwnꖢFYQDMkW߬]2zbj4gVrJhhL ËT`EZ6eG3hZ|IS âo.,;fvX9.ru#Πs\2呉RΔ3i1p[cY1A+c KZ4{ハ?ō~|vRhweO;k>ٕ+_%tB)ܲ?Zx} m~TW+3Q)NO1 vR1{:\{;bWxG/ WFd*B^lQJd"=Hsggg锈j:>9W70>v=6Z΁:g"9c%VJk?;(deWE2ޤwYQ-ZkPDm/^3Ҥ4Ɯe0c1VrOXc LɔwA(('fgr(t}~z?)z:=y~ǟ-VE1R[[LQBLYUE'/6)íջǦiME||h458gQ@]Ώ1 Cye 9X~E!n D0"gdh,M5l-BM@ VާNOcXY *4 2T!)O\Rrrd`&FX`xE@8#z4ƾ`9Ȝ-(9d(LAVfvZ֠R|L T!ޙ=@kLY%L Mris6X|oMRJ~?85 朽s;(:L휛N1&#B%Q[r:LLJ Qi d!9|R̀q-ꠢ( x< LUU{{[n~E_s h,1!Z[2B'ONn˅-? f3 nO7Ѐ qF]7ƸŹ dgQuv|λ&`6Ɩas2Y~ᓏooʕWGzG_\2hM13WfDk=b9%y V&OHY8R1e"#+xscV e$92M""D@cew%Tc, V&c%931#c4XR&h"KCcZO)@# 9ccSEYLtd)ԩdSN)5jfR֏,]B{z?w@Mjnz7VS7v;^W^yj0eyzzs!t|qt>Xҟ]/^Uo?׮ΎzP/_ޫ+M"ҁVPY Z.VRH)LhI)tT͙cu"QrΏFbu]MQ| )%Q6uH95!{=ׄb&qRJqR4!ӳ–!Z6 ds @edlCFB`kz1%n![/׌d=vhJ &V+kGYkKZbBSvZN 84rܹI"oKVDzVINR ȺFf>"җZQLjܶ]@޺4]+lf ;@ٟ<{g-]}\jΙS]{o"b%Aj-%#iU!bJMR&A'cц WG&?U>H>)Hܙal ,,Z,0eXTchT 277hJ2jsYr⤢E$i@;FeQT b&oir!Xkc㕎MQ|W37xgq==_34oteU50gd NNkl \;0u[RsXD4J+V l {A. L$/ɹZ|]֣,ܙβ¥lgl|2`fajI;[zx=XXڏ/^7/ֿx~Z,rf \qsUBZ{e^chL?05``e! 2q"gzAJTWuLY)Nh)8g"j :ئ0z _bQ! 'FDf%+Dm/$أ͠6{3Q*@s Z]tJc7dc=|kro|͝';O[oNjγ2/ϯ8bLbZrN)ml={AS_{珮Gwwߟ[Z_$鍟U|R{:b%brȼ\e)~%,8 #g)j )i~TJ)xGx0%R]WyRYr^GĊuN&1R4)'sSN]vkLGfr6;zZ?%n˒ (ǎg(G" ^BKTAT?Rkb rA4-EKoyNT)ĩ1'Ц(-iʍ#)17 k9Uub#.?RHl:(ft|BC3ZRh q!DpPEʉFsi(SQmݍа\$KRȘX&LJ;˯ -h)gc('/\`f&c)Buzt|7N./\-߯^u%íGOjk^y珮}4==7;X.t]Mi^$U*iΥ\(3IsDeo9@Z%c((SD}]sd"MrrdI"J+bRQkqiFZFEΑRDl- c(q "pQ [~T MJڔy c1ƐSbfôfJ=qCû2^+4OUs7;]Y\24 BGS7^_X&Bo'b굽G>;hue ?[XpE .9cd{oZU3,t21u-^ ħEV:1R\׵1(ϧPw&dPiiѦ5FJqH̽{)M`s.dVh#$6r~RRqdeQ+5LK9 &9CcPiȩ0J+ .bBpmtY.KLU6,,1Ȅjk@14~ΙBR-WdLB30qJY+FD }$fleEzkd=e M̾2ZuQ3J܏b"hb%3bM~+wn܊1FhGח/:7a< Px7zw`fw`w?'9IEinvI':YDW~r M=9=z󃣭˯s?\X]?Q_~9"ʺPW@JYH8bF@Ih#&5Ѥ[irs&@p,s&dkB) E|I!%Okme sD &<3kТT&A]ÔrN|*g6gV G!@#BqK)'_B(r 1Pp73]8hNw ^92!Zk]=*,ͯϭbQpD_`ʭf.e\ٟ/@9ƸLtaaEK֢ t+;6MݦAh5īODM@kI~됮S6MH1;gED.BH'S& c|1轗!WUUUl/eȜRR4: Rܒ5jʡ3QQFw?Gsk +jL'LM93(X48GCJ HFS쉙5π>S@pdimt mAi%*))s%:ʤI"|tcL;0,{Mӄ4L:V5wуF.5ˇrbb@,ibʹՙ}A)I| @kB4Ǔ#pE4T)8߳Nmxszzh,j F+㓃ͧ>ہ_ZiM)us:L>kW"ԡln={[o|'˗gypvozfleKDYVjE-m>W_ekѠ&JS%c(v bVRlPM-cd:]-!_N"ٜss+miP"B#BSFcA $Dh J1r&((33+j&ֵsEQXkdՕ*g9Ty  t{Xw͟|^n==W>{k+z#@+盏>ykeh5r*s5RkW/_>ϸU·ʕ7|GW܊u"̱֏/ITEC@ŭJu_̤u,J)QaW1 &MR)EcBBZs5ucs^Ok\nR hAS5++6Q11hu prÝεR\ R!9Jdz3Tu h%aΑ| Q<*"΂ $眃`zЪI9A&ڝZ3)jkeN`JTlHRD$ r`ZIb9ZDd4c sDe_5u6̯^_|{4CSh/-;{:y4FK?v/rp[ gw7:~& oE,{Ƙ+OwyO~Sj/ackWtLje3eנAАd͉r&RLTMe4M-T>\ס( sjkhvk'd2L&)`sJZGw̙W-"TNRYq)efȝf&ʙ4 rX1rؚK)֙2`r}᧓tZYTϹE6; MI[p\sֿ4|띟W7zsg룅Glg_1^p( *M5?uvn;K_YX f^BQ ϭ\IZo*8I9%h~en泯Bу,5WUE9D@\SQ"'V )XU~/VyZ/ӉR(%Ǯ+ ,V'dx~/9t:y~sh?e &)*h$+@Yq;nnP7FuJ:L4 "R@ȗѷ-[ ۉ+gr=sҲڕ K-B%5 hFReBWo1QnO5{r4GJIv)%1Hnbw 3_+mjI||Mh$ M$)r_w1fDmGjJXHq.~\ѓ_>KO6׾Lf}g,9Zkcpviv"8Ow6UY JT*Ǵ_dw|_O_<*rzGʻ* Ow^|X3R/sbHQY@k%!Z%XQl2um1"W" Ckl< MdVZ2vqrVj!.Cyn#G+x E%>@Q7)cD2l4ƚ LJ9%T ’Zk\+К2k )Yns@KTw%d< 3h-h LuT0OphP)`gM7AYx(APhͧ_>g ٕ̜Ek1gӦV]}'hvBQ~rk46p+o{ΔTNH99mƧss 33s85ɠI1c^O*%g!JƐ$ʸ+q&#_"i)gff0ct0,jsu-26LQ.3'8ű֨Zn"c6([y-,Z,m5vmH$,~<T+UeY̌&Y4s57J+&Q^A8+V ('jZp4tt9ɝ[Z"bdQ rNDJ)BFCDTJ|VJڈN-c?Cnqɝ!8D[e*8C(R2e1f<>g~0{[˗)'ʾ:z'x`8>\ ֕ >S|!h~˷߶z0cJ Ws;kOw5A3==Y|Rɍ7~v/ F|2Z;﹛lYA;H9ZVL (&I,Mz!TU%tUG<-.idLZ{;'^16A'auHXZR-iMA=[%hWnR;Bk{͡h (ٿuPbGWLPVYwoQ&J)u X՚t].mpJ)x.8Ţ8$6Z@XQZ)cpwy.h|2nRVRdM݈ |)g9>>x>x7fVO`ĶZ̜X;?<9\+$IX?tiUiRʗ.Z<_(-M/ߺW-3?|VM[WiPU!4(1BpOkfUuiB ڀ'R?efʲ:4u4v\n+M)'Õ쟦}zz\/^@?[\D_?Z$< l+MXksZ>oZuZb _He42QNLyubD0J_R1VZDҌCb-^4ZcATuMm,rҔ94`h,d܈ShJ9:ISJM$B@ ^;E Z)Q9Pkm$33,*kL{ 1+Iqig# R)}+x{M2ӆd+9mFv8[y~t;9 I)H sNDH#x΢ܺ2QZ|g2tPcE2Ċ2-#ƘDPKzI=+5>K:8Ƕ/_5Y4Jk&+ǎw ޒ6x)5/tk ,/ݵ~U0^dˌ^Lyo,^]axwY!րm"RkebcEbO@ b'  _u-*{ʬ5i&I]78L{R)Tݡ$J2\ΐsClAZgnꏙ0$aD"3EeAMTJI1 #ڊi4kc*4dUUS QE%1k}o3εrJ=5Q.\tO?)5 hxo9;W斜MSЬm}eäk,_~7+zܠs>93p~2眦9n~v|{sRpsir&s,Ky;Oދb9bjFke֚$"D!e2Hx_P.jAdA< mZi{k}QJ+ʍu'̕r#O3dv Z5x~;Dȣ(9&JQ2赩\hIYoM{N L2'ĞڍvW+ ]ĜeS! TNˮLK1Rλ#" xz:,BI`LLh2g !fXKD-+Ykmgw^.i]b><>Yz 2%\lPJŦjf5@I"azX .-׿ܵ-]#/+Y,;ְ>1戜D dS-$uI&ӻLWEO-u5`@Ԅ̪̬̌9gZzXx&P /TFܸ9{ uOyizfwyxzoW~_<|ss|$5x.(yL,R !眒YDu_$BNm`u`hèժ7G""eYt)=,kcNsYT H'4R(c Xf!%ĜH#d5%T jJ{$D^3>"9&S2sWmMz.~"$(nu'>qrpzGg ' ͩO7ܺ>x)o/~/ݻF)9}M4SMӂN]hP491ǘڶu%HH"@!PB^9<G [H3|UK9JI c?9LJ`84Ltڗ5Dj"1ӌR |pm)`8adT: X+,J" -U/s @r-Y UQfj̎*usdѹz.H3"GsvW.Gg_o?j]yǷm''_z:xO>٧?7?x7 M,RVGGgs,m4zrR KyV$ι|bCHZ"%1[Řh_B :EI1k/ݿ9TJ9[% jO 3!fΫќTEEf*"c6!#R@Ka99&@ɗ_\>?>{7mo}U)lwGa1o/NӜrAowkO?xIC񗪞~79ճwn=x6UyᏧ&h1mgGut <`9{j4cg)v)+|1%}9ǘb\EB}!1F >0Yq(ХPt6RY=F$̹${>t0E*bje c~}0@c)%"5N"9,'"M4|9-Aqξ n:0ڹMLtO{oί}[~2h+U-ۋg~׾_o~{71_od_)*=8Hn>80 Vntsi[ӂڮ9<=fDRNٮFjRq;9<@imޙH؄&X554E3/skjDʹp6P-k=b`_thl< @rbZ5jK-wZuPQe ۠%Z=  *U3 :'FR! SXri8ȌhцAUKJ ڐs*;bC;(d%¶mۦqqErv441p[T!ȟ~w-ZIHlv{mGt9ZjHw}_ DDw'?O~_`QӗGjޛ~jsU'?^^l9dž0ﱍ">QZD K\5=y CHmӊ2;}93`۶a">SΥ{L| 0|AEt9Gڄ TG ITs `b60Qs!xv\"tkccJw}Ӵ6HER)&-C0luC1%{AbY&4ͭ_QƏ~G$Aiw0ɟ/-'?ٟzo]_8|~?zٱRp`l"y9ΎNo՟T{,F.n4*Hɖ;q;;S W;;8/ky $"<ǜШ;-yLcH/_m #X$g:QU%b)qYR;k5FJVBg1Y"&0,Er&YE8>ZjI̭qlN@,$:!#bBbR.CWvA!NOmZ4]D"&d9+z !̊- DTԲ:v-热y 쓟2VB=զyN)!cjUՉvW{zַͻoGĈv+9|؝wnFiܐ)"EB1f K)&BdAU=!O$9ގ'Xr9;e[c$s)q+?5ms*g&VbQ)|PUQT)DR*v1"=ZrZ=e9#3{2ϱRr*DEb陉gkt>Pl6FbMYq3y8@/|Eosz~go i8=8\Qq}O?xOZǷOn[]יO,Lf~NnnNo!qhW9fuGgNn%>}IBRRJvBUi&UhsOs/i9j򙪝F`<}.+dR!xR)ƔziB* KmA WVȈE3jypc>L%C ΠSKr4OI.z3T#9dH5TڔWi|Y{,{ܧqX$R Vj1 ɒs.jݗ"4]Lٱ$1X _Ϲjk. RDܴnq>qJRglkM)Q!Cv7MsvD$߻4ϥݷRrU8p;߹]Rjy OXraHL1qHl'!R$GDR1&KIMU\0V,WŜƑHKSRهf9ƈ<|o5SmՔcrXʡxѶ}qkDD8A*bJ*B9by.1|MF>{U3;BĢZfyjMC>ﻛӛ4ݸՋ~_{w_5<%O>~w/?_zsR0sLi#y-DlUQJ6MwOn>xm' ]6*^RJݾ !0M m0*H$RjsCѾ7m L+65èc`&+;h lq)L6cyD D4јsVTD )&ījF2"Y ($jbJFͭqRҶUh:~?[E̢:QP\hڠj,gY?QrtVYc'l,ظ}!}߯O?}{tylNnJȦ~{œ_>Eܾ}͛-3!f%Dt1e@uR-ɸ@ 6s#d-lɛm0T\Vh)ePOL.TJfv^w>:@G9ϥ AH9P)yr\iǟɍGgK^ĐJ#q]<{gqV)iN)wJc'MX;jJRJ΅ɽڏooU{`4y͓.?pZ S"T\eR.Ib"NEA!ƙBR(Hmit0D$֗uuPJ*M9Cή2XW"Bcٜohm}))#`)9+EYR Gf)KfbrL9bgLRF缨MtR;ȗDR(˶,|QHsFBɇb'D:+845)b2ZJ􄉷q{}[^ <>s[~gs}V_4+yw'?}~޾kTJμf$N:luQ-KgJ)iKIЮ?mW~5e69ib%RjQEsAs)f%KK!Jus2m@y2/L9<8-BAZWWkO#?O_Vku:y*FlͩH9GskvYX3픰@*dIey0%>q@= Q}^OHKc]0E`Z̵ 8-P). %s߻PCEAS.3\TĶyU1חU;:dswrk9 m_uCBg?4|on=zq5./_焈O= ޺%rɪK #b!'Ooz4sٻ77ycs{/~k>ʲ'xӣ{Dh68C2LK)p09r%)ڶc.V٦61~ &ǾVk&!"+N'Ĉ@d̻Ô38_bH9I΅QOJe`nb˹y{I "oe8A$)[;譼PՊwDdR"JL9eBm d43"okjO?\~˧>'O~,u;U%fDH1#aK(R8={bgcڜ~7>ŋ/n޼1p0Tr֘2WFd4HEl "\uu-Tg81Ůk#ĘE$g3 H.%գ`ZP%.P\pjݼq]V'B!A31SiN)!66JDgT4XR@`mTFU^Cu8VWyD,\YW"`[ X"!Λl,ݫj "I8t9Ơ>Y DĠduي}-\],*%:9iEՄ]0?\?yvԱw4M g7lusяΛݺ_P)q?~ø{W~O/}jUs+Z@Rq\, @l~s1j4>D75M.ǧ7ス:: < 6vD)k*jQ}Mv8[ڮcDu v8s~qث"Y1vFovR)E|y MMhb-DH@]N"VF'"*xq pP#@\vYMJ8g/ QF6Iʤ/E H"2Mv !ӑEγ̎,iUu[P6?:qg7޼/>ۜϕFdrsm8^^<ßOW/]INn޺yעα[;6yڿ< xfkk(>ؑ"YAo=xœO+rs){"")c5l ڨѦmni)gzP5g[0ƘK)drΩ,"+.Eb̎Pk7/wM0"5ӧh~uU;[=Q(eZjGmaNnjUu)/HAU]`grhFaEJiIk1ї , >j%5m3C9–k7ӕ~/ 7i{.E 1ySQbrKmiƭL}EyH(gQ7Vڼ|O~~}= 9yW}яS󷎿QU_>Ǜs\bdyߨHNF3d\\ŰXbm[;iQMAtڸػ/ j9QcVrʉ#\AETSaRnmbI1bLL\CCB^7H9[ǼIZDc&aY3 X)Q)%`)4 )g"DB%娠 #sQ$jrɵDDժwފMU{ }βxmN^s_x^>}{|7>ix>/{UJ1bM lsqcR'=[w!^<8wgOOoCdS=$jut~} EJ)jfUk'bYՊF4GUA!.&@)=/!? R蓍VGP"71/Hd#$F2z+6M#2 {pds8EBc\DDu Adv m|P| ~_|p}C'~oٝi_Ϯ=|9ni˗~0@Gѧ/>ŋGgw_74OOzbh+"'`)aĊcӡ-յyqA̾b*3}WD4g> f1fmӎѺ،PDHQ,d$qPM)gG d_{'Dq![ զ _| ׾FkF\T~m 9o6֒ )93~̃+ g'!$*R63>H`12zWǟܼ> W/}9oRGg~$}wJrsmUYZ7[;SooNoMΫ/?Owrzs6{ [gDeb^61/M̈!\sm$BT :3G vGђwӔ<LM)7M}ŐEFM7/wM~:qnYc$YR Kj@ FҬ{8Tvg&g%G*SVs XDzJEd>fI| צx ;\yq"Td8EDhRUiZ3QyHaOl 8x( p9"=9wPBuG-fGiȗi)%hB85Fݒf#?L vomސ^)y~xQuo&Hy%mcg,ۡ\]g~<2=k{o٭4x0(`p9Nxy Mu4U'#n]+;{1zlY4O)6 cu>Kɹ@"y62p(9y.D|tvgurk7 4;f~0 ''̼^38s%h) idwin^v5، ]WqZL`O?chocXJ@* SfQMƄX@VbbsgϞ/v̄.SuӧϮH[mǬ*DDUץ 8qH,lSLv1՜"*!"KWJ$b93 sz9R.v5*R*9m&!RNӯAN9M T9f(6Vt߲i'/=>ٿ|^-^]XNoWnm99G/7w/br{oMYK7J)4"J9b~ю4#Rh/ADƳ륈< csA"ŗ"R2:TTK.)m1%(O9甍'qժ!%5YFU!+XEMc*6@ 예}pRRMΥ:g4j;ٕ!3=P:4WD)zq94>wL\ f.3֍9ٸA(Sn_m}я~ o[,y__x/޻qw~vLi4v>d*xOOn>o;Wuow٧׷NϷO1"Д!ZRnzzT%1ۂb 1>Der*JM {_J1s~oS!4P+zm8[S5:Cz 멩LjP]5=j 9&*j `"Ftj.@]Wg(@׵.4)*1FUqFv/ÍܩK4#9#mwIVX 7R]sL2*.:*uȹIQfnf&f&l 5U?NLH9"(:Q瑘JаF"a|=́jF@5 ڮg?|~jCHvi5-"yo_򫣳~}r_ݰ_]>2 '{vɝƩiV? sW7\*yVhWiw%Qnܻ߲ymv]6X?o{?:&lN_:t+úUo;OOW~svM盅R<]hǧ7Dd|çqY_~.Oq~~j)n'[C8!4GǎTNS M8!ckl/cjۺ{cv3jBcv}43y+gp^9'Y5SL20ZGy|vq̆^pD(B*6cg ɠ=VF @DҢ{fvEDR]ddi2m@ T(ΆB@v+- (0#uj(9#Bٱ6cN+\B޼潷֭7nz'Osxo7"Dj-Ĕ_|.'竣S߭t~77w_nudF׿IW$ }{G7K-Lt|~&׶1lN&"3cOlZ+qe*JyyLnC2hUbMDdc_%ni_òKOA%uZ+ d|luV \ݢ!r)3Z 32VqIT_)=MhȍhR;TxP jj8GuRTnqRJ}-q_ >O,pJ 4 (ZW^ MӪB mvq0w]W-+7v2ɷ돌g`fok}'8{|Ҹr%ޯoo}yş?;VgZn}z:۱W;/R)F\B.Ş-;M&#KiZor4TE\+6nl mKqkQMk;+v&?gvIJh]P)&à͔^@-u(ju(RBLEUb*lVT*Y1- FNlg]+ıXV+,7콯d,n [_#ӊ>w):Eۯ~ݏ~G/}뿶 })#coRL9Gg[`$MۯNo=gMBun}L^9b*7~;fm[b)0 [6fdJwNDwmbTG%'tnyv=T)UA]@XfQf.a\lҿ¬HƿjK%#DΔsR 3aql_0ǏAb.6jI D"Իۖ@Ժ $-6=633#K{٬ٚĦ^mYzAcJL)jPJ#PP!YW  >1n'7Nob31/ |}qvz??>/_wo?vuyt}z?kޫjRdEJ)fsEzuR-dY9;s$œ8mD>41 ACi9*hJEٹsy$"B0R-b^AS$Zl)kSP{^TDĻPxd)jjL8 gfΥU)u4,eNJتHhѧ ILشl̐fT+{iu"Ķ۶Lصz0P];t09GQȒ>8^1盓;ݯOo~OeV'7(NZ+d mtn}{9LHDm"aƱm[f.R{wyy!]ۅ1M$ E +]טXJf&sO8* z)e"P1ivKQ؅*#bbdGjP+Z#R",3ۦijFD~lzyym^ݦ=F_8LYKw-[XңB5B#ԃk,cDISJG3)PcN 13a6ཱུMVI$, ;,fs*j3R+< iR,G7~S)Ya4RJ&qcc;K̵Q2Mw+~ \hwi> -~?ϳ~0V:fng֢DN%"(Kݿu?P!L.Z:wMqf:KC ThE/;#CTqӄ>ੈ;-%6Mcy.vx!![V0ZAuz(BTz`3 6BjW*Ɋ5,HsyѾ!%8ׄ؊9 -S3E2Q-Є%eSlquf;I9={(>>>/%C@-{o8ݴ@t9{w\7_n9/ѫɍ{9şWPo}]~[Ky[[1*3\JAUPP}hZ4)kHDrIT UPvb8n6&t&|7M{tsaHT0 %;#RiP@)r*~r64ͪRc"&"ϦcԬAu٤Ϭ Ȅ9ev 1 μ%m{o7EfG\юXTeE U-.Dt<'D}sX2d1Yر%޻yڜ#(QyR?>=>\\>Oj}owm 0[œOX 9EHKOn}mlY֬bT~w>"%st.Zn>v\rV-MR6C%3!}nuϹ5JʲJޥ~QΗeTDa}f6[ZbT<.\B(!zs9"4v޹sc:Tb&km)T=D*]Љ&բč_'2mCm$$1Uɹ0><DFdf٥SN+&RTʘ9)iMh6Qt)%Uq.H Ȅjb^ SRi5`Giw1m_Rfգ͹oKN}?o=Zt+,~D}ntu|v~n}cڸ>{ornkBkkU\}~qBwm2ckd Knj4ւ]t||B%lj# $B*M4 XsSATAeAҷ T+L !yd~F:t6r &41U +LW'7St}[_ a!s]ӆXKa`nSʖkcO~6OCG)p- *=H4Y6e2hg:RUGDJ@ D@V hpzyR8s9_H 5jL Σ$pQ:pJb$o8`uE"\hYjq?yC2 p[ecLR$ƙX,susBcJ S2չdDH: )M| vR!e<\pں㜿u~΍?٣{kutִ]h~7y6kG$NE\ιaF4aM)lNk`C='")AbycJjiiZFr&-dx'3t%3@Ds;o[OVǢLU) Xh$d&9Ff6W(-i{}Y\%…} V9 s.@C.K|x N甌L @@Zf&U@M1e0|a}5C|9\\>g?؜<:{rv MUtݻa^Dlv/8B[l֛jMkš ;Q%"k`jaBncif)C)m6c4h)FvrHh8iw9H)%&4X =R"$%# !![V :g̥`*ALPtnA9+nv0ҜSbRL`tէ4L42֚ 0 ^T~:f>JS%esv-X.ٚL)eӟ;9{zǓf}|֮诈4OÓO?wJ?y[ȌJbӮՑdJ!409'ĺDnJ]mOiJ9s)Rw8!>?sߜs+!t sgyYrb5+bkcC"oJ99;exV41ƶmڶE{GnY} ݮb}LįK+$[W}؜leWLm1S.0]:3`fnidhRmY gYL&((*vRR*̔Kilc"αmg("dgqr58jӭ}4sRPi}zr>ejhsi'7w>w{on:>{r~oڣM*ums@C۴0BRf} ͉,Y0J%c sw]P#m&s-kќܲhߗy9S-,ߥs ~B2Hq8 Ƣ#"v\UD;Z呔 m~k(7T0mRu "6694Ef=BДby4si[/M*2D[Ӑs%} ۯݾz?B(1N4n??Qwm#i2JYSJѺ뺶mTRsL;"hfFYR@5}\r.86SCŃRDѷ_)kqiZ}ƥ&.s#)Kg$cf3'.QMӚf'@t 4SJ:U&M1WblH b_ `5KBL0웦53 "͝C1%Uޫv5m4-ð)9[cJZJNV(h Pdi9[B)r]> ۮ1 [\(ÔZǾqMq')<}quG/9Oo*iYk]LF$Ԣ9't#cAq*|5.>" UXۦ]0f{riڮ:U(D 0+kfbUM]FdgPzF)2Rf T|{mQ2Z)Tr֔Rsm.Ad%dKM5z=fٸ| ?* X, { %hMf 2@Ytd0"8mCRhTbvM Vy_c!4zR2F:H4IXsJ/^<VG#8&Qi*dR=yE 9"[Jr._(ՓOa}rV|M))q_7_\)ݑ4R{α-8Rʶ؃;ZzNm[Јh 3E͜9) ]8&P1ZwUa|EŸR"F>yiC9 ut9g:lY2‚sM9*#%s44*+ن % U2Tlcc"*Er΁Bu)Cݛ[6@j#U~-W\11Y㩵$E"˹J1n/O||stv>΃N)%8_~DKyLKgwrεmwZJ=\6GgW/y McښJHжmJ@)\QDrBhRN_yJ?f"DKhf* D j;)ZM[9n$ʯUlBYŒ]URI6vU[98q>/GiUNOOa19RV;itB'WIL"Fe+xN%.ΐZEJV-KT-V}tܧUCIXSɈD)efq6dR*vbf`cF+nl0Ph1I䜋HJsL]hڵmM@FW˧.j&x1EDj<>QT yo|Ε4}9Z=v>ǡH))nJ?\>SL1S2?>>1? MӮ {5k?t+Yii[pާ\Tqdb;XTtS#R""1%clօbSӢ5UK@uZdOłi_E#!9!Bow6Bb=ض#3{ 75(jYI-1iɀ?'1:jEDIpB3SĤO>iT0;wr;o'7KJ)NӰ_x|:mjzQ:9aaܛ옇Sdɩ`lDgO~/t0C([}s.DqL\`4gO?w~zSc37,lW!Fۼӄj#zޗmKj** j]Y" TeR=0`Z\\\ܹs{WJ)ش9DsN"8 ;Q;j Ȣ/YYQBTX%+R%}l%K}`_d/y1ZF}?9QDbLlO2:s 70^6a5u\Gh4sݓD_Lce~{vд5QRy^ik][}>d_HJPh&2ϳ 9gPB]L)u]6'Gw}Qҫ폾 gw^?y䌦yi~𣋧77G_5QzHvC`frViNڮ6Ϲ4McGq]N.T=}X,?UkdQ)s1]J)qVP0&=:w;u]u)&ͩ;"=V!Db$%2LU"DlÀd@- KmNaZE+d!X[[kzEJ#% RNД4iӂ`chliڶu3a.EQĤRrNW]>ٜޚ׻g_Q)y]=xb|>4{)OyU);cԌ^1dhFUE &F$V{ < :85R\lJFYp@ly@ɀi,6`x"qK8πL2VSm* }Ef#=ؑ=_DԬt{MI& @e{\wDƀtD./cf^awm6,Zj;ϓnkU@aT D۶織J"jgH"8)>+缊HćS4t} 1M-J4 F-/sTQ<3ynB8&g'LDDo~>?[n;mn5mo^Qp}_o~,isRqsO-DԸPp&#BK#F4#:D hd "VB;[!UI̝oQ !\"^/( = Sg​n|ryx^_]]mfgf^Vm؜A$AN/XB=UYa H6"21wxPl_c҂d:~)%csN<4M̩b.`#TlS$iDdC !i{? 40S k)NX `Q qh:vTr^UB8}/>{ /w1c9ő%b棣3FD0 L/aHסۄxg?cųO8Cۿr^簏b*sNl؆=;D-9KreȮLk>Ll՘`Tr6CE7hDK ;6;ɲ4%Rq=d_D 1}[)/TՔs۴jDJ0 x-YVEŶ6+'7~?~G%眢_?PӸ]=vO?+6}InN6RM2>x$Dvl?wQ)V9B H.6GDBۯ9SsNM]^^u]Wrʥs"4!cfV3޴{tگn"{BgJ2yw"2i؊+_V$ m!~emd,EvM5:,S^ R{`ZT3nn%zqq^rIf~e6+ceN\TJ56ob8(D^J2yD,1Z Bfo"'U9DNmsNǫn7Ms߯bE$i>y&v,D WWx94#se? V.ONRLD|yyQJQZq@ݕc*̔S)RtM5[)9t_ks'J JA)1888 wrƷ~{>eDrAQHI։X-Ucwkoݼ^R?؇0McJV4Mir)Xyf}( ܢ"5A"w>bwR5=04HLu-dPՕPnƒPcay5䝷K0gM_hSW$Hj.ڈ h҇Rm-EOUC3`H\J R`ק@2Kl`8]9ہGb{?>:{%^>o_Za@hHNvw//:֔ny뎘yӰZ*2-ˈ=FvTSG )U{vs٭煡7)͢B>4M1 )F"RJMRRǴ҄rhBvr7' 9]r$V 7'LMU"EdhK5 atL/GhD:]_dde-*to;<#4M5#v~`f<Ϫ.@6PsXk6i"<"Il'>Xl-`k|.p)R4Z˄٢X^oTOfW+Uar< M)YTd'&gszQcZ}M) vuܯW/eTg-9?o~R4%/E ')bㄘ$88888;ECbn4䱺 "btƠ YV_T(lP;k)]ؚѬE dl"5HՎs)S`d3}l%˓{o6~sr;>>Ӵd"%O/ /zoxwKI)WGD[ٞd2G SqGukq{GTezvjsR *,C)ƙxJ1E璙~N#6oM㓜J\kUaؿkDDA$|4@ljEE1OMI•DqIf:-m%vo@0yFIUعqVs)z^ur3UزczCj&6ybH&JuPH 8UKΊ}ׅ&41CW&e#hB\)YTRN9i cfnw82)N"!r8O1\)'{Pim/؇6Rx]K2MH|oxK 4a+%s99%Ŝc4suOJT|'%=U$7'7VWo)]?J[&b[D).u޶άC ⫫ˣcvncɥi],{@rB,ƤeDRRjDDDڶ)%s"b.6=Jnm),ֱKq$3A`lCKxU`,*Ƹ&bIuqR[l|M1e_s.qsιm[Cn)g- DdQReK8֫g)xCES_vj287ZD g,let8Uw^R`q DT})`3k񵃳cbLdrVni\jTp@9W`DU6Sty3;+3ˍmK9;[򺃊d"hdH @pRq̶%*(d3h:psmK6scgsf\r["룯)eSffy6ޚ9^L۫*mWGHzsƸۧP 7?O[Q<ۜ~Es)e)vbмQJJy=dIvUET!9SGD>~w,E{q|hs9E[\hv5O˓|fa옙)ltuuZuq{G@ن_uywFrũIt*9"2MB%7rIe,oOb5RZҕƏW2͑ۦ1"b߯, si߶ hŀā)io@dD"!P\u@M-/1:DFmkyوYlj! MhbLXڶxD ;61{޿nߺ %k,򡛧b/%ca prttDD>Z8 &F={Kwh6_\NUx+yPhA$i|)J]v4͗6] t#yyyTBM=[c2ac4'~uðwmȊ+$Gv-ZI[ -_.{L!J*ƝhD`@H3[E\48zzrBc!\^^"3#Hei'$4+KSa42wiŋ8כ4Os!QU\{Q9m>D̪1JTEsSu\puD쎛sB&4RDDiRUR|iiܬ}WWW<)8>4oKnn\{01{+@  #Ȗ4Ԁ8q[øK>4 5DT^>6NdÃDJ׵}OTrV"cB9 a R?XRZC#[WbPLK}"e.eR E}.qO8x>z_L#˗as!}~q]STPH!/A\h`3Qwzvvvq֣M]}(Eai-ЏբDEkd1,V覞-б2gVD&ŮÛRI)msfi @C%9K. 9H!4~?M#ǘ8cs4QbQUv>{L><"%$~)Wi>n^8qط>$QZ_n~YZ2.NgD4ف)Lja<۟ɥL\8 +qهmdCccJ)"*>-R DS)sBez$B !dkI+2P2.k`&-*Ÿ@D;1o$MO)?''zD M?W/FG8LOMڎ](RIݽ |xYBh<_Qؚ卂Jص*Y+k "!hKCĜ%Gw9;7!)m?siS)ǫ]?EvL}jBtZ[^d)yD%c{F~Sќs4"0McJV#WjTW&/[0.C-q5hRydA;X`_T ;g|)%"" 1Pr9MT}k@<=;LS"WDTɵMiGEdv>6%DZJIPrvM/jTk @UЭVGgyMӴZqNGa@!baZK$o+=,"ӘRTXTJi[3Q\SVCTɞإ8eJ*.ɚm6M/؉^D-s1[΁JTZX`nZ"> %8ddLjص"mA @TkLDɄbFD4ADUl61i<眲)]E@"1m٩%Rû0N1;|hn~wW_U-目7=koGn={xCl?уM㶚hCڄBб%#s]מNSׯ߸__͊mG1s1nGGvhSC}r7[sv[lBC޲U)ZPSM\<,Hd%8R"UV94!jc#g)e Chb{^K(HD x!h҄v]6]ZBիk]iݾEJF`"-%PS`9N&D9Ch =5INo F)Qc' C6Asd:R2X3hpL)R_)RZ}R鸳]zPM 9[9fYDRs;mܱ-v)/EssYVRjlpׂHf6YZJ{zT\LF >n qږc#hmx @PU&D5=b14Mbt9ȚȐ0Mv cP\)EfWr6Qa <;Ӣ کƘ$Up?*!"[E@e9JN4_|4c2{o]xi5b*E}pw_ o OB{~|sZD3DMR}ؘT/ Y=gœli3Cva[H%.,.W"כؒ3DΘBLX(EROTJ Y}.8ff)7ls14!b)SmqmU⦅9uU9av|nmhqo/;K~KJoB˿8Wu3b`YR}CWU&~wr|mDMM{Bk]KJTcd<\A0sm u;":fas2*?FpZ__˃S| vN1|o/~CU|ʿo-;"r;,`M!ٟTk U!DC!˷OpFjMtꃩjtJXS "B9EGVU/݀M`kuRQGܨ< ZZ1!|47x&wlI[%*ZֵN"R8Ř}_ 4iõ0⏁4*bh9pZjUVۺ:СI"of@H4ϭ33s0baĮOk<q_,K) `HffP chץR|jOwOj}%}o`Y_R$A `ZMDyTO!0ֲ,.*lqF/c Di#`@YTijmiKE6t^30t*e5s һKjYb_[=߿BJ7y2f1F$C#4M`Z0f1yzZSLя.8\"‘2S)F@!msh;|qɊH)C`x}Ko fIK%2Qm8rLo[6RS\Bpeʔs)/TMD8b!{|W[ĊμUt:i)L{j52;4ou¯y+$8D0]术n_W|(f\j)ՕO6>D-es1iy/< <2YCDjX֧:cps;;KKSw'n `iC$_rJr4{b(p>={Zti6% =`yڇHT0%5b ήi:!ᰛ9c(qo"R:o@L4́v]ySJޡ+m^jueCaW)e9#pBۉ<TTLz[K`biڗ_?W>]Nwe9{tѯQ|vt3Gb!9!=mGyi),u9g/FxeUKAMTzyY'AqIƦ.oFп)G2H1{\ꓥe]|oL'8IL`%"/uZmfZэbOw"iu#[k<݄QMr^B:wx4MZZk[ TurU~,Rp242 "7SSVacz+ C>;N4{UiKbě+Ih= WxY0KYJmXʊ' ;A =}fQ N_lT(63% fB<[iiQH)qRCC٥M;ۀKD JbƜEVO ra%Kst˗g)U-u5U)MBZG.9.k͍S4u +okɃ Etϧy)N5 f1(.b\ o?G{WMWyާ<4]>.89⿑FUjY^?_vyV: #@-ɓis-<;栢)g0D @̮Ez;2Ϊ2!`ݎ7Lnu MߎFD3W_4F~`ы T{eN<PK!,ta"48/ !7jJmd㲖ZJ5Ĩy y]V[1Tk 1nRATa$/󗄘k9ײrWkс@zuɾ@C1O1My*euq؆H0ٍnICN#;}%D(v.~d_x. ̢Qqy1+9䭹<һڲƫW體nUo~G[8CI{?cjy&wx_(W.FræA ӁՆH9̌4 g /qRԾ h#d"J)D3spr MM@Lzk۸`s HD)ֺq޺V[q&goyF)DJWt5PJo =*Dq7BB|LN,H0i]kkuwyv H!2$^^z~օPޠHYE) S1x䲈9(00{4b)RƮUŤ'3wt>]34BA%bqED3p 2GOށ.TKMip t[s{|fhF0h-lPo~R[ڳ) ϤS4U>Z[!&ͬ־[S<(&)6xJJ8N1mpi!8z=D9 kr!T1 oa;L5U?}?|ֺ^o㜡Z 1sH`ֻlS Eb ݞ ]EzoJG2=XoS~&J*"?ϧFdEm 9'{xZ簻0  c9}?{Uo4=+UOy8 E*< i aWH[b \Y\ɉ{+&fJ7ۻL7ziݤJ|¡ `j1H^}Oə)M˲ 2A 73NjRؠac!9ߏm#WZA)%9j}o ,q1Ͼm\'JfɧG%$EsmMz7nW\}dcz}w7܎r'?tu91g9N3!Q|E[+31|ETS"Qsmꦊ痩8܁q^DjSJwYUG m_"ldWTǝÎ xQFQƷgn^DpF뛈l 6̭^# BTgjCDL9{ţ1= P1c-L/&1w"B!}EfƍhfRz1!; Ʋ\Ju]H*]z'w2Ƨ@Rr>~_~~ov8o&j*Hc@ZۛHDD6 VN;deM05v9D䫮[.%%Ru]s"ao1'. |o IU?~pȦwly5/(x: "$$2Q b"3AsnY3Rv*}޼`,{R΃,! d")(q /{@*szUi"EUhqS23&N),c5Քg">ODcfn_ZׅC0S$5V98ԲC(}&!%[ Ns2<ρhyrd#VG"иacryjf3;ͬ'߿{-j=SG@eV'>[kskHjQ >Pkf$HʽKue1T$穔Қ7?ƎwG]`xi^/ّzc"DvT "d`^cFWԻ\<>Rq#q"HiM\i> IQ*1#Z`x uQOTE!K˲Tx>y͂<1ɻr?^&yIR{),ڻH^A:<_?~+f­{_y)_pV!AIUc :sNʭuI>~IZҥt>"DmD @\G6vḒib{"|:͓rļ,kB$[2Ŕ\#ٲ,1F/L O!&Sw$~&:! I^MyRsԠB-sb.sC(RDȓ9)yٴFH↴ D9Ig\W; @)%_NV0x"<\[! 7r!+yɔ+5CV~ͭusqەR[jujm_<;J3nzW9.ݣFk1eEԸhjU0s^ym1j_k赶B-ę؃l˭¢*&*Iy#G/aA@ngǘlԮi|є^B\9$5 .p?&3nm >S|S6cs"`V֛?<)lmdQE5Qq*/} lq.eԌ8ު"iQDݖx *ctgAe#!l`$Gɑw<9ļOO>*4RtjVVywwWXk 5.^hc)f.9v)EmwΧBzk$ 3 zX[+Z޼ar)cȮ/#>QQ,T\벜Փ<C#׺/Zޣ8C )g81qr}}efa]}]9c`!FcABPU) lÐ[bS v_E1:۫_reQ3ja'}fzo1e"Ru7ʈtk0ư;\莄&b&x Q`3 j1$%L9<ɖ_b)/º5Fyͻ>o +az!*),֗eI)fv}#wLM%C'5[SmOyW׵ b90ʺĔT:s`ni3{еLS~τîG<"2mTH6"Kʁa={[W3h<___!3a~V0Q6 ò:.)\h@<qRg%,v,>c)Oy6SJw1!@d7E}43jMӤ <.ZqA CL.)R׿߆1joC +Smb<Ҵ 13ǐ% /^|rSL[VL_A1ޕ(y[k_߉<~0M4n:.˲vv *]N9B2PB=3z?NS|6'BlRZJѵCN !+%O='$Sj)GyP?NwM1Faa # DmSW spG./X w쌍d`W~Qm>Sq8J)LR|>" 5"eY|s”ͳO|> aۉ 1io]T""JқҲVJ%”HWӜ22MS(eE)gQYs~[Bn.Vڥ)hys iH5f NE h弊HX'9󧯟B<!ƔC!$8DpKcgqI!|^{oL)!QJ)iUT%0cVד.j*] geZmE-{B f%'a`D>"dž?17somZs0"Zֈȗݰtգt͘|b,ZV[urOF(ҙ|lve$@ } ۀ s)6ܿإ\Hba^6{c콩Jk=fcR"RG["BVa270'f qrQ) jKʓREZ\Qj9bF—/_lսs'(>s1L9;onQ%Ors{v"ǭaB$|[.g ZV@ 18$""\s6i$Ȝc޿eY8oMtxd ""NƵr?Zְ58]t: 6O0! PP`=2\vzI]Ա }qJEϮFʥat{_H{wv*7Q뽇 ԊHT0ZV!@T糖b)%wuHmv]I(0O3"@Dwu1ys[]kA"oP!$P;3{~h?xc>|i͛u9lܒ;npub/bd1J)Ĕ"C ۲ 'CJ1jYK&qh)%LEZj)@4( 5QD}4[9DT!٨sH3F#nS "ȿrD!luUV_=͆`H/Fƙ>H$Ԅ!F#aVД Q@zH1E~!b _6:е_jr.E|xnoQq2c- }.=S.VS]Kp9s'6"էEp3eLX+Rfs\HH0V4#`U/ϥ1g5=޽}ͣ_gg]Ŕ9_4lf1M7' /$wϭj6Mqpo>}3tqxfkm8km777ә [>BBTdl }ga y.iJ~ P! NĪ,^o(އ{FB@lV *jH@6XtIbC||%0! 88s]DPC*B:i6h ר'D )EOc`.L0&M3aiY.D]*P0UiUUO?ᱞBW?}azu]z+|^{YSV?x9<%$ bw4#Bc%&>N ̖[J73-TG04[zO2{=",!T{;g4F "PJqsCRe)CTQgO9Z9* X*<T^R0SDMHIJK8S)%3!n q1;KKK @{'  8rM81e390TQefTkQA]D*/0QNsTմn )'`Z(2GUq4$fxp`)e7p<Em7rnrJiVײl_y0*W ˗)_WɂyL~,!8ʁ#xY! ]R@t:iͥyΣZȼa"%$׸wH  SZ0`B_N1j1zqf^2w1Re\olڇgFrj)BJ]3j.^j1H: 09 {`-QU dw/-RiN2mtb#p8)|>b?f{i/]}6/\"po~cGՍ.ҵުj)IZYwuLZֳIJbPS.#woŜŔS2S /7k{5Qef,[CgR"U#LS(pӰH_`nuRdO\Dy!0 DzZwm8&+ZK"B&sZ+!$Nĩ#60Sc-:+}T3O>Zyޅޚ!rhdR *odK1pO `t #T-il4@DfZkdz;jUfF7~f`>*5p\וCh1 ֲr`/!ƘS[XmӼ}]׵Ny7) `o_ }KEcηn{tH@ЋꁘEıSò1C 0{p`@L%~j2H_4. QԬ2O3r .!zq7ۡl[8k10{a~UňS'4hgNo-UP3qڈfF ܀@Dāa]qMQIM[rz:s!s8,aK+"!!1VOPm`FXXl]w .N7{Q &X C-B4AD LL2\.yYNKcCH)߽w.yT2!щ8͇F$iO+S8~u,벿dD)e\ar)՛?w"qU|>FӔ{)2,1 ȧAn~25Y !Jr6/WwL@mEǡ% !ʋaH/_Hp>a-=ra1v"wjt4ljLѡFf]#I%Bzkjv%ZMw!j^Uz ]VHJIwgD֒R Z ˲Jr{o}p~R+ ] /'k7V[]_?l9e0A]I+'iFvcܶqc)ǔ3{̬Yp^J. }@8A'0#d#!3OӿȬzQ<G1]T\"1/'նRU ryyv[^+T;/T2fErvч\!M1O˫BPyuY}I&9uYUSo.#DScf FQ9N9óhjmCL̻n]"0Z,1jV rc|^WI qfHH bfҀOlo]v|2 +4nWSw<[j@*geR꽇f9O" LDzcd=ZQСSW&D b a~kS]5bZו))B8^ךe>O!Uj Է&(:6pVj-e]S |:\@W9hWO1EC$Dd2b+ [@I\@"q&/zoDثTCPZ ! jzsnbtbk͍"iʵr~GbM1R/nnnZk!u9 wl68o Ps;s/'\Rat;u8~;z>Jof1Jȣ f"BdvZ V1G!0Tk婷>T*q2PڜAeo,R ! 11;\"q>w">֗v& &cl+a19o4iNqJ#WX>a7&q90OVA ږby!D"ttRJm 鞧:H.sv,vn6At$dC๩ZyY<_1 (S"))_ `)=amVxO:1!i"8AkԺETIc"Bz?a|u8Q/[J)8MֳտԥS\i4,(ODW:"1Bބ(~f΄(>q`ܖdZ=@]6Cq".y/DfreDo>9fZ} ማ~<z]k9;HɝÌ i9{ނJVEz5.7x>պ^NN]Uz>Ƽ%˜@ޥ71)y~E8R/؆[w]hlïM aϸv "mn3C)hPˁbС9V10̟ L.lks}?x:} @D)yDEB1%&ZK#x'a)gihi4G83|8쯯C _o<B(}eϞ.)ǡ^[]Mo[lo݋O?bFJrڤ7~2M^i "~cZFN"v6#zlhWo_O63! }#\KL !ܣs x G[l^^< &:c֧ivfUDv%:10ib*bJ "q0.pyߙp7t?y?]w"-VyAֲޝp)9ZWќsNُ겮0j>`M)!ֵezSdZ9`LD;ҥe=2R[H.qR4ye9<oaMfH px]fl:b[JpW&b8eL游ƟR7a&V} Tkn7[ki],q˚XuoXEE"Jw7+p50nVV~:cWk> )]͍Zc+?byixe2K9e;GaVZ%!@Rx[1"##݇O?ʊ[kWOSYֻ =H)ĘOgizҕkR] hk=im~?``VK]z>k!&:^}]je&Xks X>!8@d o3eJ ..rء¶[:t/!=񍖗R9|4+ٴB>5=roDxg`]B`ㅊ3st#"Y~"u[}UW/>ً<ŏ/vqJe9Jʺ;LC뺶sJ4Xfǯҙ/g8r3<l/ "`mg,}B C󝐧蛘F#bh/љH]xDa;z%0\؎}]Z1 a̬t ==hP,u"7j=3u\oHkώ'u)㣔s-CiM~βr0Wv\񲞖 TU37'fJ)Zk4Msom- Aɹ" U6X=A#\:i "i&g?y DLէ"Z!.bWR!?L{w"aP;d}dDI^ u".6+-ػy|p ӏ]<ڐxtQ4051maFJH@z?:Edu6K"X{kmRw$ c+G5ݲzpSQ`Bsr4<xȷq$qr[?ͣ}/Oλ`Yo'?l(HUҥ5魮zzt8._><~|h)!d8P"CJrNSmu圉POMֺp88cdyBb@fc^QBNk\sA\#7k)KVVbk}\iEN`CH !p3^pQDc`jRĘ\6i@!HSp"&3y=sſ/_چ[/?Yzf61*ţ~`-"pBRwN1i:\{P݋ǻy>sWt e<C&Qw<6i)?CZWp%o#,a&t[Jf nPƯ_wm&L.sWym UwOOi~?qrާ']0|54TUZhu2 \6i۹U^K9aC pK)r~j\IB'磪u?]\Ȋy°eIBW~o2ZӔ8&]\:"De%2T||,ҥ'M{/kADRFZΖ9ig?7F螛14zSjo׵sRҽAS#7آ[)|O>{l "~՗P̓Hi/0tts{R9Olp4/?7&c{"OSSVZm7[0O-3Ɖ {chݗtI}G뇿hP9L&1G",y{o9O<{n`pwmiMZցe]!cL0nֽ!1Zt&ff#$DXו'!"5Q?)rD/+X|GD)O1Ċuftb0} *  )F$ywM>TW=K,i7>Oh%&֚y^3F!w㫲 ȻCxVK~4 Rl@x²,VU3K)ȣf_K˚sxUd 9S^vŖf,u~71i9[zW ~sE̺!@]]$1 ZD)b9/41SzȩԵյ5߮p{mzWVzS777ZK-lsD֛{z:zo!0Nar\ÈĮbm &#1\|Pď!uK_7[T͏0c%;qK@Eյ!86UPj5۶d& vy^vm]KN͗)ٔUMuCz CiUz߰"p:7iStﵷVo~L#h}MVv#Y!~~qwFJ6ӫRҥ7'H)5DЦyicvLi//31H&G 6w//7ѣ݃ܥ }?_rc|r"QA+(䒤8*r)%UgDGs.XG@3`~T+RPWmDUIpHUhEkiW=ʄAM`=!A"/zo"cCrς5yF15$$h.)˗/[B77C魵=7U;7~rQwW慽<q00ĥs-uSgϾxu~:]N D{-_|?Ze=4 @JLӴ+vtF[֔S-g܀ࢗ.eyj;.ADUD$)0Oks&꡷8p'D$C72຅m[-0KyG8^x:V;]QkE"U;#ܠQUM9e礎,[EEc sݭ .tߚ5]4ΕC޽UD?}ȥeIq>&3xճv:yiB?73!gB$!i_;/anr[.~gWW7WWlb>2" X˹%ɇ^jwSebfFጎDzH:@F )u|ZCױӥ8{sce\㭆6͡S)F!C[j*H"E'T!BRXWWvSq'/pL8 NS)H H"Uux&1nكKn#ĶRʁqY @A8z>ֲG `q}=УEtmS/Tw}uf f KQͷDCC%#"Ht-yҬˌjoyPպLϧ<>K}Yu97DT= nTw lr:,^.}ZdR)DCӌDSM''Ss,?'ev?Ay>x-fT{+-QB|~9B Edw8FU,]wnm!F7(s9E y;&ZT͸r5 }lova+ *5,}@P$5 DD!D3_&鳔bkuG⁀h@6.@x4/8_@RԾ{~Fk# #>zcZb[T[Z 0@l"q`F$d<]54j2MX># Tk̄(1s!Lu뢪V CjеRms3ջCMN6@lpEJ47{؈v}jQvǙ|9whLSַVD 'Q#`' UEzTbmL@zC >zӔr`!XҚ Uk` 3ZB|>Xγ'Ի}9.5H0]ݤ/q|ky˗c]R b D.Hāj#=N;)N!qL);)bBfO;+٧/?ߺyO~|E&S8D.zD*-D$ܘݥf{|=nɉh66L~ m䛱QAaD)BJȃ)o!;?E)ImO {*=^{LE [ Bu%jf [@B|ywm]◓PFlwLsE8 [xA s,k11/ٜQQ(B_:}*Vs`LGzZ{ӝ61z~,[QVUt-io ~Ő>;fh+4nCZrߎ/~bc2@o6XQWd{;\һfa9ts8'"EԙEi3"18hp|P*z扈pffC."d 3J3s"Rf("Z,$]Dtu15(S$R |ZwxtxB`c$1=s.K%Ѩ nooCxXZG8S2M9r1쇟}~S[o?Cd/O 6χg绗m"ќquUC"csj~I^ 0'v1!znYʊH,%8*j1EWUW{niHCtAb1۶05%pf{m܈^90!PlCh5tpὬrhγ}AA0fP30#ZoS8 b \ y̜b,*[e8p-rKՅ=4TJp_3[,voN4|0_|Wǻ/>nޮbFʓsSg4D ~UxRP-!^vd#,ەy.n3W,yY 5Rt9%1twa'7 z,DM/'v;J1Ϫr^WR ;0MS)e9ݕ=ߞg1Ar"$˻??|pzor]B!1kf0n7߿~W__O>/>gJ)E![tp8UKl5"hʙCܺֈK3'Vb:[B Ns)I71hMDu7. mI;0cdćq6bJ1 un͙-jC7Ъe&ܻ:n]{Zߢ9DuD8ǞC9s6akw3 1i7,5Lu]N㫼?z)OiJ{?|﫭twOӗ7^nR<չ=,%w1OäKUzwDmij̤J)ID뺞M0D e/eljCJ ۘnS~6r(`䎓DQ#Ȫ})+zZ9A`sx0O-:mod"7U ״ p(fU!^58]|>=ߟ|RFCQmy@XU˃a->Ƣ\ix6䜙Rʾwfof2=`*ҙ8d1HUFXUw{2j#/ؑL"^ԷV}C*72!0xؽL۪H=65C`xCLdQTԐ>j LSL&[&0:fa"Ze-m4W9 B5(l0dVL9杏Z[s ?EF1J-Rx[!wgx+_?y_ޒyWd|C݉J<:ކ㚽w&bHK1֡{{wvFqiYrܻcqDiPYkuiXCd{mGzB޸2]@ć$*#a͐NLkYEf̈XI1&5NJ#@-*ZbA8ztt-RWlRLҺS [IS%oTN<+XKkUG17L@o}Χq=ݽG.Oô;ۿu>zӃ'w?}'{tu &{KaYbZm oI/ZΧu]no䣜c>n((i见g0nW$?}/G 1 Mݔio6D նQƪߴ 8\tL7N޶ *݆eV : 9~x31Z|' ٸUp X /H]"V8xbLCٴEdS馵6bkVc^#nƂRHT0JyN'S˱j]X/޼|ZS _||o/O}]*QxWOnR)xA:z[B b.SCpq? IoD#;:D$& @.[XK󹼩n3SQ"\@p4/p̘տnr?"2m&O3hۈG|pZa[w C;{p[H*G"yJA-'ۤ詨-C=haK&0۞kLj<>~3if/xѷvwuD-?w/>y|v׷`R"KBH*ftփ7Xmlpz+?|fR/|VK;1%&Z q {}DuXNoY-/0J_8``)j*>Adk5P "t!T V /*cD5`VQ[0BS(ZG0#3# yg`kg6PR. CJ2`LmzQZ%BQuwz1Abb:P[D`8v^ey2'7BiwK)g/; <~U []O/rzgp_z;!HZW[f^&׆"yOSEƔRT"gfZ[u30!MTy{ґ&CEtf@տ1oSc.>_v37* ~y\Ĉ`K2-e2.`&uVc#'@<E9ZR\_j-UÜu!Eĉو0qbKd&Pk%ϵr΢`Oǻ>vׯ]w?z-r_=/\?W$e=|t<Ӧܒ0PSk j&JĹC 1$dƫkU)ʄ@Le]U]{S?^_5vyzǧy@ d&"(,fB 3$#10Ьo}Abmf42"|ta&{u['IWQ YOӄf1ν΅!8p _=+ ] s1Z 5&f0lyEX))r>>41BD"JemAkGXӴFNԂb0FFm`ZzV+ "ƆUׯۿuKw|?)ѓuɧ~g *%4it`f/6^JՄ7FH|Dt|:; [k[@D4u/H8390heu A0譹G#G:d"ս ނxK]J+"5.u/'7xhYK1WY[Ħ)HLo6QKzY8Ĕw"b9<nn~c]/<ӟ.G?yHョ7Bh~=zk=x8^x`ʤLbVQD)A"ő xAϾ{p(ǻBK5x8WDV*fZ qY` ,h"KME G9`.6A``)^ f>#3"rF1;y=\B( "rvW4H_{6!rn_W_8L rz]ϯӟ|ssɋ_zr|z_IAv|ݒ]y.8\f0Ǜ-OEh%ݡ]=Z(b @&<{/3g{ [@1;֚}i)%kMJB]U1 ,2QozbPӛm*tHL,{ J<T" "D"sSR|o.6Y1C^Wͺ!H*YzQC){> s/"D͟kzӴ1&sÏa5e9yc+=>6PKpB2ԈR8y Z̬}Dcbu=֨(JaNm._xc9%"(϶Hf19B."ĜrUUW7ΉR I[콈_F; 0KN1fޜzO?k[vkkۺ:8xJM׶6H4^Y|C3FLQUafkLAAEQJSJbə!RZuV g qΓ1L4r4UG5""g56Fafa?Lh22it:5 +4NĈ-!rQ%#OB C1>^!Y1UUh4Κ~H%53t]% E,7T+Vyv/<Oj"fjumϷΥh4ݺsN:q<;|G/mmmlsYcwZ)EѣjAseQpZmÚ ^jMֶM_E.kG!\/9;U&cMg=HrЮ_5%#Fb#P]Hy Qg6XוU-K&¢, H7㽑At7s`֌K[> 4NAChD@RnlCGG[cHbJZI)jgC$c8BF͘r&CX)Ec"1䘲)u{RkACdNx5hÀbwAKbgG_Olvduum4Ãm_"Uy8Kb%hڔX\!:BL1Yk6Fݥ+َ96U(P )ŦGYU5m4dRJJC1X{J1I@kwNzbu%g1Xzyn2!1dE-)% b"RnI$T: 5dB@rJ)%LI" eQt]sЂC$h`v%U~ɳDLfZCDxv|>\|{'_C7hz_xDP(cfk#qcc[wPՖ>z P^eih%Ƥ9sB6ygb+Gqw'GmrZxzm^K҇Al={PO )=+rOij )h#E0=ssd9wV D;DX(Z 6u]MKޔeRvN3t4QS QHZRt-@P}Y/h^:)ӓZ)]۔XDʲ8ٲx ,HjD1&1#l}`F4֘xdh_YڜZgl"2UmOg⬨H$'TTc[d~bIh71.ώ's7r l6գW/NukkN=Z ) 9eDcEN)M)do uEλS,UiFP/ע3x盰XMf("^>|]U:;^zw__+|=}dMUh)vDCX_4=.5VrJx;ۤ#,Z;kKq 3{{vgMzvN>ױ5]7,IχkG}/4b< Y^P,L!έV=qZ(JXtP{kkZoj[0݅@4" HΉ!F9']D~4Ue c ~ՓBt:+bJz1hMDd.1Zbф U]f " HSD}!")e"1iWƜȺXhbO|ܜXEt뉿f;,CώB3of'tggbTOm]c+,{_x~'dheeӻO5# _9D3R?u5 3"Zc>,ƀ1 a/"*Ox5@]:wm>{ܴm:FsbjD@dJ}Dz_j 6Zctq9+o! rN/?Xl^#ҘMX|~PB`ƹ\yWB^M7qf @3?f'D;{Dڞj]{N?]d;ݓ6t]Q(5ǔ3F?~7%P.NVnͫyL@GzBD^< }ܞ4Bh{'@*@D4mv>驈G#<۾7H59OcQ8Z;VC{A%96" 0a= "2'F3!t{JP-"5IU1tƸ̜yU5DP^8 YEeumvIzVgmY'"F)3;W&o?ykt4]Γm,d楛++>lZW,4_[y$b׆nf~r8;=Ysv8=jOʍzX1k Y߽˕ ] 믽Ԭ`ycνxk[ׇW'zې˙bQ3clQK㺮2ŢQ6ᜍ1¼CLW*kFrUU<YaH)5>1Nuxz<)m(1au81TuŒuѵ d1cYEYS:u]6D7D/W~{MSEBot<~[[۹Xe5*Fwa~vdVlxI#Xi3?5/^+RY&1卨:L&0u9'c^ۀUiDDQr֚?U$;RVe}vYΚT)UHv8T s?ÙL{@Y@mX[p0H3,D2鿵== bʜsh~kM?{e 鯈;ACHY@ԟ$ 3S_\ԕ/2k*sn^Z"u]ά}p4QJUUc$]eDJ)X-Xg,Eq4?h]deYiՕxo}"r|zuiJD*ʂrНR`2'2D4 )dV0n1_+bL-'&ZFx{/~ƥBX]#sfgwvydmK`}`ӣ2mY BלOJ_\x@3d2'턴ƒADƐBAOvqP 1EDED8zg.{?=Xċ1&&]G ""IC,yH"sHdK jCB2nRPzQy<򥯘uc@`Y15KTؖEݗ@I=Һ>QL)!zic4N , {uOw΅1V+e\aʰYiO@ZkVx*Fl lp5X!4-Fu0>5(F _h*l6JB̫Wz6Ò'h f"쵛0k,h)|%Dc, CV+,ZYgc!3Zg,ϝgNwY @pA[W?"њ :tB֡ˢX&c[k0ڮ뺶3UUzK'!ld9iyÿv`ÄqFJ_Ĕb]XYT,?=?wx1]M_G|S5n 43,̳LSUU,Ӝ;"$̒9YWr7(Ct)"3;g9gȐ2"0М:)#~v9[zC%Iex5sד19]d9w*6CDYeQV$!*IB^)[@Km ER1fډŢѼU&|,i@]Ч d Y`83*{ 3=aXu])(<jkoTj]肵&N }bK!rpi~wkg`!CeQ4W׃m)Ӵx2, .vv2;= ]lUs\=/'7]c욮fvxvz:z㹵mOv*_ `gs"*7糳lpqRsWEa׷/ɻ7''BC(ӳm˲VI:Μs^,miBxs*އQ,uUC_!p TM0Ծ1^gARBœn uޟ+Y*DH @12L+Ƥ5_ (Jë9qo>D@b\ ;DIJ( g,J4MIETXEAsO5(EZ.l,9gaEnU֚i{7AN_>{howLݷ8;^̎(R3Ǻ)'ΖXk59gi5㮛|NG!խ dm<]gs8;xvD6YMVʠ%1vӃvvZ}Uv<0WQ9W6= ӧk. AB=Y  cHsa/Ajtquf4!MoC}H8P'_z%yZn kf}DD'r,2Ff^E&f18g{21"'x^D2I`Ta2>4(X,!tC$!t%9g\,\Za߿*C9g t!؍ztdbe%dQ9sfL̽7X3TEY bnqvv7]Bѧ;W/۫Xw nnl^,XJ6!,u]hsH{Fiq֯n~FWz޵^i糃6]ǫ_c k?O>Q1ԶzoY,͢ZYcte )@2TUmWN%œ1F2];S^'$nb}7Ã|ˣg%RU*EB`]}W]f{_|une|5Y+ӵr4qEm#c+Bn9?nQ(bAD&4?=Mgr7D]PO.xR6{ʴMSd,XW:YΙ"Y=6 BY?c~??RCG+©| *z-e_DC^% :{'SE͉Hm)2 EQXCj2Զm}u(&λkb>n!(_@ŒtEܷ'daN2rz69Mjs97)#)Ѩ>;˾RT} R}Px<::>vEviڦ|h>`m.9/Aj_{rNmA qn(9qlR*u]Ykcf{E[[oHQU^}xͲj$MKKeJi$eeUuٵ!ƨXuL1C3 $xR\^D#X c:Xu|-16g U}P,mH8<9Ť 1G}ziȐ6J̬Ae2wL"!_GZe~Cʼ纾PR)Fuׅ_0*2C!-YXCʢ#CtmByosm"^/MۦՑ8.߸M᫧_tom](GSK2օt?~ڕ7bDd$hE0켽qmVg{8:?^Y:u~e}(+\+[KTtCcKDC:9x1?;?t]gqϴPJ) JvZN«>P3Lϩ;T5Q6 ;۸~vWK+ko-f@3rn܀u7 T;A`dK0#Yҥ 9L\gPhwQŔX)` 8cS6ecoKM{>Ӡo#:K2!#L[+Q 7h'"{uAAn]ĘBGI A1"91;N)x_*X7d4 ". Ѩ1MSeHtmK1#h4b < 5 PHtb\c*Ѿk;gd<ѝ8g')EZ="xpѵrU]í +ߤ&X_ۗng/}'`gOc׵PLIڤqQږ8~B0tmZfPcR}@< 5rBŬ&:8Sj+SrrEQ4 m^ P$$!a&cw ȠJS^JQò WFrɞJtǐnXN)E)ˑх)Fl9=sBN)VU%)'=9uUQ۶C{S6"; ǜ_TMVvIR8xx=ٺxseukhu޳r:?|5|ۡ!!K0M_}$8;{|ӟՍݫk[V7:ˈY8/z~^Spbwv8;Zn+YzE ʖ9" ) X8ưw6l uS?ڶ- Q>\}@>˜uu=\.szHAi!N"EDTS+Ɖ4$kţԖQݵaE:[o[~D#QT$g3wJMdU֟YT8!9w9C-@D 稕4"3Uu͜ɠunƘdĜ"g I |aB$w}MVU jY!ƑC R)8ʲRcdQ(Zq@Z/ECH,@δJIU]V1Ę^49sfi1W건ΑAES44!lvvWu)v8Yߑٽ  (;v4m9]̈ ӵ"kDՍ}ǜ9']׉VWv< &XEYm۪&'E7?×=߽|_1sDeq깃1f<W ԶmW/=9|Jxsk;W7/we᜺fDz{/=m~mPV6.^]8Ɉ>u][b o6.t]dTTC A¬AIƜNʲH1i()gc)eL1 gͳ O3S1dpII5)^o8O~s"Bݮp}xuWOӵ՝~hj47v/=Ń_|xT")1`Jd _S=GλR)rm"f'㭋48tUY, O1!aQD_8k82>% i9Êzu}"E8w+"!FL1T39guJ"ȹ]s'1\~Q.y*7ZJ0=aapa$UTaD6cP.!k2 *+56ŅR2Y/yR hV,2E}"Fxw]}JJkmv{|9RD9)w>礢ZkIrWkۦ(Z" !y稧Ab jRjϙf09kǧ/_sLOE}6  EO4֋NЎ7ww9]Y-Y5+oGkߞ_KZݾڭjf9됄c1,wu Lѣ0¡!]jĘ5I)#.:rQvC,;P3# Ϡ&>j.a!|.d:֑[DDhI1s'0S4D)0*"SQks!FB0ƄrN9>XՍYz37ir5?t}Y_v6vLֶv.V6W'/bs)! $DPZK\'E>̎Ov~ҍB Aaaa>hмjuR"2Ub((zrV8o PIS1Md)Ƭ(CwGx>'2O~,gr I!TJ¯hF~;5T D,asz`΋B8kRpBKP1h@4UZVV5Hh Iʨ,OU|(} Bz1Ɩe^ǔTlS|s!L.'laָ1A,)Esf$(Jy8u%+;+VU'21~ƹJBc|qjvz6ss|khޕUsqUݴmuut6;7.O_=^;w6]F-bohΎ};^* 7?{z݋Փ5uZRW7{p66B4S$LRwm;(3c眙SN5M,aTPF7k%yNI@Y1):"԰_@H9+Db"B E:qchB>)9GD1f@D#Yt8s}38gC.EYIDR)9ڠ[(cZ3D]u)"Ym3tAB,<Ə/?{ oUU2 M_T;on_q_?3Km\,7W36~i jv+: w`jqvrx#l(@l`Q8%껯bk,f3 6E.s^'̐Rs&CxyPizYsaɌ'L9[4T P转=G4^e,ՠG=EXS$ ~O x;(Qw)3?z} z6Ykq 9HN8 "Ǹ!.&^\Z.{IEmhP{#E s"9ApA-l#2!(N?WDyĘSFBV mʲ YimNGX@͙u(Ƥ2cLjci]D[NNf'6vXs "Zo=k4r9?=|iseuov?_Vǣuf6\~ϟp}^{uhb5m[U:b#aHW;dbαOWNLFRV+ yY p%z*h)BaIuaPU~8c ֺ al u!H0 K"5|h(rNTzD,W"iR "t}͙G1"UY*{ZC!UDڣcB1Ymj:\۹Mӣ?zNaxD/ߞ꼾}qmB3?yzwŹˡ]sNX )̈}y2ZlON^jSu:: ]Bڶ [}(1huC$JlV Ac͐b 1pY:M%F VƩ)"!z!ZgSJƠ0ei !$ 8fxu5Dwg?nώ/}[0;x}!h{/~7SUNyy՗BWj,qք˫[K0djA]ױ$é"m"4]c9N~3tm7n &&yesX,Ȑ}9"SÒ=T+@9 !=N-co̝&6jtNHbJV1Yg (R8~#J(@:݀c#`9!4 c,!Yg$3g""^*,yg .HQ, 1t]Q,z0*'liڅs^)xκ*bU݋Es& wA,E/zzaqTV=88Iw}Ҡ9wo g_|ttX۽v>^5x_| .{'iXm9Rʙg@sN9k@ @dʅ3lm݋"38_h5H)@rJ:[ d-D )#H5~]J{.k)* PL!BDu]#bӠc"H)hAD/ Z1:Ը4 RIUTRk@]v%^}G_>~zW]t[X|wR n]ӕ뻗lkRrΈjc@RbYx']caIS1;zh2_r˹B(Q'q̄)2 VIמ", 9k1X0:9A:O} ZBBn22/eQ` W ?!>(by9̦B(N8L1m)T!lh8{QšX֯{ $:Vګ=$?@Hs!RPhKjwN2)yw;0B\4N` 64Xrr[UI‹@׵% hTBEQb:D1979 X2X5fv??=HJ'0`kE<98>?Gz?FoWJ?{·^\9?nk3_S''{%;ni=Z]:}띢tw~b|{?}sJ)ef1ִ'Lcѭo׶Hhu֦9elY: ^zن O? sk%KcH 1`}a\"ApCJ@25B '&F$WVD(še 9gYD"BSHuML?mTKk,bXmchĴE !0͜;*RMMwN]ojWsND8g1e/|?"rv؁zݪw](zmfvz2jO_>ޣZ!)h16Ա\}{֗]|{bvrrŅx%Ơv:uY2s"9aqH#MlU?Xg1B wG۶M)ɴ c-+ʓuOZ)xhhAir2H?+|]W14p6*%V:o&8̀Lч ҼR%eO%<3D hsbs(Ej=\EMdVU1/}8RsYc@1bRtUU:bcmrEe 1Q1*;mY[6yזx4]F>,E@#/8/~r[E5bv~vɓ/>|O^>ZX '?%R~VW&Y }C3zRLm۩)" o&!.DĠqBÔ_jvY$8yI# b&l EDTZ, F(WҬh%.S RZ)tAW"L,s]u="2Yg !20 n_7vll_ !2!F!?;/&^~gsjx_|:/Xg8OG{'^:*uZGh>oօ?!,Ms8sT$l6+@.BsZrVYq=!Ť'ᔘs'4g٧ Z3)ֵ]SFO̤ xRj7#YҧrNEYP%Ri1 \1f]KDazIEKshz2^=w5FV_ub>ۿg;nW6 UWt{v-T,x큳t<.R^=wl{W2KQ蚤/)jF5dt$DbXk^SD$ 3g%E9&gA,"03'klfl|liDo8D<U2#"+2\C>s $3gcK֞ <$OP/E* !u]MX4K\"F9K!T;5s$rT%w}_#d U"ɩY )MI?)ek1iڜ16ɒ1m;8#b @09gD,|ARb/ZPUBtж 圬S>s)ufTS3;nf'];GbQֈ ,wǛӟSEF(ʾ];z~⭝Ϊ[Y]Yk6ds;NwοusWCa_CsVxyxw]N)Vu9k B 8(5aAP4A|-V2QkHT@e"RLsCt6(lAPzQ4O5|DP33.tmNIGzdSS!4m]֚Z[U  Yu(< Ph1Ťm}SʋŢ*$)u9 眹iш9]Qj9Pk̙)VKMO89xG/~fm0ѫ/>y+X7g ?\ۺ)&ko}}oKF$ؼpcPb؝H97Tb"$2Ιd*]@ʒёCX'{KX۪0Jΐbғ`bQY!]ܱ57 \/鄳eDp{j$'rYzRgԁ"bLY,iڍu?HYTdLdSkx/C`)9h S^s$~~ .zmϹE2H9w9-n\NF-f.3ϐQU )"D&gF2"m cL ~l>;C(y2!cJw]m۱HYT:yi=]O7P&2f{#xeC bR }ާ?/դ 6!;u1ƃvڥ[]߹:-WXc3?{xe4]&gĠ#2k]]C %|BQ:bOpP!IJcc[ι¢Tu1h:"UcN5ֹeb&*yg}JV"i+RxKB;3.ggg2 _4;wN[]c"օ†WA*7Z-A9PҜoz'w?9>:wk-rRn0lv'G{e9U#`+G/>XWֺ/wNWno_J -9gˮxًGApr]OtJkG ]ksNiƘ2 (JkTtR}$T;_u?'Ĕt obNYY5vQ1!!Q@Id}U0B>}^M`=Scbu]R_Uዢ,ڶIH^HgӐrMdY4?(6LF8 ;g*ulQQ֚:1BjGT=8ff rΡ"RM1C՜BȐ=hZt:e.(Mh42"|> "L&W<R'!/j'uS|V/07SWOӇtbqqE7mۆ+7n?9͢}!Nf{p>;n'WJWsTej+z&zH׶̢M=Q*̪NځDض-,xU=l~5,KMgɹmU33i>r{!^:1rʄPוYcpш[Ztݭ!^,o\MO=ףw]ztm{}[^>xNJM8GυS--BE5Bc^<3*+uR3' [=Oo]pjg1-~Q3g,Zu>XP}.9A Y_ 1+춏ᜭsXCbd΄IFZcsAqQ0G-b!:{ ag S]mګN@g܅7JMP|͟_.ƤO1O\|\=0t'K7ޘz`* 8&~`"9GdsCܫ \ScJ+E\u@%=0cJE9'*P` H5Cx"9G1yw6` dl6;;?x9oÇY;_o8vo}O%΋G蓟<|+͝Kޗ)kcJxs˯}~;OM34wM+&|O C(RfyG|P鎶Y gcm۵5,j,ڶ-| GT֐*s~Y,Ji >Պha:ՙQS(Pq^Ѐ %0(h38ƝnA"`,գzXt!Fsk[Ӂ.s1ĠWpXkzTNE 9&#b~1!o^olcOm{?ܸpm4p40(ko^/rX9Ea^[ٚ_b'c ,ϻfv~;?Ə.*TfƜ'cvG{WVΪ ۠,H=RXAv]5Xc :yS{ sv;gwGGIEoHc캮Ro^!#gVWGӢXXN(-^ٟ"{" ̈D wHdkuZoA[k-A4:;qN9ʍ-՟IeG {᪂LA?}E@4g;Zu:z3eAX3 E R9\vڏ A!sxfƚTYC$ÙȌJ-D&%ͥʊRYR ֘*5.ŐRU=?ؾL}Zt菈E5>w9{z7˗P>~3ŝ+o:u]]UU5]|箿{q /JNqt}=bFQW/n^ҏ!yg;MVzS}/ XTk QbU81vmCYS=U3Qo =unPc]Uk/b iѐRmRJ2t_7 9k( E3#>S1Ffgs_c)GfAuEp N唬Afv%Ld4QJts7]x^z}µʺ@]ۺ??=BQ1r,my[cO}śȤ>POhun00v du~v|0;=]ZWeYTxՄtM"kRXX2+sҡX3"490 bJHZ N,3OZk,P sEADZD#6eAnJ˽x9g},p$T3'#b1Zq޹m5_ЍcL1~|72`+R0oQsH6$k-Kid@28Y8ܾ:5V{9"Jgzd,#ATڑ[gUCO"\4Cή6`QEEYZE'dAiZJ)BUgɵ%'OuFճҗիg=ڛf/>'?OIVW(sf@1B0ƕrCu'GjjR;?9,H_Y34 YĘ 9g;AДbuj>PI >] ]sڞRR/sFe!t)1ĜJ1;@j}RJ,x$,maY+]$ u*9M̼2օ_ _]>*SJTEQsDhNz)ꭠ?357o9gG?9}doΥS4"Vr.4 !.`me=17R*@>?* 3wM볳K~֋h y+z+13]h~sG(5c.e-DGW:Xɹe_A8NsUƳt+l4Zbuwckr&Bj"3eMG(zdF>MC;LDC3Hw>8UVœ!J9cJ9h)5FeY=|uuuee,}YU82;DԠתkO~7ZٽtBHZ o]U^<7Y?6×{OR3[W/\lehA$(-ڳ㭝su?!O)I:ݾ|woWƺ7A{d+R5^PHFk=Mdېke*&Eu]AO[DPm%ih RcԳZ ^O(* " 1 iڶ(dzrr⬭ʲiQ]k˒5E[D r,Z  "uŋޟ|˛.Ξǻnn߹zXMW=.^]E0hH+,7;=xx^ڹ|k}2AUOxǹRk9Ez1O?<ve< )sLQIcl愠Z)RL:Sf%?FO cs>)Bً)뢮4Ȩs۴hl,g35IO310]@#<8"sC!P/]0d2=nޯ:c0*Q͟_aSe_jKuf? j0&=]]c ,':AÀ@&ڥN̡k5ID9K=7[;{kTܯ~?5vhXDʲ"cXDz,cJ)/u&j)tZ>tmYrrz )1`hTRXYMPchYs;hƜk拳ý?~7ϯL'5 xD׿7õbN_=gwZ^=Bkʯ (0mtSޛYwJV޾+d{,A$e5E5sK@tֲbS5I]fD'DX_[FUBc@@'-9Pn3pYՈ`A*&c9ЅNg9GLUU͢,+Nbд5f:PAA493ڥ˯_}KDB׼||ӭݫ7ޚ︢5_T;_ob/77v919gpt=;샿˜vauS˟v}˯)(HC|8;|++ZLur!gaN1%DvQOPHm+=DfpbI[u{ 1HjTD5L ߐw{#_yi1|GeſW%f &ʰ/w3"m~iM91gkǔsf??0xBtu*7JeJ Cj5"*{.qBD/_/!5 v@%@i[YV9ɗ$^YPn?"4lc-\=hTs1튢$muDqd6&1 <~) SJD}\UZ9O?dU;#Y|ɣ;x?֨M"rEA 1LCW{/7}f=^T5;>YH">!:_$C2E=Mk)N9'΢-wei.&vH#S:vjRfQ:_JVl2Ndj5!T1,E%*nM^ "{YYY &m{umu]Bv콝N'ZEQUFL@@b,ܶBČ"\@L)t](eNǧ/.]O=O>-7o^yhϒrXMxVLJdTz"{O|b'E<8"b3;_ߊjt)ǐsdC=g>Z]hc7!̜Ys=`/c EXDbb6v@y#rJP&sA%s,D}{sy0DS(xrrZjcNDnD+8=_| `hF_YKꐪGc(Usm+EHeYen jE1mӨZqK1Fє.1mԮkSJz 3)&ll,ιfr\(>~x˾usN3WToģgVO/fU_˚ҹZZA8xE(|aڅknmoo k/ Ό<2AT1O)ekIgkJjHX9r)&B.HJYg :k˲2Zy*|B/H,|򔒵ȤSeUzh: :ǯ߸o6|?x|lq[G5^t?⽵sWVVιx4ql^;|޽mIL/5/_ۺ8Y0!ؔՓn~uqbF cPK Is@DYYcPU4d@VDSJ)j>3d 4¥Q}zz2-c99-$@AB$"DN!bn^iD:0AnI909ek "c]%3h^u#Dq&B'a$CdސHMqɬ)-I1ŵ)ވkbrsC)2t uZcL{c2_+l:sfƎG#UU,OHDʲDcd'a2YI1{f'M=YJ'}59_XZՕQ9!hbO)u]ǜ/x`/=6)opX4s/}?e q6ʺ/ohm< >f2HLHO!CK98oˢL9fYh°ibs^e eE2QTy'#11E5r/e9s"Reѱ$isY,Py>UUl6kێFQNcyxzO/"~ѽg?[zw/^- Fۗ~?W6v.ϟ|ὛW8SCd;RjkmEڃuXꇱ+޽mv~FBpNh 2Ӄ'wѧ[7oF>13kJsnscN4U9 ВzzuJ`E"Β{U=2gcLQh>X54F:P pUjD^19'L6M/@9P1luPs_KsB"s"$e*e&LmEEQ( s5?>dFFf$dQu=&PKQ@JB^$-@,BX1sw:nVSJ H9cUi >=FB˷!-Y U9ʇB8*1EQZ@4@A`4[k.6͢m[crzcEQ49֣Q]O^x|t7nl_afVዂ1f欙xKx_Te4?=l|ƻ?^:۠uGw[…yΜN?B6>"a=^U1~dk'9CM1ƔUӘS"R"S:gQ )o;"vs.((BWXa)7c0Q6U.BEZ8lN5 9ŞV"BVUrѩFڝpޅduϴ"["5V, T|z=O/ܺ7M)#HlfO6vV6vZ{yer(SZf>[cFOXu9 ˇ-;0!RՓ?d7+VfF՟M)fn&cgeDp΁3kX"pkԣ-C/!Ɛ1j`BĢ!A-JC呿x8v~fsn C f"7؄IY"'@06vG9꺮*]v|sOEblrʶ5[59DN >"ђ.$#3Gck!MX\Xck3s2 f?'pQ<`Y8WSG AD3={A(SfuE"sʙ!,kGcSYYVmŘAx۶!8S\dw|~vwldTv3S&2'FŨ뺮5Ɔ"`NX=̮~{WnONf~~ֹPJѣ_յk7ZN7|wwz_V ׿E1Y~OO[tѦrE8ňHBdƈ6IJ,uX}B)œRJ9a PKdΠk5b'Zr$tzH肀fKOw|UsG8#:2[t`)'A8NuoTVK(=B )CHLQ BVӊz[\իb,m_s'/~O~:?ڿr9h.]=?__7w߾xqǟ}Ӌ;WAro;o >~uau/k犇<.N/xwqqyκyiy9I*93U79N UB U9@ m"S`E UT# KS Š`D$_|7v\,SF`sbkE9>J(v{_Xy;׾{dm5LJ?}&BGr4u}pt1;#R.HߝF]1DkU ;4Yƚ Z݈弍!q:!CO`7K]cz IOcb< Έ蜍)EAł@O9E(!FgMX,D sF,ڶS2UYЅ& 3#Wstkoַ|'}g/1JJ3xmmgv.L=YFSFxӍݜggPfnhWW G*(=ysnGsZDՓ?ysOVs*0} Rv)^|4P*P&'I᠙B}uqu! U4q&LM bLQ&CM!,}8: (AK~22RKS|%EDI@' 5Np9U]ף58`/Fj19͹ӳ *JUXb1 Xde㭥 (]ȘlsR!CF%764 +~4)A#KgHiXUS S*:Lp<+ t<EWTu&2g Y1-O2[U8_/ӓgFDsoLQywtŃ\7~4]m"E~v/x_؜wߝdme53'G" |^w]A:NÄSNE:I[[_۽wr'/|oړ[Y{vtYQZq:|gto6{ڴn1+}_F(c,<LC26w+]29fE,C?x|y3{^OȐ1CI)CS]A#.RAm" .E թu-r2)Ŕ(0N&I9t]YU 9{j7n.D>8NƖJHF8.C2ė.t?ʭ3UYU BgSYV/sRe5X{w% Q8?z1^&JЖb s\{gD1.K'VQbtzӧw*dB^`@٫fI)EH]-vTUu=J))kbŘ@@}E}qtt(Q}vz4o"3]n0+ 4b'RJJ @soq圚ӻϾp\;:r:ycWT}>,"JW"EQ%,dvh\Mr9K9esZW zzDfƤsd5F5*4Okiݏ4uaV50~ 0f(eŜT+)ЅmCO)M&cu] ":RJX46ؽsWO|_|_p.{on:>:{`ccw1oqT̎?WuYOT㕍+Ϛ!em13gfk wvv?(GSchIb O8-nxùJ7aC/pQw>Ӄ986jU3|i۶b5*=G$MT^=Rz2ҷmٔR :;kF4}Rֻ*ʹ>McA  Q( a-2rve;hXo2  dL!"-Ɋdc uxApҪ U~x Jjȹ#2(f1G@C2]Esֵ0 yP'6Goι(10bLh*ꪊ13CTU앋RN)VUefHh&H #OӳmWVcJ2{OOOE3LFi,>sZgW.]__sM'GAUb,! ܀> -9'eNtֈ BC2cR,b-YcgyQ_?eY'ז+LksB̬̪,٥zzzAӀi.:{nlֹ]C =[|~_RIPι~%M渼^ s~ /ZNx[)_sytE&j|Bl{g;DuZ˺n$&Oǂ`0:co>Nq &9\Ŏ%0P.aVZ<&DZ1GC 0~ZJ\=n(fUZoӈ1E9 OQZ$ƣQJZ'&4!Tu:^7% >Zk Aux5;N>p֌g֚=Ub0(ڬ_WM3fW Ҙ#cu3F"z)މ~a.9=;{zg/K!f9VNwvջ ᓈbn֋֣Ƕʪ-{tn;JEQ0_G"l}V>n"OH!p _;/1ǵsVkն-F c&C l)yzlέ$lh#u:[>#!s.e@Q!5z<cb1Ƣp\/T@驩 b:?t:![pt"/~cow6>œ?ʍkwܲ-J7ݩgϿ,nYvno=NdӛYX]fpvX FѸ]+֋\bhU J'p{y~-p$%+Bax bHHH\Ac H&'}qW,`Z$=JsNUUc#"Sڝv D1<$4Uwd=.ruQRJ7?5ri& ?9*ˌvsΟZWD 1 !ypP)ݤY0Z쁛 A~)n6|u@V3 4`jn^L@驜a8p,Jm6I)sJ锒u9&B#Z57XgR@]X"(ʲDx45_u]7Mc-狢(oʲֲz9eym Q:??VUL,5h08|g}:ӌw6Ͽ\YצIͯk7_-_L@)Wk!_'Gv_=MK%]Qi,](((b^ RHXT}ZZ9EYsʮp1)%)wAbssk &zg)rH<RbFv jc !8ky39DQJ"!!x4ʈ^u _TW^[`/~oLJݹmٱE趨V)rhj"# ۅR ~)9'Db"bLc鏋_Jm ٸ(q];@ 3f_f/Gk?=e Z ,3YGBDR)AbBn>xhg[\\uR>sӘ`gN .s[ҿ`ք8N/E@!3#vrF"`x8ʅDP 1F)Imu!snckƺs"egeʄA!m7B򉆑Y0.,ը6L o!w]UUUa*RFTR҇08?4v0Je&s0 URT4H%HHP9{IUF) &iS%)MKn-zssH333^uISDDsw:_=0F`8 R&gAM$@@49%" Dm G glf16p] bss-LA`-;酢&d♏LJۃӃo~՛InTʕoTn|p\cBD>ChUZ{߰kS*%HU/iC3-pT欤FCkgT;=J9+NxF~ZY%R JID7DTGC+ď0ڄsh<X)JNMMwRʭ73 lGϿ|Ɨr+:ʍN_gflNCD\hǧ' 7{dKI.fo9zSJ9fCÎ8Po? x)G9#S`Nsf0#H0ZK<l?$Z+uunAv1IBZ SFW9km,+[̲'Q+s#bT&!ڲE>L跋{JBlߙr*( ZWoտΈ|ikZwd]lNI/6RehGZDRI`s=} ϹP+U7MIk3)Ő2[IFC+\1VJsNI$lι8bL5\ 1`,#²k4rkzֹg]d R۝ΎvVovz3к,?N^=?W!.ͯtQG{/W^YXU1 | =v+7l?JWT]cݷ*uEYXRNq8}-t(#R G)GuZU%еR ˲d50iZ|.A2@BJ9!s{c!'T|=/`%D9;;)~?wvg]:|Wǭǟvn|onJ]t[QT݋~߲r~nw0da]UyZ[ҧ.]~`ߛHW~c1Ќ}S /m>4_5OX/1@V|lȘrX׸6ͫ6o,T'O rNkEQq+13M2Vk`)k aegV:#S(?iݩԜ69mQ{URّqE՝K*bho:m)e$>ztz~^sG;>LwaffI}sެVՋ/OvR J6Tݩjz6P8>0G!ŝO|Z+!R"Z)!C$FnG%O87<9&ebF"F߉shS vx͖A~!b pZuLݮr\ysm.~o75㣝?|m>Zz㍟114ùݩwkc H 2.י4%BsEuI?uWt|hvgfQu8}SVi/˥" ~R*"̺s4Rɋ`rfdN ZKA؁"QgQT>[0. W(P׵hiG 91P1c.J0Ay9&fmSX@\N5E+$E}K%p+$,Bi?\Hi/n-qRK\HjXCo Ie@ e !:󘎱)0"kR܂T [\UU1c֦(˴D}e3r3UU2`s֚z\rFk<ג(ŕd{ Kቐ)g6Ę201čg}xlげ70w)1hm@Jm\gjrqx'W|~mδkǭJ֣wd_+p2*){cڢv9 wuS/7>L큄֚( sNeY W؊rZȪZ("{Pɶ-؞ 1{ 0ə B`pάSvpjyZ  CN<0 xW_75zu<=D;mٶcJZ+As| u2Ô.Ynr$y4D/H8=Z;NԜzrK$Uk!e|66Y/߉p€Iy$J뵲tx!@K)QWRk)GR~6]P2JR ~V0[0%PORs*+$'(!.u Bhchp>ʲ( }BTѨ,+!K@KRl'<5IBl\)X)E!L!D6( -pbBH9o 9#ڪw_ƃ;~ rUJΎg.O$ˍ̭߬, !#qbn>.]֏f\^fOՋե[,Q~Wh7oug.V?<>|RNugjVw*`Y7wq)⬿6|Cg&Hzy"" J#/pEQc RJ^>&6jbљ϶ p BTJYG$2ce譮.\՟[̪Om|CzqfQuي=)ftvr{}'\){{;hh!@@Q9"r8?x.:/Jxosxztҍ\!hW?^Yvʭ*.duy2h@x1ҋ !E"!ۆ-C*AZV@5훇ӿ>dL<VR_@L !jRB֊m\ uxd]9SD'oL@J#&Gj^.h R20"`mfֲo}R@Lp<7\qzb?Zw7$svJɳVO)ZPFRꋮ2ϹyRT ~x4VZev(ԍu(iuJ dٰcmmX\[ T)昂s!P%Hc1 eYLLA\nXDl|yiV.]T;=4OrZ@ovq<8g?:?|ӏFgWf'!%j8:yZ,?Y\GwluV??:eq?rݩŪ7ә_n ^ks%V+k\L -xpvlmdHBFSvXkf+0fr*crFL$MB-ENNJЄ4$r&Z+.16{n|~tIkVL( iկV׮ˬxpw5|mzaqYtQt WlcRN>9Mu2Ïb;E)XR\roF'nzֱnGHr-}Kl-1%! ΂R#RJ!ERZ~Ŕԟfvv&B'n W D q|(fEraof}Ry8-ۻ1u ˲~v^Ҋ7ȧ4>̣,HII@`n'EQ\mdƌ kLmr KY$9 o !zSg';@ojz8|>Rxx՝l6""vG Wnz3nj#b9VO0ix~l>Y]f?>:˅OklWbZ\ޟ<;GmR8SݹkݹœӝܲgslmJ&sfk@NeGMLnA)3yF—(p!r, ؖ. b7+ϛ9'Gr+YQFkDO QFQ镻o-_\FOџn>g?{0-,]vo~oVϭ\obCJizj,\;Ϫ,{u)RcZv;}' PN !no|}|Jsœ|lh٫g6|J~cvvZNbʖQ4#aOȃb%`_"&@H $y A)[Ȧ ^ObL|c;b )' 8fa#@(1g 5ssKLtsR%c+d ƘP|[("FD]7J)kfR R?C\4h4IqaffZ=Kea{Ka e6E[, RO17UƴrǯVO)n^X>DucnKrIxZK18(ȇ  QT1F6gsQ81^8]t­ #i| vMY* ~""B7q9u|ve7ӛ:} ógv|No^8fl1+*h<zƛ?YX ֓O~x(9'}O|bp[-_L*67 Gx)VP"rulq,iхR) 1g -_&89 1ө  G;{ϪŹʽwVo~ɐ-zt~z/_xnov]WT,ΝNfsZ~wzEכ]Ԝ-:Ϟ|uֱA%H$ltFOM՛qeM_!Ԍ/vMvD_C{noG/6|vv9Z+!Ŕ$وVy\WZiIPY#\E^kI9Uew:Yt_tĴuRV(%(R-1$D |Z7/^Z78/" $D>́`9H);\p&7UAttt$%}YkџcYbh#i3y\`JоYJ@&a-S6&pRJZB@H#:JZl纡ٲ"D,oM t:\'@](J!xDB=d1( BIu\,)Ŝ,+Bl{Rt!RNI)(Q:̆K)="u; ?Xv1J4!e~B(ewgR gǻ?|զp% SKRk=ݸ~ǧbpzJѤ]ţON]NbN)$Róͧn|1թ~ߟ2F3+gFk1icZx%t`Q]AHc, PVPaAh !DxQL|TJ:kȔVY!(@|A!RZ Zc+07B_ vRTkfFMD! <y_uA#9xf0E1=5}`?*¹I'NM7 R "愥 ,ei "H1\_Yв|I+w] Wu-U(mlofdK 5ʈdf;JrgsphJILaVBgݩy5{xd3zԃ;PSchyYJG/ك08vVꢳ7  sjk٦8^X8B ¹IHzʉn֫Q)8XL"[>M<$ۓe0/ 2ZOlh̦f#fN99k*XϹ$6KCrueAbEw~wzz6:ԵkD3JPmy .&!( ALVRqC07RYD/#s@rrv҈(޼NC 1TNιkc 7dĜs6ct]לbhUU<㽴610sڶ7;o,X+ч`&)E.1+sS71Ri!3k8(D\a9Èmf?râvT9G &F AAʙut:tozqqteFf)Piuv~1~djv)W?W9"ʘXݺvKLt1:?GgVf}*ԣS>\r0,έ\/(Ɏ:E ?8  F"kR2gDBJ)ie)Od1S 2ps11JkZۙ 7ǻƃÝ>y?x??Z_[קlQ*e.^99{,:آ(Rʹ~'8_E'V%Ĝv‹8eE [,Rhw6ΎvoOϯCT:4ݗ Y8O FC!b4Z3s7Ow5 B3%OeQpvWv<00E21d?VF$Rl9c|ιk :R)no1s5As֔x^ ;ګ&܈VQ>&{`^R >ιrQ_G!D\it_|vekW޸r嵀aB)e>tՋ/Ngg@BUThò3U9Mhͳ'v.SL%6H%ݫ:>:?? @*ӣNv=vD'(l=}O_twᄅ a]۰bY)eQJ@HncbJ1?NtORNUMl u^7EVK04Q/ &os?a[R+@ny/R[c=%D1ZPjIœT.#f)d9-^OI t)}s37J˙"4[RRi!K*Ch@T3I․ԓ W -2T1JDA |+OYgϋ)"aQ!D9D1!Tؕs⺥>@v:E]77X(B k8Zz g+sE<1м >UUt(\eʹXSN)&)Hmջ'G{[/zHHJA^W !n˯٪r9ǔط;ۋ߽fudmvQt&ãw;=u@f8>=Wޏ7~ǃf4YX_+RG՟-;ٕw!gi\g ו)l9%"B2 W)g@,BHp|Rc;ݢӓ努߾uU]Wol N^l=}3M~o~~2CRTm[| 5|9׿So!|3UWSE&|c3޻6ޓO?zv[k71$sآsfx[Uً)Nz몪1QRbB=1Ku-FkRDB廋F]BfBj+#Mන5(Ź8!/JV0kE MF w2U>Sᠮm4eKnaeεeKsʒ@LrA, <)r_[9D& 2Җ!D< p7u]E֘k]ۊ "EaJPH+α_.wx< CvRZ熃w.J圹' LxB"%1SA)|α%rF1y_Eb̺k'xRFJW8B˽5stQfUJK7ެGi+$hY88x9{;;5O^=Z쭯vg[?\Zf 燻~8H)k 9݃M׺iߌѨzxvū/]}ogkETZrUMoZ|]̄z\ϚfThƘrhꜢ Ĝ#LYXH%3%(c2Ev:e][R;-+>hpgco΋hs7o[ 8?_\}In1ŃE#̘7nC+I1l}kA圽ZYu=V`ӝX\ 'WWʊWǼtRW>){UISޜ`L>pƦoMZUF8^z\79xo՚?9HJbTL"N)R S1De` ?k"n()- 䅐O&s,)5`e3r97,X;!J,DFd:3rZl#"DLP ,7FaR9! Z* pl{AM©mUY9/.-pZFCkH%pt!p+ mFK &Pi0;'my4ZSnbGA=(sPPJ(ŔS8gD1%mLizf7=Z`sd-:?;?p(ZJLg/.||}kNݭx'nܻzK0֫ce7Cǟzmgzn͸2SC!:ŵ͸L1q5)" r J[^tJm•14^>ypt~b$ffׄYJQ*7xi]j˃WJu[>V/_N9pco_aQpΉ#)Hr"H$&%Γ^bD9Fk1S:cLRJ,$-+2e䛉GKP<xgckR#ٝm@4`8OϔRJjޕ/YmDQ AG/އ0uճoImEI1FSNq_-8.Jt"$7{+\(D3H)ϔ"91Xh˶n|Xk1dc>dmamlFyRW|Ǝrk֊JJpIGR=j9hSU13S:4cyͨIhVֻ?]]9g?ho{iZ*0gNv@`|XכRW_[?*;}J*JEtneJw6yhftCnwxpvwO'ǧ3skwnLͭt\-n՝I9xM!ZLGK@-!lآM7oUoZ}1,ˢ(c9+ctq{w,\nEĶPJAtzfpڝDș)&,!e$ =310+F.]@{ h>x%R9gj')\D  c$.:. @kbb1DzTR1n$H)\1AߋEKf10 bjbn& UB(^/ <&J>\@DcS)i՟ٟȦiE6)_?fL_9J9j4H4 1VEa~Ԃ> `2ĀyMP~Du3֙5iMc a/u4.3jmXjSs@T8=;9z=$HI̕UJ"# G$8_G2AL+&ؠ֊ kvϏ-:Co9L3:ӈ>4/x匿A"Ýj]v@=Nߛ,fWãra;?ve׍wJic]Lͦh|ki??{1.B  !f֝XJm vrT23~f Y]zSJm@N3f "@m]7{kIk-QJeor&)%&J8$ZJ0 'A)eh yCJ)uT)2ZkB <ێsRJqݻ>zzƸNQDI]M/ Ϗpwo3`Zz4'xzz&xֽo;M;WO^_Ѓw>$RgVΎצօYiO_=ߝ..][қY,;}WTRaNOI= ;7_[_MD}koHISB<u{A(!@09f;Fjӊ1)ƀ Ek6)QĔY$B f;RJk)R2? )/"LPHh @H-A2 E1pcr&A1E!Dm8kI️46~ iә ;$S}-pG4bҊ6H!(f"2$H`ʱ9sg%| IC +5>rR9)YWlJO,K>GX{RԜbꆜښ32;F<% >mT*7֔`PRqMZca5kSIS`#e׺RJީSĜNl=\{J)$_Q3|ݲ(Hvw|zj;0'm~̺;oyGoK)، 2eX]v;p~~~4:? Oώv')֡OMPW|B5pxzxzǟz`íg%sM|mvqL?3W#-$!Ex;.]؛o?uAZ檃;U.P?J驹㣝矗EO)cAuo 17//L$BJJc-HG*+Faw.\rbŵ=(;uLK;)Eц2p<1Zƺc!9'[R'5JD>QF5*1#tBMy `[ rJ UN6.-J>Obb-Q0F~43.bHI\rN)6uBHU}MGnw!*&p*u:\[ ,H.ksBAB] %h|R)U!ŤZ$s>X?`J2Y y b!:j4qė_u]ǵ+:CS%HRMPZix>#X @ Cf)Z `9'%e04M!_ֈR*zkWo+?ǟ-w|#of1*cqSώw痯IE1?Y5Rho<`{u6.LRF BR}S'|>X!֮VsȓF܌[.c3{ο):=L)hgӍ>NVKNƺ߭wX1b3:kp<GSb>3&6jc 1 !NSU>8^ĘR]mRBxP9Ġ#!ڵVDpzz+uAJ9ryWh'dW)m-AHHeTR*O)MJ'zJ!cʹ,B Z*k-%ȔsNJ( BPj1Pϝ1I1 1)g)tbB A) ~1BJ-%ºS!Dc\lFdLqJBlABzM5R*y}.Qd J7#"*.zKW>}N{77"O_=ճ;x5gr*%2Q>8|%D72[[w"g{\6Ќ-T֟-_+;}+:D85LD14G9<8/>)MTڸN۟uUz꺢cl7Vi󵵴Ebn)Ϙ1'9-ch1zt~<8=Qt({3s+SKl[ӏ~'9gg~5#Wm:](Voo=Y%[}`~;_ #2/~_vmUf=8ʭ鳉~,`,IH_m?B}ڭ۷̗JJQׁU5) |3H1tp0Rf$"SbӕJcD$A !p0rmevJ,iR V)B`1h]7 ˲FŔBB@Qi2_&wƔ.BisیMRfJi,D Buय़07Jw6u)+ڨAFwhkeqYVs9h<#QֺD\.Q UDoEVH8@")0j °]Uw3s"{&#{SF{﹦U*YUUJ)`ezmJr.4>ēqD 1$3zAj)Ɛɒȓ.YIt:{/B&"3$Z37h!ieR˪J!!n5HXvgX`=1TX'Z\UvwcջXWN@8.Z/^=dm~ujfk)SU28=;1_M-_^zWsnglޯz3a}~jcOWʵ]'e BŲ39|dZ<9~3v.dӖݲӷ24`0S4[  Rd Nb9ǜ"S? OF*BrUoiV-ʢHIJ髯}pSzUC.36.n>ly(ڸa[%5ڸo=bsիoPkmBgͿ.2 aƛ7L$Mc̜o7zxOxpeʍkPksTJjR)BJ q];xv>DR㚵cm탄Ԕ+iS7BnK)Z`X CVJ@Jy0TJ)ySe6#5MGY 1FIbs{76sN \Li #L)4J9$ZJ`V(b$"(A ]: 7VR- Я1&h(f œRvB6F$ځD \;9w[ &$!`Z;gsJtrHtxxDD>rFbB(˲i1BB(s{sIdDdHBpCJCBXkk-˲Efk\#RkXRU!D%!b1l]X\]_ǝGw:t594#lJJ՝?s=:"4'=:-:ι !eFkz[sW}Dtv4u>X$fceVlUGU1z|֏տuBOe{/! !1gvfzzq-&Eq MףxotvĤo0'A1Ee]SZz3Bzpz8vWޞ_XGG;Gz3)Tw?tfnodK^斮ί(h|RG_zn:WvoG_O۷~#}'ݩSԸȜ(4`nE$q 9BhG;/<;Z_zVr<kFWkM]7Z6HRj1-yL5k"Fu!DJ26.c>yf0aIV~AHYcSB*q\)-wQ䔤TlPR*)SD(K̙CaB̙sH\1a] 66"QBJA:@Kr@J7|2h93yp=?" HF%tC $/= AOOO누&#^5-ωZHXj;)Q& ISDrNM0^rd g~&ˋF0F Qd8@t};>d1d@j͊뱳{?a_]0)7{:ҫ9$ پv{)ی>n,]+.7˗<hˈxp-FuE@{{iEbnnݩyLS)x)F|gskkrcfv+;hcRi:4b )% RVE٫S&0XRAnӃZSsk7㿛Y3iWWoml~_]r}=ݙ rQtm%֏w ¥-r@ջ._UgN bgjmqջRi$f,Jj0!X*ἋD3fTZY,%@1c1VU9ӗF&]@JRd$3'X6$9cR*B,Jkz)YTBC% Khe~+%W,7ERx"BDY3Dc΁ ?Q60qȜR%٬8(ZC)"XN,=k,7o>>_xR*-HjI6AA0 a2OI T+1CNw%#ߌ֭P+ t;$qXJxBֲk3Q d# ;0yw"ic`@SUUB4.,,Mk*PZعsĔRUUE,1|K_)t=(m:i.ܑ=bx/fT;ƃӜWro?G;\]Xu! h|:[?\Xyi /jjg5[xz~2_FgG?vg~zݩrv6:ޘY1>7v˺UN;=ןY[O/(eTγKtULz/\s-YX1tejnezn;=T3Ut{/6<=?_{{lR*-|R"0zne:YJfQZi-A'^z!Z.”R:ƗGSںogX@ ˇgǻSk7TQ GmCpyn{owR-3*`88f1EQC!sԄ Z딲h!1ggM ާ1[O rJ{XcVQ[̘ 0;YKڝ&s,Zu5 jBV:ƨG0Q'WO\Y-{ I5hObkk8v*B)C$.sRjD^|L$!ɏߙ6>D f$({/A%I.JqG/h1-4i5Ĥ+ތc ZH+HJ*;VB: xSL`,[wvBRJ h4j+ |n{zB BB*e>x"EID)q+@)E$CZK )e"#"d]עhܻ.ԡ(Jt474R c,AbeyVe՝vEGSh`-{ӋO?ddkG[?׮ܞ3&yy2>OVo/md_vm5;T+K?14/n> Dnq?;[XXGL;{Ϯͷv 7G_{B=7ߛwEy1h9)m^| !h0<"y刺bݧV%oZXm'֔hdn+ܰqO>M۝Jܫ矏+;/k!ף㽗/._~[ [3'"œ^=}{_V^  誤!3JbQrRZc<@I֑@f;"bQLm !u|֍Cmܤ@9#?z\)u) Z)1|lDbO2@Dh๩֓)QJ-|%xRՊ+AHvB7s{t2!(ܑ2Z'1ZJ9"b>cV T3ƔRZ~϶)7:) Ra<! J)I !p(n'+ xoj R#嬔)$"\sFw|>}H}={izjnοk%>k,_VgYipz>" "太u.F'go<(f%koEYBڍ7(Nfؒ{vLU;+mz +׵u[ ,;Sg.rSl=,Ak|w9[VΚ7J_^]\G9|+9U$y}w'&k7ϷrʵZklcN0h=y'~sFZU,hmT!$e {|kËijB^: D”Sʑt)s9'l: nZFs#p@)aR]Uo\OoRZ=MMӔeiZg^Eh jH{ /^h`QPF0xR(f҆~h"dF6}KߛSJUS)F ˢ(z0NMMim0B}FK?_2yϤJ/ʩhW驉eUJijgga[;4;MʲM0xg_ʔshѨ?5]h4< vΦDM]3ݛwlez( !q$NwAv:ƔeŞ%kmh >:$L( u A( gaSY)9' fDxRRkSvnQ^r<\XF$d9QսR\MóG=rnz*;܎ }[Nٙ1zvfVʢ 99?\|`"Jql9}ѱlqܕ_ .9õ7zZ[g|;\mpp|~SSLLΖwVʹ]ٙ:9<ٟYZY 9+);|_uz3d{dqu[T|NͅnxTKsEʈT%"u-&Rr2C [VQR*y CA6RDJ iji͑=(H9dq 1&hAR$h1ŘRN;RJlz+^rJƘGOG(\1ϫGv|A^x1*q?eRmQ( !⤰:]D çルo1g4w,K95u4+ /)z<L17#g +?G|;arkhokHH s& A D;h4,܊}TPux4 6 ڗPf)bxiCWtz _*څ-;9Z$;ZRWKZ|_O-t3j!ltKW.=?#G*Ƙ}2rλONw^RR"Zomdó*皦>9]ҕ;5bst{\ cQe+Ϗ֪ޥzT|10M(a55wI^%ewh'Gݪoo)孧}uŵ[DfNB<l|I[ Ι(0f£D\&n$ǣSSWUL—1, d117BPi|"bKVZƇ[6m8fx7C Z鲬1z<2XbR8Ɵn)28II~'UUɬ:$N5J TJV![Yvז?y퍯Y&k!&Nv)75MPޖovo>vӋKw.#WO_=dϯicVGȹ+Ĵ!杍jQ)JٻrFD1\[M\&@DEgRic%ӯI(+a<8J~k 0cRz3W_>=R̿z(ŘrZi X7ϿhVo]r`xE-Pi^@n?K~|ҕ)oY}\tJpճw6>fxu cŷC6Ve -j\#^IPFL9~mLj+c`&W" b@AM]7Z(C!>x3 !"A@AisN Y#1 MK"Bby3=mj(05  ޶3"UYD1rVZnqq S5ڀ9BZgSሐXc=sPH dZk_rv)-g @()5Ht11HK ŕ#P1{PYkQ "W.(US@9R)} ߴ3z l5Z! 61m1F^1ch{n )tvQhTS|Q; mEkRZ)6*ƔS1it !ZK՝}[)z (mR14_߿+;~mYB /]e^o7Ώ_|Gkk¯KHdžuƳe{80:;VB29\*+A> dW!;Of\ū'9Kn*;Uh2繖-2FiÑt:?|9]~~śobJ [W`uݻk +"Ќ)m k=:?|D ֮_zg@!xオZ)-@Ty!i{{sNܶ$uS)DL9s, R9gDʈeMZ93p QcV{xO$@ ykmsԖx+ a5֦iَ/b6F+/YW.sZ ?;Ai)=>dMT*- #&~#~or5ڹ1D1!Gqhݩ*k-Co$HTU_/UQ\rkfm 4?Quct?Gct9L(0g}틤Ҋd6|!F- Z]n"`k9gAP>"veQhixDR >𛒋F%oȘSkoJJʌd" p um oͫv^>|?mru Mo6xPkw?pKWeoXc!Oqs\o=} cX[ h`3)vK^$x|[-p4>'z3 |3dcxzП] 1DbiCm$___jEٟ=SJ^=e/+7 AkJOapzpmӟ 3\ j|}48-Wn\{sqo|Pڜl|ͧusJ!x #H%ErΣ(h-)cfp1!)$HM`}ΉQ1&!1ZJO>al%!R!zαЯ |`$7a(M !A)x\׵J|R{ Yan4:=uacn*h[\*ڜpMDItx}#jN) UYv:]k%Ȕ4Zkʪ"78T҇R*%nznRqOJ$h!Do% - 95$(af;f/̀h])UHi!<[u>˪m 3%i )'ƿİ3+ڸ|cwP91wZWu:EYeZD  ehRd1pE(ƈѤc:D{-~>_f̬>2ɀ ւ5Rcz kH?D_z &F)=㙕뗬b*Ɨ6 vXG7UvOx87:֎r)E6K\jpUJ)h/П[mSu˓KgBk8U&'~1<;<(t~ƭd4!&"4|}Jz| ) 2x^>9[[Zu c,/L.5g&ջBz2Wz4FDd!c."V23#qs6m%a+SJR!vސ3r !0N9`Fbfۊ@{bft$8RCe~Su; tz~`; c CU-L6# AF[ @ l5%31crN<ѭ&39c4{9Yq):GJJnHH)y@* -ͷVT  cRmm/Tբ\BXPjT95m@\|8/^1gI9\3Os:z|F7}PRk1( )U4x8c |)˹9\>%(ʪ0Z9k ʲ)?:O-{Rj!VK-5gH\$7e1D΍B %Jg_^z\AID$%h&;[ Bdg`(5M1f2cLR* 2\c=ku]{*%esh4j bJ5i#Ei4DžqL !Dթq|Q[x*@X S΋/ǭǃS^`˦^C-]}_9e_ B'nW?ϯVxrio~;5{iދ:vZk )57䷮b_=/\{?HLK/=7#tEaQHK hŔsV*cVR_Υ}&Xu]7M] !ʢ\Y>s_OeIz'Klq y{S]ݍtFĐOyhFr fJuGlrw>>'ow]טeY'^/?* };߻X6w/Ky.Fت%4>O'$ƵoYœ40kg1sΠH@c2P l/\wqɎK㘸!sDЛ%B){jI/RJ0㘲qڦ+qR(hN =qL 31r JHw?j,#H@bcsb=n";Q|vKDWJ*i8>7w`ooAˋe yc$G"Kv-wB%m۷9xͦSiunlgϟHG╧9ҤH%&.J&Ww61[p_F.68ޢ$U} 791K)CDۈ {{skWUu60ŎW4e 꺲9751P\6 yuV>xLYҘ %<(pa"|)_וGZ#e6)@]7u];٬mL7޻Яf-[[ko~ݿ^ڄc _|y?Y]W*Br27'G.Gw5s_^~*^Ͳ8\ ! 0tx%szPe~z.lWr!7n5lJfW..5ۜ>yG_U}lQU5g_~ ~$%ZGqXoTAi@"#=<{Wï>ݺzͷӆ)!*"ڶUaD+#;T] `i(fuD%V4"2cy .CVu\l֘^X,d5OD9llbc$f>'bִ TK-FƜtMb ȲF9pmXb[BoEj@=Ul|u] tiz<Ϲ4m .< cUU-LٳS ޏHM?'-"HA%َ۠v ‰|eԃ4" ' U qy|pxPzBU] gsx3uJ}L2B!9>R+E*:Oιa !*(,08"P|>T!!䝳!'xJp[53-sTEr)8;"jgCT}pn"cUܚ_v{aժ!.ϟubJNdJI|ɏ?5h 9Rŵwrj ٓ{i 1*S'nxU%}9<{rr|<awJЭW s]fv^ݬ^<33BպjEԾuȭϞ=KǗqrB?vG_U*XӃKR y@ )UҼ_F:՝~Ʌa}x[:|\r)YU8Q8{h7O|G?zo_~[3kXТT@ J "V[ZZb !u-<yrʀZ bsBEgYMRUL?2d\,;*Ki!f#js%:k-G?ߴWu4 $Mg$ 7PrQ.7lxQ>?{z oڣ7_e<現<ڿ\^]}VOHb>;*s}pDn,,?6$ؖw>xv_olx;ؕ4*sRхY=їٟ-nx7sv[-:*"`+2:zn;:M:)"u]+Z7#7cU9'$TѮ`W*`PUUPUY7PU_lJBTiFm@1aL6G , 0m 9Bſ8=O5fvC$s lѰ$<"h`4 u%nmA8b|7lUmqτ_|}hzǮXmAQqDKGΎRָP-=;zcqrNp0m?T4n6ͦ_34O"& Mf dѪAh0މs TE*G ©/?ip48nK.bmcFx61gJ)QUVU93jA0do=6MB`m NgMU4V $:=K]΢fcUD.dq6aQ5viLVW_~Βg,T7?nulvVPJ:{z?=rrif\ \۳W~V?J) *_я֯/.>! =$)d ^QoE8)`ɹ̅+obvpI8tӟ+.]Ž 7o;b?G?zYlg.iyك/~OY$ƾ64%GC1|{ůwbe3Z Hn]65H.h+;u1N kUSjv6+ɦ _JQRגmo_O3ˆ/{ńwbbԶw >T1TU˿+: '41:ی_P)̥778~@/Iҟ&䦮ܢAxP4ޘq)}ߥ:Wou{Nf??^ܤkfvœW4X_[a43trB)_݃/~D-#ޗ4>/~}_E~3+$Um^*D<ݗ>7i*TLo u|lK~y'W~ýŁjv'MA5Di^VQD"|Ul꺔slًh~ >xM[UQUqLŪ}?sҘdFiMH+m̢*9b86y4lȿ˟|VI;UFidMѶ0MčHAКVer&'Qxhb Ͽ~z筹1FU~K8B컮:hij/DYo\2n9mg*z~~smas{{j5 $s)8 C7x<<jDѲ|dPErHNx$rubD9'D ay{|, >"9$DCTJDaH)< "uTUI(9m*;ͥlf." {]]ŜKJ` sd\VU/Q)Ȱ !xGNTlQ}T*;t|ٳgOv "jfyhe CkjN9}ӡ%_:<<ĎHED2oW ⒞=ޯnٛ{{-sIߺ|Wm.ǑҥOўʭWq ?//Wu=ɽXٳ58 #a]5ѕ?@>UҾ.//]Ť0[}ir%Ϟܣs}*|t֕[o[~ӀS|ع;}es~ʍo~#l1O94,m'2ØJd#t Dsf9)@C)%l$hi- !] Me'2 Cۤ^Tlne#YOثj \87u{mNUpB0/d@7elAY iK(`v.L$692yK~)it>p00st 9t WUuo8?;?;?!]'BX$x3Cgmf=cӴƠ9cH)\a.9gBz|?eŭAL/ِbd. Qe“I Qq6M4T qwO.P>Īr9)iwmsm;kf^JɈ @hK̒# TU#R-λ\ hc]krXWM]7 S 1 91޹iIg$Ap/nF-E"fEDE%"@Q qiڽ̸dkS_.n*]\9v|x4s'9wcX_|[(٬|Wܪb-0 to}O^bkSu'a?A5.lJz.NM"mxE8iͷ^a'(.ϟSU]}U2y^?}CМS{Xޝ-X,Ϟ<{Ovp[JJ[ ]=X;oK[oI4y; W:gM-{TӖRו#?Mh*jއRJ)\J$d2¥ P iWL]8}REKˑ=;(x%RJ/?vl:^$M7P$OhV*h-F!qg@8Ir:/o99qb S,^,lBXcXUggYs~~q>)13uua*AojXl^H۶dcuǟGdvn"P$@ږhfC:v1dU}#UP}uo|fv;Gu]#`oȑ C/އ )7QUA/= !Z%j vp]!&Nȇ'\"52mVB\ۺsIT1Bd.,(XP +6Jh9lv{ o|p~o.JNU3МS)IJV?j=}z = wsR ?ϏBl_BJf3{~ѿxzsR&gnWbnVg/ܫU18Mlƍkf'u=!D{>x2"XqW\KΫB|ҵW܅_ꢩk{nUC?~w{{n2BtcЯW_x[o}h]iJsn_"&W=–c9W}0gUٖNnxa5 97-/@-9VQX"m [p7"[K0+bN%HD0\L;d* G_Bor;$gB/Z@eJE;UL{j*eIIPe$/I"c,ᄉyl}l4 w8jlo.H~l6_-Wt\:l6#z"{{xqq}61V96)h]m;Z) Ww?OG'4<=RGRۿtc΀)]j.&*8749e \U<[h0 c΅'ͫaN]OՋu.\ W8ϙo0iCN$V%ff9yb-FRfi|[j|]3=UTճkWnşuZ}; ,U4Xbs|׿O^Ff<^,,\4;ߖ~m%/HYnomh\g^11 N!hw^W@|ůոnzlSf7 λY]7^{\fXCg._!ޑN|_D-۷!)9eN)˔lac@M1Y$=Å-=f&4.֋ðZSND}h&D*vRThV6yU2Zˏa.Ѯ  gi+(hsdR ͝@xR2%" a HW/K}!.=n-z?ޡa9lXUݦ{wr\8$Z{)"^v]XRJ)%hzUM(3nBOi\.3Oz ΟqsdBΩB]HXM]ÿz] U& 'I OғT2rc-0dF/TهeGB%@ oy0uE@ *~XU1V\J]s}[ R5@gђ 5.RR]˶ky,!v6߶:E* b]]י\0CXڒ+sS"\\JQ6!D4,`:GHs6zwKO~?/ťk7=Kv. U= yl~?.9}|W'G׼HNT9n=<\(L|kgνC^2#UU<ղTYc'g+?Q3[G /^:{twultc_t& Sɍf'7n]Sʪ*sM7Χ?KWn\|pyL-1;m "[%u 3v*g7uCDYk(S+N~栜g)e"r99gfiDbVr(E-'r' l ̶4#-#^Y2hr0m6B. Tex@2UBd[̧Gtfڅ$.}=7?])%W7 4ގKMqZw1*WyOʨH{{{{{] u\K)~4U{u]֫nM[rެinĶmT97j1Xyff> PJqu3"Xb^qs!:~PЮs*2 }]ׄtv~"1/fTJY,U3*TuvR-`]2%(:Wd: Cdc5rjj)(XWt u]M5V-c-R9Ѽe Lە3"o뵔{!C?!D" Ϫ6-9ReK.%W1VumSPat̢beTp ]3 h^ExKJٔ}o}ܸw>4=p_f)br?>T>>'9qNSU﮽^39Ծ7;DKt|߿ѕk-.yJIvڗe.o.N?_o #Yppve0jv0RA$]JZ>V4È\)"SQkRUr"U $3U C15 DU`w˔CaV!y'0>UmiӘ2eɭ'ď @].٫s\0&r"٬X4ƘR9!shq4PthFÁ.{= sPO+J&3C#/.M` Hj)aK}¬Rqs)D"PpytUmOBĺˑc 1q"%gV׭3#;8OD0d;Nraɹ@:6_Д&b)ż]1#85U;gQ $@G1 39]T'?OoޡQyȕ_?z8r:;jX,ٳU&cΟ/K’SrsVY)r)EQ,p`8L ܺ.jI|ѭC߿E.ݸxփ*h{w瓟_{R//@8|c>g)]!^;ثS՞ 㻟>{ţ/{n7UV,BD }N i g'e(JGN҉ȤJޱqs{K2w t4WR5W ض0 ~)PJQ,= Xɤr>8@͉`DP"b9Am@BIfխoɄ=i[s~#^6 ~;YqfD&m',9Gdooo\q(4fUS"2# y0Ɣs6Å͚X60!6hꖅQ3G?CUU21k/"pqD~s?+ D1 krJ@2υu[B!vS*P3s>\z۸WU#;r4wUUR%jkJ:/X cC?Cș2EK)j/+ jSQ9$UQP&rF4 cJ*,!DQE"0[t=?۟O^zf~Ufr ,ĊC䇿'7?\TPr/ܽ۟Fو*luif*ӛƋO8 ,]15zԈXJ 2bb.] fSuSUUW>ΟY#҄@3fi_[ t/tAM)r)ͷsr0$r^Dg&VMiL#3+L#w.8Gި|^ [1xZX1Xյ#? ނũ[uRJ.#ضz@F-rl?i/eDLd@zyb0(2be"H/E8\A۶gOh]b4ꜹTUwz˓ޖDn`R)(3WUe/UUWޑ !N ;McJ1U1J%m9r($bGFm۶dAU9rއ) ͼD"jRQզ}_|/}Э.z]EhK⒈\XO^ƽO~_ˍww7޲n^UgGw_ce^k5 :Wo~mJs.qA+&$%tYUc0(+GL8\b": *ހi^Yan#;fj޾G_8|s`QK~_ {G'spVմ/ r~cU5 Y~}ï>~|wi}}پ)'ξ2$ێ|BUE T4"Jd4!AP4c4s.碀ל ? 6}g~R B9Rr;*ضb-fm#QZ&%9ǥsuU6.%s1mA"U ;H1wgmLn-l $h!h55>&ණJU}ߧ .^gjralPD2zZmVZfTPDmxT#KYǔ,8e\Y8vJ۶jEv Hv}[;I $ ŦvoӶ=PJ4!Rc;b{"ە\oh=8ƌ0ucKrΑ})BŪq蛦A"[ 0Y| ¦Pp.ϓP9 sMoC3ΒE s&w}ʍu__kf{!֖eLdsI/lD.>G_gO/7y9_g?~VUrDFF[)fqb&ү/Ξ=EM*·bJHN-M2o0ݑ»!?2> PU!\ ;G6lU+_}\8p1ǟ ų?=3?8۝4vZJ>}|ѝO^\Ne+StʜYE|[ןLWlwO"p;33BRmhsaۋU>>TVHuZ-CTuGnZ8$s>AUBRӦmh*FWUr9~aVu)Yrp2}X7H6cV$AvHe$vש*bdNeØKQB1V1zø=LT 8X* [s۶^E6 rs4>xPẮ;3$DcRKz纮QJ>4UhRYm9aD1e[zJ΢cEH9&NK9RqYۘft0XW~GѳK7Ұ|+9-o%T^ fճ>}pvt|}6ۛU[0ε.Tq[|~7l h:?QUkj&Rr 6 9RJ!TЭw'2{c)׵4M]J/6ύڹg2ZMLH'n__<prȯ//Oo|'W_3ᒹGb(&U[=ɽyݾvo~E[ QLXEK"BO,!`%D%[5I91`#l˲V%hRJC&2i`3@LyY4Sr Uq4%(A2y!: XLD$,;u&,u]i!R)ysm?}Q(X[S 8/`Kvc=)۳1bT)7j6hʥ+mLvHr0rno/DvwRgzCγpR0ݦ;8oSًr))D:HsPQfr$+Ix)YOĥnhS~o7a1 R$U f,lN)߆s9߻TS00]P2D 8wڲ6dB/䜳#4M]ɂ\ő !}warDgbE{-':9Ldjf5闽94Mc4f)K#$$sN=Ó[|g7шķVwizK>Y~w%Wu3 ̔Ze Ewqzr|={ = _zAΦ\, t[;G,q'i~ CM!*(;r{ryˣ_sy0ߢөG,ϖQrff͙w OMip}vtD%Ф`6Ђ}^oiisD$;iLKd6i| QUsNHAYLS"hm5#MR,{RAb)hNt9`VRDF4hZG)) *ZuݞN$~o/P7Mucی(ʪ lq2fm3 9$Mr)ba mkk4Ml֛˻ n}^^Wn9tq)%~=5BpÿzYكϗ/_UȒpR1KGeѰ>OXK&rRWtl/*"6P@t{LP۷}x[_#"|pLEc`B/jko\%#Q[MV ,yc;>{{xpɬ-&WmwA#x,b+Rt;"U9a`+-9!4@+#"5/.nR]BĎ,e9*JΊKNGG`F|p* *ސD"&n!ZR2"; 3U`:L¦$sDMg١L>,"cẮ lp1i=xYfs :c¢*m[g}.%qӵ֑cq漸8?r*6M={{jYWu;k7qK QeSN?M^b_ :D. 'DR=8 YP[(3jvKI1\6Ƈh8aTYEcLd/a@꺶#2_MQ6Nm0Zp䜫5%t]gQ(`\*`V\R?D=(l@4l[T*yOpqqί RSVι1%Sy kg~hw~U7xxrBU @iMɊ"g{Ǜՙ ]4ށݘno]=c={9~gG4++_;g-j#7o~QHp^K8>>y:}@_$qz*s""GSa_ڛ7:zԊ4tXhG-$l!›r铻Oɽ͛7 ߾V)<1lj1يȶY*@56*ɑ˪۵9Uռ9K? !xGRN9U Q4}`c)s4z1n]Göּ4Z콷|vlEl|8D萰"T޹m[t!@.M9̢R@V˜q̝w=!zUoyX[A|Ї|臡:DuSϺnuSIm: XU3*VK_rq1 sUmFE_r]ߵC3_,TsrZ6d۩jڗD?m9n7}h}S~NH(cv3ADHF#4ؗmaB6yEʹkRYd{sss98fHi~Z.4ESJ޻qILTa$8 c'i ¬m2l)>lWb?s$jQ"42vȔ2-6\a >@IAm ᄊ~?'Ovo]図CFAŕKN:mZi/"4wk.[ӏ~~o8 )HN߹xzkEl`=Jɫѵ7v3 (zZ-:GQK\E.Egtw?w^o"SJœWڹ(D!P$'?}re52h缅NY~VO=Jݺ ޽|rMKDARN3#"1:$)b/c2KEq ەbd-Ċ*(K;^0]g@Dv`Lk #[9SfCsNu]uy`1]h>x"DI8GU,lQl"g 23@"oJSOk q5tZ٘@s!Zt&d m4]@٬b0 }oKz~q\umۜR)\1ǗRϟ?]re 0CXfaRUnQUiL}?opֶЧ1޻ͦ[-ѡaR\L ݁,G۹t$"M8zpBloMF.Pյ>@!DQ1U!D$L9B.EZJ1{>%X5}o:\@!岷W9$RJRU1uS!6pRbDXcaT1LX?kϡs~\JѺae!@U5CU%ۢ*@e{@jO͏>Wi=ҵ7?'WnZ4!%sKnbƇ{4?{>k7_^v. Vl8sg_'^ TT&zιL䄳Q~9c)iE"Eܘ/ϟ3:&NWGт~h-_=u}a֯E<![>+o~>zrt-v}9<>D3Xq bxtwgʍۯ;ͧ8RauS* )%rHDMS !xN{86Ph%̚}cze^J VH!ze1S1RT5WwΔp(2P 0nnu +8pF Ur@DX1 9@4&YQ' 4]Rnkl5=(NJm00Tulgw.ppx}_T999PQݬ7˗/Wuu٬뚙~X.3ov^jKիWt=}ֶ|17z'*)qoɬ[lMnY0MT]3&sNqm`d4Vӭ󞅽*%㘲`(oz |UEFV&`6ĜSDض ѦiaD!A~J@ds8f5TaCNs4*]lzE$|#k|0tv|;&9@P_s֯t{-%4tRU%dfQKĎɣ,!{j5K){{_,Jc߭|˿=^~{ Ϟ=,kn_j<ڊ>ޭEǺ54p٬yzOܺB]58 9b=U1aED –X$XSE dˢbADSkeT,.lj*]_K]W)%Uh`]7Xj؏XJ<- 4uS[@Z/ΑbUR8eU/9#9TT1}Pmn U@ǥ#ہaF>Ue! `O.azzDvCkM7)&f~^/KhHn!PJ/^X׵M. ;:<ݬɅχap|CqG@>VrSEyKqao>Lu^/,E,Kn`xN]5M$oa朥pAM[3sfCjKi[s^Xid.M3DXUao0Z!E* 6"®q0ዧgO.^>rk*Cc_rrj(s})h;ODY̎NcYw>}Sq8ɳI>f&\ӓWf3"L) |܍w#w{ЭΟ41ԡ[+0qӯߟڿd'~x/\R28HݺGzo] Vgib2^~K$gmjkvO~݇y/޻8}ާ/}I7>?[yAQݦIAT #A0 -9$'dJ 0%m zY$8@GshR8Unvys!]U9_UJ 8 sb 30㎛f5 Z7F#I}B)IvUTGf&@1Z6@t@v"W#zDe˫#~d;q0@ea3c\^\*Hhtxxly":E|VUzmzryBXuC;E=>>8_^\\(v]׶'a8΅mb%!%)h[{ <R&T>/@eozߤtTJ1f^Es]ogM) h;@s.i_8ˮJuTJeD<88aLIއqL9)1m3E{Dž1<*rCfXk"\|[{C@Sؔ37'!d4..KC;$gmos\r.4\Wλ co$!FRJoOˋ_'pҵ7n+æn [CCX5ow{fp}۟?b,}~3-9QΩl7ڶE\٣;~wxoK>{@SdkMcwA>[T2@G^/_tgϚ0X|OTѥ/,b*Oڃ\{e TK)K&wV;D/9?xq;~>{rtyoq),2Y x"®L{fERaUXֿ#[)8ؔy:խDK eR|XEOaDăEb-zkت;jД*VDXJ1bs>V! !%t;B1\L#.ن*` Z {6*mNŁ"MimDL9$'X$퀈J\S%8,1KRնmB<@Ny OXRrJUr}ߙ~ij Yw]')gt|t;.(ͦ{{{1+"6 B8::Z.WKXm_ٶB15n7 0%h#WɈ^Y&PeEG&E4=4FD㐗.hT P'Yb$"ÛX!C43#t]?!u{{}U8 =Ź0- mLZʚU)B6us/faae ێY 81Z")֓ 6OATU[[;"P.'20+b` H9ݽWxr勧w>镛o_)WYT5)NNU؍8BvQ<- o%|/ǡ[>x΋_ӧ3=D/G_ogWǤ i9=O6G[sv ɽObvJU͌DO:\Auo^?ߜ4?__zYܘ>U9R2%PR j.3U]={>:T+o~ݣ"NHHE-yKm,w9nsBLXhDq$Uaefr >8f:gu\ӴiLo0˪ Rf3"RmIDy cKJ)д(x/\̍hh@"jaqށ:Zrp\a4s;61)ɃnfOE"3GU'_VC;0 nG'}y./%眺'U͒U(9 Umi"໮1 @1rlX,rJW^Y<œr"G8ڦUSzJ&Dd"\6s>jҭ6@Aws1[uv쪪q0;r.qD Tmg+Emrť8\tt9G=a6DIk/xs7Ǿ{BkHC^1Ƈyp|Ūc./~ӟv fqSs10l~osDX9ǜ_aSUqabdUM{9|} =vqH~ y # \@CZ=={W˳g/~}n)e>[ysGYy$C!h9Yo-((+@s srL*i }UUU30l VєjTDpDU]p80}gQ9mǔ-D~*sZJxSP!ls2yK-Tɑ-Ќx kD0IXŹ50@2lWw@-MvIq0l6TG@o.ޘ+N!XJbS͔r9 0[B+pNωH]U- b-ٙbfSUij#alL[j1ҋ/RγͥLXS,`=H!r[jңt[U Qm/$ UQ,eVϨ5ʁADRJ޹VnFJ.UCfv䑈 GoQ$#؁.JI]7]יȇ1F <+a%T b' lkRs(A4ϤMq8_,{1M={o?{~:[^>|s2M,2GCIsyKȊ<6I*,8!gJ)<lf}q`X{~X閧^bq(Rv.@f!VWo?2GvI*{8~\uʛGD_W B`~xx|cȃg^;S>sfXl[tZͧzfnu|ŋ'.?@)ׯsY=##D"xt+M1d1 : _JaWrcFIErI\۶ETi>u 3 [u¥PfM׫42YF+P{e"@6^F/lP6:Eu+ER &cj5'G+ww*4jlD jrA%ۉ7"lJPlKm+2!٬uM_|YAEm1V,Eȹb>wv/:SWu-SM3[Y-rdZUUJIGGsIiaPp9@F`ǭDce=?D^[U=QCIE-H^y0WOVEr|(MiTq¢ 9%ۀ4"b.V*R6X[)kO; l蜛i7MmܥnTyrpJ@PR,F0xH!Dd1VH:U)yL37ަ " 姘#oZ9'eC^Usv4؟m e"W{ct;WoK/ŁlhljX<vv~܂w**Ҝpҕ<\o>Ӑּ3 7B 9O.|o>}4;gê 9FGUuBX~~ecž1J')h cP_fb}{~qqhX7UsE;~MkəfDXvQ1U(MKHi݅<"Ә7x+:!Nj||kB@8VT*qLrYuv jdJk$9Ö\bUHUU:>Oc0#*¤ZQJqҒ-L`CY)A/ZAQV!vkL1O؎en\RN`%p_KfҒ 3vf/2f\^&$GdwO- P-iR|1V N-iqpZFUnY藧B0Z<\ƞ~77o]ygq*lWY,և 9G+~5ӃGzBjy=[ѷͻw-9x' bݮTKNsNfG_^>Z?Cη#稪j@-8r`!XEP0s|hZEsIoj,B"cqCl@ Z1?M/c\UwdB9Ĝqo?@&Ѧ̅9;sm>ČD%cU'ФKJcJ]_7|p8&`늑YuZyE yUl6UUDa1h"es)9iKރ7u43el `IbjibY:B1͚ܦ_J>;ÓK^?|{~p3mo֤h9r<>k~PX5WX9]rȍ݊y`)<څ ]Fл*mtޡCrhh4_^`Chɶ~,%om2N[D3D>Diٳg.Ϟl.N%~o|#brm z\IBR,Om02[d#i(@SZmDuTl"%g0m|(96Tð97U핧Y8 "Ca[e (뺪L8O“s1"M*&"U Y, ~@6 *4;*%2Y\fv"lxb8U\}?dmn>C\)n=g>UʹԭW,׭`q3 MюΈ( yѦ;-q iEm:ɰb71*8W٧g`Bp Lڶ9??[ȶ^Sf5M^ΓzVB*9%mY\e<6uuY,fȖЍK!r%sx-tށ2PE$O70S<1hr$B ;|qU)9JUv]5 xG@4%ff%g<ǪbU;alb41nD\RB0=]¶R٬Gf.%f3Dl6>1fC䪺 >6G"<V";=qmz@3)3B&8٬UѲu\Ʌv[IS+#N| ^*;8J.9&n5?0u|qs_?.GW.>XvCoydT rι ,{@]8P\M<]U9M)64XUўa}!ıQDZUOevV:#8HY$tD BEBH\rNMj%fdɀy\zI8x45mWvCxD)o52},X$@UBB*ce6/W0.aL)٬5@wЏ\Qa߿|ꪊUU9|%U1TU㝷ySŇжfY}UECboflJM[jg7P)Do?6~J3RN̄h4It58HwO4M…qa%\3`AwV+Ot3C?Y-Kְ3䝪@#)FA2ezF3hB&HJ Ć S{o9ᾇ>sKP}*+dk߇7$WOsLO^JE8ԢH`^e@`9 9fby\< g7?/Wӧϟ{ӧrP T.*n.)%M(rmCpi6R*`&31_#ab,G9Ks|\-RfM0 M UDa6Saw_o?̾ZZv޿i.˲' O96[Jiu/$I7#<@{­*RLZ fvsLAo~a堔ۜt\~,KEq&{. Z穀ỰhVb.y'"̝Ls}tLa)gڥeY͆-9fDŽ C1K4}j]ѯD%0AٮZDsw&E3lnA?ej}̹x3,%8?R3yy؛ԥoz e"&'#W#7,˺^.v BG,A?=?j=q*m!F'\.s5ɡ=<;6Ll3DB8yDh>TDLIŦt fptyD8DG9e,6Gk;咑6"Z:J2wev)9ODwt5mz5ݝ>|s&޶>NK=1sNRA/Q jt\s90']z?_A̞FZ_Lq3ʘ 9fОb?c6ʥ\Q(_w?Z'?/?_/u}Zחz})ueTfirhl`@F԰mGAlXlA% w)dJ e`7i6}ݿ|xϿ}?l-/Wrӭ30C)ZRKkdsWoWvԈIyVS`fdl]>J)+~c9RٸJAO玼yjrֿ~l(2婨OO9YFocLc1k)rsEɄ %U]DtkV@x60U9+mQEcLw;jjQ[cQy$VψyJýDbCu9|Sɗ6f(e"DQj a c@*"6==?k)l朓<1~_A'u͹@5d9/׫#Ʋ朓\oU ,siNG/fD@W%j!G`Ǧ癜@i :D{j&6)%NjsD&eIr؞E~9PZs)׿ LS>z_^^RJ\DR9."c~}]Uy<D)V#r?lRu?.Xt2s)% A&M)Rha( =)4.81ʸO 6dNC79 }0Ք1 w,NZ|z{}-k7z׺,?{gϟ[^Et}z-e%\XS* \Z0&p~$3Q4M)<5#Mra"m&Մ[94?c6ھo/?_~ϾzzMgޓ**}Er0Ǻ.sڿEc'JXR __ bfXvasjiD3$84I{EY!e9RF 9U"J)* w˺Z <4lmG3N"Zrsѓ2Ѥ~䒧 U gT1J.cѻ_.+dӌiӦaՑ4yv,D@N  v}֙t pu.‡hEWH" .񌐤WM:ƘRV6Znsts>|zzSʺ,.z}Ϙqzu,Z}>tw\(#2mbYj///s|@ϱhp gڡU-'#H(,H2HcpJ1>FlCg:ZCD_wbSDZcZp" nZrAeQrZsN(%qH___#zPVbevoE-)߉."Tns.jRjyi"amfC9.occ9GEĘS`(+01AR|'k"Q‡ b;$GL ~|)v}벬uyZ/ `5s<8"l)]Bn k[*X&fg4po0?eli)<=տowqgXy#RN_bɽx';BLۯFUlq6\%쓹洜3VJn浔1Ǿu9{osaѵmߓj`&TQeYz!BU4m\(c %=e}PH] usN)Rb!")/RXjŜJ‰%V8©8C")[7g[@Bk89)谉lDt? (5Mkщ%e]H<c ?mc"w~jϟ^__uݶmYTX#}6x w ܇gU:ce!zlK~ 8Ck#mmY%MUvwC-;,>(<"aEV wQ}{b_U-xn_}u.Ů` rȎ<َ֚CS~G*9g:1AX/a2z.p[שּSEqCS+Q#guOfiA\H-cݱKIk)h"v曟iҟ~7T~QJ,T\j.k]._))^Ϭ2B(ESuQSW\2g}h)|0Lf $K)TthLue}#hY1瘏v{{z~ۗ?/O~^4:ܭɖdž($4*KcRʏ &R$ &vES-hO|2ISƒ P5"p!b;Ɨ(`pJ +f.9'PE$HB*{4,jIE'lˆavٙ!QJ(^T>J'#XtajTN036a-Y9HHX/PRJ"JaX1{kZ+B[AQ۹wK)9N@')g<X9%ISRwN)*gbsDj6CSr}]k]u}USQUM9| Kkբ 30a4tPGon` xGmkN60-ygRhN?E˜m*X <@wZ!>,QU$7u:q!`zJ'\O=DAľ "K-P,.m߷ZksN^.rʭо1b6"G!sm+۶ \?ۗ4%=(h 0śfSĻ'"ze\u0ɘ w`ae1f-NDcbă[ݻD `b֠yCV‚%Eu B26& (vɅ]RaZy]*f'Rv{[=/_gs~Y8|udD JOOO_Bb6;Kq 'o%(OĒTR'%jKifNܱa4<,cN>tFi~STǜ9"=%Rl 8e.D*S6R$֑IbLM@"`;ltOO5%VJ1w ۼc,MKIE|Mv>8sp4TRriBʪg9I cZRz#۷* *JI4 d7zߧ~o sjJO9 ,'e)\*l;af쓑7k!j?nv7MmY>}>BS\Uε;!fmƜ̜2S?ZUtAiG~H)xl$BbSJ(`( >s&Q(1?xׄC ϓHb<6sD ;XL8ff{kse]eh-b{˺V,kʅۜY6Q-USuQǘ9ruY^.Ԛ>atzDW"gi_HɸiA8?p".FX>B" A.dd9g`]=#p=R1{pD%o7~>ّyxaso .9(s2[0!,s %܁^x 7+%18f<5MDmAAafdzLO*GR!b7۔2<%˶ﭷ1rͽx"'U< ritVX;'CH̗RoeyLQI)msZ)Yھ >I $⮩ߤng_[*sptas?]x嘑O_Ͼ*Ēsj :晦&RC%MXr>T+VDFd9AYm'dK0zQ՗/o![u3t۶-uY׵&,"6π0u]UugX r1,eN;ڤSr' FeL9)v"~"cg e> ^f@%EJ>,Pa9$=%x2p m&M%WZhL%c{yyD;Ps4PI/6bUb"RG$y;zUJܻM0猝N,tՓm {D$ϫYE XD|xNiʧ#8Y]DDeqOЌL$0sesriOQ[KF%8Q>BA 3L/#qzO ۈ<==T5eФ>fy}Fp0ÞגIc/-f:gYbN{/1i3iJ9Mb:dsΜ3$L T"cJM*)3h4c)>??1K)sŸDc1=6ܰ9bٶG MS光Zۈ|]궷hHHM9j]&"ΜSfIUO/eFā)n BDi%ot.E]S9.4p'0ǎ\I3BUtbVJ()b6USI=|Pe0'Dz}R2/0drs-MJSJ78W7Qb_j9"×\[)9sɢ)hc Y疈ROl]"yU,fЌ>d>inf8j_qk"1p1>}9ցsiˁ(Zov<@Dmђ01([hR qcLT)眸R9Zx"6/_>pc3̨N" xc .㷚)FL+@EM,4R&0˹; g:|VK8:l6mǶyeqW%彵Zb΁NptMJO QAAAJJ¢~.T:JuQi6ۛsvחiCXO[N֥:fﹷ"0Cpm0{8ͭ<-"=p| kw&N"%4w7Wl`4.}f֤쩰 |Z1NuS)%ץ&q8)'a!;P0Ne&3WC߲,>hm@RkZUe>C< sx忩ۣqcB%'yXu啉)>|,:͒ @@$,!.(-gG@ RNF,K%9 >!C]r0KԆ)wu[`撒TR&uش>R+3/˺"˲|hAas)%)[LDfQAsQCWZh DpA*F·8C X:qYln!X+Kr"ZɼS5JUm{#=uMJ昴TL׿M]|e̼=d:LD'ZmsNE->X16#eVJITaf%bf]'̍Y04ۈ>#&cL+;Zs1F\g)#5׭u#Bi]3V I۾^֜MLAfJ9'> @`GoANEDu#n>1r.D%W0T]NW5gMyN(훙VrVM o>G9*@'DOra*񪦒ZE瘓Z#bա|?%EK+"ct{Z*  8Cw̲.=J0( xYb f<\k=5"0"U ';未 }O{TyJb}=@rf&\ß_oEG@#d J(B#ǔ.D79y8 MA{6&EQ*Vk #;X ~:\uaU^g}LUm/9k۾].>9 CRH˲Ԓ2c>۲,. pl> ,|N2nSt$djBpaI+ I 4jr&I^0}d.Kŷ c0ftsi9vTtiLsNt%'+m3dF"(4FR p _0N]6j9Ϟ?9? vjk2s"fQ`Ԁإ?X+#l AϝbEc51eĂ9jĂؼcǾ1^.kJxz;)!s@vG{<T$^X!j4$wj8;-]DD)i]u]J),~K5.?P3hs;*/۔Ͷ LBXN#ޑ%?eQ & 5;~?_~k!;0Rgvjڬ*'M揔6Rʶ [=ܙiY.POI)ӱg훙dHъa }))so;xN!Gf&JI?C 1XdPt ]$Ղ%}}B$a~y[1܄#$ecpaGr}>F===z]We}NCOJ֒sr98F0}ۗZƘw(aT9BL-iOOפyňHS3˜Ro%)ZYV.|<6dҵsNAc3/˂#ZkAS낺 7=AA/m޾jNiYcCՐ2r> u&7rA̪k.&EwTnNsϯTȟ,]fJy -M6Q]J׺CTl#~u߶ej]DFea7PBA=".SJ*.VkG9'΅IPh8>Q< 3vD攆O&2}ÇynS@L#f#<'cAgs9S-6hK6p1!e[y+"한omgN(I"Kt ;Sntl.daW>')ei@]A~ƲjA)?9-0KDUT nyƌp1>όy9 ܷ])gBs)9Ƙmþ2¼d4$8ʔ0mG9HsaD&"cD H"f;!P!?O\,Pq(iκ~p"=ỈsmJ,_. jpV_ַu]3Zw?S//#Z0IG"r^Zݯc9ci4u]PGv=Ζ\LT%3#\Gg~@7 3#ua|{I"$Bf "BD Z9;@t}v9U$ݦ|Q1ͱm[:$R`}ZT73_׵vڀwkI2nm/ 3j+#%%u1a`B,cp`Fc-VhKڷ@HRMV\9 =9#ʐ5J-['MU3RޏC`> ;>MxS93sJȉ\,*"RR AX*7SNNP9FfZ\.G[(Nľʌ("\+cZ d`΀d}Jg5m?K oaD:eEɽ6Ús%b_o.C1Oņ 0鰽 1 - N0 Aھm ^L89eio/1J-A{YRQbb&xzzs{]jz(DSJ믾cZN ̔$*sBnN-"-/"1`%=5] cqt{WYAX;91jsΔEv{0*H) Z 6< w<}ޠ.R\.HP3]ק ^Fi~ ڦ:I=_pn)aB+t$lj8s}ueFsaxi1(HDmZomNQJytUP[Eӧ2栈)p@rp!5rν7UF OZ+0,(O y jo}qD.E(JoD-(t4?]ۜsyyz^/9\\ 9}`>,Qe)u7O)Rq#o8 a+e"?sY>B޾_W|3FcZ-JϷO~%=ƙJ0AT]. z(NP)_9?9EZD9ۜ= 0z\ɫZ̆Zk6Ewd[kS."6}qԜRZJ|0?,Zs Zl˺Ģ\JISo?683 1esV3䎚H0!ٹ9gFay[{#R<Y)bNWaNFnA0m5H"!9C1ضjZSHA\ض4'vP&MZK2ɭ"8 G=vʇ[blMaLDX)0뜷5јR% yaG"r#=r.N*3'(%OR"3< 1EVmrniE8洔& CvЗdfct&RR+6d*9">~jmךZ'jNaXX^O/ Z7@a35|`bN"an38:!({"5|hJ%kkG"H·='&9m> 3 ]5Ykݶ^Y5'fQQ`{/_¬):,jcD@ k&)%3 hZPuB=Ϩw%R:d'FL MuMy~l9SURxX0 Kg2=%.lD~&C!u}xfȗ=a\{)%% SJ3ȅ|?E͐Gc.K N܉9ҽ4J͟A=??f˾e%՚벌M{s~,u)xse57i驖ۗ.D3싦 д5>F:ޱ;쇪A~д#C/)E v˲$zfMɃhQrMcY/OcǤ`c1-8<9OO#Q 7aLHY%ȏ::g񃁮*T1`yv0s{D$>YH 0" r!Z1q'\P[ɺGAv~_# 'OirΒr *2̆ٱ\׫{f^GвV9zV֊1 14IN6mS))sS3R3GKfrP[JR"$G(vKWRF4H|0YGd9[$1+ftD4vl#4zWDEXY8Z. H)Ǒ1AI{1%FT [QG_+:jyObvFc9wx€qEZjA+@GXkZO[NJ>{DH1sPDìف%e4B{˘&")O/Pʲ,<{hm#P#V  ,y<8TL@ZS;kw^KJ^(d$:YK9̱]@]8'A!ʸ]Ö9 WBEey`+iJiK)T`)Ę TPjbݚvs"v Ƕos(9p 2I?eN9'G6̽1rt0CR<˒Jd>)"|􁹅}QA9+-a>Q9P+ӡ&pUVJBbG4OW3cOX9=Ž)9#ENt SH"Ywn;f}h6lNj- p&9>T1|N貨۶H>f&Lz*q6wv";9Sk#tbf)'aF̜3`۶6f,,*af/_:x,Dњ\?Jmۆ֥A,O1 ͠6#z^<[\c]/'LThژHab $53#AUD`e̗JD5"3Z?obÝxR(R*`wED 31ޘ PsJwM*c9ޒjt|dpU0h:5-[zuŃbsY9 C̴=K aq6~TZ rT4璳eQ)B9æX31J꣧#{ (ȖZ5۶RƜ9I9ˠծO/"dxܠBu 2ΤBzz\r2s҄\73^тOPyl?gր0 3UqBM(bM/ #*F9\Scu]M~2tu1 TZjMh|u-ͯt9DSN"&G^_^N:IBXt#bvIsۡ [씟>xIH,5:w]kJ%TJ^/_})8fЉB^JA~ݑ*¥T(jL ea{@5>m3m "11eޭ*mJΗuupc wX:SrERVdn*fsd&s9[?=?Z<>|phՑ#8(Tgi˺F} 0ǘ6j W,XHJ>A4zQs";GEt! D݀AMrNqFزSxbYkCt+¥diow3\.)ik΁ jZjuY|; '$ζ@>Gd0qAUk$sD)p0>"e]TI݈8Tkx1ֺ%MsN"{#c:4 :#e^JyzzBLC|Fpmo9RʺK//,3\8K)ecӤqtv&믿~~~eUyzz\.zzYK=ܷ }*c>nDrz #g|lN'!NHc8$} RvcovEԂ-n`)2acr-uP-ͽ\. nwi_}j>rR1sڲ۶泏n P8KqO3z0]t9e89COHQ?91 D Y!$A&"Sޓ3O^+TfjmR.<|Y/ sz`E%kkCT=D"\v7 =ID˲b&|)O^y,,fǏ? *0*"z 6r "mNJ¶ַc!J2Ɯst,3D$ M~P((nUn"Sl[{{yExvdi<49{t"4唎!t &B,1E9$Ϡ4c[9*Eh`As1uq'P8a}nt#Z]uo)b܈%Gl];"~N R; QHcb")Dt\[ۙ%i: |YRatymYT\/'oMT끪Đ)Rš\~o"™t0cIR|_aID|w>GDAaBCQIaAV #wZW]͜yahXQBA26A)}cc0cMì"Bw8S)@A>ZcY-,ko5|,lZ)r}G_na›QN 1=C\Q-a΅4DBsv"$kJ, 1Lx!<-9 #ܟ_ }<@1oۭR "n3Q"JûA 3cb$Sc z)EXLĔB{dW9zfPX@ Ě`JqH&s٧Lsg7a rcV$rj,E GHqlKnmuLǫj6{0PU.Tjx={7昢0&ȩLL\r?]#Ӱ+r\PQDוQPRY4 i]JDu)D0W?0t Dիri:Qž}çCS"sr N9%'c唁́&c*սA˗)8nER88eι+Z f)59TڜcePmY;d ?߾\.D@s]&eYTE؜_lwL8Hppa >q~eya#&d aGR΢/"9eYJǤyN49Uɶm@ d`6{7fiv=‰3 <|̔4#%& 53qRB9q1L\!{>B%7Nk1dv,FmG7ï4Q|5r._}gŹm;,40XC2uMo9rnק+ Vkyyy};DS|YR&-?Pje ~N>PI Q8kZp n=#j $?#[?[*4̌p=TYz\(r^8ܶmvo"ܟYJy@0҂`)x,JaOhnoq,RricN2ݡu'xz}xc.̭u]EN!(N HG. g̬\UyY64T2طLud?uY:%ǹ2"2sovOr߉" v `"4FGzr)tԼ29甃͕+>{Ϲ?YlbvPD.`A03  3~10 NySJbswO|sF_tۋNw, #D!ûj= bv%,ģ˿ﮘ֚Rj?s]m۾o9\򘳵, s@5'nRK9AKĵTf%Vqi9`qJH 8E뫈n Z UI)o p^>}Ek}nW|ۏLgO'ԉ(?QPvmgI2!+']1ž]b㱉1:QmY\2S8 q圞MZR֊N㎪f1ݩ{`E"-"H#QԩRNSrADINf~\o1ݿ#3Owfrs gj"s~yy.lN6>mU+njm{ƠXӃs9fD-}@3i0e0v{oXGci\,#;W>RPb3{D۶mCUj-g־|:H>1Wv:Ĉ?@A+LuZJ^* fwGPyv>zAUo~#@U Xf>c9H9FR&rsR$b3LRrQbӦ̹$@ 0cEœKb×OH MmO4#! [7 l~9L'JU8ac`4:d9JLo, g/RJ)D3es95gPI<^20ìtB$G7`c]m۶ZO///9gws,pVUWpkHm&(!1✄@ bc=vaC)ֺ֚u)朗`;ChKtrbxl#:0톪 Q-)>>`"M:8.^m>|{1QtG$h':u0 'E+sڷ_-ߩX9f9g7Zq*#0 z"cm;P(nSU=͔.R.57 g5%iBֽﭏ,uYJmkp9v9IŐrUZp+Cn˲mj3HsJI1s"bo tБ))ۜM]槧TH3mÃl"6ǜf1Fo6Fq>~ۜn3Ɣƿ1&bj&fr0P:} baxS50J"}tw61:S p_.߂"e~~|&30H 3Di1+KE*kg 1mc[jV6G' H!wpCQwGW+@ 붷ژs6"),lReM36LMB q8.kE긝ڶ-4)VJsAaeY^^^lZko/__n l8A)?cenGNBf> L2 dGK)6^Z˳{`H۾0򥵶m96ƼRZozNuۆ1ۗ/mm_\r;Rz<`$ ҩmP]硓cZpI#dbV(^N:hY0 TWY~7_F˿cP0ɺ, Zsp( O"Du]euDIo۶(\@$ "֤fdf1m sm{).`HKCi~+9)zBYk\뺊1 ٺ,\xp + uDz$Z dwӔT1mo%U8F3ңj9t[YxigcK {C st7cjst4a ǻaiT/˹J9e{x ˜N4ڜo_-EjAxܱpvq`=-?3 FLKLr,N"ZX &Z QRRh}}k/G4RP}?e59{Ea|^ V62#>Aw[jvTZ VE~K)-˲u]/,LՔ!BDw 9v?==ײe53Ք QioG_un%S 8@힎aO&N@uJ:4mL$Y7ð)KeQtƌ9痗u˵ֲL zyt*=iLUke]WU?_?Ό)}e]N5pwRV:&p-°?P:d ⤳5۠u;s-Z]O@^)Z~u}K~?1;͹T`}YA܍Z)%ÉY̶2ק{UXTpBK)ash>[~cDi)l uv79o7"LgL92 ^psY:Te; [e&p"H̬_01V޶zhx/&,T" RKNiITc{q vQN#LOBQK};9%zlΗgacYhqTܘɛp3BDaƔ|хe}YR2yoHi JEPr+%CsHS]iN0َQh uS8IXxDD> b"Gbt@?X5GM[:7pca|@J)ei}LQɹxGPN"e mJ)RJ Jtd1v4,ʗ1-|y)H]{ks5R VrׯCux<6 N!)!@Ɗ.ݽ.tDbuA$ G, Ĭǟ\R?|YO՟B=A!,Mo'O`(9#*;$їb&^JQZ楖K.9?L4moas"`;hAct`oډ>fl}9eYhc_>,TsΥ; jZrV)c%!oop*ZDsM <}TqRxa4y9Z{뭵>ziL=cz`1Qqw&0)4sT "(<洓M蜧*WZ?߾Y9aYYP ?@blcnxVp#d ;P[GF,PX$*` a)'"譢' lətsx0sB9ġTݣ1mF\Jr-"r8#7xQ1<Ռ鶋V$ W]cj"2F||fPD9Wn?wwsn>{\r^/@u>==]eaUlrMNZVQ?=]o[ub>)ct$.y8.I$&bN,) ynX|9tE+?'n;y zZfJǟ]_']:nXLkd9~_.sھ,)+hZ{kP79hg v3hI^<^,q>,IECu0bqPLgA )0c^ER 6u2o~w}~e](=`!i7(DS-%Rsh.rhDZnH]Չ,P%s|e9IhmW]8͉ [t )2)>rA zf1m)?SФz9b@DȰ:~~E`N[β, {w&uy~~*{s ">vc.Kr.r9ZkDS쒄#Ru/L @>D)+1yIu=tϞ>Ur0`KPѱ2R򾻨FLɍߗ&7a"% ͜A3Ne)1k*Z)Zs^?'9Д29|A Ihq{y1Fen~YWb |و9sBQm6H֐*" NphaS9hrs:C#{$qs_.G.&R |x)&B%OPh!el,NIVT{p>ǘn~ǃk){뽁'[} &eXM{Ez#a ˺bY5'axG' T#D&V/S3]ʡFE{< p8h9۲,hcȜ۶\uٷؘzUS-"JAAL3fChKC>_kEܒ&83JHwxyy)9m:ӢD˗7dRNqTMT 􈆖eYp~m߷)o믿)imY[ҤHo'mo"\Jr^VxlRK.:rQ 3#Rr.~/]T̜rJIۮ,,D|ߠarYub#Ek9' ǁ&ED_UOH1)/qg"?x>G0b>(@G4fC_&(\9 E*'zk? $HNoByήTmo{9`8%0Z1G؜3AZkY9=6Tz0b.%cs}߱/%׺,KAx| @GrifշOm/ sLb] \XF1.CXO1:VsDc;7G~LfRq]S.9ő@V ɢf`YS" kg;d,|N9'u|"y2Xބ}RN4唈 zߜ7Ș8vbbRL pG:%а3/?[Lg8 8$>.g#cqBQd' ZJb\zDbQ9i)O/p]sљٛ4%(GFGJrPc%e]UtzL/d]뜓sɫVu`:{˹ɺ.Jv>PR<)ɾxԯW6vX"EE. HMdRXbpb1<3 /Qugxe C@-eo~s!"ﻙ:tz<Eo.%ìw0jZkCuGD////"K}O{kF; ̼c.!R=HƄγu LB m vaI"jʬ,wƀjjQJI c|D4q[a(kmfDz]SZ&f}0ZϵZD䒡 ^VX9/KQ0A*"zݣ37s3w"6n9e /6ZGKz9(,s. esg ܋ǀØU?12,"?]T Ov Qm>Z2GطciM.89'8 <}"5Jfy> eYJOpk3>ZY!I l8NB6p,12SMrv o1=ܽ*p /aRKʙym;$*Ҥ%!oNOIA2fa+Y$ncNwku'Az"Pay~~\jWz{kR1~{\^+un{EEun98+?31C s8EE-Q*|`fN̬xlD۾)i]YD. {SM"zZ`K~?s~}}q~o 1Hc u]}}\dnmoRZ9V()bdXQ.Fl\# Y<)QX :,-7*Z^֟ů_geEPl3 dQgOmy'6ƘZk9vA(Rb#Q$!"P HIQ#vp5 *rɒ(Y$%s2sf ?|sW d\k|: 8/E;BT"8noo1o߾gU}~YVXn Pkj1m̀ީ)Z͵bdJc"vBdL&(#\ӷ~X9:aὛQ58noo>}ٶ!x^_z鉈Ԛ-m8#[UU$>jxnGQr[(R{SI1W'3MVmCZ5[$_pD5-~ZQA[lV^ +޴?ŨMoaH t׊bPu%"'#vIN55a4 2#ۉgDK 7`BR˜7ǐSk0D$:3Ff!j/hi,TS5ՓgZ|YpǓ1FfWJC)6c4UBaӓ'J9#A@j>auY.nl%LŬ9D䑙*oWiq.ĴM3 F{1S0Kr9!|^]NEU{]觱 ]~AmۖRĨk >+XRJ-S6n(vnnin15ہ9v5];(PTSux ̌Y2&Z?Z|eDō%N^7{? c¹%FɅY ȹVbz0KLxLqbF BNGAmL`̥8q_܍b'b$i! x儚Re -"R*R⩵4nOO)e4Dm3ϥbiP a!c)E$8cifj -ピLrjֿj]%JZ]`;q\5{U,6)k֒Ҷ, jPC.\j%65.8'0}iaa?bi!4iAƥ݊ABYȌkZeU62.%S2ji^m)AqB RrN#Ԕ6pY`F޻!F~fcv8zڴiBIM<ϥV192 j) FBC6SUޭ ÈI@a"%.y\m]׍H.R;ۖn??nG{scG0f(*be 31xU~X$HZn3DYu5͠4XEz\` P23=@PeQm.?J9'bcqMeQZ%ӃwjH"HWS%lXsQZflNQ? x0oiܺi"(T7Ƚ/pO8q4s"jjA$)+#)#|~Z 4+9xw+"9mf4Mr>?tfM:q((608I! !Nbcu"cu/|e|L(a A)j_"h⺮9=TO0("1,pςr̗w*rֈԲn0D5ȕ\SZsۺ!4h`a`sj,rnka1abb6|V5麬% ^)et_aӻ8t~N1hVZ&Rl;՚0Яu6Jd7Y, pUd(KBCW8Ѫ@֚$UƃHk-Z+hLFJb0 mIQ۶Q !l Pф%纮.b wXQ d%,T5GFk<^0mǵnt3+"%ԺjYة =-o!NUSc0{EfR[>5wyժ<qvγ0XW-b֗\޻RrYt:Ni:m-3OIkqsBm`UoJM\K] ,WqZ7 iGZZ=?n*NF{f{<)?}QW{z:_.ljQX d*yv0/Z,pZ`5S U"Jd޹!F)ej'P[1qɵJĺIA{1Q>Wy(.^X+)fo H늣:"$0]͜E"V>܊m}}8~7gqlW|B߄8WJB:\H!D(Oc⒋ KϐZ r9j]u[ӲnpC QgB i"{ȉ9Ctέ`U xq{a6h1$/X8&(.m[!NRJ[J<6/8H0vέJDN < S ͂;[d<|Isj0 [KAD,3+x'XN 4T(ct;'0L9] -u*ibߋLYiRRjYT&xGP*AAxXHa)+"˹?@蜯bh CơirW`׵,+؟!DcXe^fM sB礑:되lj1zd?#/LoË_.+E&Oݧ_\_CmݍTE, zD ðcs٨jvيXqa#cߧ~RK_Zi\{N)?==Ra?"jI\k|${.(xX-U55ktLq9tcYDikd"}>)%ZvU>`$vBZTSU-{ZM,5:M\Yh 57C֘zloZ٬8?洽_~?w~4 xߺ[ͬQc т:M>|\Zl)⺥6c."' zYLPu]#^֥m5ܦ0Y;O-k).̪lV@d22yfY5C}Óa0͏1uŴeгa*doo˲w>֭9pHed8֠uqL9W*.!rNqض[7j>}hKF|V~~0A x6LjlV_Pp?CV6|M8Ժ 4m6 ݞQ߷TbaeapN[@27#5 !@YjLeA)u]ωT᪔: ta-Yq"n&q-Y )WNu<ܿ/:*1DfjU΍@h]1lHjѺ:\EXDB[{v5V7[ʌ@1b4wy0M| 2OOTk>Znoi祔t{{_̰) 05!=veKx{T,缘9FC9+S9B9|2&p,0Ʃkem;HQkéֵ+"e`h \f%9?׃Zގ٬9~ ٴI81 mcܣBq/'1'c(̘ KA ⎺"Hyx&#*.jjsab*ivF4hSU6șykδN26LDň0)ffO䍔ɈI- 1H-fȱIPÁY4{zY"H6't!1ݢ].$q*LH@ u(R/꽗1U0I(Y- fg5çT7RT*4C]H:s`1;Bj ?;bfk<J&Ҝj93Ls%bq€ 9q)RZY\~xݱߒpz 3."XVT2= X֢fLraD[ $g gß cUy"b~./ +6avbAN-eD_Xl8j%LT UCه-ѩI)d&HdE\C,ŋ۶qBjSJt:\?#3zDhT{6s9gpB9Z=5zo^RD CdPV3͹]r8TyayJL h$ %?1f>|LhDd,^|1-kךy^ط bZ7DKNoÇOR{:B@|3H}#ڵa<=UrHd"r̡'ayxٛfh+㞫|E ZO+dfXuo ӆn_Qq-E_{g~yy:~[%@w5_;1fa"۬'|6/"$.2}"^C]\I3>pdSS~C` ^7ˈQ̌E4Dz0̗ 㝅ca8ޗZj8xT,U)'@}O{.ol{B^2׷}PhH3%r9gJO ޙ2!J9xo>,b"#ٌ,$Cw)pm[WLvo[iabH"QSl[vݮkReS*n|{{v۶/^JZA9;@|8Sbvd4,bJpn JPaX_.gabppl0rVDTBf,JM Eu@#8mW;bG;4ԔjY0\;0+DR ,YN٣5az]zNgįpmWb`h0F&pI{pY\,@ƈVm1Ԭ: êcC2\b;5aڨӺuC\)=mH\.SxmP$ 3 ؀gqcx-,;\${kL\4+0G=K㦡4W1MEw,c,féa ` Ϣ.SMlZ8$ߔ.W6Q+=~"HBaTE]ςK0܄dXBWsjD⃫,-IɒӮazy8~[A>WuOoL0ngHc$"e]臣h5.&b(↔}9'f4vhD\M5c{= [2Z*$SS kOD,"*Z$ s#Gp\޾}!G.?CM62RK3ACYw떜P_.K(m[ٶps<{4MVlJa4{o/Z ɀw/5u^Tv>"xUtJe1n; ^bpTgdWe8f/ qS-DLq#^l禞u# j-@S?((?0N5;?Ꮘx~j1 ,>Zef !ղk7 a=V'}/^[ ljJvHX(b=P#,W--f)j2_laJ\ʹ'`x%dD"xn#iK۵!trDdYڹ:j`"±ވ֜0>js{N 16DBհ?x6ЯքJNc6k rؗE$Akɹx$E:86e: fI{2plx6u DdR9Q2v#, e8 )RD"[mM.gBs ׏ՇS-kcX ZMǶ/"4JkO\m%OZdFBŝNeY޾};1s!fjr?O>u]tc)5a[& `dR5"f&fqR4NسC,2_n"TK.%pts9_~I>$3ܖ(e&*5aJ׆֕%K-;PfPHq6Tژ'S؁;hFjeZE>P&4SߠDjUAé1PԪ`"Fy:79Rx?V*;b` ZL\W*Mj:Ϊe.wZNǨTE9!IqXՌpضJ̼cJŇqz5>7X݌sCgƽs}»إ33rkKYJ^IZ\=!"K%=j~ 5f&n(e=!U E=TMM[ÈɏiVXt$Ӻ]$MO^7vLٴկzTb/^ܯ <_m&XExuzvS8|@ܯگ:ce͛7y?DfIF8:t}Nt(i\UVQ9Le(vNe~fcuEV*څO)$/Oz~Ev^N=oGFKh WoYYQ :jܮNSELVУuC/vD,^5+Y^|̭:7H+xYvnlub̤u!ڛvmMsbjLdw/dL&,NkbvFueba+^hl!S}P u_W,fRuC@Kf`JV;ܒZ ]osjbPBfMǍnΏf FX, cM$d>^,] `m$41L4œ\򹖥Ͻ7wwΑٶE0T☛F%6o/DJIM +fcYV&W!(N}KHEFYÿ/|x>sXͧιZ붭pq! &zxx<qmmt{{9ZK`a~:OP`dۚ9,n]d!7<&jJa = !p  P h{ZR>AfVP,#D-r3m`G?2ik)ĚAg_h7U)s#v fA lpw"ɖ\ )z>7&f dU廎`zOз^mChdƲ7CgFCTxEvCCeHĥӂBϬ ZSzK3V%NJU#L\T˱mPzQĪkkء=瓉 vX,i!WI7&slĬ"4 pss-{nAjF|b!Gu{| R&ǿ(~>8T#@֢ 2Z(~+G5x{ ӁYjEE5-vݹH$\?FFI@Dn⢈G$+{ < d*%P}?==><,KNO߿Ǧi" +|Od&AQ؆nH\/>U6-Е&T@OCk?Zс*M^}!p 5#WX@"=hZ.?r{,7 Ej}ݟ+}ƞ(CnЇcX%@상&3m 7r?u_+ lŒC>9MmCcRfo|WrwxVÔsypg 332;y Uk*Bۖ TwחeA(`D `hr)x͍8 ~?;]X+> XmږX#X1>?"Ye->[Aڴz {6Íu_{)TSKkרuwF54w ~s *bNi %'P7YA]OZ]0CkQ"lVbq([MQw?_+˻g J>Ta Qe"!]فh$5ԏ.LሌEzZxT AߪQozaʮ:]D0&2c筷a VNRqbӊ}E7`$ro^(t;l;o99Rޤi1%?_[idBf&B4֖ޱHOid}7N{F,g=_lqݺpb;O$#c\5H3Q˳u*]< 9֮n8h],܎Ⱍ[s]#qIPzO>&m$Un, zӌ7=7_}Cdן|Z)tC1 |U'c\hquu9!D}(ơz{{ 0Dn+:QyU2p{ S~~( {ȩMQ;ĦEv1VR-j94s(|>,6ͪU|=[jXY.TnUƄR3-#2U7:^IX7񢑑V@j]fGh|R:PʅYͭjޓ w*L+'<=ާ+n S[7:pG<jܦˎ}f31Hja7¡곌ϼFfd3d~jjB2xmX'C*VP>3rLoM \A1߂4kYSz훿~$2abd262VDeɹ;[J-;e!ZW@k:-oe6+~ЦKK\/i6==P|YsО-xzr8zwө堵ɭuO{AroMơGI;}g@G7 jBf3v$0);Odpnֵi޻4q]Q}4'p 88.˲p)e^J)"D_2U qǸBiF^B@ +fGuܾ&.a@ѼS5ή/>'dSw<}>&=P緡k_(@n; mq#FiTpJ2곓J?{ SQ-aͻHj]DͬKkg^`"k7)X-FWHwZ⺇[(BЄKVlin"Q8D \/`=MLmW%R@[ go6|Uv%4)eM3&?s߸҆10mI^Vd`DZ58 ØK.%RcaLa|5>@M5$ m175U s}qz35@jsgdZY! fMKe_۵mjչ%8t@$eaW늁fr>7/o/Dt\M<>>1q9ק'zss1x:Di^f>iE|5!jޟ_uVo=7ضrYa0 Ċ gV2/7oBqYR7Tm߿{緷'vvA9@WIrI:@8ADwaO'gE7\2k{} ָᱻ:i@Z?)VtI+Nf, ;k[VCۀB> ` @uMbCm ~;lpFm&h]ZF d`T~ԯ[ӖVY冟K+Q'"M@lj:.:X0^ο TRfϹhaB6 k2Dj?x}kC[SI"!]U+76LO2֭wێ5' j S]2);~;KΪB8˲"EDܺ.9 m0Φ@FH9R۷os-"AaP@|cs-s9V$˻<<_ךs}Dmٟܾ۟V࣬umV֮LoH A$ѽ"&XlO@_ wH诉Tbkw٨mI=݈ܺzUd[,Sm.陟8jǾ$RݠhR䱡Fy_wPuCCc6vzlXǽif"ƬVkB:YXW[kk[ *fM1!!V~`V_rxo|b$tYb'{OۍUɶBS?Ժv׼e̵ϰnްn6l;ꎍgvXPϿm !@Sbo@ќrΠ\O]8Կm#$jY:jnF{u|7s}ڤ}80!+A(&egRnVqGWz=Y5{hk.F2bt3b&% uK㧿K/{n'_֕SJ<󺬵VdSJIZUUJ'{EeyR*3RDޞN:U;TU>,G?>>AZ_Pm>8ZC, ozW[.6v2] ΂!c Bdh1,zʆЌ"l(zXh'ASZ-׆MIă?٪W x>k "ϯ%^/ڤZ7"_g8(s?ZW)Y7;!{3B-nyB^H_G.)Mm'HZ2_ m^3$u]|}ATK0d ]Sѧޭols-q Q#M8k}m6Zo_mjFO_as%{'m"rU|4'64QcW6Xpt7[}[ %hbrzo}EK%Z.yz/ȴbAx bL\w̰1މ9?&{B;{).jĔK>`D5& ?߄`Gݏ{WBYu~2MViH*E\v kպ8qQa%k/81s«nοa-7ƻ?_hJJ۶ɠ֏a}1ǩZk=t@"+90w3He{zzz||D7̼ E=c6?ircm7yOy'f6,^EŻ۹rBbzzNf6-Z7Əw&7q)>+LĀDhf,Zղ{ƈie_qY71V.LҿGP[Gk#+Pv?.8ifzvw,7]s*U[]JsX$V>oj ϤVk@%">MK1ʨ@7kEε/;foڄdv0raqKV1%`ׇ!^cnd45)pk}iIn Ƣ{JiWL뾗AGR-sΏ;7jɼZ[jx%\r9f-ZJ +󎙩jeu3ZoC* "=.VL˞!wCE]T{6&wub -$~@hB}B|[ Z$wMwȇ% ^n9秼=~{ry||xz:8?Sr{{w{{7s B<3eF ɅLuZ ȹVεBA7q>ƨFH'9ZC3-ixYՊ <p$~ƈSӯ}GtwZ7k@\6oB˻IO$컣^jUob,jxq7\Z,3JaBT+Tz8?E8;3'_ED`kZ旋9eݿSVw;ІԊhue6$S/|?3[Κ8UG&AeƻuOH>kPS ! [WCP'at'Dִw6UɮІ9`}f7?K RZ派~7~l9e"!i%g=Rⵅe?ZkR#˺Z P!/D\IIJBjNɔѲ;:{!Bt?y#H]7fՐ|aNF"ucw"3d.ܸ0tuX[ukB=Zqrֵ//sȼ̮0mJr~꥚kroےG8_ʮmŽq.x<Zup !B`n 9|H]-e7(,kJ`J%}ڤ5RS:sεV" 18L9?<<c];sä=BѶe"Zj^%i>Vck-M9])y$Px*Rs!x5#L)~QG߻yofT\nTyvVY?c buV̵Hڹe 3THaJzm 'I,`g#|jsV;g7Ě5dq n`VCy;eQWpp]oח쐱%*lɉ?Չ`vU:9Cv˕uCS= Hv<@ϒm5 붹(NW^? ֒_7_@(Ue6<"ҪV罪/T!:GSJ?#K?2|$5`@֧&"݉麢?I<3.BvҝNR.gTW!DThxMþ6߆Hi߾U&ZLo|mb-9L)ZTr9\qb$Pn[^ Bo^zCVݶ}^a ^וK)ZcKdR)p$\kui)m"VѫZ8W^ܜxjUf9*43޹aB)mLca(RJt1ƴm0 1o=||Wč]]el Tz=@C'__0eq~B@>xq+YWve6-I(iwϋxlIpS; zmRQ0֚ؕq (Xyqw1Y6'E޸Lwcw$=o&ĭ%fUqW(Be]qO^˯HH4V$蜚l\&sMzfoԦm>m0/5Srx5ãvi I$0ttk}~#ck DLapƈ&wVKvk{sJoo7U5+r 2#y?KQ up\`aܶeY8Ӌ/nSJaq|eYeYK)M?rX~[!Ĕ&##51ℝk#1\b%GߝuGʽܕ<ۺvXe8$3N6Kkݺ07q#ҚqG暁hۢ!Zֵv@SfޡBuG-W@!bZʜË۷N_1\VxF[a6ͬ.US+Ass>#O4)֍xօF:wth_KĽ^kw d1;*&X>XuQ-2KJVolAtԳÝJbMk+ ȱ؅ *=W'AnxJ1N9=|;~Xk%"L)4I&0 8Sca6^99$Zajkd>!]{ʵر^Vt CݷDmWq46O_ 5l /WHNnsȝ4=b\-{pGD%_^=b˲.ˢݽx"<޻oE֊0 9%Dv<xiE7h0p-%+ľ9gRD#MqG1tss4M0ZeǵVSJ1Fq~0 7ei]S:!661D(w?y|8Eܱݮɬ֖ܢp^]=dMvaUk8ܖ n̎ۡGH0^wTʂꦹf cpbIPwuD9ٜdE6ЕMa}n~x*Lf|!KpUvQTCnQhk]KYkv37̤ p\X2ڦ֍%n۫vD]F5uI L> 6XR?OU2!mo>vkU8aFއ|.qj;1Dč+E7r9yr) 靑p?ծ]f4d*~j`MpYdG{ώMv' MɼP5h`BFJYvWA+j1,Ӈ2Lk_?|>W˿Pgےs|<2_Z 3N}М)m[EcmBt@D"TJ]Ri,p8Pp) Um, ڿ'\9_J p:Zk)Zk>x1F>>>z8fra8]d39a] GeY7aiCDopӔΖQw>_!MHL??muUи%mg;fg00Qj,ԫ^ZL=[?Z2ۖ 9g)vZu_uj{Z!WYaW%W1F_*}=+=snkԐ<Ȧv'rg$oمnj%"g%HS>/[x75^\cR/in w4؆ lk 4߭"qCCM<#o1%WU+W!w}~ɴi $-|.)/}w>pΫNMk9efv`Ɛj8; 3@$9q!Df_.moB;5{+Kd}fϔV]nlMpGvnT\9Xz^{ d&k#n 35_gHm8~sS_\և*%NQXu9w#<_u5㔚QB"u]cVbɦr^_7:=䀘g-scuC%T>Ӽ~g4vq۳X1ц͂bimh  9 >J=;;"h]hG 3)ɒ#mM"hњ~20M}P5ԑ:#=_ q ̒SNo~*1;a*53癉Tշp˹`Fcېs\_EtnZM7g"ɚr1G;c~~j=ef nA:[f*Ye3]ʵ>|ڞ {3qQ$spkOwOoį~}3`|~tib$O?}Cd!̓|̰jݝN7|~޽uV[ivKl翣UI{4k{XrIHn,M# u ~;V~ `zvLWv7XRT-m;vNg;.\'tHK%ݵ-ξ8t- (ag=^hu="JC})AL}OM pUě6PH>hX>y K|օ߅vewoy7]T NW9ڜ [Ҷqs>8G'm+D .Ր 0(0bRQ/yq4W"}]r)HkD<(];"w3{^n+" v3V H>Zr@ m*ֺۤ, Ƞ˂T-uF"8붝ka'ŇP G[-0'/^˿SorkD~bTc"r{Mw}%!2CWŽ{=H# zNޙE}3oR3f&G Cc`k)ףYɐb̩:Ih5Е%PkDzǽcO75B"k X +܅ ݇.?׶&k"sHL_ӏ;2+)o_|omێǣ5^ة꺮;>1>q1sF;ߝdu33fm@J $jOo_xnX;dpc{g C=vjzsyLK-=pOZF/K!$ډ{):fy:37Y;aw5CvNk&݁Er ZL~#=Yv),C:n;^XtUv}Q{ζgw024C bWzhK|5[8]§N>"r!/}} +R C:!dMɝҦ U 1q,q9N{ <%TJ8q✋ѣٿ>۴uvղ5T{n˳Jn)E2W]Mx$6&e'nAl;[}ڀͧ@l<ޝ>9|Kb9 V}||X6fŋmK![9n ]{p8O9kq.RU׀9L;瞞 4c,ǟt 0:G͠Dc)z8 -z)pHqxg8 3qHgZ}oJhml iggwOp[0f0^6;&z iױ.lp<쩛fqS>/4SUp5|/H{slV+Mڄ=F6)5ҳ0>h\#籫=zwWS4!I_m73v|^h.X";TOWL5C7dvc'`ZOr0S=Pev%1!ۘ`G<:(nٺ-ispV,a%1~w> W_3SSZN)VM)9/N]-,0Р9QJιTDh^YJ0l۶,~'ۯpOG*.tݎ=[wSWAk n tRjCHAg~A"_7~itO 1g­]C!Wo3xE2CyVW<7770\e1Zw߁8g"xM7iLJ'f~~[[s{w.N'@~B0bus>̼ Z[)9{Cy|林#F岈9F!BWbf,uCed9?n_0y'9yQCcfNZJp9oD"M4Aq1콏1J9SJOo>:]zQ>c=in4P-]@#bxsӿ`z!}vՉʷgN-2?&-ZFFɬxs|aWO9Hi9oN7L߾}3\Rp3a]Z~[]g;{yk-e/X97s,+Cpx_ .xww_JaHk`st:*Bm+hI){WJٶ kq&:붮+%0CT8ɥ0S)?)?{= e>*ٞ8+ftq)Ь w@ 5ui|ʭWgqM8+6[{ X`\ۥMG R@ZiӿՖ6%poy77;G,"@&dtEi6o7,N-jO?u5XV{=J];>7ٕ+v-2F24˞ZƵ0=C?"ii{t>7[R-1F-[9λ8N۶=>>@BضYjۺ~3-EȲ/K)Ň&9ey^nN'|own[?Kl<Сg ^~V~^p7O|}c~4jfܽN ObA;pzNE q1Ǐ/L_ZZs2}Om۰L}իW8n[3`]Z5D\JY30L=YƘ)RK畈_x!NaXUk-۶!48y!bBmM~?yopڣZo)mT^6rzͪiO}o K8 ݀#ҹѴ61 Bp g{\<]_۲Ka/h;zTHvnz>n|Ge4Lw5){3%YW{s#+k<$.LkYT=b'$Ld>*&n"rru 67=MxnE J¤NKt(=yw}3 /,b~r:bT|>/|>e Cm[T5_.8m)t<<y^x<\r.",`eSRx_r6R*RtF= )s=8ۨ+JݶACXUA{|&|>߿|W?3fS%w`ԫ-[xlOVjo~4 (;׆ۃ:' אRִ3fC)6kmžTFb;`7Lu5VsطAݔ`+\b0޷Uom|s]ۂږ劍=m`W;[uQ)jYs}\ WѮX33)͈k1!; Y$G3c`8?Ӛp՜7i ~[OsfR2kdx {Zrҙ2M8x: )gMUZq1F cϯ?M?DUY~=:`jy){a)P;f"I$4U-,^dq+aG}ܙjWC(s$7G_ٜs-&d&ba'|rwwwwww8`駯/Kܶ%0u#"BW۷˲n .>Ɣn2$`#"q=-̌ _.DOCD~:Lp!m]q?'.0"O\FG~unxؖ~*ifmYpajL`%bBö ''IOӦ}"XCڗr졡nAz"qGч0"WI8_i=K$0{t.7(Ywy"H}{ :nXXڎt.({ˈ _4]JUاPӇ]~1GUucI aOoJW9YUN7ﶭRT֪Z8xDJ)OOaYu]4ú̿/ON_sn,Bk=e=.E"Ph򘝸Yq~ O_m"y.= HWsz :$U$<9/~4A˽IxU3$L !" Z\6F[ǸWlݱeV'Զ;`a@{^a⪉ֺPefnS*j,md{AV~k+P3jsb>7Z>ۺuxiq3m_LEԲ0Z\AWo߽Ev-z\+qj-Ȏ q%;q?>>";Ov;q>yqDCycwUu)mه̵*c𾪚4 ^t_/kOfOs@-N4u 2.g쓂*tNK*ag}Ff3q,CKϞybTY h~K_|gYfŋnla 8 t\וc2Z?5tU ;9|>yF>>傴.Jm9g:lf>R !~i)x8ݺffzz:GUմ9]w2/ )0N1eYn6S8B1ķoV 㺬xD8Zԇi-UXk!W\lK ߻52UCV})YXWMDLmKy`{<Nu]h.9)8 U8ϳNӁZkaV3}V#IM8XEU]סL8֪ĤմVDցNUl࿆^SXTSJLCē`d"46pi2ҜrQc\)u^LVmYab4M!PW"x'rxrʹn:kWK_knFdc樘4jE^+`y{IQ+9j@ڋLӖD$ƘR^,4)%Ȧ@T*m܇q?<<LJrFxfc`Zs!s>ݲ˺zǧ~Y.bRZٟq!w9K²,)0Mׯ4WЕ j1Ӊ|Yjچ䄽h' x\meYҖnoOasb}z|©eKTnDZcs8I_O},^m&!]PqF/˲5kxr Zsմ.)MӨؼi֊TǧGT9RMtb Pxkpsjudf:d(eMSJjV̰9FȖömbj/aɶf\\²MD.ٿr6W^ժn|qݶ8 "C /?x<|4c)N㲮8TKryxᝪe]\C ).!zKyލ㰮iR2>x\Q͈huY87o^c 1Ĕr.LEy9߭a[yq fF8Չ;@腝sW?Q!~ipOKOI$9!ZEp:u@ #i]79!xU0;ڶ ,I͖eq!Qڲ.D4HđٲXT:+kjd[LuK\1v\c`G'{,;9m[6j 77ZJNXUFx;Vd0CLZ4LT5ƀ['r8L̴m,8 `J/_8)mөZy m"/%c'"|{{˘Yua|~Rm;[J뜊 N4*dU Ji^|wKb*y)%{'euۻG"w_AK)BԌGID%太LVV"RZ!O\檕LO770< 8. 'c\/_8>}a9OOionooN72x{s}֢FiD\)9,k"0$# %XeAks=|HRڜcqF@y4M9eYij|8iQmm a~0MMRHJHɻ1RrrܜaMp>_.4mKI4 C _nN06཰ZpّYUDt{{1A/UQUKՀaTO!yK"fdbtX۷<;qOrlavkm<;M8úZk:JZ`H3vΫ)!qcӉ/''n77{3/2ibbuqh]|QYU} |䜗elW朻5WC2m1U9V3UEHb'  l^E"LqfU*EuhK;I !KIj-wq8zJ! 0֜Rk1e]m۶m;_Ψrʥ䔒s,y[cc圛V!ҢƭRUE{֚R>jFJqU,̰,s3wGonN0"ZӶfz>_m) ҁ/&чщyYt:b0p\RZE$89bB D)u]RKAV<ι|t?3eaU,˪Z̨b8>̙Lx8šOs70LN/g{x1<FUͧ˼<<<ҶRmKiKo޾}|x\.„O_x !UtFm[)1B8sf{ǟ9\ffիa~}7772cfÄCDj-)Rʺ}8^|!$"o0]%"l}q4%Ƅa# T4M8咙x]7z8L,˲,:#-h-<֥uݜ q!cX׵ Mֺm[ ;1e]q,%*"1~[7K{6D{'RUb^x:n1qsNjjd:38Iis̨'f}P՜0!eYUuW71/*N>ze 1z YfZ 2>ZJψBb,s1PJbqy=cfD!a,犢}XLs.)%Pz'|,Z sֺtt wUrm'$A~w*1BXAϔs 'pCBDo4MfJfS9C#ooo>qYO]s%Cq?wBUHeK!ơԚsRS&{q8Ndv\w\ lvNPOB4V3!*uy!Rjt<uٶ {9t{ʥte-_Uފ!Y<  f5r8?AǮ C\|8ͺmv8_a ޭoB!Ê;1 t֊蜳s;π9? PQRe#4}bJF6YjȪDv+N'Qk8UQbu<y~|G۶a rAWg\۶$.`WOOO۶S\]pN7"#'{1ƛS) B7D}8{aOOOj6Ne%qNF6'Ma4xgf c54N)Rk%`c 1TZ J9䔷uaf5K[ZֵjUk-^.O뺖\,mrNɛRѿ8 1ZJ77ιm[8K9m:M"8xg A|MyP c[J !ƀG7D!0xc9t(މȼ,pKDg]t1u>0²| q>ܜC2,Lt{w\˺.i|bAUkɵ<31O7RjJ)m)e!D𳠥C5ǽba(Mu0ۖj ;yZ0RooouyZ_ܿZLu+9w)̗yV58f<>y/%3u"?@nHa p`q!}Dۼ(ӂ,J)!a뺅bo,:A@ s(|Tڙ1ly||bjfxZ-3G5scU]y]gfw<p;B fIՊu\<8S0ZM\ {׼eLg"¨tU9!Rb0piFaYf}kJs yƼkfkg)8R2Qd?~R!ƐRFz4p2Ӳ PĆo˲x@}udn*R!%_9#zCE9G)5AY)5 ٔRc8cis 0L5UJ5od㦴hs^ZZik-x!6<9g{JKkMֺ5^.Ƙ5V q{{kL9&A++7-0!?׌{Yk4T7DGBk@$d[ƧNR'T 5xA {c qkVR ReY0[0lۑR6F 1޼ )ExZ.95Be*kY BBg9WJcwmRcȜZqhmyj_s1J 1}K)3Ƭu/$-j-VԎKo2[c[g\ZκRʇ(!<uc^ @41Z9BNJKm AY7dp1UT7zSFJd\FiT&TJF9Zg%58c !%qzE!ҺVJn׽59~6Š֜R Zd%>O3ZJ z#<KC.Y E;# \tRsٵi_{]OEeRyu9J9RRk2U_? =Z+HrεVhp!CQ4X(1dZVX C7ƞj6noއrKcek9g7;:Ϲ1jeF1? *}e]>?m+Jևr|R|<!XcJ1Zʩw!1J)G:J.>1B\ sn:$Zs̬mYK>pIJǑyZQ),*x)[S/w.8c3'ȏ|Z<^)ڰo k{8A#i}V%469#f&cLF YJ鏫*)coCJ?ޙKr2Aʅ3GLn'|Du][Jy^ <[{5h8jj<)io@BXgV8a6ZT=ZSnk%̼r()[:3.+=OnT朧8Y9?D+3RIg)Ѧvի}!Roo9Je&5S5\jUJv{{ִ޽WDZ3TJbr[BtkLJSC:RJ<{hLY+eٞ'Tc5BJI)5Mhr$CVSJvfRFze>V<4M___X5iVJz}꿵:=3/HDv`%~; !r< p[kRLsrJZ!k<(HGkq(`R:v:g'ַ#%\ւqGڶ-蜯~1Q)e?v΅u]k)Ry8t=Ơ1~Oz1^ ` 9ч~-$+1vmI@P9g@?4NO0ZJIn|@,O%.C|•/@UJ_ܷ;urT"k?qa|6u@{ $VrasHZk1\.Z10IJID6z~Zc{7FqI)=ŨΈ1rRJ]/2c:!9S ~/7΂RR ) 1JZe6V!SNܸa}U#Z#yqhCDR罐CI 4ƀZw*4!hZkA pt;'!0qGe%sUsb„1 ^N$kRT֦q¡OOWuk5QJ?||,a}nrckMI5MX[kmJh1h΅rksBk8|" \d˨,T)A51f4ZVo:votkqg:+J) ѵxt!i<{k-O<} g1:M)%jvkRJb_ץBT^UpҰZ,cmdBιX3M3xBOLk-ܽg+ҵ Ey%qֹћRјh=D֚6T UZU >ƙ>??}[S9!mg 2V/li)X10bUr(-zqJ۶;~xw*0a#Š_rE[K !(?`&&v)hߏ!\!~cg,aqWZNSRJDqF uT RШsu7fe1ƺ.DZb@j#qXJ1FcR jaƀw3]Xf1N^9<H ?>> K) 1iz"5!@u5QwLZq=wj<甔V@Fu]F,ko]JUk&j ǑSF4E!Tr2ܔ8bB慄Y&mF9V:ko7zkJiT**w yKcޏ#x~9R(7Y4AkT֪cэz"gX)B>'"ؔ@wo`D+g&34-wأzSPgfO)M9`뺆ރVD$ra|csVk(FT)uĺx>>>>~bNZ圽J߶'(JIQJM)b&k4MZkXBZOk,jq I۶W7ƄSʽC)8H* emb-]Jq\8Dq`2: ! w!ƀF##2;gY j)/ #feQRc |>HJ 9Z:G=iYD.7sIi7-EC L ih#vn]ןuET?Keߟz!sJ1җa6bJ9c}{⪵N)pC[w>n-[1Fm]w^*E4B`U5Y V^.֚ؿ_CIT^KBXץҗ`=T+5nq%(%vyJѐDL8`+sru;%%s{<XsN+:CUC؀C1 EH݀Sjç֒R"!Ui/[k&[kI)xjB &ޏR9R!`&H܀!a dm:gJ T`s CjpCZG恔Z RV9#6Ji|bZ[4EUzo!LPo*Rff{J8mRV* hNa)眼wB*VjK?ԘuJiH֊_u! !QR @1!D:ޛц??~>OmLO%a:_~XkcJ+&F1cub'uTŋ[g"k,֛q+|Y4nmۘ8.k|`>!rZk}:uNcACD˺^.Kc 1`"qCkELL$Iݽ1j}j<.r)v0fAƸz 9 圞'Q#jgIc4/#[cd bC\K5s ajog#kZnۆDB:4FD$~#R4E5'2#hm8RBwnlAs?N#mY⃛ygfԈѪ*~?H _MR ~'xi XJ%gdxawP%mR֠RYcLlnom$9G0,}˲XksND D!F57@,8%pO@@) !xp$qmb `?~` R)LιN\2Z޿>F˺jrS)r,Rrl{}D-qTec*Jh*iDZ3sΩ˲.4O9\rg֕zXuYftιqhzmԾqX9wz |5|`)Sʕ@6j0YggbVbk!D XJk5 !]ɓJ)gM`G;QǑ^D81:)eΐYD =|ZD;SxcT "ZJ !ZaŻ5 ,p !EgW(cvCw(,/C !%hܱӌ{3s\ \o3FcYçTj1:ׄ5ZHјҿ5KdAػ|dH?1m`|J)xf1RJ!D\nQ12!+dTh}Q!~ Ee6yHmM9IBc5uVk=JU i2!wƏ˲m33ogJɜqκ!!8Y1Q%B iއ~J JRr@Nɐ@ xpVm `4fy T eY7,{*ZR*:jo\3ŠK)e̸i _Yk֥`bJ gRmOS`8{]jlD"WJ JqJms>RNbp_S|RR~s{ J*!70Oޤ__'}jprU>Z8Z)c0 $Z)5(bSZTbqLݻlx[{{41[cTk·RJ EDƚRHR*19mۼ|ia[5xs\qRkS1@ 3 (m]ct.Y WJqzGY~~`ZXo_뺖m\iZByYrDZ늀h-yǾU#qkk-zYupeB8g{۶T*2ŗ|Sb/6Z+ RѮk+9#VKZ ֎-3 GZi)F%HC>,F4X: :yRZ>WP@cCޤal+yfy^zbנVֺ!ھ',dQ vl Z\K)c<ࣔX "ƸLL1lXB~;T{J,kJ:}N aZ1Jj|>ro4@@=5󾔜s^9h!"uHJ1J)JJSJ ̈+<OCeRI> 1zL%g!uvܶVf19cx ,LU-Z5,sZ >v; Zsޜ 9sZx(1Rr>nf ":^%ﰲClʿ[49(Z D=׷m)Uq ^jP |Gpg䜈(DMӌ\[:JÁL!:s9C)wf蝵ΙӶ20 (s5*0QK)G3@eR"îs1LӟtRGk[N S.:.m9eV νeyίZ S/r* 7T&eYenȟE .hyVR眤F[bڶGmTI 9z8;ɩ nJR>?eYPi >IZ7-[k=Qg5t4RJM9mW}t"Ԃ8#{9)5fZkhFÞ13 138,9wj{vTjF@ثoRRj(`r^`}%1"J$:[̊NJ<1FkuykI^@uSJR1FZa>~suPbB[o܈1sJc RLdJk3;kiBaѾ۾~ߏ}?6x}9>u -ZcOJi󧉲mۓ[JǑ Rl#"vq[g1>JJ+BS:BDC W d =YcR ɾ΍j۶ ѽU䜇Sk-zlis\Z1_7 DdZo Lv{^l)-(~)*l(Zz?im_ BE)mB TֺRJ~5CX@Yk/qjP``q! 1J $oC9st aWZ NW9bփ{'ZOS4䔧iBY;NRI]J.Lz1[c)Y$j53W.Th:E#,fwۭRӺ_ 0!bsRV4y T䝵8^Ek蝵e~[c,jm5J*ܷޭu`oZ!?@r!`aY2ƌ06C+pރHp')miNJ%4`d;iBQ&dOb/D[//y;ԹsRRsN0!V@(NN4:<_z7i84M 5dVJYg3CH9g 1\K%xg0 íu˨:_ )b8D; T糩Mk9zރqkcRcaa"*ZcLN%#8U!OGRReft.TBJ4,VG9Zw93V=8q&\{cJeES +ֈ1zw:3JgxIR*bF  : no>MZ4*䝇T۶mSaCh-#d )Eao.+,녨W!UWrbza(|yRi(8Vs0H}KqZ=ZBȬH()BR!Lr>L Z+{BGjX)Nky!ej )Kέqo?~)Z ׏*n!h=rɐ1{fTFQ*^.[>4O_j# A|Zio;1!>?~N~}:焐2JD:XqJ)ZJv(cӑX|>{/%z]/۶ )HG34 GJMIVt21D rc@ m{Rj-+ ֢ ;8l{oxwc6b4"bcG)9 oǿocy@)J!D!/$P Q+Ѷ"ɦ(`7%%9JIc@S*Mq6Vt(e(dcg1Ƹm;smIs}]ל#MF)|>:d"Bʷ P2LTJ*j]$FVnOw֝J6`cDB REcB*Cek;Δ 'K 2K8c𡔢jR`?+B(JHb(cL̃{SE8圩VTй Tu+c )*%{m3#9||!iȭnXr>!*UdzSujg%ܷrYCU$czo pZc-i5#zk?~t1].RJk]D޻RH#`"Rz'8J1{6h^1MZK%I6L1zL;TXkkm~0"[k=11jwN)u]CZߢ>ka/\Z ӌQ)Cng +<}_ELkw(Zla4F眍(ΑRCJ$ho%"$ģJj%kէqV((X!a.G3Z)U  8Rk ]#0b~hPj()(^< 9h=S<8h÷w"l; H\JkS.6:2MsxPҮqhsAzNx>R(ĪH)Zi<Ф3QIXhJi} {gn|Y1\EQKy<6n b 5{ico+8ـ@̢{YkeT>%0޹y ;Ȍb YVkM\ R<͸c< dW8{Tkf%nƀtq itCx;H@_krn&!D- wy'ضTJ,ReYTm4ڬZK{{޻ :cF+mI) )J Q֘ژZqNJ(̬9OvGA.d_ /w8p盓^mgspZ=n {+%>cgv9k8Yu9d;,nsœ*^ߝ\.OG[\{y0`gyx*|Ym{c8ȷ ^wzŷg.9h{ss\D=[u9X΅n-?rvz+O8AƟ_a戙}pY[alhz߇0NvNzѐ! %psޜqsp =nn0{[hc;r9uwGQOl#i]y|BNfychs 6(Za姟K )>e9eȋ~hGGG7!/datv6k&9 ě]0/_@lP}gه8 ;kPm"%Dv9l0 G ӽm[5'\~8tg_?/[Pޠ Y/Go=|ϡb!#39'''0A|%47G< S99<u.շPHޟrqƄ=snq^9ze} Xbg8|i dpynj@tsN`Qd7!]h1Fgx P;A؀`nHQBȤNAH,pied8=pqwȀ<+ @|!xTI rd9鷒;/.r#Mhikct7'(V YC>;7_oP9 ac V-T =/OW78$t7؉gzͣR 8\[Pr+d9ƍ}MТ/r<p DO$ҠE'Ž]T@C[w42a)xO63&I`!,S1r<zkziaן]}^eS pV\"p m?wx7 }DIx^M.兰G#P`s!Յǐ5 mGo/;7DowW4JN>cƝ'q9ï@=`JkqI7"_dC Ih šѵg#kP uhtƼBfhv2hiN3ң9nWd$J97'2:F/~eTL_ ~v8Fsȝ\S_H=Lf( m.<`6cDl$qoqwg 1$ǀ gFȚ_u~-WFqmz6= -(>*aY "ce74Ӎxbi!u@ʿC0$<~Zvk =l 6VCٿua.O*~ӉҚ`KW]vda @TH+Cig%Gp "!aP& KN3{bB"E*ena2%(`(;`܄_: o{W&lɃi?</i|qHX3ШC~ry0 t"<ƺ P0rgaZJ0$q,"$3ͷ>X;; 9 ^yoRZWd"#aOp6"~8?@ ̔D>< @>__bG@9Qoeì|=utyuS+=)2aax0Cr\pjAi seY/aY.6l`DȔIa~~}`2Bk +XQ%z?r xB<3Lu8,1;#AƋ !dFDP -jZ_xtzX "oKVڸ^?6f(2mug'xP OsR9ŊԐsNO֛𫎎~縐a!^rsNgsH}[MK= h]_z}Ͽ\ h.jĦ A8ltZ/N (xx)>0;xAv: 7jT6ar}jEv0 t([_"B.R[2VAŜsw=vk܀Xa2u5$r<Y9h4 _z~!>o-SՁ* *B\x QW#SE'NO/6A`0 Ձr_BKv ׎_-u%} JzD Zj#\BM] y~ܐ#n7m9;~f@$U(ι dw7 x6OBR T|C0a`HG*.yL^W6B/fGB;a"#lч[bl^ėPKί@9i@; npMv;+'pAEx`أq!ru|bqm#e8O] EYSfEs3*'i1^{Sy[Ul|'@plP?lqWa9&^}1ǟNƀtꋉ+E$ fNRE@@{[ ׁ֡lp*/Wr3aPX( Weіź(F!`nUN(}fO o;R hy a!!h{F"5r1gAHW Eˆ׊j9@Q~Od9 @BW kܒk6tg'\̉،Bơ$ìH된bڸ!v}E5#n cd(|na*QDRPSzB(KR '_C5Z'x2DZ/SXKW9IvBXPBRKZ\N bMNiWVxo7W*eSOqZ؀o޸ wOPH{FkDi83bTC<%rqKd A#BCS` LUo@yZGufqlfõeUZd JcD&6D{1 p5q62DL6ӥ+b?1$ʄ:5L{[@'v A[ x3|L7tAIfE ͨ-Ǚ'&46"D.|rO49h?UN$q$4!#xRZ\78j:<..0>&?y Q2a4؜0bSkC|͗'::ifl ؇C>e(0pؑ "+qe( @pғO p& čIJƼ2qcgmTh8 *̙j!e@ъ e$x1ycXhn:7hҹ\"rg'Pꐰ1Of !LdU3 O!_]I<2џVhߧ병n57^P1?yjcO.ʐz67 B(^'|nF[L!½p\^|јqeEWyH4 `Iÿ_ Tb<A{I:t3`  E1``gQy&B><*0SGsȯA+&X1-0tq%^*F5rP*E1A_ Nc9V^6*̴ +|%%^#CoX[EH ӫ$C?KL "kSwٌfޓ 09KhY'N!񣛥%z#=q!mcxE"f̸/8MsЖ0kȤ=W5PURtbs>"Ђby564R 0bM:*( "B?z}wҁQ& 4ut4I20ЮIi2E&TУ ƐيO(ZxRs.&A9HCr'%B$qh)an: B!ɢY ,~fF?n"j3:ߺr ?gؑƏ=;d=ŧ'YEOKR6qʯҷδh A* NK0 k2CӅ "_G}*8*TM!(ҷֈҭΔ+ wHC4x.P$\l8L6ui5b5{@-Ӡ S|0^(0`XyFߠiO] 8f=ڏw @3&̶xCVj]~1}M Ma㼼/8&#B0S=;m& TQ C EGkr4P5P)H,g&ӸǒqY+%hC z6nS4W+KTj]U h۰2YdځDH"R*:$* s|! u~~{iđ#i"%*.s%3tO& H!FDTx't5ԉZZ"zQq _OhFxW^rR%V@ψ/h0Tc^ĺ.Vɀ`a͜Jc<(Ыd%S73OnLZb݈ˇ2({Љ`Of,hmһx.T߬5Yt)Qy F-Q'*T 3#=DzGVF ޟzU9>jla3U/?\Xc&s*߱z]?\!]qN#1  s;j`-f !eG U( 5nlID%p]L{6>e[c8-=8m3iWGM/|l5ZPςwLYӃn4T"oQ 7FDHlSICI1=C!)+D{U&(_P qUfwF^L)=Ȼ[cc/gR@ )q$;V[Ibi7@LIS- t$`Ϗ gF 5GN4AR8Hc4QZQ晑|#J̍V)l@+8QN=Q%aun]]]fRLt3;-ceZ~[]|ȋUjx+nz G޴Xb1Ẁm󪯙ޖck}IͼZ7nh$pa c@p_y/3h295d!U +B7ʾ2a2X0R@/{&-ʆsLRgn,1M)e֐Wq`#P&Y]hQiX]+ s(~@-r4}K/yQ!0~LabZ5 +DS9F6F' n,\LaJWvp8.?,(5YNdƌh L4ҁf7@V)tpW̿7-D#bE,B3!3iO uhǗV4U,ŮAFm|LVJ}}uLSg[sG'^,֡'iBgҐ(+PlQS<#!E%DimBZ o `+N&v8hUgGӰ WQ~D5>۵.8b5,EjW7!+r(2A6/hFQ<n4FȦA\#D\)6E;VA_3̩s@u,oxmBGݰ pjD$@Gbi 0$6p%>#|x`hr29elo bٞܟBjjw*ѩ<֍6WAd\ &YQ}5MNnav/QըtgS0aSXgtw2KIZJ}$*%klgjIJyqh?"dsמW k)1,m\SS8E^G=F= X];A*ո  8#c=@!% gEq caX5X&\rL1Уu+5k]LMTjMѬ ̲) zOM،| ΫK ro') ŘICS1W[l J1>1Vi#f ѽjLTZV\bU[f%ʰX# (4*/ 79mx yM7h+Dz7 v9B9O\ s3Zv69>y~k#.Kd=B0Beb37*0*K"kZT(I_TH" Ř\`  !՘ڳYFhy󈛦U`Zk@ZԜ e^e4h X"{m\@u>oKv?]OH';`UA Mh }[ O'&ibF (>;^U/f>[M qD2٢n}!3;=5l#МyOnz!0V&QLAf$S .H;m3I]W4p**W٢ܴ"LR>sl>9vlPK T/@jj\k/:oWwQ Jʍ;tS*e9š?ي4OMx+HLRf\Njhwzt Ԅ 5rWFL/ a Վe(AÀFz GfJLL& A("ufzBܾfFp$|6WV!6z_*.{ԩl]BHg.UW6*V_L#Rd<5"Sٲ~2innL:[/Qm>RqĻƂ6ŷ3xbQN!|%-&H)E4 {0Ov:)!~ȝ+KC T~ B ?J͔s^3{GMޒ3H_ds7{(@J_ Z_ƃFM_͉`Se);1yH8#oD[{(î q*z/ |%dl.ԹA1<k+ՍB7Tai|䱥mmʓރ +)ۚʮ*l~cN6bX `4UXFRI8b;Ql!F_7| Xm4 1cwmQ] ?9]YcU ,;k˹.iZ˶8Iً80Tȼ1 Uir&4YS*TOOwյ*d`q؅7UAWM]j!]&|qzPD2p۰Wn5=MkT']Tgo Nh|>}/hغB +{`?1\aRfi[T0*,|1'TQYi(,ڠ4@?hXdcԖҳCTqQZ P$ # rDm3;)I0A .5x })+,?}dLwm6eo߿y{rS"%E2q0%lȏL⧉Z ƛL6>Xb&;?hJwf\+nKHn4{Jj2B=܊ \eۦmv7Vk+R՜RXɣ_|%`><, \H= Jbk l= r&$Ӂ9fPNJ5b\0o3-v-iN.A&0 [єe|kh*fT}e#)cm+de=;mxfO| r7ik-wBEb"hЃ.E([%rΘ럍L3"OlMHAL^#8i&d|,U}CBa8+KnxNyL%P'iS o)KZwkTam}), L[̋T_Y|yu P`Zw D3PyS*y7M+KB7"z_M4Zbފ2ӄ4гd5)w~ѡQdppYH#Y+`~]$ Ss=I>d@i?}{%֒2UխRf2H]&ńPNSrC.SN.p捛Z>TkhgYŒyKȡE&G J׋`M!Ѯ!6G O3^ʂ񰡹?ɡ=HC>6d[+9U_e+Ԥ& ^>9` @ 'L}S"GwɎW( r% `AP*J²E825#eNêTE@xgU+mᖖU1r/ujP nT&(RbUJL=`ȝ6ǁ A=ZMN4рJR/EBQoM҄yV]&a dC+zۄ@_ksH}i>~p080N8$h&v.i_®ޚRWb12LʨԴA#w6մO1.1jR+OX'$xؙ~4^_1&mmFViϺ 6OKEDfEgZD/j!! Eb$3[QHSvw͐y7j 1d$-%]@l^=Nr!{(kuq'c)Kȳ A.E5x ТVp0zycjK֋-2}UF*J+!5gg&ZYPE?F+"H#|o`tkwdA&)hdIvuJ1/dCԗY@2Q45m7jXH@g!@8Hޭx m͒%9VG L"2#9ʭI<ac9hU6k=&(B"o>)لJŎtI%]O}~<'ShVA 64#fm}ώqrTT&d|UkTD?LdGEYo/vca=[2|ϒlm,Stjujs9i{p[nyb2mbFҙ몳tMiLe1iKDU*lO& \\%)MU}li%% fU~C[fe]"`ZiWնͰZN!=VZ!,ԡ2J!I3CW|X8G;I.zhHfp Dҋf=YH\﷖rA#qQd]yX!GIhڽ,zEu|8nrp[ ?u>rYAlcōxavA(^>k_%5`mƛ@C  2܄_Ÿ0tLf"k,yއНe0Ͷ:ryL]~]?1ƪL-T2fa6g>WY̵aZIٍ,l*ce]u<[})6ayc!cFol\DL8Hm+EY@/=ܶeLA}Yvh!1}le!Z4o\IG@L{cyFL::J%hJK?b1{4! (>EѪG)eT[T"WdKЦ*f'H ork1B[$SVI<0a[3Qw,z0(cjc³Prn[Rc6t뉴7; 粌q쌛yW N*_8[jؒlDimZQ ]/g=nB]ٕ^(D}8jtjVv2ٴ?25XnK\dsZѴ992;}jTmW1HmMhPkk(92֤$v5f}ifcr&qjO L".k0B)wFaUiB1{Qht.;mYh7EBV[e-6%La1 lٻZm@y󱀓'!{RRV{lXf.FZM, +QgO*3*ev ´6dDc~m 'kqdOcQa\QJH聡 ҅Uc+*{Zf`3,[3u]M" P(+68¯@)/|4D~!9vɘjHfasa:ՏN-F3D!OtB :fIT:mͼ2pM8 >b\a'J)7o7O S1[%en~+0o@ʴM -b.Vy$!TyirT3 wUUʺDֻ|YQbzkLڋ%TeKэHivߖ9"~VUv~αU]ۯʔ/\vWMLqɤ(2MJ>CX8s;H{>l|˿Bsi-’[Ln61΀ D^5jWSluj^Q껤u=y31V|29U *gVlsfr] E=to 8k+.Tۈ 9Q`IH4U?mthNi]div.aj> V?Ƣ8Y$a@SU.cJ:ڀZHS'ֽB0j,'0ϠC2 c !NikIfYV+b&m xR4FWwEë DiMބ“)!P}Y&+cm{Xe_ƶ*Js N'gdWDhA)oՎ[w,˦YA"zƀE]lT0i=C-6Rj ]1@`'w$wneK3XPA ـOΧUmh6[EMi8|?&mdm %k9 =M^T- @`~d]BaPwq JکNtj{wOu;3幉nY?XifV[+ֲZ"3Xacd\g ^M\ NPwUġsy*WX>bvJ%QΝL^,F3:QΊl%4 LB. ͌ ֹPs;2΀L3m ?aJHfo,dԎLhfVusvqͼtBP;RMA\c&\- 9MۘI})}ٴ ^Hӏ!ʶ78*<-U8JAcgZMGtU6E):jQ>KجJ> +;-mzM<;)8l kN|_ ߵTЀG2ɯjeg8Ama4~l; ZN>NN4)buq~zch]SmfoLApSѕ% >UN*x5nWbb"W]dQd?fCS$Lʒr9l^@p;BSA2SoP0Үcy"~ӵS-bꛤ܏RmСOvz?P'Qa"e$tt;goaEa:i~zwI 42J:/HJ4iPXCe]e{ n0LʤL&"QXGwip>T h>$DÂJp6҅,OQm W9t?jXPefљVdQnF`k[ůhW,Fˎ=t.fj| m6`Vvƭ 'vZΘ q& d ,X ,j/QCJs%nқyΔI4gfvn-| CP?(}-oknM1_iP $zK8.m6-Rqk_@oxpX=rģ+bP_ %Z.Q"@bƳO6d S#F1vu45O4(a˃1-d3~qM'sUnmDxP=W3d[NI[khfI%lgs1`ޮw,2y[IT&͞'l*񮒭( LUx6PN% nhU{02"trV[ҮrP|a-ĊZ$ Fln̒>;}S+jz ՛ 5Ȇm.bǾ-R_]B~P"Z3Fo@{hHk30YWW.+/jf1O6:yǑ;Z_N1a^b/N.f渴[c~o֢7HxF&55+aQrjh!}} O&JZ)R%D߅-ԙ=zD6QL!Q<6Xz wSbNsZ ŵMdžBx>p!BlS$ rҥ)UvpRjyO#Ǡ/L—`5Ji-ͧp{3wUn0ɠXZMW."Z ir*X2-dӇ(Cgy5Eŧǐ B+0IZ=gc<3UPm:I\l3 MgWh/i5kR2wUl,~^D#{fQB ;W{;(LX(CQh/-xOLEg@ ZQzf*wnaLcI ̬ƀ آO*,mů@ڃ˱KCȶk'` I@Ы3C!zdZkVv,d2j4Dm02Ц+yA҉;V `?6jھg.lO4u\JO]Wnm>|V) !!som5Ԭjz끄~y5d2_YL 1G\1S%ZoL2͢Tm@QvLeD0W\K{P]G;uR8Tz"D^ dVt=JQ$ƛUvy`VdJ.Ԉ}l%"<RVOQ2tOQ5JZA= -tlZeLsb_E+th(xSnIBkB6>X`-p\Y\0 ƀ4tL>Vml|O$л,)^d S&>xB%TzOԹ+l4 `)<`}??`ϯ`J>A -+|Yֶiy>I@ʐH96_qI& WW i촽=t֪6lM' J5<æ?ֹ֛5bzϚڮ}0wD0W{C66Ŭ tڴjVI(nb a"9 ch9Ze.Cŕf*́ AM.%lJ!{X:5"[I;24 ?kq(\VJ6-mo\hk% 1 thG;֗ w]A@rLsZf-rzy ka7+qT7;k",N㪣gf3<- Z -ВVMp|A lWmbjdycJjvkPMsxlSbFTZKآnj[ ULkG:v9eKzVp!R W"#`!s3` P6 ɫur^-dH>vf8=61 Ŭ(nJ{(@V8'Y /L^U|VoEˤ ;miYl h\ԉh֛ AqC_:(~y h;u,SSEvұSRF50繼^{V nheת~H*t2*1D~fr+=,\Ўq枘ȠmVҒ}$j!ʎ. YzPM7K9j9/_;Qk#-& Y娅9o|*9l@ܾq.hHgFM',R^ 61p4&gs+ƅj( b}Lt g$f-8(W>t溵|Px -sO | !@;:082I(I[!#_/váU8S_6}.E6HNYf 6"ͲbDp v4Yځ:B,CXJt=c |6o*cB!Fnjh7ӪGa)"_ʑ 2ﶺsꄞ5l9AE[?mQ-7hyTqeL齄kб6ArC3UQ N oEQ.*! mWt_KnZ;hRd-ki61Zcu|wP6}ɾ@dd XfDT ekك{udFNvL:wjn -ڢ9Mח5mV7 }pUBIO=' 7$\pLs._8(*%_Q]1˚..Bc4@.o_:+z,Lr(U>FcHYqbD4MLbN nql@m薾fʇ.4.y)DKN 4eRXi%~g2d&YR& % 5|Qo>?iG zGߞ#!4T:p$zqrZ B=#UN$GmSKf 0?bvmD?S-*kT ;pR"(iEU5r {P|Rz|C'BxvU1tRҞTT~K Ц4 ǜ'CŒ`z Z=+ 5n1{V.:_p;fV5tUTXpx_9FI#(J f +i q4⁶.KoX)q:;T RYxA$头iCd9~&v&Ӆ$M б:!eTXPad J\\Ova xU3_q\0e >mYkh5 D3dj=d/k7S052`h,S^c\ZA:1W)TMMRi63@O3a#3ޞ6)z:@!A;iUmIH6uۆ{+vbՇ\K~ Lۅ!Z?*Sְ9zS`Gn_3 ! .fG&VV'ձج9̠*pQt*,0Uh1CKB=P=,j.z[ʻ(p!%pGcŗ~/eg닞F$.;"/ڑ_Pg4J 6[OOݮ2 &vq&6̗qTꆪY$1(g7ȾUJ#QKDlFh9Y'e7qL3G.T?-]b(ȩnpCz :j uoS[V6 |>}pg%E AaW /i a&$?)JuRf\2^0jL TT/6^g! `5\!I8OQsuQ  a"}C.ҽ}գ<_Y59gf- c֢U5My{ +oZW "_UFtTa*6lc]䑌 [L̵w(kBD^nq9:AERɑ0\*Cd(=MfO,ƘH3'6cbK#FjVp  rjpȾ2R, !E,b"!d$3 +9ׅztOU,}j-c>Dz9\u4fY_̬?nDuh4Za|3 ,J$axX%ci<ڡ,,|9oxP'V8oGY'$OJ(Et]EdP;&a*y V))MdvVfe2fD5]7=w٠~Ά!SK(9l/\1Q5ҙӮTiN.`a*6ޢb(UE_0V( Ђ[3> ك#Wp( Y- Ҽ&mMlؠ<+ՑWfFVܧ ުM4W@fq5ejx+z3q -4YCfV"c*ͷ>ޔvUmd%q1 ?' UMmS_<PHA @BMwyn4Eu<^l*Bw"7 ?)h! MPx9.CբRiP'? x[Rab:moqԦ9!SZ':J@̉ U)! ]/>k:k\CRa3'JՎcmcMvݿXCŖ>xlg vCx9|[oB}|}3X-&rM27ٔ7\BوaGEryU[t*}ek)h'_]Zp֟R\-bs/|)z}^X֬Ue̝eȋ76(Z1ijE$;<+ {^IRFZnfsS'r w8hC(4xcxb܊a0[ u T_y)aM8d&~bҒo,3ռ奎k[kZH1f2uoe_ X|D{gRvI1]^g%C9ԸGiKt jQ6@_[VnZtv=2sGJ/VqΑpWϴUE}1cRZc2b=V?Dž}u\3~Hˏj-FJn{.))ߚjϠmAM@o;>mZZ-ozZkuI$~^.|UMvEZ "&oGX<Ņ@:YdB.٤JK*ԹYsmQT]xBkm:H67Ae _mD0SrjA0l&DTU^|nUJmeMkoCQvuY6EYU&><~(`Y~%Y *̌2km{؈Z5dtx1x{FԵ6fbAQBz~ N],RlېpǼEVJjڸl8&f^h=EF6aD3|#+=i>sd n0MP`6w]5'Dw̭CI; =̑EVhlc,5=֒3z@ TNg X\N!\WZQ.m2R*~MRSbʷD-Mv #tЅd/xTzu(ޛ2hp^YE<^r mw5 l@,le#%ZȣLьQrxV0IG2@5~=isoOUOcf 547ABOhz5-׸֨]sZ;FQLCȠAloAt XÜNaǨy߷X LZV'h}4`-&ZB AB{+P.`BZ]׳uj\µZ3XMf:UPV8K(m%W a`I6fٷY,f KmŸl ~fˬ5_$VnNAU`T%?Vj5'%FgMkk֚i۵gÂ.eloIGFjMypM ͌^ aOpT͟FfCPuwګ")n*پp&C͊x_~#E|Q?yTGgmM-6E`F|laqX%ZD9dotETyY0TMkW`~%t3%ԛ ,P- X8\Q̥\[9Fڐe"G:8Q]ձzK2mmuhUT=#qӼ s3dG%Zg rmZr I~;e'CuI6{3hd qf7xoB4ExHzFeF@,u9٦)1ˏIZtõ,aӤ7BK,oCvH .5.~-O-'@1)Js:[UZL$X L8Wbt j/eBnR8IfVgPSy^\Sm$dx79*HBU Ng ~Q)PH&k8w2F>U(5~^46-)clUcy`(՞SWebj~m ]ľM؋ćL *l Í#unҿ,L Z~w-] (K{xxԈ&ls1x5<>[+cW~yFfݹg;}69y0=}2;ΝwovOn쏏&5ܛ}2spv7LNoojbbo^r׷n~ŧMOpkklnt^~uƵ/ٟxə|{:_O{^ݺы3o82=utw6o gf.}ک׻_/Wݼpil{Ky}~qz[7zuZnƍ,?77~s7u7|4/3b[7_LőC/In|y8z7oVL퓉kIع3-ɰ>cNp >s {c-s3A-d~ Ƀ:D{IΛ<>oܞ9gxb H`y&Hmv[>gx6!cx\Ƃ؀8GgИ i3gb/Ni:_.~+rKVP?ū<x y/ n? G>'Ɉ;Cv`:WMū|6?Gq[r<6 Y 3ߌ#Xy0Xa%h1\9wCW)~9re^V@1ȎsʂD}\ >d!ւ'AO2( oGwg/|_&P\?CP6?ww9 Hyz`wB=*ӯfNx_v`~cpw>w1n3!ށ1z<|Ɨsw݊W3O;vC>:_#7'_ݙn_f/&&~>KGo~&O BP!"&FPpxr%0bw@.hwCs:2;p?m\rEc^OtlZDS'Rsbxg D?AK2 d|w;nNyl~ڕ&Px|Nn6k*ZeC>qu-|zw g`VVi`aʰ>nϜLL*T¨AA 1e8z|J7l߃ I6s"`ˁ M#&?(!e2? "`/MPVzZY1tsp+SgC\>'&wjtY h^ Pt2 woDTWݙV)Sa8iq.c: b$?(q^C!S/jצR GUWXIqʡ~e2౐%#zRD䝋סx_ɍa|emiwg.t3)я$PtySQl-$*7w 07/&wKm K6޵5>KjьOpòE@ߒA=|Nͷ~l.wI ;1 fcT1j9pi JM)19[G"Hn:wބS|m 9(H OWh)Ԃz)mqO!Ӡ.S_A]?ursįa@hyx4T|iyz4B=($ܡAPʇXӘ<7's`wl8#.7fre<|'sA*GW>f)KT|!U@!c)CL_Ԁ| "$lHG%4$)j֐lܜڣUi [(T򦋬]+/B>  :@y*R.Uh^]1 kC0D*]2få{1͏T8Hq[% &s&7^; 'w=?GL0 N)+=* Z'QԗxÑ4zip ~ <1Dh(WZ 9rNB_Bcr I^ a燄N$$+!0 05zK Ătx鿣0{?f' z瓹w ~0x8aefn46<1!0C`Ki!CX{_ZHZ#*IR8"8!$t28`Dl^Qьa"yπMCX& =4uZ}`gMo `MFZ<|ĉ(eBAus3huϷc'A/EN} =c?\d>?22P8+>!ed6 ݋KOiL$^0>,pz'!㼥!DvPS\{m21yAO}<]=W@ ޟY8Ht'*gScT'$!Ȱ9E  @Eό-s/x8wk'+R<= 0Q]A9: Nn]sw~D#P:o"at8Cayw*w{ytI@>RZ(#6t?8h 7!ϡBS]ʐy F\( qnZ}2Xr{Q7 CtK'LF9ғ_?,:` N9(}GKiBA+o֓D+QD0!E>EM7!}SỦ8&X$zUP1;*80{v[aGlL0IȧsX:O4&ϱ^1"z s%ԍHQO(aʵS^vfh =y0*nI(tKso;6(y[vwLa D ڀmQcF&gٔ]N@4i;FX@ xq3Ip%Xp1:ja%sp3c;QRi+_:qΠ@@Ax?wmuvj]fg& A]`.\F<(?~qn]=o侟},16$5Y v E6m%n JVXtodFx,#|H]N=ȉ.ɦ3]H|h' ֥g g'k"?66ր,-dXw TO- FژqdB^x;qRxlIcv]Lh DzQ3xi, S_ʶ *NNEԳfw}6>-8ȿخRT{ǘVx&Ý8zygc?fv·rM8p?߱\Tq%P=BHc5}@FNB%ޓ\^ xMm20n>)E|%_ \x[c Ȏe a2(DJNzWٶXl <:ag Yo.l/Ӄ7ȍkDlX\@d xj|MHܡ]2T+цར}#]J~Įo}#|-'>cu9dCf Ȁ4#PT+lQ#E>>zD[Rg-kxl[*8 MUNrF2A%!瘈7&Uz@HE2!#'Tys ՟dN#fuԇÎyrK=8^3UR#n*1@36zFLm-=R拱G\Ni@ 頻v['c8y} pO[ "Tym}aVN: /mȪ=*T3|],iu}Pu=>@P7W@;@9UE1qRr >nr{,0X8=&avyF$g*riyL@KIVZ F9% ʢ\;o|'I||3ц#m?"7%RP }CCf͚?oH n3$]QN=\Ƞ5ha[܂5Bcda|CظA UZD.~k2&Š&9oJ[|*0#j*[1ޠNh  ~u5ҒK&;^ ar$:e׮RTp%~hjvYh`ۂWZzKQ2Ѽ㐳_+/BDG_^Q"8xQ "3gităd 6 #|Fo0w~ݴI5<{tE& @ߡOSYN0FjxѨVG:!#J#"aNZ?،m5 Wg"^LGYw׃/DzB9W-*PHrM-ır؊XNi-~|3h$?bn|1fb* -G9k.Ur`NOIy^~)yhX M,\ G<7vũM(KUtH")MTv<\{Gf$GW/~~ݫ^Q.,2L#>Ң|3yn(+}߼)3,n}Jd@27>]JN}m9e2JJeЂV#KKIKZ08\[&}&Oɬ4(#i[w0O l65[93NG_7뾜}&;DNOgmu!m&JKNϯ$@K"Q9CJB> l-?Ukr䑷704vM^Y!2':7w/t `R T9Ahҁ Au0Вhi oJ ]1dw.JK83~{;Re߱_z hϾKӊ^EK ,'Lj3AYoT;s7vՌ\-Av袔򠯑H˝Uw'N(He/!vch`BD8'pBUZ 1^P+hvAaq^*tLYV)l9/ Dnn{Y6{@r.%ʼuZt0?qԧ u7o ]&\ }:Z <4fA&9r[FcwqzЅ AhIt+b/6J.µQh`Wf.wlR\V# =İt 1ZC-LfG9F>>i-?_}ʈVLRLE kDݭl.piqH doxedv ӌv!(ƂFv6vڵ+m4YAe^`pݵkLep4c3 n}cv;W~G0?@O>vl<&@(IXH>댑szȺϑں_qDdǩ,ڕ ǣ2p䶥l cx~P$aHi:7^x X0))m_t4,[$ V@nD!i ]݄qI8]>bq,`)kC$.?{ h=Zވȝelsk5'|]{זA#ڿ&Vˣ^Ytߞ'Ӄp]&_W7(ZHq?.r 9Zp:\Ǥjٹ64ÛM&X"cf53SskS-:& ɿr~/[7k%dPIg憊\=Zpʮ A:{1|b\e6Sg]/EDnt@1w9!H4D3 =#=qqQK,4P$4^gǚc(kI45Ϩu}a>mmԴ9nY`N@(˃LB 1 %b5MB#pXR\ !+&ÝAmX,F!u>n^z)Sߥ^d`lru繢= ɮܾIQAM<&wx_ijO`%V~/g]D{߼VXcir,B As 0di_qjmP;k Ayb ہ@l3B3U?l&CSg{h iq2i8/^)ZB4j CUTAoH8#6jM3#)+E+K]= - $/8(k.Pe 5!eNQ'ѷ}a,bCKS7d撹wM/?UF{"\U `V qgD?a "u'&r1TU;*R; ҋ, CAX%t;Zc 3GaEj99+xkn.FA7Z_nq, EJ !M7ٚ.V} i Gwk% N\c+|LˠO$J!Oa>KUVe^ʢVO ]<+%2r# =5}n.UMFw0/,IxYCW4t%hFW܁^qr85l` eA7' E^9墊y5,Kj9X/صK돽[g5b; 1%N VY fiܥW22Bz "`.`q1yru;j߄bAX_'3C7FL6;dfmTI <:mr4Cθ!y:@70@X\O^_{\I"94EyylAߡf7w@ Ћ 4؟3z|Wi@88|}m!#24=8Ju=]'[2KGߙ󖨷, 3A'"aW80WQk84R6bg P:\yGD33x~%< +(݇j:.[G %:IGM`iRW 6v$8YTҋ}MòBG(db{q tJe֋!#*Ս >~<>i#-I,"yփL 'eWлuVσBSev, J zR2 H7!=o,esA;XVqX[c'7"!aPi$>P]nog%ȭ]OIdI}:>>W8lsSIgs:^8}ۊNt'L6q{d Do \bh fښ때Q4 FAG༳7~yZI3)8ŻtÈs )E^hH )橦G /ߺϚP#:5GG9t$(Gdq{2F8ՉQ" HDIaGSgHN06 VXyWRD_lНݹ}"~mQTH}RY(Cf8ƮؿCAb.ߥl;MlݐJXHLUAR_R' =ժew6Rt#^{]n[(i,4u[^7.E)(z~oݓF'7lD%0>@Ӗf7ѣZ>?%1%)AFgP| 1Z}XRVK⛒DvZe4a'm\@X[P^{/aPIp*"M]擄lOuIZTB bmPQ&pnp+Uezހ썊ɢgģlVpH8XjE2N6}"KeZdk@X>yLB9*$ݒy:sLQb/~I:i&*c>aPKEmx(UEHJd䌅DOO *Hձxu<'RkVIӏ Ey #ފ~DE8DŕBU&6+1wkI¿dz2:I-!u@M`W%@"t <xE3\8zk%pU/F%j<,^vH@ f28-vB!”8mj&MIY6vT&>)J3 Yh-c2`$JYZw*['FO~pZsSО+5QƟ, >1lSNHDM 0wײ6nhV] Fc*@1p9-ҿC"@8Ј3`? µ: ׎ Dڌn(PK3 HeџQ}jB1ˆ"Njv0gT 5j# uS T(hpY 0+mon)ʦGDH06gU~"L@%, D|F;ݨBc0SY?z._{ *UJ) ,`ɪ*%%E^V`p8S}df&hޕ yeCH-&fg[VN AsPP2<q+thpNl(*7F"{`tN㩟b0^d[pNaF^+T[ y'adc0>~ȔGMĀLCPUDGL}asю\:㬍|g&6i'|Rkz*ٟz5@-rލl!'MG8"ѽZod(ߍcH-= G:'}*YTq&:#}T5ss'2ɵlUJ (iL`A1!z+cܒ/ *qPzΤ/%avڻ2"Zg54.*x}1BjjLY-U7G$F@\хӚIjNBcB)r tf}n.^<Lw+?>Y]228cUw1(CLOnmLX NvgŌ X@:32,UƬ5T{L#HASiUP/XvNqNk?I/-T kPt[6- |ΩWEmGJkA`g ]r=;`8y29Nm}] a-P" q 3U,ObyxWhP2%:PN9V1gG 58ur(1OXM+OBj.t5m=.Ȁ]ro rxgE䱶hsq.j!Olز)Qs!baȠ#ONBS }3w_&@5-DwX6m:NFA5r%Mg^GK}p Xq\6)^nqu}Qw٧ÿO|b2(^s*A|I<4K;\" ,e5% ߽55DJoƂX3]9fP.HíV*ѽ_!eN% A9 =. $-528#e,HLL°q=c 9?l'iZޫz)闔$9-4gQw/ {ϘTMY<RLԟBA( {Z"%}>K7m8ԃArJ9naZ֫-)c7@ Cf_@ DʑWPDpY@ɲ3 a}h6ֹ?` )QرOQ !SBd: cq*9]l ajP&Ԯ sԌK-j1%'aNfHU #p+WwL_G~S#vNfB&vKWra1ٟXqi뿢9J*<!GC؝H=s6|ӥ(4pp( Ic GR-*6"AC maAL'pqvc:4U5N^0H !&8,j|EmsfPBCJ5z^I8$d .e[(1_#-].c@DmCT7P^iJPRqhԆ\Nj"s  prYTF ;8jM9FݔK1SQ\~R+qèJЧ;zBcyZ"tC7~ȶЀZl@ iA6 Ƃz5F@n}4b oAWaj@*cZ]yH}t 7䚂I똃G6A Ma=K/Oz-\ ~:N;P!ZcqTfDU]9ED&YwVך)G P&6FL:x$hrNlhG6,$~*`A=ȧUg Y/?Id|h8dK oBt /Ӧ-$Ĭ]Owth[B`6g@!:lb@ԡG|H\T\`FZVHE@.ož*D">!?[)z%ں'$q wD #)d%_iD q}Wm0@\m"K Ra gm }Oh/C,FWdf99lp.(uEڄ.! Q\ 3S+A6޶1{ қ2Ԙ3VIYҚz ixUMg>s YKތiK} ƾw*i5+1ExcRzt%R:LO~ʃkR@0.KYB[;`9*hq w)5A&M@O9k]n`hkRDIE˴jӧ|x8"NЅ$9C!UB 3 "% Gs (y£yO&<zĀv! OՀ'h,FH>Ys/7 ~x+hUH[-9]ry=ɒIyRSg- [{C+#ͷ'c|A6# iNexEF@! 8Qa2UdK!h:Lzg=Oĥ&5;[2/Z*#"3DGGj BDw ~t (BO!8PГ00$P-B,\IF4#-/ >1y#7A2Oy50CspOB zT(Qc @洌|\V]S%mp !]j޶J  Wo ٖbl^s{~`A=eّs`q lt-%QYsG8Jfw`+^ O b|"׿M`;CΉzS]2`x=VTB% Bj"A.XC$X6iRAT:MvW_b.x @q@HHm:r *)QGc>ZBORc&!!D.aSZJ19Q$RKI9Zu0iJaReĊ M"²4jꞙk`(q}`S=??>A +gfP EB 5G9ZĜ1~b dC|NNVHP|xfQTGHDSKNv% gV+W'5, ̠ D(x9􂲯&wnx7=:1 w:^uqF33Q@)@1PKѐoY Qk؄`zu$kUdY IK_w5@_:!06h⏮Q*ѫqTVߚbI(V)T,zbεZON{YuMT&|$j;\|y^#Y[wEB=L )9H>SYj9dP,K٦t0l {H.rrM'7,^,7mTvcJ@4WoÜnF:odF/Lģ`peb{Uq3JTPu"6az@A_́Pз +h7gPʩ뺪V8xczzbDhAGo"kLG擄-TM1[|Ҍ=E P˦wiDۧRJko8iI-ZM' DzY}ȸs2dIn5Au5+UrpIr)S!; Y[$ S5Df ^:l2‘\@UovDۢ.J%X6C4$"^,3 5:q~KJA _|MvKpl^BDMI3A0˥~W#C1݉ci\-mcK asÔOgZ2rb$^E8$t&LVq?+ji%eæwf3^~hsq`/xJ:K%JIYvxd@), esu(Uu0(o';Իr. 幛9z~Hvأ6,2}IsU+x,}=ȗI3Rg)=bц7Ii?7OY3\)FL8e Z+hUdhw7↦l mL҈˯kt4wࡉۚ#rrf y0 B h@a3c \xjD8u 7o0E5`Ipř QaBB2 ('VN!*0Tʑf'ذkfkK4Y֡`O}m,aboڎv.=`hE*nH"VBFc6,r:{q2TBuA>WєSxN)yC㴽hb'CӍ=f"FSȥaT!hl-5ov4iV@= cJ ȞxRŭ[,@25xÝ(t爻E.d  NI5ZmFЛkhZ,K\Ú(AKX$|g5miM\G9zs,-&PNu0j94d 9}9NЛl9b'ʩz0Nf`A &xz @R$õNF-g9jyȔ1BTbMزʹ2bq|hR"웸Lu"VL ,({ʆϡ@+$ nd BL hQ(U@D 5(*4S̗IX=AXd9KH}Y"-a 񁰪> hh=*MDQcLHm0Cj!-]WQ _: n|/DcyX.f`QZlpCI>+_Rɫ1L5ur~8MдaRaE 8HX{1|)@+Ɛ j̉wƋjߠy ,諊rO :T0/4?,D2شa,jAudfR -`^Sj!YP*1@YWMO}#?x֡/~ A|<1gM.z鷬ё{{A5(T ZrJM #Ce҅`U>Cl@#'&<;mM7wDOnMw5D;,W{0YfzJ){լ x-+|p~KG>I%:p$f%e@XM6Dœ+X'Ktۇ<_Ԇ̜3P 7& χ `A̿݃}35A0 ;;'L\pS `"׺wAj4;Q*.LwiыL| D3;Xb!Cɀax!\mHug1xLቖP ~o̊a|Fd2-laW:%` B {QGpܺ 쇄5mx= EYwXz=P;[ŷ@j%"0awmS @6 ,LzKСe>@2yKj.s־4P@5p21%AZ-cPb Ѓ߫`pu(ɚO|[Xn58?cRbr68,P7?bX̍pє/FgCjL& AO7?/ +FIY'#^`rt-t>3$< DUѿnb_^{W4ڽRFL]# wVFw3B-m/Kt$qVFIl4+*< Е.Qw7 %"bcpnYo &\` ;%Hņ+,AА=bf4+O:J`ݚv;d!T0?Za52; ð`0@ CWoɆ<&isii닑>zS|'s0K!- 2Uo*) T=@`J Z U A02'\_lÒӄZZU`q*AjM[u{HGn)v!)BA ئR(УW م'4MD&fTh`_Vk W]t''WG} gڜla'YCtׯ%!p 4Z/E̊ ~\24@uЈ$S'EӦwR8rM0x)We.=.PjT5S67H}(\H@?*3ˈW\8>|H ;|`rR%}^|() Q<peTQ@bpSV JF-@9}L+j(`J\hLl8gMj&^ԄdZp " K߶pw`G.y<BC'a=ɐ /ߨ5D|094=rivJmI5[MIk+%ÈS^xVro ^US6,z)%X$۫M'4| q nv {1:҈#$) گRGCSXFfI+o$A4+ ÆIOBWd% 3BA܊e䬘odSkȈڧ/k= vc3h pSS!d j\`VX35}Zݩ@f&~HFW'7~,CiD2^U1޵A 5Y!]vO ''͇gg*Uj!2Mu\5tv C/O]?ی!!N- 7ѣVUϊU抲{@5/q>_L$T,![M CH$ =nG3=O^_f[A|.9r f+Qɉ ;#@QGփ5H!TgtrLU!AhDM!}1y8B4IP @}[A(Zk2k~Fo߶遲YhLF@`XA();Iv e@gQ1!=(4!{g*+ <`83`d0RKiHhFppwl+a:lhjPÆV~EJF$FNaTqyt}w3'hf!_kcWAd]01,x? 5›-ר7d3M1:Űh`Y_ll:7%i^j89ǺN6j 6`Sb:܈M)|F0c8$^O?]˃p": -s?fބٮEJAA'*D2*[j_mn:~6jWM&z Ubh1ۺ,)B\E`0:IyČ0]ր;I]wS!j8fZQPv;%D{+m* ?`bu75C4!k_zk+@hy uH|24RQ䩍mf[%ޱ-İs5]lÑ}kt`g㼴,G.C/6јdRXjtҎFL]:#+B<.(]ozYLq9_5#Lj^en:YC S:()9f).}s©I! 1,+?h}'D ط྄2 -t&RF!ov^JQ@Bm\HIi5MMWJRh8:&o!ɞ[I$ىvietk,X){Gu{]aL[;wul@cjsZQvvv2 )F̞`rfD fݍ1I0+X yA]}=@\BF2hL=ù%4V? Ϙ6}crpĒTMS1[a}o6147jD0*X8òeӽPu( m"YFPnHRrDսD;u{ ;\Jvc|10d[}e$X|,k+-zɳl՞HRED䔒> 3:4@Wۥ_pSÜ=ꭺ(\}Ka-D$)Z6g3]ޡl$0KcDL@M.&/ѶLқM֒ogemJ$o$A)eS:>Ԓ尒x@ `C#'$:d2h!`4y*V:Qxy@@<v&y0f~0w <qP.~DRmb;8 FَJ/%w} -eƸ\hކ ?J`;!GȸhXƔzt_SGmr,VW\uٕc,fɢ{[qOAsli㈎b $\I0>{ZIRGG l)Fp *xPxՓՄz`!woub8C:ȳ=u??Bq.Q `6PU꘥'{jM^d50|4CIAS(+m~ uשr=ۑ A(!w3*lRXhmzHa2cYlNl-0ZTlfW0uF/ U؎ xw֓oTf \_%'*_jV<6bm07B*coaFJdr&$wp6f0B2)ZPME$u\oŭڐlAB}XKPf$ my$^R~|5H~M>(hs 3:)lYc>$h}JU ZWMtvb`sv,>sIi'FW.}eС+5(.p:x:<2}(ԛxUJFfbj<_#Lc4ˏOVm Ɋ+.ÒxVf\ ݭa溵`=t(QJBXV@9ޥk VPw!CoF|NYRT=̥PYgWy_rbv4P?db: B˹\Pq%"m!<"x:L&`x7%Zx JhbtEKNiS؆Ja)-53.‘+t6.+/pr9ǁ NnX4*fѺ$u-@-(A$HD!o̻+bN 꿨zQENƌ`s+<jZlS414BExA=ShPO Z끻\DK=_֭6dʠo1KE:'!N>!kmN&G!tT ɆlF!@Vp}+PlV|%q_K qaHCo;I-M0}CKKZv7ou+|&39\/)] `Ayy ^P~!!E:9ND>}:c|Sp9ţՃG>^Qc"\4LWm;}~h9.V3;z̍D4z^'1Eǀ &f)$N %A@qKVS;×.|M\95Q_؟jG$5bpiKP|( .AA:tXhzmbkt#q}2D޴\EUvOϋ;ZzZnJY'jVCأ14Pʡ!WB" tC5C\[si(.ٟp A.{H^pE[0|)Th.!r>Bo?krZiL@,(dpbLʺfptQzKU(;Kg[tESwia;N\׬;t$ ƩEtWlk(' MŏoC>㘖; sqpE鮹r ˂1λOK@MPh^':WTi,hw+w[A]z\-}* (b3pMiƒg`ř حYx|6dZYأaEtԠVXs!1T < =` c@g1dHhT YVUij׎ Gnni7A}gI4I!.Kz <9RdTL7p=hk(E=-8ɦPj9m8\(ŴDL35ð weXt4>7[z2K AA`N-kD cTV&$WKjt>zXș}u|<Q{1y*#Nse;U:y+8D0so80Z._P~ ?odB &)aۧoי q$7"VΩ9`ь6tm`,{vVJ ԱcEa+yNX״?3! g`]ibU>BB$ &i]caR)U)lvMB+q}>{_ AY]i ׍Qc!ғcOΜD Q61{J} d eF8%MBLጵ:$p23`,쯧P`thMXZ'lm5nM$ǔPKd.J[D% b "QxH]*2_#\d. c Y `'L5}K6";% ?Iw"D:A* ([uKEe(aS^CQ`XF dy˟ܜ2/A^!Ĉ${8k F 5R{%aP{vB=`T 8>ZbSDdFҳ(ghal_n.ɉ@)%4[tx,;`# *'a29<5uA?.ς H)tPv~׭Scaz2&=SYTZ!HK1\aд5Wa(֭~#`A|?6-j.!9[ka02;fucCF⿈;*GOjSY]Y|] =ZWqIkb{*+qiIa!m. E%.I虁%6GCA~GZ} =U阶LX { ĤRI&`.ݹ!*}:r"a(51G9` " &CԥP"bF]P-NzUϻnekxW4=zS<:xٽiհ?lm' fP"f'KAF_2/&4I'/KeY @>]fYdvmZ, Bd-$$M7a 4{g[wUcܔ2`V$%6 RQA p3 J;L r~ v1Tݥ;M<'W^ЄJ_2בEjy% #. AC1Q#Zn BVO[s?n:`{Nrl^qv"ȱoCfh.Yt6RVTv=0_h5&L*1_5ovuaQu~6%*h .ymyת-=럏^-3B ~|6}sP}U/O)5 N$ITo8S5r_ \n 5(|$p*y 4.폰Tdor xc9]t\mI0.;l0W_QKpu8>Q{)8^"90?8{y]l! b`+tY!'YCʸX Ymyd@l6Zk@nSȕSݙu\ ϘTK;~r^Rbz^ۄ4ހ%apE5FtFAmnS5s tFDYkp[SW rIn'ҏ69ls"%4Em0,8mI?`icĽ3,$-by5:zK5LOL˄6qV,ԭX@F0/[WDzGc];EDk$9X u / .uD};!ȥPa=ڸVO7 EwƘUHnjX=t&,M|$7⟲9w?G2bvفlVp CnB9"oFyP[;=h!JFƴV$r`a|[iP h˲A˩[ںWDU$KiJްр7ZK:*hc]O;n ë! y$AOEh\' bȀ jOП}MY;ѭsۨ5H >yO.t*a3D:C#dq }\;wA$: e frޛ_hҞfTvϓd@X6jOLQZ7 mQfY{u~DL jw[}#M^M6")RBf_D|]-8Z^W%TH4kX9fBmޘv[Iuder`""W~qIC%e[[&1:NCUԽ1\8ʸ= Y4Fsst(Q3 Gd4CZS)0V<5#V`a=j?|lںM /3 såA6٪[~êh/4`&RB@f/.ĆȄ_38c;NwݚnHO~+9V7=x]mVF:zr<+[h_t}Wz'u :F_^ӛlgo~nMW{}tE_uu>]ɟԟOt` ?1zFo~|ѓ:Xo_;6e{۫/ 7WW'SNtw~_}N~32e׽..VgЧ?9::"\𲫓{]>jBtop+=xtve(n<?:ѹ֯7ttӹ9Y4<{Rѓ=:Ύy{X9ᖾNOfۿ79;ɂޫMc"е*;+zOQEODourc_gP:q:=}ut/nzR=kl]']AdgeX@^*#3c}1 L_N2n0c0n~z&׽SE5F:G2w ٫W/ԽθwӦ}>BO&C OK}X$TJe: A}n/DWSucd=F/{zxoݯ>[^O6o[yg=YstcO䇗oz7?uӥr.YVO/e?lɾ&gCٽM+zOZ?20_׆~PXFve 职YK˘] % H.ގ%ލcgLi] k~gp!l 9!#khT2oqct]er- L\dZz6`y&A/ҿt^7v"Yw-U> ޽5^/!ћ_zRV7ٷL]ބwe.t [hY6[}ѽY=B_86EM"Z+Yt #m&Υg/}lZO@7P_O~fI1gj}20)&S֟<YBVaF ctB }=+0eyEcɺvx})nje]^2Ab!6'{z^VXqZr3ZU?LA'Kנv[ܘ>0G]|K"Z苲2IdZ M9x=& Ɨ1:;:gU2}% qt90kv=Љ#}뿺i1 Y =?d/;އDKD@cf:8xtg$UR[C1d_'= Ջh`Ȧiz꿷>Rz f^h?Baz.fES[o >[sY;?}:p;O_)*0.Y.9K܄;QN3W^ˢHg{-w躏wIi3.uotpxI.?}Y6۞,{O${t?Ž>ܯ[20P$ZJy3{Ps/w|o*w&IgM]R.yD5rӄ֕7/&Au:TOF:$}ˑ>_%׭۹/SR RvDŽ0tfC C0Yq?).3Lyc?$[C"N)3ۗ_#{ 8_>L~~E XYv'k9_E&2#q?{2D +(z [:LN2ӱo&Et #{ ,uNnt9a{|yadYJ7Nq0]X;)ǽŋRJdXwp@ ץoLDt =>/X' BJE%&) 4Sz6 } RDOa`;ɺ=)OERa~ !'Xq)~co=WzJU0OҊIE;ς&^ -面@7ԣ g({1a+x~?vOA0Nn\Lzz2@Ib m1gѝO.ŬݻT V{; }qNwd4~>KnOf; 2h>OE*'NUT $ɱjp=4aK3ݗBI_<#{җT9, 0"^I"[EV)$ )F_8$4D/Y⦔tF9+# !B]zCzH Fם5K2:KLz$~ڧ}2Wi&СR &ۄ'ІbqQ#G$y$Ik7*KhݻYy$~j}#^OSށ<\Wt{o @>ǫt0UKx/ߩM}*Qh{9r)Kv4*%%L~ʐ}U(zX Yi@&ivⓞlv~ )Oj Fʞ$/YW+xz>VE͓_x"k bC#Q[ ПB g ;J _='?bq|E*KKERՀF 9鞪 &@bW.L `aP^%8lwdw:{\7>'sLG}\M}e2ތ,7+O@{\"b)|sFr_ۙn,ocڹ՞ 9.ݻΥD?ojw`95|<2~Q ~t6өGdQ~mS_sSѯݕm׬앏-H迓Muz?@O;u"py3q%] j8zE!h7?9ٽW>i?% \zR"ݵ6 2PFvcq&X/śo߾؂.HVINpu mBך}M4ޏt_Q>BKt1Yگ8#IbY"- 09Ȥ $F=~ Į-fPFEF izwO%f; o+IaYNYA ;6I0obAgec|aӦWݜqmts DGAe.Լګ o 2S$3I]"fx B8wup2;`79ģqg%D:@ط}5S;GI)AA`/]t`@pSxΣ,- !O嬗/y=$hLށY }GXm絻 {1|*>Gb$;ݹ6؂Mr uR $=* <mQH *b"{8p#:wE;jOJQ%9` ,YuO{g3@ynM&Bt?;!JWuM[Y̜|vZ{~r;ϕSO/c!umKyǂ~U{do?eRBpa`p`,= r= p7̸r/VO!hs#"Vk. K(XW]pŀz0zܦG{&uӘ" Z[}ivqw{K}]œ]z4Ҧ`L',5'AXeW`YY^X185X՚(P~GYݧpv{61HO%&3~g3j?! ;濝g 'tvOnɥdϓr[B߫ra\4 N},t7'MOz Aж.;jp9%` lk;{7/?L?q>w7/Xs+ fq㇞{2 ~WIAIK]b}zb.Rc7ag`^ A'mشP/'f'{옺}jCQ9 YJ1&_NH:d 4.OX谮w۪+}O{a.QnKpq%>6vv?*'!>a\vM_;9hؕ$L;_W6F`Eo}>9✀H:! 'kIS]0#N'a cs"\zJȃ) S}KhOb+e| .Ɋ #7Ò`LvR}Of/.(0$yR\W1Koz|ej/l}WXl=(_۝<=![0(PK]- [}O2dP9J\l?Y"!ve߾vE\tXnRD;Ż~Q*&!mlvc-;:RߛI l`s?D#$[8 &]$($ʚAIr Vo*  *\}0C;@x1LbBWP"`WRt[xkbILZ] OtwqS1x\R3֏|Zv7ӷsj~]ws000⻌yh}i rWXTPݫ.kDŽjBA#Ejݥ>ZePp2 3b`[\U="K ZF~INW9Sg9'o O`?!ZO}ozS5ZT *c*tT^vVοb)[0V6W|a.-ܤɽ@#*(E)rcA;ʃJn>.mלl\@o܇[o^fN;KQPu:|)ջ푫u.׏\G:Ҥa oӅYV<[4޹\-,֋1 HUt]7OQr077ҏÓ@sj1_)??p m8rtWT=>x ?/)(NfOe_'i!)@?at3Ӂ$2- $RV#hC!j♯ k0/DstSPl4ua>>/ܭBO R0>Y)} 0ebt.52#m%-]@H޵`͐t[&6Y`:xi D)7~,a %+PV^bhgpFi1Izt^* ͕JhFIz 5;yL 6 Nx!0 Ns;ƾKJ>nڕ-46%S`}*Ruڍwj+,fb:bB;4j+0= v7W3 u\s?D) uBJJ Dj'@{5!t]3ޗ[m:SKx0{JIѦ޼}CTB-&pc _ۧ'Z[r,7>TߡmݪN 9OGnU>-/5~6v4C(MK>0)FiV_2E2/|~)ʏo][(P! zO×2rl$~PsAFWtδ B0%g;V g0 K&= 4c/F7S?aheеj ho Rŭz]g[)ܒRiY^X*vb V{]s;$dG~wBR|sEa;`pY܉L5Gf>'[k k^CO:`.%#~GyrٮP^D;?{r<9?Hb,g96O)i[j ~re0?DD}_gPP^h!B|P*LU;8Ӯ!`y,<)Os)2u59&`tБ[sPuUK^ ?yf'/}FJGP"Jcg3D P6,cgdKX `)DO7 lEnG!Yɰ!F}E+mN)I;uiJkLC_Ug2 Y׋z"ogo='t0sE$5kyu 2G#s v]<賏ЄOK^we7S( T0-vYќ+=ٳFzw"3%FS(`nWfyp>ZykϽODT^v]ǔ+LY ?їZxr>ogR׬'#u7‘{XJGRy͓LR+VEۇ2Å#ocXc] ~ܧ5x7e$ W : Ϡ۠KP~𮎔)]fj@:{)lxw9n5Fk0|ʜ  5ʭkۇ|vM (ܟ[k.DY/3vFvP{P:faEeʴ^PL0xkό]ubR l1tVu[\3>KT PUªxj-d[22C}f! ؊сځۜ Mѧt#Ij1wPGk>use='QP+!ryvKYUMK_>I~!^:dztϨ42P КNCk-VWs.pln/`qu X٦NΦ!|Fa3p+|&Ʋ<ڹ$W%pH@/]Uyd,[|c $.6MGH*3"EKFf|.>NweqSéۻDžȺʻ]טe5['T 5) nXP4%E2~>|2kJA@1" ZH [wEu7 We4f]xL{4O ibtLʻ0dCHy B{{][!) tAR]!.=<⪂`A:*!O_+t0Y٣uh.Lȝ x'~ut!rA e.J-?ŧ'iW!L[A`v t`Lhehv9 4$}WyҶd sU&+.f L}Jˌ= {Gc./ui0$wv-bʋGJ2wM]!O|V =G&X,Mnɱ_qD.uaS׸SMv[E X e _*1 /ڵN>5?1[V6"ᶽ: эȖ >R "vߎ: sjkj7 y\ܢK5]xt1:$Q"%ym0l,ܝ<&s)cj=,낅 %IL0A{ބ2_d f,.=TS=2E wt P6Q=v/4RiB[W)ᎾAoelڰMUkZ5kC!1 H_Vl*'ȍ` $JWsR10Pu}Rm~gRKR+?#d49~bVe}]`8FCE%558+v+:e!3'a S1}f5_|SS<A 3CdbbU@5l h{(NNҡWOU;bfc/z@ƨ}r{VRo~;Dэ! B'FxTS9gz %|f1'F/2 sDZVs{Qt X&>d95rR{g͝1I%.2Py $O&XFlu@묻hw:󫛐wLN K`7Xѽ dlMىՒL~^j벯0^®<hX?;\+߭UkB%EJe-Ɨ T#BdɩvnYULx|R/YK̀)#}gc*eqCK:Az`*TY;O,p~GX$.ˤ$K?/?|0LDiZu̥~4`Av~ǿ.ӷk9w/\UԊ=Dri+[ !gsw{t.٣6vg.`FӢ@Ѫy],g|Q;9LRqLV&zׄr:RM4JWb>տ 9w8_A[B`%aM8&mY/g;D Y}†O$ rz6D+=UZW+ESKps*hW,DyMUS;N aڨs$5ldo/n#j ?u'6Dsjt#7ЉfzIj;"JG#D\Cv~<.+Y6Z".0vfwV_ʍ{ J_1c 6X2rA X X/APtK.$>K1$ *,53lܹiI;rAA1IΏQ6740l!@ңw\XՓ> ɛʮ=P(@T rU Ijǚ2PKÁ tuj ,A.L§{  )ۙCWDg̭SwƸI#8E_PP&=lg$U +\U *s7}0gMeYCnT_Wpzb⟛W~{2}'LP7cѡ]J<*M0_Sw\_PJS6uKW΄^1OY}a|m:Fdu{E5`^Qr.`kƍu CT#hnP@Ho]Glf11A+$bk{G(JZi`|ydG~Nt⒨/?MȠ]P/SdOv$#J呺ԓ~]9߽KmMfux .Wpq:hBPbtyο ݈hp|QOw_$jM$ЩA鯢?QVlJVO\T~RfJ0ZCBy}?gL5vл_\%7JE&}c3r+]kBL8NrCo0&*KK]d5×=P駳ޚ Mt-6L ~3H]k/篣B?XpE? B'D aP8Cm+ʴ?;mRUՑN;xyfCEJ{}ųӻg'?}tLqz|#Ȧ խ }#TxoZ@ߞ a: ylH;!>oYGJPG _U1a&S8헃u xҪd^úi󤶠_HhFw$aamh^zrQ f,/? aE#Ga>|Wz8ƚ'!A$FATTWvx\{2cMqMӁ~2$3?:_~{MHO[Φ0H $(ș"-x6R>ůe!};/p˟~4$'^=m5Чnl?=cwAk@1`#㍑f5q~I1L/~ $)Fb쬑~i_釿RC % rz&#CF C'-~:u=b kcj6Z T oqOa)΀ōt>(H Lu3H7'+ i>!u7%#44`O\TUj+%r1ʡo {Ix zMϢ$>4j-5Zt: U|•/\? TL1 TK(w͜,~q Ұ]ux_KF!$T0C"^ p5sᶋ|dh_{0g ܒ7NF7K|^9a/%`{<֡r]ͯe`&d5p7.J :"I3 9ΠZA?VAiʮ}$E/֚3=kԋB%kfӬhJ "/6%!uoX:cASt`|a!BZoTji3(޾W?.%%{1Vf]i$iR@UR~K]F9'D/W?5,P[I:[Jr:f-i@˻o?Fij^Q Sgx*_{>QCk4B\3c'A.,86޺@x ƧSaaI:0]3rDh6gibi&iib׬Խ>On6KQ½>x?\:GO PrކS }G>`~YBӻdOgZ VpKKpXzLnP /^/nSI8G xB` rB I-VϿ˿BUQB&{~q/.Ϟlz\4^ P5[G4J OoF'VL5OVw)BSESuKd}bk%rBx%9<Uٚʀ(Stҕ8߼5i@%ZF!OsQI-(ٲRN C)s)C gRH;Q%?|#3k*$e$DV*_}/) kE>~)pP?!ŀfm [OK%"O@:87J9\ċ +ijf= ^dv?!V2턵Aod:OfI b{ɣvQ};ge9$g&Z5Chgָ/?.) Z 8 B8m]l׉ EOZ+9sXm) !"r@ⵖ;D;9 YO9>BW6}6j # mƄ 8-kPbUlh£:]-sq )6N{kzL͆\j^8qIeˎ MB#BtqY7w #^zjZ3 []i~: 'X֌ D~ X .JO7Aj*ja :\np#jOݒW#@u/qPP?nVe`^z'fwbO s&hhmZADSzUKu6k(êdD8WZ]뽶叴kݥ [cìCF0P/3%=?v\-d?Zp!]\Iy6'9ob8Й!sITFIoVW5cSג'Ӊ2''7hC<4 &2@CPҮMy d0;Rզ]20m1{V5;?v 7=LLZk-!|G7c(GX4DȄ C5|arnoV q :}S:am` QDijb ͂ R+$X∟Yu(M+hk4`Iޠ yo!,i d F<ڍ`,Ri"h/Ж8ѧ 9ݦ+$;{m,\/~'~CIALƒ1X(=]ispE' $q=PANJINt- fSO'գ-DK>{NI|5׷X+'JAм8E-˳V,t_ EfO,=(PZ$tN9yzFZAnϢ1_u- p~8b5& Mo*ZnF%\zӥ*bYOs e0XvWɗj8-iDr{, dKrI",WLѲDb6p-Q~uCAߕn|rɱF>|F|Va : LHd٠J.[n5y{c>Ik/0ANm\C~xp#^=`x 5PW14^hܤ&"Wiu-ˏ(c~[0ǦtRXɪDRRڂ&`SP &ꝫͪkѶ +1'>}ƵYw#{Cc"J*e[p"U@}#7Dc?_)KFED*=Ą ?DsYeC'ϧLk4SuNTBI&+̲ʇ"eV<|_qu[D8L}D) Np.Dfa%]2VBRgqXo 4\ͤ wnOC V ( B0nC<% uH+\ %n.WI&Fz-N5]*IL8,+᎕f4cku[+!U.犑Lse$lSڀڀ]v(/|]l;lcZcWxuԄ P&fǿNƠΛ*éD?񕤺6oT#Ɂ9HP!V$;? 6H<>LJag{~c}5+Ė Ġ& %V0aC*;-~iHVE 7`{_y+$ZU 0 ΁=f3D8@X;)rd3n5MBqcڻ*vr!b,XSY>6*Ǫ mj0 h)OĆأ6GjPgū*w E।jprF|= ͷa /ib]{TM4W# HxNpV½%\,If 0he Xp~ wj'7~߫-y89{9 DD!X?[$T=!;2i3“jA@hE>ր9 |:01!3S8LN"on0(a^~ՓnՍc{zvwj`^PCCȢx ZsN 2 ゔL! 7{<3GY}~B`)IHF< 00ʜ/F1չJcS E~ɡhsv}8;1LϨ@Hޟo)G*H7,e|ѕ̗:Ђ$i_}X3}MGxj,LÙl?iGo.T¤ZgFhz@sZ7vH%{lZ2 ^ԧR8Y3Trܵhr>aBI?~Dzΐd[H_' wUPg-Mʧu0B-.Hb1];>K'+zEI_y ]iNLvU{3g/4=P#+Fn.DH°'DLEhh(@rhc%S ԠZژe@G/2^+1#d..X&HP%ޣ*{%ûHI>Om|>W?~UըF_~WmHtVjSC)g]-imj/rBIiՋ]LS}PݐOؙhD,$:X0ƈwuof67C``jph) P<=e7㑧.vH3j(2K4 !$az9z?P{ZI~̍a;0/)WqO8h\^ېq*L3ӊՀ;[xp Ey{:`TvKyM(f˳k wv徥g;abˑ~S=U[򞺦9{=s[c ^u }:^}NuYRHl֏3 hݫƥ&AFa05DWs\ᵧR7~P".Cw}W.emU遉"f4KAm~ۥ:Mkc(z(H#@t >@Y8:C!8_f䵲i&t 5ta!Ĭ;7VtF*8Nq{|~Mb 11i#$kق_hIk1ޱk@ql\3PSi]R>3IWqRWt޻{W?*&j yu&hVn ̪%^jd8OׄlD_r -Z|:GlJkVGg{Zh,~`k7) 7Z'ô`P"n¦F 4R6ߢ^hgK5P1>$hI l3 ?6Ya[}EAқ:?ҡ塶 9=h`cl'efNs^,uHHʳ,9`~،8 -Ξc?t_ ;̬OjPU`S" Ǟ+lП>jxwlpsO^ gJ `U%=b,7-Mp u1oq60gA,b儣OcιK̹bL/yĨYo9ő,0ѩy %HgSEzjfɊ0I5zro _~o^M@F0RYh+e'QyA\f}u"^VH9벵rVzOE8fN=4cUi:s,=RjÌ(j\O-*ү _:cr]X_4w8?KkV2+Y;&¤{ 2QODȐ"4@Z7q0C,kE ٬Ey橙u2- Skb%<4oQM!!}%sb0 ;M(s2Fc0F0 -tN?!)ܛAd8 U(W܇g% ^Y~[78*5݂ UG>3sl JR Ѣl qE7ogX@|;cM)ijFۗS2fLQ#wa φ w2kJúZ U+4} u2ndfol'^Ò$UkDJh<Ha\ [dQ ΓOQ  1s2J{[Ġ n߽}hvq2uzn!btm]L骚Ckh/ ]'Z@Hcz/b eE7 ?/H4gB_ x\u<{yNI - ޺.<y]|;_O+?@1EFR m/YqFD5DpA9E4 i"b71e?)&`C8iٝʷ 1fY7kIK: ]b8C&O?Oz?,0ƚQ{Ojv hom;?TH :Pik3 {tLOjyDJYV#4_ I.=nҀ$IP[eHZPrvތ_;.!`~ə>7Q韾r/ơ 4!Iv{^xCrDw0!*KACDb); wMIQ=GJi 갦ЬhFK$oףvx2|5=+,}2MeV- JPecN:d$$yowZ.O×ZJ"o IYU %:L>. ʐ|]yFs{YBkĬ`g*!6F]WʽJ̜6zZIdKIޟ죳ekںo!ᐜ+ZR%වvG*9݇DP\Y\U՟D#Fs#zV82F%v66q-('Q `?Eh\;kĩNN~cvl̋5z@պ!NWXU헏n]$; k7>-~tF>A?=u,$m]|`l9sSɮƞo]<l7{AỷOξ{:`]JQZpюZ/]˙$6S󎲏d"O%MvYuE||;^9g(5ԀQpY߽'1_])`AZ2Dk;nir#U׽owdߥd~=9.L&m3{<o} q ˿.<_$Ӟz$3M"._ӻJ>tU}W>st1M57ːwy*2Zf[I|=]t%Kz,ŷd5Ho8:W.UnFw ]\/dZ(G߾y[_2|CEG5nFY]3V xӡ06v{;"k{C+@,,kw,T!ZZ{$(ya=~vr٣o{|)@8QDzߡ Q }6ZFtn\°jK|;ˆ fbIXS{r~׊m?Z äv ԏ_>cB;8m) "wRzV,@0B5c@H'?n$SIENDB`bzflag-2.4.2+ds1/data/blue_bolt.png000066400000000000000000000026361200563112200170340ustar00rootroot00000000000000PNG  IHDR@@iqeIDATxsJwQQMcm\mMM(i +[Y%,gr 8 mmB_J0hYsYXsWg$:$7=>FOCCrct*߿B*! !P *xی@d9% el"CQOvx'Q ~"}z]7 Q/wU2Xb^!#P (`xH=#~T=`Ft:xչ%E\0%`L/~#`"攘9)jN/FWcQ@\"c.2ə %ͥbisa2cn2͙'ͭwq?J0jIENDB`bzflag-2.4.2+ds1/data/blue_icon.png000066400000000000000000000130601200563112200170150ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATx[iUՕޫA(QP)Ʊ jgvvtZ^+qI`n'v,b*(*( zӽqZ{w8}J)(tR`uoy5|sz7^ȂE!:Qy_+^\~E_~H;Wo'ѣ+&R@%i`—ң>?L3]wt˓7GWWwl[|AxQ_nxyGk ɓĉvޮ}st SHxV­L2Y @/G2YxRiU[[6oެjjjw:G׾nQZ .\T2V@"rnyٯ@xM}FcI$Ն w:G|UٯI r!A:7l|q?܆3?"*𺤋o&ͪ4+mÍfSy_o<ɓOrzhL F]БWf%4&H ʢ(>DSizV)zH$3f7*rd{DUTPe/]=pࠨD GC;(? tN/"%s@'rӧ\ÉsvƉBfG}(3v 0aDt^ x} v+e>h@56´3 _T/BaKFyXu}$ƍBwW8S0ٵkoQ[ES @)Gʛ]!u“ W F@[l~ ZG!1w::>lV* #Hvoء`F AP# @X sL0B`qDyTP];~`*p!*My~^n`}Ia ;~_ߣC/#S9YI0'lMf=4\J3Y&A^ijHPж!f~ڬ+ۗǁ9 AQ`B p7!t]K(Qh 3o!q>`߶R<q%V0^<{TA K3w!(v;]3/L~j7)1A`9LO.47~uw,)f%W\{GXCaBr"g9 `e@a܈~ Vkm„ 9ԙs)RcaAS>e`ZXr0zh;1Korxnqb \e&PVIgZڞ3& 7JU+FͨNک{XV1 &FߝHڎÊ矂{>S7dhfeCr/ot^#O&Rd!eݠʮ&w6B]PѣwNo4 ‘d`$+Gڲ]}46[a܄T2Ye+ڬ2Iz&{׺;۹K茞Z3^f$[e!DL-q/}4U@MTA`zVp*3aK IڅY* LyfБ `/BQ y8>z )N6 K? O`4q_:kt56A`Yx'HͲؤF,$x"m`[B)\|X>E  <S" ?~?OwC8@uu5TVVB>}U)*U(deq+!"D<mĻOC$Vɳ&d _|P]K@]/km8z(OeEGZ:X NAA8frM"45l6B C&@3, N?r{\@㬄 B7h88r=7a5hD_3,W_'[`˾8Q1SD8|,':|a135oS.d.;"z?Be>Xju/ oSm<2⠪F^ cu W,,o{;<¦,p,i8ѕ1 ҕf "M~뎦ua(4Qh,Z)-)fy3瓾^d̂Tm./j%i)IYvB ^a4 yeh̲%{6*&`{crKӡL6y+ٛ/hf8@6Y=P6 G*JJT Z/{ s qh/aMFI1qr9@[DHh 8/u|:)|.1 H0t] m3 ,0K:_B3m+[aLƤD:l"4[dYK 04 qJI^'r T*IPն7b{vaDZ]V;X*O(ȏ(@Gni0#L _Z}VfEŸ3ip #*26a;P#m"pS2XV+l^!A5×T X {\iL' {zsngͱ!a{9Xs lcHPo94h'~PDfΒfMP\4hwdS ׫`i;/кOٍ"Ͷ΁n{ks2eq7@㲉2ͬ8Al!r *>+̻rxEQmzD$'/ H& ST,b fι &LOκ n\r/\3i3Nv`&Awت+KO9~²Ôo]gKϽ ^ p ĬȄ uVZh4Yyg/;zF;^y p wV=Yp+7xG);V*뾊ʞpMS;YZT`ӥf" T]4H GTR !}S6nzΛr1i|> #FO5)3AP9Ņk\<AϞ=uP3\𰼎dXP;x@#mڬc(6 ,oZ0> E\Mt<[?^ 3/ )vc)F &l(L2E x@drv=+]X֫glpL{f6f Vq**?Ҵ8v](+̼&C8'j:D [9V-}x]WK4 >Bs>htEˊuB-g(|އ~Æ コjڏ0r^ҸASlgˠP }WKgVZ_Ca#Q<(e2=&f0٩irS/0aSgC}\i ; {Bգlk{3/Zx:aXi=.e{QdNMUDžVE&+BfB_ 1)kt.>Lꩧ&jQf.yƜ3W2\#;؜5x֬ݴy^[] ~$N,YQ, 6j%Eie Wm#sQS8*l!?AYnyLdl'hnjo7V-7^ }^~)N*֭[5-'|y;y.d'fv}j{E`AY#xQ+.E&e"ٹB֎Y;˃mb }+xu/E^[vu&MtLfyWśm!Ka-_ƃb`6OBR}/s5EßFIQ7Sbp]j?<,u ~qݟ4o;~*5+n׶'TPk؊Ma+CUfat /Fm^_a.G?T ˟ n}&y!Cʚ-['-76lh믯]6y?nE,IENDB`bzflag-2.4.2+ds1/data/blue_laser.png000066400000000000000000000003751200563112200172000ustar00rootroot00000000000000PNG  IHDR@@iqIDATx1 @لBJ*s{Ebgn@a> ٸ j C`LSf;v$!n1B-%)}<2p.'G                wdZHIENDB`bzflag-2.4.2+ds1/data/blue_super_bolt.png000066400000000000000000000177001200563112200202500ustar00rootroot00000000000000PNG  IHDR@@iqIDATxtTյƧE*E)RD[0bQ4b!(Myؘ!H#! HF0Fc$FXXkR⽼7~gj{uV{={} qFF_\ur nfiysA[w/2?wy㫽Gc(̦i#`w䞖wd7g068gf5:C߹o!5׽yھqFߓ)si8T 5l ,;"@N{:e68787S뜑ͫsFE븞taY3QDV+'`4d kԘ2mNO! h3ι`N3.ƹ(?ڙ03f븞(le4:Xn5Qkc翮1[i|wuM[Ue]UAn{(Ǣ:Jq.4V9ߝQi_2޴r{Ԅr;!¾g3;q}R=aV}!05gc<(bp O{IS>r;7|{w9ڱ)XtRI`++'W_\b_3NҸ6f$=sO.yyecy"E"&'e`a՘1Y N xwm:Aס-Kq3kWZeV" ԸbQ)[s4~qS~Sd_{f+Rˬ3*Kxn"8?Qg=*>|ߩs$<\Qն;tP"(O^nMe..⯕ ay\yCiZ?c|{~U`6Ɏ/~8 p#0͏EȽr*:!ܿg$7|M@w:>E-]v 57ji-zEB ȶnmeY9_/},1EV~x\<:X!ט*pLhVHJݺ;8jNn5~LRBϪq&T;S-̛Vnrn~`}@z߬@!h,Ը_cb|](/گ< ybo}=/I뺾co(oНwprq/)}4qji_$.s38 ?)&K ?(0;˗}pT-+4eF^_TeצTۏi"kY !׺YϾz[plDk:YobNi_X :Nc`SQ>{Ÿ(?|t)Ed6֊j {R ɬNO #q[KJ8>(z qF¶ʁ@h{~A3zn=|D%l@na|fNܮ&XzXV 2JE5k[ Y>`M:*_^Vzn+-'`Erf4ؓUZѝG Y3w{R2435RأIxSauyJU6Qkneu>9{ICVYuK#/_.cwdblw- ˁ({~D@['QBO?&aeLH6YFPEp,aP)%3^ս~[JX^!_K|D"LR8P{Wفr]S#dzgY#e[d9KeKfaʲR"jemUۂ̫w^#"֊-@k;`־em6״;/cs|̋%^`^XzM0PC#VpW 7 C_bM;fUT`(BȤRMJK6me0:!Vx+/Ym?1SH΢5_3[׫ۃJY;ݝNS~ی|_=qv 3aQ,ZS)Ӌ+!]DLX@XDA.x5F eC̽W*J;qx2Bdi(g證RJL]Xo{Ζ]wv͎}JgⳞ[vz~,wP.h?'\r.:lp" n MBT}KTwTn ΒXXuWySzu&!yVq{o)փ>,{?7wwm CJwn=B} >۹?߹/ I /Mx~KH:k0|jD8%w$_|%%|3T *Iެ=_B uʭjߗeYwx>ЁПN诖v[?">t݇{ !z0/0J¢`4g7Pt!Zy8p?8`"Ew4 < RI<ʼaZpoKo˯jэ,NK>o˼?s0|P[v϶ = `8d9uۡw{Ǹ X+0!,%nzlq;xֹ4 :Y/a7xp #|Ȃ #)Cr dʍF1! q:ڊaPCRO?ß !0 2/s9S4PB$1{z@Hbڔbϗ]wL$RHiC2$Y([`df8=! fxE}CU;@Xg;|Po;wj;7yxRz؄ÈJ,a a~`j A.CΙ#UuF@AU|SFp=JQ'R{?)@O) y<Tx)cKL(<, Ԗ,Ų-,tܽ}_K!CACfJ Qd1rbkX ECX'Q*`ތ'ƀnjxK _SFLUGTxLqoRYz1; 0FOv <  (55EaMB6xعN(`תE@-nqvS}CF76LAkPpʬ)C(wACD1s_l //(m||TU/FH y y[^$lZv1~9P8Y-` c29$6%% $qwP :b̟yA [f>\jWjԊv̪q6sg5cx7+!`L0'SH.ˆM9N'L,ah~eza("a?Y(l2ZrM^*D~\hW1PjGTWHe(ӫi;[؊2[vnIPu>yЬ*gJZ3ARv;G8ؚX AeN+6k"ju5Ardњ q=Z|u3{5AZZg\P J>ÙEprܚ Lu_ 1H4,i-j/ڇs*Ȏ Tua)U0;LPgv߹N@ *?܀aL4Ɯ ҃nkͧCxX߬nCar8sZh@oBq= {.E6k=s.]K +~$~^k|>ޑy$Ĺr@(9AIl o6,Ѓ*ˆj!k<ޙ`P`Td j{'@Ys"$a7 8yD^ &ʽd(}7ホ 2y*UG>n$Q D#&815]S&(OVL%k٭Bk2% 8-H88;l{q,CW 4=ņ MlP15*0J Jڀ`n#VYpU1gL1g?g>! ʰ%#kOPR3]a)qGpr!^ `bz;(O(VҘl0g +InRϹ;-N% w;t8./aLV#tTI6z t9~L1V4'w Guu`6` 3~AF}Pƹ?=Dt"`lYx]$4mt ɑКeQI׮sphܭ erۥ$T{+`g%nhɕO{Qt/)3CBW;L "J^SYQPyM/؃!Bң]m ۃ?k 0!yRD#O Y)YZNyJ:spJ\ m0\ zL#e=!1HU}!x(>6.qLh:I{UXwB?L%nz욉9.1=2F)Ps1fIT@}L~T[>Юőmpq_K,QKkg*bsLQlFIi ηcL]bGgg}.ι #aRo}4LuhhYJ#G}diM;x>AM}5`2['8x/'؋+1sǦ6v*6'5F^!*$vްO:@=Q(`NQ((%>&+7.ǚ5DE N/)z%:y%S&u1!fo/:;$NLD4ZX-o2 ~SZh0 7v P YSy}opE6w]d4REkRi.Nv#U%g񚤵&ƜQ4EZY/2<%ʑ=/,h 59Jg:E;%;s9̮zAo D'Xh" 4Oo `p&vPZefO5)ui;ѝw T'4ʈs{D@Jʛ› oxgQ"1ƈ E{)pR=/}oh>iL")j ) 0/R\Gw~ڷ}w(RDh|y/YS̮G^88J7v sk:ϧZ8vLU4mnKoo}mvo1_BQ[ƾ5fv]&TEkC5.՘1PhP'¤ |T3>!ys+'l_zo w]>&(fޠ'c?{f\1>hۼ2wfsFEQ>yxbᴋ˯p̼mW$lZYw[elz+3JbܦKAuysT2웣цB8?kC~Ilw؀S'\ _X1P>o;`oL읞K,0s`%復f2S~=x`pߡ.j̣>fl*>41w~6JJ9Q麱МZ^S[cf->󵯛ߜƏ4J ־>~CG /^d0V~e0^k۞_Lq-~u\Ũɧ$= f`_NUru0X5Εt<1Q0OjM| 8. Qp&GFk?Xgη i{&DziGTT>Kd<4Y=cj$~-V&{/[M5%](4 |C1?p˶]*6^?i _WѾw@q\J N;Ej[W0̯]琳?SWYm^elȯ% @Y ܼ4"h'p\6[_Xl82Ư?re~]2ZP1Oo`&u`_tЛK_Vnȯ;UŎL`_4-;wGLv8@`__RO[]~q~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?ݗ?IIENDB`bzflag-2.4.2+ds1/data/boom.wav000066400000000000000000002115641200563112200160340ustar00rootroot00000000000000RIFFlWAVEfmt "VXdataH ''DDEE``  J J @@XXff ,,44tt WWzzxx  55 t t 00GGVV{{  66jj,,%% pp6 6 yy= =    '' j j   0 0 | | d d @@ pp[[yyUUTT; ; C C xx  KKqqBBLL  pp33&&pp((22AA  XXQQ o o ,,oo\\11 DD{{@@XXddZZRRRR))bb߬ ޅ߅LLss?? ((GG??DD$$88QQll  XX>>  XX  ::33   XX44 4411ffpp((aa88hh<<**nn88މXX --22  ooTT@@00KKXX88@@11ޣޞܞ܇##ܥ66 PPtt nnPP\\hh||ll   ,,aaLL99  ((   77 jj44dd| | XX]])),,VV     | | mm \\7 7  nn@ @ uuߩ,,} } dd$$?"?"wwSS֎ҎMMkk3*3*))$$11ݑ  ''!!44y2y2  ޘ  @-@-99!! HHX!X!..++W$W$''kk''77++**:.:.vvBB``  B/B/qqLLKK44ll11 % %;;;;~'~'Q,Q,kkjjS S hhcc  \\uu,,o&o&"" z z OOWWфqq,,yyllSSݩ&& kk } } hh==;;!!00%% ҫ22QQɨǨrr HHՠ00;;||l)l)7799j5j53311h0h0..W,W,))##88| | II̭̭dd00jjɔɷη΁ց****44 / /8822,,!! yyo o   llll88··GGxx``̛ЛЖ֖((ݽPPRRwwNNHHWW JJ$$",",41412200,,&&*!*!  66TT99%%kkޞթ̩̮ŮttXXʺ̺\\ޣXX  [[ x!x!<$<$P'P'))))++++((''''A*A*,,--00V2V24499>>AAAA??|<|<}9}944'.'.{'{'<<,,MM``ooߌccccxx88xxߓܓEE33߿,,aa܈ttְڰڽݽݑpp'' //##M2M2V)V)>&>&++**))####t$t$5%5%E&E&&&<&<&**:1:122..,,--X-X-//D0D0//.. - -**G'G'O(O(++,,8,8,--11W5W5k5k54433.. + +&&`#`# GGUU. .  66AA880000SSԣУуӃHH??qqLL33ווׁׁ;;ٺںhhFFddOOߔߔރۃ99QQ55AAbbkk" " MM~$~$$$%%:&:&&&''..,,))G,G,**--l,l,-)-)##GGgg 00''11664411 4 42211//..,,++@)@)''$$hh44YY]]ճ<>EKEK V V__aaXXGGJJbWbWNNNN$N$NJJLLKKII==T0T0""  ppPP((HH$$,,??\\##T(T(,,``uuNN$$##|,|,3=3=DDc?c?77O'O'vv||A A ccSS""'',,//))AAOO:: ccQQII EE 77FFvv//qq//55ݰܰެ;;NN<>xxiiP&P&_2_2==$>$>::88664422//++&&""ll  4 4 66hh ؘQQ33 BB\\ʳʳ88((22ӄք֖ٖvvIIoo//WWxxDD||XXgg __::**`3`3^%^%!! 22!!i#i#%%##y!y!!!T!T!!!v"v"""h h UUW W K K ee))44z7z700{'{'qq\\<6>q=q=99_8_855.4.400z-z-(( &&11  }},,DDvv//ddժժGG""qqFFΌ،ؙHH֓++PP00//}}$$$ $ ,,m&m&::==8822,,00%%LLQQvvllff IIppmmYYSSۑّ֖ӖϤʤʢĢ""ααϷϷܹܹxx55ɾ̾̋ҋҴ״ppܥTT ""BB  sszz$$))//4499KBKB0H0HXJXJIIJIJI)H)HEECCAA??Y=Y=9944D0D0{*{*a$a$++b b ))llTT||¯ǯΞמפjjwwjjII""77@@x8x811**АŐŮЮkkSS**++aaee1133kk‘ɑ~~QQְڰ==ݡ>>DD "("(n:n:/G/G;H;H=D=D@@;;b6b6~1~1..++()()&&RR< < ==;;SSߌڌ((||ννWWœɓə̙̯ϯ@@HH   ::ll&&v*v*11&:&:OCOCLL`S`S|S|SPPNNhLhLJJ3H3HlElEAA>>?9?9 4 400--x*x*"&"&!!  $$  ggLLgg\\EEMM׏ҏҺͺ͔ȔȻ88 ð~~ǔ˔˛ϛII,,XXhh B B &&r r t%t%@)@)11<<,, G%G%''D0D0n>n> J JIIcFcF]D]D4B4B??<D>QFQFhEhE7C7CAA>>g9g944..))K$K$\\PPX X ((\\MM]]ZZԽԽÈÊ͊--ʣʾdžUU11یތaa33 I IPPKKfGfGBB;;11##88gg!!iiKKpp PPxx$$**33qAqAbAbA??CChAhAj>j>::774411,,%%77  h h @@;;,,ǮǮ<<{{ssɃ΃οӿDD ||\\UUdd@@ tt&&,.,.YY##!!K+K+ 3 3::DD G GCCAA??w=w=::77w3w3//W*W*=&=&<#<#UU  !! ZZDD!!**>>hhNNCC@@--ɾoo޵޵ PPżƼƥƥqqQQvvݵQQooyyjjX X <<``cc>>  $$**--55\E\EOO@M@MIIFFAA==55==%C%C<<<<88P7P7~5~5..**p#p#22""||ZZSS55||\\``GGڵٵٷٷFF``ppQQľľ󹣺HHOOŲżɼ&&pp]]77kk]]))RR&&uuYY  ||))R"R"""0#0#a#a#$$t&t&$*$*//55(8(8:;:;wAwAIILLIIGGEECCAA??==;;77K2K2f-f-O(O(##ppDDBBii LL~~߲߲^^kkyy\\HH""**ߢKK__XX$$3*3*77kEkEIIxFxFCCAAi>00DD!!::SS!!%%((g-g-22 6 6T-T-220?0?66S0S0@4@4 3 3..T/T/(/(/,,@-@-//h2h211--&(&(%%,,4545e;e; : :0707553311//,,''>$>$""**<<xxttBB88||__؇@@ƹƹxx,,ԮԮgg88PP$$88ssJJ@@e e 6622IIpp55JJqq44wGwGIIACAC99Z%Z%SS88w w .9.9BB<<44 . .F(F(  ,,<<88šŔє  yy? ? ==55ĴZZ))ppږߖߗhh\\BBOO;;4J4JGIGI??>3>3\\((##dd݅66))??2E2EJ@J@4<4<55j/j/))""ss  @@66OO$$֦&&ȔȪת55_"_"  OOjj۽۽&&SSzzdd!(!(X(X( LL 22ĉljzzmmPP11DD܂@@ RRR(R(66/G/GRRQQMMmKmKHH`F`FGCGCd>d>7700%%$$ff۴ۙ__KKT T DD// 9 9//NN,,77UU++55<<XX TT4$4$8484??==8833j%j%! ! pp ##,,,,%%.. nnQQ**pp**CCkkAAٺ׺׀րּּbbiiʰðÄʄQQШ qq??wwšŚwwзѷфք֨٨mmYY>>,,vvm m 33(( h"h"$$&&''''z'z'v)v),,1177==rArAhGhGKKlJlJ H HFFBDBDAA??5:5:[4[411 5 588O5O5..))!(!(##  pp}}66^ ^ 44//8888ݛڗٗذװPPxxϐ͐[[ȼȼȷȷ߽߽ffŽǽdd44ll||}} WW yy;!;!++ : :&M&MlTlTNNHH@@;; p p !!::FFdFdFAA<<7744//++&&!!llhh9 9 OOӨ!!tt88ғ͓NN66--00|6|6//މ``ȓƓƟͬ͟լ\\__}}CC))4 4 ,2,2DDBBX1X100c!c!22BBDD@@==P;P;l8l8j5j511++##ttPP zzݺٺِ'' $$jj޸ɨںں̤C C $$ԃƙҰذ߈MM44O9O977.. " "  ::ՠLL==]]kk||pp  << Q'Q'c5c5EE;K;KBB22\\x$x$d6d6> ޘߘߕݕ((ـ׀ִմ88OOļļ""^^ccZZρӁgg֠נvvي܊||33uujj@@| | A A ggt#t#:,:,::??%%99==FF R RMMKKII6G6GDDAAV=V=<<6600--(($$ܫ \\vvƞ88Ɋɤ͖ͤЖމ,,''<<$$99BBC:C:*+*+h h ,, ''88p9p9..LLccڄل\\tt  . .|5|5((M4M422))66 f f ؼdd++bbOO!!ддҐ h h PP]]Ր00''44ttҜ՜^^ ݴ-9-9@@ : ://tt##l l ""ZZܜTTy y p&p&88`J`J4L4L@A@A,,   >>HH<<**00::ttRRZZJ1J199++%%AA"="=8866|4|422--))N$N$>>d d hh00}}EE٬٬$${{,,==hhiizzĜȜhhΕٕjj((dd)) XX\\!,!,Q=Q=NFNFDD@@E=E=-9-9@6@6 3 34/4/U)U)L"L" 88rr߅ޅ޳޳pp``wwRRdd$$‰…ŅNNpp..  MM;;&&44ODOD>BBIIQQPPMMKKtItIGGEECCxAxA??<>'A'A>>~<~<::-8-84400--i i ll{{kktt[[ ee))--1*1*%%++00kk[[--__))> > h h ((XXaabbۅׅLLԨѨ}}κȺZZxx((ggccRR88RRxx $$ʾ̾MM}}MM dd**::xJxJtRtROOLLII5F5FVAVA;;44%*%*$$--4545,,LLII qq!!]]EExxmm44׻׻)) ..AA##pp  <<LLz*z*77FFQQTTlRlRrNrNKKIIFF??77**$$6600"" !!ƔДKKҜ˜˻һ##ڬKK""  44JJNN`I`IEE@@y;y;7722,,r)r)''##ؒ((TTƉYY77rr[[jjAA>>ooX X nn""8 8 pp\\__k k $$;);)|,|,c-c-=/=/44;;6?6?==f;f;l9l9|6|622%0%0\-\-(($$g g %%NN,,llzz{{''rrи̸̘˘˨ɨeeܲܲpp״״ttXX ĬǬ>>XXݧ%%  1414XHXHFF::((P P LL۾EEj&j&  pp\\5 5 FFyymm--@@!!1"1""%"%|+|+33==FFmImIFFADADfBfB @ @J=J=Q9Q95511d+d+%%!!gg  ; ; NNVVmmCCwwww{{\\rrΐ88qq00aaBBȹȹĸNNܔ&&449944**)%)% ::LL JJ11<<==ٿɿɇHHJJݸ00KKddGG oo  EE%%J-J-L8L8FFQQMQMQMMKKIIGGEEACAC@@<2>2n0n0--=)=)$$ kk11ff--ll??ۗppTTȪȪЪЪUU..WW҃ ||ll<<āqqǝ˝˨ϨԼܼXX))  F F %%x(x(X.X.99EGEGLL$I$IFFCC==22))88}6}6))"")!)! HH8877##ƷOOnn jjѤVVCCaaܢ Ǖȕȿʿvv2233zzؒے !!&&==66}}  QQ$$QQ--AA"G"G]0]0  ((++ / /|8|8DDGG&:&:7373CCOOKKHHUEUEAA44 * *H=H=AAl9l955 0 0**|$|$з!!nnLLҿ##»ǻrrUU9900ڒAAhhPP< < c5c5AA==33HH((1212c7c755M-M-$$ # #&&88MM` ` <<ww::XX..EE11++<<ڙmmppծ֮וՕՊҊ;ǾBBWW--ƴɴwwGG((YY>>BB||ZZ,,&&k8k8==55??JJ??1>1>yFyFCy>g> G GDD??1:1:[7[7224+4+$$XXxx aa==Д봈88!!llݴxxAA^^Ø̘DD[[((II11>>> >     ## - -e:e:JJVOVOKKIIfGfGiEiEhChC@@== 8 833j/j/((  **IIFF SSDD˜͵͵XXUU ss&&VV44==,,dFdFWNWNJJFFQBQB;;00l l  8"8";;3737''("("  "" ,,yy::վվ‰ˆLjǬЬdd  GG00͎ŎϤؤt0t033'' ))WW ssllHH}}4"4"M%M%&&b&b&6*6*(7(7`E`E~F~FFBFB@@D>D>e><>I9I9x+x+&&--00|3|3**P%P%"";;}}AA  11qq((EE؈88\\xxqqYYHH00ϺϺll11άԬ ۠PPJJ``//ddnnff""<:>IIxIxI&F&FCCAA>>99b5b5o2o2D/D/++''r#r#o o P P ffDDʵʵԽԽ{{==մܴxxttT T hh!! . ...   >>!!:0:0@@jCjC??<>,,((־7#7#LL,,<<ʦզmm::EE==AA::"" ''::KKFFv5v5bbPP ,,@@8H8H?E?EAA>>::55&0&0w'w'QQi#i#%%FF66 u u ffggff<<99Ԡ\\bbSSmmnnhh55ffĹɹ77  **69690101$$_ _ ll||PPAAuuff ZZr r WW ! ! ((5'5'..77??IDIDAAV>@<@<44,-,-**%%GGddkkGG11qqUUDDxx,,cc88 hhZZ||ܽۓٓوӈ˧ȧ҄ׄ{{&&@@33$$8 8 mm??((  //  E"E"((d.d.00F0F011 5 5n8n8@<@<DDGG]<]<777C7CEEBB?@?@E>E><<::88665522//Y+Y+L&L&BBLL\\||%%''؍ٍ kkύȍȮ((\\XXTTll$$DD55Ѩٜ֨֜##ttXX22> > ``@@``!!!!&&Z6Z6)D)DHHEE~C~CEAEA>>99j5j533..2)2)&&$$' ' rr,,VV ``ttkkTT??dd1122KKDDNNKKWW\\--UUMM77;;Ӭߓffppv v ''%%77] ] zz[ [ (( 2222DDxJxJEEBBP>P>55""++44##Ԩzzll<>::55R1R1--O*O*O(O(&&""!!$$,,yyӠ88==ѐƐ󵠭**uu||@@Ɨ×((jjȚɚ ppӡءZZ44((\\ ddQQ] ] ++88CCLLLLVIVIKGKGEEBCBC@@e>e>:: 4 4K*K*!!''r r 00xxHHPPMM..NN**((ڍּԼ""||ԠԠԢѢ88QQ ZZ44,,JJ;;PPffdd,,99FF  $$HHk k JJAA$$..*1*1$2$2667744"5"544a1a1--''r$r$##  YY  b$b$&(&(((?&?&$$!!^^P"P"%%%%%%'')),,,,-1-1777744`3`3j1j1//--A,A,?*?*''/#/# CCmmdd?? rrGGEEӬ̬ KKFFϻϻĜɿɿPP~~==88??ggUU<y>88$2$2++''$$7 7 ""B B ||nnTT22??بۨ؃݃((vv[[88!!\\&&4/4/33Q=Q=`>`>33ppZZq q __JJ##99==88n5n511++n n 55$$GGhh }*}*))33ddS S jjWW""ttWW,,ϐΐ<<Ю֮֔۔}}!!ww  ] ] rr  77,,,,7777D0D08(8(!!  ))__܊<<RRP P ~~99:: >>RR>>KKߙۙ%%֏яѣϣϩЩα˱--ůƯȝʝ**͢ϢߚssBB22VV ! !AAII 55#!#!$ $ 11} } # #S(S(3.3.334444*9*9::77;;aAaAW@W@;:;:j3j3--%%""''''?$?$A A  ++11$3$3&1&1//--++ * *''%%## EE^ ^ yyuujjǯǯߨߨ髡ħ7788вٲQQ;;## " "  gg }}ff??&&YYLLttQQSSTTIIZZ''--**ggllPPюՎցҁҩϩ__22 ׌ٌyy((DD]]aa] ] //]]))jj!!,, 5 56677==BBXCXC-C-CiEiEOHOHHH><<3;3;!9!96622..++,(,(f%f%$$ " "VVIIr r JJLLDD%%%%uuܑؓӓȫƫ[[llwwooϾϾšǚ[[̹ɹ}}ΚҚ<<ޚYY  ooUUAApp;;0#0#**Y2Y2o?o?FFEEBB@@>><<995522,,cc~~QQjj'-'-++A!A!w w 55<<66jjUUWW gg77ZZ??ޟ۟۝ܝ 66 CCǟŸȷԷAAߵܵ22ܼܨִ֨ٴhhCC AA` ` qq##  --:#:#!!.!.!&&U+U+S(S(z'z'o-o-00))%%h*h***Q)Q)++**$$\ \ **881;1;77553311r0r0m.m.},},((## ss ``LL00nn޵++ۧקזܖܵݵddеҵaaZZȥ¥ѿѿ||[[**!!vvZZuuVVii``  YYEESSqq ##*%*%s#s# W W 1"1"%%X+X+ 1 1I6I6j9j9k>1>1>7=7=k;k;9977}4}4//..//e+e+""HHVV&&DD**jj^^==hhrr KKKK44ZZٌیۏހzz~~qq£ģkkNJɊɯ˯^^\\Өب++ss//\\!!^^EE{{ ""*,*,//00O1O1;.;.))))%4%488K:K:AA-C-C0@0@L>L>n>=B=B>>a6a69&9&00/ /  K K VV""!!##))..h.h...N-N-''@@qq####$$A)A)**((%%"" S S $$!!\\PPHHrr,,ֲ߲ЍҍiiVVcc7766PP##GG44αӱִӴӎώ˓œŽŽǢɢɭ˭[[gg$$jj$$**zz-- LL n&n&//7766X/X/="=" ` ` 11==A A ++{{  AA  ""%%-"-"{{ !!b"b"##''#,#,00M1M1..W-W-|+|+**J)J)t't'%%!!44""BBMMnnIILLܒْ..iiOOԛӛnnww̾ξddŮîQQggƪǪʺ̺;;UUss[[jjppN N !!VV55P P ,,{ { JJ__ ''''"'"'//88::22##>>00ZZ{"{"++44L5L511-,-,K K __UU aa("("CCUU8"8"%%I!I! XX,,''oo__޺gg--8800ܤؤ܇݇ݪت؊ҊKKӆ҆үʯooܓQQ33عй]] ֯دܹ޹݀zzXXII"" ''[[::,,ff&&77IJIJRLRLGG~D~D>>11 --??AA==R;R;99m6m611 , ,((%%SS 8 8 ggPPPPRRttllgg KKڭڐِ(( ..**ll;;XXYY77SS00 b+b+//3399<<99!8!866334040++N'N'>#>#-#-#!!HHiiB B 55CCآ˗͗UU͙͙ͼӼ۶޶VVeeoo' ' ggppHHRR[[LL55  llss::YYZZ**vvs%s%++**))j'j'%%$$'#'#!!d d GG T T pp11 ssQQ^^BBZZߵcc44nnnn00LLFFaa ܄܂ςDDɗ̗77 ҄Ԅԟ֟PPgguu ))$$##u u WWhhdd??RR??ee))[/[/ff@@QQ``$$44@@DDAA@?@?<<6600l7l79696/./.x.x.Q,Q,''%%$$!!rraa ??TTGG eeMM,,TTffBB,,22eeYY Բֲttkkqqtt%%iiXXKK   ttv v 6 6 J J # #E*E*..002295954400,,))G,G,11W3W33333!1!1//R.R.,,/+/+))%'%'""22UUvvGGPPKKFF%%LL::hhMMўڞڋދ޻ܑܻޑ((::44 ˾̗̾Η22IIFF{{ݩ||##55' ' i i     ''@@""$$$$v%v%6$6$k%k%v'v' ' '**&-&- , ,E1E1776644331100'/'/--b,b,**(($$L"L"!!nnIIk k XX--BBTT\\oottxxPPNN##ff ձұVVϪΪ..11((эӍVVؓՓՠԠւ؂qqܟssss&&33}}``kk--<><<;;9977554242j-j-++++++&&``,, @@ݝ55**))@@NNKKڴݴssooxx--!!1 1 dd,, X#X#..33b2b2//--=+=+(&(&HHtt .'.' FF88]]II QQ%%DZɱ??ͲѲڐBB**< < &&\\MMII&&޻ڻڐԐҠנכۛ11gg CC]]ܦݦ6 6 ++''tt!!j j 55!)!),,''  <<jjBBWWCC   KK!!v$v$!!JJZZ!!y!y! D"D"&&((&&## $$%'%'))++t)t)''&&G%G%##!!zzll? ? ||TTxxPPcc--LLڹܹ((bb==ۦݦ__RR##UU++##٧ڧچۆ֧ЧII՗֗SSټڼaaLLަ __rrQQ2288{%{%5588M6M6E3E3,/,/''!!H#H#^&^&4&4&((''9&9&,','0&0&## RR1177aa]] ``33rrhhxx$$bbSSRRBB bb55kkoo!!$${"{"g g q"q"$$&&))S,S,t,t,++))|(|(''%%## 55HH hhAAYY GGYYbbkkgg<<۰ٰ ww$$ʘ̘TTВҒzz!!֊؊33݀]] wwll[[ppllss]] EEbb99o#o#f.f.B1B1++""++B.B.M*M*+'+'q!q!~~GGBB> >   S S ##  J J zzw w XXSS$$SSnn@@Ժyyɼͼ++LLIIטԘHH##ԈՈccIIޏZZ:: l$l$/1/1 5 53300>->-**''$$$$H#H#9988aa b b CCaa__%%{{22GGމ55ޛ؛ޣRR9 9 D D   [ [ ooVV==_"_"A.A.22++i i }} V V { { 0 0 $$vv  NN & &1)1)''_&_&F%F%$$"" &&VV||uu% % ,,\\??22%%yyΆʆȇɇ99̹͹33ϠРpp__ڇ݇66yy$$oo||<<~~N N ^^gg##))P/P/0000//--I,I,**^)^)''3#3#11g g GGwwAAUUJJzzyyCC??$$\\jjLLUUբ֢ר٨::44wwCCyyOOxx CC>>``LLH H M"M"!! ""**//a-a-++**Z)Z):(:(&& % %##77]]ee5 5 ((YY44**}}NNZZڙӎΎyyRR؏ُNN''ܿݿKKLL{{ooAA    3 3 E E ggccOO^^{#{#((**))''&&`%`%'$'$!!xx{{mm0 0  ++eeccQQ00EE۲ۇՇөթߚߚ%%ߥݥ݅ۅIIܺݺcc--ooFF$$QQUU""zzIIbb G G ##!"!"j"j"o"o"G"G"**e1e111z/z/+.+.,,++))r%r%vvzz..! ! PPII'' //""NN==JJ,,99UUqq;;xx33߸22%%''//޸޼ۼ$$wwxx44::[[**44   zzJJ##66{{ZZKKmm4#4#$$"". . % % !!+"+"!! ppss>>dd>>kkUU ? ?  ff99EEOOss޸ҴԴԸڸ߼ݼ99UU܃؃ddMM׃؃؞ٞNN22wwDDaallZZSS%%bb..9 9 t t MM::O$O$ww]]ffPPh h !!KK||__ E E llTTV V llGGP P ZZ&&]]EEffݭEEaa܅؅]]FFCCTTסء##ppFFkk##eekkMM 77!!$$]#]#  cc % % 99**UU{ { w w   44mm88iiWWrraa44^^ߟBBRR dd::AAKKWW`` 4 4 ] ] ~ ~ F F ??eeRR  SSWW$$<<!!\\qqFF++xxffggs s ssxx}}::YYkkEEZZ//QQ__޺!!ܤؤ؟՟KKېڐ22ךؚ؃كOOQQ""VV9988UU99F F !!jj !!RR``ZZ$$M%M%  !!!!|!|!X X 88K K VV772 2 __\\@@rrppKKXXttAAiiMMvv wwތޑߑQQ]]ff\\RR!!(( $!$!((&& UU  ||L L ##%%!%!%7#7# 77++YY,,z z QQJJ!!((QQ&&CC::++VV**ܧާ((__\\EEhh&&PP.. 9966ss!!DD@@33//%%pp!!1#1#q"q"!!yyAAxx..EE88XXPP   bbMMPPMMߧ00IIqq rrRR^^ }}rr////ccppAAEE^^VV^^zzppVV ,,JJgg} } ""##,$,$9#9#]"]"""$$%%Y$Y$!!~ ~ !! ++!!!! w w   ++llCC%%MM>>qqݎUU MMkkLL<< AAssJJ##99YY [ [ TTEEllDDcc44vvWW? ? cc}}__$$,,ww = = UUzzփփoo !!ZZHH{{ ^^QQ   mm]]ccAA@@KK&&--llCCCC//88xx66ffQQ99uum m   IIRR;;}}ll]]11**  XXTT  ccII__??JJ@@vv\\__SSb b + + eevvxxyyCC**BB ""1144KKؗ֗MM<<څڅڦۦۇ܇ܦݦݲ޲޶߶߾ HH44%%~~ZZww//@@kktt/ / NN;; 99RR55c c ,!,!ww**<< [[zz11m m   _ _ A A # # ^ ^ S S NN@@c c SSYY{{P P     y y 22mm44WWttcc..,,ff""FF"">>44@@zz))))mmXXSShhGG y y >>""##K K  d$d$M$M$F#F#X"X"r!r! <<&&  y y 2 2 --%%EETT__ߎ}}&&$$UUssz z TT 11BBMMXX-- ii**SS88OO%%``$$FF ==&&hhgg99DDcc}}44||ss44 llffyyRR??DD YYvv^^ hh;;]]QQFF((pp)) uu"" wwuu44JJiiffP P UUBBBBEEhh""PP[[!!11DDQQgg LL>>++mm..77``kktt AA]] VV44;;ssCC22bbhhHHNNdd00   + +   oo11^^RRBB  {{IInn66UUUU11""  ==BB{{ G G {{YYBB88--}} 33EEUUcczz++^^kk88zz%%OOZZ??NN--((KK $$++[[  G G ``||..%%GG))tt..!!^^||[[<<E E k k qqIIKK mmKK++SS!!99>>vv!!::BBII!!((HH]]MM9966ccg g 1 1 @@ddFF>>,,FFTT;;IIOO// q q wwC C CCaaLL**NNp p ''BB  oo66''00AA::   DDqq$$xx__FF}},,99llgguuYYhh..11kkss**{{qq0099||tt66EE@@FFcc[[mm  PP??pp[[""KK  ##  kkBBDDN N IIPPVVkk11QQUUff**XXcchh00LL>>||QQkk''}}--TTVVjj$ $ ??  88KKUUgg   !!VV88XX\\eeppNN%%..00cc^^ww$$NNff a a ||  44k k v v @@  JJ++>>22YYll~~::EEcc||zz<> BB;;RRFF__wwaa))BB NNXX ZZ@@? ? S S 77++rrCCllqqxxHHSS~~UUffWW--EE88YY88**yyIIee   ttZZ%%ii6 6 33nn??<<@@UU""HH2 2    ) )   " " ZZ<<DDMMCCNNNN||PPll}}yycc@@BB==QQBB))iiBB KKdd))33..gg aa  CC##**LL    DD<< ~ ~ > >  z z dd22**AA55QQ//uu55yy~~QQYY::SS,,uu||NNjj$$EE>> 1 1 O O - - AAaaWWTT11YYBBzz q q dd11kk~~nn@@22mmC C ^ ^ / / 8 8 c c 5 5 G G 0 0 j j O O K K = = b b h h     ;;77iiFF--IIBBOO""UUqq!!IIXXzzZZ## **))%%}}ssss YYPPYY&&~~ff wwrr}}zzLL 22bb99  tt__ee$$ttbbww  nn__88##S S Y Y ( ( h h n n g g   M M ' ' ~~^^O O ! !   n n EEAANN$$YY22SS&&**QQ--;;++55oo33--bbvv --ffFF88EE>>??==FF44zzdd  S S 77tt00\\((__BBllZZ%%GGLL++  44##==hh==TTww!!>>&&1133 77SSee22>>MMDDZZEE77??99FF99qq99zz%%CCrrnnNNVVDD..-- @ @ Y Y { { ..mmjjvv))88RR[[11uun n ; ;   RR ZZttoo''ii}}DDYYpp--^^ffee||hhllyyCCMM66VVll~~* * $ $ PPwwww))# # n n //QQ&&KKFF==NN00 {{ddtt22DD66ooNNttEE>>KKttBBss DD((55mm{{}}V V   66##__MMSSUUYY&&bb;;&&EE__KK{{UU   H H x x ccaa""8 8   22    [[99XXuu00PP!!~~55  BB  __HHKKEE NN||VVVVPP..LLll,,33HH==llhhvv''''[[^^..KK``  ppvv>> 3 3 U U r r s s ++  g g   R R | | Z Z jj3344QQeeZZttee kkff##bb88ffppnn kkCCdd..%%??LL6 6 33}}llll, , i i II" " : : zz##xxzzUUxx??^^TTqqEEbbbbD D   x x   8 8 &&++DD11"" ||%%TTii%%22iiAAKKBB ww||55__JJJJ''bb||HH55kkmm;;4488 @ @ ) ) = = W W b b ? ? $$##00  llvvee55XXrr uuEELLBBii((QQllxx 5 5 a a h h & &   4 4 11FFMMkkrr 11YYVV??}}YYjjyy@@]]""}}FFllx x % % jjgg''++%%iiUUs s ` ` > > Z Z   ''vvjjyy@@##uuyyaa..JJ ffWW  rrii==KK ? ? - - 33ppAAccppbbhh((ZZMM``--RR^^))ff??$$\\ll@@;;kk,,ttHHBBOO+ + 4 4 7 7 / / A A 22pp   Q Q M M C C   ##ccJJVV""  ll 7 7 ??[[--BB  aaPPWW''ggCCNN__11 <>bbqq((TT99--UU--MMUUvvBBqqBB : : gg<<SS[[$$""SSooNNAAhh~~77eejjoo--!!ii^^..NNss  ssFFbbYY>>  ||<<  IIBB''TT!!eeLL66AAbb>>~~DDmmTT6677JJooDDrr>>DD,,YY$$]]**CCvvddUUAA__~~ff..::xx ccVV  {{  qqUUss""ppZZ--{{77KKtt''00QQ>>99__PP^^mm9988||NN/ / I I   AANNYY[[aaddBBAANN..PP,,^^rrddPP((KK66vv''))uummBBeexxLL ??[[~~qq==11ll^^GG$$<<mmOO&&rrooffww77[[ff<<**ss((\\SSmm&&//ff||RR__BB!!AAjjUU//pp--VV??44bb''//88gg  66bbOOhh00DD11SSAA99ggvvvvGG**DDQQnnbbQQ**ee55 GGeeJJUUWW//++##ee((tt\\VV}}QQ..iipprrLLPPqqvv>>!!II44rrppTTQQ}}##@@ss&&CC<<77::QQuuDDqqPP..)) NN88gg44xxMMOOJJ1122EEoo((....&&5566++ll,,tt::YYuunnOOLLNN&&##tt__++''88ffxxww~~((  YYbbCCTTEE&&ZZ0022MMddPPee^^ppnnZZ66 PPKK++{{CC####ll$$TT~~~~uuXXaa>>..{{%%nnllRR||ff]]\\]]eeRR}}ggddggWW--\\..44NN22ee&&EEWWJJ?? 00kk11!!xx55NNcc ff==yyhhjj<<nn22''bbOOss  00aaPP**zzOO22..ee??PP$$QQgg..JJXX22zz{{{{FF::ccHH>>33##llzz//EEFF..nnSS!!,,::nnFFCC<<UU55rrQQCC88hh5577EEiiss``ll00tt__ppII$$QQllzz  33((vvKK!!aa||ZZYYRRCC==YYKKhh ffMM||TTDDDDffQQJJ $$''''""88++bbVVggJJee''33ddssDDSS99..55@@oo22--ff~~llhhvvXXWWmmff77]] OOXXBBbbXX22ppSSRRxxZZee||!!~~OO1133HHHH##((  qq[[// JJ88UU!!mmMMKKff))DDHHYYttJJkk LLFFII~~BBjj((__zzWW^^11IIll##<>==oo,,~~88nn""%%FF}}  &&6699<<BBHHOOnn  RR}}{{OOWWaa$$YYbb@@llVV??4433\\^^ss!!UU%%XX>>kk>>__ bb--kk<<;;mm++99rr--ppSS==**00NN{{kk////##  zzVV<<aa((rrPP iiCC%%ww}}cc44VVGGqq..jj''\\  AAww  JJ]]00SSnnTT88[[bbOO>><<__nn((ssttmm::>>gg||TTuu}}ii--66 iirr<<44ff//CC++OO xx22WWww==zz&&33''\\,,ddaa@@eeBB$$  ??nn LL))``QQ}}ee++55<<--wwLL,,pp88  {{KK!!ooEE{{JJssWWNNVVccppuurrppyy..``KK((aa--__nnjjkk33dd__,,OOOO ss\\TTHH##{{::}}^^SS@@;;LLmmkkii}}EEXXLL9922..'' 44ffdd22$$UU::CCgg;;qq~~33jjyyppnn}}||II**!!//HHccttOO''  ++>>@@//iiEE!!zznnffccUU??""ll^^MM4488tt ##RR!!66RRss!!EE``iioo44TTiiffZZEE++  ]]--rrHHUUxxMM**''<<[[}}SS88ffww!!((MMNNPPNN77%%{{ppbbZZLL))ffPP33qq==oo--&&KKqq||llUUEE@@9944<>VVrr88WWyy##EEYY^^^^ccmmeeKK88%%bzflag-2.4.2+ds1/data/bounce.wav000066400000000000000000000367421200563112200163560ustar00rootroot00000000000000RIFF=WAVEfmt "VDdata=Q@lN{Vi+6jLd eKZsV ) >MZ=l!6v'  >J (# 3Ӎe /'z8q?>k8,c{̵Qrm;@ޔ- /%8))PaDŽ4ֵ;>+~@_JG;\-!C^? f(<G(k ;%8 @;/;%, ?#ȴI}ʋ<++;@e:}0((#c u ׷ 5.?G E:.%!!^ GH*İɽTz$') 4+$ڑkA؛ݠ_4ERJD#9]/( "C[ YP Z +2BATGD<3P*!,<>_#5lA7EB:1(7a@mDٮ -78+/ o iuh| ذ߿?'e8hCFB:/&w3% ;xӲd <W-9?@=87-x iiB`^OԖ u %g/869 ;94+/ &٥ˏʔ˶5=ܟl #(b-//*!8s7P5 ݓ a!M&P))& 2 j.NtPܭ"2!3,:3\6U63/I) r1xv9.|0ݾKNW!+1[4a42b/) C KP|.X&zh Z&.3D651)> H,V;Ok )V033m1+#UJJօҺӉוxW !&(+..,%elLPٱ."r{#"7 L i&e.Օ)i ޠS/Jf&/457<74I/& %Cșͩy$%,,11.)e Vq?5wдӷٱ:!'+--w+&'! 3 otzb;ןԪղTE-~ =$w)*' R 42E\  v$-%"b /EW }^ժ!+03L31,q$T=aٺ;s`xӿ؟ߝa*39:83*AٰΑγЋ~r r &.j22A0#,%( tе m6![(C-//k,%}3rӒ/վزOG $)*>*x'"!/ m ?طل܎m|wd 8ڐԭUӇص G#+01/*#ݽΐϰ׺މ %*+*'#rO l8%$#W(+!+(#qy T "#7 "&'&#dxI@܏M{O !|!K 4e ksjގ'>,"&)K)u'#iڒ׎>Nݱ m1 -%(**{("D>z_ERmrb"$$f";BLߵf# !""i l߻߷q  wH RKO H=U z1#N$X"3V p+ڋݧM#.i$&&%N"% }c%'\6: GRr#')(% < [A}c/{R8q!##Q [qP ^|IbG ~!j" $O`TFveY% <$'%=`5ݪV~!bF: f-C_t \:eCZ;$') )%+ J2O*ڃ#d "$N#0 1 ?k1m!&rj bFTE l ,~B 1^a"1R"v " ?!" $3'%f rcL-$]"')(%E >< .7JQz}޽u("7'))' #U Y{,|EneOQcA /n:{1)[/ fDh:3 `!$&"utwF}LcC `NHF%Ac A3F$P(+*)'!3 &g \m#$v#$ ):[m,9 sZA!A"-! &[q8]xYi Ms S 0K M')'S!9 2F=2 E"4%f% $n!{ >hزCޢdTY#'6)(c&"I &,޳o#އ/N$~Fc N20<ߺ+l0B Wh 2U 1)sJn}jq"ep/"v  EJ 7}`T { -m\A/l3x0"f$9%r$!0t $Tڃx}RuOnK l k) (B'6`aw@h@yxLJ +JK4Sg ! 5QpHL-Ty  ! !  ~:Yھ5kf,r "j%%$d ??s߰D>$X xfq y1 Y dE i$Q q\qTIXl  xlK:BJ '\ 9LVl߿6  "%'|(e(&z"yp>2P'܅cA޸NISQ!q"!PVQ S9RjP ![j! "r yj;b!Rb A?yis !7\=.5C "g y 2I W$_ FiDu0RCr84܏u .( "u#"I!]s mY߃߀h| mrN |.8njt$D5@M:  ^b ?~ MC _X JbOR|5 q ]J;TUڢrr6X$(e*)&"m0]/&MڙݚZsF s\d .H0a)k f'! ~%?gD?B5 n3:!0 =JTw f~ M;J*$< >48I` g*jyFV `!$6%$9!57p nWߎ߭MG\d 6 /{a I2b5>n4 + wj sj zQT~9 R 3 .z #)9 ? ߑܪhޅ1/ x &%2(`)(% *$4u#ٗ5#4 p!M!Ivg &t .;br  7{0[T! Kp\)~ 3 ^,:sX^QD "; ~IV{k?zb}l 'Iܣm; :t #u%8%#3!a& Bx ;8%b SaQB\ vJh "/2Lg 'sA.nBUe0    _ E:" { 6|<3^ V? #$#  uݏvۯ2\ ? hF:U ,^xQ #}v* %c? >YW 0x߫,*9V UpquP= S\ S! 9 !Q=ީI'/eJo]R&!&)r* )%A ZuG :j`f8۝ݕ!: ~|A XizBQ_3oYoM+4~] 2D[ Lu 7:X i;C ,  FlasAv%eQ dq B#$$" 8%&gs3K ] s 1uV fxKY.%o -e<l7v'hg'sd- dB< PG~|m , &# &'r b!b ~K,Cܵ֨ӝ8ڗߣ>k  d'%+ ,*'B# CJ.T&ET `_ 7 U7 ?ߔߴgla 8 }!\!o {Dfen=; -(25 T7j b X}pY>!G M,: "d R.=1Y=;X@; +Y9l ; iM6uc_ \slH0- ~@THFJ4V I$2? M]{A) uI EW>d"} "$$u#I e ,pC&PaYG$&2((r&U## *d;qB:4!!; D _vsSߧ nhF o^<5WS(J$u K$( h[v+t|Ym6 +) ; a 7 ;:P3~sD)8 \ { (C} 5O " ! l$>_KGLcqw)X?8V=> X>(M ==q "##"DHM%lr׭*׉=4Vu^"?&('%"m ݻ/laJ W!"! 7Z\$% m cpMU*~A;$ADV4L f)4qwn^>rfkf!G6>&gCM!_ZH[)'{ 7pf,36#YUU2{^gH t{/wK8f*d} X zn %~ME [%*;-Q- +N&;TI DS!kҶroPOd!&c*~,M,)G"Z +EP`1I[ %?. "f#!j  k'>)l| p 4<.)?, 7?=]( XK OVF W JO d wLQBa*6 *i5 W=+z8HZ}1 O O <9cXeE=j7W0  ' l# O^U(p !q"&] {@x 8C  TJf#),/.-+\%`r5^O{ЎFo%{gN98%*r--++%;VkUNGܣ># W_"$%x$Z!  e݂fH?!#e# ' lk,iN()FS{O"'$$" bx8 `=6[ 078!b FhW J'kdw ^<3 ,?4M!ZO }PeS /0c@&lS7q Y, |q_-Ur] #  nj JS* c:|T ki ',}/M/+I%3TpHJϟ_<5$R*,I+%`HnݨEZx Y|"Y$$# efqܠx Vv7v\'x lUW }Bd4H;}|V % D! ex, e ~pok3 9  ms'E ] 5 x USM,N j 9 // cjf DhQ8PM Gb+BkK /l=*=NA] *26)5|.D# f<̡ԓEs %+,&(zDrS  "(N+*Q$.+5)A#w2X4!S4 p2\]Oycb  v' 'JAf kO eZ l9 6?hk G x.+ hK6P + J:K;] u t qM Ylpd*7M3-h.kT)rgXpsma n 4p- >^g x+}A߄)ee .X8E;6!+)2Jj2΄~(+',av#݌}$c++ %U r8-)!!d L Z_. E #i W5` r}{N-~~| rOR$Tji] )n a 2 pst,>^WBeXIrxD3 \ o S .;w}}AsGdY,8Y4bHMZ2 z&B{V, ]1d Q6 "]9k- 6+"XE2,Yr U .IF(YAmm)YS&rl,vFuBOs-(L x<"$Cf + 9@!)81RXR{W5@ G-Tcx-.p{ n/NCum=X\ hy;I&Hj FVVB DCsij#:O/^l][|!_((Ke#p`Z`^>us-NVe!rhlz?/ e99= wx/N/9h\1 0a@@sv{g~v1@F{3+l=0vw;{ oMbk2WWPAD"I< AJ#a{i4(bqGqSW[=0(|=JtI "p @7r~TO<l!#'lRuSZ}p)&g7Ho,-5ByR(?p~_f)*IZW X  XQ( zvWO &e@0pFP4g@|VzH%bz(/Z NL `pZ1?4! A=$=uzZy3M[{L&3O"%iaXb>"yo[ rg@3|)Sq)>xrOG@=  *iA_}Nbk C:QYE7`vNe g},B\B_slnZ"%CbS{EBvMXF2^p7rKE]m IR5 lnZkb{u0xg ,7`> KOF=[2XO!nFg!>Yt"?5'cA3>(8 ;s;.B'ܺ~qsmmm 35'}^#=~s!nnżN4`Dig njh圤I;ӱ=XtAjC >l&uUY5AjMk~ZFN3t 2S4u} /@ I %Ibp"&9*\-8Aa*'`ـ;S28t1R-pQn7J%vy ݵ7L,I}:x{H,۹T䥃a]0e]PVӌ0P Qꔤ(VaBRR^|~8īPuI >>l<#/!u#¯Pny}Icd>9Զ9'3h%ZNfE7W{ ݱKRlwRI(Rs3*+zVwa1fd>.m%23g ֟xEwi)$S2- 0GJQaSSaG8D L I&}#k+Q܅$x9^}ǫ:l 4m%Dl1bDTv ˋ#u;Qe4XT|T`DtЪv^-9w:=gOZ2cZoKw݆cI] !bڥx$M,x eoNgVdt"#53] ?UYe79ECݕcٞw4]ؠ?%ѡm:7vv(200\,ؤ4}lDcQۢh# P~쇙w_ux Z ̃!t`I2oGǔRBdDȲ&|iۀI&sc7ՃSE1L#Ozi@9tTfJhxˁQ 4`߻dޟjCN$&rVG]Tt;^05lnO}pE] Bm)@5 ΋eÁ7ڮ=)"PP]ȸ\^:6þnf[PFl&y^.!4=ۙOS<v(< ([5i^}1,AAq 'sZeaDKn h ,TT8q2LDGD4/Vwɰy"ەSDL;k:MƋ/ k+2Z#Ǔd&CЃ;{ހ-$,b2m[1NKð (l¢]K8JZ);K)o4y$O_ܻ^FSKy<Ъ9 ?4|NFz OW1P^EnOM[meih }GaKT =-MWy|hzH7˷M̷`^(C@ >iԎv鶻NkP# $pgqra EMhGE^Rv3tӠu)I Tl״1UTRu~?=,soAN]p©I~"ۭ0FIA\wsĈTYtv8!"^mV~7;:}k4 RJ[摤!!\^?E0<-$E:/tumOZ+*N qyĂ(I NRQΡmz;s5$-mgC?:Iu e '?01QcPJ2}>>ܛ{9NP@P)q1t:ecݳ P481.E!$tl2[30=-#dt9sF],H%NbdnAh T*H.avvA5ץ%E[}}##C񱨵*aL(j秦aur6 P&eԌYOhgh QtMHŬ^T i5R1i>= p$ DQtf;2- Ãg+$zm[:TRp0e]ۣpFժd'[<Fy\ƾl %lq:gYa*Fדk1Pvs>`$a'H݈R:B a쾍JB΋R#D9was2:+IEf)ZT٭E^.4 mأ98Bſ n@ ٷ KJ3EHX~ۇ?&`ܴ UgչU~96&ZU5rV),:8ϰev3UNV*LUdFTe W7n.u oٚ@4/Ē(D a<%U;랉Y`]w4ȋ,l[4LSd\24t+.apy%^ll( =kZ7΄Î,+oMR4 @&& KaVu~ ұ<[\؛w"NQ2P\f BAFvAE^uygEoFŰLf_>)\07!${|U4XX`߼)F9^$y6Os@ɩBaSq@v.dm?㽥em B%~nl CA$ 6Zuq)DuX|toh90 qtab0|d9-*QiI7ؖs#XE2\Әs[&w$D_%/ЖWҴN1tT|Vi) pC +g&bx%-tZݛ*~-qX')42jź( HQL!KFk Lw;i+ CTHEY-ROJTcB/WkƚX2:-Z#~H((Ms?T0L}Q|Mnf9* `y-`rQR)8ql受۝qO"<'b9 ql @q&atT.BEk5\]7ѴԚ*@ _rs hZa I CX X5<>kn[(lZd~ŧ(|:([ @(!ejat-ƥdݫ!I&%=p)~<]o6! )3  @5%DaAX ͺYiM5S""e++,tgfy?Ynzydw-}rm P&Чd%U_ߤo 8M;Ja,b̞2_BhMKz]ɲ$BCzMq6+*S3\w5% 4OXԁT?8CHn[zczrVPUè`#e߂@Z7I6 Vkң=/VFށ:#kl4r1R@he`qA C5(+0`iN($#9 y~݄2 ]ODI| &wfv\{1WeA}/f Q)PJ jl[1L|o516&b)(PZ:& izSP7 0B:6+^e'Q. ̐4\M$& uO jǞގ͌e%8 &\*n+xm7[/:")]" 'SƏgD~åe=%r8Vuzv&eҵwrtU eaqE ٤glRsmI1Oc%BeHJ^Ɋ(Tbdk@V^[6+:3 +Xݪ ^sC ŸN0EBT!X\y =ۦQVȵahn Z*S7wtOTf0dbO}6 :Ɛ9M4 sÖ dB{i84. >xF:2H FchR xO11;VpmL#P:=۾Rj޸oaI`Yf aUeE@AyxB!YG% ͦݩg? y $1HibR>+hx+dxhUjIڝFDbJۨ Tv^E9D8^x)Ytct|OQTRw8i{^\x 4M&4 .H |pwȸs{䊸}3גT?>844METjԭ.+`Bsi.-,,KjPoL^IMlZ'[ r(8&!zfz?9i━uրB  U?qU s~k3a@OSR4u.X@g.02 z"e^x 0_֑ *KS.8: ?X4^1sk^G#q:li14&|bAA,?03!g!O'h%# s !`7o5q;KcqdU%I̊Me; {eٲ$_6rFj jEj bxp@Ssҍ qd rwpTy~jzRP*KBD?榹X<'aub ۢ(~!J@a ҵP\f; QvӍiYDA;^]Kb"FV m ~L7lnh&"b F0C$8̰h(.Tc?b 3քB`jHa LJD8/l]ۑ4lc pm \kuv1WH6 Xy5T\s]^Iq9MW(biQ)L|~yoKXL̲K\gDQ~p4^V 65~|ӷe>$uIYr踺 5U]ےzD,.&O\eEA x'f a AA+]Wo%p:,!@$IԏfZ>W\FƼ)8lk}ºDpE۬(B*`_g49H ?b|MDzʲ{pk$m^oVmZ] 'sO8s |ʟi£0(88BK ],o&-! 箔c4pd;:8r (/J,=/ PO@!JnrQlCh@yԕQ8=A'X[q4/6U u`oE_t \m vr9GQsɋ? -M\vS-M3@J&BhWvux'bGMյ^=<; @%'Ca4 `ie:EXZ#ZDE^7IsgbQceY_cT0]m -5}D2Cl!dPۼ'jX`"1 `6?2I}hoiDʤv8 @j2Sp='ˊvԒF~|-8 Wi p@H KHڮZneS5ks_=oC.1r {Jp,-UmJtZr^iFkfIfT$lSY|^1w%s/G05iIE7>Wk"JmKj渻>?| ~z|l*FUQضJFwU#)k-BU+ |}Z.\7 2Q4Hr[IB!}@Mg QLĜec t??fOwQ:1-ZNG+c~\_^kہ:dCji0 5}^FXaX'<&PBHup=$阂[T? jkK=d55)c#2]N69BJ$y+khWuA ˲Rjr)-Vc?| DcbbbG1i ŖR0{Ι$}M+T%ฦCc*ʋjWTxkHb-ې;ʰ#pl=ϏMUXe .@.p\{VM-e쁓јZ4b`(IpdYMixH(?w.Nt{Tߚ:0.>}$Fm`ˢ%h~cr,lϦiE_9׳:ɡBL Wָi!Vyc<̢Rk jjfE;n].M|!) 54', &Ca`eԂPe&ʾlFr BAvI{yӞ7Mo@ps^$IJq'HfUVcvO1Ts9XD$r12#2Y@ͽrj)*!pQ_ bN "%H:y^)nϿ+m&lPŌSٌgI}QsfHVp |2뵒:xZo;cJNae1Hå9&jNϩfi: ncZ{_fZ0a:㣄tpԦeTA*XE& @4DQe -Ę`o>ҍeP79|G9v 9+2!h*f9b#p~ zTPJa2S5p!lK.oҺԩx._Ԣh$^?VGq̒Mm`4ort嶪BQ}[)kyxpe5#< BMve|f!bz5@Xԉj)įoíGGYZ9SBʂ~.͆8:0N0E[׭&i|70A40 02MιMC*e7_x2 ƞe4F!Z^{=WaAW~բ:epzIߩLr>XIT2pdeZ1ee_ LM*~eN5ύd;8uX&zָ(s6PjϦ38SnvoxLuaѱgH3G(:Ou ?,W7qNITqF%NȆagTq/`.ƃ'LeqS#|ˍ(9nw>/Zz`>TZZ 4@QOz6! *H<J63;;dz`X2'0b;m$DZ2]sҾ- %P'YS!6 I GfB<Nv˂nN70Wh r4C_!zmm嘊:kϳ-%E P{PVt @5='d~/v;Î݅aU `}juS8aY`o-ᾘ̥#r̍ ʳPfr?# 뚒dCd%˙:hĕ9GX*@8EGTH|_5j 4 Q|6$4!&)zP+U{z/RA<6IڤMi4ivv=!EZe-wjM珽h j)B戣0dyN@hFYF|G nmE! |dG OWi.z4dzE# YRN$GŴXU<_H%Xi6LRLzu'" ;q. x8PPב1me0ѱݡy{' zT)}uc{[QW10_>Γps WK:óa[ Y3j_6vv̍Rahh4E3_ε%a0 {t Շ(c%C FQYfa;[ 8>?&5U3H5pDw]>)bf=*6/& A"Lڀ%~p28zOie.d#<B'gۙ ڢ^!\1M ]fxL:(">tyDj~vnj^NÈ|~e#gxnj|yI2LA:֪Qk=;;"[YcC:P\f; C,A(1٨11<(&b *N[7pw-XF{m"`E'b³w3kmõi"L༳^X̫fw`$¨#&&cc<2r;#jG:Zd$4 ,~I&H_Kn/~,9HtOi* RH]f4>^*|8ulv5Bcd-b"cow;XA|wM{U*$‹E)s9rf%966 A(R里o"[ "H aL$Q'<]hDQ_ڢH( ڲMh (x?z0 1,Vm|8{̠i"J4eNGOYY{dCe8dV\yxza, ]Or`:b ~f^ !qR~ϔD;ԋZ\cN/P[XQvlntY#$`ދ_mЋPGkv(% ~NWz8ɣB6:.2` %hp$]E,ժXG˹ݐf&ɨnn;ݐ%%m`m?0;Z͈0Lhv0xgGꢩo.Pl&? CA-teJL\1@ZRѵ& Pk4epA/hX}|eJAp *(Me!Kg٨_&%\0 ,*e3?cӇ1&$We7 vv޳g==N)ψv,SgLV\趨]G5p n.).\ݒOIҷug875QhvZ&:<%td wq ,O(R֦PlLlzkHkk\eqD8݄Oo@ L-aw4pYچɕ`s%izvelsJ >-Qahp,뺶ʢx`wM`:0I1E EoSix?$LW:dt ksd(KΊ5Gv1zxc02jҸUA`y?ٙ"Tm-Cb{?.l0mGZAqaL,y+X䓱5T_?{#Ncª"(_ͭ)A(p8xRGKsGiir4/ 엵gZB:ȱ` E '1v7MRVdj՚ApY 7-+ũFz2)-[0T0虔4 X؅pP:c8dl1pYܨO훷=̣8 ڡ/PBU6"76It k gT޽ /rk {TAZsb09XpdrH$Wϭm)pәm$IJVݶAZ$';^^߽(: p/gۓ0 ҽu/ЕCP4B'MA&` vݰpy`\5Mg`G2Y25~ݙ$.`' mb"\,9XD}_ (!XEFT78K[lzᷴCmubt!6+UOi;'9cknpR'ͺsRrs1'jM-8N}'b, ?cLld*n8m,0M!Da- sU3.9_u4n"ywZ#b`c!-_R1M\w(\eAKڤ鏾KŴ%ZT˝L6gNY`͈ \檅lM,ݹRϝmC}yUajOEi _ޠ*s{vcSVLp:!Ai@N싉Iӎm8*Ņ-&'T U g&i򰼭;4JlH:jB)LČD`Iz*v40(ezYһ^p4iD-~"1"?;?2MO/sHD\L̿~U5q:["um|չW\S_OǐY]Wg^~f/g aF/xQP@Dtahk }s7MS)-"Å?߿9h8iZLkSG-tT>bq<1;P~ CipHk5Qe 721[kDRMEvyR$هUkh\`A\\P}uNIz?E⺁&$p {dz)qߞBhƪ Bm2KoI@%2SVkfzn<l3x8m3)EZ4jn/&l!-;YyƯKBRFO۾ae98 3oDy@2F:dLN\v0J LoЖ2V 5qwe4.$JvZ.mɴ;gP4w$c'Lٕg;ğS7 {#o,EIt>隤4Y uPŞ.!}]?ěȴZ, hVBmBڮ7Su`XY<ҮP~߅akM Yi%؛/ҦƦ -*r[A.0sNf 74F$`BI6}?D!%az(\i'ӈs98SGH湮0JH@"?#oGz8UxĠ3{$KΕj́^&PRѨfO9ڏuO4Z*9-ߡ=¾,BR=gek}@1Kg/㮝3xh3ծY.֣hqŞFtFoˏU$uwD\h0R b@e[,-tt_-AH(/әO.'}ˀBIBא3ߦMં?xVX%,BgӶ|򓾾+KHJ&*v@]:EVfft,ix6^,Q?5,3€M7Ph=>@sMr}~sc_Te%\( 0jo.7$kꓩ;јI0q+qhBq6,*ϼztDZ] >.jYV"2EeP&ybS4!@ؖ!54I]gYD61$;wTu}9^Z9 i8 #ۂtcqfQ+Sk:0JL˖8V:/gCL kLހBτ@]/ғ0Eᖡ-116r°!DCp{^qaRoIEuM圉BӫPw&b¨R4 rԵ';2̿ S%yrn+Q y'ÁǶ170δe)b68*>7:9e!֠ `rS\.Ffu;Wn$$iRg G!˂$L$\9YDN Y2Qxg2enޙ5PCn[ӇGzVVP711L C߫FQVC=%+i e+ Z147GLѤ-,e_ ɜsfʂ纟niIPZoNnLvicGږP "* # 7_ `^r:cA˚#pQswAG \ yP8uA;[]f0SE>yMTc I>8]^UI) G&KU8C 0LK5I'1M ϏOodiv,P+xB$o7DI4E{fhح_h_v WPl. BQVrјhw]uM쮻RM S_0ɜo3ppYS* o H>nGb\;F18~I.0 $4kĜc_w{2C\8aݎDz-x8cF* QiIk[ ‰QNT-#\Db<0Q )ؒC)"zZ,K/6΀ Ie*4G݃4h_? '<1‹,= ܐbMnU(Js"\w)GƲ-QAu(Ϗ|>P_ Υ9A)Zv>ST;(1! @hwu8#8KX7dBoN"@`J fBVJZJ6@Ra2YEUjmZ60AǪjIþ9Rxke b>KOԮ}: bt2X+. ܽB\*XG윗E-R MۚFcU.㌿NcOF}FCzX!}ѥc!v4>^#ZN!ĸmkǓLJ]#q134#{ajMN)_9-`l~0nc A>A/hس7uHFu]BlyOR03k2lYdd4kn˄`hL]MX9mF%+V;Lz\Č^\VItxv) #nt`&\ iԖ`뛅K o^?Vjv^p9r"ʗa3rUۻmv |b qUOf/VO)o+B*rrjw.-~i vRRQ|:=_/p\(@$!ψwu>Jm2%BsiJ°%-5ZO4-ɚ)ژLG$PP g{9 wx:7V] Ɯds8:CtL ÄjHC,sm%YkVKy9ξ}(̿^vOt %w'jG- |ZCN[2X_-AIEqfk%ຐ'ZuL;e?)v#Ah-a\]dس~Ө7חA߇Mfa*je2PlǬk($Y$ /IU]9?jy/sO+6VT.) CPH( bN&}Ct+bQPp.; CA--\h/AJ B% DD +w!eL&9Z#sӁTX^\`> Y4-֮[Q A1揠U9bX P, D#4@gЧ nvkJiz55t^A#OJ& K2"B Ԑ !>PLgv)e ͛񸿘M#9#1y;g3=w}Q oi۰_fdɲ}~z̄LFa-/H+6 ۝*jͶJv3tڭJ}nkղxCֵ$p4L(fb޿]n0 Y ߯g^D@Zr8]fF~}ZI-ȢPU=@nUU6?mQ(/U@$Z3u UQۥ/o"B@"PڅtWQ i @&`8\5sS=+eKf DQ.M~kӢO1I7'plEr(Ȭ0}]KSWY tj \=U4D|̵5e!( <':\-XB9$Ab)3 ?;Cu*s,6M{ȋDeE]A9T7MRP9C6L{+ !a6ydxkU2)ˁHT7M0 )#FRVzz3J rL3=,aq2kU1,@[׻\ NcUEX֔fœ/>!H3D)yM!z{j7,ęTi @ѹ$ qvk_Tl(&Gz0 `Bl[O0y 5Eվ3d湌d:,Wu%mL4UNɽxL?sPiUNz\"$RIC?bh<㰝3$fFGI0ꛮk1XӦ R-ugD3@Þ|8]eX`?︒a1!(d9u_I~{ k[6*""N83 v?k2~^NWQٌBw\˫nHjn+ uFOQxU,sx"dPp& Qe,Ř&Bj" ~{n? s@gxB6ҋlJcQ@/Fx85lbմI:, {KN.ߓ.(!J -om]{0&tB5m%Wm9LH%CD֋WeK߫cX3.nM/V uM'\ S*jO_G~:LcQu"ytM??J$l@ćjTL(#zh` &:-(Iϕly(%$gzsQINCajh72^@LjCQ C=_U,3:˛ Ѕ2m!90&_D۶06ډ,$!%MZ p-̈ LtDNV^VeE@eӖkQ9 Z]0D?,>T- r `GIBPju59/{>mj$݋}}y[[5N W vkt38KOe9A"τ hqtiъ$(՛mͽ9s93)2@B[O4EKJ^pWNewvfB_9/_MUk3ԐaKVFGڄT9L4vfI ` JH'oẺ䚭L}Ӱ"w]STC|[4ˍ֊^USGk/uЁhkEMT9LGI @ѹ.'Q8)Pmk;ci7jE@HvyeZ Ŷb}fۼXQc("6Bg٬tz`ׄ&LF2,ެ{.1u+aYq* Unxy9 e}nn>Y.j9[n? ֆ8]:]{w{ 0e-ۺ ݤ>Wp0I11,\mlR4Dv0 }[JO{D-RJ?1[ Y .^'<8J1Ƙ_ $9a'!P6&WHeI <`o Z_a Ms,bj®-DEtw aXKPB`ثЙ"_&%16d13)$+n%Pa(gM0NTjZ 8Уvmd٢(ӝU@4\Oc=y"e\L XDoÉZ:CvgƂ;ļr0FQVU IvODǼ5٠ndiiܘXQy~GPDtkD'Ԛ_I4 'QĄP2G 1ɽ=?dSݰvrԘI4ćALۥKd2gds j8Awiw3=ͻp1$qrpQ%B]Ɔrԓz,&Q:~Ox-˽$M' N7*7֢+_cj} Ҧ-J@pYWoج@wq;d,2P'Egד0 }k16"x5QQ#E ce۰v?4y7x7jbh^[o*HS$t/Dfx .sZǴE>IaPac\!!cSG_0nMD$/<[nz{!S!lϮ}A]ߎ n*PC6] ׅßDW"]!x}zNH&-KA%-ED("L1Ëd&ZcםXNg1S(IANl˟eѳMhLˆTDz1{$}_aȝl@Y`/E Eсr">h}36jR(/ygGPP$D c *sv,a^B-(T5 1wjP,zN ņEsȋ>Ɉbvme o7Pxt{*/.]mZn&x],=wr[5ia[I{,G^"-Gg6hgs;0U˘6ʄcn&us_:,U',Jo$e"hb阕yVT!o˹" J<5u- ,拇ۻ(:hI9HZzpݲmP QԋG'7oFc`,lhK[I&|df>45%%ϓI{Cj qT5< t-2($b";N\7-.Dڬj7s0FjEC%h=y%^8À66ov 8IqP 5C^+A?nQ,C1qE|=@(4B5MQk\<=ûV쐜^VI>Z2)K0\/plk6\Z ٬}<ʍXSEQҢH7xLK3HR缽bLCUhIk]MiclҋƵ^6E{S 1ec8V;5I??>>B }}~ᔤ P;%WF: l7b&~oxR,/Ə. nw~OPX Ê?en3M|3p*Y&{kmF7 5P\֙|fwC4FbIt_! 3*\$ wM s=. ŀ^?vTh8~UŠ9zn/B$CƈGN۩kTo tS!+ M$RtC/E0t5iIhBi5*(^in>fpΫҊyGs6Hm묉P4zQTm)Rrj1 Sc41Ȁ4\*H]jǻC+d\s`BHEy )Աk-c`l `+bZM0.y˧[D%Bjtm[ʎjA 44%%\g#_ϋ"w}_ QG\sɨH[>?T86,z5AbeMgc$ &?debhgjPػBPt& @@@'@Q R9/KU*A,YHbOckGO/ ℌUͶL}c@Fx;2îif߬sF`WKt;se& t /mx vmPSGiLL< (JKhartAJcZs .9/? u35`o\I+7tn; A-Hcw#xiDhO@[h|^roiAr=(XqV ,⨞Cp޳tZo.mQCIaȜ6?nZzUEOhA($HE|hFZ$}2!g ?sV"/Nsum:mzrVb9Lc{jbVu%dcCC=$iɪev=׷;Ɋ ËA #x+DUpFEaVrw`W`f1 r9lZ cMjȁau)=O%шxE~@[0Z*|CBj@ͿMN0c;vNCJBQ+*X!8,+H *ڪ4M׎_&'5=/ fs( b4ڌnй4Oz|X UXʜ3yĽaS0 }?iQIce#RX%3 QCZ{[|y;>XFBӷNȕ;*u74Dzg٘%Dh!Y4N"Yn:ĀM|(@2۾ЍTGgثkYU^_L+:4>P?vR=a mpX_e'a 3Pj@ 1\2+W1r/N e8ٜx{8dlː҇7K˻I SMCΤ_-D?zU@4N"찖Nb[S7;b2XRs:GR-m~fN>;`u Ax"S0ƓsuMhK0H%"zS#\f@I"VsC?N5p%.Y1GT8E݃T{ש'Þj |@2qN%$YRE^35jU>8uͿN@(VJBK* S<K/=xhLgl–R\^df? bI2.虳,grb!lcMFTR>GO$/}ǷͲŽ.(eSiFgPP%rN>5ujͺ㖮 8)}T`$]tZIY,u~FFcӄuLwWaT$ZlNUȹ q*Ȣ9髊OPw2"!H?IJє$H_30;F%63IB.P~Tt.H?+5[yD"\sI-RJ)(BH$9GQ5<Pnx^sۛk!ӑ"r[TSD?F;Gn4>RuC"z,GmX6.催3 ܅a"Ipf ia"oVNRO!/өh|s{%MDUKegZ8DCSK%p~,Na5t0iY.g:EĀrY;`tRFMje(DS&` C 0ߴ~gdİ'BG'Q׻l\ .+(iҶ0ͲʫkLo˜x:/}&ʩPl= Ba "m[G軷6&YrHwywח `輴 `9KG0#[g$agG6҂Qe^)LA N,? ~t6NSۑUhu0a>q6Um?mWRV/L $6.I ]aҴkp iۃ+$sσ𼸮$"ˣNg,,KSz-8M JRQoNaӘ~jbB"0|JԿhnǛm749:90l@ <Ꞙ 7r0"  *Rg[w3z.(Cn{dvvߛ(xdj+萜=F h\vmafW2YFihyDvvSrmQ&Ⱥ  H&>?v"PeI p %~1g1!Sbd*E8M:Cm NsNU񆏧>HؼA*dHfL?ĺ播wZY% {ˀ?9]5ƞsJ4o6!ǣDtoy_(: Jۖ -|zoL7!@LТz>d;1A{.qYޔn&,?D5;O.M.jy}=v0𪶴OG+4b5p':U`n,L3K7||w p 2x(fP`i"/_jpN, iAueBIS?H_A`%'oVlhK m6;]ߎ!6Mm2໨( xNa-cp$4]+sA|\$A Ƚ16␙.!^*ZKL:XF @$ Qu)ݶXC11h+zACCZJvZZnr2ٌp?D߉B,Zynd] &ytM56zVe"$Il#a]]Z@:r-K9h\LWRt u+YyDjdƔyiM &ac#[BE8RuخDtЍ 7O#Ap*UArOgiq2e^44)gXBeG(˅D yvZ_̗+xt(ZD, ؏?_!cal$-H gzng 4Yq M/E粜 A.!`HN]#被@ ؓ}63er^^ZJt4g8r' X+mצny^U~ U*jU UƲ0Tᠰu}!k E&2 Ve+†<)>em[NM! ,"nv7 KPb aIrg씧"^km$Еg -O]KދZYFB.}AK7Cۦ>[Dddw.- /Ѫ[ۼ5Fw0J~u~|0!M(cE_vA X`B dz OcqQml㛖miys*?-W7uacjHħ.GƋ=W㸡|[֏a1°t|Kv"|8 (U_ =OYVs~PGL(`Ⱥ"s4$񼤡@-b<"o$B+v RϷݡw F LW 1L)"|E~8a˚Lg!I< tm%#/*8MJn`X&b14EZզu%=5ISU k9Cp`rf;HT, Bi(:a( S +ƙDc2ŇՍd1wacm x;_s??3˦VKU*yƣu|z~>m[5%@/'yV1Ckqk+WVP$mn40Q˂݀!*Q۱b&PBv2$V1 k HEb>a6\ |z!E~}ٯa2y;fjhave%Sx-t(0kD^ HSE@Whz40dveQKփgx!XǢi:Z "8AoZ0pX%pp A]\.K#4}>y՘VۤVqeY`c`v2gNIgKrMB,d+Dsi=űhQ[sb &jۈIa-:8c]U^ ^~ PṈ\4w8Lݻ1`0S : `w 3Iw"i۰ѱ3BT#` +f0lqymyAr{kE=N͆YI(+xs  +gY~U'a\V, d&iEah `i`܍\PV".ta$|9[qze|'Mf/,+[wI]UB,{Ӷe:cT\%\7y:Qranv;]xJGjM3Ba$ɇX;khՁ 4s-riv(%sYj(! !IT,˲ʍ.h!QЄ0<V-??=n֡A~ Pp6Y"]u=0ve6K}J6 "V1 W㑣%0RY~n?~hfI:Sv]ZZ/0oWIZ%dngjG}xf0g}ۺYu X@2 HE׳$|O0U L5lA` h`CMƆ)t*m[ZmZxHJJŐQ>2I 憊?(a(!EQ Z:NzЇ: FJ0p'd&c~#ٚZw<UنUU`G%!`~}rʩQ(Y(6R{="G9#cekZL߶/\ArۓKw3ϯUº4NX#',OI|>:!E?8C_ئ1i(^&R9-y=/g[vgg:1Mqd%ְ Qmi_+ۉ[COs%B {GHJUB=jB,hqЀ>SE9A @ѹ&Q wV&i>h  pP/L2{0g6U#Z-ouh.<{Ȱ-"M[Oh''BkSvxb*2KY!t aI0MVQ񃫛n=㣥-A3[nlCw,}2vl_3 p1%))E}P6Έ !K8-hH:s k)883 +s̪Nk٢]iź(ږMQ8^ d], 5 J0pP< <_(: s@iܒml 5"q}MZ0;|ɕY?D%E lj-B Ikzpӕ"#X3u4eL@XH!*r~l!BQHoZE \ \sW;5ϖWKsΛ VM~ fMꜭ}TMwU]/~r瓁e;w$Kӡʄ%ĜD/:! 4h@OI5I;]^DW A|$;!) P qwm°,&a2 J'XR7C&P)2Z.ɄjѪ)BKO@;}MH[Bh@F1]aabj@3psws+E[Q!o 1 d$xk ^EO'3$UZC 54Q$71Fu8J=n߃/H+xwh-)~i:h=|\<?IGcA5/phq++ >[*а $K| ZNt>?cpQy&ޭc%Uķ RTiKޅJy2!X(DP]M>_! wإ r# -܃!|wY=] OA Y/E -e*C0|j1^ؚzSQ8\f2}G6IB̐LG; p4}NĚLĩVm  !|i&Cu(jS/E ѣ\J,mڤM4]5M&"9AbW?߿أ,)*AZ=X#LY]LE ?ŧ

eyRԬ! $>}Ǹ]/E Eұ؄EML\Օ 4m-R+?{9|7;܍֟ch+)|Sмo#r"֚QPخ:@9b"QPe!_Jcb'a$ <lLݜajRUm [ϻjjSq_m'a (mmˡh D FBL&/E@7#?"Ҕ&/3E آh:,2{{aU< mWn! B\k=;Iw^I=BwNwQU°B29/ȶAVs=]toJ$e#rTUb[_Gp/.EU|H-;gLJۻɰ 9DB%07tnu(kpI2j2 |2~n(eU,F8:&ɵ~>_,$p+*yxSQMLJ4ӐV{uNDڬ`gWC%g۵5ԓ9m:W(:a &qI T `ˡ e"Z&Mةcnj/}Y=Q[s}g˜o[+]>QY>{eAl`y) 롗J @;*:oR/ZBҍ8N:J`D(_AͼjFO}Ѥ)nI1#w?CU MP+YO$qNh/z7^Qh|xb "$$6"ң Gkj:X!J]F*G'T@ȪU63nl 1IENDB`bzflag-2.4.2+ds1/data/bubble.png000066400000000000000000000145751200563112200163250ustar00rootroot00000000000000PNG  IHDR@@iq pHYs  gAMAaLA cHRM11gkA;RIDATxb?HBk vW6'N0<BJFFV~ Vvv_^|BTT2_Z i'O  maedffa?;; $ f&&?0|/+7_}sCwPۭDr} Qb… ̿~R9y괒$'7;7//(vCF322L`/_2|xo?_SSj@߿F;??7ӧ̇R@V^QP@HAXX;ƒHY @J%/_`_=$++ ̙3eE%lE$dxxy4<8R"@4x3'quq9oii\?Y~z`vdSRQe`/ءLLeFRM 9< L"96mڤ[kc3 ^q x<~p̩FoD0^zt!'QqUE~:X=gx&8=bT~K/^'apuqfYV]ABFA h·Ξ:` @ Bs.'Vm]>|pUp@*(1k2([C2 3ǏN?oy99~~>pٻA[Ga0%XY2(**bu ￾)##s<@L$>lgX̳2z6^  QXZ2"aPvׯ^1\tc l ^  `σ#gO]`cgǰoP؀\ΚOV6OѼs >?8}˷4lU^2\tׇ[ninpqpqHV]L@:y8ϟxE GGpp0×n M7 Dl@^^AYAT ʒ< V|GOtcOb‘\iod@{`ڥ >ル%MA3O Pg ,Ο?7oٙG7oa߼yp˗/bf ,DAY FTLAQU]C eG:hq! Cϝ>.ѪGp]ΎTA=a"#9\\%`_Ja}h>1qqe[1 e;w1>wӷ < l\< : =M(**)3_P* ,I_'b06ЇJ#0:8Z~kAfS(JyO>g`#m;q0/@? E@ ϟ9i  e*c{"d҄{dȎ;x.(gDmb K\\1kn:LaϜfbpc a`8r (?ke2\8Z0CQqI={j  x\vMWHDTG\YXLU Hu>r{FóT2\x 73pq38832 XP9#+#py+`HIUV7]#a,(8={xm9P K1(* x޾c_Xg9†0rVy"';õ7 urPa7P@ !a/^8}!%+' d7MAǏ 'Oapprv =q`-0({(+MN l>uAYU YêVMMЁ}+#8r=&S@bbm%Pz1 R}Y-`_+ȅ&r'q\t s p _/HrP?+(Ł Ii7oSψ  A =}6pdP -<&F$#3\  m )+)19|X[03h0jA¹3F8;ppqP[XddDDD#T >(kl>fD*pypddl(bZZpm7 gcxx[?A؝ekݠl*$A) : D20= T :;F..A'OcABJ֭[Y `&`~`G< 6@{N 4Y}&"8߾`kNJ y {@@Plx`gU=(?'{n& a4?/(K0+Bp T/2 ]=/D]IŬǙ <)`@& `KW*`?9a7mfs25d,dcPA Mh5n899}.86H7+Q Q&Ha^^ ݻw&k,`9``hq IPl0,! -/LOp샒V~o9 }F&B%&y@ 膣Gh Aq#lk%PZtae@:Th`1NpT!)ESUHsR /]$JHIJTsb/1S.,ԕ9/^ÀqH-O 2hrh? 鍒pC X!0,={Πm`e?J PR8 mlm1: G}bcjR?)OKrh{  86j< }߄&.1f5vP 5u @6+ "H(޽{X`&mj pF':0 x & q7R@jIQ+gd!d9pyN )?)<iЫ߿iPoca6p3`]?#ۍ/%"8ԁgϞ<|#VkP3"9 [ 3` 012 HɟS^PO54@bPQUb+"qXY30b*$c?(@wm @DHׯX-فŐGGZP`0Cxټؓ?& lb8\Z0< *I +ˆ 5ėⰙ߽ٓWV?O>v4[ٖ;o3vEY (l dȀӸ0z5c-P܊A~{5+_~^DM (=sу{ OE1zcHQ==p$q dIxj?}z&@bY[KO -HαGX% Аı!&x@rD0h|"L49@@n çBϟAfpw -EP@t)I -xa)PV}= $/C2rJlblt`x#r2֍޽},My\þ{@ ,ZWG+=-cUAi|)/^#}o9X޿w\ȁbcu  q1*bb8~X yYM׃@g 816x j9Ο;ǰbp@<~xx ͷ;H&?}]{'N`T/_b-  #`Doy+0xau n^ e俭ݿuŋU?~blf2H~Cx>}-eca ,أ0 zՕ4T av1Cu=zmr 4y13ŕAQYo#ֳF pܽg +*h}0WdVlر <`=}] l$n5 F&+Q$LF<(D!S޾ iy%cc23&##Ѐ1RN<)!aa8Ј̹g8k= p A+F9Z^H iaǛPHI4Gf;mYL-@mB{*tJQ`2۾s j,ـʒAVF<~5X2|AGOA\7ir\H1O: 3S`+ Í9 ')~zZ ~<7o`x.\z` Z8edl @ W gVP z/MC28{0;...@}|vQ:$pmc +A pZ5z}md/5h6 }HPTGn3:vç/lp9Xo[Gu׮^8w񒇒 h t>}S`yy&& ,NeVWcu.+'7x]ӧ p&#lllD v7lVR,Ehs c hB 6/,,6) @$or 3c m9EeVYY`? Gi2[w,n2ܼza--7@d|3g,D%$TX@ õHI,7Gľׁu)v;GO8!sy=eUIifК=ؖ`csW;j={gqJSS'% mݲe̻%'Ф&lA'4W_|W)궉 U7S#oذ{g6߼}&UU5` ?AQǘ?o_߾y;;=622ZVwIENDB`bzflag-2.4.2+ds1/data/burrow.wav000066400000000000000000007055341200563112200164250ustar00rootroot00000000000000RIFFTWAVEfmt "VXdata0 R/R{'t/>$RpOVE[XN<4Q1.) '`+M+* (b%, M,}Eϗ<ʪUmΒ&jզ$"-2i5-5` 1,)g!?gCs95lWG[E"Ir$oD6v3Mȿ;`0 ϒһ[}۾.V(t29X=5>G!^<'L8 ,i3-)/M-,++(*&' $"  h z\&OR( D ( 8Z`H*#x3L`0lV , cUd\E   <]Oa1 ILQ4IT[9M(! ޅ&*,~-޷-x+A& Y(#. Z|dnLCZ o+X&#;Va N[hVTB]gR!Z=\{ 2H9"=( -%245 Q5e /4 w3 ;3 K2" (/Hb)J!vQ!r sS :J*B| {   D  F m t]og  AUW )48FBorwP۽ڣ٠ڼ37Tr|PUnvϥ":')˂(d#\X-{%#trQE%oWBK mR !5 H   G x   N-N R{ h RHBA A@KkSoS+%Wtvxm.K4ELOS0.\/Y1 V_.Ey.R) o\ A ?m_[#ί!i$VR'$*M.343 7s;:A? ?j=;A9060 +-% E@ )W!> #"i%(){)k'2$- ND_9% >ߍo >E<;Tw <n? jY ` A |Pu'N h>   V o B = Z3 \[6ޟع.uD)ҁyϿ͙5̐UC& j݉pvۦGݦK)*o 8^Iu97T2==k!%<+2O@:T@j`DNFHJ \MۂOܛPOKE@;1$8_4.p)e%'" # $ % $ Gxw { !>#j"<#%!<^bkۑTy YȐ$'@'zB% ùU* @2BW C/kCCm#cD.DP7D;C:B_6,C/=D)*E"NEDCB @ ->3:Z60*%"S x a.ye)vJ+'ިڹӔoʌo֘דݞڝj6TS#TG Q dۑ9t{ n7 $ /A:lD)UL ~P/+QvN-KWF4iBsOS7, *"3&0( (h(*Y.D3F8D<=A"DWF ,Gy FFbDCWCD|EEFG@H5FD"cA&?N+ ?.5@0GC0G:/&L+OQ(P%OS%M%J%D" :-7!3e5 TRjjnm)9f۾ WҲa͠Rˈv6CIZ֊׏؅ܢ֙oi:_ ]Ѹ BҲTpo՚2l8& eԌ)֒ocEطnؼ|t2cX>0]4 -7 p;&v*^?-/3%]6N 8 : <jҭḢI{6M )H^P߿҈ `_ t)1sKI#(*- S-6*'$$. 5U;s> (?v|=9W4j-&yO  bz9 YKt0?p  #a%X6&'O(E*7+P)&+"G`/DKL Q   9|m%T h#1|gߤd[Go>j=A-b ׃.QAӼ =Ժ՜6 "!Uz߇( K /߽ye0.^)lgXo g r^& &   K@X"ok)B-`/-7)!52=g9 7ѱ~ѩ6{]W +!%5(u*.j4:?1A BF@U>(<\!965k4-44 r4 s5)64L0H(d 3>F&3-k13ܙ3T1Z, %ssPj 2/BX͛u`TO{SJϒmޜJ7] *u`|aKRsitBԖC_3 lR#: 'b*n-p$N-(++).&0#H1I 0(,mV'>! KF > p U ] HXS"L WF54 "zX$%x&%!o`ݗOhhL+|RޑдGUyˆĬߠ޸ݎMRZܲ Qd|NWbCNx'zzr }Q~P3x;? D~] d) 21k/`r4A! O r}xy &+H0*1|"1_(?1%/S1#518L2m:>29X17\/h4q,)0>)+&@'$#""  |<5yz-  J 9įqP"[Oa/,h!M3  $y(r++- ." -<#)q #g i 5 mPI&  "(v> -]99-C&~m/t ~PY_(]_ e>!C+J .Tav(El? zٗک1eW .? Nq^L3#{]V| ' tI !%3SLf  Y{"T}x: ! $ 7&$6 ?SV "!${ #U5 {Ic31 yomF ׬֭׵c"D&x)j,/38#q=f @{ AyJAk?l|<r8 #4%/&*&#$"K# f iJ{] Bf~ׯ^p6;= & u$(B-`51_4U5;531A/zخ*"[ qJ7۽8 =}ۭRPjO!;f؃@tRƜXm(;|5Iy,"$"'b&=~ XZkD_ D -,qje~Aj &?#֔cg ] 0#L)819`9OAuHO qWY _ephSgwdtt`\WSviPMIYD~>W82$.!*)#j($&%$6% #o5M#k w8:vABoΚ̮h؏Z F Le "!\wus? ʄciJ$ڦ-K{ s㤾N#~ [ɏ|A/rVyAբgpVse8f[dlmi#pk),,)%," = ( _ Op"0U3ڽg հ\M{.R <$'x*., ,, ,9(,+O1)G&px$"x[N R 0b ߙ VFsyfA Fn#sVI kj#;JI @nPMW ;__kEp\z, "I#O"@ !` aU= z wW}ߨڱt+J Zؒ-!?A,Rw'~GL\a`\h"4B>_*ea l :&2 O}^/"ʢ ɔR:!!d!]>@ ~!xܙs Φ G wǑJwбԲv4GnVg 9q{, )#f$,$" i)#{N!"zXC \HEKY&  (. 35dz7Z837SK6|4d3374/7: <2=_=4<|:G7 F3gN-m&OqRC;q   .    (X,6_/h/s - *%jJ %DG &H d(  ns};h ݹ  PŲ̷ Ȯ/ ¡XᡧP`{ͬ{ְL纵 ѸUf=Q u 8 +zwmLSkS %lw (:PdZI k%C[ {D , ,@}0sEeU`tG u0 or!1!!!3!-#&u+I1N N5 O7My8 :F;$v;83-r&v"h%C)?,ce--+ N'"! Y* P# :yM$U9lݯ,!Fcwm,/huU2ny zl/Q4Kd 7 ފ Lu /T  F D Aa;T!+$$"ONt} L9z : U o t   IQ ar(9z:u(ٸ,5tiWؾڀtSݻֹpwpb`ϴزh{ ݚۮa"qm ,oH KxHn;$)C2GڡG kpk%4099AP>j@?/=#9.<3,q,"$&!gs(}9 ~  2 ,  G <x7b?!P>mF f ^^oXE; H t, v#%"g($),(90,$3/4m0u3/2L.-0, -)(%" FY=#s %D&54$!U}!#&!h'&)$%!Rds% > Ia3 4 t Jߝ []I-9 s A;{g87x]Fa(5,{qU$`paI㯷zsxXܑdܶUݘi3{< 7S{{I v $ ; )8d{: 3i"$E@%x=%h% $\"e0  t }Kߗ<9>v-ߜj5H a ph+ !;!\  h   |kaK3 K !y g f <|"$%!(J%F+','W-c%-!+a)%"= H=c o WE&@Eךւ|׊m >7wyp2|5AT p) &J*-%/1S3S'4' 2[.' !c%^T')'`$& /Iq@ T PH̑|mH|z6ܼ:̱}ڻ|-ּNԂ؜VAw @ 9 J? `d[TC:e1f |2I _jP=QtY g_߇]# % \9yq7&  Bi2u/ ez S C(w&/7>DG`I GB<"5)M0/@,S2(.3$[2!0*-})'" 3##$N[\5.3TXx1MFc(t` Er(   P!b (  & < L:} t {\t;}wєKY;߿0k`QQsPƙh)9wp%I- _E!_$( +[-!.#+(u# e;.i `;i&q cP}jS* j@ w k F =D m >2ravORuTJ$U0 ~kT!'LDZmTߟ  '\HzTN!04 p ` FeTJ N s1sl 4h  T   J? u i 9 S%P N 1' !I!G`  {  Mj)I'{Pb GY_Gk^Sڻڛlت6A цս$3=- 5'v: 6D!^0$)$*" q{ %fUf ?  AÞxe Bⴵ'"FƒOt3ޮ26B  i ,X _ J\Tg(|}`!%(+|-/0-A0U.+'o! - - ] zQIn pa *J9+?ڪ jneغJc~Y4^::k E 65l,X-G30Qsbrlz U |ݵJܥNib#ET( #|L&a&]$";"$!{&".(.#s)!)O*G2+A,7 , )J V% A  * b  $ Bez5 NV Kжϒ|VєӵhӀ֫vBY i6 z4I@=6+ Xݧ@&>!"@T"!DɃ jq7.E"'$d'K*,} -5...!-+@()%%!'a(A' #?7C6]F  T  - d$  04hf7O e 8 F 7q /Z:#7YX?pW1:  0`2~<= ]l4zwWM8Έ^mr|)UjVbYs Ey$N%D$!OR) v^qB-[IFZ:'}c P3pݺޖQ18n`e@޴@v٤V21BBQ?A/. q} G$'))Ai(q''z(#&d o۔ (ڥgk-mn)"V I p a ? ! V   t-aD)  {f v 1e@'F1$F. *7;y\;o7[3Z0/1=:5p8~׿9˿8(Ǹ5b-14,J۬(7(*-l?/A/ /2"4|.@4!6i/_9t&E96 2v[+n# bgJ J%%'U$7d_M(z<[~mίhI5lЇJMW8  BR /| "R+i4E< A$%D(C/+?,:-26,f2 -/4.-/l*o0$$0A/Z. ./:081Z3/|*!"e_,ېlAܸGv V܇eu7C 4BSJn O(?h{+ @ | F !Yr4 ;G }}49"6QWL<nx T /RK=y " $n # ! ~ ZIU}=/bL"#3# !% L g o/  [C (p 45yx S8 ) I%54M&`;F!^V| #30)rlP~u4,?7 ,cu\3 0 <d4"#eJ b  " TL-4koܵ> W {#JLq\; ppd'u H* WS b  [ H F~![i U $*(*!,-;-v+U'O"+9q  [ V     R 4m E\!w"sJ'~~ 4+Vinb%kaS("!'5 W?~O%k ;z -2 O .n \$4sdtm?'>sbZQ)73LG",62xӆ % `ߺn q6 hI'V\?7cwU,߱؁ҏ' [LGrp!"E"Ɵ"6#XQ%؏&pH'Wq','q&&'+h'<l'V& % u$ " y5%5-4:?4CG IJE >K IFsC@V>:4!.(Ek DR+'T[ 3mGHDA96ytwl6e)ji u"_ybd *:e1U} y(H6V$3<-9zVg5Ut 6Rv6X2o X1$!`+e3u8,9p6176-4)%[";N%+r-i,)i'%%)$q*",{p'6#a,c uHrB%<( [ = r H t;D8Б%h_;E ֯*1PS]Mٜ٬!ԥԁkFף(yXR'g=ܳa!aޖ*a.o m!f~K* +)h "%!,'_1,2/10;/0m+-&)H!%^"O.=I @fGr0RZe!>$:&4'/)I*D+C .W613EQ4H2z.Y<*z&{#G! [  Y ];KXP#$ @ :Jl&Jyb{ > 2M!Mp'wAA;L =r#U|LLJĽ$jػ|.a~]+ZͤԘ{A6gPKԊ=)9RP p \F Ul%)-{ h2 6V94n:@84./("1p(~UnJ$C[n@ #h(i*++,-e-:,'_ G$ F]/jsG M#T[(Kr/B 7g ?PBAc>d:S7o53 1Q, $IM _Rx΁cE)U_i Sk^ӍT }߽ H z QL ) @d=rO0 %K( LxOߺcLv_$":HoF7 W c#T ) .V@0w0 .,+(# $*7  Y  * K+ H@.!Z$% $,#5"cy$s'9,@/ ,1z /V f+ n%    J 4  !qP"NSZZ ْz&* pT w܅ uּ B M yȞ ū ï  ӽ 5u7IrBߘ٧nѿ9)_y(͚QӪ}dw 7OA i'R- `( 2;dCO[ f  ; Q(Y2> 3$@& 0' x'fk't2'&X+&B$[ &D@m (a^&026>^w)Q@ RdF' 5& YyG=w@ B7+S ` ^ b /Wwv7 L9+GhX}- OjH &5|;V /Zfܤ 5a]݂ւDTϯ rg7es;Ep? I &*<$,&*+|&['r$s"o!c=dQR [$z&'[('%"B4PT8mLgyfTKh[R^a g0 x = =~$5 !je!-h! K#5$}#' C 43j|>VBi*?1ŨA8Ƴ ii}v؏"m%U'4)+B-.{ .[p-K+'"v>vjr 5% >x I<1Fݹ]>xa[R Mnp{.Onh #7I0 F""!fjl pz)i^2ݖ-2uYd)Ҝ;Ҝ֧S$4 k wۼ!q<'\+/1ZВ2Н4Ӗ7m:ث;:87 6@5b5 5z68<@E%C)E-BF]0G1H0G.C):<:% 2 %9  g?Lp;ԺË .6-ĦYiC -qȻVBÈ iŁ\PjٻکH-wkz5>  5#'* +=+o5+_++N**)d 3* ) ' M$   Q|BZd6 h F&{% p  t>jQLoX% ]!8Mlk p_ A o}YzQϔ^x[_׶؄qwzٽ?ҿ(9  Z6 o  -'#~8bi  Z 9 N"J#1%O')k(a C%y1  ]i1Ltb2P8d*zGQF_%GLd6Jۢ׆:ӿ:М3arHM ޓ  #W {&,M?.@.-#- (.+?1-2y.1.N/F.,/J+1[*&3n(2B$C1/.U/* /T/2-) #eN߂ ]ݭYE"ٰ;HҘ\O ܹrN.DO!q ?Ch!jB#$$m#P!KZ] A~ j #~u X0 oF vR Ao"{,Pn5n;>S2=g8n35M,8%ޛMbj=ɸ?&Cɗ Ⱥ+ȿĚC \4y6.a&<ڵ㥹$PԲ [ s !D&X''w&$@#^ bU X=r u R$3 wSvs %?)U*)L(ew&# IDgW`7O P -S`Vv0=v5    0< :B!!dg$&B`'&J#g!3bAW g Z|[{EgEK3uًRϏ /̣"ʞWpHaC9F*J-Dz ,Mg.VWxd88ӫCk) ͈y }âɾ*4Ŀ V  e ޺&,5_0m10O1N 48<>=3;]$8b52-/*x!%=#~ %A(,0;H46!8J&J9#+Q9/94:9;;4;;874"10),w!'!fyg PA/vr,;Bк8ΧˏvɫV|EN<ЬR՗e A3beAL32\M1zsiܷ=]U XDjM ?J7% V.#S(*t +t *(A%Cc!NZ } <X& ?5T+)m#-QI-!~=UM d, zfm Y / 9R$&F& (&$e("&BXy}  0|o`J5 G"3$ %$ # z" !^ ! @ !8 ! !3t "  !#`#7"j۵-Mfc򏴭0]P墩0 cQ;һ4ŢMqFʠͳ= g%L>. N4VW7J7yU7E77y77v8c;>*A0Cr3Du4D4B3l>16?/y-'-$)# m5AQo!Dvq cܑ"T%)&%}$ ^ U7߲B>/ ܆~{d5N#͵s[ A #'( A3S#I&3' h%z l,2: S';k|! W }  e *a4 ./of Rh U & 4 b" ##]!#Ngl%f:A^. m guAzr v$##g"2+3w 3 v>;gx6R yށѓ ʨtiĤٸN٩ۄwe w -G/Ca Y VYuZ6 b #i*1%O7q,:=1<&4x>5@3hC/qEb*F%GB"GE{M@X8/' Zi#Q2 ;7)w#7& V(v>ni @D ,HR 2  A& U MHbh75 OJ0x#(Ѐ(хd-e .|Szes-X؝cfɰ`h@#x:zI< q9L$ , TS#Mk h _ q  }D8`W PfGM^O: Lj&k !r4  T~2Q!&j+/a3{8703;i?zC)IG:H 'HXEB@ >%B=);,:9.9!.68g,5)1&,%E'$!#o" "O ' \;  D _ _nqMf+ :nKUAFn ߴ܁#k·I)ÑxBҮ̟ߴPV؇.N A߳)"A _"!oQlwh}k UUNR}Z>*J;V7P r{ 8| 8t p 0 2  / eZ A O      ,  $ % *Es4 <_ Vs 'ޗݰ-ߔ8]F!GBѳu `i Rn՜,׾p ܨn7KCZdo\Q\ [exljz i ' 5n F`| T f $h ' ) * + 9+d*)xm*+-I/e24L5,5320- / m-+tO*9C)C(3(V'~%i"yszW13N fqV#+; V &-'cچW#7D<͝VBIߥśŜZî2Qb Kmɻ<ا/"=1iq# r K OK> z" ,b, k    Ebo ,2#c$x #) " !m p{ TcQ6 n ^ =% $CؚtC}V5QXQ6 3  7Ptop\*T={?pX\;m-e<W@# k3 ?q*|&FܻN w:gMC #0,x(1W R ^F _ # $b%%&&$r!S\KP [$! *#@##+\$aT$" ;7% +..hA,n'*!( 8RK|tVcؤy՗h"ڥ_^r\b*-sxW Jz  Lz}/ e E T Dd[(7.:(]r[_W:W8_K VK*B Zo . * OF.""!Bc  VV >9-;ځxfHԕ j :e sk {L bm s`U4ѝ RͶJQ+@؉ռ9q*ܟFt:d"5&%j#c i a  n=  {& ;#!&d)+x,^, *%]% 0ڴ8ٰn )ڈڼ#،,V&Lt?yg~O 2(@ID<aPQf}K Ci > ]  .5   {]3gF[ V S. 3Q&U ZL߲2O+R uݦ\ "X(, /.&,*!(N(&/$6!<X?? /? > <8ub3-H%ypM 8C.Wg;߃pfTzea]_fZZ; s+>!$Ic(^-a3Q;AhED|@% 8=1y-.+{+l*'!fw !]% ( 'W"Us^&l I0TςoӟCܘ+ s^a # ^ QziPJcaZ` Bi9 qsi[#Nt`9Յghڽk&TyteqSC  h "0.& 1( (a%u a/dt%Ut q`I: cl WuS A"T$$z$J $#o#5' ( '"aX A !;|ۑՑ[ϗ* A Ԗ O% Tv V@S'gFrr+ v`3^+5iK 2K 1f\x1fOjd^+j | Q$4! EjUDm I#6Rg9 Ev'|w<t&\ w  y   # uK fD.eU\ '{Z#V%4&t&&o'd&%$]$%^M&$ x^L2  TyS' w"q#F"!Tk $g#tUn F :&SGlt/V?@ yORq[9@Kݕ$[ܭl.bZiD23/_j {AE LP0 jc ?[AIa 6 GY ?R"E Q"r*9f29+@ODEE^ A J= 71,I($" 8h [X ,bUli &zl4 f+ <D%7/ 5ƶ!vsNu<08*kKpu\EmB-1) fl "L%*. 1 ;33 4 |677>4%>/)#|] MnUH_Q~ Jc޽3ڇd0ސ]"I*sEPhZJF(:& J fI"M&)Rm++-I-*;$\ Xj>BiaBxލxܛ#DQpҨѳ"җ\ݩ,"2 YT^0a|  g$J ^:K=l6  @*k .  S6FT"E'8+.Y1SS3A4068:am;;@; 96*3/. //w.* & $"! #yE QZB|& GI%rW;F ~0ix[f/ڝ@ O tKLm1")$#"** jQђ Ik OȰAR3RzYҔ&1[EP WA{ +jomgMWDgj b"b' -*y + *$*)L'jg#NU7k#M &% V'w#~ ,|I.*gؿ 9ԥ؄{9q2f ]4R#)-/.+5%9ol٤Ӿʈ9̥տح2L;-0& En:#ޭ(.4BH9;p:k840f0+]'$zE#"  d  _  w ] Y8S=}5d?<u  3 d : ' g _ lg Kv G  b5  I; W$TQt,Ҏ+@]Л?vod ])cz/ <2d]7 ) `% &YU?%( L7S"*05&7_5e3E4h6|85<.M%mq+]b܆sىYcREՌڗԍ+7W4;חֆՏ"8P\qإ߲ +[;` Dy  f s7 \l!">!(++f,f%+ 0(# AExܦת ӝ:ςΞ 58AR*_7C\vW  #'a)\(U%!I)zhHP% 3H6P/hx @IJlHx:)w$/S&9&I}%%W$,$#B_!;6[h W.GesE y'G+; Evx+ N)}5eB K{QSR nO"=H">= /!$/]? Ee6:m/ b_.ݭ܍Dl݌~H6_ lEIzy4q?#$4F!)o M{A5p٦غ)-*B$n W n} %() w(% A" '')*u )pm&!EL 7oې#o(lgЇӔה],<6ax:#&&ap!" {! ^0#g#)&.)1)1'.$)#]!W h Djv#!'Pp:/^x)PMި޵tدۚEln1<d 8 UwZ6{a_ , Zݏ % ݷޙ }gyD~PK\J=3qe3 n ] Z F  YU )  \Ehy}Q WnC~//LNa*-h.K1 T mQ ,tn#;J1  ~ 5 Qy:P5#'%v%,%$$E$" R!b"R"B  \/.w4RJ vA.3Tr PJFh KnzF{%ud+ )^'{_3K,vdoLBtZB\og-޷dޅB[" A@[*d1 !"QM"Y - @5"&ݍ*ٖ-X/.+&m  m F? Y.  W#$,#a#$E% d& W&G#@j_^z2.Q1.yj?Fh l   / N ohpA7y#b%6O;( gn42#&w(Ot( &dY$!I|/F ^!8x]J("`:TZn!" Z,2tc#f ljg2lhLޕ3<~Eɯ- ϐ ֌ ߗB:e.| ]!&R*,V" ,$)'e&(+#e(u% `6f9  A9,MX 1UG</1} "Np| 7<{>cؙ1 `ezo 3V`>?W' V^ Z4"r$`%T$ =   |}gn`Rs:%KGc8E PBBO^jO 5%~= eWCw!mGu;%)t*H+*T)J'#No? Pud/J6I#& ^' H'&%6$#* s1 6 ]_=yM0lK "a"Q#=;ڞt܂ݲ;޺h:ܲhLeѥ`˸ vG > !3vW/"J;)wh(0b)HfS LN-V*M38;<=v;c9=74i 1A+&=%#*^!-Z,a )%c!\  2@ XY LtS U I8&K}J1M8+1l  R3Y  ; 4 "  {6ySk @XSg{p` * x b N?>TP#!Y$h$$$#N L ;J<_(X099s,.* = Z ~7EZ I  Dn|g#)'8\)o*Z+g-0;4F7 X7 `5 1z P, & " z \  z%D 0 + vG aеA?YY.h|ɻȑV|ӆ|:nw[vةQ5Rt K( 0%2)6.:3#7(:,<. ;/7 02/+-)$d*%W+  <Lw "i4R(E@-hyrF f[{, ^ ^i =A , a 5 ` w /4 z ڒڎ&(ݑKW%M%D'A^FEi:s Vw2{ o)LZ8[Z  yr0>}r {G('0)E cx 0x:KBq܍ݤOZ(Kk1W ,e c8K# & ~u#',3 [9 w?EIYM}8O OPRvSS3RO MKcI}VEO ?V8|0(#L!C)7.0}/Tb,& qކ23.QNK͹ܢدPDrO+>  o k: # 4%.SVb1x)?ڻm u Di!F%fmf87ɏkX܉ؘ˒փ߱͘S%YQ=>  T <| \ $fh)v[-0 *35V6(7?!M7&b6)4,H09,+!+')#%[   ,xS9Sq,;F{Sۅٛ- թ8AB|/si6 sߊ 8kf fS !B## # v! `jtI+A b Cs ( n%!"h&5  Y   \)04a63k-0$6 whk 1> ju^ V) #q%'[+ q0$4565#.2eҺ+# ˖· ;nP"|Zn%Q2hԩWށٙ7i|6k.p4X9#m<o:!#O#'C",U0AWY=G% =V:5'0F*%Y#!H! a LF,= u1Pt q3 I0#@z 8S]h81!u?%!d'!&"g 6e4F GA\Bdׇ]5%#e3 6 d%Ny,2)90-eȳ٘ԪԼtޕ?Fƿ( :ҕ_ڼߏ);uE?%  j $ LY!:""y"F   v3 q 5  ~ T _ 1 ;= _ ݏԛ)֚8؀a7zEfގ߆F`irK=|ҟ%>9ɪ y#l%г%r|%Z;%/%v%'(3*v**(*5\*?v+?Ee,{G+E~(MB$> "9,!?5 C/2n(!/ & 11Zm $[*&DVajx/*' 7z\Ox|c1,ΚdV)xS]E:1|) |cNR -jfpd@RD gYZX, /wk _D jM[U6Gb5'ah",F[1FhVnTGNze  p $ e }=-yD bS3\ Z )1k'&lz]C9cZKr2 epST1a[BMuJ\, Zb P/&0i+ O:D' /"7s%|=(w@)?(<&7b#1,%[# h `;p1f]JOϴ# N1  Ϊ qҨfXH6YC ո,u}"~'ی|T;'!guU2#wnuzOSTg ,lr77$/ ziJXjlK53Qg7d" &+\.3}.,)&)#|))U'L$!%B}^P#ZX"9m eqa Փ]u\8a'qg~0ti{E%U(wbs^O-0{Hw S{nI8EZ C Ue M ? 6 c2[ Q BvrתF̀Ǥwk@wy.ω&R=-s++Z$D!$ ) :/3}46Y6*4d 2_ 0N .8 _* %$". |! #~ "%& k% $8 w#y !*Z0 pWW{ % [&NDf I N4{w:B@DNQOI,cJSGTW8Km )C Wy/FvOQ[w/4%Q8Q/9gU B 4`IUM5  #&_c'&K$"! M &qlwS z7h } aSn} T,e ' ^D^.k;Dnc.LTR is FAezn T ~ J  = 6C.Vo@"b'[A*)&!vf `X54i  @4O(/ =)&X`IΊ@]!~+x?AæԚ_Ԩ ۤB,F k\= Fh"&v'p'%&" u   hW > 5$k %u $Y ! _H  ~  7 6#%j%!!?Md&l xe**l.{Ky!G߫^L"[K[s#!BRls>RUSm /{]B$Jf  N=</E6|^"alXm Z <#;$[ +E@>u8}`Қԙ سۯW MY%)-+g,+S+ +k*))' '&%u"!Z#$^T$/ #!22cNj0{%ޜz ޻J )$NT7`o5X2x tX  `j / 7(WK=;<W ) pl:-Vˤ[vҜ&ܷql"^&#" :'*(Q,6-?- J.%.*.o/.2.<1.+.!.X/ g1o5r:NA>>:`3V<+f#XeJmo#IlPs\ l ߁4`oOhDi5g!G ܬ[ٳֈgѮ#66͖~̱zFmUxe. $*Z~Q {zy'{.]u- \EZ'?I  =h)1< 8oRQDQ(ѯ?nO;~0z;  1 Z$ ^, Y38#:*957lc2 * A p izN[tf-&}jҐչHٹ94~ >{ j *Qi G!1$x%b%~$< "vY   ۗC؀ZzZEh#~ XN>^ $ @% "U6    x i fL+5!y+p) Kt8t,+ X52H}YmeSojY-g. [pV0DLoA c [ u]JLLl^s(ZP*Q1'>C9 k w: [ ] [0wxߡ޻#~ > G i S\ $ )D X IG jHm2^  ?Z  g0 % * .J G2 5 9^ ~<9=K;{e7(2 .)"h%K!6H ;{|-ح8JIȎIi'jЌNԉPlR3EiHV;" D $@t( D5H.9 kZG i2"s@fYQE :!h2 o4};f'ٶGiq!"ۛ#kD#g" qL| #b%Up$c!GUXC  6r\A۫ڔ `<ܘ#*d f4qL B6bݤt.׿EѠt#":eڒP'=M0>    HP-!!!#||% 'T*+++ +**-*)1|(&H1%#!KR8  3Ee YSVR%uhe!,W$9$1 l +Xp!Af24?K'FՄӋ:n[TavA48<@ A * . l {A l j k  c!D Lm]of!h/<M;rEZs< i/jpU֗  ϞϱH!6գ&,)},_.K1!45 06544K3k0'P,'H#K5 l t r8 O u  D#a P(b+ 8XG Fyj"(d% ( )] * ' 9"ee,jB5(UQgEU:cqHKoZ=T0\ i:" F m ? ff QC <m h0r N  p2@_lG/߾ݎQPOvY ϯZZcоЕ[јD9Բƃ.sܘw!xد>ab, E;Cj y  + R#] MXL !xaW4hRCnISFL*e` H yQH 1    <Xpan(!i${ 't2)*('%8!8c,L ac vb\\*2IbIKM`'<~ܯډjHXٳX&TLUI2T50P T`$#+*l//S,=(f $u'. /-~*&^$Z!Cw@ XC=K) Y'T_Pߵ.9*Q ޙ$7I< #!Z%)}Q.2619Ov9>8h6b4E2m0,N,("D;8J : %K,3b90>;BVB@;#;4,{+Z!:x GߠDݧ޽WFݠwҵ"s_ѵ}9$ޏV2IYn   V =#7)  W M \^ S'( %'C` I S hL ]ISz  "2i~|+!b$4')<('3&$H" s :C@v  O . U$tii'\֫-A B a6apsI%h'zE1k x x m o Uy:g "&*F .0E3J)5K6j+64X2/+> % \*_: 2ZpN)  5_k$ au in _ ! "! 87tAB WOJmGp1LVl$|{gM6gn5L5@a ^U&m4mSt} W } r  J . 1 % ( C u 1  i j* @uHMEpoL6n>_cBYe"Q1SBS2B$$CF Y   2 9     q [ mwf@8\Z95z83i?^Sj ! "Y"#%""(G +,,,: d)%B"~=7!$*/$ 5tlOTcՑ8Rg +Tqp ?}9  Fc7%+16:s<0=#>> `>Q>=<6:"6G1_E,Z0(!#'$$'#9 r \Eo )5i? )] +U BKPx   oM=M@  lfd"zg'>uܘw'+ׇpҲiJ$K48g&>:C25ufV-s[ kLqX& v-g 1 )3 #2V 6/! *] f${ { ZmJJL@= *nF z]   _&2 * , +/($QK8}?Hb+aY_@J"WߑO ʎ`:ѬAG1+ Z`= !^$?'+wd0d@5i9M >'=9we2u)e }G v)\$BPc<_Uɗnptם XP.O@i F- U   K!F#vN&({J*'+i0+h=+5+<*_"*x(%"m1|;1%>\ r?Gc KR#́ ) KȁʺVπ!#%89&',)5++@@*&&"! &F())c(%1#  ^  3=P 7y;H } /݅'5eO -e!v% D(*X++gu, w- t.-'+&`!J$q )gX/3(54"/Yh(0!8 vzm 4CA|75,UTݠsڦ ۿg'YZߞӱp|2nz%ܛ;)֨ܠӯӴdw>8 \n$^Ld@J[v hh) Op L&nvPr3 )a;SRhh $S $$'@*,F !- , +D {)V d%P,BQNuQzg r c   y XX a:> Z_ OCB|\w c(GNy C#vr u  Y F x GQ Q\1ROU| *:WTse+=Af+f p .k)F2\y =| }  J_ Z0, K lۢy|͵W  + 5  6w p . u % OFz $I= S#'**,+)$2 x@cPX k e:C!U=\x_o S)SM=%`3$$5Yn3WY(mJ$ Y CT&n-je25nh5b421d."_,{%(t)$- 11P3$5h5 4j3(21Q.)#dyCڶ>w\Vz ܽkDbxjpZ={ؾ=O$Έ_̝A͟$W)2~@ B6 = >#$$y#s*!!P#W@$%')**:((n&Qo#@X~  `OHed)o F ~E n '@< 5 DTC:A=Ft724B e@}YBn@z  > $ }Q7C#@H[: >j zy'B: O E A1b4B] B mlILA CyD7 M6 ZqsX'bOxm+t\X pIC r BMB altDe )~oUd! 1V(W&I!}Gd ;Z|{^L|Q C Td*T@2 4 0 @ v3cr?Tw Ki%9^ 9bJVd_X(F.S 1;j fc & +  #5wݐE~Ґ8ч&B&խ{v|ި)H~F%u v$0&`a :e  .h  2 & 8z  &] 5PSb {  z  DiI!~HWk} 3VOd$*Oh: \ Z &Sf OIIg# A v  / jnL!I2#"& 2#7 x]2ޅ1ާވ%-JwaGcERh), YT  < -  o G'| 3c$ fF"`$?%Rc$Y"!&dU5b+ 2lVg,Ht \b 5\ ~1 K }F2 e >D/b>=T/ f'_@r15&F LRK2>K(xH02 Ia݅%; @o >kP 5   qv $#3,`6 C`q<\L  s o) =O+MYF">%3 $o!`e o"%  < R p  R) Q Qlf5N,HoP eTRP ,} \F9XJnO L1Q;'0z1|>{u~_)B ^ iZ* y$'tL)9)8' $i, :; Uv 5yR`>.Q CS{g9]Vd:b>[gTd2 Nb%5  m 5 W  9kc4)@g +?+h&M&$7>  c.a KWm.")'L+/ .+/.W-!+5'**(*$K(j$)!,Hh y (J&:ܱs{ۃ=޼Fwr>Fk ]{` w WQ& AO oI"qV_v;bιI7 ͯjհg WڶH{ւ>ږ yS9"^'pq*M+8*(-&$#!&]MPr ~ 2 g&>(+.0&22m2210>/&- */(t%"OEN߈uרeћ _sE2eLˎ נӅ׃$U}y=FZU$p}T8  G $u;W#L'W*S- /R12H32V1#/,U*'$ob![O  uV< M m ^4J =P2eQ Js>~NC+ wA a .:m "%%"N CsfފmF>LLJh{)c:Zb[Zc]oOsBeU 8   %&!&()*k,.+$020:.k-r+ G* })`(&!2=A- ?6fSv Ez>>XRx9rK0XQ &NknP]s! $c~sO1 5QL! E ߜ c  =Gyb{"^)*G/A3578^6e1* "~'` 9'H >v KM r3p Z - eb3 K f7` g "u{ HvzI$)ҫqI]݀n3wg98P`6^ Yv ku'T//dQ4 o &/ G  n 8 _    R t sWzB l A^ O5. Px8D~j]S3n 2Y.   ^ R A7c'4BڌyBݥ+[wHL$  l Q o .!-&v)A+*('Y|&M %;"0WR,u:x+d!wZ FHM( 9ܔ q֜ gIvtv!# "\.#%{'L(_=%G )PbJ X [!sVb RjB[v*r0?cI  1$n`?j !`&}6+ 0H58z97j51-("={,w^RA L,5p[@=- sTG gG g$m- z}f[GG2  j/Ll3*I:QEK#OVcVܲCi=X_ A!"H!G$ 68rom?6N R!q"H#$ #0!P3tm /<" jNsiN  }-    k =  O d y @ io -D{G6H +BlCzuiB(' 0 e;;W!' ,A..<->)2#6B w yY|Z>[%; a C -Y9?)^Rh!le7QJ,YURql)0 K G g@$: (b+EE.{m01 92i2I281E.(G1!{3u 3[eOLpM ڡ %m=KK (  b pXM/ZYY M vDnzk aeU83ckMywG+4"%> 7z3m E 4  Bg z    ) I|s  7dcV =i}:zj.eT r_PW':A<'x| > L / \EsqrzݩD"9JS6QtM-P?  '  c   a ?~f+(#[&O(*b, ./t0G.M{+i L& w!!mK"~p!m  f~ Gp+ 6 7WL({Y gM7VH0q|=*arokm28 7ClqJ* - l v,  & LGc*")h Dgac g Ol5QrBB +&NR@ .D< I ST|YYM|aB?,*CJu35\ s)+Az*; H  K r %@8a(1U^_,z7mItwpl  wj pg fg9   JujwZDIWC a f~b]ԥV|֬Pgye ;n~ a *o6MߥސU hۛܢ()![ݫބlR./W23xb Fr&+| % I a ; )FW! k,Kuh Z[(T ]r*vE}h7!)*"NL}rhb [ sae5( _ GP+, d `jsexO#j#Bj"vy }8!$>}3M0_ 4uI~Y!&D*5-c0 21/k-Y*';$lrmӀ ҝѼaԩp\Y6#Gy & tba3 X% P+' 0~ 25 8 ; U=<<93&*,#V4 2=K_1"0hS`5JY yr  9 Jh,F V [Wi~) w R: 2 " & p  BG >OP7J1_$<~3+ouvE 8ZG;X=<0iK41Q CNm!!C}<0:dNOVbVb.nB*}zj k #y] M .$O%%I"\4E wTe ^ E  MD \Y.tis"q(_Yt  2 fT 6%x  =$] eO]R4:L;Upnt? @ @r x'  q"Q "d !;!"$$#6 w  c  *U nb&Mv" @TP` fcd㺩؈4ƽW܂uWSCOUA&-S>U4pp),3:=]>>g"=&!;W&6"2H)/.~ // / / . U-}*N&! _5[o ( <)Lhgks[( Ij}o < g$*;:T&bHe0nwRDc?=OcbV"#") W@B  2U?5kL4 / \,"##>"u!7f ^ T ;GB ژ.ޒS" kc<ߑ-Gh g4knT> 7bSC9# .! ET++SPWII Ve6~q3 !R ""/!t f N h f $-hf 6 ;+|tuo^U p2Nv+q ,]LDw e* 5>pgVvmLe^q_%T*??..12T54 5788 6^2S-Y&CYB  %H[o{EVb2*U#:y /!OeK 5b|/}|F?s3؀_!ڝ&y4"Fp]q)9+ BdVl"Z !($Q& o$9`}v} bWIUwkjj~,_ m 6a-ef Tm x.. vfIc$ !E\u !I_-TxSS_wK 7@ !Y -*  ! "##;%:R$ F x F3M ON t =ԬՍfW6f% v"@C NR6y#:&''{&($# ^&s2 9 =< Asr[V$U  pax8 x""I!.9hI޳ݯ^Oޛ&HW]ZK-[B%D[ t   &1 \[ n{܀^&֭|M]Jٽ#*g#'0,}0U+35 E7 G8 8z6W4h#2n%<0a%,#' "!!T I[  ^O #] fV"-}RGJ/j 5/jw3e@"n֜Dt9X1!B`(x+X3&c;Rg' w(+ FCCߢ61|ۺkca "2&''w#*22oJkM6 e|K DH .4ia@\W!a$ ^(V+-0h2G3P2y0o.-,s)6&sq$" wq],m5S  "`cd ( @P|N@?k tQ; !xweY(~l;~H{ o}_y? ?"" 6^g8$P_'D &(y&F$g :" w 5JTۨNݍN@Wijh/U Y s#X_I!("5'!]WfFR:1 W 9 !V%O_ 2xE; ^1 .z   Z _}  -a   s GkC ><R߅0ڟ =(@Џx\ ]߁ӄ"٩ݲ{w?O~oF3(3($vJ!m}'BR ;3O_ KU.TOCgmֶL٣uG %-K  I(%:)H,."r02S 5 A9<N=<$;* S9 8 58` 4:=@2CfCd _B&$@&>(=.+i=r-=.-;w-s6)^/%'! @v h^  O92 "9l]fHA?i$$I әd֖ ֢ mX /t ԓ qԸkTjt\(aFԔhJه=ޕu'B}  |k>aP_ H"Hy"!z s u AY ~ =N h^b}C V J oJ9 t qS"VYg_B :#, !O!J!] F4Mw :z Im  )tu nvaI.n ]#d'M6y u !1 ,FB +98oDNPEw$ OE x *FH{,GI CZJ߈\{ `}Qv ` #>E] EQfU(ti .m  4 a j}  . |CL%Z#a g Jfߞ/l_ݺޚ OWb݊ th]>CFY]~8`ۍQ nޕJgC)QnL M >|6$I!+[t }nJvCf>WG~ : L  m- Cff[anS3E۔s݌=ߏs3W?%h7eS ?\' 6Ndb<4  CJPv Gh"G$$# qM!_ !&(W)&!EUX;dGD<,4S9NK&?eDK pY%Fyr5|F;B%~ qDoI^ ~݃GY<;qB @c *q A6`F +%0*B-/01b3z5 n7h9;$P=?*=.<42;C59786 733.z/&)I#WmgU8C;C< ߔMJڳנ b, Ҡ@&GѣV/e2J7La JdV!F IK ^v M%e*}<--Y-!-I"@-!+w ) & #C! p3 G J|o4Gf @A1<,SH9> bw9Z%_\3 /"` G Lb6'y) !"U&{+!0.l/ .g,L)&n#*Y:o gm[ 58Ι͡:Ȼ * `O+кV;d֒l,/k 'ndUD N u~'<ޡ di%%)#m)w.2L47>:>A DF9IJ' L/iLG5Lt8M8iO6 Q;13Q+N'OJ$CD$=_%6m%/$(!!Np( NSi?iۼn^NՃN']Z ;IE@DЮ'@!;PTR(ۚy}ع3^3hs;Ig Y`fo CH ]$ E 0 Y2i:l q"{"\$&#{#p#!##$6l"09osn F}$ 5tg!5 _{Z~QN 2 E  x;} GX  ~0 @UHm r NO!Hbtu C*.3 nK; t; UaUd5  hFS'G8 g&w&HYIjٹmֺ-׊kS- w5` ,~  Y _y<8bS e) l8; B^#Eq HC B4 Q;SI#F'(Y(% d{8K.ۥ}ok2Q@%893]BR*W }K_1) e!k(~?/]5m;1@ [CD-A,a=r7y2.L,*U *)&q) (:%< Z rޚ>/jg35 mUQ\x K_%+U  G@pFl{\ fXT4 qO.ZWqdExUG&EW`c|A ͉ ʹ;̊V4ڹMa}U$$ *$w#1~i{mX%`*]HVvMUKeNR@lE;C Ne! H*^l:y"ذ̱|ʷ~CBȶF,MX pw N K0{7f ^ PX : ei7yGU$ "%@'(-($M CZK | `  J RJs] :~F#5g"IkL%q/u!kc7eg k +v p'V   y8 C (Psz + > a mgE[z6EA% ;:!ejn`H3 6 $z"mUV _ F}q6m8WBicފPOtG,Ԡ^ iB2").2~5U7 a8 w8A 7 O654b2.>,(Dn? %!'!K9ge.mV=#"Thf];q}m1 m3qZQ߫~ z3t FD/-|oF  }D  g B!_re}m G/g M 6# y <| ] =C IԱnv8*}H Si=/X| 0۔޷SNl.Ya, y  0 ij{y} + WI?} u$ [ d i!,@n\_ "  / J` sMW b % u [bFg`BQZHG[_4fF%P| 1 yL , -h <&$fXV. Y;e9pR -   4 m = ,0b{/ U ,n @';A#I)wq i0WV W ~2 7 P L pOq R  ^ uMF> ؿ:uP]INA(mG2H7#5i5@-<4} "41q$ oW^ ' t3ok'#> = rl |!"y"!  F6 ) BlF%w0;{l>P |\)N& ""  }  ?7#\1Q  z tOy6iN2 ]  5 } _  dMH A!Z#ߪ݂|m<}ٝ@ޣrdifx~D/k~ 2Pm.h6 bG/H)8f N M0% .#%c& %W"HKW}f *ACI O$> M)V-f./J.+1(8%" QR&k"5_n e 47nvw,DhR+OEc i h" {dZ)YO yAa8^$IarxCmJ w79;.ۆY[eؒآ{ڎ2،^G 9;O  kik  $&2F) +,,M-<-,:+KY**l*5*(%;" qp  >%+*w:0 i2}pa'o Kj &NէT ٲۭ1{/)cj Fb u|0Tb [l@/ 3f({>b@ I f v s  1\VPL!o!aV {b~ 0S%})g9- ,/HK/S-&) #eW :@Bb(H K= 22< L/Ijz6@Sk~X< R j1qWO_iPYrYAab|  U]\UB= Q!KLSC8 r#U -x9e ;_ "\X' QV\/4 cu *xYKYs5\1sQ+ MqC4 ߏ& 8ېݥ\E"'- 3>637066;U7Q8E9S9P73 .(#UwnvG- P82 6?͍C~Yv-p`[q܃ >Xe@m=@Gx&C-E f"#A$"$#"!(f~)ToQ6N.1)S>r I8)05qB;: r 0   T   )   &8Kjc1jrsrpU|ohT (    m 5 >$K.}a# N@|[ .jxMLh$ BpTs \ULM N"$g$%'()"(W$UO [ 'Yt@6>ۼ9 ۷ڄڼ =I&a Boa}_x("HRYQwc Erb= E`_VBaAsla1,uIh c 9O  (/W${(aw*Qn*}(o%x eJ # ) 'ix sOe6'%J_XmarXP \y s*T$")@K,@Z-8B,B)$b2AbNQV[tv5 {y#n KTgRY`6y-Ae99,5D%)[C#Lz|# 7 Y;v,(crL{L_J.v ^l x1ؗwѤ"LڔqkI:|9I F%B+(0m366-6& 5%2`)-&2a g93C;HOJ˔5z?B2[d/Oȏ8B zCMj D "h$(1"+Z%f-(.*/--//,f0(./#R,'' | (  Jq6ipH|_iJ/N@pbdMEKeI]_y' (5~߈mm ' n Z5doN<1YgfUt 6 wbxt!32%5())(<(K'L%"~`/!! / ;8[N+$V1mp$5֛WI"U0ܱ! P 8$i:@h=o_>  t( ;bE2. V#u zBbF- o{n 8 S n ) hHO]&  } Q  5m"i C 8D lq\x'ߊޖ10Gs'Z ޮ N%UPu7^gv4^ [z h  `MDN/ }xH#pT;vh9mK ϕ ( bיW& (p!+[38^G<<:`46}01+)%<O  X Fx !S k- R &#h [ ?A x__s e{=(W - [c YiCq :L5}B{fP f?|rJaEAWs?T&'Ka07adFRvpJ Y yp0Xc?*5t 8WWJj { _M ^ s7zq|: kR KiB2} )~s/Q}EB3 #V azlN^.Ao>ObafEPW.&PRd" i J S qS &  tX f]An 4 "o %"'((&$K!$ B Lo t v srx ? y N}/r4wg`6u 6 { ܗaZقڕgې-?ܣP<KOF߁3-AI.]S ij4> + Q  | =T%5&If޿  J K _ T b6h:~~l[kVY=uUUo #"; g#. is^`-0 _\G'[-~[2k6 Gui"R Ra `d[8MJ I;w"gXL Vm+!f%)u,T.p/%0s|0 L0&/.x-+) n'z$!:CI (%&D 0ayfJ _ea55r{5 c'  P  n0 j    B   p%)ԠL+  ήwhѾ4KPӳYԹX>TS:GbYHp؍ Fvҋ>Ёj(ӯ"L&S)y#,x./16356 727R4?1W/O-/,w,x+o*4($%#! 58~} 5]5& zJ $a[({PQ"O{ S ܳP%غ]ֶOpx.$^WnQ07<#*Q)V (+ % ""Z/b27+ ,S9AL0=$fTKQ 8fx{6] _ S /e5Lu.& "/Rf;O( \j=6 c $ ;% #b!O  o#&7)])r('['&%@" po5K\#J|' *rMnC4hAMsJ^L&\Of:xPIQ^"~K\<' E & ] 8RE"fJg7-`H  ܄ &no I5+! %'1(T(8)))<*u*e(*I)#(>&_$] @"   nv zk T][VAw}, v  h /  NW'h@^:SXhN M^ryG}D hJr`eC( nfE'  1i @ Aml! !l ]p6 ?G@}X RQVZm  +6vZip:PW.(k-n # >O1MAU^"XS  C 922 z j\# % %9^"t0G> &5L<ݷ} ܁;JS5,j@r:&V vN$'$(@n)r1*ID+r,+a) %!I3K+(54 _LX{HV&MߥjY۝{ٵ"5w۷݆H#$+hh =4 ;Dc%@), 0q2j 4Eq2-'9: QO*ozp,vUWޚ߈h? hq`\J8 W> g%#%'y(I'#;tf x 'tC $Sm<U|7kR _  S %x ),,~*&#\! pR )bboEWd Ě ?̂/0ژ<H.A77$)q, X./ ..:.,$*N% dO%K <M]6}){VLH%v'^ wZv]Tdp~ ) npgg_X#{( qV . Mn 7aW0bEbN>6499C$Dd4M W,q wx`-#@$#N o*t=QpCj $xL% 4,okV\C)\VO]^f$[]Y J saLI"gTw , M r  <  e9cQ1V~;}?8GJ J})&c3% e ;,!EY&"1&'K+ؾ-܏..//g//-,*k':"a"v&*.0l/X U,(N%8 kdBr9l"&dgKnݣ*ݙAJ8*} Shښ9@/[\JeUq,v   2  { wM q *A  *4' mu w ,fX,C5۸&#ܽ=[ LKlbxys\ C4 @_\;d $ ZzQQKm+`chqaީߐ #^   ` O   `y yW7S{p< X"a9 B > u 7 b  !Q*"j, %+-g8  p3BF7\7Y a {^H CS  ,u([7yxg)MZ0P]K$/[ 2 n ,pog< }WY"%'*&,Y+*&u"=Lx}%DH@ x 0Џ4π^G}uܙGh $+xo87 &@BJC9/(` >z\#*6  J |ywG"0 )  Z!, R6'mkrafm6p | m z A0 p~ iK 6 O . " t >+  .  gNj!O! ]*JvyH] n Nad2NzN `%/hRP~1p'{ T x  { E r}} >`.9# =ߤa-A<~tc Y S  ,J -m 6Qn ]  T O~ *DARb<!(4H$ g d  a 6     e_ V PW%+\^nE L #I)=.[L/-|a #8 j`Y90+kl;eBޑ>\E36ytF W !ot:cRLeu\h j+j6+J+*wH@g+ 8 CH BZ  W>9y/Rg#T-,   *7o%  VlYOq.w0id*|x?+SUW]@( Lt }-2"8pMs:`v[7Ebq!ߒR*"#p$%B&7&^$w!;adp;s" 'a+ H03:3[k220P/-#*/F$l $[5o R* 9"OՆ־١_j>n%GmgbXt C 8 8`aGgi 6LysLD[aQuRa8piuWH y :@O+V1EqwLc XjdY,`b'IB35[!  Q, G`,x    Oq >!K#<%D:'(z)/*x)/(Z&&%I"D4 ./iX\ &+ PZ y  ׻ xڦ  F r @, O ^yqc U`@ +r J j*  km q d   8 X x D W 2oT' w9 OqvH!2 Z %6J )a}Jy%Z }[$Hg;  }:IYY DCVoIrE0fn?f R\p+ G߃ݑPK='>.ܸxޠ6wadm BV11}j (|;nN%ڶt Gw AY4H-&9C a A =kh*oJM ` 1> F" ;rM t  sc 0[  2   P  <?P2KNE   H >l:|7oT ! " o 5- WLwTg>0j @e5 {MHR00$;`h! $3u$"M/0LMIVY% s ,fX X k 6lF\ U ]89=i{gYU*J7Z P!%|^KDm=_N0DJ@LF r f vh (> fO  ` zK  " "Yd j L |Ewݕ5ۜ ܗ P X.yPyWr #   }HO31 ;FHL%$k-v^J s mO= " )Q W + A|W  C   Ggf)DV uz [ ChHzy ]=w-."PQ=v+XQ} s  9 d'шok : ح$] (-*p/,I/23&8=I@DZB= B?;%6-.85&< D"rJbN1@OLE<= 652 -i>&]!L,BK;nؚ ܃eܡxڐO yʱ-z̊F~7>N^&o!!1%> 4W& D .  " `7?V x g  L q uv@.$F=`xP1X 5= v4 >* &K q 4= `~"U G d9[l+&Y du:x4e      _ 9,   U {S!""!2sEM) 06L7 4 Xۣ A p5 Ͷ)ηЭ6ـ @ l #bu n .3-Gg'g$Iq '4:pZ DU=89]-v gw_eBLV 2& $GEC  h ! Fd : [  R9 ]s3 Il#=S4*JA>- 8$@"),'w9*F+R) ';g#K3:cbdD L67WH rDo]cW6( a )T>V Sz $z t /A %5 n u k_os%ڿާ޹hߊyk/4nj J`n-     (  Un U :,  Xz C Lx  5*X-BE( PUr;D@H >W D%)L,/1r1[ / *-+"*O*!+"+&+2*|*-)/'1:'2N'2'g/' *%!! q ~ P W?Dܳ]ٜ ֝GcΒ|·t]ΑUϞUWD?RYR |PsTn0   q Qc" nz eJ!!9!*:3d7 E$NvZf `t*Cav%1tr>h)'$mC s 5 $I  !w "O|T C 3%GMN Q!"#$$w#!1!Q!1# '%/ $V q" o  Y B= E ;  G 5 b/hOW1 `.QCI&7q, VYj 5 oup#e3=e)! A!1 553R ! QqJ 'Nv@-0rC2 g  & U  y  p 9}KV}r?':V o8TF,@_ O7<&R r /oPUwVm 8L o  +_   G  % D WL V;CHgQ;SNJDe4Tnk6j<5Xw: U $kt~@ D BkTP<+bk+f^!*C H 'TH rXL.?g& \u NDZ$"\4i3_?4[bh Lu 'A*s &QBR%!rsMQL! V> ~{m.K/wLA j6  fH  ydF.W2J(ݾML? (~o8!yUX4HwRN X k =  a% }X.Rz s~ y |cUfShwtv2 % & v M 6 1 n8V%,:/`t0v&0/.,6(" 5l_Vfg6g~B^s^uB~ro5q# :SkD$_t~5y9 #@ B&M m YO h>H -h M f  ^Ua)2 O@9sR P  ] n^B S}?sYV= '`^~?;t ; +^Ju(fM'c\xH`tއ݉ޛ 8aZ!!"!J$u&'P& !   O , K sLm2 "*/i ai /PT'L| {z>% uyHr! 3 z ! z] [ u?8):MWg$~;$ ~ + 2 vO p ] {u{'5i  \  kSoP]ES3X uXeZ "`'}KFVb vTLpS|o@@^zR9A 45B'!J'i+84 gi -V#  >  }y/,@#<8Ye 94K!5\?E6 N^jx [HHqTlrOssA u ߧSmE,5sݎXthEjw1P*@bh"p+v T [VR |2 B)g!#B%s%-0$#!]  . N B@ 'F\kL!*_ 4$ZiuFe]  m+IL!"`#k$ 'p \+.0-C( F"i?Ws %X)*zXVT I g9X' * rbu=aChyD mo`UhIa/OOf U/bt'}f-BtD!hPxw l Bx ^s7v(U> # s=$@[*6ELi# Fu^J ib;Q`[OLp}}G }gTiHt: FmFJR]5 D ~ ,Q Ck  3${9 NB?x$@:'ESND5D^?B 5 Up | m ;]LHc [ ~ F{I*1Q]Nj(6!jF#% &R&%$T#h qI]{ ' =  +  q Zn7y?a_ Z4 TӴlд9JLZɞZ Ǯ>L?n pV3}+Z̡b7moߜI.[IX]NE rY'=!!)"#"#5K$%&'([(L(cL'&$jR#4"I& VtTJZ4"S/g\  E 9j1S5A hI;9Yiw; V 5 9 4 Y 6 #ZvL:-ܮ3ݶߢzy`#]_d:~< D{ Pk  y 1 3 fFR$JYMb: P p   K)@(aq_s Lk *D3 nc :  n+& 6 9S$ c=-Q@=OSޯ@l/ J3gHMlN2H0 hS )VbwRu ) j . (V+t(;_a`)_ $I { kerr({+TRr.i,fl>޿= 5A_Q j M h ^ R$R,i$C  g l&O W- y 52 Bl aa0r#mnlrywݏ  B+mPq[+a va L7 u] GY$~5c   L*Oj!f6#I$b%EH&U % `$!6Or; k1XB` 2 x4 xW# Pܶ @ސ un:KpNTWY9l nVO& }9a$ U Z *5  VOpfjܞNقע7\Rєϫ`[ uU\3 DruC F!C 0%k %   b h  9 7Sq z "`kq  & vA - 2w3O;W!A# |F Ko W8)Yl2ߧSWz Z<;/h^:hZ;/ BMXocR[K| @ k9 ~ k4 &}qW M_ RMl+z 5l]66H ZL dE? ^i < MmK%A5M P m&|}| IFa6 j [ '&+ /U11/_)ޜ"*IzeY] cPZ=оa_Ɛщȹ_Ԗgԅڈݪ-;mJhc(= + {7 Yn FC &<5iP$-5]R ! De $w;$(],.|/ / g,o '  0( 3_JcNShD^G#<a _~ R}hY  p97 l=R`IV6O l$8Y 4X=;|z>vW PGqK:. ` ,W3 /LQ}oH:NB \  :l_}c^+LF^:! W_ai ݭuiHY߯HQX&2z^?/U ߘz/ n 9l "%#6 -$G%gE&&&>& %!v#"!#$u%'%#!  7<] ooNpA_DB)9VRXmg2 V5(y ' |:pgfYk 6Nl mSK:v`' sl/TU`b_ S ~H  #|VݎS: P֔gNQ01LԠ5oaعS݋Zsc=,P$66{[5&JVvI4.9|#Cw-IxJ %zq 5.)'o%/b>q w=Z>;$CchZr ;MiL/ ([1{%4b z  pL ~ jl    a  iB2@y{"xE) `  H^ f?~Kef4g= L4 ]Kka>b 'FgFDt Xy1gTA2=0ܐ']9yEg.uCd>l{i w%$##ln/kr G3/$ Y#9 V<{-h i kt kbkujkv%O G EyV t 1F0CR}rM1GX2 ^ 0L ? i h s  [ d  SU E / Z  S ` E49kXtsI), -\n7\IL5n3EIu-.k%{m&0{Jpe  m>SH%Q  \ %7 \ 8 | uq9g  j  B-9bp%*i==4;_I~AQ*&yWz)B$"FS6e/G O hddej [O@ 7y ^= W$S :  7|ܠuק[veвA t Y-8,6` mP ;i'ql"\U $ ~(;*Ib+J +P |*")"U'"%PM#o4  > = 0_5AIhyM  / b `)7UWX IGd1LkKC;$/# 7   zel A1qMy fUW &+.-)Q"$C @%nF_4% X(o"Cb,u޸i #!&s %MPSf| WP q_3x4N yjs} | D FWs-+!?E"T T(q)p   :  {GgQf  ~ 9 YDpzdVW^~ #$ &-vJ[ lEdP'bl+J  `obDht h I L.6Wn Z # &  JV D Y { ~_ E  cw  ކ ݢ R Y 4_r33T| nK  /aET ) d%MUk@/z}G In++ J y& m+K~a@Pj B rPY1` W (F[')k4us ' JV 37D9{C6Z!ZkG_*  F C]/k"m{XwHH8Ek|~04A`  mKN|O6M > OMsA?s0DDXaYR^2Do" O{ j!bB03'E 5z$tn$hNNF ` 0 I 1WP  5YdY= {c)uj FO?U F _     W " & uPOh&:1 j Pg v M  Nf M $w, EP;(G\{ V 3Hw5Pb^$ >pf,(%h?+huJ zs -y:0[  E Nn'0N5t?xD}La z@KbY) y 5y] j w`",N R  oN!rS;"6$ :% $a#!  HYI7; Ei\ JF "#*v8 ߢ5)֪J!Xe[݄2j_$}WAo %"~%*(+. /5g1j3@=4EE42s/+H ' # C`UR 35 1p,^ k  ( { u* G2-'_]c.  = 4S'}e wni P &??w85ڹݎjHf$kH W8Hb;97< P>rt  5wm b!h$'&')((% )3(a_(]l'%#r3 | @c R] :$"ZM &ݚ%<2"qR<~v()pG;AIh8  s83r  kyih~ "qJ%-*'8e$ nlY % = y fTRe0f[cU J fm i s ` m H S t O' @42Oh߆ !ڼkwMܡJHPd6()[/5 3 kv/?xyKB6t"mAnQTQd#vX o eP ;  ` dB=z<p *M8>3V1 /`gMdP T~!"!kJ CKGFy,J Ub+ y[Pt\lkY2 &d!B u ^inwBa"o%((W)?[*s)W'@&(%$s" dEKVG<L  zJy!d OjfeW|IuXW(hRl{cE}Jl$$0L e k 3 g^ #JbBJc M t & ! b m& WwhB%/I! * 3J<^9)`d+  CG K!4!\Gl<: -|! SGzf  /LW{8OuJ\ڼ.ۛd ޳@1je7N9!t7H t,d=- *!AD ~J~D7; \QNC$-.u\b   _4#9 h]A5 q yx $ v)kBylz+ BN9h=\a*FQ gn8W7f_o&  E b q D Pl^=zfk5  = d h ( >Rb]NNjEU5q] c }< mmQ68m4!ߖ " ("!#8&#(h *+.--t+A($& 5q N R e U7\ k)+ `F5^&cRyk.+ pRHU{EqH3YpI~p#0Q#SK Kw R ^USbxeUbQ?ܳ (< R"Y#pY$3#"4"l ! !C!jV;|h P"7O8 s 0 )b9eL2 Woi6#3c<P&e q^  v2 H %`{ Sf3!H@p$$3TQ  C~o.41[ l LeT Aj ^  K \6qRLp7) * dq u 2 o  oAYBjB sT0i   Li rm#IU 2dCb  + ]  M l $ & /k!a=`d'@yi{{?6 aIa%Qf%G rp&2\imQ=!t E|v ]Wta00 x |-;ARk#GSܛ0qJ_D| l( |<<ad  KbdPL [DZL< "% Lk\2 M *y4[Ar 1+ACC_ !LY(M9  W ? @{ gX#&(VZ)(H'x &Q$Q" n()0f>;Fj Z V+8Mg78-# e*3FAt@\#  4Z L= Zh tQU 9Oln.m$)-.G+i['<"t'O B5)# J9 9 nXO`HRRp@(M Ng /(W`"bDR >  ~ J  m w ; | *S`5)HK5_GsvUh\LRVLNTX\W6 XQJ80i"_P0{#1>-# ? #l%$(/!W1a8vmpl5xxl-C0E A?B ! f H H O }24_A+>`@WBM:O 8A,3[KY9 I+ub{AF|t"T%`''3 i'&u%$#%+- /;2Vd3[2 .C* v$6<0 ^ ( 6Gg @3F *gU75UIy#sSR U H L>svA4m?X\\ ^  =e203SkvsR -_ r ou g3Y 3 ? pO .=u-h) x U,rk߸:ju3)6JyZYTa5dO 8*'lvR=4J-_ `E!2i:~RD&&y|d,}Jn/+ 7 { OV` J ^H"SEca4U+ 2 R @ ~}D[9q} / 25.~H.:U v/Xw(E_ ;"',+,-(-fM,^)$B^! ( !Ij A"3%##%$$V%[`% >$"(PTR &xJ*ah*j +q  |j y ;5m xz + oi~zCDT,<;گ@ލ:T1 2"G%''(&#F Ja (Fb miRACBJi"6 KvQ[.Omy2S1A :?u<: % >bI[RD%5d Uow2Y f  9<y; )m#f8& M { P W ] #0q j sKL ` JWoJ/N@ y   ( u9F8@P&Jn# O  p = 7]T/ 0 e 8 <uaoa W Mn.a{ -.5 Yk&eAZ+*? d xK#ܶѷu Vhgӗ֛D[LR':_CN ) ԄZФ8 ¦> 0 :847"&[*~-p//$s.&+%c($%d##!! S)} cN d9 3 9 2y o ?W#p[fL| C>": 9$vUۜ$M / 8 h> \T t! L""#/$#"Eh4f qf/KqU( ?L);ju7$;J  6&8S $ {61 #e B_S2&0sgm. HT 2 5' hn 8 ]X5i  D l  G " v *,3wY%[OR>X v!)>3 ,lI"6: UtX : d xK/=w[5<U"d'v\lEbZ@I9+ f \QH J  j(,,x)%' c"\nO~Ԣ,ԄMOՏ-׽݃yސh?;5uBpQ L  l g~x!Tl oC#`(+u-g.-~ +&! F P+ sI  V M  n HzS+FS S(,W1~$qlg rL2 {I ;;-WgCp^"tW6A zc  "7fWM=bt84@ 1l|d K+a!3 tB+"&#""x# # M# !1$w <|=|/n $DWwt+ TSPv"FUlNغ{u9/&j_ H m L +! ; ]A  l; \   J\ t u1 ! J2qTg"S#b%!4!:6odBdt]GSWC_=tXNP=Mc`uOX [ / jn%+0 3Z 4432/+&x!l3Uj cE*l ecvz&?BH!}| Zw bEQlRfnHe Eo I3   { f e # %%n $|#nE#y#7%s&'+(/&l"  & "e  Gv? :W pq`N(o@F_Y>/ݽU&4u$]ٰ5اHI Y5c}YiCbz3r"jU(zLCaZ 7 nXjGn{5I|a , +I "  `b"  N iw / qN8 joL!X\3$zftE/k68m  < c`SIUEro. #!~!, !_  }(b-8TY!6&0*i-/$0 -0.+^E(9#gi ? HۑvPmS5t Cxo@X{ڢیl{^2d#^N2ۈVڲZ*;y`RևtӰqvֻؿ{۝Nމ = Cz#"+/'1~0/n:/.P ..zt-,f';,-*1C(2,%0m!,'"H l !3ZwN3}XUy;6 W'VY M/l&z#w& )xB,"-oR.kK-z~) "zpN+H&mMHCnފH(ZI! HQN"GAJee G[! in@,Y qj  P  q  @{Ur+ Q 6 iy0i( ! u 8 ( /  06  Z /!-$JP$$#!z@0a s 7^;hx?% g89oivH,eQ9  Q1 jZ up^  C " w HP 83y_`w,. : a(M%a' +wQa D  u J M u k܋ ߍ ?@/A{*,b+vEi&]aIaz   m u :  z W0 c$h]Pl  Q%7FF |>I9b $ dW3DxyZMhB<M  SqQIN^7!y#^$u^$+5#7! pHw3S9,7q)>Uq3c:<$aA&;ou?dB I 6 R $ r02 0 KtfcEq #"&D))$(P'&PO$y\!5?aNzt/Iv8 }k ?r *3  Ke A}1`0 ^[VPtBd ]JQR+ PM v3nkw$j o=g=?,Vp$# g: lCN: i ho  L q   GiX.2H)}e߁TaHVT[޳F0) jI Y= bAF/^ r <Z!1# # "~d!0`WwZ0f3(yC6/hf.Bj i g( v+  fC|3%!jk8N)M%Kdt:UV.e.uAD;] v64 ] 8 5 \  2 ` B J Ac.U,Yp 9 K ^ q U 2 J[ | q  Pe 5} 5 Xjj l J ?k^*P_fzQvE^&3HR +$V:9OuK#hW 4 ( =u/M C GQp5K \ jI.ci*c/T=H AOfm"L J _ z  X  Y9-gl)Z Y  9 i  V m T ce  V &Bg |RC AmB17>4LT} _ [ ; @ jb<<=   >3 + ? ~C e P uvLp~w<;\!'Y?6+Nf K%Y v w "!1&5 &,SzGA>@ec>Y1%E-2/` 5e1U. lXK:7 U ?mJbv")TnF o>z e) ^w4zNofJ^M$>fR~ C+RfP{o5 c"7c  ; 82}& R u~p[*!eK H&<2 ԨS!]bq#ލsi=Jr s9{"$%i%:#Q!& vh0M IK   l- A _ & X r** s7=+I3?[^ #r9- TjV?I/ jhX4H-B 'P aZ7o 5!! M u dj!!"9"I,"$! !    K-UI i !"@!M!P ,vc-T hWR Ź%߱vuaؾ֪u"ԈԃKݓPEBL#SP u \ J A 2  u   b EAFl(8RP@ U ]xT0k$  2   h( B  S JOU_P/h.v%Lt Lb.=   u  )$tn  < SHv7x^>4|9$]DPan]]Z61v+}BfrOH f~a|03.A(^rfZ > Q8%2@I  0   i    YBL`# XO ) 9{O'3-C+K X#9>w"NP՜ԘDԹvܠ OcA5JTC Y[Z !8 0  D  V mHJ>wG S3gLhAFE!<6a _E b! .Y!>#%$.#_"D` @ Bq[ phq:R>wA$v(t2Cd@w,AuSߘgpqk,6_J75gT fKb|H G\WS.B wWi o}5?MyM JJ Y? b g g 2 7 *4%P cwTvGo2x\9=7p)yO-S/e! IPݍ-781 [0V d*T$)-.w1qo4;6s6#w5%3n&Y0p%-i",~_*:(Q$a r: t #1# ]  ua < 5  w]Ӛ0) ̾\uIzcc{|<L") G * e uj     : ~  = 9P 4s [ QOXS?>4#V 04|vAO-gKeqx    g ] @ Od  G ~ =-ka#bZq?(sm.GM-<:, 36v7:R^ 3)Z3J|Q+4Z6d>3Y޻,RޜMSMlHL].Jm] ,  5 ]^keu 'y"B4wZT1}  ] b .  6 'lkg I{ rubFc+!n[)^u\\!b YF~SvCC] (*0ecG ^l     w #v $ .% I$K!8>A s4j/n =dJ&}fd ] w&@ [ru  U  \'Kgt J D hI#  ( ] !4 )8}g]iGAK-EzV#;IU+~W2* NPTFL::W ?rbbR+xM5UV 1  u J 3 Nz z0 * SNJ B)t@<m5l1 *O=!$(M,Y0_e3\4Q4u3y 3\ @4 4 !5 594c 4q21.,b(d#; xfK.a (޹ /X1Uuϟ!΂Y ѼٻBf*xDlx`$  _ b^1gk_/BT4\ %Jfr H#$6)%$2$#Z#6"X 5zC   D . &+%: 3MCz.N        ; 7 ,` q V h^la[07M l. r:RKMv!, hߔ|K r~:s+$c {?V&+=YiWA$ %LE\ 6 D v o9!!}!e=!|}Jxnbbe+ | OW#W Q 1B 9ܒ&ҽҜC&֝a<=Gͪφ,ӵ0^ժD~הEؖ%1# d42tq0t ,J}."W Z 7 h p  [ ;" H# b$%8'v'&S%3#"&"c"?A#$%@&<%^"!% T o 2 = 0 .^j{V7,}g_UKqA~ 2w h&ArJm p a  ${6!3+ d >VCyN.K)I+XN !`k/aX/|PERMP}2]f xwN (7  m.yIM{i$L + Q\GBZ)u~LlFHM[Ac,unlc *"h #)Z=2zc v 8 LPfX=ۣ/ [3 V m v|  x 6 @j }~B &v#!CosN lb ~04E CC\4 D  k 96C&\UPE w=Yjy5s h9nF^q^S]*Y _B3++sy5mKbV h [ R* \  )D:,qs| i:#9Y j PED2:05lP4Z 2 INB(yu % I  p 6  g}5q by *T~Y %'inw r ,bI X01  }UE27xu#\#Q_JJ 7 M p )    , HCZ[lq1a$\v<zt ~ ! :,bU_+'NRݽ޸ \ R%ܼU݋J&ۨeܚޯ|p{OUH_x F#_kr%^*-/1S{2 21K0:/j$@/(/D,0`/2114k241R3/0,-))Z&$"}c  < U  c8yPK. r=jWz&`Ma$)zׯ\ؔfgk! _Ua&7-M#Y   3}3%l& m[: e    T $ Z/ZLXjFa~\IIb?7(|dqI2qF6wPs8qR X   D ?   W^V#[d( b ;XYCPQ8QR,!fq/ "7 J kZ 3IOqY  ^. { Q T ,$ %R%#a!8 vQFx |C<߲E~٢Ջ\ߩЎnҳJo#+P9=?h;}gao,Ik L#%G%"qFa4o2 j w"!nCc0a (>~@@PST  T 5& 2uv  t  Q 9 {  k  )zPi+ u "&k~}8u4iP&4, `B& 8 Q K8*/lOG rL2 I{A   'C  ^  \9``%C  vx04Ap{dd1wg/UF#-.Z!|G(.+x  \ k m^ x J7 7krw(!~,U(kek! ?LD$% Cq / x @  C  a@ d \ V ga  Ib 7z+ Us O   ` 2Ow\8>{gL>ugn2_|K IHjL&1M+?g/Q"6zjH 1 - z+h[[ff]- CD  g g |8Twn:h+  C <  r   f   }Y\[ >  )  !>*vYv 4 81IgKI9\;pGT_n~]E 28|} ]bvS("D%g*(^*+ ++(*(T&"2J  F i  (  51  r'[NMts|Y'[9U}!;@?e(,Z&*Jqan p' 5-<G@ *N[]r$5oPsF&"r5S H u[V9gWns X9 "#p %&'U(-(&#kdo"r PQ+*|w"l-\}c-db.vLSb;;`x'A = Un Wb ip  Du  ^ ( }$ )!q_I[o5E>Xp_(p 4 +jSwLsq_0d)  { #HGV5V  [9Bwd.|@Ch|aS 0\}`p /P # /+  nR 5 $}!! "Y*"lr b r7*C6s"AXsW`Z[94z'`?bPCr/'8 wbAO-r [IpB  * UE} gMI,r_ }0=4FvF ޗPۇjr76zِ׊EL$'DտEؙ9:{kI-1NLyI F   4&_ #O: :5Eq\ ^  !V$%(E;+-,X* %}  [mz$XVleM $JCcV%s.l\J  G o e 2GIy^D+$ ~,CT@#zײuҴl]6{LP Ŏ 8Ī ]  |[=ݝCrU"$d%'z')(j)('("&$%5#!V _|%NVP5XB[$rf,+3>9 =?A?U >|:47,"FM ܾv`֕^+֟k{4.CqKӜ0^;߸9> Xl? *S()>] == y 5 H % Y  Q |) O0 ]? J|f #a%@&&R%Cp# |2 %  R5C%Mv|H-v2)x@u=aX68qA jFB  p  y  \ I!=jj { HY<u 97 -.Nߑ݁ݜU '9-k*}o351 9     K +28 a  = L  $ $-RS #}jtq#PFkwcExb,#H% 5l q# .""q"V"("i! Q!   P s=[o ? "kk<^&[6. O]cV*=DqڎOeھZaTb6Fpw=eky bK t ! ! 3q#;P (  yT :qF(_y5~hGr1ʜtГ 01eoZ?` m  E  nP  "m$='&SF'Y'&''=%8"K.   =5<+$EQRw(gNu j #)g'vqJF3K?M] RpT)^ :/0W~S dX#t$Kr"ck*<* Gh u* TFRn W?J QUd`  mHdzH?mA-O  z s   8 # +5IgmI,|X[adw?K.<skUf0dae`P :]dz[vs]xi:CvLz0K7DZGP 8\Zz*Gq*nA <    a :+ _k >O '%}inEG4Ls| > @w2X[26<5o$  5up?r3i CE 3!1 js< (YX"0V $I]*I ?t>+}x1)It&\  \ P E p S  $     D YM m,VXPd=mz\g ,/ H DK<~V ^we}S   A9`  g  I Gq.>,,a=7D<0VU j ) |p0ueE N /W V  Fs\|6QG 6^  ~ -kC< @KD1r%-D//.ZDKYDg|{SGVr w  Nv<U  p r r $2 D  T U Y 5&-3Q23 siq-y%`nT_Nj '   T `J/ e~mj^V~/0gNEYsotb lkjW[M9uw b S ! A vN&AA,*h q "3[f,'u#7"7y9` \OB :  /  p g R F> dI z U\ })G3VnQYx4@ G <mT9 ;  O   t  s l/a2Ta* 4~[\RdoJ{ ]  e ~^ vZeMGZ w jPzd*Sfkse =ziܮ1ل9pw>A e$G c+$0(+,k,+ + + + + + *E)(i',& %S P$h";0JLL ~ ;S6RG" ^dl]݉_ڡ"$(;k_ /Bkח. n ; sD(h@+JO^r% G ;r $  $e/m^Vn7_ O~SR!:wT2wYJc/ g Q oG 9$  #w{& _ 4q:1LQG D]hitw|}xj![BALa^L e ?KGg 3_ Uy fb>,K>UgJY?Q%>:b,*] /uiNeg9+ O CK~9{O ;5]d= x"%"&A$S    ; : > *aBsM%UCFSeBd T I y ZJ*a7?{t].a8}hlU2U >;d-rbA!- L\XB - +0{Fdmvtx :lO}w{ !.|!`!y G#- !$#  q 0 t; l  3 G ^M   >  ix~ H_&  :' 1kaI@>0'7+(+i!ؕw֭OոbfԐڬBb@H>a :v\ /O" !U&K+WQK ,\!KTg mhG\q@"Mcy! N h < /~ (  wu) T &     FA 0 j M m d8m1E[R)mezUH A jA8Yy G d{ 1 U&+jA #$X !m !_g~C9 AޡAR-ZXpًB=w ,d=Sn%Al8" oW if |ZSW)2C+db}$_4CumjMr(e @ ' u3{ sSw;4t !e@ o;| p  TkPK = x/k~X I)l1.LFno  P]K b } _]" (\0 =Zn= h) h 5O&0. |D2[N w.c c:zA FMt00 o3 a^{2SNUKl@Olzr 3;29[bc:"R7rQ(p y v+WOmx.w C n  -YBYW <Aq?yjp 7\'28^pAIPk^}1dF[[Y;C(r _izQE  MV= >$ =IQ5 &  ~.  zg(T V3p^Ev^2EB_.$@"p  5,{vJRwN   0Cc,O'!Tk;WNu39Ei I gQV^OM O C  '   q   e  d /5 Q 2: }y \Qh)`a !h ] A{ mW3/_B~\^*^@j(E[9x*D.~7qyzVP/OifXR6Ih# { ;l he-,.7fi#F8Ed  % y% O+qORM0O"PWO@1uY}WAZOW5}[DLolz>'XsGdZu(^'{y  ' k % %A"3|l$9 b!G/$q%'{'F'&g$ ]y>;q[ `2cZ C;pK-!a1$N "GsO VTcP'Qe7Ok}r3['w7 r$V u | * D ' S n :P+ngz DJkk #    fl`D Ei/ t .پ ^ kҞ 9J? M rZE_q<#84IQ/(7x}z Vx:xh ;socn ( $X<hhxQ d  K1 b @W qr  E C  O   GL|t1 E U 3h  & I  H{r  b; ' b ? ~ O r>a~"ZG|'1N3 Nj[| F{h6oARV-Rgul0FsjW_ D \}  ;I+l rQ':2   w @ Q q9ZW )t"ߔ tBn YKeZjtOfW<Y N^w}(7   H_Eq^E g 1 QQK,`y@tw{MNKAb; Jk 7 nG2 EG.  !Oi" # "$"]$ "j he8| og].L@qRPc`_[]Dp"'6LG28toxoX1O ^kH.t$SjL-d"yCXd-  ? "H0*< P!a  Tj4a{~~y]tvM%f +O8 {*\;UI,#Muz  w   & Ws<+AqA o vlm_@|1ާ6M"o g!gE@b>=ta_{ 3z X:MO:! '"$ !$!e TpLD[vT-&WOO\/T  ci* I./ WI{ T l`{UH  >W)Dgz3`w&<t*R610p'yyT}|YF8;gX c $c BU Q   \y C WK :LpuPi R*h  p e{_\J%~Gldc._ an0ulcKxb/{7R2~<_hbSfhL}]8^[(q/Q7'M+;qn Hs ; } f!P\Xr"l>g " #D#[" ESUyrww 3 o   F ]ah0v]o-<DVKN> f kN}u/-/.X)7h3Q& 8 r)p(IU>=OMx -  DdLhJO%`/w ]R z #U'VY]ٛ[ca;J$P 2. 5 ;  \I;nJ6 6 o # k +<aa U  DKf1fDt3 ( d mi _ wwcM5W|  %<T2K6/@0gI''3R5?+=hA"h&y` [dgnE$KP 7 b |  9 !  S#'[# &Aa Uaaz8%np0Fffg)~ ( k P  ^* J NNJ8?lUdbVD"TU/- |   I C2 %P{a +Q ;L&|ilj;St%YG^^ . s S P M 6 U z G  Z3u|4'g[ B   L d k ^  y  Yhw<] P;al9o`WH!Uh-w`oUSZ~ hMaqF t k 5 e 6  [H\nV##nJCVNQ2# eh%4Vhg[z /H  @! ?>  ?S0fi.S71A,so9qb8t/o65Fx \5$Lc ! ##&$X#! L_g%t (H X n S + S   a{UwU 8M fd:I7t[z+Hswcb+3*F&hlu-# YnSr? sT  Je W se l9   |QmjB[!OAPZ%* z 0 =  u O~+YQerE lwsr:>^}?T A v $fjg x! !b"3"6" _llS]w =X#M4@HIXJz8dWF43 #h7 }Sh?,g'YY_;5n eE;{q 0p4M1 a;1V^Z>.(Jy   1mu>  C# & % T>  SKT>AtA7L2M3n<m !O _)S/Zz5>a6\}D>3E?62+-)QAs]`0 E y |DD^os^ kTb,|s'cw QLA `>7]!{"!a # \  0N `      i)ZXZ>F`FD* Y= B l Z#MC*dJ,rL$5;,\\!:UDi]x$yIUBI;{@n0QBw}  y Q %N3:k%dt=T{*>8!v*Lf8cqKb' >V & F',lS8vpkl#71d 9?:c2G 1Y/,b,E+zP PgTg7V}(ܽ@&K;ke+c9v@n Tt;4e7g@K@  a\ L#u&3(C(K4'% n#o !~y, f019: tlβw ϯя_՜ےܥA.j:\{ҕ+ vJ x#w%O') K*~*)}('\&W$4%"* ..C-1,* * )j)P^'"5e ;ow}`wC\`"r?ރZ-9V x"g% p G 2  * 8G*,j9`uA l*E){+A g ~ & ^vT>AH5p q@1qW 2 ^ d"3OXU !! 3K\e  21x9@$*  >cw o& ( ^:",BUS.M70,hf4P[JfA:L%Sa Hg*R|R7ydQR[5HkJssNW2a3 '?M$xk"0Nq,c8 ( 6[dd 6Na}.HaFq] < - auqYQfBT3l { qHTE)zZ6Y]jgjo<=Ci e 5V`t{7#g%a'2(W ** g++>+G( _$Y o >2 kgX"}\55ydksoFSZNmL5_V"B>r-l\TK?7pd_  'x  z X 4 f 1 o  ]  y '  c   g9;4w X1C;r=NyOD5* 9 X.'b " 3 ZPB A[D^u=vpP^!]W7yWM6r:9EkVo6.O-) x1-I =' R}gF tb3!XTtYyu,]s'1 <  oZ ;b } > w  o k 5 8  \h;fl8M6+H>)e"Co+ c , f)uuuX , 2S Da |RS1 <Ey s}6s>T : ӟ=-ёV#% p<*އ3*,oa~|l(mahyCj6Y!X<%D! /'XIDfqc [<>|a~$AGF1X.  {  r _e 6~ c Nv / r dW vIR  ) [A);_^r^}}G\ 5[ FL .q$SN  ' .}1{RgY # 0QfT g7 o s0  n P ZA S C ) _,, R@*di5ux*m^ E?Ac i|Ws2~b" cSMh>B(u>Jl2 \+fp ;(>z993 (}]gb. < 6 { | }7 r \Lj`P%Q4>dBIo > /( = gVZ#tO!>k+). a" T3Q-/r  NA8)UD[Ga $ o  9[ c  o ? {C  n 5m A j w  j # T  O    L    UD >hߙk޿ ޯnnG4$SvoPt$ R*3MXl/v/g X > h QQ  K p l5 n=}vdya =  y t vu_'(  ' Q 2& T45?3Y4OH;TZ {+)xIOB7N9]O[(f"n; 2 @v O |5JJx"N%#?#Jv"LW t  *  ufF d qD@~:8N)u#X/Bi X= &@b 8 K/2Lz{ D|RP;xP731HWyexp+'4+ 79 oHaU OQ $!ut" *"t" J# z#" o < [ C:Yy<7TArQa Z(!q-X2\Z9Tg8dyQ+8f ;k^~`c!~D,I6MX.]) f8CFk )& LY+p=bXt+C-!Tc2oq v * ` V  # Z   2\ h>C~MA c/Oq}#e  GS74XD 5h$.t2vkh0/|b}FI`tE4 G!  3^&flQk3A ,Lrk+ @GhVC#0(  Mx I : Y e! #!X$$$$#F!;Z_y = _A  PGZ`_zk'[L*j8NK w Q0 ]$(meQtFo_LaeUDQ)#qsv^l H:i.v5 3  H HT TK%  bG6IoBI+"m;! vWm@[IF (*3CY IK3aJpIsTJ ^y i fu_No_on`)714am]K7]SNUz*JH>,g*u!v A&NZ 7 O:C}'  H Zv[  `na P + M !UiR:0KZPJUW+v6 E]6"z*s,r> k!CG:2-[_t~ i9  aU " V   6  k p p |y~jm?/ _(R }4KY(`'NyKYwb40B [ c 7X /n^ST</U-{Vۖآ@{=g~?VߛPmqZ]K - !  k d [     " # j# :" B!/ T\ [jHRw|Cy4xC B oqZ.5VXJ$ w3^F.B!Mc'sS[2Q,l9b0 E  R * bUW  w%  _F(Uw{"8 \2X IZY^ T ; 4 I S [T M ?  4    x o ( M8b~6I,~7qz4op(48r_Ii<;> LpXJTJ]~ CKw<]Wtq;. lW V _}exx Kh _.Q@7'%7$uy4eqE+e#@:Jy@A.&skb s-8J i.ZIT Gs | F4j_a KM M > d Z p 5 s  \DYc0cV= kYRH9 $}nzWj} LI#`_-9O4_GR3N;g:>/9y| Dx z   hZ  857%`8%*g 2  [RcIR8HLiWUl{*2*DCJ{pg%:!dmh , ,_ %9R  } # L B=|oxaLf2MZ A;ntipg%qa.bV\^iL#9)j+&LM4oW[YrW  y~KLT:0^K  hPk% 7!;I 6j viCw7V<]op #V{| ;s @6Ui>TtsQVw_U@Ue߹=_Mp#^5^' ;iAH^DS {XHV  7"x  qfn7_  l"sa@l+t@_=F;> s8Kq[!=W><Q&Ne:0!TaU(5 $ g gW2 o^;/ I @nA-v y7 e 9"C6$M+xIb_9f9yzm/L0Hj2nNLtC"  !$+"I S I ^1SdT8WF2r]LgyEF{UbBF(GFD '`J+lPmxVOK?r o ;9\%% ;t ?%!;"*"; /jy k(&F9Y< q .0 #\ < uZ J -{ -# [ } 7 W +owU : n g = #(!oM^ '+A+6BZMWjG=_R3M20joWi(K     jD     w  a % 5<*740orNF&y@\|JZoK`mg&s +A dTKxSs>;FtT{[pODQ X tEq?@ ' 7l c a    t  g+}G\4a{s. q  ? @ AO  /  pM#U ,pGG5G S  m fZ   " ! i  "Nr3=oy&[zE}6ya>7'fYr$8J[CtkG x   BC    s`:~ 3 + }! = `C{( *[dhn"RLKM( N>caP=3ca>Rg5* L ' x RG }A 9   7 F q  I* B`r="K"pC+i"  q #l *LSMn M77s@vz.)ycrBQP1]4 TH -lSUkW[5;q1E >7#Fnb11C 0  R< z  Z%   r  7? >  & t5 j 4 > u3 $  Vsfs4+L6 >nQ$8@= pA*~ !S 5 }n E Mo > ,IFl|D}f   t y K   Lu SA 5c$< 6 t 0 !2iWQ\Y;Zm^YYDuJ  ? .SDM , Q n *~f}h6; l"#X'#+S  3 / |yxxZsPH>N6]&i8$50 e4C . v " M c:] l U A hU!O7Du%= A h=alT P#nzmiNM#,jTFAk<` qt  z-SAnj3U;   q: Z ]  ^ : Z  R b F  " m|M0kRE#Iv($|e- BG lo*Q  OY>JPgJ#b,ZST. *]/jFLZb R > ?x-L `FlU1YK\M %U,bB q "G+Q  I, [  &  p d G  }@-Sj E7Vs`X{kWg _ ?%:Y{OY 5, u ) (    : dV)I ^ / 9 =7YN -]TD#|%u)*)0x7<u) 0f m  #  J-  |  {i  D _  z b 7 ~  Uk`9\96Tx<>-2\[?5uoNo%,glg+N8w7w )jH#cq>$   t f  z   2OtK9cj#GAmSdOJ0m@s}_%<r[~!]wb <3j}]9_!=N LR-;V1# !O q M C! ZO L*v] Vk ;L\!( |="+$X%<%/b%V$"0' r1)I' d]1tYSݬ[އߞX+_{RKB  u  3 G,%# mmd$og; l&[a>* 43gi _v` tG\3X7߭fIs!9U\()ޅDjH.GYQA,E7T`t[ B ,qY"]&)  /nz6<gQp7-  :  ;  G V 1  [3 +#u" [l.^J~|e@e}4Z_QoAe;yIc;s   @ S & EP*A{Sk?/%6I @xX-)#Y,P ( >  HJ,h`m#!,sbBzI20$ |u  eqQRP \~ 6 .d^I:Le[d:aWdF,eXFO=(Q j  zC_ Uc BI%;"FenG`  9|J1uh^"U^doZ޸Cޙbމ5.K;8"irUBs4Ts > . g f z W o   1E > [~ d 8W^ MT`}nD{EW;P;Rg!sr}D_sepg|l4] + t < | 4 " Z E o(hE  .  x(8(nW4|'[@O: L1 \(ww\TSl PO} x[JHt**(vnI~b Fz f! md  ' G zV   c { "  R ! [ **jYg:G &G@97;~$)^ ~8k  -R &f;( "X&s&| T%HpYt eMcV'ya" 8vt gj ;)R(_B `f,k.+8sTuAj6cs2 p.-cP nJNOaPFP?VC)VSx 6  ; mi\}gݡ} I1`Ab/pp#KUW =gJ) S i;(T  ^ - I yKJ;|8Wf U  ! If )R.LY|KV{9 AAa/D=qRz>|: W!T $ '>617 . +d C Dk'@OUvhd rxd{X\+rMc`=0K(6+wy]f N  X # Z  k M 7 B y. ~MDWM3T._Tw0CD& Q 4>X7s b  ;  p p Q 5~.+cp c <*(_2mxgN~w'su/ CH2&O"B - ;id~$B ` f 0 n U Z  #Cl=&x M;m.8NclWj)  mIq]D : S4J@ ^ QEc-F kih_ TJb "# $%;w&'P(]"'M$$"%%%%$ " J& D= MdI' a* ߤHj@iTgM$z3oZ"T K +I `nO-+R8 2 -h   ?  [}B @ Z !v I~ W )5"hk rFvVz ya 7 x   V w  T7 !  T 6*]10n2)r]P@\B`|  e/16=:M[RR`qhI* vof   pfmw7K<Yy%_ExQ?|e/ttW  6] 1 3xP#O6DK pW 0T (O&(cW {^ g5<1y" 691eD$1 /DO=,24?)Xv,@y/ c ;}D$rH 2zh  R0 * -@]#S<d]Dx(  8 b KR    ^ s S ;   Y Q U>;31QB9 -;=ZO<[~y`_#^D^bmg+',"U`Ci -TU>j[?3M~P+r?  ffq |. R v w T  [ 2 : A 3 l+2wl`moOl]i+@?C$ 7 t \F$H0F`>3 +} ^D O^B,j x 9 7 wQ>'Q&/Oo~bWk J  V 5 $* UD.;g!)P9"iTdb}ZZ3o _ < 7 S#{_j  p DP av#TutpIgEpj-G436BF\Lv   e  sI &2 @ L > U Kg  5{ X+ 0S  % R c`"tY4W@).9BP|;pX -5{'O5A|mA24k|]R n a0v>{( ,vV@yx o4 )pe VE C   U   )  rV00nffLY{w'riV\^8+ 5 S m  jk  Cq'vJ  Y  6 Sz 5  Z[IR<-U2o|^h6T>\x#H)M|^/h/6u\kqnmk  k80||\s _{bbO"<b=D0sc 1 " E UaXS  ;C [EN5.,wcT}NPb$ u}Z[{+ z c6=.(%7T6sB"w>+/=:K^G&,Q<2  r | ( E k=  <uYFfau@oz8>0>O*if L% > mZ  c`? Q ` 1   M`  k .H a a\ RgXretv2m*}k=]1.A%f8|U{pl *""Rt!/& O :G yy?/JgH}4.m "  C  K  ;?fem  G>lO=CRyh `ZMt.vg y  & w  k~(= 99   z4 9 0 (  t pZw~^=]+3I=F e=V Q<3 ;IA4&n{*6")   o_:l dD|nw; _z`y[3@sqOT[[jyS&[QxXT1PXbz 7 n)BT^iP'!Wuf \5gHl Qk C NV g C >  bN SI   f^XTJYY<`  C hg  =1JD<3 W7 c|'/,qz&\*D^5O<X\YG@FnBs_$3X3"ޫj8;c(l rdsh&D! "!;$ m% [&'u''^'C &D!%!$!"i! Z9Z  v  m PYZE="Ek|0SGaY  XYs'Y!-xv4zy*:jSFb!}8+D![* +5t_+dHaYS  k .P F,6^ou Z x =o x)dJl2  V;u(Z4oim(N{2?igJ9% ymJyuq<72 vtSLfaBXpR 4 ]{ wDYzftYlH$U 1 F`    l  s  e G' ! Yp0cn](,7p4QW"f\ b R <   ; wdw % %$ {}pFp/f lGH]3Y> [O"n[6jqau> o)U'')dDp,V DW+2vT N@ &"(^"*d _ N(bDv u} H-ZRs^(*    _ J9 '' mp yFEr $))>zZO`310a*Fu~[z;}NV2/`,I 3F9-R[XF Mi5|LbNq00 vt$zOT~VQK\!;Y1C?* 8 HU 3%u(!+%&-.m!<0"0"0$!.j-#+')$ ?   K-LeaD!r@a^4rOv 4z B ]S= [SnNP>VAg[gd([h!G} L>My8Y fk<  ow V\  "  > e    . @ )7$P%eOOp .nsQ%$! )8j%rV 3d]k: tM Vk E V) jC <[!6#{ $ $ 9$ # ! u   g 87 j`$G'e4s)Uk>qootCS{BZK;TA\yOb4VVryq435n\?C I>v  T"  a Wm"    C!0uLjK|o#*{+ e @K [ V$ fy P 3 ,U>d AfDAi! s T $  ' '?dg$VDkh KE.U0 @~\DO61{d_o\w5'd43!TFAoW,%/jCTU ^ *& v  y '  \ _{. @ 9  D=hERii#<;} C C{4%7G  z~ HA[DݩWbh]֎_$׼Pܚ5/f`8 #Hi |&c;  OF/ 2 * ,   ^ J!F"#$%<()**)'%G#u "  z e2(Z2gU7{ L\W3ZrC5R6Lu&"Asi"s+    Aw >=  = , l C  ~ LC  M s y  4 ` b T`=Oj2E|V:4j5$ia`w{!~n2?G ~ =w#Z|71+$NcvS]I nM 3 9 *( #  . } Z  ; \m0 l5"d S ~ H|R7 ~ S lQSZw"IW4%y/S4\NsRhӥ5rTT׀jrفA^iߓXuE6;j~B-E % 1{ #  XZ Jl &+ hu =f]f8<_ vKh' WND.]gbw$8NJ |~n,A 2 ibD66[\ ?35$[LYM> X}: ?u 8pY ""$"!x v\a EWzHJ  B'  #Xl3/u^eVn/cKUzU:"f RPEQa4T ,U   `  w:tg{ze d K  8$K-U )_ EpPHOIB>Jf>U ] vE "kk$_a[R5#oE 78 -~FLbII9n8D,"w Eb V   Tfpe&hNs; "0Aeq t @ QgrY3  W  y2":o6Wi;OJ%~KZddE=Cylx4y eUnu>,*ocj! j U ( v   gZI&^O % `  4<UG&|7bA]rAINL*yCsA$o[]ZwI=r?cE7v^<Ap ( N\h"8   !q/zz!u?1Co$8#?G9"0uP3K'x S {/;uL&>P{T7  uDu  C2  Y DW-3[yT  ZwvBz6Mzr&tjvzEGQOO~?UG9'YzMF l/R*D;_0 f=<q/L]?~cx4k X5:sAPk4  h[rQ~/7:Z+gqO5e\U&f O ' lqBeJ#D~Y4t;6EqS q  c =  7 F m1@y%g   @ ' PDDS,PQ[;K1,Dx;%}%StJeN Sx-{.;J W`-h%-]8D+s-P}34"lL1?=h6-)6 ]*b( c   p o'y O   I % t K ) ye" 3eI"9oyC]6"(+Mzu`I H  G0 sX* X< YlvBREx h%K z W ~ j <  8  R!  /Lxi{5i|i!QyRAX=wHv0YCh|$%VE:Z  {/[ ?XG W OLqQbR1j2\0 ] DT)HF C @m B# h7XuoOB]`eoSt$G0b'' @?wqSSn0X.Jdf&w~ ~k0 = * . % XM6'1Fe)VI8r y\ & =30SM I~Y ] A ( >n`-3]Ao_\?(4KZy5&bIOn<|A@rZKM-cEH (@x)2wRc[5=)= 7|k=j*B_B4/x}LF3(, 2,  y S cW T ; {  #| Dog/+'j:SS$Xvf~luG2 6>}9 S# 6' j> ,OA)@j  m P   2 % N   v H Wa{ g 03 T  'q b N#]#: Ik Xweom/(! )LjSAerB E # ':Fd{z5O(# ; Q'}ltJ~dskgR1   8[~mxK3DSGY{B81l~3UiBK '@7VQPjOfI[9+ G  a F @ - , $ c ^ g N o g* n  <   {yJcra`N5(DK|#f_.hB ~ RK E4 R/ / <E; MmQc9[a  6 A @    >Wk F  t W@gd}V5e{MN0u^nORKJy-_2$~n b> ESyh(  PX &l9F}tDE ?. Uf + r Sw b :+  X $ ++  > > Q W>!{B\Agh/X#I|w0FX]}Y]W^ND[3k n Tl xh R.C 0b ! ""+## "##&6#"0!>4, @# w+Qr?N-+o|("gk|He*4}IDGyj_g ccp[h7Vz -0x`0_~. {V(c|qg,d<,%Nh"0^*C b a  N A Fq6kPg_tWD" #| N|j & D4l"v>w8WsyYL g C  L } +bGVB W RhkV%17vTI HkHjB<M3j\+j4eG7wZy-? U k/k  F @=GF ~ _~  n >-8  vuja3 1 SM  4lr >[ ^ @{@\'.GT Qd2W,'?l y{JLG{P=l`7*MGe   _ o  L XaSw@C+ki]3w2$U/ y   f?|tGI!g  8 x {eL- O6rH&B|OzKMQn=s Ilw&/o-j^krpL?G,{v>Q+bB '{Dm}%B}p =CX I 1 y 4 Y F  #^ % \~8 y__v!w\t~tY}\[H "X2 ~ F K m  w G ) u  |V3N ?AoJJ5lK` `2 b N% t Q  w YwJF"\My~9aIf}Rt X [ 8   lt  8 = \"  R  . H ?[,Z w e ekQJRL\i1DMtSLg_j@SneI   9 } ' g 9rn/ c = B- X Q     W W sE-"= 0  f9~8|=N8>085xk0DlY[*X!E 5G  $ m k @* z  L : N@t\kC|.)L;V7R& u@`:/Cj`Sbb1|0ol*F_i.U @8<] CM HG, > y   , |5 )! yj ?  bg.{ sQ l V  ` em@eM|My&x3B"unq~XqD}.q>Zp (hFS)2 vUO cg  ha0.[*T * &>Y#$E%7B(jRV+{bG5%5SS@ip L ~ [   | mh 7*JsCptAIH.F;   R O sa -p  _v  V" hW O   8P$pDW ZaRsn?j55rrYri:2i`2Cods+ 6N*?[)U- g_  OQ!$u 0,  9 NK(PZSS':E{qf&;A^ YbH _  0 R}^9B|!y{cG A]x,QW)O J h[bx=Vv Q D ch < 0L #GQ^g)|8L {{ e    5  ( -3;:t[^%w H[uE9 K 9$$Ak!Kc`>/ ]%8N43KKT IX h%h 2 65 V  1 :  !]&x<^+KoJlN'|* e.2OTKPGX#NnSy 2    |/L  K=49 /`-KKD./29}>dP ;I ; D{-k8z*yx2iIt}l?m_`dSH@hmb03: v  s w \   + Xa b @ q&  p<#6];:}S=rl?to J P c  J  P E . K Z     HI  ^W   : e " k aE N e  X | < Z J ) :Pj)O"^R .>Q,%L[utkxwzCR%.EHXg.~> l  6e  MxAFUc!`Tht-S(  D9  O_b \kf'h - t aA'3m]( K p  7uc>&=njtCyav;]&O[8_Q   -I/VM-jJ`=!V|J ? j|-d\kl)Wb c^"w E409a-2&nrCWjdmJ\7`yKPx3D/6#",%7D=~s uu $ x  ^  (c w   @Y  {  y}  $O  T 9 E O ^ Ef?hRP[eG =qW$n:u`q'C4} hDL(SXIF~$y]^}\E>9kTLYwQ    C y rI][%_=rg07}/_(C58rFk ,,O8 M"> J C ~ 3 L H;[@,v}W:WH{ 9]`rbzWhXEZN  6 g= y %B X t wS    A gY  FY KeR*NeYT X5Xp-o~`nGW?FfCE 7  > Nn&W*NN]L ~  9 # !s!R] IA}xeBmk\C8[!)O; T|ME8,Tzce^~*Lkq\l$4U%0xj86>/pNneMFO1]U.3$~^&oiJ *Y[y%XXWbq > c  3 Jb i '1yd0T$Jsv$t;SV7\9 !:5y  6 [6 P  DU%=YrDuD} ,3@0nlDmW 383 ak /9 >h~.(qp4:? btu\lYZo|X +.fG),4X uNwkAVxMs^  \  r   F  [\a>NgQ jj  :8h*OLt[PvsW#KI!6?SDF R~<+V 4 B U r N ) r 3 Q ` R G l 'Sy%S,;>Zt)y7`On24z"g`,mo3]Q1A]s&{qQv,NYZ  Byk J r- 5l - )q ?pLbh aX jqM_ 5hF2VxO%+ 75Z{@JWKg~n=sJ=t r k}(z[rW6aDWIs 0AQV#W<@WcMeK-unx I_|U!bf=&:Umzde9> _tjU^?oh3N?   WE2f K 6L $-w D >gZe6 'M ?\;?3aXS:}SrN~1(r\@` s#I =/ 1RZ^Qg,HE$l%Zi` p/7LfZ\Ly,VLF6yJ)^V|1iS 'C~b f@W -&UXQ?;d*D9A3N0nDpK5nbL1o7<T8``=j3yAFZL+_ &(@{JQK'S@?|a*JGJ/1OT$*My L8%n ]"5 D"v{[W- Rhcl<q2t-Ad_2`z6{y4.{jlV-jZ U_B+%6N>k@*; DQN WB(}c,(YR s$.H*- \!mH-zXr]#T$|pBt{''lo%^',ab.N,8Ja3 btt!jj0I?cFi c  X   ] ^{ TFZ8 tQ^N2/hQMvk47B4JGrRR'nDe+Bt2/e/ D}>q %r8V9~]YY>^d EUR]YL'25`_/w8C+XDLEy@VG]? #a%LK> .|-  c5L6bs, U@^ _T4]ICJt{l+@O_WH%QB(-}bRA:P;pc N:: h{]mWVwt* Yxtu64OToxo) B ~   sf 8QZ !(]a{jrfVn g=?U&V.-`%m 7qh|Ca8b;uA^jxHhiyK{1gQ:4^& x\#'bW^c..t&Y"UqvfWI4=rv3 4 m G { FM9,yoOo*-d*/{D.jANg$5}Uh oxh<>j@8R%[t]Do_IBxL?st?EaU (  8 E!UJ n di =A&4,}gk@g>~ i;Oa{_q 77O/=OQPu\ V~Ff<tOBn0Z9)1$^#`15Dpfre[@'#g N    B H (0%#N R  2 Q U E<K#p#7T  dB5*LI v#%ql<x_l3>T2;6{,S1}d^^m6pI2*/,zT0 g ^p&}~.r6:Uj  tG|r5R-io:kmL4&G[PoTi%X12g?#cq&?SEM)(]g5lM'  \ i /u @  9  vH^xi^JrwakE_X>0wGpH [X=XQfuM  b|gS'ZO65T*]eJGq3VXl^R7:5j_s: 4h@82fY{xdYQG2G:KV)mDRZCr3kRT9g`kX): =4 @ X     S ffR(vzijs9r/n#+pG-d \+'JuU?y Tkis!~ GX];?u$li5DY# ^{q!d 7jLiH8*_kC3Jqz|5g_spTX{ KD1+c6[DJ?>?X2j^:]Jd&@'xg7-i4I?f m @uaqID8r"QWn",c >u^cSc#tNswj"C>U4f[GhT)?VIN3# =l F23vILiTJK&'"}bQ6A#\@82qV)WnYW/DIq=cu,4h|Dr]?~:^ > *~  % ?  " J =  6 $    *+O1p?A >=Byp6wncIpp %G([o\`6 aw+9[G1 >~.x@g=zw+J[2@[*}N4Dd$z7t5  Um /$b31*[9|~z4d(7YPlkmJ sr+mp)b $aa,'4[M67&e8nx02Z7!upAYLC-MkD;s+i4eD$!Q7pq9MAuXfU[C<Moo{Y#GjIxJfbNrL{H!=frc%|x hX0"&MPMQ#P>ARXxRBEOF. Ri#Q::g{XX.n#:7^C$oz*IT\r}ZspNRhV8>P2iDY'2C% s. Wf4w*{wg~kyFI==cB.(Eq%dMY7I'-I3FCePuL>Ogia&)5Kl/S-f| RD?6Z -]2@7O@"I/}so1pDu:> !~-v%f $>: JZwmfY`@6ja^nP>M(OIM"S=^T^pL*uLWm}!9p)x  `W,_I[MoR it 8XX~TJsp6 \0DWT0 nt<5dv7!e[)G4!!(<)5WNg.c}'Q4w\l6 .^?c$1K0dZ@NR55*c"gB4Ds}5xfP.dc4N: 9hQk~bn~$fREE+rj 0M!5CPJ<R6X  sK%8]q6sMV/T!yrMU38\i{[j9sN@rh:Qo;a*ML3}`~q?rDKo\iZU 9 Hw k   O _>G~:+qF-syI$h@I xa1O-e BRIYCElmuc3asu9KN$.2^KBd"\D/=J~ thI kV^K1RswB=WIV FhoW EuD\{W7JD&{ypjY= R,eYYyL2,(b;5?3qhK>FIyi6klObN|Q{;\<S yC69s!o+l IQIxF35;$At6A5pgD m>BF(*z:fTI7jk1mXJoW" 1=~ 0Jd"IRv3*F {_g$8P1r`&x)E1R|/0`BL')x,1o)5z)S>R.?xar4''!<6w*^^;_9#U*2J05O)-`K ?QepfZ_R;#- ,I=$le72H&]ql4_!X2Av/k j{:,(lV xP mxX~M7MOCv;`UWk(I>GE=qCiHYj!9 B@- 5=u$#X *)*s;&`c.X%&#"^mi"`)cu.e$jOEW_ZL1#,J|=D9p6hr1Z{vuY:*pPU^mKFw;^ch%5EC-%NW`Gka9?r=.cLON R}09o ~#  5FF*X*8t!+sJ]r8D [!4t6mapXO\1kP[|'z>1}xhb" %9iYXd8[k?A bQtZ9^1%o rbrtR@$tf51q&b-)P>Jn 9Br<yo,Hhc,H E)D3)y`eR31 |'G*A:lp-ayB3)inSSKgfxax 51TW@ &%J5|P#-c]H st!z3uE[9S],1F]rJw0+M' SX2KN&yqmY^<{T?q5cNi7C!)h^Z?1Y uU.O[?dM(x0M +}S)E+}JvG^0x79,-SeNmd]O(l<(d71v@}ta2c~= k)>@!u865#/#jt~p#y;v(|YiT;hRI@S1&_|v)?t%cwO)wDFqjA}Nf _AE9 JXBUoF_Fk5^TQ$GCJM7*E4Y=^ Z! l8%`. {R1At9# u 2m?hM0 N8^P,Xg?W .!k'rpz9]E-t a ,,OKciW*#huHV#.Z_ Dd=>Ui=$:_,d\l.,YgrubFt AP=V} %hnoYi}ZxiZF.~rS Fxo~I&MqFn-7 CcFY?0G{B!gs&VA\ ww`,[C!0NmO!bvHGH:_cW*8,`o-lM-RGzn|kwEm dW\C - Z'V,k9-Ut%6Nhh=voRX${{"~xdAx.sO0vPey w=zW0T(3*Zq8%=9X&W$;mU|Dz^'WjMJuyn9b%,^lhQZb #GihBHa($[A}Ei!27XAg\=p[RM LF`H:wjS&\$%LWUmMg7SD>>l@7\u0I>|(vj!6700/ Y[DOPL8H;^G?f"b>3tOZxg&)[yX 9    49gRQyZ@eq<|6paqN:-`t{s P8czyW_ (yRU.An3) )OjiB-ll+vaH8@6_Vw  :;q+[2^YcMgYN&> Q2kcK}r[\G+/w m  {Xi Jqty,^1unuS MM`k# tBp{hBM nH.cjg~,HIya])homgetkPmB=;Cdi9  c:s)};\@*NrU142 .kx^ @*, sP 3EHUp#{aP<{%lK+kW SYURC3p`xk[tRzT] 'Ne.F8\&vqfm95UKX$>aG aHw&J?Xi5(,[T{Kwj?+Qf5)A9 "0Smx|wKQg=$x%"SOTL^[/ 0=<: oGw;Y-t.vSDA?}?u {H8b_$h<( _d@Nd9Z3Jm<u # .7m!e1vwt[8dc$hqm\X-_I!bRHbMg9#R]V|8]#CJ _Q8hOmc($!MnkR4 -JSQHb?o[Eu*DXPge}l,d Nb v:#{hTG5^gv%S\Y',R@?q@Ji!MXfi ;jVi$}U?~JNm6WI01 +k <P~CD-Wz"/l*vWU S'"3Y qdNQ2dQ;dd'LKT;H+Q~yheh:p>dHrc)se&xt1dv`,u{ zVkS>004m#UGjpY`?p&k Y27Rfj>}FDpPOd4c!9RZ;>}eU%JTgw 12N[f'R?w`[^M_ZIk&>FQ|nSy D"~)/D2,e&%:)q) >}G`D3*8%2$.C^tl'A_/ 1W,'LxO)~e. /`*\uyKV0 54'iN^Yf]}* (ew7K% x| pe. Y.):us9 zZM; 8 <$jJozy] P:1k_Lvpbi&tYx+%}]HkXell!p6JXk97oR8AWQ:ZJEfS$'+ !!%  '. 4>3     bzflag-2.4.2+ds1/data/bzflag-256x256.png000066400000000000000000000431661200563112200172740ustar00rootroot00000000000000PNG  IHDR\rf pHYs  gAMA|Q cHRMz%u0`:o_FEIDATx} Ev@!P 0$@e(>S)!Q<P*D0́8< :vw]U]]ޮκ{NwuUSb4hUf4- XCW7j-Æ !Y3;񖫮Zuՙgr0r4ռ'W^9'=W… oF3ӎ;/WͤoNjg:QW9P %EyرcЌ^3'O:iQ(Unf41m41~xg@V&( FHf4C=szAiVjc}ݷ mTf8gVjƍͮwim֠NM+$3:xHՌg@#h,gof:u*,O^*X#f4nE᮲_JьN (H`LFoF3e33FwK\{;7 ]h v3לy&O^Z SN٣w_W33L[o].%c@cAwTib& ՙ10x>ŗ-5nW_ F`̮l27td.x 0zQG E/P~S߱a\~-VV%KÆj9"k͋HoLhi/c7Oḱ.Nw76JdZ1m0i|笳6c:T{۬ٳņr>}^G{ܐFZ&S;/]VA>Y6q&@/fMfF t5j1יסbg}v A70FoF12ߌLX~1+Dcx|1ӦO7 xVw]zZH~fCYa <>cH.-m6g_؀&ƍWjݍs1f2 C) hk0Rg&ʫd-K+h`a:ѧol SƣOw޼yލ P |J^Uy+VU"z  .lgUEԷ_(̜5K,ͮØn,0VoW?k1`lvb#홾*iWwهՐi,XP9IbQD_#M5ϯgfܹv @;(&Nk_{]J@-u[pu!α~h*Yfn ~~އ#o2x$Ø&7ŵC\X>B PSG' P#l0gg3ԛ@LjXUkP)ّg—I PP%ͦ8p&(y6eryMNg5MX2Fݳg=.1z Z0ahl@_nxQR ـE鵸y5;MȌ @h4l͜\VC8{uA3`5kKW\˚\(o4^lp #c@Ml(ᰁZnQzM*Si4nAԣYU.001BPTC|gСIcp!1۲M&ȟ$ / !{ n@f`>=T ]Hy3ܧq GP`=/rzXԍ@Q6d X؎/z PHG#*H\,6S `{G}96;% E-W&~ԫAOB5 {fl~;A{* U p@}ְdfAb$XB(x$A׎ njS fS-L3 g JQETtl2P\,% {03 &@VuW.+jL7@AYXjӰ `Rej@Hhě'Ny袤R'e2l]^ycJAƹ4@y Cs='6~f|ҲE{/~_į~FgLL 7jTyٺ;>*w,ǮZ c@ q8`db}~6|t ² 9yp \o r~lǟ)HU`)y{qou8F:  =jl`sg`w/oRWyQ _e<$1cLqU򺁀jHM!ƿ]p@E[8^=\pisZn[XP` #XvXzk^#F]\x)/o__)2z~M͍3P\/%lj "ў_WМWSU<._.яĤ;l"p06;H &1w0[I%,/`T-^Or(`TM/y&BF< †vw7AB'@U5( h# F4(> |i/}Y%}0ݧ j=y\#&|IM&&.mΕuUrA& oe/2E|O>)q$V931H_˖+oIz1mnkB]rٳO﹧R3 3|5t ˪g{1xRh:T栁Du?|+Fm Po:,eA&fއSZwHsĎz>GkfsgՕ\z4kRg6UL|Me#]Ln9%&P}rk:$~h@#{Ft 6:[eK"is rW=uځ@P~~߯4+=GWl-+XeEK}:Wy r黁oiBkD!՚P`T·&{}-UXh60M.z&(2T\uUlfV `IXt 3:o ƦPc $ Zf /DaP84oJzQJҗd:TVVUs԰7` {Z7¡W2&TQrq> .!3y-9wԈ%'/Twau4Na8'@Wlaz_A }jHOh!KbOgZQ*ז,x 5tLgŕcnUk 5x>\+伺̬Gh8;Йln@3 qmBX'k3P슌CkP=Ix8WaUl>ԁQVޫd2I7u,zp Pк"CDd-_a qimUA:p޵9G 2UI0JV0'>zBMeZ[|^CkD\V0|k󓣁\hҁCKǡ}lY$&IȘ,'D1JR.}5 "ּf|`Bw AdqPêBѦxK`#}5! ; .{o񶭷j]"`Pyߗ_]D5ɵ TTb}ܹs+~0^xA ѯ_?~-­R} 6_Ӭ%+P]dm{kBDZ{8ƕqìQ#٦zQC(u۷EOB FM }{X&lː{f[Q;aeV ,D2BE:3V`WiK ?oY:OJ|Z@<WJ< PoIDC#as}XRb3P (ךjTKo@jS5 KE`:S1 <0q&z<8~l<]pHo5mz2iv99&;i+rPek ϒDFj޳.f)ƀ ^5bOIw,,-9y6BӢ[sOڪ& KKqjKlp7{xk 7(mMfh @ݘ q%),D{{8.2-J!8OUbgC%ffA-j YM(.vkM`z&@\pJ~/ȏh|[?!EȜzW̫&m]_}r%XT3"L UImۆ`0IGǛ(/c 4wj7 Y<w.m~zA1-Z$fЍ7"lcp'`9Y &lÿ'*5e(-A[U i^"l0 _qdL8{ZH&~u^4q~Ad&O:`$|MJdDj>wEE(4^@!*({ 7/CFH#@*z,}/)zu$>PSpT\i'`ƴV+ U!VRs^ ġ&>*(lp $}4 e([ ~ 3HTIW i)U?ӵBJ0fCi\IlV/Gٿ[ j|O@Aeq0Xf&EcU{wB%dBer\Dz Jdߡ` Չ*{?B\,:w̜~ QGuW3.=TxLVdDmH@-N^d.֋:pS-4!`YjW^>}-s㰑#zTaF(K=%*M(ek-7&<7f @@)j8/@#ng1vWh1ÇeZ&IFO6+c6Z>H5/Z?lݷub^7>ldG}Tt8;O:Il S9GClހ&qyNPuHf &Fv&~ƞZ᪫e&D&JBO9'fЩgwH[F%ᯇ4c!S{,a7=:!Pkbbڬ. (z2 LOžXzUSH>177E20l ~8qGwES"H f͊k w:WTM+׀4@&)Aây>5\ӟ%uj6"`GIXP#^qyѵd qڥoyDR"HUb:%jp.Dt..|?~϶z{dAץT`Pp =&C!.H"c9nQylgrƌݯZ/:/9n]DZ@aJ«@NmN7i *ghR@;$|&(Pyh#H{ >#..._x+snչW}7Ψh,3 fe謤֟8ƣQ \jYa [,D=mBnR5ȪK$XTx#,Ŕ˴Zefsc'\3jy&NhjeJy]/χZX35S܎)L"kv2VQʸ]Ӌ/ CS%_{ViCж7  ڴvEYs}1 D`'TO /[,vRsv@>AYN]c=g}? M1)>U] [.vQ ؆p6V} `֕eD|vTR/&zg}RMѴ{Wd3;0:&M뢁RT&aZ! PHsJ*݁:k \#~'/WLvb>s.|9&Ywg!z@=UUR׹pJUXb6\0J|Mzu8JSS+{s1"El?L,.|,δ=--7/KJ `k6ReB>5L&W'ÄU!&IkBOH n8FFJ׀Z3 LCi zLbYMğIWE,L?% ѹ6b \&@V gV$KeBQkPf[Bw$B?$4\ ۠8r56݉ޕeb>fΥ0[5_&+ B~>.k05 3 ԕSp-@ `;KFvp*[\\46Ỳx.z}zN L\HA]$ Cd@K'0 $C- ?@,_j^PG*3TEHȘBU@5a7,RB7GO4L@Km'e&`IfMu{'zcG&z-2AEٮQNg}Hlr]i-4RD8%0e@dQ]VG{BU*2ϟZ.'#<4xQsW8y7,(1a$(1Ը#0u 3sUxq ej‡Cz "`0ԥgb. _ձ]/$>_\]TJ1E_J{TSsS9M/U/ !~-U!_&ًMPA)u(Z/d N3$gbm ;pE#Sj]jz Hb#0QUȸHM22TϪv*8bZc{ b,@y`sH$KLe)l@,]Qh,zo*JYbğFf oظ!)R6S(<e& obL;p'e]:N YkNgX4?U) \&|݀"h,u.%%׈S8&-"@Zm=&b5~۪Y3-jdru 9uZ?Zr㢦mOB%3abp `T<Ijݰ0yWչ蘜D(e"|m]u­b@`\Ρ٨]ρ |MDHA %NSS͛8vM> {$.sܐ+5'\~txg{Jjc)s x2 G*g q+VoVS%m"**yU0H)M)Lk׊)S|?9$Mk 4L +e$ N$.AyKR$…b7V4 I:F%=0(Oܜ'2"OJPjGΣz3ft(fcaY0yM Jv;@r8&0su}[#I1]F~}yl|`4oT[@+@> T1.^FjUVLԯ-{J+-TTQ@2cҊ)P0w$`O(2 T5K<$`sY#Q>j*UsWEp_]Xy!Pπ9d6nUIIp^c5(3aq>5Q66[IPXڕd֩>a3ܛ,?&`2MC@<&@$XiGjQШVof0`lH@15a1Ũ,'';7P0u۔5NY`J0֭Sa#0] -0\r`H84F.z׻*8ŠM6 X鈵\L)[b@ -sI3p_p庰6sD-]ʐff5+ /M̀KTAM_"> 2]F^>K)CK4~A+68PL?j2N4K<*VkU}_KOBzc ~a֠s>Xt9 MM9•W5У.9uW+$ *eиqQNL$ lFϻJ?e99wnݹlk =U~5,5W/Aw1%hh{8l2I{oםJ s!R4E %ՈE~`;jL5YS WYp%|z\# d0@>gׅR:ڌV\:S3\Wݍ?+o]{m}oaf8LZd*kCB,^"rbs@@=S݆FkС}>Mj^萝E9>ZoelքtU+rKw|h̄r?LmtpޘPm0('XD%:hQfZ5j<=x(Æ=0gѢu~9{5l65ʩ?}BM{Eq~VM7x8ͥL)\1vGRKdodcM(E(nj4jHw'B# _P8ĭ@Ml19Fos.2IG3s s?FC\d !M}yq A҇h7&PH}GxZe^c8fKiaYڣs1q> !߇jZv?.`J)Tyv0bP0ҩG_3g/XpĨafBG\5GAA!kBoGnLE(. )̂Lh16s)S!C$Zu]k^|RmT|MF_!MͯUES90 ~JR5vlRs[}Nc+Y#;i% bJ<)}Ռ9'u+"F7A:0pe !e.D ~˯OL-9`zӮ=gS?{qC 6TL T|ʽIm3v~{yófM2Wdb'콷8OJtM;l,XW@J3cP?r'Fx2gBq V`#-.k6̉8{0/S81]C9j2ZX«E=g`W*ni$5~v70R@]@4o c?,hc<ˏX[RlhJ.=BR5yğ$3"> -;IOoûM8t'oZL`Z&p_=-ʩT ShvP K`f &bj*J0끵+] DÅ$T|_!AK;ġipg& (ܡ56`!>;`]j^{]OOUnSfJ'p̙f'7G墘4I <GK|W00MJ@ks.A%(3 QWB3T}]j6e(2 . ւS WĄP  Zhז<T!蒀<&qN& &0+_IKjζ]8NcIA1R`]bX3B'B2„P^I|Oj6ePbjNZkT9n[_̅&̄Nyh1my`k v,s EJ;LdJ k-a'I&llѱj=5Q`hKX;j<pN@7[.]*> `d0ﴓ^{~ꩉ"Uuck1j뭵?V٠hdB KH=G*1bS&ˑOu/?fT)"ƘmWWWf&oM"~O%:p)&?er1.@] bVsn`⊔zUqV'$fIp4qqKV.@xX}քzuNJюۅ:!]@l/~)k RM˷6c Zapb"~s ݦhfZ$.+D=;ʹKc]I6qHw}ϣ6ׇ ^MLkjE,7 bu2(1)"u: s1t Tp2p6Ur-lPS?P|]o!ʵ(;a&0 0Ct.hs0(Ǹ["0 IuRcXB)GP|mXېa:0C 5MB4nrf` [hC wZL`is^{M v%rD Buį ~~&CpR?K0]Q`b,T XR;wi3F4(:fy!W{)8f3|rp4ޝ=f3͘WkX8Km8 aS&U'ϸ]i8 m*KmZZM"LM2+.,Wi$~@&MrUo; }Jx[Q)H{PcɊ>9mH/Na'D©3smozΝ0ob 9Ԧkd>`uMf1  '$^R@ l9k)LCt7*h0v=cg 2`&gHR¸~HjH9T|Q#ҐK1!%d8lFSA6dپÇk1cn~'?'Jtߘ꫇>\k\Cm%cL-\?8Ko= 8 z,qe80QI6Дܟ53a·hCܨ0T/*"e1@cD2Haq@5&L,/MȢ o%#1HNܓf6džg!\Cp?]xC&-} U /*& r"̽5{F{T<~|R_ Li^ͫyٿ;iSEG1mΫ"ьf f/=t:jm7ڌf{//HqAlq3Q7jĈFhF3j@@7І 4թ2h3IENDB`bzflag-2.4.2+ds1/data/bzflag-32x32.xpm000066400000000000000000000111301200563112200171160ustar00rootroot00000000000000/* XPM */ static char *32x32[] = { /* columns rows colors chars-per-pixel */ "32 32 151 2", " c #400000", ". c #43080F", "X c #590B15", "o c #5B0B15", "O c #5D0B16", "+ c #600B17", "@ c #600C17", "# c #600C18", "$ c #670C18", "% c #670D19", "& c #680D19", "* c #710D1B", "= c #730D1A", "- c #720E1C", "; c #760E1C", ": c #770E1C", "> c #790E1C", ", c #7A0E1C", "< c #7B0F1D", "1 c #7C0F1D", "2 c #7D0E1D", "3 c #7D0F1E", "4 c #7E0F1E", "5 c #7F0F1E", "6 c #78101E", "7 c #7B101E", "8 c #7E101F", "9 c #820F1F", "0 c #830F1F", "q c #80101F", "w c #81101F", "e c #881020", "r c #891222", "t c #8A1121", "y c #8B1121", "u c #8E1122", "i c #8F1122", "p c #8F1222", "a c #901122", "s c #911122", "d c #901222", "f c #911223", "g c #921122", "h c #921222", "j c #921223", "k c #931223", "l c #911425", "z c #941223", "x c #951224", "c c #961224", "v c #971224", "b c #971325", "n c #981224", "m c #981324", "M c #991224", "N c #991225", "B c #9A1224", "V c #9A1324", "C c #9B1325", "Z c #9C1325", "A c #9E1225", "S c #9E1325", "D c #9F1225", "F c #9E1326", "G c #9F1326", "H c #9F1426", "J c #981728", "K c #A21326", "L c #A61427", "P c #A61428", "I c #A81428", "U c #A91428", "Y c #A91429", "T c #AD1328", "R c #AC1428", "E c #AD1428", "W c #AD152A", "Q c #AF152A", "! c #AC1D31", "~ c #B0152A", "^ c #B2152A", "/ c #B4162B", "( c #B6162B", ") c #B6162C", "_ c #B7162C", "` c #B8162B", "' c #B8162C", "] c #B9162C", "[ c #B9172D", "{ c #BA162C", "} c #BB162C", "| c #BB162D", " . c #BB172C", ".. c #BB172D", "X. c #BC162C", "o. c #BC162D", "O. c #BD172D", "+. c #BE172D", "@. c #BE172E", "#. c #B21E32", "$. c #B22336", "%. c #BA2337", "&. c #BE2539", "*. c #C0172E", "=. c #C1172E", "-. c #C2172E", ";. c #C5172F", ":. c #C3182E", ">. c #C3182F", ",. c #C6182F", "<. c #C7182F", "1. c #C71830", "2. c #C91830", "3. c #CA1830", "4. c #CB1830", "5. c #CC1830", "6. c #CD1931", "7. c #CE1931", "8. c #CF1831", "9. c #CF1931", "0. c #D01931", "q. c #D21932", "w. c #D31932", "e. c #D41932", "r. c #D51A32", "t. c #D51A33", "y. c #D61A33", "u. c #D71A33", "i. c #D81A34", "p. c #D91A34", "a. c #DB1A34", "s. c #DD1A34", "d. c #C2273C", "f. c #C52238", "g. c #C52339", "h. c #C1293D", "j. c #E01B35", "k. c #E01B36", "l. c #E21B36", "z. c #E41C37", "x. c #E61C37", "c. c #C72A40", "v. c #CB2C41", "b. c #DB2A42", "n. c #E12B43", "m. c #E12C44", "M. c #E02F47", "N. c #E22C45", "B. c #E42D46", "V. c #EA2F48", "C. c None", /* pixels */ "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.5 E T S L I S S V 6 C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.x p / ) -.-.o.....O...K C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "7 S ^ E 8 f t / ..o.-.-.<.8.8.8.3.K C.C.C.C.C.C.C.C.C.C.C.C.C.C.", ", B B ) w.O.x ^ ) ..O.:.<.3.8.8.m.%.! C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.B B B x K ..<.8.;.o.o.<.3.^ q 5 p g.m.m.c.&.C.C.C.C.C.C.C.C.C.", "C.x x B B B x x S ` q.8...E P ) :.O.x p t t #.b.V.v.h.$.C.C.C.C.", "C.$ z z x x x x x x z S p.l...t.w.w.q.q.q.p./ f p 7 J g.B.b.h.C.", "C.C.5 f f z z z z z z z S l.x.-.:.s.s.s.t.8.1.8...8 C.C.C.= f C.", "C.C.C.0 a a a f f z f f f p ..z.l.:.q.8.-.P P H & C.C.C.C.C.C.C.", "C.C.C.C.$ 0 f f a a a a f f p 3.y.Q P p - 5 S O C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.O 5 a a u a u u p B b o O . - C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.+ 5 f p p p p : O C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.o , 5 : C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.", "C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C." }; bzflag-2.4.2+ds1/data/bzflag-48x48.png000066400000000000000000000037611200563112200171270ustar00rootroot00000000000000PNG  IHDR00W pHYs  gAMA|Q cHRMz%u0`:o_FgIDAThZ[G9u]M"`D,>Q*ADA*&D!!xA}}шQ1aM4MIUMU9'nІff{9k,3niuik€mI$gി Jt{%>MS#E :sƌYB~F9g'*r~s_ӗ/J'ipEJh` fSՂԅvI =`d2l{פD^G ->CdՎ9sYvry48|}mq#???W8vcǎ9#}I|ج&N壠h4?p<>Ѩvdj59[&юڍɪʕvVǓǷ_5 5]t~^{,|U|._{xns^mS s'wM|w_#jҭ?-,fju:Nb neu;lNa355.ر9d2\μGޱRs9MV-_XW4\9b_+YDa6?oC^.@n~slMn3LG&|Oo/\m͎'w;[/o8 ʧ.݇Nΰ`hݵڣ]l-$khG/b٬[V\|N1[֠רKspGjyPi4}?1^z8g}veb?^W:Q4xZ6v\ֽj1W9Zaϗ ר~}~mHc-+zjsrgn:Ļ=c~jgM ktk.骂zh仯X_Tε>ӿn>kw~5%,~h~dTus<¬sǷtz16NV.[ ~=kU1S<0Fڬ+QTU\oJo#ΆwuCƜ7ӵ+Cσ!-;Ͷ\q_é@xc浩O]-Gu|]=? j|v;G%ڪh.C^ZMIaAAT)wUfu&j>q'>!i~Y7Ƃ{lCG;%x\_[qwD \PPXlvf68MFSOrfSʷ/8s ?)mDd9o_76?GF[lݘ z?*QQ=h}r$*|e}TX-'>oi1.whuW`Nzq~woD.gnOciivX_vz\ s8 Z|EEDcUqѿ 0f}3jP zG1AOHuK>R~BVV"}l{t/Dž`EcQegjo gB iyBN>kj6j2曵5oDvQ9dJsKK}>e;vWTőH_TR\.)OtkoרzZ/@}c$QU >[d_yMvRkHܑC&x"4$@7]^&? ?49=?3fvD*ˎ&瑳a3&a LF]FA)x||yKK#x:~fv9-) />ns]ϴ>טsē wYq{xøup}{͎e,?iē"Qf[g|1s-p>OT[X(uH;kӑ$l̲xnBxm6Md0JsIrsJ g;ۣO>ڀ}s5sׂ96,VE5l[z<K;~٩݈䚋zWm2nG]Mh8w* q;kň6vQ|}sN]g-[0<aS$D]ܑMxchw?ikɞEryd~_,`GC0FGO>9/sʅX&Vx^iͤ)=۱ڂOܛ}`s|qcLj-?k~ذng*^\sv.6ǁLb}r >r*ĴEDìtgj<k&õc,})w_UW6Si7p&r\LMJU*g'LxŤ8\?^ܡgѶƽK>Ku_兿ښ44X._F> +f,iu M'H/>kYm3`}+>G_o5I[[?yUC x"!o$;{7h5P[ q.\yGƊ'Z_LZ"&(| 򏥣MH~cM7r#3dxo;m k7W_NbSto^M}z-}K;`V΀ yK/k 5}2qW^.>SxE!PSqB>EN!7P"TUUbQǥѪ+@B-%J3 -ӌ0Hzdsnw(TRv9޶[%0.ߏWz~Cѥ>YHIlzx馯||V0NǔJ/ sg5]~"3dzbq\yJw?~"?sj+y"e(uԽ2+=_ck׳3ڸ_] 4}ɩ_js?kmMFoZ 'LUa|Pq >Ga4Vb˦תDqMq Ñ㔝 X*'><1LVQc~uj+Ypj80)QQA!˿?>t6L䎑+GZWyHh-~t^ʯVKZ`MօvÛap'P벁ȷ2 8/b5eՃcW#)DTyyy(#qV0TNKXݩ*xx5n}r}P5 Zq^5/tD8؞dU'V'? B/ED4Y+|P2Q~_ ~ w^<1V|]is GMD+~OuE$T[)5ӕLK3a4䶛7ƀۜ x#k-KinsOa/YcCj6\/o:m- DO#x'j[㏆W)V*y,&rg9Sp]vAKOU\T}~Lƃ7S>ꪢퟡlXo>v"_<_J޴{H !%H3d:Ket2_L's3!he\Ds^xA ^?]o@ 77mV묹ga9^SQ D|f1ӻrCt AtzJ§Z>JVu8$9%zG|c7+.[f8ݶ~M.m~+g}5hZ0 ^Go#֕tΰy^&޼_8T!+;6z''hvyp=Ə=cYʀn~e, ,TUP62Fk[).&Q飌@*QP|Ņ%y)^S{hʐl} S<|EMv9y~F]>vhV5[} jJqmhֽ@o K|6|9MۏN(lRϼL(QxCdͱn"p:L UAnnO-A@O 73Pn1GBG^B:DJ#B^xEWLzШ tFynz^t{K^uYpA;~"уgwp Jq}i}$5f9*.[ъ1%2Q>UO@ŷ>1 ٙgg'B"~9_X(/~yS,Hoh2˃vφTLq 2#aSph4(( =N<+ܼ[[抠)Y_yN.ժIO3cEUUYE TX_x&pMr]vתV.SoC:^8~@ΰjqֿ^]8qR<(d&=/ [,(+ \̍>ѲR~/N1:@-E]*^"Qf2]%nR|E#^]a}+ŁhneFX ^C#ЦaȚ|?}"nR[p~|ۙ*{xhrokw_s7_^p"q J\muIf[ /~n. Z}mMee Sjr@(}^w0wH2ْ tSeQ*&4HRk腹 GUGڞq;#Q;Hhs Hv$SҮ&/TLw^)/o eV#F'LT "~):hy!5 DϚES^cL޺_K J% !W%cP pZQa}HssԻ2m51'6`mNLtz5ۨuy8oh4~F=mAƩ2Alsk,w`N:^_- 90/,$j?aڈϖvыey5Jڰ`twx45[(fnf~Kne_>Q؞,5m W{uR{yW'[_Qa"] G$)IjC<#p׋87HHFC!K X835pk7 bD-V3vYͺ s=~o Qgc~bY$ ]7ziB aI9 {qdkp,?,hfmk~eDOV'}eLjېK/7*֕:LegS>18It^lFI Fr9PMHSz@DlfF ۴GFoQm/Oj"'"}zsU1CSkxmlDܳV3[ |ep)JF: ׄIͩn|suP![L)۔R`(٨t]'w,^][#{*lN"8 @O)@>{$gP ,&B?(?QrT"y Kƍ}wIJ60zzt7Mt9Kmk;]vV+!|'Oy_6|_0Ao/Vqe9ff(* kjQSFlZfdBX1VWVнqD(,g\[8(skJ/'oIGtEk7>ϩZlJ h=K4{G~fj䬍GTcI֏=r!Hr'} ¬XU4NAH4"y@+" ۍ!1}2(JhDu%)oo>ԪʰL8o\!\1nr޷]1}$"-C8D+j]궯]3~2u}W+Vf`IOfkи1h>GD9VHQWob!:fr;ǚtv h'^sb8 ?^O>sTCC=DI*wўb`l8o|&C'H YO`>m^< )F;kɾ (w~ezF$La0+x獖+Vy utCִYwn~0 Fr5@gR{ 3C-uԪCZ3Fs A11j7]K07. zyz'xCU%19D-9wfwJ.PV@褨iRp3CP[}T__W}4չ{LA1ƢF3Ƀ) *LLZ`Q0 9qBxFJ gJ_DP`mwz ? AώšCasc 0잷)fG_'kk>-㎀;y%H7,jC yi|`5Bl%y* -E!A2+K%H4dXXrT(ovh`tK?|pֿJX4Î]$bږ^~AI==An|0L6(n8&S:V 6]Uy ?D[$QD)EJ02OaCA?b'I?oSCd¢KmVrֺgMɾa!I0eڬ3wDS`\V boUs*I=}ROXn{y=j{qx9]*Nr$N`⼥8L,|-A(^b|+p0äR"`}ȉ@U׫θ"钧ߵh~M '"K-=%8(ǨS"?W{M;Z,?pAڽ籪g3WL>yϜ<.^ -&=(beYy)}<4clHN|OAΗ ܟ7pMse֣>:O7jB奱WL;ʿhe4D,Y~|s""½;~ZwoYO.f| Tղ,JvÛ`{X޶KhڃG?Fc_vm$ TTx F'K| O{mMkuWǣ$gףpN=?Iя}Ey_CwB NSI8+z5{0n(υ#u #xiDiiqXpJ٭{F3yUI[Y{zDzE|s\!Sϊ7oE14U}sNPYX1`|mD&xR~>mV'$6JEc` q~>CjMj - 8'8X*eN6KҬ0<$q1#ЧXT@MёjOZwFD 1TE"msF]gCMe>N#.VSu&4$\ig">}=jm!L}zK3/{VRMGBL6-ql3E'FK譻=.R&laI*auC\B@*"M2Pe<`^t֬v̷h_J}A<`Fi0Lb(m|WF=W,udQ :FhX'uoqM(h_^WlbU+J=Dd=lN 'O ɼ" G/$B!3 a$zfw3OL^7?i~׶'ͅ<].r'T1s]mVzMfunu ?%ۉ_7FiȌ >h%#[jʜ~ s%{u_]Q69[   ×1P +VES]_-sSȜ㇙WdVD!'g{^w>k,̋ YOn"?3! ~4ζ ` d!bHf}l÷*5dFgͲ&=6$ 3-ksfmX{i8XfaY\px2O?Gh T/sxRUxHmG"L2QV5&m,OU+Y?yv?y}4狳@@b\[[]rrIc8nzE)Ӏ7Ǎ0Zm DAI|h)yp4E9lL/ZgH+<0>OXShv8 Fcs=4@b6 % g}Ȟz0zb6'IvB8 FJC~+.i0(AZxX~B% ade̊rbӓkSU/1hA "=lQ\:_9SBMʠ ,Rf8 꾳ӦK.r;^/?H;Pjr[#,KBӮ`j?(-*Uf#|[.] G\QtIr u)֍،r~`q‚g{hjSi_r,ĝxP @;}{i}Y dqD,/Zc@4IIC~w6. X QPA6| JhH/Qfer.̷@$' ㍲P0C) $V_xnsJ;K η22uP}H ƞ(6QV'BpӈoY{UI0uagrmܹxk5k$` ߻| _IQ,>~ -[g1 a#2' bhelQY6eN~D4InE?&4=^+ %}:~ՂDw׵:z(C|7j\؜CW]_-&f3wg|PxǕxTʹҙL,f"&p$Ω br~Vb'_ jEUpگn=mu`Ӆ4sjKF5E`2cpVɂ& OX}H8ā lԩZTm]HU)o(lC do[P~8wf 2 pj5SKqaROoܹM")6~<]-:dA* ݆vbzjIs\@ iJ&B GҠԨlViޟ@kl9aTLHäJ I0,Gc?`j3w@rKĂOF|AQE1)Ɔ '%qMг[V(NH Sw$8i$=0)"V*OKʳxHHQ% JEEb9*}ݕesA¬[ʗ΅֒Fv ѸѿGg]oYk8vvOtZ;,"ф}q:>&DON[#}'*Yx^20\_|R%F-Gѝ_b1h\?ˠ"P(I\sG`@cCHpb4v-y]% -+HWVA[b>IR=hB#umHv `:_Dfg*5"6-*M/ Fl|p(bgw50r3'ۮK'ȮǢe(){n*QqIm,d3I)FK#eTƪ*pDn?Y !% 69v|r"vByZ+>>)+V) , (,Ȗ~}ԗ|B (pi^ ڃcK E#`Iw9^sei"X-*R8OH"'WJKˣrz,^L0G$Dƨ^(ֿVm:cd&R^'X`E¾g֓v,y>8AEӀHϏܹ̦;f|OǫNlfG0/ CXWK0 ;^D$q1PYj %2i*"ɧ IKgG\K9ҟYVe{MVMP6D"lI;M=T \7i~Mzv'î!#Z4a̋v9~TVԬMDu;7B$?_j>ENzffܼz[.2#m0Ie{2܉(.z8{6re-o 䅺 gB|kf;1-c#.-GNmYwUWUIZ|cd&[W.h Z<;kZ,X. : /4 5)ro3 }^{+}v8 K3sC{>EnHj<,˰'TL_"+4|A\($ l ѪLXy9]30|d0H͖Bє ]J F-o:c9.ñubNQ¦)die޷$d2YkC.6 ~*]쏼f'uaK eזA=K9vU|qַzl2Q^ rW)ZO:ICB c)!X?bE;ƾA&FpIɾEJ4a #s7 YDI9@%R='\2ZUEtL24&$2-ʕ=8NJCtGsC֫v>8)Ҡ0,sl3(͓DMI%Y^hfH3xC򶹵n͋;HaF w…@DTo!0JMt 4C`ʄ}Hl؝I!0L)4HrҠDzudžX-iaG.danݳF[ 4oXnI;soIHl<N2}FND^:Ͷ0-} ^S, Qh4P޼b69s?/#“msxAS< u>o-fƆ}gEnwZͦQ1͂!'?wG "BS$DOrWhUϴuLd"^\x]6 ]0`}ELb1y6OȳrLT-ANU-]-QH^v R-n 3`_X{جş޵q?^-…>߻0!>p##{Ikn ch?Tyv2MZR1-ӅJMҮ?e^Z+Mˌ>9GCFG^ kȝʒED}lTHBmRۡZ %9i1>XS0F!`D^i{(0Rݯ㞤kӜŶq)Ph 2L+IEFrk?ZxhfAЧMn~)M$1!% MK[r uNAf6YvAk3 es#~(xZEC>lg < Giq1_Rz>`uU N3 !>yCJ廯թiQ| n)7@YE]IRFSJDC,G(yL ߳{J8S ì0Z.9<X t[ 4Q +5y:4@zV Bh a" Y8yL?i:fAP00YPG8o !s&O'l}M1aX#aHo{c.ؚO,F?~x7XО/]_S~ꉭz ?i޻s6T#0:餫fZ$0!'?,1n,PsYHhRy҃#i|}/w@qiCuҥHrQ=1c,zwSDw{LIk6ldDFkLdJlwι=YF''B^)5H BjO6VWV2rPʂʠ'^2YL|4ȃ Ļ\.("A64cei$qSswWyoS˶}HFart v?NuyTuu5+HIW UH9AUrdVTtXQWAt0^- ؗy T|o$I#P xzy76tbgF~ċOuꕋ/TWW7I% =۴HzN Kރ6E兦Ŝؔ7 Jxi@[&&e;:[ uKhLETvT !(/7ēt(>`SSs{O+dJ.!Ԋ+l/txrCscVl˞jO8^[WE;EFUV᧓VsGݸnÍVdgjK H~suGYݗsP e6'KmlPQ_M[낷L2ScH;$N$K u*P`݅۝P܇ qɡSrUT"Zpp~+DoVp3oLɟ B/ܭңKuY%`-uۖzk oMP\u @q$5d&Aa݀;TcEd\y|0@{UݚsBM,h8\514H>TyXsLRD4TX{Jsܙy`w2u˻쒽n{ ABe9!QV%#嘞QDYeyR=Ļ40uMLGuCQvy\6?YGWHN+ NV|%lL,u֑0W!@M$` # ]秼o}غ܉K;QK֧6|+ Cgj3 lZM]1*-)+T(v @:4r!LeI1ELRGDޒ:aۮ//Q%H 2G᭚: Kd?sf~oor/4QNٽ{ ӭeOP#їإNL`RsAwFّt;] ؔgimc Y9JcH]b*@Y!Ti<0޳ۺTr 1?ȸ*(!ܞm yV]-i9{KSϜ+G-di.ڈjI23ر?ciy?\x'dʹpԹ 5dx`dS] _u^6>kvw@6GeG!![c#F'vV{1R~xD. //Vl64HWWf?xҩaeJeT[mq}:"_``YOPfȒ ʛ)QdL;}G(/?sXF`΋S9;.>nhǷ2S6{(v,ڄxlf 3>+oP\lqD|fҧO{:^ cEPm&Z8kW.9}&;kP=O|}Ԩ6@r\[.o}R(z] ńثS,-\k>1͹|,k9u~zg-'|0 `X !ƾx ~Z5g,AMMwoݼqXY-ha,OhR@r"|"[!f;Yޖ QePH'ԥ ^!0 57-[}qj=>s6ا ,X]051a0'mj^5fn!!v,u3⏮ ֻWY$n [n\xjw$Kjs" /"Af_1m$PtS,Tw;%5X?J,RQ"yim!ckԸ"z$d/Sw310~ty'qdW`2֬AAK#F'5޵q_ DRQoĒ^dc㌵2t<D4n޸~x`Bow;L*@)xM>7? 51_ XEbJ6UvuiLl:QQ2j"57G/Xpixӎ^DiTA֔U⥡ 2K={G٤(1zX:Yu&Qs-F5`o5uzB^~  ܍l2\!ɫ+-H &JNW2`mQ,hNC03gNz|We9k&!&s"b RJ*؛Ykb,,"v~^fׇ |_WfZk^YUG4Rxgc0 Lg=[ VQ:\~'3აuhdľZݝp dݳV3'*Co>何JEމ Io6Ps .]ٓ--TEC~] V%'Vu6N,hvl])W9 +Z\J+V _ &Tٝ4q'WZtO4e#CO bmvrJ~:nTz45032 q J%>9y*yG@ibnXv@Gd2&L|>yز{MT,|:?"5(oYbZʢ 4]if0z!)aMwU[uXBÑX4h޲(ӢJ΃- A$i;DvWT^Y4̀NA "#\s7S[]F XEtؓIENDB`bzflag-2.4.2+ds1/data/clouds.png000066400000000000000000000427601200563112200163600ustar00rootroot00000000000000PNG  IHDR{` pHYs  gAMA|Q cHRMz%u0`:o_FEfIDATx#, Sɼ|g[J#A ̶RnɟU*U%?0 @p)444tgr|׆mhh =;v*HCGk#0DF;̎60p{:漑67A4lqYE9q=0g7f`k}sPY8v<0<cG4s~x` /+[DH4iW3s|GfEJH~lDpŻsI;vi?&=8~?ohPܢ|TkoY dT?ļJUADFr-gJbTctJǘf`@<Oͷ8҇W@gXq{K^W<J8$\,&"iQ=RD"j,@GQa^Od*K z=w=s , Ōx ;8RpSXx5,- yz0 !CL{1u`Æ\W{q2O&jiNk 4BQD0Kc9ny#O3a<}bE=^5,k*n-P4a >&Qݿr^ `xg0u h j'r{EpS{:,->F"i)zLFGtTO6q'D|oQYƫ?@*T Hif{n@w4BZd#\yB^ Y=6V_GAxQїPsO½ FDep wT7 op#ߣK`_aA,,b}©MVoP,>ڶө& ۼ:8Wrձf?}xP/91sTC'oAÀJ8F)xDC Fec Bo3u;.f=ΫCCV]} 3"E3ٵM8zwީ4{#{1({^-#nEs{E8/?'03o14!g?"+?xı|惓~qna]fIdy3p; AK0=K!@=Bl~}w@m"!߱Nj JFT?G,qڼs_ JvH|ܹc0045 @ ?P?y)ŤDE`6B0o2w((I>ROu ۬QM@OQoE-sCwr#cD<ብ2쭼,i Z|\Z‹88 jn{v$Zp,`xj425 !B$ bkE]0h%XA|^% 7t%߀84͟A =Pc FQ4K\Y(iD! PJٗìJv*|Z̕bOevQܣRD&C.<'&pYQ ( g1K`o4Gt&Nf_ 1AOT0'7?~)%( $*c(xbXi4̨a!cÐ%*Ub, j0!R ET=C) "xeB򫜡fW ǯU 0dl Xr r=3\ 7|jp&*qf/\ODŽgz "`\hIx2_JS"~^ Gs^NXNu)&A|o*BٙjEf#هQ~99!WAE&JP& 8[dGon )nExU߭L-.w$/kni4vmap(%+Pnm2<M3MpD{!9$f hK(_t IɮMAu(6N?rozCgɹB1rШ?`th=՞,5!Pe[>rNjkw⎬/sqH+& X jq1}Kǵx/6B ze[d^9 kHm%NFU [+9Jm}!h/"jT[PFQq\J13i%(_'hd:y)t\qG*%";~d0 *nLo%5"{OViWHhxےu҈ 4@CpxXH=c8!e;jƉ @P;DԊKZ>ͪT\'䯶!L-Tܛ"S{#jt𤨃JA 8U&Wj8xN*,VG8` (Js }RH /ZQt>.f`!{?o?UHx =*wb6^THLKOl$4mF}0-pYbyH_̕FǬtsz9K>.ndPH?|=E]PY"1^"$J:ŕ8cr҆F=`MJC/b0Gs`aNQ䷋Br7GN<`*Ώ٪ XBY".yD)2(۪4ig>CUn9X9Mp`d+nP}\e$+ZIL!pFAA !6BY&ݒ,k.a9CPWyY.ZJs}u5 ]Ō0o)LX8sd-"On~,uz[@A3ә[O&shbע-qл{y/|@dV9E4c'X jXBBR/#RZG#^%^O~<X!MZ,MsXnt+[{K.#v!aQM="KgQKo'~V~GvT@{$eظ Ytzay+R+q%02ݱքF2=Zy wƸ(GR9`iAoeb[֌TPhu*w5d06UoQ|ןP{ngFF 9$LeLųft3VN!g+6g- 4n,]F̎zzM }? E'0G=>9-~ѢvTposJL+-)(IYym犌22^]!gR ~+ -2%g ./$y+PBZJM"u5 X̞_^ETpy&oJIɷF"RXD=5O߼rF J74pYe"!\)sņś~y "w']yH4'6Bd.,+iԢYV1ScL FJ-} ~dÀc?]m@`b.5G,y;kO4&Μ,A/VscT^c #Ԓ, ٙc4{^Zܶh&(僷#mܦ*tPy Ӧd~( (i۪o)gG\}YĎ^JawrPª-# c4e [==h'9*}$7}]*|4(oj%n5D̘~=t̵g^x`U&yfAF*& vJX{oux!QjpZ(Vj` f+b-zGb?f~r\{7ev%\!#ݲ|bPv/X-B,a$J)D̠جe [>IC_|5UCdanمduf~|J ꢈ3wQn,"&H& 7N ;tHDiRR`U=H\:cvAc{oQDHEټXEK|04ŤNt4Q³/5pUepNmQz~4cՍ1rܥn,_Շ5K_H[JMu)r !=`MRɘIB`sK|m'H)e7 $LYY}uOl4.n0}|Ԓl@΅xn>vǯzpBY!u}v`}FTs/N݁5Dk7dֿ !% )v6번U-yh!ՑIsOy͕~J-^BPv @wUQJxyzV/Ր^ GH^XH@o1dTtg9n~6y:w4O?5gQ6GP݂ {Slǝ&7G*6 Q* Ѳ;g*<* iXvB{p ::ޚ 05.df1շ*襺(o'vgp#R~ltOZ'IZeE=^a6X2= HGym11fbQIV{y?C^ps Lfй/`aכC۫œKvC)"x-Kb4]m aGVFCC;i_%JPܼaz#W6t(^|!j)C4XyyÎ wENRwXPBϳJ 4}-ZNӔ,xH,OI^D3{qODڢ亂dʢ"\DP]Trdp+A! 6($J5E] 6,{ u Q鄏gSA@>"BHc%kg&'goU}Va 0F^@LSC<֧mEco)͝$o%yzq(:yak{÷2;8A[*0! L?wk@p N .]M79wE I}v[tUW~ThrīI>¹och~L̄JqGc.0^U)pQG[))꿯`&lߍ j 6\`Qn:U P )NN;XA3U[Q[؜҇74"qNxD]6qxfK1 Dk\4j$˺7_nI(l^ѤTFXܲڪ)wNvQ;d'@ !2FsF"u|@j7:7gR!l'tx,ZgP&q" BݏR˒wmQ"YTm]@n,g|G;eUmFXFeRCST=GlC /FJ~(E^eTwm"BBfi $5R* rÆoMP&[ddl\6`v8U>ȄL^[Dqk PMD(VӱTk)og9d ۂV$]F[+7 `Z-IYyv.*=x;F2$f;֣ϕ|s#J`-b1)9~g|7!`n7u>BB"cC(Zmie\F E(:|\{:"lE`}k@1Fzl*Y\7b$Om+)s 7 lV6I!=w{|PߢSX'eO*9ñg_5b \;I}G/9!sݨzJ3C/R%x6Fq$S7%})6 9\DdEZwA7Ѓ:0;~} 쯖ҳWwϳsg2mM# rP[B;BzW=/,SPџ!:Cê^pȒ"2Sf==w}8zfuh,[4@2?ZF,< %Hv{|H\"w3 8~ϥ=TPڝ:O?6dqu7O4zZf |!t,\,e9P r:ZN#>]Y6NX𩖖дRক@F{TZ|-S{B:~G1fjo䴀orɷ~n+m4XXhrۂ٢,HMLٟKNkbr2k=b$?)!ݮVNj$njh'Br^I//csWƉcBg㿺m2y=&z("Zsz++ΏIB6`ǽLG{܃h4[+uN-ԅ: k{[/@%5>pUANWuO S5!5S qZ{*],o살|}yHmdc=,.eQ5"ͱ<  | A4-wGlq+X(Y"Zz,AOO}l ˚SB= JJ@Ϛ%i`l'7&}c"ޜ}s/"`#R 9E6nxź2@%lvvR$ck$+Q4߅W|S, nR "״_99@ F%C0 B #$漠n"5+:O؆o 4%^R e>`ܷg'pVå-)ROIx<R"_iV B9ȩL_ڱ$Z+ 4pdqy'߰yЩr5J,"  V<sWr[׷`(59:3z#[Wαέ_#&` K }ؒƯfOH.auk"CR|}Hnx /NmeR1CǢU1'RPw[k v A7o?5)@ `g٨ʅτӶvWr RL&fzH xOnHv%X^ʗ~Fȯ XLXwJ[#Yf n4WBE H'{ְћ_ 5̶PKMO+<@iEjiˬi)`XGj-+#گ(ʭe@#ugb/KEMyO0ȱy;eD-w&x5| ΥؐT\5;z?׭ql?}6:8(A}~'H\EP';Ɓ. +@D4A! b(@Kne9Z!RYRN)5Ȗ) uL{!~85JFhcK^ [-FL{*6z?O24[?Ѐ drm$Jέuh;x{"}iqU@1`&'T+ [: VC\M3hTTSL@bRJg%rڷhe%~<|W`C%_puSCPRƲ-Db k^JyI;`CNuTa OZ0B4^r( h)ѿh7T,>gb W3\#A=>"h QޓsXl1qzV'g5BY(s0y5*" JC) *y ͧv&h;53yĻ5w@ܽhV"~\,ifG:-J@PR ;N]5(e5827F<low޻vBk 8|!YR߀i:'{j VżOl^$H TNK˘PE.6iqC$6X̷n ]KL`dž=;SkQΕf&Jg\9RmIt=cY( V:/؝[9wG'z<3E[rou_V8^]蟃#5an+-dH#>CN2/TRW%s4݁{~ҪESzXiIFY:}`T%,[o+WD)"#i 0zÆcLK[$6MSdž'F?cd.OvA~Nޱ4z$d 1/D=`(f;q,Į~CRJbU}l/G0ZCx/ KlkKygK JNmAZ6lnx[㗠 8[HҶ83dC4aS^d.ApC5/D'"B(t8^#:A%\̊a-"DsXDUf1٢7.Su¿tN/^ (7+=V:X}IP{FjKBSjh$9r gz`1;qQH .E4GY>bZm?Jl1}nM]sA[ȵEcR|,3Rpغ}'UjNQVJ g :VR?zSM|e.S{,&i"0CHB8A4OxlE?̅4]vax8ψmQO{]Pd(m4t(nNlX "ё\_O&)QW:?7IB]UJ=R u -q+LOi ^?9u=ԑwÂJU}4 #䮚Tg*g ZX$UJ>\]㖋yz i$VN]sX$JPe]ߞNv*]ÿۈJ;+plVR$=-r徘T=h|x^I9!0"FFO &=-+lEq.=XA<&ABms:L8vrh҆`NzɹwԋvB$Sᚧ{ ȯ69 h Vh<<(C⛃+tS`NXvԶ`zDM5Z3)V$nٴM^;e2} HîP%R_c!TZDk٢'OuQ;M͵9B&9V,,fF4Are d?=f4FkAqC^EJ(4  &h(L}-TVfn &K՝\> IfMypjm*q|U"0pLNހ(GpzRQn!X"u}UKG%hMPRXJLVM@e*uaQUCFmñEK- ~SdI"K_r[N5PӜniwyR"O iIb3У훙B[]XfPJ]t Ȱ4+%UVD1>lըmJs65Q$fƖjCgT@ʕs.x{.ĢOڢ}FJp$d1z݃O`ukRh3DOe" dyT$.Q6--9:&(<^ mn1e[ֹ b)g)uJ+$LáJ I|tY}[i- -˚h;D3v 8Ztsh-%8D$7c[- sL˟O zO Zg'2"ahTYMtV 2Eh Kew@ 7A-:śB-b 8j/h_sry@bBu 0:ht .y/-l7S-,VDQ54M:~J<|.R?՜B"][$<ϠHҐȑl`0.(wJ\jK%c2[4Z媋PW<DVkp5o\Oϝ\YGvCp T45r8;mmNTl@,4B+=ݰSPR,cj6v)Ҁδ\)cFG[>=XKѾyֵ {awx(uSE)D85FV?<J [R+xe{,:u:mX! +4˪aeY^҉=Rdl%M t;gЯ~c+**UsSK ;#ZCͥ@ a%dr)~ ?=bNUģ@Bg+(FSGO%[TO.F:r e{i-颇} mÆdFbZ=:zd@Fwd"$s*/Nͭ(^1Y>SR]]3e /3 AJ M&U-jE`&{7" "(ETiJ]t|xf|m)kd0ÿw!-AϢQHPgX4%WNGrJ 28\\HeHITؼmV``;|V2BuP '%SiӠȼmMfpɗyXT5w?DF]S龍tjG4)5<̡Q7UZn"L8I/Fm eE ~]c+*~i{`Ѥʱ<:W Oį@i}hհ6XjAjlrg`a' _£,b kK0Ka,,%tJY5f|cQB@%``-N{,MLS '^<ޥGl-D4 5 R]5VF,i8XiNޣ&^qAаdQ(m>5ZQtYNR.u1BܤlgDіx:%)KU֤o%7IAk۪o J;ffAA *E~`q `VwoB;Ȇ4Ts#| F{ UBp#FO#GDb\D|K(5%~usx+hw4qC07A\r (LƺS&RUYl@HwڼoJ&lJ(o״āt?xPw PlPy.Ź(!L^R@AisPУ K:\<%uN~'7% a g7|0' ?syNcYCB{ȉi,6R[,VޢL#sKlJ?evNa ݬ_Nh>w TGh $&\{]R:ǵ߄Kl>&ݎ!+)< ĩx9be"s x}\Ӓ‹ Т+j|IHaǙhӧv*NRBj){VWt;Z}"sjgAD]l'%iӟ'BRy<jwM5Z;x&]ۗj#T!Ʋ@'x6[Vz1Pb6Wi+rd>I5bg _!mY5i(  -ܠJyfdZVYϙ~ 9)Xk/x ʾHQo~uho2)y,'#(b-D )]8-1,"R#'W}:jJ] H^A6(6BIZVy; jY]i=#,]M0,Ti@`&K$ä&5dkΟ^k_}HjL IqGv39!jR 輧Hw ^ ߱K %;.bj\i)[R[)P Beպ&' ;U,W`Rjv3J{ey8?$ <]ëŧQ2 +XEi`Hȹ .{IBQES{!][:./7K} 0B>zOry v#厞=#↧~(۰n u)f (TBPN6"s <6 Q1l@9h!ʨG|xp'ί]oЂz7 FE¹Q5+Z7Sw?=Ƙyr5gzý-SB|Jy*4RkKO ZY>J%_gno)% FJP٢[If+A_E $ 8{jIENDB`bzflag-2.4.2+ds1/data/dusty_flare.png000066400000000000000000000600121200563112200173760ustar00rootroot00000000000000PNG  IHDR}j2k pHYs  gAMA|Q cHRMz%u0`:o_F_IDATxb?( F`dM#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#`v(aX_(+"D tyX|x:@006Ɛq}|]9ymFUU.1M}_p胙K֚y}q|^K,º1/ZM$qٺ7s|9ݤYDCjdhۖflAD!C'gԝ'pd&%肈PZ~ aGQXSkMwq(-\G>y_k]'>> O<0ϹN '6w.Rs!_`s&uxaq}̑}cu/V! \QKb';"D%$ZRq <!P]l$Hu}AB1F{uml2i$aɆm8ʆ8_cQ{,eYrҘhV-:]]9x[?ƀ Է@QѶ-h `8 ( ޜC5UUetР7sǥף:⩜ĺG~QI n2#Z$`%rs|9\_e#c)ƬshLKW ^uP Ņ/N^4A -w~+Upi4cZz4TN`ߥ%g)iz\:~yio;W2 b!y& `(ohpn^XTec]$pY=򈪞9GEi~>X*(Eiʊ6J`4js{xYm*mL}Ms UX#7jc ݏr k9(㓹Q:jY*}AMk 幽%+e`1@Y^PH̬:g8*tE_HTD>;H^)\QL =DkIvGK@rEl@ʋDxJ VZA(bs{ SsNA51 ?0!t}9Zk-v߹ƁȎbw/d6jY_Zub:/nǝĘLQ0 P߽uiH$m]KQQIG`Ga8YWI@QKVAE"nkq{ w;A 3sCOix5YVä?󌰷97ŝ#I IzQ rbk5/cNpYLNO 99{K(Z.`1'CI2\PJ>3bEZH"q0~x\][*)Ɖ;^X(%2Owpu;7K)t&Wlid7@_0*[pjOPO qz'1sAb`$ t@ پO /n@6LQAN⇊e(?JzRA(RvF[|ܣpNOIʃov%s\7.JV)PW7w$XBW͏8&*î#6>x撚+rG>!'%n&c;w7wI qA%>7[E(`r ajɥȮ৕GrmT@MqETTޜDυhZ3Olg5r0۾׿L9}dI?᳐3D' O(ʒcT_Y8۾RK2iRiJ1+|oRdH!ɩo8VK=̳iC%G?+v Ptz7XL锂m0'̐q| ((ЧD;кN8^*8yU(zܼ{gԙVIÞz 9+giOEk3wGwYtqNoMnnq]9yi4q|C}1*}mON7 6Pt ݦ:P.rWﳔ^o>2s^%ؤuk_8rfp8ɰﳎL+ %H3$cQŐQ:Nln)'rLWEGk,ݣ$wV 00e 8u%NQ턦Ν?)h\UhӮ84,f׀ʇ$Ў1h#ltզ1qZeN^hAŔ̺G.lW5KӉCdmt>]:~ed_ăM;Yb\3n9=3$|dA⏌? '* ǰ'I;aaz۾T4(H;0v8{w&']$)l9w7 Q#AswiC{_hGgmSEõe x>${[>tS&߃&ow/h[_ ?ǥ=d @ 0UO %l_|W. Yg9JzTC`xkV1+ȗ!No;vYyØedYÅLY8>J7`p ;PlEvwZ/'P}`:<251G`({7[Hv:6lq-x|#*HiETvOʶxY3KYxb E,Xc1o׺dx~.Z;7'= ;dK/рbmVn Ep83v=@C+g膻7eT_rԭY*A +R9JHDS~Q/H\xKH"/wWgP̝ψxǠV JAgel_eu<Jk;PAhuxa6MH"؄O{8Sygȭ$DS[ > {'MFkGX0JSRoIVI{Cݰ9G)i2yH`K{HGX ܤ\9%:! rdy>e'bs`.ZaJ% Yu_HfTȪp֞w ywp0pT0 PnEҎJqcJo@SꂂQUhP8GkJ"m.(A\J42$."~ mG{俓qh p*-Iil0{.zPlsY\瓒׾ $3J_-@U2YR4ҝӎ&{\M@5虯0,web%d t@L]?4a}E*H@HlŎw78{`s<8xu*5 /"P$KjMha{ E6[(NAX.j=KD{q~A ,!kOC|_wdYۨs Q7b"\{s?/?M>4'$-CE˵ :%WaH }0.<P#M™o6ү~ ;g6k+WF͝h0{_ɪsv/t_!_f""3XkAqx#a.JD") ]LQ0 P41&!Ri@Kb;S35}S Ť3O&uJQ3?,$sg DK=7ǃ]9ۓ@FRwY7. ƇH'^@غϱx2TjYb$6Y%GO$i9;ݾ;\sS~+P5,ǒěU$aa&}U@Et*ߌd㿱IJR_%a(jQi F ډPfȝ9{gr[J!. amy̎eSTg ^51#܈fp.uT b:Ekpht2}"^vbĖ,ߪFFZG<iEZ{3wm}9r; .|MNub,jRnq 3[' zΉsLb. <ʰ wpTO71& 00 i9l*G .(Mq@C{JL2 yVgn-fzG$na)kO S>Se 2P[h=b`g̸{+Ѳ*+V*4wi!xw@=6&~E[L*WKi#"ϟ*UOEG x?LlWԷO௒T sMO  @) z :eQgO}+t3S9b3sFQ 16zSAѷH2&Xghqy 4\\bz%kJ,|+FLn@O j%h{jfR0Pb?YUl! Qzne28M126\|$Rd Ů*Mz_IuI| 0sa )]IMUE-7!Xڝ\<]ܩsџYT@cȱsU`8'H0M햳s/hDJ'4jUȯu#ACέ}CwRJ R#P!t2Eu(u5/ ߿A6 t ;1E°̈́;f !ôExEI6ZƱjYG4ǙAL I)56Kf;yf|PVm$'&V 0mo+1@}G 0 }[d'X:>q7ƨUReb6*mc6h&5d 3eQ`m5`oQOAA D/3YK1#6wjn^ʹH; 0RMwl Z+qH[@]6>DWK_|#6<*z/^rSY:iFEQ@^Wo9-8 P9b/DUC>/3 z>qY# Ľ @5T=l#@YM5u&m;tͭ/Z2wq-FSg8ʅOm(ohIfO٭尕2xиp+KX 5&8Q(1Ќq/ǩv?4RFDhZH}ɆxKxHFCvSR]V#j m [J8ƝX:Õ$O4wC)$+ w CB&`To9 !d ڞ1p60d=.O=܂jLD%T/8%3 yhJOK/f942 yV = =XKpV[)YH1ov*1nvaUy=rC}RJ,fFb KidLLT<4*c4@("kzsH%"=5R#9miR!ڹ4MBRy(@3w:_()Q1 jk:~F 4vƘtKsQd ˎifR$yO VAN?WmA00TPY h>/ʙ,["h {H!ȳv.@\ }MW&p3:4T/ض$T)k.mRŢ>Md͚}͝UK?`@Efu/:\~C5RR^Goe_Q*D6J;ɆICvlz jу/' `) 7[m-{jVVZeyN 9^/wR,j༁{>y$GuF;6rR"L# 2VT j]z.<7/PK6d;E]L4vmKSj נ6P^HtT$25ǪqDgyC㟯G4sp0~b'Tte>d*`,ɖ2 ]m8-[X||j9\ͳ*a\0i40 `q;06C JM]?*=¨eK.=#=)vTD llׄݣj{׷ ޘk⦚bUeOlE_CpڡS$J[8g>Ű C;b7UfE KoDAdy@ޙT),j$eAԞn9uXF&`O)5݊&gr Gj>Wj& _fx,_(DJ_&ma((ł/x|mf璮C.US UlԦb)m^ ;L1<=Ed2Iݪpҫ?r%Xw"r-&9jl7ëf|;UmTdB.揎_iS%7K$֍h]zO> 6)0w)Il]*JB4DE%ƎqA5D>v3zLnWaL7Ѳ.;Az@B?g`0f+7 tiwgg~n.c̿%4|*?R)2c{'9X+@ʰ0 $v*x}ԍ~2 UAfo;Va@vB2Y^EV\#F!\mm!Hnp˻/Ⴔ 3se~J43pg1| qC57to^jg%F=Y@&^JpH7lQ ߔR'粂0Cэ`_hA~.rE)yO9v=g&܄wĢ2ّ_;!7OzG7]>!KCnG9lX3&t -V$]7yE 6-OGX- yfj̓n-2U}WV41-FhnRc4,Y62Fo]Tw^xc9q T1撾^zu Fx Z"gEo/?x88A*So۲M6$3UQ^mI`'SU;:QAT5:x-WʕݮiĦA@ W҇`ͼ:ưo գv#XSDG<sLkyVo[\,듽鵾?a 7(iQA|_H/um":/2A-CNm$f:Ǎ|ru`@d̊5~=FșjsX? έEش'v~;ZP1p^S5x>jZyOcW* dНP#X*F_8^ J\CZ'K0_@K_#+߫CmiSdFllrdJK1_`a 誂XRs1',(LI&yI4ȣwd#ebMLHW­:sA ;Z9.Jx><" *&@^?^j{νvd(}k'Y!A-Dq>5Y"C4I('6%*?"r Hv'kT7uRr%UN`DݵўY5oX?{:SH2uZ$.Hr-kC ĝ A=rA= 59dvzz PHb6 &P";t"(bw7?$jBW-RcT#&׀|><W2[¿3{߬jw`܂8b<:x3nohc}sp%]W`Q6}ekB@Bl"znA)*Z w8 C}.nS I'jM; + g]s7=#pv2OG&i$bcEVT+ w D!0+ܔ{^G q;slec;%ILX yv(3P͒ᇄ K~{zH N]dYF6vJC1ծ*8 2QMS/4t .op@(l&hM2*$QX2-?׭w/JSn4x=Ҳ\?2(:wGiVGXReVRS5UC*z kZN${WA (*l : > Ԃ#u")&VG>Faou^8XѨM}AZ$<Kgu]7X3qsmy6QRŢ^6Y'x$td~ jY\0-LuotM^5YBcܨ[;$:J*h8EP{zwT 7uf5Mޑ5mQg8 n A.Uâua N4PYϺRU/WaSI_9$j h4^XF4>fR@k|`D ~, XiC԰ ++ؾ*/#^za7YoG2̩loD~F9/dzf=M7@Sl'8)|U>Q[yl,|s(yU+=Xy;p%pV 4TB/caD"JƀJ%.?Фqb;D.! gsڨnQ-oPG{ka M>2ɽ`SL nعѰu`y|TnZ.a1p[Z3%G3m/S/(ye\gN(ƯA/iڬ!|#zd.R?,z\{M~žKF%=U! vtvQt\/9vDrsׂ%Ž2w{Hqpo%Ƭ U"l/y5 t Oa#[ЭC@:k7ɔZeD5B UmkdFYLN8ؼ9sl8HA TJ 8T+O;XAHO~e"xd8bi7;;3٘ #2婺2l߫[07@<>Q ro-q~wZS>vW;aɓWZrC35,=yPO 3>=nGUk.Bg["r7 9pkIQp!J79|᫝Ds65k s<X,yyQgvQЫNh{ E" )MmCӹRe7"עѫ| Nr8G{<жƦmqfk6'U, qic[ڼwf˳1}cj"~_}E0t+5 hT22[W|~U, œ Ea[@a e/5>RT,CſKW"˲F\Bf"Mh$BHxp Uu%v |!sDD]43 ݬ @FEAQ,H衴x1_J[fLv. F=ycVP9Aߔ?D)!l)rz!`O JEpgu!ΰ$R@M {j+˴=y^fa eȶ&?>YzURFlx  uKO?ʭ?TFCH Y j._ݸb.5}٬]:- הtuFI9wLF !#~]ŋ=e2y|sAhB($yDbh XxzL.3s &7 0QTqv0ޝX'"]F9H4"zwIJ\%N!ؗ@xۼ"1&ɝ0q\s ۘ<;:ȟm ^=!ND%JAD.|3ZQ$ZC!HeJUZC`t9:KC90C:nOݬ{>eyGhhZPtJtna}Hyw å]oXVRXNJ*f2s w]t~"m҉EɈ-1(R_v86asIGH} ;G:޾t+@@آTDN=89B6m6aHתa$9\f 9F-9)`f )i[:^ ַ9 Tϊ\O8Vǐ+$G05#4rd"|*^:TF@?z˩* ;&N7@ ڻ!ށ0Z N _z׳e :S׷v{Nw}( Y'es8a{^%5$}_/q|{x)'Mw Dx'DyEЪ0wBh>;ޙ_j&\o\No8`;'NlZ> jE=`ߔ9{ 8-#L׃#_bHG Io*:׺!.90*K~NOҘB#(MM?%5ASHs#PoFWfW=)-<` kTяCq5zBțspCx˃l66Z'RFsw.6<@`x2gjLC'Mw0 TH tA|M 貶JS_g9ЎGsWQƋm>n(e[ӢQw N"\)6BNwHM dGTDc%@8BP `!dڑ*!6qh90wb 3;Q{V2Gdڮ6[cJ{1xYcih{Ux  "ibg|bfON&RIk%OR~\wKWA(e9p79q fG|=QEk`r+#*Uk4o](ړIɸ$TU#G5J`\VD[d:i pua>G {)>EPF 84pT#h$s0:;N:й16uS3ŝ@Jug2!.!Q~i/yγ!l^y3F]ݟL;@ PE"B(hM R/#*]{<u"X2u'>k :Hg}q<$uUWg.)4ҞE$rhbnBh#O[O!fc?: w}TVjqOFɡRЂ_#]n)TfX6 &x}yd}X'*!#"uWqqvI 7S;kd=M·rKU%1<e7sXHHACoF DHGO=c?ry#JRĽ.81j:i2JQ'SU/ ٵ'!($R+LPo @)#C9ZÎDLv s=T 7W (~W3E \dM43Ps]]+|gg p^1wnyb5"Bּ*yqDxĢ1kF&~4H6;:7zscӲ klUئ(Ch铔Y|LM㹩ꔂ<DKJY~p듮 15S*ᢝN(Axo`':Lf3C{5UfaHxVs"v-q.Z_Xa (`FcoƀF0MnfvnSjh ?&54`)w챡SkXKK7Jm!;cA&~u͞ʔJٔ!Ъ2ƀ%x2kndLf߲"nX!2h[t;Z!$Q; oH] WbsrbSHXZQ&Q !,RC[i߹ nN!8${1D 緶7*O=snR /)T(.KO|aܪI=}~JrZV I:6Iqg\0KdSJpjUy ȟ2dC&3W E yJ$Qѳ37;G_Ke2O--տ5nhJ>8%xS/ -Y†IbS<6Z~BRF)Pvpڶ9VVˎ@{ʽKSOt`ک]|3A,u/'SJӛLb߁cnĘٟLjB1`MA[M۾7m (BV9'oft{ӧ:8pF"w~̹}&ֳa ]rʼM!J4GE$"WG27Pe3iL8kW1d/út}p9P\s{Z" ^=C .0p@ ,\GQՏf}lp=QܜKCI`>8uި wA\!xڷ[M]T>篅/!C7%Ŗ0u/9AMpK`>v*EₕQa :xt}5Irw2KpB%QfEAJv1"/Ad@ yzªEMמ5@w+RQIǖA3+~9h::|w / $aTy4C Z3-N١s(]ȝ3 U ߣMTL 4" p&H\Lo)o|h-r@)y&\gmg.vZɔ`Qj{ @ս A p[ёѬ\,q磌_3Օ7Ѥ16NXT,HQE 61ɘVA2nT["PD2+T! OG6/Mw@&(s1_Y#,NLud+:l&Hl?gիnsJv=71Σ}.L:bbV9Dݛ ay= ~~oKy;&t 0dlێxl5T<ǗD^r 4*&@2a&b!j$]V-L3OE(!uG^$) ^6"#{åZJ*mʣIM7:Fs~lU6σ;AX D*@Jgץı}w7b R.+A Qz4_=s(-.kjG.zxST3ݫ6] 3Fe}xS3N+mG+k?MWJoPw@_&a 0+(BЕ‹R(L;M2Izu aBڋq.8f0RI1g+J?KMh;5\g ӸAk+bf_$ emL f"Xݵ#<c*wP¶0;{Ȧ&=;q, ,Mz)ոm d8WFw9Nj7T*uB?-ƚ/)APoh>sG3Lݱ0 P"1!+ml3 RRH>9JW c%twCGnY q:n{VRS:;1#,ЙI(Ŧ)g{F׃GA,GO:-Y~(b%o< <$ W_nX;B ܶjSC;\HfxX eIad|fdkmibn7Q/?-CoanRfOض&ik!lHG>Lݽ0 `!1 u_ (,ET>[34bpX dHm}ן(@yҝD(JD~rլMZ4 Kv=(3J^\LdR*9DaذdcGUcwףsLj Kr g}t=Kh«=KlmMmA1Spz>BLYv"'*sOz019 ڟmQ  Pt< H \v!^@7bKW7ٴL If^sVrXIZ$vqZ)A^:A@{@Z|I2@oqOn){`^.zb~zy@oC<g!=>رʹ)qƃV8҇P>z*`h]|$I?=A M;kWɈU ]~`qa]3wto?2hj>,-Kԡx&D@ O=H㫻oT2NT+gERw"}Hv6iȟdGi2>yA[OpeM1K^uSޒl+2~`T5{hW=R{ VCȑ: #H;[M% LP)Ow! P={jC*qRxZO:2M$30te@|6&HwD~@)ab.ako|q]4:L ŭ96}:PZ6ZD$Hu_ߧOǟ@<3|5~ nNa07ċyOBB#I!5?\ p)F GYle!tr[#pTptzF`D˄^s^5 KG_KïwۜS8q Pc&߳Wtr=9WS;a(+9R@*)F^`xa(+'C[P<˴WUno{T+5{>uek صΰ:ٞ:j'aw CgOGѾ2oFmQ\t2蔿^ ~ A Z)^Ɨp@",Om޴]ak ÎQ9570UD:CVg^pڞYֻskԋ_u'70'Y, H⊏8dl\os2+]U{9.ش:R#hUݹ*P=3f4fr aD+ki;# &WNG!6 N*+`N _}0qjMlkNleu 0 WwIENDB`bzflag-2.4.2+ds1/data/explode1.png000066400000000000000000006231401200563112200166050ustar00rootroot00000000000000PNG  IHDRx pHYs  gAMA|Q cHRMz%u0`:o_F%IDATx?چl5/'F`Q0 F(y F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( U0DdMLAO? ^z{ &Q$[<&ٝݷo6uo`WJAA3Ck@#erJڛlX#XdֈNk'CH1A)FGJic#OL^1jSƼ6?X9y&ԛKJ_!VnE]3S}Ny_l^!dy} )~{= '6'cwGV6_ Ə O`| ^Ewc/03&B3] R90# \!8xB*d3!@П$x36h%Np\2ǒ4&1+0#=pC= k&P)X8?{~̃;V䋭1X8p-^T~=rRQ^c69@nQ@0qa#wѽʅDQ.`"fC3t~{oS |Ou})Q?35;c̥fD'kC"C%D Λ7y 22ye'{F+8u3LOw֙mpӇxFy* B1{cWu6ަr; ?-U̅]-SD;>gm9@pYHm xJ[Z&Ko2; `?:#F8HUz<4/{Acںjb+\qUm=2_OB9`_664VZxJy~Y^;#3SeKzs@= (2f3>k-)0I;# ^? 0+~{mխ UȔҤKܞ:ުsA‡h):&E5\@s1~^ {BX]s`mIH|ZI8G3w0` _ˠyPTguc6'R"NkrD'@ hlW !yO0{jZ{)lnGN8+`ۓ3F{b@8+8oq@?HM zu}i=Yp e )IfxԈ.jYEQc2F}^!;揇E~񐧶vz.n\ANCo:QTsHRqwZOha޻ }j"dfAR0yBƢd7}D;TzؼWA/@@(_m멃l1ꃃm]cF?ov7>nx:N?7;{6K@ ~3)ط 8ADw$:=V dY ^<.|n_l*AjgSճu~goXW@5 lA[@5%aq8Љ RuqiYR]D˿GQuNf Wˈl4) V\7]3k pwܽN|Uߣ]Pl9"e+|}}CC8p%5J wNmm? !y(ns;eg;"PeNP)hc @<5\w1ڻƠ$O6~,!X48I vG #e}4g (^vnpPvӊyRq?ܱ?fMY؏ c tW,PE/5lG[LBy1.z I_rY֬ڐLk=Oׁp` @"f ̗ ۬ϒ$Ll%ce`JF|[ uJ] UAEz67&qxF_PU (<^w εD t:ݺ"/~oHd;{P3},8dK2:H\:YdHq:t@l`%س1\ @ՓE'2`(iEą[1% rn+%Fu#jrj@_O-%/?h ?@]ʻ GW^+EuDp6PfMMbe@O^y"<{JaىvZHҭ]wbAqqrm;83.fߊ*~bL ΃(bN-/Ve5? @*]/)^te+ȉq춰Zą'8rBB$ml6ڒn~HXqpVh0x[`-y:`@4(bSpm0'6vp\|_$J~ 'EВҬAY'5Ϟ#$#ƻ V]A̰QRXkc6<>xw_; Lͧ|_'(sSkU )+&! C O}wolҔ>0:X="S#-(op20j->_ih}&E2(8cP-E="ܨm &]gl)a C$⋇"l*d'.(O7$'` [&{ײ0 6-h/ %@H%i5,6Gwɮy/Ȋ:=bCwMtPQ!{É'>pL3o=[_y>g .mH}MBzH *h| v&sW4l˧M8彽K#y8.Z}H޸3T#  CFv2S 懜WHhw)e|@L 0#+:T[fCpX#6 8'scìQLU >XbcFagnw 9j CvxkGjv UJp&+')qdIWɌgIoSE0j r :ʲźP0o-fs$@I,%CJ2 A;a3=v2}&Ks7:~tdx渊 @BM@p Х8 ȀÀVV{&1sN#u>љ`r9{"^'\÷%CPT BAgA3a8~$Ml{_N7c/ڏ)I}7,ئpS8a$7v}ڭ榎۽iJ_ xKa>{,]A_Qj2Iƒs+QNfkN *j\to15;k.̜ Q\삨ifaM41260FY˕p 4 `mZT$ܑ8; ^qvm;mzV)&MĎ>? ncjoY5(6x7K>@ LqڡQUhY:ԑ #>52n׵WKr@.*Lu T-߭ nLT\ xzsJsjՒӗ'B+ 0kR7}rL5{/䀊QuNy_Bk'JG7Y_ 34`R \͠HGÇ/ M7Hx4kvŦ ڕxN\h;;#gjU=MWHJ 9?FT:x.3.?wJ 00uz:::ICv+Td2aBQX>ٖVd`gJz]=VQ\k[yBPcY4Afn]FCg_Œb;va2P26x2U~<12'I5h #*B(%mKǮ6@bfӃ ku7ۼ qHpO- YQ$zYbv>utQ=9EI ;.UŽiu1k!t^Ks"2FtG;u:_|4s]lTAvK c$}Q 8I 8ࡲVUXZ!j6wV#ۥ#6K[qo_PAnm8 ޵6PH]t#TY^(.H4H2`@CB\puPLO\ٻܙ(|ʸی v1#B`1HEAU=RƭxD D͊߂߼5="_IOf="  }{yɂ(j$z]iᨢYi04d ک~FLkw9QҺJ$q*.#O\\ٱ#]0T2'XC=T=[$5,7敠w``0%ֵ{WG +pj:;s4cYvЧ\f. Eg}olTo(AKVwNBR_@0S GLM9*ZI CMxJ}2d~+O,k/ߏl-٩ ,r̸8VsC o Y r h` Go%XKqn%D[vp~:޵6 @QC:?-_lw$[<)PYв8OLELV85Gf޲w+c@8}NI]fpr,z/*˅,*v nt ۃ ~=TJ!Ũ@X׀^A>pk1 BM Hnuj9eVK}$? P*#CK$HOfBE>o}f?)MAwIOmT?;"$8YFg1A)`ZvmHDʭ˥*T:=H r`mcI| F}m̆pUokWFU)by6-3(t![Jc9Z_YptF-c͘:ҠiMJvC"0ĪW*q_9s2hJ 2Bza5Kn.]"a[a1/â+\E$;fA>}F[лCF u3%j$U#i۔g` p;hK۰{OF.'}1PeOpET鞱/jesf9/unp9D?&"+KʎZ^Jѽ̽^0RV/y aZR,꘏ V,E$["ASV9r~f|Wǯ]n jRc/=Er`.7J/E#0af8DҸ/vjdG'H߽`pwMn/n1gF#@533ӗ:xkSW#+)U۷"};:2#R0#U._^?s>JNtlǺi`6f-t'+ ,6e>@g &`}ş,i(2MJMc'|p`3F0.SKE=X7CZ\61o~FPgeq6y0D6#XLYU5쁤$/8^|)Sh7HVƇۿx鞺5s1O}Pr>&.ϗf2Vw۩pyW׏]N@<E|5)BO }{lL*"'9:^;;3{]abGQe7" n O("bjSœm&mS.O<ho>QFU1ea}ރBmT"3%J<>̿ QkO8PS}"d GP+:Vi/ch6򝻍9ܑݚ;C98Jܦ,@A,^z$sN8X#HrY7ߑoAĉge+/RJ#j jԒ寓k ,w^ w9] !+"sAk(!%oH$k+i#o"i ]I'DG'%B4(C|~x/U@ >=}󇒯h r2u' =<̪ \Tjc:+P[ڷ]N@ ,q%cP84Rըf^{lϜA*YH9ޞ-9u8J,@l,,&Uk=tƸ7w,Ř@/ IN xVLf}PMf}x/S]1ϩOQu+ װfH24 TD dr5DdNPuHT#נ  P1–)@a*-s섋[Gl %kKj7x7ڰoM#a/)`+/Õ qIY;ڵQGw4Ez%˄=ZaȠ]E2)7SD8~ki -$*`3U{R*&?K`+-,(.G;SƒJh_Q2Լ]+ Maop"Hz.J?sr0N%&%ܗ^|۝ܑޝD{75 )"j#`_j[.Ĩqb s~ cXW' #.I g<$ HUǛ)b0n6&T;jmS\]Uc'?m\ !G6~TØ I(` !mђjl$R5ao>?)ۋ#LWYُ=E|O-IOPՏP 3k I.u1#0yƒ5:hLS$3Txvw- @:.h:z_AB|ǻ;3{slc0D,P\`C*'ߴdI FY5,ofD"#M| gE@LZ":y~kct֋`?rDlEc?_7v5n8#(4k4#"#aP-l'v-M9btLѭԁ#6zڈ!Wn" li Y{ˈW>|j/h2BC}#c 8&رsrq ??b#Aq- QuC΀VH]J򿭀3?R*K&nVz~uVhEߣO~] ~`jzah-qC?"~vv;1ezTMM~}K[wkAhfrCҭmbFJμN 00cOޙ07Nc *olyc0n2N ~UCLbR\lϷ XK߳Չd2k:eȳIp3D *;%D'XNb qv7(e18˩8<ƎFӜXUOʁ':C{U‘G~6~ytS+_kV-[%}R߭J>W5L+*a͐5߳zL-Hy,M.}d+ 0´;NDGDz4 釅 ;:zwr"z+$4%̡wZHICP/|I'aSZ4!/Ma L[ vFw@x{@C }Jxa!+Sc CK $2Rb d,;9ZǬL][߉e5g4I?~IZێPFhx6/ȏpHGW ɴMkPkعcZQӬm6@I˥](,M 1!G7 E ! ֑#O sR~b(]`Ⱥ. d.)O,{lNc ¦ҶaW`.g(GnU_dlz8z)lZi"t$ CGdU>Q~_/YާrQ!aj.ż!8a~'c^0B*7m!=P?0ОrP8$uC `O'1q u]L1~m| 4 @;)"$bv(MlnNhHum5pyA"k28;1x <{v#kTպ╇RJ3AhnR1?g$ <@Ap>\wSH MO#܍ܭƙk5beN`;nȺE\bW@n|Az=_tDc6d.谽n̬h![QI49"[{ufSUKV 0fEigϨ׭.AW,\'el)QU1pjY;7LlΆMK!s0?}mb̟arsuL@aҢ[QDm} ޵$5 PqJvp 0C?ibIraX6Ė6 &{8"T~KM(hˀT;Sҷ[ol \]up~N\;A=b1wۚ":; Jvĩ"A]D=ѐX \Q WV/lxzqmb^{9SNH1?!r.@f2O~RLҹ[Ukm {|s)ljL![u!Iwxd'iv+$aP9 pnn9BO9S-*9=[k_ !BT!jmj!0%IppXbS2XFP:zr(HE 8".6۸/CXGa5 -/t۽CjKNZn t)REĎQ q" U?QRwa3eB+Z8M[TJV+w,:^Vy}>1t\ A?aClOa nUfX~l|E9y=sd0&+I"%[ !wƇ /ܦ63\,IAqh6\X@Α+Dn\T D}Y%R_n>BG]Jo~7&]T\ ő9s=5 >;h̔{k'υQM|uѣz Bv7 xP YkOeav48pRd !ef܊#PD7UqtRG_֌jy#{e&1=\; i"WLp GTnwiT oOnˠ^E & Tҵiڥ a_mAf c#i\aߛjXKd ,K< P#HZ=rJ%0ct& VÏ Ŕ. 9H ־*y;0i# 9?b!u޷L5gJP}ypVZ6xO>6VsZaZHLv5snjƣ!)H-_,t_M32x?oR#RI#d@]F9uZ(7:$} ȇ ;?!|oc]^_w5=0t" j?ě.Aۂ`BoĐ0J__-Y{D6Z^ԠqB%Ria> 52UP_$OSYcn@/=oxl;{`D.{g Ca`6iV$SIZ,}˗nxMtKLf;c3&H뺡>w<.ϩ5`,`j;:A`" S(''ZI!*s)lrrR),H@{=t+m:F*'#u4wS,Wl BVkپP44y5ǸYnfm`-'~{7=g{.^w90iIh#oY'Z :$Hh!Q-hCbo>ȧZ]ʼnw|[ؠBz#k5\-50f !5<LX; i=[80WzGJL<5wz-j[,Ւ;|$!rґ Ə_K:N^}2ko۲ ^5%~{s:0नm)!q6 ]ڐ>{(?fHۋn8 ,:s= ⿏ V7=Ndꎜ&ܑO n@MsHFq0DNltD+o$3vKq +JnKѴ*AH``cMLan}_ !B4|a ]՟ ,hTd)$XFn?F(]FVua# _d>? iw9j0G(< F`Q0 F(y F`Q0 F4`Q0 F (`Q0@6F(`h0 Fh Q0 = 52 N2aD#*w)|t9k`A|(` V3hb NN.;a`vk҅wԽd&5j8cuKAV /6|$X}n1s^@=ITK+k[C!Cq3F\GG0At7dEGX/CbwE$*$7?dc}4JrS4C17LXZJj)x " #~uKrV#x'ަg ~ 098?uD%8П*+~)t :T@Ϳ! Op=knMƒ6O![fag8QC}ś^KMR lK@.bEQHa xRjܼɸ0 8Fe#N}Ϋ2Gs1< GXN;PgpܿNsjͿ-H/xGe2)J}%'m69b㒠QByȿ {mx=4ra[AMB~)ZK7~Ͳy͡Zُ S5@, +vi_;!3\ ̰/~ _1 Η=јl V~  g@05P ^]Ġ dxᓏ^[  hT fV\60=x5h*0\Aagdega87I[q[~1oW'r03؟x }o~1|Đ(O?!Y'Tx6h+0~F-F1VpXd8'gk ? Jc#p? w=`t{?O^42n}O_ i#JQ0 hhQ0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@`@hRtwa. U cv;,w<Ԧ˵q忆\Q7nQq5Y1H"xD`ѪTa dJ>TI#^f8˜;.}8}դ̹a3>Uk)crخEBtqtwc:,ŚxN㛯-䏘ApH٧,/E_b96ޫ;3sCtվ5}|{L?.\7 z G0Ŀf g&`aB6ܣݐ낮U{fN'H`= 0DRTV}A:6%BG0SNã9oXXCc~.u7Ja1y W !b%Z" 6OP,a?mv jgX[qXie{PA_vQ]a ?b'Q uD/sHBECGKGG@q۷̅|@%n,owgt9 ]G">EvEnCիM`P 'aV9*1-o~~|cݚƳتs{eU" -]_gt_ >G 1Xׯ?"!6; %eguX{ 0q?n.2zq½P=1k2 L8 [¦hw?݊ TJ`Α2U.N"٢>%@IBdT%b{ L+Uu71wMNwJOf*o滢$; .guWHPXdڿ-B_91h-:ܖVB_iϓ2Pi/?:pG]Ǟ ÍCݴb#V9\o^ KM;~ >|9p`3Q+SMίVhaiYAZ/EKt{%=oNp^TD#OZ&&4ͻ(u:ɸ9jOx-\,V s:~Cj^LZDiͦ)F"DRN.jdr+>A]]:AРR#\H?eHv=2V1 ]ˎ1t=I&JH\Go'V QdS%eRXOJ9̊uJaI]C'NG&j;=S G,^v[?O{Xr؉NҚunMw)yp̲ekހ aZ?0/u%jeLKCܦ$C%۽/3O xw8`cMXyak7Aj^n:nl"&E'K|{F8?+OC#!>_yAJ Bv8UFIj#2Hc^ɼ'6.dfP&SAo9tx>KfZe$T&ѽ_Pwm@P˥DQ.oz9''X$rY;E- `@`KΐC?CPۂ'uF˔>Uhs+f_ U c)>LI~^os+Umt{[O3j(65! ?ƯuŒh H\͇ҐQn(~ɉ @jJǾiCyh!hZWo%qLTHxDxa$_ϧ"AmE)~׽qθjA/'f E:zwNЇ'&^L CH\ʥ[1uoK\j|hX̀bgI6A '_ڑhG#٫eQ.,7\SP[T;k[|4ӼPeND=i3[D$cG=RF2U񼫴;Yqkea\6/ ўbI%UxUbō7%yUگQGfþIFIq9gfX orEEDYZ˸T/szp*]M~b2ݱ s[(&<"@G~uIp'iX Hp>s=>Rw<^lsHjh'8hGj`%˓h aQ:TPypQG{>xkة"g9KcX]w7D`sqwo@z FJZAd |Y-[˭͢i:nNxn$ @Qp»>;K20KO0S:Q; ,b96(WT'M.s|Ӂ,W#b,u7- K82MvͰ1ՇүWH4bIujsІ/ܫK~;hĿhg'3HϺ憠ԕ )"9b * T}ZEИCU5߫'3׶4Dj;MZ$P''/ "ZRJnYl<1hwrΜ4neEMrw*0ԑ*BjCW90$reI8Ȭ( I-#aا|Cmnɇ٥g!`! gj.ĤH4; >E<đhR%&aeޣև+W\LcC:'b{~7jz;}RZ: bċ,K+#b5@4x>LGP O ڟ.O &>ŽvZqa&9|G+!)*ﳻ`TZx!hJR'9/;U]N v͒ra 6XrdGU'=6OQm`u;(h@C*D!8!Vl]9Q~.\k}̜3sfd,4֖+8W!u.R] wB$OJDaxǣ"vo\Oatr mr&y(Lt ={[JiX61oFH"f)MpCog. qvZ-n*lm\&?8t, 9p*S> [^ l{!Umӗ~CocoJR?>tF}~U8Ȑb,@X9t9n;)k9*`,R~9 e( ? G_WƬ&A[|(8 ~dY; GFh*BjKg1'qX8p1VMoyإؙ9Slj/g^F2J&Y3mKUxV2$~r(/k˦>*o Kt #c6? ܗ5^ô S 'jb(SaEעCi05GI7,}@-&8>Q",|H mmzc(%<"n2`ZvߞL@.|6™70MD(9"=p_FG3|<Û>u d"M 99uqg)phhVAȴ|'ûUkbwvC|Ƃ~xqj;Q%4(s5ra*_@h'0a3P뭤ѝ:u^wpk>r9t"!d|in&#&R{3ǃsz`/cfup .UmYkt!*!i;aԩG;k.K9$U)ƒ-@+‚V s'`$&Tl,cFkSLܐzm+`ZȚaHB&@teN ~ ޟ0l`-(0TuMRw$@@]ֆ!U!򏔾-%VvRӵ ~`tL*g`p 5UZoK3,2,07R\ L'xLb^GLC1jnAIeݍf?eLPTK1_or& ؕ-#0`BPEA:r^gHQ2؞yyn$45G<_~#M/+3F֓ 1#4 3SIN/d2i%n 1GąY ;Dt1jM[aOl|n7UWon dL.)w ΁{H@| X@1d@̾@?{ ѩܥ{rrNؼKب4P{DZ:"1cb`n] M.+gKU.ѱ3RɃ[Lܸ-Jca،X埗|o 5h`p+qλgV;H$`qqie2U) Z6y?CãC?Qɥ-,Wa1d7fJU`QD/8PQ[=Ac7&b jwlB&"QK qA@8D( t_VB$ Fʥj;x'@̹Ҍl]jrHwZKH1zqN୯XO$WvtX偎[at6Q8%D߼^^vgY0MO}/!< A#LE=R]!yb=Nb>!˘>7{H [OMMHQ <"C~nF^.xVԳ՝GҫÁ {8JIQ!V}N?+ *2+ -V)~v*/9f*l"Xڋ#ov޹wAL]S{<0{ z:f"TklJ,L?mx<񢞇GߖB:u# 6 ĕWm<t8e 蓁!d`VISL`4#$ ;c 7m.hcdD`A983┣7=ɂ͝ԇG HԚDž:/T3jC(| e0T`CvL Bψh1P|.܏D 4#–&q1)2q+,Sds;J|{D8a3(߻==>2Ä3~xX!󝸚\BPT cBL 3Hw.(?`Zvxǭ$ bY|#;AHMPvpΝd.EP"8N9mUեֿ>7ZEdG+E鈾KV*#B5$jw@8Iph\7L&%FF|m7fZGhݪP:O ˣٓxam\(j7f x[l6z&:!Jޣp` ?cU20G `RRtĎt޵s#ۅ=} l;9HjUKu~53efb->}ƆuAF'}x!jՌ^8 f]MEXnbOaSYu,>֩ O0uK z[}pq9B; R,n #[}췃-[B]ᷚ3(v^W@>3pXxۀ;9`9 M0-Q@ᜉaJ[聖~eK563@`I,*fUSPFSy9o$&1^t#XPI'FJ^ڐ3Jdj}b :9^lUj3kI9vHa<Rs At#11~γ0ʜ_a>9O_-Z/@. AJ>(c[İ~iߙK$ljڮ)I;=b rN,$v ԃN'e]aE#e() $gp`"9Q4"Kp~ sD|2j"'A9";?RޟDd'3e>^ }by}ڬrUu[BxT[NID7xE.Ȫ[ԜWK'cbG=D#;$bQڵVQ㚇rꎛVUtt zuԲr$RtU=Fw+',CtHG\7U2bSΜC}mZ9~d S盥|:)0֮78V 4m?zWˤHQ}-;NI;pSx+ؠ ay0[R; IObw#Y wύm/צU1;q+ @,Vu p^ KR'׊d8|Ab:#J pʈ1+RD|CT5(]Q'85?P)X亮sSulw %NzRnJ@a9iW,%0,fTp?\XXeys,\'r/cԻ }݀$cָr8L(jĠS;'S:2fShX=lVikt S<Vodsf  8LQClṢkk`F#ђ#d-tP *dj) Zv bx&77iP@tV?A*A!sg.!EnR%ˀʦ܉,m.Jvxg΀őhs`^l-"_(je3Y+q2Ɨ?:4~7H#?Vy$3m"Gڒf$?f5#'2x 9&!lEV:%b̓;x>xf`gd}!Y{|gto /}+q{G[&7YR 8sp7F$D5Tu)v !QҁCt}B`Q'iBNQМe蜼kR|{ |oN]%[-B=dUԜŸv&~z3 (rMDOS.p5>r,J̵:|},}9CɋCxL~r^hWyOLk@YTP >u*B|<w%MA=! DBB%\\~WDE(qXcOwQ:kS˫ .V4Xft-l7DQj|PFTJ!zBR99[sw 0=,^;_K._Ieҙ3 ? gwlO ~\鬽q}8s.ྖYJB2f1r&&1bߣ;}Wؤ8Z̝_챯}Sd Olc=襪Ǖ_M #59f2Q$:Ä. LҐ=.peWW\&Nt?#m p|~ވyKӜvT.<_$}W3l& 31a`E$* \ol0'\W7 Oɤ_:hrn"O3$Lonb^&2VEA*n?`U +#\Nr8'姶[*ePh'㖓r OPB ,AC⣮ l9298!*LLB̗`wdLv+GM< ё5OUS'vd[eġ=BnNV"ܴnQ F ȱ08ڳ )7K- rCڮ,vf4 \K0ƃG2^kT?H B%C "#_ipD hc:o6b(JZa;}[CGguWA@c!;3YSHޏx ޹;B f,ոPKC%ً$^X`0Hv.ǯ۩\w%js=Q`@4K uF`_qܻ(XE0prkJ!MְE!dzb2õ\?"9E #VW j8V\h]c[J2>*~o!OGfw.+ ly6c])I 7a g'KV !KY7Hyzד-Drlሆ v)GpJ}4KBv&("+?0*e6(?N/.P e5KхAON@ڇnݸMm2勬|jfwצħw2@ u-֥ПR"p.Lj* FQO{_kI nfI3qjf:V>aG+/js$H֤Ȅ8jn`wg AI<:M Z7lfX,Eڲ[ЋOFXЭ}| [35 ~>z^imw$;Zn11 pU-A Uݜ{Rg!-]01cK & c%qP"|? H`$0{潪!gPC"YΡޫ5T`}Iyq\̐ $xJu0CBSɄ O@fuӘvכ7/jxH|i"vj;t]䂡U|jNj煙d61 N0Ԃ A ܟ]ksAž|*,翃o{sPqCܢ­C7ܦjrX>+p}ʻM7h_^m L%cPh4kY"^ʰr-\yrp#Y8k`iY~ <ۦO_ C\͐fM3]Y?s$xf櫬FGK99LI ]&xz O+/+bP൜ MYnzUp]4[0ٯ&RtcjBbG{(yY `JTa,ׁ&Nƌnl z3π?g=(*uY;fgl&,eP xѼ¿v%o[ڸ. _l~m1[pNei+]- ~t0C+=o8CW[S/(}!3[ҪvQ7t?$h,G TLc?~ LJZ]Xu`bEW6$cԮ( Hy -u RfT¸xxD-]9ˑ7P4`ᐞ LǭlrO~=kg± n gQc[k[$2OSz}@]y!DIrZ>Ÿ4~t>ðLOh)˦{{vɜ _R\ڭ(M ,xTs*g9/$1gĐ`f.=d]LݝOq#Z~uc0ؔ2).]Kϯe<۸2`pF$c(k)QHG= נ1?mɆ;J]e=713ɑ-tHem è0lhRtϏ$"}ՔW3Trs=ޑv5$0#qxg[;5~?53ъ @SH\#i+-b_^vbh撦i7(ՂEH Bmdn3ϕ̌>ϨWy۶,( q7|Vl Q5HHrRDos g>l:!Be> K43r?Q}n:vFv䕫L6.$*Bj! Ƞ< !( -ip0MIb}ӣCU=ԬuP֞Q˴:xFHI4쓰YI/ՔOX B(bu˗0e8~5՜]ep_5/tJo[\E7nm( s`,1؇eSg:IaemhzKmA !k{Y,3Ж(\ʳfm"ފ2YՂ}X2 1_@FO!gp,9(?]n@ \J{G 9VAǒ]I)no ` rpOz^3&>1ؚHvIҼrVUL̖w].ͼޑg).wcR-廛az+m[fιS&?%0p @et"yoz ?ViIǤ+dQr}r/?& 6y`m>v`7Az /1EBn+4H.t@$ߩ j&>RBF5_xݏGuw3;ϥۃ?Dl|wKhh oUx]iŏTդV̓3kbI<{Ař#֭ [i=LCQ/Շ# Opn>,I*;0Z͉`)~맑?WTз#Yw"_4К?UwS5uTEKd!I$6!c#o׮DD>嵝@$))iߠkh ( ,۱sfb)9yϜ36uFr=R'WGm?*+.ϬC^.rhL(DFڶ@Z$ OBX8S=$;Ʌ;oҘg]`.MGUf~5b ]˂Px)g{ ։@xCJ&S4xXO;=(Ҥx}woK?Pᖓ/6M\lO'n2s j&ĦxtV |.{cHN*ޗ "@>@p":-9alCِ:ww<ijChf.CwQ7Sebr61%Z-tfK`R![zv8˲rpDiRe;*)|yy<y}&iİz {hqaDldWJ-36*l ck,*9 N^7'_%%DjϒS_v1 ?=^`~4&v3-5K6טZBVUdZ]$} cJ?phΗ.PB}Sa 4IgjܢDd~r_5Syo~ҷܣ k9D| _F3Yq{t'MY?H?r74(dNxJNQ1` 2%.SXGKޮe NӱM" .9|?}rP$" ޝ3 nk{ꮮ> wyݫ]شd֘6'PǃliܾhYT80yr},XlBH(=:; p Ø̣Ӛ*AD I/Pݾ:o+sj=.}uk ކ)ɫO $lS`;VUqN C''P-c]0t"_\O8Ψ81@\~|=+O79E.'yC5۵+)yep@55uϺʰ"e[ DK3vpT1kI. a>\|{FFHh L1^-H$UPצ=̨:Zdʑ 򷘷rb0}ɏ54CO!(%L-h@ 狀P7 +:f b/# !jW#PI1` wb֔OVcslzY2Ԩܰ۵3v`x*CT 9Bj';3|q"O/8Z \ !Wd\MېT:?.ŭ :N]7emJϖ gmNMN$V{ΆVdS>lO%RciUGG5!sf)p] п@ר7js]?t~9LBs4MMB5LkYm#ا c1˿ӜC_&`^jAJ ̣z/.Īdwx|;K}{qymJA-g4O8T U]*\x)_Z?e'~И_[)򄓀x2ޖn|X(훹#Od$&DMV M$UCD3-#Ma:T:^E,wƥƃcֵYz 8)z%R}D<M탦Q-NPO;GdgbA?G[{7C/8l&OE )V{W;[ RG`xfdSwL:@@b&R2NIъ("LߟRSV:BzM[)ƹFn0~#I`a8:kUy#U/GU<]ʼnP:@35-0iD*0.lݹuBg۳v!qWE4)[!F휢4+TC#{k c󲑸QMq}8`O  - rJL|, a- t#*,uxBw:ۦ .og;b皋˽fW|/) &pj;ڼiDQo>mS}9}^I?1ߧNC79nqv`0c,ruJv@8~{<r"Rcq%I]drCl݋q\!aEt0d~?gݔY2z@D&4;BȠEz0@v,]~1;^emɲ ҴHѿO;{_P @ʶd. 7]mEr3;sTo}m_?ŵl5Y?_% 䴒;>$1xb>3 : R f 1kGg}ǂ s 990{/>/Mu?|u_k7WfaC`hig`@DICq*@!V80 2bMU\hts>Gb.iSN`vZ>k6F{T5؆̽c[ߥ]^FJ׊ҪOQ- stKxa$RMxYcj1eB)OAzVR1:)SEﬡMdc@ 0Qo_=s\jcA;]렻 Ncpp,&#֐BD"qFce&i<f{PItPR2]&@MwqC&0hrYQ mԇsH-NjK=TE{Qϑ/?| n3*Vpao-X|Fv,R``8EH]0Hl&5܌Qc pH+h śۧ;=š9~>xce?^3V? l 2!Fgގn{I+eX)r|V! |Qs +^="@fȁ%K 3 4PGٳ 5t5MjZnqӂhdB5XL^K ˈgdlyiCxG%߯AF:9 OQ[ CNf%:pyLg?V@y58i\}\S} zYGcHu\;} _jS)A*JYK ΢*G--8#86o G'[)W_OyX5s+`fwTƦPkm+v8MC=Z (dK.Y>[ z%g3 Ț!Րz *F)hIbQq^JAHC΄S$,vA05ЦJJް-Nٳ]rpO#_Ny|鴉a ,֯.d+'cBvM.MF[ wF@*xLQ0c?l_R:JSYt v j_oT% mXޙRm1`ח񲖚~{f>M( >evk(^֏R o%p(ZZ>\\@)JߊBg)/ cpOq$z=@A 5@:\ ۂ^rH/!t7W+[yP )NK4=g {uf_e;tbq<hۛQS;3o.{ i(!tf{kA+x>RKb`PK:#J)vz8{n c Tl).B>D{8N9vh$rRlrtL|cƤuRd޾ŴY?P A+ )ٰsCd%Sc|lHOCIՖo<wɾmZD<)p=tg 0Rȸ䗕4.t:Aq7VU5=* <`;(*O/}Jf+X?χ:= T좉`/`%@`AzyV}kS H'uD3!QEʤS:%ۍ]S&-c xĥwB*8tތs(8)\`K $95ܫ` V`Xs@hOC~W\=1W9@RǤP rؤ8&6w5MAtwv4*cBJ5I&{w7vzԀCnQޙ㽗xoEiDz'_6DZ/.'<9/e.TobX6.1 8hK%PfMv Lq(;8/˛&|.:^N)*ywwt= ,٣"7KQI])1T S9H ʉK 2cӭ>Pkeq {AWٱ:o0qA1Ov5afUB.IluP]ߝ'|hT#"EVn]*!<',u\%Νg&}-bohbW`<;">(aòY.h~H2iH,;[Clf y)uj ?IЀ )@'D43X޹ #? QB5Bƍ$զ;Zb{bH?we%r7B-2.t8xA~1F οͱؙ߳p|=SgTye])y& %r_3%|HB]}_Hm_~Go,d9X$/!H=5?TdZ9g΋U%]kV جlj?j67u?V)FQyQ% -t xApl;Kw5ayt`_T@(Mӌ4xyO7O dx&؈/s+"tgLhL :{Z*;8a{.C5BG7ѣr{P!5 FLѥlL*6]HP D6ڡjTNˠּ>T2ǿ[>pVv8p>:^ d^W2nz1ψmmU3!`o.ʗm)O/F:x嶽8vy zm_yM(LQs U)[Ns[|@";7|)A;M.:]Uz9Q9KpVv# D\d!OtfDs G*I\&PP0[|>q׽n[hs\΢ 0h(o;CņnMN euVB>t70wmAEʖI UZ&+a8e2-x.v&F#vgg~-<w̆#)\f:ƖV?pНYe-$u5"qUF=Sj#L1-?5㗳_"ajg!=jNTuܸ4ڗk1 *-˛lL@LyUFfZ$Wzq/Ϸi.KP odaRVM4 qWߗI ?虷1b-l"+e/Q~d:wJKR>?>9@NXJA*[=҉ƕkw ם,b0S-*B6HEm咃VzpIBz-n17:#e1UYFtC?MaW( ȁ|%HEB5 3RuἧA6) k( h}1')N{p+!oA[BFZZ@o72ଂdNYr|PCy?mpL㗦ѯ dG5Wr!YA;\C ʋq}R.΋e`.E2'Yfzi}P~-(ފ@Ipa6c.xn5\ͭY- 8ϩ-xO$, \tߡO0M!C殦i zv8%z`{#0Å΄㬽kIH c 3_`{[@:H?#D{^Bp;bb0.ޤv:s.OE rDb"$9~G lVm`6Op1)Lmu襋"А{w/5n4V,InMJ㕨!*ULWnW%ޭBC-Alk|IfQOItr-]ۚ y<7Bjl30r̤HM8~hq-&,G29###]|r+|8S)sW~eot8Sd)= ~aQYNLt}Ȑ5X\sԿbD Nȯ8u22SHMxx aHӋu@Xﳸ\GmKN}KA#E =T ԱHlиڠ_0(EV.P201nr5u$`}ւL x 00}i,g#$#%'ܛC$ GOCjbU-誎&>9]?E:v%4ٟJb?~ ܵ ѽ DФU[ *j0^zM> Z+13EGQ`"u"T jr1l޸VV ] +%~Z]i-e'沲,XMPOxYb_!D"=:?2t U\tbQ^@˶I[oF̭˒ RgnNV/$%`ij`*];S~,TR|0G&Rހ̴R2tbf_~XMn3I9`?/WKԵBЏĴ~9y=kdM,d?q :: ebzQ %Xѕl}NKUj)[%HQՏX%V"_hYX\.mS81\go?L̗.t~켄¥q g8kwwi"2fRZ_P/RlfLKkfUnCg A,C zh;ԆKKA$'"NWAQzWѦQ|a⭬,^wM-{Jn9.5pPyt/&f_&MGx逰3Z3 @6Q{*p#W~6 M_ή3m+!!!HևD!$=M`f29y7YϴN2\t |S0e2X)A?_j t^?܁pDxx3^dr T/p%NWBg9U&!RvTkzwEԄgʿ -s_ӷ9BMo1EέO>_ `Ew ʦ_~yf6*]=ŏb>!]Y]>y"CsJ(U4s"y֎o[΍-JɌ7 2NE@Hʅϧ:K##yNVCzb{zp 6W;hw~!\-J3tfȳ:^ Dq4o/:jw6 3Lb1\҄e5b)cGOvDqǿȞ.~f^Bʍ|Pۮ nJl C9 u?m3c#;VrHzKz{I#Evj~ v{H+ vg{#_>һ,{Z'Hm:f+" .7ng1{?q Cq̳,q+-Ρ?]Jl Ⱥ9ERcCk[~OmD!TwV-m¡ ^V KJ73="[?KRdfGF4 ϗ.F V_|sFAH(ɰp3he4]WOsvܷ*>XpS0 ",Ds^Drdt?j#2u/lִJU/pUbIϤRJsȇDQ%~#G? ]ux(tE^xGj39`I4~2t@r 3ERvDPGL{DQLJ8J[Z5d𾇿pw5; 0@!!n\y&`T_6I;c:ۓl>Lj$KVUb!?Ce€*v031#zp]N$=q0#9?_ݨ)? v#IRYKvF #uE9bH0`jSMILTKhB*JcY&EX&)&hޔ]7Q8*$!!Ќ>k37}rGVÅJ0qDlo{e;7?,}w9'K"1 m=xC^E`ۇH0sFŏJlr('iZ jBbqNDPVNIۼ ,Hof>{<W)nϻ+&! Ჶ[:FKG[ )N݃*ދyf/j>%(!imkUI @<4n([›dUf{% _m}4kA}RȻLaFRf2rID 0*>훮xf4Lohsxr# 6X^f6$NL<|)@VH*sTIU}$Mo?..g Ή)i)7S/Ȼ܄a :5EkrGĒV$&!ۃ(Ul͛? 76 tbhP #vd(:bUkfdz,$]Mr44 s\"X2U{ߚ/X}^P9@tGO%dy*L by_31?NB>l0r\nfH/2F{S|Z"}`9hL{d;$;u]0 6œ&^}}`D`2,nx`vlڬ]-@7y$XwXN|.fg[v9zBYbv )>ñ%`b|S }UD?ӝ52h<0?Λl8kXND4LX=!?7":u-BA#R@' @n1 NRS%WrE**wB*@P+, .wun+^F`~ /}Ā~`/-+ o1/2PRi1g9&PV /a\1_ns3A.x5@?`ԿrpC.2GŒ'4Q0 F9 XRhEЫA kb hpD?\Q0P F`Q0 F(y F`Q0 F4`Q0 F  +#hЎQ0 F( ^o¶G ?.wADX? Ƭ#`h? x9#$AAm 9gz2 F(ETՠt0##h[כ?q0_u6BO m @?b+7`}7<h[ \/ ~p@kU.&7öt ~3 :?`;0|?` >@DvAUWwIw}ݠkWwpEٗ_ ~'>{T׿d@7p3Rp:( $ m0@>? K̄#o~gת,L)#YGid? _+*;>4+?ob R;d5+#pqЁFߠl ʰhFЍR`;~`X" ݰ߉(|p%t-wL@hؘX:E|AA'{n?bY#[^iʊ_Dπ'Ù? \p@jzРz;2h l<%/C ?7az='0~>w& ߁imxû߈~< ~3* 0EY F( + [X {N~@~;é|ed< '[%{Mbv?g`gfpSd8xXbf7 -5tXXK1|V_a8Q22{!d}iNE+~1" cſ<(e?ޝnHV\pw 9F ⼐2?a ^b7f' FؠQrzA7!~WX2ֆ{l$~+2\ n nbx Ls/cY`zH6~^|M["-(G( {׎0DQ!z=AĿ~O$D߬x~]7}Ԓ4 Id1L/FpՀUsbqȒt-h. wDm E9<<A6vJE,>2YgOL#=,Ff/?|#@>20}c``48g ڼkikoMZP!nyM7s-RAt"h /`rp}u m⶟[\ C֢1gaWnXۘay z^ZJ0 Ì(d+'.{\x dԪ~{;. [ &7IB9ͯﵹ)El4 U8gHC0w0w0t̿TX\jуN4⸟ůWCs29jo>-"(Y~+~vhVvk~( 5n}syMR5f= 8vEKb D Q$ǁA!ȔHt$2 ǞCͺ[ܗS\874_g?6Z7姽a ")АI?.lkwcx9ކo~o;ަ _;;8mJBTBQ ʡcرw1qB!rіfv~0Bc/_ߌ|I,X/-VC|0]e 6óNEjџߏ@:]W“sIښߛn6ƣ$T@?e7?v1F-|p|۔ln,5 aV7 ,zlIvO F.գɩߎՅÇF hΈS'lN`y [i3}5˩#o Q!%/ I$ۺ)N%'03 mv)@7}1Cs(l;,)m~% W,H[nu{7Ɍ><6`m2Hb5@lT2:sHZjZg1-jB3W!+m"U==Ƴ!F("K$sFB!|(H XQ$0vdYr(@k{Շ:q h,0H/ w˱%wR:v'/>byZN`$zE^K+Ι &< ~9],Ⱬ6nW+RlBPyG|;Ii6-lʦӟ}_#8WmWG@+MY[..f fq0IX-\4|=%#p$}-,YUR0`/Ɠ\&5.s9НQU_ $]ot@?K-<ݚqTĖ =TNGoы5[b"M$fW 8"ƋR.. W 5Z/2 HhۙTUr3^KFUA`C+ owsxyv賎`rfȂqR=q mRُn%7BArs😇7~DVfam9oK:TaE0$ba0- A=;/w1.T:[Co8kO'XU_r 6@H5ۨdF4S.Fy݆?8r)׮#R6WJ4 2,Ķk3?.cKcؙʶ2FeA6҃w&kckN<ec*0r^* m<_7#Q,9G FW[+k΅ C~Uuo#~FkB'eA9ҝr$Tl5D%{, L$(,Į7㦷8+o؜ca!\ee 86+آqHLGr^gdE*@Kv; W|L+~ hf~ ,t[[yK]%plA3p36$X˦[8ASRnВ&p)۵eVvzʞ{ Yh?xVS,ijckm=X,՘чrZ6nl2& 4Ҷ WG }"NKaJ A8㧊~X{rf?`zZ7_^[wRXA{w+(IěxB/C[RZUJYwf8kH`7<M9<3_B+G2"i >؉dFGjW"w7lNOmgZ$xxT \ɈaLEӖ|).uH~t2JRwga'fٻ~:cAZ^\IJ%ld~P}-:,'y%"DWZogC| -5ײ4E<_I>ӨP@]PBHeE%X VlX+رc 6HV BUh64I3qcY,sϙҠcxp޾wtcACĨ@6Sg$$' 4`< 3š>z{pۆ<߬{7Mпmxql"nG͹<)1 $z V{ExϚ Pp}`agQ-_pΛÏh&6 cDzCX{/ivRN ϲqЇb{e(km8]5m5=D}4v jJ[Gti |lV!cĊӛpt!Ì:8QH+cjd tZn[o-WwG0Q@ !qÅ3$z(؂0fV.T^ Gi:z(j'Ok\;oA{J8N$x(((TTHt HMDHB;~wcŝ|̞NT( \-iJfY1/Bl>pENd HaΊT&PFj (1(bF[5Xqղe{[kjvC0y#EAQIk%JvTD0 q&3.#E:!N'BboT`ScM ?x)ΉQas ;w8 b+k!ѕs,eDPb'tb7"v|&ݠ9s訛Gq (as/>?ýCtIbpEK $1Āolj]wD 3TɀȒLGGsfas":܍Sb.ZO&վI<<tLŸ)C6$R  0$(ᣫ)g&Afs4DJ&O^ny5R>t9V +3Dgvvfi.-"ڪ1?1 .&&o#zbŋ^yɘBE@B3xh̛{ޜP"{ʎ;zꘟ=UIAWk@R17 )zkD$EwML:6uP  ;dF9YJ8a^Vtq~Gyz=Q4G^^Xǥ @&[) J"0#bCQWTt&ZCǵ"X\~"~6҇C_hE4S1";oo_AN5*! 30uވH:u@pftCJ/O*($B#1͡mUNL>j U? 6 32 ߳*9GAQDƉ ?˝7sß QLoN+Q.e|\lPQk/"EABMIA5%W'4fQX _ߦ3TT_HQey{4.ugF=;W@_Kłq)hpT&P=. %Jfqj$i Jj{^m}>zٵT5bF}v?T.4=ts&b!5^B]pҦ ۩ + A<嗋cK6~QKJ LQfU0KܠȬmgCdk{ԂHt{dVYR`xF_%sD1 "% $$JzF -7PPQ @d]f%Hĕmɲgvwfv>ß}fiu.عul 7q)-et}Z7WPdIbAoPj܆D$P I%WB1C6\]Hrofl W ߥ C4V Nf9=^GcM"hZ%p "Dp_)hpk ~˜g_ٺZ~Ϯ/Y:1~hi:1xh!Q% c"E,~]Q'~ZvDlH,qz%bUGO;^Mkiv_hNL~wc0*y]($x݋P2Dp`1`Qel0q'?=m̀S 4{G~35 >{yt)BEGfBywLcΞonv $MθcGMҩJo&7cì]u(߸Xcd%e\J+oArn;c@**I|q'$-:C"* Ml#!i`DUՔIuqV>ϭpN/]i>`֒<>)1_x d6Q?'TM,x!p<8vs_#L~Np\l%Updc @ܵ6a{$d̓6-E$*qCB^7č^KiQUfN }3[#ϐvO{&'X-f.RIʕ&qv~rU?Ky;vv[\`0>0ENEzB9G BeY0sPq(*5[,l^UH"CKxQ5v<"o2#nP⠄`a O1C?&U"s-Aey.9aO4\LRA! `| MoxTF(`Uhw ~ Cl qPƬSPA䅘dZ>:Y⇹TO@T`x8GSScڣCVY 6KüP9YsX4-ȜWڬ8 #q+ GG߽eDK2WE(C1U ]< \&X<uެ23 0>?bK⮥i 8SӤi T!q . ̥ !!P׻qEjOV%|73?~^\o]guk-Ҳ#R&3bUs"^bwalIU 6f&%DCvy*%3J(&$R%E.Ә #|I9 gڪP_ݮ@etwޭ.9|-˒{G/p >QO_A!;AF ș?R'U#B-+ӈ8&&J8v>Ej} `s<0MLWTb:8oqIRL^&7v^7mj{2Cu"+> بNr pb;Ē^E&jݺw[ɳ'RO1GX ֛JJ*>³ 1vc0C]y'462rk,4ӱ@hޓ[?߇:ҪViIZvxfcMՔ$.b] fϊ/dł/UyTmmNϘ{"Ed)ߙ;Q<]823hoT>``wIZl TB-!oЏB]=B`'y#,M.Q?^?uώ*)nELj, {eNt/]g>O(g<yB\Rќ'n 9ZucԼKWA_ r zAh R7l0I砷r͠Z{Gɔsg˪yѻv }6NGA("K5Uۆ(:5!aC)꜠nJ G}TN!IZ WLy:4k)YcMDƫ9ߒ$w Qk¾Ii؏²btOgMV ;k2LJdlxSGޮmi ډ D! $g$GxFBHVm 8^Kx B4{̙ٿ&C>,!3#VA#ܥizl}vuB(:"PjLo=-[_!>/:BnB0T?ͧ9_;~I.uǥ)*DPB؅ __)5پ,۳ԗoC#Cx.!J9tI:O'Oz^X]8v8_$WXW A $|EE3?sȮݒMkuC ^(>hUoZD>w^{cI)mMn6;l-А&9΢8lE1wGVRWL]":q_>\(2;} $]ʊ`$JrkX%ʡqV(Yb>Uust gGgzHnŵX ۑ#zzwM (&s%ete}ᔷFYcqg.uyNBqWxl6dsll9-+2p_>L;xu{M)D68S0lȼso}?˄Kyg)9F\oxcQjIY-i~jЖQo#/}!<3$m0:EK8HTd2]^ʞn:fu4[f>pzbVŋ>=bX6ntЙM qIِ$DEdѳDŽB8owQl6P6lї*6hwH ZnBKAr?v Ǎ%%&@_,Y6̵('ϛmU(ї;LqOgt =; KW$Ed0K}@kZs%9&k\/@7k\)HBdlǞL/nK|tw^-)8E޾<|1z {C9CaN:_8Doc"Ojܱ5A+˚Uvq1׋Ru&^9MŶey2>*Q=F,wG:)qES}]h8~1k`BYAq^[].UwR*6z @p.0ջ)+9t)=@u,ݱ@q[,;Fb(d8PTU< A{Vp@Pu>H5?qY; R7a/xK71+Hn'PL!G !mA?ԷIJHY/d BP D}o F֛/~5[ !\ Ӕ"9/;o !gJz)G(cа`& oEʄ!$3,;I\Iq{Cf(H7S9&_V(RFKO3c}ܶ as;Sˁ G_u;`0GBЂu\SO_Jqk?dN&frDsl} OY~I!8f9WzgFP)H5.vk}V[s$_wMAw$!<Dqo%t0]rF^ӝ~[h\Kvύ@\11KPdV_-w鬫gEu`:mj{u*>XG<|-{ыљ@fg}\VfNQ7n"U8 ϯFuV"YJ_9;1ӝ!p+)pBx^,4+}L٫},-qXGFTe1LĶM!`d(6>VuAM6ݰ| [ɾـ2x9H>` ,B !RQ8={ΤPJXv9̕e0~Owl=bXl)<08zDyS7 ^ﭰINUڵ|) 0߫|N9 ROzlⱼA;aݦ,M]>K6L~aF@ s-t젬  )gofI~55A*Bm7E)Qe%}sĐlF& `eyU[JA9ty)Pێ&(lG`m"xH %l|;Ɏާ~2kxk&hғx!}h(p`Yrd`6Q>$\؅qL@,sV[D|Jqgeq{+b==^vJzԏyv" P`" Mzik{9`;@Sgt}Q:F<}_'7DiOHbuvT:L4i>l]O)8tHxτ8g˫/f i7%[_FZO6$ɸ9-A71أo}M K KA Ér ڷ c%4Vmމ Zϓ/nShBR+a FWi }2$H>'ȌEMMXR> "гR|黹:*_kmHيe#v4 z*Ioz(JDRdgHͱ @c"wwvКG,jHhJ0GcEE^42~ΤHpG,u𸁅`Ç땿g^ bQPw W6%8""PbT\1K]2D:gX-֝<6T̬_#Wd|KZr~;ŊOn&@`?2ITv~,Iz"? }>5mHR{8+f!fV㍘є#Y>߈4]$ 0e԰Yq5DkGKH̘ ^^r77돶;J=ިwM8 1;yɆ0dʆ .@rBd0= B6>bG2 ڎA7RlD9wmMQt̜KR5V_}#?Sؒk-by !09Z_ڬ*w.گo4Gu|&:,n7o %Ror}feNC){"%'@HRH7yBm4`}CVn!\\[m9جKm>Y{Us0jENs/ #pZjyUUއf4A XLus!gX}Hy0+}ݲ nuM78u~1Qe 3ڴ t,d]M`%O!?6E)(+c9E@Wt_˭DW&Z¦s`.sMPk EliLU'[*R)gZ*L]-]4;bO@A}fzr/}9{PӵI{M y=2ŎC}=+d#oH熈OF?ҟjv\r*RSGM>u­MӒ\ M.JVzsOLJHnK})q \'/s[L RPHh?[^\ް2x8T&MOrmJg-_6 n2@c.aڡIm$KU\Jt/D7 B Et?XN<#IlLdj~R'{'_͋z@ܕ6fƻ@B$!%P>+n|_pD@"8(؞{CȲ,2U^ͳ]ɹ0MWY3t"P * %j~/=Т,(fY Ia'qLy-[p V?l2&%<}k kQ/^3?K bceGg>iGN{$9K4 g3^ݳRT~S.%S3N~̪wm~b A'=5۱ÚxNޯȇ(@ )X{t8ʱ,^_p=> 'eWHUH}#C({I UW|}6[RxQSd[Yr-irtܩ'/lVx5:?_$8U ? ĝ(K}jj YZ0`2mQ@:IRvP2K QFY},@ǗP2T󉶆2tp:;i!ImfFC6aj! .=ddGlfiח|g836<Um O0^X-_eLpItWA\G3Kf`#VaySHu> %}8 6 /N5{˵6?LS>(5:G%!*Cq2b%`Q3&&#؟ƠV5m.U:Y5w& SU0{MXǑbEH[C:2!u8~[R'0q UJ_ӎ3]n1؞lBq@H'\8q"d!><y \M]mY,e}4ۤgAJ,\ljʨd IoANF uk_5_ 䩗'2t e=ؿ)Mnۙ=gK6S&W{S 6 bRO# +ze l/#yeyv!{紈?lq9j3?)eG$7/4qnIC!9μu$ez*%8DGzyq_ %MQ3#qt- o~Emj&J)mU`!ǾQ"4 vK5]]Cŗ.!ROuKmz6w#}4Jր[]04Zъ _S'tu&xG:ap> 0i%0R;i1x:&\.m;b񎩷2?Y/I T-s>ئVGZ.^bj\"]Ҁ`4VO^@ܕ6D~=B $|_)q 3 U8;Bd[ի0LrKʾâ׊ !! x ]]wti'"Xg՘gz߮k6Y㏵oڶ8@XPdpics@5} I(vgA鈏DDc'JE F آtJxk/ވ,ϗTRj$g}A&'Պ^3g qK6V}: Xs{< 4.0{cMkm"ER+רI>@.{чdgcբ,A?73;DS#o ۩b dQJLvb^TrA ԉ6EĥݼD|mkA%iUI8us\nT0GVY"}m۬ y<7B*z,g23XJ Ike BjLsPFl~ Ӫ]\뺊>ۡk ;^gD (d_>KjSn^D-}űIC>QfU"R˷c&_~8 q"͡hyjۄ'4JI{$QYsFlQk[Q08Lw eR:jO)Ԝ7Qa-u!GXla)}<`*.p\ |Px6QKY+:Ggb!u]cw=.Vaeic*8Τܛ7!>Q+@ T(:&$ps]r0lNhKBoi)3~fhtФEiyq<Y^iYkn/nn퉞`dE }Si]ƳC]_'?J"ǪfȎ͇4[6XIbk4a|yzdtk|h%nx}Յq3F`٫j50hS3gok~ˠ2;7JP* ȋ&8qmZ fHe3 kiX~jg# $oAk-h["d>ǶǏl旾ṀP*ɣگW[6ѲemI_.8<7jI)a3Y\җ_\5?Lu2Nrld$gBhl2Hr`/a5yO=}, a}xL2u:-UK7Z8C 1;.eR]@b>n f  P{zr`]qGOso 7Ǚ9fXnU@*ثm[ ϦGe_<)nt!jc#[ qNJ-S&TvѻSogg>oɩ(Ϧ:BLuKJ 2os·TDS͎[Kja 'e OOޖ2T/SEO\U#(Ԋgat wHWdJ3fehkO w5M@+ےM4 μ< MJҴ[rm\> =Sp. FRnY~lX+>|8?W=?Wݯ#aMeJmK_!*B⥔f1r ^>8K~U"ux*A%n3@ʜ-Rzl7@o]LN`&/R[|z Icяu9L$W`<M7LẸGH&+[ bYkuٙEcN[|,&[cjҦ,{1<xnqM08jk({ $cj H a~&%ބ,hm7oycOdXqi9Uڹ}D>\۝Di2KLxQ5D@} cAB3o;:hC~tVoc5dm(˦܊0:)!JR!ATydS% "h ZJ d~0^TQр@*h 1sɒGKAat ``%,($CP0@Di&=4)}<, b&zD~pˤM㼽qRlnjKe(c#/?^#%ʃHvٍl1QO,B0edR38TOs tc DPAC1!2KʨKSy"iwݥ)m`@PK& 6l"m­[SE',ʣQobp4Jx[-DwyJ܃[zd4мfAWH)#!cN*xgycEz6 [|~ W9.黳ym̆4#>$)]~*Rӑ!ei^TXE$ f!Yی gZd5A +ɇpeٰH$rd4)K>np9kx.83kiyL;=x=_"{Vz=˰n ⋀ dɫ Z@] Ŝ Hд |F!$y$Sݳ=_r9MfEsx`$%7"jT0) eOX:6"~[D}KzܞpJ:Jx1ĊX`q"ŵ0\FٖjDED@>HHߚvLRa#_bk,um 30c棘]sh Zd )) ;J'R6=K#rU qߪ& &<ċ'+(ubnzV;R)G{2]jJG %[8Q[ 59~$+~AV`<ڒfQR5ZkSrɠ UBbM1k '{pat tuz7Tg}BGuDLII+ڂ7=nZ*Ŵ\/ٝGuv%zmB首ڙ2+J 6x6/}0C9jLE. X.OWe[$__^dfgI;ڸbaܧh?hH`3^W{tU?8rTvΧC.4R>p.D*y)qM_]n@@R mǢRWn'~Q4%M6 $wCfT%f{sO[_i!qNs$i ߍ͆ynz}'p;3ٸtICl@:,I%R`HOru3(׈kr}fbЍ_s`ό 7[ ymz I |nk6bɢE;(t2PBtm xɸWl63n^~V4mct!bCkq]["W?ȝB>j<T}_&x-qDi9>}ݹbE﯎q>DVT 4#JG-9Tq${DCpoY/R~35Y l2|.;A}]w$LΘ"^wHC;]3i2H!rCYb EG* N0V[&=ٯ>Dnݓ}K\eH&cwh6 I9 c?:QB1*{"=K2D`XOM[7jJ5:sKw="w~J["mIR,ǹ~4j4 w? /|"P!64OOlq@ ޕc_=>=<5݋hEk<>=s^4֗H0 t{yB'Pф ln^LaqԳ Q6IWIj. ?=i!-ל麪]]y4gUH^4D)dE>fg! |6Ý!ϗjuK2zDsݫ!D~7S&ޔrxҌދkq PBY Ƞ0јvV#d#RY4CG FP:6a%]kߎAht,,?/A E\N5o(8U7;eMp1Qa>bpU3PDCdp?!ZsH';C dϣݬX, VۋR:"qSj*~QJS.&^\g‘@S`* EpY1{$jJ|>AV[o\f_ sŖ P%6I0 e@pB9"x0j;ݰfz E?9X?uw q |!Tѕ\Ak31C *Jj6&( {=MѣsePQrRwhvP(/tZuC``b4ME$Ǎ Ob,YݣF?j︬o0w-KMQ{BxC ]Yl//->>"$LB̫{]Kd=ܙsϹ6PI}r`hmz/o YZv\11 :9m1կq9/ ߦ⫏h. kيwĂn;/dzJv5{1Z)BӃ7AP: GTЙ*!njZiG'd,P}{ΐ-Fh/MX$+h۩zkUNyRUE4^Y")$"m&i-kƠ@BACB!L*YXw,2@;~||t ?ߌG]0%dr"Mc{Hw_0`Md})I.ԷIO5c' R e7Z%Ұ$fnHHq 1|.P\xncv F~C4Zߠl2Q: PgD_&14{j5C7\kR.Kjhf|Qc6X2M*'\7|ܦ %!ewJì]wEA`? ƱV\3i,9=p?O0niGTtn|1eh82Hxn tٞJKs6uy\>댊Ag)UK]1y.89\9FYg/H!oH87HK3Q5S2i]qgBA4,j+kLxFk_x?H'6]X&zRziV+6sv陒BNcDr@/3Mp̩|(:*;?Ml2W2²3XVzVnY%]dtЉ=(> 6~Y,tE]IyY,XZ7 Cۘ~l300+&.'1)8~>B L2ӵ # %}882%s^De7Xe5@fDCPf&焷 %+Iǡ'Qt^ϻwqXMYVJ744I}&avQa]\nhd(a{y)|0VXv ö_]4ǦCHo"G|1#wW0 Fۯ:[DD/L4&Osn@`ݭwƄNӽ5~,yMe$tp%- TCT~$y'5tzdIKATFQª0kN"7%~Ϧ6d"|WS*,Le{Mc9OpڀHN< (,&F* ;YGV(5\;ڔE5e򴲖Wpc;xٙ&vX}>2썧DAAKS?m{]N0\8- #;߆!sUmQPҤI\x8 :ڵזwf;ȕZDr7ǐ.X/^>Bz<^ x3h-iDgYK^'Pm-@;Gd?T $$P"ݬmDH>y{l{92ϝ% J3u]ߪo xZ7ȡ'1f7>Cg8}\- DKA! :մE{d͞,D8iUBSGd. ??H&(Ȃ5e:`r/٣BH~Mqn >슃q4@F(C>FA1xp1< ?  @?;ci.Fn/A7֕h"??Azgp}|/̐r-0+÷^p #~ђfQ0@x NXR_6Js3ac`X=>,膼7PN~Oe / ـ?/_3D*q0_ , é7?l*LWa, J@qAt RY0}"@ :0|;)nXI 1s13 Q0 $ DQL"`Ɲ\qL+> d~DRfI1vHXN2˦޶?Ky/n7tm"M9_%;'aš xָK/ @GFya5RZH)I=t[PB)xF}*@ h '*b{h ΍([h|߬MO.ۊ3Ŕpnx9PF/٭r?39Ҍ-~A\'b} _csw[XӍqaq\uh+8$1Pg凲c#{W@Df& b!h! VYia+K;`+֢*#BDM䈗3\*"d▻ayof:=^jVIN%y*cY3>z1-UPS6lr#Ocq& _NՌ[=W8~k +Q ĵ,`äO"]pYǽiC%ǁB۱(n +j9agtwHUN<|#Dd`ߋ !"LDX%ݴJcDpb(!<5dg aMS[k 9HhouLatIx{lǿ8>`+ |5FrNU(X+ce Kz7Svkо =-5C\n%C>sC"םoa`XJaaᴋ =?5{?H,CA=F&\VY30 3|6N>_ZS)&`HeWK?Q|5j4g_/L|uVrSlSǜNɋ hF)X=.B+Nt?2ۺ$eRZfc ,B1L,@aD>aQ{~_(n2tg)$y c H5P'gf}Ь82 XN>c- @b:R9F|ߗ:m_%7-0^|_z?k g7\+6r܈2 c&aq?R\u9I@kF@zQgel.:|դ&ōDם09*6X+6K^r,g}Cʼn(O6yrX%D8Pl*k,N+ĻΜ!&ooU31ox0C_; Fs~kYyBJm׺edO(4 duӳS~7`c۪!\Weg$ ep)EU<ԳzMcH !DV7Sl1;Thf.И.{A!V { 1MVj3v3K)SXԏ:L+CTu0Vt']~2TAdPo3Ж>iGl؎TJ6㤒BBX0j#$,pL{o5.DaYRaDU[P 3m"p/ӳy6;#q86 b!`p 80AcГ -խRWW3O:OoMwrAo CdSi؉2#snNWR)*C֚ 1"HܦqP0PHh 9ߤG/_<u$8LQhx>dq6p~s{^N~QvM!KXt-ەdeUC 0}C`0\]t4R.4QpҳaM%f ߇{kXBK! IUN6ЦX+b"l:b+(,Cjy1$snmQ-<6`֎U?ϑ7j NE Y^#*I'ÉQI2%l!@ َ)elΘ5kbx(2,r\.b[2P1f.PwMDQ>㹳x6b`A,b @ HQS("H(JOgx,  )ows) J(3'+k`5BLjN$] n)ՔZOچooݙ>R Bxko'>&ʊ8%,GcEaՕF1{(Wf|}ش>A%yUs5?nQ8NzKEW2J-{"@ n~Zjs :^wue[^S9!" `2A) *2/\SEbYfW` ΐ>Fn}q3cZd -7}Ѳ7D i$.L tRꪜb$rӌŋ(HmolT3?;ܰ;DٺrKG$6ㄣL2ʵ`R!k{ǦkXn$zէ 6`|VK/PtTiԺcam뎳oq 7{eDC%jWaܼĖr23)Gբpßڶ&tgƾ.]OE~$Or0yǎ+N E ZeűCTt oAB-X.r'q@$),KF'ͼ4|3V .)W.ˠxq"vvm҇Kf/ T8]I:$s@5}"* NDFR :KƛYPcJi͊؀a$mj!9qDAbD]' m{rwE*Q,Ta ҤY_guS@3~@FBz$VmQ ^P6}b.9LK?f;%Y@ ]dU nk](;K045|YR2^ zA`Bbp&,^Ԅi4WJоҐpn?c6x)H]uhP&kRK{&^x~pLm*7T'yU$[ Z58lTikݜl?ܨU9 5Oy?l| ^|hws"Mƹ\mP$ODt (0U0g)=EWΫ{ ѝ߆;\b5b]!B _M|'㴛8⏼x$2Bi>+c\i?]nA=>?ǯD%D(P& t/x H!($'9]53u:jΔ޹s93Hqj>?z Et߉\ȽNo8уKq2-` f*SN]Gdsmwpƺ9'"YCgD y"jg"~ $CȆ<.(Z.ц’˷ Y1Ùl-806/7cB2ZY@zYÃ%Q%e ]2f\DB t5/(Gvݵ{47U!w/)J!Z6n Fb") y%ʨj"J3]ᾳ:|;7zaȉqYW&8H$yO0PBA'SyZiYX~Ho97Fw~G&YadI뤠]*0֧5 EH sj,*z:=6d1lʽU t}M&{ٯF}IjTR >9;"% )+2$M"Q%ܻޔI'>Ռ^Ꮶq8ߵyU-y䂶O s#L9HElErT,(N طߒ ܵ6EI&&mZu|7"rcN+ Aq! J}!IL3ɝ$~69~{gup>tpc 5OԮju_)(*$ҳ5Sn'meϔ"$xwSjm$|t;6ΰ ̍ ĶhM@3/|6$ Sv ?$,˕?e~NbGDЌ]C+^;pM1.O:1-Z H+'l,e75 (!x$Cs Չ(CgJ4 D]M͙րZ6hތpUUjn\asN:FL粯bՃֺnfB9 )P6C4H&sd4|z|ÌE3z7/@?<ؒݪO*fULgkցQ.a1(؅LsIp4w|]|%;kYm"g&d:)+.EKA\ҕ;">KPA7B&iK43m$mY 3psss#Nh!R{;%= 2 d9ߍ`@͔ q,9Y|vNQ[T 9}FΏj nybyt\)^)zW?t]0/9 !{npNTǀmCnOȟuyBʓqaD.ixF.4?}U)?B\~o8|֫@j?C2wن[ ol$+O}ڲicң1vr$q\Vzv)[R'R J]$3 80)eXM0E'IPXxIKM^y|,;iܓy_vʕ@~9IW `\6 &3 y_$c^N$h% o҇@7!(NI(4Rq σyF>p4,;@@)o z$`'2jGΘ/ecj`{ȹ<|oieU>SX5?>.MysZN;cr|v 7L=Wd/Lτ:JVh`6Ztm-sz~&ŷcU=LkBMjmmFѪAm(*PZ?Ȅܿs~α2!wsk ^U@H~vJ(d޽BBdW9P%މw  =,_a!; jĥEiIvJ}A{"Н4u"N8~ɚf^B$!ٛkL힓wx w"|6MYK}K,^ܐNڛTig󮳘 Wg23}AJY;HH( S(pw+풆8E[ˍ*6*U s7dd.hK3ŨڮaP2|W$Yȡa@ sq,)p>0 ,dfvw֚h t?޸(z=ǟxYhi *B Rx#xԨVduݮc9!aƒv=sf{Ν,sN.O nZ*~AtJRK,|ACm (a`U~4`"A;;E^,x5^Jq4 ^N$h# YyIiDSwK}ڕ侥 ~o9["5j8aG%~CRǨ^ӕEf|욊rW6njItF`t/C +@$qa`cW!">Myk4V̒pGQHrg>tM=ٰabm۲zbBNw0Uz`Pg4Ofσsv}#|ZaJ<| MIaTgUI}zrѳss$E)ţ̳wd^ˢV꭮stTC  B&ڜkL|gqm 쐙Yi0f#H3FV>¢sOcҾxB?XI`;#9T H⼵S, w_5Q{loqud}(vy:nVv~l|~|y3 QKf\n ." S$iRDCM D O#4zeH(n'('_& OH% w @6qݧtY4L13f_l j &% qtGh:hi* rDkA/o 4 m032P#x߁n,ZWxlE0Zd06+uiΦ렊a_q1S 2K>IcHD({Dn:xvQx zc\xL3ޭﻵWQ{8M& $OW~Dud"sRt(bsڗb6Kh pY~&^pI(!#6)[dDxG[+E5* :h QjU$D)Ƹ<ӉiaR_rVQ;x{tٹE⧔'G~*; ;TQE@"*/ Pdߐ`ZU:ITyD%_~ ˵ ᵽk H (H)ڞzC_ @!Ӂ$nbwfִ*rLJhv>xq~bLyd@]'PqaF+UH9n>8^9(s|Hsc"qt1m< 'Zݏ@1[]O_ nq+Rw3Na*YQ^u!/:7W߿}(l"C5.~4GA=H PHH`!H nZ'ޖ3+|%cxm߲6*9$>"8[>Ӥ$/c c2t~m^u:ﭒF %Cx%mrzRJlrXQΖG\ӧ.@=SMN\I.2Bס7}RY-xZp9]0V.OssXLY8!p#jE[/ӿa 8!SbSpchwaZn9pBSdzaq)\6*,AE0#du-C!a=SSg )7p0yeBsmvNhuoώl 8 Q۱j8 GCH~\  m6m$g;#T+:{o_/Dn\DrD=eni<BVr֔`EPN=2. `PgmPV!?Hzd+9?E50J*`V|_ )b)٦ցhGaVP>0P> >0q>P>$᪘,Ll߱E: }ga'$t VRE$!<,=LTFRUor.Ϸ=5W:BlnxHFh$r2K. V9_\?uΦ n ț}zd/x&(|:CNv  "`|Ĩr˜hueƕ@wn\11a…1D0(ycsmtId2iϝs{z`p6F]z4U,Q]d jB{Y"Pku=ۆX(z{ !L0%ASA2t` .t{newR&k/7O4b쿛KB!ڈE`+4'ߴ.(wPx넬XO>n%qGؠӽLIjxAQzMt o/|ڴs;`27Ht,>Jl;ΤMD<&%2HEKIݰYہe|g5\ΘURVm'r&ܟzr|o{=P_6AyHf%yeMp2/5E͍r"-)+R"'#"H$I  $\r'lh?~χjڃ|*Jcu?\hY:FbO )DlVHl(N"-Wd'_JT/Hx$M<5yi(~fO@c.χmf[7v|e lAG"İ ̧cÌ&v&c@@<^)"U Fk+@n(V ׄbW>գ{/Tg̾:?rjWz_X ;5KX0OI? #erK։1Tj%\҄i]Q|7]A">Kޮi ήݵv4M|BQS^T@!mi6"[>T){_"92D0QXg. 1c2O!p'׭oFѽlN߅*³~|x[⮝ ;_+$(-P D͏Q@!(P@Uok3R" ,Wn<};oA_=Y1jr'= BVdZj }Y~}켠 0q 8 kJFP!$6d07ׇZT̠S5jk8n2|xnNfr-t!N3pL#D7Oz1>uq:‰ xT[% P enp9Cnafh%F.Uvu쏋QqPig&mD̾]ʅg,.lPz[Zgldțoԍ[<P%{57a1)ZY+;ju;C^#G /b!>B M z b`I@P-W*i: {c6&Yz :VⱡiM}po.ҼQ?FzD~&͏Au]!fHdz{1J<3֔t3RL3GI ??^ }!GlÀ`?b`/8x&Hߍo`"Aяbk`HhD`c>ʆ;iEyc2} eHb#%D~cM0\p"5J hzM(rq VR:K[Y_Y/ZyF'L;x0PB-d "q I# ³Y jM/j^6izѧ 4+)k&`be3 r[M !!av73g'n$OVUª(M 11Bfjͯ&,&L18K~hDzǗ/}‡W;Pr@+NC_AK6pu3_d|Evo< N '2@硘to:Q^ av#Q4ÿlIe_ذ{a6U(PձJ15({ž꿇k1 vd?y8}2o#rNL;9?= s+dZ~xm~(0^b0C,4uV_&%mp֟S/߼.7^rHХc whcFo>|7_6*˰Vx[Mh爨HvN ptn2AN5>c$ d?F4c ;~##qʓFyoad<a^- Cs>`B,J-@Mў Ro$ ׎9göfӺ-MZ(o.- @UnkmIىHWr䁂^7[DF龀#/~aGĹdezS{ۇ k|iN2A?:: ChM}_̎NOUb,)0A+p.Q]nQnlDZX($!!*%E@D44t(D! < r$qbloȮٵ3&)\,;;s pW[L*rPC0ͤVlP V~/YhHS5(G"pᄍŬH5{g2!^ύIAQ NC'2s,PoomAa4?%ើ/rb>rg\: [bټbzt!D_+n]=z-B:;,.{yCD:*-E0K_S4IA !| RumEN}]7f2= cǪlB@`x95?JC{#'|LI_5JzOwqr˃eku͍ &L^d%pb#6^BX J[؆AAN BN ?l\ջ=VuzͷjdUόG̊_-5v(V$yـǁL)C=I}t']1MPzz8I(vʠc6 %vCg`{hŊuFF7{F)TD2?]!75]0:f8=)R}նZ]rra Oɖ~np5]C5=@ Pfe4LS$IQ"2WulD n]_ʇo9mQ,(-Džpju2f2B{xlD`s0T:Ra|{=8X9+Ś^@q@7ߗ~&iT͈)qt EA+5K,6h,X4G"\c;5Hp%_uߔ!n -#w!ON׵q$N:Z/y濨9'9Ȗ q^yBCFژ^wLb `KM3{0AXcZ{>Of;޿l{'#c6|ű%x~ MhX[} ZAcH4-fL"g4{3OW/l-oײ4E8q/'M#DR Q _+v >6,v`@@Shp=s= e)Թ3s=uPJ5g.屗 .VC{Vg00 A) hM2=Mn $Mz[ΣggK.²TWnX5U\^qT#կpu,vpG`Ut INM cKv5g#͸\BTu`I)sl6;lKvXS^G2^d޲fRPl"su>o/p=O) BjאpoInl9(vCo~mUy)`0(R2~'I#XHӜ2Mol3Qt+^tWׇoaXJمh +zrE4u}w64 bz.cD6`0 P{kG/m4]=:_idk&. Br åbSQ`:h7"ý>~bl"H))ȴm ?ҋf.ͦ曞^km7IƼ9i9Z\zlT1Pr\ǠS Sìmu~fuBQq{/:n8LyQr]{sR=tvTbL-Xc!{]SBf:*`܉8bjIm^;cy?}~L.oA i{4 JTӜ{Mm?'"{9؊ ݃g>)/Ǚ6|}/z Vwʼ^VrV??p|c؅7M|{K"ĊǻO"z"VOXixT+vtީ(0ZhNYpƜ YHE_Xxe-)ЛI1ܮ%\3Ʀg^,dLSox&0<3;dl6ƚbQE*xуUGx,Ck[lٯdgG!Ғ&> ÆG*ysPwsbr=wv 9!ca拱b)аʦTPgMf=Kr0EKX`Mnq} ۾B _$+  v Vq#h4R5Lvߡq+BvpҐՉT|Oׄ=!]i{At ApicJ pr u<~)C> "ky)\qԵu F[SKe0ɿD4[dߌ %$سq^$LPu;}_g|7`ZUDEe)Šߖwjuhy^I6ʏvd6:ikS|z(YJƥS3'6#p]({vOfhrp 9$Dn5wlU*>?*˺/#9K:TF 6aܷLcSZ^if4#!(t5Qv?^58ˣϛĀ=r\Dؐj^,v{mBGYپ6l8?2J(Kro/c+_Wp>]:?#2֪Zj*}Y,=/vB|_Gjvw_egۗ]͊ALfwv7 ,/#7͓ >7_C| vY]H槻jUIB.CH{꿾yEs:f1#ѳ:~5?fpg%m8xƾ`},lFCbC_ d8MNaFKsVdu|Y1{׾m|gɡh,Q3%p8ݗċ=>1ʘ5eln g1֑-)߹5, [%p!5^>h&&n"`\G?Bm`|IҔipܦciNNur}|NbB9㽘a=>6.uysV;9{GbO a~͠3}ֆ A6wP-rȩ#'Z!=qXX-A=T44{Lk8v.FaA3|`Đ@}],2:)X?\v_;[Ce@$-GR>w= ࿤d!%ڄԹPtv~>^7N_ݮdw* /AslUvo< t>zK R@NoCj ]Mo@NIڄ@[(^JE/\TB -)Ʊ]fv2GKr̛3}@@80oawP`T>>ԙ?p6:Z4U#Sg&77f7 DQV_ũh,p"xQuPr/.:.s'/3FP_K@Ú4F(TBaj}4Yu+ (jp4^DxT~2"ct]]j&de(بq-4^L "T\5:cZ&ZS $X Iyr>n7T/~qo/߸ɻֻ[" JGr kq/7%0!j3+H3Tx=G1ȘxONWa/n(=ėOwh$׶:Î M.hm0Dt Wj1_mo~B (фj9 +7oF}?lųv^{ky]l5d_:3|ޙs22-m[j01卸(w{v|zͺ]&V‡K /I H?pg je@F+]V'惝̿qu':p<1uYP,e4Mb?<2 yʚ dyZq%J~Yn²:C xy#?je\&)㚀@EYׯ1LL,~FG ‰i=@ ɞSM9:*]wiF=ץK2ޮ50Z}!qA_r91[Nbǀzʀu)-C}ո?!4zp.KgVHq22?kCҒSh IO xox%UG1d$պmM.J{}*Ƃ!ڹ{ U*~E!+x-+[MyE>%/<\ X_̽S4)caՃj,m;{wTnN 2l@^`8/{ ,n(8 $oq>pǕ`l2=-O7YY/V D/Vh)=#A9/~SCno|IrU#p +.7;)-zzY9[iq7iFNqߝ62*#7!rʷ_>;%@T$@[y SH˥ˍgܟ?wQAxھ{ =B P :(-#M: Hi@!".)w%̬JK"N|;7 :mV 8|߻f<G:}8hF,v {_V@0թc-щ&1qXQ\UЗx9`P8W,_l.w>+:zBgN z@TB֍Q贻O*f0qR\$V"I&](Ijd\Z|?O$dP}Jo?v(fE s Z1DVc b [!(VjtX"s1>|UAbDsWVr((!Ԋs'BY쪽,ףj<7A#tbZ:QV@_-Pڟ2 t~W 1zjC RjHT]\{hɍŗaUa\X+mOWhh3̓b(@ p)YL'-Զua>h~rLo|?ZIou^tg70ǽ;UYe+KX̝sɧÎ˞#%!w@Cr&[ݮM ?q"TwA[o%ڨԎWOq Tpfd{X@^Zpy"f=Υx.3)㼬< E?/{hR ګ# RB`hk*\hZ'T47!66VBeIA< -'ɿަ 7/;vچD- (Uq\P$M*M{7qvvfy}ȼgO o|yX||4+.?<>zIk=g:ai-Ǻ5yӳHܦ|L@V,.ܘ}NURx\?(!*^d'ړWMgE*C'ֺxgkH0m\ͷCMGVy<_R@?(Ab)yd?à*'U?ƨsB D! &Ge058MxZ]ۈM*( %73\D/e`8a.TLNװqDt2XI~iRhAzF0:XQavҼEd' 3?"y@Fa 8!jZ^&J0C*|<׹`r[PIcvqF~i$j߫GA7p)^eiGCq`/F^ȎTQ g 9cko:^w=Ale^X[Q }}SX6KKX3Js>G}r(I="F}YqߘbJ,xq&fe2S|y-?›Lfhe=0v)~ZeJQ?$=;ckp|f17Hj(WVHRk)8!a;vzBى9X.$<#C⮮i0 ڍ2 ?q"M&1xVjFc$bB XalFu]9}>O=9ys6'./U!Kfz^hVH86t=#N#zLΆI%eܘ5!Q. !Y$JU:@:Z{'`)r~`|Uq6iznhk+ }+ %:y<[1O ć?歧Y 0uaB+F&TiW9W)[crD ^irfv o '?AbH`lhM6K mIdPUVDhE "m[?UiNlq(T,(k 5CΖ9/~Zpܪd>8Y򧥰> 9)\jPfR0[at PAGT-BH%-#E߭TNwlx:.σ?꫰/IS; Ms%G8$1:,wi)"4=9tQ7Hvp't!t"<59tf\tfUK[ gtw|{E9yE%,zh"ϪW 4jeuU1%{Dw Hbo}Dڜ@NM4ds˩nGjwۨ8*cS5Ľ\{ / } " ^'hJ`cĹpE _e}O_+? @լ6E3Ik:)H(- vUJܵO! ąbqʅo /BD](R4:LLΏ{ 6 f=}ߕEwiޯzO[?dcet; V?DiD0A~ wNRd sez9~ӨQp,^}@@!\9 v~)ܭ8ڻ8F)Jѱc $Yy,<Ռhñ)3(mw'H<?r_u{y'0`kxsWcECmRJc/$)CtV>( ަRWK Geg7`iL#Q?>LupzLuogAw AGh\פՈ1,PfB̭uxf1[wҫǛƯxe2H1>D d0Kr Pd(Ù .˦@aRgYVfwS@@Ov<'4!"e=FAJzPZBKHh;DUK'{)?n(և7vR`$!2@Uuh':۸] _+'g_1>wY}vٻ}ݪl}gb2$; ETe8.A/IT=Uh?O|tg]KOQ̴SmjIZ@G4qƥ ,L kn\7! L;E'ι9Q ~o*6Ȅ`UzSMſ[s1V;_J3 uXBDz]AͲդ!QFX5FX\h1 2y~m}`gU%`itFvPLp opa\+@8^@b<*a|ɰVW9HDe&y-<}{ +l_=" eI,ea&r)T m!T2! ;Yϫh#i :͓45Yݪhl4*1f!ZB{i~L'~9`LVVWtjYF=hjd2~_Bɡ !g[i&e)b, CCd46!ё8V"ÐnAb3O@2P*wM3;U'a-m]v?֊铈)1rS ؆!Cq(7IqP.>E(Jp{>>cKn/cJ\FoT t#ߡ ,S-##_8:-SԀ07\q!>Q-UI[l3o627-"LűJݴl'",dBѴ%Gdi rpǤH UB. .\)(pH88؎-KbI-g1U4zy y ^P^*Nٚ5}Q~b. ${Zyu mU 0D lk\ 7<J.qhe]FN(v˜:*S"IK̓A.Fwx?m52.+g/3nKA3=as O,EE6DsD~b)d uuH~jCKR L+eX 6TL-7r/Z*$ӽ(k٤dw?sGR_#2߿.Ԃo㦶Gj r ٲb?ĴYLEAoG9~@$s~_3`r0ێ&vR DHU t XB!!!6m[H[}_sc3v hHyK=>\@7AD 5Bi0g [wX[5 [PtݶQT3 J$# Dȷ3:.߳AӚ B$rդ1gOlG 01QƔ|CP)bʈ1a_@핖d>0[r~bc<$h3bcl m5=OA-Tc+8 8dHWFQ}XzypZy)t:粱4^ SCd ,"HU`\r&uE&Xv2QP4Jr .+yzFؓ-b! ژ:ȑׁgd[UTqlC!OQ5v :\Nsp4En^Ա>Sq9o|-mR98`Fs4Ya,vȎ[7o'D,dAuO! >9 "X v9 zpA Hc[y[׌m2N\@H|OZ]^vltLMOӲ$)VXc$FhBsU ~蔫N(;懖߯*^,_K t*/#ه$X3E;0t/@גmYQOwPs-=MDQ{:әB), $1ѕ ƅ MLdqIQnx BTC I)AfKDnw9wr92P`-|43=xh,Zy#K>׿PfM +#m0"H9,Sx٣ "5_mҾ,kZXh:h/K(hw+[lfꅳkky;u1ͷCyhdT<d&f%{~(6q92eIk5=,?U3ܟVݭ{$"I{:lY 5]o@$Z`'09P[ n`rƩx?;f.X"TKǿCiC}s0p#^;j!^?ecaЉ `+=NP P$V P4„_&x!T:$L7=lx*ϥKxpn\>'ZXi{8KM[8J߈>26#0"x&&hۇB)L~s>y`hx |U=+ߤtV6xxR%' C+'SYutS {1o P jvbbqE:( w.0h a4x{i}eQD_][n@y84 VTj-@|X`AHl?RVJ:7vN$maAw9}"|`52SX3NcVkqy6 b8lb=.\ L+`$b!)-K9E;RҔ4îダz@ҽڈswȋy 4!)nO$!1j~=7tDyhIt3Iб !#ëZKVx?j '\"FAiӿm"B~1LP i|EײBuG41f~1'4;ki" ggf:)ri+,|Mte q .\ B& ^Ι3T|{;;aQh[ rDdĠ *9Xբoɷ<3Va܌L: x D/ )зlk5-aoD 3 KCࠪkV|z4t**!u](tFctE`Whu I;o<|~EUi8Z>/xރV!\y!)KbGž%` b_{Sp^E'\O Ԍ`wbg '8`Q0$$LJt5-Ydi?@80jy<`Z]l''c~g8[oJ[mrz̩~&*SE.=i! C,ϮVm5MO=l=5?5|L̬{@t-~8 3"CRr&Tv.?͢"חBDa1A߻1C$NtϹ&_&For(D5緍Xwf{o}k%u1LMlAWL 7E67#.VD2 '!ɤ TD~ 흁K>!ǹuƖAU| .VV֔1z14ҿ .*Us k^0';mzNW{txG0~B/]FaH;b'mzhaLQ0!jO#l!uePD ai+Q),&kN j$ Sn9'ΟmvΌ[67p':SX Ԑn^!`cUs.5%ɻs_t|&G (w"o[2?i~~ $ EQg-!N4Gn‰K0Ʊ# 8b1d`4 R+pgɽɽ1<밮2rqvv2]<@x*EpBL!nۥD*!Y79 mt/4߱S a@T%-0![X/9tj&x~lӜ{tM"OMeĴ r]wJ|Qn*:"77q nKFJ=~(Wlrty"L0=K:~)v;61F%Bn 5u{/`,ɲk Q$ϫ Rk_e t`%hfkl'0? ؿW`t xs̻/?0a]A~$9uh k_}0ן>e30d > ǠP{履y {10?%.wsk (`V"\ЃGarUy]+ߏ0Ӏh`Q0 {HAtzwi4 Q0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`ht(T2| \xX }5(`A w6 @~o 5 \pBnM7lPʍ' `eZe$f,KM@1 ^Żu?HT7@~K+]שlX5dpx+?4fc5UD_u"G"sI9TDLB(,Vg~0xEazݟo RK%bkX2mSd;UyFD{jl/Ww5w@14o"3c@D7Jw@ 76fȽ< oAKS.]~}./ 0x8JZ+ 20p230dxkZQ?#p?v& Tб. ˯\iP<c=`EAspE!a2@]1qCSt{ ߿a`񆁁 ̿+9?l cV, ρq, 8W ߀o@'}Vb70ǟ@u+ M^m_I"I<Ͽ o/eX)T郮RKIA 3܍ LL Tmpghq3d0y0tfV~ܵQ?3h@b^?dX7ZVQ0@( 㿛i1`QPqs,Nn $J'"]Ph'`'%}-ژ<*nb8H\x;}3CwRB>A`=Wǟ=sW՚ĐISup\7 b#1~ݴpZU|ku^ϟomv'4-F58*fVJ8C¿'r.'ceosܼ|k!W+3ۅaf)9.Jm/G]^!*PvIF5J~&K\?扺ƲGe>˙L&"BB[y3v(cƐaEd0,jHο葿q`"c.o зE'uG/L+*2\\M +p $NZDX{ 1Yj?um_mycs6/ɬ|O⪀:Le[Ypѩ@Ǟ> H˔c m @Sު 3CXxtңݮӫ5B!.m6k'}XT~jxW}QQ~àό~Hy|:0 6|XoDǟ ,: FB&|(3C=12@z>fL[\$k=~V&v%@4 Cۨzс^w?w. ڦ4i66Q;$<{}zG}u!@YyYs AVWyuQuEEw(ݶHZ|B9L-`y3ODz9R1.<&&D퐘{vOr7dU¢c!߀W<.תXD2t8oT5<ܩoHWԶX3/K?f. _[_pw.MQ3=v1n+mҴQ  V,yx6 x]@"UQ)jM&vlx̌f?sYkG㮗_KkP%`np %/* u/  ?A ~k KvBY>o+mT)b$!3O/z0AϷQY=dCt))fjjpOQ<D1t%ݷ?]73]Wr=fCƽvfePO'[dZ<+K Eǁ-뱿bdGgHu6Q{ȞmZs$LnhߋvƁujNW fِP>hu"}Yۍqg7fcF}ElQ ;[k]ȋ.;WK;$tjnՎn+!,G] Di)LFn1 '¼Yj?< t ^%*Ȃ/>9\u"zXf 󎁭Q0]P$}CBS c2 ~Mm*ch)zzsى"骾߆{qn\dTD.pŚpcQbt#( !c0Υ{R<@'줿?tu%f|z B$,+BhW̹49J{<@ #!җ8~]~Kƨ Ac=\cz!v^`JUPʄ՛i ,1xdt9QGI=0Hq2A @dg/*}k͏X/ ~sG*[jnKP2u C3+ /!iAA!@GۗPEi<7n,svN"f5ˮdc6 094:vSǻߏR#-PC$dumytXˏJlju5Ɠeޠ3|#/ v<6F:JV B&T'vyY3\vϖw1@$A /̝Mhe33;Y7&MvMM0-JXJsl=JO=MEЃ G?<P%ݖvmiMv7_ڛ !f}33|eab2jLCW^.OG6X`pD0 }\jopg8f-Bo:?!O[!<;Wa>)ue~I٣gPB.,GQD(;$nſ >;ᥱ`^gXmG 6SԱZHcGRHwV|q?B6Q;;'Z_FWKg˘*hQ⍂vC0ĠG36@ %P?F4Oas_$K CĴ~\wKW/jw?S20@oyzˀ.bkXT |cu")h*>\UX&K'гvv7ElRݶPy܂>c_XxSYF.14|yf-jHexad(ɂ ޴lDqYa:5y%/c>IH ֳY ;U6Xs;>,KIF>ǯ弌բEm/M` f<=߆IF^ xlL* h&?œ^B@^^ƴ[V+iƠa7U4ă;E>ֵI J:̅]o[X8X>x&]e#&İC D>f Gc%~97!b)VêqGS :U9aK''9d=gr*S1װQ^G8&]cN!+DVOb/tVd؁[&QC"uN1B$~_$1ߩsX{{SkX]/UeE$~" Xą_gS4Y3;h9$}LͬH-xhԾXpY+h>!#:E_ "bP\JaCBI/V2v|ll-av n80!YokM/yN{Z)tu-d 41 Ģb_$oCn 5@}wlcы;^~L8ei74)Lҭ3~C yuA%eGS,8j'jVD$<fu`y(~fI_/em@i%VBy@ݤ\WƜıi97W@յyڎrc$5!lj Nwh\r5"ع4*#eGag(գ"#p0.(([Dv88x7~,U~\?HE PD>s\0)oI ٩nv;n8(浣rs $'CQ|g97>>_ʉgns¦}`ŗjy&{:Eķ`iY3$:k}b/2Q.rg%J $ReD#?vW^-ݎ95LY?]v/Im#lXp$_NF"ū.YG 4ƩRu[ o"SnOc1tz 7{KV'9 )$<᪯|F<z{ !c@nAQψ"̹9q^H`'>Xx[_ r ?\n@8/ql'$8PZ@UQ&<| *T@B4h4M9)+ai8㜻{3&Cxm3>2Dg5 Y0NO >;'ώ#ɵdq8q)TF*wybh6O^Dh$~[,vPue0CJ_;Sź{_8QRX\9={/9__7pA} 34`"'S.zGLxH&[ ^vLDωe?Rh T<*2KyNKB̾? ؖRTEƄ<,TD\w9!^?܋C{"_r U$uP &|;Va%!P`taqLn毵+j؏ՊSfIܗkd;8dcz{fKPJLw!?C7$B!Wmp! ݦqMM Uݍ}Ư.Ud A䛍s'YZCIܭ^|2柂bT0+M.V3Sje e?3r2~% ۇc$KGb!TA3NobjwL=21I;&DXTb@05zdv;_|01B;ZvHm;ݶ`(0AG| ?`BGI'ݶcUTH,JRݺ9nH/<ޔWc"D@+ΩNn:7"fY51b(bia]C݈!^j  CT1Λde\}SPV>lnlO}r/ &Sv&05]pY+59]:lp(`;҃KUdݦ&0+4Fz$SI,n5%m!7#Do s0|5_]NBQ vp_)Хe M T ⛯Xids{Z;Ldzk@H@xauyi8MJB9H19H@VNOZtɝ PހYg%J+Vͭ˗׈a5 >+6m‰ G%O@^- CܣI b]Jaur,ڎE 0ng"*Gb+ەu5*!GJ u2|A|k Hph{'DWb1!O6`cn}9dX)4{gaĩۛy7?W!ُo9Z.EA\sZT:8` ,E񱘋b@̰:>NF[ћ8xT}$]*K^# -^{㘐 zQ+hސ*T*HH< Pj;8xJ}Jk͹}.50ljKe@se;tOтn}qM֞Px 'Pv]Wa Pz:f N_3Y㸞:#sBĦ'KS/1M4p̂6 p{E[PKS`|Nʳ;׸ ]~]$IN01M .obB$JFDw9u(V3ka>A+Z iÀ1&bI|$g"uzwiԢ2WWv˹V_DϕQc80/h9JMn3ۜL?q/p(lFŎx+Nm|F9?1Л4t0*6?tSlfC:h" :Az$θ.f>B,Wbn2;;ɓVXQÌD6?W{wZ~ۜzLbZ^mrODԎX\X<qA6h?x SRlH(÷]{T:?@6MׯⴴQrglr-cbKJk0PJgߤԷFG7:[I^ ?QrG'U+aU{gPg Bf ҈9M7*StAܑ`;thЃN .I(= ١kx+#úb;qcV;= ]5!fog*yU!*RcP"&%m_3/|Bg4L)~?5oQ8襪7dB4=v%9>5UE =fptB4yDeSmUIŀqʓuehiTH b?db苦J RBaTN!~ԝ#}Hqf^4Ҋb*f80b{h >dQ AHE堟 ~z<-&D0&FpQq>@y/vgo2hfN[_5WPd紌i Nm²P1([L )aJI ,'Ǵ(y؋=e`8,4aGQ6M4&3yA$9ߝT%:ض5ݶq$НQ+}9e#H-4ޗiXxEwB$X =hgGBYM}Wϙ|អd+tl9Db( #C&8l Րj~ҸE$!Wvy 8Me:ryO$#J:.?Td-CWю=\*Jb=9!آ#D^]ebcѐ$BχqU`Õ߫sH/++s5QK%|] ;s$Ld~j]zA>r&)G&N0"Ad0C{j@U]і/'eWP3Pq&#{KO@\e+*UP (Ox?W7h\4mNQ 13}@ yGqc3>0b#NQXX^.95N_ZL\H6wlB|LYq3 `g]2'y h~ oN&]?kfε)q&-:=cx!qPpEZv@DRL|M?րllx-J_g_;{/{@7NgS{: HA gu[V 3Tq߆BB Yݜy?KM.|ZǓS4&tK}mZ_#FO- ۵6 :%4ImBxD|,/<@H*@6 \l̎BR>;;sٙ\`n׳ _:бb<l'tGTK~7W 5NĎ D J*q6/Q5hݧ8?8ӫ $*]~J{h~oy%;M| ^Zpj~{Oi&мf ߙK,m<ӄwβo V#-D>bHXP=AK*X)vXKnvxs mH&8gG ,9O&Z$sgDTM'!X ]@UbǀJ fSe!&{5W0 2IUDu̧XxZ;|G&L€ DHCT!ETܭ0"V=@_1;eߎcHgtͭwp\o ls5MޯiU!B;p AH\+]րMپJR:~l?wp14Ĕ`EZoV8a86~s8Wto_x& >nkմ1AU++xGośJ1>Ҵ6!v]gv 2y~3?Ww=W#@Vabl aT>`{7Jֹa$/=!BF-* :xWsO:;/:3o{[Z:V<7GE1@EviC7H1RUP'y),'0 ,ߴȢ|Q)5X~IDwONpAvkh`7ه-lH@`Gs1np\R}n MmJ޼cSb zDO'+GMS](? $( bD8hB`%@\@ćivi5c &0,1CaQrSs1IwhTL-dii2nKSÿ>qAqKUHeп|& jh҆g҂aIwYO/Bih4 bQKE=s"Yb4l,5F(+!R_JBA8$V#h7YL$~p,W_Xe}|ꨝγ*Ajq]Lh le!9y*L{,'5E $|F(G OA50|vJ]t, }էˢ9˳Hߟd7t5 a͇.!^";}+&dTυUWZyD;#Dx{3%xZ7>h5۴*?mv'q &m8yz@ƴ I?RW)!igg># "p@be t4.am ҕN!*Bm0ɿy l鮮|)u;?5'[+3P}Pl15({=DNDPy  ED)hOy%{Z6ˡfX\Zq~P?4O6S[?uCW8X.-,` [Ib ]۫e:0%Q>r"ѫ#eB & Y%ޤ*fN/|4K/''84K(~I1nY;vbKId xQ[휭Iާy*a27G◊. ?X vM~ؿy쮻ղpNoh:p<MhbY_v!) H\cYc8a5vuYԅ񌟙rze[dmvc2%FwvΥz6bY16E%#m#iV~Oh0p$TӄGR<<ԜY갸1;76יTY=Y)hr~ v;R˞'?"Z): :ˣ3ǜqz__n 4E;әw RCT&n&.E㒭?qV]0qgRb"jTDZZZ:0ӡ3owĤ$ i.=s'pgCx2a[u]6 ULlhI7H.PO NwyТeE0{hD5gfW? {V"=$AM$ta_t]z3|A[ q/Еd{!VFï8"o14^"+;yH:,pBCTd2bin.fM`+m[ğjdldh`7 d!Z#O1Zqxlָ7/Gh' bHD]ڂgza2]Kn/N7+=|kIo `UUԥvtcPط/ƕw'%AZi'&YHq7B*:8S屰jU f嚕R;Wx(\h, qaz(lh pB`@诂KCi  1/HTqrG@WKj51#`x-G*CUA+IV}۬׻ٝB@l{$$Ý zٓ]OG=C<a&(pSyU<$`&B L7fި8iYIb5hiaLLNN m1 " rFw/)tI{-r\k~۪348Y)%h:Q SuI|M%/58f@⅓p@ fAyPLS %u=j7w경y5@ܵ6n&$mLkR--m)VEXD ?J GAQP&M#{9{!B%13gO%}DkP6H [KOg-Z@X:>lQ6F bAȃҟ~ .Tl2ŝƻOQ_zfN,W/~B+?Ȝ "ˮGȹ__;<8Tu\fQ4ge}S#4o hà " <,[pL*/(`J]fð[#*na2bjV66)T`Y; !} 33W9@؟ ÎF m:)] ˹&r^\*0"/"jp]?(΍ꋇ@+>is[` PC1TA?h MoqvVQٚ{&j@bmb9닌zB'<_8 }t$xޭLR7'rv2^='oDC[-/IԠ1 &hD½;Vn|ln ӖZhvt<߽cZ6iLg}6CsPC0pV|,OvBU5!*j`>[Qo8;ucgW:ׯˡ|zY '-ċh 魒d{-4x~+J&4lP?/؟!7S8(o_YW#6u\hzLv$TfgV;} DKNnY]A2!Y2fRyU}/0+2?J葊AȪdlFEgw7gF1j)U;M+Qn%%tV׳| !p5G <9M::9 J7x:-Wj}Row4<(AR2#s{NtbbݤDx | ?\\=Ҩ5BB!x?,lk^[jld2_Kg,( u }}Erc.v0i3;ŒUR$5Nƒ@|UgK@k؃\K_~ z~ufMg LCŞy1X <ה!A#G" `SX0Ō':y*J7O)bnॅA l,e3J֡[zWx3v\+``8<A,T_"[W 0@пl&T9V]OB ''Nw[ޮ% t=c{M-B" @(w , $p!eED"c{~!l"[TիW)xP_]O{e@eG-yaCk$l5_3Ve7>3a2qM}|+:p2ϯ{;6ߍ iw_^r  *C NwB'h*qo~ȉDT㙌hLhqZtdF?'~!EzaNԬc# 5_d*ʽC܍1&F,h}CG3u`:9""@J̋Z3 7U`1||TM[^bvb±^]K b'}7x F/cBp^&EN5^DLyXB~*˼ B"JŁ/Cc;4weKBˌϊ:A;ENHJ f0g.Y^=O )4[D8MJ{͒ۨii#uͪ~噑-+ȯ C(fȗSBE E{e8V;I*I*>_NTܳW+([x- qLnt+>2~hGJpo$( آL䘻2K9՛$1vkm c;v8WKBEb ;/@,P%6MUBů̹sk$H{s}{gܗ Vzq\d`e`6sE.7>u?H_2=; 1Ġ/qsm=w,)u|2_T45!)1!oPbyאG'j HuN$_--w])[ GNW`yZo&m]TkX,U)\$3~CñG|H 2C[M?豠@319ep4q0W7q^x*Yk:]!/265y'9'DmXPoʎTBo]!P(ju0JHM: 2v*" ˆZ^VZC'x\u,"E9YN{;BFo|ULxDɓ ɔ1[s1x4 WTN\U*! L}h4iwGA@Up"˅HFpXhFsq>-]6kn}rbTK}ȸDʠEzVR~ܖsrQC'*#Vaa4 }Z;S߫[i*M+)ǧ(u}PΥ%L?  =ġ; gzWrZ!-#{$.(J>~ ۵6D331R *(Ro>+ԶMs$;7ggAvmϜ;*ʟ#˘ t愩}: pK~;t:݋qh8DGhw'Rm|R7b|[FYِ ilm-º2:_^A nkeour{H6:nTFd`& zJCq٠fxG/Չ JNӬ<0Nf͂kW~3N ~Cs?yAS "e~|@u 6b7Nk 뛜ƳYeC}L?q obf2/'h>C*B,N{W: 7h@;Qx}HZqN2mS fbD>7,Scm ڱ '-bh$L]: v&~bba 11 ʂ@*UKKAN=>Cg$dK2{=OvfqTYy}qJe2(Ǿz\y#GB5v H~`[c:4%;'W9v 9`ҳƊDæ<|W{m-/Ѣr icI@A! 7 1(LJ'sASAp,: O< 9i&Lipe./niЃqo|J O\ZTg#!.-E>%P_r&K-ܳFeGi JD!%]0 f=`kǃ32 Yݛdy[hꂈ}]Х]L(5֋C_2tã|J&*J*^aܟztsϭNJꙴlӺ'u0(BY"?7\G:eQ̧dAit3PNy(:]}b;9|F*M8ۯoaˆ^}ee pxQ´`FJ&I0W)*!Mkȳn|`uiU&hJhաVГ (}NRpb)h0bB0?LȏrW[6qcf3s}Vh`X~VZ%+1+EB>o|/%l?Y @qϕj$8_w-MAxwm'~$MJ{!UzCBr+8PO@H B$mڤ/3@B!*Wsf替zE?OeÛf/\ ;>Ϫ|I37*5ڸLnݜ {8U *)eS z&zN!yr'Øjhqv/]ve[GS?iݍ-Y$M൱IϮ(JS9Y ש,R#U%:a(jsfNC` d+__-rp%̢;qs' :l,NR|6kX5T TG#y@W)) bxLcVnpWo_ 鞅'N׋LY8 M,Sn~ 00c̦u3_2EiXi QWjR$^ Fa!OtV?}=q<'w6 LF0Y!*Zo(bz1h c ,"bX+`,*”M85=$yI{(?pny~$"4"Mym&tF w]ޖ]7`Ō9lql=¥wcB">zDlUm6y~u.|jEjCKGŤrcC4gCr놐b_}:B2g*SE3AP񐱙I@5vEg~"< ~Y 暕;"7:.â#]ȹaZ/㼼縯hGtH !O -2Ai&"`' j~ۨ˻[{k;v) jHUR%!9q -'N g*qzj/- Bm%Ipq} d|{3Ϳ2"t&kw~^ ^,|f-I}܁n'PTJ@F'$YbM8ͪD:wg},"@㩱Yٖ!thرN}r-7/~tWylW $>Om'``\k`cdP@/KcF6ĩ*v&l̫IAhHg9Gawiخ\/}z3З\{<TIBiA,HGd\zE{PxߤPG `&La'Ӿ->ǪVw%jF׿tsk+xV^-_Tk储=r+"7{]E9+Oɝ@$JAF#|%™zXɐgz6ikSwQ+ǧح]׀'vHT,`?,;G@#)'UCO-_LBYvP~K 8tDȪ:vpA>|mKW4Kוӎ~|e-` +kVذމXadYcsetІ%05aJw2#HF3iH)?Jdr\QK3gi^[i>{}qSK4krE'thF?(CpAb&ʽKyhB r|,(H W}OzRXo_ڱo\[r?+j̊aJ3ވܩvHg1+3 q΀>ȡ3 ,yΟ)lVa*O yqN<4}FUPAV*!Nb0(b`aBbT -}Bqc;/6Q+ut{*)䵹r7msZ Esx! tDרڟPHj>2E!$umG;T>s,_Z,?=FjP5bi`^Y+Ð tpg+_[fm /tovﯾQj4K¹Kii%Ycoled4]DtdHTKJc$f]^ƨpc>֑[;1y^>PќMv05TTRՠu\LGowD)A6Ją&F L:ة=v$Qe;N+،MCmE;za@#WY>?1)g4dW6p -7 5dz APAU_C1:Qjx97=ñK.1[Ngީ#}:"(3Ʒ7q'F>?\&WR{H 'dmR+rl{oiԙ1i"әҙBiA-B#%$&J7lL?q_h֘7qA J~@i;3ڎu $0l'979T%~^yeVsh%كuDяrFR)p]t{>R-(L#*!P-Xh)h܅iJ Iݢh9ܘ`69^ ?%r/My~kW򺮼~>^^6,_#UT5JMvQ>Xj1dT)i `=͎@8*mZYJiۅr=f3..K;bcOzc1/hXLS'/hDF9D}mCQBi >SIq\x{FL*K/1 4 }tKo^t? )|тF: %G Xދ&v"L {(N髕 HcAS]rR^7"]u)3>-պ1!^ONoEf5t9Ddy*+:_^fi@ B/OiU^Xg{ azp66] +VPG>X2Vg5 $/qSHq}W fOA qM57+_z늒{ GחG^E=͉fUBA'h0\ Bhۛ|'"1D7 Րu^]119RawcU>DWkn[<Mq *E*iI]!H~ɟ)ۙYM C{޾u[||Xm llXElߔ: O*+2!0LAI%TN`_ףxt'q)wж8nQ޽^P W)\h0\%ӖLtԳ6yvYc.Lr }cr!dC" Z;;15I i~x˷/5݋[^5 j1{͇mLb38uRo[GMŸN>^Q4՜P ? L,am< #6⯛ Ȟӏoӣ<4w$ ̿"@B,͌вӐ*ͮɜcC_nèkbkѕ'e%ʉmFgbsMf%V"h*XZL5b$QgOb1ru#ybq+ t-,;ac9qPu{3W#4G`vuϢA33jy3B~kܞM1 G۶t`T4 {M& k2sTs=RAȕ \ݨ)ȖVP/DىQni0+/We)X*tKA&j]e6k2 9a 6}r0FП0wMAcCPP H4P!Z ^ At4N|8gw.>i+Fqr[h~gʼn ߊ(bɲ7i_ ݿ)th<= S&? N` $p>$N?\(zE>Hdj%(nA7=a?Re,xvj&5SH`Vt]3Y2a` u{iW i{]M1i?}Y˻y+h9sSt=r4H$J&igH{ [&<~ DUVl|v:݈L1iRR1sappvzҩ9Y겚-*2QY|S|a~ycy3ҨѠ(2bJ[^s>ş0t?}ɷ+ѥ\&X3-ƱaP;i$]}ǂv<EGYp}RG-wVFnq*/޷N1tt͍rf鿗^%ldӬ|^y^GNY&a-PPʟbQ[p PK9fFbe3lo-a#Lx}k";2gő& 4MvVtaXb/ߵ e٪{-cC_]#@ )̌Z:By`TʝKpP-8c|k[uWϢnn3V⿙Ku:憃EV&k <˨P'ܶ_gS姼Gx+dMվo܊g:`&ܐhhnJx&폗ܾioMX 9oDE:b6L!n28a?Mmp(ߪOEPJ5uށ' n-{ UkM]l#89TԚnyvD?5qC kRӕ_hlXmx?#:eݙ=8<[{Իܜz =ca,/SS~z AYږ?_ųw긌j0y 5VZn̯*ʊdNCm7+ k03!(sr6sYJQUmR82c'cs{ٳRh%|/^tSsWYS5x#yβp4o|Z6:3 tR,k( ,~D'YןauiG[Ǒ?S}; T*G{ zmmlrmi%( M3^NNsX(qe4gf|pnId%T+\:.^u]*h-&ZE!s{n֯X}u S q:HWΘn7}\ _-dL h<. | 600MA\ =2#?Fi;_X8dU(ޝzrxfD V-q@fOa2Ը].AE1@p0],y<뜅 -/B`]>L|beFhvmmKM渽X XX@Hr.xZQG>!ҋ9l`ph CU5jtxn#Gޘ$ĉy}Fٜ.x.S=y/@@A|y3\8}{j4.DKG9dgN ɜ$+?M W~X 7o5cR^-Z!|_{!K8D\ j*ޝa}߿zo:.SmPQdSY OF1>/&&>LMx`RZRvvoФpr9އs[H^XF['ꊪTZ`0 ,e쉕i|bۥDMnK ?E'31,p"YDs3,k>LT{z|q>U&d0u=8DfߵQߩwNu+auE`PRtgJDu2gki)089ZCZƧ,\5Мx?$,R9mƸWC _T5^mBOz..wiƙVTV39w!݁"z*09S tq5(O22(U*2-kZn'xI2*cS]چF'5 jj?#&#K:kvk%VS7FXk@ 1"b_8t10|p/!:yxUX= y9;l>TJ?ږzFr߁P䄘-\D\Yw-xzA[??{A>aR WX,o+#('EV%̵_{>e+O}m(Hק? ƿ7'c7טx3dIҢS6wC?bpxxB=ĬD?yuWl?^(={w~0h*F9e٘=,<%8~^oYپƩwE:y~(Lϯ?{9~)!MbǶۯ 0;0k1| ۇ?$3Y߿`<{ Z u49 F( ##5"{ s206@,4FSb`f ~3_q7j`X12prGiN?I?7vAfZlLstY3&ؿi2̷/`ϐ b0`Iqcc?33Wqf͟J_ç 3!JLq_+Ȥ-a l32L>ϟٙ^yZ߁{! >k2Ir p2^&1[Q6{s˟~gc:j-(·^ ~)nvYQN6.&7|g\#Y2-uRPRbT~7g퉷,B,r<{E^5wˋ?ciPz}0yEYE s07|./}{LnOc8ןЭm6 Da4iJh%T6- +@x@l*EJ@@PҐ`Ʀq=p/ޝ3fk*Ǵ@ @C۹ '˖YmRRtޞB%~&b,ew_ `5-(_PG"|#b)X =PF;ăΧUpc3 obbĕq&Ɇ7 CHҖ9@^*8Dzńsx9%JhGC"Ǜ022 L-؀8Jiz_&}Eޛ<_`ƬޯjvvsOvpl5?zG ~Y \}ϳ_zaUƴlGp0Mp4$snKC@C?«L @ٴ6QL&3w&d$qڤ1iLZ[҄&P*B?6.HE7JDp;ApFX]Fl)hh$ǝ. / ~j _MlJ`jm4k5JwRv'n[%=#ļ!@dA jY,Óf։pV"]N>bcjOWt|ӮɂfM@#bpNE ȿZ_d{CnAt&{t^YfY ]UJ`#&8B;Kl3w+;L8S(N#lq"BUiPr>5`Ahręef/;ُlhv"J5\}R-:xE je>2A0͝F@cX++!w4Kǿ5VkJq MӤo¡Bܑ%.8TGBO ,ec w#HqxZzVj@J<|1p[/{DBɶ\-iX(ԉdllmp[HKҐ>u۽,З7Yj8d~_Pk.MQ>\234IiL"xօ7EDt%.ݻąu!-Tm2idIf&sD8}8gO~Jl.NbfDPV7 6d&^ԓHU LG[r复k"$^h2?Wcev{.EQSUP1VȟHF/NF8&; `P@ Z}#zk{^,F*O4P*B1fSS$, ;#=f4xKlH tU2]/@ҕE_@Xm#'Xd\txl,@~112u7 m-4ŪNa_6:{+iYki"_g:}LiKit-- 4h l] vp`0JbL MLC myXNo=D&]fwww3Ln3 GC,VuBX\n%!̻ r5.k<*䫴[@)oaၖ{6Xu4q+@"D+q?*dXc<U: =CM4=}'qve SO Z_<+܄RŻL9|旣 z@(m!o@LJQ[KЁ-QZMc N\X`R (G<)OGX6,6Y|~<LOStnyBaOЙV)@DI xL$ @!G5<6?ZcMi_QvƇ\OGFd*8屢*GC"_EK!>IBrۖ^S^ً]Z*#=m c>VovӝYv@v-#H55 jAa USDlYqPv?C-[͐Vw_/~uDTREy:x_!}dm`TC`wBr9,%v }L,*`;;L͒!`JzI')Y4Q&l-E*b"r@BB G. A" 钥K8Nb;{|VBY~}f?o/?H).%.mkLh8`/cP$[tvF":,5"fI\ V_R2$ePk)!`?⾉v!B ͠Q&QRuwGUK}-:ʒ ;,;-쓰=6Y 89B` hUTNJNlݴbN:Cn[m%{ 5 f x"XVcN}eDB4]BE`:{:Ե]A8+[z@Т>~w:?QGͣW9' hi?<`OÁ2v~4h/Ҙ,>ȕ-;2kbO_ŐAloj{jɿy4F_/)'HcV7v>qD'#B&5IDz8f2Mʼnzyx2&xVZ#g]MIṵoT)10P$T@DI+j>"2|TcH$ј\G Ъ{yHMG;K_ve*ZY|Ym g~5͌5֌,ɖV\%McjLcl%لJ7ݔn@_}_elII;1vKdY4=7HA;袁;w.N r?|~[ELy` zgn|F.XAM T `QK:'2KL)c@ktۇ8Ԥj@,p`ea`G`{pTpJ. \׈*ϊb7/vpJDn C*u! ,_AE^iD4 #0)O "u-jMrUno[9ʆ%y=Hmoo4nc#ۣ&_5`N[8H`fݳޒƍ?]ϩRSez8-|AMH0, TG/F5"InXБLT2[q*r!xq"<3\e&=258M|\ПM!NXވIC簘)QAa@)o1.` v9vdz;q<Iڶ M=V߽#2TK9MdgMD·<1('*Q+t \D1[9׵yӶgW"J۴4puQD d\!#bLJzog~q&(Q~-jÞ×jyq+:P%Դnt2t08 T)!#8c0c#u;|5Q⟁ E)?ai&ᎧMvf c! .'6g~{$qB(hTPU!!\{Wwz*.*AyT.)vznbid˲~JmCu M+sѕy%mM-u!c YAi $^["eP9(f'Wոt-ڃs /55-OU=uKh^`~*Nrԏo?D}X"3fk넋f~!ru{ =3 i./Q%V68N{їBWO7`wra+`Br(qJsj tux'æoiO3W=|4|mS1\X{?9Xùx9+ԁKXGvk^ B*{J":%>tk"I?  Nz=56wyqw0( t[>|c ^!)}"3:B%&|确[яPZ(T]S!70=c YN}9Qo)6O/!0ӍP3F+ԓ ?C;m$%Y=J'Ƿx:+N 7B:/u6/Fs| N9)Sp=3/mh'Mwp̈}e]r(D1Cɣ#V4DghiTJ)HEpA 8WzG !q@S QiВ$8wlv Qk-?f{s 0`!8$6W _r#ɱj(2W|忘vy=]:h[p/{9;-mf0+*;W#"!U2.wmvz#Eok|V)Iŋqz&_w3h Hu؈5@3x}LU܇9ȕAvvɾNQjƏXt8&S$mtJ%Džkp7R 'tE:?'9T$@h\0 ]Dd5QE[KmcuakGe kR %uNUY"7uTX0BC<{GP+tW:LfڃX4 NqbTqb=\lJ1|&핈4G\ Wч{̋Jds@Ahl&\DE y'`'dszB./bZR'N-DGHc$FtA+#|m5+7A؝noΙ7nfc+`簌 =41!.?hx%2uLk|>%\ (~,)Fx]Vxmx_/[b7( ;s̴eZJmVchto\;\W u nڦ% me A]k"29| _^'iY*dgQ! 1`.GA(U,l ~aA}L&z^.q "KMk2Kb|OgRoxdqXp|0λ==fa Zl8:kAdY)\,dhB3ݱ}Ņ$~}V+mgԲ\0\1Ơfi62zFe:E0Nn5: EgB2y_RZgmc$ ; ݕ[ƺV4p&!bBu4@WZTp(N~ r)pnjāS/6WQPМ *kﬥoE D6‘ϳvIpH|\ HRq+ $ U49Y*v^dk`5S)8-Ơ[CQw!qEk>IE*uV^NzYcc&C8uKyyf\I=pς( `\ ~~6AΉ;>!. |?(?H4/'J/N%36߇)àOhG]C or\۝јXsd+bT!?DYp>HiktO)1WDL;3mNi@)XM( O( .}{ %1&! B+P3wƵ&$L|{WR뭂}^$U젵,ޣPZrZgsf7*w'F.&ݺpNez+ Pn^L* ФD 2U 1} CWI{8C3{ q 0_*hb3RȈ՜V+C燨"P 33p>Ð'Wim 6)dY9ΚaZ} :ޏLyYTe$a#e0Afe0L/܊5vZ*B*Y:8+Lcpy'}_/UJʦd/e-I]p_/ɭ5olăgK;c{/Pr+) iZ%}BruSbmW>?Ul\!2MzׁβxɌ&gu$ c2W𓧫Ӓfby@t7q5e/\rrS(`7tM-N̵*S:ݼZʄ:6\db eڃ--C,6y|au&c,eq;܂f,f:,f VLohvoݦ <^M&iڤJiA9pBȑ('JH*#&N&ve9Z%o'_]ymoʵ4h0Mɑ`"07>?PәIF񇣏(IKo<9MtyJ2VWmwdiyY .Ҟec6rbymBJ!LG|~<;+ 3a~zҺ20 - ma)i7rl>!g`=]U`P`g9a bdX:iʁzE)7|:V,8ahAUK#0Ahj$?/.lrIn ~:1N[#+`ݯvwI`A?JyQoan>'=@u:Ne2:*}Ax]W.Zee58v}1̱J񯺀)Bk'Cc{jʒtGbu:)Ԑ72X"7ryx6g'n U9O^.pҕXa"zDd7&9$RhP}aQo 2-8`;!TZ)}9#זgCa_746%6`/muYdR+g>5r|93!aݾp sj轇_gL27+M?/j^LP>O!VbYv4a#IKDD v \gu2ƿxfR·ͧ<N7BO0 N 1H7  "ّ $jhbaxt3^;OR ۼif=nQEիI Պ?vӏ򗽶OZmĘ(<Y|yHA@cx<`#Pѕ3+RmbfBk R *N 㫙ሟ3edѷ-aP,Rqz=v|Db$d^z噉6n $ $F.ym"o?t6mLjC)Eɏ'GxӓZ"EZj[TjI6rgw`!L&a޼ߛ74F=6>njME;BŘ*)xDhÒxg@}:?G\CE}Ljtqњ`jָ'|y*hS\T{_';R .Ħ(@ xi`ȋ90U!Ո!a,gd$3z$/SHT{ {Hݿ9K꾮.)QHrj1D%(ˌE}Th`7{pw[@o \eL'duL86(^sh DW169{~[1Ăc~)΋}{ n}5H$L젞*fɇ\I"^n%L@:F 8}p:(94_"}kG?g{×[M]}gB粺)g8[ t;/O7)ĺm?A#HbHe_և ]҉5X3Ͷ:O=&t\1Bt!m1t ;,.m~",1Hӈxw_wLNԢZ=rIMg[eST ˳-ƵY<Gih);j6q}LrX l6N#sHF"tmwb6+W)n@x%$6 Þ&]l(M,a {ypYCN,H- AwLW?G=|"SJd||C Ag~4W*d"q)B{FDP)3͘ζCiuTl }!oFˊ=  Zvu8i mDmZPKU* DE|_ #E)JKUJA6w2`HG)Q3s̽sesᴚ}k"\@5oqL7 rZw-Wbnlpvsim3[MVw?|!]^ rVFE;XФ: `fAU;Cm on$ZRŞ_'x|x\2e*#Wo WG#kOس bK3<$yjѻāpH~5lz^=`k݁ERi4~8UI8]E8 nٿB%Tj~9HD5@ty.h]5?c_gX&L{2 {B=dDY߫Iտ"/{1ggY% 8nJm3Iۜv&L2.}7}3󸅿Fkoõ$)cl.u@tg(lG9[}l`]2IT(*hr6/Kt3Y0$rM)삟0$n-N -#B8E4&I'w|pc6uh~g]w> @ռ6DM$fc1iҦBKك/?g=T7P*Mi 4tn뛝xSYXX3o}̛rr 3ƇLIK/ty"M 6ONi$q`0M RV* _iU* /y@iCjhbK) EHCFMFI,9^†^Dg@rNM {*a1inկLY$Ű%Ey lɐ#uȢ u!W4wGR̓7 .@a+Cas8rW,$rSiqo-\$ŷwOh;*.; | R F6nhH0Si}ŝm'WF4S{#_NLFsQ^Z{uLRBq!`aq#5u?`.+lcgF8I%A?tܿbfO_-Mqc=m[}qE/)CܥWwQ8Gu(}I~[%w5MQN6dl4Iֶ!-BDhԀoT/?ko"A b PDVtm6goxP dvgy~ؘS2mmCb[$ލ$E^7x 7Ir1bJQ^c ̾}wq Zykh]nL sa|#<"c;%\=*͈2#᳢{*̌\8.l?`P WE 0h^ntu:&qRR% ?+p2OWܸl_rf>)q86L[wdMoRN{8O6 ʜXd`,q 8}֓$2綐R\ה{m_5b%Դc>baqd~۳p!> Vm7pgk*p,F П{&19%Fƀ%8WuP"RF@ryVfШ{͇ݩ~TV1] DQ 5cGyU \J, n`BNY~mt"A)( B l)5ǼoS u6E?$5=3G[R ))1 4 !v0w&!jLaKy$h+$%חBK{}]:J+k` xCǡp<[Ħ Xx,BF}yGȊ{Hl⃃o`](%hZw(ۚSo>|Yވ#}MEbo({M_ї`%oгN$iz}&74pŖCKcHiT(32q]ԅP2..$%K*Cx㡪!6?;atzrffTJ[7y `hGb(E ٳl =)* ɐ6_z6 sq+/]Nk&vUձEN0#LJˀHYOe.X\ Y/T}R,,C6!q5PVV\| gSޮei ^!QB(]w{6?B!AX% x$JI;|=w:"!/X{>S^5^.<}|!7uѱQS 7XN%szF9QnXl?3޽<x;_=YZebv k=m<&_6$iwx0+;5\{Ld P\b{Li~C`fwڨt" <>PQ)gE!Y9mdKp&s\וmXa ?Gz)ӍqLSH_`PBv0+K!!3`c.?,۹W=9 7iϕ %6 |u9`7 Q4 ˴&szk2jdna{J}7 5)EE #jO XAǻy.V+{{ƃKsmkc{[F}=@-CJ*! )T|_rDhYz=< A4Ë^V /:*dЋPg3e,>Lo ǐ0]0OhXv> wMQَI (EB `abch; 10 $6X"`UH*!N/'!J<{~W$EV ڍ++SԹ tִi3LZ@O $vUݯ.0[xt=^lvMm?p8tx_ qSJGfQ6Sƅa"/]q.5nKn?XNV+OkPhO 2H1c0A2(+.a fTJ)ȁEE~4V:Νl;0q= 5IT3@y>oked? & (0ڟ,]{wo]?Ev-賃*l|$7>-ZKQg iB޾–C5X^7|r74;QR͗+eͤS'?-brȋٍ51^Nbx r.9n=M۸v-/e|(@X`)#3mN@A;{ȋq* \!Ŝml>-ðWbȞԪV9Ó/XXlÝ kᡱ/:s`#gB‡#1N _h,t-<@~z\l?@ j[^K\RKA_Z?EwMbK11mUXMK%ܭt 1pBٙggv+5M1[=[+EC'1z3Ɯ5 ~ݗ,OT6G6p` G*؋)@~RxDZf}P8GgLQFc&%FNM2T\POCi~3 ?{eS w^o>?O|RRZzy (8ohJf!p.1F!l6r `AmVVajR(@֨]S?Kj4lfpZV[D4.=(.kj7Ѥ1@0!ldDt*> ԏ]aa?x}tjD5{ ?,ﰶ":xT=2ȍ|:IO aa=`K槉(~t@[ =ă-?MF=pċ'L*nKvwxWcRv3̛Ͽ2PjFױFgvk/^P7 ]zV<1GO*b}'Ü؏vs%.c|F6]ƕ+BW_V.ܝAMW_M!ԃT (B& = aR.)vkh##W0ȟ'mٻStgn\ GoOvf|*Le /ntt> *FHB q`?o Y]{4;8K?VVG3s( ڽE8&8M<8yxoysށBݬxw. qQV Rwj;agbH @ǂ'r5VvFc=zmT<2;f";Z س%._ۃvY,7& Ǽ2(-˶1)U4l8JZ.jlf5 cq?7A0_ӨVS$Dx{> /OޝmЩAeS!T.Y; @ܵ4D3^X^i) K( b|? M$1!--Pj`gv<ڤi2I9g;2>@ݍIΞc?g#uɢL-.'ȅ84),ؼb&;6BdGlMC& 17g[E!/}?mƨn sD.p1&ôɄ f(*/?)@5{ bq:$V "Z_7?'(ǦoBjG;RC.-9 U$#L#vs&=p"_31ߊ4WcKnGtm"%l#e殗mȂ݉EG6U~S9gN.̩Dd#ܲDdϖ ZtoڳVUS᫽dW7Q(0V*E0#7x+9W~y26(e2d[ $mpLDa*&# p>..EY]7 ?G%(iNҖQL$h4$ĸ(č@pbء'qҕ;WHbb\I.1B-30t|ںքvӴi3w3 +9 &M~F$}镍B!4N>YE4r2Ŕ TD>!= ^xKn*İˬ؇;_#gGzb/<@O:N~szȿtt =* #/܍s, omy \ _&Y>w]~[;o\~}Mzo$hU2Pa{JZ^2 I+όGӎ֧>ѯ[ef<#YE,QTHNowɔ{h1}Was& 1: JU{23 091O4x\4=.JcCrM٦Uu#Tīhܻt\i3RLI P 1H QV;=FrPA}u\0FCP嗪nO jޖ\ .twQYf@y2CQaj0܀$H΂f'XVW q aZL!V  qVWJ1[$%oHl`H_"a<!^g6J pM?#JOiYj#hZ?#/Bx_nݜٷ6?ؚBwg9q` F&[|mz(H?hTt#8SE_IQ,B'лUqBT۠HjKMOO.h8u{Ͻ8H` cr,/3 s="Z"K|X B- (HR_`tFe8SoZ/=e]'w#_tO|<::,;:55 MGtKfbl^ 2@PʨwO:PWE$_5@Z.`]\٧QMoRZB3G ~u]t2Z-(( GP& ?r@q?_^rd{{X >O&(](R)H.$&&_DoLT. j_Zei,-inw3+=nofy}veؠ?RKN鳷^{)j41oϩw"Za]) #Z~i%v`q4G߽9pzĹAPKad6Q^#G=6T S: 2.Wi~*ښ3v?młR؈{n)!!3k@T> W%821>B^YX";9S?)ȝ<^[Y C:ؗ/'I3-PҔ!~Pݰ:M LKĘPChVm9&[Q?t'$A 1 uaP9 A:a2[5jzTI_zi oϻu]2;" wm 57T&=1tz9<7.OSd"}8P\P>9j%);qeƻ`C#{vV9ELw>LpQi< ম,Ka˩ yKobШO蛰4ߑ<bCnbo7:µ̘{@4 q9]PKӢb*V8$Mt:%sDL;i;NKi ac wҍ/tָpe|D !, *bВږag uI,Y{=I r6]atVh8-SCC5?:Nms:$BkZA汔āny6ԳІA҂j1F¬+d]3+ϑS5~h%Ľ8k8Fu[Hܤ̸o8U>fzo&M*`{lJY-Kԫ)jC;4cUe"+Qny׃]t/5Y|j9??flwIr;Nla MFcYQ *FQi BAOZ 5vTc lD9weifg3~nd~gn S.j){1,Wx8;FHZjfPڠسÃɞY7q;{0eVZHۄUaL=<: w ]nPH4 Zڊ2 bɒo?v_%bPQ$ $%SiIɳm_`[_{ϻ F-ڔ., 2YSKS1=g\p~Z@|NhÌT وvDl>Eݘ|zI5x}uמJP'ꍭ-'hn9Z:rǻpzX۔< '1tZMO^~mX)x? LX.(k 1 Q,0d\BQxcZqcKl`c/őxշ6s;<__vD`$5 C Ĭc}g1GiN`p=G{u/ÚojSwF+h϶bsvKدP*d ' Kq*@cC}Q,i>V%jKU(A b|'s4񇕯q88l#F 7^oИx70JcQqءvkWX{{/}|/I_MUjf װ0ZgxF' 4D"Lt1ʝ:+- @S3W lhK/:ˠAi&ѐ<K!+8?/X@0E6Gi7p%B+]B_.O`cO +Oqå|;^eA^8c`# qy)6o-ST*LoP^p}:f7HQh0>0f}sgsp+zw$ի\lq`YntrE;R+m(>~M=FpPF( Upap6%ab<,CIwp͓sk6,O\rFj.+3fAUnD35~smNp:5G1# R5pϲGÞRYb 0FSɂg.c"@0i&f+8#5w(CNț2'x+eOw Ai=oZvktdI{-*7%\jk_XwC1$H(!@phh|0`TmXiBo[[v W}>|332s?5jJYu<õU+_YPq 4Bu$wcIeȲDah."˚vZJo !RU^Ykw:3FuyHz}grW#~{ Ms{u?[!L J 9+\wa>u#/єht Qʃy[V&E"ۉՒ/Uxڼ@f_qJj>zVΥĆ(J9Kn @I|#DwRIp8?ց+ST6S.'ic8˽܍WۂI j}>jٙ]D.(0 vbt+&76wÛ@|ڊ5+ۍc2<.D#$)qC+ N#_cLA0ggh-MmtsO7M!,~7/i]Stf/E"glV8>;dפhc*^}7| = ^ ўno,R@QhhN4v :CrEv$Qy|" $ԴED"jeKn/dxuf^o6\l>_ٰ:-Aכdduhgc-Ê3̫IfT><G\,Ng&L|ɫ-w IT" Z&*Cmܾ:^!'_AFȻj[Lw5V w5 ş;} AhQ0 F(t4`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(NRxDٖ,̌l0>##W]Hc /_"Ll: -I.Fb͒`Q@p#ɿNbzd`;:}o۟4 ww_{32_ :n69In^BcDŤ`4M+W@/pR]Օ7n-ҍEʍԶ 7iɹx#0bU& k;LD@/B(кnFSaTiX6TdGjX6xR|@D1ݎpj-ֈHD!$98Z‹cZ3[n6!C*}YjQ?Se1BlFjcbc !"K 5J:lt\.x՘/0>~Dy=>L0jy׺s[wjHJu]o$an R*Xl6mJ)ploYϗޘ*fo?-JQ1JÔg"jgzv>wwV<@AHrcgC^O^ B A;ڮjvg;&1o0Ɂ颖e^/lO.C‘*E%Do_l% 0$C< l|c1!=B6)0O9'a8mY90j q/S`~aף Y|XS _g.(ĐB@LGȏ6MpK,*xSozN>YY D-Z)ήMƒVoy-ùqmWO5;RZ^o)e!蹚K ݽYܹ߮OUg\/4;@!9MWʩ쳡R^g/6ZD*4-nj2tbҖFp=~%:#U:/|g%54Nč&qJZQQ1*!!uBQs0J!!"HAƍc;] 5G:}@1f@TU>T#L=i~do~nFCco4bJ2OMOFݐ.DٸKʱDBP57맗&3_.h UIb8[R~VLU*ѽ7¡.iϝ"D?YYL̬YŖJ!G   adAu@G@rHilLˀk8LH!x &~^M1`6Dد.L3a׋CវB 9I![-p%4qܳFpPϛAq YC| ov ?ɜjʸ1`mv%ýOq7_eXyFZҷpѪe hb5 &m&s'<<=SwYMIS9\-c}pW]\_}v F,zR~2$OUXJ fb~\d0,P w>Afn`Ck=ť._v[si"7ө>l)HJ$ !c\h\ҕ&&N#qH ")}3&ԛd/9C%=R:"' '= Tj1hKl}/yѱPPko2Q^WVX4.k_\385"/;CVֈO=3+Wam5+.ha۸t5h11e*^[Sҳ8?kJsQoX;%Gu\5,:*)%p,7*lu?R} "< QL@dsFѽY:abky8A9(&3MTI 02$s|W<]sΥ*P΂+_;CF?rSw4NN2W a73%Auq^z 9{[onPb>(҅qYn"OLܵjxge Jz>(;s>T/3Fé6K$zد{CPt6. ,gU>p|vIߵ'y/K[֮x^HOvzn3_cFP A ?JW1caAo& _k2@78Ղ90eGEV:9ȭ?@Vj470Y&z1:򭠉U= o,ffI fz *9le4Dx~bC'8Ƿ1#fg9yAc/pa bGPPjj#s Y^})uAr)R?^x#7{[:ۂvH٘8?N >áYfeC Po5=MDQ)0`A&j+q%Q֍B ra.hD 1X(-mv:yN&$x{{}`RRXv %܍tB Hp@eBAe,_ )[ YI2 d|S @X%\+o;&lwF6f!PcSژAO(EEnt4G0cLjP3R* J~]YՉuymdsAK(oh||plJb4Ƅ?;r~ykb5ce`;WJF_WF [*`?N.,MޔCkZ:cKܗWcv\*I ~"*mxTn<3|}NhKP9@P~qw44\M(ߍR+?>G1 ,4lѓ畴Ype*MP5P>hcwl$]EpE 0X ~k(((0] O11uY(|ommW]n뺭! L@D & |0g7ߌL_Ʉ$##%7C{;9;wNd 7a{(g8hw_YX]9қFƥ9t BθnuB<4 ʏitl2Sӕ3=ypt_ңNFw8FLtM p (d+pWVV@nvYNԸl-bEc7mPlz,gL.qxtGX;:g8L\11Po'`q! !1v#kNSŏpuJѬIT>%wQ@!hD߄nͷg Vb@4B3Ai(C$VшΙ}tiyv=7=Ёm•Pņ;u 8H,:) ;oT^?}h-, V1)#$DceIw,.87MOɯ RH9Md6 Oh$. 62?F7Z)C;Gl!1jp!Ʈd v\T_s*0o-=MDQ̛v:-:ҊV@4ր$,DƅWl.ܹqDW&]cRDk4kd;;MݵFYpl8ԘXT+Oh43#z`u;2-tvafJ㵗nYaל6B;ޣG)mR+ Г _/O::Ha (h`j3rO{.!׈ܷ3B-^$=#d%-g-.ac,-@]pA!`s_Cᔤ:0dUCXHĒ@4/1՜Ih;u;ޏb٩ gfvN_ϗw!>H/NĀP/8VU>(BHszFeк)-%U.-T$, ~"ED ïy!N`a7`v 0"0~`tܭRSSkcS;fV`[UC Ewq1 1&%٠ui%M( rH! 8ٛ6k@U]x08^01> ZR&$ns2>kYH@sηg~.f3aV|Vޑkq f&,}.řWsPͅSSl*|:|9lެ|bBY>F'1֔蠅AERt7zBG<.d%+IˋrraGg8{ :,vM,b4 ! X I$?a&7]-2 `}3]8qwg@bٞڌfu: 3WE4ŞԳ"j.؃\.XI)w\#wKWxSmM8\) `S܃>K1STn%CMҵP Q}ۏYh}uST4~mxsP_‹P㞠?4寮C({oXuݾY]u'P-vrU a5Y ]Y9`9"xvO!yeSI~c:PM(5%RH8wЪha[Fuw2)2hcNOh.q}ޒؽRCR &E0z]vFz3ޓ vA 6 D;ď<4 µS`RaB``Ϟ 6!q(.Hl/9sϽg:*%|'Z+ŘE74 zIOZ"ˈ8DJ0B%4n^{x[DI@ fM[h?\nhmv1h .}cBV<@+7 1ȊfDGe`>'^`^CHm^6zbOL)9pw^bǯ?n%',ky 1Pl\Q+$=? \x%*L'[]Ƕ=@=`>e ƿBvGT P@ ~>pV7`tN[ZY9EEHl]V@qY"Äg ;feQAz'mݵc'NR) *TP*=xp g8*T,Iۻd7jRrXb<7?o%h-S}ҽ4Fz8g_BHNuFN\h1Zc+0: *q[GI@l`g{;/eP2 P@8i̩- 㧸b`=HƏ=^s6|m_:I9T 4d46fɌWH_х'<' {-k'Gymv&MSi cT@p{`ny.n1t bb2 iCVWQ>=Gy/H )8+w,+~*!Θٶ/'O ,{$GU𩜱(Ek uvaڭj/jJLfYŭjCo94ȏ5D?Ԩxc5~d2տ B]M39|~; Su"/4}qc%7H A@h"JS hP$:$DAA$ O"I rbrwZXV:(ϖ|SmB]V}ذwIŰ9yVޅgj?&E|Dz rmXllߚ~hA8Aep j b5u?UCdpLQMaiI]#ĶZ3q192DȖ} :Ae`׊mSmy?6eӟ+>vly,hݩ7j&爆Ez%v A`ɀUepAx?p*xWr&~HFu]t:z:Ll?Hg/zFe O*|1ʠ ]SƸ,z_7nݷ>/}_>NB<9IIv}Au.vsN 5F5@{?+>JXWqoPo\|?©T;Ą6&HX0 P9tld5-Q4Uɶ>^IUKWԀ0MxDB"N+b@xV~hi)Y& ]<р@>K wzMx_ N`Iifxytk dLKO?:%fGה_^h[ٵt0,[]3j}"'W<){UR: [UH 0QC]IUAJ[W_V[Y^]Ġ/Bd[ɿ~QG٥ ]XOP3~A 2|% |05YĒ4}$x8d9~0<jƄ@à //wb`V?P yT*% fk{1$ya#G#^^V`nf#$3@[V 8`\9IV d/XY'[Yn:'' 2ebl*Y3CDt '` ,Æy),؝Jd{*61fpOS46ӐgP-7Я܌ h&#gqPk,!aN~f~O$UO@P0vdcmzXQ@=h?Hu &o7Q@DTK0딫|<}t=ns4␓eWc`YpsUw8: d@L@:V J D>;tW5b|>vI_ivCO!!K @+ˤ@|WCҭ m_Z,@@ Y^pHwL޵r9@7([](P`i[)ԶbDL&w/'/^z0zj؃?bR,o}{Xk4qI8ِy|W a1Ԁ³H1IfG1& .S e@ƁGDz* JNR~oM}V]~U\HG!= ƕ df7zϽQ%z#M*gx48N$?_sF/8oas:*}m#4?ZZP%7 !ÿM;Զp?_Cc8.C7RZcoW6>Cmjx׮fodhb<=YN{_byRY]N;6Dғ ^ߔܪۛy^*k]уQu%s]:>+f& hrV5(cUW\:TjW NSl-F!%ύ;FH;϶G!W g<2~{M!ή%~U/Ӻ?+)KdPIST6OE ~k3v~  苧`rniJR]L'gA1*v<DS+П|oZǞLCz[^N^|yƭ<) @ܵ4Es{Ŕ&b@N#qc6!.uڈb5ʦ6}Ж>RsAR3trϽ+Pޫ)T;pk ޜ Ox+z>6:4eun]n9h&(Ze5L4:\?yUr;n /LD1Zz A }jwNm}M2}Q/a+0e}/[O0n:X<w2& ;-%P!RTf;stH,:@抛:k~y C0gQ뢛NJ5æ K'}wdv<~P@~ڤHʶ ;gLmaxTs i 'tpg2oIs!K¯#`/"b*~:Um7s7ަ vl'61$MJ( %P= $ ~ +z 7h*5"P'v{k9Jdj켙yPדGr\YGM |\?Kˋeyqu³#5N6QQvk}Q.[`YCq\_'5sd9#sI< 4|K3%0δh((om'Um3=$QlޫfYmT!As#=|󝁈L DnVz 9Ys;'ģHv.6۔Z |P}do> ໂ/> DqJ-]G5JŘOv[)=/||w$}^j PSJ>C&?"6T՞ io_+B7om(m"՛XF{l!< ֵ0fJ$/b>/]j .K.;;jj @@[7ԶP)F{ldX'4YCnA۝~#ߑ U p::/H0o].'^HI3p'aO$sm0 '39OU`U90.(XX_~K !Ԁ[4xvK#JЪ0P;[9J"#ɰ'-AcV2`YAGKm 6.W6̔D`>B ~!/P{d*x-K0e>c>Ĺkc J^H X8>s*LowE"zWYk,?u,B5.\}S⮯7i(ۿ1tdL3 Ehĉ3:aA2½ޚ4[{=s EB>۬ԝ}ymX 5Z9lճ 6xDbn!{<#*:\RU ߣO÷G-beCas3> /YkgA9ApwW_ڸ`ۮxf/ !lR/mx q0!MIS͗^Ss]fzoJ> KV(-е$Є%_'.b6#f)FaYet_*e^R^BlC,(Ǐ.L TW#@+Hw6=Yg~{`-4n4,?хg/}~o)@uqC[LU!qFb8[ъԅL5$U'.~ QMt0 =~^b_s#r*#M;]|HDdʋ|J6"v& <{ & ' AxHP 4tPФDODP 2c9Jpp|q2[ dvݙo;OJDz=Y5D'.#$DZxW!tx | jsou ` # ^81 .P$;S.T~o֋@~"+ ֤77t\,`F_ gbWU+;ODRXZxh;EhrVdԟ`7AH?Ineʐx7Pդ]Jʱ k3Q)2HA9{yYY .yݙkCғGZH L~雕ll =osN^NfZ>i)b`n EE beK8qԻ'>8`|u|?][+~_ O4:Yp:`2Y͙ۡR[槉 lR>&b6F<&z0Q@R. etvwaD4bL9L}{}6M)@7²j}4_9xb.3 >>VaKfevV`~\D\ SD)MTkYGxQ]5;z_nu$z8cA }FYOpiAEԦ>툟N5Ky& Je 1U#IH7ŇK;>|*_b@PeAԏ3kx>=~-GdFOJ~On(ŽM I,1KNٕǩZH۶W/ʳ/ѷ/⤕끢iqKJ-[D8.# 'yu 甶(Ne![\nKkIsʆXM&9If ޼;Rxߨ9dV;GK10~"֝ռpa<˥TJ?NrѳvxBMJʼgα;ֽĠ4&$Ml ?ޖpnF4XqH [&U:9T K';ќ!HtTJdXuhy3tZGԙ=ζJ?Y8ŒDeg:,{H»&6шm}d ̨F2;S%{/Yz*/>s†̊ DFo+$,}˛׭~0Z*R親"Wեen0ґ" !R~ɽ^! 8EJh1rVpYS2RjpU bA Lf~hUڐ~q Gһy 0Pdc;a N|DAcdДtZ.x RbrVw cc)79'GFGG:JYbu.pbqC<mqGeqH=dբo+S |ԉrpɞ}UvӴіK3fNen0/&ݺ $9:1=N|xzvt,WA}HўF0w-MDQfyNiIi1-HDEE\nQBڍ`Vu4&m4&md23d<73+QHf3 {=~sc{ʣtԎJsWppN]jH#BVh)D覺XZAh![ut:'=[)> /x: WVO;RLy0#_]8RZU0bQ; =JOh垓GtĀ]>]D'l-DS(YvV 8הz(R)Q5AA@>;%_AQ}F VQc"!߰Mfm,6\xdC'2H [*H\h* qo>/vEH.RhtvJdD6$VTo_)`ht :_ /kE<0?W=`* HBV, Q^!Ħll=/k};&d1 ܘVi)@F&q L`M` `Iz/U.}ej)g`GfnB&kt1_ N&V27Mu(XWV}ռ<IQQ Z7Q> SNfX-sNtǙGY̵>֓cp>!t^ #g9 bzoTc5ߩ~2j(yHБ}ZF/#t_d.s4o{{l0a ED_O&>/h a7ʺ[޶5aM4K|?;ibЬΦU sxD=Lj9Rf!0PVȗ6L(GA2 :fʽ 3ӉRf o&pDu֪)0^DŰN3@ 5i$@*Z{N%ףcqe٦ޒwp7t p; 675Y.dWNCm+ HvG n#';|4+e#~W71i۳Ҏ.ǐVMݴ䖲>yGn6nÂ-b;p5ďiL'=eSm"eD L2YY~q~ז3VfPΥwDhO%<?rk ,B#g<>>b K=V}M}2c=j~ZS5Ɔ%wZ/?_W2c.|{i܋;$h= .W:p@۱&rjUp3iUpzT<~  %E.sa 渷` &.bS S>u_P5gHms< {'3JEzgEրQMC k%0v ?2VB.CTH>Lkw`?i|IC3o(EOZc}_'v+ۦ3:Y{6[(>\Y/ ]^rvڝfohf2p>W"3u6όǬtLvs6@ Ҝ 鷑ZXtΔ(|Yik\3 D|P|0bb|@MHqckmlnhu{g}3!f}l&{] <"l9޹Lp@`ܸ4Nkxߑý| $,HyL63hFPIJą \M5g=;^אN:G} a buweBB`%Zb!9-tF;Q(&f7KM$<@dcة 1?* ϐ R˶~&zа$n› iQ#~?7+0={P+hsRlxuN*t=ycw3Ǫ1 渓M$Y5\WB+tpzkf-J9z]|Y=>9b "_z30`bLjM )/Jtᇾu|"x4&v{d}˲j4|+Ec5M3PmGC$ҁ\0.fN p{iQŭ8RY'ʮW?ľ/gҶ)'Ma,?.iyډ$偾ofsɂ3 A80 xoAn>!`唸5^˕jDjI<*P^y#jBq]eWV="&x[B*44h/F8\Ko(ݸ.~ 4nwn?)AID/0.z1ăx1=x0F" 1@h&H|B[hnKwpEI_oofޛL$0+IHוr@rwˤ fĈ,7gJ_>OU_WD1L̀l'_uM K;Ug?3I URK @!3L,#+]J]6D;J@hz[S%+wXFZP07Oegn*E*.߃!̄XF8ΖB+ofuYt=~[u7)U wvaMAdx,\d,g :L2M#qG"N S@ћK|O*oPYrMAOCEP DjBzIۉpcLttpb*e,%bphՌÊz ͫdnyp1"Y!i?YeY4*3KԴ[z-O`bQdmog8l]Sh+ 2+  pݲ,FX q [qeT"n֋eT+V;5Gb>Gow8|hc`,L Qz324ex(ъ$% Fi$+ttt89C;;FW E` 8;0=`/1ݫwσTA s3M`@Ǝ:Ej(ʅ"s5\Huũb$66ƆeefvfA#y>~sl|C.6T*zF2m96$(:D`{eu-%g72&KrzpO6üJHȑ뎸}sRsr. \=Qʭ-9?GcÿtGx ?b9Tc_o{i>ބ#_+\ eICһ|ʱ'5"4QOb؟J'$, Np߅ԆrF5#!ƣasuo!s"Lmn+q;wuaW>)rb?_ C[gމu4;Dj_>CHS5sq2 ^hz||;1Ǟw PtMUz.{wٱGX1/Ip!d $5<Ⱦ:';h_oK"hY,3 ԉ_ ֖oイoyɭjqUV&]U'y;-"\2lpq ud2SS6oLLOj>C8bݵo?2BF/[3%_>vib5v PzjfsDBG9˼R-j=wLߨ'hw+͗XʥmRSJ45Ȧ4zkvEp,He50 :>nEKTʦϭN fM:]`IdtU˛$^DӅt B!ǀW/΀.y3W6Zw.uZm<_Q1" 9E'!ԁ;bh ey%o$%#2c=_^e{ e;Onvy}'{AK`Yd9C׭Xx9DT+ #~Jk~qWV_W?kA0SQgiL23ӱ HN"59eZ$E%T%4hN}̑B9an::Ĵq0}νp @͵6 DQDZ]&$iC UTUnaز)~Kس/bĊMB[QhIS?3cc"BbW ?83;segȘ)M| K x(=nu%NK"m)F8U"A e&VO'T:t&|PVD`M.wF<>%)%xf _>Vt<϶XPcZR.K2zz )9)lFa^w٫(BuG}zr}!xfbeqjEsl4v Zc,&xA?4O#bPL~FÝV==굎\&@+w4f3յ+q]lގ} }2a_pwv;mPu&mGKu-tв/Q]v=.x=v!vBZ֯@'pQ|뫿Y9wP@@ Nmջ#1 TI8zcC`Tq/7d8 "u q#.fKftGLZn׀% g3l%t"k_{RNq4noV1c Qۯ6׃s;;uz!L˓aFV9>bQ?{QÒR_Jh1*Ps@WjE5l-T*E}mĭ/t OgS89!V24Nj z4}1'Cto@ H67- K7o_C_ǀNSȠv ^w)x\v 'Nd\U 3du?|:"욆B[-ʷ.rL:#, MzAp1K #w|DV{v3~!u0F*<xJrv=T5SMu𓋷\ @]@DNC|B10|[,BQ>-, \@SkP556TIFIf Q ށ W@J?U+{*@mXy.[ޱPh9Q  ɍ[^ 4pL $l_?c:mQ>sٵWvF܍E%Dt*PRj^RhRE  Qĭ X±׽aVHG:b3?7D=1~ԗ 9PXB %/)UÂRzMd&J|,S>+nR&uȰҧ %1cD IʞE1oif6k Sns@[Z"!,NdVܼhQz݅@ׁq"4su|R0xd GjT; Qڳ?"0^Ύ} ,RL@&q2y]cN{F Uo TdOխ]&H %].VWJ<51lR #{}k  o+ \ڐ+A7ghcE<ԿrLuKJ0E~ZV25q{2 Gw3 Xܽi'LdCSН^HLMIulZ;EدP{ NrGҼ pR7A1_c,~0Z}H1E:NS+0̵^-Uj)%RZ{؎/gW)s#Z'b,$~ä( {DJ6rjd$)8UcIŭN ص9F"w/`ki66Z Ng||O)k7κ[*Vmu[%{Tܿ ;Jo_:7 hV,H gcddn;P7|l/d $woܺɷx&~)R ?,̌/ kH 3p2s`k-"kG_>uߟv2CϾ}c|}ǹ:($T3I 7u1w>dƞ IfeWzy_pyIٴ7޿|??YA<0~TWd#*p;<]e2 u߁e̯ ǀό8?32Npzهw=vR? J?3ـ[Vf_0Ek(B LZ @3CF ?@?ƫ? , ?D8E^|{p/**jcb c?*"i%!$m e@mxـ~p X> `_( <&?VP5n6 DQzf3'5iR,@ThDĂ OxV$6*v )%Q3Rls{t'/jb&A:6$;8_ gʹp _u_ G&N~<\04>D- [IikF Mxoٷ% ,qApi* ԠuS~ n Py\#ou<54t]n9~g]F.B |1Q vL]k)-huN T58"c/x'R5_aTw ÒW(Y/Im5jTLfLǘҍͧFڛGӳnw BV 3HNIiKJΣij~o~@eUIfi[8t

#Hbn]30ĀH>&jz#lL j#,֘w{<@}DQ}IpD5Ju Yy7=X`"wLcd)Y7[CQ$ DQ>WÐ [OVŅjKN;?x[0qi1,^a#'Q' // ٜ h"&XITPH, [h@IeЇk%|ca;:][[{}\ 9gy*ߴJVeMFN}ʦb8@'yص_7͘yj44 BDA7/a3oE 3Vm㓭ڛiV !Ô3amkɁ;EB!p߹W:h|ZHˡR)ܥT"C.3;.T`؃.sWs Lʁ1l`IͲQmz4jg%|9_[i zmƎiI\5Q @H9p#G~$$$>*P5mIY?T·ۙ}3H5f-Y| M~UE嗌O2~Ix+[ĉ BjCPF3-j?x}~y \"I0N5k d[ /LRXo-gE)VŬ"Fro'H|I6۰N 0ec{ Gf&zދl m5HϗY^:Q" %Sdiי8u06 춻ps FCu3mx*ھU) ? ;e4=sv/(-őZ5ؾVK]Ĩ^![8!EW /gO>sMCQڱ*IAiҢ @,XB ,PfNXH!*Q҆J'ܛD/J Ws>G#dq7]TMLNd@mڋKe(.WWfai|ğD.?-!ao!!Gacf(閆;;g8!;lLI_z 9g j5ڪ/' ː ``;<@i@% Qn Cvoeȑh#Q"hjri±r5(/D]6;|nzjT{`S_5M?|< MplF g mGqriX]/翩fq׽#*˴X~7XDTOD[=V}"Ff5rx{ҁW3VX .O<Rp;[ʣ͏od$x;c/F j>eXOp_&ԁ>:xDwqc{ϑ}0ӏPG l>u@;5'\8y`h<Cw0rxbZw/q>jBصI#Ovei ޙ=8nӴ %jyRJ-Un ,زdѪ}ѦrN$A=HA`\{=s?;XW ޼gsEAhUmSjVE۫wvĄW`*`ܾ'X՝7lƽ$ݯAa)##Ne/\ `;+쮛Go#!B 1p)qWu'ihJ;+a.[Z@i^ Rv}PJ@_LAAIK 3hrT@yռݙ5dVR"4 z5M`A &<1 ʄf$8y sPslAziXjXĊS|`f8$ɦ[Wj%+ k=Mջ1W>'v TsQjFXA,7_Y?MHqpݙٯu]XòmM%z~sΖ~A?KdT\[ӻ]_kP?7nҴYۤkj7W2q~Ge(06 vl5lmֆ4n7/}0ܛs~'$ 9bnQ2u,Sq_p d0CvCc},T&m*Wčl("yZ1A&MIqU)V7v0/Pwj7K{qܱQhRfRrE^:=Ϧ%ysb͓/\^wc\{KG ]^:V\dFqozi}nۼ'~W4wqً5P]<ܧH>$06jL. e=W+a"OK"LRE|N1}M!t~Zް;epExA e(h&wAgq(@b4 !H7(QA&8z XkLߚ\j'+k%DݏyTAt5;4`m3̞^[Rĭ_6\2Pߚgegw]s-=MDQ̣ivJ5DDBRML\&HˆV-PJVre ,,9#q 컢h2HΦ' P/GKJ^R-t%D.orhi"&+M^&+7-Qi~Fl\'M{'xIʍzeOTDY9_0q}oxO)8(aD$0ߊh7+f݇ٛW݅Hm2kS$CUm>piO1a. 4 Ad/_"H{5YV*ʩ.2항ۭ2г ,<#?A_'Z}׮!`mFed -Wz$H޾7<< *mk1! j1+quh-װpί`ۡM +#Nb^gعv& <{Ogb ' $Ih 3Tm hP%<|v`r~},$zFnwgogOäR8CH(H Q8?|<;lH}>f ϤXB2i$ZQb1X}qbhPd N/'CŶU;Q׸\6nz֜\m#cQR>xjSpT"ևqitoyh ǔt%uP+;[V}ۇRNz۸Le! @@tˠhy" {"A("cjL@Z+Ŵ&wX;"~mm :7=B&@OȌUF&5j*OBet^⣁ xw5)bO{ AkIo{XVfk6J*$~ȹ2f83r''6OI6ܨ[PW:͞W%i^ˬdg jLR[$I `ȇi'3I.χ*Zz}N~NͿ@#xpZ~go}3w-22We~$b>VB\yv +^pR~6`ƻyX:ڽ84x!{D7vYJ[Z! $F􀉀&јxWHH1Db%(Xm:nw|E&q6y&?my!n&V d"n ,ل^HqG[L\+y0W[US w].L^"( yل_s%-0AU<SɾHډ\NCaK~pJ`iJF{s3 t%Hk1%; RT )ԽaAu-Lݙ,!I:7=t?SAv|"U  {sr>$+k ךR42ҙ%>BSɴ9@4}Nc=1|nD1y~>QwyHذO# crNӠHSJyoؖ*ÝOػݦ(z=3~;n%i T* *X,;tĊ *AMbN;=~ 3q5YddϽs.j9U>xi"ownB4%P ^QM<œ1ތ^/zBO  ELL) ݶ쬳kgO߼y7oy  π |ICQ v% bxx.d!ĩ | Pf5Nk ^3/XM,jR#ǎwrc\Md |FA{kh.穐_#= ZW@Qn 8@|g2noUb$cNvpRl-gol*'<\{Ӳs)XܺCg{A0, (_8~5lf\wHͫmV@V;=kRA\l3sdp= :$"4 r` p"]M.k{M:SJ?k5X- بgљ)`7bNY6of]VL.'}2'ӷ=hq)|,/Kmk>q0ZghiƯдR ]Vqң҇!}"ys3 '@XۈKf ^Xd[7ocNz8٫p,܅_\@z5< U<&iˡ)Tbh{Hsؽ) E݀]Ȳ7.(x"@tلJϜΓ(^aY4gb0s862 4Xk릺v?{Á6?wZңjQY3M! TD^#[~rl[Csb<+9lCr(Wevx= ˆ?)#BұSF$(tCvj[y˽wUjy|a{(gF4L;MS}>Y0~r/ aA2 `p8N^en՛Ee/ I}S Nx`8x@ 6p4")닫ȇa(ѷCC}TiJ q t_׻ZC&4~޵6%\[&BXb@da:" bc*@P Zԇhh4$iJsyDH͖g_0V(9y{):I"vݴL>9f07-ðlBOcD7IP?GZh+)af<ܑ@.pHZn=OUwa$8 yY*Mx-<&VՁ"|%y . 1qt.`7. 9uR糳Ms^8:yH G `YXz!71 $(ݭjIB) n.mך :)k_˱T` PwiVRv͌#n<.. s5v.k:9HO[(P8\L,H;Fd2{В L^a6샍qzF [s5lAOpjVLYe;j5lF]ZR=[p\߂fV}*p@xH@ bJ,/+)ńuxФOػݦ ޸qҤI] B*6T*E8qx-NHHxnHK4qǎk{7fqhfo7:s'gS8 KAY,?0t~ɏ6^Rno% (erqTy,?2Љ nž]vу`n;pce ~gq=:B@!qGt+A^~D ],CJoڭy-v$hjterUQ.hzy;o>΋n (ֽ,*lW6·3Ӡ1Rapc9wB' DbxMiZ#7B-#]T\)xt&^uA]D JE!L! /^ P(",ț߿N>}9_`?l!S[8;$7,AvV[b#Q)LgV|WIݾ58<\7*`zV&/p 0!K&{ |g@ffߪFVK_f;֨(<榓dy;*TЊRčnD\) _@kw\ )]IA "va3ә57u> x7dsw o.7q"-a%_ކ/v@<鲽u"Ј9m C $,ԆaW^-;TS$ozE\ 4i?kٓT RJ:tx$DX)HW۵/014_IG.NP黛aSڭ"8R{t!qӊ-e[d ӥ;.OA5s0ss ޕQ}lXwIeqQ>F&sـeQ<3 C' -uU&7. LZiMgzЂ !bZB뾭'>_h3)}4\sx8m%} y|8z Ի,- yʀ h8PX*x=}݋_w-;mQtƱUJ %Q" X"@ Ħ"oر38~Ol.+ܙ;sϽq>6_״;BWK0".!y.qML(5tm DML{mwU@8ܰSj$Q#iJXq|`\ KKͿ A.v0q=$Dh{8'%߶z?%:Xp6>״2ʾa*!tp=n1p{hI0;$Ij+ɩ;0xܪSv G Uůq΃Chi1 򸬖+&u}hBК:$if_M`O2G|=onW; dI}xwi xkzIzGU RPts/7?]777 ZRQ&1=]i1co{B<,`w0gt$ciԃa!Eot[qpAt$hj?/@!_D}ƑQ:xWBFG#ŸۭyM|AE~ّC| @.mM&7n/XLnmehp/-P gKU>jg0?Hƴ djiQs*N-j0' E,K z}tcyix/ E发2& Dt+iNTRW{I54ӭ59O]r~U=([}#{s§mQ0 >NAGAov@TF?} ȕGǿ,} 0*M` "ly/H _\ZGoH\CW9ϋqrpgF.?Wd?ߟB䥄mU4-8~Gs?n8~??_KC/|_~vR J:oQ (!p[q"3=O<ϣq(ަY-0D\D-T,Ӭ+Zv2P'+/”Wүo4:0 F(de?o?3GSeWop|??uEޖ3,+%sƷ/+ 7fP!VVn(`Q0@1(`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@HXa IENDB`bzflag-2.4.2+ds1/data/explode2.png000066400000000000000000006271611200563112200166150ustar00rootroot00000000000000PNG  IHDRx pHYs  gAMA|Q cHRMz%u0`:o_F-IDATx?چl5/'F`Q0 F(y F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( U0g}wv;AJ((ߠ|AQQ ( |D J]̬eݶAgÕT $q~.Ύtf=Jab,ܦ:ۄ BQ(-Jk]hN|jA$=e9 b:z3 '[)򾡫ۗìHvA?fE 9ir22`27ɠN8"3X~m٠FhY戳,Ia"2c!ZOo*M;o7wcEΠZ0%-|Nkf+:Ѝ7bZy32"boVW%lD}?/:ֱ_Sv˘'bʀ @,LLH'41/`g@yQ8y߳>`@4jp]?RϯszTE[ɺ#N ]R[(PquUk~ ><k,47)KP珹U9/Unl8*4.Zjּ2& @IfwQhw~ o7(FA9|.B\ =Pm7B}m8֚60.)N@4m*_8n=}wDHGs?\ayW^q3qs|V_ l?wxN`%YT?CV'~o߬L `?pr1߄xX$ qN>Al_0/ +>QavpȿؠP~:35&#3 ('?_}<Yg6Ԇ/(N$ 2Z Q00 w@7mW[?ڡ$Z?"B8qpW:HԁhUݟ3c$&yo|P#AE,ƫwΔWaf̪t vu[&2+d(M=_LXS,~T2>Tdk˹`FWȢF̯rϸ(>gn#e2dPrp bP d~`QB){ųC/ Z`ư[`ggdf%%S"+o ߯vezĝes/?9.N\;##o!@i7>+x^CPnapCA9%_N޽g*ݕ_dd(Dڋn3?~6bk ?-++‚;#ÝW_XEy*L?En:O|y T.'el80 60 2s)/X&i'fH6Xr}pjH,#A#_q 1`7d,ay+V k-MQwqbiBRZHՇ(JUÂh,k,زBHE"y8Mm8 Al,]13s s# "bJbY([@~hv=(#0:~ *FE0&Uɯ,zt~iv3L(egI0gω/FQ4su͹aZ^x2+VPp $p޾o.G P {eBaZ*Am *ϑ8zZ/uzul| P;8UnܨZ]/HN>[> ;0?s⟹N/lg$" ylՄ,oOc2(ӚdJD8QJ;Y'kyrkK#}]`^y1f!_تv8z-qJbBk'*y0_ p m{V'JQ1,C n}^gw!PDp (넹{)f3$*$ 2рLȍ ɡ?$X~YfBw7Ц(4I4m:EP7D ̃L xA*A®{D*.EdHe+VсݪHI4;[!SxJB aS᲋=01n^⑽Xrb[&Աoe"}:4<3@Trf;gz<ӳ1R_hP2 mm|"=sPyYqIv`zՂD)Py .<>I_ʫl{$X1mM~ Dg+ѿX OE`!H4ɦZr:ZQn]Tg-~J;{PqzZ ay|3i:, x."CN$МȜ3@ ~wG;h=R̈S AEB*f_:)gk4GX!]Yε3nŘZs{8,YPֿXTٍcǎƝS /o[R=6 >}~72z*\1ܻ">],gw{ު?QCB~-Xo]V@`=|oO :&wg f^eN?|U -a-=#> U #E*ާ1dӡ|+Q>,agrf%=җ#TiEI":9FS"LT1}ߵO֬Y.)JPpq?4ijhHj{}f}0Lۇڝ2=0LdH D@Is?Kة:N̮1ZN2+^fpd3\k]i߆ڊ+88 (L-[Ǝbo>tr1`)&N%W9Dld*^^3ݝ54-2V =U[AZ@R0-fY+ Q!`mu{$. (iT1i9ZɋC'>2dyCa(S90HN>[ݸA`8y*GIo7IdT%BiEY2Hfq1{aq[Il!nBDbL2~/q,fAfDti w]׮l~&$5b &PՐ(/MOଉF$/h!@e+ַ)Ɠ(oҴI/o|<@s%9._4cR( E 0Jwk@Bay(B@HG闧#%=oLʥ"٬ᛒշ|N&`]TN,J)Aׅ1ej" 8ǺQ4qU)\f~DD_,䜆nމg"NO<{$;J:?xFPE$|C 7A׻6$n wHXEJԭV J@r{~B^~u/U2~_f,Y ϳk݂̱af)|u=__2X?.S`3i0jAK sȋ N#M<٥]d]{'0!FټI\Ȍ!6A{?uwMEq{iSH," iܰV@ 2HZY'7/)Kxz Ebڋk z3$-vsdm?"Stp'ȝx|ͣ)BH!E4 I = \'3YkѲ]\,'O;(s8z3HU;CX1L !U ^}k\G*[6q[ɟt&Lqx$@)6ˏ9TbEcbXPPmAm'"%ƨ1ړW⾕ ^ڱf7i"rZeXi<=,O-f ދ/aT*o׿KWp.Pe5Iv,5r@ y1M >+ ~e""J1aTrˏOϥED^ , q5P?V}膉^CrH+3q ;ڨ}nX1=CV"c O:ԋS>K4M9lk\Opm_[7627Y& $ ᠢEAꉓ`⅓&FL'/ 113,*&D66u֟yb&mڴ~?{}}- KݬI,qJ#Dg8?ak#8N6W QEgٴIsdS}n4n54MӵVfGIpf m$HR%#]aߵn GݓUH/@cy 67P!# %G3^Ω/ΫnF|fսlcbݦZ hYvO o 㱁^O~筒J9 \^ӓ:kh!.$b@e S~EdSSbSQ ].:z&ɬn -pFEV_s e`2 K4d}`Ag*Bh-4S+W * Nja/25Bݨ#~{#Avt_ZԕŬ͗bܯd1@Tת]h:69@P_.}4:)dAb܍q$Ǿ`_'oGt}RU/ݝ+J 9[ךk˲ō<)tyϩm&$@3ȫV=nw(YP6Jf۵sH! ?}[8qCv5j L.-.mR[ZćD|(>("eof/fP|t f;eLba!KÐ6UkK*En:QVu—:b JaS1y[]!j%s?xIJ{quT&iP#3D*ESHcM2)j6,<2.>NL8k6@9tP[+~Y 81ۨZ3)Ǟ8QSi bR7ǁ㹂)`2ʚ5.opwAD6ȋaND PԷ9 DP$<۹Q^Q ?Euˢ턐H,2W{rZj H2l>m24р*Gӓ+iLfNr (G5~8G я(50Fs<8il\UpsŁm? ^A#nhrL6s_Fa3qlrou|7.v)^6xNs{ +D8.eeG1n:Bқ %4vg:^ D2? JuDw;#$-M7ع&(z3|O&cFl-Zu'Jn7QPq) nZ(`)R[_MӤM̿O2?LtT 0wϻy9VsZuPb=GBo-v4]Okf&A#Q+EB/.#.[l\݉h2`1N ۬:? QT7b!9JyX#uP{&Ti(-urr@kEa F#ht"A rL[ d?P]ZQo ViE!@ pXwFA.jW tw݂bE8 8?_ 4[Z3k1ÇAu]l,uh|h<(i]o.­,X4DBJfQ ;QvW˨⩲:-=$t#_ $@JIo3diz@eʆx&{# )#To)|.%&Y8XWǶXITkNE\XVPD6]7v ˟;fX<w/Vi1b3"6<ˉ3I`I꼢䮉,O& Ec_vKFC|IA+2ww5MAxvOM$G (\x$$W q *B@JBUm:I'wmf+jXm33};/<% E7( Kxk^ I% ePrjC؎cXh*gVߜ{·?Jq<#T_0=nO?DMeC{hV&B#"y#ύ.hݓvyJ:7;E4Uݭ]4);s`xQ }T^U{-F7DP(Rbm}s[.Ơ@ݜJLв'UgMvR:tY:*OXe;Qyv+)tQW\:gÙaozsP_gvmeT1Db]K  ]Ǔ51@q$ŽmT6A+| gw9HJ낀5&{Ӈ2E< H2/\ pߛjnATӠUI`Dp&!=4 ̗t1h*QP<7挬$#o_`Z~̾Z>1 D4BH$Fc`9jɃ7"pFZ- ή3r1,mlf|nt :W3c)uu:/þL!<49M #[AGҤ:2Q/׵JmY:hU)6Qς= IuKhPV27BHV$щB{C-76hy 9DdLU]&Qqa8k4 3y$W sk8s"+"fQ7  M o~Y?eH3 E^'yru" u"*Ea}~᫰b5tI8P2dw`2UeMf.þr%,,A+jZH5A$ԜDi dS㦢YQIaQC\COVAbUѠȥ:/n W.k,5l$TaU"}8='"tw(ykKԈVi ^+:Gi_4!PlV;,VjF3@.+JT] ᛣ=@dԋNp o"MbL&"I!qxq.޷`DmLH<5DzU{|r52!MpaF iK+N7 `ImpF vëOp/ָ,D9`D6yYT;oES8`MCyA2;aI`ƶ}x?@֩V*xLΰ dXZ wQHql*c/C#bu[ |DXt%(Vq}]ݪ^&f;ȰA814")=i*_v~`lx脰݀ asi}3b 9/$/m~Kq#F&JC3]MhA~nI4馵ZlX["^B+bϢ"Xw{\*"(UB[I6M6&Yg9))``XXؙyf}S{7jTJԏښ?ΎQ!)iR_ D3g >93xzs56||I 5zq- I:e욬5pb׎n$AW d/)C P?x`EV9d@EAp[B\:,1qCh ևj;&y֭ ;!(Ip:^`Gdw9 ?B,^ߙacE_ Ժ'g2?oZ "!6W5Rt c'|[&\mq@oKW9ĽD 3b(QLֶ|zS7*6t;iy"hS1%[ k]t3yzʂ8!MUVˍ Nk~}砧F"F1[xzk((6nK 6r JB->IiCEF9հ>Wʀa>?43 kBAGYhM0(γL"\k%+6}X"Hb Tpr5ĿGb/J.%q󉣼nkTɘfh5ithm 0_MjPA&)&z4 J~{us+uF'q,BU`O`0asL UҠ.uE7BY'K|nd7A/ (5krILa2pZ{A*k*aq{ɰ6$! n&_.= c_tIvgn=x+ 8Kq)eg/X* &꒫#^s=+&(vWyx {4ZԤĥ),/sIbtq\% 8hS6u:b[ތ"x+aFk Sy9w=!QDa{ovjI%RhtJ""!:v P[ubCI$%Z1$,6MXvoggfg޺;B9 f7qA9O"2eqx M;R .* -@<8c X&ahl>L-dj$ d<:oQĺs5P<uuȶq QGCR G}q':Z6=0}$W5.SѲ<ڼsE &K/ D i7:0_yx%oUiqp87CývJS*JT&TR@]p{[ˡg/kHfS~~J}AV.;F5U\p6Ooϖqf635:f DM׊fQ]5sWST(f\L=3x]? Ee>Lʽ0,l6 y^:W(npaBԷDi.iioFWS 0ҋx}Hv=H2̀B bx,h;j+|CI6&y'lVԪydtCQ ` _`ZZGqƤ4X Ptk? q!TjBqSLI6iP&iydNf{g.\h 0:ī,(#CQ7mKTV.~C}k Q w, <_-sZCc y0g+PDݞ>* _c`>'I󺵵BivU !ؠT`\[Gȏ9$q^o$no'棓{b4dV(2O"pQZ|83A6jR[*usfbe{aL.* '~NUlV=w0⅄l0LL"4Q ظ0%t$;'ɗ,]PQ#Qu^W%lx'fu%thrZoXmU܊=?L9I8x؇`ә]C<<JkEuN?DI>pCx\|/-eqS;0a\܆XG!t k`yIl:AG]eC/a&x_ xrAї""޼8˪f]]k[ִyk^ NFAr~K>_YUt8p`B,Ftݩ ||mϾ]b`# pY&{7$2|*]ełm7BI y|// ;em /=p(''sLaVOa^Sx *?jֿR^*i+p騪jT]ǖ\2! AQG!òhRlr_ qY#OgKs:yxz$@g }Hu֋TCukR4[Tj= B;?, s F*pD`c}LyypWQs,ڳ8O_Z몏*JMdPKխ"f:e&!7v 6q!($ Ks(J.otnS@5f$g׀ȷ:CzҀ9'~&{WF'D&Z*9xh҃E(k^ (-1g9|p("-.k_k9/*DINMEI_~/~NL)Vl1U}{GYo4*҉ž/<;c0;ktFL f $>(a#ƲF%(7|@tK bK1( &Ԭ>]3KŭvZ!]Qvo"8Į073q"b@#"Yl{Vh3Ys&Ȑr$?uhmjIv;MC'λ60劾o~EKX dSE>~Wuo 3gfΙAuۿg QgwzR)cNUxr`Z`Zb:5q "הyqq㬇SPn P8V@ZGy0Z=~Kۻ{HԊ렖7x{*Y߻4T#t@OtE3"|lN:;]ï<"q6Ф.\ryf/47Bd K.b\k0)n (u "g%Ŵܹ>•3# ")kcQ#$mۯ-JU*,L*B\g-_,3Q/O4=feAAoe|޵4 CӤj*(HH@b`PC)H 4!4P6KgǾ:Hf…vƆQ;\ VS{w幺W֫j)`NĈ@o\+ ȝD"sMY`mOwPl ^ `FmŴ㝮ͽ/($"|Cpmn>7y9w \\>Y oݦDSI@BqAF[\8;B]/!Aٮ(^J" ٍf/ ^ Ygin!Xk(+_xx]5U2ypsڞn+'ACocO+s/00\g`I/o>Ϗ__Є?blW |"  `/v Ll>yx| t7tD7P~(V6>3 ٨E ;xꆏ@{aۢcO8$[ ?gGu`b;s|z Z!AM~ OTP9+`?<6-چs - \Dh5?&8ӝ143R ˝w}{ۜ @7ޥ۽88ckʼ*A.:]A` օvg.D[N3ΘL&$ՅBœٜ{ᜓr7W6X:up/Ym(L ڜîy8N- - 0*ӓc8J*G}IqrFm^'(9?CFG)Xu#V79^I.ݬ2aexnBa)(*doP  8.0 *`ȯqA$ڗznQߝE.ðIQU>D1`DפV>=|}))M>:Gha/LDaf[So'#߰{ɜ=(9l{gA=VUmsD;%8YDY\a2ƣҫIܙs3?!U1D̊n20:.uCs5=v=HOGU4y_ x}^EַԾլ4 /ijl)ZAԣxAݓ>O՛/!bTijif'P{z,dvvwo 8 3e@1 ,O)bAW8gɀpʪNz Kڞ CI|5'6b)6&P*%J).4\ D>$Ǒ#nca_kPmR ,BA>!IbпrӲШ<ðw0uytO' `:J^kcpZvѮ0yijMԿB2┮WCG sO`fL2_ B݊{hD.d%q|G{ ^2Qf #$}9RC}oĠA@!)ld#}TEEpSܔlYk. H.#oi W|J)`*G[ Tv zr~Y鍊: ht(`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#`lRb(w.jK xOu݋T3S 3>xy2c5 [A^l9Cr˾kVA0fw(qOIXb܏gGCD ̅qх w<^Rg^+Lu>5,Ω[;iƿۖ\T+.JS`q(:ލ,(Q@"(@4kPpnAHv=3f} 6 H3!&*Fv:?(j@.dUX`p:g׌e}z6JJ@ "]aGDaA cETk{]x/G)p͏(M@B!򤥘j)"=d/+oLN"v['vH+;/Ev&7?PcvM@{lnh $("jE9܃p3R(Bj@UZڃwsXo<0-, ɹH:Ea^Pv'kf4&)ı@T>X5k]q!E)oN.d)(^ ?$L #"btbD'SNPWw^h_xx=)<(P2c"\ |@uxWz:(-cTRzDJ (tL5`\;qΊ *žv_?DP: h9(''+ (sbNtO׹N3$/T|L}?TkZH 4٘ Cy8|/|kǢԲ8$0O*/>M꒪%$)%p}p0]+w"MOaþŚ߿YG]je'%םn@?v br:im"~&1-*ڋD= \u'u7w{P#~oUDHUFXhr jcc5R Y:O[8<}hݣ- EB= &mkbxbs0b*7oVQJɐ anl@lx\{8lH8 u~qFwoW;~ضB҉f˒$zQ;;m &{|1yqz"!.[13MIL⣛8*%]V PJ ؛, `εQhI() #[DWSSgNN/Z]Rr* `φC7-.?^ݾ$6Cз8Es%nK?Ĉ}ƗqJBTlUӲ&rtbɵg&fѫNݤTA,"(AIA  TqFHGp9:0Ո{O Dža U.UK2߆\6cOҴĝXc=ljRlsb W[#%a H+mi˛2P[yO|UH[[=`x7/r \njL<}p{k{&\+~ɩEE#`*Z9GuE{iRT|earIkX["aEb#bAyi}nT O {8N=ЃpU5WzhtaQ\[[3_Ց# P'9>s̕tԹQ3kg\lb } 7,W*5tlҟ;yA?J+ jUtLlldۢ".x _ddEc^65}jf\&iJ"86Ϩg&mT*JEU0Q( "ٍ!Gy,fvG?eD>-o/! b1-P.3D.M@L&|g)0 8"hJpW(bu#`[,eZL+ݢ`v`AxTQE Ss%TXLxl:a5]n·9DaLT[Ujm < f9RIrLO-Pڱ_.̾zFjFU ڠxL@FԀin<}*zeaj*P![3C2q@zu4@vp nK$;U>t+<0ouV$<IQHŁ7 iB2mUjrhO[s}_ `c!6]Ye(ǘDKʏ8j[h @F];a}bEg5<[¡r sDv7`=e+}$y\k 7a7#M,VXAuحS7H=EsοO/"K@bA#Sc2]ƚ /TFkK=iW `;0.Yno9[x580߾0aani?rDNtc ]>\ +Hs.3e@Xs>,>}2}vA7K MRaEFTPr nbs:ꎆKݡh/\zP㪨Dx[{s nyazbbxS+Սm'ؼ_ٳa[KOa3M;} -RZ@D IԀۈA(1QqB¥KWW$č$#64N;tyޡ5m2i239{7sEXB-8fGFzΌc۱ȏqdPQ: ~I$[})\JtEeIHnMJ,7K&Gf4rC"d}gFka^w Xc'i߄KVo/,awqM dHZшsLM* F*.r#xLOG*({a'r\0ߋCG^g0gdsB~5Y2xmlfbJcp0kjNYh(+:jPUaVL#> XVoB1Wlv|d^?M164+#pz|CeD75L QUEiz@6yjh%+&~\S:FfEeHBW;C/⧰661 XkIa|=OŽ-7ïTԔ/=mfﱆJE1S|]o_ &#^rG/ZSB1Z0ȿ?X>c&!֩K{Vsim)X,ښf~\=3yw]NgĵS ˰˂[!pH'^1l!aZ 1֨viH}SPKTT}=QFmJ :N\ o{4&lcw§TU ˉDo(zA`(~MKuZj[:>t?vN-F $$nT2dsp(7!)Xyao 3U<& EB,@1p7XrI|.y&ksjPU[ @X*u9gp>*7 on[,c P"!YH(i9mQ$-Sրʉ,ukЯ{FG3 # iskMۗWE޲X5-@"Xc HUSJt%DZL1qXme/]L! -^Źd(`{nEh??k £PXaLIX$RtZ3֦[.MS͐w/oevc|x[%^/m< d#8;UOJ,(Ch`ɮ=i"ҎBT/srAd|"N) BٞfMQƶ3<> .rV(9Q3 ^7 }Af&VDꏊH+J&v)H']0z&3Iaa! ^_Z~_j\.Z ^2mmD=rtƗ1P%OKIO<̘z]ފ#?ۙZ"Xiؿ-wV3MS)̚jZE14{sWf(~tڙږV[P@ % ĥt#ĥl_cH41SL*CEh 0\Фi2I^;̝#W]vI%Vy.$^ʺ 6<`aBaYҎ8^+P[$:"ZY@D |қ,SŒ8c2"7IvSg)FOEOs k3!R8T3o %R򪣙SOҌe &RmV1}5VuֿLiJE vn\6n$YAӋ~b Ā4.$Dq*ㄝb]N&> [?ܭ9NscS'RS'R?j%iGu*fsqqT^O+ M&G-`Va܊:t?_0se=MDQ[hg(BAMry]C4B$dmd/K+tv:3 L$7i2mo{Ϝ;C.kcy$D̀<欎(n@%=xjÖ*1WUJ5I!E ΢Z,oBbfPV\z,{JG!g3z{˽'SaռDZggAqe0E=7sа[)G0jԆ#A_Zz'y&>3N)Hfj*J?=Nڏcyt; ad g&'-~ m<Ǐ(VfG<&Jrvc8zp4~y᝸8Q-p[5/E&@fjt"%-ᇻ-}eeŪ3&j|3q-3d/ 6,ļl.RYc:vD_>Vt}{E z»v@!&nZ0+7+y;;zDyU|Sǃ5m&PxN1vV& x%|C X𐙈Uf) `G:ૃL@ WJYsག; B3=SR>i`GSYâӀfjk] ߀:l'Ë)Ɔsj&il-!aAPɴ[-S@u [ >g[/9@z|S+9VեS~`zMmuS?!5ƊYrɑ/p p.6xHc.[{yէ/1*Z|}!юͭ&z5ʮ%A͐Jd];bt ϦV>^)xd2đAlpzOYB&Q$׫Y={Zۃ7n-c2dh|zul^ZkS))4463!;9$J` 1@ Tqf-2%շC9 [C*pE٢o=[t(\<:B iGTT[P0j@I=FS&PNlMNKkEfhF 7񧟟[2D♞gA608P'yQ|mm?'OP(/MLLd7{3"4 m,1ߜ9Ι`^bwE)A1AEi4%V'6n.= 4^؉ܝ ÌPx^{P87V3أ.bV5[ s{ 㣄ށPtD"%v;B{P|CM^lۖƒKH0;>ιζ'7j-#3TY! @ 3Ϻ *`6(AyiF bOQر-9k烡K*®K($D(|vLnZ7ꥪ%l]b7 h(ߛfq_i{܌*op?:v,؂ ԇ~W!L1YHy%ø-ç/#Q|rzBӱ/ k6r'8qeb $GmhW[(@_X"Rbhf[ZX8!eȐfɑ8XpwI*X_ђp0 @΁/g!ysaÈ򸊀>TX0_zGBpzVa?=ɷrE.tRJeok E{D iV]U],PTY ,[-do^jzUzۘW1*1L$TMāU$s֞FyZl9,fl'PbؕUrvk wؗR_*j1ɒ%%) x[PM7Z E0b?*L]e\^\.zNt/3_)P|㥀XiB)+!VĠd5ׂra+ʂ0– "U4#61gfݳ7.OeȀnL煅@*s3=G |)7m௉,ccZ T(P_{'3!9׷S! Z𙙝dmt&Mm"jJ("ŇAV(>TUk 4ٝufwAZta $Kؙ9|眙T7()طhi_!#@Cl bJ.{t(k(FIrƠd>7l(`AI_|cm"t?L`@80zhN8:Umܝ$JJH`b8ֈM∂3[ȧ\jоx_?Ey+SۀΡ* `} mՙuZui҂A2VBZ&~8D BD#gΦ  )pD80 (vҮ5aZڕɕ/bUnu[b[3#eoO}VTZ [2zlsOeOXYIߙj u2ѹ|>?`EuqM\?v a`|((aB 7yMM=' R_oW%]]0jK͵cRj]Yx GDǽtщ@0`EXҟ!W [ȐQא(hӐp:NgKKk6ߺ('6?+n?7]MhQݗM6%dclIPBR-EPZ"޽xo`ՊXEQJږƦi&M4mvmtBd7ٝofޛvb)"y͊;vDK*+ ub~\g~}pZ)+ϑ<`IЙ-OB}Nl>t :'q6Mi$vpyy<_ɞ2y kCǬע{@ ҹ\(WߎW33r&jrMY l~ iR Zq A~ a/G|mmF>#$Tu d?p5f gťX㸴5B=i2I05OhY(N}_1HJ!x<\'Ϯ!7b %oT'IRV9,BA kֿrكOeQz8BΖ#EǏu4mmD%{r2V+Zk;BaPFO@̃"^o31FD$Wr*ެU4|fDl.|#;OKѱ)U(09p%5#}ux,]JP+8*/dN41Ă\beY{ȁq[Q h6>$eͽȋX&jo~-C (݀B?/1d)ח&iswkѕZ{6nwqAԾM)vy 5yD:w]&")"歟|Q Xeɞ綯1\wSI^hOt w@S2{g`8W!y~IDiUTLM<_6O >5\6yE^3XVu\ 2n8R֤c|!׸K,WM#s@fܓ𩽞T1]h$<+A~$(`A88 =@As{)e705k|9Aï[=iɏ&H  Zg1SkgRb_J6JX4=/z/N|>h:J c$f#-7OT%:W[x c\rL| 4 $Fŧ@7}Ls$oÓ҉bNJ`2>.oVvM}h"%0_\} :h3ukǖRY=#TSCFE$qHӄ#J]+rVMnT!PahM"k)|Y؄T-icEcb.aj&ɾ7f7 LB٘ ޻O\FѨ_}ϑke^#uV_N0-<jӍKщoy@xR)\:[e%9wwv, FH@bC;1Kݑ 2ײ嵗NAm́<  7КO@A0)pfC[!=d P3i:r6!1y&Lݞ&ߔ*h@RRCy1?Vwq}BџB=I%wɍS1TNH{5 (Ӎ6k'`kEإ;6}U&A*`N}X#KH*ߍǛRY:w]^\aW3.&@M3:7xD~gICDMf#H%9j^ZY,G$ŏ8v#Tx3do@l  HINhZeᡕ装V[;)?Eu8_`nO3 co0N q.>TEh>  Иy8Yr>omJ&_FY  z{jXc'gK7M&MMSEK4X 8n9wؽؚ^x`3[o~yLy7hs0$k:;'?rСnq[T?|ީmt] Z,,uiMρH4S;btC/ Cn%Eg  a طs針YA@ѹiJhy0fDD8HAR#LB)J˪M R}?Zʘ@Ww3肥zN4llwt˯b&yN%˜gVF*@UNs_A,DJ8)( BOHPZrqYx}.Nk6g;^Av RkxȤ5  %x?IΗ>(c1Èm0j@1su+qQ$'t"Ht5iq7%@$r'u | JE;mv=iw6wruŒEU6IюVឍSɯK3\Mtv8pIf })gcyJU6kӯFLEA?,3R=} \ E>g@2u.2yGPa[<&nzT>/W;? g~ P}l_'/?n+?_:r:|?l6:Ӥ~A5cct6q6>e͑Ca6926>u=qtn9QȄM4Co3#D(TѺH̀]|yɐTA5 VWs'ZHBIK#S'2h2n. iBK%,/fs¾8IͤFpK嵉0f7mbXSZJE_'?@bF(mJhMq&iͮuUam. %ao73@lq`hrk74 \ǯEb͗έ J#;b+)Le-ۣ iX\RƟ``0q&kRM\z4qYK];]S:Hޢ9 rT*w`v@@ Jf6qqeERYV:l=t"^6 ū9sʃ3zSwYȯB_% 7]wꦾ,Ь&)j@&CHY+^|nti9]« ˩J4Nm\ ~_8,gzE% -].=o@ȷ2e=)- /[Y'29ӰSƿuUTuaf#pXϚt9zA!FPw@ZyV-NkχGF3

0Z+K=-\r6z^B/L+w/Hx%/+ݶ+3}b _|D1A%G\!6v'N֞@!94JPrGq2Ԕޒ ח< Ulei`DohS:ND#LƇф0k7&_ͻbSRFO K9Zw`{FYcu63s߻IlFFwDӹ&1_R`C y)"]cik'v$LǰI) ]݊@>3ɴI']WWyኂx.OBb_'g2+`+܄g$|oKz58x3?ZKo =MۇSU V[(9)鱡wF;+ob$% w inX/҆@AA||MPSb*!i6 %eM-Y퓍Jl&' ;;:|GKw쥲Aa~\zC8a s1/rc_ൢSq`]SmJo0r*P\~O\/J'L~3EG\m=_$^PR:a+5ߊ. u@l wll '׹9@\P,]ҝwP޿֑Da3k@d)96cӄ.ǟ umdjQXT\3pԻLO |0Y(=| H$ S.+)=v C)׎t8w]MsUтӂ0O"CM,w}htddtQpskGKtS2^ZhB窈rkgo;ā > >A`i 2i\&3bԖZ7 ۝a=}Т8iu?vAh_rR|xwB^ N!鄭6dSb4Y\Jw:6Ffdr,X/3 ܎a Pe/1F6cb*ߵOB~Xަ ؉(JBS(C{O BEBPi)i|8qMNlvlVRĩAH<]of0/eMdž3|Rλ iRg N=[r $P (ϰ "\N0ʧ8m׷WP6`sQ%4$ÑwA: vrGjdtyT7]`NV`oBIE$+!8ŏ P4l͉CU?_~NΨuˮh~X K¬nnmPRB. /xq` THu$$ig~(LJ^SH~p==Nῃ8ڗ3ޟh`:,P4Z&@ Xg7@V:t )=+tO{z'l : ;}۟*iSHYTSY7)m'57V;L^e粔)9|[_7wwۛuWZuAQ,*HMF{B؆aamk-XGkh`neq> Dgv z%N葈m^5-=&o% dP8E#ޱ/X;8B[N 6=MLW^`Zz𹝾mKi)"5*c qKƸp`hʅ4>0AAM0j0<1Q&Dr_5VдV( ucK -LYNz)UӾT;UxNp+*Dd#N! 3=&!NmIt (޼(mY9ΤJFv[ΐZS(U`<( k(b"S(Y9}FaXÆP@@{^'Hufچ9,L'↑hIT\x2xdǴwY H ,Ɓx+v\S|R1 ,?:~{wIp5Ȼ,VNq~Ne_fp{HUI|igGY;]|}Xxm/+p&×"t7IIbִ"!dO&~ki"LiX @#@B@7 qƄ°ЍZmĀRPciy{ogu $&wtfs.ܻ >=1u<ۉo&䱇r|9$! ur!{4Jڞ&n?&tjP\>)sIydk(My" 5`Dњ^t;nl L|#!~" 4ιga{6cB*VRW[|}_PC+:Ϛ:[NHۋ>-\&+`g'sUT^uǧ`> "`y: ϺD+D`9uXDn)H+˙WQaa岪nkI},ȺըLxcIQ~>eѺQRp8vm&oA7i{hPd x~x_(d`X0XHR2aY_?qϹ B *S].BTʢوsc7QF-d@7JN 5X$3y@Ŷ׏+_/{0I:4_y]Tf[{{KruL2팝Xv97^@:ժLs|.f?p whΦz٤ibεm Q77׷ƺB l b5N>&^N@Ӷ~ZU`6ܹP'V kt,cqr[+ m /R {1U=a'1g.[ @Յ4mgGtِ!dQ Eџ AwQ^E$B 2"RB0ͿkM̰mN~vζyA8}~)8^V\"ܕk EH)#p9 &%ye.B!μ\V}<3.6'$`!8@b*ę 55mBw.O&Sdrn96;rp_ v*_릢JO\؅M1bl: Ɨn?z?56, =mKH II4$CJ}T$`-FK$v2Yw Nh-"&rZY_sH3ZX07fngO.ⳤLFé\&$I.$$E!U »J mL;2FZIaxkPKQä_Fg3;. s6AC-֜Ey,3He%mǎVpOi4KQA\6}G>b,2 -6khlo*@k@[Z2x#W. d&̡=p{}/RT$(]Wٌ֟KNOe\~j C'(Ȋ1y/o(<1u1G7g[u3{a ;r>!D|=YSm r^ӑd<'R[DqsXX䝐 /FXsp{MaA GV?Qz~ @ݵDoLEs# |ɂ.C`E=AI/De-zA3\"^uoΎ9(Fkes~统װnqNE,4e eY 6 ぃXt*=Y.D`/v=, ‚οs9sr*^*uf^;)E' 0( &N֩ 8?Pg`׉)P^a'BJKL[GtIG: ${2Fzâ4v/Ou/tx2v;MTlpYBA/hN[aBVN^U(Dq:;?} =AO*Z6xK;7%Q_wV G693"`e0L@%!dWJRP-nŴxq@.9W%<8j ou7?xh+ݺmBtAcZVq'_&d4s~T}{w}͊a|z}kOʵ~1`dwD 8qUtLN•#Xdq7md ̀s};𥚄Ț?u rٝVH \m'O(BmEN~>Q98ӤՅ`t gc(mP)+tb.wUoydfA{cլnSx_O_Cø>4BS<;qcSx.Jb^_?/@2ohKHF\▸|b- hp|%fmZt  7!*Pwht&7呴m<+Qj==\ߎ}4-?7m3)3tj3i,|"KSL ~"ij ~8!tRN]p ɚR$ȬޫmwU_PRqZ;rYy.Q1i s-Tw쑸,LzؖE{jT""O4czMGLoyPܾ4ְ(zp(BR>u;hK%<,㘺Cpw=MQl$mB(DZAzEgozEA/BQCM1M&&3MzhUh. yNȉg)9B{95m?܇r5* :,y񈖍f"{m'R{a`:*>}8`j uUr7dLQ"2B h"د{$4~OW `vs/e?&tjk]HGHtz^Bq/nlt:\0)8 |}o8=4tQ후 R)YU7[~!6fL-k_xp <+Cy4[k;e_Ґ,"MBu]b. ,ҡ.|CЃ?cg3/2 U KA\yB/vu>ѫO-?>qy^~y@Ҙ\F / p JCՖU/%~|gfPcX8[~npgp'){ 18"M/<Bpr荹E<2HއEi ͒s  )nx8+fz..a,cl<5GW; y@8[; ڢ BL F(`ЀתL, :*/Lh7'Ӱ9%^6.3 '1""(ށ h`zb Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#V |#4xA_ȝ#y)$D?3x_d9'33yL/|wc'?Ƞ6i0 FPDy@zQ r/032r2012HLL 20*1D31zΟgx񄏁Utэa&\A{dI;eo 8|7#yKDEAEr!(D/p N2/iL6wEXMk 6蟖v\'X(ĦNAu`ȏ~xB=hYGs-_ ʜ,䃐@"$$ ?8B2s.{@&~úds}Vgٞɓ$1yL,DE1Z=ϖtt\ܶU9hlZxcNWZ6Bjbr{$#RDC2wu #X:}[e;;<ܬkeRIj1®Aa|*I{E+'W:I}g<?40XSȚW{5@1lyqtȋ; xLsټSGj{BD I] 9rԞ,ǒ=ғ3U?t|/h9u,ki1,/I:.> m<ڢup']u*?MR.f6Mg`UBi#(vVB> M~"?`+Fdgvrf@Pew,q=_.M a_ ݎ/SbMKv0$)߶0˷X|n" 泿3ln'b/T'ri1IaK;M[0->v /15enJnM .a3k/#8'~C7.ςSov9dxY7?i~9ڨ7Akeq@5Əҫx$b-dhU} z;߿< F(h@xG(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`ԝMKQ9N&DWҊO쮂("]tݍ]K-5nD1B75~|$fɴ ]=yϓ8EH, ؟ FO A](Vؔ JkM/E D~3_0(w_n1C`#I-e;_~,\g:$l .B3)6t9< Ie0-F0iIvu'\|0QzmU{?SEw܏;jks`kÌۉz߰GLdD^9e8=Kmd tɚQhoV.'[$;9"FN &@MUʙS40#l8.եSw@{7ImJ)XjGy+2}Cj HWRxsp42^z;Eú<YdṬt.-ȔӎIlX\ת)M6ggZi9ҭk"g--,>bNUK21%60 fɕH{2ulbY K徘l9~9U :ow-U6rc=JyV{N%P__D7grH1\J \\ zr~&aX$Hu*Ly%ة=t\h_*`0},Z;tŻPTfED(q1j|+p&ЫVӥ'ɚTNjt'Nz4Cr}kr&\+9^cݚg@GC6\Cdړ)9')jo[ 77~?1&07mge)ZbY* k\HăƋ&bEA%&RvЖ3SG&]_۠⒇vWFc=l/@S`z!"hZ3hJ.|I)`&A1$ܫS}y%966};TaNTڡrl{i txm^^2`0"E vE'~%y?FӆJ/q|M8\벜Q4'4A#BsoײsrRC'0_Da=QnDՖ~06ݳš6lc2"ص: I d%?'bV܂ޕU|cw,\lm2$AoiM.'x}o O+q2M&=$GA*c:6np7WfIg37pl, eYD#!h.VƦH_TXQ됂ҁz{#x_v֞ Ex_iCýǟ z^V41v&?OFWA.jbThg=ԸCL"DMJi:&nFur2v#4)cpRiTWCn0)x7_,jZJz.}7J"au1 uwLz4uHS󛁓Voߛ2/K79k2ۼ6[mkѰg0bff;8sG*8yGGk{fdU[v`5ܳǣk?Xs8T0WΧyrҝk[9%TJχ)!uHny$+~s~-$<2:]#fv'l fM ,=u:w%b%wj̝KдF78ӣ?(NI5ߺz2l4|uq1k Q33o; n$b J>@UشHnJ $~,.*BH ڨ$qM&ye^Ŝ;:h4x .徸rԄ~MCpBݔH0=|  ˈ;3. ^VV0ׯ p|Sx|h>z8/1.!@!2 Pʛ=jw46q˜Koa36.!bj.$'Y8ƈMD}^~q/ತYdq].p|hnd7esC0ۧ"?'5:b[}z?asӒӑo׶SF.h!D9@͡ǶS+w?5_2nb0w2@Az5q|ֽ3sEaQbtmjT`j2 PmʛV~^|V,GODjj8 NA=bmz=Dsp$spU=+:hɡ<<]yoEcIq(mSnm# mlc;hi!7UW#E0}NM3ڄSb;1Zll^:HўO٣ 9cid~g9۲*{iduHqh:7$?k 2C:HE&4krxqrr\Grt%Fo?=l}~10a6dnfx8Dr6\ !C,qRD^@n~ w0]Bl `{xs>{~+r,wo7YvƵP; bZ#` Dq_pL\P  &C -.BssppE7 WzS:/[!gsxX8p)J6/.@elaW^%+WcLĥD!b? z7+k.WR )_^s:]Ubv+_] gS(u>N 7+>c%D&&vCO(B1["Dqj#+M~7z"zk$jȂs?b)z:K_j?P^R;LC& [79n@ҷbK9ʹ2Lbǀq| DhVs73Kxrg`nKdxOMI;͒:HDGGARKSazVh_)8T ߜn\o7"G#%6 aMo0c=N[vaɱ|Tq`x'|=E[ %pHYr|DSl;79 &{T3 IEA\۳b|}##T W| J,DWޣ4m\E$}<sLwY;^\BťG ,a=?iOod&|p7xMpN/ jy;=褆*:=.AAԕ/cƌ9x\\o){Lg)U˫?B\i,&S 2Icn>|ޤJz)^_MV A|EvQcǹɂ`fX5[͂zo&(|<2}P(ЖA0D y6KMиu [W.FޏJ[Rv:S4Ns}̽skP%#N7(V\%2^j `/j}H{(A`6Ik, a@c~i^j=ٻq|j ?{No (2䩮/l-`0\F/iƓ4 =G}q"x$@` t%q`\0JAQʑ^Wd$d@GJFO١ k҅pc4~D }fQ-# Έ;b͐D4 B]We?}Jt\תŢ̮Fa}J[ 0YQfIQ'8:u.q s8oiB^4hFZˋ˫E+zv 8jcc]^<Ӂ@n)׉ ɇFj8Ǻ\԰M3V; cenjr#!~oQg ٥TyAӀSJ#0}JiRw887T;v KgE.m;|3hUh`]G06v "0 htĉඁT\XF "8+HbrA6HW@ו{6z$XʷALZ#| E-n0XcQѽN~0E*JnO\%MT1 H_V xڽk[pV_מwjNl[I wkwzl82$-;L1 P#~߿a)Lvsxplg(VZTr_ IMBwHo5HLl"n/l*OS7[(H_< y` V,3w-K=t:׀3wm7d^ p$ EZĴ}<XouAʀ艈cEbCw[j:XvܹO ilV.VXK5%֢V"b]rDŽ$I6 L!9D]Ckv9v:'w~ 6b:]#\S5vtqdoErY rloy:K}~^PpУWSnBnk[O'uuCx}I($\٘U &!4C&s 贜Mo;tV74yzO6ki"ggv-@D$D M`'4gwbOËA %܂(.vw<b&l&g;3oh/h4!80n)hn2TEZ@^ ȅ!yT rĸ_V cb/$3^؉ EaJ492h<_ &}F[Q0?~XλU,~nn*&@BɠѴd`Í񀡪Duw~;&'|1]O~DS#ܻ5ǁxJ'`*ͪ֗k7[$fJ n+ bY(ȝjd@jB( *`˂zYZ!7o YIN7a5҄ʧ@CfYBՂ ᧣P~TnՈco0U[2PL<{wSڣc{Bw #ȅJzAVZo}ڴk;(mQT4 S|Xh[h ,v$pHU41YwS5[g]6nނڹG?c^}kJ,GcEX0DZ 9? sYŃ]4 # (p nXչ7^qh;sL9,{;4WVL ͜•#oTf|疵}Nǵ=A;:G≸d*)\wf,bqwgYq}7>*49/%3([e$Hi1X`Jj>q &_թNtIaRNUO5ەOfEMA1?j~Ӯucct02 4@$x왿ƫ'4ƀ( !:G 6ϒysp}!sP!xÇV1AE vttL;C0QYQ"E$q&\}"sDw7gBXvr]}#zشL~VgM8pbX cF=̇tX9|_%:{|N@RDG̒B;pQt0w x|-E gduZ?)ZOP4׵1 ԣNwYl nͲo@f>OPhx9OQR>K[2$\p }l\ lާ,Ҋ@(+g=(9ß#?~:]&XVق1d 9`|6kcz=:O#'P/ܝV%Ȉ?ko ɕ4TQu.iǁʋ+5YV2թ (!d?NU_'z#Az^ S؟G^b;\sf>rw:⳻xE2⣧^ 8qL-Hj }Ut3"ܰ\u)ܤA OO*7!L={Oȓ͐d6>3_6Zmawu̿ /;%|mV#&ZϩN=Ȝ"%p.X<,O/- _y$lo٣plHݹi7׉YjxسidK,p[dktP&:p{YKtϚ,xC|!?jFs8'In|k[^(}r'!JP3"ŀ"11wƽ"riBb\c& F$"FU=&5F9ߜ3̙9hU,ZxO`ف e+1<;#⒣Qlq3P׋qIR6-nD\V(bKT3-]VِYğ! F+iGr7X1$9 (;R rŏ5@{|nj3ggVo6:c^hڽv9L,Dp!~?YJXwIsdC1b%#CE߾ r "?@%=`%-ݾ,ir!8zV\wR.o6NZ @:3O'DW9F..i2?bӜY w3Jfz|,qغT>[ uJJNNzϘ);"i~Gix{+UR% =TGD爳19=+rvAzt>{NsAe\NcI(8 Fl*w .*0h\Nϟ o'[f39JxIlV!`>0k^3Y _r4ϝ:G`/)6=ZXkAo>C^m^xw-1_rj^BQN\+H䶝tK&WEdyYC!zRYi]^z\xzEt&ה)q4ko'M64P*J#5%8 U?Hp .H"RKRyxDpx}3a#; r$ DJяf%Z3WʵtM]o\3!LBmO/"C+~4b?9f?yQ$ H|JAR'^ 0$O2z`0.Uk_6_p5+1nn0K4C?epP{Oľ59$/&8#_ho)("%-IӑuoVMe^︯_v?d).izzq_o=}_eB Q^""?V4Ga\w&y*iBu<ϢN[="7JJ'| *YfT^O& t'He"4 +T H8+ұ@A߉XVDu}2vJ6Q[V޸.}|?[XWtFsr7yr"*=@8as }'pKDUSW*a5E++Qoeܬ5cBJħ9iA#xR(7PubMެdbDI·.#\i\1NdO@b aUIbvkg ہv~*j?vMQM|IGK"(4PCQЦPR!z@4tA@!((\Dq3aI z47}7Ȫ7m$3ϪUaD$,MB66 a;"yn&&zȘqs[=Ӵ+&ɮ{h$ 0K=HӥTz%cJD 9rCB'Ax^Ɯ?fp\3t_#w?M?Z'ۜd!MWiJILh5.%K-X8m P`=l+; DLϪLR7j3'z9náwlLO%#'99Z2tFۥ_dPR ςZBp^u 9]?놦Z3|n.wNyɛBlx/) h ޮ`Mwu<[5N [aMx#ʠ<=g >Ib,N:">XJ@,:m5(j38(L)W`4* ?uʯ+3%c$ّ @' B0²m51c7]LUO>m]`W_fJd4 @uqParߧI"D8xp-+̳>}+[kY^sH'oxަ(k)I -eZ!DH[.PH=T)EU4N={+ 4gߡHʳ^yJY[@A` $Ͼ9Y ws˕39ɄWa"pzpHwEgaLJ/FceWȇ68ކn$2@^ WG|H?)%B~8PB>sY!P|e# U[0@ !x`[]jh W}hZxM=_'?RB;؜RZJ7!n=0漭a)F _#=#,j,9se5aTwEE/K} $C$# ۯ:׃32?w5MDA|iRՆ*5V=RQ,޼XŻūGJxP(EZThK[1M6fn֙Y(og~o h. eW^_nNԭ԰":P K,x:Tt[U| ^11/M_&,*>  aj=%s 'N_;y nhtKlAJP<%wT">jp$A闃zIZMPuҺS`K,=YDNJʛX8{w|f~_N0A{m Nr"qi}bp#.ȕa@ݲrJMʆ '(hSfR4sT.Z,SB6Oc3A_3R0OUb'FQA)zTrgkl1MMO2i֩(#ܰI\loA(6pEDx!<eY B^"kmǴ;—6h R9p sDvG@>j3}LM_̹'+̛НpM Y(&~>#7Cn|n^!ċ6{eLeg;@SEawU6,ϔЇݹw9Á&_ՍR}t1> {B?l*hr|Qgd yFCż=ô:[⮯ ^b$EE7ɯ}Q|RP- $&m$ws{sn[rof~;9Y9<>=xj^ .phH+Lv hK$֢&.Y PQ\oGSˏ w! 08=e/@E ԪInM "aSC/fH[cp9es2RV4^g}]~in<4 Ve5U[I܀D8Ё/BQPlJU2ͥR݈[@2`'}_}~hP] tUx_~:\ ;QAg¬ʐ'^g" w(m2`O?@>FNk&VH/x+J;8RdoQ1]˲+W865ڇf94CÞɤ?H% '}W =CvrƋMiLg|w|VepQZ&- amZ:dT%#?=HH7STmMNC.fKq@ܵ6Es3Lfml+5m*R)+\ĵCEpRjEK%MĐIIL<7Ɲb!L2pޏ{wMcL2-ã1HG.^ˈ* dW$dyÿuE-Oʒ?[jYqAH`S />08{ozewTC7/'Oa>^S/ajeFbY U*:7nDar`clva`\/2eXi8bzdb쩳ηA q`qycܵi?D+Қ>3.ΩsWCsHRvI6U;mkUjB MNj1xerDCk򃥜Q hn]S}%W"^`KW=wOGŗԱLH_?["vZ؆6@OkKQB"a&vRdvz we=rf*ukvАx?a53CU_0%ugQR3V}$qs'cICw3ρƎM*oA>92:qL5 ulP"~H %z~!4TMRU~ +]q 6ŔP`GR&Gl9G5j[dTX{hM=|Q/Rǃֆց AE/I`HnA !g ɳHN_7- PHϐMp+Cl82[*zZG_w-MAx' .(6mKšPpE~ ??;R%n-@>}:J؎u\k/B!V2;|H:Kr*:0&t$7(zM9?dt!u(fMdh\T E[gA?0 @2p:#<+~qquzHpq;h P"_˙l;=J`L_(޿p|2` gؑS ċxǺ$G}g/W@b2s7'5rM:)餎͞_~ 8p$ <۷#<:XnD0\a5WI ?e9M3(-rOSCOxԊ(?a0.LQ>A$‚_^/&>䨾btC۾;OZS8+{v.䌋QŌ%%˝/-\଴=(U)(W2HFT^&{X0a2P!Zc4 r\wwmn1\o6[%-cM sAc Dw[ jޗ(zD 8j gxX^4'C#٧%rk0&1|\a([cV?9*E{?ķaэD&w&ˊuj`BnWs9"EP !z7|z| H"H#fBXAFM殻mzv.Dvaagl<[Ll }mp'(蹫9I&$ Dx(9jh4##\ׂųhk~;B"0SRũఙW:s[RtoZLɱ5! *6X b axJri B߽8(Rth"Hwz&V2m=M#p>nFõ~t ~AA% u&[6阸?P ح`ġ O)8^[fAO];<. }/,#M^&hϣp+!3YInZر&'Vcz(â 5kz\b>Nkm*OB)A)ДNA_v'my|A0C +ڜDMl Ggd1MgTsɽp 4L7, ;w򭙙KW 9&lr JHb;wLcBR\:d'%p;C{G,73 ʋWhں$׉pqE͊3GpGQPN 9@w1Í8N۲=D\; )v<`Ӏb'vY]t1#{7?7Nffs^n ,tΝssi1E3؆ZZ;촏|s@6hC',;Ka+c '"2|[]j="\ zKV_A+0dzN&pAN 4(~;Pu eLp,N<:c7 2Hl R#A QBfqd0%/2T(H%pvdZ>W?vHd^=3oMM lR6uņP h g`2ˑ&PqY ˢ}R̸k;oRU@N?ZFI|K.eluCƢ>S|R)YZb|0"4V~HjE:Mc['qW4DgwEp䴀Tڔr@Rʼn8rG *Tڦ4!R[&^fq8HY+]{bօص `#)P0%7w3Gd8‚[Q J\g!ځ083R=E" / Շ H'+A@[7 &Vfwڬ<aٝt*+uR:C;s@8'[LEÂVؑ 0%=+f by j~ۖRP(WD/AoꅋQOE޼x71Dj둒ȡn7o73ofN7, zZBIa)hpqwt^([$HKn߇*?@&(T%aˌC?9- eO_`Lj#XJ8\{Z*h=j9?os]ý1sp+nFT}iYB;xejiMX{~xPc4̓{9Ia#FvR7ͱO{TYN7-%`X|$,ZkrW5#Εlcz(q^?!?зEž'Lp m$~mOۆW_+W>oVj/]OYJ[-=*C-|hn$ Y+/": E{(x=0.wKzݎZp{Ә<-hUWtFL۠_b?Һ>h1jV(Q3^1^/N1r|JK[8~vZCCU?٥b8@S~n>YpID֚pO9Ii Jo2{mG⮭(&&h/iXіzAQ_T|M'o_ &`oMi$mfͮ3{N.>6œs͙1%6 \gj.@wx[\ Y*D.Wb$[' ,@pl"^{;s`g>2w l?@/+41)""yau)(%h /4Ey]E(6RX}_N7wSzskLj(`bmȏgz7ZMX]OB@Grͤ-qm2degA*ʁ>A\~u[WZiW ֯5?hys^%cj&.L7,mL+vɱcx ѸST愱:Dk a CdPub톾^oi*1ʻe7)7wՉdXX uqC#? F2XU {V޶WJx5?lZ#">eB(D2ń' {3v."hԜ(Z0r~nǩyۋ!iyt) XM%®NsWy";G]S|~z6lTAS+oݦ(zI6Mx* XhY!`{YJ[%mH(8؞ s=ۦe$;s{}) aDvʢ!W¡6*9ґ)8Tښ=[ $SH{o]<-#•g@x> Y>O` #;_^;]dN(nďX(r8'޹fdƏ!P`dKh{k·Žkn3$c2ٶN\E*猡 p|]6iiD.<ݎ0>"#cKeSe"~-8 Sz.^_J1Kkщ3+b܁b|OfOd ]|.+a\MB;2n~ UR(?zF-ht31|d%IӤYa!.S5JjH _8a-%7 @U@d]JצB &2w.K,zAkmЇ-@,J’mн+ mg`rn씕qm.#h dT%IǗ2]0ϩmh!+01P)ZmZ(o zNt' t_QG:L4D¾N3L<OȄY&!>Ei~S/ti59;_6pa4 ?m/O zp!rv==6pv~3('k7qu]OAff@y,[H<`4xЈCŋI4՛WM8qAn&^LAœ҆]/Z]X2M饙o}c>`~R(٨)61-RCqDž0(_kH1N0o.ZY Z0! hјU{, /`fWca[C N[\eHa_P a4Hw/k :q!H<SB:N[W0e/OV0T@,s%-[^狲yIOczF"wȁR^ ^AQ)ә 'd\{{eh|aL={j U pIz]Õ{ {9%Xf`3p%vAMHO f2&` 4f-z ߁mr8ͼܻ^{CcG"5_M|4~0" L \s'sײ4E&qG(T /`Y~$ֈAb ЊZCG&uԉpgS Mx&{ܙ bTaJ-y,[Him H'îi%TFGrȍr!hrVM F{h͙3 ^eus]7J\"H9 K8)J D~ٱEUT^~{9qQգ>ĕ_Ia~ү ؤM4qᆱ%CzQQv%U"8L,8ɑ;̟Ĕ Q P6Dzޒy<,/ $a}u55"oSSN,{}fi*Fn;?qD(o''G=O]=8f+ec%%n <#Y2BcAoѴ/La/a_I~pC0B#u> n DPjM xb08a#?$V:,3u<"ŶÂ.NT2#_ 3K6lP%$HI&nc;u63]ne{f=s‡Q]G@(4;o6S\D/J VJ6kxDdA*Qz},2>Dmn2Vn~ݕFV@У\N{x j&umA<+k믾KHGm-߁-+LW2ǩb(.$?8l .>dơ;,) n񡊦)>3x8=x_=}KM(SAx?/M@VxҰt2 K:ibGj0 svv>XƖMg6*0*,!(̋( 2/(JS9oξw>:@}y=^-lRVaPqA;}(2tIڮrPʍ/>B2 h.^ lyDɅ5zqa-Bewa 邳7>ɑT /ìto ?KA8O rI\Vp&8Hg3833t 0n)-B dRxi!6@!쓟;s\fM *c)0Z"sM9e/CKm:p vgPE%ꗴ0qm0lM@7@S`M6f&CvyFDpxٱ_#r0S^ȋݟ2cb}F]Fޓ<J?0ElŬxh>85\R˱諑=. -]w{!) ̌~lzk,d`hotk Jt8(وe/\OOAim_?x`x0~?W/ hGw1`HkKD,tۥS߀޼yy!Ov+^U#_'~Ҝ5l^ tCWU++[Hng4/" UQLXF>d]PS>I%)e;zO8]1Юcє!<U[ͩm`{`dP81OttN~%-Os&l<i0 TEz\ tuz _P+<{m})`/Gke!'T׼9 &kQ!FeVVRAK.fdW,tv}4+)##P5c>kltUӆ#~ ( YEWFV - j!h~PETHV8q~OT5QTFO/491 "m}VDpF"򛢶 ~()ӏr|zFH,!2^ZHQ6*cF+w5d&?lffvcɦ⡂"E<{UAyMRbYZ)-EM&P<+q2o{o7e$t7RD^A%i .0 2To|z`X5*ょ{:3ټ9kf= 2fx}Y^lكn?]64X_h7pCxҾ%F Xc8%(Re :tĪw<CUh( k&zhlr.|MMFEjW` C`Ga~%^_.``O !A}:2vp7AYaϯ@w㬕7xnC?Aw.cx ?O.I@B0mbk$F[Ij)10/Lm_YY7+#f=Ho+>Q? 2nVP N+w{ q pX'W;<x.}QwۄOa:d+n]h7 Fʼmͬ Z ^}.^Y8'<o~{ht9C2`XwAa$Fa60fdt aQ0 F(AD+tȋz(`b Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`]j0$vph`R!EP !Eڮ3kzO &iA/4#4oJSSxÖqIlHs"N| #Zj!+h6wlӒ ͂N!&SJ$"TzB,S旤UuݜW&I9q*7A {g\3xõW;9o9cЧZc; Ё(#<`(˰'^ Ӯ3p>Ck k1,y!O;?Ӄb.^&e` \a?%BBL / &=OA*n_^@uBS7-:lZ1g^Rrݞ+J [ tq'O%6p^H@uƞR/imy$mHP_L]-wR<wfX_פ:%Q%Qo$E51S)@ݫEnD-.^2lalPDv<\IѲzAQnP!;|p_P;drIܶ|̾ܕ|c+#>(gKwI;QE?2뻚'fQFGؓp_1zCVwd60Zۿ4($8}{#|Yc1LG$Dom4vڢS͝A~/8|V}25G1Qb#(. pZ t7+3˲0~!`#Q/`QXA=_~T-A&.Vpq03hHs1|&`~`;څgzw^}eӓfcx/w`#@+F@gF!oAA3!?22\| lg D(8ٿ?&> Џ&`ױ 1H+L|4x􂝕A(m_'h2\P@_ 2~) lE}ʠl  ૰AH/6P+ / `dO'GKQ0 FQ mah=2J7h?`FX~t/3ڋv}B1{w2z&6`f#2X D*/x0mA&8nH0p|@la!! 456l+/aL˰}c`atb~Q@]`X!TS<pQ0 4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 FD331p111iaf&FFƭ">ft ;33#?@h}̌giˏfFV``sd`$?; b6D 7å2mc?3Ga^'(~RO 2=xzFÏ~Ђa %>R~$T٧K2և߼W|Hg0]yeDW>i (@ٴ6q|t_n^YX$b؃EJP/x*^z x ZhBnLRLHM} =9_,p@@D^_:)+CE]Ym[Nxm($)% _٣GXV|e'U軨k^۵ghOX,&AHغa8HYqhj|e,Py$%LQ mz/`Vp}o~"馷L_tl{TZKPS?fgc'͞3' ݹ>6SJsHprE-O(*kʜ<:̡Ū&ҏ6,w*'l~\X#4t}so>6YQ?n@ : 1v|M84 (} O;u40.LJET/f%Ӂ‗!pĠ b0 /{PK9/7D(5>i/ƫuJC gDc[w25'@sԃS[mܘpSK?i0/v( p=Kv/H>nz{o4TID;=/3Qr,I/i{6H|´ÎPܠ%M`vDQs@dxT9?;ަ8c{Nb'nqI4BAP.lWqw~=z[UZ.tA-/M4uq nA9~ggfM_AHTѮL\ic Ob0blB 7)G0>k6b'4&lO( O4T> .ծ F)ӎQH1|@I$b"Nï5:e#~& 񟳟=o쌳ܼah ΌVU-(%H,y sl>r1$jSrVP9aP4o&cpK_N-X)i7sp@#,imlvZVe7Q`ұt$4v|O Y6cgu) 7&^(kƼD)I.<,A?lo{~=2̺ZBb0\ҽVkxt\ϨXHQx::WI,Ě< R [J^-aDZ=Nij[)ȤVMT$j%6tO +.xU  Z Iw2~$yF/+rJG{glp0|h^P#y!-^>;Q*A{y`SaR&r|EA< d/m']h6\[ 0í>7yj!,(i{t)͞`lTI6Õb6\4׃@ĂH^Jo>Eq#w;廭5#8S,0>^>^wo X@l&A+EsL27 ήeß8!Kj˺ GkW{+#خ?`<y},%!<25K]fJe!R\$)( x@٫5{:Y - 2&"6Jy (R <7rowoZjS~(+Hʙ%aF1y`mw'0 d>'Wr3E)NJ4u㶹]U!v(u>@>a~t@q7DgjʅQ  q m8թ*Sr9-4?6~}c\[>kSAǭq9*_P*R\~-yXL%4Bd< i; EQ9 qj.6ot}ug s'ՠvߪ2u~g&dL Mhr4;GfjRHHb ˉA,OAn4/xG!<$˂O9Aj8>2[=fwW)bS1vQԅ|ױk'ُ'Q|x`z(8ߋ%۸k $vq0jiiTRAEW3 !xG7BD+ RURI%PRR'm߽^ۻ뵷go)}93sffX@WbznDeS#2K&#8w5'ޢ0M^'B֑Y5= ]΃h~y4ȉ';{-0~^{Yrs j{n2e b6ڃuYE+1p?HvKv|?L0dmV\vFՎNt6Eag̕\3#4Ug.4,\8 N{jMաSmޏ\KL F\o?w-DrcqZPVW5{zp1X^) v|v e47*5Tbrhxx3!۽*C+b@7 Q ~uXvvk6RJ%΃=d%Ud|K_mapGp\;F~C'8Ws~Y:`?k90jW>]@kd1^}'o}Se_151lfAdh8^>j"UIe(^DF ?[oYCn\LR'&âvDca,}_z `u1 ͱ>_%'`6O*e{{X JM #důIԉ>(\}m?mD2)j_G9s,%@S`#^T ܵUv>Sj|\p z E)1YFJu}Gg0o-mSaiI,9vdbh<'6ЄE w1%/7z y3ζc&вdn)cmkD8&|4QUP=1ӝ VOgfNjV/ P?Tv_GXEZ2i[FQpx h43-'(zvckG;>mDA,{VWHv1o[Z@Lm醘J> {5͡ӹlz`pq1N툰)w^k?84Ä-f\ 1k3 ABiM Ed]IMg|.[/_c7ϧW=/rzy`g5#l£;t>wpⶬ2i z!WfB&FEzm76b]?^Hy\OY3N[ SQ+k겮J*9,UDïlKIjm3*+0=Kf 4?- J]jltʝ u|u]FnBdJR*ku 3]!G"p  _l= H3TK\EQ)wJn0jZ7wvw1o|O\y^#iI6 +3qr0oii^Bg}DDX!8\=jSi &y ’isT%wnN@G^߾3\kn/W:_)y\G{H1?Y;J G`$ O ()NIn&| ($yw~ޞ.ԻSƅgGF֒\K}NuG+Ĉ& paYb<( z? П`hRMOL@T&zݿ3]*~%ǟ\KOO}0߱74fGž#|8M-taN7TM3K,-_)ڕrd8bww'^LݣkXtFj%Q 3aAqJrLd?Cǖ /5:䌂uwvT*m|mRklcPL7T;bh39Y~QD33YGiPPԄx'oH'*VEjIMdcww8 ?D-YV3wܽח7;%@wD(aF8+ A5tUĶ1ݕ@z*q3~v5\7>qR(%\A/ β2FbAur^y@9zA2hXXmE[C`۹gy4RtlqS?R&^xiE]'?y-f "N˥ƐP0FQ^M{3у*%s!o&b}<^lA9쥖Wg%nV ) ](m=dz~ltwS1zH蒷y^x~eWϏEJZ=vK 2:?i=E_Ώq4LC[7yIݥXP-ȡ0Ap# ዻUߏ]vC|኷.GOo+uXJ͸x4 Xn />4v͐1qǟ7 C B&ic6{뀴Ɖ9y7,H\RQ\1"="1OpN7w;R}/T I&ȏ0#RfXEJ\,gS 6ycvvĻ(s$j|Ƒǀ3+Q; yϋ>:LV5!tҲKǙtnJ]Xd&7e[6+ϳMM-""FWf'>|LB./%;_;t#J`8abD:cb,^qgVF|GYGݚS $V$x<9}D 6dVnk5\o?C9c ] !;.^-xKx`3*V.ÿpב՜X-eP,@L'۝'h}HK@D>y @tT ᵧ]ÁG2eG7gQ(gE( җEg=ƶi z1)ZWh}Sg#Bg[d ~jxei6M8r|04;:*X +<(dlibCxww)!,DJ\JY~f(x5?m˾{91|km޹3؞W㼚NE@ B,FT`K +~ uJJ(mC&c؞j`iysy}߹ .&A@:[e&;CL |@G@}j{[88׆9 Ƨ|W1 ef 9B 5҈:ڂޜ[:/K7N>/t4"-MVl 8ok4/b DtǕ0QTFodނ 4A1 G /l[Z݄XRr9c\͞H_#j0Joy0lՊf'q9>K94rFQ}&4Ofcfv<ӿtB:^I9o'Ҵ8^LSpJ+Ȕns[w;U(9P`*yXDmP2;Uvp@ lAnOEXp SlMb^Ip/hBcz'n8468H5 {_1?B>Tmзf oZ菞E5>vHkVRzByi[l7j_}q0~?,7&_0]cU}-v4"&Ę8ĭI{q# 4; klՓG2=_+]bV ;/& G%*)s $x`_*~HɏAB"QUډU\';r>E3(]j_xLާ7v=Q[P2}u^DZ/-^oΧϕ{4{*֤dJMapUeC\8zشqz]wPl뽷^7Beko\iG??xs]nG>;^ğRR_}kMUJoR7QBH@uIk;Y7|gURY+sΜs9g;P}^ѠDY_%4BX*jX=EL;@x T+6qDȳ)Ŏ9 ۶gG[i˛ſuې,S6m^fQX(J( Eչdif=Yjh=`+/cS~'A",J19W<5Xy.RQ }ӤdQEf0C}Jgf"1t:[)h\Uci%%cntwc/zڪx3*( 9-E%ijeϋ+˧+KiC:r(kۿ<~ 97Sv lv S;<оd8IL % ;btһ$lwFV˿ׂe8-U= o~L`i:KNofq ۑ1 zym,IAt9J) `-^HEieٯK%-_?k>e}?Dž"?Ew "U:rF }gȜG^ DT^6C-\0"3#Xh-{bs7^^l ?޹ ]n@['cNԵw+Դ@w[lY X `XTQiԒ4m4~3SH->3=1Mx!tX!6!º & "0d*!jfXdY*gP-Et )!/`CTvNhwo<E15ڶAq /] ŧ o>VyF9z)ja_x&-@vQ&dPJa$%'D;ZzdH+$Z$G `mR \aLg1iM~KKʐ7BV D ƒOTH2"-1)qXK,s|0XgǿI_<9@Zf&u @`YwrIt_Jr '%с @.:lL3MVadzRjzl*˕t&փ~xZt̷_B 5h1UQv~V5l9H32Pq(FL~E;ЙcӚ uNr}I+Q3#̣E#DSm< vu0gGޮi(Nm|4MH "J6*&@vS bKPR46[ 16H)N";܏wrzB_Zdh H`BNA+<ML ) A`R:ui@(.ƪoNBU2gw^5+R30:e>o-d*U!F(hhV^{87:r'2*f9z JR9-:}MgAm9jپt֘R:`^jQbU G/oOK:93љ:-)>G-˰I(%`z)瑜rzj{%vJZ7=PE5XSoVz4;P@,tt0  Nt9*ߒ)a+GT'x֑؋fr*=*11rIFכ\j<&Ø>4,J6b!3XՉ/0_fYݐRn}V_%Yz+Bǰ:{Hz5VF_v|}VZԟ{{w0Uy<^@G=* pYfn  X R1&l 6K <ַ%ʬn(|jf<I!XU#}{r0N1ؒ} |5^r`=sSuE;~>Cbkm&n`0~=P/Km~$.$8U|8h\7a˲ߏ %Ϩ7M?Wrӗ,A䊓B|Ț .vv?Voܩ/[ @>H}䒟2UMJM8uDŽP%om.X({ EHI^7Pn̸T]<ڠXI'{WUJJI磎},O {J@(6Qm&s |#%ʦgih<ܚJٛ{!a#ų6_8}í+ ݥ_uLLCa`pwO~.:,Á`o|.#^LKmtmqbKv-Z: HL oD0b۔9iʔL~lm?3o[Yݱ1؎$sw| T *WFz?Zu P:JWZz\z$["*{}]nMuf?<δc89OO_3A^0l0_ $O_Ig&^]H;D%VuvÓ%5Ea {{ȏf9ar4OȆ1QCjT-U(q 7Z Nu \KOQ>'E *,4Q|]0Ƹ3.d!ƔH BwKeZ3mg͝?PbhB;sss &.dr<)Id."c4 ? ƲYA@t8o9>R 'c欅up|]ucKe@N\;0ecɇJ IQ#A) _B`W~1t3|)%@MLYvwةloٕk*]AZ$htmYHP3At|iK4nxb^("@{·Di0񕖴D?#8;XݳO;?;3y} ~'_gbO&}kprja5 e^}T3 흲IeM3aC~NgUW읇OHlKvqߎ*F g`8K$5žzhW?J㞧 -K 0x ?|lꖦSWZJHI{Fcu͈ >esF2'N{g]Y]>BY ȣD⒊nGvxq> Opyjl""6cgv~DOK FQ  kT{9LPAHƿh$#<_22FMNܼjVfYHwM 0_B躯tݳ!vL7t;hA!(~$;(<;>B>m6^΂lq?o!Olda4Hs6:F/s?nK2F~qd ^~go!5ݪ&Qfy@ `Z"a* $Fݸ3"zt]%g74ُnݖRJ[Rl! @ ~MTx1zћǎ)KR9BcP%"96;q#x+fpjRAp-;x_Dآtri-.iV"K2l#V#*ˆ9'tI,:|0h?lЭΨ( :6_j5p鐠wDQS.5 iP< lzS+7~XwsS'.w䯝or?E%U?ŧ)pYob@x4*q_icuq6WGERCY\jr6k?:[0=Gk4F+0@1'Om )@f.(,`;䇃xS)X Κ7we5[R5c?:+?Xi sZ}jQlb خ)UHa3e"XVʯͰlDy?ᛧˍq0[*Jy4Oޮd VO=K$E-b#?\# p#8 %DJX{%c;MXH$[ɲO]]U׫&7ݭ40^ (S]`q| gtb20ې`URVS$ t_xktxNƽ2Wv4 ǧ'75;o X1\(ћˤcN\E? BȡĂlޡ Ub\&=0l;~X2X/aeRfDŽ pԇ-ŮͪU=B3X2覉$HhW(?>1;ZÚA!Mbb)FNj;t6M~X<׻H/jE}$3@43T7_,I,`jB.\utLqZY +%#`Ԋ@\zׅB(EjEP ۃQUgeB^0rP[C^ZD G^TS晥AƇ#˸\΂ϗ@۹i]^J#xꙗ>R KnHA BpN0RhLWRH~-I˙ !Ɠn,_;89,-S@I-NZؚ>,/fҳL !OBw:)*;1ًsO%3خЁ+:!stJ.\53n2 ܐhi(okHJ\΁:eeO]3w=hѐ&{OҟdŒ29Ne-ο@eQBD~I!Csb5q+:NoUÈƅ_:t5n&y/eco^#%[؀hTCte'0q~$xj<r+ΧR59[f*$yZx^1L?1,,ce 4UbFeQ6J1H {$DDi\p,O9uYN7H4@f+:̈́G`*p RoeXquw 0Bx;/BzcB!;mB-")ZɃn=߆#{4B00$Z{u^__)s{+R=ٴBLz l'.=!p觍u# 02)k&M"Bdhv#٩؇1o^bLm;OgA2ƌORtI$+VR%dchDr̨Q;X-³\ @hZokRے+ } ܂X0}fa%wB~;L6uxr4AE%$گ;8#u-jͬw?w}7zPmG'*_03.=*YdAA_k_^oJRU,{nLG>Br5D(S. N̔- QAU}s5&nėn 8S7mUy4~-SuYڟƨe H@_NM<0uU!A?~!l,qSsM]5Xn |I} `ss# M#sNeK %o(%cQj[ K 1X&o+v_7;#^ȿԬ^ ߶B7o-M$~,}WG=VD =& 4 jiQ;d{qr "1~T0c,${&}o*]g[3e-cb=w .Y]|R*$f w mfO ,}ct:!eF`=("fYn&%{6/zr>"(:w v9Qx cg L>gV^‚J>\ݛ#3?\a)"8لl%b[]ߧ4g9Sjzxj\l] Aڸ_!i~5I=Gc_"xr=N!3ڀږM9}95^5|1VXjOWZ`'0Q?/_cE&QMFX,2y| RDb?Vzª6oh8&GEƦ@MΥ@[;y' " Z$*a`b>I[0c?u)nBWV*((p:EbC埆z={u^/Ů:BG7CjQǹܟJ=?5(Mͯ W~/)1rP=QQ(K5eK6'dR' Omb@wPP-}ɿ_s4>5rl~m8g\r9c~ikqQX1Bi*Dd(3?9]Y(BgDo#XqTYݮ+ߜ$[ѡ= -( JpFvя'/zGa˖b?c}붠mvkf_x& >/eGLZEZX=Tݳ'œ=ޔ-Vk-6!Iv8? d|7|)#k<7`; N;H+ls*gn8l a9;P߄n:jBsA١GIͫ+l5 Rƾ[9[3^\-І`)2_ƕPe>rЎ0]r]Β!@1MqڕEjruCa*i4͙On;ݎ2iGDsb7uwX򈢲J.ӭDE ^}/&|Պ‹!TI;La0ة18RĂM/ôn S²"QM̡4aM[K;a7 R"l"f7YtCWs1# gr.\96z") y@GmqAY,'#sN7v0t+dy(w1E؄'Qh>s_O3e.YzI Fiu mRơc鈀12#k-n2+E„◓\i_csq|Q|_ <@_G E 01&J{vwWLܹč;1.,` mm{{o|w`IiIfo|?')[k3=LC(85z 5%ZȄTDjB:8q woL' M(HUz#1=v9h0oGd[31ݳ9RѽEi [?  "R&AbI|QpnI^튙a\8 x#tZLZ#I aRF"Oۛ æw 0(}3-9D hA4EY_";G$;lR.-4AYڎސ¨,p0U )}@-q֛DDgw]JiƄDч&>#jL71PlMЅrꜝ?M,wcf93Q{ *S9T^=%yݼg`,|D7 H #fi ozɱZN~U2KhZ}q+IkD \C*Lj)I"$xyB߆G]nG 2Q*s7] eg Zf^dGfr|3QYIamt݁L+|*od{UlF{u6gHHi{ X8a{C"MVQ#Q7d_0C8՛GUrV`;_xh?;*?QMN}:Ot;ViD:- m6Y=3rkwTr;:'n> HYwV͋Xϙ:˓ÆY2\_IKjA&'3ќY[]{||<ٯ@ygxQ{&ZJQl4:v㳥=W8}|C$1e원}lM@r Lpps=Z\' :ܑ >SI РoF4򆽑dgyoehAMfF<\I0] o=[HڼK ݃82UPCή)Kߢ+2!G N.TZ%OW>g̟Έ=“ p̵d %wtOUׁZUtQ%"YEˠ#HAlEvrF?nof]MO@ I$)F(R9T=T^{ W A@JcIJ ͛oLO>JJ 20w^!GC/&t 01uCAK`;k['1O# ]Y૲H hf Io+ԪI~,.GBr;xٯ/w#1vgX"YՔ+}xUΔ5MZ-h~Ϥפ>*_W05o5)ÊipBg ?֣q?8ר iѲF 9$>8__d27}wi1 iHz1ZKUBi\ih~o=@ѓ7Tޟ)E Yjf}ݩ@6!r^O.e`V7HbT"0(YuwB/PP3ByB ~xc ?d.' (-b/[+ǧ.j(@aX(ʼf7aɫ.PF@$> tdԆk7{% -fyOpnȔb".}boR_d[,ZCgVQN(gu^Q J(!#i:R/wE*yJwңߐj]\Q E]oݰm|m@hw ;Kb@ձ́|B>ESI 18X O(-ߛ<j_[H_7CN]mz}ZAS{oD]6[?'FZ (e{>fDn<4 |([{~n8Al>ϒ'Ot3Wzj7pW^e'f[mX(;CJR=A # %l Y]B%GujpĬ }3R\|ƀѹ?yP$"F}ye }_)$cT]/PͮL(+pD >RweqF;: Y gE[D\FӸ^/P-P,LZd_)+Sn?̀3Q2P ?7S3r2>5P|%/6(|1`ƮU4E"Vʺj]MA@. X A)BcXuCq6[`ʑOU@%bw։Fmp%і C>QnvpP37=~+WUwu6ax)LP/uas;Y5}@~޴"^A݃ }NtKBw @ JU/67UyNsf>/+,Ҳ5v_4(v*}=0//k@6dZ&V'.:l.%<:?OMT^Ή.5}3үK3\9H&e'm,uO߶Kjrmrs+̋Ĵ7K;s _\-7Qm2"CyGvP]7͗)^8cCZ ݓDQ)f A@yĂt8&^W4V#Om.\R}_LfC uZʯS7zg`"uOū2j/h`x灺^1Ah-H[ k_W/2~i(# mث|u&A7#\P84<]<8k280DwЛr$V+iX5n"a%t9 "P0:UGaIP}x`R'+?w"1s 4jo}j͔#X]}0 "EP(,3,tZ@.` ?IIu?q1a.l{ׇvSQ}5 N%+dnB'.[.Bzš]I"(iCOjHB09""o >ehe7?ͦlvPUYV{KC;T,#!2wW&0(gVh1QTݮfz{ s(-h˦)H0v) ]2{rȨh71#3(e/}X({hר}tO`jvwLgOi4,4Q4|p%.nX6,\hc*J R(8ig:7@Ld6hk9=?Lx 6"| ?˩j [ND Hi\b.<3 bfRE")"e4|fD> ]yB AILfFot p6NlزNj/B%/RwI6 DM( h +NS_Tϰ {;u0@ۗϢ}3cHl8 ̡8[ʖq,C̖(zׇE;] T¯RlƔK=&|'%?I,d]zܗMt6j(: DׇI"0A*0ag}h )?=GşTtV4er2ңq!ISzMHw%e7u]#^j;$!0Dpzb0AϵY.*kzQJH{]m&~_%H8Y:CH,H^*b"Z%]{"i*'7:%nPCR0K6v]' ?j7Q|6i<߼w"*ա Md9XI|z~RHrx_ q3 G' ,"ٜY[mw+sW4?'8MHhD(o;/ bMKyO~AՊ1E @\=\*qd4 {v Ux "i(6 za,KR˘%{5tom!xlOW b{r]V%dSy9 UD*V킇tɚ Y_+ĆRA%J)MKGlvÝO)[3=ߏ/94(7y 4e8{RPT8$5#jBU(O*$J ڄw^)ihbKl4OIޗc( l_+hTrjx$Z5QdIRh+M"Cx/S|` uˇv#8F-L _e!丆Mg% 5 mR*~Qx`1Gi4<s1JXO|X+ mG)qZ*Hg}hM"N Ҥ Q f㜈\[?h-&<,X|忝Tr|xӑ]BM6̛0IW6E3l֧Y)0?~ Sq% 6.z|x=|HŽ3:mhr^kmZn %FIJ^ll(g8(_{` 6iEy}C 7-q8E·tINl%wWDEL2`H͘b)NH_`k.EFiq 6-1!6I23|?g았<;swїfÒ@Ya.K#˼ 3,םӷXQy&M/x&h˭aWipF)a9Bd`<?p!v/Ϣv+'Szx eWg>6-NT'dB $a>G:c.fDhðcٵB”tB:\<<>jGsdzzKe ϦGE<+F^0M¢á,\DD 4OtYRwU? bx=^/*34_5:BvX2J>N=1e`:J=1'OyYF$Ȧ +,&KjV m'颢qZz zv> iY&J*;'{1*@W »rs~֜2a qh*XXAX]cav;~ef{#_]& 0h 3;8 ^&Y2}o3|'Z-<;%\u٘~1 G퉊ODyY31?cf:v~4 ?Hs"-digf{SřbcPVE)HbБddW/h5+d1?C_6PZPϐ1h;c$9 f03  A ax_AWLr|;2*~t Z0rG 2z1sQ0 F@v-G(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 FD('N)Ivfy 2\7Ep 4Neb GF1Q0 FD,7 "`Av A|- W}tf0ʋ ndXn@   7/e~[9 3|=w%~ ^d`L=`-<  \@kv_-p KQ 'Nbݒ LА?Vnyq J@3c(Ud ||쐴"6ZQ0 *WX~32:^fwa-Dr[1x+}/0L3bxn/c9003p0g4d :kԣE½! J)B@ rSo~zd~(Ȑ9%?X8oeHQꅯFHŘ9 UEMeLX}_Y<5\ծ* K|g TvH)8lΘ[.[O{ӘfЩMۇƅF/Bh6^d] \Za_ 5x_$8ߙf]S=Xͱdbpu)10O~_H+íjMyw0 % cAЙScehYa' ҵG X124axXL\ x 4]}\)~WF>t3H3L>FNH+ '1=AG$st` hPκ*2~_ ;+2į}&SvFVAy4B;C  WW/s 2vX1ηJi]>W}6jLÖ߶Pl%%~ ovw;dD(w=Z%یȫ8|ş9} 5>?˟~|e`Pv`7a~_7??7뉂+T3أxXA*HPWEo}aW ENaP\Vi3^x'vO.`C&p,ʓ/\ 0]3*9B q ?#M?Ypx߷I/9t_~nz?l!U}Nk>pXO}4jř=bxץGO ՗?E_32g{oJI |z=#+~. =(\^8&DnԤҦ6&`UB%Wo= _ Wς/7 H RT0R<5Ζ'geK1*!T@Ht.2)!82X b bmOIm&c/H/fV l/>rP:FJ@z9!dXtUڻ&<>ZD $_/Q~8a.qM׸Bc3%x,04c `!AH:ϡ 7ߡI߹ój:Oʂ,k>žQx 3B&";hCهbÊ>NW{2>)(&hQř;ս|h hp)Nps.R^β=4SsӝU,ںNrHy ^MHf{\/'eIc=u''alUj3{0䷍]r8ոk&##.-:iex6_l?(]!hJϙw 1ozG? zRYZ{_+zM:iXoY9hl*Wꮥ* yxc{N$JbB$-E ]BBH,` u?;* "BDBIqD)ʼncg޹1+VHn{]]͹k C8"F1$=aF/3Ce)ôfGXcR|M&RNf#.JcfN2?b{I{0YW iC, [b8?n+/>eQ7oB_2O'Cixw݁1&6w23sټT¸*pLo"e5̲5h(\g]y "(%ךW N򲳴Vȫ%y\6c +2+/q|*wDS.ˠ!FtB NW~z2z.2G<,I l8.[v _4uQ aNAE5^V|e_+J^<-/%X@t?>o^nFBKlu# o!_wDx/Ɍ]X KU T}]W eޔZjF"xyY(0?7 '{3fZ cZke "@MK @šѧ_*ʀ^!P'5t}bY! P JMʎLI)U"3.L:?GqGECx`c}[s*j9)R|'EHآ0[1qM8fǗo{7ƚ Ric8/:Mȉ 3'Nb vCjcxbSfi M8q&iBKR-PBSą8qqA h+QӖIǭeS $ hV3 X݈WLi^C9[sfvaS0׊vFR tEzFAlGv+u3v7$#M0:lOzA9|iސggټeYD"Q, R7aj^ҕ'v"޻?grj'S@?YRfnjpɘ7tN #0J#E%!y׍nGmn856C/֡tskY v'u֖_SUR4EF rdyȬ Ff2(P@%i;ZYŹwsQ}ՆRG=$xDcmЬd́9C,X,Z4(7ߋ""TMy] vBat#.mO%䗄#6. /ȵZU]+V̢ !:C Ԍ0Mp{/'>:ל"OSVE# 6vaPM׌3hN?7_\$ `&c9e3^)U ED`r@jB;)W iN4t1BŚ~=Vj)T5R-(`L5Xx #9oihMvQ]KOQ><[R >HP1!1jL\7nua7&ntoNX)& A <*H-ZLig¸'%̝s}߽ޜ%4#mr:j\ !~@Z A`gl(s35>mn؛,\ ZUł}^S:v( wu'Bc+mq-$ݩYn}kg} ج@y>է ɶ:j(!X_\S ! :σS5_inYR#?y/:X]?1VJuL*;"̈́ٮ b", BA!pr)=֪KǕ5(,'W4VoyZ !>6R 9rV4V-@R0]DD(YmV)V>&C1Do1_6/[;0ћᄑhP_r} dեM`k結8  Q%.ۀ๳-GA'HS>fK/ӎy 0(k/&-mU*.v43.D(r֜MK^5d(̩'8+uAרW앟rEn?V;qÔbELK_j` ^,e PB.tچ$amPK8WN _+XCmDv:,#j;Ǟ:8v 8+<$]MfP2oDI^j[p; ݖ_N) ̚ @WZQA{ћʩ 9F@Bp\ o0bx=`m9fPX@ %"xA9ʭP =h E3a ;tqNFaӼsmqSQty|s$%!ihSMVHo "|_ xACHTNè2d.fy"~ ?Y4{uZlbX@l -hٶ^E퇬v>iKex=nX` Tb !!5}|H8$@/yM8aRcXT UM[oQZUDϹI2uv\P7HSDLFڌ}VNg !Ic*pX٭UJ~}kj{z,:D~ȇ~?cn7RN2bÍ_Gqaҟ|?B6N|hR)j1wp@,wF0Ys }O&Ok+{v3-l$8^]KJ8Nh/^ ǫAڟ str1fŰدobS 1bۗSx9tS?4.v7֒te(?:rYܸeWr+ !{IAo}uܫK#\'Wj[bVK)Pىx[lwmMK5CGǺ7;CMUW([fNX@f5׵X9Qk-FT /4\ņPԹSXj: pgo II); 02gY(߄2(y$]z=$M@NEzP~wnZ%lVKĶ9zr%C"3䂈8Էg+c>Ǯ {şa}gLA)#1W6F?\;kljqf8dN[RWE5Bm*X)T0Lıر\-6q=w/lo_9D16d񖮷o 6N4E|89KS'd~:UW^ë 4#K~N^bmqO8KM|k!MAw7)DsgVY!h;VP>]ƉY|Y5zNjAE!>'\;oe=k1_Φ$$/Dq!<nw|8z<y__§725ᯚB~A'Jyq׀eb-= 6B8Aa' uNqZYx/0' 5?-NrXP~ { >@28Te"-/o+%XrUu 9zu.J?{wz08ЙMˢaNwg# Õ"=h_ݦ :׾~ıi`Q@H ``͚-+V $ʣ*JI> ,K޹gΙk d;h+je=Km#4y7utZ gT$0$C@@{&1z85o  p}fWP a%Xm6^!*&`)0 bnâFH)J(DLHJp? 82&mcu.6>XO cBߎvD ez堘=POw\z G- cFӢn%K9UC~0T$9O1sӌdӱN_75O< c8ZcGǨ^cUQr:MwG3jؑ5ABu8πg͏(feVKC!@cPۉ"R dmoEy b4_rծ]YW P;X!SQcT v.o;zpX? GH0ëLN\ҵ=~}8ՄM)|}U%4C܂ x;o#]?u}co3_8NU6w.RAV\lf1#G4o,_O?y;\bj(!0!]û Hf_Z_jصX `UUοsACykPuP Z5g}Rٮչ`?z1ܽ jVϐ.O h{ دGq|2Lן; یl?̗Y'#ET'}_c4q\k;;a(`\&Eo(~ ˵6NEs{8NR2 MSfZ@h %0 `x5{HHP¨e1-MaǏ|HX8Q8|߹?!n}7kr c |ܼ:kxIdr1^QJ @%K6@pBHԏ+5mh+E&ch;?/UH9oNFuQjxwYmJk0v`@v.\bc:Ag8v$)t%RyR>Ջןy}EFMaXOS/3-;.dWCx :K$Wm~.*ps#h>RN 9!q"aN8bbG#iVzxYXolش5e{σɷNvc. wo,}U T!zfuAt4zx0yo5g}FYC"1c^X8_e!viW fZnTN憨_6,116tk3X/0@v|0s1| B"4ͮ_"RxBۃ(xU ql}yw:Rn/5AJzxI6M)-)i.]~X HT6{3=+Ή,g8~oz Sdh<؇kЈLjDoSvȓb OÍ#z t1߄?p8(8FG! HOy N$ʆG2z߫ xiBį{us-@ Ɠ4t(Rܴ* /SZʭxeyQt1NR<8f'г!Qi ܕ$)̯VG(0\'wK :Ϸu%3jO SC~H~G/3hwU] v]fA ۔ 3L|{kJ8AQNN|nYNm.-6_O|¨xePw,2:F~i~? ct}!40H64L-8:=w ۗ"v[6ԋXT~-k+ U&VmZoS[B;BR, G AI#{*S@P=hwɂ^.([ 8W|')tvZ^gXm̀l5IN:HBul>oK/= †l?dd3\0^k7I'ͥ |~*uAyM#oײD E=8F`8vMaUc}R+TI[s,z<}*BYXđ-'Hқ6̽@&2N耱S8lUV{ ZL:GL$3ɠb{=r~s rmCJ2Z]vpOz[7w1a|ϵ-wؽY1 2fD)~ޏF築dQz^'@|p8SK)7襄]*x,i|PK~"R{m/s{pr9H"% 0 ;O|~yˇ'Er>kYĩ_]M0uH!R*[V^zhJ=.,/ǝgLT((gnjz8Kf̞8]Ge ߇8t&`/0?4ݨqlZQܲS̝v2q~OR1dyh|,*`AD@8_+1߲"z?b_! `=`M^a:v²,MaۧǗ!5,s=;7rzGgK!Hҳ"g̼Zн (6ZF9,Z<bt2^Esx1JD[ޮd :$ DDC.(S9FqA" l=zMƣ( Y2xkWUJH^'2J@c]D2w!"W@ρt}fz@jA` #[aH<֏t@%5zfܞL駷[d7_3e Pr#\WN(ҡZn }`B}oq/ڱ@{GsIwSF8hj_ˏb Q]\yTY8Tll(i -QS_ ]`͒2Ys ȄP"tk"'K67"LG ff.=@`sl͂l-{ CEZO?$Y=Tr: !ĞТ\r]eg?0gzgl ;?LoC@sO\tX!- 4`K 2լ_Wj^w]ް!%R)ľ};o(܇خ}Copx_y[VyĈzFК2!vuNӘhl*7z}ol{L ;@"G 9fVdܷA|m"䅯d./VdD9Ia$ N-!LQ!K}nӅDwAdFw\ P=4nBI}U߰Q3'JH: &[$[ .,&mOiRJp*U?k%H\@($̛pPjƻ;o޾ *WhgB'zgBQ\tpB(%ɀB1IͱV 0TG2. 0c_yw~֝4K j̺s 'woi!7rT_v eMA$AT(@VTP(IjK|qt߿ >qqR녝LCgҐ9TtVB(? A{-&{X"}fEr{d T@#" ,K||9ZgԷXj35!Ȇ ;>=U[ OuޜhgQlC9Bk*DSܡ&J΍&,*e|jƅ肪|iv|x t7*aY 5il{f>f*Q2*IV{hXs@O4E<vT?eG¾{1gm܇AW ,޵C?ݚ xlYSoR,}:h&^9Cw OD;%fgylZMf~پat#/VdCw7x$XButv:(F|f'NdZ~f8*PKx3jdC׊M{m=5q_e >B-UxOBH|?JiBiD+ñ33- oZ͝s;'`wPgE~%E;)" ‚dª>(t&KY߬.Y h/] d]%Bc{ukޞ{0~%cW)Ӣ׌I`qhl(L\A ԘD3]^JpYT?zfc̠I) +,5HE= ˔:=?el0pe#:do}eШbq~:s\w}7`6^(op;I8r ~5){Ht6Yha % 0LYvmt괂d/F#~t.zݺٲ;$* [eGSo2~̦V*( OSMu'Rb'S%k`LiXv`7*= {$pHD셾\]̫Dl,(,"hZGv/DYGik1S0RQ5 Lu< c eN% 0fDa}U0(?K;\ind֬}H׾* M0Snlc ch;Ϻe0& &?"p0)D6! Oę5jM&DV?/Y(FtFSԥ_"{I1Ya!X"F#٠{YO_ c?}?=>N<8D 8˿y}]bۄ" ! Zz~ :RH%JN$>Ǽ۵Drqnfov̛w,)CaZ+bIʯac)yl數rm2deZɬ:;&\ FE=b}:@.;)%Z/4(/ ovuIxѿk3mYv%is -]$^=ROY ]`5kؑڝA E]E<#g d CFնvM UU r(51a%,cBP<XS#dc墼y>Ξ1q3&𑟾װ0hl+D]pV hES!xJ( vxxGl\=!+x]i*qѐTOݍM"_=); b]T[_t$3z1*X0L]Ƹ$do;zysoҞ&1n߈ 3;;*( H=}n2 PT5+W 5LάF7;*w_(|ugyv[};2x:/aV~tf[1@<$;$Ȗ us AC :jBO"8]CP#.G>(Xw_e/W4SBֆa/܄#i}ܪbe';q&u6Jesw?ZzMWB^aH _ DARį]fv'#(9wgfOk9gRP \Í?pk޲~_bSϩ3ܺa>MjI j6 9Y~}Z!:4]-x ؿ:\ jنX̀lh"<8 ).83c ,[_!cvaSF/ &"=A*`{nlІ'ATR3C/rIWv!wD)o0l;]!@T0~pDfu`30jŸ&3 X]ziG^ A|Tr5w:- &A&3M"o#y쩟?BcB#pVm_Tga QjouCćxsz ;7ۈ)5RE܊`vΥqVFNU*xow-_+>Өoo]<#Ђu=H:Cв=ݞ~dj%o([(vv[tp`:)l_ ;˧x|n0l' a77IMà"ƒQ&yO ?3-HCrDVKޮ7m k6P JFꡗ{i4$ /ykdbggg̼'sNu>9t΁!UImk@1.NФ[$3_`.F(F]x Ih. ̃,7r{,UZ:dY~x4@P'x|rqƆO[ddC^sCHb+D6-i:G0Rȑ4u>헻mR { 0`0iTm~hƍI̎[Ќa?VּR/,ғ`l" VPi%BS2xrM=UnX"ivTӴݨ~R>^mVt;$_HN_%a@2:fRc^}l0(Ao&h()~ΑwL.C`ujPѤ>jfƱmF OR1E~<(A(e#Q=2ӴٰL*|!G<{uqh甹B_Z @AtY~L("9}EaMQЗJJ!Q 0!uU IpU8~7?{GGC_* "] jD1{+7F: Hz({kF x0m*qmppdP R{S戓  #zs*L偔Ss&Ùx>=FbfqZp #H7)^L$z|ߪ!B:aib$hrM$ף_|0;i?3QBMLԔ+sh6:x!eq0}GHz=LKoE]M3ѥo#}'"GYg;kr@Gks5ߖD7KpS"?@_+A.#- Faı]Q৥*1$\x\ʇspw6b\=sT!6B`i׹%OkI{F-C_4) _Xi.5+z/i_?w5=MDQN0LiPCHn$l\G1 wntmDcmϴe7=R&mwν_6oY* GȰ6 3 RE`},Ht7"Lf[28(!7p m0Or kou?rh|Ԏ7V7ٳo;MRXP,CN4땾'@ >'B;))]FFfQƍ) >!q8]r&0~1ၹAM.g833c}uz.E%mыƿ(JLI]…5 X8ڷ* (UzaN*0h:nrRg#qײ4DciD) J*$/J| $`l[hԴiɫ)؎\s$a6fNfμ\)/),fU2BQ<#H`ڊ,EhgV M,b̲/{^p=xfLaFIB'ᆑ#'e17?,y& 8EϹ3rw۪LE d:'Gб͒ݝة(ojFF<ũ?{ MI@ 7 MB"2.B 'g_} zDʪşeEsɠ.}ҁ/žn=Ph\3y۹B'[4 .|$mPco<}9yߏNݥ+[ޮi 7<ݐB7.ܘ/_0õ0!i#އFUJkJOK N].Ģ#_ BE_3 LNeFې$_=α+s PRF$ aW+^xn.5dE(u9 "ӯI-.hAS0@dMAp Hf8&kJ6wƌOC1K=D<:G_VE-m+ +6(stQ2 !&)i9``2QiGBc+=Wq}; Ϗ+3eX 7ؓҕM ""NiMULl$CtH$*Y!q} 8`D4bYL.eV̯Iˣd|˶NQH~ luѤ'Mx A}w$1<(\j]'bP"ZᅳEOi lOXFE=zyTRE?coZ?s2j` 2LnonbxY{,n ||b}NZQ34/HDE h-="m+wGzݏ;Ȣ7"-"EQV$Rmn0b/ dv`V54GyMt9NB m= Q?Sy%~/0Gޮ 쳏1~$Q@(H4 *= 5 P A@D!qؖl߃96ٍ73_~{5hҐ38] n.?C$ţ2&IZXRbLyd15ucUcl3giVZ|[}f,'+/ [)GxFCkE*#f,] 2ޠi8`yՋ 8k{V;6v .KPhWBߤPECjJDJREx'"ߠjqLbҴ+9dr`73a5=sl;!&dQW $V0oP>(\){ #0 _бe 6yg*;~1;#3WpfwƐkc ` (~GUj K?O1F7B51eN$FQ̇Q"]yrori~GY1ǀ1`["QC@OI^ ;Gt7!j%D?#){E:4C^}y><~$]Kn0%EZ[vċ"] 0BcR7]H7"S Zpm 5Λ"~2ǂ 3c?)qs}QϒJa{6:/Gwظ j"X'-vX)+YlKTL/,EqgL0s4~Xv8JG9ox OL8gu,2 x+0)sTʫU&L?Ń+X.E NM{`e/#7˸I}-p<)Vs^yξ7EioqȷQ"-6= xhQ=^C@%U؟ oA{_f V_U4~QXZZ"4AH0H4&^4a/x0p4L*VE-^}M?633ōAQ.(rsp{t RDSDxGfBR8EG"[=:\24:vˮuQnfYs^.X}_Sa-?,օ^hҜRǬ yc7Vbyyx!+`&v=tJ\T5I_Q'`h.x"/6 u‚>tpxRv8ŶU0^_)8|lkp57G5R|orpj$0f⁜M|8:;.tcFwQ,eM?u4D(G)* 0GS/n?0Vi<_Q?ˋˆ2k*j_2O1śp> L!_;⫶0O ӳn"r =]W)qˎ4/:%swG ڀJ-cRltFЋgr+υP9eXXIp* ?wvxyl6s~DMeO5w-MQt;v^m u=; PJJJE&qǞk;]"!ed3{n9X$k}<0k*nZflneKD\$G2PꆘNꙸ#q_{׈nM]7d7*NH7keҽzɢ/9\ ?viXDH§CBCԱ3$vkxuU_RΆE2; Gӛ[D6je{Ym/+JQinr;!$~zvP:f~_kR"o@mC] n)ν~TNT̽9[J"q94cd]ſmɏZ#^@ꋄuޚ ԷPcCF5M4/7A w+78p;H+ Y>tLȀIKӖ%8RTޔF 4WWrŊb }zo#.Lk}\?vAӬvI"(:6 EY8g_6kLJ|*{ w'/ݿDIO-"~fOK&²i!w+p@` -~ϛ yiD8qݫo[殥( ;ʴB (HBA7piܺrkL\ҍѕQ.Z"HL3G33$n5jٜ{s~̏w;}Bψ#F; ~ 4Q/D~'Ym!麪09|W?h''lo埗.w]{!ֆ5^|[_ݢx>QgN ~;E8,MvcHլz>u'+ \\*?[ e z$fSCP)P0-RpXA2$q)CӘvS4oEև9Fz:Gܦ>}WJN@VJOGfC cG)x/~i>Hh=Hүp =@I1/scZoh숱ǒY} s[ OB> g'a>@e %>-țH~Hcz@ՍHS~V1YHq{VYiجRugP P֏C{FJ0ʟګ^7jWt OHfp-Xk_DaI֥&X[=d,j4COJ )ݟW ]<W⛿m0u~ȴX3A1=LJrE3( Teuh,LS\ Xƙ#ZOfV`134#m UN~8(^,k[ nH`8;OLd{ѣ%<\'LuE^BTZ(O7`}=;qbi R@lH ``ꆐ X`ced"1`RPU muR;?{v0dxGt}8W!j;g1,Iy *zC0B8#zIEy_vyD=4H%Ϗڎ4w?3~0(B咑O ?j4f ׁuY@RSն"}sY}w\]~DnH;fAsL@,+(2:(+2&?`%b} dbwus\|?Xc6<8@))I `?u(d*<1w9v/߂>X2}aT,xWꮥi O:ym6 mR@ 9rH 3P* @MR@i8kf Rj˒x|;Q)+U :$bV#;g.C0[P2 M/J}}8Wߟ< W4+}`O{Yv3kvq輴9Bb_kn{0@JfeUeڎG:T={enٯfg`d) ^!C6tiHUZ EÄʼoXv+KTtgĠ΅bu.ڙ) G5='00"X1I\4mZH@(~9֜g;?OLRQIx ZUg>Hc8z0.o/NTgL'_U3HdW8OL~(Yyj"l|M,؂ ఖ%]_}8DE!,?`HQP>86&x(3$_!y!<̒#ǦW18-ֲ4 Em'uiӴt< X[|?-kvlK@*hfT>6: @+YG׾:sxy#XAW'Z>ϸIJ񖅕6,Zvrƒ Uțfc?/)|^G\R}0rl!:]3noh2#GPWmܰꊉl5HBo`ZWiɞM=Co*,P ^nKEq))2YaR^X`C]#l*8s\"nXnцDσz- ZfXUC8?Xڂ B bdl87t8mUԕgT!gG1+ B ~4N:?ʽ}ݧvEB}ߍꞐV [O^.s9?EqㆾR XċIF g73 & go^ȋ0fG IYgh7_۴+NP)~2Ճ6_ܪuԣ.ytNM8ded7Ze6鯉׫cctI>l!nZġ3횸;o;w&  !&DDMA$D&e:*>BT.E߃d,.8wg_}pp$>BHV?fݝ"|`PkRWkkz؟5ɕsh@6Y+4T2 9:-'Eܵ L#3@j!q+.NCn0gf뷮ئN#:8&m\Ym w:響JjxJX,h/B1F""mܭɪMN2?'߱9h2LV;6C^.eC:{qȈzƙ6I}qS!nW^.5S7Q0_*~_ϴU=k]%fOkZ [ag;C::0c~;BL X*1 mDm'6mBEG$DN;WFgAHjXĭ%hI2 r Q8fJ2CoGlZ!K<6j\r p?{63(Cbjm|*ȝ24/4 6h2<3Q Xo7".8?E8CCy"TKmФZKs/ X1Fpz\]}ф{|Iv'/DeUӴSg]^O{M ,m_ſKNvu>v->>0 F(`i4F(`Up5@Q0 F(#(`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@2I hOO8ac\4 !(aaQA@0]ŜOS^kڡoı( zM+<7XϝID\*֧}ZΟIWi "kˊ0Z~WJD~EH|s}n5&!ggBmDAhvlg-j"N ㎾{ȯvb F6`caZ@yq?B0E`n 0g;̑/8k3S9`,_ }LV=p_wbi! ;XŽ(O+}PRtԊ%I}>J7i^JagOEo0cxÿ1{/c+yر!@f 3PSs!8ǠL vղHN FMJ<`@h W҃G=P;I#IOZI <l}_¿Pw_C$5#WpXH%찅ma\&!VI,|˳Zs r_3IX$"(Ng=JG&}8h]wo3"2).#,hgfU:reZRJ|XB_=gs 4 Q8nJV!PA,w,ZPe6"p4hNZr.==6@ +]'[Ud\9#`Zz9&ஹ,ʿcrbf#<02k*V$(&:|6#0Q+!=!Fr-R|YE&  o2h[g-AtU Cހ{O/3.¶VՉnh<%|y-պY/_!;.Qqd܏)6 ޞR,{94= 6Dyig7ƁhY *hTRP!EҲw2|D ιsh=|ZI}"p3$} Ri4_9qO\|7nه+@L B'fx(?+ 71CcAbc N> 9 I&Vs׺: kNPw^ބ7%6*f鳀rXhk;OCR]h2 = %pSwb'veYO=:$=J1g#Ϯ$ ߋ{SxȂ1!tȤfQ.e4!kQ8'o V9mZDkT^"d񮯖zX C\- $GM%4ZȄ&G$ne&jE›ZZԛnAY=3^62qBI8!R# Nx ^ 8sB@\" yQLƎ{f3N[s9YҰr.q@rB ƁpT?i.(ff3fzMm dsG ))AYbR%)Ua|aLgzô0Ƚh;^-~|M_ `5͇9DB: 6T9uh{%*_>'3K՚[4Y1V 1)AM%9Mk-ip0zB~ώA~MN ^ )جYӲPfp4^qӱi;u>NGd"5f&7BFrI6j`sND`M4S<{inө U"Ru?=_Å]Ւ:g(ެ靻zq(`Z@,Q0c9FX-ʯqvAm׻h-?]#43w;N$MJ mR%\Zh!`E}W `U ر.R[QD=6),ْ73/PXi+Uu9ھ8?9rҼJ# )- Eb8͗DRzXS, ?>oC q$7Lza]oj]WXèo{"|d r90]_kܩ&ƹeuy}} $6JҔ=䄂Wh"He&QQ]1s9PѦ'n!bmއV?L.y{&{ק)%aOs"" )X>̲rp{B R})?&"T xU[m\BXlRpuH"1ڊeNΝyoY3ۻIax &窒Dx3҂96=j+A0uBm0k84ꛬk6Wէ&U -di͂#ZPҠG3^y$ c gA #3™!(`i>R[jy&1$g&>T,Ԧ4ix_ H Ii={./>Tvkc Iчaܚ!@ 5ԀDo\FY22h A?Q7>Gyˮ`^*YVPTy`Q:Y 39)W$5qZ{/X WJ$ %.2 _,A׋ANHօE_O7lj_ڎHp{LFdi1+ٯ(UǐniAQ~o bX0Z`0AfmսW+M& =~"ӧƟ&j xg0$^Nd6x5kڮ_L}p=U |,Tz9./P z HDlĶ ͟HN[uG ņ20WY̹rx|=k&a|Gl㱏"e@-z.$@!D.$[)?oA` ќBogr&ynvk{IkJj? ]. ZR bR*Ucxn "9=L;}5pt0T$[y**@q\6cpcuA2Y? _~ fX߄Բםvl)wjZ1KM_R*?HVsa+ӈ}މ}`@I -}/k$~pEl @z\w <֜}= }.L/(:=RUKP3J."Pdk,cKwrΙ;J) ћڊzۂbX)?jYQ$,$vBZ`幝8tMW+wEzt|zz<q_4b-f[O%:";~0Z 䭠6H `ǹ{ |7GC'0-Y_ K _gHKoMGV Q hIs . 3T:P {<m( t~WOG(ޯMjTg_`} q`I a] 009 zլus؝. +OؚROsozgF8K$g >(0xSRFUHZ-I$;g}3_FbƸָ~c&' @{O a=nPh#k~zB *X vEk"JC;i=;7{pbU*XN">U) 9>7UY& ܢm~ 1<)D[цq}e(Tƅîy{v[(tljd0`͎/&VkijMBIqwx@n!2g M U6?gճšk~ Zش5mibM>E-i&M7˙!!ܙs朹WhP1$lChPx@P?NOG+A͑QQ}(z q*J''2qS@cE&I81)F;|AeY-TIW<.43B u!RiMivp0)@ЌMü Qل3@H1а8mEpj|Hm _%";8_9a<8uQ"km e, #YYd"G|HS@}k d7p^ `C86yc \hp B)r,*e19p4I˽$yK kd2$kZ2cJƧwRvYe[Ȟp|ilp8^I} |܆BktP, ǫ !6=}jy?[qY|8*s>O8+jCAݔ qM2- PVף>f)'B,E2E@@G$@4|+}S'`_|.Od97Lpߤ TaqZJ[-!բMW`~ IEZ5_v{lp0vlvu.>(G⮥Ǎ"wk(?]ݼ=!6ꨔ.ݟƇXY~5QfFqfߝ/Ҫ;KWJeo3 \&{&y¾HLTgdR5 ǎ A֮a>~Qk$=5oL4B69k%TïCrU ! ֫$ Eh$Ibh#QJh 1̵sYB7 Y+RmV禐+}ن3 5"Q#0fz9ZÞ0߷ɖFN9NizL?LPɼc{LW ?xnĖ@q`=|%PN۪#iyRTEʌp1뺹t4-;|ݴY6'mL=:ts#Xm}LA 20yoK12}W"E9A>_7u3~/me Tf՘ @ܵ6 R /OTB&ixWY@BrRH93g aI\O1/&RqB0*L%C;?οA;UR<ڭ5jׅ Ţuw8c5oT0X.i;)몌rŽ|K;qQ=CÌJQ,Ú (=yirHj}=HfU{ὟS8 W3ÇQXӏF*Ȑ8_|mz!(i{`G-m KR? ;OP'(@Zqvv(P5/[DCr(U9._io_` y3@@xoŁlۯ*NeWAOck=)[24M]p*2wO4%qٍ}>@/}JκMh҄Ԓ1'OkdR DA(#;Κp?9)u·(a?؏OMs]|l'G^ͨVSfF$CM fG@D*)6dOpw~ @ܵ6 ]RӴEj!!§+o!!Ѫ7j'۳9HD[,yvg朹?%X9zMZwz8kYfn(#D:l. ̂ (ŵNsc^P!"~FwM!? C7e( i#){"0"PqD?u4~{Xoib^%wJ7Ro]-{8g7?/@;I<`i牊2y%?>-s?kߌl)/dD?t/U A3D L'8[B~V* T?3li?, _dPI>=[C8!!t QJnG~ݯ@:w-QAɌ'ː[.ذɂp%.Ba"L2_vS=k$YXQJ]U^۾izku鈏~,E󠁠rpca3na2Go D!:!iEyHm-f6Hxmn,>{Bs-WPATM L=$*KZ8{ ( \A`p<(Ju5^Z8EAqøxC 8/99"$xB([T0~Oʾ P C7QMzBxtl]32KTq>~BԨ+!W?vrJ6V爀PN` Z[veaUx;3=dIJKa.P*NY ]y-?VGDw*2$D>& Mk?m[1퐋T6}deύeh9R=mjii?U&rM.*V٧ֽuWG4ĊiLI }in+^7Xv(!=|#!b{%B\ۘcNMtefy?^:4)ڋzMw%N~8F@"BD @A0P^&t I2R/?~JWTUI=țv8G @sNC8Mmyܳ?woׂ-v6'qz>nYY3tzuOK@ܵ6Dykn( "A((4t(h]))pll{3;)u9;_q]0Q#kK7>dmQŧpb_  H9P>!wa3zILR(ѠDgaGL. s2$ن0'M2/5_5 H]nI=nX4IEh5hMYOS@HJjt|U6X(8&\E΅;)^akzl}FaYWUt鱢ty]:R2XECm+iem|5&_~FB)UL C~;oQk?_1SPh8ݰ ZD{8&,mS$4j.2 vCS|>A,q꟦?&ٍ\cK\!"W"Tm'J x CL( >B *U]yՕ uKߣy/<{+wgӍ.دNlO_ذsdxBY}W kћq=qwUߵUSQ2/f9D`1C ";$B=s[P0Gq .tr草]7(gZǏq[–d삡nC`Х9g`̣ ctX4A`2\UbPn2g˞{7M^R6yC`PY 4>(,Hb XhLlppp:O.U*. #qײF Exa`RvEvR,\.* 4yq )n45Y:$K8O?xl>.N Dc <84 'WcaUA1OJI;[ϧzp{Ye&7< .?:Rpȭ.lAcYW6k\* HLeaX HXԨЁ8/BEG1A58 A8o(ɠhmDy^{tyо]( i `_ 2 '*p]?KPt(y&/Jj;霴Cr:<5A\Űe`ҤC@xI4K`B ]2ʦE4[RHj;>㋛qxڼtH?TćZJ;~n8h oamp88ʡh:)LuuTȤ^:*f_e\eKypU0~fJyi@+D|b34LztllF}Rn2=Jn\ݟQ=KN; e rmU\[G, -n+..覊?/)pG?w5MapڎmQx $${A@!S !$$ͥ4!mĮkv>o+ޒCw|<~'5#lzzP dy '8;(\=~("o9b$)rfBlX><&rc,8oG٥A?Y ʝds뚻 @2yY&@݁<9LpQ蜑Di,H*scI#nAc(/g˹S GXwhhlWDa1/Ŏ.l'e8a8%82x HЎ\5CFE@P~dёT͡lfqvqtc5\+>[ qI-^J=M_~N{Bo{ͲX#SJ ^Lã_v- SAw86\٬lc&Bѷ̄Ѯ ;6'cRkpP.% @:<9Di%H:jF~}~߭:)KxZ<}Bv W2W?93,`j\@0Q V@"In:lrX?[9nÏo>Tֿ׀w-MP{fI JT-+|$_`AYR6jBd~qϵ iQ(ts xS)Fu^*]sZԝ5.Ud-3/ҢN2]HG PߚPz9pL.]yGdqT\O`׻zwzb2" YFRh PDmAp:c "PeHчLęRIE,öuoƲwmq:j֚^t\@gT #A P뤟1(@:Jϔ tq G=C\ƈFയaqx=3F/fH)5ıoջOv@efe1/_VљTQ1 ROB x.]ʊEm~N.SpUmg偊4Vp{\~_ n Of)'˂Az*xWCI?EW?_z^Ё@v&P?Q*JM"GrY$A-NBWWW_~GemW9um^ _S_(RخE:C(!`X|.g x>^o7jX~_պ\7eCrt~:6@F#SKg&+BO>F~ly[a&b*8JYPkƳis\5zsSJ)͜W K] Qc|33}E=_&{RwI2玗RGi4/kfß %%L[]І`JWW ep^GW82J +K{K i|":3ЪEPTW$CdSL$L<9(f6lȟ+ͪ TI.4{${RJĽ=o:>};.P|?L=^ Hibv^_6% 'kj6 ,KF+⼷F,4C)gxV Þ9{Ocox۹b?PYcL($&fO1B `# BӚQ(iQKqDZ:X!)vo")mtЗ$$˿C\JynzsQPt ?22H]]^w ɆSLǒ:?2-1s: mqTRʑ7qĉHSRhHn5=#)%ٙy;3)FWLNj嬬ESDF;]Kd,PbӤ[ pd8%}N<-=xS{8Cݭ!kcC'?v;uV_ˍ/g {Z.fbcO&rzx,6=r '^1@%S HZCW&-cðdFG=#i;ݰlZq1Z1Y񰆮.@yIA#oxKXMC Trjg>qAq_dD4+w9BvkEk|=\eO Mm:q,'P1獷: >Z[Nfж|GZ*[ce`$Y9ˎ`.ÍnśdOT ^uI?4$ !dL\\Kk EBY`r(;VRŵZ7eW s%-%y"yai>T) - .R>HzIhdME*бa՛6E[ M ؄ 8K6@h_A4>7~:h(- ѣ589 yvlM[/)a 5yhߐLm?L ҏG4\˭4c>Zr2W ǚzccjTotCQ4c<1k:0P!E+ D_[HqĥF wI[Uou0Տ;Uby]NWiM j_,$]x;V)KWVvQ!DS,N s?Fa=qgIoN>~|կ~E{nCq,xv N8+$2o`+QD- f_ wޣ~)c͂wn<}g7Y QŤ[Ⱦ-ZU?m^nOJcԞĀG =%!:OL֣yX*%g?w--NAgݍexWPED!zX<$L?Y1jR]uW[1 cU WTO%%:Xȇ`Ӌo$M{ 49E7i`=$9 +vnV/ (pC*ʹs"&',Kpd"jUav ,,{Bs ~&BV/<*j˝7$;ɐݕܩO{%z}vY KYXFt߇' ,fQ }o)bGmcW֬jm~ك~驃Ѥ3 zh d,ORi Z2W#z>q㌰B5\|v}w9דd|f7WK?BJ˞g7g4XѲ(v# }RHmnaժa<^UBWW+LjsHUaW.~ ǞAW'(pE)}3ԟaƮGv/8kZ$o#"gX6?DG<$XSe#g)>&P^TluH ۿ5μx2e"Ge CW [  c:(BƾP( g8~Lr^ a2 Dyw#2,Z{8súE7BQwLhˤ3p8$O iMgh&",-Ȫ: "U?15'\{i~v}N˕Y*7ևPsV]_BQ>W"W A2KArB@n :uaܝ4RfeVLrp>)1AL)qp8O*'Q?weMQt8HeoHx/!PiiC7w{64"!b)y)Rgs? v1l mYGYmk4:Lg;&QPFT>U*vQ =YɓmRLct\4a48!t=c@/dFD AAS?BjBz!ЕiVfSpZsqj2{%8X FDhp|^k !@&*|8}NEDH‡-Log.[WjY%Ūk@[a6yRaIߑT}s$IyޓG HkeCTu限E!/lz{ؔψp8c2bTm8shk504dI(j|dus_$uiCň> =wq8"iLa=BHuN@B w;79B O]",]E󇌝ɇ_uf&ـAN#2qqImpɟt C_hrxi`m_q$?|]_q{qH_Ɓ~{xsG iJRoMӝ5)Npø$YζrZcQys2O-JJ[[殝 g.#'Ex)BQ P" *Dï'(@) "R;NݾHHHƒݝo^x ڹn;F!pu&魟Xgc>U[x lj }p?;)7?}S9!^V<H@@pZi\Ȅ{=W`4Z(&ZM*kNmaAVb%R;s_ooCAG"pQnu2WX@ 2z2Cх`^%=8Ĵ1cMY`P׊ĹOS;,Iǚg} uD5+h[GҸ1cv1eiYu8lUnt;3ׁ{{r6>H:NT+Oji(`<%,1D 7~蚮l1t@ S|-K[`_TJiix*Pݏ{@^  |*GycD˲ka&299zӛ }tv3KԬWi"ldM-VqݹU'%4QlÒQ{D!A.(y5I%r+Bʺ摶`U ڂQ>3'IN,UHiFIXqr;9o/KsB/q=pW0w5MAػkq.HH<O pƝw*Th9*Mi MJB7cfGkf1l{ N\ϓ^$A7E -lZp%bǶn){xf!$e )JVm8E6 N*%g(떄ٮl\0[8+(W@dAtI4Ry,{*.~!MCC:TGѬTW;.}ǩSz !.iRukʸ\N.l g3@(OtҼ2k^h8:Xf_up.ڴV+: 'F ?SUp¦e.'H>)/|zY>8yg;]ex02Xua.;D(". ߰UKdLC,/c~w4Uz|؏PRuMK}3kXGt1i_ufybXg E<=y39zNj؏ȦebBb: LŔZfhyi};Kl oc>\>y?y,rdvMgI @؆Bעiy$ ҴTLO\Ĉ(dXdQ:<'+sWDEߛyәNRLk!Q`l ڍ+c&1nnܨ LTbh@壅)m=m,ɴ.{{{.`WU|0ogʦzÖlYXɌޑLD*R?,LȁXpZ2yR䏿;ݸbWnI|(-C3:u YIwEްʈĝH97,H&bkI Y~|r.]ϞƝ 6% $ ċdYA۰ !,O]ir4VwӯGޅ&W ך,L5%˜bdtf!X . a"bFǚB_*mM8{O>f}jL_.c33ܦS!?1HOi8X06DCۃ(x0z؏[34-zqqxseOB=E]?HCB6&p.6R=N;o^_;Z Ֆ*W s";:}O: |׺SCn$\I=(8I~8݅OG3^cEϏ2ف'=4޷Ɣq0A(5$jgueŹ6{'s׮E Ee6 HtH%:$2Df<? Ōf*_s*σq^q'$vuw*PJz]mGIQ2 _5G_MD:POYJ\U4i}u''b:5RXToD݈߳UaeN?5 O :4گ pEaaӑeF˶m$pnEJ/#{>*XJ 978@+MXͻk&j艶pA5cM&6mWZ\5٘;[$L1Ϡ((6;QZ>?9v,)=]>&}w2I G;Qk9%UQHH XLb kș菧+^f2V*-ߙs(oSjU88Ґw vJC6|";\m<J@PQԧ:|{f^jU;!js1kGw$2n> `jIVgU3Z XV$!'`K]o 'Lx?9K _w,-g iT9ϑ59mz'8nH(дET- .xkp'တ Z4%mc'ڻ63i"ʾx;S[M&okIer7Ql.Ur/0-ht!Y2BEb ta?+3;"^lr'̙SJ6ud!}~e2/59JXNsm7PJ;#BMQUdm{]B;>$F8/&srp$Qj׌ǩ@`"a6=b췙.6 ,ؼ!<: $` rgY6 ³o_bůP\ǪI$':A(U0_t2g~p့Ǿ߂G`Z늋촟 v )2%8犎V*ADϲ̵E,Ϭ|dwOcdc.U?F'D['OTJx-A^AV&\sK~gٮqw}_'&K)HaDhP 3H3-Q@{p`XFGgv%>t7񯐏GHvDVؚ |8Aqlp`Hi[S]7j z~nv]  )i J: :J bI.f=񼘱b!z<%.|=s=5FaPpQyZ 3IU0C/`]@6Wfu, v ڽ0NK) -`Z /诎6epƜќuϩ }LIn\{\XޖWxf(Re9~x5ń&\3~fNZDnl.tgLSRs.f3QG铫*?f=o½ë" .e0a)%&RÓω`_X mzk;n |V+[13qOp BT( 7IF.ugTDNN$l}oyƟc}~c=WhAE9R|wTzena]B)=5z5\yM,nwzoCypj;Ց ㌗E@ (=$@߂^- ;I"Vt7qGls^߾#G)3Nx90I9󭁚F_6C'7L0gլELekٍc;N&<:uCK;X  v LLdI7S)wg{ueǑq'>CiDi3hI#Bi0%X^%p[YI%;*&/$1`ʹ4N2bā! ,jm\JK(FsTA9`NWяsVGJ0|NCKG5"8@jO‥ie~\X5` BO;NdeTrN}mF2N%ߓF2) ٿuPN>XfX8=:zb_]ѻ {4@-I~hyK)o[ Ã"z`N>yke~ޏ7>}ͺt@w*_fTM0c-/oYf{C`faB#VAP*GĠ)era22gN,gؒ}As$ATķ6}e*~Q(3YhP* ^Beʈivyoc# ]-cX٭:"cqs~"#e L)￝$)OWڽHašG!nF幬H)AG\YK\HlK߱tqIy3q~^'}op/ _on!q/qs.y)ߢ}ko.z{Uḧux)u; ߲kPwifZ#<竓T(J8GE{5O;Tƾ0׃6#nݝ^"hۃ+}4ɦH\q.<u>8W/*6q I۬Ui v0q#Ez8a ]Ɏ@qA"?\f$28$vnVƝEW]gNb/0Q@G "*]JY/daC4姩wFx. ڊ8n_$ ("e(-}~jtȲǿ7 zҙ䠡ic6 `!}vԀl});h[8W }L`m$/N:~Kn<7@CzM/{xe ƍ2j~)`8$YH.s "Wo%{sAY\}6flQA`zv'F0W*سﰼ2>V޽ݨFNjT}:LM !nKU+E'/so|&O:WBPe=BLLǝYif'7sɍ"p'$a${,"dB2=ai]MĒ JU/U}_ IN8U[_! tx c2F|ЏS# )d 竌B7s ?gpZwC|ʸPxH]\_ߗ_"%ڱq7V9Y)wȘ}׀RCG3BkǪ 3P c[z<-{LN9NDr:aI#]?07p~tѸӮY+f{@qU7u=Wi|rp8CI$yoܼ=𢴰VNأZwt[R~pc |wiju'v^SX^HjS%wג0 DqW 5P܉DlX@!qƩسAh}gbŒ{[jT7A#+H$s1utRz,mCY, A6 &hO@{׈_mUQb}eF M{xs6)dc.Eödj n""Džx&'=`~3p*p!yjgv+[CqQߦv%yʣ |Yp.GqobS)0O!trh 3h4ȑR) J LJعl"6gI^%+__q0wA,B?Fbbd>|So`g$4 ?Q0 F(T4h¬L`;<"?`OO.fWnl 22L=4?+) a0> F(`@1(`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(YGrp21200`y@ Q0 FaV~ʟGYxmQ&@s mzHv5`w !njuyrcïaPxk/ǔuj& 9- I *6y@Լ (5PF(24wM4D Ì.I q9 9Gpy ~ۂ\%OlD(^BJnQv1a99"% ^VUD\c0nt|ӯܙAO0 MLTc8pABb\*y ;S|yfS7 |FiGxjLċ#;1,qa wW.m+j-Y O-; RWlB" %#k'׫?5.t pE[܅Y{pܠ>K~!P 7g/ؗQd?JE`1뮢t0j]A~=JSx%u܆(:3D=:/Yv6b/ҥ"eXd1J@T ^{Ht(GX"gZ~{a B@@CJ ~o36^S|:/:l-7HŊwuŒyDAI~Vϣv.BB,1͒\ZZ]0S[3DE] ?8^`1 e6;0Lj$m&r'fiL>0?!%J1H2-ENccDqdu&XrRS0գr@.*}yq̵&3:4p02@8=PkHzNf}"0TnA[]P@QÐoNB*S~_~Ѓ7Ⱦ4/IʧTǛF0pkvq@ewHi{Q5ԋT1QߠD4x|w4waX! "E2^ Ip1lhC ;N&5e69]6)gM؂b};\8J3ߥrywPjJK[*k=P^SEJ3.=x~Hdk C=!7fW +Gvz:CmbS=|e>VH{Z?M2cYsuk Iem; E }ǖk.S%ޚbMZ`^ fJG¯}Bjko_vrX)crkGRF:,U#߂~:˴@W?Vہ?3SՎ#^`/=_w{K.Lo0 #V5 D=cj6iP>$!?W~*ĉ3\88Pnw=< #+%ʌg޼gg834귬JV_l0aD;# K\!)Q _@$)i  E׎ߋ Y%^P=sQt*)-0~dQ-i@3UMYwT/QIk H_v ZG,imTu%DAbPaQDx,>?"0K6݀gAz/,ROXVͰbb+49Ci!2-dojt[: -bh3Ѝ;>{q;UNr<( Aa6b7Z @9wGPu3ZyƋfR1oTsnȗ@XE0⾏y{y3H[GRuf.:O#3WD D=7&ii+Dh8r( ig7 ~H{Zij4~o{_W4y_OfxțCoBn$ކV; #/6#8f^qFBu/~O.NFMz8Uxu&I1J kW2᠏~>/gh5$|B4CꏚxC2RV1-8%dzvP\#]|z.Nb {s=sWY gbi}(By'5gH&><+_T3,[6/OU܋;į&'~9Fqώʎm qq2Bi} tmVBW~4u 88 4 >_gkV؊ ^V#t?h,}6aozQ@Acӽ\\i}ʼM?NhXǽ}~j68%[fi άvmJ6mA G#pG6{?xcȲ<3ٝ0FHdyuz W8" !?#c=I:OL% t̪kr_O>fXMX@N=cd!Z Sap;ͧ#Kw)U{>7/:)I_XY tU=ƈ`A']Iq1SHzk`o}*!Ӛ!,j_aT %{dSLT¾Ѫ\I;7xWʂ_ BHr@Wg)# )zo^Kh n Y5j2K( \*z  O∌ۑo(Uˌ;q fDN3}zћ9[.]h*_zv]*PIl^a:P۹anֵwSL kL'z/27 tC⯐l)ʽTQ0H#;LTὉNSD =^pgym\^ftèuBY ;bM*ʑ$da&C؇^UQF9 eG "ރ_ ̕6m>8r'B A((ⱱ=  X>XMwW{"0Uz w olyYq0{D}'sD5W&F5 |I䪐u{OW#g'~!Fش9ץ؛ʯMˑ;e-ynD @ Ơ}ڻ_F$y5{?K{;4ަC 6}y <^ڭޟU/n+7u{TWo2U%qU  }g۸VviB؁n|?0s5M1tfvBv̝S \O~y$-m3fxR{hv&#-lHgCΘ/fBњR] ?@K].Kw^Ʃ)%?*wËћA=@68rX" 0 |F>P \ F PYhpw],.2\AgQOvQo;1 ENKQ% NbtK e%*\8] Y2]:1MGTv2Ʌ*@Aފj'nȰAqVlUqI o۟O /bFv}51Mgvs.ء'klTӚ܂>s)tziz&MuATE%4zHO~PtY/\ =LLHbQj^^{#R,PGۮXoJm*/_zN;  ;~wqx0l׼:^)c~6.É=} =  ێxۄ Thy]aN!8&`Z܈a%{,$- 9R==#vg }.r|mi4)JFUnDvΰol,BU]0!&ڍF7Z#'VxZpH@HIZ)nՂ%iWg*$5FCP:a ~yy9z- 1[c5*?8ksoWV|c94L-.uX?K[H!kwGd'pg:MݶM; @6)SFՇJ 'J VSwYײ (Hnmug?3hp. T}\05AB%YC䢿!ac%Q҂@)`Y싥 }y{pE4w3v6FW ݴxp x$#3[&5k{橘l>=8L?.i5l2  vۆ Wj4 /E8Di̒\Ћ YݴHoU1F{^ ٫.`[U0hSӆ`ho ʥ:9.noM ڙ\kd@"yMn 55wQL/&Li 6+2ƩVڂ'ߩ[X-76 i|yO-*cE«#-pߏ}X~5/Kj Q>3~+OIMcRZpRO, p}~J~qdR\p;p J?o?2ż=ZpWcԛ HKkG" EX(7(k84&(9kP H܏ZmV@Y:#@hwΚE%@ qKɗ^/͏" zD{֗r~4|DtJͤp/coN!ÊXpϾ!^@`G…Q^02~MX=#a\vo*cf y>6I9|Cɪ)IT_pG殦 ~eȽ9B=r)qI89zM/=ҭ0=Iݦ##(z7Wmf8ÐlXH@4I6am1;bѽ%]|r " ,mv>}+,+b\}RH -D!a" lm .A8str4,XX5,_6G ncA_'FP!)+"K=7)*780pL!qײE m홝ͮBܐ?q[6U63~P՞eoIl]KCa徔#4ɿm^ҨhIp<KC$ k۬*) ވrW܀<#`}d@XaaQ߮~W'kJB^vqgHt<_ JS :0_V Ϲ R˨\X=f6L&;z+=ˆ\33(#x|hJm~Ws\zb,mnK"(3v$7R3o7zneI޽ IGF1]D[5<*=л8QrNk=˂a5]'aLb]>(óZ~ gG[lqAD_(K/Y4vj't0u8O=WNkJʇv令ڵIgF\8f V'ڮujYհQptpVN j'8,l~gePQbza$Bu &A@B(\J5[mM@KA>=9ot?&妝 X]FDŎx78<&#J1&KI3^|?mtow)=$ rۆ ފA^EQ$(ʖ)dg p ܝY+/0cwAAò3¨1AO(KMEI_@Q$<24xGGO>-c jRkƞǔ _"x* 2\<;ȦvE( |U1YdTZuK=u,+OÍ׿w;̎4ރ0嗯/{'Bk.쒳CN4Q{GS;hLefNF݆ H7kjn, x} )MS 2 ST̝tYa' ty_PT4EjbQ6G=K Ͻr{2Fg:+6fv:oy76U;-%3JnN)4蒓ɵybtkjT䍥sccaGBd0:3޲e, /h`a~fYm9R GDS6Ox iKLZ/ Hd^ף:!NHaF6bGocZsp5j870vuS6SB7MS GzAbyD.METS_a4waxB g"/P>6.q'3LA&'A1g`hx^QYAla HoCIsjy}^m: m` ȉCEJ] x Jq5,I\Q70`7܌Rq_'Ic tK3W4Kދ22ǭ;!dQ?`SLIYdqVNL :[EtBU8*}.ߘ[SΊ/x2?3B~;EwNw+> AŁr!h!(YKWV+B 28\U`\r7̀XtKgn+cYsK;5ۊ z`o3˵XVqADQʫED #n,br1T{ Zia5-Pvq&p{Ϯ;9%iI@-Wgwr^i 2=LIBwFU˛fE !fz,36xӆMa@U!RVJe$h2ⴚqv$)k Hjs@|Ӡ<-C9" ǎ]yiw|'M+0jUn#S̗'qDG~=v5|v`S`0 .#@,rf6Q7&iTBUE4m>k{̼UHWIgx{'{P̝|~yoȂcJ6#^t 2,w9&KCDe(R)+;Y^jm}2ױ+S#+[ќQzn3].zԏA\$wbSt[uCS փ'a!y`S-* ~hst9ڧMϩT ^z۞j1OS7 qfV́'Al{%~cݧh-Zp)7.R8Ƈ;N~^׷<-$Ybr.6Q$t.VyaNe £؁#d$UNH-$'‰bF9h˨h Aϊ= EgwτЇ\cϝǬiIZ)ƒPl/WUѠsU,NKD DlcywCR$\}]+-YUyD |,B^r5pH"+` <%| 6D뮔r#oқF m Aġ9VUB%$Ҁa?:oz<|37v?% ʧHәQkpXԟ87Ҭ(?jc3YxÝO߅%\5$pGm0hz7qgԠOhrbdi#Sd'L lЬ>5nk%6hA f{B"{<"$!8QSA`p&$&A%A^ Z2 1m$I_0M :+؝^N(RU. TfD.c>1l ᘎ0ۄ&Η)mkS,ץK֠bXUOTGY sKxb Mh,K =ƩijȄϋ'"`X3M;0qE0:w_ mvG>Eyho Їۯ351l2mU/wQ}1m΄0`l@%=,H2 C$7]xa}GROmf.|q[ljnR4/! 3P'Pb-H8tlI)ԌG$%w%,{BUԫ@rszo@ܕ+7C+Ye LQ. |!9MUcc~k{?9U=[Ner^y%2 edi1 xo炭: ?@-7jv͆eo< 2i^1|hVQNryDŽt{kR45<"4tGɒYe9)j(G T'&8tkSA_1` "0?KrW( c$D=l_ɋ->t= ԫcÇz9f'b|R"˷F}޶vr %?/ABJxDڛwvP1cWeaGo;p`JM31Λe/Cx6g#Epb\%΍5Q3zӲ1Zl](cl7kYmc*N<^MCsp752{y0OۧY rs腌va1\ -&. FYO]H=*ux~wU.tQ`C~I{+*i1\r:׭_ow18 O{${0#9<T1^>{ q\Fɮ/gI7eַjoNJNwp?׍dUp,!fX+F M4om:t ٿz @ PѶ00 lúIcKEi|:`HĴh~<=>/\R@H yn_ACHZ'#ko_$F('1ZA rg) "Bq}l5oWPT LXFcIghT@tcO>GɔܬnN74O@V7NҦ者z׏9i?>/\|Ah HQݲ(ыv=̼'%¥a ƹb͸] 8%۔Lڦ70q<I`qu~CD%H0xnhAXl}Zh ɡP1m3Wm E)9J-m __:yE M銍)q8t=d=oTU0!5NEUۿ}xj0F%r•r׶5_5K("`dL(-~fN"=4K Ikn'f s=Y@ =1M3px9o{Oz(j~V([­%^ș} 0;ّ"7]sT $1I3A)kk-QE~mC{qcMUw6G,EQi-:]<ǕhoލYY7lXcݙ%S}^W8!K"'a0vƙ_!/Ti W LdQAFN) edP$8z|QmKϽnt&͟ AoәNWO"ĪbU1jBy J'Ԡ9H)q=J惮BLxw5?Q7Mh> g2d 6F(%='iǥIP oPB?)gk4ކ~{7y%2˗CkxZQT<83-oEU+䦎!Py4Zaoe<'P n0|:llC^+zZZsȾ nnޞ1hڟsfKB" ?Rӗ/UpbPծ]t`,üf{'I\>nw~j2Fahd.ƂrK5}2%g]8cQi1B2/!0?'>w-@TGPq߿0w.MQqh$R"b +5HXT*5u8WBHQ㹜u.nFpnRr=}FƘ\Uc(!OfF2QrZUtG`H7{J0yצ?兒Մ0☿׌qYLr \Q,p=M*j]<:}ō@5=,6B'L d`w  "4VdE( ȕҒ%@ǚqBF@ޕpKgVb)1翜)snR a8Fg]k5dQ 9]KC'{cqE{8=d'uPj*gWUQa&G8fQҢ@FPbX繢_(/P@ö4j\ڐdm?o:1|jӾ~nLkSձ6+NtypNm st.hqHwQ!a'GTlpnt>57'Z"!s:Q !/c2 }zA0pbN dA$/_5t{ߑp5R[|\+Y'Y~kr Z=pԑg-u3ךfQεԊ> #KI+8@d&KZz( dGFaU)sW4 D8qBX$āܹ @,]6I?ΛI9 . ^V߼{2 ?#16Le%K?sÌilKC> MtcMKGF<旧)gEK\бZ;gQ)oX+Ds&O xf_8!~;?C&-{6E> +2qjiss U_/"INK)Opbޟ+5d - ˛7k&,)8C%h}A^Sxn`S6oE#\[ sX7'~BCh |xWe9*ʗER" uhw"i'z.ģrgKclCLMyʠk?ܮ^¦2Ii;[oH2&6=gM!b O;av >I)t s|{o^gUuƥx ?jS ^`gR.vAHpoi?utDžmh;>nt.hʩҚU]z`2&I& SW0t*\k={> =?vn '.u&7 "H7pn1(k I P7u d&A^u _?t OCr456,BB|C֛H4 H]X8~,4szˌ|Wm2R8n{]bZc&u\>233,vh0η[%xp6O$ u ާr[1WN.NjRtdz*Le9e6'Ўܒ`9߀T!v|$@%MEߵ:-> ܕ4Eѷ6q i)DvL2qϽ/pHRžYACiރlk6<./tutSv1GOhfp{+?Y m뼽.wɋk ʀV40Esʘ.#?VesXS4(G2 8<ʀ8h>L?[?ϏtU/ pPdڦ8Xqtz*f)Xp'&4P/M#t&gs ?Я˅ '}լArEyaw!7W#JQLq-_aߠֶ rmEkܓ\ĄG\ JL|AoTX#|g= jy oü¾>-xa%Y>zA9^R/ teeG1%m7_? !~/> гZU3ʹg.LNe!N.Rڄ;^1[ޯ sW>ܵ,7Jk;N  \r*!@l/=fa}p\>X@!uX z=ku6;667__F"D | +sxX1R_Dou"EQ2IWK-EU3RJ"#p,@%…@UkcBVB8a;_qͻ՘ B䖙ldA!ܺ̚m ]qyΟ>0ˁ:eW (_4j"T%k2,crkyDWƬrpZp 'c32Wv\SMyI 6'Q5p6)8F== X?_'y=z~U{D(ǨsԼf/WxiJWTBf Y$ 2kV'_LK{}2}SnIuz,}IóGF\lc9Q#"zˉ6%Qjst^W>-vjqL{EH{axkY뒾J>٭r̙D2dCpsx6V͎`Zvۆ )J47RCQEq?KZvg)#?.>^5;;Ԥp#PO+UF,l'1#A&NgviI[bN L yà$Zw7F}2&c=UibSS<@~%TrBvǼvtyNa p8ݳ|]}ۙ -#e>ϕi!\0MjB0N_2@(y:':ۛ0'$ ڰjX=IUgngM(^"~|OUҁERch`d ъ[7aNπPw59NP?I Ua4hpv\ckB؀ f:u'yiG`v7~gN'w |;^WY2Rڢ2gD@C'5g Z0tK[h9;nǫLVo3IڒĒxJSR rPhrQxTP"H˗5Bh|x; eP/Oncc+i^\jyCDS1\r٫ ilbVʤ uy"M]~;pVIyXJ x>!Ps8o +U?jÝ @ݵ8 ٝIA-X 1c$ Ri "!*F|O¿`#vFNxmpl!9P8y `HcF(P_&S/cV O烴 `G0|bWy+˷=w(沒ꢐ(txPWsH kËI%Le`wЛQp1k $3n]sDg7CKy xNL &a"7=(p7cKGoM- o][i?2ܔ*XFڹׄOێ퓳1 gf<'tigm 9ȉ ΀h+x6_ϛo:>&>2y*x}iOR 1;(%R/>Xkԥf]]h'>j{R'x$ T!H߻L7t-Zrۆ(gHʲ%nfSٵ"'ɉrh @QHQ@ulŏJͪˢֆ87`4C UIQ6cy~~*w aJ Dcb뱟Zp+Cd8ꍪDY)}ff#i>Q p/^/u[us=:b6}mtdhDv?ef̞B!QEܘ}ѥs\(RU`lCD:@+),!"%V]5(}Zc  )wM %*هi  b(3d OޫMuT։(SK .7s 3Gnb夆AAn;?Ijwfs~2^ž,5qc۝cb,cKty$讬]cAouZ++ojRN5<2jES1`|Л}Cq,< @ݵ %%ٵ,Ei9FOm.AXJ,˒ )CE *`Zrf3t/yI ^>OCG|73 ă!* f d^s\/0Cǝ/z0e-l[! yR78Y/+ 4z^t "4WV{ۯ{7¦^@d .bia y>e}溣%J}OJ2a~ ɀӡ1LDH+Q:]ilߜ`wi :ar90wD;>ggQGvpbHCC@˴< wwEM(=Ӹ?0V ГY8VlLX}%dUvZ!ޱεPw-9 @ԟ:i"!Nɞ$܁`P&ib{̼!dbg损@uyZ'{K\%pOn% ZD "PxkAҜaɏ$dD` 6^t /sc7Ds cF{ K Wc X{x N',rfj5}2 |U qPpr2Sm?4jnԜt&m`T6Sya؀ˆN/q[8_NBbUI~z 0s׎úmW'k"js+:\i>kT^HjQ ݿ7/Vpuc/$X#&8ʹ߿7*Tff_7[maiNmGwG{@hmũ@B7%nαMy#*GLg"dqzᇡPd<WWT~+m:t]B:^ sߺ<[[ ʼn9NV} #ƲwڨH2nŠ+;l):CTZVjQtx5uJvߧ|R׉$gxL т@E%f\$һv-ĪzNya5z \m_9\οqޣor;#h6M,x&Ks@Mqit\Cs/2Cu~4BY.][n0 +Խ+mY , yصCPR3LjWi z9D^lFKne^9">DdyBs"[@򣠫R dHBwbOȺT^/ Z Ny0̆5Ve)"M/Zz;J~%yӸ7BWdRnί'4:W=O(z7oб5Vt>%_^8JcB7'OWgEB2a85~v6¯PxC>lB*JSu"8K P-+"]^zqRđm]ŏ3C1Q!΅[@LD'nh cr4kp]@6W͢'UMh@ lq{BSb JGwLlMšn[:({%N>\Z":2bx/mvhIʹY{PF'g9x,cO 0NK$hX/^kDy^;v _V1TBaTIL}~/%W-b;F _t230\"9 f'^50(K6.Xk1=&x'@atTOɗ?ëC,`b1wofay Ffݍ??70( /p#`Q0 F( `Q0 F(`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`O8!80F0 ccbN'+ඣR]AM6`QPn&nŞH;9\65Z@/`X$+(}mQ086<NVF H?lY XQ{߹@u>$?j 3a l4&M<F%:OSovg|ߌc.d{G<$|ʠ п _ bzIL~>Z=f^3}SaG&;Pq/_!_5A ,)cɟ}lƯCk9Ip_^x,%̍ćVn|8EI$ t(G&^!czmojRl_/)$tb~cψz8 Z#%a/PvG} NOq.GbA.:L]sI>_0d?J YxrKU՟x]>m!A  gt L}oQf.+I9_o*hE-^ #(&GlR$6a:ٱ]N #-+q'e(E|dyix&W,Liow[N̽9ܠCI)7M#5^C󬋧GI 7{S(Ƀ .scUIDh>!fyTH`lv Q!p 78Ԫʟf8!HͥUTWzvfM49]9//SA" t26! =TQ=iCK? pjih)w\Et cbU+Y9"ї=  ϸӃpy/rSԏZrOZRw*&.hR>!ׅIWf:~(h B5@O\ e#QYyn/*Ò'q*w53-q@&Nm&*yRF%I֫p ?Um^&[LZM9.%w>k: М&zPޝ,PCǶx_v>`׊va`ub6ӐJpgw_=HP'x_"3[vBvWF7ж6AVo $p1 Z [_ JyXP^.xqDxqppݩgJ3?/=$1^%؃j fb˜IqeHF诚ڥI~ z@Ҩafe?1vc P.nAIڅ7ݥb(\;|;Jn1'YZN@ ]oP&ECjvT΃m_rAw@hEUq=ؚZ.LWEbVKvW6>,@1~Xv>'EvF -<$} [qZ愒aA'OKpy#bDh!p!I6MQ$Ȣq8Xt~❐-|QJAVvUƉ0,v g^X@R0 0OݗJYb~[t! :Iw &'$b_-}=@E#g$CN?nLMc,29J@ߗ>(56HpD^>m{-ʢdGR̽"#x5hnq( E/x<&"3?WvAi6%4C{4i<'|<(یEX5l7td 0eW0觸^]tC F^ZAG4.ߴ%G<t6l)!r,:):?m|s"ނ jf1}^| Ϛ)RNa?NS_N@5е89^ y1CpEYVAPZ8oΦ[7 ض^`bo XUr_ 9Q~k;3774)wx.g(lv`$=˧ɵ 3| 4 i!=?SGä։}{6.UF'u#(?O?9ݏ]3"9ssf  lkrSߛm(WY^?VX` 8N{'2 x{2 %H·@͜_N80oʿ]V:-xB0%9; HI% apwWɈlD} Q`heT6ɯOT7Bh$pA_q]D^|,ݤ IFԁ!C>pHC{)*,XK덅g@m{ 1V:te啫B% ݔ:?|L\V۔Q+9Pf׭#wJ%-k be߄5(; e7Or reZmi_'M7Ih[Pru/ a!*)Gl&3SGTN5]AN1 8 _ (vc8)\Ar{X̌Zo#(_ڟ [^SXZGSI#]so?UG-}]Y ,K܁"8Y-&P3vihp|?A~n:[ ^FzDVV Q hpI`Jdvn|2$8U}a,1 0LV^A ./ t2*U#OAϰ9rl{v"EHæ zD~vX֝>8R@bF| -IZׯ)DjVr&v_<.H4E zśJ]D.жW6Q5tЄ Y(lƪP_79ɓ~o];r clL.(]"3%تRdƌ] bx-d_?ZՊsg^1?lO2uB֮7l{@"=F\.JY LV7Dkzq^ F@rf w7:F:r!¡_tdJ B9WHjj3%K2$pt'˱@It#RnPLk /D:s2EE%}-hփ"S/D:cRV|.|1(Ɯ~isuT#,F`f K%FBU3RJ\6ػza _mJ :ub06E"{wρZ5>ܯ?0/SʚuD: UHɜIgV6667w9: RLDuV[*55[߁6!iNW_,Ҍԓg;˘be?QF21¹FJtTF'^k"-!+Л&6 Ua6A1[0kφe2ȃ8loEoM;M$+)[g8KNU֏A^#ȁSn {y? 2eqUJ?"E$7*s;rrlߗ& >9$l%a|Pib*>rx4NSH4tCTUm hEfZҙoKeafm![%.Hs+pS8!D84^ZՏ;3s# .PACoÚk- Kf,ٹ;4|B ˡFR,_@8٫ NekW0L!2ۑwT;?3N+oU. ; dT:j"`PADgHr96|Y /uޑT`6Dܧ@Oe0lA"E`O4Nhȸ;!iVrU_zA/1La#0&@joY@<b+}z\,Fpf=|w# W7=pa!{׮@ (h补?Q%6;{(Pu.owvvg MǒQ)\MV N~nMHADhNpACai O,c,3{A|*aS@ p$,I1ʚv]i/04wzC"pb>:$9j]m S*-p<D4fx_&pZy롋0vaRZ)DM6Y蒭? 2S^ѪBC45֚m"VNACëmI0 rK3x :|Ĝh- p>2Bz)wpz5ΓjA%_q)g?f<5V%VR=&rmlu-"`،!*ra?n>4Ȭ?CRU.7Xs#1k>WD9q1.K elld;L/D$|d &ga2`ԓĆvM/Y?wM/Jpo'{W poi#wWy@3f8J kr)}rͦfXb-ˀ_=o3<۵Nw4nj-@ǀܹ ` UUjXrK0sX'[3vOnuO 6ȔKge7$+@ {w][Y@a6M\ͰoRQc$` ZrJI-1DB Q/ ;ǣ=H`5g.c!4y!T=^yxs9jq KR8g dfjT*J=;o9}j *?>{|k#̄! lgo\r`jzah8B;m>%8"Jqm}\'߮gq[:DvT։"Ay@a4k0&Q} U޸#f2֡[tbe_C4MxMD09]j3.p{"Sq? PǬ;ӯNj;d0JM74:+=P3wqdž7UtPxI񏫩Wn;ӏ`(j& ^otO6"Hc9i=,21G=vۈS.h٧0&pp* XƄf nLcv9z~NO+T~ = )܆#^e|VAÊ>ъs^*wdWQNIzaYQx@ ЙmX7};>4ȟԒܳȂT{j/5B!DžԷ8 [SVÊ\o)N7m=iFsipAR Z!c8dA짫Zsu%$yIAfVƫ6m}? ;ILm'!|IG:-O(a Ƚ})yԇ"MPNzf3;P5Na!YUa~nyػza jZ: ~#; TʎTJlWtD ).ql޻Sۜ h4;U>ϯLƁ}vy Qyό/S B}^+hipac}B> B#| ȶb7y#?o+rګNVNy0R#`A $DHYSۻ+qq=7Ƀ/E:z]!O!N9P[ z6%f,øQoXtbp4wߝVc[CQ/ f|ޓM=Z+,FA ײ2?Gnw< 14vR Fv$V`*-j>v|0 tTuw~:EjSСk)& _X$Z'$P3ƽmiڭ[iWFҭ,FPs#$tf 7߯61Yj+Mnz5HbZRWv:D`+}!rQxl/Hi`ңё4A qoXX҇.ZL)2ԅMs\,HP hX)U#B'ٰ7FR!w& 0l (zn4 D;+Y9}>2yPKDZ`<~|iA;[i&c[NRg |axzk"9XjTqȂ4 g7&{?l8JYV,wݘ&R lWe%^ Bgb+|eAN,gih5j+^!4-L=W=~@]jI{tU B>e6E1k4hs"7<^\Wd7A(Kpc2GH/#襡lo^!Q9Ks N-:yH'{W1 C$-7xb`D4$i?AbH[&c;{ǟF{gO"W8 'ioy8JB?# ! 23Xpڕp]B8tyްe*@CIONа8Jw< ;:zWu48) [oϻc_t~ g@DCdѽ!#{I<'zd0ʭfctd3ΡUohA!".V'V.~ ޵ Qj,^܍1q H fFkM -ofgL>ܠZ=O65(e9_ISmg2pҙZ?X|$fNf˥ S_VoF`,G,"[#:r$t=LU8Dc2>l#c ?ݡ92FR쭯y {O,+)0fk䎟׮ gIAbyRВlGQeT+ 5b{V'%>%M HCt|?ߪ^wŸ 0Pb?Х _cmt"@J4%Rǻ1n>TgjDx8X*m~WbEFYB h<3޹+A D#]}.ԦGѳD@wHc1އMBDn#o(-]g !YH_*?qg4?}_& _ YQRЅ\+)y_3\~,,->9w_/UmVc$*IB# `ߚDkFo!؅|G%MQA&T+CaG] e5i4s3|Z]W)- ;bި|wppКLqv>% g dCh6 X<[49yJ mkävz Kƙ"]0z(ƕ.ƽO `C ysk  &gH\s1\Mx$|ADo~-ztlGg9Cfa/aSA|AˎJ6kEq`.|_߾S%aU`;vv m=2sC,IHKR,s;2iH̨r}pԳ OoϽ.t:7cu u3U4w/,] CwTq$4?ڎo+N.ؤʤB4(EoI;Jd _]׵ ?C聫Zj C@+CN)ػa HEQF ufK1i ɾg *f_sW9U#?鿇p]ЦZuaTSB !%ijWJ3m=ELVId|GԈ:-j_Avy<ZQj.J(?`n;\? ,b3")$/]DbK:"!nJ(UdTחn>w*@$DlBVcbn& Bةӄ)2{`}!r;?(4D^{Uyc-M\`:bPMMw}cC߆gXEݪ睦 r.Pe| 8^jM1ST <QĠ;Ug]PcCqnS[hG&$g$%{ז0 Ò >|hq" ~d j<O Ϸ^b\N_|g ƽX7%ky ՋQu 2;|-Hh}R0WA/$MےXSm.!b%֡ ㏿ï DiFU{#aܠܻ!`Ikbaa {fSc}wo=v7>ODtٙVclr: 2_Տl:Z+0H8xMAk}[ RvXBCh"  v(10`G }Olpn\ OP?ѽq)$߼p٢B~-tS"oUNdJP;jF<Α 01Y agB/##P&fFbF/U֎Q0 F(h2Q0 F(`mQ0 F(#h`Q0 F( F`Q0 F4`Q0 F (`Q0@6F(`h0 F(`@@ Q0 F(`~P3IENDB`bzflag-2.4.2+ds1/data/explosion.wav000066400000000000000000005105201200563112200171120ustar00rootroot00000000000000RIFFHWAVEfmt "VXdata$ ,,  q q ''hh>>EEZZLLaa  WWx x IIJJhhQQ@@QQ%%GGyyCCު޽{{3 3 ""JJ%%YY]"]"U%U%>&>&$$!!??FFpp       22U U h h i i mm||!!:: NNSS&&44AA 9 9 f f d d U U * * ''AA((TTII;; ffSStt  **7 7 UU,,88~~VV))!!_#_#$$##9%9%''((&&$$$$z$z$A#A#!! aaPP**$ $ KKAA}}]]BBII::FFKK ~~ee''bbXX<>==WWRRssii--##  ffOO aa--55\\ZZv v   FF((jj<<  WWssss@@׍Ս՚֚և܇܄[[,,++LL<<| | MMOO``ݺغ؋ދDD{{ܤ٤ٹ۹ۻڻՈӈ[[rr**kkYYii~~ڢڢ44ݕllZZ::JJ``FFyyTTOO++==FFHHee xxߒoo  1 1 ))cc ((ppCCAA44[[MM   UUWWyy  FFpp&&ssvv""##jjPPhh {{;;;;YYbbn!n!..ss  AA vv]]m m d d  SSߢVV""((--6-6-+!+!XX~~``mmÉщ\\tt%%22t8t8C+C+33xxii־##q2q2\-\-v*v*::FF88 ; ; nn,,__  &&uEuE3F3F..  > > N N xx66jj//999:9:11--A1A1**xxNN88RERE;;$1$1Z7Z7q;q;]']' ;;    $$::(( KK++fftt: : %%::;; ) ) wwAA8877((& &  ffHH SS!!FF( ( 66a a zz +$+$6655 . .++**##??}}OO>>r r ))уŃ MM33]]PP$$ŶҜӜ//VV((KK ZZVV޺33x)x)%% LLmm {.{...hh,,iiGG22͚͡СЁʁ11ʹԹhhߔuuvv##  V*V*::-F-FHH E EAA@@??E=E=<<^:^:>8>8+6+6229.9.:):)L$L$$$bbqqFFllNN::ߙߙ11WWVVllcc?? ..C C jjII , ,BBFF@@<<33T#T#$$**~#~# U U i i [[< < LLԪzzѣѣeemmccĦĦ44򺿽ii\\iiДӔ؉݉llUUkk22~~99AA55LLmmtt((  YY&(&(33773<3<+?+?==;;8833h-h-))$$e e bb  aa@@;;..::II~~vvqqQQGG<<$$GGNN||oo远œYYccɜ̜ffлһՈ܈55((cc00; ; ::VVOO,!,!$$&&P(P()),,..Q1Q122m3m34466u6u6331100112244_6_677g:g:<<>>??#C#CHHLL*P*PQQbQbQOOpMpMeJeJGGrDrD>>99#3#3++$$KK%%<<88JJ''pp;;mmMMtt }}||ޞݞ66޴ݴچֆFFԈՈՐאxx||wwDDEE $$==FF))˛͛33XXْޒ//ww88hhW W L%L%77[>[> 5 58.8.6262554455|2|2,,**,,i-i---//////?/?/.1.166<<>> = =u9u977 8 8=8=8 8 8o9o9=;=;;;";";O:O:99g7g74411J0J0114466 7 76677Y:Y:+>+>AABBAArArA`@`@,=,=\9\966O2O2..++))V&V&d!d! n n ttss44۔WW×ϗ33ʷŷ@@^^&&ɩɩœœ66JJLL""II""φІ@@ۖۖ<<ڢڢڨ٨ ض׶$$[[ԑґҹӹZZff==ܴߴߋPP__LL:: !!##%%,,d.d.,,..Q/Q///z/z/d1d177::5533665544 8 8885522..w'w'uuooyy((""**444=4=XBXBCC@@X=X=T?T?@@>>==<<::+9+988y6y6)5)533|1|1//|,|,['['{!{!C C ddCC \\ΰxxʊҊԸԸ))DD((Ȩۨەݵڵ//--KKܿܿ//zzLLљʙʐTT__ٲٲRRÿÿ}}ƞОЍߍNN[[XX33^^  >> !!i'i'0033,,0%0%!!) ) `8`8KK"H"Hn9n93344X2X2--V)V)%%v v | | ww..88CCxx[[9 9 c c GGdd##''()()**--22L5L56677Rl>;;::w9w9q6q6444477::q3q3 ޷۷//66܇JJ 9 9 ,*,*i!i! ffJJkkGG&&// $$   **1111**##AAz z ==ݫݽٽ22PP$$cc((@@TTOO**==Č==--ڽڽ++xxeeſſ))ooJJppŨƨƟǟǕʕʓ͓͔͔ͣΣ!!pp``XXoo,,66߰߱߱{{BBII uuЀр __ձֱLLگۯۈ݈ݔߔmmNNGG``33  ii""<'<'^,^,1188z?z?aFaFPP[[[[VeVe!o!oZwZwyyvv_j_jbZbZuWuWCeCeXlXl:d:d__AcAcSaSa\\J^J^t_t_^^]]WWJJ>>d3d3g%g% "" }}@@88ذNNrrڧۧ66NNBB&&2020E2E2''tt""@@ y(y(//77FFnSnSxUxUOOHH.?.?..XXRRs#s#*(*($$""##A%A%}(}(G-G-11969699992424++      99 >>rr//RR__88^^ ) ) PPHHXX66**ݟٟ،ٌ::__ff܌ٌ٠֠֫իսԽ ]] ..޹ڹ||҇??ƩƩ߮߮mm''iiŚȚGĞц88ؚޚހ''b b 99qqwwSS vv"!"!""m!m!QQ44??99# # Q/Q/AAPPUU'Q'QdIdIDD&D&DAAm;m;88.8.844--w,w,D+D+$$((>>^^ii ]]NN\\xxRR$$||iiDDjjkkܾuuþþ77..aaˊ͊44MMZZtt ] ] qqXXwwaa ::rr 7$7$E+E+22==IIRNRNBLBLHH G GEECCBB3@3@==::7733..g+g+a)a)$$## @@ii[[^^mmȟŸoo77PPWW[[]]ȶȶNNAA%%ҔՔՅׅ\\II 88[[//aa%%}}qqjj66 rrNN%%88>@>@66b(b(##$$$$%%))9)9)x&x&&&'')')'&'&'''}(}(L*L*,,--F-F- + +8)8)((+)+)^)^)******))S(S(%%!!''SSuu44 ##LL\\{${$--w7w7AANENEQBQB::l2l2**I I uuaaee,,##yyHHYY~~II22ߋޔޔޕߕVV88wwOOrrRR߃OOHHޕڕjjkkّݑݣ t t  &&**++((]$]$  ####  ZZ T T  L L K K z z XXddyyVV>>``GGuuֵԵzzPPʱȱȃǃŁÁNNVVĹ99˕˕33EEiiҏՏոٸٌ܌܇߇YY22bbEE__DD 8877FFBBq#q#uu77##uu[[% %  AAKK % %22EEZZaa?P?P5544..[[CC##2277%D%DXXeeggbb\\XXSS2L2LFFAA88(( ggff99pMpMKKG;G;8*8*GGWW%%FAFAKKHH==77C7C7=4=4O+O+##qq,,NNϥѥmm__%%\\IIooiiHHssҀր%%))55kk((JJ!!))ww@@{{ʯʯ>>ͰͰ==11dd[[mm̻ͻ͉ωЈ҈ՄڄKKIIHHss''QQ    @@GG!!''00;;@@N;N;>>LTLT.`.` X XVHVHH-H---aa''!!$2$2'J'JPPLL??_!_!**``44&&i"i"-->>FFLL#N#NII~G~GFFCCBB@@k=k=::77j2j2,,t%t%%%//--!!    OOooNNXXݘ̘ͲͲʜʜ ØØJJ@@66,,ê̪ii66QQٶ˶զߦMMee'']]((iimm>>((<<KKMMnHnH^D^D==7799;;%/%/xx%%  ee CC$$qq!!!!22ddD D EE>>00ܨ֨֍ҍΫ˫NNƉĉUU::ٞٞyyååqq^^bb//wwMMHHŲʲʙΙkkђՒթ۩HHgg  JJ%%4+4+w0w055K;K;>;;`7`7,2,2?-?-b)b)%*%*,,%%SS ##??5511 ))ʦʦ""XX::nn۽JJff++;;66%%3322ܩ۩ddYYج׬22ҲϲxxIIiiQQ UUEEޞppUU::<<pp KKqq%%s*s*//4444555566~6~6M6M666V7V7::J@J@/F/FJJPP [ [ddffcc__]]d[d[WW~O~OcBcB33..;;PPKWKWPPLLJJFFpBpBr?r?:: 6 622 / /v*v*%%\ \ //ZZ--99++UU׏ll꺸˸uu99P P !!__!!11ȁllѪTT00{{##ӌȌ׺׺bbFFששDDӨccwwՖ̖ˈqqÎkkaa``͛ϛϰ԰qquurrjj99tt RRss  ##$$$$i%i%3(3(,,C2C288BB>P>P]]EcEc``U]U]_[_[YYWWUUSSQQMMIIEEBB??!=!=9944//T*T*##wwaakkffllԚ P#P#%%EE44gg{{xx\\ٟğ̭OO[[hhII@@ٿٿ͸͸ӰӰŸŸネňőɑ˓ΓCCѓғXXߕ88FF33,,  ,,xx**;;NN\\]^]^1Y1YzTzTuNuNDD11\\ ( (VCVCKKEE55   ӹff ƀπnnWW ww99))""r r ,, > >NN*U*UQQ+I+I*?*?** **BBJJ{L{LGG??:: 7 7`1`1[-[-++(($$NNGG,,wwWW>>**׹ȹȷ55//ll¿NNkkxxKKll¥ťŁɁMM EEصݵFFzzBBmm--d;d;oEoENN{V{VWWTTXSXSBRBROOKKGGBB==8844//**&&""YYEE cc66XXӯïuuFF22..RR]]ȚȔ,, ||``NNԨ֨֜؜ڑݑFFyyhhj j 11II&[&[ccbb]]8Y8YUUYOYOEIEI@@44J'J'MM..HHчև֣ܣjj4411pp55<<  nn2&2&--3388DD[Q[QRRMMjOjOSSRROOMMJJFFDD@@>>Z;Z;o6o6//))##uu^^||  @@RRڣѣƺ**CCPP@@ֳֳ::44__||kk ll55ڒݒllww))//.. ==N'N'838399E0E0ffg g y*y*]+]+''''c.c.T7T7+>+>YDYD M MPUPUXXUUSS/Q/QvOvOMM_K_KIIFFgCgCL?L?V;V;M7M722U/U/,,))%%("("  {{ ||RR44JJii ٷ׷ממ!!00@@JJLLž??פפ;; ֲֲ++44aa,,Ǫɪɜ̜̂ЂДԔ؁ہۃ߃77\\zz334 4 AACCllZZ!!##%%x(x(,,115588??ALAL[Z[Zbbaa\\:[:[XX[R[ROOLLCCEDEDOOQSQS:M:MHHFF{D{DCC??o9o95500u)u)""ٸJJ''))uuT T  >>TTHHYY ܶݶڄքшш bb22ѮҮKKи˸@@½··VVhhttGGjjoożż88ȠˠxxϚӚׯۯOOjjOO  L L \\[[==!!##$$J(J(****y+y+++n+n+,,..Z/Z/~2~2^7^7<<.A.A3D3D~F~FIIgOgOWW~]~]^^\\YYXX-V-VOTOTRRPPNNTMTMQKQK(I(IGFGFAA==88H4H4//++''##1 1 VV!! ,,--%%==֎aa̶̶⤗[[ՠՠ$$ըը¬¬XXQQørrΉ҉ֺٺ##[[ tt//x"x"((Q,Q,V0V0r7r7CCQQZZZZWW U URR8P8P$L$LKGKGBB>>::z7z7t4t400,,''""]]""HH&& DD--َɎMMwwUU))22%%zzߤ""??$$!!yyMMjjKKʴ޴ޖ11rr55RR::߾ܾuu**kkÁʁʣͣYY^^YYQQ!!ڤ''wwiiw w NNq!q! $ $$$$$&&&&'')),,Q/Q/33A7A7;;YAYAJCJC;;3737AAMM6J6J)?)?;;??9A9A==9999(;(;9977L7L788::==>>q>SSBB&&UUKK nnMMrroo: :  !!22GGyWyW}\}\XXQQII;;x"x"3399OOLRLRKKqEqE>>888484--&&BB ׳׳XXttɃ++SSD D : : XXxx""K K ++||ʮʮ٦٦̩̩{{ݱݱ͵͵ ¸xxѻջAAޫmm~~$$nnAA ::88QQ[[8\8\{V{VLL_A_A22;;ffd0d000HH((Ӯ{{))??PP.V.VRR$N$NJJEE>>v9v944--((##VV DDGGߨߩȩȁ //NN''t*t*d$d$MM WWEEvvijij??vvhhߛ**2233..&&YYWW}}KK6655uuCC||ºźOOOOll;;ݬKK44OOLL > >   !!&&--E8E8EEUUbbgg8e8etataH_H_E]E]ZZXX.V.V$S$SNNHHBB|<|<33%%((׼ͼvvԘޘޞMM~~ҍ΍''YY!!k k 3322nCnCaFaF6=6=..ӷȷȫѫьތ}}OOAACCHH/ / ""--;;IIOOMMjHjH^D^D>>/2/2;;Z Z ( ( $$,2,27777V3V3++!$!$ 11HHJJaa==++٪֪֓Փԕӕ ҰаРϠϢ΢>>̞ͫ͞˫gg55׻׻зз}}iiɓƓʿĿ44ڬڬǯǯnn88pp__Ԙؘؘݘnnxx!!ss]]ll  && GG!!##&&((**++..//00~1~1<1<10011:4:42727;; A A@F@FJJNNRSRS%Y%Yk]k]{]{]U[U[AYAYtWtWUUSSQQPPLLnGnGAAY>Y>==AAEEVEVE@@::z5z522i1i1--((%%""XXffgg PPjjTTrr ||77yyll!!χ͇^^˕ɕ55ȽƽĺºNN;;))77ZZ((  yy˵˵00ƜɜWWKK__4466YYWW||xxh h E E 7#7#++|4|4.@.@=P=PaahheeX_X_YYRRMMFF-- JJ11HHUUXXVVRRNNRIRIDDfAfA==996611&-&-(($$ nnQ Q 22@@55``00MMϰϰ// @@>>ČĊ͊11סxx ''88;;+?+?DDW>W>..""ll^^ ??ƻƻzzϢӢӽؽؕޕ JJ||``PPg g ''99KKVVyRyR"D"D--^^^^^^1$1$22BBYQYQVVSSOOMM0K0KHHEE&C&Ca@a@<>;;8833 0 0,,&&ے55ccԞR!R!EEރ°°mmċĕȕVV??zzھ߾߃. . VV'';;LLSSJMJMIBIB22IIpp..AAHHFF<<--رJJ hhs,s, > >`B`Bt8t8['['   FF<U>U__]]lTlT:F:F--yy##< < i!i!>>UUXXNNMAMA,,  ##44j j &&8989EEEE66<< 7 7MOMOPPaHaH(F(FDD1B1B@@k>k>;:;:|6|622--K(K(F#F#ttp p h h mm;;##nnrrxxٵٵ FFξξˡˡyy٪٪yyuu;;иظ||##ssӆ߆xx<<ff22}}AAFF##|0|0)@)@NNVVVVDSDS P PLLHHEECCY@Y@L=L=v9v944--''!!t t 22uu ]]AA}}AAؙ֙ؐӐWWbbrrᦿ66--AAǹǹ??88uuqqϢӢ88II""^^oomm''  i&i#5AANN^^gghh g gododaa^^$[$[UU@N@NBB..j j OO33JJ0P0PGGJ@J@::&4&4++ttggMMffee Нڝuuww$$l>l>FF@@Z8Z800n(n( " "mmUUMM! ! %%))NNٷŷննkkͽ͸!!mmɷɷ>>oo˒Вtt؟%%++6C6CzMzMOOvNvNIIAA::33++##vv˷׽׽]]EEƾɾπӀӦצGG))yy>>@@P P aa11++99*E*ExMxM>X?X?AADDmGmGJJ&L&LZNZNQQWWT_T_ddddaas_s_]][[YYRXRX{V{VTTRRPPNNLLIIDD??S>885533c1c1).).((2"2"&&``Ԋ TT##{{00~~֖ؖض۶&&**33  GGbb = = ::MM ""####$$%%''2*2*A.A.221616y7y7%8%899==LDLDJJMMMMlKlKbIbIGGEEBBG?G?<U>8833I.I.**&&##ccqqMMnn11bbMMVVݥUUtt؆kkRR^^zzͯïbb ԩԩ xx̰̰$$ﵑddÍîȮ==SS33g@g@FFGGs@s@7711 - -W)W)&&0$0$+ + BBoo ww%%++rrNNyyԼԼ߲߲ݷݷ))MM11bbǣ̣Пԟ ًًٖؖ||00XX((!!~ ~ %%++1199\C\COO\\IeIeeevbvb__8^8^A\A\9Z9ZXXVVTTRROOLLIIIILFLF+C+C3?3?[9[9$0$0%"%"((551*1*q q ! ! NNaacc##ޣ٣&&қśźttBBww\\99jj33OOVVЯӯӼ׼VVkk[[ yyoo]]v v <<"" --{={=MMSSMM*>*>I&I&SS DDh(h(001010(({{**&&****%%""00;;??=D=DFFDDAA@@??<<;;885500 , ,S'S'##oo,,]]\\}}JJ||IIէħWWooaaWWۏ88jjIIqqɝɝRR@@::33::gg""[[άά̰̰iihh55++’ƒ##..0044yyJJ==@@<<##%%__%%{+{+//11&6&6q=q=rHrHUU:^:^]^]^ZZWWGUGURRLLDD55n%n%((X:X: F F9F9F<<00#+#+**&&!!mm ooQQII""JJ]]&&aall ~~޴ކ܆܂wwmmܨeeۛzz@@ppۏ؏ԾϾccEEййbbhhğƒɒXX$$&&jjݞ@@  ]]88%%22DDmUmUXXII++  KK9)9)Q(Q(%%u+u+,3,35577==+G+GRRRRYYUU#H#H>>EE5W5Wpbpbv`v`[[ZZWWSSoOoOTATA44o?>W7W700++i'i'""]]KK~~((f f dd}}66ϖ ZZ??ʫ//SS22||ǣͣ<<))֠۠RR44!! gg1 1 33##Y)Y)0099EE8T8T__bb^^\\eZeZkXkXVVTTSSPPMMII@E@E@@7=7=9933 + +3$3$!! !!""/!/!11))ddE E yyll((ccߪ??Ыƫλλ11rrѰѰffUUXX!!TTɪͪ++܉22oo   8 8PP^^``N]N]YYHVHVQQKKCC77&&Q Q %% B BLLCC44",",P)P)3%3%& & nn##ְ֮ǮllԦԦMM77ʻʻ33;;^^HHVV99OOҩммiiɳOOԩکSSR,R,O?O?@@77**iiRRۂ΂ΘϘLL##{{ SS66$$ v!v!!"!"""h$h$''++--//////T2T2::wHwHTT~X~XTTQQL>LJJHHEEb@b@<=>==S7S7--,),)**[)[)""//' ' ))bbII߄˄]]//< >9933'.'.))%%!!F F yy ذ˰ʼʼ((׿׿EE77||MMɾɾAA__YY((ZZ݄22LL ggx x ssEE((&3&34A4ASS c cggddD`D`L]L]ZZ_Q_QEEDDLLVPVPDNDNOOPP9K9KwDwD@@==7722B.B.**%%??B B !!>>cc((vvppȢȢDzDzoo??``%%I#I#$$ [[ffoo\\ϳϳ[[mm[[ƊɊLL̹Ϲڥ||66TT{{]]~ ~ 99%%y.y.5555u1u122::AA/D/DNINI3S3S[[=^=^R[R[2X2X~V~VTTRR Q QPOPOLLJJGGDD@@==2:2:664411--))-%-%& & dd\ \ ''44^^ݞqqעѢ``̱DZǑ‘٠٠==bb@@~~::״״55''11ħܵHHzzoo33AA OO&&!!r%r%((--33 > >JJVV^^__c\c\YYWWVVTTDRDRPP0M0MIIzFzF,B,B = =8833z0z0,/,/..{,{,&&ll<<KKDD::GG^^JJxxEEWWIIvv%%bbxx߹KKiimmſſҵҵ{{uuVVȀ΀zz԰ٰيފ޹jj>><<~~D D   MM:: X X %%%+%+--818166==LDLDHHIIGG.G.GJJ P PSSVVXX6X6XUUSSRRPPGNGNKKGGCCY@Y@<<19196622,,&&""rr%%ss& & ..__FFFF##ccLL22))ss44־ɾ++FF죳EEll TT??KKdžɆkkھھ11kk####cc\ \ **;;4K4K;Q;QII?6?6  (4(4jJjJnSnSTTNN8A8A..PPqq!!$$,,R9R9FFMMNNKLKLIIPEPE>>p6p6-- s s ֟ПЋҋҠՠ՟ܟdd((33000)0)##tt ::ϸĸĽŽyyhh> > HHFFBB%%33??߸(())ܒے==ھؾ@@ ooAAxx߈qqJJqq**ʼ̼UUmmooٲڲݦccii__))QQd d   ((00y7y7<>MMxxuu҄ՄOO 00AAllmm ppmmffS%S%$$!!  UU8!8!""""R'R'h1h1d@d@PPYYWWSSPPNNJJDDe7e7''b%b%C1C1d8d899\>\>??484800--++N(N(<%<%##" " qqDD@@$$SSff$$MM55yyݺݺ֭֭טטYY::EE򠭢ҶҶ""]]ţʣ@@``މ,,HHdd22WW6 6 h2h2wJwJ6[6[A^A^rYrYSSMMDD44xx\\((ږݖqq==''WWll  JJ  }&}&00,?,?NNeVeVFTFTMMGG>>))  ffbb1!1!## rr@.@.??KKKKAAe7e7,,dd` ` ;;j+j+669922w(w(!!HH Y Y ZZ55kk߸==ߪߪʹʹʙ KKccCC؋ӋJJyy""ǩǩVV ::¸--qqSS7'7'k%k%V$V$##vv{{]] zzSS^^SSmmSSߦ SSmmPPHHss>>]] {{քلkk [[*"*"))004444c2c2S2S244j6j64422?3?366`9`9b9b988::kAkAGGBB>2>2&&)/)/CCTT[[[[XXUUSSQQOOLL+H+HCC@@Q>Q>{;{;o8o8i5i511--.*.*''v$v$~~{{kkkk00EE__ҥҥ觞55eejj׽׽ZZ88س޳ޝUU\ \ ==##Z.Z.h9h9<<00# # &&R1R1AAOOSSQQ^N^NKKIIFFBBI=I= 9 9X4X4%/%/**''K#K#UU ,,ܻջՋJJ %% 55d d B B m m 88##ss!!~~vvTTyy``ѝѝFF ɡɡllwwssss,,]]}}mm**{{SS&&::ENENYY[[YY > ' ' ְ\\ssQQTTUUɮɮiiBBii<< TT##K,K,%%aaԼԼQQ֦ߦ66}};;[[!!ރЃКњѓؙؓߙ~~oo!!99@@a"a"2&2&X-X-(6(6[I[ItZtZ]]TTDD++ e e hhUU!!++;;uMuMWWXXAUAUQQUOUOLLHHDD???:?:22&&<)<)//4-4-L#L#33NN66((  ~~mmNN""ppMMTTQQXXKKllޛޛUUee<<%%((}}±qq11CC4F4F<<11""<<ll llYYpp nnggk k MMAA ,,: : ~"~"''S.S.55<>nn..00cc ??zzUU['['T4T4::33''o&o&f3f36C6COO[[ffhheeaa``]] [ [|V|VPPMMKK_F_FM>M>8844\2\2}-}-&&\ \ ggkkxx"" ) ) HHh h O O iiwwRRRRoo޳سqqՐӐӋы11Ώɏ۴۴""77PP..||{{""ssiiذ԰Іʆffff33ĝɿͿшԈ||MM,,ZZ@@[ [ n n ooO#O#v%v%1#1#l!l!!!!!bb  ""$$ & &''*,*,:2:277?;?;<<;;;;>>AADDGGTLTLSSDYDYTTHHCCLLVV9V9VRRPPNN$M$MKKJJ.H.HFFEEbCbCAA??==p:p:767611,,O%O%00 ,,SS@@%%ۓۑԑPPУϣϝНСϡ>>..ƸƸHH[[VVEE33mmƊˊee==77־ܾܙ]]GG77}}yyO O //ZZ((J!J!D"D"!!""$$@(@())))**x3x3AAOOvWvWXXVVTTyRyRPPNN;K;KFF0B0B@@;>;>993300..m,m,))&%&%!!QQIIs s YYhhAA̡ۭ̭ll##}}((ΑKKΚӡӡԮԮ4433$$܈ˈ==%%ޠDD77XXuu""#0#022))  ww@@  C C   __1144$$00AARR[[ZZ]V]VHSHSXPXPLKLKCCCC(4(4!!002A2A==++55ԸEE55mmggnnssc c --p)p)99DDGGEE-B-B<<55y/y/))U"U"aaddddvvRRkk((''**\(\(!!\\ ## VV&&oojj KK""11ĮUU YYRRpp׆Ԇ ѳγ00ď||//ݺݺммnnllƾǾǨȨͅЅCCӀրֹٹ%%[[VVjjH H 0'0',,8/8/11f6f6_;_;>>X>X>>>@@7C7CDDDDCC9B9BCC[G[GNNVVf\f\hbhbhhggcc)a)aZZQQSSk\k\\\WWUUTTQQOOMMIICC<<44//E)E)""tt::  ? ? ##////PP//))WWמҞ;;͚ʚff..LLططVVOOᯎδδ޶޶ZZ88&&ooeeHHff !!##-&-&G)G)z.z.D6D6*?*?IISS$\$\S^S^\\\\YYWWUUTT,R,RPP|M|M%J%JFFAA==P:P:373744 2 2+1+1//z+z+*)*)((&&""SS  <<VVmm88QQƛƛII''ll))RR%%""99DDIIֺֺ,,ƽƽÚ==HH@@VVOO**xxUUPP) ) 11&&N/N/::EEdPdP Z Z____o\o\*Z*ZLXLX7V7VTTRRjPjPJNJNKKGGAA99"0"0v(v(##UUooggTT{{CCvv``__NNTTԚϚϤ̵̤ʵ==PP77UUVV66yyȽȽ~~ݺݺ^^XXoo77ÿ<<͘јss]]ZZNN,,**55  b b >>6 6 "" * *9393h;h;====@@DDFFCCBBBBBB6@6@==::55B0B0--E-E-m+m+/'/'##$$))--11t3t3{2{2?0?0..3-3-))''&&Q(Q(J+J+..//////\1\13344 7 7::@@FFRGRGhDhD?B?BAAG?G?==P>!8!877::::=4=4++ $ $""       GGjjLL||@@''ܕڕׂ˂ϸϸ ǹǹ󽭩77qqNN((==EEttuuYYaaڏvv**KKmm!!!!""::LQLQ^^ b b__H[H[xXxXdUdUnQnQLLFF#@#@994411//++n&n&2#2#!!JJg g {{ذ°PP((::NNwwww++ڰ33ًՋoo}}}}FF33|)|),,r)r)**l3l3;;??EEOORRLL3@3@))OOOO n n S$S$4<4<MMPP>L>LnHnHgEgE-B-B==55**!!JJ55ܪ!!$$668800t't')) QQ$$čII՟՟22ߤߤ88ſſ¾¾::ǟ||nnbb3+3+(,(,%%AA""W4W40C0CAJAJMIMICC::33--&&!!AACChh}}""$"$"~~tt ((11RRnn**""FF<<ܮܭ֭μͼ00^^Ú̹̹44<<˺˺LLii~~oooocc11ٽ 22S#S#l,l,0"0"u u ggؿqqffe e MM))s,s,VVyy  ++++ * *V+V+**/'/'T(T(4+4+T-T-Z1Z177<?>?==C>$$ſ¿""hhQQƲEEooggggPP??vvPP@@ MMRRA#A#((9'9'!![[XX##''4'4'&&++P6P6"A"A H HIIJJLL.R.RWWZZZZZZ&\&\a_a_aaaa;`;`^^\\ZZXX5W5WYUYUeSeSQQPPMMLLIIhEhE@@==;;Q7Q733 2 200 / /++(&(&RR|| jj''KK%%BB}}ٕ֕nnPP }}llȸ¸ CC00̪̪ͨͨѬѬKKzz{{??śʛʹѹ__((tt  %%,,((DD--  ##..66<>(<(<770202..,,t*t*m'm'$#$#~~FF(( 77ؒyyjjqq[[̈́фѶ̶̼¼~~tt**۷۷llUUjj 55OO𫕭88))ûƻʄ΄CC77^^NNNN{{--  ooGG""''E+E+&.&.I1I1333311~.~.,,--k/k/l2l2R7R74=4= C CHHMMPPqSqSVVXXWWVV^U^UhShSQQOOMMAJAJ+E+EAAYBYB)C)C@@ : :00((/&/&(())C$C$[[&&44  {{%%00@@__gg88``..ټּю̎QQ ˱бЮԮssʖvvGG--ee尵OOܺܺ$$ffWWffˢ΢΍΍==&&ڠݠRRݯܯcczz __MMMM""''++R1R1::nBnB D D+E+EFFDDXAXA<<`9`9==gIgI*P*P9P9P,T,T\\n`n`V^V^@[@[8Y8YqWqWgUgUvSvSQQLLXGXGCCAA:>:>d=d=GC>CBB.C.CzAzA~<~<22o$o$%%//44333366;;B>B><>BBFF I I~>B=B=S;S;;9;96633--%%OOTTcc~~ނrr޳سUUŦæÁƁŎŽپپ__ŽŵŵȮȮTTMM**bb]],,qqvvЬЬHHVVZZSSǐːZZgg//ҙՙ۬00c c PP''&& jjHHvv  ##**,,--..--/0/0V8V81=1=h:h:99AAYLYLUUWW,S,SGG66@'@'""j$j$k!k!??# # %%,(,(,,7373 = =@H@HPPPPhLhLGGAA;6;6 " "uu UU''I0I033`0`0''%%~~xxYY AAOOFF 44##]/]/^7^7/8/833,,##w w XXtt==ؕҕzz!!ϛԛll''NN[[##ee&&22ĂɂZẔɱ캮ººѱѱ[[eeJJii33yykkǰķķ))BBeeYY''YY̝͝33ѵصܶ**iippHHV V ""% % ..,,  ''0088EE\\LpLp_u_uppXlXlhhcc[[`J`J//pp jji&i&??XXbdbdcc__\\}Y}Y'W'WyTyTUPUPOJOJ D D?? = =8800n*n*$$wwxxٴ::Զnn  UUم܅ܤ((  ##O/O/--$$  SSٲjj mm;;xx VV44Ɍ͌̀Ѐii__ppُ//##99xx ]]88jj>">"226A6A(H(HNKNKYPYP]W]WQ\Q\4\4\FYFY?W?WUURRqPqP"M"MGGBB<><>8855$6$655r1r1]*]*##||SSvvAAggSSʽ̽^^̹˹--ͷѷCC''88&&||::wwjjvvUUIICChh""%%N%N% P&P&--e0e0..++,(,($$!!||,,v;v;BBBBJAJA{?{?==<<:: 9 9q7q755442200..((  oo&&$$CCkkVVݒ**իԫԹֹ77 ppWWeeԸԸՠՠVV™™UU[[̩̽ΩΌȌȥϥ//µµ««ttggEETT77}}-->>ƪʪʟџLL77AA))66;;88//OO נVV҉ԉrrttsszz##N9N9JJmHmH11NN**J.J.99ILIL\\LhLhlljjffcczaza\\aSaS`M`MSSZZ>T>TNJNJII J J?F?FAA{={=<;<;9966p3p33030,,-(-(""AANN ww>>oogg<\>\YYDUDUOOJJrIrIIIFF>>44Y.Y.--I.I.++))D)D)U%U%sstt]]s s   \\88qqӲӲookkƈ̈''۲ qqww sso$o$a*a*//5577Q.Q.!#!#$$D+D+22>>$M$MVVXXUURROOMMMMII;D;D3<3>$5$5g+g+))0077::::99/9/9;;@@EEFFDD@@<<99A7A7::@@3D3DFF>J>J$K$K I IFF-E-ECCAA??==0;0;44,,Q)Q)i*i**+*+''     zzk k g g ݠ 99VV..٬..ɯ~~«ff¸¸UU HHjjĐŐŻŻdd--ԺԺʼʼ߼߼''}}ĭĭ}}@@ڲڲDDPPÔvvƀʀ--Չى77qqyy!! 22LLs_s_ e ecc__[[VVOOxExE<<;;@@NDND D D9E9EGGBGBGDDDDFFDDAAh>h>V:V:6611,,))''##    ђџȟȸ˸NN kkBByy٣ˣLLĨddޒ&&kk oozzK K ;';'n.n.11//// 3 3(7(7O:O:==@@@@s>::*5*52200 0 0i.i.**%%r!r!hh4 4 --ffllllLLӱ̱WW''ФʤʻƻffEE``88ĩĩǫǫTT԰԰]]nn ƃɃ //ҳֳ##//99@@KK,,XX22 %!%!##$$%%((n-n-0044>>MMGYGYsZsZRRDD//%%44>>6I6ISSTTOOKKFF>>5-5-??QQ$$ss..##"+"+++B"B"f f qq7 7 .. 6 6::8=8=Q;Q;55..F&F&eeVV44 55%%&&&&##  00FFHH˴ɠɠ==ssjjĞ**ُڏڮڮKKCCOOԎȎȬ66xx$$MMCC󸶼WW..ˢ͢ѿؿ،ߌkkdd**]B]BUU``PcPc'a'a]]YYtTtTPPMMHHcEcEDDDDAA::d3d3,,m%m%iimm  EE$ $ ''[[bbڨè88::##<>~~FF7 7 XXDDf"f"%%++55??vGvGOOXXv]v]]]\\[[ZZXXEVEVSTSTARAREPEPeMeMHH3C3C==774400(( DDNN jjFF__~~ww>>cc uu[[MM̩ٚ̚HHeeNN==ɲɲεε((ssʻʻǴ̴00WW~~44ll|| ]]33A"A"](](v0v077_;_;y;y;885566::>>1B1BCCAA??@@LGLGRRO\O\\\XXVVYUYU0S0SdQdQOOMMXKXKTITIFFBB<<6611//..;,;,((##vvff$ $ nnTTGG33``CC$$܍قՂՊъ׾׾YY..EE11$$llӬӬbb""൞ƺƺIJɲɐ͐}}|| ۃڃګ۫||BBuu   ttwwWWpp  qq$$b(b(****''x)x).._1_181812255 7 7778866M5M5+:+:CCLLQSQSUUSSPP^O^ONN$L$L-J-JHHEE??::A9A999775522,,e(e(&&##**7 7 ~~KKxx--\\ښLL&&44̱ɱ88YY\\{{bb[[أأ77WWss4466޶޶!!EEʸ͸OOѳӳ$$kk""1111%%##_ _ N N EEwwnn66"!"!''**++P0P09999YBYB7G7GGGtEtEEFEFVGVG'D'DW@W@ D DOO]]dedeffcc``^^\\ZZWW U UPPII^<^<.).)   ...:.:==99|1|1'' ++""//666600{){)## yy{{PPssԊȊ!!]]ȵȲڲڗ__FFHH}}SSUUzz DDxxii88llAAƋ̠Ϡ99EE,,  c c ""bbAA& & H H VVee>>  aa66!!0(0(E-E- 2 25555$3$3j1j1224499<<%>%>==========<<;;/=/=W@W@DD%J%JLLfKfK^G^GCCBBEEGGHH)G)GFFDDBBwAwA??:>:><<;;99J6J611,,((%%""OO <>ôƴƗǗKK>>NN GGF*F*R>R>JJOOpOpOKKHFHF@@<<55..h'h']!]!^ ^ ((CCWW.).)44`9`9p7p7h1h1++['['!!11P P DD  ii44bb 33 TTڼڵϵţϸϸ''jj::ľȾףޣޘ//ooKKuuAA ,,J#J#:':'''R)R)..44888888 : :<>>>??$A$AbAbA,@,@A>A>Y;Y;7736369999==AA7D7DCCoAoA??p>p><~>DLDL~V~VUUHH66%%KK##..//d,d,00m8m8zAzAOJOJNNLLFFu=u=88 @ @JJLL)I)IPFPFCC@@<<66C0C0((cc11 ""\\  llKK<<ӟßî:: ӎԎffӚΚRR\\##BBbbǃ̓88<<ۓܓܩکׯЯлƻŻŻKKߴߴķķ((ԾԾEEXX::ӻػHHFFcc0044%%  ==!!|/|/AATT^^\\xTxTFF22-&-&k.k."@"@JJxNxNTTWW@W@WTTPPLLHHhEhE;A;A==;;7722,,''$$!!yy? ? CCllRR77ssKK22LLҍ͍͗ŗŶeeYY\\==44ȳȳppnnֿֿddJJwwҕ֕~~܋ދ޽??++99>>h h 33))IIOO!!""##%%)),,..115588s9s999w:w:|;|;;;<<<<<<;;;;<=<=>>?@?@BBFFKKPPtStSRRVPVP,N,NKKUGUG$A$A<<;;:=:=??@@H?H?<<99p8p866T3T3$.$.(($$__o o z z   : : QQ 22&&gg//ާا>>‡44 ??$$kkJJē˓--Ҹո ֒ӒӘјѯѯ<>БёZZUUWW Ԟўxx̻ǻqqɭ˭||33ޭ--00__,,  ccu u ``vv~!~!]']'".".44::v>v>@@OBOB*C*CCCCCFFHHII+J+J9K9KZLZLMM_P_P,S,SUUWWWWUU T TTTUUWWYYZZXXSSNNMMOOQQQQ&P&P^N^NLLJJ;I;IGGFFiDiDBB@@>>;;V8V833//++((U%U%@!@!  C C   66zz##ddppߝ77۞מӽн͢΢ ББЁρ@@..xxƟŸ//@@׶׶̰̰rrصص~~BB44Ȱɰɝʝ]]ɯƯƮŮ]]ɞ˞˺˺ˀ̀5577 UU>> OO66--EEƫ«¯Ā<>  d d 22++xxu!u!##=&=&))F.F.22l6l699;;|<|<<>>>@@AAXBXB> EEvvvvBB ]]++//ټѼ##Ɂ00--ffLLZZ<<44?? ww88rr'' SS1 1 JJ++99 ""8$8$&&)),,7/7/11F5F599==@@BBDDGGJJKKELELKKJJ J JwIwIHHHHFIFIjJjJoKoKsKsK\J\JIIGGWFWFEEtDtD(D(DCCBB+B+BAAAAAACCyFyFJJJJLL7K7KIIGGEEDD~B~B@@????==;;99M7M7m4m400,,S*S*'';$;$! ! \\   hh))ܱر:: !!xx͟˟mmƲIJ--44bbĘĘII``llzzΜΜڠڠmmyymmVV::))ưưnnff((Ƕ˶bbBBԮ׮::AAqq''CCYYpp;+;+--})}):":" (( mm/"/"((=.=.?5?5??HLHLUUSXSX&V&VRR+N+NGG>>V4V4u(u(}}P P {{ZZ==UU ""i#i# ""+-+-s9s90A0ABBAA>>;;8822J,J,g%g%00//ėʗXX߷WW & &;*;*$$OO5522oo## ZZ%%aaDD hh߱߱ޱ%%wwݢۢ$$ ׂ҂җϗʖÖBBAAqq**@@ݔהbbքلٮڮځ؁ppќϜ33}}΅ͅKKZZ""^^$$ٽܽ܅߅߉yyeell11[[  (( Y#Y#k'k'++..22R7R7>>CGCGQQ[[bb:a:aYYRRRRZZGbGbddbb``^^\\X[X[YYWWUURRNN@J@JFFBB>>::^6^6S1S1,,&&N"N"rrrrddeeڝ33@@ѫѫSS||mmԾԾ ƍȍȢˢϴԴjj ^^**ee33%%++))T$T$!!%%--77AAfKfK%S%SFUFURROOMM(K(KGGPBPBA=A=;;y>AABCBCDDDDBB'@'@??'@'@@@CCSISIOOSSRRPPNNLLKK-I-IeGeGJEJEBB??$;$;77S3S300--))%%!!UU::@ @ GGii!!zz\\&&ttppQQmmۚךPPӯίΨ˨nnʂȂȵĵČmmuu))ˣˣѢѢפפgg©©[[ٰٰ ׷׷jjQQkkee99ii))44ֹ۹uuNNII NNS#S#U%U%$$####&&)),,..22Y4Y455;8;8<<CCJJQQSSTTSSNN>E>E>>99_5_52211M1M100....--d.d. 0 0v2v24466772929<<=C=CIIeLeL#K#KHHGGtEtECCBB(@(@-=-=884411..O)O)$$ ff{{ bbUUݪ??څڅ՗їRRêKK׶׶]]EE))աաܡܡ##ii77ƳƳͺͺӿӿģkk**ŞÞÅÅmmȣ͉ͣӉ;;޾RR __nnee-- //((""%%.'.')()())++..11Z6Z688 8 877A9A999}9}9m:m:;;O>F@F@QAQA4C4CCECEsGsGeJeJMMDPDP"R"RQQ P PrNrNLL2K2KII.H.HIFIF.D.DAA=>=>::88_5_52200--))##))EE@@ - - TT  11 KKeejj##NN zzύ̍KK66TT ȹȹݳݳ--bbઽ77 bb''!!22$$ __;; !!,,VV\\KKLL##EEi i CC,,]]!!$$''s+s+//55::k@k@GG+P+P5W5W;Z;ZYY8V8VOOFF>>L;L;>;>;;;==KBKB$F$FEEZ?Z?l6l6`*`*22 oo66OO ))%'%' + +&&AA]%]%u.u.66==??==<9<933<-<-$$@@ww jj t t TTٓٮԮԼҼ33SSttff__qq NNQQ  ##a&a&W%W%E!E!::}}uu ::3399HH``ooKK֌ҌOO̮Įüü}}ЫЫGG__ĐIJѲԜΜ΢ʢYY??†ņ΍ۍQQ77yyܖܖRR77{{TT00##AA۲۲ۿۿll,,ۀڀڂقٗؗ66ӠΠʨȨȦȦʑˑQQͩϩϐҐ&&}}ֻֻ22"":: ffzz''}}- - 88++||G%G%**// 4 4m7m799;;>>>B>BEECICILLNNXQXQRSRSSSSSlSlSSSUUWW Z Z\\B_B___\\UU?O?O;>::9988H7H7L7L7::==@@CC:G:GcJcJJJGGAA;;99997755221111..Z(Z(P#P# 22  55::**::mm˲ԲEE۴ݴKKSSɾɾ))}}44QQ//kk[[$$@@ii@@WW ;;WWdd!!$$&&a'a'.(.())**,,..113344557799;;??gDgDFFFFgEgECCAA??s=s=L:L:6633..**\%\%Q!Q!##YY 77[[}}__TTڡء++oo ]]Ѷ϶FFɅŅŽ׺׺ηη PP{{eeȻȻ==66ǮǮŖĖiiĺĺvvBBŻȻTTVV__&& ))ccGGUUŝŝƏȏ<<##66NNUUCC33[[__22==!!` ` 44  ""%%((,,00E4E477::>> B BcEcElGlG_I_IJJIIGG%F%FWFWF"G"G G GFFEEQGQGHHII/K/KMMPPWSWSLTLTTTRRuOuOHH??8855 5 555_5_5u6u677L9L9[:[:=;=;<<<<;;080833[-[->'>''!'!,,ggmmSSEE^^??FF__  ##**)/)///--++(($$6!6!  ; ; < < 22//^^{{hhVVݐLL77ӊЊ44 ʠȠQQ""EE00ննĶĶ̶̶dd??DDЭЭǬǬ ||vvdzdzooQQMMYY**QQQQ YYPP–zzƟɟɎ̎̇χSSAA++ٶݶpp`` __((/ / DDWWq#q#&&+*+*,,`.`.?0?022K5K588;;>>@@BB+E+EEECCCC*F*FvHvHIIIIIIJJvLvLANANPP|T|TWWZZU]U]^^1^1^)])][[YYWWYVYVTTRRQQOO/M/M+K+KGGCC??<<,:,:886644 1 1O,O,''##OOll LLCCPPhhݗٗzzff[[ ee--;;LL޻``٠נדԓ гɳɣѹѹkkƟƎԎzzߦݴ))ttڞ֦֞ѦѴ̴̽ǽǓ“ܽܽȹȹ ߴߴOO::Ư̯̂ւߪZZ++??@@!!``99;;SS))  JJ""q"q"%%''))8,8,..11444466 8 88989::<<==??AACCBBAAAABBAA@@????@@BBnBnB{B{BCCEEHH%L%LMMLLJJ"I"IGGFFDD/C/CAAA@A@>> = =y;y;997777u4u4V1V1^-^-(($%$%t!t!QQ hh~~))GGҋϋWW ˰˰˨ʨʎȎƙř mmʻʻ <>HHKKIIkEkE??u:u:551111,,n&n&     11 XX44QQYYnnޕועϢτDŽPPll(([[YYٳٳrrNNOOkkݤ66ң̣``Եصiiېݐ$$xx^^ EEhhCC!!M%M%''**k/k/T4T47799i:i:::::<<2A2AFFJJLLoLoL*K*KIIGG;D;D@@<<88w3w3++t!t!``  ??@@llݧܧ##>>## --q q l#l#]$]$O%O%''++..22C6C68877~6~62525O3O3//**$$22 00..wwi i " " F F   ))..NN KK$$3 3 AA99<5>577_:_:_<_< > >y?y?O@O@V@V@t@t@AAAABBCCEE1G1GHHII!J!JIIIIFF}C}C;A;A^@^@@@s?s?==;;;;<<<>-?-?==V9V9b4b42244I7I78877 8 888l7l744//**M%M%qqoo??KKdd!!^(^(j,j,,,o)o)\$\$iiKK !!..ss}}-- μμLLMM||HHMMՒՒ nnݝݝvv ~~77||RR̦̦צצ11ѬѬss>>]]ppFFEE88}}**1122q/q/R)R)##TT((VVE E rrQQTTkk DD55ؙ77RRcc§!!bbƟɟ++KKЙәӥ֥LL--WW<< "",0,0==JJSSYYZZ|W|WLPLPFF775%5%  OO$$((qq" " 4 4 &&e"e"%%$$0 0 ff ##)){/{/5599::8833,,O'O'2#2#B!B!_!_!""@%@%w'w'])])6+6+y-y-;0;022T4T4e4e422//----//000000?1?1111100//--,,**))1*1*%+%+,,..114466~6~6+5+5332200..,,a*a*B'B'## VVQQ**ee%%rrbbhh++oo77||WWЬͬ.. {{ĺĺ!!ӵӵbb//GGЧЧ龍بب::ggnnii}}00 KKマăğǟLjʈbbhh<<55aaUUBBvve"e"{,{,77CCPP[[``bbA`A`,],]ZZiViVPPHH2?2?!4!4,(,(<<DD%%**H)H)s"s"DDN N FF##CC{{22WW11<<v v kkpp66oo..88!!$$&&((**.+.+++,,0.0.j/j/001122222222 3 333>3>333B3B300//d/d/001132323377C=C=@@@@==-9-9>4>4..))''&&&&&&C'C'i)i)>+>+**''##$$ UUMMaaQQPPޑ!!rr##%%DDǎŎ€{{mmvvWW##33zzʹʹDD||ҸҸyyඎccŲŲ>>UU..FF{{Ƶɵɩ̩̘ϘrrWWՋ؋MMrr>>]]++aa IIcc) ) ##&&((**\,\,..1185855959V=V=AAEEHHIIGGEEDDDDFFHH4K4KMMOOsQsQ S SSSUU/W/WEZEZz]z](_(_^^\\ZZXXVVTTQQ}M}MHHBB;;+4+4,,&&(!(!]]""      K K   aaKKffNNhh DD֠ޠUU''xx vv%%:,:,--++U(U($$t"t" YY99 KK8888RR ""۠٠ٱױYY֞ԞԬѬы΋QQ55OO̡͡++77Ȱưmmغغ$$㶗__!!33aa̞̞NNhhZZllڰް{{ HHkk>>  ^^##&&)),,".".D0D02244R6R6V8V8::<J>??AAgDgDFFHHKKOORREVEVZZ]]y^y^5^5^]]<[<[YYHXHXVV;U;UuSuSQQ1P1PSNSN=L=L;J;JGGDD@@<>ff((YYC C zzHH >>ٶն~~xxɥӷӷyyMMǪ||\\zz}} ##''==zztt&&yyuu==ssDD$$ n n U U  99yyGG }$}$_'_'))++,,--//H2H255n7n7991=1=@@EEdJdJPPVVZZ[[XXVV U USSBQBQOOMM%K%KHHEENANA<<8833..`*`*&&$$""KKrr ZZ qquu99^^77::۳۳77))JJHH˝ˡ֡ߛ//ppѵ͵QQ <#>#~~D D T T  MMRR99vv߬جϴƴƪbb\\ccKKjjyyvv""''55wwRRőȑ]]llzzBBQ Q EE$$))-- 1 144::e>e>$@$@??h?h???BBGGMMWTWTYYZZaYaY@W@WMUMUWSWSoQoQ6O6OmLmLIIEEj@j@;;7711F,F,''##QQ00kk++ؑƑZZeeXXrr&&Ɔмݼ99## ::!!!!::22# #   88..))RRߔٔ66ӑ̑ȡǡ>>ω҉..uuјϘ1166SS;;ӂ܂ nn!!ddII||//55..ڦަyy hhVVAA$$((++--..--**####VV&&99KK{{ ##''X*X*--1155::??DDIIYMYM8N8NLLHHvCvC?;?;6262 , ,,*,***,,//4499@@[F[FGGFFDDCCAA??u=u=::7744F1F1--++2)2) ' '##))55  MM''>>ݽββYYssLLnn$$Ϋ))جԬIIuuuullDDۮݮWWuuYYքӄhh2288IICCYY뻚,,::&&[[̷Ϸ۩ީBBttGGRRcc DD((O6O6[E[E8S8S]]dd@g@gofof?d?dHaHaC]C]FXFX?R?R J J>>22**<(<('('(V)V) - -<3<388+;+;#8#811))v#v#qq00--ۈ܈ߦ??ff ݽҽhh$$xxaa99Ӕ֔֏ۏ++}}NNO O RRc c 00""&& ( ((())****O*O*b-b-33::??OBOBCCDD F FHHIIGGBB < >::66<3<3Z/Z/++''##kkg g O O WWgg**ߩة㿼]]>>HH߮߮ffEEIIGGȈ̶̈жкպIIXXppff==1188&&e3e3>>EE"H"H!F!Fi@i@y7y7++     MM''))'4'4==CCDEDECCAA??==s)>)b!b!VVOOUUzzddIIttܚњ@@++ppЀԀԘؘس۳..FFBB^^zz mmFF--##{){)0099==;;P9P9 8 844z0z0i-i-o+o+**y,y,5/5/c2c266==eCeCGG,H,HEEUCUCX@X@<<-9-95511U-U-((##ee  CCSS? ? d d ssYYeeQQ kkޮۮMM̾ʾ``uuşŸCCEEӸӸ++⹙??gg//uu>>====ºº$$JJ  mmVVXX==kk??++ ""{{M!M!&&Y,Y,0022449797::b?b?wDwDII=O=O;T;TYY$_$_&d&dff>f>fdd b bc`c`S^S^[[+Y+YIVIVSSQQMM J J.F.F'B'Bm=m=s7s7//g'g'rrXXMM>> RRNNZZ..>>qq= = ttEE{ { **)7)7WBWBEE]C]CAA2A2A>>`<`< ; ;99@8@86633F0F0,,((##  44   ZZ??~~߼٬֬CCDDˍǍ@@ģggLLµµ77QQZZɨɨJJll))((\\NNee99{{##**//11n1n1K0K0--((!! OO11܆ֆ֣ף~~܃ nnk k bboouuWW ))lll!l!/"/"""""##&&(({+{+--0011-4-477<><<;;`:`:99r8r8777788u8u8{8{8Z8Z8q7q74411..++s(s($$x!x!XXttg g   DDrrtt00ݓ``~~$$<<ccVV77MMdd򬧫__^^ee44ڤڤSSHHKK**44AA‡Ƈ//Ԥؤ؊݊cc||--rrAA 88@@9(9(w4w46A6AJJPPrVrV*[*[]]i_i_n`n`V_V_\\.Z.Z3W3WSSOO1L1L>::6611--))d%d%g g  !!kk??>>ߡۡ<<--<<PPߧߧީީϱϱEE88ĥǥkkЬԬԺغܨ))   @@""c&c&((**--00^3^366;;@@HHPP:X:XZZMYMYVVTT'S'S!Q!QFOFOMMJJ8I8IpGpGxDxDAA==99*5*500,,`)`)=%=% !! 66 <<``ݲݡաss͠Ġįuu++ȟȟأأŦŦʡѡјӘ8800Ͽɿǫȫȧͧ͹Թ**JJ<<f f 44ff!!--::CCkFkFNENEBB@@<<66..$$33||==>>TTPP$$uujj++@@MM||TTM M ``  !!&&t,t,44r:r:L>L>@@.C.C D DBB.B.BBBAA??d?d?>>==>>!>!>W=W=;;c9c9[6[63322l2l2q1q1..++R'R'x"x" P P ++ &&ߪ[[ܓٓ''55Ѳβ˴ȴȳųxx׽׽ԷԷ žž77yyFF&&˥˥ǧǧUU**ɶɶӺӺ™źƺaa%%==hhϵӵtt * * 3 3  NNrrC'C' 2 2==HH#R#RgWgWWWUUSS0R0ROOLLII G GCC??\;\;6622--{({(""``DD ..]] rrЁ΁--ppwwˈɈ//ŘƘ44pp`` \\HH00))77!!{ { jjXX%%55AAk k !!!"!"""$$&&))++++D,D,--..//?1?1e2e2Q3Q344O6O6|7|788;;w?w?BB~D~DcEcEEEEEeDeDCCBBAA??{>{><<::9977a5a522T/T/++((6$6$i i UU ddqqXX((99܈DD``JJ ))''mmKKڮڮ//QQ++,,̝̝##[[MM55װװ庍 hhԬجPP >>tt{{5"5"((11::CC5J5JMMNNNNMMLL6M6MMMeNeNNNOOOOPPNN;K;KFF@@9900&&//$$11tt: : //RR%%KKvv[[cczzkk  00__''224949;;88F5F511--))''&&%%""llmm nnMMyy99 ff??}}XXJJۋ֋ {{Ήˉ˧ɧɃɃDD̆̆22 22//߼߼>>KKJJվվȂȂǺź""eeVV̇χXXҾվJJك܃߁.. KK##7'7'd*d*l-l-r0r0{3{3p6p6 9 9T;T;==p@p@>b>..҅΅@@OO++}}ʑǑǤ¤¸ww%%kkzzѰٰppbb,,TTNN߿&&CCzznnkk !!,,88gCgCJJ#M#MKKNHNHEEAAV=V=8833Y/Y/++))/(/(%%_#_# cc {{ 660044LL؀Ӏ::;;((QQ>>۰۰>>hhŅ]]UU[[[[]]AANN++h h ]]jj " "##w%w%''**,,..00336677h7h766g5g533110000u1u1222244G7G788::@?@?EEvHvHHHGGFFEEBB/@/@<<886655n5n5_4_4x2x2/0/0--~*~*''W#W#  66 aa??((__77,,77ǔƔ;;šá$$ª BBӭӭخخ66||ڭڭuuఋFF޺޺[[IIIJƲƻȻʐ̐MMΔДZZuuCC||xxPPnnE E DD**55##""&&**,,..;2;244h6h6S8S8::<<^>^>??AAoCoCDDEEFF@H@HIIEKEKMMPPTRTRRRTTXXZZZZYYXXVVTT9S9SQQOOMM@K@KIIHHJFJF#D#DdAdA&>&>::$7$733..))/%/% bb&& j j hhIIvv##KK ޤ؊ӊEEβϲrr͏ˏȓē##99ff11xxɿɿ¸Ÿ%%͎̎nnɀƀ~~!!цՆww..<<ܥݥ<<--7 7 OO&&55,@,@REREHHJJiJiJHHpCpCl=l=P7P7J2J2S.S.n*n*&&E$E$$$$($(,,010144!6!633V.V.['['!!''  ppiiVV ^^//00JJ\\;;uuqqwwXXii{{{{99QQ""YYe e kk66!!Q'Q'..r8r81D1D]K]KHHCCCCBB>>>>>B>BxDxD%F%FGGGGFF E EAA<<88E4E4//S)S)""rr++z z 44 QQxxvv..ŧ<> llzz;; " "!%!%n+n+33::RBRBgGgG"H"H'E'EV@V@::44..))&&&&v(v(,,2121H7H7X=X=AAwBwBG@G@G>UU<<ٿٿIIjj̀ЀЦӦqq**EEP P W W ,,PP88 # #d'd'\+\+.. 1 1q2q222>3>34477`<`#>#RRii qqUUff22 y y B B XXII  KKccLLC C i i \\{{cc88@@//MM ʱα΃Ӄӻػةީ??nnFFPP]]HH;;xxVVWWWWvvHH  ``@@CC@@   v v ,,֊Ҋwwҿտժڪww""22##JJt t ,,00**aagg!!$$d+d+33}<}>++UUo o cc'%'%i+i+_3_3==GG"P"PVVmZmZZZfYfYVVQQLLJEJEg>g>88,5,5e2e21010--p+p+X)X)e(e((())**.*.*1(1(%%""'!'!!!l$l$ ' 'I(I(Y'Y'($($ gg !! <>߮ڮ88׹Թҹѹ9911bbѽѽ88ĹĹ}}xxMM\\hhæƦƩɩɔ˔00]],,͖ΖRR__YY55&&''~~= = ..DD""&&!!l$l$''))9,9,U.U.0022%5%577::.>.>@A@AYDYDGGKKLLLLLL0K0K`J`JIIII`I`IhIhIIIIIIIGGEEDD:B:B4?4?;;D8D84411..++(([&[&q#q#66GG##  ffWWwwffٶԶϭ˭22ƓǓ<<ȗǗoo˿˿66VVQQӪӪΪΪ||ddppƔȔ ʘ̘̠ϠϢѢҡѡzz΋͋͹͹͜Μ ҳֳֽڽڒޒވ ;;33& & 7 7 WW44##''++..0011e2e2s3s3446699<>??AAAAAA@@>>;;h8h844-1-1..--,,,,--2/2/`1`13344p4p43322M0M0--((s$s$ TTxx##8 8 uubb77؄ՄՎӎӕҕѻͻͦɦƀŀffFF{{&&ǫǫ``nn񣧥kk˩˩nn77jjΥѥԶնՈ׈YYff::% % OOVVvvOO66 ""%%**..22y5y56644z1z1++\%\%##dd!! # ###%%((**++m,m,----p0p0336688::X;X;::8866s4s422//,,))''c%c%""I I ooMMhh22PP۵ۙә44jj֍܍܊nnnnff22ܡСЪƪēׄ<$>$uuff33CC33II  ss55    ``   YYDD88uuMM**TTޓݓxxJJݯܯrrJJ@@%%өЩ66!!66**mm``llAA99jjǭŭśě __༞طط¸¸ѿѿeekkXXɥ̥==Ӆօօمvv55~~< > LLQQII  ??F F 11'' **@@iiCCqq))YYWWss2 2 ccGGLLH"H"%'%'K,K,A1A1P5P5779988|7|755(4(4j3j3334444f4f433220000,,C)C)]%]%!!zzJ J ..??ߜۜ<<&&Ն҆::kk˷̷͎̜̎͜ˇˇˤʤʳɳ++mm__ VVEEğßƋɋqq̏ϏHHӠ֠ւقrr99iiuuBBOO. . ""Y&Y&))Y-Y-004499c@c@HHQQYVYVVV@W@WWWUUSShRhRSQSQPP1O1OMMJJGGDD|A|AJ>J>;;9977553300,,'('(##11;;  33   ||5599ZZ{{܃ڃ33UUWW++̸̸SSAA{{ŏȏ˼ϼωӉ cckkllJ J UU``!!!!%%((((2(2(''((**--003377<<@@DDHHLLNNOOuNuNMMFLFLIIEEAA==;:;:776677s7s7k7k777l6l64411..++J(J($$FFMM  ^^tt??,,vvxxڒ֒SSllqqAAYY88oo77   ii DDFF< >   ccYYhh\\FF PPpp߇FFll99>>KK̕ʕFF''AA˽˽ѷѷyy== ŲŲ^^޶޶//Ѧצ׾ܾooYY}}||\ \ > > ddRR##''**,,..Q.Q.D/D/11223344556699>>pBpB,F,F_I_ILLOOPPwOwObNbNLLJJ@H@HEEBB\>\>::6611T-T-(($$ggzz4 4 ww33oo33**;;ԧϧǸø''!!踇&&__hh>>gg׿׿yyYYɑ̑ϲӲss**PP^^33++ ssj"j"**D5D5@@HHIIJJrNrNPPDODOOOPP N N L LgJgJGGBB==P8P8X4X42211A0A0S/S/..<-<-j*j*J&J&!!   YYvvHHoo܂^^Ռ͌ÿÿEEȼȼ⿷÷íǭvvʷʷ ɾƾƓē--Ύ//¤++Ǩʨʒ͒zzψшgg֫٫kk{{11tt UU]]SSF#F#&& ) )++,,//22B5B566778899R:R:::::':':5858s5s55353 2 211K3K35599==SASAFDFDHEHEDDBBY?Y?#;#;55//**%%!!OOccXX55 .#.#0$0$##n n CC99y y NN //ll``""rr88QQ,,BBSS}} ˜ȜHH""ZZ%%ğşŪǪBB""//ޙޙޢܢܺںٙڙڜۜ݌ߌAAYYIIssQQ AAXXߚߍߍ߹߹GGߑޑbbYYyy>>..VV..##  ~~pp  ZZ  QQ;;uu33T T ppO#O#%%''&&%%W$W$""!! z!z!""##Q$Q$Z#Z#g!g!33 ) ) 7 7 **55..))hh88<<XXffG G ##@@!!xx22ll""((VV$$> > 2#2#((<*<*N*N*))((((=%=%V!V!__ ]]44++ggcc??xxEE**ޥ00nn%%ԍЍ@@͞ɞEE~~^^ɏϏϒՒPP   L L AARRp p vvPP%%&&66ږږUUGGܤۤ۝ٝnnrrJJeeYY&&""ee@@ww VVj j J J ``llDDww""&&j+j+0055s:s:==@@"C"CDDCCmAmA}=}=8811**$$!!!!##&&**8.8. 0 0;/;/U,U,(($$ //** c c \\~~66  l l xx^^BB11 kk 55gg||FF֤ۤGG55KK``ww FFϾϾϟПШѨщӉ66**PP܇߇ߝ&&uuLLVVEEj j L L %%++1177;;==>> ? ?????@@eBeBEEHH@M@MSQSQSSgTgTRROOLLHHDD:A:A==::8866.3.300..,,))&&## 66@@== hh&&UUwwnnVVllݐِӫͫǐֺֺ66ttʵʵγγZZ88CC綼MMiiuurr~~݆VVHHMM  ++##!'!'J*J*L,L,4-4-`.`.A0A011F2F2d2d2K2K222L4L46688<>yy]][[UUBBEEaa..` ` @ @ KKHH}}b b }}PPCCJJB B SS("("h%h%&&&&'&'& & &O%O%##8"8";;tt\\LL Z Z DD>> ooTT`` ; ; xxJJOO LLkk QQ?? 7711//..44   ++- - uuxx1133<<KKrr \\;;sszzppww44&&1155||MM\\FF##99YYެܬggjjղԲBBӹҹҏҏ77ҡѡ>>``ffFF̡ʡʾȾUUppƋʋ@@**Ԛؚ[[UU}}ޅjjeeYYvvߩddaa< < ,, $$))<,<,c.c.//00x1x1 2 2110000L0L0g1g12244b6b677,9,9+;+;e=e=y?y?AACCEE&G&GsHsHIIHHFFDDOBOB@@{?{?>>#?#?%?%?Q>Q>====h=h=<>VV IIOOww77,,aa^^XX%%6655xxtttt66ݩܩYYoo܎ݎޏߏ߉,,aa??7788##II xx jj  :&:&++=/=///..,,))##99 &&yy]]@@vv RR BBTTee3322 NNUUXX4 4 ` ` MMvv,,ssRR$$**(/(/1133o4o4-4-4\3\3k2k2)1)1//--**C'C' # #%% ddWWvvMMLLAA--,,}}רӨӯϯPPϖі\\YY""&&%% NNFFww LLPP""''))**++++++-,-,++++))((")")s*s*++--// 0 0E.E.++/)/)%%Y"Y"GG CCccJJLL;;XX));;MM``oo؎َYYYYCC ttSS}} }}NN--XXQ"Q"m$m$%%H&H&&&''''L&L&N#N#77 wwLL==||33kk< < ``DD33cc ccllbbppܥܥݕݕ11ݺۺ;;99wwъ֊ۘ ##uu##qq44g g 44 ''++?-?-3,3,))k&k&""\\  ppT T ( ( ,,%%88ss''22vvݝ؝سԳ88//ЅЅZZҠԠWWIIۉ߉ߍmmQQqq''''__   ZZNNFF""f&f&**v.v.11C4C4554444M4M444557799S;S;w>.. 2 2 ''mmJJkk88PP܌܌۱ܱHH`` mm}}..WWxxNNrrMM$$yy  --""!!##B&B&V)V),,00447799[;[;;;::U:U:x:x:99_9_9::L;L; < <<<<>vvrrGGԷзд̴((ZZ77&&nnQQĐŐ55ƺź}}EECCxxii**GGBB44!!ʹʹMMss̜͜::>>WWbbww""00NNFFFFss [[##((,,..//`/`/c.c.,,f*f*o'o'c%c%g%g%&&o(o( * *O+O+c,c,..//00J1J1U2U2223322<1<1//..3-3-**((F&F&""PP%%CCDD 22DD||<<נ֢֠עHH܏ޏoo__tt11NN$$ުڪ55iiccDDqq55@@DDՄׄ٢ڢ]]::<+>a@a@AAN@N@k>k>+;+; 7 7226.6.))j&j&##_!_!gg00@@XX    hh//VVXXިۨۮٮٳ׳דՓ||ӞО33++__gg󲸮gg$$//~~__κκ黫66QQ^^3366\\ssГӓYY11((cc O O ll}}gg~~ ##`&`&((**,,//11 4 46677U8U87766(5(5221100p/p/G.G.,,,,k-k-..--+-+-,,{,{,,,,,D*D*&&##]]OOEE  Y Y oo22 zz55ߗߗ}}HHPPFF&&((< > 88 ssMM88RR{{FFRR* * zz\\==qq  ==ݛޛaa66==EE߶޶PPGG//zz--oo??))SS""HH3388vv::33@@!!gg[ [ C C ))CCRR}}ll``WW rr!!$%$%Z(Z())#*#*i)i)''%%+"+"##k!k!G#G#_%_% ' ''' ' '[%[%"">>5 5 44OOnn::++<<FF@@$$aa&&""DD݆ݪڪڕוӔД ̉̉ ϦѦXXSSDDӮѮББEEqqӟ֟``}}hhKKDD<<++99 PPii4400..((99##qqmm LL##k&k&P'P'I(I())d*d*U*U***j+j+2,2,++.+.+ + +++;*;*h)h)))))(( ( (((8)8)))**,,--..,,D+D+))''%%<$<$"" ` ` *!*! 66~ ~ ggFF$$BBZZ..AAvvRREEaadd++((oo""? ? ii!!' ' ))""   a a // ^ ^ d d U U 0 0 VV``  \\<<aa""LLܫܠ٠٩֩44ҪѪccԨ֨֋ڋ55TT@@NN88ޕߕbb??;;RRjj;;ii 11  ^^]]AA !!##%$%$$$o$o$"$"$$$&&j'j'((**K,K,-- / /////E/E/=.=.----I-I-++!*!*((''&&&&$$##z"z"d!d!`!`!4"4"####$$####!!dd``     dd))@@ ??NN..""\\iiJJPPiiՇӇӾо{{˟ȟ ŭ++ǹǹlljj׻׻VVΞО[[ѢѢ55gg((ssDD66ffxxzzww%%55mmss( (   n n n n ]]}} ^^K K &&11M M >>Y Y hh::  ffVV__jj++~~YY  ^^~~44eemmFF   P P cc2277==PP""cchh {{((bbUUZZ~~DD--^^  ]],, SSppSS^^==~~ss??cc}}ccKKmmnn  LLSS F F xxggqqFF~~aa##``ee  %%ll77AA ggqqJJ a a >>>> ss ww>>99II99FFhh55LLIIXX88 aa99..~~HH L L 9 9     cc ggrrPPDDZZ::   C C ;;<>jjqq ::hhEE__EEKK1144}}ߧ ..هׇ׆ֆ%%&& ̧ɧWWCCÝʾʾ))̾̾]]3388 »»­í×ŗŋȋȳ˳˯ίee//֎؎VV܃ރ<<NNUUmm $$||%%##[&[&Y)Y)*,*,m.m.60601122"4"45577777766u5u5?4?42200..----j-j-..q0q01133p6p68877664411--'*'*%% YY ``JJ!!IIQQ66(())``}}ޮLL%%ؠ֠00|| ՘֘بۨ~~1166ZZ__jjyyGG""..hh:: ZZ  }}44cc//RRccDD00@@dd   ^ ^ 1 1 &&xx@@VVٜۜնԶ ӸԸԣգ]]TT77؎َ&&UUޢߢߤߤߏߏ%%VV]]\\ܤޤގ((ff>>gg 99wwv v H H p p PP8888!!EE D#D#%%))g,g, / /224455=5=533W2W200//>cc ..bbQQ""%%))M-M-00X3X344U5U5 6 666;7;7+8+899W;W;!>UUCC \ \ & & VVTTss++NN tt==//==::AAaallwwNNGGDD\\LLee //%%FFyyYY--pp,,??NN''3 3 SSWW^^kkhh66DD  iiZZeeLLUU55 !!)")"l"l"!!$"$"""""/"/"!!!!00KK W W Y Y     5 5 A A ' '   __sssseeEE 11vvrrxxPP ڐؐoo..??vvߟ))QQttBBzz EEbbffFFYY""kk!!CCKK88tt88{{??  CC{{MM ii33;;?? **ޜ ܍ލސllyy""##%%qqZ Z ``ss    NN33--9 9 ,,55DD__ g g F F 99WWuu;;^^ .. vv&&++\\QQ::PP~~)))) 55^^] ] 11||  <<~~>>  88++%%7 7   ' ' R R p p   NNKK||,,--}}SS33ggBBrrvv##&&LLOO// jj$$~~;;LLCCEEHHs s   t t   K K P P   ll:: % % OOddjjRR[[ppaak k W W JJiiccq q   %%xxqqmm;;_ _ 4 4 ( ( H H " " RR 9 9 N N 22qqaaCCkk<<{{g g Q Q   99eeuu''FFqq( ( OO**77 T T UUX X 77  UU77qqBB FFNNTTgg TT66HH''  44>>eevv""ZZBB<> $ $ / / z z   22oo   x x hhLL..~~CC88&&..VVeeuu55}}ZZ{{{{::@@//ppCCtt88dd ~~LL==&& --ZZNNRR>> rrhhSS``NNAA11QQ0044cc[[==NN . . Z Z   ) )   gg"" Y Y ; ; 66^^^^!! # #*#*#"!"!ttkk::dd~~b b 55==&&WW$$ll??II``;;9955xx11CC,,..UUaa  HHSSBBllHH**;;||ttRRtt//77> > : : A A NNhhaaAAttuu;;..^^..DDyyDD77kk66hhww} } x x O O w w ||  ssN N zzhh[[wwaaii - - _ _ F F % % [ [ B B _ _ 7 7 B B - - UU11GG<<     1 1 8855yyaa= =   zz""11)) ""ZZMM66   a a @ @ __HHCCGGߡݡ<<,,ځف٦צէէէԧ>>YY֎֎֩֩֗֗BBJJր׀eeJJێݎcc77DD[[ eeFF\\OOff C C 33>>LLddff ##$$&&((**,,p-p---s.s.//00Q1Q111v2v2 3 333G2G211//].].--++S*S*((&&%%d$d$##a!a!''l l --\\UUee__ttUUbbބۄۋ؋؄ՄչҹЬάIIͱ̱̊̊]]̷̷##``bb44ڑۑۚܚ__44~~mmVV[[PPJJUUWWZZ VV NNppEE22rrxxNN))xx$$XX**  vv00;;lltt   ""++ff# # ]]AAww..99>>;;TTSSLLhh JJjj;;mm44cc55,,JJLLLL}}VV11YYWWSS__eegg""]]]]  YYxx**IIRR~~""||tt>>zz''""qqKK""M M qqVV$$VVYY w!w!""##$$%%%%`%`%%%%%$$2$2$9$9$##""!!z z QQJ J qq++""LLTTZZ00TT++==aa22aa[[hh]]wwrr bb{{wwNN]]uuTT{{ ||VV]][[yyqq33MMHH XX jj,,LLh h 99UUxxiivvbb ##&&Y(Y(p*p*,,,,--,,y+y+))''%%O#O#!! E E bbXXooKK     ((jjSSppttyyXX!!tt99((99ii77||::ffHHHHzzAA~~{{22{{ss yyNNFFmm>>  f f + + w w ]]BB&&AA??@@++``) ) { { ee--""DDJJWW99  e e D D ==HH66TT22# # 44NN RR!!//OO66uu $$nn22{{@@::[[QQ//ee!!AA++__ ``hhUUkkAAhh%% &&jj7722TT\\ - - = = & & x x ;;EEVV33ee~~]] ttFF00 JJ!!PPXX-- ``AABB//ssvvrrSSBB  GGyy8 8 WW  KK%%llNN00JJ 99 xx00;;//xx&&RR;;22bbEEbb" " ddCCaaiiCC{{PPUU))cc''aaXXAAkk00ccSS55 55::cc88//   uu::hh''^^&&$$kkrr!!44 l l PPG G wwww++##iiGGbb[[bbWWddVV<<66zzOOll!! VV##QQߡݡߌvvuu{{zz55~~``++ssBB  n n 55  ii77  G"G"##%%%%$$##7"7"!!a a P P W!W!""##,$,$$$}$}$"$"$###### " "f f ((\\--    OO??DD11==((jj>>nn~~ݬllҢТ::ww֗חXX**UUԵӵҀҀbbٹڹYYޮDD::ll##HHUUii zzzzUUQQ K K ? ? bb$$!!{{ssm!m!##$$$$}#}#""""S S uuii  VV$$""## MM((ppXXdd PPPP..$$YY]]qqQQrr))GG//\\hh4433gg((WW  --[[t t -- y y ]]nnZZ22h h @@||gg- - CC..jjuu&&s s k k Q Q JJ!!hh++UUPP88NNyy&&vv  qq4 4 DD V V l l $$__  B B --6655^^--rrDD''iiHHZZ | | aaTT@@ggccgghh00CCXXMMss:: ''ww33KKzz11EEbb$$DDVVooSSii||llSS-- ((hh22ss??;;uuVVpp77AA''cc  ddtt::[[%%HH::44NNii , , vv++ B B } }  gg   9 9 Z Z   oomm]]ss33FFee55KKWW88??22ffuuXX??]]ssUU////jjXX__LL''aa**~~ ggpp @@bb::SS**``CC00  &&9 9 11EEJJppuuss  >>ii??__OO,,__JJ   d d ww  cc..qq DDQQGG``++;;DD9944  ss  yycc00EEPP''ee]]<<,,XX33[[AA PP[[OOtt66gghh   AAqqFFi i OO++  hh[[D D ff ((||ssbb__11'' v v   | | ))00 f f MMVVggCCSS%%::CC 11xx oo~~<<22$$llzznn88SS33bbGGh h } } < < UU^^bb!!__UUF F ""$$$$##"" ttcc    &&PPMMllss ''44%% AAffJJqqZZFF ߀ހީݩ** ڹڹNN""ܛݛݪުllxx##~~RRRR --xxzzGG  YY^^MM))00++P P o o g g w w Z Z % % ( ( hhRRuu""ssJJll__LLtt@@99::YY TTbb, , u u UU++jjmm__00ii,,HHffffff`` bbvv00HH>>yyOO))UU^^ll KK&&::VVOOQQ55ZZmmnnZZaa--NNP P   } }     z z 1 1 < < 9966' ' 8 8 PPOOR R S S ;;''O O ZZ>>  ;;\\    b b B B F F   [[jjVV HHddOO[[\\XXPP66GGXXsseeooffjjxx__``\\--55gg<<pp``HHDD..   ) )  X X DD[[  M M 66 ||<<''**\\{{aa@@FF&&GGNN[[XXYY??gg{{oo[[DDVVEEGG = = . . " "     ^ ^ ^ ^ X X ddii66dd""``OOpp55||++EEccvv **\\((vv]]&&PP   mmssrr]]<<^ ^ SS));;::VV^ ^ BB[[ssYY$$ss WWddzz||KK)) PPnnRRHH ==^^  [ [ < < YY{{__[[dd;;KK yy}}??ccF F O O   hhmm~~ gg''\\.... cc((ttlluu?? NN__ 33WW==bbwwww00rrttllYYRRZZvvWWff&&..^^}}::dd   } } >>nnbbffJJWW::ee||//VV g g   t t | | EE  eeHH>>TTee  VV  __^^ 77AA**PPdd..dd}}ee22WW55mm``''[[ 33NNuu::PPww`` uuMM{{iiEE   + +  __~~z z ZZCC**..== X X ? ? ))''ppHHTT<<??VVffOO]]##tt0000\\ggTT11SSBBWW++WWzz66yy??ttCC  pp>>yy  YYqq}}   f f ' ' S S | | ____88llZZ88<<((::::XXrr==UUxx::))44QQ||TTggaa<<))++LL&&``zz. . = = TT++%%  t t n n   & & \\FF`` tt  3366II22LL((DD||TT77AA""88yyuu44||%%;;44TT55MMxx//55oonnUU r r @ @ $ $     ::  ddk k Q Q g g   * * 0077jjll11 ??YY!!QQMMzz <<gg^^[[aatt99ee/ / | | r r J J ~~QQ++CCYY>>7766++++uu66{{hh""__FFSS5522]]SSxxll  jjRRMM++''((XX))TT::33{{VV&&%%AAEETTDDDD$$||{{KK ""  ;;..))++::44''TT88$$BB  [[KKhhpp11PPRRXXrrrrhh44((..IIrrtt66wwIIjj\\--hh22ii  nnMMaa ii33vv}};; ~~AAppff--ssRR55SS>>{{**GG PPUU**ssddll++pp    kknn..HHYY ii & & & &  NN>>JJ337755||}}[[&&MM!!))qqRR66ggww99NN00II[[!!EE}}<>aa) )   j j F F K K  9 9 **D D   &&!!aa[[RR88t t + + $ $ 2255##tt$$lld d ) ) / / jjMMZZppiiJJee!!nn  66}}ggtt}}ww%%bbhhMM11||IIqqBBccYYLLuu//22%%''~~mmaaJJWW--;;bbuu | |   ((mm__EE66||[[((WW T T uudd>>**++{{hhzz` ` { {   ;;QQxxrrtt''xxllff44ii^^ssJJssff OO``bb$$hhOOUUJJdd(([[vvpp,,00++  MMYY m m c c w w j j E E M M G G SS F F G G _ _ # #   jj N N   jj_ _ 2 2 ))11vvEEccllpprr 88NN{{^^bb 11__VVgg^^99++ $$rr//,,oo..__OOii**II j j M M u u ''\\cc::TTPPFFYYxxVV  aa W W TTeekkddQQII33tt{{LLSS__yy00))PPIIww~~||aa##zz|| R R ] ] i i h h Q Q i i vvxx``;;&&^^77T T # # FFtt**ooQQ M M   ii&&EE[[  ,,IIaaRR((99iill ii##nnvv<>EE66rrEECCBBss::cc9911  ll 2 2   bb\\44;;DDLLllnn;;VVnnbbrrnnuuII XX99%%77YYtt``]]UUmmjj""vv~~zzEE??CC##UU!!AAvv  %%DD$$** dd}}hhBB--GG~~ rrVV99hhnn00pp ((ii..&&CC(())**xx  bbZZwwff==88>>YY::zzxx[[EE""$$ooWW 11xx  oo  DDKK]]dd[[CCQQrrSS22>>ddPPGG44UU))''""==??nnzzWW88TT{{__22uu77??%%"" OO));;++<<ll__  $$TTnn??aaXXi i s s o o   66  //uu   o o   i i YY__xxssxxJJ**>>FF// zz..$$MMXXaaUUbb;;GGCCYY::CCQQeeiillXXEE??TT??55yyHHnn~~@@\\JJ::55ss@@EE||..$$CCddQQbb ))SSxx ZZeebbDDAATTRR-- @ @ > > X X A A N N E E O O G G _ _ z z   ! ! } } _ _ wwllgg!!**!!cc&&iiyykk zz""lloovv//qqggEEPP ))%%IIII^^ ,,YY]]ii``UU``IIuuggBBSSSSppLLQQ77uuAA""2 2   J J : : # # ZZV V   N N H H S S K K u u   ] ] y y   %%  66\\JJ??YYOOII``OOZZTTyynn))####$$""EEDDTTUU$$44PP::]]  ||''BBVV<<,,MM}}  yymmnn??**ggffkkMM22$$))SS  jjffOO!!UU qq''AAAACCTT<<<<::xxcc66zznn@@jjWWhhtt jjVVjj``EEOO 88ff==~~ &&CCAAkkrr\\{{## h h : : q q   @ @ D D { { 7 7 //MMKK==``""33  \\CC&&DDxxssyyllxx @@00CCGGaaaaFF66[[##&&##iiIIjj''TTff__3322DDIICCSSYYppCC##qqOO99??EE**99??    FFkk**__ @@ qq{{%%rrXXff||WW44ii||##rrZZ""@@  __]]<<//aa))  CC**dd``rrzz--55FF??GGll++gg%%UUPPRRRRRR\\UUgg>>{{  HHLL88  xx((**ooXXQQhh}}``MMttss;;KK77**tt&&""aaUU6633$$xx{{}}&&MM))\\22gg1144rrLL22CCSSQQttaa##JJZZ~~cc33"" 99 YY\\;;xx<>WWQQzz&&KK88XX||||ssDD{{xx&&88ffXXmmYY!!NNXX88NNxxtthhbbttzz 99XX rrccaa;;BBOO55&&// WWffNNoo==992200KK88GGAA44WWKKMM  @@==TTyy||``nnUUHHqqssllii}}**;;..^^66..ddqqaaFFmm||::55!!wwxxzzMMii;;GGee\\nn))vv !!;;$$SS~~^^hhZZGGhh::||GG44KK33NNQQMMFFNN  bbZZEE77LL..::%%7744jj[[QQMMrrHH~~))TTPP``II}}77cc99''nnIILL--BB 11ZZ<<00ooWWKK..ccVV\\yyHHII""mmaakkLL##++PP ,,mm9955HHLL99==XX//PPNNxxOOXX}}VVpp66JJnn<<EEUUCC{{  %%__mm,,DD==VVBBQQHH~~ooggEEWWddzz,,.. XX^^22JJoozzuuyy((>>jjss##VVAAcc}}33CC 00nnFF``oo55kk4488WW\\));;EE##MMssQQEE44QQrrbbaaVVKKvv  {{%% ''%%11FFAAooVV uuRR$$iiWWff ZZ??aaqq]]CC22^^AAQQ88==$$rrddJJssZZ..MM??<<--ZZ  uu88MM8888[[%%qqww****QQ"";;77\\99QQssXXHH ddss~~llnnGGuuSSdd__BB  00LLVVII::cc&&~~``  ||ss99 L L D D O O V V c c r r  & &   bb hhLLAAgg\\..ss ^^GGYY%%kk**{{ ooCC++%%88XX^^$$11``11::AA{{ttllZZ66zz  zz``**UU  QQYY>>00vv@@EEXX==AA"" __::?? ]]33ppttttGG;;__00 66!!//uu((JJmmOO>>rrMM''uuqqkk**uu&&JJss{{nnff00  TTKK??yy@@zz11LLww//66CC}}cc==))XX11JJTTNNxxLL77 vv !!ww,,RRFF))00<<XXnnKK\\))ooss||YYGG>>DD0077MM..vvzz(( ,,**//NNffee))::ccNN<>JJ&&MM--..$$ZZLLjj55  FF[[mmPP__NNPPzzBB))ff00BB66[[mm22--DD""yy~~..VV 33''CCUU&&WWBB ;;ssSSJJRRjjVVss^^nn  vvwwqquu77__33LL88jjSS}}mmKKff55((JJUUjj44++..66xxffPP\\dd66ss``''>>``##&&QQyyff]]||))vvffBB!!99jj&&  KKpp$$bbDDLL--]]QQqqssoo))1177``((eeHH ii$$??KK]]$$,,QQ2288pp"" 77XXhhtt!!EE||^^uu }}OOppqq44RRZZllwwRRDD(($$~~??,,44]]WW[[BB[[&&""%%ll~~994422oo""  55}}hhWWGG77YY77mm++zzff77??88$$II~~nn!! ppss$$ZZ<<iiII\\..^^))ss  FF]]>>NN  gg[[QQ  mm))cc>>22XXvvBBwwEEnn$$%%XXmm&&SS..PPddee 44 ::;;TTEERR55$$  ppqq<<bb~~00ZZppMM..EEBBrr  ||66TToo66zzcc!!<> ..WWttBBcc&& ll__[[yy33llTT; ;   , , C C MMKK  ww==TT""++\\<<||LLffCC QQ{{'' ||''EEooCC ppuuXX))jj<<((NN++'',,,,..zz++}}>>''[[~~GG7700oo  TT ffEEbb ##>>00))~~aaddVVff}}SSaaCCKK22uu22qqEELL22GGwwuuTT<<<<||++ddqqSS  77KKKKmmCCHH||22@@== kk VV))>> 55ttNNvvrrPPyygg;;AABB11DDQQBBtt**--    00--,,JJ11##\\''ttpp99""55__VV99ffxxMMEE((JJHH3344QQLL@@OORRCC::__ OO//WWss{{&&((iiGG~~  ]]bb55**VViizzZZpp[[''YY**;;YY22gg??}}NNppJJHH$$99XXyy  hh[[vvKKzz..11bbggJJ%%GG[[11((vv88UU44??..LLWW00__XX00 <<&&OO??ii  jj``CCFF44  FF88UU<<kk''//""  0033SS99__qqjjbb55||vvtt%%oo//IIkkooii uuNNQQ7766``JJ^^ $$ SS&&eellpp6699KKEEWWoo]]uuMM wwJJ$$mm]]MM{{((00vv==ZZ..ttRRVVFF33EEDD~~""]]nn''``vv&&**}}{{//II~~aa\\\\hhss}}oo##99KKGG66//zz))mm__JJUUIIll++~~DDss||OO11ii  ??!!oo$$vvRRccVV ##EEWW gg;;::bbooLL//++zz UU==;;ppxx33jj,,^^++&&PP,,11  ))88HHSS..llVVWW!!  55BB&&SSJJNNvv&&ffee//SSkk4444RRNN~~UU99""22rrSS""..ww}}**11qq:: LL ssBBddJJmmUU00ww,,]]>> MM{{ <<55::ss vvzzBB++jj66yyMMQQ__HHMM66nn!!FFTT\\--BB]]``II__}}LL##CCSSppYY kk<>llpp}}hhxxqqWW 22AAkkpp~~??gg??PP JJll55::55aa  //HH++``mmXXWWVV||__DDbbCC4444UU~~//$$wwPPEE ;;UUxx::TTVVeeLLGG>>ZZ||00__,,ooMMOOnnyy==DD<<FF''::MM,,ppnn44JJMMee@@JJ{{hhEE  &&zzmm%%}}'' !!mm{{\\}}ccgg##  ffBB!!qq]]gg((..22wwddAAkk``nnPP44eeAAkkNNMM~~00 mmZZ--yy..))33**00++jjHH7711<<oouuEEee      }}  @@RR..88EESSuuvv  IIjj``55gg##__88UU3388rr77FFwwhh>>??TTpp||LL%%..**((%%))HH44pp//}}qqvvvv}}  %%::~~zz~~  gg==VVee$$bb  TTkkJJ((RR55bb!!gg33JJKK//00##AAEE66..ee{{SS]]FF OO22AAjj<<>>BB((>>((NN<<HH))==UUbb77tt[[xx..xxaazz33zz..VVPPii))::;;]]%% 22NN@@""UUii++MM~~kk%%--<<11}}66EE++22WW$$<<jj77&&PPWWDDAAcc--..eeUU**ggOOAA..ggccRR&&yy""VVcc??gguuaa''TT77--  YY22TTZZooRRqqss,,]]oo>>==LLvv AArr..==$$// SSBB qqRR11WWllTT||zzrr..II__CCoo11zzKK  ]]{{LLTT))  ''  ##''||vvZZZZBBWW3366\\zz..,,IIrrYYNN aaZZWW@@;;CC##ffNNKKmm--vvUU::yy++<<DDhhPPdd""ddSS nn99BB++EE hhXX==~~BB ^^||}}~~{{$$  BB--RRpp&&$$''--IIZZss77++::88zz44EEwwtt@@&&&&ffSSbbqqNNuu!!VV44<<33..pp  BB  //%%;;rr//**VV!!vv++ttssppKK((--XX==]]ggzzTTZZ))ddppTTkk ^^++eeFF;;HHee DDTT66  ZZOO::}}ccSS 88;;rr MM,,II--``vv;;RR77{{dd33UU@@<<$$TTrr}}xx<<11XXoo  ww||{{==nn''mmVV  ::AA++^^77JJ^^hh..--BBGG66__bb ^^hh55jj\\''WW@@cc^^//ii22YY``771199==%%88KKWW;;ss66PP  ggiimm3366,,CC  kkvvxxxxPPOO88!!77jjggTTQQ%%TT55QQGGggAA//ccTT==  VVSSmm{{yy11    ^^??__  OO55yy**yyff11//RRIIvv11ttpp HHhhAAqq&&mm ||66WWDDmmqqCCJJ{{,,hh22//TThhcc77??DDmmnnGG;;++FFPPyy**ee==BBbzflag-2.4.2+ds1/data/fire.wav000066400000000000000000002542341200563112200160260ustar00rootroot00000000000000RIFFXWAVEfmt "VXdatapXyyMM^^\\AA"" ##pp  LLee``>> ..__zzjj 55XX;;VV \\  ҧ||EEgg%%vvX X ** 11ٜ%%!L!L((EE cc 11SSrrēٓ~~ӯ~~||ǐ d3d3{{>>// ff66cczz--aaъ55D"D";;SSxx00>F>F55JJ}}yy-*-*  %%TT))ZZ55k6k6? ? ww""Y(Y(,,pp!!33==VV ,,##k+k+ &&  33ZZn n !!O(O(   JJ))O"O"n n W*W*mm?? uu| | 44 AAR"R"A.A.--vv22^^ii~ ~  ffG G [[ dd__<>rrޙޙވވNN;;XX##XXssڵٵٌߌFFQQ[[&&ޠޠ^^__ߵߵDDzzJJzz++44{{77[[55nn11 4466||HHXXzz,,nnmm\[QMs$ \TwlQuma9 ouCOzF).jnVXiRZ^xMuU4&dO'5q ()J"C#43Z%"! !~"_"3# '!$U9!  %(,O  2R z}/* J1{YF U!U%\ݱtKwdYTѳ/C)QTS͵L!KE8jM,D gNP@ڔ?݊Hx0ޛQn݊b ݐݐ߸ݸh1ާJވFD D obl ޡM'Om]dU{2!Iݒ{P^W }>Ƣ-a;S#1G ƴL\3lQSYPL⣦/R4߀5 u{4߿#1)B (*P\XP8, 7'o'?hGi(.+(\)P+ *S: J$F3 RCS*5- 46MU(\88I&+%*)<:'.#&G# A"*;%$"""#B$s!"&8#,$%NhE)S>J&7I"@##x]!4)$#,a"9!<" !!k!3"'!!!A! n$D!k%! h  g s!e w"i F )   8  i $ee]3#3 GmkD! 'K hN FXW B!"wq$hH0G+5(CmE|ȯwp{q4><9Y E 5֢؛ږ.bٛiڨr=*`!j=3Imع"%vX* )T`ڙ-ڀE"Lڱ=3 [H<̘5]-,ۓۀ?ۗWܹ7ݎ0#۝ݽbd ܦU6ަh޽ܕN@ݾ"S+q?$,0kݳN40xz$9e(8"4"J$8 ݮ"#q ݠ"&# ݅"v") Q"y!: l""\W! M! ޹!G ފ! Z!F2 2 w߯!!wߜ 2ߧ!i ;"BUߒ#LV&K3 ,o1?#ޱQ.rc޺Н$Ϸގ),B OmBtE #\#@߻!'A"\oܣ - `1 r%'wM\2Ӄw ^lV=e aB@Y) ?8A ey{ޥ Nx^~Z/)>91N/*\0w*1  (]>O9JT["ZE(Puw#}"?%[0ˬT ^ضΨի%x^r܋ڌ05ۺ^#M۸HߋF+nAّۨlI4plڡ"$_)#"y!f!-: ʴ!M !0n 6!'71ٻ%+ :TNHJ E/L3>Jl9M &$/`ڭ ֢$ #6n8fcF6$7TR ='Y + 4Ƀ G34/@C(ԭxLJכ<عpR݃\l# d'70J*wӟt1.ޯXR=xܺSZRz)2&ߡ!U A#!O8. |T915AS"-S&E3kw3|G}r,aAbX WPq: GOp>4?G@k"[ui1"[;}"O% Tʕ#J 9.X_$-(Q#H%0#fC2Xϳ1!U+2# w 1  P{-ߑ߄C#n~5Yf6- Wu4neN5]^ii/4Q_ %@ [%Av#D , Q` %'cH#"R^9 cqwA`;CN"y]2׮'4@*0ߘFݚ-|HChk+,(Bߍ0mn&"}߼$&ާT;'~"T(7N5)&T+.V1mݥrHI2 19 D%{2m (m!C+'&!"X=,!3*%) Cj[ F_ ӵ0[݇4ڏVX#2ծ8,$4 PM};je,`(M Kڟ 2  ۦگޠ<'6E#ۓ3 (ݟ w?#UW3%PO;Į^uڒQoc`W֧ޒ:ޠ&Py0 ̌kɟX}ߣerSnyuݗүΪhzNnY+'֜ع Ag r0(q ho ,b#- a.D|f>F"#+V= B;%&<$B#@)$">* G'q' 'H"=2;)%-z  ,' &F q##Y*k ##Dm#","6/d #f 9-)#nw !"'-G$c$#S-Q$g q #.Y#-z v$)D-H{+%!A)]N%; t!$%i=~&60}<z q', Lm"SLs[9ҫBܝ.Γ%4|5u! ߽ZީGߢ߄۰޼rI` ߍ3lRWd݆Onc"u$٘ޭF1߾ߋW޴Dcy_݆6 | #ޘѹՈݔޤږ?2݀ތg٤mMݬ +P eH5(ޓ-t F<=Q' +U%<(5x,kە#] 1$F( I .TL o k !X 2v 5$!  _ ydn  .^ jQ H #k" o B` UU +M+1~C؀׎l giXг2Pc )c,Mi^ٺA9 < E+wiyzZ1'Pd^XQmuVx%&L1!Yr @o.߆"F$[u`4)$#Ɋ ;(!TI!#1C.looD4!y/X,'(יG|1fpIR]k {WR= Iq '$%+"Fy L+ k cD Oт4y eU]^ mRFLȖRE2 f6z&x :-s'ZS݆@RЁ݈%:Ep)k%|*. U`b >6+.b=#S1+%(3 )'|ؙ4oR oBKiۅ 'h@ ?\c!3|t,%~' '>%>Z{(ϐM$90V(k$F53;l0H_\{IM6}6 *c U 8t? -Kы7` 1n%m3-.I$;0=w;9ef"f 4Xl-T1W_0ccKbx7%; / d)o{ ױ?1i< &)]9{ 13Z^;&y1^%# ! 0(`K 5Y˻2'A s\Qk V&0$.^q޼%K_$8 P*G\)c( ܘ!'l3}>)Hs z$TMab;&C^' s'Ժifxd _Ko (vo f,!yw:$"?mj!J "c|\0%D)"/ H(M/.%M"# "Ny;"!_xu (QH]|I%/ߏxU"b<  `f!66-A2(%%~@3-+3ߙ?.-"ĉѱ(;GU.3iex͓`T%~Mif͇ Ƞ@!K"Fgav *F r/Qk *;  )5) E- Ҕ "r@k֥rmf )# %.Ջ]qUޑJx1U kEÀ͍VCܞgD`: -}(aBfO/fLԊi ܊ @(H?u. x8Y}.kV7T7!|Y)&'  eՉ&)5# ="7&I'/&M ^"1,-|H24%mTrQ) l"&p0''-e!7#IY& ##A&) $8"M,.$=&.&## "K$N$H#f!$a# !E#$@### #^#"m#"m:"#!6@!>!-GU)G,$ |H O͉ܝ,4`vA؂$ԮB܄":Uֈ:$[?)?pHD emasִ"( ޤ 3|A0ɑ%m$Pnq!E*}"6lЭF Q4 + Lh}n` G 5|4 #У|$: \-,3ݵ.݅M 6!$.a*ةޠ ?l!` 2 T$ {) yr7-) d# \s ^d!."H$ ;86 y|;!Nkt"4zj7Nx0")[X's!qj'B&^"& %"}&k|%" &E%٢"% +%N"8z%%N!K%[ $Z %$u'fy}t q Cy5 ,!y\~Vi ۢ#1t 0F|tqCd߿Bj("{)97cOBm0-1)^5~au9 & gZo"I^!΀3Hok! )18/ ٷ^ m QS51 \ '$&"!v!T!@/"7 1"1!w!o! /E!k!2 & m2J! q  U!_e h!0! /\!^^!DF! 6G.{7'=33 9uD)p. DUNFyO ZRڸ F; N t+nok ߷  ; (` 2! Kb!=aXT`(;T Ç&,oD m+Yr C|n7pc={]kF70 !r ` 9%3'  r I6&$y%T!$&#!! SY K k`?. }!<-0 o'*z:l PL>\  0Q"cD}#s a)]^Z (n"I 1E  *P(uV=$6fr<w ޫ.~~߇7ʽH&:L'cp `p4W?t^GVARQCyHz/Xi" &n&.aON=nC >_[Q՟ ?,b7e$xs8a ,%&6DU.Q+! =09 LH"! 9Pz 0* r   &CwnSygoSWPi{#֓ ՝ ߑ iI.Fs NbYir'#C?Cշ׭u*z+c?)}'qb F%y%]f5Q{#A-Ap zk>. r$ wT*$ RFkw:'$OJޮ Cv5hU@#75&&8#hy#-" Qz 4 ; "&hS&* <%S ~ x t eL٪ v%Yݓ6Eij w W_5ئc+yA('F1xݫ;%Qڛ M K dފswy-%,'R G ^!Ok#0c2 #w A< "{Z#9{=B|4"s)mA0"*"l+:~:\e Ve('f.m`w ( (0 U%}`*R#$!$ ~"zd+!*qb @K#Mpm@c+  (K ~և ' 60G #J Dz' +@ kAj8g@lնݷ/Yl36e[:: at_>kUz < ,^O< ;  ^{uk"  A#H)%| ?'N+&t#J~#"}"d"q"P)"E "!!!Q! IY!"" 3 g ڵ H _ D R3 ] [  !% v E ?&=F q| _ H>B `*' spF}6+~S;YH>tƖ~V E}Ԓ |M@//5ϐEɡHڪ.&#۹Pڊ۱#!kۖWۓYtt 6iF q,t\ܺ t gdD S $|!޳ߤB, mMW&[ fB LM & c#&B ($Kz#a+!/8"T 2,W$+ K t"Z` L- #B:_ e} : R E $L_  <8\ mj R)c|ݫw!Ioؙ- p %  ZҞޢ # ߯6<$ wc(BY7nնR=_0WIݒ`} ~,?fSvCl<WAC~nk'xA"Yx߹ޭ# +[ TA gi o 7x{!!'ctv )YВ >Av`Y T VN7 *; <tL),+h . an1 r| 9@ z$]!) Ph! m r-KK?߸X)FNy] q+`&HPؒ=2LE[ xg؆\fr0z"?ܘ(ަfފY@NUw93 <"ETz _ !܋3%'* #{'##e#!)}"B"!Jc"!J! "!~1!!M! ;!l !S e!  #!?@  " e$nQ.M#I$(z I _q6@/@ *WPE N.A-$)fp  :7$pS SH""UC ! A <M!(=ڮuڻ'Z3lRJۏ ܢ%P"bgE: =OQ83 *'so <7g4Cj*`H /Ck C 2 x|> ] [PBi,i K )4 Hn|tK03[;W :4 -6U2i?J(>& 2?&rI2xZHmb'`ݺ&޶k{ެދlިlQwC f5)_ ]B3g[_ ߾ Iߕr7! #ߙN3>Y B"eB >C]lysT^ K [$ 8) j{S >Yn%m "-[6kc o i ; L Vj # a ;'# .  S1Vg'A  .W84>eZT_f @5 PD Bs J YXu8SI#Y w1$?$!6.r[> 6"ED!9>"D +e D`#X6rW\vRty>IF<->I ^-jf Ӕ7} Qw?v9,HxE@gl!V0Z~2x4Yy7 #+tBoT#$N"L21,.L݉.bD&,+W(#xR#aݪ#;#t#ݦ#&#"(#8#C"<# "9o""jޥ""c"""!#=ߒzSّ۳ CuS#W[V> N_THN^ dU" Xf/ znӚIdh!7wT,\ ,>E_GvVo/< Q mjVMx M eM. m Q;ab@/yrj#n$<%]& EFUg!_їxI & UUN 1mQy*@5VQe:NGI.+@ݾWܾ߷b@hߥMޟab7߼B H&gRX"$\(P_  2u qK{ F?Fb%#N!8Kc( , ` } $l b:  W  g$]Jt*[:.lpz+@# aw.J+wZLd<:("s'9N h@ GwTzs,07ZT?!G9( 7BLf1#^ n' / Moba\N NqM;[:fZ13.S>,RK%F>W)_~]P&r6  *a e ?,y$ #T ))Y"49"P#d""#x2#t#j#""""""r"4">""""""d" !!!ޏ!e~!t!)!0J!*"' UU/)`BA]S5 ] cG}$^ |\GlO"x˅ɿD8 nqڣm-2ܔ;ۘPdۖF܀d x_~OY , ݃ `5@ݮݔ$ݶ_ ݌ݔ= $-ߤ ܛ. r, C ^ ovSEj".qF/j#g h) @t R {  >bMf &~ < \U )SH0d Rjgt[zEIpx b- }Z \ZxT;u AY:S3j5_ Es G/ :(Vn7b l9RwS"\d at ^qpD[ A8 dkO\&~51 `' $}%l:Wb-A Cd p%c#OW!.BX[/@$Q w@I5I-O 0R8 iBi*j x6hD\p(G , +QhR; tjp.f 2/  KuRxu H0t U^oD1y2US n0<3{RN ^ BK%> Fc W''O#-!7!w%!X"+^-5!ev#$#=&'%t 6 z G / I)iw E> JjqyLk  dO0#`G6  ݣzzs>Ex DM9c};){bQu  8  il  JCP,>\P:#Y f(2߼ cFPXV :/<9nݵ5Lb ݩ #N \X;x*  ]ސH!1 o1ߙ 8"AW"@ uVrLJ"Q~thRd 0Pi[ ` @. bV fB 2޽ޢ, i'$ '* I  ^ E #FZ !# + u-9 d { e# T(&#}| ~ 8Mdh xrt#g ' L V+`+%"|$+f$(# #J $#0#| #|#5# @#c X#a#<;c=P6KM _:0$ ~ޡj_ݽ Wu V9iVc)pܭcZ8. r@E;o5SG{r.-^ic0 1] Kt9 xP]f~ WHa+uA F!g~o@m* X C -D}@&  R qGG EM4lNm,r&,',e : (p%AE - ~q?^S%~e0Vr| p9  P EG_l!`6!|ՠ "Fx!m Z( T]F{0v~~!q" c#'.6'H!9C ; TWgu8E $?U]+2+^r'h /fd:x4Ha ~{n7W A[U<OysM"`#gWj)Zcq7͉qM ޡH ޜ7 waߧaUi߆ߓz ߎ !L W3Zt2hS\i cab' ^b}Y%ތtCx|5-4Tc0Ba j-\x 3xEtU#C7a ~ @a z Q kor 4  t;?D  r%wNVo~R.C=7i%n&"H\!! "(L)& % %~%%$% $ $$"<l":  <@Q /z/[ tc  " )!p!m!!m"s!^U" g"""""H""" ""Y"!n""c!o"x!p: 5.QkA < H f%~[ 6b~ ]4G:p 3=Ln* h U;7m@]%Y =l*o qԿ65eA ۵ܵ*lcܢ\ %"!"$EݡV8^a`2 E,Zea޲qE w ?J7zM$0C - @i &`} /ޤk4$Bvڎx;.܇! G ݞ 0o , G"2"T2V"UvbK(irڢj}b'Ek6g0ݫދ1#%)U'++(Y&p&z%jp&" Q(v$$I#'sH"_A$w*n-:('$UF%-O%U#$$7 #>$J$c#\$ #!'# 8$x#\"3?$" d =h  g V * ) {]/TH*_f(o<{GF  T #$%Gje[S b45h y( f  _ cF3 e- TA@M{u!aqvXw:R HjTu Z9-.Wco/xk!u:c6ya ٔP:sc1}b+y`P,# Y 4 JL#"FT w m w s *' * %?$S."Dv"! G!i8"m!L!!3!((!k!! B!D   8  B m p c C K d: & Y# H+ <IeV"!O_S P >J [u:A DN  @NsV}4?kf   +#-*H a "E&pec )dPB  #  EG5p.3#ޔ/" ds _.]޵ /|cF7*8m y 7}I/.|mK )y01 u//`MXP V   ZT4 <$  ?d eLhS_U l ! k_  P1+ zb -3J= Z{;S  )@l ][$X(#  ~  r ?m"G*] DwA Z &0GgRVR?50-߀jo"q6A;mRTހ<4pzڗڭۙnR/XpH@:l 'A64Gl Wl$J  ^* Os [ !3 99q|C]T U92`I- 7^T nH x[  m T  8n1 ] 3C ,{lF&) _fO,BY }4U `}   .? ii uqPj XU)?= P -q 7hKSipRxv,4 Y $j  g> s oyI Lh+ Mc0m  T^ {#I~ Fv* :K= J  D ? :jmM 9 {u  d7JC S07@. 9 m @ B v o 0^%=z@+= a'4 `3#Vcu j:)("vuT 1 e@Sާu(;?n Eؒ)+Ep jߛ K#'!A:#=*{r'!x"#j!X!t"!!".#!/&!LM!`aA!U!ApaTX!=_}: / R xR !80 vE92ުr۴t ^ *qWۙ ,!MSM 28~\ _<(wuߜ}U 34G :T @%i0-GXv  ' 9lcN> 1 iq[wu 8:"-"W$(&" "0#!$"b"Y^C| &M # b"?eRab y ?ST!#(Q(^x#_!_!!U @ x Z Ba 1 # D@     n><bhw?c H_jsf* 5b'zs ; ,  <& q<< < xz W d3 'm (; L 2W] _!G% gmAf- [{ _N}r. Z (S{x I1|CV^ h RD {K }UG!Gv 1rYdazXLnEk*& UXkhv%Ek6E I)= : GP  d  1!3V\b |&U] GP\oI&Z)' N MOBroa 2 D#b C%r,s=o +Vu 2~r"l \ jQ 4\ r? M" k  z  y7 y sg4`Nn-(I&T-DzX!H LC Y<I(D`U\ '  K+ui  8 s \ g =.xDo XH i62^qQw  < dC   8Ju p.  P~ j5   <Aj>J6GQ`m <-?x~XA3GOJ A-S{9c٢^קh޷+T5z|(<_4/(~{kB/On^D{L.l_ au5L[ -N"wv5IMDoJ6 L{x$)#G# DZBWe=CV 7#sM;E lG +UaTymx p/  Y I G)@ ]<A }6rq@ .sC~Q@^D3>0h  ~ 2" d@V)8 ~5*nc  _ up Fxi&n WK +  .E< W d|hAY )o t  Mk [O 2 l m 7 k hA   = )zleFd " r3 L=?kdhU[AP%z0XM/Mw&(ZM#Cw߼$|\Z5(% k/?aM{rTgL'L ܇rT8 ![ ]G }M[  Qd ' + R{ 2> *3G)  @ i `9 " ^q5sSI`/s! %J g *5nPa; 3 A ' kݗ + o( . :v SS/GJn ] e - 8l hJW, X- ;NS=B Rw:kN};);*O ?  hfhD0g>zV% &l && P R cjov 2XG) x XL8 w  G XqIaY$.*Sc}b3$LHmI J$: Z? r  X $eiu.bMUR~y l|($*|y?2(7 `QjUP*0?S H4=Pi ""p) "dQ`6.4#K,t $~d "q|i!\g 3eGi s [it6]5    _ZX  % KIl %U  $V'q8m & 9!PPM<$   hL0xGDzoS J DaG ,po 1^%FM:A = lL c [ m }(4qE#>[jj=9 1;4e{UGkg2#=BLoj^Z<W U;d"c    5  0 ym?iI  : X y ( b v = _ (OV C` XC 8  \ ^m".<MssBc UPshE k \- 2" ? $d6vz_vQ %?YBv0\|o R5'&a`=&fmMN5o)Q[MAK/: x E[?g + ;G 1 juB b/c` CO _'s8#..q, ? Im]-hR @  aH  D7 r ? 19A;Rrx1p9g+mB9~7/Cv   }< V z T ; \ gl   z = T \ q1 M w  #  9B"p>|;= J  Z- "  9d- {pQ " Wd^n4 2@e _T _i y Um`q4!^)B/ b  ,  R  2 Y dm W '8+rx[+7L ``aFN)DGPU _ w J 2 bFu{$8  3UL ~ '|1>+R>yGOr \ G) D : 3 ]C cY  <980re G{L@|cOlE.79a\AG&#.3m$0/@NQbkIxp)e}%h/;V+,`h OQ+O9(.bFHGx}4&Y1  N| s+?!X.BWyiwe   |F 9f "E/  6< L% Gy1%.7Gj% .|/f w4}YX`@zuY;-OkT2k g8 M]Z~O). " J \  3C _; 5 6 ' K -  7gm c  * 2  3H tS &  W  #H 2 2 d&c'`Q : K jX 7 :' V j @ ~C + 8 [ 4  ) yNqM;y;jo?c /u<]>HXߨH!? U Kxf*V1 Z 18#$(tqm4J\+eFMi/qm_0Xz/^W E;48\uxX=P b~$(#B0 \;o%-\OL2}B@m | < 8 ( ( q K [ K  B q K 22 x v 9d YzQ _   2 ) "  !-@ D } o @ Q{H?(kk ) tH @ *d/TY.cqO} WS%l;0> _=3 0t  & $|CQ J  aR s os 4=U7 3 | ]V[NmY0\M*-,N H}V`FZg*GCgO)  S + Ea+I EE;L84Ex&&~5k(vn[/ ; b% i   W'mDQ3p]&:>>3J:'|TUr& P)1uzgdMj2My`&l& J~tV`hjsq]i,C1.<}@xpBSrqh#c W/qxmRrVc r ,pK,.5CwQ]##q<]a R > h d IF 8 ZD  ? /i PIOYV[*^8=POj_?;Hv"Y'* X )eONNGkwc$e[~/D uAP    `oYspjv@Vn | *:+:FqcB%>_Pmo, vW|+@   4?:P1iE:aMD%;UGwh>P< e%Ezb~^ewozao zPDYDE?khc3h7~^[s`;Wln)kU9):/D`X0KCS , m  H ;DJa  WD > 9X   B  r |h , bCu  g  e kuK{)VQ '  x 3U P c e e -VrLBo-j@ / W (, ''/<uNY={ix`" "S9A}U{3iQ-vu(A}ktFj"X6Uh}qt?fW<PSq^ !VM3:>~M[K=2/Tqk]Dl%j - xMr @ iO )  %l.%'-'*CXM"][P)3SFW~MCn|9n  &  p> >mP @pjJiz"f)F=sb ?X"3=z*V) M[L0x'Fw"? A   K8lY skC  Rf 06  4 "    H  ^  M =F $ _  E W - ! ! e \ > d  v _ & 4$qY3&Ws eKK%CTuM{W|Y>-"J .H^} CkqSl_Th x +_ s  C { =@aBYIwtyq [ Dt  O ; f T!n/p 1oR3+={Izki\'Yz\L -6=o%X",XH?iI?)alu<5j.\# G +Kws4rQc*^<*UC 1 f y 'P+ 2 \ j  AEi =Y=\`t5 F ! d K9'\%93 kT#LX8 Yb&mGe5EA8%7z w]tayz-=P/\5{n_rW"sMEdvgAP2L^w 6As3mQR +%r[ r[DI NG8$?<^p@t!X:T s#2qrR|)*v% W1 =+QPsk6x|@7K yVN`S bjY J s' R> V Y  ]@  7 )2   R :s w   rh ^   m ;w}p&/DZ' :  I )  s J(  > a O4 9 ] Q  }Q4(a \W4:  y 7 De5Nv CkN2, 04#KDIdmO ? 5 9  h Z< u s o 57J ?7a5F<N<0TZ&bB^\7\9s4T /8 U{(G.1zhp:C%1.+U l|].y#f[A.HoG@j`S1 , 0 TQ ,a: 3 Z rCbn{MRg^c?fgR ;^Eg L 4<GX;XLxlC:8IjYy m|+#?wUJA "W-9Ykb4 F N^F6W5k:e&:S) , & rE  }  +)n> F x  2`  x H5OT<{   cdTXD 4& ]>.-@(X;F0SO9vJ#J':%K>I 9.LfI ~?"8* d+HbI@ KI ptWb@:T) b>  C_lfq f ;a  G t    |  r  )   4}  5&    M ])Lh>l |6k?NA^3w2U''Z C D  dsd;}JKTOrfL3pX @) = Ei vG*n-N+0mp pBK/p-HaM@\At[.P a%Z*;}O.8$8MG:s,G| V W$I1CJo(Z(2F1%R8Eo*j#Sx bIwST cbbQlk$" {8T[(~HeRj&nod.1{/&{ ;vRGa,=E<pQ n_N.By#U rr l 'RK[ft4LDwF .zIge Y L d Ys ,  -Q+@;eJ(N_F07790pCuQQ^YOB}ybt+!}D (  w} F L wkvov=irD:_^7~I-,D.3F"=GZr=h #O x  TB%O a4 \ M | U 2nd.m e o[ ik .]>k P(Bwt 9lZa (|>e )|,ic gDv %`D`,+8At{M$33sEA# gq uu=k`IG<[&kDeEv'Mr)YO2*4wvDf :>#5?]* +uY2qCycD'Jeo"uRT40.o,fK:S:Om(^~~Q8a' 9Y6Y 6rfj+@zy|"Je1?bm[oH^<{)D//?+rB-QrY8iw=Pp^GbNsmqrRx"O&G+gI9x]H<z|sbiL'%I2):G{UZ=qf~GSCk& lACR/y/L T x j="<+ *? I  j  (LQ@g4  cl y.1Mcm=A{-q TZo^tHC U  HH  xc%   BsY   e I-fe, z PxsR   Hm'VyCUtXb1rtw M& 5677O.;e}dZ#}"'Z,^\wPSv'~W\9OCF'8G+v#,+_xu; 4S# 4^ NVDPi6V@ Z B E =X-3Qu9( (   7   Ba w q )  f  G %` _ y $ j H3+ C/UwKk_g@'sJZ&f2T Z0 O )0I8itK&I AFbR4&YLemq;2sYi%P5z[ ="S[q*K4i4W*"h=NV]&Hm 11Rc7tdQ=FM7i8_5TC4'? u *)7hu K    $g*j+e> 1_J@[p{AP^R3F0Q<6 + '7yMUCuz4BEFyM"P>.K~<\,x2 t<^71S]hJ2/. g(wJ L?K{ Dv]7[a`+j o]u Jdx: #mB:V6#<[?c`5gJ(A .Nt qk N 8X *; ; h  X. U Kg8=EqbcU e |U"_D8 Oj! z  p to,~Cp):v gk`R2}pPu=26 Mn`k% q~]AYf {75)lAfD}}J  vW`>OJ a #> yRY R2"B_4Ey W+  I Sf X 0,uc74Y~T|P5 8 444C%n [5i/h{V5(c&s_=+CYnD[W gf>G 9 ' (Eq14Mk)P8u !+x>rnbzvX ZDEy'-5u \ 3 z  v  r  A\     g ww {  :v  ~'?ZQ2mj?a*ZLP^(F^( : C l&}PL:E3L+N>#WeIKNNyP^eABZt$9> In?>1/UVkjt68KA=J #-y1i.lx}+ kBs Zc;'BIm,4C2.V4A"m`Sn oS1-?(??l"@,!|7:j{* SR9kh_19 =0`6odd-M @A ymxV'.dR]&r<)F @& ';]p-U}}GoQeA/Eo$DFe0`.hCb>go5aOBI&+g,0~~J ] H ;U{w%u]n5iut{>BHW+b9!gj 5i)1S'2b;xBm o=|#, .xTG Ac) & 9u9`pj<ZbH1TM ./\KzcTW%#d#C\xKntb ma jqi57CAmylw<_/8Ns[\wCaTa?ip:W<uR x) b zX5   F 2    W    l E >p]vD&p: / h U  t4  h' Q s [6,`J@V:m.K @bKgQ7Z"Ba*^wSe?g=.Eq_,28w~1d5u]+w ws?J\3F#Vp&kw}-$mY"r8WV fIa^YsHK[VZSO]dMv.lhO?z RUv( b ] c  `ZqQu%W rRP6|z%4 0vjf6pa13v*pe, {A(h2Ucs 9={!?40\k,HFA:H{(?j I32Yhzv%PbcZni`K jZVyM yxL*xljEQbAZ{SpM?"1,OwF;]p!qS^!4(4<> 3G2He<Ne4iRd\Pf;C ~ix 7 Pn h3dGw_9cJ-EZBe5l)U=xYZ^!< /o&'@.{} mS!F7}H_Gu K8g_FRl^3? 'tLAp 4>('l"1l; I%x]O6Mng*0+g:y t l ^'! L6I hVfrv8Vg\ {?d,Iuk9%^?:gB8zSOc}!9%~jFsa"twh2(^|YfrqbU_.dfivDs"8+2nz!vf6g;u\Cd'#YI:).C [ o8[>k$ 2ZLXrJ_-EA)I,a2$rrHWPh ;(]& $ /g`7MV0: G_}Y^!4] :F= WZc ,3Hhh|kUnxX#3oi}/Oy]]D ] G 6 >cz]PPc 7  .  ? : lv|+ )q /n"Z3  >GpokrZ}gi!kh[K,?MrH]X*&;EK~V`5olt qEx p|Hsz<j  7.eN-L4! #4)<T9:q/[qK`70H945QC`OUv(1|X@M5xcDP6uy o-Y/<2e445Qx JcK+pxN^S3|PZ'>6#aG;%L+Cdu'zCFCTTZ:.)f #R|7w$ @L2W,x2?"7}ekMKfQ +.o[wFEs\5)5w=U % i*::~CG@k2DTAbl3,P/gG)!))8 i/6 ?HVxHOko |!CG$m#:QaQoB{F< 7"#V9TPw$>:  $)S VJ:He} =EQ)u$}/14stXRH_.6m=5(x#E*y2okDH(b)gd:ON;!I 7{ U[1n$:# m /  z wV=~:}' a$g hjLomeGv<MCw-%CA\59Y~1hKoCiP;+)@dH{ 0vx0&wUzS}-Wt$)P/# xiW*Ri,Rn{OPKjYDGXdJYhWs2{GP2D!x=} vZ?Gglw  e_o^mgw_7R [ad# n\YZ\R|4ktcN|tPb{(wHy! @r7RD%!<t>Y{($GMh2M&`{NupUUbq":,%Ki;vGOr(#)}$'!#w/ y0@OK>O# -JB#lZ~#*[OekcD68&m>/%t .7rqCf \= hzE#T ZpL[m7O?VY2<^aG B? S4CJ/3 k5j?KyO>"EMuWEC idB MRc/vOUIynq!D6);y|?=Y0u#S3R(HlS_8-X[,-n 46:=1,[qdVCU2%*&[>)6NSi2FEe#FPO+^ S7 w,qd2WHZxy#t 1CQHTcxP/(Q1 G&>!Ikeg46#3&J)c0!`~ F4H & E4&- J_?9h?94SUNDz3QK?ksu,8\L7x"`@2m#l"\'"3-_>lbfXHOtGcTrs$i@t{9<?Uf '.D/a}}Wpu'g9#!{>!mQ;#r8%a D?tzS0E{Ty{T!*{V@>T7,0 LFW. {Ml9f_J7b[f+*66P<0'4:e,jD%d'tb8a*fY#?jM'b'{1X=9B&ps1fC|&evFc}~".\/K.`JC#qn5Q53IT,,~J:M> =TUNEeCV_!dopf~)x}y"z^4SbdD~[uL3uP"Wdd-#A;*"!Rg- /U[55&H[cjP}46sTAyQ& x"VH  N PV\ yfDIBqH W zw~B  W p x~h=PH8!iC{z;JK"!cd?Em{VvKe@cd!@T8bNOY0$j XY3>%1u3#l80#EK9FUb[z7^<MrBLSQ |A#}{B5mu@vYSXOA  cl:G= _ `=NW3\M` Mr*W"u2h|S`_KZ [~ ~H"c Fmk0JKuWK_1=szlZR stO cx{VB f4r];N%k@mdGr{EB/$m^&]6qx-_~;pS+1uz1Q\Oq]HNp=bpg/$kwj5as{7B8^so1'+*;C qd;d*]y i3y pnPL r2l*e%}7X2<]ibR>.29Ab/ <d7&5%;/LIK@Tl"-m?<%\wn&h%Nr?)?2lIi7mS-VW&hUlC]`F Gl E p $U s 8 Jq .]4 E^sOG `qv$% CwcPohH v$fD@7P ,WkH=p, TNA5Z{=jL\W h.Ak?*(Opw#dJ#x*[0g[ Fh]sxp~u8}IO6H2rCO-!NDPA4c-VFD<Y[u!=+oI~(?/ =sx:5J[mCa.igcGpz&IkPaE5Sr&dqN?-![s(Mb~;8 B]kD0m8k\CGn:5`uI0C>/5" V#%. l!^)`u.M\6`w}nF{N} l_<sZyJ>#>O];iG"00S@{bsAt*1O^uQ1D 1%'8%U ~uXj=vEv:kl 6U"=jL<*VC'T H=CM4-> #<rhx%ZD{QKXT&nmE' L 6=( 7|,jhcX@, q|6"xJv nSeVF=h^a?~A$dn_IWa2BC) Y=o!ddo=hoc/ q a`d P* pe=|;*/}?LY4 rS/`Kxr%XqnHg#E=^)P&W WK`trXn6lqQkvQn6hH]3'=CXUm?,4 ^t+ *eK%.$^rS{o5m*RwAM)/YEd5*H3iR"0%p?s7*y),Q{ %$MT)$ F.M"AuwXP/[?y=WLj@ kS7`DXA)Kudd'Nb!"m|.j'b9 +bfg LXh:c)/5RF8dgZ0 @!Y\2Nu62UC;bwWY/P#UL}ot }QL!&1?UdwTub[D_&F51IL$?JO` rA6ahw$#0 nnPvs?,q(@lfl2t|txE/9EsUNFjW$T?Ib`}w$iespnL&I2 n e   >y4.=Lo0w RD7( ro9RU$SxA$>kPe\6 ~gLzL#S H7fb`1-5 [9lwm;5}P!G`b}]6[3t;f:qBg HQ@"dI` mG9,!V?Y7"7tx} <SlKoQqLj|^S@IQVa`c|5I<7ge`08y:T `Gt--'y$d@O'T)(uiwd TV$uYm. -}J6BA5!@:kWun o9\Zqn@5h4X^c9kfXsov``XnA2\fI1! n8tN"98+Wwolddk5q0"&+*!/4xlSIXaxc`]Hf,;|"EGL?AE\I=b.a b !%0 Ad,09l4-]=nRnqX=Xm+f063qy{e=tlYw%Jmz\f|P(7elAKx)]O(c{*CMc&e6 b!nhC:f/&d{@48QsuA?(M[4V7 7hi^Vkr,{u;#[:s]"Rx3'K|VI#]=nFPj@@'FIKN 8;BA!;(`\$M>@#~C7-~;5s=$JyzrI->HF.EVNB e5;|/2 ]\vR;^|sYqNVIn^e. #H4J;AZu9uH`!g4bUP0cdf>e88? Y\sL+!@S8 MsjML=)Q #?mAQLh2cX%/>v$W7w>giP2$(? ?Fh'?SER3$(u 7Ib4pe$SqI'8wnIL7t6<NoPY4pTuFrp27!UVD7%p db4Nu JI4LW}lk]J,SW  T(WG J/<P@!Se`ex*LeU95Bc$#HXJ+\pfdgog74R"#I'sFh"kIAV7b"F3&27?sJj0E5sgF 9bhB_*18_9vr|wLEIz#t[b?waDp>1M'~fKXK]GV&cb!G|?&1r>b Cc& ,#[dx oM3{u e8d}D$ws$LrsB-rsl.8TDRWOF88ap1~c__o~tQbg@P%?K$XW5Fv N5kT.Cse=PH=FE^ZY., ypC.U`ZX^kkWU""V.7K02tc<aH kO#e=y'UrW~HYW"Q.d}TZ,UFFi }(=W:lz:XU^ tp5F%=b_lC @2F%q\X#}[ #_blrq83ff"IN -a0ReM`9(*kT!pQ]5~I UMkD <He* %'S,H)mOms+x/(#Q9fFh-LWh$YL$>Q%wQaR q"%Rb4h^h$\GXe.?1b~~~~mIa`I9hJ2<,d ZX4i zIERB!#;(#}p{OQ[LmOR'[8AnUVRK8kXl7pk_c8~|E//?Z"qD\7@l|y/X[QAM2V_%W.@iIC6VTO/Z^k$+ b1,{zHI.&JDN}j#JlCW2{ARMKJ. NdxIB|sVe(htl:c:J)L^() kI~ohSTv|;G$Vb?F=*)PG@PV1Mh|\,#::\W@*I!2\rF[,,A,WVy /AFKpWlFcZUOL~Yb@ OuNFQ75Cvmf6u =UP#5hmH5Kk #}@(+* 4.c3=MWEEPB@nL''9tw>91P/Ex"mgL<)_ J(YR_  8+tS-*'A-Gqt8CsR[I]IywASP(L<:uXo-<N64V4XE6rh _33QUK'*.k(Rp_;`Zk~Gi$}2vto/\ 5a?Z]sIN;#iYbK 4Us(Pow\1\'c]Z oc?Yl?7S[ws1WI`6/0p{F  q_szdK* t-UK9r0]i_a_i'F,_I,2S^ZJ,UA$*@2" |<LxOCio)ID/TqTJHG_lrsw`G iTmQU&Up*y0fY&8 U[j^xIl0[aCcruT7'$M&w$.3?%?5x{8^5]H Z e b i#B<*$.Xlg>9A:quX7mGmPq >" 5?7gvIsznf8*MZe98+KZ%` SnKjE/4# Ed9 6MHJy\N@R1 Qlb^0n6 \dABGxebAZB7&8 N0dR]R@AGu %a+ ^2 RBen(3 J"hWfVr 4>B2KCrb(T=hr-t=R//lTB?wb9h z !WDzH; bs87Yg?AtE #;V)l2F21G{`ap(??csm6Xx>iaJyckOw;,^z?KDWO{]udn&R8j1U* n]L11zQ~1{[iq#9@1i$$>;"*eDmF0K{8s1RI0@&3 /5x yMAb<8S*Vcy4zw~k$^OIqb .>h/-hD1!' "7FC4N8t7!5O-mokEmZjOZ*1  MDx[^k uW\mA+ BAG#+:,M=.8PW>A`pw}sZT`QAz4|k0CIn V-vA|Y&xj{D7^N 8"\NEwp:6% ,n4|v\Pw){SfmY?t3k\%u\pP>QZq>tU!"X /d{/jfdCBPip\%>H+dd{\+vgf b`emY$H \;_'f;pB'Dp B?+IX?W,aItBLy:6 3" Q(b[;6$p?+!1+q-Bp5*,^t$[2jImRv2tyY a)+ >(5V1CD|mizX M&BS4nd8SKZ{.SQACH4A,_K[`eUnDstttl]Z}dO,^o-(:N#$kfd}Qv;xiq^Ue/={iZ s$CXrBx6DD.?Bd-</59H]O3;h{mYzTY_akfm\ j428Al5 _H(F.GgsmR`}X730' M,A!ekv=G;gk<huo0MxF*yA>*/+RBVu3/gsR:J 2sF'>\#iU?5;p^5gt+eW4=)e*))FF-LY ,aA]P%o lkK5++#FZkg0?|AX 7 "L/!GnW4'@|aQ!A) &9$l}19(x G%d*dozf?~bc' l#yJB?,.+|OqD:VI0& EQZ ."C8]5dBPf;/0FP'B;8.7SV=%q4F .5/#.tM`9Xyq }j8df6-h $zTd{H>^mA^~g+r/R/aGT\5 -CG7(y >< C}}pa]H2B7] z,/H} ;iz rr4KJy( W4E`NGzA[LwtZAHtmwPX_=TH%O&K'PG  (o;<97iu4`dJb0VBSlqpmBv6_{ gN^o2sHz-`sUR18.(&# 36#^M?gGI,s]bpplfcBO:1q .N^^^{Gz\@v}o,+db4Npm,tygvr)xghrqy>;<-MHJHk>&;NVCMR0I$ - K7NI5 l4x"kiQ+N*^k+GA9Yb6e1ZwP712m?vlii-mP{D`he=n/C^_sL?: 43S2m Di'sFRiE:4k?]~<fB{o7+j= Jhwv` nN}|$oe+1gmE8JKZfo9,_ ?B3 I"ws=pS`.>\(+sfQC,2r( `\OfoLA"J y>Y,z@?+xp]I0&h'oE~^l|mqBpo2b73\;hR]4WEdx}{jAci~-~  Nqvxuu`H&Ziy~vn[n.IPn%(  B8Y A7, R0, fZ6mXtbc:hf &.c#(BW&\|g 9)_]QkZMdhpttkN6@fHq37%y2,yT.5BJEPiZ [ j$ +eT{{K3L8c\Pd@ayV1fSf[9/48558n\KMfQ9 mlLM^Q+7P d|%W^t(` A&?geM@Q*Li`pmm8@:7Eo]3lmo}xd}ut_Jw1[^h1LjY$ S+=kmSa Z nD,V|-Sd6ar%n@ ZOFKYdaNf# #3EP9LgRi1uxvLc=H_f nlP.]62$/9q{AlBrL-,eo>WoL<Pk&,[0# >3Y$XQH L,oX)+RuoTXbdevjirM6-({(`G83EmqvLW9R-Z`VZfQS,:vBunl~cbmK<+- J Z>+?OjsM"!/#* 7'$77, !(d\ui{omoah[p[z[raSt>b]Wgfx:)U Iu M<<'H>2x#s6f2awl)Qwbzflag-2.4.2+ds1/data/flag.png000066400000000000000000002275561200563112200160100ustar00rootroot00000000000000PNG  IHDR^qqbKGD̿ pHYs  ~tIME .l IDATxmegqsowKʒblh5dbn%N$8 a0Blj@LƀYv; ϊ$5 12/xtHoT>}{?U>ךp$u{>{?SUכ(z}___N&(*]eLDD&LT9)_/)w їKC90a;v.d}|s.+ +:a"*" Ӳ)NoS40AQU)TE*S@D*JAP@"|RTo ~)LoETh\Ee~Wv XT(_)TPTDUa6'yKa|뵜AdEٖi#UD$L SQF;]9E;;xYd!4W۟978v+0E?czՓ O+ӜsTyFwDaEvrNssPNV$9rZN.Sd'Y 8i=gɄN9ӺK)N;9 3r]3;yFН3z+.xԓLy4kҨm]m%?Ȗ1VL=QL4S[J,_w *r>5pƜI)IJp']rm)JIn36[ݪ ADVd}YoݺNVYeE[Z(ZAjTNS|MSLʊ**(۳ Lu ʪ*LTdl2թN}F**۴Qa.2)D&2e\mu rf/Kw27/'u O˖4y_)yl8~waʄFIMTt Y`"kiݥvvNyFN _-vQTLPQ0a0a”i+TAujͰ)$]Y#v{;\sg. ) 6]e3r' Su.S9%8g;)vrs؉;Ys8gs1ajcędGzpsI@4fNBU$zjhqfoT۵gDT(ӁHj-iG&"W2Xh>ȔSiN LlIx(,PN9wr2a„m&QBΗ 녜8_.Bvȶ4۪_e}fg.(]DId;QlUK1_+zJ˓4͠as));V0eev3V (s.wZt.]ߕi#PlS|o%gDad¶*ʔ|Γ5e;VMйj!XDM1c_Zᕵs] _w;=/ "SYpglIN <_4[b6 uT'g8TVa< DEdk<6rS.VXgq1ϳ8_w6@ e +2>|kXlI9*??r-IpoB7*+`iXsyR'"9N[=T䅩ά9t^ X-Od@϶ȶl-3KP3)l,B ]d'jT!#T?yuR g 28bXwNB3(9NBآ)SݐnSqH\9 X#!'5P5S/ OSGy8, =IUVmX~8'am=Zȏ-UVx|B4/+ A):Z%HqŅ󶍐vBk|, Uc >%= ,["NZ9#!W<1-=7q5.ƨb(O(uY !X VީTNVr6e2PZpRbl@W]D¦G=qo";G}Ci:nJ壁#(q;m)M:XzwE`þI6I|4\X559,vD*Eʼ[/oL$1K#QiՎJg@oY܉p7L[e)M*^VP KZV@LGFɡ+\ցl`]U(ըhr%j Ԕ&PxIݷVLBdk `P,'Kk Pc' HxL#$aYMZ,PT|+L wz4y1 x/53&uh吝 _^dߧO(25-y2802P0es;Ͱ}h1q.\FyԹ#y<YGib>]) PGUG !i7ZF( O $&n(#JE7%qT oυX1A(.2pājY,j^C 0|Uq˾=r,eYj5deQR%@c9YM}s ?J52xp hEHHxBWyo"ݻgv0hںw8s5C cy@M -yCV15'.>L f^~N`(3FYdo j]9u9$ܙҙ)"s%'U.V={ T)!1˘MxCUR>d^hd,2~KLLؑ“iݓ5@ZII"2EKjLo2>UO N@LꁬkOޭA-bj;e-0d>iX|LRcԊs%!,A JU|i)]E(ܧi JT34l/A?-yn  ֑:uFȟ׸^M+=sj*F(TAGKZݭXjJNrtĎ2 ߐe=BqqU+N ~ݧˑJxEKyZ[+D] üERq G-Uwb1zɐ R%0VUKR촘\ <׃ZI-h5"9|",gk ӴjONjBYٵvg,'&v۴BY96RqgGXXeMU6tm ,M# %N\=& ^XE~08)ڪwj$6{*R-KY_VLx-2ΰr1 1W>X5Xmu%d5"Ѝb܏k 2 D}<()tMo\OJoμE |^DOiB1Q4G4dMȣ{~2S/x/q~yؗCuloB~xlZqo ~|/ߜlC1Q5Ku%Nj=bT]rWStkqbTs-4OpX-xsu'U"R*XOS=h#"ĤlϽKrբT\|K粩9P'W-Dj0;%uc&zh5x8J.EW52Ə{ZGD#܆(A$L=s*vv*Nc9ojUzvGD)qiCو#~mLVS4NFWW}U*k{2㒛qbٷfd%&WiӵY2'J+k2vI2iBV)fէL]Yuկ6uDWqx2F͑d`!bp՞V"[ZD4 !+&cZH=\qh[VYwk9nqc@f1k]A jl_(=]-WSy`jY{mW@ˆB@,qKphEdr^l̉hH7!=v P,fks?'ӂQ~X}Pl\P_;cl _fHbaV lI,u4A܁qU 9j]$Y((%J`Q Hk!?+O2̪$::s?8xpdČ[1EZ~g5V2&p8OH}eDI ؞:=yCF!dNߺ6kܴm(q'G) /MS[F-T$C+ }[ˉ+ Ԁvhy Zd8-H,xm)3q^1Dkl| R;'剑 `εV4`PHn$6}Hz,5OO˨~I#Z)ёʞ*K~ uouۿ 'Kυ6Kcoו{0 bZGgȯ6if=kBl,J ޭƢRZCPwʀ+hq>6ojX.64g>é}U>{hlMp?/lPQßʢLo :#{a&~4IB|s̾Eq#W]U8CMlؙ,n0.J-M)3!sƸXwqm!+C-0l.^n=ͶL[q.J[cjgj(KKZc5Fg2Դvq61ZThyQ2E +#_vDf)ѓ0_Z~]]{LYm?-f,ߢ6~^tO#58ƞpA6~`Ij~u<L{^U2C" "n­eQ뉰$(C⒛߼x#6l&ZptkDDc]*-}ns&dB"dBGD6`(QimBA=FU:g:ζD W ZϙY>Vo~ք݄Y'R?Ls &I7 <|u5DTa4,Di6.i6{梆Ta$YY AT0Q?5'7F.gqx:'~l%ja wH2 ;C+&UTt߷6~ubhL5*Oɞ^ejΆIn#e Lp8=x.±NijInuRb2|?ߌYvN%Uak{"Jg%Yָ8wgq5=;Vm|Fʷ6"N2r99|VǾ>1 ɩAX6Ϯ<׀SXE/xcе/tq%֮t@wHFA?NdȽzLf,ӑIM[h:YYY(ı^Ǽ3`QufXQ˨-i@[ v& W{͹5qEw%ɪjI'rDB|o7y./ًws^.'fە}Po﫪v6Z#GĴMKhQb2ov$P5T{ݶfٶ2U'"VRSj62U_3n(z]WL15t4බ5*մ2r,3Ȳt'ՑznRф!I FIGb,̀[u/O[Q_e:˷!4Fc#;: '}%4T1xyy'Vkݏc9i][[_kw~hN.3%YZLEL QI=$g{[:2R+$cViheT 10We{TN2W<ՠQX67J!W=+p;գcOyN^HDm~p5ffp5K!Wjh*g!ŭ2ȗFff$̊t6I?+/ў 62q wxWqgc"e騝U ĝMCES#~<.-j: t87vU%jʳ{QK\2XS=ou?B$nJUF^7T L՞~9T(,*i3lU'f J96R٧9K\JFe E0 dΘ,|͉Yҡ/}H#$ 1s;fU9;JXRq-aݺgoԴ/~&5妧SVʌZ8U !egS1m9 L8V >!*@Kr"D hQ蕨 ]!EHBKΥ:X0}$#raHԧ379\lİGRxq-qX"Ś#zr2SB9Rp~8PW0QyqϘYYT W½Jd?Է** P(D jnB}v,#-gA;*1MdS={8IL S !`J")5X׺J9BФ S[!M/Ez'(VX( }[+ւ(F|'[lT+Zf,0sc{e!A,ܩKRiN(k {{Sk7{˕5OY;8JGַD~ mЬVsZ[_2.O/Ř! ϟ,Md}iLn0G+">e*; IDATrձRA^G8!n~~!u5#̀r[P'nl?'y|Ř#2Ck"߼=ѠlR혩|E<^RѫMXXf=.WvRl,>LHj?nsRx}yqe!0{`EZCB0n5b8k+Agy&fUqqz4 =¼fUid>Mݸq(Mq{fwWx{eTe=(o(ӪZD'}L^%H%U|P @VMUR<ǎ h\ưH\]wyǰD(5}~=q6o^ǹ+:w#Mx*&=xUK c;+S%E['9RtVuRWLőOͪ~rq^DQ_O,c2 8krb8 c!#P#n_͞^ eEyG= \\I:n\#P_$Uw #N8@y^_P @V&s;N)B)2o& fUp5ٚ35wrFUq͏=齮? 3 Yjo3'25 & Qj:%%#]'5}GQNhRdmrNL@kwm- F h[YWohl g&xa~\ߡozhv:J ẅDRU`i9o⬤ l~OEq8lW_|@%yĵǸD$d d[< VS\R+,Vޡ3ʧk$p/(k}=^1rmXwR83QZzaQ8D]󿿉sTF~6Se?G9&ے urǔD?>&W7iWQoo\K'<5QG|Da~z8ߑ뫀\~볙y0fPXj-3 BVwEeOgd~Mw/_M,8Msxa}KBq\G{Vە"GQI1^շܧ.wWO)jQV{zYU̹1i?=:!{dpex}-~۰hHN!ߗ2m_1~# x:2%ƙ|/7]INu:puj4 KPSHRp,|MY6?;few|Gܢ{w<z{)bZ@M@_;?jR n WXOww>2fj.fu*:A#!1J-*sDVYBc3i# 6ˊk'9al^Dl?@)nop+[FK8RdG<2k-A׀&oNX%u])sIXVT=F冏5z|ԟ%%?dOn(?~ߍ= `&&Ny&)QkmH EE)|y%a̤|@p.;XYmLMEͷ6 3U%K },&?fGֵԜ=q'S PZG >8wfy>4}xC'3 !3^MPxQBAP{RU6P!1s\(:9ju[jmgjTQ!?6'H8aG /V{yk 7^Bo 驢~qNb'jM`u<Ы?Y*\Eݔg(qJ5k2R;CɼuWDk;kD [&~;T܎!"m=lq]lGn6Qm#RQMA! t_EdÂlgh,uv!b)ɘXR;9PlA&i|,O W qc16?R")d(p[pZq ц-8p(i& }7j쑁nh֨ 6x&gI5WM6 a dT uQ$0D R\^QƫXݎIݭ ^x;quaƴP4EJUKG`9.fP4e@5֖ |gOdb)sEs7orKi]<2b kO)6Va~C uɶF"pW&o|h *מkY9_fߝљ9`UK0/VR_~j#1+L?sB`!u7#^7#`%tK lSZSQFV\WXbW?ϱÿ_w۫ Ğ4C%n[:5j/HhU6EL2eY AJvR.:d34FцL|/X x\(xZ[s2(.q>(wk#2JmxV~c&6D2^28\i`c#1 pü=Y[bD יe*1"3GK.qg4B .3ol%T `i;r@yC6u#y)u辪UTp/OSWF.9M۶i`dh6_y}n d""n$ 4jg gI1D}nk-v4:<^2na{˰Շ q<v .<;l񋼪cgJ51Oٕ f!KTh1ky'C5w| hzCF%f6p# ]۶]YLSc}_0'v|GZxEKZH+Vg2aZ k}wLװn{:ƞVw(`ި<YXy=K0= sPi/wkhOh-W .;o/.Q"$ j'm߰VvnSEmɆ8Re/wީ{mtӀ͜%0~]'t>i%aaZz2y KYz{ I>FGl6HC<&:naZV p>敮C\(hʀmzqu_&[a߆&m7x7\ś;.,cҵ"&ȟ'r:Vl//HZ"8ۊ TfۂIhy7,-5{qu~Wp=; IRD1QGDќX6kk;%}TKհNx7~u"Ҭ'?,@Ϲu_ocPiMy9XCvPPǂtH-DB a MmIO],ʀ,{\Ko䆺boA(R@ K6ye Ǜt-):@)| 4K(Mw(P{eMtsq7ZG9WӔ9~3 ]Vى>qY2 ۸&1iڝ`&X6ccZʸ8.?s]T;g}P3}֤ f<3 Q!G!6h(.C Ӽ㍼okr4=_Of0TSJ1f#3eYczo&֪*m5ۃD ms=WOSB|lPө||2|ƈy٘bhIA9 ɭQ}<7{)](vP,"mwL5Vp-r fcOmt$-:ns3T&Q8.&1/F^-WۋیGEݳձĝBji'F|=o@h5j(1o7`\Oh^7J`LV] yöY8dJe׻0Lkvl >i/smn@];5KG˒Wje$hc%RwTyMp\)U߷ߌ^6=+P;)2O &0\枞t~6KC~~L| [.Cq֋!+f /zN Y<:*AF^}s @[!l,j&Y|W΄$, `rF *nmK$`qmLvʃ QSZ  6jx`~ax̌S-EA=jUЅ\:Z]IdSۙf@dt:={ۨ[W8Dloe<qrE4 %W#[lpciqKyͱU+98oU̢L yĀpJ!`8M8TI10/Rv#n3Vly:\ڗW2!w҉qZ- & -B`q ?k="Ưc<̔C뼌K)6&4OKMC/a#xK;2s^w/ퟔǀclqMx'lrhm1W^ݻXwP%Xss5wWKepu$2]w<d80eE ]\AxET;hq]p-_=3ר럞@9mLKye,ecW*qm<௳~^"Ž%|CHw(mr[?y<^#K{"9(j/iw1@HGc7Ĵ CX{%cou»oׁy>|0p+j:::bau?g.\/?fbrf,w0o:_@<LYp w?Yhkhڬ!RC'qf}0= @UEJ>~ WaqG[$El %(Yx?('8̭\\~ȜrDSA,[⁁_e׃y!>!{ q^Fz0CFLָKu6޽'lk ZHz6'R= P NTC_Ma VC{ƅb6VRdtpqbi7 Ds `G8\$=oUP8g(Vni; p63F;h{wwswv9Oasq /Sǀ*VF}2]ZB3 jP'86s "zi@|^u1T 0WtwAvlϽFH? #k1^hɵ\|@8ÛjZ,KjO?g6@9\vL %j>oD3#qTL|~6T ;lR<0 W -'!%7#0}a7w JsaxC~yy뺹}r=srmȋZv^+x\ x;XC]vUv֩8ġh+{kzijSniԬVd7[/z)7p;7B"R-&y,2DiRI9uy/e x ~̌K{y>a~KT h^"\ {yp+ElDr`R< \t<} g#@e IDATڃ@FJj<:>|U e\ %zd8 6^:lA;$}TaO]}+F"TA1C⤜?3VٶPBV)zk_ϵ0Y8pF6P+koG ]Ԍ8 s󼺇MA,+SkkY\< Tczcg!mUg˾&kLKI~ߖ#&H5|¡[7;ͮl)K;K񿖷s5aCOjX |T?r#0[f;׏`ta]!9bF9bÏidnԸ|ıJ_ h IC< cD &:BvGh3gv|laOɚ -r;HD5vijFإd19%>wa}~D_sx I9Z.1mIk6ú Lᔧ 1,ےxOy 7.6~N%J:֜ڈtHso͒d^IP?K^ Lnvh6ˎ50s5a!^Jo )lQ*n酶{?s@{mï8o5Vfl&Tf-4hDzAI٧IN/c !ce Jkvquh(C;u*~#Mv=C jߙxM~be*5H{u>5'nt/Dmey]g4 ,=h֟O-~XR[!ny f??{+~ʵΡ8DsjDR*w>&,TJ^s+UaeĘTl`Me0t1yhPa&Αnf|Hk4SO Х*VׂSbM~;:~y>R쫂 ?FDEY&|fiIu\W mb^OGdgWF&#P:>ճ7nYyh0EQ,?{h{b$mm_WI:G9Z[y<`:/2?ƒZȺ&u+\[ɻD5 ݌N^ Lu+L{?gE\J*fCè2.NV+ ҈ŗ-vcYv1;Cq-MxJCh|56vd[ͦ –Ys%9B vGd7XG8iT1VixA|*75=br ;hh3+h(37C B?e[w _ =.+R.Q1HL{ك0I'l41SNv.QR[ 1N%Se*lȲ#+pCtbr}yW:q?ws+[Wy=;!( $Պg,t`+1x{ o{0V+q >CuKgߓ{ST`6(vAC\Xl{ܿj#M#yhѸp5orDL]XnX_ўUP#? aq_q&uotM؆O~D];t׹|+Fk5UkԖg{q$$ {d jniK`k]$ ?wl_7[If~u x^. g 3sy4fуZi_i-wx5.ꄦ)!8LJ jV5v>{]NA.)BUpz}]B5B[\Lx8{puM>gkxZEx}fĸ;pt( lKӌ*;UDY6`xj0܍ 5GJ' ؊yd6Ġ*)mKd?+ Uſډ-= Т\naN5O~}/>[/_JLQA$C-52wHġ=uG=? ijZ!Ubr o(o"s)iDdczpQ22gV} \w*!<^^f5Z,ڀ1gd M iF+5m {j*USR5{x v.\˭W2U!,`oe mL˛|^ë\Xm]5k\4_( ] y&>f14j3a d}V*U$M[*S `?YƃvV?noK{mmZF˸d""SR)RV7P_ji*Z` #ϵDS, w\;~%$:6=S.tt[UR;ҺԫJTSIE[YXGs؋lA\M$AE3bF ꐲ>=!QR~-j:hPV-6L^ eY+9Qt0f Uߣb䌜f:+1AU;VQ] 5Ҏ$ Z喔M!7]sKĵٙU5뗬#~^ƻT ZL'5Ci hh״%CPI5i {|WT@l}lqVyᄌduަECGmr+GKG[~_ =M2y:p2't Xp@Rix:,Ɉi eW<fZs"Bnbp7҅@]M. MґRa%|Yk>. EMe jlf`v01XjJ¨/-RA΋:(NvDPYA /q׻V!a׺oY`xu[j6o=Gb c»W e-߇lq&o.& m?Cd-)I}õ?UBgI4C܏7?}Wv&1hu`wkYcO;p ؛?Q\:{8lWؖGeڝXoWzS3:eL c8LJc@# (& ;юX &6P&R-űS+}P v1vq u[l8㺺WVq7Ǟ8)vr KMs5ʼnc4PUgp*Lc833Lu0KwCBFwuſ?;YoE{}yOvυ~22]{5nnaSn$cFDC5/q' Ku? )5};߷5W':hxӉBU<.~jܝU6X >‡g[camʔcUACO+|q.K$ŀZ*eE9f8z`uj8kR1OMIqR`67vmt[]wmŧHM >ހU@r48e#?<=%fCو̻T.^ofx^ J0e(" cf*~;H/bm%#Nfʶ*?Vj:K _eYE?PyAk+!"vL= uu?^k>Ekm#U\ىKoC?>@.%0O#ڃ$:o$AIvbC3W`#N_^%h%y7='oː {7n/)oydBǾ(3s?j[yiNO&puoOY0w<DK_ u5ʮ_2v.ջuWAW{,O ZO+IUIYy'j}+LOmTNvIW K]muK5y>T; olx jB{?:Ubt1TqBK0>4[xw#VHD$ g/*R%J۴hmV ;PS`wԀG`)Y1+k-WG_r%Ok[xA3IVPqzvI)=VnDBŢ~5w;ZT4 Ƹ_ k*m!`;,V/:5;N[@vѫ "0Zrwpu;I j :bbUnn}K-V O;&)v! (Ui~4d+%|s<cTW|._D>V]™ѕ#+g?pZ.C`Ҧ'GFFB,i8%CCljz5+݀IdM&\kʚ&Bvuu2ּIn 8j@k<^ZʸIEg,@-v!I_u.{^:BBV;tT?VjkFӼuf|HP8FXkO=ZQTZ5G3˄=JQ'gAwMx0=Ii~#o][.ء;Ye+ iq[9u2ώyg4c#<7#3 чd~S$j$̾_=KԍP\Rv@+RSMP>Z9[s u+vv2Vu%Cy 2ݲD„=y.=;/`9{,}mVj6(@cWCE-nq8۞e|U;3yrd-zf;3mNEM\Kfk@3ZgE=ڳ]pdf< THOwy2d5d*@R# {"|T&lCz;qg*?3Sv)/sOxD瀋8h(ccu #~ºwçF*SWذ&.gTC M2q싁l&' -ɿ K*A;qj$<|TEZUZnjR`BTxLTm=v2Xen.(z>9\eUE&/N<3fl59-(˺X)Hg?#P?/q6徒5-qjxū5 Hx>{;HtRxXqNsVGSg{c&c:  e-->eKy"3ѝ5^LJtUtʁYa2##w;>?8l"1 7MF¡޸&F'VXiNL/b?}Q' f^/ ]n5Xqۿh{Ը|a;e:QӆRC q9HBJd(8.[}QGc9v_&nFF^ql$Nu%g'c6;1Ml- # @ULkyj9u]ؚ}ygg)X" }P%ҤkbJ.ϊ&'m(1C +RVFEORcNnJl:]!(ͣ0RPdmHB%k\c|Si B 8WL%/b)&l{B7PlJg|vvLeQiBkk+Nk;Qd\Ns]yT (= uЎ'L,f~11Iv0+Zk>z.`q ~sƁZV`X7l>s%sBq\Vɏ3oRJUywsR؊8:eO^a$  hjfxrJ L,lXc |0rldHʜē nkQ]rG؍0MbeG(/_{0.ݖ(r+6{v.? ud i? dB Hi*nzKUf-~j(( hS]!\򄾆&I!N61&_53,$R9TqIy@9h MSlK.]6eâb-QW_ ֐GzEqrl Nba#K#J4ݍ4Ӹc bO uIz?sf{.~œ\̩xH3l<㢴 ;8NW$[$B5!CFwHb(GmmB--1趿BO]$5lFڃCt7+Օ!dx٤Y}Gb_J[yUxn6y8$ڂ%adu jq^d ;8"')=2[SEÌzu٥hTĎ .‚?H$a5%Q1[4lf 9V> ;9fG_+ B+wULYJg` D] @7<3y5h7^g9#,M@@TL eģPS* \MlJuX6. 6.YM4jbyl|FL`8gt`g 7fRcW8zbF#^.{u1Ȱ TiuZ"*6dX|[EԮee@ ECS`Y~Lh}$rrDG,+R:bn6Y/ \hߔIbT,4JhG1[!G*i:tEd}@Kt集{JP%{F)]#z.xSA;r{ᷬb.w3'ųefs5^J @F2~+a-4g2 0mx& ՁJWn'UBФ&R!WV.L^YrׅJ0b1d糞 P|hӅPX2 FvqZG#JJ.b;+fwx<.v+Y+Jhq4WelRɎr8PKAP^[}^^JJU`o71?#F53FCE56s ) [m9Z.l?c=9`2 :hf>(0ɒE1J1kY<zBJS:HޞdX{fe/O'՞I,&>^roF1 #Ϟdm(Ra IYՏ{C!јc2O[A cg~jii1D0 }r ;m׈Ԅc]|Jo3ɑsa"FZd"'0]5O36 NMw~K}/UA, 7T0sk}(洜RS*C S{}Q r%xeba1`z"% h=.`~30J i&T1|Mm6EIoFyr<d&H0y< rQh*FPdQd*a&:}{5Mz3 _JI t!!/مl `^¾PEF0b0ވ4i_Y|+71E4yXW6Uo&ҷ}Td].EfFhN:N:'I맟ͧMF9"K5 Qx y/i ǡ"B7l"[73\Ë BJ e~l6&]ͬ:rF.&sIP-mɉn O'1x;b :`1EMR 59a3:j6:v>rLӱU[ia#Vck.p3|iLC 5 [dfvE|]SKKz @(;4q8A٦!'4݉1s&?%\%6 J42)#A@?YꨣyNR8F8X/a,].]<; lF+n3=2΅}^q0FG,^*q @7Ϭ I@,2:$b<cI$iQKLg[皹K䫌~| +Q^7iG83|=4k@3- ,QKN s_FdfU&8ut쒢U$7ht%֟IHd6BQgU*Em&w[Ę.#kP.(r&ڡ MTEiGi$tN`'xiZibKU^>smm˗XM㒷x,Kh뭈_l`s&Fxہf$u>.T$$zƒpl7q\Ut}gًÃP _j:M61N:򠴤*#jIKĺJ=HW%7{70&A .Pq^z9@? F&L3-LdK c""&):oN yYgw tYEĖa~KX'].L6H":#P*W^|bǙO5c F&2dgBt6ULeez^f [&O=]e JEiy$>l ؁İ*\ls_EKE2GvRX/H϶q8BQ$#,Kobe*k M[9eqM?ئm o%@aLǫ6\Ϛ,/x|\9I5'=ğy]WOl0RD9o>u*r8Q:馋Cau42IB+-Z*_1:!&3Өf^e3{u,e6O+!TT~yk|˜ұgf>"yu:qR0"kSVc+b)6(Yu7[h&Cx4 ]xMi3᫒B[@q?+=c&0yK'tQN10Z@+^a}Q`r D?]gG襇 OE'#W]jJB+Ƌ_qE'tȤě?B/}k^& NAЩH M qU w8*>&X\VJ4 [i&>WR,=!a.0OƠ$qr?[~ײ2.z?Pa =tM']i2j^5HHذ|\cc ܲ2 D*I/ `ƨ$7iBF)&jT i*GzcNgwD$Ku43#1D,Udɒ!b.83+iP2~!t4$&QwwӐ7p X@Q3@S ٿq`r(cOJ?\൸g<I(DȦȺaSC'E hV%=?KD{ovBXR6X9P1|]|9>O_4\"bICO#ota2Xʅ8s&CV;0Wmo08j7X(ڂd-}"0vOI@6Fw7LWl4cgv4G~s9n~wazVc&\:y4JQ,EXpPPyeZdդITUܹHJg$E8`KAI703+M=CFM/x Pi"Gg衇l#0U0fLc1d5FI': 1XlHG"dQd% bsNs.a'} 4J짝^j9 x?8`n1@ldy:gŞ`Yqo&_ScHwL *QFdT><~('cYF#6RZT%T0w˓;8Ad]QcR20)Tp TQ}X VtL̦ny. M ͕ƴ`k(@.fHj'e K*Q( aKNG@SBu qiz*g%MťSf15L׹x(; <4PGU,-\hr4{YzLwlg IDATL;ӄB̋# 0P(Gƃ$CBʨKXBtÛ|V,Xl%ٍboQ ɜZBxd:9%<$vsQ!P4`N~p 2LE6fʢU6ȱE [LcdA,FEjnZ086C >G2E% 0eϴE Ʌǿh%7t{I1zKeS@^^kV.B Q[<a g"%+S}=1^Qm|kbW^1֢~eΕvD \Y8W7uBr\zYI]SJɌIeSc8HǏzW m GIk]KK89{T1])XBBC|I)G;&.}vM5mW$(72L\i JZ>EϪFa" BL&*IK}^9}pi$&Hk,p""6~ONkz#&w<X'U"d[L K_T{=0Vc80\y11sxyKLaK@1`!b.f/sXp4 d2߶iQ2! %2 !1]PX$ɉin^XmI2j'_ ϕ)/Ow+8DijH'Ǹ&ÐꝤsK7wg.` 7Z ^/YO P+N_Q"֙{*EЕLf<2威E3@(s1&"bهQe/u}nrʓͬ AG70(!.:}N+23 HK['C~ZCq R-^=)IT3D5,ᎀΫ\fː%4KXDTKƯ 30IKh20_AgӢC8:!R p(*bUݞ (B\[C[Ox#)ŸhBa4y~ EZOls`?tuKU<rb* ^2%hפ$ZF:S+w k"Sy 7p -T9 72z!pxv{S#1٧.9g&6 3 $+ "('5`TtqHRګGE}3 *⠬s6I'R(޽SS=WULlʡgRFx7yP俾ۘE#p43h hwOYyOߘ Cs,><wrul;& sҗba.E1 Vt5|KݦuAi7t͎rF 1F HZe\@,iF#\O5Zh&o @OB,Fs;3?&gy)|EM W3טMz˙ߑ'[!M*lklEV8 [͖*5.D)Oi3tǒr9لX[)V"VF8`0buxº\zޡys r8QNQTCAu(:huI=;>?[L~.{yMݹP&+c`?AzP<ȽJ d:EPWWfpQEF)HQK e7BgK l-cl\ǽ3ړRܸ HUvB7[]eqeBW֫|)Wc,V'8NAICe ;gGVt]  nWWN-J(#.)3ݵ%&JA@^ܻT- ֡רo*?5.nH18PgHkD%l,iIT'/;Xɭ:B16̫t6e~pk2b3ҕ9vwQ\yv\Gi*c[YYiB8wtz vw̦6c4Vr("wp&O Y{: y3V"veLEDbHJЧ_Ug4b4ϓ.ct keofu ~d̴ml?tYʭeSc8%Fc6^&˵,A@i=ba^q> =wBN'A@@/tw`K=ܖrŝD ^`Mߌei0x M,mPGNooV9/µ ?֋H3`&1HIHf[:p h`e,1.-_6I4j#Er;|VJŀ7H7 xSp6v.Hb U`yZVR"Ed-*htCPtK^;O6SG3u$ߋ!Ol`wq Y(CYZh^ G=3iLgW.{G}>)g;xkLЎ wKBSu՚4$<)(ojv /-Q!HTwwVdU?<ۆ}%e&B=^~Q{BX<ҬJRr2ݬbGbqװzF術>}uzyYd6x1d5SN6}dY LL|b/2ʵ\XreTi99$;Ûxa>8sErta^4ӓܕ]rbb6 /1&[~eh$c8RYdc|? 6D%,c!y)z$QcKnn'B/5i0ȧrSk6{ݝt2J3+s|? gc=*5h 5tUp$؆;o/u*gqXS̴cbmw9`U.QQ7G[tgN{_Bi*F| KA\M>2Cu w02QiVpѠ4 4s%P6DyW6K#;D?zl (R^Ti67 3)uRWSgx پIslJH%(*%hLZ @f%Ws#S~h,[Y zzlXc(W7ϲ1~KX42D ,sAD6CuN,dOT2,O"qM<2gǟ(e3㹓iJ 7+)0C`\cP$kUIiBue.5u'z171"@{gg񈎊uSeϝEA))Rۡ×". SqWc7McSKIIwF{"b*F^,odKX0;t 0/E> z87 @8FΈk[h0gl#O y&Ljb?b•LߤUJs;fbs)zqo}gI7~ɦJ1(<ߖOdNΤ SJQ%EE<. ]X/ZѱֹO=LKreRQ^6_ {3iƄOl6覟Z&3!3V^╀Jn2w1K2RK Q9IGg7C: p_~@1wޕ!b5<>ɥOO,U2b/ՖZ`Z^iW.Σ poHLhXטL51xl΃qwc" ;*`T)KRR0&KԷ\   |k$&^쓬Gӄ߱l k 3idG<40aq̦:ËF6c\s62)2 op&xgy~hd%KgL>|f4=4FR;Z`Ghs)B|ǿ JPQ~$e,zJAYDU^ !SDvP'%1Eef|^B[z;mPk>Ʀ7r XHdVkxbrG׷$4|Hň5(041@TF 7L?ԩ*ꪄ:4}>+WPM|ٲ|&rkXB!ޥ"- 6RӋ$YZͱlBP,b Mܝ|[x.r "m:<'<e%uE$-<~|$\u"( [抉HQ^2bmp +d̥|8Wkc&#ToK~A,dqz2PH#f;h-,aS|<[5#4r.0s:O\j8ëE jz4\a+P;.c?`7_i~ԶE++Ld+y^EA,WZ 9>JE?WԴ?J_  p ˍg7dV)Ca>7]gq̣>Q'p -6k}lU~/fc ЫyMF L_wĴt'x q⸁2T,9fu2el΍DiDJr/P4q{ Kzŏ؁q^)jIM#^3c2H30$ I2LdB4t9y}F892H8> T3h6hƭsg89z62s1"X:F{gFoV.zIZ`R$Pϧ\_IS+E{_1"a^& 肋JC9ܪXEʀb)ɧڳʂu>/YK< = s Q~u DQ~v%|iffsQ` >-lZ{ B GH#SKa812B5xQKZhAn( qNS(r0DΟKSSX}[eSfDPEi-'!KSw1hÅ,W>.u1K= 1Q$eFc#Bxd>?14r>eSpWXK++3}b1J;fI4IE+.FHj6ۂ4DA1$-^RbzBZFUKiX6~BSKE(y.k|<|XI* ؀j IDATؼbz?LfӘȝG駓A|_|͡ p +4&*h`2s(0D?'`?#T323er„QdicZ1lI$Ai o~1|EqbE>2K!P'9Ŀ4i0HV@6<DD$ NEMA|~~pk$=f^>̠AM&^0LdjcK@d.eƸ|Ħ ,&hffL15Dq5p`nj0[Фe6< ]i6遼#;%E!/F!:͑*1k04r571"9qj+Z*9qolb={֞YSy2iM5ci.e>pM}ϰK8OS̒$*mOZCG.)yoL@`;Oq*r?R@ O1" L-ɠ>>'@V*(|˂J(z+Zh`^38fx3B''7otY2 υ|T1B>%O~Iou־$_y2,6S`InJFGAg!,2끄(zR4䡢3dڽJ[k1C尲"Q% FSQI@3m=ؑEAo}a1zi,-4K-Lҝ<մ]=E c-o0,jEZQ2@tP` G#9>Ef?,cp-8!#8d67jdQ1Ãfer6gO<"wxmޔ7h^@#,QJIF2"b@UxQ( 8Ғ#|[:Z={G ?BK%dh&bs@^d;qfSBc 2:DQQC n>$i*1&1W߿ WD2I>d}O8Gy :ND+f)g']Y dU)S)T).$ޥRw)G#XUۍ '+_旬T=ld_F??NE&`_TմhzfrxsvyI|uݷdeSea, )7X 4rR|0tÆ:-Rn8,bVhq=lBPŭHPa'B1}P&)*k%EX9"16gВ! n>LQ֛nFfPG9c?SW>0g|Ү֞\Ա9~jf&3 QSAyE"# G7P j#{7ˋ,K:KL:W:!( >nna\ " YTIi@')'$E9t]"EPJa ͰK:/Qo@ҋ91T!rٗ|F9a,c#Er44A;B=7q?VA9N;;)@1zĘ5PxΣ9NsA`L `a XAVs T%әzO ,¿hW{A4{5mٿE,X&+&ﲕܕ_PB)ȠȨz] 2|FHQ.5=e^XL L´Dg(t1B=3&x`OC7)0iɻQNp7ʛ"K#Le* g DA/Xx}ΟkK(2L?=g/jhf M4P syP/bjIm LFz8|/1HwCU ݛ׮R'RdfxؔrYtedlYTRǠ'=3A `%7ҾB* T@J QmmmvV{P{G[n[^TD&*Ā@B PIPU$:cszgWܹ:gOϰ{u19IAvmNTនɅ]O,9c;ZtZ"81.~&r$BVF6\9,%[rFYdpӋvk^TSդn0 YK򔘡# =,Q$@ HWIWZƑ9s<*wIj#wN}y P^@%6W3D_6n8hI>#N:yGmm],k8V?qp0-3a/y(e#* 98=^m&M sCn!*nUE@52_%deMok)w8ϴS$”ĚՕDMhzG]X@?= \!34P>+@^t~cq7w˂22+ q-<Bx)Σ?R81mE焼qcd/K9#;81KgXț8B$7B_#!Đ?<Nvi@]8qB))OmSc<*5n~@iv#7l`8~n?AImxh:]T >&Vq0ɳ![aWsE 2x,6J.ЈFw[2Y-l6vrL1N 9eA8`^Zr 9DpUv=j.Zl3p"r=!C41E7W[ZF:5Uۃ/`!}9-Ж>k4 xK]!(╠Ra'pLhLq/X̡W=ؖk % cOa܊rK'Xʂ"Q{ ۙa#*b Lr=x1J+IuMtP45k8]K(U (ymNBj-ncGotjΊ\d!iT/dӊ&e>ArN#AH CҰ^[+:,}/b`/۹-yjO3 Q,yY<~'91NK8ØLhq? L?K99=p7 uΕKm6?c9%A`UPb=3 Bb_GߌB92~X[i];_'@XȮsORb^鱷T @ -d0ӉBrfHIBlOp85̏lg7YgYȵ< ,a/xV*FNxJgdG2 e!K9% [^q03a''!lNufhвY׀{ }vGv;xe1,92n &/~^z^Tj\yƫck^^hsz^__K~3<Ps$tjZ$/Ϋ_৷2SVG3 (t x1 8Cc 9W ^i1]̾"Łb90<,Eƹ{_bx1'*̎ )&)bY^,o  ; _Ƽh[3kBTwJ}3[`7_\"KqD'~gM(ӺH:E`^MyYs(_n7]fȚ9^XfGhؿ[e(|{++cm ŜM̀Øc/O1c9Lst0Hln*e=PfGY)W'r~#zL`/Xؗ¬FݓIAx3,? '>J) qomt!K$Xfm+Xs%y~̣9QcgxN2;{y}̱P~xgō,X)@aWMͣN`01q>-^F}Hp?/+FM| |1Lۼ~u@[̦qG?b84 뎚 G~Cek8k2ٵٹ )g |sr /Y34"<e-̮U*Af'(ac"_Ǖ#m!^.7j<Ѭ}ı4a4$*4osD3]`[!!WpGyomXx1/8%l`ɡ:*Kp oᯁ k=vB^{RAQCW/\"M LI$*nr@2du1onNt[j@BIFO+ mbSh@ujf&& rRs0:.`۹}sYb)>ߥJr.J_9O}_ ^+8RF:Eڀ#qÿqj]M33A҉{Nw-g5ʗ*NNQ3j#\r ^mHt )bț~26Rz&fN1"\qc'3(s`8sY%w>o"UU+| ;6>弈! &¬aތ_^xl,aJpdG?!VH5WjY5aiZLwSk;w0jQxm*zY@_1a^TUj^$m[o.,OЉ\=K1+'h IDATW{;79s8˸6[bv๬g=ùp<3-ΩhykC8q k1[U-(Gnk9c,?o%BbBsRSdu;v-۰HFâ-uyJG Z_!e,ɲpIc<6ZAKl\ܸ\{ l-vw6M:Wmq";̱=,d g3xQk"p5(wrt:;|A s-ߗY$0X n 9ڿN^8 u 'e)'r:,:ߐ]j֋8bUfpLsCe]Eϯn,IlYZziTyUl .|ԛc9[~Gdvy}^fZ.?BeS-},I~e/cƫl([UF.pMk)%`b\5ObɎH;8xB,qσe+#&7szgUZՄFExY=k5dP~2duW* @*ҟa"q,:v͓mْcVXDR˱LrGn ,u W=~\5qV}?E\8dg.r39ww>E0_ p"/ˆƮ<"P27;tuĿc+y%:ϐ⸟GM"{iǝއ9y!Ϯq҂,"TwgWD K޳`DX(}R٭(zYHA I񧼔˲*it=; YRȮY[\)n8o`ۘ,}8g rJYzN,@p4d>[8b1R} B+\ iysaQ3ڈ ^'>QrT(twc=q&Kj\j޹%Ƿ05bڴV5ն@I%Z{/T7~i<7LTu5 &X8v^"aa~q#+G]d}%zwxǸx r >SvAv_!{`j鲍z9r.RZ٪}˯ךW뉩`aWdzK?j >}O_( >S$V:lX@,+!,>TgTE4SϔL2^+D&\HeX׀YS] \b^g1ĵy u%-a1Ħ=I -^Kم8M$) %0ha]0]|G"K;3Kz_L6yN+_ ?f?$>^=5 Nݗ *@bZ#P754iqV)P kw N@F+aƶ=ςC4ADߖS^4!+Srz)Tn]:fd< @|ws-H$ճBơ\ò۴s r9&[mFq;QID=!a1<$b%̲_(ײa&^oByf¶GGS q~6Q`MC'jI}{)?r.IXAU| r'w+8Rձy|c6/{/$OJ$'Wz_~'}8[k [#:(@|:CB 3 M()?c KQ*V݀&8Kaq mz̓zoE!{܉r^ݰ{z@Ɠzl[ Gڴb"F-^zCl(y(lJebҽ|r!;'B5l˳ -xF TJ.bW< lBp~ZR,@(]8|;,*~ n}Q?~^SwYڭ{ k8X[1Oi1`X ]W5{miӟI#aBjlP`YsbBb7TN @`6 Jف ZvTx>? 4W vu4.d_ֽ3uonUO lネjXB*]ρ"f~M1˜X=,lY_FpICia=!g&J=,vqY .,(3f632fn8p8g 6TarjnOqh>afH9뀛 sÆ앨UK԰|8{uKӷa%2'$bB2<14hQƿ2sLBi߬aѤ'hJ},Ӌ79U\"ÅvM]!C|z$g=]k$m8R1˫V`Gs\U5Uu٭5/^.ۋ@ѫ{Ze{iB \cz+NwJ8&ZXbTrμXJBrzX-S3:>{~,L^\UsqnڸkmňK+VlSlV9a @.m Dkę ot_GWWo`X99Ų@/T]JڿcGgqqQ츂x2v a1AGa'K1ȩ\D'"2vQáΝ _E9#!gUܐ;rZ3` 1d] EQ}~{J#J??Y ܥd4uO4a!*iX>,?TµN.XM+-5蔋&=~ Z UՔ^OȜYLf?` p6+*cooՇl(Vہs|n:g6`QX4zQa{C^sGӻ1hkw= K[֯$[0o'e2|Y(--)O{P^,.19 /Ɯ}kOxK~rL= `8c(W3ʎPA ( '  Gyxi[3x{lg{H!Yj\=OiğAϣ M~6m٧˷`&!W;UO=UCQ!jz8;.`#PC5obB."Q65 c<hJ =و.`FTX7_>kfu-|ʸ91mcU$ '`uVǴAv6D;[bPK* iȯT#ɲA624 ,β172Nk7C>p3o0Ozo4X-zp'*OblK.mRM }Ҍ]1zӧPuI'ٙZ {C1ΎB]tMK''DGx?[Z͐_ >l-wxsv&evxjhΜOI_('$X1c{HI~ jUzԄUN}?_-=u>Pv`盎maxOL)9#[Ky `ȪO5OaUk:&-{GcxH i `x9u^c<븁 %^xgGIQ(_s-%_h?m!X$0%A!duw;p@.$aIo`T /SJ8P#zQMKn"NB^\wk$0&`o5g3GK>pf[J:P_' *̢E`JAºQ2u'w4': UfG 21ñU9ӽ$)BK Qέ3JDcjD 5 7J-ݰ"y*C2z1,_ bFsyևS݈$g-5_` XQSY sSTۅ8Mo^`TlӔY1c9-bW֝@5dDv%[1Sm57ײ԰b2IAzO۹/(JU Q1ƽ | K\yo活=TVyśrfMpG ,MF/YU :28uѓj-9Gވq|-JVcUC؇zRSQo,tfLlZO Yx9 Z  b׸5ꄦ|@QG< &P.aU@7k8HG'#04_H\sCvc>PcDȉ6<u޲TqxdK! as_O r7"`/o#-!;r=kfÙ؈hI2A ɛPhON\}NR#NǂC/,T=]h_t|FP; UFȺmT&?t_7ss{-?)Y$ *cwoYV:ӚLm4Rz+t{O}{CW^o))f򟧙 fG, a)-= (&/ ->{3꿇T:< eoM -Z -kY6kH -2:.OuR'm n,Nk`I3;{KhD4_}"yzCE-e[D5@춶fJ<ں[jRҊIt743L2L2 t:S3o4 ı&T VlFL2_@cv[?p.6ŞjBr*+f-EO' r1=ARGËcx?W:[P"4g_u*Vhh4tix3$+`vV 헲8m5&5$& ^ʟg2 \|0EZZa&𨺂 t8qF$&d9vEӉ{+Pq&G zk~Vo&a|lamR]n)b˓۰wWV^^VTJ*Mأ bFisvCfv1n8+,99CWqְG}תQٜ~f,s Пnhb[0T4"䑫+,Uv;D ug"D()<.O[hkFͥBa$i{ju5Ӏhx_b Jv0_oUT@ۆLQ[jR{{D1*}}5.7dEvlŮEE`L4'.iξ)zreR0{_#"Q ,y91jF@.,FBXMn& qݙ =$+lev',1m#FS*-# 7Ȁ 6 FlYfķ5`U+qSg(T+}^U&X Nw D3wô|Y래m|+6JrqgXɻ8-I=B"0qFRxBCX5Tk|#K`~nnO &z l^D P vY|a@abf>6+%̩>OOra,T "#b>FHV}c>iZaŕ_\(YfuZXO.8%6ZfyLRVOT> էpXL< Xv[xOhֶ#5 _[$[7yk)1B"V@2:Hd*16˒SSahgVSP گ}Iݛ嫛6k@x26o%ht|o}84o4/AZZ@@b/º?dާƍ|1PD6CHMu^aja=ɭϮn\$wg[PE0sX~Jd#^@1EC1X+vdt!ojb%ЊAOVq9d/,u_*`>|Qp5uaοH>?HUZ#Vâ}r>zTH[eC ccC=?oIS8$ $Й[H1:<#K(n_Czz ~qEՌL -/g)uЇ\dQg$iд, (U թj"pT@);kP Q6e7s6yt^-g6!`".. u+j@`2"/ ovcOAUKpu5ӿ#Ae51HTiEJުj@6]+US|q`QKPwc+c4{mѥ nȍkHZ(ڪ^erV0Pj~٣QV np}fZqf<=ToqXlqb: |=/ZO"npha{ǚץmG Ht,le=v7Х8!.g0Χ*6)e\̩g_93ti@A*ֱvy % v'.Xș 1@k|jInSh9~Zhf+Tu!sE@ ԟ3,S&GCbq :lիsQF-`l.XǛ7\Q|Ap I {ͯlbL*.R<61 (Wsau'6žVd]Eu6$QKZ¸tڼ`vi7`uYDU>UVe #^"4էQ @k;20ZV04sZcn]!یD}ZSHn ycC-.20Ls p CtJqߨc Z69 iia0O;_,z`V`خ-[EWrҺ{=@z(;n% 3©ڋ! Ÿ|k>?c7-~-RR˵eͿ撤XU'@q8K5ʇլc1-`2DD\6M=JO)Tr"B?}XͩS AW͵^դe+̶:1 tҷ ֖DXΟ+3!p'r|y̢ΎlbGWNB/ _쿥1EFrA<1WkND)i p E@?k8J]8Qk1 ꆗƁey4򃂧?# ~[L3J"/ &r]!p%W2Y聴6]a>~3M6}g*Wx-le.G2GZ`_Yc%UH#vY*sul!Hb!(mD%zdT tri֊1 ۤ!ms~le_JV7-{Lܐe.c{]$c ]P.O"NIY8VxlSnze `0L:?L اBƅM|hgtJ/H( AR$Cp,8H!|o1oZO_C(~1ȨP;. }70 PʂMUշ(;br N}DwBVF-Ȓ&jX֕mZ!VФ,}ԨmWd QX@?}t3-,?&CyQ.ΖV'Wa~AdÌ8zFZFfCJ [x#(+Y \IXtӌIƙrY:FmT$E;>E=$uajGՇWy%1j_l@5\#`H˷T{!W9P)~`Uǃbz1hyk$"ml1v#C0hUJk)&bwl10mpU8njFG1@¹R-ײP8p>ϟk; `Q{ua,?\j""6]MAI`ȸݐi܆3O]a<`tGcG(c-Z,E fi&(: 2Ġ+Uf̣DgLP /ڀMUզa$S(i2BbWW~X0*S OC4L0˶|+*$AjD@i: NF2T4HZAl+VV"dICz`8 P_sXּ#$p$_6#5ʚ-QԪQX~kUhL~Ѳ%}Ξp#\~~j0H4_@e弩" (eCmiq~uMp62ϜVk z*Wϕn=5Wh)V*ݧL vG!]%Nrl9fOܫ;擺NDXYbmUBd{dNiOJa[M-V:7ItWS܀IqBhS۩4uB1GaƊP1 y, $ XXGk Izq.%*q piH$Z$ӄ@J3GOFeB![՗Ɯ;+KtҶqEa%ހ<#}۫3- E6t 5x썅^B%4;IRMj vo\c*S7/.TiEZ^/1<5Wh Kq(geʊ6*̢YjA@WǟIw5:ސHtS(#8ha5$yxK%|^moFގ7y+P%ѠIŜGJHCAR'07@h32uN5& ީ1-6bP՟~Pe>L1Ϝvk(2S]e.?bw)csNj ĭJ}//a&?kNgQ #b8 *־4?6Lf>Sԑ:)DiV{"/?FF̉.R:5[J.ō_>Ӑb\Z$BĜ{uWouu$Iv$ 8C|w/H`VfNKҪBsh#iS=rpWsC O, л'<|]$mW/Y!.\s)Y-ِ 3 m!$PghkΩh;1wKH1! ; j$4z@x ;e^ֻ)Cul4뻔0Yyːlvl kO6nWFYΟ1BsR -Xa!/4)MN>h T*Rq5xrՆ|Q al^ݫ V`ncvlDFK^8TSMB r^e5#(OçQ@S%d_Xd# )66ޗi[#SSUH/ЖZs\aUy%]埭DvV'RL9G@Y!&NH/Jztn7vs팳),\#D΋$nQxA Ri+DW O~=U*aDj@{)b>r;Jӱ;k< `50IZ` ŏUy?wsNoPQVO$_DxXK<.4$ "$`jwxRw)Ca4*\esTڍhhԄ+Z?YN|[AKqmѢu׃n؂ݬdlu=֘[bfb88L)2=ȿqNn!ZlLS- ϩFzPW'll o?=Z'$XsieՁ4Rl+17Kkdz5,e7sL,=K]+3&Vw"w.Ś6$2\ ~+j5Ju'@"63 ,fWhd/aYoXd!1 ,fڊ DM5i꼿uv@-5 )p1ĮNPL\=f;Գ&KUʭ\ %,P-3xo{~4E`b IDATNklC+g07q7Zh[7>{RMNC2:6c_]JQر:m6>:SEزiGG5lKJC!'(F/<˩Uv}xW?r#L͈x(LA8s{^Dnx y} ~hVf  8RU<0m91w{V1۬6i ` l75Sc0J`6LS|«ޡ5LtHc|wy7tu$I\M.u`hʓ&Qc9(vэ2cO% U]9VzO i Y Z |1!%$Eml:* >Hu3fZqeyyr2N`%p{Dcڐ棌 K1Q9_ e(u7Z#HV:Xo%Q%X+h]J(}h8 ].PO G*/L>VY-{@L5$Ŭ|4a9`1{՞حV+I咯ۘôq>QYEu ~T& Y }6r܆ )ט+)sY䋳(}6kxyamrਸ਼?]g-pfB4qnCQNo9.o i?qCy+ yϳϹ;{0@=cB ZDzpm|TRVNSQUQڊ(?$?*$@ڨmԘlRbc k{s=鏽={w}R8sz񬵞sev; S}MOGr]%t= >w"Me8JlCYFU8 N օVia+H,pdʖGsBy,rc^^+|ش5/{N}wW 4ɏkq[(4qkq )M0uƦ H)OvO gb6Dy23oq0] 2 ŗ =؝)bN+ %-.[Xd)mG1Yɥ}igSoЍG~pk'TniR#*U icl/ivFC[qƘ sfM8o+w߃w:ބ\"g z~y|/UG1 _ mxgMɼFVJmm qjUu2Ozļ$[x$mRE'Nv>I'g@YQf<rydOQniT)W&ޏ (?x 岟8<㽻3as |fkS%*2&8Q'ci=?O]N`hFp*r0+yCН*:tU*ǐg=^>ϸ[iJho!w]_p~TLx8Y?sPO6{G#B9tc@yE3MSrBlDA@GlGwuwނ]gMCu#nk׼gpW [G5𬲰FPbv  ɑ`=f%(rJc4P^}x%6eF-+#dgSzӇp56vܱg ,62X9^cUFd6'0+B"+%RC|~By݈ҧÍ6\BGfݍc>7tH1E E595x,L'?.Bq>p#Gg>x,o!;يz ^'i˼P5oMӇrXtƛ1XvجY,?0/̀-)Pz{ٺXMY7ۼ/~sq 1SNߑp ⺁M M174y\<,D l(xI&C$>.b`˯&|^víͮ"~`'a1cH] ˮZ@yCnOF>w doABv)g"?=Sl[`z~z`uZ1YqE_F pSzmI#X: MxX?154ut45ypmTC)0=ӛq''U<X{]1MRaՈ,w`ޖcQ= +qI4;YἿYŜ8=9,.:c@m u~#J@jͨѾ㑠co^zR.@QZE$r & Rc>:7Wv47O?GwhX(-WCyg`@!L6/+܄ЉMFr7dBG|x4:3Sݐ 4 "pszbtf!}_+pV+9Щ榹+Y9_O28hjQWơ)t@pgyjkg:Moܮ3}$Gr#0Ls?]Eb"}OY#U@8^FXi@M^SDHK)TBsu: Nt p5ȫM?_A^?t4ѭE#/i} J,4sb -ӂ3`v( g*ӮEG/"TkQew7AhF1+quCrb@dW f' PӊZ4)D~eވ}6h` a;d|:l NO+nKRBy,o xX+cx[o2tln {q?<ՎWЉvTghj{mgsP-1Dj%fyDv.TjN**SXF{^n9'CLH d.lQ{ο8np׏WHpˍ!*s'|y}!/h!ѿNNfaj Np您(@ܟd;Eyeh0x0G(L>3Ncwg1l^ N&PN՘ Vew_: OԥCDfezK7E9 $`1l@,m{8a R7qeN1N|Tݷ?TəY\r6i.^(>t>-|+:7NbJYEdvf| .LE{C3+4w`c \y4kM3~sտ~ L1(;h;M!a" !';hM8+G~#m|4 +k*+7mr4'&}tS6D9yV*felkSO]v@r/__4f.ò-d+#2d!e* ʎO)m敎$>Wiɼ `mnTh&Kvz2Vq7ԶCe45!VIa8G;} ZɎOSe.~m5(@N݇MN,ttNG@ĬS8+:~%і5/Z6}3J`:͸@_GNߌUtR /ZX݀F%,ـTXPQ/aIn֛0Z!T blⲤ?ֆ)iru7ajcȢ3 WV&`#eT/˼yl(ee @锐ְ|ض [GSG[`њR YoVf@]`OPAͧ`]Ĵ23ʳӻf .C7kW)$0uԯ5_j@*|7. ,4.7abA4x҉ ;of-P+,Վ?6,5Y,u,?vg$ilHL5TSb>D >xGmA7̀]̶CdjjwPO%,tif+Gv]has joy*T׼T /X$Si\(AfjWÀt C}ӵhr!H8+-8&8A ?k>W,AaʈJ.#")[N†de,4fX[2W # ̅c2/LJ88FPK\@Y,?^*,e:aKGnrVU3oA)s6#(6uVQ9BUJ|pVCpmh˄/2;I2oa&clBX7xfY#HV#θaճ|:PݨRtDlu?1\=^LL%34`?' 捒$TR[ ?S"8М% ̔U=2 X &KM'Ej9!*KSζ`b+<*Ѕ`*;re*7Vb\|֪y]M1>^Œ)ڐƓ燭ˎ  59pNelX Lnv%:V%֫a\/y{>L4恆VfwJc{HLUY]1O~ sV"vqDS&2.?=XL٢i}m G(d=ۯ5<1[T6v5Sپ sZ9NO$\ &~GU~i솁@s by~pu?EgܟcsDMZֈ#Sf:5,.|E&!_ YcS]nqіǦ`wy* LQ#FA5;N#a#xnʛ7KI2',]/[/f)YI2LB#f.bpxK0p! wH9a?ab C̙_G>#qRiyxy+٧ eiG M G@Xuq@˷H`6Hmk@ml?"?ל(D|*Ψj`fx;n+*Gy cs jw/T-e*߫wp[FtAl絫P+D->BjIqZ 6qЮ<#d%wH;<{ W,UGV i3 U['Y[(EV"նҹ: ~iZQYlnb(x+NF|hx9Σ́c2IDATsya˯Stt&b;<~x"{1J26ϧ0D*_iF=b,|䚆>"e*FhOGyE;_ΫpeZ^&Zoelsހp4t,-rKYӉ&XUIcjsXNSbDv{$^V&uN#:h[ŽV-Zs)%^N 2#D+Em5gkBlnyFÊ]b!yXV|S6϶XUkߛ.]DN ocьrc Kb8`M'hY=V yT㋛Wz뛁'M3Mtz`'1eI]obEKEd!L_~S~Yy7+V@sͬQIh+Qt;ȸ4"4 /:w 1Efp╸Kha59?En~ݓ(] h! T1h5Ù'Ԋ)?PuM22kњqnG 'h,ԦXF5|-o˝5 {o{4Ҿ.+RLl^^0:.+çDT Q|h|ԍa2tB YaZ]ՒB,|tjfky$h7rM֖N%E'#{"=t*ih^y)cq'g.S .94 K܆fb0JR]1F&;`N^$Em}\ yg3(U*%ޑ ")ƓFD Hm ~`W-,-Gk",L{o\ѢG & *1 FE6e2 S|48J 7&4gemhFe5PSqE(MfˢsMMEf̌{^B\R{lYy-$I(8eBuF=.2[H+/=#+π3q/Wnܑe)4 BtIE>8QyFFP%ct6wFdw%7%L9Ode]ג!MrzSåй]}އQ;(|L~Srv ~~جk$dae~Lo4((YQA2`kDroڣ ]Ooo$by<ԸXUb-Ei?]ke#\㕡&/r>o1>͟ӎW[;yد zi`KD X[ez43w1| >YZU8UTB ԻL#Z[)6T:l. S[@-FStϸe$0ˢ7ssiSe;[.דc̓Z B(Nֈ3Vn؃I\J԰nc"G_Jo:&IË42VPh%*T<6ULFfRkV4 YeUY]q Y|uX?R<Ԣe lS|cn7oXXv[|[Y Vwz<tm b.FpRip[PɌ!+W8eWxķ.bR+qB$Q,}9Ink54Qd<,Mj{:}JGѽn ՟^g9& !H쯌KZB$ q=BZFUT Cx \X hXGF/qpE$ZP螬:e_rW,p }IGqD~\u[xSC<=BKu| ie8M'8ػQ=8^S/I]`W;31S>Ow<`ͩs7ERǴN)"Sڃ$Ps:>uކڸV{|q\]\'xW㈚o򴏽)/6ZV+n¨VE<}-j StD%Ѳ7jD$Ajjz"l7_#xggpUW^FApq=OkpDZI.q+,AXbW,ruPw BjЪ 6 J%PzýR }_-H\xvy^]]t|Qw7i~;Pq ^W'r<_ZhoI|IŊZv1Ri)^u铎އ*k?'y u'{;8chѐxUNCG ԿGMZc]zTfDchA{؜?{w뇯_|y}IENDB`bzflag-2.4.2+ds1/data/flag_alert.wav000066400000000000000000005151041200563112200171750ustar00rootroot00000000000000RIFF<WAVEfmt "VXdatawv9@ltDKZ\ZW%<3'9;1`ne^k 4z0A .,#TN( w51), {nOUsZ?S(}  0_fO9B?"$sp[h<rX|U(T[ { Zo>Kt V> fHW%i *&cEv Ja)/S|2|8DwJF Sp  &Z"JY>B{Cs`kt$ K?p'i Qu,}X(QiO% XF3,-Y  36 1X|z7KL%/^tG7:[pjys zPD B@+SoSa;k-p b gvSQ+ $:B ykwt=&#89^Z#~_u'Q%?b-=:mG33 G' TBkpj ^ ^ c Sv&x/=J @Y _  2Uke:8%O>  pZ8k5| v   jpLcPv bq|   BbB k  I%_\vuQ. W  1m b < L \ w[ X|_  ! [- a)97s"S]NR ' 9i8g1dBkFs  _H ] /dhYA:8 6 kSW yrSq6*AHLHt 6 2 xlH H5`FgmV&M O \o j JJ }=Q\ R%? H k pc 8XIrnWX!>' pX :a2G1T|B @G`~Z 6z'PoG]mf?A^-o:!|.i l F~ W_  B*@'f0 Z%?o?9& W 7d 8NFTzd*Q nL_W{: ~ qj3,4R4H J t ^ Po]"Mӛl\ ,1=)w r&\6OGL$i/ ufN2~V 7y fz =r}j0[nW5Vx ]a }U"+c ?D vX2RH E0Z|Tvz22N" [!# *b}:Q[qsyhv}fH ^ Q?- G9u;0 0Gd.#H` iQ]RQ  /J~ i5IMO`,9q7X q M Hp gBP4j7:C2:y']V( xS k~, )y E} 6. q* mkTe1 }ML hOJ # -6(y> i gMJY ~ ]9E1ou(MrBeT;g@* 9<*/ w s0w7 n  U 9ktH e kX Z> 8 C\Y$ Yu MhGW* x >^YM\ *7a>$m2 9 o 73o+_S:! >OzONW)W EGZe I^~xc [l: i& j q5_ 1  aUy4 i-Dx3H +QR# %&d.% S 4y z@44N[SL%0yORO n\' ;8]=dZ _ފt- cۆ3) o IB)c[ P^Gar y *ua%O1mk\F0/ 5 ON!^ d5ruBIFݮG #8I ,_dq JO IS`$JWM\_hqݥdL28+s"%$*!q ;WcP #5qrܵr @I!O%&$  e ::8 N52gܲz/_9KOMڽk m۵:&&\'$$'q &6!J Op*3trF< g!c.#!+yn $J%G.* X< @wBm>v X._5s K q ]5G r .  l }- >%eSv $FB 9N1giS : 3*")rO+Z}-` F|XR4Qv6_R Y : ? H X %;&(UQ0|h$;  2 J e UI6XeQFGbp 0 Iv t L  { U;lu d h i3K1A"3+W Dao&( !&c=T 3wBL٭0ru-DAnMO %$.u2^018'>#h/*rֿG'Ҫ֭7mrwv/Sf '!/"543, 6ksBUшj9$2 !.#9#@ >y4 f%:jYҸeЋDtc[:T} Y#%,5O-@0E9,C\!c8|&>igWVܖi ͰJ(ӋX j W G8~$|.231,#m# H,]EPUr Yt&$3(};&<$9K1 %UY~3W ެ؃.5͇JWՆ4dv9fg!$h$|#N x!kg( -g1]9 :{ & Z ;gYH= "X?U]}<@/ w 0&k9 QtA}<` 2#Q}l+z&0Q'% 7%8E^$1L1]gNfZL 4 8 % M i=I7||}!>YrOfrMR1U I |WbB BLnwdߔHQaQܞY_UCd$8#y(5'#0&0`",,n'ljx޳Boz4֓mvZIvNz2@ 5! %)b*.=+.)-&0*!e#X/AJۘ+ٿ0%R)y]#+q&001r3.0(Q+!$v4` !2oD٧ݮϢћ"T#iˋB/ 0Q _! !m"8 MwzEg3+>ۼtdim7_q~  !!6)1 lq46b/<x>v"6/z1      Y'a_ ~ O=c DpH CwT|ޘNT2 \%h+)(v#S  }<}4^' s-"ҫxςU 3"^P,)1:12-U(f"7F mһ$l١JG]7|&Y=26ZT3PG,I5$$ }lV?RS3z֤Ү;> & * 5$! =9 R%DP+Eׂ؈ 8*,hl] y : j] َAbO nM 2W~ o 9jur&`,ݶw!!UW4 S{$&$;$ mn Bك3GZ'> o  nO  (H ;X dr;3G|UJ3Q + >S)b`ZQ7"A4C o'Th kXzh]\{F3\b| \ 4  E" ? ^[%^ +nJiay  q  2 Q&2 C|7XD F}- M,97 < S J3NI! h$P):w KAj* qV.s ~ tTzVOMeg)5\nGrm C_[=RFrߺ31(}=F)4gr!^ eaF o&)9 ;GeqT3oQH;| HIp]zI':)!x Dx~Kz S  }5.]' _QV;C !%+!@$;!H r#yF^(.y |+iD I D!# (5' ! U{:"ެ:N1 1 r_!|&Z(' #Vڵ*TJW%Hdp   < #z%% "  ZR Zo]X`[c lMY"`&X%j r& @NAUM8@|nIdf) 42Mmj t k izr;P\Vg8lZo4 Bph W o O2+ 'o: ^  h Wz)~+jy\}_ D xq -Uvd7MAFd? 7~ P  ;n^SzYF }jgDeiwn3 P Qm@q\c>2%U7  0 zH Ix*J] _E ,`R=cq>bU wkWkM  q)1 4QB.40Z6h>4_w7 D{T0_ LrdIqSsZ: tN$T K_=n#-=:Jnh%r~    hzh aFoln'8 }  h x ($*++\>*MP]$yy ~5N pFW<aMkYDs4Qm U 1 aN1YBW GtBcZ-0~ ~ x#YK2o ~^if?6k lm-vl b L9XQx--r N.Hx G/~ 6 G[/KD%lPqbmf "P"y5!eR? ^f; % 4 TlS1 p PM ?IA# %s!u W&+?7k#Loy$-&H$#2k{Q._|2c/~G `pt{N rq]wt` eyRT  9N  p(LuU}; qb {X Qg ?$ P F Kzi_SGm Nu|H2T!_@tp?7Q;]  K j/1-I)6;@7}n914  Q 3}A - K[E>._!)e[ q(bX pzs#%PvLnO;\ * +e9W1}1ZAV )8 8  b?( k]nQ>U * $ n 7 M !sJ>GTi?  @soU3% m'|$:cYj{qL W ; 4R 2dJ_4e4H v&mAW;m 1S!pm3"^hi< ! ),=)GZ"YM0 !UV8ߌs0%oG#!.#4!0)=yoߢкF(}# Jm**3!x4!g/9&vZ(Hӛo͕T0Q&3 %s@/+0",-n$Ap m24Uirlռ٣e7 ^(P*['9 . qN<ذٙy߻{[ KA8 <" ,' '] "V{~^w#g^ԗdhber ! A* p- *} #-2 D#gB$m܎iS f $QT &{2 f rEv \ ESD |jS ~ zb5@j6, `6rj vAK @7* -Kmݡ$l2, "s)S+) ? NdwH+{Ts@Z<$t .3Xs0$_&PzauKԊKfNM3 , 8<#U7 (kr .Ӎz˩GL,e*^cuP" Y2& =4?"7~!G'` ),{@ʟ͕+?[e ,p#"4;= =9#3! iui;Yk ^(~5#:$6$+}& 8tJV>ۀ*i (SK25"'4&.%]"DH ':ԡJU  6*x.,!$ bհz} O )>$ (*%^  wOKֆF.M@GVPX! t''$ \sNV,cAoax%t"(,<%0: pG6`pn)gMjX "l#%S7m YW>_={5 v  W=r n u!kh9P=3u9F SW7uDB((SbxIn: t9m ;!JT~ /,W&C)eW(k#n%!"jg rK;SpwEC}ei< &))'6@PT x$o$ێְ\W=: 3$**h%k! sBޛ'2% Tu/ '?)%& !-8~`8yJn($%!H [ c :\Zޕ\n\(W) R Uf (Y `G'ݷ7%Ke~r:)I | 3 mgr i:b:9Dg>,Um%,< F0 (99h- l~c<%N'K r` hߺ!'}K0' X7!V\%!' %%R [4'VԚ=6zfD '&-'."&G8zv׏kuF .GP   gy>3!x&1+)/&+V"u'W:H:[uJ O"#'_**&)4!#$\x y7v 9Ej 1#D%"%6!3 3*oC W:!z0 n#N {7)kY O |fT XH F^ q6bgb\Z|w+ {]@"Cu I =# gZcKF0{6 /z d > +"7z6VeB FY')D X feM){KI6 Hm  VZ XY"9} X 9  /- Q~&bz ]W x }R } JB=A]Bj z u!m  D O4J9-Cr%# zX'g !lI wfu4Nb?n.7 }+ d 9p v63y l?] i'  :YI9#!  gcA0pP(+c\ &(VnC'/#@ */ ri? wi  }@*>$0w$tmXqJa/a tr 'jR*st z^;R: ft  m7DbߕRDIi3U1w @ Y (Du wGVC XC%$ydM c !' qRbp| .\H" % U ; !Uj2)rKI / n   #a&@{{_!4 Z3 E  E y o ]3f;.9)wfjf  :H ? auxrw]v  R<yxr ~ v\,#DI:~"=Y2 RVD  K _DId W fcJ A ;N  Z tGKY~t< m   D4 0+@RE`T]r>  &{| : \@ {[Nm/<  x rc`. VlJ%}Ta  Lr#m }QbP" hx R] l$:Vg3N .fyWX `2r'`| uy= (L:%q BSR?py g M p  X j`H#(hU ( & ' 6 AD))ATmNNQ;o  Y :h8!m ;T C D D$Uq(g 5L_w?B MILD Tt-/ZwM^wZ  y6"#6  Y xV: o0pLEV: F csveqQ /NkG  A ZV/DM jS$t U1LL Bd mQ& M? i =N=ޭ> 8GZh @XaG H" wFRN e\u6|vwۇ*O s!$*&g$r j}TfMׂxN & _^"%"C+O\,B( e)\ٯϩޑ1Nb< "F+!,10|)  )hx\7e, `Z& c0F4n1,& Ps1%Gߜ̗/ (u3+3U4Yo- Xѩnsw8:%60oe4}0c%! N$d5GcG$g?`&-@ "-|42h*7wWdsˍխ H +tw*.3t42.! sLγUs}p%^%Y152' ):oQܽ̊ߺcMAw -44O-^hC Aݍn1՞B |M'D1 /4J03#?s4U5oݪjԈNq*Q bo*[0`/& pMܒ/וfR{I")X+%i o }fMޒS$" &"n&-"c% M-{G|Kyj-  b |5r5s?M;+ i cA 3 e~%Du@,*IY:   K$ }?8q=63} B)O ^2d!W R [ q ) c{= E vFj s/ uu/qk]x  nXv EF7&ijaZ&rt]jH< N `"4!1# Qk߲%jZަ+  M &z(D#f7zږ.S 9{!$w%o+3"K.Ju(?[v]ڼ͍eE*O- k$z&t)//%b2F ,> $. NtU N 'D(1,25(6oV/x xz C=}1zGі^ ]oJ)A(k.3)70^ !*"GkּYtѭ2 )& .2)6/0 {Փː|$r(n!<*&,1B'4 - S1g ڲՍ7ڏJֻ\ $T+'+0$1l)lJ g  H,3 el Z',"'*.$"-$@_q{ּܣfߧr ,~g/(*- *b_%Y݅ғKf܇J#D0!K2+^,t.!(Wa 7Z:Eӽ:,b%1$2,,- >&0ߓ%ֆРg8OF &1_'1-#*,<"jWUw׿Edޡ(0 '0(/-3'*n   3G}>0.Bp=7 L  \+{kU  } bE\D5p\inuu u" ~ Xm}Z^~ oh cRA (B 3 9RQ#7^R70" k V OX  !97~HeX0t ^$ F LK n* jRc kV {k  ; Nm}|: 0 w!gT. .cyZzh/$ [9Μ\մ*-/ x'X13- 9 Z6ߧIi˩ ·؁B9| -5Gf4y*l vOO̩\ZGeY (o"4m`82D+#l N+3&]0Dw'V"% 019$:\/ HC0AJ|=Ɲi",~< +7=9l( Su6LŸ@$X t+9NgA#?. 5x*ˉدW T3 >8Bm:$uK?"$~P_ )9rBA2 Pr2ɻF? 61#>>C_a<' =Bz>jcc; ϫdSh&i 7*A@Jb37 yMnER,KM |Z."o<A:2(q =zݑ93w$g/N ,"3 >k=#0  & ՜ɩrfX&)B7% k %h mT[CGp J* Py! n TC07@  y -8" n C-H;= 65u 1M :Y s 6 4^yGFG, I&SZsm eD _eFI - S gB#'ly4AIO=MQ{ qm   5@B\9 &Y # Z83G}M"iI(8 v* ^Y )^ w_]OnC e UE+ 1Om_9`Y?} &KI ). ~ \iJrsr[P"KAP7 j } 8U 36CI.NWo U 5 -  Z HaABbA4 %%   l i Z7 mA5K  E  `0_?yڿ`| 7 :" A?mI3-70g4-)G$WkE8݁ղL bI { ' "( * )") V,%Y( ! 8 1r' QEk R.&82;Z wV|CSr/B%o!LS ݧVK i$+)1 (c2Y!j, s92'rl֞ IQY*EON"& % Fo ?&jp} Fr `wtSa: d$"%&U!%/ 'K jJ ͡ϷS  }/(8.A9.1($*v57X>^u:`2#w@q!- 4}%61)%al&9tuԡݛߙio6yO6+s(1;,3*+# A@ /&~։;! wY 8 er fVi ; .|\8R l zz !^-,H#3n)5.*2%T+f Q$WX r:| HkAS N!xj_d^' ] w G rn V Q1R*I54L  x2xEM. !  j @ @  u,:2EN7sD&'$ D\T&>}EEX9E =pYg r""  R|ez+'BB$ r <*I$-b$)!#l@s Y/!{kJIa l 0v2(_ ~ $ 48[ d0qʉڱ6$ص 4Z'!& ("'"Q#A wSLP ouiڧئՕ5F RY l  -  6p3M/9YQ; BG[b4M} 6Y5^ V?<e@   2gi$, {9 > BX/ I %,#" S#_e'1M$ :o"0ߒlf)ۓ.]|b B ~6<&)()J%LtO!3 9nq 2HY6$J0892>5G, L|GOӌR+c#~Қ~Wڧ|8 u-"*=4e/r?v/Dj+@#5'k ~ y>FDClڙ>E?]6  =I@Q( eNU.C K& U = -;H` @)27Q6+*/E#g !ƚ-×ށEiO8B>`'-.){"ac c?q {Zc488aP#N &  O , S&'LVj+ pAhp /,7Pwlٙ1J4c V 9E#" bv{sd5\pts8 j [ m  ;,D&+\> Fsg  ? ' HzOixl5 R|C Ln }_}RxS=F <.C p a r( &  Ek fT+  j >h J C] p5a'/ f+s#F P, C<U] I<t X _ TL\ &bo-zy Ae[.(8D 1 #! ;6 Q }!F )g &9c<KG".s5m $,^i}Lwxzb2 E~[\@y<+ O ^'Gn':>|:}U p g&)k( s z  s18jM |k>T dlU:Dxj)@NhT(Gl0U<<%  =}"%|#p'=J +Iނ$%j) S}IN W S- /Q WD_zb0R b^ C  !XH%~+m_u gLf[(aA#"Y:6+R }N@BY=g0/b / 5 , 0G M+K p(vhjYm4=" >K+*m>bS<bZ `& 4 k AxkYO"+  q Y|fkaG  H  M  pjFP B>( zq)#61"+u U] Z6 m H="p5s>!c6T )2#jR  re9 k?ElDP3j $9{ @hc"yfOtY / w 7 fXR~0@ Ul\,q #. ;I EExn 0y)' Q 8 ~ w \\ko6S 1sJM zph } lCB'Tn <,vL LSl( W 2>d 1Sg( ..(;q<2 |  n Z""(@?rgk3n߷*f5 3 *T"P# 8s 3.@ >T5r48G\a[E  b \m[_vaE ^+"~v&d2 Jjgz) wY$e zg.K *  _=3( K^$y7Q7h0P*<w2W~Y t "aG{eL ZgY p 6Z:#?`tZ^1ve,2J$b -D!)C@{2S\/e`8aZnK9+ ^~0i K yh,u9  J{x:v1 N  s18 SG{ ro^eLT?S$BT 01 9x ?L _7+O 3' h]l Z -" g8@)H SX bD& Fx iB + Jw D  pvnC#yJ \"y   Y_sn~ߊ,3 Tf* &. -,!yn]q؞RѮV]O=b&x1k6T19"taVjZ+צR~^( ]6u??\5m" C z4bq ܭ9.)7:ChuB^ Q6Z# b "OK܆USt '70Y>$D<%0mxx [ӗޜю1)ޠ&F23]7$*4$( /W<k&/'%#E֏tN XX& )& {t ~e@&seW]1 P%6 $=sN Q35A`qQ7" ?#  38/[ux%[ & b]>:y #Cy P^\7AL , ? ).6YNO.LM )_N ]  ` FzBr(';W0h -c !n ]MvEw O7&oj_#p &$c($Z BbL۷ Q20+ &h(#*`O :4E])C܌uH7BxQ N %7 #,g  XDK>܃W@ % % $H^q F; VT41}S) d$[&!vfs- l*Ak3] 1 j @#R= 6: qm63dvy3  =rx 9Hybg:( M 0 " TOS HIGlݬ{h  ="8( _(V! xE.uۍh"+5:X{ 1x&c&)+% ?Gk 5![6iܲIֽ۬oݦ= 6 )"l'' " `LAN90/aq~#\&$ #z n*fv5?f;WkQ : "L$߷H}q #A\&*'/"x-H'H |lKsge/ /G6 .'(i&H>  /xE0a3CQ.\y"8("%E_ZIO܏r">]/ 3 FN ? n L)k9 = rY:@S8 f a_f+RC')* ,F - nrKp _)7 57!  * :EXF -yWn q vZ~ / # Ql`0GtK( / n 9t}U9 G74|+ INBQrKR}e v| -` oM4_X:$N}]=Kp3t`.Posv5d    e . j.Vex\W}@xP      a 7;t\ x P% ]qA 7O4RS! *  [cA l t(\l ( dY7N `M! D>NH 0` 13 GME#o(eW: G<{ Vt/$ ?u/  Yla Qp Q EQC>dg >1f ( wBGX^', rb\ R  $c )k I f M I i 60su+ @ ./U~]{ uV  9@= S*o<) \ X |rIv] qy.0Xs "6 ߑ$[(.5}F e 4H&@dZAr14(tmr }7.s>  qat"W=^!_5 }  `MD  c   d f^}& t % < bu :#w|1["e & pOV5WKz8+Tq " q"z K ?9DE,ߢ]{?f4:+"#%+!'0$M T&ߊ܍:cfeԲ"r  `#N$"*+5'R 0- =xٓܕݗ!\ N #w*}!/.`j'> #r;lAި2/hS a # s!'"5140r$ E([ Edؔ:!~1.?6a6}/ X Rϫ M,_ &^2I67}4)EiQΓɅRZ5U x+3\%4-  W N`k_Jӡ85  $J%/1'.i#o bht$XaON}xW  1C*7.M-M%  132vr X q/bLJUsc T8 H "TN+ u8< >CT/   Rn!["bn\D)_  {Y 8  :7 C{ZRI+   T riemIs}}iq^ ~ -W] %4bk>Nbx@   {r dghQt2#X5>~eEp! ! g QC =i  !DL(3R`(+ &    $& !AlXds $*  J! TdBfgM` B O G%TeO$h D 7 /@_|]od/ ~ e Dm:Kj M)`~db "  q F ( xV~ )3:IpJ?L $ }pWg+Nn {WH%K +:F  WznGsپ 7yI!r$V$ d ޺:C_-,J"U!\(X(g!\bI |ّCӇ Fq)A~J&-y-#1d۟s}Ω60 >4!<!();) 1 0% PQ >ܭj4$V +,+4"3'fߵzP5Sl`ڌ 0%& --.,6"_5)vT՚O<ڎ[AΛ~\6(A.-,[6"a4(S@-ri!׽ 0*/,,4P"$2O&x5ܔ8ёLDif5`?!+9.q++1!M.j1#,K ֫ݫZѼ1֏Y&#j,-V)J(q- );MB` X-׀>%fe-rp,&'%("G  2%ذ1) uKrY4'b- *&"$( %}{gګPs\y >)N-P"m)%![ *= |`ՃYߕcTJ r+-n#K(#Sg2ܣPn0 HF| + , $&D"K[)<n=ߊ׻7L k y)G"5*t$a#} 7B #3ٓ}T]'&!a&Q"+<ZBuCE<#!mjOm S/hg  W;s gzpcGOOD84 Obq1 7EPrYHr N^PAa<- %= @Cp$ Eq F 7k0v(Jp!][*, Imsg N !FOPAJ7#/l  + [7-CPB`uTOs=  w  R7L:s'UJ\   Uy# &x@=NxQ O M V'pnTk D  4Qp4* IWNW  j}3c YO kni}; 6 ># Q _U"Lfx EGXE7 Pdp, ;LfEޫuڜ?9/Fot,X/R6 s itYM5a 7n"$}w"piLD\-N?:R=1 U5$w((}"|m ߴӄTϹQ O"+-!+e  Fzזmu'Lt 6(0'2i+yjJйbr_D LL! m!.y59H4) I/nɃ1wa)5,.9oT4bo% '?ze>:Ȳ^~ X 0:/S;1_vS @\Q )IJlXQ@(!7=:, s=4QOixB 00*s/ &D7G@?x3 rC;`,Q5_I֜Y .oL<'A<*Rʙ{M !)ݷJ, s##5E?AL6e _ ma P8Pa_Ee+V9c?=-| RFv'O=ݨ!   25;=w)5 M!l#ɪij1>R * )$f7'<H9O F+r<.Ǯ oBNz 0D:,:b 1s +os̿oAtf' N!R /6B3(bs x/xTۜktn=$G /83, p 6RU\E`ok 9,N l2? . "2 ` c ߍcڷ8IVmTDF",6 J/) T 83<+ξ#%2}& $  ,  7%UWd0\Gbd"P&t % "3  \S:D۠ T^)a,8* 3Y 5} ,tsL" & n$ [ . cOp,k53d$T>"A1 r 4 7 7Jqi&I~ #q! 6  G0o{G}o ( :1 lK:  x%<nF L l ? 2^ 8q3[8" [)  7 O  l {$+;PH Y  k  b  5" CB rHkOv K - R S VBo|t .Og ` E' DO`R tL(Z K [ < x^ X9!T`lE p X \@ > .I ("N_  Y  cB +tfYap < ;: H &[%"|* [F /7RSa 6 E L,HzkIF%5] h G >!=3ZHx |#Ih C nޣ~Fq8?  DO 3{ D  _2 _ DO2A 6~ED U\Y#'^%mLX#iCl [}+"&(Yn+ '#! ^Yݥ7by?Q+jBSRGO:y| +]Q  "m g Irc.GVq"Ѵk#vh J#$"@ t 26V ) "[]F 3+ w ,r *{9E:z,|Lf"w{ f m K 9i-vjφE*aS0#$U\!  MK o-PA)ZtkRb$\0"T2:(97*2#N%5< s]1>ȢÓNCB` Rb U( s` b\XV,yAh 7bD gBxٝL&խ,lZbx  $g4;%;X-:-w3'%I *Lra"@߷ىu+ :  l x:" +EAA2ci K.Q9U> 8i!Or+t%/ x+F#sb WYR/s7۟ v)[e yXl7m d*y  6bUd}  - TopIJ`jnߎ1!xLT[ #$!z0 .#K6:Qhse{6,j,Z R _ s %  S\`0 yMroRߥݎ9J '*1,1:*KUE00\@)!L8C6\G ! .  $8 t  K/TwW9% `yV EW)~'2u*4&. "N D<ޏ>ҕc}HO K !n"t8L iMVrafj$߆dtu h ~)5;"qF`-H0A^,2"DS~=x)ߊϵщhVGO:1 ='/u-5, 7'Is ۅ?5*d?a_Q`rDS3L_ 2 $%*N+?(cs(-}_r@ɺW6hm*Yz /#%21 .718055M*-/$5f #3Iޜ#Oݚ rdX:Lq NHl x> }mm v  Eik1  F[E%?D2 2xB Bn N `* 1pH:*"YhW<|Bx^ f)=  r , T f\ t:.Fh#^((*'y lDBmTנߕJّ}ީSs '7C !W$8$ #t"XHY  t331OO_=J*^Yk~ > '#C'))1%Ew+sk~%?ʾ=ךhY^T*&6*:8+6n&.-$WN =S=V]ڢMt؛]ܘudK kZ   AKR*1 (G| JaG}Q 343vzOS( i 9$% .g  0 8 } `'S 3r?X]3~  . , V 4 I\|[[ETFuvfdd[:  - ! U25b' 6#h? #:@!<5s:*X % y`Zq2ܸ͘*Yjq+%8(*=)P<$3|X&( DDӗӱ5*^DaM e{c_ v" .j2tNn/[14Z UC Za5[xQk"LH+@3X r!q . b{ MTݕs޶;f~ s\O pR|KE %xn(4tF|p  J ) :  \C0 *Cl'G/  Oq^ L#!xpU$G \ Qgvb."U%)6 {* T f> m' x@s<7PU- ZB}z  ]Nw,q3.}rLQy\ pa"#]!ktyZ{n>i P~ 4yc; ~aj6 0_Zb,DW^b _# D*[awE1%߬9eaDM;kS 3 -G!} F%EQ U=,(oW - !@;gop g8&n5|x~} ^[-uP H "|~%WM oQdYyjT  !r_q d hQ^6M@^߂.zY %   !j> ] ]S@Pp-SALY)BOh` y i S+# !EZ }>Jsf=9 jnJ^~ '  &L>G>{1;'xu"^Ziu AR ,o@d\b :Wk<_W#(SW / 3do*.cVkb   6j0  >T,X1H(CW    G E p> x:_ 1C,jeD>N ; cIl~ݒ1'` 9h<`   ~w2| 2aeVZc{  4 '  u  FKf.R]$^CMajz~y@s; 1 6i{OE $k. )(d 2D m?Fn p lbh}Gu,` krwC /  HY ?i?^Y3 `2G/W ] D   ) (+Wd$AK S6 t $!c^ = hcgQas ``WWa]" w 1 DyJt))Q Rnnf=D1/MiBPS5%]D !t$FOc |Q? i/! 5d%wB  I ( 2 g o9* XjDED'JB/ t4 $/&R3i bh 4" +%g B>  .fE)\R4vd F7    P!O /$4 #0 B]R)ޡ|O(]3c 5$$N!8 ]KH*>W9.ܬI p /$(1'o&=j#!><&> , o ث fO (JXyKXN] JS^L#$7f;)v ;e %f^#Pp <#L6 a#&qK ! K:bL Tz)uD $3 Bh! = uMafY | %Z \f #T*^ R  fQ,B \c 0S oa]eT C )~ cdpp3~[LiE ? L5 bBq]]m b ~m'K 6Rdp a  I )   _=i63b  kKJ 04wk]$9ixI U =W|"#"1 v9 ;FIrP:؍޼* kFK"% +!.p*<" kx RzըO߀j{g 1oN(.M- '~ /^2(ذқ?[8d*#*+&H Z+w%GeߏIݠ5MJV-  c!!X ;U^JZB <4v Y 2S ? g +9yz'. ^ x 8^  | Mv \X F f@=%v D9SQ"( *V)$K+ۯj9 1o  *@# ($U tBR6f v] .Z !=>D bSim QY NA u<{ &J a lj _@ >>Z 5 VpO-] Y  uBCM` &%b\V< +?,Vj' J d U F 9fdX 3],$"x Rk@}\t% -m"lQ @C [}T^ծoqLuE`qC 7z" (+"%~Y 1ވѩ?Q^+avc f$ -33a8* Eg-Y)vT @ru*8?=u%1 5ݔш0W ΕCC  )O#9h8APp>I18:$<]=b΀7_5?.= |(^5:W;!7 ) ; eoֱN`ޜV8' '20U1+h w[QC~41u:zV 'L+(&#gx^ bV*% ##Dn2J -ݰb2OsIJE! %$^ 8&8 Wm$kiZ߿:0ޟuou8 % !'## x޽Mm1z (!S#s  kdi c9J3:&/r=C; #D "  U4 # 29wlR[2H g# !  ^ + 0 ^^O54.L ?!V " *(M&~M !Q, !ݴo52{ )+%+%x^CaQ9eB=<8 ?$ )-G' Q k2PuF{p^?f! ) I)!< hp K ~mV 9  % ))T%2# 9ܷھ+Pu &##d. b >*Q ep; "?!eQ & DVk3 K$T ^%$m n^ }$ٿ,0wUm B (N*%Df:? [ 2D*کmt O%U*ow(#!#v,o V.i!E*@ &|Y(!%#$ ;MXU ܌D1ٚ7 &%? %@# R! SKܵf3 >P"!n!!Rl4h`W)H3Y5T b  C:bo5hl+ }Ajb# q@=BRd(,k +1D!m [3rQW/ Wh  W o=( X.@W(=Rv  i Nuwz mh c3?>@?n > sld)yPJ:f1.ic "k v&#f_ zfYRb]|ڲhghA  Z$#+#+%1 +"t# T߂տLבd2 !-&+z&.Y!,)% 7QZެj&6pfw #$N%+!K-tf*C|!tW#R2V8P֪PT %^#'`(c $I4E Fug;.nvfi!# "I4= [ېCj K ! z v2HS-T77K:܀Ap f` #0 :[#z%G  =uC w c+ f6aA{jIg=~j7 jq8 hQk {Zr[C #+O %q >,@N>|fBG. *IEf z> # y{ [>m PV5[ c>c 1A!$ 7LzN2  U| n/aT) c#, /+ ep ~c<G{+ NxV| x $W. nOzSbpa`|  4H &'_kOxF s*9@ ,k^5VxQSl} t-T u I>E F m l3y\C "'} B]9% -i \'BIj wfL! - !.4$Jfp^'vjz/i O UGw pX`*_Y5.: [y EQ ;Y 1;+::W3ER ; %*C 7FE L c !8  s]n`Ig(U*S nn:6i&j>H4<  /7=  lPG%pNG[ n % t8 s Zq 8D*8i72|&P )ho fYxr@wQ@^ 1z&=wRjs %x+( qeN)<v 2 2 !  Ik7q~<LXn=`I, E ? cd!M:}P,1;kmu|g*5W^mu-J f & bWp(%]m,}O  ( N)  7]a g8ubZw    nK z~ JT8Nik h}_ 9 j T ht~*  b_>X  7 "fa!xMcW 2 o O$P p ! r ߺfMB7 Zm-Vs m b# Z x K4'd'߇w _ QIL !#k6Vkez:"B, (D@p  "l"T%5i1y   $U B$!*J 3yQZr ncvG$ JQ#)$WcmbY,Vޮ[ݓ, 3  z * !B%$K/QT+=<۩5 L "  y"+4%g!g D%FJhH/5{;, "@"z| "3 ?%݊ݞ4#O\t: Gfwx| gepzݲ'`]JZs Q43u0S>pWW ]t*[ \TWHohAm tm\W`,v 4zo.i  mOVp3HN` YmeR<D  + oj '`\tZ'g\ &| Ix B{  NXEZ(q  |`B G{bP::FK`ZV* H&1P$ }" V M= -&-o);=3 I<r"'( "eln#BDL. 5%%!*L/,"sLDagtl@*!)3[5Y.L l qb:c.93m# C17]6\,'Hnν߳77?J $hD*=5572L%<-fv=uUSSu۸D?C G!/55c4+4R7q]cλP  '02*-IK @ ; ?_)չު 7~| +J/^-"+ )[ 'jt֔oVPd? & --.$:BiSZTh  ) ,C&U; @ % <\R' 2"'Z%i *]pT9k(/zqy!W!{ /!_ :qqNAU ` =8 y UL*g8ER` adKrP )><g>"K #qdR ' U l iF7%Wa56D h 1{N"4fw3jX+(N] RMZ8GZwVL+k*]c w u IPkJ,V:}   j zN  MF-#I,d@E s GIx ~<\\{asi  2 dn a @!z_%}E_qM V (  [0=0La~.S ' FR S4QoK B zei\ZdS]f! 2,6jDLf  b\> | DG jzWt_x~ I is ~ T o .p @} K$ ]sM ym   ZW 42i&QHAK,s  TO ::^IC5]dzh'V J`-1_ E*tobJ* G(JP I! z#7۳vJ  {L\#8>$Y "i O > H h!%&i f*+߱ ){A]l >A !aZ#k #'(W V +j%_j,Z%,UKU&A Y'-%_ .L cz;dwe;!&#5z o]t67RhFKnm _#`&i!Wv#9r|`&>Dm 9$/& u  ޲r]R b|#$up -bRoXjߺ_o: f 7#!c!wF/ \&a6,6+^4A~$ > n6gn^?=?CcN /Y{5 u!h&\Ci)X}f 4ApQp,x `g "D\u>>(li$ % ]~ Zb>wF?u  E S [aosRuaI tng]  B a:tqlY{? 1 7 ]I3f0qx;: ~ ?(NyxqQ,   o rAPT*s .4> K Id^c% >A VW?o 0r s  * 5@{}Y`  "[  s((]ڠ\M_C n:2E!>! x =B@a=~NAhI| '#\%# I VZ>z?3 xZy]EP|U?h ^A+y[9w?9;*(b=& s[n>m[+ 6 8S_1>! ϧb/Nc 7 -1!53q({G8)Z|q*eɁ8  ~(3r4w?,DG R o\A ?_Mie A)0wj/o&yS bI-)9sί K%4 )=O#  r PYtv+  F&5 )q$Dd 0~ nWA?4E ]d\ ZfM ( h *-B E # A' " y m $ e9C;>Y2oP:DJ5 , ! 6p$k[fG(' +-f$\ e d _w4[5_R SG *` Ql"+{@w82:8`$,]az &m!>^ R g ;%zOWgh 5 C}  $`kN tUN8C;3`o ??q%KM : N } H? WdPAp/!j` l!<' S|FZ>%6 ~ 0 \  }J&e ,Q z9vft OS5r2K U ) '] 1# )zy&G' #tO.FmJ5 \ V k: ^ Ogv -,k57S[ % E;@U{ )=[s:}kg=^\,i \nmm %0M;t6c= @f O 8;\%8wN>&'D! yuA8 !"p   B JE!?N~wG Z\,2 0 4A<yuc P-4]!\'#!YW9 c.ܜ3~@;Q_c _&=)82y [ b uNZ l~pJzui*q A8 d$$q @  y x;pq14]x Oml Q qxLRC[UT h $ ) BBuݏwPq0u)F! 0T:y:Q#2##@%ig@C|u jsu],E koqxRB?~D/ 22ې9NN;ܱp7(53_670f$& d#A2 "(Q1cl[)Z& tS I }."#ZP# q R(9 =Y &BT;"Z$]|rm5  5  qj h0 AicH1-< "u!8l=J wmހ]zu 41:i  ; I ;% pN&W' o = Gv F I~;zE wtBK`d ! S #"80lS?-|Z %*7)+" IM;*hQpE2y$ -JRX ]w f 6b80v= eMR zfP[ $^-!/g*': CX*W>dPy3h%pS~ = cd d R o 2   2 ) H Z #vVچv> S\c? fp r' 6 z gMK@b;S:]$ RP /.% #N.n* 2,2)-g"6# kBs0 ՘b(={9t a %&',\0/5^/~57*c2+"6+ 0(4ٌeOԞW'gr *jO 5 X`$d]ތe'~;? *6N ^r6T% 3JAgY::;}4 'oZ f BD+#us?A=hSM+  h [ $ E T -_wL-.q%R| wj [ 0s `V)B   M9 P X)c'  >A\=$ig-5'6N 0iw-*^%w1'$5&4G$.$X {h'ڲ~ϤIcɽN7Քj i!=('M0)1'-."G$oI Y 1v9VG)3QBDRۿ;[a  lYT #2t9  Pٗ91*؆ c G! \ 3)4m(&l8J\]  1 q& bJ<_F$lpy9f 9sm\ )' Ui w9~_? 7_ }=^ o:AW` # ;!2%%P ^ MCr bS>j M,' *1+40 U(!#R|8i7B8|L&)Yv_^w21W9! "$!W$xQ ri"e7N07U)$!8$##)'!%Ac p N}X-\޺2x   "#Ii n% 3C"KQAf4u N+m  d )z E/3߲ =49 NaE @"v.'Y'$C3 Sd?pf"eرx5Q,+ EU 3jU"N!& K7z !hXfCwk$ Ya s)v"$MB#L `YinkjZ? <  * _ W Xsb34?7>"9   ^ A _ bG&V >X$!Y_0k=,hZ7eo  WR8U Yq8Y@Ykk ! ?Pa )+iqq*u2S:  +  3> -x1\%x6]Bw<d R v V WGd4EAQP  3!#> T" Yh=9UE7T^) &  : "  0 ' o7UP1iqGQ9&~w  s   _]$- E /jT_D +-n3"7 ( #=-+ JF iCCM d v d K  yb;gV\/WD,]z/ Anlf ^=s bKz2` 90y` efk7\d Y#. J^m`oYK8a$i %.[ [NCAod~GgFAG$=} Uq H3Q(( L #l|C o %47 kJ9, K)r\"* %R$^D^;bV޵TI.o sw    G$'r&'0! (0q7N׳ٰq~a>dV$((w%6 74JhKH;Մ_nj >wA/u/l!P"\uT_ x | V ]x>s 05Sq} c ,DGz8 %# LR"Q g x" y-p lJG5v%:+ml X ^h `8Kg]Gt+ @ H7 +b Gv 9)3g7<'E $ m4A+kBY `?Lc VfuApsr f7C3{ 5F9#4E X]`( _[;# ]F;%nW{39#  m O     _+:NLr  xp6-  G1 )},j3R  b  2mtcpAjPe)e 3 aqi^ 1M34xK}> } #0# '$' 4 # GNbj I߱ٚ,eo %/ @) ,/[( vz?D,> ר,ڸz Y %*_("R u L7R]ZLD J #S$f  5wtl4d-eeS @_dw=)# H v,q*G iP߉# 7 h"6% # ۏDhrk m_y"7;)i(*g#ht7iSgwݦB C vb!" $( bb !wgo?Q xc< M>#N ޫ ގ"fG5 a?\E (dDkF -6(,1W<J Z~` -0 n UvLv Iq  %| "nv h<* xN , ! g 4G:kAjUf! RNfm9dW%sڊnsp.'DA^] & 5*h%p j+7DK/ѥ(ڐ-5 3#D T*`0,3F+   51لÛrhzݡS}Ei~- 7=~=1K,I R|“/<CA63< IZy'.P˛u1 ~..H ,z;GNCk$ @$ 2, d3PuEx;nϠֺہF" *7!SS cXaF%%  * .c2j_Q;#$ G z  < %d;) -cO :z!Q G$} E"o+:t G:_U )LI" O&*#J!r" j'qWLEziK$; ++)V"HQ< c}#}vS6yF" +-['@k:tPA;ݩB;t~ۅ@ T(` ,)}-75 ؈\٤QY % -J-Iy% uR?+=;ަz 6=&)+'K* ~ I5%A9>߯zB $ #'/%:| 6'rkfSf3"1{KJX #f"pQf U]^ݓ%xܾ ?x | k&&:V[Rه،7@7. "%<'Z o##ic! JWV/]ָ֯&'p{ mm _W ^31M;0zb q B$QG -,E$u;EF Y X'  trf*"9|wD{" Ty4u cjK[c] ^j#&#%hC9 7*ަ2c6C|%)&,!)|[!\ ag5=ܒ֚ڲ8 #&'().% /AL*BWۣ۔ !$n)Q"?-y,%Q u ?{W;ތڿֺ'Z7ve/<"n'w)& 3 d"\.s@ eBv*TT "c%R% &,q .P(thZٷ ^:lv{j !!VFWSqܗR Irj3Z  xaA7 K !8r'QN@r(e \Kih J 6qGTnH%|?3 # |,Aj d",Q kivDyA96 ZO'1@8p " G93qn|+ UF_r/^ db(Q  77 @9ݬJPF #! ~l B^:Rri dk  @P{"CUq !ߔa  G*} K{  ~`Yc_Y 4AS6 Jwu 5i z6E-;6y l!H"oP ysue3:|q.X#)  gzG!#2 : qpS/?vu݇FL8{ s _4  +fGV (<  cfF ]ag d0< $_00 ?/D * NF. +ES  `x tfoK BV+   |f Ef I?YXMq)|$3j [ Bu Opl( N_ C !    ; [^x!(6du2yrdS   ;rf uZPq=/AXd>axU> B1 1%o#M> e $ \   CHO !lj 7qG =  jcwwg#%%;tut+; :{<2}|}-5Dj!gpY` k{x"H7f>|7 ^ " s} o5{' P&$k   H~  \l  _-}K/4c uA in  0 U| GP-[ b k *l\ TA B [%y:W,w sD%Q )MVZe %0I 7tpg"n%> T#FNn)N\Epڳ@WC Rl`%(H$i Lik V9P 6 ;?( &d $(m"~_O83)s2i c lr# (,' ^c^\,9ۺ(} e! ~%~(&[6 WA*_ٞoU fGp p;"w 7(z(Dw#xR<ޘI?aޣv ?/\ $ )V_'( 1Y_hj7q7' s ~  _ M&g(-$9-PbK#ޟ1>q Z (BKN$ $ tU lK9\b L& aW!z 2 JOZ|aagTF 4c97A+P}}J2Q/; 590V= @P + p n}HK5MB* :7WR& 3H%_Lz^ 32kbRuC' 8(<5WS YH; N - U uF9GT 9vh5 X L 0wh9s"I= ts 8m* (A "GH*da J]Hd s UnrwS!~NU# :A ' ~&tE'!/C|n0fv(+|} F).C+t!YX޺۝IҌ_f  Wgh)34.. 1_Ҡ̋ ޝN < i"o06tr5-,JU%sݡʦR\#y= A+o)3M6n/2>%%>qЖuI N-3+3* B.'3H[ЬVZ M&/,1_,#q vmռ`G@M= *.+o |p\<_GV 0rD f&,",i#"uT1/inو*zܗN ((S*Z$** kR|Yg7 D"&'}#4 nC%ߕY%w g L% V ]aXFb r U  h B8Q@h:/ WD D6 {Zx B g  Z kE Me=?ho }'*M^vkhD\m & p 7~XfL-1Wuy   =_vC8gWsQ! Sb D]  ~Si; C>R  c8  [n)U\xi  v2  L]Z B/HiW 4Va,Of 2OS) )V e@&["5  - N 'P Jth23d:{r{b39TG{?r)v ~|um }I Ci{|P2j?t_mi P {}tbcW4K_p] mbQgU o~59d!:m z:?O% (Wp-Rg-7K>yUXru-G&) O- (Ic{J q}ߑ܄r+q1obu C#! 8kWܿ}h7[ $! &#$= $ ܆(pa]LUg!$<'z%#9*&Gv]?GӼ"=`"n&a)(%-)i O=L54Kcq)a B'f)(%.* Z*HӞwߎ!u"> x(R*2'%,g) G >0z߂i98ױ^=  q(k)$$f)&-ٚ>i-1# 7 &'C!@"$j1" _Q-ܒ9O4$ h %]$^|9 ft5ڟi\s #4h!y?rzV !i%IVB' !?3jc_e X':DPqb;WTgKz| 0 &&nN>^w U 5I-z 'Y?pX )e42!R _YDf5Bx\hf D /j  hwMS  uS Y ]LN$G;^tF ;! lo  <:f7e+&1{AKU   g  1b^ 0V0) e  Q S2X%Jmkl w/vd`ARJq84z:/S s>+4G9}O.'P B 16IlbM3S/0K;d S" 5[vWS(9 e v {E SEl 1D t7 F t 7 wYk/E5o p -E2 3UWw7Krh y  K p f EG J{|u C i5 }} ):[B ghEp 3 L~7t$%<| {rm!#(! Jڈ֜!D? l t#"b&;&  6qgߟR6Dg-tzr VY'9)4'`GX /koӐpLR!3w o+&b,,B& !nhեHdMԪ.ha!J +m0-~#9=B5хDj  &e%0XE2:,5 Qu1|LB г -G4:39);ʰE{.> 6)z47)2? #* Q2LߟxxUɟ;"!w   08u9T/^%[e]z˿(3 E](I5@*<09 *j{=QCl&]/:=5 S"/s^LMiD=Rs= h%IR4<7<9/$R y9șVͮ@46 &E2[9|5I& yB-9о(xUYN R)/36C/hy~nʜOHޔa v1!N=/5@2H%> v-NJ߬mUv}u|$ V-%0+1% g.BB3[ځK:bn/ (| ^' 6H vsi_u ""R ' & ) a P6ߤ`ۮP=uD (6@2dcl(@ vc e# #  RG+^f~-8lEw#UF YI O X ]}Bz( 0 Oj OvXs1| n  Mo`{xAO DG.}c 1j{ | z9 S  0z) X V\  s-M fV(  ei R  aXmx pk   Q % &1bmYmCvF n+ \  v; D9{{X NF -  l" of\ `{: $Y\kz 0 d xji^ d  c: Zc#4=wt A M|,2U.,3OVx; '<t ; .? kdfwuM $j. M2b5"`o  :+ GbUN _l4iFX U o9 5JC*:b T > Z , q D+@ ]E &ZC"_ <5 523ߞEԏex! "\'&}s6N W. !9!kbL 4. t3@GH  "6V)t$:o T-"&#pq\ kG5N5#D} =+A aC $JDBWu Qe"gH10L[{0 sm'"*N 8, a RH/Z\s9.hOC h TA|JB:u ^X 2!NC FݶߩףOg_ja_$ h0797"-M-C58|/҉PD+; eu st+ + /NC"k!$^! f  /X${ߪJd0y(Kyl.&%z d.314-,$ s } 6{#}%y !loHZ*U  $P%N!M :CDs"[IIYoZx3? k!ZdJ/c`h39-{.e]*ߏN$@ y(X'<!y D fx W *  5  w v6H3 j ;B &8~I NkL ~A*#$ Q!p < R{QQHD&EF G j   e}J=%@rT-!y " l9zsk+*8B i k x*eWq^9ݕAVT>  !$&7% m5 9Onu*'U05N&wTߖ,\lD >S &S @ WVNu{ P1\Q'   =+%,0:tbC(9;[ ' W*5' & O McZ H %z+zJ}I  8 `O@u/.    _4Hl+ݔB۱\.c l+&0)1\'r-!#rZg`KRRM߳ڻכӄڹ*v_+ !N]y & ,9&R`c*FW9}1ۇ+ݘP c#h%=0%{$!7|c]]/εwУpYфKKdB>#-#'## $" ?\fPkNMD5`AZEc    u B Ep   " t  : {Od61ue&o wkCPB@| ;LMip3a' 7wQ (S< 1[y:J= K  8gc] 1 Zu| BN6_"A(1hT#-33p-p P" (u1zв.ɪƞݒvӽ<8tm"&1, =r-B)k@c"6) ('DEGyѧԚnN !S& , ^,'P"F O \]mVn,3 '38Q;7q18* + )u= +$ۮDŽ]٩Q1>qXwBL S!y6% (")"&  ~ ^ '!V'[?xg?zE  O  v& & . %}C y`(6p DOm _ }) ! w#8 !BcPP1uBۑ,D&_bEK k,2 z3~TCED# <+b ox $$)!9)'W%g(Y#n{ n z_[`l# w Aa8 ;WHkkc&k?P  i  | 4rtKYހpbVrt,\e* %j()'"\a T h]NBE16= gv"=", i`] @/~6=܂6jC9h zF"e=$#w!} #>G0JWiu! mo  eM C_|V/+U. ( | p  Q/os:}zd( 0 7  y M q 6 % g|g.#K6OQ +Gbn &0;:'ATEXP&H  x e  %/`"()B}ܳݦD3E ;j`!; |Z1 sK%1qܺ߳xxj 8E87!"!&.kxu/HKVa-]P G  I  {Ui j -j'bk#p\B f% "\9 Eu.8&XBr# !   jR7`}L\Od#Wv  0 /P v  QMV* , c.  %/tg*$vRSmus -=6 %`zyCnquj`4 9 j# ?  A*9oAX79=v 6! @Cz{dmv#QS&lNV -OY8Z `# 0""&6'R;%Qwbwڂ (֣ kQ; ;`|lU? }" { Dd 0ۢ~ 0ii|p+^ 5CX 7Vm8|t Fi  Q ;lM SNW Y ^F&< v6 3 `Z {+B[ l o^  k2 |Wf , /(?1F=}3n[M<   kQ2K_ w\" 4e>q} [dx 3lS %   a.`Nv i O UB Ut""v J ;   3D cp\rtlu* 5 T ):> C-F kHm EI=y4  kV:` d A% ~,~K _z  y#[CjJ! T "=5l C y-j3\ "t)i# 4g* q\z)9FQ]rb `@E~B n )2^"T\ c07v ck wpMiL2M P(c;dgߝ82I{HC"7/$( 24 {sy٭1g1 V& ,/ .%| w|+VO!}QZQ* 277R,u _Jt9oĬNr"6V!z!1<,yBa?1  2_8m9BE*5Փe  3)zAK"G$Bf#E2{JQ7iM?U0 m2#@o$fDZ'1=$D,? Kg'N| )>ݒҷ+-J0$%m"12IP<$<%2u!  ֫P!Yeq4n&2_67,"2i"&C#k j{4t[֓eBK m 0 ;)^.T- &U ]kc 4;*m5 nr' O-- )* EqC(ۄ:ԛ&JC'A"nF,".B*! 8GJ ߽ز(ռhދ?UMV 24* /-&W d]Mnޞi؉.ۢv V #o +-r) |%{Yaھߕ NT(Z 3,*8/#i .`cڬxޗ4I/"'0 &  7! CH o'7 `(r" ' K}ިSW_fg/ 0%t &!* fCuvj]q~3߫S_b6s c)C*`&0B  ۚeRߨ<;  R*.N+8"NQP pD8s]ߏz ?% --O&gk)8 ֕L8`"{ ,!0/uT) m86 Z >TE%'Zz g(sq/W.b%PCYsAJL ݕ lyde, )*,S'^R ,Vca1.PkX "&#{ `ij"Q)ߊ9 y U!+4&"W$c`iMaMiff>WsBu@ I "'C'! !-0c؜؄4ބp'KS{ c%kf'-"#M% #%J fيԆө ct o!3&t $% %ZnEݥؘԛ/e4(E i#l%%c#$'"k*{ P cܥPٸ"bq?p!J$"'n%Ueht|݂ݞ 5 x@b#_#{|r?;xwXu.[ k} X> . |:\_F8Z Z kC c z\E?@9Nu?,_f\ 1J H!CAUM [h4 BBV5UQ< % q ygR! "@Z} L S!!V{iUE$o::!R v!$%_)#& OT/'*. \ht) :o$$a),'-H G(m4 w_޽J:֔Վiڣsc{_O $!k')-'-",&; E< ^ Us0OIdLN*v"!"#M(v**'A" V2uw۝߂ #0N >"]& '|"A |,ކO ]  #u #3)" R G3ݵi=b)  : zMtu "UNvQ)  +."6L p/Qf OK57>Ot5}V:\0tgQ Id~HZVmV"O A ,2Z2 cwnat ݅Ar ZPW" !'m ' c : .?w)g$>xwLw }, BE {3*]_!~1  &r=E\ :ߒޯ]l,\?~! =  bW A e& -߰U,jV4kk 6PJP t5; x XFX RNW i`P =1`5?Z us߹4#- >5"! ZN &\#J ! $,$Y d5  E=ܾ)&R a#Q>#2\ f!z ; z ?K0Rt:7 'f>. "u!" JxgYcK(tSvCaT G& ?a~$x?!h!0zRu`~~2 p}QV^*,~A k NGb| BBej ]e 4P u g? ? JwO| Z <  6Vzo5 K 7  N  k GNRAF . Y H,m5P7& h /K=  mQ k5;G*0lq Sg ~  H _,m<akhbBI$r)($  k܈ՠީiJٞ]uzz@&q.q'/'PBe[Ӏz΃o^Tָh \nu"r/R5 x2'(QEمV ڥOG΋Rpq_USE*\4P 6! 1s# s ZFnaV4-JA!hJ/55!b4+W"p߇ׂͨ|JuD _(0 l3B.)  azu]y+k   P[&-,?-3<%e3%LWة$*D#EX!)n;,C+'6s} :e"k0ۗ߆8e h 94$(&R0 X`VRdݾ7 9J"G4h#C#2 C! o1ShE e 9P`  k/f7juw ) 9 Y  n&W &="=$=!_3RF u3 b# suC*8|;h z 2  w1enVY` % , ^ G ]SMTݨD9  $ Qe"|"GB 6NP^$ k/5pH  2$|!%,_$ (HfvL|UݞۘתgW #U'>#$[)!'O fY D)nە٣t,H r%9)E%%+l) E]pLژQRߝu0&;)$%4+l)q!'0o_QڢLG&L)r"%(X' .;YQJً`8n%'h$$E#^s9"TI/\ݣޕ V$$!S0H"ڷ >0^*8#?"Lx3- ia2zjtoZ<T(@ (!GU C b\hޖCg~7Wl SQNYb  TLX * mg <:hm v^y'qM,IR",  R ff)B>ka$cvH w:Q S};7?[1 oV<$ @ }+ +   ~:3;A+iTlr2Z   ~ , r y&5Go4AHhw v 6  "v:\ w4< h= ; ~ ,z&ch^! Ac8C CE1qXG\>_ T /2;zzE~l> -@k a !K0^]Lz0>S1i ~P !# i \kC/|3DJ ^)c *Cek  5(h.(Dr V> Z/ P!\}a(V&w|Q|1  r ^  3Zx  df =  8z  UKzY߁#Kkmc\Sh ] mda\- w&ASn`4P^B C!s! Qa 1cQ@)&. kl #a%AD"W TJڪS+-jY 9#z'GK'  &/&n y2=dWw V!n(*U'* #8@7jڂ!HO I n'-n-n&V  GBAԧVӥM@ y!,H 1.#UCt|XKZ)W  (s1i2"f, u;mI==Рcs{w35?"/W53(rC^;JoLS *{5=8W2% " Mރ;.G  ["p1& :K:jh/"3Z֘'ǜˀQ ?*?6q<G9 )2KK IS"v?*4)82Tz! c k2PD`nm2Qڀ ,-uS5y6,k du(&BǪ^߳!G(~ % 383v$ toi)e N O(I0@3+-zRN >Sɱ-"(Q}5! )$r) 2z ݸT1=X % Z*I)g"kW 8<[$Lp ZL3Dy,aSaN[ 6Vv W# & %[;,KA|A-%j\ V '9L 2_. &#Pfd*:G`  l m p ){; Q c- = )ZrM< ~` B  &  o\W t0+;=7 h. ]c /:Blt4l =9< _ c 0.!  '~u >e <V' ~N{2x7fU/3O1gM)ag: }H k[ ! a?  LSv`qjyvd"Fc :xRC:E 9X{M ;: 6Y {1 [ iS@` #cc bFpy&J@b>vh '. 1,;AaL~F\ h5RNJjh=N.  3 t  (M v'kfd{ f}L )Pk,H 3Ar,7;l  G 0q`] pQnk5 \>@E |kցݨL" Yk#1$T`JXdM(K'M" u d " .5  - a HQ|J /wTYzGDF2W4T c)p!t!  A]&5 {XV InZ;. / ?@  b`[ GP*)v k[OC \RQ-Aq @~e :H?tu^ (&$uv 00(BlT|ڑܞtJU` r$ -M"2g1)D?U: " prg2ةuY  3jXM "B 3u%#E *%-&,)$9 3ɷ"7K&%!( -+O 4)+#i J nM8d=ql^*h* n!# ]&$zHg-% S3x#  ~Xe9> S- *N!*!R & h5 (C B*E'@P  0K>+gU ^pv= 5j.L g? * !  p Fj';j%No  "'x & a G iu$ߐ-   h 1 %Z,n[OI(U\ F Uxj-\$V;Mh* 'P ( %~T =Tk ~nJ&cqݨJ E   *1lC))o=X]knXI  Ih:!vi z 5SuaMLEߧ1ؓں q|""m*)-v**P%$J z o|\7H)-!EPOv03)-z c &>.(6% : Nm${|X60l{v n  l w w + k  C!LCQ]q74 2 4NC+>m s+}^i fg|  ' ( O7\;aq[lN&4>O;`n uWd8Vj 2p!h/>s$loN B 6"#"' &_!  =se'X 0H'D  iB KxU k  &"C~F՗ۏ-3%ڦ8W4( i$}+ .#,# )!"8&T MN'eiٱΫB+2 V!v"b!HtJ  m1<$Az\E;-g v H G l @ l <($f  v cRW7#S )  0Yg l : < F 3%]&F-]^V:>Q8 5 E0:1vB_Gc  hjEl RG[1> Eh5\<m x #F,U/-A 'k F+lg ѝY A S#c'0,*86(:R"7j."Do ;׻AҖ<d:g -Y y5%{^-mS1F./h) #R Yf u=i XSk#ŷ/   -e8L!l< !_9 1>(J. dixثۨВӇŪε( AW+A&"#(.%2N%1#.'[v |hd&m_״Ӻ|٪7Lw/ 1  G  w x!ުGx& ~Tki9+ 2Un&|;N2   * CV/ h .BIlT$  m -#~j!jgZ[pXCbXP3Bߌ:ve \!v'(~Z#(C MD0)&o@ r\UM'WfIb{p[R:  8   . w wV iIbqBz 5 > %  nm * NYeA0 ;}Em^sw)8^ ^+t GW!F, nn%~kG jayGu . *QL +,h>yzFVw S3:S^3:fJJ \|i%U;( E0G7ol(hd @'=vh ^kysB_1m 9Z%E*<)!9%# &r AwrW5' ' j @GY^*q #~Yv6 RdTf.P Q c  "e#5 >WSz< شT x5 4'=+;+ ' <v z&>l5#zk ߔp}xF !H !, Q^( v jf^>v [v! h x9{ CtY LtBcB|I  `%! |}& q~;*{d tP W <O$#44 u '  v: p% N ~. tg * R +G {t   C u 2f4 b?" )fGs\8   r]x>!itd 6 [5 J ~MHw)h:KݩLJu +D9P&kG Q@ sy.# kM/\\ A  wz5y52d>#b %  c)S: @N )A'h?21# !O o.@t> P <C{+f^:$*GX* X X # .  ^.H02%3su0Nsww xCw @M _W( RO   u>  & x'k lO C t4 yY=r}7xc SCzYy  Z( WW)Uj'e-e V !N = l A# lHhU}pX_H~%\o`;FALZNrn O  2P FXBZ0@F U7&~ B"%P5Xs3R9d2$ <P& YLd 7sNMu > 766 ! $2 #hsA_X8 ? D # )'<'!{'3 ~/։J{%g 2Ix"/)+ok*"@%oaQ"{<?y֬9-rELX=%e[">$S#S8 /V1 ,  ݨ Sٻ d b:dcJ0# =NSi7a wm,(s dy(   rm&NK*1   B E 4;D ! JS1xizoA q]G "u1 o.V?T DKnL i ;,&K :?+ } c/OR}RTWy,2a; ^)]0 ;\ ? &=A;   ['k  ,ok }<4)&OQ~. uCMr Zs q  X8WRa Z>  f J56( q] Pf @: .6*OGD2~B  Q"b4$^ 5vx@jZH4" J v%'*g)"jE 8EiP{+vߊED1!(8)%s[ uC:9_/`N7O v_$\ ""c^% # Y"^}ߤsީ1?^   _[)4O Gn/ 1# #V ^ uLD P S k$ ,PfD ! Ip I)-EDi +$yr(   , Xi.vކz,Dha )" >& $B } YC<&QY<|rh% ",R0-]!nF JNџ+ŝA;\4cL&2 0!8<6w&S H]MƚJY/>5(t6 ?b2B9q' [:Bbh$jHz&6s@w!2B"8UK%\. LOc'RLDR~.(n~$3;j"$:#-/Fx ;߱6AxާݸgP'R` &16^#73#.'A Z*'b֘(ףqmDj! & b/? 1s#*u!$  kwr2֯B^R# ,c/!h,C$1"!b'B6fQU~ڝ'|RBk*P.;,$$m Q~/߄iLn/ ,(w /M.(Ouo5 O*I)ֶ߉$cW$]w" ,O/+""tqCLXg+A& )8 o(-,,-&> FG܀9%*+Ui/H! ( g)$p_sha"Dwܮڐ&wn<I& '~ #PIV wN*A J`" %#?_~f 1|\;[: x# &$ []m sgn % C+)T"; !rfnSؖ^פl*ߏh - # ,->'cl"V re֝֯/ wi P)y-!* } q pl֯q< D ?(K+0/2'qHOlI* /ߙ؆Q>t08Vxo !U,0)a, "&; BH=`'܀U3~ c%z!+L)"ah F:غ3lZY  &'J&8 z]u< 0l=]W%f9v (&'e"/3zy !PJ5ןZ'(`#X DI%'#" !k W֍ J*E(5 7w !&%p#$V"Ԛ߄thij C]e$Z &i#"% "|F (4՞\ܘ3H-z$@#$f'!%Wn\eޔڬz{ܥ:W/a`W; x. ~^1LoS G 9MT!! J0 dyM qfe ` [n%='%c("5 nmr6asL n& '(+g$*"nQX^3@u WHIP A"!%(*#*'0 '+I,mQڟE8a y$!0#jD''E"7  ?>A]yٗRrD\Q>F#^(&6*% . L{>9]T_q MB {!#E uOcr ۖ! + ( K -y 2[q $]wLg  )F]q ^wxY k d(qOz 3Ce I a R8' Nt=MNpm  (-c O2 jޥz.> iL y  5RE~ ާ[\(~ R }J  T Yd ެLg{9iH m[DE  >E_ xW.r=` s*   ~\=e 2e!,|dy  7( 1PJ VGwc}}pUH !c^  '>{6'o} ve! "4  )s< {ڋۧPZBJ vE"%!2<_nRwޖ\dIt u"D;OLt_fޫZd | I p2T1Iy BxZyE^W lN C 4"3 {TlQ=- Cb<8 XE Gw   y/qj12'| cWLOo @tSP{ 4nEs5z9vq (BOq P /W_ QlKO @  E Utem;h5   4 c\]Z\}Ndsf$ >S<pN F,yG[j*NU3s= . Br-vr _;   ( zI5 DM-=-  r5b cnKa=o)7)f%k#!ny A p1>xU&-c` r [|HX05W (S     RjHH1G: ; ~  ( [ N3J[x9  S>rL # 33F>LC_aI|I|[ aK ^ @< u3G 'cXQT2 ] rho6 \lG j*U2ڈc>!  [T#.a!? ||XaEۇcކs2 J; x! E$ pJn!'ݒ+Q< 8x_ fhJ$P%y5Q5.6{   ! %2%B]Of'`.O?So IQ #j&g#? db51'xkPbO *r K2 x %"&g wT߄6wm F;YT #&$p, N߰^۲bN ! `yn%#f%O!)H {h$.GZ!O!Lb:Ej%tz}x 3,goBY_S{dj 8!&=P K>5* ufkR  b t% _ P &)eS a!koa?m2k &*D w Ox(eH9 \ewe Q +  D` 8  uJ M& <! ^8> :R C U &m ko]*5/u <[ i'=! r4"rYoI C>d"(&32&ժL!3!   _#<-y0*n=֓n:{hS 2 N+S3)2"+ak޵өxͬՌ> 8.G%041$'"XjdګG̫|t!: F*13<-` } QA]aCЍ֚",%0D.T#k%OSGӼAThH &,z,H$T)wy-ׂ?بbh"E)+%{Y !W #M~i$c %)r&^ P+&D߫0k$ -yn%$*n >=B.9*\r7RrN  AP  t| iD`pi#+; , J x?h- nZG   : ^ %>@QzMhTE#~  h ZeiG4}i$#D!sCj:h L|UuN,8$RB&dcv L=N ;  +&Sxd0h X1NMTaC9 c D+ k7kO7%/J BP   1bHyokvSn!~+ 4 x  x~gVLKIL-;gd<W   K uoh(&;& !=#x  s { /Z P^Xn  8C3KrPP\]*qb'k:;&l`?RYp Nx wt%EQ9G  %I#Aeg\ y C [oL  j ^Zl~.48] /& 7 I  X $c 7|zgYS h D}LM)@I$u|)E>#  $|Au>- A,>4U6& + F5]Ce dz!# j |Y! ! C e@t.ZG]G j7 {.!& !0"3 Dvqށ܈]P r {$0"$# tU|Z Dx B#&d!$'E&8+2&'H&  |$_("8%!)'k48BAڞw6xn Q!% n(!2%(0&X&'@ 8]ޘ ,Ub \%s'Q$'% $:` IOvS݀P %$%O"!IMj+ߖ^%t2! I y $#I #?v;?k8Rܚ܍GZ2 h!n > g BtQ d /vo <?zh;Ro}L&:  A q//Y;zV=9Hp N^R p  ||:ST3 ?; [NZ)fg\MS ,U 9z x/ <qR4>}~lb  Z   ?@ZLB\Zd"x\ @   n] 38WWX,ZxH7nM >  N (R"3&nfdHa h /m[&SO6`0iX Y*Fox]YTmW_X8.] CojZo(?O[&7 ! < `b 3 _L2 `[J6m>N p_ v~7'%/2yFmY tZT} 9I3F- i M ( EoZ +k  i ` p |X?t{L?p  s lT$j UW6gVJ3GJ /Jx[U p2'Dݵfhu,ip yvj!*R }T N~WmZJ~ 7H{%#y$ Jsx+yv-yLq RB#[ '%<| K>2MIm  6:!L(%*E% p3c!^ ջgݟrf mS',+ $ M>HRoAwC!,l/+!   r.6ѩчِ (00/1)g g~+3Ѯ۠'0 gQ#/;4n1 ~%?/ Ϳṃ1   *f4>6// yLHЙx։w"Q"@07^7;+? ֍)Mc{qM_ $mk/15i2$y NV#@C٬%t '903.): JƜ߰ƶ-r * ,x43qQ' 0;p%9ގbs>g##,0I-!a)5G̢ߖkt\  &%(~v"! j  p^U_ " 'u:(#e; %!ۉ:>PnW uX ^vV{ W$ jN7 &#9 %f g~ k >+>81Pmb<(iU   2} >x]\ uIKJb 2 4= nHOAPS # ^u' MhA~!Dy 0 <!. F3 XZN6 m 9o,-cgNMZg|&ZJf@y(F! ,%mJ  H-{ ox bkCc@hO  + a/F 3Dg \`|mMo &\A,Yi    3&AA2H##.DG"L &9a%nbED8** Z C  }LJr)s|#!  [hz> ?Bh_`p ? #Z q=/XR#5  { 2 M|[jQ2a  t . @@-WBgG $C*9{ N \UUMRL1v K 1 o^;\ X Ryx XmV/T XN y#c }'"L@ t ' > B <U9 T P55ml:@k 6m`bm p jfHe !  5aaw g c _ )qZ-4D#7l 7 "LZ [ U!Mi^.N` D m {gS%wU7 F^] h=SPnN"  y:Nm^^[ ^d!%W#"m ("i`_ C" ) n+' (3 o  VYw;] W!g}xw6  4# ; ! d]q Qm\,ycuAh-xF Q3%J%  2g2-T$ߥUEڦޟ b92{!""!,_lj|M A 1#p$Wj@D iJ9 `K.|"& '.6#\^( %z(l@Te)X0  gp%+$,(&(-$YuN/v?סE۝׫޲O ,A [#,{q/ .S ,%Y0h.n-,?֗9t8WJ %%D&*K.*2&d2 0$, ^#D.-,Y"θ/ԯݛ W,s!'th*l2)$ OU5"L(@$߆sK. >I'Lz    j] $4>R#S$|g  3g I ewIcq< aKKT/jI> N$v1dhJ:/iLIm{8 E0r9 @ esTDf  ) a \NZm6{\ G_V\'Y",JgV"eO7x>r }:_q91_ C1;{{U=7XWlxkf .\'"v-'-&)R#$aq& M+_ٮHf٠>ؖ|E'Hal kNqOT% IQsKkp  G(qLG)/ > USڿݺ%:NZ qRf  X  N LN5djVb(!vkqwx _my "{9Of6i& QWuy=MX x |I 'Q [#f'i& & x Ddqؤ`ru_!  YoZ!%"h,U )/j.{( }8DqpmAMq5Ӳt:8R!,933 .&]z Hi?zܗ[$י3I ЇZS( wS("30%t:$;8!W0'S*Obҹɣ^&y91Y o .'$1&5$5!1=,H$ 4 P~j[̀mC7a?  *"[!bCy  "3gl"CPH'l? 7H; }t= j}f O p:Bl5  +h 3  99 >3M0"@L(` j"AU$'&# sZ+fڈL919W*Ye!d$_$14 :@ ]935$u j^$~ w nw Fe;HCua@fRq{7_ To { g+bg  & U > Gm]_mYZaA,w u hc9"w[\hqD]jdLUK!qc~84! TB] . +V zX  )U#e[_ KA@15; P` .P3! #8F z?D7hD]!"& &U#cm!efg!-l-L~5AU :"@j#D!yT0J " '%'vMT f# 4``Y" [>@ \mCrۺP1% `] j'O(u$c `uh6%\,{6E ~s FU$ *{ޝC޹ ?q3F _2.)h Ja =Zn%;'H>_-/,+> W b)!4#g :?{E +"_>.w U l  I!!\* E Xf z8@ & 6/  { D < X 2 SW\e:\y .V]{ mW S Z w  h0;R/v^Dc@#By L < T  ~Ym'$ Z$XT Y F + 0 n| $w #^dJRviE@oU-#{  oUz _ "II3G\h J"Q 9 ln[s7-H^6 "8>"r$2 z =muL o p^ 5-C ~a:  U{y]hL. 9. Q  g[  (q b_3O\[Co%8 6 O oe R PdwUO'd)Q2bz. $O q   nni5kU'g8  2 `& I< 3w ]g^P<VV  F4 2 U J4=2 |@= 13fZ] ~%Tia %41 BI,Kj/7M^1 Z vs { ,Z;   cRzq+ V`a .6$-i Qn+},n(V ,t %2h u0 "0  ]# #$!Ie a\wH,ځw0Nb Oq#\)1+)O"O1 CVhE ATPlZ@h-= i#?)$8"  o+E ۔ !۟P@{pHXc!i|` 4 I1TuU_#} Vp+h[f< M+u@ 9 A3'cV? 8GwC'@U cRRHnX  & 3 vOiNYz;w 35EdU ]_I n&v c^A7H2w?"8 P[ Vndr 'h 0  [Z.B<.rr)NY*M(4Mj u  N v-]^.4 [ci [ >o s4Kar g WE +p]<7-&M/(+ Wn9 W e w{ K [~ W'p0" , F iQkl kr5 |Xy-[INސ@g N#$&#@a[!J%t 0"(Yu( #m#IVlESBaؠ5-` _B"%&# ga4q?bC= |  !d Maocst|NJ%Ub66'r <:KK(w99 t  7 "tzDtXS]Nwnfl3 !z ' )j &n+SU_Gxڬ% l @-D2$Z (2'h K%Zni+ L b\mUff[sl j kG-Y0 62N cdX2T @Nwo+Dy <E3O-# 3D] Y=I%Jj kD9 ]dJ9wS D zj9J 8  S IA+ jG ;WI;JN Impo)1 jp9n.6 i`|7Zv\$c%'# &c$0= j>ؓϱx'"i a!X( -0%E,m: h m`aaR GGlK1CMa$W.5x81"b, >\(ɁS̢To\/]#SC1|v:<4R6$v [Y!΁O GbX .s8!9<#/b ,gQ4Qz x'%Su""W 0_8u$I7%+B > 2Kڜ^:.kkVMu %DM03S#.!!4+xv?s2,0Vوs>m}$*10!p/F$& (6ԏXLQg =n)%X+p,-=(y T g Qw\H8V0Px#^ +5- * OF^_uZTEa+! (V`-+8# a1;V7 J# +,S(M*3k.S2ڃeza t% u)'j!|#J <3P* 1q % $u{ 5ީSF>Q`) # $DxI6/ N2zKF(<i! #K@ *$t!!ZD  s }#eޚ% x!8U%""!f`#e5}`) jj$k%$"T% :N^ ! Ipoyڛ8ܘ.nF!#!&^$rg۰R8I$ mhwA$  $jlFMR <.\. /K7_ qr cEfG1F!vK " g}r" , rA{!hD2$l~3L':M | O[W%jPD&diwh  J<" 'EA%cg< 8 ,;{ 7C+hxH d)?J`R9zaX,R!  x }!!& D ?&0Bfm߱yqb7 *B, &&%'"X ,=;ۅ7;m #%%k&m)D"0(\!z ZVv* 'ڸ۲)}F d">i! @#& '7%z=F7k0jfZ]l\ 5aU"45&f&U\! {IT߄^eo.GZLPcvf!($g"|D%ݞ*ۊn< 3({ >`_C)!NHB^d20ݫ8ݧ \MF} { K'UD53 *LV 0H FD2{@l+ZAL/LN Migk ~|Qc6 'JT S>kym* /2n(= l J< XP+x6%_t}8) %kfi? )Vgq/CZ@jHDe ) YSޝ"mm. Oa.  IpL b.lI!Qs UIm r0 WQ\ RcZ3}' ~k 0 rXW #|/6bJ}~ m5 BRc [ qIc:w .!T"]}IkI z<0  ݯ|# 6" c^ߋu i m @E ,46 u\>}g]2@ 7Hhv wgf Y|e y -S ~9 ?;vj P'#SL E ~D = *Y_z7 a OzM 8g S} g 5+H n} *eW @"^H/Io> ]es B@ x@l+"Z;:E  E  t ^ z#}/ -r 64 4=t}  #@S!Ua:; dXB  v6q.;VB3Ns_auz? Ro8Oh<R_SEe\(Quc&b hmYB!JejvI./dK3R/aNSq CI   8s]{[SXe[^2n: b    kq%E.'IG  C, ]n . z 6)f d9&7 U rf ,G JZ:=LrcCt fbc Yp|Ja>_I2 I a n+t.޻ nhW{ Lz = =!n0xXޒ~T#  Qs\!1"Ttb^0FUx< u0 cn #S"KJ FdCU P |J ! $i9K} '{s1HC6 S ("qH Uj0a9h$5 K [L r , -MA tKSGh e*B_n)k6Iuy&x %Dz)$&*g8 I9O 5 @ _Gmx} b(Ca  [Z j@ 5U#3 _5iM oLg! "=[OM@ |5{ E/N?ex2M;M3r.F&H #v4!P u z?T[n6܋4 # b$&/)S*%Ajv\ +k'WQԼw]d() LF&V.O.!s'D}oY4. ZYo !7,-1DY/ %}K@iKEPoos,^ '/f1=, b C+h7>Rn3LN, 1MC 8   DD\) )fo}[[l_T|@PcE.Va?( ]sIBCS L?KGo O~'BPs'G<i0Rn:aHn+"^ L=  H M2}\^Aqc*c,3* qK 4 e zQiP=&7V  hG@M9f,-qnw -n kt   3wh-d+A\;Kz"`/i~ HRl]S$,8A"5b5xI9/7 & j#"E)OB{߸VhZL h!!^|9)RtQvvE4#|#!#-X 'J5%G6v4L%7%$9%NK j G;rݪۊW-Hh /&e%^$%; W $ލF=۲ܛߧO6!i &%"B$jL  @nߞ޴x)a^]!3 %$ pE Kb7L څތ U)>iyO #J!Pj 6-+hh m!1oEt]  ݍ%PY&s q=i*  LmeS:\C.kr mP R# K (,de t1 ! %  w|[H!J 1  5 r :p&>y> <   D? aR-zH7eJ " i E 3CnlOg1 Q\#cd90 Hk(+ %g   VmECz$ V 0 r q joz}tAZSo\ ':;`2u44X0jl 4 V] } q XIT~Hge+ IdN ` h:]pDzE7H/ _    a3aIj)+ER [@k V V`Zq)C=B604 @p k1 >>g uuk}:LkH 1Y 8 Wndz{=Toc b2 ZpPQ5W9Bvt[ 7 k6?&  -PO ߠ7SaWk< 88GK;a^JV# I 2"!*j+  \ @2#rMN)c }YI -q Z]|D* `k@B  " 4. ' E e0.9 ) \?m K/ Dxbx R  M * 2")o lc~kbufV:a;q ;(< Me> R"]poDUh, 6 vJ"^ IIkWpU * +  mY re>h-~  9!"@# Z#2g bc qߋZ/nv9s + " (G (% "k+%Qt :_V E TrVlC23vjN 6q '/n 1M%;/$Q%16: DuYXͼ_O:k n!aY, NLif  $V2@xh}iv? ,- 9 ;$%9") p6Jk`b'&kx|k7JV PmD# $ "!EMJ wal((n#P'$ TZ3ZA,!pl  ~7 c< Bt5b,9 @'}C  q &5 N"*N=h!.Xf df:yI 0  uP+QP$Aߤ& B! ( [*, & %mKmay;ft)5X^ nh@>  S x[~yr l<aY7A* V n'o)$" <Bh5'Ui܊ުK* #4Ca, Q4Ng@p'XkbeGR0PIo7 9 h"#  :k(Ml)hm%m^sOL#&H#$)'g'8! {";* 5E)x:WH N {`&U)(2$fMBY߯=<\S۽1uo\'gq J1'D')/'3 "30*e}Ry20:d#؂NM͏|nvё>G = [ 0V-$e)+]*%A% `. h/6VilCcL ^ i-%hn6sh :e ~Iw UT6d=:RiE F{3;"h< {q_)(3   9 = > MW ;]O]hHlmX{X0 ( {Q E rR 1]M:- [HL )   CT /<`(58UDb~ Tan _&'$wGX  wZ ]Tbwsi4 ;E#8$&@%/%"! L `=i\f W]V %I+  s  G!k #`W f8W,$w } 0B'1_.ߩ>?7)EZW. U D*OG Y  o xA%ClQ$i^U\ o  0V&d$(k1 <  | qdkF_X^,] 3q 8 IQMB+YL=q   6vJ!!x$x%V"4y{l Sm`<lٯ:TNhw Sr)0Hy15-;' N Q-n)O֭-)"/Ԏl/z"-"t,$2#3' .&gN= +j6܈ׄ Pǔ*Mڤ(FP !Q&Q$1m%7"6*3c,D$i ^;lH֛;}5̛ ՚WJ o !"K ""!j!# d}0yQ/IgQnq8i^ [   ~ R ?{&C.P6MEY^ avU   @b j 8u a0v}ktmv?` g {0!~" I C iZSH^QI I5 lgVII *  2 OS $b? f# =q-`~  x!j r R<]e93s (P6 V ,b Vy Wg& /NJ3w} q #&7$r!!B/ yy?t_; Kߎ,`Ps_ rY!#m@ `%~.|n 9 |d=9"= LJ (  FKMD9 6V j 2 (  qO@S ? 5g'  B [>L In"jaV|Ky3 W+S`km ^R  ,"^!\ kh=#OaBw!; t!  & $ B.nyPo,g!Q?  Y<Q Q , , % }Js0l oo+ehWy<: s   n 4f`W(pU{ RW2WeG5 %cbmX (Zr6 )[dXO8+ Oepm[ T<kZ FI q -]#* 4.u*n %[% ~ @?'$ _ fpݳ E%^ g u!t -" b/ B6+e: >"H~B<wJ![(/{pn!*au  k)g pK8dm) ->h" "k%V# %rg^.#+܄\e C7+^$r &l#U?bT :As?'>ڀ $|  nPm 4 ; % F S_#$ 9b6@ 2ydO(rC _9 cr J+I ~KimvM% x- 6 c^Ld - 6b ; k"{2sNYP 5> NoQ7 a W:   W ._- aC E \28@  )f@`n(QL4 ErC - r H,n7W[rfC=\# &4#Vr  (C sY$y&* ,)~/x5*f a10e͵jېIOg!g ,x4)7:%0=O!0i '*Y>S_;8׸>mkO-L 67 .|w"(  3?i C *Oe "=N0~7N"H5.")A\oԋԴKvsEP a$,.2 q.N>"s4k02eٯ TI2 q5&-u- %[ +y ZfXc8)<DY((E++' 2EY %%ڻ[%,)Z' [^, O CV٭mܺe" (E(S#<W ?^W /_(QGMpJ '@*&mt#./c޹{7 &Nh}QBb" 3(C(C#< s mu1ގJxZR# $!?So.W9>XK+z !n# ) PF~sl7 j~{lcY M! q#hMc  4fJlM9`O P@ ! Hx':X T ZCC %n a$X/j r1D>Wf|ov % &B"kr$i tE m[%\ " o&A D# = [v mQ9vlA49! W(' 5>< 9 x?42ܷT%Z *] $@($%  nS r>g+E* G{r _s[kWeTPU6u*Q W ~\0= Z 5AeaO }@  Ga_hqOwxyN!  D Q^# s hzL7+ @ a%<,O j"f6  5Cq .psm!j!s l %'%+hrp KH #R$ " $W$]uIbyc96 t !a!Y!$\5"O }:)$pߕ;BL(N""+Y  jW$Mb ^  ~ [( |)UNR _ zR\ xw $;'L  W)g a 2[?+R \ W q1cZ d[.1 CA]1  H7[) [ hpsLs DP,ZXe YQWAaG |R)g86dkQ  mutZ+- F[&)SC3m   Zw q[Vxbh-h o4 e  t#b6uB  _7  u ( b6 >Z;&#{G+ k7UIu - E  - IP5m;pE ;" ? _ S $! Ng3 ZSb  {  5@Fp G)q 7  6 3 Q4 ,w4("C {Zg@~#i@g o Z 1k4.YRHNN1Ac. RQ3 w8 AuB,"t% qln yOt I \_jeG^-HE w {O _ 7F3 /sXq H } 0 s]c Y9Rm79U 7 #d J L  7| V 8"uhW= *  1 < . @  g<s # DnxU{2[q Jt YF_xxA/;h9]cT /% c MiFo,s2*[, '  5z Fy3 Kn/2ZOk+4F>fk86W5I'\_|tvz95. jJ`cOByLxKf?YPAyz<_a]x]"\Np3+t'4V))-(d@>w] iK%i [ TV 3y{VKr)fef#ZT#puU ; pWeAgOkh X:iyM   c p [h[^ n`"O;O! ~ Z   + on)(YLG ! +S  %NqJ:$O& N7 M H= y]`W:J't; }7' t ],  0+) % "  <-M7U  ^]  cip/e nk?eK e kl {HCHf \(^   Ted;R*^%#  NDU0 Ed1!)sv7F m4r_=RsZ_+:E2P=>XL \%9jfGkp9#'m7  bzflag-2.4.2+ds1/data/flag_drop.wav000066400000000000000000001232241200563112200170300ustar00rootroot00000000000000RIFFWAVEfmt "VXdatah00RR@@  >>==  GG66..~~ffrrLL;;::::==,, yy))  jj   | | QQ CCzz##>>..UU  ^^XXmm222 2 ..wwooEE++MMssNN7 7 44::zzmmmmM M @@SSA A __MMII {{zzhh}}  '' 66* * 11NN..||{{qqDD<< AA""EEssbb ; ; ss33##@@vvRRqq;; SS,,__AAee[[DDVVIIV V __..B B @@BBYYBB((KKww{{CCqq  44JJ66::  / / SSGGܶ@@llWW ww**bb {{ZZ; ; kk--XX LL&&""55 GG##--  ;;XXHH]],,--%%OOגr"r"VV$$$$BBPP^^22K7K7((YY ۤ((**22>>vv qqI I II22ػ&&%% yyL L  ll. . >>kk SSHH@@ss}}   11ZZ;; LLkk% % H H vvL L --CC~~{{JJ^^ uu..HH%%N N \\99]]OO ii;;SS  XX ==OO55{ { ggJJ__TTrr--RR$$dd00 ;;SS55[[,,}}88  wwgg##6677!!dd''XX YY[[YY99``  HHtt//DD^^llQQ;; **^^RR~~88{{==**NNVV@@bb""ccEExx$$  ::mm!!11MM%%__++YYll``22wwxxcc$$ MMrr00~~44  ((\\llVVoommWW!!88LLrrccaa&&((88@@  ll((8833ii((**  ``ffAABB44 !!UUVVEEooww&&WW;;  ((aaaayyvvoo""XX%% ""^^**ppGGhh TTKK''nn**??DDBB**>>XX22ee??__ ^^ppbbll++5544||MMF F TT..NNCC ''88PPPPxxIIEE))P P --qq[[oo--PPii  __BBoo ;;bbaa--zz88NNKK,,\\__,,tt!!<<..<<bbdd''  VVSS----uu{{))mmttpp{{__[[__==eeYYbb  * * WW--{{UU}}SS!!99kkTT>>**!!??++ YYNN OOrr^^  TT%%$$,,'']]EE33BBAA5555aa55PPPP11RR11SS^^&&>>EE^^!!ff PP""""MM77^^<< --cctt11YYjjeeqq77@@iiddAAZZPP**ww SS11kkZZ++22tt((##VVRRXX}}bb xx$$ffAA]]YYLLLLPPtt]]&&((KK6622{{aa]]ZZyyRRCC@@))00BBEEUUkkll66UUll^^  LL??eerr<>llrrxxww55DDaaDD||XX,,** --qqjj??&&SSYY]]@@OO;;??;;44 [[$$ff!!PPhh66 zz $$@@##DD55**aa::CCLLbb^^eeBB$$%%11ggddbbVVuujjUUuu00qq,,////kk@@kk99ccMMBBGGCCllrrAAEE++##;;ee##  \\KKhhCC~~ <<  ccee zz$$WWDD]]::--++pp``vv}}SS5566  ''ss``UUffnnuuYYEEKK88##))ZZ==OO  33WW{{ee22**__88..00 VV&&##$$xx>>wwTT))))RRQQtt^^ ``||DDbb??IIqqyy55EE@@44TT++IIrrUU--((JJ""FFzz++ll!!JJGG66mm44 [[55&&ddssll++<<++{{vv{{YY 2255==ppUU GGwwgg@@~~ ii,,--88oozz""WWcc eeBBGGWWVVIICCLL99^^  ^^))KKhh$$77..dd;;RR88  >>``%%BB::aa;;~~66;;$$;;GGEE> > [[>>\\VVqq==xx CC""uuPP'' ??iiFF{{BB ??PPSS~~vvdd  ""77TTDDTTTTppzzMM ll""YY\\!!ddMM\\ff  --yyHHE E CCnnrr@@xxVV&&mm mmZZDDvv$$NNggBB^^TT__bbCCqq>>qqssFF##[[..mm@@..WW//EEuu55[[>>\\]]BBuu//99??66ZZww..ll33  ""||RR <>11""''@@KK FFPPrr  aa00cc$$BBqqUUQQpp==jj@@>>mmrr99//EE1166==&&CCHHqqnn OO}}::xxzzuu22 hhQQGGCCoo``dd..PPMMddttyyHHDD33wwffzzMMyy  zzyya a VV[[::{{wwss!!&&CC11zz II$$__RRttHHBBGG%%iipp  2200OObb@@eeoo55oonnVV ^^WWTT BB--^^ii~~VVJJ((UU66zz" "  == ==:://FF//yyJJ||88]]22uuCC////!!1188!!TTff__99~~00WW<<!!::nnLLGG1 1 33%%:: XX))@@II DD@@cc CCPPYYLLssjjjjii ii>>nn__ ^^@ @ ??eezz44wwFFPPCC33<<RR}} xxgg99LLQQzz cc __++88SS--FFJJ))[[AAMM wweeKKGG99ccrrookkVV//llDDYY;; !! ttqqbb@@WW  ll FFvv88hhUUHH@@77!!55 ,,YYYY7700 ww++ **YY,,AA((}}44**mm.. **UUSS  ((''oo rroo  ~~r r __EEyy{{tt WW""GGjj((66vvOO((NN>>{{]]HH33KKdd_ _ OOt t GGOOTTZZuu}}JJ,, ""uuEEii,,KKbb||  ll??''00 pp+ + UU   xxoo KKLLAAk k  \\qqhhF F  UU  NN[[WW&&yyYYccttOO[[< < uuyy@@7755vvwwk k [[nnP P ''GGOODD**FF99ZZ ll==99"";;XXEEppooffDD!!OOmmbb!!uu jj qq FFxx;;.." " !!&&44{{gg]]nnccoo::ggFF//: : ^^ NN;;HHFF!!ee@@vvLLppkkJJ!!ddGGvv??AA ;;IIVV66::>> <>::jjLL5544ll88uu::kkDDxxVV''44@@<< NNQQyy@@**dd //II{{ddii22j j tt//ttCCO O vvii^^CCII11VV&&QQffJJTTvv,,kkCC~~++{{wwtt  ;;;; yy!!EE&&YYyycc UUffQQ""oo::@@NNppjj118 8 ` ` ''~~ddee^^llGGMM6688==  yy44&&]]~~ FFTTcc UUG G {{eeBB..BBbbEEmmyy  //qqaa ll ++AA||SS==SSMM\\EE##DDee``mm5 5   ``f f ii88CCTT $$!!vviiXXll%%~~""UUTThhpp$$CC~~\\55ssccvvjj }}qqKK>>00vv)) [[zz====uu}}]]RR::xx++88YY``//  uu88aaT T }})) -- <<jj55aa  zzqqooFFPP%%##NNeeQQ ::CCZZ~~RRB B EE++~~B B __..  ##}}FF@@kkoo))QQ66RR__xx~~ ++ xx''  NN VVOO  YYyymm&&EEYYxx\\uu++CC44!!77ii00]]NN{{00tt''MM zzc c uuff((j j &&&&EETTKKSS((>>((dd QQZZppll\\jjDDp p   ==  ,,##rr22ffRR,,AAggVV""KKaass( ( LLUUQQ66@@vv66++RRHH::M M wwrr//!!))xx|| ""% % AAHH$${{nn]]iiMMVV$$**||\\ UUggNNKK ]]ff55x x ++qq  ww 5555 ppFF//VVDD~~uu" " H H --,,DDJJ''3311kk&&VV NNrr==00 <<--LL SS]]!! ((KK>>@@EETTXXww33``wwKKhhyy  $$ ww JJ..cc}} sspp::@@OOPPBBdd  UU99==//<>KK||uuRR__hh55pp00ddY Y zzFFVVmmqqII  >>  qq.. RR::33kkOO//UUttNN]] 7788yyooe e ))ssss99//11yyccJJ !!ll11vvhhTTrrssOO33hh))kk 9 9 ((66  IIgg33tt{{eevvss AA//VVYYJJtt))uu .. 22  __lltttt??JJvvww0077kk==UUBB 11ZZ,,<<DD,,**22UUTT<<__""ii44 K K WWddDDCC  WW!!XX ]]KKPPTT11YY**))TTccbb^^>>Z Z PP>> >>``::mm&&||44<<QQ&&NN//xx^^EEKKJJooNNMM55; ; MM<<QQ33..ff--__ttbb  N N <<__GGUU22  ^^nnjjllWW]]ttjj3311AA**^^a a % % JJWWaa55ssppR R ^^??bbIIJJ@@mmY Y ::ffWWww""++PP11``cc!!BB  llVVvvtt66??__''RRpp55LL00AA((aayyddKKWW{{[ [ gg  OO~~ ggFF== ##TT``ggJJ??YY hhyybbmmvvDD  ,,~~ ^^  DDyyRR  SS::BB]]ll]]!!$$rr))z z XXZZQQ))++ **JJO O ff00^^,,ttss::vvuuSS''pptt##  @@ii   oorrDD33==UUPPU U VVMM 2 2 __IIll00::iiB B --44 hhbbXX66BBAA&&uuaaWW99llee::|| [[::iiff{{ 33 ==||ffJJyymmggJJXX00jjCCHH eeZZxx--|| 55FFbb--XXp p ~~== kk  UU RR,,X X XX --WW00HH`` ;; 880 0 IImm   ^^\\,,]]GGMM// YY^^AA$$  33``ssDD$$ SSiikkpp33__OOkk++\\ccII2266 iiKKdd" " b b rr[[QQ[[yyVVppll}}\\::""~~vv--mmjjVV$$ GG##  ~~FF44@@UU55||ttii!!ii00@@&&zzTT55 bb``99 KKccSS""GG44&&pp MMddKKvvWW33;;vv00TTCC{{55    kk]]5500xx## KKSSHH; ; ::FF//__""ppCC;;M M  //0077xxOOQQ55zz ~~\\##xx**[[cc--^^5533xxbb<<xx::  ||==__QQ::$$PP22XX//33llRRII ''44FFFF  ) )  QQzz- - hhXXR R ==zzttjjoo,,  ,,kk-- ^^ssIIoo33//ZZ""//++##hhAA [["": : II;;!!EE  MM: : ^^]] nn??KKQQttSS''hh//||OONNggTT  mm   ii EExx^^//bb!!}}FF$$**77  J J 9999ddr r vvuu ZZ77rr ccNNKK)) WWbbuu""&&xx ggHHlldd::))mm&&UU //rrNN""bbKK ((gg]]  yy ..VV EEDD66 __vv!!JJ$$nn00 ff~~bb;;KKTT )) ..jj[[  n n ----DD33 CCuus s //l l @@  ww##//++xxuuii99--66LLRR2 2 LL JJaa  ((DDOOmmQQ00cc]]uu00nn11LLHH\\< < [[77--1188 77::##[[**ZZ33 qq9 9 eeBBLLQQww~ ~  AAHH++iim m SS##EE{{| |    22II))<< [[ss XXK K ==@@EE  ::ZZ44zzJJzzmm 0011""gg!! RR11tttt00 PPyyqq ##gg==ww;;==!!g g TTGG^^BBIITTjj88NN""^^BBgg,,kkJJ) ) BB ooUUPPnn33zzDD;;00, , xxTT!!--KK  jjBB 00GG66!!JJ>>|| %%ee::ddff66HH``dd mm~~22e e && ,,@@oouuDDww--dd??772288,,]]yybb::ggOO""MM||00--NNwwww. . eeoo~~2244~~ [[kk22 aakkHHKKrrXX<< ++??''''## ""@@D D  ,,66GGKK qqD D DD..((PP44MM--ccJJFFEEzzc c tt & & 88==CC**||ddSS&&++22gg} } hh{{* * RRAA::[[  88<<44dd]] EE UU EEUU 11||zzrrQ Q zz++q q 55$ $ nn vvzzs s 22ZZ~~))   $$&&1188BBKKppyy88aa<>qq__pps s hhRR9 9 //((uu   ,, ' ' ;; kk;;aaFF//66iiWWmm99cc  wwddIInn22__99''ffJJgg<<SS::XXAA cc<<OO((QQyyjjpp77== ,,%%++$$$$IIeeJJff]]__EE\\ttwwCChhee33;;bb(($$uu&&ii??cc~~ YYpp U U tt&&ww  ߰AA==jj ᓵHH:: ||Y.Y.11jj44ғ  !!uu))LLP3P3TT''))Ƒx"x"XX..qq  %%gg!!܄m"m"tt||,,C#C#^^||hhWWffii , , ,,11aaPPNN==""__CCQQXX??nn((WWnnVVppFFOO  zzN N "" 9 9  { { ))@@  ''ȷJ*J* AAֿ`F`F..aaEEٺ))轿c3c3ׅ׵͵nnN"N"K'K'nnSS~~HvHvggיי@@TTȵWWQQ ЌќaaL8L8Y%Y%jjȍ..{{F F ͊ EEyy݌((̘UUqq PP __((++Y!Y!SSbb%%UU1122~~nn}}66 }} yy??ooSS11  / / P P ccCCII< < XX||zz 44,, IIKK ==22FF77__JJ$$OOW W ==LLnnMM,,JJ;;FFuuddyySS;;::hh-- ""33DD  ##6611~~ W W nn// 8899<<JJRR(( **[[ 66  d d ,,QQ""  44''))^^nnHH@@HHssYY\\@@))::4400..;;FF!!KKLLXXhhyy==KKII66GG  ;;GGUU@@--++LLHH::22``--dd((""``22ttaa55++##DDGGaabbppDD !!PP**88&&HHXX$$GG66vvXXvv))11XX##<<jj''\\55PP  [[33ssssLLII<>YY$$##aa,,}}yy99""QQ''xx ))TTllOOzziivv33QQppBBoo]]VVgg::HH--^^MM''9900rr6611))  vvee&&}}jj&&VV==KK)) ;;__kk((wwRRNN||uuUUwweeYYUUzz6611^^ OORRjjpp99ii00uu\\77HH##NNYYDD11QQAAII[[~~$$uu66cc ll$$  --cc''>> jj}}UUFFTTYYEE__(($$SShhAA{{QQ&&ttMMxxVVNNFF{{yyyyVVff..GGWW%%&& ]]EEii||PP~~KK^^LLwweePP  hh ^^GGQQ``****xxDDrr##ccDDBBLLii00||zz  33jj^^++--ww55$$rr))^^yyZZKK..hhffTTbbccgg)) ff&&JJii11aa{{;;JJ77~~}} ww11CCDD 55WW''99}}))QQaaJJuuTT]]""55DDFF**TT))FFGG11__OOWWee((**TTNN""llLLGG //llttMM""yy||""gg## CC((@@ kkKK<<ZZWWWWPP SSJJ11ZZZZcc22>>zzllnn""kkqqSS   &&..pp||))\\bb##//``@@vv++ ttPPyylluu $$<<ee''==""--11FF88LL..??DD!!$$-- uuqqrr bzflag-2.4.2+ds1/data/flag_grab.wav000066400000000000000000000242601200563112200167770ustar00rootroot00000000000000RIFF(WAVEfmt "VXdata( IIww662277llcc||hh''FF 33!!TT44%%GGpp::RR @@''ˬ%%??&&99BB??aaZZ88DDhhee##""11[[ZZPPBB@@MM((77BB//ZZzzr r YY&&V V $ $ ;;$$FFuuOO  rrFFYY\\``ZZuu[[\\11^ ^ hhhhMMAA||//    aawwAAii7799KKVVKK__vvTT~~ ""33bb ~~qqLL==VVCChhPPTTDD''||yyXXggPP,,EETTzz@@WWRRccKK%%HHbbff::((UUZZLL77aaMMjjqq..}}IIWWssLL??[[SS``__88ffKKooOOXXjjttGGDD77WWGG445 5  %%DD55!!//qqbb''KK @@ttqqTTLL JJbbWWBB33jjee66nn??__9977 <>DD**xx77&&""++aa ss77ZZLL::}}##KKUU ::ookkKK77 ,,""vvffBBooUU$$ttJJNNKK nnMM<>ddkk;;ZZ[[||\\jj``FFOOHHkk==FF..``mmDD77==''YYuuNN22FFkkcccc44mm##zz''ZZ PPddTT::hh22KK''//11""bb[[$$00qqQQWW<<++qqwwKK}}KKhhBBiiWW--kkMM{{]]GGyy00..^^55TTee44--FFJJ__ii..,,ttvv77 lluuTTKKRR%%..ff{{jj ||vv++ZZ$$KK;;wwqqwwll//WW{{));;--cc^^oozzBBUU>>~~[[ww--AA//   ssyyQQLLtt ``77==bboonnHHUUJJkk;;'',,!!EEGGFFooppEEmmDDtt}}""XXrrqq""yy @@BBEE]]%%00ddQQhhKKBB  >>aaPPwwoo77$$WWVV$$)) >>QQppbbee11XX::[[ggcc  ssmmqqcc\\^^llxx""  ``''kkPPjj IIttMM!!ZZ!!{{JJ--ii77''JJ//}}==((22hhzzww))HHuuvv??''TTAADDssLLiiJJ\\""44``BB\\KKddMMgg||EE^^FFWW||''00LL11 ??wwoo  88[[FF NNkkll}}qq77ܨ  @@%%}}vvC C [[==PPmm  ƶffװ9.9.G > uu!!tt 77}}**QQ22kk pp|| s s @@ 22vvYY RR.. WWXX}}WW@@vvHH>>  eehhWW''iiaa&&%%88ccllXXxxLL77xxaa88MM;;22OO55bbkkLL>>ss""LL __cc]]&&ee''11ZZKKff11 vv  M M II==NN rr  eehh11! ! --))^ ^ ]]ffOO^^>>}}--DDUU <<WW22$$``Z Z   ((__002277VVFFO O xxYYmm55##6644bb~ ~ $$JJwwxxOOJ J 5544DD22 ss//KK$$CCEE,,~~))VV ZZ44DDEE  LL''AAUUyyRRDDxxiiMM!!AALL''FF  OOJJll**::  ss__))\\JJ]]ddTT55bzflag-2.4.2+ds1/data/flag_lost.wav000066400000000000000000007267241200563112200170630ustar00rootroot00000000000000RIFF̭WAVEfmt "VXdata    11EE++$$$$##HH !!<<44MMOO##// --BBLLuu]]kk//00@@ 77ee##,,--[[QQRR##JJDDhh@@ 0077rr%%mmTT**>>00RRYY ''YYSS --<<))bbBBaaWW55QQMMkk))CC==LLee~~IIrrkkOO22..^^AAVV??''ff33MM44,,DD 33&&ee))LLGGeeOOzzLLII<<0099//==55DD__DD[[KKUUNN!!ee{{::YY{{uuZZvv {{ffXXUUnnWWjj (({{22pp]]vv&&hhrrUU((kknn jj~~CC\\88!! bb  SSyy--ddGGWW[[JJ@@gg;;PP~~ll::hhGGKKKKqqpp77eeyy??jjooppqqff ttllgg>>@@uuAAOO``llzz??jj\\__!!WWEE~~77$$ii  WWjjhh!!yyII''UUqq11ddcc== __44__XX;;SS..ccZZll22RR||  RRvv(( NNFFssGG**HH''%%QQddRRHH AAttCC]]$$LL>>mmKKJJhh}} DDmmZZ  PP?? WWBBIIjj88KK}}LLmm5544zz55((TT~~IINNnnvvddff}}JJ**SS,,dd,,zz!!UU**44//vvDDyyEE00JJkk`` tt%% ww  ;;55NNuuaaCCEE88~~**55eeooqq44**ss||XX00iill55[[NN__!!yy**==hhNN;;hh77tt__ffppkkjj@@  //,,  hh..$$WWkkwwRRLL  SSVV~~}}++__AAHHxxssooyy.. ;;ZZ((bb]]HH BB;;""33CCSS##55eeQQOO~~++AA  XXjj||WWDD$$66..]]JJ&&nnrr((BBXXWWmmeeII  ww//CCTTVVDDMMSSccYYiirrAAjjNNRRkkOOoo$$$$ KK__qq**((EEyy%%::AAkkOO||PP OOii>>``""xx||TT44hh@@vv66aa  22""\\(($$uuii99mmHH00ZZ44pp((""kkDDyyTTaaKKvvJJbb>>..ff""EE99&&RRKK^^vv  RRhhuu--ss}}DD77;;yyss##hhDDNNjjPPxxEEII__xxbb22>>ppJJUUII//pp]]GGnn<<@@++gg``iiVVMMCC>>dd11kk 44AA""aayy||WWYYVVSS==DDzz  @@))ee&&ZZ~~FF11..@@jj::uu$$ff99!!++**pp88]]  >>ffVVpp44WW11qqdd$$CCssTTggJJ9955]]kk00kk??MM>>//rr!!8800OOuu<>44..%%&&))0044{{[[}}II@@MM8866nn==zz]]vv@@rrQQVV~~33**jj++,,!!  }}$$HHOOFFAA==LLnn$$\\PP@@55llKK00yy ::FFVV88++ff==SStt@@^^QQZZjj:: 55mm[[[[ttkkooJJ==**<<BBQQ00@@MMmm"",,ffQQ22~~SS\\//!!**}}iiCC##  JJbbnn^^JJUU00]] AAii\\ccAA33SSXXyy,,44rrhh%%((TT3355)) 11{{XXSSYYRRSS//__MM\\AATTpp00ccddOODDLL((llff00BBii..55XX [ [ [ [ bb}}ZZ}}44   44VVmm  ddQQww((SS>>LLQQNN Y Y Z Z cc 22[[aa22++??ooDDeeD D >>{{ffddbb{{AA 9922^^>>77OOttQQvvaa''//vv((((sstt]]66KKFF11^^XX[[ZZ__\\jj  yy  ..qqEE//uuZZPP__ ]]44ffww==kk!!s s   g g ' ' LLSShhZZ  aaXX##ii^^ z z UUCCffHHUUll;;\\33BB>>rrOO 99<<KKnnoo==IIbbNN>>,,zz\\UUxxqqNN0011\\SS ;;1111__FF22]]**{{OO88))gg!!//{{MM ttyy))xxp p jj&&]]++$$QQ}}zz[[??cc99||hhs s OO__WW  qqXXJJQQ))66hh__hhHHJJu u ~~  ffK K iiZZUUNNttSS$$cc--88 ssOOpp||;;||xxRR  ,,||1 1 cc !!DD PPOO&&    3355ssjjccBB{{jjGG## AA kk== <<33||99!!ߢIICC  //  ooxx NN((N N  ;; zzPPn n >>Z Z xxr r rr 99]]ssnngg ##XX"",,NNMM5 5 77UUmm{{99``nnd d i i ..{{22CCOO))nn//@@## v v  RRpp GGpphhTTrr^^ & & DD11TT!!66dddd ??GGhhާ^^<> SSBB <<GGyyUUll##[[ww[[ ff~~ \\ } } C C ;;XXwwGGIIII}}??OOCC9999EEC C  V V  || WW@@\\۴HH\\MM \ \ ..@@ 3 3 @@< < WW66//GGzz  L L @@[[H H @ @ m m }}&&11CCTT* * hh//* * ))  V V .. 55##7711 > > ii""NN]]qqIIttGG ==FF''66JJ ooM M qqqqnn  CCIIJJ \\@@ KK mmd d t t wwv v  UU^ ^ g g 6 6 ^ ^   ll''GG00  <<uuII?? SSII..RR    8 8    ))CC޺@@zz00K K , , gg   4455;;3 3 tt((yy[ [ 66`` > > ??FFC C ppDDHHff[[WWaa88 ++,,&&~~$$   DDn n { { ZZuucc==q q 99   rr&&EE))5511  PP H H OO hhnnHH$$__w w 77{{_ _ QQM M ppmmm m KKll(($$ߜaaXXIIvv ppNN{{AAxx {{88    ++))\\ * * HHJJ""rrGGQQxxll ((uuttOO((NN%%UU99KK00<>$$ܟaagg UU  ++GGppppe e vv66  }}uutt== '',,==UUii881 1   ``XXa a    mmgg xxk k ccDDvv* *  ZZ7 7 wwbbkk??$$hhm m 0 0 iissKK @ @ Q Q CC DDzz??33(($$;; . . 11 22zz   ! ! cchh55"";;44LLSSAA44ppLL<<{{mm44 n n ]]hhv v gg))9955&& G G ff33jjBBss}}~ ~ 66 ((77ww88WW##K K 33 NNpp@@TTrr EEDD GG''? ? ||11HH++44aa JJrr@@hh--88ee&&GGooZZ ''{{<< $$<<77cc]] l l p p LL--== zz ~~==# # vv1 1 II _ _ 3 3 / / --66H H IItt[[GGyy<<{{~~vv 88yycc33yy++ ### # __dd``44%% \\ss``|| & & GG$$BBdd && II  D D  //MM%%330044EEzz,,&&--##qq 77SS99  o o ( ( _ _ uuLLh h   vv""oo  EE  % % $$ii}}bbee{{,,jjZZXXbb&&AA VV\\ ""!!MMLLKK>>zzEE??llbbWWRROO,,VV 11  [[  ggLL77 ! ! YYYYkk AA::##yy==TTVV33IIllQQ }}--ii]]^^QQqq   LL ''pp HHww1188[[zzo o     77 ll>>||dd11<<RR##??ppJJxxpp00NN""}}jj >> $$zzCCmm6611BBZZ[[00 \\HHoo  J J 66YY ??&&    HH;;PP $$ 0!0!X$X$! ! ||CCDD  aa IIccccd d @@A A QQFF55aaiihhnn'']]7 7 nn@@YYggDD//LL    @@CC66 00__dd//MMXX00 HH66EEOO55 YYyyxxGG{{22   ^^@@{{IITT``hhss o o SS aaXXPP__  CCyy 22FF' ' - - NNLLtt ,,""WWmmaajj++??\\{{[ [ %%W W  //oommhhllUU"",,""!!HH߲ ss 227 7 ..    QQ~~..s s ..AA33  xxrrUUII##<<99kk++NNcc!!99mmBB FF 44   ZZSSiiii kkjjVV``ttvv  Z!Z!ccSS==OOL L   T T kkaaccQQݎ55SS''44޲ޟMMWW ||  nnhh((--aaWW""ss]]FFgg''11rr{ {  //ddAAhh[[* * >>    mm  SSll66@@yy 22    ~~ޝ؝ssʚ̜ٜٸJ'J'22y4y4 AAo o RRzzww%%%%88xx77gg\ \ ##&&GGdd%%^^YYEE((WWTT%% }}**+2+2//K/K/9)9){{KK ]]ل܄ܥ٥٣ܣddDD99))KK==VVffWWNNDDSS{%{%,, + +%%99ZZ} }  ll**ݪ66>>vvcc{{ XX!!##YY44jjڞ۞ݢݢ??vvSS22 qq$ $   ``mmttܝbbQQ --xxWW,,g#g#R.R.4499]C]CoIoI@@#8#899'2'2++aaȜ))AAɚٚ&&ttgg8833c c 4 4 hhdd޹DDjj!%!%bb < < > > ""^"^"xxn n [[tt((0055YY||88eei*i*88@@>>..  ..~~WW^^ zzddz z ;; {{aa  ""||ZZ)) @@77!!&&,,˿˿__UUaa~~YY % %4+4+//33))&&;/;/V*V*F F NNii cc||MMZZ..хυόό88|| GG77ٕ++[[==$$--7$7$!!3&3& FFdd**JJ3 3 L L DDdd+ + TTff jjKK  %%""vv$$ttbb88ײƲϐߐUUIIUU--7.7.n n mmPP&& OOccMM)) %%hhӣ֣rr##hh$$qqLLVV$$88BBEEHH(9(9##""**%%ooyy ?? > > / / ккª$$<>eecc 77 99**MM)) ]]BBGGiiqqll**::;0;0*.*.^^  ؝KK11%%77JJ;;((2211)) $$ vvww--33nnNNԳ}}AAHH {{ PPuuaa llAA//eeJJII]]eeEE w=w=~G~G33&&..**hh WWJJ  t t ԕߕ; ; '"'"I9I9@@%:%://^ ^ rr  ``99,,``00rrPPggoo22[[""WW)) ++xx==pp&&JJ]]D D %%++--))pp 77DD))[[''**(($$}}}}XX||llBBBB00@@$$""OOWW>>۳ll''++),),22&&EEyyYYii YY))jj+$+$99CC0606%%EEըϨϮѮ}}zz__  2 2 BB۲GG(( ##00R>YYjj uu9 9 \\ppiiMMt t ++GG]]hh۵CC$$ii##ZZ]]++َ]]##,',' SS K K  88mm`` Q Q yySS##_/_/5544<2<2((!!**ۋ͋Τؤؠ zzLLEEyy]]<<\\^^VV??11J3J300++44FFۙә||vvttss  LL== ++DDoo CCFF""JJ88..<<''OO **LLgg((͛eeߊ߼ݼ{{aa ""%%((&&$$!!p"p"@@+ + @ @ {*{*88228,8,w.w.Öhh}}))""__rr'' KKrrJ'J'  aaދҋ$$>>E E DDffi i RRzz` ` >>ގޡ}}NNtt""&&X2X2Y/Y/*!*!AAhhii1 1 33CCJJJCJC##IIӇ݇114 4 tt==&&## ii%%U!U!X#X#}$}$hh((rr[[**..9933//3-3---nnضaaڞڞڌ܌~~FF22::8)8),7,7i?i?99**__""L L $$::FFIIFFJ#J#HHxx 22Ӧަ44__ ::  22__J J ,,хѹ͹((Z Z XXgg##**++l l ))))__    ZZߙ,,22##$&$&xxAA++&&--0055>>0505WW**CC!!SSh h    | | ccss**FF ZZ88[[}}  ssFF44++h!h!M+M+))++UU؇PPDDII55DD+0+0GG^ ^ BB\\##rr22IIttmm..::Q'Q'VVEE.."" ] ]  ++L@L@W>W>00!!XXvvTT<<,,!!++88@@66aakk//))<<حح؎h"h"33CCPPMMDD//GGtt55GGңУQQ U U !!aaRRHH33((llYY  { { NN$$%%..KKRRKK ߃''ؑH H qq$$''QQVV ??ֽ߽߰RR11##OO//&&&&ff͝TTϴPP1 1 ppTT ~~ . . ||88nn~%~%]]͜{{RRYYff EE!! ''##l l ppvv&&33..b)b)9&9&z z rr$$::KK ""v&v& --kk  ggHHkkܸ--ܬzz%%_:_:::aaiiZZ44߻߻||OORRyy%%PP""UULLee``_ _ DDjjX X ssttߨGG@@ٺ̺&&Ѐ| | ,,//$$K K  IISSBB   GG,,85858888>>>D>D*;*;&&TT;;WW33OO$ $ QQ2244,,JJKK TT::// м{{WW܊BB^^//кFFbb''"7"777 2 2,,^^``FFކۆ==WWgg;;yy~~jjVV%%!!vv] ] YY))ލxxP+P+>>^B^B88**xx;;ѪYYMMȜߜHHG G H H A!A!""^^SSZZWW <<$$XXcc 99^^..G G M M 77__WW99%%wwddԔ' ' ssA$A$h+h+!!FF & &00))_"_"}#}#gg@@ޫSSۧͧϷ''g!g!##m"m"   88))ll));;aKaK L LBB33XXՕ!!AA[[yyřų++O/O/))((%&%&oouu77Z"Z"**1122''77;;ڪЪ]]--DDUUNN4$4$//9+9+pp{{^^}}((BB rrGGii22**(!(!3311+"+"KKYY͘÷Ûƛε޵ގ( ( vvGGg)g)--33??77vvǠޠޟ??##,,//G G  ll IIPP''޿O O dd@@/ / $$u u CC\\̸ʸʼܼܞ..$$**,,\(\(??DD  , , EESSeeʁӁӶAA%%}0}0))... . ##{{**$$JJ!!&&L#L#dd; ; mm 66kk33ݛӛ(( 6,6,/7/7Q@Q@==((++33]]RR 99Z Z wwf!f!88! !  GGޤ??\\AA33<<..~~77UU Қ&&l%l%QQ% % ''VV !!q#q# == ddYYbb??==ƒԒԟ^^666633$#$#[[88ҵҵbb -1-1$?$?R@R@FF#D#D++q q {{// yy  22II77jj BB~~QQG G ""%%,,33>(>(MMֈ͈͎ώRRee SSHHIIyy""4488YYUU4%4%  PP!!UU8800/ / $$==B B ccll== wwLLDD;;  ll|%|% oo kkLLZZ99FF !!``99BBuu; ;   b b MM--}} KKFFDDRR{{ __vvGG//ccCCee??&&\\##߾::????TTnn>> <<[[66ڨ==))--""ttbb//jj99++J8J833uuvvZZБϑ==]]^^''N N   !!EE WW11==aakk {{ >>&&<>??SS44; ; ==--rrJJ99F F mmNN# # 66[[ooggU U RRooLLyy--YYhhXX((M M  ((nn ss{{EE9933||;;(([[cc[[ rr##CCoo%%3 3 ! ! aa && {{,,YY  VV ff99B B llVV }}ww--ggժժ88ڟ** !!.,.,!![[ ^^ ||??DDhhLL 77 JJ//PPIIJJcc >>ff99==BBvv>>hh  ll$$++33S$S$  ffػnn..vvGG//r r C C    cchhNNDDaa;;KKbbffHHVVpp} } ffvv33llDDyyQQll  ! !##""DDvv:: PP&&Z,Z,0099&&,,GGII00YY H H ^^: : ??77^^ WW xxjj//ttvv 55HHee || ccHH!!8!8!$$/&/&$$q$q$l+l+oo$$>>yyCC::@@}}!!OO,,IIEE  NNSSsscc \\ H H ff))PPkk  " " ++NNuu``44bb mm++c c   YYXXtt EEaa99 33 WWzz<<VVkk$$t-t-&&X)X)**44GG 9933RR߆::nn((++  OO NNCCZZYY\\HH33JJ00rrmmP#P#!!LL##1,1,u4u4H)H)=='';;~~ެެì11Ň$$,,DDrr __}}bb22- - &&&&4444Z3Z3::;&;&zz%%nn22mmȇ==88gg| | ]]%%00**}!}! !!((5599A9A9::::8800mm üü̳̓ϓЋߋhh@ @ %%FFqqؘۘ\\hh$$..++X X QQ@@IIooʝii OO$$?>ٹ**66;;DD@@..__>>..{{//kkppp p SS$$a%a%+3+3WAWAM> HH؅FFssssffuu&!&!..0&0&&&33E)E)NNkk  ;;{{̌XXmmII TT^^((^^##(( ! ! &&77jMjMPP^^UWUWZZ##έYY##11{{zz {{փŃ--< >NN66W/W/FFFF,B,BJJ4-4-R R { { %%Ҝ؜22ʂ݂ݏ ϻϻセɾӭޭޚۚbbÌЌ""$$uu, , ZZ**PP  ss::wwPPa1a1?K?KRHRH(0(0..zzܱܗSS__99OOPAPA#9#91I1ICC++gg[[qq 55!!Z@Z@FF((<<JJ͠{{ZZmm yyXX$$++@@dd  %%++ےHH̊ފYY"$"$??}8}8DDZZFbFb v v7|7|aHaHԼ11ڛڛ^^../$/$n&n&/ / jj]]RR ] ] ZZeeNNZZ77  >>g!g!AA))>4>4''((?1?1II\\88ĂģУлѻ11++88v5v5""ww ? ?HH77~*~*__iiDD  ..!! \\ ǣiiƉˉccoo00ZZx x :-:-"5"5))// <<}} ((!! ##%%``BBbbuuEE33vv**ll WWvvp p FF;;ɺԺTTUUUU9'9'//::TDTDHDHDNINIHHH&H&XX''[[ѻѻww--::\\uu11@@hh~~##.. + +11**$$11""(2(2??TBTB==Q;Q;008 8 ً͋͂ЂXX$$XXKK''44؜ׁׁٗ00yyEE!!5566==IGIGFFDD'A'AT6T6,,V"V"__" " 77dd˲˲,,005500hhSS[[GGUUjjߨ:: U$U$uu++/?/?EEGGFF;;22#'#'ؘssʾǾ//55##ff==>>- - <<KK''##z*z*88DD88++&&__wwVVݰLL++ ddEEaa   _#_#::t4t4**TTuuüü\\\\<>66,,  yy]]8%8%qq&&qqڈBB  ,,''zz6 6 77II ZZxx##{{BB""bbtt==ooDD""::|4|4nnvvEEMM٪((JJ>> XX--iillf$f$##""!!HHZZ<+>+\%\% ##aa7766oo$$CC5 5 ccy y C+C+//,,""44{{XXSSii BBvv  ppss]]R!R!cc99XXyy ii""gg@@bb[[֪((nn||))%1%1&&552 2 11vvkkRR;;٦ݣ^^""  >>CCJJTTZZ ԃ̓22##NNEEhhffcc$ $ `` P"P"xx# # طjj== //.. __``CCбyyЦצ׼LL33$$))J&J&g g ""Ͱ˰ IIS'S'''wwggff77;;l#l#))$$ (())XX &&))jjiiAAEEzz<<88""--330(0(QQXXJJ{{JJww ||DD5522!!>>gg!/!/--* * ˣݾݾ//}}ۖז88ݬ%%;4;4++$$9$9$$$(#(#cc  ޱee ffMM|| TT^^yy##--]3]333((ߖԖ00;;DDٓ   ))>>L9L9` ` 77IIɶ¶II%%?? ee**00..''}!}!A A ##֑ۑ33qqCCaa\\!"!"##NNޤQQJJww!!!!="=">>II TT ddss~~bb)*)*AA}>}>h4h44!4!FFإiixx5566o o [[VVOO) ) yy00NNLL{{ѕؕE$E$77k:k:**""ee Ǽ&&K K <#<#5+5+6699//3'3'R"R"AA yyXXɬxx88aaTT>>Ҏ77NDNDI@I@v/v/  aaùѹ  $$%%F&F&6&6& // 99iiOO##yy33%%} } qq66eBeB^8^8תǪ׻׻++''&1&177%7%700%% jjCChhڳѳ??OOVVaa`,`,9696))qqaagg2222t!t!   VV))nnWW@@((//NNddxx@@VV,,  ||))nnZZ22ll~~  ccOOQ Q $$##P"P"%%LLJJӕ̭̭̍ōEE""))##-,-,11t.t.SS' ' ^^OOSSjjhhffggGG22QQBB]]ߟ44BB::%%hhnn0000 VV))w2w22;2;U>'>'>99I0I0WW۫ͫ== ~~##L0L0<<;;..&& ""::..ٸ ##;-;-*+*+K%K%yy^^**  jjRR33FF  1 1  {{˱˱[[ϰ;;++-E-EJJ%7%7''\\..RR##HH::hhUU [[ccLLBB  xx --DDOO##--hh 22վ׾HH55||s s ((u(u( c c 00~~==\\AA ""((""__]]ߐjjkk;;//11//;,;,%%tt NN[[ xx44ggkkCCUUMMT T DDp&p&I1I122S%S%55ffwwƌ pp[[MM00b$b$Y3Y322553939c.c.  ssMMXXʘǘZZ}}//iiVVoovvqq~~7 7 X"X"++5511WWCCqq˺CC>>Ӟ//&&''J&J&{{ %%""?? ))[,[,%%++rrBBLL֞͞((Ղ܂ܱVV##--p1p1  RRtt||ٰXXTT1111  99   ss  VV}}))))vv ##||{ {  **##~~xx%%hhʠ֐::@@k k   CC``>> RRyy}}||  ||::eerrLLttӃ݆݃OO((**""}} KKuu HH((%%hh11bbvvjj߈ψll::$$ ==uu3355".".((܉ۉۂ\\  ee))DD]] @@LL V V W W !!%% OOhh77zz%%''`,`,((##L L ݿkkښ##pp8 8  ||DDuu<<<<::6 6   RR~~``ww77Ћ`` A A N#N#**KKDDXXuuEE%%K(K(--..%%LLO O &&ƿ̿̋Ջղֲ%%mm}},,jjXXbb<<@@{{##ܖ22kk  $ $R)R)4%4%]]AAII  $$tt++ttssF F 88 EE MM||77ppq"q"f(f(x*x*,,8.8.JJddVV١¡OO99JJ??v v L"L"E0E0k5k511&& ݨ qqԎ::P P ))x)x)((""I%I%u'u'gg 66""ѡMMUUcc vv::TTwwMM00* * BBAARR<< >>4$4$$$ww qqێ22!!zz00t&t&f=f=CC99*-*- qqߑԑHHDD))ҧ֧֕(({*{*n1n1!1!133F4F400C.C.**##ӣŸRRVV}}!!XX((Q/Q/[/[/S.S.((CC؝MMLL{{FF))qqnnKKmmRRL L $$FFrrߙ!!!!QQllOO %%//U7U755%%zzoo}}aa^^ii,,KKA!A!J"J"/"/"V"V"!! rrRR;;}}̚̚oojj##k(k('' WWW W 55ZZ))LLA A   ||((ߧݧם՝\\hh  j$j$h%h%x#x#ww hhXXEEbb))DD##""ww## 66hhMMݼhhڑܑ""++eeQ%Q%-1-1..V V ==<>//22**rr{{PP hh@@>>  ZZll77FFddSS  FF@@ &&^^kkDDZZ?? MMBBllGG  ee44BB33__==####__jj < < ==}}oo}} !!$$_ _  u u D D ``rrxxRR33 xx ))PP>>1122}}hh vv: : TTFFiiBBcc00HHVVtt F F ^^yyMMee++!! CCUU  MMZZmmEENN2299uuAAdd}}2 2 ]]ssbbD D QQ((gg]]vv<< LLII--? ? GG22uuCC kk ' ' RRCC^^ZZ99??33vvnn//H H VV^^M M EEZZ66""~~   cc&&bbttkk[[zzQQ# # ] ] UU;;--!!  ) ) UUrr&&))j j   6 6   SSAABBTT::ccQQ lluuWW55 j j ||NNxxrrTTcc   ^ ^ --rr((nnJJYY  ss<<LL 33YY ^ ^    77ii((   22==LLnnIIddDD{{[[CCddJ J  qq--  % % DD99CCQQ//QQAA uu  T T  ++$$^^ 44 nnaa~~$$>>  EEzzcc{{NNcc ; ; kkhh!!aapp  PPrr  66++  11d d  ll""ff88zzUU[ [ ttf f jj''UU++EE44''DDYYCC44!!rr     rr""BBGGmmLL))VV@@//||**++  MMa a  A A LLuu bbYYOOhh77C C   ++??((==33cc66vvxxxx>>FFqq ::}}gg~~DDww^^xx ++GG~~2 2 ) ) <<SSyyffBB::44>>  ii m m * * ++ll;;BB33ccccwwgg((  ** e e  ::GGffDD\\SS ||99AAGG__  Q Q d d ??YYvv ZZ  G G n n bb4499gg%% aa }}hhyyAAB B ' ' nnnn%%PP88yy<>zzdd٣ٯ˯hh55   Y Y ,,ff H H }}88 VV''// 5 5 ""U)U)M8M8B0B0LL''ҼPPѢۢ33``## BBFF[ [ 22xx11vvJ J ##NN ::C C ## 5 5 NNooq+q+.3.3p?p?JJU%U%JJ##q q WWAAƍBBccZZMMԲ%%ccJJ  $$##qq}}QQ||%%ЮbbӁrr//W>))X,X,--l7l700&&77&&77߻%%xxllժߪ,,++ ||55OO99ee$$:%:%##((22,:,:77717188??ssccԮaa77dd\\pp++,,&/&/__\\Z$Z$--88ssu u ..&&uuyy--z!z!}#}#""^^!!\ \ FF$$11F1F14455==ss22OO--::ffVV(&(&w)w)\*\*!!}}uu11  !!OOEEeeQQz z   ooؔÔFFɩߩߘՕ$$--((!!!!l&l&))&&+%+%RR5511==MM44$$,,ii„%%[[۷۷`+`+66DDDD0A0A==))8%8%RROO%%SS%%$$77KK&&[[____jjqqgg8899_J_JPPKK>>55`-`-((a+a+SSVVa a nn77VV++VVʽ;;uu==նն %%22<<==??i>i>224*4*//%%``ʰ߰qq,,""޶8*8*Q+Q+''""99( ( vv''lla!a!664455gPgPY@Y@ܑܹllMM%%3377M8M83=3=DDBB(0(022 >>ȤդjjIIFF33||88ݬݾ ))::68681414 ; ;)5)5## .. ii;);)==CC~?~?;;OOkk]]MM{{UU˦""99FF*R*RUUa?a?M$M$;;g g }}Ԕӳӳջջ88CC__H H vv}} b b QQ^!^!ZZjjE E vv( ( !!;;II4]4]__G-G-nnمԅZZ>>\\nnUU33nNnNeTeTZZXXBB'' ddUUɵZZJJ77II" " ee;;zz AAttxxx!x!%%11CCRRcc f f>>ee__88̑``ǸǸWW%%!!;;8F8F@@D$D$aa  >>eemmdd o'o'//(({{PP88WWߍBB ,,kkll\\((g&g&$$2-2-99LLTT::Q Q SS҇¸rr]]ZZ ++7744e/e/ ) )ooщUU$$00))nnaaTT88CC0 0 ww  ee6 6 ::``$$11 < >**~~NN))--hhxx%%))%%''((""y"y""" S S    LLTTCC ‹Njjj$$88 NNBB  ++tt>>--//$$ ooУ}}&& ]] ^)^)$$  ""!!nn>>s!s!D#D#//s s !!aaDD44ݜĜººÙLL``00 F F nn    mmSS;;,,e e 00,,0"0"MM..%%FFjj!!WW}}xx{{f f ?? ccLLCC<<C C $$##p$p$nnD D bb00++,,pp<<  oo..cc5 5 SSqq$$**# # __vvbbbbcc  ##DDYYssrrZZ00ll??-#-#  ,, ZZhh$ $ X X JJ@@R R ZZxx!!OOVV~~ PPdd  ''   :://}} !!>>sskkݦ88II[[ ii@@dd ==WWeeSS ""jj2222=={{mm%%  22TT__&&b b PPpp ""xxPP??ffnnuuPPbbW W }}JJ ? ? 00;;GGmmBBss WWmm   b b ss> > rrww AA** M M RRII\\``mm""[[77  {{CCFFMMaazzXXNNwwKK II!!}}pp!!bbAA Y Y ##m%m%R$R$?'?'n$n$!!  ,, 22wwө۩RRee  ;;  ::--kk^^UU))O O   r r }}KK!!ff??Մڄ&&5 5 ??  ""PP::OO::CC       BB{{88..``͵M M %%))$$**&&44HHtt QQOOvvWW  OOnnnn%% bbtt88A&A&%%##F#F#RRNN!! nnyyj j 55  [[((//KKPP,,xx^^11bb  //GG  qq^^[[DD55**aaPPLL}}  TT334 4   } } vv88ffDDhh[[[ [ ``JJ@@SS     ddQQmm``xxRR~~``LLMM}}>>~~LLkk44[[JJ]])) NNAA   ooCC33  44ww//ZZ11<<22  A A   }}++xxzzuuOOaa A A b b ddOO..WW8866??##!!yyHH s s Z Z YY""qq ##VVbbTT%%uuYY ??''))ggttcc00 22;;xxZZ((bb22SS @ @ wwPP>>| | - -   gg   bb%%{{hhZZ--  GG\\NNjj  22h h XX44##MMoo ~~88qqvv  kkll==>>EEKK%%CC..rr44??--,,  uuyy((##oo||LL  DDjjjj ~~rrxx;;  KKggb b ^ ^ 11  cc nndd ee  YYrr**++^^88bb{{\ \ FF**$$ii  22 AAuuO O ??TT ZZVVQQ]]!!       @@GGhhnnYY__?? - - ::--kkmm33GG~~SSooccVV ??n n oo 3 3 ss< > zz==++NNZZ..WWWWww@@99EEddJJRRXXVV4 4   PPggSSCC::11 --W W 5500 xxYY   >>]]++ss{{33MM..^^QQ]]  E E N N mm @@++jj||IIJJ--AA::CCBBJJ""EE  AAww""uu\\tt**++! ! NN --nnppb b < < [ [ 1 1   1 1 nn66BBzzvv66UU77..::~ ~ a a 33  zz99ww[[VVyy55yy5588 <<$$66~~77 """ " vv&&KK    ++ ((// ;;;;Y Y >>""ffbbs s 8866TTCCnn  //@@ {{5 5 ))\\^^BB  ||zzxx##UU__ppll##!!bb DDCCBB FFXXz z ..ccEE""**ZZ &&++) ) ``## ssTT SS~~^^//( ( vv %%>>ffzzAAHHOO77``;;YYff--dd  ^^ssAAOO~ ~ DD''\\,, PPTT ,,wwY Y ) ) JJII QQTT!! 99((II% % TTAAJJLL~~qq:: 00. . C C XXwwOONNqqaaII==PP||ZZ44   : : dd** //MMpp::  ff99 &&ZZ 44eeFF((ssQQ``t t &&99BByya a _ _ $$    ""< < OOjj  | |  T T vvWWݭaaRRxx&&  qq  6 6 dd,,XX11 XX$$PPdd qq@@\\ pp~~""::\\)) n n HH%%^^UU@@\\55g g T T XX44tt~ ~ 66 ݀KKVV~ ~ JJ rr RR,,  BB||HHAA %%PP 66XX&&UU77ݜ//ssU U ddj j 77]]99JJ  ooXX!!55| | / /    ""ޓHH[[uu **OOk k 4 4 55[[pp      Z Z   }}33&&55uu ^^L L   ssww[[ UUrrIIBB mmUUnn}}y y II??9944iiaacc-->>bbii[[ __IIii>> UU00MM||**ii= = NN,, \ \ ee--nnJJgg<< 11  ""??##bbff~~ a a ))ZZBBxxXX77ppEEq q QQBB77 HHuuMM<>88%% ] ] 77QQ 8 8 44YY@@ddKK,,EE   HHAA$$pp H H Y Y 88''BBWW11wwll>>ooQ Q ]] ]]00``88cc33{{NN$$HHII  XXCC ++F F TT??ZZGGMMuu11rr||AAAA::{{XX >>66g g OO@@ggOOqq yyee ZZ<<==__mm11 !!x x K K jj44zzQQzz  G G " " LL||pp}} MM44!!  55W W OOggJJ00 ll$ $ LL>><<B B   77RR+ + pp++<>oo''&?&?^<^<00'' ::SS==ݫݫaaSS//PP``zzyy==88&&~"~"22..  >>--!!,,;;44llMMllQQKK@@77#7#7iAiA77%%RRbbOO^^ٵII??mmW W   4 4 44 ddOO 66""22==))OOee..%%??QBQB11!!uuXXPPuuq q  UUffLL<<  '',,( ( TTbb55??""N4N4==OOզ\\%%{{##\<\<>>x/x/? ? XX[[CCUUvvHH EE aaccFF ss'' gg99II2255??ݡơff uu ))44..P$P$>>!!00eeSS`` ww  ''LL%%vvuuii [[##T6T6DD<<PP ^^߄҄nn~~SS̻ݻuujj"">->-W/W/]+]+) ) ) ) DD>>44zz} } 5 5 //MMQQ    WW   \ \ <<&&3388ثثǿǿ<< ,,l6l633**UUbb  S S 88ff[[  F F ^^  ^^  %%88\!\!kkdd̩ʤͤaaVV__77>>;;L5L5+$+$4 4 yy2222LL33JJݩ݆44T T a a jj-- ``QQ""5#5#.. MM^^ffĒ’LL&&IIV(V(n9n9<<#6#6((((zzNNMM--//ݯm m ))JJzzRRtt;;- - jjMMyy==1 1 EEEE$$;;GGiBiBrr•ƼƼϪJJuu 1166x-x-""^^OO>> ##wwaa44VV  tt||ggVV BB>>""/7/733ZZ̃ԃkkRRi i uu     HH66MMLL[[ss  eeLLHH pp//zz  HHxx{{++W3W3BB3J3J((عع%%!!))[:[:22J"J"VV؉0011g g ^^RRݏ""!!{{}} ,,''ppII}}__$${{ww{{$$s0s0##))))ڿѿccZZ- - ::yy<>uNuNSS*E*Egg((..]]ȔӔӡKKll88%%`(`(gg TT**OOV V iizzKK\\CC))1 1 $$UU  >.>.<<>>R,R, ɛ``ss^^&&2244//9'9' ff YYߟ^^!!77""jj{ { DD !! rr''HHLL^^gg~~  ppS%S%99EE??66++%% ɶzzLLݰݰXXʯBB""q&q&d"d"NNjj%%jj11!!CCDD $$9!9!&&SS DDxx 2299o"o"2%2%##  MM RR %%xxԒϒϗҗJJ>>vv $$!!WWnn$$77B B rr**qqtt$$))**++##<<FFAAssCC##oo++99 UUGGr r U U 7722 ..iiRR++    99tt %%oo __J J p p _ _ PPhhkkBB$$eeII uu~~rr<<  eeoo ""KKnnmmYY\\ ..||55"" ddpp11VV,, .. &&{{JJ   kkWW}}ff..   NN~~OO;;++JJ$$( ( <<77ww??iiAAC C SShh**ww00pp\\88 y y FF++AA||((ii::]]''[[00m m .."",,@@aa 22 cc00jjSS SS nn00$$ccll  ; ; PPffppTT??: : VV;;hhPP {{ ccZZj j p p ~~EE%%77DD uuR R : : D D   22aaaa--IIhh: : ] ] uuxxSSXX  ))55vvsssscczz ''ww$$?? qq!!f f  &&))]]VVVVzzkk55/ / !!4 4 G G  ~~jjpp}}UUy y   ^^rrIIj j bbMM[[bb55  33..ff ffAA::, , HHiiJJ^^KKSS@@>> T T h h zz99MMww%%%%EE^^( ( || E E % % j j ))11~~VV   ZZffKK88FFxx ||^^jj **XX44FFWWOOCCVV'',,QQ\\::H H NN//S S ]]ccQQ..++22     OO]]||zzCC33 ==||hhllXXXX88ooiiqqaa 99;;uu  44{ {   [[]]SSFF44## [[  BBss = =   ;;..--  yybbcc}}bbff%%. . gg??CC00++PP,,yyLLUUDD // `` s s 552211!!hh| | KK==AAEEKK [[ ;;00AAvv__ rr66 HH``55[[Շ݇**33z z =%=%*&*&ee  --,,TT! ! ::lltt1 1 ]]@@qqOOY Y ~ ~ U U u u h h 3 3 ff99((??uu(( nna a ..   3 3 &&88mm AA++__JJiiSSII##    qq 99PPii33%%44  > > BBN N ``QQ..wwYY..uu~~ 4444     $ $ SSaa,,^^ SS``SS66MMppXX UUvv? ? //rrAA{{BBffU U   ;;//ttFFddUUpp nnVV  PP~~]]**nn77bbxxff K K <> jjWWzzss11++zzEExx77|| rr RREE $$TT]];;99EESS99EE;;88ddDDssHH  {{((""VVxx88FFPPnn>>EEiinnUULL!!++uu88kk^^ BBzz//''UUkkFF""``::ggaa}}ZZ``''LLzzxx~ ~   A A ??{{BB22PPOOZZ~~RRvvllwwBB\\XXbb&&||ssPP((vvttvvEEqqc c ""44DD--BBAA##WW++]]~~aa^^ggOO~~!!GGhhWWxx%%66$$rrddKK1 1 LL  ffGG``RRWWTT44[[vvDDTT66XXzz pp22qq7788NN--;;HH RRaa00$$((;;GGzz00ZZ  u u 3 3 G G RR..llcc  88^^EE@@((^^~~&&KKpphh||``##LL}}--TT:: m m L L vvkk**ii66B B ##RR>>OOKK,,DD,,]]%%LL  ggkkYYSS  CCrrBB,,jj!!**}}yyll77zzRRVVkk++$$mm q q H H ss~~VV}}33:: //''((xx@@WWeeii55mmTTxxLLOO**77P P J J eepp%%!![[kk&&rr``55YYEE99QQvv99%%IIaa55||  [ [   Z Z l l   !!''00ZZ66>>22''ZZnnvvFFXXxx**ccMMyy[[@@}},,~~vvCCz z t t Y Y >> BB]]RRjj&&%%NNmm##44HHttMMCCnndd"",,{{)) H H   GG99wwPP UUooH H __hh88{{-- **kk**xx00--<<RR k k ((pp ++ffqq::!!--<<33yyvvDDcc||//TTQQCC11OO{{**VV j j JJ''``%%..HHGG??YYvv66ffuu**KKpp  ( (   I I , , dd aa..VV}}&&KK  qqcc --ww::KKww;;FF((EE ``22ttcchh  TT;;||//>>''PP dd 22 A A 7 7 [[44 ^^99nnsstttt<<&&AA22))--aa--rr{{JJyyYY;;7 7 B B BB??QQ||vv//PP{{??%%YYTT!!CC))uuVV22OOff!!::- - [ [   hhJJ**``\\eevvTTXX%%yy55  UU88OO**__((vv OONNJJXXFFXXrrRR  PPzz))22GG99..RR  ssAA}}b b ..$$oohhLLJJ  22..\\vv 44  pp7722FF--xx ##aa;;ooRRii``    ~~ L L i i {{YY==j j uumm GGkkKK    RRmmK K mmBBddFFXXFF7755ttbb   ##++ppYYnnb b ??  j j   uuMMQQ  : : UU//33YYxx!!ll\\11] ] 6 6 Q Q ,,yy  77WWAA NN--1 1 ##߫׫\\))dd:: \\pp  77''PPss  HH>>{{^^yy }} $$$$**::cczz  SSWWVV \\bbTTjj{{YYpp>> ֽ??((TT##R&R& cc//00CCCCJ/J/ 5 5YY??uuUU\\**!!!!))(($$ qq//44֏ֈˈ66gg!!N N ]] $$!!..11vv1)1)EBEBi(i(OO22ss $$,,====&&PP;;bbll__6 6 [[ddnnKK%%FF7"7"w"w" = = ww : : %%I=I=..99Q Q bbݣzz99{{ )) }}~~qq--xxUU// cc&&&&YYXXUU mmEE))DD)K)KVVQQʳʳӺӺЎЌ݌LLqq&&00;7;7<<22ccrr''(( pp $$ L L ݂((%%>#>#)!)!SSܝ( ( w*w*%%EE##OO 5&5&..z,z,--aaaa,, ::66ooJJ44<<__ ` ` xx8866> > ??  XX%%//F F VVܻ884455O+O+((##  SS 11KKJJ BBooڕߕCC==  s#s# + + __QQ@@"" ,,$$22//{{jj% % 00--WWXXޒv v  WWYYrr11 } } ` ` ll@ @ BB **<>tt''//<,<,-&-&jjz z {{}}%%jj\\GG""c%c%v"v"00 $$l l qqddTT<)<)44KK;;@@ޫ޹ڹGGٹ33ee""""٥NNttdd yy## ||u u }}rr9 9 ))BB|3|3??//WW ~~ݔؔΛś||șٙWWhh%%11"1"1~*~* # #_ _ &&DD@@GGZZ ^^77WWCC''v(v(22-->>""߯߂݂ߦGGJJZZ%%..N6N6AAd=d=11^^ggOOf!f!$$++&!&!__MMyy77ii ||MMKK;; **""" " $$VV11aaMM 9 9   A A A A ))00+$+$qqޣaa<>ccYY  %% ]]{{ y y II22[[ss] ] ww''a a hhuu^^CC5 5 ccOO**} }   BBnnDD~~ jjhhLLww]]PP  PP 33{{22jjPP::U U q q     ''g g   KKrr33eeuu[[,,%% gg**yy,,``eedd^^GGttPP  FFFFJJ33^^;;XXL L 7 7 ' '   " " II  WW  88OOkk>>oo      //xxee&&ffwwOOddeeKKvv@@yy44gg;;>>XX;;99\\ ))^^kk..$$ee**SSvvuujj..33rrccyy11]]oo??@@++hh--rrNN66qq;;>>TTss33++^^,,>>AAttxx[[nn//^^::DDffRRssOOqqQQuuqq,, 11HHSSmm:://llZZhh&&>>77XX**<<VVBBVVff==>>,,hh''((jj;;ZZHH::(($$MM~~ffVV  zz>>jj__ll;;QQll//]]""99ccVVkkhhII44cc||TTFFww\\;;,,HH++~~CC**yy  ``OOcc}}YYww33\\TT;;ooOO\\[[FF//eeUUoo ==PP..ooOO""   NNh h ??KK~~MM ttQQ!!GGwwEEVVkk&&IIttZZ\\ qqFFQQnnVV`` * * bb##++ee@@FFFF  OO  T T 3 3 66{{\\==HH""kk66__[[((--77//wwSSkkjjuu{{aaAAbbWW}}DDEE\\ { { - - OOMM<< UU  vvCC@@\\!!??pp]][[44RRll&&aa lllld d EEJJ<<::66ssVV++!!GG88**77z z o o   ee-- ##,,TTII&& ii  {{jjddFF))@@55mm//||,,kkss{{ h h TTtt@ @ cc>>SS BB<<rr&&gg77ccqq %% !!p p ((99DD00RRrrDD//[[00xxLLZZ99rrAA kk%%!!eeYYZZ::qq%%??HH99BBOO))ff))  33@@TT66++22jjkk??TTTT..;;rr DD[[MM``]]SSkkbb//ll99ccuu##XX""dd??KKnn jjBBWW,,66oo66NNCC\\ffssddUU>>bb  qq8844BBZZ::ddssLLVVZZq q @@99((EE;;cc- - mmuu))00 YYpp``bb==!!  @@44\\tt99uu'']]00__ZZNNwwvvWW>>; ; ffYY..{{..jj1133))##AAxx 88IIyy((}};;wwSStt((ZZvvxx``44DDYY--mm~~CC[[1188YYCCooBBCCAAHHhhJJbbeekk{{yyEE00XX!!KKVV{{bbMM E E " " RRooww``ww dd,,qqWW((ZZ&&wwEEYYttzzcc,,;;..##aa55YY@@44QQmmzz--##WW__ww,,##TTnnccxxD D s s V V DDNN||..@@&&WWnnaaoot t } } ' ' //GG<< yy    ss99&& !!22hhiillAA + + 44 ,,==VV..@@~~   LLuu vvBB  ]]QQiiEE33::**??}}{{ggJJyy==;;""JJyyLLUUiieeAAyy**pp  YY ~~ @@66~~]]GG rr ++,,NN$$%%Z Z  OO~~aa--  ffccYYaa yyjj??88pp]]||__ CC 77!![[\\kkooqqMM ||  rrdd}}\\TTNN##TTAA 33AAgg''YYHHggVVtt..ggAA??FFRRJJ<< q q 00==ttww]]aa< < ;;wwkkcc``44II**&&OO;;~~**LLiiQQ  ] ] VVBB==ttKKTT,,gg44TTeeKKpp<< z z   NN~~ll \\^^^^  ;;HHuu))##ww??__XXoouuvveevvvvee//UU jj OO--``w w  aaffeeGG==aaWWaa>>WWrrff [[{{YY$$WW))ttvv<<9977GG;; ; ; dd??>>XX 44AAW W yy3 3  __~~UU||[[33ff 99 rr 00 {{HH      [[ B B 1144[[__VVhhFF cc= = ((//44;;( ( ==  ? ? l l //AAHH<> ? ? HH,,&&,,SS44OOxxLLLL44 //5511ddf f TTO O 22 _ _ ppII ZZ_ _   CC oo9922== ""ee   E E  pptt,,''[[ Y Y ~~ii<>bb33SSzziirrxxZZ% % EE++++wwRRFF||u u U U QQ NNdd11mm::    TT,,jj~~5 5 \ \  UUn n aa--## W W ==&&cc--44((   m m ii{{""  eeee --ppttRRPP--%%iiVV a a   VVNNRR::99;;EE||cc ;;     SSy y ((ff 33==99%%ss..{{>>jj==FF<<SS  QQ" " ^^HHrr 88""gg\\( ( CC PPT T TT  { {   66 TTvv%% MMڜhh::ZZQQ##;; KKbb))ff\ \ 11aa  $$bbKKܵnneeCCRR''| | VV\\%%ii;;&&mmZZ44]] ~~~~zz99yyAAKK   rrى٠ mm٨;;bb  oo55TT~~**bbGG8 8 s s Q Q MMAA ggccoo??((    --NN݇ݸѬ##]] yy //%%zzAAaa<<__``--ll22##22x x   oou u **__88>>y+y+ چ''NNrr UU ZZggYY ??<<NN99ii``nnT T EE  ccEE%%^^(('6'6[[IIWWllRRTT  ))''II55LL))BB$$##nnUUSS## ++yy>>JJOOKK;;QQmmZ#Z#A2A233GGgg  !!VVddAA!!NN DD``WWDD~~44==PPMM..;;889 9 nnii  ff''""PP))''ߙyy 77##ee II;;22OO hh==11<<88 99}}xxg g 22EE**rriixxF)F)66``޳oo<<[[..}}}}''EEAA##AA<<C C JJ ~~~~8800zznnEEIIWW1'1'66KK''߃cc{{~~AA bbppllggeeGG ppssXX..  ||\\@@}}""$$jj((((AAߙ^^((uuwwVV}}}}GG'' [[ZZ U U n n ` ` 4 4 mm mm SSCC??@ @ ddY#Y#+)+)##mm00==\\ggMM__* * (('' cc HHff++QQwwHHvv   tt>>VVEE??77xxYY< < WWo#o#eeCCzz))$$cc**uunn6 6 @@6600CC??\\ E E 66]]88ee$${{xx))  !! ]]SS PP e e XX  {{YY55SSyyNN SS zz 44MM__E E 33^^bbKKAA<<   ZZFFII x x zz: : - - o o ""F F . . = = ??ppBBuu` ` 22dd3"3"  }}RRݯޯNN^^~~x x @@ii <>= = DD%%JJ00$$YY33kkKK>>ދBB&&((#&#&v&v&zz\\22~~NNPPAA00NN ! !jj]]llwwIIs s GG  qqPPoo 00aa  TTuuZ Z dd))X X , , uuggdd**LLwwuuXX!!""-!-!v-v-44&&))ߋۋTT  ##3$3$[[ UU!!{{ KK<> xx[[bbffz z $$)),,**w#w#LLww``   ee** <>"", , ;;G G ooWWee;;B B z z hhXXmm* * 1 1 R R qq;;99==QQ;;$$''**..zz LLCCgg ww~~EE++<<hh@@rrQQ]]NNpp  ## ++ssee%%II;;\\aawwzzOO  99OOss--zz<<\\{{ RRcc!!}}OOBBttM M 11YYrrSSiirr''yymmllddggPPllSS((LLJJff** 11bbSSwwQQ,,ppggttZZmm**bb!!``??00IIxxvv$$4455ddmm@@bb jj!!XX0 0 D D kk@@rr**GG,,YY^^LLFFtt{{^^ee77llmm::SSaa`` [[II<<JJRR{{>>??GGzz$$%%88FF!!,,pp<<ttbb<< ]]55gggghhZZKKDDIImmJJkkCC++mmpp&&jjllAAdd@@ --YYXX00}}77DDCCSSZZ  PPtt##  ssLL;;''UU  zz@@WW77aaqqbb  nn,,$$aa00zz VVMM````>>55__jj22UUggRROO99''**PP11}} EECCnn??''GG**vv}}zz&&[[22ffDD[[--,,RRPPee__ZZ>> BB--kkgg::RRCCEE<<  LLuu TTDDffzzssGGvviipp33QQ++2288ff]]PP**oo##vvvv!!~~ssLLrryykknn**@@##11]]WW""ppVV<<55<<  $$CCFFXXJJ1122 {{JJmm,,..''((EE''AAnn3344vv;;VV..__OO**xx==WW??DD  ,,$$zzii\\iiSS__))$$iiyy aa aa\\KK44 EE**kk4455..``  @@\\))__BBdd 55%%..JJdd11VV66WWCCll44jj55LLzzllff##KKFF__%%""FF]]22wwzzKK}}##AA;;++JJ66 55VVFFSShh88cc..55KKrr^^<<\\yyXX;;ZZ\\UUhh11FF{{55YY^^00xxbbee]]yy??PPLLGG99ssQQnn //mm}}ff..""XXUUbb||  II11XXqqCC{{YY..!!pp99ttxx''xxHHggYY33 ??IISSii UURR++<<rr''RRHH??mmuuQQTTIItt__00''66} } ` `   %%;;XX88;;mm&&XX vv  BB..ggff,,QQ @@bbZZDDtt))YY  77uu77VV ZZ//BB66##PP5522yyHHYY..ccXX::4499oo88FF..~~qqdd  <<EEGG<<HHffttmm__iiQQ33PPKK++""??ee]]((==//~~66 [[PP<>$$rrII!!uuOO[[dd``RRrr__}}SSCC##rrff$$**SSuu##nn((jjll&&DD  88TT""tt''rrQQ..}}iiII__``$$cc&&++~~ZZcc``  NN||  CCOO--QQ--ccGGvvQQ{{rr;;VV22SSXXyy55llbbZZmm;;ll99``KKeeGGZZ,,NN~~GG]]ss  ::QQ??ss00VV//[[;;jj++VVGG@@MM??##VVWW22aakkUU==FF__**kkyy@@jjqqpp;;ggww[[NNTTww""ZZ**55??]]cc;;cc..aa  @@iizz;;cc  ww==WWaa@@||xx''ffii::aaLLKKHH88>>vvxx]]~~  XXLL  qqDDkk&&$$yybbvvnn##__pp ,,&&$$66[[!!ddccmmQQ  ""  jjGG  AACCCC(({{XXzz``&&>>bb}}mm::@@ii[[LL''zzvvPP&&__ZZ""||mmKKhh44 ppPPee"",,SSVV??zz__vvcc\\DD\\??rrjjSS**AA,,P P   ++hhJJ>>ss``hh^^ZZmm  ^^  5500tt99;;''qqssWWo o H H rrFFAAww$$''>>))ttpp..z z ddzz[[ JJLLUU77//;;QQAATT&&##yy  OOSSNN22llQQ~ ~ 11~~XXpp 88ii^ ^ # # UUiiFF$$^^00bbQQUU[[vvXX;;RR]]44//ss33== ))  ee``cc``00}}EE55 LL OO MMNN22$$NN{{::@@%%..BBnntt""__XXN N   CCJJ4 4 ""CCGGAA++BBUUff  ""    ss  yyIImmxx}}"" n n !!@@]]  HH  ooGG 66==DDJJ ff[[cc44ww  yyCC\\MMtthhddUU  ggPP //==99ѽܽ| | VVWW__jjPP""kkjj$$| |  bbddhh{{88HHxx``00``dd]]zz % % 8 8 : : VV !!VV33%%r r !!bb kkzz{{55PP SSuuEE '' __EEH H ..HH``((SS DD f f 00 vvyyׄ22  ? ? ttMM   / / 77ooII??MM> > vvhhuu QQ%%??"" """"' ' gg __ KK55 ? ? [[''     c c ~ ~   mmJJ--==  ++55!!$$ee ww**y y BBܲffEE SS;;wwyy%%YY  KK''ff**66xx>>IIۈyy##  dd88;;  ttCC% % !!ݕNN uupp``77R R jjee88--tt,,rr..::22޻  { { ccSSJJWWgg ] ] Z Z VV<<;;] ] aa  DDJJMMxx  ))J J QQ<<ߝȝ11PPHH>>  ..??ppii R R Q Q / / ggrrooYYuuII iiI I 22}}KKrrQQEEvv11{{||88ppڬzzn n !!<<!! ..||''ܒvv 22ll..++d(d( 55FF..tt!!""@@00wwDD11  UUkk@@hh CC 55((  //OO a a kkc c !!@@==##ZZ33 s s dd,,--llշ22Ѷ{{N N ;;,,--jj77OOBB``>> ,,uuee..ܓԓuu55ppNNDD%%ooggDDܨ  J J  ,,^^ߘ<<||kk    DD&&GG11  ( ( ]]]]ssDD ..!!??]][[mm&&kkݜxx   ==,, ::. . 22uu 88__%%LL( ( ** ** ``JJ} } 44~~ۺѺpp rr3 3 ''$$ ee--II00 nndd % % 33++KK UUDD((__??__``PPttLL ##--`6`6g$g$zz Ԃ11>>ff $$xxjj@ @ -- NN܂77ڰ__V V ||99$ $ ^^SSCC99ss TT++0$0$~~DDKK66AAnn22ttiiVV DD RRmmAA6666 ^^   ~~aaNN %%''11::$$^^IIFFaa c"c"%%""3 3 ??66DD pp]]66ii**ooޜVV77{{##,,a!a!## 66iiSSjjHH6 6 4#4#..J:J:e-e- ccrr __DDm#m#$$ ddRR88%%  >>s s ^^UU II6 6 ++%%!!gg  jj׺עݢ{{66GG I!I!##w.w.//KK܎wwnndd\\WWCCuuss uu<<__GGRR$$WW F F qq= =   LLhh$$''44H,H,I I YYλΘØ ֍WWCC!! ^^//==$ $ XX&&::v v 22oo EE||dd $$dd22HH  pp""**v v ##[[BBϠڠCCVVEE AA!!&&22??PPm m 33((UU  ))IIssKKVVII``PPhh55nncc^^ffTT޲>>~~vvOOqqnn :: ccHHssOO<<00  xx .. <<**SS&&11$$))--HH""խѝ++;;vv) ) >>L L oo00HH))%%] ] SSuu߱߱HH``\\f!f!g"g" 99 NNlluuGGVV77YY99))y y   ++TT**MM__   UUss@@==@@G G g g > > %%))bb 33,,==$$OOCCII//DDQQӥJJff""))&& 9 9 yy!!WWRR))FFll22rr66##ll  rrUU^^%%mmFF <<uu  hh||x x cc[[ll]]h h ??11 %%//..00]]33RRxx jj::qqtt++77U U   0 0 \\ 33""RR;;ҕӕhhzz####z#z# nn]]--))JJ22HHDDIIW W ''rr//22ww..LLww11   !!DD33>>p p 22]]((BBӳѳ,,ٛUUmm44F F bb00yyqqee--yy((ppL L ii++11 88==IIuu T T SSL L ggffhh 44VV  qq&&!!OODDEEVV]]IIvv88 ll   FFVV__* * hhRR)),,ff  O O * * (( ffccFF^^]]&&)),,==""VVIIffTT UU FF@@xxwwWW####))nnBB66OOMMqqrr llOO oorr--%% hh UU dd66,,MMaaQQ__mm++::BB 77FFddPPmmvv""**##PPss<<..II<<AA&&cc**SS?? ]]55jjii##88\\vvOOuu++[[nnvvHH  rr@@  GGyyWW--??ww}}  MM\\XXggQQGG..FFccOODDkk55eeGGxxLL[[JJbb77MMcc00##LLmmXX//]]<<88dd--..??++YYoo~~[[llBBjjww~~LL^^%%%%77OO66aaLL??99\\ss__ss""FF@@@@{{--TTll&&rriixxww<<''OOuuuuqqcckkgg;;AAIIUU**))99``##00!![[@@ @@ss((..$$@@!!''\\00KKee<<++@@rrNN;;xx LL VV((  mmuuvvRRBB'',,UUNN]] @@7799mm%%ttoo11 ||WWaayy~~ff44zz22&&,,))00tt??..,,mmUU;; mmTTvv77SSwwff::JJ``@@((EE !!GG qqYY   99ccVVffvvKKvv//xx,,]] vv77  ^^ll<<LL@@0000TTGGnn^^--MMzz{{55 ;;((QQ99 CC}} //66GG^^]]AA1177..uupp00kknnEE]]++>>ggOO  yy::^^@@SSPP``ffccWWYY((,,GGvv// uuLL||>> %%EEKKVV\\@ @ g g ++rr~~mm88;;ZZ99TTrr kkssVVttppaa!!TT--~~//55ggoo((jjEEII88 E E --''PP//oo++44KKWWDD""  4 4 33{{PPMM  vvxx$$ww~~''hhLL,,00))RRUUK K  ((rrl l   22tt66MMDD77VVFFOO4499PPbbs s j j UU##GGmm^^xx **  m m 66yy--**ii::J J uu  --qq<<{{TT* * ##55;;kk@@  e e & & bb!!((kkYYQQTT,,  XX ' ' \\[[aaZZ  QQ{{__ggppee]]GG7700vvQQDD==tt44((NN $$EE@@llyyzz   44yy99nnpp//IIXX'' { { XX==  8 8 mm>>ggNN[[116644;;@@??IIrr||ccggbb bbtt^^kk EEBByy||ddZZUUff44`` zzaa!!>>yy   ii    qqjjYYWW||vv xxyymmmm!!SS22ff==   ^^dd[[22[[mm00ii[[||**==NNCCHHii//{{ii EETT&&* * mm,,wwKKZZ  ++MMwwppll``--UUSSdd..\\VVtt= = ::OOzz22mm::ff,,MM{{ttCCXX\\44HHYYrr--rr%%TT !!IImm''AAEE__%% UU  ##??22II``SSww//$$--ttllddNN""gg//{{YYNNyy__HH<<22DD22##77AAoo'' ''[[<<__00JJ44  AAvv&&WW``??FFYYGG~~xx99qq6688((""88SS11FFdd!!  ooAA??II33++~~ll::LLEEii\\""==bb00PPrrdd77))QQ66))++&&]]wwzz__BBss99ffzz{{ttOO33//[[ss\\UUnn>>1133ooxx))HH]]$$Z Z . . ++VV77uuvvBBTT88!!WWnn``$$00>>bbii&&xxhhmm''88==@@[[<<HHXXHHQQ>> 66--SS""aa55  @@77..##DDAA``66''uugg>>@@$${{ii##++UU33ffAA::??j j   >>nn//]] 3 3 JJTTccggeeuu##hhrr88zzJJxxWWmmBBccGG\\ 7733N N nnHHkkvvMM44,,nnNNKK II""%%00BBCCEE 44,,@@))>>''\\BB##xxff||::44pp] ] PP((yy++II88rr""((//]]HH22yy''eeVVgg11 004455pp//LLee//))@@$$MM QQ $ $ 9 9 ]]qqJJDDvvBB\ \ q q   ..aauuKK << x x # # ::''2222uullvv//$$--ZZ33: : ]]cc> > tt mmee``nn''EEllxxBBj j >>WW  SSVVEESSII22cc&&vv   + +   J J   ,,ttKK**mm<<  -- RRy y ++LLWW;;EEWWff::%%@@++,,//KK!!__tt[[ZZ]]BBTTQQQ Q WWZZrrDD[[** //==(())&&##||7766!!yy%%vvff**xxG G {{++..))55>> ll ??^^[[NN   H H FFkk__yy88--;;$$    11  oo((LL^^[ [ FF   FFTTFF__!!LLJ J UU% % ' ' gg$$??&&rrXX%% zzSSccPP^^>>~~''uuIIddXX ttOO AA22uu..//A A _ _   z z __  w w 5 5 @@55hh MMq q  gg//z z ZZ    xxqq 55++{{ wwLLcc ee22**&&ll++WW2 2 ff::44EE!!55<>  8811__99 MMSSK K ` ` ZZccFF~~    IIbb GG22TT޷VVeecc FF bb 1188..WWPP11pppp " " && iiLL++]]rrOO   88cce$e$ZZ@@!!FFߛ@@R R %%/&/&ZZ  % % &&??88NNxx EE; ; O O I I ( ( rree::ee  <>RRffdd"" $$xx==n n ee %%LLqq..99 ((88ppt t {{ee ^^BB" "  NN##%%$$88% % !!CC  }}RRx x 55u u M M ggttvv%%dd yy @ @  iiAA&&hhzzDDww 88**BB HH ==%%   TTZZ==BB??O O MM @@||77^^ZZ$$$$++BB@@ OOBByy{{# # LLkk~~ssccAAb b B B     = = //CC55;;۾RRڌLL<> nnKK__JJ__ffee44<<cc[[. . a a EE""nnp p eeZZ1155aa[[{{88bbjjnnjj--GGuudd  GGSSee^^LLffOOoozz 88 dd mm I I ''0 0 << ww::UU{{uubbBB))  ssmmGGSSQQ{{''FFcc##55 MM??II <<>>XX00yy;;``&&   < < D D . .  ::RR::''ssxx }};;__::jjXXTT::<<ZZ ? ? ''aajjXXpp  ++& & ))uu99vvl l < <   Z Z @ @   ss//33zz 11KKNNPP  !!^^QQrrtt..CCQQ00S S   E E " "   XX||MMjj 99ss   44``::jj **;;MMRR7700||;;**WWGG<<{{]]K K VVVV**rrAAWW55NN  KK&&@@aaYY --BB008 8 EESS,,zzZZeebb++""ZZCC##' ' K K kk]]ttvv4466UUYYFFKK@@YY^^nnIIffgg``QQ??AA22||ee nnJJoo::{{rr%%WW;;cc--``]]<> nnAAVV 55ooffRR**YYQQ<<##hhyyQQmm~~zzLL88vvhhTT$$VV,,QQmm,,hh33;; 55FF//DDYYOOCCAAll5566TT@@ppNNxxddUU  aa22XX77xx[[""kk44JJZZ~~BB//QQ''bb``ccGG//""^^ ))ffpp%%**bb++OO>>ddUU88BB  ))}}88((||UUkkjj<<%% 88mmyy  ""__@@44__SSUUtt++MMss##dd~~22qq]]]],,--vvqq::AAyy::__KK qq YYBBLL00__nnSSXXXX..55$$>>qqIISSeeCCkkXXBB!!66<<vv""rrUU++dd))LL##``,,//^^kk KK[[qqxxVV66''  77iiccUU##;;DDMM||VVbb xx  BBRROOuu22ooww**!!55oo~~qq  ~~kk..""jjss&&SS..rr::UUddssddbbLLUUHH  aa11}}llJJ{{((hhvvWW~~<<qq))88>>FF<<77yyaaOOH H vvmmZZ..!!||ddggLL}}dd{{` ` ooEEff//TT XXWW%%..uuAA00QQYYeeoo66LLee//HH77{{ttff \\ww __99CCggqq,,77eeww005500PPii  f f II33$$##JJDDiiVV9 9 ((//SSvvff----99  }}@@**  33hhffII,,jjSS  ggrrllSSCC..llPP\\QQll``^^LL88[[aa  99kk }}nn44ddff  aaJJrr<<++}}__BBUU//\\mmmm~~**>>UUhhWW99cc2255  <<,,cc##iiKKkk nnggJJtt||  3388GGvv--wwOOWW{{..YYUUww11hh77**..99HH__``DDhh\\**  $$--CC--HH$$))==qq))44kk88HH55iiOO}}&&FF66mm??ww>>CC dd&&XXuuRR[[77EEnn66mm""@@;;}}eeTT00--||NNCCFF..]]FFnn66rr DD((NNPPXX**{{WWttXXzz3311  wwkk))yySS$$MMVVyyyyFF}}||ccssjj 77wwppRRzzww66PP  OO>>HHZZ00}}FFOOffDD55qqOO\\  JJqq//SS||RR--nn  77[[MM''HHQQVVeeppffkkxx::llOO<>aa??AAPP}}<<88rrMM~~00ZZII  ffWWkk``((88 ZZ qqII++eeOOkkjj}}nn##EErrCCddww DD99qqVVHH**''rrqq^^kkllHH((bb==eehhqq^^--hh~~wwNNccnniibb//XXCC[[bb   O O hh<>yyvv]]yyeeHHXX[[__<< oo^^ZZ!!hh@@nn qq 77uu..KKVVjj7766vv ffmm77hhuu]]____""II~~ ~~--""[[l l    XX``UU&&{{33{{0 0 uu66OO??zz   55hh!!]]iinn  6699``AA44MMZZ22  II33xxttQQzzxx[[ 44 ~~ddFFvv77II22==uuhh::9966MM z z ))uu%%\\TT !!PP 8 8 YYHHLL JJ##6 6     \\55AA{{KKQQaa?? JJXXLL^^iiF F GGKKddFFSS++SS77ff55++bb(( =={{))yy;;^^$$##\\` ` 44   1 1 WW ||  ^^::==N N XX||jjmm11ee9 9   tt33KKTT7766CC))P P  P P 88iiAA^^YYWWee yyvv( (   vv;;xxSSrrZZ   i i x x <<||ll>>XXNN**``NN,,AA ;;> > C C &&++CC--FF>>  GG))88@@ffmm//   x x rrGGxxPPbbyy<<0 0 ((z z , , yyHHqqW W zzIIFFGG<<^^UU p p   W W 9 9 ss==~~''++))aayy11== >>OOttkk TTP P SSTT  3377WW &&BBEE^^!! YY??@@ ssPPRRSS ddTTnn TT    FFdd ,,HHhhccPP]]!!K K  d d DD ^^^^ EE  %%__?? VVQQ$$zz]]ll||JJFF oommFFnnVV33CC44<<______??EEqq88ZZ22--** uu FFrrܻllVVSS^ ^ ))wwd d ,,qqiiWW$$,,JJ[[..--GG   ,,44 * * ..DD88ttrr88??``!!JJ nnccmmyyVV & & c c   ::||ooii   ; ; $$``OOhh# # P P R R bbaa''''||66jjDD@@??u u mm %%UU``""88&&UUuuZZ88? ?  LL qqHH44KKSSzzRR  | | GGXXEE__ii""66@@++nnCC ii  rr ssffQQPP [[&&``    T T 0 0 RR--NN UUKK__dd{{NN;;[[--``MM\\;;YY||~~xxGG  qqTTqq&&==((00xxAAjj__jjcc<<nn VVhh66LLmmwwVV~~gg;;--zzgg||MMPP%%qq----ppyy;;vv))YY>>uugg  SS$$aa__33hhJJ77;;oovvGGCCAAMMDDAA//< < tt77{{""??66//00''hh11BBEE[[uuII__NN,,88((88PPMM11CC  ddNNGG `` qq{{33<<ttOO!!55ffDD##00\\OO]]MM!!1111  pp{{JJjjtt ~~66++WWtt??zzXX%%PPaa..55FF''HH""??}}xxTT22PP?? $$JJ<<^^ffllQQEEPPrrJJww;;,,  SS88ee^^55__--iiKKII;;$$VV{{qq||##//||xx33II__~~__ffVV{{__++tt~~||FFQQ{{\\ rrXXll,,ZZ@@DDuuJJ&&[[yySS## ]]??NN11WW++FF55llXX;;00))uu__1144NN//ww33zzUUssJJ..22ff33MMrrGGHH0044,,xxiiKKZZ  >>77ffiipp@@<>,,33ZZ ffxx77VVAAIIqq..zz55cc++ooii&&{{FFJJwwee##FF%%((~~gg__ee>>GG>>{{rrMM bb//wwJJ..''44  zzQQqqzziiSS??}}FF22rr..FFKKMMzzaa--^^llSSggAAPPQQ&&AAII&&\\yyYY\\MM## SS  TT""QQUURRnn11`` __``xx66ee{{((''ii~~ZZMMZZ==QQcc>>nn//44sspp''vv%%QQll8811<>CC\\[[ww''MM!!__ffFFWW--;;ww--;;HHff>>!!nn>>ZZwwppwwQQ??--\\11""ww&&DD  tt{{hh((ww``TTVV22AA//||VVXXRR$$  Z Z AAzzJJyyii@@cc..TT..$$vvII 55IIeeII$$LLmmEE77UUhhbbPP22ccqq eeee>>`` KK@@ggcc""RRppRRkk<<  II33pp>>3 3 @@ppGG  FFaammRR--^^nn TTuunn jj,,MM  [[tt,,YYttrr+ + * * EEYY77PP)) ;;HH6688XXNN44 77--""NN##iiVVhhOO ,,33    55--TTQQ^^LL$$||aaTTGG[[qq55  ww**;;FF 5566vvYYXX$$((^^kk@@] ] hhf f ii55zz%%DDooEEII??%%  **cc ^^\\iiii//ccMMXX::llDDii;;JJUUxx))**TT``uuee33ffyy3322nn KKXX6688@@VVyyll))zz[[jj66eeNNHHCC[[,,kkMMvv44WW   t t    [[ll YY!!AAYYbbzzFF::&&KK  qqmm]]xxbbHHpp| | vv66ddqqKK;;jj33**%%>>}}Z Z 0 0 KK||||ll  a a xx??__NN==77oo22((yyddxx 55qqUUTTxxeeXX<<O O   SSyy''DDVVff QQ++NNTTHH++DD::mmTTii%%  %%SS    llEEAATT6600QQiiFFHH ~~dd55..WW}} B B ttHHOO&&44kk%%))MMSS VVH H ! ! MM==vvttzz66~~SSffIIh h ##FFbbIIHH==xxbb!!  ttLL##66SS**//&&;; kk))DD XX==&& VVm m 8 8 JJmmKKgg??77,,==eeEESSVV[[ 66~~**  } } WWbbgg  &&OOFFyynn++wwyy **UU55==yy##oo S S ccvv//--__ZZ EE<< \ \ y y %%KKvvBBRRxxGGcca a G G v v  $$``IIQQJJ__ccQQ""; ; 44^^YY^^LLqq< < , , FFnnssGG!!II DD**UU mmMM 0 0 HH""SSvvqq==A A j j   Y Y    iinnz z 666611  ssVV66==@@KKkk%%ll bbUU aaGG77  99@@ZZ CC ;;@@99??XXrr;;ZZ>>[[``''@@22GG::Z Z XX  PPEEUUPP D D ||ttd d GGWWggEE**\\11zzEE PP55XX//nnBBvv s s ddjjttMM SSuu<<[[++%%H H DD44$$xx__""qq``LL KK66FFs s  !!II::VVeeVVhh~~   441177AARR((~ ~ ffQQ= = ,,  HHHH  rrppCCee||;;O O  >> 44##ppRR aa CC ==**CCZZ  ^^ >>> > 7 7  ##<<ZZyyrrrrCC55> > ~~2 2 Y Y 66nnVVii ll&&}}PP]]RRdd~~   LL  {{RR||߅  44LL{ { !! 5 5 $$II))\\HHkk}}JJ{{ccZZ! ! " " DD{{QQ##88&&||ZZppOO,,A A zz ddTT۠ oo   \\  KK9900ddDD]]--""SSllYY44WWRR ss eevv~~hhNN33wwAAgg 44z z \ \ "" RR**??ee~~::]]wwddvv" " ++qqOO""uu11D D  ""$$  @@..66 PP99 llRRuu ZZXXVV##BBhh   4499gg--==II""77>>rr8 8   yyUU tt ~~J J : : PP!!**[[<<   RR{{KK[[44k k nnt t ;;22IIޡllaa E E  22lliiii11((hhLL--88##~ ~ zz :: II11@@oo]]nn++vvnn ss::MM##ډoo^^SS 55PP k k 44w w rr## &&llaa//5 5 - - %%LLooOO\\..iipp G G !!yyllъ݊ AA!!cc e e ; ; : : ;;SSBB<>6600w w ^^k k {{CCܕYYjj}} ww   GGVV bb,,==\\ooccHHkk  H H O O  !!@@@@22CC**  QQQQ33pp$${{||% %   zz 22ww[[lleeooGG44]];;++VVUU$$. .   ??OO~ ~ yyffyyHH++ ++ )) X X ZZ88q q @@((TT||{{ C C ,,   ++lljjGGTT 88 \\>>SSaa qqDD[[77+ + ,,  ::.. 88CCvvxx ??[[))  II##WW9944wwE E 0 0 gg))==22ڨި++ **PP TT mmaa;;,,F F ,,;;b b v v D D 22TTdd}}nn// ##q(q(zz))))((FFPP!!yy<<  ddssgg558877&&oo99S S N N "" ll//QQTT##ll11oo&&FF##D*D*))OOFF̡̆Ɔƫث&&II$$JJ # #$$ZZtt``))==DD~~ tt;;uugg!!$$==``W W  NN  r r //nnGG;;{{eevvii55}}zzhh**^ ^ __""(())JJ XXrr$$ZZMM  77 GG   44##??jj U U j$j$''( ( 11jj))00))11 cc]]CCM M   99%%  HH55!!##PP<<F F NNNN , , UU33nntt;;jj<<^^}}CC**qq>> **22::$$SS@@PP  //xx E E ''SSjj@@wwll> > yyzz&&--  NNKK **OOiivvGG WWQQi i !!33DD%%--<<44 ;;  DD^^  uuaaRR//$$  U U CC22[[00BB##SS~~^^yy\\EEppvv  aaCCEEjj>>JJMM w w hh//''``EE        KKBBSSIIyyGGYY88nnhh>>oo))V V  66++ &&//nn^^gg;;kk??ss**UU66ff00%%NNBB;;0011ii,,BBll]]11yy\\cc??CC{{00TT``%%LLjjUUss||FFddHH,,{{rrDDLL[[J J = = > > @@''99AAmm**v v ||  ##rr,,11WWkk@@\\``>>..__33[[OOSS==||,,''--kk''..eeooccaa    hhDDtt11YY$$, , " " VVhhhh..ZZcc@@IIxx  AA''ooIIRR  * * //##ll kk<<>>xx[[88XX22||MMPPwwWWaassXX CCLL  vvJJ55&&((hhBBbb,,BB((TT}}ww""``PPyyii}}LLRR//MM((ll>>4488NNmmff,,--eeaaXXbb1188yyjjHH==aaWWccqqHHGG    wwqq   ``CCmmvv^^VV  hh++<< __>>XXCCRRbbFF  ww**cc||WW66==kk{{tt&&||^^00||MM<<77kkCCAAAA""ss//BB!!  ff..$$SSggrr$$}}PP<<))++~~~~00ll  kk]]\\iimmOO""zz<<!!GGll\\ppBB^^##33nn55??mmgg||BB qqJJuu$$//OONN++qq}} rrttrrNNrr>>ll~~55yyRRTTeenn&&UUssXXHHuuoohh[[WWHH\\\\||hhzzPP!!ZZnnVV//{{RRbb^^llRR@@<<**##,,))  HH55}}))\\xxff;;@@!!//ooeeLLrrUU11NNffDDtt''uuTTii ^^TTmm''AAjj""3355nnHHGGTTcc %%tt,,|| ))>>))QQ'',,@@77BBKKRR??ffjj99++yy""rrYYTTccqqXXGGWWeeXX??ff""{{mm++jjII""KKYYSS66eeDD;;NNTTHHAAFFooqquu++EE22ddii--ttBBkk==CCNN**++{{DDTTww  VV0044GG  MM==66ii&&--qqii[[pp??CC}}$$++pp==--rrCC''MMKK((xx22OOQQUULL11JJ33kk""$$55||xx]]77PP""zzCC00ff==,,FF88bb''22..33yy__ 00pp--11^^aa&&++>>yy$$vv]]]]DDjjkk!!DDTT[[6644NN``zzvvYYll 66CCJJjjll&&JJww``44^^]]##::ll$$++hhjjHHjjPPeeMMllAArr]] KK\\__WWEEhh,,::yyhhggJJrrGG mmkk^^VVffpp;;!! 44hh\\zznn__::  GGee{{99EE ddLL::rr,,rriiAA$$jjSS:: !!ee22KKbb00ggCC==cc??EEvv\\~~ %%))PP11;;zzbbBB55++88nndd]]==TTZZlloo99qq4499ttLL00 88hh]]BBjj//66@@]];;??KK }}ll__OOaaSSVV66 2299{{@@yyHH<<==WW66__!!tt99ll  XXUU88ssWWqq    ??    ttMM>>ff%%''nn""II##22ZZzzhhyyee22,,ii{{__HHMMKK++//qqwwzznn$$]] ++CC\\88CC uuVV++NNAA**((**xx}}ttuuDDII""oo \\BB%%xxAAjj66GGzzPPssFFdd-- FF>>HHkk````ff4488VV[[__HHWW//<<uukk((SSWWGG'' ''^^<<IIII~~%%mm,,''yy TT22HHMM..++ ppll}}~~ ((ZZ~~^^{{00mm JJ||11QQ&&mm>>LLffGGCCMM``~~2233##ooNNWWRRzz  ** ""@@!!88//EEPP  kk@@DDgg  ii//77__88ssvvaaYYPP33~~##));;**MMaa{{??mm<>jj**FFAAqqKKCCPP::3355QQqqNN!!ss$$mmhh UU  ..LLRRddyyGGuudd==aaEEbb<<[[QQNN22ccyy^^QQKKrrJJ,,bbaa== 00ooNNKK||33gg~~iiII WW,,CCSSCCmmGGAAvvSSYYbbooeeCC UU iiRR$$aa  zzZZQQppSS\\<>DDHH..``{{wwvv@@CCII**kk##$$  ||||ZZ!!nn ppWW}}00\\!!11aaGGCC""rrffSS==UU  ::BB--OObb--IIQQ^^00BB  HH44pp22''HHnnCCmm77~~QQ::qq&&??--IIggDD.. ==oo??nnhhVV66FFOO##..    8855YYCC>>XXff$$__99 rr//88$$++ii99ffwwEE##YY00eeooSSQQ%%99HH&&dd$$VV))bb**CC^^ee8800%%QQ++jjRREEXXoo>>ZZYY[[vvsszzEE11BBCCCCccUUJJUUhhHH     IIwwuu((  44))YYXX>>||ccBB3344 zz##GGBB33$$VVttxx**bb11))SS::77UU ##33rrOO00FFss tt99qqbb??,,--OO&&vvbbsskk    WWLLZZ//IIkk66bb''--99uu!!@@FF77HHRR''UU[[aayyssbbHH$$88!!VVooddFFAA||DD``MM>>NN''66DD&&^^CCXX;;00,,DD!!bbmm??II;; KKLLEE66@@||##>>ttTT||??22ww* * MMPPMMzzYYqqAAllhhnnNNtt$$KKbbjjrr--ww  OO++qq>>\\jjll  {{NNXX yy==uuVVUUBBjj 33WWaa::{{!!QQyyxx!!kk))ZZ<<..>>]]ii33BB((  NNuu));;QQ ++yyzzkkddnnzzrrFF77EEyyrrnn;;<<HHddUUee dd'',,bbTTdd__vv[[??,,GG  ""88ii3366zz--[[||}}hh@@ ((;;DDqq%%cc- - jjMMllrr** ""GGZZ==&&mm\\oovvKKwwUUaa^^6 6 w w EEmmss``   **  [[zzAAeeBBUU44"">>OOHHaaYYee@@JJ??qq,,TTxxPPQQ , , ^^\\]]XXqqbb ll QQ++RR  TT55::pp88[[__``&&qqUU22SS22eeII))  TT   ` ` !!$$HH   HH((\\33??UU00gg||ssMM @ @ ||~~HHccTTbbb b >>##^^dd ~~ttXXss {{vv~ ~ @@))jjuuZZbbRR  TTEE ''nnLLnn..qqBB``pp~~JJ]]rrRRLLSS55 DDxxVV==yyn n YY= = EEA A   ((**||AAggUUVVddSS PP{{dd3399..wwFFii((    11  ++<<99[[NN||YYzz\\yy00:: !!kk hhGGK K ? ? KKhhUU((! ! vvBBqq55ZZ22  EE##kkddݪppxxOO<< **MMEEUU  --OO..XX  + + 88ii**QQPP   ppxx( ( t t ++Q Q  ss33ߺ߸߸JJ \\ff))llss//{{//??00$$ssFF    ))pp&&AA  ppXX  P P f f vvnn{{ ,, GGP P JJ::!!   11ddVV55]] ^^++ff66//[[ccFFOORR~~@@F F qqDDNNrr??ggNNII44zz@@  99]]++@@))gg%%@@jj  [[dd((^^uuAAGG w w ::\\w w  22))""rr%%uuBB\\MMVV&&UU,,^^ccIIllgg??55ee[[++VVaaUU{{GGNNddiijj]]ll  //##ccRR{{))jj//5 5 YY**nn3 3 ))''bb hhZZ``   LLff55==66QQ>>ooPP   HH99##--]]22yy..CC~~00wwffuuYYtt%%yy__ssEE}}KK||RREE,,==KKcc''xxZZ  oo??mm33eeww88]]xx44DDggrr**}}SS@@:: ##xx[[77::--qqeett//%%IIIImmjjqq44ddSSww99KK2299bbmm==""""\\||OO  ]]>>ss}}''**  %% CCnn\\[[CC..  ""^^ LLUUqq[[GGHH HH00OORRKKtt??LL""55HHVVii,,33<<llaa99 WWtt``ttttccTTMMEE__KK$$IIpp%%&&xxgg>>}}[[""||XXll66nn\\oo ttxxggKKbbww{{55""HH__EE77HHppRR??MMIIyy''uu]]++((..--rr^^PP&&,,kk  bbeeOO%%yy eeFFaaII]]HHLLGG!!UUxx [[yy\\^^4411vviicc--%%!!??33ppQQ__..--//@@\\qq||""||## ||OOVV~~LLss--((22>>XX\\EE..[[$$llBBOO!!vv<<,,  SS{{ssuumm[[||oott88$$\\$$==11)) KK77**$$&&!!((OO33$$yyuuRR..""~~[[ XX>>ggZZ++]]DD&&  nn22\\""((__ aapp'' gg::..nnCC~~yy[[PPNN**  %%66--33BBttyyvv11##]]QQOOeeVV11qq<<11$$3333[[ww33wwOOXX//((##TT~~??CCllzzhhQQ))(( ..77))UU]]OOLL//xxHHEEPPWWpp77TThhqqvvuuccOOCC,,--MMRRYY[[RRPPEE""AAff~~77 kkWW::yyllMM00 OO66 $$jj11NNuuzzoovvggEECC@@||llccdd]]cc99FFDDDDII^^ooddFF((  ++GGaappss^^99   ))**22SSTT77,, ""$$##   ((GGPP>><<aa{{||qqaa55{{))''99LLUUnn~~vvhhTT==55OObbnn}}ffVVMM;;(("""" xxaaNNDD@@YYDD22''  rr]];;vvkkuu ttGG,,``..nnff%%__99--wwwwTTSSuuXXJJ||bbGG++ **BB--wwRR$$66ccBB;;uu00ooOO??GGddxx99[[[[..vviidd@@??bb66ii``&&ppYYRR[[XXOONNSSss\\00,,EE88bbxxXX22ddVVUUqq$$ wwFF%%hhTTdd||TTtt4411PPccffrr ..::00""**??CC-- 88zzFFSSKK&&nnZZ @@||\\\\88OO``qq""UU__RR99uunntt--NN::ffiiQQ""JJ~~mmpp&&WW]]``ll\\KKrr==$$11((ggJJ88FF ..AA  YY99UU::**CCWW""$$AA%%55tt  SSSS UU88NNAA**]]YY``33~~88tt44llVV((++ZZ""mm__ee00\\dd==33aasszzOO\\}}@@ ee,,^^""## @@^^88--SSAAhhII;;QQttii(($$eeyywwjj ||55$$..XX00))PP{{yy<<33gg88GG``GGffVVggPPuuKK~~QQ##77QQ  GGff44==DD99SSGG||++::WW++..GG//nnPPLLvvmm,,]]55FFzzzzooccccee==88NN!!FFYY22dd++MMBB>>dd==&&PP%%llww))77UUMMyy((HHLL33]]ppnnQQooAAnnEE]]oo||hhBBuu,,__VV;;`` LL``rrRR$$%%ffJJ((KKvvHH^^EE__&&jj!!((@@AAuu3399!!<<55ppnneeqq//&&GG!!11))  ++dd44!!^^77EE  ++qq99__2299 kkaaJJvv11AAKKXX}}rrVVQQvv      ||yyccdd!!vvCCOO**YY  gg  ~~55++}}}}XXvvVV""SSaamm""jjHH""77WWYYKK XX33{{GG44hh??""||ww  HH11DDDD11NN__,,HH||UU99%%VV**bbTTWWMMGG]]PP}}iiQQ^^8855++BBppvv[[rrrr::--jjQQjj11}}MMNNee##PPJJ>>UU!!AAuuDDCCPP  dd``,,..eeYY99__**EEjjiiRR++hhDD&&>>xx22==HHMMzz  ||CC77\\ccxxii@@ee%% \\KK11YY##66]]%%>>  BBLLkk}}KK  **mm<<__mm33VVJJFF::jj~~jj::!![[[[ZZ//ggZZ::ff  kkSSLL33}}BBqq!!NN..nnNN[[jj EE__UU11qqEEhhhhzz~~GG^^ ##ccllPP}}NNxx22bb++UUCCccbbMM33OO\\rrtt@@^^00rrvv }}<< ::!!55  ##~~dd  ddyy JJ//WWGGHH++XXvv}}(( oo}} >>aa////KKZZFFXX//;;!! ==SS44SSkkaaPPooII))CC$$ttLL??eehhMM((@@TT}}RR88iiuu  pp^^??!!\\hhRR>>tt9922WWddllDDIIppHH??;;uu00SS  YYCCBB==77PPmm ooTT//QQppTT  aa11??^^{{<<,,XXiiWWYYIIaaFFyy  $$vv  yynnlluuggii$$QQYYFF <>NN77 bbtt ""!!nnCCqqiiPP 88mmttKK44mm%%[[!!uuIIGG@@aabb==XXXXPPPPDDJJ22{{dd}}oo22  ??hh%%pp99xxOOhhOOGG**MMBBhhWWEEGG@@NN\\77^^TTOO!!))..gg  TT aaDDpp  99bb__KKppmmY Y 99>>[[xxeeCC::TTF F ||nnvvDDVVii--SSsszzDD  %%;;VV))]]^^??GG0066cc22;;AAxxTTPP }}jj~~{{33YYNNSS$$AAXX33VVMM;;::**uuEE%%  ..RRddCCzz99++``9999dd<<ii]]bb))VVWW\\wwee??____**$${{!!00t t P P ##99mm KKZZAAGGhhSSkk  **SSL L ^^XXF F } } AA((ee<>AA^^mm''ll99kk,,NNi i ``RRppbb""ww{{<<  H H    JJ//OO//EE55}}\\..DDQQHH**99ww mm  ` ` @ @ G G p p UUii %%==qq))??ppTT||OO   PPMMPP88zz%%  WW&&''ss))``qqo o ww<<,,..  --GGw w   ++--UU;;@@TT **aajj88GGKKZZ  rrwwnn// ~~jjggFFP P 77**``FFAA {{, , ##==AA22HHLL<<\\``ffMMll((WW)) ,,>>SSRRee22))]]>>ww7 7 [ [ RR]]==SS-->>NN__mmttSSS S MMuuyy hh##{{..   **   22MMbb__XXgg< < >>''jj :: VV D D --HH6 6 rrZZJJ II ##HH::~~..ggDD__vvXXaa##22JJccPPPP  xx[[||''55##))xx tt   !!XXooTT>>YY##66  dd ::ooPP KK//qquu]]77^^ m m oo44||ff7 7  v v 1 1   ++  ~ ~ EEPP???? DD SS;;..rr ;;JJRR## .. ++''bb xxSS##bb++jjSSs s h h ((44ooDD$$$$'' CCjj  ZZd d  ''nn;;JJ""SScc--ggvv@@33BBrrkkWWJJ%%mmaall((,,99ff  TT    --CC((vvww~~QQXX\\MMNN//ZZuu## }}   EE==33nn**%%FFVV22{{oo``II bbRRppll--GGNN..''``  55zz**IIssqqaa]]PPxx##  UUGG  ==NN$$##{{DDLL++zz33{{ bbDDuu  IIrrHHnn))33,,""GGMM  PPvv;;..tt::mm77kkRRzz77tt!!mmQQ&&oonn ww))11ttvvII,,PP$$<<UUssgg//==LL__OOIItt00ggrr  llHHkk22xxNN{{## __66FF77  ssTT~~,, EE88 uu&&nn GGEEEE**TT  55BBvvBB[[RRMMbb55__}}UUTTEE  ####__nn..ff==EEhhJJss22##oo{{22aaXX{{,,ZZ&&oott//VV==[[^^  ++77~~CCXXOO55OOdd))UUggWWnnXXnnll**\\UUssyyXX88 ^^%%00%%33**BB@@eeKKppQQ||??DD==SSeevv[[77:://??ss33UU))ggzzRRLL??NN}} ~~qqZZ  22``uu<>||QQ  00vvGG mm<<aaiiccbbzz88gg**TT--11OO5599ff""SShhJJooWW>>{{==xx [[ MMQQ33hh\\HHDDbbTT  TT~~{{SSCCCCiixx ZZffVVRR::?? 66**>>ff  MMAA))!!``  33nn''CC **jjdd##OOxxss''FFttyyttyyKKNNss,,SStt6633**,,..88ttPPXX44FFrrkkmm``__}}kkMMWWkk[[EEGGWWhh||NN::____::))''55eekkZZRR]]UUUU[[[[??//""??99pp;;==kkwwBB##??LLmmGG551100PP7777PP]]TTkkpp77332277FF55''""++DDLLII//88KK00zz}}YYII$$ **(($$bb~~ll}}``::&&}} 11//BB``dd99$$,,!!''bb}}VV""::;;66CC\\||{{bbHH)) %%++&&  ??[[^^bbUU>>--  ''44;;99++''11..''!!//MMNN00$$--$$''11;;EEAA11&&##  ""  !!  ,,DDOO]]``--hhcc::5577]]ccBB33**//6622-- ''))''&&**''##  ##22::==66&& 55>>66==LLMMDD22  ..;;??CCJJII??44**   ## ''BB==11**))66FFBB22""||qqEEbbiikkZZCCDDGG// ,,::DDNNFF.. $$5555..(( ''335544..''&&$$ !!,,..**$$   (())!! ""    ''2200$$      bzflag-2.4.2+ds1/data/flag_won.wav000066400000000000000000014734441200563112200167040ustar00rootroot00000000000000RIFFwWAVEfmt "VXdatavFoeY$?+nH3M'KboEr:J'72Wykc;Q X.!Aw?dmSZp<`S pP( FBy'dm+gP2iK L) ^: G<|CVP=hfNFN/>l`"B#5$I+U}`A*2dAXzto, ^nupK1)S`<o{psezpI[%~noY hkhy}&%c*5,t9'BASs <z0- 1O^ ucFQt$aLb%Ahp'zX4]R%5SK[u_;0$#3ICK>@4A"$0lqs=pKW',O C}&|D*:9e! wE#1oH *?#$ #ML@OHze6pP)B]^5}m[/$ +7+\2))8feB q>}g&F='93{$q^($,~2r)!KIM3TW[V^TCCq3A. zBUl[rK3H Sh/~ p<:66dk+Pc*KWoi3/?`~7u U`K66N ;? T|[Wm+ !3>^[K1G@U!J`(EcMqP1CZ Q2$Kt~*W3Lkv/M<l2 Uw_*wy$.!%`OFsn33][^)w@5'=KsO\'UC@-8n_\3+Kstr !G;P^Z(ml(nU3KJ)lwf}9Td/R;z(.,E2!ek$X0 8l7V;1g,o>g5m?O+SlFa J_dk&~:jE/z9Z47C=ES[C[2YquE<:P !!| Oa%4 T1P [;R= '1->&|il 11AZaGXQ |Ag{CsQ DIfEu gI }DfM0J-Bc{:){)X"a4: /xl(O_018>Rfu~z]TS{5:d`(c1P|ULP3iOCr7j6Gc}524n6'~A'g,' )~&d Bxa q ]>\;k, [=Eo.l\Q"* H.L_?8WhtzJXNxLcJ78\=DU5AxWS B4l}kJm(yX7^:@F}cvJSmBL_tr8}u_]G'.|l[Xs 6X.7<P<eS_XrGK* _H|2qF<tudC,75XpbT%-&Hy(2tr/:Jw.O: Wj:7 jsAv^#[ F0If?Ztwu \[@O")XiZ;L *4s|WI 93 O; 2mNxl+(q^mv\ 7cb^"#2Dj~QsUkuz,1Iil3a3i 1[nS$z]l3;}ZB}Uj+<E 9tmvwsP _75qU^}5CL2'U!yqbkqTojKOdO./+ :wTdUkX-Hp[kB2$-^iVR*o4o^M t5va*iC.2OI3}M,0.;g"0ydb }kB7B$>:O I)ftH6aQ9S\ 0<>3xSJ/4eti"f 5gU-j^;H9=y CSi h$Y:b*}"pCwp~B\kl!xoW]n;> 3YIhSte1&j g?DSztmFDdFoy)OytqaEq`AO(}#P<|XDV,XF~4{%f8m-Oy=]/O3KBDCgF4UJ/2o{ ?{=Bf*b{+{vn~?0SJEmi:\[/*[NbMk78#rh&D$]uBR7wjmB8#Vvc`F* 8x[Kur;\ +*JIC@GizG$Ke[2h2W7YSE\a+/Y3-'VH%dKDl?*hy"9,U@I&}3f9V4=&CZ`w& k=O}1APh5$(J)^\=NM:{aGmR~M RxmIM=MtI^6v#AO'0[LutKeK-n"auR0T)Ui2?ZR 37s`[|jB_ta2\zPt%0_Up3:/2{>cP@%= N}h[9Z1BQn'eH,/LYr P2EoPTo\imO Y|y6N&q#{qa Fv(\*eA3Bc '4GJoz~EQx2}LPBCnJzwKLU {ABL ;fZi Q@B,85j]IH0TxdVuRf It4.j_t`m9#,g;7OpX\.D+&&Gk>~DxY\qU, H-Ur T'cq"uCn'*rC JVFA&Zt5nf;+ I@tu`nr|zF*<xJ^|MS>w4 HR.oV*; Gw,{5#+X7M1t"A@mA>WXRhHD&[G_6vg $rs' ta-'y>!uKGsSC ,lb(=!~Yl;[]@?0 `Yp:7u,~P-J1^1Rl4mSj?Zxlh[ RPKhJ )ezp}/wQWULjf iQ(l]*JsC0~%;3{tu$^JtuszCioK]t$Bi"Jz|jb <{VS'RJ Vf iz$G[ xACR\cV&M$\2a|vCZ698n:GoF2 [KkN, phrC&?X&$<==P F.wkE'C h&u=D5^39d'B9*ow*j%UOh !LtSI C!yR>?;6 koLowXN2FB2W z3zwFH!oNRcQ|c37U(^u:(T}GRl F ?sgPK# xY:sMCH{:i}FVi<SwaF.Pq#y}.zlNW +KN)k{x@y~_a[nV8IvytfKM/((>_`X&9?"YY#:xD;UQ*xZEE+^O,:AlvcK`'W[LK ;@x(V_5b6.6l%_!>434Bjg |^p3ifKhO$tXeJTG5*[=<V1W/ms5.Eic)]Eh ^r2+J^1,r9a-^dC91VIJUt.Rr>8{~";)&kV v K6'B=3f5Y_\]Y+l)b[PI4)/0N4%aC!BG,%3a-\zf|~^)Px:d<lVp=/T+ g:Bh@ L?UGY.2Gw>XUuE(l#Md7fbA^Nn l1dqL^T%F={Jb/{ #U ZL xJ^s`a9Teb Jubl9 |h"=[R1fPx[''1L4B1642Az/7WGkiM&3]<c bqz1is`vm1x-}33'_v+?r|3rT6|uBUJzU)Wv`qAJB:3/l`$q O*3X n [tH6A]  /i%$et=3+`L>_"qWSqkv0}BM. 7w)~)@fKszsg(a?tU:]|];Ui)'xktz! e -?; eo# QuSnR eWmA@T<4W y$^7X4fSX]AWVpk:9"l04u]SeE$&${U96^3-Y_~ZoGv =L]3e[cR\W(%YvA f|Q#fo .W[(eS8q Ny't5T^eqJ <_Zi2dT D`o!6%VWUx>?kNlh#4 hvp/((*ISTa "IY`PyW!;JKVL5hu9A %%m %UoE%sR33Eqdzj(x )p288%[!F@rb"dAajGzfJA]JMSe[VIh\V2P0B$n`gr&Wn^ v Bf{djjRfq> lu}plzi3i^*t2AY25NL)L/[$F |K%cV#_ <@Y%(Rl\sRO d.vFOu~(r]DH K]v}pfSS`@:;q >B&n*grFG,,x4A HbNoCL" @r=#jFv.Q(.z)P(B0_LdF'1yU"U-mX[|MDAvRUdgD>+x5Fc]E:,Oy0-3Fu\GbH> 4Q: t vylYN$;hcgO9(~:"]T#K.]^5ZJeVh;hwY]jUlGPRa8g# Ys0c==O;YxL^ZKPG% jY?m2qKv_p X 2^S>M7ZB^6=0aK4t xlV&;:(p4 }QV8Y&y  o@Bns-#M3M0 .F3ph9rc{)FdiCUD/_W3^Y%yYgE8=;iE=&C8hke:B$f{YP-/hfzSIbx<{0mW>lN"K`ZCK2Q;-EhCXJS"iS!J>!2).}o iN1O{vb]h3EJNoQ1C=Kv$EZQB\AsQg'NRP+(NK-x1(qCs73p ('?6{* ^ s1rfp\VftDQ~(Cc]?J*>-xGEWucYsz3-UZQ )K'Q?\WhF#t]hYe&!' S"4{F=+B+ zNI{7Qd{s~GU6 + >H`J< rJKg6 ccQ$+ir*jbk-j@%_B"C0/4+^g3]TH ]"iCj5Q@9>d!m#i+x%po?E&{O[$Ax}~@9^.m7y%-J&HA8QYD\s\f s)w&*s(wj7@!H]QH2e*\ wc!)ASZY[ AdMfqa Moc q[Z*GlItBc5-,6:6W{`///HHc+IwvJ%YcB|d f Ygz SIA2]u9jtU<m " 2UMBvM RxI,!d"!}=? i+/p$K3 ]Xm\?1q#((Kh0AB2F5Rpe+p v`U@*z P'Q ]zE%pLtKiJprZcI `@t`<Dh_TZ0*5Rz )GPoJ%TYdnJ Pq+;O)W,jJwazX[X ECIM6F^hjYF8U?3B&0o/SNC:sN?}=_nwS'Qyr ^]Ny'bt B ;z,{P 5S'jY'5r>^/bChu 'wJ >gLzc e.*VThu*Zv_} 5ut=7,t$kPsB`m? ~n\vHghwHnb{FX Uk-w5&-f0hETF<R} :uqQk w#j=-x`*N2jl_-`P Ig(,}tg(_wl[1d uy*' FLSR*[WR$ %E9_ />)6w]mt}(QwxI2M za] \'bLKFW[/2-:l(H/G(g7X0!SoY`e  6pyiW dGvUDCqBGo};XMpoVjZ*P[&VMStji&mAV~_]$5V"gaeVs6fr{]M+A>a^(5`--%+5oaw=KkVm#9/hh6=i6NZ)b|sZ c>[hXN3a*v vC\sBSHe<_B.. _WS1d6c&'1-h[T ],Iy' LL]L''Zc)2EfWgg4_&g 3 0!5RjIYp Ovx]q!#)aSe`E916&`A? (+2T U +>r%8=X`6jERi()d, /^FoNB'q[O4Ghq*q>`}V2`*ciI':P &*;'=mv~UcX$QQ F ^F.8va!m76HGq`r'pMw@}a# fE5Ee|FdoZ1\5 sO4Eptbka'-:B ~jY 6 bN6fOUJ&VCj h^~R~e} LP&r#dS}eiFQ;t}P:ALe5<'0&v(W#G|_,Ue^gV0Ht8ziQ?oj.M} wa A `_]-^Zp59|8~O`q}4S}BglC_<3pMw {MRv{[ RHP)5~|jM<:YK;&L  cqm!<y-8SF  pj n(AY0U6%u5"z^!Nd ]D  r_ ; W;"\.  C r?}FiCM2?7qgYTNYp4'035A}=H3Wmfk:%X|`4^VJNt`I$-0+-q<>59b4e'Og8n7^i1m]d)PX|8Wh)Z3xT&>ET^Z*5Eue.E?Wz$XQR-:xev>HKdX']Z#qZ_U+Ah|!T>wX STR-3QJ\ H^$/Te6q^ ^X& -7pwYf'}Ah kP5e>0=u"Z4GFsyRE <#Fc  Q\k`waL$+0%x)dB!0lv] {_'>hVguu+u:ne| QlkPID>"P|(Pa4U3"N >([7-[l29-%Dx%[vVq3e{r0`vIE7CA<ho9Bxu ;a-u8/v 9z$JE}5pg4 hU M ?H_00@Vwt{BxlhHT y -\<^0?!L`d=]SjeydUw(  5#}%%qq.wuGrbk-9?0Ax^ ZC]SNiQEA;2`~>qW,V%Osy:E :~cwy;K[|bas:Ot[7B^4I6{|F!1} j<]47[5:"YG3+C7t u= PJ RJ>8Kjy"8X' c  ^p)L%=ViarwL[f=0 V  ~e p`_M-qpRn [ " I i#/ L%1  2A 4C/Jg"{"O-,^h \qs #C!!ey$$7^A+?+& QjU:F (u> cOkrsw8=BM zuDHBLrA?d/n_ &J " W&A)m!fi_ 3/E,A[W   5RVaM \7qt !/)Y:L0 > CQ&XgK}Jx-^hIGywOsmvwQ0v<?>\ &>{a=b,!J4_ hT8 Z T_EJ?4PD oXQ}= gN.[- ~Y G  (FB2%:K4 W IU D tOv)NX2-tKh) ;hB3(=%BZo bKg`>fy@vS  !DRgpe3Q%r(/mza= )  : \!u Fg6:|)~i:Pl $W NC#^Sq}TA(KPR   G O h 5 zZ&icH MZ64 [ 6+ 9'XTHK)g}dx`Tfr{5 G>Z  eWy8!.K!Bey%X+%H22zK9{jM y ^r*/fUAY|.\&b1Jfz-v\Nbkt Q^(S67XUhxG   <,?^lGm#nlKTNSV?'wb `Wk$l|sQ{ n  N_cq4 9Xu'%(7Fs#E!$ufX!ue6l4(Txhh'$+T W d) Y<L6G)Pw/8U Z!-w>kp6O{#!m)ZP<{qSV~UCenPzy[p_Up8_Vxno6TO-/]c,5:qhO/ f j |O7kWg3Q#ZtOIv9a L\ 49  '& xq]`zhG  7+|vM (S G[^ n;.F=~}98tg/TMT!t #GFFvFNT ~[ hbgYu9/P3#b ag Ehjk0vO4W%^fv6f+]2;OD 7   \a(TByOT{FQ-HQUn]/ AAoOBANIXF/s$T0S6 /4;}W:Sn_XyC?d74b 6/ 6F1&?)~ePSv2'zS|7"z0Lkx>rz ?ctkZj A}  ! 6=?<2)Gb, 0q ( Y%*n'k.BB4#Y6-) U $"s ?AFt}fqEto\9 @ pYxL*  T (QdDf *\tv9B N # S 0C &|M?qWpq!cY `xf 12  jXm&N9HE}wYsr`| gfWW i Ufqa.]~Y0jmL,UT5]L@RMetCmSsM d !/!BzV} V  K j 3D2kN~+({~C(% h`LP6 2 r Fdlb # $Y AV6 ON$&QiQk\;GOOvp M" L m V Y m?$s6O+A$\ ]y 9_Z" m0!nwna G p @ V 1  !|IC]*^5e~f; T'%*`,:U #& m 2W- 5;{n >d ~ Z  e&&);B=c.=S qFSO % ` +6 7 M Vu}]#  U [ w3XloxFe^}UgEs +ge-nAJx-7Oc +P pR c] oVrHlFHX f] v fmH`69 &X ] 7 gd UD{){Uua -a\ToOOfZ  I$Q?qf XZ790{ yYQgla , o V6=NVbz|!`7m6 }.`"(w H+9o<7vl P ( o %| ~E(t*] $ceM%&eQ 8 D% m2Q^ 9apF!q89&]0:i9!TUWv\u-y^U7:?xbBlR)e*!P%vlwX-XM!g$ a>0e5+~\o5!a i -h|;lga1(LTr- mp8f 1 -SQ"Kn \ #>1?xz?g "; q ;-k@fr k @ r Hwu- 4 8 SXk~c"  d  \  j . dY ml.C&z-5IT~E _ 8iw3 "[yxwXjtOJw,` ^} N9 IH  ZR ?)GL58D d -EEr#f\:hCv cB-~p4c UK *q(_jaw< (L,X%YHV8J9WGGk' JV Z2 } +cpAc0 blkx  q= HW@)=cWmnd \{+S8Md_ p U^B`L j m uaA3fm !} hw*H ds:}{F'D / J 9 U  ^TR,SdJ&Ewi"/mic   &m/I?T uS?:BttF\ jaI}gQP!Ap X tn$y[e X~p 1t U 77h1gp_ikoZ2 ;: I) &@8NU#*_A2H2 L bVGx{pwfI L:[6Y{_jDn}@kQ?>7c7%P . o s&"BP' = lqHTt #&ZVrF &\I6Pywp,b~h Jv@[O(\ORN3y 7)Z#2+'z2Z741_oU9GSK6A+x?A  7=y88}[.l-kd} ,-g Y vC7 5 Db6 )/ 0 lq`yQO' x~ s i[ + df^ ^u6)q: a}^[H op  sp2l9   7#; ]Z_%dz ? /&:R^@ ; @uwIg2ccs x1n C/X$/N-9NgNkC 1[  ee7t#*! H hx5.F&NY/@|J>[',Wbk).wk]b :x v  8 l g  t D _+9}TV2=~/M@ |{ JGc E +} tQ Ba*RV  )  4Py{ kyFR0ShycS F +%5 Z% hJqJB"&@O"m^ G(eq+dQc!| = Y5 4#)X* #7E - r <uY@9t9z0X-Wc@R,gOxgBuF *uL/  @ x  > ( =G@ uh A[DMv.0~]e v 2 >UJ Vwe7Bd$.%wOUGy{- U $$~X oP na`ewK7\L  h 3A2)fm(b^zYIT'";Se   * -  (W|U^i3 F*pr!/S K 7 <  fw( O I2}z eL :0%5. U;2 ecx=cO n   y Dt#' FG=SM cbeEawI&`j}Mek]0B $Ph t^ y ` HAa  Xu"=9|C l U? {  z>z!z@42Nkb j 'AT@  x.*`TB.Gp6AK3)r I0 NWI2&U9d.mY+yXr6 Zz,7N;L1a `nT+eVx=Rp\ F h U)L|,P-unmk3x: Wx0f'4ni@73cMM7,  0tl`o&I3I.y11ULA)`(Y` uNO&<$. }m@ < t|25)gO2 dEBO@Jms7#N  # e]z|`Xd#dT: CS`&Dc{ mch46v@ledM$X ( M T E. `oC/qe2=)'dE K  >%4jB. 5 os2-'&( 5" ,J(PO}X_. b DsFdX(fbP Y bbPq,M:e    )kl+^b`  gq1&_vmv ._lPlreH#wv>.z_j) GF Zsk =DT2Uw H; 87"L ~TV.Twfxy# /oU` >Rr#<nH41#'a /bV5 zh ZIsN ` fQo1M|hx gte <|B <[vko -CK'W`P3 h9<{Kr8VO  J   av&@~^{AN@Qtu  F *w X1O[P^= :%b#y0s G t [+B+2|2P83s(kq k ! %~7Vr #F{{  e* Z Ng  b.KxS;\8,`VVu%rQo9 b$ tp$nol SB7K:[i@RgH/~aT]  QT  4o * c=lf7"#Y0 _Gbz .}7"tD[7(8 4 U t] ? qAR~/#9 | ee ?\A+ 9,5 ;bpwY~x2O)&\  b` 6Vw Rngz&~$;w*;4ZXSu 1IZ Y@V\= +#; v k ^ e @A0SJ 6l cj_-m?iy  _, 93:13QYj9jc|+~8c p' Al3!93p HSCa CS F  !* >HKPIGX)>wee%*V)&Kf{R { 13\f[J T a 2c/?H9,%tN Sk [sr09|}qrV58/[  xE:    TW jUkZB} t% g^A, x#v p Y/$| 5jzsPac d % 4 z(     <.d77-ye/o J* S#1jy5@ }yBNfA<4Pv^f(}vYq}-*3cz y&r |<FmT`0CBj,ff.uV] S 0%/1f \zD 7 ddjEin],+:ilIj QURb/`<]) V_ 5\y7  & Rq|7  _]  (w X W >  {YmY!;VXJ fn {L   ?12 , d ZtF#  /}\h'pj~si^] k @Q Fk[kHZ2,-K88fmw$ll4.SXI w51+9t?"?(G4U,@c Obt$R:+1 #+"A\GkVEko,729Y)> 61 g  ]}eW7w@ O!S`/bw&}E ^(\]O0k  S xr|'u3Q A(kpt[ x_RA  rx j HpSfp x"fD gbg~ Zf j M Tw ) `\KtvV" l>Cp !-.lE[w^ , <d$ O X5v v"\w^KQpZG 6 A +  *~W%jRn+r=Yl  b ju3*kH<ulI /J >O0$O@t?! & r` x:fKA   .q u= %' Y"A@m;F}oX ' K Z"Ox= t$*_ tp @(Wu7# fY cf  ) ~v)  [$f#7  TA[qHf` <9"Fg kbu k6&a - ' vY4 g 2i j % - 8!HFw,z9 ; /  r EQO oq3zg9qu/UGu_s!  rh < Q&Z! b:[R|}c8RxD;F 3xp ^ E M ~og $y=rN~pv  @9Q Wt R yV$zA|+c0 8"j&@~_ $C  sv Z^6^WFGX  F"n a&6> '.1 . a A %a:=Pa4! kLJW/* { UU '   5![ O  8jhe(c+ ~,N 1 c dbNh6aEc 8fOJu|N Q G sp* z}j Y p U2nt0    >  ;YrRJr9{8m<N![QM!c F" p sd'޶ ; XA !& 2BaY  (&fN6J%N )c*: Xg iB`aMnHV(jxK !( # "- [ b Lzhk^% <Mre o"3 MGJJ~n8Wvh iSqN v@<  (,  ^ azH]z @p!u GDZ7!Yj= D;u699[*'kgZpV\SA t *nLB3 e 0(c U 22J9*Cw=NRT8RX_|pF4Hh^j G  jF6kD8{~V8 N ' $ TJ8fP[Brpr\ CcH z lT +4Ij )0`'?^= V++cf/jJx62 '  )  pcxy3Ud6|^5/bW oF]LZqvMU8|%h+[v-e\ Pn<& G @G.V r} H N3Ki 3@ 1QQ crI{lYb sda ) N 9 v/:s T \%6oC9 0V !   S Y de3>$e9(%X8P   f{ 8{|\('+ 5X dt< n}LH%D9 G  i zO_U 7VwWI9) + 2 m:4@ vAiS#w~U[MtE| ~ )3 6^`y)Ys/k2/e[ B |+ S  d HO |  O R?l n?w* $Y  vOq_mHPV%R =$nQ7#K0 C\b'=>Kr~(Rt N9d*P sM tJm!> 1wNa  W07 R%,&1:S 0^ ,\  |5Ks$ ^" r <M [/ 6 @BrDvt)t BrP D kk;J`e%anz$fh0nC&8  J $ Nx2ORQ48rqfR g3g77 k~m!&Nx3Lc$A #i?i/ q :>JFX D ?]zP}f) c; #YVBY+!o ;   tKv-\kV N fcP2!#) P%<=( xZL zuhx 1>4 1MM GF0s nC6G[.  o?TCL/Yk r,#+n^ o w}6#7$ 's !h~ E x % dL jB- Zn X [ } WlpN jcQ +^] ~ gcI*ubzPQC* gJYq{?`&p   _G   !Cl'Zp1't~ U g? WO  ~ bSX;*4.;  5N2 lW7 k i&u$#  $WFqAqu"mGL1 =Y |p EJa ra'?g KEo iQ ,f5  ,Ar7Q^R - e'|.!Xw7Ie@ q   uPgd1|NR  j!}7 & |n7 lB N Bpg 4LksUpzqpqjAmN 0I3TW   QJeS^/ q ]]SFSPM kF 4 \yKA1}D~22 7!(#Qh JjL \r 0!v (8 _9/  HU .L$>) n  r g_2mcC=[SK^ G%Zqo) _TEj _   ;^ fPyf~~YXT'ucM} og 4 j " - u:.t  D !K>`4Z:E+h h )3k@ H &%~d [O~$;Iy  JDLd $ -UKYR_)B< ' L1O #{ tJR: QP:!gz V s)xS  g %TRC n"an, <<*97# pXa )hPXO{A ,B 2fE 6K ~T=Smld*q_ rS,LEW&8 c R+ 1y L&e'!\uKQ1x\ {5gd .$y B,fi)${TZ ~ &?jK"o2&   7p 0;) /`ڌS'k<|M  +Da921 3 ;(dC2+g&sVKoq_@tUvM4 )H1& o%i&?4!. E 3c0ff  k {GHmR8    } ; l *i@}VrWE |5Kx aXOs_p*3FuV:6}n&3; R%J|=M/4\  Wy!na88 < (  t9O t yZc1E[^, N?j#U%~H]-c2!*-q#5 }EIm 6y=s\ W nQ >N>h<8 a z[5|3M'B# E Xf- {   0N[vg9vq0i 2 XGU<K t  Qa B @Ak" @ Gq__G =hC&O5'#]i >DczL $ +f l)4 'z '^HGUe#hW;4JcR$#<0bC_|"$!y g>bJRu\O<=<( o3-*7 Hq82}'u ~%^ 'L \&[) *]d > pi9p + !g    jtNFl:{!C^P. kt*%Kt9 & b,([ -:w8  6 hAobjEmd%.` !y'/ d`hAt7 yaBW|!&rU!TQ  x=ۦoaAN  ~  G:o@k ]G  { aI:^M D tUqj +D ) ):#"W H # ku  u H{eͺ MSewG O %) z$ ;q > 9e (D =Cw| 4 k]w tE?3R "vE M41nZB&ti+"oLuLNk&W6d  N9X>S 1  ^} @yYk   Lq  `,q + jw&chTR3xa$Pn4!V& N+ QaLL n @+0voclwELy&T!  w  ?.R -V)z4 n[JG^ܦ/QoWtYd ~h 8] Z7jjK4]cnQ{LDnM o Y zD bB vH% %0"Yulx_#2R!C OnYK4wXj]2  .$b<`bV8Kkua. y J߷x\dc d(! y{ ~4 / .4'I)Z\{&FS sh& nA# 6G)mf _^B e /5O&BIJ#; g =;A?xzQ(&@k ;& @ H܀ܫ{GPD6G ?<  , 6u|{-0 `3+u5'6Xwm,W0| T h9"-L D~HTy5afF& m ^[,q36/JY&#k{"Tt gad!K|ZB[s^` ~9 ` :a Y B !c! #PV jw_V.:R Vd`6r^XhW9M,uQ  Eivo@#1urwb a }34 2$ 7!` P) O sjonYc~,&,ݬ_J߭H, r-"XG&*+ 8'2):g,#e_M b83Y" d Əe\ZD$,0x9S>`4 # ' +$3 5TFSWc46޼R ] TA *a^@$q\"C A -?9f * [  }#"Ll< < &Gr5L1p ))' =uWD c@dIJj U]PL%HK @m S Zn^g+ ^I-X EQ؇'~95'&qcyp *{:? ST̓=[N} $&o`-l*!`zsHu..Gc`U n    ; gJ=   Xz {Wd"ٲ u >:s F! O" vJp p2߹ p ~F b L x\ Lqy r !J  w" gc$U  y  G V:;-xg<F ( !pb _7( 9Z)|Un~;* 7 |% ' / K %r @[:f5   N"TS! `s.[Dqk 7TN07 QS  $&e$J{W b'h-S   fv(NKl 3 ?b H .P ` i%5.zo,]}'p [n &8Q 0,6 , d]3}.2ck. 7f m?\` pCv( ] Qg ~xT ,I  Pb8#n\x&nCfz: Rr8*&'  G` : b f9}! S  'N%ZJI7V \_0S *;q B9,j$: ^|s W=J=t" 2i#PW#l]4dqX mg`|U,U % :zKq:ۉ/!(?$$ (R4=!6m  t I_9d "G3 QGD"  lD `M ZJ LO|TFbZv$k--" R K7ݍ 21C3O: /  h 3/z!? W;: $2  B''")XN ?+ISH`%?%*T V0 ښ &O\ ic r \# !nmRtiHS( -4"=Ch3a9(z)@e C 3) >!x;׈: rt=spd$T.U.[ 94i ))F 5IO pX7 ,zb|H$$v.Ij) R  c4up}/E.qI wq9e =^B=drY J%o9/a S[&d {Hp I*iV K(aP%1 = ]9M+ , SK>ޤkKpHuUu| U6(b }((E b6 )%< <)J6FHS/.%#,n+] PgX_. }i X,O[]f H Bvahf! u=KK  \ I9-+"Me#^v)SH:mk`2 e -:4 P=#!)DC 2uW9J.}T Bo@x"j. xB +: xtK3 tZu+ _n 4Cp g l5oY] g rG "i @)\ (,%bQx<@+h(]1xZ y>r 1 !6zb~1| cfFpL66=8Od$}QR"*$ ! _*- mt ɦ˩ݹ` K ܿt ]9 > o ' 0ESH=vWZl n p O9 %^~G s` 6 V ^ }vC FJ* =#fnf7\{i:$T f0$' oVqaaKs>!z%| iB  D TS# Z|F&N,5]?2_.=a!> &]3' @wr '|fc ݫt/$?{54e>Pڧ `j]L]->]$#M.B 3 M R__ )A:,;@ @!F*(#fW]r?"x$#٨#s`%G 2GuS3 ]  &+a CiK  n Ze  n 1`0?v\P@,z j i;f]:'-x1p)x F!eO sFX r _ [FP3%&~chMF ,kJ !e %%|"AT.  K&TG-. t -cgXn  6xWJ,AH{ 1+cJ C V   YfY݌qD߀l^ g%',5 V6Ki+d&']D8܎%=׌Ŀ! L Q6#&  k 1r f uB9$udNv7{#hww  n3OʄԴ>$W)5|$ F$M(*t$2!#K *! 9bF*@ѪjU )  I q jb]gJBF KPH/}ҙ"XD_  (+% _c1ِ t Z 0G '^2X1d V)n Z 9 o ([+$V@ M֐Wh& zeJ ,0p5-n/&x2M׭ {gm"w[A,U A{ -;p1|!"waeGME >b2bv7/ &iI gW'+2+x.(^ ȭ"ϐ0͚B 0ٕtJ%#6!2^    lr fH]Z#Dy 2W~FQEK :] \eNbP _ `wXڐZUD`##o ~'?l[ {%K/SJ5 jٺG |c Tt?Yۑ7Al+d k C #-V2t<%4W Fm} mD Մ~0?HZ e" A *96oBzA5R[ 8`i A@kv6b k [ )\ `  f , I] Us V V\ a]8e4Y- 9&o!  sN  bƌӷH%5R?R}~{ g :2/ . &{|>&M,10,V9r?Է+ǶgS  N>=f܄! m$G." '( v{|G@%#,!%  v  -$)fK>B! Hr$ n!$ L) z 37 7 + 2~ x  k' H4xVY/ RN(Fxn M @}SDamQ]}{Z Q` zFE$cp x !w7"N D 7 HC̻n>y ڿڢ/# D(7 +9%<k[[\t </Hm<7'ސi: R )2[#/ ZҲ *Ѷ Ԅӷ3mNS $5C[*U#  h I2?P=Jjm*D7 YY p%+y5n7v/ c # M 33Z~,; e 7 on ױlqp  C"W3=h:^-d 8S=Ytٹ-:I393 g > B!$"&  bm8m|F-Wpsr& lE"%6dohlMN 8$* XC\) cXd [~ &K 1V |@ . <_ ]?3  tפڊ_-bf˹ߊk߭ a#P)F7B?20q,%kvi!LZOK< zj CJ"$!W  RA $/+q/w ' fh^X]y!f001&!?.rY E ҭYΛ- ߰֜K #U&~_'^  dr<~z 2`tX>fLlC34VpZ)=&ZЬ{΀ۑP-21+n( l 97#k8V3(S}(|2s?jT4=g!, 1' >+Z;'L&ypۤ 30s 0 $L%j835 ^;;Gp Z'9kHn$z[16;[RSY] jt% a%%Jy?ySF a+Eߦd߯bgu tZs3*kA0uQ|  b3F=f76r): e S@1O OUp ) )(7g$@ Y0YFTl%\1b:XF_ w  9 ) Sa dKRɯsr  K  W %: g p,d PWtV!-4t]4"/% bh" ZcNm?үog 8 "iD>;a$%3' ;0! -Y^0/'<cީm؞Վx>V~j!,;U?1T#Z> 0P 1 T <Hŧ } <.yn4 c{Un[kA *=0 B 9!4)s7p 3-҅ U 9#@+*o0W k+]kvaղJ'l-l&n&&ғB":k-}*u Er"5f W)p ~sSq K e [^" l<4dU/+pMj)f4(L-.,'z$ &ɾذ&_ʻ>+!  - p7@3.]P%&0k!'op i l T4m@6 ^(<`6[t1.x1T\ b2^29X# !(<# ٕӽފ Pj    #̓"H1k XL_8EG :d 1K*k j+m   QW, %~t ړDcz +$ T 9%{"X! N nKߨܷ߭y;F!<W3W W$, .G,M)  # 77J?G >~ۉX4n 8 t 0>v=I : c059r2{"]n nsBYAxh]oc  S0_!&.~ 2taQs#R˚&7)f,G($)G+"+)w} z TAC%Rt%03F0 -*V%qYBc P x4˟ ׯwUћp / l  W =k tX#R ,)( (n?. X  #M#J! V" h@%#WۋjYBf +ݓho+ /JQ#?&" n`54z GK! }W~SX &-  w& #9W$#:O~I s.D>3Ԅ,_\i35  FoI $V!t]$ Kr   ! 8 1p{Dl!m 3p0lE g _m c  >i6_Hڇ*:4 k"23&J*I  0nEj $7!!CF pMk/~me N  %1E*   !# ^ +|0 %LT,s k . m , "'T| Z]+ `$ J$B%'aB_))Nx6M.))׆!i  !()!@ "fu$ Q l{Bf UO8X6!'&X#6 Te + Z>p / `j_A]dz< Ex0: $QKSi l- Vl# ) \ Nlx}[$O> bEd b1 < / &  @{ P Nn> `^XB *Clx)mt$PO.Kj~.JY,,lP \ aC(u'z 2C H,d3V]PLqR( 0k)( 1,,+ma !|WSߌWGuU V6!A=d6/ +# mٕ7 E#[|8XnA EN?42 tV7 v;Qa|d*L2 D i; e_`jlt.|kcI #R! ~{0!}kuWx Uz$1K,/+$(1/ \z?9$$^_e [jKp(6ii FAK 7yh'+\_MI s & ?Vr%"#`y ,V $5 Q]1DGv #D 5)9d)ۘh!F} d | Re' .+"# %@4 L @ WlԾ\J`ֵBO=* Vl 9l rWY|f O'30^$p."" 1 f5ڬWCsVdH[U1/7"q(۬  0@>C+H ^wkVgTA5-g~ ݄# q@DQ3M+G1*i? o iHZdp'Fޏ}QW8 #v A1= 0k% .68 j >|tSĞ ]G<^m;(M,7#g>E[_Y'tH4" QwAj4Zzo@8,?2b#q$. $N0&& &at1B@|Mߪ˘ O%xS qgj  1O8-6q0o39o `ih8cٜ9CkڦF^ / {:D$& HXD3e ,  d 3Fu f  dgZ.qh$: !Xyp = Vl8'x2݄ ] %\$N ]$'!Y  2u_mi %$i \ YEm.Dc=} H X ApI ' ;sQ?\5i&7  "O=R nHn"="=$-7 mI n߷B@{F.D"g?8'(1 &)$!fU%d>]:DJ @r4 D.ߺ~ܘ1[ L  7. Io&<(t l16I0Ǿm-q ]> Om8 b+~"e5s2%}H 2lkP =.'h%bޱ2{k Em<L?(ޟj J.݅=$s]ضҢ%؋85G" ,0e+8 $/ RxۜZBZ'L[ ,    }!M R^AVMkA;'&Z/}3 bT[ rfi]:'/j0%& O)$a >xUQ(X H * ws_1ywT׎ۅ?{p q!"%  %$Q% * 4(">G z: ic M\c@sw`'\}Dh:p% f(]  Z@_R"Z4Nk \; [ '* u sx{O؉IL 61:;+(9 1.'sX3?,z@55%vƇ b %<3'<$$)<]+O(K% X &M<.~uHrp # *87u1[,tH"!  nu o&Tһր|lH \9  r!n"51 !XL Y ; ' }E4 s _^2z=} K1"+65>*@@g x)Xٮ`Gh ڳ v| i" 1f0m(&"%<,E ܿ 4ҒFs # WQ_4HLNC.WX fb* گ>ܼ5Id/۟Rx! x (#b ( (=O Q vUsflF N 1!#J]_(@  Fc,)2{-ޠS20 w$ ! =^'waw{#t&&R'l# sw *sd}޵_WeHZc`"5!:=@ 5N tM  L5 ~KW P5g7O 7"d~>Z/-* 5="cgDԤ Z$>da % \  ~$$ icM31 p'["h*KO~t7#){ 4 ^g  ,&l2$l޵ "hVT E   rE   >Q,P i+= :@+<y[" l_RQ*$ 1V2~tW "')=#x `9*77,R'$T8JQrk  = %Zze83 z yUV) ޵1: R '<5,N\+6AWj<;#JB]ܾߝ.ޟpCI 'J!uB]AA)rP)#y0%} kޒ*= { 85 B ? 7F4D&C#B>"L F"ۍ QrBVOTY O c ! ($ )RQ!yBv,fDn07q M` ߘM֣HQa #$SOgrQ !"G#b 4"^c\ܑӢ) 19+ R e (7CߠHS>$.Y%h!F27ݚ3 åOMJ(b_/.$ - :)-; b #}ol V?W?.v2 "S"?% +#s&ld% L1    4/6E*a? ;, { )c 35* m GUk;CA nCQM)H$>o # GGF w-7;3He] {GI~%   Aaޙf`Ȃ}7 H$  ,R? Ds/6  E QV ~e;TrzP| ~Cިg 4" #\ 0) 8%~66.$P4@mcv  ύ ]d&t; X(B AT e\.3*sVV ]!`!ӶfdniMf p 2G | yX<AC> & L } SK.L?/ 3 u&t*%::k= aY!!&*M0,?D"yeJ >qɁŹc8 C2e__3#%7.H-79(,= > =͒($uoL=Y mj}^d&#:t,a(1:w=x;>B/iYB_k>ɽx -K.  r5,"yܢ3BE@, և/3ڙ9%ލ1uK%!% \1~w m hj0+"?UO:T(ъKJo!J'.[, *c%?h e -  k3)UǤw5Sô1ˀеؔ&-',2%C#Q'=',6:ܡ1qد +r@~yZGl+-8އ?= u_Nzt:R2 c i# G u s  0m9Aec(UO@3 ]&*֥RJ p+1.F'@!~ b?H2-6{:=l YK>BPq49) 4iHezv) `x % U A  BZ' )M޵ {[ i5V . EY!4 .O "2%;u`ۙp>г.ћ} # &it 9R &q15:-~? _ 9 \ Z8MX"7<nN>.Z( G)":6G8(ED( 3 iHw&w޹\ D _QPHh  q9? ~ \bJM:%LJrnM 5!-,&#)O(b& ZZKC J*Nd.o@ ;z )G-*{-/A.r+$k:KMB/kKeޫe$,!ȹ熯6] 7;A1%c+%/X&3X/x 4-+`VǸؘV[ ܏ D}x;< ILoLRD>-htS}uL2%,I99,$c,*44q`  2xa~Kx r tm2Zwg.'4FH<L*"\P 6H ,rs !Z9̾Vfr1:]7$ 'p(( ##-6 0 :2*0L3l ^z~J"J(,:Yt|_y C Y=!N8/E3Z _+k"-s "tgSX"  <%s |*>C'& 2 g'^mǀ+gUrC "<2 B)q  T~(B(=?Nȹ:GJSvk:^Q&K%] OGW$DK{L$Hک:>3nL~]# `e fF"(N'X_XSy51)q9 W3/7'Z1[˦ܓ m . U.8 "/Q4E #; %\ M 46  M$ H~,aM0B Tc*>A PJ X0 TK qrH*i &"uX(  ln''r!kfL2;<17  _j %D2* ڞ 7z7 -12)  p " 0:-.&#Ah $۳SߋBJ%ׇ M=#"l al%d"KBVo]k F/9 Os K Q(Dן e΍  a ] U%GGM Cg ydE HV~@ a~$ cTs1SV '9 w:]7eAG $0K<-2%I(V f "3t*Qm?H&, 7nx$Y a0@w4$oX"7%{&TN %VG_ی2D|<dqT '30l;6 D. )AS< < /( &ث! ȋ*]w' x7 _aF p&g4HNJ>phj   o kԙ fUip G & 9 / - 4l-/1K-P&m+ 8G0cI$ _v~_ ]=qr]O%+..+p b9#*.A`yґQ])4]v1ӣkܤ%M+X,V*{()*)&>,c;̩B>%6'1ODY[ Wc   E%1s)!1 RKݲZp ӆ~t *0 +k)T$+:1@>5)K&2EL9~3jo$SF!DZ?Eݓ~9? JT $L48&>3$-3iEb bzPe# q3<  W| vl7G } ' 9 W)))z vN6Q>/_ :5t]jҕ R0#v$pM!m K!!# NVrWI,Dӌ:qbX $z2; 7BZ  N] orSA;s t {7uNnJ=b/G !' q#?ӂot 11 c</20f6,ue]h1X=D:Q4ݑةGY{$B"t zP-U >  o:+8&p a \PhכW&tuK]z;=4 3VR h$ W9 .  H$m"B:!"qD)r3+;%@h8$M Bn=p8~ӐPآ"F߽*~X6:+g+Qh> MCHp-w {\ 8,R љѥ;#/)w8)0  %K$p Xp b!n H IWSF e|,BB6;-5b !,`3({Y?<"",pZi*#f/<E{jDw^ ~>ʼ)%DJ ܪIzNb&2k*1'rf5s.*+ ʫw3-dÇx˵#u(lAg2"0"9[-BKYxRfܦk #']*Q Jr pNb!#.8M:*  QA{1E c9 O Y " bn[3g #q'ju=$ w3g 2.e #t3W"+[ C nKyH{ 4R X 2zj:< ܁$P(s++ 2;51߹B / &,0/#G{ =~VoS+/e?)z 0 _&֩!t%!=۰Mp_0bk h7#5 S"n.0=OHTTCD&!f~zB:#!w^Τ ľ/# ! V 0$&'> FS8IY E@-;m pqlLB$&nB3 դ @(Hڠߧ n 1 Kn}$ _}V S (Y,& O 6t  [  h _.\nW vF%BI@\%!%. Z֞͊AI=x ! -K *Q0L/ a  RC!-:$Nv  fB.kźw 4 Z!XNUK9( 36RL&H? ) xH" q j) 6={kU+9tAB,Bg: )/" * w$ b'7=<%$Yڕ'(&S,U !B#J-_DY2%\/(d,&^j%Kv6%/&gȔ͞kВO"'o x.1!@6Q:Tn6-& [ "B 9\GS16Vao6Ս #_7 a#g9CD:,(V)sw1+^+\72!B [l 43)z z *# yL \s=zb? @` vQTid|)@AWc b = t x09:4,"7 F0EHGH41MH l8TE y|]uKv)!"Y! :&7صv =N38(iA`f>QbwiF[ڌ)G-&E| * Z3#*:a!IWm:n#%]" B^dp r0aRJ RA F#A5.j<s>}2]P:`Aor|Us34@s13@\"C3xt,2 oB F߫qkQIM\A ]zۙ rP$B {  O'"?Es7Lb">  LڨWQTMSRc@zS"9')"#&w~8? <>i*< TS"/0ia>=O/r#|&(W )F%$F'!!3@%a'k"c :e:Yd7 "p,lW8 e3*x'\7:=z)."&d+!߭&W~zC#%TY; (##Z }s Mg^!a!W8(лR'Ԟ $ SV}*dvLǨj  R}Z#'+5E8i-Vd! ;h#jԂ<Ů fp@[2k K#+/"/ p b~W]W=(^ab>iS9x v#Mj i[D7{sy ]z4$10*D 16|p͇Ce]Y%h!'"3,6(<)_"d1!/GDu”Jɒ߻/ =۵  Rwt$$(g.*/G$&"%# bB\ 6~!!5*}A_#O^  qd'odD=q̫NcK_fv&CM'2C*6 41 %' MC7@* ; H*^ki)ChY, R+Pg) 8OZ '-sm+U& 8g)#ݳZڕ+ fHv (l%)ix|(/2f+ |w\׋ he) 5 r1,u3  |ֈ9HLn|.7 r Q Eh86`wUc4߳wy!G|-{9re0W[zj jcmʵ6j5ҚZw:a N%,F1?+ s< L1sfD3/c,p 2c>  U&P @)5?n >m#AvυD0N&o2 7609Q%#N$#Iz%) l 83ds'ݿC2 6 %:   ) -6+GGkmbmoW ;A2V  ;m jn O f 7/ x)Nb/9A(P-k '|  ENM 1<{U^4 uR P~;V; V C]tZB5 tj * p&L1+aKqu!֋`DN3\gU$  g,]d h6Ry}k9|ۻI O,dU6>V #K&L8E#މށ)!.r;O;2 [ѶӉ89 eV"f%T&+ %N$f9 D^2 %xicCZ""u+('   }f%%Q^DYXO̪5\#%6?z6vdtf G iJU;њ̕/t& }zًvR\ &)hN" Uop m XcԆZתͬn]*}6i<2&/&i!$/. 2-"wO 3Rg)'r˄tQ$?f7s2I*OD<"=RX<3 ^%V __ĺ}GP y ~d{hP'# ,s')  voj@(L*<*m :#02v2%_6  "$ 1?I.1l#/!  e EQe <{g c6^&`qR {g ;?d 1@* %@ r )*G5F1'$.*3  H':k 81}: L*^R1) Ѥ@Fߣj.a,9`3 ?O'^ f+  ' `$%_ȝhWnMPTK l  4j!+!1_3/P"n(Qse+;*b@M/d ~W*0/ $3!$ T j )UY6CN_ DS>hb }< O*PE[K#W^-iH ]Gu| h. lzX:4mB O5Hi # 'B$ zޟ.JS( t-J +ӑ^7 m %2*4s&`>{QxݔW/[=BH o5m<5(=(,is7td[N0 m$f0013)g@$8'a DR*H1X P '0/ &W y8Ey.Pj5s t Y 4$ o!b+T0,:+! rI!*\fӕA,hV p 4 #s A1~=/cIk+v $!M L.BAF"v;O]j "zm Nt $=\ Sg !'Q#-y w  \JI  dmU w|DcS I e*0 ! )  H f=u\ ju L /&. a h>6M 2$e_Yڭ_ U";P *b1<(0S*#hض>[^,p %}h~&*(RQb [xԲ" pKiZ_ t!-N1-D!8$V bKZskqPU :# b(-39 ?X!B#*@ 3[׌G`g|-)61 <'g# # @qګ 5 0;ߡv_5  ":,@8"+rԻԳ wx[cd"^)ε%~# (n((!&S R  vk%Ș(݈Mo4?&)94bAEA-|8(u W2>dn{Z1 6t2W T a"D-*' "& kX? Z0FՉߚSnj '"kWn)=L+[~ C 7)/Dj}eڥZ*޾ C>a f]&)J-#1y$0$("B Oݵ ؀+hֱWu3m ] i&+k2G>: &  W5i6iݎm̻1)8' |ta+D,j?zEW:%/" WܗO1œ֗5) -g ?;2)" ) +8'*@m{":c) ]rۯLMK0.;^=h8| +gGٳvȈۺ!+&b@&   ^kQ DX/*dIdviI + ~ @#[+4() !2 t B߹RDV~h,ܺ` MwwE0$;z >%/Z  pBveX($w5qQ, 8V,8J#2D#F 'KC'Br !hmO QvGBOEzZn, Ƀէ&cߧ2(މU ]E 1Gh2&/BQ'q9|> (k0C.B8Kstv5c ;xs9!1AyW!.Px5m5_0/+:,"$S"'v4ݎѣ-ҝ HP f0 x\@<_.'sr); "@G*g eۉN2ԮN6ҼWpB9*I#:I&$}88>8C"^ Zt:Ly:;;  O Ic3 50:GE7i7N/#4!5#Kn#i Or c S: Y +e,wM ^2Z TZ#%(*!(r+E%C rQԋPy0 z ߬% ^qVaH5  %:<#.m=/ՠ#D1b Dv e%3U$- O.mn' U ttvX5ߍ+4*} t P/;-:-Y ~& ` ,* waj^sT>4m Vy"#9 I s ~U:Iq79Meۜ$'^s v L0!( &njڠl܀*^c&~ e!B 4 k>"A@9 )/ bVFXvNWYD =+6 5{){+ z1cK U uzhuQ  {rVݕXf4,% Cn 7I# vۛ.R c*Ζ( }(N ۵ѩ>*1t"on([~&&( Z$uv  -) z q%E73h4<)h9+V *Z3wÏ%U?݅;].ZY k 5 E'.&$2 !gy=\_(#,Re<?$ qR jkDh܉c7a"%}m % kFl/7c0%  ܥD̵ڣfμ/5ܟXe .kG&L^4S62#p"e*b$ $܋ ߊ+=O! u,&-,^& }EaAѠI%$UuT*m4 < ";z m#38!{2,`IR ,0 3d`x('2R%{Q C_F۠Hͻو#35G*A,r=I8%QV _? x0lU v Y'P+Q>=8@>w2%R& x*.u.`P(^ ndS+ڡ- P_؝Nu y%3'}O 9a-'h6$.I[ 2t0an=vՊ ?2 ==S(0{%*gV5ŷ8Y&} 0{L5XrPx8 !dO8 uOY "Ɯj9r/P0;޹&"Y y%*z|/58:58 2(L)_$clu>9|e@V# Hf1%n&G#s3f2A$9rfĮbuҿAۙ|6 Yo-.$'\<CEb<5 *f- cEiZJ0 nF*& .A,!^+901 "I_[OA/19v tq 4!'1. %{UQ\i<9 cV2Lݗ W l$H@~(*S-Y ,I n0Ny!4 6k_+b4*TU}cd G|C , $)3 70&]krI"/-`2R3N" i JS t\6k!A ' ;Mv cnYL(o ;B$9 :Z h= !.q(!1E " ~T=/2R0v m& B ZmVܝ9n <%*,Q#HXM_ Bcw TaS +<>- -},zF * *ת"jo¥! , ވb ,4!* ?M > E >j%*1s4.yy"c09lGH8'F }x63g   8 9(; P3F-Ivq z7/J3 #=jfg c6R`G 8j U#N+"$s=ן Ғ@9ЉpHF>c 2J1;!1(1(۠$MvLO!H ˛',Dq=1[l]R  .$ ,_ &KB_LK7 鼂PгdAހ 7V y%" !Kl  $Q9a9Q(b U ݛ#{ ̤/P2K# Yn Kc`s=p \+*I*Z3(?KK BH4][ m9Բ;nTh OH9m^ b( aT{=JU %  f-#I#Td^;OT@U+  " r$!*  86tۯNʞzUfK> m2H_b`<%v&D$?1aA7!/#TV x` +ڠ .JǣY ۦB8 B% Z Uc ~vcCN & "Wd <;@6<B/,!0ھ{`vʑ꾍ze%6/72)<E .<<߂5.%ң3]5۩ H!XX9Op*-e'l U `8! $ 3 A Z#޽'6#ގ%&S2 hY")/5ӟݕ ) N Y!*--&]-\?:=!B?hZ cLK Y\`uB-i=6h 7;;!. " ,e6;, K-9 8,UUZXՏzܡc(;3ߕ/N~Yg }*f F!N4`3'a GSi QL.OB D Q w )>"@tح?RR!$$:* :e aH^ W( z$z+b,m%r b M ݃ V[fݡ|/n'nC)c255e?*E:  9  B dn3 B v-)l 6(-? wяIgRޥFHN8 ? "j+*/&&q(V,l'M*xi[Tހ2,ׯ9 G=B" U,: A9WӸߌfܠ B O~k\|D$ % !6&r 2ܧߑ k[ybOAsQdՌy!w 7"6'J:)%//q$*!_ 8| 5<0Vi ܝ޶OC 0 !}@/ y1J:8F$  KS %gz؍ckC/ oG{EJ2@ ># O YMכ;Ƨ7ǜ Ԛa;|oU 4*;5"'  TݴO#3-V$;'hcbG,8/R1*1.s~tn{J~2  +s%ֱzЮ Z|8.g5]GG\91  LWAmU%9\:Y78L1aoh{Eڈن0lDfD0t %m2|#<+5%55Q0  E  $H  +0E܁"+& J > Ae~u3>(<)n% e8] ^+ &  k E*%P 3ӫ3Iq (ki- (Є4kQ  (f+?Q"yJ HANzߝE9Z_ Lh:?CE rfb, ^# 2(ws e&ف3 aW_*( #{!~  pzSIymmoSeL*6p N K  ; J[]v@XG3 {p x J* z 1 \DF %B|j=x/t-ǿ.VBx~ '0#CD10/=C6S@5XS 3 SV"Hߎ"7! ~v>Sa6E1h#!QAm.'aawh>Nkhy@ 5D ٔ٘&݅66 ި{+g} 1 5h / 7X- E<%/ E[ɀ-\# 6"6KCC3;:u3b{.5!o{36xC3p W[ O3 eG&3g8K%+ f9[ b |%^w3f nE(P^ g   } ^ߜb /!m*;!N8"sL+YJ#1 WE &-#Fܜ.֎y \ ez9 p8g mNlF bI kb o"V U1  މX.YBn"l1j t< *$'8.gAR6T Dg#iNݨxS֮.\&VѿQ FI)[8*A!0E/<,-$e'٩9̾U JӈX]VA$ h];8 k 'U 03O! 5?fe$+p05-P9;#t4qnn_7""u <= j!AVJq-T w]e+YM0)z7}!@ /xKY'xi@B)(ڢw̐Ŧ ߦ 0 >.]DL&NBKA?'C& @yC "ڗ*".]4 9@)0)b$7&r/+E#!&TrP n}%>μO}yC ?$!B ^ [) W#d"M-tB )- X_KȚ,`"oҋKr'Y'I t + +)8ޙ9P'܃ YP O: ;*$WdsK/F5!/&#&  Y`F赺$`aH:21Jl 6  _P&+{$< 7g 5aIkHs笮lD9 6haCj,G;As1=4d(p ,BeP; rr9x#uҝh@ L5 RLYZF &I111 5\l+ @) jht #m')5?!B=m-\{eƷ; aVc ^ ׸5 ~H'HN - %4 R/8 .D '(|.3d S5 m)j-K$zV#qH'*J2{hտ8!}'B<(p84 B!|. ۷*,x t8 -3% )" .T)t  #F(N!0#۔ 3 tn /b)  8\ C<="6t>6f$XQHR v#R2;AXA3"7e-r}UW6S 7]sS`@8M fg,/? ?00 G1 }?=a+Lx1J _7y:m (=GE;+D$&CЮ!<  T!g+0^3 T+[ 4mpZ; '#*3 R=f 8.%w@}B#6 UxgYLz\EC|"AP)H1,!@&,* @7 $)n:A;>p1"<_ *+A Va q-_l(% DWsBIK<{ 04'9؁/ J.8&1k_߻QA xG lG.> 49A.$1"C'h|jozPէʓŢ*y148:3F"lvlB+ D&*p*U --" UxUA jgL e-04q U}m b>I;Mn  &Q<-a_wtdPgN 8B  !ls-[9jA @f1 v_6"#b$lȍ !Nħ"[ иE/0 ۲.6)קӲtx o O "*#($o ue 1Ikx=^"O$j r%2 #ާ*s !R 1i40v+-"b yA b[3ZY/>0c 6[R6C 3u {Y4WA'#35;/tqK\nv p8)/رR?$./,-;&^~CN~B'kń@[%I4V cG!"*10o(#sb {$ B e>5Mx p e N ; + (0y4 ." xY cbv"x lJUT?3;4 NPf=}%F {C%$/.'hPqz mp-aB 9<0  ; fn gb!v; V.F~E#3B<Ul ,0\{ &K,5&RB.]Hzc I p ` 5A2p zK !,/>!|zF1TW5Wh!)*!T [}HL.88E/Y! ck 5u^ rtdݤoyO?'y)6< 0'"+ !2.SC581Lې[v 2 (Wg Dc  (9 !89A5&Ckߤ+ I? k K :n%J"*~o-;36|Z"E9 ou qKѣZ :}[ " =K2|S[M Bc#J[+&Q  k"JHNй+@ks0 =`L,M;-j HTl D'*49m (G' n(~8ˠٶr l l[<"b:]9 0)j HcQ . ݶtέ ^* 0 h S!Y3 2$"3m K99ٟ11)~U&M} # l :: De R}f^! wR8 : '( ue h{| _?bVi(rc/(#_#_ 0s %# Jt!j$@`5H8O ! Wh:JVdA;ofΧ umH^#`$/+4600 !QSo 6W`+P3bɻf f %&l&t& | ]5?- ECtO/l=Kh)Gt sH q SX, D$u% N{Ppi) \vI}x&8'!2($(L$j~%,<`SjuS.a2c_;djYяƼЛ)6d# 2 2 LHJ .;15#k L? m}>/4~.Aސ)!f֞ tڷI gkj{QxEt>s3%Gj&( AE.%] ({F$&V.AK -)f{ 9  J0Ny"{s^ L E |yI '[ lb/ ^&   bi Tr4nQ|[R1 #) /1 + p 8rߏ#ޕ]D6  =tq- %fniݽY[a Hn*5Av0'$ 1`k6 4 3e9!5(e vB.<'rIy[3Z޲ p %'  9 &T#t """ H!мGX!V + ')4ٌ>W<=.`x Ji |t:'əWæMǘ$B6i?b7(" i- wQI0͡EIA^9 3i* b . Doӟh _Bxn%&)j<$23 X{w6IMW+Y "FXo^8f%/$= m*ٮ}f ;8 b 6vl7[ Q 6 ,FkrNd'")) y 3  Qcmi LTW\v g5R{0uLײAtj ~n t}oy YNu&N3:5R!6B 6&ߑ \ 2S5R%K ѓ xӪFI dj d[bL`H->0' ~'l%r@eW`A AZ+ }-_ h1& ,$t&7r`ʓ9Bv t V Ap /.S* <9@g !۸*Bp]AB '$4 kLU gQ,k! I: mE2 : [X/ 7 z ^Yvcӗ]ո j{!Q\F-FD /'6 !vR@&9,(&4(+71{ilcٶ "[ M % eV:p i V KURdP#%'$9\b tنH S* E+]. lJc.X i]vۅݳn"6 Y IA;Ak& QծEa;%( *rnx[jE M ^V(_ .()$3U6gq Ȧ3ƥza [SI6 cPZ=)1 V9|/W!%a2 چ5] ,\M l /e 3{" p U ԗK7CɝG ht2ezr@,5l|Ӽζz߂zu^(M&8&B 5 !sH y) k V '}4()=  !;7"P| 9Ր  k{ B $ jGaA.\=T-Ob^jbsQrN'> ޫ VI8'],]"%^k m'ۭvO(FG 7{++  !zKMJ T ?  : =+>xٲz ȅ? _!>&!*<#FC#3 #B" TR= |P(ZAp a z ugդ(-# *I5$+,,D;/;0v7v8 2 ثqЮu5FvAt&Mn R#%%' *#x : I2v{mJޱhjk9 ]v3 fW  kB R3C׹5S@ 8$9 ) ZydN%Xk%! z B ~ U)U "#" T^TAڽMXD M$UV= T%4"+?#F, 8O  9:?u08LN % 6 Bhr 6Uj (O=q߄/;HޙY>an $ `6,RIHjwC} 4.H@PӞzKʓ3 jK"c+b++;#] ,m!z#q)N*U$ Fe$&u#b^Dݎ!IlW]N' P@# !1-T<'IT } cO1g7 }D BQj&+ (P2 O8I:;C 1'V:>ބ]) 󡳺YS&q % L&u$^|*)6%}4("+s } p٢ԽDmT 0 )[^zq #&*)*"JpG2ߧVzlu Ib?uo$rB='oUP;wc ]@ E\( $yM'M> [yz,MFخ>]Gu$Q-RE/hA)n @%r1cr d 1 " -"y bƤyqL A'6("xN_1{ )`&*,o+ 'HgS\ҳa٬ڌdfVG%:,&E n*l8  Tx %աdHcrK. | [o/ 8 0s ZJ ~#d#=V(Hv0M!1Jv ]nB zz،wi UBE O(+fE)?xԈQ p" &5-4&p v" p}ҫ_SWn}^W9 0_"x Q*N7)!5w ;:  \ rԓ>ה$_x "Awj )!2 e~Fe) ؛(yݯ 'x=07 D}_/%3a)s'"N)+ 3/ ߛ 9E2sEǨ}/ ?j!K/Ur #J+z&) fHު2ܶ1bw$.1 35+i7*34% Vӏdh@  "ȸU(d'" >OuTa!D04\0q)&$ "!!ni U dX#D#".23*L#!:j? ҺZFzuj#?!]/$w& (  *n V  6f,nhBzcjGvgDQ|7 K>43Z"nWt3}1Td !gg, Pw {(6$OAX*/ {'w\ B.8j 1C @9 ,touZvB U׵vs^ {m >  /)/%%2!6;v: $ EdrHʗ׺Jb%,,_#6vL }EI ~/7]b{E'}-$ F"@%HE+H! /QEj(  +Z8 Ps1@ O v,w U1޵-2A{o 'eM[۹\-srأFS Q'$jKTDt   $PDi!(5P&v!o춾rЊ ZX"-I P1&#-k  =Z8S,% ' I1" /M}` ? 0s+ \ Uc 1""r(]Zgq htd_ 5 ) uZ7OO&q3xn\  %+&`iW /8  -q $D,k~`6((9UQe<%50* /R* m@z'v3/!l@nGv 9q ^%=(  :8(tO&;'#a  qB?e6m 6s "e!tX y !l r7^&v?_!+12><$O*; !SY]Vy JIg,d՛./X2jz"7F/Kj 9S6vA#|:F&"?|B/a@b 2 oE L V0ݚ"S\. !!i+ QTw(M' < v_(xp" ^pLϞPs-}mB ?.(uH/GC~eOku HK^U) |`dpvLVz FNqO! bp' 0@"#"8J$w/|BZ_9Q |j1V"(?-X$.~,o(bd|  YX/ڽ2n7_`\>=s " 3?/ #Y+k67y%/+( 7,'9%m U:93),\fgJ<L'C&Bt . [Y  \_a # %B1 \>K2 ޚ[ &#&> -*K5:xW4h ky/<A H?2v)#uD$K b'-`_'HV$'$n4*0?؄Yc 3Yjbx TzPzwl\Ԝ  3  Mh.%#Տ<i{}!Xݛ"׾&ڿ#I>}zrڂB`x#<b/5Yؠπc NN&+L ['! "lQYVLOS{,jl^[1 0  O 1%(!u64 # 25ۀ2 f. r _IeW$!\ S'['$ ! 5Qxu#֝Z y}Wڗ 1ښ0=5ܶ$>Aa6=D3Y H :(O`<Bk 3 G nht}rSD7 W!m+/D?-K#R(s1)5.!j#٨tNYd jF f#Y xK :q!$v * F)1)-%(u&--9 %ڳgήn"- sg!%') :A6 s<b 1Ff8' D - t#a} J #+/?#; [}1 H84&d'#.+A`m>k eC0WIcr9pۭM 1 ,|g2 < +D=3bU~"1)T 9%:#",0A(? K U1L~tܷӋ'Ii\O#G!dO>F"$ |O>c[ez> kSk ,?yLZ!P5j;I&7(/]!(5# /"E{6w_#,L>#@gvRI|-_X@CoGgN0jw~P8Q  NS>Y&~+e%f<~VRcس c +&$}@ @FC =N.>` 4{&y 6#J   B[a)\uF޶ Z*-t*s I&#.  J39,Fy ך׭ӯzR#<f | :'D2(g9 94؎)ЂV"x>3# L <zu! \;HJNm " kP2'~ ?T8`/25AeK+Ȳ!) &|, )0qZ ")=)"wV M7:{A #9!u Hc Y1*!h ##4'K]~xЊˆ܉eQKO~.M"# .*D/U c(YSxKm T!(? ^k)x H!%&> j[j+BYWL~P A1 ;";܈4{* KdA=jd+0I #- |  -"8,gڝ k(MA2d4@#x "CJZc-}''(+Kʅ#,{] | @ -, B w R^TG* stcQiF  t<sgqjr [ O$ B s %.+kR[Rg%d 9 bii]3OYS\ ! & ?&oE"9O 4 A t*+j=@ qI V i[tߗ :%.N~7m- &%+/w ;Ǻ ȴϏӹ2l; b#pK '@?%H.Hy;s/!''N&_8&x2Wa!`',+ 8bd5 ~ I =7qp=]WGIIBA[["/!+ w z>gB7~LlWOB &~ %vV #Uxo]aJh6]iv~ lcQ 3 _ X!O=D= Xg_*s ziҀXֽ# tx #3H ? @ _E\BXci:{ )[ Tv1|B01on),+p#2: B82$5xS 0 aL!qIZ F C2B??~/ } 7"Db|6q(v Qc~!% $3 eaw~ `Mr֡ m !YX ApC /w#6)omߒ]+0 $f)i+'N] = XX=ځԚ!Uϸ)GȀ' "+F(%%FT!I0 QJF 5lb 5$t{9s&E9B$6E `ive( B$Z0e- QFb xÍm z1- b v1 h2Q S* e^*L()m V%J kI" `F!^ &+5Fԥ>y;p$/34 0)P% b>;Q SDxD?M R=n <g+^ڥMۊ IB0B;'p8f`"BE-9.m$;j-Z BE12 IhD[{ Y t5j # P'L%|p.0~1h 7r>k6umj) E ,eğgP< rIp .  M8J !!oZ"j$n# f'O&](' &$\_O.$ί'"ƋИJB#QMd '#Jm~D _ 1 -j.m7 M ~ <6"+.q$ j IR9s R7QOi1z77aa_<'e2${.1l40+j֢!|܂ 9v$&}&2B0f^?/G\2cB O 1 =/ rem/ N._ +d QG4%CMf/6 gb ' .5r0U!  e GiMw [( " D1  )rk(wm@ؿ[!o5 . mw tH~Q!'M"DU{ ]T   2)3' \x%6*^(ɏ#3]$E0 <tQD,E6cr$$1B8]72"% auEύ 6 ۝{ - `e ~!S>?"S |nuh(|G]fYy-& {<5Ix& 'UW8+xN"JvizD]PZj~_K!!2("Q|\aZ \E |"q[eIZbEL@FX K @7mt^.}c S-*"|1 5  * / 7SlKؖ[  ]AS;|F&-2 ]) " !j h(h /I+L]qXH<;0/=.-+D m,6"mRY _0T;GZ: 7U eģP@k9 Q",H(LR%ޡ& . '~6E+1')3g3 n"]_5;!;Ң,^Ħ hʳڵdE>Kc8  3&l(A' ) F)B!6 b1 b& )Љ v eFcx;ng iךٚ1D= e$pF073)k t* *408?b $aڞtz>H &/"OҾ Ź/* w- a+\2: 1'1;,/38% ]2*n-͌|qŻ؜PjP"@#}+\w! {"U3&Xz sm*.` q;9_rHv$@R@UK`&W+w\R"p>RNo*Ry H=%m@ S+ 0S ZTiCVWB$S6 ~$.j/B!P&{ %+ ],@ՀwmU C)[uV ;&'<{ g O&7 + !ݜ 8,Wz(Ҙ S4"6=3-,&%2_.b+`*Z*2':Ie>\7X i"C%*@*,)l7i ? /ђA]?/)u+v&kJN%-=67,;(+"{)(zp ! iM*8S " @Tw: Z>f ' E+z-) >YDgY-7?/!$-#a"} A7=R}k|2 5IS 84\߲˔Zԏ99z^ I!" f$A&h$:'N0H53k +&&N)ϵ6zS?\ 9p-":t a[Eyōۜ#,⃶$~ '6 8f#GuFoeV:l`{GV$h&e,t+* &AV߂݅ԲF6e)& s$ f7hC"G!OG#?c1G&#e<h LEܰm_>A) !I|W ~ 1' t CY x _ Z =-f,g=Zus5#3 ;l S"Y G783,%h,1D,l)M7.X)i /SA11 .y ݓW0w lFX\2msz n{n>־ܗ6zAPN 8 J0;q;bz+NVU)U C{$а!RD NVK 2 ~ X ;QW82v>$d# ܲۢ;d?6^)dV$p E3$.$K0ɾX4S.{ȨHwm/,T %Z 38 ;3%GU n\vܘDL!#,'3d&<  j޹#) Q~ -L#E>hZC TiUlbn u+ !Us13|i- &Y~j(A1z0B,Y)U 1r0Zهm KQ!sDJ3nt#eN'${L*]\8 W' D0m .6'X$bBU 4n ^0ey,Jvz  nRZ0H@ a=   5FΪ-?'y Y <##3U'J $%+/"*N0&/A@0/8<+01=3#A0U6q3f-E%  ]=K&^`>Lhr A e`# !! $2mkcZp. 3O;3֯? "}i! ߼ՊѬ-gOTV{3V3BFM&(9 7f,"k X.` ( Nl͟5v$ :RO&4Ml# #_Gי ՈF[V, )Zz=@!"<" !(*.% r /4_ڠB%=PO5Zޑq 6 #` F!Ea ?Ց7ڰOta ;1hwG u2 a\ :ܖ\   I%U,T0a8:c-0r#x+r_ٚ`^-c4= dkV]m^qh_zZ :n[&9 5L # drxh /V `ٷՒؓܫ|ّ,=uEDS#], 'yVV ""@$J^4}hԱd9"!!H!NGN:ׯɶ Z3 Z'"R" l'-2'gb8 Շ*s ` 1CF*>o#& ,o <A j] #K_n ! h0YJ#)#U2iKj-Het6Bc i' 1 -6 h$0M&t(:Y0 !5,^>IF9g&Y*pJ.#  ; L /F R7f-c L?F. / MC׶`s=5 * /_KrvD׺{G; ,%h @J%*.u12o+q i 'f&N'u26!a R+'1; "M ,$¡ }W k " u6!r ] 'S{% )*i+$ SRq؎צwSZRRY6ݟ"lyN 2 StV!m?qh8 + G0Q-]96xB'4  pFL hNЭSN߯-DRZ% =#FX _ !`)K! 9 `JPp 6X t($ IC$Oc3p1  6 )V$  E2n'B\ K,hړj7l^hԢ[!*Ae%0%΋7_19 +p"$3ҙx [9 \ - %}-D x$ \ -AIe LF$\PnhYo h$sx^Ty ^ sPaX " 1^1-;*.".;/ٓƤ# қ! E* C4 -N = iB; nL ! on&(N!N Gub6[ WzN܄ F  9B @{q 2`7 4kM0ji_ 9 H s^3n#0E4],{V ~4kَ {uj] 2C#i S  ~a%ًppV>'/'  o>=DUW \ sdseT,3x5^0 ! L2 7  Y &5/$ _r#mpyAk *&82-o,J!L; v:%M̭b؏SZu"O/V,'q"d3T6= 2%t&!{L4 w 7kG؝JZ ]%s  ,dKA".46)/[ h '*%7]٦jse ,m> BC` A <Q#"kF x"m>Ph na'!ؐ 3ߟx0LW |C Zhy}z F'R(@{ YJs v2}a|Oc< 71xԪi w%)\"t  r b*>y :&;  ( E G ߸t/}L86 w8!1 tK:1O%.܏c <` @_4 lM8 #!5\g{/ -kk٢φʹBkޒH& %%V <8d(%$>Q x3UI/N 56 #~a߇a-3 "  3n Mko  !$QT0 [b,Ռwm@=W}i(+&/;,+c5# N` עy e%  B t4IN@M,+ -8٩ ]]  N  &X! H zx*}0zw' %J b  O65V++O_o{n'33QY am 2` i# 44!,Jаl$ gݤ]|KnSr/>"5% ,N sa$3#.^Z߿MO/ mgN&Ɵ??tї7W5 s6#>!8*A1W+-"$  ҁ~!'^ÇBٶhQmL Z a +) |@'V58a3#}#~)+/%FjҺ*XhܶZd[Gh#_081,-|,#)7 CbI`Z#$'*..w)$4d"| e+((\p gZ R am$c.`/>Y%  >Vuv|P"  *d o)ZM8 l(o J7C ܙ3m ,D@\8!1 '# Zݲx(t,FJƒ[֎$\_ 4sQCO.KI eK<?U   ( ),C xr v `ٱM>$dK   m.9mv-H  f0)' x) Lu]WESֻS٭ LO)3r1(@4=PpG( $ $ PGc$)V) %^Jh VbB :0FўȉHIDab 3B?9)[ N/ 'H2 g7qLhն#t޴D h04=H> >,< 6*٢ѯi /#3x+)8<`SJxeMO')"75 Y[HSe/A4Q p 7 $"/3A+׸ ߓ~+U OW\tkÅ4=GE4Jo BSy O܉*p # Hs (<L33 R5, <اP/{0Ke}T Q ,j "Mp2!xM  9U 0. _h xG!E b Rz cq )c Fi(viiO`T h>E<@z9 6,v 6C(BY߱s [/N-E +5 dRc@;~"\"%,}\.A#1&'"dhQ:  f \t h|[58gm=A.ޒݞ{LlI  "%% &S0 iXa`} cYbE5\N1}['}]1.!DyM_6@G6B $=1Q gk!e (h!T2Q q #O S f IA w' Yg#!^ {W  F!܇ׇ͝@.bQ Yt!%Hc!nI>Mag!k" ޻ Y :2I6}f,J"99 kQ%e7"8d*t96YKM +&*pG3 X @1>W;1  p%_45m8* v Vܨ}A #i (?$\΃ Y}3 axH> y\+5v-agq7k9 #dF 3 =tۍ ӍZ:%(.)7 dQ> ,kM0G" kmJf/ 7.(rua "@#X߫7mN ww _2 4 fY hK  ab5!#-s+  W.a4;wA:)׏:@PC*Ѓ՜y''5 Ga7$"$2:927 1')AF"_f*2,;(qG攷-]j̺Gb#ce;9 @Y/ r: _R  /i$.h*q)6#f@N @$cX; =Hx(t"k OI.!("*n$Z c]ks, iϵ3]wb9 4Zn&Ui,y) ?>:k;WX]{ LZ r"wB}iU)L!Rx#Z u' 77I]#+&(e}yAzhr,u { R' @X%&.۰7 mÚ ݁lsffp ٽ)4,e,z299 0 MD4K$ ͺ꾽R c Z(]. ; MBc<* !h irT  3&l:H Tb8'3& { , L ^ ]  ulYWx^MފL $B` \)'  1 gp h9 r&0 &.<gNv.1)zWb)`KވTV #Zu elQLG$~ o" 1,lxPqw- \'z 1Yp`7$ Zde &C^JD("I+6s- e3PCx.8];Nsݼls[ s5F 6+vn#ɵŤ' v],:8# qg)T ~6DZ)|3Z}:s&', &0?)xIsm$%h | ;c2=!Qp> (b $26 ]!" O <$ZiR  !|"U)EE (*,"  bAKd/  Z 3t y 3n ^[ S sطtW5g] 7֬ T" ]9 ӕZ> h #}3H4 >e n D`jL a o" lJ y * H jklu*U>+VM%)r!3) L-,7')`*G'# m JTbT=Ս)upIU ,RQ  3& B 7  =D e Eu'N;y9Eߏ$0:`A.H=(04_ 0,4'5 )  *vDq iW|Xs!S@ ks)#<H7I>4D D"_ o]#W@ sذ Up|0Ѽ  1tFT&]2.w6 1L] 7 +(]4ެF~Ռ  {z&Bm4  +f\B! nK  G$|3M' & CB'l\ dIUۏs6 %* w%q U$bs! AFT%Vt '!?  $  HmlQuf,eOX߹{C%Q.cX>@: )4 \ąqY'(;<@8(t'N",O+l kv}Yhm3xsU/ J $ݾ"Ґ0C YH.$! 5 gw =S&G_x8cvF l)22,dTdi>Fc ,AZ # y ?mcK L+ ! .09.f6(*ۑF 9+NaE 9xEC= 1 'Y\:Fפ:(v+$(l(b$ '%C   sԾ Hyj} C +%%* e7N#Y ^`ZSgqo.źƸCBR5.p'(/l  b@^v+9+o >Beo4e=8%bޚߴs''bJ1B Z%m#܀! yB nZh2dJb&E_o"Fv 8) ׋ P*ZF!s9 l1$,"E16% $ L זyϠ-ŋ#L*(& -1 45'/ e)m&4ރy y6nq\xGUta\ ߍو!EdS + J +->#0Fn,oN@ E/s !BC-].)MڍР <-)5Ǘ#x_jo A*1**;$e)%*#(Y|-B1u0{*_E5lɡ nL  |% &PAz w(} - w O[\7R}  ǖ:.gm b)/)d'+)#V :* c&>+!Bܽ|q r$ qgX`!ف| |1 |E0d #k6 W} fUbv M:D>R  Zgjȉr-ĸO = T ]t(c,23}11/ &y  c6.]PV!ݎ'%ڕ iVv*T !i b#$ tg_ I 7/"&j1z)^ BӹoU_Lq' * Q o  9ZBiS 3 &"!zZ=*ErBzk$FW%E]~; 1ED*0 8$ 8V o@I|wNl JutE ,Vk/#MV Kx!yn%vF]O [0܅!ۣ#0ch 1ӠENcJS9 ^u )aLGޟ̃ `Q8 (Cp mc( w/y36J*k% h_NPHsI J`n0* {~~pX8߮$KD {r#! Y%/w_ W| SUB62aDXY޿&[eف iAmyqlx|:X%\l! #4-)RB_v>v Ƽ+WdQ FT@<p4*E%uyA0.7q5(ޏ:n7Z 7b(/)ߌ? W(k+|"'+R)v!oV J r- ia|)Bt/)naÉA/ !,q7 5 ~ H(QfJI~-Ѹ`(>] 0/[ .< $uH 6W }Yh'h |9/L ZXz'kǒСC ;& 2|4( !%A@#h&0J  ۴4f `J g :*zw u 'N &<73z83- % R &:yi2M  ki 1dms Hw A ?z  s {~/){uJJ=!2S,۱~vݰ"۹ a])U!> Z6kȦ>ߌtjYqV)/*+3&* po6LK$ x֢ڵ(e%"M} y !{ M;@w1Ad A77M |?m xX*I&H|:#!iR'&rݨD1L>{ ko ;yecM$+Z##`R t #q iQ-  kD &  fOZR~EMP8h !g?` < n0$h  [ q ZY & " N!5x" YH?!Jߩ y  i  ){ \f@SJ2l";1q6\_ QXtd@F0 {;N~ح38D_^ UJr-5ތ<5y'#]!R5Ԛd4Nޖ8)(b^,}N.:H^ ] $b9n2*knH @ V05a'1 .@_)|1j;Wv6LOwih *rOC HH&KG6|H-4nf1ش |$Ro*8* ?M˸Tԯߴ̊Z T&556\-D#3..M8<d53<"{~ ӫ|)7 ,u6ki4&[-o)80@{ w 55 C)SK/!* nNiKl  zoi_%߹'Gxԁa.Q +)1-"j/3='|6 ! 0ͨv s:y   3 3 UTcSH#Qb ~U5 : ! oJMgi u9mF'( ./) ` P ^` F{ OZUae"f#M2ܐ?L kxZ "^Nq !Q/|]5A X J ~BO܉q #  Cnp-Bx #xo p, t!9!'g* $&Q5,5) *- bJK|RGb$s0:3lмZqxdB%TC H< F!&oa R _ Iz( |W /&sN$ +l"R]:Ue?SG5b{# (Dٷ|ʸ2M(Yt y+a w/ F2 '4h^O`y # 1!j r% W:)BE <E.&DpZUZܸ+(b D! Q {7h%$[Q/Z6(;S& a $%ޱ߼A&4  b-Gݪ k5 {:VV# ?/% CFtG%H  {"R[ hkK"U,.-t,e*  H |߯ ?J>EV q$ &Iؗ*ؠ Q:N RTM, c*+p;, ʩ{٪jOO,-)^N 9  ,#!sT *| ) npIu0 - K|nX ݛ$a43g # zE޶١9\Jsq9t gSM 8GY-$r!$5 G }fǸU!˱ ޽]G*/;)E Uغbh") zmV0`N i"})W$0r m!aW+:<РF;=Yq/ :eM="9 (-R  glkP#&&= ޏRsV Y;t&9BWGF# gſ5 !(eO g$ & A#LXCJv0u kE)=D  q ; !b J / 8oo8  jN \|XnBN&kɩ%sR4 2%P>=0ֻzRh x1l w)W (xe^o ~ *d% @@  ?L; z5< . 6 z A A ';-  j =d|nbFQiӘ T?d * 37O m p"r#i h ` eE^h#{X$7}yDt; +t p$> F@  )z=}sqc[R x aaj(GSH9 Z%n!I#| ":#<"+P}F|Q p]$ppl7S^)`0b1*jDW cuW; >F H' 6 hv  hD K42;m7$+`| #$!8ۉ;}u"mt= I ͈/|/u n%#R':?A+OXMLP #)-B,hY$A#Iw.f6">E"}VT5k~z1 eH v!  !!4 6Y*ۥ-gE 2D_ Z,4X`Y8۷n|1*B0 D` mU$ &!#t1 $_#zPݙ%$rղ\)gH+z^}IS:ܨ䰂ᲡHόv@1|#D5FUލdw){O9 د v p 1'u >yUk@I'n+v2# i^VM% >~  u? zNfT $ G.M՘Ur^FkQ&B&+$%H]2 $-#"#g]pz6ey r @bE9 ;R5Mjƫҳ]mLh .k"09e5h+<]%Z AۉF.vc A- :;#}*^C5 zKl  >\T^y Af.-2 (1~ߌݤ7~ 3 >jFU'=s"|ZWn/,Zm B B SoՄT%cC' ?.80Z D`cZPxzt  9  5\_,9- r % Z(ʬ2 7&B&weBd"`b 7 &/ ߯eLh Eh <#w'*[ &- 9!Dmf $]= . TQ<Y!624y&.A6*jJoHS 0J'az~$- %yk} 5 w8bySD.- }"uNq ${4o3% mdw ' k /%h 8ޮagچqEyT1w:K]:!u; ~܌."%$"  &5jEН+I\WC9iG/  +gaݪڻv8*K| \ ` Y !]0[,''/w+b>' ߬ O-nT~ ;T tɚ#?S"RS+*6){{.f+y tD t "~SiwLӨqO ] wEN5MIcIj 3 QRz@@weTltdV K ?~[#6p j ޳ ܍۞$|(W߿! so< sܛ MCWՊ;<8{ ,' d fB  d; < j}P9;JiZn1z _QEYܿ4*W%Qd c+ROJDN > [hNC &( s,j ;AF6SS߫35X:(d  O" Q#W#\( ) [-):D!ch.2 :vh#P6%= K6[je֯S,\= ETAhAߺՈ u"sv$Ei)g ^ Kr C1`w 86CN6"E1Rtc[Vvl: ]0! ' 12)& 8YrRJ.\$?O^,> M? ? aRWe )QA  k XA YlQ&kH eInkr| l$!#I,%0"NTʤe2OA4Aw,o G0  (  Z|dxf "8Q" ( R 0 "[$!qJ)&Ewg"K0(t 0w WcW.}  ccR\>QcZUf,JKBJ D97+ p 5 kkR ' $5 3 N- ' 7BrB{'7-)/< 9W]-? ^ף v [p& H(TXy 33mnU''Zy5 8"W*0+0 I0i({f L#<NOIw O`RvJD P}( j 6J5 IrYGFu!&7Bm v% D<s9af*}VT&J_&>] __UX}K# B>G#H!J=  D$F^(:E ^ QeADX,%M 7r.|nRBTww'{WB .D  %= h,)nr6`B m :'f @b blp ;?yjd v?X&hS 7<""# &+# E&{)$[l  , CW|y DܾPJRR g-$3gST+4?'C}5^""'t rؼB5݊o6G l>@<Y [ I z yQGNYh 8:2 ^X%b+W$K#qRz$%'F$R rWM ` Dt#u~dmwt;(0Z'c7_M[T Qx _ҫ ;ؔu,I)׹ Vy , Jpa bIt %$#3+9X\J=s y5>9ixP:]VU'@~I_;P!!>((C)ɩT& b^ q U @Fz Ds \̔>sZ:  le K &-j,'&H) '5 j6c4^I9kB#o 5{a\+ !`jX* '(=$3M4S&n )X~/S&g4;j-)Olq!L+5-yCJ u4tKws +1^#I_i!s%o UUvz S^L5 ( z s&'?8 2$G) H HN *(j>yfH'|R"|2$o>&a}Q?} y/j3J(.(+U΀"K%6ul!F W݊BB>9{p< T#Q'+N+#oesmiBY&#!Jb~D|mہ [g,:/ )|JFz0 wL&m z"` %#)Q(ٜuՀ ӤѾ)0{b, 0@ *u} 'k>L@}H?"*\+۲ N!v_\ٴ+?*f<-WZ#+V(V;Khe w 6Ec3'׫` ʍZ [٬+sb]#$OLB ~ (+ݓ ,݂)62(9%mw\ Ws 72^T.!#!, $-2b3;) &G&f u~i@g40a]wV !V/$9j"14~^j$؞~Dk2U%]@ j$ '  ]DN/=ͤ&#r,Φ-%\ ۀ#.A-` 4u/ Oc%i\M Od Dye $#2 G  fYvg%9R"g  !#!t%׿h\ {> vr }+,4I9raR5jX Q zeO 5 cui" n=! X~m% ]],|dEԡ^ Ǩ ѯ`yHk`& 6'RRNV&0$N)". XWԖ I`,{KN i6P ?Gp|(}4.#- 3,v c$OQKVJwM ڍc{w+Z O7)N#`$7!$2(9@x0״6+L޷'^! ,XmIH g G% x\ l|j/Q7X'j 1/+%]\,"xRS `bwi1 bh ) ']> sr@ >[] %Y3 E[ ] 6 4  a=vŅ,01X2wO$߲۫ &}(&&')_#!)  y {?4lL\   bWt:/Os o +_%^;ISz~k - ;<$j/Ԝ-U,&Gc D>|BCΐz+1#A*I/i6,owD{Ko?G TQ 0d: ' }Y =U l c!!_ d1bkHRn  ( 1 q. _t?Dj" mB KLG D r q(  k fl c V{  k$ DC9 $~)k'hm[ F:i e%U;+9*'$V b!+"hwwkS ne R~ L j Iڥ\7j N i u6?]@A2*zm3Q,nd[ /YdGiOp$u0>)sEJ ޿)ݫ1g4+'ҥ/ڏ>e}*lYi<YS $P~X$p$" *'pdvrA vqR#$;$~ T*P (U]')"*No$T7sk\/͋  ƚ v{ 8mr!!v2~5q-e-=6|/jިfUݤ ^<f@ 75Pc6VIH #,8<Vp[\ > 2?ur< '"  ryt IKdp{ #F)5" %/>W S4}ac-&>jK+:4<0E)5 s  8{ چydEύ(ݨ fp  yjw/t"^ ~s+IpKQ{$,Hg *R "3ug`Ss e1M,,^^&sN"HC/Ճ .PӊEI8\6$o1RI<(^"vbiU3W N alpp y,-  c}uўk%8}q3Pm L&,+9$z,E-Sq= %*0%|?'*k8.n< l|a 1}Ȝ!k: 3hk V 4 XB r o" D*H8 BH3;$MBQv\-$D *ɷ?6w{D#@E&d D.j]1iFnOl&.w#[Jg qL( A $ 3cJF8 R= CXA{# 5EMբ{zzky(3W%]E D!$\;C!7%4s  ~<o P0\fLx=?ok mL >pz$?: M= 4w&$<`\V!z'$G  \lGn  t,cXEdI"l7;<._ `$$)L~zz (2;u(W DS F @hO\GJz#f=n$G@dIyq'250Z '8*6P#A aP)nnh  y k7ihF t J % Vp 1 S  x-m  +4 Z!\G-zV &o2Sp $2;)Pj4Rr@n"lR-T -}=(TSr.W + 8.~$Eq&INTW,M > \R P8`, YY^   r"-)2q.ag :-rJF3|-nsW\C  jl~ sp =O!G e"7Q:(|7bG 9<II ZP* q3D5x6Kd` a  \'ASna2RW,: !l!?Qy x# ,x6 wgeL' ! I"v&"MX ^ ?@ڏ Ύ>"c> c'(G"bޱeٳ֏ #!n%!#]'J)'M |?Q+ӽ w|{#739$$` ?#V |82 ^X]-U@ 2P ;Ct  (r5+G?a:fiڎ@t! $ q Qj ')b!V rL i$PleP0YT \4:MYXIEoG` kp)@'f@ h1G! (2RP&N.Q(&4i(V ; 1"Z q 9.r "Ҵ}PT$NQ*# (!!b@KE ~g~-)=D!&'zV(#N]QvMftxOY9#U!Wk:R5Ibcv"!%j"H04 Agv  h yXQAhiZ 0xQf3=Kzl K  Qd )% Kx+&\tqhOjD _ 0wCoZd{L4AOe x Df:*x58 V^\a 5 U^`Qg /* ` K5< I@Dߟ&q]QV@iJ E#gk"^ p ?G:/. ku)_*MB ˌʘi\W`}-h6/ %V]|~=I^ 74>^6H" NgʁavYT PYcBJ ΎYBBIhr  ; Z ^|>#Q ^ %[!2? <~ASf 0$JLVand5)1K)- fT~!nbXh^ /? 0 ) ;B&s&N`?? o{A/ >uF% %j l0%Uӄ}MJֲ8S^y2 . e :$U| RP'i F;UB .L HO,n g -4fNViW2 4d٨Nߵ(u $8 @5[E F:3ȷ<ϙB&  py@.nY "!"QG ! 4d `}>'j.Kop3A w9p# ` !.*z&YܔכZ_ t  4:u _5K tŊhoS)  L"BK l. BM-Rn#b\C:ۦ v,3+wA0jR#L] " 0?r)6f UkmoW|~v~إ\' 'p jWY/ 46ie S (D$,k-N'o+3W7,z!ܳ!Cr*ݓnܜ W@v Z T@ [ud* ]$E8ji.U _?TY 2 F> ,"-H2F5`C=c>c { ܮ?-((0]4('y8 d!F FڀQ<t Jo  . w ,!{V*c? ;? g߲ v <4Ua "`m m .# us0`4 &lY ];|e0y| cJU6~# +vR#y!///mXD&]ۖ9u-I ۵B(Y2^<ؾ17- Q !A#$ t! K  h#I` Q  D uu, Pk '+c5(!P:!-a_ R%$!'!W} V AZیzATjrX  Ad B mz#\ $1 78J;wߝ] i%4 p) C; *.yKwv'zF>=lW hVq (1Y:on6^!9>ߴX!&x~  rޑ[eI t)5'3pIde# h{.vn1 8z8 6DC[".  ^ J  }Ih&"; t&JJ' q@Y_aӂ e21K=2/+V dqWK xy!1!/?Zp k !DyyzґmҞSgc ]<~v -8G- '$EM 8aZyyN{o t 2n-Oh<- ^|} j!>O[ '06&oRd j  Z Z   TilEW5[j M  zȰE} Js*  v rpku0b k $ :lIzRY? 7  g_ /Bw E 5: |y{a 'l> f( [ $ A   2FkkB*Dx*} >Y Zn%ڛpXX &A -a*#D6P52v 4((#?  +%3ӹBf֊ۤ'j+*c(\. & B 7l%^ ݬ2n os  ! K A^Cf5<bd R;ԜDf [$rHS!m y8}7<dZ[Bd ) sI #GKJ^`$ X ='JV'p%9<< Yg C]8]G 1x}#+ a i  NG_+e[Mo=u&) V>.6(Xgg%+a4m&m r KN$" ]y}&| UV? 7 g vkE| a~/EI`( M !.6+%)< ZG:a7)Iq0@,"P&*$ $ ,J%I X *}+@`? wY@  Vo[ܾ՟$n 1S)33$ZKZ zV m Q 7# MB MgU 8K\*3YM6  9ra;љ2ܺE 5=!]8-#M"@~P  z ۳1t +W|NR +"P)nҐ>\j>})3ow6)k:.L?k_YC %ݖ(TUޜerk@ ZE&J'"\gzT "!6 =4~7xJi? mH (SoO6?" m1x~{v>ip }c` sZ n% $]L j6#Q+Ӣdz A \J,+k0dZ9 cPn@Je^ ,$YN X1'z1[U_Z U{oCiA " / p0W{p hh)۷#o3!T  m xCj0:c)b+cP4_[7B&")K'j   B% '{J 4 ӹxS-ߜk1k&O zZJ 4 ix_6Ec   (r ]xq<9&0 B[ WB[  R ? A6$2B:0wU- &: iu#z P pu]"y $ ٍoD*/b '#>|DO'DJ|/l~   }#a)#GF+  + /9U!04{ݮD .InqCS]ԏ t-=!fUHo @ x^"߲8{2% lR  &r ?!a ZuF uޟ"")&HG1w'8)47&!I Bn b9 xW d(w]%("%!OEB  F E$((o0ܯؗ{q6I! dU 4@'}q A}%j  8#p f!"V CXwPe R_foZ k ~ PN05'jGOi;9{,r kH~[E v()&1 Y 0&އn B% fR=12(Jc}"%c^oGU &NNl# g.+t%Anކ6u FԘ_7^#Zz O f2"bA8 r K,Vr  #&4#= ML0cI.fD%T.x w ~0՜R_4Y6.DLh GRU>4C" 7:#-Qډ߿M@_#0%j B_̜،1S3Da97 "5 m A [EWK3S{g]/XUZxF +  9G$GC ~RXN-فDy4>YBV*:} yd3  1 />= uT3)/cK Pm$6##'% # !A&#  +w,.0&EWuyL7(H Fze] Yc9d&ej K? &&]?Znr^ @D(8 &T * & MkLwޖWVr  9 ^e"sdD Z,X(I j  W v bpLӒY|R O @'._/%,X d u/qN9 \c +$Qq,v/ !#h,} p%މ:2,&/k }& TIo ]kPEKe !{c=b  $a35]ql ݑi̥[ ПICU8uL_I/i =:@!ќ,O24q%K ڮԑm nV! p 4DZn*V/n| 'sY [W8~#HM @UE! +x{QVO,r Q y  -0*=u/6++JO&_  F7H)H=ie[ G!n#`X4ZUI]!J+O+zqp2j5Ld5 B P L܌>m< #`gzjٜ M' E!&,i+) P \ ]bLa tO1NN܆5{Us(  nz a!#:O [|,4./mK?K " o , fY"0RN  i 0ލ' XՏ%,!R5*(F, Ayf n<gS MD%pTCW) = /@ NL(Sii,Ox)0)'iF:PyNX6eMX i܊(z!  Cm Afbv]C* 6 1L`jfq~Jn 3d ^ ZA כ\B x%  w  a+Q,B` G պIf0 PV fn[59jO m+\ #]I5M"|ddWvp !zrZemVM #)0 2x$o6!1I: ]8 զۤ$gQ ҙ[P}  x KEluV zy]+.ߟ#N9~?3Zv|M   4f>] D|hu^J=OAZG%#;  ':" S frz# T x&igH9T<#'),|K'1uy>=1qD* & SsEq% ; BI K];U s ZiC,t$+l54 az Qg o6o! R] JA# eoSKZG} y]}VZ* jb l%gap ~C )4`e N^(m. Y6/.@Vg.u!W1'u s,Nv%s  AF^h *,SPe5$R"YU1%b 2>@K~#!:  zeD ; Ew!C n /tapwUNd 6x٧/;Q5v F}%+yT2();1p( U"""G PKR 1JM sVQA @Wy X] vi}c=t 2!N( qz-&(2F޵߂ s!"S, !WJt]N Y3 V~1ک\ G &;j,Ja">, '337g0܁jFg78 u=C-@7l 2~X h]|hU(a!*~ L+0HV/^cw4kK$$V":+D0 r%zC&Н/$,de]) 2^ke %9 : *(   joMx-$=w(@c O=! BZ8!~[ p޻C+f>'aT 3b-X F{Ҍ7'CW*!bx͓:/2V U cL& Z v:{kar ۬B0 k>LF 0sm8 I# [OxGR@WR%N-PmA?G D[U ` a$/:;&!*j2N- h HC4\&A<W + * 8=@B`$Ud]@-զ-v p+vO )Ex=di-@-u Wg_<)9? 6I+x<-# R@Sۄ"T3C9I I!=c%'): *Q# #^3 }l#%2upG!b ) L~ U_$o$-<0<7es d0F:#w = *+6.v iEU  *H،bXO"B . )D?(&S63R;VgqA+e\9bHY5!!K f~   :r3K %g *_!.\ aE Cbw=]ծܨcRSB'4'Z 3  ( =J  H qn)0M@ dm 6g0 [ rcUz07|NӞd0&BK.VUJ!_cAulxm[G>AĽ +{Y W7}Y&m:>',p%!>1 a/L)%Q(lGeEʥHrнRh,dGDIf!'. -g#((+&E"&q zt a9g֘'y?cU % 8Z ,2 Bqk hlSʠR("92\%FA j$ $U/e"&_('2O F} )&/,'+!(gu ~ # 6UJՐy `! [!. 3g. jO!vyDJ 9MU -1#g1 G|#$= < y hx! p's \sS #. I,߫ރr ^!  vA  F%#/P)) , O:(D1 ["4#g;b)_54_'Qr_:W1JHc g>V2P  )" ' zJ ` NJՄE@&HP !6 oY\Sw <  < i:Gh m\}C0G ` p5i}8ae(3"0  H. 5sW } @| sV-]= 0o BQMpv>[!c3bl0F u%m vfAjOh Zߑ g  `)& Ev&r~,n{% U X_s,lTlBiU$#"5& @"*YNJ6Nx)6E7P<7p">}3 @8* *;G(XZ]g/&2 ')|] si4 w@ ܆2*@ixA @%'2 ' [np#[2], F/H. ldNQ׸Q JWh)ee*&#tnh-.Tݷ 6# [!` ?3r_I W/h 2d0_Xp$J!ܣ& *'2^?)[0B%  hCk0 6 . ~3TE(T!.*NnG .5mn~s& &#FI;qK}y?ޒW)Q1A33zp{mJ  K ;S ] ?q gm % W.@bПhߋfuEqd 0 G! )n $E^%o4:2%$n?ߊ"w9;T jz)),dQ6 7/$he O8 e qd8\.`Eh  8 ~yPqKa%[i7 DILegbZ , f k }&/3L7qsM n`oDW N2rh=N6yT3!_,?( rpT?,,O'z8|Al4 L X;t&y[o Q &7d3x 0Os!J]F / :Ir=tYBv{~0wI7hV4b'&'; q 5grgo `=?Ak݆2JWf,+}  K4Mu & |\  C )oHW *g Z "]@Cc/ 0S)Nbr^u}IZXl nݘn.U+ Tklm Z Ft V %+iq p0G\ .%0nE V0; C#&#W$5?06(>%wS c}4@?g$Y[e?Y#v$6!FH#$%&,٢;#I/xMS$# 5 3 vZ3  = *.SYL 3xy#R,G #a 6cf9aU 8Y .S2N=jW.,P } !>v$b F5"{MZvrhߛf*]>@# iv :QA( k-%$ *',I!2'#?}Sӳ7KE1X &i h JS8 l V h m{ N8 K ($F` d ִT* &"qG .ly[ /g[[$031(" r5 QvGAc] R ;"%r{"W6 I' U D1n K* mV](6yg/[5T""`gzx!p>is`75u kb O&C6+Q') Mm=F6=r(0za<% I k3Uc   ,LKGzw ~r-Mr"{#zl'=j aw#shq<u sy?7G "jJ$uu_3u }@R!7 m8U90 e :EYM ' lb6 zP ބڮ[!{ { HP3*ӿ j m_ RDq0a; z   M "M n@S 1 l:uP~ iQ5Q 7 PB`GmRx@<4pf,>(hZaU~u;2>=J\(c 6' jL1@U s 2d-%){& 7 xa]?p~}vm4,<#= G^k+M0OL <??qdrJ[P]g&(H #  +؂M%1 M%   hs (UbCw .:S&Cz &"\ k2ތ$4cG  ~p%%Gg Eiޠ4g  B1Y t ~O eW+ !1I* l^w+o l4h p q$p XaBPo"Rwa DF߷Il/o)1e&xttm97A'3)%O 8V(C 1`oK(J=ס;;t& `<CsO/S)>~E N՞!:PVT]P! %_!o !b(135# ۷݂  Ve&fwr HJ 2(Hhx~9mWe  =Ac iv%o L_Д?Y& +$) &F]Wlz#v wW s_ }zJ!"(%i/) .^ݜbۗ#șnN*P !%&  $ &S!!' f-RuD *W, " $::s&A>sfJ ukx zPyj :&h>"tN0!Y64$Kc_? . M8 ^1tn"K/M2B* [sj+4޾ !w]  O 4Y4Sz S9 iA`lWD BiڇFyw y7f ~   u:+p S_Pn %$TL K B y a% #+\_M&;``3-, y E4 \D Mc s:{B+Wg%^M{)l 9T5^*6$ s*nz)0v/[%#Yi FC, cw-J,dR%& S T5 _uJU0އ, Ѕ ? ,% շ@.Ho 4 Z< 1L`p[ Wh' E f(XlOyI e" : fUM|HC((o! 51t,dժ(AJDј] ̧J)"d%]|@bAJF}l|{;t a&t"5'}P$X#ֻ'$ " Z<'&\G/+d >j6Ee1.N' mWkxQl:-PӪ J!U"j,sQt5;79-EO(15L+.G֫ Sܙ; A$`49a9n P"b( 4@v%'<-cmJ0^ nG,q  y nV y- ۶ ԟN|s )$OZ+ _ +B| -+΢ 1m7, s Hg JSI/  ko Ka |?#,^I.wc^  ݋ڑK~ BVQ1,=3EN s׈-n<ټ'? D)= 5TJ3;!R%+C \~ؗ"3Pjs;&SyM 2  !{'j;8 O21] 1"-X0 # \xX sy%԰ۖ F  J'uE5)b3E@?Y!&J P + )(*) (d>x  `Yj e% : R8(&kNUDJoQA &EpC Z Q p ݸ•u-#c}5/F 7.2U@ B<-.kR7^!nٻٗA#?E2681  :6-!⌯B퐼ؚj*y7\<+4r; 8r z.e+}w}j'܁ڦ[ 1+Ol (1T 3 T- /=D("(+He6n9 6b޳؅߲s5b{_  Wd bMXnY 9M C"""R{[ '/%\Zy":}3mng Y q}cF30ZAt.b& ! % QZ M޽/E pJL  W9b$- 'Vv5@j ^=+ I$P9 VDF]H+߲ ~c5 d@t{X#lY( | VAaVUt, . O Jq_H_T de p   qe \0 VypH ${TS)1@4*bx tE޸ܗߘ o 1 *,# Q,ٌ*&|@" $ Egl M ! %H9 d!l0 !A"B~E} G4D  ?WEKE~4ߝe}ba^a""p Jtw[c E c n"b uU u ~9vqxl<M  LT E 9&  _ MRxj@68 d }YxE5F`R4$ fq ~ a 9p0C~ ?5M [JLOJsܓUI5op?a$'n/r/f%o _t x>|/@# pߚ N!i&u6(&eu+ .\'*$[ՉLA-=n|HEt h \1s}OQm.hإR8"#>UE68 f#p*v I A 5  F,a8+n C1& m & 'f  9~+ |0 4 ek/H /Vh i lh;!A;5 ݀RS= mU%F Y7A/ GOap D6f2j~ c؆_&(frVQb# (n h߾Y a !)&")3$C -]K"  >.k-3 ! GD h [cD2>Z˗KK[; D { o0 82  >$a.K7 5\>}./X(O#y' Ht"Eq: sR m h_ k'DGF?+|wDF)'k"5d5> I &p k *#9q=v N7#  F| ~| Aq u\H>c0{UHQaqs [&]:[{n R Cz^Z#1C֠ %4؁ 3? F4 M %.q!&] v<cC"~E/5eiq=s 1taxy Za7?o$%2 %" : f vlcr};z_ )>_29"'T.     1]@ H=n lS^sb Op Jݛr?Ȧˎ 0>/)qY121&fBa@$ K"BE&ܖ9AHz #ߟsw't ]# jd ,l?45! ?qJN(C6خ Q(=#g_\=  3ԛ w 3"1#z-q+Y0,SKx_. `OSf8FI A oKgr0=֠(+"Y(X a,޷-CNSr*- %"37(B#p7# -kTkqyU\S * &(ڵf*!7 !\\p[6_:X gZ6QjYK R J` {  wN: $l 4SjB bJqxa 0\6%%Kn pb e2L Xv%. Xo!KDf0]P  # r q' ]C?ك%b5 'S H8}<z1 \ j WbeZ1d6E'W*TQab[B.t!w710FF$4|> !$ 0| 6]-}^Nm!.QB] #) :, >HLi bE@A}x2ܛ._ Wab  " V.7)`8"6&(9"._ٴBղp{pQ̱՚؜3 +K 4 mh o! y5B2YmP c]YN dqKO )J+8MF g$Jj x 9^sr <o'0"h8#ntI8z RU%a"6,DbY۵AU?"xLF2XVt5PߋpuH-19VEMW;As!bBcr1s3i׬Էݩpq ?tG) U  /\* Bi p%OSx#$%2"e' X#68l9)%+/ NG .cJ %_$f&QY8 K9^]gjxi GWH3er u!'E7949ru& 1M,#) +:Rza #j6 !B[  Y(y  fp_ݽ4 +DVeu_/!&Z [p2 ;s '% ).'2A5B$7 )0Qw &n [ '?mw7Ub T 1Es}=UKog"(e)#J*OU|x,Od 2 _j e6*7d2 +SR[-"c 6Hw&[e`m -#t*Tߨ # (eR yKr & ]*;q4@Ne(  ( )8R! m nu3/݂S% V j.%b G2Z4<x&b ̺$4^TOG<C|43`/ f-c.[ beԡbm" B- -$!]4Y +tM~qx,(:8&Dk e<1Ie p_`4(vgK JF Q 2cJ 5D W Cc FAWpAM)#  .+W-#h \ L_ۨM#:HͰFYoE/IA #yv wўzM`x ~a*n!:l C [  d A F; -<"  8%hm'ZL] ,hNJB ax(! bH c~ = -Q u(zxI xTZGm S &!< 06.\CkF 2k\ j x  :{yh([0;(." Bf`'4|lCNE߹W o%O)G4 62_T. Z ;8  *NGKB\rp} { !!Q = g1(&'ua | ӑlJY!n$3 ;axgT a\Ym*&Ee( =z4ސcF؏4[Gi PT1T ^_? "}I Z-, 3?16!ԔTٮryހ{,tW// (b;^! ]% jk X{&V98=q># % ] 05)l_aG^  P rf rI "g   ' k ݡk]Ir KX}2 =Q  MbG$&) =, .&oj(/niY tt~ q%/&]A~#E`A"4k> {  R6 [,x{@{6 G >,\ xY 8 i/oZ ` S}op2 W@xx47+z|ڹ( n } a!4k)%#'d \@$@U,c2dF da{ 0h @/n *` 32ќV1iDl  "jr)I=pN o'Y?`d@\  Qj O9,HM 5W" Mj^ѧh}pS:[) In1 z32y_(b=)B<1{!K%9  Q}V%>|߮S v&`*o v&MDf|FL ziPR&PF' c<`]N C=q!;4 9 $~Bܬ\GTi$} JPT%` RCQDsz<J 1 \ih K 02 -.p$_;P 6T K YmW z`7 et| ;s `5SR-cK& RT,a vp7u     UF XM~j "F=7 2]0`{Zi6lM q-t@;[\ $U+x/dS@u} q\A RnDlG@B g Kc)?j@pd x% $e"  |&D'[=GD4P S  S}~q%f\ h 3ulZ.l" :<Y2!   O <%z7 1 M&Kz %4E-.('?Tm* az5r v=+y]a e  C :*y -r~^a&D"}  w mnu R ^XOXi Z x umD y#n)$?|oV*}  8od+W $~ 4M3P'%7C0+ hCda%Pk&ڤRE'75Zݸ'( nW Nb )b0y*!( f%7  ߙӑ37P: #3 ' Qm {%΀|2MMW0;p]e j~O{ x%'$S( I*C IIn8<e qk ?/&kUG | @DL. 8 w9CYs]q va >N2ZS _ L0x<  1R(~\:t Yf "[x_S]%C @Ua +| S0X`ECo4G,m $!* !-r#4- Y nk v׷yZ\DDac "&8sQvף H"K%Y9c0,vZړۑ1L,= R $mP34- Nc~e96A7K# 9!a+q#*5 yW"Ta< m piҎ-(&b40( ߾R& &4* \  U4c)4&?":zv U" d.pGA 4!s'} t  Rak7 _  GA uw %$ vh;1 <" +T S 6= =jeS ma&RNe, n - 7^=J I=&)ڋ"ڬi RdYncthx/e(8)"F;a)aNF^_XbeIS_* dTnY , 7F, PՌ۱ [b NZ W>r. s| B e @D k  z5G+$P " z@ 4 V 48kT^5D  u*7b<o *D@4 ̨% 77(Dc C5B(a+# K'e!/< 2i*<#:ԾC̶g'YjY $M;!1``b T,?!I!܂ JM- :@ <E [j > Z Z1Qk.Ig9 jh }G% '}  z["!A{ZB}^MmJ ^ `g!$~V Lf Jf W5 "P f '0A x0 q s9 Mfk e V&h  R##C-(DӇ}d/^h 8&A% G# e/I  :"i6 Z:   #*9 '# . CB 8"dIrwB3nB7- Vao .!cM@ sN @hT("wZs܎Z  ceTnאܳ fM#%#F l-v>:VV: )"'EE) tՀ&%B-f%Q(?0 # Q-B/%`Ic@kS(T7= kZao_ qV^q(vG$A0"f+0tt va/x lP Ozx=;Z7<1U:x!Q~ &L4V20"{  * >Jr"Lq ޸Dق {E)..[%_G,_ ܫA#6Te !K !O*ܽZa+?m#H,-)v'!;0 T4 q ?GbT"F;, cjC^SQ([&# #B $q{  ?=O)=l_󹸚²ۤ |c 8'04#o;#V8V'Ge.n}笾 L`8_ v K"kxv9,!3"/ (VҗWB YH υ*ۗT #(&!rN) E G . s- t:"J؅JT/|.-$b,z)E~= > "q*rmO/:Nz8r x mu ' b ;p  =j'v4J  Q n,; EI H u A!X%%Sl=̭, R C{K m({4  e~ t  K) B'N+7nc.&V& SE =  .d3-_[wdBf@(_= 9k]$&IC$_vB2q H66'I C1 xnJ q'zyR,]B,:141." j"#Aϙݲc[ n`-v| g/ tyY p$}~& b}Mf3xGl5 K 9;G @Pl\Np-An0-Y RwB+J-4idt +9h!"@&*K~. gO t l V@s3ֱ1̾ A =87 pP*q `,j u3؎х+PTj-E   gtB-pY #$=FO:< @   ] !"/[pY "  .qG !I h(a)aqbw:ppN$" cCd ndv> tS, O  / k, x' tu)L KF@O ^'Nq_? J:f 4X!T $\d Cr'[ݕӚ9& +!)2z7Pj(u (i <:  mI{)ewi-m( eO8tJ9(8 u@=y)'F '_2P "UYs0&v5+.89-O=a41D}f 3z[Mz  Ux -tW6Xl 5!##m T7 ]  q }|7 nuk`-' w̋^!v N C  ) 4s ~%^|.1 n,m + I ]8")VulE߷/(-m"sGYc &-8tyV"; [s 7yC 7sJS;}\ OnMe\,* Ui9D.T\h!5AZ w w%(IڎDI K Y}O{/H XX/ %$ n WIrA5 f-uR&m Qq [ |\ M  x xOs>d 4 ,K0C`ڇըUSa7*s/# A WQ&L2L#9ԭp+N<Ɋv)1(wL#J %hʿ zye q OP~iRhyz*e\oʺK`"jIh/: 3 #- *1-+#g߶^ǃ[}AA7} ktAc;_Qa[MV6{f W E' x8Pt  _ cV VPa@ cZ-Z1 4!w7;0z !o T]۸fSd$'fmb [&Gu$F ! | &R ( 49dԧEh M)4emx !1r', /a'G[%)i~C-E٦Ub(43h#4 TCL {Yq"F?5ݎ/dЏPbnOSzDk#WmI 7u nό үG;XhTJ`N$O B9pp 1  GC & Pl A"o{aPo <=H%a$:5gԷtSl< C +#Q# /(t0 2$cn(2o))(Vp6 ̐TIt Wz.u  Q[[貼-Іzl7 e%I < +#0^8 %?)0&W S%}j_B4& #6 ` %d $ >C' _1I. ۜJ{8ڂ +6!k ]  &7 !%DAcm R _ %iqJ^\cX3'!vd$f*'cή{0Tk's* Mv " q΋U; T.kW*{d0a 3%w ) 3VH'o`2! !& ht@sR IFNޔZy(sh', :g; :r /(֮ l۾` )?Q5i*T!bQGx1iw%" 6F6%/1+` +",#*J@Ty %LE"_  @'"? 1#sh7SP$!$ #+]L >etk=Rf^Cƭ'ҩ*T& $g*P;c&Y^;V &:ai $(-{'y SlrӿжٓV+x2dI`Eu#|!ܣ Mg &9IDMXY  w[ U%ԐnZ #$3tpaNmmM 1?m { 46#* id)Qn   RI .|21 o# gY#uA_]b8ўNl`- x1n6&+}  G8!T4cJ1.PxGr{ {SW e p'@ U, "NNOx 1} / Wc = #$0H8/6C#^ T!  ": ^ ˑܹHR _ H f#$#}#uR$ w ze  } @ŠO=r A[` (X &g| + A553_\ߜl F# -%!0Cb Dx ;|ۉݛp!xI 6|l ,'y1tj.ߞt'}!Ae.AQC]  +V O/= ahYhk2'CN-7xGDm*l5\s d 8i 1%'' [ \[N2ec8 [A1 $ iS~/ ~V01lh V ~ #]P-/Fܰz$bfa6>#q",. SL<1-^H("r  ѧ8lII7 a7oF=#  r,%R0CH }=$`aCU5 m)0ހ@R S$i/G+g I a6ہ *[7l/r,||Qk,- 44Dk k ti dۛGG2^1H<*u  q!O G۽G O$Co; k4 #! u$K1L'7o[lChb= ;%fU %XABB QCTEn e xD3c k 1z $A_/+.K#!}r;HP#BvIoDa@ h!@HZdz AD  yD cYO-&  /Laxܨع DZ  rO r^ c  IU G,.d='" - oBY$Vk Qy3  N! 4]*;\" ViӾ^ U^ 8 ! ]# = .x߮6 $X0"1/=SIy - c\ Br vb[,be}ODKseK &՟ ۄ G3  R " P&~,!:- DgRnnX0sN~< Gv ? l0:\({xh D 5X<S mG!by `=F?8b'fCR V#>}9pd E | iT" R F*4J=+WpmnTUI 'y%}qM+w} @:?71֕ ӵ2a`  '  A COJN:~jy#  (c Ai^ f{ y :"/ i߅g}  XaT Y& m u 1 { ZF zTE.d'fݣM!] kteHl$;k T^lY  G 2 J#%%O_y8DY ;Z *7$;BV3?"+[.@:K Vt&M:%: l 1 Qc( =+D,bp^dQM 0K5#(#$ULu"$-M 2]Z OޤzF>RgM\+/JB%,q%K(C߆x} ;z "X$u/OJjY  &^u3 I.P?-6rMv& ) /nbkm" <c; v8Zw ~^ t#Z+J >Z Oa 9iVDF >Kr  1YwY[@4 <@k,B6Wھ_3%*$jxMcq uoe [Dm)5(a| )+.)!FPO4 H6 ^=(q0+(PӛbR{Z_BN&FxM]?7##J=/j^yt?$ _j+~  wy  9Z%3,Qߐ  R Uu! X"+ .i +`cjp.kh?Nr$$#/'MAݚRR,uiy]nv  P| UQGCccF  .ha$g&H&֙%%S[BVN Jl4l2Sl/kmX &t&2?w- |}R) ;>be/ 'J6ZGZ] &&% [ BF5hZ\)~2$ yr* '?f+ T7۝NetLz<,'h.߈l޼  `@Gi#j+U Y+v[,-?/4f,u{)Չܢ6 v+ 8e ) !s%jP~y 2 /|$]v6uL b6 -"Y W 5> y2I#4Qo}nلS !-V 0 K/E=`#= m )٧zxC]B s WkUؗkgmc O n=.,d zM۞x~ (\t ժE׊9g *M.-h2 3Y K%&D g)Y}9{lB)|1H6)%0! Y6$$V"齷樼Tm jd= E J?J  M+2מ-sKW߇ m'W  k p lW+fc( ^-H ;v5(B DysNEKZ( @_y!X!*wpX!7<\tJ# !`q R2=kS"m`P za) ??1A vnG" c7 _N)c-<&9 @  #_ tPT:b* 'B^dFq # s0Gi0<  8= M!B rG٠ n? c/)*,%UTE &q4 ;9S ykspq|'C)t/ 1iwT^? /:$HV]=-7r3$@Zl i`]r%Z":Kr3D8 e:sh K [ *5[ eu GM' EwW* L/p%  / [-;4Uq [iejHF} XliWW%vY$7  " n uXHx!JmZ tGX 4  jl҃6һ_~QuHi <<hB{b$)" ` V+Fon y= 5gf;Ie% D(##`'D+Ij ; ( "[$n ;K NfoUx݌;0 D Y',*G"_qEJ%ZDSsR)l'A !6 X0TSR >d? i F5Sa  < y]+. +_ mJ6I #N M-L@u,0 /5A|-m krqD.N A Olj^NӫDWw<.[ A=h 0R&:O{VL2Bq] zO Xj u*p' }N1c T @- Lh[%00(x GiNUc؋e;%, (C b.:9-U V $dB#?# ܫ  N8Y (f> 8> %<L!S 8j`G Ԍɸ ro''o+r,Jn@ 6tbE n; N } W}E] ]  = VFM Lfg  $_ 7} HO#ۍ q = Iݷ3\ su)lfX (  a S {n )9,0+/ۇܯ5g Q ,_8 /fC 1܏N$ !j %{.& ۮ#%ـ, qM /*Y$ =+: !KpUI& " [#} 23 E!)#V  ; trn.Ϗ xDR mB4F__$e6k+`W ~*x2,$ ,G-E5}=,KAuMl $` Hv#yF?g&  Y sEP3w}.E o sv H:=o H < xgu%& h p$=^" Oe#ix7 {&  #ԔJ$ >!d!$$X! @#aS 0 V<  [#e)m #|W p58KU ,Su9&ES-\/6T/YI)*|!|P#gܫԾ%=ϸ vK' 7) 216?%! N" !C `/lA*R O6@09ewNL '!Q2;Sii]X79 FxXn N fw[DD;ufo '{t %   _M  DN% i 'F \  E z%A  TG#5m2{ x6 H(v 6 w pT ݏ)(};K4K\lEz) /l1829#Z0xA˃ࣰ$yf1P^@)4{0 (M bR-Ԁ1& 7y@35v%Fs h JfzJ;q!hFRx_^1O1I^/.R < ?<rd# %W+ C.Z9Ho ; 3 ^J 9 |s e2u oG ~ !f @$P(F$5g"]Wn 6V0A*F(%/ %Ԕ\ B r .s"+`< ($u u__Ti,:PXnt~Sw  J $Q ;pLL c)sZ6 1G& ;:maW~3 kWw b FErlEf_i fkq7KGX 8 !'h,/_|_g *OiNj PV }%'3\g01F2>+#-B1b! d i !(J4`;p> N.+ "=Gy۝$ " Bs ( yx")B݃́1b6 1 "o9%4 cO2VHU1խ I rzZ    M_"X&    S~iWbބ @暽C % *&<:!d,3V A1(i s; ,)~;Fsb$#X \H rc2-'">Yh k`% _-}ZkF0C;n^}Z:  Kx]rl!$ Oqljs f|X sjVU_ x" ]Qn0$e[$J(D nO!.r' aiGLI4( T -x 06\*  Kx N q )#1Ga D <}=]=v .4 @09*/ ,, #S*  Mi\^opKtD#d  P |08>H.,Ckq<(3 /drY!'lF/61P+c~&! N67 @[[݀lܤԭc|i H!S$$*&G60 [Q7rj{lGx% t#1v% O > ]D 7 ~30t=E$ L$Uh,v* =gsU~ER<M? \r +M_8  <%  -{SF}  s$&p g  t q9L #1-2q(m LUiIYOKTZ Ce Vso + S"EO:`6'u\T29|+;  ag#r TbE5ixK Q,? ,* Y!  ^Q[ h ?zg/v5l z`<&BW%E0T pB $,1 (1 ^) ӻ?,XE\v '$e&5wLZ? 4- E-*`mTr @TV !f#t  1$mvۆ1 v =C#-J" 0,0: l 2~wJ ~% h0,8x`8/n1   } Z;RAP pp*b 08[ S-c5M4 X4&J/5;gaU) c jB(!2"> r+<31:.h [%$cW uC^6~*$#ܡB X )\4$ FR8X  #^(  5HuR _ dA/4YM ': 6 ܆cԕ.] )21G=#$P"h:D nw-0u U '?bqo v7 <M< =T4V Dߖm WAڝhs G$;? k3/`I{ #tZ ! K䯷:WNVJ >-!t-#~G ehy%" R^.eg\e,;]R  rI'C83[|/ 8##XX~ {&iNK+ ,@qA @[W׸Up"3q0@3SJ"<o ~ \ m{!O]Ibh5R$ "#UewUC8h]\ ~ ]V@ V!}g  FL+" _ Km!!R2"Q{ :#24y+d nNMy 7v ) 3 i*Ud/1n% f cdf$C !l \8ڽ l 6u' R 2v5i+P~# "IiHf(A Q f   2LxfY  q k &}^p @!q-q^ 9  vC:Hz`99 )$ 1E)V 8-$ۋ v C _6 ! / fxO >U I;9 7Fi RZ 4w u S Q!EQ;+]c "u  pl BM+  $_dO$Ju5Ivhjz0%t9  /o=fhuU,63`"D| 'W؂@I9 ֤ 1U[ x!u(Y&1 } =f #e" 9Lb;{6>}m*S xNb!h+&^+|Guy|YU - ,ah5:+hdoC $}{ jfPM!n ktr 0 }-6f<A P; Q N !~S[;W_44e4FDrF;D V1PC^]Ժ% x ]V2n;wL+efGb)M v"Vi a"EN*p#/l}M{R$.h#u7  So%^%6 N G t $pHp TCJ %t u "89~+ Pk?m6ulŨ>ԑ ->O#- ~T1PJŚč54/$&m!I*5aY>93j!E  c Em Rx^Q  eF}z6 P0",AfEK2ay v + x ` ` Q O{-30P_rj |"W !~:*W8֙8 7 5;* $,#<{YDdR#0C( Dm t#M h = D P jpZM ;n &u  /w` Y7jc ,z_{ cW qI[MYV0Tm7wqbanh %e IonjY % 3KvufZ > "t:pr!4s'1{ +m%v c Y>=v h  [etQDtf, 1u@ݹ[0 n$=$?;"jEgd&#-A F0( J2jh14p ; M+X  i  =f .X8$%η ˇLډ|6 -'_"'k$jv x &v SפӴDž·$%DV*; -8%'Uol&  +_#>_S3c qpps 1 4w.e&'b($SP7WmSb<>݂M :r /3 K1"av;\a9#)B)H=$#Ѽ}cL4`Ak<ITvE K 6; n[% X`3]TMG __LkXf Ռ Y{yozR>'8*"_   '1$f7GHs ] sw2\< 6bYq8٭Q$ H_ R% zs &z X9x)3`)W% ˦ o1`T>*UFE ukB Av zR[C8} /7`LKn*p CF0!}.(;B .*~ 1 [YM#  / pVa+ٛhXp 0R oz N1,h"2=-X 'xar-.Tpڪ(#C#!O / a!7 4 D rd"0SLMEl / :G~i% \ ֨?jHOW91 _ qL J oڈ+٢ g$#8\-c,~ I jB0 Kgg9#< \)7v,j gAOMTo H@ V e i, U9byx*32@v H1 , X445$;%  e SQiN3keX&mO  >_,`U>4A%8!J"o 4t @ IO "FZ7e!ӓJ{ΩÑV0& [m$Gd5']7sU/5 4 (tm$gDWAnBQ[6[Hy;{ݾ6!5 m}" U(Y= 4 V!-d)[!0} Wpx_3hO/ ^ n> {^"6 `( G jC m4~# 1CT{vO hZ`W V/2r'''EB\(r1k1 y3M:G+"+L=3)"V;-i{!=M ~]>I=ZE\G G;1kH}"T9V&m9Uj a  <Ql ۵zCa8 .; C @K|@ L4 } I MDv=0 lP~,%A d aw4 uvmi' b e#G }RyJߊNU=Zu*I = v&v 07)cb\:O%! "ov# @'PO%'ZN$29 w3fa -c3Z <2it~tfW 0&5*& uq%pB(($܄  !|A+@?,lѪDK % +x[|{ޙ|A "mYV#*0/%#"'GX g l+'d,|#m!sd m t a 29\wUw W8"v 5"+cHy>n-E]2Y Ni6x"EF>}S mD l/k)'rhH  X& (3^([ "Y[w >"GE `  4L865A=$[GLgKS+q1,"us}ggcs_&b"4df24!:' D5i8%"o-v*K>J: Of߫+C 7I ^[= s F-Aؐ^?. F;[_- 2 %V)~60 ,Diuq%  Q: %  _  o@@sP |H j@ j aP ?fk}!`% H$/I!{{% yo ?cu[ ,m* Q; 5  HGk=O l*,2bVv!Wuo ' # &8,0w w(iՀD c "L3j+O LM. 0M=<(^ T5 vb EDPXObmx_KL_oH  ] "  C %u!{  B !S "f; AQWj ?݈W4;0`#6Fa [ |8$7v&! Z@7?AO _\a\/1 Hi3  ^w^wUcgo ejH& Tky/ d#0+a#-$mE YV6 ? vB 2D)>  "@y 6W+'=,K*(>$ Tv|ީzZ$qo(F1q3M&eCI+U-#"/֑NՄމ M #Lk$ q ( X<++QR$Em E^n4 }\Y%. {.I(  ' )ܻ=D p_ *k. k g^! E ",O+7[ֹ;5=@ fOE<!T"  aw{[b[Hb h&OeM? +\v9t; 2 j1"d=. o aF BF'lM G @ ;!`i;  s܀]pxRYiލfP7I&Yv*%m$='-v*_ 9 y Z1z w - IQ{El? &OAE ` L,w|_9!%!G )- 4 KOZY4ݼ~ w 54|M | :Kؼ : b   rXj { ^ $\}k:2gֺl'ތ |TE~Oez.+uiV=(Hr| O 6_J ^  P n A_) $ 1hr*+:\   [ Z!{eߴMS]L   fB;yloX !'\ #Exn [^D\zt .[_4ix(Bw=(>=\AL=9 t q#d~  Mt c OUH3A=9w8m5 v V.^ u~Tz[{\:aݙ߶C8+-p!)x53*3 8\7دԧ}L?,a0{{)""ԷDܼ! Vh/|*,*."&osq Oɓ*J 2\{ 6 I zEk ~  V 8c1C {z }S + #ٺ"E9b ` *ch9 $zb1sa,;6޷q ;q-] , z""_+~M( u5C8o gxq`OC) 'U  %# Pvl%\ &f! `{cJ`]ɚׯ؆0:/t)b r: 9 _ j>u i$ߟJ9 ) X(Q (oe@N۵nf eBF   DE/  #r̙MSb{,$WT,T(%tl t V~ #"V^#`^rc2EK6O.o nE!*"'L m!+ ce~qFX $74lR0mq4"dM-Lw48g<1N # 8D<ۡ"}pNs Ut!b2gxG/ v!saI ,!Rt nb9"T^H MmVv 6:A wYP6:ݯAЬZ C:l @B6I&ZCA_(x[n0Ki'` c uݪȚ_U!*gx]%IjB s7 /U 4 #i[z; lJ$Z53X#6U;+ k+HMm  %9 c[B  ZV?4{nf <Q( ;I G(#*d NW$ pbr +k'R# &a#$ >\ s;J_ %:F 3Vd | %" = b$J.C)$xUJIxc=tDd QdN"\f&dn@= &y?JS2 +~= < 0 4}?RfPk(7'~p~"9+&5EL5ݻP`C[$ Z2U&D"% XLuE $~'P*|4 %x]|*<[~Y 'f~۬$Fk t oZk Jg O%%!iwi$?dmB$HU n  rU]%"/D' k T5H+^Vf E}NQ| ~4/nn 8i a3Pe1 `&`7 )2n#$.#p:;Sf%4ܚߋsh  QUlW0' M8|si|s ` y'f2Y^ 38,E/'SšJE &ލ . P W3/   !^QT`d$ Y + xm \v D 'T d#w#;ue vK 6e*Z(~( J3Mfav" w32wKqBF] aV}XQxc  Fj h _ o.j rC(LG:) Go # F D $%8ol _g0Eu8scn`=d 3&  v' C 9N3&;5~ yb e Z;Kz C & ~nw^?; b L0 =1  sMq y = ?c ,  ,%!{3oD t :  +#mV ~Xߴ/G  % uQi}'R/n*s3 (p Wi Bg=ha?={:4C&t [.( 1 .#m%e. ^  ('!DIkSGDl)2.$MBT(/!3%#pΖ[۩\ 6( J 5V'^$%'.bN(P⾭  u # <X4` i pA~{SP 2Kl, h.,'q'ZXOvzPdV `u8#G$@#\, O)wt9~ /ZH  Q (.a8!w =k. = >cy1P=h&/+vDX 2$9 mH L* d /8 !4lL[Nx|2T" /, ")߅!cSE = cٟ x'%. )}+% WxDs7   {80-5(4r2  k ktvclٙ 2! Aj0m%Ы 'RCVhBO -VB[Ga@3,"/-Y/X  ?tzsS3.)P , "@ f#4x 5  +8][k:A޲z%" G ~:1_/ C!Z(08Z1=729C;\i Jh "}3x_ DE!3 Q_ 7} P g  wjld_n] w .ET^ < ,R  ntl># L` ~= +zx3| ) zFOQ^;w U&@ i%& CdRq]~:=_".< eDm fo!OzNGcU+?"Q>|X%9GC30TB7LW/* jn&8' |Pk M I9IzR"b6w}d5wTK=F;"jY&Ow( ' ;qRN+3b(dJ߼ ؀ӄX;7   ` ?b1 a[sz,"$&* DX/tS$.N8X D6K(F v3n zn0uE m'z.44.!:"*A": *$T ues;GO_   W[ b\  {(b=Ut>%)+bp/& N5

rX -+,c Z (tn9*#)E*j  =fz)ӱPp *% 0 u-u nd( vIx/1J:dDfOIzEoh}@D4rg T  5 Jp+jv>Z# SBw Eם=/>66:N{@z n#ܜ$~!L<xDcw" X =g 8tXv&. m)QBi~k!:FvLn&EfaR E@( r$Vc)C|! 7P/jKޥWwժk>ZU#'s!$Wu>*i .4 H)* `] b,i_+{XOC9 yn'.*t,,[R@EZ9׬/U]S>>ߪ;.e]6 9m!~8=FA0 2;\b -hH0/>l%Ic D)|.&?XC'Rfnz >$Y_L5MQ &o_ -jO o?xC@B S U Z`ue  |  ܹjpG9U Q9.% &8+9| yr{:h hb^ׂYzHE.e {${Hܺ ߁ob) <o y qdZ K8:= f y nI Cj UG  eYo8 |Kr&f2aH+IB @. %4ۊBcXT$5 6qA hVV u=aP,{>H 3g az'')^D7 h# u^g OI  B"U  tSYVO  G;Ca 7|S()IgO1ߦy%״ *4: 4"**-&AV^o lTm ' uo b!ٓ!PQ3 dr(w4ْ<L8g* *)x dX 0y)c\+&K, 3 /4H 49K2@G/RksVb.$168 50'70) %U[5Y >< <*D5W;:?JX&ql@%8k 6"#i ?Sw "w [0D V eto*   Po #rfXTڴxi q\j ևٰ'[" i .Ngtުٴ Jm"na : XGmsM&!-OL  k l/H]Pݳ 7J.\ 7  c\CzI#wj߅U  6 'unP  Y)H1,t  8;+W  K !&MUɺ<SVU  U-126L ,*D=YC!=я% "&;b G \04SrljY U vi8 L<U >' ?\)0' N6I^ٹj46-z.< M ]HdxJF Lv%& GNZ;@_C6qfI E K yP ޏ |/oq2 v ޱ@-Bd  b >OCn  w n<8 hK  1k@[+>* E  P9ds@}}X{   2Y K F%r)A.|+lA|zC^c pY7Q2[ ~GdcRא* <pmEZ8,N) - >< [Kf  D, M =q0P)WRe HYVY7d  e   1"/+ ,L' L&ߊА4lj{,z#7=;31&Yo7`+'& m8 X!z r] T,f~@ݨ]غ*]~&5(n$ e62;fI\  .4F82@ql;E ZS  NHF" DHmNs d 45w$[ b " La e  @9d#7yfU hJ+e ] O @  : # Ricn wF [oGCO t "[;),M$%uP `Ioc&gF /,J/ U2/ ߷Ý@ 03B \+P&-1u 0%Bw7#oR##92PXV^ X"Ggh"x# 4 L0nT}EK  q+W'd ' }d2|ه7 o  P <&s~/\~p6 p ]7 DM i C 8@m U6`,fH MOi  gRn))jK$o4 g5y ۚ*|NE$F$s{YkAw gA ` w  GRykJ!O $88nVn@K8GLؚpw9 2VqA3!;+)# z _,%  (B$ -# m; `8="8h9 ^ D Y HeP F} 2M 9;_խ. J (q,%MT*UU$ Vx3U& k   5L#'*O-(8p )ܰƝE`, ?O `<2p}˽k%s϶c׆@n " ,( q>~`_&(WK $C )g S;RC۵6)%  x >vb 2r\ Czbret U) L('M<- ^\mN}TK{ X#,85p"+!U  s%] r2 x ( U8C$* ]4 l f|KgR )SO}]cP - 0=,)o %(TSd>S 4q>) 1ETSb!fp^?!UkLn# .\  TU^Q^ D$8Gq '4 X9Jxz*2 I<F@%kPp\hf". h H qU8&t7'K{#o 9" K  f l͵6۹فFr&*'\!f =v݉! CD- ,0z ]2#>q  7NQ $} m,(>&p4$ !^'& $ nfǭ~^p, < VD&R\3Gm% (`M I!0$ )%b bQ"~5Z(?,f<ꟽEs; N4 !#2N'(tWTlT K &q݊"!+6 5- ^1=Ubr ` N ' ?^5"_mSݲۖ Q u+~-AK( &n( gY} ) <2a3 X\ 9R*3* 6 X ^4}! wt 1V< Ubrl { H w( f'| ޤ}H8B = mw VnG  a mpoEvs4 a.,R\ ^ G `ףjNeݿ֍MٚӀˌ63 6. c' ^:ܠ*өJ [d 4 Rn q 0(d!B_BNHncT2 ~ } O˄ӧ|hX9 /h ~7$G^qm. J ~3eڊSx vw,7!" PvzLU C@q$]!"&.a/)Bb,{ RRU] $7 {U _6SlKeq >/3"C.y]D Z{Ugq >&`c!gIk@S(*  T G 1 bP6W{x/6k GS   d&6 _v]JbEu!UC s!p m) 6fBYba2_ Yc(2H  YC #]_vG  .(o\)} f50p?*U'-ab%W S-n~g#Z`pNU0O > !x&=W."mjk ?eF) w}gwxrh  %H NE5Y Q E"n <  NgՉy6z k) ajD cJ,K#,.,7 1N c_z4Gd0, + P %o i:p܌An ` mz1R"S.>H@T;BN0 Y%j~N+A  G Ti=/- ! {#)M  ( J!<']0 L{?Y r@q Z+:j!7zIn\ &,+'?*K6k\l=j!3x$ڟ8  XDtS (Wd( (g Z` @:3DPD2p  } Lci:S .%H' )  UHZN FJPS+_ . * Zd W0<{_4kX_ N+'UH"%&#= '7 u#"]E&" 2"`^g}pR+$I2{cEv;*7@t_! R' 8 'ڑ [ݧ \62 N'mTvm 6HHG7%@wJE L%#G% 9y6+ a 0j) I o?]`/>  ar QA"B 0]*f("" aF  u&2J\=xf! ] MD=   .o9VOv9E8NifF$K(UR7L gl LAH>F+"! 4~DdN.@9" ] )R;3E c1> .:0f7)  ޣ 4G (= } vXh=v8۩,Y%b T-~8>_;/Y1ea?T,Wd^)  aZw\&i :$C#ij ^tc -f[ X# i #Uߺ=[U[DZ/:o1 !p`wEuyU\n{, I  ,X"G2!0z qt d3^ L 2m<:"ԩ#o  U#!Nk#3u"{p5^  `Cx' ` /C[&XIK~I;!O{ x ^]y_1 n A F^c  FVJ OB   )i-2r,`(u= -##N;f!w ,SA?3&) Q ?hZ^;.6&z &'z%#%1)l-ؒN!A b"\G LZz;eMdp 'K56u)u| ~(1BC f, &pn| 9 \cIk]mNHzo "R((}' 6?&IS #8i  id$ h JB_ӫN@ <% :'"&7(q:!>x 0,hWzֵؿg?  9 <o !F'| v+#)m- &MUcu KvU/ړݛ ?  d   cO V4 |M *iVnW  ,A}"S *YO#  & `*JE:' 1Z& F.9!,.S{  Z eJ(h@%< ^ l h:KWE (&,>/iZ$<f{A=pϳ=Gd Vi !'G0 5M*(?& PG %wEs$ /[ BI66tN  ivu՝ s C- @c ) h pKl'M P `=Hkڛݫ qY T.eUC;  %A pM6e `Q7O !pH C1Tpm  txTS+%:qTkIOG>z+ oEF%.pp,!eP $aT-ӵރЎB\< [K04O.S& ,3F0 Hg8b $ , mht=M~ g|N<g  zs A t n[v  B'^W2$B<2oF1l ;V3>UX؍{a!j6#Af'N%%Y fZbtr%/^&Ro  E: Px. q sߚ 8)6 }+6 )4e/U(M+` Oo[s#')q$^ ?Idު?VC *F&t ;A-A6[U" }U |"S! 1dvrN!,&W@!# ?2R<5n./#Bj t* ''G T^qn I >ӣLW XQ #Ue475ٔ*$!ȒIMp &lL6k p&2xsP e !% #Yk_B zޱ89N u &Q!S"Le F@a  U Y mC+~? ! ^ ^s)B4iDwW, {$-" ,yhOKU-N0J $=BMyA G3ڄޟs$&;5|  "6q%l 1U  il%xix ٢w1# G'9X:6|<\.\`l-*_.e&)pNW[}A*5/,h ֌ o$N"  . ' x $/5 ՓӀI T x GmD$HpQ% >  u Y (" }Wq[ݝs)*]_us fj%}0Z-!b b PMGIm 33K r)v0׸1Z $0gSK < QWf Wq%iBHQv7dcWU ǝӻ"wC;BD ^]jK $O KFomhE ~ jMlBe+R 2A F uKA6ڼ 1 ]U)x4/gR/,=/'B${} " ` (*A #X E N .&O1gdUݡs0bH#26j0Z zLtаZ1<(p n^uU0/'7( }q$ : DL/ 3F8(8 +q%0 ,`*3f  !3} A ܚq@Tfs= 6&X$&sxL  ,#)W% .LD pKtjݑ&s\܂C 83 gqJnGU +M   - 1p[&g((Jg4cl ?Q| ;k-!1 AS F3fFvdo !#L,f/~M !| G d:$kuk -hr8&D[ML92 ^`$Rp  |S ]no$,'k8ޮ>w\DQdgJ$7 ncDՐyG1~{BC 1  0%7D%$q\Oݹ?qY. WCFDZK"2I q-"Z.(>y 1K K_I!&"Efd05 y| PR (kfP4alf"K kP ]8Ip i7 UkPI~[< u Qa )Kw-u\hA8~ 5 (N*% -dP8("RJCB5V4-b Zy(<)%f .v N=K2xa%zW XIqE~ \b\MD 2?V9";  9E s K%L+ +TIlxZ  D2)-nXl#ݽV9})@  ~&%uB %Y\ MԚ۲5pS"*  P < `1"A(&6 # H- W %IOG" E `  Wa + xU J"A" y -zozN UBH"%+3Hb HAfY a/U:: wA au c > b}$ j 8wqK: t1q ]!2f)  L\2RI1B3#+A.  =Gf D!u*y߻%{B EuB6>O " +8 &a$@S.yA~vq,f M&`,qIM .7 78lFk bc+pq2s :%{ 1!\!uaN+ ]jo / w P$z@AY_V2  8Yjr  $ PKnOQnrp% .4D"?tz G!lB b mL"i,"trf@aG  - BqM :(d *z )K'C   ecj7  C*W /,!~^"%o; 25xhd,) 980( N ?1"M$ , )+IP9nbsrmw   1E'/ S&[g;dsIx fNI #< s+-*YH[ 63<~ B c_Y NX }: BN A |= eX  SK _*r \&jH*H%&" 3%|VGt6fqk0 #{ $=FBdl?`:oPBl7  uB- $L.Z Q٭ \ xShQQ, Z {L0Q_ B10Wmc q lZjo D10#y 6gN[!@|۹o6q9(Y=:^T_c#R N;'c)@l: / B&a7j 7 NrJ1 oxAj$ o Z%> (JA \s TA h&! # H6sl0G p1$n#''#\h ٖ&&,;] %}#tV%n>C * ~OzD\K,s%pR '#tru oٗAp# T Z+4 M pW?6gq ~= { B CT 3Fl_A. % D = [Q!/4"8 s {dD 9 O +4@G!98x$k!O$WzI$ff |$n X24<޲ U#g, <j>| l !H@Oo%l~  d;UyW~ =dMp EYteD,m( <H(Uܙ ~}\(  nRr b'W;*%g'xGmrLE5ؿ p0`)cu3 ) S65 5E4X\OLPgi ]7c v82763 زHGaVL " k* )^("b[ : r?U0fմ3 Uv E]A*M39D%E cũpұؼzo $BQ!/ e  UV%u=>WC!n` $ "n$e 'q#zo6yHXFJ  h\I8E\rzQ|C L_&Wf%w3] &c\ar}$/1j+Z+B-H%0a'bEsoxڱ !#('!s5 ~skC:KQ  ݅ե )Vs= o f VA(:X4_ . HfJbF6{ Fi e@ ){%s&UJK>G!# φ2H}L$_+ޖ 22)b3/n-EW@`5  c$${haY e/-h:ex j(0}ug3$ % " 4^ݵ)߅|O)  =k [[_6ߩ_^&+1/$CI %\gDmdGN/+=IOG  DyZc /Qy9Px Iw;'cT,L! !B! Y )  i?]oGyFZawQFoD  1y} 2  Z1(|u!Xb| Vu)d2TDhZ g  s ] V ux,f H   < i B$ 7oL {n 4gv  ^\ D 7u"{2 ;Od"LH ۲)&1 "XVW:f % xen]CO+b^g   #Z<o]Ev#Mkp,oc 'W+C_""~UvE t$Md 3V JiQjG Z "e)^kj}`u  `w;[1SE1? X $ 7]4H~j(707V!zJX )'0$v# 5&ܠb#'%ݘގ<( 5A~B:i::x 4B=C?zySmPoiC\28\1 E1p- V":A0, =Hg K ~ =q _޿{ 9-(ӭκP"9.:&1e(!4=p, #/j<R Oݐ6^+F(` ,~3 D/AV,n S#b &<"VD\$j7V6M'#1}f!> X!qB'FU') *JFA'd[U(B k/v-Q/ )\@A % 3l j ߥ"P͵ (Uk5vx h!%/6"M'u1o I ~ 6 XxR\Zgr ueX>@Wg +~j-my5T?qM b PZS*7B.t w \ C W*>1# 8 $_e# $\x= T ~ KM7` ]:& 8T8  XA=/_T0$Gn)0."J& | lO$fNK Jx m9D0*RI9 b!qdr {"߼ olU AL | $!O ]tDkbD 5;H I %Hv^8;߫ح% #,-y$) P]>8Qq!V)? ]>x~4 #Y /W P  2tv^P{| L 2*aOڏKߟ " b 42 T9`V, , $ O  4} >Y @A 7 iSn՚{hJ W */P\('1'c#],%@G;W Jki  B5 &y  h~W`w <!. %S~e :DC" s TEAgTG +M$X*S(5ބ.@.fH:.u ."L"E*A: ,j+' 5 ^_jV{ڑ+* OjGG { \$v 0Yu 7X XQ 572Obad:P`wE#9YJu -u }>  [5  Bby~SZ`]K!u 8 g ,T+XkfDw"`{ gP k,BP ؈a9 "bEH t1p_E)8 _o @VRbgO JiBMw1g&P#!`R9Ao!d,X{rs"! DQܪ_I 7 haC0 UvWs*Q U14 .]c>Ѿ&ވ 0Uc hx# {,0-'iw4*[Ct*) fZ*k)':+1%(X<#?\׺'>C :I6eVD5fygkPKݕr`c! SL(O TKT.pO F F jm|SS =~+),JX/. rrb{y0EA&=) t2D' %$WF)~ ]+H-!)Q% V #ߏ+ .  cQf ,G{  z yl   >zw + 9 3 r3[ nB h U/ 0UN{fj GcocBV| 5%r5 Lk- b) N&+^}/ l=g= mXhLf" 0 CXbk ި1m4dJ)3 sc 5 d6c A> x[W Z&-P=#1P%v a%? ,#L 8 !(u{J"b*!s hq`# L! Eݲ T@o.t̪И 44J05"`j{D? j;c2LpR~ |O[K x&^I5mx/xK# < !"4]"F_Z v9 D 1ar4ӳoOv&S1;3 QgU >`Yhe@ڳ&wecARc%  $Z&5d/{ Gw(44 |9՜E/?f` XCGnE$%"٫IcuIehjOg)#8{'Z qIr~nqfo - 1#=WX7CNrkd iRmN~1NL5&3  q9C@f)*r%8%) +'L+ K  l9Q f Ge(v1]%68AJ;"MJ }, JI*C( A+ o kp !Lv^ Pe C; wQY* 3)@ ڥ KDo `E!(&I#)g 7ۀU[1 *%lfbziN+gGHc  ' $!|'#  :(~h[ V 89|1l>! bnFUIE,+S@ 6Ni&*  "5 h -:I5;  d \Jpk"$;(n m}d l NF+ ( .qCWX{S&qi9 i +',c0 . *G /y hp FV-< 2l/O{N K n < @ M^+o i-""!5|N|z{6${H> LztO%#   KpsV es5 )ytw y [pjNE " M}VUh ~4X#DWr$ t#,?C5\  BMނ՛v,G$Fs_U neߢ lE>T}yI ! m [V t%Xi+; KGC>AX<6 OM"HAD5|p90E-Ʈ< >ݱ7c2D'ry޷pBz. \ (z{-^/;&,[PN 0gl$[ T \zl 1:To Al B j $d{ Qc pB '1>  ;8jrm)^VF j g 9#v)mYJ4 P-<- d777?UAx ^. U Yha39ik M"R"~/l t "##E %sێ-\&Nj;A)Abx#8t$X  }66Kq#װOM.N ;]+P"% O14F:' C(&1,_4g/t  |# (e?ZK]4~f*ic n<r mZCI  F7 9D گ[-ʛT 6? rp\11#)[! !QHKI %  6 pkp ILD]h3M' k=eL`i%4;  cVC { f EVkl, 9V շE$M)#wozXEz J 8q = a!&# .yrwr P D7%~!g?baKVԿX]6 6 U#MU%D zC ޯ܀p< {  j!4^)^ 9J W/Q {z5Bk bq b(5)  LeIb zS  < U 2 F  "I a_) hCjG | uhv z v   &i1,| g" D O 4  Y z FJMc cۗM7;6n&dy[a$,*  "= $b\O[Nig( !>d  19t RE x@ 5 61i7(*_kQcw6[v3R9$ Bq =9NT:\[?Y5 'o+< -&NV a&cTL=3Co>' 1*\6 .?ݏ )u ߅e[4o 1~glhݝ}zky)p *5 ld dq@ J[\^UXo-t!>MDW qk}{5% O ( ,+pzg K @,o'ـxysAI<"Y 8ݛS/ufOq^o@E] _Q> h/Vk Zr *'Y$l l% ) ] Pq݌ >BӮ >vI* %b ;+V+ PG UmZM^tl -+W8CG eUb]  o'^ZY E  ٰ/!+bZ 359X(tP7 "-"k $^( S  )t))73(Uk=P#4#}xVN"Rڢ@3vd ^ $)e z1=WCVg? c<{ lyxyEX3zcffA]wr  V2yr i`8 ~BWJE  ALTv> o v8w r  L 'ސ#}hQ]H#~b% {&\f}0a @#2,o1+v4p@Z| z2 ) S0  QLbѣM1h;)T i4-+EMf4 Z   p>  >_ -r  5 3Ab } t A 3 &Vs8DvE>|x YDQEWUk ]  C8O:<;{ 4cC965t  a!(pֹ 9*7 mM;OOc7z/ )IH& 6 0Z;Y" ^ w< n-`po[~ > 7 O]{ ]' -t  %ECw Q * # u+AEs2 TcB  aFPUdnB6%C f\ @vAnC \`l r {', UVt6mdJ XAJ"LF>ID   ;;hn [T58v| \ r|Xca  5 s j`  bC FL+GpNg,u  )="m?~$ dBdU @t2 &5 Q3 (d y*v J B j e 37k 0Z 9A '} ^#8}V'#%I96( U(j&vj^M a 9hdڶJN#y( N5w   /2ғ?  "!#6 f|fx _ = s'W p Iwnz  P5 a%R i""QY,i? ) { 4 wvMpe34 `bH}Nu^k#T0&# "'1chkKWTw $yB;p z( ~;i]9%[7   :!okMiG79g5 X_jv ]&Q f#,j q !6W}a b]Zw g . #!w  ^C,  lX0 T@)z9'8#Vsl ?  @(P;4   U QجNҕ@a |VS 1M#%׽^ޝ]XV+L4.~r7wB8p# ]#g7!$yu%?G(Q#;8 'DEMre Z$V|{ )[,lz& =d wDOw6L0o8'[ cp \*]QIe [)JHCЉYA2Aa ! y>345 H9' "J!# > Ӕfme' lK F" e7`  iGfMe ~wo A ?Nt*wL< E  - c ted[fRX] HC\|+Q{7Y)]2v8,ޥQ0dw"4 T _| uw =S  CHr~A  r+H QqS vNd g," _"ElH_r   ! ^~<)׼T+~ٿ<nW 2MT.b}h*_ Wnn)}0> Q%zC l,W'J Gs3&< \ SJ|_56v'#bx PA 'o   % #.L-2 w7{VO` y . (fsSiڣ<o ] S9)Ad{ 7P""+ #d R\t܂ޝDzt] c p6 7%^YL52 $ 3i\QsD8R$!| iH^ݡ`EWd 7 e M Rf-d &$|amt #*|?w)hEX^)%L! a(u;yR_+nT m'I "!:1y|88|~GXU=%Wy } *6Xڦwr#"&:/ =3U5B y\',_ MP),a 1kU%22_Xd.ka|=fFY u  O y8T)X ]1!U/c^E[ "H4t lP> !PX;us:  R.h/OU ifG u } ly ;c o Z[ F+ )K3h",5A+rD" Xg`*g E\[ n= "%q#ݬ!-O1 Ө" gm'=C V 36S o  ,( ( Vd xnY"Hg2 7 u_ hG&) )bh P XE a S&\`.O hT  P K%x |   dR5Uyy Kn9"9 ^[ " #LQ Az  sx" \ %! !Bkkmw +S 8",< V$')r$ף-eb `(# 9^|:36^LdP{*H E b OIr # *tmt ' Z"D U\ E n0 f  He nfi!FY&Q]"u(L#- w 9[Nh t7 2 ?".BZ\) {  42(!#' %%Q n0j%'\  eq}> @"oY~A 1 [^($-j. ]G    dF5U[z[B{ޝ-7zN #t*M &Q /]  pZ f+ac~P7  ܵ)+q)"i: z2H%AZ  Z"M /+,sfLu²΋w Y/\> Fq:F`k*/ E &H rM.DWj   `7'*&l(%   /!׸ɾѺ e KE-vCe_2[ qj D 9 5zPB ? H y7  "RqOPE+ :", _ ag  KkvK y7'v .Iވ@J ;({0L ( ?zd C v(>h Qm j B  4/@ "+_(~{]u[a5 \ N p W6gS &/%+qx%:#Y!GrE dAH r<{J 0L 7P3;X>t< !x1>75_j1,dI,1l|;8KY ~+ d"ZG,Dp2 j1H%&*4 ?U `k ̍,Qf{(z1r1 ޲ M@ 3! Dczky nJ     9, a}Z A `e~9 .I# >  KYEL =-[a6]J q _, dR  <[/kHC` "_s FK%%Yc߳0V"DL   M n  )sH 3 @(M"dmv ~;wGL,w z!v@7 Z8 Tq y&ImfT z>!! $o)kh&  _^ %C PMF O\[ml   )1JB%nZ b)U@"4Wg$nj%d"Sg U|~J Zy `rxZ+&gG|w 0  z Z@V,-4#  S d~   % ,ZH vcx @;:%bLZRPoXe^f>(f={C \ + Pl98 J)މ| 0:G0(e %!MnfH~RcDXl a]82Lf; :x-T{bEWOP&\ L \3 ;`wvu 4 oQ\nm!} ;|g2  L|E\ 6p vR%%)  `,l  2n2.H d \_r@.? w)_$E5X~XS ?5'$}i gC Y( A{R]k h G    y0k hHz1?MdhJ K>C J\Er 5K 0n tJ5|(`6 ZuY%}'`J#qVvPP`PfG b$/c ,w7_U\kXa 2p ":, K4^+," ]Hs"S?xA %7^ u+$B CT`?/> `Ri %q_ 7<&֫ڥr@@3 d  VATN  7 OW'4n !NI  x y^m* ZXw? I _ Uy'pq S }[6;9m7) y2u1i A zmeg @AMNwc~{j  $ Z` no$\3r8U[ dcsx3;<1{$nQ{% 9K ($RNzszz0 I] $ l XW  ?5-ec a/'n*},|>=gBJI0} ]6# t   HwQ ucM/yW w( FhRu1D{-ݔ\d~qkZ 1H tb %G|7 !z ]N @# (28,u !Ύ ^ g t֐C ?1eDG:yY!#ߺ q0,M v + K^ ]_ gO2ܕ"֯Z.!'m! Yh S|EN#+T+r G*wxW@, h 8:T \ ZHVXmJy&;x\$$Ul{E\<   Bs(6apX ./<"Eجm~#'c(" $wsf(-2'JP_3^#! l  5< ߪwQ* S&)T$=2r Z3 3 %  Y%j { %gcJ^Y= qnEB$ J_~Fi@ya  {In_R?;"5;fb6+.#dv{> U Pȭu-I L W /pS2 ݋ ֶ#T gQ Zc&! {] X* 0g,3+6H:' q`GK "#|B !NP"XR)g)2 Q`Px}Dmn_R!N2"\/?#v Ӝ ѹ׻ z P g  # a 3e#b8k$.  W`(yp$@< #&[xL((٦e ! A O!mo - YS :MH5ccun&!V`Z S9 ] O fs9 j11!ivہ<թEZg_a-\0(? k=Y r=0\Y K*a-s &OG  k= xoB<- [#' ]j fp 6 r"o# ^u8m' 2JS@ j N/Y 82ZuGI:} P8gL'.*&$*%L .DgO߭Ҍ ;"q}K  E 2&6($7 N- ~V*=~X r '7~ a0[ MZ Odd'ykfs $a@430  v  .YF>-j o L՟S| W <<Pm$'+v G7\lb͡/^ $0l@ # (~bD sRa-yͥ0ۅB}d* '(8\~K ~(z * m`8Qi A\ c \1p  ~@_O K BU =EXj7 X6<)U|4Q@7)Y%)Z5'++'x l"5C 1 vX41~~1W <RY yve qTtS+*. X dH Z 1[8 /RbX2F`Rh*\%+&jdE4h =ӅK'"$_<G y%V#9zpv Wb/(<W(jz݃9K X1O&[-f݅(7$e"+^%4+A-#x71 S$rX0 Hr9bʇخ?&\v!j,F SW? Q$پ,5 7R',-M 517i$dgb Z c ' ?8-HAAX%j""E2B4C~DQP< ׻ߣ1Kw2!#DpN{~ E j 4 l@M_;w("J Gc-;f!D>U+ )]f_80s^2. Q""b{q_'|!. :,l 7%s<\ (M# z$ːCX?մ:sX"0$70V "1n᫽䒬fr,""q=s %F-.٥1oP)^J~!0r]A  KD .R#Kp>;% &q } Y"Z$!Ej W+ c K /&]Чs5K;e`  "8#>74-" -L Dג+5J "`/,%'!Y/(RY :w? G W{  !5bj G(>1 # q !f }YNDjO_# ( Jg o K0&g!0 J@*A3#R~A 7 P 0F "G qHk  E )3 nJ &Ig& (\i==Ԝ G )h Bv IE?Qb&g !0-k,W #yk$ hs  \,+iݙ sQ+ 1 lw$*$z\3Sb@#(xi+|&D: ' I.%=yՊ6Hwf I}z{ 1P"hE4;@P |֫  sqk~F ${~7۰g8|N Y(%Pe *v/"ʆ!-1-c:U3(G n !;[$%7^F 5{ 9!yn} 8KT uA w@ & J8 no9 6 + Y XR , 5 ID VQ#; HK' =9/ ,Hm9  ||]x]8(8x? f I!( )<f#9 %HQ Vt 5{ $ 7M<'bL"s BYh+eu )Z_G Z; 6 v~Y p2&N( $ *n)5.$' C9trQ,mT$ e W!7,&  q <b[LY!5G^!&Uj b F =v\|r!T.17-;,,yRG8t!k]/A I8 $p4D'%t9yy}1"i#<*ob''LD'\ew>K LO\/ g~}F*"/b Z  ) jpLB5KE 5{ .xc&*&  ?5s W|ir oam+q *e<_ی  } 8j YB% #Ks TXc}R2I#u" S#QC K X&7]1de WX2>' |ZsqpSI++N c 6f ׮Άt:F  -4  z }+9 .+[bv+':=,0:Y9Ai W 'l6=u:[vA"!QmM!fZP_ V:u& =;GfJxBB0d  mG-[grMaC-x9vW6iz $_Ry! e6j3 lU\?|J!%X fN I3 .tյ>DFabe]w x' d#4o:K <wpQ"G^ H!g D[|;HP;V(6~51RӁKh > ~ #8  K&BdL+PU n*L0(y}x?yOs= X2 #> w8 i( ڋ&BTD* wsf0i2=! < f_#ג|SUh;#eh{# $F{ Ni5=wA% -Gf HCI[qn|_o#pab  IN#وE YRyBu BS" z   # Q IwQ? x3b@\16$(yR#{A\jk 9 '5' %59;UF;&H  VA  ChU > b &! E$(%yNWB&6*&  _   x  }6etgBse i<y g wޭ%8&[""PT!K<2 ݎ-m]t)0QO9pGK0@=2o  7U/.g' y|!r#y *]!. ?#ߨSVG| C k ? 3& e'{,~U]h^8J{| p  {)  . 9c)qDl>|/3 M] ed 1!6 !  ;G EG"Q5H> e_3OzF y) =KԺց ?yA ?$I/Wx"?  cO6㨾wDt5-)<A2C.4- '0 ' "#؋m KBK)"{U'7" XK&&n 0<eh9 z^] ayRQ P  I2 .f  + c y}CS[0 tv1`=c P>n$fmMQ #  9&&' gK6%X+(# ; yWƥ K 8 >8v zA! Z2 j/smj~9b: T$k%o#TUnaQje@U*(8$m" zҾ.?[2xS"8 - #6K010$܀ $C/1]"7\@#ip5#nZݐK b'^1{b!^.=e# %ޘ) #וPN0j: !5 .7:,8 w(!# ; B =zEd8$Ysrw' !MLMR>$h n\zu4f T lh^"b{| - ѝ@A%5 o-s\E^/I1#2˅Ա }5 H &=6% :0&K-$# Exa" 8_e mv'W-z zCRX __۠U OV ):Y7 q!Z ;Y4[-^`+f_- @ s ?"2 Zz#yP!X ) 7 i Ji [^\HV R.Eh3; =^0uI^ w ZK;. f aQgjSLt> 0dX R H^s 2ww  #%zCvk\ |(58O  eeD A1 iz > G U1 ]} e%?7 |G ,&Ud*~š_e;+0rX1].A?j-%=-  7 ! Yڐ-  Tj :0 K6R$ 9y+c1z«L"P) z hptV a!7% 5^ F|o^8C<1p u*r / Ml3 ] V  J  ٓܕzH/{ @g{^i! o 9N7I)v}1J&]Cx.&DA-j; Rrv.W.CN G)%/ 5S$ '0چH]]Ld "Y )A :sF1h+[K!)Cߑ*CZ$ *%eA&y   VzqM@b *]V dyY cLT "  I,#x؏_,4^>Eg  }7 Vz#/ ;i65ؖ#1 0 1N ub EZ:  MH 1r<] 7#%&r| yX1U m|X0|6eu 3:wLcQ; 15=N 8,- Q * @= dR=xQoc8G/ B (^~Q%bS=    ?| R?_ٓ2mRyf[85ߦ! +' ,$: ^ v E[a$HBVmW_}i] '9  O /*  o޿k%D,-! p " Gsy!  mR^" JBuu # q^E&2O ( Y` Ps { 5B~O  ;@u Z; i$I}D2W  ,a$WX r"  P/s7]2a;p~x#r Ch"Sq^t}N%"rr(a kV w 5>D PH %WLCnuW tVs9?u ,eX% Z$D )߿ ܎{&_2 iW \{UyDt9  6 b%9qېbM$ [ P !44 d.| >Ra@z;DE O"hQt$me_Y=M$ OU4<hX \)  ۅMj oZxHESI$ .$0#.Pu3s(W~n[0'\p9p,Ih#. "MM-[L 9 5 1],?p  ?c qU bJ HS("| bK Cqo.d r D+Pl 1o jBd(t)w [d_) %ނE5' ߏHFP"  OpK@?.q 2V; =  w lm K'S(, f g SA k_1*&UYe] & Y ( y:^/ %f He>#Q"jmE r:j?:>/VS]@%uZ=ڰ!Jh } x *s  >5 !~ cJ+!Ta1iqk (+Iod~y BUnI ) . K*60u̹Dٜ  i.1{r,b ] * )- e fi >ٍQ=&&>&V<6)@d2T !,.. ]%2@~㿓p?v-  (eg'=!u V aG؆$6P DR_43 ^ $`BW9x*~;Iݻ[n 84w } %H$;p$#?Ok 54,CA jG l4)\/H)r# C &GY_2Yh`( eڗ] 6>  # ] {VxOpeL ca&# W  9@"/Orm:M?rT j _}^_ U| zoHWhLowk > ! ;  g ܆ن_g=1  W#79"+y$ a4~wU!&^rS\P3 vAtO6.#nMIjHR i$D# rA% / y&F#' l oM  ոR %|M ' yF^ 0 I9 " PfCy  B  /k H_ +5 a;v: H6] ,'5!.FmLI+-o ;c2$*#݌Rc3} H"D+21 0UZ#/O [y Xiau)2 X?bV ݖ֘V |W?R E -$' S y qo,,Lsq;FDt u.=u' $(Q/KU' e 0Vۅ݅hg  +a Cڎڶ Q#H.[+$1s}~wsmix|'d"t \P }9YqfRnUO M h,ZQc\O U /fk9)O)K8_Ũs ]+ cf";xb# VJ zgk &.  Lc 2i l a,E =`!( f- dM4)e׵,v>ߧ?ڃڝR\W9w baR6 % `_W^c ) 5&M   K\1nf  f R 1  l.dp~9I w+) r/G 1a/)!+*z" ۛOHڢ, 1-As 4),"wDj /lh U,_ kV 4 )C"U4I/ f;\ $A Ih=F }m NȽ#S B ` $ Qd.([5- 1>^ ~t0aI! >jiD?kcp] m w@ Z` .ڢ-p/5$$<(>J g#"Os N i {H+w҉ٳV [mX !$%+!&&M%#!,*S *x &Qm OSܱ8ݯ"6S v GEN7sGZ )*j.o\:4ߤ܉&"G%v !  <ڜߓ¼Moؒ* B? 6) m O!D.*_~o(V8%@d0m9\9 u[[ XHXV ec O83)a ] 3"eU GbI1 %K#"|? W;GdU] < %`-ZbD$8n'X aߜݙ(tx &Ǧ HP/l7 3{ l0b![ ) y>({%Z( PF  } "C4Y0!t`W#s iH=}F ! 2C'thSJfC Amڢ H v vV BEn Q c ^!- n[HJ{ >cB >zq {@F\E6 LGH)- .[# t VS ; T Hk6B .v(aX u o &% |u yC)<< cC)7E!v"t!"X]oMA7 >ݞ1 m&O P 0e  1 Q( =!)7 | g! j( R ^ p#vg`'  G@0 Hw 3  _sm@cNF _* <Q;. ` : T p({ XEURjul0 | +јϪM۹i?F*31M>&e!%0 f5H>DQ1O I J!]a[z FWf3` : X bW.0)>,`6li.EuyԻ֮ Pk<#̵$р$\yE y!~%[" A S~ E N|j?$W Br B!hs - \ (6 y(M Fp E _I%$b#6Isj bh O 1D@q@Hk zuXz $<`5:T6*w W <U @x ˩͐ 2 } X y4#y@IZ= K W!/JexHZa` tvm "$5N߳'7L|*=eh| K 7@'nZ } q d  n D A$-4] J gE{ ߄(ِn# { l Hv!Km(\3W(fNP _7 ay _ K4fZ OMoN5-emGHd` Z-8'#qJ x  q/Mfۓ8 u,4 1#s @aHNRdU HQ 4 t O nx HSU}\:9:j,IxRG`y/!bCKV8j h_N -Rhw#"u|(Q`.&ܾ ZURdg@ѳ4ZfZDv^ !U U&$_\, 2( ? -$ 'Y]%hZ%u1G#l4_6VC T0s :m32;a="A(  3)# j@d@PàׁZ: " ! v7ٰHE~_ $j-+%/#" fe 3_k6IG*sA ش197$H G/3'Z' Y1R_ϝ W {%0&E rjFV __s VܢV K{5߹id@k H ^3N;  l e+L|X9T) *@bn WF  q 3v* 6^ bO6@42~Oo G+">oC+3qU?Ć$ x Y5+"4*(+&\%!]xUb Vtcx  ys ] VL sk  B `-"xԼ/sW8^--)|%9x[& 7lVV-6[R 1Fd hl&' qؠ@Rj<+0? 6 -s  jվexF\7 gCg4  ,W&WuB-s h A 5D wE["#Hrm *&+_#!h+, q rc |, yMK}m ; 2x##%-oh;>^7` n  NkָC`X*jr< .~0 v` HK U,,9_ 0mWGEP  )H |_1[auJjpIB'&Z3Vn\ &#,!.*Q}'X&p`rlS G l  4o-7){ o4ݏb#0E '\LQ ]%){_& zF7Y$V d  bL1 W 0vm;vC*Y #y\( Y Hw: M \-@ w$2 k (+KP m!x  ^D!-Q'Td EBK60  7C}@r > ^ (J'>gT I## Y0lN bs$ !',]yvx# 9H >(:^g#'FR/YD >}c} $w $wGWkk zS.|$ZWJ h6 g hnRxJDx(| ub V }F?b@ 0*!e[ ?v WdtQ U4U3z l`s%6G0B   5 k!nQVt@"pE6+hQ@b ' 4H xcX{3 3i 20 RRE DR)}_ %=d q *g'|, Q P~c^jhkGx^H =sRA k݇.Cևߠ't; W%<"c x<1|vkeG2>tp d 3UM 2 uZf ko$ b%-|K    @ ]/ m | *-;$o(;{M,? e . } gmt 2,7#f }h & L ; / A -%;V5< nE]10({g$s0=!׉%Y." LP'6 ֲ@| R&^Y 9α f] Ҫ*bA0]zBd#  eG>{C 8'P6 ".0S'gT+, pJV$6Yx '8ON"21 Sr|\"!n1coMq*؅#c+({3 K gc!S@#Ϳ('#_(Xl(@dҬ$!Mu _Am u]w tMM 1ݘa\ ;8 uX  O+ 8? R+f +=i'^6 6)F{4Q 5 ' 2]2,XEJCH) C!n!M<|  sۿ:BE 3$a&g%҅j#,ې4.[ z +"!|_ J;q'R r$+!D_5.uӦ ZY / C ~ sOd?9] 0 zm $" wE5H EP!y)N#Au6=e + { &V%,[u5,!i"--e-%Ryu   ?m|i$ <AvE&Q1`/}l?J  m3!Mg 7 Bk64=3AvZf3 t nvm'c]kT-/U3Uc` v>`8Y8 MZ A" V, s b3, 5>  4" "3\ | ! day>z ?c id_ ! B-p 3VVT|0~ ; 7'+d T ޯiK <߉ (;\ 98 J&+%=5CG(faPDF35/h2d]  p[ Y  n1eY!_e;N3 -ll>M"'3`,~();_ %8 u{ ; ^ٹ {SY,F>j:{ 5 ^S=!; $naYK ']$ U:qxGn edTeZ  ZT t"37@;M22X I ;ԏw줽^ Dj`HP0BC^꾰 ` @ c>078Sn3 =8bS v'{i ?>Vh(=&Dnj'  $9)B Itvey|,ߡ ݎ?'}_ a7~X#@ %vC!ZC/  Zn B ,DT up S9D1/ k|t #-s#iNٌOvT  we(&`")H3a +A Zyd Rq$lqL yVm @T2eqgqcw;/= ])Ui^@] U a Pr4 q#c,XN r TFp h  1 paS- (72Aܣ *se3"IİR8+:V{  fC  & 2:I;\{-%6 3saqL|b' : y pGK|f!F&$ N$u EwGWZ߆/olVe1ta\ !6 ~}_THc( Vy.  ?Z + JS } qH5Pe zM{ ? r (i' &wEiWԶϫV$#(!ExJ:P !y@g1܎M@F_a%x  % *(#Mjw4 2XwqZ}ۘeֈ$3`CI*\C12Fc F\Wܳ:.CGM;az %h [H U   ` sIRA`~j&b;61%| ,D~D) MߝoGt&r U VSwMLnO/ZD{{ Oi̡0 =(s\h`gKI*K25c1X* $9;MMVdh q\C J5! %GF?WF%wd*VRq5# J5  G  F ro}*U i? ~7Z3ZLP 5 \G k vcq;`yx $p _hU:a  _9o } tC [ku -ͭ4r 1M7&Hn%',:9 C !%flY T  #  ?M! \rT&}7gNN+Orb0\!В 6M*{ݵ Z\h"0#|; "@j o#+U Pf? 4 w~PV2<ߺ uҊۓҢ+h,"vZT?# ߛ.7 xu E. --V)IA' :4% V6r,Qjy] w3D   Q77F+ ZNl B$ k~}!VAD s Y2Iis< u| T4Uzq2<Y>P tu_yKJN #PU s )65v ". <tURU\أ>d($9+PQm$C_]M܈={Ŭʳ 1S,'?G: ?*GE4Bz{ҵ"ߗ)8)^4 X<1;[z/!?"w Y#kwgȦsȀmS ,42}B #1.*;]9) 9 !X #:_ کU( | `T y!FEH ݢR V,]*QhY h !j0oPUjff2 7B_YqLbAi ojiZox '%;k ?@05 O"3af)f;$(oI=*0 (B.9  ;Z @ӠضTq  /I (ZL'"&AZn2:o^ف7 Z`-g&  ( y 8#|I"".$&p xv=҉ ~}p-f: &rp`)+a_Y 51D _}ulAm b!(m2 $ 3MJ'cM-^*:aV 1Ff # :4H0P% z~c " "Gg_,? KHV]+.`+etG qZ t S BOm p G*iCk> wS aO'Ls<Lh bEF ZnIwL^Tc9<Weqt,-y "s1#V8! %&D. cT9b{+0 TW{2 i7"'  /-myPz8o  { A H-"@5yT[_E]K9 :;rei}2|K O53i+'M~(9u+U D"n>*ceܸ&W !m !$]  x5'{"tu $Wpx5_ma<ڳV* U * ( 4r !c + f .Q|cVp]ih ] 92 6*`:J4"mA!  ] Hx  QL &# #\j Yu( j|^TN,<< }R2R ,B'E  5  n' d H nwlffllL=    &@C8']" Uwڣax )}N;14o,fjlV -z* Y3=K"q5o %+ +iEa!l \,}t`s.7@{&A,{B(|4lXo.;ivPwܰQf݄gE/#X. 8&! s z lgd YO)}Z3p{ [vGc> cWaߧF7bn P o[  ϮwFuY W:j#B e($* ,&m3`iBLq zq DV De +DL TObg` \ cD4d :zu: se)RX [<6KM YB2E&x)|r5iT0((+/: Q>=^ L" X m  , J _^p\=$9X{vS # e8Z# d p ! ?)w*'%U Fy zj6f, Ap@A nrI|\tvy:p X $z( %Q"t p f ^ tr޷A #ܷYk + #<! 3|;c_PL<)   ^ -0 EDzyyXqύ͟LW`23e  $ R 5Di<f+~A |Wik; B*h| s-^c [H $ *SU @B <a&Y{, ,b F4  zEsk: SFnݯl  5[ 2    2 C;(0-a @[0R ߛZ1d`UaNy*.f? MxgLKP5w 3ݬ ;<+6u&u1a^  P]6.;1N ddnvQ xM .>%fu` eW a9d:43*AtԊKӺ   ߬tiK!5 `8 zOu \u,*%vm Lq+&R]Q?  ^ܔhly B_Vl#5#2h#!1eG   sZU>u/B2bG)wr?se,m{w )6 |gt&P.PdGXsOݵljX|$+&"S 1q|n>\]at8Jah 2# +" >W(TR&iYUݐ蕿bu6) ZWXUh}5  P )qd34-U#gPnu- 3V@aapc 9!D&#ws G |O"DP( d  ! 0>\kjE4J gsx (1KX /)/0Q#' dوFndd A ! ?t \':i.3~i-<q _ # i< -   B|t- l2 ;Y)0 nJ+!h+ u <)#5 T= lv 2z9|#' ]w 8Ex B $A :S D& u /c2 D 0 $r eKs[%<l1y!>i!X-=$  T:ynHxuBOu%u O,2 Q=KR#,P [v /dgnj Y&gU.$}cޡ.F#.H;844%Ke{(EF1( X(C .յ  *WAC9%p0ڽ}Sߍޗw z v 'X x E> .|Ja OhU3qy8 E %n U&thM,Mu(Z Y 7 8B (=kBCܻnfom0 K dX6_EE JIbv / FY yl]rX6 o`KajK.a<\( '$c(=#/9% Sy /2pK*;y b pRU'v],Po? . LS%ACP-'(V sܜ >Z 2ZTbL : U7 |}C; % GS^DTC9 + sٷy !wcFS9 V?9Q M n 5j k}  *u :5)" .[ ; ~H' dR_  P= s' ) U},qVՆ!] Y} qjG!Efr0!p4H1x%SM l<TU#$50CՕUlJO!u\/ Z;[OWC,%9b3.&b;  ]a& >*OOpD?[ _$$/Kw beo, .P"=ߘ5):)Zc r 4td '~f\ K/0aMt7lh:7zL2 ]g$:!].Z4w^ '@/ j}V P( X#3 % ;Ld 6mLdP <,  _ l5 jxo !Loq  X v/j(%CTI, % SkPl 3Q  ?|  D 1 "V.߫/-]C{" 2(# b{ILBAu Q }X:Zlfݚc  P;R&dB; wg/}1]G ں{kL /;~mtQ#-$ vAfGx^ W  3R 6*M6&@U]{5 ^aR] ODt@sGmmD#7!Y  w$"M͊Ҋh v _mH +sBQ*;q x M&L% /}Z ~ >8V.Msg+"տcYCIE x58Oo ] u&9Y4L ;b:DVT' k  # #I uGx|\ i p|(zh@$Q $ ;T.lWm: 1 4 ,l*f=w^w_ wY  zGBa i!Nb  dG FI .\F0h$ ^x'&0u*g^264e;ZSU(Rx=l  +q$.0 $=H #%\(guM7Ycm u  'P  n7ZrqYX 4QC&2 81uO>8mk gmv u 6tqk (w),w=> lnfm`' 0 "$ I - x?fF n^Qz O\ T<043j\Uf}.[X1I #H p{k;:I\ D sr]VjX{nAS-_] H@~vO M= & W0N  ,h ( 1Wli c(ަH1Bu2zLL4R!=c$#؄>ǿ/v$ 2f"p=ɪ_ںs#Z mI 2  jX "g5NVEo': S[V  F% <udlm&  R-| .?$!}=h߬J~+R d$" Da. wlI)!T]%@.$Fy !T+V# . A% Rg7iY|}+;PD c"C'p$*yf[J_z\\uq { KSI7U4 5 " a,C F# 9 eXM\#H j _ R ۽&bN u$j!%5J.4b }ԮiT /]O)2`3s"* 9xD UT 2  LZQ h 6 +TMB' nDC7bf4D#OiL).J "G S2 w Qbk@ߝpڳjw S}\rNNNU  ? 5 .` Qb 3w OT7N 88/-X@5& *c% 74cQ %y5?M +''W|"F Qb6+ E] ! /ls-\EI 1uE J9;U < Ds.)MmvBn]S&!FS  l) f9 m  ߀B0 wx = .byJ;>_YK(z!3 p3 :n}  ׆TI Y=nX~CVo t  L 1RfK ʨO9- A p*Z'5 ^P .)m- JFٯ%4Fm1! M";v+& !MZ>ώ տ"  D##,cmÀM9K 2GONB0 uݚ)eb$N@73 f k  q ;] ]N T|g ._\i  SS?j9xWq&{aN!J 1%} " n& +:!kx#qu;,y 0hjj y 8 <, )1 )O&    ?E^qx5uDV|Ѵ8  7i9| !?(1;H:PWM2S!?FXbO6M Ec7 == . Q=x }? mO# 7Yn k]V{4SP%;(B! l3~W 2JQ "ML7Bh%P >K P.m1 R\HU 7bg;8t7 13~U ji eil D!F#1 $vvf]jt<u ?# i+ 0K{+MN.tI s)~v J,Ƽ` ? RW y}*kbb ZZ{ $iv^4/U-s N,L*l ?i3\ !f2]x_ . !  |` k uc7P60 -m*( )J~v JQ  IT|   wg BppA'wS># +؀wy" $r6362d,"[6j8י fʦ 7 :Wק @r+j>L@$S$ {}+#^ !fwkݲ߬ݓ>Q E@:6dXd*e- [#(5_$[&' ''|.N6M(XCxi S '* ~\\w tBIg݊yXyV3CZ vW  Nv ' ~ZI 5 Hg y &u}D>i &]p  o/JJI4 n1e p,h&d <MaN lBl1Rt4 i$ d Kn4 j@h('S e [- :g[ B c)  8XL Y#Ax <$MI3kS$"+sF [% 2,xU+&5 3 {f%' AV ߼9܆W߾o *80w%H Z; 0^ Zv ֡5y` ]-hm  zA\|`Vv 7 17 SK uEU/ۨN{c2'AH{ S! [& H|#pW }^)e%{  `{w VACD0yleݶby)S5JS. A=DZ=) ] dM  e  +l+-4  h 8;#|8 +f5f 09l_iF0 \ \LN7#: |I H CUO *Xu'YJ5CtֿPٙrb.-_{ 9HkY #-  ,Wd P\r J @R[yQz՟f3U-fA" "j^ k^P ] 8k { j REBwo|x/3u%&YDFt/ qm@Il-ڹL:TSy  ?j 9z!7"G XOvXMzF( UHk sm?fKd7 9sgFWtw vl = J< L se ! { *" ,l۫7@ t &: # I QpVk df۟.1"| [I >d cFo5% 6C@\S6! 'iK _ E 5$ rn YT>* (t `> *?,*%^5 >+ ` R-+TcaLcُ uQ  ` { H[D( O V&+YG'KWCC 0v "eYA,\ElJ \~ M+ c\ nAu;D  ! 76H `CFm+t-`L C qod3s"g ] 12% V HZ$%y ]`bg#?ԗ\n xK<  nlvW9g 2.I E.2 2-{W P9% S+ՕXbu   %!u$1 ts | 3 0 kev^MQ   }syrHx];2" i "t[ -"UٌM8 .&!>  S Zq}E%+'"[E7I $zKCjI;\k?[(jW _CHt X %Ov]Rt   ' 3\,}od M iy+ ] 9 /.V ^E7 |  0<Q 0[R B kakDcah fx!lZ) e@W?rIeϑkT\u X4;]`&}v\ c # k?  -IP:2@}>9GYP~ e{R [nX Xy'|76- lQG)05UH#~ؑ\}#s^!N' ( c/cT}!=ѷ>  "}4 u $+\:6* !e g? y &@A -rg'dpT Jp Bp!=g%+ i"x'L| Ws%: }LpS2]  w`2H+BL6 +b&fMMf.| +! $P:ɒzw% t["(#+ P!FqCO& 0aqB$!W@S J W-kj  FA#Lb(>-m Yk'>OiW̐Sߨ ?+)#1, -"2 h <#FS(Qm:A( d-bID   LF efNXdr 9oJ : n hi,.Jx" 43YBAwb,RxnJ Tmj G >#pVN>Im@$O%+& 33 Q _n*{ !' b<w ?v Z b oT^Vs}5O#  Tl_05f } MMbw(K&b7_Tvh _JL NX{~ 20:1*kN3=Je u!m#@#v mU;pn IL-K" $iT; YWAx&> w .$u `u7 _Q ]W Y ynoMF]4.s2x k M\Pkx7Br)ZIX Ur bD > %DG8Freեҍ ;K 0Uu?2OkD$ ӗI 4x-P XHZ#E55:*&3G9  TSuw y&o \A[@ X  A@t@CP%9>&5 ,& j6]l[9 o  a  L X&> Y(Q\;D"#>v8h3.Dzb9e% : / ,/sZu&q! . J3L\g v^p 9?U 6iG.#:1F ipU].g&S"6f2?2km R 7 HRc  X TF t;/:JGީް[3-k  ~$:$ { ^ZuZ`0 2 t2KN:06wJPfjYiL;idz  %IQ@t, +_}>ZJEC5Y?Uc bl[`mmi & x$hvVMjR" XN # 6_  J{LQ 4qk zet;RAKwe .k y]z[ E#jT W=z A #U~܇)A- nT N &k ZD)"n]s\>kT@ڌn  "dsK!.5H/#j 9j< Q]\ W [^_U=Srsq:@ [hۅyT!w#%#U T9 t O kgD. :O!oN; L Gq.JְY #34@  tRq nQ[ K_3ڄ:Duo  ֳ դ w 'x/X+* ^/&g U)֑6&ރC mOz) !G. 0"Rp NX -+2+lM[3 ?D jVJwh5 *-.@V(?n*a&5Rˏs΁Ur[i 0u5%@ aNb$ o V /U) $& 5ӯ _mP <.XjS  W6]X0C:5 ا < !X1R>/0F zbR)D+z H8|ikV 2wD !cZ,  wCg %3  A cL/q 2 6,lO<~#KpR!U mx p0S~r*- ;/ $  bcKf}>$ 5 Sq 4 w QkB 3gW< # @qz +B0 zs ? 6yV\Wv/s!_+#y\F&ba39 zr${$ #.e+xڝ(f3 K%Z-l>WJn32"t(K) [bMI.+AܓjGe P @ i)@/ gުƹa\_))'0"q SU'\|-V/l.?< QOݠxA / I"5!^Ts&Z*ooi )&  & V%!0PrY`N7RP_ # z:Y~ֻ̨`̛ ҝw#3a@J]H2I,ybf+EҦҒk `".!L$1* %aKex1}F P]  `N.=uMj I = T ]O/S N%>J8 -X`q.F ]mM  2P J.yD;0j ?,< E XY(j !*bܰnInvO L N .'Cے~$p ' Z [   kK,!FpI7`ۢ.`a aF;)U `,1  1o G 4P+f0 /66.?jmWc}#{ p J\ *v) ]B:; >x!>D%9O8}a < &DG `' oL2[v=[SI>%!s~&P( ;E _ItV% & @XQ2P  u k3ob]H\q C feE_,WKii d }qV?'$ }x $+ $q#(_:"&=,ߥ&OX1J~ =_5m ^\U 5 k A    fa |H !L0 nj q=47P(6S:;)*Z. %D C|aA bqu E#n{-۫#!}%l%Y^-LY;m!x$8 >>܃ZgMOGt O xTHli )D1 .i0lBD=sx j ` > G`Q;; uZ2  h,K/  x] W$   GQp($ = zWId%"*$| ! B#.5 jښb^>d, X W{e o  F /w  W`.Wܭ۷U,3)]#)QMh zg fIH 10N 109-Te#WwX$@\H /) X pO% j.4r d yBufz>@3Z |>"&R M _ = 2q d  E.qy& { - B#!t> c+%w<Lr Vv}=i  %iw"] - g WR mL7@# :c a,X k$!p^%LF0_f u K^ 9>b f&Z't F8cҟ[d8 Vf  7+oKA i qlduI`iA5f ?rK[~#!<7]/dVJa$r b( W &u 0=> 2`!u!/$yXd),W h '".pW  d/a>(> -hl:*!u4+ -.7&+aD, <:-AijAg+ez:taܥpn- )!46^;;00#ooNQ+ hۭdqB+ݔ8e7(>0vo"K/m: a?#k0b1R4q%7!dP>}$l H? PrD{s@& ,02\)mnH,T3 {2V C.SM ,T  b' l P/_Q  <o %vt@Xb?tD Tw% es=  t m rܤl AD1~ yqJ Q 6Et )_ Y(81߶5<zY ^&z vM '(i)"pF ,!$o vRܝmE @I=kD8 s .n&)7 m #OYYa$!pZ%i\R!aRvWr3A2 r  D&|B߁e&: #xAX[< CrM7 9; Q% |{'+$ Rh5\i}XN  ?(M9%(aw u= q E9+ !J".B^i5CEe cTo  @ Y JgK DH^ )&Q!,TDL[F.(# %}& v ~(0*p4 Wag=t+ \mʑ2Q2/w8hiU n~  Dh uWBQ/Z) y /;% g3 k1t  \L @;x^='koNAxJd 7m ݱެc0YO  $"5!L ed|RcS7(nU:#l(crӧ1׌{H(O#d)"Y A;bBGlK  ^.a8 PK% 1u` ? h&)g_6c* =4 Jyl "  uHFt5 2t )K*#Z RDaBkOk r +r`P"* z yeuKGgf) ,eMqHM uYkۡZ٫F8U8{> kj y(3-'RJ- '"\*)@ ߧ/DgD <)9ojyF#(w&V/W no Xi'&j׸ʟ _B%h4'k ܱ l ش `4iE_8*, V >#Q'!3"ksb}L@E"'&Q~P ?R7L V! !QXH)dݿ :y0 nQ i@i ?J!,k.2(G r4$" !J$! Y8d/>. A?}C: 8 nbZ*DtS[ e62G  Dz{0hv ## K{i/M ; O >JyEF-] G @ @BZܜ @G tF=  ?{ 8  IE F:juzVu \}o2H\"/(?po 0Bt  k(U#sk@dޔSRf${"$e* h : R;,l  j3T=EKf}֗4D TH dus\Q O l" 7!eM d-_.L#/"&Eb V2PiCQ[>3D|PM(L%gG d'BA_p`- lA  PO``M%G q[(d%TLhH v) DBT3_?ղ'y^B~2~b!16;c F D B`~w Jmn5U8ENRR*>IFkNh p# e"R aCe})6F CStR {q& a[ l ,RQ]4 qY *i X R1J<|* 2 A2$Fa #h2:bX { ~4!fxWw yoD' :KxGU7*U %   ]  o D 2)s*;-W r. o ' _W L ^mS0Vn|M  } #JW+/}  c,[7#% :'mZ{R >+Gh~hR_A@T t W Z qa : D1e z!Y%d%3+ w 8 >|T$tF( ew/v GWjd1p<MO' uj H?JR sSE rYV %a")+ e j!-% vv43J׊K(v ge  /;N+S *, E: '.Gn/!Fs .WXa]C Fg S L=%''|KKv V z3q eR & | m  % H'e D c+  }i"bE,, % L.|"%\F&. W'^&0W- ,CYA?2A!)+do  (6bF ki8^: zi}$w `<]"+r [6 d -4#O FيwC}(!uj7mt.r>' v f #,X-`'j&Kh ('e=  T  * " E Q}) Y0rZ @ ' DE y ;,jڵ ч^О\:6Q#"u] dD& փHo@kϷv Ħ \H! (2$h*A$ "o W) d` /A26xF GT P%!$Z8*b*O  Eܞ<pW  uc W [Z0F fXcu'K&# YS]#ӎ^ ۛ,QV&6("d?hD%1 Fb0/ո/}50z 1EN] T4F<0h  2~7 ,^* "3X=t;%w2O%͐˳t'J ] HWft"i"1J%` n A  Rq-w Q_L-Zzd .} wO!+.z)!iU!{0 LO|B oYtݞ+jz lsv8{ pr}|&@2ks-U,ro{ u C 1  ^Z >u U~ o` tx 'Ym i; Vc, O EX`$ Dt}fq,1s@4 = ?"v[>${  n%I K$ rLZ @%3z-^GBd2 /;< d;141U R  >Ta0( ! HAC|\hXy]O% >6 v iz\t93y ",c1 +A@}%~ f w K')Dg#|_~@m $6%hY)Qp  " P   R=ܸ#r  - 11,0 3**&<%{ <q.O s:N\ D #L"8; @=|[Q7  pC ujUT m!I #$[I-. $_F lTؠ֦pܘrWYAQ&S do e# r.$l,?6YQx*, 3$=X :?,q?*&  b&  Tu "!p0ԏTgrEJb&I0 /g)s L[mQ ;)Ԕ n3f$<9 5B B- t KE=wqz6G#J&! |1 u_[^;>3m2nUI d"f:ϴ! -a'o9  oL(Nvf^*lZ&@CyL-'lS )=&%S)R "s'.\2,-E sܖ!I /](: g)OZ;S%* A~b O/kEvm+L/ '$.Ny /[@*,F Q~ toTr` 6Wm A v$$, c}Jl  P 4P@:U r9#; _ $ $$&(RH&! P `!~f!m H h RV#<z R  V Hf n !|IP u($)d G( ''  Zֵ < h"'!wntX_0JY+ Hz yexM2?X [& v!m .  : Ya1'&> ` Y }8\ &sNR '  2^py@ KtLCc$J0NuZ seo; C4 5Y  Tne&| ׁհu F < \ Hwb 4? y# )LpW'X) <^f~1  jX;Sbx  &?qhf8T*ry_J~2 e:^e -~qQ@r^?LQ|*@#ilua i%3L{xvDJV*} !["I^ta8V~F ;ܳ"{   xw~f6Q%Ed" C %.YVhXt b 4'x5x y*f O<|Y`1 I-0<1F4J>k  @{ffcyN5BP $[c*2CJ8(k0V 3-@!:jK2?2*8J!%y7SU"<4  zV-Wg!U#Q r 7 M2J+;%T* ) ׶܈! eW59u w 3[ Qcs. O | #g q I\Tc9;&GG##{d6 k[8ص !V!" *UJ u\ fH'q ,| C$xM`A$ I! n&:4o &AO([ؖ[ف5* i  $=0, _:(@I O aE3 kOa  K*x?ޒ lC7M ~wJOQSH  `S [7kKJ m($KWa1r} ~ 3 !a8Q Pk3WsP GPm"b_ ZOy! #K+WgOqb )s O#m)L E+ { Zebguft, ! #%) mPCzv q Y~!lz)'W :z$0R^*   +%5aGiRt8pޯD }~ 34T !z3 O5WcQ)f\K%M)| A ,MO`kڻ޲{M BB}& u $ 0 OP;F  = +Ef F  h3^2*A3P (< w f M' kj$: K ' M;hr?  E:j$ H_J>{BSV] h'#h.., @M uJ}p1(SC]S'?-&$. -"|R@x"Eu#|+&j0;iTEI^ #Og t<u[n   Zs5 p=QZ Td G{4SF n `KR [ 9H)%! 9 R< 7p ? ]D;& 9?!Z{1%qp~ v- ),-Q5uq ]oNm'5c) $Q\:_L) B O5WVDZخ{d_Y*T.%8 a 5C{S TuU0 < N5j  0a# o) uZ)!m }"Hܝ mԒq>ߨn V|"&?SrE֐m#"G $$:|Ry!Ih^ >i8у H"`f Q N = -".lm h,D  ejw$ |Gjpr-."|S < D" +Q N 7?`Vڶصw1"$&\ ?! *>>x  9Mp9  D,1&z(5nuFKB"B'HI=_g Mb)4;1?;zI -V  VUz_M- P 9O< R )QDoߎ  .x4  ! KbYK?j,cL,^"4}zm MpE%Q&HS?U  VH&Y G!k)r-1# fM;#߻TE?]w(gw*Nt }hm $T?qC%&zVvb2%O kj-fe sm ]Lc T#Je e^~.I H$!Xw33,ۘaM1R1(, Ea JVUiv* ::ZD:va K# jd <ndLsxswuV,)@8 J1 W lO{/ $ 8[@( & kSx .%f"in#> 'x!zBC2 u- n   , 7#  m''Ao  [7^3!i%y i 1be{/2@J| + n F  a{#^r  }qq b cF4V LT[/l?u'Y 3,q  IJ+  m xj0 GF<& nEe$  U%RNTh bKi!zjGqt &R$M"]HH [^%'IwH?cr] &"\ZD %yY-xu . ( {JdU! ^"d\ by )(/"xb hI C4c- !mQ8 } X|o1Z#Tt=/,RV  (iVB ]fXm t 4 []n$$pjIW+4q\jx2Sh_a/1Z 2MeP q"%h Qn!T `1:bJ{gicO2mAh 6 b R ݭ[~]H#1&i~  |h f/7 *{  si9  @kS9qNj)jG\ uf!!F#` vq ;dn,K  Q ,!T-%  G3D8 Bnza-AwCc).vՔ  S K{%['nr+c\% A}r B p| U C ' t  )$ )!qz:FhJ  3{262 P7wz 'O0 Ggao 5MS8 h !I t& ]e 3o"iGU"(-cY l6YZ- Gko9 b_U <g d EMF9 PL kn z j#|=W $ ;=:D.md ObW  4<ncc4.6 ~v}Up W / 4F4W  Ggk-"$<\6VZ Er@ :d @E$_dC4OxNBwfp"HUyMA2h_5b(\Q k  4H o !9 Ch:Fq\-o7O  X <2js 3ROR  , Q,A h} 3SBp eud2{HW r' Z ~Zrw_ ~t7 s+g >^ߧ^ w 9|H d [KI9 az3 C ZI# L94  BZ<  0TOd&  . aS iO l t ,w}  e 2 c2h!lZ& )  cN:U73 _ B M 7 YGDK{" 0i09?6?HLb?q#0 er /[CzD[D n F 8Q+ /5 b  b $[fg\gsf1D  ?#-c,j u  iElBH}} X[|Z S wYMkraU}Tou/Nvp.'a x 5 W  RABmefNL"VmlrsLuz  rTCbd$(RCH,y # / 6-UUd2HRE s[P2ue fq @L%oI9eWU?lT" Zpkp6y{[֡tPW+  u KA>J8H?b ~ . D    ( a8|c1QG \2  OWq]  %HX)@; 7A!?n;*<  '-  : {[ ?#K)Lk{ZA r:C/ GF'}~-Ku W vQ}*VT1"d{ 1cc]WAv\rIX  [cNN'Uo Sl  SYCXiz8_u O 0akQ E u J L IA)D**q= 4QMBq{ WEB8 eW aRlCOa{ _'a}lGS  s 7 0g OY| =|*9A~<{ T@ty'4lD_%) E{ 0< \H ; Sv - 7 a S.5_CyA>     U <}mKE 44=(% +nq - l:yp 3$2]= 8 1\}%J+?^<\#&h5 _o ge,'* H U)  ?%ZU/<f& 8 EkIHVPOf|s %3lv0uZ- l%x_2` ^&ud_R|z#:I  Q (jO\ 8  9 ' E[w82\iN! )r$Y /#_EheCgNvGoC? < t (. JIu [ TPiWBt55\Rce t(d o`zy/aݮ-J h(%zwjeO| .CORF P -r pXBhH B[H d X    [VruU ~#(S Cs}z ]6Q u8gD; '/'C I7R /o %U P6@R. F  DO t#bwRw9 v V @M   m`aeK`^H ^ &>l%G3.6VIXG#OsVyarv7 bfQ$D u%{4JsE-~Q' xt c&%5 HM4}Qq \rfP |smQ . ,4 ?k g3Z3lERvjYs3# X zDTG g9G0  F >6 9mI sn L OW x;`d pZ <  ,!:: q hkSAR j`  y MUc1A O a^y0>F-3l-] _4fWv+ `( :7 u= |l + ^ 8uBIJ]^W7I,R ! iZ ;H KO4y ukqOJn`W!y <QA ,!  3K P 83Qt. v75   f /G&?mF@g1) Fc Asi=:  vL _ U_agiA TM  3 633l#pqcE+{}h 4V  V!_ | y E . "  "O H`@P!M ] 3^ bL    @I]7F h q\wWT}m 6 u~ 0K[5l*0r|7 UG 9/e a>~~ WQY 2E 9>Q*,bV? a> J(!Ec2qdk  8/n  $9|0r @wjZfn?I~4 ^=l)fG+Bf#KdXM}"Y_ k`-2: ]@\  R:{ f 5<  <  U{qo m1]AS7 & "O9=Ex  .1L!,|{iY=t"NSW HI[K0f ~  VE0`*F w ~qg 8Im%X]`wY~:Q9q;a5.2 %RR w 5h v#GZxW2H`X@fw sAo>! J"bmloOT|zf'K3}3$` A  Ry{*X(l @-r[[M$h  < /  e[  b _ #! Bn LfVT /Li'K  lPqaZ_8@# Mi  #d  F x 5/Y + q '" y"'j M `] 9at C >x ND = 8mN c 6߭Gw0M  F#rqO6e~2 gv ;kM4k + -x0 C;)j@N#  fQyw+^Q9 etAJa xN=TT!  ;IihF\ޑ?v/wM H 5  qf &M&ZY  DUS7e >To]o|^/uH g  B m/$A+? y<81E3( /0 ? yJ .{)nm= \  z` L8/2jJ  K$_q q3,u*MG_2b;4&6D:N ?@G 53 j U O kVnKtj2 m!RYwN]YhdH--+WR ] \ * W)rn4" *x\r$Q)q"xW h  & SJ8e %E tb>O >\2Jb % U <1 Pe t uf(aJv@@FTGft. { _   a JgV1<5E{s4eMt - 8 q1aUaQe)6X t aI@c_hdW {e 2 ?`)BEzVVR  cp  hM5 0eQ )eh( 1} S%:2Y# ( S3  #}Y7 rD}9g'`^^ # Qbaxm0v j 26Y*Y3JvdIRs[`_ " ?I ;Ro{k6 AA 6 aCSHw8nE C 10'x+* e Y t~ [}'`_'  tR UP&6P  B G?q%{84 a )aD  -w]w ]w{CwbuPKu V 'UP!$KXiw&hM kOE@vg H  2% =HgDR,  y' aM@#6u&+tX }:S8US C9 v !} Jh|9u "K M:( ]eST 2zd H W gS:/Mca4PF9Dk$X YU9"-Ml n\y1G U ` j P [F 4 n=m92? Q8 H Q . ^93}'yBPwzP(q=>%$ T f :< m]8 i%^ E >H*2|X  n'E~y)7CS+^ ) 5m9 o'l3L hQ + .=$3u`t%*:? LDN|v R(9 # K! ,Y@ s B1m+e6 oxb( eZM;kCo+^r/[hRZ8~v`Oy9 .E  6 )Z<+7)SbP}z K ^ XXK 5  ~D"z'em{T(FkcKM6G`<1i=5zye.I t#2`LoYnk@5 *}$Q##  `Yk*-~ $ v  "[Sc"- \ 0=7x G" 8; &) f )YZ&/@=\&0i _^"->B<z){O0ha h${e+ zx (J""?Lw(p7   [].vo_8oK!A g 2H r9 y GMdn\qw3RVs/|4E%*  X?> R3)hH@3 G!il*RYn}`. ]2N}[r}h+Vfq$HV{ZX#51e|lQ z @-Mad?`e9oa-3k!tFCXfxe y9m X e 2F()p{v|lkDT]2Ny 0 { X6 | Ka A Zt,<d=E~ 1Fi [h H8(YoR -#  :WSWnU19#"IK3b'[g?L$3QwlK v= PV b\\JuwqCmFO$y fx@{~tO 88@a.R2-N9NKh wA#/-m o(}!O "Q 5  Y+o@tl" * s! @= o~ %J&4L{|\GN; Xa!x. :r# ]1 c ) g2Vg<K"^   3ce[xi(`  Aa?]ksn yqiOe)S }UG  c8 E'' @;'^$,loP ~28<7SWe:b kXe&J  T#i-bDn^.~36BRQ\nO17W AR t w;xx>-{f 0 W c sU !. ! bvN4 Q ".r~H C %-Xm@* L 'r-( tR;U}8m BsLz-QK/]] ojZ%El   JW%CSJ5K[W<q  W\c!Mcma O;^N^z ^ ( \3u  1` m mi7ul6 tSml~hpJ&1i7  D^ 2RD }!2eV;B {bN@,pE:D8 QPS@%_PKMIW$0IAu]L`-Sl56O"PNql4  $ "e!Cx6B QC!Mv3>x t  b4(7M'"  7ijOy,6`,Rt*D *R ziF*e2C% Dq_}CZ&$XI P!Y3 P 2?S < !z A =_s2q-~q$/E{: @OUl(H$ B *?HCm 8bn(#_Cr"GMh?=UIm 32ToLn}t%u : FaMv|L9%?    kMU>+u6r '.X>rGg2TGL^w> . 9yzgfcefv(,j_s   o#]5'g 9  r|0'v C2DzrT[KE C  ;xuh` 8q!LegOHfi} !(?9.or6RT6 .Gpqrd-`B__#v\.MAeOrjOI(RS!#DJPzrPsXa ]-gqzxx Q  k1[&v%Ip8A ; 2 lvWG:qe 52Q|J ~Iv #tB <~ a6M8CL9\4dW'QB(qKVMa vEddqX` ;6s tpIcC. TnCYJ:$O)g-K:ctz{d)'vW]<s84z13, {iT/[(RUe!80$O_4P9N;K)Gm6`7-; "t;]+J,+KT69z@ pDWAVs@"X*R{5BpjfQU|"]=9 w*F|Mo4FngUxmq2 92h=evv-ppl l l|`T XF XelH\1%}2^t(iO>W%z$HX?VR@pxF ADAL>Si r~n$1c/ 1JF) <_yz94r1i0f$lEWV `lC% 24 #z3 l(Uc&]uA c=THqN ILyh u %9"=B}'?uK5Q'T^2 koI$Y# gyYM#Hwr0"t9~Zl/C3,4~D?kmH*,;kM]Us@(>?i"ocdh1CT}ys$9S]6)9Q3h( opi <Mb/3oi+5$VSi)3o=ZRoe=4ja F"J4eQUVZq/N#Tn eh PRiGqH-/5srxZHR)6IoRO !id;j\v'nI QQ ,VeTDc9 *+sk-7zwIUJ/LgL "tKg]*QfL 6`G a\i+Y_Ty/EAV~y=#zF)t2@&#(_%pjJ'.jLL0R64<TM 9IbI  >hi# >J<COL%Mc=(o+iNzp?Dj6Qk#klM`In'%w[;$ 2hCX m"H=[ #lMDEYFT.^9O <xwX~%?\ZX-}Iz`s_CC?Zg$0)jP}*~l=DjnO%u;oDJ#lB4Ai' mbC [s(fM]C~[{^gQu?:qKB 5 ju GY}0HS@N.gZ.c&6CPw'W:y:i|wS{gsYZ7A>%.Cu6`d*I`K. 2bR}}jL"*UV v,2hgMIm(,r1@tQyr`ZN zb70t$[Rs=P0`{ o9r]G/uBfQ']K\ C}x'<ZL]f%r Ex6bCa=T g%qODc_0:]y WA|@js:[)8 %~eEpZqkG~,3'>V1;eEwm Qa+FVP9H a^ _`*/v1{7Rh*Xt38%}= @{ S:nU/#TF Q.LisdcnHsiz^q31gwFDf,\S*:m4~_[noiX@`AR7YhgFkwPMC#9VRb)Lx :8l$xiBMP.Q#~.T,n`u4[2uPdN` {;U3RTXVzY 51,4WQz-}?<qn7h Y3E0Da8"anEvcQe>okiD 9sFYlzcBI0hN$QpFEnFaS-wi Me8*.FKJ(Op;a ?E/.uz/=e*Bsm?}=r`vJuI}t>hyIP|WsLVtzvr1zU6b;+ zwqv Lpl}O,^sw/'Ew 6xl@tA)VLMBLUs#?xffg s;BlA M`Qzm,a~vWon;94_NIpw2CT\PnXz*PT$R>w  ITImu;>X5=Vm^x"p6n}OK q}T=Y#x# LNjrF5 #Gtmt~hXFq23T u(E:Rn8'$qf.!{0IROf6wZ F@ C!,C50fN%'/1/ lO\E_3$7DGd3ZJ|08!/jJ.Sg7:sUiAx8 &AVV~:A'=8f9iP-}<^,yGz!1K &?X4jMS}<VNH=bC%w!\_vt@irJ*g hq @f jym _q?l5Rg9pabjI;hxB8 8LV<yQD<IL] fjiiA`'9B -%L$Z=Subm){1ddr*7jr!6WDJ;dk3 j7n .:4/o sz(GRX`trs k/+Q9DV~5 Seupe/`ki7vlb%Rq.x n9|4w]\Bs|Ggkq0u=1<{ u2 tELE/ t@::\ot9U@\o3v u!i-3=Na?f^ )JW4D\d.R ~E"l| $/I5b Oftm>[J|tnMBw:"/_aC<R15f3r-E!(#2>?JWTC-;@?A*1RT/ %F`^;     CJ#    bzflag-2.4.2+ds1/data/flap.wav000066400000000000000000001134421200563112200160160ustar00rootroot00000000000000RIFFWAVEfmt "VDdata[N^oGlFvPEuE{#b C.n;r0 t \ " I w  0 C Q W e r   / ? R j -If $4:ERU]belmkfifdgheggdife_aUJ2&wY: ` 4  t q f b Z Y k  N y UM0fIXhu~ '7Sl4EWm~,7AQ[`fnv~ysnhjgr(L{>sJ)W-1*" lG) n\C-|qcZSD9)sh^RC4*++-5CS]n<[(f6n*h;p";Zex !7Hf"Hv,] &?]{seO9& qK'}[C:BABEMRX]itpV@}Jr;.a)Y(m.['{Y@uI"Nh#+tJs E 1  O  ; @L}6QD b W-nN0fUA- !(0;CMWeq-<LYdnx .?Nal{ !""$!!#tWB'o]B( ~bF) }>g 'T+taPj;_'sQ3qbTG4)wT`egXCFw2Iuda_XRKD,uQ4kYH:- &)'#""/O[ac`]VPI@97005;Ji7cLp*Hz8k dF}L,iFjM&{W<0-;HYi >Tf~~ynX0gEi<f\B1 '7@=GIRWXWSG0!~x"QM"oSdI]:^"),//0,-,)%!   &:Ul;]} '=Ue{~tfW8rG- zT/tGw@"];wL'Zf4i?#tI%m2f7 uAu#~)l0r:lZF83-# jO8# 3Qs/fMETIk Du$NuIwI}9p M1mQ V%X2u"25ADA72)7BTj}%Nssi\J*n;1K{EvEyO`7c:}Ml)_dP\t-rFfO8Z RZuG:G:|TjNAam`ހިN[ܔ-۵Cك؂ثP֯?Հ*ԖlAӥӀT(ҏ\ѳt,ДEϋ[ϻΉHͺyC ̚yY=˿˧ˏbʦn*ɴɂBȴȎkBǷǑf+ƼƑO#Ŧz`= Ľě{^<$Jǥǩ 3"2Anȓ9x Fʊʸ+FVkwU6"ʅ;hǀ>ƙRĮ4‘sW: $M𷄷8߶q B۴>$58Ʈc譙2جK٫kK,0Tq˫ SH xSF<Ų ?Xzس9jKѵtȶA95avȻoƼV%xƾ Jڿ,yJ.b¡NÜo8ŝTƘiǾ e:ɔʕm5_̡,s͟8c @fx;|Y3  -LCA$8(BaA""(0*8Ifr7IN]b\[VB)i=# qR7/O[qgeZUGKM]`V7]OsAHC;:"JpB3%3&292 5s%Q"MtzA1^Ff,roQ)xeH4u_H'Y^3^U?9+X;PfiJ^@mB'2Y_:'  uGwHzFVq(:MsKxm z'EU5 h Y-VuiS3 c$|3 w 6 M T c & r  XtK^a$v4ZUOI,'8Py}.bG{7d[$r6AF[Bg#~Q1E [!!$"""!#p###########$ $$9$x$$%B%K%C%)% % %$$$$$$$$$$$$$$$$$%%%%$%%$$$$a$$#_#""f""!T!! H #   ' ! -  M;(X+2@PrP`<4#c@f0Vn   q + I_$p3f4ByK C+%Dd#5Rq-;7-)LXLEZ%AIn9X:tX ` z j c s   !  ' z  Z       > K 4&8qI&zD"t WU"z0D?PAwS* 5!!"""##$r$$%&&&'' 'D'O'n'''''''v'W''&E&%R%$e$$#8#""q"$"!!~ m [ k f C ' asV%;?Uy(yopP W2_.zKYLWM 9 y !!A""##$$%%%%Z&&&&M''(H(T(K(@(X(o((((c))**y++,,---9-a---...F/V/G/$//......p.W.K.g..//Q0000}0q00001=1b11112/2222 22H223u33433333333333334|455c6M7(8+996:: ;;y>>?^?? @@@YAAABBB)CRCCDiDDEEE4EEE_FFFFF{FFFQGGHH=IIJ&KKELLyMQNNO PPQRzSUTU VVW/XXXYxYY.ZZZA[[[[[\ \?\n\\]Q]]]]]]](^T^^^M____ `___^l^] ]U\[H[ZGZY)YXXWW.VTUPTSR8RQQPPON8NM-ML*LjKJIHGTGFvFEE^EDDCAA?L?>=< y0 ]p38V^GmH"4T%p7{/%DdYbSJT;iY ,6Do[~jN_j0$}_ >C>=W0 W qF]eFS l<[fpl@=V5IMi[ }B' RF_(q}wBwh=L9_?BSd(tE 3*2s`|Dwc9 w  , F / C d ^-OWaLtF6F8lFSG(# ER W     f t f r "  W { o R \ b \ o 3& X  > a k & / y g U  (k#7pgEG:U` k!!"%#}#a#L# #"""""'#H#>#"#""""!A! K  }"DZR)XT, 0!!l"## $Y$A$.$f$%%&]'z''''^''&L&&&&%&%#&n&&&&&K'$(>(%((''''!'&U&)&%{%$$a#"!! Z -mG>5{EWv(  O !! !! Y! ""#D$$%M&9'U()*********|*r**>+++U,G,=,4,`,,---_..a.V.u.4.---.-,,,,,,,,C, ,++++}+q+z+r+M++Z*W)((('|&C%$#!"! mT]"{X&eYO [ k l 1 y \!L  3<!b$HSp{nx @ V Z ?9<}a( C - ? { A iCZ61QjjGo3T3O66)/E GW|kyRox M)H;cL;J\+\OZ:wIJx.XQUnXw0 f$@6/cj>aP$goߩ߼ ?cگڋف -ܰۓJܮ^fߺZ5efwIT7b?~Z|0U 32>Wh I%F(G&Hހ`X۩ڍكן՘$3WVѧ̨YQdžÿ[=ݾܽ73@"3ƶ^AKd]n&AJ\C0[&ȯ;ɸ*2Zd)IحN:Ovr9%!f :~$}]=x8, }~dI~msZU3,.Tv/g{4i!ߧgܺܫܸܫX6ijڽ_Nטׅqارب؉أSٵ-}کۻ=܂ܠ_Sڣ/O>SP`ؔڪSޏ<pEVhD5CrEV `)An;5 `{w- Q7 4"l$p6D%bI+ TL[!E " Z  Q[su.Xe)"/^l*s  + Y `thv[_y4l[3,:k(WETo/p-J@6+߃`ܽTܸ۞L@ڒٿ-<%a׸ ׸֚Q(|@]ׅ vؑئo;r"iܱ ܙc#|SaّGnM.ۊsۇۍz$NR(؄֢}Ԝs{"^ =ЕZ7CКJYkϴdаxҲ҂O$ hгВЁV/*]@ϋ? ZXІ>ЬϙcРϤ·:ΔU͎͓ͽjΰNςϰRЙќҎӪԶZڃۍ:6Ca *# 1HGu^PI 5o#;a>pcO3H%4jJ%g w/8@dz&> /"Z!?$ L6!C L1gQ;u)}`!R(!S ^ Z Q u  SI}/XQ^ "$&$(W)**,.u02456P7P879]:;W=>@YBD\FgH3IoI8III JJJIJcJJJ5JIJIHkHG+GFEFEEDDFD5DD.CA@s?=;:8O75`54"4232W100/w.,,,+++$+*#*Y)(('%$%$W$$$#@##"## #-#####)$$s$I$$%%,%$G$$)$6#"!%! .  z 1 < ] { !"2#Q##""""^"""a"!! tPH/)Er Z  m fyg8FkvJ" "7qT+  $ 'G ?v +` \ S)F\##MoeaT|wo UhM 3J!=+)(or " 5 ! -  N .7{z `&R{:9$c@#[^%S- AL 0oqO4JU3- ?iueclxA$.HjsQP0}(9au#?vKs-g~IF0+Ab)H!@cJ)KY1)-l  y s@sm,nL'-;Q`p`o |LCEY0TwLux6/<y>PN^M3) n3j^  " E ;6Ye$JbM8#[9*  r s Z . 0#(T5?yKUdJ`uF9jVr+eXtf%Y(RL+]9p@GF=x%_#3>{.L(p<'1  emWkTj"se };m'U F5m2bA)}+cu J  LOf!/TPNi>~62ZgLeH!4"2#mbU9R\b4Ie)eF>hn&Wv?Vv Xi(KdYg {ڿ1WiLCQ4LԍRGӉ"Ѩђтѱ4ұӸ@Lҗό|hz+L{!΍θw1$9ΝG_Xϙτ/ϾϽаL]sm6w٫Gl];J߻ ]s Bi@X hK1wYAkCgD8 :*@\z[ 0 w   Q ~ U  @ # 98|X*S9:ZPTNwS>-"+AY4WqhVf#i}?`>_d4 #CL3"H   " @O(L@6hX Z=,L F`v%ve[~='&cM.{,@=Su+-.Q|TGY\OgC @~OCY $ 6 ?  r i lt=&l-WT*q jm':H|]/bHzzPJP^K 8b;E"H oJ//J\nX)7ZPnzDx$-Z>%u$?gUE . = m6a^ k% #dsrt\q]Kd"lYKpz6Gy9L t T  Z 6   bqS9tl>a?2G@QF%5wu[tX;]hl z`x@rJp53pyh2#9 p ( m U*fj`m]VJm,WcIC0xoA6I9fAF C n^l}6 E8E9"*z1QFAe b5w H36[j:nB:AbXFxHzx<C_PR P>1 AWR 5 o + U9RP".TBg(Mm%2Q$gu}w~K)`F  0 `  X   p ! T 9 [ %     [|jI%c8S NTG*Z OUXvO1)rieg<*`Y?^$[[ C#Bn 4߲{ݟNۋ8ړo8٤ًmO=,ؼ`yI֬p$Վne~ը  .=H- ժՀN+ԡf&Ӝ~tӞӻӥӨӪӯӢӏ}ikyӒӠӹ EԇԶ%*&9_Նղ;e֙B׀׸<؆Btٴ0ڀ-Xۉ/jܷpR{Bo 'Q.;c-c=uM.6pqHZ#IB~?+$(FrtS/ (*4b $HnmkhaZP< 3CIYi,\$14957Ea"RlN7D!k^ZYH7'#5Mhy~]&%);S|ZVv1CIO? 3^CKcy ,CORO]gniq $Oo]Dn\3\-}>v$h!9jNIC%E$x KZ 8 ,  x ! k 4J~T'K_fjZ=b1l!ysx xEw8 @  1 5   * e 1HPUJ?;:82' | w y P  z V (       ^ ( W 2  m Z%f2sXSF3v8{$Oh$yO)mNANZwDD*h=p1^U+Z  P w  [ . n  j ha0['j&Sv!sX=V&S6lQ  |c+ !Y!!"p""K##$]$$$%X%%&&&V''o(([))9**+k+++,N,,,,,, -#-6-P-h-v-------4...,/y///$0Z00000141N1t1111122)2!2211112>2U2m22222303S3i333333334444;4i444444r4H4#4 43333333w3j3]3T3Q3A3433373*3322222k272 211N1 100`0"0////{/i/U/9///..........w.L.2..----E- -,,?, ,++<+**n*0*)))M) )(l(('o'*'&&~&P&&%%M%%$$$A$$###J#""7"!!&! + X*a`NS#l>vua0SAPe l _ 7  x   yuByz)b+0HhCw1tG]!T ~oYC!mG* WD^x`N= #4+  /Fl@s@%[{m\UUcu!DfpE>z$!#;`}-y5NhS&=n 3Z"0<Mn~)7CHSj%  ]'9~O'k'Be4\*pDe!eK3,F+rCo? [-i;_A#a~W( ?DeBa}v]<}ojkr6DJWq 9b~2HU^o ?U_h5Tn/WnnHf"Uo1a'vq|}ugL4~y}}||&N~eF+ /Ee=a;Ql3LarsoZK,,CXr:h3Rw~[=/&09?QlY=`k={3Gas .0(#'=VAcGLQOMMNPRSVTSYbEhW#T} ;Sy B c 2 i  8 v  H z 3 t V#gKk)tRN4Ck+Z*16:FQa|<^Aj>`&_2k;f>f 0 Z t !$Z$l$t$y$x$n$g$Z$V$O$M$A$3$,$$$$$#####$ $$4$L$b$r$$$$$$%4%]%t%%%%%% &&"&'&0&4&?&M&X&\&a&g&d&c&`&Z&Q&U&c&r&&&&&'5'Z'''''''''''|'R'.' '&&&P&&%%W%%$$b$/$$##X##"""P""!!F! a  }1c~7~?m(ZJBr5 cO$PqP6oP:* zc@d'9? F  0  P  o  r-w6#Bq"x?`2oI*fB%{\D-$ %&'#"   |qdUA+ !(,/321,.'  pV?+yaA$sL+mP:0'  uX;!yX:p?iB)weU?1' kK4t^LG5,& pV<" kN4veWL6) xga[PNNJGD=751+)(*6CPdsxj`G/{eH/y\E4+,0;GO_hy}l`PK>/thabafifmmsx|nQ?/  9l:RvrY:sbXSOX_gmssv|"+?Qm1E^ny}zup`O>& tfV=! n^E5}z}| 0CXp #3DVi&Eb7^$@Z )Fi$.?M]r -IbHP *D]swsruuyvyvjZRIC1nG#cI5 mXRW`pu{ojd\UJ9sN r\@%~th\NB;4-$uh]TKA3)  Bg 6Nm3d/V Hr%2=BCHIJMDACDKVaiv h  $ E _  + D X h  * * * / 0 3 : A G F A = 9 2 * ) #     - @ W m y ~ y l f d ^ P G = 6 2 1 * '   w f [ K 0   w r e ] T H > 3 ( "    { r k l n o r w {  } z y t t v r r n l j e ^ T O I @ B B F E J M R V Z a n } x ` N : #  } x r l ` Y H 3   theb_abegntwx~~sobaajqw~rie_XLF<7-,*+(! gV5"}skdZK9&  #(+/:<=71)& zndSH8"   thTG.p\H=/+&"!  skcaYUMD<6*$.AYgz~o^N=*  $+,,+*$ }siiefbZN=8)  xopunlf^QJ7) |k[D3wfR9 vcT<1%lH)wZ@/qM/tV- rZ9jP; skd[PC3"xY>!b= qL(|Y.rWA+w`Q:$ lTB2'  !7FYm)\x7Wx6Nh{)AYn -AP`o "4BKVap} )1;HSYet.>Sfq} &*42-118BHTYejrw{#6FWjx 6BSiv !(/5?HOVan{ ;Sm$.9FQWaimt1GWix ')-5=CELRW[epy  !-7GVjv";Up9Vn *187=DHQRZ`cfidcZTKC@;4+#"',2;>AFIIHHIEC>60( }uf\RH@6,xqh]QG<2,&)&-+-/,/---*,-,(**-010('"   1CQi 6Vj *7EUar{,Hbq%?Od&3<HT\bemrv{  !&(19?GMT]hnxwmf^VQJGC9650)(%!   |rj[OC8,"zhQ>#~^B( fS9tf\TE=4)$ k[M9'|tnb[TNGC@73-($  $3BO_ov #1ELZfjx~}rlcZXOIC>952-(& "!&+/49@EMV\iq{ $#&&(*-259<CHSYckz -CTj{ %*.6:BELTRZ[`dfox} $+4CJS_fs{  )07=DKSV_bjlwt            !'*-126888<>A@FFIJMRVWY]bdiioqtxz|}~}{yvqac`\XUQPKIGDB<960-)%"  ~xpheaZVMKDB?:630,*('(&'(&&''*-148;?CGJOTY_giosy}~||z|~ztqlfa]YUQNKFEA@?@?A@BCDGIOPUY\beinpv|{sod]XRNIGA>:82.0-24566<<@CEINRY]cgjoqtxz~ywtnmgb[URMGD@<74,(%"  qg\ND3( zrd[RKG?84/-$ ~xslge[WSKGEB=51/-'&"!%)-14<CMSYahor{|}{ttpkhe`[VRME@64*# }qcTI?1"yqibYTPKHD@B;;77537589<<=?BHGKNSW[_behjosvz|yxutspklgggdccb^_^^\[WVVUUTONJJFC>:73-*#yvne^XPI@83*"  ~xuqke_\[UUQNKKFEDB@ABEEHGNKQTX\adkpuz|xtnljdc``b_____^bhkrv}~{yywxuxvuwyyyz|{}~  ,/;AKT]fnu$.3;FJRYcks|    !#&)-/3<BHMT\ciot~  %-36?EMUXbgktx            ymgYJ;0"vf]RG@3,!zocYOA7," |q_RC4% whUG8) {pbPA3%{qgbVPJB;30)'$   (/8>DMQTZadhhmrtx~09GR[jt !,3:CFLTY\cintz %.:CS[ew '-6>DJT\dipx"&')-011./,/--()%"! !$'/7;?CJQW_ehpx~}yupljf`ZVTMJC?851,)!  {skd`VQD?6/&wpjb[TKD<9/'  yrkhb^WPLGC?92.+& ~}xsmhd^\WSOFE?;93/-'#  %,49CIPV`gltybzflag-2.4.2+ds1/data/fonts/000077500000000000000000000000001200563112200155015ustar00rootroot00000000000000bzflag-2.4.2+ds1/data/fonts/DejaVu.License000066400000000000000000000127031200563112200201660ustar00rootroot00000000000000License From DejaVuWiki Fonts are © Bitstream (see below). DejaVu changes are in public domain. Explanation of copyright is on [3]Gnome page on Bitstream Vera fonts. Glyphs imported from [4]Arev fonts are © Tavmjung Bah (see below) Bitstream Vera Fonts Copyright Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. Retrieved from "[8]http://dejavu.sourceforge.net/wiki/index.php/License" References Visible links 1. http://dejavu.sourceforge.net/wiki/index.php/License#column-one 2. http://dejavu.sourceforge.net/wiki/index.php/License#searchInput 3. http://gnome.org/fonts/ 4. http://dejavu.sourceforge.net/wiki/index.php/Bitstream_Vera_derivatives#Arev_Fonts 7. http://tavmjong.free.fr/FONTS/ArevCopyright.txt 8. http://dejavu.sourceforge.net/wiki/index.php/License 9. http://dejavu.sourceforge.net/wiki/index.php/License bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_12.fmt000066400000000000000000000207501200563112200231460ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 128 TextZStep: 19 Char: " " InitialDist: 0 Width: 1 Whitespace: 4 StartX: 0 EndX: 1 StartY: 0 EndY: 19 Char: "!" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 19 EndX: 22 StartY: 0 EndY: 19 Char: """ InitialDist: 1 Width: 6 Whitespace: 1 StartX: 38 EndX: 44 StartY: 0 EndY: 19 Char: "#" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 57 EndX: 67 StartY: 0 EndY: 19 Char: "$" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 76 EndX: 84 StartY: 0 EndY: 19 Char: "%" InitialDist: 0 Width: 14 Whitespace: 0 StartX: 95 EndX: 109 StartY: 0 EndY: 19 Char: "&" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 114 EndX: 126 StartY: 0 EndY: 19 Char: "'" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 133 EndX: 135 StartY: 0 EndY: 19 Char: "(" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 152 EndX: 157 StartY: 0 EndY: 19 Char: ")" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 171 EndX: 176 StartY: 0 EndY: 19 Char: "*" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 190 EndX: 198 StartY: 0 EndY: 19 Char: "+" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 209 EndX: 219 StartY: 0 EndY: 19 Char: "," InitialDist: 0 Width: 4 Whitespace: 1 StartX: 228 EndX: 232 StartY: 0 EndY: 19 Char: "-" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 247 EndX: 253 StartY: 0 EndY: 19 Char: "." InitialDist: 1 Width: 3 Whitespace: 1 StartX: 266 EndX: 269 StartY: 0 EndY: 19 Char: "/" InitialDist: 0 Width: 6 Whitespace: -1 StartX: 285 EndX: 291 StartY: 0 EndY: 19 Char: "0" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 304 EndX: 314 StartY: 0 EndY: 19 Char: "1" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 323 EndX: 331 StartY: 0 EndY: 19 Char: "2" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 342 EndX: 350 StartY: 0 EndY: 19 Char: "3" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 361 EndX: 369 StartY: 0 EndY: 19 Char: "4" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 380 EndX: 390 StartY: 0 EndY: 19 Char: "5" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 399 EndX: 407 StartY: 0 EndY: 19 Char: "6" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 418 EndX: 427 StartY: 0 EndY: 19 Char: "7" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 437 EndX: 445 StartY: 0 EndY: 19 Char: "8" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 456 EndX: 466 StartY: 0 EndY: 19 Char: "9" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 475 EndX: 484 StartY: 0 EndY: 19 Char: ":" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 0 EndX: 4 StartY: 19 EndY: 38 Char: ";" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 19 EndX: 23 StartY: 19 EndY: 38 Char: "<" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 38 EndX: 48 StartY: 19 EndY: 38 Char: "=" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 57 EndX: 67 StartY: 19 EndY: 38 Char: ">" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 76 EndX: 86 StartY: 19 EndY: 38 Char: "?" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 95 EndX: 102 StartY: 19 EndY: 38 Char: "@" InitialDist: 1 Width: 13 Whitespace: 0 StartX: 114 EndX: 127 StartY: 19 EndY: 38 Char: "A" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 133 EndX: 144 StartY: 19 EndY: 38 Char: "B" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 152 EndX: 161 StartY: 19 EndY: 38 Char: "C" InitialDist: 0 Width: 10 Whitespace: 1 StartX: 171 EndX: 181 StartY: 19 EndY: 38 Char: "D" InitialDist: 1 Width: 11 Whitespace: 0 StartX: 190 EndX: 201 StartY: 19 EndY: 38 Char: "E" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 209 EndX: 217 StartY: 19 EndY: 38 Char: "F" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 228 EndX: 236 StartY: 19 EndY: 38 Char: "G" InitialDist: 0 Width: 11 Whitespace: 1 StartX: 247 EndX: 258 StartY: 19 EndY: 38 Char: "H" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 266 EndX: 276 StartY: 19 EndY: 38 Char: "I" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 285 EndX: 288 StartY: 19 EndY: 38 Char: "J" InitialDist: -1 Width: 5 Whitespace: 1 StartX: 304 EndX: 309 StartY: 19 EndY: 38 Char: "K" InitialDist: 1 Width: 11 Whitespace: -1 StartX: 323 EndX: 334 StartY: 19 EndY: 38 Char: "L" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 342 EndX: 350 StartY: 19 EndY: 38 Char: "M" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 361 EndX: 373 StartY: 19 EndY: 38 Char: "N" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 380 EndX: 390 StartY: 19 EndY: 38 Char: "O" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 399 EndX: 411 StartY: 19 EndY: 38 Char: "P" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 418 EndX: 427 StartY: 19 EndY: 38 Char: "Q" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 437 EndX: 449 StartY: 19 EndY: 38 Char: "R" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 456 EndX: 466 StartY: 19 EndY: 38 Char: "S" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 475 EndX: 484 StartY: 19 EndY: 38 Char: "T" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 0 EndX: 10 StartY: 38 EndY: 57 Char: "U" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 19 EndX: 29 StartY: 38 EndY: 57 Char: "V" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 38 EndX: 49 StartY: 38 EndY: 57 Char: "W" InitialDist: 0 Width: 16 Whitespace: 0 StartX: 57 EndX: 73 StartY: 38 EndY: 57 Char: "X" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 76 EndX: 87 StartY: 38 EndY: 57 Char: "Y" InitialDist: -1 Width: 12 Whitespace: -1 StartX: 95 EndX: 107 StartY: 38 EndY: 57 Char: "Z" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 114 EndX: 124 StartY: 38 EndY: 57 Char: "[" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 133 EndX: 138 StartY: 38 EndY: 57 Char: "\" InitialDist: 0 Width: 6 Whitespace: -1 StartX: 152 EndX: 158 StartY: 38 EndY: 57 Char: "]" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 171 EndX: 176 StartY: 38 EndY: 57 Char: "^" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 190 EndX: 200 StartY: 38 EndY: 57 Char: "_" InitialDist: 0 Width: 8 Whitespace: -1 StartX: 209 EndX: 217 StartY: 38 EndY: 57 Char: "`" InitialDist: 0 Width: 5 Whitespace: 2 StartX: 228 EndX: 233 StartY: 38 EndY: 57 Char: "a" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 247 EndX: 256 StartY: 38 EndY: 57 Char: "b" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 266 EndX: 275 StartY: 38 EndY: 57 Char: "c" InitialDist: 0 Width: 8 Whitespace: 1 StartX: 285 EndX: 293 StartY: 38 EndY: 57 Char: "d" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 304 EndX: 313 StartY: 38 EndY: 57 Char: "e" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 323 EndX: 332 StartY: 38 EndY: 57 Char: "f" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 342 EndX: 349 StartY: 38 EndY: 57 Char: "g" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 361 EndX: 370 StartY: 38 EndY: 57 Char: "h" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 380 EndX: 389 StartY: 38 EndY: 57 Char: "i" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 399 EndX: 402 StartY: 38 EndY: 57 Char: "j" InitialDist: -1 Width: 5 Whitespace: 1 StartX: 418 EndX: 423 StartY: 38 EndY: 57 Char: "k" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 437 EndX: 446 StartY: 38 EndY: 57 Char: "l" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 456 EndX: 459 StartY: 38 EndY: 57 Char: "m" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 475 EndX: 488 StartY: 38 EndY: 57 Char: "n" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 0 EndX: 9 StartY: 57 EndY: 76 Char: "o" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 19 EndX: 29 StartY: 57 EndY: 76 Char: "p" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 38 EndX: 47 StartY: 57 EndY: 76 Char: "q" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 57 EndX: 66 StartY: 57 EndY: 76 Char: "r" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 76 EndX: 82 StartY: 57 EndY: 76 Char: "s" InitialDist: 0 Width: 8 Whitespace: 1 StartX: 95 EndX: 103 StartY: 57 EndY: 76 Char: "t" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 114 EndX: 121 StartY: 57 EndY: 76 Char: "u" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 133 EndX: 141 StartY: 57 EndY: 76 Char: "v" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 152 EndX: 162 StartY: 57 EndY: 76 Char: "w" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 171 EndX: 184 StartY: 57 EndY: 76 Char: "x" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 190 EndX: 199 StartY: 57 EndY: 76 Char: "y" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 209 EndX: 219 StartY: 57 EndY: 76 Char: "z" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 228 EndX: 236 StartY: 57 EndY: 76 Char: "{" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 247 EndX: 255 StartY: 57 EndY: 76 Char: "|" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 266 EndX: 269 StartY: 57 EndY: 76 Char: "}" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 285 EndX: 293 StartY: 57 EndY: 76 Char: "~" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 304 EndX: 314 StartY: 57 EndY: 76 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_12.png000066400000000000000000000161231200563112200231430ustar00rootroot00000000000000PNG  IHDR}W IDATx^1z:koZA/бN'}_YόgQ"Bl? 1c1cyǏozc^1;c;z7fϐff`zy~0+7`v{v772'?ߠ\| j.Pod^1n;(оT }geF>;:LYue\Q ߉]L'2+?"Fl/{~tT,|<|:4dA10Uv77藱'{@Fھl5; T Ԁg]_`dgR0؇vu#Hu%=^.0GƙnH$Frjw%82y(pYyS8CdvJʒ7v>:N C&fegt+{Wp}}΄ #} PvP$(k:QfvP vbmueyK ^Bl ;@ԅzR|1dӲ7zƴgLhty|fGUّ(WeX/3gU I+sW`otd.k3:$#~: yU WtʤrՋ}1[njG/!쵞YF߳1#}(Ntb&рL*feΠcL#e[u{$*um9;wtӥcث "N*L5Q5)v@UZpmvԭ6 ʪ]DgsGpk>Ff5G}U^\<4Πx0>鸿f2f~;O9ẗr@ .g}m66y3;UTY] '@Y\M":j=NvG'dld<:R5+:,`xuG zFu<-8O Z% V+Xz@(gPّ_.  `6J*-J#cI.h?N4Veڵ^WdRv 8iñX4tJ?C]gۻ"x\u, ;B5\:uW]f`4hԳ>OO:ޕhi/b+\et~ cζ ewW+63^`/`Bt&'\gef!{DOvyw7Nە9 '+ufc'YFIad_U3񘮶Vtқ2ehzcGÙvwUYoUuY+tvTwVH,*pv 8 `s?Y; .]t^`>չJkv%ΛHv0Tu&h?u ʞ:*Buk!_MRvQxfJOse/a  KePgؓ*hjFGltU4(]uwtMtPkYyeHvf9|v!uJc%Rگ-wmgm~جrϖaec\ Jgp:3 Qי`]xCUwnOvu' @=>g @\|TT WBl N5VVvg^@ GA[wrˍ ~vY@}׌I~ ֙8u4RwEu1HgLa'xqf3dɠ|M`v1<30c1c1c1c1ƘOS#QQʾ Ypk>+LP/Qj]^hܝ}v:+% u^w%J3ȋ?r=wuT'=uĉWFH/LՇ_:^\1z^Qqlp>Z47+fze:䕬U}H,(UdU9})1 /9TV|[mGōaW{nVe_Y{ Z @Mfo/3-dٷi{ d@;䡎Lz.H!{ucTGmNY ڋ~˫+J(#:!q><T2ԧj;M.Ϡ^g%^e_a~^'2}ĸY[q5 5qmiHUbX:iGȴ18>eP;(\m`ՠs&B,0Xٕ^<ĺ:dFWltCTwەEYv_qbt]^p^teWh۝QwRHs^C3Vs\S#媊, T+@ۨg.,P[qEBd &$Pw Fe#:YH,Wv2rɕtTU}>Deq'WVQ~?gEp^+@lRy v,}5uF6+` ]3Af 3Ymα> <|t0C/:&:TD&c+vJyS֙pEX+98:fD>Deq1dWq8i`w8돳Ջ)ή;^Q_3:Al^ي 4X(vzQuc\v8N ׊瞡Y4g `5 vU[el<*@kBF]9hw:W D+֎r@H:dX( ="J)Vqg+332 ӕlM&Ivrαkslfg umvg[ 2J/_:dF(KW PvӭYS/vmT*@,3ϫWvp\SG8M+`fnϮY1tAPC]ʀ(&t>1EVlÕ3Wz]G!3@Usg{$qڎ@S{;OYk#te- _9hw:CWXG8F& qgiNIVހ+#*mx:R?0k5WV!݁VsVt+#Qg^}b5Ɋ+gG\lYKNƚ+I-tڔ 4`7QgV; :(l#3`-+N{!2ՠE}f{zdW;W Jl]c3WȪJVș,-LV ԱH/]t~u#;=2rHJ~:8IW@1>1;aN:>N[ ;^;\_u=`c>;qd'|=V=Va`E~c`5;ξ=Vc';z)ưGP6$W~$Euρ(jWV8Diu|uuU&gH> wD1w> ck__r&:ڼ32aWW萩u12δHV{v_i n,La@Ox^ל5ήGzf@*NNڝN9;oڦNUOAM+P49U2h"笼rUHէxՎ>'@(Cm J:!WO*}a% eSre٪l6 Sw. S|XQZA6*X/:۬ύDwWGr:v.qo_)gڎ/[Jw2UFv8ҡ}(!cgUf% nTG`ƅL*lg :BsN`NhJpU|;xhL_ODj+dUyEe1@jQ[νv'@LgUx{$A n2U(2X8*",ib'Q"Tl:V`*>]$cg>AY_9{*UT3f2#:8jjܿ#NtqL:!#YWXMT .Ya*&?/ZW_u ? 첣Be}qOOY eenܙDdUG P*:PVoWqC&e&;|Φ;!#YW2B>5 ,2C֛v Ky@g&ήI k;u IR#v.fUӠD?775ڷWmﲓD{{fɨoWcqC>IRI>j˴k UGPF5.k gZ7qֽ:ӭgeXuN' ֧MThxLѠ4\.hFyщ'hܬz?:1Q&1C2uu,Ӯ-TAUY+@6'Q6z&j֣f%} 8W7w"&g|L}"Y;`]M5!8 ݬn ^>Wv5':ddToЇd]˴#u0;< : gfs3^9[ky:evʼnV^Vwa0? 23+!P: c>7/Зu%b13R}[9rc} c yKcĶ\u%`k1c1c1fwWˍc̏>j"xGE%@>U)7c T^ b|K%9M;$xKڵ`1'vg@t% c@&Ǖ˄w<;7^ZgzJ|䄏kʒ3fl|9Έ⌊7иr5PvWu&:7:cNgB}i—쌻3pi`%hn+d1| ɸ3c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1 tEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_16.fmt000066400000000000000000000210211200563112200231420ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 128 TextZStep: 24 Char: " " InitialDist: 0 Width: 1 Whitespace: 6 StartX: 0 EndX: 1 StartY: 0 EndY: 24 Char: "!" InitialDist: 2 Width: 4 Whitespace: 3 StartX: 24 EndX: 28 StartY: 0 EndY: 24 Char: """ InitialDist: 1 Width: 7 Whitespace: 2 StartX: 48 EndX: 55 StartY: 0 EndY: 24 Char: "#" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 72 EndX: 86 StartY: 0 EndY: 24 Char: "$" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 96 EndX: 107 StartY: 0 EndY: 24 Char: "%" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 120 EndX: 139 StartY: 0 EndY: 24 Char: "&" InitialDist: 1 Width: 15 Whitespace: 0 StartX: 144 EndX: 159 StartY: 0 EndY: 24 Char: "'" InitialDist: 1 Width: 3 Whitespace: 2 StartX: 168 EndX: 171 StartY: 0 EndY: 24 Char: "(" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 192 EndX: 199 StartY: 0 EndY: 24 Char: ")" InitialDist: 1 Width: 6 Whitespace: 2 StartX: 216 EndX: 222 StartY: 0 EndY: 24 Char: "*" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 240 EndX: 250 StartY: 0 EndY: 24 Char: "+" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 264 EndX: 276 StartY: 0 EndY: 24 Char: "," InitialDist: 1 Width: 5 Whitespace: 1 StartX: 288 EndX: 293 StartY: 0 EndY: 24 Char: "-" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 312 EndX: 318 StartY: 0 EndY: 24 Char: "." InitialDist: 2 Width: 4 Whitespace: 1 StartX: 336 EndX: 340 StartY: 0 EndY: 24 Char: "/" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 360 EndX: 367 StartY: 0 EndY: 24 Char: "0" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 384 EndX: 396 StartY: 0 EndY: 24 Char: "1" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 408 EndX: 418 StartY: 0 EndY: 24 Char: "2" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 432 EndX: 443 StartY: 0 EndY: 24 Char: "3" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 456 EndX: 467 StartY: 0 EndY: 24 Char: "4" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 480 EndX: 493 StartY: 0 EndY: 24 Char: "5" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 0 EndX: 11 StartY: 24 EndY: 48 Char: "6" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 24 EndX: 36 StartY: 24 EndY: 48 Char: "7" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 48 EndX: 59 StartY: 24 EndY: 48 Char: "8" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 72 EndX: 83 StartY: 24 EndY: 48 Char: "9" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 96 EndX: 107 StartY: 24 EndY: 48 Char: ":" InitialDist: 2 Width: 4 Whitespace: 2 StartX: 120 EndX: 124 StartY: 24 EndY: 48 Char: ";" InitialDist: 1 Width: 5 Whitespace: 2 StartX: 144 EndX: 149 StartY: 24 EndY: 48 Char: "<" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 168 EndX: 180 StartY: 24 EndY: 48 Char: "=" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 192 EndX: 204 StartY: 24 EndY: 48 Char: ">" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 216 EndX: 228 StartY: 24 EndY: 48 Char: "?" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 240 EndX: 249 StartY: 24 EndY: 48 Char: "@" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 264 EndX: 281 StartY: 24 EndY: 48 Char: "A" InitialDist: 0 Width: 15 Whitespace: 0 StartX: 288 EndX: 303 StartY: 24 EndY: 48 Char: "B" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 312 EndX: 324 StartY: 24 EndY: 48 Char: "C" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 336 EndX: 348 StartY: 24 EndY: 48 Char: "D" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 360 EndX: 374 StartY: 24 EndY: 48 Char: "E" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 384 EndX: 395 StartY: 24 EndY: 48 Char: "F" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 408 EndX: 419 StartY: 24 EndY: 48 Char: "G" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 432 EndX: 446 StartY: 24 EndY: 48 Char: "H" InitialDist: 1 Width: 13 Whitespace: 2 StartX: 456 EndX: 469 StartY: 24 EndY: 48 Char: "I" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 480 EndX: 485 StartY: 24 EndY: 48 Char: "J" InitialDist: -1 Width: 7 Whitespace: 1 StartX: 0 EndX: 7 StartY: 48 EndY: 72 Char: "K" InitialDist: 1 Width: 15 Whitespace: -1 StartX: 24 EndX: 39 StartY: 48 EndY: 72 Char: "L" InitialDist: 1 Width: 11 Whitespace: 0 StartX: 48 EndX: 59 StartY: 48 EndY: 72 Char: "M" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 72 EndX: 88 StartY: 48 EndY: 72 Char: "N" InitialDist: 1 Width: 13 Whitespace: 2 StartX: 96 EndX: 109 StartY: 48 EndY: 72 Char: "O" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 120 EndX: 134 StartY: 48 EndY: 72 Char: "P" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 144 EndX: 156 StartY: 48 EndY: 72 Char: "Q" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 168 EndX: 182 StartY: 48 EndY: 72 Char: "R" InitialDist: 1 Width: 14 Whitespace: 0 StartX: 192 EndX: 206 StartY: 48 EndY: 72 Char: "S" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 216 EndX: 228 StartY: 48 EndY: 72 Char: "T" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 240 EndX: 253 StartY: 48 EndY: 72 Char: "U" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 264 EndX: 277 StartY: 48 EndY: 72 Char: "V" InitialDist: 0 Width: 15 Whitespace: 0 StartX: 288 EndX: 303 StartY: 48 EndY: 72 Char: "W" InitialDist: 0 Width: 21 Whitespace: 0 StartX: 312 EndX: 333 StartY: 48 EndY: 72 Char: "X" InitialDist: 0 Width: 15 Whitespace: 0 StartX: 336 EndX: 351 StartY: 48 EndY: 72 Char: "Y" InitialDist: -1 Width: 15 Whitespace: 0 StartX: 360 EndX: 375 StartY: 48 EndY: 72 Char: "Z" InitialDist: 0 Width: 13 Whitespace: 1 StartX: 384 EndX: 397 StartY: 48 EndY: 72 Char: "[" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 408 EndX: 415 StartY: 48 EndY: 72 Char: "\" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 432 EndX: 439 StartY: 48 EndY: 72 Char: "]" InitialDist: 1 Width: 6 Whitespace: 2 StartX: 456 EndX: 462 StartY: 48 EndY: 72 Char: "^" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 480 EndX: 492 StartY: 48 EndY: 72 Char: "_" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 0 EndX: 10 StartY: 72 EndY: 96 Char: "`" InitialDist: 0 Width: 6 Whitespace: 3 StartX: 24 EndX: 30 StartY: 72 EndY: 96 Char: "a" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 48 EndX: 60 StartY: 72 EndY: 96 Char: "b" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 72 EndX: 84 StartY: 72 EndY: 96 Char: "c" InitialDist: 0 Width: 10 Whitespace: 1 StartX: 96 EndX: 106 StartY: 72 EndY: 96 Char: "d" InitialDist: 0 Width: 12 Whitespace: 2 StartX: 120 EndX: 132 StartY: 72 EndY: 96 Char: "e" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 144 EndX: 156 StartY: 72 EndY: 96 Char: "f" InitialDist: 0 Width: 9 Whitespace: -1 StartX: 168 EndX: 177 StartY: 72 EndY: 96 Char: "g" InitialDist: 0 Width: 12 Whitespace: 2 StartX: 192 EndX: 204 StartY: 72 EndY: 96 Char: "h" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 216 EndX: 227 StartY: 72 EndY: 96 Char: "i" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 240 EndX: 244 StartY: 72 EndY: 96 Char: "j" InitialDist: -1 Width: 6 Whitespace: 1 StartX: 264 EndX: 270 StartY: 72 EndY: 96 Char: "k" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 288 EndX: 300 StartY: 72 EndY: 96 Char: "l" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 312 EndX: 316 StartY: 72 EndY: 96 Char: "m" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 336 EndX: 354 StartY: 72 EndY: 96 Char: "n" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 360 EndX: 371 StartY: 72 EndY: 96 Char: "o" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 384 EndX: 397 StartY: 72 EndY: 96 Char: "p" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 408 EndX: 420 StartY: 72 EndY: 96 Char: "q" InitialDist: 0 Width: 12 Whitespace: 2 StartX: 432 EndX: 444 StartY: 72 EndY: 96 Char: "r" InitialDist: 1 Width: 9 Whitespace: -1 StartX: 456 EndX: 465 StartY: 72 EndY: 96 Char: "s" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 480 EndX: 490 StartY: 72 EndY: 96 Char: "t" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 0 EndX: 9 StartY: 96 EndY: 120 Char: "u" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 24 EndX: 35 StartY: 96 EndY: 120 Char: "v" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 48 EndX: 60 StartY: 96 EndY: 120 Char: "w" InitialDist: 0 Width: 17 Whitespace: 0 StartX: 72 EndX: 89 StartY: 96 EndY: 120 Char: "x" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 96 EndX: 108 StartY: 96 EndY: 120 Char: "y" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 120 EndX: 132 StartY: 96 EndY: 120 Char: "z" InitialDist: 0 Width: 10 Whitespace: 1 StartX: 144 EndX: 154 StartY: 96 EndY: 120 Char: "{" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 168 EndX: 177 StartY: 96 EndY: 120 Char: "|" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 192 EndX: 195 StartY: 96 EndY: 120 Char: "}" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 216 EndX: 225 StartY: 96 EndY: 120 Char: "~" InitialDist: 2 Width: 12 Whitespace: 2 StartX: 240 EndX: 252 StartY: 96 EndY: 120 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_16.png000066400000000000000000000223621200563112200231510ustar00rootroot00000000000000PNG  IHDR}W $IDATx^=$;nrgZ,-@vM+=I72# ] $I$I$I$I$I$I9\ɶN٭~?~S;1M[77:'=WIt\r_Sc>%{ڀS.}[4QT~&iϣs#(kgyt,LoW'PapGǏ@U~=K _6vW}響KJmg;\ۮBvf#aāN̜2x6BԘu+hB_DǏ~ Ewm |=K\i6Y聓%g51(`!( AML5"5J`BreI괚t0[%OJB+EvF?750 WGRqbfPs2G_ XI 6|&tGxt+qM*G]/ ݏA6=t0I|&SC?+و@/ZFO} vЉ`TJ]a^;:┫ ^Gwx[ǵ'] ZWgOȿO(jX5FfYGrj6uO'e)1Zh@ή$w?-vh1O:$v'pE$e8vZz5(jxޙ]A{3,*pA@Y峐pS_2,Rt%$ĉtTYtF;K߻`j,ᄇ;]Y C];VGt%qZoWNҙ2jfg89H'~MA?[;~'W8aOV` v6j7WRKRarV6Z7F|KdWOZ߻=U4ȝO#߫_q]++XN O)Gw۵WI'PGUۿ^n]M1Hr[x̬vrXq}XM>tď{>Pzy ]EψՕjO(S>>;"{WpuDǾ6񕺝Ilv,,L!^O "iItŽk:>+jefu}x[a*%畨~ѱȉ՜8QBwO,ߓض;UL>67_Fǿ+u &ŀ hr1 BEq&7&6=duBȩEǽ,?WcQc\14\?m*E *P!n1>XYU3fDǿ+hV>ǁloJm?=1wKgEΦvPFstl/w rWގJ.M(艟`v\jRm|JIKg;:P`hH+D'sГ0*.垘̢+]dwK;!eJD :EO]@-Y=h['|+yC`Ou8n$ $~K}'4P\mV ?};p5:~OØHvLj$_\' vpe]w .mS3S'Ir3xHFX y>7;Ӷǻ$I$I$I$I$I$I$I$I$I$I$#| d} o*]Uw6wEww|.>WA-&QJ}돚&_ddHF/iF?#tLsXyR 5{=O+= >ݿIO>cw</~:;eBm#ca>=>}{Z=|\(0=XI@셟.1-f ,L"_-N}oBdZ{.}t^ZĠ^L_ʟoҫKAO6vfK ,TfFixR9j➝k s'ˠ? Y3p,3G+gA9'Ns|?;-td֎`n4fp9|{oM>G[at%_6| ñ<'A{(ɩ#8l|8=c_q)+սN1Ѣh A}6$p+N-~wلI.V`k^yU2Q|+=|F_s}?@@zC+DGZ&x2v- 3} 03Kyq&vY}1ܛ7Nбo#%o*hrb1S*@NLPbvihb#9#x ܊DI:˚ӓV%Wtm633FMS~#ԎL1g:r}*Ńmpѕ~'&8= WYG`>J$iWۿoAD2=#`Űn+ jwr$:!;hɩ (ydSeX%'w3́UjXLk¿ <#ץ_}pJjC$ʙ/7A1#~cɩqZpmO`$D2= h ޴ d |t:w d='Q0Mdnw3K5X)(lwn]׮㋟i wl8>Rcv2zucF> ?.Ua^HۿG)UD4[z2 "%t_;wzQj ʎk#j3wcj.9/fB6B3[fa_ bhwڝ&=f$VKl?> $=E2} za2_L M;Fi_h3GOKFv}0M>5\*fwv 8~7PGhv*1=@`W'!꟫1D?{zmzpZ~'hR=C$FA fP8~5rᎂBmk{}]& p-f/K͉w@ ')Q]=;B?cF+cz]GAXjtW2۱ĭzV_GeV@M ~ɠ2Ff#\xrZ\)9S?@m{ΈuMMN cvgVxZΫ?i=_ѡ[TdM@6Eyw:kosE9hÁ ~WVV`2(߀j#&sU>PuWB?GΌ|׿l>[g}QZw^$УG-V3JL:y; v%ZrgN&*kvG\F &g%N'_hDԻm7d{HREg3ʟ\ɈzM#(0Fm bS[A. tpE#ѢdYTnmc+&+J\+^ƞVKUUM2EmAn-JD!>uek1v0%=ߺP0ȾTI#hѱȗ0L- KeGǿ WWE@g'qױ)w$I}KtlroXp3.X `$K?KAtЎm$I$Iy>t$I$I$I$I$I$I$I$I$8H>`s{2jO{k_Yg>|5ܫ7ʹmt/1c+=?~TȳG^MJZ6=`D.~-Yѹ=PYjΛE5:v+hT@G}_OJR:N)d938(Q;#[ǓfiЫG2-%FG3V#\[ϒc寊u)wKrjߗȯ2ϦQ.I^gВߍ&pJoRJ@ǁL$d@yKMz߫oG&\g4o-J|OtOΚjk64ϼc߫cU鳾^O=+7^(FP*6.{V@&׃ӒSzZF*PKJ=15Y5|'AKFJ?jȌoyз;&Bh_hj~zhPT荀[ǩzϤ5m}Hy3mmȞC_}vd5g>CI')˧ jK58oEwx>]Z&G~?5 P$]?mzq>KgD|thBfXZ$jRaz .+Szp|IqT~)8_>'#5xHaAZQ#OFOԇ,$!MJorxcT$G~?kgBU))uf?U^u{Cfmh_8}E  oA@4 ȊcSzR뒢Gt&h_F3){TQ8QU~En D3Z%v\FSG)heX{'m.Q8}{|I~R:h&*@INAgoJ@Z"{6G Qzfιߋl:X=5KmY =Jb퍟d+ q6"ӷgX;#rM3A ;5dHZh1 λ ʼ⾢RKY9J<-0ѹ3pEfW,(7n_L^Z.Nd̠KͮNtm;T1I$I,$I$I$I$I$I$I7RDOJ$Iv> g,wN]y~{=-j\rZ~$=}'>=j'|rSriItlz!|zV/XN|rSriI|0@r}㝶bWq>'I&4yѹ-J ycZC_ʦ] 6R ;@U_UGR촽+> ÷pJLkYUz9N>ۜyHYKJvѧˁb(Ʀի?!A'=`x֐ŗM(; j;:?&7累@b LD{8e g9NM.糏x>7q%?g~=$*Oi_|^{aU_+ $v4J|F(p^d $%Ug?o뻢8i^yGNS+Sz%(n_Q)^_={w5xdyGs#FfjW^m>?Ak]DJ|wXu9_O{W@ڎwğNpT;%?87ŇRRt?{|sw|s؀WW^ZA23 ;\ PɾDK/d}VYmc[qYH"CF)%85SzV|k->?@ex $]Qs c(93ƍ.Q$`0\K~t}NYiijMFUz9Վ%3c)IKOLzH -@z?OǷ#| V ~$O{)L`Ձ}"]_ˏP;mt>~jVR &)'%>"z~{#~ j03FDcR^b-|HV mcEN _۽:Vdév\'&w/-<&Fd3j?b^ߏqGLCz6F*۝&@TǙ~lQ۫o"vԩv\.Ɣ|u<қ|Bo%-vj޻ǡ*+~Ɛ*3{G@5`:Y,5,?EJ }BEj~ln!Hs:_NSwo, SzcW53~]y2;#N2f3vǻc)3Cq]ޫ3\Vlrf1Ď~:@SzQ6<|JoҒDwv%y*?Yus֠$wNru&*9SjztpV< |[DΪ}NUz9NK7$NMZT/f/pU<VϏLY? }=]j%J_'Ѡ}w4QK=w}w=Ihܔc&O$$0w(8S3yu~uoϣ$}8g@g\^_ 'oa>de-Ttn^~$I$I$I$I$I$I$mOϊi}CU$IK[7 w*OUA$o|QSRU_=]Ư $yI$@Ԟ@1$[ L\ T;LX^'ܒطPOuEnwتc|mQD2z Id#=Je502l}׋6]6}CS\͞7]=^E%ҌgGH$ h6^]MjYkPgg@ӣkGWg I _ ̬S͸qm%g@|~k?sP@|Zm>_fvbeWp+VaI]\QhenM@ѩ'uנϵ}o4٥EuD>d-zHZH:_)V+ ?Bp-c"le%Ih[JܵQ>cB}zMi4j&f%[nU;Q<5 -T`+-jFW*j wǒs)a*(W5BZZ$W+;$%Ihؕt@+jK*NݓDx8Fh-%]\ZQ v"Ud}=$I~'+D3q@啶VΜi._w$hO#<ы.P] %ILדP[DɊY?5eٿݗ@ j?@$a;iG&IlAw@g;DWq:kyOA DM\Un\,! $IC8q#nx۹ e{ջr=Og5Y5Gc\%IޔCѮB -W^(^I$I2TlSKtF`$I$S7BsZ\]~%$I$';'!,}^ǜ$I$GvywNI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I${?ijšAލtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_24.fmt000066400000000000000000000212251200563112200231470ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 512 TextZStep: 38 Char: " " InitialDist: 0 Width: 1 Whitespace: 9 StartX: 0 EndX: 1 StartY: 0 EndY: 38 Char: "!" InitialDist: 4 Width: 5 Whitespace: 4 StartX: 38 EndX: 43 StartY: 0 EndY: 38 Char: """ InitialDist: 2 Width: 11 Whitespace: 2 StartX: 76 EndX: 87 StartY: 0 EndY: 38 Char: "#" InitialDist: 2 Width: 21 Whitespace: 1 StartX: 114 EndX: 135 StartY: 0 EndY: 38 Char: "$" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 152 EndX: 168 StartY: 0 EndY: 38 Char: "%" InitialDist: 1 Width: 27 Whitespace: 1 StartX: 190 EndX: 217 StartY: 0 EndY: 38 Char: "&" InitialDist: 1 Width: 23 Whitespace: 1 StartX: 228 EndX: 251 StartY: 0 EndY: 38 Char: "'" InitialDist: 2 Width: 4 Whitespace: 3 StartX: 266 EndX: 270 StartY: 0 EndY: 38 Char: "(" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 304 EndX: 313 StartY: 0 EndY: 38 Char: ")" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 342 EndX: 351 StartY: 0 EndY: 38 Char: "*" InitialDist: 0 Width: 15 Whitespace: 0 StartX: 380 EndX: 395 StartY: 0 EndY: 38 Char: "+" InitialDist: 3 Width: 18 Whitespace: 3 StartX: 418 EndX: 436 StartY: 0 EndY: 38 Char: "," InitialDist: 1 Width: 7 Whitespace: 3 StartX: 456 EndX: 463 StartY: 0 EndY: 38 Char: "-" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 0 EndX: 10 StartY: 38 EndY: 76 Char: "." InitialDist: 3 Width: 5 Whitespace: 3 StartX: 38 EndX: 43 StartY: 38 EndY: 76 Char: "/" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 76 EndX: 87 StartY: 38 EndY: 76 Char: "0" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 114 EndX: 132 StartY: 38 EndY: 76 Char: "1" InitialDist: 3 Width: 15 Whitespace: 2 StartX: 152 EndX: 167 StartY: 38 EndY: 76 Char: "2" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 190 EndX: 206 StartY: 38 EndY: 76 Char: "3" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 228 EndX: 244 StartY: 38 EndY: 76 Char: "4" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 266 EndX: 284 StartY: 38 EndY: 76 Char: "5" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 304 EndX: 320 StartY: 38 EndY: 76 Char: "6" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 342 EndX: 360 StartY: 38 EndY: 76 Char: "7" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 380 EndX: 396 StartY: 38 EndY: 76 Char: "8" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 418 EndX: 436 StartY: 38 EndY: 76 Char: "9" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 456 EndX: 474 StartY: 38 EndY: 76 Char: ":" InitialDist: 3 Width: 6 Whitespace: 3 StartX: 0 EndX: 6 StartY: 76 EndY: 114 Char: ";" InitialDist: 1 Width: 8 Whitespace: 3 StartX: 38 EndX: 46 StartY: 76 EndY: 114 Char: "<" InitialDist: 3 Width: 18 Whitespace: 3 StartX: 76 EndX: 94 StartY: 76 EndY: 114 Char: "=" InitialDist: 3 Width: 18 Whitespace: 3 StartX: 114 EndX: 132 StartY: 76 EndY: 114 Char: ">" InitialDist: 3 Width: 18 Whitespace: 3 StartX: 152 EndX: 170 StartY: 76 EndY: 114 Char: "?" InitialDist: 2 Width: 13 Whitespace: 2 StartX: 190 EndX: 203 StartY: 76 EndY: 114 Char: "@" InitialDist: 2 Width: 25 Whitespace: 2 StartX: 228 EndX: 253 StartY: 76 EndY: 114 Char: "A" InitialDist: 0 Width: 23 Whitespace: -1 StartX: 266 EndX: 289 StartY: 76 EndY: 114 Char: "B" InitialDist: 2 Width: 18 Whitespace: 2 StartX: 304 EndX: 322 StartY: 76 EndY: 114 Char: "C" InitialDist: 1 Width: 19 Whitespace: 1 StartX: 342 EndX: 361 StartY: 76 EndY: 114 Char: "D" InitialDist: 2 Width: 21 Whitespace: 1 StartX: 380 EndX: 401 StartY: 76 EndY: 114 Char: "E" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 418 EndX: 434 StartY: 76 EndY: 114 Char: "F" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 456 EndX: 472 StartY: 76 EndY: 114 Char: "G" InitialDist: 1 Width: 21 Whitespace: 2 StartX: 0 EndX: 21 StartY: 114 EndY: 152 Char: "H" InitialDist: 2 Width: 20 Whitespace: 2 StartX: 38 EndX: 58 StartY: 114 EndY: 152 Char: "I" InitialDist: 2 Width: 6 Whitespace: 3 StartX: 76 EndX: 82 StartY: 114 EndY: 152 Char: "J" InitialDist: -2 Width: 10 Whitespace: 3 StartX: 114 EndX: 124 StartY: 114 EndY: 152 Char: "K" InitialDist: 2 Width: 22 Whitespace: -2 StartX: 152 EndX: 174 StartY: 114 EndY: 152 Char: "L" InitialDist: 2 Width: 16 Whitespace: 0 StartX: 190 EndX: 206 StartY: 114 EndY: 152 Char: "M" InitialDist: 2 Width: 24 Whitespace: 3 StartX: 228 EndX: 252 StartY: 114 EndY: 152 Char: "N" InitialDist: 2 Width: 20 Whitespace: 2 StartX: 266 EndX: 286 StartY: 114 EndY: 152 Char: "O" InitialDist: 1 Width: 22 Whitespace: 1 StartX: 304 EndX: 326 StartY: 114 EndY: 152 Char: "P" InitialDist: 2 Width: 18 Whitespace: 1 StartX: 342 EndX: 360 StartY: 114 EndY: 152 Char: "Q" InitialDist: 1 Width: 22 Whitespace: 1 StartX: 380 EndX: 402 StartY: 114 EndY: 152 Char: "R" InitialDist: 2 Width: 20 Whitespace: 0 StartX: 418 EndX: 438 StartY: 114 EndY: 152 Char: "S" InitialDist: 2 Width: 17 Whitespace: 2 StartX: 456 EndX: 473 StartY: 114 EndY: 152 Char: "T" InitialDist: 0 Width: 20 Whitespace: 0 StartX: 0 EndX: 20 StartY: 152 EndY: 190 Char: "U" InitialDist: 2 Width: 19 Whitespace: 2 StartX: 38 EndX: 57 StartY: 152 EndY: 190 Char: "V" InitialDist: 0 Width: 23 Whitespace: -1 StartX: 76 EndX: 99 StartY: 152 EndY: 190 Char: "W" InitialDist: 0 Width: 31 Whitespace: 1 StartX: 114 EndX: 145 StartY: 152 EndY: 190 Char: "X" InitialDist: 0 Width: 22 Whitespace: 0 StartX: 152 EndX: 174 StartY: 152 EndY: 190 Char: "Y" InitialDist: -1 Width: 23 Whitespace: -1 StartX: 190 EndX: 213 StartY: 152 EndY: 190 Char: "Z" InitialDist: 1 Width: 19 Whitespace: 1 StartX: 228 EndX: 247 StartY: 152 EndY: 190 Char: "[" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 266 EndX: 276 StartY: 152 EndY: 190 Char: "\" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 304 EndX: 315 StartY: 152 EndY: 190 Char: "]" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 342 EndX: 351 StartY: 152 EndY: 190 Char: "^" InitialDist: 3 Width: 19 Whitespace: 2 StartX: 380 EndX: 399 StartY: 152 EndY: 190 Char: "_" InitialDist: 0 Width: 15 Whitespace: -1 StartX: 418 EndX: 433 StartY: 152 EndY: 190 Char: "`" InitialDist: 1 Width: 9 Whitespace: 4 StartX: 456 EndX: 465 StartY: 152 EndY: 190 Char: "a" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 0 EndX: 17 StartY: 190 EndY: 228 Char: "b" InitialDist: 2 Width: 18 Whitespace: 1 StartX: 38 EndX: 56 StartY: 190 EndY: 228 Char: "c" InitialDist: 1 Width: 15 Whitespace: 1 StartX: 76 EndX: 91 StartY: 190 EndY: 228 Char: "d" InitialDist: 1 Width: 18 Whitespace: 2 StartX: 114 EndX: 132 StartY: 190 EndY: 228 Char: "e" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 152 EndX: 170 StartY: 190 EndY: 228 Char: "f" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 190 EndX: 203 StartY: 190 EndY: 228 Char: "g" InitialDist: 1 Width: 18 Whitespace: 2 StartX: 228 EndX: 246 StartY: 190 EndY: 228 Char: "h" InitialDist: 2 Width: 17 Whitespace: 2 StartX: 266 EndX: 283 StartY: 190 EndY: 228 Char: "i" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 304 EndX: 310 StartY: 190 EndY: 228 Char: "j" InitialDist: -1 Width: 9 Whitespace: 2 StartX: 342 EndX: 351 StartY: 190 EndY: 228 Char: "k" InitialDist: 2 Width: 18 Whitespace: -1 StartX: 380 EndX: 398 StartY: 190 EndY: 228 Char: "l" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 418 EndX: 424 StartY: 190 EndY: 228 Char: "m" InitialDist: 2 Width: 26 Whitespace: 2 StartX: 456 EndX: 482 StartY: 190 EndY: 228 Char: "n" InitialDist: 2 Width: 17 Whitespace: 2 StartX: 0 EndX: 17 StartY: 228 EndY: 266 Char: "o" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 38 EndX: 56 StartY: 228 EndY: 266 Char: "p" InitialDist: 2 Width: 18 Whitespace: 1 StartX: 76 EndX: 94 StartY: 228 EndY: 266 Char: "q" InitialDist: 1 Width: 18 Whitespace: 2 StartX: 114 EndX: 132 StartY: 228 EndY: 266 Char: "r" InitialDist: 2 Width: 13 Whitespace: -1 StartX: 152 EndX: 165 StartY: 228 EndY: 266 Char: "s" InitialDist: 1 Width: 15 Whitespace: 1 StartX: 190 EndX: 205 StartY: 228 EndY: 266 Char: "t" InitialDist: 0 Width: 13 Whitespace: 1 StartX: 228 EndX: 241 StartY: 228 EndY: 266 Char: "u" InitialDist: 2 Width: 16 Whitespace: 3 StartX: 266 EndX: 282 StartY: 228 EndY: 266 Char: "v" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 304 EndX: 323 StartY: 228 EndY: 266 Char: "w" InitialDist: 1 Width: 25 Whitespace: 1 StartX: 342 EndX: 367 StartY: 228 EndY: 266 Char: "x" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 380 EndX: 399 StartY: 228 EndY: 266 Char: "y" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 418 EndX: 437 StartY: 228 EndY: 266 Char: "z" InitialDist: 1 Width: 15 Whitespace: 1 StartX: 456 EndX: 471 StartY: 228 EndY: 266 Char: "{" InitialDist: 3 Width: 14 Whitespace: 4 StartX: 0 EndX: 14 StartY: 266 EndY: 304 Char: "|" InitialDist: 3 Width: 4 Whitespace: 4 StartX: 38 EndX: 42 StartY: 266 EndY: 304 Char: "}" InitialDist: 3 Width: 14 Whitespace: 4 StartX: 76 EndX: 90 StartY: 266 EndY: 304 Char: "~" InitialDist: 3 Width: 18 Whitespace: 3 StartX: 114 EndX: 132 StartY: 266 EndY: 304 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_24.png000066400000000000000000000405021200563112200231440ustar00rootroot00000000000000PNG  IHDRx@IDATx^;:rq-w1[hZە+6k&Rb.*:ϹN8ozχN[:D1~zAտ{קWEV7ou2LJ:|R޲@ߎ:;b??TQRWM'|~;yoXׅ^qgM1uUޟtu,J z<$NooY =>7&K\;0mdxο[Sh3q{qzۻ kvN:$.巣oLꑈ+.YQ* k%!jrӾvyԉ(Y*d6 ]uz`K-6Dqur%{4o HbO魳QElNeӍ[IJ\QǧN4mqz`<};:QR.u&|ͬ=utaߎ:;-GiO׎Gde]+3NEu&foPM.Ko跣oK\Nf|ubu} =Xֱg7u2In~WεezV9]G|C^쭳 vdU^L:ݗ2}޼U7fM {'''}uv=Iջ4w½  7d+ف`NX'}ͨeۑ׳&Rm_c{Dq;X95A1L̢|C^쭳ˏ综!ao;󺓯o5 !{1tز133;/,C{^:ogd"̴wFg>W4Vu.uFkO4ڬ>w%zɀt~7D#]ޮxcE߿N^O`T}W|o{_Γu}&&lzc=oRmp.=G躨Fed;x]|F+_iI@Yy:7lTm*MF5N;p:1(N&~̝RڶMO_ɛ%Lh}N*;%ŝ<ʖU%(&mt꿵 A L 'uZuZ''_y7oR7Ѻ_1֞l\^žWQ:ou'۪k$;g"*O,lRp<vKm婑\[t_+:yZS*+ŧc{Bx uv:=A9 7D_Ww ]6e/]2_(RY$SCgm$~mpS׻:uD=5}=s72$%*q=_fR2+|C5FhD}*&Tɑ[<$%XU:B7z4 OSN)i&&%x:QǧjDT1t; ggNI.W;`gcA5z,%e+xSu2K7ߩ>O\rR`;Z{Z};٤n">qRa[Ǒq_8n8USWGQ[zYҊzʯ$IߧU/Cqo1Q,q&>o=O]o riq,k^9I5YSuL*޺x*??o;ޓ^N$xv+ZoWے},ibdJG;.純UTMKh;ڎ3O`O\[TӳRGuJ1),C[SȽmgl; i?+:Gzw{˨v(i4ɌͫjGe^%.^c;δG{5vu"+⍾HtZA,eƪƤwal32[Dslh˙Ev敕׉zBf=yeP7^7::rq(÷q7xF22bcl SoJ{yv\ˬ}EЋ'S>Q݌2lQ^9=}RG цƔ0>OIZ_YLoV媙:Tℇ#Fh5Z[vI.oOuRO(i,W,Nw $r"^}K1ڱ{3MYmLUvx)V>q5:yK0TeS]LQxu>zȻ\}ہWvimώm|Ibɼs]cl;[W)RBcW]&dֹ^Pڎr:k"Z6;)K96hvzlMXlddbZv,v$uMUtZwtL3/۩F/jO?\xI'q]4?┶5ȐlLF6^'8GKe@ٲlɫs\t==[vg:ݗ4G/Axe:$ {oۏ"8F{'|bο:W3՝-,gϏEՓ y4[[o5/o$j:&T_flL;f'nNڮ6u6{{JbNK^fʌFm #jkvwb}'<Տxh|f7vB0{._}>& --}˰)uvgG~pgsJ_PM&j`Gn::Xwbvxfo9 _Wuv̛fx :fNOaxJӨEowD+(1c ׯ']UfQyecy皍3:om!:r[ :^gԙGm(_3fʫlcz%Nk;㳼Ѿ1%jgIgV4Z4+Pxw>P%} W6M'34yu9+Y} f͔WKfVӫqe;5eN`Oh u,kW;+F_;eV$팫GvRYw׽]gccF5?()Hz%m:G]ТYU(J]ƵbMpfs@'G/QzjV :F\Q9uU 7__3FQ="eUy JhVWc1SZVNodk2UF;s㰝-/[#uPOGMdqqj%]MV%ǧSZOua=AǸ6F7;)]c;x{|Ua/I^zP|Y#rz٢򺺞gW]=sԸ{ˋdDF4wo;csΣmR')Htx^ͪN]:ɺ $.)ўl5jO wLőہJԸ;Û.-x3+/thskQt;1S^5/Uj\N i݄c~2SR%3~[veYo^")2UDjƕԸkjTVMh2U ^#[mS!)JP'QHnwV42l%%g% /dclyT|r%N hMY?;ZkJ);R;ިê˰Dn=%m#Vv t4+-G=#S[92k$M&kWԸ*I#O ;+fʦ :qa=`Gavvvl;ԉÊEVu wi%@#mLyi]L\;2wg Ho;N~f@N{qR_kb}.~x켻5RmG:Cu.6Z.Xq_D>fr11X}nDU*=9"˨6Z^˫:ZZ#޺_ݟ{{d;Y5n9nB~с̖v->Ehڰ'?3C'{o6:+qvJqDk^C z{kݖV\DNzߣnuc;-YIjyᬫXV VֈQJǻⲗ!uay~߻G΅έـ8lm}Y\kS=w%h[o߯7 uJF;P/ l/4V^+=Ku]ɀ*)Q'ڀy묊IƵ)qFqn{wR>V,ueg~}8G^MTv1Qf2n)me]O>rP3O Ϊj\g+V}c)ct3(n˛𒕕D>߲Wy{yEwy`e]Ou I[oSMIJы)W;Z,7QDe{ׇEޭ.JkALyyIȀ5ז)Xf8G^c$'vMVѸVr9(Uw߯.^^Q{K(gFfʗg~ QY\kScwsmid;b5+KGQWKILy-scV]ˋ~0s6i  XurTΪj\LT(+5Ѷ̔zeQ~}RΑڊZΖW ^2ےnZ:g+D᭳*&n9GxxN>Y3ml՛Qֻc浭֮[o7Wu'XJf^vPۮq5ݢjWkG@0g6 2O~vϢ4[^+Gŕ.c'ՓQF[H@Vuŕ !:+q`R^U5 +qEי3˯Pul_߫+V6Km$W+䬺PlO#>5Gt~Rg8XkV7P2]dnm;|^.xP9qE37+^.0,kdfymq_I/`*fLj%dR`V8|;R_t Oh~[uK)5w+տ<[cH_EWYG~+wY}؇]_z댘ݮ]z.?:#7o]3юgVUӒߞ|Gz?NX;]/Ӫ3H7JGkﻬ>Xz݇~'^qw]i[+ۍ:LUÕD^r\hGnGZ1\;wIVKwl+n Q5:r:U?}J+:c}VvyYDDzxp羅t#Vĵz#V$`IVKwD灜T=MTڱUHyHFx7yQ~终*G=J2xms4.Ǫ?ю=.T?*mdϩU3i+0leKWԝZdUu1`7?259/^mx? xێN_dpF6+щSUS;+[v'٩>޲dz7~Vш)Z~eή tҭKfHtLٓh̩hToguNsY37z d @=32[v,[t>mSX9oQή@f/dOG^Yǰuu\Qrջ_ wӖ\9&#NNQWetҗ2~;HeAQ&#.uM{e{uM+h{u[Tm(@z>]V4VhgDzL跃^F+ e`GMlu8W;hU$!0wglh"3Q:=Ļiڥﭣ?^VZ蝞eh8͎Ⱉ~0Dο}w/<DIJv|zPw(Ֆ]f2hzl] e&K ;g o|\H^"VgyzcNO.'heDJ+$:9_xĥöZOof\FDɊ㪨Ot.1zT{CPǒ}Id-v VZ!7:dwOKkSOeRߎ`z4ސ~e%6[ieWwS&`=&8+jDowywζɖ]vf+e옶2c36qP'`-{m(vB7$r〶C@:[ix Rtx{eaqlGXh0)^oV`lWjO_%왶Hp<[in?*yux)' /)W66f3:)ZvW{:<5#d+aˎdzVvtD'NjFѱbs׀Gt߈hJN'vw6O&\%:7`ˎdzVv&эb޼u,;[m$Ay;#o~x*$Q9humّxҊztb-ev;cv;u(4J,,wֽYM @=tfˎdzVV7,=##k./ZI}quD-w%4tJُ+VoJY[v$8a1xMVZ hUW(^g>4D7%RםeJ+Q*5:韊OZvOKԉI+Aj7Z'rg:j$z[p〶HCxb|^PYS<>F-;+.'%ulMEeT^ @}9eůWh^ zeExMVoIgO?/b޶z}kOǸp#E$|{|\仿Ըj'xR,SC|~vV']o>2)[O=OvR'R;5.< OX[53S㪝IN B"~ޖEpxj\b<)کq!T\$B3 r=pxj\b<)کq!T\$ ߽÷N=pI1zO B"-p>~ S6u':|gkdԫĨجP2SOĥY u+kW {L~JY>k+'}Vԩ2cc3NQnǚq3oٻfکutW}Wa;^mB3-;Yt`Ay{{EdǨDi_-O'S(z;h,#:YѸvR}97Eyˈ@}o3J%3x1ch56:jXOFiuůOg+䘭aqs>fSqNq$ݝ,fy;;]K)ci2{ۿC'B/+,F*\KVnϿf8[^FԎvRXK/ܩ#ɱd\/>>E8|y=P 2eKT^n+/Ɋ+/uu׾&~~FVxN##/8y1#&9㨝gg/'Qm:vo x{{Wl^vBE˻μfeM>{d98Μ$:)Ƒ)ʨ6WG&W;9ll\ @F\5ouGo.f]uKfzI1zxW25q @Kh -UQF ׸e>6ʛj?ZqG8!I1bfvtP'Qm4KD+X5:Gw؅Hu߆Vbn3)2R^cTT>_?>~Y'(;/:ZkDqmO'؋%~2SF] ݣF@GVQ/MYZfcly;ouَ6p+&)'8Lv#q=a4K.c޶ĎFŮkV5tr ev6Hfh١U^x\O9)XvwѸvkt#hXN^Oح)vW+תx M︙PŤ;w6ҵ ?B"^ uvQ;y}/_F8YfzI1IJ󾯙vktcB/<[Iu;;X_9ӱXꤼz86&[{v =yhÛ5x_Bk&:2 r7$pq~Nu:L̋ ?8F0 ԏdߺ_;}],t/d^oo@:54FWӤ_!{WoM7{_o+fRVgejm+ꎎ??(Ɥ9S9.KlYJo+ԗ1g\e/rEz/vwlےhYvٌqe'寈n~ 52Jc;lpX u ٝʫ[[LF-VkU.Ly}F[9vIw@}?Z-#L/}yEPH;y};*//.ʢ:ٙ/:;ηzYNNkFƅSw/aͲ7b=_>/sv^CeSޗ4d&.WԩG[.o:1*(YU^=R#t\ ۆ؛U<[dճZ֠3rm?LFD71g<K4wy`pl;#k:hyd蝽Ůfz bTc9/HxǶg\Koenf; ۮelzmGmw;NvW]kskvjvfK첒Qf.fkG3  ߞ6,D閺U/W:hF.GҚ9f/W^O$!K43]W͔e%fc9[^;1>OF0ϛ>.i _Y·zTYnmd;'%^'_fdq,$3cVfzkEQygK첒Qf^]n a;i$a?u;Yfi*-5wcz5{=xqˋ+Xԯh4rPG`7$ޓ/O%wҷD7.W}]NYo[+x6szgU*6w+Z6Xԯ[Ijv[' [ok^"kػ9ԗl;f5u+'YAގf }$wSFZD2G^\vQ\q,gN*j@;}ˮh$mֻJ+nD;Gދ9c@%Ŏ;n bޝDצԹStreegQ K֛,2+:aF⒌fNhKZ1iSt `?rFPQPko+:!:lBz2e͚3^2R@4[8^76nL;GQW^GXGe;XԯzK$"$NFyo+E/z"i͌QuGۿ;=}2޺+THd& %*ިcWZfױ_;]Iv^ߙV$բ#}De"v٨W7XGq%O# @eWQLNSB(n)Yc9SvlWoZzwuKw*1xqZt.h#2 RZg{H[[y_]o-qNNz۸ _aR'bu @}o{f;4魳ک ͖pJC{~KPY^vhOt$lf;':`60  ^tGz@lyuCyNo _lvfڛu@l{X r^R ޫmM FOv%-*Wyo?/<˛%8~}%&'/]6%8 oОIvhOt$lf;':`6#f%@x%ۡIoޒvlY^q}]&I{ռYZoޚ" InitialDist: 4 Width: 25 Whitespace: 3 StartX: 0 EndX: 25 StartY: 150 EndY: 200 Char: "?" InitialDist: 2 Width: 18 Whitespace: 2 StartX: 50 EndX: 68 StartY: 150 EndY: 200 Char: "@" InitialDist: 2 Width: 34 Whitespace: 3 StartX: 100 EndX: 134 StartY: 150 EndY: 200 Char: "A" InitialDist: 0 Width: 30 Whitespace: 0 StartX: 150 EndX: 180 StartY: 150 EndY: 200 Char: "B" InitialDist: 3 Width: 24 Whitespace: 2 StartX: 200 EndX: 224 StartY: 150 EndY: 200 Char: "C" InitialDist: 2 Width: 24 Whitespace: 2 StartX: 250 EndX: 274 StartY: 150 EndY: 200 Char: "D" InitialDist: 3 Width: 27 Whitespace: 2 StartX: 300 EndX: 327 StartY: 150 EndY: 200 Char: "E" InitialDist: 3 Width: 21 Whitespace: 2 StartX: 350 EndX: 371 StartY: 150 EndY: 200 Char: "F" InitialDist: 3 Width: 21 Whitespace: 2 StartX: 400 EndX: 421 StartY: 150 EndY: 200 Char: "G" InitialDist: 2 Width: 27 Whitespace: 3 StartX: 450 EndX: 477 StartY: 150 EndY: 200 Char: "H" InitialDist: 3 Width: 26 Whitespace: 3 StartX: 0 EndX: 26 StartY: 200 EndY: 250 Char: "I" InitialDist: 3 Width: 8 Whitespace: 3 StartX: 50 EndX: 58 StartY: 200 EndY: 250 Char: "J" InitialDist: -3 Width: 14 Whitespace: 3 StartX: 100 EndX: 114 StartY: 200 EndY: 250 Char: "K" InitialDist: 3 Width: 29 Whitespace: -2 StartX: 150 EndX: 179 StartY: 200 EndY: 250 Char: "L" InitialDist: 3 Width: 21 Whitespace: 1 StartX: 200 EndX: 221 StartY: 200 EndY: 250 Char: "M" InitialDist: 3 Width: 32 Whitespace: 4 StartX: 250 EndX: 282 StartY: 200 EndY: 250 Char: "N" InitialDist: 3 Width: 26 Whitespace: 3 StartX: 300 EndX: 326 StartY: 200 EndY: 250 Char: "O" InitialDist: 2 Width: 29 Whitespace: 2 StartX: 350 EndX: 379 StartY: 200 EndY: 250 Char: "P" InitialDist: 3 Width: 24 Whitespace: 1 StartX: 400 EndX: 424 StartY: 200 EndY: 250 Char: "Q" InitialDist: 2 Width: 29 Whitespace: 2 StartX: 450 EndX: 479 StartY: 200 EndY: 250 Char: "R" InitialDist: 3 Width: 26 Whitespace: 1 StartX: 0 EndX: 26 StartY: 250 EndY: 300 Char: "S" InitialDist: 2 Width: 23 Whitespace: 3 StartX: 50 EndX: 73 StartY: 250 EndY: 300 Char: "T" InitialDist: 0 Width: 27 Whitespace: -1 StartX: 100 EndX: 127 StartY: 250 EndY: 300 Char: "U" InitialDist: 3 Width: 25 Whitespace: 3 StartX: 150 EndX: 175 StartY: 250 EndY: 300 Char: "V" InitialDist: 0 Width: 30 Whitespace: 0 StartX: 200 EndX: 230 StartY: 250 EndY: 300 Char: "W" InitialDist: 1 Width: 41 Whitespace: 1 StartX: 250 EndX: 291 StartY: 250 EndY: 300 Char: "X" InitialDist: 0 Width: 29 Whitespace: 1 StartX: 300 EndX: 329 StartY: 250 EndY: 300 Char: "Y" InitialDist: -1 Width: 30 Whitespace: -1 StartX: 350 EndX: 380 StartY: 250 EndY: 300 Char: "Z" InitialDist: 1 Width: 26 Whitespace: 1 StartX: 400 EndX: 426 StartY: 250 EndY: 300 Char: "[" InitialDist: 3 Width: 12 Whitespace: 3 StartX: 450 EndX: 462 StartY: 250 EndY: 300 Char: "\" InitialDist: 0 Width: 15 Whitespace: -1 StartX: 0 EndX: 15 StartY: 300 EndY: 350 Char: "]" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 50 EndX: 63 StartY: 300 EndY: 350 Char: "^" InitialDist: 4 Width: 25 Whitespace: 3 StartX: 100 EndX: 125 StartY: 300 EndY: 350 Char: "_" InitialDist: 0 Width: 20 Whitespace: -1 StartX: 150 EndX: 170 StartY: 300 EndY: 350 Char: "`" InitialDist: 1 Width: 12 Whitespace: 6 StartX: 200 EndX: 212 StartY: 300 EndY: 350 Char: "a" InitialDist: 1 Width: 22 Whitespace: 3 StartX: 250 EndX: 272 StartY: 300 EndY: 350 Char: "b" InitialDist: 3 Width: 23 Whitespace: 2 StartX: 300 EndX: 323 StartY: 300 EndY: 350 Char: "c" InitialDist: 1 Width: 20 Whitespace: 2 StartX: 350 EndX: 370 StartY: 300 EndY: 350 Char: "d" InitialDist: 1 Width: 24 Whitespace: 3 StartX: 400 EndX: 424 StartY: 300 EndY: 350 Char: "e" InitialDist: 1 Width: 24 Whitespace: 1 StartX: 450 EndX: 474 StartY: 300 EndY: 350 Char: "f" InitialDist: 0 Width: 18 Whitespace: -1 StartX: 0 EndX: 18 StartY: 350 EndY: 400 Char: "g" InitialDist: 1 Width: 24 Whitespace: 3 StartX: 50 EndX: 74 StartY: 350 EndY: 400 Char: "h" InitialDist: 3 Width: 22 Whitespace: 3 StartX: 100 EndX: 122 StartY: 350 EndY: 400 Char: "i" InitialDist: 3 Width: 7 Whitespace: 3 StartX: 150 EndX: 157 StartY: 350 EndY: 400 Char: "j" InitialDist: -2 Width: 12 Whitespace: 3 StartX: 200 EndX: 212 StartY: 350 EndY: 400 Char: "k" InitialDist: 3 Width: 24 Whitespace: -1 StartX: 250 EndX: 274 StartY: 350 EndY: 400 Char: "l" InitialDist: 3 Width: 7 Whitespace: 3 StartX: 300 EndX: 307 StartY: 350 EndY: 400 Char: "m" InitialDist: 3 Width: 35 Whitespace: 2 StartX: 350 EndX: 385 StartY: 350 EndY: 400 Char: "n" InitialDist: 3 Width: 22 Whitespace: 3 StartX: 400 EndX: 422 StartY: 350 EndY: 400 Char: "o" InitialDist: 1 Width: 24 Whitespace: 2 StartX: 450 EndX: 474 StartY: 350 EndY: 400 Char: "p" InitialDist: 3 Width: 23 Whitespace: 2 StartX: 0 EndX: 23 StartY: 400 EndY: 450 Char: "q" InitialDist: 1 Width: 24 Whitespace: 3 StartX: 50 EndX: 74 StartY: 400 EndY: 450 Char: "r" InitialDist: 3 Width: 16 Whitespace: 0 StartX: 100 EndX: 116 StartY: 400 EndY: 450 Char: "s" InitialDist: 2 Width: 20 Whitespace: 1 StartX: 150 EndX: 170 StartY: 400 EndY: 450 Char: "t" InitialDist: 0 Width: 18 Whitespace: 1 StartX: 200 EndX: 218 StartY: 400 EndY: 450 Char: "u" InitialDist: 3 Width: 22 Whitespace: 3 StartX: 250 EndX: 272 StartY: 400 EndY: 450 Char: "v" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 300 EndX: 325 StartY: 400 EndY: 450 Char: "w" InitialDist: 1 Width: 34 Whitespace: 1 StartX: 350 EndX: 384 StartY: 400 EndY: 450 Char: "x" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 400 EndX: 425 StartY: 400 EndY: 450 Char: "y" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 450 EndX: 475 StartY: 400 EndY: 450 Char: "z" InitialDist: 1 Width: 20 Whitespace: 2 StartX: 0 EndX: 20 StartY: 450 EndY: 500 Char: "{" InitialDist: 4 Width: 19 Whitespace: 5 StartX: 50 EndX: 69 StartY: 450 EndY: 500 Char: "|" InitialDist: 5 Width: 5 Whitespace: 4 StartX: 100 EndX: 105 StartY: 450 EndY: 500 Char: "}" InitialDist: 4 Width: 19 Whitespace: 5 StartX: 150 EndX: 169 StartY: 450 EndY: 500 Char: "~" InitialDist: 4 Width: 25 Whitespace: 3 StartX: 200 EndX: 225 StartY: 450 EndY: 500 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_32.png000066400000000000000000000542151200563112200231510ustar00rootroot00000000000000PNG  IHDRxX,IDATx^;%`/׋z^cNvЙ3F½`/ do"""""""""""""""""""""""""""""#>+v_رK^;N@f`F_yG=> :߾ N/# ^9 hR|ϗ_" F ׾ ;/4ٱuƅGޭݠkAǝ_j;!/ p:`:A_|՜嵴׹Gq;2ϵϜ5]5iߢ5@0gJ Zb!@Rp0/?S ѢL+X-vl)SQ\QHg  iHuB9SGzϰk]YN<nAcRez vБ6zX["]2l9\9ٗJh2s+'m,"n%V&%u޵ϕ9q?Ѻd9fg9(;KU]oTo򦁳`A Sv޵lFd9v>WkGV)W N[}K;t{Eh+/VAc(~r`yUc-?S lA#Nt$ @ߤvei4V:Uǥ|P3ČL9ˬ}8bgOǡ' שCs@YvژĆV-;VQS-?apcU8!/߭j{j {R`5ocv~ kz񄵡1$B@LwZsZmYAC9^e/:xYZ-,- -|+=HU.kwj{M*wq؍XN<9°v~ ߜ'k䖀73+*3MHxzTh$+jo֫} :3'6;kʷBwDR~{m [x1e`;V-Hʨ77au3df msT9_Kj33zU|y:d ;80`YF A{<:Ya9# Ms0:Z3NH]-P;ź_?= H+b۩~KRΌVƵ:S[~w{2tҍzWdnXX @ykvDraOݸu o(ײ6-KoW,j+?sؠV~n X剅Y*~+cr1\ߤk,N?4`ա<[E`= `}"n{qOO9+Ȭ]o J@|} PG򴠣7L7k#逆 j䵾eot 1 d3')~"kZ)ސP&i v݁N۔Vs:?LoW[׊=ڗyynfo+(6X>Ǟ;߭L[:Z/f3Vuzw8]nb]ÓwFY940RkکLϨ6+4-˝|ͬкN̢VZP4VpUXY$DQw֑e{앿K= 1m}]:0cgZ>Ռ rVh;n1X`tz7|f`R9m37N.;ʦ,A="yS #"%lg,ub0^X5^O:6S7Yhw"oevilw"ofp+Eߴ!"țY7la_D\y>+vU6i/"`y;OegEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD d@[}>La-+=O ;$?ƌ: {z#A /)S?rπM{5ǢyҒnv0#>L>@P}u|tyugDQ=N;f,}/Ks('VH%#"\9aistON-3[ fp]2 eo,H(QC/;2vi:U=ͪO!iVV|0DcEoCMwFZ+KS͉t2^Zq'o9S=BZr*@!Ҏol rV)v]yv/f-[ڱ:j|p:rQ]_ʼnenmk*W9rjǬOl1j %~w Di?,S"IYgy i︝E 0^GMK7 ޒ?t{'2/ ߓׯEӬE FXM//мgIeS={nٱXS_㦗hw'2Q 7>YD`)+p{u ABù2Dn_*p Y[[{C`7@ eS7T@4ch<7Doe'+ lù'xb zmE[=^9SHoe*tL^79(|C'J١ym8 .vn~R0s @ـ;D9wmZVp"D^:3v=K|2mY;e{b-rka5#ܰLX"ƮgO+K$*PWʕJVʤc?c׳'s_b!`TŖno5G,aCkx1X,\=NУ x?WojS,$m@[ <|2Wq3Q {)w_7&H+}72'ko(S5~tby_1mӒ;%=?]Eo'6PF/TRF_f}Xee2sw.VXN\,@B*^o,+Y1>J"XiZ[eb;jy}PrޏXc"Jc:HՃq׷g-y(e!)ʡ\>wQ[eejaw7XiDYYNbu¾s:#!/Ln\Y{NU8VցVo++t-N\o3sשxvyX^YP*STpsCf1Q[g8 ]7W+ Tcj nxnr(vLtuwigf+ Txd/n <oٝ=`j(xfFyNi\Yh*z9ңJVpcP>ޚwe'9:Tc4֛a^e}:s|5kAR=XIoҒ=ȫ?(ڔ'U%% v_FBɎJNfh9Ttz#ѱ{[]ozj#[X@}҃k^^<,e-zbwO ag\v*V:ˉ :|Yf'.c'ǓWŠO&v\4XFrj|oV+[az` _kƀmP'ǓV,l3YJ;.o 2ټ.8;G6@Ծgӣ5.ZibEc-8vlg8ϷxC{=v}Ϩ姅5ۯy5 OeA~Jk Ew <'g%o7MOܺBu_ x`\1.q,]ߢ=ޖKl>aWخ|8y/ovV^cyAAN{r/@ IA{YǬh+5_ {6Ǟxԉ p "}4M~`͒Ywl$VtWr=HO>c>9`F-7^'m[gu{7nI(+:f`FȪ)a{*ly"a,OHZŎ_Ż: 0}6e|G Hv oـ-?U+#Tز|K̹5d;O.ozТs#OVrNbKl*o0ߖȪOO}}b.:y:gӐ?u(6@bTyͩZ-5'F7ڍ Ovmi^Ė\-b3sڐ:k ̬ ^WNQ^;W)tLen}ymW~ Zq*_+:E'[͢N/T8D{x[~FYt ZuzfH7DXqaؒ~"=O-?Ox ‹Xi ATڙ׃w'/' : m}V~"9%Obc: &׵%ȉM/HP}\zԦn+hi}(+/7I"C_q ck4#oͼ>{AkiXODu'"""YP%""bDh)""" HODDjODD'""""""""""""""""""""""""""""""""""""""""""""""""! ~lKM/í_ފegyViI;_ ~&XЦSe2Rɇ}*oG~OO:6'`Q;MtCDcaeϰ:A}D#:r(C0?ӓ@YtP$5ϷÓG>ط1+°SѩyC4*|gʉ}n,3<1 fN oɇef0AO9{P1[fAgm,&,; 3;9X2Sf]hC'|8ߒ#a)YY %Df?Iϲ;88΍},+v|ޒA mK̴Q+;y[Gm\¾wYV4;η#}$컷C ΐ~p"ߣ*eڈ!ytnր{byg?9NC|&3ܜXviG}!Vn} ^Sc`NoG>UWFpZ]Q-.zgB ]@_0tnkVOՌ+4^r:v^muB &쳳򃠬 ]+M#-:WOذoW[V,esjΎɚa:]sIW ܒ F7(FY:g-O=(-U0heU݃ ~Ym-un[Ow'\-?);4g#X_pUo33RmzG{6T |׀yE ؞uԓyeY8-xKBU>੍Y5HK6ϣ @z xˉ'Mu3ssVsV!oif ,O_Y92EcσՂ+E ;V)\++#Nx /[:˝sykmDेup(||Xy>X=*y eT-=L gPs%j/kyw?)PXy2xi'yIyk$af>NzK> 0mx* 3^? KFx v`쬇`:NzK>f\ ~kP9(TgXC^f'VxyϾ/:<ojmdY8;;6 4Dk={nR-{،BٹߙFx'Vx==~jiybd+oioᝋ{.D? " j2(fp=u\gb+xz-;;XEz ܵ_ֵXrp/?[nT,r?ivpO6Ц{ghK7垔 VLS(]}|`j2ۯ*Ҫo0jAiE9{idTWQ'#`9˪Yޝav>Nio `EȱߪL܍;o*+һZKȲQ'y+VozeEyav>Nio `vȱ*%~@yPn,T@gؽUfw_k~dgv>Nio `fHNUa_s{2)Ж6Ĺ=1+sHP!i2'rg{UwҬ|$; [&==bY\myr^˓A6:'y)솞[*ZWOkϵd;]aWfup3v[FӋf; GMOGfnعvVعcw+Q<`glV7AsZe\]V:dlT:o9L{EK} -i{RGfg_-'||D;`䝫GO>،:nWbIJC‚ޖ{+7֍u+`K3v[zճOO>"8ebku^:l]f,K5Y~6 s3v[Zy|DzDV(R`kPf\IwJOۇg1Si&3v[Z^"!_-̴j˱ZFxc-)[ŽreKl٩wUO>YRݞ`2>-n5z{<ݖz6p3,H-ՋÚyՂ`Gz辗}eT/wxKyt{쓊x7RwmN|cd6AJW|X}g`GZ *ml7R6QѠF+-nHhm2pzQ^OQW3ϭ`}78ͱGx߉AG{?˾{&/-7G7v4tԖ7RN #~.鼼jO$;nia9jZvm[DΰAܖzu@J]wKi6k+׎K1+eV{U#NlsSyti-Ԝ~[:jmcsv-',Bf4'(ҪEo\{ݪI;94Tfup3v[X`i-9n~쨞|XiBo\W<"f<*O  o)n:YuW-,[0L,(zNzV'qGzpţl̓(n:YuW--m8WB#zn͎rehn۬x>XyPg`Wǻ.O}+֕HV'1ӬuQ7ޖ `h#vs܉uL|@*rl5oiR,`ѳŬuQ7^~[ :?c[=G*Rn Xž)3cw |, e*eo&'4^WZ#hV73XߏzŽX+~?_v<>cx~*% SY[=/?,·bb?Co@}hӑ[G[ ^z:>'vBR[Ik`M䙝 \3;GW`Zg7|`lJhf뭈V-x3ٺ7^믓TԾΎhG IecE5@z"-Flid5;~YN-7{[6& 1z9{VbL-]}'CN@gYCYx۝Flid;~& ΎfV<(,>)ȼt3eՓ2eFYΎm޵JXkWVj4W3 ~ZoV}f bO/ 25tKzu'eˌ4ΐ?cwMւӬvZ3;{60ZZW{~]pI@gT%ly:2wuN3-om2xm\[HZYїɕ} 05KS53WTfc: 3^T?^ƏEn82iF#mGXOt4kO쭚փ^-dg_- ^4& *E-HvAڑG=\Wƈ7yu:vDy^[M(֛jklyn-ݷ]{Ӯ`tTO +gڌ4Ɏ_6@[x _2YSԪk 2*!\3ˬ':D?:oB:vbsJ/" h)zStl֖cg5;O//Pڂw\vE`V:Y瞖N=CBZ歫 3'Nup37̳ 󞚗QvbLznn ;Oj¬cKKӳw$ 1xΆdaDZiFjRVA0iSl@NfZ[v%Aef &虖-,(Ј[g5f-bPɖѡڷ\[m0HS s_׻9Ԭ2;n@S#ur ?t<[M'5џROnQ0#PJe""(@*K ;\@R ""| <; Ea0A'/< N5׭} n-V-Pyѭ=ee41*MH,(Sv^yA wQ@9| Ҫ\L3A@N ʋLb-ҟ? z2֧:Dj -Unj:fVǭy}ܣ}ŀja)JΣ=5o'MmuOD F]|C4b5QQǰrKwPY=)%}Z&ztǖ sȠm{Djjd.գShRY>X +rP{2DM:dܓ 99xeI"=Qke &+Q(V㑲"EBhJFʮ? @fpj% Zfe{җ_n~o'reP6S0U@QM[iV}^mVpjgI6D"z;1Ztv 'B-uXJKϥwxK'6>$Mrr2kN0QVT}[G@cWWpA |{++ᔙ`DW+hDv@33fD'NXi~CjǬr6"H8ݗ[@b+o2'Gʈ 9hDnaROz-m5۳o2[nx`Uz6oPn8T+`*"`;w6yNsQ^>j ;ѲPʨH*9cP^8ӂ}l^ڴ7H`vkɓ|Dy +t}#[L'7>Z +FVf{a{Jˉ[+û3uc͛|ML6lb7۪YgjOm9(Ȕ/Bh)Ȩ^S("wΦ KpY8`@@|»]s6<ֽ͇;1MnΨBQ j =<tg*yok_=7ޏy%7H 9[Hoy*T ;V-P߭-+9oClu6+-H|{|ngV:Nԍ-BFd$^uWQGl{ M/[2P^ҤV@> =U>]{[[}n%Y~6wLPҞٰϢ=EN@tҵAgQkߵ r{/::VWOm^>s/ch^Â=xh P:;SqN7ݬ } Z=IYp Oe0/kHw˯&'ʅ{Pzc6ш\`=\݂5"""`z"""`z""""""""""""""""""""""""""""""^Êu=:c#yK>jnۍiyK>DBWyБYיscnLs[!?XFXU{Q&10?k U Ƅ֗%'#o 0 u f7m$GD,Kl=fͺgNW%,+cTċR-}i_+1ƼkC[o>=]YvKcWkYsMIf8U1o=i:CO>"{V;sX:SUt<xQh}N1 i >+x`FwcZ^f|D=rBVfgK> z댲 wSxaǞ_6:Bd }bY-u͍ykId;c%7`v`e;z|_Ko»nlceرyĖ}"}%/3z1o,}(?|bd`7>Λu?O 4M$zdžbeرyJD Ju;ӟ1o^O7^/mU6Q[oe[+(yT~XviO~S^$YL򖎺ƼZMĝ7^/֠R7خ nPϭ; qaXvI^h)(נ'okn[oq}r}ܩjڶeeر',rd471oyʍ׾f$}ܩ;.Z5zm[v|fbeoiPy `f׌cS^ۖƭxZ7֠Fq6@7^|q krUZviO~&@h j471o^ǟ׌ctRyiyfl±2ӞFm;ֻƧ_ocO}H 쬐oiPycife'3-F`-ox 2F^xӫ5|Ƽ= !h F`-6wM 52Ž ľs;+[h>npcẐӏ#|(X &Qh/ޘKHVFWGoiPyI3kC''Cz-B7l뻝vl-?9YSs77ͬ#dDWGT#PG˯.8(2Ď'@gBA7m$ͬ xGH>"ɇ=Z1o 2ŎƫBN3 5ܘ4{w#|(YlrxcF oΙ[h>npcFfC0hF`?fb{F"2ȝ"^rv|oFAP>UWeX -Ǖ$;=x՛DDޠv6!iyC3:Tg;7HI=~n\ObOq@ED$'JˤDD$܏ņ-07wD_3""a[A( cDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDd[A?$""RIEDDB DDD>@DD)@ DU~ݐKouӐ?tyg//suؙ("뼧!_H/}T&(' >IK-)V?+mqyK'hF;qWW^^g߯_FZޱ3yozխs3P}aNǛݡR@4hagRv] ^hoi`*684뀑n+G F27h>o}jAw[sUy{N/P`jЎjX\Vk0g31yK8P&ZJUFWJ;;.AYE:T667x3Hug>ʮL֤*YV˂Ffů7{>1O/d+Rp:Bne?;@m;{Y)jy/KX?gdZ鳮0EƹQ/ a˫QEbLFaPgI=^jǕz7GϷVO֫fހxJ cox dtyBcu-hh#rm->{rֺeS8lc ]]Mr'6VZkuUn^G͎݅u-E v5(ڃN,jQgꣵrW@F]TJWm0q^~ ȱZg^s*h=~WQvl43iֱF=h `-IPK@6k}V ZحHK9o<%E_<pc[i` ʓ `*󴎝4<}g"6Y-rv] X;Z]ʯ:YvޒgpFI-OI/ZT6e6Q@)Ͽv.<c8ς; oaKؽZf7`F[by o 7J` 4ã,Ӳ|,~׫v*=|> []]z2фu,+XiVN:(#`xy%:j6vj|bVIYkDm?ָZyT(XD4@-3Yμ|Zx(i#CrX}B%ގW[~W'KnyKVX}^Q,R7[{+8PЯ^WN%+eȎT.,X) [W'@옙zKi vJ 2 ZX̗-ٞ Y4xWl/ xI؝4s6 Ef?D 7ÓT_վ+ilV=鵤w3?o H4.o9LZZWsG=sD\1jLyK^YE&IzEyZGyZ U@fohSs-h rv? ߪ|jǵqotoX2anbZ{WàҙCӛܵܣey<ηKo@ a+e`#c=Ei .[6dvl2iy&H7:o~O >f KOηSkHmJ[]f> ztX 땫eAC*αBDʩ`.\@,Z÷ uƞm[ٖ{ۗ^V%? \FD 8SEK4!+JV'e9ztC]z\ 1"#z7S ""kuP""bn\ @DDj)tS""?2;wvAxcA)0]AWOAWF7?/CDD䥾U\_DDDDDDDDDDDDDDDDDDDDDDDDDDD]g?_~NޱL~Qŵ5_""r! " InitialDist: 0 Width: 6 Whitespace: 0 StartX: 270 EndX: 276 StartY: 0 EndY: 9 Char: "?" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 279 EndX: 283 StartY: 0 EndY: 9 Char: "@" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 288 EndX: 295 StartY: 0 EndY: 9 Char: "A" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 297 EndX: 303 StartY: 0 EndY: 9 Char: "B" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 306 EndX: 311 StartY: 0 EndY: 9 Char: "C" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 315 EndX: 320 StartY: 0 EndY: 9 Char: "D" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 324 EndX: 330 StartY: 0 EndY: 9 Char: "E" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 333 EndX: 338 StartY: 0 EndY: 9 Char: "F" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 342 EndX: 347 StartY: 0 EndY: 9 Char: "G" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 351 EndX: 357 StartY: 0 EndY: 9 Char: "H" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 360 EndX: 366 StartY: 0 EndY: 9 Char: "I" InitialDist: 0 Width: 2 Whitespace: 1 StartX: 369 EndX: 371 StartY: 0 EndY: 9 Char: "J" InitialDist: -1 Width: 3 Whitespace: 1 StartX: 378 EndX: 381 StartY: 0 EndY: 9 Char: "K" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 387 EndX: 393 StartY: 0 EndY: 9 Char: "L" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 396 EndX: 401 StartY: 0 EndY: 9 Char: "M" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 405 EndX: 412 StartY: 0 EndY: 9 Char: "N" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 414 EndX: 420 StartY: 0 EndY: 9 Char: "O" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 423 EndX: 429 StartY: 0 EndY: 9 Char: "P" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 432 EndX: 437 StartY: 0 EndY: 9 Char: "Q" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 441 EndX: 447 StartY: 0 EndY: 9 Char: "R" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 450 EndX: 456 StartY: 0 EndY: 9 Char: "S" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 459 EndX: 464 StartY: 0 EndY: 9 Char: "T" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 468 EndX: 473 StartY: 0 EndY: 9 Char: "U" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 477 EndX: 483 StartY: 0 EndY: 9 Char: "V" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 486 EndX: 492 StartY: 0 EndY: 9 Char: "W" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 495 EndX: 503 StartY: 0 EndY: 9 Char: "X" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 0 EndX: 6 StartY: 9 EndY: 18 Char: "Y" InitialDist: 0 Width: 6 Whitespace: -1 StartX: 9 EndX: 15 StartY: 9 EndY: 18 Char: "Z" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 18 EndX: 23 StartY: 9 EndY: 18 Char: "[" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 27 EndX: 30 StartY: 9 EndY: 18 Char: "\" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 36 EndX: 39 StartY: 9 EndY: 18 Char: "]" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 45 EndX: 48 StartY: 9 EndY: 18 Char: "^" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 54 EndX: 60 StartY: 9 EndY: 18 Char: "_" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 63 EndX: 67 StartY: 9 EndY: 18 Char: "`" InitialDist: 0 Width: 3 Whitespace: 1 StartX: 72 EndX: 75 StartY: 9 EndY: 18 Char: "a" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 81 EndX: 86 StartY: 9 EndY: 18 Char: "b" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 90 EndX: 95 StartY: 9 EndY: 18 Char: "c" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 99 EndX: 103 StartY: 9 EndY: 18 Char: "d" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 108 EndX: 113 StartY: 9 EndY: 18 Char: "e" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 117 EndX: 122 StartY: 9 EndY: 18 Char: "f" InitialDist: 0 Width: 4 Whitespace: -1 StartX: 126 EndX: 130 StartY: 9 EndY: 18 Char: "g" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 135 EndX: 140 StartY: 9 EndY: 18 Char: "h" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 144 EndX: 149 StartY: 9 EndY: 18 Char: "i" InitialDist: 0 Width: 2 Whitespace: 0 StartX: 153 EndX: 155 StartY: 9 EndY: 18 Char: "j" InitialDist: -1 Width: 3 Whitespace: 0 StartX: 162 EndX: 165 StartY: 9 EndY: 18 Char: "k" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 171 EndX: 176 StartY: 9 EndY: 18 Char: "l" InitialDist: 0 Width: 2 Whitespace: 0 StartX: 180 EndX: 182 StartY: 9 EndY: 18 Char: "m" InitialDist: 0 Width: 7 Whitespace: 1 StartX: 189 EndX: 196 StartY: 9 EndY: 18 Char: "n" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 198 EndX: 203 StartY: 9 EndY: 18 Char: "o" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 207 EndX: 212 StartY: 9 EndY: 18 Char: "p" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 216 EndX: 221 StartY: 9 EndY: 18 Char: "q" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 225 EndX: 230 StartY: 9 EndY: 18 Char: "r" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 234 EndX: 238 StartY: 9 EndY: 18 Char: "s" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 243 EndX: 247 StartY: 9 EndY: 18 Char: "t" InitialDist: 0 Width: 4 Whitespace: -1 StartX: 252 EndX: 256 StartY: 9 EndY: 18 Char: "u" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 261 EndX: 266 StartY: 9 EndY: 18 Char: "v" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 270 EndX: 275 StartY: 9 EndY: 18 Char: "w" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 279 EndX: 286 StartY: 9 EndY: 18 Char: "x" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 288 EndX: 293 StartY: 9 EndY: 18 Char: "y" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 297 EndX: 302 StartY: 9 EndY: 18 Char: "z" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 306 EndX: 310 StartY: 9 EndY: 18 Char: "{" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 315 EndX: 319 StartY: 9 EndY: 18 Char: "|" InitialDist: 1 Width: 1 Whitespace: 1 StartX: 324 EndX: 325 StartY: 9 EndY: 18 Char: "}" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 333 EndX: 337 StartY: 9 EndY: 18 Char: "~" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 342 EndX: 348 StartY: 9 EndY: 18 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_6.png000066400000000000000000000053401200563112200230650ustar00rootroot00000000000000PNG  IHDR dK IDATx^1vc E{o++t v8119@SZ~7!G c1?nL2ۍI^nNfcl\_Tr~ٜ?`˿nt`n\27x?~$6>?F5zpõ'MW5DQO1l测d6=ɾܩ?9J}=U͕Tvog#[9\ߕ,q=QćdGHb#zx1Fݨd^ Lg]ԯ/dX|޳鼺 6`g9dsipr5`<]MU6wml 6|9Mj]jc Ly8I]'6@:V)]!|=*<絊+)SU 55 dbɩVT)A7dQ(3VFG9ߓ=_ͼV IGQ )y]{K#%qU6u9ȚAO!Zȇq(Cݕo$uCkwoOD ,땓'`=8;xCE;Z}J؁U.eS85tN[1d7yDPMA^ܧ5EjL~RT]7rX4:62=\+Tк溪 lAO|^RQc`BW7)o Q $Q岞j]$qW8TcYXq}dԈWR~Ts񞜮+zxEjy[OdUյگn` ,(0D bӠ1`,$I# h@Puww[8ıӥFL]xo5\,#C tV֭IF9^&Nupmc*tq//.Ǵ.j/N_ U\hQNm8inN: {]qmQj]9^U\GvWkWѯiڧzI\M\K૰H>^r%#Θ'WfX`ލw&%(uNB4_\TLDU>j N6LzD$lⵑb'1{clEXT"ʞʮX5oGY#'w2'.^xu329 1%(&G9R6h=HƠN5C묞i1WŰWȜӓx'q%pJ՞ zN5I =nP% l֧"= |CtyHMyF;I&!׭mkfOfVOAlFqc' ʍJfm,=U>\bh<ʞȍP\ݡY=zEĪ7^ߍ6HWwOE-nD+SxoNO"ltτ^ya2 ga\ÈG;d|6w?#̹>0gh8>s<ܘ]1Ƙ=~=QH|΁X}w@(|w2=iMY?rGWl~ՍENz4aH詫.XfdN5)زFW,&o=n/zʸ~tM'dHOwGstVA0p3@U6i9tH[⚨sgt )Wܩdu{"Pwx]Y>V}3^Ֆws1*応S/'c;:xÝdFfU(5RݡjLrG n.>p3`>$$:jUaQ1"[]WjTue eQQdЯ8Tgs`rcsXlcuc\ŴJ#8+eqbYiTw(o:(ZЍn2505LsIٍ05,_yw7u]N D1Nk=΋ru#JНt( =t0u6V'8'YF6?\k)nץXuOѰQt{Y2=,n=A̺iӥqtL~ 'cLOQM>}iYcPCܦ<=8}&6wk6~vh'jMIy EROo~hG"N oYyfno}~o1c1c1c1c1c1c1c1c1c1c1c1c1c1cAtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_8.fmt000066400000000000000000000206631200563112200230760ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 64 TextZStep: 13 Char: " " InitialDist: 0 Width: 1 Whitespace: 2 StartX: 0 EndX: 1 StartY: 0 EndY: 13 Char: "!" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 13 EndX: 16 StartY: 0 EndY: 13 Char: """ InitialDist: 1 Width: 4 Whitespace: 0 StartX: 26 EndX: 30 StartY: 0 EndY: 13 Char: "#" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 39 EndX: 47 StartY: 0 EndY: 13 Char: "$" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 52 EndX: 59 StartY: 0 EndY: 13 Char: "%" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 65 EndX: 75 StartY: 0 EndY: 13 Char: "&" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 78 EndX: 87 StartY: 0 EndY: 13 Char: "'" InitialDist: 1 Width: 1 Whitespace: 1 StartX: 91 EndX: 92 StartY: 0 EndY: 13 Char: "(" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 104 EndX: 108 StartY: 0 EndY: 13 Char: ")" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 117 EndX: 121 StartY: 0 EndY: 13 Char: "*" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 130 EndX: 135 StartY: 0 EndY: 13 Char: "+" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 143 EndX: 150 StartY: 0 EndY: 13 Char: "," InitialDist: 0 Width: 3 Whitespace: 1 StartX: 156 EndX: 159 StartY: 0 EndY: 13 Char: "-" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 169 EndX: 173 StartY: 0 EndY: 13 Char: "." InitialDist: 1 Width: 2 Whitespace: 1 StartX: 182 EndX: 184 StartY: 0 EndY: 13 Char: "/" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 195 EndX: 199 StartY: 0 EndY: 13 Char: "0" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 208 EndX: 215 StartY: 0 EndY: 13 Char: "1" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 221 EndX: 227 StartY: 0 EndY: 13 Char: "2" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 234 EndX: 240 StartY: 0 EndY: 13 Char: "3" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 247 EndX: 253 StartY: 0 EndY: 13 Char: "4" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 260 EndX: 267 StartY: 0 EndY: 13 Char: "5" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 273 EndX: 280 StartY: 0 EndY: 13 Char: "6" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 286 EndX: 293 StartY: 0 EndY: 13 Char: "7" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 299 EndX: 305 StartY: 0 EndY: 13 Char: "8" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 312 EndX: 319 StartY: 0 EndY: 13 Char: "9" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 325 EndX: 332 StartY: 0 EndY: 13 Char: ":" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 338 EndX: 340 StartY: 0 EndY: 13 Char: ";" InitialDist: 0 Width: 3 Whitespace: 1 StartX: 351 EndX: 354 StartY: 0 EndY: 13 Char: "<" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 364 EndX: 371 StartY: 0 EndY: 13 Char: "=" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 377 EndX: 384 StartY: 0 EndY: 13 Char: ">" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 390 EndX: 397 StartY: 0 EndY: 13 Char: "?" InitialDist: 0 Width: 5 Whitespace: 1 StartX: 403 EndX: 408 StartY: 0 EndY: 13 Char: "@" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 416 EndX: 426 StartY: 0 EndY: 13 Char: "A" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 429 EndX: 437 StartY: 0 EndY: 13 Char: "B" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 442 EndX: 448 StartY: 0 EndY: 13 Char: "C" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 455 EndX: 462 StartY: 0 EndY: 13 Char: "D" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 468 EndX: 475 StartY: 0 EndY: 13 Char: "E" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 481 EndX: 486 StartY: 0 EndY: 13 Char: "F" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 494 EndX: 499 StartY: 0 EndY: 13 Char: "G" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 0 EndX: 8 StartY: 13 EndY: 26 Char: "H" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 13 EndX: 20 StartY: 13 EndY: 26 Char: "I" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 26 EndX: 28 StartY: 13 EndY: 26 Char: "J" InitialDist: -1 Width: 4 Whitespace: 1 StartX: 39 EndX: 43 StartY: 13 EndY: 26 Char: "K" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 52 EndX: 59 StartY: 13 EndY: 26 Char: "L" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 65 EndX: 70 StartY: 13 EndY: 26 Char: "M" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 78 EndX: 86 StartY: 13 EndY: 26 Char: "N" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 91 EndX: 98 StartY: 13 EndY: 26 Char: "O" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 104 EndX: 112 StartY: 13 EndY: 26 Char: "P" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 117 EndX: 123 StartY: 13 EndY: 26 Char: "Q" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 130 EndX: 138 StartY: 13 EndY: 26 Char: "R" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 143 EndX: 150 StartY: 13 EndY: 26 Char: "S" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 156 EndX: 163 StartY: 13 EndY: 26 Char: "T" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 169 EndX: 176 StartY: 13 EndY: 26 Char: "U" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 182 EndX: 189 StartY: 13 EndY: 26 Char: "V" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 195 EndX: 203 StartY: 13 EndY: 26 Char: "W" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 208 EndX: 219 StartY: 13 EndY: 26 Char: "X" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 221 EndX: 229 StartY: 13 EndY: 26 Char: "Y" InitialDist: 0 Width: 8 Whitespace: -1 StartX: 234 EndX: 242 StartY: 13 EndY: 26 Char: "Z" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 247 EndX: 254 StartY: 13 EndY: 26 Char: "[" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 260 EndX: 264 StartY: 13 EndY: 26 Char: "\" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 273 EndX: 277 StartY: 13 EndY: 26 Char: "]" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 286 EndX: 290 StartY: 13 EndY: 26 Char: "^" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 299 EndX: 306 StartY: 13 EndY: 26 Char: "_" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 312 EndX: 317 StartY: 13 EndY: 26 Char: "`" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 325 EndX: 329 StartY: 13 EndY: 26 Char: "a" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 338 EndX: 344 StartY: 13 EndY: 26 Char: "b" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 351 EndX: 358 StartY: 13 EndY: 26 Char: "c" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 364 EndX: 370 StartY: 13 EndY: 26 Char: "d" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 377 EndX: 384 StartY: 13 EndY: 26 Char: "e" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 390 EndX: 397 StartY: 13 EndY: 26 Char: "f" InitialDist: 0 Width: 5 Whitespace: -1 StartX: 403 EndX: 408 StartY: 13 EndY: 26 Char: "g" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 416 EndX: 423 StartY: 13 EndY: 26 Char: "h" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 429 EndX: 436 StartY: 13 EndY: 26 Char: "i" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 442 EndX: 445 StartY: 13 EndY: 26 Char: "j" InitialDist: -1 Width: 4 Whitespace: 0 StartX: 455 EndX: 459 StartY: 13 EndY: 26 Char: "k" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 468 EndX: 475 StartY: 13 EndY: 26 Char: "l" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 481 EndX: 484 StartY: 13 EndY: 26 Char: "m" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 494 EndX: 504 StartY: 13 EndY: 26 Char: "n" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 0 EndX: 7 StartY: 26 EndY: 39 Char: "o" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 13 EndX: 20 StartY: 26 EndY: 39 Char: "p" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 26 EndX: 33 StartY: 26 EndY: 39 Char: "q" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 39 EndX: 46 StartY: 26 EndY: 39 Char: "r" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 52 EndX: 57 StartY: 26 EndY: 39 Char: "s" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 65 EndX: 71 StartY: 26 EndY: 39 Char: "t" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 78 EndX: 83 StartY: 26 EndY: 39 Char: "u" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 91 EndX: 98 StartY: 26 EndY: 39 Char: "v" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 104 EndX: 111 StartY: 26 EndY: 39 Char: "w" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 117 EndX: 126 StartY: 26 EndY: 39 Char: "x" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 130 EndX: 137 StartY: 26 EndY: 39 Char: "y" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 143 EndX: 150 StartY: 26 EndY: 39 Char: "z" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 156 EndX: 162 StartY: 26 EndY: 39 Char: "{" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 169 EndX: 174 StartY: 26 EndY: 39 Char: "|" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 182 EndX: 184 StartY: 26 EndY: 39 Char: "}" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 195 EndX: 200 StartY: 26 EndY: 39 Char: "~" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 208 EndX: 215 StartY: 26 EndY: 39 bzflag-2.4.2+ds1/data/fonts/DejaVuSansCondensedBold_8.png000066400000000000000000000103351200563112200230670ustar00rootroot00000000000000PNG  IHDR@lϿ|IDATx^19E{^Do+&:t谳z=uTK*K&_" HUɿf1N&ٓ\C2_drg}#w2=:mggv4]+ɝe^}V|qs1уw;dǝLF?ޑjGtկۆ^dAGf}hu`&0X|D3tdp&U,x&@ļWH7'AMt 'R-lɽ[%X]$Յ{"-N8Ou'[Tt"/vX2@>KF|e ٚD;_܈!n/6`Z[G!J'=By;?<1um)2 STWÉ0lģEl.g#+CcQGq|@c]ɂY%yEO $~ux :|Qv1dg@@Q2?"[% :[?R[cpT2 _Ǟk2|OlǾUaEa\YtZg:Rd!tj^А-p@-vYF'8FG~tB j\]*;ڨz#6#Ko 5T8H0IHK*}{6gGfɁO_kxX$PelHBkEapDɝ 9 _^ֿ8 1j[Ut͎n G]83\JĠyS.'gkoC;Up,(.U N_s$ }~G|@'6Ċ,DgЀE/{E9^Kr8 +RI|#N6v@ ]iCM'~ Ɏ\SQtKm5LG\;1K#H,ҫŸ`Sk,z%?IEVHXՓ8|0581&߬9m0ۣ13rJu3Ӌ3ytV!@f&/`cj9xchaqI$*;ruQut_yLs}N;xLWP߹UhFfvO&'IY=(tJ՟W+/Qsהō=ԟht8?#r;ݤ/3W?<׎pmD:IRA:TM `ը1y2T暕d~pgZD;?'Abf90?ٮv%tơqYm S;Zc"Tl1U>>vlvɳ n_(~eU6Ğ 4_A8.q4 ^l7 :Ftx̥RߎcgxPuxR"{dc%sZ)D,HS}l%hf#ͺh޿nٸd[=Ց [ohG}kEmL߰kIVtڮ$SmC6n1dqY_\gق8{ dU!th5)‚mxYbTdE(1R4OJpJ`75\[$Yi"( +Hh,1DyzgbL>&~6uSYGw4Jb\hNׯzó;1ﴮQ2N.$J\^DtXPV³ v{㮶Ms3* gk+E$Ҝb+x*h\o<ҽ>6}蝡0?ˆyJ;JȊ|}!6he<~C_Y6Ĩ[zt*Iff ::Qqd xQ1\lGEd HNzQ+r.kWrڈw YE2z]Md8)hO(+<2?MNstg|Lsa+Qѝ80f:h%.uW/Wnb9U.8؞>@g4v8:{}g&J <ΏfAoc;>nVY@B %E, da⦝ot?ұ1dy4n󏍽`x#W?&@51DhoR=1RU/ s+Q0* WڗLq0Ѫb0^3볫]?C.īSԜʮRyǣ]Bcck9U|k jdN acVq(xP_TR1cu`P9ZuWۅcyAtJF)wJWl޼<çt,tȎtt% W{7J }]cy+Y]tN%yv_۩m$x~Vp]dzzdw$۫ Y5ƘǯQsLz]ʯ^+"%+LIIIC;`R`Lb' KQ6E/>zV[I3ZJ(JFv+s#v9Wd1??SIJLEvV~z\%jNV ARVB&'lmCccؕ8u]٠7AB j (4+pRB1COYIJgU@5B$&ɝ)HlY"Y_H9q3}x 0~0j~jb]-EM&v1rV t^+Ndžt;?+9ImU|%#ً#l<1a,{49,x_1UƜbZΊ1Ƽ+xBdca Ofg`L;مscOvyofu1" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 76 EndX: 84 StartY: 19 EndY: 38 Char: "?" InitialDist: 1 Width: 7 Whitespace: 2 StartX: 95 EndX: 102 StartY: 19 EndY: 38 Char: "@" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 114 EndX: 123 StartY: 19 EndY: 38 Char: "A" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 133 EndX: 141 StartY: 19 EndY: 38 Char: "B" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 152 EndX: 160 StartY: 19 EndY: 38 Char: "C" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 171 EndX: 179 StartY: 19 EndY: 38 Char: "D" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 190 EndX: 198 StartY: 19 EndY: 38 Char: "E" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 209 EndX: 217 StartY: 19 EndY: 38 Char: "F" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 228 EndX: 236 StartY: 19 EndY: 38 Char: "G" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 247 EndX: 255 StartY: 19 EndY: 38 Char: "H" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 266 EndX: 274 StartY: 19 EndY: 38 Char: "I" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 285 EndX: 291 StartY: 19 EndY: 38 Char: "J" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 304 EndX: 312 StartY: 19 EndY: 38 Char: "K" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 323 EndX: 332 StartY: 19 EndY: 38 Char: "L" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 342 EndX: 350 StartY: 19 EndY: 38 Char: "M" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 361 EndX: 369 StartY: 19 EndY: 38 Char: "N" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 380 EndX: 388 StartY: 19 EndY: 38 Char: "O" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 399 EndX: 407 StartY: 19 EndY: 38 Char: "P" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 418 EndX: 426 StartY: 19 EndY: 38 Char: "Q" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 437 EndX: 445 StartY: 19 EndY: 38 Char: "R" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 456 EndX: 465 StartY: 19 EndY: 38 Char: "S" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 475 EndX: 483 StartY: 19 EndY: 38 Char: "T" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 0 EndX: 8 StartY: 38 EndY: 57 Char: "U" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 19 EndX: 27 StartY: 38 EndY: 57 Char: "V" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 38 EndX: 46 StartY: 38 EndY: 57 Char: "W" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 57 EndX: 67 StartY: 38 EndY: 57 Char: "X" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 76 EndX: 84 StartY: 38 EndY: 57 Char: "Y" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 95 EndX: 105 StartY: 38 EndY: 57 Char: "Z" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 114 EndX: 122 StartY: 38 EndY: 57 Char: "[" InitialDist: 3 Width: 4 Whitespace: 3 StartX: 133 EndX: 137 StartY: 38 EndY: 57 Char: "\" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 152 EndX: 160 StartY: 38 EndY: 57 Char: "]" InitialDist: 2 Width: 4 Whitespace: 4 StartX: 171 EndX: 175 StartY: 38 EndY: 57 Char: "^" InitialDist: 0 Width: 9 Whitespace: 1 StartX: 190 EndX: 199 StartY: 38 EndY: 57 Char: "_" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 209 EndX: 219 StartY: 38 EndY: 57 Char: "`" InitialDist: 2 Width: 4 Whitespace: 4 StartX: 228 EndX: 232 StartY: 38 EndY: 57 Char: "a" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 247 EndX: 255 StartY: 38 EndY: 57 Char: "b" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 266 EndX: 274 StartY: 38 EndY: 57 Char: "c" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 285 EndX: 293 StartY: 38 EndY: 57 Char: "d" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 304 EndX: 312 StartY: 38 EndY: 57 Char: "e" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 323 EndX: 331 StartY: 38 EndY: 57 Char: "f" InitialDist: 1 Width: 7 Whitespace: 2 StartX: 342 EndX: 349 StartY: 38 EndY: 57 Char: "g" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 361 EndX: 369 StartY: 38 EndY: 57 Char: "h" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 380 EndX: 388 StartY: 38 EndY: 57 Char: "i" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 399 EndX: 407 StartY: 38 EndY: 57 Char: "j" InitialDist: 1 Width: 5 Whitespace: 4 StartX: 418 EndX: 423 StartY: 38 EndY: 57 Char: "k" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 437 EndX: 445 StartY: 38 EndY: 57 Char: "l" InitialDist: 1 Width: 7 Whitespace: 2 StartX: 456 EndX: 463 StartY: 38 EndY: 57 Char: "m" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 475 EndX: 483 StartY: 38 EndY: 57 Char: "n" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 0 EndX: 8 StartY: 57 EndY: 76 Char: "o" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 19 EndX: 27 StartY: 57 EndY: 76 Char: "p" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 38 EndX: 46 StartY: 57 EndY: 76 Char: "q" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 57 EndX: 65 StartY: 57 EndY: 76 Char: "r" InitialDist: 2 Width: 7 Whitespace: 1 StartX: 76 EndX: 83 StartY: 57 EndY: 76 Char: "s" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 95 EndX: 103 StartY: 57 EndY: 76 Char: "t" InitialDist: 1 Width: 7 Whitespace: 2 StartX: 114 EndX: 121 StartY: 57 EndY: 76 Char: "u" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 133 EndX: 141 StartY: 57 EndY: 76 Char: "v" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 152 EndX: 160 StartY: 57 EndY: 76 Char: "w" InitialDist: -1 Width: 12 Whitespace: -1 StartX: 171 EndX: 183 StartY: 57 EndY: 76 Char: "x" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 190 EndX: 198 StartY: 57 EndY: 76 Char: "y" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 209 EndX: 217 StartY: 57 EndY: 76 Char: "z" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 228 EndX: 236 StartY: 57 EndY: 76 Char: "{" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 247 EndX: 253 StartY: 57 EndY: 76 Char: "|" InitialDist: 4 Width: 2 Whitespace: 4 StartX: 266 EndX: 268 StartY: 57 EndY: 76 Char: "}" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 285 EndX: 291 StartY: 57 EndY: 76 Char: "~" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 304 EndX: 312 StartY: 57 EndY: 76 bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_12.png000066400000000000000000000131431200563112200221500ustar00rootroot00000000000000PNG  IHDR}W IDATx^=FY1[ fZز;L2ۓ9_DFMa4,率uWr/ټ8_;vr/Q̨k_/_LkX|kwtn+r~ zȎ?d1Yڶؙkח'ؕ߿Xe9WW~=碸RW_Nvόr4b4~o(n[YC: ޺tn+rԁg|1=͌yׯy,ڏ ׏Ve2cn1ڠuWrDq:4/yDeшҶѶ7Uide\6^{f}*kgj*uDz?WGbw;ch c@D_O~Y+h%ڑSD!~ͨޝ.rY+vTW9Vgڕm-45.~Y})ΌGrVxs[ef<ٸI̶՗)r\0zgVؿ6"eOiAWH\5TffC5~V28n:!Acw_}r^}CVvUXvOMt-U^.l؁OQcma|>?cmfkg4\\v[mnVL=AٶZmS,!zw{=oqPbNVc![AoHU>mwV;޻;g5?V>~uݎ땵ҿnu~ʢܻia9VM2mR]*J|^lg;]#-rVxc3~B)+T{65F"t:Q]^,3ٿYmWu{9;Q\L.Obvry X?G8.r(ó .(;l,8̜Ոu;,߫0]u1<QZ9%SƱ>+29gr:AzJ ,ΩuT1NJiIvv>.u#G2qL(3jvw :˶SYwWDuQ@6j2.M`f+}oE^kTW+e|ي 7B&(UM&e?F Eqw39uc/jL<E޳rUNHLfU̠s4SkϨYh}\ P3LչU0=Q?/Ck^Ύu.ǶY⊟y*c@uR;H?YʔɌ_4hmY6jG;]ǙlA󉴔W= =WսbO 1F{U<@3 ph__YDV}d/<1(:sm=q29f9g1g7kɼrveC嘼\|u~Y2n`L[>sz}%Qיtﯫϟf/L5iWf3{U\&y]33ʵ~U0省d+2q~F}֠,v4Yl:sivm_WTb#>Z;3μ?{>C\0{߽+ʵ~~>Q>3{JݭXK{ٙ폇 jv=F+h@uu_g_Qdr+K}y岎)g# Nv;S21.Tw>c#q)3@8+Sfv-/<;Rhf[gx6BBr̬\}5˕ՙuH&bt(>0cPt%b+Z.wM"evʙ|GEUVL)_fno#][20IlX}{Z"+\͋bGw^wYQdr۴;2¬\{>U{Su3ljvgKucBԍUuWuSunVqh{QߗNjrxZFxwaݑk;oJl$[1?G2¬\vG`|UL%2ٶمc3WdI%V|=!XF8Nu1UL&Tb#܊VvdZ=4J+ϟĬY.yW!]hvO'ږK*#•(~de_Rd?uWϟO0L.F2ǘ*@WV21xzvwK+ 0moޝ|EW}E8 hl6ec%X2|cy*&\ck9+gg֯κڦsǛ|#]. tfS=wq"sD*GL\{3g!\fw>+b]}*+W\Ftf_ҮʥwYydQ]shi~ebwBy(^ gV<ьe^pd\(DqO*WB7A}V2 Z0;Ǹm([tʬJ-w]e/ɴ9r)΄oNbw=[|w};Dt%3D3>>?&Andq2~&8z8QsR5ڻW*,f@UbGV̍Afw핝S>ҽ*嵁xk(Nw3o5W5;:V6xɥ-{ WvFcv#jGoGU=}_;QYѶdn̲Y>u*+n=S>W)w9;Uμ\xDU7rɫ;pYngYrʹC~UCFUbb#|^g:WLW__(tgyJ9s;/L^u̾P;V'/ol2{P[4Ht댶iBV:ʧ~ܵ.hxCSr-3>XmZ;omʹ9ND3T_ͧGg1^+ou26e[{cU/<r6E)+S-zw] Kq[Mgxŋb=/cJ{wg9$SYdcgrxNZ&3n }HFyH`3h2?:ݑ'z}W̬SmTu; g(߻>y/DQc;x7׬ ~;R_;&SQ6*Ʒ TڝLYVWS^KR-Q? LlU sULRPULGg핥r5 "]w](S?-m4@;ʵTbe۸^51]횩ߪZU|6:?qsT2 NsC?wѩ~;XZ|ƟULg;ʵTbe#3W۾e2>d(nFe<6NȟǏ=@d\8S-ǙU;NT7mSL,WȔcԹL.Us)_Y=^-9VU P2fD_uJs_e nWƎ#U*{'O4[WxO1лW>uWw&YJm\dryx稁]QDϗk[U 2"W;jl_N^=Sꄌqx/>]w;{繣xo/c۟BE޳K*U6b*V+[>z: b?h3 {٦Jՠ`gq*TL}{'V7YX~G^1ɴ>uu}fZu([TrD+wī$Id|>nvϨUgx%qeVX<1^,8I++;SୌVm. 7g/+Q3{k*#Gt6x71FZ 5~~u#莜6 :v&3Y*K] wy~;`پߝ'*.Os.fQ}v *MH[UֻxJtݑ~LÞ1;0dc;Uu1L>u_2d5za}=-H;٠#Tb#莜6 }ד~rwVru:+n˵;)[fNl٦*G&w'j@X_&;i`.EۤxZG40/:r:rj_>OGG[Sc{nw0-]1juyfWuo#[x>:mO4=u݁_";tKv@)*GZv(h%s}rum;ʷʑͭm=vYGk{N8C;_*+"AQu;Lgs>ֶ秺fy+ #A @:cQUlnuf뮰:[tl+W/U)Thm*l3[%W;oQ?S簻iPD3X1#'7Qѝ:yG9g4x|éptF }[g>Rڍ;_^)Wx>BPtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_16.fmt000066400000000000000000000210211200563112200221500ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 128 TextZStep: 24 Char: " " InitialDist: 0 Width: 1 Whitespace: 12 StartX: 0 EndX: 1 StartY: 0 EndY: 24 Char: "!" InitialDist: 5 Width: 3 Whitespace: 5 StartX: 24 EndX: 27 StartY: 0 EndY: 24 Char: """ InitialDist: 2 Width: 9 Whitespace: 2 StartX: 48 EndX: 57 StartY: 0 EndY: 24 Char: "#" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 72 EndX: 85 StartY: 0 EndY: 24 Char: "$" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 96 EndX: 105 StartY: 0 EndY: 24 Char: "%" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 120 EndX: 132 StartY: 0 EndY: 24 Char: "&" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 144 EndX: 156 StartY: 0 EndY: 24 Char: "'" InitialDist: 5 Width: 3 Whitespace: 5 StartX: 168 EndX: 171 StartY: 0 EndY: 24 Char: "(" InitialDist: 4 Width: 6 Whitespace: 3 StartX: 192 EndX: 198 StartY: 0 EndY: 24 Char: ")" InitialDist: 3 Width: 6 Whitespace: 4 StartX: 216 EndX: 222 StartY: 0 EndY: 24 Char: "*" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 240 EndX: 250 StartY: 0 EndY: 24 Char: "+" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 264 EndX: 274 StartY: 0 EndY: 24 Char: "," InitialDist: 4 Width: 4 Whitespace: 5 StartX: 288 EndX: 292 StartY: 0 EndY: 24 Char: "-" InitialDist: 3 Width: 6 Whitespace: 4 StartX: 312 EndX: 318 StartY: 0 EndY: 24 Char: "." InitialDist: 5 Width: 3 Whitespace: 5 StartX: 336 EndX: 339 StartY: 0 EndY: 24 Char: "/" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 360 EndX: 370 StartY: 0 EndY: 24 Char: "0" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 384 EndX: 394 StartY: 0 EndY: 24 Char: "1" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 408 EndX: 417 StartY: 0 EndY: 24 Char: "2" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 432 EndX: 442 StartY: 0 EndY: 24 Char: "3" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 456 EndX: 466 StartY: 0 EndY: 24 Char: "4" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 480 EndX: 490 StartY: 0 EndY: 24 Char: "5" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 0 EndX: 10 StartY: 24 EndY: 48 Char: "6" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 24 EndX: 34 StartY: 24 EndY: 48 Char: "7" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 48 EndX: 58 StartY: 24 EndY: 48 Char: "8" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 72 EndX: 82 StartY: 24 EndY: 48 Char: "9" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 96 EndX: 106 StartY: 24 EndY: 48 Char: ":" InitialDist: 5 Width: 3 Whitespace: 5 StartX: 120 EndX: 123 StartY: 24 EndY: 48 Char: ";" InitialDist: 4 Width: 4 Whitespace: 5 StartX: 144 EndX: 148 StartY: 24 EndY: 48 Char: "<" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 168 EndX: 179 StartY: 24 EndY: 48 Char: "=" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 192 EndX: 203 StartY: 24 EndY: 48 Char: ">" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 216 EndX: 227 StartY: 24 EndY: 48 Char: "?" InitialDist: 3 Width: 9 Whitespace: 1 StartX: 240 EndX: 249 StartY: 24 EndY: 48 Char: "@" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 264 EndX: 276 StartY: 24 EndY: 48 Char: "A" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 288 EndX: 300 StartY: 24 EndY: 48 Char: "B" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 312 EndX: 323 StartY: 24 EndY: 48 Char: "C" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 336 EndX: 346 StartY: 24 EndY: 48 Char: "D" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 360 EndX: 371 StartY: 24 EndY: 48 Char: "E" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 384 EndX: 394 StartY: 24 EndY: 48 Char: "F" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 408 EndX: 418 StartY: 24 EndY: 48 Char: "G" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 432 EndX: 443 StartY: 24 EndY: 48 Char: "H" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 456 EndX: 466 StartY: 24 EndY: 48 Char: "I" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 480 EndX: 489 StartY: 24 EndY: 48 Char: "J" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 0 EndX: 10 StartY: 48 EndY: 72 Char: "K" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 24 EndX: 36 StartY: 48 EndY: 72 Char: "L" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 48 EndX: 57 StartY: 48 EndY: 72 Char: "M" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 72 EndX: 83 StartY: 48 EndY: 72 Char: "N" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 96 EndX: 106 StartY: 48 EndY: 72 Char: "O" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 120 EndX: 131 StartY: 48 EndY: 72 Char: "P" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 144 EndX: 154 StartY: 48 EndY: 72 Char: "Q" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 168 EndX: 179 StartY: 48 EndY: 72 Char: "R" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 192 EndX: 203 StartY: 48 EndY: 72 Char: "S" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 216 EndX: 226 StartY: 48 EndY: 72 Char: "T" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 240 EndX: 251 StartY: 48 EndY: 72 Char: "U" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 264 EndX: 274 StartY: 48 EndY: 72 Char: "V" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 288 EndX: 299 StartY: 48 EndY: 72 Char: "W" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 312 EndX: 325 StartY: 48 EndY: 72 Char: "X" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 336 EndX: 348 StartY: 48 EndY: 72 Char: "Y" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 360 EndX: 373 StartY: 48 EndY: 72 Char: "Z" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 384 EndX: 395 StartY: 48 EndY: 72 Char: "[" InitialDist: 4 Width: 6 Whitespace: 3 StartX: 408 EndX: 414 StartY: 48 EndY: 72 Char: "\" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 432 EndX: 442 StartY: 48 EndY: 72 Char: "]" InitialDist: 3 Width: 6 Whitespace: 4 StartX: 456 EndX: 462 StartY: 48 EndY: 72 Char: "^" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 480 EndX: 491 StartY: 48 EndY: 72 Char: "_" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 0 EndX: 13 StartY: 72 EndY: 96 Char: "`" InitialDist: 2 Width: 6 Whitespace: 5 StartX: 24 EndX: 30 StartY: 72 EndY: 96 Char: "a" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 48 EndX: 59 StartY: 72 EndY: 96 Char: "b" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 72 EndX: 83 StartY: 72 EndY: 96 Char: "c" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 96 EndX: 106 StartY: 72 EndY: 96 Char: "d" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 120 EndX: 131 StartY: 72 EndY: 96 Char: "e" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 144 EndX: 155 StartY: 72 EndY: 96 Char: "f" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 168 EndX: 178 StartY: 72 EndY: 96 Char: "g" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 192 EndX: 203 StartY: 72 EndY: 96 Char: "h" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 216 EndX: 226 StartY: 72 EndY: 96 Char: "i" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 240 EndX: 251 StartY: 72 EndY: 96 Char: "j" InitialDist: 2 Width: 7 Whitespace: 4 StartX: 264 EndX: 271 StartY: 72 EndY: 96 Char: "k" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 288 EndX: 299 StartY: 72 EndY: 96 Char: "l" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 312 EndX: 322 StartY: 72 EndY: 96 Char: "m" InitialDist: 0 Width: 12 Whitespace: 1 StartX: 336 EndX: 348 StartY: 72 EndY: 96 Char: "n" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 360 EndX: 370 StartY: 72 EndY: 96 Char: "o" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 384 EndX: 395 StartY: 72 EndY: 96 Char: "p" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 408 EndX: 419 StartY: 72 EndY: 96 Char: "q" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 432 EndX: 443 StartY: 72 EndY: 96 Char: "r" InitialDist: 3 Width: 9 Whitespace: 1 StartX: 456 EndX: 465 StartY: 72 EndY: 96 Char: "s" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 480 EndX: 490 StartY: 72 EndY: 96 Char: "t" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 0 EndX: 10 StartY: 96 EndY: 120 Char: "u" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 24 EndX: 34 StartY: 96 EndY: 120 Char: "v" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 48 EndX: 59 StartY: 96 EndY: 120 Char: "w" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 72 EndX: 85 StartY: 96 EndY: 120 Char: "x" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 96 EndX: 107 StartY: 96 EndY: 120 Char: "y" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 120 EndX: 131 StartY: 96 EndY: 120 Char: "z" InitialDist: 1 Width: 10 Whitespace: 2 StartX: 144 EndX: 154 StartY: 96 EndY: 120 Char: "{" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 168 EndX: 177 StartY: 96 EndY: 120 Char: "|" InitialDist: 5 Width: 2 Whitespace: 6 StartX: 192 EndX: 194 StartY: 96 EndY: 120 Char: "}" InitialDist: 2 Width: 9 Whitespace: 2 StartX: 216 EndX: 225 StartY: 96 EndY: 120 Char: "~" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 240 EndX: 251 StartY: 96 EndY: 120 bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_16.png000066400000000000000000000174211200563112200221570ustar00rootroot00000000000000PNG  IHDR}W IDATx^;Ÿ{o+;t;̙\g\4x PQO$C/!B!B!B\_d׈3 o_d׮-hB;V!>Ȯa2^/fo_60; ~W:yUe#y%^~{ᰢv]__vgmo>c>wۋ|z3?U:`7 nB?_.F׀͠Y؈.ӝ)b;vkBfV3L@hd׿<3?hotPgvwlc$tvpdy1;h8cMv0p?y$yc8g^|V1;k7@i\|v-=pTNJ3}!T1rIJ0/OG܁gaGF(hV#*θJa|]KW1)SVikb:DieG|ˁUfeueMTwÃNݧr:13xLFpZ0/Q4Uvun::걑.N FpK _-tzF:O>1zCE.8 ›ءa︚O|Ϯr"7vkBU<ߕ_z3 ꘞ^圻x]<ь1@ku*ͱ-<|aG+][厸E2gnfU| G3_^btֱU2\БF3P]2炧}v7!OMKpkWH,ވ?_Îw9;jBGzE2q0]50b#ۍ>Zef'OY#sG|wp7{-Qv#t;?]#="8U>4m[47oYUҐ]\Fk_lF`3p8OOÝ[Qm̭Y~ =x- W>8C/;;w KCv#\DvqVgxf q ݮ8Oo?v9HƉ|zhr &{Wq: `v.'g`iȮ{.#ٵ܉zNoFiΌLad׾<?NqU#0PplFIGSثȮAG\ d̘(UhFMMNt`l}ps9B<p>\;.}9GB<Y^}ZSmupB!B!B!B!B!B!B\ Y<4ިįDDv3Nl88'x|M\ vԭgYo3P׺/5j#qt#ΌLtV8;AdcFNw4=ΌG?ʍF8]C}y8@=,HTEΌLt2Gέr-i9l%(.]do8ff'kA|({ /t(s+u/&UxWv/l#C~'?K1i[dQetT#sF?8Tm?J#xU)tM uH#2ՙ? CG|r#ۍ#"NѬ N[2'#fO:U ;OǟQEUf".Ãga>[Y\yfV5f?ߕ0ٹJ弮t43"/>JigwںርߎƃG>yqTG%<:[|"f* Tqtk.SFI:`?Qft-MֹsDt8OGZܙ]i/͕4fiu"NsOi[ 蜂\db3-H#C#tcI2ՎkFdZ3q!Z wG`Fdz3v;f+1a2|Ƶ@iL#KgfOB2W(ō7 ᎢK#Ѩ* ;[Ë4":42NhwȴVݰ,lDt҅W.\J1p>XU+cbdkL#"FL+ΈLgnܠTf8Qn3<%*#C"a2FTFpTZ^^^c.CYg[b6#]|6mX7x:CϘM]]\UȮ8u~ :LkqU.K/Q w/g=1j{@dhB0qǷ[W&=j|͆>ؙٝ3."v;=T>X9YM<#;3%|A{uxׁ-Eۧ7/ _t-q%T;7J5x*azPMz8WEuEˮ8"p; `WC:=(kymGVz6Za3"M4bdF3CceLcD 2(X\Q!IuVM\YXKӃgsBXȮ݁jc$9uZ'ɣgqwǹzڎF[ggF3Xeȫ=H۵@!Zј6B!> [B#`{raSj?lUNB~~-!B!B!B!B!B|EN'_po(GG:lV͂Umnq=V_zM}hjulo43GdZ#Um @`:wGf֟u&G 1t,:N_%Fo:lMI%~>;7 VJHtW;d'jc?n[uyIiKNGֈj k*}*❍Gb; i' l>H2Q5kp#X6ث'LcF4Jm0ϰ;ʗ܉~QGBȐ8+#61ʨu#ߌȮnL !Rnt$kx2z6F\юi\ڀXw43yRW߭3yd=BQuJn6X;vH+.GlopV/Yur2ut҆wV;:Rˮ3ٵ;ܙ#GV56Fx}~X߇e64WBuckϸ:'{ߨp=]Bַ62D>[mi#L+.ڜ]Slkvmy1LKБ`ְBZ;l>c~4MiD>G;Z1bi|vA4][);B>TxSyVg8#;n^e_ߕs%6vv3bRoG<#-AbP*ci1W*LL?;1 ?9idXㄿ6_>i1"gw5GlOξgvNvЃp[l`A6gfppVܝ֋3.!;l5;3K|zN{'[wN̟;B܄}q:X Zkݼy2O._d:~sb/sM­rROumpǢsp3l|v_>~j2;>44j;k\ uFAuc}2"ӈӓ推THt"f3~V~*F Int 쀝O&dgdn %N|#P- 9 8|eYAd?ȴF=U[GpQ~fחh?OoDہ8l#&~ ܽQ|ؽQQ~VƉtGcdxr7tFdfٗ^vDѩed(|U{ M[m#c+D6GV4Y|F>;OtΣ u|ˋȴFd~v>zL+S4QL0nHo ѹU2|F>;gTï0r=0 1 33sg @5#+gD#Nh2gtw#m#c+D6GV4Y|F>;Q i6.\vo ?I{N{U[GΟ(|U{ M[wNtFzVlέ=1t<#ޡݻ@ObN;?߰c4Wu7'' _qB֟qW7ZY`]c+\#V{6h?Oo+O!?h@w8k#ӈ8,Xd:Zl o_㯹~RԦ<{tz׵;Eyw_d:+tn !6"ΌHC:^ׅy5gطI[7IUv>vԯE2@^  T hf v;x7=޵sQӼ ~n;v/q;;x܎Y|˝:5%1N3U;fv]]|@kP&wf?Ȯ]%슏;80Cݝܹ[δ2ϹwusZFyAw9БUgDͮv׊ȴ?E/XQðrی2A;YGpw9/qá>@9/ !>F4;uڕmtj6r:_qaw]m{f0NBpٵ47u)m2o<qv2~w6l?w wullwv*z'BxWxGOF+21]̣g`znԿ9vu=*=vn !D ~ZG;>sj ;g1rxkϺt.\d:+tn !DFSY8T3xttpZGߑE{x7uXkLgn=Эq~!"g:7ʼn%:3:B!<۰g2[EthD=WB!?|Ե7KTYBwB/ywN;B!xA!B!B!B!B!B!B!B!B!vrGtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_24.fmt000066400000000000000000000212211200563112200221510ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 512 TextZStep: 38 Char: " " InitialDist: 0 Width: 1 Whitespace: 18 StartX: 0 EndX: 1 StartY: 0 EndY: 38 Char: "!" InitialDist: 8 Width: 4 Whitespace: 7 StartX: 38 EndX: 42 StartY: 0 EndY: 38 Char: """ InitialDist: 4 Width: 12 Whitespace: 3 StartX: 76 EndX: 88 StartY: 0 EndY: 38 Char: "#" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 114 EndX: 133 StartY: 0 EndY: 38 Char: "$" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 152 EndX: 166 StartY: 0 EndY: 38 Char: "%" InitialDist: 1 Width: 19 Whitespace: -1 StartX: 190 EndX: 209 StartY: 0 EndY: 38 Char: "&" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 228 EndX: 246 StartY: 0 EndY: 38 Char: "'" InitialDist: 8 Width: 4 Whitespace: 7 StartX: 266 EndX: 270 StartY: 0 EndY: 38 Char: "(" InitialDist: 6 Width: 8 Whitespace: 5 StartX: 304 EndX: 312 StartY: 0 EndY: 38 Char: ")" InitialDist: 5 Width: 8 Whitespace: 6 StartX: 342 EndX: 350 StartY: 0 EndY: 38 Char: "*" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 380 EndX: 395 StartY: 0 EndY: 38 Char: "+" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 418 EndX: 436 StartY: 0 EndY: 38 Char: "," InitialDist: 5 Width: 7 Whitespace: 7 StartX: 456 EndX: 463 StartY: 0 EndY: 38 Char: "-" InitialDist: 5 Width: 10 Whitespace: 4 StartX: 0 EndX: 10 StartY: 38 EndY: 76 Char: "." InitialDist: 7 Width: 5 Whitespace: 7 StartX: 38 EndX: 43 StartY: 38 EndY: 76 Char: "/" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 76 EndX: 91 StartY: 38 EndY: 76 Char: "0" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 114 EndX: 129 StartY: 38 EndY: 76 Char: "1" InitialDist: 3 Width: 15 Whitespace: 1 StartX: 152 EndX: 167 StartY: 38 EndY: 76 Char: "2" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 190 EndX: 205 StartY: 38 EndY: 76 Char: "3" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 228 EndX: 243 StartY: 38 EndY: 76 Char: "4" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 266 EndX: 282 StartY: 38 EndY: 76 Char: "5" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 304 EndX: 319 StartY: 38 EndY: 76 Char: "6" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 342 EndX: 357 StartY: 38 EndY: 76 Char: "7" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 380 EndX: 395 StartY: 38 EndY: 76 Char: "8" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 418 EndX: 433 StartY: 38 EndY: 76 Char: "9" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 456 EndX: 471 StartY: 38 EndY: 76 Char: ":" InitialDist: 7 Width: 5 Whitespace: 7 StartX: 0 EndX: 5 StartY: 76 EndY: 114 Char: ";" InitialDist: 6 Width: 6 Whitespace: 7 StartX: 38 EndX: 44 StartY: 76 EndY: 114 Char: "<" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 76 EndX: 92 StartY: 76 EndY: 114 Char: "=" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 114 EndX: 130 StartY: 76 EndY: 114 Char: ">" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 152 EndX: 168 StartY: 76 EndY: 114 Char: "?" InitialDist: 4 Width: 13 Whitespace: 2 StartX: 190 EndX: 203 StartY: 76 EndY: 114 Char: "@" InitialDist: 0 Width: 18 Whitespace: 1 StartX: 228 EndX: 246 StartY: 76 EndY: 114 Char: "A" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 266 EndX: 284 StartY: 76 EndY: 114 Char: "B" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 304 EndX: 320 StartY: 76 EndY: 114 Char: "C" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 342 EndX: 357 StartY: 76 EndY: 114 Char: "D" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 380 EndX: 396 StartY: 76 EndY: 114 Char: "E" InitialDist: 3 Width: 15 Whitespace: 1 StartX: 418 EndX: 433 StartY: 76 EndY: 114 Char: "F" InitialDist: 3 Width: 15 Whitespace: 1 StartX: 456 EndX: 471 StartY: 76 EndY: 114 Char: "G" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 0 EndX: 16 StartY: 114 EndY: 152 Char: "H" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 38 EndX: 53 StartY: 114 EndY: 152 Char: "I" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 76 EndX: 91 StartY: 114 EndY: 152 Char: "J" InitialDist: 2 Width: 14 Whitespace: 3 StartX: 114 EndX: 128 StartY: 114 EndY: 152 Char: "K" InitialDist: 2 Width: 18 Whitespace: -1 StartX: 152 EndX: 170 StartY: 114 EndY: 152 Char: "L" InitialDist: 4 Width: 14 Whitespace: 1 StartX: 190 EndX: 204 StartY: 114 EndY: 152 Char: "M" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 228 EndX: 244 StartY: 114 EndY: 152 Char: "N" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 266 EndX: 282 StartY: 114 EndY: 152 Char: "O" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 304 EndX: 320 StartY: 114 EndY: 152 Char: "P" InitialDist: 3 Width: 15 Whitespace: 1 StartX: 342 EndX: 357 StartY: 114 EndY: 152 Char: "Q" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 380 EndX: 396 StartY: 114 EndY: 152 Char: "R" InitialDist: 2 Width: 17 Whitespace: 0 StartX: 418 EndX: 435 StartY: 114 EndY: 152 Char: "S" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 456 EndX: 472 StartY: 114 EndY: 152 Char: "T" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 0 EndX: 17 StartY: 152 EndY: 190 Char: "U" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 38 EndX: 54 StartY: 152 EndY: 190 Char: "V" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 76 EndX: 93 StartY: 152 EndY: 190 Char: "W" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 114 EndX: 133 StartY: 152 EndY: 190 Char: "X" InitialDist: 0 Width: 18 Whitespace: 1 StartX: 152 EndX: 170 StartY: 152 EndY: 190 Char: "Y" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 190 EndX: 209 StartY: 152 EndY: 190 Char: "Z" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 228 EndX: 244 StartY: 152 EndY: 190 Char: "[" InitialDist: 7 Width: 8 Whitespace: 4 StartX: 266 EndX: 274 StartY: 152 EndY: 190 Char: "\" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 304 EndX: 320 StartY: 152 EndY: 190 Char: "]" InitialDist: 5 Width: 8 Whitespace: 6 StartX: 342 EndX: 350 StartY: 152 EndY: 190 Char: "^" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 380 EndX: 397 StartY: 152 EndY: 190 Char: "_" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 418 EndX: 437 StartY: 152 EndY: 190 Char: "`" InitialDist: 3 Width: 9 Whitespace: 7 StartX: 456 EndX: 465 StartY: 152 EndY: 190 Char: "a" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 0 EndX: 16 StartY: 190 EndY: 228 Char: "b" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 38 EndX: 54 StartY: 190 EndY: 228 Char: "c" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 76 EndX: 90 StartY: 190 EndY: 228 Char: "d" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 114 EndX: 130 StartY: 190 EndY: 228 Char: "e" InitialDist: 2 Width: 17 Whitespace: 0 StartX: 152 EndX: 169 StartY: 190 EndY: 228 Char: "f" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 190 EndX: 204 StartY: 190 EndY: 228 Char: "g" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 228 EndX: 244 StartY: 190 EndY: 228 Char: "h" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 266 EndX: 280 StartY: 190 EndY: 228 Char: "i" InitialDist: 2 Width: 17 Whitespace: 0 StartX: 304 EndX: 321 StartY: 190 EndY: 228 Char: "j" InitialDist: 3 Width: 11 Whitespace: 5 StartX: 342 EndX: 353 StartY: 190 EndY: 228 Char: "k" InitialDist: 3 Width: 16 Whitespace: 0 StartX: 380 EndX: 396 StartY: 190 EndY: 228 Char: "l" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 418 EndX: 434 StartY: 190 EndY: 228 Char: "m" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 456 EndX: 472 StartY: 190 EndY: 228 Char: "n" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 0 EndX: 14 StartY: 228 EndY: 266 Char: "o" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 38 EndX: 54 StartY: 228 EndY: 266 Char: "p" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 76 EndX: 92 StartY: 228 EndY: 266 Char: "q" InitialDist: 2 Width: 16 Whitespace: 1 StartX: 114 EndX: 130 StartY: 228 EndY: 266 Char: "r" InitialDist: 5 Width: 13 Whitespace: 1 StartX: 152 EndX: 165 StartY: 228 EndY: 266 Char: "s" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 190 EndX: 204 StartY: 228 EndY: 266 Char: "t" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 228 EndX: 243 StartY: 228 EndY: 266 Char: "u" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 266 EndX: 280 StartY: 228 EndY: 266 Char: "v" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 304 EndX: 321 StartY: 228 EndY: 266 Char: "w" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 342 EndX: 361 StartY: 228 EndY: 266 Char: "x" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 380 EndX: 398 StartY: 228 EndY: 266 Char: "y" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 418 EndX: 435 StartY: 228 EndY: 266 Char: "z" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 456 EndX: 470 StartY: 228 EndY: 266 Char: "{" InitialDist: 3 Width: 14 Whitespace: 2 StartX: 0 EndX: 14 StartY: 266 EndY: 304 Char: "|" InitialDist: 8 Width: 4 Whitespace: 7 StartX: 38 EndX: 42 StartY: 266 EndY: 304 Char: "}" InitialDist: 2 Width: 14 Whitespace: 3 StartX: 76 EndX: 90 StartY: 266 EndY: 304 Char: "~" InitialDist: 1 Width: 16 Whitespace: 2 StartX: 114 EndX: 130 StartY: 266 EndY: 304 bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_24.png000066400000000000000000000353021200563112200221540ustar00rootroot00000000000000PNG  IHDRx:aIDATx^;+7Yn/[ /cNvaMfYE,{gB/뇨 ¿ʶϷ*!9E(/#*%+|H[Nit!/Ee~+yMo3N:ǬHlKu_eDDyEA:ϟost{k3 F-Z>C+"c1G|g$N[|=t:}v+yoXY߳!v=[aG3sK_u+|~ ==grggj߽u$α%g1GK.D6QguOV|(N=fhΥe I:˚궹D3ݱ;Qqڬ웲]v墺WyQy|SWzWlNckQ3eR2+e;I.:Τe_ﹷDȥUdž^6<>+=+J㫢8#4x} RF-`!kVD^FT>>[=i85?{r|) 8uGyE_@Fܹ A~S;!۶gۼFdtt pSWzW} 03f]Sȶ}Y%תkNq@\`ߧ;}i=0[ˈݣE@^^ 98;gNrٵv,% qE[feDX؛Qߙ,;S;39KoP#f0X}EOy eDNq)Nx_؁H w W$_?~z3,Vy>%S_d(Bwu7a2,2շDmnG.ly={bVYOswn}!S{v0YL8dlC{V2p= b/趰S1Χ.;7>WEq\zN+ 8eo}}_rWi_=(37e)yb(Bw;@}N+cP2 7e 5]W߽K'0(m.OD;;v-жיKڷ0SeD偯;={vg~eY͆f&fHΈ /#*aW@SYGΘLVRJ6*97{ر=r<ˈʯ`sؕנ9® w\?tYNz^Vx_+Ac_;'{Qg֍bv=FNSGFd NrKNtvʯ`sؕנ=]-{{ ze?X >3 8 W3l;CrT/#*?7+Ǎ^Od7T}v34޵kuKgYw}rdxV'>ԮQk 9DkJtٳMmHy9ɋݒ1rSvܴ{Z(juKtk8oΞB.uSv6˭Vl^얌iZM:d?ޚ(햵?֣>'k~)\ѮU 0҄žڜD٤ww-^@=g;:]ubȊһWT/QD|3}Wx묷J'9׼AY|W^{O8 '^Gki&ʌK&Ad$ї(zٮx t8VGoTTJ;:Zo+ eo6}BV~Z%'x_%c*>O6⍈_-;'oeeG'2#m0Rv&tK;ɥ9L[eߕ&k6⍈_i wVs E;n89*؋AAOX)g»f쑾9h8hxWn.[=m[=7O8) rY߻21ct6r6gCDvj/ӊr(3{ G*^B^N23H{IxO| @ؘ=eUxŎ[OZ3L)#ǐ(QELwuVsD9Dun#]S)Zf/ndlI1X[qdHMIHe(M7Z&ig^+(vKTQl <-3EY/NbMFg6]`%C~khL;_Yh#}G:e-3F:_HhI5DOE`,G9Z&yN#9;@Z}G%LFٮd}3H|.eNxfSa mz}J!Xޠc+k] Nf%O"Tlv?X` 4PTq}ߙv ,ZnsO{+/3|T^NoZyEbDuD:~9E;tfR6oZ!\1tv@jkdg 3ʭ#ɶVQ.-QwD[lVցy@% WfHjd͞H[e $]DudlWQ-QwD[lL!Gu&#s›.o3GdP=QwD=2`Z=rh# `A&os9cθ3k} 3})#3O>/#Z~ƕ Tju"ҽzeƤVwyI.WZytj^x9P=*i;gL!34_ӱ6 2hXr2{uCzbe/^LS/xrn=ʍ[@-i6uv8c,C2| Y:?~ПI^;f3|/svT7l5_Zd]4^xS'.H-7vz;s}2h^ƌax3s󶡌Q$rz@YnWԼ9 G:ѲZ1{D_Պ)mٱܫj3&rgyx6f힎Y;K"yVye;5iN'VȎ=UWIۊ#*2ތ_GlliZ;ځg١>3; o=pkeb+_{?97{G̲[yA»I4<(,>k4j`JZ[)m^2F){GT]Qcu 37?Q237ݙQXzXψi&_'_2ߚŏ0HٻX=zD⡼1K3Y7kվxLV>Y>l6V;Z-a$wyzDůCo]>2kj߽Mzzo1/-#ʁ Ɍ5ԼA4g)JO-?Î5WxY/;؞{rZȎ/hZ=eR=*iv=1_SN}.26F&W'Eud.\ZȎ/ApV8mF= ^ޖk2؊̫Tz峌zS< タf =M?XXu'4Md/1@&? !_כ~hyh /ǝrxzEuEu5S~ܖܮxH^\G:gbʭP]@+om)%$/˨jbYG[-/rxzEuEu51W&//9r Txuyuf>#ezfAjOn/W<3QNZTq1/꼣7^oYxgТ F- 9ؑg+wih嵓ͩ߶eL޻Gm(ac [;_=}r{ISn&/^kFr\q3k;V:!;lŴVdV^;ٜGwcR;l/2zf/峫fĝrCoYl,q,^}_*ogwʭtB=vY}ӟUk7>"*GQ=pʶygh35K)7 5ƛ 7DlNNNȡǎ<5AWL>"*GAPl;ks-rwYKd^G5xNȡǎ 5@OZYZ1#QݳCyz1kV?Zye2x9yOW~.ʮ0k]^HFŝQ./Gew`z 7M=7VoNȡǎwZyǽ%߼;3fKzy|qزrw8XV:!;bz;w.9ѱFϵg=;z.DkMY_Ʃ- 9D7eO=1kiwviU6պj{,6^/7 8QQS[nSrhx;)mAFѓ9ƱZ?Pdwf/2N9<:a zSnrW:TcnTac wYy'mo^Fs-ccyKl޶m2Nx"Z&˕:a@c@ǒоL ]D^,^^QwD=+;‹+:^^=z7Z*Njպ 9S~>Z&˕߸_}bzza˫GtI82y塶rËw,^^QwDŮ /Qw-j];kY}(2F+E/W."+Yj䕇Rn5rxzEu!;Ⱥŋ_+ܫjzD5oU6usN-^hl=FI͋]+9 ̎?n#_Z6ּƽSn/^ ,#ں[=iX׊zD5oU6N-V2Wvrygm0BDzмصٳWࣼ n2 l/g<-6q _oK&Vb"#xWZ%q;-Zj(#qFe7;:ߏ[zQyβ'G[؟# ~/>WljŜ#zܙj/-') @QEMs\㊑8#e#AZmgjQgVNm/hm_ :hxs/[Z1go3#z>U-IL>~oŏb\1g]R 쪝exy,97 Plxmec*+hw>,w2=NZW){Ԯvרl[v&=gL4r,@ٿ1FE_ X/w~%m 23);j|˭rD_g Ūu'l|6ݑ-*v96%ݶNlO,rD4 vǩusY#ٳ=(?O,@/eEF8L}S.]P/GL#G]2#ӃYʎͻ|"LvhG⏔ƳavYt,z7_\^'VOśdץ 7fFw9uV_AImю);0썀vZ;wї_֞;+/xiٿfYKQ]l;2 `7ڑ#eg4lDН\ :ݏ2Gf"D`Ǝtҩj#G݌n&kub%q3".y7e Zj"ռIv[Q}$-Oj?`K);Y:#__% ]>s;-ݣeWd4oX6nzܮk~rvhG⏔NgeA;mg%d;4)o]>@z`mm`m?qkCT~f~rvhG⏔vd}AA; HkGy9EˬFz! 1Y'`7ڑ#eg3};3v5c2Sgۋ#Zf6;ew{\ayʯlF%]Ӟu7[>e^q@ BeFuMK^u&kl."Zf&od;*=Ol?|1foKOiY>zZh;m+6e{9efwY<`7ڋO(^߻I*so*#]̎g/9xUnk2j,@8/e7׹Gj'2#{^;_}}:wWj/G,^QWeYY'`wlQpڳh Kcv]7(kŋ="8+0 쮍vdkʸ6S ֛J+7mhm3;kII>xC3oQ]3Vo~nm׷V}M˝:WK>\$-MʝVG{mW+e1_oYkQ3vףWHP_-"9춖ϊ-ʧꙩ'lw)wq'llٶKv_X[y]#;+1wDT,zKNQ]wE9D"Z`-*/Q1[O3SO:ѓj:w*\ڬ ~ :b3ňꞡ"oQ6ΐD`e(~MT 2 QfX:͚<٢|qmlk/^;f.+I]V0Vv6V/yEu{&EuP;}Q|b-];Cs}Uד9 ":f)zfjN.zZfr19֔- z *Aֱhvrжq}+۩MQh@;j%yM0YS^2+xӉBo;֣Kc,NoLy{hZl~<㸟~g6VAiȕgޠce;%:g.KԦƼA̶xegqE ы;{"'ˋ;-3[- +]F#׷:byע3RHkw3LjeF6n*^{Xv+SorvŷN8 /hjG??ޯ^wj$Hٻiiwݹ/b̰+՛GҊWvX=e;//5xEV?@r Hwe1HٻX3k1RX=e;//gםWl˻Cr9`Hwe1HٻX3k1RX=e;//3-3[-k7r+HwyPŘaW\7.;//~y~5ZfZϏe%}fOcSn%MZN]=zd9)mw^N;OnZfX6Zҵyegb>1@1-딻6i.ɝ{brR.v` ޽i&W??w { O{|=E@g]dy1Zfz*Y.؎Ddt2ծe|g >yڢuU|g ,ܳIyhtYy3esG!qS?S/GL&Z<0kdKd_$C$ߢgIn[Ab];֊W,WWWt+|=[n~Qw)3~Vyˊ|Uz[ _o|fɲ^wyx*W.=lކ\4)3[>fN[[TUXv!ʡ%x=efDiWcVT^˭:y۽iiSC6^I>eey]6NcxGnYZV5/n-VmY\bE9líz6/38z}OmQxVůY9z.FfiHT Q-Qw) P4dtj~.X혥h}o?WMk61ӮU$uAƱ~ Hdi{ײ2F‹'ʝp ^U;jdrBێIfl/hz)Bon;' L){X=jOAաy0Ֆڥl*mPEk{Hϻ\jLX#yܼZo^«s/3^^^2;gO=eV@;=+J҃ {5Hkk;ku;iC{>V.Og\~awLY 8{J7g؛kĮٳA!ekhz)86f.3j6IvO q/kܺd>Iq<%ĕ2){Hw){Wf4txEˬГGOUla;.{8X\8l';9=Yy"cyS$˛q.8رn)Eĕ2){Hw){WfQ.w xDˬГGOU3h`Q_o =Ak:vSq{zHXyRˈ+ef9RX#e5RXWHG]v^.2+Sf% ڼʨ_(P7yv]B̺aفS1,eĕ2){Hw){Wf;L{;>/hz)/gCɺmҡ\t/YY'ƺ"T,}ϲ_H\)37yM2'r<ټnݙ6*SǺs@&^ +gy{ f1_1}\v#X#"e˛٩ʾ(zg~#mduX}Ꜭ69zL=FO=eV=N휉>ٙOw\vO?ކ-sO>w\*o\-sO>w\;\-sO>=&=\;3ώU~6V*Zy-Wv^^[Z|kut"xФ:8{Ywj2hl7i'<|E)tBvB+U'th'IPuBvB+U'th'IPuBvB+.yz\?tghlIH*m-Ugo_[ /#*W3NEZn:ld;.m[l.Q37RHR'ًVT0v|'f0N~g$` ,~\wu6N^er@߿| ۙjT~'{S=lgLsB{B+U'th'IPuBvB+U'th'IPuBvB+U'th'IPe;/yJ*m\hNUľH.Z#E,':ʎk Ɍkbko2-?c;hٻyIHI[EkP4EtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_6.fmt000066400000000000000000000204741200563112200221020ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 32 TextZStep: 9 Char: " " InitialDist: 0 Width: 1 Whitespace: 4 StartX: 0 EndX: 1 StartY: 0 EndY: 9 Char: "!" InitialDist: 2 Width: 1 Whitespace: 2 StartX: 9 EndX: 10 StartY: 0 EndY: 9 Char: """ InitialDist: 1 Width: 3 Whitespace: 1 StartX: 18 EndX: 21 StartY: 0 EndY: 9 Char: "#" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 27 EndX: 32 StartY: 0 EndY: 9 Char: "$" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 36 EndX: 41 StartY: 0 EndY: 9 Char: "%" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 45 EndX: 50 StartY: 0 EndY: 9 Char: "&" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 54 EndX: 58 StartY: 0 EndY: 9 Char: "'" InitialDist: 2 Width: 1 Whitespace: 2 StartX: 63 EndX: 64 StartY: 0 EndY: 9 Char: "(" InitialDist: 2 Width: 2 Whitespace: 1 StartX: 72 EndX: 74 StartY: 0 EndY: 9 Char: ")" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 81 EndX: 83 StartY: 0 EndY: 9 Char: "*" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 90 EndX: 95 StartY: 0 EndY: 9 Char: "+" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 99 EndX: 104 StartY: 0 EndY: 9 Char: "," InitialDist: 1 Width: 2 Whitespace: 2 StartX: 108 EndX: 110 StartY: 0 EndY: 9 Char: "-" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 117 EndX: 119 StartY: 0 EndY: 9 Char: "." InitialDist: 2 Width: 1 Whitespace: 2 StartX: 126 EndX: 127 StartY: 0 EndY: 9 Char: "/" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 135 EndX: 139 StartY: 0 EndY: 9 Char: "0" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 144 EndX: 148 StartY: 0 EndY: 9 Char: "1" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 153 EndX: 156 StartY: 0 EndY: 9 Char: "2" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 162 EndX: 166 StartY: 0 EndY: 9 Char: "3" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 171 EndX: 175 StartY: 0 EndY: 9 Char: "4" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 180 EndX: 184 StartY: 0 EndY: 9 Char: "5" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 189 EndX: 193 StartY: 0 EndY: 9 Char: "6" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 198 EndX: 202 StartY: 0 EndY: 9 Char: "7" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 207 EndX: 211 StartY: 0 EndY: 9 Char: "8" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 216 EndX: 220 StartY: 0 EndY: 9 Char: "9" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 225 EndX: 229 StartY: 0 EndY: 9 Char: ":" InitialDist: 2 Width: 1 Whitespace: 2 StartX: 234 EndX: 235 StartY: 0 EndY: 9 Char: ";" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 243 EndX: 245 StartY: 0 EndY: 9 Char: "<" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 252 EndX: 256 StartY: 0 EndY: 9 Char: "=" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 261 EndX: 265 StartY: 0 EndY: 9 Char: ">" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 270 EndX: 274 StartY: 0 EndY: 9 Char: "?" InitialDist: -1 Width: 5 Whitespace: 1 StartX: 279 EndX: 284 StartY: 0 EndY: 9 Char: "@" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 288 EndX: 293 StartY: 0 EndY: 9 Char: "A" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 297 EndX: 301 StartY: 0 EndY: 9 Char: "B" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 306 EndX: 310 StartY: 0 EndY: 9 Char: "C" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 315 EndX: 319 StartY: 0 EndY: 9 Char: "D" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 324 EndX: 328 StartY: 0 EndY: 9 Char: "E" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 333 EndX: 337 StartY: 0 EndY: 9 Char: "F" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 342 EndX: 346 StartY: 0 EndY: 9 Char: "G" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 351 EndX: 355 StartY: 0 EndY: 9 Char: "H" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 360 EndX: 364 StartY: 0 EndY: 9 Char: "I" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 369 EndX: 372 StartY: 0 EndY: 9 Char: "J" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 378 EndX: 382 StartY: 0 EndY: 9 Char: "K" InitialDist: 1 Width: 5 Whitespace: -1 StartX: 387 EndX: 392 StartY: 0 EndY: 9 Char: "L" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 396 EndX: 400 StartY: 0 EndY: 9 Char: "M" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 405 EndX: 409 StartY: 0 EndY: 9 Char: "N" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 414 EndX: 418 StartY: 0 EndY: 9 Char: "O" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 423 EndX: 427 StartY: 0 EndY: 9 Char: "P" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 432 EndX: 436 StartY: 0 EndY: 9 Char: "Q" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 441 EndX: 445 StartY: 0 EndY: 9 Char: "R" InitialDist: 1 Width: 5 Whitespace: -1 StartX: 450 EndX: 455 StartY: 0 EndY: 9 Char: "S" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 459 EndX: 463 StartY: 0 EndY: 9 Char: "T" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 468 EndX: 471 StartY: 0 EndY: 9 Char: "U" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 477 EndX: 481 StartY: 0 EndY: 9 Char: "V" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 486 EndX: 490 StartY: 0 EndY: 9 Char: "W" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 495 EndX: 500 StartY: 0 EndY: 9 Char: "X" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 0 EndX: 4 StartY: 9 EndY: 18 Char: "Y" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 9 EndX: 14 StartY: 9 EndY: 18 Char: "Z" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 18 EndX: 22 StartY: 9 EndY: 18 Char: "[" InitialDist: 2 Width: 2 Whitespace: 1 StartX: 27 EndX: 29 StartY: 9 EndY: 18 Char: "\" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 36 EndX: 40 StartY: 9 EndY: 18 Char: "]" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 45 EndX: 47 StartY: 9 EndY: 18 Char: "^" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 54 EndX: 58 StartY: 9 EndY: 18 Char: "_" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 63 EndX: 68 StartY: 9 EndY: 18 Char: "`" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 72 EndX: 74 StartY: 9 EndY: 18 Char: "a" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 81 EndX: 85 StartY: 9 EndY: 18 Char: "b" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 90 EndX: 94 StartY: 9 EndY: 18 Char: "c" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 99 EndX: 103 StartY: 9 EndY: 18 Char: "d" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 108 EndX: 112 StartY: 9 EndY: 18 Char: "e" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 117 EndX: 121 StartY: 9 EndY: 18 Char: "f" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 126 EndX: 129 StartY: 9 EndY: 18 Char: "g" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 135 EndX: 139 StartY: 9 EndY: 18 Char: "h" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 144 EndX: 148 StartY: 9 EndY: 18 Char: "i" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 153 EndX: 156 StartY: 9 EndY: 18 Char: "j" InitialDist: 0 Width: 3 Whitespace: 2 StartX: 162 EndX: 165 StartY: 9 EndY: 18 Char: "k" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 171 EndX: 175 StartY: 9 EndY: 18 Char: "l" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 180 EndX: 184 StartY: 9 EndY: 18 Char: "m" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 189 EndX: 194 StartY: 9 EndY: 18 Char: "n" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 198 EndX: 202 StartY: 9 EndY: 18 Char: "o" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 207 EndX: 211 StartY: 9 EndY: 18 Char: "p" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 216 EndX: 220 StartY: 9 EndY: 18 Char: "q" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 225 EndX: 229 StartY: 9 EndY: 18 Char: "r" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 234 EndX: 237 StartY: 9 EndY: 18 Char: "s" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 243 EndX: 247 StartY: 9 EndY: 18 Char: "t" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 252 EndX: 256 StartY: 9 EndY: 18 Char: "u" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 261 EndX: 265 StartY: 9 EndY: 18 Char: "v" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 270 EndX: 274 StartY: 9 EndY: 18 Char: "w" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 279 EndX: 284 StartY: 9 EndY: 18 Char: "x" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 288 EndX: 292 StartY: 9 EndY: 18 Char: "y" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 297 EndX: 301 StartY: 9 EndY: 18 Char: "z" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 306 EndX: 310 StartY: 9 EndY: 18 Char: "{" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 315 EndX: 318 StartY: 9 EndY: 18 Char: "|" InitialDist: 2 Width: 1 Whitespace: 2 StartX: 324 EndX: 325 StartY: 9 EndY: 18 Char: "}" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 333 EndX: 336 StartY: 9 EndY: 18 Char: "~" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 342 EndX: 346 StartY: 9 EndY: 18 bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_6.png000066400000000000000000000041161200563112200220730ustar00rootroot00000000000000PNG  IHDR dKIDATx^1: D}\W |`?tJ]E hg<HBHQH>( )1p,+]MGAy]L]Q~:u}Ei`NiH{ bپo`?,mOQJ8# OA=iV1|d=ipMC]/pWh(6a~ź[*;-*oާU h G\U!:?Wp c#8TeԥҀJvq0VM^:5 BcG& &J XMJ0/>od}ǿl v,ۉf/TrhVFx.,>Ѡd t!8W6PF U42^G9:>S:{~AAmRaupd:*~p1ݶWG x6u& 7";$ 54pf~p, @Vn* u^[-rTOL̈u~Ė h}`S Ulf͑kq w|.LMf5,N;q4~*݌*Fv' #uFt *A?S3ۻoSuY2ȹ3},j[f#\b˒ڟ5D;-|VFdϴ|g7gI j`QCjdcLURo2ft%LЙ6u幏EeNT`@R׾3 \P@Yj9!έue.%l9W Tje,:i:eeNngMnT :us²98YS5 ܑ01\z#IO weљFL( ʪNY*эRe1dvNlևL&AU~zȞ[ӽ#&:>35 i'YyJ<i%:>B?Ъ$c=& ܢ&#Y! Y%37s_\7΂O\gN`{dc@2ͣ $e>U+NƘ,?Wr/H+{G:pFF ǹtm[&wsuߧw|UP:JWѩ^8GnY]y>QIWg]/#M׊c}stX#y|p.ݲgSΘmCi\S~mٻ7M穽*,> C~L_|H/aW_rVU˦c]TU9]lg&_يV.Yg]5eUGS*DGOmd g("|hvs2nܙ3^st&Z~нa^6 4\el맪bUHSF*O]>ogMծ1>ė~:1h"A00aBn|?$:'5f+ի:Wy,NAe'U1tQ:jU=n A'+͙jU h_-c&'A >UhWy#k\rImm{EWg]9תU l3xP˪]?Wj Z +*M ڟ5U]FmegWd";Hկ㳆h֋U}'T'hr˥>G~/zlcQMH5'ܳ$Gbo{ Wәo̓0?5D=˪^#={^3c1c1c1c1c1c1c1c1c1c1c1c1c1c1lD,F>tEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_8.fmt000066400000000000000000000206521200563112200221020ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 64 TextZStep: 13 Char: " " InitialDist: 0 Width: 1 Whitespace: 6 StartX: 0 EndX: 1 StartY: 0 EndY: 13 Char: "!" InitialDist: 3 Width: 2 Whitespace: 2 StartX: 13 EndX: 15 StartY: 0 EndY: 13 Char: """ InitialDist: 2 Width: 3 Whitespace: 2 StartX: 26 EndX: 29 StartY: 0 EndY: 13 Char: "#" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 39 EndX: 46 StartY: 0 EndY: 13 Char: "$" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 52 EndX: 57 StartY: 0 EndY: 13 Char: "%" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 65 EndX: 71 StartY: 0 EndY: 13 Char: "&" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 78 EndX: 84 StartY: 0 EndY: 13 Char: "'" InitialDist: 3 Width: 1 Whitespace: 3 StartX: 91 EndX: 92 StartY: 0 EndY: 13 Char: "(" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 104 EndX: 107 StartY: 0 EndY: 13 Char: ")" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 117 EndX: 120 StartY: 0 EndY: 13 Char: "*" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 130 EndX: 135 StartY: 0 EndY: 13 Char: "+" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 143 EndX: 148 StartY: 0 EndY: 13 Char: "," InitialDist: 1 Width: 3 Whitespace: 3 StartX: 156 EndX: 159 StartY: 0 EndY: 13 Char: "-" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 169 EndX: 172 StartY: 0 EndY: 13 Char: "." InitialDist: 2 Width: 2 Whitespace: 3 StartX: 182 EndX: 184 StartY: 0 EndY: 13 Char: "/" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 195 EndX: 200 StartY: 0 EndY: 13 Char: "0" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 208 EndX: 214 StartY: 0 EndY: 13 Char: "1" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 221 EndX: 227 StartY: 0 EndY: 13 Char: "2" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 234 EndX: 240 StartY: 0 EndY: 13 Char: "3" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 247 EndX: 253 StartY: 0 EndY: 13 Char: "4" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 260 EndX: 266 StartY: 0 EndY: 13 Char: "5" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 273 EndX: 279 StartY: 0 EndY: 13 Char: "6" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 286 EndX: 292 StartY: 0 EndY: 13 Char: "7" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 299 EndX: 305 StartY: 0 EndY: 13 Char: "8" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 312 EndX: 318 StartY: 0 EndY: 13 Char: "9" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 325 EndX: 331 StartY: 0 EndY: 13 Char: ":" InitialDist: 2 Width: 2 Whitespace: 3 StartX: 338 EndX: 340 StartY: 0 EndY: 13 Char: ";" InitialDist: 1 Width: 3 Whitespace: 3 StartX: 351 EndX: 354 StartY: 0 EndY: 13 Char: "<" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 364 EndX: 370 StartY: 0 EndY: 13 Char: "=" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 377 EndX: 383 StartY: 0 EndY: 13 Char: ">" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 390 EndX: 396 StartY: 0 EndY: 13 Char: "?" InitialDist: 1 Width: 4 Whitespace: 2 StartX: 403 EndX: 407 StartY: 0 EndY: 13 Char: "@" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 416 EndX: 422 StartY: 0 EndY: 13 Char: "A" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 429 EndX: 435 StartY: 0 EndY: 13 Char: "B" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 442 EndX: 448 StartY: 0 EndY: 13 Char: "C" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 455 EndX: 461 StartY: 0 EndY: 13 Char: "D" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 468 EndX: 474 StartY: 0 EndY: 13 Char: "E" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 481 EndX: 487 StartY: 0 EndY: 13 Char: "F" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 494 EndX: 500 StartY: 0 EndY: 13 Char: "G" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 0 EndX: 6 StartY: 13 EndY: 26 Char: "H" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 13 EndX: 19 StartY: 13 EndY: 26 Char: "I" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 26 EndX: 32 StartY: 13 EndY: 26 Char: "J" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 39 EndX: 45 StartY: 13 EndY: 26 Char: "K" InitialDist: 1 Width: 7 Whitespace: -1 StartX: 52 EndX: 59 StartY: 13 EndY: 26 Char: "L" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 65 EndX: 71 StartY: 13 EndY: 26 Char: "M" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 78 EndX: 84 StartY: 13 EndY: 26 Char: "N" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 91 EndX: 97 StartY: 13 EndY: 26 Char: "O" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 104 EndX: 110 StartY: 13 EndY: 26 Char: "P" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 117 EndX: 123 StartY: 13 EndY: 26 Char: "Q" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 130 EndX: 136 StartY: 13 EndY: 26 Char: "R" InitialDist: 1 Width: 7 Whitespace: -1 StartX: 143 EndX: 150 StartY: 13 EndY: 26 Char: "S" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 156 EndX: 162 StartY: 13 EndY: 26 Char: "T" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 169 EndX: 175 StartY: 13 EndY: 26 Char: "U" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 182 EndX: 188 StartY: 13 EndY: 26 Char: "V" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 195 EndX: 201 StartY: 13 EndY: 26 Char: "W" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 208 EndX: 215 StartY: 13 EndY: 26 Char: "X" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 221 EndX: 227 StartY: 13 EndY: 26 Char: "Y" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 234 EndX: 240 StartY: 13 EndY: 26 Char: "Z" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 247 EndX: 253 StartY: 13 EndY: 26 Char: "[" InitialDist: 2 Width: 4 Whitespace: 1 StartX: 260 EndX: 264 StartY: 13 EndY: 26 Char: "\" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 273 EndX: 278 StartY: 13 EndY: 26 Char: "]" InitialDist: 1 Width: 4 Whitespace: 2 StartX: 286 EndX: 290 StartY: 13 EndY: 26 Char: "^" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 299 EndX: 305 StartY: 13 EndY: 26 Char: "_" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 312 EndX: 319 StartY: 13 EndY: 26 Char: "`" InitialDist: 1 Width: 3 Whitespace: 3 StartX: 325 EndX: 328 StartY: 13 EndY: 26 Char: "a" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 338 EndX: 344 StartY: 13 EndY: 26 Char: "b" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 351 EndX: 357 StartY: 13 EndY: 26 Char: "c" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 364 EndX: 370 StartY: 13 EndY: 26 Char: "d" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 377 EndX: 383 StartY: 13 EndY: 26 Char: "e" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 390 EndX: 396 StartY: 13 EndY: 26 Char: "f" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 403 EndX: 408 StartY: 13 EndY: 26 Char: "g" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 416 EndX: 422 StartY: 13 EndY: 26 Char: "h" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 429 EndX: 435 StartY: 13 EndY: 26 Char: "i" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 442 EndX: 448 StartY: 13 EndY: 26 Char: "j" InitialDist: 1 Width: 4 Whitespace: 2 StartX: 455 EndX: 459 StartY: 13 EndY: 26 Char: "k" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 468 EndX: 474 StartY: 13 EndY: 26 Char: "l" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 481 EndX: 487 StartY: 13 EndY: 26 Char: "m" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 494 EndX: 500 StartY: 13 EndY: 26 Char: "n" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 0 EndX: 6 StartY: 26 EndY: 39 Char: "o" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 13 EndX: 19 StartY: 26 EndY: 39 Char: "p" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 26 EndX: 32 StartY: 26 EndY: 39 Char: "q" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 39 EndX: 45 StartY: 26 EndY: 39 Char: "r" InitialDist: 2 Width: 5 Whitespace: 0 StartX: 52 EndX: 57 StartY: 26 EndY: 39 Char: "s" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 65 EndX: 71 StartY: 26 EndY: 39 Char: "t" InitialDist: 0 Width: 6 Whitespace: 1 StartX: 78 EndX: 84 StartY: 26 EndY: 39 Char: "u" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 91 EndX: 97 StartY: 26 EndY: 39 Char: "v" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 104 EndX: 110 StartY: 26 EndY: 39 Char: "w" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 117 EndX: 124 StartY: 26 EndY: 39 Char: "x" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 130 EndX: 136 StartY: 26 EndY: 39 Char: "y" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 143 EndX: 149 StartY: 26 EndY: 39 Char: "z" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 156 EndX: 162 StartY: 26 EndY: 39 Char: "{" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 169 EndX: 175 StartY: 26 EndY: 39 Char: "|" InitialDist: 3 Width: 1 Whitespace: 3 StartX: 182 EndX: 183 StartY: 26 EndY: 39 Char: "}" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 195 EndX: 201 StartY: 26 EndY: 39 Char: "~" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 208 EndX: 214 StartY: 26 EndY: 39 bzflag-2.4.2+ds1/data/fonts/DejaVuSansMonoBold_8.png000066400000000000000000000065641200563112200221060ustar00rootroot00000000000000PNG  IHDR@lϿ IDATx^16=W |cNnϜѪTY ֗fA!JKDDDD_nQqX䨸NU7nmR7O[1 :UIj?oݨ85 [u4Q!S^?nXRbj?=sc_v^xBmsikܛ$|!ٯZ{ˬiyNYc0Tqζ;\ 'n}qN>B yUg 璊nsByzsԠ ycZϝqHr\故`5.z5BcsN\gF OŮZmi^&F ,T۹. i[*gųߩ{5$3WmsR?nvnsLFz9j8Ngc&7*g ckxƱsѣ8pbgۡ&̭Gpq=.Ĺ@^bΨ^Şsa2d=g ?9m;r:'QؾI9. ~wPy U߇:*lg W; j+S!9 ف!'dpqLzwRmսY-U- VzVOI竺VyWY;}wr[S3iSӕ<N-`8g&pB'o @<3IT3] '(NS!^ FŝrQ#-'')ƁSm7r8v'B|;kZNxױ N&Mi;eY|mV`I s8Nj eNj_zN>S$TqUxt Wxk0 L"} gzgZ!=y>O*p䙛UkߟY.UƙmNr&5*rIGTSNMrz TP )X-SߵA^YqX吓#OO.^Oz{^wNQL>cϴ<<%Sީ3~g_ŝq+Ilw&w?X;>х^I'[cONGlC|sSv>~tNri/N狿ݩ!:GyLtНLb:CM`LQlWyf6Ugv&w՝[+:$srÎYt1;g pxپw*1J8tjD<~ pL28DŁ GN\Q~dR^_k^a+W6Di?~־r`= GP2<ư~8u:kOՍVa_6T7lM mʃIlv'!7gwޙ_U813A#N?UΘhb@ʼn'NPՀN;=]W{w'盺~x,'ḿڜW]qRζ+NH&uc ͽw-awrHn#e Oz#v1K6I9\Qu_5fNǺN:&g꼫N-JvJޙ 8cVrgrj$&9[1}j?GxҲCq*cvNnQ|qg5f+rXw-goM™X7KaulnWQrxyt܏M ۜ;cfţm@N{ä NQdzzz0>9nպq2{$;ʡ3?pz[cψS8H;Q|.[1y;Љ9w">8"=4CC=?*&$Ux!͒_DDH``[;')? 3ik7I9;;~vwp?W?>W{9*\<֓22\~k!M rծG&_R ڗus)"띜}WtX&pb.3|*jj'?$i=\r&{m$BVQLrꀇ@ǁtlU< ])Y5J۹n#r"">ٹ'`<0H;nSn!Aa\-Ot:LC4V왔ۈkq%cj2R2>~DEN[bqgrDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD gQtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_12.fmt000066400000000000000000000207651200563112200214750ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 128 TextZStep: 19 Char: " " InitialDist: 0 Width: 1 Whitespace: 5 StartX: 0 EndX: 1 StartY: 0 EndY: 19 Char: "!" InitialDist: 2 Width: 3 Whitespace: 2 StartX: 19 EndX: 22 StartY: 0 EndY: 19 Char: """ InitialDist: 2 Width: 6 Whitespace: 0 StartX: 38 EndX: 44 StartY: 0 EndY: 19 Char: "#" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 57 EndX: 68 StartY: 0 EndY: 19 Char: "$" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 76 EndX: 85 StartY: 0 EndY: 19 Char: "%" InitialDist: 0 Width: 14 Whitespace: 1 StartX: 95 EndX: 109 StartY: 0 EndY: 19 Char: "&" InitialDist: 1 Width: 14 Whitespace: -1 StartX: 114 EndX: 128 StartY: 0 EndY: 19 Char: "'" InitialDist: 2 Width: 2 Whitespace: 1 StartX: 133 EndX: 135 StartY: 0 EndY: 19 Char: "(" InitialDist: 2 Width: 4 Whitespace: 2 StartX: 152 EndX: 156 StartY: 0 EndY: 19 Char: ")" InitialDist: 1 Width: 4 Whitespace: 3 StartX: 171 EndX: 175 StartY: 0 EndY: 19 Char: "*" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 190 EndX: 197 StartY: 0 EndY: 19 Char: "+" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 209 EndX: 219 StartY: 0 EndY: 19 Char: "," InitialDist: 0 Width: 4 Whitespace: 2 StartX: 228 EndX: 232 StartY: 0 EndY: 19 Char: "-" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 247 EndX: 252 StartY: 0 EndY: 19 Char: "." InitialDist: 1 Width: 3 Whitespace: 1 StartX: 266 EndX: 269 StartY: 0 EndY: 19 Char: "/" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 285 EndX: 291 StartY: 0 EndY: 19 Char: "0" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 304 EndX: 314 StartY: 0 EndY: 19 Char: "1" InitialDist: 2 Width: 6 Whitespace: 3 StartX: 323 EndX: 329 StartY: 0 EndY: 19 Char: "2" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 342 EndX: 351 StartY: 0 EndY: 19 Char: "3" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 361 EndX: 370 StartY: 0 EndY: 19 Char: "4" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 380 EndX: 390 StartY: 0 EndY: 19 Char: "5" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 399 EndX: 408 StartY: 0 EndY: 19 Char: "6" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 418 EndX: 427 StartY: 0 EndY: 19 Char: "7" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 437 EndX: 446 StartY: 0 EndY: 19 Char: "8" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 456 EndX: 465 StartY: 0 EndY: 19 Char: "9" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 475 EndX: 484 StartY: 0 EndY: 19 Char: ":" InitialDist: 1 Width: 3 Whitespace: 2 StartX: 0 EndX: 3 StartY: 19 EndY: 38 Char: ";" InitialDist: 0 Width: 4 Whitespace: 2 StartX: 19 EndX: 23 StartY: 19 EndY: 38 Char: "<" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 38 EndX: 48 StartY: 19 EndY: 38 Char: "=" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 57 EndX: 67 StartY: 19 EndY: 38 Char: ">" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 76 EndX: 86 StartY: 19 EndY: 38 Char: "?" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 95 EndX: 103 StartY: 19 EndY: 38 Char: "@" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 114 EndX: 128 StartY: 19 EndY: 38 Char: "A" InitialDist: 0 Width: 13 Whitespace: -1 StartX: 133 EndX: 146 StartY: 19 EndY: 38 Char: "B" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 152 EndX: 163 StartY: 19 EndY: 38 Char: "C" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 171 EndX: 182 StartY: 19 EndY: 38 Char: "D" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 190 EndX: 202 StartY: 19 EndY: 38 Char: "E" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 209 EndX: 219 StartY: 19 EndY: 38 Char: "F" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 228 EndX: 238 StartY: 19 EndY: 38 Char: "G" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 247 EndX: 259 StartY: 19 EndY: 38 Char: "H" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 266 EndX: 279 StartY: 19 EndY: 38 Char: "I" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 285 EndX: 289 StartY: 19 EndY: 38 Char: "J" InitialDist: -2 Width: 8 Whitespace: 1 StartX: 304 EndX: 312 StartY: 19 EndY: 38 Char: "K" InitialDist: 1 Width: 13 Whitespace: 0 StartX: 323 EndX: 336 StartY: 19 EndY: 38 Char: "L" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 342 EndX: 352 StartY: 19 EndY: 38 Char: "M" InitialDist: 1 Width: 15 Whitespace: 1 StartX: 361 EndX: 376 StartY: 19 EndY: 38 Char: "N" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 380 EndX: 392 StartY: 19 EndY: 38 Char: "O" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 399 EndX: 412 StartY: 19 EndY: 38 Char: "P" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 418 EndX: 428 StartY: 19 EndY: 38 Char: "Q" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 437 EndX: 450 StartY: 19 EndY: 38 Char: "R" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 456 EndX: 468 StartY: 19 EndY: 38 Char: "S" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 475 EndX: 485 StartY: 19 EndY: 38 Char: "T" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 0 EndX: 10 StartY: 38 EndY: 57 Char: "U" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 19 EndX: 31 StartY: 38 EndY: 57 Char: "V" InitialDist: 0 Width: 13 Whitespace: -1 StartX: 38 EndX: 51 StartY: 38 EndY: 57 Char: "W" InitialDist: 0 Width: 18 Whitespace: 0 StartX: 57 EndX: 75 StartY: 38 EndY: 57 Char: "X" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 76 EndX: 88 StartY: 38 EndY: 57 Char: "Y" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 95 EndX: 105 StartY: 38 EndY: 57 Char: "Z" InitialDist: 1 Width: 11 Whitespace: 0 StartX: 114 EndX: 125 StartY: 38 EndY: 57 Char: "[" InitialDist: 2 Width: 4 Whitespace: 2 StartX: 133 EndX: 137 StartY: 38 EndY: 57 Char: "\" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 152 EndX: 158 StartY: 38 EndY: 57 Char: "]" InitialDist: 1 Width: 4 Whitespace: 3 StartX: 171 EndX: 175 StartY: 38 EndY: 57 Char: "^" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 190 EndX: 200 StartY: 38 EndY: 57 Char: "_" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 209 EndX: 217 StartY: 38 EndY: 57 Char: "`" InitialDist: 1 Width: 4 Whitespace: 3 StartX: 228 EndX: 232 StartY: 38 EndY: 57 Char: "a" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 247 EndX: 256 StartY: 38 EndY: 57 Char: "b" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 266 EndX: 276 StartY: 38 EndY: 57 Char: "c" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 285 EndX: 293 StartY: 38 EndY: 57 Char: "d" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 304 EndX: 314 StartY: 38 EndY: 57 Char: "e" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 323 EndX: 332 StartY: 38 EndY: 57 Char: "f" InitialDist: 1 Width: 7 Whitespace: -1 StartX: 342 EndX: 349 StartY: 38 EndY: 57 Char: "g" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 361 EndX: 371 StartY: 38 EndY: 57 Char: "h" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 380 EndX: 390 StartY: 38 EndY: 57 Char: "i" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 399 EndX: 403 StartY: 38 EndY: 57 Char: "j" InitialDist: -2 Width: 6 Whitespace: 2 StartX: 418 EndX: 424 StartY: 38 EndY: 57 Char: "k" InitialDist: 1 Width: 11 Whitespace: -1 StartX: 437 EndX: 448 StartY: 38 EndY: 57 Char: "l" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 456 EndX: 460 StartY: 38 EndY: 57 Char: "m" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 475 EndX: 489 StartY: 38 EndY: 57 Char: "n" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 0 EndX: 10 StartY: 57 EndY: 76 Char: "o" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 19 EndX: 28 StartY: 57 EndY: 76 Char: "p" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 38 EndX: 48 StartY: 57 EndY: 76 Char: "q" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 57 EndX: 67 StartY: 57 EndY: 76 Char: "r" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 76 EndX: 84 StartY: 57 EndY: 76 Char: "s" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 95 EndX: 103 StartY: 57 EndY: 76 Char: "t" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 114 EndX: 121 StartY: 57 EndY: 76 Char: "u" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 133 EndX: 143 StartY: 57 EndY: 76 Char: "v" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 152 EndX: 162 StartY: 57 EndY: 76 Char: "w" InitialDist: 0 Width: 14 Whitespace: 0 StartX: 171 EndX: 185 StartY: 57 EndY: 76 Char: "x" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 190 EndX: 200 StartY: 57 EndY: 76 Char: "y" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 209 EndX: 219 StartY: 57 EndY: 76 Char: "z" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 228 EndX: 236 StartY: 57 EndY: 76 Char: "{" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 247 EndX: 253 StartY: 57 EndY: 76 Char: "|" InitialDist: 2 Width: 2 Whitespace: 2 StartX: 266 EndX: 268 StartY: 57 EndY: 76 Char: "}" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 285 EndX: 291 StartY: 57 EndY: 76 Char: "~" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 304 EndX: 314 StartY: 57 EndY: 76 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_12.png000066400000000000000000000147431200563112200214720ustar00rootroot00000000000000PNG  IHDR}W IDATx^;p=;nةS'txɽʽP(xڭ%- >7!B!B!B5~q}QڈOaצw__Hv?ɑj,rxvgQV/_"J_ ]k8QڮmHނ-@{/Qzϵ cGOÂ:_[Q/lߣ~ P7z8o ?7?4F7?ꃛ|D_2BvhF 2bT}9gY3HpJ;ODhi3hG;+TQg .N{ױɃm M0IB̐gP.UYQ:+3 9~Eg pȬD x6 >U:{xWYB- J"utDG&ˉzv6{[f}-u*- 3'ߴFh d\AWyhiTN͸xk =]hC xyRl\I"=|3ȷ,~SGr@~2 68?$ϯ8r~9<WHDj$4K`}E-6+*Jܥ u꺒DzNf:lpۑE \AtV髺UWʉ6jr'!J9o1um1kzrAO s;$fD&[Fvu9@!@`Q׭zYڱ1%G|yPG;FEU!@۠v>p"{;f9K-Wguxb;:iVvj&Dr#f,v(@;FɎmEvʸ;'k]N=1JM.I]ONwW| !ģPnMt݁mW^!B!B!B!B!8= ߱{|vo1 g>@2z*o,tY"= A"=]`߳>ISIaGLֿ3]IF:˗Wgy?nEpw~|#j`%_~Q vC:ת'J t!T~6nJn27k8 E]Lɤˤ밣{& ?V>JczWL~YgU@o7|͏FAGw<>lO.Wg€N OݍH-x#=U`%CG߭~vŃef璭dUjY٨g[duI]@g2i*:r9czYY*Oe`vÖhU3hf7?cy]?GTd}H46z+*f?0Gi,sVg*ϑјY E)]jTG>ؕISIaG,{vPgςs"g6 ؝i(Z\T62It+>D\'ՁJ!@6V<(?v6g,':1 2] `AwetLWSʳZ+ÎnrkM;%qeQ 2vgW3ȓW]3n^ef8~%x` "6Ggf$/1LQ+VTZgJ(]LnD$9#be'+JaG7eD'+vX=lviW{ cw%֧gf&/I3\;G9=c?α𐐯,Y:2a0ڵDyrnQOebviu};#/f.#9+k{LJ;)CdzIv7 2vGX2iתod"#Hu("";vgwå7 +Q,o f[-,oyl!e4և(]] D"]NA0K밣rp;vx{ ЯE cw~l;r]*Le"4(q v8/èL*ˁ+?9&2 teCeˤˤ밣{$k24ر33;C;gvM"T.NH goԒ宂7Ǖ$lj 23`*ݫ[V Df{f ʀ|gg8sqeh&"]N q&_&]&M%]3^Ȏl;~rflc{gQ6߈]#yfvU.>;+M[\(m  '!@T``?lD0RܛE}U3! :3LLJ;W bc5N,* a_S ye] "*zgZwNl_|bi983Qym *l4h_Mv #=T*efYم.Ktd2 =ؕISIץ7c Wyx]3fJHVW%C~nErD鳌=C9jΨVq_u6p Q^A¥pVrLwQO]6j!13v!~90%r- ~.WX @_>QB!B!B!NY5D!hq%LtdG^xϞtC$^tɧ-ekFUW~D2bO?$?}{%wN`7Q*;zOG 6*lgE U20 ?FtǗt8ɨ ~W=YƓ/بg'd_m@4z??L(`'}vydTEV>,$۠20 |){<| :?S~?mO?vdOz "C`V2el38*f*uEz=g,#;tUvZyKٵ2ҕv3G=IuA#kgk\tf Ğ5#lt3ϰ.wlO$YzӞ(]j9#]ՠȮj3vKy~Wwmte݌3}gvgڇG܃h iLA.VxlXNap}}x+JڈS6+Aґc&sR.z)}s5#XF^n|fіugAo$3fЃ|[6F(*W%X.^=`]t}cþwd槮Vrm׿ @j3NdNeW/幂~b^{ s1[z,Vݏ#VϨv)~5XA߂npL%ߵct&.ލܝgm8u:Uq`&sR.zG b^{ =Շh_}mϱf=\nVFDIeرIv. kuʍNW$HO5_骖moUW8YF09k]#y=ZgXFnrDg8׺? W<G׀]92{FVW WH. 5[_9U2fRmH9vW-E{˾"+?F׀HfETHl]_ёɲsfwGfTӯ^eUйBogur}B< XU{jB#J*jwn?"yi\E*U5o!@eFo1ح*nG2B\B!B!B!BўSX~Ď`;`Bd'-~o-?}R!DӝxNԋ:t?R}f#NܡSQ wz:JfvU̱RF@ݯp9Y)ˌN/#iW*ȮJAGf:B,iٲYN5̓#XH[(vy3 _s 'x݁uv' ՗*羂+`@} 3z"G0kFigt1Ꜻr#F|fQ Gu;g nѡ*|[F2gf9sN!DYC6P.K շZFБXgY#a$dܟGpueЛaVҴ;ڝm![.O'3NܡSQrD#0P`;;X[+ɓ_uXHn쭭wꃅ3}\̜m9lth[n=;:o+:W!> WpCMxE<:UwN{&$J+0.G+G`˫su(Yu-*!B@!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B|6AftEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_16.fmt000066400000000000000000000211111200563112200214630ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 128 TextZStep: 25 Char: " " InitialDist: 0 Width: 1 Whitespace: 6 StartX: 0 EndX: 1 StartY: 0 EndY: 25 Char: "!" InitialDist: 3 Width: 4 Whitespace: 2 StartX: 25 EndX: 29 StartY: 0 EndY: 25 Char: """ InitialDist: 2 Width: 6 Whitespace: 3 StartX: 50 EndX: 56 StartY: 0 EndY: 25 Char: "#" InitialDist: 1 Width: 15 Whitespace: 2 StartX: 75 EndX: 90 StartY: 0 EndY: 25 Char: "$" InitialDist: 2 Width: 11 Whitespace: 2 StartX: 100 EndX: 111 StartY: 0 EndY: 25 Char: "%" InitialDist: 1 Width: 19 Whitespace: 0 StartX: 125 EndX: 144 StartY: 0 EndY: 25 Char: "&" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 150 EndX: 168 StartY: 0 EndY: 25 Char: "'" InitialDist: 2 Width: 2 Whitespace: 2 StartX: 175 EndX: 177 StartY: 0 EndY: 25 Char: "(" InitialDist: 2 Width: 7 Whitespace: 1 StartX: 200 EndX: 207 StartY: 0 EndY: 25 Char: ")" InitialDist: 1 Width: 7 Whitespace: 2 StartX: 225 EndX: 232 StartY: 0 EndY: 25 Char: "*" InitialDist: 1 Width: 9 Whitespace: 1 StartX: 250 EndX: 259 StartY: 0 EndY: 25 Char: "+" InitialDist: 3 Width: 12 Whitespace: 3 StartX: 275 EndX: 287 StartY: 0 EndY: 25 Char: "," InitialDist: 0 Width: 5 Whitespace: 2 StartX: 300 EndX: 305 StartY: 0 EndY: 25 Char: "-" InitialDist: 1 Width: 6 Whitespace: 2 StartX: 325 EndX: 331 StartY: 0 EndY: 25 Char: "." InitialDist: 2 Width: 4 Whitespace: 2 StartX: 350 EndX: 354 StartY: 0 EndY: 25 Char: "/" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 375 EndX: 383 StartY: 0 EndY: 25 Char: "0" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 400 EndX: 413 StartY: 0 EndY: 25 Char: "1" InitialDist: 3 Width: 10 Whitespace: 2 StartX: 425 EndX: 435 StartY: 0 EndY: 25 Char: "2" InitialDist: 2 Width: 11 Whitespace: 2 StartX: 450 EndX: 461 StartY: 0 EndY: 25 Char: "3" InitialDist: 1 Width: 12 Whitespace: 2 StartX: 475 EndX: 487 StartY: 0 EndY: 25 Char: "4" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 0 EndX: 13 StartY: 25 EndY: 50 Char: "5" InitialDist: 2 Width: 11 Whitespace: 2 StartX: 25 EndX: 36 StartY: 25 EndY: 50 Char: "6" InitialDist: 1 Width: 12 Whitespace: 2 StartX: 50 EndX: 62 StartY: 25 EndY: 50 Char: "7" InitialDist: 2 Width: 11 Whitespace: 2 StartX: 75 EndX: 86 StartY: 25 EndY: 50 Char: "8" InitialDist: 1 Width: 12 Whitespace: 2 StartX: 100 EndX: 112 StartY: 25 EndY: 50 Char: "9" InitialDist: 1 Width: 12 Whitespace: 2 StartX: 125 EndX: 137 StartY: 25 EndY: 50 Char: ":" InitialDist: 2 Width: 4 Whitespace: 2 StartX: 150 EndX: 154 StartY: 25 EndY: 50 Char: ";" InitialDist: 1 Width: 5 Whitespace: 2 StartX: 175 EndX: 180 StartY: 25 EndY: 50 Char: "<" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 200 EndX: 213 StartY: 25 EndY: 50 Char: "=" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 225 EndX: 238 StartY: 25 EndY: 50 Char: ">" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 250 EndX: 263 StartY: 25 EndY: 50 Char: "?" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 275 EndX: 285 StartY: 25 EndY: 50 Char: "@" InitialDist: 1 Width: 18 Whitespace: 2 StartX: 300 EndX: 318 StartY: 25 EndY: 50 Char: "A" InitialDist: 0 Width: 17 Whitespace: -1 StartX: 325 EndX: 342 StartY: 25 EndY: 50 Char: "B" InitialDist: 1 Width: 16 Whitespace: 1 StartX: 350 EndX: 366 StartY: 25 EndY: 50 Char: "C" InitialDist: 1 Width: 15 Whitespace: 1 StartX: 375 EndX: 390 StartY: 25 EndY: 50 Char: "D" InitialDist: 1 Width: 16 Whitespace: 1 StartX: 400 EndX: 416 StartY: 25 EndY: 50 Char: "E" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 425 EndX: 439 StartY: 25 EndY: 50 Char: "F" InitialDist: 1 Width: 14 Whitespace: 0 StartX: 450 EndX: 464 StartY: 25 EndY: 50 Char: "G" InitialDist: 1 Width: 15 Whitespace: 2 StartX: 475 EndX: 490 StartY: 25 EndY: 50 Char: "H" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 0 EndX: 18 StartY: 50 EndY: 75 Char: "I" InitialDist: 1 Width: 8 Whitespace: 1 StartX: 25 EndX: 33 StartY: 50 EndY: 75 Char: "J" InitialDist: -2 Width: 11 Whitespace: 1 StartX: 50 EndX: 61 StartY: 50 EndY: 75 Char: "K" InitialDist: 1 Width: 19 Whitespace: -2 StartX: 75 EndX: 94 StartY: 50 EndY: 75 Char: "L" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 100 EndX: 113 StartY: 50 EndY: 75 Char: "M" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 125 EndX: 146 StartY: 50 EndY: 75 Char: "N" InitialDist: 1 Width: 18 Whitespace: 0 StartX: 150 EndX: 168 StartY: 50 EndY: 75 Char: "O" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 175 EndX: 192 StartY: 50 EndY: 75 Char: "P" InitialDist: 1 Width: 14 Whitespace: 1 StartX: 200 EndX: 214 StartY: 50 EndY: 75 Char: "Q" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 225 EndX: 242 StartY: 50 EndY: 75 Char: "R" InitialDist: 1 Width: 17 Whitespace: -1 StartX: 250 EndX: 267 StartY: 50 EndY: 75 Char: "S" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 275 EndX: 288 StartY: 50 EndY: 75 Char: "T" InitialDist: 0 Width: 16 Whitespace: 0 StartX: 300 EndX: 316 StartY: 50 EndY: 75 Char: "U" InitialDist: 1 Width: 17 Whitespace: 0 StartX: 325 EndX: 342 StartY: 50 EndY: 75 Char: "V" InitialDist: 0 Width: 17 Whitespace: -1 StartX: 350 EndX: 367 StartY: 50 EndY: 75 Char: "W" InitialDist: 0 Width: 24 Whitespace: 0 StartX: 375 EndX: 399 StartY: 50 EndY: 75 Char: "X" InitialDist: 0 Width: 16 Whitespace: 0 StartX: 400 EndX: 416 StartY: 50 EndY: 75 Char: "Y" InitialDist: 0 Width: 16 Whitespace: -1 StartX: 425 EndX: 441 StartY: 50 EndY: 75 Char: "Z" InitialDist: 1 Width: 14 Whitespace: 0 StartX: 450 EndX: 464 StartY: 50 EndY: 75 Char: "[" InitialDist: 3 Width: 6 Whitespace: 1 StartX: 475 EndX: 481 StartY: 50 EndY: 75 Char: "\" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 0 EndX: 8 StartY: 75 EndY: 100 Char: "]" InitialDist: 2 Width: 6 Whitespace: 2 StartX: 25 EndX: 31 StartY: 75 EndY: 100 Char: "^" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 50 EndX: 63 StartY: 75 EndY: 100 Char: "_" InitialDist: 0 Width: 11 Whitespace: 0 StartX: 75 EndX: 86 StartY: 75 EndY: 100 Char: "`" InitialDist: 1 Width: 6 Whitespace: 4 StartX: 100 EndX: 106 StartY: 75 EndY: 100 Char: "a" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 125 EndX: 137 StartY: 75 EndY: 100 Char: "b" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 150 EndX: 163 StartY: 75 EndY: 100 Char: "c" InitialDist: 1 Width: 11 Whitespace: 1 StartX: 175 EndX: 186 StartY: 75 EndY: 100 Char: "d" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 200 EndX: 213 StartY: 75 EndY: 100 Char: "e" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 225 EndX: 237 StartY: 75 EndY: 100 Char: "f" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 250 EndX: 260 StartY: 75 EndY: 100 Char: "g" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 275 EndX: 288 StartY: 75 EndY: 100 Char: "h" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 300 EndX: 313 StartY: 75 EndY: 100 Char: "i" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 325 EndX: 331 StartY: 75 EndY: 100 Char: "j" InitialDist: -1 Width: 7 Whitespace: 2 StartX: 350 EndX: 357 StartY: 75 EndY: 100 Char: "k" InitialDist: 1 Width: 14 Whitespace: 0 StartX: 375 EndX: 389 StartY: 75 EndY: 100 Char: "l" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 400 EndX: 406 StartY: 75 EndY: 100 Char: "m" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 425 EndX: 445 StartY: 75 EndY: 100 Char: "n" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 450 EndX: 463 StartY: 75 EndY: 100 Char: "o" InitialDist: 1 Width: 12 Whitespace: 1 StartX: 475 EndX: 487 StartY: 75 EndY: 100 Char: "p" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 0 EndX: 13 StartY: 100 EndY: 125 Char: "q" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 25 EndX: 38 StartY: 100 EndY: 125 Char: "r" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 50 EndX: 60 StartY: 100 EndY: 125 Char: "s" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 75 EndX: 85 StartY: 100 EndY: 125 Char: "t" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 100 EndX: 110 StartY: 100 EndY: 125 Char: "u" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 125 EndX: 138 StartY: 100 EndY: 125 Char: "v" InitialDist: 0 Width: 13 Whitespace: -1 StartX: 150 EndX: 163 StartY: 100 EndY: 125 Char: "w" InitialDist: 0 Width: 19 Whitespace: -1 StartX: 175 EndX: 194 StartY: 100 EndY: 125 Char: "x" InitialDist: 0 Width: 13 Whitespace: 0 StartX: 200 EndX: 213 StartY: 100 EndY: 125 Char: "y" InitialDist: 0 Width: 13 Whitespace: -1 StartX: 225 EndX: 238 StartY: 100 EndY: 125 Char: "z" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 250 EndX: 260 StartY: 100 EndY: 125 Char: "{" InitialDist: 2 Width: 10 Whitespace: 2 StartX: 275 EndX: 285 StartY: 100 EndY: 125 Char: "|" InitialDist: 3 Width: 2 Whitespace: 3 StartX: 300 EndX: 302 StartY: 100 EndY: 125 Char: "}" InitialDist: 2 Width: 10 Whitespace: 2 StartX: 325 EndX: 335 StartY: 100 EndY: 125 Char: "~" InitialDist: 2 Width: 13 Whitespace: 3 StartX: 350 EndX: 363 StartY: 100 EndY: 125 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_16.png000066400000000000000000000210531200563112200214660ustar00rootroot00000000000000PNG  IHDR}W !IDATx^;$1nm5\ BSz=ϖۮL2WG*>  Ff:۩I'"韄B!B!B!B!#~Ɉ/\LN!o`_tA1X:/E^_~_/^Y; Vf!膍L'M|gL~/ن/^uƽ<ƿ6xov|3A߷;~rDEv;Ao,#6NezuLGSu ym`@'WN膍'M|:w ǘجb¶hūb}O3p;5-ľXU(̃?1 1vxFa<=sN˜1v`uayHX]tAq/yYx"fV'9|U%kx9qQ߬v:sb_[+epRԩ4_{S:9ֶWv:g~/"Mv:ȏgt2sn;> E_DVj׹zb̍`;L*cM1e$OOp|8{;O8R X_:.;WmN @9<<]"c̰׉u:Xztgc}{WETUK3`IT=_[nC  <!0f&;D7xaO9?喽'.r32}?VeT"SSWuĮS.GD=358O'`n Hn_~`j|B~f}^f1/_4co@>WNx:y }"~bdwIO`bG;16=7VEonrDopd>]7)OIOK&Ԙhǒ9,|WG,f}fm?X9vwh\ 1y?ˀ*,7I[OayV~"OvTRoL 띑zS9o֩ V+X+'|5:2\tFi_cg2#؄=8nx'fǼ&waVm%Dd}?Ի䫰;O琏NrNap;sf>K߶a+ =ܼ`mio,yf=;4"nOk]#R'OHщlF]:ykOB؎]+!e|m's ϱ:V*SJ!9&:jgGVB!a9s&'B!B!B!B!B!B!'z5k'U Q mM73'/ZteucTN1"!*X`}s֎HG] G_ X>2rP+5Jm+LL'5";=1'24~k3)G2]3u)ֿOo^vIT ^~nSc>3 sH`ciOqS|x=Aok/ҫHv> hޙ+/"ӑ;h-uࣸ){Po'~GƟʵ ]7aAIدX}}|3RƘU^#!+0|!;JGƋpGܶa֘]Q`OСc7mrOs@NGe?}v8܇t? ~!HfV't @?`Ǽ#/}>>M14v)mxg,s wb ]:f3fzmsw^,2hiD!؝`n!|gXmlG8~!,,[LU]Jy7cXb㔛6lB7cݺw4@>:igѵmv2hYm~2t*tE*d:GD;qlՓa[hY3./q5 e <8Epuy Tl~rƓ H*t_Fjй7x3 h` ranؙzG'f2D}@?ov&Ǫ[7kufe"|9Z~3TmU"*qWu27mTtt,X}'O~ :VůN&^ t=1rX٧ _c逃zF_oFA'NUwOڪEpn#Qɶ`  8da+.<9{lj/:82~7-1fzF<5ێ/[vLf(m#/~vaʹLw7U[UJUM;G`VO%oqxV]O6SweNV7?љd+ #; +LYp+#vwXO$Ng/"9]Ul~rLPL ]㱕ʀ3 6?*NBsȡݍ#:Y[Y|?S9;'w2*SWf:Jt&`#pc.;s:Nfe'cwЙwv65NfV'sk:qyzW.Y:9'f4;;;B/Tm4k' J V8 _3v:R:`;b۩`:w: $;YQO~Q2dVYwwcqmR畹9Qj!m2f+=R<NAl,|Ċ.eNGJg,a*L6o죋mvտ1'] ? 27' ؙz&:,dܮ{s}@[auz'a%=6,Ols3D=,϶"HwFs:U"Np^Uw{g8mdJ./[q,N&N,a9nG8*i`F/`wJIhߟ`+⽈LNd+|0YOCp9drx/b$>3'lwg"$gGpیxe?ѾV_ }pR ?J5qU;ܲ鵯kEqd6:^fM^{t<Ȝ^Y{fu%y?!ܖFr֎F3FED2YE'g2 ;ճ$LYۈzIND;ߍ N ;3daDܬ%:2G&*qw[Fzq:^O{+U_y|_MdP x 5[]ፕϓ?%wg$#VuVdȩmpI3((5)dl  ?p5{z2G&*qw["yf[xUnczpyjL&rFG$<خt1 _=)vd:PSs +DpGl"Ob<[y'Raһ2sGEdRM\U.$^9kg.V=;q}ZM:`5-`';0=b'ݠ|D`^=;v2 :+2 OUd+U538|gߌ+WaDTQ}E}2W=ώ'8tjr'qweo7Jˍ2F./DN_:L~|;x>W?5vxuٹ%"2 jiuJwMEp_X {c+x*f3vWmvjr'qwe/y` lxQXNj|&x=q5!CnjwX͎ "f/889mفӝWefFuNf QgNEewjfgzDY;M(#c43ckĎ(,~ES&aϣmG8_;?d<096*6V̘,cta;ˈ(,~=OlVN^&o2}h0G9"9+6}3 L y !> 9mw!>hyAIqX'y VNZ5o=`dD;SaM⧀3\  B!B!B!B!.y !jG@O;;v2ɆG+5m"5'c Od}o# >b_BO}wzy('lK؇4ɆrZO`N~ߖG&G7lg/FrƋtd8/"_a%'gzM[n[vLf0Kψ3=Lvɋ;yrꬣLWqBf# :22}3:u1,L6iu-Imd;l1]zFd:y?G gi3=,<4~F^CG2Yx'ltsfpQ6ӑ:3f6vØ.=#2Yu;u ˬ:(vV#ٖpx ltґY>l:}UwV#B2=뚅Х-;Q*dz=:2f6vúl~c^䱗tB|>KѸ(>V.f4no\nݿmd5a?9@9\1=B\@K&~.ag.}+B^ dB!B!B!B!B!HF蕳Y:28C[%B k}0Fo}GB LJ[B!x7sv˸!G|3o[B!x7sv˸!>nw۫ .&ҁeLOeF>s]^23"=C93۪cuvl0;=~mp61dz֛uq+B| 1iZ@y];#L 6阁It/wLY8/*3]w' nVL?fuO[vЪY/731>8ӁNwxw}˽3BaՋ_֋z$m᣸a6Evdwz&i &đ Ta:s^clp>OD }oV"u:-3(0)*:qċ vJz4Fǵ cdwf]~p1 s0y;;j[vU]k"eݟ5\'imf:B ƶ«tM:֟ɯ2iW~<[co$chtMdeh HAstݿbȋX gU Xo&L |gcpr^ 5Y!] p|hEwwd'`%ANLm41MtnGg=r@8jhvG׈hk1tցdUeʇ7r 0_:C`=KWx";Ènw ; mnvfvիQUV&_[_ƭ|1p#)f@gr*1X. :XqiXtđpwbyU|`NCе+.Lv/"ҭ/V>E@qkxS vv*&cR;&7wvIkҖmt&YIW}gi62=Un亸!>w7wӰ]KgOsOw˸!>w7wp#OVv]f<9Fn7ׇC^D&ͻ ne<6|@> Y:28C#GunB|E8OS BB!B!B!B|0LjwNttEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_24.fmt000066400000000000000000000212301200563112200214640ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 512 TextZStep: 38 Char: " " InitialDist: 0 Width: 1 Whitespace: 10 StartX: 0 EndX: 1 StartY: 0 EndY: 38 Char: "!" InitialDist: 4 Width: 6 Whitespace: 4 StartX: 38 EndX: 44 StartY: 0 EndY: 38 Char: """ InitialDist: 3 Width: 11 Whitespace: 3 StartX: 76 EndX: 87 StartY: 0 EndY: 38 Char: "#" InitialDist: 2 Width: 22 Whitespace: 3 StartX: 114 EndX: 136 StartY: 0 EndY: 38 Char: "$" InitialDist: 3 Width: 17 Whitespace: 2 StartX: 152 EndX: 169 StartY: 0 EndY: 38 Char: "%" InitialDist: 1 Width: 29 Whitespace: 0 StartX: 190 EndX: 219 StartY: 0 EndY: 38 Char: "&" InitialDist: 1 Width: 27 Whitespace: 1 StartX: 228 EndX: 255 StartY: 0 EndY: 38 Char: "'" InitialDist: 3 Width: 4 Whitespace: 3 StartX: 266 EndX: 270 StartY: 0 EndY: 38 Char: "(" InitialDist: 3 Width: 11 Whitespace: 1 StartX: 304 EndX: 315 StartY: 0 EndY: 38 Char: ")" InitialDist: 1 Width: 11 Whitespace: 3 StartX: 342 EndX: 353 StartY: 0 EndY: 38 Char: "*" InitialDist: 0 Width: 16 Whitespace: 1 StartX: 380 EndX: 396 StartY: 0 EndY: 38 Char: "+" InitialDist: 4 Width: 20 Whitespace: 3 StartX: 418 EndX: 438 StartY: 0 EndY: 38 Char: "," InitialDist: 1 Width: 7 Whitespace: 3 StartX: 456 EndX: 463 StartY: 0 EndY: 38 Char: "-" InitialDist: 2 Width: 10 Whitespace: 1 StartX: 0 EndX: 10 StartY: 38 EndY: 76 Char: "." InitialDist: 3 Width: 6 Whitespace: 3 StartX: 38 EndX: 44 StartY: 38 EndY: 76 Char: "/" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 76 EndX: 88 StartY: 38 EndY: 76 Char: "0" InitialDist: 2 Width: 19 Whitespace: 1 StartX: 114 EndX: 133 StartY: 38 EndY: 76 Char: "1" InitialDist: 4 Width: 15 Whitespace: 3 StartX: 152 EndX: 167 StartY: 38 EndY: 76 Char: "2" InitialDist: 2 Width: 17 Whitespace: 3 StartX: 190 EndX: 207 StartY: 38 EndY: 76 Char: "3" InitialDist: 2 Width: 18 Whitespace: 2 StartX: 228 EndX: 246 StartY: 38 EndY: 76 Char: "4" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 266 EndX: 286 StartY: 38 EndY: 76 Char: "5" InitialDist: 3 Width: 17 Whitespace: 2 StartX: 304 EndX: 321 StartY: 38 EndY: 76 Char: "6" InitialDist: 2 Width: 19 Whitespace: 1 StartX: 342 EndX: 361 StartY: 38 EndY: 76 Char: "7" InitialDist: 3 Width: 17 Whitespace: 2 StartX: 380 EndX: 397 StartY: 38 EndY: 76 Char: "8" InitialDist: 2 Width: 19 Whitespace: 1 StartX: 418 EndX: 437 StartY: 38 EndY: 76 Char: "9" InitialDist: 2 Width: 19 Whitespace: 1 StartX: 456 EndX: 475 StartY: 38 EndY: 76 Char: ":" InitialDist: 3 Width: 6 Whitespace: 3 StartX: 0 EndX: 6 StartY: 76 EndY: 114 Char: ";" InitialDist: 1 Width: 7 Whitespace: 4 StartX: 38 EndX: 45 StartY: 76 EndY: 114 Char: "<" InitialDist: 3 Width: 20 Whitespace: 4 StartX: 76 EndX: 96 StartY: 76 EndY: 114 Char: "=" InitialDist: 3 Width: 20 Whitespace: 4 StartX: 114 EndX: 134 StartY: 76 EndY: 114 Char: ">" InitialDist: 3 Width: 20 Whitespace: 4 StartX: 152 EndX: 172 StartY: 76 EndY: 114 Char: "?" InitialDist: 2 Width: 15 Whitespace: 2 StartX: 190 EndX: 205 StartY: 76 EndY: 114 Char: "@" InitialDist: 2 Width: 28 Whitespace: 2 StartX: 228 EndX: 256 StartY: 76 EndY: 114 Char: "A" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 266 EndX: 291 StartY: 76 EndY: 114 Char: "B" InitialDist: 1 Width: 24 Whitespace: 2 StartX: 304 EndX: 328 StartY: 76 EndY: 114 Char: "C" InitialDist: 1 Width: 23 Whitespace: 1 StartX: 342 EndX: 365 StartY: 76 EndY: 114 Char: "D" InitialDist: 1 Width: 25 Whitespace: 2 StartX: 380 EndX: 405 StartY: 76 EndY: 114 Char: "E" InitialDist: 1 Width: 21 Whitespace: 2 StartX: 418 EndX: 439 StartY: 76 EndY: 114 Char: "F" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 456 EndX: 477 StartY: 76 EndY: 114 Char: "G" InitialDist: 1 Width: 23 Whitespace: 3 StartX: 0 EndX: 23 StartY: 114 EndY: 152 Char: "H" InitialDist: 1 Width: 27 Whitespace: 2 StartX: 38 EndX: 65 StartY: 114 EndY: 152 Char: "I" InitialDist: 1 Width: 12 Whitespace: 2 StartX: 76 EndX: 88 StartY: 114 EndY: 152 Char: "J" InitialDist: -2 Width: 16 Whitespace: 1 StartX: 114 EndX: 130 StartY: 114 EndY: 152 Char: "K" InitialDist: 1 Width: 27 Whitespace: 0 StartX: 152 EndX: 179 StartY: 114 EndY: 152 Char: "L" InitialDist: 1 Width: 20 Whitespace: 2 StartX: 190 EndX: 210 StartY: 114 EndY: 152 Char: "M" InitialDist: 1 Width: 33 Whitespace: 1 StartX: 228 EndX: 261 StartY: 114 EndY: 152 Char: "N" InitialDist: 1 Width: 27 Whitespace: 1 StartX: 266 EndX: 293 StartY: 114 EndY: 152 Char: "O" InitialDist: 1 Width: 25 Whitespace: 2 StartX: 304 EndX: 329 StartY: 114 EndY: 152 Char: "P" InitialDist: 1 Width: 22 Whitespace: 1 StartX: 342 EndX: 364 StartY: 114 EndY: 152 Char: "Q" InitialDist: 1 Width: 25 Whitespace: 2 StartX: 380 EndX: 405 StartY: 114 EndY: 152 Char: "R" InitialDist: 1 Width: 26 Whitespace: 0 StartX: 418 EndX: 444 StartY: 114 EndY: 152 Char: "S" InitialDist: 2 Width: 19 Whitespace: 2 StartX: 456 EndX: 475 StartY: 114 EndY: 152 Char: "T" InitialDist: 0 Width: 24 Whitespace: 0 StartX: 0 EndX: 24 StartY: 152 EndY: 190 Char: "U" InitialDist: 1 Width: 26 Whitespace: 1 StartX: 38 EndX: 64 StartY: 152 EndY: 190 Char: "V" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 76 EndX: 101 StartY: 152 EndY: 190 Char: "W" InitialDist: 0 Width: 37 Whitespace: -1 StartX: 114 EndX: 151 StartY: 152 EndY: 190 Char: "X" InitialDist: 0 Width: 25 Whitespace: 0 StartX: 152 EndX: 177 StartY: 152 EndY: 190 Char: "Y" InitialDist: 0 Width: 23 Whitespace: 0 StartX: 190 EndX: 213 StartY: 152 EndY: 190 Char: "Z" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 228 EndX: 249 StartY: 152 EndY: 190 Char: "[" InitialDist: 4 Width: 9 Whitespace: 2 StartX: 266 EndX: 275 StartY: 152 EndY: 190 Char: "\" InitialDist: 0 Width: 12 Whitespace: 0 StartX: 304 EndX: 316 StartY: 152 EndY: 190 Char: "]" InitialDist: 3 Width: 9 Whitespace: 3 StartX: 342 EndX: 351 StartY: 152 EndY: 190 Char: "^" InitialDist: 3 Width: 20 Whitespace: 4 StartX: 380 EndX: 400 StartY: 152 EndY: 190 Char: "_" InitialDist: 0 Width: 16 Whitespace: 0 StartX: 418 EndX: 434 StartY: 152 EndY: 190 Char: "`" InitialDist: 2 Width: 8 Whitespace: 6 StartX: 456 EndX: 464 StartY: 152 EndY: 190 Char: "a" InitialDist: 1 Width: 18 Whitespace: 2 StartX: 0 EndX: 18 StartY: 190 EndY: 228 Char: "b" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 38 EndX: 58 StartY: 190 EndY: 228 Char: "c" InitialDist: 1 Width: 17 Whitespace: 1 StartX: 76 EndX: 93 StartY: 190 EndY: 228 Char: "d" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 114 EndX: 134 StartY: 190 EndY: 228 Char: "e" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 152 EndX: 170 StartY: 190 EndY: 228 Char: "f" InitialDist: 1 Width: 14 Whitespace: -1 StartX: 190 EndX: 204 StartY: 190 EndY: 228 Char: "g" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 228 EndX: 248 StartY: 190 EndY: 228 Char: "h" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 266 EndX: 287 StartY: 190 EndY: 228 Char: "i" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 304 EndX: 314 StartY: 190 EndY: 228 Char: "j" InitialDist: -2 Width: 11 Whitespace: 3 StartX: 342 EndX: 353 StartY: 190 EndY: 228 Char: "k" InitialDist: 1 Width: 21 Whitespace: 0 StartX: 380 EndX: 401 StartY: 190 EndY: 228 Char: "l" InitialDist: 1 Width: 10 Whitespace: 1 StartX: 418 EndX: 428 StartY: 190 EndY: 228 Char: "m" InitialDist: 1 Width: 32 Whitespace: 1 StartX: 456 EndX: 488 StartY: 190 EndY: 228 Char: "n" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 0 EndX: 21 StartY: 228 EndY: 266 Char: "o" InitialDist: 1 Width: 19 Whitespace: 1 StartX: 38 EndX: 57 StartY: 228 EndY: 266 Char: "p" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 76 EndX: 96 StartY: 228 EndY: 266 Char: "q" InitialDist: 1 Width: 20 Whitespace: 1 StartX: 114 EndX: 134 StartY: 228 EndY: 266 Char: "r" InitialDist: 1 Width: 16 Whitespace: 0 StartX: 152 EndX: 168 StartY: 228 EndY: 266 Char: "s" InitialDist: 1 Width: 15 Whitespace: 2 StartX: 190 EndX: 205 StartY: 228 EndY: 266 Char: "t" InitialDist: 1 Width: 13 Whitespace: 1 StartX: 228 EndX: 241 StartY: 228 EndY: 266 Char: "u" InitialDist: 1 Width: 21 Whitespace: 1 StartX: 266 EndX: 287 StartY: 228 EndY: 266 Char: "v" InitialDist: -1 Width: 20 Whitespace: 0 StartX: 304 EndX: 324 StartY: 228 EndY: 266 Char: "w" InitialDist: 0 Width: 28 Whitespace: 0 StartX: 342 EndX: 370 StartY: 228 EndY: 266 Char: "x" InitialDist: 0 Width: 19 Whitespace: 0 StartX: 380 EndX: 399 StartY: 228 EndY: 266 Char: "y" InitialDist: 0 Width: 20 Whitespace: -1 StartX: 418 EndX: 438 StartY: 228 EndY: 266 Char: "z" InitialDist: 1 Width: 16 Whitespace: 1 StartX: 456 EndX: 472 StartY: 228 EndY: 266 Char: "{" InitialDist: 3 Width: 16 Whitespace: 2 StartX: 0 EndX: 16 StartY: 266 EndY: 304 Char: "|" InitialDist: 4 Width: 3 Whitespace: 5 StartX: 38 EndX: 41 StartY: 266 EndY: 304 Char: "}" InitialDist: 3 Width: 16 Whitespace: 2 StartX: 76 EndX: 92 StartY: 266 EndY: 304 Char: "~" InitialDist: 3 Width: 20 Whitespace: 4 StartX: 114 EndX: 134 StartY: 266 EndY: 304 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_24.png000066400000000000000000000401241200563112200214650ustar00rootroot00000000000000PNG  IHDRx?IDATx^9lqa.W.@ -[.]4eʓwU?!@AV}}+1D ΐwY:`|/YTp_-˷[Sgo/~)?ӉꍸO/RoMe>ԹKu}Q{do(,JtBO:[o:_ʸ\}vrv;Dm;:_m?o@ܒ9jw+A_dVR}徥xWMmCh6St,nuL_Zq6~Q'h\92щ֎MeHֽ?/?:wrDi˓{/npkM___,=7z+go\/ 2hN:!CO:풟Ulם':i xg1dOVv AyfmVWW^Mϲ'vg'xYYr,eQ_7ck~nKO%]=TcoQVƽAǣBݰjO7<  7YYTGyB?[We͊f㆞,I^йA Vyj2֎uy @g+`ΩAws]ם?a-NS\i*_i޼i향7Poƣ+,*=d>ԫ":Z-=r^dԢGzg([zn߳w)dN6O"c}3mÇ`>W w?&ٵlYGS.>Ż ,<^Y1||o=7橬>|6hĮ{.R/ywA6(WNl7 ٵK˝ʎ^F/aX35/ uY瞨S.dvy6K*g:0,A=_qXiC6ȧyݲ;ÏQ76ޯ|į8w+PGYzET[玧$z*'zk[n,7cԍ-0}z/X~x:C}*PK*uz}:sz)7.KCY?nl%Σ~Ro^DGF&^P+*Woi)e1|{ vWK[n,j-(ָ p\}>y_fKhZXkV֙6YgM NmSwr6l"8OdwIݤxիLO oߝxs0) r˭0g$AVIxr;*KP[߄y]xz@ye%1NPeW:U?w :0ŝx⥤Xtc'@v 7QD.?$~#˻ЫZvS=Lvr[*6gyUv(:NՙAmmmWR~fֶMYyձ騝NW.ońK}E;i֔ԯ?Ԋ#;sï'RwFTg&+w%uo#cFK=Ny(w\D~7lB;ݿ^*[$+g^VpwKYra3/.}߽LFޖUiPw~QOq<]<6)_jݮ};U\;Hii$ꥫ"*Q,eRVJVVhs%hU^\o o_mrsK{n^HLKFCǟEZyz%8ycyɋIZ:QǨr>IYٹhۯG9}^zͲ˝3zd4[8|[7n=?zJ-^gCމz⒨:Zb>5GaE\jUvȧ-}z_]ͳcu(G;F=NVYz^nsRIɋAtb)۩|TwQQY+X٣ ,{9M='g%}mt;iDCQf';ݓ<+Uʉ浗Qgsr[7Q^9X}:W5hv;Zv݆{E;-kzOtY<tNtwe, =+ʳ:{o2 VMvmvޕ/ |m#zV{F6-^ָْp1un:;-&33%˷Bl'\ɰjkEzeWw?$KYul#uDV ,r%˷ۭqM'[D5ŚݱriUY}z`ΫEff3ǨPrftv9WVuʕڪ"Q'"vad{SVxJ>|[LNrz 7Z,cZ?T`@md['NuZvלmpdm8v^R Xۊ.eN˻I\Grk\SFIfX9y[˨"=O˷^N:p=4l ꕊ:b8ՙ{VՕ;i6LVHVn^f1lzNzgļ:Sr5^mNjɻtQgl@ DbīnTOgGr3Y#Y+;ڷ;myuY%;G׆ՉޮZ>J}˖6ˮ(Q}u: Zx7,zJgGF>_ָp9qLEλqou}tݓGzxuI+ǎ{9\Grk\8K{p T~g8tv`#eǓQ]Ym{f橅n"'Y>){a=7Ԋ剬z8Վ'{g.{3ћF|׾ofHFY^|哝+W|^Ժ^mN Z?ToS齃 Лytn_ ̀^=哙oRV[I±be+W|4N; 7}^ lDV}מNr >+_"43}gnEdd&o$z]nӕ+'^l勶iπWdv5)7>jWWgzj7e'uuIqFhlWd'V8j2Y>oF6/&f'|cdKYO}DFx1Jor_O٫[?˫wveȵިUDus zful37OiVcjP//&f㺒V4g5tw xxc@d*U+,3F+A=a/|eq7kK^Kf;:SSOHV(uh:EF(?lۏ{"GV'+:婗4W6k@ D vޱ ׉zr]?J߶^̪ZV.Y\zkDtVn-+o,yߞxy[uDZeIWu'ǞzVRlF~) }5ߩ;a1-G~t(g` *o&+KW-+𤋮haVn-+o,KVVI2?3YYY̓NmG[N%;~ZǏEVw$+ 긽YN# ^u,{[✉u/3NQ\2:f,&_'GHѹKWL`JuL:sX R_6.OH% v򎵨kxe,/\=RLβW%'qhd#O:!.-͔5(EehG~OtN*g~Vo޹TS]Ky]zͽ~QeV+x8FɛYJ9fvL#J7k4S,YR)+aFN'K_KJWUyY^u&J#ۻ>Um }t3]di_}'ܩ#FɛYJ9GyPDO\o(NvbʐV5]G6=KJӲ-#[reu?Vx9>+j N^|哙etKYYDZR[8Z*]:(Fex#eA@oYO:EI+Qc{EU O:wyO\o)^|1,{[;]6-O^~G߱}֍խ|+.YgduYJ WHzy1Io:VG[/Eڬ|fa&xeyVU)7jUWd<+*P[E玕 W=LS|'E1챳n3#ѿRTo7/>fE+pTV,geYraE3Yu9*?YYV)*E'k^ X& iRVFgfv-qFqDugvhN~2o%[kii=(uVY=z|er{h^oyVUmQ;m=mkB^ZVFgfv-qFqd3݃,nQInUo6:]K5rFyzx嬸۲s6eGK\!vAyXqW_|fʟɛYJي#fՙ-5`xtc`Kɓ s)eKn}{^R^,WjD:[ m=&/KL3y3;^88Nc /˷[+l^HoldeEs|jՊ&X}/Y^3,{[A@TWoVUֳQ(g$O60Y9f]S{>+{ב}}Y)&ofg+go `_TOOFҎʎ['?/D=yzY-2r-Ww",.ߩZZY#+$^,{{dz͔?7ns$9 3QY>I;*+;5[K3'{[HY׎+e,Ni\]Ҷf+GxVKUth/,Y^3,{[ *?'#iG],W$O6gK)*g,NߩZ7X+ʎ-b^wSԪo)&ofg+8N |2vԎo:VǓ<dy{-+L:Lo WF;/n\qcQ 88|Y=Uy3YYތ-;║-/o$+kTV_de֞D7/fFddyw GV'+s}U.ī~LIԦ#O]G3׵4gJN^ʛʪeflQl75*׎z2kODA@Ks׎tzdeV7 啑 b J: GwS# Y>?[9X[}^?{m Pά5 #nj~ ;@G/蹣Z/ܑ٥u`=EdW͓ }Sw܊dY4' e7RV'+/GTG*k,~@G~zWoz:de$Y[IVQ՛T[; Yr|<-EZF~5]lX{ʭED齴#r!Y;T_ҟj'q^&VD\!f?w˵#YD"Yy~vDTSY}=v=CŒ Vrkە_7}%KzvzJI<#FߵP>d=zF}6yeKw;Kˊ^+;?KgkAR)*?˷:2vr% _9v\11zzRi>O1GNB6d{DmO哞NҶҴV ԉEc7󑑁YtȾՑ;~nn;& >m4<4y/uT~rR=#*:VG"Q2ovhu͸uBg+;Zkuu]fޫgVw.Z5=+:|'+ >ۮ?wucbJ+Sn'{拔Ko~Z2DKeޞٗ]ԝ|<%PohdZ37EdN,i]"ܗ> 򭲪"6:LckuZ,2}kky{;(>)vY=@h '&cԻڳZ w|1{'v5`#.+[eUODfѻleA) ݫ}i^թI:*Uruö]Jj*DeN)o\}IfmmW/ 0AZZ'։:]~t]ًudvtf-w/;{k].Ӻ?zEeNaҟtSKI}IAvU?͗:o 2Z"fGh&;r"1v_dWgҊI㱿')v|:|'qjOBo/EuQԚal\jV5tV>Z7uy;pԉejOjyږ̶fޑA߬(, _OV*aD'S;N^eƻ7oJ}*7*;ODYy+3Wǡ{^gJ3ܡ̘WO#2H^c챳]8o[}Oʕ'+}b؉+WY]>OnqOl;!JY?IVL2~$+[K|pd e|&+pbwo{S>է넬.C?}OK _Lc5u7X_rk\x ;v1YYrk\bbx#ҭqe{Ю/yP~߾ymuCWotk\x ;o{P/ymuCܰ):ָv=hcnnOv5.b7{u;^a =ܺo[#PcPR> Yy+y;3(άU\wl;bQfdR(6KD~xv4Yzǂ/r1Yn7QZmgQ]Y]x긼^7{>FRWvՊ!LԨvܥ;WV,}c.+F͌@ +oFC-+ohzFɎG, 7 6&H =G;tTJ^ݦ$^]/o)geF+72o9K#:&i'*^Y\'N3];Q}Ynq$l0(^m2:FBVqt N,Yx#z#1-{kSn( W,zڽSg|;ݺ%OJxC.tS7Ӣg PO]H*F;1D/uY3;qEifEoi'ʞWo\;p%/6rv4Q}IKnDzxuI亂b쉥 u\/=q!4G绑)^O+`%:ouͺKJ36 +{F^ڹ 'Y]nݎ&^NM1fSdq%;.Wӽ@GҮxײ%˷l܊KJh{yiw.yIo[o$u=uSXU]QyZqi$]iG'+shG.ѸF?5Zv璘Wdvg4F:YS7] >+o/&6׮hgEg;~k4SQ=#.:|3~H}#ig멛bb\+EgvkW-4+ziU FMTTϨNחg4F:YS7Ҳ^՝m$]in:oHT*ziO^ƋnݎfNM1F/s%DugvkW-zMZT[OD/~} ``tSY2]m&^l=rv4#unKq$7˷H\n';\D5{J˧v^b,.nG3RHY'zXZ7,n#qJERzaV7=zey rތ5(>l?o|;ݺeNM1fD,n#qJEϻoHϻw=onYzR;~Ul'RVxLoH}#ig멛b쉥C@;&V՗m$]in{4du.'~ uv.cwbi}.Y=OkvoRV1+TTOm4s E1arV1;I}VOԧ=.iyZ1f[ŢvݹwM^uSg}oOVNOcVhYY&+bb#d嬖cv',=Q-:sIxjsf_4vm` n+?~ @ lh~T?eiϑ.UJOl>ʘWJ/Gmd/%+ե:~^MSV~z͢wϲjѾ]n/~e?ߪO?H#igeu,,ͬ2s;V͊sR/>Q=Ox~]ۗVzfhǯOfh}{%Udgʼn QYYUFI;+dyNoQzPgq3++,d|oVʞQW*W"^* ^]=V3MVS^Z(*s:GFI;+h'ʣmQ^z[fV+QyDCQb>k Z1_'Rv юzzl #&Sewr9x#xW Q}Y(閗.rP4ձ?2HY)z٪;QVFo΋qV ^KiwMJѹ) wD[ [/RdсuOig6rk;lGK_T,/־;##q]8@w#$zӉ gW[oj}nmt*/-}k0/z[՗H"QZܧKQF;(9%$4Km3$:ȼWꋶY9('YFIB4#:0zQgRǾbswyGt.ſou eWUef>[y Fү:[(~VT[#娽;ol6HU:eRԹ[ݭARt3Hke>mgWCFsQMԓ:yjFM?t}5dv>Yb6HUr"pbٸd3k<(Uo zbȷZ7Mԓ:yjFM?t}=Z3MCoFҮҚePA TV/Ko ZveS'ȷ[7їMԓ:yjFM?t}F1!V|5vhh'LՏyiD OxZ+"}LY9|˥}ٴOqO w`U۬%?˷H\#iWjͤ$~j;֣bh.ٍo4tWq[.ͦ}*)y Odޢ%AJ^n鍫u#WJN'%ҷŽzRn֍KZќxҿlڧ{|,.Vk(J^u'1ћqkVR, ^Ҙ՝umnTΥ-ՃȓJM;;&7xp՟-!\iVdW$vi%Wipj֢㮾5\oPk};101+rG~ExVRN:yKj?Ɏd[L.WޠzW;mUgU NtF=(.X547>>wNJws.^>,tr%p}zY/>|?yȞpzN_|z~qC{0zo_dyWTm㵙2˻ۗ2&࿾A%KfST֝}koT'Q/WrߣUQgu4KVJeYڷF^۩MOvC>kuZF֬DV+@mxt9`wi9l@ Z-gC7_NKm%Mmzb?i0NdJȄcMj,/W1q7=c^g&Yު i7tho :}` [>qC{0zvCVO^LC{'nh/E?,s|JG6ڊ>NN zoQ[D? ?/ԉ:ڡ. de" InitialDist: 5 Width: 27 Whitespace: 4 StartX: 0 EndX: 27 StartY: 150 EndY: 200 Char: "?" InitialDist: 3 Width: 20 Whitespace: 2 StartX: 50 EndX: 70 StartY: 150 EndY: 200 Char: "@" InitialDist: 3 Width: 37 Whitespace: 3 StartX: 100 EndX: 137 StartY: 150 EndY: 200 Char: "A" InitialDist: 0 Width: 34 Whitespace: -1 StartX: 150 EndX: 184 StartY: 150 EndY: 200 Char: "B" InitialDist: 2 Width: 32 Whitespace: 2 StartX: 200 EndX: 232 StartY: 150 EndY: 200 Char: "C" InitialDist: 2 Width: 30 Whitespace: 2 StartX: 250 EndX: 280 StartY: 150 EndY: 200 Char: "D" InitialDist: 2 Width: 33 Whitespace: 2 StartX: 300 EndX: 333 StartY: 150 EndY: 200 Char: "E" InitialDist: 2 Width: 29 Whitespace: 2 StartX: 350 EndX: 379 StartY: 150 EndY: 200 Char: "F" InitialDist: 2 Width: 28 Whitespace: 1 StartX: 400 EndX: 428 StartY: 150 EndY: 200 Char: "G" InitialDist: 2 Width: 32 Whitespace: 3 StartX: 450 EndX: 482 StartY: 150 EndY: 200 Char: "H" InitialDist: 2 Width: 37 Whitespace: 2 StartX: 0 EndX: 37 StartY: 200 EndY: 250 Char: "I" InitialDist: 2 Width: 16 Whitespace: 2 StartX: 50 EndX: 66 StartY: 200 EndY: 250 Char: "J" InitialDist: -3 Width: 22 Whitespace: 1 StartX: 100 EndX: 122 StartY: 200 EndY: 250 Char: "K" InitialDist: 2 Width: 37 Whitespace: -2 StartX: 150 EndX: 187 StartY: 200 EndY: 250 Char: "L" InitialDist: 2 Width: 27 Whitespace: 1 StartX: 200 EndX: 227 StartY: 200 EndY: 250 Char: "M" InitialDist: 2 Width: 44 Whitespace: 2 StartX: 250 EndX: 294 StartY: 200 EndY: 250 Char: "N" InitialDist: 2 Width: 36 Whitespace: 1 StartX: 300 EndX: 336 StartY: 200 EndY: 250 Char: "O" InitialDist: 2 Width: 34 Whitespace: 1 StartX: 350 EndX: 384 StartY: 200 EndY: 250 Char: "P" InitialDist: 2 Width: 29 Whitespace: 1 StartX: 400 EndX: 429 StartY: 200 EndY: 250 Char: "Q" InitialDist: 2 Width: 34 Whitespace: 1 StartX: 450 EndX: 484 StartY: 200 EndY: 250 Char: "R" InitialDist: 2 Width: 34 Whitespace: 0 StartX: 0 EndX: 34 StartY: 250 EndY: 300 Char: "S" InitialDist: 3 Width: 26 Whitespace: 2 StartX: 50 EndX: 76 StartY: 250 EndY: 300 Char: "T" InitialDist: 1 Width: 30 Whitespace: 1 StartX: 100 EndX: 130 StartY: 250 EndY: 300 Char: "U" InitialDist: 1 Width: 35 Whitespace: 2 StartX: 150 EndX: 185 StartY: 250 EndY: 300 Char: "V" InitialDist: 0 Width: 34 Whitespace: -1 StartX: 200 EndX: 234 StartY: 250 EndY: 300 Char: "W" InitialDist: 0 Width: 49 Whitespace: -1 StartX: 250 EndX: 299 StartY: 250 EndY: 300 Char: "X" InitialDist: 0 Width: 33 Whitespace: 0 StartX: 300 EndX: 333 StartY: 250 EndY: 300 Char: "Y" InitialDist: 0 Width: 31 Whitespace: 0 StartX: 350 EndX: 381 StartY: 250 EndY: 300 Char: "Z" InitialDist: 2 Width: 28 Whitespace: 1 StartX: 400 EndX: 428 StartY: 250 EndY: 300 Char: "[" InitialDist: 5 Width: 11 Whitespace: 4 StartX: 450 EndX: 461 StartY: 250 EndY: 300 Char: "\" InitialDist: 0 Width: 16 Whitespace: 0 StartX: 0 EndX: 16 StartY: 300 EndY: 350 Char: "]" InitialDist: 4 Width: 11 Whitespace: 5 StartX: 50 EndX: 61 StartY: 300 EndY: 350 Char: "^" InitialDist: 4 Width: 27 Whitespace: 5 StartX: 100 EndX: 127 StartY: 300 EndY: 350 Char: "_" InitialDist: 0 Width: 22 Whitespace: 0 StartX: 150 EndX: 172 StartY: 300 EndY: 350 Char: "`" InitialDist: 3 Width: 11 Whitespace: 8 StartX: 200 EndX: 211 StartY: 300 EndY: 350 Char: "a" InitialDist: 2 Width: 25 Whitespace: 1 StartX: 250 EndX: 275 StartY: 300 EndY: 350 Char: "b" InitialDist: 1 Width: 27 Whitespace: 2 StartX: 300 EndX: 327 StartY: 300 EndY: 350 Char: "c" InitialDist: 2 Width: 22 Whitespace: 2 StartX: 350 EndX: 372 StartY: 300 EndY: 350 Char: "d" InitialDist: 2 Width: 27 Whitespace: 1 StartX: 400 EndX: 427 StartY: 300 EndY: 350 Char: "e" InitialDist: 2 Width: 24 Whitespace: 1 StartX: 450 EndX: 474 StartY: 300 EndY: 350 Char: "f" InitialDist: 2 Width: 19 Whitespace: -2 StartX: 0 EndX: 19 StartY: 350 EndY: 400 Char: "g" InitialDist: 2 Width: 27 Whitespace: 1 StartX: 50 EndX: 77 StartY: 350 EndY: 400 Char: "h" InitialDist: 2 Width: 28 Whitespace: 1 StartX: 100 EndX: 128 StartY: 350 EndY: 400 Char: "i" InitialDist: 2 Width: 13 Whitespace: 1 StartX: 150 EndX: 163 StartY: 350 EndY: 400 Char: "j" InitialDist: -3 Width: 15 Whitespace: 4 StartX: 200 EndX: 215 StartY: 350 EndY: 400 Char: "k" InitialDist: 2 Width: 29 Whitespace: -1 StartX: 250 EndX: 279 StartY: 350 EndY: 400 Char: "l" InitialDist: 2 Width: 13 Whitespace: 1 StartX: 300 EndX: 313 StartY: 350 EndY: 400 Char: "m" InitialDist: 2 Width: 43 Whitespace: 1 StartX: 350 EndX: 393 StartY: 350 EndY: 400 Char: "n" InitialDist: 2 Width: 28 Whitespace: 1 StartX: 400 EndX: 428 StartY: 350 EndY: 400 Char: "o" InitialDist: 2 Width: 25 Whitespace: 2 StartX: 450 EndX: 475 StartY: 350 EndY: 400 Char: "p" InitialDist: 1 Width: 27 Whitespace: 2 StartX: 0 EndX: 27 StartY: 400 EndY: 450 Char: "q" InitialDist: 2 Width: 27 Whitespace: 1 StartX: 50 EndX: 77 StartY: 400 EndY: 450 Char: "r" InitialDist: 2 Width: 21 Whitespace: 0 StartX: 100 EndX: 121 StartY: 400 EndY: 450 Char: "s" InitialDist: 2 Width: 21 Whitespace: 1 StartX: 150 EndX: 171 StartY: 400 EndY: 450 Char: "t" InitialDist: 1 Width: 18 Whitespace: 1 StartX: 200 EndX: 218 StartY: 400 EndY: 450 Char: "u" InitialDist: 1 Width: 28 Whitespace: 2 StartX: 250 EndX: 278 StartY: 400 EndY: 450 Char: "v" InitialDist: -1 Width: 27 Whitespace: -1 StartX: 300 EndX: 327 StartY: 400 EndY: 450 Char: "w" InitialDist: 0 Width: 38 Whitespace: -1 StartX: 350 EndX: 388 StartY: 400 EndY: 450 Char: "x" InitialDist: 0 Width: 26 Whitespace: 0 StartX: 400 EndX: 426 StartY: 400 EndY: 450 Char: "y" InitialDist: -1 Width: 27 Whitespace: -1 StartX: 450 EndX: 477 StartY: 400 EndY: 450 Char: "z" InitialDist: 2 Width: 21 Whitespace: 1 StartX: 0 EndX: 21 StartY: 450 EndY: 500 Char: "{" InitialDist: 4 Width: 19 Whitespace: 5 StartX: 50 EndX: 69 StartY: 450 EndY: 500 Char: "|" InitialDist: 6 Width: 5 Whitespace: 5 StartX: 100 EndX: 105 StartY: 450 EndY: 500 Char: "}" InitialDist: 4 Width: 19 Whitespace: 5 StartX: 150 EndX: 169 StartY: 450 EndY: 500 Char: "~" InitialDist: 5 Width: 27 Whitespace: 4 StartX: 200 EndX: 227 StartY: 450 EndY: 500 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_32.png000066400000000000000000000563641200563112200215010ustar00rootroot00000000000000PNG  IHDRx\IDATx^;$`-׋- PXS :svԌ0FWxԗغ?l{ȰeE?[ 9!7ȟ6hwQTol߰?>ʔй-Z 9j p!$OOadÉ u_>eWce_<+3#w֏zGٹ0fZ} /|ş27)!&Nݰ/Й[cj߰|t>/1):usݫ`v#٥Yun>!0le]pX˕'eK[v,hGp # @6Sc$+Osk &w o?Nr%7,s kYh˝_ز;Ώj,\[9}A5Q[v4+WsLɝܣ`٤ऎ-F~e'0oN~\zFv!V6|ϻgN]eGre17u7dipBed[w55m-7/O0C:]Zl-k-]~7a[~':Ggujyjt-zԮ}zJκ_vei+Z.-˖f0H/D#lQ\Yɬ)MWLMW)OXI"G5\k,VĭuLAK˲Y=(KYvb+Ws26Ldv뙣DUD,s\-FŪ:F-[YFA_GEϲ;՞oHs;XySyW̮c]̷dSxSi3|ZEgF˿0|`J6ʓŜvBGzk^˚m:؞,s*A yySpZ;`bNe%./;鶑Z@,s viU[OٰgY$x윥(YՎdխ\*n[[{4K'<~vBY}rv,o9P9թtk}Ϧ #F@Pڳ oy|bJ*G7@zV{AÀƯrea3L\m0S @6XbvX㷺Y#(O{IG=;huiP^ v; I˯}}ş{-/Eѻ:hY| 6B~yϼm ,to+i[ۮOv~f 3~0]Il+k-1^^n-僛3omS`{{^I;h 3@{ʲYjkY֞fS%Vd65xX^Wگv̰sખ=mzVt,k֎*#a|q1v"l ?W'DwvB{'t}~Vy-ʈfZ)߄mϛo;"y'h3z,u n-ʀ+쪵-_7o;M<[p#з[ u9xy;I_˖,[]q2eCuKOom`4;nPc1r?MogsL@:vfvlBcTq CtXl}~o'rg)X1^}Vy~OE~ Wv66fX2 >wc?7|ݯU%v(II,FXۘae8-F\o  ,?[DɏV,4VSnvb,~8w=Yʐ3 5S=[JɠrW={#! ݴ\OmjOnҝpۂ-ه\,^~W]ے{䖒8X.V'6S统 W+ϧq+KXJ/Î=Rޖ (k}k']\oy` cXehx3}s/Wb`)_oˌt\bvrՔ:ϱXOhSybqkOcc+\{uT;Q,%ӎ+Xk{m:jdE=ϰ[)s7˩[Hq&.Sq%XK-H7=hM_?`P\ `ic+XN=غG¹]39Z֎c1;X)XmoS2^l}3zuτ28k?8SX; y Mh""d:u/OY+r%,""|ZuLiRD gZASң$"" Yj6i_>ȗH7U3iӗVWbeH@~!kw7,+SbP7 M{ <`ňKp1HXy3ZuT{lu;:,F.Vd"y_1VLk?X Fr 02n /V)b֕ it5ʝ8\#+s8Fj'%@8"bW=πmgmr&oS)- H,wǭ _XbJGm |5_$]L1r+1OY,xxoyE:%|̪N?rUj_*V*e.:xv@꽂WRfnzK_31XȰ[;; 9:,;:o$6hޔW9ŭ5lv`ԹS䓭^INQJG@!rfK9+vr ujy/;;u$6y5R^?id;^>IOC}=œU-O+t`Xq:>̇6S}/$A\`S'陪=}Sym>{nɭ; WO\2g:ӃY*Şsiij.^\``πk3FVWܭuuWL{vzOee/ŞұNgeZ'9f`_9l;>O ! n|+xm',$.o7gp?;;n6r(h 7ju];&O#r9c72FΓ gz-lIjÃ,F&'zz=CC/rb@27^c q;,G }swAL`O -+74ݍr +N`P'\9z_vƾ])ct, ~SϏh?'=+"""i_DD _DD^+iW[=EDD@~ouDxSEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtol5~>_eOj_}^ y)Ϗy&VtvBvv~|b+@O9kYo+# ^}![h,YpZ?ܪ밍DKYfnY,V>aN26٬ [wl+ ,':Gccg`y|r+;tt~֔f&xpPVWo߬BKj̀g$^>F 6pPoKXNOu)_+}fYKrMbGy;[q9"=N"/OHN`ә퍁@ ;Bm^YÌ٪eߓCoh=6X5dt,]LeY& Cݭ+W=C9MFb2yɟk01{?,71X8gub9dƾ^P?W˲#EΏWΈ3A>m]]Uցw5<^^Y'31>̒|xh]~ZѼZGd'EyXktLF}45ʧ7c.{`ehd"Ol&)^P?W˲#x`{W 7ʼj4PH"oŔeCXҬ ns^NO᜙}urVƉF׉':[j5Xl9wÃȟw=/~k3VMOzOyⱶ{܎crVƉF׉':[j5X_! +{߬zOݬ)}Ul*cm9e^rz 5qub+ Vl}ZurVi f)@cg6OXW|dU{?X,> [vrEiW4v[MV~zE:UXX|.2(;K'ۣzG|r;F-g3:o`9V2ZwWjV|V"Ȭl,7׃=oy_I8VF(#]uZ˦zԾ\]55[by+ X-"Ӝ OGkjHX| P{HoOqs=f D䓥S?3 F?Wp1f3̺:˱X|0mǞi,ꑰ$Y )n_3WЃ}O9L`ӤN?D˟c@h|n+V#PI||==K'LdtyEX|pf\qW+#ǑV' ,fD-j̡Ǭ+X4,\z4>2dQppl}?aWOO'ÁQRzu[W˹ZMUiD-j̡xx%'ȪzV/S1=Ս;_ by|<혀Ͱ[AǻÉB. Chr`'k>Ωт[g[iyS=y<9< XnCփc|k]mlP{ d O=C++xz ~zzk+"""2Xվ^xRUO\" "* }Njz'""""""""""""""""""""""""""""""""""""""""""""Ov>m'~2XV?5G|Ue2L=c43Z9Q| ӂߘ`FrDZeYB6m'NG|%-3dvsךomYOakf`zW,=`pDZeضzvVь%-3dvsr~?^Sr]W&d2ZWlP pfNcb#38=f,IoQ&c+VHhWd~Y齋_EgzeBLV{*[/ϖb]X+4[&#fe0Kr;ֹmczSpLC-DŽşsdv%+k<ʋ5ȗkQ%`Xht}l 3ٺ1Kp;ֹmc2 X,^ά1|g=Q^|2jyX +XZׇ:2P<[?2V>2c rzb:W~,߈,G /,@\F>jWʂr(VF U|Orȱ2V>2Z=BY,`e0|`eL7#e2;ֹmcF݃?˙_1v%VLD %u|+a+[_ V=rVVt3Q&c+VH7?9r*˯kolx-#:V+[:c%yhƒde2;ֹm?',/H({H+jqLKfi7lu]޺?$YeF̎ut[Z=yrbtŖk rǴ=A@~xь%-3dvsךo^=`SDs< {'eD^y.Cݡհu]޺?$YeF̎ut[ ?E4sxx/󴌖A@߬턞ޱ8gVXNoͼ$[fXJiцz Oђ3{@*,ix5Vn vU)\zu$xˌ2\{ K==Zf"݋_SF7Vf+ȶ-잎 ,~f^-3dvsכ)~_Ѻ,@-5%V^+օͱsekxێ1j% ,2Lf:W~#e'R2bfMFc5#`39Vזaցy<[7i4oQ&c+VLF;Vl,cz,fD&Xj?,oͼ[fXJoTl,cz,fD kG>TbpLǿ7fjs0aP^dX +4ׇxe r^5̑X.=غsfD2x9˥[w(VFDmpFKSʸ= W)gQ+`c ۼ6;J~Ac""2N98j_#Z""2V:)f4 M ec0"-@"M!K5Y]%-/$ExS\/fd,+&Ya`s fX|,˖h`ԎuH^5Ar[nE``FiYxlZ?, Z VGVt}1+'lVF./mHgHXKûdeXrgKI+[fw᭗ž!ƨuYbaki,fu9Zٲj9ZȲj"7+Ów@OgcXǛC@`$yyE[:Ovvi8lهXmmɖcs޺Yx"1بqiQ;X\MHGiY%-۫,&2]q6z*+#a;Dn$J0[ :=9a#zd˖"u o,U l: kSH,W-#iղDK<[W-QYMU>=eD ʁhg2xz4"$:0ɏ~ȖEgpZfb_э1Vu=96a͹e]zseF)'n0)[q -6ɧ[}Vr(;o,"$o5esl"^,U #hU[ת`Z\GŰ)$ز# `=t[i+Wl)rmMYȰ١U vX]G`mgTo8[(nXJsY:Ohi|+HG9BdWlDi'(,U 6kPZZE|GOf:Xt6[+㼃Jo@y:+"3Ϟ<"ѼXxd']9`WȲ1O鮆]iZ@>;Hk (FM3 kGۚȿ-8f욉rbmV80qUd'M+9;_iv#ˊ\y Zblyr՞weV=mE-5!2˔BwCl;//*ކ•DF-NYJsYV yȎœvE6fE\uhV.Ѷ20z߷rcmV;Gt8q:jja9f:ëwތr6@ީZ#͗M=EڰS̒0cm|c{ݸf#0Av|YJsYV+@8^el+uԌNXa"*V8]cmkc`'l9ܛJNX,~ٹ,{ 'Lդ9^٬H>sڎWlv<,wCm=Ak/G*ކm 6̓܊;тT/_iv#jBCtx| 9I"X ˝ův[{b_`ؒl+c%/oudYOߺ=i` wʂ4{Cs*;<`y"remocWVf7vزvrI}'ZZ` = F_y) [_ d9U"QyW69 ,v%/reS= B~e ΫϜNt5/\d62HF bꄧK^W v5^,U 6Fd`։*[gWbω4 f@OO}ga$:g$ތcdps;al(^,U $}Sk]#TF噰"˱2j2f 0#= > -v6+{}#Ut˕yN.g>Uw:m`0.!^f噰X8/wg6QhAZK+Q|Gdn X,~mx:`>Uy:m`Yk=8(['l\Z (NE:)v7ڹBd@1b8('338a>U{:mƈY{HN4hAKKR-߄ CZ^ԩzWCt(56@ku#Eִy{?ˑyw?ee>sG*Q+zF [S' ˕a寂A@d0egSijoOœm鰓ZR*s41h,v^# @)MdǠ=!N[wAGm}P|i=8V ڧO[:o cyyj:EDDd3 DDD"""_XY"""r XY"""r XY""""""""""""""""""""""""""""""""""""""""""""">bEDdGjXY"9kʑKX9";r,5Xla^l%|ŜvYXY7˺3 ۟X^ʑKX9׏ru0%,t? `r9j?X9FLʍ:{2XY [bڏpUS;Ş 33O4 m͖97pb1w:̕7 o,VΡ0 m`JXj?foYlY{bڏ(oPbOS}u',VΡxT;Şa- @:+~[4·-;K$г͛.=Ho3fW 'vFbE*{Xv©6ۮy; l6 -/v$?Y!o&c9у$HXW~y3+r=׻ؑ؀Ћe`m `"_K=yF{7-3)-7GY(,ދe DZFykG$,Vΰ3So^^|S}s``OxwxaXunX;"a"o/ԛ-㩝iD=zGr5{6i ,$,Vz?pba뜩7//>ZS;=҈zƏ0[q;n `턄Ŋc_{rGxjGQF`?t&{$NHXxOkٽZxq67~쏡ʝ>pڎ+6O{^l=y{}Yc/Ŏ_29o(=COL^^eG{ r)fw z;Ro=rr>-ʼs,Vmz·ؙX;:`3W6:3[[\^d6-./+6޽Zo5~ |*u$9roxs2|{HNW聹۟wXZo{^^Pٴ/o`1,FK5 v#Οa M]ʜs,VmT+L[9oйS^iGb?X+M6Qޒ~ao@m}O~˅rHn Pc"oĮ-A̱rH؏Xvkt5yUA@M~b嘷`_ um+VAf-[6a`hbځ+{H-l{5zbs+f4PYƿST[H,$-My;uDž)W9`u@}t:ư?Mek͒huK a7d^Y2?X#hS+"""86װDDDmٟlau5,s,`0OF#WDDD6bSl"""ȟby3#~*{#cSٍ埰rD9:wvX±mrDrxJX9Vp_^Gc8a w/↺Grvc'1vR#ԿNyjmѪÉef困ؓ"GG½~+tsm:],t77a'yK=DGG-N'}q۶~K=,7Ɯ-o{,VƫǍWQ77a'yK=D,o7'nV =[!rPgyIn[C:΢!3zK=D o6^-^wWOam_@ujؓQmyo<]F^aF}?}+| A#<İQXx3Z '[H,s"V˓}ZS^9,r,i}F2,;;pG#} V!Y.a$lx9xlYyR\VΉXV.Or`,/ܓ<}IlkKV2 fRE`UauULAR[h,]Suryo}#r(rNꔰrvycyRimm#jXNnSVbXHX jd%)/XN3y8ᬘj=ݍu9ofIz'iQ+/YS`-+j{:b ;O hJ-nZ.bOwcݞ7Ԙ"zƫ'iQ+V7{xu?JbwFaF;?V1",t7Iσp'8Wr f>m#jۖ`dvC tdi/v/voɋf8)n[KQ'=RcW+u@-BDF`^<'NeW=st=k)'vv la孌Ǽ ݼ7Ə֓OOh'2ڍul=?X',$=k)'v}^bOS]zbGaD[ݜ{4z\Fn^Ή7%zNj=IO=vZz[4elusz`\h'2ڍur?aS)`뙭ؓcW OwB0.vrƺEs> Şb-=Ď0-S*bwc*}Ӌ'Ne֒3ίyyؓcW%h7֭5gvn?A=IO=vZz]  xq؇;KO>=h7I'wbOS]zbG&˦cYbOaj8,z\FnOsfd6M: =IO=vZzɻ%J=wb3nP[L=ĎvR.X~=ؓcWؑ_#ylk#Vܝt[(^5#bGc뵰2OtK}^5#Ga봰2w`9[vZXeDJx}$/o;~گeJA,VyOrW{Վ`""2Pj|[?}}BW+""ƷA Z}=lwEDNG?L6:wIǁ7kt׿DDޢlѹ.q wN X}>1}DF""Y `ljewEDk|3/8x[N""2^}xCm?}SjӴpL-#AFJ%,VDDD.@DD i ""4BWǯVJy!<_z>y?>X @.Suceb地XxZˢdr4l3aȃ br [w$-2#92l=V*,dth,U'quja\u~zn{`˓mXI᪔Vj[֮KlXSl]V*,dth,UΌΰ[w6Z,kutxo,V9ueF޻^=:Yޢh)Hj;INMYT6jA]F٬[Way&cGc9Xrft-غK@my:G:pKKQX9x 'q<','t:WgbCX&a˯P)Eԣ'v$6ly%?Vk,,b6vͨ3LZ-yۍ aq7(-{Zk**a(~U>-3/Xl_eWz;ڈ6'HԦgbɼ٫?Kr-+MEG_a~ɻj,cJ{b+eְY6"f';O=5wWlF=6 )3xu𮚽8o7.b5kf͕R8gXy̫4gށ<{7/v/'h^-h)-W'{z4a)LZoF%(#*-,E`3GUX,5ENaȁų|؀f7v?>«=IO=zbg`wW³/P<ٚ6gf G`}49Qڮ<^Y,xGN˧Ei.}jNՁŞ=x9yK~@k:[+Nw.* 4tjj ^|F7~iŮjp;~`˙Ş=W=;R і3+bU|հ|Vik8,hOXwoh5Üt˓Ş=GW烞UEKDe׽UX,x2N)kSҼYIz;7d=#tlN]rel|=^umy^EY,xGD~Ng\H o=xؓԣ'v&PLI 5{zx>s Uv]-"Wm3c*;Ʀ#x;ìfXIz;[Ar [N<UO9y(p~װr[}*ɦi46I{O'yz2[˚Z<{++hw'6^Gp!`x!eI*lxO{x9VA`7 ;2Bbg9-)OvܔNskndy+ |. v`hb:XXCI!Dvo F͞鞪VA`O>h;iHyZ}[˙kesS<}X;Sl)2xXqߦ(/Ls~S0!rƁU#y8f;-ykNm8jTy`3l`ŭf)֙ؕ|mE:ٝk>Hmcv6^ yʩQƦjʃaRP[LӢǂ5CNCyG}cΆuxR[j3ԅu⭯Cle; f^6];u&V?QEJ>r^X6scMڰ~9^񕃳]u~b/""\~p[n}{. fZ;oȷcm~iϼu>cɷ_Dۥ6_Ww~{ED]j1 ]ʼ )""wb?fVMX]-LkOWVY +&V8y }Oienpn)~oF n3%ϧ""W'V%eBK?]\YU7SD ?5}ߠz\YM/3 ""_!k^ހo[x̀wC8_XO'?"RC-i}r>m"re17~GgљcyV&`АlYРy iz/ 7sKM@}8_0*^"";^S+gs#V@57X""p}K/Ϥ*V,V8JN?mgD yiky4pv[)ʚ)XjV,VfKy>N#9CK"""MZuʛ|Q)0|Q7i" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 300 EndX: 305 StartY: 0 EndY: 10 Char: "?" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 310 EndX: 314 StartY: 0 EndY: 10 Char: "@" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 320 EndX: 327 StartY: 0 EndY: 10 Char: "A" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 330 EndX: 336 StartY: 0 EndY: 10 Char: "B" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 340 EndX: 345 StartY: 0 EndY: 10 Char: "C" InitialDist: 1 Width: 6 Whitespace: -1 StartX: 350 EndX: 356 StartY: 0 EndY: 10 Char: "D" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 360 EndX: 365 StartY: 0 EndY: 10 Char: "E" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 370 EndX: 375 StartY: 0 EndY: 10 Char: "F" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 380 EndX: 384 StartY: 0 EndY: 10 Char: "G" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 390 EndX: 396 StartY: 0 EndY: 10 Char: "H" InitialDist: 1 Width: 5 Whitespace: 2 StartX: 400 EndX: 405 StartY: 0 EndY: 10 Char: "I" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 410 EndX: 412 StartY: 0 EndY: 10 Char: "J" InitialDist: 0 Width: 3 Whitespace: 1 StartX: 420 EndX: 423 StartY: 0 EndY: 10 Char: "K" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 430 EndX: 436 StartY: 0 EndY: 10 Char: "L" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 440 EndX: 444 StartY: 0 EndY: 10 Char: "M" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 450 EndX: 457 StartY: 0 EndY: 10 Char: "N" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 460 EndX: 465 StartY: 0 EndY: 10 Char: "O" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 470 EndX: 476 StartY: 0 EndY: 10 Char: "P" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 480 EndX: 485 StartY: 0 EndY: 10 Char: "Q" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 490 EndX: 496 StartY: 0 EndY: 10 Char: "R" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 500 EndX: 506 StartY: 0 EndY: 10 Char: "S" InitialDist: 1 Width: 6 Whitespace: -1 StartX: 0 EndX: 6 StartY: 10 EndY: 20 Char: "T" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 10 EndX: 16 StartY: 10 EndY: 20 Char: "U" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 20 EndX: 25 StartY: 10 EndY: 20 Char: "V" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 30 EndX: 36 StartY: 10 EndY: 20 Char: "W" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 40 EndX: 49 StartY: 10 EndY: 20 Char: "X" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 50 EndX: 56 StartY: 10 EndY: 20 Char: "Y" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 60 EndX: 66 StartY: 10 EndY: 20 Char: "Z" InitialDist: 0 Width: 5 Whitespace: 1 StartX: 70 EndX: 75 StartY: 10 EndY: 20 Char: "[" InitialDist: 1 Width: 3 Whitespace: 0 StartX: 80 EndX: 83 StartY: 10 EndY: 20 Char: "\" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 90 EndX: 93 StartY: 10 EndY: 20 Char: "]" InitialDist: 0 Width: 3 Whitespace: 1 StartX: 100 EndX: 103 StartY: 10 EndY: 20 Char: "^" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 110 EndX: 115 StartY: 10 EndY: 20 Char: "_" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 120 EndX: 124 StartY: 10 EndY: 20 Char: "`" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 130 EndX: 132 StartY: 10 EndY: 20 Char: "a" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 140 EndX: 144 StartY: 10 EndY: 20 Char: "b" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 150 EndX: 154 StartY: 10 EndY: 20 Char: "c" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 160 EndX: 164 StartY: 10 EndY: 20 Char: "d" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 170 EndX: 174 StartY: 10 EndY: 20 Char: "e" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 180 EndX: 184 StartY: 10 EndY: 20 Char: "f" InitialDist: 0 Width: 4 Whitespace: -1 StartX: 190 EndX: 194 StartY: 10 EndY: 20 Char: "g" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 200 EndX: 204 StartY: 10 EndY: 20 Char: "h" InitialDist: 0 Width: 5 Whitespace: 1 StartX: 210 EndX: 215 StartY: 10 EndY: 20 Char: "i" InitialDist: 1 Width: 2 Whitespace: 0 StartX: 220 EndX: 222 StartY: 10 EndY: 20 Char: "j" InitialDist: 0 Width: 3 Whitespace: 0 StartX: 230 EndX: 233 StartY: 10 EndY: 20 Char: "k" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 240 EndX: 245 StartY: 10 EndY: 20 Char: "l" InitialDist: 1 Width: 2 Whitespace: 0 StartX: 250 EndX: 252 StartY: 10 EndY: 20 Char: "m" InitialDist: 1 Width: 8 Whitespace: -1 StartX: 260 EndX: 268 StartY: 10 EndY: 20 Char: "n" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 270 EndX: 274 StartY: 10 EndY: 20 Char: "o" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 280 EndX: 284 StartY: 10 EndY: 20 Char: "p" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 290 EndX: 294 StartY: 10 EndY: 20 Char: "q" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 300 EndX: 304 StartY: 10 EndY: 20 Char: "r" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 310 EndX: 314 StartY: 10 EndY: 20 Char: "s" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 320 EndX: 324 StartY: 10 EndY: 20 Char: "t" InitialDist: 0 Width: 4 Whitespace: 0 StartX: 330 EndX: 334 StartY: 10 EndY: 20 Char: "u" InitialDist: 1 Width: 4 Whitespace: 1 StartX: 340 EndX: 344 StartY: 10 EndY: 20 Char: "v" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 350 EndX: 355 StartY: 10 EndY: 20 Char: "w" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 360 EndX: 367 StartY: 10 EndY: 20 Char: "x" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 370 EndX: 375 StartY: 10 EndY: 20 Char: "y" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 380 EndX: 385 StartY: 10 EndY: 20 Char: "z" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 390 EndX: 394 StartY: 10 EndY: 20 Char: "{" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 400 EndX: 404 StartY: 10 EndY: 20 Char: "|" InitialDist: 1 Width: 1 Whitespace: 1 StartX: 410 EndX: 411 StartY: 10 EndY: 20 Char: "}" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 420 EndX: 424 StartY: 10 EndY: 20 Char: "~" InitialDist: 1 Width: 5 Whitespace: 1 StartX: 430 EndX: 435 StartY: 10 EndY: 20 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_6.png000066400000000000000000000045141200563112200214100ustar00rootroot00000000000000PNG  IHDR dKIDATx^;8Du=e+wM2ɣP-UL:9d 1cY'Uc18.]v|;x_'z 俓ߓ#0tN|R?3hϬ  ʋ-~thϟ']M:?*c IUpޱrDʒ냸6Y77q1fF̷Btv+g^E7Ӑ+]q!gǨC7yv,鄿G/.uo *͈ u`آPlB_GA_iP/,`;5GҌm/™+oHx}L`΋p¼g:[]bfrn-@p7_M '<9i ]ix}2 X=qu(Zj]d^:욏̏ ڎ~]̺կKT'w+(*lV S̸l <+h_iZX']t6DMݹ!?ut7?W +Yڈ2`-1ac_yDO'ٱ8kx}cfe4Q~@R]W7v[ĕ_{;Vn&FO :x@U!4QxLLyE+<&T#JYc9tI/1tv++^2E|"/طe@~rXbˎoE^yE{Ǩңnf7fu~/e}DA w 3?tAF}3.>R;*U}DSPDOضՌ^ɛZ@)^ ,} nA.]λ: @wGT?ecF/,sc^6ya@Ϗ*;.V,n709x g+du~ͮauei\{ T *T n){N _ܫtvde0V`}u:䧔1ܪCգœiS$$v >.Kcsz 1tpDc1<'G*{oUs<ݔD*yYd[b/7F<2]=jk*~c9ILJgǏ<W=fRTc/ŷAfq}hogX xxrdD)-v)y::KQ&[zgL\yZ!3~9n{w>ʷcy3@WAʍKG쫙~'X@S|4EK RS}RK]UV]QTc[T:_Tߧ^K]?t:%u_eh`pRt1Ɔ:d ,PpR~[iWunbBV<ߛuU?L:٥U|ʛ{kew競FmA[a5+?.v:|,4IHt7q٤*vZtU81Gl&%p!+ ݠ4vq<.`6gWNN⣏(x78P4T,=yE.Cm̯z_@u~>p02VU+ !Ȯ8IG~^d!TV-vŏq"`;V,kώ}4~~Lqv10ӌ5K|4+~%qczT}E]~]P輀/8*,mDюyޛoewG`E|6N(ycӭVr0ff^e2PV;BeL0wտa59լtAX-I{'T10_q쀫h]髰?W7[c1c1c1c1c1c1c1c1c1c1c1c1c"/!GytEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_8.fmt000066400000000000000000000206721200563112200214170ustar00rootroot00000000000000NumChars: 95 TextureWidth: 512 TextureHeight: 64 TextZStep: 13 Char: " " InitialDist: 0 Width: 1 Whitespace: 3 StartX: 0 EndX: 1 StartY: 0 EndY: 13 Char: "!" InitialDist: 1 Width: 2 Whitespace: 2 StartX: 13 EndX: 15 StartY: 0 EndY: 13 Char: """ InitialDist: 1 Width: 3 Whitespace: 2 StartX: 26 EndX: 29 StartY: 0 EndY: 13 Char: "#" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 39 EndX: 47 StartY: 0 EndY: 13 Char: "$" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 52 EndX: 59 StartY: 0 EndY: 13 Char: "%" InitialDist: 0 Width: 10 Whitespace: 0 StartX: 65 EndX: 75 StartY: 0 EndY: 13 Char: "&" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 78 EndX: 87 StartY: 0 EndY: 13 Char: "'" InitialDist: 1 Width: 1 Whitespace: 1 StartX: 91 EndX: 92 StartY: 0 EndY: 13 Char: "(" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 104 EndX: 108 StartY: 0 EndY: 13 Char: ")" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 117 EndX: 121 StartY: 0 EndY: 13 Char: "*" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 130 EndX: 135 StartY: 0 EndY: 13 Char: "+" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 143 EndX: 150 StartY: 0 EndY: 13 Char: "," InitialDist: 0 Width: 3 Whitespace: 1 StartX: 156 EndX: 159 StartY: 0 EndY: 13 Char: "-" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 169 EndX: 172 StartY: 0 EndY: 13 Char: "." InitialDist: 1 Width: 2 Whitespace: 1 StartX: 182 EndX: 184 StartY: 0 EndY: 13 Char: "/" InitialDist: 0 Width: 5 Whitespace: -1 StartX: 195 EndX: 200 StartY: 0 EndY: 13 Char: "0" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 208 EndX: 215 StartY: 0 EndY: 13 Char: "1" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 221 EndX: 227 StartY: 0 EndY: 13 Char: "2" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 234 EndX: 240 StartY: 0 EndY: 13 Char: "3" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 247 EndX: 253 StartY: 0 EndY: 13 Char: "4" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 260 EndX: 266 StartY: 0 EndY: 13 Char: "5" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 273 EndX: 279 StartY: 0 EndY: 13 Char: "6" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 286 EndX: 292 StartY: 0 EndY: 13 Char: "7" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 299 EndX: 305 StartY: 0 EndY: 13 Char: "8" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 312 EndX: 319 StartY: 0 EndY: 13 Char: "9" InitialDist: 1 Width: 6 Whitespace: 1 StartX: 325 EndX: 331 StartY: 0 EndY: 13 Char: ":" InitialDist: 1 Width: 2 Whitespace: 1 StartX: 338 EndX: 340 StartY: 0 EndY: 13 Char: ";" InitialDist: 0 Width: 3 Whitespace: 1 StartX: 351 EndX: 354 StartY: 0 EndY: 13 Char: "<" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 364 EndX: 371 StartY: 0 EndY: 13 Char: "=" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 377 EndX: 384 StartY: 0 EndY: 13 Char: ">" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 390 EndX: 397 StartY: 0 EndY: 13 Char: "?" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 403 EndX: 408 StartY: 0 EndY: 13 Char: "@" InitialDist: 1 Width: 10 Whitespace: 0 StartX: 416 EndX: 426 StartY: 0 EndY: 13 Char: "A" InitialDist: 0 Width: 9 Whitespace: 0 StartX: 429 EndX: 438 StartY: 0 EndY: 13 Char: "B" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 442 EndX: 450 StartY: 0 EndY: 13 Char: "C" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 455 EndX: 463 StartY: 0 EndY: 13 Char: "D" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 468 EndX: 477 StartY: 0 EndY: 13 Char: "E" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 481 EndX: 488 StartY: 0 EndY: 13 Char: "F" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 494 EndX: 501 StartY: 0 EndY: 13 Char: "G" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 0 EndX: 8 StartY: 13 EndY: 26 Char: "H" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 13 EndX: 22 StartY: 13 EndY: 26 Char: "I" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 26 EndX: 30 StartY: 13 EndY: 26 Char: "J" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 39 EndX: 44 StartY: 13 EndY: 26 Char: "K" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 52 EndX: 61 StartY: 13 EndY: 26 Char: "L" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 65 EndX: 72 StartY: 13 EndY: 26 Char: "M" InitialDist: 1 Width: 11 Whitespace: 0 StartX: 78 EndX: 89 StartY: 13 EndY: 26 Char: "N" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 91 EndX: 100 StartY: 13 EndY: 26 Char: "O" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 104 EndX: 113 StartY: 13 EndY: 26 Char: "P" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 117 EndX: 124 StartY: 13 EndY: 26 Char: "Q" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 130 EndX: 139 StartY: 13 EndY: 26 Char: "R" InitialDist: 1 Width: 9 Whitespace: -1 StartX: 143 EndX: 152 StartY: 13 EndY: 26 Char: "S" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 156 EndX: 163 StartY: 13 EndY: 26 Char: "T" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 169 EndX: 177 StartY: 13 EndY: 26 Char: "U" InitialDist: 1 Width: 9 Whitespace: 0 StartX: 182 EndX: 191 StartY: 13 EndY: 26 Char: "V" InitialDist: 0 Width: 9 Whitespace: -1 StartX: 195 EndX: 204 StartY: 13 EndY: 26 Char: "W" InitialDist: 0 Width: 13 Whitespace: -1 StartX: 208 EndX: 221 StartY: 13 EndY: 26 Char: "X" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 221 EndX: 229 StartY: 13 EndY: 26 Char: "Y" InitialDist: 0 Width: 8 Whitespace: -1 StartX: 234 EndX: 242 StartY: 13 EndY: 26 Char: "Z" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 247 EndX: 254 StartY: 13 EndY: 26 Char: "[" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 260 EndX: 263 StartY: 13 EndY: 26 Char: "\" InitialDist: 0 Width: 5 Whitespace: -1 StartX: 273 EndX: 278 StartY: 13 EndY: 26 Char: "]" InitialDist: 1 Width: 3 Whitespace: 1 StartX: 286 EndX: 289 StartY: 13 EndY: 26 Char: "^" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 299 EndX: 306 StartY: 13 EndY: 26 Char: "_" InitialDist: 0 Width: 6 Whitespace: 0 StartX: 312 EndX: 318 StartY: 13 EndY: 26 Char: "`" InitialDist: 1 Width: 3 Whitespace: 2 StartX: 325 EndX: 328 StartY: 13 EndY: 26 Char: "a" InitialDist: 1 Width: 7 Whitespace: -1 StartX: 338 EndX: 345 StartY: 13 EndY: 26 Char: "b" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 351 EndX: 358 StartY: 13 EndY: 26 Char: "c" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 364 EndX: 370 StartY: 13 EndY: 26 Char: "d" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 377 EndX: 384 StartY: 13 EndY: 26 Char: "e" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 390 EndX: 396 StartY: 13 EndY: 26 Char: "f" InitialDist: 1 Width: 5 Whitespace: -1 StartX: 403 EndX: 408 StartY: 13 EndY: 26 Char: "g" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 416 EndX: 423 StartY: 13 EndY: 26 Char: "h" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 429 EndX: 437 StartY: 13 EndY: 26 Char: "i" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 442 EndX: 446 StartY: 13 EndY: 26 Char: "j" InitialDist: 0 Width: 4 Whitespace: 1 StartX: 455 EndX: 459 StartY: 13 EndY: 26 Char: "k" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 468 EndX: 476 StartY: 13 EndY: 26 Char: "l" InitialDist: 1 Width: 4 Whitespace: 0 StartX: 481 EndX: 485 StartY: 13 EndY: 26 Char: "m" InitialDist: 1 Width: 12 Whitespace: 0 StartX: 494 EndX: 506 StartY: 13 EndY: 26 Char: "n" InitialDist: 1 Width: 8 Whitespace: 0 StartX: 0 EndX: 8 StartY: 26 EndY: 39 Char: "o" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 13 EndX: 19 StartY: 26 EndY: 39 Char: "p" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 26 EndX: 33 StartY: 26 EndY: 39 Char: "q" InitialDist: 1 Width: 7 Whitespace: 0 StartX: 39 EndX: 46 StartY: 26 EndY: 39 Char: "r" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 52 EndX: 58 StartY: 26 EndY: 39 Char: "s" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 65 EndX: 70 StartY: 26 EndY: 39 Char: "t" InitialDist: 0 Width: 5 Whitespace: 0 StartX: 78 EndX: 83 StartY: 26 EndY: 39 Char: "u" InitialDist: 0 Width: 8 Whitespace: 0 StartX: 91 EndX: 99 StartY: 26 EndY: 39 Char: "v" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 104 EndX: 111 StartY: 26 EndY: 39 Char: "w" InitialDist: 0 Width: 10 Whitespace: -1 StartX: 117 EndX: 127 StartY: 26 EndY: 39 Char: "x" InitialDist: 0 Width: 7 Whitespace: 0 StartX: 130 EndX: 137 StartY: 26 EndY: 39 Char: "y" InitialDist: 0 Width: 7 Whitespace: -1 StartX: 143 EndX: 150 StartY: 26 EndY: 39 Char: "z" InitialDist: 1 Width: 5 Whitespace: 0 StartX: 156 EndX: 161 StartY: 26 EndY: 39 Char: "{" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 169 EndX: 175 StartY: 26 EndY: 39 Char: "|" InitialDist: 1 Width: 1 Whitespace: 2 StartX: 182 EndX: 183 StartY: 26 EndY: 39 Char: "}" InitialDist: 1 Width: 6 Whitespace: 0 StartX: 195 EndX: 201 StartY: 26 EndY: 39 Char: "~" InitialDist: 1 Width: 7 Whitespace: 1 StartX: 208 EndX: 215 StartY: 26 EndY: 39 bzflag-2.4.2+ds1/data/fonts/DejaVuSerifBold_8.png000066400000000000000000000073261200563112200214160ustar00rootroot00000000000000PNG  IHDR@lϿuIDATx^;FE{Zfew6=*|g 4̬һN%I  E!B&F% JN!qܩ,o7ߨAֿo|<ǍdÐɂzn o({% XGЫd=yLzcR'/76>CǪ_f:u*Yo~ՉTz(W:_oPduqksw/5WsP USEE6HD:cS=F*rрk MtBlQ] L:L0ɱw:UA;zGխ7ȱMhfÉ q d\vd<,?;pf7'_Zu(_uG8twHw5}|kț_\8s>չp'zlHF, A rX!g5"8 Pל񷊨=;e{UЇǞ{"]]ɗ:6 ñYE6v1j9WˍUJ&bW`c9FCyTՂq;5A^oWU_BJjE:;:lhdN*U3`rB82 :ՀG*crp&tW$nw"&әm] pe_L6'-q0%8 @U|G:} j 2G8 ùEpĐeOP&')}βV|u\S}A:st_ ; %wea™b~s XPNxT嫛׮NF}:VŶeprWU= ?Uy]%>'uEY̱ "|z dvU۱*[;:oűT Y-;Z| Й&Tpwo2@X)zd}n>}s)Wei+;t](݉-N{>4XPT! Ψ(е;_#,nOe2ѹow*+DǕjՃ 3apvWn4wvtgt&`'yDzuOs/*] НS@T<9[ǖ-{ `Zn8wsty56 Gz@yCOag@E飡0?N`Wl> ۍD!jnyww& }W6iYG렿vص3wv{d AlyEؙ 6d' ӷLDm8c@I2O3VtVv"G:?T1"+9*P(8b;[B\+gu]!ބGlW Lne|v.ZwE!B!B!Ĉg=X,;;J,Q{2LP$\J#WlsN^$ot*p\xbd-YL*?so$Nݎ; lpk?6':Oʰ00hEڗϲ:[-(VuYii[eg\ߑVm(U!S=+}tj@GF{Yz8' k|b̎=ϲWl_*ehu r4lo lc:k.lt_bU9VTr-ԟ?_!87~~PE;h+yH;OJpT [O>Vouyy_x|q:U-PɮgL(ϕocS9 a[Wy/guvi.VNL_ \œɮ}u[c]>豓Wn:WQIZPGv^DvevWΖN%\&"6:Z=y $"QHİ;we B(reR]!x[C+h_kVngrSONt\頾:˰:x~j8A?V~i*mKW.bbG!Nx|绚7MٯD+V{yyx* ~`ľY}8 :J yȰʀl#=S4*TpN~bj:$Q 4dzt:@ T: H&ΜtrU+lY]&O]5M3Jo*?#;W2vļ)iv ;MAVAwAÀ#KFEU+Ƀñ%V7kнmLwmY[1?=Hse&]! Ng=:!x#G%9/02`u=BB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B_qvNEtEXtSoftwareBZFlag TextTool-W32gIIENDB`bzflag-2.4.2+ds1/data/fonts/Makefile.am000066400000000000000000000021301200563112200175310ustar00rootroot00000000000000fontdir = $(pkgdatadir)/fonts dist_font_DATA = \ DejaVu.License \ DejaVuSansCondensedBold_12.fmt \ DejaVuSansCondensedBold_12.png \ DejaVuSansCondensedBold_16.fmt \ DejaVuSansCondensedBold_16.png \ DejaVuSansCondensedBold_24.fmt \ DejaVuSansCondensedBold_24.png \ DejaVuSansCondensedBold_32.fmt \ DejaVuSansCondensedBold_32.png \ DejaVuSansCondensedBold_6.fmt \ DejaVuSansCondensedBold_6.png \ DejaVuSansCondensedBold_8.fmt \ DejaVuSansCondensedBold_8.png \ DejaVuSansMonoBold_12.fmt \ DejaVuSansMonoBold_12.png \ DejaVuSansMonoBold_16.fmt \ DejaVuSansMonoBold_16.png \ DejaVuSansMonoBold_6.fmt \ DejaVuSansMonoBold_6.png \ DejaVuSansMonoBold_8.fmt \ DejaVuSansMonoBold_8.png \ DejaVuSansMonoBold_24.fmt \ DejaVuSansMonoBold_24.png \ DejaVuSerifBold_8.fmt \ DejaVuSerifBold_8.png \ DejaVuSerifBold_6.fmt \ DejaVuSerifBold_6.png \ DejaVuSerifBold_12.fmt \ DejaVuSerifBold_12.png \ DejaVuSerifBold_16.fmt \ DejaVuSerifBold_16.png \ DejaVuSerifBold_24.fmt \ DejaVuSerifBold_24.png \ DejaVuSerifBold_32.fmt \ DejaVuSerifBold_32.png \ readme MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/data/fonts/Makefile.in000066400000000000000000000334661200563112200175620ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data/fonts DIST_COMMON = $(dist_font_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(fontdir)" DATA = $(dist_font_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ fontdir = $(pkgdatadir)/fonts dist_font_DATA = \ DejaVu.License \ DejaVuSansCondensedBold_12.fmt \ DejaVuSansCondensedBold_12.png \ DejaVuSansCondensedBold_16.fmt \ DejaVuSansCondensedBold_16.png \ DejaVuSansCondensedBold_24.fmt \ DejaVuSansCondensedBold_24.png \ DejaVuSansCondensedBold_32.fmt \ DejaVuSansCondensedBold_32.png \ DejaVuSansCondensedBold_6.fmt \ DejaVuSansCondensedBold_6.png \ DejaVuSansCondensedBold_8.fmt \ DejaVuSansCondensedBold_8.png \ DejaVuSansMonoBold_12.fmt \ DejaVuSansMonoBold_12.png \ DejaVuSansMonoBold_16.fmt \ DejaVuSansMonoBold_16.png \ DejaVuSansMonoBold_6.fmt \ DejaVuSansMonoBold_6.png \ DejaVuSansMonoBold_8.fmt \ DejaVuSansMonoBold_8.png \ DejaVuSansMonoBold_24.fmt \ DejaVuSansMonoBold_24.png \ DejaVuSerifBold_8.fmt \ DejaVuSerifBold_8.png \ DejaVuSerifBold_6.fmt \ DejaVuSerifBold_6.png \ DejaVuSerifBold_12.fmt \ DejaVuSerifBold_12.png \ DejaVuSerifBold_16.fmt \ DejaVuSerifBold_16.png \ DejaVuSerifBold_24.fmt \ DejaVuSerifBold_24.png \ DejaVuSerifBold_32.fmt \ DejaVuSerifBold_32.png \ readme MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/fonts/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/fonts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_fontDATA: $(dist_font_DATA) @$(NORMAL_INSTALL) test -z "$(fontdir)" || $(MKDIR_P) "$(DESTDIR)$(fontdir)" @list='$(dist_font_DATA)'; test -n "$(fontdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(fontdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(fontdir)" || exit $$?; \ done uninstall-dist_fontDATA: @$(NORMAL_UNINSTALL) @list='$(dist_font_DATA)'; test -n "$(fontdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(fontdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(fontdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(fontdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_fontDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_fontDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dist_fontDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-dist_fontDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/data/fonts/readme000066400000000000000000000010261200563112200166600ustar00rootroot00000000000000The fonts in this directory were converted from true type fonts using BZFlag's TextTool. TextTool is available in BZFlag's tools/ directory of the source distribution. Please contact one of the BZFlag developers if there are any questions or concerns regarding existing fonts, the addition of new fonts, or modifications. Any fonts being added must be freely modifiable and freely redistributable to be considered for inclusion. Original TTFs may be found at the following locations: Deja Vu fonts http://dejavu.sourceforge.net/ bzflag-2.4.2+ds1/data/frog.png000066400000000000000000000200771200563112200160210ustar00rootroot00000000000000PNG  IHDR@@iq pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?H0@4 F|Ј@#>OϟVmʠgpj i[|{ Wp7?1aO.vn2|e=5%!;f#SU 6D=bW}9+Zӓ7[s;iws{AL 0AK?Q$w?J*zbF(22220[q0 [_xLL2̌ -'??U7/Z 1àt,Ј* l&_,P<(d-r߀ (߿13ٹajBA> 5~Ogd57?1/ !_A?3>qGDSFA\AIo>  ,>i19VjV'֝̅H_gpaps-aUr J~;֭ ̌'cD(@iϿ^ Ws;{%`aB|mEAUa7_3< bb~ Ϡ'Pkΰovo?D8 ^Mge3, 9^3}`xXcz9OF`&&F`꙰|5Zg7o1 j1ȈJOW8fQL^mߙUs5tc`S3'6`;`C ?2򑁋O9YdEcOB O_dPaâݡ{n˻^ n ^{7q+fBLl|zY~s7_W >f`cb3Fko~~3?e+ç/>Sɛ^;j12k1`1XϷ Sggnx?b߯F@A]NV^zL &F&__^}zpo??31qcgMD}l03; \L@& aQьW]ɞ''?.PsN2pfg?rMwMWk_|@d#?ĹJyr_ԝn_pR`g30Rԑ}N o0yG /om-yIII!1Ei)QiAF lB~?l򅑁O>{ ʜ~7jdbbn3bi@ ٤}}jۥR;bYX΀,/`a%%~ &Ġ( d, 4 HF?Ov`/c,,q #?З$7:?#+3׏ <_VuY _~|n~X |9? ߿/ @"D#6wow~3o0 eNF7_2Hky}w8u%7_^ܯ?h@>(@~``if֟^O1 _w{;<߼fP\.n/ЭHg(G@݁l RR֖/?'0DD1%c3>O!3|>T4j{;|jgXl]? X2-70xlXYعaJϛK^\৮!1m<9EINĈmb{ _>``/$Xs0q1tkZsv*W_pIhn-&(. '& '$ ,8!0uyUX1|fLw1K zKzZJXLI?_AiFs…y;Q3~ -`浯߾[a1|qusty9?~sUgff/05}lf 7`) l1c ԡ ܿ XSzÏ?9\MMzsC!>qKy {>(y7Q) İqA6!0J?'[l0R_]Ù~x_⿂?~K_)#33gYu߿`e`V y(, -t)4=788y8n4IJ @$ qc ;lf`ex .OIV` ~6t c;'0A70pP 2زb㙘[.>3rjo06`RC6Svh T, a-^omx̿^p |g0G`˄&Of 0ل?TA_.6n` 8&`*Q Y°_3 5 @,bo .eUfhK`~n, ǟ`9vn`cG(2 <A`^f6MsU b߁%%01ca:v`U \EJxN=pS9.Qڊ@So H2{b3EĜQzWSdL_yY~}e;_84صe,e)X2|YI 4c l81s3,,$y \bv͉fg #?i9X_pU> ~! wݽXdm$BC"›i<ЪV X(Oy~f7Qx{\Rpiqo*E K)xstC |H^I,3:3pO.d(a)dΤ#8"I)XF0<[a}1α)j co'+ՑHKB{Ϊ~shO{AU`jrk)8HRle$M,4J^kEf?~/\^Wi"XEOF+NA7ȶ wF6$@g0C"x1'SUEhJ65P,wԫiĺ!raAzԑR.) K$Ù/)ߟ`Q r&CfU]vVZ R~8-Xlû&?G8Y"0R|JtJg T5ku DPq"&i.tVUIu7~o'@Xw~fGA?nV9ITPXgn3AGݖAH Wk~yz.eB_adea[o-WϾ1</u Y^?;^0|Xv˅WLZÓ׏[%αq*+򋓅Ր`G5 #O_[Q!"uXetcluq^`X ӯj2 A=U˧/pE4 k,%3&g.~ w7g~a{ۗoyY_}yĠl~s(_b0Q@b`MVOzy)f.na /##0K[?U1To߿C3! ŇDҀȠ>VSp.vׯ?n_My7Og{.+,) baW 21K`{Xߘ!&*aU&>yCeB].e.zG jWb2 j:5O?2]]%,KU{ Ù?JbV/_89$c Lŋ@/` L!A_ٳ~3sx"pEJ% s1Hr)k wޓt뺱pi o@i@Qef7@_ n D}#q"BK)seclEAJ 4W! N`/! >ccv+H+lQi)NMs"WQ'`5H e? Xy;#o} Å_7XweHz_>%`9A# G|A5'DgH{xTk3V`+<@: 32(ؠ1>nrJ޾?1 b@ ,JZ r0X4f޲_D]{6ϚĽ@f]`J, r 3=H=@"?/G[u |i̙ 1q'h]=@:Nx  \[L<ukw1+ϛnt{e| |R w#8 j:KKlڽt6w ߿Z ?fJU߯?t @6<JKtab f`J{W ~bO][{ ]v >1 ;<Iwʣ.MTLMNOJdd! Xc~|J\_pm=`,А+犿߹8%V~﷯B-Ar??9&;|b'A~2e9A4\~}?]u +\e mlXgk&IENDB`bzflag-2.4.2+ds1/data/green_basetop.png000066400000000000000000013516551200563112200177130ustar00rootroot00000000000000PNG  IHDR{C pHYs  ZgAMA|Q cHRMz%u0`:o_F#IDATxd[${̬︇{84)ALHM4EC$53# %K Cw &L2$DIhDP;uU!"ZXYԾ;++3"uxg= ">MH:"Rz<ϭ5DlH)ƀH̜B !2".7͹ZJU ! 9gDaH!fPUafE@zJD$*Z Cy^RBRu&ޜ"=ƨ"KADDdiLgi.OH0M奶2#éw)ηyYar>"2rCĔ8p8qKR|~~@L9gf>Ϗ_2s{<ZZK5pr)0 "1gv0///("L1޻!L!eYRJ]L"a~j9vy_>i:<==1SBDPk)s.i: ";Х u9jiRTATqМsLD#dUUB֦8:///t`GaYV+2x̥ ^J !ReyZkyv|*hr"tCÇ4}7J8HEJL0 "sq޷{oPkSP]k]ZwCJlɕ{DbL)\KLЩ/Zk*@^HU9L@5Qeu] xoԱ ї\E{ 9v, D;" !ּw+.˲ʎһ(Bk#$_uYsİ,kn7c cBeY[o",Szo7xxxޱs%xݖez^N|>V}9;2ZE3Qk C h9 ދ 0uYUAc3y]3 x8ZBc:ZEb޻>~vz<B˼~}Sy%"i{篾ZUZD3S= 8 R.s. "ERw^DyF?'~py^) w^So9N)9笂dvdmMt][cv."]){?#tۺffv>̷piu]qZ04 1缮0㑝\_>|z#"QXٹ\8_kG]*u]E3-c$3;ND!PY"qT"9K)5 n՜̭u_s&bD%BD;Z1V5RigcUUEswP<C!LHyHJH]:;VY"Z{ェ2s zo8"yJ|1}]/0 1ƔR >>qdښ&c7+)uYӐX"")HwӡVkm(Syo"l7D[Ĥ rc牰J{j$"4Mr9x즷֐{ߚc*6޵[mRk%#qqX@R[C^nu"Jr^Z\AUevͭ! jiwmLӡop81֬ vpz0jm㑙UeYQ5Mi$F=;R; 2sJEbJH"Rkc&f,*8xoRkeq,>|xz]{LZcz9f*޽{GD>*hJ!ޘֺ,Kf9BD(*dLz|8c@RZQs7"\׵?ljЎ4UmQU!B^[Ǒ8q]לˇ>Hr8v].z҇{|Çqz/t<sO4 Czzz.%?==ެg[PAZkcTݺ^D9n7 fnjZ+"@)UUk-"BDC,bxJIUɴg!d=c8zк9}Uk{ow|D}H)ZۻvZJxJi`&bJFZk"Bk]UTj-ղSJ7,okm$vz路Jk9]t{d"M^JE=uһ*s4K.9@Dל!RJ'.@T~r @TDtVB0kN)ڈ7 p^A{[; 87 n=4 ) Rj{߽r)h2MӲ,D!H9f|)# +>@>ޛw 1,֛@Um9Ą=":֧TuY:23;&ug{g݂.=`k >J->@גSJ8vCJ윪h{BݮUDW_r^k-0z3Pai%҅J׭#U޵g>CmVJ1w,LTjB(@)r@sI)R΅b9ԛp<Z9kjJ-T$/cb(3Ř.:s#0?2C/!Uv8^riP C8FC;UZZ12 ]C(%{i=}|yHjqEx C^/[c=z)wA".%#bJ9} Z*U]PUОv{DԎy~]K).D45 HQCv܀j! x^[k<J[|k*-46/73bYfvAU}D HJ^w︵) *zo) |<{o 8/C0@ct4InҤ,s{#.z%^[+uΫ܀,k-9We]KVV[ǘe&bmCRˠ0 3o8 uТ[lZQ;qJj{ un ƈA^cJ лZck}.20 K✿\o1F"$LDw@JD ]wVta|Y8.Ri)Z!ʎ#D m!zU%3<"R (bzjZjEUO0YB"LD;$ޮJ r.0 k<[Z?|u_~̫wq+@~<,[@9e.,khS{y9RwB*Lt^/BD/8.z8|>Zv]pLip.a"*  s@RrT~BXV8η֯k  Oz^ӐJ1&R 3|Z1FZR*Y[b WCd^[mb?Y0p^CLy])O3RJ0R#sGwG95???#L\w0LÐJ)#"2=XkVk'fv >"c//"jU˲- (' _jOs7˲RUw1]0 F'>0 α*8ιb t>X wU)Eԇ "CJvVbQJaR{\nٱ !fDxѳs^//%S0*AH<;GއS-q|y~\."=H]d]R859@RU:[EP$ڥ 0wkrN'&v@7"+\ j!"v.ZsLv9."˺ZIqko-hue޻! ȭ5U F>>b "ÇwC40ROtg?oWw8{9\oWyt?CDu]{o1wᅲ`u)hK)n;g⼷фƝRe 1v>8v!{?,j231O㨪aDSHuYVU%BKD;Dn@HcHÌ:u%b5`U`򓟬bʢZJ)Rj2sJtzy1"Rz!R4]DqDdP9N`u1T5^m*ti,sp]l`a)u" 9u].Dcj:LԻzV#T鯠ۚ[s) 2K-j [+XcQk˹xc]awyZ퀆6TQ-l "#( 镈 ED*R\.7#՝s˕ G"%"z|Yi8> />0j.,=l h5gvvntS Xf۠+C#dAn!Db "r. q]3"Dy]{aPcc.yg&: &* #wト^q\?=!9/;#;cDZu.tv JHsY!F+0ꨭZoDbc{w/`]xo9u$qu^/@ᇏU]x8Pk4s)łc>ތMu]s^Sǃ ޮ[k8޽{/x\TR`u];""t:_^k;fGH[KJy$>+# _jmLЉw-x 8ϋQMTJ>NvRzxZe @"db=刴,+3u 9gmU3˲NV{s)Jg4:N5nTIhc KW_08すZs.̳q!bXqgN&9r<%gDeY!ޟg\(кC\. Tf#tLL4Ӛ!v1&[L^i451"<ږeɹau:DcL^u8Zo Rt"182 {{o*xf "fLb`bD\9}thk   P4 1SF!9s^e{c!漆s.!=jUZ!8$:&UZCkmez^s)*k-}u>;ĘѰZf#kIHE%ԥΑUht"7fڊ K72zŔbH9!Do{u]̖q58 p8:b kη杷[z"i0BY x>_'ߗ\&]j//8~7߿e7O4֬koٱcrέ ;5BZ_gfWJN)i27fttjŘOe,P?_^VAaJ)aD!zoC\ʺ) z\ 4W4n0]J<k^M]g漮|s'"γ)&5{ R![G[kDh DbPEDbG+} P;", 0 ֩0s-bE2uZJm}2Q-!(M4cH!.8%-yqRČ;:̎q;Ǐ3QfARk+8!)@{~~r>uYCy][>@!dh$pUt|@ۙ,PUm[˹+Œ_}eJ`)x<.k^Uu:0_|yӓg?Y1z9Faz`w:ݻw֪s.Lj[D=j*Һ<=?Ϸ5jZp=3.jRQ&Re^p>eugqj0ޅySᲬg3r qV՜@VB18K1F}JIuDt~VCRT5hD/ȿm50 jcz6ՎH)Ɛ0MDZŒ[k0^Cu`bk"ZkU !=>>ޟ^yT\^D/Tc ػĔf0+v#ew78K."ID:۹ǁk+c6KS#y_K8j.EDFD znso\Kejc.p\l4MeYjm1x5D<f`@ccqY&xD̹V1Dc#ל ސ9fUi!"tEJ ,eyDdRhàn[Υb:%$&yG@. w^okΆyz{"N)5" tCL[ӪMUkm!Lyq3C$Ɓs)DĆgٗB< 10!9Uv,"h!*s\q!^Dji0DܮyYssx<{? 2M{%ǔҏ~s!u]UZr魿W5)%pƧ2Z޽C`)Z˲?~4n;7akD;SJǏ|t#;~y~ޜ3*s˲,tz8NDXk [* V^Wfq q.,(#B-RJi 2z3aNAUM$ҍ (A7 pt1fΑ!l3(#뺚2`]J&f_E}lKH!3Z9V a: 1xongc7NIiI{r9n7q ч tzp.<<<SəJ.6Mq?諔²fUXsƉ]ιjRs@!zfGD1X1kQsɀZͷ֚јnǶwiR֜s>=VQ;Ƿ,ۤUEEb !F= 2"K fWjQb| [.6//qLZiZcz\r^j NEqZi|xx5YMB@"D !7Q;6FTۼ G$À;цDl[U.֩x[.ZC[m;ٹƄ"5D7Y١)[oZ$ !v1BśyWjQ۲.qɆ ދ ւ+1Pd6 4!9M=BDiHC4KxPΗ+o09گ׫leeYTETSIRK)%BLH4 Ð5QtޖuQ睪DtYy^uiN0Nyͭ2b4smMORKV@m41H^Z_}_|;M;ok!h-K6><޿ !!|~9֮k4{qÈ1"t1Yl艜ӏdwf G͒A)EUr."B9o\o %ʯ y9aHZ Ҡj-zY)ޭ5L윏)n$yb;']zJr8p޻h8L>KQ˺52> un]lvK5]Zs.p* ɬe-HqqLC2A){HXfb\޷M)!@)%Ĩ &Z͵a@̧1Zs{J- *]h]9Eyc Ar^km6fyCE4DU-.by癉ME_r4MBHcvyCm cm T(J-L߂PK&6Am^Hz'޻(( DH, kk-0Ns\ .ZL!ZJ1#Ĩ*JdQj>\rݻw֜x9[ c)i:VFӺ"ڻVЙ3~1 |ؑ&33J-j-1z>5g_ C\.ۼـRŴUlse fXk#NSuYR[CP"ʹX׻،.kΧc}̇!`ms&sCJz3_^^.}dn3ǘPDNlҬk?'SJ//a:u :/ٍZUiK0c!餠="Ma(Y&{{䤔8!Z)_LMkQd.K)Y'IDw7W֚y4'3#;x&V8M6`j˵Rb4[=S!xPڭ."H,JĹ-;u9˲9 }0n2/4N^/˵v) uzxQRc :GvwHXkAD$4Z<#[9{η.;@talVr^M(ED9i]i}4{#sldawVk!V[7:!b Zmyg Ҳ,7wr)@*fW0)2՚̽uLonc `UU3\MEeYXt9- b͎ϒlgM>zFD)F,xSJjW7f,lF}ݥ7^JA# ,ӈ8m RJ&A[esj4fsޱ8dJ 7Z6n:6Zf>Oz4ĔfR"~ZgwӒVk>/tvI_{ۀ C 1ډ晉pW_}y/rކ1輯Z޻ !f"n7ޚ1X5;_v>=?.Kr<"M{o&Uj6xx `&#jm//GR &`J)slC) wrgS7}u6R/@kk1A5@i2U Ĕvr."= /g[c!֚K6ʎ QUaP l)6;>c?||msF,m+X[3f}1&v AyȪb;t [^n nYi]WD4މ^ 3Ȳ,dcDuR%CAD-_zPּ̎zmvwaC%jWHx<dmVh天eMM[ieZmJ Q1ptez-yng iAZ^3st:q)+\Zͦ8ǢRri [hZLa:B$Y2{c"=(vZz&HrOKh+(Gr;bZnX ÔR"fS(*䒟_ *{&vsd 91)Z VM)?jf_VƘI>9ӏRq8E8 OO/:q"FU!,+jLEZ .&n*; KØR5^<pYu]߿Rrm-˺極b̹LصVpYה00 4$#pHɊp3DDriClk]2/1*xF1Ua-D2`iyv anniD6ۺTD"V5&JzNӔbktA$DY iH`RJ%g=xO~L)h)Vw5D?W5 0)?{C_J%;.Z50ֹ <7ʇ kUUٜyαZ^/W#E;ہ?9_k"}G1]jθг608Nm(!*E4l̃sD+;s>s]ngaB(җeq߽{pMD!.RK}w}>e*\kp8M)1V,D C꽛-ຮl/Ď+M@ښ̟mhd{?fh>ʄV;zW4Vs^k)&$ò1xo0MӲ]d+mtڥ\4(z$Rs_׵Dxj݇Y4\zwjђKl hy jӌo"U+L,s1 λmy^ jhT\kuaj\!;ڦқx:r)2nnZi !ޮWswFADp'|)!͸ꜻ/6`l|J+|~ ƌx'Z狨/%V|aZ _/הa:X8ƑykƔR:\Ẑ4zv w.bnAL2Ҝx6^hZ oF"ݝM QJw6M+ua0ݛq8ޜ1r魙PzvZj ـ:2S}v.!D">ymniLaDJ"].WS9s)1%vDJ6%/Bmby9įpT*K6{o@y]ELnDR<`!"^ 0&kЇi(bwTy%fq)Ur).>N[R|~~)#E`Vw `#`Fb""y8Zzk 1zlr,,r)hviRbrh^^bw[ofzZ\Dbb6,DY}tS3jCt RSf³U;Dud@R\VlxчR1-[:;ئxeݮp8NmGP@geYz#|>R-P:s`[~SP>&緭MιVr<M8Iv6y>4t[G^T ~齯yKdxiRG"f|5b*Bzz~2J`̊f#'"JХŘa0ΊeLsk*hAȲk^SJyY^kk1u^<9]ɻiDzmTޚ>o0: S`(3#朋9v+8Ő!m197ϳpX~8Lfd+IVhпTv3k^b!3l`/ҀS *`v s&6gz5 40V ICQ8{AzJ)D`o]kr-.={x8[pdbGĵUvNTw\K)\kEz߆6ѕZw)Ɣݲƈ~mØa`ǭZ59kcKݬ5=.sm^PZk^+Z[MB7Zj֌"3&~YSkv{!\0bhemg6" *jf͟Vٞ (8DŽZ%#!"t47:BB@Jdpe];.&8jk]E G"kdٹmbb`+Db4ͥjnzjÉh@q]nF-ޅCJ۬L*}]d,816͐ZK{ua]zո81D瘙jD$ڍ`VQf4^[kߛb4<>>Xuk}YR44Yo||$blk.="3< ibD@b\K-ܕݦHAٹ.EL jܘGTb6 ,Jޤ20ajmOJc!Rݻ\˙߿ܶ¥NjWbrZ[Ť ]h6 f; tdr˺Z dh"^od+Ky]s$6c͎N'ȰBp {W3 ؋nHS1/"0mfvHvNo4xh]sٔZ[_Iofj76 wl'v6hv>2{s^op<k-˼ {yyIiY5j 8Ƙxr]p8af,RM{pz BcMOw&FuYZlBfPa:[Z" H6' "$6;C1Y}aP(n vd`6b7>Fb S$fM5]bVS"*[mw벍@7!4_EEEmK#m@lK7KIL@mdl8Cd;)[-dǭݮ }#lAzMbC7أHD 6s` >L H# Zm[VU1 mVtS%TjF ˲tZl"[f6&lrj}B@Tøm溮]ksί@=0 ĩ{[.K.f^M_ĵU[j bmot;6Zs1GTL@M`ڶ-U9ZU\J5F!7&2vg^jUՏ?,,j)D5"1қqS:w޽Ob 8jmlFv0? g0im$b X hҭmRmDQm+ PU{'[pO۫ s0&[QԜ1FTj^Cb2 3˺Jmp<zqaHrr9e]9ȄzηyN1|OO z013(\Bj6׻8B.,V邨4fRM B>$sθM"^D1yYJ˸m=jo z )Ƨg;"j&$[ޚ(1nZǡ$OZj If~>[ݦfܱ{xxTyYJ1zIip-)A7gSRz쐝I5d cFX*rNqr 3ךw%4*Ao=V+I)$d LZmaev1&[fhޛ~{g+maJ-6y8Lfj!b@g_j&6eqĨ'"bǖz8L8Nϗsb9)i ~yKm=h֬s< 3b]=<NGT0L)Jl"\W9p˚!o6f,G9o fZg o>qr)uj/ƼFBMjwɔcD5*zfի5\r fk2Vg+L01.&ed7d'm͞RnPk޹.խ.@'V\>.b٥KkL(i-izȆZoybٲd 蜳$P[)ڼ,&j[ke]MjMiMeaPȥX^s6C,s5dԸsǏO۠c^ iqm{||@$TJ.xgm.x}Hi0e[#Z2k둀[5KU [Mr8)EV}ڤ4NλcɥfC08k6[iH "BZ̴!3漷Дf%L\XKie6FbIAcLj e#˲,t׫ a_}^lufp3Ҡ!kmE7}F7%Fcd#<0I콛R9g5͂4Mm2RF 4r9:熔J)M Vy6:TE)QJ1NEzm66D|>nF.(*۵STZVgHqެ+;oDfCD0 l3اUaJC~UIؖ[9)2{u64:Bfs0Um؉H6{WCI0hv\[eCm)Z3&,|#TٱqޙsvzgmEfq{\lR[@ȶI[05Q1`SKC}uofrED8V[moN\KkM6hqhY6_oLCl`e]vNO;cUp<_m|p$ڢ:4=N!벮 ` ՆBlE#vy$9bnm$`TAE1!;o1aqYfVk@EoY aB5obc4BsVPSiSobºfDT!Y0!Z~s2/zgr^W]k%;khZ+jzP߽{wƝMcmvR֚sm-˫ۖW̗s7C]oZ eFZcdsHE K[ZeQj`L//gOD^*\oWx]VQ-Q6y;ķyҲ,1E|J ([< p1C:! lQZk&rC0·ҼO[!Z󼡷VDLuݺd>Rfk6{ath?g; :G̃f"{yΥ0[dbD༏2 )E[6]e[8iYNإ|.y9wg&#"88Nܣ,Z)0js )Ժg[$JuR]ַb&oBlת0D>b09<2yE$Q!%CR!f`@*mqSEQ-5#wd-2+c7 0(lB\V"{Αl kt=1$j4̇jͫC9E@|~~y5R2"lSU&VbG,yOe`SV.|<;|~laּ"|qI6_mɠc:9qzlֺ !!rg_4 K.ސd;3)tyF&} ]*6#Y?"6Ee.%Ws/[aJD̳v[oovڬ//DdbȜWD&d+?rHNl벤dN<&їs|;flb|zہ7Cݪ&![_6ym6lmpDH1̕!e &j+|(*+D&Ri捠r"t>q_J&aH) b&d Vk^չ|@E(X,'.)[IfsVt=Od\'d;7CvCλn!nZ +2afg~ʹZ֜km4جͰC 1뗗AZ~YR18$ &USfKhKmBDzM']=kkBYP>$#Ŗ?B0o>FI3b!iKԸ Ht&2In]pl攝L5}ڙ)9ཟ[&^.W{Q1R[oz]9t@fښͦC6׶gۖ7 )yVl̪UdPaW>cCU֎!DFV{T췆`KضM)YնY4e^u^o4pQku:L": )S $O=q+Lh2=p>_Bǔs2Zc4L\e9#8CD;!-)e5cm6q Y/E`&EavC H[Wp\yg#ZJPLzk۲;RlB)4ϳkm+#/>̇H1˼+B~3>޻u]͹πRGÂf:hfq6gu""޻ahXcu]DPKzl1s14M///|:Yzc4&1kT7dnT x? h Dݿئ=BQ[1 _T\v+w>G2 ӽMKmAUPzß?B 6[ٱ-]pqy\Z?3s\n"-Fޟy)f.` /Ud134M"[WH[PJqV H0оoe^r^w痗s.j39v)%})F$DYؐ|3Ɋl):ZH?L<_qbv^"55ok)BSa)"aWvEFZСVE[$RPQzx{E_ABUp*~/r燇6'*LB0~Ŕ]s.4ڗ֬]J3+u_(Q{#"܌eH`èؽSm'7{DݼnNBpæPOwߗ $,`NWmL'[| M1~SheM!n_"BQD[GmךR ꖨm_>9F>>tVVPf!ll2EUq2om=SFr&ơuˇTuYfs,x9?nogzǺY[ 9>+#z@p[;`l+^n IdDmj@[ sΆBme!R}ntvqk9?Sa3^Uj&)z8.,Viޛ7׿'Gw hV~^e=jE@{*"ߑHHlt{uoc{ݻ+o"n~+;xotpώ`{^cb{ Y 5(\^-Zi{ڣHhQ$2"!*hڷ| vjh0b$aXw@ږݻ(k4܏ 1ceIeܟ , <O;G0WD<EeUi:NLt %&U":RHẈ f\V(}PfUk9O~;8s@wFX{D#D6Ieqbs48emF{篷kzn\<fnY,w?ߢ=NVz tCp4ng*8'{V7n `Se/VgVd:| #E7Vgm퀖0D"/q]W dǭjJÐzU\)RAER!߻8Jཨ9Sfb[ԔLإѺdQ%*3߹WĐ^v=a[F^̾E̷ anևlS{С=ga a-m]!$f-nwİ&7)n/sm.3+!7`J}vphuoO#֯ܿ5mnZ7? h҃(DQ-]/o4^.==О"vӞ,^~Md}5tvC=i2-7X>]3>sp8̈́/>;fXy]c>nWgd*hˁm}6q}㒈emZ4~ι>̲/&ӷ*!00)R=fMLN 9bn0CWu]z536P;F1^ob-Owc!`:} m ; &Q+NӘ.io5{ݿ|FwvLaF޹.wO "!oI|ޥYgԦhU<#Ԣ{QQ !'H׬ik1vv6П㞞 a!oh=zXw떁d ~?sڪtzޛEѶmmt̹Kkp8Nx]c&5^ ѦyF@VJ[F!_k͹ؠ"/ٍX-{Ah٬ѶHرt*SJf=hqbR1m^ B;?s-F/*Һf:Ͽco!oqګ7VB+Gjq&u noZqG Zv 7Eߴ )TE[OUOmNVUyw&b!;وzƬ6kڇTb+8i5ÏR0$nyB0oYU&Gb' P}>vP',"Z8r r a Gr{Sow̽t~Wv㱭)7/\isay/=[_BU}C\BE{ĻB  hSLư,QPǽxr/|Vk-V[;_m! H4~pU[Érٍ-;Uhzi?l^k hG^X2vvM$j=AtemK iEӀOXk^ոj6 Dh_jJ !%gP6fS= e$@BMl;%& oONS5νhUxľhO¦Zo;|#Ymw^SKt{{NoxUh=>r(4=}vDQ] ?[V?@WF~sψMUt=m]d\ 4ܩM[D ߼F̽7;/R"vlwEo_OAo>ةf{>p{";Ы#Aacj)1q?7Db<]6mvΕZD1oKiO`KPLg3_qLf`K޻.޻|Uk{?6h"D4v(lSgޱIx:bF-IG0si\J'm6/ga5~`|ZrLh{{e?{vmU6@WAw!=ӧa6J1҆&^{J{f4P0yXk&#C7Ϛ= ( HжX>1R}oݱoy1-wS{_۷Mo%؁2oG>xPo=.t~` +$;= Wܦar7e#}(#_e ľ{>7haΜWB:nuU⹳8~ ڑAFAa6Ѳ[7OȝVioH[ ka'ͨ;Krqih e}1

mՎiYc]̢GEǜׇcZvCEUTvUB\9qYm'^T1ι6f$pkL'?eb2][ngYj|C@vtDB)ȉl;NmQdDKY}4m߽{WJ^o9@p'lx]}_6^:Ş{xK s;;<=xSڮ_p6!pa`]1' !bOokjObl֥⼫Rsm|g\#n$HLL,)>ސcײ)ڳ)'hśw = B@`lvWNmy=I3C$,jwoD{=NYtt^V 8宣ߛ==M7tMc άV*;95 V;;x oMP5 )Z{Pv@&F {7׶9RW]~IځbD?~>blX%4ő`EGƟ3o& 1lޙQUzVDTv8Tv#;[bd>h$k&KNRWc[mQ5&fp&"f,٦bf ,ȉȱO)ZCp9[|̎7ߔBfc־FvO_?wX}F7Zyc|;aFJ{&po"&q R{°ll:?{"9#A;d W ^MV1 ThWl0@m Ĕl֦γ%jAئ$b";fl~LVV7vd oS-n yJtH n#ɍô!Poa/7dtA 7}<t0w>>&ƻ6 30*'esDnS}&E]5 w6w9\} ux=+iBaoHߋ7lnv1 /<=Lx8||Ki4%n~(ҝwDl~)E34>ڈGol !Rz6՛9O~˶eG3#e cU3;ǼȚsmv̈L[kk)aTV4v5w.Kޜ!o_1SAz#F3Z0m}roѶYwHAXuS oz/A.С&߰S5 Dw@.>۽ݹK<x @(o_<DapΛc{ҥG1s}MD53k*Zlsc&D]o^;U^Yͻv-|ӮΧ:1ܕ-i;޻:Uww JžޖwTⵧOz{!Rvߨ- {?I3"_ũ]/ `^5oQCC7*,kwOn/=z7G.vEgFjcbJƐ8LsLÃo[/ }1pM{"l>jFVn60?ooR0|gd} k̽9ުnC$DLR`Hb#76Ŧ!*?OE8lfDH1hM "!]U {g??|2.Q9d ޼Zk3S˖Ճ1f,˲!@uvՒ&RyD!&Ŏ.(djӔ1MQ H)EO)_ 0 ds:6ZPK)XcSތBT笵f]cQ7= j51)my|Z@9&VRU؞r`_~ko>ƂZilҦ:MHm LMQ;tY0tFlSo/Ӑ_~[?{S:.@UE9k0"Pe*VJYJETϞG Pkz ߿uOwwl6ev֓Kzpg+6)KC7mH@{**Gk`0h[hs<ԭݮNARY]؃++R;'}7N\IS ﮫeQwa!>ҬC(fpi%3m)a|~]OdN^9~hxG1vlt ucl##~WGs_1.˲2B1RoZs+9Ec,V$R1!(eOiyюlSAy3`@J@Jɯx7ȪZw~03ZB!$D^%:1@h/`]㺮#-EVDo<,~ћV%^3=ǹ=Թt(vu0i A=m2"w}qTYn!D7WpN`m@{JZe{.D'z>Ri$y@DInN$R9;笳.˲jb-{H)"U~/r| uz:9!M77lxr7ۏϚe{f\ݾp턃{a'n^zωt tԛZ"خ+ewKfXwX}>Џ"ʱMݯclNc Р]֑$koȦ6DUnnoDcrmwfOЯ41~Q@;E9V>B(!55x-׻_n ߿w"fOWLĸjX"BƩgK#.o0 c oa9hau%yC\B5dbYhHMQ4:7 .&Z9R)k)EZ.Z44)*X^*SBAvDû s,D/ a󗒑j{}ˏm;ؼ<|hxmA۾M܉)ͻST_wvBux0a-!uYhc6=T?ics ;bK7ߏ]G>ܞX; k_B;CC|WXFcܔ:-'dkp$2U3t?%7V@m<tQ/5ƎM[yd.|jbz@jg Ҏ ccLc #[t]U9Qe5^RtTrc\Wh-r\ /뚋Ɛqt_R( È^1w|Ƿ hJRL)t%)E朙xlJAg;S1Rh:M9t _A[VcwCzo`N]{m ט5!=moH ڦ6g;6 m0O3]˹3l\s7$64\oamRHey !" YE>kIan?-E(%c[Ͼ?">NMy/ǑMѭreicj#6r4"hu[ Έ.|O cw jfabmSֿ؍(v~8ýX-rឳFSg>v$||gmF U(Q*lBӎrt' P;N}ңy;#E4 tHjnX[X̼QH_ztֱ%Ҳ.Mb7q6ƇU"dbsffBCh1&d߼ym1T})yFBdXk(w` 1TDVknsnq9u9"ZIAD^__yȮ//1F$㟗/\3k4!{HjWZnxtPujdc+X6O|k/F]%WZ8]lĴ>b6Ymh}:J)T`uh8߲bJd("'7v@Qpk[csnñhTnwM#fΈ~̮m6A۵k[{z{&pmI d?V5. p󩶥^*-n XH/Z tsvYR?$[mGlZq1kߔ;6wTh AR>&9%[YmLB=Gy{7n߀[tZ1СMЌo>ѿ?߯Iyl 3F ds1Raf97ϋ*Eb5K1lJ]ԱO њ:sГJ$+[kvԀ@h*)Vcek9 Uak~]Xix\k !OR\.,?yei{-n4c PH;Q邚3p?.nNPVLͷ`W2|>ؼIzpvMo.M)K`s{W(zaYK¨ۤ5e!Zqbͥ "F \݃?0< >ҡ$6]Km_HOS*>kM'Y= *n]i7{] y w4Sjh]wC=Z 82B N>[Em* 4\]f9l?,Al/Rw_vwJ&PRMAz4_仱(nR3NSwâ3DuЙghxvNض;p"?c ^D !i 5TdZt:fc{KN|.kvN<^חSIy `y||)HT}s*5%%+#B Dl6Bc[ l[""1ƒ˲"{g !nc_ޟ_hX_:. T.pwCvnK`w$h ir(;%VV wԇ,W+T@m%D;G /ݪ_~3@4~}**m{D g, :?Oᛦnk[&}flvR xȇ .m}?cP?Pn[ڍqJ (NWm$vT;q^Nt=~ d e/.dizWOr; fhE>6j[7vZ6ڃ & oE:!txD:BxhE!pc&ٶwrjaڨ 7M qpJvhτs?V~O,S!!;N5FjGbkICt> 8Mu5p!2//!qJݙB"UC)UF9<Ӳ9u]mgER*c>b~{o߽=M4 ?_Ѭr<h?#'>;8LHjwcWY#ִnSܪxG[a7EkG^.mQYR| %c;F? 3Y+HSm+sZ{_?.o/4FURtc4v1ig um\\ ~r(&r}:,.)ߖfv7~a!ƃcl<w Atxom(p@Γ^*G÷{\/7N3{v =>\6_ux16"~*s3kc>Yp ZU)mHp7sVOlϏ6 77ǻj)aqX0CJ9匤MIVJ)4H`]9˼,4KXחV8NZAʹ8gIZ&\s @5TJ9Ǒ@1ZYD*"՘;qf#P"iRuZpy1\rJ_o]oݞs4ֿHr? 7#U pwP @uCmuhao)2 rg2`-(J Uh@ |afR(EVQ_ʉ (kJ͵֔SΥVQϾ~Te8]M:WU{p/kɕNIiZipWY|prcK".]C qo>6 K+,[Hg5â;_ 7Ni5sku ^;zi m;\޿ lqSQ$u(tI׳MJgjCƳ%FtMSeb{ DnGe4nt~cIsa}ܯU״ ;RY"vJk?~^- ֗ykLJi)KQCe]_+Wj}|x8'uYͷb-kYn̬aQJ9g/1E*icJ+"UdaY#͘Q-BjjLc D4֜N眳s^@r.8zc|c*)|8~S$~+aƣdjNŵnqunv^f+lCmtmn= 4Jj1Ƀюqc&=1a-)ߋzh9GwhjDm絻tS8}l$dh7.:@,y :ĜRZWkA%dݼ Bv )%guNk05N%K)8eL{z%rJ9\ʱCR34M4ϳF1(U$FTH"HB9)߮as{e;]'KƃR~)M@i#1voCTI dAhtqWMCW ;7 ١#lvWhi3}ioT1"1 K6ZCSJD_CcMe'%-` kHǿ;<CcjSe>}~۔BE%tcvCDj.Or>p|ڻ5A0Jztvʙ ;63䞉TZ hˠO'q5wgi>ݗt7m[9KElhlj i&t%^K4y4K[TQ;MS(tʾbڤJoajrjbQpjEdNH}| 뇽صA;p"'?Gg-1YQb?Ƥ^!z}5K .K1HzTjeb d kp.rL)3v !,s)U[뺦D]º HHĈh Nqt:Yc3ʉy~aW.Sz3o~8_F]{93lSZ{s ӡgt>tvB_>jL>v uY{a6yg7l@@#TBc- ԜKcH)RHְ!J-G"8X?ڳwj7&)`]23MM^-^׽vޓdt/AyG`ZYwr4~]Kl!QcuW tqU`;t,#8/w&)=-m A _oLOJ5kS J9$h$Hc`]J7xٮǯ`Ļb \+~Ŗ0CL9eYR)6J{ަUWJ")B%k(_rAJe6r/}}jBO`WSо9$m_-]KGQ FC#źfPHoOuf*; |mJ龋]:YdQNS ԍW$6eՂ|8;o0u¥##am,5t֊rhV 4BKM6Q<}w*&R@="hv WEx3xHzY߸͐g ~s?lS!D@jQשtHt:O9pޕZyq=\!,OO//9TQ+.SΉqAi<˺Ĕr8\y^Jf 29qKl| H9Rc"UCewV? cL?Oğwz4욶&Ws&޿t/-p@~{^ ~| E@j?Aj-VU^o.9`!U`dk!Zc"ܪ|)sZ`kX")RrLQDs%G6\L /_񁛰KAxF05uL:½Ӳߏ\nk +fS!L4{{ptC Lâ~:aWgO|ͮ=c#˳C߂.jwJ{r|t޺9k<3axxx3 {w:qzf)a%y<kwQ[5<\9l:T6CשnzDMb,sj޲ݹxo9Y~;Rn,1ޅ ;^oi'("i?ﰡLR aƶLH%CRU?S??"]2.X<}h-wAvp;AS9놼tUy)#k^0m!F%jm5r7}[/USy5njCg.ו=^t4?r㠑E}>(ٳP6"2_EV U@jjhfc|RO?O##oqW®ݭLǯ#}VLqIgF<m`pr 8-J?.MZ:";k΃Q:hKaswȚNI8,] r|sR 9b ~㦡{uSݔSS?^GM d5շ1^04HnTQMsGٷJO/r'}7h玕Iߐy:aZ/YDb,sQr^^^ֺu]rNr9{{c2N#Uk<JR2/%e' ZEA!ĔV0ƕ\kCXq޿^x}}|"&#v;kiNfvM[{x/X wqN]hȗt+RDw)ס@EP.f"A\{&˻-6pChQ$hU>.ߜOJ,4Ѿ[7; !j/1O~OFxXsrKb]NZw它nqJ7l|,8ѡQ͟Z; _ܝ;mt6ӎ·)W2jcVԺ/ ;kxq4;;?ڮ9a<;Ck3iL7(aƖ#XvDh蝮x|zÁȝEvjؑԨ2:pv3I`^gtAr@2I홎lx£a2 kXN$ ~ H9k7̤CBXc939hι~8i~_QH8R4F2i꫌墁5Ⱥ.` //}o̙roe-cĝ+ p2( tU;KvqK)\A* Eaod-e_)yU=g?]=ՁkGGE[HT<8r̊b*UjJY"~'wiITmgOCI@ >{W^i,nw3^I>'# fF%۰Nbswsk{46AF YE[0WG`m(}w\wgGٷb}RϨҌxO:lxUop[.a_>QKs// ҹ1iso/;T-Y͂k6])=x$C|ջtH Kp3>~QWA6V2RR>8g:\_˼T|)9$Woi/? {,@o޼yxx0̥wnYWDRe}:8Nt?U[;]cfhN"]hnLz܇o`+ʫE퇍|SP@=:zX; `^,r2b~ ҥk>@r[[7 m8udR5SkAR12C)%ƨO~n?p}O#Iz}l7 G\)rMp|!RKTF-b:AiFЭͱїϻ/0حdf@ѵW:4$t#nPK&9bs.kJ7v.+Z" ܹ*tRوҖE*]'-.,mQZ쉾=[n6^ROsڣ?hM7`vCa_ {B{6* DNv'+Ǹ ۷%TR}v 2J`͘FIl_eja7>xAQ-]i>U9 K}^z76v/1c CGOK^׀m{`z\`gD"Ĵ7a)SOt vO+Pڮ^:1 wXg+àG_O7}7:z>޻q1o+"qt:Ji&Dk4?'8xc 1c!<3W}We)9*{aDK!$sXq:HʾP۫p1iW"#r k{&̀=ѷ[\[&I$:ߧ]ҫ]cic΂ځQn&g*o>z 6']`,]{f !Iپ?? 7Mf)}m/4E{Qf#n!DwoZn^)d+K=w)vܮ:{>ɂ-m J4X-X7P/k AM[.'?}LrqjI4R4nGGlE}w*d>yY޼y㜏)ZcGDmr벊Y>2gˆTSk.aL)XkC˒qUn[KO^_9ŷ>(%Ԝ"D_u?s?&Blr"]yܢ.wھѥ¸+ڐtwI촵o&(a۷K<]Ln :D|O8ϲ v;p@rl۠t\zm#² cO,0T q3O_[itG>I`2n՘Fį*Kh)݃sA]JG|b:(.]PAPFB9"RRJ"u:ᗗZNO""ir.Dr>,%R/˲+OVD?$eϧ3z?k$RǓNNe$$\BXdO:{9f67б&m6#Hi}tnotKV{7) 2&4!@w7OAiSw$5w=l$>.rLM;HA隫1X23"T)b\D)8gcLUbjjF +nڇ{ =2ۨGt%u쉐6-lz*:s`{:[)ܓ+a7 &{oZ<~t_lo}Gtm 5 n[+,{GRZ5ͭÆhO-Me{bKn˱]Xؚۡ8G+׶j $ m  &Y܍mz[s:<-%ȦjL3*0 UvCV4,Pr9O>ynGŽр֦=ff=>vs&[2!CU,@Xu=J'j/si,)hZRj",toqTfЮv7][7.&&gs!f3})笱0R08琀ٰuS$")*ux%*T`Dj%di;{$F݇KYs0qf|KS"}3wʫ%ۆa>b/r7p>v]2u F$ݒ0ﲑm4a ϶7R{L^І$-?) rweˆl[nג#@r,){Z%;(\S{_?k  Hg(?l?ZLԎr-Hn=-fUˇ A%984M$P4H)s2ƄJ)47lOs)/1<{_k1SƬsfsJZtR AΧ3"<<;g߾}#P㏾B\C%yqgPz]+\l-=}K:s*k)% zi`(`PvшA|`??y#0}uɥ8v`FcZ. >AR:ϧys, "~y|M>r[)2Ϸu]:# Rs"CBB+-"ZMLb5%*E 1Fݔ!(ls^j%m꽋[l j!F]j=WBjn*RRmik M %*X?1"xDKc"r:UVkcSJXJѐdu-67Š!LBUj q\BJD~/~~>O}Rҗ4 ~XJݮO oxRUj-x靖cҏt:{uyzz1aZu]RVsQ0Wjx֘R UHꜳ!f$Ui*R @u"JDctN'†ZRKuA 5_֚9LLDBuWW_.?8&k.ϯO)%<&T#!mN1yXJV)Roo|%Ck1lU\kk@`0ԲÅzݩS-#l߇ޝF[BQeDWPn_ @w[} z].HYf~~~9"===}G?'uYKֲ8#,cJZe !ae]Sx1yֽ^"2z%Vyy! G Eݡ7;] L-ygj˦%E+HrЉgd"Cq= j(d)+(t˲R ?54i*x/a%PK5k$( cp9߼}$D W|DiBDオr)Z+ĘnIRDd%fKs%3 5ְb9g@$Zk'۶dx#Id3[M쨖37/Rl-c =K-<^~GιARRJk-Nas8HK뜀" +5!6Fzryf&BDd"*h崆X'fãHUbXe!rvNoJ9;X"df6Dt3ൟ#"RXg5*ɹXk69GL0ƊQ1\>_5Srɥe]ոn|u54K_a]CϷrY[k1\^^V=V-MJMwqk֘5__QXkqܙ?хAKΤ=775hhˏFFK|`>?hݔRqr!#@ec5)k6CQr@s15!fGDf*BʌPJ%D)Rr1F"rnyRlXG!U(e2 9qY~~y.a%k$sJ)^ nR2"4 Y.cסFԝN40"2b*eY*R|JQ?sVeDߗHG{n)h[MJr1n<X/ˌ)Fc|vn18s@R"v?C.yVcLdZRDLDX65@:^#WEacil˽rFsʎz}MnH͙rx<{V LEDFO(q]$ :/|n:(5a8JR+q4Mi<"iҽ[s`XgCBJ%Tj)H]IKfF1ְuK- Q@dnc E n]ʇ@dPvdhҶ`U"E3Dt&}꡺l`DD ?f>roI~|ND$&"̹[Jr͹R)c!Z+3?<!=Un'"֚6݅Z*3RK"_8k5#(>yu]sJJ!D@DeYu'T9YBXe^o/S2MY&:c L8(%Ԝm\Vk8D,K RJ٥LiҞpZss5 CBcoԈ ;Pda"W}bw. B006*ǔI1bn7>BLD5朘i5VZk0o䲮k AZ 鐇K1lqhYpPj!Ԕr-r:M_U_e}y]WkͲ8yK]ta ؐ2;o*[AQ"`JC4P"e@mȹĘ4璈 4 D[SRad& NvSWK-J߬Ue l0dsM]Ue-%YkQ""pxGRTDshh(2`bE"jY7mQzc?WI ZhlYT[46kR{ =W[asabFbLZˤ793R䨹DVDYk\p\uwNIy^m36]8 23\޼yƑ齮(.uXC 〈1y~^s."u-˒kFDOnVCc"Zĺ՘RRNaUd u""Reb)e AO${Yci2RJ8V@ȶvޏ49Da>O~p)yY0㴮4I˺.˪[*RZJa_ΈRK!)y5O4M Vq QFlOȲ,0͇*_&p( #N* iZ$.f@gO(6n5ԝt,,&iS sͣszk|x|8Ny||{,*Ec,@D;cF<"ŔH"M#[Ke'ª{0kLιV?MJY"z|Xwx K7#hJW:GMB7]ݶ6}^q OH9m^הThf*ZjK>O8;GHH: 66Xw:"5k-6zTkRJAJsԢ< j\fU)K؆)Tѭ)--b}v[^l܃8D3Tm]dEADvQ#奜?6:ڡ.˚Liksz4q)en'$Xki4 af `YXa69eCz%5xu& ڎ|kL!4s.E"Ҋsrsʆv T RS)9R-/cy_9Z q*˥VSdK-z@@!&DG@sk)5ƐRRι95Lcqr2Ѳ`vn4!:u s>p}aʆO޿_榋P⃂Y4 ,mQϥs¼ehMyۚZJɉqP'":n: 眖O<~Lha=_o߈@L0Ӹ"Lly75¦X,[zu8Bv8Fcz n:6g+k믷Ȁ믄~?w7oތ㈈1Ŕ2k.t(d"!9˄*t^oH8 LӦfޝNZJe]V$:)c2z˜ra!ms[YrzL,"b | r))†CXu3r vוz_&͐{lRxG,MKs)Ƙژ/~r)xsN 1KZb~Bޟg"ַz^הRLE{wyRDj-s)Dhct {.%炍UJ hc]1dӗv?uKZ;4a.=oY u}B Djzͭ* g{0 S7Eȗf}i)\rZ@YEjYss)9'}S亮􅈈cL(ULxXj5ְ14 m?y^|2/`asz{I3;gs؜sL iD2$"|. o,74RJ01#ŸV"B!yk-v$KsʺJ)2͛79甲sn-˜SAd >V%IXCQ'R7e]y\.}8o[|>ILQ;rfV7l8RkN' 1UDЇX?6I"Y?xZo+YEcZkֻ&_W#87~=IKusG 5;Idlw?fljuNO)Lt keYJT )E"D( Yoְ@J)E XR!L//1ǔzA]T'pw% e(+覷h`w;V {_g~WRkvk4e1$"EvS^ιm[gCDt>ZLۤZk28M"6bIf>ڣZ@睱F:ef䜑8Bȹ !:.U; ͆I:)6+KZ]1/;l~z[L um`/e*<ަ?^)%@rADanڍa 6L^$PO@Jz2 F\oZ+@u]RJdu (1&sΩ8_swq\` pV>)Rr\.l 3O4`@(zn$ 7h,IiT"7~j+,_ KZde*9oIDJ%gxsp~T*EZh/c \mĬ+RB&ut:ZeaBk1/lDA$D)˲UOꜣK-X, z?- `fm $S9</U01u)>peoZdӆߪb>0iDPAKDROӛos1 DuG\'چY>$XJ8tlRVtQk@%*)Ŝrv ]T!VJ1\kp 1TJ*9Rݻ79HM)†R5G/fK"0*^ B@3RRV5M8ge]_X!bcx5!!Z ekkQ%eY)ty4MӴ.˲)ǔ,M1g49cJ Ԉn)`d*89K)yBD_a$BfcՔRuJsy^*kⳟ='m>U)ƜnB5R04,jݻ{}r𰮡i#폺0R7ܷ*@=A-D+"Q,;*1Z1Euo!W|WNӺ!6 -. qՊv>JD@ 1\5K.˲朖e]1m:e*Rj ^᳉ 1&\jRc7_07ahdB.Y&G-a =Qeܴ{GPcU/w^@>/ӌ9M(҉;n-RzVaa a4u AjEDe5csjRhaiàaaRÃ*RΩ"K93auCzcNk!-RKhdc81TkO ks8跀mb6 3@s 2#"0~Ӊj"U) cUrRUsX/1*9?N84/iS*֙DZ(ΞuIԡbn;V< N cJ)낽rJ9"r9"5Ts)&=>SG j\"Ct)4oxJ=< -CN<<<8dYV4ZjI///yk F%s 9 )brmG:Sܴ֬DB6<<ї,oo>8N11,Azb/ ] ¡D5:j`.;O‡w<|C&mcؔ"Ngmy9 Zr^t:ØKqK5!v^A%:bJ9'@+SuP/Rb^װK)5R4Xk[$Dœ7A'""Rna0PZT1vcOMĘRNéoT >ܷ/%i$SHw6+ 4rytCDb"[k>)6/"Rc 0"c:IW$Ub!(|:9}$p9L1"̨JYBHlj̀SFQs)sJ˲VLKڔⲬȘKQ㝝wVJ}xx`f-TTk`a5,<<\<䤦BukdM%뺬KN!&#R9חWbۥ ekt1* Ug-ti }+,p@ Lldq<)ԗ`JWkvcC" 9ιiNS@T^jQ뫀kUD/(/Ho/}IZܬ؀b] 7Qi֫z:'fG@|Rbr.۵t^_^so<cu)&I)A^J)֚5$Û3CUl97Nٽ^5okb""\3ID"ǺXs m,MXK'woyM//8 ~~FDBZĬi_B0MRJ)笪M@LM!LH1%0:EJ)~̪&c Q-4LDD@.9YlU)D (|=DUsP2KH"?$U0fVh垵$!nJM;PF u#VL*O2?¢Z)R~z~lPon`kӲ013=}L)R+ЪT)Ɣ IT)!k㛷-Nөry8мUua裏K֌ֹ :g6iN)leY֔bL֪R\K"LhkLz2Œ kD`]Ŕ){~yV%m s Uu9/, R af !0k(RuӤcN jFWƚ.",Rz&P 4N0 JXrS9D\v˦jH"U@Zg a j֋PDޑwjɭϮ]h+J++XwI1\hp;eP, Ÿ2]o<<ϳ,""o޼iǦ!Y)J:E,q"Ѿ\ȹkr9ßRʲ,%TbCjgo{fuGhL =%#c+3CniٓeA_̟z#_?|պkm)T!;/ku]wbs.F=;HvR91y^4M961mnL9RK'5*j˺ZSʊZ~Icha Rk.j)ŔQcJN)*$B-(2l%#Rmm#,D=Q(tVi3ms=5S˺ \rJucy:nbRX?ȇ Z+m5"UZ5}LۢSO>yrKW}¯DXT)kЯ;R-jS sE]UBD\J?j'mH)ZsH4fVR*DZc AL:$;!̆aP+(~4NSnXgUV9C\y/)'c4Mc1ޮeZb[i8 )&s.!Du5!r-_SJ*2LD8 NGYc60xccs>kTΊ V&gOXmY&^u? GⱦPn!kX^qxZr9/j`=(xc);4<'PN P )o,&ַTSs@-a"S"*9Z5 Qq1Zy2K?U1DzSJ'ӆmFOi=A;YMK=@@{6cX#3=<>x?0>ޭ!RL8M88Rs.EyYKk΅!sx1D@pfɬkPwoN{k-5Ƽ,QFgG"YYKe_6j+JV &?? =1ZcDv}5pY "!au] i bPsәwkAc9eYg Z/q40vNڕ&ܢP9c ؍rykuz;N3$(%뱮ՍJ-lX Gu5-Ynk`g(đ u3\@ kkꝯ"HGذNcfGTrxTY0S)\2 c ƘK)Xk|~qCJS2D)]|"J.ټ ˝]UX(W@tΎR\׵t>]"RJJ)z7u ^^_uQb$D[Dka0xIuZbk9*@PjA b9mˏ)EgQobRaNι4c)2N#x? I J)Vԣfփ T?͆1u NHDP(rZw$R>/kdܻezՎ*M8iML+9l =?=眭u)}GIs)gki^mN95RQ)0wQ=_7v%V / m3g|:}ry;am!ZFz#mڞ"Z@3i# fjz2C?+2%~.K)]oWAq0ƤCm1 i`o-V鲛3V oED ` 8QYe$4r*2 U)a^R @1#"kMq] ?g*(Cmjר!t=3/4 4m2݁lKh Zg>GcΥlqs#椿⽳mAHseCI)u<) |>kS2\tyXaR:NV51K]rT:@/$w]tc.K6X?()5޹a벮ƘZsNDh5JYbD KZtsN9#8M^-: $Md;,ZkYנB-RsN9< @)eW]—R~xOOOa51muB-կ416I"F !h5D!< C[DQ+irHR56j]E庉-a eIDXK-kRnt [;M Z/WB@#"br7֖\j͊';+,U$p:O%eXgնBHƐU\8zesL9=-wrI۴JML,Df k*Ry_KD!B&N c>/_*}S7_oOk4Sjڀv'i{Z:XKrJMUs:s&Z+ƠPU̹KXSܙEa(c~ޕu.i9HְηEN*`\jkX9rގicKO7sj|Dn9eד\=dXZ}oڦ{ ,K1)럈JE%眈P//TE*7iMãBQ*YǽJRA9 tRK٤SkIځ6 t˲L) bTTw1:).;yU\7pػv랞QZ:nۖ$Ey)'ˈkb*S,MBDaYcE8m\rXC):fkK)'4ABpn5!,֔RAW2@QjS.뺬2` k 1\.yzKv #1k]. qt{]j癙RJ!D@Yְ9ZnDjl˹jb.j:knA(9!t:cL)ĄU$ĤrP כr7C)55BĨƔR)(@fh'.Mٰ1B6 f"6TSY [z&䜐0Պ6[v1Ŀ1l1y*PE t[ ;Yp Jj}M(",M7O--Zl] +t>}X^!&]9O///)9$-u `Kb9p7o08"u. t?,ȍ ~V[Ԗ$F[Zc B~3ld;3a[jQoζ#a&}jR!\6).%*H.Ffs-rҕFI`cr)E}RT{) R+3ƪqX_*Œ)Z|JI]mWsE(%dP2g#6yhu\BkK\]-~ocm A$6VYw1sZ*Ψ @j 1RW=Er)dԕ^:/"&iwJEZ|rz" (%+H%f5hɹĤϔº9ĸ. 3a___sژ_5PR AYc8XKUN)%=y_r!T6r4Z3ÌDZ 6(V%Sls#(-BP}yJioS\Z[4&l|>OH9e@ݑ9cȼlªmn Y "9gLU6#[!,&y4 hnDJo$2mQ{( dHRZ-DpJHUm* UthX;>ŘRVg9? %'k !(;{s^mo痗=$Eݍ~wYs)^ ަkՠZ$$r@RNv[a3ɹ6m oThLw#Z֓nXEL5ڻoRSE8M@XL1CCDqxdcV.j)ɩѝ`&U/S\W纍Gb*uuUk!yPgv>^./R8N* )N4 DK!!:x}}) ,}ƕ!`ՄRKYC*%01ۜbH:1&V!b&2}(B϶ '3YZL0 UjQϺQó s6b *" YTg , @nff@Ze6GIk],\LZT" AJ$1lb ̬q*g81 {:J)eb ι SNiX[Ű>DؒlwtA=؎=G{{R=X#R!sԼcXW:1Z% R5D6F)E!K HzF|)t>_iŘtCXH}ORLMI/(SFi)E!Tn!ƆTRa !bwZ W͙Ud3gϒey'=~3##皁P H [APfjI/zПGH~$k$#D(朧~ZzXxDVGEDfވg5|[i?sJ<iL{k-MH腶ZCy]xhXj>SZ֔I`7JBk)VѾ@uY)afCk`uִ'ēȧ@"ťg{BT]`99)).֪FqYD)uY]v]o]My{CHؚ84'k;yX6$vc5/൑I`C`Op5p>rn?/T;"z[C~s}ӈElO)zV41xmruL10Skut7Y3kM;n\VSqʅC XMA7o󆨍Ad0yvtʀOiH=mon.!H&0)OC"tZՕR0@t4&!Z+SYK>3{owg-"]9Tux3~-6/CNgaq1Sf«`FWPj!bOn5kV(ukV=Eb*hu-9d(ҫVS,˔'POu `uY]gCI:ڐaYnbg UHiM)ĈCa!.]R!3Er\F36>b WhaMS6V6-#Mm@ ?}ENgWzV#̷J4)*xr]E[o5bJɗ ÑZoneb'jk 㡵z\r?; f˲VkMHie! x{<c 4M5w3S0N|RS$2Գ tim0B!{e]j1&f~K 19> T:sPUbplL tXR*"e-{wY);9arL{z:oٲ|[ォNSJ1"t3ܲdHDU%'pk Pj-*;9_"g Jx$D(Joߕ׈@nW'COxp>MwZ꼛^Dx\b@.jjn]9{Nkc>;;+)#uu{fE1UKHBOd6 jHhbfl58yS k ݣ 1億۲,e}x W6LiF4ŕZ!K̴/./Cyj~R@SN벦}&S݃)Yws E־!7o|SQ59fQebq`"1 ;*r蔽9=km+p-˯gՉ]~{!R.ެjJc}B .nr^|q˗W:Sz3bQ=vγ[p\-H@$!FU9"b cJHٻRḧ;exf^Yw! 'S ږf"s#1jIr@&y#yRTO?ft94M*b`RR ҫ'n)Z~]mݟ=]q;9߱Bf[BL>}o*eR*n0_B5FRJ5'>eɃ6Mz^EzY_P_NziPA"38W[S{x% w|8Ԫڏǣswn7&7>"6Zza]}&&]HHBND$$^ #p6ϳt-fХʝخ1 0aO"]N KQ4'ƞ ׿a t>-WK7{ -oMiwss;师jCӔnooa_RCPk+4ZV&ިb1x$CEDp{PSD@tbZ)CbJNSpzM}A B~eQ3Xһ ݻww]JzLy'$1 s]OL"ښ3(e%y!FT=F*!0 Ŕ(1EtKH )KKG<ϻ_1MyJt;^uDɚ'6f~>l#M6~Uơo.s_xԻk?F9Y`(kiUup8...%]nnonnnb 9g`"׵ zbJgwvkRe\e1RZid4ww{>1n)TRK5ͻ =K݃|KY< }12}p21VWaD߆]!sssU-l!4rѷHXK]֣w6ZkL bdQ_ g{O@s3Q97_ @Rmyvܡ7LC QBN)c[:k )&7OfvNtRrN)w>Cu&[ߴΥ8Z@`}C8Wڠ_拪zZjhJ2015@ {%]QmpXBZjk@K)?y&ykgg策H̭ib]r>AR+"^__9:%m7Az <@[ƈ )3^ |ObGÈ&J^.-`g=/w.vʊQYՖu !2s݉c!i @[+: Ly1Zj"BGD" 7ɹSy)ƜnooГݻkUmBcR "" Zo[`Vt%@Ԥ6e浔γs9݌Tnn@+q85/Hhq=o" d阙0ie]=s)H4QQL-转!x4///bH 2AU։Ɋ4ovY:??nSzt4ͽ=`BD( !+PwUG?AӍh0ɫd1DQiN.=nsJ1ZjrTKOUDwD,]r<0qO' Z! 3IDeYV".0M\ʿ33wT4MC)C”'N *&ZDGZ={`DbZ0"]^l诳5m e0Έ #1Lelѫޛ;k^'!ޛ;lJ)xT 0X !m?]1#[gj몮&j)ՅNMn?c]`朓tik)]ģD3xʡbD[c';E1 99g`GL!!( KO1;b|ٔRsvTÜiڹ(KY}NQZf`<@m]T`P7>y=1 ;KfCFgs2F1׶ڧ" SN4_Usa3r1ebViʞhR%HnYr֞[>e]>sXr d)O3u,kFCat#R 1ƨ1ۭªxaO49E a/{yK-Ltn'D6 ^P760^\ŗWW/ 3y)ޑsHb^U=x\|6.?ZkQ0.lGOj G|> 611RERJ./ۥu9!Lk'b  oB 昒}RkknbP35nnص!r}'jD,bc?*WWȎ0 c|NBՐl]GlV||vvSyrH )1ǔ{'7AdVvk !8[ZWoRJGEtkܲo30S "bF `0l[\W" P 2ALA&=Mm^ )A*iJi^O9;E{)RH(lsv84H<B<0wXN@Wp k0|ҟlt+ƒA|Iқ1Ӳ,˲F|! CZKk1u]EwP<qMֵ̡f뺄Sr{]_ף2k$Ħ~">CH)}y$ywQp۰]Ě0.t3Fʟj8>_e DWVS  3ֈxGC55VAAMQ f kʔnn?;&/!\\EJg>9u-DV2~>j6GZyvv7GnH!D6%GSͬԣu`~wޛg.}]UkY}{`ewVGC1᫭@x-!:#چ=?\d1O@}v$$qh0"s"q9>[[8nncߩJG#O[͍oG =|9'&rXpZ9Z&ϠbإkU0pkM\oA{e-K%1`^鲮Ν9;cv1e9l`ʓHj-"RUu""3sby7W%N03Z)NDTKeYC S΁p]ݼQ=ʿN,pX˺.y4QTXk C`D=)ŔҲ.m!@G6aOr` nhgDC`Uǁ~UGҩx%᭮ͭk=|fw%R"~yr˲"ÇֵSk{_}n|YkM)sJ///nPJ{fwu-9qQ>1f o\x;Z`1'm8.m}chn@hՆr`\Ld!֭nfngC° Lm'@8nǃl;7w9[f*r:]L_l]ה兙IfR<7"=kku 3cfF ?`[kuQ-͠?;#|D777?ZV{"e21}}\O !c(6m3O v*U* i/~ϊ>ݑ2.]}4L50r׏55)bkՊ.  dŪHI vA4"ѼzGUNHJ5DDu] 4v^5խz#E$ 1ETj!Fs8_TʘZ8D|[p+Sژ`"5ԻAΓeK)y/V@z;ۗ!Zj%n9 ZoR>"r'tnU񰨊IE1g# zx>Sv_"@!RIEKӔSJ}+A5橐Z)Svl|Y6c  iS˄N(+8ذ(P9p^1&g>˺,K,V[m =c뺪ϑ<k^s Mj??xyՖRh/zED><.ݼ"/^| :bGEϠĹ~z_oTwℰ(~cGcqr[jP66WdbCp*" n4^{K9gu]Qn AMcz4%x8܆<2,j)eYCL}&ݏ+8V0aL!RZ SpJ9u@.@n~?/c^&#mo7-( Hh&7zq5mD I 7sdِm\$5bv] xu<uκ@C8\^?""ҔwylS39ZuP#]Ze-\9Y>~|vwOHdNN60In%J\Ui"8E;"ϻ>|4L*PQA׼\90HhdZי"K1𵰄u`bPkAD&x򺮁i.3 9lu\8견)EֺYUK)R !l&d )zD6n#߬HCZW"!BL01U !󼮅(R.pwKJ)nnn#WAQ_=tW5t3w@vQAΝ 'xw;.Khǁ,KOSF""!$1Z) 3A>"sA[ch]K@DaT8``'dFO)߱j3ʍ_+ٕ38)ɶ"\DD=)'w/Rj%"L^[D^Ts'j1VjZI'MIB8U׌;o\0G53gv;e] 6ɓ2<>1&9ÕyYޭ7ڑ#cUzk>3qF%g_>:S9}xFV^@6!J[,}V 0{SkMLMjo`oME7SbLy)iʏ|~y q{\1M9GEAE٩[m#B-m=qiJ+{orX]RK-EL1=xGFhgݳf @yT} \nǁld[zۥPHlD jt\9g3x 1$ND1R wJ8pف̈޹ Bfj)'朼 I1yJ~[zK9h4fnhu")O 8Ske3fFg6lD* a3{"X|&wdHV6Ui FjfuSDW.lVUO@6.9Oa̖uqM[kXRJrZ<=B)`TUo.&%) G`&כe<4D,[ZiZZkjN1bJV[ޛs}a߯eJȴ `p^j9%uHRC/OO Oh:5Z0D~/oZ{@E]ܻߑcxb06Qi?yPbN;ӣ~;|n<<%J?wQKХ>c8&ji=Ud=Ͼ~e9,ǛXֲv>Zڝ>L\ʊ9fQ_#i@ t$$3{a7lbfTJ]rc-YF ha j ̑< I0B_c)RQ4uM);wp1֪K{~iY1[}rRZ1E]e1R[@D^DT]v2;ާD=j4nWk5yZyJ0tk9m3 Z>0*0-Jn9o&6K\ZSJ1|T] pEDH)!4~w<SʵJ@."QaػĈvhyT4G"<|9M4nV"B7k3Y.SQڛ kf 0! X3$xE-<œx{엟&ǫQ8[Njn@4ҔcUrt.3tqp4Q bUDgHNjPz~qSQ" !{ 9g9$'Y`ߦ1bsxȢ&j VJQbLí8Ueߩh݃ ۅ)ۛ},^/RiPUmЁ,HL&Xqp<3TtY÷Dk-M90C:8qnUH(330>F+bVpOvPU:x*ۯ:r3z3oypxz4Oꗺj7C"K9\yZ)esÉ5'UDsFiP{u`I)Xr.:!yiʁeuD8P*ZU_, .l`˺2j]v\[mr ֚}zXQDS !0qm6wݓW^=JFzvXVu,6,/EqoV fSupx~UM^cis, U%B?mC/n^b~wqѻwۛO_|Ϟ?{!^ a>߿$C0?bs(#ZLar>/`b>U(Y6RJ;]_n'+V-uY8qD45Lh͆:Ye)yDZ灉T"H$;yq-e]Vf1~C J){ >SUDuQRkmnwn*LUG8q|8 `~UDnEOrW1l#Aҩ45oCC\dED}j4k18"c H(Āua\\k/uCL;3u]UMD[W$ޜyMz2YMeuM}?R*s އQMѳ'"՗ R{9IX>p¿ۨp%/N3J+`W_"9O9;޽7 GPka7Ɓu0i+G 1O"2s{ Ԡ0u! cXc aۗZ}!3u8)vTєSF"U1l~:1b31w&'áđ^eŌ6a1 ȍ'D&UǨC=̗1e9*9%Ќ=QEEi>}#c\eY}?j#nshW"PnyXacsGF48*3@yܶ,14kА1; g [ :LEc^T9}ٯ>|ׇr#{o~l[osIJq6"U#^NHF&U)M|<s !hu n%F@%~qFl{!:D\y|%6OyݥAQˋ/^:E`+rOn]w0<8 r,L#EV7Q4f)R;3Pn:Y n hJ90: EPBy_{0"ERl Ƶ#bJ.JkeԹy)1obRV5u_e>vf3iG4ph_DtKJ3[@ rΥVZ3IrwRℜG92HSf[n\%0M~&Ls(a}2~rEooܿy?#4ӜB^ Q@BBboyl8&7Mv ^9f|bIyHUUFm'nT೔/w{_}_կ<)=ٽݝvw[u]|!!g9Z[|< tin#΁yv!;0Z.r}8he7gh$e9yL0ZVB*l՟V3!YU=nt1B ׵LM)MQ yQu9˲XwM){q1,_$ >m髁0%n#05/z|nө1-lsvw7QZ[JfC8\L9!k,9簮x<8XMUM&S{A-'Z\nKgѲ8Аs@}&`b (neߙ0z .4E nS3"f]4m?hG)qhjJ~YcQ7ֲ̪V>C mLS5gK9"ub_W39kmm]S-n:Z=} fMH"WNCCx#i9@9u4 [+ހw# }m '7|;ۗ.<у{Y 7p\;Dao{?x۲C<lg{0p}h! {WߞDUM9z| Z2"+8s"]޽|Σay}gnmն.뺮r\]0TӔ[oZ9 l" pvqS/C`f"" P-u=SY C#w}p6'_=}œG>_w̗yMkRćÍ+M-{>-"N)pˋcm>M<_B"J0q9/"FC8T`Y"Joش{)aJ6Njcv"@!fs!æw-{S6bq$@4OTU?]iL=T`C~\p;{b덙zoscR `9ZGR4{+0MviȪCoZGm͑`fu_8L{'Z#2 \,ZyۧmZvo޿;޸wq(EC&"siFi' oe-Ͽyq}}7O_*{ZEᛏKӦR41rjow޺݇9Zܽaǵ!?ڌwSqro[op弟_8{J̬Jl5gdÁ4ן_|뛿xL)p|쪇RB Q-e]Z o,Ee]ֲV?i] ާirMoi*rv0"9qnޥk+.8e`Z x쉇yػ"XL^3jg Ļ=Oy!,4coWގ&y@BiiZe9.D\kvR#ZMDEXVl'zޯC#4"$p&{DhjS ̆эܾGT3q*9.bf1[w1^Ԑ@U“'OifoC ˺Ĕb[/Z@[< *<[gp2|ݐ""ǻNtmdԓ?|&%j+ԫu ri(oC)%0("^X0 MC 8O r^C@1Ӵ벬cL9)Ox<ҹ. f5e_HzjYF^"bMl&;nwmO!jFV상27|C@k]ww)'/Zm~rC >_v.~z)_~ՓT^>{qs}xr~vlj8_}\n{v<|g݃,1z9g777h/?ٳ;gw///<+Te9,3z_}w>^k?}qWrv}=a2S0cIZ|E iޙikm\c HgB8R)R AKFC8_|:Z&b26Ƽﮯoqή gaSH6J6xU31|aVćpGoL|)b VJcMS6ڊ)"Ej1~Z/CkZ T{MӲGqy/zƐFSN~pfi]֓pp_)jF䎇j|xx' 1&ﵶFG-UO? SZkURfRKCf626RyG[kҹPԜܤAT]AZERWϞ^y{1f (*cO%*T3w.RU8XJlcpWGJ-3k)ִu+x&_ݻwy7wypǧR~I>,^!%LiJn1nme9./?u;~1ɹ~E4Ŵ'x?wPGrX>'||w9[WW/w?{zΔ[7zlnsN˖6躬79wOx>𽵖4EqYS`1o}Lr0U*C<,H,l_ojݣ;/ՔH^ !RO͔p4.S~Ot 1FNrtb)˲8"p29ZKH){ߏ ̼3TKwsp5u-O9ZIhS˖0K31td375#9 Y7ZܦHsFKr"z06 2肄4 {wIDUDL̺wRjTNYբ&"N̚۾F~ hxJ< 򤜕Ah7ƀd;#ť#'c9pлp.ci,ډb"VFpb5ȫ@TGR)x$"bv@Qєx((j9'ADz ]QCdU5G"D(9@ D,y~>|p{wfVDfV{OB)2|~__|'On/> Efr6=pivӇ鳟|9nǞX?~TF[?^?/{Ȳ>V)Ҝx͗ݓ5W7=|[]޻|%3eڝZk҅CprfL⽇p{ټ?;?K+߹~)PHR11ZoL*^ԔZRsz8L#1J-4]ۛ[fO'T@]#=Zڊ*r<)ʺz9'" cL벨ZlƗ!bZe]mu]ELֻ0#Y5Dwx<^iRYqx$lhX@ 4}%mg1H<!bJ]bW@xT,0#g1RER!=R<&*GQQ1Į1eYT.'"t[a-u5kS f&^0uX(TZBRSfBxaNr`$z?"0JuQ Ϩ9If~ h.Rމ0.RڝwU֪'\J#:C`q!zrUoR`J9]]>O~Y;sƟy*mpss;D񽹹4Uj !,˂yv4Pb$bwsO/bf9Z"AܪR5Q*R򧌘`Y]z9 O|tZg┒Jﷇ[38??﹔ZX[!Hwv DT[5q/UTO8t3eb3CĄ[@u 8!(n eKq ¯%;(ar+([fE|HČjHDL Cc$q%`1!"qu8TE09!*!Px,-./.`xk]{>mX0C#wJlr)+"zb3U(jUCB 1Hi@S 1(L2e֘PC15l;\#Իwغ E]b 1vD _>t 3!qI1V0S1q D !pC2Zϒ TPsJOxZ_>i?>|[=zi[&}S퓯~O>p>ܾ0lvG߼ƃy7SNOzzο~~cN(K)iE )<{߯u/ob5t8Qxr+bzᠢwY)֚S.ԫ"Pۋx]^~Wo}}wm$L9 Āqy&Aѫŝo>x;zWO?G^^ބtIjRzaMIT QbC6c$o=>@k AAYEW]M̷#"n_ 71E}!ti.4o2q-pDi"z13uS+1HD<\,d.Ό4M!g``pKsnD]bfr+΅Y)|872"|(L`}qFjĦ!|86.??;e\JQU@ux\5Ouv8,]DcD✳H7֫{ x0-;1[w4@HW|>t ؆k}˘]R}9zr)GZbUBdBGV;x$p@?[s1Y$4*mќh #PF[F$I91t<1ƒL9z K6#npߖTp?p&Xm-((^x¢ud:峏 Ə޷~Eo0֤<I%)]'Ͽ˥Ϟ=Jgww~o<~c?ν]o8' iw;)/~}~y~vW5q uݳ!߼ENofoͿׇۃ}R]=ŷ?_=?g/ώOz/~?OˋsF{bSg/u5 jC<ֻ}oƓ/|ϖ޹ww!&$\aM|nDx+S%ڽUmSL)ޛSCj爸.1I]&fv yȲZ:}IEDL!rfХEL!Z6~n3RJ)wAS >pEy^P}Y"}Y=%*J1zp\.)dzu آe6'K! xL۴M̯5 fY݇y7u*SJk)ZAE%W0VBcRhslJK9rdꋯӟgoَ5Pݫ{??[;b*9xtg\Ў6~Yrt"MZʢgy75_OmlK}ͳZd`u-}?y={_=/??h_p??z06@Lg{չv=խy7Zko;;?G_|׷_ܹ{g@ÔRTZ̀h@'2Zൔ͍x-kJMvO& )ꠔI2&%,8l&5a_~D"@ 9w9t\j !xN 4c$fV##% Yъo>^'KӆﯦcǩFbVa ƯF҅FR[L 9@"\UCd "Vʆk)t̻]Jp8ܚLQY12!]_ggZq@ lgfט?ж#_NmiSpJWȽw3u]4MSD:06@Ѻ;bTg_ .;} <.ؽzdv'< ݎǥ p _KҔ't-ubTc6/=Jݺ,4OPjx,&#'1/pY1B{N^\3dmiǖ!>~_q`?8\g2SLq@'^F' ^p ti{yEx<}{KU[k!}ɿ]x篟pݧ(HW%$\ef145O 1A] 2ll~7Ƃn(tݳz?7?yG>q .4Co}]zs9}K{^ܹſ /~///Ĕ^^H̤K slwtuRkua ؽΨ=1*))ŴscJ1x8)ȁcǃg\X]bm9Ľ7SUӜrJidĘ*0ǔf/Iۥ96DjG֫[#<P GělW{.zm#_;6WGwZ:m[@#/0VD_kwZW@0M<| !Pks9Ix~~|}{n?0^۞<;ߴVMڗ|CnOZ?wy?zOYeikj<ӼDwqWO_Z;oݣ )h?۟web~]V$|8Q D%Ԛ sPgRJ} 60"*bʺv]nDe0DA!G :ON"BH1cB0mDWz$Zo&1& ! //Uԃ_s $!pϣO٫<K!ˆ&]0>n"4.vlZcEV@)nnnJwBT[)K-e=Ӕ׵KX9_}k hU Q}^yBvgܹbJY{)֛-~l|G-Nێ[h9ZC݇7U۔șnkz6߾e-߸o<~?W}{PDcaD\tR "F̞!('/9߷{)"E̷Zj)T].b[-场HQ|)t@CJw0 @@=]r-L4 MFO@LD)M>7mCF7b`8b@o{@x4~zpkٔuH)eBDyp|5ϳ;l#ǥcv^DnoATJbwx*y77xZ5~8.z~e]O$3(Ԫ! wb-LA^u0SNpٻ!`@Z z!ƘHrI=SǺqG xYںһ{oxH)`u ,xB-OIDei,R 9~m @Df]) ɑj}09@㷐) :XmJ\>߿=~o}p8k\L@L9)$Z'/~?~.C{]gVeZk;Tk/wg/xGZV:=S5{ ^=Oo$&HեH))o@RrM׾}~ޮ֛O~Ǵ?;oS)zJ^Ttwܽ{˧_ߪeB)ETⓓ[ [;&!T-O"zcc`h 4riqs<-gp@kZӔ2[rL9n3,iK3eNYħ[_m=V\ˏʎ|pOKYCD{@;j7DFXop]Wu[ m.Cf3U?6+DĴSD1Ɣ+3u+ B.-:9dW@ VP k[ɳa;]C@'W_dGo~Gオ?M KW MlwRN/O?~~_>?|>zGo{Y./ kSƫ^?z@(p@RJ8#~8nߗ^^Ӕt"okWv5{ٳw`xQd^{CԪW_??{'?ofapz[4Oz?7.*ӿnZ*: wH)qpsМ2c~_k9.ڧt/&XuhU?ycLe9fՁ){?*zL@fbDo~LU,;^>焏Hmee7eK^ 1O@$ߠ/@`$ 9װmuWwU2}Ddc~҇쾷'yͳonnX[ 2o+ιFi&@Aq+ 9# ș Ѹ!vo=T 9~sGNf7w9Ҋ;Xf` 3Y7o߼nfzhԅ 51ɿ[3d!hbșQD0YO[b/s, .6PR @Jc3ϫrLEYpRr=,SΙdFtvqjv *hc=jVAau!F)hgZ!ۭo~~ġg_yvjMa 30&Z*՛uJG\Go]YHcTƘ,2Ŷ (;֚V\}1UVRkmNJIdeGR)> fRڹsX2q25u>Jb]71F4rL86zl0H(g)"Ą-H*b($1R"t B@J2@!F W@ӝVͷŐm >`;21G(1SʤQ43O' JDB@&WU%P䜗vwwÑZ6xcTZv,_X[[Nupsk+'a[c %BVrٱ])I xL݄"oĿ02)g*Wm ͅV)eP "RN(DU.gBClaqFĴ8)y ma" &J+ 9gJ9y&#W1" xny.Bh#E4P)٤@9SB1c{R֛7lB;vЉC?zhF-^me ɠ_ݸ'؝'A~?<(*sb׳RJ upk+kv 3zqGrCdn7R#)(窅0Gœ)w:un9`=m$hwo $P@ѧRvm]>_66ʪ~38q/G\XO9#?f~V[>y{^<.5q?JHS?H9MGI$m r)UGJ)M ÀB:#Grf8ɍ3p#O1Ŝ@HSb;̅9f4pUA$xQ$ H9hȕDB0+)l]@y34)WJs uCj/k5wn/@O޻T1Xu GMn'Z!N5%PRF(K1E sB@>#:\]B`yaq鋧O]<ՂRÚWI6JJi S #ܸч}镫VN<ݿOhǙyohP.*A1^@Utz Q!"$* ۚgef }7ӝ⁥?E?9omll[R  !B׮=6iagI`M" )Phu)$̙CE4 sRRˢL1Jjm8" "ʘ3cfG\9,0 !RVe3)ŤB@$o@&j-M y28&l8>gz(@)FHLMfPp& !!=D)SLBBH95=@11SIDIMȱnHY9P(@Qb-AbJ'H9!ZOaP  ow+캅3Μ\oDzo:k>ۯ>h،FsN{_:z(߷~Ϳ?^Ny~TFXΖZ_X^eWi58~5.SRJN J*RC/oSuLy/{X <1hmx=]#\nBbZYSZ=sˇ'sNu.rԅwo{O~K7'Ui3h=BR5ݩKg:S_{¾!#Q(-8y+0F;`.% bv)F]YJ隚[vz(DYc`8hdb/g24M򸖕]m9CN2R&܀cR{c9_lZkB(R10#gV3bhqz/nPcuwD!O0c=FWUGT T*)ئ1&4"*)LU攝1*Tt:9 4ZwvvUR~o-RJCBNOO5M,[^"ʛ[MLOO-4^Q*5>0'~z"I_į%Zc(#[BMCO>KZ!2E)Ri7DDR1Z c-R)L[he5!+ND׮vfcx{em46SkRx9j1'e0b$!d[g|'1bFvVCQ>~ؙKgN_8ܘZJF0OLc y&yE6\ƭ/LTv)%cL3cz;m)Bs$!E!SF!͒+KUY[1JL,P:|vj1ؖ#52pPQeH97v7-^xO?>3?_3r(DHQvʢ*&k\ٺv#FĐSSTz)z7o>4BJ R)9޾w @T #2:@G)&ax0F+RL ڌ% !QE ԣfTt)*BG $@u9oFuoI)@ܸvtًg&ƚ_xԑgox7n9|\< ($jd)yRˇSTwfa?[Rv*PMw•V9'罔"L- RLlO"TJ[Esv.R dx!$ >1@l~s1ZΨb MΠ˭R+5 Cj+ʲi* ۥmX,ʒ}(" Ț*]L)le&yS`pkYK4;fj3; 5mwowlZ)-Ѩ$_E6ZʺG"(;U7G G@*) ٩驽$ RL.2r=_Zط$oW|zݸw[ݛ䝛wlayrcKVY/f63SS^?WGw )Q1(f,9#_jRB. TV 1il 9}l# r&"(%o6sK)M}f[9EҦ/P%{k3Vǘ3BYJIf$1e@*&0smuNjem|vL?F `¯3@O8Ł'i7BH1j)rX} rFfL9'){b)1~D9_uZn^nSv8 ʌm )eRhmZoбR6B*@1CU{J )2la!^͕@ 3#mi5Pp6Z`[t1*Ri]0^wV9)r"@!$/v㞧S&) !'YZ X! ʄBd)e)P) @,@~I%bHȀkw޹9ۛ>rȋ_otA^܅ZvTv'W'}?ͫjڠ(1qy.ÚdW*y 1qaIz1)_*y ơ\H1ž6ְt#{Y @ !zS>rP}!,Y hcpG3u l+T9gHT:F항IW?O5gʢ*@2((%hо _{a337ߺ~[DeUUN]R֚6Is>ebP B4M/hč ͙ڦ9V3ejZjSNZCӸL9Ĝ 6 ͔QŤaj/De@t>/دٞ{j֠]bTZ@H˴@F*q% Jk)A, SnOtI!QH:%zs1&&RQ= PتN wiUU)f;-8SUu](E1q4qW@=''QlF_<=~@r('<;ۚNf'D8=d {Jg9綥P)p ~me [K alRh(PH\%cRZ)%sRɲ*5tp4B[ڦQ 6xLB&¸A DJ\Tpm5s3g.:y3GgE[(5EUL 0!?ڧo=!)dΙQ,ܽsoB'?ïF Lð|xJft#QJ0zO96UчGRn#(r!/竢c(DiՇQ^>̭g_DWZa.-./>98QS! #MGpn6GgϜ~/k RT91kX==;}꩓o|;`lUf(MS3 :X[k= 2^Oڌ) 7)xbY,:Dm7\׍Rjp0(9 )Ŕk^ ) 2߂@)!ԣMc`C`l~Q41V{P8-=12F@8HZDD YI )Ji7@5-;,˜V2S \LnfXAi%W~IChK8=5MD8R`]6mmŇA<alc}F'1Y@jhZB'cB UUH){?bROa+1WRD7ƀRM?yWsemomL48 BdNl5~wwөqH9RJAJ^W$x&b " Y;q.=}tRog֊RINxpcu7em=0l, )RYЍ\sg:αG~A9KbLН<ĹGoك宔"嬴-X@`@BIR 7nv0Z\w 0ssm6mΘ:6l-/?}-!{\͉(SG'(!DdP1#zsjggn~rWz\*(e[ȥ{޾sJJ+֊ksα̠Dڔw+xsVlp9r7wdw[Rcœ$L99)H2%" >z\EfˈhRK"Zka5)kahmٸZkpbΟJ!L19F\0Qx eB,2cR9'MH>`4MJGb`.b "GC!(ܸfa~!,L5k''LS ks B$Y|i(SNg:g 1eR "/.@KŔ.J"yR$)1=1d}]7.iWV%TEiB4R#! p4b4)%^5똓Pb sG;kVJi8zK;?8Ǖ|| >T݊'Q=7m޽~'7GÞޒBU:(%3$ƅJѕW?vfg?ϏCG5(dLQ(R?ڙYXs-1izKӐ5{Q`ح<)j4Rs-ehFMNECP$<|Po7A}sQDBf|af~dw7>! )%J]J1_՛6s+:ͼO>u;c$'α}][n/[_ |wߛ=ϽƊ[]][20~gs30Xu4YJ]83;S%H$hb4VNwOQT݊mαAcə)EBra䎝8jKwn1)SLY*ۅc|NIZFõm5g)BB1 笌ivO~|'Mw?#eJwo>cf"z]7JJ")]o@a 뽏$˲Ƿt>Ģ,]:RRklÝ<6tvwwx ǼUSBZ#B"\-礵GusVJR:gJiLsHʇ J92T΍*=1Od< l='0[}yWKJ)nad1VJBsj\-k@B8άD)1C-V*YB:F@su>*tp8$B(z8 {>Owu^pZ3gA$iIK #(hmzʰ}STCQJ?o 6Yd A97M)ծFue#4C?Z_Ӳq}Scι[>V槷Lag*jcF+eA>Y(Ff?3>s[8;r#Y:oOt\kblaij%16r„1FbjjJ)2鎃'c, aB`˃lW\;(U -MBUJPϳ_sYk@wBr$X$1C!6ƥga]9}B"3)~ 1x"q[fƔLTr9Wkj9DKmk\-5b֚#*PRŘT]C R aӭ: DkK{m#ѨB4tmw8+aR>9RihO 9'1!|3<Ӓ>e.Z+&,e> A)%ƹ}L[Z+"վ(511Xrw޳bL)eBR{o2r9GW׶m-ϝg?)>²ߟ웟\8o}|H1@!ű3Ǥ2{oe. )bP-uo߽z{9OM?o^yo *,uW֣z/ԝ[Lyſ)Q8Na~ǔ@*w#DCa9FZ0I!IjșRNy(b(DN,9qNt)MOM=* x˲b Gs!+4coҢMx\@m.,?O񙟔_DO#1m ȗp &6f8f' !;1h| ZPJ$FNއ01EZSu::Rdl6('jR_(mMi;[G:vgisF;se=")ƜRcٶ|`Iڇ8y)%#aX4s ]`[y>vpN heDNdNr_E5  vm&N6~;ι|N(kd6vCl1)c SJ9'Nr8gt;(znb>p(cT۵Z 1LMʲgJeц3e: )ƥ)qe OQ(@+߼~gW.;obNVk?ۯ}3v)&vOl-Ɔw{81_蓝=.gPD )=\#s⡣<D!fDh%N9J u:՞b}JIDNwqyi/" GfPV:k~9|pQʽẀDrh;cH7oz&5S;[j[*ڂ<ـ83?sO]8ƛׂBy! rrFJb shcҹFzR}J.KLA)e s˱QJ})C )[E MMkP`UU<8Xc 9?ʑR(ҜٲsN*R"LLr9^յgh5BӲzqjjz%<FTD@L  5|ff, @Jk)#V(1n)˲Hux\xnc !H@$PZZk5M}H)9ʢ6M,/7>JIƃrn&>x8N3#3D7pظnT,K`8@kkPxk兪WM@cnPNw/?t٬sRJdS2O\_}Ǐ-u= 1_9v8FFB}}B*% c4 H]?--,/sckml;HJA:SU.;[s1UT|_;wܯR؎SL OԾC66_߽q[Vs)w{ ϟw_E{7n!SSbzB@|TZNiƻvލF#.A" n /K)6OL)]O)>ሺ12Rh!\9@γS)k>ioT/r)Z.J|1C^ O4P;&B"@h8 xcf}jowvk2gRNZ*!@ ”C][7\Z+ԙÔsQZ+CL"8R?~o6]\XNq|g3  <`d+>qo'Φc߯RNO"3dP\?'b Ϧꦉ1B F)e9? `aAi!DY|nSU 6 VZrʲpqs*m1߱~cu3ǟyKgghKٝTjRھhWVfp;;d9x\L\=2q) ")xzƝ ~ U'>S+։rhcW([7(Ncܫ H&REQVjk^[=5>/{5s}ˇxGWxj+8.P !w}<}f2L~G#RL.=tw7 -4gDrf7G쥗g"nrN]uʲ,Z5d 61Z# GLi)K)xpPO@1𩌍: $P "jexGWڤ11R =GB\ ES–ᘵ1BHc 4,@̔@H'ҽ h[-R1)D`]'0 zb&LB1caꍩݿ?J !Fkb\D$J9Q)81y!EYVEQ䜄knyUUqضK )"[f{z W'` ұY䑓MbwJe 1N!&ӽpIkU"(JĦπHZ+(HL-F(ag1V JJLrZs_7E419h4j;^!BJZkEZ/^"{{A! [t](w13` Q~fhtK/=}ɪSng3!S?g5:"R]`gJ? _ڗGC-T @)BUz9zg_ ZfzySZGمՑT @d Q9vo^)&׸WEŅ}{ nlHLљ97?qڵ$/3wf3SsSkslY|ə>?>x \qBg=3_xʠB9G5 "Leq! T\Qkˢ֥fΜZ5;Wg +1ƶhr㚔nTqkk̉U!RMS7&,-R(0%ޅc P!K{̼KL'?Y7>jJcq0B9O?hQ,^TUUR BJqrI O$5ULYkdRX˺PR矾78Ν?*8#kDLilqe5?AN8yvt (Hii%/: :@&vpTBJtbOq8ŘZ.RU=,oZW, '"SL;U(iP`6{Om K1L4)/ )cJ!D qlol!!>.P?sotTB@c)~MԾwΣY_)B]ڃ5L >pN80ׯݼ{7tĹ}RWp`o5R [LvlX^>pdh0uUh, )AJAlg_zv}qxV J?ϮVNS@wpߥ~ F+?~ }q82йkə !5e6>RI|me۵ 2/g|Pn-L~̙z"[P8ubBTlsn)R ), M5\JBHku zRkB*SgHxT1v0bha6M<^K@5D@4 Dm zgyC9S)Zk!;j@S)%5c_r!!  kmY c=6;}R!jx.[mG>a4O d[Ej%np^bk<+mI @lz:x-`j;7EpEHB:AN)4-b;!Q(-U%Řq|'ۢș>8׸1FH!9O!xJ)[F !P)R1XٺQ3':&(fI[xO?,!eߒb(?<O~N5;;s&4Pf;Egb_Pӌ )'%UY!ҍkPkoLɖ!}K4dfZeYJ%ӧ{Ea"$v:cLӸn=j}RLxoAB3~\exV`PvC|̌'BP;8q *L bWFÏgRI㴄"ZN[1O9ODBfRR-R[N-4UqqFASSv7@ 9_XKSzl$Aʹ/3C9L9%G'RJezԜ%>HWT#>0_/F\86̕R9,Kd.R)|uvH ښ 4/Č/EQBaڛ36TKZiSxO%AHL9D_ǞM=@\}+W?++{X*bJLY%( Z??V޾s' O-,'$>~Ѡ(ٔ9 nܿ~p?Җ֖V[2);eS;׸}yS/<% ym;9 &\]B.J!BmQXCeҙ"-R @C/ [ B+kc#d@&`7~ {8FmZwX' v.!9$y_7uiRF+ɔG&ֺ(lUV/%5ӭb͚`<#q[l|">63+I,e6wd16-0pKeRd~˗:RVeN9B)k:Ehcrfⷐm)1'n_ss/}N(xR lloNW=%MT%rgku]Y w06{tJ)rNu㚦&ӑ{uei\Y{z0٢?觔 g-5nmnnp|+/-Xڋ51ݽq+WOBQQJr}To{<\J)cDd c >x3>s Z~^g.1*K)FLAm!hTI2 /h"Sn\SypHHBj¬rΝN,\ąK\ &dۥ"rv:eQI>Bήs K15! cb(Jc %B凗j$=R1ˀ4 Y?(H$F(k?cL1ıǽB)mv{S̈$R*o}'-R*BT5)6 \R?(wqV|5D$BTHV _.jqk?XV9:JT2h:s06ZKR;pYrd쥁 @`1SM)rUVNM܍8q9ic޻,ٵf-Dxrao+"Ga9I@u]A6*P~0é'/r٣eU)r{0eԶmtmagz`PuK!U1Ƙ}  nXONMq1BS3S ĝwp󪶕fg#bww;n JtN{UVѽNQ&~(+mSS|oݻ#zLOڋ/~k=e2ao|B͵6lW)YEɍK/ʏ7j銙2Ѥ-@jEOlzbTPۏ^eJ]VUA"ЊBpN8g1ֺ(JsJ>D @h_S!2%`N9c5Sڰǯw[ 4um*q c FZ=,)޾SVR zSHl K! <`3!1:4&጖$ ܞ\5C0):фC`4|^="$j!(aaPSEQ%qTFQr?ZS[8+C`uq m *A!~x:+Q6B݌x;-B D-sԈ=w!d1T=1ZHDHp4H)1{R!riMIC15ZmL=|zoǞs/-8]VŤ+vεs_v7lzAE'<ܣ6Ϝ]}CDD`:Z׷ufO<쳱[{/S4֠a|}ucgg7B{QΠIБ{9眇Ûoi{@ٿgR/rN1+6n<:s _z?i}]g12XNšOSjSLaAG?g.|Ifw~L{`!B z.S)yr!DXpMJdYt=KnmZc krڑ2|-N֪(8 )HY–a_[5ąb|ݭxbB"NӉ('иHJ7Y>Ja:8#26rEQu*!Uۙxoj_g(ram^s}rkojW|9NʱI#XAi =‘v/"BUDaw3ˢBf@UUc(5J t{HE CPd-`7øH wa,ZgeYeBph(o9G9e^k 1z}}BP!x)6:Ƹukc֙s'/Nu@Ćkm4#x]عѵ*^ `鋧_˴I(:1&hu}cm?V\p\\"Ŵկ.y"_|٧L(2Gx_~|jwW| MFZc@3;; [[;?ڟq{(oZmt\姞F/?uཏ9em1O!? 1{n-x{"N0UUq ɘhFeYkBDn(jc:R rL9M<L\P 6/"$r ApTߚҗ^`y"iL5㩧@j$= b5d ?&( +1Zl-V5QjzSELkbJXkSJ{\v*(6%$#qe8Kځ >]<5qsA&o@ۉVx VJi>S&\>l-XZf7F畒B| )'NцM5I(;JJSN9K%W˙xk2|( ˷[-R+?ccbpZw{{/\|/C`<$oeh-ZUUB`8T(+-ZV{rNEQUA޻S4&Jicu.̇l!"@Y,ʂRLHI1:؇"~jA7NsL#Ƙ} כRZ[\RRkcR%zG/zSeUr$bHNc6uXX^8tGf&)fVtŜT+dI\t3!]]YZZBƻ) U>_'>}^eJ bwplP(%'PkoʔRG|7NNW3RMiCVka9j[xpr y<ԙ>/H E_򋇏ޣs}ep;3JImtro3y=ֱ?ɃGob2a?1Y Bog.z\owG[Or!EJ)[G[2jN,Q7h9eh b6} C@sN)<0qAQ<*B))(b9e"3慐R(%Ձ:Ypv[X)1{(>wC0"S'sЉC21Q#E cY%{ېԃ}ґz|HJ b9׿,0vEsZWF ;7ȕCioL6xc`us z=AXδұoW154 eᜫfzzF!DyTɝ(B(m $D΄BQc+1u6ڇ?tRJBhDmyܝKVc0X;SʝnUe1 :h4D`GG~g.yǧNSvJ~Y_}矪z/vmRjо٫_WƔVE¥}{\V:J uBfJP>ygfW~yFJ|p;udb;;|vV: +(!(Սw޹~7?u>YtJ<9`c3Gz4ƻm<ڸɵ>=:m Uh< ggP_ξ)ms~2s+ot,7g:sߞ[#Ax7*:|+kMN7!l6G}uŋssSSoo_M9miR)EN)J뚰z{3(QR {1U1TV>"DZ)}"@Y}A>&"V-SQ֣Ql1i5#ݹFJeucЌ-= 1/RQ[$"(pHxTqFd11͠il@5Tbfu>0kW^9B %䨠cdQ~{߰( kO)ͫ ǶH'GbGxȋv c(:fZ'ߟv4 + cĔSJ9PE9Nkkl !p RJ) G!eFDRlJX3!TR sBPh[Eʉq9gt&(ѨE!PhcRSLL~jjJH9 SJ|V)CG]x™Kgggơ0!D)KDۯ#墴@do=ӳS>{ﳈQe"*ףZԸq 5{V|OTJh!3E}{BvFkr¥YxUj\juQ!ƢEQ'r 55;LZh;74FSJnnX;~g/./_hcu1vn9qx7ݞ ~3fzsDG!@ozS3S{H)˪hRsެǓO)cC|(-kmo'})\pkfwg|ѧ\xmpkG; d!bRLM8rృ:|N]xsO?qSO~鋧8ܛ"`w7>۟|oZۺpw90 M/[b:c7ܹ%[ZU~_޾qʵwtZW&T_<³c`cu?CZ0Vy/}g|^ݥK?w?et`Ղ`L{dJ};͕Md5S)%ƥ1<`9'ar6Ƙ^=?5X rvgqեW2u򳮩_V)'d'T[?}ʅ=5;_ausW9PԞҭ7uf숭Y7wk[k67V7vtgn95;50ۛ)l)5,la&S&wC&^]<Mammlo7u| kW;{#'@--ޅG~#lv9_>z~j;+[AуݳGNx q y'oypo) r )h ]sgyC쬅i[X&@\j=_ zHqaUV?? ׷]:I.U,K@LCDHB@!!p$PJUU'Jwa8֣pTOJ~3̮cڤJ)9EY "o:dsιC@9;rN9C4UU !7UX;8%Fr߮E`yg\{B;D Fѽ˿1H2I\ާC d#^Ůj{TobwSvʲ6廫j7\yyM[-;)0Gfǰ?ݺa*S@PZ$.A?;u0[RLRg֣;{lqyAa 3 w1gf<}fwkG~tuuP2'άrD@ij2$Q婈B 켷TeYJ)4XnWJ 1ΆTNo4JƘQx8Ϗ(@\kN ))"@&+\QN?1ƻ̙+{ _W8h7#nV68>0#04O*B#BPhZ[V1&\`*1VmFurJK geY1ĭ% l3cE`J Ƃ d7~5+FZHQ  S2ijݜnFs;bB ۍlmaD)EdJoj)'!43.\CNZœ )(cr emѺquI)) =L>!)vTףh/~ԁuw<-puyڕw>Y:4~ًu.rɖ1Fs)%~;Uu{7<]g͝^TZ߿љg/~;C)LMӔTR9s{[۳0ѥ鹩}gf;Zv5#Y4OqՍw_(Kgfg˩,T\$li_8_|uݿ@lP/\O\ˬ+!@iӟ9vo-H"f[=~E]~o~G_.XBc3R}/~x{Kw:h:l1GG e1S$&(SJ($+ivC9Өn8IRK!1F^3QN9+%r=j8 r((lr  :A&6ec105!֚/ž@,3H wUM(| @Kv L򶲕6 aw1HRJ]ل }X!p|ܩ*nd3Ȕ3zgܾc ~cgI%) Br|o\3j[6:!xkB4J)ln-~W=jC2>싀"`uLxȁ/t^-϶Wa]a'Ry`m֧~h;=Ӳ1E"*;y>Uٌ'_z:0>!um ˇpu{}an#|JǘZsg^ܙ3Q#3 hjvj;|oK%/#bի;fԌ-Tr}/}EGoԌz.ŜbRRR9ֺi*+| Xr(-f>@9mSwR|J4J1X#40agggjjJ&ԣ~7!D"j\UUbN)Fm,ȷS,TDc2FFR zSB)w7`ҸԵOb n ~2Q$d'm7u-L1*JcB )ە"b!&fPLj*km$c!H1/M,@ *_s q@ >1&CFUHJIu]34 ۀ!CJQJR:BZr;ejctJE!g1r2@kce=3D!<:!(SZ!?JjB B !\򾥧_~S'*{wիC+7>kcִRwփCGv{_P`Q,&nzsF!T;,ܷ7'RJRJCG-6;އ޸~gJrϾr^:{ҙcg;oznJcѝ/__+BI>ڭ7F+;Ͱݙ|ym6O5ӈ'7^Opڽ_]SֵI3A5O?}|?`Bw^jg2LMefbcrcSbn)ceAQUàMkM]1%pr^QMp柏R !$k\b@p8?Nn"JCoO ָ{ L)!kqR TD9g|S_༂Dy ?A%^b݀3W! @8h{7m֊LF[DB>x;=d ? (BRk=rd\94 +n<(zeglOJf1q9VLFJBB2;Vrv:~vv> T\Þ=VRIk(z6&5MJp2)6R3{˲2sNmE|B #)S]5yL'"9||hRs&'ɿ"؅#K &t69 `2/>Q(Ƴ <\оrR3e!ZJ(kjReQ80_c9E(ǘT >p5iBֹD&(m_+1 cJ(D]Z &% ޅfgtWB_z駞jni&SNWu~[n?mu;z2(2zk%qaqݺO (ZԹq-5Kˋ|Q )~w}1e 7~{sg}ݛ|g_{pup….\zҙO?ӫoRvzC-/ٿ)*͍vB[!Ʌh|믿fHY8wy♽:r>}=B@|٩WɦʃRHygwgӝ75bNu1fX_^eb@L@ އ3w!D(s9窬f-J1( D9# 1N{i"`S*rNiO[Cj"2$Irz‡`؜ h+e*~DqBH|IxK&ůyN2@3s O!דg )w?"tКA P&n^QS566ڼ٘tuTW]LjM$!G'Tye! I8?ZM6T2Xܡ1T_Ȟֺ z,ijZ C!/rk]AzCLUUy_` B7ƤʲȸM C9BLqF51$fWJk韌)yP)L,Qg){;im_]O:~5~/).z50Eӂ'Z`YֹSL1Ηo=29GTmEk``&\SL~sua~a}?~vڛ}/=X;0+*_K׮^WWuT|ŧyǟyst?PZuz]s{5۟OLW?r8N|S) !T囿?^Wƚ0wOdcuXtLYb*G[gos>qdt\<4-]ھ=y d_k됢|+zK[~oߜ1zݾ9i1 AתJok{ݞΜA^XkLJD)!8s,[Ju]31Yk<RJ+ UJٰcH㬔iºUUQE3p8 u,[F=bTJ `?ɀN ! Qx-_KUimD#YDRZ!D [l5r`#mrUV5@; g ʤì`Q46(Cn6<0cgf8* J(5Q b;IԛRF^*qU%C1թ. -cY 3Ay3KIQRfP)#Xq$QfSm'>1gsM[omu>Bik,+QF5"++[_zYyo^M~҂5=?/^wT4_~vvqÏXsı-7 )Fܻ֗Tdx}`VБC?r䑹]ɞu9˲G>#| 1$3S1oݢjcο;itsѓG\ߺ~ڥs>勫~浧{d7V7K/ ӳ?I~}/L'*+GN(Kݏt6kFڤjT8.?Èrj!yev?b}v]WSfSJ1ϋ"/deNJ.LjZW̌Lx֔ *d)vۜβ+a dc *`"/b 1{alb"iogW_ֽ* ulL򕫻yTE7hr+k±S88/tzp9Ƿovp81eb!zI0s|d)Y[9k{] 333^:2L8əə}G.WuD'.gըLƘʇ=/JD7|qR^κrPXYZ7{Μ?M>{zz~4"*IܴRJHGR'%\E8cx5s6Y1cgmL[^-<LU]Hy:Q)v ! vʨ󜈥K|uEuh̵1EDeCMLYfDIJD1|!V3YgcL. T sl56D HL&G, \YX9g!"*PYmV'f!8B1fI\h1fxlTۑ."0jA/'P@N"3Sb~"(MLS"sNU>DNRrM2Ƅ2H AmH>Pk, 5@:RE:%(iN]Uzjc +Xo({S?1{eNsr3)z9p8RƹYC/ z4S>v/_yX$k+x#fzbz Bm _'8v؞?2'c]VE˫+puYTβR`):HJT }g U}}DbbbbaaYutyO>ds`q'{sߞ { 8tS}l/=/7⠷ϊ5q엯.7}xS2~7|: }=3:kQB4y|>+ '{|8nn^:JH2?3oQZ˔”u[Yd,-{Zi9zq<ϊK)yE6e~*+kD%4a9Drs[ڈ v`ס)+4n$JTJƺ&45"0zaؖ `j3 >ZcsP',+Υ%RZ`019^pb4RSe٬JZ46 3<ޮ-fHi-8($',`9.Y1v4l_u0wsE+ 3[kʪ.:9*SUU+'H6J5/1FnPJ}m:Qr\6^`F2Uu)3 W7x=vݟNx0+ȶB^[Z?3tzx0{oxXh]iRJ( ĔB7FW~On?{l'.]~G%"I[Z߿샙ɩ#'}'9_S?Q`iiee҅rSk )53H9״xbƪrY& 0E b6&ގa.>DwZ6vرcڳg'yqK'{hŹ}޽qWmS1R89=593) W}|ˈLqc nZܼ|?~&^Cc6OC.ݼ{Ͼ>ҳarId4{~ߡ wSD)sYLw:b1RCQĴ9HzBL֘LhjccK),B8 JiGI%يݞRJ;."H>syhcBHJRJdb`LuT$E QĢ9髗) 4@ da3˥v}D9v"C v:S$kC@t:j\!,FqeF,!.uYUOZPb P j[0%fNY0(D:BZ[TuO01 oo/769rı=ۀ NOv}jd==3we1۝wϞ͵c{K?SWQ~ciyP)"l1Qkm~cE:8xrzl5n^՝5VB 2<9)SRBm!qƚSgs6ƌF"XkcR ڇ2³p]m9yĘIjEALY1eeˋ{ou6_w*NKLGht$ϙeyJQ+cֆkJ)k~dwڈ%S)X8m0hʈDSN5ǩFAaN7 NAd@l7YtRBd6RS-sŶ]Bʫ.YЩ ^|B.L)#?&d=RJTRy 0Yj}),όֵ̓ hcY)%c^Z|&̓=q',:>3`co5G;, Prr}tp0Lw{}mx\̭W8 SyNNN 67ШAe uܬv-j"Vֿ}yڽxM~38sO?;cw>kظs;8ڪc_EhM!rB fDfRBмmДh*HD`1rn VG ޿o)e.Qۛnrfrn'&~-[u˧ &&v>߿}'Nb7o^7+VpGwO0ZY>xĘo[7`F˃հ\-TWJEQda9B~\lՒ"V"ZX-jpQ{D\f)yfɳ\J~5b(*Ɛe,<ue4EGd-P Ft@P Ĕ01#MwdgfJyJ2FG,s?¾nCDl _v~C&N:3jÿDeNƫĉC bTJ]B\Q~?RG2Jm?SjJJ~c׵F)I to)m45{fm\ASY9,+R^rօ8jc8E"҃0OSٵk7G[Մ9ln:nW9ٕSL{pśn =qhbzGj>1`t/Ξo^\͇j*P6FN1J.ȉZ4YgUURXf-9(D$]"b0%dhi740@=1B AٵoNQl\jv9 c{. *΃ҭ+ٮ8u{OhsuϨ\R)RL>D@N>rbZYX|'_~{/|y;{Nˆ@_{kg;WlmJkZҬPIK+3 g<37M&DmT$=e0Yſ CV>x4=jBMop#3"& ؐӜ3-`)\#uy8cZ)Vu]'*;SD\qCC!N#Gw r )BE)3wRURJ0o@#h>mӯ8wvE٩v`2x9{Vq/c B+nn*%1A%k-O+12ES ! ""X:#bQe)%B]Rj|Ơs=g߽op_?·\zxm`FGkoX6TAңتF Ik%Gr qԌȚ/)9#4;+0VPkR<v2Lw.Yn31?daBoo2^|xνaO'JvA}_~sD w6?p}mn\8{>O%"l^H)Zo^楧?{n=N?q Bd9M1jc:ݢUը\B ^bXׂzl|zi]a<))Ū$+r|L)rk "$"Jv@]yc0րC!PJA$PJ$ATDH@V)%jt;No'8jSbG22U况R"YW_wkfYX;jZi oO1Wul2K;ᑛKMEnrǶ1}RkEDQk5ͺS!Ec(fB"* Hm'"f3{R G2xPDBf1%\56""36^kV&1$bQQR0,$UY7CEN;SS23QVd^Gw߽w{nhlR=tl" GC%Limfku+}||[^uK++Re0,sϽ{?۷+}C'xg9*?z>w͌LbEQZgsr4=EkNZSJYYN$r. gRc Ę:2S EmZ113R@LeDT+km\4Mhh< ҏR(rNQAJ4==lVוc6Rq3 V8$ AJc`+F96mMy-7:E7T)QS7vsV5I6~kW$f{ik"i1ўAF2R+ `*~8ݶV26ZPZ+P)StYkQ с6b=e3KD5HjTPVFu-"9X6mDl $ǘbQtذ"QܠB%&deҵC=}Ń"cLkUt q _}`}HU66OX4Lջ> mP M_:z گ?ڛ3MȘƷ7ݽwϿ8wҍW:{慧^|ㅓOڻ+˳?󏻷}.]߸6*EH)V#bQr5LD)dcLCcΥѠhc(cݮ%KYt Q)Ĕ}@MDTO]ϩq9W{_8#򋗎=qlb/ijjsNN=\s΁EՔHSDM`4/y~ax:qbbAcL-Vy$f<ϔZ(TU)\h-vJZ&K8 OfUYK6)eBe)0;kVWVcL8dDlWBl$:q,g yB;p Bż7*+hDh?=2Fh"Pдҿ 47Ywd* y7fx!lqRL=zQJdZJ_3K @YX1i1yR%1N.r*ODJPS0F1۽BmY~@1k H\b2Zz3ϼϋ\&̬*,1ūNeO;Xy/XnONJNۆ/%q:3K'$KƊCTLAL Bb'ֺp7Ro+;<ԚLkv(+>Gzkml 3 '[~p#%D~u?;.Xό1Oٟj%>8oN޺Z+b!jcʍI; /y)߶<V`c6=;%E4bCNKwo-igfQ Pڂ!H/c]rL$bq(0ȔB,Jk2,ֺ,eYs(bFPM_JYie3&`mRJm PkVDzgb֮۟cזDZL &+Àӯ)E'chdѿ_  BC*AWmlm)j k\{0t4iah_ɟEBLA)e6&heUZ=Q'>du0FS m3 ctJb!`s7UA)̲:щ*+$Xr.SZUUU5ֺ޹ 䫇\ZT׷zEOɑBC"clJDMDBzq0dC!`\^uel0˜AFJ+yw {Gk `Hk+o>0?VrGי {<^z4/[74dV7|BGg?s\wff%{jı =o~v؁GmE;?6nbzB[yk~Œ\͡ 3+P 11715=RabYb"ct4yɒ3ĮX:$1eyy.6ʪR &ڻ=hKDb)Yg Zi@lx0Xq&=~̫9=751=QyYÕag&t>[N48r~c=sܧ_{n6\L;3 20nnm^9{O6Gy"*n}x2jzvZHR Q:t{]Q+]ոkEQdO1m+0DI6F Q;&Q^̝h{2JCH希12 WII"hm@@XR) &(:R sۛ$ ?#1C )Ff&3q,7؏jfn/^.sD5o/ ǣ#hAe߼_<#և| Ly|ܺAؑ#g^{GSy4`fk{c2*/3KVwuY/]v{*X3OLL1 be`M/PQZR33TykqQ)m/"0Y&k,iiJq%LMcAJ)sHUSOkuV9W)β%YYBV`kЩfe[%9L,CTb/\7^WcEdAij8ݦ/e/B;6`^fی=hCbYV4IT+<䈬50VYPfw غ'r3)H7F)#N#dg-%f6(T DL,?`&NP+gy!z9 J7sfuӯ^3,Ji]tN;!eL^tAQ3?(|WhrzǦ{ϊ ׆~s:Ώ93q|¥~0^X?~oԙau9|{.޽e[~ȵR1% 55 L򢐋% r(cwCtΉILp~LJ,xN &Q"gyVuLh-s֪kIBFH17:D@NWܢZ,ƣ*[1U֖F+EMtq[-&01D?_}G䝟`捕~ggv{.JA=-ܛKo3nR*B,=RJLT05?=ܼtscec=D$@ecB ˝s^ IJ@+RJ3V)R"94 :b !BhPۘ8b(gic( DCRNNO~Uepkn=s[>O>>8 )mo}矞?cUˑ ]Ż=xbbBL Qk29[bDI#W9T%ikxPhȢEHe3j_hm-ǥҘ,gb|Wv >q I%1Dm 6MAYkӐKn>8q~z27k.ڕko.wذнSO>15;D)kǟ/vaᥔnK'_+OA =yrX^9å͍}. b&BTngmymz9DD)K A,JUu-*lZhm:BV)0C 躮%3Vs.U%'BZNэlB۹0x,W'NVFw'8g徤喡\eqö2pfFAżI.:Me!DIheN|G,2rdHTnu{ANٯ)ġԢ@Rh#p~56RD1Ɗ_}VȠU]IHz8 ֘Do rd `2J#0kj-`Tktr(%*1B$yK\ q"-DUtOpjrfY)漓gDL/_z %,ˬTǛ9Xޚ_tt;33/[[[SL{?c);=7x`7/\vRgySǟ<>0"+ޥ޾ pC;yЦHM)w])ĤFAU6FZ:F9$ qFZbĤ,:4Njn wc*JieMyтZkmP5sc RLmAg=Dapw̓ItznZ"#ov{3]OOg|y?ps{F͹b_zffaa+%d_~pZw`ykq,doug,π9+ҽݸu3[X45gr\2 D[D{ ö w3TȌFTec] 95J|Zomm0@Q)!.)"z>  0ywarg8l0b]3*hnVqd͡c1(FQh70h) Lɐz2'v%9uEi+. )߮1[P&_˪IZJn2 Eg y+sJm\SIHLn,Ā)lZP335Qu0bB)R;+å}>OMfs ^b u .޽|grz?Ng⮅`bפ,2TU)2<0uUÏ?ܹ;L_<3GNC9*? M`߱.%FyRJ+"eگP5JYcLkf.X(FTCpA@ H@^!˂buBć̮I3ieBbRBI)%"TpΊ@Cuu> Ͼɵ[ӟOMicƫk>@'ݎ֖>z?Lϸ)F@6hK|ržW|gO b<6Dtg7'^Q]S3S=e־7CkVt( msZ#P ~ p(* Fnck-Yzh伍6y.9^puq s:kE7s[<©O?61՗I3/>vfnFf,+y莹y֍oo"_ܾ/9vxKvfrq:!!U-nw.Sff4ɩIhTJ닜-*1,h KB$J{h%7C>HYq+-ZlD4X- w=c`QM|•>2xB1D02P\Z^^בǞ8Hwl^x3 n]Ee{(|({Οͥw.ݙk~3O?!^~?,'&kM^dRҝbD.s*sF2fTg <.۱cLb(3kLEK2aF-6ZŔJٔ,\"o6fbL%> I !@֬T}{Xcc 1EcN97hc<%w;]:ۛuz] /^ts__ ۷8yoSǏ޷mmlݸ|z:jjtob"2i}e=ɣU|̋L,s~gڽ+wO8mU)T`ສab^t:gS&2AIqV&Ϝ%76dFkLx<z\>8St;q9v,s \&~$bئg=C 6't9٩42xWChqzBD7\{ j0V5-Z7ܞ6|7lh b{IT^mۦ*.}%c1ʡ,4sk+DP%!cxL) r\2;gR1((Ӻq{HJ$[D1Ơʊ\Zk H-Rb{wߚZ)%yUUSTZYcD.PZgJ~}kG3vn!LM/Y~uU \Y0pˋnϮ\~c_şa~g^YZyZ}՛}]յRjbre·bDb.PaUWR6!<uꪪZ.sC$-oxG]8QJLBA'x FLϬ%q9̹D1Ɛ!EB$ 1o aO1}cC֛82}9Sub~:t-?rڳ<݈myiُϽ"x@1|0R~/p[Wn|lgjtYUى4cxϜ]벒S^Docu{E|]K֯km)%i#?&Weژ+Xk\&Ol,s2;hV*Ĉy91`0(YYr,˜c k'+ZvܨĄBHk;6Vqc{;L_Ѫf=00M4 lg HgLϝt:r)bLb?HȏSߎîB82n;8lZv!Sh3ug2^>ߢ6Rt/KZ vyσJI6mR8x䴮Ċ(g*݅gm%1C7N!T!AR2Z'JW ~#^7F4lW=\{ܸ3^n]/\gyx8Fr\wS :F\ZONS Kb9qD _Klu&n"QpuumҴx3g~qfߡݸvs_=؂-*1^y,%DL慪[-bS3;;#-a4!b{fC9ɂDaF˜bj]D(JĀ@0TʈD#tniIR'"үN ܩ7a#ap)QlᆐeN,HJi9у0{'EP.~u 'Fas577_[~סKUPJwC/ rܣKϝ;ݕAi`g#dp&J0޵П5uIb3Q"T7+Gpsm3y#5X)%ʲ0EG.mz+2kv8S(oQS9KDhh\VUȔ8< F%W<ϋ,s2 <ŃSDՇ,膞9RZ+]_. .#BAlͼ~sMcL!J)&~C+Hx;Q [eʢ*`[rj>3 3s47]2Vu"7m7ԝAbD?q1^}b7g>Ͻ~ృ3x>ܿsO>ʐ1'zEnڎҾPaUUyKx,vl13=3gkZcU.-i^G,#p!.MMIR P (imBmd#Vlsy˲hCl F(Hruhm,˲Cw 'fjrJcl^e1驩D1u[SX}ƘnV4ѥvnNd uc bYK[:*f3"Bͼ\|EmJD0+ 1c|k"c4vZ"= @~V#|; BP 69j $^74hbwAbAɹqS RHL[[GPkdf7@b 4*`-PHQ],ʏVsӳ ݉^9scf;9g /\S+nݿ}7__ZZx|ea 11g|Ԯ3g?闞q -[.Ճř]?ԙv_󭛷ٓ" ֆvf!()$4DI<T ,s1ƺ SDJJN q;5'k1`ubBRBR,Ճ{e 2R@"/\1*1%NLJDmSy!EVL!ٸq=*'GTU]uM- ZJZB{^Ǟ9b?ۓ"neuy5>Kݔ?/;q9|n/޸yk"/Brm? Ji4U`jfR)r|Fkв_ܿvw q[ sNb (XP1JI"K|]$RD^)5j6 Q !k(9ٺ767U)^,RʇYVDq$-3Y3 CZ#rjM]3vĜSe.OI^to* 31ܝ8 $tsh$~&DLKN6Gn) 57'_ִFPsI0o Q$8D5M~!yΆ!" ɭ5 lWTb9`D Y)-=Ƙ(ʀZk­ĩ'O?8*ϨR_pcpԉ'N1&/əv-^ҤLTw/zL'"(̲/߻rw~a7&X{Z,tu4Ͽs?wN=O?od']L()!gdgM=Cyjj*(MeUv:s9G@lW-X)L)[bJZbQk(mpc1u` SjsbwS;U3yK PHp?,+c pRY`Y8J1Q&a]+Tvnisyջ=:DIbM~g={ə6|U;+cm,+\ HB,Kgڝղx>M[@L1$I#1yPewt;2}pOy2/xReÒ>}G>zuʵQ(Vzkmu3ntU6妟mll2r6Ntm v6TϞy̛/~p)k`>/>SMј(kL̈YeUZ l ƣ1%ʳ\k=.DzNۖeu]AV!̅Xk-eh# {(%YMG%G#j"!˴4ZkZ)|Bŭ'M Z(!u]$АHܥaMD{wa D|[c3ӽp7]hI Vn>~1۱L~Pۣ7+|¿cʹν,߳3Uߍ16PE+LcEz5CJ+Ӊ'DVk_yzkwMnS]D9MK,gyK9'($r UJpr\VZEH)DۋILV|];| TAe1ƭVDbX Cc$ƋuUQ9 UYksYr"Q+]* SkM)};ݮVW׵ 6D5Y`D+pcĝ,N=HbmB֑# Vs/z_r1,3v!?\gZs'4[ OnjU#Vvܲe!Bɯ䧷V6)f2e!xnX$R6Md-@Sf$ o+7*i.ei :(CiR#y9+T[_ݘ:⩃'ƐJNP\zµ9%5, `dW(gACjjrf7sTU5dimCY(c(c{,/%d`ھxneBN5x{^4 Y_Q)3{_5Z-G "bBTY 6DocR:)a@5G)Yg!'P ˭1O,'z UeLM@֕[=|IھDRBNeįv:NSt,R @^O]D$&mtۑ/bD1 oyȝsJC7{ֲ33cl ,6ri!:4HQ%ҩՀ,y@4ZKVyF|r,ŭ}HL;Xk#/|sոW:3=CVwAv榶?]Y\ڙ8cBȜCXS1nژ~/>x`p~ͿY…/.dʊ,˳X9\8vB|sIiԪIv$"rSJ#>Z$BT1Eiq7$w:"keH>Ī6ƧD2`g像!Ī1b)$"yvV m5#0'@7Wp;FWȄF1#|"!ĵR;f&~ˑpVAduRTX 4ȚN$-NR {T@9g1 wWi͒3.@@2REK(y RRm*ٶq5;Z)&T bh-z/ɺlVF(RXUeY8Iх#WDT{|R4p8ˇ\bԖ$E 4#| @ Jʁb(tsC'mI$1VF@clk.'>$Sdf4,ˌ1#o޺09=ucS'ySuϯz<[GOquѭ{wTLҙ11t53%&ZńNS''B^k23 eB[m(gt碎ʤ:Fk\ZP^S3D4\hlvqvw沼~$K*|o_ܭ;l[k,g"a?xїxgpTX:k7o:r̥1$6ո`j~殉1)RʴmAu'Ju]+TDI+Dh]sYDk3ȈahU|c l [kRb)@uI*˱T!ΘZr#dEU─je"U`9cvu30ZzchD$Bs96Z8s ##Ɩ-fLCNTtTB@1)ft#?*$vD cj*{P'RSՕ$PV$6ݭs&%fJ.TM 覄Y8FnzAQXct1tɉ udWZQKnM3olUoJ{hܮg_}=okc$WW]ՃOЉCDUY.?O=3g`*sRu B"Ňkso1D/MHrDLZf@UƇZBy *YGQ;C -?*+rH1r`1Zg)ѶjWįXG5uQRr 6BK B$ %P)jJ)sgm]#as! s(TLn_kbz FXވt?+&p΍>_>2)QYk߻'O{ ~ˏ\yPlhl 1( ]sM666Y7׿`OK▩oϣSta6$ hD^k]uA Qk%ED\Uw 52t:DT)4!31Z)\#hjK^2-GJĶ ehKY;B)R hѯjAjy=_`SOoE&)qS 7l ,hh{v* cD/c@!F@hJ;BFke2ODE J1DQ"eCr'JTgJ J>Hi3rcE *t֮/Z9t/:p@1'κ̉WUY-L;uLF2~?E[ӛMN?w;1[+]*,z+*=;Ὓ:p+Ϝxx]_}n2fJIj%eĜq!Kt6u]Uk2NcdҪs^l!1DYá( rW(G (JKb4FV"H5yQF9%Q@h"JjgmwIla <uf%D N+c b"! "hPLZI._b>phwܷuҍq=>z#꿼LF_=.9w[9پxM;&Ju]*!ةF13jDjt(k{^;y^yL_Y)|7}]дԬڦ#*;ZWӒ;3I/x/ukL{V,%t'ۉĘɯ hcP3U-jv~<ЯS}S$l8'YAy홙ǟy|}ʼnQ DO޸{K;]]^{neɾfjcԡ>ƝT'ԁ5ՕWWVIͻ/]|ՙ^x,~39xnlݩvq˜xm'02h2Gi))QZSWZȭ̜h4t cm]R+8E1P˜6ZP%0H=AԦ1xChe)9<#,0XcjDC":GEn]Z!ƘdZ^KqKt:Ee%(QR0WJ5-ܻ_ܨ 0:r@f3b΄^7]s'T6QL3q,3.Ck=ubznZ?.fЪPS<{1,*DA(ƘJ^[tw8RYR<؜I:n(UeIx 1Y X)1 5*kDAk!D]&svss3(RYV$kVq4u-W?26NL*UǍ!P#鍅3)I R"{SJO9$#R%\[۲N%fی[iDe@PDPVUP+!)ᔧKk+ҁ*%m8imcF |d"F'>* k-4SɨjVJXF k}ǟ:8\2G÷=wqXݛx`[˝tZv8yb~~S0=+}Z\vqǎ?s;]-3އ߮]yezITV2˂TdD^UU!,sb?k9MW81E,˘b]UUU:Qjn($_|6% khY%UG,y$S> 0˲<ˈH'\aS7sx<;뜳1Ų,m"jcB2(,d 1*$ 1Y6wڵm9nrW [z®=%J1quͷ~;0gT8BU}0c&^x_aϡ=^bh8m}H՝^Q)2k[!|׵V|KyUUqLZw:J!!@"\&`n19IesRL*m1qZkc}#!RJ+QYD+P1@5pQYr vlmf5AsݹIJijYM~ԓG?:{~W/]ϦN2)Rz W]wH!t:UYUv򼨪RމyH+@}dLQd5z,)ɌZ̔k%$rh{597 d !JF: G욪}sNv &Ɲ̓zn"$E YFĨI14=E${< ?mGvt+ܡHy%\ILhml]רٌd/HfkuF`4ۅRhy> ?5J :+OGFb>G'B$+ĬR GPU,"A@[&tYے ׃[YvfB%d\yeGm@Vta=&@H d Rs!Jb|xԡ5Vu]IBdpe) kvp8e4:dy/E;Eʍ5zTK'(,*˲YR3dJ\UJy1κD Q3g2Zn6}]t:8Z2IR7+HQ\+,:E [D}7Z#@g?eYz'9^w)#gVf͜Eb7DZ$?Do$$4fZl6k` YYSDdDF6{9{ﵖ9,2=Ū={>=ZȆ0dM-[0x*h'opoɥ/@#,nKRm'DΐV^o[g&"3i 4bvpIri}+C qTsζ[Zr)FQrUBqΕW5!Me!h@UULD\7D6ʗZJaCoWXWp7²:Y]x7_|4WnfT~ЕvbV!:'k0_=ytK_ҝ_9qbS}OIjR>^{6G|9g1&ܳ(|l{v FTPFQlU笕Yr9gKL 1Ԭ10_^ \MdQ;@d3_JvޕZw[M+oDhBKUpT)5# >DP"Q19DQja+'"15%~aZ[;.'!OŵԺ?*^(7^=={{&1U*@uEի^o&o{*^_<{;}ߑ޾]pᵝ7eȆM,7|WEYCR@mNOψ0Pj6.V)G ΦՑ<h_Tn4Q}߅s֞kPCѕ&iAbN}3ӏ[[;wnK^}?gY60>sֽ6rXֿN1 @!\ * \<Ƹf#wfGTk΁MYEX*KVCG6]6|Sz :w^ È^6jĈ:ި m l%"Јd/$)z*gsa(V3&yGJ)\~p KE@.[;-bkw,dMzD T/ioG;[wK?klwu;_yѺf~λׯ_;q@yl,8~zģoy{k{s6v^)Y[@;qfobD 0d#O٠)K!U)9g"ʗZaZk8 9(R%$U;(t] +6q`qşl#g"X?gSZԪ"JiAP5ms[rn\MX 6c[m&/7+쇩E&y*`;g9fc|fOw CE[ Ifl|Qg2 )R#AB'NhVUsܙlMJN\sA&U5$9SO/Ga0d)uDNMm"m\{U;uߺƝOj^;_}b{淞/zl6~f'2 ;2HK)vOʥ"'ŠHL9,!}\VKڶMuB@ZUUXi5=N0ĦBJi^M{\". D.8H9gB20L8M ڶ.RAe|;_r"֌ցDrcrTU(hqa"nz l`Wљ@ė9aABL*] mu!a ;n!ڵN  <2gΥVnƂV*XB>2Tf#խ(CX`k6@U~xSឈcaN>x#mlZN[[ݺ3Z kѡdQm r,c?dTwZMKCjͪDl|5ZOx/8šѸFdl&Mfʤ^j9kQQW"sNAYK13: +Wa /dP| <5d?ywڿ헎pvKo?o?;>ğN~'O?ڻ8"ʆc''*7䢪%o}rIr]}HQfQF\w"Z1ȣ!OnLxhjeP$^-\ ӽ,@5mb_)-q8ٔp1B-ּ-\c't]yHSj*Z{opȫh*"̀ypPZ l>38@!ڈ$Zmjd%0=}O>W[fay<=>})8,=t}缂VkB,5g)~@~7ݺWZ>''o~{o=iw?}6g`,V7 a |>z&ﳍ43+7McE+9 " **uG1䒌aF1E<\l~, bkN+j-Hd1Z?ZJEA%lG}N؎B֫ \܊,h#Ps{_J!lDYL9WkJ),LHa@,FhV>{/y_7hR?ҿ^w~'srnq/gFaJlX!Dᡫ= ALZXbiK۶OXmpD,R ˣLNd @?MB8vpY$xVzjeF[8r)Eu}_J>a*+F,. FPxAmBY`S{?'Su) !?޶uRNOh0\c P Xa> ◿pLn@Xuᣇ>[n<ޓ9hH92+1k-kbB""HC< S&3"-0\re.%#94k.irRQp~B bepSsJ:?WXdžXDB.YTHs꘳b7m#v@,lZٺj6dn R'#z#k SXJpqΛWB& m!l}fHA~DD!Q\keVjAJ!HJz!59 F5{uT+ClQRKBa@$w$UZo sowG\Sܨ}={qq<~8u@Gͷlݷ^-^8=?=eswo3+CZ?wl|G7~Ͽ76{@r^)/yx /y)z2nUf y$ X_$kƦ[zu:&mFQdT"< 'EzB)9a1b9T$$@˽v"~81QAbݜHBm1b)Ū;d` YPnn 3 jU*iCaثbIR` 'Ϟhwm_Oѿރ@-OB}(t?o|~xWo~woe(EV&1gS69tCΆ?}pzv>kǘ/ѓggˋ~3/gߺsM+{Uu`g5j-D: YmUrd)D10޹o[_rcV&5yVP 1Wx){~{M1h*0\E.`T?pPAX,P !Dbg~vz# \(8[AZ6ZM6^bp Wg0 Rν%A,o 1)YR!hO<)\I٬穡dar!gH FB1ESbvջuf;oGhŘ+V鋳?<;?OϞ+q-[wɓ_~9w~L1A2}aj:u"b?Qr,8270 fkDPP!R+W!447-gS._ȩ Dم>92c=\ka1PT+9:J)51Ĭ sɪ6JG;G>xaC.K,@.ob>"=4+2`DSl*a{{bY(u*Wk@$~11 Љ!LmCذ}, r1':E% b) B1tW@vuNlf^w!8$9F e.@w}TRkI)$d_Diڻd&Qsk>PnݼwSyykLǷ/W^/pɣgwrp^2lEzm$e-y;{Ko߼r⿈>^:QŅs>佫RLڌa@Z)%a5PrY0fb1ы Tk-m,kmf#wpіptۉ^,qF'gMUtpܨ:<-2F\U@=GG/UO),+|Υrg{o5@PvI6 ܢ&=(*C{x9/c#Dc(lh*ªzPT+{DXYscNE\ny!s5ЫG5MRZ޵9 PKmf M>gGYN/ngggK%Ǐ'<8{}yf~!y7_.>9xt_{oߛo^%NϾ][p y..XJ9GΎ<6,\ Đsfa˾#aqYm}7.O=胏x׮9НcJy_|ѽ:Lo]׶c >ۊF@޾wW;ٓ{DZTy/,7oݽuY^EK)syh6h  )X׸T+[;<3R1rᔚ7 -YggIM*,"wozliIpRo8:cT^}4+F<0ZGt)bԙB&R"r2 6m Oj8unt >^(]A7E` BXQQq6k\k5%599Hjn5 jl%x Xݎ?9:zr:]kf?ceWV=/X8y>8:9;i~kN#bu8sYݛ?i3}ɇ?׈U3oJkeV68&5XlK-X%&5Wv)yX*:ShjgqP+`#45\a GFZߦ"ɯ{/n̗0f|hLYf3wJ+ydY+q@G$*D!D%˩PTPVRhzP0]nCmSLW$7V;0&:946Ok/`8qpmljP==;+۷vn۩I&]MLx;_xub&qO?o=x~ƃ{oލ)N W+wN6V /"ZѦiڦX(Ra) K9hzZJBƭJ)}w]NMDX./7+s!$yfwpAaFwirt|^fzu4=S8Mpr'DDZ ֖w< @wwwD2%YAYnWEJ:L6[oN'h~!xZXkI\pDػ ʪHxgvgog"&!R2u]$[-szr*mۦs)}߉(9G1&+3sT;眰m8ƉlCM)=?x9MPY $e6eW'L^7]6w;`OmZlbwEB-ljԳ3\4{{pjcl?W&9'Of@U @Dsh)Ӝ+ M2u S%Eٴ͚B! ]9Ds!/LKCYzp͕#T I2уڗݭ:#,7v*7qlx)&?{{_+_}o'7~ 7b /]?;:6,uwוU$:1 ^z''""1ź"Rbw1ŜckJ)Ɖ\SJbu{Ejnu{G.%4\ hU0 !Ǡ1h rD4M[7,OF"µE,.(5&`Z "PJI1Pz׫*~Nf=L'@T" %ɏ>vo뷯~;xncL*?ۢW+7\?\lR6mE>UTmng}i2V(d!ۯ~# ]伻X=AYCd,H [Tgv5 Mm͋߆mf/N\#Gg<~W&It#xslM"v2@':"Zb~'m=|dDS0ה"*4ʢWiA$6ʼw |Aۼz#UFle̦wn 1 y0ϐ"OV>McCRRa? 6CZacX% .WK|۶ɓcPػ{\$SVrpﰮ_?^v͜˯l]ƫox}=BcIHzX`m!\r۶&V.D v]b0x*צI!n!rJs1z]JPPH)-XK]U{}}?*5sd D䃷vo\Pr;vZ{;wF9В+4-eO(oIr:VJ0 )%&ģScL6G1i/9ﻮ3p &"aӤ&H/̼f7:8b]\JlRܸW#M=\V}eU5RK! 5(+MLxjOSLYR)%Ls1z%Tk`S*Qe @39j&J+YW6pD)PU"Nnλ޸uOt|=?׾zxb4mӴoϏorKVb0>bg1_|_vE)94Ϟ=jlRBn|-/Pa rIV[zչ0$5b9w qGz6L~ThJjK+&zl̗a#Xص9v#B;k&,uݚz-? m)!SV+.+=Mmx&yp ]đP fRZۅs|ޕZF!R8FUDSE}3VQu0X2FRy{#fZ!Bbִ`y6GӳCURp^[|򝏺o~`7vކ~7U|q~_w,ã|K9xj-%$CNJ)V@j r`K N^D+&$m|~臒tɑշ"wuXIKam(;xo]p@k.tc3QUE,\<"rNsXU#uڻ:`S\q1;V38Zv P=Z9% ;qtYdl{\e[5o a<HL0EsyȠ*/~{mۗ$gݾqo_ۿ}{Ԑ ..ΎV'K> 0f7&B<Ϟ7 w]פi-4Wr *FqnL*?糾 D?9S`v%܊N[[m˽NP7a3P8$moi˧y<A{MmU#?ή@`} n-V«zEПxZ@/7_'M[U Ef Q6uRJP&nFH1yN#! /E?Ub4Aa03"d=(BXyv0KM%CpdBDbWxw}Z/o޹o^ʭW:q؞ۛg,ul{wۋ~'KcHuۈH2 H8U`H\ZdI1/y)ƔJFNǭ!X£ r!9P+s$SjjO(*ٜpTV٪AGn"!X@3Ui/;#s*sQ;rz#fٱX{Bq4:T(X 7N;2̲}R)2sdIw?WԦk|Ym`oZػUѻ?}Z?aPɥV.9泭ELlz b"w1軮ւX 'o5k~1Ư~ f4 Zd6ZͺU):㧽@6Cuz%,=¢~qҕ=!sniUޅomg*\\\T/o 8nf+lmcX8y%&W: gh߯~NGK]Rja;w  1e UTQj5w&#gO;w}gRr\yڔuC8>=mwZW̛DĒJ[_mjk~g?xƛz뷯]uϾ NY{x`h_aϞ<!5 !Ԥzm(Rތl(f{ S&xι!Y#bLC~p!@z*`<#;4_Y3f1y:bMu0r@u bfE"Q>ȢБ嬠@"tG^A`Cf x;J}Px>IMZb%{Dʵ֦ikf^AE:H4%Zӣn}n]28+y_;oԈ,JՅ$}V f+ IjM-Am&%sqy%F^,!!2U&0 9Rټr3!"8@al8ziJ WPBFwi mzDZKy缈ZEj)٬M!S{6'Mn 7/kȤyB+t%P@gu3Y;#Lz4MLѦĞ !R*sU$ !EjI0TBM5֐#?`YSo~4n+ 2:TX6]UXm.YXr)'gCO5bmee'rV.XKaB;WڶA%΋ *m3̂f`eDkPyz3 9缫oUءS\2W!WÇ` Oϟ|;ê)9gU?~Ǐ?줹>_m[Umn^M-ռ̌D7k>;o>"/ 0sʕ4ňHΩ 0so}JzɿoK2JkCLI`YF,n9+Le@7"th*K-"ZU:keR|m/ݩ-+Mzc sM ^ 8&B*rÐcŭmZ٬Xm @F!rI cJM/zՅcއ0:GUY%?vj?;M)&YNdt=~§sΥ6~i`V,]cgeɣg_9=,`~Opq\- _ؿrly>9SQi x5O4%Y1%XEn mx*. J脥JU.`NaJ)!@u@ * *ԒmQ2-c)`Msf dOe4y7>\qd(Z)R۶T;Z-`<*8)6Q.8b11< @!3!hR!Eګ*̹do0==ڿ烘T}i|yvzvg}Η׮~ok7mE >|$w%ȇj#]x@iJ.1FYU#y /c,}!¿ nP'OtM"x:vB*Sjr= *Ӂ{CLyL][0֫j`{vvGĽİk=Jw^}n]n'OKu\OOqr$D9Ǥ0tggw( !Y7;4 % [OunXff~^5 R45о9wră,̳+s)&@:V_ވf:zA[= 3eܚ l]As,21q g<r1'gOR*3T :و`ked#缝c<9GjX,bﱦŮ6$s>@C~h)9;泅sT &"9'~_5񦮿r^O^yPm^r}88=>/^>zq[p>u&"Pޝl|~z}0NNL|r SZנcy˭sޓD~CpS:N"~,z&xTu $+ :ekLKf>UdA@ql`y2͛7b 8~YDXDq}_ >3Q,hSd36P˸%ns@{Q"r\l0ЛbdeUG&!er`<ޚ4t{"mӌ{+$I$o[m/~o_Jm gꋋ~蛦|Ԭ&٠r &MҴMjkz?Wr7mڽ{߽wo5/]?vwDG'/p ^j՞Ӷr2[Sdu=itf>}Xm)Hމ0aj"۶YF/Q3l."*d۶3\B=^ e Îֵ !:O7JC  PTm,hPӈ6~6 DDj%)XzJΙMs4`'6(:!sn>b\YJ-7Mc%Rv(V[j_˿R3ɭ;7 O'G'>ztv|ӧONO/.nu3tc{tLrMg5ahf5M ! ]6VrzvzڦΏ^Z cJa{ Ӎnq Za} `zw }WSS|,Wz`J$O_U+(5!FQž+U4ʴũl^ ";)װ8,MPB0rDebyb5,R~-\jRm*d~)1zą뵪mkM% ;p\%)Ce!9󁄅P1C*RJ'糶]ZJs2fGU՚s0RJ uwXI}χGp|r?n϶޻{v"IV/~ßnngOJ"Uu. K0VKZ}x"g"Q۶vds@1& >zQuBECpv޷8#D肂Zb3E!u-r^D,#4 EcJQEekk^Y<ZlJ̕+! *:bZ4m`e4MS xmU+\BPBrSS>zs5gϥ6b'?q9'< }!8ja{rΪ۰^ JDON( ʹd"'|Pu=x\rD'pbmf2!Ƹ\.̊GG/b4mxq\NMl8ZŮn/hasvzF _G's`g $wm2v>QQԯL9@-3ߴľw!Λ& L|mxAF4ma3!+n8B!7a[@@u]16ݟYB2"$ }/yBDrOM2uoZ;'b]Õ܍H% O:Rvon&PJRܦbL8͇ew̫;}|ϽRj]s (=~p 䖧Km sgf"z^XE<^?ewÏ>bkX<x4?=5O_<{2ߙ˅ux?!lC4vr看q,r4Lq6@oLPth%ιR Zږ(vk&Βe HD9B? x`mq6ď)l*)0]ET>akb'@'dacұT ; y26r9TK-iԑa*XbۉfVETXR+s䌓1=N2+ XV1 690Z֢u}&/={Ԥ\߹Zjrj?Zly|tr~z~|tG ^8پ]3ZCH!:$;/pe4~yKBD!0ߚMSRkA2''g;;M0Zy6ۙ:D;r.*49%{v HtHvVٌv& 0rb)5fGm3dW/`/eONNEٸM: ggV=3OB@V2-v:aN+yQtlSL*]?Lx,rs%ayލN!t̎9wzv[[ Rʀf30tk99؆oӑ*¨b9؉M$GN#n\@_?4{+ů ŕ~u}K'2_,/aeMnezQ@1#09=+/z/D^,_̗o޹ٴKA[\ cgVU>mi28榱M'sn,K6:ur8YRJ8텥i\rQ[h2D76޹Zk !#ʵUPh Gh2 CYNULy LmZM,bluD9/w)`$PbV1B\ ,Ι=~0[* -m7kf wѣo+mhgƉ`nX]VGϞ==:>=9?;?9;]; no|bTmp_s66\.!Ryn\;[?\Y !w^r7r*QFRjR:疫U QURlNI7E e@Ql7!Q`SA\Õv0F<`B*ih+zit|_V6v#37:\z3nomCqq܎wYjvB UKަZUuҶmȹVKUM G8C&B'(*T1VEPGnqiIq'ePrT,{{ۻ/J.?\m 0HH,.yMK ;r1F"wvz1Eck @9RT{3[""sU\uOb+BT1hgpIVmI,;G%JF]UFoj# %l\O"1}Z=R椪G-x0Zۦ 1(Wil<>fbrnJ+,\r:bb!ƹ!,bĤZUa'g'w^Do~ǻ[;[Uu(yխ1oU=fC?38# K-{)z aP5-3[rۢ3VR/oݾdgA3k;oǏO.s4[,T!3!VfG|>ZC R֪ cJ&fP : &NׅjSʎ&r)oW Xy+mM-]f߫mZU)!5Mf0x@A!L"?6`2SfSeP@Kh.G?Un0yɃgzͅx-{}>999ޥq P3n~Y39Rj)4)wbJ:, Tn-,0mRJ1uhK9 Ef2MGh,ͩcag9*hz5=JP<RzBϕ+zps@)i\#2@11c8_,PAT*Wk9mʀ*,k)MیoŪ;Vq||ܟi]U?ן?=[| @tRUB=ʔB^T.fg[6؀H+kԊ fV6_diᔚX&ھ͍!Be!GQZc nyЊ-.5IG f'*\GjRzds^"= DILJ0)6)YzaYZͪJ IQ3asm(<4)|de\;nRcr u:eK+bۋ5>lSaBaAX\KŚy%q9:?<5(SJih؄EB ;"e Yt|^DaB! kS)*˓wNDyVS"]#J)"HA4u<dzoɔH=#tZ'.ي+ t:~79>=L| vpʺYIiR,/mCbӳ%B te NgQqk݄ha!SL6Ms.ԮsUa|mJmׯ+W""ľ \.K#.x;Eh(x/J6u@W9l# ,-[$\/D@)\2!!`3kpia"l/^(T]l_LwvruZm%b4!ŐK6v}e1.4 :\B\* Bh[Ew,|lRmJlvքCdN;)T4?mZB u6Ԧp-㾴팹kE$qcbEvހϟ=7V:~\dUWwW 6 y,EL1ىUGJ嚇2_ګsG:r@WD=zւyѐGNONNt6_/mUKYw=R;k /siۦy|ҏ씅 W"R? QG>T461l7 LڵNDU1F󘇊pՇMG?1Ֆ~s[hG>S]ӴMYCq^N?4I,\o1;*EwnݭC"U.l5Ʊ @֫!{\^:r!ũ-5bÆϐ&+k pȃA c0Oq JZn^D7x看1R0t>DÞ\\\ޞjjȕZ3E$2{DtŔ8/%/l]}U4]~/vvv6g-'u_~-f\&t6ٶ-RTj鷃H"l%@ҩ" J jf'r95霍DFs \rKnJgh9V#;g!z7#+#sh;*YEHmǎ+Z%s :,k6%ZBa^7Vb=_V:*!ۦ !VN)#}: W#N@ӳM6ͷ'y_Ûwn&UTQњ߷wnu|5 cߍ ڦiSL:$mg/Dw]"1WPX^,s1Į[?Ud @heP$Pl9TvZة:+7[줂 Lж.TXŇX^0 7@!e1Tb9U )l6sާ1EIKL)tOƶi6joBKVY}/]bɬj a6r!<0WoUC_Co .*BXl- *DZ7p30KL4oM/b "sKiQTOOOC9Rk=j4s78$1&l=R/l|1@Udtcy^3KzPuH0 i(\ wy` c>;稒F+%٬ `[o;`kTMQ1VfbJMGs@">I= զ:RQ<_Qίpls~UؖUUl6C4y=;B^c%-[̶Rc1c[|1\r)i+^~p䃏M߹݃E~Ϗ?2)E.au-ΙȤ~6-Wk缹W* fmsEKEp-8͈hZU(i]vs3~ͽF0뚑Y B)5t.D9"{>u`ވ1a'xbF4j4RrUX%puRXڤuݐ{ry/}_IMBr3l-#mSwFrw8sc[sB}e9CRJT$B0ZypF[vY1زq<"lt=7v?H(XeY8 ”~Q/zg҈ށ)_%Wl8udS3~|Ds4,o dYE]}_j)#h3d\yI#iQԃ/s rewy۶j:0R62j3 7Mc"*D]- yʕEĪZJhq7B>D䂈p\nj~4O;~G~ԯ{T}51@.H|ډӯv2Rb\!GO)&z6&O.e\U:+V%ZJ0pN;+` Rc2` ?7B 2 ,%*c^YFbNΙ~#{PjIGEV8N97u4&|E)ET2s΃1|pB~+/;ZU<1HeiĜc45W7iUK.+؈zϢRKRE)+:Ȩ잟Z{ϔ\"O3TkvDJM;O@D!-y90ԭWM)%}_Ԅifm-lBޠ tFKqE?(R=W?=y}p>ENAEyr.޹U$/kdxQ'A7h I<&Ԙj>::*t]kfɾiK0] OmKtKxu))A0`|RkT .0 }[bR_J1E&!Dl>K)fmiϞlۮNl4sε;3Om  J)YUeYvBv8~R?#7;~d*BUDR)P$ii2sl~sL$e{nεf}--\Wvvv)ylqYeYbӴ鋷͌9dVKԖ%31)G?/~;>y~}y=V'0Cf`6ǎ aqBkRJZK-\=sŜC 4W"OӔpZ ^ *.0$50'e~L}ԋ("1cf #|zuzCzI#3Nü~xg9;!KyK41Z[mG,s,!2dѫM&Mդ>@NчؙJ$701% 0MRxL-,ۍ Ҙ9ܦ=ߘ8 RU}krBdYa0v7 S ..·aяHkU:ѵ(AWP-]X*Ԓa&\0(Rϖ4nЉWlf3.+/~#q}[O ȫҿ1#ԦiRQHi(DDEsn~E"[6u/VNE4N ) #xV| 1EV\H[_V +` Iek ;:j)4{_J2/ˠ4"""TJ=c:م9*CCqww/~ S7>yw64c|Ψ ok DoqRW>@ɥI3b xȹio >ar^Zk0 z֦*) U1 N!3 qBV[) 3m#W?zCe k'9V].Nc$ +@D˼ BHV VD,M5}B$W=iʺ9Ϣc Ei89LZkL!63=y"优`@\k%L|1,sCQCFrs= )7ofHHbYt?H[ kM/NId&4o.!<= Go%7J0 ڋf1:9UE,ϥ>Qkufk-``Ͷ5Pwt6vq"$F1S:XTTRRK) -zWr5KqU _ U4 !FϾWDbdd6a/Tr_c.#* MD?|RoFX͠.EJk~OgC!@.5I1n[&r78DX[J7 X=Du 6DjF`K35=T7:@5S&S|_+? QFfk7L  Zi1NDrΥfVmҤy9dV>BW5 $^~TVuN)y9aٟ~'1&K*y+v# y3hGzU-l^TJ^͖yI);0j"1lM`{'AشɝM}y}y XGM^4cq;m}1޼| /@1yYN+'x4gKV="A *81&m2sBڞӘBN1#LO'O~PQ1D7!qM}1ӎS HTKg*!ҡu0V{df*bzٲDĺM^WUُ>N& ͯ^@lx:  <;bp)xx 8xت q~s'| 59 pU-y)P.GMT!xX{;$Y5 ß~R ~8UUea^fBj圽&:J qtD1H1ljT/?.ڵ~\!"uܲ^4TBc,wq`C`֍F7P `Db?9=[6WQB]J+AAڲ,5e DMe&q}4;FԆ0MC10QYJ-4d?0Dt1/s{ܹXJ 8?z׻"OATǐl^5; 54`]Hfh `L`z|;)Bఠ0Ns@{/u9!~Q xs^dNmff:وJRhNzwIto޵D謎BSi8\j!9CH k Oh!ɩZﻅW>%ڪ0t3aO;{j n " Tԛ"~$ݐ}˫~z,M<Gzq /0nF?Hkvufcj)"1Zy?y6qׇ^p _H=s ދ{wnk-("1M|i̭xtBL#2Q΢8W/~ qKN];O.ԚP)bM) f3!xݼN@DX FD#D;pL/a-`$(p" Pb4¤u!BUV 4$3p<&p;3R_/s`rX|; !Ø9}j*bj9/8Us1{3r.dL`sHPΩvVvkmu:GBqɋ6[kf&R{:14ZW[Tw#{ci pv~{/죰:׿Ηa`qψ8MK-!N8ڸYDSJA!gϟv6~q\jл[l\O?N?Z6#P/Z!5qx!5&o . uTjdݙ1r)nTJբ)EŊjZ fTND gSV%+E cν0k-fcLju)U d#FX<=ÕiKDTk33mJ jnl18@U)hjID=>qF?:#0 /(}ʎ4Ŧorh/+@WI?!|5]S@ Yh*2ssi9IZ1}-(:W}FLl׷8ټʗw~>~Ηe5i5&˒%9eyݸ>c.sɭZZՋY)9 c$|Cm]8?*Xp>#d>"9"֒seŚ#V?h4Rixz2Q1 XDM=؅{ m|5֚cJk33rʘ#yUGȕ-ń1eY$aߣjuK!9xO1p5m)EK׾J@1ES];go~ʹI)9w,&# C6ü/0\/ץVUypv_&qPiaPRp8!T[qtEiPkY#=lÉq3@RrUTL xqSJvM)DpCv?V9C3hdG%x6MS AĈŮeS 7m6ΰ1Nww_U8_@HpGOL 8`ڝۼ,1RJ!^|釯ƍas~^a%~eIO=v[Iei"`'!$3l>ްL{ QrIlHblҐ rǩRUi|USPlqP;5iq̆qthz~{Yryf7Lz8q-<0H CTӜKQO "MaЮ&wE{S2;n6A=$T$͌! Y)s}TMFZiN4gAS1 R8U{bzXk!.B1\Sugɹ Dw:uUaCJVe[=Z|| İygyA+f!,31i8 Oi1qJJ1΋_pfԼYKʒ]eR5DEU4 ɧC!0qOaUt>=({ V̻_v:^ޛ@}_K&4ѡ6ZxB$œ9cE"j-m 1Uּ60 ` #0Q{:g y+fRbf`Z?0a8+j̼mC ǰlzҐd|xvv0\U5qs)KqqJcp̋u.CJ8Lqzx˫ן߽s7R1bi1Ebl7w\ !3^x}[|~Ru8ͫACH) 1ŔR.YTqmR<?>r Rr*޲̶VTfUbGZ7ԓ: Df @"L`"{;7wL|C"Tەa쪨=bj(XKaJRJih [k~>%fOs0S0Ts!!B5Q^LS11;+`o$1֪ZCB+5RRBd%!8$tb}/nf !DuQ)-44D1)9 8GDJ΄brɇ㑉/')cG\ݔ{j\b Sք}a8;?̥sXn V[s= hzc9/DόHԤt?|\bJ1;dDU!Ƹ__{rg搗λc`XӼ.V ϭXGt4׻.Đ!,9i#Rf=fhv@7#fEU)iPbQqRbDa 0&y,gk*DF$򧼔D!֪J΁9P @\fHG`jM$j&t)Wpp4n`["BDs ul)%?/c'[JCs6Gyѓ;w.g4gpv4$QwXlsi??T¸S ql{nFTkDxMΗb kSU9]Ikr.p*e>AErfs9goQwQ 4K<;}tBhj=d*AD80?'V0/NB@vZI'wl)=CB/ nmYiͭՕ " J)jƄ~(]BAu2to7^M l%B-CP՜"i8޹el`ߋ4|,LfbqBhf4)Kz?:v_+:8“14~"f4NÊʹ!D3ԫ+ bMi$)<#F@6:GTIT)bhM8jG1"1UU|,}FDl 7|)B@b4/ jfF9>$0izSK/A4q-STQLsIE;QbCމ-Fpg'e5/'R7w|H)ߥ' ]pH01&t )497ZLc镐fDDNdMkMT VImuDUe`I}1ZA`MkO쁩F.КACk=p ̴ (`.= yݏ&.z;!ۅ=DSWD$Rku Ě;bf\O)&3  0BɅ9a: Y<ωv8 j;87WilϷ6*/_]ZKe%e^Csñ<\;Qfe6aL'~Ok8)h.k hR10ntv pY8Mm\1ɺp"9N&Zt&;c}0qH`mKEF^y]k}) +k3 ֚W5CXDZ+^ZJ>U54j-_?8z^[:ƃ`qY(ЃTl'kk~LrD\j_*UC:j(P `1x+DJ:|w-evunގe?{y_yy^2v7QO3lk{,,McÓ,ߗTWN4{ h€˻_ !{vGO!r HLOP<c F%E wA[,f8bOdv:ԣ*DBm$;]?y9{d7/z<& o\)@ua11OB|RCjAw,b>[[rЄ~XlBHľBRJ)E1|EReq&Gr&Gͦ⪁w!HT:Ձ0 CJTFYO4ć>_4vY^H8m6T&1ٴʲ<vgsU]Ě! T]5ڱ ]Yͤ #B ޳]mķ`2s`n5,FĄqH>>E@!>|&5Q$3b>3^_]iH !zZkQ/f6eVqL11.qEL672zY"SW)dj9p8Vm滥S(p~{[K-qڌ+tߨe)ӏ}7/~كsDl&'Ƃ^`cMm?!un4iMLVUGx:|(Za6#}?M5ڈN1S^fV3&Ԥ!&n)%FWdpC_mmOVL#'e98 " 2]I-=պ_Nf|++#Bfn54Di~,aG `&iu.s`Uk,9 c Ʈ5ZE x"P vi"D%伭\J|qqB]t7e+Dki*Jm{6W^xqrD0xō8H@(sxX SD fJ)>Q#UqYfS i*q:&D[nDnkkɛ)W5]S@X@UV*V\sg{i ~HCWQ̘P1Z Z_˫y Q4+'Fq1Q,"4gC"҄kECZjk4peUT7O{֣}k?SS _g;Bowּ "jD!JL}0S n.{4gy HX76?w{N3+f!GJCdyWkeϒ`D^Lsa1 5x/0 }3f"v$yu`êFt*~i`p2]Lj!gc"'kLO)2;rcǫMgϝ97VhN!n; cp8#b.كd`)E Ozi6+!puuugRT ӐR`N&8z$Ս.}ZY +M滗ǺǛ ^^am.y;Hjnt5/Btx-U `a߯"WDVCѓ ފ N"No8^oӘ7WZK^{QFTkSVka٤3nwFc'Zc4,or\i~& MLf|_}|z7-ϭ6@h)eC-wjeE#?s0si4W)o ̠/d`CxFGV֮VZi S ) Mfx}.W:.cb@z9h0ӄB^Ap<e ]9?6+yO+V>5ӬT/y͏{Px̭8Nnd)4 ɭiHoJi!Zq#u{|C{{X,G6D4qٌ<0sS@.Mbe)aY~l\-̙$绳 96cp 1O3aR*!zWCr*ZkUWnZ!FMbJ B`&DXJ?DBtfR6MO$s?WWTڤwS{iO][7u5iͫwG"xg0tGH0L C$yoap ^0NC`iG8a;8 n=?1}EU^rhO(s2Ay@Or:^u*d&>)Yy8B$2 CkZkRiBAAp"~ pX[[qsݔ8 Λa"crփiqLl5@a[O۫i oZK5\h֏ڽxuZ&fׇpv~c>q4(@6V)$G>P֚x΀kp#ĈZ[afjD+)!wBm nH*8 `y^]uq<۝q`0S4SbkMv?K/v+%g_nb Nvz(eʝZA~FJ%ן?O_|]nB_v|+; s b;(UL1iS[楔S"Jc\O{I r`7Z0S+RUUT@]PK15&rR3̨;OA0 @H~rGNyJ'Sɫ]0ZJ\ϵUv$n߹sj8TKi[#|ELahUZhfBS/-KS!Ę{(9.ZjsJ) gi>' aޜz2mCB )>v "a)0BkxJ]dgK`藀-?~%J)y۝28D#w#Rzi5&3߅.#9W[^}ayJ4AD|\6c~񑂿˓VO!Q~_aZb >@20)51zcX|CjV[E[;P^TD[isZv0 )8y޽;&n6~11P#8&Xi*u+B )&08p=~k_>'M۷L%Z\kG.'7tLCJ)˼xan~^Rg-uY#ӧab]ro]A1Im9ډ.P/a11zfTTA.OYHA=H6U&ҚG۰y!AI.]SA1`o.eYc)%#3iHAGJuΩ~ ԇS6 ni # 1$Mޫ˘DB`Sk"`^UͭlAfc4JfEEԊj`6wGJ!01˼eY@Uu>.1v 3 `4MiOUz}?{?deiK:Җ;8yyo0e)apFlT4 %BnW]UcFVf1w<bL= t@}3@v'}sQ0%{L}4t 39J31FV+O R@C[IJݔszO׍4U/AiqHu#lHCODzt{@)WW-=,{5Z[nNK{bZV,!2cJ)/:L" DڲdDb6B1 koXXսbHy u #?o{W_^bLHjpҚgf3 "HY:m<ײnK-˲]m=ZkSybaٸ(XwQe@!02gy lM$0w;6ڲse@DU_quibq9+Ę $ݭ2;Pa(9("~Ʒ@&^̱7D6bZ+8 )By)@B*9#b1pwsʒ/_]^|ٳ_mlOtKq㐆a8Mt{[=0hMB $1RjiH-9W[. 9D rǬ: o0'/G@_~K_0S&T%1ݶr(cpKC@Kn]7cw"Y3j8ny\CRJf1~>['"AžKE{6mMt稛NH 54P~W>mVď20f@ zd!bF>@1D_ϹSa9gkxxj/qv܎O~{o//wB:A=.DjkiZk)ZR<^[K+M bt?Blw$5t1O?z}v4>79qQTR !puyjtqqR8ĬP"6ufo  [Jna4ܝ J <8n-E@w4]$$38sR3(&3i/i j @* !F@WUDH1bZRb~ &C;/ityqsΡ;/sլRrr˼\ oB)޹ùΘ4PZX-o|`jnED @nz}䢟֠vgۻwU4 KffH&mYs9nISkMM1Ԋ) .}0s 8*73Crg*K[aqsRZR4 L U9̌j~P?tU.xv1T5S1ijB|R[:ٍ7=OXk !ǣm44C)d!zqi:veLbPrI)˗+5[C"bn)Aiyq+c"DIR;D7ע"/>?_;F_^_]_aiq8RՋZkL=2smGg_ SK1mv͍9m L;YN>F5%~W߻_`zl@5koFf5Zk ɠ/7<[ `qeAdf.9\Jf  Tws&JKV])^O[Xp;Gz: UԷ`v<a: CUrɦS,r^z7s@4UqRj"$.L>TTeRp8ߪ*6 #1 $UwTZꨣ?4&xH⬪#P AG 6ĸ{hˋB kmblsagWzi:楔 o;w/Τ5/xqe;"ZjJH1FhZࠪ6mx8:nZ횊ci)C1>-E)VSP1ڬд9rCujk"vNd_zѯޡOץ`)nɡϙ= 撽vf2B))iRD/>ڻgg4P!r\ &)AՆT;ap x+[Ni@Ą~!xD0G߾a&3n(]9}?>`Z[,Η/K,ˆ.?34w&(j%?LUSSJn^ $AD`}C4֓7yPZ[V"+Ds c c1{CEsf>//Y2" !0qVn!a\Ź] U8pYf?$Z~iahOםu)_dP(Yr3$"gi^=?ni@fSJii7SL18]o`1 ~|ٞ9?Q{kt,DžC VRrq@ qF94`EVG8]W]Ӻ/[-+E?_>_u`3)ˆ8" vrS@O+4..?Dφ9ÒgUsffET<{7O4~X+ZMyRքZWtڸNזf@("[-ҼTDbJb(cLhgFQe3\kȮ 1FQ1ՔM!XjiR}z "^YG!Ńr_o& )- {wTDq\2sg[JqH(3MEe7Y'hO{v?^___,zo7~T>k ޯdhhI0U5qJ3m6`H2X:}uͯz7)7uQ/a׭V@`G9X]4_U!dufa"2̵53h1um =?i*hJҊ~ZrM=rOH󲘪SVRBwi& dhUAUՈٓbi20M.}i|ɝ/եO;Cr,,4Lӳ>yhURܞm7iH8 1f ni8N! C-Lo;Ջ?ޏ?Jnw^%{sw+21mw dp#F*M[SC@w:<1A04pi) #fXV&! ฮA4ic}-(8! NF $@&P{)Z@^y[M}]R`m(ݚ!GMu$|>Ll>CJɛ'D 6j@J!sO(6aqGhbmdPVxt/|ޣmvaL!ns//_~׏{3KẕzDrHxNJ!`;AU}|\?V6FGDZkNa&HjiT4|bE{޽_w/ݿ{b)iLgwҘg/kiٍřOD 3fMMULDRw#1+5IB>H "f^L͉ 6Rv TVj]R=df L]޼';փU@5~e*UϷI̡Lkו簼 /o 1&5 d(9ؾx )2D܌6Csެ%ZL}ٰ^=zp{}_M#K^=}~M_1HS ̀1Hk`DT_Rʫ{5Ѿr.m*i胟<̇yqw)p-{7WݭKVq FZDB?3c;.pJxI>aB[Н*bNP^1j~ Oj r: zw 桥Z*s!D (j߭[/+ Bw@s5L=Fƒl6ӲdomX iCJ.Cr^a!6BthGo ȏۘ00!!z(zll~>*:f3J)`RЎ1w9@Td3Nѡ,!iڸ C fi܊p O7MMbKm~r3LL(?/YsLZ=~+r ;O?/i;mwiz}y}g~ zJscl~;s!i,!&D4BX+4@تT@64_wn79ZJ-|6\e! iSs6Z4j!٭BÎ<׈k Z )+9_n0=K+_oM m}~uXU^:ģ#n nn ֽ9fV}DW@&1DWUu+bL:هNߓ5vvN>M¼^jߋuz-"BD$ l\QTܟn`ðs'R' u) lPPaC8,~'G"N63~o0-e>H[ZkRӏ~?'o>? 3DX"rǒsC`'!YBR`WjJ~KV[לB@LSJ1 /JtJNBl(FCUd?Jn\WME4YZ.F n֏k7Xf5" 1Gs"*ٓ]xhkn&ʰjaZGհ?ሄDZ,vA! Hl^)~WpKԻ=fYKkbܼƔRfbA13 yy^qp ʱrvl`^H5!ZJ=F<`&#!n3rxjsy+0mJ/KORW7/}}O࣯m\eɎEm,c$5^$vq51kisWr) c&|\j5""Ւ3Ycp}ۤjm5T3d&nwWw l?*7_ـ|prNNբ.NTS{'YjŽ( oXt+Uץ)?"Гk#buRR /.r<y~Êb?. ߿g#@7%mvBjj4@?fYKx9d!D7K<1${U%ȁk"L;ىrzxq:qj;U}M?Kٞn /?z~Uk{Ǐ=?xOo7lW!]L>{Ͼg _w>=DH):fdf5ŽHkjh$50B`i^X2='n\RN[LqVb>BhO"b`2ȠI#& $b`sT7:u@"ꏓB|B*$*f:3Mqpo`l)0 @iژD2U0 IIڛzx+ .Ԛuŀ&<0.(׆RT`=Rcw[ 7ɯ[S7pD+ P[+%OH,dCxUm>uN#߅\u ;BSp۬C z[LAfcy.8rKe "?x(jjiLDS4C"rۨb ")aSJ"-@d57upgSLثQb^W_͇xh]!ݷ}Sի7`W~=yɿeٯ^[!q6ijVfF"(]ybzEi`df@cZ9 rJ DMZ&*$u!m)4x?XQNF{##!@E 韎r~u>$MhYºGi(!ըUL֛!9-#TK1@l~o)&V[ cH!iѦ.:Xp8 Cxae7DSLh݇o}WO~٣w ӿCl=۾;3߾z}g_~<чWe|2ݙ4JQVMX|7Pr\yT:}q|f>.;OC̥Vi3kCƩHSQYm6[UiU D7~O|-|R-2؍ů#WcI/1 t{9֓ -8F[sL{3)Dd?u&  m70t|#0eYB 6WZkI) S fxD2ZCHj]DVbjE=D=]!peh)N$rQ/^yaf+='v:\k!7?z?կk:RcWiU{4PȇkK8zz>/ݽ."%#cm2\C=w24Wk/z.V |/k+AhH͗b7y~P8*y/F[9 ^bz8~yuxkMBj8fUY2SGҕ\<4`Pxc ^o:8Q2:p斪ִZ2VYyJDCdj4|m6 }O"ۺ'b"ڪZ0`z,(<BjRړ86Rܹsq[wώ/Gw_OϟA4s'?O׿b`&QM=`ADgt:/H;1%'֪S)F/ν(J`D˲p!HU7DN!DLV8?ӛT83Rǻ3ѝHj sǁ'@\1 a-MDnuDofCL5-ZK=??7_IA#E%` Dit1,Qf,"Uh;% S__|΃l.o}e^W/^=g<}Ϟ㣟{TUрZ4cB*~_cy?pאRM<b!$bsQy!ʹ#✗,fӿ񋧿w}\= lՐt%)tf\+=t4' TtV/ sxujs]tBA%~|g"h=ؚp<E8N/DHfR+tYl}Set(x HkZrɹ,O3ZT[sr1GI5hKm2ZM54qPr1iҔӐ3ZUPKEB1 / OϯI^YEp+7<@Sqx\N>xPW>%MŽ@(jV@8Nm>Wߟo>𳧟<-|/I&?~x:;fJ9ZJI3eLSL%WRLn^H%r!|#|G |?• qO0A 7vhS|>.+es7zvC_G9/k[k)%!B9x(ilr<amjw𭔯 `SR)d[ec71QJޕ[P1Ub {DXҫVa5)ihĈȁ˨cmRjDC K:L4d?/ա˜0owORO̵O;>Ž~`o;[{W/^MO?><3yu{\I!VTED -P4 5a8E ʵz{2Yjqƙ=fCzRz_ڴ:ÝKkՁ<֤5C^Ef^«"/ Zj_ZMO= T@TˢLDtXADjm\sGָ\9ckͫT稃}1!94/"A[mBh{~|u؇ӟLVҐ=z׾'>쳧uѝZ w7e)Vc fZka۽zګa; @) "r߫81G:0uY2!DpS|wsW+%=G+{%VΚrNڭ!0Qn"tPJ;) 8]s^8<r^({e?lc+Kـ++ֱA50göb\uDS!FcrZC#Qm$<)j)aRH?7G29,*jkazbJ3;޿˫WٖHznFd<;߽wu"md{|?}{^惋&Mŧϯ\_;yHg!Di۞mweVO G`t:5c %N4OۗR0TU4]JDL* 7Ӧ&_hc@X<ˎ%0f14u/u73@ $-m?t2v"roBlBtd1M3e@VlI aѧ+pZq kʬ֚眗姟|u/◇Q篞~O>Ƴ_OI1F@ WW8뱶:ߗk+Ju4J0G IEP4 ^__{ʴLC&14B1%{AZ}ʡ@m4?x039$Ǫȕk+xf M겒ÅB=ah!pa.ZzU1hZk뾥Ҍ!弬9,hOD8,e[JɞU;PJE@Qkw 0a??ه^?>k_~+S>xw܌ %;B41!>=Eya#83{L$"rvb#0nh=ÿE $j!7?87)qM4RK05?XDZsT,"hk-b)j}^]ū/^UE"l,?Ɇ"jm9.?}G}ٳ/~v`Go9{6RJ޹}|mJZRXi'@Jj!ʹjf`,խ>lVBUZA[|lm[TUͱdNC(9{䘀rͦƣcVB`b̟f D,١lziϭ> N)|RV; }U}~_ҳ/nϷo?^Qfws~qv̡!0̇U)! Dp8+(3*M$ 1`m-b0S,R*O?f 1tk(-N䁽XК!!!XQLamKAUt(Ąa˒qi!h$gJ>S^Wp=%V U. sp09RtZ0Uiq8J-9ܤ:F `YC8* ^nH/KUZ?1si^J_LQTtBB1ژ8x8aCV3v}x xً}va=>|ugϟ|⃻<=דeiv ?qUhZg*lfXM[<0<<4gȦ +2+uf -^dl p{'^1Z5hau,{[wXAFw>ssO[={ϼ~U8NFDk\UUYd4FZ<ύ epJ#'NqfYB4FǔqN[c,f1%Ħ?É"1@Q"b" R2  "JA) RƆQK) .;"#H) S4 ic$Mb.ekF@F&_9R*81!]mtJ)rD0FFU+R!S,pI~zEQJNٳ~ d{7߻us8ůxc Ci437/_WIv;zbeR"TtQ}9oM1i@aZVVֶ @ SH?οk'.j\|ӱ:P*L 5CP8>Hfx0((Z{cgep.w)/Ā1'nY3Ǫ )"mxoEB ?J;!&,vgM]Jj:a |ZI"*>m+h+f` >0 5M#j~,rRMw+6(x,Wllu-<")I@J'ףxq,lF (:u7y?v:=O!lx5uR9BC@OґZ=;.0z} @)%D' D 1-2 ^Jݰuŕ -+mj; @+$حmFb$L>*V&UNHt1TfFky!RJ(ByԵ*hkdT׵CknO2{")96[wWjw4UZkq3cF|~sss6S4gZoML&USۛ;[{;;mn zEQa/N&;w݃](iKn* 8 ZG@$#<r(#XUckAߦqMS YiEʲG66C{{%Dڨi_!(4J܉q\6˔fWfַ\$T27C;u7I]=߿`ks[gOhrymmԍژ3c;3K22GzRmmlܺ//,|Fjv'?L#1(EUUR,λ$J-,DQJK׀0UUUyJIdSۃzoڦuj@+SV1rKJ3%$m>6%zȘC)1JC),H))x^Z2ZFf&$ e J̲@^@YTJIPR`jJ/jb'RI+K3H5M8EZ[9"MS{p>B%OGW|^׽|z'[*К^WF1v[cG)̦+[7[SO.=sq~ianqvaeqva{M=ǟr׼"ǔx &ދJL!oDSQ[#@0b͉1FH01D|Lhm1""I6<1'8$."НS8jTHASx&ڱ?à @)䈐[yJX*zeLIU} O0be4T_\̬oqqNg|gNtߘ 7;}t8~`i1V$.E`QZIpd|ffBt bL-]F R`OvEb4Z'f)}K94%әNQ4B7jn)]Z1) ^CJUĿ!2Ȥ̒WFڨ\W|/(e`G"^RDm%H @D9/ޢ(RXMf) Zd<\'?qg>!qw߻}gy/gE0sy#v<80k!o>Ӭ}pǎ[Y\Y yks~M1~xTzϞlK`Btʰ_86Nck!$ B)Ʀvlh꺶FR]7PyQPUZCJ\)6E2@];Dȳ?/J1ӧM;n)Oga]dJZ:u`QnТ%x} fj<E릶6sM,K)̽^O xP=#+xBJ5(lb]!p3j-.U\&1WKgvD-A97@^"2 CߏEl8縝) BJYV׍VꪮJQK'7[^^[vo&dx/׎޼b\q\>_ΔEavv&rBEQ45uYX}J9qaN^z/[췄"Rd27_͏?~򩋧zoME٫ #B]m"&TEӸb{7H XLh *@ZDR mG)vBYlm v]"hmO*qؑkG[YZ]*zo\ A!oBoX/͋i;E1l_!PcRV)kRJJ4IeZ!!Mй&0/1 6e ˎgso?w$eNlWņA;^Ҵ(Kj~q,8ă)CRN#1Emxڡ;㡖Cqw; Yą ]Mگ:vDEW \M&J&b;VU僗XIM0 L[YԘ,Z>U *@Tk3km93C4MmM}bG^x3S!1gq~:4uUrЋ)„ {{{g̢ =&K]:u8ֺ,sO'>v+GW}č׳ANynȱiꔘ$56L|m)@|C.VbbDJ1Hv SJXJJ@JX&yfCJ)QY" " hkMH&Ҥ(gvh,si%g6F SK FeRBXdE+,@J9 )"0s .E!վ4uc,RuZ# (g)Yk3k!l^|z~p- gW|'ڱSN-/p{Vcw/EPsKNz}[kN[=\2Dzޙ󧋲hf]on3eq(C4!$k4t `Th 9JKlP@œY-sF:"%H Imm'[6eJ 󧟮q`, tik¦dq+5.tݢ!!Ԯ:t"%v$x"kyʲZ+FYVvi!A`Z^#|Pd#PӱLb^dRGEtjԍ$Hky0@N,ۚ&8L!ϳi02bd[g5Ɗ%hmQU5ƴuz՛[Q QMp üv$3k\(rEʹ5`v'q$YY]|./.<?z賩z'{n?zRZB$eh%#\"%J4=Y;ԯ"ExC"R X0)iy+imU~5&"5M#ɝl"0%.a$Vh1H%IiP2TD!BRbJTNd 1H;c]c#)kTr[^8ze5$R="1]Jj3Զc؟Y=usGxw>L&G;~gvf;}caƎ ԟTZw|V&Qdw[arhꑕoQZ1㇛۷=u?RKlw6wlmϝ\0ANB yuL݈!/)rq4,Lf!'씥եK>7o=dR Z14U׫:ƐcSPJGKO+XX^ {ɚ,3C[e~inkkt3"EjW7ˋuSqpdyk,ˈQ)ƶpQ )!J%*B1w^p[1O)2 \BȋB~eg̢Xi xO>DNg##+ʎ6c1"/<|]9=yE.6ʴ~*Ce1*xɑ@a!BD)&G>o:ݼr÷>4{'þo)-.]O޽7?7)SrsLәbbfͤUW}zLQ̓6ì֎NruSՓǏ<)"Ϭr=M[c" Sj=J0IXMHiǣq  yY}^M'LW#g?+%5GY[>´zL\9-prvۂDRJi("I51"E}tȺ4C7]"dxئڤ/ֶ+6!dRu8FQ* uP!f3#EbjiLQf)u͑tɊcfTz<bٺJɤ"N'Hn=xto O8%i(z`8::ihP\bRz\y_W͇W_?{?sYo2( ߞݽqGS'50B`DJ45!ȵVUXk k$F4-Mژ@Yn5I{Ziё#b@]Yu]ֹ9o,6f2p,!T,hfN)hA7>>w$ \3y; 奥[a(O:w'W,.?lho|:5;/wy$s8~/|wIZ˅3sWVX+ME9/Cg29ctB!!H w[DYRKR@wẢAɊ,Y|j'* A)Wĉu A"(R(rw11'0c(-eocb. 3QhSj$,˚!zR;C[Gd6rLM^N1jk|fs>yd4{ާ}:X_YXO"ʊ詣 N_, 3l/A!}%1)hn0wzo_~ süC"7?o_}|K49y͍1uSkmdJHKЖǔ$%>Y%WQSBKFSbR R#'1 cL!($qBQʠ"fŘE0!+N;R2DGli 0Eb?pcJ5j,T*3]ZcjC&ƴFFbF`ĺė%'ڤ{G O%ޗ^{ufvn?;wΟYZW^'ϟ II[ZWygUV)b:s̉3'n!Β4V>(pB+%& !zJH B`\*D+Ďƥ˙x҇UJ)LQIQk%~+Ks'ϟҏg=hMò$]^NR J6`[9uꕥ1&Hq :D'!H}I$J^IUgq}"3kYّ( 9KXS70Ƥ13zˁY1/Jz 9Y&": Rf]H>U`fb98[*RP~Jh\h3kSbĻA:o-g9V~'hW]^m䴿G/y񕗿ҕooxdX4imSl*7`" )QP'O \$H1F[{;*(k 32!DDmEYBTS)ͬRHڑqom&c): 6(SL6C NK%\[PR h !!Z` pLLP<䮔dM<N]zj N ;iX$433SSq$ZM&cpHVj'P/ _F -ƞphjXnP@1!huyZd۶ReV -`E*ˏikB"e/NARsb"Lƒ%Hi`2Dl[eȹ[n_9"Q-93?+_uZVǻ__mBrd#mܿV#%rkD 1%Ju"tL_zRkc$^c&Oܿyߔڹ#&2@^HD|!!( L(ձ@t[%#2sJ) NID($ " 1<ϳҴ MQQSS.5coZ-J Zf)1!y! dRY#:a}DU3>e(ȉVnÜܮ5MS36#;1:/ EQnHV[AyC*ESdnL 1a&I KKN6>z3k RH4xmDR⽗F@sJ29Zm$hnEbBvH+RIIy6OVJ%"&N"Ȉ8JWHY#s*D*΢uJRJfE*&Mb rWמ{yiy[[+]O㵧NdiWngg+w <[;vbW޿GTBGJ1#DR#[}i9yBƃG˅^9:d`  )y`~dT !-~k%`f A- .F-Cp{Ih ն"Ae"ï.<-|`[-h|VB3án4.2UQβ9 C7&5wDh8 !~4Hb7t^28qdJiRʐyg!<t8VS BV9b!6\R  5@2,n5P3CpYJ)`jcshY>Wn޹~g87\\Yh[j'Q"]]^ZwtWɊlK=x?ؼ}7w뽍v4cSLn^p^_]sշ?W?/8;?_mRM&դ,K$(R /Z:a (15S)>rBe)20= m(XB:X,L/M ݁gԁIK؇b֔9:0ec┦]}PZR*50TQZP`ɲM>dqKZc Q6FnBRJMSRR!t`>.虯3Kf`CFۅ3٣x-ϬY)p.Oݺz};ڑUD!!`l⑹yKC!ҸhsokK3rkEzȑkYs΅mf"CťVͤRaߝ q?ٻq֕O^u{;2(gJ+ɐ9wzf~F$Um)k.~/̜~'Άb~4(=űIb"1(#Z;"$ 1H!(4bak$l&%Dt AF:e25MTJ@xI Q!VʹNDi0c 8 2V%@kRx23kw00CL)(rɚ̳*5[ /͟;)G];`O.ReN_>;>g.[M,k87|gN;qko;7n/]V% АũSi5Χ_Y[:R2 e CgQt$31R ^dcTIp6F"0hC2oOR& kMJVkAi;=Fn* p1#qbH᠑QYTVeUWդZk"L>o v4[0La'BMj4lGPK`D)%IK! WiEˆE־H+"I|cNcD7MQy"oDUb& A&3(J\5nzn\UORS`"*ChUyԻ;{;ոBCQ(v X=zxgo_"n۷f7?3ӟOJywoYX9w׏_|O͚!ESgFI?" b(sJTJ Ab@ZlSb-M̝SE )J1`ދ(H"N=$EiB!Ql) >TU]z/tȋrرnmll\^ \"ȬmB AoZCBN\&Dc1Mc {7]~?{: qxdNg&4Jݳ?^4xRC\u-Cf0;]hX_>w7~S4"Mf 1&A2Z 9'A_ I3VJ)-+B̳|RMꦶֶ}roFnPie)XܔZ+`)A@TZ)521_wm刘Dc ǔXO6XyR+d ۡ&΋"Bj=Ă6î`YqFdTɨV`<}DXX˔tBHQFTZa4GZ+)Dd=4j2$DOfMS[c- s1ZDFF~ӎ]:[7J ̛ /8!toc5!9yc@$IɿQc;C%pWN:o5kEG&Ɣ+vHHF΍!`y/#x~Ъj1im{{Z(9cI@JLBT!&Lsh5!dY&xʋ\Z]Nz|ytډ#Z+cl AT D{8]WW? OB;*8Ml|}tyΟ[&>O&ƹ"/^|8vo0Ko?7fgVN;yU_뗤1&9eO1Zc[\'LkZ0DJ)=L꺖G'fGy$4(V(r$J!DRRJIZ"izp{"# Pr#U|@~kעHcLJVkS/`e1%J)hm|!{ޤ&㱵,{ܐ`3+ "9 kRbBԘ|] _z晧UڻO\xO/ey]W|k'2T,|9w^?u7< us vH,bdyݵ8Vk`#` hEblud2*Rim5u] 0Q}Ov͛XJM6թw-#Y<n:M"RZ SL!D12mEX"!x9ˁ[ !)1I5Yk1;:A)`ccцB\e>˳^3*+~6jJ+`Dļ^{OVw/~_9F/dNRH׋_wv?oO_;rWSNzq03X;ٺysnyMJ~]Rа~o7}olo՗^<-E5i ~C!^Go}SùR++GJ)EJTbDG# A5 Pj`B7 !fyfMUU#b1vD$DOC.]YyO83 ň|( EӊNVzC*L:Rw(F2mwW_I⫔eQ6M X 4D#@?$2஖ BSRAPЖ3Zijdg`6F%1N y"iZkt9>$fk]HF12 *n2S%N^ffgfff<ˋ|EJjR*B) \}0xz030FW1Qo\qsGiWn`gi,Z]Vf{8aJN'Ξ2DYfV_<;o훢/^>z؏.qkN Qbhkۜ= PA[3 gV0Hé+!Y5d v^Yse k߲۽_|Z"/䍝ۼqo6m DF)ZYc22ulAyNJ!o|%=0몶yv6y^U+z)M}Y+JB!˲ IT^"Rɹ^w/F^/[N-=~䩧K?a?zsOWޘ91[`)l>ZO83<_̇KRH[[[z3/vTwGn{pڕ kc>IITHJ+LJb!F(xOD>c#0if&MbJtb˘} b;"5Lt"TWRkMH@Zݡ pۢn%t"y A2`|JZkQY}| \?~;_MCsp9,*-6cg^˧Ο gcx[^xKeXG5ff?XG~1)6OF@3&M7đPF3RJ:Ӆcάtҙ\k ] )m---VƘXdʬk5kW7ιnRp( "ˊ*`Nu],{1qB3NkDM~_ `{W޻ޛU_~~m1{'fgMf~gX8??Wo?zГxYhT=݀{o~|,ޠ'g{pzE@/}/o|1(|rkv]xaT81VujrHB)A䊴,&wӚRJ1E3mA #bHnFySJ)l6e1SZ8Jcd2Z !18nOxh05}Ǝ0-ZOB!BBHE@ͼeI2dACβ!xA2?3e|֌b0Hke!"A!h܂mM RZimReRL BD,4wn'3it!`iM؞H_rM DA7^RF㔒5i\$}GoѽG׏\`D!I@Qg/yN޻2eiW Gtf2Χ$Z)16#c`O'/Elig{,ӎ"&\ 2kCʴ6*B$?B5j-ʢmD1ze0ۜ8s$)y;`8l|pfvfn84O]7,Cb{̜zs0s Bbl&eY mmƻb6~מ[}"+_?ͰS\{cJ?ޯg2EQjm$G#@hjSɹP,"fy|+{0*kѦT9"hT !zR:י{4yܳ'ߓqEߺyoݻUܽ:z'ϕs1:)ƽ=Eɭ>8t1SnZ!Iڊ,#wkl$7m[yʉMDBH$WBLĿRRY+#5!p68K!e#5Vۢ(b[FtaooM ŦWnj)Zvhl.VYedQ^_~_֏߾3G9BDxڑ嵥`9rȉ~|7{(3k%F+ܫ8~BЦݡwO_8-Hォ$fpwƣO.%RB"V݋Ң& t3Th 2Z%Nb/3#@Ԉmpky3k< >xλi1rgMNR@Q2PABX N96Ʊ3:/n+MEa1YcD}B("t7ku=;,(?!Gpj65 L4AESHYfGR9Ȁ}p{y6d5vfI&Y!d&Ů6˲D$”()Z>Yw+q#G"/꺑,1'ш&'`yf㭍G-,/,z}b|s,niVy}RWZϿKASJ{o=-^D'C_Y[z)[*Tן7wb6A_`X^]/Ϳv)TimڜbƊ Xi"ĜXY:WR(,df('>"2Rd$;H(!1EDŷ+ U$> r@ >wn)U +>!,kh'urJ+Lf݋_\^kS5$|!?x8LWURʌDIVRS )`H;$ SL"mgHԅN2d1x X3"r{>9q߷e1o6̀0My{Pi<- 82nMYb UI"9;˘TkS=ाߓ Xkz[Id}TȉQw쇆ۺ)NF  E٥n֩N˽(6< [)lIjW:'!}~)mDEy #)b4.\#Y^OVH! 3!xy^7u\8sNi-wrPn?t#G W(O.:4W< ,?3g^+/.zus_ܾ[hk(ͩ/VZd`"zH7"P}TJ!Ejtnر4By ;\!xq1LkD 4pRZC(JBq)r!+T]5a~jOuآ@E? x8cBSHr`9w_TFJ(^>h^ {=<"gY6V[k|oВIۦеn`^r%D8Diz]AhJJ^;lg =g-˂F⮓UX9‚T4# AA^")F!r EBbH|ʲ>H>/r '}88Mvwn◯Jh$pmtgb!]VZ酕Ų_; sAms+n24Bkݕk_~מ[\Y}*SJ7~o'?l%KFkO&{̓޹Kg"ϋ? 6ۛۏ<6AY| y3+*-D[^^e[(.x (ha3dY.(o*) HM1"5Cvwj6i;ϒ\ = R+뤔C9P<{(UDE{&IIeYGAf1,2̒ٗ.^: ƃxya_=v `>{y9k犛o>`qqqvaw~~yvo7U?ҙ0JsrާĽ~/!ϱMih=KM+mڵ;;|GPkbEz@dOR3&LH!4 I;)L1J"1+%Eor& Rx{S7JV Rd,`01ɋc?WbٽϦM#SҬ[i[3pd4ȉQAׁH@>i"/ZBPoE`(SJqo.EP]ـlqN䣩+T =YKZF㔄R"] PpדHĵ12,{Y bL IJZbY |fRUeYe)cL4>8km,iL~蕣")ZX^Dh5RDD-Wɭw1&Hq^vI3~ڀ֧}wlޱ!C˺7ʗ8ąأF#'Tzjܖ Y=ŽۦIl_A/QVrUZi""}[ili_Bk&b8&!OhgՀ)GIp{gi<[L!Ŕ SL mhhlF#V/Ed !6M eѓmFkb4W}c_?7>xoݻwS]}ҥ'Ο?{Qo>.'#@᣻ dX'r.򓘒-2V$xu6Z#/YY淾*O\S5RM`W?z [ A2%O!b+bVo@@k"c@"\i)šL1)&D2l]`1:ֽ^PT3zuj B͞Q&`Wퟣ0s`yr v\Ty+hGr^BĬdu,G yY<S!0ubn`:#tVMNI{+_#2MwoH(^Q搭WomYnggB'X8z흫Tsr^N`)G`\FrWGuY!bTZKL5B-흗 bLeY)E֊Rt0A i~\; kE W5zԑXƗe}"Yk\IxR,{=њׯ?3["W޻.>_x~yu?克\8uĭopI(ʬos+K@fVWVwl]z1׋)Z✓ؗReAc[;ug/Nۿy(BO?4|4)DP ,6(6bib!]sP&1ֹ:1kcދX\j֘8@1Ǝb"$Ԫpbf3d<2e>ya~{'1{b8C9 uSq_!9+& !0Tz>TL&̻'ѕ`䔪 !w$KUוRZ5)j~CW"V LIYQ5 C;4e8҃X>O:) B m2ÐB),˝k"y8!sk! }]fFzc:>nooGIU ض@@ZC4A?Nm^/|ni~vaV? Y׊Uk 엿..>6Onw>z߬#P6~rotșyӟr_=7?6k,e6(ް~\mnny$`i=Heֆ*6 hQD6YjGD֘~0*7y"ĐP.1F&DYZ;[C((Gą a V?|룟/o>\>ԥ'yұG~Vd6Yn^<]*\W{e94;#mnWW߻zה6AJe͋S~8-/?>"&Օw\K3bjZjk !F)Jm2ƈRSVH`MN d5N1D2EZeDz d2βl8 I9NHoP̈́LSl~+ 4-/>Tno.r w7WRYEiUWFҕ_/6j# QYtRӝWm:4,W/gCD4c9jR v"T6B>xD&xaq&f眵&qL.Xi| e !FcZk-,^땮qh"1Lmmf!De{Djffkի&nv~fPk|%EYp+zE=yQqLjj}ͭ M"ρ;"'1uغQ!T⟜NS7Ja]7F[əc|#2D*"ciGXD`Y8p xẂOѪ@ Ga5Q{<#J9uԸ&TlwLZ˸5/֚,tgq4,Ji0FO $PjMHj2baF C6NLyBh01DeDec $~xdgpf~coO@(w&d7_yJ .ϫ^{|w3=u䷹^9kXp|ODI,ҥ'\‰#G6}ci֦V*eYCgy"8PCv5"dwAk4 0hΩt?J\Kqؘ9Xka8nN-W^~sOjWOvӽ+^ݏGbPO{!&hZ YkR#CY&!V&㔘Хbjm\ ke'Xkɤ1JՔ̿}3]]gDPTX3v 0CVL6+Q׏1ZcCfm^?^WR*q`B%I˻*oYPpB mȢRC4`_*_J TQJ@Y72cl]rTe-=ˬs[p(!8`Lh<3"i"6,3jB;\ljcAHBe'B$1*c%9%DMd'ȳ\ҷֲ~Ξ?u%mߺr󝟽/{>0__ >\=3;,)WZ#ݭܱ/O[bފU{WA헾pv(hoNV#On=̯ P]c~Ar&B"Dkm~YLbB"EbTe" ;' .J",gƨ)q A*ʎ`OYf@NdY4!ux4x9CR+v|},˲'wMS'AzY&v7{gLIp133*KR[ڬdNҢLNhKɴ̈$b?{hq@t<$ ym QU9 xItf/o mc{633鶶}p5~-MNN5Z'O);n{(), ڭVgլ)#`01Yc!2"2u?ARIJD!1BXU%>ZĦߌ*B`YUZ +!Dfs6g{RT[V557ŚICVB h^{d_M,{7`t__Y{ؚiJi>xc}1t3][Z֨GdO@3RVj7979*Ul]Zc9lZ0ϲqn޷J;@ \$M1J!R$j9`̀mCNS]M;+EGgMNDES`ǎĔ!֞( K%D7}ܞCrbn~]XiXٸzo/̣'v~`a饗u&:/egvͤ2^Rg~BdMEexI=ݺhsxS1D%e~WGrXʉQBUY]=w./ڹ\J 20!#𡊃Z)&>=%CA#* Hq[ c1f9f>f֔U X19g4$6g| ;AYʷ4ȫg<>`o(Z1."Z z#VU^)?SD|CI1 ,_Cp0Yך囝-Fmoms-#~L))%˲ +!Ql4Kއv=1YyǣvrSEWu DjHc2hI) CnH)R)s+~Ƙ< Qyf-6%|DZs]CRH)աtu;_@gf֏/?b-eaXxtן|ǟ?LXI0Z ^&b^ F(Z9PHc*SZE)RJ! @QR*opӒ|؎%jJ"Yb1EFjٻ̷k,%Uekc{l4u]e\svOpx?u_BfwwOaXp_ɝ[\/oݹv[OZ)%@Has|hnuZ?}hK{xA>Yh'^z7NU)%fywҭ.-؝`Մ8 HbZ! 3cIӘ[cb >ݜ$1ĉ!b\|Gw)6{c ue|ܴ8@37x{7^!?oC+.59Z@%Yb! ?p4I%?~42z梱*~ !C\<<'~3,ۣ4CxO6U}DTWUtnڀ8Y6CJ,oy^)I щ(@2rNHh5RHTU5zR,˲*5V?:XSr5ke;d6%pce3mw o#% o=uիkFoA%õn/>3CKcwo> ]j͵0A% ;o=\>*j<ʒR?95PS忉`. FX?|jFy[o!%fp)eUB-*R*Z4Zim QDtغI ۫?[E=NљFV̆78'T\_v.dEmf;,FN aIE,bJ1$JJ"Ȣ98 >ϋ"J6,=A0cL)?xDJrf-.kW[mtγq:5YxW_|y;Y[ַr~~ڍWwkcܬ\[;yZbBb PD3u*=h\V|,(psm{p /GU5)\5n^ߚ3593c^ 4W@c3l%JYE$Y+ Dx9 "8H(c%eHDb@T}RHc,ǃc!Fyd ĶRS G@ ^2tdNO|fH,bs5wzk/y\ dobL 6 )y%VK-7V6޵g s7_~)̄(1rS6"V{[?޽sZSuz&\;h.z;47?7;33ݙT=q䕵+Bv(gf&fd|l'36\1 Q{\uUR!2 S"9״Y^I)uGy8lRj`P bHc onMMNP4tCC@!w5a__:z|qq73wxҙ_HD) fECs0\+?HGĢULLVn?Gme,Q-޻ԥn~ ڑc8RJuYf4ݸp48kS"$0Ʋ-UmZ;˪RJDb~y4CJ| >Rjn gVseyB(xL)r*"%B?XJMMj) ݴg;yO-?(:tFF&sX,w?p]r9o~sbo5يuiirß}p3f险t;Q9J޾qƅMyrDlws3ݶIM̈́ҭnL1߮R#8km9BJ)m4ßeQ`(V:D")Pk@6oWK)\޹jeY^U5\`k}hS{~С݉NV{>=7'ZZڻgnt {i?lcBT/3vhT°?ןUcNRpl}[?zcznşjT)*k)}}e=i| Q1-H RHWeb6k BWU|02L)E b)(,SJJ )F!%|8"@>)+UU!UYVuMwDhc?FtV~ A-rxTC& Dj1=>2iLJMMM9W3x@DP4w v񤂥jfˏ) lx:>xgT1TURvp8:bBrF ˲d8; <˄@)68cL)P]{,rc@u4b 0fQZ4\ý1λ[ll.~$PLN:-Y/ u>?0|&غկ?͛~04O8$H(UUK/?3}$>hgy5g^+q'x`yAJuazbTFk~Zb}'`mkz Օæn%jmƒNJ)cJǘBМ7R@_WCRJ?Q|6QJSJLrGD  !c{&bp3,SJ1 DY9zS;]9y3SK/qy7:x~SW˺lOwAKf&'~Mg&[% @(QHҴm;6^ʍ}HvZ]Gc]qwW.5O-f'YWRA*> LbI%8Et Jk#q@Be7c/2c9~C>"Jz,4 'kbETn$ g4f?05Zcæh:!~ !GUYkBeY )3kGh],֭v|fǮ6JJ255x{p @)Q*mxSB̭ 1lZP)UJчa0yafq]Lއ1%´Qto%\]i-z^GiCO=tҩ}nodwׄIۑ]"r|o=?&RZ}zԹNn1oo]?d;x:=1u ka}NtLfvr8Eťݯ򁙽[][յ.l.%/"Zi)k,Z%e1|7|@@K FkVJ)ŧmǐwu 602Řb2:uJ)UM\zqo}lh4=gO~z+rzO_<>??|=\c\3999kGf&Vq;A"@)1&*ʓ+\,Z6KCl o\Q^z~UYecG?K n޿;7sM !॔Dd`/@1`1 pJ9GR 2ikcyQp;8Cx%{c`څe^(655rl4k,uyF0KX FP@($ =2h))n5FO~!!H @H24HƇQ c͇qH0B ҿ+E.@iwd?ښ5?ه {w 3/㓏,=s.jv(R#jnzfiqBwFzg%(|p6<jvY1L⩮k~f !]]sJI+CD1$zw3 N)D)!6Z)+_{x'^}ر]Ey[Wn}ٷݗ˛O?W_=q鉢]hVhمٙT¡S?jg̮t;ރ+]²șh/TZ'rx˳~''Zֳ_1.<1DWv~dƥ3V9uVa"R Qien[**PDV8ϲ,V_.ƨZq;5s!ϳ(%B"5Cc%SD  Zk;GB-%$)VRKma^rTk{us Kqa 3.FDPĚo{:h=~8V?zu8.?YgksmR]!&q$*ٰN*8(H1%0^:* u]Օj!(@clc %jTG n R8Â2kR)W !kb!* @ [mJ D)EgX݌jTLK7`!d˛އ鉙]3uU\wSֽoT^k͵ua!Dkd6#q'ߜ=mweTR >N= `*Lkx㛏Az'է]{T{bnr&򦰒 q+a%՟(8tMB6'Ę(\C怦$86KW ]ڵК;ï,)V/\?ř3_=ͷN=kor~V dj;}*l:c}_J)ۏ !bs4w#Đbd6Rb46),˜)'~`,F<5|8:Űmiz m)r4oB ]kWsФ#D/S GBsh:kj*R Ƚlf@n@OhO;z}͚,XkSUU1H@J8F2Ke9TJ2|MbHO_괦f'h Ph0%ؑ*ž]J:֪'LfbJ24FA 9m8⇿`f]}~{1c R}m!fjcuc9\ I(p0zxÛ}.606,w`iߔ(ȎN(uYÖlb ,ObZ@ nnNd I)ј8(\g=ڝ*{~С}Ǟ{Бӓ;W`[k[woܻp79g?y(kxvE(0z2vfB-3VA q88P=v?`"$~";o6 *ƹ+rSwY=gU[.5ۯ{;,_||HNT9<{kcyskmsuyUlw_YZ՗_:rtO{Wr'Hd!,Hc:6q7'DJ) çIÂ(MR  H1Zkʫ`kijK{_x텗_{=KW[겾}}ݾsny['^nwG7Cvߺpޝ"\bʣɉdqz~:s1 Đ (1] 8`mc5n]|ybz  j_Ź6 }/wZtt4յ@Ja!*)6BJ$@l͋<}㗳)vbd?sRRAQhq1@CW&vb\"JhCnShkaDDkܫ=rPe4Įl\mٞ6EQ H}|Q@T%^Zy'h^2 ' Q3^yQJ%D$vjfN#QYPLrlf \dC} 'Y#bB>p)&Bz垌xW~e_}͙ K=RU] G)}'gw2B GOE2t/E˼]uY;}p~\nk}oZ*֓k˛Z{oO c(BR B Rb Oīa{KJ(_<_6}6}FD*ذ>b:tx1C_R-Br(йZk - _-[GB'^8a^SLݹZ뼕߽qk7xpֱdžX,Z< ]9 w{6h,y}"|]YkAW4W@TBҞRJ Z)EH=sSR1XΝ@ȧ@Bt))No0e1LOnJ :P 6с?>h25enif1()Q/BlllVVYC N1@Ft D׍LL vAk1nsŐjrYh4@y8ޝR@k.?r!D ƘO(ڬQ3Kej6A?h5)s0~O+C1%<˝kfr@B`];!QkY63K/ysWVEwQ!?qls}[QD, `fxpѽGouR/SJ8z}eGחg.hxߎ#hX]x7=7=1ATR*Tzgkp8rލF#v8b)RZ2dv]H&W&zӓvjI% ~ nܿu֕Wַ6Md=wɂBO~ھ#v8rs>20_~u񹗞Ad:v_}`P). Z Q%H1KIL'z5>r#E+fUVը⤋FJuҭ+gў&0Ƙ̀RRHD,M<~ñƒR#Q4c1f>onk׎gԗeRB Ri#JsǍ *yД<#ύDCBX0` y2p^@(yVϬFĘ6  +`@4FS& ɗ<5X)%G!2GOD<`WvJ|)` TSsϰ)b'pU|x 5?7]B`z66I%9R 6 D]ץ1V Վ#p1B"YbF{cKZ)0w\ 'dD]׀! ` R`LD> >vOu峗;m|A|e?G'kY/LDõ?zj:U݇7zɬ !|pPy\vⵗ^zpWLD)i N/VUYo/?xG㹹c{s^ʿwԡzS{f9,pXeuU,.ʆJ,Lfv.NW]Z_Yy V֜5(K )Pms̥W=s{8Jq?(n3RJ۪}p\IřRӲ?xGٿorwL읞ۻR"@Ji8* }^+H\*PFĘꍌмs.Jd1x\R,ˡ!1Őخx1(%D1; ¨83 1&!hA1>Sh4 >2qEn8Å&Xj˞U@4&F(.G(A?j剠"kZN[!B甒V9  D3^dzi!V?F`[sӌ8*,pi?p0@UUE1ϭ&PUU1k,9:j "Q6*"%b~kGj\Kcbi]!J!9=住)1 $)SRSi¢hp5{d;W" Pɴ3)zVuW۝)BBjT\*iO?W#ur2QrzK/7~7Sn]k"RHБ=/v~+Zg+XlO㏖ݷ~ͷ-c&u {%Pe%K)T(Pk&Hb4Zl S3WcD0R}u{gc7+0%L 󂓙އVHD;i W3$R)M@\T\B`4#  Q;s깫f%"ii-MkrYkp#!JQh@1q]03c "fJORD4Qk' -OM;,$*!4GBHJ^!t{$#wx&ʛ1O)*DKN?»M n?{RJZ"?1 QWdUn%qB J  rU1JDx]Ǔa?bNt~<,|5|x )aΣ@uĸ NxycTJEƉ!!"x)jqss+鶥"1&dLi)YDD$5m5GpL*cRX* tuMDhÍaT) fAh əf~Xǭ;kGGy&*1n+wnZY7gZq6Wxa'Pǫ{\f(0mKG蝢 !/!XjӓkV?p}u}4UejBJ1Uv潛n^ߞ>ۓמtz{?gtL[mi[3f&{K^B+ʪ{oNOz=5;cY()doTxjCo6S3Jo:K\ŊGo6vE*ﮞ㇏_3SsQPRH>rBM(1Ʊ)%%:jT&JB4`N!kmʶQRl*"1YBIeBAmq-tGTg+;>qj "vT"#c-=* anU[u]"CZˆ|om&tI!ͥe9jHS ;jpuz Ǎ6"3[ħ$=5 NDyuO #C6b@RhSVUUƐRR UW"/򪮛kA$ &B<&C1Ĩ83F 0C#cwH Ǚu1yd{ϋK˗\'z_8 ;߼w߽;7w:v'_sƚQj''??-ؽ{'{6Xz̹v/|oj6Y!ċ{tWO-u]1FS}{d畷^{?Rd&<0`e AHi3+iUV=>ٷn SӉvUf2!4&CDQ 1cMa'qͅZHtKU׵6j !zTh 2dHbO (9 Sr5@2%)Ҍ 3%m(6$I1 d+gh@rF@$ g"hhl|n&)mEP~_cѶ T;ԵzyJcbhk̮=)XolF|PƖW|Q?]"TBRip>%"QHJ oT0p0qzRJ !$zJs( n:76)QJFD"ʬE(ι&] kF e3 )jmh|Há1*w̰uBUR gڭFģ%"nPJQɻ~v_?W=\.wo=xձh]NI7a3+/v| oOR6û~ǻvB@ ֮'g2jWWƞ]ZߪG?Jwanqn~q7Fv'n ;aP |`p]Vᨿ/ʣ'kOֽ6Nksڝz0>^^6N-ŔR{%!񗎮|*眞o~?G23fWok#5ہq/OaY^r=م?BCKG䗽vo̱/ڳKHc!%e!ڕܻyo}ssݙ^Jp P! !b)FeRp% t&W;hZU;gE RZ+R!h8뚧kaGXyNvQGsDhF йZJ51uq8_h)eY6[5*!8b=yC6Gi[nQ3}vbUU5UwydžRr%'#5Q)j*!'0ypj EnŊ11}9,1nlXj.Hctc>TZ"Jb|EM̲kȻsKM:fTL*GU9o6P{pαPaD((RK4B$O^ 邛;|g&ۧ3v@Tt !ġo>7_NvS #hk}+/_*92(XcCD/v|z Sܹfw*3D4ZNea 䎶ehz;ov80K\ߺz,?guRSRJcMo71=jn)V(1FRB] QE)jsmsmyJ:N՚[YmYns/-SD#DTׁ\q dHH14yWo;4e!?_'ԃJcx(>ۗoO`!fV^s3Mv͟Q쳦7wŘ8uQU5H) QLe'!] B#>} nwOJ>9@9!$ByIŘVRյc(kMeYcZwb R# 1H! UU\X"Ʀxz"m*\'B$a./cJ `(ƤJREta8 1Q$FlG hHe(Pٶv1 5~,4<2#QQZuR"/B \C!ZQCU>.^vl6CbL͜#"B$VU.%s5 xS"S6J5uJ%@>J5jk_\}vJ3ٵg JB,GTfVHtxm_XVdM3Fﮜ4NɽeUbVUWC46?uU߼r뷿̷v@ay׺.v)e/c.P2[*?8,30Ui&;(>>Rޱvkgy0YpW!6XCD, avyh4B$E_8‹߽g [2k`Rret;{&Q|vw/3IJ mmfwe9s^<{Yg+).-ktq?̼sϾXE[ß՟x1r/+K^pFwabs{Z`0;Ϝ,#bh=,K1K`sOzڍMR1W{]-Lqk|!I>";A)R]U%CxR]J)彣` xϰ庮SJFƳR^x)-(D3 ƍа6N86))6*%2 \w+/.!KO20/<1a|2#ά DoTSʅ3`?1W"rlq5xoNÌ2ui·jv}~Em5~sV/a7޿{‡jhw_6b2cX/O]KOV !ٺ<4Ū]a* FUL(I‘Ҫ"g~.9lo]{8jz- G07?WsYDo/B/+7/eyk{SP(a/9g;MGK7_Σb=pTr41(YcRrF몪FFJe>""J 1FJAls:j(RRXL 2k9Wd!$J$אIl?MCL NH!=y13ncQL{ އ8*]y2f@˧jr pd9jO`y$!V;B _OiT1*c `%R :H go( bSI-78S%5.̌DjD!Z#qبc;R("B)hb>11\)b>,˹T)H2!U1PfDiD$%J!XIb^d"%RJ;[JI)bYf֌D5-Rzr/6hysTIH)}SRIB ً')-i6o>f 4+|K3;mf})LHRzp~Kv:bsZI1 )p ~ɞu=9ˏ>>|ރ{j|S޴*Y;\<}wWZ3]Gܥ؟7\Lbß?8ED+돇\*l^[uM`ꅫ׮]/:[kqwx_VdEhuZ݉no71313?30;=7-Z/7LFt6CNқ}{]XZ=7035;՛u&:^7ѻw~Qe Zݦě'zS΋E1'ξK;Qvҽ0ԅVJI-pa~iڛ袇H-VZj~QY/vh}gﱣyhP7V,<nw+ {h.@꺬o_}拳7.0l}Y;RHSHR  ,Ę6Z,bL!`Rb1ZkZ]sR*K)@ BcV( !̈́l|̼ 5{1SaxJmwy1٩o?veyޭg>>?UZ`RJJHzo%+Տ~Gv|[䳑sK7V_9+oَ^VN_8+' eNDҕKn??g2|w|㦗, 䕺W?Tt"č=zf'KW@v+V/ܾ}NoiFU@Oއ ʩ:Bn®vwGfmt/]M_gR%]<^l@~!D~5?Nhen4(yx]{珿~_Fa#%\{귧 }m;~.) (yZ5Z)|ȲLk}e|/q)&1(29VM6>%d! 2.B!~c(qRư R$ި+%U |uc5)RM.ڞ  >A@ <*E ZWHO)ra-RI磗c(&''RZE!G(p4uޅb_WriƜ䩩F~j<\ly  E-Yo4NT1B𛆫RNG B "f'F+-S"WuC!0&E%ec' 'B ]pF!y0sZ$3YSΥ:sy4OPS벪2gǙƘ#o0΍;9A>FQ]|a=/'Zg//V."e]1uZk93ŴFʵRH AĹC?Gmm^|ENziynv364.0pms .TQDf-E [E봺9Ki557Nb ! -w;B{m= ZWnES;k(P()Iߞzw(-]ٟkuS|]bU;=2oW=jt!D]nܽrʡcW !rݹ~oO_<} 8:գP)W ,WUVJy癮gRJD;m5jDv&|&2Z ZiJvZYjn}ɶNID|D+BkJc1V@Jr UUyF[c._Įlrm2ᙦ 8F+DlE g7ğ?z}ᄐC8Z)Dϲ,Fez Br9ߣW?[FZ@ߞa[ǷrV~3 qoWafDOl>EloyK6xi;Bh{nc =8R 6MDXBZ-NzNOuA>ll7O,o)E'Cs^|#)g/}WzƚܒOx=ۗ,߾{g +"RAS}8ܿ2ދ]ik 4!J[ᄆ' ]GDKÛ(~f6wv ѵs!׳[yIk !4ZVgݽtgsy7Bv].q*lJƶ{Xs@ͤZ<}{RJ;WZ,B UYWUigR9"h8*"{!O 6a~DmQa@ƧPBnC +8;EQѶ.H),cT p%~F5Fn0JbFVJJ)sUJckF׸31ZQanmnZ}H)I)b*Ccֲa{C*,˄1} Rc&޻S';UU=pbznasM6lZܻ cRq) t>އ,ڻsܩ3PY/! {ᄉDկ<$ZKs_vy֕ם(=/62 !W+"WJʉpp'#'+k:0\[;1t@_{$C)B ߝdR2#e]hfv;%X31[{r !V]^o_HDvըF5pC:F~pﮝ>ofbac\":4&=7n2^-@Ƙv-PFCBB@V  EKB>xR)$^W5"dY*nsJX_%UZqH Q %f;SJ(rL1=%sN-6\*m9*Q@q|GD ̋fj@^mOħ"F}G̾tֹZ upA_ܬ*wi@D1_x%ga"PI(DHl 1t7K>V Mu̳ BW n{`!q#u]cUY{BN3ŧdkS!qD+ Jw;ΔNI]E{_#mwN Ԋc 1(<υR(rkZAT2RHJdM1F!푷wo\q]^"06uYqabzͷ_= .);UnսhϷ>i„:ifɅ;Ĵ|;MqsycqqwobG"Z]Y[]YBj{̎D궹JkәPjuo9MfGhk}k[*+~IjM_d9,w۽kJ!ĨRJIhcp穽=pk) '0L}SP^zc4xav\]J15V_sW766&NWF(&PK<$#5%j4<ZКEn ( J*J1DJr_aJ벬YV8W{爘OI>;JQɦl"Rc Ym:ic6,1g-jƹg$NK s>m yzɇf h?:ٺR#JcMq0R"~FQXBDa!_38Ʀ F!摕)+&um5jc\Ox'm6&-LJߞ[vL9u]{_Dd1%hJQRyL!JUU}l(B RN]$zRL!VZJAH)r>@"j'H!5J)){ء}PR=RB94J)WRL;vO]p돿ytsJ+B]wPO:ʭl@v/?=r035/]\?u6M-^zxXrsm+TYk[ETŅgֿ@ ,AՕ+Uy G0HzKx]b6ڌicyr&JBXYY K0&<)_x9k:rA=3ӈDldĘmDݬ=1 s_4)Ps~8˫䎁*ˬV"DZ@eYֵUf-e]}(D {DžutH)1#bTg9 H1J% ;C`?"ZŎ//M.M߸xON> {.5%h5k_c6P"‹/尼|rw"(%[Yg*0ѡ 7V_gw(" )XY^]{m2YWݖRo23?7֝w>( ֵ;;,\ZZګB"P MWW~֖vu'~+uƊA!DOQ׵sRC xTncwyqC.1Fkcn hmW%WW9!bᨪ*]~iuOD=(!x:q([ħ}$h@JF0ƈٔk+hD(V6^ uUJu;mcL^|@&GeJ T )_*r ,7<[ln. C*LoY'fVvS( = v%O7 1)`EBq^1()3V BJ6i*g>>s13]];mlUY|J!.[cy>0*6 PJp#Ǡ%'rNB{Wҙ_͵QnE !| 3=Csrk$n?v[͠.[Wn}ߖlaiR{yɝUM1O FRJ$fgNqX_Y_ژf=ZP DUU{睯Cҙj-!߻? wx޽{DǙLR7_>hK$*m"+کߞX9(tzlVV!F_y(現x,ը|`R͌nԅԙ}nohCK@(L !D@ނ(/k\͵BclUWu]y{ߘTാTdocJ1%9D(˅_sM ʇB Ji"rZq'ܥpQ7NOS04g Zn Xcäfk"D3yǥ/mww`0ZqZkɑ8lSOij Ԙīzi[@hh'l<^HbKTö1/PUuY! E!a\\\WTsYfyufP9N1ybcB)]DJg,czh޸{o]픐K{dE;]0BzԤvx1òugFeBգ[-e W_QWK!:5v$xͫ7yHǴR &DOlM)We>mB*jwͯ~OO=Y]m͵[ZJaJ@!1)Q]QJtTGwah Hk×,u$uRRrIddX]U1F [-R64׉)"E?Eh!ͺ(VR˲$'(ʋk[㴂@gh.񫣚@#m#ftϨ,`+ /Osu- g널UUr0x罯c3f!&cFc? _4ğ+@ALE Ji ]rT@{$ʰ9||%캑BÑ+hTU͵,H)RB`g1!!ٛGƘr#1<8yOOބ`bq1=P9 V[LZz@>ݺzߜ孍->>3Œabsݽo/Ӯlֆᐟf[ ?W7ϝp\Gj%J,m='f&vnn\p:B\BI#߸~CbeʄܩTeA PJ!^v k3k<JZ_ء6kF+)S${h޽wOLOE|U6߃+ݿu'/W*qS/ x֐`r!)A,˳,BZ"Ag]:s\9{e4hBKjle _/^=֕my/r`ꪾݕoNՅ2Nj Rw[ܡ'x΃+׮<c, qDs3;9Qshy9HGі;#6zq*cG?}{מv+%hwX'4Z0,Z( O~vꟼOl_H%gf hLes'6`>-6TW5 4TU}sߜvf{rBwLkM)HPJe^T}4_6l jD!JǖbJL'Jr pUU%(%cb)d,KrR+E) ye61Z\+BS5dRJƨ!g&֜V)!-/}991mJ3 I QjDԍ:nI/us 6B8NdYq5) !V`lH! ybLifՙ]~,V>2%Ó= ڷ^޽o7o/\}PF g<{ܵյ}3 v\4'm$J|5q u];Wke,bL|VJIF"}GL{M=յK)Z-%(%6)q `AzڗBR֚mCɹY?# (1=w&J/L@-^F mY26󙡜`ɟ2s9ts!v+X[]%"k  )1fYb491Dh8hccm}m\,GWRo|YkPf9(ooC{g.߻y;̯gb>֗uה<4ƦQݽr@t'뗮߼}3 gYf-&?x堼sjPUuhꪮ\R v8>5Gkk=xf~z;VJK!ck7ʭoltKxWYqmRʬcSK;wPs5G{ȾCj#6rJ\߼q/^mD'I8nLJuUyٻC;Zoc)EAhbAZk#Tu%@UUյc:7TZk$9W{RR{ Cb ʘny9R#\s^1ʲfV`#8Z64JKQ =|BM͸r1*y m*7P '%)<˵V!-hY@LխV+rk-xa ч 1fCF#hTr&MLLxF3/+]9xk{g>cڶ48rh7xN<"%Z W~Gj߻z?57퟾<_>,ʍ+W/|.TPz+ߙ\{_|_Ov_;(.Vf,N?}ӷ~^a):r 92!nV'Zx緽.jmE!< fTSsSU$Ʌ۶Ee16p"*\k-D{sTCm+ܜ6cb׵e ϋb_OymI2UA@m30sn'Yn )h).`3O?ћ!bh0lJ؄waoo&BP6f=c٬ 9c΅+[i8ggԜ3fmF\-kmYR-o0 >S€6YdLuvc@v4jl4sdM=}:-S*X8` Au>O縪0xkdSмsȑ>f'93[ȶESf3mA+]xRu:w2 VTD# NRH͉׾ܧ?9c@RjED;o_='o[/o7P>_go~8kY%rvw͋۟~<-ܐ f8}:g ib),TUw@z5\m!6McW3D̥lg@,o\87 Z~ᇏ?Fh75|/ŶiI%6cpm;wޕT>gko?ljYnZM@ww/~,b U6hZ&蛫REsfR 4B̕+BH!@*"!x9ke ݌awWU>8b59>jR SG{X┫_Zǎ^ZBt:-a>ЩR\|>4)<;{=0u@!\_?n;_'sb>_4uΥyZyO}ߋj6R&r\"s٬j41P+o+P Xj@{GV+'S4O.2jCl` 2Ul x5/_.f/T{bܹcl Q߶r{$3|%.GD  HmZfUМr ;?B!V5#0+3!6Mc6#RqB:U!GSm8"䔝'UQUf& G,,8{9j;U(DBW>_"4K ;ivw3[0/v9Uh|/??I灈]0J>w?5m#rgy"zsֽ ^Jb!ɕK]!"\~W?@j(\~ 7._{&g6/~˰o+5fƇ_>n`/Ā\闟~'K_+),9rduDa3|ǏO(pj|'"b UY>xrιwXߛ 3c(fsG(.(@C-\j!/ǔx#wOMc|{~=tT`V:-S vRt{3Zaj%ԢHOqB)߻򭒳9yj-82sN^RTuY#7fqYaٸn {>|^oy>cӮ׫q]׭VkS30Ɛsm\OwVOXb@]E V=S XF@_*PPA6\ۧz,7l6k|Ϻ]-TT.&&Ss1F=" qBvMM8,=ʀ"9禉16iڶmM=*K)ff*">n \ "!!9 ;ڛOl.֏}{|uD0$׾U׆/n񼙵D#罈boמQ9{|G?wh^Quf}㭯_qYn7?キ|1֦i[/p_=Mן,7֪,ksY~{ҽ+R$s_~?AO>(c-N{/lK/^Wm*9qiއk=/\?fX/Vej8q^]Oj׿oxl^f3!6]d읷P.(m7?h&6I">0s)keY "f'b]2L]bOܶs䪪DZi;"9U ˂ޘsvο7_o~@W<=tT( OF FJ)XTpOnu"3G:|Ӑ6iC'Ҝb1o&&\J>l6RN Tݟ3wmv-s!6NRbUbX~\T{j2ޡopO؟ݶ hNo Ek=}wMoITcȹl5f|i,`Z9, H۫/_?~ٲ}-{w%yv&KG/>ٝƬC=!;kyzΕ?\uT^to}Y彟7gJRy4~,^/?u.klqetkϢ ݻu 1p̒W5vo|[#ddw\<gsjs]mW\UE$?op//>K_ݬy|!Ysb7ͧ|˟7Ͻȑay*%ea-TtHhRw;H!P`a@Y1hnk@1k{ "HZ"DżﮚDlZT6Ɩb%ĦV$apZA`ְ?tO FnPP'|9Oĝ?໗4~}gĶY?3{H><:ާj<99[" zql6X9WYfK'a-q{׵]Y 8c21!P:M:[ +0W@1rNA. AP6׎!8"뽋]?ʃ~?oO!6YTK.հYmv+o?׆./i=w+~_}|ѽא9ō3 pŹ p~83P8Ħi&FD˰ń㽏ޟ9)";w=vo"cl9gQA _~ίϺW*db Nx$@O~^7Jd׺׿x^Is1\l>{ͻ?럿Wu ,S*HE&&\#r.:oU:-۪s6ZCҸ\.Klo}Ys kEUD:]FaQPa0_E.`0s!XZch&nyG!]6V`"]^ Dv0n[ 5)6X9O-ۦ914&K _tk;"ZӘ۶u޻7߰74U8>tqq/vPiN,wfPGmm6wO8#IwN?)paTlx*h=ND:A2E@RfRqHM(ak OcMZ۶W1 DlTTJ-T[C/U$xc4Tm Xk POy æM5BTariGO"#R@kDTγV *JbRK_z뽛?W_͙a)R ,M1 ׮ї{Da5=~Ϊ?|iyAۜ38p< p<tIw8\#*gwO/ ќfIh8)= } 0%Y^<:}|:{3̏QE@.OO໗_z]q[gwd⍰(!k7zxW^ym!;(Z>ZɃ~ǏN_9 5Znm. :v"BhȕaUͻ@m|֛eI$~"7Ŝ syK- Õa&NC=o7i͹40؜,CbiF Ce]`G:TncSKxɿu&P@Q~n%\]NSRa,]׵]ow%w!xuba!9G~ooof3#p}"j&r^-Wv 6S,Xtn\6I)UAaP[ H)@!R5e2У"h>储&9VH@D!cRԶ4"$@aM)#B٦c+7[cgYNi\2׶m@#QT۶+hw̩+hnC({r &Wa8#vQ@T0ypVJp󫟿[~ߜͦU+6#3}k|D|kW_bMnJ׷䭠;n˳dyzky7 ME|eVw$A_JFR Yf7K*Tmbȉ(<8Dl;U^Y[ox"_xxV;O?ߋVw^ZGG{W )b-Z.[o~;y(f7o*rqW|ǏO~Saы0XyW1Qmw̱CP1`)c4(4YP`-ՑUBJk̿:uJf$zh2$*&Dɑ+}Yv,sa|۶!FULc3DTsqGi:Bo9 {"WJ;k#40z:UI)q5j1WB_}݇{?7?k.8G!x;/֏;?+/^9]t^<_=+8OgvȔw~gaq;j+"°oz@o 8GHk[hjFmb|PP1|*" bZUaaK)G{kWcf[^USͿzフOl6$+]9BS`2"/=_O[VKݬ4$Da KԻ_ŏ~gko>w dP2;}T&=g| ,lZ  bCvsVf+y e?r`O Z,i>q mD|>fYS[}3g8OGGmۧ4 M!\RJ0s80lȹVkMvHtvzfOZ,fXj],&kG.h$0?e rwp{Ad)6 |$*Qڮ1xl$V5'E Q1\}EkE_eB#Gaw1Fccn@rHDsc))Uf\ETT (UYƿ"D"}tyo޼|2W.Ф1M&6mӴͷbX_7!O_!wmut8{. -J-ezg$@$r6@l>{f1IvtJr`M+c;ōM)щ8mDޝ{O5k? jiAU/2v?C Eֵw.FrpБ̯Ͽk/_z_wUZOy|zڡ]C,l;k"sUu;CvfZke"&$|NIlUr͉VKjˤ*\3Nc D$-Z+M.ΔFQ1sH}9GZ M&F[2/YXфuN|*Tt++X6exƿj]`*v91;#Zb|)(mlVcA`Urº^/E[8MΥ "f Dmf3c\rΕޘrUq6 v:uV2' .mBjvi0[qe5Zkٵ8]-@m,)3LjM b:T]n`a!BTy;k%#ٱ=-{Q= 䔅 G`0(6h& t$h"%RJ֋)̀,2Pv.R~߾s+֯}QNڴw{w^Wo7حz&`L_|?{7,bf>"yѳ@\sRgr)oUURN\"Ì.fQPxg/³p?,djP,wƕs `D7[-/?wt 1ww^|E7cga1RO|Ͼ߼arW^>?60.|9WQ 佗ʕ+x@ͪGr$Pr9-r),:5:l(FMQ D<B!γTDx 3r-~CTO-l'@ܶOHe&TC\ U[b$OUSڎM:ugv0`L"C`M@a`1Qi۶grX29%BqBšWƔJ)fw1Fq/sDjSgZmg"*s4Dt8ŻNhuKͶ?n#T@%jכYcjd}+YAR",A!9WJ09j.KqbҘVq)E՚S.8 8 d_fAJ`Tʢ1Dn"lzJHTB$rTDUsJ( sΧDCr)BD9geNxpp{޿w懏>q|wM3 VuMۘC|h?giH?7oGg_GgI7ks-;oU\|xdP7fٳ7iL>ZnV׎ChUM>mi23 = o֛9ПkbCƶiXA9g^v&6nvs"|/?w.49r߾Mp{+1TJ[DExֽ὇orx(1WlZ""Jd6Q**Ӂ>ɎUf5,9,DΪ|p8:{.ڒmWsnkhbc_BRDDZm6@ks27jl:spyZ2N'I?ղ8N(ɴloqh^*dZ33m\|%4ڿg>6m-%D亶3 ޑHri!zER)mUAE8+xa˹rea:hz@>i7aPG:B]rB6 _|c 狳3h#W,}q0lI?DeN[=MpF;ljɎ b ޿ml"D Z.+s.97RKَ%W"TCPP.]iLwGE2"0"} "dXKjeVѦoo>_}.V7^֟wgaUZruvF?O[o}'?ٯÿhﲪ>?{?_݋186&]h.]>ngOCzxaky;ګH `MRbltYyp0 A <}|6gYX,>_y.̂Jh⥃>׮x y;3$Z/}/foW]%Ҙ6MlbkT27?|bC|n[,Z-ewhcSvY"RҘ& 9f}[K1xB%pXa!&8G\v*Ul3",HXحMۘ@j7!3J.m؈8o8Z %^'ރloR/fZ4 FRHSlvxȧpz\6֫lar.\Ke^V}?y<;K_-%_rX|9T)LHE`u",mާۦQ 1) ]7Nq< vlb;DD~36NI1JC!lnUf%Z n 9&ڸUu%+KVrd^c R.,vQ(V7f1KM͎1윏Ʈ됈YRJ#o<ՔNecy/ޡI7t(8|p덥1s!ƜR9Q@B\.{K7.9.N/x7_-6 #aF\ûfbDr~˷>u޷׾W|5ֻޗR)"+R?::msk$]/f+SBlwjnp$!/>D1H&FıX۷Oru}{e|G0*!;Y+3OCwޏox*s5nIcRn~>{o/׫ŕ.j VXrM [DdK1QB-ը B Ѿ *euMlT%eFĶkHü9gaaPxm`_l"( Y4EĨ%xRr&$8*YYC4Q*6VաOӶ'δbSߵ`(ԶSKnUܵy4>j|>Gz9G q\:S 7 !UM8fð)Qic{Mc&_jJiLbZ;?_}Qmkoq^46ߺ+m@6?^"QmE DT\r*USaAPBlۮi+(WMӧ IBfl֛{w޽uѽG_z鍗f'6"F@h]>:|ƛ?/N_mɹ 8fDke~-O\ԇ{x#7 f3 X5ժ*l1mlp\m6nkz~~WʳHW]:X;ɻ6]ss'{|緿fIy\^>xW_y \r9s͛'0.W>/?/NpWyyk%Wuv,)&6>FJP%P"l+c.ֺ)x7kʆZ7&p{FDڶ̛FD,v1X Ao+,`"-(TK,`[h.ޤmˋ4mӤ4n60SG\0Q6>\.ʄiG-Z Tޮ` lNݢ:Pɇ _`(b ާ唺Y8nC)oaPJh;=x{SwDcu3Y֢6-YZyn{0 1m-R0᨝DK"1WT8GVRAt蜯J' 4U"# V}ZSED4}ͻ}{\ڰ^KMۆZ]eu)?=-f/Wտ77GEgE;Xzk¶mm {=ib)mcxY9H1RHEcҶnuTY&ҳbAuBBխ=w{;Nϯ>};hJ)%גrlfM'z\˻7~ίܼ;z;$;3?8ԩ&6!zZ> m}@ 9*U/L¶H`UT|6֮`f缈Mt%FU\s֪ " W+#"? '̀8^`igFfi6Ɍ>1Oro۲,zNLdU TA`$"VrDPrm6`r@@+%헒liwmZgjC8?p΋ԮkEm4`(q>\\\sLmcι|*,W^BuTpo`<h9I@'0ͪ֨\&nU5 yOҘ 9 Dm(]?S4X] Myg {ұRjއT)m6me;XCU2Y&E`@9GS50H!vTDR!x{K.ͺZ/1z]V)ʑsTJEhyb70czŲY ff]۷;k/.8˺i4v p~7=:??w3¥k/^8UQ5*# !dl.yjjb>a#`DضQw'OZ0泅*V캦zcajmid-sKMvU[_dZ#:GXk.W&gELui?mb:!8"T-}jJ#j]`_-hTh~l*TBl>dޞu>Ks}oÑ1ZkeXx} %罽WI%ۦӓzRӈ`"F(\Tni`lp8էVs"v-Dٙ;q &Yk!0 *cD$Bp# SKp޻F6*䜕UY 91#gU;89'*'SK1TlPvA"B2M칶8Q)yZ_ŎYdtD@k>xI99"c-U+Û9׺<[fo^+O ʥfn0K6zzz\~O?Q<:"H*<ukm$i09TnX'X4Vvvr>?\BȤWRAi- bؑp)}sk6GzzosεM3dsޒIU[t^~_zwOֆYmobwY?'ws۷oN58%ap|I4ʶ [r1xVZ W?A *Z蚆Z4sʪ.x79z#;"yggg0荢ȵ@q!i<]RtD  Ѳ`~'>Ծ{@t[ujnIu'!VݦT,myoxQی clmkՊpaκizg)< чRjE1"nYo34&{gGGv>s7kLilƢ &mbZ9<žqv0;Lt掚zqlsw].ZmVDEB1x_W!DIiluD lcD} cAHEk9'rdq;]9_+74Qf;lT,q16ZTUwʶ#bu1ܪɎnc Q y~~QlmSuשk^:Hk_uŏݏ6xW T3db18+u \:R F30 Hu-Me|J)"9ash K9{ڮ)\f^DӘaV+#8Z+ȂPja|6È\˕#1%S,\sJ.celSɪX,w\kۺzm{/W_z/^?7v43 mw烷R|=m\.S͋_޺o^{mG;۟gWDSB{1p|1 KyzP4r{Ө3r<80|/!"[g~7|eӜ9"__ڏ. 0HpaY9,o^׿e `>˥Ijsw>/?ryd^}t"țX?q j3;i618'ޅ,6WmpsNwD֜,L#!B@$@UEq6  !Y;!QD !28jʾDY rޅR TgSQBo]X+?R}@@O}ʰ*xQt^{ Z'N;>. D ]ZYļ*PǗ.yNmB%g4ѨG9G^].17Mlv^3su8pEM۶W+]Ӵ9aB8{}.eS;Yo{ f>:: > Ls0_,OͅEYznW|SK\۵ZJl6އm9%3EtFf !R SvH- ƞFѾ%Z۶%"{Yڶ+5Zd}G Lu61]ڽr|49?޹b.RUQ% ^jQEZ}6fi@u0 DlhݭmTumӚYkY?w>4/?sW'y+/3hSj1K!İ[L|rѯ?>[>_7'//~M/]3cZ+9ZaY-0s<[3-˗]>}xZKݍCP譈5MSr) w]_<~uiWZsGpPKud~ꍫׯ_]/v/=r:nm1'ܻuo<{ygլ3s۴yXr5 有\ӹvG!"hums&lf*`ċz%"1T3 i"WRjuVu'ZA`۴MqZy IhvqLS#wYf,\ "r-j c(Q0jdyK9G!*"Z&4KܪOfbO e`*9)ME4&waH*t8GS1}]Jzj۴_|qs6u]S xqq ]ׯVޛqfk׮Ź>xþEnGNTr)Z!ضMh nƻ7Ƌ^ڭNӭHbՏ87+.߹}~'/rSws/x]q9Z`lc"R6䩀M¾8;۬FY%lG t4&p wW4H-eJh-_?g]z>1nƋӋGw>x= T|WyS7i̽D:{۟oݿ٭ոW(v>iZ/CJj.v2*iLj}"\{Bʖag74IUR0Rr1?#1ڶEHiۦ*vwD1\!xg<4&E9QA"X-kv/9 9hXZaalbsQNТ9CJDADu`RovOuj{G R W8:w8mR9rȨf=VXᬻ j-%6eȕbHq.;fN9כ~6#rpX^!X?s!6º֜2 2R,Ƶ" m81Df%+Ƙsɩ=A2#*W:;VLk/ H6c,Զ-"7dtA"BfUX:AU"m\jG`1w.z|/?_9>z|뗯_a= TBxz.λ/.ݻ{qx\=8t{?Og%_ӧ@E0Af~"jGa3K  | iz99Aw=pTK]-WjmLqL7+s/P۟>?x{=zz+enrkʥ˗~$Wr%?yb$B@LC:ytz݇}ϾZ{gG3 uXv^:̶uK0(A`ͥfes&A?8&0dp*ia*h-Zr.5~~TJ !X16t O6*Dff K1EEciL ]!TͿ$F4umK|P, &" . @cv`r~Uʯv-WADf/b㘐HS.9=-۠y6GKMMڽy۶Gè(d8>>>?88We6Y]r:}s!k5wpeCٓIcntvWPtzQv9 [%]lf wbC*s1k-ż뻓S窪l "isN!Jɱilxe>&R6o(d(9EC#Ғ @_AqG网-Tfk"ҐFSrN#fq\)e;@;Rk%hP\T@#T*#|{޿y^i w:|u-fgk33z&J'>x'o77,׿fR;k^˳YD UC@_߼闗?-׆ {Ao,&85:gS)iݿ 56BN; !v=]Əd'G׎ݼw~r7߸⫿Uec _r:o.rzûn~?y16ןcvMtX\Ө RA47fB"Df #J)N㙔RqV25(T@C; h8 j6[6&6va6 `wM)Qv#9ְEu*6W|2s] Ty5r&4UxJر ,O@Uw"VPO<8@՘Rf6ȃ\R|16\rӄZ0l f=O<"_Zv|otc M!^,WQj{eTVˑm u; '% ~qRڂ%M;'1Z[WgQhIB$B ͐BmٴMsJCBBs^5yE*"]K9=F]JVa^[Mls:,]%z3؄@|F1('罟ܡD̦'pS4e^9"a.Z8WCc(u^G_㛏>Gwz/W/_c;*Ħ니X iDk?Ý[w?O>tfU`˫ӟWrkSOhr?pt8lh s\QNWk'[|D>{tzrq9Q(:GM(>Tp%汮i nkxKϿ忇juo-54d%S¾"r{7?yۏw*Xrb᭗{}kϿkyoȰǧ⣟v\ 'k?sCTRJy7_xRM)a8M٬7MGÃ}C `STmV'cO*r}/ܼ{vvv7\r7(i9爙 |4) u1xCBٜBB)%s'%!l9 &7}SSmF0UorGƄ`kV<4nD%gU}Y eS:$ Me=&lC)ٚ45NݙNU V5* Yse4ڣ)*0!ZwJw' ͎e[&ʊԳ[iOzHSK$@0Pmc4\./qda[&srzzFD4baAUXJeb> cJ)ư٬-EDyN C ձkK'''9٬+FBiOYhU4'+xԤe=Iz׭v׶m YeDK!hqȬI;"r*1Rj-lw 0i D2abhcyB۶8zT Ls%GR$&'Z!z-Q:lU,^k c>lM+33+Kabkdx\&D!,>RUt{2SsBoZ C}t|z˫'GW_{ڥfb}5 i!&%lN]ߟ<~F*3㝯4q圄ٷm’lQboQJѶ&Ytt{ai ۴[ @y\'c9mB)k1GJ{"W:R oT7(xT2sc)muJXDWdhUg|e9ۦ4&Ƒq Q†p{МMADdmW3"*;r;>8 qae|ATk)jk]5PXĩ#wx{w~s{8~w9:>xWwG6l RrZ%9;w& =o["rG'<|ۿq`^,kÎ ֳzpW[9٣H;,R^僋V&8|Y.Ѕ.]hMu]?ÃÃbz#azZr*Q'H>" 1؋<[>n֫~6+90g}?3 aWc XbjT&xsA_Hp}z߼bꛯ׏#b=x5?9gblR{{{1BXNr 9ʵ:,|cwNX\~L'|SNƬ&Trre ضlpf>49{Fm۲0K5qTr&%x,d4fq{[:f:-V[ӪBPa 9q,k L!D+y]6Ma BӴժb\KR.]7ZOiAXL λUY 0/Yb3"xd60׊1m<۵MH*\.Q|y6[͐cФ snfZm|{l7mk\*( 꼟nWs - Iy`>SF [iow])I:eB5cJ9RږV Cr*:@)|}4q\!!T΋pBDBfkqgyb*6M$rfrXkPg'#`4hZk5q !`&g8RHWզiuٸ9gaaZ9R "6pҤ Ic Z@1!Ɂ_Y7!jqPG"]Zlwq7-1՚m"ԶMJ6AcpUԚVI X;gs0:ƈpBA֪" R*✳ Y@\ m8D G,rCy&Uj.8>Zkb>01ƨl!blRTN U Γ"1K{>/./Ӻ ݼ). Wz|x7/7i"}\vclɯaf}a2'T `ͮwע[&ș"єlyޔ\O.~<|^x2"ZjZclKq_\h[X#d$k.9?J iZtk宋28Uq0OE̕ NV!&bґYE/K29e%ڜy[RJXkARp@콟83"h]&mQY--!+NXӁs0ɠMll舦st Y)&l+_xߘªSq L6cm JA@hSLi!zﻳziP׵|0,˜9ڶs/]6OD.FG %xw *ovYʋ;R.fmhZ#MP @Չ -OFS4~ '#@%$2W%Zs}-zD0XsT+tmW*lVj5pZ&=81u]hE]B\kFDc)R.{Yoʵ2j]dQ6ʵ4Ɗ"q$)*!98~y})U4 [Y l6TmC`8$ʥHR h]$㯈$vɲd)0|~{@|e5 siB56M-u6//1-su;K,M^lL&6lRrb M9 4%[0M"]+ê®,ӀyDNI.wD 7(:frI Ծ3]3Q`a@ j/S1 WR*ҕ胟8態n "R b;L(V՜KM.Yd"r۶c169{ɾfyBv`+8vSA$2r}c)>XѝH5ZK !l!r:<<fhS#%vM c3}iRB,Tf"6vwU nlb K{U>݇_|{{,ۅBmGa">xPrQ؄4$D MJ!D0\kL;ڱt\_Nn[„@#hRE >)i،|/N.7T/\bӴM3RiE)\Um7:*xz7 ծhp͗2ʅQAqS:blۖ+J5[KժSJZ} 3ZJl6vJZ:)6el*0U!@`]k%#LXkAbӴ0ʹ.@5{FD߯\sT\QUB'9"~`" ʌ`R}qR>pc :'<0(9ӫ46MTD;vl81T9!0!̍jE@kV" ΉŃ+"zꣽ_|>_t]Kio RD\8R RJ1vmWj&mwHHw.`GQl,J.-e)ҔضT:B|J T![tWƧlZûLj6lLfo62n =ݕkFT!P]gIF}3n6b60%k-9?|cg $"*3 1ƬB.6VKkws,po5jdYM?tWkU$hQ4*"ZuٲILlӧ:aomn..iJ,\9 (; ebWu!rlCCPR뙊z()CZ/秏ߺtqsRQ?w, gpL3Wf0ͽADMe 鈘IO{N6*[T''-`kуۺN2vλRJ-KPk%De/N?ڮi9wvv*U;"\m߶+q8$ o֛R<:Gl!Uޢq#2j})ms=U` 蓺 L08*<1BMd'ͮNu;?Quh};o3sLAT#QʹlBqm>Zf|H)BhfyqoK٩6j*)eks$rfFĶiaS؄zXUplg^~fqШ@%9;J06ZC͘eFQY,͈mӔRmVPKE&tCv`8QEM;SP"o}"D-{ bp;GrXk57Okf_wtx~ gCT@%rdoVyoPNop:iIͧj1唷n)z9|VK6Ƀa=\]~m˲>l1YE$"e0Czp [&'OaBJ)iD5$Ց,JJ"6"9gf37>̧ț7n޳Zs~qHX"G9Q$8ڶZY@ UK1kYop|q!X:ӯ1:8jfʺKH9-c w1quYsJ):%c0Ѳ.V"0!ZRF-Ch$ ZmZߐ2}~~ݎ}ǶExs&&gNMRL~1QsrJ?`)%aٜчx>^΄I+~ݽl _@I8*A3rS]RNjJ i˲|H<_{=l~nO?_^uL0d8'weɋc:$ϭo???GqeY1.fnZADWӔRR 1X?T82s?<O7'y<.I0+_1TmL{;Ku^q ֚I ~o/-eq>zIB ]q!b9ţޚcL6zwD.%_ֿ/.¢ ;(]_?0TM-qr2a)%1\i۶׷8JRN)ӶnD|SLCUu.1Yom$ B6puYߏ!Y_& EPPVMI S+%Y)y[GS9OWV /0}g>M^VZE14EyF`EF8U>1B*DDOW?2~${[DpF]{l~:&O)an4wض=ThbT:Z9cE;/f%H)>8Bv?Ի2M["OOW|"D1$1:w|buI, bb3mq-D i0@9F}ֵOdE搜#n0!r2#{ƾ*XQɖ;|eY>)eY5̷V*1V,ctCoۚzD~;2e1Ք]u4ԇM眗]LCv&h8yʫ܇Qaymm;lv;u 8r)G@;,9g8rs~K۶wߍc :){C1Yؤ!>ݽQok#QS8vsttEJf6#)Ly) !^ 2d@rLUFJJ<=3+y<^E$ƈ!%#:fLqtiJ8Pp.{ok"f)F̈!AiDyw4}2_u{m !ĥCB O=4&_?DO#3,'AF YN¼] }/7f"ՁsJCԡXB2 ;ܬX'H|y*x0}"iФ1T胖|f~Vt0mshZsʪ90譙r{f%m]9ǘՆN6& ¸oǛ8#|i87L!9BֈsNchkͩmZ)bhz# :C\CxR0(x~~>c֔vwr I[+N~LF)`fR""6wJ$&FrD>S{=[1$BȠX 31LI^.,Ӡ8yw)aC؏ZMqmQرWw9b6(H 7%\ ĘBzM VmT3jVYfNnR2 hAgfsGވ6 &,c#qpʌ> A%%1 !ucz˲0qmBG`61AƭgrF Ad!14,H8ճpAXU U3!01ݯ>}*Pb:#oD=Wo/$,|?_GMC,at'fJF8@pISR#Eϖ4G2cH)U""9cw9祔u]cw KniFBZJ} uQrR0sx49"5N|) a.K~cT uE0TH{ieHhF} N'һ}Ή?iBi$N,KA'v2:*A;zԯ>}}A~Oj.>8R &"Ul^2qp c(0C_5*B k8g#I! āBE>ęeoM)G e7 낈9DLY% >{Rr)=󄥔R 39-L,pjLG1\3(uqW5S{os21:)6rE)BzDZo&aldZ}}e%ZGjhYm]A~GͺfVc>Mb6M1rfM6> f@)B9M>q %YM?j@W>LTR A~M9@]n޺1F0!M sa mFm0&`a)#DN_jyJ^P:@3~Qb%SJ!K.„ JafuߏYHuYS 9,EuvfGoo'jFN@Qq_/"aZ70v߶m]WMVkofZw2<ŘR6ZlN C. y11d [f0uwqb4w bĎg 3GfsZu]גG}{{qC\kUlt!B 9V"cUP= |bdy6t //c %gS0ĉC{B]eB. c 2%j)^>wՊe-ˊ ^c .doh}tl_bОN }gg\ raUR 9Es3&G+ߕ(0@\GsACгHL->af7܏A1ֺ;]/W\˲g?mc۹0ic 1P^JMsEXBaC1nJ"Ny\>_DɟhΙ](prGq>Te!1zΥfZͧ;Qo-s z4cC}}c,K@c3RsgK11CH SM)y egP6#iT5= cځ9s~{{+\xeo#9jYdoHߏ=Ƹm "@ι;kAc۶"L}Ȫ̒s轓~kQt wuU: $kkFz[6תQDΪ \SAh #:10`b<NBAbwa]1ބň. ؼ8sJ#:Lr\ ؜3L`;'?PY-GO!9´۔yuN'Kr.2w~2./ p !6}[Wt vAA)%MP!}pVPbX(a C\gϗ:d~2]r-j9INC.mw5 !@de6jAdVG#" SFS: ֺ[!؃6@ɕ(WX[݀AP g:cw=,c7u[!/m]%G?!\J̯c—˖bB CrA]J~~y¸pވhY:!bI%#ML?s<9;S7r)YAB L$!A2F75EIhB`tn*$3[*iw>.K m?,"jom{z:3N9"v&魶v|DcI9)ri)πVU˚s A%/n0d#,ɽfAZAD @ O<r:6?wN1%@ߍRN˲<fz$`ꆥZe]W(CL3!ƨ rKN %᜗uYw?)%OA}t8ӈf2ٹ0K~{\P:Ɛ3[J!uYd=qu[m"R&\=n}GꆪU JֺbE$S*F;8yp!z}{) g` Od%wi _@ٙRfnj=+h'u<[`u!cz 2'7Քs q]O^mV2xoXLKI1o;~1.*&.yֵceI)2zqamՑ,3ǵ/ V{.VrI1Zǹjǂ֊LD:"0I ǔO˖c)>XDއGn?]?4˜UNգ]r1Sa魿݂a`~n.˧OD~\-Ŕb?wWS JQN%Hh3 X9Lj`geMUsyН*Moڜz#N (m>I(z6quw뺁K)9¡,zy#k=1d ~#wF.}UuԣTmﭵm[C^ 9gzZkfi05 !ŸV& >%awcnśͱ}10r̯iDL|`31E&CRa1B`jœrEB.E Q3GOskmf*1N!0f, >}".%zʩ#Ŝb h*//^gS)kw ċ4SfR|a?|,gG0^ 1EbmX8Qrʷq=ƔRRpp3R~>3qU-;R[{/r`Ea&TM$,eluaiʍmE%D0 c |(C8R$S"SU/!eZX}YbP6@$wɕr^u AR̽wa06Bb2aCa&0 EleUp-:LxaIO9d+s!@):'gX%#z\cѡ<qK͍nR̪G=!^ą A+"c8pN\ZF;2`s>=DP}{(#4"vLWsWtqFUuQ 8c`ژ4MA iq7rιҸ"Swn4q>JYlmD2e3՚s!{GzCXk{{{K).eɞS3X1%4 }!`s U뺁#$L< s&fHӴ MS:B'"uB)TC/*Z)ewpR ) zֺ;~Ne0ώ7H$(%rHAJ\10%<7EΪĽ9p}`''k2]ڧ9L@#kf>k΅؅x81 Z`;y(g"+"%GٶcDK Xlp~#nR54 9)!j,eZmwLי2NP-f~LB\1xb4w{ofR !!0T4R$f BNƄ,%4! TG!1K5MB2sq҉Ht#0f1%8zcm0W(́)znϠ:R vPO"Vö^LgֈIZR2>&1Đ֊9{xP dIz8Oܿ@""cyF$Y SsT<,cD..$3/O!y Sc!JXuGu71@²m+^":X#Љ[kC{&thXd@+,xms;=rʹ,%/z~~f `:,eYGO13QpNc^^>Q2Dc+y-Y@fYʪS'K)"<)&mE3˥ԣ9ѵUG.k?C4~n\m"T<µ@QȉN833{3ągDif+3xoyJ)䪶EXz("lTJ'{d,KN߹[ɗчIPžK [CcX2lfb5U cY8j qDZT31sTF/oRV{c\2)n%,۶ Rey:6L S7)&b73!"f0"2-e)v)vYӠ3E$c̓H=`G B9<VjR܈#ohBTĈ?b>f! a21E=#̏h1q۶!r؏r*yt}{{fj!4yP0Km?_>c"Ԍ2<\`ꓖM%HmJ-9)a? c"f| 'ؘ$hj:Ԃ,8ՎZ!ٶNXZs)̈qTL;utW7 'Z11P!o#ƄJF1$ۛ\D$wАCS2˶9xLJ8ٛfO`E$t{@}`ޕs$?眖0K=.~A_*"KeYcڐǰZsS2I)Ewc (jQq@7ndh ) CGK5]Ԧ<=\CVOQ-V{)%].+1fn9km}>]!)}B\~\ L ھönz}qֺT:z3\nKjmu }岩C atn@sʭՔsJ` ~1'"\6栣AJ9 chj (UWEzͭ c sQqq: bFV]j&ev%=:h&FU= *e cR54@}pPBC05F)V+b!Ww>bR|&f$0VCK Q?)xڱ]_(w;b;R0.}z}vřn"$!NiCJ<";<_BԝWyHJԿh%"ݾIc3OXf,01"ꑜRJZ,R :HD@SwSQaGa;dfX$P6}Cky*!^J|ouB-jh!~{{J؁"H|N:z uĉbwSJ"L2D0Ą4uغn8vѰfe1l]!rpY|d:ȃ p7}~z)CE"Q@ >1RN+9WwD.iqpd@$C8RrMAX|cb'}8S}^cA"6D ̻hR'Ф3X)wL]' H^DIFP\0`qjt. Za" ̈n!l^UǶ^vWwwZ\E 3&b}8 JLm:΁gF7:Z.,,D1D@wEO],7; DT62̤R G|CbBRK)xbafPinSNŘ^__mmgY{o|V[ Pr~zzzfC !.m =&LNrb@Zur\6P#WxhzWaq4u(}';fڰϪν}Gc&"~{}k4}FP4!Z2,'* Ƴ5>VJcM|ƣ>MT끵';ĘmK1ybm\Zmjf۲с:G| qYVavo˲D5g!H&-5v~&<M=_8t*9)LªQ)Y ~"ޙ8RBJ[mmY~&n)~|ZrZvڣwj뺩jJQX4y 5<gwnnSNwU/ 0QdĜ6yD0W'wndAhf [RqBd6 ǿdnfZDϺ_UL9 P+`M*XT9*A=5UC+&7+@1t(U5p__T <&ڏÝRiw0R hV <#cHY;yJYpu}ZJA VN)So 0;xdr/%)u4_2: #t&vXYXZoAk ΆѦ<.!UݶZmD~- d>5Y܌Y|(S[ 1}Vr"*]Yw)8cBLt-Σw$>j<@̻ܜ'˃]1~LԊp%/ňvcP,FLj'R9!A; n+>zIe],9[{|)sOfΙQe]'CjG2zWeYRJFt\@.P`wZ9{SSG*Of+ڇM9_u@p ]D0lGZq!뺚@x>0mPa?DxCMNQu+dfCH*AˋZib.r?nI6*=PɃ#E O'Ne)5β0rΗէO!- `,` CM0K$ D:P&q@ݍ; C5O} " Xl놧8nfΌ<{M2WJiޯBB,1d ̄D,+\=` 2c7'zz?,"C(\ f7)iCrWSbۺZD819E2;8(ɑ.BUbh棣T`l1"mha]Vaab6ѵ=2C9O9%6ޅjmu 0ﷻlcp '\k R Cw#0IcM0?cӨK>cp mat3뺢3ESu'<]#Rj0:zm֦C fn]\Uzo9{g3Hsʥ15s^׵,")"}rJ98cm 8n6_)@mALAm[=jo}]u]@~?0+k^CҧГ̙:9`LL:KG^XiZk}{?j-9 9眓OFzf0 0 QYN !ٶmYq3c|WDLtڎZ77E)B;e]`!D'yX-GgVݑgD<CsOտG>[1A{Ffnm883r۶ SUdR]jncj Uf)!ԅ\ ;Dl`3$b7s[ʊ!Ҥ,Hӧ˲ロk6\rC{odUՊ^L1]u~UmK%pb\ BC3l~f" !X3R.%CXJČ|wGpA`f& NSriƔFsu9qȶ}h]vN}"DLֽ,7p $cT;e)tL7_2p<0񇺟 / P3#YyfO10+RBС侮+d3c aF|!b* '쥒cr1JQ (MK6zYvۧJm}?rۺrVmkmf~` R}] zو,KJHmPr.%P{OBv^$IӸcܟNKәcs7<74LT]DtlQҺfc͗>@\.3BUȁ=:.!J[ ^5_llأa꽏֐|2y1F洞?m>?m[>o~iDADOnQ+8TfC'ЍtzNyn ZvZ,~?z}r{7yq(mz 83tIIDX$d[1|&ͩ\e(|@`P`R"}=YS%zBYi:Е6"N1?cewQTYaxwbk!&'̟ևd\{Rrι[ :fh~"@af a{*3d[cYjmXBrP0B]̞9ZSRo >ySE,כc!ILN~ !83UD?X1ݼC10G)eXRp)2;@"­Vm%U/1g1;N_W"ZJ^,J$އx KY<[gbL{DϿ/zl1~ڴòQ`d!s)/Ny m]|ew،f0tm]AQse Ŏ(mݐc-~1o!mA3v5:& m)+%#n oD1 1ɦAVu(S @:~ʇ@? $rmW`B9)UUϹ[=8t5DѨ@. rPڛn;!Hnb:1=~UCȤl%~ö]jݏ/ZAnu].˾ﵶB98F7 ȃ !t91ӱ4=, g6ƨ-n O*n^1p=Ɣs&[7X1w72߿V6pUU mIȹ}GH W Dߎ/V!"wSVQ`ӱߏ9feCL,  󺬷{?Нڱ)NlMBڐgpղs=]~}ϳ bG|U$t#6ID߫ϴ3';H\7r:;Ez;H}攈)C:{VB@ fuYC.G=0`0%9CWr& &qcfXbe)hAM 8DZz}bZ &wֺ%ȟx2)YxNɧg{v)m_?6<!~7RZXQhW>GO؉SkzT֚2{F)Ojcm[)e?s^.{)~mzhc`c_GI07>E'ˁi8'!쾰UbHhHL$4)ezoI @"ZJٶSʗDZ 7?~ *Lo5焀13CoM8rfLUm~66nۺnfrP^/# JCmsvrvbprvGs."cϹf&ؠpTUDeYS•6PCnib˶n7&)lq# ;<3*.V!8"JV+xףb9ŏRt1B1A5K)eG쇩УVdSc iΎIsEa#|Ch"W?S`9 ~ XDZ3 9RTi H)i=ȓ(B'\RJ^.co#u1 )`.e볔bgL=M/qɅKI"3z5ƈyS 'Abk.~yk'.Sm$QJ&痘V1}ߏ}9/>}J)3q=[ uYOw?,)Ы1)iv݀ꔅSP4 cWg"S˲V[(xzTEZe9-(BFpqRFSL1==]q^$ZK.2-6iQJvY ##bs0CڟϹ 7|Oy!ٻ|ia穑p&1g_N~~W~d&%~"bfRz~~ʹG;<譽> ףV01# ~U:3j 4s0Ig-jLnwX>o00jw`CuSK~!R9Nϟ?mLfĮ2FXrLfjpؖ\Ȑ(DDR)NEJXbH! @[m,c^!a,ۺewHd쀅YjCSN6[e)_|,/$DIf~1g SP0p FN>3 d뿾. wP' bm\ ZO2eyb s mP:EJ)6轍>LqTXGaD(B IA@uYrN9r;*KYv,p:BX׹"flӡCG77?Jn^v9duY{G-flLLL?~ZS4z%ϩs:5B#G#N Ne.{@ %!1'B)K.y[KKL,o"z-˂;z曯I49f{AL;%:/E*~T8|"_D^t = Ν0G/1M!b w~;: qYzce2۾BQS Z)1Rۺʉ#^ʒrT>U2$k$ AX,q^K) *3=?=GW-9ί u N:s u5GSPkC)\r !T9#KL9%400 :Tr]JAL#X2%]U ""z'w|_[ Gċ`{Q"1`bR(P6&1 yL$qJ` !H IDz반Q[w&Z o2;(S#d$l"i02uu!!܇9gSy3EDQe:T$KO)"ŖP& 'TFwƱ0jYn,˺<DzRʟ__y/qqmӾ86gc9;2+}J<In6P8.˺.'I܏nF_\b [k56U}~O~RI)^!S ARH 2v(j MGlO6GDƓ'd0%9U? AL?s\q{AB1R.eYRJz=Vk#7԰?: ss"a!Py-mkN ʺxGe5RRʶ]ucXcae~X15R) RnXƒ1R3쬽 H" ~]UZ6|Fz#8UP=h0'1- 9u@2:d̽[W#r $HS"8g،uY{_eY\x{W7 1 LR kR:p`!C$YXWR9scu_)35SbSW'K0izX~s)R^rN1 K1'ozRLzqn1m]MnX攐r\-gˀZ@cfK)5]RZ")pc&˺n31Fw)E8,˶mSe)"'_~L:ٿub'p8!D _8xiPCuRRe)ce۶R]DFyTq"*>z!u]R뺄 vTBH%u]CD%y6JW g@XٳA/?cթ !`_ n7N SC[O)p2&DbǘDUc|{}?ql˺YLK.N.$n̐~9R)1tB2Tv#Z0oDtّ#RL,F/8k2 !Dt iƐqİ}A|Fcmeà{0ռnA %#K~ gkRF<#E=J)[k}Lc|y1)\<Hj󎜼[a15So 3tPeYrJ3uYju<>:3 \C$7{1wa )8GCv ߯ɯߥo"/LN԰B"o'!3ASDPl@9C)N 0BT.0I9{H)՘q1Go!!MSr1>1k#f"#(!ljǾCsLb)&c1FގK)"`8ٱ뺪꺮9|jۺn rߏCч?W\~!?zvm QfϘ3_N3V8 'rw dOK DXf,K=(+[@0k0 5S{,g JMOOHy}{o cd"?j9___CO>d[Zf#"bcHtsK><;/(.Rǟ  7-s cďeWYE¬k}43XUoNFk>3ZZqwt9; 'fn)9P[C~C)FW(RRSuŐAxfڀ:t3=]G{J,Fc0<&AbH)朢 RdfDaFSìc!P뫻Z䂜^U 1b[3XAN)daI@1Zm֣֚Ř& X8vIP3fนN3P%,tUk7SKZ cHr`]A~Q_&s"tnȦ\i6̑y_n%ӐE 9z rrZ-hcG1FfAxaoarv51zksضZqTwϩk+p^o:>EsN0_.1"c De{?xLWkcf?O~ }wA"x}qQ- cR 7wA(pkzޡ#fpN-06z}1P&#c3| ~ha (dQxV@Dt8-L+B#d_ ?C{>0ۺzo²*FD,魯ZrޱuH!ylr'Z5ƜSo܃Dr.jM>L]cC# bXۆF6ѻ{8Սdh!HN½r)D=m]ѱA1أly3x"rZ)ĤEL,9183OS*$8ڸ1Ça'! "N."{ rS!ȆD.L_=gEdJR̒'&jfN1ҺF!oѧ-,?p$i%Xktzul#O,Q=8N #LLcuslfOdf&$23˪:q  >)ڰI1yQֵb51UR^Pm[^Ȳ,~~z2&Ӑa> ",%/!wҡv{]8j.%ŰV[}yy ;tx=2Eav 60dž5~T#=퀀b-1٬kq=3"S=S녙~?}ݺ.4z1tǺpuY8BLA#>JLiD PX[K!0s 8ԥnP@ݬ &I8sAmz \!M/ 3|iޜґ5g7u?Oހ:H; "o4L+bLKFQ+bHU0jcbZBa)w[ 4&:Lt.vlK;Kl}{Ir~_z#Q={%>D":m+$"1D\G$c|mj{k_; ^BdqCsVSo1#h1 x@oo{Wb n[ɹr݂u]R}5p8ΪqqGr^r3/ XZY‚LP=DmsL3s9cAiV'ăr)AH)/KnT. }H2AjLcs?%0"c"YtBIӳu1kE @>p`jt~LJlhas뽏IEc+}Gk.Q9벘Z~~e ==炡MJ Fr9B^^}?P11Z,˒ !ow$ZD-}BAr9ZLo3_/?Y]/XXBb ɱZǢȉp6>@@ç _qz7nSJnH圏Zc Ǿz1TvC4TcRBz]ע:G Ww "'0$ #S'0SdDȩ]vv O|[ErG=9ozD^@*6 בD7?aT# ^>U;@*,1H9{)֚<5E#K/Ru9c]mێ{G$и#pPa!pAa6XBSC lZ{3>T(i% !HD)i`vsY>1g8JZkV`dҖzhۺAyaoA=t`Q|>c(Y&,^X( uKD74.L!LM}kb@'VTyj=S6LH)C|BR!0r> G!iSBƸt|73;tnPzgd%ԏ>E9w#I 4\9G"\ki=\2#'D^50Fu)D9Y5/¼. 9S!"- r%A E)1Isyyyz{1PIK 8:t˿o$}+s_ LiLm9Ʊs=D15tr^sw#wbZܻcbfFRpYeK~1HsfHMm0qΩbfc0sOh%Ĕsߍ^_^>asL~~[B{h7x8|eF3W@8}щs ?lBUO[7чzNyϙx\iY֜vYY^'b'9GI""~@ uNezôd=lpH}83x@<`8眖ei67iZE(Xr;t\Vtlrgb8' `w=c2SCHTk N641K^.k V.g@r^Jΰ2"3eaӲ[u m LQ2?SkXP t \Dr^ DiNƍaFO 28m:p\'uWqͣd2qfzs#$>B?Vs@D)9zCMCEqzSWn~]ۀ g.ʬ#H1k "͖,B؆弔Z&H0[۶MǸnء65T63l$.˶-y{m! ?[O'gxMN?229>-`4Z|F0Pvh8Mbwf^JI9bCo CGRI9paw;",kYRsJY`hbD:sꫯuvM߆3 '.?agNPuq76;Gr~:pW pU~c{c^<9yeA.Jc. 傞1 ,HGr8kXȾ܃ՓiY ^ĄZ=_\"1l]6z9!r=z|eYJJ1$ uJUUiWjmK)L$nHSR5Oy6vTPXRA@4I="D¶d'149URD8tT8YJNtCiudx7aFR$ur3d',- rk bD3}r:pӅ8c4J<+qb~8s H=zM{(%gp1 1O1پH헪RAvPNu8Ѻ)%@j6fI 0W6=C"[5P+`N_wM)>=]K.jj6ʒ~WZ8 "9g&!?[㙿 ݽW#Lp\;-i 'CrZ1șR$t{땜p43.ȶm,ޏCORJQS"(~{ȶ~z,K^1)*,OOOeۮ4=E.0©U؃=ClZөFH^ ߊO7A :c ,\Qݝu!b"Lx}­eM)>T+MG\Rm R)rTCrG4ѰOR,.6GHιĔ؏1 ZD3ܬZkU3zn)>z!Ŵ3)9ZYp4ZpbJ뺁S ʐp\e5UPƀ)Wh$JJ ?Zkz?jݏ]:h:{h:F덉̵j:p6?k1Bc,t% D1j/nMDqSq'j>fJ0+ VػOdی?'1>C!3hsֻ!BHH`\K)إDk1FSoHZHضUsg|~߷mя~xlRPy2b)xWh]mRuA,pJG(̮(Fn'q x A~Fј6oga? :P@sF t؃7I> `b3!;E >.y)*1B !ZthL֚c^.B7 '5g0UC @kY(b1L]B ~o~?O93 }wGj?B"qI@gZCΑ 2_m]O^TGk;O2wwbYӧ0ثn:. SF14|\&11aėv^uzp^J1|jss3G _x_0wSiΐĎkNͽnjHϗϰ$o0b3&s'WM?*i]Wա!D! 7w7[~"[k1T,,rN%njc Ĺ%s0q)Yu]lqwo=L\OtWEx۶0Ѻ.ĬC1WD(łwZKΗBν7Uyqwmue9{_EDhvCL= -ƸεP5u]C !U-L7gBP&8 K>U"J@P : 9SIXi^6bF~E& Q!~H{xlY6Sd_l**7'dq9d{5{ʒsJ9DkzG%Vaf jqY9ƐR>#:waZt ACaipW1u\@ӟfJD^s>= ~75/_]?:p}Q_߾8RqRL=aс?'`AԾܿLd\%2XSb e],r^kgq7y&x)Їu~~1=LĹdrjӲ2vb~ H'/LgH~{;x192*_l#8gcxerWE.{75D#uņJ81>F1"Fn"~.eA⼎U\.kޯѣe ǘuCVJ!7S/9+#cqԣQU>XuAp%dW\94/K]Cw%]95Vi>|eߥMl: ֙7 ãWtYLӾNtt 9b j8Rq6wjVɚ!ٻ4ag.\jBau=ׇbUۙxdzU컚Ms!#FcWgyS2 @F_YL}eC^u" AaY.kfO*:)].Wgĸj<ϫʈTQJVAVuΆSE,\eQ~YfP;3eRd5;D41m>s›s}.x' M)9/b ~@@k"Xi!aコՂ-gcqAɲ̹$\t|GkMN9s̙[^6j8N.4g !А C8&MbQn!ewNE)ez֝àW8&VMwʤ:WG.oܿG#IF0YWI5V}_v}x!T^)"V3WKQ ܷ3 и]v2Dk4*uMObP)9D Dq)NkV8!SRJNC09J-K1eB0 x< (z)& kth9%hy ܶhkwe#YjHP Ŷҁ`KH,NH}0Ƽ! o[:jʂa]@ûᄏ |=zq+i "ƺ:) ɔ@/3@rm>ey3ږ`9^~WcE@+D ʣڨVt#,p R-:vAi#k-TIsA"o?ۋ?$uV1(ۦ ;5IdBop{[]pȠ)Zң%#03T9fF~ f ~LRԽD U oBek2_w:*_X^ @AɌPD DZ"`2@H d[hy`ݜ 9DoqTWiOVު)a-b6@ oIp@j: LEM54\pxQɈ4=TO%D+^ZRiuhúFcHDsPpHD"Hƀ16xS)RX \O-e[lCSԏoBz$oQE@&ilT@#lHV '"N̢LACRXᅾGYZdퟩh=!̼ܹ)/ښyFN+l<>> ,fx:1rEQI61bRJ&105R\JvΧtuǂqbpX~,(V 2Vhi"m 0C00Yzq7ׂT\#9"jZ }Ch,:ߊ+"4Xn7}q}m(*{dN{7-1d[ֈw۪ԃ knN!y]Ϣ?`Tu/ 4#6)I!Ŀ?_W$HےkeumZ)k˷Tf~H0X"-[y|0,jaj+s]*C vWiЕKJ7`z4NW5K!뚌)wݲD2sɐ]ެcRo/c4DsҠZ$R0cEH1&B1sp88.3" 7K\}78,Tu*tmERk܊JpiѡE@-Q m&q`t8,/_H/Am}Deϥ'EP\3&>#K⹳ri~t( lNyYAzYHm6neֵjkxqU}&N;~7S;-H2 RW) ŪC-w{v,IW>7ۏuPGp-kE N=eq֬.}aم]YС:j[[xx&2@}^ e6 lB}i\3IHTJ1dX͏D4"md)+mz6wʵ}ۡ,7v䷻)+L o*3i)T;BHX.)euS; Fe[U9UXkEO.W/o[|BnWs` EMrk[yضͱRE,.jS˫m'HΆ`Yyk+#i ynOi@iWԇKZƽn x<͛aۨ0[G}Ã9F\TO.k.Rʺ,1FKtr14Aq]r8mѝ1ru.ˊ%\xjykQF#={d I4'3ܲl'|K-Ă*)XWCEd7"]zZ3г<X` RΙ<1+pYگ=9y<6Iy[m7ԥ_F{P0l S]"nx&B(қZ(Fpo,ZeQvrD;ɋݥZkX\)BoNV U v㦸*?$,"W_{jg-¶r.(y-:pPyXu/_Y| ZAMc3A$N$E1i;S;#e]tqA05ץuZO۹&UTvbyA}fEܫ.WOj{׌!Ϳaa^V1&"Qy%LN% ^)E 0hRL)<_˲[Dq<_>Rze./oR e5p8zoqƘ;95Y?/ggAفE%1nOO/// ;sn]xSk) NXr)y?ɯ] kݭMQђ}.Lfl}s?ZJSc.JEr ]k32*`YliLl܃7pCw!lX>)bR=`:MEuW P7Y[g}MJ%kR:FӗkMmVutfp[ nk[U ,-ӱ ]kn1pf&pS"訲eڛWOv Ƈ !E6$az^FZU}V~5H5 O*9ʾ*:m6Mux.Ou/,m\X暝*|`!,H9@$RJ/7翇o[OJiX߰_ۇ4+a l%[qBlKl6J Wsj)DVB jgm,J6Ʒq??3VoU&Oӭ+|?_+//OOOS^c+aQuꞫ2ou9tŵ暑9N8/3A|MjPCNhB03+D:rI)!sN͞y(>k <|߿#,gh}z@uVn`;iIGy Ӗ=n[`*sJdV^OVgo-7JeJVKRKB jiuld١Vnj DVmqw@B(՟r J`/+6"Ե/y:7}/jА:o6!R٨yKz6W{Hؾ2*nn_;{B30c4-')驠Wn$5T_ ;~K2Q`xSSK<1;u@\T֗R_/s)p8h4!߶nf\72\ˣ&Pt,LBrmU@0'b2Uh#^Zڳ 0 ɑ:/?+mqfƄ~" QM("ێCEA Wk/W6T 6vƮV2衛8uC+ڀ3uBEZw`EnaNi? iKܟIϥ; IlnG mKjTCnIɦjGPQWHVI-m;nũM'"ku,ʹ ϱM\!ΟJw5CH\eAR1(,9Gcr~so^>k- 9sW]h۾onٍ}OM䤇FIͺ$ءR,asK%q1r}$tSX- P*+SJp|-ǟ}v/뺮Es585_:;s)"XC 0iϹ3l D[Rv'٫ؼ 3V`VtFu ./^n(&\A{0Fշʶjgo*s+by{S|@i%Zf./O gnϿ'D@}.9k,kfw;a˯[ J`o͵i)XjA5XZk.BÈfNsl;F+Gf:1r7cɠonfR(%Uժƒ!Rԗ~|0rM10 ^=.r\.8\7].y7HH\F$Cq]uY  )EBD#"ƔC2MGosKskoR5h K]\eb{4n=}b}zIB o-*CG(]vDu&\;FZE,]cۈT!6hNg5h; fm\ d=ҹ_U;vջَmO @1[py-3EeǺpm(7Ms̐:Yzɺ[un>>0 |s.^%`,޳o[yPJ~oW@]N8#X<)il,K/߶LdGo:C{n \:(udҬrkA lie"DD~ 5g}EJR?>8m'̵Vm#t7$8MXMi#K.FC[SAMDUٔS͎I=2Evb vȎ:"Q߰jVMF˿G&tm۶כzb c9ȵ๳JM~nń6c&厎ρ놺z?VFpJGY47r=?jWߚ6v6ܜ";#ˡ!T fZ7mI.,O;f]10N lin9a9ajl+;17濇_)]u-]ߏ=uH+ Cw&) RE1t4qڮG݄tu^jZrBN d[Gm]ɕjRk\ g$ϲ))۰S )Rp}/|7~p^f-اiZXQe1Ƙtq//[Hfw %L7oޤ̏qe|)LYw5ƈ=RǑ5LD1E3/KΙIS 5.W7@ƵXe߰FIT-_;|.l!s0:"R%w!U)PK_h^ahVPCdknDiAL2U ;Q*a\jrN} p.j"OUx}뮸c;P5jTz\z zOgdž $n(3z r5Hp'EqhNr;נ^/FZae(.jv-tfFE6_z4` 9\R"EKQe2lFQ{sUx< Ρ,̿AD]Z@g ͟~>{#6zAݛ;3U-v'1˞oP3@y*_75w15e 8WX⽛eƘ"7?@Ω-LJW%z^EKarS)94KD)뼨nY?9h1,laeSNhp_c3\pByg@_݂1СUA{m3R(7c(^Cv3׶Q#W.Ix H@6 ntygqwAxNʠ!A4 M'Nkߚ:Wh̰:ܹ==K; _f?jbIna hFiz}"۶:VKwjڝn؁Bsj89}L+`}ne{y%2}h/ ?m?[ʖDAJD$u hsuS,趀HDh1dD{Wdv@iepUml67lG6S^M ׌ 购n^C" MiХW. ؔ3l۝`g@uN~u'We ɩIWK\+Vv6p;m銱sعװR0̂7"rFET`4[aslK6z4Ze:2ō@b;0d't |!ٵ*rk΃ޤhѲ|+2|_>ew 0B J8:o\RLvCSu{wgUnki ACؙ+o ;vB˝ՀrÒș|7~}5VJ)˲h8kj޺hS?ĘĐZkl;%Ȯ L-BY% D"8 mSVYd`hqt%QJ^{ήN驜͕h{wh-ݿ 0?tAJZ%7w`j%]H//~w~4,E8/'?w"2 9})30ACj:_K\u_^2[ki9;gJ)!м,痗u] GDZ5D bLryy~yq@C"ZfH121,Ơ C c1D, ?_9*=Nj'QHr̵[qyMVmH'`)/watimjSrT4[.|5[GN{$7};N&~,;HQtd`PbkbuyuB{$XV5ޥ=zllApwٜ;kMպGUQDSK MLjW6A=KpajXA< '5zJGܱo6NDzf@8փ23K$ kں(?cN)i^ؒ˺ICr-{^d r))%eEZE-ݲs]؉!DƳm MΩZ6*kOM.L+O_?T|Smh]!hk%8%Lo ߅R3s|Ǿ۾[o=<;ϗ*aPb)_XD1D9DfYcD2 PJldU؏sN9gg|9;%8kPJ)l){sFcݺ)E`)xEi:G(L~7?iUvb W V:k"=NH] {bj~k_lOj⽹S3׺7G%AGS 4 [tr npu&3, j3Xvi۞,7d {Q%qQgu*bjfd2#bmi/C~ k(tq**F[9ZpMe?6Wow/?)&t΋KJI7)AD׭늄TJI)*e)XNJ=A8smۥ]܊}I˛Ol\Sߨ:j<; %M[I?,n+{vkeҰpX>oW!ч ׫lw> rwwz>_z/K4d81!! Ðs筺39d"᠎DwjvčK{ﭵb{Af^zJ 1E)5w"\5&g}߰MԡعQiSo).DfF;߿s=LMSǭGh'I$R}KGQ'jVG6ygF nv:H42q̕ᇝ;=)ntS}J̈́ifpMJF;SAlowнS}{+܈"cI frN-ߍ_/f^g{PȨQpʉ >:jcf)0sJ{G1bL1_-mbrkigT볶EW..@`=4WC$xW7k?iSW57S:&g\ rKOc~2@$%%r)0zeR8ƴ,s)Y ȧ?}뭷srEėRx]\yYeY1\Rt"u9i)TJ1a4Xg.ƕf-s)h&4^zxbRþ\%}fiIQmc-5 l1VN>S9V\yjfÛDvOF;?4d c܅&nD cOvtM}vU ] k& ǎA^ޔoW<N1T*;!`5D1w9l)k! CT71qإ[Dq)YvI˶4ݐa[pwfbx-ɴ*K]``.aZηJ:]yo_/??yqc btF:3`)Yɠ8dEie94|~y||1ªaD ! C(0 < 5sc3Ɣ/"DD{`.dk1Y֘ sf"z?h2 8גSqY_;=2ЂGޙ?=<toaPuY^cKJ1 ?{#}]ϐ/KuosU:qMSjϦ%"٠X$w ED:ݬ233U>tjIE[tgn֤pRG+߸0vG~#7~>L,~;.;ˍtg ^6.oq mNZfΕˢ^`-lut8v]JIpy/"d<*`$p܉L/ڲ'CpőQ / _/2 sA@%ܭ!2ιM"ݝN8 3U6Bэ!Z}7UOTۭ@$DA7}=bQm$.,/ܻe?A\]=b=TnG5ܑK){n@?ѷ~~eK)wCq'kψXJYC)m<_Y^yF"z "SNDu4[)|1eYRd3: &B!N @, C0ct0Mx$Ĝ:!-f,|0d!XBe]yfqru!W/w'zfܦq+EDF,rcTQ/+tV͹ܘ@w)oKYZY IB&j~WU,WIӮt[w˷k>ZsʝU@{ܙz2,? DoX?1>.x;xbJ:vKHE#vNrtz$ ōyr̔h߰ S~O9&.RA}@K)R M(aKY$;s6gV:Xk%^aDĒ փNGԙmEdsf*\p5Kߪ9SGomlrc Θj+ߌR͠W[ E|Mkf [A3/wN:kLdx8\媔quuEbq]V!:O?\eafDDss9aVyG)k ,<_BSJr朕9qǃ1XJəK.Yc8޻ӳ֐9pt:paENwwtD5YgP˲Zcq{/"Zf_}qPpč- 7谈/M Ty_f+KEo!u+q; "͍2Pe!)*[ndm/YD!鸳'DyR̈́C 7t~;xܭP4nU"n'WSRKg5[KY)U"&jl=memJ sNeo*F/"WN/βm$pfoH`hp#u|co~3?68_.gDxw ˺b\(,s1tuoe.,"X155eacyK1E=- vToZ*w}:.qJ-awryF%)TzBbwW?bwvyO\oe >Ga:8kӷ;ٜnrۈt5 7:V\##v]:wg4G[Y@[(RtjL6 RZt{drK215f݁ѧqlڲdwˆ. oq*iv-nt?qVGx CC2|VW~N[:9tPF]-+;gvH A(gg^_ʟqe1 )EB"C:aaFc,82뺔RY=e89gC ~!RYYX0wά+"[K0؟y}pc P'ESjgܛV.]4{_z7"ƷMz~ff:tH_+󋪽Ã5Y⺖R>ӜKw{~~yd֜NzK.x^RJ".fˑR:/Ldw:Q'08ks.,sZp<eYs0KιYEdYcNYKݿ|+o l= gH q~.yƶIxc|,@oRGlX$׿<5hw))VgDvzu4a26%nP~`XS1ԙ]7Z-#;)?w|-gg dW4K>{V:ne6|ٳJR%gkЩU@lrx)o}1QҔǒHy!0.w[kCD$x< 3e^DDeADC)?o p+d6/|On^@ U9PL7HS(YnX TU2Iv5Vv`+~!BڜcIDb\ՙ_GDs_c?Ǽ!?(8RRއsLK: ؜*5c^"1zJ\f%0"1TxoF'*%o@ \yLЧ=nU.4Ѝ&u݀By@{ xuTMݾ Z&D0=쳎7 .(;iJt%ͷaWf"7l66E;\KC>3H+h݊VS6xx;r'resx[q;!BsS' gD6mx@ǡ.tŝAk3W\ D_ c Q)Yu1ZSI'%J)1уBF>*%[ο}G7e+MDgQ1CT6]$swMwSuc;;\67o=-t>;-5Wg$wjr᯼E@1`K7Nw)Ƨ{xx,߼yɜNG@1qaf+M+a:˼:k5}13XkSJ1l)ecHc^^^J)1."p }qL1k K)dȄ! YgQAnYy^ILqzbY7 AGD@; U2Zy"gރr[F uxc&lh-BT6fo{-n+ܲ)Vii5^X޸m7)9^n⍦;s.R ݩRy{> vu>i>T b;YC9בtW!}F[jA.&z 14ا9®}/g@oieUo҄P^{kszcTaqwXXP1DsՔ]B҄9P9[C_PCbú<;~#oyEW,uJ{jsɬ8h? , 1W^Yccj QM~jdI)D\E7C0XkRROď,FI9{\Y)eD:Nz 4L"2J u9Vq,DtwwWJLJx:R+\.W(E 8 ww_?q\}IMn:dƂwiX]-3 m댻fpO֘Im:>kqdDMcdؠϸ$V?jGgqZNC={#^^ﻴf:vymcqg[S/w_` pM Gf:Ym(}ܾ5}Ec7Rli>]m?m T"5Zp2s*ם9"@dy\ bがǍm4 ZcDcL1 KUÓ+KV !v vHsԵצ&utΖۢM:2T7tA-InU YO $ ?g?_I)i8N)zmO2???]Jq眔[Dr\T8|˼hç}vHdԋ93ϳL!20C(:DDƐa?䜈(R kN#B$\Z+9PX[JZ׵&z8 / JDC$}^w=~}ectlSG;ak9>v+{?.{ce6k${г>8l [zF#41@,Hxm2sMK[b͛3r;[;{ָ{??YkCs2#P)9sa9Bo!y" Rw֪X x8˲^.}뭷aXX 5\:NC)_~Mӟ9Y"123s~G"@{=HygQ΅0c{hүRsdȬkfGkh0 :D:_KJhK^|h ! [5sCV},juowZ0?0Blf4[jn5vRR>]*]гFtrIed$lt t薥,2zIM=n]⍩+7-*OA;njClF4\ěUp7[0VՖu {k(]ffLOS&Ak[rA&(;\t,6  t<q>i5DI)ja:x$$CrADu0%31gYmW'*5C9N8/`ݷ!ʒdWi4[s3[.]pV}ks{;u&iE_/UzӭunINn _?]1Glr{9'B`O䧧c)EܔuARN)!I:kRZ̹nιy^.wI6x/!՘@) csΚ!yqFDh@.;M*Xkuп֟}= 0aSjC5(nN"y`~z:b3iQbbr:yAcdn,ɃNӚEP;ui>hmPYFOkplتmkGíJ62T^ŝb3iin|׼z6!7ܸtecهT vW}Mv,vat=*JeEe;qDY\f]~=K,LD ~eY^^*O>/Ygu܍̅eձr Λ7oyYׅYvc1kNgJ a؏bF"B$B19ge!터nYuY*04Nm.\A^km)L[kmIų9q~_<=yJPyͱFS{A橝{ā6 >ĭ iiܝNP]pq˔ג|s t$Di~* ~hY !K*Ȇ^cvzMi3bDܰьtW?@̂%#.mw7;RQ#[L(?s-~FQ np/:×3C *9LfRʄK), ڈ0c "<==c!.%D㉙u]uАKc0\[_n ".\œ*YWoȲ,Y?R\18}ooLs5Lf: nmXcbt.=Pul L6!fwEͼ~52JXiɕ7q6noqTdllY}=2w_tN|K\}rnAEb}67oNۇi-]]L[A5^n/*g8w>2؃wWd n/ jw킷˛a[b?iB(/ xzK.8c)YC7 |>pԑ !X^~C\.rqb\7AD„t^ B(\.pC+0̲ \]3P'1:+ө>μ!u4፲zYr}ܙANbuR?ѯ<1) D(zapL0ל  `R6RL`\.Dt8D<_{眖9sv]ה0 ԦA;\13sO>9s2 AbR1Т$Bι0Z/EXxYIWD%JRr)es?\㪜Q@K);g1Kgo;Kaa=-]K)<cr΄auzYYl 9o޼)hCXpr\PT M9Xp89EҬu58g!RR* 2dHUv咭59$4<)q%CR$HxRr)"2,3" .BY Vxn[pRb?@r)X &ɹ!b* \ph(sK 9D9jDDbZ25f Y ,BKQw #9댡ONL)o;~q"s!@!s)X. !ܮ aJ{<6HDu֘zeG&$X5DZya ћgGc!z~zr]gg8fg,c3)R;02/X):_Dd{ a|[C.ȔTR9E)9pqO0Xk2Zk-hI˵m>,)&cb[|1)"Ӳqy1ޝN0.9'hy5P>sN1Ðsyz~ kAx:@$b !]_Z(bJ)#jy]:Myrxr>X|M8(W٘\|'Ydfι4Y)ibLoNY6VUl&syf.(r89gt S|H,:4//g@sW"xq&X9gfaT h -K $Jr9 [oU ϗW0/狙+>x࣏>Gg|_szxx|~~~xx8hFp,r~t8LeDr7*xkl.eYzTeJ.]h={?"Ou[C1p to5L0 ˺0"EX]xT=GxDk7;ãgç?q'Xb5p C8N:\Ra.91.˲C yaFDk4pt93'뚬3)&@+Iri$jIJ#-u"]K)FHOuYs.w;!1֚y^Ι²Ƹ ?^^9'Cp80uM3sDBba8;旗c}֖R Q!Hc|rOSNr?_zΪu6l Yg?cDjѦ)c?QhDْ?ILiF їc\ E 䜇!~;W!6R.KXzw:}("w~K'9嘲s;/l퀿/KE R #0"6U%T1A?c0 |}|!t_/WOOaH)痜8 .xr~c̰!rJ)S!^l 3(^VVZ8N)%\K9i5D9E"|xx煙dqTSzz@Ƿdkq {i:>׸r)>k41p%_.*^c:@0cK9\pYy.˺d8Mm{Rȓ5S-K,%[c!JkLZ2U>!!<_x<R{33x<9kS4)w`.)Ga !a zwwOH"k-@n)%YcJ)Auր(9K%AXd$SQM%c Y8"PJP@23[K"JYKD\Qz@):--DPuYq"#ޫ͛'eYS(,,:34_R0N 5V3!$ CˋiDe3!HhD ! !1;w<^/ % 9w\x:)7H4 yc\#s]W~.23W]0N!\J.%[C_.O'뼌㠗Bc1&_/7OoPaw/s)ovAOыy.wک>Z6n)<u1,Dh5i~@w֕RF ca6ED)aD )"` 1EU`0΃0s)5K)Rb)\:)05/1國wpE*)k1zd.% 2h5!"sN)0lZCdYr}bY&%daW``f;Mǧ"\gZIq)DKNy)ڂȘ v>l}a1#19ӝ!cS9Zc\ei >C//痗"}DT 甽s `FDbE(^H XEt:!-0|w3缡45Ybbf r4]gfAY@){o £1Kɗ9眊uFq_^^e{R$qg+Y!0LӤvj0Ir^4x45FX.39Y8f=+?SgKa\Xz5˲,JNr///wwGn]zsAKDu]K0SZp8z1Ƈy~RDD{}`cYϤxLj4D "*igetLp΅ ! p 3!mX*kww'c,3;"9gEx$R1&K֭۾csQ>SɇsQi5ƦZ 55"*"r֊_yQ!CV(/-󼮫0z5\ ⢔bjo9A! !4!߲֩Fe9_.t<.:ϋҼιeY_K)y0Xkyk֨?S1Ƅ! 8R!$Y@)&C(\*ڏ!qu670bZtyJHU=c:%s ߒs5,Y2RJaaDz~~Z#__ % Y{8t//1Eg:Ttήq)4H]g-ຬ%gB*RPEWz0EVSTWf@”qD4Ɲ_^u>F1R|=KTtYw||^EFD`A)Tt>4?" 1.0Ɣ/s.%Os)BǘI>4!Qi]#|K_e^sJƐsAָx:Dk97MR ![ksy}))gSSUg]B1Sd.8#i4jbJkə Z#B.萵.sy m]ל&4 ð̳ae]cJ98N0ƔsNĬa-h~Gh\BTnsQ"( #a Ѻ)F s\"w9̈́r8Jɧ=l{4ENک>c>̳u>F H,z !8玧>tFMIo<pb^/2;8C! *X+\. *[3S?9c)Us^&,RJ1{$@A0!q$ds\J)BӺ,zeWf&eYsJ h U 3cUP1%DrX+L@ư !.[5Vb]EDG4it!!@E"M+unn^T!CVuYsue2fvZ:gUZ*(E5g.e!i9˛'D8b Rx/2#t8+4EDl{sѰ 5CW{;+sK1lL-)j r:ocQ3V1x )28 K;Sނt 904]EYxpֆୱ!uY9ۿoKqn9+Ⱦ0)랞u%`a)`Gh^pA=sy1# 5nff.l)IWB hDr>_ 2yVd֭!˺lsOsN^\uM).׫Rz.׫!{0cs.a)|@w\ Yk,K~ir,4)׈xd5.焀dLqwwˋMӤ~2AaRݝfY<>WM̺0FdV#)JZgXBO@<5k!c1ek-<>>eEe>?8:R׾xjB95QDq`H=fuZ1:|S-䌵)'.YtMC!a(US:[\).7]y]1suOEE,RJrNaM@\\`Ȗ!SN3 s͛'fy|x<&PfW嶜"ȹh4 C.9aYDrޥ:/: |I)-5h]?J$ k32*  dӲ:"uԚsKj~'[oRqYh/e1*zcy1JHRA8 ֚i0gQi0ƐiR.\4(̅ekm|~)C{㺂x<1ePތm˲t||x9|s]z+Ex<:7YRZt<~r>5*>V [rRla@y>??RĒ3sb9k6a)<+*Ԃz],<u9??8Kaq%lΙuOOO!i=H6 |i:͊%7V%/?N 2E( 3!ŸbaC[+Pr)\B!xC6cz&nwC}Zt8sQ  d;M mu`R5x^a [o9yN0Ո2Cb*udYhȘsYr.p\1w;ݛN"S{s}xy>BP›95E@t`s Rr|QfVtXKJo|~~~c5tŘ 1 ?uR8lO)<\Q4Mvc0(?R眓B>R*̄Rfc>8g_-z&2&uY==><<>>:gpӛeYzĸ RȦs\akݼ,9#A#o}wJ!g|V23G8NZ(i})Fcp8 t_yG9;KN&""Z?di޼yئsWuP&Is6??>qIJ:3_**C&R89gP6s 攗%"JQ-#0C"8_ ̀ؒ3ZgIe^~ÃW)Eaw|>䝏1^{rr\}Q}NDZt͛7BDMI;X}֫GA$d+G^%އq}^;$"̬e;ŕYUqa'%,R0 (l.S1[wrL;gi^ C\qb) h`-ԫh]W՝>Vp 0*4%gEfѽ1f]ל4MZ9m !(KjY,# ceUM15 E3Df"MӨ ;N1f|Y5zX(//zXq)*c 0zgE)*R8o)x?S:tws>\^/.]4 )|˼(]Rrv2|Q)VBD45:Nhq'rU: r_iRr)DRιp)벊!ceYr* $=52R!TM3c.\r֦1 Hd֭""!lޑD0M0y9y|x,9?=="uV09 yJDD2\/ZĘNB-taVD$$x~~\/!PG= i>aP7H5 CJY5*m,,W?㜓k(=iTJY;?9g~gFY::S8xYsV˲qi뺜Nz8[cZ@HZ$}uOw')e0EXl qe~a]c:sRqCq]8 dx_Z(7N9gǃ6<ϋԺGTiu>_woJ !2}4JI9˺Zcs.q]qPO>X ၈RUDNt '|2Mw>m*+UA)i*w0Mi: [kRLat X].3z|&"qG塎-rt^,[E-;U*4M˲"7ut1g&"U#-´6?? ΌcRuwOK)<6ϳ2_RJ^baʅ?Wԃ͢І ϗR.pa6drN;XG!D+ zu@|m_PpH&%o.yge9K/gcPҡ8n7 ,WcLJ1`.Uユhz=u-%xWr\CƘsQц0/nKZpZ2DF–eN]Dَ$ǖ]͎>DdfȦ D/BCZM^Vf n1~#"3nv.9\EsI)z!WJRs>$ S  %tF[=7bX$4DHt:k-JU\kqsΊZf( |އHRs}t10I)K.}tmi9m]Vs{ޅ gC.HvC>BXA-<{F(A0ßx\)>RJQ@6c]"Jk1^Z9¾o3bZ!xE*"`nR {(HS:g(8}|df#D_?j-(SΙb]+"9gUc4ƭ/G}GֹcJ\.֊"R"_wXxzzz1ZZ\1[i X(c4n))fc^ iCxWȻRj'$ys l!R jڼQYcnHEZ9dY/lB%ظϓw\n󹿿At]!uYCRʯkZo.)}2Sq]Z9Ӛ߶jB(MC}KλV+)G as1{;zbtB{5ĭKuE4M9ep`2o7^/RJ_~֋K9g)ъHcKqkeZ[+i֏ةi6ƀ{]JQKZ !ֽ:v}c.D-Zx(6"Ad`kįL)˃ ZrcJ)H5Wht1vf,c$%BM}\ևMZl(@9#Z] (5i[cjR"s[RN$fm璭UB}?zc r.\[m>xLa$`)c^"y X4lSkͥT RJeu]}˲5HҖc5ܺ\0QhZX>[]Zsic{!DJOm? ѹum UIr X'|}}}||8s)z1ޓއxֿ>o3?>9kJeJq) :k4E0!aZo3;a$XIh^&Szou2{h\۾g3Zks)%HrNBW<;V}7FΥuu̝`c169޻_e&8n$oo$b۞Jig-0y1L !LR1wk>V,6_!Dv=#@H<]q{N[k__}BE)eR1:{g)B,*s \c$hܖyD(?/jN?Pwr޶*9whm9lL[3÷;x>k=Sd[8Lmۓ#A| Ishޅ1gx0wcRC)Xga$Z2 ;w"cѵ1%sv6~b`Ik|jDژ ~`>Gܼۻ';8VqCWJ+E֚Rym! 56$ c ZkM1K)@.9!k+ZSk c-]Ĕ֪v"BH8~$tzX/`,6nuBdkV[lߏp"XL !dZ r*hhҤRƧ|מa:Y "}1VSW()i8@m$XJiJ |c/XcjK8kCe+BюR9;뱯Ӌ2ӒV++je")I9kiʹ {X|KsL$N7?>ZB)*j9۩|VkG\/RHV[mﵖ1M0(֘)" (8 ΢ "I KswUurq/,)R*$75Ykk8JZe)ܰ.4LI[buYuYy)cJκ!z`_.˲,$)Ԙa-{yR3l.Yk%ZS2/ŀ|1wD!˺jcYkRƮ"b&e˪:⑱38ۛS38֪sA,N;\kArrYu]h:Bu2R9]/\Jy\___hyFNsnu]nRZcgZ<"bVǺWk함U;̤Z)I!H1JޮWR|lDo߬)KԎBHkMT"Ve)a} $km4㦏1zp}bX)5;;[+/ix dA=@9j{)m۶mk<zRrk^k\nb)dg8B 1ZmۿR>>/G<ϵu]s-1,Kq۶r)c 01~HqD۶d;0 "2M;;wEvA &>Uy3c-vfΝ_~vOݲZOr9L:Kt)}wjC")kmnqR)1T!L˛<>̘|Z"CQd)15v&V#BRwn'k-6V%ҘS`sZ)v s+mS$i!uΎ>΍I)F,PJ1jA2\JIJiZ-V&!#;N;fYwnZ>'pۍ{Nnsmge-j)E"%Z)r(u17kmu#hp\xd]9SiQ[^Z+ ~M%*wE֐i [mc?RLZ)c߅B7cq[5m<h)RiyrN2P+`<4VqJ`T`T -te3q> f.?jZBضM֡ίo78F/FJ\Z+vb1e4k5ŲTJ1Mt\_lz~BhS)rGD /5FHaAi|_?$J! R=Cn#XU)%N7]Na">if9n=㈠)kmZdž sv{n_/o6)ek Ƕ=?}O6ւLT1PQ.9 CeYC`u0>4@H)1.1|Ԥ|{{Z$R6:kc`>4b9ѥژkn( A\Y?uAtB1+ȹZk u2[ 0dEdI9nϽ56HGC_czo13Lg ")IⰈ^=dnS+e"ZB 'cuV!IBBcsWQYk5IاPYr`E}Y7M7M c&'Q Z'k{GJRPJR {68{m~1qKVo @B>"E[g-‡ܯG[^T:vcтc.>Y|PZ19C)- %GĐctL9˲6nBtKOVZ)e6!|V4L4\HҺw/ +L'˅}|}|1?Xk1D;3F1{{^$W#J _g^ks ?~B"e";K^v2[f zM=˸\.RuqFIiㄈy? 13D"ZhkmOc$) A$ibyi>r)Emt>4ϓ"IKѹY+$R9o; xQ]1A@%KY}r֘<My78l"x0S֜r7e~<7v3jd$pB,xcp`^PeR:j]y E;۶sk˼ֺ{H1+RҊ1DkHղ!ix?()jkU1RΝI/XHc(8䂺IJW !O%AsRc%IʥSƣa b@Bx!hT!sG+G)y{`[kcJ=Iiti)xxea7aJ-8$ Rsk8!S*±`1*KD Ȋ$Zw!ŘEk !No'~b`$OFH9N)J"@Ǿ;jm$z毯/3~ 3%o9s\h)\Z D)9m1~a)|n91<-z-r?wi6 e dmhE;_uYv+!$ !(ֺ֊@P)Z[~x68Q|3R v~vu{SٿD kL0}%/XD"P̥>DYkYPIkP@DY# uJg^ek Ik>eSJ̬H;gA /")$j\ MurnǏ;Zǽz& j38>u]r[u !譶yl5v].k"oJqeYcL۶>LP*lޞO,FXp!Fi}?|0Je  &N&Πv;bH4^Z)%L;7cѸQg`<,3!Z^jF>?I$N#h5wMVzVsff}}Yk:cs Q<Ô˭ #8:'R:*9Z,llQ7)m^C\39!F<"wZk)VKrb> ! 9Eж=KN%絔fM-XUk31c(F_exzJZ$zVbBk&1x^kx71vV8\3xmsiu>Dv19k-YMR-= )KC!p8KBq߅i }64TL% 4F/u^sjI=Ԟzs˹6%Rɔ"RڈѦ14qe}nϯ~ !$}8oC1qZ4(LxeZѬZ0[+zYwYpW|G-x1bxAZKi WZ믔5CS?r.ofV\R2iZS(0^k5 sUR sE6@l CI)տ3jgBJ[,`J)"X"~ Va@syѰ(ED S&Tsh۹kO_NcΣA΅".rBXk ~KPэ1bُm a>M93R!1J4#m߷8)txCui !U2䜑9,HlcHd qg](E4K)@F5Bn $c<wH"agCsއ6SNc,ܥ,r!q{|>jm(BH)!x֗ei\8`d+ nsv6Lݕ҈. p7LW&˳;΍ q<[,̎=XQ.LXUjmp '6Wfv<82} 7Y4}{~\[x@ v~p7b!8#ƑyƑG ysxknCp2kVVGK&9 ēѳva/ϡN6(O3CC6Wwy rBf0aOv7JnshNC&Ǧ-wԇgoCPyqziv­b0 gx }~l</"qsAlP'#85\ ,3k 7;B;Cy *+F2b9#|0|B^9_|rWR0_I}r0íݵk"(!;@1O6ǹ78/xyq~}~^٧bZ7`4 p78eF N]XY 08 c!q曙%#- !~憌l(ԉLJdbxz@qG^O&8ٳٟ9\fݸ2`ȵB(+h'hy6U!Yş|΋{˫Aw1; V6KHwH|ڝ o=5DqV`Յ)xpx^Gm$;b?B'i Q -u=*Aފ E/y}:#p\EçbU1@lg{`í\7r[~GRKrv.e9OLv~}U@Sn.D!OG,%T`a?{N$&A 3p%DSBplܗ @P]9` ^fy1$`mn7>1+˓Tm)`ArN<..axg,Gi^ħj'i BQP'x;qLVݸv3BCG;kK3j[n,4ø ZZ. s8TQӟ}2\4,N4bL+Z#!9|BB?+cŠf.D9p+ej tAp:I[F?pE9SWC\BOقח AH  ͝!ž_ A~W[O>|/- a/m.ad׏5ha*!$8cF 0}D@C& -I%lhg(ᒞ@Ajhu_coTc!|צH&\r[ϝaMC'|ޟuG20aAmy!HqyMXv7 zE#뫋7Do4JN>Ɲ;p9ï@=`JkqI?"_dE Ikh šѥ;6B".]V3Œ?zNF- ؉}F 7+Ps2X% Bcdr/*"+X_/rg,הW8FP6J-~ksG8 Ǜ˛SE :faTDkx lF~PB84=瓻13wW ~VP><`PɐL<4}l\9<"o y Y?!ߟ 1Cqf.0:$sB7oK{.Dzg 4i068IcB>f C=ƙ)WGk\%ca 4̏m5~ wnĆӜW ^Ȩ'2E{I*8?Eؤaf 2!JYvC0݈'R[f   1Hynv bQ*b5 +4l% \Ao:QZlJKѮ 83B\zx4l(v;D$$ D`)ظߊHJi`[iL <7.[`?ËprDk81 --=Āo?9g 1 t"<ƺ mGkP0rgʹ`I~d#68YDHUgo5^y1AT~kr\pjAi seY/aY.l`)zrĤ0XDy|`2Bk +XQ%z?r xB<3L2:i]f RᑠE2#"(P5W-ܿ|pJD,f7%x+HUAm\bx3CfA[rف u=>TCӜTNu 5$8)B >z~w>x:,K-L$p&?ԇдčs ځ 6sOK8_?{Ys6:!HtgMo|Eq\<kvB WVg#nԨlՊ=h`*@PtE̅\ķ|eF 9Pz0׸I"41ej(I4uvan}Á4'Y=T? sEu 쟱JG|U!.񨫑)|3xbElnuXR @j`0 Ձr_BK _&:>B=~-{Q[5 .dO.R~U_8IaPX((Weіź(F!`nUN(}fO o;R hy a!!h{F"5r1g!?"akF5E{wd?'? }vJpBK5nG} !+ 6s"`6c;;qhD3Iw0)l:$6.&"d]_Qo~B, \`M`2 C7s|݇%T=TTĭ!JD3u_ɓ/n-ܓK<ؗ)%a rN熼4ԜçثA>Cѻ8 4~JEtbܸ6[7n2J%*QBL"UO :ğgy)v| Br8up#b-(SP^F5FA??݃pmG"@QW9c dsxHf4rE DP'&ziyy $g<3ʷ9$(?ɬD8#\|fZHK-Bܓk9ͧOjjI H<${gn n$O࿡j @qyyG{ MFW:KDZVCdL1̴zIVWAW5kL6d` ㍇TiG27#@zL"[2BoBş8ɠSH8p/c>25f\٬pU:s}}e}>=pġ3'iRjlWB@9)(@p~d/A(#a>6HcQ :MSuTJ>ck pB$iH5)KtKN& BР`9E*Rcp$t\ Sc!7R=Ҳ/ Jo1:ͤ%B>Ye#eRm1J6e(42/R% 9%/ W+~PqNDRXjpZ(tachgo n{@4FwօtNZ )uifivP\A鴁orQ%Hw8;3.f,N%2@UM/Tno2Xe,axp7 aþ)=n 䱐(Md^`O[ZZn } ;G˕588Aƃs"-(lsC|Ky}g{8uW/Bds<$o!gCDx2؎*HtH@3g>}" Νux@_4CjC#\>=(Xeg0 F*DjLJLߡ2p2ww=VL@Ll>Δ% ~^GS[Pc9vЛL|[ &ĄKN<L]vj Sٓx햬%)XZWI[gZlob uh9Y t5!BS/c#EGhoV[kDVigÕg@~$Qz!x_2Цan=3@DŽu]3t VÚ9:G_y$'gQWJ0eF%|{:bو2({yR=ȁmDf9,>*4$Lpt7 :׳ve%qM=\[:J%t^Kz}m\ht):?@fș#j Eh1, eJiWrVN+| 2bWty5@`E̍>C˥ze+sr$ TQ'Tb8TL,YMzRڅjf#.E;;<*dިE6*s] aq#A{|hU`Ky~U.IxgJ_럿8,KM1MױO>P @VV+K:")r>CdbndR ¬p!HߺBe'lID%p}L{6>e[c8+=8m-iWGM/|l5ZPςwLY҃n4T"oQ 7FDHlSICI1=C!)+D{U&Q>"^)=Ȼ[ccgR@ )q$;V[Ibi7@LIS- t$`Ϗ gF 5GN4{eǠ/@ ia#@U+<3oDiq*E hGS;JU ' 4'mTjnf{e\|Coٻ>Y'-BjgpyM[%(3}M e8/i S]^3 -4R;\h98߈yy~P6Å}׷3}y̠ɤgrt Gׯ m($V`HAH<(43B`Kh4YCR?_ɣ@Zp N!ҰvVP@-r4}K/g˨?pDS1MkYb^n.&0+;|edsgyI1#;#%/.t 0a \(.)M ȡX7K BLځ!-;Cݩvz,%l=+1loK+bQZ5P`Q٭?_W[4y6e{n:Tb=~SN:Dɕ_g(ȌП-!MkUTw Ej6Ŀ68ٚ@9⤂K ̦OTSi؊hUԮh+{q\B ([PRTv%q#ҁ("d&?iѩʃHCkK5B%R>lZh5[1̜:T湊8!_0*tDxkj ۙj 7ODr:Km0!y,6ɇ|6Z *'c[} "mO]WTe jgF+ s2YFd.d@jba`_icɍ:UE5Oesjg =iάL.ZӇ e[<Q k_fGIL!SLT] C+(0Xq|2 2~":=J4`,1YCC|ri A1ұVVˆPO[:VT7 @52i?L;kEm-$D4SِǤ6UNw *>c._Jt<U:#9V@Y`;`)Bx_&[ko(ML7k]"SbX*C'p dՇ0|/?zұVK=#\][kA*ո  8#c=@!% gEq =0~p, a,u.9A& Qu+7k]LMTjMѬ ̲) zOM،|mW0 @9䧡NR1^8h*dcή^n546c+9t XR$E՘0Ū͞KP?aFPiU_n(}s@+4u3 nVo )v9B9O\ s3Zv69>y~k#.Kd?=B0Beb3Y-UaT(t-DQ&tE\`  !՘ӼYFh~NM*_0-5lvm-jM hm24sG,m|mzr6h:9 K\g.'eʇQ0᪠L&e|-'̀}~V1#Ht;>;^U/f>[8Z[NWzlQa<}鞚thLhNȈSTA1y |eKH | '۫r-M+m]g 'ǎ j -ZC?ڋc@3j6r#N]" |"dejq(@l*9O)oIʬ#ԩT MQnVT.wTȜYS! ߰!ڲ E : ~8ذxxl:|44mth"=s/BYg'XIlfG?ama2.`[*?XG9K%Ay tb Y}e(ri54=R*E„QPʖLss;f]ٰRm#6Q(AdTijrZ3.Ln1NFHvD3 Ѽ ـ0W3Ő;ă3~eɼt* ta:PaLٸuz;BlA";CvSjhHֺȜ<24ljN|*K!@ATC %|ouyoepPFQ!-!3`΍yx_^in5.G֧H 6mH#- nkSo޽ 3Vב)(S5]U؄Tǜlİ43ʭ5UXFRI8b;Ql!F_7| Xm4 1cwP ?9]YcU ,;ʹZ4e[$FBJ *wdӳ?{ 4Ak ܬA)?@ '{[evZqVZbW8›zƃ@> _3T64;Clj]FQ#ZjF>캶FgSDu}@vqڶ,>s1:"$PDBXƏkL3?ll<> 3c!UrT֩rZ"F; K6 M%Z>٘9+*@ mU-@}֪"I%Q`LE`JR> sKMm{C_ʊ08.|d_:Y%mE ms/O'ɰac$"J ;CO7lzXb&;[~jcV|:@=i,eܡ{?A5!+iV:9͹7&nF P~HˏM{c`}m"֟6'*5&骊h3șxhf@9)Ոr& Z&;iN.A&0 [вJFеXM3q؎Rɔ]<'J9 B;"R 14|"Q9Dģ8zckf}Rm-,t%&:jpivwHD@,8lX2CpM t%I7Kl@` ujޗtXKvTVKaq u B9,f1 \; 6i7}Pβ<CM|CVClҟd潴aCs~C.}tmȶVtMs _%,;&b#VIU- ^>9d9 1O|EfEůt ` Q>E KTe p$djFP%? Umo]a{܁΢UW˻2U1r/ujP nTk\)n %kyrN@ &S'Z4 KP4\2AS;t4+h`Ub~Ihb 6!őv<ǁtطNp~4Cvl%LtIu! ʋi>)|%&Ac* YΤJMټhqW?[y $z W )z&BJ*kȻRKHȴ  #i(bvpZ4/{@],h@@4|*.!‚T౓@JXU`•#iC;o.Z/Ȝê|ikA#G?3lVkTQ<fQʧH34(*8Y}YI Z&®S)Ŕlȃ2Sn&õFQk5)l1ģ!HG@vɡ׻dY24'(IDf2T%G"̞5r,fEHdsM֧5%Pؑ6)dI s25YoU.q`@3R ޙ+iKLZ,hMEeBWFEItKvXz[d5/b -4ݒ{eofWKTKIۃr@h7z\_lJc,I] &TRa{ 4T8*LhRvg9@ (,1ì#Ġ 2+F?NTlUUZFvVQld Me9W* Ia5W ^r&衉# 8B"0/B~`g!k#sLdp/BcPZ^er$h̓292-M{7p,ᦷ@~|䲂{ōxavAo(^>k_%ֵZ.Mr!@72܄_Ÿ0tLf"k,yއНe0ͶV K|"~jc(UZej'#0m|XUFyk58YT*<ٻx4" S|mUkmI4B\58ߴ(;v1 %gJ^NppF1Ye١a H,B:Vi޸pato v2tutJ6zє L=~$N!fOc:iC 2Q}EѪG)eT[T"WdKЦ*f'H kNi-ɔU.={VL kzz会`h,iԘ ~jCg3z"{͎ƹ,c` z;fՌʗm+Ζ)dm^?Ԓ(M+9k>ELQ'í\;c17g]m;9F6䬌7Af'ּے:ܪG4mάzN(A~7}`3EVjh$R$ET{Z*Nb\c֗f;&G9lBf}D$#HrgY%jo){eYNȍIǮՕ%&}`Z*dE._z8e(d kfj*c< ؓjZw3`r~0sVҺmg+dD=1 #iV4f/+擥?I*ő=&?FoqE)}OJ*HJncՔ;^ٽWHD=rͰl"Ϙ)w`EPV,*mp_ R^h jBry6">hKnp$|vGFZ"YGl@Vo3jΛkVY\vIֹ*92Fɘm8K>vɘjHfasᰫ:ՏA;_g@eBj+ju H24t ʛi[e p|bŶ\a'J)7m7O S1ʒ2D7 eڦZ[+pV- l'nӪJK64~"`WCϭ}S8:ξ-ad6'PkJ=^L ӏ`K4Ln@8ZA)-ߦPUfAR5Z; j ~װ̰Ya_ ^(~i!_Uc]1#)~8 WNR"lf. yRTœ 3JH2r7Bs%MY(#ec4mlN$FJACYno7QӘUܲ{__% [KL4 I<񻰕GB*G N,Ӂ8i'jҢ{A_r ,sWWs #pv\j)M{]:CCkm hLNu ՠS%',`&V4TxZ=cZ/{'o~}m8WPA.5`O&7>r]LWO>䢁E` tkUUuegl5Ƀ I :ƀ BU#)풫"ɾuʪ! nH:mw?E_FԝkQ7ط0_Z>˾$]J&IF$i&;="}auur:N+EK\z>C?CKL ̄)ݲ~|ͬlWNee"3Xacd\g N{?Iφӫ_bBU!0|8oj;h%(VZd/ytX(gf6HВUSaci䲐3(x-Ƞmi30g&)u.-T'厌-@,3`)ӌm[OXR<(0YA7#9U]}\#[o3//2+%䷀zSW'2 W;xN3Ѳ=e/[ 5 ~ i=WQhyP `;"GoeUA$8h,귟O&E f/a*'섶 xv:R2qřl kN|O ߵTЀG2ɯjeg8A 0`?\Xiv녃 Jz-YP R s y '8?=1Hȶ|7 l8P]mJJzME*`'d@Tev}Su11Qum.2(x2r!)&eI96/ J}AD] Uh7* iWѱڼG|k1MRuR-mСvOFz?P'Qa"e$tt;goaEa:i󚮞]F >N *ҷMZ1&$PhCWpٞv6b, .SDƫ25ZB2nr,? ѰR:\Mt"K)SyT[ *ȕFzB.y2q:TYt0hg[u|5Pv]RLݛOl´oFpk$)e ki|A_ish$[ )gzv~L -7::I-T;u΀v+RL@pU\ *S00 6C14Uhå-c01Nòk[ůhW,Fˎ=t.fj| m6`Vvƭ 'vZΘ q& d ,X ,j/QCJs%nқyΔI4gf~@>҆q!pChs`>K/<(r]EX\xzj:sf;k Ȩe0RSHfi*I_ qW$G?uL% sŶOt$].VmjW\0[;k;]A"Iw57ʦ4^ҍ6iq) pƸ/ u 7]8 Qf X1c(`-wJ\u (NW P 1KTY'2 ;g/gMe:+`y=E L&Ѫ1[ ބy2WfF4NwKqmjJ梵K6儞՟G3KƆ.d;[~nu"s7DuaYʦY*ٺHXk]UA@AaT橋Vu.,XM a,g%*VBHj\m,ѷ\)UK|VTm@6ls;m"Rך1j#zӌ@DZɺ rYyU۶>NՄ'%xB B_L۞Dw="(?I( LaÄ;)e1pSw-qS⺦cBx>p!Bl7)U_r˪;V8)dviSۦnUa6$a}V|FQ3 &u*g`'eI^kLm"X+U@|b9b)e(x@ŗ/L{Dkkgq?@rкd_X0< Hl ذ~-‚J9V\ = 4lP604 $* 137@vjeB&N!FOD`86ƈ]Y N }d͏r`~P[VDX>sa W`qM+>v]+%:ycB(쇄tyVv:tR" 35d2_YL 1G\1S%ZoL2mQt*L6(ZwI2"XU}jq +o%fp;nU;uRm8Tz"D^ dVt=JQ$ƛUvp%qsQM4be\JExd螢kt͕0?ֻzZAZ\v)Ze"68f%yu14f*(W!9N^Mm-Y%~vAե+T7\~ڀ*!қ%VM]Qp!*s@t:MW[ҥ3D :_&cK߱AalPg9{1VҨm]X:lVRW(}ޕMTeb:{A: ×iDg[kvo^E Q0h:Ï@LԀfr{$z;2[7ifXlA޻~fcٓОQxYڭkrV*-Wzڴ_` QYV}Ol+2"4 Ah@bOUAIqDSM$G6b[k53h5} 0zub-IPhI3QU(Ƨ  2av[*I[shg{ ލgIB&k2*{y]aSaHC??`o8|AZW((ӄmy>I@ʐH96OqI& WW ilu=t֪^٦IurMVHMO1gMmhOŚ ZfZx; )ԭ(v (S7Vn-ԭRhI\FϲAVv:E#fuȠa-rEGtzSZNY!Κ֑U"Kк=T\iPDRQȖiRm_]9)9_,s'NVΨX{ԏFRVprɗ'b3DV3dӡ%SKT#hZ_.lw3Vh""ȱuCx?QNjg\8wFrߚ1Θ(@s:CkNB4tX P @Kj[5 x]d Am+#f4a9$VbETZKآnj[ ULkG:v9eKzVp!R W"#`!s3` P6 ɫur^-dH>vf8=61 Ŭ(nJ{(@V8'Y /L^U|VoEˤ ;miYl h\ԉh֛ AqC_:(^^*N%cT;>t.R*y.מ+sYƵ{ҵ ] J )ߖL!~14rt|Px -sO | !@[:082I(I[!#_7F*/ MQ[݊y C A][-K#Z~ KK!fi kc)% T>>jTƉe+.B:- / jўoU-RFE#uemuW> =9-jrċ?mZn$؋һ (3.ArC3UڄB'V7"](CBf~+I%ݻ ׬I4)5ϴK^5Zcu|wP6}ɾ@dd XfDXN=:2#'zMb;&_57fmќ˚6N:\l"Fcɂ W2\6\ˬW95Jore43,"9F">WoXBZ]$"_eJ~0GϊOP%9Um@dsJpc:GRT>H,PvqK!J_rW)k}xJ+;)l/t%3j5!\Lؖ, E9l gan)?N5J@W!]Qj΁ް/|3R^Dr(޶\Z2@` wh;D@ jVčX"$vr:D8Q0$bӊLy{k+bF!ᇪ?$O? bZ=| H}O@ԡKM_h u{Ngu}㓡bx`z Z=+ G5n1{V.:_p;fV5tUTXpx_9FI#(J f +i q4⁶.KOX)dq:;T RYxA$头iCd9~&uv̖fBzX2H`Z*P[I2%kr; *8\W 2]O[8Z/)-q YŭZZ*T93L ԺeX8VN` UvSTڥ{f;i<6 8hmaPGݡ3 өVF{dS돰ab7ֱV}̵t)TJ]C2ՑAk ZڋlQ !6PBSᲇp%B t2 QH0,mg}癄g%E QaW /i A&$~73sYGT"jه֢9aC3mOO\\̕\WOc; X3̾eY ,%+yһWhuWP G,O 7z:4[-0@w WWwLw f%0<14rG_alFM׌K48NQiD 4hQ6w8r!!jA1`Ǝ5/khWWs>ޔvUmd%qiU*&o($Fj@PB.vгr.  FhΡpNjM}ZZ.j'+-"yVJA+_&? x[Rab:moqإ9!SotLhMrą*]ID%i5!\)t0U%jGh1v1얝!bv[Yk{ho 3WBn4Q8ހ`K PH!O`4?UX8Ko-dz?Îry;U[tZ2W4.v-aOm}Wj)\LĹxuCM/,lk+gys4վWa*t,lV:`nE*Nkue)WZ,st c١`kR &>jLZ:aV1 H(뭠Wmd[+ԉ\z5,N#!P/6J2 ް4<^`!X'wv3}zeo0ƿ0yǰ&j2T?1iIǷzjҪk[k?XHɏhj[]kb=iaUX׾1)C<ã˟?p({6QMנAede~vEg#s-10wb }LWU3&<6+3Vѣ>ls\Pz5`VHbQ ؘk?U{o^ 'u|ZZ-ozZkuI$~^.|UMvFZ "&oGX<6 Át<Ȅn]It5LTsy[skQT]xBkm:H67AE_<D0SrjA0l&DTU^|nUJmeMkoCavuY6EYU&><~(`Y~%Y *̌2k6WνjlDS2wZ<^}#]ZwG 1 (uk=?x@hw'QѾ^W)mlc"Pf..ۖ1L[mԳH3uYƜ6,hfsw~;>w'Mv:9c4mƳ)VNWb=ۈwГZduƆ96mTgE6h֞+2q'OJTsc֘kmN%܊gṄ ɔ1 bT6ƜY{ N竇ޫq _s}7 AḢTij<}ϿJf>w1ƅ`e8-%#\9@lVP?p p_$H#,JF$NZ6ո8#,;WJBC ?'l{·_`6v$ࢱ F8hVD/ܙ 9x ;J/?h`FiLWҹ hhzLY<; e`o'xؾj7 ]0Lٽ yxq7v e&(W;D _ K:2[Hz`S0)Ti'dۻ̓HЮl sDyB2d\BCߞD89PpG xHHO{Qc|64 }.Jy]2$S;A06@77[!py+0!a?Fuů>L P w?}V! O74>}kNз`{h zjrf"vu?QAoRrOy5۟@:&= +_+"_} |ͅ21:'NL"Ͱ]|/zz/ey~;b$)䢚Ew5֤ZYaRsS"}K|?iB&UO܉U2t+սƨgymRvb$uM%7ڃ_5ŭ@Ӽ7!5!P̛G7~s T @f_ 6JnzyK1|K\@0'Ƨ "N9d8o@=|t#aqg/5 M |$jfG7KJO^XS "6"Hn:^LtNW]Oݝ$kOW^xo^f{ۣ덶tTs?Lq/dL(zy{;xWi]Ufs4 }=ߝ;!Αt&8ω~(TAfsD',2ў*U2?l_C'0P?s~l(^eM25 NB(_d|&zb/4i޿Ǥ`lx1 ml('#T,;K: @*R(G? yAr "$l)5Wѡp$ؒ@˱f4x^j6ڵ_A^wnfD[$l"׋jjeN.ٞ-T H<20MUy zc+\QJДL)*tJko '~FwSb@y o7 [/T*bƈ4  t>I}Ahۍ0.27F_&7 k@,o\ g{wciG׾&ڟ$ۄ;qM .ߛ{= uҘ/miwL6Dka_ D~3s\,nKQ{Nj0DMSF}ϯdG WE~F3A 22ihwDAm iw4Kxn t@JxI/L]3prԩǠ]G Ć`X21fd;\ ۧ#_9j"0P?_E~'ES*fsIpr& +0q/{ϛZ0ċ3qtM漊hk c<&upW`VZMhh!Hj !eH;نe9PKˌxp>"p̦Y~1TwlB"\ݵxY-/ 3Bl{I4/B~5uGIܖi=P#AX5&ف5o4;pǁk vq$HqN8/ߔNT5[d_rC`GLƅ!pԟElgk9} 6UQ_&lkE:Y`L|AhP AQ:nUgV A/;3!J qxaAU"5z`?HSFxO2gO\Uii5Ǿ|"hmPsg/e74L.=vraz;v(~4(t$!l)fˠI2@gLlJ[X$+^-6mPgVwx#;HuZRV8#o#iqA0+?'."|oR!Ga3#=ݞ~ա׉bAq&ʯ|+Z4ihp4 4`P hSa.O^#28U?:]x7Us5rb8ȿM.^[f 8^u`ɾPShΩ |/ 1:d؞?,2M~[ﰈ U6u}h ߥo.۠{sqzI.w@:ԱDѱ"=߸C)xcT9b*{.ujbv8JLӠǓDB12oPKYA- "Z `Ay5q/3,W&zLE3<2bC]|}ߤ'/:Os(TM$̏VfQHdpy0dtQpЫDQM1'f^f;<: !_%`Ni_}d|},}H"Fc>lAAߌ7cCB(dC3_%zdWVݾojs1/7 K{lK@T%P: Y%udi]V?JgX .P'4"onx:bD W7o3Fݻb&8o & Pc&ν~8-l#G%#iEv0Mc@ ws4p|xq7K3Ə*$r>gUiL_߭I<(ؑ`9)tp2 KS--`ѷtbY/!=wZj:HQ?۹Ha8i# Α(qHfB+|2+IM* $ TύF:riP2+^JZqp=q<$جҢ:< 7*+Xp2:fXs4ۆ;ƗhdD8aU)߮邷7BY%JZD{]XI4eK+*/8ےK?߉_. pS7 yF Q[&>)8.INH?@P,'B jw4n48hZ93HvmA LC%zc9an( '^H WR$E (z)ꤼ^dDAPQ?OsM%.~lgkױH3[3dݣpB+ɗ,e*ut(`zx~u(aHuc4؝!GgCy"N|Pg)\a凊G-ք1<?=8 o~2>(u6YC"8a \U+Y ٭0Ra[o(ad~$}Gu!-H۬#p.Y] Y4B…Czԩ ZY^UI L`2w]2V4F^$|%6WEЦW/]re;i\d'o=|W>A x/$/. _WFJI#=j @4V$Hf5pP!s4~vufvLLKAp@ܕZ?.= 'b2JBq^oL&-Zy7#5qR=yDg濤fi"~Q 89 rk/? ~P.l,D{Hҡf|ĕQx<(@Emک^L1S%{k@ \Q&j_W^C= ^ɐj5VF{2,JT+|H2 liUofحIGTpQ/%9ȥ'& ( \+ CHΏ2@鈛=UK|1IwKƛ YWG}vUP?pQ*].&kWŧxp=xt dT Ua{<2l wBxF1pܟ<ģV21g"lh?R׼u4XL׊l [[c-@ ~&@WyUh;ҕ4¨.'-%lHӝ`1 sauf <} $8A/,ްizAR297%#7dDՏ;7rP[J* l\V"T1fTf+1ff#YC!>kd6k0&/ cvyK?Np $cJ!I+UCVkǗҽ\zwz"ǯQX\C|1nRO9 (1@Jʳ}>WW:j1PuJ9,xD 'ȣg4wihO־Ub5f[8Ց@49[Pαo_ZzY@_ȵ[[ǃi,# q1?u:WK3 J!|pF"TqA r!j#HR?R,;;A^zaM32ֹG: veK5V|#2\0LЊ"D  x#ԃ:kI_ X@ԋj%-OXפfi(7[m R@*-}.rhZ{NodMK*v#u},rGcZP;( Eg"W7k'[Zq+E\uBU`݉w\h/%WYoO/ GᦠT3-S,;]DX8Fw7s`ս.Vk tYFKff>1(-TyvDϳp$~Xٟv=;E%l{NW~n j!ճal$qlkH:0Bl-q/i7QǓ6T8GÜ^w$a[O ?ğB&3QQ/7B$0?TF nOjwL]dt ~S8l'_kZ9tR!~>H\UT% twaz8s&rYi4l+lҘ~:+A,_4"Jv쫶@lP'-WY.ogm4|݉t5zfwAf1LJp&s0P6g3z lڦaDfK)lt\[)g^׉O%`Xt2\R|"4@2^ooGϚK8 *N0arQLf³[X~w!QctI />.oAbF{r:]Tf 2a~NU+QKe͙ ȊG1Sd]NB^VhiAuH?V!{Ÿ,<\`0H'",7fCĹy[XoWwZʃ^nyGFG!ֈJUg7+uK{Afb 4h69X`ѰCvB<,]j$B1+bP{Td#O\P17#jÀRkX0u`B*[b=$UD[PۇVoD뇷7C'r)5q** >Rt6ik f;_VJt1i.w:6 x[8?bXDX}Jb"66<ɬaL螺f3xyֹ+pjF]RWH:gsޚ ooq>ZQZ-/]'Ù  'M5~kӋmv˻j9]4Vu@Ņn 7 CQ<7*(Tp*\O0~Kx*KqJ<̯~E6rv^Z %lrkI8ۈmU%W1$˝yEH-)4t^ZmlemdS[b \~ޕouee.A?GB.hG1|w+Ѡꏫm ,Ap[iI,Jﺒ$9a1+:Ns+`c2P#ok% ǧ :+֢Gνk%(‡"$#VgMQ_C䱐?{3k #rVAR*0I앵_wFzVF8AjP/̭P]Yno5 S58B?fD^[gNaDH636EB=@ 6EK _5ecV}7[ɉflW LN*O:v\*FIt4ԄS}dSEـ Zmxeh7=3R^`ZhB.DI9MUn6odiK5i*\| znxyVl_TI MS~ PJyH|΅) ]hD7Y\e^ZOD> <ܢa[GfU*7G^̻eZ~ƇoTwRw!T֑N]ȊG]|a" p5\p;pJ,Y,E- *HHYE`}p('&QUĭpdhho:c%$.`K!kǙ)@qP4O\Jՠ% L^vEW4۟'AnGT$uvfeh?zOO00$AkyR[nu|85yI6Bal^ej4琅#U>IFFA`~/UWl loQǟXaipبdOi7+r>DBF cS4bkL#<\N}K_sM'VR&ЙdD ,> (A<N7!Ko1ԣV)W #Bu-@%TG-_$0 P7!۽$/a2LYJ0¶,)C۩#HF}F 2!fH kGk Ru=k jZ_dDqYXƲ(Y oDv̄gתAZlm d(,-66]q52RL%< Cͪ'$ߖ=ega o?^zB c-5U 3}R-7kǖx> 5R'N :dmԋ* @no yo"Y[ }H:qU Q6Q ̈́QxB"%cW9pFy歎fbzaeSgU1MZ^0x";+ fԅїnZ8 .]^quon#3 ezᇥ@pc, K3'rmr<ݘmF_XPYU 4Rn_mfFlSA7Ns4]_3VW6)iZ-hm%0p1ktA{%´É(9kqwۉO2ƍi N)sWiHXހ3ь=J˳)T YRtgƬƲ눞A/W ̬xMD<,`v9e ] MƙHծkmI!x/Ͻ{'):Ӻ:U2\!MIpehGVhewʅZscŠՋHkBw9#iZ!LLQQǣ)](=،YQ*OXu%jpǢ1o:ɳ,J]|<טR p4^h)nD գlk^*q:FeV"E*X!x#ÖkWrnUW7_)Er+fae{j6 RI 5{9rF"M1ɭ{:)yG 8lV&Ĝ`F#3m$[|g7z!nfSLGn1V d 槊8^-7<|O(+V쵹z)Fq0&٢G|6g@ox~{#.-C^;d:m REU5bFV5v),T؟cjojAv56XI+ww aJ7]O+ U++V'u׫% Y'ui(]A⛈`DZ/ #SuPM1쬵x:c]|;/e&,*S9K=HN댻ݏ8XIZ>ү# .ZuQ;яw"[$éK{>&?㱜 Cb[^Jvв A~ "׃жw!?fXX~Pxr~υ%h*ѶCBm~&fs?41L7(W 8 B,8il f5t ui+%4V//{-ևS0Cm:o߂Fq*m PcNiB:'&RsL-6 nu X7d@x~n^ W`i8Ժ"Qh5ʺB[]{)<¨g[+&(.ڼ [3hMYvRAtN*j)fgNhd:|qp) QAR H|PP$,M,(q!z)sb梫Z4;4Blt2\(v̆Hi쯖]GxaJ\h`=ǭU|AKo؉Ir(G?DHDBHAs5z|o48şVN'[dl^@ 5 2:1x]r~t t7FƆ+-/P#1w~Sv]!)8IE9GwE6MY"re_i [|$ب,Nҭ4zNLлB'cR݊r6&Nce8jZQّd2ѺLh|leOnKoBe"PjQ㙮kd"kjd03Ho\FzQzQ sqz%#q7Ȯ#!F'b6 T1w8+hι{-WDxf[VY Y 8BKWsp)ЇeҬyT!Fsʽn.`y(@_)5FǍ p*ENP #A/ 皎XpY߹t&[>:XxN͝'g.*WR_FG;g c17UjʟђOϳ"_M"i'ai/\frQ29|e;`1(ڀXu3w⪰fmY_\FZ_9 s-pͱ+H3$1+#zH۪ w7W+آD%RM-joe XJG3+Fvյ h:['0|҅cF.*b]3<I4Mݶ-6r6&[*f-S%kK%bڃɮ R Di¬JrJzoCqFiXyckO\kW\J.+oOIHk1RL\ (GAV}g7 d%чrallM GV:NoVй"eϬBT =me"G=Uͳ``Lf"s W Bv 'i)A MPx~DZvcLw.q>RLY$n-JPC>o߉n%xytbvDZar=Eg[U;n.wIojhk@NQFֹp8B0/Tzt+?dWz;-g5`/Z+!|lǨC2 4&NDrƾ^ed}t}2Ai%56-4rq-dqjz(KCaDP6tYWMx9Y@~;YǥY]2@j1|7YޘՋH?)?fl$莙gLY-3!Mv7x"a;DE^8B64$u)֤bg7:褡v$yPM?u:FN3t5?sREg̑v/U?#D,DJ|3Y΁r0rrk]ʐ<>R3 =ٟLQNnc6] :D7/#U? 3u<í庴 r3('H6>d1uٯ qTj^w'|;jyST56 IHmaAfk3ݖݹB5a8=Ttu0iO "rf4>~#EYEVv#fNkPag!_.a,6m #}9SY&CL5YG-W;'.dxqpV(}9MF53BXK-dL/T#{fOT^ڦ$4:ў !-*Ba v"I|G%~^= Ux#AD̗_Zt[+CAFp$\ 2],+Gcd;:͢NDʕ8d:NF#ےKyw3L'7}:1X@BVκ'{9KzkQr5tV.}WUb6Z:lr)Y=.G.e}qC0фf+[rX-K9#ow2mw(3zWЁbg/Uj$_Kq 3qf]g} tk2RZzb(_H}Б6~W [#K#u82}\[nFB-Ua"S/)iW.JГ}$P044uQ)j5fI-爗Ng耓Tn<*a`D' H!$U?\LuNq Yw8fRc nwCYvk!` &A|2qߣOoVE@)GmmO̅:|gdCh6ۉs^$ճ'5ͲwjemL2 j"2奡9A⣠r/|ZqWt{jp<Мx8 9xeIㇼlݿN Kp01 bj xP=%wk4TAc=( On:g}f 5`x/8o*3̿ǂ`]>Zw7ZYN:|GU*X۱3>o1vs7VNH]XcbD<٤M!F uut6[9NWG'G5.28vS6?XԉN*rGg('Anh5%d+ !,7)h ~)rxxkcj}xf-|Q mRrh!փ\-~eTF ex.܆8ȵT;Il65[gv6e1 ØDJkZgv0inf/!~u%HޔuaAR@HJ\?`SOCޞLVإ1W$ةEB 9GLv- en!G,W>YI ۪H5}VYbv! w[1J(Bj㚰:#< 3j~}񈕭u]ٝhri~%O&nje" `&$|-X) _^cMw[/%a=u?,ݪ b鉖w@_+!prER̬ʦW89U;՛?V%oT*}i8zy[ o}•N:,iVi PX\xP5BU—("늸)^A!Qc?䙩p%t촁Y" xw)m!~/)UbH' zqx^yAAtW[ R+lvԝ. fcpZ^NjΝgZ JB I7-Q^WBz S99s[QKW硛z/۱bYU,3qʫNْFWQ}]#ݡH4"zNɥ`ZR.̵X3eb;m'r u@gNWWU>F\9|M1M*X ix,s'AeBZkYeqneow^+lt"71V'Fq_kwQ3[ gIǫᓑeLok}+ Ym*mHa} .:V^و\Eti vRLw%gl߿6v5jNupb%_J4i3ɵѮEDoZȻa.op!R2]41L++jUQv+Pj;';|ޢI `֜ }Jlb'iSc{6_ (GLjK]7Nu=U-ӈ]dKz~zɕȒH#NT>HȫpҩqٯS }*;kb&9X VJz2\[׶v< JqwsaaaUvJrV˿)]\Mo({c6gu!c\G+c&t&Oy=劏]=-x(A\2- [`À$*&:OLVvJ-Jpc/2:{xLLDž7kø}NX[{xD49' mbܢaBX%5Á.;zUWmwVB=>zax8]ڀ 'veK@O&=yEM)كڄN#eU %O8[(G^ Iw7i\8WAG$#);UDrZC)H`S]-lȜvNm1 k4o!1Ar(HPZHy;kM59RPZjsj}ikmz(Hݰypz8ʷ~GY/rEl 1ӛ DgȎ6] uc, f%mt#jKttS!B*rKyJRt: UŦʗ v Bƻ߲I 5 ,grt548Δh7Z WObc!{`E.D7_?Z~Mrܡґb.HVJѱ9 M*{׺%=1Liݵv'觡]Gm3-?+7 Zj_2 &x9  \7tlAVdWF)jA(;G`R왞 s'#L \:d qGt!}ZX77"e6X'YF G J7+*{.myl` !J)oGiWϒ6IQ3f@<WG.(  +CAzm5%cRJuJ5hFݥҥ{.jq>QZ bds&0_?&\[lT.=hJ| F2ʌlsK 7 cHaO% ~ѫ"I_ztMt¬8j$iTb ׭(F8hRMk)*DtYGrAZF/4K?#]l-stuvfoc<2 WF{Eh֙aV$A)GۓY~8-r3"|8cq]"`\Vaޣ\ [rZk -`l6Z@7+i'q|_޲lu8f$< AT)w;i) l0pD{6GBQ;&A@sq1ڼzQ%|Waԛ m$֤:l_BʓQ(!4Y0up8߯fbhI+e`kJ(?'HQ!b, ω`&u>=d8f6Xn9tg@W됝=q0q<>O Ekj \L4˜ kzlPŘhb(/=b$ UWgb>*,hU/_|xo/}AѕoŌ Һ DpU4&$FY>Qx lŷ]wqA9ND?ΈlArĉ >j1. `A!7[jdZuvQ6.Zށ| M*3<]gζVOXt|)m_17+ mE~Df=;.g5ti. 3BK1͎)vu(*zZ7K6L d@+߆Y]rwZ .KK/qZ*P8zA :Β+N^eSGrx* T~":gZ>sI󳊴.~?jAyׁوPϕ1&>Br@Q6Z2R6ϑ~O[ΨTov8ɒtx: ܏':!s Q Uxw[dWW)߫&_'V{:bQяEp1x E"@I3M([w<+oLJ$.i2eju`Vg00P-kqdA95+CYI jQ.Na2 , hMOug`KQh zUUNL4ٛ %ZE*_z;*w› :Ч \h@TjedɎ30 qjOg!ӑ>ԑ&)5X"j+E0?*?@E3QkJNc5HֈJP_Ixk#I|Wxq)u3G2g+. ʣJՅPZ4ږdi;uKDrN.(OkYxJds4-9^Uq^Z)'&+abWm1%0bNA1/ Ֆ?ifKp9 ̐:3vIo|2PJE@#=|fM7Xv֫Gڦ vce/>YFV%7]ӸRmbo|\p?Sbdڑx#Ƭ(y57:_,=qlP~-CcaY4a5>c3Ȳu55h :kPf(5Gp9ZsRrhJpK\ң8 H9^:C2sO Y\h%X: cLc.$fkQmF: {mg|l*Z8[a{iƹ1ٍa6+X7Hh9`]nE܃^{}!gqO͖Eֽ1 LX\= .:yk%ۛ-+e xYK{R',*d``zA2§R{!6#lFa"EtZd WGcj\[,Sm]E6v@OÕ)BqZ`'T@bv6ZO8bVjx0˚^$>m'}-eZʛn|۹2e&S ]: $Ah[&VΠd$RYF@ 1(0h8{ dH u+d;#2JKV{%#IܷAjO>ͶP6PZ;HG:G5"pBEȞ=l_.ist,/2!`zK ^R 9^"/QM2lN3qc|yW;?4>7%U,T<сv?Hl6C\|o2n7Rfz$F83`tJmGnw:NNˋ~<$t5a,:(hm4}s7b~Vߋ%ak%uc4;3Ib; _496[FxEDw/"f B\xϲ vʾZ&:W&jhb+_ߒգR]f0*+}fIV i<MU]kʏ't,x!:hi< Vd%]Y 0Kl$a` V-k'@`#GBFɲ>Vrg }2)~$m76uc춶קmdBl WsV|[xPCݜ*Hu}d5Lp,b~WƔ6'`h̑o~uFd™MH{{3+",W:CɉXm.Yjrʥg& sJbcw!u;^q.5_u@1ú k5خlu3%VuG%;nşFؐԆ_f QbLXRwU(z0^j?e`54F:!pgqCuxb}|:hAzW0~?Zሼmp2j~2b{/4mcqpxJ`DDZw{֬ft> B*6jQDE-C 9,\/> O>Ot[@{$oky(fq'< ,1D&]=K< P{=-t92*xvr4P }ܯf'ۭ­nXL$SX0ehK\KO5ovoP/6Ȳ"Rߒ5h`a^Pŵe}o"b,Ϳs8f`^XOA mGc  _² /#k덅f {g"aŐqv/m:w}U$&e/ O\BF9C0tՎQ,Gq`#2͐iK6$X wnaĸvhxD1D"9H2GZ\%MH6x&N߂ !x7FXwlמsĜ*G-2`(k*^g&!nnJu B #x[,gl{ Y6ad_FcLt)bńѾ8UƑLpԇet)het sy8R %Z =>D%!4Ƣ&aKCALgY3$(zY ] %œ{VGGŎzDDOa6 fa_2Ob`R8M*PWWH$oGQ@>X*?Oe:=FIh̊aQ5.h f Efƚ;3-n5_إmibr_EgT4jiv12łJahs ]1[Є3Zzj\~KxCL2v.phf_3YVH\_g(*cjQ'y9VԛaRV,2,m&;eX&y .cRU\FRk=%]+3_e l+9 \+AepOXև=^ ˠJq)I,5d0;> zH fZA j}n!Z].P>4Urr66vALVDo(-BKqw 2!EjbIa1MLO4{'NlESԶ%u@W):*GFPeLDO5qw-bC1=^21]3SLJTc3YEᣍ]ӽ͵k+v#'וz Z{q< Jpo2%|ҝFJ\~d`ΟwbjO:j6ɞEHmCTJʿ-~?I|aYjP"#][֕ A Tl:jk$0LPDp_V'g"H"_) :F5f6m7y ѴCVyl[]Ė\!dc[ ɚܒ̥;Y?>SÒc~yZ}H)܌OV\&Ls"fZ@l*YDrv//vPackJ>0-XH3Gs]] }ۓ_w mƺDZΜOc)kD/R7y?Z\e[*/5͹qp"k-[YyA̹͑@Y|QŅZ$fՌPLs4O.2^ Zꬨ2@C[bshop]̕&JH*2v  SA7z߽:Bǡa)II˚s)MτX+⾴xR}?yxI.i`3▉^4ƛ~T{$zRqi0 ~A9(6KAZΖXҡ&N6u]_i+)3W~pCcψg.ՐB2y.]*_ZR`,dݰMj)y]lfvޔw0  &u$jEV,pGIWM֌v4h DN2rwQ6qH=l, sΆλ䉄c_za ~-{_+ nװg)t|FY-9v9̦0rܡO#m·G%]dvo\ XKSfGp Ǝ0?Rđ'D^'ܥS>ǛAX)Ѭ3 osNSiJSsr@ nIKG~)3Yͺ:of#wf,uZQvbl5Mk:D_`R- 1nv@1U x=|E\+gFU}?Oe) `O)#[0[DajEB׽Y>U;5 k7muЧ׵ NM%i|'&j6rF![AЃhg{jڬsP nYc Nk X8=:@3$ 4z@vAJ?눵.vpj;lm鄘6} N6)&ŀz;t4~w2`TnVN R T2Z `}Z1(Uky1)(zB N]iwYkDOb1⧡1~+/pQQ{!iS"m:&M?J ,SUq-Ȗ0NuV0*C#iM1çؾ zQ̂ZnlCa}92`:0`__eWF'-oSpWt~ޞq+OENgヶԷ78R?~^`c=׬o-\ X盇y-ΐpQE0;M-%H`~(^=o\󹭯.rbͱGañY%j[aNv =j@`J1nD[&]V/%bYY":|͎:.eh$$,U.Gw |iRijy) 0J[::be 汈,2aJ5[-p~S Up [h.L\˾c"ͨ4G]w &?;[R}uEYE`)dX{J%ʦRh@'kPs jF=YIRhDŽš \. }Q]DF= ͗+Wmnخ,PǑ_pfWj$`'Lq9I"&{ad#ju33vFL 6)…uL'dӹw.<.xueF…sg62wv6Koɨ>vaGv*L {N&P!TbQ4O^J+anŲ R[2*WLjm)kdOdq. Ѕ=q9Bv >D>-ױ?6/NqgjQ14E*mV[B^+=2u38w,dIk&i1zn:w[1T"c^7=aZ`1n$JG#'`;oca ]Z9Zf`'/4.^@R-}\("*ӪNPE]ӌ1ޢK6WlW"姭+xt } k|EUu>Mm/j|' ,g|nhK8[#Akzsܒ*2>FLp2߁BK[nmVKVoEܯ6ůIYSܖ*2idQ]΀9>]^fU-6p]oqzM(pvl!f)ȱET Ӓ,D*fy@*Dz>O?\bfz[ޗ3c!nxBFNr\(v!w*_*3 <̧ VIP%﷮S0 Wpe4lwffzG9VkdzkUj"qgE"pQ$mB,\u:)DkXB@jh F135l)Y#qj:EbA6|փg" ! uq+b|a` ;nsi5p@ds|7NJ높*fj\3.v!!%U+_Zk/NZpi\U-'al.){O3Ƶ*Au{t}W^/׳ H˟-,A?sDi*j-rگXE9y&2&UhO̎tfR,_| N5ׇP~oFvaYn\F[ۖTV\  ݘ?$'h/ʜq@sܓw6JMҜUh,`y&sE!, GPyβ-Gx2by( EaEq-wA9Jkeq$z *wm&9Rw6np_cs,;I{B1ǠɈ Z$1ĩBfR y5x֕\W:Aom}|ʩFw1D%a>&vڟ)æOX5>4̵gXF 3Y!Iyп4\r$@ouz'f 4s\4mzx4Y f*p|}0ܒbwM6sA65xrn,9vkY&q;ӲJeO [ Y.#ڵH Av#G n6kJ<}dc?}%k~~;{`/!/z /->ͯ-x/?7፧'9zh vr~|{k^=̷_>g߼~l}ַ ߼~'?~_b?,~d?{8k s$\~?\~ <޻r_Αw}_>7ܝ^x~6{8/g?{x 3;_<3Y?΃+ˇ|pPߟp\>{87d~'wN>M|goGs}7|zX|vwg~wWw9-/yy-H b-_sW꿼{r ܡ!)W 5盗1Wx2˺!N iCT =9 EYwbx1 7ʟe9w-|Ҍ\#ĝ"|g8oq~2] ^by (RxG.%aQ )r#邀>(sؗg&|65o!~^>y>;5hWqqA5ȭI{䦰0s8a#K-Bny|Jvk\|mzsrl5}6ӷ4!..[N`F<*r--wrÃ#H9*2 h&;w7Yx`^o> |'[gB6\ "k9ﳤƃ>&5XG|D/-v"| 7N~&/#\R ?SGY.8gd{rٟFXol{#/5qGPH.(^6 vx`x@>_Vى7@j~^e,=>λ$(c @{(.Jƛ X\ 6oݟef;7F].R5;ņ#](X7R[/#$xGڪ3ȳ@qln$/8fA x-nna*b7Ͽd[%7.Z/-{{ڕ8+H'v]^?ϐ9h$T°=U=F2DKO)$( K#*.ƃ+cPeh_^VL OyxcX % m?YV).vray?UpXb3DG`Eᾨ0z^~\X|?T5E+yok Y7qpZhNFs@#7cyi\EǑ(x|SB˩~߀+%-.O qN? RsfY`ٹǢ0$IP=n!\-n1~oU 6Hmc9~t`w"H' ϜƏ}ѫ1`M@aߞy4?$T%_bu68<<#s}\|`^};:XJ:SСSo!^!~WmJGH0">ȘN#BG8f){86ȵ SWс_}@tqc\ɽ;`ܕZn<#sn9_UdSb-8NݗS=@>s%{!.. CW"61EpQ?NAQz^)AR]4D,HwHUw&2Wy$|mBJͳ0G7^>.8F7C!H9R%2v`cq.~Fo FxSnJ {`jT` ZP 7~CExVQq_CCCV/&Jxtj߬R8wc ]$oM l0Z]/crdar4 b {0!GEh^"I*  ^pUo3 <p(BBժJ/<4@ӄ4鐐 UDEQQtlٲEE** IHHB7}9>{|ֺ#,ӹk9k\cޓ6ΑGpl<$w](,YuOQp{}$4_k}|77dg <^\V3~NlSB fD̑Ne]ӦQ)(AgS>$۬BJ`J4AM+ddIyRUX0P\ܟ %J ^){\Sa^yޜ=řU҃Ȋ R !0Gl)@ %R^pO0HJ`+)|uO@#'~bq|E*KKERՀF 9鞪 &@bW.L `aP^%8lwdw:{\W>'sLG}\M}e2ތ,Ɋ7+O@{\"b)|sFr_ۙn,ocڹ՞ 9.ݻΥD?ojwh?(jc:P;ԞdmǗRO~ᒰYO{$ p~{5]ieaa3Im'Q!f۝3 ѓ4 &!ٔntMrymҖ;)S8o'=Kܝ;DH >[qA2cd1ӊbY6}u>yw/pO&{d; %iNMAr4f#I|j׽w/ +_l{mҽ Lk]QVL1vOH U*{wtmD]9.yB#@bz vhTG?iCTi+sw@h5+{?c˽&R)$kCl"^nGDpnAcIpupB6z4>^QOΨš}z`ITpw AB 8(+j8ǘÇ7>r8ǿo_lA$$' 8B6~k;&ĉo}GJ:/rU{ (pq%:,WSTI$1tz~ dRwb׉d3@~R(U"t 4=a;^ߧLx37$F,nrnr$C`vv32c1LiӫnNĸ69mwz"{g#Π2qMj]a nܷ{HJ}]) .F ~x B8wup2;`79ģqק%D:@ط}5"v:Y)AA`/]t`@pSxΣ,- !O嬗y="hLށY }GXm絻 {1|*>Gb$;ݹ6؂Mr uR $=* <mQH *b"{8p#:wE;jOJQ%9` ,YuO{g3@ynM&Bt?;!JWuM[Y̜,~~;9#@}ѥGџ; ]H8Rl҆ {>΍DXA.,tc]Nfv]rRUYW>Nc$+ho}ɦ e޽ ,^w sv[K18֞c^ fmcZHJz{MfvUmg~B!XwX{;(,gtvOn݋I|\Ė\X; pC }DS}u/⾙S׿O-{(*!K)2D_KI֗cY',\F ֕n[ui2x}/ ^}}0c)N #1'fՎpn'?<@r_<: E-_Jk A! @î$`Do}mC`MmXFa1]| ! dPsRpr@%ףխqқG$`-_Yˇ!n(M ^N -\_LInޥy뮖r|~ќUW% \R,FؐBS'o_"Xht&ݹ,۸TN_IH]&pX:p`ˎyB m}*܏%&!l2 ` +ɥfgFEҦ\ʠn+:a† ,3WPD0_ ST"ؕ8mÚi.SV9ED}@~]hT ׇp}c*_ ~|o_靈L 5p.D^3Z_ZCjj1ᶚPЈ{Zw9v: ? #'=V?WU~V_Ձw0.d.kΉ{}eS1,OHSۃ^TMV:tȄJ!]<9Ճ}զya `rA !37@r"1PH uQnb o2+XvЎ%%-. h[15'Л7VmNRT_JG{C '4iHvt!9Olw.W KowELR3n=SD|e?L͍$ZdWϏ:H\)?UOƩO *ȏK)JS 5ydrIZl Ot Ld(H-8; P=~Hzx櫥šo6hQ(ܦ]>+6M]a wƦOV!|bJ!bYuvͭb!H?=GIKt7.w.'X3$'=i{I=sMFx,^ZGb_)(B Wx6Y{8ܴx=N/[J%4$=њzOޝy~*vNv'*Ruڍwj+,fb:bB;4j+0= v7W3 u\s?D) uBJJ Dj'@{5!t]3ޗ[m:SKx0{JIѦ޼}TB-&pc _ۧ'Z[r,7>TߡmݪN 9OGnU>-/5~6v4C(MK>0)FiV_2E2/|~)ʏo][(P! zO×2rl$~PsAFWtδ B0%g;V g0 K&= 4c/F7S?aheеj ho Rŭz][)ܒRiY^X*vb V{]s;$dG~wBR|sEa;`pY܉L5Gf>'[k k^CO:`.%#~yrٮP^D;׿xr=诽?Hb,g96O)i[j >;2wpz""sھ/2TOI(E/D_Íf!>(yn~!X vxI yyiR0<kc^{޹zy0 :Oȭ9QH(:Oߪ/_ڟԼU3[ЗN>##J(D %3"Ev(B3q2%}rfgyg[{}[/gHVa2d㥑r_JqJN]/hm{}~x7!xĺ65H@o޽HCnɭ+D?( v+I y6D:̆@ƈE]#4_nkncJ"wB,7k9L ]a4g'!JEb>}|=5ݸ̫-w )(س%ĕ8n`\-C<޵ާsg*SLCZKBĮmdc_BO,_~9qH`Âkd:{hH=,%ӣtI^&I)@+͢C]{khh‘ַx1RʮOӁ^<]2Tjg_+gPm%Hi?xWGJ].xA35 =W 6RT;#r@j>@LeOO։|cC|E>OOЭrgnli{"FwìF;C=( ݢWweZ/a Qg:Cb):+PVKP錥 \(*aU5@nS-ugTOfl@mNP_RD{S:} }@ 5;(Aǣ ޞ(}(}Cʼo;sƥ殮/R_s91Yǵ޵33*M 35&5~9_@C[ {e2Wm?Ne!9=|,2ѿHI\ 7C\/#Z"Uix{HXJgRob'+Z #MwwS$> 7``>3qD?-+h$r &ᴫӆ0mENnHQ}5hܫ݋NtR }=Og_j;ym\jE X:ŹGIP'\T kqW$295~N2iBF#^R"N@SyvdT(-CWra~kM@uU*4MQӺ=nVH0?.Bē盩Dm9l.w TE\?FAC8+T2n/b̀~ $ZKE!n7$d QA . *T ͐7Zdq4>; 0Vڄ N.g?|'C@ϗuΝ-pBxh9]Z1dO<6&AN DES^HV_JG$}IAØ))0a'v:I ӴMHB|PNv)%rLֽ̀^6\ZfCZLgiB~wBgIKkBhIӦ\ře24}0?P{r#O ۮ7_Y͡?e2DR\}R Xn@[i"ax= z_42/PabR=M3Ͳy?K72=*qT脝2n 10L} z=(m+|a'8'%O 6Mi?!ޔy ۱؀~F?@\f4RGg{"^,RviQ\H5Zj_& ӄo2H@u.95d!7myag$73#j>Aaa))geT7pէOnd6Qccz/RXVG;W$WJ0e>}`b=!9ˡ 5pʌ>2|R=xw]AY@pq!%..n5&}YVf "z ?RH횔7,(Ғ"?>5% gl H [wEu7 We4f]dL{4O ijtLʻ0dCHyG B{{][!) tAR]!.=<⪂`A:*!O_+t0Y٣uh.Lȝ x'~ut!rA e.J-?ŧ'iW!Lɣ[A`v t`GLxehv9 4$}WyҶd sU&+.f L}Jˌ= {c./ui0$wv-bʋGJ2wM]!}V =G&X,Mnɱ/_qD.uaS׸SMv[E X e _*1 /ڵN>5?1[V6"ᶽ: эȖ >R "vߎ: sjkj7 y\ܢK5]xt1:$Q"%ym0l,ܝ<&s)cj=,ۂ<\ݯP@ZbUo]{d 6&UxNJk7 n ЄZa}AWx nßɤ{ѶGPtۡ5k҉q Y 3tko~R rBrԿR/ͳ&X {;S gHޖU:]A|vO' }o:7W J/i\f b2SS-U6Zyt#9e)j 2?BS-szAl\)a.zM̃~e џHMs_\vI^kiPcxXQm\P% i%3zgna }IdQ9TkFq՝f ?)2wJ8y@Њ m֕5IeJ]W7%S x6IN?ٝwX> %IL0A{ބ2_d f,.=TS=2E wt P6Q=v/4RiB[W)ᎾAoelڰMUkZ5kC!1 @$/ bc6֓MF0x+I9Alu( >6@M3%NTQsΜp_zc8p+9{?/\0qUϡyO;MEw2鐙>/Ó)@dċA M{Oqώ 1ߪ|=KzIf\1I=<Э1jd힕3Qt#0+-wЉ#ը@|bB Y퉑 "+Vy|o&[zh9,vzbl$2|hűں'gx-cpGK}廵jM(HI% yd}Xh,9-KTs O%k0et~t<@VU㴌\7nsT5"WMޒ= qۏR{$=ErdG_7J 乏MFpiU\/,h\ӻq.*Ujku` N"x9-Ȑ3=kq q z;{3n0HiQg h<.3?ݝ&8&T+}=kʌly01PLkVa,k(QiAL>l2Y`6pJ M$߽)7z m\@t#s{.4{\).٣$P-qQAKr 1B:IpWL)77pbDyD:Mx>RM4JWb~ >zi;shq.}L1J a dGqL3۲^Ϛ}@r џ:Ih'tىW.{HVx;f){TЮXc1J=%xh+j㻹mZ wVcqLL@`ph=YL]7AE@Mc}{$̄m^|aL {`a* ]E'O 80[E/ F+K푃FG!%yPBd7hU౗!%?3|+y S;$XA++nޱYr&m~S]_G%S~ KO|}o2Ȃ G^:!D;ɛOq}ˠ Yiyw`ꭡ-MDQi *(N}I5׫&Ѕ`8lCEeI^%޽x&&&JE]4lզ.oCo &G[-b ?!OO.p A`()U`3be 0]|M-eZ]BVS&g&a$!0lWk޷N](l\MZ tk]\&+Hn&D0O|=.- *eD9e;'I\ۣs9lM7FpOlYntY?y>US;N aڨs$5ldo/n#j ?u'6Dsjt#7ЉfzIj;"JG#D\Cv\W.&E|,@@G-Sy=yi1o\$VN S!c` Oe?qw``fb֏ӁG:f s!aSK>U.ha 10neBЁDg)$A`cT ;8-IvG.h5249q0 2ws6&&t2Hz ˝~zݣQ2yS t@ޡjÖx!I-XSji80Ԝ:XD0KP 5) GgU!72e;Ss芐h~n7i|H}72AO=a*'I *ʬ WU9\{>|a/&aݝA_1khFHEU]sNP,^szOo\ f,:ԿK_Ge ]kʓ^W C0ۙJi:oʦ?IљЫ=&I51 Xt+jo}O԰Fh:Ԇ.ὢL&Q[ُtghV1TĽw_={p_?)N},t 5~ua;>o}M {#'v#bJW.8q u$ yO?Z5m2~9Xʀ.*Jƞ?%>>6Oj ftGn8{ֆ(jn<^4b}$Ow_Xn! }A :&I6J?:%,Ĵ$ߓkG3n na+xh5qc=oa8 E"gꗋLqH<ݛ/ˤ!?X\}WoS>Pw ߷߶>g@kX_ o4+= NazcHG'I1҇ggK?.aK32Jpr?iө(`X3U+\5h*#7=.Xd} Kq,n\A1FjP8n(fzB-=1=_,]`hO D/)I-At⢊R^`&?(!#Q-|[`CO{eWkzp%9UkmѢ5I0Ȩ>\կuQ TbgZB)kD~f3cX.wԟ^Wd'j#x]#X@ݫW9+V5斔q2 ^*Cڕ {(/=3 o~-3!qqWZ`tցIIϘȉp "_J-lOPv#,z֜\^b]/Y3Ԙf@#FWy 6 |/ x@҅ ڿp?s zRKxx}e̠'wn|~n^пXOu!O췦FK4VIH .Kw#月k?__/`A܅JDR1cmIZ޽<L- {EOuL͓|D.Z q͌vCPx^!)NiS'[8vhٜͣz^`/;9\RZIމb eHLMYڗ/-fLiP; Q Vek vS5oԠM{``W(LaJW|s,3ۿ_hn<P?Q:G=:&AdJ=_O;U . Υ M,IU +CKD|ZKJw%Gf/4\UHN/H|$UX? $PWBv2lʢr<- ><(/p/.T𳗯ɪ+3{Փ=j RXxƯeWZ R!*5F&Lk;u{Ý ZPnjK3kO"JUkhP4}_1}'1zGªF1n_AX[@uO]|M { `qOK\'SH7qnd2HS}@{tƉ>m6]}%mAkSgz!?vN ZfB晝Sˉ^5tBp9Lns.=I$9큇 rSJ"vBۘ}n1Cz$8m% \sNᄒZ9aVb$>x\q-ol_6ThgCb/T,5bAI6&xu CГT4* Bv3y~Fk+y0YhzLTђu35*қ.T0zv'$}OCH,IŲrdL@Th!O##fa _@xH)ew_eB-O%|k# dtCPM50*m\/tG6/vg m`gG&cUrAhݚp#IO_|选r*m( ǃOm0oa4 opB&07od,n.yVݲ2vlHzm slJ+dyH|d{H6H;U-M%@d⟽",|(Z&)nk+˓Yge7 H\N#=d7~(ar E@Ƚ",,p QJ{UYw_ Vz^-oVn)cbqs}DBbdFg:쿆~j 18" x`ט*"S^MGZ[W.! z#Wf_:Oua=]ȹQ2؉ld8>5Ȋ˃wSjP'> #<O=y8Bfɱ3_7r0La{8?XOk;- /yV16*5?BvQɬJ񖟱a5Ppu6&$M>3}2[)d(}J. x:.ׅ3"mpA&j۳7hr_{'͛ 腶8Ր"Dv/'1j.|;V8֏ZIKשoK8Te؞+F^vW0͕ʃzWPC:mNijkv/:֧syd{cǫ&le21CW?E/6uT)k$$]yOAM $yBo4@4ɕtU=>$$gk֬^[.'d3NX8 #|Dէ!Yy 7pxEc~u(hW&073;gpvBO0Rf#j<- ki|9ƴwU$ C0rYt}lJU6U@ y`@jR/i Gm6-2Ό=0WU1![KIds ٯ{>1joj_ Z%ϛiZFn7{K"YXө̨`6ʀבW]A4^ NnW 4[fpars$ BI$ `{Bvdf4L' A@hE>ր9 |:01!3S8LN"on0(a^~ՓnՍc{zvwj`^DCCȢx ZÇAboqA$!{_um9{z(5svYSW,TD^wa$* 2Q@Fb_ShVWiҗqt g~vIh/gʮ Z%}%kw9Z2ߣ=TYϜ ~B6^dtʺ! Þ DG3][ I;쎕L5Rjyjce\Fj^_zj\ČHܓ$4'?"-o Dm3sX>Pi9ǕkBыG:*3g!q:̖+v:,s?#+W4OKMIdp$OOfa.JJ1Q h³ bC{bAeB^?Cȴ'=>@r=H/#3Ņ"vH&i=j˞ o[Ǧ6/0]qgrAN/.Dt= Q#gŀŔaMx>x2ж;6[M(͓kfj*Kg&j#[j꿢4{W{TDM!º$PBʟMYVpKM gIMkVNBӾB_'Mw {z~x vO+yMeolyz&'( z(X|ySb`jBFq,FDbS#7 PI~T_ r/D  8`޼v~TtIm6Lf+&vjM\1(z/7mMO ^Wkro_S so'ɜkvF" \W"9fȡٰTDj-}> ETV&7lr'ᆘYd"?L;%&l lB#[:;-,e-z*.ᵾ =qT gH5-(md2* k3Ѕ jYVzJ]>֪>KEAϸ`V7,XJ됐gYNsSq<Zȝ=dž辨vYՠ4*D=Wޡ?}@M6]Xa0>AΊ5[JztY"oZě*b5l(`5Y G sYٗj[OsŜ^^Q]1Q9 hsi#Y`S1&O'K~ା{W5OVIj.=aԓ{^:{⯺H2B*Bo\Zx|Q5/nX!Pw/eeyZ{.[+gg_cvdKO9\Np#3V53r;ڭ0ct97"S$@"qh—8@sgSYK^>:kO)ַȒ~go^"]gciJw6+vDqxbAF0TH&.fBٻb\_YU>:O<5n;?@EAY}sjM,5TG=6)$/dwNL`ְ \<%xNh,F Q ${3H get*⟙ v $rx+ oY?3JM CՑOaL~/4f0T@(`+*tdэ=XcJg$Q̬S]:F%`ABӡs̚ҰVB=MrC{iq |1=ۉ&$IaUz>O$R(47YvBhTB,HL~gR4Ǫ|i{%6;1!s~O.NN-aQ=]Usc EkZ{[ ?tV崵TQ]Z,v"t;Ls.k𘁇1I5Pܜ{0£,wP ŷE/2L̗bh9͊7" ,`N)IAT'4IwG5PE41DXHb]N4}=8UhO kjDY Ir m<:әE 5rzOzv%հ 2vOzUTuְ鼙ʃf=G0 hh}Fy\&{ݤ+IZ쐽v)\B>3}}nn{?^C%i^CnȽxreZ%&aBT"1Rv$[#{{R+<ÚB6W-]5{kp4Xt6`()O@E;}PP ^e_o?kG0j ?Dj*Ew: X?Jt|:5hm]@!ݍ.e#D; ,Y="EO.UClPQ!{W59-!mNk?ɖx.X0|c+KXS+yUFR߾z kU8 %Bz,g}>z??*Gg4ִu CN3qI!9W i_{=`/#3Ko"Ts0< +?G,(Fp&e (JBlmlZP'O(B=<iwBbGs$}:x: 3ٱ+3/ izWj8]cU_>u2(wY3 Xɭ fl$m3 =bc#yJvl6<}cſ| 6g`m˸Է ?=;tٯgO~~@;>PRGsࡢ7dmv?PཝMxC+@,,kw,T!ZZ{$(ya=~zro{r)@8QDzߡ Q }6ZFtn\°jK|;ˆ fbIXS{r~|G5)OۼW@äv ~'1 >>wpR0D*X az5kƀJONi)KIENDB`bzflag-2.4.2+ds1/data/green_bolt.png000066400000000000000000000026021200563112200171760ustar00rootroot00000000000000PNG  IHDR@@iqIIDATx{FmQQ_q=IJdRW&5=ɱ4A)-ޗ[Dҥ{ne^SB4 VHU-@ka`gyVR BlO`uҥp ꦂf`bED?핅:0 R@UeE@;k]Ɂ$0nɪYUUQeu,Q!8A~GA< 8GA%i!I0b)Hz^Ӫ֪5`}wҁMKaf08\p:lٖm;So֛(xgB 3$f:4< }@O1%AH$Qui;m&il\Î-b-wKDC%x )"'VnݮVI_!q >헳l.]+ AU+VZ itܞ}tR8$.+OHZo-vG~_IZ=)3'CUͷkiG¿!x74%Ek&:й"i16<()})}% I ǡ$}c#ҟq8gol3+,5Qx@L}y4LT@!?},'aL;@#tc ZqgRZbB0ގ K:.QDauXVV %J\0o?Hh(s9SA..Lf zayXƨ3 0 q(p:79!q~!Kas2dNsI\5#1y an17I̍VYs]<0a1M̃Ys<>7>01IENDB`bzflag-2.4.2+ds1/data/green_icon.png000066400000000000000000000130571200563112200171740ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATx՛{^Uy>|sI-p  "1A-jQ[vuu%kU[[VRDHH2Lnd&3wξ}[gf9{?yy>#{:5m|w>Ϯu.~ RQ3>OwΏ^9s.~n荷/nYSm7d媕[oտk޷{ƚ6=N_7w{s3kZ4K 3~ﭳ!?66C:OGhpÍZ3i`|bo媫 rKz;[h?44~hhk_ |!a57qd{iF\sZ~:2kvZn:n:vZ?00^7PÇnkT7k{?[o U !nӾ뾉ģD1vO)DSN92|ox[Rֈ㸫󚚪w^ΞgULfHRؽg\>c6<̉'-F)5&7ɩi-[_ ·ȗఁiCxs?,Ƙ ,k(bCMeW*˰ֆ{) H C]:֒ mt0x]U&.cq Ҍ( FEHqZgdYS4E*׍Fӱ4˦!^:%-!=zrAΣMM@aaK1-YDI?J~b!iښ@Ti!|ka@nt5Y\wLcM-1Dޅk4VԌCUmfTb֦4Mtö LMm!Mif}Gob"v{OZ{WY B °! QUA 1C8uӀ7H)ٶ e?e,;tjV",-Ȳ4mXaXK93ݳuϐ$I-3z%Y0hLshn;sVv%$qR``Bm1#uZXkΆKI ϻV_NTCS$9Jt8{Ɖ(Ft)bVpåW8Vl/ijeyeᱤYցQ |b/n%Iz=s8\KIӔ_?TS8mJ 4^xnZC 8Ȳ t6w\;~R;vw(*M4g H3T`qŋc-ȩKN q hmy?ԓ˽IN7ބ̄N\aD"lۺ;C#D ժpxXt%wE I%C|MXtʂ[ΕP_4AKR2@ mJŚZ-q =<[^̣ruj0h3e Hb0F6 mN?eNi`.5}o],ڧ|{":`\: z[d6-ƇϤi @O3\[<ֹӢ4dX,j ES Y,}h1dhu:Pi$gq"A۬(pΑY>@!3EQᠵP4)5 ,`I}Fa0&J:PKSM!\ߛWaVF>d\O1 <G839cε<̘1c=ٳg8Tb4U>_n В-VX 92R.E :P3#xJKiX4ji @0::#ٳ&::1]v1o<;2;o ]ekd袼><< ⦭F5ɔ~,Ve;DEl޴Os8pc9󂥜p\vնT৓p ]\zITjm۷gY44zbj-y 00aƈ|n_l206]ՔeoZ=w&w{2~yH'u.ot,:ݶ]3 |S EDT6 {pz>+?:AysL/f!lFi,N5 Njfc|b;%dY}<${hO9|w+`-Z@](*fGIw+%]@U$y8wĠo;l&\i ^{G0#ƭgsۈ{b&L0<<LNN^n26ry fV Dw#bIATdH16(Bד0v?w!w:mr=p_Uk^x.= mbbjM6aFFFBmߡmDP\|r,%Tu%JJP61e KNDz|#30?v]jk0`Akn1.AkMVXx|Y[wdmlE{O3u0t%(G, kL1QO\/BHQ*1UDkJkκҙYgcj/[gw{~_2Q'iQ}#C>Vȿ˜Pv-7s`_JO_t^ 쫎32у ZُSvNj5I,~!j^B:cESGGxCnAEEpQ˪ԲjӥvM#TL*x#ږKJmx8pI 7$xöRaFTƑD+3X*K8HW @T/4@e 1^,rH %1ʷh0$_ήjuG%GmbWLL<\A$ mb@䫱"H"+ѫ Ts|m)7[-"X7ppEw[өGе̰)č`\AqJD,QY%)7@_%d EP!;" MDQDFEy h3R6I$AZad"qXF"iOI"*̒`LCD/^ᛱ|(![3PڨԀ.Ѧ"bDPP>RI?֝:< +Pe.Rti3Q.}>*՜>T؝AC@vN\t9Ł-(ry-3QDtk׺ #"z Ӡ,Dƨ[" "UxBi.Qͼ7>[95\V+,] ?] -'V rX S6Z|7䍋/WM_6AOo~7XE8÷s'.YLws–>K/l.$QgZ5 " C/զ7&syΣ2+}Z^q8b<3gpG7_OuMIbw@ x"غ R%f6.s#ʟ νG e' R>oZ !\ 5kVHN;c Y㔊ڵ|^2"GDaٯHDJO,5e Da31{>w^Z8Jm7?.ӪR1Vb_&#n yf4g``F0V*_A-@E͙;{ `{`Dr1Rs_P_<qDbO {g0o&3U!X"ITB"u^%'bB1oxQ~{Yh_=˻~wg9rITKmhÇ^zpxssQ! UEZryu=6:pԷS=j~/Z'؂c5yzҠ*>&GkH'xak!Q0qTE]P,e!rۿ6*t9mɩLfG|U *;xS >|wsg~θDq0Kzz}L*S"lQ> 8&ix88rݾHqn(ugDJJjҼ ΪkXñ{߹\]g}欕W^CSe;N'$y'yc8y^\qT(BƉ= հټ xc9?=܋XK?{$}=~\sg?_w-TOw^XrgVRmABOwS!G㼎K(?^V0"O<{^f]|97[tO}kׇN~.&xqP7p{lz]^.eGMnTjmn~[]3ͷoTz7\O2]6*~f\Ν#;:n ,'Y|y nO)IENDB`bzflag-2.4.2+ds1/data/green_laser.png000066400000000000000000000004251200563112200173450ustar00rootroot00000000000000PNG  IHDR@@iqIDATxб Aas/IF)ܲ V'``ld u|q?u'+ CˑUd*ְfM:ʳW{s>N}k۵mkҲF5Nة~m&w1IENDB`bzflag-2.4.2+ds1/data/green_super_bolt.png000066400000000000000000000200211200563112200204070ustar00rootroot00000000000000PNG  IHDR@@iqIDATxXeI[F*ȭ-W jnQC#WJ ADq+q Õ9*GSkXo& _P8y\s\WLFJ._ZUl" H[$x"c+Ѿ.9=e8??_7P k,HeיۊC_g=5'}~%gO)M:#ubiǦ86eD)#*kTy-eXUk߹}sz$0_ס}aDG@c5j$hThsꖒ:?:!r""LVcdCSN[oPr{7x%ou~e*2JE30b҃ ݳ7$FUa3/N;IR:<#;64c#R>7$y@]ܣa$&=-ɣ[פvIZXuW H]yy'FC3XFr+jF1C(?4&.X+$4U/lPqm̳Xϱ>I^/@gRw/uNlզSbvm;Nl֩es<WQu01,pi;!Ff9<<0}q;܉-3xOA=ХHhB Eb =ѳ~s5hu|f Ov0uMЬ4u0aGI)c*.XTde #HOT)dI,9^Ő^R ]ܐ\f"KDW+5* R-0ʌ }5{\V^݋y`~F2:a/~A 9y?lw~OS38=C?~^֦CtJDԐ q#p]8 9O*?&w~FL+!S7];2 7ެ%?1ۻGЯ~Ξ/!g=zmp71lj eMJ ~ڴw2^sY욳 ~s59 \u#ڇi<3¼*i37L-li=b޶Oe&h5<7Wxam#kI^.J\Ԇj'<@]q2x$^l7ɶ#5f>Fh̓“u5-F4=J8U;(=ɣc} b i)ާw~W txw%ݽ *c`ǠhFY wynFW J[}ͻ5w9Nx /yOF)pE2Og^q&vk]|ߕ3*Vfwƻz[f)8 =a-NWi(a_}Mfޫb_dqPH1nMօMi;Ò%JԜAҎ!”/94F(8131)i`벾a C&S~" !e =Cl-86xp7^Jv&>K.-R]5h.QWlF\׊1Ug2׊/K%}^FWIkVRj^bIS\b=e}Ä#dd/r @QT-).d_$ Fuz*%f.+D,HQ^ [R/]-5^@d6&s23uJTVId>lq"<(/^]5Ra=5LX,gF{@9tW ;=AM\6&$u1}le&҆-}f36dVJUPk7[3՛GXzrHR7%ݡ=|rlxs-! y Yu *3t}<x߰ t 96YI /߾(ܑ˫BsvRhtA]mTqL&rLܼ".cZ|*fnLh!imސ yE)fBOo\@=2M0[ͭǼ̏&RW۸H/'kؽRt"*jЫ^Y}Ԣe'"(I%oRP0J8JDFP_5)V6qm„-e2W<t!Zݵߓ+hߖy,J[vJ16-a>E0/0Ƹ/\~$=Dhx] <Ŧ-*FgEUzz7CB*5Tlne"33ޖto~`RzlcӚ/iB|hӑ(e=7~zf!q3Q4apgK$.A bA])bN{ݝ)m/It҂]Yu @a5Ą!CPCWhiލ })OD82ؗgO}}*%Ɖc_{a39i㻥Eŷ ~=q&8Sc "tEc̏w~Xv.Y[g(l+U2WT#LE9bL j\.4-8Dhoeh!L{_sg>t6F[ko~\q?<9(_ZqDf\+4Z@;;8aIaX N5dnh!3Sv8\8S)9GKw[[ E DϠ&G }ml a9>9>s[s).~w%orqUy+\>94AY/ń&C\։Ppu 3 }I ($q4/ӗJcR|+U%}k$8aDfx4c;񺸋Po\ha˨3($UߋXOuε39& ̸$;~1_(Je;Xu [GyRwBIo@A=ܾӼ#H8w=ɱxM' i \ tP@.rh^υ[ď#}æQk$ 2":9O7So';-_9)Yy7ň]O}Wu{٧.̃`^ (qR+g7Pt[ P\%(½C'BSKQ9X ? PP'Jzi{S0O${[!(`sJ4\ uG-q">͖gɻ{7I|ۖ^"i!M#.>؃4O˾;'wx );6' "H &% *7 IdӄQ:6 pk~bS 9wo|_r~Yμy20x 2/.9_-:HW`v ^1 ztoϖM;9M:ٕȈR)$4P|#&r#"#7㲈/Ki5I75%/ߒݼw~x_`aÝdf|f7#2/.s V <[E):[$>C ] NO.L@Ab|0`"1R"ܒ~/ 'F31/. /` +?hUeYo-;)3O\4oB/B/y : H82Q8>ٯ&!:z STg2h:rAū"|C2Va N)/ؽ#`RtU %)aM FYѽ]V4Tl0ekk8-#%w+·)lnlk&( Zv/ 7^:A.;ϸ /;L\np?9zK\8(wCgx+Av0z zɩH*q~A?.A56ɶqgNֈ对 c2ي$6/f`$@$~sM,%^~K87(b7)WjlTx{fprC0{57NO=VB!)19A))B֍VgV".lH̊ bV$fO ˆdA\"9Ggc^w)Q2POpYۿ׸(w /풤7iݥU'n>:ed[Umi'z;`bC$ТJxk~ 5i\:Tw5A۸h#l ju3|4ɱ&h Fۆof]s( J@iJu5AjT޹'ܡ(vQ|6NxPO㪯C!`A;#NP&# 53: H 2'4ʱ*,g`e)!Z X>_3@m4k9 yj5*Mi(qaqaqHBu.  \@~!r}pZ{ؾ]g#s{%{FVݹ]OU /Mqs†IZhex(aZ!jpNds& V+\`چ;8pTX}B/($}&,<; *dhn~龧1!A*Ow 'CZ aS̚h@yr]&9 h̖p pp6x6HP.$󪚱φHFX`Xg')Qru6("$;aa g­p㰼g(8t~?0+Uxfa%5mFwG*@&.@t:\%̒. V4*x:Y!$20٤Tr;>s(D"IEŨ=vs87\$\$`['t_'N#jؿ~5Nӱ>-2MQ7=Utk-ۼJôV? q dHr k9!At0+?vi]#]+S!FxȤ0_?–mmm>T; qMv[d:@!uQ\N's3Ru/}/؃!B#;kXVi#CO衱7Fƕ0oDc  ,GHR0)i ]88/ȏ՗D/C"qh#Dܡ= zdFk2!DUV:9(ZP$+ :e'9,_]&Q#OKL7Il(l.I;ni3m1uźǼxB.{M"yriO}0 @:Ddب'Hu> RׇhNyOPa`_)`fyo`o_j 0 %vS|sW7k)*ES€tX MF t~J':E9d 9:EDD1q`Zr>!auveӿ)&∌ " i~:0, <]t?[M9;MӬ&iI}b~G~@Bnq[ piz M:}fYiC  >͹]XA(>b<</Siyt;j~ ߖG߸郙yn_۾ob{O 1y7Wy7@xŃ1GE c[S T@{x+/f?h4θ'&tvz"٘])BΏPۛwx诼3DA$Dcw4;CM?W*y*]xhTs7s)ԧ4ݼCZ ooưm$s[cbۖrs|k ;~oH#khMܘbi/L`K4z۳-<3l֋۷^V{<6/SUo[6Q{FWԼFSKF 0& # *.֛\U^uf:Gz:ֳMZyvQϫ[vԩU<ڸqo[sC65UiC(2㛣Х~xF: a pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATx읿jKƏ;vVN#}Y77r%t ĐT t}!T;mz znƳ?9gn1;hfgg惿CԾ}˩XY@ ?OH89/X@? ǧG pr^X[C46.r_3\p"p!S;?``C1I"\IbP-?7~+b!?'~h#1wsG7$`k'1`_3 0/T Sۛ}keC%lmo_3秀|mR4[k.wE h4[V7 hdX:LyhU <[?_?̞]m?Q\Ť/I _'Bh OQ| >$Bq[so|8/fkc,{vZl7#{|z4Ua8ȱ<px5 ^S[\vqUdǧGO݆)@?"?u -^<Ĝ+? @O]d 5r>5zPMga?%?p@RO܏!ޟ )] &=;ɊOs'3ց s@!Iz TuUv;A8ec鱫G;?@_:b ?|pMLi懘/?D+>j{ &o^fT7gNĄvT;krS^?r]~_L9^-.ǭ]/k2?I`qO8r\uYCj~Rn73ޒI }i"'%2F ?0I<pWc @@9␝:E,+7bpKϢ*:w~@#¯*9f yR$P *pz _~UOH'YHe3?h!v'b%Kl!u9ft:`Mrl8 9TѩM"u9cbH_1DBA}d=rE,$Y{ ᔋ!88]2G>p%L]EΙUx/ӳFɦW.%C8R2SgaI l1S'c ωRB9?Y||ë'+R? Ι)8Srx )-Ws6W&q|zգb쉯\ ̉b|YR PwK4Uz_>]W ^0y2k~ѱ1Q<ΚT:>m.@ 0Sd ~8wO9Il@-v3z<n]ˑ>>><<<<99994444----$$$$      $$$$(((($$$$  ####)))),,,,$$$$""""%%%%####"""""""""""" ////,,,,&&&&&&&&****(((( !!!!$$$$!!!!""""  ''''''''++++((((!!!!%%%%----3333????SSSSZZZZHHHH0000  $$$$ 5555====<<<<0000""""!!!!))))&&&&%%%%,,,,222299992222&&&&////GGGGHHHH(((( ????LLLL@@@@((((----9999,,,, ++++GGGGNNNNHHHHIIIIUUUUZZZZ@@@@4444::::<<<<,,,,++++9999((((&&&&%%%%33335555))))7777MMMMRRRRDDDD  ////(((('''';;;;MMMMFFFF::::1111$$$$////????0000 $$$$ ????AAAA;;;;8888$$$$////((((;;;;>>>>====BBBBOOOOeeeellllTTTT2222 ????ooooxxxxttttwwwwllllRRRR@@@@ '''';;;;OOOOFFFF4444////????____ssssxxxxhhhh@@@@$$$$ %%%% ''''4444   7777<<<<0000  ''''OOOOdddd4444????gggghhhhPPPP0000 ####****(((( 3333GGGGWWWWaaaadddd\\\\HHHH8888))))$$$$3333OOOO____XXXXRRRRYYYYXXXXDDDD99999999>>>>MMMMVVVV____{{{{||||````DDDD0000????OOOOgggguuuuhhhhPPPP8888  WWWW{{{{||||ssssppppppppllllXXXX@@@@,,,, ++++>>>>::::----))))----00001111,,,, ;;;;____}}}}||||sssspppphhhhTTTT@@@@  ))))(((( !!!!####5555;;;;8888>>>>KKKKPPPP@@@@33337777KKKK____ffff\\\\XXXXXXXXTTTTHHHH::::(((( ////OOOO____eeee````PPPP@@@@,,,,++++6666,,,, """" ////KKKKWWWW\\\\XXXXHHHH4444 3333KKKKRRRRSSSSRRRRRRRRHHHH00007777WWWWkkkkwwwwuuuu````HHHHAAAAEEEEEEEEBBBBAAAAGGGGUUUUeeeeoooollllXXXX@@@@((((%%%%****++++....,,,, ////;;;;CCCCOOOORRRRDDDD4444)))) ''''&&&& """"5555>>>>>>>>BBBBEEEEBBBB@@@@>>>>8888,,,,!!!!!!!!'''')))) ////7777====6666++++&&&&########))))----3333GGGG[[[[oooo{{{{{{{{pppp````HHHH88880000))))%%%%########))))3333????OOOO____aaaaTTTTBBBB::::4444....$$$$&&&&)))) ''''6666CCCCMMMM[[[[kkkkrrrrpppphhhheeeemmmmuuuu{{{{||||uuuullllffffZZZZLLLL@@@@0000$$$$ %%%%))))))))""""    &&&&'''',,,,----""""   ''''////;;;;CCCCBBBB>>>>4444....----++++((((''''////????WWWWbbbbcccc````XXXXPPPPJJJJ@@@@0000''''++++////----****----555588882222,,,,"""" ####""""  %%%%----33337777;;;;::::666633338888????KKKKWWWWkkkkyyyy||||qqqqddddXXXXHHHH8888((((####''''****((((  ####$$$$%%%%****33339999;;;;666644446666888888883333))))     ////;;;;CCCCIIIIOOOOQQQQRRRRWWWWYYYYYYYY]]]]iiiiuuuuzzzz||||{{{{vvvvhhhhZZZZMMMMDDDD<<<<0000(((($$$$&&&&****....333333330000%%%%     !!!!  """"''''----333377776666333322220000....,,,,,,,,3333????JJJJJJJJDDDD::::0000$$$$   ####&&&&****....22221111000000000000....,,,,****$$$$####'''',,,,22224444444433330000((((####!!!!!!!!!!!!''''----,,,,&&&&$$$$&&&&$$$$   ####----5555>>>>EEEEIIIIJJJJKKKKQQQQZZZZaaaaccccddddggggkkkkmmmmllllffffZZZZPPPPBBBB::::1111****%%%%####$$$$&&&&****,,,,....,,,,((((!!!!  %%%%++++////1111,,,,%%%%    """"))))////44447777555522220000....&&&&  !!!!""""""""""""!!!!  ####&&&&((((****,,,,,,,,----++++&&&&  ####''''))))((((''''''''((((((((++++////0000....,,,,++++((((&&&&%%%%   ''''////7777;;;;????BBBBFFFFFFFFCCCC@@@@;;;;777733331111----++++))))&&&&    !!!!!!!!!!!! !!!!$$$$!!!! %%%%++++3333<<<<CCCCIIIIMMMMLLLLHHHHCCCC@@@@====999966663333444433330000----........++++$$$$    """"$$$$$$$$$$$$$$$$####      %%%%))))****,,,,00000000((((   &&&&....5555====DDDDGGGGEEEEAAAA;;;;4444444433330000,,,,(((($$$$####""""########   """"''''++++))))&&&&!!!!  ''''----****%%%% ########!!!!   ''''11116666>>>>@@@@888844444444555544440000****))))))))....7777====????@@@@6666****""""          ////77776666,,,, ////888833334444>>>>KKKKYYYYTTTTDDDD8888****''''))))((((....55551111****(((())))33338888555544449999;;;;<<<<::::99993333,,,,////55552222))))''''****++++3333????FFFFAAAA8888((((   !!!!####  $$$$  ''''++++$$$$****5555====GGGGOOOOUUUUZZZZZZZZPPPPDDDD========99992222////3333::::;;;;9999888866660000((((   ''''--------((((     ////>>>>KKKKWWWW____````[[[[XXXXTTTTPPPPIIII@@@@;;;;;;;;????AAAAAAAACCCCGGGGKKKKMMMMHHHH@@@@88880000$$$$ ++++0000$$$$ ++++4444**** %%%%3333????KKKKMMMMLLLLHHHH@@@@::::66660000&&&&%%%%''''""""####////3333444422220000----,,,,----22227777;;;;>>>>BBBBIIIIOOOOUUUUXXXXWWWWSSSSPPPPKKKKAAAA::::2222$$$$))))7777CCCCSSSS]]]]````\\\\VVVVJJJJ@@@@999966669999CCCCJJJJLLLLMMMMOOOONNNNHHHH::::0000          """"$$$$"""" ####****22229999>>>>CCCCNNNNYYYY]]]][[[[YYYYYYYYWWWWRRRRMMMMIIIIGGGGFFFFDDDDBBBB@@@@>>>><<<<;;;;====????AAAACCCCFFFFFFFFCCCCAAAA@@@@@@@@>>>>99996666666633330000,,,,))))''''    """"     ####((((----////----****(((())))++++(((($$$$ !!!!'''',,,,....,,,,++++,,,,----((((""""  '''',,,,00003333666666664444222233337777====EEEENNNNUUUUZZZZ____eeeeeeeebbbb````\\\\TTTTNNNNJJJJGGGGDDDDBBBB<<<<66661111,,,,$$$$  !!!!''''////333355552222,,,,$$$$ ####((((----,,,,$$$$  ####!!!!  ####((((&&&&   !!!!####''''++++22229999BBBBGGGGLLLLQQQQVVVVYYYYZZZZXXXXWWWWVVVVRRRRKKKKHHHHGGGGGGGGEEEEAAAA????<<<<99992222,,,,''''""""     !!!!%%%%++++33339999>>>>CCCCHHHHKKKKMMMMPPPPSSSSTTTTUUUUUUUUVVVVZZZZ^^^^]]]]\\\\[[[[YYYYVVVVPPPPHHHHAAAA>>>>::::2222****"""" $$$$((((********++++++++----....////....////111133336666::::;;;;888877777777666655552222....********++++++++----1111333344447777999988884444....((((    """"&&&&((((&&&&$$$$""""!!!!   ####%%%%''''++++111122220000////----++++++++,,,,----,,,,....----****((((((((****&&&&!!!!           %%%%++++....,,,,((((####  """"""""""""""""""""   ####))))....33339999====AAAACCCCBBBBBBBBCCCCBBBBAAAACCCCEEEEEEEEDDDD@@@@;;;;3333,,,,((((   %%%%****////5555;;;;>>>>@@@@BBBBCCCCCCCCCCCC@@@@::::2222,,,,((((      ''''----22227777====CCCCGGGGIIIIHHHHGGGGGGGGJJJJNNNNPPPPPPPPPPPPRRRRTTTTVVVVYYYYZZZZXXXXTTTTNNNNHHHHBBBB>>>>4444&&&&     !!!!  """"########!!!!""""####""""  !!!!""""$$$$&&&&''''''''&&&&$$$$""""  !!!!$$$$''''))))++++++++))))%%%%      ####&&&&&&&&    ''''&&&&&&&&....666688880000****++++((((""""----====FFFFEEEE<<<<55551111////....////3333333311117777========BBBBMMMMNNNNLLLLHHHHGGGGIIIIMMMMUUUUWWWWPPPPDDDD8888****     ''''11116666....&&&&&&&&"""" %%%%////;;;;GGGGMMMMLLLLEEEE@@@@<<<<2222,,,,----,,,,''''))))6666CCCCKKKKJJJJ@@@@,,,,  ----666655550000****$$$$  ''''3333====CCCCBBBB<<<<2222((((!!!!    !!!! ''''''''""""!!!!++++????SSSS____ffffhhhhhhhhddddZZZZRRRRNNNNOOOORRRRHHHH::::9999====::::1111333399996666((((  ----::::????::::0000&&&&  ''''7777CCCCMMMMPPPPSSSSWWWWVVVVQQQQMMMMIIIIGGGGDDDD888800000000666699992222++++((((****....111122224444666633332222,,,,    ////;;;;CCCC@@@@2222****))))++++----000055559999;;;;::::66660000$$$$ !!!!&&&&&&&&$$$$&&&&++++11110000----,,,,----****''''&&&&(((((((( $$$$  ++++....,,,,----5555????IIIIQQQQVVVVVVVVTTTTUUUUUUUUSSSSSSSSTTTTTTTTNNNNHHHHBBBB@@@@>>>>88880000&&&&    &&&&%%%%####''''1111;;;;GGGGOOOORRRRVVVVYYYYXXXXXXXX\\\\````\\\\RRRRHHHH@@@@<<<<;;;;>>>>CCCCIIIIQQQQWWWWXXXXRRRRIIIIAAAA88880000$$$$     ''''1111;;;;CCCCOOOO]]]]eeeekkkkoooorrrrllllbbbbTTTTHHHH@@@@66660000....////7777====BBBBEEEEEEEEBBBB>>>>88880000(((("""" !!!!%%%%....7777>>>>????<<<<::::66660000((((""""  ####****3333????NNNNUUUU[[[[\\\\ZZZZRRRRHHHHBBBB@@@@::::333333337777????FFFFLLLLSSSSWWWWXXXXVVVVTTTTSSSSSSSSMMMMDDDD====;;;;::::66661111000000002222666677778888888877773333----((((#### ''''3333;;;;====<<<<<<<<;;;;88882222,,,,)))))))),,,,33339999;;;;88881111))))  """"####''''----3333====IIIIUUUU]]]]ddddiiiijjjjhhhhffffbbbb\\\\VVVVQQQQLLLLHHHHEEEEBBBBBBBBBBBB@@@@<<<<6666....((((""""  ####))))++++////////////111144444444222233332222....++++++++,,,,....11111111....((((%%%%   """"&&&&#### %%%%,,,,333366667777777777778888888888884444,,,,&&&&  $$$$++++////3333333322220000111133336666;;;;>>>>AAAACCCCDDDDDDDDDDDDCCCC@@@@<<<<777733330000,,,,****((((((((&&&&####   ####))))////7777====????<<<<::::6666....$$$$  %%%%****----....000000000000....////0000,,,,&&&&  !!!!!!!!""""""""   ----7777????CCCCBBBBAAAA@@@@>>>><<<<999955550000****&&&&""""   """"!!!!   """"""""""""########   %%%%****----....++++''''%%%%"""""""" ####&&&&%%%%$$$$&&&&))))....33337777>>>>CCCCGGGGKKKKOOOOUUUUZZZZ____cccceeeeeeeeeeeeccccaaaa^^^^XXXXPPPPDDDD88880000$$$$     !!!!''''////7777BBBBJJJJOOOOTTTTWWWWYYYYZZZZZZZZ[[[[[[[[[[[[\\\\____aaaabbbbddddkkkkqqqqttttuuuuuuuussssppppnnnnkkkkhhhhbbbb\\\\PPPPHHHHCCCC@@@@::::2222))))"""" %%%%&&&&&&&&%%%%&&&&((((&&&&$$$$#### !!!!&&&&++++1111777799999999;;;;;;;;88882222....))))%%%%""""!!!!""""####&&&&))))****,,,,////000011113333555566662222,,,,&&&&"""" """"''''----5555<<<<AAAAEEEEJJJJOOOORRRRRRRRPPPPPPPPMMMMLLLLJJJJHHHHEEEE@@@@6666,,,,&&&&   $$$$''''++++++++********////7777;;;;;;;;<<<<====????AAAAAAAAAAAACCCCGGGGJJJJHHHHIIIIIIIIGGGGDDDDAAAA????<<<<99994444----&&&&#### """"&&&&&&&&****////33335555555544440000****$$$$   %%%%----,,,,$$$$ !!!!''''++++2222::::????CCCCFFFFHHHHIIIIJJJJLLLLOOOOPPPPNNNNJJJJBBBB::::7777777788888888::::::::<<<<====????BBBB@@@@6666....((((%%%%$$$$%%%%&&&&%%%%%%%%''''))))----////****""""        $$$$!!!!   """"     ----77772222////2222,,,,&&&& $$$$ ////<<<<GGGGUUUUWWWWVVVV\\\\bbbbdddd````RRRRHHHH8888----++++      ####7777CCCC<<<<3333====<<<<0000....((((  %%%%////,,,,(((($$$$  ++++,,,,  &&&&(((( ''''7777CCCCMMMMRRRRQQQQVVVV[[[[ZZZZWWWW[[[[____bbbbaaaa\\\\WWWWUUUUHHHH2222  ////CCCCFFFF<<<<4444$$$$ ''''****$$$$  !!!! ####3333999977770000 ''''333366667777????MMMM____wwww||||rrrrhhhhffffiiii````@@@@&&&&####))))3333>>>>EEEEAAAA<<<<99990000    %%%%////222244449999>>>>BBBBIIIIPPPPQQQQNNNNNNNNVVVV____oooowwwwvvvvrrrrppppoooollllddddXXXX@@@@((((%%%%////7777::::====AAAAAAAA<<<<2222****$$$$  ####$$$$  ''''****&&&&####%%%%////????GGGGHHHHHHHHMMMMWWWWccccbbbbYYYYLLLL::::****""""  ####3333>>>>GGGGQQQQ[[[[cccceeeeaaaaZZZZPPPPDDDD<<<<::::;;;;888866666666::::;;;;6666,,,,  ''''3333;;;;;;;;4444)))) ''''3333::::========<<<<<<<<88883333,,,,****))))((((&&&&((((----11117777::::888855550000,,,,))))((((''''))))****))))++++....22227777????EEEEEEEEIIIIOOOOSSSSQQQQMMMMHHHH@@@@88882222,,,,))))++++....--------////,,,,!!!! ''''22224444222244448888::::;;;;::::>>>>CCCCIIIILLLLPPPPSSSSQQQQLLLLEEEEBBBBAAAA<<<<4444,,,,$$$$     $$$$****--------,,,,((((&&&&%%%%%%%%"""" ########""""$$$$'''')))),,,,0000333344440000,,,,(((($$$$ ++++;;;;GGGGRRRRUUUUSSSSRRRRSSSSTTTTSSSSQQQQMMMMIIIIIIIILLLLOOOOSSSSVVVVRRRRLLLLCCCC::::0000****$$$$     """"%%%%$$$$  %%%%****////7777>>>>CCCCKKKKQQQQRRRRSSSSVVVVVVVVUUUUQQQQJJJJCCCC????::::66660000****&&&&""""       &&&&))))****++++----5555????KKKKSSSSWWWWXXXXVVVVTTTTPPPPLLLLBBBB4444(((( ####----7777====BBBBCCCCAAAA????????@@@@====9999666655557777====CCCCIIIIOOOORRRRSSSSSSSSPPPPJJJJ@@@@4444$$$$ ''''3333????KKKKQQQQRRRRPPPPMMMMIIIIBBBB99990000))))$$$$!!!! ++++3333777766662222,,,,%%%%         ########   """"$$$$''''****////55558888;;;;????EEEEGGGGHHHHEEEE@@@@88881111****   ####''''++++,,,,,,,,****&&&&$$$$""""    ####))))////6666;;;;????CCCCFFFFGGGGGGGGDDDDCCCCDDDDBBBB@@@@@@@@BBBBDDDDCCCCCCCC@@@@::::2222))))      ))))111155557777888866664444333311110000////,,,,,,,,,,,,****))))''''&&&&''''$$$$     %%%%****----....----,,,,))))''''%%%%!!!! !!!!   """"####%%%%&&&&%%%%""""  !!!!!!!!   ####""""!!!!!!!!""""#### bzflag-2.4.2+ds1/data/hunt_select.wav000066400000000000000000001243241200563112200174120ustar00rootroot00000000000000RIFF̨WAVEfmt "VXdata====p p p p HHHHLLLL````````xxxxbbbbDDDDGGGG((((>>>>EEEE;;;;[[[[IIII,,,,m-m-m-m-2222 %%%%$$$$:::: GGGG՚DDDD||||''''A!A!A!A!$$$$>>>>uuuuSSSS (((( ܫܫܫffffnnnnoooo/(/(/(/(YYYY       ;;;;YYYY####]"]"]"]"0000}}}} ӫӫӫnnnn****ZZZZJJJJf*f*f*f*yyyy####llll ٕٕٕjjjjiiiirrrrkkkk****....K K K K QQQQ&&&&oooo''''?(?(?(?(ދދދ޽ 3333aaaaږږږ3333yyyy0000ZZZZ iiii))))>>>>r r r r &&&&'''' !!!!cccc::::""""))))11113333{ { { { qqqq| | | | !!!!qqqqxxxxSSSSNNNN""""bbbb&&&&EEEE} } } } v$v$v$v$ ܭܭܭܣ^ ^ ^ ^ ZZZZոոո    kkkkPPPP&&&&tttt////FFFFTTTTߤߤߤ9999((((::::'''' llll''''????llllGGGG____LLLLz$z$z$z$>>>> ssssXXXXmmmmooooooooxxxx''''DDDDhhhh!!!!bbbb8888WWWWVVVVGGGG2222aaaa$$$$5555mmmm&&&&ߵYYYYYYYYYYYYMMMM((((hhhh    ++++hhhhIIIIFFFFgggg1111((((UUUU????aaaaDDDDiiiiEEEE[[[[oooo kkkkWWWWeeeezzzz    FFFFYYYYhhhh NNNNVVVVccccYYYYiiiiyyyyoooo    FFFFssssaaaa qqqqEEEE.&.&.&.&: : : : \\\\    BBBBe$e$e$e$UUUUuuuu++++wwww''''2222dddd ????))))aaaaEEEEcccc((((5555] ] ] ] ((((MMMMLLLLXXXXEEEE%%%%        yyyy~~~~u%u%u%u%;;;;cccc0000 ....!$!$!$!$KKKKDDDD llllOOOOPPPP)))){{{{----||||iiiiCCCC____#### $ $ $ $dddd ^^^^::::jjjj''''DDDD####    2222&&&&SSSSLLLLmmmmHHHHxxxx++++eeee ####ttttmmmm5555^^^^1111    %%%%2222aaaa````t t t t MMMM))))OOOOv v v v 5555 ((((CCCC&&&&9999----JJJJllll 11115555 [[[[++++ kkkk::::FFFF++++ CCCC1111bbbb//// m m m m 1111 EEEE0000  ~ ~ ~ ~ DDDDFFFFwwwwUUUU\\\\5555eeee ****ffff3333ZZZZooooiiii&&&&hhhh|||| ~~~~====nnnnL L L L ,,,,( ( ( ( $$$$qqqqttttDDDDrrrrllllNNNN FFFFOOOO66666666x x x x ;;;; aaaa\\\\G G G G NNNN    7777QQQQpppp!!!!----qqqqEEEEuuuuiiiiPPPPRRRRqqqqaaaaDDDD))))0000KKKKXXXX<<<<,,,,;;;;zzzznnnnooooDDDD////ddddzzzz0000____EEEEzzzz ZZZZkkkk$$$$%%%%R R R R $$$$%%%%7777<<<>>>WWWWxxxx ||||>>>>UUUU----NNNNssss NNNN####vvvv>>>>^^^^ffff....qqqq////EEEErrrr::::OOOO ZZZZppppwwwwCCCChhhh____iiiivvvv----????\\\\%%%%IIII ````----xxxx    <<<<ffffllllFFFFggggJJJJTTTTVVVV<<<<aaaahhhh&&&&n n n n eeeeZZZZ----    $$$$ZZZZZZZZ5555MMMM qqqq@@@@ttttFFFF 7777 E E E E ////}}}}        oooo    ++++lllldddd 22229999ffffqqqqjjjjYYYY ))))11118888KKKK ssssiiiieeeewwwwI$I$I$I$####\\\\ YYYYu"u"u"u"$$$$wwww[[[[rrrr((((2222''''HHHHyyyy2 2 2 2 ~~~~.%.%.%.%pppp(((( >>>>JJJJ݃݃݃ffffgggg\\\\ 4444""""    WWWWב%%%%####@@@@====֏ooooۍ X.X.X.X. ~~~~<<<<%%%%""""ZZZZ XXXXVVVV1111---- ۣۣۣۓffff ''''ssssB)B)B)B)----GGGG````||||++++OOOOԟ!!!! ||||++++&/&/&/&/zzzzeeeeMMMMCCCC$$$$%%%%FFFF    [[[[HHHH****O O O O VVVVrrrr{{{{>>>>&&&&____---- kkkk ####LLLLIIIIVVVVT#T#T#T#mmmmߒߒߒߊ >>>>kkkk!!!!%%%%ݼݼݼOOOO l*l*l*l*ooooTTTT!!!! WWWW߭߭߭yyyy ٟbbbbܡۡۡۡ۩ ))))W W W W ۺۺۺ ((((!!!!؎,,,," " " " YYYY5555$$$$ڌڌڌڤw*w*w*w*{{{{    ||||c+c+c+c+kkkk0000OOOO.&.&.&.&ffff ....eeee$$$$ޕޕޕ9999````),),),),ZZZZ{{{{ے{ { { { RRRR%%%%::::     ۋ6,6,6,6,))))&&&&iiii2222%%%%''''ӆӆӆzzzz~ ~ ~ ~ QQQQccccRRRR    ////IIII&&&&IIII^^^^ۅ&&&&!!!!WWWWy y y y ߉߉߉::::b*b*b*b*{{{{MMMM RRRRݰ?+?+?+?+dddd: : : : ////////ffff%%%%BBBB    """"ߚߚߚ 3333^^^^SSSS!!!!,,,,ٶٶٶ====s&s&s&s&5'5'5'5'%%%%CCCC    >>>yyyy!!!!nnnn׵׵׵QQQQ@3@3@3@3++++xxxxٗ ####aaaayyyy$$$$<<<<p3p3p3p3wwww,,,,EEEEססס!!!!0000    ppppZZZZ j#j#j#j#%%%%FFFF: : : : , , , ,4444ֺֺֺ'''' yyyyj j j j 4444    ttttVVVVڹ]"]"]"]"0%0%0%0%rrrrϤϤϤ4444&&&&ooooڈڈڈ)))) '''' iiii''''YYYYސu)u)u)u)c"c"c"c"****####llll ) ) ) )/ / / / PPPP " " " "xxxx{{{{(3(3(3(3aaaaGGGGBBBB6666۝۝۝""""$$$$ ΎΎΎΩ%%%%////UUUU''''uuuuppppxxxx9999؆P*P*P*P*''''yyyy_-_-_-_-ssss}}}}    ::::$'$'$'$'hhhh;;;;ѼѼѼ    kkkkׁ''''hhhhffffppppdddd2222ffff4444HHHHgggg8#8#8#8#S(S(S(S(EEEEڥb#b#b#b# uuuuBBBBwwww1111ۄۄۄjjjjRRRRZZZZ7777RRRR********a'a'a'a'2222\$\$\$\$****ttttSSSS////<<<<[3[3[3[3u u u u ضضضؾ # # # #''''PPPP@@@@tttt5555yyyy YYYY2222PPPP*#*#*#*#d'd'd'd'ffff    c*c*c*c*Y Y Y Y ۃG#G#G#G# AAAAݥݥݥIIIIۦM1M1M1M1<<<<9999 ++++++++хB+B+B+B+    """"ߘߘߘߘ.... ֠֠֠OOOOl"l"l"l"O O O O ޭޭޭ''''rrrr****ܬܬܬ$$$$YYYY''''wwww@@@@%%%%ۈۈۈHHHH0000}}}}qqqq####ccccMMMMs&s&s&s&UUUURRRR} } } } !!!!ݛڛڛڛڪ J0J0J0J0WWWWߒ****yyyyqqqq((((****ձձձպ#### ....UUUUpppptttt!!!!""""cccc ====Z2Z2Z2Z2QQQQppppHHHHOOOO""""%%%%xxxxչչչAAAAZZZZ****'.'.'.'.HHHHW-W-W-W-;';';';'8888""""    KKKK_/_/_/_/u u u u >>>> 8888''''2222݇݇݇{{{{8888ggggo&o&o&o&7777EEEEz-z-z-z-####((((;;;; )))):):):):) vvvv A!A!A!A!ߠNNNN@@@@\\\\>>>>0000~~~~((((NNNN@@@@ttttBBBBMMMM@@@@3333!!!!ZZZZHHHH<<<<))))````}}}} zzzzwwwwllll)))) 1111) ) ) ) rrrrQQQQ****kkkk....qqqqCCCC==== ^^^^....!!!!3333    ////LLLL$$$$jjjj;;;;jjjj))))}}}}DDDD DDDDGGGG    {{{{nnnnLLLL  PPPPjjjjbbbbjjjj????XXXX0000mmmm!!!!zzzz    DDDD6666||||AAAA((((ssss    ssss@@@@LLLLyyyy<<<<hhhhIIII{{{{AAAA HHHHwwwwxxxxXXXX1111        }}}}////VVVV++++0000||||cccceeee]]]]&&&&5555~~~~\\\\hhhh? ? ? ? VVVV,,,,dddd&&&&>>>>HHHH....zzzzMMMMTTTT0000s s s s E E E E >>>>  ....    11117777GGGGqqqqHHHH$$$$7777aaaappppMMMMiiii2222    jjjjmmmm6666vvvvVVVVcccc''''FFFF****llll66669999bbbb$$$$IIII))))!!!!????uuuuhhhh88883333====WWWW;;;;JJJJRRRRMMMMmmmmQQQQ{{{{)))),,,,nnnnIIIIeeee>>>>]]]]NNNN,,,,\\\\{{{{zzzzvvvvZZZZDDDDkkkk????QQQQEEEE````;;;;bbbbmmmmffff MMMM}}}}9999]]]]2+2+2+2+1111RRRR____####HHHHzzzz****nnnn9999SSSS: : : : \(\(\(\( ܽܽܽܤ++++ mmmm>>>>ܟs%s%s%s%w w w w VVVV****PPPP1111aaaassss & & & &, , , , """"3333IIIIiiiiDDDDvvvvT T T T [ [ [ [ """"ccccPPPPPPPPttttBBBBLLLL%&%&%&%&rrrr<<<<3333 BBBBT%T%T%T%RRRR }}}}5!5!5!5!####[[[[???? EEEEi!i!i!i!zzzzB B B B kkkkS S S S &&&&9 9 9 9 PPPP0000ޡ    wwwwWWWWIIII7777FFFF]]]]TTTT####....dddd\\\\    bbbb((((!!!!ܞ X#X#X#X#h h h h 9999!!!!3333ֿX"X"X"X"    iiiissss1111s*s*s*s* oooo~~~~؆,,,, GGGGooooWWWW1#1#1#1#>>>>؄ |!|!|!|!____>>>>    &&&&֏֏֏((((;;;;####طططggggtttt !!!!  %%%%* * * * mmmmm m m m [[[[LLLL''''iiii]']']']'ssss, , , , 0000]]]]ޡddddGGGG++++####$$$$ѯQQQQdddd''''9999jjjj Y%Y%Y%Y%+ + + + ````ۻBBBBBBBBSSSS("("("("PPPP$$$$IIIIRRRR====BBBBgggg||||V-V-V-V-bbbbؤؤؤز    }}}}}}}}++++xxxx    BBBB....''''׏׏׏#)#)#)#)ԛԛԛxxxx9#9#9#9#qqqqrrrr....6666ߘߘߘhhhh۟[[[[((((####׊׊׊C C C C rrrrBBBBOOOOW-W-W-W-((((ffffIIIIP+P+P+P+~~~~~~~~ccccmmmm + + + +7777::::NNNNZZZZߒߒߒ::::++++    llllRRRR|'|'|'|'!!!!rrrraaaa eeee7777----ѲѲѲSSSSc)c)c)c)****>>>>ssssHHHH ####!!!!@@@@uuuu7777{*{*{*{*σσσxxxx'''' ܤܤܤFFFF???? SSSS %%%%rrrrYYYYrrrrOOOO++++^^^^uuuueeee<<<>>>bbbb8888׫))))$$$$ ЋЋЋ    e$e$e$e$????$$$$++++DDDDՎՎՎNNNN&&&&^^^^aaaarrrr_0_0_0_08888[[[[R R R R ٳٳٳ$$$$>#>#>#>#eeee2 2 2 2 CCCCbbbbUUUU....----җҗҗ&&&&TTTTQQQQmmmm5555o(o(o(o(NNNN2222 Y)Y)Y)Y)++++ҙҙҙv v v v '''' [[[[kkkk''''))))a'a'a'a'????ۧۧۧہ H H H H ....HHHH&&&&*-*-*-*-iiii{{{{))))2!2!2!2!WWWWܧܧܧB B B B ????\\\\D(D(D(D(MMMM6666((((2222LLLLކކކ))))''''''''>>>>ڙ hhhh++++סססYYYYN"N"N"N"S S S S qqqq5555tttt/!/!/!/!KKKKܩܩܩܶ zzzz,,,,((((<<<<j j j j ####3333CCCC<<<<2222IIII####     8888AAAA2222&&&&TTTT////yyyy::::    %%%%z%z%z%z%MMMMHHHHr!r!r!r! \ \ \ \ ++++{{{{....֡֡֡ր&&&&(3(3(3(3((((͎͎͎++++ eeee؄؄؄؊++++0000ߙߙߙ....IIIIjjjjڨڨڨڝA%A%A%A%''''Z$Z$Z$Z$TTTTBBBByyyyU U U U TTTT 9999YYYY WWWWP+P+P+P+))))yyyyv v v v uuuu$$$$    ,,,, zzzz}}}};$;$;$;$````F F F F ****ݖݖݖaaaa,,,,zzzz9999%%%% vvvv....$$$$KKKK????HHHHے>0>0>0>0&&&&%%%%tttt%%%% WWWW    ((((YYYYbbbbcccc7777zzzz%%%%MMMM5555ދ NNNN....\ \ \ \ ffff߯{ { { { nnnn %%%% ))))""""IIII""""NNNN2222ޑ####%%%% mmmmXXXX,,,, 6666""""\\\\%%%%IIII^^^^XXXX""""####3333$ $ $ $ B$B$B$B$vvvvaaaauuuuWWWW2222ևևև ~~~~&&&&~~~~!!!!hhhhmmmm||||߷$$$$1#1#1#1#%%%%,,,,OOOO''''11118888''''GGGGڞڞڞ((((K K K K " " " " 4444GGGGUUUU////kkkkDDDDj%j%j%j%3333$$$$!!!!~~~~oooo$1$1$1$1HHHH....F"F"F"F"rrrr kkkk۴    ;;;;V*V*V*V*ҘҘҘ""""$$$$;;;;jjjjvvvv;;;;XXXX````%%%%v(v(v(v(7777֭a a a a >>>>GGGGV"V"V"V"X X X X ++++bbbb QQQQuuuuߓߓߓ &&&&KKKK####IIII;;;; ::::vvvv%%%%```` { { { { }}}}uuuu....T T T T 6666GGGG U U U U ^^^^@ @ @ @ SSSSLLLL ****llll::::iiiiLLLL22228888aaaapppp; ; ; ; ----%%%%wwww5555u u u u YYYY7777oooo}}}}bbbbrrrr KKKK____{{{{""""----PPPP''''DDDD9999((((    ----^^^^))))OOOO]]]]qqqqwwwwTTTTNNNNzzzz::::====////OOOOttttiiii&&&&XXXX<<<<3333 iiii ::::%%%%ddddIIII 2222DDDD6666 ````    CCCC  k k k k @@@@{{{{$$$$[[[[ ))))qqqq%%%%8888b b b b MMMMjjjjWWWWf f f f     ####""""\\\\BBBB!!!!____\\\\dddd^^^^OOOOpppp////4444]]]]    ---- llll5555EEEE5555 ))))5555((((////DDDD00009999FFFF{{{{~~~~++++ZZZZNNNN****````))))____dddd MMMMVVVV]]]]UUUUhhhhkkkk YYYY  zzzzHHHH6666mmmmyyyyaaaa****____kkkkRRRRtttt----44449999    QQQQ5555@@@@OOOO&&&&----$$$$OOOOLLLLxxxxPPPP!!!!- - - - ;;;;hhhhttttr r r r ,,,,& & & & FFFFn n n n    c c c c ))))]]]]AAAA,,,,3 3 3 3 oooorrrr----44446666SSSS????qqqq33334444    7777uuuuBBBB$$$$TTTT????9999mmmm    ====++++cccc    !!!! ::::NNNN[[[[AAAA[[[[TTTT''''7777 ? ? ? ? kkkkssss[[[[ ooooIIII1111''''QQQQ{{{{****    IIIIJJJJ0 0 0 0 n n n n yyyyT T T T  TTTT////<<<<==== GGGG1111 MMMM  ,,,,aaaawwwwggggFFFF MMMMhhhh     ////C C C C YYYY      llllMMMMzzzz0000''''nnnntttt ^^^^nnnn %%%%vvvv llllTTTT4444mmmm;;;;aaaa:::: hhhh    ffff/ / / / ZZZZaaaa}}}}]]]]ttttkkkk` ` ` ` $$$$!!!!    IIIITTTTffff````     LLLLQ Q Q Q ; ; ; ; XXXX 7777^^^^FFFFA A A A ====vvvvV V V V ####""""hhhh wwww>>>>IIII____[[[[xxxx>>>>////BBBBDDDD jjjj!!!!    HHHHQQQQDDDD llll 2222bbbbIIII  ....HHHHEEEE++++nnnn7777<<<<jjjj((((~~~~++++iiii [[[[llllP P P P ^ ^ ^ ^ ~~~~}}}}bbbbOOOO {{{{    llll----L L L L NNNNeeeeFFFF rrrrEEEEmmmm"""",,,,++++$$$$FFFFcccc8888TTTTDDDD ] ] ] ] yyyyOOOOm m m m 2222YYYY dddd    ZZZZ;;;;1111LLLLNNNN ;;;;0000|||| }}}}wwww}}}}ffff@@@@::::****VVVV6666>>>>rrrrCCCC[[[[HHHHgggg]]]]::::yyyybzflag-2.4.2+ds1/data/hunter_bolt.png000066400000000000000000000055351200563112200174130ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧 IDATx GS0 `|a103ieeˬ %`|Uj97e_On$:b=j_!/b*!q 㑎0u8ҡ; 0:g.)+t]e,~x8ÁMq݁@}ɪ4041zR{&k$]r=9{op 6/ih@=RWvʧ8Q(a3$80h3o f]=S"(ayM ) AX@ VH݁/_=xPl<@<LcufjiD 0BMO-'aS@ f_`PxS`OR,BBT?F| &`90Ntld{p=P=RdˀG&V"1V@Zc^R?( ײj mGB$lQ@5Yl $1%||B@O68' :M@ )PuC5̗ Ua!驸a_  (g<P1QS I}|I0iN 5BV(Z*^1 Fc[ݷ>)_ǔ|3T?1`>I(Pl :!8j z `q$A7֨(*aPqQrC[ƣ*gSPV?6P}ty>>`)T|jR շ3& ljޜw bPUIMAqg C<4]ul$0ߘdB 6hikG' x_eޗ%H4<@k+/^F= PoݍUKD}l'J$s PN!Cs C@ˇ>kT_Z @n`540b1!(w^ s#%fMq)HV]PwAh j1oA *x nmaw/=`Py(S R)~^z5fQ5ՇRUƶ7w0 n]u@[N*P*Hhnw[?'`ur XIL6L " {EFZ' @78 UǸfZ0.CPJA!/3 mpWI/ p2tjm&9fvT'Ez`VB@XoY7*mjǗuwX::; ;36(0lmM[;0g>-$0#FAf`+oz_9a.k gvZ׬W78uq=n`\R0m?VI@ 0:%9;v^ź@Ce?G"MA WNx<Ȯҕ;L `@]9^ğ=']i*.t' ڨjR0~mPnZ4$t\ r1i9$ R' 3`ػX?rkTC's` B8n_7 :(9h 9`?i=8  o~~W|9<o7E#Gc#2CRcr&_67qraIIENDB`bzflag-2.4.2+ds1/data/hunter_laser.png000066400000000000000000000004721200563112200175540ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATxб AQMĬIL^s{Yd!\X___PnT#`Bǔ̒MsHH\ǐvvxEmp\{<               ?V-IENDB`bzflag-2.4.2+ds1/data/hunter_super_bolt.png000066400000000000000000000200301200563112200206140ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATx[ X?!(BH$00DA,d 5b3̌J(L5S143 YrrfugsFA|sG@j\=s߿w6_06[XVa 4zB[w⊪Ԉ16[\o_k-^>n n].ramb2l[E'ar}EШAE}`aĺkBl<\+Mĸtq[Źt x.LZh|^+ח^Re>߼|*_sBB )<kTv6NoB[Uff%!P,snwS qιʩS]:|7D/TTX,T9-#8*ѕ>EX ~䩣 V8٦fU<=t^S^)e;uFCӆae;upN.ο?.PW>~[TO3=b[Ŀ_h bnG\4X1>=S1VV}.0 h zeJi>RѵNUJsy*BؒV=p4Vi*)֘nVJZTQתR NX֎Z+@?` 2UЮ7B 5Pȍ.U:UgZTB6Snl7aEkѡ-:X|mNwJۢo41| .pCtU]GV m ss=6=iXp[7MEIcӣ)]C &u߻k)v5U~w=3խ'.iqTcWuВ ťҳ"#Pv)ao}aG]8}V0Ԧˢ{Dh͡su6=cZJFpaUϛU"fs?փͺX`zۚa|a@Uσ܇Vv+{y#z״N6U;MupkF(,qJab2:P7c2ⴀPV v2N!cP١? jW󤛕=}!g61X2v-οw}Y}}BhAA"nƳ)i~6ʭJ2$==+Bb]@Eϓ <OW.)_a)'p)e{B7+9[\kpq s:EǮ3_b}oX^E;~n5(lSEܷX$+ .[:MՄ(qӌ_7 sסwjVikVU(fC'mq8&g>{=V~߇/6ӾE~ l>AYg!:\} j)amx$߯S@ V4w65vpYS'Q# pw}C HNKr4S'gM\%۰m՜w UZ6:Mz߹ ;tFp8g=*M, ݈g@[75܇PQ*؏O\k]f+C튇t[M[U)]}f/犏G78tvK{(Qa \a!̷ `g Qlvx"y 0/2~K7i |,{'ÇJR-E֥U($;UsLX}vh<{>/\v~% !߬f0._Pkee3j)r /q^|,KW4wT<',%̠;0y#s !&RJ0wa6mS=ۦ_sgP[W8We-@,˛b 1%B7@=[T%LکrpK%u |6v ^1{#%{U4| yؙ{5O=b|ڡRⴞ)@ЂF6pp.Yp\u:QDjI+($'9>UPDpf*V0LU9Si$Th+1WNͤd` ~TSlW! )|p!r1OO; P\4ѭjWޅ;5`UV^v{F!9.żZj) sEéZOeO1{Co~Cm}nW>n)B/.Qø.jEhWsi7sb -rtR _6vp#w)}lQG=x?B *3;cBzI&pw pmr_V^qգj;u;Ծ?#='ީwA>u+{ʽt`M'Z\>V2 H.LqRe`0˶/k׵W<~ ta@⢍ C"@7[Ts06>6M)LpCě|NuNuN}$~Kg9멄_D|Jxф!APoaŬS% '&i)w/ӧQSfE>3fHoZиn5aOR}q!P& dew(I8?5+?Rt#Tߐ}zc11R'b}eId݁f,I6̰ X/(5)Rr6%cJc_W F!'񋠬zX[}$o3Ap<IG>-KfN?u'qvw އуdJ !],xXp Bj; l!L=@!u{}OE͢?/~8pTѷayw(MB uZ;QR;O& 7 ƢhR0# /Ŗ&apx77X+]0&]Z"!M ͲU6xj02k m~_ ߕB::(R_5ӧ5~o>D% 8%dy__.,5Cuυp/n5B+yT$hqŦg;e/ Y6X/b>- )A %O)EE-ʛ 9iI?}pJ7{p8m7 F/-+wc>iWܻU{^PdISj7B,3gbOWI00B{GGSģ^0G{(`|Y |RCpm)@~v`"-V.Cv"Tx'd B[&\,@# P:,@:I|m0'XqE3 D.tIex(YMSR.t^ PsK#OHe0Ed ]('R0S` \hpd-17 @`R߹Nvx.P.'SaXD!d%ݪH qʭ|hz_9rv&j pԊYBB[QKCNnw\L"? 9Q+SvIrh-7*$0uAДdTq*I4jE{L0fCkh cm&6Q:rJ(kZ|/#} ;tHQ2Jn oo&1אߜ bl1V!d 4?p4|CPzJ NqI>;L]g#&xJ00Ч${&N}M"30=:Xf^t Ŗ /ɒђbnF zsGLΙ: +A?#V!k{sr3 NErr$ y#ΫCS}U.H}Eܿ $<Î,D)ksf^*D[":+ƖC@&2k2}B68A `_Yl0}=YK"HlPI6(@I#!+ 곳A}lf)V k0,2 ; @z?:C?E 9˼7Jy<6vl$'n\*FS ^ !4=A$9/waP$7kuiXVMe2b S>Tw$ aayH!b$r oz8iPKn}/xo !3D0LFs10B!tl$z9vd!zVgyb)%D2~natVG ;z;-mr &PUR 3TZ]B\N<}N 0iFg85m`S̪S'c"`Q(<0^3d YAvTgHS!< ŖOw_cQE%kVoB;`fHޠbopStOѓs {Nٟ@ V7Ό=v`rGOGX+P!`x#2KwX? Ty&QZ\;^"F6 D\i"·/IΧK;bw?6l@zd,dퟧJ׻4rv> &f#>F8/6` iŜ;ƾP/Qy "`|Jz׼ސ/v\l6p?>|^ ] WEKe,,,I*G79(#q 3QN nUgdL, u25!5v01!BƽA%HK &=nCiu3"_7,3^fP E^gT`S1߷Se24~8Y   `"hF>#?`/EkZw7B Mekm;^-KzSl1:f3Qߴ=6 NwN$*a L&BϞ %,7Gd2WȮwJ,J(F2TTď2%:挡n]Ԩ;[5)ʆ:')}hqf0c scxtIoNP0{s!&.EUKTs6'VsʲՕ!IJ3{L*LfbjS 4ZIް$'ESw#赒x'EDc@O C&ZQcd\&E?:&EϏ2+sQ MI rtc N2oLv.d 0+5D(g& F3Kq-HunVJ M_8$LrxҞ9Sdfʄɠۻ)Lc)pNZ 3=CyC&+~5N8 GCO;3-.7>'J&18%E{`q9JgMa)Y$9ralj>y0";}>/gcf"U-az4{ GyԂ0Zwy:0e?4i79(^2nP[Jao'&xoet"1S^c8d_5LݩN;%G~WmTupm۩)]xy}wn1;Crw;?LW#ÊS (PMq،Ղc 4=ǎ?&|k,D&oѷy58z;b{5O'NT5+` `p´?Mjr5[2;wwyo;Ajq~ڜ4TW7h5nY$a݄5W^5>gq!{uYk6벮{gNމYigmq^'i׾(#blTܗzsT>?K|k(-H:!j_qt5I8W'08О{ί[6_w 4`# }tw~E8 A[q45ҿU:* HB}mqMb$a{k~5>6qĒ@s8'|Wf\lm؀)ȉ_VM/iɴmབྷ\}jN˯r@ kWLF9O?R-hs-l6fe?/mMAw9ƲΡ?OyW.i3 'psqZSh࿽TZu_Ӎ%hB6PYVuWWBot1vp3#~?[y9Sq/x]Mzfқ@AdB4ԿifxL0귝nz;#~Y?x DGq4JW#ͤ?lʐa/bMO_Dg-ߦ(Q}שok&t.?Y3^c6Wr߷kjvIlRiJ2׶h IKOYGcY ߤ>pw8ӕ^G)";G~{qN YLjMOt>^k Ks͐>prh7n/tZ_$֋>j(תe+6茼ÖiTΣ2]/ïĚ-ǽw{l~9,ZZ>z<~o^/|_pehr 9fX#̯dfsKW7,dT{"v\zWg? WvqHž~FF5/RwṅyrufV_,fL) xGzdG*1s6ЏC5>o >FDi2V9OϰŘy?/& Ч<ٞq~͟+n *6㯽y];A7̏? n\P|Պ&і>/'0=Ș0 ǻ{=/kr(.C5D 0/2+r;@yɂlr_$ֹ't|њzQi\`]_[_^]``edigmkmqqsxvy|}¥ĥťȥʥ̥̥ХХӥեե٥ܥڥߥߥ"ϥ[(̴l1`֟̒cB-CHũk88)H-H5E?EEDODXFXRNr,`R!ǥFESS.39r>sCG"OBW@YY^Y|YmYoYqYiYkYgYjYdYfYbYaY_Y]Y^YXY[YVYSYTYPYOYNYLYIYJYDYDYCY@Y>Y>Y:Y8Y5Y5Y6Y%YBYYPYXaYVRQMSJJ-F BA=;6t2^-1#\ .:PhC27 /9CJyRWXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX{X{XyXwXuXsXpXpXnXnXkXiXfXeXeXaX_X\X_XWXYXWXVXSXMXWXAX_X1XfXVSS^UW`XXQX&XBX+X7X0X.X0X)X(X'X(X"X X"XXXXXXXXXXXX X XXXXXXWWWWWWWWWWWWWWXWXW XWNC_1!i"OBCMCPERJRMQRRWUZ[[a^dbfhhkmporxu}|xjLӨ jӓߕ]bn =2mܰ؄HA \%=5:7?EiGIJMQVWVdWVAWW'WWWWWWWWWWW W W W WWWWWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVvVVnVVIS=Ep;* >ܩu©Ʃũȩɩ˩̩Щѩϩթ֩ک٩ߩީ٩˩$ȿiP &DYVUUVUVUVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU~U|U{UyUxUvUsUqUpUqUmUlUiUiUfUcUdU_U_U^U\UWUXUXUTUSUNUPUMUGUJUDUCU?U>U@U1UFU URUUUU]Q3HFA3s DQ7UJĠ"үRZyK`Ow#**;EpKRTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTOID;(/l ¹6vbdlw|z}~ʫsݮ_ ]"3?JSTSTTWT T=T,T/T3T*T.T)T,T(T)T&T&T#T"TT TTTTTTTT TTT TTTTSTSTS-TSAT]SIAt:*6x6#޷,Mm_t#@V+`1\>UMSQTVWX\^\`beejlppvrztxM5ȷh9wHMhSS@SS@SSLSqSUSdS]S]S\SZSZSXSYSVSTSSSPSOSMSLSJSJSDSFSBSDS?S>S;S;S:S6S6S3S2S0S1S+S-S(S(S&S#S"S$SSSSSSSSSSS S S S SSSSSSSRRRRRRRRRRRRRRRRRRRRRRRSK+@1{ 4,v&#岸A8rU𰅱ϵոF| 7E*<AGERRXRRbRRoRRvRR|RwR|RvRzRtRvRsRrRmRpRlRkRgRjRdRdRbRaR^R^RZRZRWRWRTRTRQRNRNRMRJRHRGRERBRAR@RAR=R9R:R9R5R5R2R1R/R-R*R-R)R%R&R$R!R!RRRRRRRR RRQRQRQ R RQ_RMD/LoʈҮ[$"/,+#'('+*/-115698:;=@BCDHGJKMOQRUUWZ[Z^aaccfijjnorptwvz|z~~[5A%6B!L*QIQ&QDQ$Q;Q)Q1Q(Q-Q+Q*Q(Q&Q(Q$Q%Q"Q"QQQQQQQQ QQP$QP1QP7QUPG=9l5-#H(_'t.b7=CJP(QPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP}P}PzPyPwPvPuPqPqPoPjPmPePgPcPaP`PXP`POPfPCPkP3PsP*PI?2XLu>ҹްدׯԯƯԯ̯Яӯӯԯүԯׯٯۯۯޯݯ߯/k]»DqVY"]ǽʹݮwxuz  3?$."69,<@ BFHG/I+IbIJHVHI-GG/F2Ff7i4f/&;#%Dy̖Vų  &%-'6(>'H.>O/H-hT" O sM (2+vՁCȲgr.ތ$F.8P>oC%JrMMNM"M8M,M+M-M&M)M#M&MM MMMMMMMMM M MMLMLLLLLLLLLL.MH?82"69b#+5;7BMJLLLLLLLLLLLLLLLLLLLLLLL}L}LzLuLuLqLnLkLnLbLgLcLYLkL=LLLLLLKE(A96-' "-58U@CTH7LK!LKL LKLK4LHIB>92'D%yf1Z05@߳~GO׊ iY$E+Q.1L002155{8'2u6?FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE`A?=}:7311G2222H56431}0-B&\ D$&$(.13689z:8&8%42U/-/u-//-`+D&H"Y 6+Hgd69XrׂҿΐqZœw3ʴѯ<'~(7 @tEE}EEEEEEEEEEEEEEEEEEEEEEEEE~E{ExEwEuErEpEmElEjEjEfEbEbE_E\EYEXEXEREREPELEKEKEDEFEC;?:72/.-'!;)4fa>(2܍Irߪ3@fЖCn +9GB,>6=?>?EBIJKMOPSWY[]^b`n]v`xk1gCF/ecitF."pܚaЕϟ͂7\eUx[$*-/p2/.;,z) Ŏ* !")&.+4-:4:E$sŻƙә)@%:CCCCCCCCCCCCCCCCCCCCCCCCzCCoCCgCC[C?8/*(_X cj;EJ (.449A`CCRC%CBC,C4C/C-C.C(C,C%C$C$C!C C CCCCCCCC C C CCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB|BzByBwBsBsBqBlBnBjBjBfBeBcB^B_B\BZBWBYBTBSBQBMBLBIBJBEBDBCB?B?B=B:B9B5B4B4B0B.B,B)B*B&B&B B!BBBBBBBBBB B BB BBBBAAAAAAAAAAAAAAAAAAAAAAAAAA>950S-%) gG<ЕϙN#uTVyxru~ƾǾ˾оҾ־پ߾۾پ)@̰Օz#7@A@ A@@@@@@@@@@@@@@@@@=25'=وFtˁ $ɖm .lȨ- Eaӛyҫ~+ֻe}7 #h=D oL T~uf V'").+4:???????????????????????}?v?w?t?p?n?j?h?e?`?]?[?Z?U?Q?O?L?H?E?D?A?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>|>y>x>r>p>m>k>h>b>c>]>[>Y>U>Q>P>N>H>H>D>A>=>;>6>7>1>/>,>(>'>">>>>>>>> > >> >=>=>=$<3:X88y9@;=================================}=z=v=v=q=o=m=h=f=b=a=]=Z=X=R=R=O=K=H=E=C=?===<=5=5=0=.=*=(=&="=!======= = ====<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<95@02+#~mR(  ).}4-:{<,<^<6'|+03198;;C;;:;;*; ;;;;;;;; ; ;;;;:::::::::::::::::::::96d2L00123#4$68p::::::::::::::y:z:s:r:r:i:q:\::(5-' _1|Əŷ !&'+.0449;=@DGJLNQWW[]`hcrdzgƄlƀƏ2ƣҾ)-147 8*97G7Z61q-s)#C^5eȡ  #$.)5.8<+Ǔ1 ֙{I sm&*.T1222?21 2-2I1..-,g+)e&"Vcml Ejz1WIJ[>qT' R#$(@*F,01L4<542/3232O0.G,*(&$@" "Q1&/- # r6"#'*m-,245a7a7[7\7R7W7P7R7J7N7H7E7C7B7<7<7:7774717/7+7*7(7#7 7777777 777 77776666666666666666666666666666666666666666666666p66]4 0-+)&U#+LL |xYې֗2Kɦɻɿ OgYFE/'ܓۂOހV' SV&> S.CQ "#$&'(':()'&/&z#"!P^K8&nb&c"B&( .'3C5q5E5a5I5U5H5J5H5E5B5@5<5;56565-565%541E/:,(%&!! ??s6ӌ ,**'--/547<;A@GEKKQPSVX[^aahhiomurzz~˅wˡM˗%,эӖִٰdi 3$*j/}364H4=4;4;47484043404-4,4)4'4$4#444444444 44 44443434'321200/_/13333333333333333333333333333333333333333}3x3w3t3r3m3l3l3e3h3\3i3T3e3O31-*'T$:!r';lSj^o7!=#%2' (?(-))(("&%&%%e%##_#$N$#J&S'&()+-+)+ ,$*`)(:'%%Y&>&$?![,cw&kӯd͍͚͚͍͙͐͂͗ͣͦͪͩͭ͘͢͞͞ͰͱʹͶͺͺ;ͯIJΗ͵ͷͻͳ͹Ͱ͵ͮͳ͖͚͕͇ͮͯͭͫͫͪͨͨͦͤͤͤͤ͛͗͘͟͜͡͞͞͝͠͝ͰQͼ J $*].;1u222222222222222222220.,*(B&#A!  ,  k$(3+;.[1222222211w0g.-+(V'%#!vM_}<   *{  p mq /+ԃ;γ `hӂְt'%K`]#߮޴8ߧߖ|P{"_~gRNV) .X/ E "@%&'Y**+,)E(%"!U N -0Cfje) 7 cX] "L$'+.s23333333333332l1/.+(%"2< DLgH2W٭ՒԝԻ6XΟ̇* >1FDԡۭތ tf- v# >[M*q!3"y#$$X$'$$##" x Y   J AeKϤ˛ˤ˭˗˰˕˨˖ˡ˚˚˙˗˕˗˓˒ˑ˒ˎˎˋˍˊˈˈˈ˄˄˄˄ˁˁ}}}xzwvvsssqoommkiiifdfcaa`\]][ZWWWUTSQPONLMLFIFGDBC@AB=:=:7965440100--*)*''#%#!    Rv}SӤ$ݗc @aZ&$+&a(++,r,`-,(+)F&%$"U!7v0uJ  8% E I$&(*2+N-S13G5Q5F5S5G5V5L5T5T5T5X5W5Y5Y5Z5_5`5\5c5b5c5`5f5e5e5g5i5h5i5j5l5m5o5o53o0,(#\D i>f:y0qA } O<Yc ~YJ&I$ؕZ[7;B4@4<44332.1.*++(&(#%!#  ɿɿɿɻɣ!6֫ GB!)D/6666(66F6k6W6d6d6a6i6d6k6f6p6f6v6f6y6h6420.v,)V'$!UWZ# + A= c 3#')/366666666666666665V18/-+B*'%6$" 6bkmV!y"%f&&'&c'c)*+S--s-- .0101 21/.>.j-,-*'R&j#n!HH 2=5ߔ@uҮkKɬ"ϥэӒ`ډT & %)j.,2<46b77R77E7(7<76777>7;7?7>7B7C7B7D7F7I7F7J7K7L7N7O7P7P7R7T7T7X7T7V7_7P7n7@771777564Q3111._/.-$+)($"!5!m/ #O* Hޜ"qtgufqdmcgcbb__[Z]U]QXdȎ́`òjxʡ?LA;E7D5<=?@CFHKJSQT\Or5ˆΏѫWD$*.2#77/77=7r7K7\7R7R7R7K7N7K7F7I7?7E787E72765445x666R6=66C76o6637676(76*6"542/0,*2+`(&$k" 2P.  h# ~ l Z xj %~bF 4aJuW.Y  @5H' "|#D$$n'*m*+,/.0~1i2(201444v55?4r1s0|.-/(/"/0J2 44565 6555555555555555555555420].+@)&$!`kJ= d  A%%sا$ULfTշ&nPIHʝʷʿʽ ʺ˕άѮuݲl]%h3:ғ̓BnSlM˷˸˟~̓BM˗rˇˇ˃ˎˆˑˎ˔˒˘˙˚˞˟˟˧˥˧ˬ˭ˮ˲˴˵˷˻˽˾ !!$*(-,03469;<@CCEHHNMRRVWZ^^`cdfilonqtxy{|̴̝́̆̅̌̊̏̍̒̔̎̕l̡9FY7Vy(WMY  0b͗{|C ?y &bW ;mkGv#Fq~Y)nW Z!"j%G'((l),K-,/1110s0[0p112F2 2522&22222222 2 22222111111111111111111111L0w.z,:*'%# [T|> (. ` t  c_ $o(,P0|1j1p1j1n1d1k1[1n1Q1p1G1q1?1.,+)s'$n"nM&!j#$"!"! ; + [E^@Z! + Ѷ|UM^w{\ #(9,.0000000000000000/`-*'$%!me Vr}ׂؓӧaϯωϢϘϠϡϟϦϡϫϨϬϬϮϱϵ϶ϵϺϼϼ  #"(*).-4055:8r%/տ׫{e4 ^62[\ 5N i#J&''***N*++},,,G//_//]//Z//J//1///-w,+3+)(5(G));((&%$" B,_ gn Q1. -?Hu Y'kjM!Ka*k1racUJ kF1ro7[ c(wyF9k k[[ZK/8.R ܎H$$&&+,-112:0Jحڱi-d<U #&(***+x,l--w--y--{-{-u-x-t-t-p-o-l-l-h-h-e-d-a-_-^-\-[-Y-S-T-S-N-O-K-J-J-E-E-B-A-?-;-;-7-:-5-0-4-.-,-,-)-)-&-#-#- --------- - - - ----,,,,,,,,,,,,,,+(& ## [L"%'5+,,,,,,,,,,,,,,,,,,,,,,,,,,:,q*'& $!v"~k c[;X|F_)G6q 2 G^n EDw1QMS?ddhD92?{fM > d=YCQ^<53>4C;C?CGEIKLNOQTUXZ\\``agfijmlqpvty|uԑk/֋<-v; L/opE)TPE" nMH|HY ? L < "y[e?0 O @ !Es q  ;m@!"n$$m%$$#]#x#,"~@E] ;/r0ݻVղlՌՇՂՑՆՒՊՕՍ՞Ղe-.޿#_ +[W #$'7*9*1*7***7*)*/*(*)*)*%*%* *#************ ** ***)*)%Q#3" 6H4T %SAeO{V3#!+(%!հ؅}=3O=LX(7 \fq=܂ؐ֏fסُڨ(PۗRۑ܏M=&-xXJ7b^dH^ Q.tRR^sK <ztdD!-$C%&)X*S*\*R*]*W*\*[*\*[*]*a*]*_*d*_*f*]*l*Y*r*Y*w*T*'%$#l!'k$So^/Cu  t rT"z5rztd6D7ߜ76KUBY}r;L>D$ ( ft!` ! %+@!k%I(****************>*@'%$o"g \} oצm6.$4"2!.$%### "  "qׁnڿ>ټUmݒߏ-=JK?@ g|!$&/)+ +++++++++++++++++!++"+#+!+$+#+%+"+'+(+%+(+&+-+!+1+#+4+U*@'#n D /P@/L&qN|cCT J C c eE މݑݡ)ZJ  o-'P_3m@ A > 0 E ?s<8Br&<.{'l0hN2guBlbm~V*S<(t +j2%%^OHUS0d"IOG%lyZG~v !b1N.Ryz >!z޷݇ۻm-ނgi9M 2);iCo݈L|ۢ3ڧ4KQ':7!ӈ<ԓQ0۱۰܇unWTA<3?Tn '(" A H g a n c e Q J 8 $  ]nyoGb?{aF)uZC+uhKBz- 3*zbB7w<@5|OV#0)_P7 }~: "*$ &()4++W,c,+6+)k(,&##"!!< x!K{=o1wE! J |]@,Sl4:+.Jn5$ݠ45\J҉cwnpnkphliiiefgcbeac`^__\]\[YZXWWVUSTRSOQPNOJT8Ҏ҃Ha>JECEDB>H3a /,~ـeG*e?)Po}w\Atp"68*a(PN'R+yoaSV^=Fz8tN|OS"NV;79AAEFILLROYI֨7ٟ܆^)O%P]aY?)[$<!A%Y(2)Y)9)J)>)A)?)9);)3)6)3)1).),)+)')')!)#))))))))) ) )))))(((((((((2'b$!m}gnd{xcfti4_6^:Ht2VX!"9$$&q(V(i(S(b(P(](K(Y(G(&$""" 0]n,Q3r >F e , T {  > sUSU>?VrQ`K3{#{z~2_~|KXf6 (  In]&^;>SdbC 5 -  r >l-N sb;!/4xC +y:UsSc.r:v3jRP~1WC>X +Sa|,o* A HA4f6rQ"F =j:rv ,G< r )  N >  x  $V ulAH;eKu FE6 cJy<@  qaaKuElZC1p^O>:^"VwV& ARY-y u!v$]:tzX4ThEY? ysyg7N$ T C f9J;dyTn72fRSbSgWi`helioprxjܴ܆Y4}P%x5Th Af| 0[<'zF+F7 ] }c6Er [`')}6T'p W y  > ] & o=0zb  0,1[ """""""""""""""""""""""{"}"w"z"r"w"F"F!, .  0"j":"f";"X"@"M"A"C"B"?"?"<"8"7"6"4"3"1"/"-")")"%"%"$" """"""! h,O  < k yV~M|Huwx k BfjI,tgSn  < h  ? . t{4l1G+x ho;4zP6L\mJ G! 6!!%! !! !!! ! !!!!! ! / Q 0cQkN)fgjP >  \ E j>G !}i|6u:LD?9ac!foMkMHQfy~ pqiD7!aM C     !>tJR(q13ucTjuuwefn9-qM0~K_ ~J|/x  |5oq6b]D   V  ugXu Z+.H`3"X':L8{8.a' ?Q    Tp  T U S z-r\F"|x~`VSC{E5i1[7^3Rr%@\t Q]sW(<'d{ F[h~$ OU C6",)')&*%)&%&'&"&"$!$#"!         c,jB= h 4 @bf%M=Z5~&IXZN7}[l0W*5l1Q @ ZX E B  8 L u :W`yV)L-H nenW_t8=*3`j U  F @ K lqDZ v D S 7  g X T _ e : US y=:oQ];,uY  r H : Cb53Y^&d:`?!uRUj  /J3-z`& o Ds } L  p7&Rh Z B 5 `JB\@HL+j&d   Z {-{xMSgO F@!8%1++.+,*,((,&*'8v (!0= L N M Z J*+.0`c! 0 ~K.w61e~&63hH[U X e vZ=;LDOX.ghF12?mPf9SS p[:#Dvl[ZBN.GF PK W* Z U ,  gC[I1 [{3,OjD? J yR" $ D t ; m3h c v7N7.M_s1 ^ V 0 u j  b QPOP'L,87`=O,Mo$k&kL-E{M=[ 1BPu`EpEm-RClj.mC&M$$n @4@yV8\"|-(z&\[imkTW:PXl<+ R B a  i=a(s9QT*[6 i.w6@o 7to Yb\SjOD*} FFW=&=8 *jE-F\e%0Z!fzc\ $WJbl{vx~~] }%xt'A o>P]RfrH?Ngx' d1YQu#|vtY:d*inwmd ^ } q + C 4 V .Empk3v 8  g 5 Q EZHG-TZP 3KT.f\[My'?` eIC0{]o Gs o[Tb_s> TCC{v~vrymulpkjjiedcb^_\Z\WWTSROQKKKHFGCA@C?`kh%uO*14TGm_Y B - B2[Z {13n {GAI 8m,s  - ^/d 4@Ib0.%D[j p _3Fj(iI*n'YE 9Z h<+XOvg6,#Ed : 6 ZmE{Q8K;!tW>cNowX 2lh Kn?y_t1gV1_) aYJzDEl{_ Ks#UYw9tbVF7SK  6^)E%@'9(0*,*('&$#    V = Fd&Z?d?* Pl'j :+}(.s6lJy7U4f"6"C.JGx,}.v~ +K yu7#1&*'%%}VXN l ) | sskHQH !hl=H~i1 (zGoc[~ gj\c|$bvt.M9f]k.& 0,!*',),-0/2/55488:::?=?B@DCFFIGLIMONOPSTWVVYX\[^]_acaefhihklmomrmu2`1i ! -O)0E/Vou & s :_=Z 90<.50.2)3$3<`2/ }  Nye7    mW ZQ-qGS+#&-%/c}WP_v h4Z .~A4/Le + U vD5z&xiW%cg .:n?D'ufv#YHr:]9Oa HU2B\])M+00>\ } - l g d \ ? -l3fED]nleyoydD+U|9jt MS-{3Avxdiu^t=KmXQ)  H.#U`p _(]Sx1a  % g q <'-D{X3U_-QLh'fKdtb+8n *[jhOd7Up gA= vt1W|Y41Pap]j@< IOMY#"%#%%'()(,+.-0-114346586;8;<>>?@B@DBGFGIFJJML[x!w7JX#Q* ;9(i?$$wW3XZ@ B  = ^e 3u | t q  $ A>XCzz}m]2MBp 6xL+`aV-CnE H  7  @ 3 ; ` p M  = b  * 7 a > Q * s-\)rS]$OJ|]>W? Vq/N>Gn,c!h iv?,;-Y~I k5lRdd * Aw/ R C??@=>=::=7876573611111-,,+-*((($'"%#$!    t R . c~2hI4+)_ :`GRlhIn$[4fr.Y@zM/+9  V g 7 j /  o48<O?yom5hZ{Ejk~D8hry=# !IqC.R0*#B^/;#-aD 3P]*y[[dv< l~"nNz3o!e` 6 {  N  p | M )  aTR8 h g x P .  ? i ; g,[ti[n\3 "F""]*utrvqyoxususttruvstvttvr{cqq;^sro>;G+tPouwl0pi*(8bW2N8~  < Q l h  K 70/T1K5=Ba i$'cx-T.PB}j`z=#km=n yQk Yj 8 ! c %   ) |  GD^04L?#QcCZ@n?/Lw?4#0mvurwtvquup*%~H]XA]=jEg@:DDi Z )  evJ|VGkytuvtvqwstvstvttsttuttsutturuttustusvstvstuvttuttvszn^*3Ui>L3 { l & ' 325henzsxuvyp\X= H _ql|qxqytvsvvsvttustvrusvvsttrutsusvusustuttvqvtsususvusvstsvstttuustututvttusvttuuuswrtuttsuustvruvutrwsutttsuvttstwruvsvtrvsvsuuutvvuusnw&>VB=31Jiy m | zLQW  u 4 a  /O"I.trzqwryrxuuvtwp~dU+\ y } e = @r{3]p\}rtxsyrwtutttuuuuuswrzp4wD . " [ q c JbGh|pytuuuwvrvsvsttvtsuutruvtsvtuttsutvtsvstttuttvtuusuuuuturxtvvo|l]R8SS b ESY]      }S#H>lXquvswsvsvututvsutttuttutsutusvurvtsvturwtvvrxo[kd~uMi } 5 Ui). BFii4]IP{WcuV [Ic~nxtvvtutxtsvtuttvrtvstsuvstuvstswtstsuttsvttrxrtttvstutvsvtsutustutssvusttvuusttvtsuuturtusuttttuturtuusutturtxsssvuusvrsuuutstvsutttutussutsuvstuurvtttusututrvstvsvssutvsusuvsvuuwp}jY 2$ v J ~)nnxvsvtwtvttvutqwstwqwruswstvvsustuturvu|hzstsvusvsttttuuurvstuttvuqvuttsvvsutttrypxk,qLC m>|qrxrvqwstuuutstvstvttttvustvtusvussuvtutstwsrmj4n- ]Vh;JV=  H[iqU6fH v2L' M/I)L]qvswtvvszh, 7 Kkm4[_1]`le{oxrwsvsuututvsuswtuvq|j]kCD @ !  JE>| X91 ~e.$/Kwm~n|ryrxutwtxip3rw VHF?cl{rwtvuwsvutwtvtrW { ~ v  =NNc`*Op! < 8Pg}qyruwswuususvsvwsvuuvr|n} \`-   f {  l ,j~Sk}qvvtwswrwutsvutsuttuvsvstttvurvruutttsusstvurtvrvsusutususuuurutvstvrvswswtr|e;UYiUF o"3fuS\ 7 .<Y0 Q s r u n r k j f g d b ` _ Z [ X T U Q O N I L C I > E < > > v  f8!Ok% Mar=;Y  } x x x u t m p l j i d i a ` b [^   ^ "%%&**+0.0647:;=?ACEEHJJMNQQVUW[Z\__ccdiimjnrrpyv{z}|b; g# U N = ? ? < ; 7 8 6 5 2 0 . , 0 ( ' ' & # "                 rd'e7lwRWY[\^^`cfehhikmootsswy{{| ! *( /t'hC@a!yj8}~xyyxtrurmomijggee`aa_\][WWXQUQSMPLLIJHECBBB>=<;:885431/-.+*))&%#!"   G Y_G3GlR.*![C9;><=?CCCEFHGILNLQMTQVSXYW[]\_^aedeghdqa>R]pRoy~zxyvvtuprpmmmjjhffecab`]^[]XYWUUURQPNLLKIIGGDDD@@?==:;98673301-/.,(*(&(#%" N4Ay9Q+,BM?'`X8:t9#]M5_6*?|V9ZLSTPVVYVZ[[Z]_`_dbedhgghjknlpqorstwvxzy{{{~} ;8'-OycIywX;NYee:fjjjoknrmrsY}|}{{xzvwvttrunsmrkmm7RzAmH Je;&rmsqWFIIEJBGCDBAC=?@<=::<6968462302/1,0,,+>)y1/; Ur !x)okpnsprsrsutwvvw{zx|{||~~1cG !lTV?o&F!I~3 199bRrl<o",,***')(($%%$$$! !!  ]#Vl   /NBY~~%e"d $Vn*b`X6*$+>`Vdq5xg/;u*ikkmkmnoooqqqqst*{sn5${}|~|zao? :@duopoonmnmlkkjijifigfffdcceabbaa___^\]]\Z[\YXZVXXVVSUUTQRSRROQNMONNLJKKKHGJGHGEGDFCEABCAB>B<@>=@=;<9;:8:8877482724318 %-,+*)*)'('(%&#Zz5[A\.AF %  ! +FfyrbY&$&#*'%(')()*+,-,*.--/-11/1042413717564BAZ?V'M)[)B_@F;VUVUTXVVYWZY[[Y\Z][^\\`]`^``ba_bdcdaddefgeggfigiiljm;=@<@>?>A@@AJ~bS#Gmopv~{yW1JauMHKKIILLLLKMNMMNNOONNNRNOSQPRQRRSSSRRRUSWSXVVVVSYYWVZVZUZYl90Nklcjsa<*p?e^b_cdaacccbfccdeefdfhgheiggifjjiw\(9oN{ N{w}{x{|y{{|~||}~{}}}}~E"Qo$+3NnxvwwxttuvtuuurrurssqsquorqsnsonrnoQ=6&&9GKR__hbdodbzflag-2.4.2+ds1/data/jumpjets.png000066400000000000000000000363131200563112200167250ustar00rootroot00000000000000PNG  IHDR>a IDATxًۂ5gcշ~gJwNB 1AAPxѹBAMцDMFB2h4tLځNOgWw|itۮ?PYOQ@% oK뾩.]ވ/ | 3k^^!јnӷq'2 3 z /R5"\yt8KsF./$gK*S֪ ikt:P_K#Jr]sznvXO p[bG]7S7FzL3qטDhE)vtSLs;d {Ai Urf%z_a4+(/))0R[jiYߕP8zᒤBy8}UOF_wC,_ݏX\; ֢\q04Ơ5KK)Ϋ%܎4*k 01_ap,9UY i%( I~3vj{ZLDQhTH~֞H?,-QO % Jvqوi8RǷ/B t3R" mFɛÙ:o,B'r8@sd8z򻐜/(lɠ5iXX$M@woho3oG5< ϭ4ƙ>5inF#0/dZ  }͸I*#i.ث_&tw|Q歷^gjtk"%O{'dVc[r'.n Ϭw7rƃlx&<ȗPOSf@,jjU벛؃Xͧ)J Ytdxq'g>>{`&ٻ"@Zv{ \-!k\g ;XV5˾|>ah3H>qNxw㌿{)z5Cg~k%]D-\PFvYr[HhE5lFDO3nG|0ӧt. \9ITs΃nMBϝ<u8U>w;WODޫlv!׬yOk+/K^\ 3sqo L ٓ:]7>s'bR)TG}Y8{ʒLLj.D `S7Idyz~h@pƚ؎5mï)OH1u$3 Ik{tIO&u5"*XZ{+^(JlK"gezOSxjb!gGU9Dq@CI: 74}*–[ EF?z8 9P˾llyB  >+'!ʽZ; ɤx:zvt"J.*JiTtto+F?N ͒ovBV7!B/W}\;VX3zs:9<s3*UWn boﺸfK1~|5u zȍn`_cǖ`Pd"34 P플Aq69~Fe*zz.#gd~KO1OXkiSrY˰>xig}'Y 9% 7e9nF}5s}c Mt,.ēJYfB(갏=RN87 8F+<G:v%con(O>̇ ty=T> [@qѴJ+ /N7i2}n>%pFfx-c,jScCOaL~9߿A!㷆}g*S¨ DCvQOU9Lt5Rf=1[q&ܦR{~u E³xH Ȟ)EszZA'V*iaw5hdV>1so}ȂW_ODSFk=Ѵ?ؐ N48N-} 7Ȟr{NAY lZ@]p6+٠#OHk"xoxC e!vN~m`4PNg v[:;E贩'Upq깹-N|!m|Q7jj5ي*ۍSCDh=u(/ƽ{~5К)1Ɛhv"lNٻ0Hfq U:<:.&"q|-\5ʫL2L Fy.۷i?+% %0_R?3R9U,i0=q(S^@)|8yo#9:xwKͿ1g'P%՘a(ID5}L7l9\f^׍ WVfxZC>R}օzlu| 3' %l=NٳC* z3EX%V> 2(g4y0qV|ChYbT9EPĴgi4u&PԼ}ۣx }N[_D&YBXn2ȎZ&$ !\ H/iR2EK}Lz[y0dǰYB1XZ}ׁUa3 S: \)gq;~gWkuM:h~DQgS*QP>GkDXYleJBcqm#lczϽj`?"}/PwGꌗ!ntد-'5RWl]߃ĝ?J<W^{>EA$f 8:BLXktb&K%#]xC}I'>Y汻xE~Bq4ai4(lw\osO]WzFke08s$0ƇD?Lġ#tE a[^J0F-.̭Ԝeh(|ѯ Lth.)1~o»g[ Ao+2b(=wzIhv-gk4p0XH#!$+}̙ǒ98Rg! }8^^4ˣ#,|9g|MYT{cL0:jlgWӜvҌ ! жg?Ŀ~>/~fU˴i/+r[?M9_ryf2mLC>Eos s ds{!LSt^p&}Ɵ3"{fO )\7aB:⚰xuW'vI%g4 e?MZQ&2_Y<>~_k i2:hPUҶ>N)}"HM`'owOGd Д hP|4>\t`̧2 o 9Itʠcα_Ouƿ%I8hq, { $AzE-f& 5ރ]G-?3s? #szO_P[ 0@yi1aݩDs\^i9mDQ'M)3vyASr?D~OK>!Zq?ّ7)PP?E`2u 9GVCG~=߾y ^_W]J/n׭M.^THGF6R爎7%Iz>v.'~IVK9PiA)хaPC`֍sPhƗڨt15ZK:?xg!Ȣo'OFDJ|<>q>ݜF"]j!///Wد!WkPIDAT2D,U1I||mjyEz^GF:[ =XSs5F\x~"|>!a ؜m~8ilBE#c/s 6hlXIW)#Ѿ^Sc,,kǓ6r܋t$rso*:j-(^= n/|>;FקdƎ#gwQ>L76eHOCꔲ> m_ ޷Ȓ𬦞QIYbyTKl3pMPݱ "zfWsb*:t]X< ^b__^=q̆g%73y5tm*Ek}(6qP im,oG"O/57L.59|6$ 7 џIX覤ޱzal$: e1]΃#|#7?x9W!e;зYn.o;}povG=gqi"mBIcp||<ʼnG'c|2k zg3c#̲cCl !Kׯ,/2 չ0Z3lO=' ȯ_XVDiZ󢷣K+_et\ESݓl6`(O]zA__Mosn Ib^Ooɚ&fx-rtUEaŚ5&$jj"0**iO71Þe0 VDO?Wٖk(9 Qp6,8h C{$j}t{[ۿ?_,#g kDޱsO\ IFq pb NV+TylGZK{%&C L'ZGD+/t4}ceL8ZV99 '&=y՟^`8~U@_փ? X jÞO*&V@.:p8 Ceݤl!Tvj\#Y)Ƕ5̡ͬ~٥A.C/ P,P{!eAaŜDe_ws>YaH i﷏&ο8;wK(("i}&#3#إΟY~ ͷ:30,m'Js7M0b7صc.^σkDSo_|L-7SYأYn5?s~㲘݉JՈŰ4|WE&@'b-E;Z[3cWB;nYTGwݙ;8/+.^!c8bMwZ;ZrM,t^t_uLb ʧ|zٳz3RN)gM36 #MG1ͽ{G}[8 ;ܲSwp.E:-RޢQ1ٙlyŽz #lRV|ϣ]+iVa@.kL));u ;I.ɜf}Otl<8&DvȮF/hCj5Μdi~ 4ն!LV圯#˾taC`nܵuޙtlX.,$RZif*Q!Hk=R¡7ex+"{Fk4Οڿ|zP<*@ g0(Eȟ0\˼jrfskݽktvzlڼ%fLh=eI ?2+/Aj1=`0i&"82Nz 8y2}*Џ [JH;([<E"z }~oaIkLqK,YzLuo7z]G,  |fA՛A$#$c!,}TqNS܁7[/z (CW |Ϟ0ըx1EjRGV&୓}Np/&3WM*+2p.fV0|&Qdj[qIA9zg&jX&_|1랃˖u]6 XX1,;.~^|>VU%-~}0zzzt/kɝ\@2);ҴܮIG@`U7_~ *y+]-uYt!|st aW{?^es-#}O+fo9UK?4Cיgoo~m͙k7C1 L"MFxEze)S1TV')UG1҃_D20;Yz(i8)8]1,ngJ |MEq?L ul6!@}.nSPOg= п<(7NEWG&=۪۸WuUf)v!hR٧7.z6N,-M. =k U-/py6 } S* aK*y&*k9dBaδX]1VqE]:1T6К`r XOEF&Քu'Р>SWvF]~䥕>r)1蹘g?]dumg? c~WvűYF^©\Q`מFA\^Ť7!!7s{lVH`j8,8 (evuv:qCMF}vp(zY.K<R@7-tg$7,f0=#o|vcvdGĜ9\wm7$+ / +[j}ܷcω8רΌU"5sZRWVAZɱ6@i$HM(afldx.|]N*i^tCYx0?kW`O풕>D٨nvL=jV7Nݩ<&c=v60nĢr71 ʱOJFjf2k icڍˬo>GB˼Wu=Wf\J|a S]:kD$VO z~);bMF#1͊В*O9*W-w& ?QrDl>G$9^#xxJ|AI˖HMr!דl:f2/u=zR-YچhNKcj:!⣡tY12[PJmWnGJݮm arFqTBԴ {ǗDYo}(wJ:OT F0%(/ӫ9۬wM5 nic:(aIfXi-Ξ3-@֓NF{ocjyqæA/ArzD_v~$yn]C_U7Nky- ¸CnqUݹ>4jKCu2[׼nK ]mmƌlEsGsHgR `'F4_ ̀Ю RϚx`Gi+N*ؐbH YLu0*7#+W>}#5[4_ۊpymٻ]ͬsТтU0JAc*ܴNQrA2EWM/iN2,픭fd}.IPNV׀ [=kV6T.fna~;ìqY"ꞩ00Hﴩ2oGeGz5RƦY73-DjZV݋y䄶x)cK4c.bJޟa#V%Wo"hi >z)hȥHpcJ#䈫kw}?͸h5о=k. qm7><*?RVhV(b6=`mU$s)]l7Y{Q"C \:E[>9d ܧVl@Lk}kll& ӵ  ܈7ǣqUrjL\hAU6hf&#|Iq_ s@`5䇝8_hj$ ځ껧}ٷ$՚vP sU@:z3Je^KZ%*mA3s|HL_ZKuߴ0q첝 [԰BA$b`&Yf[P ldiZ{=3_ghDͩ/gذq.B ťeX&S3#ivjaKm'{qwU.d+SO\k =>?^1U"g1A;S8.|)2PP f9F3:ZdT?4B_ukQy zhsKz^z^?1\~sIENDB`bzflag-2.4.2+ds1/data/killteam.wav000066400000000000000000003136341200563112200167030ustar00rootroot00000000000000RIFFWAVEfmt "VDdatapdF3B#?J<  +!s;f/8-7p >\bO2j  38()$CfTC(#%9wOkM4Z+sDnYP~ ' JhWZ$uA^z]6  x LjS^(tHuU/$% >%7s%\F!:{$t)I aP4F{-z%>wMf"X/RI!&Veneb62uIyhaN,w*#!@h4j);65<"nAk'?@C4 g=LwzzjL+tLOb>}NR% 5 7""163''17:0 !KU-P{>* 5/"/b"qBe>;7D[D ",,TSt='#( '=;_;:GP:( &&39H$cSG("A%8tKmA'z# ?_^]<J.0uLxl^\8V5x6 +,Vp\k.*#7n9e+GsPkR/X>!u/bA!&-"/LL=$^zK z&&!3 8LPPB*'{1rxyy@Em9}9k=s5pRF<%pEi"K(d?u&)$7E* ! <[/LtQh!\0KO )O~* &I|/).#xWRrH`<>&y9.p8xy#U]!>0tOs93x*3A~L# %7wKh!M)c?s'-(*}(A|!"0j-k/$ 3"OgP)"/9p`sxiP(5@"CDWJ33;[?.-+hd|f, 0Bfsq~GjDn YY\p*&s/e2"! #(s,aA%->5 'x'CmMu:-{* -"./ <}ZK.r]g.. ='![HnO:,uu ? *(=. /a@ Xex!+(so i |&Lif +; S e`8Ui;Fi%k$\3/vhiVe\=(z(O m RXCP-$6 D \| ULF)XQ8w%R,iYNl:_  ebsl9  FVZR5.3VAq V,x"]SP]  ?  "SOE:iFBf>3c (r;N 3 IfBL%P?bBm,BK@(8'%R"{V"Y^frYP2Y=vlgZ[QyQ I[b6-'!$X!&eX}Vr!(mxFB0EAkb#-YC\O]vRg;W4M6zMT(YhByXO)i\bK~4IJa349{#K04aS`93G)ZC"O%zi]pMp\ ]Z[87jeuT<zVka./= P H/`-%TSBZM2  /NGGC: : J 0 sW)@XMCehtX ] VuLTQ`-mw G1 OCq@ZAhr,WXb|:% T  > +cylUnGaB.*@F !{ %EF 2\+5=jA  `_e?Sm,%uCf* > E|w=Kfn\(&[Ex*=e M_d5}Bs~ u_mEd s7FtI>E.|[sdv} 5'28u$s'_n#?'8=@D#M 0Xq  A;dvn$t4t(aa1 g89p bU*#$ {%bjV;"peXHnLE[eMy`X/-},Wj" A\y5aIv"[lg&Kl'y=2Ak$cm}~5.u,zH_u'W>F+x>i](}B.1tTrWXkw{Jzax#rLZtD)}p28O/;R&p6x2/^wiwdA6Uma$ic9^xzKMp1\mdOa5V0) t#}L3| cA'>6'E/*mG5emS=o#*?sduD9Lt.A9  Jeb9`IxgLkEoE@N))ThnGUgi:{Q9yi}C|Y'J-. 8qa_<2ruL ^rV+p hsJU  K ] m4K9s + ?"-Y:W]T["q]CZl%Vh8D /VGhg<['snFAwD<eg&}#tt|:JOzyNl]|Rl`;n-W^-{rfdD 7y%e?&Naj e%BOPX0Le3)*"[McYcgpxC ,'ln3o+!\6( 4;wD\ hXsH? ? Q  U)gNL0&b^PdG"4VnF_# Wf2ao\V C`+ q%9rN%E, zj(M<[ Z H ]w] Dq3lL,ldHiOmPJT<AN*(/c6)P (U+}uE)0ahJQ+DU)8GMsXg( a4AQJ^^Pjh)L2b*0R)Hrv+`(!/qvON !-tEg|ZZrCmpt;}_gS!Y 6=C:9V7f*Z\uX9.Db.-oHx*NB%gEu4O.+,=/o H2r$5xeAD/;Q!.}S)GpRxCF~ yb/YlMe&WPcY6}).i jS\mJr-6ZgWPP)5Y9 MVpC50y$UsZ aJzE$W=Y*? -<.Z8f-VA9pYtN=M7vH-S/),\Wk'*z -4!|XmJ ~# O.8 O@XF `x$ ga{s8D(\.U9{d)j=+_I X WH&w#"}J:~5-$S,p |O~ y  t T v% %4^q?XWtLO! M  Z<8\c+0X -YRNqjpx gs ]U' x&n0-0w5*almTU= &]pc 8/\ ycS $, 9s7CG"Y:N2i v}:X W- [(Q*X@k  N BSY^-= nq D4"`T^+:Z@ ~c N~)'A)`7S}TG1Eu Ya )|=k |Ei]'  WC cWBh <hv_Aa:~dM 2,BXgP  @7Uzl  hl:  ]tO ' ~ 6. Z:: TPm-OaEdi2Z 8hMS3^5T |NGEuA {>&~w{ n{ ;- 7 Tpa 0N MN >h?T p{{"|} MC U#\T uBnkNnEt f  W"F%;3q04p$/TH\HP'Iz dW 0!gRv3+ ; c L  f9B$,  \Sn@uq.  x4,-f`h_p / "6>k6 koGT 6?!#!T?eqIA  sH% XSWJ|u x 9 ' 7z/ !4 , @-sd ]  ~ 6? h=#3  K;>Gf m{ MOdzAUj>LR]tN  Xx )|t btE#[Z G7F7, QqwFhU g&l H DWLB7h.  C+y #n`Tvi 3 qrpF^/ O::>x^C jF - `x  nE}*: IQ Fn=N>W ?Quf+p +;4Y 8 cB?|5Q[ & {k$hG~{#F?- [7-I}SU6 1L4$[i~5x 7< ~ 4rv&xM.=Jg ~(m S*qeN] , < M`N> :\$ +7NB^Z _d/y ~0)krqDs TJc$^w )>/91-UV>w ? =FGB=Jx2f8+X ~k U sZ?iq3 u @c] r!{j <F " ,/ - U9FzLhLZJ K :S99 /$ +\ JDw U >e uC{x E BTM< g ;e;qre2  63B9g{oJ ezS8zg ,H av H?Pi < b -=@;;Wkr[#M i k5Ib eU 0w"1QQ 08 {$ZaX+KU6K28J>11nV'g w> -;e{$!I;< m?H V X  vH vR`7-3-0=b]NqEJx!Y O+M~Bi_L5aqH c{=S7 GG]s  Lo1 u  %;( ;w]-*|- KCd- @+z l&tu +P*a@ OM ?, -j 3U6+>A3  h%HxE K 5eGN= w% D bs *JfKT' s}KAVU9 u[czUrVA`2 !  4~~0%V]kN < Jc5 yQa!T* 50c'QMB `stTol~>5P %]3 F\`q' vN okJ/" re&2fTf9| e -lRtaS+^^c}\_ aY _ zcg;h=H3&:1 8c{#e'W]# X YmE  ,1- U_   b f0M :Gb',tG8 c W=Cf_rwsw;ZeTH~A 7 (vO<& Qbv_y;3a&^s B @pJpAJ[^25hvJo4Id)wN; F^pB_K >h]!C6^ Fkv fb5zok` ~ ;<T2 Tt"  K[pGJ-/ cy3 % ~ })`v 5 :CvW2 + yA54Y 14/\al}"9SD r eb7ZzlrBV :EA+,A  K_3 d1}Q t KFD};+* W4&\4,ee`1soc :r&"~W!Nyp` bw }e ] HxoeF 4ro/{Q (V9k07nuNQnM=>@VL,vn  A^ vb|E ** [9P!cj ~^ wf@]4Y, w=m-(QJ-]tJho({C8WOp@FbW5@bB='7Gpf ;|85Yqv k v# [!}l 9CPNK0m!E y"f{ MB`H'# n5$D(@ fLZ^yM]7\4O ~6O?%t l QlL0~P S1vf] IYuZ}Ooh_FN`e5){r U w![ . 8 /pe:eq  !H?"^E  {jnvS(OKv4m3d@uS W&yas1R]Pj,|6Oct{GPE x4e  .ZT9DMy+l+$EP 3W^Cg - D.i=* Jl/|NneH1wZa#dYoz\=aD:rVQZO JY^uA>pS:p@'Mt|EQG)oT%]WqLdhMp1Ok0XD<iGK a<wgSOsD0KJJy[ft(h4LdI4s@SphC.)z t9xiT>K Nxx4y9 i XSc2=1Cg=GD2RF S %{m'-=YN6a]Xnx 5=Y vQp4k:6\ r$n9=Kf qntf4]P7f7V+V=c *E[o[)XCe UMk$=oTl,z\o8U`Z9W^d SFqms]W:hAHNP$npg:! BSFiV{Im*<bC|geBg=S 7P2jh = JoR^m q{xv MxS2?L85bPJm?8ihnW%'|~4=WZ 2t#yKrOzGO3g \)IRaatW V3z;ww@IC9$F\DG!VYBQR6 5l=-GGCC<McRR6>8"K2#|EQB7`&!Gt*Up{e:@h=cCxhwLR1[T :dJ#@#=E/.n(9ZRq0(&] yjpu[& @Vbu*GG/Di4ZQ.t|^E} ~4FKCn@ #1{[CnW% $hj!S Lwb7m [{ &x*9O;n',"`VEx9<0%w+ KB@P'c.1V8EfXm @eGpTgY:*/( !WoqM_}Z} ^JS,D*KkdP$W0#VSThEkL+%>q P%UG#a+ 4DZK\%D a[kR< sE Kf^kx .Qg6;BT:?N",_I|5SlhvM~L]10cTy`V/]2Z}/WpLEAuOJj>Ai ]0Y1=9B]=F3eG7~&i4#O0iM3EiYbVu'sln M_V:0qEPySLON ]Pi ?8Zh0;'x|ZCIkScfM> +0o  KU>r`K!(dqX=8;-Js#GbUD`7 -LDb/TfxO@.p0T9UG&^1 JnsS#OS l@S(0<ei.QHU so*ixD|@[#M!dTRH2DJzGRXnM; iE7.5D0vh_Dge=O%\Os"_d0,WJ[]{3_(=@rhSGENg{61}[H -y/ ap(-X.JDto;iEDi*mDOioccnWZrRS0{VPK}:L>WvXes'E}{li6JL W`k)_>jP" mN&'9d_="[Y#<tvtsfp@] ?]3]e`b\$5Nc^2Bn#{sOo:?!U }+j]ZhboroO"901PSFA:lPs) f5xx1T.})TUG-} 5-%c-.eGSf^Y{7m*+u@uWq A]wvj-JM>czU+` ^Zyfua9q'70\9><4F]I:*Sb,anT 6$*C{>Kwvxq57irl +cWnaRLV[k|y.9'T\L+D0+^O}=7">>oRQ2x G7au852  :jDmC s$* 9 ^ A <J^wTYW?F1YNG.  \7u U +f8u9m=:  ;16:y  )BAEAl!%o 3 i  b C C N  % <H@HPZun] z Rf@+:C( 9AU k4} b_B UQ%6yt&  v  9{Pd? jH a DL&XXg HjmL w9QY ?viz N [\cؤGQA  s %)+,*\%#3Z)_% yuptO o #')**'!h27|}?< oY 1 sbu8ߐBC< Z9T *:}7\h, \ `bS /MD IU nZ IuQ֑Z X~ԩ$  %Q(*t,C-,*d%[=ٗߑX iI 9'%#, 38<*>c=b:4+?K߿ԩ$&O Ls8S b.zFK;$!R~1?W YfG g{psRp .9#'*,-W*$ z}lkE,t "+ G8%CnʭgZH9 ?{#*|02a1N/..+ gI*|\*";dR(2g;*BMFE?!7.(a# DuelǐɭѲ^ jE: " { w r^Ozm$Y& bp"`"GCnkt@Ͷ<ߙ!o&0S9<;770&$m=tz J I:^sMԹ8]ȸl ^,$+/23Z1-(#Z=Վϼʽ/]ăqa4M;0 +y5+?FIG`B:2Y*4! ]ۖʆ˕ϙ٢M & +&-.#120(4Qn-ǔ)V Y'E/34*3|1/,C%Y nK[٩(H@ 95!$&''$%#?!`e iYW_SkK "AiQ@kA#ޭ- Q A)I/63440,w)#&j #lu'ŮSɂ͏Wܘ%/7c>DeJMMH>0/s'$^ 5`&ׅGzcrZ^&,31465g18+$[SkSukA¥ R V X%.9 BHM[QQTN F:.n$[oz%ɕ\%I|$)-0K1Q-#BiF\ ޽> *E02519;:?61/&zdΥ='2CĚ͂l*Y*A9DIH)BQ;4.(}#icE{׍lzv '.0*O\٫aё|| f x$')-F4p994,o"!Ԩ82ĕη˻Kƚ>ea'4H>}FNUwYXIRJ B7*!ӃS bųԌj P #F%D'*.-%z6[D SŹ޿Kӽ7 +T&,158k972.+!&$d81㹀 A&129>"FsNUYZZlVM?E- 6ڡŻƫӒ_ w.r:kBGIJJ#HA<5U# I4_Ľ$ ýc)5$/c7;<:c72,# Lc r񼞾kSv3!K-6>FLR{UUYR"JG=,R Kߵ̀Ł[Í Y#'((_)+.-O'Q }C4ǞœҾ{Fk6Egs)".)8+=\><95/+& GHl$ н+"ڍ<|&2:5B /: Fz+'2+;?~?>?BB~C>+1œIN0㵫[_ASi%,%0(/+$fGDY[ԛe߼C'ſۮjw%>2v:;?}BEIL*N"LFp;, COݺӘ/ÄHf ɚ׌u&,15(78::5 )<$+б( \Ë:_:m+_c('/3649985.) % ~R9ȷħ6V-K$lݙ)e3ОM kQ6#&)( >+Hi_[Ի7ŭQ.!r/)86BFFFDAt=D7."{Iw‹$g0Aفl *6IB)NYac^QB0{, YO!ҺkxlĐ~u )s4=BED@6:1%\jf#]ǽ߹zٵw=Ʌܳ  ^%*,\)# c s""=8qSzǶ>W&I)B-4>kFJIB07 *pcl O߸܋ں0յ@ _%<(#;W#),?-o) yI2ִʛB¥)͂`&-D/04:l?>8>- -1 FҠ8fƯZ&U.m/-.3(;@A=4)4Wt~ӘϞ3$ل!`r%+m,-,-00,% mܶ XqֹT; @x%P/=1i,a%!#W()*t% <Nf5ٝDBL +EQ)G6>1@E;z2(B c:7ފֳҏ oO tQ:&.v340/' "Lmowrg͂˻=x/2A>#$$g%'*Z.X11z, ,a@v{ ~?(.-& i#j'c(%/ D B`3_X * ۀ.ڢ˩{ʻێR%0I"B(Q+-P16:;:3x'g# 3֚Tb-7:84$1/.* yJI=.ۜ_fR`` $&@%d"XO..)<ڙcˉ;Ç \s! v%),07=0BO@6' ` p gm% 3AMMR?OE9)-% t !u0Ԩێa!zt"! $((%# 1R l j!oKyi #  97}“ (lob N.>JSRUUR[N$IA6%f\}La<ٶFLd '!u%'&A"Gh  mOuPgLLa%*+)R&"k蘕ӊdjN?::611#*g71?yAaABFKIIFhB>:85-$ns] tRxG~xNd7*>MWZUME<4'A~I8<<2$fT $ m  { B4 v!Z@H+  %p ^5$2?BJPQM[Fx>62."dK\ڧ/>ʵiHN-a" -R3A7v:v<:3&?6׮r[<~(ζ N;k)|) v$K15;AEGbFB:-|~š0 j| . 9>r@9=5( v G z  +p4:<%9/V ڥJԪ<\J50]* "3*(/25_64.W#+جߜ%A6BE>2)%pAbRq a#+2*9?CAA5!F6ٺȺº鿣!ݣ;:Oβݴyn,x4d:o?DIiMNJB3v$ӱ(@ F u!">r?I X k  b b'08y?:CA8 )׼Z§˩$eݿmڮsֱ2ѽ*x%3?ISNNLJIC9*+ڋEIĸۥ&- /./(/,&4> $  ).2698&0*[n,lPۧA߮Q*fN$- )8DeLTONLHJFw@4"* ;fg}̳aͯF4%E./+'$ % E&3]>y92,'" CTx%s4c>BwBAB@FHB0-P-ǚDPI˭c՚{?|+;EHF)AN;3&C9YwȾĻk { r=wV ? !/=HOR5R\MD&7'xSx%x> Ѯ!ch# n+#z3{AKRVYXRtE,0CBϴstXHiK((@3}_+r W$/ 9@EKHRmVUM?*kOٴ빼&5)FYdž-Mx.>L VR]acb]UJ!9"!ƱўkCqxvM u {$ _F +2l2E+[# %p+\.+$U ;UܣԍЄhύ̒4%֪۪1x}޽5-C .)1o9>z?:0!0 3_s3̈́N9l:͍=D* *;7J@ FIIHVF%DAMY4ϸiaP 9<ʹޕg$$,3V78862T) MάȼǠܢ@*.)!Z'M [Q9E /T*#.8@EIcJiHgA4< gԘҾkdf9]]rÿ}q ;!&')^,{0-59=ANB@A8 *VģrNJU#%Q0]2X-%XAP : ^ O."&/7i=AB82+&_"Iv  ! J  7$!d-6c=RBEE?Q3& {གǫ/ěAdKâ||  X "F)5/4Z8c7e/ ܌=\g#,./+%!4IK q"j  '63B[JOQOEI6!i֣踗ܶH-xǻQ#w(<@9/EicBPƹiǦlܼ$FJICA0 <]Ugޘ&,) I~7A `'7lENRQbI;a)[aW!/X`Î䭞}Œ? 3,Bݷ\)G +18 BFA49! >2׶Wړ"0162()B51rP 3 ]N$m5CgMPNG^NBEBt=2! O-)̙!#v`V 7= v A Vt  -D]AtB7@8*K,+=Яڠ%& x[+ qP ;p)&1F565}1' qYgá~w#~(UGTE0$$1n=3JU]_k^)[UK:s$( wBu^ðƴ,۞Zhh z@lq !$1;h>:s1%DA M 6$ޭ՜ѷ@ٹٸtPHQޫL%%4#0;BFJLMRM=JD:x.|%pbuw%0e3-! !1n :N ,4D74, pƨ=>j9q5q:ђh??ΚFν ٭r ;T)3:=/=N:64 578?83)Y sUٜ.W`,==HMJ2B}6* 9#Kz F e eA`}r+Ƚ#gYm2!ľbY6+ s$+65>E G$B7 )MC:,f=JT4YWNC8!1+#lt_ f)4:);4W('~QR{N ysj7mj=n N$'%|# PWS)5r?E|GgFDA ?^;5.\&  *8#*044&03%*װNay-@_ΪA{VxYTPY fn(5AI6N$NaI>V.q~U' U-%8<&;,5$-%K T * T cY X#-25:=f=9u2&lέөHHLUÝaWŭɹ Ռ6!%BBc%C1=IU&^Nca,XE-Vyٝ۩ ! $! | x g>#_).*2p576j. #ڮs23 vЦ1 ۊ3D1 c*->MYbf`aR;k [siQՃ׌c . 54(1,(%H#>!C v50g %(% |-5}|8 :*Z2\aʼͬLEwʔ j/ ;DSJNMXMLJMHMAm3 p\ҟT a!-46V4R/( . /{iD<^u' /.33-"^w0ԭvm d I˦ȷȐcɩƝַBKظ(*7aBHID\=869<3@B+B5>:;4*x }eԓ] &3=AA(?:63.(t  henmO2 8aw#&% ݺɪDζ3|Ű!P ;Y -I9ADBe=N6-#J6 X~:1x`h M# ')'+^+*)y)Y($z dF2#j08;6- ?ʠʡDgyx7Bř{MvsN.*V,R>IO?RQM#D-5/#|g;C ? Z,L Y;#"Q" Anc6%-46U1{$/f#ѻ'ԿďhW1qԵCI %!4C0NTY^aaZ\L8! DTˈ U " h=x  p &N "--G56/! \Ctߘ \Q+u[؜sԖTѺ̕+"-^:IDJNQJTVU4RkI:&:>gIeD$&%1!:B eU Lr'H-.,g& >r޵Բ2j r`,%ӼCEBQ ٭E i$}% #J"%*0b6;@+EHJHDAm3o!t=AAUw)00s)=#I0_%.-00*."6FJș8mYׅ hʹ@ʎޔ,_{ 1'/7?EH}F>2#<(b-g;EIE<1&= c#w w"*_-+$- p-'ﹱ\jMfR-hj EќMjEߨʱr+ TT */0025%75J- QNd bt"4-47>A2?7,!7 #C ;%,.*F!f#ѦOw >Q b FF/])hiw֎gǚ°5_ޫ 8y"#! y"(k/A56{22):C3)A5?EE-=0" XNhO Rþ<8ƶ`H|=D ԅ[8ع2 X @B #!s&(#%/%8 !Ct&0U9A?A?i90&D|yMBNڂȯr֢ AՄ 6:!=$t"#*z$ؕ;vaHy#)/$2`-!fV   @ l$"-/HNLONLIB ;_2( OOTַ҈1ϒ [\a;Q$lt$8Y3 ^[!"^ {Tc)< N!y$u@Kt^9d$&&|%J&_(a+/5FHE?C3"MF V&YS  ^D6Β߶$+ ]!Y2>EEP?L3u$) N1 4sn \/!!A#v/.mF+5<^<4%aɲ:L4{wpQa{ Wߍh+ֶǴK*$2-C6NPI;4)6  ? !seO :m! #Bt 'KxDu&& !d ?* =s@> cfO آZˊxs  J[iÿ#92<@ =2#$ m\ nP(-Z, '7i]._%A5E8RVPA.6P8`|eEͭ-Ľ֔ l6  <9G `ZΟ ”Ģ i dayra#$ +YG#*1.563+ 2J*XQE+ v 4s(޴~ Q+ ?,Ⱦ|ڑGNǏ6* Fr- r  G vX&149>AUB@<2:};AIR/Z^ ^VE._Vڟ. `9KHlK8i~ >'kc#zǽP;f_Ɨ !m&\4 p "[!O&+*-16<5C JPGVXUL?p1$! Q  cTԇ #(Zv F޷Cנָպ AU-&̝3FG O"-'%Z<[8 ,(0,71;;83$/.1 7>GrNRtQMI};*6 g{$ T Mr%u:ؑ؎Oۑ eRvK5^֕5܌q޹pq$8Ҿ} mtyh %r'&$xmjl"/^ra]R^B/+V z@?UZ q>4Uء+x~1G $[ p5ժl. 魟fR  s  @ &.6?uHQQZb jjmi^^SL6 9 Ky)\"  !^Ӝшׄ b/CF okl@jϦ`[V'p,+w% PdtVc-  *=MRYq^\]Q?+W S[! tw;W :| z y/ Rr,Qݕ՝_qq˕=ۭݞ٘z-Zȩ[dor!/$b$!Q#L')*B+e-t2:DGNTUPE7/)/p`#((#bC  ۮKdɀܻ,e RP Kri1Az?<ײ'7£ϻ lkVxMbQ"'0)Z'" mg.>N]\#etgb7X.I#8' j \' O~%U&~I # QӠ 5ۯ2ӠM쩀QȺժx, &O!K#!.Pj. S#6y ".w;HU`ffQbYsM@3) % u.ןlCj ܞҗ.;ש[1y] H"E!7: ? "*q2S9?EKRX|]`]ba]|TEV4b#rA tQO K 4 Lع<8 Y`rӮI3Ź~(ө _uw#e-22-$f$&#k&&%S MDg!0=0FHE ?<7Q0*x&#!$!"$#pV ,9[v Z^G06SEĻ5Aɍƾ]FMNA7Z ?!%&$t! PMib]s ?uOq ]Y((5PBMkUXVQjI:=G/"9 `X ܇хYM`ę||f;{cȵ4/@" % %+ 0P223.6:R?AB8/ $x~*,]]t ,ݨ4 YԪ8ܢȻ68rByc &l07;::5*]~DP  %!s/>~L4VZYRQF 5"< 'Z 1%<{3 'A  M϶ ȃ̍ӻѹa }|/T L")+(m"bEJ x b$,4=FMDQNFB;Z.!w bbu ]xԛɇq{ }T͔DVwsB [RQr9؎ls굟 $)Ex%&"Uz L35i[%3s?IQVU5M>+r g  (3+'-ߐћS[Π޿zJ L; \)%>SEȉι변̶Rͦ݁x+ !.+5241T+{$X0i & +)5>$E F A6)'UftV tl.0y5 nk:eŜFRG}՘ߵ &,t-*$S\$X?u _p %+4?bJgRURJ{>0"FY6! 3=17q%A%F)a)&"V xV - YS'3>EEg?/3#.DF:')$ m4/ӂt\Q':) 7]ވ֎kǤ_QϹպ,XjM3O+36M4- # d2 C CEv&%/:1ڭԓ é3;/ndtU"#)#_!W`k PT :$Y->6>EKJtJE!$2&$!'+xHE12(5UBMU~W2RG8*xaY!pp9 Wg{ۻg|%2   '72q%R3彰eC N#(*3)& # Oc9o&.>{.\;FOU_U&NA3{%B  SHE K ֹ@˲' w, W =[wV*ۗЂg6ɛ{V 59"u&(='7%# 'i%b`6c "%2 ?HMLjF%=2$(ms8L#".ohb ĂIߴ/ lUC8nؐ^ӥ;ܿ!@' C#2$"[jZ. ;7UL DP+9ENQPJA8/'k!%&"!-`+ױ̷ĝ]ơ2O/ <535ܶ:O1nɟ%Yx"&* +u*( ' %P"r- "| B%j2>HN1NIB(9.$8 j!" O9p9;m [u1HٗNևKvrҴw!S*Q ')-T-*'#! puU=B~ zv6!.|:B\FEA:0&B}"$#n]Lyڵb!QFcI]07~$ՔϯQs}z%Ѓea$!9#:$$ %K%H%$n#1!fXVq =+!,6?FIICF>U5+!zk^ ֔$eK~ǹ < v X%3}v rĆNּ\:7"T(*+)&$$2%%$:"<ofj P &$W1ABY?:4.k)b%"  )MSֽƅ.{ OzBDٴ|#BiЌ q𳟵TCřWZ^H#5')('A'(*+*'A##OBw ,,7>A@X=?94U/)H#U !! } N7u}Ὢ wڞq~ @"vLA<2L Ҷ j%(* +*++,-9-8+&E"kM AZ\X '[/5w:<=!8+&@g5Ѹ۽^*pEg-vݭٔӫǹHդn$())&$$ 'f*,8-+& N e*s%-r48r;<:7 3-2)>%"!!=! ~ \ø a ntlۑՊΌAY۹Ȅܩ !)...}+'$&%'*+b+)&) 5|yI3ߏ`KM \ 4(&-/01]3565>1,(T% #c;;]Jէͯ%JͶNr,L o &M5I wή Er<B)'1n43^/)$""%!'g'$= q_݉4 ?#j'])m*+-0=2332c.&)f#Zfr*{tq^Z  74Ӷӹԏ4~ƭ´*E^ wG)X1|54U.g%Shi$F) ,*#zۖM|>",131+$m^S$,39{:x6K- t)$ jlF pjXHd Ѱ ٭Y7͉] H/%q+b048?;;:-9j7q3* 6W֋w -%+R*$ }#+P5<~<5'je> |2jOz}4&͛=ςӿց/R(Y.~0 f Dml " +3;@B@<6m-B U9;πɲj5L 5b <&'%"xvW #E8`raW Fk%&"$ d7~ ӦԡѺǐEj\Sy Cd+ $.[7=A@E9s,(uڵ|܀w#x)-.M0t/0-**("U9N] %4#)*%h$ u(i|Ĩ%^,gȞլ]%wGm] Cs#L-(463#+`x?yuoh LRz"(.3-41o)9Aawe}#)m,+'J2f'͠q.J͹Tê(ظFQ$-1.'p Bb&)B'_ B&pL'M10, $ &**p'u"8fQ  i$()C'!B ܂ņ±Bl9iܰҿrJ+&J++'] < #-E fEHhG idL=j7 3 (#%W+.//-w(0,hț$Ý6qrׄ" #:#h`Y  70 &w"IK/ E #.3 M k u K9+#i*0{5\885/% #3ߴY6?u'y5BhCBx; &*i+*& d; 2O@4`" $#!c6 } +$3788>5J,P 9Š  mo !%!%&N#D2 b ( -  l UIK@1&06w984,"!^O7\ڵb*9an"C \ \Na8#*-)+($TH\)(|q 0]"a$@,/-'Ea R  (.1}/(3_ L^Lϗŝ.nU[_@0[ d_ ,} }OY ;5K iba5 c`x#$#yf **Q#-48 995,- O65Oҩ׻`Eyŝ>Ќ"'D)'"p A aV#'(&p!9Gm 8lS^p $(*;)&"X W I(0:7d;!B#""AY/|MH`9 ]K& K h G'%]. 7=A[B?8C.0 r@ȵQk$Gtկnv_ 5>5p 4!u Dc'Xa >|k) %^*#/822L0o+#% H!OӔG!+V Q 6el7K| 5Ds  "BRZ a^!*0Q2 /4( |yt#>-J48D:c95.#B;w ݰ8ә<٧ε2 ;$ r!x    ].ba'DQG.5: }" #S!\)n)4$.,6@;=<6+Dz%2Dݽvp evup Cc y (~t6>  qI (#)2-:j?BD A8+O ul^l8Z%ήF2 3"&8%O8%o !%% g'r# ۏױ׆ڠ@߃C %V/44/'@ o82 "#.R7=vA?B?8N,Y1*ɧ'g>E+εgesg}Hvs mrZ,3=6ܔׂnjR]K+ 8`h$/8>CEE/B;2I'" #)VԵ-J  !4N) /? -DO;tOܩޘds}Pm/ 4AgN Un 2+38!;A;82-(> 7Yƽ8*y!|`k ,SA |mlDu YZu8 ?9 ; 10A B"'+U158d83i( t!׈彆⭐.ɿEm"%;)**& S 4(h \U0 fTZ{G^:tW= '06:B;@94-%  ô]äpP_`pi&+0-*$yi^C9 TZt6KNw~ڰn/  -] }' ]=U&V- 24<503-$k#7n5vʼnӐr  #(],,)#'<  ; "!"QR_"Tg ^&Wq0r~Y''/46x51k* FއѸƔVP󩽩C:ηޙ@/ /#~')&  < m${)/+)$koBEq[5)6 vT :G!*03D2.(f*ȓSz.f ѽ #V*,C,)[#|wC 8 Kxz} +R*Wd3C1!d6 XI#(+-.^.+# іĩ籤!7A՟F#&()(T$ $G  $.nNUEJ|uRtV P"(-/u0/r+$7 t!ͮutH~Jto ؙ &.I354/'* ! 5 e!" z {`-:>{ Y5b.%),-g-N+&5TS՛Ľ)5ߩӭЕTu#,2 53.'* xZr ^$&9%a!N< 098Zb]s)>xYzl N`+%),<./0-0,#9 2Fyp®{js,܌p p)g/22.('|e Vj +N0!!Z\ &S4IJEDR? #r8G ~KԶ/,ѳdƊsy*020,'7 Ct ~5 J`!! n'f veVdk_!2 _k DU*sf}Tl-$VX"E+M//,q'd C % gx. #.$"Aq!   /U>iDXe Dfb &(X_nw}p~ $()'P!i)4>#'((''$ S*_ "KyU4^ L v{zٞ+#4sL ٓ־C)"&'" zWNR.'Y-00 .O)*#< KP^M #PMS!^$$n! N;דFޫ06U j")1--( !Vy !Ox!miq8ut A $ '(*.1221/+&,  Q9{Mؾ bi#oB g[  <:Թ6 $,22540) YV = >\SRrb Y,u<ءe?[7= "&?)**)I%=#L+Ŕȉ؎I< c !* 1441 -'#mn $)0-k.,T( !' 1S֞@tؐob GSXU w"gR]Ir F"K g+#3).3N7:98I5T/m'5y iB)Z5ktkwt 8lA}gvuuT<5 W',02Q320*, %r JT[ ԨKӧ c.b H45~'+< "<Aw |N Ca  f12DS?%nfm l UhV ? :g ^> J5GFE|E}>Q/ # Q E6bUۮڨB]N6?fO2 d$> d'{%*F}' $)=+)&#t Bj G 24Dp >(_ݳ܌ܯuKf>$< ' %Xlpa( ]?Ud ! o T(cYr&BW*=h vL8.7SsSVI:T  wxZcZ  M[3h} - C Sw:~  j #'u_ Y& fd C2J6-!t}N@!]qX Q GS* 6C`a #   BkO|~W~pe xcT QzZ3(Au %e,O}y5SaP* @@<]Q-cI}/ &4{ -o%j~>^I`FD3){b W < T `!T %T2 V!?""a"M!C>rz zY(8-Nmtm%߾02]EQ& R Z3;L0i6; / }x!$&&D%# { ,[J$]oyiZF ]YLjUAt FD =F4 p F o9}:Qaih:I` L*2x]5  ^ G=tqT\v2Ep#F D.sPSryhjd!'D'0\/NQc 5&{hcociu X F B J fcD..8[}#A']46Z/=Aw+R? 9 I Q 4 N y # ]uEi(1v':m p>g,Q5n|I*{!ty7NX 0 ~"ym!d bE X@'IBc`3BSY7>xggcA   y < 2en  g uACp27f_( 3h(>P2S#+fx+w. %   TIY^/t-Ys\t?#w_vofN"mQ9{Ynb"at=}Y^tCRz  mzX'Ptir!{=M)425%_mSNI1K].lt1Did$??X0 P]in_<_mtW_ORHQig& = < 7 2 W  E  U]Pqw..f5tKMQnyo{N G a A  O ! i 1 8't%X-7H7|0&OGU?R l6TIlwC  Y 2{Jg/ 5 e6VgT 3\3axe6YPHcrAB 7N I mO2 e \ ? )m&_\G 4L34`R@XJS* 0_ d a - c ;  l ttjG^mUJ$-seC2 %k}R#l%@LH-nh|NANS#n,faSpim]z1"i<^ :H 2f<[XLZf3|CFN1S]hu+$c%$"Eq`}; MX[_@; D? ^ 8 ! O Z e5c_Z"S^M& 8L#/JQ>/Tfs,,54f.d$ jAaRw#= Y)~1C[^pEM<s/Qm ;5 Uo}O,$*U<vgj~-P`o4$*3X'C II+MIc=_H"B6dv.W_{zOcK4!Ih)r:s,n_]6-1.':{'F<.kvV lC$O5:_vQR ]wl#gnQKD|$R5_TK\0vf[6+7)v?h@}&TFVMj9t{!m !# ~JA3'Ixu,z1R8)mtS[r0 &aUE\]5d -} B_ G.E2& !G{hT~$UA~7G[a^Q?.DQXz<h!Y 9_]*#)d(PA0`bIJgd@R}0u{0`80_xhB*XFKAt"A& HXg"i!d&5F%\j;|ZIz )E>B! d}hQ!VC~loF'.G,#Cf`Lws1 RzN>B+u@r;R9y= yf@r, 9 QWzVgD! sG*/suC_"vKHM><.[!&VRM< Q3)%LZ=hOQ0A#+J#BrOI,#r?+D,FOG*OIOMiXl9S*-`?;Z(={krB=<h^D t|Xx_P>!*`U J]/nU-LK| MS@eDLlNo0rzd NPVed](gg 1':p2[4tz|TnyNaejj>lgLttl3M[ !o/F=wcQ_.N73l*GaK@JZ2.wMnG6({F? zAp ND,u?P\ WnPPlM2 v1wz`GsR- ,A#1FUQI-e9e']h@R^R}&2ONG8Z%LTf\\t*O r_70 )[%jlGF\D6hC Nr'HQI5cB\p a(/f5E]\\ iWKTh p |'ZPa^:!wZ0Hoi*"5|2xQMTR0Yq=U\Q:Oi@/dN5Pg9RYg,WQ:js&2ICGbqt,Qb]E{Va+]IZ}# 47& ]xgVwC~s"rJ_ 0_Ik6_O^4rFNz_5&v}ZeW'-3eYev[G41Bz_G(=]J[%8,|~0(*o;As"V" _J JEe u a>.Un#TKnJS%G T sk}cKr:K^2!">@5zQ 08]=%E G$. ^kx 3y#&:@v9p$m%.3S96>]D(0o k-,h{xAlA5O :RG/PL<Qi$,=)YU$>eTf7q$pkBRk:V* `Jx;oMjKG^Rg L;ZH=(cKyEz-]t< %', ] ]`*,"");B,~\nr "J3c2 .qrVu@vE6*CP2RZaTegp)R X) X [8bMu+,yq1% xw  >5NQ ( a ZO 9m_=@2h7G"g?b(_2 0r8Bhm%;<D Pai   x ZC A| uA;  R g7 rA`&KnO `YkC! } 5 WR _>U`i% IgURU@ #k ^&H^c^(!_5 A     l9b[8,LN hPp;| cj+EBe|ivc$ c`yxbj)dd d@ cicF GxH/mbkl  2mYYPoLSX  S6vV#/%w7#fdQ_F6gN[%,2Z[f.9qvN'BWH[P- Y< M eP=(` 4>mgCVas`KB-; \JdIGak7^:"$'Dwm  /9/^S% ok_oPnGH.0?ktA:gNBB<Ej)hiN)E1@}AY30l[xp|JEL2v@:+H7U9T~ #`F,4x0Zso+@ 0 >0TH~j@_.Z6^gx[Qv6Px4`HqZ]_Ms9Cres1WT/W3 NG6SF s7NBT-IUN9x3+aQqaj}8aDD`Hf=iIJ<#"0-*T8-]biX\ha)3*.{r22 0bvAa|p1cOp4e(PId.f8~|Mr_`km6mm_-QgLp> EXFJaHL*IU9bT<$IUXw*r r >,*@U|Abf)p~Fb[vS|d9cmImmy,B !Nv1Y]B;gwqWgVs"uj7FK(\\qln&vNsQKN ofNVRcoST 'O$ (IMR jyi1s!UnsW%m=D@KoDcYw/KONM>HH>d-TenOhWTN+45!rM@5ZU.2Mi>q^k)QYPHj~N!Tt"Fm >VBa5qCEOo5u;/*%GbgTtu[aN-':PqrJ*&A9Si ZN4@=^ 74J^kvjURnI/hsY)ZsoJcy)hF-[DRd- /Gbk!n];CBw928:]d3;$BRFSry)K(Z]j1QmS%n Z$_6L +jW5e& `dS/q+:oC3*:5wn:  FQ]\vvA-`Sppf ZQ'tOyC567D*OoB P8mi}p9Y _*O;UYll*Y8c}3?IL^ .8z`[^_Wt,Su}0ef4dZ+yY@>? n`F: rT$3 t>\^_:: <`, Q/S)%Rd(`G2dP X' Yde_P:D -5qdp; 7r (o{K /z^tGoZ {"l%{ ?=V&?Xd .SW7] FE2)]29tYgV84^/q/l75q>pSx_o?D [o$+bX ldKD0fq,g9/w- W]MQ)m/RBy/vX+*4UXKh)cTK +I(W`N'qKp!/9w eZUd c5Hu-_?HAL/,Zq|rnft^'fXv2?e 9/./DDblgU;(#6kEm@'.Jy2+?0=F=UES2f g jP$ih|[Mpo"!M0U7sT!ULzp5CpTXcq'uyyxh&J8{X? BcfiX6KH WD)C]PR-pu-JN(o<2[5aP~i=+K1LqwgxM];r ALF~qWp>>B/"J}fAfP7`)0@E FKe,5PE:o{$#;i^|%TpbYo `%?+L;c*7PrGB\`/l^p[=`8%T K[:9C1.6hH$ _0d@e /t+9_ BsFD@ZRrt4&Ip@, \-^ Qs}^tOE5DI6 ;e\%\=iE9EJY+&j<>S2*1 J`<$%*6[ ]6e,N_>^[jOLv]M4L0(W&}ZoA3L>r,$vD2&D=QO{dAN3Q0 ? xl ^!Ku Pp VEI))_}S h3aC#U W0hQj7>G`{H`+" |Q7%>cI$K% WTns "/iX+W]k 74B[WsSE3 B qavz@ o0RjPjuUv2+s sSIr9xrQ8qND-(:VTGBHDa#$SjA/DC45Ssi4tf y@9>!aq`[ZC(BYd~r u:4j*.c(V_M==;v:#4D '\BZdY8*wQ1r[@bVar~ua?vHp"P\ ;E{&eVfM.'/|-Qi? Z-"(/!"r-P`.^!0mH_)P} @Z 1zrw6ND a RfTC#nbSBf^!yU#%&&&%!Yni :qDZ2ۣؓ#٥`e EkL]S [#%z&x%#!w KK :?fJ\ӷL@g0ӡdD#s-6\ABPB?:2u)  `QߴүbŽ/½,+o&%)3F  [9$-7AIQMNNMKF>&3~%\ߗ͙]gʜ7Yq}~|k|7~{plP- 5@f0k *%*.0@1O/*~$W~rK$-5:;_950V*+!mqsŮ}ϊ:g"DPdz|z}qU/L-̀8to?VpeAm-nh^PAq1 ! v"/7<@BB B=4"&%Ė9hKfKTSoҾ%V@+'5AxF/B4! iLcƻ) NJ07Dߨ䱸[.BQ\bd?anYNA}0d?C^Pz#)($n;!c)2l9Q;77,"5  $.-_0.*%J"K?ǭ>މP:Pӫ"i)#B|>ZU?B A"(<=HIaB 5%k~cBIOľ&ɽS2`D+JD6g%o B\ $gU V3  sa+tx B@Fa8Qs58mAFګ͑dN@&N3H_NENE2z#G HN u!  2'`ߘ-՚1he"9/7:<83_.!+O($c   f^*ȈpcH9;zok*On f , =;[/;iX3+q?ފݖ|%U&/ 5[764"1,&8 ~4/l-i 9]_PT.ǃƺ/'ڊ3H Qv` &+'p/=9BIJyF>4(HLly} 1T$J-k22E.M'R"D qax] d9C.K+'лog uU#&&(L+"--,u*'# [P_ j&ݮ:$,M2554:3/&Y ,Eqc5 M&( %t{,мG('5ݞҩ'_C ($,*&!oXd ' 4 {#[)*&cѢֳݒaI!3EVfs9}~v?imWB,*5ֽ"Hjls@}} Qcxy#)o*&M8 >& ߡr [ D_ro!"~!RLe #%" jS(nw2&̇,4 E1*s CGA!""I!L #5')*'+U+*(4# R˫ I+-;E JHA6@+K"Ab  `߽Ķ.SkV @ ƨSLz$nAYjsr1qti^SRI>x3t(DK 3p5֚E&+47>A@=[70*+&$%S&&$ +f`$ߣCK)r,(.-زǩ.롉5&=7$4AINsR(VjY'[ZdWQII5?D4):NFڵ$p YK/#m+28 =G@BRA0:10,'3!V ~lZ۰жlޠa-8AGJHrAu6z)wvg j\V+Ϻ= ­EEʹؒ;MV!B-i5:=>?><}925,0*%%!;fKjYv Օ|36*>=.JQUAX:Z_ZUJ9m$"xT6f2i wG?Sւ$ !!  }޹K\]ɳ_u©_|,?!P%]!fjjyeiZBJr7$v@`CNO (3Q=CEC?:99< @lBSA:,VbRՍ?(ţc ӎL eE )$k-A"4@FFcA;7*6x6Q6l3M, Jm2E_k=z#{r,C9BHkMPxRQMkE49)aQ̚Yyq6#S ,561'_HG HQٻ*RĨ7JbWm%67G5VWbi]keOZJ7$cYUO5_Y 2%8IHVP^Ha]NR?&@.=٦%/ ;LbjGhfܥ'Bԟl}ߑRŇh )C/=IRL[``1YeK9# I?£Z &o*'%]/>!*4+=7A>K5$kԫʛǒhXe".69T6t,rg0eƖXݽF -9 BGIG Bq;5.$ )+3^@I:MJ@BK66*! z$)'%enשɶ:*!(**- 6"AJNLEh9)Ǒwg ÏB^ ='C5UAIK!Ff8$1.@X"Trx)217:;^9E3([MBz.͊<ZՀ&=/RbmuzxH~QWnXUaMBf6k(7fg˱y8(*$ ^4Gt(3 97.## ?Yʠn1ʝI R,:CF[A37)-@ S:4ûAQܩg(5?GnMOfNIA:4U0++#E ~֒Ͻطc&̖oD.)@VNX]_^*YsMA;c%>Z),߱ޯ8Uu/ox!8'u)("%T!Õ/rVtvwye b'T;HQNX^Bb b"[MH=2-6f3cg=δɥX2Z-ĞsMt: $ 1gALRRMDI9+WHA(seviB u(S;(9{FBMjMG=I0u <-(J'2:(@DB?6o&]Rξ|Lz+eۀQ1& !8lKwV-ZlYWVtUQfH$9n%ՔǞPkbw8&9pJVY]D]VJ?:'$|ḡ0ɸ~m;d24RFމ)ɭ=k9t^#Ъ1":MPZ_]VANHE8FE"B9+[ >K?M{o,h9ABGI_HAB6&؊WVyvk X b$t6aA F~rri#s"=+8>(=5*= D\&-120C+"!YSўďM3'b -:,DgJMuMG;)xЌ:c  W-_j0 _O:5Ȗx4ܣT,>N ]iqru=tWndU@e' P\''6A FiC8'qڷẀ I  F 'h̙BĶK V9&ŸRJ<)8=bMYBbfd]Q$B]0S _޴[ ڑNf1ڰ"u٠1&84>G9N7QMB,/-lŌۿT{]!?1(>EEy;*9>۫'vSѠ"(=%$3~N<95A0(DQ ̷ֵ׸K~Vɗp/'v=LUX5VOE:/"Q 'U >k 9\">ڵ/i rzZ~pֹIm+6hAJN[MlEB8j)H~j9%)+)(n(o'# 4v >TZָg%,3662)"g%ŗ-b}5"%R5sAIpNOMHB.;5r/(e"k xةR1ݩֱg2GC=NBUY[?ZLSE02Tr l,>pT=$Cx^ BgX}xa l ԡCq4(;JU ]^bee`VKG6v&<.`CАbՙrzU%8HJVZU/K==/%vA1Y+ - G""!c n{ѨJjL=˹^ , 0=IFzIE;B/%Z 9 X)TͤH5_q|Z6/BpOVnVQI8?2$~վñKS#  |!\&))'"_ >Q׍ֳZtq &53?IQ$VVQI=/+]@o:}b~5ҝK:qj%8I V[YO?*Xc5cƽg=?VOWea t/ȴι.`\1ROΥ,Ĵ6͵\";)jLFNK}MMJF^A9|/N"?F'¦͹>ƁoI.XB S^xa]TJ@Q4B&Q ޣQПΥGUаpe+\#'()(&#mq$ÏȥDUK(9E{M`QpR?QMG7? 6,"r`Xi?‰Ā!$WJ!*7\FS]bib\QAN/+bWGÃDȚy8o "&'$ * |Y@'MSn *v3ERXY|VRO6MIBP9,k~?8V¥nɱ޹dy+cqFLQSRBLfAU3#8xس3)O*5s%Q)+,,*&a! Z"Iڪ"=Hh(7CIJaF(A<972+zI 3ӹ*ߘHE\1DUbtjoqnfV,B5*q?}Z=36K'042\+5[5M7Ųdyq  2UBOY`ab:a]XZRJ>p/<̋Vέc.~܋_ ",4H9+=>;3x%v M$V;kB\ljb‚ÁȨTqc#+045C3,"</ͮ򱀪hb2K H![1&=}EOLRW1YVN,E_:.\!hY*D¼!.9=&51BgKQgV0Z]]ZQ?CB//OޮT?\($0s9<<,950( # 6Aɩ|[؎[&6BKwQSjRNID=2-#>O#ߩˣ7SoB-#4^AKRUU_Q]JA8.H# q=jpFglU{*;J9V]`^ YMRHs:O'&0}9֭&i*:YFMQOSsRNE:O- X&>-޹rWW~,DCV.aeidE^TIf>;3 (AQ>l6ɠڹayԧCr&F/932A/ +\(*'$!z6{owG[%Uȱެ6&x1#9=>E= 92+#^ ^=y ީP:Bj[e +)J9!IWbIj;mkf]QA,qY'.Q8,ٸ ^-P9AEvD?7."5\Y#]i'$6F*R~Z]\UMiF[@j:2'kTҽEVĴv©nK !?3AKSRZTQJ ?y0!0^(>ڷ޺Y_q4 f.8n=}<6,-!@ p%罰,TFݷ Ƕ5u ( 3X;AEFB<4)+, K"bE%VzWb'w7pE+PVXUnPUJ]D>A93T+!JаƣD}ݮ|M ze|!:!>婯Z`t }p(.51m/)  %(1,8g}l,VwOL !1DALRSNQMJ6HE@07<(~5]4͵Ұ]hМ ++364%-q P/d#F߀٦ҢHپ^. ,J9'BFE?4'k) 7pG)ծܡ SX,+7<<481* %!V ~ Q -s 4ؽj4Mű1-m  h]O7qrɯh@JOY*'((V9[GQYV^f`]VNH#FEA6Z%"o ~8n "-b6>E9JJE;:-" 9nק"]'ƹȊՏ xL]B  g DE)#е0P]F7 PR% $()d'!#E?]V ա ou; :'H3@MX]`VbdmeVd^S9A0*{-|𷮱m'ȰVƐwI h'd+K,(8w#RL]lOf^͐Wa%@2:?BED_E5]+z +r  )3:9B]JRY]^\UJQ9$Uou2J"7JHȗ?W - ."!,!s *LݩN:&Y70CIKIFB?+> <7/%"|̾N˻Β3W X&2>IS*Z\YTQNF<.C$:߳ű.ϖLK ([/*3q3.$KjKң8б$aϏ $.7=ANB6?90&:V`رkRQxe%2^>8FHE>h7m200<1/* "^%n`ӊ̢UǴmܿdlD#*>032.'kn e(֞Oam $].476i2+a% cWX ;߲o -k(4C*R_in#nh]M9 "F Źֽ.ϻ2гz >)900+5! Feآ'?£Dջзo[.x=)%:%FoKIBp;n64_43/:'@ nYI3 ,35;B GIhHXB8*,`n͋۽O4}?TAQ $I'((&8#^p+)âShN޳q^&4 AJOQO.JA818+m& y0h|X i*237X9:<:?dB EE(C'=64 )z @5ILNj|] # +,,'0Y +W*JECv]$k&2I9;:t7j5$68957?/"Tކ)!&-N51?ILS-Z\YPA.jkm҂&ȁÇ``՞6('0699R4*lطriMQW$1;@OA>;:gs=7,k ^x(E ݾs Eb)]39<=f=?AxC Bv<13d' l[ѹS~{(0O55r0 )!e %ч0Gaƌ@ ^-^;EKBNNMAKE=3&uw>@Ҭ7Pک8F .:BFGINVT]aLa6ZOL8! bB0͞(˄F;*d !?!l5XOL@ɚ` V)>é &L'043.1)I%$$^$!'9 xބzs 6/P%q,2=8Z=AEcGoFB<5]/Y(QJ=cJ4ֺq5ÏƬG;߉n!*//* y^n5ro0́´ZJcR$l0:BFgEA>z3W(5[ 1lXRp*ozq*:_FNQN\F9*s-sRP1鶥Ђj 7WdISk?GI8 (76WBIIA`5( bH!&,0&1X-$`F 0ߝ L |NY!)4?FHqA33# ر@X˘%nמکJަvA6%' %/"u*CW)ǣ)x:|$ B/rBMBQ>6, 2 HE w 5PrKk)`Ŀ~ϴޯ6%&#9 ))IƫA/ʱ` "*/?.(!"(-/,&s*؂tYDW" +6AMIJC6}&J zߑTݕ2 S7IG#z$xƹְ@©;5 p"3AL\R'RfMMGBV@6><:3* > 3~(!',o03<6D8998M62/b,("- iF |M˜ٖ̑L$ K&8дĪbpl1a G*m7g@fE*GFDFA<71* n &tS_c\$//56p53`24: BHJRF<. 'mka{aˊWc:c އ:ÐΡ:cC潁)7@EEL?A6,1%6!u ! [ "K 2s /B #E(#09BINL0JC 7s&<Hӏ8`#_Å% BTUݚ ͊Æ'BŹD=Q)27$9889;;;9*3( ڬP(E&$4b?FIGhB&<62L/+&n \W NތЏ)PA%WOUm>!ĢԣXy ! 9&!17K9877e8:*=<8$1%V{ gr &wh#&()S+i.2k7 ;==:4*c1X?JԱYFB~*ba }_HoD|wU뵉߹eb i)4Z=3BSCA7?K=.<:c7-1(s5cl܇ } "*/1/,*(''$&$A#!th  J b | ns7ŶM_.k<)%/6>=CB>EECb?92*A#b^ -:.^ _{"y'B-E5>G-NQQ`NF}8&RrDaŸƵhמ)OJ {\́%4*ӄ={A!*6&K-00-!)y$ pQ  a&7rW 2dT !4"$w)/4:@2FIID0;S-f 93%HH,DӸEXw$ B X 3 mlf>/򹳶)J뾋ʙѨ1 r.9AMEYEB|>:7?522,L$| ^z40:9 >%+,&+^**+-.s.,)% :|Ϩ7ك@t l(LE"ݽP񳘹d%ոzU z&-12N2q235b6 4x-#3ih+ Nh;<O!2'.4:>A0BD@:0\#,ݨԕFפyG| vNP$ؐc񵳱Ұ.: ~ֻw] +c38<%=l<:9^740,)lIn ݙ$$(('',(*".41344*3Q/(1!%ʴ^jKN  k@ @˴SP;3ur'4C:F$E>T2Z!^UqѺ)K8( 8,g`n@ɵ=޸w[#v)*(#/99 D4P:N4 F$ 'e(+/4K859<8655F3.'~ &8ŖWϢ* kEJ[c#Q ۵QN(hkw#,64H9<>?E?<6".# Dmlwcfc6 -#'+05A9/:8?63f/*h%O bȀ̏ո]!0FTx5*BAﱅ,PӔ;x"z.7=.A A=71G,%- /8#;(~*++.+269Q9Y4+j!Z(f D3پЪ*(@Z0WP% Luhj6oz E%08bs#a|CgBUϳ­Cѱֶ۠ou!.`8>BD[EeCz?~:4V-#W{*4*ֲYa A>!z&*%0#7>EI7JGA;k5/*%t!)E ;96ڹخR3Uizh ^0;ν¼a/uRѲܱe +267 5G0*m&#_ XYqdWQ}!&)1+,.14883;~=>!>;5b,h ڤUnҴluxWi+j$R "h 0Xں~"Y[ ? ) //7-N("E d 6p~ "c:").;3T7:<Z..%+".}QտxW@rW)28$:^71*$qheۆ[u` G$v/A8t>AqB]A>:4.f)%n$ $#5!"zNs\6_fBng2^1 sa:(дö5y0%^06a72+%=!_RQ w%_5 ZW}"!!%*/"53;AGJGA9/!OlͷSoպ2E %rw) fxG޹Ԭ ƟҎOG|.s'-R0.)V# " ku F5D A9 (U3l=dEIIFFA<'8 3L-& bKHʍ̶Bȵ HLb!+ 2ַPV:+y#0K8 z\,BfAt>i$/9`AED?C5<)YDS8z\A S Z$,3X9z=>;3%*p9ˠpw%΄n݁.hgH} Y 1u/صƅY M #,66@7FHE@6+tIE6r3$*M./R.,+*\+-/243, !.ֺ62幚1Ϳȧߙ o !-ot ی$sxų<3-&06p9i:|::;L=>=P7W- ~@pc6QSu %'()*, /@24 64X1F+"P z9p6ێKP6%Sީ-ĵw[n">%"#3k#*03=3.&:v`+ fk &-&5W4%cՊtŹΜףEmG]AAG(BzHv2Vl "#! )%O+B144G/'J#qUV(;I%+..2-+*h+-:/10,$ 8Ua2͊ǾıJWñąHOK#Stt7*  UYSκ.佝} ,\|Y$&F&%&c(+/2429-$n0qDHc6mXh"&#! '!8#&*.=10,$ Z*ּW!ǾZ>S nHGG 3' sOF|ڜD[\ʭ37{ z4 + %-%23/( 8 q"6''$&>#R(-/.Z)*CI/8loПҖ8  9!>s5\#JWr KT"$#!3 ? !%>+m02>1,' 'i`$}5$w#(s*(%b" #'#-424'3v-#FݚӡxǴ˵Wܰ}L0 S E7 y oBѼɜ6XյZWR"5#bQ"N*39<94.w'Cv*b&L8V#-G462)x y"G^EAʾeױ&[ J > NOgbՉѼ ͝bj@ !H':,.T-)1%/n kWeik S8$+U02T1k+!+2h=rhxJwpdR_-}2eN9W0Y " !md#)+..{+%uVc f7#-%f#25*4;<7'-9 Ա#ǚ_X?rvX GI}\IߛOT4;k9T  %),+%'T \4ByY#"&'V% S#(a,J- +$m 1MFúͤ֯$#4Y#mһNʏ;_yO [\!$$x"^bP!"" C n-W3 z F#,]6<[?D=d6*{!*LtΏ$ZxI>Ku;lv͡ڟTC (5zw !4O4 hi y%{/0!L##" }"(`-F/,$4 4wÍ'Iz:.Ju1TU#ch3ϻЎ_C ##|#8DW1Rx ] !/v!'q.35d3t, U}ƲHcѽ34!74bK9UѢebb#$# tp" %%$"OGFr>ZyY Xhq !"I%)-27972) ۜ) qt}[[zx֞Ͻcͺ-8 $$ !ZfTO !l W4mO r`#(F.26998601w)WhVǼ̡=@Y &vԐ*E$y!$"K<!g$Z&&% "F >r8 v[bzflag-2.4.2+ds1/data/l10n/000077500000000000000000000000001200563112200151225ustar00rootroot00000000000000bzflag-2.4.2+ds1/data/l10n/ISO-639-2_values_8bits.txt000066400000000000000000000341271200563112200214720ustar00rootroot00000000000000aar||aa|Afar|afar abk||ab|Abkhazian|abkhaze ace|||Achinese|aceh ach|||Acoli|acoli ada|||Adangme|adangme ady|||Adyghe; Adygei|adygh afa|||Afro-Asiatic (Other)|afro-asiatiques, autres langues afh|||Afrihili|afrihili afr||af|Afrikaans|afrikaans aka||ak|Akan|akan akk|||Akkadian|akkadien alb|sqi|sq|Albanian|albanais alb|sqi|sq|Albanian|albanais ale|||Aleut|aloute alg|||Algonquian languages|algonquines, langues amh||am|Amharic|amharique ang|||English, Old (ca.450-1100)|anglo-saxon (ca.450-1100) apa|||Apache languages|apache ara||ar|Arabic|arabe arc|||Aramaic|aramen arg||an|Aragonese|aragonais arm|hye|hy|Armenian|armnien arm|hye|hy|Armenian|armnien arn|||Araucanian|araucan arp|||Arapaho|arapaho art|||Artificial (Other)|artificielles, autres langues arw|||Arawak|arawak asm||as|Assamese|assamais ast|||Asturian; Bable|asturien; bable ath|||Athapascan languages|athapascanes, langues aus|||Australian languages|australiennes, langues ava||av|Avaric|avar ave||ae|Avestan|avestique awa|||Awadhi|awadhi aym||ay|Aymara|aymara aze||az|Azerbaijani|azri bad|||Banda|banda bai|||Bamileke languages|bamilks, langues bak||ba|Bashkir|bachkir bal|||Baluchi|baloutchi bam||bm|Bambara|bambara ban|||Balinese|balinais baq|eus|eu|Basque|basque baq|eus|eu|Basque|basque bas|||Basa|basa bat|||Baltic (Other)|baltiques, autres langues bej|||Beja|bedja bel||be|Belarusian|bilorusse bem|||Bemba|bemba ben||bn|Bengali|bengali ber|||Berber (Other)|berbres, autres langues bho|||Bhojpuri|bhojpuri bih||bh|Bihari|bihari bik|||Bikol|bikol bin|||Bini|bini bis||bi|Bislama|bichlamar bla|||Siksika|blackfoot bnt|||Bantu (Other)|bantoues, autres langues bos||bs|Bosnian|bosniaque bra|||Braj|braj bre||br|Breton|breton btk|||Batak (Indonesia)|batak (Indonsie) bua|||Buriat|bouriate bug|||Buginese|bugi bul||bg|Bulgarian|bulgare bur|mya|my|Burmese|birman bur|mya|my|Burmese|birman byn|||Blin; Bilin|blin; bilen cad|||Caddo|caddo cai|||Central American Indian (Other)|indiennes d'Amrique centrale, autres langues car|||Carib|caribe cat||ca|Catalan; Valencian|catalan; valencien cau|||Caucasian (Other)|caucasiennes, autres langues ceb|||Cebuano|cebuano cel|||Celtic (Other)|celtiques, autres langues cha||ch|Chamorro|chamorro chb|||Chibcha|chibcha che||ce|Chechen|tchtchne chg|||Chagatai|djaghata chi|zho|zh|Chinese|chinois chi|zho|zh|Chinese|chinois chk|||Chuukese|chuuk chm|||Mari|mari chn|||Chinook jargon|chinook, jargon cho|||Choctaw|choctaw chp|||Chipewyan|chipewyan chr|||Cherokee|cherokee chu||cu|Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic|slavon d'glise; vieux slave; slavon liturgique; vieux bulgare chv||cv|Chuvash|tchouvache chy|||Cheyenne|cheyenne cmc|||Chamic languages|chames, langues cop|||Coptic|copte cor||kw|Cornish|cornique cos||co|Corsican|corse cpe|||Creoles and pidgins, English based (Other)|croles et pidgins anglais, autres cpf|||Creoles and pidgins, French-based (Other)|croles et pidgins franais, autres cpp|||Creoles and pidgins, Portuguese-based (Other)|croles et pidgins portugais, autres cre||cr|Cree|cree crh|||Crimean Tatar; Crimean Turkish|tatar de Crim crp|||Creoles and pidgins (Other)|croles et pidgins divers csb|||Kashubian|kachoube cus|||Cushitic (Other)|couchitiques, autres langues cze|ces|cs|Czech|tchque cze|ces|cs|Czech|tchque dak|||Dakota|dakota dan||da|Danish|danois dar|||Dargwa|dargwa day|||Dayak|dayak del|||Delaware|delaware den|||Slave (Athapascan)|esclave (athapascan) dgr|||Dogrib|dogrib din|||Dinka|dinka div||dv|Divehi|maldivien doi|||Dogri|dogri dra|||Dravidian (Other)|dravidiennes, autres langues dsb|||Lower Sorbian|bas-sorabe dua|||Duala|douala dum|||Dutch, Middle (ca.1050-1350)|nerlandais moyen (ca. 1050-1350) dut|nld|nl|Dutch; Flemish|nerlandais; flamand dut|nld|nl|Dutch; Flemish|nerlandais; flamand dyu|||Dyula|dioula dzo||dz|Dzongkha|dzongkha efi|||Efik|efik egy|||Egyptian (Ancient)|gyptien eka|||Ekajuk|ekajuk elx|||Elamite|lamite eng||en|English|anglais enm|||English, Middle (1100-1500)|anglais moyen (1100-1500) epo||eo|Esperanto|espranto est||et|Estonian|estonien ewe||ee|Ewe|w ewo|||Ewondo|wondo fan|||Fang|fang fao||fo|Faroese|froen fat|||Fanti|fanti fij||fj|Fijian|fidjien fin||fi|Finnish|finnois fiu|||Finno-Ugrian (Other)|finno-ougriennes, autres langues fon|||Fon|fon fre|fra|fr|French|franais frm|||French, Middle (ca.1400-1800)|franais moyen (1400-1800) fro|||French, Old (842-ca.1400)|franais ancien (842-ca.1400) fry||fy|Frisian|frison ful||ff|Fulah|peul fur|||Friulian|frioulan gaa|||Ga|ga gay|||Gayo|gayo gba|||Gbaya|gbaya gem|||Germanic (Other)|germaniques, autres langues geo|kat|ka|Georgian|gorgien geo|kat|ka|Georgian|gorgien ger|deu|de|German|allemand ger|deu|de|German|allemand gez|||Geez|guze gil|||Gilbertese|kiribati gla||gd|Gaelic; Scottish Gaelic|galique; galique cossais gle||ga|Irish|irlandais glg||gl|Gallegan|galicien glv||gv|Manx|manx; mannois gmh|||German, Middle High (ca.1050-1500)|allemand, moyen haut (ca. 1050-1500) goh|||German, Old High (ca.750-1050)|allemand, vieux haut (ca. 750-1050) gon|||Gondi|gond gor|||Gorontalo|gorontalo got|||Gothic|gothique grb|||Grebo|grebo grc|||Greek, Ancient (to 1453)|grec ancien (jusqu' 1453) gre|ell|el|Greek, Modern (1453-)|grec moderne (aprs 1453) gre|ell|el|Greek, Modern (1453-)|grec moderne (aprs 1453) grn||gn|Guarani|guarani guj||gu|Gujarati|goudjrati gwi|||Gwichin|gwichin hai|||Haida|haida hat||ht|Haitian; Haitian Creole|hatien; crole hatien hau||ha|Hausa|haoussa haw|||Hawaiian|hawaen heb||he|Hebrew|hbreu her||hz|Herero|herero hil|||Hiligaynon|hiligaynon him|||Himachali|himachali hin||hi|Hindi|hindi hit|||Hittite|hittite hmn|||Hmong|hmong hmo||ho|Hiri Motu|hiri motu hsb|||Upper Sorbian|haut-sorabe hun||hu|Hungarian|hongrois hup|||Hupa|hupa iba|||Iban|iban ibo||ig|Igbo|igbo ice|isl|is|Icelandic|islandais ice|isl|is|Icelandic|islandais ido||io|Ido|ido iii||ii|Sichuan Yi|yi de Sichuan ijo|||Ijo|ijo iku||iu|Inuktitut|inuktitut ile||ie|Interlingue|interlingue ilo|||Iloko|ilocano ina||ia|Interlingua (International Auxiliary Language Association)|interlingua (langue auxiliaire internationale) inc|||Indic (Other)|indo-aryennes, autres langues ind||id|Indonesian|indonsien ine|||Indo-European (Other)|indo-europennes, autres langues inh|||Ingush|ingouche ipk||ik|Inupiaq|inupiaq ira|||Iranian (Other)|iraniennes, autres langues iro|||Iroquoian languages|iroquoises, langues (famille) ita||it|Italian|italien jav||jv|Javanese|javanais jbo|||Lojban|lojban jpn||ja|Japanese|japonais jpr|||Judeo-Persian|judo-persan jrb|||Judeo-Arabic|judo-arabe kaa|||Kara-Kalpak|karakalpak kab|||Kabyle|kabyle kac|||Kachin|kachin kal||kl|Kalaallisut; Greenlandic|groenlandais kam|||Kamba|kamba kan||kn|Kannada|kannada kar|||Karen|karen kas||ks|Kashmiri|kashmiri kau||kr|Kanuri|kanouri kaw|||Kawi|kawi kaz||kk|Kazakh|kazakh kbd|||Kabardian|kabardien kha|||Khasi|khasi khi|||Khoisan (Other)|khoisan, autres langues khm||km|Khmer|khmer kho|||Khotanese|khotanais kik||ki|Kikuyu; Gikuyu|kikuyu kin||rw|Kinyarwanda|rwanda kir||ky|Kirghiz|kirghize kmb|||Kimbundu|kimbundu kok|||Konkani|konkani kom||kv|Komi|kom kon||kg|Kongo|kongo kor||ko|Korean|coren kos|||Kosraean|kosrae kpe|||Kpelle|kpell krc|||Karachay-Balkar|karatcha balkar kro|||Kru|krou kru|||Kurukh|kurukh kua||kj|Kuanyama; Kwanyama|kuanyama; kwanyama kum|||Kumyk|koumyk kur||ku|Kurdish|kurde kut|||Kutenai|kutenai lad|||Ladino|judo-espagnol lah|||Lahnda|lahnda lam|||Lamba|lamba lao||lo|Lao|lao lat||la|Latin|latin lav||lv|Latvian|letton lez|||Lezghian|lezghien lim||li|Limburgan; Limburger; Limburgish|limbourgeois lin||ln|Lingala|lingala lit||lt|Lithuanian|lituanien lol|||Mongo|mongo loz|||Lozi|lozi ltz||lb|Luxembourgish; Letzeburgesch|luxembourgeois lua|||Luba-Lulua|luba-lulua lub||lu|Luba-Katanga|luba-katanga lug||lg|Ganda|ganda lui|||Luiseno|luiseno lun|||Lunda|lunda luo|||Luo (Kenya and Tanzania)|luo (Kenya et Tanzanie) lus|||lushai|Lushai mac|mkd|mk|Macedonian|macdonien mac|mkd|mk|Macedonian|macdonien mad|||Madurese|madourais mag|||Magahi|magahi mah||mh|Marshallese|marshall mai|||Maithili|maithili mak|||Makasar|makassar mal||ml|Malayalam|malayalam man|||Mandingo|mandingue mao|mri|mi|Maori|maori mao|mri|mi|Maori|maori map|||Austronesian (Other)|malayo-polynsiennes, autres langues mar||mr|Marathi|marathe mas|||Masai|massa may|msa|ms|Malay|malais may|msa|ms|Malay|malais mdf|||Moksha|moksa mdr|||Mandar|mandar men|||Mende|mend mga|||Irish, Middle (900-1200)|irlandais moyen (900-1200) mic|||Micmac|micmac min|||Minangkabau|minangkabau mis|||Miscellaneous languages|diverses, langues mkh|||Mon-Khmer (Other)|mn-khmer, autres langues mlg||mg|Malagasy|malgache mlt||mt|Maltese|maltais mnc|||Manchu|mandchou mni|||Manipuri|manipuri mno|||Manobo languages|manobo, langues moh|||Mohawk|mohawk mol||mo|Moldavian|moldave mon||mn|Mongolian|mongol mos|||Mossi|mor mul|||Multiple languages|multilingue mun|||Munda languages|mounda, langues mus|||Creek|muskogee mwr|||Marwari|marvari myn|||Mayan languages|maya, langues myv|||Erzya|erza nah|||Nahuatl|nahuatl nai|||North American Indian|indiennes d'Amrique du Nord, autres langues nap|||Neapolitan|napolitain nau||na|Nauru|nauruan nav||nv|Navajo; Navaho|navaho nbl||nr|Ndebele, South; South Ndebele|ndbl du Sud nde||nd|Ndebele, North; North Ndebele|ndbl du Nord ndo||ng|Ndonga|ndonga nds|||Low German; Low Saxon; German, Low; Saxon, Low|bas allemand; bas saxon; allemand, bas; saxon, bas nep||ne|Nepali|npalais new|||Newari|newari nia|||Nias|nias nic|||Niger-Kordofanian (Other)|nigro-congolaises, autres langues niu|||Niuean|niu nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvgien nynorsk; nynorsk, norvgien nob||nb|Norwegian Bokml; Bokml, Norwegian|norvgien bokml; bokml, norvgien nog|||Nogai|noga; nogay non|||Norse, Old|norrois, vieux nor||no|Norwegian|norvgien nso|||Sotho, Northern|sotho du Nord nub|||Nubian languages|nubiennes, langues nya||ny|Chichewa; Chewa; Nyanja|chichewa; chewa; nyanja nym|||Nyamwezi|nyamwezi nyn|||Nyankole|nyankol nyo|||Nyoro|nyoro nzi|||Nzima|nzema oci||oc|Occitan (post 1500); Provenal|occitan (aprs 1500); provenal oji||oj|Ojibwa|ojibwa ori||or|Oriya|oriya orm||om|Oromo|galla osa|||Osage|osage oss||os|Ossetian; Ossetic|osste ota|||Turkish, Ottoman (1500-1928)|turc ottoman (1500-1928) oto|||Otomian languages|otomangue, langues paa|||Papuan (Other)|papoues, autres langues pag|||Pangasinan|pangasinan pal|||Pahlavi|pahlavi pam|||Pampanga|pampangan pan||pa|Panjabi; Punjabi|pendjabi pap|||Papiamento|papiamento pau|||Palauan|palau peo|||Persian, Old (ca.600-400 B.C.)|perse, vieux (ca. 600-400 av. J.-C.) per|fas|fa|Persian|persan per|fas|fa|Persian|persan phi|||Philippine (Other)|philippines, autres langues phn|||Phoenician|phnicien pli||pi|Pali|pali pol||pl|Polish|polonais pon|||Pohnpeian|pohnpei por||pt|Portuguese|portugais pra|||Prakrit languages|prkrit pro|||Provenal, Old (to 1500)|provenal ancien (jusqu' 1500) pus||ps|Pushto|pachto que||qu|Quechua|quechua raj|||Rajasthani|rajasthani rap|||Rapanui|rapanui rar|||Rarotongan|rarotonga roa|||Romance (Other)|romanes, autres langues roh||rm|Raeto-Romance|rhto-roman rom|||Romany|tsigane rum|ron|ro|Romanian|roumain run||rn|Rundi|rundi rus||ru|Russian|russe sad|||Sandawe|sandawe sag||sg|Sango|sango sah|||Yakut|iakoute sai|||South American Indian (Other)|indiennes d'Amrique du Sud, autres langues sal|||Salishan languages|salish, langues sam|||Samaritan Aramaic|samaritain san||sa|Sanskrit|sanskrit sas|||Sasak|sasak sat|||Santali|santal scc|srp|sr|Serbian|serbe scc|srp|sr|Serbian|serbe sco|||Scots|cossais scr|hrv|hr|Croatian|croate scr|hrv|hr|Croatian|croate sel|||Selkup|selkoupe sem|||Semitic (Other)|smitiques, autres langues sga|||Irish, Old (to 900)|irlandais ancien (jusqu' 900) sgn|||Sign Languages|langues des signes shn|||Shan|chan sid|||Sidamo|sidamo sin||si|Sinhalese|singhalais sio|||Siouan languages|sioux, langues sit|||Sino-Tibetan (Other)|sino-tibtaines, autres langues sla|||Slavic (Other)|slaves, autres langues slo|slk|sk|Slovak|slovaque slv||sl|Slovenian|slovne sma|||Southern Sami|sami du Sud sme||se|Northern Sami|sami du Nord smi|||Sami languages (Other)|sami, autres langues smj|||Lule Sami|sami de Lule smn|||Inari Sami|sami d'Inari smo||sm|Samoan|samoan sms|||Skolt Sami|sami skolt sna||sn|Shona|shona snd||sd|Sindhi|sindhi snk|||Soninke|sonink sog|||Sogdian|sogdien som||so|Somali|somali son|||Songhai|songhai sot||st|Sotho, Southern|sotho du Sud spa||es|Spanish; Castilian|espagnol; castillan srd||sc|Sardinian|sarde srr|||Serer|srre ssa|||Nilo-Saharan (Other)|nilo-sahariennes, autres langues ssw||ss|Swati|swati suk|||Sukuma|sukuma sun||su|Sundanese|soundanais sus|||Susu|soussou sux|||Sumerian|sumrien swa||sw|Swahili|swahili swe||sv|Swedish|sudois syr|||Syriac|syriaque tah||ty|Tahitian|tahitien tai|||Tai (Other)|thaes, autres langues tam||ta|Tamil|tamoul tat||tt|Tatar|tatar tel||te|Telugu|tlougou tem|||Timne|temne ter|||Tereno|tereno tet|||Tetum|tetum tgk||tg|Tajik|tadjik tgl||tl|Tagalog|tagalog tha||th|Thai|tha tib|bod|bo|Tibetan|tibtain tib|bod|bo|Tibetan|tibtain tig|||Tigre|tigr tir||ti|Tigrinya|tigrigna tiv|||Tiv|tiv tkl|||Tokelau|tokelau tli|||Tlingit|tlingit tmh|||Tamashek|tamacheq tog|||Tonga (Nyasa)|tonga (Nyasa) ton||to|Tonga (Tonga Islands)|tongan (les Tonga) tpi|||Tok Pisin|tok pisin tsi|||Tsimshian|tsimshian tsn||tn|Tswana|tswana tso||ts|Tsonga|tsonga tuk||tk|Turkmen|turkmne tum|||Tumbuka|tumbuka tup|||Tupi languages|tupi, langues tur||tr|Turkish|turc tut|||Altaic (Other)|altaques, autres langues tvl|||Tuvalu|tuvalu twi||tw|Twi|twi tyv|||Tuvinian|touva udm|||Udmurt|oudmourte uga|||Ugaritic|ougaritique uig||ug|Uighur|ougour ukr||uk|Ukrainian|ukrainien umb|||Umbundu|umbundu und|||Undetermined|indtermine urd||ur|Urdu|ourdou uzb||uz|Uzbek|ouszbek vai|||Vai|va ven||ve|Venda|venda vie||vi|Vietnamese|vietnamien vol||vo|Volapk|volapk vot|||Votic|vote wak|||Wakashan languages|wakashennes, langues wal|||Walamo|walamo war|||Waray|waray was|||Washo|washo wel|cym|cy|Welsh|gallois wel|cym|cy|Welsh|gallois wen|||Sorbian languages|sorabes, langues wln||wa|Walloon|wallon wol||wo|Wolof|wolof xal|||Kalmyk|kalmouk xho||xh|Xhosa|xhosa yao|||Yao|yao yap|||Yapese|yapois yid||yi|Yiddish|yiddish yor||yo|Yoruba|yoruba ypk|||Yupik languages|yupik, langues zap|||Zapotec|zapotque zen|||Zenaga|zenaga zha||za|Zhuang; Chuang|zhuang; chuang znd|||Zande|zand zul||zu|Zulu|zoulou zun|||Zuni|zuni bzflag-2.4.2+ds1/data/l10n/Makefile.am000066400000000000000000000005511200563112200171570ustar00rootroot00000000000000l10ndir = $(pkgdatadir)/l10n dist_l10n_DATA = \ bzflag_cs_CZ.po \ bzflag_da.po \ bzflag_de.po \ bzflag_en_US_l33t.po \ bzflag_en_US_redneck.po \ bzflag_es.po \ bzflag_fr.po \ bzflag_it.po \ bzflag_kg.po \ bzflag_lt.po \ bzflag_nl.po \ bzflag_pt.po \ bzflag_sv.po \ bzflag_xx.po \ ISO-639-2_values_8bits.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/data/l10n/Makefile.in000066400000000000000000000321041200563112200171670ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = data/l10n DIST_COMMON = $(dist_l10n_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(l10ndir)" DATA = $(dist_l10n_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ l10ndir = $(pkgdatadir)/l10n dist_l10n_DATA = \ bzflag_cs_CZ.po \ bzflag_da.po \ bzflag_de.po \ bzflag_en_US_l33t.po \ bzflag_en_US_redneck.po \ bzflag_es.po \ bzflag_fr.po \ bzflag_it.po \ bzflag_kg.po \ bzflag_lt.po \ bzflag_nl.po \ bzflag_pt.po \ bzflag_sv.po \ bzflag_xx.po \ ISO-639-2_values_8bits.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/l10n/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu data/l10n/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_l10nDATA: $(dist_l10n_DATA) @$(NORMAL_INSTALL) test -z "$(l10ndir)" || $(MKDIR_P) "$(DESTDIR)$(l10ndir)" @list='$(dist_l10n_DATA)'; test -n "$(l10ndir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(l10ndir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(l10ndir)" || exit $$?; \ done uninstall-dist_l10nDATA: @$(NORMAL_UNINSTALL) @list='$(dist_l10n_DATA)'; test -n "$(l10ndir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(l10ndir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(l10ndir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(l10ndir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dist_l10nDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_l10nDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dist_l10nDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-dist_l10nDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/data/l10n/bzflag_cs_CZ.po000066400000000000000000001371001200563112200200120ustar00rootroot00000000000000# Preklad bzflagu do Cestiny by Pavel Lobodinsky, 7.5.2004, pro verzi 1.10.4 # Translation of bzflag to Czech by Pavel Lobodinsky, 05/07/2004, for version 1.10.4 msgid "Not available" msgstr "Nedostupny" msgid "xx" msgstr "Zaklad prekladu" msgid "translator" msgstr "Pavel Lobodinsky" # Globalni volby # Global options msgid "On" msgstr "Zapnuto" msgid "on" msgstr "Zapnuto" msgid "Off" msgstr "Vypnuto" msgid "off" msgstr "Vypnuto" msgid "yes" msgstr "ano" msgid "no" msgstr "ne" msgid "no limit" msgstr "bez limitu" msgid "Page {1} of {2}" msgstr "Strana {1} z {2}" # Hlavni menu # Main menu msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Sipky nahoru/dolu pro pohyb, Enter pro vybrani, Esc pro zruseni" msgid "Join Game" msgstr "Hrat" msgid "Find Server" msgstr "Nalezt server" msgid "Servers" msgstr "Servery" msgid "Players" msgstr "Hraci" #msgid "Rogue" # Jiz definovano ve volbe Tymu #msgstr "Zli" # Already defined in Team option msgid "Red" msgstr "Cerveny" msgid "Green" msgstr "Zeleny" msgid "Blue" msgstr "Modry" msgid "Purple" msgstr "Purpurovy" msgid "Observers" msgstr "Pozorovatele" msgid "Connect" msgstr "Pripojit se" msgid "Trying..." msgstr "Zkousim..." msgid "Callsign:" msgstr "Prezdivka:" msgid "Team:" msgstr "Tym:" msgid "Rogue" msgstr "Zli" msgid "Red Team" msgstr "Cerveny tym" msgid "Green Team" msgstr "Zeleny tym" msgid "Blue Team" msgstr "Modry tym" msgid "Purple Team" msgstr "Purpurovy tym" msgid "Observer" msgstr "Pozorovatel" msgid "Automatic" msgstr "Automaticky" msgid "Server:" msgstr "Server:" msgid "Port:" msgstr "Port:" msgid "Motto:" msgstr "Motto:" msgid "Start Server" msgstr "Start serveru" msgid "Style:" msgstr "Typ hry:" msgid "Free for All" msgstr "volna-pro-vsechny" msgid "Capture the Flag" msgstr "ziskani-vlajky" msgid "Rabbit Hunt" msgstr "honba-na-kralika" msgid "Max Players:" msgstr "Max. pocet hracu:" msgid "Max Shots:" msgstr "Max. pocet vystrelu najednou:" msgid "Teleporters:" msgstr "Teleporty:" msgid "Ricochet:" msgstr "Odrazeni strel:" msgid "Jumping:" msgstr "Skakani:" msgid "Superflags:" msgstr "Super vlajky:" msgid "all flags" msgstr "vsechny vlajky" msgid "good flags only" msgstr "jen dobre vlajky" msgid "Max Superflags:" msgstr "Max. pocet super vlajek:" msgid "Bad Flag Antidote:" msgstr "Povolena anti-vlajka:" msgid "Bad Flag Time Limit:" msgstr "Cas do zahozeni spatne vlajky:" msgid "15 seconds" msgstr "15 sekund" msgid "30 seconds" msgstr "30 sekund" msgid "60 seconds" msgstr "60 sekund" msgid "180 seconds" msgstr "180 sekund" msgid "Bad Flag Win Limit:" msgstr "Pocet vitezstvi do zahozeni spatne vlajky:" msgid "drop after 1 win" msgstr "zahodit po 1 vitezstvi" msgid "drop after 2 wins" msgstr "zahodit po 2 vitezstvich" msgid "drop after 3 wins" msgstr "zahodit po 3 vitezstvich" msgid "Game Over:" msgstr "Konec hry:" msgid "never" msgstr "nikdy" msgid "after 5 minutes" msgstr "po 5 minutach" msgid "after 15 minutes" msgstr "po 15 minutach" msgid "after 60 minutes" msgstr "po 60 minutach" msgid "after 3 hours" msgstr "po 3 hodinach" msgid "when a player gets +3" msgstr "az hrac dosahne +3 bodu" msgid "when a player gets +10" msgstr "az hrac dosahne +10 bodu" msgid "when a player gets +25" msgstr "az hrac dosahne +25 bodu" msgid "when a team gets +3" msgstr "az tym dosahne +3 bodu" msgid "when a team gets +10" msgstr "az tym dosahne +10 bodu" msgid "when a team gets +25" msgstr "az tym dosahne +25 bodu" msgid "when a team gets +100" msgstr "az tym dosahne +100 bodu" msgid "Server Reset:" msgstr "Reset serveru:" msgid "no, quit after game" msgstr "ne, ukonci po hre" msgid "yes, reset for more games" msgstr "ano, reset pro dalsi hry" msgid "World Map:" msgstr "Mapa:" msgid "random map" msgstr "nahodna mapa" msgid "Options" msgstr "Nastaveni" msgid "Dithering:" msgstr "Rozkladani (Dithering):" msgid "Blending:" msgstr "Smesovani (Blending):" msgid "Smoothing:" msgstr "Vyhlazovani (Smoothing):" msgid "Lighting:" msgstr "Osvetleni (Lighting):" msgid "Texturing:" msgstr "Textury (Texturing):" msgid "Nearest" msgstr "Nejblizsi" msgid "Linear" msgstr "Linearni" msgid "Nearest Mipmap Nearest" msgstr "Nejblize Nearest Mipmap" msgid "Linear Mipmap Nearest" msgstr "Linearni Nearest Mipmap" msgid "Nearest Mipmap Linear" msgstr "Nejblize Linear Mipmap" msgid "Linear Mipmap Linear" msgstr "Linearni Linear Minimap" msgid "Quality:" msgstr "Kvalita:" msgid "Low" msgstr "Nizka" msgid "Medium" msgstr "Stredni" msgid "High" msgstr "Vysoka" msgid "Experimental" msgstr "Experimentalni" msgid "Shadows:" msgstr "Stiny:" msgid "Depth Buffer:" msgstr "Hloubkovy buffer:" msgid "Change Video Format" msgstr "Zmena video formatu" msgid "Video Format" msgstr "Video format" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Stiskni Enter pro vybrani a T pro test formatu. Esc pro konec." msgid "Current Format:" msgstr "Aktualni format:" msgid "Brightness:" msgstr "Jas:" msgid "Sound Volume:" msgstr "Hlasitost zvuku:" msgid "UDP network connection:" msgstr "UDP sitove spojeni:" msgid "Server List Cache:" msgstr "List Cache serveru:" msgid "Off / Backup Mode" msgstr "Vypnuto / Zalozni mod" msgid "5 Minutes" msgstr "5 minut" msgid "15 Minutes" msgstr "15 minut" msgid "30 Minutes" msgstr "30 minut" msgid "1 Hour" msgstr "1 hodina" msgid "5 Hours" msgstr "5 hodin" msgid "15 Hours" msgstr "15 hodin" msgid "1 day" msgstr "1 den" msgid "15 days" msgstr "15 dnu" msgid "30 days" msgstr "30 dnu" msgid "Clear Server List Cache" msgstr "Smazani List Cache serveru" msgid "Change Key Mapping" msgstr "Nastaveni klaves" msgid "Use up/down arrows to navigate, enter key to enter edit mode" msgstr "Sipky nahoru/dolu pro pohyb, Enter pro editaci" msgid "Key Mapping" msgstr "Nastaveni klaves" msgid "Reset Defaults" msgstr "Reset nastaveni" msgid "Fire shot:" msgstr "Strelba:" msgid "Drop flag:" msgstr "Zahodit vlajku:" msgid "Identify/Lock On:" msgstr "Identifikovat/Zamerit:" msgid "Radar Short:" msgstr "Maly dosah radaru:" msgid "Radar Medium:" msgstr "Stredni dosah radaru:" msgid "Radar Long:" msgstr "Velky dosah radaru:" msgid "Send to All" msgstr "Zaslat zpravu vsem" msgid "Send to All:" msgstr "Zaslat zpravu vsem:" msgid "Send to Teammates:" msgstr "Zaslat zpravu tymu:" msgid "Send to Team" msgstr "Zaslat zpravu tymu" msgid "Send to Nemesis:" msgstr "Zaslat zpravu nemesis:" msgid "Send to Recipient:" msgstr "Zaslat zpravu prijemci:" msgid "Jump:" msgstr "Skok:" msgid "Binoculars:" msgstr "Dalekohled:" msgid "Toggle Score:" msgstr "Zobrazeni skore:" msgid "Tank Labels:" msgstr "Nazvy tanku:" msgid "Flag Help:" msgstr "Napoveda k vlajkam:" msgid "Time Forward:" msgstr "Posun casu vpred:" msgid "Time Backward:" msgstr "Posun casu zpet:" msgid "Pause/Resume:" msgstr "Pauza/Pokracovat:" msgid "Self Destruct/Cancel:" msgstr "Sebezniceni/Zruseni:" msgid "SelfDestruct/Cancel:" msgstr "Sebezniceni/Zruseni:" msgid "Fast Quit:" msgstr "Rychle opustit hru:" msgid "Scroll Backward:" msgstr "Posuv zaznamu zprav zpet:" msgid "Scroll Forward:" msgstr "Posuv zaznamu zprav vpred:" msgid "Slow Keyboard Motion:" msgstr "Pomaly posuv tanku:" msgid "Toggle Radar Flags:" msgstr "Zobrazit vlajky na radaru:" msgid "Toggle Main Flags:" msgstr "Zobrazit vlaky pred sebou:" msgid "Silence/UnSilence Key:" msgstr "Umlceni/Odmlceni hrace:" msgid "Server Command Key:" msgstr "Prikaz serveru:" msgid "Hunt Key:" msgstr "Pronasledovani:" msgid "AutoPilot Key: " msgstr "Autopilot:" msgid "Define Quick Keys" msgstr "Definovat rychle klavesy" msgid "Notice: depending on platform not all keys might work" msgstr "Upozorneni: v zavislosti na platforme nemusi fungovat vsechny klavesy" msgid "GUI Options" msgstr "Nastaveni grafickeho rozhrani" msgid "Enhanced radar:" msgstr "Rozsireny radar:" msgid "Controlpanel & Score FontSize:" msgstr "Velikost fontu ovladaciho panelu a skore:" msgid "normal" msgstr "Normalni" msgid "bigger" msgstr "Vetsi" msgid "Radar & Panel Opacity:" msgstr "Pruhlednost radaru a panelu:" msgid "Colored shots on radar:" msgstr "Barevne strely na radaru:" msgid "Radar Shot Length:" msgstr "Delka strely na radaru:" msgid "Radar Shot Size:" msgstr "Velikost strely na radaru:" msgid "Radar & Panel Size:" msgstr "Velikost radaru a panelu:" msgid "Mouse Box Size:" msgstr "Velikost ovladaciho prostoru mysi:" msgid "Save World" msgstr "Ulozeni mapy" msgid "File Name:" msgstr "Nazev souboru:" msgid "Help" msgstr "Napoveda" msgid "Quit" msgstr "Konec" msgid "Page Down for next page" msgstr "Page Down pro dalsi stranu" msgid "Page Up for previous page" msgstr "Page Up pro predchozi stranu" msgid "Enter to quit, Esc to resume" msgstr "Enter pro ukonceni, Esc pro pokracovani" msgid "Really quit?" msgstr "Opravdu chces skoncit?" msgid "loading {1}" msgstr "nacitam {1}" msgid "Controls Tank Position:" msgstr "Ovladani tanku:" msgid "Mouse Position" msgstr "Pozice mysi" msgid "Fires Shot:" msgstr "Strelba:" msgid "Drops Flag (if not bad):" msgstr "Zahodi vlajku (neni-li spatna):" msgid "Identifies Player (locks on GM):" msgstr "Identifikuje hrace (zamereni Rizene strely):" msgid "Short Radar Range:" msgstr "Maly dosah radaru:" msgid "Medium Radar Range:" msgstr "Stredni dosah radaru:" msgid "Long Radar Range:" msgstr "Velky dosah radaru:" msgid "Send Message to Everybody:" msgstr "Zaslat zpravu vsem" msgid "Send Message to Teammates:" msgstr "Zaslat zpravu tymu:" msgid "Send Message to Nemesis:" msgstr "Zaslat zpravu nemesis:" msgid "Send Message to Recipient:" msgstr "Zaslat zpravu prijemci:" msgid "Jump (if allowed):" msgstr "Skok (je-li povolen):" msgid "Toggle Binoculars:" msgstr "Dalekohled:" msgid "Toggle Score Sheet:" msgstr "Tabulka se skore:" msgid "Toggle Tank Labels:" msgstr "Popis tanku:" msgid "Toggle Heads-up Flag Help:" msgstr "Zobrazeni napovedy k vlajkam:" msgid "Set Time of Day Backward:" msgstr "Posun casu zpet:" msgid "Set Time of Day Forward:" msgstr "Posun casu vpred:" msgid "Self destruct/Cancel:" msgstr "Sebezniceni/Zruseni:" msgid "Quit:" msgstr "Konec:" msgid "Scroll Message Log Backward:" msgstr "Posuv zaznamu zprav zpet:" msgid "Scroll Message Log Forward:" msgstr "Posuv aznamu zprav vpred:" msgid "Silence/UnSilence:" msgstr "Umlceni/Odmlceni hrace:" msgid "Show/Dismiss menu:" msgstr "Ukaz/opust menu:" msgid "Server Admin:" msgstr "Admin serveru:" msgid "Hunt:" msgstr "Pronasledovani:" msgid "Auto Pilot:" msgstr "Autopilot:" msgid "Esc:" msgstr "Esc:" msgid "Maintainer:" msgstr "Udrzba programu:" msgid "Original Author:" msgstr "Puvodni autor:" msgid "Code Contributors:" msgstr "Programatori:" msgid "Tank Models:" msgstr "Modely Tanku:" msgid "Special Thanks:" msgstr "Specialni diky:" msgid "BZFlag Home Page:" msgstr "Domovska stranka BZFlagu:" msgid "Send:" msgstr "Zaslat:" msgid "Controls" msgstr "Ovladani" msgid "General" msgstr "Hlavni" msgid "Environment" msgstr "Prostredi" msgid "Flags I" msgstr "Vlajky I" msgid "Flags II" msgstr "Vlajky II" msgid "Flags III" msgstr "Vlajky III" msgid "Readouts I" msgstr "Vystupy I" msgid "Readouts II" msgstr "Vystupy II" msgid "Credits" msgstr "Credits" msgid "Free-style" msgstr "Volny-styl" msgid "Capture-the-Flag" msgstr "Ziskani-vlajky" msgid "Super Flags" msgstr "Super vlajky" msgid "Antidote Flags" msgstr "Anti-spatne vlajky" msgid "Press %s to start" msgstr "Stiskni %s pro start" msgid "Dead" msgstr "Mrtev" msgid "%.1f" msgstr "%.1f" msgid "Ready" msgstr "Pripraven" msgid "Rabbit Chase" msgstr "Hon na kralika" msgid "Reloaded in %.1f" msgstr "Nabiti za %.1f" msgid "Sealed" msgstr "Uzamceny" msgid "Zoned" msgstr "Prizrak" msgid "Servers found: {1}" msgstr "Nalezene servery: {1}" msgid "{1} Shot" msgstr "{1} strela" msgid "{1} Shots" msgstr "{1} strely" msgid "{1} sec To Drop Bad Flag" msgstr "{1} sekunda do zahozeni spatne vlajky" msgid "{1} secs To Drop Bad Flag" msgstr "{1} sekund do zahozeni spatne vlajky" msgid "{1} Win Drops Bad Flag" msgstr "{1} vitezstvi do zahozeni spatne vlajky" msgid "{1} Wins Drops Bad Flag" msgstr "{1} vitezstvi do zahozeni spatne vlajky" msgid "You are now the rabbit." msgstr "Nyni jsi kralik." msgid "Time limit: {1}" msgstr "Casovy limit: {1}" msgid "Max team score: {1}" msgstr "Maximalni skore tymu: {1}" msgid "Max player score: {1}" msgstr "Maximalni skore hrace: {1}" msgid "openBroadcast: No udp service {1}" msgstr "openBroadcast: Zadna UDP sluzba {1}" msgid "joystick '{1}' not supported..." msgstr "joystick '{1}' nepodporovan..." msgid "Ignoring Finder argument '{1}'" msgstr "Ignoruji argument vyhledavace '{1}'" msgid "Can't open list server: {1}" msgstr "Nemohu otervit list server: {1}" msgid "Server sent downlink endpoint information, port {1}" msgstr "Server zaslal informaci o sestupnem koncovem bodu, port {1}" msgid "Communication error joining game [Wrong Code {1}]." msgstr "Chyba komunikace pri pripojovani hry [spatny kod {1}]." msgid "Configuration file: Error on line {1}: Stream failure" msgstr "Konfiguracni soubor: Chyba na radku {1}: Selhani streamu" msgid "Configuration file: Error on line {1}: Line too long" msgstr "Konfiguracni soubor: Chyba na radku {1}: Radek je prilis dlouhy" msgid "Network: Created local UDP downlink port {1}" msgstr "Sit: Vytvoren lokalni UDP downlink port {1}" msgid "Server did send endpoint information, UDP connection up" msgstr "Server zaslal informaci o koncovem bode, UDP spojeni zapnuto" msgid "More Info: [{1}:{2}:{3}]" msgstr "Vice informaci: [{1}:{2}:{3}]" msgid "cannot load texture: {1}" msgstr "Nemohu nacist texturu: {1}" msgid "Connection failed." msgstr "Spojeni selhalo." msgid "Server forced a disconnect" msgstr "Server vynutil odpojeni" msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" msgstr "Server zaslal UDP pozadavek, UDP informace: [{1}:{2}:{3}]" msgid "Rogues not allowed. Try another team." msgstr "Zli nejsou dovoleni. Zkus jiny tym." msgid "This team is full. Try another team." msgstr "Tento tym je obsazen. Zkus jiny tym." msgid "This game is full. Try again later." msgstr "Tato hra je obsazena. Zkus to pozdeji." msgid "Game is full or over. Try again later." msgstr "Hra je obsazena nebo ukoncena. Zkus to pozdeji." msgid "Error connecting to server." msgstr "Chyba spojeni se serverem" msgid "msgid " msgstr "id zpravy" msgid "Error downloading world database" msgstr "Chyba pri stahovani databaze map" msgid "Score" msgstr "Skore" msgid "Kills" msgstr "Zabitych" msgid "Team Score" msgstr "Skore tymu" msgid "Player" msgstr "Hrac" msgid "Locale:" msgstr "Jazyk:" # Super Flags msgid "High Speed" msgstr "Vysoka rychlost" msgid "Quick Turn" msgstr "Rychle otaceni" msgid "Oscillation Overthruster" msgstr "Projizdeni budovami" msgid "Rapid Fire" msgstr "Rychla strelba" msgid "Machine Gun" msgstr "Kulomet" msgid "Guided Missile" msgstr "Rizena strela" msgid "Laser" msgstr "Laser" msgid "Ricochet" msgstr "Odrazeni strel" msgid "Super Bullet" msgstr "Super strela" msgid "Invisible Bullet" msgstr "Neviditelna strela" msgid "Stealth" msgstr "Stealth" msgid "Tiny" msgstr "Maly tank" msgid "Narrow" msgstr "Tenky tank" msgid "Shield" msgstr "Stit" msgid "Steamroller" msgstr "Parni valec" msgid "Shock Wave" msgstr "Niciva vlna" msgid "Phantom Zone" msgstr "Prizrak" msgid "Genocide" msgstr "Genocida" msgid "Jumping" msgstr "Skakani" msgid "Identify" msgstr "Identifikace" msgid "Cloaking" msgstr "Zahaleni" msgid "Colorblindness" msgstr "Barvoslepost" msgid "Obesity" msgstr "Obezita" msgid "Left Turn Only" msgstr "Otaceni pouze vlevo" msgid "Right Turn Only" msgstr "Otaceni pouze vpravo" msgid "Momentum" msgstr "Setrvacnost" msgid "Blindness" msgstr "Slepota" msgid "Jamming" msgstr "Ruseni radaru" msgid "Wide Angle" msgstr "Siroky uhel" # Flag help msgid "You have no flag." msgstr "Nemas zadnou vlajku." msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Vlajka tveho tymu: zabran dalsim tymum, aby ji zabrali!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Vlajka protihrace: vezmi ji do tve zakladny, aby jsi ji zabral!" msgid "High Speed (+V): Tank moves faster. Outrun bad guys." msgstr "Vysoka rychlost (+V): Tank se pohybuje rychleji. Utec zlym hochum." msgid "Angular velocity (+A): Tank turns faster. Good for dodging." msgstr "Rychle otaceni (+A): Tak se otaci rychleji. Dobre se uhyba." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Projizdeni budovami (+OO): Lze prochazet budovami. V budovach nelze jez zpet, skakat, nebo strilet." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Rychla strelba (+F): Strili casteji. Strely leti rychleji, ale ne tak daleko." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Kulomet (+MG): Velmi rychle nabijeni a velmi kratky dosah." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Rizena strela (+GM): Sestreli cil po draze. Zamer pravym tl. mysi. Lze zamerovat i po vystrelu za letu strely." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Strili laser. Nekonecna rychlost a dosah, ale dlouhy cas nabijeni." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Odrazeni strel (+R): Strely se odrazeji od sten. Nesejmi sam sebe!" msgid "SEer (+SE): See stealthed, cloaked and masquerading tanks as normal." msgstr "Jasnovidec (+SE): Vidi skryte, zahalene a maskovane tanky jako normalni." msgid "MasQuerade (+MQ): In opponent's hud, you appear as a teammate." msgstr "Maskovani (+MQ): Na obrazovce protihrace vypadas jako hrac z jeho tymu." msgid "Useless" msgstr "Zbytecny" msgid "Thief" msgstr "Zlodej" msgid "Masquerade" msgstr "Maskovani" msgid "Seer" msgstr "Jasnovidec" msgid "Burrow" msgstr "Zahrabani" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flies an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super strela (+SB): Strely prochazeji stenami. Lze zabit Prizrak." msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" msgstr "Tymova vlajka: Je-li tva, zabran ostatnim tymum, aby ji zabrali. Neni-li tva, vezmi ji do sve zakladny, aby jsi ji zabral!" msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Neviditelna strela (+IB): Tve strely nebudou videt na radarech ostatnich tanku. Stale je vsak lze videt pred sebou." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Stealth (+ST): Tank nejde videt na radaru. Strely jsou videt stale. Propliz se mezi nepratele!" msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Maly tank (+T): Tank je maly a muze prochazet pres male otvory. Je velmi tezke jej zasahnout." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Tenky tank (+N): Tank je super tenky. Je velmi tezke jej zasahnout zepredu, nebo zezadu, ale z boku ma normalni velikost. Muze prochazet pres male otvory." msgid "SHield (+SH): Getting hit only drops flag. Flag flies an extra-long time." msgstr "Stit (+SH): Zasazenim je pouze zahozena vlajka. Vlajka leta velmi dlouho." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Parni valec (+SR): Znici tank, ktereho se dotknes, ale musis byt opravdu blizko." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Niciva vlna (+SW): Strilenim se znici vsechny blizke tanky. Nezabij tanky z tveho tymu! Lze znicit tanky v/na budovach." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Prizrak (+PZ): Prujezdem teleportu se tank stane prizrakem. Tank pak muze projizdet skrz budovy. Pokud je tank prizrakem, nelze strilet, nebo byt sestrelen (vyjma tanku s vlajkami Super Strela a Niciva vlna)." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Genocida (+G): Znicenim jednoho tanku se znici vsechny tanky v jeho tymu." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Skakani (+JP): Tank muze skakat. Pouzij klavesu Tab. Ve vzduchu nelze tank ridit." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "Identifikace (+ID): Identifikuje nejblizsi vlajku." msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Zahaleni (+CL): Tvuj tank nelze videt pred sebou, ale je stale viditelny na radaru." msgid "Burrow (+BU): Tank burrows underground, impervious to normal shots, but can be steamrolled by anyone!" msgstr "Zahrabani (+BV): Tank je zahraban do zeme, odolny proti normalnim strelam, ale muze byt kymkoliv prejet!" msgid "THief (+TH): Steal flags. Small and fast but can't kill." msgstr "Zlodej (+TH): Krade vlajky. Maly a rychly, ale nemuze zabijet." msgid "USeless (+US): You have found the useless flag. Use it wisely." msgstr "Zbytecny (+US): Nasel jsi zbytecnou vlajku. Pouzivej ji rozumne." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Barvoslepost (-CB): Nelze rozpoznat barvy tymu. Neznic hrace z tveho tymu!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Obezita (-O): Tank se stane velmi velkym. Nemuze projet teleportem." msgid "left turn only (-LT): Can't turn right." msgstr "Otaceni jen vlevo (-LT): Nelze se otacet vpravo." msgid "right turn only (-RT): Can't turn left." msgstr "Otaceni jen vpravo (-RT): Nelze se otacet vlevo." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Setrvacnost (-M): Tank ma velkou setrvacnost. Omezena je take akcelerace." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Slepota (-B): Nelze videt pred sebe. Radar stale funguje." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Ruseni radaru (-JM): Radar nefunguje. Stale lze videt pred sebe." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Siroky uhel (-WA): Pohled pres lupu zakrivuje zorne pole." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag je tankova sitova bojova hra pro vice hracu. Je zde pet tymu:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "cerveni, zeleni, modri, purpurovi a zli (zle tanky jsou cerne). Znicenim" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "hrace v jinem tymu se zvysi skore, pokud jsi znicen, nebo znicis" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "tank sveho tymu, snizi se skore. Vlastni a celkova skore tymu jsou ukladana." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Zli nemaji tymy (dokonce ani ostatni zli), takze nemohou znicit" msgid "teammates and they don't have a team score." msgstr "hrace v tymech a nemaji tymove skore." msgid "There are three styles of play, determined by the server configuration: capture-" msgstr "Existuji tri zpusoby hry, zavisle na konfiguraci serveru: ziskani-vlajky," msgid "the-flag, rabbit-chase and free-for-all. In free-for-all the object is simply to get the" msgstr "honba-na-kralika a volne-pro-vsechny. Ve hre volne-pro-vsechny je cilem ziskat" msgid "highest score by shooting opponents. The object in rabbit chase is to be the highest score" msgstr "nejvyssi skore nicenim protihracu. Cil hry honba-na-kralika je byt nejvyssi skore," msgid "so that you have the white tank, then everyone is against you. The object in capture-the-flag is to" msgstr "aby jsi mel bily tank. Vsichni jsou proti tobe. Cil hry ziskani-vlajky je" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "ziskat nepritelovu vlajku pri zabranovani ukradeni tve vlastni. V tomto" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "typu hry ma kazdy tym (mimo zlych) zakladnu tymu a kazdy tym s alespon" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "jednim hracem ma tymovou vlajku v barve tymu. Aby jsi ziskal vlajku," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "musis ji uchopit a prinest do tve zakladny (musis byt na zemi" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "ve tve zakladne, aby bylo ziskani vlajky platne). Ziskani vlajky znici vsechny hrace" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "v tymu a da tvemu tymu bodovy bonus; hraci zacnou znova v" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "jejich zakladne. Vzeti tve vlajky do zakladny nepritele se pocita jako ziskani" msgid "your team but not for the enemy team." msgstr "tve vlajky nepritelem." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Herni pole obsahuje krajni steny a par budov." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Nemuzes projet za krajni steny (ani je preskocit)." msgid "You cannot normally drive or shoot through buildings." msgstr "Nelze projet, nebo strilet skrz budovy." msgid "The server may be configured to include teleporters: large transparent" msgstr "Server muze byt nakonfigurovan tak, aby obsahoval teleporty: velke," msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "pruhledne cerne desky. Objekty, jez vstoupi do jedne strany teleportu jsou ihned" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "presunuty do jedne strany teleportu jineho (treba i stejneho)." msgid "teleport is reversible; reentering the same side of the destination" msgstr "Teleporty jsou propojeny; vstoupenim do stejne strany ciloveho teleportu" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "te vrati zpet do mista, kde jsi do nej puvodne vstoupil. Spojeni teleportu" msgid "are fixed at the start of the game and don't change during the game." msgstr "jsou urcena pri startu hry a behem hry se nemeni." msgid "The connections are always the same in the capture-the-flag style." msgstr "Spojeni jsou vzdy stejna ve hre typu ziskani-vlajky." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Kazda strana teleportu premistuje nezavisle na strane druhe." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Je mozne, aby teleport presunul objekt na druhou stranu sama sebe." msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "To je totez, jako by tam teleport vlastne ani nebyl." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Teleport muze take presouvat objekty na stejnou stranu sebe sama." msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "To je zpetny teleport. Strelenim na zpetny teleport je pravdepodobne," msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "ze zasahnes sam sebe; strelenim Laseru na tento teleport je sebevrazda." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Vlajky existuji ve dvou variantach: tymove vlajky a super vlajky. Tymove vlajky" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "se pouzivaji jen ve hre stylu ziskej-vlajku. Server muze byt take" msgid "configured to supply super flags, which give your tank some advantage" msgstr "nakonfigurovan tak, aby generoval super vlajky, ktere daji tanku vyhody," msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "nebo nevyhody. Pohledem nelze zjistit ktera to je, dokud ji nevezmes." msgid "but good flags generally outnumber bad flags two to one." msgstr "Dobre vlajky prevysuji poctem ty spatne v pomeru dva ku jedne." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Tymovym vlajkam neni dovoleno byt na nespravnych mistech, tj." msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "na budovach, nebo v zakladne nepritele. Tymove vlajky, shozene na" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "nespravnych mistech jsou presunuty na bezpecne pozice. Ziskane vlajky jsou vraceny" msgid "team base. Super flags dropped above a building always disappear." msgstr "zpet to zakladny jejich tymu. Super vlajky, shozene nad budovami vzdy zmizi." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "Libovolna dobra super vlajka zustane na jednom miste max. 4 krat po sebrani." msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "Pote zmizi a je posleze nahrazena novou, nahodnou vlajkou." msgid "flag. Bad random super flags disappear after the first possession." msgstr "Spatna, nahodna super vlajka zmizi po prvnim sebrani." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Spatne super vlajky nemohou byt zahozeny. Server vsak muze byt nastaven tak," msgid "automatically drop the flag for you after some time, after you destroy" msgstr "aby automaticky zahazoval spatne vlajky po urcitem case, nebo po urcitem" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "poctu poctu znicenych nepratel, nebo, pokud vezmes anti-vlajku." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "anti-vlajky jsou zlute a objevi se pouze, pokud vezmes spatnou vlajku." # Help 5 Strings msgid "Good Flags:" msgstr "Dobre vlajky:" msgid "boosts top speed" msgstr "Zvysi rychlost" msgid "High Speed (V)" msgstr "Vysoka rychlost (V)" msgid "boosts turn rate" msgstr "Zvysi rychlost otaceni" msgid "Quick Turn (A)" msgstr "Rychle otaceni (A)" msgid "can drive through buildings" msgstr "Lze projizdet skrz budovy" msgid "Oscillation Overthruster (OO)" msgstr "Projizdeni budovami (OO)" msgid "faster shots more often" msgstr "Rychlejsi a castejsi strelba" msgid "Rapid Fire (F)" msgstr "Rychla strelba (F)" msgid "very fast reload, very short range" msgstr "Velmi rychle nabijeni, velmi kratky dosah" msgid "Machine Gun (MG)" msgstr "Kulomet (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "Strely se ridi samy (zamereni pravym tl. mysi)" msgid "Guided Missile (GM)" msgstr "Rizena strela (GM)" msgid "infinite shot speed and range, long reload time" msgstr "Nekonecna rychlost a dosah, dlouho se nabiji" msgid "Laser (L)" msgstr "Laser (L)" msgid "shots ricochet" msgstr "Strely se odrazeji" msgid "Ricochet (R)" msgstr "Odrazeni strel (R)" msgid "shoots through buildings" msgstr "Strely prochazeji budovami" msgid "Super Bullet (SB)" msgstr "Super strela (SB)" msgid "tank invisible on enemy radar" msgstr "Tank nelze videt na radarech protihracu" msgid "Stealth (ST)" msgstr "Stealth (ST)" msgid "tank invisible out the window" msgstr "Tank nelze videt pred sebou" msgid "Cloaking (CL)" msgstr "Zahaleni (CL)" msgid "shots invisible on radar" msgstr "Strely nelze videt na radaru" msgid "Invisible Bullet (IB)" msgstr "Neviditelna strela (IB)" msgid "tank becomes smaller" msgstr "Tank se stane mensim" msgid "Tiny (T)" msgstr "Maly tank (T)" msgid "tank becomes paper thin" msgstr "Tank se stane tenkym jako papir" msgid "Narrow (N)" msgstr "Tenky tank (N)" msgid "getting hit just drops the flag" msgstr "Zasazenim se jen zahodi vlajka" msgid "Shield (SH)" msgstr "Stit (SH) " msgid "destroy tanks by touching them" msgstr "Zniceni tanku pouhym dotekem" msgid "Steamroller (SR)" msgstr "Parni valec (SR)" msgid "expanding spherical shell of destruction" msgstr "Rozsirujici se niciva vlna" msgid "Shock Wave (SW)" msgstr "Niciva vlna (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "Projetim teleportem se tank zmeni v prizrak a opacne" msgid "Phantom Zone (PZ)" msgstr "Prizrak (PZ)" msgid "destroys player and all player's teammates" msgstr "Znici hrace a vsechny v jeho tymu" msgid "Genocide (G)" msgstr "Genocida (G)" msgid "allows tank to jump" msgstr "Umozni tanku skakat" msgid "Jumping (JP)" msgstr "Skakani (JP)" msgid "shows type of nearest superflag" msgstr "Identifikuje nejblizsi vlajku" msgid "Identify (ID)" msgstr "Identifikace (ID)" msgid "it's useless" msgstr "Zbytecna vlajka bez funkce" msgid "Useless (US)" msgstr "Zbytecny (US)" msgid "In opponent's hud, you appear as a teammate" msgstr "Na obrazovce protihrace vypadas jako hrac z jeho tymu" msgid "Masquerade (MQ)" msgstr "Maskovani (MQ)" msgid "See stealthed, cloaked and masquerading tanks as normal." msgstr "Vidi skryte, zahalene a maskovane tanky jako normalni." msgid "Seer (SE)" msgstr "Jasnovidec (SE)" msgid "Steal flags. Small and fast but can't kill." msgstr "Krade vlajky. Maly a rychly, ale nemuze zabijet." msgid "Thief (TH)" msgstr "Zlodej (TH)" msgid "Tank burrows underground, impervious to normal shots, but can be steamrolled by anyone!" msgstr "Tank je zahraban do zeme, odolny proti normalnim strelam, ale muze byt kymkoliv prejet!" msgid "Burrow (BU)" msgstr "Zahrabani (BV)" msgid "Bad Flags:" msgstr "Spatne vlajky:" msgid "can't identify tanks" msgstr "Nelze rozpoznat ostatni tanky" msgid "Colorblindness (CB)" msgstr "Barvoslepost (CB)" msgid "makes tank very large" msgstr "Tank je velmi velky" msgid "Obesity (O)" msgstr "Obezita (0)" msgid "tank can't turn right" msgstr "Tank se nemuze otacet vpravo" msgid "Left Turn Only (<-)" msgstr "Otaceni pouze vlevo (<-)" msgid "tank can't turn left" msgstr "Tank se nemuze otacet vlevo" msgid "Right Turn Only (->)" msgstr "Otaceni pouze vpravo (->)" msgid "tank has lots of momentum" msgstr "Tank ma velkou setrvacnost" msgid "Momentum (M)" msgstr "Setrvacnost (M)" msgid "can't see out the window" msgstr "Nelze videt pred sebe" msgid "Blindness (B)" msgstr "Slepota (B)" msgid "can't see anything on radar" msgstr "Nelze videt nic na radaru" msgid "Jamming (JM)" msgstr "Ruseni radaru (JM)" msgid "fish eye view out the window" msgstr "Pohled pres lupu zakrivuje zorne pole" msgid "Wide Angle (WA)" msgstr "Siroky uhel (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Radar je na leve strane ovladaciho panelu. Ukazuje pohled" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "zezhora na hru. Budovy a vnejsi steny jsou na radaru zobrazeny svetle" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "modre. Zakladny tymu jsou vyznaceny barvou tymu. Teleporty jsou kratke" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "zlute cary. Tanky jsou tecky v barve tymu, vyjma zlych, kteri jsou" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "zluti. Velikost tecky tanku odpovida jeho vysce nad zemi." msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "Tanky, ktere jsou vyse maji vetsi tecky. Vlajky jsou male krizky. Tymove" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "vlajky jsou v barve tymu, super vlajky jsou bile a anti-vlajky" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "jsou zlute. Strely jsou male tecky (nebo cary pro Lasery, ci kruhy" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "pro nicive vlny). Tvuj tank je vzdy ve stredu radaru a pohyb vpred" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "je vzdy pohyb nahoru na radaru. Zlute V je tve zorne pole. Sever je" msgid "is indicated by the letter N." msgstr "znazornen pismenem N (anglicky North)." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Na horni strane obrazovky jsou dva ctverce uprostred a" msgid "center of the view are the motion control boxes; within the small box" msgstr "jsou urceny pro ovladani tanku; je-li mys uvnitr maleho ctverce," msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "bude tvuj tank stat. Mimo velky ctverec se nebudes pohybovat rychleji," msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "nez na okraji velkeho ctverce. Presunutim mysi nad (resp. pod) maly ctverec" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "se bude tank pohybovat dopredu (resp. dozadu). Podobne pro levou a pravou stranu." msgid "The distance away from the small box determines the speed." msgstr "Vzdalenost od maleho ctverce urcuje rychlost pohybu tanku." # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Nad velkym ctvercem je misto, kde se zobrazuje tvuj smer pohybu." msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "Sever je 0, vychod 90 atp. Je-li dovoleno skakani, nebo mas vlajku skakani," msgid "an altitude tape appears to the right of the larger box." msgstr "objevi se informace o tve vysce na prave strane velkeho ctverce." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Na miste ukazatele smeru pohybu se mohou objevovat male barevne kosticky." msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "Sipka, ukazujici do leva znamena, ze prislusna vlajka je po tve leve strane," msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "sipka, ukazujici do prava znamena, ze vlajka je po tve prave strane a" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "kosticka ukazuje smer k vlajce podle jeji pozice na ukazateli smeru pohybu." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "Ve hre typu ziskani-vlajky znacka vzdy ukazuje, kde je vlajka tveho tymu." msgid "A yellow marker shows the way to the antidote flag." msgstr "Zluta znacka ukazuje cestu k anti-vlajce." msgid "At the top of the display are, from left to right, your callsign and" msgstr "Na horni strane obrazovky je z leva do prava: tva prezdivka, skore," msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "tvuj stav a vlajka, kterou vlastnis. Tva prezdivka je v barve tveho tymu." msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "Tvuj stav muze byt jeden z: pripraven, mrtev, uzamceny, prizrak," msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "nebo nabijeni (zobrazujici cas do konce nabiti). Muze byt take zobrazen" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "cas do zahozeni spatne vlajky (je-li nastaven casovy limit pro zahozeni)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Na obrazovce se mohou zobrazovat take ostatni informacni zpravy." # Hlaseni BZFS (BZFlag server) # BZFS messages msgid "You are now an administrator!" msgstr "Nyni jsi administrator!" msgid "Wrong Password!" msgstr "Spatne heslo!" msgid "unknown command" msgstr "Neznamy prikaz" msgid "Countdown started." msgstr "Odpocitavani zapocato." msgid "IP pattern added to banlist" msgstr "Typ IP pridan do seznamu zakazanych" msgid "malformed address" msgstr "spatna adresa" msgid "removed IP pattern" msgstr "odstranen typ IP" # Mnou pridane preklady, ktere nebyly obsazeny ve vzoroven souboru... # Translations added by me. They are not in the original translation template... msgid "Slow Keyboard Motion" msgstr "pomaly posuv tanku" msgid "Toggle Radar Flags" msgstr "zobrazit vlajky na radaru" msgid "Toggle Main Flags" msgstr "zobrazit vlaky pred sebou" msgid "Silence/UnSilence" msgstr "Umlceni/Odmlceni hrace" msgid "self destruct/cancel" msgstr "sebezniceni/zruseni" # Hlasky vpravo nahore # Messages in the right up corner msgid "autopilot enabled" msgstr "autopilot povolen" msgid "autopilot disabled" msgstr "autopilot zakazan" # Hlasky uprostred # Messages in the middle of the screen msgid "AutoPilot on" msgstr "Autopilot zapnut" # Nastaveni GUI # GUI settings msgid "Control panel coloring:" msgstr "Barevne texty v ovladacim panelu:" msgid "Underline color:" msgstr "Barva podtrzeni:" msgid "cyan" msgstr "Azurova" msgid "grey" msgstr "Seda" msgid "text" msgstr "Text" msgid "Killer Highlight:" msgstr "Zvyrazneni tanku, ktery zabil:" msgid "None" msgstr "Zadne" msgid "Pulsating" msgstr "Pulsani" msgid "Underline" msgstr "Podtrzeni" # Identifikace vlajek # Flags identification msgid "Closest Flag: High Speed" msgstr "Nejblizsi vlajka: Vysoka rychlost" msgid "Closest Flag: Quick Turn" msgstr "Nejblizsi vlajka: Rychle otaceni" msgid "Closest Flag: Oscillation Overthurster" msgstr "Nejblizsi vlajka: Projizdeni budovami" msgid "Closest Flag: Rapid Fire" msgstr "Nejblizsi vlajka: Rychla strelba" msgid "Closest Flag: Machine Gun" msgstr "Nejblizsi vlajka: Kulomet" msgid "Closest Flag: Guided Missile" msgstr "Nejblizsi vlajka: Rizena strela" msgid "Closest Flag: Laser" msgstr "Nejblizsi vlajka: Laser" msgid "Closest Flag: Ricochet" msgstr "Nejblizsi vlajka: Odrazeni strel" msgid "Closest Flag: Super Bullet" msgstr "Nejblizsi vlajka: Super strela" msgid "Closest Flag: Stealth" msgstr "Nejblizsi vlajka: Stealth" msgid "Closest Flag: Cloaking" msgstr "Nejblizsi vlajka: Zahaleni" msgid "Closest Flag: Invisible Bullet" msgstr "Nejblizsi vlajka: Neviditelna strela" msgid "Closest Flag: Tiny" msgstr "Nejblizsi vlajka: Maly tank" msgid "Closest Flag: Narrow" msgstr "Nejblizsi vlajka: Tenky tank" msgid "Closest Flag: Shield" msgstr "Nejblizsi vlajka: Stit" msgid "Closest Flag: Steamroller" msgstr "Nejblizsi vlajka: Parni valec" msgid "Closest Flag: Shock Wave" msgstr "Nejblizsi vlajka: Niciva vlna" msgid "Closest Flag: Phantom Zone" msgstr "Nejblizsi vlajka: Prizrak" msgid "Closest Flag: Genocide" msgstr "Nejblizsi vlajka: Genocida" msgid "Closest Flag: Jumping" msgstr "Nejblizsi vlajka: Skakani" msgid "Closest Flag: Identify" msgstr "Nejblizsi vlajka: Identifikace" msgid "Closest Flag: Colorblindness" msgstr "Nejblizsi vlajka: Barvoslepost" msgid "Closest Flag: Obesity" msgstr "Nejblizsi vlajka: Obezita" msgid "Closest Flag: Left Turn Only" msgstr "Nejblizsi vlajka: Otaceni jen vlevo" msgid "Closest Flag: Right Turn Only" msgstr "Nejblizsi vlajka: Otaceni jen vpravo" msgid "Closest Flag: Momentum" msgstr "Nejblizsi vlajka: Setrvacnost" msgid "Closest Flag: Blindness" msgstr "Nejblizsi vlajka: Slepota" msgid "Closest Flag: Jamming" msgstr "Nejblizsi vlajka: Ruseni radaru" msgid "Closest Flag: Wide Angle" msgstr "Nejblizsi vlajka: Siroky uhel" msgid "Closest Flag: Useless" msgstr "Nejblizsi vlajka: Zbytecny" msgid "Closest Flag: Thief" msgstr "Nejblizsi vlajka: Zlodej" msgid "Closest Flag: Masquerade" msgstr "Nejblizsi vlajka: Maskovani" msgid "Closest Flag: Seer" msgstr "Nejblizsi vlajka: Jasnovidec" msgid "Closest Flag: Burrow" msgstr "Nejblizsi vlajka: Zahrabani" # Ostatni # Other msgid "Server started." msgstr "Server spusten." msgid "Shot myself" msgstr "Sejmul jsi se sam..." # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents msgid "grabbed High Speed flag" msgstr "vzal vlajku Vysoka rychlost" msgid "grabbed Quick Turn flag" msgstr "vzal vlajku Rychle otaceni" msgid "grabbed Oscillation Overthurster flag" msgstr "vzal vlajku Projizdeni budovami" msgid "grabbed Rapid Fire flag" msgstr "vzal vlajku Rychla strelba" msgid "grabbed Machine Gun flag" msgstr "vzal vlajku Kulomet" msgid "grabbed Guided Missile flag" msgstr "vzal vlajku Rizena strela" msgid "grabbed Laser flag" msgstr "vzal vlajku Laser" msgid "grabbed Ricochet flag" msgstr "vzal vlajku Odrazeni strel" msgid "grabbed Super Bullet flag" msgstr "vzal vlajku Super strela" msgid "grabbed Stealth flag" msgstr "vzal vlajku Stealth" msgid "grabbed Cloaking flag" msgstr "vzal vlajku Zahaleni" msgid "grabbed Invisible Bullet flag" msgstr "vzal vlajku Neviditelna strela" msgid "grabbed Tiny flag" msgstr "vzal vlajku Maly tank" msgid "grabbed Narrow flag" msgstr "vzal vlajku Tenky tank" msgid "grabbed Shield flag" msgstr "vzal vlajku Stit" msgid "grabbed Steamroller flag" msgstr "vzal vlajku Parni valec" msgid "grabbed Shock Wave flag" msgstr "vzal vlajku Niciva vlna" msgid "grabbed Phantom Zone flag" msgstr "vzal vlajku Prizrak" msgid "grabbed Genocide flag" msgstr "vzal vlajku Genocida" msgid "grabbed Jumping flag" msgstr "vzal vlajku Skakani" msgid "grabbed Identify flag" msgstr "vzal vlajku Identifikace" msgid "rabbed Colorblindness flag" msgstr "vzal vlajku Barvoslepost" msgid "grabbed Obesity flag" msgstr "vzal vlajku Obezita" msgid "grabbed Left Turn Only flag" msgstr "vzal vlajku Otaceni pouze vlevo" msgid "grabbed Right Turn Only flag" msgstr "vzal vlajku Otaceni jen vpravo" msgid "grabbed Momentum flag" msgstr "vzal vlajku Setrvacnost" msgid "grabbed Blindness flag" msgstr "vzal vlajku Slepota" msgid "grabbed Jamming flag" msgstr "vzal vlajku Ruseni radaru" msgid "grabbed Wide Angle flag" msgstr "vzal vlajku Siroky uhel" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated msgid "Pausing in" msgstr "Pauza za" msgid "Press Pause to resume" msgstr "Stiskni Pause pro pokracovani" msgid "Got shot by " msgstr "Sejmut " msgid "got skewred by " msgstr "prospikovan " bzflag-2.4.2+ds1/data/l10n/bzflag_da.po000066400000000000000000001317641200563112200174070ustar00rootroot00000000000000# This is generic Danish msgid "Join Game" msgstr "Deltag i spil" msgid "da" msgstr "Dansk" msgid "translator" msgstr "Dennis Møllegaard Pedersen" msgid "Find Server" msgstr "Find server" msgid "Connect" msgstr "Tilslut" msgid "Callsign:" msgstr "Kaldenavn:" msgid "Team:" msgstr "Hold:" msgid "Server:" msgstr "Server:" msgid "Port:" msgstr "Port:" msgid "Start Server" msgstr "Start server" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Op/ned piltaster for at bevæge sig, Enter for at vælge, Esc for at fortryde" msgid "Options" msgstr "Valgmuligheder" msgid "Help" msgstr "Hjælp" msgid "Quit" msgstr "Afslut" msgid "on" msgstr "til" #msgid "Dithering:" #msgstr "Punktning:" msgid "off" msgstr "fra" msgid "Off" msgstr "Fra" msgid "On" msgstr "Til" #msgid "Blending:" #msgstr "Blandning:" #msgid "Smoothing:" #msgstr "Udjævning:" #msgid "Lighting:" #msgstr "Lysforhold:" msgid "Texturing:" msgstr "Teksturer:" #msgid "Nearest" #msgstr "Nærmest" #msgid "Linear" #msgstr "Lineær" #msgid "Nearest Mipmap Nearest" #msgstr "" #msgid "Linear Mipmap Nearest" #msgstr "" #msgid "Nearest Mipmap Linear" #msgstr "Nærmest Mipmap Lineær" #msgid "Linear Mipmap Linear" #msgstr "Lineær Mipmap Lineær" msgid "Quality:" msgstr "Kvalitet:" msgid "Low" msgstr "Lav" msgid "Medium" msgstr "Middel" msgid "High" msgstr "Høj" msgid "Shadows:" msgstr "Skygger:" #msgid "Depth Buffer:" #msgstr "Dybte Buffer:" msgid "Not available" msgstr "Ikke tilgængeligt" msgid "Change Video Format" msgstr "Ændr skærmopløsning" msgid "Brightness:" msgstr "Lys styrke:" msgid "Sound Volume:" msgstr "Lyd styrke:" msgid "Off / Backup Mode" msgstr "Fra / Backup mode" msgid "5 Minutes" msgstr "5 minutter" msgid "15 Minutes" msgstr "15 minutter" msgid "30 Minutes" msgstr "30 minutter" msgid "1 Hour" msgstr "1 time" msgid "5 Hours" msgstr "5 timer" msgid "15 Hours" msgstr "15 timer" msgid "1 day" msgstr "1 dag" msgid "15 days" msgstr "15 dage" msgid "30 days" msgstr "30 dage" msgid "UDP network connection:" msgstr "Brug UDP forbindelse:" msgid "Server List Cache:" msgstr "Server list cache:" msgid "Clear Server List Cache" msgstr "Ryd server list cachen" msgid "Change Key Mapping" msgstr "Ændre tasterturopsætning" msgid "GUI Options" msgstr "GUI opsætning" msgid "Enhanced radar:" msgstr "Forbedret radar:" msgid "Controlpanel & Score FontSize:" msgstr "Kontrolpanel & point skriftstørrelse:" msgid "normal" msgstr "normal" msgid "bigger" msgstr "større" msgid "Radar & Panel Opacity:" msgstr "Radar & Panel gennemsigtighed:" msgid "Colored shots on radar:" msgstr "Farvet skud på radaren:" msgid "Radar Shot Length:" msgstr "Radar skud længde:" msgid "Radar & Panel Size:" msgstr "Radar- & panelstørrelse:" msgid "Mouse Box Size:" msgstr "Muskasse størrelse:" msgid "Control panel coloring:" msgstr "Kontrolpanel farve:" msgid "Underline color:" msgstr "Understregningsfarve:" msgid "Killer Highlight:" msgstr "Dræber fremhævelse:" msgid "Page Down for next page" msgstr "'Page Down' til næste side" msgid "Page Up for previous page" msgstr "'Page Up' til forrige side" msgid "Rogue" msgstr "Slyngel" msgid "Red Team" msgstr "Rødt hold" msgid "Green Team" msgstr "Grønt hold" msgid "Blue Team" msgstr "Blåt hold" msgid "Purple Team" msgstr "Lilla hold" msgid "Enter to quit, Esc to resume" msgstr "Enter for at afslutte, Esc for at forsætte" msgid "Really quit?" msgstr "Afslut? Er du sikker?" msgid "Video Format" msgstr "Skærmopløsning" msgid "Current Format:" msgstr "Nuværende opløsning:" msgid "Key Mapping" msgstr "Tasterturopsætning" msgid "Reset Defaults" msgstr "Reset" msgid "Fire shot:" msgstr "Skyd:" msgid "Drop flag:" msgstr "Smid flag:" msgid "Identify/Lock On:" msgstr "Identificér / Lås:" msgid "Radar Short:" msgstr "Radar kort:" msgid "Radar Medium:" msgstr "Radar medium:" msgid "Radar Long:" msgstr "Radar lang" msgid "Send to All:" msgstr "Send til alle:" msgid "Send to Teammates:" msgstr "Send til holdet:" msgid "Send to Nemesis:" msgstr "Send til nemesis:" msgid "Send to Recipient:" msgstr "Send til modtager:" msgid "Jump:" msgstr "Hop:" msgid "Binoculars:" msgstr "Kikkert:" msgid "Toggle Score:" msgstr "Vis/Skjul points:" msgid "Tank Labels:" msgstr "Tank etiket:" msgid "Flag Help:" msgstr "Flag hjælp:" msgid "Time Forward:" msgstr "Tid fremad:" msgid "Time Backward:" msgstr "Tid tilbage:" msgid "Pause/Resume:" msgstr "Pause/Forsæt" msgid "Self Destruct/Cancel:" msgstr "Selvmord/Fortryd:" msgid "SelfDestruct/Cancel:" msgstr "Selvmord/Fortryd:" msgid "Fast Quit:" msgstr "Hurtig afslut:" msgid "Scroll Backward:" msgstr "Scroll tilbage:" msgid "Scroll Forward:" msgstr "Scroll fremad" msgid "Slow Keyboard Motion:" msgstr "Langsom tastetur bevægelse:" msgid "loading {1}" msgstr "indlæser {1}" msgid "controls tank motion" msgstr "styrer tank bevægelserne" msgid "Mouse Position:" msgstr "Mus position:" msgid "fires shot" msgstr "skyder" msgid "drops flag (if not bad)" msgstr "smid flag (hvis ikke dårligt)" msgid "identifies player (locks on GM)" msgstr "identificér spiller (lås ved GM)" msgid "jump (if allowed)" msgstr "hop (hvis tilladt)" msgid "short radar range" msgstr "kort-rækkevidde radar" msgid "medium radar range" msgstr "middel-rækkevidde radar" msgid "long radar range" msgstr "stor-rækkevidde radar" msgid "toggle binoculars" msgstr "kikkert (til/fra)" msgid "toggle heads-up flag help" msgstr "vis flag hjælp (til/fra)" msgid "send message to teammates" msgstr "send besked til holdkammerater" msgid "send message to everybody" msgstr "send besked til alle" msgid "send message to nemesis" msgstr "send besked til nemesis" msgid "send message to recipient" msgstr "send besked til modtager" msgid "toggle score sheet" msgstr "pointoversigt (til/fra)" msgid "toggle tank labels" msgstr "tank etiket (til/fra)" msgid "set time of day backward" msgstr "stil tidspunkt tilbage" msgid "set time of day forward" msgstr "stil tidspuntk frem" msgid "pause/resume" msgstr "pause/forsæt" msgid "self Destruct/Cancel" msgstr "selvmord/fortryd" msgid "quit" msgstr "afslut" msgid "scroll message log backward" msgstr "spol tilbage i beskeder" msgid "scroll message log forward" msgstr "spol frem i beskeder" msgid "Slow Keyboard Motion" msgstr "Langsom keyboard bevægelse" msgid "Toggle Radar Flags" msgstr "Vis flag i radar (til/fra)" msgid "Toggle Main Flags" msgstr "Vis flag (til/fra)" msgid "Silence/UnSilence" msgstr "Ignorer/Ophæv ignorer" msgid "Server Admin" msgstr "Server admin" msgid "Hunt" msgstr "Jæg" msgid "autopilot enabled" msgstr "automatpilot" msgid "autopilot disabled" msgstr "automatpilot fjernet" msgid "show/dismiss menu" msgstr "vis/skjul menu" msgid "Esc:" msgstr "Esc:" msgid "Maintainer:" msgstr "Nuværende udvikler:" msgid "Original Author:" msgstr "Oprindelig udvikler:" msgid "Code Contributors:" msgstr "Bidrag:" msgid "Tank Models:" msgstr "Tank modeller:" msgid "Special Thanks:" msgstr "Specielt tak til:" #msgid "Send:" #msgstr "Send:" #msgid "Servers" #msgstr "Servers" msgid "Players" msgstr "Spiller" msgid "Red" msgstr "Rødt" msgid "Green" msgstr "Grønt" msgid "Blue" msgstr "Blåt" msgid "Purple" msgstr "Lilla" msgid "Controls" msgstr "Styring" msgid "General" msgstr "Generelt" msgid "Environment" msgstr "Omgivelser" msgid "Flags I" msgstr "Flag I" msgid "Flags II" msgstr "Flag II" msgid "Flags III" msgstr "Flag III" msgid "Readouts I" msgstr "Læs I" msgid "Readouts II" msgstr "Læs II" msgid "Credits" msgstr "Credits" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Tryk Enter for at vælge, T for at afprøve en opløsning. Esc for at afslutte." msgid "Free-style" msgstr "Fri" msgid "Capture-the-Flag" msgstr "Erobre-flaget" msgid "Rabbit Chase" msgstr "Kaninjagt" msgid "Super Flags" msgstr "Super flag" msgid "Antidote Flags" msgstr "Modgiftsflag" msgid "Trying..." msgstr "Forsøger..." msgid "Press %s to start" msgstr "Tryk %s for at starte" msgid "Dead" msgstr "Død" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "Klar" msgid "Reloaded in %.1f" msgstr "Lader igen om %.1f" msgid "Sealed" msgstr "Skjult" msgid "Zoned" msgstr "Fantom" msgid "You are now the rabbit." msgstr "Du er nu kaninen" msgid "Servers found: {1}" msgstr "Servers fundet: {1}" msgid "{1} Shot" msgstr "{1} skud" msgid "{1} Shots" msgstr "{1} skud" msgid "{1} sec To Drop Bad Flag" msgstr "{1} sekund før flag smides" msgid "{1} secs To Drop Bad Flag" msgstr "{1} sekunder før flag fjernes" msgid "{1} Win Drops Bad Flag" msgstr "{1} drab før flaget fjernes" msgid "{1} Wins Drops Bad Flag" msgstr "{1} drab før flaget fjernes" msgid "Time limit: {1}" msgstr "Tidsgrænse: {1}" msgid "Max team score: {1}" msgstr "Max hold score: {1}" msgid "Max player score: {1}" msgstr "Max spiller score: {1}" msgid "Page {1} of {2}" msgstr "Side {1} af {2}" msgid "openBroadcast: No udp service {1}" msgstr "openBroadcast: Ingen UDP service {1}" msgid "joystick '{1}' not supported..." msgstr "joystick '{1}' understøttes ikke.." msgid "Server did send endpoint information, UDP connection up" msgstr "Server sendte endpoint information, UDP forbindelse benyttes" msgid "Ignoring Finder argument '{1}'" msgstr "Ignorer søgeargument '{1}'" msgid "Can't open list server: {1}" msgstr "Kan ikke åbne list server: {1}" msgid "Server sent downlink endpoint information, port {1}" msgstr "Server sendte downlink endpoint information, port {1}" msgid "Communication error joining game [Wrong Code {1}]." msgstr "Kommunikationsfejl ved tilslutning til spillet [Forkert kode {1}]." msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" msgstr "Server beder om UDP, UDP benyttes. Info: [{1}:{2}:{3}]" msgid "Configuration file: Error on line {1}: Stream failure" msgstr "Konfigurationsfil: Fejl i linje {1}: læsefejl" msgid "Configuration file: Error on line {1}: Line too long" msgstr "Konfigurationsfil: Fejl i linje {1}: Linjen er for lang" msgid "Network: Created local UDP downlink port {1}" msgstr "Netværk: Oprettet lokal UDP downlink port {1}" #msgid "msgid " #msgstr "" msgid "More Info: [{1}:{2}:{3}]" msgstr "Yderligere info: [{1}:{2}:{3}]" msgid "cannot load texture: {1}" msgstr "Kan ikke indlæse tekstur: {1}" msgid "Connection failed." msgstr "Forbindelse mislykkes." msgid "Server forced a disconnect" msgstr "Serveren har afbrudt forbindelsen" msgid "Rogues not allowed. Try another team." msgstr "Slyngler ikke tilladt. Prøv et andet hold." msgid "This team is full. Try another team." msgstr "Dette hold er fuldt. Prø et andet hold." msgid "This game is full. Try again later." msgstr "Spillet er optaget. Prøv igen senere." msgid "Game is full or over. Try again later." msgstr "Spillet er optaget eller afsluttet. Prøv igen senere" msgid "Error connecting to server." msgstr "Fejl ved tilslutning til server." msgid "Error downloading world database" msgstr "Indlæsning af verdensdatabase fejlede" msgid "Score" msgstr "Score" msgid "Kills" msgstr "Dræbte" msgid "Team Score" msgstr "Hold score" msgid "Locale:" msgstr "Sprog:" msgid "Player" msgstr "Spiller" # Super Flags msgid "High Speed" msgstr "Høj hastighed" msgid "Quick Turn" msgstr "Hurtig manøvre" msgid "Oscillation Overthruster" msgstr "Oscillation Overthruster" msgid "Rapid Fire" msgstr "Turboskud" msgid "Machine Gun" msgstr "Maskinegevær" msgid "Guided Missile" msgstr "Varmesøgende missiler" #msgid "Laser" #msgstr "" #msgid "Ricochet" #msgstr "Ricochet" msgid "Super Bullet" msgstr "Super skud" msgid "Invisible Bullet" msgstr "Usynlige skud" #msgid "Stealth" #msgstr "Stealth" msgid "Tiny" msgstr "Lille" msgid "Narrow" msgstr "Smal" msgid "Shield" msgstr "Skjold" msgid "Steamroller" msgstr "Damptromle" msgid "Shock Wave" msgstr "Shock bølge" msgid "Phantom Zone" msgstr "Fantom Zone" msgid "Genocide" msgstr "Massemord" msgid "Jumping" msgstr "Hop" msgid "Identify" msgstr "Identificér" msgid "Cloaking" msgstr "Usynlighed" msgid "Colorblindness" msgstr "Farveblindhed" msgid "Obesity" msgstr "Forstørrelse" msgid "Left Turn Only" msgstr "Kun venstresving" msgid "Right Turn Only" msgstr "Kun højresving" msgid "Momentum" msgstr "Dobbelt Vægt" msgid "Blindness" msgstr "Blindhed" #msgid "Jamming" #msgstr "" msgid "Wide Angle" msgstr "Vid vinkel" # Flag help msgid "You have no flag." msgstr "Du har intet flag" msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Dit holds flag: forhindre andre hold i at fange det!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Modstanderens flag: tag det til din base for at erobre det!" msgid "Velocity (V): Tank moves faster. Outrun bad guys." msgstr "Hastighed (V): Kampvognen kører stærkere." msgid "Useless" msgstr "Ubrugelig" msgid "Thief" msgstr "Tyv" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" msgid "Angular velocity (A): Tank turns faster. Dodge quicker." msgstr "Hurtig manøvre (A): Kampvognen drejer hurtigere." msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" msgstr "Team flag: Hvis det er dit holds flag; Forhindre de andre hold i at tage det. Hvis det er et andet holds flag; Tag det hjem til din base!" msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscullation Overthruster (OO): Kan køre igennem bygninger, men du har ikke muliged for at skyde inde fra bygninger." msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." msgstr "Turboskud (F): Skyd ofte, men dine skud har kortere rækkevidde." msgid "Machine Gun (MG): Very fast reload and very short range." msgstr "Maskinegevær (MG): Hurtig ladning men meget kort rækkevidde." msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Varmesøgende missler (+GM): Lås med højre knap og missilet vil følge målet. Man kan også skyde før man låser missilet på et mål." msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (L): Skyd med laser. Uendelig hurtig og rækkevidde, men lang ladetid." msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochet (R): Skud reflekteres af vægge. Undgå at ramme dig selv!" msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Superskud (SB): Skyd igennem bygninger. Kan dræbe fantom kampvogne" msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Usynlige skud (IB): Dine skud kan ikke ses på radaren." msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Stealth (ST): Kampvognene er usynlige på radaren, mens skud stadig kan ses" msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." msgstr "Lille (T): Kampvognen er lille og kan komme igennem smalle passaser. Svær at ramme" msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Smal (N): Kampvognen er supersmal. Meget svær at ramme fra fronten men har normal størrelse fra siderne." msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Skjold (SH): Når du rammes, taber du blot flaget." msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." msgstr "Damptromle (SR): Dræber kampvogne så snart du rører dem." msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Shockbølge (SW): Dræber alle kampvogne i nærheden. Undgå at dræbe holdkammerater. Kan dræbe kampvogne i/på bygninger." msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Fantom zone (PZ): Teleportering slå zone effekten til/fra. Kampvogne i zonen kan køre igennem bygninger, men kan ikke skyde eller bliver skudt (undtaget med superskud eller shockbølgen)." msgid "Genocide (G): Killing one tank kills that tank's whole team." msgstr "Massemord (G): Hvis du rammer en kampvogn, dør alle på holdet." msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Hop (JP): Din kampvogn kan hoppe - brug tab tasten. Du kan ikke styre i luften." msgid "IDentify (ID): Identifies type of nearest flag." msgstr "Identificér (ID): Identificér det nærmeste flag." msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Usynlighed (CL): Gør din kampvogn usynlig - men den kan stadig ses på radaren." msgid "Velocity (+V): Tank moves faster. Outrun bad guys." msgstr "Hurtighed (+V): Din tank bevæger sig hurtigere." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "Hurtig manøvre (+A): Din tank drejer hurtigere. Nemmere at undgå skud." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscillation Overthruster (+OO): Kan kører igennem bygninger. Men kan ikke skyde derinde." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Turboskud (+F): Skyd oftere. Skuddene flyver hurtigere men ikke ligeså langt." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Maskingevær (+MG): Meget hurtig til at lade og meget kort rækkevidde." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Varmesøgende missler (+GM): Lås med højre knap og missilet vil følge målet. Man kan også skyde før man låser missilet på et mål." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Skyd med laser. Uendelig hurtig og rækkevidde - men lang tid om at lade igen." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochet (+R): Skud preller tilbage fra vægge." msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Superskud (+SB): Skyder igennem bygninger. Kan dræbe fantom tanks." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Usynlige skud (+IB): Dine skud er ikke synlige på andres radar, men kan stadig ses." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "STealth (+ST): Din tank kan ikke ses på radaren, men dine skud kan." msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Lille (+T): Tanken er lille og kan komme igennem små sprækker. Svær at ramme." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Smal (+N): Din tank er meget smal. Meget svært at ramme forfra, men normalt fra siden." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Skjold (+SH): Hvis du rammes, taber du blot flaget." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Damptromle (+SR): Smadrer tanks du rører med din egen tank." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Shockbølge (+SW): En shockbølge dræber alle tanks i nærheden. Kan også dræbe tanks i bygninger." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Fantom zone (+PZ): Når du er et fantom, kan du kører igennem bygning. Du kan ikke skyde eller blive skudt (borset fra af super-skud eller shockbølge)." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Massemord (+G): Hvis du dræber een tank, dræber du hele holdet." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Hop (+JP): Din tank kan hoppe. Brug Tab. Man kan ikke styre i luften." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "Identificér (+ID): Identificérer det nærmeste flag." msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Usynlighed (+CL): Gør din tank usynlig, kan stadig ses på radaren." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Farveblindhed (-CB): Du kan ikke se holdfarverne på tanks. Pas på du ikke skyder dine holdkammerater!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Forstørrelse (-O): Din tank bliver meget stor. Kan ikke komme igennem teleporte." msgid "left turn only (- <-): Can't turn right." msgstr "kun venstresving (- <-): Du kan ikke dreje til højre." msgid "right turn only (- ->): Can't turn left." msgstr "kun højresving (- ->): Du kan ikke dreje til venstre." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Dobbelt Vægt (-M): Du tank er blevet stor og sløv." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Blindhed (-B): Du kan ikke se noget. Radar virker stadig." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Jamming (-JM): Din radar er defekt, men du kan stadig se." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Vid vinkel (-WA): Fiskeøje perspektiv." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag er et multiplayer netværks tank spil. Der er 5 hold" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "rød, grøn, blå, lilla og slyngler (slyngler er sorte). At skyde en " msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "spiller på et andet hold giver point, hvorimod hvis man dør eller skyder en" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "holdkammerat giver minus point. Der skelnes mellem individuel og samlet holdpoint." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Slyngler har ikke nogen holdkammerater (ikke engang andre slyngler), så de kan" msgid "teammates and they don't have a team score." msgstr "ikke skyde holdkammerater og har heller ikke et hold." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "BZFlag kan spilles på to måder, der bestemmes af serverens opsæning: erobre-" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "flaget eller frit for alle. I frit-for-alle gælder det om at den højeste " msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "antal point ved at skude fjender. I erobre-flaget skal man" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "erobre fjendens flag og undgå at ens eget flag bliver erobret. Her har " msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "hver team (undt. slyngler) en hold-base og hver hold med mindst een spiller" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "har et hold flag som er samme farve som holdet. For at erobre flaget, " msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "skal du hente det og bringe det tilbage til dit holds base (du skal være på jorden" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "på din holdbase før det registreres). Ved erobring af flaget dør alle spillere " msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "på det hold og dette giver dit team et point bonus; spillerne vil starte på" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "deres holdbase. Hvis du tager dit eget flag ind i fjendes holdbase, tæller det som en" msgid "your team but not for the enemy team." msgstr "erobring fra din fjendes side og de vil få et point." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Omgivelserne består af en ydre væg og flere bygninger." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Du kan ikke komme ud over de ydre vægge (heller ikke ved at hoppe)." msgid "You cannot normally drive or shoot through buildings." msgstr "Du kan normalt ikke køre eller skyde igennem bygninger." msgid "The server may be configured to include teleporters: large transparent" msgstr "Serveren kan være opsat til at inkludere teleporte. Objekter" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "der kører ind i den ene side af en teleporter vil blive" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "flyttet til den anden side på en anden (eller samme) teleporter. " msgid "teleport is reversible; reentering the same side of the destination" msgstr "Man kan ligeledes køre tilbage af samme vej og man vil ende hvor" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "man startede. Teleportenes forbindelser er statiske ved spillets start" msgid "are fixed at the start of the game and don't change during the game." msgstr "og ændres ikke under et spil." msgid "The connections are always the same in the capture-the-flag style." msgstr "Forbindelserne er altid de samme i erobre-flaget." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Den ene side af en teleport telepoterer uafhængig af den anden side." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Det er muligt for en teleport at telepotere til den anden side af" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "sig selv. Denne type igennem-teleporters opfører sig næsten som om de" msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "ikke er tilstede. En teleport kan også teleportere til den samme side af" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "sig selv - et 'spejl'. Skyder man på en af disse teleporte vil man" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "sandsynligvis ramme sig selv." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Der findes to varianter af flag: holdflag og super flag. Holdflag" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "er kun brugt i erobre-flaget. Serveren kan også være opsat" msgid "configured to supply super flags, which give your tank some advantage" msgstr "til at give superflag, som giver din tank nogle fordele eller ulemper." msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "Du kan normalt ikke se hvad før du har samlet et flag op," msgid "but good flags generally outnumber bad flags two to one." msgstr "men generelt er der flere gode flag end dårlige flag." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Holdflag må ikke placeres enkelte steder. Dette er på en bygning eller" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "på en fjendes base. Holdflag smidt en af disse steder, bliver flyttet" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "til et sikkert område. Erobrede flag bliver placeret på deres holdbase." msgid "team base. Super flags dropped above a building always disappear." msgstr "Superflag der smides på bygninger forsvinder altid." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "Et tilfældigt god superflag vil består i op til 4 besiddelser. Efter" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "dette vil det forsvinde og eventuelt vil der bliver placeret et andet " msgid "flag. Bad random super flags disappear after the first possession." msgstr "tilfældigt flag. Dårlige tilfældige superflag forsvinder efter een " msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "besiddelse. Dårlige flag kan normalt ike smides. Serveren kan være opsat til" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "automatisk at smide flaget for dig efter en sum tid, efter du har skudt" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "et antal fjender, og/eller hvis du finder et modgiftsflag." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Modgiftsflag er gule og er kun synlige når du har et dårligt flag." # Help 5 Strings msgid "Good Flags:" msgstr "Gode flag:" msgid "boosts top speed" msgstr "giver ekstra fart" msgid "High Speed (V)" msgstr "Høj hastighed (V)" msgid "boosts turn rate" msgstr "giver forbedret styring" msgid "Quick Turn (A)" msgstr "Hurtig manøvre (A)" msgid "can drive through buildings" msgstr "kan køre igennem bygninger" msgid "Oscillation Overthruster (OO)" msgstr "Oscillation Overthruster (OO)" msgid "faster shots more often" msgstr "hurtigere skud" msgid "Rapid Fire (F)" msgstr "Turboskud (F)" msgid "very fast reload, very short range" msgstr "lader hurtigt, meget kort rækkevidde" msgid "Machine Gun (MG)" msgstr "Maskingevær (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "søger selv mod målet (højre mus låser målet)" msgid "Guided Missile (GM)" msgstr "Varmesøgende missler (GM)" msgid "infinite shot speed and range, long reload time" msgstr "uendelig hurtigt og rækkevidde, lang tid om at lade" #msgid "Laser (L)" #msgstr "" msgid "shots ricochet" msgstr "skud ricocheter" #msgid "Ricochet (R)" #msgstr "" msgid "shoots through buildings" msgstr "skyder igennem bygninger" msgid "Super Bullet (SB)" msgstr "Superskud (SB)" msgid "tank invisible on enemy radar" msgstr "tank er usynlig på fjendes radar" #msgid "Stealth (ST)" #msgstr "" msgid "tank invisible out the window" msgstr "tank er usynlig (men ikke på radar)" msgid "Cloaking (CL)" msgstr "Usynlighed (CL)" msgid "shots invisible on radar" msgstr "skud kan ikke ses på radaren" msgid "Invisible Bullet (IB)" msgstr "Usynlige skud (IB)" msgid "tank becomes smaller" msgstr "din tank bliver mindre" msgid "Tiny (T)" msgstr "Lille (T)" msgid "tank becomes paper thin" msgstr "din tank bliver meget smal" msgid "Narrow (N)" msgstr "Smal (N)" msgid "getting hit just drops the flag" msgstr "når du rammes, taber du flaget" msgid "Shield (SH)" msgstr "Skjold (SH)" msgid "destroy tanks by touching them" msgstr "dræber tanks ved berøring" msgid "Steamroller (SR)" msgstr "Damptromle (SR)" msgid "expanding spherical shell of destruction" msgstr "afgiver en cirkular dødsring" msgid "Shock Wave (SW)" msgstr "Shockbølge (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "teleporte til at gå ind/ud af fantom zone" msgid "Phantom Zone (PZ)" msgstr "Fantom zone (PZ)" msgid "destroys player and all player's teammates" msgstr "dræber spiller samt hele holdet" msgid "Genocide (G)" msgstr "Massemord (G)" msgid "allows tank to jump" msgstr "tillader tanken at hoppe" msgid "Jumping (JP)" msgstr "Hop (JP)" msgid "shows type of nearest superflag" msgstr "viser type på det nærmeste flag" msgid "Identify (ID)" msgstr "Identificér (ID)" msgid "Bad Flags:" msgstr "Dårlige flag:" msgid "can't identify tanks" msgstr "kan ikke identificere tanks" msgid "Colorblindness (CB)" msgstr "Farveblindhed (CB)" msgid "makes tank very large" msgstr "gør tanken meget stor" msgid "Obesity (O)" msgstr "Forstørrelse (O)" msgid "tank can't turn right" msgstr "kan ikke dreje til højre" msgid "Left Turn Only (<-)" msgstr "Kun venstresving (<-)" msgid "tank can't turn left" msgstr "kan ikke dreje til venstre" msgid "Right Turn Only (->)" msgstr "Kun højresving (->)" msgid "tank has lots of momentum" msgstr "din tank er meget sløv" msgid "Momentum (M)" msgstr "Dobbelt Vægt (M)" msgid "can't see out the window" msgstr "du kan ikke se noget" msgid "Blindness (B)" msgstr "Blindhed (B)" msgid "can't see anything on radar" msgstr "du kan ikke se noget på din radar" msgid "Jamming (JM)" msgstr "Jamming (JM)" msgid "fish eye view out the window" msgstr "fiskeøje syn" msgid "Wide Angle (WA)" msgstr "Vid vinkel (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Radaren er i venstre side af kontrolpanelet. Den viser en oversigt" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "over spillet. Bygninger og ydre vægge vises med lyseblåt. " msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "Holdbaser vises i holdets farve. Teleporters er korte gule" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "linier. Tanks vises som prikker i holdfarven, undtagen slyngler der" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "er gule. Størrelsen på tankens prik er en indikation af hvor " msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "højt oppe tanken er: jo større prik jo højere oppe. Flag er små krydser. Holdflag" msgid "Toggle Radar Flags:" msgstr "Radar flag (til/fra): " msgid "Toggle Main Flags:" msgstr "Flag (til/fra): " msgid "Silience/UnSilence" msgstr "Ignorer/Ophæv ignorer" msgid "Silience/UnSilence Key:" msgstr "Ignorer/Ophæv ignorer tast" msgid "Server Command Key:" msgstr "Server kommandotast: " msgid "self destruct/cancel" msgstr "selvmord/fortryd" # Start server msgid "yes" msgstr "ja" msgid "no" msgstr "nej" msgid "Style:" msgstr "Stil" msgid "Free for All" msgstr "Frit for alle" msgid "Capture the Flag" msgstr "Erobre-flaget" msgid "Max Players:" msgstr "Max antal spillere:" msgid "Max Shots:" msgstr "Max antal skud:" msgid "Teleporters:" msgstr "Teleporters:" #msgid "Ricochet:" #msgstr "" msgid "Jumping:" msgstr "Hob" msgid "Superflags:" msgstr "Superflag:" msgid "all flags" msgstr "alle flag" msgid "good flags only" msgstr "kun gode flag" msgid "Max Superflags:" msgstr "Max antal superflag:" msgid "Bad Flag Antidote:" msgstr "Dårlig flag modgift:" msgid "Bad Flag Time Limit:" msgstr "Dårlig flag tidsgrænse:" msgid "no limit" msgstr "ingen grænse" msgid "15 seconds" msgstr "15 sekunder" msgid "30 seconds" msgstr "30 sekunder" msgid "60 seconds" msgstr "60 sekunder" msgid "180 seconds" msgstr "180 sekunder" msgid "Bad Flag Win Limit:" msgstr "Dårlig flag drab grænse:" msgid "drop after 1 win" msgstr "smid efter 1 drab" msgid "drop after 2 wins" msgstr "smid efter 2 drab" msgid "drop after 3 wins" msgstr "smid efter 3 drab" msgid "Server Visibility:" msgstr "Server synlighed:" msgid "local host only (ttl=0)" msgstr "kun localhost (ttl=0)" msgid "subnet only (ttl=1)" msgstr "kun subnet (ttl=1)" msgid "local area (ttl=8)" msgstr "lan (ttl=8)" #msgid "site (ttl=32)" #msgstr "" msgid "organization (ttl=64)" msgstr "organisation (ttl=64)" msgid "continent (ttl=128)" msgstr "kontinent (ttl=128)" msgid "world (ttl=255)" msgstr "verden (ttl=255)" msgid "Game Over:" msgstr "Spillet afsluttes:" msgid "never" msgstr "aldrig" msgid "after 5 minutes" msgstr "efter 5 minutter" msgid "after 15 minutes" msgstr "efter 15 minutter" msgid "after 60 minutes" msgstr "efter 60 minutter" msgid "after 3 hours" msgstr "efter 3 timer" msgid "when a player gets +3" msgstr "når en spiller når +3" msgid "when a player gets +10" msgstr "når en spiller når +10" msgid "when a player gets +25" msgstr "når en spiller når +25" msgid "when a team gets +3" msgstr "når et hold når +3" msgid "when a team gets +10" msgstr "når et hold når +10" msgid "when a team gets +25" msgstr "når et hold når +25" msgid "when a team gets +100" msgstr "når et hold når +100" msgid "Server Reset:" msgstr "Server reset:" msgid "no, quit after game" msgstr "nej, afslut spillet" msgid "yes, reset for more games" msgstr "ja, reset og spil igen" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "er i holdes egen farve, superflag er hvide, modgiftsflag er gule." msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "Skud er små prikker, laser er linier og shockbølger er cirkler. " #msgid "cyan" #msgstr "" msgid "grey" msgstr "grå" msgid "text" msgstr "tekst" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "Din egen tank er altid i centrum og fremad er altid op" msgid "None" msgstr "Ingen" msgid "Pulsating" msgstr "Blinkende" msgid "Underline" msgstr "Understreget" # Flags identification msgid "Closest Flag: High Speed" msgstr "Nærmeste flag: Høj hastighed" msgid "Closest Flag: Quick Turn" msgstr "Nærmeste flag: Hurtig manøvre" msgid "Closest Flag: Oscillation Overthurster" msgstr "Nærmeste flag: Oscillation Overthruster" msgid "Closest Flag: Rapid Fire" msgstr "Nærmeste flag: Turboskud" msgid "Closest Flag: Machine Gun" msgstr "Nærmeste flag: Maskingevær" msgid "Closest Flag: Guided Missile" msgstr "Nærmeste flag: Varmesøgende missiler" msgid "Closest Flag: Laser" msgstr "Nærmeste flag: Laser" msgid "Closest Flag: Ricochet" msgstr "Nærmeste flag: Ricochet" msgid "Closest Flag: Super Bullet" msgstr "Nærmeste flag: Superskud" msgid "Closest Flag: Stealth" msgstr "Nærmeste flag: Stealth" msgid "Closest Flag: Cloaking" msgstr "Nærmeste flag: Usynlighed" msgid "Closest Flag: Invisible Bullet" msgstr "Nærmeste flag: Usynlige skud" msgid "Closest Flag: Tiny" msgstr "Nærmeste flag: Lille" msgid "Closest Flag: Narrow" msgstr "Nærmeste flag: Smal" msgid "Closest Flag: Shield" msgstr "Nærmeste flag: Skjold" msgid "Closest Flag: Steamroller" msgstr "Nærmeste flag: Damptromle" msgid "Closest Flag: Shock Wave" msgstr "Nærmeste flag: Shockbølge" msgid "Closest Flag: Phantom Zone" msgstr "Nærmeste flag: Fantom zone" msgid "Closest Flag: Genocide" msgstr "Nærmeste flag: Massemord" msgid "Closest Flag: Jumping" msgstr "Nærmeste flag: Hop" msgid "Closest Flag: Identify" msgstr "Nærmeste flag: Identificér" msgid "Closest Flag: Colorblindness" msgstr "Nærmeste flag: Farveblindhed" msgid "Closest Flag: Obesity" msgstr "Nærmeste flag: Forstørrelse" msgid "Closest Flag: Left Turn Only" msgstr "Nærmeste flag: Kun venstresving" msgid "Closest Flag: Right Turn Only" msgstr "Nærmeste flag: Kun højresving" msgid "Closest Flag: Momentum" msgstr "Nærmeste flag: Dobbelt vægt" msgid "Closest Flag: Blindness" msgstr "Nærmeste flag: Blindhed" msgid "Closest Flag: Jamming" msgstr "Nærmeste flag: Jamming" msgid "Closest Flag: Wide Angle" msgstr "Nærmeste flag: Vid vinkel" # Other msgid "Server started." msgstr "Serveren startet." msgid "Shot myself" msgstr "Skød migselv" # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents msgid "grabbed High Speed flag" msgstr "tog 'Høj hastighed' flaget" msgid "grabbed Quick Turn flag" msgstr "tog 'Hurtig manøvre' flaget" msgid "grabbed Oscillation Overthurster flag" msgstr "tog 'Oscillation Overthurster' flaget" msgid "grabbed Rapid Fire flag" msgstr "tog 'Hurtig sud' flaget" msgid "grabbed Machine Gun flag" msgstr "tog 'Maskinegevær' flaget" msgid "grabbed Guided Missile flag" msgstr "tog 'Varmesøgende missiler' flaget" msgid "grabbed Laser flag" msgstr "tog 'Laser' flaget" msgid "grabbed Ricochet flag" msgstr "tog 'Ricochet' flaget" msgid "grabbed Super Bullet flag" msgstr "tog 'Superskud' flaget" msgid "grabbed Stealth flag" msgstr "tog 'Stealth' flaget" msgid "grabbed Cloaking flag" msgstr "tog 'Usynlighed' flaget" msgid "grabbed Invisible Bullet flag" msgstr "tog 'Usynlige skud' flaget" msgid "grabbed Tiny flag" msgstr "tog 'Lille' flaget" msgid "grabbed Narrow flag" msgstr "tog 'Smal' flaget" msgid "grabbed Shield flag" msgstr "tog 'Skjold' flaget" msgid "grabbed Steamroller flag" msgstr "tog 'Damptromle' flaget" msgid "grabbed Shock Wave flag" msgstr "tog 'Shockbølge' flaget" msgid "grabbed Phantom Zone flag" msgstr "tog 'Fantom zone' flaget" msgid "grabbed Genocide flag" msgstr "tog 'Massemord' flaget" msgid "grabbed Jumping flag" msgstr "tog 'Hop' flaget" msgid "grabbed Identify flag" msgstr "tog 'Identificér' flaget" msgid "grabbed Colorblindness flag" msgstr "tog 'Farveblindhed' flaget" msgid "grabbed Obesity flag" msgstr "tog 'Forstørelse' flaget" msgid "grabbed Left Turn Only flag" msgstr "tog 'Kun venstresving' flaget" msgid "grabbed Right Turn Only flag" msgstr "tog 'Kun højresving' flaget" msgid "grabbed Momentum flag" msgstr "tog 'Dobbelt vægt' flaget" msgid "grabbed Blindness flag" msgstr "tog 'Blindhed' flaget" msgid "grabbed Jamming flag" msgstr "tog 'Jamming' flaget" msgid "grabbed Wide Angle flag" msgstr "tog 'Vidvinkel' flaget" # Other messages that cannot be translated msgid "Pausing in" msgstr "Pauser om" msgid "Press Pause to resume" msgstr "Tryk pause for at forsætte" msgid "Got shot by " msgstr "Blev skudt af " #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "på radaren. Det gule 'V' er dit synsfelt. " msgid "is indicated by the letter N." msgstr "Nord er angivet med bogstavet N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Dit synsfelt viser flere ting. De to kasser i centrum" msgid "center of the view are the motion control boxes; within the small box" msgstr "er dine bevægelses kasser. Inden for den inderste (mindste) kasse" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "bevæger din tank sig ikke, uden for den store kasse kan din tank ikke " msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "køre hurtigere i forhold til yderkanten af den store kasse. Ved at flytte" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "musen over/under den lille kasse kører du frem/tilbage. Det samme gælder " msgid "The distance away from the small box determines the speed." msgstr "højre og venstre. " # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Over den store kasse, er der et kompas der viser din retning. Nord er" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "0, øst er 90, osv. Hvis du kan hoppe vises der en skala for" msgid "an altitude tape appears to the right of the larger box." msgstr "hvor meget højde du har på. Denne skala vises til højre for den store kasse" msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Små farvede pile eller diamanter kan vise sig i kompasset. En pil der " msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "peger til venstre betyder at flaget er til venstre for dig, tilsvarende " msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "gælder hvis den peger på højre. En diamant indikerer hvilken retning flaget" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "er i forhold til dig." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "I erobre-flaget vises den altid hvor dit holdflag befinder sig." msgid "A yellow marker shows the way to the antidote flag." msgstr "En gul pil/diamant viser hvor et modgiftsflag er." msgid "At the top of the display are, from left to right, your callsign and" msgstr "Øverst oppe vises der (fra venstre) dit navn, dine points," msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "din status og hvilket flag du har. Dit navn er i dit holdfarve" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "og din status er enten: klar, død, skjult, fantom" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "eller lader (samt hvor lang tid dette tager). Det kan også vise " msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "tiden indtil et dårligt flag smides (hvis der er en tidsbegrænsning)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Andre informationer kan forekomme af og til." # BZFS Messages msgid "You are now an administrator!" msgstr "Du er nu administrator" msgid "Wrong Password!" msgstr "Forkert kodeord" msgid "unknown command" msgstr "Ukendt kommando" msgid "Countdown started." msgstr "Nedtælling startet." msgid "IP pattern added to banlist" msgstr "IP mønster tilføjet til blokeringsliste" msgid "malformed address" msgstr "Ugyldig adresse" msgid "removed IP pattern" msgstr "IP mønster fjernet" bzflag-2.4.2+ds1/data/l10n/bzflag_de.po000066400000000000000000001332601200563112200174040ustar00rootroot00000000000000# This is generic German # Author: Martin Jungowski , Andreas "Cobra_Fast" Seifert msgid "Join Game" msgstr "Spiel starten" msgid "de" msgstr "German" msgid "translator" msgstr "Martin Jungowski" msgid "Find Server" msgstr "Server suchen" msgid "Connect" msgstr "Verbinden" msgid "Callsign:" msgstr "Nickname:" #msgid "Team:" #msgstr "Team:" #msgid "Server:" #msgstr "Server:" #msgid "Port:" #msgstr "Port:" msgid "Start Server" msgstr "Server starten:" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Pfeiltasten um zu navigieren, Enter um auszuwählen, Esc um abzubrechen" msgid "Options" msgstr "Optionen" msgid "Help" msgstr "Hilfe" msgid "Quit" msgstr "Verlassen" #msgid "on" #msgstr "an" #msgid "Dithering:" #msgstr "Dithering:" #msgid "off" #msgstr "aus" msgid "Off" msgstr "Aus" msgid "On" msgstr "An" #msgid "Blending:" #msgstr "Blending:" msgid "Smoothing:" msgstr "Kantenglättung:" msgid "Lighting:" msgstr "Beleuchtung:" msgid "Texturing:" msgstr "Texturierung:" msgid "Nearest" msgstr "Am nächsten" #msgid "Linear" #msgstr "Linear" #msgid "Nearest Mipmap Nearest" #msgstr "Nearest Mipmap Nearest" #msgid "Linear Mipmap Nearest" #msgstr "Linear Mipmap Nearest" #msgid "Nearest Mipmap Linear" #msgstr "Nearest Mipmap Linear" #msgid "Linear Mipmap Linear" #msgstr "Linear Mipmap Linear" msgid "Quality:" msgstr "Bildqualität:" msgid "Low" msgstr "Niedrig" msgid "Medium" msgstr "Mittel" msgid "High" msgstr "Hoch" msgid "Shadows:" msgstr "Schatten:" msgid "Depth Buffer:" msgstr "Tiefenpuffer:" msgid "Not available" msgstr "Nicht verfügbar" msgid "Change Video Format" msgstr "Bildformat ändern" msgid "Brightness:" msgstr "Helligkeit:" msgid "Sound Volume:" msgstr "Lautstärke:" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "5 Minuten" #msgid "15 Minutes" #msgstr "15 Minuten" #msgid "30 Minutes" #msgstr "30 Minuten" #msgid "1 Hour" #msgstr "1 Stunde" #msgid "5 Hours" #msgstr "5 Stunden" #msgid "15 Hours" #msgstr "15 Stunden" #msgid "1 day" #msgstr "1 Tag" #msgid "15 days" #msgstr "15 Tage" #msgid "30 days" #msgstr "30 Tage" msgid "UDP network connection:" msgstr "UDP-Netzwerkverbindung" #msgid "Server List Cache:" #msgstr "Serverlisten-Cache:" #msgid "Clear Server List Cache" #msgstr "Serverlisten-Cache leeren" msgid "Change Key Mapping" msgstr "Tastenbelegung ändern" msgid "GUI Options" msgstr "GUI Optionen" msgid "Enhanced radar:" msgstr "Erweitertes Radar:" msgid "Controlpanel & Score FontSize:" msgstr "Panel- & Spielstand-Schriftgröße:" #msgid "normal" #msgstr "Normal" msgid "bigger" msgstr "Größer" msgid "Radar & Panel Opacity:" msgstr "Radar- & Panel-Transparenz:" msgid "Colored shots on radar:" msgstr "Farbige Schüsse auf dem Radar:" msgid "Radar Shot Length:" msgstr "Radar-Schusslänge:" msgid "Radar & Panel Size:" msgstr "Radar- & Panel-Größe:" msgid "Mouse Box Size:" msgstr "Mausboxgröße:" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" msgid "Page Down for next page" msgstr "Bild Ab für nächste Seite" msgid "Page Up for previous page" msgstr "Bild Auf für vorherige Seite" msgid "Rogue" msgstr "Bösewicht" msgid "Red Team" msgstr "Rotes Team" msgid "Green Team" msgstr "Grünes Team" msgid "Blue Team" msgstr "Blaues Team" msgid "Purple Team" msgstr "Lila Team" msgid "Enter to quit, Esc to resume" msgstr "Enter um zu Beenden, Esc um Abzubrechen" msgid "Really quit?" msgstr "Wirklich beenden?" msgid "Video Format" msgstr "Videoformat" msgid "Current Format:" msgstr "Derzeitiges Format:" msgid "Key Mapping" msgstr "Tastenbelegung" msgid "Reset Defaults" msgstr "Standards wiederherstellen" msgid "Fire shot:" msgstr "Schießen:" msgid "Drop flag:" msgstr "Flagge fallenlassen" msgid "Identify/Lock On:" msgstr "Fixierung auf:" msgid "Radar Short:" msgstr "Radar Kurz:" msgid "Radar Medium:" msgstr "Radar Mittel:" msgid "Radar Long:" msgstr "Radar Lang:" msgid "Send to All:" msgstr "An Alle senden:" msgid "Send to Teammates:" msgstr "An Team senden:" msgid "Send to Nemesis:" msgstr "An Nemesis senden:" msgid "Send to Recipient:" msgstr "An Empfänger senden:" msgid "Jump:" msgstr "Springen:" msgid "Binoculars:" msgstr "Fernglas:" msgid "Toggle Score:" msgstr "Spielstand ein/ausblenden:" msgid "Tank Labels:" msgstr "Panzerbezeichnungen:" msgid "Flag Help:" msgstr "Hilfe bei Flagge:" msgid "Time Forward:" msgstr "Zeit vorwärts:" msgid "Time Backward:" msgstr "Zeit rückwärts:" msgid "Pause/Resume:" msgstr "Pause/Fortsetzen:" msgid "Self Destruct/Cancel:" msgstr "Selbstzerstörung/Abbruch:" msgid "SelfDestruct/Cancel:" msgstr "Selbstzerstörung/Abbruch:" msgid "Fast Quit:" msgstr "Schnelles Beenden:" msgid "Scroll Backward:" msgstr "Zurück scrollen:" msgid "Scroll Forward:" msgstr "Vorwärts scrollen:" msgid "Slow Keyboard Motion:" msgstr "Langsame Keyboard Bewegung:" msgid "loading {1}" msgstr "lade {1}" msgid "controls tank motion" msgstr "Kontrolliert die Bewegung des Panzers" msgid "Mouse Position:" msgstr "Mausposition:" msgid "fires shot" msgstr "schießt" msgid "drops flag (if not bad)" msgstr "Flagge fallenlassen (falls keine Flagge mit negativer Wirkung)" msgid "identifies player (locks on GM)" msgstr "identifiziert Spieler (auf GM fixieren)" msgid "jump (if allowed)" msgstr "springe (falls erlaubt)" msgid "short radar range" msgstr "kurzer Radarbereich" msgid "medium radar range" msgstr "mittlerer Radarbereich" msgid "long radar range" msgstr "langer Radarbereich" msgid "toggle binoculars" msgstr "Fernglas ein/ausschalten" msgid "toggle heads-up flag help" msgstr "Informationen zu aktueller Flagge ein/ausblenden" msgid "send message to teammates" msgstr "Nachricht an Team senden" msgid "send message to everybody" msgstr "Nachricht an alle senden" msgid "send message to nemesis" msgstr "Nachricht an Nemesis senden" msgid "send message to recipient" msgstr "Nachricht an Empfänger senden" msgid "toggle score sheet" msgstr "Spielstand ein/ausblenden" msgid "toggle tank labels" msgstr "Panzerbezeichnungen einblenden" msgid "set time of day backward" msgstr "Tageszeit zurücksetzen" msgid "set time of day forward" msgstr "Tageszeit vorsetzen" msgid "pause/resume" msgstr "Pause/Fortsetzen" msgid "self Destruct/Cancel" msgstr "Selbstzerstörung/Abbruch" msgid "quit" msgstr "beenden" msgid "scroll message log backward" msgstr "Message log rückwärts scrollen" msgid "scroll message log forward" msgstr "Message log vorwärts scrollen" #msgid "Slow Keyboard Motion" #msgstr "" msgid "Toggle Radar Flags" msgstr "Flaggen auf Radar an/aus" msgid "Toggle Main Flags" msgstr "Flaggen an/aus" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" msgid "Hunt" msgstr "Jagen" msgid "autopilot enabled" msgstr "autopilot eingeschaltet" msgid "autopilot disabled" msgstr "autopilot ausgeschaltet" msgid "show/dismiss menu" msgstr "Menü ein/ausblenden" #msgid "Esc:" #msgstr "Esc:" msgid "Maintainer:" msgstr "Hauptverantwortlicher:" msgid "Original Author:" msgstr "Ursprünglicher Autor:" msgid "Code Contributors:" msgstr "Mitarbeiter" msgid "Tank Models:" msgstr "Panzermodelle:" msgid "Special Thanks:" msgstr "Besonderer Dank an:" msgid "Send:" msgstr "Senden:" msgid "Servers" msgstr "Server" msgid "Players" msgstr "Spieler" msgid "Red" msgstr "Rot" msgid "Green" msgstr "Grün" msgid "Blue" msgstr "Blau" msgid "Purple" msgstr "Lila" msgid "Controls" msgstr "Steuerung" msgid "General" msgstr "generell" msgid "Environment" msgstr "Umgebung" msgid "Flags I" msgstr "Flaggen I" msgid "Flags II" msgstr "Flaggen II" msgid "Flags III" msgstr "Flaggen III" msgid "Readouts I" msgstr "Anzeigen I" msgid "Readouts II" msgstr "Anzeigen II" #msgid "Credits" #msgstr "Credits" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Enter drücken um auszuwählen und T um ein Format zu testen. Esc um abzubrechen." msgid "Free-style" msgstr "Freistil" msgid "Capture-the-Flag" msgstr "Erobere-die-Flagge" msgid "Rabbit Chase" msgstr "Hasenjagt" msgid "Super Flags" msgstr "Super-Flaggen" msgid "Antidote Flags" msgstr "Gegenmittel-Flaggen" msgid "Trying..." msgstr "Versuche..." msgid "Press %s to start" msgstr "Drücke %s um zu Starten" msgid "Dead" msgstr "Tot" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "Bereit" msgid "Reloaded in %.1f" msgstr "Nachgeladen in %.1f" msgid "Sealed" msgstr "Versiegelt" msgid "Zoned" msgstr "Abgegrenzt" msgid "You are now the rabbit." msgstr "Du bist jetzt der Hase." msgid "Servers found: {1}" msgstr "Server gefunden: {1}" msgid "{1} Shot" msgstr "{1} Schuss" msgid "{1} Shots" msgstr "{1} Schüsse" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" msgid "Page {1} of {2}" msgstr "Seite {1} von {2}" #msgid "openBroadcast: No udp service {1}" #msgstr "" msgid "joystick '{1}' not supported..." msgstr "Joystick '{1}' nicht unterstützt..." #msgid "Server did send endpoint information, UDP connection up" #msgstr "" #msgid "Ignoring Finder argument '{1}'" #msgstr "" msgid "Can't open list server: {1}" msgstr "Kann Listenserver nicht öffnen: {1}" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "msgid " #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" msgid "cannot load texture: {1}" msgstr "kann Textur nicht laden: {1}" msgid "Connection failed." msgstr "Verbindung fehlgeschlagen" msgid "Server forced a disconnect" msgstr "Verbindung vom Server unterbrochen" #msgid "Rogues not allowed. Try another team." #msgstr "" msgid "This team is full. Try another team." msgstr "Team ist voll, versuche ein anderes." msgid "This game is full. Try again later." msgstr "Spiel ist voll, versuche es später erneut." msgid "Game is full or over. Try again later." msgstr "Spiel ist voll oder zu Ende. Versuche es später erneut." msgid "Error connecting to server." msgstr "Fehler bei der Serververbindung" msgid "Error downloading world database" msgstr "Fehler beim Runterladen der Weltdatenbank" #msgid "Score" #msgstr "" #msgid "Kills" #msgstr "" #msgid "Team Score" #msgstr "" #msgid "Locale:" #msgstr "" #msgid "Player" #msgstr "" # Super Flags msgid "High Speed" msgstr "Hohe Geschwindigkeit" msgid "Quick Turn" msgstr "Schnelle Drehung" msgid "Oscillation Overthruster" msgstr "Oscillation Overthruster" msgid "Rapid Fire" msgstr "Schnellfeuer" msgid "Machine Gun" msgstr "Maschinengewehr" msgid "Guided Missile" msgstr "Zielsuchende Rakete" #msgid "Laser" #msgstr "Laser" msgid "Ricochet" msgstr "Querschläger" msgid "Super Bullet" msgstr "Super-Munition" msgid "Invisible Bullet" msgstr "Unsichtbare Munition" msgid "Stealth" msgstr "Unsichtbar" msgid "Tiny" msgstr "Winzig" msgid "Narrow" msgstr "Schmal" msgid "Shield" msgstr "Schild" msgid "Steamroller" msgstr "Dampfwalze" msgid "Shock Wave" msgstr "Druckwelle" msgid "Phantom Zone" msgstr "Phantom Zone" msgid "Genocide" msgstr "Genozid" msgid "Jumping" msgstr "Springen" msgid "Identify" msgstr "Identifizierung" msgid "Cloaking" msgstr "Verschleierung" msgid "Colorblindness" msgstr "Farbenblindheit" msgid "Obesity" msgstr "Fettleibigkeit" msgid "Left Turn Only" msgstr "Nur Linksdrehung" msgid "Right Turn Only" msgstr "Nur Rechtsdrehung" msgid "Momentum" msgstr "Schwerfälligkeit" msgid "Blindness" msgstr "Blindheit" msgid "Jamming" msgstr "Radarstörung" msgid "Wide Angle" msgstr "Fischauge" # Flag help msgid "You have no flag." msgstr "Du hast keine Flagge" msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Die Eigene Flagge: Hindere die Gegner daran diese Flagge zu erobern." msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Die Gegnerische Flagge: Bringe sie in die eigene Basis um sie zu erobern." #msgid "Velocity (V): Tank moves faster. Outrun bad guys." #msgstr "" msgid "Useless" msgstr "Nutzlos" msgid "Thief" msgstr "Dieb" msgid "Masquerade" msgstr "Täuschung" msgid "Seer" msgstr "Seher" msgid "Burrow" msgstr "Graben" #msgid "Angular velocity (A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" msgid "Velocity (+V): Tank moves faster. Outrun bad guys." msgstr "Geschwindigkeit (+V): Panzer wird schneller." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "Drehgeschwindigkeit (+A): Panzer dreht sich schneller." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscillation Overthruster (+OO): Ermöglicht das Fahren durch Wände und Gebäude, kann im Gebäude jedoch nicht schießen." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Schnellfeuer (+F): Schießt öfter jedoch bei verminderter Reichweite." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Maschinenpistole (+MG): Sehr schnelles Nachladen bei sehr geringer Reichweite." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Zielsuchende Rakete (+GM): Schüsse suchen sich ihr Ziel, festlegen desselbigen mit rechter Maustaste. Kann nach Abfeuern neu gesetzt oder beibehalten werden." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Feuert einen Laserstrahl ab. Unendliche Geschwindigkeit und Reichweite, jedoch sehr hohe Nachladezeit." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Querschläger (+R): Schüsse prallen ab und werden zu Querschlägern, Vorsicht vor Suizid!" #msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super-Munition (+SB): Schießt durch Gebäude hindurch, kann die Phantom Zone vernichten." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Unsichtbare Munition (+IB): Die Schüsse erscheinen zwar nicht auf dem Radar, können jedoch aus dem Fenster betrachtet gesehen werden." msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Stealth (+ST): Der Panzer ist auf dem Radar und auf dem Bildschirm nicht zu sehen, die von ihm abgefeuerten Schüsse jedoch sehr wohl. Perfekt geeignet um sich von Hinten anzuschleichen." msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Winzig (+T): Der Panzer ist sehr winzig und passt auch durch sehr kleine Öffnungen. Logischerweise ist er sehr schwer zu treffen." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Schmal (+N): Der Panzer ist sehr schmal und somit von vorne sehr schwer zu treffen, nicht jedoch von der Seite. Kann durch sehr schmale Durchgänge fahren." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Schild (+SH): Bei einem Treffer verliert man lediglich die aktuelle Flagge." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Dampfwalze (+SR): Zerstört jeden Panzer der gerammt wird." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Druckwelle (+SW): Ein Schuss zerstört alle Panzer in der näheren Umgebung, einschließlich Teamkameraden. Kann auch Panzer in oder auf Gebäuden zerstören." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Phantom Zone (+PZ): Teleportieren grenzt ab, der Panzer kann zwar durch Wände fahren jedoch nicht schießen oder erschossen werden, außer von Super-Munition und Druckwelle." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Genozid (+G): Das Töten eines Panzers bringt alle weiteren Panzer dieses Teams um." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Springen (+JP): Mit Hilfe der TAB-Taste kann der Panzer springen, jedoch in der Luft nicht navigieren" msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "Identifizierung (+ID): Identifiziert die nahegelegenste Flagge" msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Verschleierung (+CL): Macht den Panzer - aus dem Fenster betrachtet - unsichtbar, nicht jedoch auf dem Radar." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Farbenblind (-CB): Macht die Unterscheidung der Teamfarben unmöglich." msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Fettleibigkeit (-O): Der Panzer wird riesig groß, passt nicht mehr durch Teleporter und ist logischerweise ein leichtes Ziel" msgid "left turn only (- <-): Can't turn right." msgstr "Nur Linksdrehung (- <-): Keine Rechtsdrehung möglich" msgid "right turn only (- ->): Can't turn left." msgstr "Nur Rechtsdrehung (- ->): Keine Linksdrehung möglich" msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Schwerfälligkeit (-M): Der Panzer wird sehr träge und schwerfällig, die Beschleunigung und Manövrierfähigkeit ist stark verringert." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Blindheit (-B): Bis auf das Radar ist der Spieler vollständig blind" msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Radarstörung (-JM): Das Radar funktioniert nicht mehr jedoch ist die normale Sicht weiterhin frei." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Fischauge (-WA): Sicht wie durch ein Weitwinkel-Objektiv." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag ist ein Netzwerkbasiertes Multiplayer Panzerspiel mit fünf Teams: " msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "Rot, Grün, Blau, Lila und Bösewichte (deren Panzer Schwarz sind). Die Zerstörung" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "eines Spielers eines gegnerischen Teams bringt einen Punkt, wohingegen die" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "Zerstörung eines Teammitglieds in einem Punkt Abzug resultiert. Die Punktzahl eines Einzelnen sowie die des Teams wird laufend synchronisiert." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Bösewichte haben keine Teammitglieder (auch nicht die anderen Bösewichte), ergo können sie" msgid "teammates and they don't have a team score." msgstr "auch keine Teammitglieder erschießen und haben somit keine Teampunkte." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "Es gibt zwei Spielmodi, die von der Einstellung des Servers (Hosts) abhängen:" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "Capture-the-flag und Free-Style. Das Ziel im Free-Style Modus ist es," msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "möglichst viele Punkte durch das Abschießen von Gegnern zu erreichen. Das Ziel im" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "Capture-the-Flag Modus ist es, die gegnerische Flagge zu erobern und gleichzeitig die Eigene zu verteidigen." msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "Jedes Team (außer den Bösewichten) hat eine Basis und bei zumindest einem" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "Spieler eine Flagge in der Farbe des Teams. Die Flagge gilt als erobert," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "wenn sie - am Boden - in die eigene Basis zurückgebracht wird. In der Luft errungene Punkte (beispielsweise auf einer erhöhten Plattform über der eigenen Basis)" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "werden nicht gezählt. Die Eroberung einer gegnerischen Flagge zerstört alle Mitspieler" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "dieses gegnerischen Teams und erhöht die eigene Teampunktzahl. Die zerstörten Spieler fangen anschließend" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "anschließend wieder in ihrer eigenen Basis an. Wird die eigene Flagge in die gegnerische Basis gebracht, so" msgid "your team but not for the enemy team." msgstr "zählt dies zwar als eine Niederlage für das eigenen Team, nicht jedoch als Erfolg für das gegerische Team in dessen Basis man sich befindet." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Die Spielwelt besteht aus einer durch Außenwände abgegrenzten Spielfläche mit mehreren Gebäuden." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Das Verlassen des Spielfeldes ist nicht möglich (auch nicht durch drüberspringen)," msgid "You cannot normally drive or shoot through buildings." msgstr "ebensowenig wie das Schießen oder Fahren durch Gebäude." msgid "The server may be configured to include teleporters: large transparent" msgstr "Es kann sein, dass sich - abhängig von der Serverkonfiguration - auf dem Spielfeld Teleporter befinden:" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "Große transparente schwarze Tore. Sämtliche Objekte die sich auf einer Seite des Teleporters in diesen hinein bewegen, kommen" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "unverzüglich auf der Gegenseite eines anderen (oder auch des gleichen, falls so konfiguriert) Teleporters wieder raus." msgid "teleport is reversible; reentering the same side of the destination" msgstr "Eine Teleportation ist reversibel da die Teleporter statisch miteinander verlinkt sind." msgid "teleporter brings you back to where you started. Teleport connections" msgstr "Die Verlinkung der einzelnen Teleporter zueinander wird beim Spielstart" msgid "are fixed at the start of the game and don't change during the game." msgstr "festgelegt und ändert sich zur Laufzeit des Spiels nicht." msgid "The connections are always the same in the capture-the-flag style." msgstr "Bei Capture-the-Flag sind die Verbindungen zwischen den Teleportern immer gleich." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Eine wichtige Eigenschaft der Teleporter ist, dass die beiden Seiten voneinander unabhängig sind," msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "d.h. es besteht theoretisch die Möglichkeit, dass ein Teleporter" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "als Ziel die andere Seite seiner Selbst definiert hat." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Ein Teleporter kann auch als Ziel sich selbst haben (also nicht die andere Seite seiner Selbst)," msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "dies nennt man einen spiegelnden Teleporter. Das Hineinschießen in solch einen" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "führt mit sehr hoher Wahrscheinlichkeit zur Selbstzerstörung, einen Laser hineinzufeuern ist auf alle Fälle tödlich." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Es gibt zwei Arten von Flaggen: Team-Flaggen und Super-Flaggen. Team-Flaggen" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "existieren lediglich im Capture-the-Flag Modus, was jedoch - je nach Serverkonfiguration -" msgid "configured to supply super flags, which give your tank some advantage" msgstr "die Existenz der Super-Flaggen in diesem Modus nicht ausschließt. Diese Flaggen können" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "dem eigenen Panzer entweder einen Vorteil oder einen Nachteil bringen. Bevor man eine Flagge aufgenommen hat, ist es unmöglich zu sagen was es für eine ist" msgid "but good flags generally outnumber bad flags two to one." msgstr "Die Wahrscheinlichkeit eine positiv wirkende Flagge zu erhalten beträgt jedoch in der Regel 2 zu 1." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Super-Flaggen können überall sein wohingegen Team-Flaggen sich besser nicht an bestimmten Orten aufhalten sollten," msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "beispielsweise auf einem Gebäude oder in einer gegnerischen Basis. Flaggen die an einem solchen Ort fallen gelassen werden," msgid "moved to a safety position. Captured flags are placed back on their" msgstr "werden automatisch an einen sicheren Ort gebracht. Eroberte Flaggen werden automatisch wieder zurück in die" msgid "team base. Super flags dropped above a building always disappear." msgstr "eigene Basis befördert. Super-Flaggen, die oberhalb eines Gebäudes abgeworfen werden, verschwinden." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "In der Regel überlebt eine Super-Flagge bis zu vier verschiedene Besitzer, bevor" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "sie verschwindet und von einer zufallsgenerierten ersetzt wird." msgid "flag. Bad random super flags disappear after the first possession." msgstr "Negativ wirkende Flaggen verschwinden bereits nach dem ersten Besitzer." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Im Normalfall können sich negativ auswirkende Flaggen nicht fallen gelassen werden, deren Behandlung" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "hängt von der Serverkonfiguration ab. Beispielsweise können sie automatisch nach einiger Zeit fallen gelassen werden, nach der Zerstörung einer" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "bestimmten Anzahl an Gegnern, oder erst nachdem eine passende Gegenmittel-Flagge aufgesammelt wurde." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Gegenmittel-Flaggen werden gelb dargestellt und erscheinen erst, sobald eine negativ wirkende Flagge aufgenommen wurde." # Help 5 Strings msgid "Good Flags:" msgstr "Positiv wirkende Flaggen:" msgid "boosts top speed" msgstr "Erhöht die Höchstgeschwindigkeit" msgid "High Speed (V)" msgstr "Hohe Geschwindigkeit (V)" msgid "boosts turn rate" msgstr "Erhöht die Drehgeschwindigkeit" msgid "Quick Turn (A)" msgstr "Schnelle Drehung (A)" msgid "can drive through buildings" msgstr "Kann durch Gebäude und Wände fahren" #msgid "Oscillation Overthruster (OO)" #msgstr "Oscillation Overthruster (OO)" msgid "faster shots more often" msgstr "Erhöhte Schussfrequenz" msgid "Rapid Fire (F)" msgstr "Schnellfeuer (F)" msgid "very fast reload, very short range" msgstr "Sehr schnelles Nachladen, sehr niedrige Reichweite" msgid "Machine Gun (MG)" msgstr "Maschinenpistole (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "Schüsse suchen sich ihr Ziel selbst (Rechte Maustaste um Ziel zu bestimmen)" msgid "Guided Missile (GM)" msgstr "Zielsuchende Rakete" msgid "infinite shot speed and range, long reload time" msgstr "Unendliche Schussfrequenz und Reichweite" #msgid "Laser (L)" #msgstr "Laser (L)" msgid "shots ricochet" msgstr "Schüsse werden zu Querschlägern" msgid "Ricochet (R)" msgstr "Querschläger (R)" msgid "shoots through buildings" msgstr "Schüsse gehen durch Gebäude und Wände" msgid "Super Bullet (SB)" msgstr "Super-Munition (SB)" msgid "tank invisible on enemy radar" msgstr "Eigener Panzer auf gegnerischem Radar unsichtbar" msgid "Stealth (ST)" msgstr "Stealth (ST)" msgid "tank invisible out the window" msgstr "Eigener Panzer außer auf dem Radar nicht sichtbar" msgid "Cloaking (CL)" msgstr "Verschleierung" msgid "shots invisible on radar" msgstr "Eigene Schüsse auf dem Radar unsichtbar" msgid "Invisible Bullet (IB)" msgstr "Unsichtbare Munition (IB)" msgid "tank becomes smaller" msgstr "Panzer wird winzig klein" msgid "Tiny (T)" msgstr "Winzig (T)" msgid "tank becomes paper thin" msgstr "Panzer wird papierdünn" msgid "Narrow (N)" msgstr "Schmal (N)" msgid "getting hit just drops the flag" msgstr "Ein Treffer führt lediglich zum Verlust der Flagge" msgid "Shield (SH)" msgstr "Schild (SH)" msgid "destroy tanks by touching them" msgstr "Gegnerische Panzer werden durch Rammen zerstört" msgid "Steamroller (SR)" msgstr "Dampfwalze (SR)" msgid "expanding spherical shell of destruction" msgstr "Alle Objekte im Umkreis werden zerstört" msgid "Shock Wave (SW)" msgstr "Druckwelle" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "Teleport in die Eingangs/Ausgangs Zone" #msgid "Phantom Zone (PZ)" #msgstr "Phantom Zone (PZ)" msgid "destroys player and all player's teammates" msgstr "Zerstört bei Zerstörung des Spielers auch dessen gesamtes Team" msgid "Genocide (G)" msgstr "Genozid (G)" msgid "allows tank to jump" msgstr "Ermöglicht Sprünge mit dem Panzer" msgid "Jumping (JP)" msgstr "Springen (JP)" msgid "shows type of nearest superflag" msgstr "Identifiziert den Typ der Nächstliegenden Super-Flagge" msgid "Identify (ID)" msgstr "Identifizierung (ID)" msgid "Bad Flags:" msgstr "Negativ wirkende Flaggen:" msgid "can't identify tanks" msgstr "Kann Teamfarben nicht mehr unterscheiden" msgid "Colorblindness (CB)" msgstr "Farbenblindheit (CB)" msgid "makes tank very large" msgstr "Bläht den Panzer enorm auf" msgid "Obesity (O)" msgstr "Fettleibigkeit (O)" msgid "tank can't turn right" msgstr "Panzer kann keine Rechtsdrehung mehr durchführen" msgid "Left Turn Only (<-)" msgstr "Nur Linksdrehung (<-)" msgid "tank can't turn left" msgstr "Panzer kann keine Linksdrehung mehr durchführen" msgid "Right Turn Only (->)" msgstr "Nur Rechtsdrehung (->)" msgid "tank has lots of momentum" msgstr "Panzer wird enorm schwerfällig und träge" msgid "Momentum (M)" msgstr "Schwerfälligkeit (M)" msgid "can't see out the window" msgstr "Offene Sicht aus dem Fenster ist versperrt" msgid "Blindness (B)" msgstr "Blindheit (B)" msgid "can't see anything on radar" msgstr "Radar gestört und wirkungslos" msgid "Jamming (JM)" msgstr "Radarstörung (JM)" msgid "fish eye view out the window" msgstr "Fischaugensicht aus dem Fenster" msgid "Wide Angle (WA)" msgstr "Fischauge (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Das Radar befindet sich auf der Linken Seite des Kontrollpanels. Es zeigt eine bersicht aus" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "der Vogelperspektive. Gebäude und die Außenwände sind in hellem Blau dargestellt," msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "die Basen der Teams in den jeweiligen Teamfarben. Teleporter sind kurze, gelbe" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "Striche, Panzer sind Punkte in der jeweiligen Farbe des Teams, Bösewichte sind" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "gelb. Die Größe eines einen Panzer repräsentierenden Punktes ist eine grobe" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "Andeutung auf seine Höhe, je höher der Panzer platziert ist desto größer der ihn repräsentierende Punkt." #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" msgid "Server Command Key:" msgstr "Serverbefehlstaste:" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" msgid "Style:" msgstr "Stil" msgid "Free for All" msgstr "Frei für Alle" msgid "Capture the Flag" msgstr "Erobere die Flagge" msgid "Max Players:" msgstr "Max Spieler:" msgid "Max Shots:" msgstr "Max Schüsse:" msgid "Teleporters:" msgstr "Teleporter:" msgid "Ricochet:" msgstr "Querschläger:" msgid "Jumping:" msgstr "Springen:" msgid "Superflags:" msgstr "Superflaggen:" msgid "all flags" msgstr "alle Flaggen" msgid "good flags only" msgstr "nur gute Flaggen" msgid "Max Superflags:" msgstr "Max Superflaggen:" msgid "Bad Flag Antidote:" msgstr "Schlechte Flaggen Gegengift:" msgid "Bad Flag Time Limit:" msgstr "Schlechte Flaggen Zeitlimit" msgid "no limit" msgstr "kein Limit" msgid "15 seconds" msgstr "15 sekunden" msgid "30 seconds" msgstr "30 sekunden" msgid "60 seconds" msgstr "60 sekunden" msgid "180 seconds" msgstr "180 sekunden" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" msgid "Game Over:" msgstr "Spiel vorbei:" msgid "never" msgstr "nie" msgid "after 5 minutes" msgstr "nach 5 minuten" msgid "after 15 minutes" msgstr "nach 15 minuten" msgid "after 60 minutes" msgstr "nach 60 minuten" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "Flaggen werden dargestellt durch kleine weiße Punkte, Team-Flaggen in der jeweiligen Farbe des Teams. Super-Flaggen sind immer weiß," msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "die Gegenmittel-Flagge ist gelb. Schüsse werden dargestellt durch kleine, sich bewegende Punkte oder" msgid "cyan" msgstr "zyan" msgid "grey" msgstr "grau" #msgid "text" #msgstr "" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "Kreisförmige Wellen für Laser und Druckwelle. Der eigene Panzer wird zentriert dargestellt," msgid "None" msgstr "Keine" msgid "Pulsating" msgstr "Pulsierend" msgid "Underline" msgstr "Unterstreichen" # Identifikace vlajek # Flags identification msgid "Closest Flag: High Speed" msgstr "Nächste Flagge: Hohe Geschwidigkeit" msgid "Closest Flag: Quick Turn" msgstr "Nächste Flagge: Schnelles Drehen" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "Nächste Flagge: " msgid "Closest Flag: Rapid Fire" msgstr "Nächste Flagge: Schnellfeuer" msgid "Closest Flag: Machine Gun" msgstr "Nächste Flagge: Maschinengewehr" msgid "Closest Flag: Guided Missile" msgstr "Nächste Flagge: Lenkgeschoss" msgid "Closest Flag: Laser" msgstr "Nächste Flagge: Laser" msgid "Closest Flag: Ricochet" msgstr "Nächste Flagge: Querschläger" msgid "Closest Flag: Super Bullet" msgstr "Nächste Flagge: Supergeschoss" msgid "Closest Flag: Stealth" msgstr "Nächste Flagge: Stealth" msgid "Closest Flag: Cloaking" msgstr "Nächste Flagge: Verschleierung" msgid "Closest Flag: Invisible Bullet" msgstr "Nächste Flagge: Unsichtbares Geschoss" msgid "Closest Flag: Tiny" msgstr "Nächste Flagge: Klein" msgid "Closest Flag: Narrow" msgstr "Nächste Flagge: Schmal" msgid "Closest Flag: Shield" msgstr "Nächste Flagge: Schild" msgid "Closest Flag: Steamroller" msgstr "Nächste Flagge: Dampfwalze" msgid "Closest Flag: Shock Wave" msgstr "Nächste Flagge: Schockwelle" msgid "Closest Flag: Phantom Zone" msgstr "Nächste Flagge: Phantom Zone" msgid "Closest Flag: Genocide" msgstr "Nächste Flagge: Genozid" msgid "Closest Flag: Jumping" msgstr "Nächste Flagge: Springen" msgid "Closest Flag: Identify" msgstr "Nächste Flagge: Identifizieren" msgid "Closest Flag: Colorblindness" msgstr "Nächste Flagge: Farbenblindheit" msgid "Closest Flag: Obesity" msgstr "Nächste Flagge: Übergewicht" msgid "Closest Flag: Left Turn Only" msgstr "Nächste Flagge: Nur Linksdrehen" msgid "Closest Flag: Right Turn Only" msgstr "Nächste Flagge: Nur Rechtsdrehen" msgid "Closest Flag: Momentum" msgstr "Nächste Flagge: Verzögerung" msgid "Closest Flag: Blindness" msgstr "Nächste Flagge: Blindheit" msgid "Closest Flag: Jamming" msgstr "Nächste Flagge: Störung" msgid "Closest Flag: Wide Angle" msgstr "Nächste Flagge: Fischauge" # Ostatni # Other msgid "Server started." msgstr "Server gestartet." msgid "Shot myself" msgstr "Selbst abgeschossen" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated msgid "Pausing in" msgstr "Pausiere in" msgid "Press Pause to resume" msgstr "Drücke Pause um weiter zu machen" msgid "Got shot by " msgstr "Wurde erschossen von " #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "die Fahrtrichtung ist auf dem Radar immer oben. Das gelbe V repräsentiert das Sichtfeld," msgid "is indicated by the letter N." msgstr "Norden wird dargestellt durch ein N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Das HUD zeigt mehrere Dinge an. Die beiden Boxen in der Mitte" msgid "center of the view are the motion control boxes; within the small box" msgstr "sind die Bewegungsboxen. Befindet sich der Mauszeiger innerhalb der kleinen Box," msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "steht der Panzer still. Außerhalb der kleinen Box und innerhalb der großen Box findet die Beschleunigung statt." msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "Die Position des Mauszeigers in Relation zur kleinen Box stellt die Fahrt- und Drehrichtung dar:" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "Oben=Vorwärts, Unten=Rückwärts sowie Links und Rechts ihrem Äquivalent entsprechend." msgid "The distance away from the small box determines the speed." msgstr "Die Entfernung des Mauszeigers von der kleinen Box in der Mitte repräsentiert die Geschwindigkeit." # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Über der großen Box befindet sich die aktuelle Himmelsrichtungs-Anzeige." msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "Norden ist 0, Osten ist 90, usw. Falls Springen erlaubt ist oder man im Besitz der Sprungflagge ist," msgid "an altitude tape appears to the right of the larger box." msgstr "erscheint eine Höhenskala rechts neben der großen Box." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Auf der Himmelsrichtungs-Anzeige können farbige Rauten oder Pfeile erscheinen, so bedeutet" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "beispielsweise ein nach Links zeigender Pfeil, dass eine bestimmte Flagge sich zur Linken befindet." msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "Eine Raute auf der Skala zeigt die relative Position der Flagge" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "bezüglich der Skala an. Im Capture-the-Flag Modus zeigt ein kleiner" msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "Indikator immer in Richtung der eigenen Team-Flagge. Ein gelber Indikator" msgid "A yellow marker shows the way to the antidote flag." msgstr "deutet den Weg zur Gegenmittel-Flagge." msgid "At the top of the display are, from left to right, your callsign and" msgstr "Ganz oben am Bildschirm befinden sich, von Links nach Rechts, der Nickname" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "und die eigene Punktzahl, sowie aktueller Status und Flagge. Der Nickname ist " msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "immer in der Farbe des Teams gehalten, der Status kann sein Bereit, Tot, Versiegelt, Abgegrenzt oder" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "Nachladend (die verbleibenden Sekunden werden angezeigt). Falls der Server so konfiguriert ist," msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "dass negativ wirkende Flaggen automatisch fallen gelassen werden nach einer bestimmten Zeitspanne, wird hier ebenfalls die noch verbleibende Zeit angezeigt." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Auch weitere Nachrichten können von Zeit zu Zeit auf dem HUD erscheinen." # BZFS Messages msgid "You are now an administrator!" msgstr "Du bist jetzt Administrator" msgid "Wrong Password!" msgstr "Falsches Kennwort" msgid "unknown command" msgstr "Unbekannter Befehl" msgid "Countdown started." msgstr "Countdown initiiert." msgid "IP pattern added to banlist" msgstr "IP-Bereich gebannt" msgid "malformed address" msgstr "fehlerhafte Adresse" msgid "removed IP pattern" msgstr "IP-Bereich entfernt" bzflag-2.4.2+ds1/data/l10n/bzflag_en_US_l33t.po000066400000000000000000001226611200563112200206750ustar00rootroot00000000000000# this is l337! msgid "Join Game" msgstr "j0iN gamE" msgid "en_US_l33t" msgstr "l337" msgid "translator" msgstr "Dave Brosius" msgid "Find Server" msgstr "f1nD $erV3R" msgid "Connect" msgstr "C0nn3ct" msgid "Callsign:" msgstr "c@LL519N:" msgid "Team:" msgstr "+e4m:" msgid "Server:" msgstr "$erver:" msgid "Port:" msgstr "POR+:" msgid "Start Server" msgstr "s+ar+ $3Rv3r" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "up/down 4rrOW5 t0 mOVe, 3NtER To $3lEc+, e$c t0 d15mI$$" msgid "Options" msgstr "0P+Ions" msgid "Help" msgstr "H31P" msgid "Quit" msgstr "KwIT" msgid "on" msgstr "Awn" msgid "Dithering:" msgstr "dItH3RIng:" msgid "off" msgstr "awlf" msgid "Off" msgstr "0pHph" msgid "On" msgstr "on" msgid "Blending:" msgstr "8l3NDiN9:" msgid "Smoothing:" msgstr "5MOO+hIN9:" msgid "Lighting:" msgstr "lIGht1n9:" msgid "Texturing:" msgstr "TexTuR1n9:" msgid "Nearest" msgstr "n3@re5+" msgid "Linear" msgstr "L1Ne4R" msgid "Nearest Mipmap Nearest" msgstr "n3@Re5+ M1pmAp n3@Re$+" msgid "Linear Mipmap Nearest" msgstr "l1NeAR MIPM4P NE4Re5t" msgid "Nearest Mipmap Linear" msgstr "NEaRes+ m1PM4P l1N34R" msgid "Linear Mipmap Linear" msgstr "LiNe4r Mipm@P l1nE4R" msgid "Quality:" msgstr "KWAl1+y:" msgid "Low" msgstr "loW" msgid "Medium" msgstr "M3D1uM" msgid "High" msgstr "H19h" msgid "Shadows:" msgstr "SH@D0W$:" msgid "Depth Buffer:" msgstr "deptH BUFPHEr:" msgid "Not available" msgstr "nOt 4v@1l4BLe" msgid "Change Video Format" msgstr "Ch@N93 vID30 F0rM4+" msgid "Brightness:" msgstr "8RI9h+n355:" msgid "Sound Volume:" msgstr "5OUnD VOlUmE:" msgid "Off / Backup Mode" msgstr "Awlf / B4C|): Can't turn left." msgstr "RIGht tUrn 0NLY (- ->): C4n'+ +URN left. " msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "MoM3n+UM (-M): t4nK hA$ INeR+14. @ccELer4T10n 15 L1Mi+3D." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "8liNDN3$$ (-B): C4n'+ $33 0u+ w1NDoW. r@D4R 5TIll WORK5." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "J4MM1n9 (-JM): R4D@R Do35n'+ W0rK. C@n 5T1LL $3e." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "W1D3 4n9l3 (-WA): Phi$H-eY3 l3nS dI5+0Rt$ Vi3w. " #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BzFlag i$ @ mUL+1-pl4YER NEtWoRKed +@Nk 8@+TLE 9@m3. Th3r3 4Re PH1Ve +E4m5:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "RED, gRE3N, 8LUE, pUrpL3, 4nD Ro9U35 (r0gUe +ANk$ @Re BL4Ck). DEs+ROY1N9 4" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "PLAY3R 0N @nOTHEr +e4m 5C0R35 4 WIN, WHIL3 beiN9 DE$trOyEd oR deS+r0y1Ng 4" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "+3@Mm@Te $COR3$ 4 lOS$. INDivIDu4L 4Nd 499r394T3 t34M scOr3$ 4Re +4LLieD." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "R09uE5 hAv3 N0 T3Amm4T3$ (nO+ 3V3n OTH3r R0gue5),50 th3Y C4NNo+ $HOoT" msgid "teammates and they don't have a team score." msgstr "+E@mM@T3S @nd Th3Y DON'+ h@V3 4 T3@M 5C0r3. " msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "+HeRe 4RE +W0 5TyLe5 0PH pL4Y, d3+ErM1nED By TEh 5ERv3R C0nfiGUR4t10n: c@P+URe-" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "Th3-pHL@9 anD PhR33-PH0R-4LL. iN FrEE-F0R-4ll ThE 0BJeCT 1$ $ImPLY +o G3T t3H" msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "H19H35+ 5c0r3 BY 5h0OTIn9 oPpOneNT$. +3H objeCT In c4p+uRE-+HE-fL@9 I5 tO" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "C4P+URE 3n3my FL@9S WHiL3 pR3V3n+1N9 0Pp0N3Nt5 pHrOM c4ptUR1nG Y0UR5. 1N TH15" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "$TylE, e4cH +E4M (bU+ NO+ R09UE$) H45 4 te@m B@se @ND 3ACh tE4M w1TH 4+ lE45T" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "oN3 pl4Y3R h45 4 +34m fl4G wHiCH H45 +3h colOR 0F +H3 +3aM. t0 c4pTUr3 @ PHl49," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "J00 mU$T 9r4b i+ 4nD briNG 1+ 8@cK T0 J00r +34m 8A5E (Y0u Mu$+ bE 0N +h3 9ROUNd" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "iN j00r 8453 +0 r3915+ER The caP+uR3). C4p+UrINg 4 FL4g d35tRoYs 4LL +h3 PL@Y3r$" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "oN tH4+ t34M 4ND GIVES j00r tE@M $C0re @ 8onu5; +H3 pL4YER5 w1ll r35T@R+ 0N" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "+HE1R te4M 8A53. +@kIN9 j00r FL4g oN+O 4n EnEmy b@$e COUN+5 45 4 C4PTure @9A1Ns+" msgid "your team but not for the enemy team." msgstr "J00R +E4M 8u+ nOt F0R tH3 En3mY +3@M." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "tEh WOrld 3NV1R0Nm3N+ C0NT41n$ 4N 0uT3R W4ll 4ND $EV3RAl 8UILd1n9$." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "J00 C@NnOT gO ouT5ID3 +hE Ou+3r w@Ll (Y0U c@N'+ 3V3N jUMp 0vEr 1+). " msgid "You cannot normally drive or shoot through buildings." msgstr "J00 CanNOt noRm@LLY DRIVe Or $h0O+ ThrOU9h 8uiLdiN95." msgid "The server may be configured to include teleporters: large transparent" msgstr "Teh 5ERVeR MaY be CoNPhi9uR3D +O INcLUde T3l3p0R+eR5: L4R9e +R4N5PArEn+" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "Bl4cK sl4b5. O8J3Ct5 3n+eR1NG 0ne 51D3 0PH A +3Lep0R+3r 4r3 1N5+AN+lY" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "moveD +0 ON3 SIDE Of 4n0+h3R (OR pOs$i8LY +HE 54ME) TeL3pORt3R. +hE" msgid "teleport is reversible; reentering the same side of the destination" msgstr "+3LeP0Rt 15 REV3R5iblE; re3N+ERin9 +He 54m3 $1d3 0F +H3 d3$tin4t10N" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "TELEPORTER br1N95 j00 84CK +0 WHEr3 J00 5+4R+ed. +3lEP0Rt C0nN3c+I0N5" msgid "are fixed at the start of the game and don't change during the game." msgstr "@Re pH1XEd 4+ +H3 St@RT 0PH T3H gAMe 4ND DOn'+ CH4n93 DUR1N9 +H3 94mE. " msgid "The connections are always the same in the capture-the-flag style." msgstr "t3h C0nnEcTI0N5 aR3 @LW4Y$ +3H 54M3 1N tHE c@P+URe-+HE-FL@G $TYl3." msgid "Each side of a teleporter teleports independently of the other side." msgstr "E4CH 51D3 0F @ +3lEp0r+ER +EL3P0RTs iNDEp3ND3ntLY 0F TH3 Oth3R $1d3." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "i+'5 p0$518L3 PhOr @ +3lEP0RtEr +0 tElEP0R+ +0 +h3 OPP0$I+3 5iDE OF" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "ITseLPH. 5UCh 4 THRu-+el3P0r+eR @C+5 almO5t 4s 1ph it w45N'T THEre." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "@ +3lEpOrT3R CaN AL$O TELEPOR+ T0 +H3 S@M3 51D3 0f i+$3Lf. ThI$ 1$ @" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "R3v3r5e +elEPor+Er. 5HooT1n9 @+ 4 R3V3r53 T3LEpor+Er 15 l1kELY +0 BE" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "5ELF D3$+RUc+IV3; $H0O+1nG 4 l45ER 4+ OnE IS 1nv4R14BLY F4+4L." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Phl4GS c0M3 in tw0 V4R1Et1E$: +34m FL4g$ @Nd 5uP3r pHL495. +34M PhL49S" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "4R3 U5Ed oNLY 1N +hE C4P+UR3-+h3-phL@9 5TYL3. Th3 $3rVER m@Y 4L5o BE" msgid "configured to supply super flags, which give your tank some advantage" msgstr "CONf1GurEd +O 5UPPLy $Uper pHl4G5, WH1ch 9IV3 J00R +4Nk 50M3 4Dv4N+A93" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "0R D1$4Dv4n+@9e. j00 NORM4LlY C4N'+ t3Ll whIcH UNT1L J00 piCK 0N3 Up, " msgid "but good flags generally outnumber bad flags two to one." msgstr "bUT Go0D FL49s G3N3R@LlY 0U+NUMbeR 84d fL495 +W0 +0 One. " msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "+e@m Phl495 @R3 N0+ @llow3D +0 BE In B4D pl@c35. B4d pL4CeS 4R3: 0n " msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "a bUiLDInG OR On @N 3n3MY 8@53. +3aM Fl@9S DR0PP3D In @ B4d PlaCE 4re" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "MOV3D +0 4 S4PhEtY p05itI0n. CaP+UreD fL@g$ 4RE PL4cED b4Ck 0n ThEIr" msgid "team base. Super flags dropped above a building always disappear." msgstr "Te@M b4$3. SuP3R fl@g5 dR0PP3d 4bov3 4 8uiLd1N9 4LW4Ys Di5apPE4R." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "A R@nd0m Go0D 5uP3R PhL@G wIlL R3m41N fOR Up TO 4 po5s3S$10n5. 4PH+3R " msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "+haT 1t'Ll DI5ApP3@R 4nd w1Ll 3VEntU4lLy b3 REPL@CED By @ neW R4NDoM" msgid "flag. Bad random super flags disappear after the first possession." msgstr "Phl49. 8@D R4nd0M 5uP3r Phl495 D15@pP34R AF+3R +H3 F1R5T p0$53551oN. " msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "B4d sUp3r fLa9S cAN'+ norm4lly BE DRoPP3d. +3H 53rVer C4N Be 53+ To" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "4UT0M4t1C@lLy DR0P +3h FLA9 Phor J00 4pHTeR 50M3 +1m3, @PH+Er j00 d3sTr0Y" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "A c3R+4In NUMb3R 0pH eNem13S, 4nD/Or wh3n j00 GR@8 4n @n+1doTE Fl4g. " msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "@nTIdO+3 fL49S 4r3 y3lLOW 4nD oNly @Ppe@r when j00 H4V3 A B@D PhL@g." # Help 5 Strings msgid "Good Flags:" msgstr "9ood FL@G5:" msgid "boosts top speed" msgstr "Bo05T$ +Op $P3eD" msgid "High Speed (V)" msgstr "H1GH 5pE3D (V)" msgid "boosts turn rate" msgstr "BO05+$ +URn r4T3" msgid "Quick Turn (A)" msgstr "kW1cK TUrN (A)" msgid "can drive through buildings" msgstr "c@N dR1V3 THRou9H bu1Ld1NG5" msgid "Oscillation Overthruster (OO)" msgstr "O$cILL@+1on 0VErthrU5TEr (OO)" msgid "faster shots more often" msgstr "Ph@5+eR 5hOTs M0re 0F+3n" msgid "Rapid Fire (F)" msgstr "R4piD F1r3 (F)" msgid "very fast reload, very short range" msgstr "VerY pH4$t REL0@D, veRy 5hOrt R4n9E" msgid "Machine Gun (MG)" msgstr "m4chIne 9un (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "5HOt5 GUID3 tHEM5eLv3S (RiGHT M0U53 Lock5 0n)" msgid "Guided Missile (GM)" msgstr "9u1D3D Mi$$iLe (GM)" msgid "infinite shot speed and range, long reload time" msgstr "INf1nITE 5h0T 5PEEd 4ND rAn9E, LOn9 R3LO4D T1mE" msgid "Laser (L)" msgstr "l45ER (L)" msgid "shots ricochet" msgstr "SHOt5 rICOCh3t" msgid "Ricochet (R)" msgstr "rICOcH3+ (R)" msgid "shoots through buildings" msgstr "$ho0+5 tHRough Bu1LDIng5" msgid "Super Bullet (SB)" msgstr "5uPER BUlLET (SB)" msgid "tank invisible on enemy radar" msgstr "+4Nk INV151bl3 0N 3neMY R4d@R" msgid "Stealth (ST)" msgstr "5+E@l+H (ST)" msgid "tank invisible out the window" msgstr "taNk inV151BL3 oU+ +H3 wInD0w" msgid "Cloaking (CL)" msgstr "CL04K1N9 (CL)" msgid "shots invisible on radar" msgstr "sH0+5 INv1$1bL3 ON r@d4r" msgid "Invisible Bullet (IB)" msgstr "1Nv151ble bULLe+ (IB)" msgid "tank becomes smaller" msgstr "t@NK 83C0Me5 5M4LlER" msgid "Tiny (T)" msgstr "t1Ny (T)" msgid "tank becomes paper thin" msgstr "+4nK beCOM35 p4P3r +hIn" msgid "Narrow (N)" msgstr "N4RR0W (N)" msgid "getting hit just drops the flag" msgstr "G3+t1NG Hi+ JUST drOP$ tEh Phla9 " msgid "Shield (SH)" msgstr "$hIELd (SH) " msgid "destroy tanks by touching them" msgstr "D35+rOY +ank$ BY ToUch1n9 +H3m" msgid "Steamroller (SR)" msgstr "$+Eamr0lL3r (SR)" msgid "expanding spherical shell of destruction" msgstr "EXPANDIN9 Sph3R1C4l SH3LL 0Ph de$+ruCt10N" msgid "Shock Wave (SW)" msgstr "5h0cK W4v3 (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "+3l3PoR+ +0 ENT3R/LE4V3 z0Ne" msgid "Phantom Zone (PZ)" msgstr "PH@N+OM ZoN3 (PZ)" msgid "destroys player and all player's teammates" msgstr "D3$Tr0Y$ PL@YeR @ND @lL Pl4YEr's +34MM@TE$" msgid "Genocide (G)" msgstr "GEn0ciDE (G)" msgid "allows tank to jump" msgstr "4Ll0W$ +@nK +O JUMP" msgid "Jumping (JP)" msgstr "jUMP1n9 (JP) " msgid "shows type of nearest superflag" msgstr "5hoW5 +yp3 Of N3Are5T Superfl@G" msgid "Identify (ID)" msgstr "1D3nt1Fy (ID)" msgid "Bad Flags:" msgstr "8@D fL@9S:" msgid "can't identify tanks" msgstr "C4N't iDen+IphY t@nk$" msgid "Colorblindness (CB)" msgstr "c0LOR8L1NdnE55 (CB)" msgid "makes tank very large" msgstr "M4KE5 t@nK v3rY l4R9E" msgid "Obesity (O)" msgstr "OBe$i+Y (0)" msgid "tank can't turn right" msgstr "t@NK c@n'+ Turn R1GhT" msgid "Left Turn Only (<-)" msgstr "LePH+ +urN 0NlY (<-)" msgid "tank can't turn left" msgstr "+4NK c4N'T +uRN lePht" msgid "Right Turn Only (->)" msgstr "R1gH+ +UrN ONLY (->)" msgid "tank has lots of momentum" msgstr "+4NK H45 l0+s Of m0M3N+UM" msgid "Momentum (M)" msgstr "M0m3n+uM (M)" msgid "can't see out the window" msgstr "C4n't $EE 0U+ +3H w1Nd0W" msgid "Blindness (B)" msgstr "8LINdn3$$ (B)" msgid "can't see anything on radar" msgstr "c4n'+ 53E aNYtHIN9 ON RAd4R" msgid "Jamming (JM)" msgstr "j4mm1N9 (JM)" msgid "fish eye view out the window" msgstr "fI$h EY3 v13W OUT +he w1ndOW" msgid "Wide Angle (WA)" msgstr "WIde 4N9L3 (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "T3h R4D4r 1$ 0N +H3 L3F+ 51D3 oF tH3 COnTRol P4nEl. I+ 5hoW5 4n 0vErH34d" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "X-R4y V13W OpH +HE 94mE. 8UILDiN95 aND +H3 0u+3R W4lL 4Re 5H0Wn IN L19hT" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "blUE. +E@M B45E$ @RE 0UTL1nEd in th3 tE4M C0l0r. +ELEp0RtER$ @R3 $HOR+" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "YelL0w l1NE$. +4NKS 4rE Do+S 1N +H3 +aNK'5 +e@m c0Lor, 3xC3p+ rO9UE5 AR3" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "Y3LL0w. +eh 5IZ3 0F THE T4nk'5 dOT iS @ r0u9h 1NDic4Ti0N 0PH +h3 t4Nk'5" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "4L+1TUd3: hi9h3R +4NK$ H4V3 L4rG3R DOtS. phL@9$ 4R3 $M@LL CR055e$. +34M " msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "PHL4G5 4R3 1n The TE4M COlor, 5UpeRFL49$ @R3 Whi+E, And Th3 4n+Ido+3 FL@G" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "1s YelloW. 5Ho+s aRE $m@LL do+$ (Or lin3$ 0R CiRCl35, phOr L453R5 4ND" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "5h0CK W4v35, r3$P3C+1V3Ly). j00R t4NK 1$ ALW4Y$ de4D cEnTER @ND Ph0RW@RD" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "i5 @LW@Y5 Up 0N THe r4d4R. TH3 YELL0w v 15 J00R PH1ELd oPH vIEw. N0rtH" msgid "is indicated by the letter N." msgstr "I5 1Nd1C@TED bY +3H L3t+ER n. " msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "tHE HE@DS-uP-di5PlAY (HUd) H45 53VER@L D15PL4y$. TH3 two B0xe5 1N +h3" msgid "center of the view are the motion control boxes; within the small box" msgstr "c3NtEr OPH +Eh viEw @R3 +hE M0+IOn cONtR0l BOX3$; w1+hIN +H3 $M@ll B0x0r" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "J00R +4Nk W0N'T mOve, oUTs1D3 +H3 l4R93 B0Xor J00 dOn't MoV3 AnY PH@5tER +H4n" #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "AT +hE 3DGe OPH the L4R93 80x. M0v1NG THe m0US3 @80v3 0R b3L0w tEH 5mALL" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "b0xOR Mov35 FOrW4Rd Or b@CKW@RD, r35p3C+1V3LY. 5im1l4Rly ph0R leph+ @nd R1GHt." #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" msgid "The distance away from the small box determines the speed." msgstr "thE d15+@NC3 4w4y FRoM tH3 $m4LL BoXor DE+3rMine5 +h3 5PE3D." #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "@BOV3 T3H L@rGeR 8oXOR 1$ 4 +@P3 5HOwINg j00R cuRRENt H3AdInG. nor+H I5" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "0, 345T 1$ 90, E+C. If JumPiN9 i$ 4LlOweD oR j00 H@V3 THe jumP1NG FL4g," msgid "an altitude tape appears to the right of the larger box." msgstr "@n ALtI+ud3 +ap3 4PpE4R$ tO +H3 rIght oph +H3 L4r9Er 8OX." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "$M4LL C0L0reD D14M0nD$ Or @RRoW5 M@Y 4pPeaR On t3H H34D1n9 t@p3. @N " msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "4RROW P0INt1NG L3Ft ME4n$ +H4T @ P4R+iCUL@R PhlAG 15 To j00R LeF+, @N " msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "4Rr0W p0INT1n9 RigH+ ME4ns +Ha+ the PHL49 I$ To J00R R19HT, @ND 4 dI4m0nd " msgid "indicates the heading to the flag by its position on the heading tape." msgstr "1nd1c@T35 +he h34DiN9 +O tH3 Phl49 BY IT$ po$1+1On 0N Th3 HE@D1Ng t4P3. " msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "In c4PTuRe-+he-PHl4g m0D3 4 M4rKER 4LW@Y$ 5HOWS wHere J00R +3am pHlaG 15." msgid "A yellow marker shows the way to the antidote flag." msgstr "A yeLL0W m@RKEr $HOW5 T3H w@Y to +Eh 4NtID0+3 fl49." msgid "At the top of the display are, from left to right, your callsign and" msgstr "At ThE +0P Of +He Di5Pl4y @rE, PHRom LEFT +O R1GHT, j00R C4LL$IgN 4ND " msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "5C0r3, J00R 5+4Tu5, @nd +He fL49 J00 h4Ve. j00R CAll5IGN 15 1N +H3" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "C0loR 0ph J00R +e@M. J00r 5t4+U5 I5 onE Of: rE4Dy, DE4D, 5EALED, Z0n3D " msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "0r R3lo@D1N9 (sH0W1N9 THE tim3 UN+iL R3L04Ded). 1t C4n @L5O $h0w THE" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "+iMe UN+1L 4 b@d PHL49 1$ drOpPEd (IPH +H3R3'5 @ +1ME L1miT)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "O+HER inPH0RM4+1ON@L M355@9e$ m@Y 0Cc4s10naLLY FL@$H 0N t3H HUD." # BZFS Messages msgid "You are now an administrator!" msgstr "J00 4rE N0W @N 4DMIni5tr@+or!" msgid "Wrong Password!" msgstr "wRONg pa55W0rD!" msgid "unknown command" msgstr "UNkn0WN cOmm4nd" msgid "Countdown started." msgstr "c0UN+Down $T@rT3D." msgid "IP pattern added to banlist" msgstr "1P P4++3RN 4dD3D t0 B4NlI$T" msgid "malformed address" msgstr "M@Lf0RMED 4Ddr3S$" msgid "removed IP pattern" msgstr "r3m0VeD 1P P4++3RN" bzflag-2.4.2+ds1/data/l10n/bzflag_en_US_redneck.po000066400000000000000000001163671200563112200215310ustar00rootroot00000000000000# This is generic English Redneck as spoken in the US #msgid "Join Game" #msgstr "" msgid "en_US_redneck" msgstr "Redneck" msgid "translator" msgstr "Dave Brosius" msgid "Find Server" msgstr "Find Servah" msgid "Connect" msgstr "Conneck" #msgid "Callsign:" #msgstr "" #msgid "Team:" #msgstr "" msgid "Server:" msgstr "Servah:" msgid "Port:" msgstr "Po't:" msgid "Start Server" msgstr "Start Servah" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Up/Down arrows t'move, Enter t'seleck, Esc t'dismiss" msgid "Options" msgstr "Opshuns" msgid "Help" msgstr "He'p" #msgid "Quit" #msgstr "" #msgid "on" #msgstr "" msgid "Dithering:" msgstr "Diferin':" #msgid "off" #msgstr "" #msgid "Off" #msgstr "" #msgid "On" #msgstr "" msgid "Blending:" msgstr "Blendin':" msgid "Smoothing:" msgstr "Smoothin':" msgid "Lighting:" msgstr "Lightin':" msgid "Texturing:" msgstr "Texturin':" #msgid "Nearest" #msgstr "Nearess" #msgid "Linear" #msgstr "Linyar" msgid "Nearest Mipmap Nearest" msgstr "Nearess Mipmap Nearess" msgid "Linear Mipmap Nearest" msgstr "Linyar Mipmap Neares" msgid "Nearest Mipmap Linear" msgstr "Nearess Mipmap Linyar" msgid "Linear Mipmap Linear" msgstr "Linyar Mipmap Linyar" #msgid "Quality:" #msgstr "" #msgid "Low" #msgstr "" #msgid "Medium" #msgstr "" #msgid "High" #msgstr "" #msgid "Shadows:" #msgstr "" msgid "Depth Buffer:" msgstr "Depph Buffer:" #msgid "Not available" #msgstr "" msgid "Change Video Format" msgstr "Change Video Fo'mat" #msgid "Brightness:" #msgstr "" msgid "Sound Volume:" msgstr "Soun' Voloom:" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "" #msgid "15 Minutes" #msgstr "" #msgid "30 Minutes" #msgstr "" #msgid "1 Hour" #msgstr "" #msgid "5 Hours" #msgstr "" #msgid "15 Hours" #msgstr "" #msgid "1 day" #msgstr "" #msgid "15 days" #msgstr "" #msgid "30 days" #msgstr "" msgid "UDP network connection:" msgstr "UDP netwawk cornneckshun:" #msgid "Server List Cache:" #msgstr "" #msgid "Clear Server List Cache" #msgstr "" msgid "Change Key Mapping" msgstr "Change Key Mappin'" msgid "GUI Options" msgstr "GUah Opshuns" #msgid "Enhanced radar:" #msgstr "" msgid "Controlpanel & Score FontSize:" msgstr "Contro'panel & Sco'e FontSize:" msgid "normal" msgstr "no'mal" msgid "bigger" msgstr "mo' trimenjus" #msgid "Radar & Panel Opacity:" #msgstr "" msgid "Colored shots on radar:" msgstr "Colo'ed shots on radar:" msgid "Radar Shot Length:" msgstr "Radar Shot Len'th:" #msgid "Radar & Panel Size:" #msgstr "" #msgid "Mouse Box Size:" #msgstr "" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" msgid "Page Down for next page" msgstr "Page Down fo' next page" msgid "Page Up for previous page" msgstr "Page Up fo' previous page" #msgid "Rogue" #msgstr "" #msgid "Red Team" #msgstr "" #msgid "Green Team" #msgstr "" #msgid "Blue Team" #msgstr "" #msgid "Purple Team" #msgstr "" msgid "Enter to quit, Esc to resume" msgstr "Enter t'quit, Esc t'resoom" #msgid "Really quit?" #msgstr "" msgid "Video Format" msgstr "Video Fo'mat" msgid "Current Format:" msgstr "Current Fo'mat:" msgid "Key Mapping" msgstr "Key Mappin'" #msgid "Reset Defaults" #msgstr "" #msgid "Fire shot:" #msgstr "" #msgid "Drop flag:" #msgstr "" #msgid "Identify/Lock On:" #msgstr "" msgid "Radar Short:" msgstr "Radar Sho't:" #msgid "Radar Medium:" #msgstr "" #msgid "Radar Long:" #msgstr "" msgid "Send to All:" msgstr "Send t'All:" msgid "Send to Teammates:" msgstr "Send t'Teammates:" msgid "Send to Nemesis:" msgstr "Send t'Nemesis:" msgid "Send to Recipient:" msgstr "Send t'Recipient:" #msgid "Jump:" #msgstr "" #msgid "Binoculars:" #msgstr "" msgid "Toggle Score:" msgstr "Toggle Sco'e:" #msgid "Tank Labels:" #msgstr "" msgid "Flag Help:" msgstr "Flag He'p:" msgid "Time Forward:" msgstr "Time Fo'ward:" #msgid "Time Backward:" #msgstr "" msgid "Pause/Resume:" msgstr "Pause/Resoom:" #msgid "Self Destruct/Cancel:" #msgstr "" msgid "SelfDestruct/Cancel:" msgstr "Se'fDestruck/Kincel:" #msgid "Fast Quit:" #msgstr "" #msgid "Scroll Backward:" #msgstr "" msgid "Scroll Forward:" msgstr "Scroll Fo'ward:" msgid "Slow Keyboard Motion:" msgstr "Slow Keyboard Moshun:" msgid "loading {1}" msgstr "loadin' {1}" msgid "controls tank motion" msgstr "controls tank moshun" msgid "Mouse Position:" msgstr "Mouse Posishun:" #msgid "fires shot" #msgstr "" #msgid "drops flag (if not bad)" #msgstr "" #msgid "identifies player (locks on GM)" #msgstr "" msgid "jump (if allowed)" msgstr "jump (if allered)" msgid "short radar range" msgstr "sho't radar range" #msgid "medium radar range" #msgstr "" #msgid "long radar range" #msgstr "" #msgid "toggle binoculars" #msgstr "" msgid "toggle heads-up flag help" msgstr "toggle haids-up flag he'p" msgid "send message to teammates" msgstr "send message t'teammates" msgid "send message to everybody" msgstr "send message t'ev'rybody" msgid "send message to nemesis" msgstr "send message t'nemesis" msgid "send message to recipient" msgstr "send message t'recipient" msgid "toggle score sheet" msgstr "toggle sco'e sheet" #msgid "toggle tank labels" #msgstr "" #msgid "set time of day backward" #msgstr "" msgid "set time of day forward" msgstr "set time of day fo'ward" msgid "pause/resume" msgstr "pause/resoom" msgid "self Destruct/Cancel" msgstr "se'f Destruck/Kincel" #msgid "quit" #msgstr "" #msgid "scroll message log backward" #msgstr "" msgid "scroll message log forward" msgstr "scroll message log fo'ward" #msgid "Slow Keyboard Motion" #msgstr "" #msgid "Toggle Radar Flags" #msgstr "" #msgid "Toggle Main Flags" #msgstr "" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" #msgid "Hunt" #msgstr "" #msgid "autopilot enabled" #msgstr "" #msgid "autopilot disabled" #msgstr "" #msgid "show/dismiss menu" #msgstr "" #msgid "Esc:" #msgstr "" #msgid "Maintainer:" #msgstr "" msgid "Original Author:" msgstr "Origeenal Autho':" msgid "Code Contributors:" msgstr "Code Contributo's:" #msgid "Tank Models:" #msgstr "" #msgid "Special Thanks:" #msgstr "" #msgid "Send:" #msgstr "" msgid "Servers" msgstr "Servahs" msgid "Players" msgstr "Playahs" #msgid "Red" #msgstr "" #msgid "Green" #msgstr "" #msgid "Blue" #msgstr "" #msgid "Purple" #msgstr "" #msgid "Controls" #msgstr "" msgid "General" msgstr "Juneral" #msgid "Environment" #msgstr "" #msgid "Flags I" #msgstr "" #msgid "Flags II" #msgstr "" #msgid "Flags III" #msgstr "" #msgid "Readouts I" #msgstr "" #msgid "Readouts II" #msgstr "" #msgid "Credits" #msgstr "" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Press Enter t'seleck an' T t'tess a fo'mat. Esc t'exit." #msgid "Free-style" #msgstr "" msgid "Capture-the-Flag" msgstr "Cappure-the-Flag" #msgid "Rabbit Chase" #msgstr "" msgid "Super Flags" msgstr "Supah Flags" #msgid "Antidote Flags" #msgstr "" msgid "Trying..." msgstr "Tryin'..." msgid "Press %s to start" msgstr "Press %s t'start" msgid "Dead" msgstr "Daid" #msgid "%.1f" #msgstr "" #msgid "Ready" #msgstr "" #msgid "Reloaded in %.1f" #msgstr "" #msgid "Sealed" #msgstr "" #msgid "Zoned" #msgstr "" #msgid "You are now the rabbit." #msgstr "" #msgid "Servers found: {1}" #msgstr "" #msgid "{1} Shot" #msgstr "" #msgid "{1} Shots" #msgstr "" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" #msgid "Page {1} of {2}" #msgstr "" #msgid "openBroadcast: No udp service {1}" #msgstr "" #msgid "joystick '{1}' not supported..." #msgstr "" #msgid "Server did send endpoint information, UDP connection up" #msgstr "" #msgid "Ignoring Finder argument '{1}'" #msgstr "" #msgid "Can't open list server: {1}" #msgstr "" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "msgid " #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" #msgid "cannot load texture: {1}" #msgstr "" #msgid "Connection failed." #msgstr "" #msgid "Server forced a disconnect" #msgstr "" #msgid "Rogues not allowed. Try another team." #msgstr "" #msgid "This team is full. Try another team." #msgstr "" #msgid "This game is full. Try again later." #msgstr "" #msgid "Game is full or over. Try again later." #msgstr "" #msgid "Error connecting to server." #msgstr "" #msgid "Error downloading world database" #msgstr "" #msgid "Score" #msgstr "" #msgid "Kills" #msgstr "" msgid "Team Score" msgstr "How weez doin" #msgid "Locale:" #msgstr "" #msgid "Player" #msgstr "" # Super Flags #msgid "High Speed" #msgstr "" #msgid "Quick Turn" #msgstr "" msgid "Oscillation Overthruster" msgstr "Oscillashun On overthrester" #msgid "Rapid Fire" #msgstr "" #msgid "Machine Gun" #msgstr "" #msgid "Guided Missile" #msgstr "" #msgid "Laser" #msgstr "" #msgid "Ricochet" #msgstr "" #msgid "Super Bullet" #msgstr "" #msgid "Invisible Bullet" #msgstr "" #msgid "Stealth" #msgstr "" #msgid "Tiny" #msgstr "" #msgid "Narrow" #msgstr "" #msgid "Shield" #msgstr "" #msgid "Steamroller" #msgstr "" #msgid "Shock Wave" #msgstr "" #msgid "Phantom Zone" #msgstr "" msgid "Genocide" msgstr "Junocide" msgid "Jumping" msgstr "Jumpin'" #msgid "Identify" #msgstr "" msgid "Cloaking" msgstr "Cloakin'" msgid "Colorblindness" msgstr "Colo'blindness" #msgid "Obesity" #msgstr "" msgid "Left Turn Only" msgstr "Lef' Turn Only" #msgid "Right Turn Only" #msgstr "" #msgid "Momentum" #msgstr "" #msgid "Blindness" #msgstr "" msgid "Jamming" msgstr "Jammin'" #msgid "Wide Angle" #msgstr "" # Flag help msgid "You have no flag." msgstr "Yo' haf no flag, acco'din' t' th' code o' th' heells!" msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Yer team's flag: prevent other teams fum cappurin' it! Fry mah hide!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Opponent's team flag: take it t'yer base t'cappure it! Fry mah hide!" #msgid "Velocity (V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Useless" #msgstr "" #msgid "Thief" #msgstr "" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" #msgid "Angular velocity (A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Velocity (+V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscillashun On overthrester (+OO): Kin drive through buildin's. Cain't backup o' shoot while inside." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "rapid Fire (+F): Shoots mo'e offen. Shells hoof it faster but not as far." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Machine Gun (+MG): Mighty fast reload an' mighty sho't range." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Guided Missile (+GM): Shots track a targit. Lock on wif right button, as enny fool kin plainly see. Kin lock on o' retargit af'er firin'." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Shoots a laser. Infinite speed an' range but long reload time." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochet (+R): Shots bounce off walls. Don't shootcherse'f! Fry mah hide!" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "SuperBullet (+SB): Shoots through buildin's. Kin kill Phantom Zone." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Invisible Bullet (+IB): Yer shots doesn't appear on other radars. Kin still see them out window." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "STealth (+ST): Tank is invisible on radar. Shots is still visible. Sneak up behind inemies!" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Tiny (+T): Tank is small an' kin git through small openin's. Mighty hard t'hit." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Narrow (+N): Tank is super skimpy. Mighty hard t'hit fum front but is no'mal size fum side. Kin git through small openin's." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "SHield (+SH): Gittin' hit only drops flag, acco'din' t' th' code o' th' heells! Flag flys an extry-long time." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "SteamRoller (+SR): Destroys tanks yo' touch but yo' hafta git pow'ful close." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Shock Wave (+SW): Firin' destroys all tanks nearby. Don't kill teammates! Kin kill tanks on/in buildin's." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Phantom Zone (+PZ): Tellypo'tin' toggles Zoned effeck. Zoned tank kin drive through buildin's. Zoned tank kin't shoot o' be shot ('cept by superbullet an' shock wave)." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Junocide (+G): Killin' one tank kills thet tank's whole team, dawgone it." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "JumPin' (+JP): Tank kin jump. Use Tab key. Cain't steer in th' air." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "IDentify (+ID): Identifies type of nearess flag, acco'din' t' th' code o' th' heells!" msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "CLoakin' (+CL): Makes yer tank invisible out-the-window. Still visible on radar." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Colo'Blindness (-CB): Cain't tell team colo's. Don't shoot teammates!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Obesity (-O): Tank becomes mighty large. Cain't fit through tellypo'ters." msgid "left turn only (- <-): Can't turn right." msgstr "lef' turn only (- <-): Cain't turn right." msgid "right turn only (- ->): Can't turn left." msgstr "right turn only (- ->): Cain't turn lef'" msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Momentum (-M): Tank has inertia. Accelerashun is limited, cuss it all t' tarnation." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Blindness (-B): Cain't see out window. Radar still wawks." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "JaMmin' (-JM): Radar don't wawk. Kin still see." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Wide Angle (-WA): Fish-eye lens disto'ts view." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag is a multi-player netwawked tank battle game. Thar is five teams:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "red, green, blue, purple, an' rogues (rogue tanks is black). Destroyin' a" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "player on t'other team sco'es a win, while bein' destroyed o' destroyin' a" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "teammate sco'es a lost. Indivijool an' aggregate team sco'es is tallied, cuss it all t' tarnation." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Rogues haf no teammates (not even other rogues),so they kinnot shoot" msgid "teammates and they don't have a team score." msgstr "teammates an' they doesn't haf a team sco'e." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "Thar is two styles of play, determined by th' sarver cornfigurashun: cappure-" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "the-flag an' free-fo'-all, ah reckon. In free-fo'-all th' objeck is simply t'git the" msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "highess sco'e by shootin' opponents. Th' objeck in cappure-the-flag is to" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "cappure inemah flags while preventin' opponents fum cappurin' yourn. In this" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "style, etch team (but not rogues) has a team base an' etch team wif at least" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "one player has a team flag which has th' colo' of th' team, dawgone it. To cappure a flag," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "yo' muss grab it an' brin' it back t'yer team base (yo' muss be on th' groun'" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "in yer base t'register th' cappure). Cappurin' a flag destroys all th' players" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "on thet team an' gives yer team sco'e a bonus; th' players will restart on" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "their team base. Takin' yer flag onto an inemah base counts as a cappure aginst" msgid "your team but not for the enemy team." msgstr "yer team but not fo' th' enemah team, dawgone it." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Th' wo'ld invironment corntains an outer wall an' sevahal buildin's." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Yo' kinnot hoof it outside th' outer wall (yo' kin't even jump on over it)." msgid "You cannot normally drive or shoot through buildings." msgstr "Yo' kinnot no'mally drive o' shoot through buildin's." msgid "The server may be configured to include teleporters: large transparent" msgstr "Th' sarver may be cornfiggerd t'include tellypo'ters: large transparent" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "black slabs. Objecks interin' one side of a tellypo'ter is instantly" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "moved t'one side of t'other (o' postibly th' same) tellypo'ter. The" msgid "teleport is reversible; reentering the same side of the destination" msgstr "tellypo't is revahsible; reenterin' th' same side of th' destinashun" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "tellypo'ter brin's yo' back t'whar yo' started, cuss it all t' tarnation. Tellypo't cornneckshuns" msgid "are fixed at the start of the game and don't change during the game." msgstr "are fixed at th' start of th' game an' doesn't change durin' th' game." msgid "The connections are always the same in the capture-the-flag style." msgstr "Th' conneckshuns is allus th' same in th' cappure-the-flag style." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Etch side of a tellypo'ter tellypo'ts independently of t'other side." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "It's postible fo' a tellypo'ter t'tellypo't t'th' opposite side of" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "itse'f. Such a thru-tellypo'ter acks almost as eff'n it warn't thar." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "A tellypo'ter kin also tellypo't t'th' same side of itse'f. This hyar is a" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "revahse tellypo'ter. Shootin' at a revahse tellypo'ter is likely t'be" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "se'f destruckive; shootin' a laser at one is invariably fatal, ah reckon." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Flags come in two varieties: team flags an' super flags. Team flags" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "are used only in th' cappure-the-flag style. Th' sarver may also be" msgid "configured to supply super flags, which give your tank some advantage" msgstr "configgerd t'supply super flags, which give yer tank some advantage" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "o' disadvantage. Yo' no'mally kin't tell which until yo' pick one up," msgid "but good flags generally outnumber bad flags two to one." msgstr "but fine flags junerally outnumber bad flags two t'one." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Team flags is not allered t'be in Bad Places. Bad Places are: on" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "a buildin' o' on an inemah base. Team flags dropped in a Bad Place are" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "moved t'a safety posishun. Cappured flags is placed back on their" msgid "team base. Super flags dropped above a building always disappear." msgstr "team base. Super flags dropped above a buildin' allus disappear." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "A ran'om fine super flag will remain fo' up t'4 postesshuns. Af'er" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "thet it'll disappear an' will eventually be replaced by a noo ran'om" msgid "flag. Bad random super flags disappear after the first possession." msgstr "flag, acco'din' t' th' code o' th' heells! Bad ran'om super flags disappear af'er th' fust postesshun." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Bad super flags kin't no'mally be dropped, cuss it all t' tarnation. Th' sarver kin be set to" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "autymatically drop th' flag fo' yo' af'er some time, af'er yo' destroy" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "a sartin number of inemies, an'/o' when yo' grab an antidote flag." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Antidote flags is yeller an' only appear when yo' haf a bad flag, acco'din' t' th' code o' th' heells!" # Help 5 Strings #msgid "Good Flags:" #msgstr "" #msgid "boosts top speed" #msgstr "" #msgid "High Speed (V)" #msgstr "" #msgid "boosts turn rate" #msgstr "" #msgid "Quick Turn (A)" #msgstr "" msgid "can drive through buildings" msgstr "can drive through buildin's" msgid "Oscillation Overthruster (OO)" msgstr "Oscillashun On overthrester (OO)" msgid "faster shots more often" msgstr "faster shots mo'e offen" #msgid "Rapid Fire (F)" #msgstr "" msgid "very fast reload, very short range" msgstr "mighty fast reload, mighty sho't range" #msgid "Machine Gun (MG)" #msgstr "" #msgid "shots guide themselves (right mouse locks on)" #msgstr "" #msgid "Guided Missile (GM)" #msgstr "" msgid "infinite shot speed and range, long reload time" msgstr "infinite shot speed an' range, long reload time" #msgid "Laser (L)" #msgstr "" #msgid "shots ricochet" #msgstr "" #msgid "Ricochet (R)" #msgstr "" msgid "shoots through buildings" msgstr "shoots through buildin's" #msgid "Super Bullet (SB)" #msgstr "" msgid "tank invisible on enemy radar" msgstr "tank invisible on inemah radar" #msgid "Cloaking (CL)" #msgstr "" #msgid "Stealth (ST)" #msgstr "" msgid "tank invisible out the window" msgstr "tank invisible out th' window" #msgid "Cloakin' (CL)" #msgstr "" #msgid "shots invisible on radar" #msgstr "" #msgid "Invisible Bullet (IB)" #msgstr "" #msgid "tank becomes smaller" #msgstr "" #msgid "Tiny (T)" #msgstr "" #msgid "tank becomes paper thin" #msgstr "" #msgid "Narrow (N)" #msgstr "" msgid "getting hit just drops the flag" msgstr "gittin' hit jest drops th' flag" #msgid "Shield (SH)" #msgstr "" msgid "destroy tanks by touching them" msgstr "destroy tanks by touchin' them" #msgid "Steamroller (SR)" #msgstr "" msgid "expanding spherical shell of destruction" msgstr "expan'in' spherical shell of destruckshun" #msgid "Shock Wave (SW)" #msgstr "" #msgid "Genocide (G)" #msgstr "" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "tellypo't t'enter/leave zone" #msgid "Phantom Zone (PZ)" #msgstr "" msgid "destroys player and all player's teammates" msgstr "destroys player an' all player's teammates" #msgid "Junocide (G)" #msgstr "" msgid "allows tank to jump" msgstr "allers tank t'jump" #msgid "Jumping (JP)" #msgstr "" msgid "shows type of nearest superflag" msgstr "shows type of nearess superflag" #msgid "Identify (ID)" #msgstr "" #msgid "Bad Flags:" #msgstr "" msgid "can't identify tanks" msgstr "cain't identify tanks" #msgid "Colorblindness (CB)" #msgstr "" msgid "makes tank very large" msgstr "makes tank mighty large" #msgid "Obesity (O)" #msgstr "" msgid "tank can't turn right" msgstr "tank kin't turn right" #msgid "Left Turn Only (<-)" #msgstr "" msgid "tank can't turn left" msgstr "tank kin't turn lef'" #msgid "Right Turn Only (->)" #msgstr "" msgid "tank has lots of momentum" msgstr "tank has lotsa momentum" #msgid "Momentum (M)" #msgstr "" msgid "can't see out the window" msgstr "cain't see out th' window" #msgid "Blindness (B)" #msgstr "" msgid "can't see anything on radar" msgstr "cain't see ennythin' on radar" #msgid "Jamming (JM)" #msgstr "" msgid "fish eye view out the window" msgstr "fish eye view out th' window" #msgid "Wide Angle (WA)" #msgstr "" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Th' radar is on th' lef' side of th' control panel, ah reckon. It shows an on overhaid" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "x-ray view of th' game. Buildin's an' th' outer wall is shown in light" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "blue. Team bases is outlined in th' team colo'. Tellypo'ters is sho't" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "yeller lines. Tanks is dots in th' tank's team colo', 'cept rogues are" #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "yeller. Th' size of th' tank's dot is a rough indicashun of th' tank's" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "altitude: higher tanks haf larger dots. Flags is small crostes. Team" #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "flags is in th' team colo', superflags is white, an' th' antidote flag" #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "is yeller. Shots is small dots (o' lines o' circles, fo' lasers an'" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "shock waves, respeckively). Yer tank is allus daid center an' fo'ward" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "is allus up on th' radar. Th' yeller V is yer field of view. No'th" msgid "is indicated by the letter N." msgstr "is indicated by th' letter N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Th' haids-up-display (HUD) has sevahal displays. Th' two boxes in the" msgid "center of the view are the motion control boxes; within the small box" msgstr "center of th' view is th' moshun corntrol boxes; wifin th' small box" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "yer tank won't move, outside th' large box yo' doesn't move enny faster than" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "at th' edge of th' large box. Movin' th' mouse above o' below th' small" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "box moves fo'ward o' backward, respeckively. Similarly fo' lef' an' right." msgid "The distance away from the small box determines the speed." msgstr "Th' distance away fum th' small box determines th' speed, cuss it all t' tarnation." # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Above th' larger box is a tape showin' yer current haidin'. No'th is" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "0, east is 90, etc. Eff'n jumpin' is allered o' yo' haf th' jumpin' flag," msgid "an altitude tape appears to the right of the larger box." msgstr "an altitude tape appears t'th' right of th' larger box." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Small colo'ed diamonds o' arrows may appear on th' haidin' tape. An" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "arrow pointin' lef' means thet a particular flag is t'yer lef', an" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "arrow pointin' right means thet th' flag is t'yer right, an' a diamond" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "indicates th' haidin' t'th' flag by its posishun on th' haidin' tape." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "In cappure-the-flag mode a marker allus shows whar yer team flag is." msgid "A yellow marker shows the way to the antidote flag." msgstr "A yeller marker shows th' way t'th' antidote flag, acco'din' t' th' code o' th' heells!" msgid "At the top of the display are, from left to right, your callsign and" msgstr "At th' top of th' display are, fum lef' t'right, yer callsign an'" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "sco'e, yer status, an' th' flag yo' have. Yer callsign is in the" # BZFS Messages #msgid "You are now an administrator!" #msgstr "" #msgid "Wrong Password!" #msgstr "" #msgid "unknown command" #msgstr "" #msgid "Countdown started." #msgstr "" #msgid "IP pattern added to banlist" #msgstr "" #msgid "malformed address" #msgstr "" #msgid "removed IP pattern" #msgstr "" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "colo' of yer team, dawgone it. Yer status is one of: ready, daid, sealed, zoned" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "o' reloadin' (showin' th' time until reloaded). It kin also show the" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "time until a bad flag is dropped (if thar's a time limit)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Other info'mashunal messages may occashunally flash on th' HUD." msgid "Teams" msgstr "Teem Bigness" bzflag-2.4.2+ds1/data/l10n/bzflag_es.po000066400000000000000000002022371200563112200174240ustar00rootroot00000000000000#### Spanish l10n file for BZFlag client 2.0.8 # Created by xukosky@yahoo.es msgid "es" msgstr "Español" msgid "translator" msgstr "xukosky@yahoo.es" ############# ## GENERAL ## ############# msgid "Off" msgstr "Desactivado" msgid "On" msgstr "Activado" msgid "Unavailable" msgstr "No disponible" msgid "None" msgstr "Ninguno" msgid "Fast" msgstr "Rápido" msgid "Best" msgstr "Mejor" msgid "NOTE: " msgstr "NOTA: " msgid "Page {1} of {2}" msgstr "Página {1} de {2}" msgid "Auto" msgstr "Automático" msgid "Pause/Resume:" msgstr "Pausa/reanudar:" msgid "Slow Keyboard Motion:" msgstr "Respuesta lenta del teclado:" msgid "" msgstr "" msgid "No" msgstr "No" msgid "Yes" msgstr "Sí" msgid "Failed... unknown error (%d)." msgstr "Error...error desconocido (%d)." msgid "Silenced All Msgs" msgstr "Todos los mensajes silenciados" msgid " or " msgstr " o " ################## ## INPUT EVENTS ## ################## msgid "Left Mouse" msgstr "Botón izquierdo del ratón" msgid "Right Mouse" msgstr "Botón derecho del ratón" msgid "Middle Mouse" msgstr "Botón central del ratón" msgid "Space" msgstr "Espacio" msgid "Delete" msgstr "Suprimir" msgid "Enter" msgstr "Intro" msgid "Return" msgstr "Retroceso" msgid "Up Arrow" msgstr "Flecha arriba" msgid "Down Arrow" msgstr "Flecha abajo" msgid "Left Arrow" msgstr "Flecha izquierda" msgid "Right Arrow" msgstr "Flecha derecha" msgid "Pause" msgstr "Pausa" msgid "Tab" msgstr "Tabulación" ################# ## SUPER FLAGS ## ################# msgid "High Speed" msgstr "Alta velocidad" msgid "high speed (+V)" msgstr "Alta velocidad-high speed(+V)" msgid "Tank moves faster. Outrun bad guys." msgstr "El tanque se mueve más rápido. Deja atrás a los tipos malos." msgid "Quick Turn" msgstr "Giro rápido" msgid "Quick Turn (+QT)" msgstr "Giro rápido-Quick Turn(+QT)" msgid "Tank turns faster. Good for dodging." msgstr "El tanque gira más rápido. Bueno para esquivar." msgid "Oscillation Overthruster" msgstr "Atravesar paredes" msgid "Oscillation Overthruster (+OO)" msgstr "Atravesar paredes-Oscillation Overthruster(+OO)" msgid "Can drive through buildings. Can't backup or shoot while inside." msgstr "Puede pasar a través de los edificios. No puede disparar o retroceder en el interior." msgid "Rapid Fire" msgstr "Disparo rápido" msgid "rapid Fire (+F)" msgstr "Disparo rápido-rapid Fire(+F)" msgid "Shoots more often. Shells go faster but not as far." msgstr "Dispara más a menudo. Las balas van más rápido pero no tan lejos." msgid "Machine Gun" msgstr "Ametralladora" msgid "Machine Gun (+MG)" msgstr "Ametralladora-Machine Gun(+MG)" msgid "Very fast reload and very short range." msgstr "Recarga muy rápida y muy corto alcance." msgid "Guided Missile" msgstr "Misil guiado" msgid "Guided Missile (+GM)" msgstr "Misil teledirigido-Guided Missile(+GM)" msgid "Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Sigue al objetivo fijado. Puede fijar o cambiar de objetivo después de disparar." msgid "Laser" msgstr "Laser" msgid "Laser (+L)" msgstr "Laser-Laser(+L)" msgid "Shoots a laser. Infinite speed and range but long reload time." msgstr "Dispara un laser. Velocidad y rango infinitos paro recarga lenta." msgid "Ricochet" msgstr "Rebote" msgid "Ricochet (+R)" msgstr "Rebote-Ricochet(+R)" msgid "Shots bounce off walls. Don't shoot yourself!" msgstr "Los disparos rebotan en las paredes. ¡No te dispares a ti mismo!" msgid "Super Bullet" msgstr "Super bala" msgid "Super Bullet (+SB)" msgstr "Super bala-Super Bullet(+SB)" msgid "Shoots through buildings. Can kill Phantom Zone." msgstr "Dispara a través de los edificios. Puede matar en la zona fantasma." msgid "Invisible Bullet" msgstr "Bala invisible" msgid "Invisible Bullet (+IB)" msgstr "Bala invisible-Invisible Bullet(+IB)" msgid "Your shots don't appear on other radars. Can still see them out window." msgstr "Tus disparos no aparecen en los demás radares. Pueden verse directamente." msgid "Stealth" msgstr "Indetectable" msgid "STealth (+ST)" msgstr "Indetectable-STealth(+ST)" msgid "Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "El tanque no aparece en el radar. Los disparos aun aparecen. ¡Ataca por la espalda!" msgid "Tiny" msgstr "Pequeño" msgid "Tiny (+T)" msgstr "Pequeño-Tiny(+T)" msgid "Tank is small and can get through small openings. Very hard to hit." msgstr "El tanque es pequeño y pasa por pequeñas aberturas. Muy difícil de disparar." msgid "Narrow" msgstr "Estrecho" msgid "Narrow (+N)" msgstr "Estrecho-Narrow(+N)" msgid "Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Tanque super delgado que pasa por sitios estrechos. Casi imposible de disparar de frente." msgid "Shield" msgstr "Escudo" msgid "SHield (+SH)" msgstr "Escudo-SHield(+SH)" msgid "Getting hit only drops flag. Flag flies an extra-long time." msgstr "Ser disparado solo suelta la bandera. La bandera vuela un tiempo extra largo." msgid "Steamroller" msgstr "Apisionadora" msgid "SteamRoller (+SR)" msgstr "Apisionadora-StreamRoller(+SR)" msgid "Destroys tanks you touch but you have to get really close." msgstr "Destruye los tanques que tocas pero tienes que ponerte realmente cerca." msgid "Shock Wave" msgstr "Onda de impacto" msgid "Shock Wave (+SW)" msgstr "Onda de impacto-Shock Wave(+SW)" msgid "Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Destruye todos los tanques cercanos. Puede atravesar edificios." msgid "Phantom Zone" msgstr "Zona fantasma" msgid "Phantom Zone (+PZ)" msgstr "Zona fantasma-Phantom Zone(+PZ)" msgid "Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank shoots Zoned bullets and can't be shot (except by superbullet, shock wave, and other Zoned tanks)." msgstr "Se activa al teletransportarse. Atraviesas edificios y no te afectan los disparos normales." msgid "Genocide" msgstr "Genocidio" msgid "Genocide (+G)" msgstr "Genocidio-Genocide(+G)" msgid "Killing one tank kills that tank's whole team." msgstr "Al destruir un tanque destruyes a todo su equipo." msgid "Jumping" msgstr "Saltar" msgid "JumPing (+JP)" msgstr "Saltar-JumPing(+JP)" msgid "Tank can jump. Use Tab key. Can't steer in the air." msgstr "El tanque puede saltar. No puede maniobrar en el aire." msgid "Identify" msgstr "Identificar" msgid "IDentify (+ID)" msgstr "Identificar-IDentify(+ID)" msgid "Identifies type of nearest flag." msgstr "Identifica el tipo de bandera más cercana." msgid "Cloaking" msgstr "Invisible" msgid "CLoaking (+CL)" msgstr "Invisible-CLoaking(+CL)" msgid "Makes your tank invisible out-the-window. Still visible on radar." msgstr "Hace tu tanque invisible sobre el terreno. Sigue visible en el radar." msgid "Useless" msgstr "Inútil" msgid "USeless (+US)" msgstr "Inútil-USeless(+US)" msgid "You have found the useless flag. Use it wisely." msgstr "Has encontrado una bandera inútil. Usala sabiamente." msgid "Masquerade" msgstr "Disfrazado" msgid "MasQuerade (+MQ)" msgstr "Disfrazado-MasQuerade(+MQ)" msgid "In opponent's hud, you appear as a teammate." msgstr "A los ojos de los enemigos, tu pareces un compañero." msgid "Seer" msgstr "Adivino" msgid "SEer (+SE)" msgstr "Adivino-SEer(+SE)" msgid "See stealthed, cloaked and masquerading tanks as normal." msgstr "Ves los tanques indetectables, invisibles y disfrazados como normales." msgid "Thief" msgstr "Ladrón" msgid "THief (+TH)" msgstr "Ladrón-THief(+TH)" msgid "Steal flags. Small and fast but can't kill." msgstr "Roba banderas. Pequeño y rápido pero no puede matar." msgid "Burrow" msgstr "Enterrado" msgid "BUrrow (+BU)" msgstr "Enterrado-BUrrow(+BU)" msgid "Tank burrows underground, impervious to normal shots, but can be steamrolled by anyone!" msgstr "No le alcanzan los disparos normales, ¡pero puede ser aplastado por cualquiera!" msgid "Wings" msgstr "Alas" msgid "WinGs (+WG)" msgstr "Alas-WinGs(+WG)" msgid "Tank can drive in air." msgstr "El tanque pueda maniobrar en el aire." msgid "Agility" msgstr "Agilidad" msgid "Agility (+A)" msgstr "Agilidad-Agility(+A)" msgid "Tank is quick and nimble making it easier to dodge." msgstr "El tanque es rápido y ágil y puede esquivar fácilmente." msgid "ReverseControls" msgstr "Controles invertidos" msgid "ReverseControls (-RC)" msgstr "Controles invertidos-ReverseControls(-RC)" msgid "Tank driving controls are reversed." msgstr "Se invierten los controles del tanque." msgid "Colorblindness" msgstr "Daltonismo" msgid "ColorBlindness (-CB)" msgstr "Daltonismo-ColorBlindness(-CB)" msgid "Can't tell team colors. Don't shoot teammates!" msgstr "Todos los tanques parecen iguales. ¡No dispares compañeros!" msgid "Obesity" msgstr "Obesidad" msgid "Obesity (-O)" msgstr "Obesidad-Obesity(-O)" msgid "Tank becomes very large. Can't fit through teleporters." msgstr "El tanque se vuelve muy grande. No cabe en los teletransportes." msgid "Left Turn Only" msgstr "Girar solo a la izquierda" msgid "Left Turn only (-LT)" msgstr "Girar solo a la izquierda-Left Turn only(-LT)" msgid "Can't turn right." msgstr "No se puede girar a la derecha." msgid "Right Turn Only" msgstr "Girar solo a la derecha" msgid "Right Turn only (-RT)" msgstr "Girar solo a la derecha-Right Turn only(-RT)" msgid "Can't turn left." msgstr "No se puede girar a la izquierda." msgid "Forward Only" msgstr "Solo hacia delante" msgid "Forward Only (-FO)" msgstr "Solo hacia delante-Forward Only(-FO)" msgid "Can't drive in reverse." msgstr "No se puede ir hacia atrás." msgid "ReverseOnly" msgstr "Solo hacia atrás" msgid "ReverseOnly (-RO)" msgstr "Solo hacia atrás-ReverseOnly(-RO)" msgid "Can't drive forward." msgstr "No se puede ir hacia delante" msgid "Momentum" msgstr "Inercia" msgid "Momentum (-M)" msgstr "Inercia-Momentum(-M)" msgid "Tank has inertia. Acceleration is limited." msgstr "El tanque tiene inercia. La aceleración está limitada." msgid "Blindness" msgstr "Ceguera" msgid "Blindness (-B)" msgstr "Ceguera-Blindness(-B)" msgid "Can't see out window. Radar still works." msgstr "No puedes ver. Tu radar aun funciona." msgid "Jamming" msgstr "Interferencias" msgid "JaMming (-JM)" msgstr "Interferencias-JaMming(-JM)" msgid "Radar doesn't work. Can still see." msgstr "Tu radar no funciona. Aun puedes ver." msgid "Wide Angle" msgstr "Visión de pez" msgid "Wide Angle (-WA)" msgstr "Visión de pez-Wide Angle(-WA)" msgid "Fish-eye lens distorts view." msgstr "Las gafas de ojo de pez distorsionan tu visión." msgid "No Jumping" msgstr "No saltar" msgid "No Jumping (-NJ)" msgstr "No saltar-No Jumping(-NJ)" msgid "Tank can't jump." msgstr "El tanque no puede saltar." msgid "Trigger Happy" msgstr "Gatillo feliz" msgid "TRigger happy (-TR)" msgstr "Gatillo feliz-TRigger happy(-TR)" msgid "Tank can't stop firing." msgstr "El tanque no puede dejar de disparar." msgid "Bouncy" msgstr "Saltarín" msgid "BouncY (-BY)" msgstr "Saltarín-BouncY(-BY)" msgid "Tank can't stop bouncing." msgstr "El tanque no puede dejar de saltar." #################### ## AUDIO SETTINGS ## #################### msgid "Audio Settings" msgstr "Ajustes de sonido" msgid "Sound Volume:" msgstr "Volumen" msgid "Driver:" msgstr "Controlador:" msgid "Device:" msgstr "Dispositivo:" msgid "Remote Sounds:" msgstr "Sonidos remotos:" #################### ## CACHE SETTINGS ## #################### msgid "Cache Settings" msgstr "Ajustes de caché" msgid "Server List Cache:" msgstr "Almacenar lista de servidores:" msgid "Off / Backup Mode" msgstr "Desactivado / Modo reserva" msgid "5 Minutes" msgstr "5 minutos" msgid "15 Minutes" msgstr "15 minutos" msgid "30 Minutes" msgstr "30 minutos" msgid "1 Hour" msgstr "1 hora" msgid "5 Hours" msgstr "5 horas" msgid "15 Hours" msgstr "15 horas" msgid "1 day" msgstr "1 día" msgid "15 days" msgstr "15 días" msgid "30 days" msgstr "30 días" msgid "Clear Server List Cache" msgstr "Limpiar lista de servidores" msgid "Cache Size (MB):" msgstr "Tamaño de caché (MB):" msgid "Clear Download Cache" msgstr "Limpiar descargas" msgid "Automatic Downloads:" msgstr "Descargas automáticas" msgid "Connection Updates:" msgstr "Actualizaciones de conexión:" msgid "Update Downloads" msgstr "Actualizar descargas" msgid "Updating Downloads" msgstr "Actualizando descargas" msgid "Download Cache Cleared" msgstr "Borrado caché de descargas" msgid "Server List Cache Cleared" msgstr "Borrado caché de listas de servidores" ###################### ## DISPLAY SETTINGS ## ###################### msgid "Display Settings" msgstr "Ajustes de pantalla" msgid "Dithering:" msgstr "Fusionado:" msgid "Blending:" msgstr "Mezclado:" msgid "Smoothing:" msgstr "Suavizado:" msgid "Lighting:" msgstr "Iluminación:" msgid "Texturing:" msgstr "Texturas:" msgid "Nearest" msgstr "Próximo" msgid "Linear" msgstr "Linear" msgid "Nearest Mipmap Nearest" msgstr "Próximo mipmap próximo" msgid "Linear Mipmap Nearest" msgstr "Linear mipmap próximo" msgid "Nearest Mipmap Linear" msgstr "Próximo mipmap linear" msgid "Linear Mipmap Linear" msgstr "Linear mipmap linear" msgid "Anisotropic:" msgstr "Anisótropo:" msgid "Quality:" msgstr "Calidad:" msgid "Low" msgstr "Baja" msgid "Medium" msgstr "Media" msgid "High" msgstr "Alta" msgid "Experimental" msgstr "Experimental" msgid "Shadows:" msgstr "Sombras:" msgid "Stipple" msgstr "Punteado" msgid "Stencil" msgstr "Plantilla" msgid "Hidden Line:" msgstr "Línea oculta:" msgid "Wireframe:" msgstr "Semitransparente:" msgid "Depth Complexity:" msgstr "Profundidad:" msgid "Culling Tree:" msgstr "Árbol de desecho:" msgid "Collision Tree:" msgstr "Árbol de colisiones:" msgid "Brightness:" msgstr "Brillo:" msgid "Energy Saver:" msgstr "Ahorro de energía:" msgid "Change Video Format" msgstr "Cambiar formato de vídeo" msgid "Video Format" msgstr "Formato de vídeo" msgid "Current Format:" msgstr "Formato actual:" msgid "" msgstr "" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Pulsa intro para seleccionar y T para probar un formato. Escape para salir." msgid "" msgstr "" ############### ## DOWNLOADS ## ############### msgid "downloading: " msgstr "descargando: " msgid "Downloading texture (%d of %d): %d KB" msgstr "Descargando textura (%d de %d): %d KB" msgid "not downloading: " msgstr "no descargando: " msgid "download access is controlled by " msgstr "el acceso a descargas está controlado por " msgid "local denial: " msgstr "negación local: " ###################### ## EFFECTS SETTINGS ## ###################### msgid "Effects Settings" msgstr "Ajustes de efectos" msgid "Rain:" msgstr "Llúvia:" msgid "Mirror:" msgstr "Espejo:" msgid "Fog:" msgstr "Niebla:" msgid "Nice" msgstr "Bonito" msgid "Display Treads:" msgstr "Mostrar cadenas:" msgid "Animated Treads:" msgstr "Cadenas animadas:" msgid "Covered" msgstr "Cubierto" msgid "Exposed" msgstr "Expuesto" msgid "Track Marks:" msgstr "Marcas de pista:" msgid "Track Mark Culling:" msgstr "Deshacer marcas de pista:" msgid "Fancy Effects:" msgstr "Efectos superpuestos:" msgid "Spawn Effect:" msgstr "Efecto generado:" msgid "Local Spawn Effect:" msgstr "Efecto generado local:" msgid "Same as spawns" msgstr "Igual que generados" msgid "Death Effect:" msgstr "Efecto de muerte:" msgid "Shot Fired Effect:" msgstr "Efecto de disparo:" msgid "Local Shot Effect:" msgstr "Efecto de disparo local:" msgid "Same as shots" msgstr "Igual que disparos" msgid "Use Velocity on Shot Effects:" msgstr "Usar efectos de velocidad en disparo:" msgid "Landing Effect:" msgstr "Efecto de aterrizaje:" msgid "GM Smoke Effect:" msgstr "Efecto de humo de misiles:" msgid "GM Effect Timing:" msgstr "Efecto de temporizado de misiles:" msgid " Ricocet Effect:" msgstr "Efecto de rebote:" msgid " Teleport Shot Effect:" msgstr "Efecto de dispar teletransporte:" msgid "Blossom" msgstr "Flor" msgid "Cone" msgstr "Cono" msgid "Rings" msgstr "Anillos" msgid "Smoke Rings" msgstr "Anillos de humo" msgid "Muzzle Flash" msgstr "Destello de cañón" msgid "Smoke and Flash" msgstr "Humo y destello" msgid "Classic Puff" msgstr "Clásico puff" msgid "Shock Cone" msgstr "Cono de impacto" msgid "We Got Death Star" msgstr "Tenemos estrella de la muerte" msgid "Dirt Flash" msgstr "Destello sucio" msgid "Ring" msgstr "Anillo" msgid "IDL" msgstr "IDL" ################## ## GUI SETTINGS ## ################## msgid "GUI Settings" msgstr "Ajustes del interfaz" msgid "Radar Style:" msgstr "Estilo de radar:" msgid "Normal" msgstr "Normal" msgid "Fast Sorted" msgstr "Rápido ordenado" msgid "Enhanced" msgstr "Avanzado" msgid "Scoreboard Sort:" msgstr "Ordenar tabla de puntuación:" msgid "Always Show Team Scores:" msgstr "Mostrar siempre puntuación de equipos:" msgid "Scoreboard Font Size:" msgstr "Fuente de tabla de puntuación:" msgid "ControlPanel Font Size:" msgstr "Fuente del panel de control:" msgid "Radar & Panel Opacity:" msgstr "Opacidad de radar y panel:" msgid "Colored shots on radar:" msgstr "Disparos coloreados en radar:" msgid "Radar Shot Length:" msgstr "Longitud de disparo en radar:" msgid "Radar Shot Size:" msgstr "Tamaño de disparo en radar:" msgid "Radar Shot Line:" msgstr "Línea de disparo en radar:" msgid "Lagging" msgstr "Con lag" msgid "Leading" msgstr "Sin lag" msgid "Radar & Panel Size:" msgstr "Tamaño de radar y panel:" msgid "Mouse Box Size:" msgstr "Tamaño de la caja del ratón:" msgid "Locale:" msgstr "Idioma:" msgid "Control panel tabs:" msgstr "Pestañas del panel de control:" msgid "Left" msgstr "Izquierda" msgid "Right" msgstr "Derecha" msgid "Control panel coloring:" msgstr "Color del panel de control:" msgid "Underline color:" msgstr "Color de subrayado:" msgid "Cyan" msgstr "Cian" msgid "Grey" msgstr "Gris" msgid "Text" msgstr "Texto" msgid "Killer Highlight:" msgstr "Resaltar asesino:" msgid "Pulsating" msgstr "Parpadeando" msgid "Underline" msgstr "Subrayado" msgid "Pulsation Rate:" msgstr "Tasa de parpadeo:" msgid "Pulsation Depth:" msgstr "Profundidad de parpadeo:" msgid "Time / Date Display:" msgstr "Mostrar hora / fecha:" msgid "time" msgstr "hora" msgid "date" msgstr "fecha" msgid "both" msgstr "ambos" msgid "Reload timer on HUD:" msgstr "Mostrar tiempo de recarga:" msgid "Motto Display Length:" msgstr "Longitud al mostrar motto:" ############### ## HELP MENU ## ############### msgid "Page Down for next page" msgstr "Avanzar página lleva a la página siguiente" msgid "Page Up for previous page" msgstr "Retroceder página lleva a lá página anterior" msgid "Controls" msgstr "Controles" msgid "Mouse Position" msgstr "Posición del ratón" msgid "Controls Tank Position:" msgstr "Controla la posición del tanque:" msgid "Fires Shot:" msgstr "Dispara:" msgid "Drops Flag (if not bad):" msgstr "Suelta bandera (si no es mala):" msgid "Identifies Player (locks on GM):" msgstr "Identifica jugador (fija objetivo con misiles):" msgid "Short Radar Range:" msgstr "Alcance de radar corto:" msgid "Medium Radar Range:" msgstr "Alcance de radar medio:" msgid "Long Radar Range:" msgstr "Alcance de radar largo:" msgid "Send Message to Everybody:" msgstr "Enviar mensaje a todo el mundo:" msgid "Send Message to Teammates:" msgstr "Enviar mensaje a compeñeros:" msgid "Send Message to Nemesis:" msgstr "Enviar mensaje a nemesis:" msgid "Send Message to Recipient:" msgstr "Enviar mensaje al destinatario:" msgid "Jump (if allowed):" msgstr "Salta (si está permitido):" msgid "Toggle Binoculars:" msgstr "Activa/desactiva prismáticos:" msgid "Toggle Score Sheet:" msgstr "Muestra/oculta la puntuación:" msgid "Toggle Tank Labels:" msgstr "Muestra/oculta las etiquetas en tanques:" msgid "Toggle Heads-up Flag Help:" msgstr "Muestra/oculta la ayuda de bandera:" msgid "Set Time of Day Backward:" msgstr "Atrasa la hora del día:" msgid "Set Time of Day Forward:" msgstr "Adelanta la hora del día:" msgid "Self destruct/Cancel:" msgstr "Auto destrucción/anular:" msgid "Quit:" msgstr "Salir:" msgid "Scroll Message Log Backward:" msgstr "Retrocede en el registro de mensajes:" msgid "Scroll Message Log Forward:" msgstr "Avanza en el registro de mensajes:" msgid "Toggle Radar Flags:" msgstr "Muestra/oculta banderas en el radar:" msgid "Toggle Main Flags:" msgstr "Muestra/oculta banderas en vista principal:" msgid "Silence/UnSilence:" msgstr "Activa/desactiva sonido:" msgid "Server Admin:" msgstr "Administrador:" msgid "Hunt:" msgstr "Caza:" msgid "Auto Pilot:" msgstr "Piloto automático:" msgid "Main Message Tab:" msgstr "Pestaña de mensaje principal:" msgid "Chat Message Tab:" msgstr "Pestaña de conversación:" msgid "Server Message Tab:" msgstr "Pestaña de mensajes del servidor:" msgid "Misc Message Tab:" msgstr "Pestaña de mensajes miscelánea:" msgid "Esc" msgstr "Escape" msgid "Show/Dismiss menu:" msgstr "Mostrar/ocultar menu:" msgid "General" msgstr "General" msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag es un juego de combate de tanques multijugador en red. Hay cinco equipos:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "rojo, verde, azul, morado y bandidos (con tanques de color negro). Destruyendo un" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "jugador de otro equipo cuenta como victoria mientras que ser destruido o destruir a" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "un compañero cuenta como derrora. Se muestran las puntuaciones individuales y de equipo." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Los bandidos no tienen compañeros (ni siquiera otros bandidos), así que no" msgid "teammates and they don't have a team score." msgstr "pueden disparar a compañeros y no tienen puntuación de equipo." msgid "There are three styles of play, determined by the server configuration: capture-" msgstr "Hay tres modos de juego, determinados por la configuración del servidor: capturar" msgid "the-flag, rabbit-chase and free-for-all. In free-for-all the object is simply to get the" msgstr "la bandera, perseguir al conejo y estilo libre. En estilo libre el objetivo es simplemente obtener la" msgid "highest score by shooting opponents. The object in rabbit chase is to be the highest score" msgstr "máxima puntuación disparando oponentes. El objetivo en perseguir al conejo es tener la máxima" msgid "so that you have the white tank, then everyone is against you. The object in capture-the-flag is to" msgstr "puntuación de modo que cuando tienes el tanque blanco todos van contra ti. El objetivo en capturar" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "la bandera es capturar las banderas enemigas sin que capturen la tuya. En este" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "estilo, cada equipo (excepto bandidos) tiene una base y cada equipo con al menos" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "un jugador tiene una bandera de equipo con el color de su equipo. Para capturar una bandera" msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "debes cogerla y llevarla hasta la base de tu equipo (debes estar en el suelo" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "de tu base para registrar la captura). Capturar una bandera destruye todos los jugadores" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "de ese equipo y da puntuación extra a tu equipo; los jugadores volverán a aparecer en" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "la base de su equipo. Llevar tu bandera a una base enemiga cuenta como una captura en contra" msgid "your team but not for the enemy team." msgstr "de tu equipo pero no favorece al equipo enemigo." msgid "Environment" msgstr "Entorno" msgid "The world environment contains an outer wall and several buildings." msgstr "El entorno conntiene una valla exterior y varios edificios." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "No puedes salir de la valla exterior (ni saltar sobre ella)." msgid "You cannot normally drive or shoot through buildings." msgstr "Normalmente no puedes pasar o disparar a través de edificios." msgid "The server may be configured to include teleporters: large transparent" msgstr "El servidor podría estar configurado para incluir teletransportes: grandes bloques" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "negros transparentes. Loos objetos que entran por un lado del teletransporte son" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "enviados hasta un lado de otro (o quizá el mismo) teletransporte. El" msgid "teleport is reversible; reentering the same side of the destination" msgstr "teletransporte es reversible; reentrando por el mismo lado del teletransporte" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "de destino te lleva de vuelta hasta donde empezaste. Las conexiones de teletransporte" msgid "are fixed at the start of the game and don't change during the game." msgstr "son fijadas al comienzo de la partida y no cambian durante la misma." msgid "The connections are always the same in the capture-the-flag style." msgstr "Las conexiones son siempre las mismas en el modo captura la bandera." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Cada lado de un teletransporte teletransporta independientemente del otro lado." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Es posible para un teletransporte teletransportar al lado opuesto de si" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "mismo. Por lo que dicho teletransporte actúa casi igual a como si no existiese." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Un teletransporte también puede teletransportar hasta el lugar de entrada. Ese es" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "un teletransporte inversor. Disparar a un teletransporte inversor es ser un poco" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "suicida; si disparas con laser el resultado es inevitablemente catastrófico." msgid "Flags" msgstr "Banderas" msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Hay dos tipos de banderas: banderas de equipo y super banderas. Las banderas de" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "equipo solo se usan en modo captura la bandera. El servidor también puede estar" msgid "configured to supply super flags, which give your tank some advantage" msgstr "configurado para proporcionar super banderas, que dan a tu tanque alguna ventaja" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "o desventaja. Normalmente no puedes saver cuál hasta que recoges alguna," msgid "but good flags generally outnumber bad flags two to one." msgstr "pero las banderas buenas normalmente doblan en número a las malas." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Las banderas no pueden estar situadas en sitios malos. Los sitios malos son:" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "sobre un edificio o una base enemiga. Las banderas soltadas sobre un sitio malo" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "son desplazadas a una posición segura. Las banderas de equipo vuelven a su" msgid "team base. Super flags dropped above a building always disappear." msgstr "base. Las super banderas soltadas sobre edificios siempre desaparecen." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "Una super bandera buena aleatoria permanece por 4 posesiones. Tras" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "esto desaparecerá y será eventualmente reemplazada por una nueva bandera" msgid "flag. Bad random super flags disappear after the first possession." msgstr "aleatoria. Las super banderas malas desaparecen tras la primera posesión." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Las super banderas malas no pueden ser normalmente soltadas. El servidor puede" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "soltarla automáticamente por ti tras cierto tiempo, tras que destruyas" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "a cierto número de enemigos y/o cuando capturas una bandera antídoto." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Las banderas antídoto son amarillas y solo aparecen cuando tienes una bandera mala." msgid "Good Flags" msgstr "Banderas buenas" msgid "Good Flags:" msgstr "Banderas buenas:" msgid "Bad Flags" msgstr "Banderas malas" msgid "Bad Flags:" msgstr "Banderas malas:" msgid "Readouts I" msgstr "Descripciones I" msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "El radar está a la izquierda del panel de control. Muestra un plano superior en" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "rayos-x de la partida. Los edificios y la valla exterior se muestran en azul" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "claro. Las bases tienen el color de su equipo. Los teletransportes son pequeñas" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "líneas amarillas. Los tanques son puntos del color del equipo excepto los bandidos" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "que son amarillos. El tamaño del punto es una indicación de la altura del" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "tanque: a mayor altura mayor es el punto. Las banderas son pequeñas cruces. Las" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "banderas de equipo tienen su color, las super banderas son blancas y las banderas" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "antídoto son amarillas. Los disparos son puntos (o líneas o círculos, para lasers y" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "ondas de impacto, respectivamente). Tu tanque está en el centro y tu frente es" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "siempre arriba en el radar. La V amarilla es tu campo de visión. El norte" msgid "is indicated by the letter N." msgstr "se indica mediante la letra N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "La vista principal tiene varios elementos. Las dos cajas en el centro" msgid "center of the view are the motion control boxes; within the small box" msgstr "de la vista son las cajas de control de movimiento; dentro de la caja" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "pequeña no te moverás, fuera de la caja grande no te moverás mas rápido que en" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "el borde de la misma. Mover el ratón por encima o debajo de la caja pequeña te" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "mueve adelante o atrás, respectivamente. De forma similar para izquierda y derecha." msgid "The distance away from the small box determines the speed." msgstr "La distancia del puntero a la caja pequeña determina la velocidad." msgid "Readouts II" msgstr "Descripciones II" msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Sobre la caja más grande hay una cinta que muestra tu dirección. El norte" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "es 0, el este es 90, etc. Si saltar está permitido o tienes la bandera saltar," msgid "an altitude tape appears to the right of the larger box." msgstr "una cinta de altitud aparece a la derecha de la caja grande." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Pequeños diamantes o flechas de colores pueden aparecer en la cinta de" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "dirección. Una flecha a la izquierda indica que hay una bandera a tu izquierda," msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "una flecha a la derecha indica que la bandera está a tu derecha, el diamante" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "indica la posición de la bandera sobre la cinta de dirección." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "En el modo captura la bandera se muestra una marca que indica donde está" msgid "A yellow marker shows the way to the antidote flag." msgstr "la bandera de tu equipo. Una marca amarilla indica la bandera antídoto." msgid "At the top of the display are, from left to right, your callsign and" msgstr "En la parte superior se muestran, de izquierda a derecha, tu apodo y" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "puntuación, tu estado y la bandera que tienes. Tu apodo está en el" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "color de tu equipo. Tu estado es uno de: preparado, muerto, encerrado, en" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "la zona o recargando (se muestra el tiempo restante). También se puede" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "mostrar el tiempo hasta soltar una bandera mala (si es que hay tiempo límite)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "En ocasiones pueden aparecer otros mensajes de información." msgid "Credits" msgstr "Créditos" msgid "Maintainer:" msgstr "Responsable:" msgid "Original Author:" msgstr "Autor original:" msgid "Code Contributors:" msgstr "Contribuciones al código:" msgid "Tank Models:" msgstr "Modelado de tanques:" msgid "Special Thanks:" msgstr "Agradecimientos especiales:" msgid "BZFlag Home Page:" msgstr "Página principal de BZFlag:" msgid "Copyright (c) 1993 - 2008" msgstr "Copyright (c) 1993 - 2008" #################### ## HUD RENDERERER ## #################### # Translated input events are not working here msgid "Press %s to start" msgstr "Pulsa %s para comenzar" msgid "Press Pause to resume" msgstr "Pulsa pausa para continuar" msgid "AutoPilot on" msgstr "Piloto automático activado" msgid "Press Destruct to cancel" msgstr "Pulsa destrucción para anular" msgid "GAME OVER" msgstr "PARTIDA TERMINADA" msgid "Send:" msgstr "Enviar:" msgid "Dead" msgstr "Muerto" msgid "Ready" msgstr "Preparado" msgid "Reloaded in %.1f" msgstr "Recarga en %.1f" msgid "Sealed" msgstr "Encerrado" msgid "Zoned" msgstr "En la zona" msgid "FPS: %d" msgstr "FPS: %d" msgid "rtris: %i" msgstr "rtris: %i" msgid "tris: %i" msgstr "tris: %i" msgid "time: %dms" msgstr "hora: %dms" ############### ## JOIN MENU ## ############### msgid "Join Game" msgstr "Comenzar partida" msgid "Find Server" msgstr "Buscar servidor" msgid "Connect" msgstr "Conectar" msgid "Callsign:" msgstr "Apodo:" msgid "Password:" msgstr "Contraseña:" msgid "Team:" msgstr "Equipo:" msgid "Rogue" msgstr "Bandido" msgid "Observer" msgstr "Observador" msgid "Automatic" msgstr "Automático" msgid "Red Team" msgstr "Equipo rojo" msgid "Blue Team" msgstr "Equipo azul" msgid "Green Team" msgstr "Equipo verde" msgid "Purple Team" msgstr "Equipo morado" msgid "Server:" msgstr "Servidor:" msgid "Port:" msgstr "Puerto:" msgid "Motto:" msgstr "Motto:" msgid "Start Server" msgstr "Iniciar servidor" msgid "You must enter a callsign." msgstr "Debes introducir un apodo." msgid "You must enter a server." msgstr "Debes introducir un servidor." msgid "Port is invalid. Try %d." msgstr "El puerto no es válido. Intenta %d." msgid "Trying..." msgstr "Intentando..." #################### ## INPUT SETTINGS ## #################### msgid "Input Settings" msgstr "Ajustes de entrada" msgid "Change Key Mapping" msgstr "Cambiar asociación de teclas" msgid "Joystick device:" msgstr "Joystick:" msgid "Active input device:" msgstr "Dispositivo de entrada activo:" msgid "Force feedback:" msgstr "Force feedback:" msgid "Rumble" msgstr "Barullo" msgid "Directional" msgstr "Direccional" msgid "Joystick X Axis:" msgstr "Eje X del joystick:" msgid "Joystick Y Axis:" msgstr "Eje Y del joystick;" msgid "Confine mouse:" msgstr "Encerrar ratón:" msgid "Jump while typing:" msgstr "Saltar mientras se escribe:" msgid "Keyboard" msgstr "Teclado" msgid "Mouse" msgstr "Ratón" msgid "Joystick" msgstr "Joystick" msgid "Unnamed Device" msgstr "Dispositivo sin nombre" ####################### ## KEYBOARD MAP MENU ## ####################### msgid "Key Mapping" msgstr "Asociación de teclas" msgid "Use up/down arrows to navigate, enter key to enter edit mode" msgstr "Utiliza arriba/abajo para navegar, intro para entrar en modo editar" msgid "Reset Defaults" msgstr "Valores por defecto" msgid "Fire shot:" msgstr "Disparo:" msgid "Drop flag:" msgstr "Soltar bandera:" msgid "Identify/Lock On:" msgstr "Identificar/fijar" msgid "Radar Short:" msgstr "Radar corto:" msgid "Radar Medium:" msgstr "Radar medio:" msgid "Radar Long:" msgstr "Radar largo:" msgid "Send to All:" msgstr "Enviar a todos:" msgid "Send to Teammates:" msgstr "Enviar a compañeros:" msgid "Send to Nemesis:" msgstr "Enviar a nemesis:" msgid "Send to Recipient:" msgstr "Enviar al destinatario:" msgid "Send to Admin:" msgstr "Enviar al administrador:" msgid "Jump:" msgstr "Saltar:" msgid "Binoculars:" msgstr "Prismáticos:" msgid "Toggle Score:" msgstr "Muestra/oculta puntuación:" msgid "Toggle Radar:" msgstr "Muestra/oculta radar:" msgid "Toggle Console:" msgstr "Muestra/oculta consola:" msgid "Tank Labels:" msgstr "Etiquetas en tanques:" msgid "Flag Help:" msgstr "Ayuda de bandera:" msgid "Time Forward:" msgstr "Tiempo adelante:" msgid "Time Backward:" msgstr "Tiempo atrás:" msgid "Self Destruct/Cancel:" msgstr "Auto destrucción/anular:" msgid "Fast Quit:" msgstr "Salir rápido:" msgid "Scroll Backward:" msgstr "Desplazar atrás:" msgid "Scroll Forward:" msgstr "Desplazar adelante:" msgid "Scroll Bottom:" msgstr "Desplazar al final:" msgid "Toggle Flags On Radar:" msgstr "Mostrar/ocultar banderas en radar:" msgid "Toggle Flags On Field:" msgstr "Mostrar/ocultar banderas en terreno:" msgid "Silence/UnSilence Key:" msgstr "Activar/desactivar sonido:" msgid "Server Command Key:" msgstr "Comando del servidor:" msgid "Hunt Key:" msgstr "Caza:" msgid "Add/Modify Hunt Key:" msgstr "Añadir/modificar caza:" msgid "AutoPilot Key: " msgstr "Piloto automático:" msgid "Main Message Tab: " msgstr "Pestaña de mensajes principal:" msgid "Chat Message Tab: " msgstr "Pestaña de mensajes conversación:" msgid "Server Message Tab: " msgstr "Pestaña de mensajes del servidor:" msgid "Misc Message Tab: " msgstr "Pestaña de mensajes miscelánea:" msgid "Forward Key: " msgstr "Adelante:" msgid "Reverse Key: " msgstr "Atrás:" msgid "Left Key: " msgstr "Izquierda:" msgid "Right Key: " msgstr "Derecha:" msgid "Restart:" msgstr "Reiniciar:" msgid "Iconify:" msgstr "Minimizar:" msgid "Fullscreen:" msgstr "Pantalla completa:" msgid "Define Quick Keys" msgstr "Definir teclas rápidas" msgid "Notice: depending on platform not all keys might work" msgstr "Aviso: dependiendo de la plataforma algunas teclas pueden no funcionar" msgid "Send to All" msgstr "Enviar a todos" msgid "Send to Team" msgstr "Enviar al equipo" ############### ## MAIN MENU ## ############### msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Flechas arriba/abajo para mover, intro para seleccionar, escape para anular" msgid "Login" msgstr "Identificación" msgid "Username:" msgstr "Nombre de usuario:" msgid "Save Settings" msgstr "Guardar parámetros" msgid "Help" msgstr "Ayuda" msgid "Leave Game" msgstr "Abandonar juego" msgid "Quit" msgstr "Salir" msgid "Enter to quit, Esc to resume" msgstr "Intro para salir, escape para anular" msgid "Really quit?" msgstr "¿Quieres salir?" ############# ## OPTIONS ## ############# msgid "Options" msgstr "Opciones" msgid "Save Settings:" msgstr "Guardar parámetros:" msgid "On Exit" msgstr "Al salir" msgid "Save identity:" msgstr "Guardar identidad:" msgid "Username only" msgstr "Solo nombre de usuario" msgid "Username and password" msgstr "Nombre de usuario y contraseña" msgid "Save World" msgstr "Salvar mundo" msgid "File Name:" msgstr "Nombre de archivo:" msgid "No world loaded to save" msgstr "No se cargó un mundo para guardar" msgid "World Saved: " msgstr "Mundo guardado: " msgid "Error Saving: " msgstr "Error guardando: " ###################################### ## MESSAGE OF THE DAY & NEW VERSION ## ###################################### msgid "MOTD contains unexpected data" msgstr "El mensaje del día contiene información inesperada" msgid "" msgstr "" msgid "Message of the day: " msgstr "Mensaje del día:" msgid "A new version of BZFlag has been released!" msgstr "¡Hay disponible una nueva versión de BZFlag!" msgid "Would you like to upgrade now?" msgstr "¿Quieres actualizar ahora?" msgid "(Download and install: " msgstr "(Descargar e instalar: " msgid "Yes!" msgstr "¡Sí!" msgid "Not yet" msgstr "Aun no" msgid "Please upgrade as soon as possible." msgstr "Actualiza lo más pronto posible por favor." msgid "OK" msgstr "Vale" msgid "Downloading update: %d/%d KB" msgstr "Descargando actualización: %d/%d KB" msgid "Failed... can't find upgrade installer." msgstr "Error...no se pudo encontrar el instalador de actualización." msgid "Failed... not enough memory." msgstr "Error...no hay suficiente memoria." msgid "Failed... installer is not executable." msgstr "Error...el instalador no es ejecutable." msgid "Failed to start upgrade installer (%s) - error %d.\n" msgstr "Error al comenzar el instalador de actualización (%s) - error %d.\n" msgid "Installer started." msgstr "Iniciado instalador." msgid "Download Failed!" msgstr "¡Descarga fallida!" msgid "Downloading update: 8888/8888 KB" msgstr "Descargando actualización: 8888/8888 KB" ############# ## ROAMING ## ############# msgid "Roaming::changeTarget() no world, switching to free roaming\n" msgstr "Roaming::changeTarget() no hay mundo, pasando a vagar libremente\n" msgid "Rabbit " msgstr "Conejo" msgid "Tracking " msgstr "Tras la pista de " msgid "Following " msgstr "Siguiendo a " msgid "Driving with " msgstr "Conduciendo con " msgid " Flag" msgstr " Bandera" msgid "Roaming" msgstr "Vagando" ################# ## SCORE BOARD ## ################# msgid "Score" msgstr "Puntuación" msgid " Kills" msgstr " Muertes" msgid "Player" msgstr "Jugador" msgid "[Score]" msgstr "[Puntuación]" msgid "[Normalized Score]" msgstr "[Puntuación media]" msgid "[Callsign]" msgstr "[Apodo]" msgid "[Team Kills]" msgstr "[Muertes equipo]" msgid "[TK ratio]" msgstr "[Ratio ME]" msgid "[Team]" msgstr "[Equipo]" msgid "[1on1]" msgstr "[1a1]" msgid "Hunt->" msgstr "Caza->" msgid "Team Score" msgstr "Puntuación equipo" msgid "Team Flags" msgstr "Banderas equipo" msgid "playerInfo: %s\n" msgstr "información jugador: %s\n" msgid "TK Leader " msgstr "Líder ME" msgid "TK Ratio Leader " msgstr "Líder ratio ME" msgid "Leader " msgstr "Líder" ##################### ## SERVER COMMANDS ## ##################### msgid "Kick -> " msgstr "Expulsar -> " msgid "Kill -> " msgstr "Matar -> " msgid "Set players group " msgstr "Establecer grupo de jugadores " msgid "Remove player from group " msgstr "Eliminar jugador de grupo " msgid "Ghost player [enter your pass] " msgstr "Jugador fantasma [introduce contraseña] " msgid "Show player's groups " msgstr "Mostrar los grupos del jugador " msgid "Kick :" msgstr "Expulsar :" msgid "Kill :" msgstr "Matar :" msgid "Ban :" msgstr "Denegar acceso :" msgid "Set player's group :" msgstr "Establecer grupo del jugador :" msgid "Remove player from group :" msgstr "Eliminar jugador de grupo :" msgid "Ghost :" msgstr "Fantasma :" msgid "Show players group :" msgstr "Mostrar jugadores del grupo :" msgid "Unban :" msgstr "Permitir acceso :" msgid "Show ban list" msgstr "Mostrar lista de acceso restringido" msgid "Show player list" msgstr "Mostrar lista de jugadores" msgid "Reset Flags" msgstr "Reiniciar banderas" msgid "Reset Unused Flags" msgstr "Reiniciar banderas sin uso" msgid "Remove Flags" msgstr "Eliminar banderas" msgid "End Game" msgstr "Finalizar partida" msgid "Restart Countdown:" msgstr "Reiniciar cuenta atrás:" msgid "Show Flag Info" msgstr "Mostrar información de bandera" msgid "Shut Down Server" msgstr "Apagar servidor" msgid "Disconnect all Players" msgstr "Desconectar todos los jugadores" msgid "Lag Warning threshold:" msgstr "Umbral de aviso de lag:" msgid "Maximum lag warnings:" msgstr "Avisos de lag máximos:" msgid "Idle Stats" msgstr "Estadísticas de inactividad" msgid "Client Version Query" msgstr "Consultar versión de cliente" msgid "Lag / Ping Stats" msgstr "Estadísticas de lag / ping" msgid "Flag History" msgstr "Historial de banderas" msgid "Admin Password:" msgstr "Contraseña de administrador:" msgid "Send Report to Server:" msgstr "Enviar informe al servidor:" msgid "Register your nick [enter pass]:" msgstr "Registra tu apodo [introduce contraseña]:" msgid "Login [enter pass]:" msgstr "Identificarse [introduce contraseña]:" msgid "Set your password [enter pass]:" msgstr "Establece tu contraseña [introduce contraseña]:" msgid "List Groups" msgstr "Listar grupos" msgid "List Permissions" msgstr "Listar permisos" msgid "Vote:" msgstr "Votar:" msgid "Call a Poll:" msgstr "Solicitar una encuesta:" msgid "Cancel a Poll" msgstr "Cancelar una encuesta:" ################# ## SERVER LINK ## ################# msgid "Remote %s\n" msgstr "Remoto %s\n" msgid "Connected Event" msgstr "Evento conectado" msgid "Server version: '%8s'" msgstr "Versión de servidor: '%8s'" msgid "Server network statistics:\n" msgstr "Estadísticas de red del servidor:\n" msgid " elapsed time : %f\n" msgstr "tiempo transcurrido: %f\n" msgid " bytes sent : %d (%f/sec)\n" msgstr " bytes enviados: %d (%f/seg)\n" msgid " packets sent : %d (%f/sec)\n" msgstr " paquetes enviados: %d (%f/seg)\n" msgid " bytes/packet : %f\n" msgstr " bytes/paquete: %f\n" msgid " bytes recieved : %d (%f/sec)\n" msgstr " bytes recibidos: %d (%f/seg)\n" msgid " packets received: %d (%f/sec)\n" msgstr " paquetes recibidos: %d (%f/seg)\n" msgid "<** UDP Packet Code %x Len %x\n" msgstr "<** Código de paquete UDP %x tamaño %x\n" msgid "Fallback to normal TCP receive" msgstr "Retraso en recepción TCP normal" msgid "Communication error joining game [No immediate respose]." msgstr "Error de comunicación al unirse a la partida [No hay respuesta inmediata]." msgid "Server forced disconnection." msgstr "El servidor forzó una desconexión." msgid "Error: getsockname() failed, cannot get TCP port?" msgstr "Error: getsockname() fallido, ¿no se puede obtener puerto TCP?" msgid "Network: Created local UDP downlink port {1}" msgstr "Network: Creado enlace de bajada local UDP en puerto {1}" msgid "Error: Unable to set NonBlocking for UDP receive socket" msgstr "Error: No se puedo establecer no-bloqueante para puerto UDP de recepción" msgid "Server got our UDP, using UDP to server" msgstr "El servidor obtuvo nuestro UDP, usando UDP con servidor" msgid "Got server's UDP packet back, server using UDP" msgstr "Tenemos de vuelta el paquete UDP del servidor, el servidor usa UDP" msgid "Sent authentication ticket to server : \n" msgstr "Enviado boleto de autentificación al servidor : \n" msgid "Servers" msgstr "Servidores" ####################### ## SERVER START MENU ## ####################### msgid "Players" msgstr "Jugadores" msgid "Red" msgstr "Rojo" msgid "Green" msgstr "Verde" msgid "Blue" msgstr "Azul" msgid "Purple" msgstr "Morado" msgid "Observers" msgstr "Observadores" msgid "Find Servers:" msgstr "Buscar servidores:" msgid "Press '/' to search" msgstr "Pulsa '/' para buscar" msgid "Using filter:" msgstr "Utilizando filtro:" msgid "{1} Shot" msgstr "{1} disparo" msgid "{1} Shots" msgstr "{1} disparos" msgid "Capture-the-Flag" msgstr "Capturar la bandera" msgid "Rabbit Chase" msgstr "Perseguir al conejo" msgid "Free-style" msgstr "EStilo libre" msgid "Super Flags" msgstr "Super banderas" msgid "Antidote Flags" msgstr "Banderas antídoto" msgid "{1} sec To Drop Bad Flag" msgstr "{1} segundo para soltar bandera mala" msgid "{1} secs To Drop Bad Flag" msgstr "{1} segundos para soltar bandera mala" msgid "{1} Win Drops Bad Flag" msgstr "{1} victoria suelta bandera mala" msgid "{1} Wins Drops Bad Flag" msgstr "{1} victorias sueltan bandera mala" msgid "Handicap" msgstr "Desventaja" msgid "Time limit: {1}" msgstr "Tiempo límite: {1}" msgid "Max team score: {1}" msgstr "Puntuación de equipo máxima: {1}" msgid "Max player score: {1}" msgstr "Puntuación de jugador máxima: {1}" msgid "Searching" msgstr "Buscando" msgid "Servers found: {1}/{2}" msgstr "Servidores encontrados: {1}/{2}" msgid "Style:" msgstr "Estilo:" msgid "Capture the Flag" msgstr "Captura la bandera" msgid "Free for All" msgstr "Estilo libre" msgid "Rabbit Hunt (Random Selection)" msgstr "Perseguir al conejo (selección aleatoria)" msgid "Rabbit Hunt (Score-based Selection)" msgstr "Perseguir al conejo (selección por puntuación)" msgid "Rabbit Hunt (Killer Selection)" msgstr "Perseguir al conejo (selección por asesino)" msgid "Max Players:" msgstr "Número de jugadores:" msgid "Max Shots:" msgstr "Número de disparos:" msgid "Teleporters:" msgstr "Teletransportes:" msgid "no" msgstr "no" msgid "yes" msgstr "sí" msgid "Ricochet:" msgstr "Rebote:" msgid "Jumping:" msgstr "Saltar:" msgid "Handicap:" msgstr "Desventaja:" msgid "Superflags:" msgstr "Superbanderas:" msgid "good flags only" msgstr "solo banderas buenas" msgid "all flags" msgstr "todas las banderas" msgid "Max Superflags:" msgstr "Número superbanderas:" msgid "Bad Flag Antidote:" msgstr "Antídoto de bandera mala:" msgid "Bad Flag Time Limit:" msgstr "Tiempo límite de bandera mala:" msgid "no limit" msgstr "sin límite" msgid "15 seconds" msgstr "15 segundos" msgid "30 seconds" msgstr "30 segundos" msgid "60 seconds" msgstr "60 segundos" msgid "180 seconds" msgstr "180 segundos" msgid "Bad Flag Win Limit:" msgstr "Límite de victorias de bandera mala:" msgid "drop after 1 win" msgstr "soltar tras 1 victoria" msgid "drop after 2 wins" msgstr "soltar tras 2 victorias" msgid "drop after 3 wins" msgstr "soltar tras 3 victorias" msgid "Game Over:" msgstr "Partida finalizada:" msgid "never" msgstr "nunca" msgid "after 5 minutes" msgstr "tras 5 minutos" msgid "after 15 minutes" msgstr "tras 15 minutos" msgid "after 60 minutes" msgstr "tras 60 minutos" msgid "after 3 hours" msgstr "tras 3 horas" msgid "when a player gets +3" msgstr "cuando un jugador consigue +3" msgid "when a player gets +10" msgstr "cuando un jugador consigue +10" msgid "when a player gets +25" msgstr "cuando un jugador consigue +25" msgid "when a team gets +3" msgstr "cuando un equipo consigue +3" msgid "when a team gets +10" msgstr "cuando un equipo consigue +10" msgid "when a team gets +25" msgstr "cuando un equipo consigue +25" msgid "when a team gets +100" msgstr "cuando un equipo consigue +100" msgid "Server Reset:" msgstr "Resetear servidor:" msgid "no, quit after game" msgstr "no, salir tras la partida" msgid "yes, reset for more games" msgstr "sí, reiniciar para más partidas" msgid "World Map:" msgstr "Mapa del mundo:" msgid "random map" msgstr "mapa aleatorio" msgid "directory" msgstr "directorio" msgid "Start" msgstr "Comenzar" msgid "Failed... can't find server program." msgstr "Error...no se puede encontrar el programa servidor." msgid "Failed... server program is not executable." msgstr "Error...el programa servidor no es ejecutable." msgid "Failed to start server (%s) - error %d.\n" msgstr "No se pudo iniciar servidor (%s) - error %d.\n" msgid "Server started." msgstr "Servidor iniciado." msgid "Failed... cannot fork." msgstr "Error...no se pudo crear proceso." msgid "Failed (exit = %i)." msgstr "Error (salida = %i)." msgid "Failed (signal = %i)." msgstr "Error (señal = %i)." msgid "Failed." msgstr "Error." msgid "localhost" msgstr "localhost" ################ ## STATISTICS ## ################ msgid "Shot Statistics" msgstr "Estadísticas de disparo" msgid "Shots Hit/Fired" msgstr "Disparos buenos/fallados" msgid "Super" msgstr "Super" msgid "Shock" msgstr "Onda" msgid "Fave." msgstr "Fave." msgid "Hit%" msgstr "%impacto" msgid "Total" msgstr "Total" msgid "Norm" msgstr "Norm" msgid "GM" msgstr "Misil" msgid "Bullet" msgstr "Bala" msgid "Wave" msgstr "Onda" msgid "Flag" msgstr "Bandera" ################# ## SILENCE KEY ## ################# msgid "Silenced " msgstr "Sin voz" msgid "Unsilenced " msgstr "Con voz" msgid "Unblocked Msgs" msgstr "Mensajes desbloqueados" msgid " Does not exist" msgstr "No existe" msgid "Silence -->" msgstr "Silencio -->" msgid "Un" msgstr "Sin " ###################### ## PLAYING MESSAGES ## ###################### msgid "world weapon" msgstr "arma mundial" msgid "Got shot by " msgstr "Disparado por " msgid "Got flattened by " msgstr "Aplastado por " msgid "Team flag was captured by " msgstr "La bandera de equipo fue capturada por " msgid "Teammate hit with Genocide by " msgstr "Compañero disparado con genocidio por " msgid "Tank Self Destructed" msgstr "Tanque auto destruido" msgid "Tank Rusted" msgstr "Tanque enmohecido" msgid "Flags on field hidden, to show them " msgstr "Banderas en terreno ocultas, para mostrarlas " msgid " bind a key to Toggle Flags on Field" msgstr "asocia tecla para mostrar/ocultar banderas en terreno" msgid "Flags on radar hidden, to show them " msgstr "Banderas en radar ocultas, para mostrarlas " msgid " bind a key to Toggle Flags on Radar" msgstr "asocia tecla para mostrar/ocultar banderas en radar" msgid "To toggle the radar " msgstr "Para mostrar/ocultar el radar " msgid " bind a key to Toggle Radar" msgstr "asocia tecla para mostrar/ocultar el radar" msgid "To toggle the console " msgstr "Para mostrar/ocultar la consola " msgid " bind a key to Toggle Console" msgstr "asocia una tecla para mostrar/ocultar la consola" msgid "ZSceneDatabase processed in %.3f seconds.\n" msgstr "ZSceneDatabase procesado en %.3f segundos.\n" msgid "BSPSceneDatabase processed in %.3f seconds.\n" msgstr "BSPSceneDatabase procesado en %.3f segundos.\n" msgid "Download stopped by user action" msgstr "Descarga cancelada por usuario" msgid "The tank's motion is now frozen! ... Press Shift+` to unfreeze" msgstr "¡El movimiento del tanque está congelado!... Pulsa Shift+` para descongelar" msgid "Resumed" msgstr "Continuando" msgid "There does not appear to be any key bound to enter the game" msgstr "No hay ninguna tecla asociada para iniciar la partida" msgid "Invalid player identification (%d)" msgstr "Identificación de jugador no válida (%d)" msgid "WARNING: invalid player identification when adding player with id " msgstr "PELIGRO: identificación de jugador inválida al añadir su identificador" msgid "Server error when adding player, player already added" msgstr "Error de servidor al añadir al jugaodr, jugador ya añadido" msgid "WARNING: player already exists at location with id " msgstr "PELIGRO: ya hay un jugador en la localización con identificador " msgid "joining as " msgstr "jugando como " msgid "an observer" msgstr "un observador" msgid "a tank" msgstr "un tanque" msgid "a robot tank" msgstr "un tanque robot" msgid "an unknown type" msgstr "un tipo desconocido" msgid "IPINFO: " msgstr "IPINFO: " msgid "\t from: " msgstr "\t de: " msgid "signing off" msgstr "abandonando" msgid " from " msgstr " de " msgid "(leave)" msgstr "(omitido)" msgid "World cache files disappeared. Join canceled" msgstr "Caché del mundo desaparecida. No se comenzó la partida" msgid "Loading world into memory..." msgstr "Cargando el mundo en memoria..." msgid "Error loading cached world. Join canceled" msgstr "Error cargando la caché del mundo. No se comenzó la partida" msgid "Verifying world integrity..." msgstr "Comprobando la integridad del mundo..." msgid "Error on md5. Removing offending file." msgstr "Error en md5. Eliminando archivo corrupto." msgid "Preparing world..." msgstr "Preparando mundo..." msgid "Error unpacking world database. Join canceled." msgstr "Error descomprimiendo el mundo. No se comenzó la partida" msgid "Downloading files..." msgstr "Descargando archivos..." msgid "Loading world from " msgstr "Cargando mundo de " msgid "Download from URL failed" msgstr "Descarga desde URL fallida" msgid "Problem writing cache" msgstr "Problema escribiendo en caché" msgid "Downloading World..." msgstr "Descargando mundo..." msgid "Flags not supported by this client: {1}" msgstr "Este ciente no soporta las banderas: {1}" msgid "Downloading World (%2d%% complete/%d kb remaining)..." msgstr "Descargando mundo (%2d%% completo/%d kb pendientes)..." msgid "Server forced a disconnect" msgstr "El servidor forzó una desconexión" msgid "Requesting World Hash..." msgstr "Solicitando el hash del mundo..." msgid "Time Expired" msgstr "Tiempo sobrepasado" msgid "Game Paused" msgstr "Partida en pausa" msgid "[unknown player]" msgstr "[jugador desconocido]" msgid " won the game" msgstr " ganó la partida" msgid "Roger taking controls" msgstr "Roger tomando controles" msgid "Roger releasing controls" msgstr "Roger soltando controles" msgid "Don't kill teammates!!!" msgstr "¡¡¡No mates compeñeros!!!" msgid "sorry, i'm just a silly machine" msgstr "lo siento, solo soy una máquina tonta" msgid "blew myself up" msgstr "se suicidó" msgid "destroyed by the server" msgstr "destruido por el servidor" msgid "destroyed by a (GHOST)" msgstr "destruido por un (FANTASMA)" msgid "fell in the water" msgstr "cayó en el agua" msgid "Unknown Deadly Obstacle" msgstr "Obstáculo mortal desconocido" msgid "teammate " msgstr "compañero" msgid "was fried by " msgstr "fue frito por" msgid "'s laser" msgstr " y su laser" msgid "was destroyed by " msgstr "fue destruido por " msgid "'s guided missile" msgstr " y su misil teledirigido" msgid "felt the effects of " msgstr "sintió los efectos de " msgid "'s shockwave" msgstr " y su onda de impacto" msgid "didn't see " msgstr "no pudo ver a " msgid "'s bullet" msgstr " y su bala" msgid "was turned into swiss cheese by " msgstr "fue convertido en queso suizo por " msgid "'s machine gun" msgstr " y su ametralladora" msgid "got skewered by " msgstr "fue ensartado por " msgid "'s super bullet" msgstr " y su super bala" msgid "killed by " msgstr "asesinado por " msgid "Flag Alert!!!" msgstr "¡¡¡Alerta de bandera!!!" msgid "Team Grab!!!" msgstr "¡¡¡Capturamos una bandera!!!" msgid "grabbed " msgstr "capturada " msgid " flag" msgstr " bandera" msgid "took my flag into " msgstr "puso my bandera en " msgid " territory" msgstr " territorio" msgid "Don't capture your own flag!!!" msgstr "¡¡¡No captures tu propia bandera!!!" msgid "captured " msgstr "capturada " msgid "'s flag" msgstr " y su bandera" msgid "You are now the rabbit." msgstr "Tu eres ahora el conejo." msgid "is now the rabbit" msgstr "es ahora el conejo" msgid "SERVER" msgstr "SERVIDOR" msgid "(UNKNOWN)" msgstr "(DESCONOCIDO)" msgid "Admin" msgstr "Administrador" msgid "Ignored Msg" msgstr "Mensaje ignorado" msgid "Identify with /identify" msgstr "Identifica con /identify" msgid "Autoidentifying with password stored for " msgstr "Autoidentificando con contraseñas almacenadas por " msgid "[Admin] " msgstr "[Admin] " msgid "[to " msgstr "[a " msgid "[Team] " msgstr "[Equipo] " msgid "(join)" msgstr "(unir)" msgid "Paused" msgstr "En pausa" msgid "locked on me" msgstr "fijado en mi" msgid "Server communication error" msgstr "Error de comunicación con el servidor" msgid "dropped " msgstr "soltó " msgid " stole " msgstr " robó " msgid "Killed by unknown obstacle" msgstr "Asesinado por obstáculo desconocido" msgid "Invalid reason" msgstr "Razón inválida" msgid "Shot myself" msgstr "Me he suicidado" msgid "Killed by the server" msgstr "Asesinado por el servidor" msgid "Hunter" msgstr "Cazador" msgid " with " msgstr " con " msgid "Closest Flag: " msgstr "Próxima bandera: " msgid "Locked on " msgstr "Fijado en " msgid ") with " msgstr ") con " msgid "Looking at a tank" msgstr "Mirando al tanque" msgid "Looking at " msgstr "Mirando a " msgid "SPOTTED: " msgstr "VIGILANTE: " msgid "%s team was unavailable, you were joined " msgstr "%s no está disponible, te has unido al " msgid "as an Observer" msgstr "como un observador" msgid "to the %s" msgstr "a el %s" msgid "You were joined as an observer" msgstr "Te has unido a la partida como observador" msgid "You joined the %s" msgstr "Te uniste al %s" msgid "You joined as a %s" msgstr "Te uniste como un %s" msgid "cleanWorldCache: removed %s\n" msgstr "borrar caché del mundo: eliminado %s\n" msgid "id " msgstr "id " msgid "id test %p %p %p %8.8x %8.8x\n" msgstr "test de id %p %p %p %8.8x %8.8x\n" msgid "Server not found" msgstr "Servidor no encontrado" msgid "Server Access Denied Locally" msgstr "Acceso al servidor denegado localmente" msgid "server access is controlled by " msgstr "acceso al servidor controlado por " msgid "Memory error" msgstr "Error de memoria" msgid "Incompatible server version XXXXXXXX" msgstr "Versión incompatible de servidor XXXXXXXX" msgid "You have been banned from this server" msgstr "Se te ha restringido el acceso al servidor" msgid "You have been banned from this server:" msgstr "Se te ha restringido el acceso al servidor:" msgid "Game is full or over. Try again later." msgstr "Partida llena o finalizada. Inténtalo más tarde." msgid "Error connecting to server." msgstr "Error de conexión con el servidor." msgid "Cannot connect to full version server." msgstr "No se puede conectar al servidor con versión completa." msgid "Internal error connecting to server (error code %d)." msgstr "Error interno al conectar con el servidor (código de error %d)." msgid "No UDP connection, see Options to enable." msgstr "No hay conexión UPD, mira las opciones para habilitar." msgid "Connection Established..." msgstr "Conexión establecida..." msgid "Entering game..." msgstr "Comenzando la partida..." msgid "Disabled stencilShadows for interlaced mode" msgstr "Sombras plantilla deshabilitadas por modo entrelazado" msgid "Can't pause while inside a building" msgstr "No se puede pausar dentro de un edificio" msgid "Can't pause when you are in the air" msgstr "No se puede pausar en el aire" msgid "Unable to pause right now" msgstr "No se puede pausar ahora" msgid "Can't pause when you are in the phantom zone" msgstr "No se puede pausar cuando estás en la zona" msgid "Pausing in %d" msgstr "Pausa en %d" msgid "Self Destructing in %d" msgstr "Auto destrucción en %d" msgid "Server has unexpectedly disconnected" msgstr "Desconexión inesperada con el servidor" msgid " movement" msgstr " movimiento" msgid "not responding" msgstr "sin respuesta" msgid "okay" msgstr "correcto" msgid " lowest quality" msgstr " calidad más baja" msgid " lowest quality with texture" msgstr " calidad más baja con texturas" msgid " full quality" msgstr " máxima calidad" msgid " medium quality" msgstr " calidad media" msgid " low quality" msgstr " baja calidad" msgid " nearest texturing" msgstr " texturas próximas" msgid " no texturing" msgstr " sin texturas" msgid " no blending" msgstr " sin mezclado" msgid " no smoothing" msgstr " sin suavizado" msgid " no lighting" msgstr " sin iluminación" msgid " no dithering" msgstr " sin fusionado" msgid "testing performance; please wait..." msgstr "probando rendimiento; espera por favor..." msgid "BZFlag version: %s\n" msgstr "Versión de BZFlag: %s\n" msgid "BZFlag protocol: %s\n" msgstr "Protocolo de BZFlag: %s\n" msgid "OpenGL vendor: %s\n" msgstr "Proveedor de OpenGL: %s\n" msgid "OpenGL version: %s\n" msgstr "Versión de OpenGL: %s\n" msgid "OpenGL renderer: %s\n" msgstr "Renderizado de OpenGL: %s\n" msgid "Depth Buffer: %i bitplanes\n" msgstr "Profundidad de buffer: %i planos de bit\n" msgid "Running on Windows %s%d.%d %s\n" msgstr "Ejecutando en windows %s%d.%d %s\n" msgid "NT " msgstr "NT" msgid "This release will expire on %s" msgstr "Esta versión caducará en %s" msgid "BZFlag version: " msgstr "Versión de BZFlag: " msgid "Author: Chris Schoeneman " msgstr "Autor: Chris Schoeneman " msgid "Maintainer: Tim Riker " msgstr "Responsable: Tim Riker " msgid "Audio Driver: " msgstr "Driver de sonido: " msgid "OpenGL Driver: " msgstr "Driver de OpenGL: " msgid " Silenced" msgstr " silenciado" bzflag-2.4.2+ds1/data/l10n/bzflag_fr.po000066400000000000000000001274221200563112200174260ustar00rootroot00000000000000# This is generic French msgid "Join Game" msgstr "Rejoindre la partie" msgid "fr" msgstr "French" #msgid "translator" #msgstr "" msgid "Find Server" msgstr "Chercher un serveur" msgid "Connect" msgstr "Connexion" msgid "Callsign:" msgstr "Pseudonyme:" msgid "Team:" msgstr "Equipe:" msgid "Server:" msgstr "Serveur:" #msgid "Port:" #msgstr "" msgid "Start Server" msgstr "Démarrer un serveur" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Flèches haut/bas pour se déplacer, entrée pour sélectionner, esc pour annuler" #msgid "Options" #msgstr "" msgid "Help" msgstr "Aide" msgid "Quit" msgstr "Quitter" #msgid "on" #msgstr "" #msgid "Dithering:" #msgstr "" #msgid "off" #msgstr "" msgid "Off" msgstr "Non" msgid "On" msgstr "Oui" msgid "Blending:" msgstr "Transparence:" msgid "Smoothing:" msgstr "Lissage:" msgid "Lighting:" msgstr "Eclairage:" msgid "Texturing:" msgstr "Textures:" #msgid "Nearest" #msgstr "" #msgid "Linear" #msgstr "" #msgid "Nearest Mipmap Nearest" #msgstr "" #msgid "Linear Mipmap Nearest" #msgstr "" #msgid "Nearest Mipmap Linear" #msgstr "" #msgid "Linear Mipmap Linear" #msgstr "" msgid "Quality:" msgstr "Qualité:" msgid "Low" msgstr "Bas" msgid "Medium" msgstr "Moyen" msgid "High" msgstr "Haut" msgid "Shadows:" msgstr "Ombres:" msgid "Depth Buffer:" msgstr "Tampon de profondeur:" msgid "Not available" msgstr "Non disponible" msgid "Change Video Format" msgstr "Changer la résolution d'écran" msgid "Brightness:" msgstr "Luminosité:" msgid "Sound Volume:" msgstr "Volume:" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "" #msgid "15 Minutes" #msgstr "" #msgid "30 Minutes" #msgstr "" #msgid "1 Hour" #msgstr "" #msgid "5 Hours" #msgstr "" #msgid "15 Hours" #msgstr "" #msgid "1 day" #msgstr "" #msgid "15 days" #msgstr "" #msgid "30 days" #msgstr "" msgid "UDP network connection:" msgstr "Connexion réseau UDP" #msgid "Server List Cache:" #msgstr "" #msgid "Clear Server List Cache" #msgstr "" msgid "Change Key Mapping" msgstr "Changer l'affectation des touches" msgid "GUI Options" msgstr "Options de l'interface" msgid "Enhanced radar:" msgstr "Radar amélioré" msgid "Controlpanel & Score FontSize:" msgstr "Taille du texte pour le panneau de contrôle et les scores" #msgid "normal" #msgstr "" msgid "bigger" msgstr "plus grand" msgid "Radar & Panel Opacity:" msgstr "Opacité du radar et du panneau" msgid "Colored shots on radar:" msgstr "Tirs colorés sur le radar" msgid "Radar Shot Length:" msgstr "Longueur des tirs sur le radar" #msgid "Radar & Panel Size:" #msgstr "" #msgid "Mouse Box Size:" #msgstr "" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" msgid "Page Down for next page" msgstr "Page Suiv pour la page suivante" msgid "Page Up for previous page" msgstr "Page Prec pour la page précédente" #msgid "Rogue" #msgstr "" msgid "Red Team" msgstr "Equipe Rouge" msgid "Green Team" msgstr "Equipe Verte" msgid "Blue Team" msgstr "Equipe Bleue" msgid "Purple Team" msgstr "Equipe Mauve" msgid "Enter to quit, Esc to resume" msgstr "Entrée pour quitte, Esc pour continuer" msgid "Really quit?" msgstr "Quitter ?" msgid "Video Format" msgstr "Résolution" msgid "Current Format:" msgstr "Résolution actuelle:" msgid "Key Mapping" msgstr "Assignation des touches" msgid "Reset Defaults" msgstr "Défaut" msgid "Fire shot:" msgstr "Tirer:" msgid "Drop flag:" msgstr "Jeter un drapeau:" msgid "Identify/Lock On:" msgstr "Identifier/Verouiller une cible:" msgid "Radar Short:" msgstr "Radar courte portée:" msgid "Radar Medium:" msgstr "Radar moyenne portée:" msgid "Radar Long:" msgstr "Radar longue portée:" msgid "Send to All:" msgstr "Message à tous:" msgid "Send to Teammates:" msgstr "Message à l'équipe:" msgid "Send to Nemesis:" msgstr "Message au Nemesis:" msgid "Send to Recipient:" msgstr "Message personnel:" msgid "Jump:" msgstr "Sauter:" msgid "Binoculars:" msgstr "Jumelles:" msgid "Toggle Score:" msgstr "Afficher/masquer les scores:" msgid "Tank Labels:" msgstr "Noms des tanks:" msgid "Flag Help:" msgstr "Aide drapeau:" msgid "Time Forward:" msgstr "Avancer le temps:" msgid "Time Backward:" msgstr "Reculer le temps:" msgid "Pause/Resume:" msgstr "Pause/Reprise:" #msgid "Self Destruct/Cancel:" #msgstr "" msgid "SelfDestruct/Cancel:" msgstr "Autodestruction/Annuler:" msgid "Fast Quit:" msgstr "Quitter rapidement:" msgid "Scroll Backward:" msgstr "Défiler vers le bas:" msgid "Scroll Forward:" msgstr "Défiler vers le haut:" msgid "Slow Keyboard Motion:" msgstr "Mouvement clavier lent:" msgid "loading {1}" msgstr "chargement {1}" msgid "controls tank motion" msgstr "contrôle les mouvements du tank" msgid "Mouse Position:" msgstr "Position de la souris:" msgid "fires shot" msgstr "tire un boulet" msgid "drops flag (if not bad)" msgstr "jette un drapeau (sauf les mauvais)" msgid "identifies player (locks on GM)" msgstr "identifie un joueur (verouille si GM)" msgid "jump (if allowed)" msgstr "saute (si autorisé)" msgid "short radar range" msgstr "radar courte portée" msgid "medium radar range" msgstr "radar moyenne portée" msgid "long radar range" msgstr "radar longue portée" msgid "toggle binoculars" msgstr "active/désactive les jumelles" msgid "toggle heads-up flag help" msgstr "affiche/masque l'aide drapeau" msgid "send message to teammates" msgstr "envoie un message aux coéquipiers" msgid "send message to everybody" msgstr "envoie un message à tout le monde" msgid "send message to nemesis" msgstr "envoie un message au nemesis" msgid "send message to recipient" msgstr "envoie un message personnel" msgid "toggle score sheet" msgstr "affiche/masque les scores" msgid "toggle tank labels" msgstr "affiche/masque les noms des tanks" msgid "set time of day backward" msgstr "recule l'heure courante" msgid "set time of day forward" msgstr "avance l'heure courante" msgid "pause/resume" msgstr "pause/reprise" msgid "self Destruct/Cancel" msgstr "autodestruction/annulation" msgid "quit" msgstr "quitte" msgid "scroll message log backward" msgstr "défile les messages vers le bas" msgid "scroll message log forward" msgstr "défile les messages vers le haut" #msgid "Slow Keyboard Motion" #msgstr "" #msgid "Toggle Radar Flags" #msgstr "" #msgid "Toggle Main Flags" #msgstr "" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" #msgid "Hunt" #msgstr "" #msgid "autopilot enabled" #msgstr "" #msgid "autopilot disabled" #msgstr "" msgid "show/dismiss menu" msgstr "affiche/cache le menu" #msgid "Esc:" #msgstr "" msgid "Maintainer:" msgstr "Mainteneur:" msgid "Original Author:" msgstr "Auteur original:" msgid "Code Contributors:" msgstr "Contributeurs:" msgid "Tank Models:" msgstr "Modèles de tank:" msgid "Special Thanks:" msgstr "Remerciements:" msgid "Send:" msgstr "Envoyer:" msgid "Servers" msgstr "Serveurs" msgid "Players" msgstr "Joueurs" msgid "Red" msgstr "Rouge" msgid "Green" msgstr "Vert" msgid "Blue" msgstr "Bleu" msgid "Purple" msgstr "Mauve" msgid "Controls" msgstr "Contrôles" msgid "General" msgstr "Général" msgid "Environment" msgstr "Environnement" msgid "Flags I" msgstr "Drapeaux I" msgid "Flags II" msgstr "Drapeaux II" msgid "Flags III" msgstr "Drapeaux III" msgid "Readouts I" msgstr "Lectures I" msgid "Readouts II" msgstr "Lectures II" msgid "Credits" msgstr "Crédits" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Pressez Entrée pour sélectionner et T pour tester. Esc pour quitter." msgid "Free-style" msgstr "Match à mort" msgid "Capture-the-Flag" msgstr "Capture du drapeau" #msgid "Rabbit Chase" #msgstr "" msgid "Super Flags" msgstr "Super drapeaux" msgid "Antidote Flags" msgstr "Drapeaux antidote" msgid "Trying..." msgstr "En cours..." msgid "Press %s to start" msgstr "Appuyez sur %s pour commencer" msgid "Dead" msgstr "Mort" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "Prêt" msgid "Reloaded in %.1f" msgstr "Rechargement dans %.1f" msgid "Sealed" msgstr "Scellé" msgid "Zoned" msgstr "Zoné" #msgid "You are now the rabbit." #msgstr "" msgid "Servers found: {1}" msgstr "Serveurs trouvés: {1}" msgid "{1} Shot" msgstr "{1} Tir" msgid "{1} Shots" msgstr "{1} Tirs" msgid "{1} sec To Drop Bad Flag" msgstr "{1} seconde pour jeter le mauvais drapeau" msgid "{1} secs To Drop Bad Flag" msgstr "{1} secondes pour jeter le mauvais drapeau" msgid "{1} Win Drops Bad Flag" msgstr "{1} victoire pour jeter le mauvais drapeau" msgid "{1} Wins Drops Bad Flag" msgstr "{1} victoire pour jeter le mauvais drapeau" msgid "Time limit: {1}" msgstr "Temps limité: {1}" msgid "Max team score: {1}" msgstr "Score d'équipe maximum: {1}" msgid "Max player score: {1}" msgstr "Score maximum: {1}" msgid "Page {1} of {2}" msgstr "Page {1} sur {2}" msgid "openBroadcast: No udp service {1}" msgstr "openBroadcast: Pas de service UDP {1}" msgid "joystick '{1}' not supported..." msgstr "joystick '{1}' non supporté..." #msgid "Server did send endpoint information, UDP connection up" #msgstr "" msgid "Ignoring Finder argument '{1}'" msgstr "Paramètre du finder ignoré '{1}'" msgid "Can't open list server: {1}" msgstr "Impossible d'ouvrir le serveur de liste: {1}" msgid "Server sent downlink endpoint information, port {1}" msgstr "Le serveur a envoyé les informations du port de connexion retour, {1}" msgid "Communication error joining game [Wrong Code {1}]." msgstr "Erreur de communication [Mauvais Code {1}]." #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" msgid "Configuration file: Error on line {1}: Stream failure" msgstr "Fichier de configuration: Erreur à la ligne {1}: Erreur de flux" msgid "Configuration file: Error on line {1}: Line too long" msgstr "Fichier de configuration: Erreur à la ligne {1}: Ligne trop longue" msgid "Network: Created local UDP downlink port {1}" msgstr "Réseau: Port UDP local créé: {1}" #msgid "msgid " #msgstr "" msgid "More Info: [{1}:{2}:{3}]" msgstr "Plus d'information: [{1}:{2}:{3}]" msgid "cannot load texture: {1}" msgstr "chargement de la texture impossible: {1}" msgid "Connection failed." msgstr "La connexion a échoué" msgid "Server forced a disconnect" msgstr "Le serveur a forcé une déconnexion" msgid "Rogues not allowed. Try another team." msgstr "Rogues interdits. Essayez une autre équipe." msgid "This team is full. Try another team." msgstr "Cette équipe est pleine. Essayez-en une autre." msgid "This game is full. Try again later." msgstr "Le serveur est plein. Re-essayez plus tard." msgid "Game is full or over. Try again later." msgstr "Le serveur est plein ou le jeu est terminé. Re-essayez plus tard." msgid "Error connecting to server." msgstr "Erreur lors de la connexion au serveur." msgid "Error downloading world database" msgstr "Erreur lors du téléchargement de la carte" #msgid "Score" #msgstr "" #msgid "Kills" #msgstr "" #msgid "Team Score" #msgstr "" #msgid "Locale:" #msgstr "" #msgid "Player" #msgstr "" # Super Flags msgid "High Speed" msgstr "Haute Vitesse" msgid "Quick Turn" msgstr "Vitesse Angulaire" msgid "Oscillation Overthruster" msgstr "Accélérateur d'Oscillation" msgid "Rapid Fire" msgstr "Tir Rapide" msgid "Machine Gun" msgstr "Mitraillette" msgid "Guided Missile" msgstr "Missile Guidé" #msgid "Laser" #msgstr "" #msgid "Ricochet" #msgstr "" msgid "Super Bullet" msgstr "Super Boulet" msgid "Invisible Bullet" msgstr "Boulet Invisible" msgid "Stealth" msgstr "Furtif" msgid "Tiny" msgstr "Petit" msgid "Narrow" msgstr "Plat" msgid "Shield" msgstr "Bouclier" msgid "Steamroller" msgstr "Rouleau Compresseur" msgid "Shock Wave" msgstr "Onde de Choc" msgid "Phantom Zone" msgstr "Zone Fantôme" msgid "Genocide" msgstr "Génocide" msgid "Jumping" msgstr "Saut" msgid "Identify" msgstr "Identification" msgid "Cloaking" msgstr "Dissimulation" msgid "Colorblindness" msgstr "Daltonisme" msgid "Obesity" msgstr "Obésité" msgid "Left Turn Only" msgstr "Direction bloquée à Gauche" msgid "Right Turn Only" msgstr "Direction bloquée à Droite" msgid "Momentum" msgstr "Inertie" msgid "Blindness" msgstr "Aveuglement" msgid "Jamming" msgstr "Brouillage Radar" msgid "Wide Angle" msgstr "Angle Large" # Flag help msgid "You have no flag." msgstr "Vous n'avez pas de drapeau." msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Le drapeau de votre équipe: empêchez les autres équipes de le capturer !" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Le drapeau de l'équipe adverse: emportez-le à votre base pour le capturer !" #msgid "Velocity (V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Useless" #msgstr "" #msgid "Thief" #msgstr "" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" #msgid "Angular velocity (A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" msgid "Velocity (+V): Tank moves faster. Outrun bad guys." msgstr "Vitesse (+V): Votre tank bouge plus vite. Pourchassez les ennemis." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "Vitesse Angulaire (+A): Votre tank tourne plus vite. Fendez-vous plus rapidement." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Accélérateur d'Oscillation (+OO): Vous pouvez traverser les murs. Vous ne pouvez pas reculer ou tirer quand vous êtes dans un mur." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Tir Rapide (+F): Tirez plus souvent. Les boulets vont plus vite, mais pas aussi loin." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Mitraillette (+MG): Rechargement très rapide et très faible portée." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Missile Guidé (+GM): Les tirs suivent la cible. Verouillez les cibles avec le bouton droit. Vous pouvez verouiller ou changer de cible après avoir tiré." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Tire un rayon laser. Vitesse et portée infinies, mais temps de rechargement long." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochet (+R): Les tirs ricochent sur les murs. Ne vous tuez pas vous-même !" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super Boulet (+SB): Les tirs traversent les murs. Ils peuvent tuer les tanks Zone Fantôme." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Boulet Invisible (+IB): Vos tirs n'apparaissent pas sur les autres radars. Ils restent détectables en visuel." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Furtif (+ST): Votre tank est invisible sur les radars. Vos tirs sont toutefois visibles. Tendez des embuscades à vos ennemis !" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Petit (+T): Votre tank est petit et peut passer dans des petites ouvertures. Il est très dur à toucher." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Plat (+N): Votre tank est extrèmement fin. Très dur à toucher de face, mais il apparaît de taille normale sur les côtés. Il peut passer dans des petites ouvertures." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Bouclier (+SH): Se faire toucher ne fait que perdre le drapeau. Le drapeau reste en l'air plus longtemps que les autres." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Rouleau Compresseur (+SR): Détruit les tanks que vous touchez, mais vous devez être vraiment très près." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Onde de Choc (+SW): Détruit tous les tanks alentour. Ne tuez pas vos coéquipiers ! Peut tuer les tanks sur/dans les structures." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Zone Fantôme (+PZ): La téléportation active ou désactive l'effet Zoné. Les tanks zonés peuvent passer à travers les murs. Ils ne peuvent pas tirer ni être tués (sauf par les super boulets et les ondes de choc)." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Genocide (+G): Tuer un tank tue également toute son équipe." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Saut (+JP): Votre tank peut sauter. Utilisez la touche Tab. Vous ne pouvez pas contrôler votre direction lorsque vous êtes en l'air." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "Identification (+ID): Identifie le drapeau le plus proche." msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Dissimulation (+CL): Rend votre tank invisible en visuel. Vous êtes toujours visible sur les radars." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Daltonisme (-CB): Impossible de discerner les différentes équipes. Ne tuez pas vos coéquipiers !" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Obésité (-O): Votre tank devient très gros. Il ne passe plus dans les téléporteurs." msgid "left turn only (- <-): Can't turn right." msgstr "Direction bloquée à gauche (- <-): Vous ne pouvez plus tourner à droite." msgid "right turn only (- ->): Can't turn left." msgstr "Direction bloquée à droite (- ->): Vous ne pouvez plus tourner à gauche." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Inertie (-M): Votre tank a de l'inertie. L'accélération est limitée." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Aveuglement (-B): Vous ne voyez plus rien. Votre radar fonctionne toujours." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Brouillage Radar (-JM): Votre radar ne fonctionne plus. Vous n'êtes toutefois pas aveuglé." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Angle Large (-WA): Une lentille grand angle vient déformer votre vision." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag est un jeu de combat de tanks multi-joueurs en réseau. Il y a cinq équipes:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "rouge, vert, bleu, mauve, et rogues (les tanks rogue sont noirs). Détruire un" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "joueur d'une autre équipe compte pour un points, tandis que se faire détruire ou détruire un" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "coéquipier fait perdre un point. Les scores individuels et les scores d'équipes correspondent." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Les rogues n'ont pas de coéquipiers (même pas les autres rogues), donc il ne peuvent pas détruire" msgid "teammates and they don't have a team score." msgstr "leurs coéquipiers, et non pas de score d'équipe." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "Il y a deux styles de jeu, déterminés par la configuration du serveur: capture-" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "du-drapeau et match-à-mort. Dans le match-à-mort le but est simplement d'obtenir le" msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "meilleur score en détruisant les adversaires. Le but dans la capture-du-drapeau est de" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "capturer les drapeaux ennemis tout en les empêchant de capturer le vôtre. Dans ce" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "style de jeu, chaque équipe (mais pas les rogues) possède une base, et chaque équipe contenant au moins" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "un joueur possède un drapeau d'équipe de la couleur correspondante. Pour capturer un drapeau," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "prenez-le et ramenez-le dans votre base (vous devez être au sol" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "dans votre base pour valider la capture). Capturer un drapeau détruit tous les joueurs" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "de l'équipe et augmente le score de votre équipe; les joueurs réapparaîtront sur" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "leur base. Ramener son propre drapeau sur une base ennemie compte comme une capture contre" msgid "your team but not for the enemy team." msgstr "votre équipe, pas pour l'équipe ennemie." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "L'aire de combat possède un mur d'enceinte et plusieurs constructions." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Vous ne pouvez pas franchir le mur d'enceinte (vous ne pouvez pas non plus sauter ce mur)." msgid "You cannot normally drive or shoot through buildings." msgstr "Normalement, vous ne pouvez pas traverser, où tirer à travers les constructions." msgid "The server may be configured to include teleporters: large transparent" msgstr "Le serveur peut être configuré pour comprendre des téléporteurs: des grands portails" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "noirs transparents. Tout ce qui rentre d'un côté d'un téléporteur est instantanément" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "déplacer sur le côté d'un autre (ou du même) téléporteur. Le" msgid "teleport is reversible; reentering the same side of the destination" msgstr "téléporteur est réversible; rentrer du même côté du téléporteur de" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "destination vous ramène au premier. Les connexions entre téléporteurs" msgid "are fixed at the start of the game and don't change during the game." msgstr "sont déterminées au début du jeu, et ne change pas pendant toute la durée de celui-ci." msgid "The connections are always the same in the capture-the-flag style." msgstr "Les connexions sont toujours les mêmes dans le style de jeu capture-du-drapeau." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Chaque côté d'un téléporteur est indépendant de l'autre côté." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Il est possible pour un téléporteur de téléporteur de l'autre côté de" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "lui-même. Un tel type de téléporteur agit presque comme s'il n'était pas là." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Un téléporteur peut également téléporteur du même côté que lui-même. Il s'agit" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "d'un téléporteur inverseur. Tirer dans un téléporteur inverseur risque" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "d'être du suicide; tirer avec un laser est invariablement fatal." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Ils y a deux variétés de drapeaux: les drapeaux d'équipe et les super drapeaux. Les drapeaux d'équipe" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "ne sont utilisés que pour le style de jeu capture-du-drapeau. Le serveur peut également être" msgid "configured to supply super flags, which give your tank some advantage" msgstr "configuré pour fournir des super drapeaux, qui donnent à votre tank quelques avantages" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "ou inconvénients. Vous ne pouvez normalement pas prévoir quel drapeau vous allez ramasser," msgid "but good flags generally outnumber bad flags two to one." msgstr "mais il y a en général deux fois plus de bons drapeaux que de mauvais." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Les drapeaux d'équipe ne peuvent pas être placés dans de Mauvais Endroits. Les Mauvais Endroits sont: sur" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "une construction ou sur une base ennemis. Les drapeaux d'équipe jetés dans un Mauvais Endroit sont" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "déplacés vers une position plus sûre. Les drapeaux capturés sont replacés sur leur" msgid "team base. Super flags dropped above a building always disappear." msgstr "base d'origine. Les super drapeaux lâchés au-dessus d'une construction disparaissent." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "Un bon super drapeau restara sur l'aire de jeu jusqu'à 4 possessions. Après," msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "il disparaîtra et sera éventuellement remplacé par un nouveau drapeau" msgid "flag. Bad random super flags disappear after the first possession." msgstr "aléatoire. Les mauvais super drapeaux disparaîssent après la première possession." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Les mauvais super drapeaux ne peuvent normalement pas être jetés. Le serveur peut être configurer" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "pour les jeter automatiquement après un certain temps, après que vous avez détruit" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "un certain nombre d'ennemis, et/ou quand vous prenez un drapeau antidote." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Les drapeaux antidotes sont jaunes et n'apparaîssent que quand vous avez pris un mauvais drapeau." # Help 5 Strings msgid "Good Flags:" msgstr "Bons Drapeaux:" msgid "boosts top speed" msgstr "augmente la vitesse maximum" msgid "High Speed (V)" msgstr "Haute Vitesse (V)" msgid "boosts turn rate" msgstr "augmente la vitesse de rotation" msgid "Quick Turn (A)" msgstr "Vitesse Angulaire (A)" msgid "can drive through buildings" msgstr "peut traverser les murs" msgid "Oscillation Overthruster (OO)" msgstr "Accélérateur d'Oscillation (OO)" msgid "faster shots more often" msgstr "tirs plus rapide, plus fréquents" msgid "Rapid Fire (F)" msgstr "Tir Rapide (F)" msgid "very fast reload, very short range" msgstr "rechargement très rapide, portée très courte" msgid "Machine Gun (MG)" msgstr "Mitraillette (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "les tirs sont auto guidés (click droit pour verouiller)" msgid "Guided Missile (GM)" msgstr "Missile Guidé (GM)" msgid "infinite shot speed and range, long reload time" msgstr "vitesse des tirs infinie, long temps de rechargement" #msgid "Laser (L)" #msgstr "" msgid "shots ricochet" msgstr "les tirs ricochent" #msgid "Ricochet (R)" #msgstr "" msgid "shoots through buildings" msgstr "les tirs traversent les murs" msgid "Super Bullet (SB)" msgstr "Super Boulet (SB)" msgid "tank invisible on enemy radar" msgstr "tank invisible sur les radars enemis" msgid "Stealth (ST)" msgstr "Furtif (ST)" msgid "tank invisible out the window" msgstr "tank invisible" msgid "Cloaking (CL)" msgstr "Invisibilité (CL)" msgid "shots invisible on radar" msgstr "tirs invisibles sur les radars" msgid "Invisible Bullet (IB)" msgstr "Boulet Invisible" msgid "tank becomes smaller" msgstr "le tank est plus petit" msgid "Tiny (T)" msgstr "Petit (T)" msgid "tank becomes paper thin" msgstr "le tank est plat" msgid "Narrow (N)" msgstr "Plat (N)" msgid "getting hit just drops the flag" msgstr "se faire toucher éjecte le drapeau" msgid "Shield (SH)" msgstr "Bouclier (SH)" msgid "destroy tanks by touching them" msgstr "détruit les tanks en les touchant" msgid "Steamroller (SR)" msgstr "Rouleau Compresseur (SR)" msgid "expanding spherical shell of destruction" msgstr "projette une onde sphérique de destruction" msgid "Shock Wave (SW)" msgstr "Onde de Choc" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "téléportez-vous pour entrer dans/quitter la zone" msgid "Phantom Zone (PZ)" msgstr "Zone Fantôme (PZ)" msgid "destroys player and all player's teammates" msgstr "détruit le joueur et tous ses coéquipiers" #msgid "Genocide (G)" #msgstr "" msgid "allows tank to jump" msgstr "autorise le tank à sauter" msgid "Jumping (JP)" msgstr "Saut (JP)" msgid "shows type of nearest superflag" msgstr "montre le type du super drapeau le plus proche" msgid "Identify (ID)" msgstr "Identification (ID)" msgid "Bad Flags:" msgstr "Mauvais Drapeaux:" msgid "can't identify tanks" msgstr "ne peut pas identifier les tanks" msgid "Colorblindness (CB)" msgstr "Daltonisme" msgid "makes tank very large" msgstr "rend le tank très gros" msgid "Obesity (O)" msgstr "Obésité (O)" msgid "tank can't turn right" msgstr "le tank ne peut pas tourner à droite" msgid "Left Turn Only (<-)" msgstr "Direction bloquée à gauche (<-)" msgid "tank can't turn left" msgstr "le tank ne peut pas tourner à gauche" msgid "Right Turn Only (->)" msgstr "Direction bloquée à droite (->)" msgid "tank has lots of momentum" msgstr "le tank a beaucoup d'inertie" msgid "Momentum (M)" msgstr "Inertie (M)" msgid "can't see out the window" msgstr "vous êtes aveugle" msgid "Blindness (B)" msgstr "Aveuglement" msgid "can't see anything on radar" msgstr "votre radar est brouillé" msgid "Jamming (JM)" msgstr "Radar Brouillé (JM)" msgid "fish eye view out the window" msgstr "votre visuel a un grand angle de vision" msgid "Wide Angle (WA)" msgstr "Angle Large (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Le radar est sur la partie gauche du panneau de contrôle. Il montre une vue aérienne" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "du jeu. Les constructions et le mur d'enceinte sont montrés en bleu" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "clair. Les bases d'équipes sont surlignées dans la couleur de l'équipe. Les téléporteurs sont de courtes" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "lignes jaunes. Les tanks sont représentés par des points de la couleur de l'équipe, sauf les rogues qui" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "sont jaunes. La taille des points est une indication grossière de l'altitude" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "des tanks: les tanks les plus haut ont des points plus larges. Les drapeaux sont de petites croix. Les" #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "drapeaux d'équipe sont de la couleur de l'équipe, les super drapeaux sont blanc, et le drapeau antidote" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "est jaune. Les tirs sont de petits points (ou des lignes ou des cercles, pour les lasers et" #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "les ondes de choc, respectivement). Votre tank est toujours au centre, et votre canon" #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "est toujours pointé vers le haut du radar. Le V jaune est votre champ de vision. Le Nord" msgid "is indicated by the letter N." msgstr "est indiqué par la lettre N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "L'affichage tête haute (ATH) comporte plusieurs éléments. Les deux carrés au centre" msgid "center of the view are the motion control boxes; within the small box" msgstr "de la vue sont les carrés de contrôle du mouvement; à l'intérieur du petit carré" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "votre tank sera immobile, en dehors du grand carré vous ne vous déplacez pas plus vite qu'au" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "bord du grand carré. Bouger la souris au-dessus ou au-dessous du petit" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "carré vous fait avancer ou reculer, respectivement. C'est la même gauche pour tourner à gauche ou à droite." msgid "The distance away from the small box determines the speed." msgstr "La distance par rapport au petit carré détermine la vitesse." # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Un ruban au-dessus du grand carré indique votre direction. Le 0 est le" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "Nord, 90 est l'Est, etc. Si les sauts sont autorisés ou si vous avec le drapeau saut," msgid "an altitude tape appears to the right of the larger box." msgstr "un ruban d'altitude apparaît à droite du grand carré." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "De petits losanges ou flèches colorés peuvent apparaître sur le ruban de direction. Une" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "flèche sur la gauche signifie qu'un certain drapeau est à votre gauche, une" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "flèche sur la droite indique que le drapeau est à votre droite, et un losange" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "indique la direction vers le drapeau par sa position sur le ruban de direction." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "En mode capture-du-drapeau un marqueur indique en permanence où se trouve votre drapeau d'équipe." msgid "A yellow marker shows the way to the antidote flag." msgstr "Un marqueur jaune indique la direction vers la drapeau antidote." msgid "At the top of the display are, from left to right, your callsign and" msgstr "En haut de la vue sont, de gauche à droite, votre pseudonyme et votre" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "score, votre statut, et le drapeau que vous possédez. Votre pseudonyme est de la" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "couleur de votre équipe. Votre statut est un de ceux-ci: prêt, mort, scellé, zoné" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "ou rechargement (le temps avant rechargenemt). Il peut aussi montrer le temps" # BZFS Messages #msgid "You are now an administrator!" #msgstr "" #msgid "Wrong Password!" #msgstr "" #msgid "unknown command" #msgstr "" #msgid "Countdown started." #msgstr "" #msgid "IP pattern added to banlist" #msgstr "" #msgid "malformed address" #msgstr "" #msgid "removed IP pattern" #msgstr "" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "restant avant qu'un mauvais drapeau soit jeté (s'il y a une limite de temps)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "D'autres informations peuvent ocasionnellement apparaître sur l'ATH." bzflag-2.4.2+ds1/data/l10n/bzflag_it.po000066400000000000000000001367321200563112200174370ustar00rootroot00000000000000# This is generic Italian # translator Silvio Romagnoli msgid "Join Game" msgstr "Gioca" msgid "it" msgstr "Italian" msgid "translator" msgstr "Silvio Romagnoli" msgid "Find Server" msgstr "Lista Servers" msgid "Connect" msgstr "Connetti" msgid "Callsign:" msgstr "Nominativo:" msgid "Team:" msgstr "Squadra:" #msgid "Server:" #msgstr "Server:" msgid "Port:" msgstr "Porta:" msgid "Start Server" msgstr "Attiva Server" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Usa i tasti freccia Su/Giu per spostarti, Esc per annullare" msgid "Options" msgstr "Opzioni" msgid "Help" msgstr "Aiuto" msgid "Quit" msgstr "Esci" msgid "on" msgstr "si" #msgid "Dithering:" #msgstr "Dithering:" msgid "off" msgstr "no" msgid "Off" msgstr "No" msgid "On" msgstr "Si" #msgid "Blending:" #msgstr "Blending:" #msgid "Smoothing:" #msgstr "Smoothing:" msgid "Lighting:" msgstr "Luci:" #msgid "Texturing:" #msgstr "Texturing:" #msgid "Nearest" #msgstr "Nearest" #msgid "Linear" #msgstr "Linear" #msgid "Nearest Mipmap Nearest" #msgstr "Nearest Mipmap Nearest" #msgid "Linear Mipmap Nearest" #msgstr "Linear Mipmap Nearest" #msgid "Nearest Mipmap Linear" #msgstr "Nearest Mipmap Linear" #msgid "Linear Mipmap Linear" #msgstr "Linear Mipmap Linear" msgid "Quality:" msgstr "Qualita':" msgid "Low" msgstr "Bassa" msgid "Medium" msgstr "Media" msgid "High" msgstr "Alta" msgid "Shadows:" msgstr "Ombreggiature:" msgid "Depth Buffer:" msgstr "Buffer di profondita':" msgid "Not available" msgstr "Non Disponibile" msgid "Change Video Format" msgstr "Cambia Impostazioni video" msgid "Brightness:" msgstr "Luminosita':" msgid "Sound Volume:" msgstr "Volume Audio:" msgid "Off / Backup Mode" msgstr "No / Solo Backup" msgid "5 Minutes" msgstr "5 Minuti" msgid "15 Minutes" msgstr "15 Minuti" msgid "30 Minutes" msgstr "30 Minuti" msgid "1 Hour" msgstr "1 Ora" msgid "5 Hours" msgstr "5 Ore" msgid "15 Hours" msgstr "15 Ore" msgid "1 day" msgstr "1 giorno" msgid "15 days" msgstr "15 giorni" msgid "30 days" msgstr "30 giorni" msgid "UDP network connection:" msgstr "Attiva UDP" msgid "Server List Cache:" msgstr "Server Memorizzati" msgid "Clear Server List Cache" msgstr "Cancella Server Memorizzati" msgid "Change Key Mapping" msgstr "Modifica Mappatura Tasti" msgid "GUI Options" msgstr "Opzioni GUI" msgid "Enhanced radar:" msgstr "Radar potenziato:" msgid "Controlpanel & Score FontSize:" msgstr "Dimensione Font Pannello Controllo & Punteggi:" msgid "normal" msgstr "normale" msgid "bigger" msgstr "grande" msgid "Radar & Panel Opacity:" msgstr "Opacita' Radar e Pannello:" msgid "Colored shots on radar:" msgstr "Colora colpi sul radar:" msgid "Radar Shot Length:" msgstr "Lunghezza colpi sul radar:" msgid "Radar & Panel Size:" msgstr "Grandezza Radar e Pannello" msgid "Mouse Box Size:" msgstr "Grandezza Mirino del Mouse" msgid "Control panel coloring:" msgstr "Colori nel pannello" msgid "Underline color:" msgstr "Sottolineature" msgid "Killer Highlight:" msgstr "Killer in Risalto:" msgid "Page Down for next page" msgstr "Pag Giu' per la pagina successiva" msgid "Page Up for previous page" msgstr "Pag Su per la pagina precedente" msgid "Rogue" msgstr "Ribelle" msgid "Red Team" msgstr "Squadra Rossa" msgid "Green Team" msgstr "Squadra Verde" msgid "Blue Team" msgstr "Squadra Blu" msgid "Purple Team" msgstr "Squadra Porpora" msgid "Enter to quit, Esc to resume" msgstr "Enter per uscire, Esc per annullare" msgid "Really quit?" msgstr "Vuoi veramente uscire?" msgid "Video Format" msgstr "Formati Video" msgid "Current Format:" msgstr "Formato Attuale:" msgid "Key Mapping" msgstr "Mappatura Tasti" msgid "Reset Defaults" msgstr "Reimposta Predefiniti" msgid "Fire shot:" msgstr "Sparo:" msgid "Drop flag:" msgstr "Rilascia Bandierina:" msgid "Identify/Lock On:" msgstr "Identifica/Lock Su:" msgid "Radar Short:" msgstr "Radar a Corto Raggio:" msgid "Radar Medium:" msgstr "Radar a Medio Raggio:" msgid "Radar Long:" msgstr "Radar a Lungo Raggio:" msgid "Send to All:" msgstr "Invia a Tutti:" msgid "Send to Teammates:" msgstr "Invia alla tua squadra:" msgid "Send to Nemesis:" msgstr "Invia ad avversario:" msgid "Send to Recipient:" msgstr "Invia a Destinatario" msgid "Jump:" msgstr "Salto:" msgid "Binoculars:" msgstr "Binocolo:" msgid "Toggle Score:" msgstr "Visualizzazione Punteggi" msgid "Tank Labels:" msgstr "Nomi Tanks:" msgid "Flag Help:" msgstr "Aiuto Bandierine:" msgid "Time Forward:" msgstr "Avanzamento Temporale:" msgid "Time Backward:" msgstr "Arretramento Temporale:" msgid "Pause/Resume:" msgstr "Pausa/Riprendi:" msgid "Self Destruct/Cancel:" msgstr "Auto Distruzione" msgid "SelfDestruct/Cancel:" msgstr "Autodistruzione:" msgid "Fast Quit:" msgstr "Uscita Veloce:" msgid "Scroll Backward:" msgstr "Scorri indietro:" msgid "Scroll Forward:" msgstr "Scorri avanti" msgid "Slow Keyboard Motion:" msgstr "Rallenta Movimenti da Tastiera" msgid "loading {1}" msgstr "caricamento {1}" msgid "controls tank motion" msgstr "controlla il movimento del tank" msgid "Mouse Position:" msgstr "Posizione Mouse:" msgid "fires shot" msgstr "spara colpo" msgid "drops flag (if not bad)" msgstr "rilascia bandierina (se non cattiva)" msgid "identifies player (locks on GM)" msgstr "identifica giocatore (esegue lock se si possiede GM)" msgid "jump (if allowed)" msgstr "salta (se consentito)" msgid "short radar range" msgstr "radar a corto raggio" msgid "medium radar range" msgstr "radar a medio raggio" msgid "long radar range" msgstr "radar a lungo raggio" msgid "toggle binoculars" msgstr "dis/attiva binocolo" msgid "toggle heads-up flag help" msgstr "dis/attiva aiuto bandierine" msgid "send message to teammates" msgstr "invia msg alla tua squadra" msgid "send message to everybody" msgstr "invia msg a tutti" msgid "send message to nemesis" msgstr "invia msg ad avversario" msgid "send message to recipient" msgstr "invia msg a destinatario" msgid "toggle score sheet" msgstr "dis/attiva visualizzazione punteggi" msgid "toggle tank labels" msgstr "dis/attiva visualizzazione nomi tanks" msgid "set time of day backward" msgstr "arretra tempo" msgid "set time of day forward" msgstr "avanza tempo" msgid "pause/resume" msgstr "pausa/riprendi" msgid "self Destruct/Cancel" msgstr "attiva/annulla autodistruzione" msgid "quit" msgstr "esci" msgid "scroll message log backward" msgstr "scorri log messaggi all'indietro" msgid "scroll message log forward" msgstr "scorri log messaggi in avanti" msgid "Slow Keyboard Motion" msgstr "Rallenta movimenti da tastiera" msgid "Toggle Radar Flags" msgstr "Dis/Attiva Bandiere nel Radar" msgid "Toggle Main Flags" msgstr "Dis/Attiva Bandiere" msgid "Silence/UnSilence" msgstr "Azzittisci" msgid "Server Admin" msgstr "Amministratore Server" msgid "Hunt" msgstr "Preda" msgid "autopilot enabled" msgstr "autopilota abilitato" msgid "autopilot disabled" msgstr "autopilato disablilitato" msgid "show/dismiss menu" msgstr "mostra/nascondi il menu" #msgid "Esc:" #msgstr "Esc:" msgid "Maintainer:" msgstr "Manutentore:" msgid "Original Author:" msgstr "Autore Originale:" msgid "Code Contributors:" msgstr "Hanno contribuito al codice:" msgid "Tank Models:" msgstr "Modelli dei Tanks:" msgid "Special Thanks:" msgstr "Ringraziamenti particolari:" msgid "Send:" msgstr "Invia:" #msgid "Servers" #msgstr "Servers" msgid "Players" msgstr "Giocatori" msgid "Red" msgstr "Rosso" msgid "Green" msgstr "Verde" msgid "Blue" msgstr "Blu" msgid "Purple" msgstr "Porpora" msgid "Controls" msgstr "Controlli" msgid "General" msgstr "Generale" msgid "Environment" msgstr "Ambiente" msgid "Flags I" msgstr "Bandierine I" msgid "Flags II" msgstr "Bandierine II" msgid "Flags III" msgstr "Bandierine III" msgid "Readouts I" msgstr "Informazioni I" msgid "Readouts II" msgstr "Informazioni II" msgid "Credits" msgstr "Crediti" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Premere Invio per selezionare un formato e T per provarlo. Esc per annullare." msgid "Free-style" msgstr "Stile libero" msgid "Capture-the-Flag" msgstr "Ruba-bandiera" msgid "Rabbit Chase" msgstr "Caccia alla volpe" msgid "Super Flags" msgstr "Super-Bandierine" msgid "Antidote Flags" msgstr "Bandierine-Antidoto" msgid "Trying..." msgstr "Attendere..." msgid "Press %s to start" msgstr "Premere %s per iniziare" msgid "Dead" msgstr "Distrutto" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "Pronto" msgid "Reloaded in %.1f" msgstr "Ricarica in %.1f" msgid "Sealed" msgstr "Sigillato" msgid "Zoned" msgstr "Zona Fantasma" msgid "You are now the rabbit." msgstr "Sei la preda" msgid "Servers found: {1}" msgstr "Server trovati: {1}" msgid "{1} Shot" msgstr "{1} Colpo" msgid "{1} Shots" msgstr "{1} Colpi" msgid "{1} sec To Drop Bad Flag" msgstr "{1} sec: Getti la Bandiera" msgid "{1} secs To Drop Bad Flag" msgstr "{1} sec: Getti la Bandiera" msgid "{1} Win Drops Bad Flag" msgstr "{1} Vincita: Getti la Bandiera" msgid "{1} Wins Drops Bad Flag" msgstr "{1} Vincite: Gettano la Bandiera" msgid "Time limit: {1}" msgstr "Limite di tempo: {1}" msgid "Max team score: {1}" msgstr "Max punteggio di squadra: {1}" msgid "Max player score: {1}" msgstr "Max punteggio per giocatore: {1}" msgid "Page {1} of {2}" msgstr "Pag {1} di {2}" #msgid "openBroadcast: No udp service {1}" #msgstr "" msgid "joystick '{1}' not supported..." msgstr "joystick '{1}' non supportato..." msgid "Server did send endpoint information, UDP connection up" msgstr "Il server ha attivato la connessione UDP" #msgid "Ignoring Finder argument '{1}'" #msgstr "" msgid "Can't open list server: {1}" msgstr "Non posso raggiungere il list-server: {1}" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" msgid "Communication error joining game [Wrong Code {1}]." msgstr "Errore di comunicazione all'attivazione [Code {1}]." #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" msgid "Configuration file: Error on line {1}: Stream failure" msgstr "File di configurazione: Errore a linea {1}: Stream failure" msgid "Configuration file: Error on line {1}: Line too long" msgstr "File di configurazione: Errore a linea {1}: Linea troppo lunga" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "msgid " #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" msgid "cannot load texture: {1}" msgstr "non posso caricare la texture: {1}" msgid "Connection failed." msgstr "Connessione fallita." msgid "Server forced a disconnect" msgstr "Server forza la disconnesione" msgid "Rogues not allowed. Try another team." msgstr "Ribelli non ammessi. Prova un altro team." msgid "This team is full. Try another team." msgstr "Questa squadra e' piena. Provane un'altra." msgid "This game is full. Try again later." msgstr "Questo gioco e' pieno. Prova piu' tardi." msgid "Game is full or over. Try again later." msgstr "Questo gioco e' pieno o finito. Prova piu' tardi." msgid "Error connecting to server." msgstr "Errore di connessione al server." msgid "Error downloading world database" msgstr "Errore scaricando la mappa" msgid "Score" msgstr "Punteggio" msgid "Kills" msgstr "Uccisioni" msgid "Team Score" msgstr "Punti per squadra" #msgid "Locale:" #msgstr "" msgid "Player" msgstr "Giocatore" # Super Flags msgid "High Speed" msgstr "Alta velocita" msgid "Quick Turn" msgstr "Virata rapida" msgid "Oscillation Overthruster" msgstr "Iper Oscillazione" msgid "Rapid Fire" msgstr "Fuoco Rapido" msgid "Machine Gun" msgstr "Mitragliatrice" msgid "Guided Missile" msgstr "Missile Guidato" msgid "Laser" msgstr "Raggio Laser" msgid "Ricochet" msgstr "Rimbalzo" msgid "Super Bullet" msgstr "Super Proiettile" msgid "Invisible Bullet" msgstr "Proiettile Invisibile" msgid "Stealth" msgstr "Invisibilita Radar" msgid "Tiny" msgstr "Piccolo" msgid "Narrow" msgstr "Stretto" msgid "Shield" msgstr "Scudo" msgid "Steamroller" msgstr "Rullo Compressore" msgid "Shock Wave" msgstr "Onda dUrto" msgid "Phantom Zone" msgstr "Zona Fantasma" msgid "Genocide" msgstr "Genocidio" msgid "Jumping" msgstr "Salto" msgid "Identify" msgstr "Identifica" msgid "Cloaking" msgstr "Invisibilita'" msgid "Colorblindness" msgstr "Daltonismo" msgid "Obesity" msgstr "Obesita'" msgid "Left Turn Only" msgstr "Gira Solo A Sinistra" msgid "Right Turn Only" msgstr "Gira Solo A Destra" msgid "Momentum" msgstr "Inerzia" msgid "Blindness" msgstr "Cecita'" msgid "Jamming" msgstr "Disturbi Radar" msgid "Wide Angle" msgstr "Grandangolo" # Flag help msgid "You have no flag." msgstr "Non hai una bandierina" msgid "Your team's flag: prevent other teams from capturing it!" msgstr "La badierina della tua squadra: impedisci alle altre squadre di catturarla!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "La bandierina della squadra avversaria: per catturarla portala nella tua base!" msgid "Velocity (V): Tank moves faster. Outrun bad guys." msgstr "Velocita' (V): Il tank si muove velocemente. Sorpassi i cattivi." msgid "Useless" msgstr "senza Utilitita'" msgid "Thief" msgstr "Ladro" msgid "Masquerade" msgstr "Maschera" msgid "Seer" msgstr "Vede tutto" msgid "Burrow" msgstr "Nel terreno" msgid "Angular velocity (A): Tank turns faster. Dodge quicker." msgstr "Velocita' angolare (A): Il tank gira velocemente: si scansa in fretta." msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" msgstr "Team flag: Se e' tua, previeni le altre squadre dal catturarla. Se non lo e', portala alla tua base per catturala!" msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Iper Oscillazione (OO): Puoi guidare attraverso gli edifici. Non puoi ne tornare indietro, ne sparare menter sei dentro." msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." msgstr "Fuoco veloce (F): I colpi vanno piu' veloci, ma non cosi' lontano." msgid "Machine Gun (MG): Very fast reload and very short range." msgstr "Mitragliatrice (MG): Si ricarica molto velocemente, ma ha un raggio cortissimo." msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Missile Guidato (GM): Il colpo segue il bersaglio, che scegli con il pulsante destro. Puoi agganciarlo anche dopo aver sparato." msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (L): Spara un laser. Velocita' e distanza infinita ma si ricarica con lentezza." msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" msgstr "Rimbalzo (R): I colpi rimbalzano sui muri. Non colpirti!" msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." msgstr "SuperProiettile (SB): Spara attraverso gli edifici. Pu' uccidere la Zona Fantasma." msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Colpi Invisibili (IB): I tuoi colpi non appaiono sugli altri radar, ma si possono vedere fuori la finestra." msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "STealth (ST): Il tank e' invisibile al radar. I colpi sono ancora visibili." msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." msgstr "Piccolo (T): Il tank e' piccolo e puo passare attraverso piccole aperture. Molto difficile da colpire." msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Sottile (N): Il tank e' sottilissimo. Molto difficile da colpire di fronte mu ha una grandezza normale di lato. Passa attraverso piccole aperture" msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Scudo (SH): Se sei colpito non muori ma lasci la bandiera. La bandiera rimane in aria a lungo." msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." msgstr "Rullo Compressore (SR): Distrugge i tank che tocchi." msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Onda d'urto (SW): Distrugge i tank vicini. Non uccidere i compagni! Uccide anche i tanks negli edifici." msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Zona Fantasma (PZ): Il teletrasporto attiva l'effetto Zona. I tank nella Zona fantasma possono guidare atraverso gli edifici, non possono sparare, ne possono essere colpiti (eccetto da SB e SW)." msgid "Genocide (G): Killing one tank kills that tank's whole team." msgstr "Genocidio (G): Se uccidi un tank, uccidi la sua intera squadra." msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Salto (JP): Il tank puo' saltare. Usa Tab. Non puoi girare in aria." msgid "IDentify (ID): Identifies type of nearest flag." msgstr "IDentifica (ID): Identifica il tipo della bandiera piu' vicina." msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Invisibile (CL): Il tuo tank diventa invisibile, dalla finestra. Si vede sul radar." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "velocita' Angolare (+A): Il tank gira velocemente. Si scansa in fretta." msgid "Velocity (+V): Tank moves faster. Outrun bad guys." msgstr "Velocita' (+V): Il tank si muove con maggiore velocita'." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "Velocita angolare (+A): Il tank gira ed evita i colpi piu velocemente." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Iperoscillazione (+OO): Puoi passare attraverso gli edifici ma non arretrare o sparare da dentro." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Fuoco Rapido (+F): Spari piu rapidi. I colpi vanno piu veloci ma hanno breve gittata." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Machine Gun (Mitragliatrice) (+MG): Ricarica molto veloce e gittata molto corta." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Missile Guidato (+GM): I colpi seguono l'obiettivo. Fai il lock con il tasto destro. Puoi fare il lock o cambiare obiettivo anche dopo aver sparato." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Raggio Laser (+L): Spara un raggio Laser. Ha velocita infinita ma lunghi tempi di ricarica." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Rimbalzo (+R): Gli spari rimbalzano sui muri. Cerca di non spararti addosso!" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super Proiettile (+SB): Gli spari passano attraversi gli edifici. Puo' distruggere i tanks nella Zona Fantasma." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Proiettile Invisibile (+IB): I tuoi colpi non compaiono sugli altri radar. Puoi comunque vederli ad occhio nudo." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "STealth (+ST): Il tank e' invisibile sul radar. I colpi sono comunque visibili." msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Stealth (+ST): Il tank e' invisibile sul radar. I colpi sono comunque visibili" msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Piccolo (+T): Il tank rimpicciolisce e passa attraverso piccole aperture. Molto difficile da colpire." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Stretto (+N): Il tank diviene supersottile. Molto difficile colpirlo di fronte, ma ha dimensioni normali visto di lato. Puo' passare attraverso piccole aperture." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Scudo (+SH): Se si viene colpiti si perde semplicemente la bandierina. Una volta persa resta in aria piu' a lungo delle altre bandierine." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Rullo Compressore (+SR): Si distruggono i tank con i quali si viene a contatto, ma ci si deve avvicinare moltissimo." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Onda dUrto (+SW): Lo sparo distrugge tutti i tanks vicini, compresi quelli sopra o dentro gli edifici. Non colpire i tuoi compagni!" msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Zona Fantasma (+PZ): Passando in un teletrasporto si entra nella ZF, dalla quale non si puo' colpire o essere colpiti (fatta eccezione per Super Bullet e shock Wave)." msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Genocidio (+G): Distruggendo un tank si distruggono automaticamente tutti quelli della stessa squadra." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Salto (+JP): Il tank puo saltare. Usa il tasto Tab. Mentre si e' in aria non e possibile cambiare direzione." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "Identificazione (+ID): Identifica il tipo della bandierina piu' vicina." msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Invisibilita (+CL): Il tank diventa invisibile ad occhio nudo, ma puo' essere ancora visto sul radar" msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Daltonismo (-CB): Non riesci piu' a distinguere i colori delle squadre. Attenzione a non colpire i tuoi compagni!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Obesita (-O): Il tank diviene molto largo. Non si riesce piu' a passare attraverso i teletrasporti." msgid "left turn only (- <-): Can't turn right." msgstr "Gira solo a sinistra (- <-): Impossibile girare a destra." msgid "right turn only (- ->): Can't turn left." msgstr "Gira solo a destra (- ->): Impossibile girare a sinistra." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Inerzia (-M): Il tank acquisisce inerzia e l'accelerazione e' limitata." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Cecita (-B): Non riesci a vedere ad occhio nudo. Il radar tuttavia continua a funzionare." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Disturbi Radar (-JM): Il radar non funziona. E' ancora possibile vedere ad occhio nudo." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Grandangolo (-WA): La visuale e' distorta come se si guardasse attraverso una lente." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag e' un gioco in rete multigiocatore che simula battaglie fra tanks (carri armati)." msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "Ci sono cinque squadre: Rossa, Verde, Blu, Porpora e infine Ribelli: cani sciolti senza squadra" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "che appaiono di color nero. Il punteggio aumenta se si distrugge un tank di altre squadre e" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "diminuisce se si viene distrutti o si distrugge un proprio compagno. Il punteggio totale della" msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "squadra coincide con il totale dei propri membri. I Ribelli non hanno squadra, pertanto non" msgid "teammates and they don't have a team score." msgstr "possono distruggere compagni e non hanno un punteggio di squadra." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "Esistono due stili di gioco, a seconda della configurazione del server: CTF (capture-the-flag," msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "ruba bandiera) e FFA (free-for-all, stile libero). Nel gioco FFA il tuo scopo e' semplicemente" msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "raggiungere il punteggio piu' alto distruggendo gli avversari. Nel gioco CTF devi invece" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "catturare la bandierina nemica ed impedire agli avversari di catturare quella della tua squadra." msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "In questo stile ogni squadra, ribelli a parte, ha una base e ogni squadra con almeno un giocatore" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "ha una bandierina del proprio colore. Per catturare una bandierina devi prenderla e portarla" msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "nella tua base (per registrare la cattura si deve toccare il suolo all interno della base)." msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "La cattura di una bandierina determina la distruzione di tutti i giocatori di quella squadra" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "e aggiunge un bonus al punteggio della tua squadra; i giocatori riprenderanno il gioco dalla." msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "loro base. Se per errore porti la bandierina della tua squadra in una base nemica questa" msgid "your team but not for the enemy team." msgstr "sara' contata come una cattura contro la tua squadra, ma non a favore di quella nemica." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Il mondo nel quale si svolge il gioco contiene un muro di cinta e diversi edifici. Non puoi" msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "superare, ne' saltare, il muro di cinta. Normalmente non si puo' passare attraverso gli edifici." msgid "You cannot normally drive or shoot through buildings." msgstr "Il server potrebbe essere configurato in modo da includere teletrasporti: larghe lastre nere" msgid "The server may be configured to include teleporters: large transparent" msgstr "semitrasparenti. Un oggetto che entri da un lato di un teletrasporto sara' istantaneamente" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "trasportato verso un lato di un altro (o anche dello stesso) teletrasporto. La direzione e'" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "reversibile: entrando dal lato da cui si e usciti si uscira' da quello dal quale si e' entrati." msgid "teleport is reversible; reentering the same side of the destination" msgstr "Le corrispondenze entrata-uscita dei teletrasporti sono stabilite all inizio, non cambiano" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "durante il gioco e sono sempre le stesse nello stile CTF. Ogni lato di un teletrasporto e'" msgid "are fixed at the start of the game and don't change during the game." msgstr "indipendente da quello opposto. E' possibile che un teletrasporto conduca al proprio lato" msgid "The connections are always the same in the capture-the-flag style." msgstr "opposto; un teletrasporto simile agisce quasi come se non esistesse. Un teletrasporto puo'" msgid "Each side of a teleporter teleports independently of the other side." msgstr "anche condurre allo stesso lato dal quale si e entrati. Sparando a un teletrasporto simile" msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "si causa spesso l'autodistruzione, che diviene certa se si usa un laser." msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "" msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "" # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Le bandierine possono essere di due tipi: bandierine di squadra (BS) e super bandierine" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "(SB). Le BS sono usate solo nello stile CTF. Il server puo' essere configurato in modo" msgid "configured to supply super flags, which give your tank some advantage" msgstr "da includere nel gioco anche le SB, che potranno dare al tuo tank un vantaggio o uno" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "svantaggio. Normalmente non potrai conoscere il tipo della bandierina prima di averla" msgid "but good flags generally outnumber bad flags two to one." msgstr "raccolta, ma generalmente le bandierine buone superano quelle cattive di un fattore 2:1." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Esistono posizioni cattive (su un edificio o nella base nemica) nelle quali non sono" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "ammesse le BS Se una BS viene rilasciata in un posto cattivo, essa viene spostata in una" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "posizione piu' sicura. Le BS catturate sono riportate nella base della propria squadra." msgid "team base. Super flags dropped above a building always disappear." msgstr "Le SB rilasciate su un edificio scompaiono sempre. Una SB casuale buona potra' essere" msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "raccolta e rilasciata fino a 4 volte, dopodiche scomparira' per essere sostituita da una" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "nuova bandierina scelta a caso. Le SB casuali cattive scompaiono dopo il primo possesso." msgid "flag. Bad random super flags disappear after the first possession." msgstr "Le bandierine cattive normalmente non possono essere gettate via. Il server puo' essere " msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "configurato in modo da rilasciare la tua bandierina dopo un certo periodo di tempo," msgid "automatically drop the flag for you after some time, after you destroy" msgstr "dopo la distruzione di un certo numero di nemici e/o se raccogli una bandierina antidoto." msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "Le bandierine antidoto sono di colore giallo e appaiono solo se sei in possesso di una" msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "bandierina cattiva." # Help 5 Strings msgid "Good Flags:" msgstr "Bandierine buone" msgid "boosts top speed" msgstr "aumenta la velocita' massima" msgid "High Speed (V)" msgstr "Alta velocita' (V)" msgid "boosts turn rate" msgstr "aumenta la velocita' di virata" msgid "Quick Turn (A)" msgstr "Virata rapida (A)" msgid "can drive through buildings" msgstr "puoi passare attraversi gli edifici" msgid "Oscillation Overthruster (OO)" msgstr "IperOscillazione (OO)" msgid "faster shots more often" msgstr "colpi piu' veloci e ricariche piu rapide" msgid "Rapid Fire (F)" msgstr "Tiro rapido (F)" msgid "very fast reload, very short range" msgstr "ricarica molto veloce, gittata molto breve" msgid "Machine Gun (MG)" msgstr "Mitragliatrice (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "i colpi si dirigono da soli sull'obiettivo (fare il lock con il tasto destro)" msgid "Guided Missile (GM)" msgstr "Missile Guidato (GM)" msgid "infinite shot speed and range, long reload time" msgstr "Velocita' di tiro e gittata infinita, lunghi tempi di ricarica" msgid "Laser (L)" msgstr "Laser (L)" msgid "shots ricochet" msgstr "i colpi rimbalzano" msgid "Ricochet (R)" msgstr "Rimbalzo (R)" msgid "shoots through buildings" msgstr "spari attraverso gli edifici" msgid "Super Bullet (SB)" msgstr "Super Proiettile (SB)" msgid "tank invisible on enemy radar" msgstr "il tank diviene invisibile sui radar nemici" msgid "Stealth (ST)" msgstr "Stealth (ST)" msgid "tank invisible out the window" msgstr "il tank diviene invisibile ad occhio nudo" msgid "Cloaking (CL)" msgstr "Invisibilita' (CL)" msgid "shots invisible on radar" msgstr "gli spari divengono invisibili sul radar" msgid "Invisible Bullet (IB)" msgstr "Proiettile Invisibile (IB)" msgid "tank becomes smaller" msgstr "il tank rimpicciolisce" msgid "Tiny (T)" msgstr "Piccolo (T)" msgid "tank becomes paper thin" msgstr "il tank diviene sottilissimo" msgid "Narrow (N)" msgstr "Sottile (N)" msgid "getting hit just drops the flag" msgstr "se si e' colpiti si perde solo la bandierina" msgid "Shield (SH)" msgstr "Scudo (SH)" msgid "destroy tanks by touching them" msgstr "si distruggono i tanks semplicemente toccandoli" msgid "Steamroller (SR)" msgstr "Rullo Compressore (SR)" msgid "expanding spherical shell of destruction" msgstr "crea ed espande un'onda distruttiva" msgid "Shock Wave (SW)" msgstr "Onda d'Urto (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "usa il teletrasporto per entrare o lasciare la zona" msgid "Phantom Zone (PZ)" msgstr "Zona Fantasma (PZ)" msgid "destroys player and all player's teammates" msgstr "distrugge l'obiettivo e tutti quelli della stessa squadra " msgid "Genocide (G)" msgstr "Genocidio (G)" msgid "allows tank to jump" msgstr "permette al tank di saltare" msgid "Jumping (JP)" msgstr "Salto (JP)" msgid "shows type of nearest superflag" msgstr "rivela il tipo della super bandierina piu' vicina" msgid "Identify (ID)" msgstr "Identifica (ID)" msgid "Bad Flags:" msgstr "Bandierine cattive" msgid "can't identify tanks" msgstr "non puoi identificare i tanks" msgid "Colorblindness (CB)" msgstr "Daltonismo (CB)" msgid "makes tank very large" msgstr "rende il tank molto largo" msgid "Obesity (O)" msgstr "Obesita' (O)" msgid "tank can't turn right" msgstr "il tank non puo' girare a destra" msgid "Left Turn Only (<-)" msgstr "Gira solo a Sinistra (<-)" msgid "tank can't turn left" msgstr "il tank non puo' girare a sinistra" msgid "Right Turn Only (->)" msgstr "Gira solo a Destra (->)" msgid "tank has lots of momentum" msgstr "il tank ha una notevole inerzia" msgid "Momentum (M)" msgstr "Inerzia (M)" msgid "can't see out the window" msgstr "non si puo' vedere ad occhio nudo" msgid "Blindness (B)" msgstr "Cecita' (B)" msgid "can't see anything on radar" msgstr "non si puo' vedere nulla sul radar" msgid "Jamming (JM)" msgstr "Disturbi Radar (JM)" msgid "fish eye view out the window" msgstr "visuale ad occhio nudo distorta" msgid "Wide Angle (WA)" msgstr "Grandangolo (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Il radar e' posto sul lato sinistro del pannello di controllo e mostra una visuale a raggi" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "X e dall'alto del gioco. Edifici e muro di cinta sono mostrati in blu chiaro. Le basi delle" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "squadre sono incorniciate con lo stesso colore della squadra. I teletrasporti sono corte" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "linee gialle. I tanks sono punti dello stesso colore della propria squadra, fatta eccezione" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "per i Ribelli, che sono gialli. La larghezza del punto indica approssimativamente" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "l'altitudine del tank. A tank piu alto corrisponde un punto piu largo. Le bandierine sono" msgid "Toggle Radar Flags:" msgstr "Attiva Bandiere (Radar)" msgid "Toggle Main Flags:" msgstr "Attiva Bandiere" msgid "Silence/UnSilence Key:" msgstr "Azzittisci" msgid "Server Command Key:" msgstr "Comandi Server" msgid "self destruct/cancel" msgstr "auto distruzione" # Start serveru # Start server msgid "yes" msgstr "si" #msgid "no" #msgstr "" msgid "Style:" msgstr "Stile:" msgid "Free for All" msgstr "Libero per Tutti" msgid "Capture the Flag" msgstr "Ruba bandiera" msgid "Max Players:" msgstr "Max Giocatori:" msgid "Max Shots:" msgstr "Max Colpi:" msgid "Teleporters:" msgstr "Teletrasporto" msgid "Ricochet:" msgstr "Rimbalzo:" msgid "Jumping:" msgstr "Salti:" msgid "Superflags:" msgstr "Super Bandiere:" msgid "all flags" msgstr "ogni tipo di bandiera" msgid "good flags only" msgstr "solo bandiere buone" msgid "Max Superflags:" msgstr "Max Super bandiere:" msgid "Bad Flag Antidote:" msgstr "Antidoto" msgid "Bad Flag Time Limit:" msgstr "Tempo Limite per Bandiere Cattive:" msgid "no limit" msgstr "nessun mimite" msgid "15 seconds" msgstr "15 secondi" msgid "30 seconds" msgstr "30 secondi" msgid "60 seconds" msgstr "60 secondi" msgid "180 seconds" msgstr "180 secondi" msgid "Bad Flag Win Limit:" msgstr "Numero Vittorie per Bandiere Cattive" msgid "drop after 1 win" msgstr "getta dopo 1 vittoria" msgid "drop after 2 wins" msgstr "getta dopo 2 vittorie" msgid "drop after 3 wins" msgstr "getta dopo 3 vittorie" msgid "Server Visibility:" msgstr "Visibilita' Server:" msgid "local host only (ttl=0)" msgstr "solo host locale (ttl=0)" msgid "subnet only (ttl=1)" msgstr "solo sotto rete (ttl=1)" msgid "local area (ttl=8)" msgstr "area locale (ttl=8)" msgid "site (ttl=32)" msgstr "sito (ttl=32)" msgid "organization (ttl=64)" msgstr "organizzazione (ttl=64)" msgid "continent (ttl=128)" msgstr "continente (ttl=128)" msgid "world (ttl=255)" msgstr "mondo (ttl=255)" msgid "Game Over:" msgstr "Gioco Finito" msgid "never" msgstr "mai" msgid "after 5 minutes" msgstr "dopo 5 minuti" msgid "after 15 minutes" msgstr "dopo 15 minuti" msgid "after 60 minutes" msgstr "dopo 60 minuti" msgid "after 3 hours" msgstr "dopo 3 ore" msgid "when a player gets +3" msgstr "quando un giocatore ha +3" msgid "when a player gets +10" msgstr "quando un giocatore ha +10" msgid "when a player gets +25" msgstr "quando un giocatore ha +25" msgid "when a team gets +3" msgstr "quando una squadra ha +3" msgid "when a team gets +10" msgstr "quando una squadra ha +10" msgid "when a team gets +25" msgstr "quando uns squadra ha +25" msgid "when a team gets +100" msgstr "quando una squadra ha +100" #msgid "Server Reset:" #msgstr "" msgid "no, quit after game" msgstr "no, esci dopo il gioco" msgid "yes, reset for more games" msgstr "si, riparti per piu' giochi" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "piccole croci, le BS prendono il colore della squadra, le SB sono bianche e la bandierina" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "antidoto e' gialla. Gli spari sono piccoli punti (o linee e cerchi, rispettivamente per" msgid "cyan" msgstr "celeste" msgid "grey" msgstr "grigio" msgid "text" msgstr "testo" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "Laser e Onda d'Urto). il tuo tank e' sempre visto al centro, il davanti e' sempre in alto" msgid "None" msgstr "Nessuno" msgid "Pulsating" msgstr "Lampeggio" msgid "Underline" msgstr "Sottolineo" # Flags identification msgid "Closest Flag: High Speed" msgstr "Bandiera Vicina: Velocita'" msgid "Closest Flag: Quick Turn" msgstr "Bandiera Vicina: Velocita' Angolare" msgid "Closest Flag: Oscillation Overthurster" msgstr "Bandiera Vicina: IperOscillazione" msgid "Closest Flag: Rapid Fire" msgstr "Bandiera Vicina: Fuoco Rapido" msgid "Closest Flag: Machine Gun" msgstr "Bandiera Vicina: Mitragliatrice" msgid "Closest Flag: Guided Missile" msgstr "Bandiera Vicina: Missile Guidato" msgid "Closest Flag: Laser" msgstr "Bandiera Vicina: Laser" msgid "Closest Flag: Ricochet" msgstr "Bandiera Vicina: Rimbalzo" msgid "Closest Flag: Super Bullet" msgstr "Bandiera Vicina: Super Proiettile" msgid "Closest Flag: Stealth" msgstr "Bandiera Vicina: Stealth" msgid "Closest Flag: Cloaking" msgstr "Bandiera Vicina: Invisibile" msgid "Closest Flag: Invisible Bullet" msgstr "Bandiera Vicina: Colpi Invisibili" msgid "Closest Flag: Tiny" msgstr "Bandiera Vicina: Piccolo" msgid "Closest Flag: Narrow" msgstr "Bandiera Vicina: Stretto" msgid "Closest Flag: Shield" msgstr "Bandiera Vicina: Scudo" msgid "Closest Flag: Steamroller" msgstr "Bandiera Vicina: Rullo Compressore" msgid "Closest Flag: Shock Wave" msgstr "Bandiera Vicina: Onda d'Urto" msgid "Closest Flag: Phantom Zone" msgstr "Bandiera Vicina: Zona Fantasma" msgid "Closest Flag: Genocide" msgstr "Bandiera Vicina: Genocidio" msgid "Closest Flag: Jumping" msgstr "Bandiera Vicina: Salto" msgid "Closest Flag: Identify" msgstr "Bandiera Vicina: Identifica" msgid "Closest Flag: Colorblindness" msgstr "Bandiera Vicina: Daltonismo" msgid "Closest Flag: Obesity" msgstr "Bandiera Vicina: Obeso" msgid "Closest Flag: Left Turn Only" msgstr "Bandiera Vicina: Gira solo a Sinistra" msgid "Closest Flag: Right Turn Only" msgstr "Bandiera Vicina: Gira solo a Destra" msgid "Closest Flag: Momentum" msgstr "Bandiera Vicina: Momento" msgid "Closest Flag: Blindness" msgstr "Bandiera Vicina: Cecita'" msgid "Closest Flag: Jamming" msgstr "Bandiera Vicina: Disturbi" msgid "Closest Flag: Wide Angle" msgstr "Bandiera Vicina: Grandangolo" # Other msgid "Server started." msgstr "Server partito." msgid "Shot myself" msgstr "Mi sono colpito" # !!! Messages below cannot be translated :-( # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "sul radar. La V gialla e' il tuo campo visivo. Il Nord e' indicato dalla lettera N." msgid "is indicated by the letter N." msgstr "L HUD mostra diverse informazioni. I due riquadri al centro del campo visivo servono" msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "per il controllo del movimento; all'interno del riquadro piu piccolo il tank non puo'" msgid "center of the view are the motion control boxes; within the small box" msgstr "muoversi, al di fuori di esso la velocita' crescera' a mano a mano che ci si avvicina" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "al bordo del riquadro grande, superato il quale la velocita' non aumentera' piu." msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "La direzione si imposta muovendo il puntatore verso sinistra, destra, alto o basso." msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "La distanza dal riquadro piccolo determinera' la velocità." msgid "The distance away from the small box determines the speed." msgstr "" # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Al di sopra del riquadro grande una striscia mostra la tua attuale direzione, Nord a 0," msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "Est a 90, ecc. Se e' permesso saltare o hai la bandierina che lo consente, una striscia" msgid "an altitude tape appears to the right of the larger box." msgstr "per l'altitudine compare alla destra del riquadro grande. Piccoli diamanti colorati o" msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "frecce possono apparire sulla striscia della direzione. Una freccia rivolta verso sinistra" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "indica che una particolare bandierina si trova alla tua sinistra, una freccia rivolta" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "verso destra indica che la bandierina si trova alla tua destra, e un diamante ne indica la" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "direzione da prendere con la propria posizione sulla striscia." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "Nel gioco CTF un marcatore mostra sempre dove si trova la bandierina della tua squadra." msgid "A yellow marker shows the way to the antidote flag." msgstr "Un marcatore giallo mostra la direzione verso la bandierina antidoto." msgid "At the top of the display are, from left to right, your callsign and" msgstr "Nella parte alta del display si trovano, da sinistra a destra, il tuo nominativo e il tuo" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "punteggio, le tue condizioni e la bandiera che possiedi. Il tuo nominativo ha lo stesso" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "colore della tua squadra. Il tuo stato puo' variare fra: pronto, distrutto, sigillato, zona" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "fantasma e ricarica (che mostra anche il tempo necessario). Puo' anche mostrare il tempo" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "necessario per potersi liberare di una bandierina cattiva (se esiste un tempo limite)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Altri messaggi informativi potrebbero comparire occasionalmente sullo schermo HUD." # BZFS Messages msgid "You are now an administrator!" msgstr "Ora sei un amministratore!" msgid "Wrong Password!" msgstr "Password Errata" msgid "unknown command" msgstr "comando sconosciuto" msgid "Countdown started." msgstr "Conto alla rovescia partito." msgid "IP pattern added to banlist" msgstr "Pattern indirizzi IP aggiunto alla banlist" msgid "malformed address" msgstr "indirizzo male impostato" msgid "removed IP pattern" msgstr "Pattern indirizzi IP eliminato" bzflag-2.4.2+ds1/data/l10n/bzflag_kg.po000066400000000000000000000737721200563112200174300ustar00rootroot00000000000000# This is generic Klingon msgid "Join Game" msgstr "Quj muv" msgid "kg" msgstr "Klingon" #msgid "translator" #msgstr "" msgid "Find Server" msgstr "toy' De'wI' tu'" msgid "Connect" msgstr "rar" msgid "Callsign:" msgstr "pong:" msgid "Team:" msgstr "boq:" msgid "Server:" msgstr "toy' De'wI'" msgid "Port:" msgstr "jo:" msgid "Start Server" msgstr "toy' De'wI che'" #msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" #msgstr "" msgid "Options" msgstr "DuH" msgid "Help" msgstr "QaH" msgid "Quit" msgstr "bup" #msgid "on" #msgstr "" #msgid "Dithering:" #msgstr "" #msgid "off" #msgstr "" msgid "Off" msgstr "ghobe'" msgid "On" msgstr "HIja'" #msgid "Blending:" #msgstr "" #msgid "Smoothing:" #msgstr "" msgid "Lighting:" msgstr "vow'a':" #msgid "Texturing:" #msgstr "" #msgid "Nearest" #msgstr "" #msgid "Linear" #msgstr "" #msgid "Nearest Mipmap Nearest" #msgstr "" #msgid "Linear Mipmap Nearest" #msgstr "" #msgid "Nearest Mipmap Linear" #msgstr "" #msgid "Linear Mipmap Linear" #msgstr "" #msgid "Quality:" #msgstr "" #msgid "Low" #msgstr "" #msgid "Medium" #msgstr "" msgid "High" msgstr "jen" msgid "Shadows:" msgstr "QIbmey:" #msgid "Depth Buffer:" #msgstr "" #msgid "Not available" #msgstr "" #msgid "Change Video Format" #msgstr "" #msgid "Brightness:" #msgstr "" #msgid "Sound Volume:" #msgstr "" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "" #msgid "15 Minutes" #msgstr "" #msgid "30 Minutes" #msgstr "" #msgid "1 Hour" #msgstr "" #msgid "5 Hours" #msgstr "" #msgid "15 Hours" #msgstr "" #msgid "1 day" #msgstr "" #msgid "15 days" #msgstr "" #msgid "30 days" #msgstr "" #msgid "UDP network connection:" #msgstr "" #msgid "Server List Cache:" #msgstr "" #msgid "Clear Server List Cache" #msgstr "" #msgid "Change Key Mapping" #msgstr "" msgid "GUI Options" msgstr "GUI DuH" #msgid "Enhanced radar:" #msgstr "" #msgid "Controlpanel & Score FontSize:" #msgstr "" #msgid "normal" #msgstr "" msgid "bigger" msgstr "tIn" #msgid "Radar & Panel Opacity:" #msgstr "" #msgid "Colored shots on radar:" #msgstr "" #msgid "Radar Shot Length:" #msgstr "" #msgid "Radar & Panel Size:" #msgstr "" #msgid "Mouse Box Size:" #msgstr "" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" #msgid "Page Down for next page" #msgstr "" #msgid "Page Up for previous page" #msgstr "" #msgid "Rogue" #msgstr "lotlhwI'" msgid "Red Team" msgstr "wa'DIch boq" msgid "Green Team" msgstr "cha'DIch boq" msgid "Blue Team" msgstr "wejDIch boq" msgid "Purple Team" msgstr "loSDIch boq" #msgid "Enter to quit, Esc to resume" #msgstr "" msgid "Really quit?" msgstr "bupqang?" #msgid "Video Format" #msgstr "" #msgid "Current Format:" #msgstr "" #msgid "Key Mapping" #msgstr "" #msgid "Reset Defaults" #msgstr "" msgid "Fire shot:" msgstr "bach:" msgid "Drop flag:" msgstr "joqwI' changh:" #msgid "Identify/Lock On:" #msgstr "" #msgid "Radar Short:" #msgstr "" #msgid "Radar Medium:" #msgstr "" #msgid "Radar Long:" #msgstr "" msgid "Send to All:" msgstr "Hoch ngeH:" msgid "Send to Teammates:" msgstr "boq ngeH:" msgid "Send to Nemesis:" msgstr "jagh ngeH:" msgid "Send to Recipient:" msgstr "Qav Hev ngeH:" msgid "Jump:" msgstr "Sup:" #msgid "Binoculars:" #msgstr "" #msgid "Toggle Score:" #msgstr "" #msgid "Tank Labels:" #msgstr "" msgid "Flag Help:" msgstr "joqwI' QaH:" #msgid "Time Forward:" #msgstr "" #msgid "Time Backward:" #msgstr "" #msgid "Pause/Resume:" #msgstr "" #msgid "Self Destruct/Cancel:" #msgstr "" #msgid "SelfDestruct/Cancel:" #msgstr "" #msgid "Fast Quit:" #msgstr "" #msgid "Scroll Backward:" #msgstr "" #msgid "Scroll Forward:" #msgstr "" #msgid "Slow Keyboard Motion:" #msgstr "" #msgid "loading {1}" #msgstr "" #msgid "controls tank motion" #msgstr "" #msgid "Mouse Position:" #msgstr "" msgid "fires shot" msgstr "bach" #msgid "drops flag (if not bad)" #msgstr "" msgid "identifies player (locks on GM)" msgstr "Sup" #msgid "jump (if allowed)" #msgstr "" #msgid "short radar range" #msgstr "" #msgid "medium radar range" #msgstr "" #msgid "long radar range" #msgstr "" #msgid "toggle binoculars" #msgstr "" #msgid "toggle heads-up flag help" #msgstr "" #msgid "send message to teammates" #msgstr "" #msgid "send message to everybody" #msgstr "" #msgid "send message to nemesis" #msgstr "" #msgid "send message to recipient" #msgstr "" #msgid "toggle score sheet" #msgstr "" #msgid "toggle tank labels" #msgstr "" #msgid "set time of day backward" #msgstr "" #msgid "set time of day forward" #msgstr "" #msgid "pause/resume" #msgstr "" #msgid "self Destruct/Cancel" #msgstr "" msgid "quit" msgstr "bup" #msgid "scroll message log backward" #msgstr "" #msgid "scroll message log forward" #msgstr "" #msgid "Slow Keyboard Motion" #msgstr "" #msgid "Toggle Radar Flags" #msgstr "" #msgid "Toggle Main Flags" #msgstr "" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" #msgid "Hunt" #msgstr "" #msgid "autopilot enabled" #msgstr "" #msgid "autopilot disabled" #msgstr "" #msgid "show/dismiss menu" #msgstr "" #msgid "Esc:" #msgstr "" msgid "Maintainer:" msgstr "goht leH:" msgid "Original Author:" msgstr "wa'DIch Author:" #msgid "Code Contributors:" #msgstr "" #msgid "Tank Models:" #msgstr "" #msgid "Special Thanks:" #msgstr "" msgid "Send:" msgstr "ngeH:" msgid "Servers" msgstr "toy' De'wI" msgid "Players" msgstr "ghotpu'" msgid "Red" msgstr "wa'DIch" msgid "Green" msgstr "cha'DIch" msgid "Blue" msgstr "wejDIch" msgid "Purple" msgstr "loSDIch" msgid "Controls" msgstr "SeHlaw" #msgid "General" #msgstr "" #msgid "Environment" #msgstr "" #msgid "Flags I" #msgstr "" #msgid "Flags II" #msgstr "" #msgid "Flags III" #msgstr "" #msgid "Readouts I" #msgstr "" #msgid "Readouts II" #msgstr "" #msgid "Credits" #msgstr "" #msgid "Press Enter to select and T to test a format. Esc to exit." #msgstr "" #msgid "Free-style" #msgstr "" #msgid "Capture-the-Flag" #msgstr "" #msgid "Rabbit Chase" #msgstr "" msgid "Super Flags" msgstr "joqwI' nIv" msgid "Antidote Flags" msgstr "joqwI' vor" msgid "Trying..." msgstr "SuH..." #msgid "Press %s to start" #msgstr "" #msgid "Dead" #msgstr "" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "'eH" #msgid "Reloaded in %.1f" #msgstr "" #msgid "Sealed" #msgstr "" #msgid "Zoned" #msgstr "" #msgid "You are now the rabbit." #msgstr "" #msgid "Servers found: {1}" #msgstr "" #msgid "{1} Shot" #msgstr "" #msgid "{1} Shots" #msgstr "" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" #msgid "Page {1} of {2}" #msgstr "" #msgid "openBroadcast: No udp service {1}" #msgstr "" #msgid "joystick '{1}' not supported..." #msgstr "" #msgid "Server did send endpoint information, UDP connection up" #msgstr "" #msgid "Ignoring Finder argument '{1}'" #msgstr "" #msgid "Can't open list server: {1}" #msgstr "" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "msgid " #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" #msgid "cannot load texture: {1}" #msgstr "" #msgid "Connection failed." #msgstr "" #msgid "Server forced a disconnect" #msgstr "" #msgid "Rogues not allowed. Try another team." #msgstr "" #msgid "This team is full. Try another team." #msgstr "" #msgid "This game is full. Try again later." #msgstr "" #msgid "Game is full or over. Try again later." #msgstr "" #msgid "Error connecting to server." #msgstr "" #msgid "Error downloading world database" #msgstr "" #msgid "Score" #msgstr "" #msgid "Kills" #msgstr "" #msgid "Team Score" #msgstr "" #msgid "Locale:" #msgstr "" #msgid "Player" #msgstr "" # Super Flags #msgid "High Speed" #msgstr "" #msgid "Quick Turn" #msgstr "" #msgid "Oscillation Overthruster" #msgstr "" #msgid "Rapid Fire" #msgstr "" #msgid "Machine Gun" #msgstr "" #msgid "Guided Missile" #msgstr "" #msgid "Laser" #msgstr "" #msgid "Ricochet" #msgstr "" #msgid "Super Bullet" #msgstr "" #msgid "Invisible Bullet" #msgstr "" #msgid "Stealth" #msgstr "" #msgid "Tiny" #msgstr "" #msgid "Narrow" #msgstr "" msgid "Shield" msgstr "yoD" #msgid "Steamroller" #msgstr "" #msgid "Shock Wave" #msgstr "" #msgid "Phantom Zone" #msgstr "" #msgid "Genocide" #msgstr "" msgid "Jumping" msgstr "Sup" msgid "Identify" msgstr "ngu'" msgid "Cloaking" msgstr "So'" #msgid "Colorblindness" #msgstr "" msgid "Obesity" msgstr "ror" msgid "Left Turn Only" msgstr "poS neH" msgid "Right Turn Only" msgstr "nIH neH" #msgid "Momentum" #msgstr "" #msgid "Blindness" #msgstr "" #msgid "Jamming" #msgstr "" #msgid "Wide Angle" #msgstr "" # Flag help #msgid "You have no flag." #msgstr "joqwI' wej SoH!" #msgid "Your team's flag: prevent other teams from capturing it!" #msgstr "" #msgid "Opponent's team flag: take it to your base to capture it!" #msgstr "" #msgid "Velocity (V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Useless" #msgstr "" #msgid "Thief" #msgstr "" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" #msgid "Angular velocity (A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Velocity (+V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (+MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (+G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (+ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" #msgstr "" #msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." #msgstr "" #msgid "left turn only (- <-): Can't turn right." #msgstr "" #msgid "right turn only (- ->): Can't turn left." #msgstr "" #msgid "Momentum (-M): Tank has inertia. Acceleration is limited." #msgstr "" #msgid "Blindness (-B): Can't see out window. Radar still works." #msgstr "" #msgid "JaMming (-JM): Radar doesn't work. Can still see." #msgstr "" #msgid "Wide Angle (-WA): Fish-eye lens distorts view." #msgstr "" #Help 2 Strings #msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" #msgstr "" #msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" #msgstr "" #msgid "player on another team scores a win, while being destroyed or destroying a" #msgstr "" #msgid "teammate scores a loss. Individual and aggregate team scores are tallied." #msgstr "" #msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" #msgstr "" #msgid "teammates and they don't have a team score." #msgstr "" #msgid "There are two styles of play, determined by the server configuration: capture-" #msgstr "" #msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" #msgstr "" #msgid "highest score by shooting opponents. The object in capture-the-flag is to" #msgstr "" #msgid "capture enemy flags while preventing opponents from capturing yours. In this" #msgstr "" #msgid "style, each team (but not rogues) has a team base and each team with at least" #msgstr "" #msgid "one player has a team flag which has the color of the team. To capture a flag," #msgstr "" #msgid "you must grab it and bring it back to your team base (you must be on the ground" #msgstr "" #msgid "in your base to register the capture). Capturing a flag destroys all the players" #msgstr "" #msgid "on that team and gives your team score a bonus; the players will restart on" #msgstr "" #msgid "their team base. Taking your flag onto an enemy base counts as a capture against" #msgstr "" #msgid "your team but not for the enemy team." #msgstr "" #Help 3 Strings #msgid "The world environment contains an outer wall and several buildings." #msgstr "" #msgid "You cannot go outside the outer wall (you can't even jump over it)." #msgstr "" #msgid "You cannot normally drive or shoot through buildings." #msgstr "" #msgid "The server may be configured to include teleporters: large transparent" #msgstr "" #msgid "black slabs. Objects entering one side of a teleporter are instantly" #msgstr "" #msgid "moved to one side of another (or possibly the same) teleporter. The" #msgstr "" #msgid "teleport is reversible; reentering the same side of the destination" #msgstr "" #msgid "teleporter brings you back to where you started. Teleport connections" #msgstr "" #msgid "are fixed at the start of the game and don't change during the game." #msgstr "" #msgid "The connections are always the same in the capture-the-flag style." #msgstr "" #msgid "Each side of a teleporter teleports independently of the other side." #msgstr "" #msgid "It's possible for a teleporter to teleport to the opposite side of" #msgstr "" #msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." #msgstr "" #msgid "A teleporter can also teleport to the same side of itself. This is a" #msgstr "" #msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" #msgstr "" #msgid "self destructive; shooting a laser at one is invariably fatal." #msgstr "" # Help 4 Strings #msgid "Flags come in two varieties: team flags and super flags. Team flags" #msgstr "" #msgid "are used only in the capture-the-flag style. The server may also be" #msgstr "" #msgid "configured to supply super flags, which give your tank some advantage" #msgstr "" #msgid "or disadvantage. You normally can't tell which until you pick one up," #msgstr "" #msgid "but good flags generally outnumber bad flags two to one." #msgstr "" #msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" #msgstr "" #msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" #msgstr "" #msgid "moved to a safety position. Captured flags are placed back on their" #msgstr "" #msgid "team base. Super flags dropped above a building always disappear." #msgstr "" #msgid "A random good super flag will remain for up to 4 possessions. After" #msgstr "" #msgid "that it'll disappear and will eventually be replaced by a new random" #msgstr "" #msgid "flag. Bad random super flags disappear after the first possession." #msgstr "" #msgid "Bad super flags can't normally be dropped. The server can be set to" #msgstr "" #msgid "automatically drop the flag for you after some time, after you destroy" #msgstr "" #msgid "a certain number of enemies, and/or when you grab an antidote flag." #msgstr "" #msgid "Antidote flags are yellow and only appear when you have a bad flag." #msgstr "" # Help 5 Strings #msgid "Good Flags:" #msgstr "" #msgid "boosts top speed" #msgstr "" #msgid "High Speed (V)" #msgstr "" #msgid "boosts turn rate" #msgstr "" #msgid "Quick Turn (A)" #msgstr "" #msgid "can drive through buildings" #msgstr "" #msgid "Oscillation Overthruster (OO)" #msgstr "" #msgid "faster shots more often" #msgstr "" #msgid "Rapid Fire (F)" #msgstr "" #msgid "very fast reload, very short range" #msgstr "" #msgid "Machine Gun (MG)" #msgstr "" #msgid "shots guide themselves (right mouse locks on)" #msgstr "" #msgid "Guided Missile (GM)" #msgstr "" #msgid "infinite shot speed and range, long reload time" #msgstr "" #msgid "Laser (L)" #msgstr "" #msgid "shots ricochet" #msgstr "" #msgid "Ricochet (R)" #msgstr "" #msgid "shoots through buildings" #msgstr "" #msgid "Super Bullet (SB)" #msgstr "" #msgid "tank invisible on enemy radar" #msgstr "" #msgid "Stealth (ST)" #msgstr "" #msgid "tank invisible out the window" #msgstr "" #msgid "Cloaking (CL)" #msgstr "" #msgid "shots invisible on radar" #msgstr "" #msgid "Invisible Bullet (IB)" #msgstr "" #msgid "tank becomes smaller" #msgstr "" #msgid "Tiny (T)" #msgstr "" #msgid "tank becomes paper thin" #msgstr "" #msgid "Narrow (N)" #msgstr "" #msgid "getting hit just drops the flag" #msgstr "" #msgid "Shield (SH)" #msgstr "" #msgid "destroy tanks by touching them" #msgstr "" #msgid "Steamroller (SR)" #msgstr "" #msgid "expanding spherical shell of destruction" #msgstr "" #msgid "Shock Wave (SW)" #msgstr "" # Help 6 Strings #msgid "teleport to enter/leave zone" #msgstr "" #msgid "Phantom Zone (PZ)" #msgstr "" #msgid "destroys player and all player's teammates" #msgstr "" #msgid "Genocide (G)" #msgstr "" #msgid "allows tank to jump" #msgstr "" #msgid "Jumping (JP)" #msgstr "" #msgid "shows type of nearest superflag" #msgstr "" #msgid "Identify (ID)" #msgstr "" #msgid "Bad Flags:" #msgstr "" #msgid "can't identify tanks" #msgstr "" #msgid "Colorblindness (CB)" #msgstr "" #msgid "makes tank very large" #msgstr "" #msgid "Obesity (O)" #msgstr "" #msgid "tank can't turn right" #msgstr "" #msgid "Left Turn Only (<-)" #msgstr "" #msgid "tank can't turn left" #msgstr "" #msgid "Right Turn Only (->)" #msgstr "" #msgid "tank has lots of momentum" #msgstr "" #msgid "Momentum (M)" #msgstr "" #msgid "can't see out the window" #msgstr "" #msgid "Blindness (B)" #msgstr "" #msgid "can't see anything on radar" #msgstr "" #msgid "Jamming (JM)" #msgstr "" #msgid "fish eye view out the window" #msgstr "" #msgid "Wide Angle (WA)" #msgstr "" # Help 7 Strings #msgid "The radar is on the left side of the control panel. It shows an overhead" #msgstr "" #msgid "x-ray view of the game. Buildings and the outer wall are shown in light" #msgstr "" #msgid "blue. Team bases are outlined in the team color. Teleporters are short" #msgstr "" #msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" #msgstr "" #msgid "yellow. The size of the tank's dot is a rough indication of the tank's" #msgstr "" #msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" #msgstr "" #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" #msgid "flags are in the team color, superflags are white, and the antidote flag" #msgstr "" #msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" #msgstr "" #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" #msgid "shock waves, respectively). Your tank is always dead center and forward" #msgstr "" #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" #msgid "is always up on the radar. The yellow V is your field of view. North" #msgstr "" #msgid "is indicated by the letter N." #msgstr "" #msgid "The heads-up-display (HUD) has several displays. The two boxes in the" #msgstr "" #msgid "center of the view are the motion control boxes; within the small box" #msgstr "" #msgid "your tank won't move, outside the large box you don't move any faster than" #msgstr "" #msgid "at the edge of the large box. Moving the mouse above or below the small" #msgstr "" #msgid "box moves forward or backward, respectively. Similarly for left and right." #msgstr "" #msgid "The distance away from the small box determines the speed." #msgstr "" # Help 8 Strings #msgid "Above the larger box is a tape showing your current heading. North is" #msgstr "" #msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," #msgstr "" #msgid "an altitude tape appears to the right of the larger box." #msgstr "" #msgid "Small colored diamonds or arrows may appear on the heading tape. An" #msgstr "" #msgid "arrow pointing left means that a particular flag is to your left, an" #msgstr "" #msgid "arrow pointing right means that the flag is to your right, and a diamond" #msgstr "" #msgid "indicates the heading to the flag by its position on the heading tape." #msgstr "" #msgid "In capture-the-flag mode a marker always shows where your team flag is." #msgstr "" #msgid "A yellow marker shows the way to the antidote flag." #msgstr "" #msgid "At the top of the display are, from left to right, your callsign and" #msgstr "" #msgid "score, your status, and the flag you have. Your callsign is in the" #msgstr "" #msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" #msgstr "" #msgid "or reloading (showing the time until reloaded). It can also show the" #msgstr "" #msgid "time until a bad flag is dropped (if there's a time limit)." #msgstr "" #msgid "Other informational messages may occasionally flash on the HUD." #msgstr "" # BZFS Messages msgid "You are now an administrator!" msgstr "loH Soh!" msgid "Wrong Password!" msgstr "bllughbe'" msgid "unknown command" msgstr "jlyajbe'" #msgid "Countdown started." #msgstr "" #msgid "IP pattern added to banlist" #msgstr "" #msgid "malformed address" #msgstr "" #msgid "removed IP pattern" #msgstr "" bzflag-2.4.2+ds1/data/l10n/bzflag_lt.po000066400000000000000000000760511200563112200174370ustar00rootroot00000000000000# from Rokas Masiulis # FIXME needs to be converted to ascii from utf8 msgid "Join Game" msgstr "Sustabdyti žaidimą" msgid "lt" msgstr "Lithuanian" msgid "translator" msgstr "Rokas Masiulis" msgid "Find Server" msgstr "Ieškoti serverio" msgid "Connect" msgstr "Prisijungti" #msgid "Callsign:" #msgstr "" msgid "Team:" msgstr "Komanda:" msgid "Server:" msgstr "Serveris: " msgid "Port:" msgstr "Prievadas: " #, fuzzy msgid "Start Server" msgstr "Paleisti serverį" #msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" #msgstr "" msgid "Options" msgstr "Parinkės" msgid "Help" msgstr "Pagalba" msgid "Quit" msgstr "Išeiti" #msgid "on" #msgstr "" #msgid "Dithering:" #msgstr "" # sgid "off" # sgstr "" #, fuzzy msgid "Off" msgstr "Išjungti" msgid "On" msgstr "Įjungti" #msgid "Blending:" #msgstr "" #msgid "Smoothing:" #msgstr "" #msgid "Lighting:" #msgstr "" #msgid "Texturing:" #msgstr "" #msgid "Nearest" #msgstr "" #msgid "Linear" #msgstr "" #msgid "Nearest Mipmap Nearest" #msgstr "" #msgid "Linear Mipmap Nearest" #msgstr "" #msgid "Nearest Mipmap Linear" #msgstr "" #msgid "Linear Mipmap Linear" #msgstr "" msgid "Quality:" msgstr "Kokybė:" #msgid "Low" #msgstr "" #msgid "Medium" #msgstr "" msgid "High" msgstr "Didelis greitis" msgid "Shadows:" msgstr "Šešėliai" #msgid "Depth Buffer:" #msgstr "" #, fuzzy msgid "Not available" msgstr "Negalimas" #, fuzzy msgid "Change Video Format" msgstr "Keisti video formatą" #, fuzzy msgid "Brightness:" msgstr "Spalvos šviesumas." msgid "Sound Volume:" msgstr "Garso stiprumas" # sgid "Off / Backup Mode" # sgstr "" # sgid "5 Minutes" # sgstr "" # sgid "15 Minutes" # sgstr "" # sgid "30 Minutes" # sgstr "" # sgid "1 Hour" # sgstr "" # sgid "5 Hours" # sgstr "" # sgid "15 Hours" # sgstr "" # sgid "1 day" # sgstr "" # sgid "15 days" # sgstr "" # sgid "30 days" # sgstr "" #msgid "UDP network connection:" #msgstr "" # sgid "Server List Cache:" # sgstr "" # sgid "Clear Server List Cache" # sgstr "" #msgid "Change Key Mapping" #msgstr "" #msgid "GUI Options" #msgstr "" #msgid "Enhanced radar:" #msgstr "" #msgid "Controlpanel & Score FontSize:" #msgstr "" msgid "normal" msgstr "Įprastas" #, fuzzy msgid "bigger" msgstr "didesnis" #msgid "Radar & Panel Opacity:" #msgstr "" #msgid "Colored shots on radar:" #msgstr "" #msgid "Radar Shot Length:" #msgstr "" #msgid "Radar & Panel Size:" #msgstr "" #, fuzzy msgid "Mouse Box Size:" msgstr "Pelės lango dydis" # sgid "Control panel coloring:" # sgstr "" # sgid "Underline color:" # sgstr "" # sgid "Killer Highlight:" # sgstr "" msgid "Page Down for next page" msgstr "Eiti į sekantį puslapį" msgid "Page Up for previous page" msgstr "Eiti į praeitą puslapį" #msgid "Rogue" #msgstr "" #, fuzzy msgid "Red Team" msgstr "raudona komanda" #, fuzzy msgid "Green Team" msgstr "žalia komanda" #, fuzzy msgid "Blue Team" msgstr "raudona komanda" #, fuzzy msgid "Purple Team" msgstr "violetinė komanda" #msgid "Enter to quit, Esc to resume" #msgstr "" msgid "Really quit?" msgstr "Ar tikrai išeiti?" #, fuzzy msgid "Video Format" msgstr "Video formatas" #msgid "Current Format:" #msgstr "" #msgid "Key Mapping" #msgstr "" msgid "Reset Defaults" msgstr "Atstatyti standartines reikšmes" #msgid "Fire shot:" #msgstr "" msgid "Drop flag:" msgstr "Išmesti vėliavą" #msgid "Identify/Lock On:" #msgstr "" #msgid "Radar Short:" #msgstr "" #msgid "Radar Medium:" #msgstr "" #msgid "Radar Long:" #msgstr "" msgid "Send to All:" msgstr "atsakyti visiems:" #msgid "Send to Teammates:" #msgstr "" #msgid "Send to Nemesis:" #msgstr "" #msgid "Send to Recipient:" #msgstr "" msgid "Jump:" msgstr "Šokti " msgid "Binoculars:" msgstr "Žiuronai:" #msgid "Toggle Score:" #msgstr "" #msgid "Tank Labels:" #msgstr "" #, fuzzy msgid "Flag Help:" msgstr "Vėliavos pagalba" #msgid "Time Forward:" #msgstr "" #msgid "Time Backward:" #msgstr "" #msgid "Pause/Resume:" #msgstr "" # sgid "Self Destruct/Cancel:" # sgstr "" #msgid "SelfDestruct/Cancel:" #msgstr "" msgid "Fast Quit:" msgstr "Greitas išėjimas" #msgid "Scroll Backward:" #msgstr "" #msgid "Scroll Forward:" #msgstr "" #msgid "Slow Keyboard Motion:" #msgstr "" msgid "loading {1}" msgstr "įkeliu {1}" #msgid "controls tank motion" #msgstr "" #msgid "Mouse Position:" #msgstr "" #msgid "fires shot" #msgstr "" #msgid "drops flag (if not bad)" #msgstr "" #msgid "identifies player (locks on GM)" #msgstr "" #msgid "jump (if allowed)" #msgstr "šokti (jei leista)" #msgid "short radar range" #msgstr "" #msgid "medium radar range" #msgstr "" #msgid "long radar range" #msgstr "" #msgid "toggle binoculars" #msgstr "" #msgid "toggle heads-up flag help" #msgstr "" #, fuzzy msgid "send message to teammates" msgstr "siusti žinutę to teammates" msgid "send message to everybody" msgstr "siusti žinutę visiems" #, fuzzy msgid "send message to nemesis" msgstr "siusti žinutę to nemesis" msgid "send message to recipient" msgstr "siusti žinutę to recipient" #msgid "toggle score sheet" #msgstr "" #msgid "toggle tank labels" #msgstr "" #msgid "set time of day backward" #msgstr "" #msgid "set time of day forward" #msgstr "" #, fuzzy msgid "pause/resume" msgstr "Sustabdyti/pratesti žaidimą" #msgid "self Destruct/Cancel" #msgstr "" msgid "quit" msgstr "Išeiti" #msgid "scroll message log backward" #msgstr "" #msgid "scroll message log forward" #msgstr "" # sgid "Slow Keyboard Motion" # sgstr "" # sgid "Toggle Radar Flags" # sgstr "" # sgid "Toggle Main Flags" # sgstr "" # sgid "Silence/UnSilence" # sgstr "" # sgid "Server Admin" # sgstr "" # sgid "Hunt" # sgstr "" # sgid "autopilot enabled" # sgstr "" # sgid "autopilot disabled" # sgstr "" #msgid "show/dismiss menu" #msgstr "" #msgid "Esc:" #msgstr "" #msgid "Maintainer:" #msgstr "" #, fuzzy msgid "Original Author:" msgstr "Autoriaus laukas" #msgid "Code Contributors:" #msgstr "" #msgid "Tank Models:" #msgstr "" #msgid "Special Thanks:" #msgstr "" msgid "Send:" msgstr "Siųsti:" msgid "Servers" msgstr "Serveriai" msgid "Players" msgstr "Žaidėjai" msgid "Red" msgstr "Raudona" msgid "Green" msgstr "Žalia" msgid "Blue" msgstr "Mėlyna" msgid "Purple" msgstr "Violetinė" #msgid "Controls" #msgstr "" #, fuzzy msgid "General" msgstr "Bendras" #, fuzzy msgid "Environment" msgstr "Aplinka" msgid "Flags I" msgstr "Vėliavos I" msgid "Flags II" msgstr "Vėliavos II" msgid "Flags III" msgstr "Vėliavos III" #msgid "Readouts I" #msgstr "" #msgid "Readouts II" #msgstr "" msgid "Credits" msgstr "Padėkos" #msgid "Press Enter to select and T to test a format. Esc to exit." #msgstr "" msgid "Free-style" msgstr "Laisvas-stilius" #msgid "Capture-the-Flag" #msgstr "" # sgid "Rabbit Chase" # sgstr "" #, fuzzy msgid "Super Flags" msgstr "Super vėliavos" #msgid "Antidote Flags" #msgstr "" #, fuzzy msgid "Trying..." msgstr "Bandau..." msgid "Press %s to start" msgstr "Spausk '%s', kad pradėtum" #, fuzzy msgid "Dead" msgstr "Miręs" # sgid "%.1f" # sgstr "" msgid "Ready" msgstr "Pasiruošęs" #msgid "Reloaded in %.1f" #msgstr "" #msgid "Sealed" #msgstr "" #msgid "Zoned" #msgstr "" # sgid "You are now the rabbit." # sgstr "" msgid "Servers found: {1}" msgstr "Rasti serveriai: {1}" msgid "{1} Shot" msgstr "{ 1 } šūvis" msgid "{1} Shots" msgstr "{ 1 } šūviai" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" msgid "Page {1} of {2}" msgstr "Puslapis {1} iš {2}" #msgid "openBroadcast: No udp service {1}" #msgstr "" #msgid "joystick '{1}' not supported..." #msgstr "" # sgid "Server did send endpoint information, UDP connection up" # sgstr "" #, fuzzy msgid "Ignoring Finder argument '{1}'" msgstr "Klaidingas Finder parametras '{1}'" #msgid "Can't open list server: {1}" #msgstr "" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" # sgid "msgid " # sgstr "" msgid "More Info: [{1}:{2}:{3}]" msgstr "Daugiau informacijos: [{1}:{2}:{3}]" msgid "cannot load texture: {1}" msgstr "Negalima užkrauti texture: {1}" msgid "Connection failed." msgstr "Prisijungimas nepavyko." msgid "Server forced a disconnect" msgstr "Serveris uždarė jungtį" #msgid "Rogues not allowed. Try another team." #msgstr "" #msgid "This team is full. Try another team." #msgstr "" #msgid "This game is full. Try again later." #msgstr "" #msgid "Game is full or over. Try again later." #msgstr "" msgid "Error connecting to server." msgstr "Klaida jungiantis serverio" #msgid "Error downloading world database" #msgstr "" # sgid "Score" # sgstr "" # sgid "Kills" # sgstr "" # sgid "Team Score" # sgstr "" # sgid "Player" # sgstr "" # sgid "Locale:" # sgstr "" # Super Flags msgid "High Speed" msgstr "Didelis greitis" #msgid "Quick Turn" #msgstr "" #msgid "Oscillation Overthruster" #msgstr "" #msgid "Rapid Fire" #msgstr "" #msgid "Machine Gun" #msgstr "" #msgid "Guided Missile" #msgstr "" msgid "Laser" msgstr "Lazeris" #msgid "Ricochet" #msgstr "" #, fuzzy msgid "Super Bullet" msgstr "Super šoviniai" msgid "Invisible Bullet" msgstr "Nematomi šoviniai" #msgid "Stealth" #msgstr "" #msgid "Tiny" #msgstr "" #msgid "Narrow" #msgstr "" #msgid "Shield" #msgstr "" #msgid "Steamroller" #msgstr "" #msgid "Shock Wave" #msgstr "" #msgid "Phantom Zone" #msgstr "" msgid "Genocide" msgstr "Genocidas" #msgid "Jumping" #msgstr "" #msgid "Identify" #msgstr "" #msgid "Cloaking" #msgstr "" #msgid "Colorblindness" #msgstr "" #msgid "Obesity" #msgstr "" #msgid "Left Turn Only" #msgstr "" #msgid "Right Turn Only" #msgstr "" #msgid "Momentum" #msgstr "" msgid "Blindness" msgstr "Aklumas" #msgid "Jamming" #msgstr "" #msgid "Wide Angle" #msgstr "" # Flag help msgid "You have no flag." msgstr "Tu neturi vėliavos." #msgid "Your team's flag: prevent other teams from capturing it!" #msgstr "" # sgid "Angular velocity (+A): Tank turns faster. Dodge quicker." # sgstr "" # sgid "Velocity (V): Tank moves faster. Outrun bad guys." # sgstr "" # sgid "Useless" # sgstr "" # sgid "Thief" # sgstr "" # sgid "Masquerade" # sgstr "" # sgid "Seer" # sgstr "" # sgid "Burrow" # sgstr "" # sgid "Angular velocity (A): Tank turns faster. Dodge quicker." # sgstr "" # sgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" # sgstr "" # sgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." # sgstr "" # sgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." # sgstr "" # sgid "Machine Gun (MG): Very fast reload and very short range." # sgstr "" # sgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." # sgstr "" # sgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." # sgstr "" # sgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" # sgstr "" # sgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." # sgstr "" # sgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." # sgstr "" # sgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" # sgstr "" # sgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." # sgstr "" # sgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." # sgstr "" # sgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." # sgstr "" # sgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." # sgstr "" # sgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." # sgstr "" # sgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." # sgstr "" # sgid "Genocide (G): Killing one tank kills that tank's whole team." # sgstr "" # sgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." # sgstr "" # sgid "IDentify (ID): Identifies type of nearest flag." # sgstr "" # sgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." # sgstr "" #msgid "Opponent's team flag: take it to your base to capture it!" #msgstr "" #msgid "Velocity (+V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (+MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (+G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (+ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" #msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" #msgstr "" #msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." #msgstr "" #msgid "left turn only (- <-): Can't turn right." #msgstr "" #msgid "right turn only (- ->): Can't turn left." #msgstr "" #msgid "Momentum (-M): Tank has inertia. Acceleration is limited." #msgstr "" #msgid "Blindness (-B): Can't see out window. Radar still works." #msgstr "" #msgid "JaMming (-JM): Radar doesn't work. Can still see." #msgstr "" #msgid "Wide Angle (-WA): Fish-eye lens distorts view." #msgstr "" # elp 2 Strings #msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" #msgstr "" #msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" #msgstr "" #msgid "player on another team scores a win, while being destroyed or destroying a" #msgstr "" #msgid "teammate scores a loss. Individual and aggregate team scores are tallied." #msgstr "" #msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" #msgstr "" #msgid "teammates and they don't have a team score." #msgstr "" #msgid "There are two styles of play, determined by the server configuration: capture-" #msgstr "" #msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" #msgstr "" #msgid "highest score by shooting opponents. The object in capture-the-flag is to" #msgstr "" #msgid "capture enemy flags while preventing opponents from capturing yours. In this" #msgstr "" #msgid "style, each team (but not rogues) has a team base and each team with at least" #msgstr "" #msgid "one player has a team flag which has the color of the team. To capture a flag," #msgstr "" #msgid "you must grab it and bring it back to your team base (you must be on the ground" #msgstr "" #msgid "in your base to register the capture). Capturing a flag destroys all the players" #msgstr "" #msgid "on that team and gives your team score a bonus; the players will restart on" #msgstr "" #msgid "their team base. Taking your flag onto an enemy base counts as a capture against" #msgstr "" #msgid "your team but not for the enemy team." #msgstr "" #Help 3 Strings #msgid "The world environment contains an outer wall and several buildings." #msgstr "" #msgid "You cannot go outside the outer wall (you can't even jump over it)." #msgstr "" #msgid "You cannot normally drive or shoot through buildings." #msgstr "" #msgid "The server may be configured to include teleporters: large transparent" #msgstr "" #msgid "black slabs. Objects entering one side of a teleporter are instantly" #msgstr "" #msgid "moved to one side of another (or possibly the same) teleporter. The" #msgstr "" #msgid "teleport is reversible; reentering the same side of the destination" #msgstr "" #msgid "teleporter brings you back to where you started. Teleport connections" #msgstr "" #msgid "are fixed at the start of the game and don't change during the game." #msgstr "" #msgid "The connections are always the same in the capture-the-flag style." #msgstr "" #msgid "Each side of a teleporter teleports independently of the other side." #msgstr "" #msgid "It's possible for a teleporter to teleport to the opposite side of" #msgstr "" #msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." #msgstr "" #msgid "A teleporter can also teleport to the same side of itself. This is a" #msgstr "" #msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" #msgstr "" #msgid "self destructive; shooting a laser at one is invariably fatal." #msgstr "" # Help 4 Strings #msgid "Flags come in two varieties: team flags and super flags. Team flags" #msgstr "" #msgid "are used only in the capture-the-flag style. The server may also be" #msgstr "" #msgid "configured to supply super flags, which give your tank some advantage" #msgstr "" #msgid "or disadvantage. You normally can't tell which until you pick one up," #msgstr "" #msgid "but good flags generally outnumber bad flags two to one." #msgstr "" #msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" #msgstr "" #msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" #msgstr "" #msgid "moved to a safety position. Captured flags are placed back on their" #msgstr "" #msgid "team base. Super flags dropped above a building always disappear." #msgstr "" #msgid "A random good super flag will remain for up to 4 possessions. After" #msgstr "" #msgid "that it'll disappear and will eventually be replaced by a new random" #msgstr "" #msgid "flag. Bad random super flags disappear after the first possession." #msgstr "" #msgid "Bad super flags can't normally be dropped. The server can be set to" #msgstr "" #msgid "automatically drop the flag for you after some time, after you destroy" #msgstr "" #msgid "a certain number of enemies, and/or when you grab an antidote flag." #msgstr "" #msgid "Antidote flags are yellow and only appear when you have a bad flag." #msgstr "" # Help 5 Strings msgid "Good Flags:" msgstr "Geros vėliavos" #msgid "boosts top speed" #msgstr "" #, fuzzy msgid "High Speed (V)" msgstr "Didelis greitis (V)" #msgid "boosts turn rate" #msgstr "" #msgid "Quick Turn (A)" #msgstr "" #msgid "can drive through buildings" #msgstr "" #msgid "Oscillation Overthruster (OO)" #msgstr "" #msgid "faster shots more often" #msgstr "" #msgid "Rapid Fire (F)" #msgstr "" #msgid "very fast reload, very short range" #msgstr "" #msgid "Machine Gun (MG)" #msgstr "" #msgid "shots guide themselves (right mouse locks on)" #msgstr "" #msgid "Guided Missile (GM)" #msgstr "" #msgid "infinite shot speed and range, long reload time" #msgstr "" msgid "Laser (L)" msgstr "Lazeris (L)" #msgid "shots ricochet" #msgstr "" #msgid "Ricochet (R)" #msgstr "" #msgid "shoots through buildings" #msgstr "" #msgid "Super Bullet (SB)" #msgstr "" #msgid "tank invisible on enemy radar" #msgstr "" #msgid "Stealth (ST)" #msgstr "" #msgid "tank invisible out the window" #msgstr "" #msgid "Cloaking (CL)" #msgstr "" #msgid "shots invisible on radar" #msgstr "" #msgid "Invisible Bullet (IB)" #msgstr "" #msgid "tank becomes smaller" #msgstr "" #msgid "Tiny (T)" #msgstr "" #msgid "tank becomes paper thin" #msgstr "" #msgid "Narrow (N)" #msgstr "" #msgid "getting hit just drops the flag" #msgstr "" #msgid "Shield (SH)" #msgstr "" #msgid "destroy tanks by touching them" #msgstr "" #msgid "Steamroller (SR)" #msgstr "" #msgid "expanding spherical shell of destruction" #msgstr "" #msgid "Shock Wave (SW)" #msgstr "" # Help 6 Strings #msgid "teleport to enter/leave zone" #msgstr "" #msgid "Phantom Zone (PZ)" #msgstr "" #msgid "destroys player and all player's teammates" #msgstr "" msgid "Genocide (G)" msgstr "Genocidas (G)" #, fuzzy msgid "allows tank to jump" msgstr "leisti tankams šokinėti" #msgid "Jumping (JP)" #msgstr "" #msgid "shows type of nearest superflag" #msgstr "" #, fuzzy msgid "Identify (ID)" msgstr "(ID)" msgid "Bad Flags:" msgstr "Blogos vėliavos:" #msgid "can't identify tanks" #msgstr "" #msgid "Colorblindness (CB)" #msgstr "" #msgid "makes tank very large" #msgstr "" #msgid "Obesity (O)" #msgstr "" #msgid "tank can't turn right" #msgstr "" msgid "Left Turn Only (<-)" msgstr "Sukti tik į dešinę (<-)" #msgid "tank can't turn left" #msgstr "" msgid "Right Turn Only (->)" msgstr "Sukti tik į kairę (<-)" #msgid "tank has lots of momentum" #msgstr "" #msgid "Momentum (M)" #msgstr "" #msgid "can't see out the window" #msgstr "" msgid "Blindness (B)" msgstr "Aklumas (B)" #msgid "can't see anything on radar" #msgstr "" #msgid "Jamming (JM)" #msgstr "" #msgid "fish eye view out the window" #msgstr "" #msgid "Wide Angle (WA)" #msgstr "" # Help 7 Strings #msgid "The radar is on the left side of the control panel. It shows an overhead" #msgstr "" #msgid "x-ray view of the game. Buildings and the outer wall are shown in light" #msgstr "" #msgid "blue. Team bases are outlined in the team color. Teleporters are short" #msgstr "" #msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" #msgstr "" #msgid "yellow. The size of the tank's dot is a rough indication of the tank's" #msgstr "" #msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" #msgstr "" # sgid "Toggle Radar Flags:" # sgstr "" # sgid "Toggle Main Flags:" # sgstr "" # sgid "Silience/UnSilence" # sgstr "" # sgid "Silience/UnSilence Key:" # sgstr "" # sgid "Server Command Key:" # sgstr "" # sgid "self destruct/cancel" # sgstr "" # Start serveru # Start server # sgid "yes" # sgstr "" # sgid "no" # sgstr "" # sgid "Style:" # sgstr "" # sgid "Free for All" # sgstr "" # sgid "Capture the Flag" # sgstr "" # sgid "Max Players:" # sgstr "" # sgid "Max Shots:" # sgstr "" # sgid "Teleporters:" # sgstr "" # sgid "Ricochet:" # sgstr "" # sgid "Jumping:" # sgstr "" # sgid "Superflags:" # sgstr "" # sgid "all flags" # sgstr "" # sgid "good flags only" # sgstr "" # sgid "Max Superflags:" # sgstr "" # sgid "Bad Flag Antidote:" # sgstr "" # sgid "Bad Flag Time Limit:" # sgstr "" # sgid "no limit" # sgstr "" # sgid "15 seconds" # sgstr "" # sgid "30 seconds" # sgstr "" # sgid "60 seconds" # sgstr "" # sgid "180 seconds" # sgstr "" # sgid "Bad Flag Win Limit:" # sgstr "" # sgid "drop after 1 win" # sgstr "" # sgid "drop after 2 wins" # sgstr "" # sgid "drop after 3 wins" # sgstr "" # sgid "Server Visibility:" # sgstr "" # sgid "local host only (ttl=0)" # sgstr "" # sgid "subnet only (ttl=1)" # sgstr "" # sgid "local area (ttl=8)" # sgstr "" # sgid "site (ttl=32)" # sgstr "" # sgid "organization (ttl=64)" # sgstr "" # sgid "continent (ttl=128)" # sgstr "" # sgid "world (ttl=255)" # sgstr "" # sgid "Game Over:" # sgstr "" # sgid "never" # sgstr "" # sgid "after 5 minutes" # sgstr "" # sgid "after 15 minutes" # sgstr "" # sgid "after 60 minutes" # sgstr "" # sgid "after 3 hours" # sgstr "" # sgid "when a player gets +3" # sgstr "" # sgid "when a player gets +10" # sgstr "" # sgid "when a player gets +25" # sgstr "" # sgid "when a team gets +3" # sgstr "" # sgid "when a team gets +10" # sgstr "" # sgid "when a team gets +25" # sgstr "" # sgid "when a team gets +100" # sgstr "" # sgid "Server Reset:" # sgstr "" # sgid "no, quit after game" # sgstr "" # sgid "yes, reset for more games" # sgstr "" #msgid "flags are in the team color, superflags are white, and the antidote flag" #msgstr "" #msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" #msgstr "" #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" #msgid "shock waves, respectively). Your tank is always dead center and forward" #msgstr "" #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" #msgid "is always up on the radar. The yellow V is your field of view. North" #msgstr "" #msgid "is indicated by the letter N." #msgstr "" #msgid "The heads-up-display (HUD) has several displays. The two boxes in the" #msgstr "" #msgid "center of the view are the motion control boxes; within the small box" #msgstr "" #msgid "your tank won't move, outside the large box you don't move any faster than" #msgstr "" #msgid "at the edge of the large box. Moving the mouse above or below the small" #msgstr "" #msgid "box moves forward or backward, respectively. Similarly for left and right." #msgstr "" #msgid "The distance away from the small box determines the speed." #msgstr "" # Help 8 Strings #msgid "Above the larger box is a tape showing your current heading. North is" #msgstr "" #msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," #msgstr "" #msgid "an altitude tape appears to the right of the larger box." #msgstr "" #msgid "Small colored diamonds or arrows may appear on the heading tape. An" #msgstr "" #msgid "arrow pointing left means that a particular flag is to your left, an" #msgstr "" #msgid "arrow pointing right means that the flag is to your right, and a diamond" #msgstr "" #msgid "indicates the heading to the flag by its position on the heading tape." #msgstr "" #msgid "In capture-the-flag mode a marker always shows where your team flag is." #msgstr "" #msgid "A yellow marker shows the way to the antidote flag." #msgstr "" #msgid "At the top of the display are, from left to right, your callsign and" #msgstr "" #msgid "score, your status, and the flag you have. Your callsign is in the" #msgstr "" #msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" #msgstr "" #msgid "or reloading (showing the time until reloaded). It can also show the" #msgstr "" #msgid "time until a bad flag is dropped (if there's a time limit)." #msgstr "" #msgid "Other informational messages may occasionally flash on the HUD." #msgstr "" # BZFS Messages #msgid "You are now an administrator!" #msgstr "" msgid "Wrong Password!" msgstr "Blogas slaptažodis!" msgid "unknown command" msgstr "nežinoma komanda" #msgid "Countdown started." #msgstr "" #msgid "IP pattern added to banlist" #msgstr "" #msgid "malformed address" #msgstr "" #msgid "removed IP pattern" #msgstr "" bzflag-2.4.2+ds1/data/l10n/bzflag_nl.po000066400000000000000000001222151200563112200174230ustar00rootroot00000000000000# This is Dutch (Nederlands) # translation by Sussudio msgid "Join Game" msgstr "Spelen" msgid "nl" msgstr "Dutch" msgid "translator" msgstr "Sussudio" msgid "Find Server" msgstr "Zoek Server" msgid "Connect" msgstr "Verbinden" msgid "Callsign:" msgstr "Naam" #msgid "Team:" #msgstr "Team" #msgid "Server:" #msgstr "Server" msgid "Port:" msgstr "Poort:" msgid "Start Server" msgstr "Server Starten" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Up/Down pijltjes - bewegen, Enter - selecteren, Esc - afbreken" msgid "Options" msgstr "Opties" #msgid "Help" #msgstr "Help" msgid "Quit" msgstr "Stoppen" #msgid "on" #msgstr "" msgid "Dithering:" msgstr "Dithering (kleurschakering):" #msgid "off" #msgstr "" msgid "Off" msgstr "Uit" msgid "On" msgstr "Aan" msgid "Blending:" msgstr "Blending (kleurvermenging): " msgid "Smoothing:" msgstr "Smoothing (kleurvloeing): " msgid "Lighting:" msgstr "Belichting: " msgid "Texturing:" msgstr "Texturing (verweving): " msgid "Nearest" msgstr "Dichtsbijzijnde" msgid "Linear" msgstr "Rechtlijnig" #msgid "Nearest Mipmap Nearest" #msgstr "Nearest Mipmap Nearest" #msgid "Linear Mipmap Nearest" #msgstr "Linear Midmap Nearest" #msgid "Nearest Mipmap Linear" #msgstr "Nearest Midmap Linear" #msgid "Linear Mipmap Linear" #msgstr "Linear Midmap Linear" msgid "Quality:" msgstr "Kwaliteit" msgid "Low" msgstr "Laag" msgid "Medium" msgstr "Midden" msgid "High" msgstr "Hoog" msgid "Shadows:" msgstr "Schaduwen" msgid "Depth Buffer:" msgstr "Diepte Buffer" msgid "Not available" msgstr "Niet Beschikbaar" msgid "Change Video Format" msgstr "Verander Video Formaat" msgid "Brightness:" msgstr "Helderheid:" msgid "Sound Volume:" msgstr "Geluidssterkte:" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "" #msgid "15 Minutes" #msgstr "" #msgid "30 Minutes" #msgstr "" #msgid "1 Hour" #msgstr "" #msgid "5 Hours" #msgstr "" #msgid "15 Hours" #msgstr "" #msgid "1 day" #msgstr "" #msgid "15 days" #msgstr "" #msgid "30 days" #msgstr "" msgid "UDP network connection:" msgstr "UDP netwerk verbinding:" #msgid "Server List Cache:" #msgstr "" #msgid "Clear Server List Cache" #msgstr "" msgid "Change Key Mapping" msgstr "Verander Toetsen Toewijzing" msgid "GUI Options" msgstr "Grafische User Interface Opties" msgid "Enhanced radar:" msgstr "Verbeterde Radar:" msgid "Controlpanel & Score FontSize:" msgstr "Controlepaneel en Puntenaantal Fontgrootte:" msgid "normal" msgstr "normaal" msgid "bigger" msgstr "groter" msgid "Radar & Panel Opacity:" msgstr "Radar en Paneel Doorzichtigheid:" msgid "Colored shots on radar:" msgstr "Gekleurde Schoten op Radar:" msgid "Radar Shot Length:" msgstr "Lengte van Schoten op Radar:" #msgid "Radar & Panel Size:" #msgstr "" #msgid "Mouse Box Size:" #msgstr "" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" msgid "Page Down for next page" msgstr "PageDown voor volgende pagina" msgid "Page Up for previous page" msgstr "PageUp voor vorige pagina" msgid "Rogue" msgstr "Vrijbuiter" msgid "Red Team" msgstr "Rood Team" msgid "Green Team" msgstr "Groen Team" msgid "Blue Team" msgstr "Blauw Team" msgid "Purple Team" msgstr "Paars Team" msgid "Enter to quit, Esc to resume" msgstr "Enter om te stoppen, Esc om door te gaan" msgid "Really quit?" msgstr "Echt Stoppen?" msgid "Video Format" msgstr "Video Formaat" msgid "Current Format:" msgstr "Huidig Formaat:" msgid "Key Mapping" msgstr "Toets Toewijzingen" msgid "Reset Defaults" msgstr "Herstellen naar Originelen" msgid "Fire shot:" msgstr "Schot vuren:" msgid "Drop flag:" msgstr "Vlag laten vallen:" msgid "Identify/Lock On:" msgstr "Identificeren/Vasthouden:" msgid "Radar Short:" msgstr "Radar Kort:" msgid "Radar Medium:" msgstr "Radar Midden:" msgid "Radar Long:" msgstr "Radar Lang:" msgid "Send to All:" msgstr "Aan iedereen zenden:" msgid "Send to Teammates:" msgstr "Aan Teamleden zenden:" msgid "Send to Nemesis:" msgstr "Aan vijand zenden:" msgid "Send to Recipient:" msgstr "Aan ontvanger zenden:" msgid "Jump:" msgstr "Springen:" msgid "Binoculars:" msgstr "Verrekijker:" msgid "Toggle Score:" msgstr "Score aan/uit:" msgid "Tank Labels:" msgstr "Tank Labels:" msgid "Flag Help:" msgstr "Vlag Help:" msgid "Time Forward:" msgstr "Tijd Vooruit:" msgid "Time Backward:" msgstr "Tijd Achteruit:" msgid "Pause/Resume:" msgstr "Pauzeren/Hervatten:" #msgid "Self Destruct/Cancel:" #msgstr "" msgid "SelfDestruct/Cancel:" msgstr "Zelfvernietiging/Annuleren:" msgid "Fast Quit:" msgstr "Snel Stoppen (van het Spel):" msgid "Scroll Backward:" msgstr "Achteruit Scrollen:" msgid "Scroll Forward:" msgstr "Vooruit Scrollen:" msgid "Slow Keyboard Motion:" msgstr "Langzame Toetsenbord Beweging:" msgid "loading {1}" msgstr "laden {1}" msgid "controls tank motion" msgstr "bedient tank beweging" msgid "Mouse Position:" msgstr "Muis Positie:" msgid "fires shot" msgstr "vuurt schot" msgid "drops flag (if not bad)" msgstr "laat vlag vallen (indien niet slecht)" msgid "identifies player (locks on GM)" msgstr "identificeert speler (vasthouden bij GM)" msgid "jump (if allowed)" msgstr "spring (indien geoorlooft)" msgid "short radar range" msgstr "kort radar bereik" msgid "medium radar range" msgstr "midden radar bereik" msgid "long radar range" msgstr "lang radar bereik" msgid "toggle binoculars" msgstr "verrekijker aan/uit" msgid "toggle heads-up flag help" msgstr "Vlag-help aan/uit" msgid "send message to teammates" msgstr "zend boodschap aan teamleden" msgid "send message to everybody" msgstr "zend boodschap aan iedereen" msgid "send message to nemesis" msgstr "zend boodschap aan vijand" msgid "send message to recipient" msgstr "zend boodschap aan ontvanger" msgid "toggle score sheet" msgstr "scorebord aan/uit" msgid "toggle tank labels" msgstr "tank labels aan/uit" msgid "set time of day backward" msgstr "Zet de tijd van de dag voorwaarts" msgid "set time of day forward" msgstr "Zet de tijd van de dag achterwaarts" msgid "pause/resume" msgstr "Pauzeren/Hervatten" msgid "self Destruct/Cancel" msgstr "Zelfvernieting/Annuleren" msgid "quit" msgstr "stoppen" msgid "scroll message log backward" msgstr "blader achterwaarts door boodschappen log" msgid "scroll message log forward" msgstr "blader voorwaarts door booschappen log" #msgid "Slow Keyboard Motion" #msgstr "" #msgid "Toggle Radar Flags" #msgstr "" #msgid "Toggle Main Flags" #msgstr "" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" #msgid "Hunt" #msgstr "" #msgid "autopilot enabled" #msgstr "" #msgid "autopilot disabled" #msgstr "" msgid "show/dismiss menu" msgstr "menu aan/uit" #msgid "Esc:" #msgstr "Esc: " msgid "Maintainer:" msgstr "Onderhouder:" msgid "Original Author:" msgstr "Originele Auteur:" msgid "Code Contributors:" msgstr "Code Bijdragers:" msgid "Tank Models:" msgstr "Tank Modellen:" msgid "Special Thanks:" msgstr "Speciale Dank:" msgid "Send:" msgstr "Zend:" #msgid "Servers" #msgstr "Servers" msgid "Players" msgstr "Spelers" msgid "Red" msgstr "Rood" msgid "Green" msgstr "Groen" msgid "Blue" msgstr "Blauw" msgid "Purple" msgstr "Paars" msgid "Controls" msgstr "Bediening" msgid "General" msgstr "Algemeen" msgid "Environment" msgstr "Omgeving" msgid "Flags I" msgstr "Vlaggen I" msgid "Flags II" msgstr "Vlaggen II" msgid "Flags III" msgstr "Vlaggen III" msgid "Readouts I" msgstr "Uitlezing I" msgid "Readouts II" msgstr "Uitlezing II" msgid "Credits" msgstr "Vermeldingen" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Druk Enter om te selecteren en T om het formaat te testen. Esc om te stoppen." msgid "Free-style" msgstr "Free-Style (Vrije Stijl)" msgid "Capture-the-Flag" msgstr "Capture-the-Flag (Verover-de-Vlag)" #msgid "Rabbit Chase" #msgstr "" msgid "Super Flags" msgstr "Super Vlaggen" msgid "Antidote Flags" msgstr "Antigif Vlaggen" msgid "Trying..." msgstr "Proberen..." msgid "Press %s to start" msgstr "Druk %s om te starten" msgid "Dead" msgstr "Dood" #msgid "%.1f" #msgstr "" msgid "Ready" msgstr "Klaar" msgid "Reloaded in %.1f" msgstr "Herladen in %.1f" msgid "Sealed" msgstr "Ingesloten" msgid "Zoned" msgstr "Zoned" #msgid "You are now the rabbit." #msgstr "" #msgid "Servers found: {1}" #msgstr "" #msgid "{1} Shot" #msgstr "" #msgid "{1} Shots" #msgstr "" #msgid "Score" #msgstr "" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" #msgid "Page {1} of {2}" #msgstr "" #msgid "openBroadcast: No udp service {1}" #msgstr "" #msgid "Server did send endpoint information, UDP connection up" #msgstr "" #msgid "joystick '{1}' not supported..." #msgstr "" #msgid "Ignoring Finder argument '{1}'" #msgstr "" #msgid "Can't open list server: {1}" #msgstr "" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" #msgid "msgid " #msgstr "" #msgid "cannot load texture: {1}" #msgstr "" #msgid "Connection failed." #msgstr "" #msgid "Server forced a disconnect" #msgstr "" #msgid "Rogues not allowed. Try another team." #msgstr "" #msgid "This team is full. Try another team." #msgstr "" #msgid "This game is full. Try again later." #msgstr "" #msgid "Game is full or over. Try again later." #msgstr "" #msgid "Error connecting to server." #msgstr "" #msgid "Error downloading world database" #msgstr "" #msgid "Kills" #msgstr "" #msgid "Team Score" #msgstr "" #msgid "Player" #msgstr "" # Super Flags msgid "High Speed" msgstr "Hoge Snelheid" #msgid "Locale:" #msgstr "" msgid "Quick Turn" msgstr "Snelle Draai" msgid "Oscillation Overthruster" msgstr "Oscillation Overthruster" msgid "Rapid Fire" msgstr "Snelvuur" msgid "Machine Gun" msgstr "Machinegeweer" msgid "Guided Missile" msgstr "Geleideraket" #msgid "Laser" #msgstr "Laser" msgid "Ricochet" msgstr "Weeromstuit" msgid "Super Bullet" msgstr "Super Kogel" msgid "Invisible Bullet" msgstr "Onzichtbare Kogel" msgid "Stealth" msgstr "Steels" msgid "Tiny" msgstr "Zeer Klein" msgid "Narrow" msgstr "Smal" msgid "Shield" msgstr "Schild" msgid "Steamroller" msgstr "Stoomwals" msgid "Shock Wave" msgstr "Schokgolf" msgid "Phantom Zone" msgstr "Spook Zone" msgid "Genocide" msgstr "Kleurmoord" msgid "Jumping" msgstr "Springen" msgid "Identify" msgstr "Identificeren" msgid "Cloaking" msgstr "Verhulling" msgid "Colorblindness" msgstr "Kleurenblind" msgid "Obesity" msgstr "Corpulentie" msgid "Left Turn Only" msgstr "Alleen Linksom" msgid "Right Turn Only" msgstr "Alleen rechtsom" msgid "Momentum" msgstr "Traagheid" msgid "Blindness" msgstr "Blinddoek" msgid "Jamming" msgstr "Storing" msgid "Wide Angle" msgstr "Groothoek Lens" # Flag help msgid "You have no flag." msgstr "Je hebt geen vlag." msgid "Your team's flag: prevent other teams from capturing it!" msgstr "De vlag van je team: zorg ervoor dat andere teams dit niet in handen krijgen!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Vlag van de tegenstander: Breng deze naar je basis om deze te veroveren!" #msgid "Velocity (V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Useless" #msgstr "" #msgid "Thief" #msgstr "" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" #msgid "Angular velocity (A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" #msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" msgid "Velocity (+V): Tank moves faster. Outrun bad guys." msgstr "Snelheid (+V): Tank gaat sneller, laat tegenstanders achter je." msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." msgstr "Snelle Draaicirkel (+A): Tank draait sneller. Ontwijk sneller." msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscillation Overthruster (+OO): Kan door gebouwen rijden. Kan niet achteruit of schieten indien in gebouw." msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." msgstr "Snelvuur (+F): Schiet vaker. Kogels gaan sneller, maar niet zo ver." msgid "Machine Gun (+MG): Very fast reload and very short range." msgstr "Machinegeweer (+MG): Zeer snelle herlading maar korte afstand." msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Geleideraket (+GM): Schoten gaan doel achterna. Vasthouden met rechter knop. Kan vasthouden na geschoten te hebben." msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (+L): Schiet laser. Onbegrensde snelheid en afstand maar lange herladingstijd." msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" msgstr "Weeromstuit (+R): Schoten stuiteren van de muur. Schiet niet op jezelf!" msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super Kogel (+SB): Schiet door gebouwen. Kan Spook Zone doden." msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Onzichtbare Kogel (+IB): Schoten worden niet op de radar gezien, wel op het scherm." msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Steels (+ST): Tank is onzichtbaar op de radar. Schoten zijn wel zichtbaar. Verras de vijand!" msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." msgstr "Zeer Klein (+T): Tank is zeer klein en kan door smalle openingen. Moeilijk om te raken." msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Smal (+N): Tank is zeer smal. Erg moeilijk om van voren te raken, maar normale grootte van de zijkant. Kan door zeer smalle openingen." msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Schild (+SH): Geraakt worden laat alleen de vlag vallen." msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." msgstr "Stoomwals (+SR): Vernietigt tanks door ze aan te raken, maar je moet wel erg dichtbij komen." msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Schokgolf (+SW): Vuren vernietigt alle tanks in de directe omgeving. Kijk uit voor teamleden! Kan tanks in gebouwen en Spook Zone vernietigen." msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Spook Zone (+PZ): Teleporteren" msgid "Genocide (+G): Killing one tank kills that tank's whole team." msgstr "Kleurmoord (+G): Dood 1 tank van een kleur en het hele team gaat eraan." msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Springen (+JP): Tank kan springen. Gebruik de Tab toets. Kan niet sturen in de lucht." msgid "IDentify (+ID): Identifies type of nearest flag." msgstr "IDentificeren (+ID): Identificeert de dichtsbijzijnde vla.g" msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Verhulling (+CL): Maakt de tank onzichtbaar op het scherm. Wel zichtbaar op de radar." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Kleurenblind (-CB): Kan teamkleueren niet uit elkaar houden. Schiet niet op teamleden!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Corpulentie (-O): Tank wordt heel groot. Past niet door teleporters." msgid "left turn only (- <-): Can't turn right." msgstr "Alleen Linksom (- <-): Kan niet rechts draaien." msgid "right turn only (- ->): Can't turn left." msgstr "Alleen Rechtsom (- ->): Kan niet links draaien." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Traagheid (-M): Tank heeft traagheid. Versnelling is verminderd." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Blinkddoek (-B): Kan niets op het scherm zien. Radar werkt wel." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Storing (-JM): Radar werkt niet. Scherm werkt wel." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Groothoek Lens (-WA): Groothoek Lens vervormt scherm." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag is een meerspeler netwerk tank strijd spel. Er zijn vijf teams:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "rood, groen, blauw, paars en vrijbuiters (vrijbuiter tanks zijn zwart). Het vernietigen" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "van een speler van een ander team geeft je een punt, vernietigd worden of een teamlid" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "vernietigen geeft je een punt verlies. Individuele en samengestelde team scores worden bijgehouden/" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Vrijbuiters hebben geen teamleden (ook geen andere vrijbuiters, dus ze kunnen" msgid "teammates and they don't have a team score." msgstr "geen andere teamleden vernietigen en hebben geen team score." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "Er zijn twee soorten spel, bepaald door de server configuratie: Verover-de-Vlag" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "en Vrij Spel. Het doel van vrij spel is om de hoogste score te krijgen door het" msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "vernietigen van tegenstanders. Het doel van verover-de-vlag is om vlaggen van de" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "vijand te pakken en te voorkomen dat de tegenstander de jouwe pakt. Bij deze" msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "stijl heeft elk team (behalve vrijbuiters) een team basic en elk team met tenminste" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "1 speler heeft een team vlag met de kleur van het team. Om een vlag te veroveren," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "moet je deze pakken en naar je team basic brengen (je moet op de grond van je basis" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "zijn om de vlag te veroveren). Het pakken van de vlag vernietigt alle spelers van" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "het team waarvan je de vlag pakt and geeft je team een bonus; de spelers herstarten op" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "hun team basis. Het meenemen van jouw flag naar de basis van de vijand telt als een punt" msgid "your team but not for the enemy team." msgstr "tegen je team, maar niet voor de tegenstander." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "De wereld omgeving bevat een buitenmuur en verscheidene gebouwen." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Je kan niet voorbij de buitenmuur gaan (je kan er niet eens overheen springen)." msgid "You cannot normally drive or shoot through buildings." msgstr "Je kan normaal gesproken niet door gebouwen rijden of schieten." msgid "The server may be configured to include teleporters: large transparent" msgstr "De server kan geconfigureerd worden om teleporters te hebben: grote doorzichtige" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "zwarte plakken. Objecten die aan de ene kant de teleporter in gaan, worden meteen" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "naar een andere (of dezelfde) plaats geteleporteerd. De teleporter is omkeerbaar;" msgid "teleport is reversible; reentering the same side of the destination" msgstr "het opnieuw betreden vandezelfde kant van de bestemmingsteleporter brengt je terug" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "naar waar je begon. Teleport connecties staan vast aan het begin van het spel en" msgid "are fixed at the start of the game and don't change during the game." msgstr "veranderen niet tijdens het spel." msgid "The connections are always the same in the capture-the-flag style." msgstr "De verbindingen zijn altijd hetzelfde bij een verover-de-vlag spel." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Elke kant van een teleporter teleporteert onafhankelijk van de andere kant." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Het is mogelijk voor een teleporter om naar de andere kant van zichzelf" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "te teleportereren. Zo'n doorgaande teleporter gedraagt zich alsof hij er niet is." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Een teleporter kan ook teleporteren naar dezelfde kant van zichzelf. Dit is een" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "omkeerbare teleporter. Schieten naar een omkeerbare teleporter is waarschijnlijk" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "zelfvernietigend; hierop met een laser schieten is fataal." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Vlaggen komen in 2 soorten: team vlaggen en super vlaggen. Team vlaggen" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "worden alleen gebruikt in verover-de-flag spellen. De server kan ook geconfigureerd" msgid "configured to supply super flags, which give your tank some advantage" msgstr "zijn om super vlaggen te leveren, dit geeft je tank een voordeel of nadeel." msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "Je kunt dit normaal gesproken niet weten tot je er een op pakt, maar goede" msgid "but good flags generally outnumber bad flags two to one." msgstr "vlaggen overtreffen slechte vlaggen met een factor 2." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Team vlaggen zijn niet toegestaan op slechte plaatsen. Slechte plaatsen zijn: op" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "gebouwen of de basis van een tegenstander. Team vlaggen die in slechte plaatsen zijn" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "laten vallen worden verplaatst naar een goede plaats. Veroverde vlaggen" msgid "team base. Super flags dropped above a building always disappear." msgstr "worden terug geplaatst op de team basis. Super vlaggen gedropt boven een gebouw verdwijnen" msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "altijd. Een willekeurige super vlag blijft tot 4 bezittingen. Daarna verdwijnt deze" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "en wordt uiteindelijk vervangen door een nieuwe willekeurige super vlag." msgid "flag. Bad random super flags disappear after the first possession." msgstr "Slechte willekeurige super vlaggen verdwijnen altijd na de eerste bezitting." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "Slechte super vlaggen kunnen normaal gesproken niet worden gedropped. De server kan ingesteld" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "worden om de vlag automatisch te laten vallen na een bepaalde tijd, na een vernietiging" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "van een bepaald aantal vijanden, of als je een antigif vlag pakt." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "Antigif vlaggen zijn geel en verschijnen alleen als je een slechte vlag hebt." # Help 5 Strings msgid "Good Flags:" msgstr "Goede Vlaggen:" msgid "boosts top speed" msgstr "voert topsnelheid op" msgid "High Speed (V)" msgstr "Hoge Snelheid (V)" msgid "boosts turn rate" msgstr "verkleint draaicirkel" msgid "Quick Turn (A)" msgstr "Snelle Draai (A)" msgid "can drive through buildings" msgstr "kan door gebouwen rijden" msgid "Oscillation Overthruster (OO)" msgstr "Oscillation Overthruster (OO)" msgid "faster shots more often" msgstr "snellere schoten en vaker" msgid "Rapid Fire (F)" msgstr "Snelvuur (F)" msgid "very fast reload, very short range" msgstr "snelle herlading, erg korte afstand" msgid "Machine Gun (MG)" msgstr "Machinegeweer (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "schoten leiden zichzelf (Rechter Muisknop houdt vast)" msgid "Guided Missile (GM)" msgstr "Geleideraket (GM)" msgid "infinite shot speed and range, long reload time" msgstr "oneindige schot snelheid en afstand, lange herladingstijd" msgid "Laser (L)" msgstr "Laser (L)" msgid "shots ricochet" msgstr "schoten weeromstuiten" msgid "Ricochet (R)" msgstr "Weeromstuit (R)" msgid "shoots through buildings" msgstr "schoten gaan door gebouwen" msgid "Super Bullet (SB)" msgstr "Super Kogel (SB)" msgid "tank invisible on enemy radar" msgstr "tank onzichtbaar op vijandelijke radar" msgid "Stealth (ST)" msgstr "Steels (ST)" msgid "tank invisible out the window" msgstr "tank onzichtbaar op het scherm" msgid "Cloaking (CL)" msgstr "Verhulling (CL)" msgid "shots invisible on radar" msgstr "schoten onzichtbaar op radar" msgid "Invisible Bullet (IB)" msgstr "Onzichtbare Kogel (IB)" msgid "tank becomes smaller" msgstr "tank wordt kleiner" msgid "Tiny (T)" msgstr "Zeer Klein (T)" msgid "tank becomes paper thin" msgstr "tank wordt zo dun als papier" msgid "Narrow (N)" msgstr "Smal (N)" msgid "getting hit just drops the flag" msgstr "geraakt worden laat alleen de vlag vallen" msgid "Shield (SH)" msgstr "Schild (SH)" msgid "destroy tanks by touching them" msgstr "vernietig tanks door ze aan te raken" msgid "Steamroller (SR)" msgstr "Stoomwals (SR)" msgid "expanding spherical shell of destruction" msgstr "uitdijende vernietingings bol" msgid "Shock Wave (SW)" msgstr "Schokgolf (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "Teleporteer om zone in/uit te gaan" msgid "Phantom Zone (PZ)" msgstr "Spook Zone (PZ)" msgid "destroys player and all player's teammates" msgstr "vernietigt speler en teamleden" msgid "Genocide (G)" msgstr "Kleurmoord (G)" msgid "allows tank to jump" msgstr "tank kan springen" msgid "Jumping (JP)" msgstr "Springen (JP)" msgid "shows type of nearest superflag" msgstr "laat dichtsbijzijnde type supervlag zien" msgid "Identify (ID)" msgstr "IDentificeren (ID)" msgid "Bad Flags:" msgstr "Slechte Vlaggen:" msgid "can't identify tanks" msgstr "kan tanks niet identiceren" msgid "Colorblindness (CB)" msgstr "Kleurenblind (CB)" msgid "makes tank very large" msgstr "maakt tanks erg groot" msgid "Obesity (O)" msgstr "Corpulentie (O)" msgid "tank can't turn right" msgstr "tank kan niet rechtsom keren" msgid "Left Turn Only (<-)" msgstr "Alleen linksom (<-)" msgid "tank can't turn left" msgstr "tank kan niet linksom keren" msgid "Right Turn Only (->)" msgstr "Alleen rechtsom (->)" msgid "tank has lots of momentum" msgstr "tank heeft traagheid" msgid "Momentum (M)" msgstr "Traagheid (M)" msgid "can't see out the window" msgstr "kan niets op het scherm zien" msgid "Blindness (B)" msgstr "Blinddoek (B)" msgid "can't see anything on radar" msgstr "kan niets op radar zien" msgid "Jamming (JM)" msgstr "Storing (JM)" msgid "fish eye view out the window" msgstr "Groothoeks vervorming op het scherm" msgid "Wide Angle (WA)" msgstr "Groothoek Lens (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "De radar is aan de linkerkant van het controlepaneel. Het laat een rontgen-overzicht" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "zien van het spel. Gebouwen en de buitenmuur worden in licht blauw weergegeven." msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "Team bases worden in omtrek van de teamkleur weergegeven. Teleporters zijn korte" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "gele lijntjes. Tanks zijn punten in de tank's teamkleur, behalve vrijbuiters, die geel" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "zijn. De grootte van de tank's punt is een geschatte indicatie van de tank's" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "hoogte: hogere tanks hebben grotere stippen. Vlaggen zijn kleine kruisjes. Team vlaggen" #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "zijn in de teamkleur, super vlaggen zijn wit en de antigif vlaggen zijn geel." msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "Schoten zijn kleine puntjes (of lijnen of cirkels, voor lasers en schokgolf)." #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "Je tank is altijd in het midden en voorwaarste is altijd omhoog op de radar." #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "De gele V is je gezichtsveld." msgid "is indicated by the letter N." msgstr "Noord wordt aangegeven met de letter N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Het heads-up-beeldscherm (HUD) heeft diverse schermen. De twee hokjes in het midden" msgid "center of the view are the motion control boxes; within the small box" msgstr "zijn bewegings controle hokjes; binnenin het kleine hokje beweegt je tank niet," msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "erbuiten beweeg je niet sneller dan de buitenkant van het grote hokje." msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "Het bewege van de muis boven of onder het kleine hokje beweegt voorwaarts of" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "achterwaarts. Hetzelde geldt voor links en rechts." msgid "The distance away from the small box determines the speed." msgstr "De afstand tot het kleine hokje bepaalt de snelheid." # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Boven het grotere hokje is een strook die de huidige richting laat zien. Noord is 0," msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "oost is 90, enz. Als springen toegestaan is of als je de spring vlag hebt," msgid "an altitude tape appears to the right of the larger box." msgstr "verschijnt er een hoogtemeter aan de rechterkant van het grotere hokje." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Kleine gekleurde diamantjes of pijltjes kunnen verschijnen in de richtings-strook." msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "Een pijltje naar links betekent dat een bepaalde klant aan je linkerkant is," msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "een pijltje naar rechts betekent dat de vlag aan je rechterkant is en een diamantje" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "geeft de richting naar de vlag aan." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "In verover-de-flag mode, de pijl geeft altijd aan waar de team vlag is." msgid "A yellow marker shows the way to the antidote flag." msgstr "Een geel pijltje geeft de richting naar een antigif vlag aan." msgid "At the top of the display are, from left to right, your callsign and" msgstr "Aan de bovenkant van het scherm zijn, van links naar rechts, je roepnaam en score," msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "je status en de vlag die je hebt. Je roepnaam is in de kleur van je team." msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "Je status is een van deze: klaar, dood, ingesloten, zoned of herladen" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "(geeft de tijd aan tot herladen). Het kan ook de tijd laten zien tot" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "een slechte vlag wordt gedropt (als er een tijdslimiet is)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Andere informele boodschappen kunnen af en toe op de HUD flitsen." # BZFS Messages #msgid "You are now an administrator!" #msgstr "" #msgid "Wrong Password!" #msgstr "" #msgid "unknown command" #msgstr "" #msgid "Countdown started." #msgstr "" #msgid "IP pattern added to banlist" #msgstr "" #msgid "malformed address" #msgstr "" #msgid "removed IP pattern" #msgstr "" bzflag-2.4.2+ds1/data/l10n/bzflag_pt.po000066400000000000000000001050361200563112200174370ustar00rootroot00000000000000# translation of bzflag to Portuguese # Header entry was created by KBabel! # # Américo Monteiro , 2010. msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2010-10-25 00:28+0100\n" "Project-Id-Version: bzflag_2.0.16.20100405_bzflag_pt\n" "Language-Team: Portuguese \n" "X-Generator: Lokalize 1.0\n" "MIME-Version: 1.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Last-Translator: Américo Monteiro \n" msgid "pt_pt" msgstr "Português (Portugal)" msgid "translator" msgstr "Américo Monteiro" ############ general #msgid "yes" #msgstr "sim" #msgid "Yes" #msgstr "Sim" #msgid "no" #msgstr "nao" #msgid "No" #msgstr "Nao" #msgid "on" #msgstr "ativado" #msgid "On" #msgstr "Ativado" #msgid "off" #msgstr "desativado" #msgid "Off" #msgstr "Desativado" #msgid "None" #msgstr "Nenhum" #msgid "Normal" #msgstr "Normal" #msgid "Fast" #msgstr "Rapido" #msgid "Best" #msgstr "Melhor" #msgid "Enhanced" #msgstr "Avancado" #msgid "Low" #msgstr "Baixa" #msgid "Medium" #msgstr "Media" #msgid "High" #msgstr "Alta" msgid "Not available" msgstr "Não disponível" msgid "Unavailable" msgstr "Indisponível" #msgid "Left" #msgstr "Esquerda" #msgid "Right" #msgstr "Direita" msgid "Cyan" msgstr "Ciano" msgid "Grey" msgstr "Cinzento" msgid "Text" msgstr "Texto" msgid "Pulsating" msgstr "Pulsação" msgid "Underline" msgstr "Sublinhado" #msgid "time" #msgstr "hora" #msgid "date" #msgstr "data" #msgid "both" #msgstr "ambos" ############ main menu #msgid "BZFlag" #msgstr "" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Setas Cima/Baixo para mover, Enter para seleccionar, Esc para dispensar" msgid "Join Game" msgstr "Entrar no Jogo" msgid "Options" msgstr "Opções" msgid "Help" msgstr "Ajuda" msgid "Leave Game" msgstr "Abandonar o Jogo" msgid "Quit" msgstr "Sair" ############ join menu msgid "Find Server" msgstr "Encontrar servidor" msgid "Connect" msgstr "Ligar" msgid "Callsign:" msgstr "Assinatura:" msgid "Password:" msgstr "Palavra passe:" msgid "Team:" msgstr "Equipa:" msgid "Observer" msgstr "Observador" msgid "Automatic" msgstr "Automático" msgid "Rogue" msgstr "Errante" msgid "Red Team" msgstr "Equipa Vermelha" msgid "Green Team" msgstr "Equipa Verde" msgid "Blue Team" msgstr "Equipa Azul" msgid "Purple Team" msgstr "Equipa Púrpura" msgid "Server:" msgstr "Servidor:" msgid "Port:" msgstr "Porto:" msgid "Email:" msgstr "Email:" msgid "Start Server" msgstr "Iniciar Servidor" ############ find server menu msgid "Can't open list server: {1}" msgstr "Incapaz de abrir lista de servidores: {1}" msgid "Servers" msgstr "Servidores" msgid "Players" msgstr "Jogadores" msgid "Rogue" msgstr "Errante" msgid "Red" msgstr "Vermelho" msgid "Green" msgstr "Verde" msgid "Blue" msgstr "Azul" msgid "Purple" msgstr "Púrpura" msgid "Observers" msgstr "Observadores" msgid "{1} Shot" msgstr "{1} Tiro" msgid "{1} Shots" msgstr "{1} Tiros" msgid "Free-style" msgstr "Estilo livre" msgid "Capture-the-Flag" msgstr "Capturar a bandeira" msgid "Rabbit Chase" msgstr "Caça ao Coelho" msgid "Super Flags" msgstr "Super bandeiras" msgid "Antidote Flags" msgstr "Bandeiras Antídoto" msgid "{1} sec To Drop Bad Flag" msgstr "{1}segundo Para Largar Bandeira Má" msgid "{1} secs To Drop Bad Flag" msgstr "{1}segundos Para Largar Bandeira Má" msgid "{1} Win Drops Bad Flag" msgstr "{1} Ponto por Largar Bandeira Má" msgid "{1} Wins Drops Bad Flag" msgstr "{1} Pontos por Largar Bandeira Má" msgid "Jumping" msgstr "Aos saltos" msgid "Ricochet" msgstr "Ricochete" msgid "Handicap" msgstr "Desvantagem" msgid "Time limit: {1}" msgstr "Tempo limite: {1}" msgid "Max team score: {1}" msgstr "Pontuação Máxima da Equipa: {1}" msgid "Max player score: {1}" msgstr "Pontuação Máxima do Jogador: {1}" msgid "Servers found: {1}" msgstr "Servidores encontrados: {1}" msgid "Page {1} of {2}" msgstr "Pagina {1} de {2}" ############ connect menu msgid "Trying..." msgstr "A tentar..." msgid "Error connecting to server." msgstr "Erro ao ligar ao servidor." msgid "Connection failed." msgstr "Ligação falhou." msgid "Rogues not allowed. Try another team." msgstr "Errantes não permitidos. Tente outra equipa." msgid "This team is full. Try another team." msgstr "Esta equipa está cheia. Tente outra equipa" msgid "This game is full. Try again later." msgstr "Este jogo está cheio. Tente novamente mais tarde." msgid "Game is full or over. Try again later." msgstr "Jogo cheio ou terminado. Tente novamente mais tarde." #msgid "Error downloading world database" #msgstr "" msgid "Server forced a disconnect" msgstr "O servidor forçou o desligar" ############ start server menu msgid "Style:" msgstr "Estilo:" msgid "Capture the flag" msgstr "Capturar a bandeira" msgid "Server started." msgstr "Servidor iniciado." ############ options menu msgid "Input Settings" msgstr "Definições de Controles" msgid "Audio Settings" msgstr "Definições de Áudio" msgid "Display Settings" msgstr "Definições de Vídeo" msgid "GUI Settings" msgstr "Definições da Interface de Utilizador" msgid "Effects Settings" msgstr "Definições de Efeitos" msgid "Cache Settings" msgstr "Definições de Cache" msgid "Save identity:" msgstr "Salvar identidade:" msgid "Username and password" msgstr "Nome de utilizador e palavra-passe" msgid "Username only" msgstr "Apenas nome de utilizador" msgid "UDP network connection:" msgstr "Ligação de rede UDP:" msgid "Save World" msgstr "Salvar o Mundo" ############ input menu msgid "Change Key Mapping" msgstr "Alterar Mapeamento de Teclas" ############ key map menu msgid "Key Mapping" msgstr "Mapeamento de Teclas" msgid "Use up/down arrows to navigate, enter key to enter edit mode" msgstr "Use setas cima/baixo para navegar, tecla enter para modo de edição" msgid "Reset Defaults" msgstr "Restaurar valores Predefinidos" msgid "Fire shot:" msgstr "Disparar tiro:" msgid "Drop flag:" msgstr "Largar bandeira:" msgid "Identify/Lock On:" msgstr "Identificar/Fixar Alvo:" msgid "Radar Short:" msgstr "Radar Curto:" msgid "Radar Medium:" msgstr "Radar Médio:" msgid "Radar Long:" msgstr "Radar Longo:" msgid "Send to All:" msgstr "Enviar para Todos:" msgid "Send to Teammates:" msgstr "Enviar para Colegas de Equipe:" msgid "Send to Nemesis:" msgstr "Enviar para Quem te matou:" msgid "Send to Recipient:" msgstr "Enviar para o Destinatário:" msgid "Send to Admin:" msgstr "Enviar para o Administrador:" msgid "Jump:" msgstr "Saltar:" msgid "Binoculars:" msgstr "Binóculos:" msgid "Toggle Score:" msgstr "Activar/Desactivar Pontuação:" msgid "Toggle Radar:" msgstr "Activar/Desactivar Radar:" msgid "Toggle Console:" msgstr "Activar/Desactivar Consola:" msgid "Tank Labels:" msgstr "Etiquetas de Tanques:" msgid "Flag Help:" msgstr "Ajuda de Bandeira:" msgid "Time Forward:" msgstr "Avançar no Tempo:" msgid "Time Backward:" msgstr "Recuar no Tempo:" #msgid "Pause/Resume:" #msgstr "" msgid "Self Destruct/Cancel:" msgstr "Auto Destruição/Cancelar:" msgid "SelfDestruct/Cancel:" msgstr "Auto-Destruição/Cancelar:" msgid "Fast Quit:" msgstr "Saída Rápida:" msgid "Scroll Backward:" msgstr "Deslocar para Trás:" msgid "Scroll Forward:" msgstr "Deslocar para a Frente:" msgid "Slow Keyboard Motion:" msgstr "Movimento Lento do Teclado:" msgid "Toggle Flags On Radar:" msgstr "Activar/Desactivar Bandeiras no Radar:" msgid "Toggle Flags On Field:" msgstr "Activar/Desactivar Bandeiras no Campo:" msgid "Silence/UnSilence Key:" msgstr "Tecla de Silenciar/Não Silenciar:" msgid "Server Command Key:" msgstr "Tecla de Comando de Servidor:" msgid "Hunt Key:" msgstr "Tecla de Caçar:" msgid "AutoPilot Key:" msgstr "Tecla do Piloto Automático:" msgid "Main Message Tab:" msgstr "Separador de Mensagens Principais:" msgid "Chat Message Tab:" msgstr "Separador de Mensagens de Conversa:" msgid "Server Message Tab:" msgstr "Separador de Mensagens do Servidor:" msgid "Misc Message Tab:" msgstr "Separador de Mensagens Variadas:" msgid "Forward Key:" msgstr "Tecla de Avançar:" msgid "Reverse Key:" msgstr "Tecla de Recuar:" msgid "Left Key:" msgstr "Tecla da Esquerda:" msgid "Right Key:" msgstr "Tecla da Direita:" msgid "Restart:" msgstr "Reiniciar:" msgid "Iconify:" msgstr "Minimizar num ícone:" msgid "Fullscreen:" msgstr "Ecrã completo:" msgid "Define Quick Keys" msgstr "Definir Teclas Rápidas" ############ audio menu msgid "Sound Volume:" msgstr "Volume do Som:" msgid "Remote Sounds:" msgstr "Sons Remotos:" ############ display menu msgid "Dithering:" msgstr "Tremura:" msgid "Blending:" msgstr "Mistura:" msgid "Smoothing:" msgstr "Suavidez:" msgid "Lighting:" msgstr "Luzes:" msgid "Texturing:" msgstr "Textura:" msgid "Nearest" msgstr "Mais próximo" msgid "Linear" msgstr "Linear" msgid "Nearest Mipmap Nearest" msgstr "Nearest Mipmap Nearest" msgid "Linear Mipmap Nearest" msgstr "Linear Mipmap Nearest" msgid "Nearest Mipmap Linear" msgstr "Nearest Mipmap Linear" msgid "Linear Mipmap Linear" msgstr "Linear Mipmap Linear" msgid "Quality:" msgstr "Qualidade:" msgid "Shadows:" msgstr "Sombras:" msgid "Depth Buffer:" msgstr "Buffer de Intensidade:" msgid "Brightness:" msgstr "Brilho:" msgid "Change Video Format" msgstr "Mudar o Formato de Vídeo" ############ video format menu msgid "Video Format" msgstr "Formato de Vídeo" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Carregue em Enter para seleccionar e T para testar um formato. Esc para sair." msgid "Current Format:" msgstr "Formato Actual:" ############ GUI menu msgid "Radar Style:" msgstr "Estilo de Radar:" msgid "Scoreboard Font Size:" msgstr "Tamanho de Letra do Quadro de Pontuação:" msgid "ControlPanel Font Size:" msgstr "Tamanho de Letra do Painel de Controle:" msgid "Radar & Panel Opacity:" msgstr "Opacidade do Radar & Painel:" msgid "Colored shots on radar:" msgstr "Tiros coloridos no radar:" msgid "Radar Shot Length:" msgstr "Comprimento do Radar de Tiro:" msgid "Radar Shot Size:" msgstr "Tamanho do Radar de Tiro:" msgid "Radar Shot Line:" msgstr "Linha do Radar de Tiro:" msgid "Leading" msgstr "A liderar" msgid "Lagging" msgstr "A atrasar" msgid "Radar & Panel Size:" msgstr "Tamanho do Radar & Painel:" msgid "Mouse Box Size:" msgstr "Tamanho da Caixa do Rato:" msgid "Locale:" msgstr "Idioma:" msgid "Control panel tabs:" msgstr "Separadores do painel de controle:" msgid "Control panel coloring:" msgstr "Cores do painel de controle:" msgid "Underline color:" msgstr "Cor dos sublinhados:" msgid "Killer Highlight:" msgstr "Destacar quem Matou:" msgid "Pulsation Rate:" msgstr "Ritmo da Pulsação:" msgid "Pulsation Depth:" msgstr "Intensidade da Pulsação:" msgid "Time / Date Display:" msgstr "Mostrador de Hora / Data:" ############ effects menu msgid "Rain:" msgstr "Chuva:" msgid "Mirror:" msgstr "Espelho:" #msgid "Display Treads:" #msgstr "" #msgid "Animated Treads:" #msgstr "" #msgid "Track Marks:" #msgstr "" #msgid "Track Mark Culling:" #msgstr "" ############ cache menu msgid "Server List Cache:" msgstr "Cache de Lista de Servidores:" msgid "Off / Backup Mode" msgstr "Desligado / Modo de Backup" msgid "5 Minutes" msgstr "5 Minutos" msgid "15 Minutes" msgstr "15 Minutos" msgid "30 Minutes" msgstr "30 Minutos" msgid "1 Hour" msgstr "1 Hora" msgid "5 Hours" msgstr "5 Horas" msgid "15 Hours" msgstr "15 Horas" msgid "1 day" msgstr "1 dia" msgid "15 days" msgstr "15 dias" msgid "30 days" msgstr "30 dias" msgid "Clear Server List Cache" msgstr "Limpar Cache de Lista de Servidores" ############ quit menu msgid "Enter to quit, Esc to resume" msgstr "Enter para sair, Esc para continuar" msgid "Really quit?" msgstr "Deseja realmente sair?" ############ game display msgid "cannot load texture: {1}" msgstr "incapaz de carregar textura: {1}" msgid "loading {1}" msgstr "a carregar {1}" msgid "Pausing in" msgstr "Em Pausa" msgid "Press Pause to resume" msgstr "Carregue em Pause para continuar" msgid "autopilot enabled" msgstr "piloto automático activado" msgid "autopilot disabled" msgstr "piloto automático desactivado" msgid "AutoPilot on" msgstr "Piloto Automático ligado" msgid "Press %s to start" msgstr "Carregue em %s para começar" msgid "Dead" msgstr "Morto" msgid "Shot myself" msgstr "Suicídio" msgid "Got shot by " msgstr "Atingido por " msgid "got skewred by" msgstr "tramado por" msgid "Ready" msgstr "Pronto" msgid "Reloaded in %.1f" msgstr "Recarregado em %.1f" msgid "SPOTTED" msgstr "AVISTADO" msgid "Hunt" msgstr "Caçar" msgid "Sealed" msgstr "Fechado" msgid "Zoned" msgstr "Em Zona" msgid "Score" msgstr "Pontuação" msgid "Kills" msgstr "Mortes" msgid "Player" msgstr "Jogador" msgid "Team Score" msgstr "Pontuação da Equipa" msgid "You are now the rabbit." msgstr "Agora você é o coelho." ### BZFS Messages msgid "You are now an administrator!" msgstr "Agora você é um administrador!" msgid "Wrong Password!" msgstr "Palavra-passe Errada!" msgid "unknown command" msgstr "comando desconhecido" msgid "Countdown started." msgstr "Contagem decrescente iniciada." msgid "IP pattern added to banlist" msgstr "Padrão de IP adicionado à lista de banidos" msgid "malformed address" msgstr "endereço mal formado" msgid "removed IP pattern" msgstr "Padrão de IP removido" ### Super Flags msgid "High Speed" msgstr "Alta Velocidade" msgid "Quick Turn" msgstr "Viragem Rápida" #msgid "Oscillation Overthruster" #msgstr "" msgid "Rapid Fire" msgstr "Tiro Rápido" msgid "Machine Gun" msgstr "Metralhadora" msgid "Guided Missile" msgstr "Missil Guiado" #msgid "Laser" #msgstr "" msgid "Super Bullet" msgstr "Super Bala" msgid "Invisible Bullet" msgstr "Bala Invisível" msgid "Stealth" msgstr "Discreto" msgid "Tiny" msgstr "Minúsculo" msgid "Narrow" msgstr "Estreito" msgid "Shield" msgstr "Escudo" #msgid "Steamroller" #msgstr "Atropelador" msgid "Shock Wave" msgstr "Onda de Choque" msgid "Phantom Zone" msgstr "Zona Fantasma" msgid "Genocide" msgstr "Genocídio" msgid "Identify" msgstr "Identificar" msgid "Cloaking" msgstr "Ocultar" #msgid "Colorblindness" #msgstr "" msgid "Obesity" msgstr "Obesidade" msgid "Left Turn Only" msgstr "Apenas Curva à Esquerda" msgid "Right Turn Only" msgstr "Apenas Curva à Direita" #msgid "Momentum" #msgstr "" msgid "Blindness" msgstr "Cegueira" msgid "Jamming" msgstr "Interferência" msgid "Wide Angle" msgstr "Ângulo Aberto" ### Flag help msgid "You have no flag." msgstr "Você não tem nenhuma bandeira." msgid "Your team's flag: prevent other teams from capturing it!" msgstr "A bandeira da sua equipa: impeça as outras equipas de a capturarem!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Bandeira da equipa oponente: Leva-a até à sua base para captura-la." msgid "Velocity (V): Tank moves faster. Outrun bad guys." msgstr "Velocidade (V): O tanque move-se mais rápido. Deixe os inimigos para trás." msgid "Useless" msgstr "Inútil" msgid "Thief" msgstr "Ladrão" msgid "Masquerade" msgstr "Disfarce" #msgid "Seer" #msgstr "" msgid "Burrow" msgstr "Enterrado" msgid "Angular velocity (A): Tank turns faster. Dodge quicker." msgstr "Velocidade angular (A): O tanque vira mais rapidamente. Desvia-se mais rápido." msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" msgstr "Bandeira da equipa: Se é a sua, previna as outras equipas de agarrá-la. Caso contrário, leve-a para a sua base para captura-la!" msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Booster de Oscilação (OO): Pode atravessar edifícios. Não pode recuar ou disparar enquanto estiver dentro deles." msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." msgstr "Tiro rápido (F): Dispara com mais frequência. Os tiros são mais rápidos porém mais curtos." msgid "Machine Gun (MG): Very fast reload and very short range." msgstr "Metralhadora (MG): Recargas muito rápidas e alcance muito curto." msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Missil Guiado (GM): Os tiros seguem um alvo. Fixa alvo com botão direito. Pode fixar ou mudar de alvo após disparar." msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (L): Dispara um laser. Velocidade e alcance infinitos porém longo tempo de recarga." msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochete (R): Os tiros fazem ricochete nos muros. Não acerte em si mesmo!" msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Super Bala (SB): Tiros atravessam edifícios. Podem matar Zona Fantasma." msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Bala Invisível (IB): Os seus tiros não aparecem no radar dos outros. Anda podem vê-los pela janela." msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "Discreto (ST): Tanque invisível no radar. Os tiros são visíveis. Surpreenda os inimigos por trás." msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." msgstr "Minúsculo (T): Tanque é pequeno e pode atravessar pequenas aberturas. Muito difícil de atingir." msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Estreito (N): Tanque super-fino. Muito difícil de atingir pela frente porém normal pelo lado. Pode atravessar pequenas aberturas." msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Escudo (SH): Ser atingido apenas perde a bandeira. A bandeira voa um tempo extra longo." msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." msgstr "Esmagador (SR): Destrói os tanques em que você toca mas é preciso chegar muito perto." msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Onda de Choque (SW): Tiro destrói todos os tanques próximos. Não destrua seus companheiros de equipa! Pode destruir tanques sobre/dentro de edifícios." msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "" "Zona Fantasma (PZ): O tele-transporte des/liga efeito de Zona. O tanque 'em zona' pode ser dirigido através de edifícios. Tanque em zona não pode disparar nem ser atingido (excepto por super " "bala e onda de choque)." msgid "Genocide (G): Killing one tank kills that tank's whole team." msgstr "Genocídio (G): Matar um tanque mata toda a equipa desse tanque." msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Saltar (JP): Tanque pode saltar. Use a tecla Tab. Não há direcção no ar." msgid "IDentify (ID): Identifies type of nearest flag." msgstr "Identificar (ID): Identifica o tipo da bandeira mais próxima." msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Ocultar (CL): Torna seu tanque visualmente invisível. Ainda visível no radar." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Daltónico (-CB): Não diferencia as cores das equipas. Não atire nos seus companheiros!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Obesidade (-O): O tanque se torna muito largo. Não passa nos tele-transportadores." msgid "left turn only (- <-): Can't turn right." msgstr "apenas curva à esquerda (- <-): Não pode virar à direita." msgid "right turn only (- ->): Can't turn left." msgstr "apenas curva à direita (- <-): Não pode virar à esquerda." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Momento (-M): O tanque tem inércia. Aceleração limitada." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Cegueira (-B): Não de vê pela janela. O radar ainda funciona." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Interferência (-JM): O radar não funciona. Ainda há visão." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Ângulo Aberto (-WA): Lentes de olhos-de-peixe distorcem a visão." ############ help menu msgid "Controls" msgstr "Controles" msgid "Page Down for next page" msgstr "Page Down para pagina seguinte" msgid "Page Up for previous page" msgstr "Page Up para pagina anterior" msgid "General" msgstr "Geral" msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag é um jogo de batalha de tanques em rede para multi-jogadores. Existem cinco equipas:" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "vermelha, verde, azul, purpura, e errantes (os tanques errantes são pretos). Destruir um" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "jogador de outra equipe marca um ponto, enquanto ao ser destruído ou destruir" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "um companheiro perde um ponto. São contabilizadas contagens individuais e agregadas por equipas." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Os errantes não tem companheiros de equipa (nem mesmo os outros errantes), então não podem atirar" msgid "teammates and they don't have a team score." msgstr "em companheiros de equipa e não têm pontuação de equipa." msgid "There are three styles of play, determined by the server configuration: capture-" msgstr "Existem 3 estilos de jogo, determinados pela configuração do servidor: capturar a" msgid "the-flag, rabbit-chase and free-for-all. In free-for-all the object is simply to get the" msgstr "bandeira, caça ao coelho e estilo livre para todos. No estilo livre o objectivo é simplesmente conseguir" msgid "highest score by shooting opponents. The object in rabbit chase is to be the highest score" msgstr "a pontuação mais alta atirando contra oponentes. O objectivo na caça ao coelho é ter a maior pontuação" msgid "so that you have the white tank, then everyone is against you. The object in capture-the-flag is to" msgstr "para ganhar o tanque branco, e então ficarem todos contra si. O objectivo em capturar a bandeira é capturar" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "as bandeiras inimigas e prevenir que os oponentes capturem da sua. Neste " msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "estilo, cada equipa (excepto os errantes) tem uma base de equipa e cada equipa com pelo menos" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "um jogador tem uma bandeira com a cor da sua equipa. Para capturar uma bandeira," msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "você tem de agarrá-la e levá-la para a sua base de equipa (você tem de estar no chão" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "da sua base para registar a captura). Capturar uma bandeira destrói todos os jogadores" msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "dessa equipa e dá um bónus de pontuação à sua equipa; os jogadores irão reiniciar em" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "sua base. Levar a sua própria bandeira a uma base inimiga conta como captura contra" msgid "your team but not for the enemy team." msgstr "a sua equipa mas não para a equipa inimiga." msgid "Environment" msgstr "Ambiente" msgid "The world environment contains an outer wall and several buildings." msgstr "O ambiente 'mundo' contém um muro externo e diversos edifícios." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Você não pode sair para lá do muro externo (nem mesmo saltar sobre ele)." msgid "You cannot normally drive or shoot through buildings." msgstr "Normalmente você não pode dirigir ou disparar através de edifícios." msgid "The server may be configured to include teleporters: large transparent" msgstr "O servidor pode estar configurado para incluir tele-transportadores: Placas pretas" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "largas e transparentes. Os objectos que entram num lado dum tele-transportador são instantaneamente" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "movidos um lado de outro (ou possivelmente para o mesmo) tele-transportador. O" msgid "teleport is reversible; reentering the same side of the destination" msgstr "tele-transporte é reversível; entrando pelo mesmo lado do tele-transportador" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "de destino leva-o de volta de onde você veio. AS ligações dos tele-transportadores" msgid "are fixed at the start of the game and don't change during the game." msgstr "são fixadas no inicio do jogo e não mudam durante o jogo." msgid "The connections are always the same in the capture-the-flag style." msgstr "As ligações são sempre as mesmas no estilo de capturar a bandeira." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Cada lado do tele-transportador transporta independentemente do outro lado." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "É possível para um tele-transportador transportar para o lado oposto de" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "si mesmo. Tais tele-transportadores agem quase como se não estivessem ali." msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "Um tele-transportador também pode transporta para o mesmo lado de si mesmo. A isto" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "chama-se um tele-transportador reversivo. Disparar contra um tele-transportador reversivo é possivelmente" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "auto-destrutivo; disparar um laser contra um é invariavelmente fatal." msgid "Flags" msgstr "Bandeiras" msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "As bandeiras têm 2 variedade: bandeiras de equipa e super bandeiras. As bandeiras de equipa" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "são usadas apenas no estilo de capturar a bandeira. O servidor também pode ser" msgid "configured to supply super flags, which give your tank some advantage" msgstr "configurado para fornecer super bandeiras, que dão algumas vantagens ou desvantagens" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "ao seu tanque. Normalmente você não consegue distingui-las até que pegue numa," msgid "but good flags generally outnumber bad flags two to one." msgstr "mas as bandeiras boas são geralmente o dobro das más em quantidade." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Não são permitidas bandeiras de equipa em Lugares Maus. Lugares Maus são: sobre" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "um edifício ou numa base inimiga. As bandeiras de equipa largadas num Lugar Mau são" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "movidas para uma posição segura. As bandeiras capturadas são devolvidas às suas" msgid "team base. Super flags dropped above a building always disappear." msgstr "bases de equipa. As super bandeiras largadas sobre edifícios desaparecem sempre." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "Uma super bandeira boa aleatória irá permanecer até 4 posses. Depois" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "irá desaparecer e será eventualmente substituída por uma nova bandeira aleatória" msgid "flag. Bad random super flags disappear after the first possession." msgstr "As bandeiras más aleatórias desaparecem logo após a primeira posse." msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "As super bandeiras más normalmente não podem ser largadas. O servidor pode ser configurado para" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "largar automaticamente a bandeira após algum tempo, após você destruir" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "um certo numero de inimigos, e/ou quando você agarrar uma bandeira antídoto." msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "As bandeiras antídoto são amarelas e apenas aparecem quando você tem uma bandeira má." msgid "Readouts I" msgstr "Leituras I" msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "O radar está no lado esquerdo do painel. Exibe uma visão raio X" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "geral do jogo. Os edifícios e o muro externo são mostrados em azul claro." msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "As bases das equipas são contornadas com a cor das equipas. Os tele-transportadores são" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "pequenas linhas amarelas. Tanques são pontos da cor das suas equipas, excerto os errantes" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "que são amarelos. O tamanho do ponto do tanque é uma indicação breve de altitude" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "do tanque: os tanques em lugares altos possuem pontos mais largos. As bandeira são pequenas cruzes." msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "As bandeiras das equipas são da cor da equipa, as super bandeiras são brancas, e as bandeiras antídoto" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "são amarelas. Os tiros são pequenos pontos (ou linhas ou círculos, para lasers e" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "ondas de choque, respectivamente). O seu tanque fica sempre ao centro e em frente" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "fica sempre em cima no radar. O V amarelo é o seu campo de visão. O Norte" msgid "is indicated by the letter N." msgstr "é indicado pela letra N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "O heads-up-display (HUD) tem diversos mostradores. As duas caixas no" msgid "center of the view are the motion control boxes; within the small box" msgstr "centro da vista são as caixas de controle de locomoção; dentro da caixa pequena" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "o seu tanque não se movimenta, fora da caixa larga você não se move mais rápido que" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "nos bordos da caixa grande. Movimentar o rato acima ou abaixo da caixa pequena" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "movimenta o tanque para frente ou para trás, respectivamente. De modo semelhante para esquerda e direita." msgid "The distance away from the small box determines the speed." msgstr "A distancia afastada da caixa pequena determina a velocidade." msgid "Readouts II" msgstr "Leituras II" msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Por cima da caixa grande fica uma fita que mostra a sua direcção actual. Norte é" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "0, este é 90, etc. Se forem permitidos saltos ou você tiver a bandeira de saltar," msgid "an altitude tape appears to the right of the larger box." msgstr "aparece uma fita de altitude à direita da caixa maior." msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Podem aparecer pequenos diamantes coloridos ou setas na fita direccional. Uma" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "seta apontado para a esquerda significa que uma determinada bandeira está à sua esquerda, uma" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "seta apontando para a direita significa que a bandeira está à sua direita, e um diamante" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "indica o caminho para a bandeira pela sua posição na fita direccional." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "No modo de capturar a bandeira um marcador mostra sempre onde está a bandeira da sua equipa." msgid "A yellow marker shows the way to the antidote flag." msgstr "Um marcador amarelo mostra o caminho para a bandeira antídoto." msgid "At the top of the display are, from left to right, your callsign and" msgstr "No topo do mostrador encontram-se, da esquerda para a direita, a sua assinatura e" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "pontuação, o seu estado, e a bandeira que você tem. A sua assinatura esta na cor" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "da sua equipa. O seu estado é um de: pronto, morto, fechado, em zona" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "ou a recarregar (mostrando o tempo restante até à recarga). Também pode mostrar o" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "tempo até que uma bandeira má seja largada (se existir um tempo limite)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Outras mensagens informativas podem aparecer ocasionalmente no HUD." msgid "Credits" msgstr "Créditos" msgid "Maintainer:" msgstr "Manutenção:" msgid "Original Author:" msgstr "Autor Original:" msgid "Code Contributors:" msgstr "Contribuintes de Código:" msgid "Tank Models:" msgstr "Modelos de Tanques:" msgid "Special Thanks:" msgstr "Agradecimentos Especiais:" bzflag-2.4.2+ds1/data/l10n/bzflag_sv.po000066400000000000000000001206461200563112200174500ustar00rootroot00000000000000# This is generic Swedish msgid "Locale:" msgstr "Sprk:" msgid "sv" msgstr "Svenska" msgid "translator" msgstr "Isak Styf" msgid "Join Game" msgstr "Starta Spel" msgid "Find Server" msgstr "Hitta Server" msgid "Connect" msgstr "Anslut" msgid "Callsign:" msgstr "Namn" msgid "Team:" msgstr "Lag" #msgid "Server:" #msgstr "Server:" #msgid "Port:" #msgstr "Port:" msgid "Start Server" msgstr "Starta Egen Server" msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "Flytta med pil upp/ned, vlj med Retur eller avbryt med Escape" msgid "Options" msgstr "Instllningar" msgid "Help" msgstr "Hjlp" #msgid "on" #msgstr "" msgid "Quit" msgstr "Avsluta" #msgid "off" #msgstr "" msgid "Dithering:" msgstr "Rastrering:" msgid "Off" msgstr "Av" msgid "On" msgstr "P" msgid "Blending:" msgstr "Blandning:" msgid "Smoothing:" msgstr "Utjmning:" msgid "Lighting:" msgstr "Belysning:" msgid "Texturing:" msgstr "Texturer:" msgid "Nearest" msgstr "Nearest" msgid "Linear" msgstr "Linear" msgid "Nearest Mipmap Nearest" msgstr "Nearest Mipmap Nearest" msgid "Linear Mipmap Nearest" msgstr "Linear Mipmap Nearest" msgid "Nearest Mipmap Linear" msgstr "Nearest Mipmap Linear" msgid "Linear Mipmap Linear" msgstr "Linear Mipmap Linear" msgid "Quality:" msgstr "Kvalitet:" msgid "Low" msgstr "Lg" msgid "Medium" msgstr "Medel" msgid "High" msgstr "Hg" msgid "Shadows:" msgstr "Skuggor:" msgid "Depth Buffer:" msgstr "Djupbuffer:" msgid "Not available" msgstr "Inte Tillgnglig" msgid "Change Video Format" msgstr "ndra Skrmupplsning" #msgid "Server List Cache:" #msgstr "" #msgid "Off / Backup Mode" #msgstr "" #msgid "5 Minutes" #msgstr "" #msgid "15 Minutes" #msgstr "" #msgid "30 Minutes" #msgstr "" #msgid "1 Hour" #msgstr "" #msgid "5 Hours" #msgstr "" #msgid "15 Hours" #msgstr "" #msgid "1 day" #msgstr "" #msgid "15 days" #msgstr "" #msgid "30 days" #msgstr "" #msgid "Clear Server List Cache" #msgstr "" msgid "Brightness:" msgstr "Ljusstyrka:" msgid "Sound Volume:" msgstr "Ljudstyrka:" msgid "UDP network connection:" msgstr "Anvnd UDP:" msgid "Change Key Mapping" msgstr "ndra Tangentbordsuppsttning" msgid "GUI Options" msgstr "GUI Instllningar" msgid "Enhanced radar:" msgstr "Frbttrad Radar:" msgid "Controlpanel & Score FontSize:" msgstr "Textstorlek Fr Kontrollpanel & Pong:" msgid "normal" msgstr "normal" msgid "bigger" msgstr "strre" msgid "Radar & Panel Opacity:" msgstr "Radar & Panel genomskinlighet:" msgid "Colored shots on radar:" msgstr "Frgade skott p radarn:" #msgid "Control panel coloring:" #msgstr "" #msgid "Underline color:" #msgstr "" #msgid "Killer Highlight:" #msgstr "" msgid "Radar Shot Length:" msgstr "Skottlngd p radar:" #msgid "Radar & Panel Size:" #msgstr "Radar & Panelstorlek:" #msgid "Mouse Box Size:" #msgstr "Styrrutans storlek:" msgid "Page Down for next page" msgstr "'Page Down' till nsta sida" msgid "Page Up for previous page" msgstr "'Page Up' till fregende sida" msgid "Rogue" msgstr "Lagls" msgid "Red Team" msgstr "Rtt lag" msgid "Green Team" msgstr "Grnt lag" msgid "Blue Team" msgstr "Bltt lag" msgid "Purple Team" msgstr "Lila lag" msgid "Enter to quit, Esc to resume" msgstr "Retur fr att avsluta, Escape fr att fortstta" msgid "Really quit?" msgstr "r du sker?" msgid "Video Format" msgstr "Skrmupplsning" msgid "Current Format:" msgstr "Nuvarande upplsning:" msgid "Key Mapping" msgstr "Tangentuppsttning" msgid "Reset Defaults" msgstr "?terstll" msgid "Fire shot:" msgstr "Skjut:" msgid "Drop flag:" msgstr "Slpp flagga:" msgid "Identify/Lock On:" msgstr "Identifiera / Ls:" msgid "Radar Short:" msgstr "Kort radar:" msgid "Radar Medium:" msgstr "Medel radar:" msgid "Radar Long:" msgstr "Lng radar:" msgid "Send to All:" msgstr "Snd till alla:" msgid "Send to Teammates:" msgstr "Snd till laget:" msgid "Send to Nemesis:" msgstr "Snd till baneman:" msgid "Send to Recipient:" msgstr "Snd till mottagare:" msgid "Jump:" msgstr "Hoppa:" msgid "Binoculars:" msgstr "Kikare:" msgid "Toggle Score:" msgstr "Visa/Dlj pong:" msgid "Tank Labels:" msgstr "Namnetiketter:" msgid "Flag Help:" msgstr "Flagghjlp:" msgid "Time Forward:" msgstr "ka tid:" #msgid "SelfDestruct/Cancel:" #msgstr "" msgid "Time Backward:" msgstr "Backa tid:" #msgid "Pause/Resume:" #msgstr "Paus/Fortstt" msgid "Self Destruct/Cancel:" msgstr "Sjlvdestruera/Avbryt:" msgid "Fast Quit:" msgstr "Snabbavslut:" msgid "Scroll Backward:" msgstr "Skrolla bakt:" msgid "Scroll Forward:" msgstr "Skrolla framt" msgid "Slow Keyboard Motion:" msgstr "Lngsam tangentbordsrrelse:" msgid "loading {1}" msgstr "laddar in {1}" msgid "controls tank motion" msgstr "styr stridsvagnens rrelser" msgid "Mouse Position:" msgstr "Musens position:" msgid "fires shot" msgstr "skjuter" msgid "drops flag (if not bad)" msgstr "slpper flagga (om tilltet)" msgid "identifies player (locks on GM)" msgstr "identifierar spelare (lser med GM)" msgid "jump (if allowed)" msgstr "hoppar (om tilltet)" msgid "short radar range" msgstr "kortdistansradar" msgid "medium radar range" msgstr "medeldistansradar" msgid "long radar range" msgstr "lngdistansradar" msgid "toggle binoculars" msgstr "kikare (p/av)" msgid "toggle heads-up flag help" msgstr "visa flagghjlp (p/av)" msgid "send message to teammates" msgstr "skicka meddelande till lagkamrater" msgid "send message to everybody" msgstr "skicka meddelande till alla" msgid "send message to nemesis" msgstr "skicka meddelande till baneman" msgid "send message to recipient" msgstr "skicka meddelande till mottagare" msgid "toggle score sheet" msgstr "pongtavla (p/av)" msgid "toggle tank labels" msgstr "namnetiketter (p/av)" msgid "set time of day backward" msgstr "ndra tiden bakt" msgid "set time of day forward" msgstr "ndra tiden framt" msgid "pause/resume" msgstr "paus/fortstt" msgid "self Destruct/Cancel" msgstr "sjlvdestruera/avbryt" #msgid "Slow Keyboard Motion" #msgstr "" #msgid "Toggle Radar Flags" #msgstr "" #msgid "Toggle Main Flags" #msgstr "" #msgid "Silence/UnSilence" #msgstr "" #msgid "Server Admin" #msgstr "" #msgid "Hunt" #msgstr "" msgid "quit" msgstr "avsluta" msgid "scroll message log backward" msgstr "skrolla meddelandelogg bakt" #msgid "autopilot enabled" #msgstr "" #msgid "autopilot disabled" #msgstr "" msgid "scroll message log forward" msgstr "skrolla meddelandelogg framt" msgid "show/dismiss menu" msgstr "visa/dlj meny" #msgid "Esc:" #msgstr "Esc:" msgid "Maintainer:" msgstr "Nuvarande utvecklare:" msgid "Original Author:" msgstr "Ursprunglig utvecklare:" msgid "Code Contributors:" msgstr "Medhjlpare:" msgid "Tank Models:" msgstr "Stridsvagnsmodeller:" msgid "Special Thanks:" msgstr "Speciellt tack till:" msgid "Send:" msgstr "Skicka:" msgid "Servers" msgstr "Servrar" msgid "Players" msgstr "Spelare" msgid "Red" msgstr "Rda" msgid "Green" msgstr "Grna" msgid "Blue" msgstr "Bl" msgid "Purple" msgstr "Lila" msgid "Controls" msgstr "Styrning" msgid "General" msgstr "Allmnt" msgid "Environment" msgstr "Omgivning" msgid "Flags I" msgstr "Flaggor I/III" msgid "Flags II" msgstr "Flaggor II/III" msgid "Flags III" msgstr "Flaggor III/III" msgid "Readouts I" msgstr "Speltyper I/II" msgid "Readouts II" msgstr "Speltyper II/II" #msgid "Credits" #msgstr "Credits" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "Tryck Enter fr att vlja och T fr att testa ett format. Escape avslutar." msgid "Free-style" msgstr "Fri Fr Alla" #msgid "Rabbit Chase" #msgstr "" msgid "Capture-the-Flag" msgstr "Ervra flaggan" msgid "Super Flags" msgstr "Superflaggor" msgid "Antidote Flags" msgstr "Motgiftsflaggor" #msgid "%.1f" #msgstr "" msgid "Trying..." msgstr "Frsker..." msgid "Press %s to start" msgstr "Tryck %s for att starta" msgid "Dead" msgstr "Dd" msgid "Ready" msgstr "Redo" #msgid "Servers found: {1}" #msgstr "" #msgid "{1} Shot" #msgstr "" #msgid "You are now the rabbit." #msgstr "" #msgid "{1} Shots" #msgstr "" msgid "Reloaded in %.1f" msgstr "Laddar om (%.1f)" #msgid "{1} sec To Drop Bad Flag" #msgstr "" #msgid "{1} secs To Drop Bad Flag" #msgstr "" #msgid "{1} Win Drops Bad Flag" #msgstr "" #msgid "{1} Wins Drops Bad Flag" #msgstr "" #msgid "Time limit: {1}" #msgstr "" #msgid "Max team score: {1}" #msgstr "" #msgid "Max player score: {1}" #msgstr "" #msgid "Page {1} of {2}" #msgstr "" #msgid "openBroadcast: No udp service {1}" #msgstr "" #msgid "joystick '{1}' not supported..." #msgstr "" #msgid "Ignoring Finder argument '{1}'" #msgstr "" #msgid "Server did send endpoint information, UDP connection up" #msgstr "" #msgid "Can't open list server: {1}" #msgstr "" #msgid "Server sent downlink endpoint information, port {1}" #msgstr "" #msgid "Communication error joining game [Wrong Code {1}]." #msgstr "" #msgid "Configuration file: Error on line {1}: Stream failure" #msgstr "" #msgid "Server sent UDP request, UDP up. Info: [{1}:{2}:{3}]" #msgstr "" #msgid "Configuration file: Error on line {1}: Line too long" #msgstr "" #msgid "Network: Created local UDP downlink port {1}" #msgstr "" #msgid "More Info: [{1}:{2}:{3}]" #msgstr "" #msgid "msgid " #msgstr "" #msgid "cannot load texture: {1}" #msgstr "" #msgid "Connection failed." #msgstr "" #msgid "Server forced a disconnect" #msgstr "" #msgid "Rogues not allowed. Try another team." #msgstr "" #msgid "This team is full. Try another team." #msgstr "" #msgid "This game is full. Try again later." #msgstr "" #msgid "Game is full or over. Try again later." #msgstr "" #msgid "Error connecting to server." #msgstr "" #msgid "Error downloading world database" #msgstr "" msgid "Sealed" msgstr "Frsluten" msgid "Zoned" msgstr "Fantom" #msgid "Score" #msgstr "" #msgid "Kills" #msgstr "" #msgid "Team Score" #msgstr "" #msgid "Player" #msgstr "" # Super Flags msgid "High Speed" msgstr "Hg hastighet" msgid "Quick Turn" msgstr "Snabb svng" msgid "Oscillation Overthruster" msgstr "Oscillation Overthruster" msgid "Rapid Fire" msgstr "Hg eldhastighet" msgid "Machine Gun" msgstr "Maskingevr" msgid "Guided Missile" msgstr "Mlskande robot" msgid "Laser" msgstr "Laser" msgid "Ricochet" msgstr "Ricochet" msgid "Super Bullet" msgstr "Superkula" msgid "Invisible Bullet" msgstr "Osynliga skott" msgid "Stealth" msgstr "Osynlig fr radar" msgid "Tiny" msgstr "Liten" msgid "Narrow" msgstr "Smal" msgid "Shield" msgstr "Skld" msgid "Steamroller" msgstr "?ngvlt" msgid "Shock Wave" msgstr "Shockvg" msgid "Phantom Zone" msgstr "Fantomzon" msgid "Genocide" msgstr "Massmord" msgid "Jumping" msgstr "Hoppa" msgid "Identify" msgstr "Identifiera" msgid "Cloaking" msgstr "Osynlighet" msgid "Colorblindness" msgstr "Frgblindhet" msgid "Obesity" msgstr "Frstoring" msgid "Left Turn Only" msgstr "Endast vnstersvng" msgid "Right Turn Only" msgstr "Endast hgersvng" msgid "Momentum" msgstr "Dubbel vikt" msgid "Blindness" msgstr "Blindhet" msgid "Jamming" msgstr "Radarstrning" msgid "Wide Angle" msgstr "Vidvinkel" # Flag help msgid "You have no flag." msgstr "Du har ingen flagga" msgid "Your team's flag: prevent other teams from capturing it!" msgstr "Ditt lags flagga: frhindra andra lag frn att ta den!" msgid "Opponent's team flag: take it to your base to capture it!" msgstr "Motstndarlags flagga: ta den till din bas fr att ervra den!" msgid "Velocity (V): Tank moves faster. Outrun bad guys." msgstr "Hastighet (V): Din stridsvagn kan kra fortare. Kr ikapp/ifrn motstndare!" #msgid "Useless" #msgstr "" #msgid "Thief" #msgstr "" #msgid "Masquerade" #msgstr "" #msgid "Seer" #msgstr "" #msgid "Burrow" #msgstr "" msgid "Angular velocity (A): Tank turns faster. Dodge quicker." msgstr "Vinkelhastighet (A): Din stridsvagn svnger snabbare. Lttare att undg skott!" #msgid "Team flag: If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" #msgstr "" msgid "Oscillation Overthruster (OO): Can drive through buildings. Can't backup or shoot while inside." msgstr "Oscillation Overthruster (OO): Kan kra igenom byggnader. Man kan inte skjuta inne i en byggnad!" msgid "rapid Fire (F): Shoots more often. Shells go faster but not as far." msgstr "Hg eldhastighet (F): Skjut oftare. Skotten flyger snabbare, men inte lika lngt." msgid "Machine Gun (MG): Very fast reload and very short range." msgstr "Maskingevr (MG): Mycket snabb omladdning, men mycket kort rckvidd." msgid "Guided Missile (GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "Mlskande robot (GM): Ls p en fiende s fljer roboten mlet. Det gr ven att skjuta innan man lst p ett ml." msgid "Laser (L): Shoots a laser. Infinite speed and range but long reload time." msgstr "Laser (L): Skjut med laser. Ondlig hastighet och rckvidd, men lng omladdningstid." msgid "Ricochet (R): Shots bounce off walls. Don't shoot yourself!" msgstr "Ricochet (R): Skott studsar p vggar och freml. Akta du skjuter dig sjlv!" msgid "SuperBullet (SB): Shoots through buildings. Can kill Phantom Zone." msgstr "Superskott (SB): Skjuter igenom byggnader. Kan ven sl ut stridsvagar inne i byggnader." msgid "Invisible Bullet (IB): Your shots don't appear on other radars. Can still see them out window." msgstr "Osynliga skott (IB): Dina skott r inte synliga p andras radar, men kan ses med gat." msgid "STealth (ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "STealth (ST): Din stridsvagn kan inte ses p radar, men det kan dina skott!" msgid "Tiny (T): Tank is small and can get through small openings. Very hard to hit." msgstr "Liten (T): Stridsvagnen r liten och kan komma igenom trnga passager. Svr att trffa." msgid "Narrow (N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "Smal (N): Din stridsvagn r mycket smal och vldigt svr att trffa framifrn." msgid "SHield (SH): Getting hit only drops flag. Flag flys an extra-long time." msgstr "Skld (SH): Om du blir trffad tappar du bara flaggan. Ungefr som ett extra liv!" msgid "SteamRoller (SR): Destroys tanks you touch but you have to get really close." msgstr "?ngvlt (SR): Slr ut andra stridsvagnar som du kr p. Men du mste komma mycket nra!" msgid "Shock Wave (SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "Shockvg (SW): En shockvg slr ut alla stridsvagnar i nrheten. Se upp var du har dina lagkamrater!" msgid "Phantom Zone (PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." msgstr "Fantomzon (PZ): Nr du r fantom kan du kra igenom byggnader. Du kan inte skjuta, men bara bli ddad av superskott eller en shockvg." msgid "Genocide (G): Killing one tank kills that tank's whole team." msgstr "Massmord (G): Om du slr ut en annan stridsvagn s ddar du alla i motsvarande lag." msgid "JumPing (JP): Tank can jump. Use Tab key. Can't steer in the air." msgstr "Hoppa (JP): Din stridsvagn kan hoppa. Man kan inte styra i luften!" msgid "IDentify (ID): Identifies type of nearest flag." msgstr "Identifiera (ID): Identifierar den nrmaste flaggan." msgid "CLoaking (CL): Makes your tank invisible out-the-window. Still visible on radar." msgstr "Osynlighet (CL): Din stridsvagn blir osynlig fr gat, men kan fortfarande ses p radar." msgid "ColorBlindness (-CB): Can't tell team colors. Don't shoot teammates!" msgstr "Frgblindhet (-CB): Du kan inte se stridsvagnarnas frger. Akta s du inte skjuter dina kamrater!" msgid "Obesity (-O): Tank becomes very large. Can't fit through teleporters." msgstr "Frstoring (-O): Din stridsvagn blir mycket stor och lttrffad. Den kan inte komma igenom teleportrar." msgid "left turn only (- <-): Can't turn right." msgstr "Endast Vnstersvng (- <-): Du kan inte svnga till hger." msgid "right turn only (- ->): Can't turn left." msgstr "Endast Hgersvng (- ->): Du kan inte svnga till vnster." msgid "Momentum (-M): Tank has inertia. Acceleration is limited." msgstr "Dubbel vikt (-M): Din stridsvagn blir stor och lngsam." msgid "Blindness (-B): Can't see out window. Radar still works." msgstr "Blindhet (-B): Du kan inte se ngot. Radarn fortstter dock att fungera." msgid "JaMming (-JM): Radar doesn't work. Can still see." msgstr "Radarstrning (-JM): Din radar strs ut, men du kan fortfarande se med gonen." msgid "Wide Angle (-WA): Fish-eye lens distorts view." msgstr "Vid vinkel (-WA): Fiskgeperspektiv." #Help 2 Strings msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "BZFlag r ett ntverksspel dr olika lag av stridsvagnar slss. Lagen r:" #msgid "Velocity (+V): Tank moves faster. Outrun bad guys." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Angular velocity (+A): Tank turns faster. Dodge quicker." #msgstr "" #msgid "Oscillation Overthruster (+OO): Can drive through buildings. Can't backup or shoot while inside." #msgstr "" #msgid "rapid Fire (+F): Shoots more often. Shells go faster but not as far." #msgstr "" #msgid "Machine Gun (+MG): Very fast reload and very short range." #msgstr "" #msgid "Guided Missile (+GM): Shots track a target. Lock on with right button. Can lock on or retarget after firing." #msgstr "" #msgid "Laser (+L): Shoots a laser. Infinite speed and range but long reload time." #msgstr "" #msgid "Ricochet (+R): Shots bounce off walls. Don't shoot yourself!" #msgstr "" #msgid "SuperBullet (+SB): Shoots through buildings. Can kill Phantom Zone." #msgstr "" #msgid "Invisible Bullet (+IB): Your shots don't appear on other radars. Can still see them out window." #msgstr "" #msgid "STealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Stealth (+ST): Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" #msgstr "" #msgid "Tiny (+T): Tank is small and can get through small openings. Very hard to hit." #msgstr "" #msgid "Narrow (+N): Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." #msgstr "" #msgid "SHield (+SH): Getting hit only drops flag. Flag flys an extra-long time." #msgstr "" #msgid "SteamRoller (+SR): Destroys tanks you touch but you have to get really close." #msgstr "" #msgid "Shock Wave (+SW): Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." #msgstr "" #msgid "Phantom Zone (+PZ): Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank can't shoot or be shot (except by superbullet and shock wave)." #msgstr "" #msgid "Genocide (+G): Killing one tank kills that tank's whole team." #msgstr "" #msgid "JumPing (+JP): Tank can jump. Use Tab key. Can't steer in the air." #msgstr "" #msgid "IDentify (+ID): Identifies type of nearest flag." #msgstr "" #msgid "CLoaking (+CL): Makes your tank invisible out-the-window. Still visible on radar." #msgstr "" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "rd, grn, bl, lila och laglsa (som r svarta). Nr man skjuter en " msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "spelare ur ett annat lag fr man pong, om man dremot dr eller skjuter en" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "lagkamrat fr man minus. Pongen rknas svl individuellt som fr hela laget." msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "Laglsa har inga lagkamrater (inte ens andra laglsa), s de kan" msgid "teammates and they don't have a team score." msgstr "inte skjuta sina lagkamrater och har heller inga lagpong." msgid "There are two styles of play, determined by the server configuration: capture-" msgstr "BZFlag kan spelas p tv olika stt, dr speltypen bestms vid uppstart: flagg-" msgid "the-flag and free-for-all. In free-for-all the object is simply to get the" msgstr "ervring eller fri fr alla. I den senare gller det att f det hgsta " msgid "highest score by shooting opponents. The object in capture-the-flag is to" msgstr "antalet pong frn att skjuta andra fiender. I flaggervring skall man" msgid "capture enemy flags while preventing opponents from capturing yours. In this" msgstr "ervra fiendens flagga och skydda sin egen frn ervring. Hr har " msgid "style, each team (but not rogues) has a team base and each team with at least" msgstr "varje lag (frutom laglsa) en egen bas och varje lag med minst en deltagare" msgid "one player has a team flag which has the color of the team. To capture a flag," msgstr "har en lagflagga med lagets egen frg. Fr att ervra flaggan, skall du " msgid "you must grab it and bring it back to your team base (you must be on the ground" msgstr "ta den frn fiendens bas och ta med den till din egen (du mste vara p marken" msgid "in your base to register the capture). Capturing a flag destroys all the players" msgstr "i din bas fr att det skall registreras). Nr en flagga ervras dr alla spelare " msgid "on that team and gives your team score a bonus; the players will restart on" msgstr "i det lag frn vilket flaggan togs. Detta ger ditt lag en pongbonus. Spelarna startar" msgid "their team base. Taking your flag onto an enemy base counts as a capture against" msgstr "i sin egen bas. Om du tar med din egen flagga in i fiendens bas, rknas det som en" msgid "your team but not for the enemy team." msgstr "ervring frn fiendens sida och de fr pong." #Help 3 Strings msgid "The world environment contains an outer wall and several buildings." msgstr "Spelplanen bestr av en yttre vgg och ett flertal objekt och byggnader." msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "Det gr inte att komma utanfr vggarna (inte ens genom att hoppa)." msgid "You cannot normally drive or shoot through buildings." msgstr "Normalt gr det inte att kra eller skjuta igenom byggnader." msgid "The server may be configured to include teleporters: large transparent" msgstr "Servern kan vara konfigurerad att inkludera teleportrar. Objekt" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "som ker in p ena sidan av en sdan flyttas direkt till andra sidan" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "av en annan (eller samma) teleporter. Man kan p samma stt kra" msgid "teleport is reversible; reentering the same side of the destination" msgstr "tillbaka in i den teleporter man kom ifrn om man vill komma tillbaka" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "dit man startade. Teleportrarnas frbindelse r statiska frn spelets" msgid "are fixed at the start of the game and don't change during the game." msgstr "start och ndras inte under spelets gng." msgid "The connections are always the same in the capture-the-flag style." msgstr "Frbindelserna r alltid de samma under speltypen flaggervring." msgid "Each side of a teleporter teleports independently of the other side." msgstr "Den ena sidan av en teleporter teleporterar oberoende av den andra." msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "Det r mjligt att en teleporter teleporterar till andra sidan av sig" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "sjlv. Denna typ av genom-teleportrar uppfr sig nstan som om de" msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "inte var dr. Man kan ocks bli teleporterad till samma sida som man" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "kom frn. En 'spegel'. Skjuter man p en sdan teleporter blir fljden" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "med stor sannolikhet att man skjuter sig sjlv." # Help 4 Strings msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "Det finns tv varianter av flaggor: lagflaggor och superflaggor. Lagflaggor" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "anvnds endast vid flaggervring. Servern kan ocks vara konfigurerad" msgid "configured to supply super flags, which give your tank some advantage" msgstr "att plantera ut superflaggor, som ger din stridsvagn fr och nackdelar." msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "Normalt kan du inte se vad dessa r frrn du tagit upp en flagga," msgid "but good flags generally outnumber bad flags two to one." msgstr "men generellt finns det fler bra n dliga flaggor." msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "Lagflaggor fr inte placeras p 'dliga' stllen som en byggnad eller" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "p en fiendebas. Lagflaggor som slpps p ett sdant stlle, flyttas" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "till ett skert omrde. Ervrade flaggor placeras i deras hembas." msgid "team base. Super flags dropped above a building always disappear." msgstr "Superflaggor som slpps p byggnader frsvinner alltid." msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "En tillfllig bra superflagga finns kvar upp tills den fjrde garen. Efter" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "det frsvinner den och en ny tillfllig flagga placeras eventuellt ut " msgid "flag. Bad random super flags disappear after the first possession." msgstr "Dliga tillflliga flaggor frsvinner efter att den frsta garen " msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "blivit av med den. De kan normalt inte slppas frivilligt. Serveren kan" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "vara konfigurerad att ta den frn dig efter en viss tid, eller efter" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "att du skjutit ett visst antal fjender, och/eller om du hittar en" msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "motgiftsflagga. De r gula och endast synliga nr du har en dlig flagga." # Help 5 Strings msgid "Good Flags:" msgstr "Bra flaggor:" msgid "boosts top speed" msgstr "ger kad toppfart" msgid "High Speed (V)" msgstr "Hg hastighet (V)" msgid "boosts turn rate" msgstr "ger kad svnghastighet" msgid "Quick Turn (A)" msgstr "Snabb svng (A)" msgid "can drive through buildings" msgstr "kan kra genom byggnader" msgid "Oscillation Overthruster (OO)" msgstr "Oscillation Overthruster (OO)" msgid "faster shots more often" msgstr "snabbare skott" msgid "Rapid Fire (F)" msgstr "Hg eldhastighet (F)" msgid "very fast reload, very short range" msgstr "snabb omladdning, kort rckvidd" msgid "Machine Gun (MG)" msgstr "Maskingevr (MG)" msgid "shots guide themselves (right mouse locks on)" msgstr "mlskande skott" msgid "Guided Missile (GM)" msgstr "Mlskande robot (GM)" msgid "infinite shot speed and range, long reload time" msgstr "ondlig skotthastighet och rckvidd, lng omladdningstid" #msgid "Laser (L)" #msgstr "" msgid "shots ricochet" msgstr "skott ricocheterar" #msgid "Ricochet (R)" #msgstr "" msgid "shoots through buildings" msgstr "skjuter genom byggnader" msgid "Super Bullet (SB)" msgstr "Superskott (SB)" msgid "tank invisible on enemy radar" msgstr "osynlig p fiendens radar" msgid "Stealth (ST)" msgstr "Osynlig fr radar" msgid "tank invisible out the window" msgstr "stridsvagnen r osynlig (men inte p radar)" msgid "Cloaking (CL)" msgstr "Osynlighet (CL)" msgid "shots invisible on radar" msgstr "skott kan inte ses p radarn" msgid "Invisible Bullet (IB)" msgstr "Osynliga skott (IB)" msgid "tank becomes smaller" msgstr "din stridsvagn blir mindre" msgid "Tiny (T)" msgstr "Liten (T)" msgid "tank becomes paper thin" msgstr "din stridsvagn blir mycket smal" msgid "Narrow (N)" msgstr "Smal (N)" msgid "getting hit just drops the flag" msgstr "nr du trffas tappar du flaggan" msgid "Shield (SH)" msgstr "Skld (SH)" msgid "destroy tanks by touching them" msgstr "slr ut stridsvagnar vid berring" msgid "Steamroller (SR)" msgstr "?ngvlt (SR)" msgid "expanding spherical shell of destruction" msgstr "avger en direkt ddande sfr" msgid "Shock Wave (SW)" msgstr "Shockvg (SW)" # Help 6 Strings msgid "teleport to enter/leave zone" msgstr "teleportera fr att g in i/ur fantomzonen" msgid "Phantom Zone (PZ)" msgstr "Fantomzon (PZ)" msgid "destroys player and all player's teammates" msgstr "ddar spelare och alla lagkamrater" msgid "Genocide (G)" msgstr "Massmord (G)" msgid "allows tank to jump" msgstr "tillter stridsvagnen att hoppa" msgid "Jumping (JP)" msgstr "Hoppa (JP)" msgid "shows type of nearest superflag" msgstr "identifierar nrmaste flagga" msgid "Identify (ID)" msgstr "Identifiera (ID)" msgid "Bad Flags:" msgstr "Dliga flaggor:" msgid "can't identify tanks" msgstr "kan inte identifiera stridsvagnar" msgid "Colorblindness (CB)" msgstr "Frgblindhet (CB)" msgid "makes tank very large" msgstr "gr stridsvagnen mycket stor" msgid "Obesity (O)" msgstr "Frstoring (O)" msgid "tank can't turn right" msgstr "kan inte svnga till hger" msgid "Left Turn Only (<-)" msgstr "Endast vnstersvng (<-)" msgid "tank can't turn left" msgstr "kan inte svnga till vnster" msgid "Right Turn Only (->)" msgstr "Endast hgersvng (->)" msgid "tank has lots of momentum" msgstr "din stridsvagn r mycket lngsam" msgid "Momentum (M)" msgstr "Dubbel vikt (M)" msgid "can't see out the window" msgstr "du kan inte se ngot" msgid "Blindness (B)" msgstr "Blindhet (B)" msgid "can't see anything on radar" msgstr "du kan inte se ngot p din radar" msgid "Jamming (JM)" msgstr "Radarstrning (JM)" msgid "fish eye view out the window" msgstr "fiskgesyn" msgid "Wide Angle (WA)" msgstr "Vid vinkel (WA)" # Help 7 Strings msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "Radarn terfinns till vnster om kontrollpanelen. Den visar en versikt" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "ver spelet. Byggnader och yttre vggar visas med ljusbltt. " msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "Baser visas i garnas frg. Teleportrar visas som korta gula linjer." msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "Stridsvagnar visas som prickar i lagfrgen, med undantag av laglsa som" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "r gula. Storleken p stridsvagnens prick r en indikation p hur " msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "hgt uppe den r: Ju strre prick, desto hgre upp. Flaggor r sm kryss." #msgid "Toggle Radar Flags:" #msgstr "" #msgid "Toggle Main Flags:" #msgstr "" #msgid "Silience/UnSilence" #msgstr "" #msgid "Silience/UnSilence Key:" #msgstr "" #msgid "Server Command Key:" #msgstr "" #msgid "self destruct/cancel" #msgstr "" # Start serveru # Start server #msgid "yes" #msgstr "" #msgid "no" #msgstr "" #msgid "Style:" #msgstr "" #msgid "Free for All" #msgstr "" #msgid "Capture the Flag" #msgstr "" #msgid "Max Players:" #msgstr "" #msgid "Max Shots:" #msgstr "" #msgid "Teleporters:" #msgstr "" #msgid "Ricochet:" #msgstr "" #msgid "Jumping:" #msgstr "" #msgid "Superflags:" #msgstr "" #msgid "all flags" #msgstr "" #msgid "good flags only" #msgstr "" #msgid "Max Superflags:" #msgstr "" #msgid "Bad Flag Antidote:" #msgstr "" #msgid "Bad Flag Time Limit:" #msgstr "" #msgid "no limit" #msgstr "" #msgid "15 seconds" #msgstr "" #msgid "30 seconds" #msgstr "" #msgid "60 seconds" #msgstr "" #msgid "180 seconds" #msgstr "" #msgid "Bad Flag Win Limit:" #msgstr "" #msgid "drop after 1 win" #msgstr "" #msgid "drop after 2 wins" #msgstr "" #msgid "drop after 3 wins" #msgstr "" #msgid "Server Visibility:" #msgstr "" #msgid "local host only (ttl=0)" #msgstr "" #msgid "subnet only (ttl=1)" #msgstr "" #msgid "local area (ttl=8)" #msgstr "" #msgid "site (ttl=32)" #msgstr "" #msgid "organization (ttl=64)" #msgstr "" #msgid "continent (ttl=128)" #msgstr "" #msgid "world (ttl=255)" #msgstr "" #msgid "Game Over:" #msgstr "" #msgid "never" #msgstr "" #msgid "after 5 minutes" #msgstr "" #msgid "after 15 minutes" #msgstr "" #msgid "after 60 minutes" #msgstr "" #msgid "after 3 hours" #msgstr "" #msgid "when a player gets +3" #msgstr "" #msgid "when a player gets +10" #msgstr "" #msgid "when a player gets +25" #msgstr "" #msgid "when a team gets +3" #msgstr "" #msgid "when a team gets +10" #msgstr "" #msgid "when a team gets +25" #msgstr "" #msgid "when a team gets +100" #msgstr "" #msgid "Server Reset:" #msgstr "" #msgid "no, quit after game" #msgstr "" #msgid "yes, reset for more games" #msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "Lagflaggor visas i lagets egen frg, superflaggor r vita och motgift gula." msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "Skott r sm prickar, laser r linjer och shockvgor r cirklar. " #msgid "cyan" #msgstr "" #msgid "grey" #msgstr "" #msgid "text" #msgstr "" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "Du befinner dig alltid i centrum och framt r alltid uppt" #msgid "None" #msgstr "" #msgid "Pulsating" #msgstr "" #msgid "Underline" #msgstr "" # Identifikace vlajek # Flags identification #msgid "Closest Flag: High Speed" #msgstr "" #msgid "Closest Flag: Quick Turn" #msgstr "" #msgid "Closest Flag: Oscillation Overthurster" #msgstr "" #msgid "Closest Flag: Rapid Fire" #msgstr "" #msgid "Closest Flag: Machine Gun" #msgstr "" #msgid "Closest Flag: Guided Missile" #msgstr "" #msgid "Closest Flag: Laser" #msgstr "" #msgid "Closest Flag: Ricochet" #msgstr "" #msgid "Closest Flag: Super Bullet" #msgstr "" #msgid "Closest Flag: Stealth" #msgstr "" #msgid "Closest Flag: Cloaking" #msgstr "" #msgid "Closest Flag: Invisible Bullet" #msgstr "" #msgid "Closest Flag: Tiny" #msgstr "" #msgid "Closest Flag: Narrow" #msgstr "" #msgid "Closest Flag: Shield" #msgstr "" #msgid "Closest Flag: Steamroller" #msgstr "" #msgid "Closest Flag: Shock Wave" #msgstr "" #msgid "Closest Flag: Phantom Zone" #msgstr "" #msgid "Closest Flag: Genocide" #msgstr "" #msgid "Closest Flag: Jumping" #msgstr "" #msgid "Closest Flag: Identify" #msgstr "" #msgid "Closest Flag: Colorblindness" #msgstr "" #msgid "Closest Flag: Obesity" #msgstr "" #msgid "Closest Flag: Left Turn Only" #msgstr "" #msgid "Closest Flag: Right Turn Only" #msgstr "" #msgid "Closest Flag: Momentum" #msgstr "" #msgid "Closest Flag: Blindness" #msgstr "" #msgid "Closest Flag: Jamming" #msgstr "" #msgid "Closest Flag: Wide Angle" #msgstr "" # Ostatni # Other #msgid "Server started." #msgstr "" #msgid "Shot myself" #msgstr "" # !!! Hlaseni nize nelze prelozit :-( # !!! Messages below cannot be translated :-( # Informace o vlajce, kterou sebrali hraci # Informations about flags grabbed by opponents #msgid "grabbed High Speed flag" #msgstr "" #msgid "grabbed Quick Turn flag" #msgstr "" #msgid "grabbed Oscillation Overthurster flag" #msgstr "" #msgid "grabbed Rapid Fire flag" #msgstr "" #msgid "grabbed Machine Gun flag" #msgstr "" #msgid "grabbed Guided Missile flag" #msgstr "" #msgid "grabbed Laser flag" #msgstr "" #msgid "grabbed Ricochet flag" #msgstr "" #msgid "grabbed Super Bullet flag" #msgstr "" #msgid "grabbed Stealth flag" #msgstr "" #msgid "grabbed Cloaking flag" #msgstr "" #msgid "grabbed Invisible Bullet flag" #msgstr "" #msgid "grabbed Tiny flag" #msgstr "" #msgid "grabbed Narrow flag" #msgstr "" #msgid "grabbed Shield flag" #msgstr "" #msgid "grabbed Steamroller flag" #msgstr "" #msgid "grabbed Shock Wave flag" #msgstr "" #msgid "grabbed Phantom Zone flag" #msgstr "" #msgid "grabbed Genocide flag" #msgstr "" #msgid "grabbed Jumping flag" #msgstr "" #msgid "grabbed Identify flag" #msgstr "" #msgid "rabbed Colorblindness flag" #msgstr "" #msgid "grabbed Obesity flag" #msgstr "" #msgid "grabbed Left Turn Only flag" #msgstr "" #msgid "grabbed Right Turn Only flag" #msgstr "" #msgid "grabbed Momentum flag" #msgstr "" #msgid "grabbed Blindness flag" #msgstr "" #msgid "grabbed Jamming flag" #msgstr "" #msgid "grabbed Wide Angle flag" #msgstr "" # Ostatni hlasky, ktere nelze prelozit # Other messages that cannot be translated #msgid "Pausing in" #msgstr "" #msgid "Press Pause to resume" #msgstr "" #msgid "Got shot by " #msgstr "" #msgid "got skewred by " #msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "p radarn. Den gulmarkerade 'V'-symbolen r ditt synflt. " msgid "is indicated by the letter N." msgstr "Norr anges med bokstaven N." msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "Ditt synflt (HUD) visar en del viktig information. De tv rutorna i centrum" msgid "center of the view are the motion control boxes; within the small box" msgstr "anvnds fr att kontrollera hur du kr. Innanfr den innersta (minsta)" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "rr du dig inte och utanfr den strsta s kan din stridsvagn inte rra " msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "sig fortare n den redan gr. Genom att flytta" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "musen ver/under den lilla rutan kr du framt/bakt. Det samma gller " msgid "The distance away from the small box determines the speed." msgstr "hger och vnster. " # Help 8 Strings msgid "Above the larger box is a tape showing your current heading. North is" msgstr "Ovanfr den stora rutan finns en kompass som visar din riktning. Norr r" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "0, st r 90, osv. Om du kan hoppa visas en skala, fr" msgid "an altitude tape appears to the right of the larger box." msgstr "vilken hjd du befinner dig p, till hger om den strre rutan" msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "Sm frgade pilar eller diamanter kan visa sig i kompassen. En pil som " msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "pekar till vnster betyder att flaggan r till vnster om dig och motsvarande" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "gller om den pekar t hger. En diamant visar riktingen till flaggan" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "i frhllande till din nuvarande position." msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "I flaggervring visar den alltid riktningen till din egen flagga." msgid "A yellow marker shows the way to the antidote flag." msgstr "En gul pil/diamant visar vgen till en motgiftsflagga." msgid "At the top of the display are, from left to right, your callsign and" msgstr "verst frn vnster visas ditt namn, dina pong," msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "din status och vilken flagga du har. Namnet r i din lagfrg" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "och din status r antingen: klar, dd, innesluten, fantom" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "eller laddar om (samt hur lng tid detta tar). Det kan ocks visa " msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "tiden tills en dlig flagga slpps (om den r tidsbegrnsad)." msgid "Other informational messages may occasionally flash on the HUD." msgstr "Av och till kan annan information visas p din HUD." # BZFS Messages msgid "You are now an administrator!" msgstr "Du har nu administratrsstatus!" msgid "Wrong Password!" msgstr "Felaktigt lsenord." msgid "unknown command" msgstr "oknt kommando" msgid "Countdown started." msgstr "Nedrkning pbrjad" msgid "IP pattern added to banlist" msgstr "Adressfilter lagt till banlista" msgid "malformed address" msgstr "felaktigt adressformat" msgid "removed IP pattern" msgstr "Adressfilter borttaget" bzflag-2.4.2+ds1/data/l10n/bzflag_xx.po000066400000000000000000001325651200563112200174620ustar00rootroot00000000000000# This is a generic l10n file, copy it to a real language po file and modify that one # Locales are specifed in three parts separated by underscores # en_US_l33t, for example # The first part is the base language, the second part is a country code, the third part is a dialect # The second and third parts are optional, but if you want to specify a dialect, you need to specify the country # so, _[[_]] # Language codes can be found at # http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt # Country codes can be found at # http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html # name your resultant file: bzflag_.po # When run, pick a locale like bzflag -locale en_US_l33t # Your locale will be saved in the bzc file, so you can modify it there as well # locale files are cummulative. That is, if you specify a locale that contains a country and dialect, # the base language file is first loaded, and any strings found in the country file replace the base ones, and then # strings found in the dialect file replace the country one. So if you have two or three language files based # on one language, you only need to put the changes in the country and dialect one. The two (or three) files are merged # at runtime. # If you don't know a translation for a phrase, just comment out the msgid and msgstr for that entry # Use the pound # character to comment a line out msgid "xx" msgstr "Translation Base" msgid "translator" msgstr "Translator Name" ############# ## GENERAL ## ############# msgid "Off" msgstr "" msgid "On" msgstr "" msgid "Unavailable" msgstr "" msgid "None" msgstr "" msgid "Fast" msgstr "" msgid "Best" msgstr "" msgid "NOTE: " msgstr "" msgid "Page {1} of {2}" msgstr "" msgid "Auto" msgstr "" msgid "Pause/Resume:" msgstr "" msgid "Slow Keyboard Motion:" msgstr "" msgid "" msgstr "" msgid "No" msgstr "" msgid "Yes" msgstr "" msgid "N/A" msgstr "" msgid "Failed... unknown error (%d)." msgstr "" msgid "Silenced All Msgs" msgstr "" msgid " or " msgstr "" ################## ## INPUT EVENTS ## ################## msgid "Pause" msgstr "" msgid "Home" msgstr "" msgid "End" msgstr "" msgid "Left Arrow" msgstr "" msgid "Right Arrow" msgstr "" msgid "Up Arrow" msgstr "" msgid "Down Arrow" msgstr "" msgid "Page Up" msgstr "" msgid "Page Down" msgstr "" msgid "Insert" msgstr "" msgid "Backspace" msgstr "" msgid "Delete" msgstr "" msgid "Kp0" msgstr "" msgid "Kp1" msgstr "" msgid "Kp2" msgstr "" msgid "Kp3" msgstr "" msgid "Kp4" msgstr "" msgid "Kp5" msgstr "" msgid "Kp6" msgstr "" msgid "Kp7" msgstr "" msgid "Kp8" msgstr "" msgid "Kp9" msgstr "" msgid "Kp_Period" msgstr "" msgid "Kp_Divide" msgstr "" msgid "Kp_Multiply" msgstr "" msgid "Kp_Minus" msgstr "" msgid "Kp_Plus" msgstr "" msgid "Kp_Enter" msgstr "" msgid "Kp_Equals" msgstr "" msgid "F1" msgstr "" msgid "F2" msgstr "" msgid "F3" msgstr "" msgid "F4" msgstr "" msgid "F5" msgstr "" msgid "F6" msgstr "" msgid "F7" msgstr "" msgid "F8" msgstr "" msgid "F9" msgstr "" msgid "F10" msgstr "" msgid "F11" msgstr "" msgid "F12" msgstr "" msgid "Help" msgstr "" msgid "Print" msgstr "" msgid "Sysreq" msgstr "" msgid "Break" msgstr "" msgid "Menu" msgstr "" msgid "Power" msgstr "" msgid "Euro" msgstr "" msgid "Undo" msgstr "" msgid "Left Mouse" msgstr "" msgid "Middle Mouse" msgstr "" msgid "Right Mouse" msgstr "" msgid "Wheel Up" msgstr "" msgid "Wheel Down" msgstr "" msgid "Mouse Button 6" msgstr "" msgid "Mouse Button 7" msgstr "" msgid "Mouse Button 8" msgstr "" msgid "Mouse Button 9" msgstr "" msgid "Mouse Button 10" msgstr "" msgid "Joystick Button 1" msgstr "" msgid "Joystick Button 2" msgstr "" msgid "Joystick Button 3" msgstr "" msgid "Joystick Button 4" msgstr "" msgid "Joystick Button 5" msgstr "" msgid "Joystick Button 6" msgstr "" msgid "Joystick Button 7" msgstr "" msgid "Joystick Button 8" msgstr "" msgid "Joystick Button 9" msgstr "" msgid "Joystick Button 10" msgstr "" msgid "Joystick Button 11" msgstr "" msgid "Joystick Button 12" msgstr "" msgid "LastButton" msgstr "" msgid "Tab" msgstr "" msgid "Enter" msgstr "" msgid "Space" msgstr "" ################# ## SUPER FLAGS ## ################# msgid "If it's yours, prevent other teams from taking it. If it's not take it to your base to capture it!" msgstr "" msgid "High Speed" msgstr "" msgid "High speed (+V)" msgstr "" msgid "Tank moves faster. Outrun bad guys." msgstr "" msgid "Quick Turn" msgstr "" msgid "Quick Turn (+QT)" msgstr "" msgid "Tank turns faster. Good for dodging." msgstr "" msgid "Oscillation Overthruster" msgstr "" msgid "Oscillation Overthruster (+OO)" msgstr "" msgid "Can drive through buildings. Can't backup or shoot while inside." msgstr "" msgid "Rapid Fire" msgstr "" msgid "rapid Fire (+F)" msgstr "" msgid "Shoots more often. Shells go faster but not as far." msgstr "" msgid "Machine Gun" msgstr "" msgid "Machine Gun (+MG)" msgstr "" msgid "Very fast reload and very short range." msgstr "" msgid "Guided Missile" msgstr "" msgid "Guided Missile (+GM)" msgstr "" msgid "Shots track a target. Lock on with right button. Can lock on or retarget after firing." msgstr "" msgid "Laser" msgstr "" msgid "Laser (+L)" msgstr "" msgid "Shoots a laser. Infinite speed and range but long reload time." msgstr "" msgid "Ricochet" msgstr "" msgid "Ricochet (+R)" msgstr "" msgid "Shots bounce off walls. Don't shoot yourself!" msgstr "" msgid "Super Bullet" msgstr "" msgid "Super Bullet (+SB)" msgstr "" msgid "Shoots through buildings. Can kill Phantom Zone." msgstr "" msgid "Invisible Bullet" msgstr "" msgid "Invisible Bullet (+IB)" msgstr "" msgid "Your shots don't appear on other radars. Can still see them out window." msgstr "" msgid "Stealth" msgstr "" msgid "STealth (+ST)" msgstr "" msgid "Tank is invisible on radar. Shots are still visible. Sneak up behind enemies!" msgstr "" msgid "Tiny" msgstr "" msgid "Tiny (+T)" msgstr "" msgid "Tank is small and can get through small openings. Very hard to hit." msgstr "" msgid "Narrow" msgstr "" msgid "Narrow (+N)" msgstr "" msgid "Tank is super thin. Very hard to hit from front but is normal size from side. Can get through small openings." msgstr "" msgid "Shield" msgstr "" msgid "SHield (+SH)" msgstr "" msgid "Getting hit only drops flag. Flag flies an extra-long time." msgstr "" msgid "Steamroller" msgstr "" msgid "SteamRoller (+SR)" msgstr "" msgid "Destroys tanks you touch but you have to get really close." msgstr "" msgid "Shock Wave" msgstr "" msgid "Shock Wave (+SW)" msgstr "" msgid "Firing destroys all tanks nearby. Don't kill teammates! Can kill tanks on/in buildings." msgstr "" msgid "Phantom Zone" msgstr "" msgid "Phantom Zone (+PZ)" msgstr "" msgid "Teleporting toggles Zoned effect. Zoned tank can drive through buildings. Zoned tank shoots Zoned bullets and can't be shot (except by superbullet, shock wave, and other Zoned tanks)." msgstr "" msgid "Genocide" msgstr "" msgid "Genocide (+G)" msgstr "" msgid "Killing one tank kills that tank's whole team." msgstr "" msgid "Jumping" msgstr "" msgid "JumPing (+JP)" msgstr "" msgid "Tank can jump. Use Tab key. Can't steer in the air." msgstr "" msgid "Identify" msgstr "" msgid "IDentify (+ID)" msgstr "" msgid "Identifies type of nearest flag." msgstr "" msgid "Cloaking" msgstr "" msgid "CLoaking (+CL)" msgstr "" msgid "Makes your tank invisible out-the-window. Still visible on radar." msgstr "" msgid "Useless" msgstr "" msgid "USeless (+US)" msgstr "" msgid "You have found the useless flag. Use it wisely." msgstr "" msgid "Masquerade" msgstr "" msgid "MasQuerade (+MQ)" msgstr "" msgid "In opponent's hud, you appear as a teammate." msgstr "" msgid "Seer" msgstr "" msgid "SEer (+SE)" msgstr "" msgid "See stealthed, cloaked and masquerading tanks as normal." msgstr "" msgid "Thief" msgstr "" msgid "THief (+TH)" msgstr "" msgid "Steal flags. Small and fast but can't kill." msgstr "" msgid "Burrow" msgstr "" msgid "BUrrow (+BU)" msgstr "" msgid "Tank burrows underground, impervious to normal shots, but can be steamrolled by anyone!" msgstr "" msgid "Wings" msgstr "" msgid "WinGs (+WG)" msgstr "" msgid "Tank can drive in air." msgstr "" msgid "Agility" msgstr "" msgid "Agility (+A)" msgstr "" msgid "Tank is quick and nimble making it easier to dodge." msgstr "" msgid "ReverseControls" msgstr "" msgid "ReverseControls (-RC)" msgstr "" msgid "Tank driving controls are reversed." msgstr "" msgid "Colorblindness" msgstr "" msgid "ColorBlindness (-CB)" msgstr "" msgid "Can't tell team colors. Don't shoot teammates!" msgstr "" msgid "Obesity" msgstr "" msgid "Obesity (-O)" msgstr "" msgid "Tank becomes very large. Can't fit through teleporters." msgstr "" msgid "Left Turn Only" msgstr "" msgid "Left Turn only (-LT)" msgstr "" msgid "Can't turn right." msgstr "" msgid "Right Turn Only" msgstr "" msgid "Right Turn only (-RT)" msgstr "" msgid "Can't turn left." msgstr "" msgid "Forward Only" msgstr "" msgid "Forward Only (-FO)" msgstr "" msgid "Can't drive in reverse." msgstr "" msgid "ReverseOnly" msgstr "" msgid "ReverseOnly (-RO)" msgstr "" msgid "Can't drive forward." msgstr "" msgid "Momentum" msgstr "" msgid "Momentum (-M)" msgstr "" msgid "Tank has inertia. Acceleration is limited." msgstr "" msgid "Blindness" msgstr "" msgid "Blindness (-B)" msgstr "" msgid "Can't see out window. Radar still works." msgstr "" msgid "Jamming" msgstr "" msgid "JaMming (-JM)" msgstr "" msgid "Radar doesn't work. Can still see." msgstr "" msgid "Wide Angle" msgstr "" msgid "Wide Angle (-WA)" msgstr "" msgid "Fish-eye lens distorts view." msgstr "" msgid "No Jumping" msgstr "" msgid "No Jumping (-NJ)" msgstr "" msgid "Tank can't jump." msgstr "" msgid "Trigger Happy" msgstr "" msgid "Trigger Happy (-TR)" msgstr "" msgid "Tank can't stop firing." msgstr "" msgid "Bouncy" msgstr "" msgid "BouncY (-BY)" msgstr "" msgid "Tank can't stop bouncing." msgstr "" msgid " flag" msgstr "" #################### ## AUDIO SETTINGS ## #################### msgid "Audio Settings" msgstr "" msgid "Sound Volume:" msgstr "" msgid "Unavailable" msgstr "" msgid "Driver:" msgstr "" msgid "Device:" msgstr "" msgid "Remote Sounds:" msgstr "" #################### ## CACHE SETTINGS ## #################### msgid "Cache Settings" msgstr "" msgid "Server List Cache:" msgstr "" msgid "Off / Backup Mode" msgstr "" msgid "5 Minutes" msgstr "" msgid "15 Minutes" msgstr "" msgid "30 Minutes" msgstr "" msgid "1 Hour" msgstr "" msgid "5 Hours" msgstr "" msgid "15 Hours" msgstr "" msgid "1 day" msgstr "" msgid "15 days" msgstr "" msgid "30 days" msgstr "" msgid "Clear Server List Cache" msgstr "" msgid "Cache Size (MB):" msgstr "" msgid "Clear Download Cache" msgstr "" msgid "Automatic Downloads:" msgstr "" msgid "Connection Updates:" msgstr "" msgid "Update Downloads" msgstr "" msgid "Updating Downloads" msgstr "" msgid "Download Cache Cleared" msgstr "" msgid "Server List Cache Cleared" msgstr "" ###################### ## DISPLAY SETTINGS ## ###################### msgid "Display Settings" msgstr "" msgid "Dithering:" msgstr "" msgid "Blending:" msgstr "" msgid "Smoothing:" msgstr "" msgid "Lighting:" msgstr "" msgid "None" msgstr "" msgid "Fast" msgstr "" msgid "Best" msgstr "" msgid "Texturing:" msgstr "" msgid "Nearest" msgstr "" msgid "Linear" msgstr "" msgid "Nearest Mipmap Nearest" msgstr "" msgid "Linear Mipmap Nearest" msgstr "" msgid "Nearest Mipmap Linear" msgstr "" msgid "Linear Mipmap Linear" msgstr "" msgid "AntiFlicker:" msgstr "" msgid "Anisotropic:" msgstr "" msgid "Quality:" msgstr "" msgid "Low" msgstr "" msgid "Medium" msgstr "" msgid "High" msgstr "" msgid "Experimental" msgstr "" msgid "Shadows:" msgstr "" msgid "Stipple" msgstr "" msgid "Stencil" msgstr "" msgid "Hidden Line:" msgstr "" msgid "Wireframe:" msgstr "" msgid "Depth Complexity:" msgstr "" msgid "Culling Tree:" msgstr "" msgid "Collision Tree:" msgstr "" msgid "Brightness:" msgstr "" msgid "Energy Saver:" msgstr "" msgid "Change Video Format" msgstr "" msgid "Video Format" msgstr "" msgid "Current Format:" msgstr "" msgid "" msgstr "" msgid "Press Enter to select and T to test a format. Esc to exit." msgstr "" msgid "" msgstr "" ############### ## DOWNLOADS ## ############### msgid "downloading: " msgstr "" msgid "Downloading texture (%d of %d): %d KB" msgstr "" msgid "not downloading: " msgstr "" msgid "NOTE: " msgstr "" msgid "download access is controlled by " msgstr "" msgid "local denial: " msgstr "" ###################### ## EFFECTS SETTINGS ## ###################### msgid "Effects Settings" msgstr "" msgid "Rain:" msgstr "" msgid "Mirror:" msgstr "" msgid "Fog:" msgstr "" msgid "Nice" msgstr "" msgid "Shot Length:" msgstr "" msgid "Display Treads:" msgstr "" msgid "Animated Treads:" msgstr "" msgid "Covered" msgstr "" msgid "Exposed" msgstr "" msgid "Track Marks:" msgstr "" msgid "Track Mark Culling:" msgstr "" msgid "Fancy Effects:" msgstr "" msgid "Spawn Effect:" msgstr "" msgid "Local Spawn Effect:" msgstr "" msgid "Same as spawns" msgstr "" msgid "Death Effect:" msgstr "" msgid "Shot Fired Effect:" msgstr "" msgid "Local Shot Effect:" msgstr "" msgid "Same as shots" msgstr "" msgid "Use Velocity on Shot Effects:" msgstr "" msgid "Landing Effect:" msgstr "" msgid "GM Smoke Effect:" msgstr "" msgid "GM Effect Timing:" msgstr "" msgid " Ricocet Effect:" msgstr "" msgid " Teleport Shot Effect:" msgstr "" msgid "Blossom" msgstr "" msgid "Cone" msgstr "" msgid "Rings" msgstr "" msgid "Smoke Rings" msgstr "" msgid "Muzzle Flash" msgstr "" msgid "Smoke and Flash" msgstr "" msgid "Classic Puff" msgstr "" msgid "Shock Cone" msgstr "" msgid "Smoke" msgstr "" msgid "Fancy Deaths" msgstr "" msgid "Dirt Flash" msgstr "" msgid "Ring" msgstr "" msgid "IDL" msgstr "" ################## ## GUI SETTINGS ## ################## msgid "GUI Settings" msgstr "" msgid "Radar Style:" msgstr "" msgid "Normal" msgstr "" msgid "Fast Sorted" msgstr "" msgid "Enhanced" msgstr "" msgid "Scoreboard Sort:" msgstr "" msgid "Always Show Team Scores:" msgstr "" msgid "Scoreboard Font Size:" msgstr "" msgid "Auto" msgstr "" msgid "ControlPanel Font Size:" msgstr "" msgid "Extended Observer Info:" msgstr "" msgid "On With Apparent Speeds" msgstr "" msgid "Full" msgstr "" msgid "Panel Opacity:" msgstr "" msgid "Radar Opacity:" msgstr "" msgid "Colored shots on radar:" msgstr "" msgid "Radar Shot Length:" msgstr "" msgid "Radar Shot Size:" msgstr "" msgid "Radar Shot Line:" msgstr "" msgid "Lagging" msgstr "" msgid "Leading" msgstr "" msgid "Leading & Lagging" msgstr "" msgid "Radar Position:" msgstr "" msgid "Left" msgstr "" msgid "Right" msgstr "" msgid "Radar & Panel Size:" msgstr "" msgid "Mouse Box Size:" msgstr "" msgid "Locale:" msgstr "" msgid "Default" msgstr "" msgid "Control panel tabs:" msgstr "" msgid "Control panel coloring:" msgstr "" msgid "Underline color:" msgstr "" msgid "Cyan" msgstr "" msgid "Grey" msgstr "" msgid "Text" msgstr "" msgid "Killer Highlight:" msgstr "" msgid "Pulsating" msgstr "" msgid "Underline" msgstr "" msgid "Pulsation Rate:" msgstr "" msgid "Pulsation Depth:" msgstr "" msgid "Time / Date Display:" msgstr "" msgid "time" msgstr "" msgid "date" msgstr "" msgid "both" msgstr "" msgid "Reload timer on HUD:" msgstr "" msgid "Motto Display Length:" msgstr "" ############### ## HELP MENU ## ############### msgid "Page Down for next page" msgstr "" msgid "Page Up for previous page" msgstr "" msgid "Controls" msgstr "" msgid "Mouse Position" msgstr "" msgid "Controls Tank Position:" msgstr "" msgid "Fires Shot:" msgstr "" msgid "Drops Flag (if not bad):" msgstr "" msgid "Identifies Player (locks on GM):" msgstr "" msgid "Short Radar Range:" msgstr "" msgid "Medium Radar Range:" msgstr "" msgid "Long Radar Range:" msgstr "" msgid "Zoom Radar In:" msgstr "" msgid "Zoom Radar Out:" msgstr "" msgid "Send Message to Everybody:" msgstr "" msgid "Send Message to Teammates:" msgstr "" msgid "Send Message to Nemesis:" msgstr "" msgid "Send Message to Recipient:" msgstr "" msgid "Jump (if allowed):" msgstr "" msgid "Toggle Binoculars:" msgstr "" msgid "Toggle Score Sheet:" msgstr "" msgid "Toggle Tank Labels:" msgstr "" msgid "Toggle Heads-up Flag Help:" msgstr "" msgid "Set Time of Day Backward:" msgstr "" msgid "Set Time of Day Forward:" msgstr "" msgid "Pause/Resume:" msgstr "" msgid "Self destruct/Cancel:" msgstr "" msgid "Quit:" msgstr "" msgid "Scroll Message Log Backward:" msgstr "" msgid "Scroll Message Log Forward:" msgstr "" msgid "Slow Keyboard Motion:" msgstr "" msgid "Toggle Radar Flags:" msgstr "" msgid "Toggle Main Flags:" msgstr "" msgid "Silence/UnSilence:" msgstr "" msgid "Server Admin:" msgstr "" msgid "Hunt:" msgstr "" msgid "Auto Pilot:" msgstr "" msgid "Main Message Tab:" msgstr "" msgid "Chat Message Tab:" msgstr "" msgid "Server Message Tab:" msgstr "" msgid "Misc Message Tab:" msgstr "" msgid "Esc" msgstr "" msgid "Show/Dismiss menu:" msgstr "" msgid "" msgstr "" msgid " or " msgstr "" msgid "General" msgstr "" msgid "BZFlag is a multi-player networked tank battle game. There are five teams:" msgstr "" msgid "red, green, blue, purple, and rogues (rogue tanks are black). Destroying a" msgstr "" msgid "player on another team scores a win, while being destroyed or destroying a" msgstr "" msgid "teammate scores a loss. Individual and aggregate team scores are tallied." msgstr "" msgid "Rogues have no teammates (not even other rogues),so they cannot shoot" msgstr "" msgid "teammates and they don't have a team score." msgstr "" msgid "There are four styles of play, determined by the server configuration: capture-" msgstr "" msgid "the-flag, rabbit-chase, free-for-all and open-free-for-all. In free-for-all the" msgstr "" msgid "object is simply to get the highest score by shooting opponents. In open-free-" msgstr "" msgid "for-all highest score is still the goal but there are no teams. In rabbit chase," msgstr "" msgid "the white tank tries to stay alive while all other tanks try to hunt and kill it." msgstr "" msgid "The object in capture-the-flag is to capture enemy flags while preventing opponents" msgstr "" msgid " from capturing yours. In this style, each team (but not rogues) has a team base" msgstr "" msgid "and each team with at least one player has a team flag which has the color of the team." msgstr "" msgid "To capture a flag, you must grab it and bring it back to your team base (you must be" msgstr "" msgid "on the ground in your base to register the capture). Capturing a flag destroys" msgstr "" msgid "all the players on that team and gives your team score a bonus; the players will" msgstr "" msgid "restart on their team base. Taking your flag onto an enemy base counts as a capture" msgstr "" msgid "against your team but not for the enemy team." msgstr "" msgid "Environment" msgstr "" msgid "The world environment contains an outer wall and several buildings." msgstr "" msgid "You cannot go outside the outer wall (you can't even jump over it)." msgstr "" msgid "You cannot normally drive or shoot through buildings." msgstr "" msgid "The server may be configured to include teleporters: large transparent" msgstr "" msgid "black slabs. Objects entering one side of a teleporter are instantly" msgstr "" msgid "moved to one side of another (or possibly the same) teleporter. The" msgstr "" msgid "teleport is reversible; reentering the same side of the destination" msgstr "" msgid "teleporter brings you back to where you started. Teleport connections" msgstr "" msgid "are fixed at the start of the game and don't change during the game." msgstr "" msgid "The connections are always the same in the capture-the-flag style." msgstr "" msgid "Each side of a teleporter teleports independently of the other side." msgstr "" msgid "It's possible for a teleporter to teleport to the opposite side of" msgstr "" msgid "itself. Such a thru-teleporter acts almost as if it wasn't there." msgstr "" msgid "A teleporter can also teleport to the same side of itself. This is a" msgstr "" msgid "reverse teleporter. Shooting at a reverse teleporter is likely to be" msgstr "" msgid "self destructive; shooting a laser at one is invariably fatal." msgstr "" msgid "Flags" msgstr "" msgid "Flags come in two varieties: team flags and super flags. Team flags" msgstr "" msgid "are used only in the capture-the-flag style. The server may also be" msgstr "" msgid "configured to supply super flags, which give your tank some advantage" msgstr "" msgid "or disadvantage. You normally can't tell which until you pick one up," msgstr "" msgid "but good flags generally outnumber bad flags two to one." msgstr "" msgid "Team flags are not allowed to be in Bad Places. Bad Places are: on" msgstr "" msgid "a building or on an enemy base. Team flags dropped in a Bad Place are" msgstr "" msgid "moved to a safety position. Captured flags are placed back on their" msgstr "" msgid "team base. Super flags dropped above a building always disappear." msgstr "" msgid "A random good super flag will remain for up to 4 possessions. After" msgstr "" msgid "that it'll disappear and will eventually be replaced by a new random" msgstr "" msgid "flag. Bad random super flags disappear after the first possession." msgstr "" msgid "Bad super flags can't normally be dropped. The server can be set to" msgstr "" msgid "automatically drop the flag for you after some time, after you destroy" msgstr "" msgid "a certain number of enemies, and/or when you grab an antidote flag." msgstr "" msgid "Antidote flags are yellow and only appear when you have a bad flag." msgstr "" msgid "Good Flags" msgstr "" msgid "Good Flags:" msgstr "" msgid "Bad Flags" msgstr "" msgid "Bad Flags:" msgstr "" msgid "Readouts I" msgstr "" msgid "The radar is on the left side of the control panel. It shows an overhead" msgstr "" msgid "x-ray view of the game. Buildings and the outer wall are shown in light" msgstr "" msgid "blue. Team bases are outlined in the team color. Teleporters are short" msgstr "" msgid "yellow lines. Tanks are dots in the tank's team color, except rogues are" msgstr "" msgid "yellow. The size of the tank's dot is a rough indication of the tank's" msgstr "" msgid "altitude: higher tanks have larger dots. Flags are small crosses. Team" msgstr "" msgid "flags are in the team color, superflags are white, and the antidote flag" msgstr "" msgid "is yellow. Shots are small dots (or lines or circles, for lasers and" msgstr "" msgid "shock waves, respectively). Your tank is always dead center and forward" msgstr "" msgid "is always up on the radar. The yellow V is your field of view. North" msgstr "" msgid "is indicated by the letter N." msgstr "" msgid "The heads-up-display (HUD) has several displays. The two boxes in the" msgstr "" msgid "center of the view are the motion control boxes; within the small box" msgstr "" msgid "your tank won't move, outside the large box you don't move any faster than" msgstr "" msgid "at the edge of the large box. Moving the mouse above or below the small" msgstr "" msgid "box moves forward or backward, respectively. Similarly for left and right." msgstr "" msgid "The distance away from the small box determines the speed." msgstr "" msgid "Readouts II" msgstr "" msgid "Above the larger box is a tape showing your current heading. North is" msgstr "" msgid "0, east is 90, etc. If jumping is allowed or you have the jumping flag," msgstr "" msgid "an altitude tape appears to the right of the larger box." msgstr "" msgid "Small colored diamonds or arrows may appear on the heading tape. An" msgstr "" msgid "arrow pointing left means that a particular flag is to your left, an" msgstr "" msgid "arrow pointing right means that the flag is to your right, and a diamond" msgstr "" msgid "indicates the heading to the flag by its position on the heading tape." msgstr "" msgid "In capture-the-flag mode a marker always shows where your team flag is." msgstr "" msgid "A yellow marker shows the way to the antidote flag." msgstr "" msgid "At the top of the display are, from left to right, your callsign and" msgstr "" msgid "score, your status, and the flag you have. Your callsign is in the" msgstr "" msgid "color of your team. Your status is one of: ready, dead, sealed, zoned" msgstr "" msgid "or reloading (showing the time until reloaded). It can also show the" msgstr "" msgid "time until a bad flag is dropped (if there's a time limit)." msgstr "" msgid "Other informational messages may occasionally flash on the HUD." msgstr "" msgid "Credits" msgstr "" msgid "Maintainer:" msgstr "" msgid "Original Author:" msgstr "" msgid "Code Contributors:" msgstr "" msgid "Tank Models:" msgstr "" msgid "Special Thanks:" msgstr "" msgid "BZFlag Home Page:" msgstr "" msgid "Copyright (c) 1993-2012" msgstr "" #################### ## HUD RENDERERER ## #################### # Translated input events are not working here msgid "Press %s to start" msgstr "" msgid "Press Pause to resume" msgstr "" msgid "AutoPilot on" msgstr "" msgid "Press Destruct to cancel" msgstr "" msgid "GAME OVER" msgstr "" msgid "Send:" msgstr "" msgid "Target Info" msgstr "" msgid "Position [%d %d %d]" msgstr "" msgid "Linear Speed:" msgstr "" msgid "Vertical Speed:%5.2f" msgstr "" msgid "Vertical Speed:%5.2f(%5.2f)" msgstr "" msgid "Angular Speed:" msgstr "" msgid "Last Shot Info Time:%6.4f Deviation:%6.3f" msgstr "" msgid "ReportedHits %d ComputedHits %d ratio %f" msgstr "" msgid "Dead" msgstr "" msgid "Ready" msgstr "" msgid "Reloaded in %.1f" msgstr "" msgid "Sealed" msgstr "" msgid "Zoned" msgstr "" msgid "FPS: %d" msgstr "" msgid "rtris: %i" msgstr "" msgid "tris: %i" msgstr "" msgid "time: %dms" msgstr "" ############### ## JOIN MENU ## ############### msgid "Join Game" msgstr "" msgid "Find Server" msgstr "" msgid "Connect" msgstr "" msgid "Callsign:" msgstr "" msgid "Password:" msgstr "" msgid "Team:" msgstr "" msgid "Server:" msgstr "" msgid "Port:" msgstr "" msgid "Motto:" msgstr "" msgid "Start Server" msgstr "" msgid "You must enter a callsign." msgstr "" msgid "You must enter a server." msgstr "" msgid "Port is invalid. Try %d." msgstr "" msgid "Trying..." msgstr "" ########## ## TEAM ## ########## msgid "Automatic" msgstr "" msgid "Rogue" msgstr "" msgid "Red Team" msgstr "" msgid "Green Team" msgstr "" msgid "Blue Team" msgstr "" msgid "Purple Team" msgstr "" msgid "Observer" msgstr "" msgid "Rabbit" msgstr "" msgid "Hunter" msgstr "" msgid "No Team??" msgstr "" msgid "Invalid team" msgstr "" #################### ## INPUT SETTINGS ## #################### msgid "Input Settings" msgstr "" msgid "Change Key Mapping" msgstr "" msgid "Joystick device:" msgstr "" msgid "Active input device:" msgstr "" msgid "Force feedback:" msgstr "" msgid "Rumble" msgstr "" msgid "Directional" msgstr "" msgid "Joystick X Axis:" msgstr "" msgid "Joystick Y Axis:" msgstr "" msgid "Confine mouse:" msgstr "" msgid "Window" msgstr "" msgid "MotionBox" msgstr "" msgid "Jump while typing:" msgstr "" ####################### ## KEYBOARD MAP MENU ## ####################### msgid "Key Mapping" msgstr "" msgid "Use up/down arrows to navigate, enter key to enter edit mode" msgstr "" msgid "Reset Defaults" msgstr "" msgid "Fire shot:" msgstr "" msgid "Drop flag:" msgstr "" msgid "Identify/Lock On:" msgstr "" msgid "Radar Short:" msgstr "" msgid "Radar Medium:" msgstr "" msgid "Radar Long:" msgstr "" msgid "Radar Zoom In:" msgstr "" msgid "Radar Zoom Out:" msgstr "" msgid "Send to All:" msgstr "" msgid "Send to Teammates:" msgstr "" msgid "Send to Nemesis:" msgstr "" msgid "Send to Recipient:" msgstr "" msgid "Send to Admin:" msgstr "" msgid "Jump:" msgstr "" msgid "Binoculars:" msgstr "" msgid "Toggle Score:" msgstr "" msgid "Toggle Radar:" msgstr "" msgid "Toggle Console:" msgstr "" msgid "Tank Labels:" msgstr "" msgid "Flag Help:" msgstr "" msgid "Time Forward:" msgstr "" msgid "Time Backward:" msgstr "" msgid "Self Destruct/Cancel:" msgstr "" msgid "Fast Quit:" msgstr "" msgid "Scroll Backward:" msgstr "" msgid "Scroll Forward:" msgstr "" msgid "Scroll Bottom:" msgstr "" msgid "Toggle Flags On Radar:" msgstr "" msgid "Toggle Flags On Field:" msgstr "" msgid "Silence/UnSilence Key:" msgstr "" msgid "Server Command Key:" msgstr "" msgid "Hunt Key:" msgstr "" msgid "Add/Modify Hunt Key:" msgstr "" msgid "AutoPilot Key: " msgstr "" msgid "Main Message Tab: " msgstr "" msgid "Chat Message Tab: " msgstr "" msgid "Server Message Tab: " msgstr "" msgid "Misc Message Tab: " msgstr "" msgid "Forward Key: " msgstr "" msgid "Reverse Key: " msgstr "" msgid "Left Key: " msgstr "" msgid "Right Key: " msgstr "" msgid "Restart:" msgstr "" msgid "Iconify:" msgstr "" msgid "Fullscreen:" msgstr "" msgid "Screenshot:" msgstr "" msgid "Define Quick Keys" msgstr "" msgid "Notice: depending on platform not all keys might work" msgstr "" msgid "Send to All" msgstr "" msgid "Send to Team" msgstr "" ############### ## MAIN MENU ## ############### msgid "Up/Down arrows to move, Enter to select, Esc to dismiss" msgstr "" msgid "Options" msgstr "" msgid "Save Settings" msgstr "" msgid "Leave Game" msgstr "" msgid "Quit" msgstr "" ############### ## QUIT MENU ## ############### msgid "Enter to quit, Esc to resume" msgstr "" msgid "Really quit?" msgstr "" ############# ## OPTIONS ## ############# msgid "Save Settings:" msgstr "" msgid "On Exit" msgstr "" msgid "Save identity:" msgstr "" msgid "Username only" msgstr "" msgid "Username and password" msgstr "" ################ ## SAVE WORLD ## ################ msgid "Save World" msgstr "" msgid "File Name:" msgstr "" msgid "No world loaded to save" msgstr "" msgid "World Saved: " msgstr "" msgid "Error Saving: " msgstr "" ###################################### ## MESSAGE OF THE DAY & NEW VERSION ## ###################################### msgid "MOTD contains unexpected data" msgstr "" msgid "" msgstr "" msgid "UPGRADE: " msgstr "" msgid "Message of the day: " msgstr "" msgid "A new version of BZFlag has been released!" msgstr "" msgid "Would you like to upgrade now?" msgstr "" msgid "(Download and install: " msgstr "" msgid "Yes!" msgstr "" msgid "Not yet" msgstr "" msgid "Please upgrade as soon as possible." msgstr "" msgid "OK" msgstr "" msgid "Downloading update: %d/%d KB" msgstr "" msgid "Failed... can't find upgrade installer." msgstr "" msgid "Failed... not enough memory." msgstr "" msgid "Failed... installer is not executable." msgstr "" msgid "Failed... unknown error (%d)." msgstr "" msgid "Failed to start upgrade installer (%s) - error %d.\n" msgstr "" msgid "Installer started." msgstr "" msgid "Download Failed!" msgstr "" msgid "Downloading update: 8888/8888 KB" msgstr "" ############# ## ROAMING ## ############# msgid "Roaming::changeTarget() no world, switching to free roaming\n" msgstr "" msgid "Rabbit " msgstr "" msgid "Tracking " msgstr "" msgid "Following " msgstr "" msgid "Driving with " msgstr "" msgid " Flag" msgstr "" msgid "Roaming" msgstr "" ################# ## SCORE BOARD ## ################# msgid "Score" msgstr "" msgid "888~888 Hunt->" msgstr "" msgid " Kills" msgstr "" msgid "Player" msgstr "" msgid "[Score]" msgstr "" msgid "[Normalized Score]" msgstr "" msgid "[Callsign]" msgstr "" msgid "[Team Kills]" msgstr "" msgid "[TK ratio]" msgstr "" msgid "[Team]" msgstr "" msgid "[1on1]" msgstr "" msgid "Hunt->" msgstr "" msgid "Team Score" msgstr "" msgid "Team Flags" msgstr "" msgid "TK Leader " msgstr "" msgid "TK Ratio Leader " msgstr "" msgid "Leader " msgstr "" ##################### ## SERVER COMMANDS ## ##################### msgid "Kick -> " msgstr "" msgid "Kill -> " msgstr "" msgid "Set players group " msgstr "" msgid "Remove player from group " msgstr "" msgid "Ghost player [enter your pass] " msgstr "" msgid "Show player's groups " msgstr "" msgid "Kick :" msgstr "" msgid "Kill :" msgstr "" msgid "Ban :" msgstr "" msgid "Set player's group :" msgstr "" msgid "Remove player from group :" msgstr "" msgid "Ghost :" msgstr "" msgid "Show players group :" msgstr "" msgid "Unban :" msgstr "" msgid "Show ban list" msgstr "" msgid "Show player list" msgstr "" msgid "Reset Flags" msgstr "" msgid "Reset Unused Flags" msgstr "" msgid "Remove Flags" msgstr "" msgid "End Game" msgstr "" msgid "Restart Countdown:" msgstr "" msgid "Show Flag Info" msgstr "" msgid "Shut Down Server" msgstr "" msgid "Disconnect all Players" msgstr "" msgid "Lag Warning threshold:" msgstr "" msgid "Maximum lag warnings:" msgstr "" msgid "Idle Stats" msgstr "" msgid "Client Version Query" msgstr "" msgid "Lag / Ping Stats" msgstr "" msgid "Flag History" msgstr "" msgid "Admin Password:" msgstr "" msgid "Send Report to Server:" msgstr "" msgid "List Groups" msgstr "" msgid "List Permissions" msgstr "" msgid "Vote:" msgstr "" msgid "Call a Poll:" msgstr "" msgid "Cancel a Poll" msgstr "" ################# ## SERVER LINK ## ################# msgid "Remote %s\n" msgstr "" msgid "Connected Event" msgstr "" msgid "CONNECT:send in connect returned %d\n" msgstr "" msgid "CONNECT:select in connect failed, nfound = %d\n" msgstr "" msgid "CONNECT:got net data in connect, bytes read = %d\n" msgstr "" msgid "CONNECT:Time To Connect = %f\n" msgstr "" msgid "CONNECT:connect time out failed\n" msgstr "" msgid "CONNECT:connect loop count = %d\n" msgstr "" msgid "Error writing on packetStream" msgstr "" msgid "Server network statistics:\n" msgstr "" msgid " elapsed time : %f\n" msgstr "" msgid " bytes sent : %d (%f/sec)\n" msgstr "" msgid " packets sent : %d (%f/sec)\n" msgstr "" msgid " bytes/packet : %f\n" msgstr "" msgid " bytes recieved : %d (%f/sec)\n" msgstr "" msgid " packets received: %d (%f/sec)\n" msgstr "" msgid "<** UDP Packet Code %x Len %x\n" msgstr "" msgid "Fallback to normal TCP receive" msgstr "" msgid "Communication error joining game [No immediate respose]." msgstr "" msgid "Server forced disconnection." msgstr "" msgid "Error: getsockname() failed, cannot get TCP port?" msgstr "" msgid "Network: Created local UDP downlink port {1}" msgstr "" msgid "Error: Unable to set NonBlocking for UDP receive socket" msgstr "" msgid "Server got our UDP, using UDP to server" msgstr "" msgid "Got server's UDP packet back, server using UDP" msgstr "" msgid "Servers" msgstr "" ####################### ## SERVER START MENU ## ####################### msgid "Players" msgstr "" msgid "Rogue" msgstr "" msgid "Red" msgstr "" msgid "Green" msgstr "" msgid "Blue" msgstr "" msgid "Purple" msgstr "" msgid "Observers" msgstr "" msgid "Press +/- add/remove favorites f - toggle view" msgstr "" msgid "Edit Filter:" msgstr "" msgid "Press '/' to search" msgstr "" msgid "Using filter:" msgstr "" msgid "{1} Shot" msgstr "" msgid "{1} Shots" msgstr "" msgid "Classic Capture-the-Flag" msgstr "" msgid "Rabbit Chase" msgstr "" msgid "Open (Teamless) Free-For-All" msgstr "" msgid "Free-style" msgstr "" msgid "Super Flags" msgstr "" msgid "Antidote Flags" msgstr "" msgid "{1} sec To Drop Bad Flag" msgstr "" msgid "{1} secs To Drop Bad Flag" msgstr "" msgid "{1} Win Drops Bad Flag" msgstr "" msgid "{1} Wins Drops Bad Flag" msgstr "" msgid "Handicap" msgstr "" msgid "Time limit: {1}" msgstr "" msgid "Max team score: {1}" msgstr "" msgid "Max player score: {1}" msgstr "" msgid "Cached" msgstr "" msgid "Searching" msgstr "" msgid "Favorite servers: {1}/{2} ({3} players, {4} observers)" msgstr "" msgid "Servers found: {1}/{2} ({3} players, {4} observers)" msgstr "" msgid "Style:" msgstr "" msgid "Capture the Flag" msgstr "" msgid "Free for All" msgstr "" msgid "Rabbit Hunt (Random Selection)" msgstr "" msgid "Rabbit Hunt (Score-based Selection)" msgstr "" msgid "Rabbit Hunt (Killer Selection)" msgstr "" msgid "Max Players:" msgstr "" msgid "Max Shots:" msgstr "" msgid "Teleporters:" msgstr "" msgid "no" msgstr "" msgid "yes" msgstr "" msgid "Ricochet:" msgstr "" msgid "Jumping:" msgstr "" msgid "Handicap:" msgstr "" msgid "Superflags:" msgstr "" msgid "good flags only" msgstr "" msgid "all flags" msgstr "" msgid "Max Superflags:" msgstr "" msgid "Bad Flag Antidote:" msgstr "" msgid "Bad Flag Time Limit:" msgstr "" msgid "no limit" msgstr "" msgid "15 seconds" msgstr "" msgid "30 seconds" msgstr "" msgid "60 seconds" msgstr "" msgid "180 seconds" msgstr "" msgid "Bad Flag Win Limit:" msgstr "" msgid "drop after 1 win" msgstr "" msgid "drop after 2 wins" msgstr "" msgid "drop after 3 wins" msgstr "" msgid "Game Over:" msgstr "" msgid "never" msgstr "" msgid "after 5 minutes" msgstr "" msgid "after 15 minutes" msgstr "" msgid "after 60 minutes" msgstr "" msgid "after 3 hours" msgstr "" msgid "when a player gets +3" msgstr "" msgid "when a player gets +10" msgstr "" msgid "when a player gets +25" msgstr "" msgid "when a team gets +3" msgstr "" msgid "when a team gets +10" msgstr "" msgid "when a team gets +25" msgstr "" msgid "when a team gets +100" msgstr "" msgid "Server Reset:" msgstr "" msgid "no, quit after game" msgstr "" msgid "yes, reset for more games" msgstr "" msgid "World Map:" msgstr "" msgid "random map" msgstr "" msgid "Start" msgstr "" msgid "Failed... can't find server program." msgstr "" msgid "Failed... server program is not executable." msgstr "" msgid "Failed to start server (%s) - error %d.\n" msgstr "" msgid "Server started." msgstr "" msgid "Failed... cannot fork." msgstr "" msgid "Failed (exit = %i)." msgstr "" msgid "Failed (signal = %i)." msgstr "" msgid "Failed." msgstr "" msgid "localhost" msgstr "" ################ ## STATISTICS ## ################ msgid "Shot Statistics" msgstr "" msgid "Shots Hit/Fired" msgstr "" msgid "Super" msgstr "" msgid "Shock" msgstr "" msgid "Fave." msgstr "" msgid "Hit%" msgstr "" msgid "Total" msgstr "" msgid "Norm" msgstr "" msgid "GM" msgstr "" msgid "Bullet" msgstr "" msgid "Wave" msgstr "" msgid "Flag" msgstr "" ################# ## SILENCE KEY ## ################# msgid "Silenced " msgstr "" msgid "Unsilenced " msgstr "" msgid "Unblocked Msgs" msgstr "" msgid "Silenced All Msgs" msgstr "" msgid " Does not exist" msgstr "" msgid "Silence -->" msgstr "" msgid "Un" msgstr "" ###################### ## PLAYING MESSAGES ## ###################### msgid "Got shot by " msgstr "" msgid "Got flattened by " msgstr "" msgid "Team flag was captured by " msgstr "" msgid "Teammate hit with Genocide by " msgstr "" msgid "Tank Self Destructed" msgstr "" msgid "Tank Rusted" msgstr "" msgid "Flags on field hidden, to show them " msgstr "" msgid "hit \"" msgstr "" msgid " bind a key to Toggle Flags on Field" msgstr "" msgid "Flags on radar hidden, to show them " msgstr "" msgid " bind a key to Toggle Flags on Radar" msgstr "" msgid "To toggle the radar " msgstr "" msgid " bind a key to Toggle Radar" msgstr "" msgid "To toggle the console " msgstr "" msgid " bind a key to Toggle Console" msgstr "" msgid "ZSceneDatabase processed in %.3f seconds.\n" msgstr "" msgid "BSPSceneDatabase processed in %.3f seconds.\n" msgstr "" msgid "Download stopped by user action" msgstr "" msgid "The tank's motion is now frozen! ... Press Shift+` to unfreeze" msgstr "" msgid "Resumed" msgstr "" msgid "There does not appear to be any key bound to enter the game" msgstr "" msgid "Invalid player identification (%d)" msgstr "" msgid "WARNING: invalid player identification when adding player with id " msgstr "" msgid "Server error when adding player, player already added" msgstr "" msgid "WARNING: player already exists at location with id " msgstr "" msgid "joining as " msgstr "" msgid "an observer" msgstr "" msgid "a tank" msgstr "" msgid "a robot tank" msgstr "" msgid "an unknown type" msgstr "" msgid "IPINFO: " msgstr "" msgid "\t from: " msgstr "" msgid "signing off" msgstr "" msgid " from " msgstr "" msgid "(leave)" msgstr "" msgid "World cache files disappeared. Join canceled" msgstr "" msgid "Loading world into memory..." msgstr "" msgid "Error loading cached world. Join canceled" msgstr "" msgid "Verifying world integrity..." msgstr "" msgid "Error on md5. Removing offending file." msgstr "" msgid "Preparing world..." msgstr "" msgid "Error unpacking world database. Join canceled." msgstr "" msgid "Downloading files..." msgstr "" msgid "Loading world from " msgstr "" msgid "Download from URL failed" msgstr "" msgid "Problem writing cache" msgstr "" msgid "Downloading World..." msgstr "" msgid "Flags not supported by this client: {1}" msgstr "" msgid "Downloading World (%2d%% complete/%d kb remaining)..." msgstr "" msgid "sorry, i'm just a silly machine" msgstr "" msgid "Closest Flag: " msgstr "" msgid "Server forced a disconnect" msgstr "" msgid "Requesting World Hash..." msgstr "" msgid "Time Expired" msgstr "" msgid "Game Paused" msgstr "" msgid "[unknown player]" msgstr "" msgid " won the game" msgstr "" msgid "Roger taking controls" msgstr "" msgid "Roger releasing controls" msgstr "" msgid "has paused" msgstr "" msgid "has unpaused" msgstr "" msgid "Don't kill teammates!!!" msgstr "" msgid "blew myself up" msgstr "" msgid "destroyed by the server" msgstr "" msgid "destroyed by a (GHOST)" msgstr "" msgid "fell in the water" msgstr "" msgid "Unknown Deadly Obstacle" msgstr "" msgid "teammate " msgstr "" msgid "was fried by " msgstr "" msgid "'s laser" msgstr "" msgid "was destroyed by " msgstr "" msgid "'s guided missile" msgstr "" msgid "felt the effects of " msgstr "" msgid "'s shockwave" msgstr "" msgid "didn't see " msgstr "" msgid "'s bullet" msgstr "" msgid "was turned into swiss cheese by " msgstr "" msgid "'s machine gun" msgstr "" msgid "got skewered by " msgstr "" msgid "'s super bullet" msgstr "" msgid "killed by " msgstr "" msgid "Flag Alert!!!" msgstr "" msgid "Team Grab!!!" msgstr "" msgid "grabbed " msgstr "" msgid "took my flag into " msgstr "" msgid " territory" msgstr "" msgid "Don't capture your own flag!!!" msgstr "" msgid "captured " msgstr "" msgid "'s flag" msgstr "" msgid "You are now the rabbit." msgstr "" msgid "is now the rabbit" msgstr "" msgid "Received handicap update for unknown player!\n" msgstr "" msgid "Received score update for unknown player!\n" msgstr "" msgid "SERVER" msgstr "" msgid "(UNKNOWN)" msgstr "" msgid "Admin" msgstr "" msgid "Ignored Msg" msgstr "" msgid "[Admin] " msgstr "" msgid "[to " msgstr "" msgid "] " msgstr "" msgid "[Team] " msgstr "" msgid "(join)" msgstr "" msgid "Got custom flag type from server: %s\n" msgstr "" msgid "Paused" msgstr "" msgid "locked on me" msgstr "" msgid "Server communication error" msgstr "" msgid "Server BZDB change blocked: '%s' = '%s'\n" msgstr "" msgid "dropped " msgstr "" msgid " stole " msgstr "" msgid "Killed by unknown obstacle" msgstr "" msgid "Invalid reason" msgstr "" msgid "Shot myself" msgstr "" msgid "Killed by the server" msgstr "" msgid " with " msgstr "" msgid "local collision with " msgstr "" msgid "Locked on " msgstr "" msgid ") with " msgstr "" msgid "'identify' disabled on this server" msgstr "" msgid "Looking at a tank" msgstr "" msgid "Looking at " msgstr "" msgid "SPOTTED: " msgstr "" msgid "Solo robots are prohibited on this server." msgstr "" msgid "%s team was unavailable, you were joined " msgstr "" msgid "as an Observer" msgstr "" msgid "to the %s" msgstr "" msgid "You were joined as an observer" msgstr "" msgid "You joined the %s" msgstr "" msgid "You joined as a %s" msgstr "" msgid "cleanWorldCache: removed %s\n" msgstr "" msgid "id " msgstr "" msgid "id test %p %p %p %8.8x %8.8x\n" msgstr "" msgid "Server not found" msgstr "" msgid "Server Access Denied Locally" msgstr "" msgid "server access is controlled by " msgstr "" msgid "Memory error" msgstr "" msgid "Incompatible server version XXXXXXXX" msgstr "" msgid "You have been banned from this server" msgstr "" msgid "You have been banned from this server:" msgstr "" msgid "Game is full or over. Try again later." msgstr "" msgid "Error connecting to server." msgstr "" msgid "Cannot connect to full version server." msgstr "" msgid "Internal error connecting to server (error code %d)." msgstr "" msgid "No UDP connection, see Options to enable." msgstr "" msgid "Connection Established..." msgstr "" msgid "Entering game..." msgstr "" msgid "Disabled stencilShadows for interlaced mode" msgstr "" msgid "Can't pause while inside a building" msgstr "" msgid "Can't pause when you are in the air" msgstr "" msgid "Unable to pause right now" msgstr "" msgid "Can't pause when you are in the phantom zone" msgstr "" msgid "Pausing in %d" msgstr "" msgid "Self Destructing in %d" msgstr "" msgid "Server has unexpectedly disconnected" msgstr "" msgid "okay" msgstr "" msgid " full quality" msgstr "" msgid " Stipple Shadows" msgstr "" msgid " no Blend" msgstr "" msgid " lowest quality" msgstr "" msgid "testing performance; please wait..." msgstr "" msgid "explode%d" msgstr "" msgid "BZFlag version: %s\n" msgstr "" msgid "BZFlag protocol: %s\n" msgstr "" msgid "OpenGL vendor: %s\n" msgstr "" msgid "OpenGL version: %s\n" msgstr "" msgid "OpenGL renderer: %s\n" msgstr "" msgid "Depth Buffer: %i bitplanes\n" msgstr "" msgid "Running on Windows %s%d.%d %s\n" msgstr "" msgid "This release will expire on %s" msgstr "" msgid "BZFlag version: " msgstr "" msgid "Distributed under the terms of the LGPL" msgstr "" msgid "Author: Chris Schoeneman " msgstr "" msgid "Maintainer: Tim Riker " msgstr "" msgid "Audio Driver: " msgstr "" msgid "OpenGL Driver: " msgstr "" msgid " Silenced" msgstr "" bzflag-2.4.2+ds1/data/land.wav000066400000000000000000000063761200563112200160210ustar00rootroot00000000000000RIFF WAVEfmt "VDdata 5 P?[;8 !awxXcKQ@}0KFkN=Q_OI&xqWKUYp w;R bOqmtuSr-3=pKv:u,lD??,Si L ^} l@S (+$3Uufdw DLNP(3(. , Q gve"oCb[ y8 ~ Tudk h{ ` VC[zP C[: > = gc9 _S72<O/b+&3Jgw!4)l A u=y(^2 ^D3ik"JA  .0Us 7Gg5 _ HV.- q2#w{a5Wd;wz [%^ ; ~! !!5&,0I/f)"k=x ;.JvBQkVp3K<-Z %^p%{1\3%Fe96 y 5+vaaV^fR!%$u? bT Br*<Xq7hQ,JIa|B}rMwkalc v7=>)pm;a g WY^V5kP'M9] ?J>#$ 5 .KsR:1A o&sOrݾ&5 a Qwa( !&(Y)3+. 2F30*#Ki Y_dg kjY8_|UuG'W0vXo^%^C69 ?Mx &^<GV^s "#4!SeBo~l   )bzflag-2.4.2+ds1/data/laser.wav000066400000000000000000000473301200563112200162040ustar00rootroot00000000000000RIFFNWAVEfmt "VXdataND,D,8.8.))((v&v&&&****&&""GGaa rraaOOVVqqtt&&``ffrrUU! ! tt  ##''**,,..--,,++t*t*))f(f(%%]!]!AA  FFUUVV,,wwOOyyGGXX7733wwee\\xx??( ( xx!!!!8%8% ( (m*m*,,//2244443311w/w/,,((5#5#UU RRddIIOO::~~^^aa   q q D D $$55<%<%--77>@>@REREOFOF D D@@====@@{E{EJJDLDLBKBK|G|GBB > >::b7b733 / /))$$  ,,&& 55yy }}ccٷطpp((ss޲``wwkkAA..- - xx$$**6/6/2233n4n444{2{2//--U,U,,,..////..,,h+h+**((''''))--226677554141++|&|&!!..\\tt+ + ""uuAAٶٶ((==YY޷߷OOYY""::vv66hhHH m m ""((..335522v.v.++--;5;58@8@JJQQRRNNGGa?a?77l2l2////22O8O8>>RDRDGGGGDD==55$.$.''""--KK$$ rrzz   II++I I WW11yyxxccuuxxCC__SSFFll SS> > nn%%22N>N>HHNNPPLLFFV@V@d<>[>[EE..mm  PPT T 5&5&I%I%**00wwBB۾۾ 33ďȏ44cczzӮiiuuxxww""ۛd%d%&&$$o!o!Q Q ++C.C.~;~;EELLRQRQRRQQNNJJEER?R?7700**))..O8O8DDOOZZaaffwfwfbb[[QQuFuF>9>9**aaNN++Q8Q8bCbCOMOMiViV]]^^TWTWHH55PP  ܙEE''d(d(55NANAHHFF;;|(|(hhzzAA..66ZZ##RR//::[?[?-9-9Y)Y)22ىٍԍ33..ssKK44nnI(I(::JJ7R7R7L7L::!!b b 33VV 00>e+e+##oo!!W2W2>>#G#GEMEMRRDXDX [ [HXHXxMxM;;$$EEww<<..DDYY=k=kxx}}{z{zWnWnZZAA''tt!!##^^j j !!33II&[&[ee&k&kmm=m=m>>>77ZZ11 %0%0l?l?HHNNUU\\Y_Y_YYMM@@99e8e8#5#5''mmaakk``MMww22 x"x"m;m;PP a a_k_k-o-oll0c0cWWNNFFZ@Z@B6B6 ' '!!33}} mm ~~  hh))2727BBHHGGAA::66X6X644++nn::ll®®ʮʮ55Dž݅YY =$=$((u.u.O:O:DLDLp`p`qq{{kk~~~~..{{ttjj{]{]wKwKS4S4NN77Ͳò$$QQXX__0 0  22jJjJ8b8btt0~0~66SS~~{{|t|taiaiZZCGCG--88xxNN븖IIl l )")"//>>gPgP a aBmBmuuzz}}ttccjQjQ/D/D<<66,,@@]]TT88Ηޗގ33..''11P;P;EE~Q~Q]]qiqi|s|s { {**CCN{N{ssWiWi-]-]dOdO"?"?T+T+DDæŢŢUŲ̨33jj>>vv&&..44n9n9>>DDJJQQXX _ _7c7c|c|c^^UU?H?H99**<<UU00UUֆDD©MM||˸˸υzz--FFxZxZ"i"i!r!r w wzzv|v|o~o~mm ~ ~wwkkYYFEFE33'' 77 WW//ܛggaaffE E %%11<_> = =A?A?)D)DJJOOTTXX'\'\]]W\W\eWeW&O&ODD99^/^/(&(& ``ѳݳ--66V0V0,A,A,O,O[[ffpp#y#y1~1~}}~~}} ~ ~~~KK;|;|+t+tff,U,Up?p?((SSII33ئǦ!!00ئئmmkk; ; AA00??MMWYWY#a#accaa[[TTOOMM-N-NPPQQ,Q,QNNHHAA{7{7,,bb,,__``Ʃɩnn**ъ؊||##33BBRRffxx..~~N}N}v{v{f}f}QQs|s|WvWvnnNgNg``XXkMkM??22_'_'XX11DDll++ޖ֖,,ʙwwŜ::rr~%~%88IIVV=`=`5g5gfkfklljj f f ` `YYRRHH==00##$$rrGGee//\\WWѻػ99ߍyy . .VDVDYYllzz||~~}}~~  P|P|zwzwqqjjUbUb Z ZQQoIoI@@@@&5&5T'T'uuvvFF \\33߱߱55CC  өܩDDF-F-gCgCWW+i+iOvOvv}v}00~~v~v~uu9|9|)u)u-n-nSiSieebb]]UULLpCpCR9R9-- yy**llMM֭ȭDD77//HH֛ۛLL@@UU++::fJfJ'Z'Z+i+iuu}}hhWW}}{u{uliliZZ,M,MBB;;55++ ^^މ ||&&ff݂ڂؙ֙YYӠϠ||̨ʨ77)) 33QQ%%&&55II[[jj,s,suu.t.tqqoolljjhhggWfWfeeMdMdU`U`YY\Q\QHHAAAA99\1\1&&ii ww66YY88||»66--??؋܋ܗ||UU88ffrrAAm m rr##9.9.::(F(FNNSSjXjX}^}^VgVg0q0qkykyA~A~pp~~~~  XXh~h~~~**}}uuQjQjf^f^SS7I7I@@77W+W+{{ߟ߼׼н˽KKee^^ƟΟ؋OO}}\ \ ..CC!W!Wggttm}m}@@~~~~AA~~vvkk``gSgSGGn>jjuuFF}}99]] g!g!^%^%))L1L1<<}K}KC[C[hhpprr`o`o9i9iccaazdzdkktt{{gg~~||`}`}~~{{pptbtbrWrWOOKK.G.G6A6Aj9j911++''##,,..zz||$$IIĥii//̬ˬ$$ІԆԆІͣww'&'&EEXX__v]v]ZVZVOOJJdHdHIIMMRRVVVVRRQLQLFFFFMMWW>VRVRhhxx{{zz~~pp{|{|kkQQ::''33))HH**;;NN__nnzzUUvvyyiiqTqT;;!! ee))$$00p5p5K3K3--))&&&&!!  vv//__LL++99××oossŰŭѭ::##rr    ++h(h(@;@;yRyRff|p|pslsl\\GG33"" p p   jjN/N/-B-BVViiJvJv||~~~~~~~~yyhhLL..- -     11GGZZ@h@h>o>onmnmBlBltti|i|  xxxxxVxVc*c*  ``??$$77ff EE00 00$$]]߭mmSS  R R AACC7"7"C)C)2288C:C:44))  ww. . qq##f^>MM|\|\MlMlzz~~vveerLrL55L#L#gg66 EE.-.-HHHH^^RoRoyyM~M~==99!!YY~~yyllXX!=!=rrؓvvΐ͐vvՁ66II%%F'F'""==hhZZYYΫUUʼۤ~~((////x,x,''""jj== XX==zz__< < XXHH//EE]]qq}}~~RyRyooee[[RRGG3?3?::<<.D.DMMRROODD7700"4"4CC.Y.Ymm+z+zhhJ~J~]w]whhPP22CCjj  I(I( 3 322&&**++RR 00AA9N9NBRBRJJ77zz''00˸ݸ9922ї¼˼``&&**U$U$!!P P oossEE))k0k0CCMMMM%F%F;;V1V1Z*Z*'('(V+V+33??uLuLUUdYdYVVoMoMAA449&9&ddpp*,*,>?>?.O.O@[@[bbeeZcZc[[SSSPSPYTYTaarr||zz3m3m]]sKsK`4`4``b,b,Sq>W0W0 **B&B&66CCfIfInGnG?>?>.0.0 --A A d d ^^##H6H6KKB`B`>GHGHQQw_w_>OO  NNff&&z8z8JJZZffooJuJuwwIvIvnn__FF(( VV))ώώʆʆ,,*)*)11d6d6+<+<.D.DLL|S|SWWZZ\\C]C][[VV6L6L>>>>--  MM))//44!!44GGYYYYggoossLqLqtltlffbb``o`o`vavaccrdrdddHbHbZZ1L1L7711llFFllVV__E.E./K/K ` `hh|f|f``]]i`i`EeEeggee[b[baaggppwwuuufufrKrK()()AA##pphh̓ʓdžˆ77OOOOZZ[[&W&WQQOOSOSOOOKK@@++``!!ȻȻCCSS..55˜˜IIhhVVOOWW((J6J6DDQQZZ``ddgghhccdYdYJJ):):** nnll֠ݠ::..Q$Q$d2d2,C,CTTggww~~]]~~||{{h}h}~~}}ooYY.A.A))ssJJGGii&&55CCNNUUXX0]0]ccVlVltt{{f~f~TTQ}Q}dwdwllF^F^NNAA66:,:, ttژ&&ϛӛ  Z1Z1@@KKKQKQqTqTVV[[[[aaiiOtOt||@@||}}rrt`t`LL88$$еµNN!!hh..dzll q q $$--;;GLGL]]llIxIx:~:~~~  L~L~xxkk[[HH5656''QQ$$قxxϔԔԮ߮BBoo66JJ|Y|Y8b8bpgpgAlAlrr"x"x||O~O~;~;~;~;~~~~~||uu3h3hWWFF77))&&@@ϣϣ\\ll//ppNNJJįޯޗ<<**==KKUU[[__bb>f>fjjoocucurzrz~~~~zzoo^^#J#Jm6m6''TTAA2222EEӛӛՠ I&I&>1>1==NMNM]]*m*m;y;y~~~~~~4~4~||xxssjjg^g^PP@@22i%i%))..PP}}ttбرww$$>AAjCjCBB??88.. JJQQ}}uu񑆏]] }}Ī٪11A(A(P=P=LLVV]]JbJb>e>effggff{f{fEfEfeecc``9Z9ZSSKK F FBBBBEEHHmKmK*K*K F F::7*7***eeGG̿̿**CC~~ttmmKKzzllAA././JJbbcucu~~$$~~~~<<33 y ymm__/S/SHH@@88//6%6%NN88oo~~""ννœggϱӱӼ׼;;~8~8KQKQeerr#{#{~~YY~~{{uummdd \ \TTOOIIDD??R;R;66..##!!۵ __ڱڱ22ıı''QQֽR/R/GFGF-Z-Zkkyyuu~~NNdd{{ytyt)l)lccZ[Z[QQEEW7W7h*h*!!~~tt **44rrffӶӶ++×ddĻ%%++BBYYmmM{M{66~~~~}}jwjwnn2f2f?^?^VVLLl;l;%% DD77%%ggė—BBHHӷ۷۬||!! uu####**55@@JJSS\\hhgugu}}~~zzvv+v+v1x1xvvoocc/T/TGG>>888080p%p%Q Q ttQQ::RRݖږ66ڳڳڳڳڱ۱ۑݑݹaaYY0 0 ee<<CC[[66---N-NMlMl}}3~3~>~>~}}1w1wllt^t^LL77L%L%  ,,SSEE%%DDii}}͝ڝTTjj eeҶaall))!!FBFB__tt~~~~}}A~A~vv~~yyrr$m$mhheeccaa``Q`Q```__x]x]^X^XPP9G9G{<{>}}==AAKK ))##++zz%%њrCrC8`8`krkrG{G{c~c~hhII||uwuwdpdpbgbg[[KKy8y8x$x$jjSS--bbKK ^^%%g*g*_*_*))++00M6M6::==g@g@BBCCm>m>O4O4''    **KK``LL[[ǂIIٷ!!>>YY(n(n{{f}f}||u~u~ddzzmmZZHHX7X7x&x&KKaa))ccnn!!~~$$))|.|.Y7Y7DDSS^^aa]]5V5VGOGO|K|KIIFFA>A>N.N.cc۽ ggJJϚ11 &&77LLaa4s4s}}3~3~Y}Y}DzDz{r{rddYRYR??// ]]ݻӻ``VVԤڤIIuu**!4!47788u?u?lMlMr_r_roroyy2~2~oo~~~x~xtjtjWWBB00##ZZۛ44 GGc/c/<<)I)IUUccpp z z~~~~zzss/j/jm]m]NN??22((uuoo++99ƭ˭XXkk,,E=E=bJbJUUB`B`jjrryy}}%%~~>z>zFqFqIdIdRR==/'/' TT%%>>++㡿ffVVTTգllc)c)==OOHaHapp{{q{q{ttkkaaWWvKvK== . .ttV V &&eeIIvvmm66  ..C#C#++`6`60D0DRRz_z_lhlhlllljjggVcVcgZgZII 0 0KK vv˰˰||wwқ  B)B)55>>WDWDLLVVl^l^eejjnnuuU}U}\\~~rr@a@aRR>%% ,,ָ$$е˵wwVVѱѱܼܼʘʷ۷۩%%>5>5sCsC P PXZXZdada@d@dbb\\zSzSHH>>>>77440808/?/?FFKKKKHH@@l6l6((dd iixxݰݰ44oomm..ܰ00//HH ] ]tjtjPqPqssttttss;q;q8l8lee^^VV O OFF>>44**  NNzz; ; YY%%**99EELL{R{RWW\\o_o_^^XX^N^NcAcA33''EE ((,, Օ̀ǀqqŹŹ""zz[[##E2E2i?i?4J4JQQYVYV1Y1Y[[T_T_bbEeEeeeadadbbaaaabb c cbbbbbbNdNdsgsgkkHpHpssttppnini__SS,I,I@@M;M;8866d7d7 9 9::u;u;n9n9h4h4N-N-%%vv++v v kkffɏďĘŘbbssĸcc ˻˻""YYԝ eeג֒??ww22""@@IYIYii>r>rttppiiaa)\)\[[aakk~v~vn}n}~~n}n}/}/}~~~~~~~~~~u~u~{{rr b b K Ko3o3!! ҥ̥͒Ӓww&& %%))))M%M%ii[[UUyy++Ž ggǐSSAAll,,CCHXHX%h%hjrjr"y"y}}%%eeCC{{WuWuppfpfpssxx"}"}J~J~ ~ ~s~s~++3~3~BxBxClClx]x]{P{PTGTG??A3A3ww<< [*[*,,((M&M&Z'Z'**--..//22K9K9@@EEFFBBP;P;44--''["["WWeessҧçɭɭ۩۩99))ե''w(w(o3o3;;@@BBBBEBEBAAAA@@??@@4C4CGGLLQQHSHSRRMQMQ6P6PUOUO O ONNMMLL+J+JkFkFAA;;44..W(W(## ||77yyXX [[ \ \ bb//[[-- 77 l l zzqq== ]]00~~]]""hhuu ee hh    NNkk..  nnEE::h h   99QQIIxxzzLLFF22  bzflag-2.4.2+ds1/data/lock.wav000066400000000000000000002414501200563112200160250ustar00rootroot00000000000000RIFF CWAVEfmt "VDdataB uL("K^" z>hwC##ZSf0;B#d3d.rD(' I>DZ. ?tI;:U'5"+%  8f(/-%2/~?O0~D@M.Jx(.o]' ^(V"HoEj5+(_@ MDpvC#}m$Fj(Gl[t/f?4 # )K.4s|O](qEn"5+ 0~(]pUTeA8pvA ##-?S/Ug6 MBtURv86qYr s [vJ%A8iXxWe:$kAHz+uZq--RM`Ch-(V2h[ Z W 6 c;'Y Y`}sc@]L2n[ucTNVsYP$$#U$^jV"h2g!Mud2OGY' 3='VU1:f{d$6kc3ru< <'S=-8* 4+T3?fQ%mhyZj4V*czhiP*}%8c{##){?R44#4 la |fv/)'`6{oU vwoZPGGc"\?Q<RO  U Qxt4_HY6aQ0QEnwL_FjgOy; K  Vj8G5pnhU CZI I(^K f -\8_d<t q c } EM83Q*{X(sa0V&l#,D&>4@w~ CC`6IdpB"aW  [ b  g$l*_NlZdC7~c: d 0w^@&p"d < %[wi M Smb>.CT3 TH\:/WpCjA0+Qr>JL^[KSM . 1 b C Uqs L!_n7S:a[Otu_UG@6 O[CM&  '4O Z  G 3n f d   * mA (Ocxnri2:f}|F3V[Wje k ; 94 knWC   ^k  2bOc<R94.E?T9W~yC#!znQIlc){ A L &GQ/  tI  hy['JjOlPHF),cSQ^' &   @ ~ a 6 =AS2lKt <\` ZOx~fus+%Se &#)-#! }9oE Y^tf >pr@LP[?X I  I kS\B1#2;<E_oG " 2\~hSj OJxp 8o CvR;EG n C0V-GF=1ojR NPFJ ( 7 6'fIYAcE ?t B: \U#M P aG<Z C #Pz{EBk0a%#WrqqZkuDCghCfx    S q)jnbye } W 8 )eF&\dn   7 }4\H['<@MW+ { E a3c5B.Gw~9 Z1 >Y3D{K wE b! p /<2G%{ 2.L9-uJ1S YV HRn?U JnV? GX O|{8i@ d3?L&8kDWzi (pM?&E0  ; J 5 c 7   /* Q y g [ Q  2ZJ,f 'mbwr 4:Lq`2g4;Dq N;|EN$)V'Q*uFY7 , ' $ <;#w( G     C ^ %  't Qp38lh& $+L|<9A` CVH #8ST1n-^ 1 2 `1"4E3 ^   ! eG=c_cYH%}a=0DVh4,KqCU.#yqw M=( e W e 6<y{E&ozrx,A4G">9yg9;-0[|W^{{7 $  :    tkO k! J ] i@*|\-GHyBC(,N{c92M& @  ' .  r k @F}Ju  `)_dVOB+5 HwnWm#zk!.2q')!DW7  E"t~W:?cd;S i%@# ahWii:C:u G}4oD\^7T/ !T?  /1 %D*.0220+% $v_? ,\ ,OJt<    }=] [ >cE r rcM) }zQ1yk"'*r++ )%c!KrkhF N "hR@%{J ;2 dj߱  &Y_ o"+#" Epr/oR/s"_8 dc~xH5M#X x2K O4.ߢhϲ#ӽL0@P>pZsF- &F@.L7(  'G-133/)! yyr oʓ.R&Q۱}T"Q%%#D^r}-aF n `$H `*{e '-0.1O/[+W%s5B #'bڽ=*4O ,T k"c!lF @<>e 4~!$%c%"m 73~? !$2&&w%n"p \uz5ݦة4T܈ce# O=q^~ ~ -=T9I_W\u~_O AO#z)4.#11}/*$DT++) ~s  V#ڦ9TՁrGnX@{`wMQa8YP J . }  *s? T ( l X L"&)*){% ]( x qg!! -6ZۑȠS*/e?7 "3w3~e>G_ QZxR}& !!"##"!U G Y%'"(&#@X D _I !Ԟk¨CIg3NZ߸(I8y37K&qp5 FN_ >Q #%K'''&-%#U  !J @gP g#&)+-,*'#0ELUAґdN̞ӧwxE 'nގI"ˊ~͡ՖڽJM:Cu  ^6id/t^$w(**(%A"I~`; %)#.v25K763Z/*)\! 9/Pү+ C!l(X! ?+׾񺥺ȿۏo vY '2l/ lx#y$MRC# 'h+t059: 94M.&vA\R c٘Ѯʸŵ{Ε2;bTb_*l?y*BQؤ  <s#'_*x+*& [0 0 pEUB"%(m,/10^.*%&= 3} & [j^ՠP7I ( / @  l6:2غ\gA̓׍'$u 4r#)-/.*%3D7X eO ?#).257T86u3@.w'>x fvk֧rjҍQ< j-0Rȵx}ÿs 24!'+@-,*$($!j< C3>eRJ b (/{47{87m3-:& **8˧Uۜ""$$#}!;t[$mmél/  l$),.*.-,**(F$g  F8a < &,/Z1>1e/+&Z )j?ì"bˌ&;"! L!D! jw!ƬS N֎ެ  s%(*]++**("% ^9XS= ~o(50h6G::;Z9_50)e"B9XҎɡY ϏEJ{ H up\|+.;ʺ+žςx`&%*u.01;1/-E)4$ _84xjewL* '0u7;=!<82-* [ RqxV/t&gfWH p  PF WO~xҾۄib;sZE 7$P')*.+*)=(% !C  6 uk: &+x0'4F6652.'`i ܌FaC_ &]Z S 3wՁ2ˇk@>ɄZh. D38"_&X(('$.  kC >w'/6;>I>]<8u3,$OnXݢgiC}Vt  V kxnfvXZ¢];iu d 8`"Q%-''.'#$kDu>55'%/5P:(==<8o2(%m*ؔ؛ڊH  %y<65N]קųxB|/IbI,  *  N 9 +'?-26b8#7I3z-2& f3# ӫn!ւ_9?4 yKTպԮiZߚܮ3ۯpGtS A ^OxI 6! _2#!$-' )))(%j"`M-دѲ3؈J3~1^xhUѕCX`EζFޓ {N8% ) #&\)5+ ,+)&F#d Jbv I#%q't(('&"E Ad|:݂>ٗ٩M X"?j˟ƨƬǠ fJ֕߫z=ln nir" #&)*++,+.+i**b*++&+)'$!I[ iHp{UJՒ帠0+^Μeyߜ\vfE` g,Vq2K mH # !f',1P6>:Z=^?9@@@?=;83n-%- R*p/  d| (ĜWRU?۸,Ʉtڝ/ 9.xDZ-<D 'c"X2Pj J#+3:A4FILLKHC<3+* B vH2*]j+ QAD.ϯWoҫI߀oj .e%(d*%*(#( =hWTe;f x#`,5=CG^HGIE@;4-a&( \1 j"oR/h@_p!lS ͙ڮxOY` B h "!Y U`rG!*28<>>:4-&  \ (,b ,L: :qƨ17ͤЗ^n(oC.6 2%`q FcKN A)179V96M3.Y);#6{yy ugTC pjE\3n{w?|Z3S7)ԩ;r " nO\(l (Q&/7J=b@?;6.&rc {d,z j 'B+*&&:p heR"if]<4g:a L G#&<' '%"8 ta  )17a;;81)) Jk?{- yBM o#"!yHe1s*se tF̽TE՜ g r"M$y$l#;!h!, C g 9 (P1:AgFGEXA;J4+"MIAߏܙSx p9 wG>yM؋յһωˋ?7u1R{Q X4$+3:BGKM~NMK,HhCl=`6.b&H8!=A'EM߸޺%b;@F>9μ q i(p  +#J ogs#^-7A JP'SSQMG0?5-'"sy w1A+ZӃҦ7"y"دtߝYk %k  i~hN)]X;w n %G+{04V8: <;:I73d/f*$ -U j`݃_'cպ9ξ-}Sdy0o`'#~>o1I&5Ks#,H4j:>@,@<6.%HH!WD &((w&!O. ?3b~= \5yIs p!!"LSs eb: a| G _RV '2/6J7|.%F(-= ~1N6wa?!4ZaPi€8*-8. "?Awbh~L[6byG8 G$+27;I>:?V>;$71b+$Y} w  :9' =s; G %Qn5N> , [|:1naY ^$c-o5F~!>#C"Fw P:L.M/KybވDW #(1f:BHJ8IDWD/HqH]FB=7$0'- Yp޹ bx vS1+*қȘI6ƼPňʔ۔_S  ^jiNY` ?;z, v!g)0~76 -! (knH;L1ӧshcƷȰԻ]\/`WX _U  ] p a4 (19?B@|;,4+"/WlBz Iy΂%υШ*ӾWkA)9 y'1[8K;:[83-[$ '^7#xy{*y6A?EGFA7,yyAAxMU3ڝܬzH>=;71*"Yfbnbb)G8cCJNMFz:+7-T:+U׊gLlW#g܆`ɍ*ʿ`3 02Ke @&+/1m100k24O6X777i6[2+"~sa5:Na UQ-[;EJMLvGE>2&9uD ͰܽϹǐр^<vN-Ž ɍ5۟Lu#+ 115789987H630-)b&#!z=G Q. L'%)[-C0"221-)/$3ѡ<ߺJȻ+ ޢA܎rռШhm}Ə[-,u ,c *.267d4/(*2bH(#-S8=@SDDC\BaA2@=,80&m k  V d?miR1Viؓz@W-D^}u>6[ʖ;L mV~#(D-254.%q5*Te %1=GOSUTaPxI@5)Z,9N-פ~ n iM`ܾA4l۳ #?I 27  x'-37984/.r&=i O )7FEcOEUHWU{O@D4# =C9)]9(coRo%(V2Ph?HA& 1`xWU1 A70C%-49;[;-:86,4"226HQX%[[X U}PKhDB<2n(D# ` xKQk7ֺ̡ȨÀ+Ӭeusխʹʾ]/ 3"#|"iݥکxzXg -{9[CJ5PSTTPKD<3) YNE 4 Ke TN;1 'PO96[i$ Geyi >܄٨ڄw!(J&\1Z;CLJOS@VAVhR}J?36'sT #%Y%"aZ >ז!`afѸD۽,ÙɳXrF9   }SB 946$&k/8@IOQ QMsGf>:2#c 's o!!zLэƯs,վ̰m VS= 3$vY/gZ)D j\w; &E19?CDESCP=4)  W L <׻DzqŸвbUbv] 1 R? Y+[TV!fl5 gE\pR c /u] |68+v#0<%iƅ"M ! !!Y| C'> L"9,36m4i--$G xU ,'C+&aE4ǭqzȀΟBїX . ;<*"-%`&%#< r {5KA@".8]A GHFAf;3t+!B9ۉՅsڨ{Ddk-l3F|=Ý>Ea|s(p dFDDR]= ?Y 0A=sF9LOgQPMIC=6/& 2b>9MUZI . RzӰMm!ԭ䱦L_jlQ.'_  u #bb 03P${v[ Z.J4o)7;]<Wh 3iuOWÊcת8ê9dԂK]k b 2 lS2'_$.8A.HMQSWTJS^PSKD@=72/,y(" HzXe3K)~rQԣ̎@Hi-pVöάԸ%?GGN_H>KVv8!*1J5y78499;8]779BӞՂlJ_J~sE )#(,[28]eU _3QN/s2`y~<6^d;#}; \I<EB<z"g(,.W/:.*%? -D,AeKCY! \ w}Ǫȿv^ŗ֭rd4$ {B{< 6 <asaUu`S GH ;3( H{   V1Z[ȟIow +:"R[rM!4J 4,!3&o)a+,j--+B&plbEb[79 c9","po X 5 Rv@cw+-`xJc\d<&"x J)4=BbC?n90$gx`YcD g xB= &1 bI9rC*ۓܟMV; ZY%+2L7c;>@@<3'!D yS ؜Q۹r3I15 / (xz a Np/6;78ܾ۫H@ G~!^',16<>=7-%"w!!ۥ/IMs`0+GkgLV q8I ^kIyڭզҨҘ-%^a n%+a/>369:O9P55/F'v ?*. Εk~4] z ,2\׸ں0C2y+N !bB\OV<ɹ5;n %Y2V=RF2MQ S>PH=0^"ߖcϡʎv]Խڒ~k  EMކ"U&,02`2C.$s߷! iE& 0-:pEPXZJVIL%?*0e'X =Yq6ijwPqpi %.6M>BA:J/ të]Ȗ &82=GO;RPKC8+9W+ڰӶΒ*կjxqL2"Я_D # +248y:R9@5q.k$"Ij]He@(!q/`2#cM ^ Cds%;ۗ\ юkӓDjYe" #!J2(;3;AtE!FC>;7,* Eov݄ۯ݆lpj#&ktމ ǚÑ;ըڢ!% ( G_r*pS&pHt (5?FILJG0B:/$i 3$Dm9, !8^+pˁ}]z~ u '0 & B(zݙR ,67@H*MNMHA6)V7 a;]5gI=Tr1LRI,tx  VTȢzE] (%k>'.49=9BFbGCN;/.!m5IRWz  {A`7{,S0VXJ_1  s :vp֫ h&,01i125)9X;9 2'w "`S r 2ج2="=|@YMD.Nmrd"g)3 {2(k>oHͷ̹c4ыM#G'8128]CdEB=W4( ̫'"-476I2{*]u^lmY]f̥`x޾Pz5$+R27m:y5.& _:ؾi0 &*-l-+("No+Sm։τ};J;TB ۛ9*15P}#1>IQTQI>$2$!<ۜH.NTՂAWet[%+^167#4*u rvȻwKAc >Szxޘ b<+$ _,+8CJMLG!>F0w QgƢų7IbG^ 8$_'*'#i X߂ ֖Mb".݂ٳbۑ*`o4L*m7BILKVG>K1 }L.ǐľY6ۂy$p PWV /aH݅٦W?%([& mϹAMk& 2DlHdKJL\JoE=X4( "5!Ī"6NJ T o !!C)6KTB{}0Ͻ-(x g5 # iA*ʴTݽ W)~4=DJ2LKHC<3( eJlӂƍuˀtV>$2*,2)o" z7KϾC܄*!  d qв!y*O4;ADEC>7--!Ud\0T.S ޝx! R!%&$%!/͂pݠ@5 RpK e)nj}fUh!-6>CED.A:1&w b9Q׈B,2")$. .(H?ۆйҪd R c *]ԖΦa-ӱp &1:@DD?j7;+QmV"(ZL1lWTuq6a `0dcGy? r_ަ ~s(08=MA.A-;.fa 6ӫfȻuw'om 29!&_()4($yXQ@ ;=E\+^j)16[9F:98I3*@gAt$YCTU ;2 ys1*Zz(ٔ 7%k*,-,)$f˸pׯX -8?CC?:1&_L N܏LJڿCw' C!p" |3Վ N@#w(*@*l&% yٜ˰AS/>GeLKRGR@67,9>əz!\ٲx  k"!nmLRgˁȞ,ֽ-W T$)h+*-&  sD޶J3y1!(,6[AH;L,LHB9'. n7O4Gz7["#zf6 A &*,+6("p4g{6;6 ].S:CILKGr>j2 $G([_N ^͜G (  ? VGt&*,,*& ;lgZܱ +]5LAgA=H5&^vΌʺ/(Ļӫvz;f \}Er%($,38};-<:60u)!d> l1ވ]TڧߜY!(b.6232/1+$o26=R=Hխ įBKɕ΄S}zKj\GDF ^#+o27;M=<792* Cd\b%r08x= =6*pMpؼٖيbmnc͜O%dKv<Ю9T  F iOv' $0Y:\@BB?:E2(*6 "`/H9F@KC@ 7=(93ɕp.Ņӣۡd{1Vi1Ѭ͔,͞Ed1 *#| GvWb/U=F,L`NLF<1$? p" %(2;WBbEDZ>1V 6!`̕ë $0҃|IGXOЯҋփہ : nB(7DzNIUUBOB4& %2ȱªȋuvѾH1ؖ SRS  +:4s;P@BIC@;4A,% %/}:CHDLLH|?1!e{\DUξ מۛY/5%ߗ-)r} nK&.Z2~4.5H41.=,P++,:-k-|--q/14$7C8762,# IڋQT\࿵hDE!D08sb @ڌ}+ f_`#)G/S49 =?@b@>@;61}*"e*IS?Y|z.Ӭxz  "lD | c%# 4 3(2:A FTGD{?l7,i g?Q 1VВƓEκǴI0s M/3 7dv(Ӵo%-/,6'\i++(4@IOQPLC8*֧"ӊ֫۬LQ5BΊw w'B VI [̭}¿đ͗ۦ%b !(*'#,W '08@HOSU UQLJ?l0 BSuZn4cd+d {RХcQ'oރ#,5mV:c!%7*/24`9>]DILMVI.B8=-} ?4|/5p K{Q2qb N 3 6Wr:Bp 7#!wL#Y'),o.027=CEBEA;<4d+: ToU >dXA d`fraNl  (/4Q9/> CeG\JKuLK/H@4%NQؿԺ[`н+6@5yEEgM[' n     ]F"&,28>xEK P2PuKB 7*N w`U鱨N /\*\suڢٽڅf$( 1  $(+- 27h=A,DC@;5`,"o _1֋u=,14\4 f 2bIqGyWd %;="Dm z#_0;fE+M_RcSOE:G0' rcޚ>68Ϊ  h  a RUGO Z/wV4nI} c?@#/;\EL&PQ\OH >v1(%H[AHΊI̯q:ϻTv'| E) o  8: jZEq9۞]K8. G)!**G4;=BDBt>7.w#+ԙȒ]%1깟)qguPh$N5n N` rr /X]Q #|#'x*+U+@*i(}%  cZ^ֻwkɋh6'o < 3`9C:0*u !  _f' {Yb"B 4Zkې[֪զ@'k C{b% m 5 3Gh fDO  #$$` "4hbj`^GV g" E[n  #{&<% 8" 7 N(!  bԳ˨3/ŹcB53mQ?lu7U i[ IZR3W_ j&;-2E6B8e8D61v*"z61 LcvVC#Yȶh̅`46\u| OV | j C=(3>H&PQTT?QJWA4?&1O1Ε:3ȵǗʃфۼwYbQ!Vj  _#E5{qH -:DLR!USMBV4j#lT<ƚ֑V Y2 Y#$ G!%%"F;/7  &2;C3IhKOJE>5|) P;пڳoA$97pj  M!n !A"fj H-s (3EG"HGFD?L7+ /ӜN}CݖٳֿTՉ;m*"wtf)=-{bJq  [Q,8NCK>PRRN+G= 2$pS'Zq ({#|aʧ%P| z n,kj1?? xMg L 'Djh˚צ:5 Z ߚݬݏg^' #v"+m157861,& c9 :1 R~cY$&(&oQϖew] ^ConFܶS! L3&e.m5;?pAB@5=7O0'5+,|+_N8j$. 6_::D6-" kUaֳ%˿ʳʑg ωҝ9m+(z 4zM %*.122n10u1521n/z+\&d>gΞ") 24718@5p/'6/^Hy#d;ζ ϶ >[5[M_? d'A/48:}8Q1G&>3r8k$(%r^{Mވ6E #/*.0-(!Qh9%Zҽ,׿u -6<'@F@G;/j Qz, Dv.Ԇnb% KU"s&((%sT MfbůŸ'*~lжx)0%`3m=ByDBW=2j$ &PQP= Y nR][ew "(R++'bib8'޻ص??{()44;>/?=81(h1   Rw /:~hv;"P"z'<)'#> Nn,0T97U3Lp )B04641-V(!o/CB?H"!,b*ٓ߱W#x/ 76,ST޲`|]$Cc1n %**( %V a <_T#)-/,$`FUiv~E(1l63(tvݨ2D› LSC r3}:9m/_! U cXG /k &('"``ۅ=zO8:&@1-65k0$~5Q6Tȷ^f$--%D<$ $ `_ {#%UTa(Жz* [&.2z. Q@g( KR c!Q+12.'&3zUDL|!- ]T Y OD rںt# l8 ר!,'U~Ams!o-O6;+=+; 5*C\hHߵ< |j >;c1vYmb!|} @LGŏ1,q;*3;@@^<@4) >)NBJ o!$%# Vn3;2fL&)'"0 >i"ȂNh &08a>AA|?91'@\,2[H *-|+%ayAPۮTEyv 7#|#8־gQdPn;%t.6;;?@@>: 4*Tc!z+'D+e)" ~0QvY(:D"Q2ifF氌nj˱Rq 'p/R59=:75.%sO U()4&N yf&XA@Q܁(﬑qЬH!+v6>BuAz6!+y =F=R) *G&e,2,#HعRosR!Ԅ4d~G*n3;|AAe:s-A DH?C0 A|$,22,A!RIVĩ4ݲ@gȷ._  "J(p4~>A=/2`% ;PU * (/$ ,* +4:p=A1"Z«§B؝𥼮[^?1h P{C$,6>TCC:A<5+ BE  &cJY"#ءc$I3?GEJG.@\4"$l Wё^1 7|'YPE J&08*>%@?=s8 1o'D8 -oRۓF̮qKV s)5>BqC?#7*' h$G٭x2Lx.J =)6w?CB?: 3( bIhDq7  `~ڼϏ8:Ծx&4>E~FB9,۔ⶆ+zεs+% V/;nCG*I/G@x6+ $ !-! | ,YΠՅ. `*p6e>A@:/*Q2KQxuM cX5- { +6AIMOM-KF@8(0&@D Eklׅ֣[c+4;;>>U6& 4 ܬˬսO >". :VCIMOONLF?7.%73GoȂcؙl.Y< %*0684+3 ߶Aﱃ"Su11x+"* 2<7b:A<=?@?s;P4*o$ĬJgB&,y/-N*5'%$I"9& !vm ghݱf\ W1C#&I)l+.49>>;96}- G 3ύ/ǹʭo$/J8b<;U8}3H.2( 3I_ۿWOU ryұR% ju+O d C  %d/8@^DC>6*1y:3GS߃a&4=EBB?90w$IdZˏѧ̣p׽łC i? ~e~P )29=?>9B.&+ӹxʻ֟Q C'0w7];<:4)tPbX)| vۛv9( J$*/00 0C013&566d760'k2["4Oۨh  Y)C2 8p;<;5n+sRhʼ\ס;̷/֮w_ffzZ ) %M+035_6531.)#% mjڋ *%%Y.468997D2(b4 #=2ҧ._W͂r>l~ e( 'X.2u430+l%!$ :mݗ7y- "+o268 83+3tt6ө|4¶6@O O5 0#b*F047'73g,!ztBiΈ)72:}o\ )068860'X Lr;ֹ׿m\}y)F  Q41*D5))(&"/ 6+FكяTL̡-Փ3G-g<( 1 _ yX '*4J?jGyKJE>U6o-#"?{_4҇Ͽ ՞ۻs^+. jcRPW: P>A֬ܬ–l~ l%0;dDHHD[=G3/&K^%`fۉX s# z  Z R )3ޭ5ղЬhas ƒԈ\ sY$)1*9L?B?B =34o)!{sC x#!),+' M+``lވ؟ϚΕWD5ڏ1 "7,v3h8;:w5*)r g1 8)6OG!.+39h.C 1շ*4?ֻɤv 3 '%+.,&=  HO?ye*ŗ*p< *^:GOS T7PH=s/r= Rв5V٣ت* ۄ!l <#D"#&('T& #dH s  GSӍ1R+"1:?IjPR'QKA3F#+ 󹫬$gdD L~#'3,/S1%/( ^ r ;`ǻ>Ǹ99 v V09=2G!NQtQLB3  ):Ϫ;E/n C%-.5:keHNfQOJAw5I$B7׬\kֺyau7n&-5bSBD|Ck?D6'~@Ԟ21oUbDi ".9BIMMJADB8&Kaξ"۩5&ˡ73"~-7?=GzJ G <+;&~0>Lp^- ؀݉~(/33CILL5H>v-b۳]¥︇DyWѥ{($.7?EIK"LPJnE۾4>&8/+ݦ &U6ERD[^]X!PC4 #@BΦbߠƪuQ!,7D[QZ4^A[ SF6" '³$)1Ēμgr"+8E(R[`{`[RG_8I'܈8v6%3?HN)RtRN'E5!> q ϲf[EҼۯR )*i7CvM[ThXtYVPF:+ ș{л&ٖf,8CsL9QP!K@2.! 6ܶȽ,䡱(ճA:Ab5!'-3j9>BDDBS>6, o<*bH׉xx[,6#?CEC>3$Tdeŷ֪+Yǧ ̻o|#:'+18>vA@k=7@0&k@ i-Z?ӼY. D $u.7W@GIG=/Y *ޥ|ޢݵs>u  'L.4:)?AZCpCA;0#eA׫ڹT:|Ǡ9N %1v;zCIJRH@u5&*s5ǢXqp[#7+169<$?AAA> :3)@|[О–ٰ;U·' :'2>=EgJJF?3$0m.ô[ci:øG J'B18>AB!A=z94/1( rnև*!3!$i$1=GLOMH>y/q @ۼ^/\Ǻh\ b A$0;{DJMNBLF^=+1{# KGsܒ>VqBNQ #%[2=xFM QKQLB4#5pNaY ٱ1 KdC"/w:CLRyU/SKG>. PHS߁25vDJ 7&3>H6ORQuKy@o2"ann73ŷ!#0UEITJF?5)Kv hۆ͹l+.5 ,6*8EO VWTkM'B3G";ăktﶓh$,2F8<_@Av@<6t.$q` lL14h:dV7 *7BJPVSLRLB4d$\ShUn)tw ,5=CGHE>74l'/ },"&'4 K(G`M"0s<GOUXVwPE$8u':q7(j"1IQ P,I7A`JOOI?"1 u?AD|E/9:-k ~%1m=IS[^\ VK>H-@v+6ܫjΉ04+9GQUU9O.EC7%KTԅE''.2'4ANW]_D\U K<+\(jmk>BѧBx'!0?KSWW-SI:='Ec# b5ޮ^ǕVpu&(5CMOXx]_^2XM?'/-D7q!B ު<+8DCM9V[YyREr5x#j$I[JEp:-#;"G R>['abl]SF^7%o؛Ʋk˸o |c"0?jMW[XO1C(4B#`ܑϊ<\֧qޡ/gAY9)c5+BjNW\\W(OC25$;fّ> X. -:gDBJKIC9a+tbڤϡc"rÕrm ~w +7`AIPUW#0C;BHIG@e4#\u"Iiݭ޼n% %+0u5 :W?cDG`GC;4I(/ pڪS۸*Pt/%2=DGIxJSHB~9.&$L gGPg"?A(16995%.(#/9QGϼù$ѽ{}wR$2>HNvRQKA5(]S= /яʃ-ɖS%)P29P=>Z=8.!lʷؼC1^#2?JSXXSqH:+ iDQԯ̿߼v_ҷtc%f09r?CED?4&BޅҠv]`ݽ΂q*%36A=MU'YuVNB4#ܰYŹ)۷ǹԾƞRC&&_2>92/& 7eQ~Bל* uJ%/;DJ&N>NJ(B4"O01˰Ѵ`dP#/)+,=--..d-([+Ӻ{괽yrYYV{#d,6G?DYGFBr:-( h/ZƟ%.{ f#,2552-O&5w͙è㸧3FPJn"&+17:<24%n/%@-ν5r$,2 652,#~)c`*A˲GCc V_$*/\37L;0?UA@=H8`0$xqA ǣ<q t'+.24d3.&U0оaŵFX"J 7$+16:>AcB@<6."nR)ȷً+w !&',03a0(Q̥ངđ ؞r;-)#5,37:3?BTDDA=8 1( f{ʋ9}a ܟo Q)/2M55,2)C *vٽvI7nΠ\# Q!x/<`FLOPMOF.;.#C+0NglC>0L=E)m'/47c86)1 'IMʟ# ͶŔ,h?>f9A1$kjwʧCМޟCsӈO5)4>_GNCUZQ][SF7 ([ ܫen;QBiށf'B29s>@-AM?9N/o d![{] ̿޶r.'3>GOW^a`Z/OhA1` l۷No934!(29;@8C^C@:C/m &ˊ(-13kḂ۷>#*6oAJSZ _^Z?Q:E6%[+B汰JDѕ8 BG%\09{?Ad@;A3%,UH9u qBØ۝G +7CLTZ]\#WM@1 tu՜Ⱥ*}nEQ p#(16861(ܽFʧ U& =T )3-?IQVXmXOT5L@2#{ԫbŶk89c8D  ^(+*o&e$s[Ҽ|hX&T-;x&{1H;DLR0USkORHN?4~)y@G֞ӕ?73(PR#')($T &򨿤ڽ'[)(W35)LMCYʓ@2Irݢr' !(,.Y.f+:%8 )h&ܙ Sagu\T%1%=aGOIVZ\[;W3PvF92*I-VþLD%y"7+2552+ @ԈʯExǾքg #-9EBPW[\ZVdN>D7)~ 5:xМˆƙͰf(X9SB$&+M.-)!"rɾΗyAfˤܹ6w%/!9A_J1RWaYVQeH =+/m -~eؿР̠8۰\=z"V)./X-& &ݢ3ODQͻMd# !F.:FOWu\^0]]WM|A#2 V '^@;5]ѷݦ +4;@CHB;H/6 ށ RP2PBڵj .!+J8!EfPX]_o^YO}B2M!2ph=ʻY ( =%L1:BFHLF=`/^f񭘞5aQNrʓ&+3  !,78D=OVF[\ZoT J<+[;)#ײIK+6/?DFEu@50# 1ǬpVx/)u)޳E- 2,7@AJP|UWXTMB04# `!gůlz$ 3)v4->oDEB;j/( ʰd)*נN )+6@+JQWDY6X TL B3"hƢ?.):309>>7 , -‘ԭڴ:̏ڮa<\ E#-l7s? EGGD>f5)# ?;ѷק 0.8=>O;1! a;D}ըԴΗPU 9< b)28c=?'@=a8^0&raq,cYQ "-D5o86O05& @޹_߬'*2rvK*4u70B*#mm@Ȯ[˕^(9 ^#],3-:k>?`:<0!J譑UY ҾYڋji%A2=IEJNN"LFu?E70/'s dZяŁ޶񵇺RЇ}Kl:$Eʊ0,7?C|C?7*G۽QA`+u҂ qW /?MVvZLYTNAE8:n-JoR "j-6;>Ae@9. *Ӣ蟅pReqT Y*8$GU `Kecx\QwE58) :$.֝Sd;X$,27):8K1E#{o_T`% 38n)98*EOW\_\GUyIF;y,j>Ss F'  *26P74|."l)qej|˹؊ $0;9GbPVXV-RJ@3%BAqCg"ּ=b!V(-.,%w˱gWVa}(4|?dHDOSTRME;b/!~G Ťͽīq Bd"V'*-/y-&}8 P+e7qˢ4k7̧R k#31=ZHPjTUSOH%@5'3 du-,jE u&+--)#] `Ш<)۵ ϐބ ,'3r>GN_RRyP*KrC9.!"2MQBɬg 5$*./.O)  nԴx)Wsێ W;$/2:"CJN[PxOKE=1$J+v0=ޖPR !W%&!% H O!ܿ@LjG[JE!+55T=DH]KKIF@6;(2v 4" Rc?,PT(7 +o F%؁]ėOټ>dž"y-259L<>RBEFD= 56* ?+ܔoِ֩] *  BL] CΛl< *#,28;;;:9998v2(9LD ܊TuU~U1JHܯGE}Q\&28:::973/+( $]*EM%:r+$:~u+Tbf$$Y&p..5$: =>=+<}94-$pm IBkߜ;vy}6s7>k-ь3--  )l0Y58;>@]A?L98l4%z R4{WU pjևϤTr5)>"'P,048;;:&7;13*"b i!eCW;.#:>ˑ/Ձu Q 8*Fo۟߅ 4%K.5:5*k ?6hXSaJ /"$T"m T-E"+(Z4>EIJGsC&<82''E %_DϦ WɎZ߻k*5|e Y kLtge!/i:AEFA8-# \ҜĶ`U@-VȼZ%`d`:"" !DVNnԹPP <.<$HNPOL#HA8T."W =.pHٯ 2̽4 t $%)D+)\$oHJ/rjM$5uBJO[SU+THPIrAv7H+  VٸDZ[.qg(Ыט$ !0(#%%$#"2"Jt/^Lφg E/G=1#oDНU3].ʺ(% u#%v$Du} 4)׸Оn^,8AHK7MML$G<,BG˗tF:ȵ#ؚ#.g  O|hߒA 5%>/6b28$wVxǗiĺ َjTjJrSo]D ޵W*@`T'1:A`FHkH9El?^7-> u>w{ʗ;bUi&OOt6 . ^ܞX} *;5=}DHJHBu9-!NE]]vϳЫs}3 e w ` 0 ^ wFcrY#-{ԻcC Ul'09>CUJ+M>KTEk<0"oj\;0d ^ kTŽ/ im   \*4=:CE E~A9-#lڿַ#וڣ  Z"" m +uR5l84˄+T<$-46:9>@)@;0@"tm?؃L~zUWt"$A*-.,'^H 6Th~:ٴس嵛|Ҥ\ GJ({/5;^AC&@%6R'pRZd̽4!^* tT +5=iA?9P0 % ݪ$Hò粄ur_n'&/ 9A2G}G&B\8Z+IKި\Ũ%˶m !-*8~?CDSB;0e"!2R*ѠݮJ fE ) 2C:@BZ@w;|3'$Hœ_<$ "'+h3;?ADC>5L* (Ÿ˲ !cK;H O'W18=b@@>.6()bxԦy+)ăh3m, !+B5=CF,F_Bu;'1z#H ˼tǷPcIt A$2/7=@?;*4(9b p YZǁ«!W#TH 0$h.6E=AIB@<47*t6ПIJb\6%.~5X9:82(z Fʈ˃Ξӹڑ$s#u*/3553/*#{Ƭ→n[ O&,12/Q'6m pۗԡѩ2l( L %$*N.j/.*Y&n! L_Λȵi׋:C#{'U*\*%MZXɸ..2DdJ qd%-363y-`% BY68Э|  %u(~*)k$ TMp΍׶t | G$A/7C<;37/%2 z6eܢ)(ՁIX -";'x*3,,@,)!4k1ω?i օJC  {D!r-7>*@>91%Q?n̼Njxi0\I_  *S26773f.&b"ƭZr483XE?$"/6,< ?>:x0"  bڔOʢ*șњq '$-4J9:9]5i.$ ^ߐҕǑux8M#N +&.5 ;{=t;h4U)c .J@ǔj̳ # %=0V8=? ?/;S4m*WwV™`йYL: '/4774f.%[:%" ܔɒLq״&*39R=u><7/n":@ö.8!ž̞+@G| X'-1d2.' g LٻeTN< )17; =;X7"/# M/̵Yb{wMP xe "(t+)~$? ]sPFyբI5{(18<'><6r.`#bM*r|S(  -{ b 6 aҔҁ_w*4=<@A?:Q0v"f ܿN}͗lUqUCN t W 2_p y#ݒJA>g$W+w5<2AB?9i//!( jݼCпY "ڨR C#m! 6: 9pA6*r#Lκψԗ]V _$Y.)59;;q954Y+%luGuYCzם5 $H$&&5#X( vIۦفװs %  &Z/5:.=3>Q=91%&TZ3Ȃ)ݚy % (?'# 6&ӸHӈԞڃM 'W.368s86s2*_tԅT\cjLl%U,/&/*#dE`ѓdƠC_F, B!0)/4z7;8X7Q5 2,#4:1UVՠݛ& !,4872*Q58Nj!9ʁ-V2;t")/<46765M2k- %a =FT޺iof(4E<8@L?:(1$.>L8ȝ1E&߾zH@2R$!v',_0221Y/+&t~T Ci -8?vBoA<\3%2kCF\&bݔ;#(-1%4d42-'^Gm΍7E@J"K=H@3#M Z-Y} ք/  (.Y369:82(iV ݦ=U [< B+26L?uEHH,Ek=/1!dkT"IiR>`5b&._47O9 95,l H9ÿ/3+ \% 1:VA(E!FC<0![Fɸ2}7̆ܦ* 'b07;;70&W ٭#A\>"I7B(x19=d?:>91%#Pg i#+?1+6983*/f缼PlC$vj%*.0r10U-&` bǹ V~>V"*A/I3v67%6/>%s㿗%ݶ ʟ!_; > 9#%'8(v((%\<g"ܓGHZ'^.C3689970c%k&J$4Ƣ-ݗ0 gf!"}"" C $Y9ʽǐʁtݷM)1w7I;F==89`0:"\G^ٖ^kO 1!3}1 M۵yFi #,-5<@JA>8/"$E,׀XdʁI i#&*D+' l:S=/FI ׻/yOڗ ,'/7#?tEHpGA8+ LydKիnuCx +251(>j@F fхtږ'K ",4c1##6_Eʸ$;3!H&-c22l. &q~T_j@\Ð4+4 C +6c?EI KH4B`6&F"/7ΎعH^%+..+%&nhFáX˰BYJ(a3<DHBK=J{D9*VƋz:4) %G(u(B&!t^9VOePH|*5.?EHHE>o3$q#Vы|Mհۼ2 !9!gb Hetߖ ӿ$Bg\ E ,87BG]IF)Ai7O)C9)%9ב[ to#r- ?`ң͹ΐ"i2 y %%0|;DIIkS3| 6qc]L fẽ`Ũ` V 'G/?7?DpE>A9P.!LX|fz..c n j >g+։˔.ŞI  )317<@A>F71,&"soYHγk l"dw͸bK[wʖ~f(2=;gADEFkE?5(g Eʥ˾Сؗ1 14^`U g`e[&u,֐dF)%/8?zCCxA AAOA>%:1W&F _SظJ~ vw }i-W )؉YNɥѽձޮ24 $0!:?BBc@;4j,*"_ + Hp   .oz ԫ"ь݉''35A@$::0%d ?-~   2cW  $̪˾̓LԲ>QP B?.k9?wBBO>6+ +yq%5P Bu Qpm.6͡eO^_B %u18B;i9n50+%l$Eh*ف~tJ XSG B&iRKUK} j <!&/V55[0*$Y!1*6#'[%,i^_pi -\ gNiA?ʡ zzӂbb`)d&.450&Bliq"# b*ۼ2 kB#w3yy"|,00{.*" ) $%!(cl&ݕQܤ?} h  ^j]m_<1O$+-+g&!mpg'(#jfزѐ=׭PL =!!O %H.ݜ˪ʑ˾3ۼ@eP "($*:'<#"!!#V%&(R++~%AN'hҘ:ƅ̅^*N =#%%| I55џiX: "#"~\"',f/0\1/';QC91ZlWv I]!1%'Q'" \0Ҕ iܟNZ7 bPR/ &%.3I6?5q1*$ :Ƭyэ BoD ge #%#?$ 75gݛ bc` F!)>28:7^1'jw 3;ɽǐ̝<> u e"( V1jh_rJD/ 5 (.Q2>31-q' U_վ 7ڀk,K c#">8Oo"? Ql'Y.10,}% 3 H ߃2 A pBPd3_3  %*-+o&L~S ~[) Z#AxtD +U :Z.{!)j,*'&O 3&wK iC5ߴ{1R >! nx N݀}9{ '1+w)9# T3IٮG~yڞgrI"(++)`'7#5 sZtq,4 9u?#% % jj >5Hgk`9mDɂБY8$/_5652/+%;K\FhU<ެ)!Wi n < {&ϗ%ɾ ӹ&.0466M53/}*!CYlxӷ˦pΣ8Ik  vkuΝ}r b!").26M762n.)!FY Խ jC*F ;  N s$܋̎筝;K#')W,/Y34W2,%o/SXΠ{c lo -}p p^J|W 'f 4%j+/G3=6O8712'@ 1 ͂)Ҵh<q -  U \C{?')a#+X38;;b9_4, ->߁בm.  V6-qkߎݶ)B K'K.f4z:?}BlA9<3,)vy!]ڥ]Ϫ}617( "&*(&"qC<gVn9x ɰCik#-7? D-EXC>17,pd2PՒ  G"&))#B*a:x̍s{S)2 :O@DFZD=3("vִҪБ҄)1eD,"')'x" 9 c6𺺺ǿ6X&07!=?@)A?<6-# :Uҹѽ19 }: $%$ jӁOČʤ}$M&-0r8>QBC@;&4*>TFk3k۩ -%""% H˓Tv4?$./W%W.15:<=v<95g/&73Q԰&ڿ&  I"q" 7ݪEr#1+0K478w9]852w- 'DHP~lmٗE \q#%! ~Ε¤n-Tdl~="`'D+.*02>4?6640.)  M;p8U ?"E$;`)=6Ƽm a4 $&7'L()*++,-. .*e#Q!xڟGp"R?hڹ緻z80d #>)"-.U-)%"e!f![! ZQAdV:Gݲ4Hy| Kg M ڵu=L9TZ >%*++)&!WYR^ H,zuZM Fm -qԵ_b5UZ O% ,14440(/ q2 >;`cW-dV  Tٯ<DN+ le&$.36761s) 5K-$li W %| IHئOɷ.#YS@( }b&/Q69950A(+2p%m G C  + O X  C%NRi`$rW+Emo#*1M7v:822'4LOgG P } xBj o'&֏K N' H%,1.443-# !=@gcO! eO9v_Aѳ4I (e$'8)d($XC\ ZK<!6$$###@$"?> v˾*$}M kB.i ORm"^(",i./#/,)$\LaFߥӖηдʼ*Θs0VW C)~UtJ _7l %,24C5r30m+T%f :lA|G'[wЏ09W>  " ;Xb[MO'{06:<;c8t2d*x ?\ڔѓʋŽk¢ q\ V @ E[1vxi"'/6;S>X>R;(5J,o!, IMˬȈȾ΁iM~[fy b ]hIK <Aa$$-6u9! p$_lɚ,X sD%"C$+%\%~%N%d#6w^ {&Љr߹-g \ Nm x ;4y̮͡U z$I##'#"j! s_IQ~\p|zj,J Tr!~$l$h!hB 32ћ77-F ]!$%a&&.&A$ xb"8zߺ +e %(?(a%E!PK{ VG\q`;`o#(*i+T*($$!l ShMV# (*){'" R~.wLeVd; NV"'*@,,+;*&!#LIـα΄эYk")$&*-{.,G(!G/ߑs!mΉߟz #$(+--I,D)X% 5`5`װϭ5QL = '+--,)V$a"&]Ķɿ\)K1$v+?0\242x0-C)3#4kN;`ٱNɜ[܁`$q*X.00-(o!_ շʋw R'-14I4P2.' ڛ`)oqI I A(-{00/=, (s!h IuۨΎà}Ra2(10?5763.R( , ص \іږp h"H).A1;3`30L*y *gW[ݸTʽŭъ 6(=1]7L:=:72x+?") `٭Ϡyݚw!', 133/'S}IܧDڸ׺_۶ ZR!*U2G7a985i0(>c GΉq-.!%s)-//B,]%Z=ЎPCbp&.35n5<3.K(pj إfƆɂϺNHC$*.10^.)2#o׵4ܷFDze:| t8$o,U2@66874/'r#1i|,w4~Z!f+272974S.&MWP-kΐ!eU M*1A6763[.'2Ϸ{6YxI *0454F2-G'7G$"ٰ~m0Uǎv%.3663b._&^]ҁ ʍAx>Z'r.1g210-)!:^zrdð ^ܕ Xt&,0h21/,) " igًҋ҄&j0V(.243/)"H ۂщøė˔U:7XLv\#(,.,/(!H`=۝ӥ/ A 8%.6995-%k = 1Ic\ ؀z "&)\)(% u Yن`Ԙ- /:AB>6K-V"X .~{ýqOj x"'t+,+/)# T7*+ͫ, )7@DD?7- Ēȍ ZqW1Q!.(t,$.u-)^"߯ճӼ}S (5=BB*?6*A \֦?Q̢)JݏBWXCd#')a'H  >T י܅?*M5<#AA*<%3.'1 ; ڬ8̪r~KQzs+ E!! S-C.G h#>.6< ?B=7.V# ڣ65E͂|=vmK :L4Qf vbH9*K39G=<8c1'i 8}IKd,M!`6 4 cb'B6\?&-y3676*2*PD٢Ξǥ.NKq) w m 60_~h !]*/168 9`6_0'> {~VDƩ(f͈ >Gy :wV1^*G '0.25 63P/t(@ G̯ˁ/ڹ='*1} -  +}xX~^(/4651,&& ;>6Аܓd.efVnOYul][ޥ Waq4&-2|42N.(" 3UԔE0muq H ws F:M Igc&{.3K5h3.(8!hjuwDoqJq}Iu' P I:Zݦދz q#-z488w5[/'. P>0ޡؔ}CMX B i {O8d( 6%o/6::71)e 7: uRULߋy* D k ^o$ۺ W(2,::>=8D1[(= ui]=)# n #E= ]tG6,;81?@<5-$fl߇ڽ'i ?VK` ?,UH} -b_8pe#V1:=9{3,% U)~}@q1F5\6  qb֎мNDP$/F4Q3N/H*$7 } ;v_q X} Zٙ] R%**'L"P<: W.G) th8٩cܧ ?i@ B$'&"'0`^k2 2@?= c߼  @  $E$r/h= !&&$p7Nqޑvt ^ irأS| 6B $a&$ev[ HݎuCOnc ;dHC׫֨mWK c^H2 +d2/aD3i{,ߥؔIݶQ <c *^"  sQjAX8(k!ӟѿ* A#%#hyЍӠq)>"" :|? Q]& }ULިW4N ro I$מ?gF Nr"0")[% YZV[*i ;! :HY 3.=e\z8{!#T$!#! |  /-_.F fI xEv$AKi,`x j'!&%R'5's$a3| MV}/E +z@ 0Bv5#(m=!N%''v$ CB r9bB|NuSv %q U-p9//16 $4()($c#\{Z5|#]$ Y /oJ3[U ){"0'**& !\i4_g~ m 6~ `VcD3# # ),-R+z&O &/CKR~(w0= <& [^܏~@Y[#5),-+&% , j+3o 9i%$g&$YfeAӄ&&"QXm$*b..+?$u9o޻a5m #%{*4,)!"|uhmַٜLH`z O\&,0O0,%bn*Eg;ؘo$:/F }&+ .+$ gܜx0ՙozJdp"*04%50(cJMI޽%JӞQݻ.(#g*..)! AԄB،u{ g($04o76y2)Lum3uzE`(:D/3<ڂ޲^ z3#A-:4774#.#h B|-g7r !d C2]7+\3V774-v"0ٚeJ <(  v{,7.{8U2z!G*3K9;?:R4(ZeF><Ҧ/KA`I3|o w?Th H%G7Z ,5R;=<6+ Of(_U_g }D, >c5 G=d,6'=2@y?9}-< nu܎98rr- JK 2nl:-m7<=];+4b'1+&܏[NSPj >I1zE"1P<@@X;2E#Bl ٗ{r 3 9 e8." U@޳%Q Cm(i7@Cn?7,X O6܉ RߍS!R0R[Xbg) V\Ef=:4 v-K9 ??G<4'\ڲ 04%oC$ I C]g\j2x K='1&540*!+ ?&E4*ؓгBk^5 }nP 1p i N n B +R-Xͽk |.KSz fKWw k#Rm 5 3m  A & > u$ݩԀ͟Ȗ;˿GX|( '|w f .h $:VGt) 6~;{Iʔ^4Er -7Ap 2 O\-(f,*L$6 65rгel]c>0@  _ ^Jr8 x *P0/k*#qw +;ovϟ2pLyv k qj( 2*-48*6.$ NM6G+Թͷj{ƫE͗uP' Vi&* 7 = (/20b+0$fN Vbb.Ķå}Ϛ֜-- :@ c)Sl ')032<.("2a $:T~ɨ-hţɬ ׅx"" aiXs }3 &\+-,(# 7w9=>sI:`%ԀܙWu m ~,) #~'7*q+[*&"  -kRv|֎̋ćƩ./PzC} = 7~~ |!=&'(B()(/'h%#`#j#"7^ kpzsF"4 eu  av#'(()*4,,/,*($xU  AMlciA  GVpq'= :%u("*",.110d.*$eAҿ[H(Gc p b, 2W   $g&'(,03391,%K r%`,eo%K#+'c+504774/(6s/گϜX|D˛B>\# A#%#vplbюӦڊS s ^',158h971)4aG}voÚ½CTN/ u5"\%~" `] ۶-0V ]pV%p,m1 5762*5 JւzĥFɧѿ[c&*> #e>ppܔ46 ! J#).0/,X'yt*ڑϫzs' i H  ۠X _"g%_$!J!##&'T'p$Rߑѣ΃͡XވjxL@Pll+a<2o;;)&e.23s1/.-*V$͆‹!eJIlJ  p{A$bvҌЏ^"-N6-<>>;7d1( p,e«ʺ+Oo'"&('d$ XxT;Ҏۡ1#.D8j>AB@8<55+a2ΗÛ-չu( C"i&)*($P  )tخҒ``Z5 *&08=q?=?8."@o9sW*0mXr)&  $<'q(~'#]` ~&Uu%ڕ Sr'07y::7,1*'d bߑ/@sd֬I; +#%&&$!Ql :qbb۞ګ>*6Q'0s57 73+ ˫Wʜ)z 8L$&&>$*jSS)gvG (05750(4:K^;ȴԂz%2G$'(^& _Yےشؐ۲Cn(":).x231u-r&BK*ʪiÅ}p] %X)*)Y$U]3}ُyJ%-3I7e861-(a~J*ֶ˴p±qO}Y  n!%8((&!  #'ܑFٻIAi{(V17;:170&X RX9޾E΁m)Z!y'))%{ ܽCXM*.3:==v9=1& N-KFM=̇ބX `J# &$"b,>tS<j)19=?A@d̦ԗ c%i<#;%$ :mTD--|:Pp _!)G05:<<)8/");Mrƭƚm. e0#$# <,=ɚvxG "J+p1`578@8 5.$/ rξznٚo+z z%@(({&! U֠ͫ1A#&.4(8]985^0' 6׶͸D=ʔC~ M$)L+<)@$D3t_)J28)=9>;U5++ 5l*?ʳ3* 5"#`'(%l R8)ѝم!c*16::G82** LЌӽ{^z z"#g"FDLҿ3/TG$*{/p2333P0*"d 4H=tepcXQ $ a\]Z%*-I.,)H$%A# >%NR޿۾^ۉxGH DK#Dj Cݲ>n!m%''&0#3 Ve.t6 j ;g `A]&r# ]!e%'(W'[$Sa mFC-?K7]N_ %f(('B%$! 8W ?Q[` Y=Z1 |g Td&! %c'5'$!5 } G xfn'scRUt7 A7S izqc "<&'&$"QQUj{U# e mW,S_)Z+*Mj g! " 6V e0#=gRL<< e a _ B2f[&qH Q0{`R 95JEaAZ g S > 9*G 9d58[{Z yXd,+vm[ y Z!B@=D1|y -" Wo-;@!5 ~  ` oGwV3>lK ^0c)=t5 kpq,9JMYC n # OP Sz}&H  = fI4GzJ:\sCM* f }L  XS)S0Z/%5zs ]:8`` 4 > " +-Na/&4?$1 QdC2  / B . = fkrWEG\ V#^ S[;neyyJjG 2 Nf) + vL|fV1hTJn#(Iw;+E/637 Z//a  up @ H ^ .-hS8"&R 8G  {6<)bD)>H ] ]yBwdUM" *cv]u:lZ A3 T'zUe|c F >g/ /Deis C `Moq DwF-F dH;e4; G T ~ Pf-? 3v 'R =79`  F g ! zU!A m1OR s*= _D JR  0 } w/,%Y[.^ 3Z r )cL /SH9C <4'8dZq jpO{ MxY MyG=b8 F JU1G)Rb qP QAHE Ug;"e\:T?#%\` wPS" 8.i"zHF  s7Y$ ` >JH Bb 2AU6^-[ # ,Hd2s9mE# PH  8CE.7~N  JbZXN3OM  TWT#j7  B  1-Nc x V @  o^5EDB f  ?\^0~S|  A0p1aMV 4mO5{()wB/~  e D >' (W R V DD9~ydQzMK `;!;H"x&) v45T $>"dm0pFdtzEEaIea y  jD@Ifeh ?)ZB/ 3 [ $KF}+XG{=j };^ #cqUy!3]E~Qy@$ \%@9 Ru(v H2<]s<uVvmE"'.\Gg~UIa4Z^@| V^n-{-c,R /k&95|$Rc _{X F[MUhr3 A5!J\T5@1;"U'ES.:+jV F9{~]-r*F1QS>&."qdis{|vw|J  RoE9f&% $L&  A{ -.r5L!% T\Z"M$ZLt8H @q $Q%O B`# @Z"*&xY6T2-M\$ _)!]$+P @r   _2 +WmC  mHBSn! W.  C} *+w:+W!'#`2"cc+Ap   M bzflag-2.4.2+ds1/data/menu_arrow.png000066400000000000000000000074521200563112200172440ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?( F`dM#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F8 QYY( 6[GxOr  ~L0@V؛π8v FB0#x.0 u `222H1){!BO,)fp/2alIV"Pz&JGA_`w$%h'x@Jvbagb@ ^^ðIYD4_gߤh3n % y1 ?ϿDfFH920O4J `Û ͏3|@yeE1K4'>Xto 9H-(*h'+@l bAZ ll|_;3#C# /38g}dcbdC 7'?3˳C\U?P# {8K)3,Ϡ |? ?1 J`'c}O`?_ R, DgA30W(%Rl> .1'P,u/%0[sr̃ Oa.̠tWrV` EAǏH Fl'چKX-Lebfx.VɎv`W }#(ہ 2+(. l ?Z{;` LBԎPead!qJ~fl4"z6u ,"12sS2WHe``E|SbG @A"g?v`L/5Bv 3W?|6־cOF f` 3d KB?Qpi.4bblrH yĠN?%N s7# '309=#;`^-lpҿ!@#)1t&Ʌ)g`7ӗ80cdx , E304 * pK-#25'HH1@Z2b7d VȲ22afx ,|b`xAF%;?Q"j3&Ј-@K Mfl\/laa,|`45"`"؉M@nl\UxSĜC@Y ԯ% 3Т@/\OTqX@Q10a`̄RC0n\V|gaxp[ ?@PP|`&s@p޽挰 ߁7/AФoGJEHÑ oXh4 MTh4b O}P X :zѪfpU_&4)FZ/BID@# AC¦Ȇ zjVR )  @D0d y$9*'X7@%#HK(~ ɠ^2 @? _gaPG9q4|6`, ʌ)Bh/9>yK hߌDݮ 诨]Lh$b0r֯ 0<&Y|22ǻİ';/1G1\ n10!ȈFǥ FRbfY_ r2ؼHqZa4"@OV %x'.!`#34?o  븁5|2I %1 E9+5Pվ7; '2Z JjX>2x2}WאWP70R@#)E0oҠF, ݿx76h.HДی 31qQ=GW`/JiOh(4Sf?F 72 Hܠn~H C :\Xє3`g i'X{Qz.xZ\NP%@ H]_`DNvGR(7ge`a$ u똀q2T~383c(?Dkd(&z"9a@#E50 s0 @VYL#zĶ"+IX`B%3j S`LV`,0le7P{43˄A2V f!31C&ofBFdwA݊  T @}g:#(# C> '0@@=}Y%8$0YŰؐS瀥1)vpD# ̓YXn31ld2~@@E;2f1p/C,010$ߌ#' B2^  X#񕀭ֿ2\edge*#h'w`qEYeNbla3;{ &:pO`0P߯ZXD0q0bb8EW"1d}7Js@=F|Stt0evXj9(,PI@#hPac`?Ƒ6R,Dh$ et/ FAti (4J8<=ɌH: { ^Z0#hM@4K qkUZF"r Fv@Gp@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `M#h F4F80@&h4p@ `+ZAFi26IENDB`bzflag-2.4.2+ds1/data/mesh.png000066400000000000000000000322341200563112200160160ustar00rootroot00000000000000PNG  IHDRL\bKGD pHYs  ~tIMEcT IDATxmkorq$:bFZZl4#%b_Qlx5?|^VWWWt:xxr\.b8x<^]]f'b^p>7MkY,t:-vX,f9oooeZǛryyy[zɽbl6xl6n^VV+rZz~/n۠}l6jZ^__[b8uM}fY.b\ժ_9á[}:~'NlC?l/mI[x\._~np8tw!O2ɤz~:Zbh5M_VEv:^__~ޞ^__ڭx<)AnKWn_t:Z|~||LvFJNˋ~Cؖޢ-x{{#1='XVWWWjz~~kX\^^bfgZ@߻E3-mY^Rdj\&׹v"^Û/˔Cme}cǐedzvt:v;OXv]V޿^\\v)YR,IYStݾ%:iU///-ݘ_4hzjX, Htyyf"S^c^wlqX5ow]) } {҆秧{=eWu?YV3H.o/$-H֖ȋ|d!=jݟ!Áry?V¡`"[у|>???')r.//)pm$5eoq8d|^!h{^E̳6w\VRN{qf߾}UL*5\.3I,uKI;o]Kʛn[xҺﯮz>Ouuކ~rumz 'vC7jaIvvЮX'-l}Kn}t#vߚző777-79M?څ~rybdn3vߴ61 OOO)P'j[8:\kƐ&= V+///}5Us#H)3Ͽ///@^EUltWWWp;1i%b0J:Ё9~GƇJzg.fvp+/Ģ⺞0}fуX euXBuZ+[3כ?N{aYC Xq]Pv:9- (_}x휄5X|[T<٦|(RŽ)Qo$KG1AJ {'aGIbln|˳xxV^]]%@jl6Y4/-8C'j86pB?1S*GZT*+m)ky* IVp8"mGfvzss>f6jn=fOtz°p 2/3e@lR"xz>o?iRZ$AJj2 Wo~}}%h-C󯯯^3PWȫuJoiy۝ȯV}at!rZbI[ HV.//׭0>@\VB1S"(! Mdo*,Ay{pyy$"SpD-,<&L9nzbB0Q% 8@3-=e6v2)QjNq^gR 8Al HсGz_`!¡_[]~~:7r|@Qa]KmAh)y!YU"yeL*憤Z_]]>Re#;kBxKo4[nb,g\/þ13V|ޡPIltA/Yҩz>WtgF3<ַwf3K%YD F܉;ݐR[pHzD"\wY=*dXJ7 _|iڦfWpp.H ;Vl3ўn3ۯ#Z_%kz~}{{ ӭsaapF?Ͻ2-Il=KH,*=hfXv<sc_f1ҡ"^3{) ނ`sllvlMm{w=Ėef1Chg]$yД^Vn [N#*G*ܢDVᙠNB[0rv bd bCNl f,>O{f؞v孹0Az^|5!Mb;х⟄rȏ,cV)ef+|E}P." VsJﬢPt7M6 /*: =*G,Kǖ~_ eT9t[az:wVٯ@[CYn?iJ= oF5d(+kk777=UI턕VR+Q.6{BA'T~|뉤zVU>-`U/HUsa;7q^umGA K3fsO &/// U#dZ)&J_{~R;(1Eq]&e;1mHf $+!˧2V޹Tme8 Y2jmJCMIIuUrˉ﬏R#JV&i+%z9|Ba8:ow6CĀ8e(!s>1Q4@6}*P( ^װσϗWO2 ~J09^o1cEVUR$ӆ]6]L:wiz_bgg5Ït?bI6C@4d2<>>2rp8,9Ҏ(NwJWMD/qNk 4 `\ͫ0r1d ڶ+(tK;AM'D1n[[^Y4% jI R3v!YKVdUfW^OzQ *dʥZ=P6A>oV{bEB;%A1Mݵ5~4jRPɿs*DZQ9 1D͜ItMf/JR2q©&jmnTSF#(q>mhǰb-d[1?c R+m(; +p`Jrm/-|x4ys|Ӊ8">I1 d{'XhyRR[,5!{xxp){c#k!9 ~OJoKk9=!Ljg*I♕&kfo 8tyy%iFb̠-(!10N)vrdbW[f$JUgBx˧'n8P9e /Rؒ5Ӧ&>#TC?љ)c޳B "UO3*kp|/OHC3rըxVե7&s47.7GAAv-N($-jIF`Isv,3u#}v!°Z- 1&,W/J IGEӯHb.YG%im|on+|zzL*A\aO8\T-l[U$,wˌQ, :1o6g0HA]E!vtpLIlάM3<:1mZt# 1ζR_RUq>T^[u+@xSPI/4=Q,k;Ąp&_TE#Wn(mTW=$c5K%c;(Na ai{xU{_ ueID^1|x$|:FȐ-ړ$2)Wo ~=flԨh<%ośfd&McES 7Ŭ3}B))H]奘\<,Jgg!Dx4iv'W}ww`jogŐ/_8~wwSEۣSFJ'2:u_4]h%t׿?}"CL0@TϝY _Y?E,ܥ[7779A>$R9$%׏FO>Vj.a@-ǓnYB{=1kk߯'PzKV4{/􎗗 kCUnooӡIHTRAΌR7`'{"ҳX<4POX H{ڻ,͡*SYDAJ~p>Y!MIhL 4)oV E'n ؀Gԝ\|,iTlW|rcSK-1 lr $1 pб/ sĊ`+QK|+ XA _?~ ).u.rf͡NIn.$ #K@&Dx#nOv`^?'IPzX>_ӛzY}紡gag.//CũgL䔸i6'*h ,H*FEV9RAMRtmŵr’<4EƳk\_{w˗/3iMux^b Q uY(?rzZtJ#fGmtXdЗLuƩ|qpU,FI EՄo򈉎dBVB2*) %q bKTe}1gPe2nV0:bLMDNT$r`%y3,ېO MGliiOw'"Bw}H|CUDy$Ypnoo=?lz9Q2XH&™MIdys0!HW/9߅وRX{xxk6VlC$vVM3)uf[m\y:蹥f_UE;vF6%bqhN;][}j:Gsx(6f^ wf%eC߿D`d@eFRHtOf$$U bQ Tnzr;ZО8.Fcq'͔ \ c lw PGO:>/3Zl#`L'=_f\ϑ꩓vHJ`3; (qw!Y,7>=e<7i'3 ):K{<'bR?i~b|*:WYUut9OIb4zsxԞz ^kfaA{[3mc!"rC9$36FiΏ\&4 W2ΩhVZ.[AFmrcXT*Y3DIFb۪&>i-v8M:Sh7VI><җ^fؓ KZrKX4>@R!q).XLY㞽sœ ih8ILOӛG SAZX6Hk#gz p}R4l20Jfq ~QGgQ"ˠqJ1qFIzb 8?HB[c&Yfg2nN&suzH8<>LgD5sO&ظt}5)Ŏ9(W $iyYӖ%щ0&>U3.EDUKbfF t0+Jl,864K 2{ ӓ ckja|zۄlHlčY @*L:!'Lqmw\?DH 7L1+ ٟzD1<>>Eqq9P$}5&VE{ZC琍YUm &إ],Y+zTpl/..Z_i(q]ᨽ|BV$d/C7K(i+ 6 ]6p mL&noo!i΁ԧi]FE;GQBjmYIݠF?yOlL6-n$@0dasp>݅Znd!:ʼ mYGx2.c)O9Rg 3䘰OW͈gu7[6!]g!Esフ_  eZF`WԠ#TXpײT=MU&Z L aq`H֒ؿ /9Jڶ55 ^ݱøL`h9nNB.3EJ"^a% ]裗77$LCLXЦ`lq&NvJ?6>==gow"@#@͜06J KgϘLms@YY .iP:s6 V'MpVW}E{5BF$sôpt~^wPjwu?#"B9IDAT{̆MXv~w TzYcy.U9ط\ԇ,j[jH}_{VC_ Tg,I 's5 ^@(T{`nVUuB6 ה Zk! &{6f/cǚίqa)ԛ@['|t,իKҀ.Aޠ9gߤWWF_KS{G^~ =uKldu@T6lsIML#}//3Rf s}Ҷ\ŐZA\O#`Ubs4-љppc"hjYdඡWl21!t̹sd7:6XvN*B~?7UƑeR ]!n*bq'^93 q|ģ>O#>]UsA9~4JGu`v;|NiٲXgocd4 շ0A%fl4+8=oeWn:VSY~*/R)feo?͔@*Omk"َ1"xgs\K_*?WfW=ndlNRuA u=h0W_ҲAUHݚ>0|؊9 ǏMIIiO3,(XjOJ KV Vŗ9+>j]pU2,%[DhKW5k԰9֖ݺUF#|bak6cvS#5f"gLUf6IKDV44chn C3dt@OSг*Eg>&(|jt欘"7 ܎$(IOmyjäbfCӳ2kV!HR⹽.p&~s1G5jm=ApmgV܈&4)dI NtQl,{r{{Iv69~˗YMr\P'v?a8kl%r ut"]ЎCfDZܭ'(5а9n1s*zlY}*p zpnx2t">J/E8ODgW g:9ە i1s{:S*3.Sq#/]l#K.;^iW^wZLxmEfɻjЕi  o N5WW,ے&1)k1[ZbXj̊R=, tfc; o҈hN+g̀"Pi܉2dEu{"Kzogr^uP}wwqF 2o /TBe>Kw;W!D sfkSRW1d rNQ\@ zĶx ehzy-Pk/tsVؗ5Bx:3j2777}cEe4Ab9qޣTn̜91CMo1PUaHʹęʩAh" \Wde hޡyR8o:f k2̺`^T] W"[_dI]a= d\.mEަAU5g %?sZc OdbT\LT\RfNdI,g\6[Wfpp(<ɴ?ɭ;L 0O-ճ-% ]?ܹ.4[<:380gznap0ù܄ 7]A>~*>@$R$q$.J= -B4jGf,.psQ{_~uKLEE#\gZ V7-QqmؓLV͔@hHd8'`_łڣMJsgTL!ӌI\Ңma F+bFcY&&0@%tV@ȗ/_>ѶJq~Y5'<6263!̘ 7mʸyPd9)q$Q㛁==Ħ%>|^ru# Q|#4p8M WNfӿ|nGŗhGMctv9![ $LXd3`&0gh 'N1԰l;9VE04sUĀXz8.7I=ݙ:n2/L/_T>{m Ϧ^,JBko? sָٺ ;VԬeAhL$OȔ|$מ'sl6W΋A|__E;mx^}X|1{]f \ϊO M,=`\q5ٰVd|%6]1ɞym-¡[υֳZ~ W.oKqa(ls L)mF%o7X>$J|||!9!Lw*YjAqF*d[iإZzi eO>?uq,`u|zYd}~>G82:x0 n%U5_*Ɋ&:^WΑ IU4'cmbҁup솔zĜa9mAM&(Q_?;'ŎIMՉĚ>H[{r(alZDIap؅pԚKQqr c}qc&(+ O_+Dz0N "dھ57L[Q4əƂϮrnE.d@d+.ROs#8ےfCJ^>3$VK ˻a`(R6Դ>T,v\50 Zc??^>E[?2Un4h2gB%(C=a19*ɩVl"_-+8O` ȪuϋUNf%EpܛĄ]ޝ #g u<7吉x) LtZҼ9Kcj*F@-]+t[Qԁ l{̚S2 q8cfXt?h>Ο9ycZ-KU [dGmU)'H_5: 7kW}ʠ(HWAve;h.I,ERL N~2MBʊ}R RPz)2\S\D)KɈK89Hw vKJ?ŀ/܇&BFEM d"}wWü\nU y20a+ u &pf\z&t+7QO+D8E>&)QAJ1_5#:'yskvc)0\l.;懪(>фxǑlU^(.ҸK+$nixSYL*Fdd)ټEi%Y)ט&KJeml5qhCӚ|_7jF8l5FǼ*ÒIi}LIȑ'H OCܳ~ gNn ;] 9BWiV-*B kǐ`n9-2S1k{UBٙtU)۴ %ooooooj;i@nm[V>o`b%(E0s?ϦCKL~b_vL7 ><<|4~=a?ytOP/j?* zTս UmN7sbKnpP& RQo$s bN⨏^B@/U~%0 >a2(c[q_,a^gjy$!Tɛ3V>Mat߫-&1q9~fzJTwww|I:4iF)#Ⰲ babe׉IENDB`bzflag-2.4.2+ds1/data/message_admin.wav000066400000000000000000001163601200563112200176720ustar00rootroot00000000000000RIFFWAVEfmt DXdataĜ#-7@GOV]dintx{~Qz#F?e) [ $ < a&E p ~_9C&  C   V&qUj4/q@<-|  9 RdsvEmZ  STsc zZK4 a D(m7^VoBfo4/GH  3 Vhu]D%#Vuz.i9lZ r r(TYUJ +k, 5q\MxZww*@p&3F;x86 iX.{ ;KB y xe%&jX ^'  KuM;u|9Pk@Q3XHFdg)y|?xLt <];F P R  >T^JE%s6t &tF dji/)}6O,"edoEQ\; .Vx(o{C  a Obxp3 &3~ 6\//>|Or|A9H` NN?0N2 2 +wDpb H2" _-f.nc!w,l rt 4;pSUu6%=<r#2?V21wD v Pw>d+7qG Y2 );8 H 4 0$H L@fEHQ-~ B C`s~[VF 4fh݉'߆= CYIQ'0twUB}&   H k ;w tR3 is.n $ W 9.0  yJe&y WF{P ELky] = K; ! Y jOE u D0gqomrWw`,z L[J !\# |OR'J=GXF76cQTM\yrK P w >HEUkzU m !!5[_/[Nsa *r&1B| /4i3 M db R/o @s c}'i$9N:0[%}_ t !kg 0EO`nURuq8XC Kw2{AMS ~d lp ?p2 a8tLV[pn68tp VV [87843m a  :NP16&rUU 0 T 6mZd 721+(- B}3J< J8e% J n?v}fap5 7 i pGYe6E}(5F!4 7 [=; F 1 WDz^e;In^ o h q77@G08 >_oYnB`'`DB+N y u-uIFm&x^A>  ;n-N "_^Q i 'F(S ^ 5 9 0ns-|S|TV7 1NH |O=X*VA@e >i? [m \["  ,V>0MU69 ( cQ ) (@)K- _c8 di;-`GA $ v C  vzp6*S*uR}F c hwxU0\nS~[`} ? G tNK" pQR / Fa7X (pqp'#A a 5(p8T8F5![- Sa qqce' 2 z A 7 $JbxMa?meu&e^7 #& 55zJcV'9KJ<. !B T+SPCm - :  CQ!jF?5 d .&(g:~@`H 0 < ^ x f ^ Fbws\2QoF*9!1pMwBP wO> 4Nc$D A(n=y,/G  "  5g`R8=5SY9 5y< es}0cZ|\SAO]4hy ehK>r1} "   ]MHRx`ijEYv+; GM X2o`imtJQu8No& U  4b_'x$ h +}:$ CRp@@ =8  s TF>YVLBJ2=^@A?1{y j e P ! ?nbb]]oi(0&  ' HX ]E 0`CJ %9/QoHf ) m?v[Ts2"K~)!bwZ3'N7]u; d 3  %0f8=EQi <[ 8G_gW/J,wI(lZ/+e~[-N6 [p-4_F-]O&l VG_~^nZ7t@IX\Nt6ZG%|c&hQ?& %J]S`/VPMN[6 ?jYQ -_z!/GsP [%s9RLeB$v`V_~ 2[~L*`!m&B6yYi%L |7GG>+/>Ixy dCNGX|I()?^{>[:|qxtYLQg pT# K\xB_wQ1Klv]8%-.(#z[KNd!\zN#1h_5GT# ,F]hhdDrfm >i~S%-@mNa|JwL9=Sy 4Rad]5qL;@Uz >sd8;|k6u\R[j(c[&n[W`xq0 $V3Vgf];c7 "6]E}[,~Hw;~qxAg/  V0)=bSkbOTlEyE1W#o*ER+-.( P*!2]Y{-]BAW}Em8'ex.lhv `G ur QE Cnn@V*6_4m^-zhdpkg#lK;ARv_t@w`W`ul3 LLs~f0P'5dGsCat4ndg}a_2 %5-[' 1g6sc p; 8r_d.L)! _%_d/4M\N-z>"[<|[\' 2x_k9r z@l`m:poD #/S:RwqV*E2t8d~{a<#}LnRJn0b|^6 '"<`QLLR#]|W-xVV>R(i{J#36"^0 E$jOb52SEzS"It@ utVqJ! *+t= <aCG!$BiDipO#G~W1iv8JTRJB4! xnyE\ggkuo[B0#&=LQL?* '#pgt;QcpulU1$>NVVQC)9Yipz|jR63NaicS>)5I\lpgP0"#! *0+'1AJNTae^P;#1<?8+   qiy8Zs}c9  !1AE?3shs-GUSG9,%062$#@^_,\?@XIguvsk]B *J]VB0/>>/%%! #% *>]f6liw@^suU/ ;[]L:% '>JJ=11/%-32**=UxxMpbgz 0Pgtvo]@uq{ ,GP@% 6N\ZPKF7# !@d{|gH!Y;2A_4LZ\Q9pbg4N_g`G' '##! ,>UpybAdPOe!Sd: /OfqnQ%1GTX_gi]J/  .AVnu_; JudD#<Vdi^<;Q[bnup_A(BfVzroOwqS-|zV`#{_]r+@SXN9|z{BYpnL"tgku%F_kk_N82cv8ll}9OXO9//2Vk|lG /RprQ- }+bo/4TtkH "#4bQsw9XpgExlho>t6op+VqveE#>LB%|| 8bb&vdi1N_iotsjX6xQ2!#4Lp at=g]bp!9VxWT2"#2PEx~Qqcdy )?NXbnriT2 hWU[gs5knE<PWSG;46:Idxu]9xlgiS{mA |nm{:d|zj[QJB7#zr|*DduT05GNPLHGL`|j;k5 D]x?l`d{0dxgQ6#:LSTJ8! -65*'J]X@vS>23EpP]&lC0*6YluN%}jdq/1% (31%-BB. Z@/(-N ^iClJ67S'ue@!-,# #)./0241(  ,PnxiEh@(!>.  +>>0sJ+ =| ig%J AS bA**572'  '//&!.+ -JZXH*G 5qXT!h9:s Qvrng[QI;& 0KXXTNC0Jp~d9n2 ORnvkQ-nUQa=on]VUSH6%/ALQJ1#%#/& U- ;n%M\S=!4J]tfG1# $;MW]\K*z{$*1?Q_cX: h@*&-DlLm|t[>"C^peK9-)-/6GSL;4579:6/,%0J_iidS@0l]ROWk-53-%"/SlqO3!!/>LVRA- !,14+;btzyn]G, lXJHWs 6@@<0 Ju|S+ /;;5.("!#" z8f}wS$n_VRQS[l -ERXQ7(Jnd?9]u|lHdMDT XWiP@BQm-Zx^(0Gg|]>&*DVYQ91]{P}rpv8\usR1AGNZm|pV@/%%*1@G4 qlpx>} ET- ;n*g]wfj#1E[lpgXG3!*:HS\Q'+OmpD |U;14LtDkzQgLH_2FS^jx}q[B-%,- !?fSiPNUh Ikc< vy+:EJR`pxxtk_SLE;1%9Vfif]L9{obY]qOzu;g=+,9PwGih> yx6DNbzoe_SG>.%GcsyudI*zsq|6Kbu{mS/m[VXcx!@OX_]P7!*6DLNE1$1.6N]ddV:n]RNLO]z&BTdkfXC%|$7:3(!0?LZjxyjIAg~^4 pXOR[h|3^t||thV>*62&$'.4*5LakbG#  @r}>}L/(9\*_iG#xdal'Xut_A%  %<INW]V8 &Nxb._HBV|5WtlH#{[OVo /QimV/ !+51 ;nX#eY`{4J_s~{b;kX]xBd~zK 1AA5+%$(/0' -V\(9R_lxygCiSZz#Jjt> $.=C8$  )BVk{z`;B^ijnro[3Z1!/XVh6vpv 4FG8%/H[kuxq_< -L_c___[H$D#V]jP;%hVQ]w &=T_YL<, *3530/+! +0#d9&+Iu%[~umjfZLE?0nQGN_{ Cau}zkW?#""(.4;9-#   !-4-bD=Ln9_qvuropqj]OD5}eY`x"C[hi_L11;5( (C^wiF,BLC+wt~5Sm|~ugP+gH;C] %7AB<4+#%9N^^H##T}H lcj{4N`mzd@gOB9B]&EPJ>. !Lx[(;dxK2[oo]; gE8Db-2210-+**3EYng1!GkS }quBmh6|VGEJZ~G|_s;%W"*!#;YxN /Sk& .FY^N1 |} 4e>}YA34BYy>c]!lWQLN]y"T^ 5LVVG,}b[ap,VL_2 =b/Y||S~lbah{_J!E]ikeX@=mh#|`T[mw~&Sy\/sbTOS_s0{V9/6EQVUMB6-  =g[#sJ79Lfzyus}(Qpy]5 0_nQ;6BZnsk[B# 9Sagh_M-kPLWlzngit>]puiN'xHvhN/4EI>#(RxZ[<4=O`hie^_hAksT/x|Nx]OI?-1EON> JwKd6%)9M^jpqu| =gvU, >pgG3"/HWYL1(T}s;sO@EUhx-Nbh^G'%Szh> %//!6^sEp2 Qg|"V}kF >gtbL9%6Siyyb6pq-dj/g3*Ln7SgrulX>% UsW69O\b]K*$9B=-dVU_n$183*" 0NbmokbXLC9(%4<>6(=V`ZD#fE56ATk $39;>>4% -Kali[E/   '/486+D_kgS1_JDM`x'-4641.+"!&$ !>Ubc[J6)!!*5:95.(#'3<>9. +;B>- !&,.+#!=OXTF.!;O_ggbXK=0'!#:HLE1cQJKTbs  *ANOA& =jkF! !#}xuu{#*-*% &EassdH! XgB#    (+)# 'BXdbV@"'TzvQ* (*'  xu}%@VdiaO:& =U_]Q=! 3TmxqZ;  */+ /AJH>-1K^gdWE0  $*( !,6>CC>4(  (9DIJH>0"*(!!%)+% $-5=@@:/#   #! !&#  &,/0-'!  "&+-( .?E=, (+*$(/1/*" !-:FOTQE6$ -ETVN@-! (//(    %*/9BLV`fdXE-~4SgkbO6#-4;;0',27;DLRVSH9( !-9CKPRRK?/zeWU_y#G`idQ7&6@ED9  #3;<72//1454,!)6AKPNF4hP@?Ni1ISQF0 $%" ->NW[SE3 !-9ENTUSLE:+ybQLVp%;HJB6"  '*(" "+8GRY\XNA2" "-;KYac]TJ;)tjm  %4EVfqtn`M9# "4FVbheVC,qjmz   4HYb`WI:'0BR\]TB-    $>[p|~tbJ, (BVcieV?% !*020*&2:>?9+@b~dH( /I[gjbN5,8@CA8))=JSVOA*6QgrsndUD2'4<=5% "1>GJF<+9P^dbU@# '<JQQI>/!#065*!"s]Xe$F_nspcL- 2RitvmZ>1BNSSLB6( 5EQSJ5uq}%=KQOG;*!>ViqpeS>% #<Q^c_UF5 +:@>4!  zz &<LSUQF8# :Tgpm_J0&>NX[YRG7%#/6861*/J^gdXE0(7BHIE>4% !%(&! /BNSL>-,AUdotri[G0 %+*# .G[gg[J5" !6J[gkh[G0 *-& ,EUYRB1.F\mtp_G) &%  /@ID3-SkvugU>&*Gau{kQ2  -9<7)/J^fdYI8&6Sn{bA !*/* %(# !>S^]P9 (BVbebZN@- )BYlwuiV; !  wsy#13, (6;8*1AJKF<0& #9Pbki_L4 &6@B<-&:KV]]ZSI;**;GLKC6+   (/2." 6IXdknjbVE1-JbsxrdR=(  !$6FS_glmh]L9$,EXbfbXK=0%-8@FKNNJB4& (>TcicVD-)3;CJNPK@1# 2EQWUM@/    !%" *>NX^_[P>( 3ES[\XOB0   -3-%/1+ ->LSSLA5%!4FS[[VJ<- "! (0- '18:93( 2EV`c_TE2    )18:8/#*F_txeM4&+,(*4=EHJG@3" 4GWbih`SB1!  %**&%-49;7,)DYissk]J3!*.,# !.9BE@2 %>Scmpk_N:$ +45/#/@LQJ;% +?P[ac_VJ;+  !*/21-# 3EQSL;$ /=FLLG@6)!&*(# (262& %/5784.%   &5;7+!.7>BA;1$ "''# %6BFB6$#1?JRTQI;(    $/54-"->LVZVL:#  "(*%#2ALSUOA+ $0<DIF>-      #.8>A=1 #&%! !"   !+6;90!        !*..)"  #-0-#     (2884*%(% #)($   $1992&(-,( "" ,6;7-  !  %/462''**%     #,14/% "'('#  %/7:6,$()(#  "%!   ! !!   %%!#*14641-(#     #! #$"(3;ADC@90'  !"#!+4:<;5.%  "%%  !,389851,%  "+132-% -:CIJHB<3*"   *39;80# "4BJLKE>6/("   &**% !1>EFE@94.(#   (39;9/# "5DNQPLG@93.*%" %,//*# (4>BDB@?>>??=82+"  "%&%  #)+-,**-05:<<;6/'   "%(('&&)-14652.& #(,16;>>=92*      #*29@EGGB;/"    )4>GMNNG>/   !&-49=?=90&    (5AJOPLC7( $%"  !#! #1=GNQPJB6(   #&'$ !/;CJLJD9-  !&'$  &2=DHIE=3'  &6BLRSQKB7+     #! "2@KSTQJ@3&    $4@ILLG>2&  -;GMNKD9-     *:GOSRLB5(   !-:EKMLF>3' #(($  '.121.)#      #(-.-+("    !$'(((%#!      "&)**'%!    !!"!    ###"                                                                 bzflag-2.4.2+ds1/data/message_private.wav000066400000000000000000000212541200563112200202510ustar00rootroot00000000000000RIFF"WAVEfmt "VXdata"  ## ..## (((( BB## ..##88..((##GGQQQQ ..((##kk \\ .. 33 LLWWQQ88##uu\\  vvuuHHzz44##qq..llGG BBvvvvvvCCqq99XX33llppvvvvLL//zz==aauu88ppQQLL{{RR kk##BB==vvuu77  # # BB  zzBBLLGGQ Q ffSSuu//##((((33..//==((SSbb11 LL kkL L   XXII88z z CC99II##??kk>>QQ z z   2 2 pp9999~~oop p  9999XXccggLL** YYzz%%rr]]hhXX--NNNN( ( KK?? - - ww##GG ||u u ll||44//22kk::`` ..//[[||??- - uu|| z z   u u NNtt//rrkkpp kkmm55qq==ff NNVV// Q Q CC` ` kk%%88[[ll''[ [ --gg  ,,   ff  QQ HH e e Q Q ==qqz z j j # #   77[ [ FF[ [ - - WW - - VVee//--LL kk KKooHH [[ ''UU  PP zz[ [ 2 2 jj==gg~~s!s!II Q Q A A V V SS6666//<<##kk((2 2 XX,, vvqq''gg kkbb [[V V SS j j GGVVvv//FF XX99SSpp--QQmm11II 88{{zz%%||KKvvzzhh'' ``UU::Q Q XX  A A ||\\//HHqq  SS` ` # # GGkkffuu**VVGGLL%%   ((<<j j   ww,,77$$==((CCww((  ~~<<^^mmSS!!II  kke e ppgg kk zz ((''  ##  pp V V ((77BB2 2  zzQ Q uu   zz22 7 7   oo  ooppz z p p ## Q Q ##++**,,݈ш,,c/c/tt͵..D1D1JJ55w1w1+*+*//ss??S4S4:: GG jjJJ- - bbh*h*00CC||YYݙNN))%%[ [ ##ttbb  '' ) )FF  QQ33jj11hhZZYY55   iiJJ!!{{,,::SSbb<<""&&FF$$ %%## & &ee--99UU&&ٱTTrr##+*+*==__ii44n$n$&&  uu66kk ,,++HHiiקڧhh""i i DD SSyy׍׍ssZZnnIIAA  ::^^JJ   hhK K ,,PPFFDD00ddxx22YY00Z"Z"# # lli!i!ddޚ7777}}x#x#O*O* ((VV1100gg((HH_#_#''j j ff``$$QQ--*4*4ccxx[[ 44 ( ( 989844F F yy22XX * *33GGtt##22SS>>kkoo))''..bb%%SSbzflag-2.4.2+ds1/data/message_team.wav000066400000000000000000000212541200563112200175250ustar00rootroot00000000000000RIFF"WAVEfmt "VXdata" --  $$&&**@@ &&::::"":: DDII**kkkkUU$$yyZZ\\ggBBZZ55//((&&KK<<33KK11{{UU""vvDDAAvv mmggii1111BBooII11??>>^^kk77]]##BBffvv !!$$55uubbgg==@@,,AAFF1177JJggaadd}}//&&,,55>>JJ##..``55``--ssuuYY33**vveexx{{$$00ss YY $$::  &&]]''&&??88CCW3W3LLff))**};};NN D DĬĬLL33AJAJKK11΋TT""ڹ W8W8@@ ; ;[[jj˱˱33DDKK==rr١٪**Ǿ88-R-RIIuuէ!!llh:h:GG|>|>U%U%::yyppII(*(*CJCJ M M))PP{{**<<==''rr77ܺܺz"z"NNQQQ1Q1vv88""CC11::::--xx˲˲qq܂fMfMNONO55XXʹʹnn88<>GGb3b3 ڂڈ\\11EE==CCߖʹʹRR11//CC99%%žžFF̷==&>&>M!M!33ннϋY;Y;99ϭAA++i7i766==SSII<<ё  j3j3A4A4::٬ʬSS77**--ggOOccޞϞעz(z(%-%-IIؔ2 2 ((BBVV**##AANN>>CCXXYYaa44tt~~,,00VV\ \ \\++  qqzzXX ? ? 00(((( N N C C ppffaaLLLLmmHHDDgg!!##KK&&  VVttDDnn^^ww>>  gg\\CCDD22$$SS44yyVVnnSS##66<<YYYYffJJKKbbOO\\zzUU  BBXXmm<<^^  AA[[^^``{{WW44HHxx//**))ii``SS++ttOOKKBB%%^^UU  __WWCC>6>6j9j9oo44@@BB))SSKKN%N%aaϺϺͱD#D#<>33$$xx EEll44 \\::))BB99ǰǰAA77<<33h+h+NNPP)) ƴƴww>>++>>y;y;''LL..++F%F%LLQMQM..::))bzflag-2.4.2+ds1/data/missile.png000066400000000000000000001332071200563112200165310ustar00rootroot00000000000000PNG  IHDR\rfNIDATxwx\u>}Ι IDJHI.[,Kn%N${ܛɍ)Nq-[V%QR"%R,"H63gNof y QZ{Y{U!!]c~W>>ss P87%UATPf! 0dyyOf'Ax pL !@"!#>0s0N3f8)D@)Dէ O hUu.P1DU! A|/1x^/¹yyӑL!WEjF a< X@ 1xNg.yyәH$ I%ISB Xun׍ q#';p4?& xBV(B(F,x.n;P@(Ux7`GN )6"␪W OW#S D@T,~^-|#VcfSS'B5k6gt]EX1:;d"XO?wZa'{)~g؜'S)dz,B4c a::EX K/9{sL^P):$OF\4R Q@BK"HAUgn aU`F0g?/$t}_`AZ HCtJ$Z Z90?!wݼ̣\gW%~rA8hO"p .:K.`j;]AFao`hD"ț69p7Gj 2cC},(̷F),#(CE*{%+%?ssg͐M4Z L|W'(h`@շ@]P1BJ?z}/Z*;?#8Z8~{xa:ٻ{^DY.BA={8x$6".+C @xw^F/*nt3A2\{O(խJ[P!r1j0B/W}Um ]~/8vxHs77{ޅWzё>W߹'EYZ q*TǔB&uO\p9^zLI$|^N."GEX/ 69i-ux uQVJJUU XPn, ~<>y\|ܱ̽Y*gQkmkN(nh}]',!mR RG )xȲY!Dq !χxp.#AE|_vxsq"6'_u#*no{]/=]G_uן?!RY*|CF㠥yUZ/ !j ! ! D0/^b~T֚{_.6qBphRo>f<`]\. b~c!dfӌ`VXz[>=`F0kLL]p_!ꞗS ^R~~< r!XϹĥwQ>=GɏENɲTsΓ $ߔt-h!Ȅ I4*B1-´e >ne}/?:^8s]bŕ1pǓ8]s:m/;Nؽ=e:iSu}F\q *7mr5Q")MmJi5hפ!*  0·M?<;68> `uJc 0NUnLSB0_U|,$>7Ig(yoa._g~R{Eޮ(vE]PI-=WD^_{NG@LYVhH$(L5DiYU?Ӌ9~ด3Mݽ۶m+d3OM5qOS)^N@] 伃"AaA0\rkho~ɣq,H|S\;GO?*KAIeF~29B&FN@iΫ-q`Uk==qyޅ 8CG1o_װgrl`& G厒nAg=ɂ8q\Qv|c/ūn}>m l|}ncdT*!T+UL)v1"-v}:4*hD 'OppI`~EK<aύlǭrr9DZuDS,L%lEE~l|6$dY&0W<"ʐ4{yBĦ|~UYU|'_ОR9EJ<'˔ɍAl |y)wG.WG8ƫe l+&V1#JM\1=Pp_E~R{jdfHMK_ْ.u' f,l" OpG-S*+]EĮm}}&ck렏7Js*9k%DLBn )6 U;#obdq0lLN 2iUQ/ޤF_ReϞ&I"|LN?q\'O֕+Ko=l7Ꟙ^`sͷU=ƶ}?X4hJZ4L!"V)׻=稜TQ4h A 7`&%oHwS+*e%d\|S{uUJvlۖ^B›Cݦ2c4HTBT@h(d, r-y1~-&W5oiO 骛of}W/9~?@ܨSS ]MpWBQmoWfoI\c5/!t2fp$ōuIsڬݶ-f#?9ccf dz0f_$oʠ)ی1lz0Ҡ-Nxm]|Uˏ`V,, l CSϨvgo)H);1߀ ؉gim?z]MYqk 1XzOW_'UV߈ \Be YBh:X*2;&:KH<'P6Gk\˷̣^6RE/F FaLI+%o7z1?F@Đl{U]X?nDǺO,B%m |kb@1zAE - GL73-›eө8fVJ< =riOlh/Ȧ#iRӕ mn1*å .,ֲ]L;?v^yjl{%%?bJ5ۢbr.1]^2]NcX_KnG´zZuoWBM481bVxY,z NP.,69j4!G !ux.P^E-5h@zR#5!DC/(N4RWTO9@S'j=%E'/70E3V(eORlyq-)TϞĴ4 o؊fK37\zwW43+ѷ{_yO)eJm/jjB٘O)\Aru_Yg6/WlE+w\zÏ-Q"aIZ[K^"58o6 CRB9Ot{+LzO{%zGC[SK~JKɁ+𺿂CPJ<ДޓAj# T;Sͷ* CBH$8Zs&h7^E! 4 gz/)E ',tNiY+m[Hs-jG>D1=X|\,+V(`Iwf-ȳ zVЎ߱ˇJfFҀ[ҮB֚kK6*"<[~#0mc7NJ'Oe-f"//*Ih_)BUHhB"`y,_A.|"NzhY(UniqHS"rjs[iё&6`3OTu ʛR9kɷnVE޿K# G a34Y~;@,~k.(XIDIE9}EꞳh]\4h8F EYءȪ&!!pd\AW(A9gGK'i6܍20$\}.Ȣ"?u'a69OXTOR+?Dޯ(o=Ȟ#KZ!7LzU{UwQ-Bz"QON޼ @GSh:zY6RȰH0i0[NI)D pUK_ 2 BRjPxUTەKaxIVmU$fV/xMp^Iuvӫר-W\t3=CE*'xgf/靯z>c3?@>%VZWݒη/"ki6:ۄ+sorgf "/],k.iJ+;$fŶ; ϯI;祬//+r$fff0w)޹\uER w*sm-jmWi)hHdo|{{mG^(DDU3-OGf)) V;dd 7`ͿnP3?!Oq;((+Sݒ29KL6#A`;JNq;4:ج!uGS3) e;ƻKe/92ΫWk׫3};N ~"9n?AhB2_ 2O>?QUaoL;l2]}np8|œzjxdWTax]Jc ,C@ lR~7$=7u{:'?CA3qxÿ~-_#OS@`f 'e򀃶UzP~Ә\D{u<>ȥ!Baϫ1C1-FsuWx⇾W.D~x~OWjg)ʎ?ZZ6UY2{HLy|-\GYF|x8sBp2Vފw=:0I >ձ刄^hBN{7N;PoU(!Z (zx!@7_ 㥀l9i./ۜwy P-DY lXe !d-mpKWp=ƟWyzz?N%9(V㣥(_.Y.bf%\Gro 0$!|pvxч5:;!x#K+vxiXp>p71P>"I=QmsVt@h9:@pm+F0#t!T `+U<ܚ4l/=uz'>u?r|J،PWI<ҁs"tD:?e@ ^S|pn(n{:'?WѪ x ^oBx؁]L E ?=_g?! g5 M<# |56^ywxty4g.M줝$- # 7g \?ĥCN4XJ Wpr'Aб"ol=|yIY;<{=R9IK-\yy };V ϯo78pv,Gl6{O>;ui3u[?[|yǎq Sȓ 6 :R y WO1UxQ3Rȑ($V~3I_t~ ?{wY_l篿˃|ϭvj-\zuJwn7D堎Hj(@ bl?T.dsKWW{=ɇ<7 px ^>?̓gttwk:n~2xV?6B6 `<hxBɚ!0gNsB]^qγNē/or=|,?X.w޲r3f=dB -#B .P $:(ّ^[W4D6}L3wp-YvK[?=_Z~Βow^/{TCiI .Љ@ck S>A*f/=u[+gS.9V?}H' 4AJ!' L9V:6 6QȉL7:zy?&m" a6] ?_b&??A%;mG)p]4Knw??& B$%񺡪UPSbZ 8R073?6OWS UBU]1id0bAk+(nI)D] !xV'R3\x@ DH!r]t wF 8;P^Xݳ?L dB dAZuf: 0\gt'-*j dQJ*yyӕLB<<\''_#6>#<<\m@Hd43 bqNSi~2K<'B @7ON3i8K@#A9j am 8YWsL?ApH톪AT["9P:AFB T1/3G,#jyy''J X?g2{Gxx!c.N}G'?y|ԋ1<< pd1ĩCrtB(BX[ It[Tׇ#}^Ϟ=#}nȘxܑNח/r[E cu'<@""NC!f"Jb𔎎C z0dvHUHi+B/pzvs܈9lt7?#P ͻC}G݊8E8ka(,[axK~<_k(3<2Ktf ;Ҟ>wP^آ} R euGc7A8J &QxB@cʫZնC ΅Fb+AbCz=BUFϿdc惿#^O>qWJ*RK3?.p*0Qf8d2<,ZґnjZE!۷G~E<'Ev+^J)6CԔB9@2E2:* BQ<1QКRf1QL+X8 ҂U&מU*TcJrnk200@h!4p LgWGF抃;icj?~ DD9LJ4 g'' 53?db뗉@-Wڛܹ]oU]Lٸ5QP'P)!)` Q@KEg|A 3Pc̝$ $.5‘Hh,+!QDk[Ԟn]Z75"B5ޓ])9 c򇄨QkGHWZD/ %`x( yϢ{Il'2O3_ׂa^UxQ)*G4ey դXy3ꎄC+d NcrPQj @^(d0B+`u"A&ÏX@-*M刚k+SkP)d2IJvՕBRȔ-zĚ\q;r H ȵVD+^h_GKܓr|c@;P9nn?u~jVJe,Pw^QdXww\c)d_G!e PH%4)̊ގM8ھX{WvpD~.4MWh׬=7Tٳ.x*AH) X"׾ .pB=Ӆ@jÑ8/s8n~_-y5v\9S*qq~?rG630!nuW޺ HHH6Zg/ 6ag|p+ADGn@yjMЧtO\♇%?| ^lvƦkLxzR Zف ف^gߘӮAʨlEI~BUE43fׇA9mm2:$V]f'̷Qsۏ 8{ѷgȚqxު :C65Whopzףqt7_}϶KGzm4t$(;0ڮIϭ\ 7?oʜ]R|ym]&n˃Rp=q]qٖ^ \/0-›n*g 3E3<^ևMGCv倕:!MֿI)d %.uXEeai- !ɄZ8Ib@ 0;*Gcpnm4;]m>mVLg XF 3/Qh9 --y(4p@v"fD s^m;v*gۖaYwvFA PE9nztg6-XŠԴ+}`{zKh;^=S+JN;#bm].: 9~ r\ L9S*$[0T\чǿ˕eB.#G !2eA *$Q$٦BKꏿF7VvK10wyCy~ڪuw #פArWEd2h6Caq~+"hkwl˰m?Tβ$ %mR:g T=3Kıt6/۶XX{N*gf\)&rz,\6B&B:7@5AqBQoɣU) @k"+X@~@ " Ewt4c5id*J5R-(c7\Pyyp |LL M (hK[ ?Op '([&zĖyyp;Pbr&WmmF m = T !  \PI\J]R @NR!(3,; 8zj<%P݃XR+K *\q-݇N[&" ^x+8m=UxqBLN&@{?bN+~\6_c~zat c/m|oXN<'I)0h~qJ!$*Bg gA9! -E_ASh}&A`{|J0F".P<}vIRXdw-žu! M1APnp&DR'_*_=EO2?Lb,qJ-ˣ$&P!IpA G@}T~ B F@Vp$ZM~R*j1B0oʟ=~p'$#J4X<TCRȩ7 54Ḷv.Zt?!"Ic(L,8iϋ\wfL M78@h[_L>$S@ 5AF, 06 Jxem;AצAݏ>qOC5xvb! Ps)ݴt﷈hY_ %oySO)(Ě;P $HBq/ |ҫb6-?q? X.pbzG" zf̄g<8B[~n2tH08pO? d:B(@_3mD#?|.^ƧZZ9!R9_l#H TJ!"ZvC9Vwbf_6]N>t/z"~ i2(a.=3O+)P(E#"|va5HG!J8BWsh- ʯB'kG`Vx3_{(vuWBަW/2J| 08x%R( SpBŪLMWTE|nnx۫ep{Wc Ь  q.O0ʟ@p6_Gty1 w:c--қo).%\8D]"DBYQ > \8&Ms 4Uh!^Aq^ O4jj."tY >.߉5A c&n 7==@ <1F*!l~j>ϭg|z"% pgA)aU/`N@L!@"肵µ%͟?  Qڴ!~I}{c`;P@G+;PE܋qj30RB%_Eau?(]|DRD[͟i)p]/~N{C~1o3¢ rQt '3-Dkh;8J(B[Oν齬;Q%T0D>=67l~'Kr\anϖ'9p Ҳr'>CrxK_dʢQnZtqrh/{hxA<È+a'.=m4]Znsp/~kqtKg̴ hrG oG$ $(ŇQBC #gg,?.XCLPUвt9 aT(@`#\~iZ,ݻ 6* ONk @tFO:?ma$? 3wE,n[ Yu??` ` 'DVd4OD~i'yKr4 ;Q48,&2 r' cgٮ9?C$~ 0@ږ/%C==0 ˴"KDG05T ajgu9jCL2` @(O曄s֯Lx(i빫i@݊I%_@wY:ĔU##X.C/俷kgqf ~Ag'ჷGyuh8DJ< xIG%ˢŝaDww{bnv5U5uժ]QXXS  ~@ t R.qxƍm o>#"ǡMȹd-RH99E !j8>XRRm^a7dESIOI-xI9(_̓7wv J&)!JrH$9H/ E z^0f> k*yx4Zm?zDZE8#5Aϗ wvyc3OŸ&ZG!d8{CwtxOêUch6?Hi^,ynڙpg?B!lO|&x;KG#}>kOž> ?wݒn.c'OI)q"JTi4CA A<4OZ޹u#62ʼn` V"p g,L C=O<أ<rq5XhR+{`6gp4eH",Ek"K<!DH!"x%љ'\s!$hk.W}._L+Gr݈e'~񞼰_fwu7wpv;;]?u?qyn]}mf'zȲB6mwl x10cg'>Yᩫ{ns#|jOܶwW!$o~Ki |jqW" C맢VAFf a*jPDa(02CN#N ?0wׯ-~?Vߩ32{T~Kpwc=L#աtd;jjJb{PTmGv1Bu8c-#D0 a)SO"&! F^֧|6 pOEMw~U,sn^~~?*3ӿ\ؠzO&1 H#&X(EAP 5& DMQKaVW U9x5PI#uj+H@n R^}sl,OY./ҕm_޽ Y_{~O~޷Ik_2<Y4&cx9±V#ѺJx&:\e?[Go{Pj$1d0kV#F#0`OK:4jKʱw5=7 7˭^onSWc蟸nu}7:͟Y{"XE8p,/}p. ٔ3*t#Z[[A\\#!yoxsODR [ ,G Qa@e #]K:+ ?J:ry uQ`5sOu,}+.לe{`3Οߎ[77\~}amFw#v3洽N{aw?`2X@ّiiΥ -/ӖlTzշK)UPAB##ԦA H27 ^߳q?z5>Rb#`~?:1Ėʁ}'bzR69G)2ii#K:464RRUR)'; i.O.=]r_d3~a.p|jkO<[>yN}V"L4tf'o4\{gg惟\WO=9Ң{oo*JhDAy2[LGzpRǍ[~׼/>f:W8;o8[-?6rgW%|wVBNc~x^D$?~XfH #WvvXDlè0Ĕ`т+7k~q@U;oJq})SğIk Pd32AAMqcc#'DAy)LoJهApv,Q=(3?C$sd!Z%c5i2C|B`t;_[D< 䀃}_աJYAfL*JhFĀ99.;C*=D;R(KzCphoF'}t*Gu5Bn4gfzD0*A,T@!3B2U }12<%!Z}H(XX6`%AD ۻ<鎳 ' 뚣kW*ۓJq 9ykBf`'r|rJs Q^>O}$2'F`蟤RK􆫕ѳdڽW,y(O;W@rr La|/pI1K$͌@bFrMP":oʆܖϼB膬0@If<=Zx3AYg(Awfl e=@9J*f_]B%1Ţ]#4T1ل5*6\)'鵿[ON޷ҶgSғ(P)+oܛOH ۂf=Gx<,CMkѻ^O[C')%%+JKZ+坯IH)DOVbeIKw܇L``-8Z,x"e)b3O@ P<.l+dii0XU#AI~TF!QBĠs]zc^SHf+E-'U#Z$Ei q׋݂(z5L J%H 5((,i?- tc+ Yc䇕n N1?I/}߭djnMjSO=2eco\?WY򷐗)_ h=|Ew1Od9%+?#W"_m[ET\vS>C>æo}]7U8QXĞLv{ \w4vB)ҋZ_w]Of@ 'r,8-{gAhTAP2P,#*["F)@YrDLr.``Wҵ:[  F!diOvUé/Q#VE~YIimnY7B8W|s[ZlȲKte2*b* wJN:f7OοU&ϮAOEQ^ =hY8PqVOP̢B.U2Τ9d4xAZ(5i ^A%7մ{/A2 bJI%FEw͇2b}((fmĞAʨlEP)2Y>9AqZܕJv+ ec%QV6^Ŀ[:=gȧRT27+seٷᚦo,yg'?LDT羑]b슍 2A_Ǒ􊲑m2hrnű~϶ݽ hd[AQj%ب AJ& gRp孚J}(4#%BP kp2aCwTKƈ (lpF!j c\J2c_ǿdw)(.0uNo4൯Y8siPP W)JzU]M{ޖU=yvfjr;nYyy%5}(vPs. {|q0Y5 Z/jl픸;?m-]^6ָAk_ѿCu Uk0BzMDP.'fc˯*jS*xG*zqExYE?,Ӄ4eH U̲_E/|MX9E2ݴY% ISE] g0|7ʂͶ=k9Z p 9۽呌hB:&5.7ZR),Ż>_k @k"+X@~@ " Ewt4c5.`2sF ! * #A&95ʩԵTW*+4$ebeIW^?0FEd|2V'a(ۑ_筅}w/A~#պsZsܦ6g{*#ەl&vށh:E񣿖|[Cm |kb@1zDe+P#.8wJb?~(^H뮔q:$ؚa‡vPQKXBƇ>+Am?]R.g|c?- p|vf{ے*LX.#K%c]WZڃZjV#.PFGk0DC0P4'pC1'tHŕ5}lzRO)q݇%\{}oIر%+c-O?QX)\w|NJ/=-sL_=%%gO[V:;O ~USk.Z--t 'Z]:^FK?̰DF<1(ʂ?ꃥLYP%n[•7K- Ԗe; ,FowC~E)6D!.Z¯r3?ڢ)5]-F&AU:E#v>M ١ @"qˮ7o<^=q'D /Iĥ7X]v@3@LzkOPlKRk(P<Ŧ%ӂP,*ӗ\9S(A!&H/\*㩿- t ="J;Z2S T*/?xą Y qQt_\롿hYC5 Aw?t'0?R"j+WI-]o4xm6' ЖKW-fe24崦Д&!ZN>[bф A:L3|iڱT/Uyۻz$ g $sJ1Q[w8DF4os=3X+3]S+ߧ.lfsNf\)5ی1G\B{Ц1' dny,o$,_xw$$\r}]Y!htnTDqrٌR-뇞bd$t~o7}ϕ=!vByBk᫅@;9e?|3zHtk~ͷ10_|gssL̸% 1Al#K/`OO乁9ORH"tugLc-$dq* ~PD{M\ʋJY䐇p>(Ћ:Y@^V*!*AE__בۿw'8w)J=P(K39o޼2=\|`9J`f_##ysJθE Q!33M~A 9Of咁 C$!#_q "ږW}TeYYd4^3DnjmP=\E[FXSFg3\A{u'b!B*/z5gل48KIS"[Dl,;\8O&C3Db6!,e1P3#b7h*#)DD˄/ <*e3L4hH `(u@md0`:RnwёH쇮C5r9'flu U vеux*kl\qA# R9YA6!pW",? HBd,CȤ ҘՁ =f(d"Q$Ao E=g4&CA!>k/Y`n n&Ee7DA'x<g΅W 솏 3$_AOsD9Zo]?-w @ \/(*,TK#6ؘL@YV0G4ˏEn'ޏX@hmom _R1>p=V>ph͈(ρTk-8x'YZωu޷sd1B|w5Ck $Acc$@ x\>G ߧ?]CL~#*<+U"i_ݎN@ec e9.OXp9pd_9=S4VM BHX"+xx'8jQN:D+s30W+0p`W(16R-0x7i݌R 1?2z$ t< 8\ui#Y3k{n8(ρx Qrd,Y_,pV)k!<tQ<S4)`jˏ3GȍvEp~KE+ŒmG*cY!AiZ!nA\UIhFPZ rRReˑzd4'\ uZ,>?מ^&[ig ēd [vǬ?w~W_K1n?ZjJ!.GQ+ @\B(t/=,Y8 TkYnԱ,Ŋiin?z9Yu@ߨa~s[;b|qS) G5!OrHYl也EkOK5P:`߆tдLQ񏒮+ԗtphzT:qVpzdJG`;qd=rLMQk>iւeg!]lV9K:'OcwV/7mYQT}?-Xpi$o= %nX{8"ߟGJa[=7O=c AggV~?Xq`d=tm-td.~DQdGz6J#'qz@H-YaK}*9l}~OU#P 8ǰOײxg~Q8;+;?R?+vZ ݻ %*֖ #d)koWӔ+7u2;Nt*q- =o!8'' DAN5,VB! A8R%v+Jk+>hF%d{ا!`.g?wխ, oz_M+t9?}'Lib <ҋ"">B ?xb.dz5clL_Ϳr^~}(2،[ @%Ąd"!8@ ka=xQIS1N3eEtXin5~svT 1V.(΄0j2KaSÿ*w"t["n}12C%t.~+=bs_Q(uD8~Cfl!#Ąd2!AVC+IO,CV D@$a4JJ4=810Bnd?zUNm)d ]$3vgۻǦӞ$!w|O8zTm_L%sOxgQ} Έ.ЁsK gٵL>q *q!j,PsMp\h'n0KX0AER =܋/1vJɉD2$H |Md$e{`])prF`X_ͅB.g=~B !||SONT1Hh!D| a X4z9Jx"/xک?!m! ]w3N ?iA$B@ CcsC'OHP58i)MH-,d1d?|anO'~2HB 7w,n[ YuduF4%Qbj U~2K%J8?:ϤZh:RV_ ?BDcqϜ.d9@"/]Kd~[{ aheEp̂vNLM()x:3P~(! @}$K7o{t{QrvHZP.yޗ m/i;'9{a[!;C(xf<<#Cv*s=M(σG9  A@KA d \.}><ܳٶ⟪ ˣ6 EOBM?.[fycOV yc DfL|n//J~/%7''Lhog0jQ5a$pڵ*~h.;{kXDp8vN)'-Y&]'z_yV$#1 ^Jk å:h i$2-UJ˄Ɯ&45G~G/?z ~gEʻ.v,uBӵ2{d?'nnzgMpWwʴO /W'8q"rw漃Oh(8JvYfәCpLEW]}B`((!E],sf`,á } #QzDzBvǞ4)7 4cQuS SQuyЪ|Ko̙9k%`L%,-)-\"?w߼賏y{e niǰǎmG=AmcVѲM#D0N 04E~"+)Y-[!NL-Y,[Q8OÀ#ϑ.r $8CR?뀉2c( FVB /_y=^V^Bx'q0&6]ioBA޽3p]Ǔλ7ԹkU7G^z}_ v oZuY1Ǒ"9~"eĖf"(x>DQORrx/%CH ?J0=#0v W]olu mVu-@3S 7!2v3Njy'2's3 _r*-9ʨS=(A0Ec\ .̷߈=oA>#/nKgv~Y^Z%R1`0q<~"-dyw x2G{LxQ'|3 v[j +7NxnF'݌3? ?ޣr둉Zh-(RխGFxE|yqB#Zrm-BD`;DQb{hw1pUla=Q Qq"TP;=.K5)|NV+Q򊃒hY^Am܎<7v`5]>kי[̃9~\ҡ=ƱBJN`MKQϻ@6~PB'~;.1nt^qk?U~ih朶x -hOm9‹.NQSM'| 3b㙭Ꟍ٠yd@h?MjUm'L|PAqHkȂmHR&', ( OxA;7ޏCip̹؏V?F{C{f k؏^C>FgIfQ[!j*kΞ]1U$[Ԯʞ9iF%`ʖ.IDEa/.? W^o/6sX{~ʬϏ̒%>t/j4nmO-^Ȳˢhi| 9,&U⎷ga'o@ӌ%tvs/0A0z{+om66oӴoU$Bd^ 2GzRغQ;ܲWUE'MU֔:Iϯ{Q_h vgm!3f}+_2CH,Q I$HA $< 0h`+J"2@"$% `((;iڀ=dy-;,s醻S]aT6`_~.ʂN!_A%Y2n∓2=dYrewVFACkڈ5]zw'{Қ]Qo\nۃ=%5sD7 ( n a<1b}8>nֳc~hz-};:^0-w-wfauuYNzWp{ F˗(nU,!@d\zizh=9t AȁE$A  둃BH8 [giX@m&[aT>fأ-3ζ̕0UơnO_o w>sXn埬 *J ӿ g{`X.X-gU2|QiMcRhfBkr-=ڊ\ȏ*NtK}Z{%{qK^?|0 s>;VsH[W|bTYVw!WG,|3 ΪҔA?,~A*3ajm{ӀG,L,S Wť(Ymbf[B<| D(4CJ!y9 RDbTP'`dRP2LrRȠTDZ2]\}w@6kPd`׏XN&_ˆrXPK +6oe3ؤț< ?}]@rK͒Amݰ!{F%m%c{e3Y(ϹBiףHNG&@aoݭH' 1/zeUj|lu[JRWɢ UݟL`ruH \!mnjmc@Vα?zc0e}xC$tYxz6~ʆ^RR1 ҅_wHNG"hAr ok;F~􏲑I3=ۛ]nP2W__S-{mROHv ?"P$=pgyի &_5(B8LV@ڿƠƉjeZnx `#@$Hr(0~i5J{@oޏTܼ DcA&P@<l0=pz@" =  UBi4쥹_%LFU~126d(yKi)Ym-8x/ $WsՂQ&kAt"KMUzL^?1w}S=rZAP0~ {5k#E>GumZe 'Ϙ&_oߓn.q%2HbH=0:JuP,@[9DiպR,{HԬ(W8 $ dٿ+J .C7^. }AȢg@(\.ACnP .zsÁ$z@0=T54b99re݉lyz8f ņ @AߒKBqBßqއ;44=e]C_ UP1'f'vR;w/lz~ l?F(Ϙ't+-͟Ӡ.`T F Tw@V8e⥊89?f: N&_ȫwo [)3׼6 RoH@3I dwl?ʢ S)}5۲i_Sl# Y&AUS-ͽ3RKODG Iw D" ǡ+J"8!+xU/;!O!_zD p;\ 4AN9*=7efc;۲m@A$y1;&z$C,>`/"0I A D;$P=ᴙ7Wg27 y_Kj~įL=3BC7?"@$ ̈CVq=m23̎] =vJpx4B7ۇ*wL?h54nk"#7|`j_kDOHBB<tP|E`G@*z$7C RG+bLu0n޶-}6eV45g2@,o;wt A>$36JqEcg0pwWLh_NeIȏ2l~4c|(G2޽=\4,6SQdITK)]-<5O(Y^d,8R,S>y(q6ꍁz+b<+J(C/@eH. dC8@= p(g*p^y+rTA!K)ߚͩj&s=dv4JsnM>kbURp!%kC6p t`KKr<q/\X1~oRC?q4߭Õ_(QtDH4NN榌 _&;Q0r`dDRK_{QvlW qb~RRݑT\Q D)#XC"L(,#Ā([2ҝH*agZ3i GE\&5?rH p8t\4Hs P_UU.ug<*Q1pLn8 :UZyE&Z>45_+dבs3"ve\\ySyl2BHdH}ʬܔٸfmD!xR1^Z.(+T/vP62y66#GʬPr tI'"̾6Zo(b BcO,J;U\ N%Q4:&ʕUq\$6*LpB$$20#_YϸJ륧%:*I%1>MGW43<G gU^/#PZ;.{/}Cp Z?i7}_pޮ_ERy̆^`+HAPZiO מT"T Q50o GKQ 8 +ښxP•<$Б _1׬Wop$' 3@ @~x;Ujk %Y[1QkWrܞ lyn0!'_OB&Հ\l$G\|ʳJv10Db4e:k^F' Vkjy/T{\Et|h'͘&_KJiC _ 8 zdwKF3u#EE҃LD QBJH([ ڭ;ӏ"<#*YEksde5KX8IuH1ʡ\>B n;>C<& W\ e 8 AUnڞ|D{`'YW͚q9P'^AD)S19fo3!ѣ@:gĀ?n~$]%nI"=Q + Z(LSmj2:]rms}yYz ?v\uJ{{P"]}F]ʟk7[lkQ^붞G/ȷBbդBŘZ޽gG/+]%҉(n]òj /' rVHiOKMiavT>C!{cZ㗂GTKg|D2Ā/?c_2mo嶮"mfYxHJT7$~#0*`~Ҫo SaG?/аt(VM<&聶(GxDX?~i={ }x[J^ˈD󏩩Ͼz{뒶c$-9O/ZxƹK|MӳCGA)$cDYĚi3|X>>o>OYn/_嶿ñr(<L\Y*8j)h 2.6H$MdW}̈́h+ `=ŃB1@ Ϳ&oDUI$4|2>8kVFU›aDɌy wkԐ^5(eׁ(Kt ȟ3Mɯ1'4/Bȭ~wwnyW ߗ&c442ΥʕWEV k, ThT'ɣkdŸP+w8g,d9 ͏NLjof  A)$J<+*>qϗht#A&XirqGc3ed 4`M廦[݈ӿ70@AT7^r:Dqŗ ^'$W-睗YG7h?^y/Jʟ"؛b2_?~XbECzI!J?C :sKL$m{2&Cנ: @CEK %G/H1Vx6GW*kيOIu-1ǂ UڀU?Lȡ?lb1vJzGW qt`ǻ D`F9.2a&~4]_YY.N1n@kxr?F#X5Z\$6/=/ݭ6s.kuwt/ `ՀH53o]!=LtQ$h;VF[sSd\7[Xnc99ަ4d%yG?2H% %!~$<\O]"B{?7XϽ1TWҽԿ!ٸbl4w+qWx((!Sc&g'"x("Qb);XkdUw3#I@?qM l p;:؎ڻCQhx~zW#cs> Y+ ݗZq 7+_ Hj<}t\T]oE i4A ʪRDY Y9G嵦rڳ: цi-IkVկb~-0Ihe)3(0:xkdi;@cv\ʱI1J`#䯁L/λ®&m-둋ZB%(o .}1"MF\(x iGυ/F0\0jFa* oɏE _ .]⎇~-w=(s(2] i3Dg4!ҫ fFo z#_&pHӧ-Y&B0X) D5}\Y:ED1#Ө7L@32Rk_zsӈml.PX]C3HX,OD݄hF1h9( h3G,8^\ M൵} kbB@aH8m C¤YG6m\>'x`b4Ճ:2=`C6mXVO4]4<04J1n,h.X R˷`1€zX;^ ??$@Ko.?eV֐p͝$4L"asl[]EreXxd61oG4L6[;䃺dG~tt>/{i۱%?)B+jHkBZ EzotCAGQQc_KЕCr4P\qDy{z?/pƹ$LA'y="woD(Dۣ:-^| 6,@˯|JB'-tCٍw5 0e$ h %˯aƌu@I`<`4g[lKY7Ls_o*k o?59rbAVc!A+9iKҪ*g"(>V~! e$^L$x F@ER<ۃ$:hkqp`mmy^n8pWRO<"3]oJ+sݶh*CK< #9V"bQ7K қ~n5"]K/bf'l"*ƞ`T -"VfpfW5+z]}*m^'/hhXųnY8LaG>P F"")']u΅L뒔m mۖ;yeskl #F钋qc詶V]ϯp$Ta9CsċOʶ "&½gX̃i\(rn6iQѱ-'MӴ nQqp۽?{k!~DN;G^~Ne1Sf+Xj &}Ͷ ʱٶe[ݍan0ʮ'Vk8.Z;"ར1!Db\P= pA][Vn۱R~g~ >ii}Cݍ9 փH0Aĵ mV뱋"Dl?z$w-Rݰ #ˊY1jl3Z kH\?[|xwɠ~3Bq>rx8m4~]\um~3N ?rX璔ҬckNpl(l夓sa@{njmմAf _ o>XB ]p9ȶ+kllKW-fmnmÀwG~k ׂ'? ߇'yN0?rxոvQ65cێ-.zw?1͕/vX3[R!?Bpd};wjLh4x>SQʂ!˂#歟/>zy! 6 pK m⽯CiԴ^H @9!iG\dR=bd݆f]sBl{tm'mkb\ez^Qܖz}o ,.XbmKi^~1s!@!% Yp3W ڍ1I+ !V~&uςB ،86wѩhޥUCOz~dc'=͆IP:c'蝻v4ki9GX/=[Vuw~{7\{&k~[sOːёB`CIh( !^!䷣P{@ ? @y+?*(W05FϘz5pcs#$(NW]'͛={\럝8U]z:52o>&`HNM:UWT;*?J<$ Rp-@II0wVi,lhoܡLj/6iNpZs+y${ǮC,Qa J o" ܠ^ GA)e X0;ݯؕcw\c ]6C~eګ\^ǎE .^zܞ|A]4Es{v4czGGBd刽"t D.Pq B(΂BZx0@^ OhւH(ß4^^1&i{v4L C>h8BQ# ]Ȃ=h$Hq)ʂZX`.H))2? % E+$AX@ʯ[@(I 2uC@x" ͑)Sa~t,Bq$ DY@ 9]h{P6(]S?jx]"2; UB:B!{Z4.8';W$0 A0;P / A,`>RT ݃t?aG#-@ U\ 5*MܓAOH b$TPqPkywha(x Lx9xs+)+O74IIENDB`bzflag-2.4.2+ds1/data/missile.wav000066400000000000000000001450541200563112200165450ustar00rootroot00000000000000RIFF$WAVEfmt "VDdata 9p )'X+s;!4 SZO |duEha:Rt\o!,gA"\[Hu*k .f}S97eubq_WBjqd@bLd>?Y[n0wmhn4rA-9zwLsPw-Bn<BH . O}&/,y 3  @#B`5tz#zZm\257~a -[F2nsfeHyFbWx`zyn) >_twDurQA7e~3foy})&{MsN J JLIFp=ld+Ak/*|xp(b2@]^i\o0aI@4A=5&jicfsds4L2meXG~==<v*oQ S 8:/  6j|0Wp@<q]Rd-` rC=  EMR  3 Qdo l$ eFd Hj'y ( "Bv7 @< [,P:aKcxmj  9TE~jZ?[/R-)vzTrK=C2H( `uylMZ~L12:RB9  "gQAh4RadRH ` -_"" Z K!e`uzSsAP{Q bUz / "R4=CE5% H2#G s/M$;;Xs|/df\,w2 { 9 B/ #  Dppa -8-27waA s c]h chDBnVRk"ml<pCbWV* N&NVi8w J }}58F k, ^|@s33W YB.fF=_!{ X>  URv) U8Q,\PS6pJ.U@ !4zR `D)21|JxgI( %6!x*`Q'b>k [ 3AFw]S 1N33FjIo @^V<8f?5Ahp ' &#r8axeExd\G[N=oDGT;| o  C")%Ug;% v[x}Ec2-%Q00 W_u[|J]YD , F-x'Bd%eS:l+68mx9m  . 'o6H , ] v @&mxFW I cYclV-.6s ?gJJD4-X g ' Pmr aSM0~2-4$O+m ,b[&  wU}M Y7k A S OQ CzW{|jm_RV?$*0vc9{N}Dpo~gCww (If%_+g>yNpN6$ @<]wO.)0@ VyHx MY0FMeArb)$j Rwt[I  ? 9n)7 p ` [o f r~k2Tvc 0 YmMN9dYz ^ kK6  Ik1!Psh]\ l  V#<"oGRb]5] %M:j USt4SF/J\)Ab'" V  x&8 $ R3& } ii6f$Z@S  %Z8Z ~ //O  ~7FU# .: ~7ELP  aV " sM_K C/ iOVI+o_],fdoLv, -  s I /3NN h` o7' F[Uu5 4l P/:)Lr[n\~Daj3@C 05Twx,x{W2b $mpD_$ 5#dtZpL0*`$ % . 7 sTq:  DmcCNG>3'+=  ) 1   l[JQ s  i -f$(O jn [ E*&XETv";.d K/ B " p[JC5U;;dm6<;{O0 2L~B8:M t\ z zX6 Qp$ l ?Kg g [ J"@HPk t1 z!t I=" + ! { L3fsjo=}{VGZWDe'H3.]D /  ]p4uE.8%9h gSqo,{= 1btW  r IFjC{!Y OXVG;/lZy\H`vG !P4  vD%d\ {4]@ '=h }gB Pn EIL])A=.2Ed d j k::\@\P 0 eXmr7 d z {[F+ 9 ? X W} g 7~! 5 5# Z 5 O ( 4 +yW4`w=/WY A " \ AG b! !   7`M [  0QL2!]@ ML:$8;4`0~QACBt8IR b>0: Gb0)l%q |?) +$G?&&"+^9<]s$m"`~ rl&fTWtO nv^/y mp+y u 1hr X UM8c/i\:i"$$G U$ h  } wQC 5 %~;i / ^>1-n#2'BwcK D R<- cU% b S~g.tL[  ->^!6NA*a ~b @| lHj > ^k @uY S"Ξ9H    D@- ;L k $X ]҆ׯG;T pjjvzp|Xk L/dWwE}n ,B b 28=~k `&&U z*>&/ %@&7 W [b4- .. >==1p| n M*]Xo t.$\9q=Vhn99/{~kO1~QMfs|bOI60C6!%vZ 3NOw r*  ! E8 X.I 1 r 5/?;  TY >BB>&KyFy5 ? v%Q9md[ \4"+@*ODH [dKpK{I (U 2YXK4i hH  }j8n %Hts;VsV0)0< B9/~ ~Au"m. -n0' frJ2- \!#nr *R5P,Gt:.+׹kwo $&F2V73'Ir$lҩA" #]% !\2 :rHs\ q`d amO[=~I P\e= #8 "WkrJ 5T+!"Lҹ\m+ jB4 @anQ;ob 2z5? J! = F\Nz9,)) VJc3 c]  9'!+ ?C mQ $ I' r! *&h-Avo2̷R \4EK+B_* B|8tn$12>KHDMKB0 VHΐj+.iEX>dbR75i-Ǐ!ϵ҃~p)vˌu=.l,Im hk-׻d& n >P68iG $02d*w\7M@qy >w!7-x !/S;BA8'߃ : !19s80% 0_h"K I 08:4 %[~o%l!$# eZAG P7zsJ+.}Af*Fe^޳k$&B"*o M"R۷7܈9 fl7sDK8 Z q.h 7-8:3o(\q|ߏ/TWOD z DY*qw!y Dj3Xn J 5;}2|!n))>%^$Xr> XFi z Q N f}(Coo6 2 -FqQ$U@c O w9*R? #& k< H- lr!tvX +a8ZQ1ݥLBV!#Z 5<`B~rj'zqvb':bw?N6zuny3%++#(Z;tod5!G",'"Z GtPpݔA\vXc k*rb<HIQ< ln1S6 R [qU)acF.o$ 0;LT.r/M@u O=(K  k,TeU aRhjxn x ++ FCSQ<$exJ o ;  tJ |3)fn~RFLx\S4 ?:@w9gfe/w   lG&޲T՜آNx<Kk 1v9HfJ.|iL(_ ;:$% #M MDwpHhh j!r'9?H|D mx L $w*O+#e &21F=j J+0l464%-? @i`%Dg j@pv     (USdX( -,F) #y\,DǕ[_ W!1/=oC7Dk>r1W'\ ÜȗҚh@ 52/`+ V_Q^hy4eh:Td\IFtf 0a8y1ɾb[^v٦ 5WC@u 8N jzxw(~5? p +  P9 TL ST> 4g7z3p 1Fy6 H6M<%10663-$@ 0'4&V`a e BN(7\ z 5(j} J 5 wGrtGu~!0.550'~QkjN9! o = =FIEvW [j߅ؠ֠ۛY""%(%Y\B3:vFF1.y|PA Ss15\c_B|` %3r;:2%JF GɌȍ:σ׏zS%XK g%F6H/=Zw oV!-67-icȩơܔB fF/<jQ! M9p\ܤZO _4 @1\/e: ,11S/+#<ikocJWDg h&'"L xg}U҈ц  AVz+ rcJ"|#ֱ@[D$P-.5* (/?4>9lo $u'}(&x #X r?t07(+$ L۾1 ڵ?$1:==5(\S}hne%--چ&5BGD 1&ZMG\xK؂׈ܷ a!C96'%4A[F?X. @Fm= ( f 2 O B51@إ+zk&Y$ m#+%,O#A 7 ֊Y<? k0Q@l̩ Ā1 ]$Y+04j1T"E֧Ήо]@hK } ^I2W nMk4  s n?$>ԻڿJ",.067;n8(]0l /< _}# Gj ^,zϽdΑ%#+%.';>Z34y;+\ R< Mj,qY (/O* e?P40lJ_9].85-%p# "Iʼ<~Oя+ m&,!0/)4:(N'kw(ESxi+;8*!go]L#:  sga8;# >w@ס %W %&(+X-h.,&) &3TW|ŗ_*C]=_1  G_j H = C8ߵ)SDKFU #S$?e.vvt- ]& kv lbZlRQ jbFMgL '%7O %34&7mۣX_V t#*{)">4 Wk*77>h>6( j~7@7cٶxS #Xw,%.?415q57:7y*A%F. aFR4?c l @&NY.Y3^*iwѹ%FlViڢ4 GK;C}3Z% c4&hEI[a& )e))<#T5  \vLqZ-0&׷iزBg+:30(&XMl7S ^T;m/tJ<41A< WA71$?8e )9`FK90dM0s Z2  kux~ #  ^|N}  { D uD& -d/a2 8Y<8)O(݂n,(+k  4 801%'p'@((&F .C1C3 4 ?j!x\&R\H~ wڵU2{̒п**z$V 8 >`kx ;45w Al!R !%/+34;hX3.ZFTUH&1*ޗRL | cZ Wmd2 *L#-D24|8<]=y5"mޏ݆, `N$/88*U_2 C"L/) +/& 1   |~Vxf;85KVRCk,~DC#8'143 1>+NY'=C &:(JOHK;~+X;1h-0~ gk)/.c,-_23*,S?̩ ~!..)&9 GY9Ʉ|N=ٲ:ob~sP5(wRǹ'z #u2_:?EBKKL|E 6ܷA78 (*""~uI 26_b '!۝+.1:GWPgM =p!6 -؎)~~ t !dX>  'n5Nֹ>8B"&. I 6& %#fn '閟_Fj{}n\F* e;h;b]0=@;31 D"(초*P4PL]X Ej,\PVj"@ʵK@@ 'Fx){2+kK#07 6@<+;;ո꼑G3/wB2OsTO:@W'[E,ڥa( h*S,J+{.5864m7@<9'J,ޜ;vcĿ5_6 )8' LD .NҘӶĻaz 2Hu]ikU`H!-}Tۊ?ʹ%$g.56:;41( I` !,8^6G8nCLD})B-˂‹u֧̔=(WI$]@xJiB0gq *=;5LN>"Ľ{ɤ wAZef]G<#Jj96E9ZosliTn:ڤ¾p<| = M V]:07C:R6W}K*/ `XաԤ)܌"9 n g¹X "=wQO7UpG?6/#_ 3uHֶ4&m"Q0Q 4ZM$RqG/T ܐe@ȩIԈ?,+Z?DR\V[Kmw~~p[UV1Q Sik >3RcLge9gjcIAe&лk2IO U2MHwNY[H& " rւ>ٲTt ;Bxb@p%BO_H5_"b ^{ BCYyf*k1fT]5һ1wFiq^=G=:,=DBG8m' F޶4}rIMk}xIvƑӞʲ#9CtLY`h`o^fEL{(\κ6>"G%*l+"1.,, 'Kyxղ DoqEP(FNΞD,*E6fPF$?8/=F7Q\dec\BڡJ&ŰlD6xxhj`\NB6"N pԆHĶioɣV~teLH%E1É ?LΌ8[p|mcJ81ľ2m" 32ETDcS(D[a=O˩jM1ItYH`[^cTB\) !P8n(B@a#BхQT;ڇcAt]se!W8\3НqߡޛўM<3`wzf)E5ӰMхR'*J+' ? k ;5077f*CH1<<(Y JQ#i  !,mG?,RiШKnT+o(b ࿺֯Z % s!} i9׋q w&HB^ lWa?hȼ_% "'9A3A_˜P cJdt ;ځ@81DI?|(Ud.C$3 3E! +.;#Ů9n=\R*`kqlqY !'.DRMU3ػcV#I`pnMw~z/`5i,MaXg^hEROz[ҋ),0[ C8l:g%USi ^E 6[42#8^.ޱ <8KuH68".:2{*l8~T  .,s\߳+!&KP4IiONR\b[Y;/ҏc 8ִзç꫁n/:\}$e>"#ߐӇ4kB;c+E  U%$/sڿ5&6/16SD XKe!`KHV+'(ܨ˨ՠ15IVXPZ@*vYQ|} ,+0BWgU$;ԯs %Ki *3(84&'a"FD/ևןLn!,2:|MuboiNW 9͛^ߜ:7CGG A1~ ڪyJv멎-ئO.NZuO82$sD8xFB/QwνʆP&E[\GO.?J0 Trn Iߤ5ǔٔ >e~y&TFϹ㠱دù/5=Tbgi$l/m`;fɵǘaa}n /D[ ovxlOg# u>UV#bW||"\, g]D*h&IncH7D e;ƠŗK5ޖ(4 I1PC#cFDؚLB |]#˥ꫳǍ&5AHL@f*1b  19T,X@MN=QT59s$z W"%2:I;4)d#_!E0@֑˦(%56Zpn{On;8ir4LS76Wau{{{~~]D`?9CMl\hmib-^YLn1 ݅Џˁiɬ81W-] l}< "ځۦj3;ܘ]Rؔ9o9d`G{{4o`eMh2_sZr'ˁ΍R&CbqsDlX7;-vȥǂ\֚7Q7QOV6RQW]T168ͯ[fG=+h }fDN$ 2!kEgM'I׫0,X3-. o#-&3{%*^"4z 9 S"v+.+$^ZʥӰ&Pų)4>*J+z  x b *2 FHk2a,iSK!}Irp TӐR %)+4@iLNX9eqxr1Yf*z$svg1{9>FOO!U"YZ]]O)gƛšv;!@c_sy\T\#cښ˶|9X-NF4 *dBRTcj`oDaVŰʗQL7ړ MtMtI([^gSe;: "pXY߉"H]k~bxc=grkr=2i}r2l;gU*`}H;pK~w-jCN~'1ܻݤ [Ŝļ͇ @23NK%5G11!N&̓(klkJm7JK@4/," ۚGt¢߫Iݱwc#+7H2WHV ?5ݙ  T@!$BF_4,&94B4u4 68Z+k!#Io{b./ ʼbY\y !-, 8xh\ߺ?ٓ'&''65^As  ᵺk'Ph`CAa|h_-f4DVq\QFm>2.įÔ i\NR $] "КGANIN6MݏzMO0O%"24-'y.:Y7]x[=eAq\7Ҹ|miR+˦ 82E?:-9+Ẵ}%+ZeK=mSywso^Y9,1{SE (ҩ 5s#*@[f[C*_ څ8ʾR!:<(s+!5 R U*{)b9 ܜɔاN<,7A C7$<"! J #'J=4ېL['&((Nii*N-#2=@)-ONGwϬĪ'qLUSW_YY7kh̶ɒL۶9 Ep#~nM+q !(BXG6!ͤ[++SE$Ѧ+‘t@8\f]ejng6 "0|NFߒm0P\7=b1+9/PKVY>֠̒YDͩ)0_, ~%)Ne[7Z Hlz+1oYb^]ZE!4O{%<20UM#V(ѻcX-%":IJ@,bX䝿<;T>];m>i3J-ԸݸQǞ.>-L *RHr|rY<;l)'B 4:!(I8`f[1ATEMeJ&e%4<}PAe;uvq\7̄߼uP"= '$k":%*$mJQuwʃ@g -7G5'] s 2G?5A.9*gCУC܈ 4.;(i7CV&'4)1kRKy_;1TQ΁Ϻ&PϠiv(OvlLvD*Y 5),:.=cwf60dNۙ,{?JIvMR[Viv{mI:ܗN *|x^1`EVbljm,iT.;8͒afɮ'/U roLMu71&XLkZa08w W#4/ RJ2o _gӽhѴ2 Ir}Ցي6DIb;Ys3> q`AA!"/< cZ(76+$(/)*)<=;S@*^;Ӿ);0I^-e`]O?$CЃB8{iKxmdZLF1L|pMγ %.upˆ&Կڱܴ,1WieqUTB,'N9>ס-,El~ukQi"nH˽Ea*Ty$kE+%d8 f&Jb`Krt[:r$PuL[Ͻt@s|(pURU@s)wQrWqnWH! Ц5ܼ|>n}owh~D "g^یPpnJky~n9]>ΞBHT$,GVQEP@Aj7kºW͒[7JSS.G4#%A;0|g=IZaVmC5S6~AE2 t"͘oΣY 39623r5@/g g4  E)VVP>/(Ƈb% },4JjLv&U+񥵉ܙkʐ8OV_\W RsI=,6 TƫoT(Do} rW^' qD-AȬσN 2A Zelx|rjZ&7[Dw`Kbۮ k>haseOQ;'1߱ĭіΤ6+C@J4d}y[_΁`̼5N``cjj,^1KK9:'Y;mֵXH!&| KڬRכa7XieYL1@X)Xک&tЅPtzlXH8!!)`E3A; [Ыב|  +C"N`2ӄڎr: (R;^`Q=h Lb݂X -" Kx(5:>1)'΀qI$h$FQPHP<0" 5)ֽi %K28+3/" *GI{(BнI@q)wcH⊪匓U)43+>%"8 -Yv sېZ[);]=:'KH/Ӽ,. (Xu J$.(r[ D&;?Hmz (=J=:סi Y0T ha6SՁ/K]fwW>D7,!EA-9A%7 Ĝ%<W~Vϝ1oߏF)8h|{],t\΄<p2"XwL}nXlD1V D/[nnmQbCWQR`UO:.գ2J#r:{LZ{{].`K֫ տo҈0T[M7J)#0"x%$5.MI/Yw~Ze;;o.82byʒŗ˶` 1N[S6K~գԥa5Hl XHgw2@2`:>G O$)++(!6 b[gݨ|Jtt:ګ<ږf!X>%#Py^ )u( 4QYSLxC. ص1 S(D&I _0y9 `8"P_Z`Q:#؛/f.BѼ l 6]E|A#Ln<%3)/l`MM 06)ԙǎuA΋[+%IrE"pzwGr |Ǩk%4" Q֏'?-#ͲeRm&*YlR\2їJ {3t?8PY$9__)c+1*"`O#&.Wu$z[SLȠӄEFG >#fy2AOL̚џĤE97n&89*>b /! m!"֟[A%5;P[ffpnuT$kt۴)ݎH߬|2czg 3G묨MƀBg!+ND[TULO\_E_ PU%)\|{GzY(x4k%Jl}umi:7l6C``=r~o? ~k 8_e{1~b!55 Vm/Rۭ0v$;@:536 6I+'C>$'9+eE@ +X?[B5{8΍(~5JV}UI9,!{ ExP?N@|@<,(\ |Qx?m\@ݖU,Z{~e9 ٕ„بȣ殽ǾV/!|g$x>%Q7XSF3± Ӡ j;eyR|fypTbQ9주ŃNp٧%_VonN^.ֽsA_1@E,jiyVQ.(83 `{yQY#"합T֫}U̿7j Dj_&) UIs\w[V2~I^ǎ}¤`Cg~\% %2&41Y@rcw~d : j׶Y9 m2ʳaўjK W 6 z*MkmyHiKDYL;Є *vV5x|i FJⲸƚ‹ݺrIl}{MfBHۄV;eſi %(%:5MNi[btbUv7 s Lcɶ~? s!") eֲG%zziDn}FxR殯pc`8ak|hc-]] J@a`j>YgW{pX*z-3 6ڑ #0!%(&ҹs=Y[ecYGd/ %=5{T$v #)$9 E pt `7 ʂ <b**G6Rzf ~*D@SZ~TIB=d5N&GЦ˅"Sq 7 ` l %l2=8BLTef3qp/eO1W͞U_͙GqS"h%x>:!8 ?h,@C6Agvjӱ ij21x7$zv@7j#L"A.WhyW鶕D!%j'ӌ/D)/42"v}e~ބ0kzzj7^Cfj%;QPF?% Vu`0Uyq^3 U'j+   >rڼUM$@? +K{ҥ y /[-Q_a.[ol]M;!Ħ*)ƶF(A!bupV.+J!D&.7 h| BQ ,)̴;20fxWN,G\%UC(Ae [) ٛЋԙ_< Z2Ijce|5~STܟÂ:p7SD`;* 6ؽ s%'$"j#M"RU t4GLB#m=\:ٓ'>13H(moX/Rn - e A"U56% S߅   0:9 ,URyz'ir"*$^lۼnʻƒ2b!**#| HBKH (ApUa=f0bR[5 ) / ڕ6\! E AF 0:H._ovu?d~}~kf@D)dúp[>?E??ojbO5^XYe㸿!p7|9P&4E:OI3QƗշ]щ 1$yԽ*צ~?$Ycndb`IZG^* W'8pG x6_GCO:577+f]RC 2(4(qƼ 4L:Rdr~k}k]$+9-lܱUCd;tvsqdo/dF$G .5( jW 8  3BOHr<ڒ"1 3% 6fma3"bdiGV|$N nLݧz:i:ŗ!˿Þ;ܽ>(xLi{q`lGgخ]mM؍ 0:U5..,\!,K58-4XnQiA/ѿ7Q%jN_5LxV`J +L ĸ7gY.Tfb2Ls2]SCs!{:~HG:$C&tƄ*#O!**lg1Đ%6SjcF]faт`kw̴4A `_o}(OWkvjxYvo\K79¬ZOEC}8Vowzi"M~3%A m =b hWRB.=# ؟A]xk #$. d %?/!5" ,d0T o$/[8=)9!NjҨ[}C;Y:Z1m 6}VXiqqcYH% '  &v~NҾͮɨϪ.#9Y0 C $8%޶^% F\YJ?dxC 7C;-',Z1K(vD.7cӑ&; $'#P  .3*5  Hɋ$V+uZܓ]-'UԹ Q*Y{Jxi{S4-tәޝ#].Uffd%oW_ġK&J,/" % ]l "&+)'*162I$xmi7nH̃' Ҿĵ q;"*d$s aOΠz,U;P.45b4/%b/#,'M;d}-BD{>g-A8G]xydGO&1 ײ%a/~+H #5ݺ1"BI7 ZMQ%v>54v":OJB( ZQ6cY2O R' ;;ONS8@- S (B2' XIdhn`Hx2J!QB[14;u(Fo\r\RI?b/q 3ܫ'F PǼl: M2H{PJM5J昽2;5:u4{9{SuxI& 7.zZws_^Uh<˖Tۙshʹ>&JW^]PN6tǫ(RT k0Rn}fzka5xu-,E-g/wucE=Xv0LaNg~^K0 zO\T 29-G߅6gTM1T%5b O"1AQ IJ.lc !),3~>hF?%*|׺]ƌ$Ȩ0&7?Q5eo jWr;؝L] /#C֨H Ԁu6oa;0FtPB=OD)"QmyhucF& )rVY3^ Y~j'r0><1%s ԝO6_L {3% *# ETh6DB"6>$ y ˇ꤈o6"+<+A i B+OY )~hWOͶE$!t''2@6B (dݚ  qq:rP|$< =6$ e( /8#27%CZ_UM*{`G [ c )"7&"¹+&?A14mڡip ;.Rgp;qirWP;\{Ae%) % F/PngX&? 1e;;0W͎ԟ Ccn&۩APRpF4:EGLV[M+s95K$  a5q. d  )29- %+&n4w`,Tg > 4"|58)Q>,9r@D]F=v$mܬAѱ]>nL1?9s&\ .YS˰4W7^G#-1V340<# ;U$ARRk>ymlhѴQ%M'dF UF?^'NaEݺv Ki!0:|[J3(.'(~6M̛նԿ4,Ǿ>&@Ci/5( p%v( ,ƽ/ס@UH㶥J7uo~Qd߲"gEfE%K >8B2FiQ'SNF;+A0eφ dȫ0lEV\/R:5 . %% $8֞j_l7.k: H8[9jeT>).d%;Gx9OZ8YN<& 3JLƴvNؾJ ݞx;YP P u'zt  H"22AKbOrNIC=7,6-"ljf+Т :Y &y&ӗO-^&~#L*+F( & ~GQhXЇ۩3 QjN,] k"26E, *>nn*}CXZoBԧ:m.E<17i"b~ /KbiY7lad[T(R >zgW԰Ѣ| Y PK-BGo<8+\ &N'W 1`։p4JܰA8R/97v*'~LPݗ1s,!ޞ %9jLP[d'g}a0U@Gj=9,82%(#Ȣ Z: .< a(*_&YM=e;`Fع0)C*1i.(F)0#9;7s1+#= #(CPFm. !5CXE$-49"??09`+q s}(kΗȖ πhcb .  I!*3j:?_DFIA1:-Wg~ i5_?I$kz Z}%V|%('('+){+)! /Vz# W]&5x:K4&By~# +emBjHlK@<e"8 GJE&4NGܪRToHW&ξ 2y G$ Eq0`cP߸V!{/,*.7/@FG C8*Lr+0Y2&F9HLTW,O< &![D3{ P . * z!@waVi %7AGKMI<\)C|߷*t׃6MDmL-o[CucˁIĬS9h&{+U& 5Hl -eALdN9G;2u18&DMSxWZ[V(J8!(I3  xs/ A  m7_"7Ɛ`Jk+dl ߾ܻ|ۉXzӣKnF6%3Z80٧ ^G^Ɇh`-9AH/OpSRK?-ISTJȧɲ}|c,ATMaAdI\J2}/4uMP$h&&%"uf4e mԷؕ1.9"9*)4H YH_p}ޕJ dP Ol[%zj!<  % J G * .I>>D?5+$g P3YLی׶0:5>;3'[ p5ڮ6}R!eq@L9id\VL@Y .APWOVNDD:0&/6>Y)+20|& R8 ģ\M  --edzgfc9Bxh .v'l҂p7$%,!7 =_ ٣k>sF&Z6[(cV!"!Vk ^追 +|BLI>.4 PS1Z jFX>C  i]q ٯRTƂÌǟZ !4?j?3 "_HsI  /DDB՝-#Р̺˰03 "Z%" ?رԏ۳sH7 : 1B.|#&%0 zK IB+ > E q&j I-q/qyGm Uk}bj*#*$N. |Ӧb~̔޴F' ? kK S 8u w#L&  &{nZ3L-9@?r8D-!]s sP6"?'% _}ẖF!<9Hۄ3[Z `o#.7B==7+K M3#/"(-}3`52+ D%] $#+P01-T$'c M I T"R)++& z~VL-  [3 ]%4&$q"{  [{t|= #)Ú>+؈XgNC^m, < H q ڳի+ /#R),r.{.,8*'(&8%!}")-+% [#`@R&P8Op>ʭ݃E60-7:4 /V&?g  7a=, _T!-8v??9/u'|$'.933+ `t+[@D/j!m$8/2/'c6gvcT46J |4{q۟k|t~IarˆpIKI  [|j:a*+:EHCD:0}&mx{tB }l{+q!֜Z<j !JepԀ89N !K6L^OfbW2I~;/&pn g V I> 0n֢ڕ|cYx  zkM3 :"l"0P NgߡqWlX^vݹ=ܠ"ϣ̱.W{? JLD#+ Pa( UNmn&T4O@GHAN4L"}. qt E$(q& / - 4 n &-1@75-rm}nH 3!"a\qނհ{-܀:)AI ( &)=N8٤BTǩγ٨' %d)W*7' CH>_10 ,3^1%!>vzѬNWT EjX%. 7o<<8b0s&dz_0>&# \ J q^Ӛ3#pܢǓTɠ׍N E-[. v IQ  |z[vzG7' W0Є5F؏BX *@tKj \iXA\1b5Sը#ö^ a] O(m~C H J>BX2g`-RXT8OM?"/ pMuJh !S+w3880B#/3s#-D10)OSG ^  H?T B'D152()0 il ڮnW!$ "E_K؏,0ָ/la !,  9 .)8xq^?Cj[B-HY k`%+i/4:@=B=5J.])^%bn E kIf -H  =s  0W`W'[٨%z(iʎ֫"- " ޶"ؓE8ޛBu V  #/#)+}).'$!ob{\0xUO_S t tFW?V2՞Sq٨[2|SJ#0:]?;<1!K !зأ` W!',/1G0.+*n,W05~8182'U :d ! Dkϻ&&r  nѬɈFbO\kBd Y3 C O J$&j'w&#U# D  t!W'v*a++++)N&! K=0 `i=8`!# ?qO goG<ͣXA1D0*=w> ,)EGw=ZVvCPȨteӒܘZC@ '09>@?:@4B-& +;TD w\?X jI ==(uwHRr{  C U|TaC 4 hv A yLexIp( ?L ixs  vp9owen |"t7}5*U,"!:0>_ "%! bՔ#/ՇJWKV)(!ݟ  e u S \Z5y !4BV(3 bT>X!%&$K Nc  TzK'  l'?/5K9d95/'B ݦm@и;ΟF^5G|R, 7z>Al>M4$G2@o& X } VE 8c~Z "-/33.l%]r*_jP? Ky!# ֭@| 5 Zf =,6=f@>7V-q ] KIy- p{ :D= {xvNCfD؂ τmFpl!+~#M tQ[ - Hx*={Up~V:N#) ,*$ 9!Qd9[{LXސnpw" )2V(%b)+J--s.*/-/,4'   " &S,, 86C]#%k#Nfo|W*T[%(m )F+-W|r- F= ,#2+h r Ypz.} q 6 w>  v!(@,. .y,)%! f % D S(2 V&^s 9g0mkIXV [S#(%*-Z.+%~ ^U L /L  1JUv#IULZ֝zPI v )88+m!%$' %so_% i M'V]~}7NJ;bg[2_S+(ݙfk{܈XSME \ p  : H+3R9B;94i-%Z,=oA _ fyQIFx(V g : 9  [#M9' 0#cstNe 'YVh{ C 8* & o[$PAk Z s o $ O ;.R X=]_aOp/8 tS,d[$۷m% B3U&`n;#)TNI9:t2) r Tx W n 0;0y0MV d417O ; !nh*:.(SeN.fjN8c\gԂ׀&   jt )  \ A1q 5Y6z  Jc%NDk{RwdX\R{K-kL( 4 15 `"##7"~  )"e!>h! A l x {/C4 lG^\Y 7 2sQ[9LAKW,g)g "bvn6~`:8#;9M zYn 0(wGYo:XVp~Uhp9Ii[2 p6vەۍL-5,.=/03[K35 N |.TQ%|rZX8pP9 U 7Q $ P) NFjK? &f75.BO_A [s +a>LQ?%6 Q=Z C  A wRbW6 J 'I L.dn? |Syrm=`^p?,Z= 0HsEtk}Cf~4HUm<*OG 0\2NB D;48sI c j  E8MxJ DFt! W%rqjM Fm@\ # p $ l5q[ \  G! um41YDK4  !$~,oM<Za u F JoAI(rG_j {9 <]}z~~|NH^h5d NI\%1$%R\At9T%}HZ]t\i% $ gY8  g s &cQq(m?;>",LJr Z ;N(Eh,.t]tNT.`Nv,V,'  F( ')>D@2'3+] y  Pw TxNV$X2%!?v/F5Y8XXGSWUKXV97zh((XiH=C(%q *C "a+1C{ ;#fK qbkF 7 <M!* b,d(9R^`p\VaQ!8U%" d1=zL?Gb *  C FA:C+HQ9h zFuG.;F? 3 E.Z8j0-O> yz@yYs:8 3O&lwbzflag-2.4.2+ds1/data/moon.png000066400000000000000000000607121200563112200160340ustar00rootroot00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_Fa@IDATxڜKK`FA!Ҭʌ(gܹp[e`ClJSt3#MB4gOp)%gOy/j֘NxZ.qw;`o{o''N"}Y_ìe~/?m%noaUD{ 1V[Xh֬ PJ ?~[mN pgvCUml+E9z#:aThb5NMsJc( "!WP:gI$DZ!}  8A;*)n|A XJ4 YݻǙ? ,a>BkAe0dj?Ȉ;h}/ ޼Lp A@xI;PopԱw`#/8A 'PhO@(Z༼|V j'rWԁ% ~cF8$+'-**)/^1ZS. )c R/":S  e <)S?gY۷)7ܩS]WŦmG=]=-b5aޕz:Zll e pPWMcE:" AfJXr?LH-H釵 @E0(p @ 3O8 d>ycU)<ܼ^daW^oU}2U@ z<7N9"`g}0y?u#\a`F,`E5(`9Dr.(@k"V2ԃdPr:J@;H]q 0s@ T = .ݘ1ps ~aBBz<궏s/xL`q Dqwki(~؍{|.` f-}P s9H pX qP R8!Ԁ (1r1H{H6bêb 'J@v0UGT/GTL('?|^Pc h@w6g':nn. W/WvH?p@s5/A\;0GA<0$bȠ+AV>$sOxA3֐̀ 5Ȇ.` $P'F`O Xm >?`7 ٹԸ~ӗoUON$] 4|}{B[/g`v` Q"$>`q DPCD@XLPΆ5@jaE>a=Y*<E*lZPT~X'&n%)@^Hwԓaw[`%v>fVv5'c %"#+kN zQ (P~]?VpZ?9-mP@lP"O "A5@|X"5"a BHh@rDۅjCJV@{CY+ X lLv0Q E01 wl+|W]#Ǐh=6kIAi6M{K5ą / <װG ԪQJ- ̼DrSÑ͠ݷ;0rWRn`h׫2jE\e@dmCSRG'F3)|,>E@8)Wz;@߽rEP&۰*]rmhLl7س~Y/=@4*8l{gx[c/<qHD,M$mep_lQ\8饡} \J@,S#^*-oK 8QIj̵VRB` 8l4 UktN^%ږ4440F]o8? 9|XɲĐ){njuC?zV4c/ h&Z[/hK 8PT0-m-)\ s@lvh/`p5ʉ="70A|x`4yx8B>#62?}(A]Q>>0aB'`= XF%("W^t N`QR%Bj1@E1Qb 1 XyC @ 1@ $eov!T3>vbBGʷ2a0BE[?^-y6xQשoTm0ީcG p:qKBGx/yLςEfMvwwGRA }:kDi= BZͫU3)̾*Tt|lvq~t>Zˋ XRh!5z&c9 bOy!,po2Α|]q9pGO~65,קVv10 r<%? TRPEc{S!4"{{w{k'}nLSUzIM¼lH?|UO'0 TWh8< $|w!e}'2} dχqΕ2Fz½iL7* ־%3[vD4zVd~6*j!pJ@,GjLrtt\(p`+x 4kA:N6%ުdP`"Ń 15 vA ,X;gZ 3B XXNDxEDDP u 1~XY# k &XCP(y@=g`U7֭9޽9F< @kyP7г֥zڃy[P;T\jWm)ix7+$/m+"W[ 9ZO7gܨ@E`2}"d9M`t"[g< &/@Ya7K&Һ\NGa}0t.OFm,`Ɣ#K79"H݊1tqp)zF^.6i0/k@yPM;B*C<}-}vo9Uo\}P| ̅oQIrgYw]_O?-,m#/V0 ֊WżNz/|xSTD9hL:ॅΐeHl1^֛6Y *TIM)<:P/S6N]Sǃq$" j%zBMl9(6 UzZv8޽DVdB:!PQPÙLV;d 7d+zۏ.Y+ m"78좣XݦgVƂ ]zҪeWaWXN}o:P Ԩ V:0yXgBYTeOY@41eikX֯X.9XfXwq #G_U?CV7i t#epYP.doAa]E36|sl T+>'4<f=?p_7`)AE5w~[A.RAED< 829``6ك!`j`% r1Xb@5aZX)+y bjh#1V_hτ#<`s+ І/hhdcc@Ab,Ab z f!PsA(H`fsXlNX>n2 dl_7n_ anw:yƤ(wɄ Jqڂur"_k{E( Ԕ2k;Q dֳ2oF5X@F [FNkКAuRph1g3:Q휼 3t+Fkz7G "x p1~%Ņ3D>~zi#:/PA ϒA\V"HN[,(rqjcG>Ñ통G[ȋAa90L/mLQ K`~M-,>[?{ϗm-;@P ^ Do|?=bD"x.\Ihe:N޻-tEYuB6QLADϜ nv0 7W;BY\'("8HR(kBX; Xz!˦y^TSC]S%Pt`Vq4}c@aɱ,MmA 8(*a137os.xg- jWv@S,l}=(0#)PV!~PB- aE5rhb<(X ݂=B`?,G!G&`%? <2Ha F0a_La[֑3Y0R Vqsr0 ~+qn+@U DgߪxIzʢTJ/Yd2ixĈb^my9dO h˵ EQ$^ɑ`aޤ-&?>f얐q_];f0\3>~4 k$6H#iJ@bNkQ9ObP+Sb'Lh7M{s~9g,D#g0 Āle#1UxZXP-_dX[)J)gC[wԜ4mx?/M9̳GQE1>AefepJ5ҌaiRS %"*޵rI(i羅KDE$B! +sW YE[)PEE\)bW_l\Tc]v? `4ضa X *!ߤA"l2q fgwgw1u# Д6d-}ȵ@=E %:& A:d_)+0s.k&PUF,=carkUD! 48*V"o-2s4N꜇P(Ӣ9F.>p>q804#KJ[枂#qXB%.а :\~~qA Kvr>ɥ?tލRg0nUUqpZu,D31ƒp FBM`g4FY&i ƤlQ\4*)݄qd|j B/@0,)GTC6S !{ I˷)W%|5 k)Bm))Կ-W0 ZApR\|}ڭZkX‰.]1A.Gr9)re?j (wBU WSA1+YZkH`X|\gw$@8Q!K0cS⎤e+nDFNIM 6W0c@Oʲ"zvrGbl%ſ. p 1@oĀXӦ˕RoRWedIvD{. Nխ.z:I| r(Mn%p8+aK1.LoyU6$?vq b۵(Let;+"el*1bŒ;iՋ[ly3 !&y&yx!?n^ߪ$ծU4}QFYwCvH' R/jv8#x]dT "Mɝ/'M`vW`\r0\Ip4ie2MϫC˼iҽpC̦a!YØ>e $>D=L12a3[XX@ ꚣpa؀Ⱦ^ɞ z؄1BJR&YO`3A4aX) 2M8'R,ָܸxx44Mg4 X`}>5ö TCʳnȺ}ޕ$Z*IWm!ީr<2*Lss6\^[)g!a w6KQN)q4\dxv*N_䜕o!L^)%-g\tvܫ r(IK҅>.z¤G1nנ? 3g?G4v] tNvyHr=Djp Ӑ*uMi:grc ,I#;*oHv]ڝ UZPvmfZ$Ntk0zDP e4vQ,Х/l"<;ioky?6a D;.6+CE¼3& L'LxkOi:۪zhH} 뒵 O#=rH+gWYB%x)!&XHX>)!D [Jir8>S f2Y/z;yTʢWk3Roe(WGQ }WZm^o<_/>@0qH 0 !7 `QF*JqJ)׀;n!tZ8'K@Eyf`m4n΍n8 C(9akg-;̩㇂nNJCo=sv{}7P=̍w " վw  Z{hytDAiEaZpi.6GAD3!mףLg ߽nU/U{'"ز7d4eE8S4H}&xLhK @ř0Q4B"E#rHA.B|׺CM!qYWF{wAa0-Ԋ]]yQk +a5 RQ׶-^S.9}c^h c6i]0l{}eFj!moJz3GRRj9 mms^󴼿I8a ),Z%½ llggź&d<θ"urYoS:y tc1X`l~G5w:_i׶+\B‰ACΌ!S͔q,ޗV7{w26ߕ/Oj$q6xε(V;lڳ~ߟx\z`n0q%900i%AOHG!$"-U=6qȞ:i<[`ЬBGTiFU~\/MQ­dA#(b=˹ {`E(8q-D)sJ {1ld nV̥-JJJirvl*QF9.c x=D09*V"VF}|\ʮ?|ߵ!0eR7IsɆhC.8_6%@ƨ =*ttJ^KcB(2f6Z~:K\e·|Gڲ7s<˜+?|>)1s7 HRg͌hU?@'̳\+4#.:)U%!%3,0j4qU.-ֺ|@4z;| L &LR %|!eO\GHi;|~!=rkq(cTg6,F$"5PxZԨ`fXx'WuT:݂N)DzNi41Xx/~$Nc3a(M+1FnPX"8lb1F`/(ՑF\/XUaviYRť N1k?;x0q&25  F wK>.FVȍ ^J*~GH0 3 %N|N ڌ~|ժږ/&ﯜca؍W%@ƘD] $~@FtڒsXvC6I/LzI=ՈQ|GB,aOhQXkC[M;MW%Zy`Y$m uToV1 NI"%-VOd J8Ul|Qbx0ɵd3E76>n:pq69 P`zqoQUM<Ȕ #y\͠g"!R<&F F@70;)[zöC|CŎQh캾t!=$^E#h^E3PEnվQb=\t iJ-Lx'`8[4g8kx:z~y HȢD%51,/?9A6t>UW"؋|Ly] p]*X͜2ǞS[W<,T'\,ZTG^aM}F;V cU+ȃ0 ES#Ԣl;Mdz )r>\A Ot<32XiHl7rwo&m,ٗ@ܽ\wIŚV0N |悿|)3 Q:RU%VQ}ZEK If?>:*h`/_\yyȁ^ݎ36@յF3#};}JPu/A^1<8| 02D (mSN=OX`Xy!~%"U)͵eܒ]MR8<<pu-;0>`Bv ةE{wH<rkW Zy J? W(6x }.TC_ΤO3݁K\sR"9,+]2sX Ngjt$3uj-3:ȕGHQLI)<5TZK| i0Z}` va FGb<{Ptc3g1>{q7<֔xUMvAw˺W @ 'FX2 W @ ΢ۥLwF&chQZ@N;|Iצ(AzѥY g,yʪ)<:Aax/ti(Ӥͥh1O`-OCnV#W=*wbJ.2unHAT!XY@m3I Y43wL-BWVJL؁aQڿV"dr#rR{+ms9]mJtP <}zr8(al"B^UDW[w/UhN"e]P5Ac3*M$܊@L)o"ܮcL5Wr@:lMYx%a_;[}\ D5,yh"܍wZ+R@GRK3/'vo6b_ P;|go &E= ҋ} ޺> 1v9M5 G{I;m;24֗R} rHzY9#N D<O 4$/ERJǼLkG6h sN6cQ 8=b{ե1L|#`DGIF͋= J{9N : nݗ&c|._~zĬ n'p,B|Ym&\M@0+A,Xqp"S>vmSμ1ڦy|ٵV ˷ *d.^o{h:/C(z8(%Y2MPXOΎbr-W0gDry-قN= ㋫0zɃTF{-dz3!z,Eܜg{sMRsa,z"QAbCbK$ulgh T+`p;HLHټӫ]ʏRbvX'(~ ѾsΡL{e0qaAtKsrʐHb%X?*w*1zt^d۩)e޷uz`lV ,(AuOfAb?drF.'?dp6x&txziqq֟lCgMS6yv֑?+V#W V\y2"l>L] Eq&3ibGyCɣ`mT+^g] SӕZn @C"L"p% ,Ća][_5gQwZ(&&lLw^X=j%_$P`ja$;ny5}`cjs VJH^yn =-1jUl& !PB8Oa%P9 _A$VJ gbȐ) 9?ox}M݌~:]Kooe 6*T!PP{ hbV7r>@] w ;|D!^ZƼ/2hWah[I>)PS_s9*X"%ۖ y2&dg]Z1K` ِ$Fdtyt TTC/GF~|.~gh ʵcqO_gL#3T~!_/WjLL#˕j9R0^,Xo6ҪW%@*.3Pi}nl28,t*y[*~yU`74t<.-\zDppH`AXa0x :"ĻtP,D&"?,M,KE k :C EJ8ǹ^R=̶Ht+f3\ DCBx ^pDewafaodtaP b1n ! 1J>p:8=~F]JG ȑ^|cnjrlz/-mҭ ) ŬYdk26U S@s?Uu~u/Dƈ~)I:ca&RR Z±{&r*+[C8OjsJGη Q%X,NL?K#@%-GU֚ԓfJ  I4bQnf+!Zԗ@$DikTRG9FWg-W_!0j; R`"" %)Ci&elzޥP H^;.$SwY8uSTTsB1R F=%bvW$hF3w9$uJFV3!+Lo}A#}Xjl\[l{gdөfKm9תP}l0xܯug(_$a  _/8pq` +'.mML)t}u|+G*.`0,OHh /dRH%o4 :;ɑ a=3TR.@>*Xz7 `Ϫ젿ȑudH Ih6 ˜F=ے8;"m@'.~%di0}aھAm /'I aPuظ1O!qw<5@k(-'d&…7/ C'{,d)}m۸gox]GUOןp!P5zPR *S]A0]'ςrv4;W2 .}ݑv`qY4̅30 [W´BgTSL5؀ؾB{_r~_ aeegu.'1]mOcZMx< "F`qd2L~^4]/M6Ǻ}CK5- i (&JeTk?AW*xل0@J)đFJBAT) ;k0i* Cf?S,|mMXnMQVvN?D.ƺ_.1ڵGd@|A>9:ӛ:YHxX6x} V#aCȇOY!͓CU{  / q|;7.& 3@^ v3#"y[\ 9Ÿ rm/hT_2|vO m ( v Ͱ*y]?2ekWѯu-fu@l6,<|' >7vk`3o`s@J ]sҐ- *@SԠ*??`# ѯA񋗛 +aa|2G0XA3ixf`5 :p ^|uQNF@0P$$nЉ+psƎ@[UCvN)+nnW1.~Z?@f".\+n$)-q*Z28|΂FDA"3@/Ha/r]™;!^0R^/ j-,{́ux #!CA(XXp@)08 t !?wwޜs0 y ^BsJ ^"ù') ͣyM>&Σ;_Np& XU7ܱqIG1V p}[;\ŶGhk7FP.q3 \ZVu1;w *8Gn٥A8$ G7XݤT=~6l=D]w&:.yi&P `9znfd걧!.%[-)i&NoP59L%bHdbD ïH jH&tc7jJj$2%լ}P\-m`Թa-><߿w/_8bjjzuE ȗ+F$AE^)8'k!oAl @fo!CnP%b˵ ;it3ZS^qX @XNTE0D> vImmn#=%v@=wB kKAڴT[cI?4[w 4,Y^qOv=zUdL{ISM \/Ͳrj/E_q7JILAdN+i xpv52FW$Z>-hg@Q' n^1]h!sl˒鹆Gzv,)NMG.t  3c-QCsq*4+[W0 eNJG;AIEAP* 0=Ҧ{rk#.Jp8λl]\+Gj=?o%$wDlYhB%ZLl&WEWPZ Ԓ+QHMFP=Sg [O r mvcwnEҬ._)4z["i@-I&4𪅨RTRuh O:)l `‘%>#- լ Bk :A _ԛ) n-7.Yŝqvǽ}\ocQա}m j]˹Rdž`h/+ ?Mx6ٮ$DX(t@To1?`:] #\"/|c l W]_@Eyyq֭]jFJn`c΄./dB$W!#rw9ª->Xyx v E|l)lgV5# R5Mf.C^kՠ6;  UE ]o*ߟϜs~\@@,qP~9ytwLL{AR&4*Tfh-l@' ؠ %˦{cOu +}~.`:I%XoDj Kh'{O.Gޟ`P[a4| 6xߑ moݚ̭7& ŋz^p "6I|k7O"5o`C t#3!ln"JXi*6 †akз8Vez ) _>C0X@GY{@~U#wý\|XT60C0}ۿPgONϬ1FA)yV 6jXc_b% Pۃ `ؖuXi|(QV #߃\~#,btA݂|lr_:@4 `Ur]r b"P2l0?řϟOececG€$Y,,pd5o[^mΰv7r G`i+c}`C`EO> ˯a#lD@;r8ly32 !dž?@)lp{`a|X Z wr7v6UV@0@wݧ{E`Kx 40+LlMG"oA>y@u6^=PNEY$ᐮ4PI[ |Pn 6l M{$a ynyO0ss ; yA #½{· ޽50{6.np.!"w_`ceݰaQlL!5BQd ^r-|T. D^ |` >ǀRz!<^êӐ{G0;ga[a" [2]߿?/7 j6_ܹͱT' 9[|#t3u;%(!%qZ \ ɠUM\0n/ Tz r/M9`V́rx'P r/h,r+d2o} Ym{.[;B/@=@]NofDB  Ȫ`>!5O=Q!`K+tx, |+Wp@R9 [@%ؔ0 *a`Ėg9YA +daaQϐ_87~G-]A!nDaW oG^EBVQzAߠUoA"mh$]V`tW+ [7p r;h?_!dfFj? 0C 2\~Sg _H-rP$+I@9pђEZW./CP>~Vh=Ђro`ȥ$9cA` 9A%4h:sj]Kݰn222#?7LegD}v9;;[RBŋn#3/#:y>6AEb3>{ i`5` fnn*b Rk?ҭ"(2a}j %aȣ0Fn#_?<0?ox5r:8R?3SH Ϝ˧6`0'9* dvNSNKK˨&'$ U$yx!K@s3 *%@@t< to! AnhȌO¯j? x<!cDB-a]AąXK‘'`†XU$DêPc hI޳(?{<?xL 89mݺ5 Xd}`d 9 :Tzar94,&x`3zSf4N gC wAJ@xذ,yC䰕Ұ ^Q8ȇn`x[wT>|.1 j%@  .g֕R߾} ",ܿ n - րxH 96eA[ ;z/=' 1qq ͡F ;ZO;;v,ߌ@^&~)+3ܯ[R`o?o߾_~h~9Z kbA΢e K}DLTg<| e-4E6?8v)v܀r_QnC^6J jC&a!G|kyA4৓'E>f?).܏|x&,bE=y6xA۷oZ|S07%Ā~M8 &Mvn``0g 0ܺu>8$A}89!DD=p6|$l lV|- APuqwKJd,E8,a˿au;r&`|/Q:BRiOPE>m yBT`Ν;^xSZR>@4J ]-xM[;fh$W _aG!1v3#|NֶU+)`ͪjҶT`仅:ҕ3ȃNR - of"aw= ]]6pICx %1}`Qf{ѥ( lN`0_?ǢGP ]=$Ԫ<; ĉb ؀F#A3,,??V"KX/P̋aPw |?a@K?གྷ3;Y0na'zX5Xl〪Fp$303=s麵?~|T]Dh?DK\˙ ,h3IM]z,(4%El2y)%81 G `vޑ Zi_2b#dVd%$PDz4,kk@n_ -a d'{ < D n}S߸~Oø $HyC4++*={;*Aa!u~7+b4t\< : ~x(W΁\8h4iJ? ]n s? b (σW(npҥOU~s?"k@O&M̢ڢ̂Bmop O*,@@C GgPdÖ HwN-E?n6jNX= "yujj~22lW ~i]ALp{-{` G֟({]b9r7GA~ݽSA@ 1qWJ|DKΞ9o_>n&ߠqz)@VݻvkzyzKp6x9k@΁3 'pxE.1k`í˭ۑou^ .yO6rCb @r?@7s'@]Ϟ1ۿȓ'OV^z}& o:I@ h@VF"(^9qd7;S !^QIYlh oP *sHXw0 X < BA><A.M\At}E!@Fl{~?x]:=~DLXUZ,hP$d)]kϝ+:tp[Hh@0DZZZ'䙀9 o޽A:T8}Xi[G>|ݰ;W.$.V3H _ $ ^)((pgr>`Wtn [7@ BV spcٳggmٲU0_VV^˘ ޿/O@mBF&^`=l 2q,@A[q2 Gdee=?3g.޳kTVv{yڟ T{Є5@ <&Í7 ܱcg^FM|#l'l4#lZ"m3C>M 6Fyy !623NUɗ.] y[5pz:ayNH_]v-FQVVq60 6PѠ7ئx >6fBУeCUo߾x.\8z XJ&Ɨ1 ]llАIF0\z0[͚LRZZZFzXgly`)+ kA?[ԑƓ7o޼/W\pS׮]ASM߹sa.hH&t!/cĉ ֭ 333L'L,쳳x(X}0>{ 4wΝ;<;x}>l?l`䉩ɰ ơQ@`,`1IENDB`bzflag-2.4.2+ds1/data/mountain1.png000066400000000000000000003625011200563112200170000ustar00rootroot00000000000000PNG  IHDRx pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FlIDATx{m{V ~~sεso\@H U( !HHy &oDHy Ķ5 2:. m*S3̛7=g֚s\ss('{s$"0 0 } 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 K)0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 { 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 0 0,0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 ð0 0 K 0 0 0,0 0 0 0,0 0 0 0avl2!4}dJwR-s4M1 ? G"r)뺟^]ܺ7=!wa^}{ 73p΁ R D `g@D]ׁs^ 5B7f󳗗?0 ׽3+N'䜙YD@DރYߜsJ)9/ ~A)1FDs)󸼺LWWu;D|j a7}?L{-7D ̄Bjаb#-R\ |(9ߎzk_7FK 0 יoگ|@/|}y+,9=r!ѓE B@RPr- @Tfs^B?`!"o'?C?Mϝ,0 0O >iݟa&"H;cE8_z^)y9k 1䂜 y_~"@&!Mu[ No4 xꩧ~yyEK 0 ׼~;N?L B-A-~&[' B)%b|)( ;AmdrzC\~o~o| 0ߔ|W>$/@ p[y-9/#|- )SND @ P A:tCLy*@џ/mvpG׿ˈ)}}s>aa/D+Dxje @akq=RJKH`vKi }{0$ "t18ܿO)P @R?}ɇ\擋`J S~}{T.fAu>amgSJW^u ؖa?u]s}}=sΡ:xB5P:2ct(@J~zB?2R `9KHM@ r RWub߂u-vG9gys^0 nnnCܻwW{=z _0 =/~?"sDZ\h'R bSUkf'wrIU!ع47ùrR~^{#<˔@:3П]@RJ1.=Ahq{v;\\\Uy^~%!e8x13...O!/_17}waN_j/裈( jsSu y);]]zSz4 Cr촊KiRjuP`٢Z8-9#ƈnaη,e`ky ƨS҂/Cp| ^ 0 ' -7Cci6hN-f5q3/"Va+=B e 4%a:^%~JD>Hn"yRឨy2`'V?Hszo`m4?N9eupD( p̂"AȮ aN˴@zjCzv쐑@Twڊu)kBEd0 y 6 ߿_òJJs6zd \afK?g ɟe'<3H}{f*Qu>^`WӅZ/u.!¾}"rJ(|]$ɁxgDgiK`W@`T2P2rT;Wn"C"qq; !`gLӴ@)eu2de cK 0__`wG O0Ϲt ] FwȄB ;*fSY ;&h> d-H^ɂ"\4pp(TgA,u5`Yz[N'H-!)RF)Xs{9fpTS(iR8ZA "YPjBp4,0 0WW}83s&Rѝԓ3suխ乺zy<ս.Q ܇؁YOVÞs ~ %&@V緒[Ё{ZR@ 8Y7&K+1fyMc? x&:VFI\%aƝe_HS ~{~b[pKFF;kGDi!,5 ik%1X ;8"<@EbW/EQR"s- RLhrp BKp]O-znJ%(?piMoNgnPJỸZ2Ҿ%%aWg1}wcWWWw39b:?! ;Er)(˺x'')e̳Y @\4 PJZ\iY[D=3b*H9s}ߣ /௫eCf3#êǪ D "k ĺ|b< 6zZ%aK?@(~DTz)s7ŪEIB%uqB x/exV*#V} Ez`:5@`]M}pP_m0;a}YJt,BU`m8ƸЂ:`:*lC}K~pX,.BhY`׾{R5pDi[ |vLY ;0RN"R-A TLJHE'Dh)(NE6XФjC8xBͰfe{wT}סo$`]1hUun[i^oU豒}h[+Ъ kK 0|J1BDZ)壊Z!eW=1/=&]Ry\T PNRoogw DR LEo.)N@ N><ƦU;;MZrsghuR=|f(!Lӄ3!fۿ(zIsN0 }/Oa>o9m+nӉw,4AZ@:QUmQ3#ťTpgH"l6^DU wLm S& -x<H4 B;U pn[1$BK XmQ"jгNNBjer*÷nfC以 u=J)^?Hw$"XJh앚HOL`>W}gp)eLnZ"RJ}:k^~v.٩RG \OT7*}= wȡ]e{V7X A^@RyD6H"g8AJIN[yF={Qz)̈́9QEtwjS6"eu'[HOJN}.JGt]@!W゗p>1פ.3B>%,"=S,0 xo_YTJSJTBD_Md4N'^q}7LB=,v bnD y%ЅPF>TA(Z" t^-vWޒ iH]<2z<̃J7Ƹ(w #UtII>ƴ$!Olhr }c <%猔 Ɯq ,ف{8Fgz>V0 x ; ;i#<}."z:Y_ZTv[JAJ,˖> u)[i\d &Z5UP5=V292=(<x!V7KBKl'vT-РI.@$+bM]1 SUj4}YRi,%aI7||Jy;o:v/nLaNr)1&x{G\5:鷍5MGjNz$`iI2!8-R.`Q+ܔN5!^A/8fxf5 .a6Zz;aTJ|"'l Ot=yV'@t B&w5O6zH?۷Ъ1nytJ8 ŒpIR"縶!Lh}gW0GR61FfY]J\z\S*Çck)W Ȣs/xԲ;k!ȹԠwUcm1x&{j4p<1E^ o\Uz kۓMVH8Vwod*}`y Ϋ*5!PMI#nd]Ti(Mt(Z'BCG0߈W~O)}p)嫘󇾿?_ߌpne Ҏ8nk9cЩ nƙXLr =_Md  `Y{N`VbDncq5XJ9aEwp55%=^X DhPs'c2&Xy;94hݺ-r RN_סCvi?SQ߅pNU,zIjL ŽujAQtA<[EyALǺX0`K^aW3Dķչ2"͠3h"f=fp8,9"WEz8.(ՠLHMtUmx,/9'0uANFkX_ V j[@W]1EwwF}*_{_K^3̳%,_@{D _@\ 7(pFIH NKP)iIbr([ˣ" +K0_'E9+ fiE`P/ 3gPR=-}.z*+)W$u*쫽gH i)"Ť?tBxdm=/|*䭿>{!\Ddm.uod9ǒul jAW`sky\ !VéN;[o_'}։Z(!,u]smg"@0_?'"5/,lr諉KqmAPq<{=ATrAuƜF)_#@ iRtl !t^S]b񰺥p< 2/P~.92gq 3=;}NՈ3"$-趾} w4UpWN,lN_Mp=/)4*nA履=C:.cQC$M*|?1A5:Da/3} Q'֞kxEߢ}}ޯ'*[ #$Ȭ'йUmuP By *s:?t|GD@jت tN~q}s$)R嬷_ךּ5i6v'aٖWJqwvj'EOPqj^\o#us`5a ˔E"Vˀ"[ ?9lY%j8BuJe@-~}躾Va".sJۢ 0~M|͟z13?BR[Y]'m;zڷ>Ff2~iZY{ˌ& \5NT]'0."fh#"әrQ_PAqgYׂ u_,"6E !7`B=@RzΪD &U6$bk9@t! Ix#}\Prm5T-} Y %`'4-@~:Ku$Omu^T?ާ"o md@ D_{&h\NdZaO _#!owvke㲖unޘNz v79|8 7wq}?g$F7xQ _2RWMgRZiz2`xu:Ye,%eZSjV뮫R_{w-Lh u wۼ) Sc]Q !'B"@V#M͒\Z`,ϸ zʳ))W!#J@ GAsL5fuL8N5icarvrd QU. Tf9`qDSpkrZ}N K&l?%dtNhjmbJ$/X%!(/MQHAy]j{ڿSyI1i6k39-v2w,iu2_̹dPtlh}pݢ;nm^jhJ>-Y^ZPa3>1}Aҕ€rLI{1 d'3˜j7/ƶ*Vut|gzfص`3vjsi:jAzs`&޻ؠ b][tmQ/v} ĭOA:VEKk\Oһok^sw`=uu t90"Ƅqc#0 _~Y}KL=ZgHZ,nkNw.0Xy Z=QueTheou,B$1E}kZ/HsX5ûkT;cnk1z:QY' Ӻn jIO7iB@Q*,;"R,0 㽘؏7 gcsqGg)0x(OՐ~{ xN-\8"#Rʘ9xwB!Cʝrusg BzG %;!t@'Spi&4MH9RAꩴﻚړ,z:ḐNGMZ(RK2(d&B JH,#<ߥd84qUj_/8`S 1QꦿRݑ3bJ(9^zԱ릿r fUh1_})p`_[ N 32 㽒OOܥ:3>%=i:q)T~6b^lz`S $%f.u k*`b ] cl۝rf0M)tym~_p'Y_`L5^OzRgxm\2b1CLΩ@0-2N1!x:Ҫ$,E<-:t26R$QK{լ3͂|r*tΡ08].*So:bUW"jjFJ]P1JAmL*pu0,@S^g?J>/xbNx&^O}JZ~1$[AG@fk3y8֑r9C-˗8#p A,k']nYT/So=//KI9-7K9.)~y`{ѝmTAdm`3lἫWd=va) 1zι6iB@ IŹ!ųDu}NrN՚ks9;Lic߃;WM߇ROwzkMǦ/0Z993LaI,0 =7g>;^}D|Z.E9R{1eKЀ i29 ,\RB H\}@P]޻`WrQUrz;7p Bm@3i_[eIVp8Z!~{u?.& 5kI ðܧ"N5` \ùRkb8ȥ#%DM>؃9/:@g-Aym:\"jհ9 _Ъ]C3!~zq>3)jkc.lwD0H^e_ByF_؛KҐV2tڏO;ީ\hL nSօ.v=)B" ),ꪗVx !hֶiږfsf{w,[k,sWv n#c}@Jd}5ө :VScOsWeTD289ՅIUXm-c7e5 k,4-GiF7$1b'ufԽ3?kTN1rc$Wf4yג5J%jcj|ǩZ$D'c;؏GϜr*@Mw|)vѰR^agKy\HH+)kKHO9I]+|2Ub:?:Ϧ\moheI&Ky9u-v<{E?!5maٜ3iZ~0 vg|'u]^3 O篻f<kHOSsn9򽖲[ kpR:X,T*CgpMڜS7MyPW ZĊ$x;9h`MptQ`'\{*jkoXvC/Mr59%-ȴz:ܵ_ <տtJ:r̘spEqDČip4 j$ @>E\ \W2$OS ږgVh4K`r '(}7H\ɐB >-ݑZQuAiuErQsj$ͩ ׂ#jV`":MTGa|EȠ U A_2arp\UD|F7r]>}ه~;9~_5mU0\O|~.g8Epk9|@XӄR2< ?J֥4*KHQ{)*CYS!r=:.:L@1/r'T0xZ \u -p~h!]4~e@ rSx[p|) &k[IPCeQ/%dv`W5KncBwH4UyUZD!j Ȝ=jjj8`:,O:2iӺ 'y;и88S }.J)()Y z5qP y-o#8Ygb/g#R.ytGt6È&R6u DLr9A`eli=qב,8o3额.xU3;z2$VK]cZɲ:PFSzj,p{{{S_DgD˸\9kSy֟[]-3\@Aݝ-t:u1S=J5VHaDDzyiMGjztZk\5J)qVhO^-QhsQߡHx4=A(REUkHAR]iEXO|$:U)e>%y:Vi&z}-$J5p}JeCx0xb:ًQ_*y])pJRr)Erɉe&cH[~vI\\rJi8RJO4pws?)%g_99g6uc~1tK![D)_1k{] ן?q8BݼhT_}F3 u䲲ד LeY]!ESNK9 wX-5UikWt@DuuYəH \@9/Ħ_BfYD_-'J)8ˤ15:4S} }TfJRX?'Z$znPDƭ_D=Rk $-P?̴6p';vX?λ# 3$V*;&Nk!"tnhq]%aspE{?Xxwz٘TL}Mstڽ 7չ!EZ +TGiuv0l:z.(r]mA)(os"`v!G헥_/ 4l ͳ] sJ1 Ԫױ%t41wզW!ګud'g8хW? .r&UՁm~,h1G<|u|0\cYJ/nR,}ӄ/cO1blY讃4MK@~}^ X{aA-E{ NwWuYniZy9%d2/ABV][һ9z⤊:Xܜ7g떤 Гh TVfKD*J&WKŅdD6ieq5gt}~RkڨՏ' hS*TrΘs]mwg[jjsh}hVwGU#>t\v\t3=6~!DO5X:enDahAر~}G_Y_--|{_zWv;=6C0`l0  vT eFjRۀ-4brTXOX'A% `yZRD+T 1/x>tBi^gѵODer;=Rr0}pn{۾]}ùo)m6|x4M B?>d SnS\Df}{2nq$,-uN"ny=i fߐtƴyVgc{9n<נՆuBD-&wY~`sMG]0MxC\ tÀzP"zdl ]mh-K?zPVS5iNdnMe]n2LhM֕{IY0>-9(BwR:t|iczǞx<̴{fDPu=vA]u#J10Qp݃")U/p8k^<6"~X(4Bͺ ^e4nw;3?ŝ @wu4Ն3Ÿ,@)Wz4qƔ>}+* l7xe/v[}'pH ktq}sin|9Rͺl邪XuRu~s?~rgsB§~noo<}Ll7;.nt|7CMepTG?) Pt˾q;EOݢoJ)'C?&.;ZUWM4t{;< x~']Ś<^pB "MakI` {JVs9jL5ݺq7 h;f0 piYꞅP]Z3y}}oReX׏y}̋i#픸W3j#hKNن?-uR2`٠[殺!{JQhX2v[uPw?!\boa;(#\J1%<߂H#Jڻs9\96R0eF&GF{s1Gw|˷)y?wuu/] &\l{< ꓟ@!␒:Pr$;Cv r8nޛˈ\i$q1iFJZ}9iqs"b bD ]uۃ]?_ Ri&\~)i1MQK:t$IJkSΣ|rD99`rx̸=+`f¸mp|?ͳ]wj`RWʑV<"f\' {ooo7|[2`}>;MWwC!}wuLJd6%;@kІ{i%э@?euHA`gV@)bɡ2R=p%ZzNܞkॽYJ C1D<e/V,㌒2JQxbLكE|.@*MtD,E5EI%ItM=*Z2_ߛ[s`롯gfA^;tT[d4n}? KFLqBiQsA] K\ Ґ 挐.( ʄNU!^WY4:mQm*t4b8pUr(T1QbD\+gPr;°O- 62G-ĄәG8plq n"myເUY⫶O?Etss߾Mg#o >sG Ci,U׽At}8MT@u5 u]/ Ӓpf %E{N:gIGud{~Yz8jWyFδg^Nr_{΃ YsG~]YZ}ZvwgPnC*r|wl-+.mk#Q{ $MN漦`k5U _QpPkfΣo)NP\Pt]3\p3!u 8#e<f/~ ZC^  n3<g-"RyN`:x rɃhĐ tc{̧XtFNt}l[qA>`m19p8#<„# 3Xx56à @`u Cfu\N.V5w-ሇ׏pss`jE/oB@A)rBa0s_dF .1: RZF'&a:d"' ; @FήXU yYtGe/W㝜5 h)uTP,6U`|W$ڻdm1s,8gx/N@ĔS bY,sǗjZf2zzmObห3ֳiywW* xL,eN?eUnu->(_k\"(u^X%f9}X:B<njAŔ 1z@7 ګR!h8pf-C8L8QꉞXcPByTmANU:V}2b04jӄ3""9txHICd %y/ǖ;]8MYW=)bN v xۡ0P@ !@#1 t%eSq=뜎xv؄N=߻n~R0$*J7./ûՒUv! 8@ⵣJ +NB>벙$1E vbl[.4ie ix['A+u<ֵD>^s~no~˾G_ds>nJ9n7t,ޕUսR{ش Բz|YەZQ;޴z rV=5R]HSVnn, gVkUzv~IbAN )Yt%)̋jޓ*9B豞_TNڇq啳$;$?wmgvƭߒclcv"1x";Hkăp+$TH}6fMB UKE SƜgTp|ʮs!N;y5jy1 #86uђm]T U#P`q?A9ꮝXzN5,w$"Q yl[<`mzmm}pJ/o{6 D<^zcIEEx{;봊0 1^ʒapH8v/.cbC:(f-S; ݠ{}ВsJ;U ]s[f ǃ&<51p=宊=bθXLc @5,90v Bm S%J'jWT@(Y/aӫ4_Տ O7qBDjcIHu'vs/mGvяWDA&L[<{]QDWެJ|u0S-|J. ^!x5[ _1c<Q9&Yt!=z@|xb_? |iżs_K)ߑsʡr2G_Gf'8U]+iTJw|VɂIRsݴN3-!g`߯pܛOtO<[Ӕ t)*Ԥ>/ΦkfFOJU= ; ݀F/ )Ƽh lfòdgֆ:;t]x_[B߿NZk&$RKΝ|TǐP@Ù+S`:ޕn D+Cjt}F,F#]U5I(3d 1nj,RZap(B!<@{ V%r!t}iUGP$cP;Z D!\i&(jG:] %[i&Oo^»BR_RT(̀D6rtU݇f$]5(~iTMRݭqN"H1切±ԃ܃>)aG‹.lk_y1OƘtpvPR? ^G f2NE#*$'?rr:#qu}sðw8OHqB'Œ;6lUn+S;hWX[q jpo~:&%:>hҿwKIwRs#8a(KjU\}4e`Qf}ƧIz0CJ*"{8p]A-5enr"\G%.qvi0NGLq%XȒ% EɇM"U K"s- h֔K=n8-Q@=tDžakSF 49Z'"h弚GQYRwyi>xG#E,8=EG uY4l%D:ߡkqGIU]#{g N =4*#e8/ٻ`9_z>WDˤCD6}vAǗbt!=8G)?W /~ӛlxOO|e "zVJyM ju}y "A=C|u7K9.o!*Du FUMN+k"T7@םȵպZwaPQk9YSJjv3N_/ g<&+dV/S#.kK)x饗 ,[i[oo Ya-qKQ2;M84K4!1O,}沇juz߫@D8-sѱ^ۛVq&*\u-uL1c?Ç&u ܵm2e9@]$Ep8 s`_@+S?$@G8SS$[-pK]keA%iU!C.Gu"5R 6}2>S!8)"Q]*LR1BȞ14MZ :kkI5ȋBu}eB o:jR;2K =:pĈB`u**NhrH@ /-7Hwnqq:f|m7Qna G\6jJN퍪@Goy]ᫍp*QU$tKu:/D mX[Ev0`*WH#С lw ?ofr?ug[ku9R%gs{{HN_{n|?+s%?u]X3'xxIl;BkO<0qY6ߩAN[Bu˚,(ݵtp@!bJ@i~̋'NB4pri.M'}$R7"%=Zs;Cn,Z@hsu\Ɣ?,v2A Y۠(T0g,)#JsPs53&)T$Y}O<# -8x8pX #uP'ɔ VAPt$!KB3>BTG4Q)V8'{\__>+>C_k0iրs% BpqyaS1' À9jbO!8b<0tH)Fm%i_Sg2+3E[^M?Ӄٗ|ɫx<~8 3#@~tihz~:ϝ7?>|'↉?F Bm j]ubj#Cň-kt?ĻcD_z䢋rtU6Fh.n{ 7\PF.s1mC Ӽ0xl\ 8x/B7p !>a\?Ưx03 6eR a6 xkN]หUF =seN!o˚Հရk̳JII[h}k;`<z^=mNRΝ6[W>,.//qKbO@G.}2] >%g?ZH^ֳZ6>3Jp(nòrMYU'veY8=r%ͰvŰ ǂrn=3MS0NG b;g3^:ޠ "P.\gpq8q{cNiY?B%0~6 9" Y]&L](G<\19wW]xoa3?n^aym=͒uLϼsAY?lo?I| eLd{0l8s~{0cw>s]{>_NDnrmKLڦS%m a;N/h>'5}\)4Ͷ-[4F9!nˋL_N*jɋp{i%۟H)pg`B),h^k'=M#ruYjU(]^ZuqE,xL;x. Fc}T:!ñ䨶*qF\UW#sB)\nX#݉ؽ^r sMNd5UN#"tR3 .wxS̈́GG= WW8uI}#Ƅ"T6.9=~8)UNUe4YDh~=88Kw߼w4wyߵ\ϘJpeKm r#$࠳3kv3(P̸p1lxHf8!N#9%w`׳ =6.tp;dn!GG:w3q3q& E =ܻm Aw%pfxxdmB ex]8GO{\F.2j */# =& P pBz]w?/~[ >c~byVHf8ǘ^Tg=t xI؁2Qבcۛ?v{[~Û{_?3?WS~ 3cV <3)ѱGznGGqqqf=fSqNҨըuKr:+]Ej|uSw5"n .4ml]3ZR^8N_[R}TK %_ާUD աה/+~W*XcvkI -:"\B@BJ>P%^=>uR4WAvI؂EU#,y9_Uol1PJI-Eu- )[l|AN@>##4.f?Ycsp.`Nv 1④CYL@wn}Aû]g@"#\U[iJ8n8#qu>;>{ں[mryVye6U@L[$Z"X;mZޫm4M=}ze}oēv# `Z;K0W=A@jUL1N@.Bsч3:;Lq”^Ju6&cCqm|o4A6V)bg8b~TpQ;% ić=x}Si># 1gp@)ѣo~@q, sFz'xbu]%v Ř>>x~[ꇾ]];|}oXUa{W^=yD&" ][*ՕGsxuJ_g ُ4]|۾rs _-oy>OMWWW#`JOLzҪ9/zq!`ݡHA37\tư>x8b<%CI-sҮSl(wFpu7:- CN56#*@z4?yMmVA3W3 t 0HKBj*"B@Qg׸skӪ>%N[{Hs)%t14X}rSL rfĀu#,Z%AՖCvAYiEopqoSL𾇈CG)cEM!Hur^#@!>˜uM.Ց] "maHءlKvW:R\]6p;!u  } r\<Ĩ> 52VNJM}bq-ڮp1l6Bp=50gnFm]~.YG@%޷9g\__/.DtJ3{b&_Ϭ+kZgޝ?4".x{UX _Jhdnnpaz;3-u;\ l:%RBfo1\m*j .[쮮pyJt"3plJr<x#^^Sհѓ;P k/8T232cO9b dCI@\x1l0'oxtE`a%ܻ{|?xw@R˟ysqGv{Ø?x ?_\^_/M^y_^\v~S;y)jTǰ{GJ-j)4"R8`.B]dzy%G`JW/}}ǟ~/Ͱ{PSPCi:9vCD");|<<ψH6ޡB* 3$8-O:yKF6];q UaXnѸa@Gd$e 3^YVbW [-9 u}?_[ ZVs*^= ă1fq<=no=v\_˖& Pu !e}'i=noo1GĘZ.&RC-p$ɪR %˵Vbrd L}DE/:\iV:-D,bWXMPPP dF):k.Ij5GwL&TRDI8.?SDfWVAPcﻥbn{BP"KϾJyk:j@b-˒z@51o㙦(--ؠg'EJu]|<Cܜ}>ڿIkOJuv܂tae}ZH)/gpyq]N-m&) ¶q:{0lG\__y&H'ܲĨmk+4:”X<}QUOӄ8f8yasY7Ǜ[q2%@DxKjѭ$m8asj_bFqs-5qo'ى9WKږh{tM™YGcK Pnw?ţGzj?_s^gmIKEP1tNp8G|E;hX̒bps|lW@13,LTyj~:駷KD8,L5+ڦe(`yUY"G`Ȣ}:Ĩv{ak9 H=CsC$6 [uzEiHQw:vnpN]cjKǺA"~}<Ђ"- kӬ,hq_5moZ"N{tWFA\SD* 1/}7mewgZq՗@6n$8.S6D""^ۺ|xWb3Z,$Ywm׹M^] opB#\߂NUn%yeIEY_tr`=a&FG詧TT &=F,'H=rl/. 1nCq/y&+MU;c#[ sFN3^N=z xyr\fp b@/_ЋZag<;aq~6<}Ç`q*,9wp8=Oz¶u<|Gn{Y]QGpXb1rn4Oz#IAFyZN'ڇ^Cazla 0 =Yuޣ+8ZM >VZ%"8%‰;" Ep7 g$$)5qD[pAE@VrF& _NOYWV'EPH7SuٻȜתTί&`Y M8,wCz"j apm4sJtV{^Hi jU`\euNp8, ɺ)@' @".*UhBģd]+uX D@AUc#5!5J^e*o{n+{T.FNSDq˜Cȩa s0Rt [+1 nwԀӺT52C?m$GKlVUVVOt3= A~!)??I $ggH6{fШ+p٢?U7< Hkz}oq w]DP.'s}!?|&Y%X &F9@9$:ipLhd:qJb)03Nz#]t3cΌi޹\L3aKk#iRL9% ˅3"&(ĦLXTepy[6<)QY3F@JHD~Z)*F˂'D7Lu1fn< \p#P4͈]]U h5L/O'y^}?͆DQg>RG͏#>3SֶƟFQUͫWÄkCJsL^FQoY~[l%w+no_6-w=|7aO[D޽sub]4iip .@bJȲ}5oEU]~5 C8S{/'I;(ֽʯOh,夘H:cx3U>N/@)x&3J3$dBnnXC Cph26^`n*ly>>yD'?Uzt>d݅Wժ!L}<#}?Ū>1NJW/s#AbCSYל'&?a!YÉ (h Y:8B$穛JtJJhRsV'1edX!F;$ 1D*GŀrHZ2CJq4bPeΞgW',w10XjD8R<㌴TgF:^P$5evԦB `< lv"L*!D KV>ƈ 8muE)χ=gRHEI1?Ws67$wTFec" G>5o^ru;^櫗?G? *o_w1nP~ps΍O>ODе'9EGVW_o_w\ml2iʩ< Q4`Ĕ6rusJ B1 & ɐ(]M4crx(US,@qOя(q1Q6Ok10!?lmCR!̋[ hN=䡚|bn0:ptpND4)BB=F[&(Ӷ'Y5aGȘaR$I<>A6<^NcJm I/I}c"&kt8\d>AlYPja XC}qi J3H&쩦Bh(I)Vy="!bHIDCA +@ӌcP)1y)[5㢌2{8ʿS&'^x7SI#h]:DVH!Q\lIZUUѦn;GZM9GMM4l/Nx wU]SU'Iz'8д5MSa+C+JԆJ'b!x=.?^(`Xc$z}łakN6LX۲ݼ .ᱢJl6Z)Q떨40) 'vJR 8N⡫:O?*alf |4r_I)kdw, 쭦RVURJK̯7V g\E`B,*( HɶiۖV0!dN_:CԙmS('z%iQ2e)T6Π! mnŶjwbJ\fU +Q%nrR?e k;$-IE[O7'D3HH?|hgxbH#i8y~?0ܝ0p޼Ua _/?O^)E޽ĹȤU'+^uRPQ5Lz4ld{k $/ 91)a]=}C;–[ԺhoIU [55ɸVkZr.}s%bReŌytemET#!-^pJ#+a8,LuBR11 SqN횺MIHvp8q8LjM-$.ODĖT4ж*sC8rzZ? QX @$6&SBE&DZ! [)D?2; Q)8FYjFޡbM]QY&><~NNf&q=wd;-D8E|ćU( ]D?IXʍ\C15RD6uS!FYt)j* m{r7Ϭ)&\Dq8<*oںAMc+\1dCIƀ+*jCoh'L>=޳neDȱUJX& !v4prs{@-KKǺ߹!cl>T5خnr"QvM*GMSVl]ZuV+ޮJ>?H.>W3e%TZrBƳ̲.b>YUsiY+Dnxusêj $Rcp_^5-6CՖCq8Ib02$Jl-_r?NHp{4늗DQ`~=}'aO?M< ndRbt!D&& " W/\Cޡw$X^򊗟&fѻE!`9j5!rr6A.AC!|t<"W98)GXDYt[mÌa2$e]V0AH\ ^6~c1Fӫˇz޴dZ5 NY`P4M=EftFR?P7u9Z'i% E!ϖCo%b?! 0&J!RitcBtO#C?P Īm :8&χ}R;HAG(s "Cb0Lqf}f<3$gڥWW GҔ8MQ5YZm8nA*a'#0TF ns8oT6m-&%pa8:gJh0慴b"Tk*$J:a01͋RJ(bL !G:%A*MVZbĸwD01wR (ꆮ{Lc+(MxMu,B/Ƙ9 pIS:Rչ]&S-Xiڲ /Bc5mtJ֠MM-7+'bIUZ3M^Nh8s0QϢ>e X4Jby?+݂^r`9ϕ|ņ7e/蒽=q |%XexLz]Wb׬+T3#cq~&J,\3Վng*+1RZRM.:ыH!1i;IX:%D%ZyRY5@v8Qx 2_H8ui+sd7qnd8 <>$Jq:cYb $mҢgvp {ncyM7_,B}-Zkj]KHl/CR@ PL "?pwPĆa1>M,> iƴ.6ʛ) x$M,x%x8B_&fêjhTTF3qlKNfZ1M2o~I,N]\o(|rDf,&IK>VKk~B,v(+_03tǑ mr~n:*Fy臣T7I`mN1M aլ-MwyCʧPnORVZzuMk舓grZVNUUcrk0[Pտv)4"1dv}Gbv$*x]ٺFűRXFk|3xėj5?S1KyTM%6u1 Vm,j^Hb[Ez[7w~Q,"]aׁHeCRU;Yҿ^) 6Y!YWAЏ(A ZfViuvjaZU5/߼͛0'?]YoЪA# s!z "2Fly:2S1OmҮV4 *b$}i:C4({Ԗժ-xʝ^ݭUkyP` M(a?[b|Y$g[N xl(GnC<^AZÉ~)[Jc X4kRW`1 JCpF:㰺[4H\qn2d1ZB+k;l6h`Ym"Уr1-vegM]Yn7IQ{)&Qa'p3a.lMgRy;Hڵ௕5'9PR,e,_Nf]tJ\r/saBKBՇDݹ,dBjdy41hjt2Z4,YqE ƑajV#) UseȬgvJ U zkd3Me8dX+UMfsp8f4Ju9و1 T.l+Dle*/vs+hjst(:R|lb'sG31=mtMtJNLD1B)=.DbP(D(ҥ $B`+RA@OtI>al*am|oIYY~1d`;Z@eS@{91f=|xe,l T3jqP_oD.ldP"e/?_SJL6~n}Eu [W^H;h?H[Vk[Q+êiش+Voyju0"v>028ۍω-*?,\ˮ%,B1a#m 9!dYe1M^X0NGN~yveZ-ۇF[4#7QJS"'_ۗ/GvG{\$8F5tn(?L%U03e?h`u %;)2~/`ZB⥏Œ1Ԋ6:b49QKq@j-MUC}s<1+īkn uR*9-%Sq"09'-v&|EOFŠ^-΋HejW41^EOEP%!bM5jI^N(aj!g(~1&Q5S)و VD8 <fV8 ,wM c$^ͼn1}*ؕXBZu`s"a5$ PVcuɖ".xBXjEE;0hQ1{O|J $*&qL(c#3|L;CʡF:*41(6aџ T[Uq"tI ۫+M4jvaDń- $&ٟ; KBE\Y4p=K-ecmO] VFu=BB*j+su ͯnnthjlP`RMpL[i+e ÉK5Y6|:t:8N _V?#KW-޾0C:+wݬV4FUL'9{D%nrt{n_[t)_R(rۖ>AtxbZz#,w ޿t:s"MmdB-L۴AJ)LˑÈ-rzFI=?KG|h 4VS隇2ǐۏa3bY< CЮWUCV 'qHWu-Q-E/^Iv,zdUhdVxZNb^Pf+Dlm.DgL qsZ[֫Օl%ADe#'AI6runYXh U<PFV]mڌ.$Qe9ꪦnl/n{эn?vݭrI}b= |8V'AtJI%&/}m*{$ԶmtvCT8"RE2e,BgOr sZJ|UU'|B ܘx-Ziď2TJ4tBZ\ϹqU2fwiKoJg|oh4ZG=Gc?%'[WBtTJƢYc4SxC]2NLDBFli ]W: Cp!:lW`Th)I9i P% XXgI [SW5X# qO }nxz\𬣡K&GqxPlg&S$Ҕ ש*;; ,=[ִ![^m^r888I[PiVLp2q)"!k8Z8Mitln_śOxuu6o%St veHiJ$L$SފEh>r<Y3TXfGW_OZg4z6-oZXSkQ]oï~W/bnnnox%WW"&,?5?-ravWk>?#ZcȠ"ļ(Uu5כ-Zk=j;'ɪ8{4^6NicXTU5kQPpЋ2DcIl߿WBKw㹐@[d,-g&Be/cPqicνvO'G,Z=MT9=.ʏUsKeҲcUMսdhb)V3xph![,T֢X'emXv.#"DsL( 9L.4yKXfwp9[m6#|tͳA&bp;C0J,V~W-㑿Rيk/yáO^26k1"f޸b'vǬ+zM7 Mc:LLŧǫSc̶!6ZLOޡPGN1Dl%Y$plQVJozt"D'Ǭlu]2͹4TiBcwKmG݈VJhnɦ|PXtʌ.D'*'"O։T٬l׬5*8E)Rᣱ[*gU0 g@ s Q# >gѲXz"BN)NFaS Z9o&6$U͛hqL~D8I®6%;dC;;gq_iO>]s.:*Y1LenϑY0' ukDQ4!,O(B`%l{V[nꆺnrFE ҕb% Jf(l_]9A٥cr(U:'ppЏ1!0d6d%n{BImJ[8Q$Z+O!<5\nmT:Ae/{t4E@=#eN筲*x97G8y*7dY4OIAr4J0& +[gBi8?bdsͳq$rݯ1>mזʨ.=4Iܥ6)8J,J-QtAa)px,JI<9>9%/>5pDzEU-0|-G^]rs}v LӠ-jA)fU/0.͊p9AI۬=Ӊq0vwo޼577WG[~q}?\󦦲5U+9?nw-^l#;Nqx:喟YUUQ/R0HP\X,c8&?Q[ 1I[]cBi^HLc+THǞy16'hZHV[ϧ}cu-3쭡*GljqrAyZ6U%'!@-pek,MhG OY'*5ۭLc"E|?aFh":SܔxIa{08E9>9((olrRBA8SAy82N#MehUFg!Wq@ 9~^[D.(_SnKk2ʺQO%5Ul7[c,|ȫWʰ7wo?o~awd~8nt+ݖ,۽='1Zbc]Utrd3(˳+ceFkʃBupaqWVbYQH"8 9?ИFK1_31 VWڶDߟhm RVl.< ǻ?H6a"%u۰na1&l]^ʹ-PJ"+Qҭ1Fasv>m)]G]ee-N9.l}3G(qZ@S \f%?[sLr>"yQؤe n܆WJ*$ 稂N|Z^b\jP^g̐&lE,x\2:S#H\1fD@ߤ|6mTiu% ÃvcG}߳Yo6+UKvTxl[LR-BgXD?24flf QQxۺF7?ww-aH@ۄ.rz>|q&py.TֆmhWMR }~2b"> Otb)߼(.Eٛ, !SėQXNKcZة[A!,*傗WR.5!MI{+,<ɉ1D HGpvձnb+1xRX:j! RkYu1MYtR!}xx||:no_kgo{G W /^rrz pdq4JZz|O'YxgܩRɛ C@P'1:BS0ivf,A1Mqdq]({vTMۡ* >8Ns1a8?aM49qa g2U'%9GFi-hŻoE$f{GIc RT*}bi Cc?ʉ)vfe<hچnձެYo֒Unr{ JIh h3LE 2:8/MS^_QZJΊzWZ 2~J8*' \{8fy}EGytt.^?bfS2C.pJYT^bu& M|R2r 0oYkgQ4L$'+HtIml0D*eE!EJqLDS.Q(]O2ImFegР!R)I 9]T!b$i<3>|_d3t*Ur2xGֳVftEYnrLs9'x-=0;dmVfFFY^1jbsIXEQd aOyV:7J” Gt "Humk)L%VW/e=xvbr*ʞ9 ev'JGU;x 0 u@!!y?9h+>t"ɂ,+۱?q&G:dDGs}Jۚ#(D RVS,Ӥef''Ԙl:+81Ɖi :Bq~ [c8cpvؗBn|ut8r: QjUC/窪gRヴ(̞uMKPfiN'¦yV+2wB H@3Nx;"K L =;X$ͮ^6& Mɔf8Π8_;D5h[&p1&cQaum2x4FٳiR |*)XusQ9 ?JP+M6sg,>zTT_.;xr;cX]-7{59KaxCJh|Ƙ9D_5N <?< B2 QZi!Mi .qkɒ彣:ڮJ8MJS|QJ\Lԭ٪|ILJNu] zlı![n_@i"NS]jؙa)CDmdDidI|C~ddgcd XVhSb8 )L$6kꦙy(!8qL#Q| SkABˬ:?|d&ڮJsMnG‘BTz(jhD$gZha?IuFBT"B$FN8"[D)~MsU)l]a(i臞>ZLeqSJtUm-1TZDbOv{ffs%@4yv|:l4xHN iN I+)A%o#oAڶQKrQ*%*QYT28a>)mr%V6#-3Siy'Ѹmخ |+V]O_~gX9Jwߢ]|5o㇙,Dx~xbխF,T*٤ψ O!U ' 8SN"c"$b|f,1f`gTɛKЈRMд6v,JXؘ\J>;1R%ADDZ$=ߗ44e,1%&$L tDq/Ĥ 3JRiRNK$(e.7EqFepi$CH4Ҹ.^zkd3{&` eEm1E)'io4w1}zS؆qٿ>puskV~O>4l2FBʉъjڍDb4mN{C4U00I>V5ݵxI "%=ː *^6~a,(j7hmwLiZfMz6yĠ1lUƀgbceK򁊧Z/F)%Nm|DM>'+gzes0qTȠt֖i0Jx X[ݬ鮶TVxV#ex<> .O,Qi$]ʋR`~&Zcnl*"Za'\lYZN(eWN! 2R[ɟ -ɉm)Jя 9 eEPtb>DVFnS"xfSoiڎJTL (GU4X1X/*Bذ#8 SRѬ>xQhjfN$c| !DXjǞG|**iYeV F6F\cbVZa"(KUul5 , 2];H#I0N +$Ȕ"Nl kCeh,VӐ7Ī<'DݘܡF|*JCb': c55ή8@lNˬl"k&8aS1F!0(]%l$m3K%Cދzδe뫴b|CŌ{Tg.{b"L2UIBΡG":1Vi0#Rp'4P6eVe.PZcuQrr^uV![O*2:WTgIfT͚ )D~_s5Z5Ifs-ן0Va&%nT-ڶ!>gHN*%/<80p_LnrѢ%$"^]q{/ft۷qs9o+_6/mBgT.MO1By(%=LiQ,b-yOt4/>#ZP*SY[gyODXqFHpPHp±j6Mh.3=A)O+53DWgiA5?$+WҗN*2Pǘnj&JX!Kc@h dL4e^WKҊik*jjױZ8.h<9Ug{B䝟mP5;BFɸH+ʨ4 3;(2AL 1HS#D/3BR:I}K7Y@b r.4!]Yp ڠ"Y7ipeiO)a $rC=$Db)Umdd.KCS,YEWgF}(`dt:ѣX+_~k>}[B{G^>{޽3~/oKY҉GݢR4zş~g{OSWx7pU_[QܲM0KoJk"VItǺ@&r텶ªfn qrO^"?OoFGLÁsD]tM'0N+6kViWnYy|xd8LJ S+!&ii[c4 jI^J.3¥rq={6 zP̧ы$|y]nDx/u}&:]u>Ctr:ֆ^ZuȻ94mWA{l.7c^.3/ LR >E,kzE{2QAEDt\RB %ʨme<9R6}mn| jmg+0Zc" Ts/|&5U M`*wp h CsN"Y"yoL陧2itZͧb;;sW`_vvLnbծtMv02ѝrGX ^KٚYƨl,G&&$lTf+ڍ%h. S:eev^v9/e{Kk2Du|mVETd0@КxqsÛׯhyÎ>ҁ'+EPD eLf+z&n4 ÁjhOOOXNSM<0LSiegت{!y]R#˸ȵ2V60F̈́<"i?!^v/v叏dI9x=-nuQ ??8Zhl8AZ_}Ցuj}T& : f7e@$T9pC\l\2FBR!GGަ8<N=݉:F5?y5͚~=gu|L~\HJ8<H^ӮֶܾzIt?pW\R.#0ɼn( M\p`-/C-O]ډbiv&RgKկ!87PO&0jy>X#Ƨ'=+,^j}\e!q̊gPh UFh=duAN&CpiFcidS1 P!wa19w-c<7JkGH>`9ێU#R4LqwK޼zOqF:6mc{?w5^z'_qlO=mmN;wt;NqJjհkTN";]敗~f]_/Os0Þg_dQbA1bpU6*r?3GUUJWE_6Uyu(cэ81=AZM[᣸[p^ŠPٖ3T>G>!DljftA|Şó]'Ey)s/>o-;{($ɘXgύ g2QjQmk qVM-bIuBNev˪#m5جx5 A[Þy;j[q<H{65v߰;y=T+^-蹺~&N+{O/'j{]vF?QM-6Մ f\ϝ%{^.De7LM,9JJÇsK>7 ٙ7_2#+U*п<_v%cbQj'1%EOa5UeiMd<4'euykwVN-sb|N`8L:O,Eϧ-}P_%1[0Lc ղʙ䎃Z+eEr2OCeF'^(^yg5_;}bR9-5'J6L15I|{9ɸ4\l3??Պ+֫5* GC)C]WC?B16)qs3,~~4 /^x2t+e"뒌ACB는|6~D%\LR y<>J語[sy^KsKQP/Zˢ>n͟ģlJۄz^qu}="<1YnU3'XZH2 ü(]CV6mŪ~w{{^zC]׼{]k =yÛOV-/~_w;{;ܤY8\߼^5͚W_5[®*? 1w|o8|h?0Iskԣmo.Aʥz9 z蜫s(xF/Oְ扈PŌXFmv3(:ڶp8vsG,g>fF[4i'?6 ,rD8O sv4¤#t`xkVպjt e9k9çEk^_=D%%F'Bjܝ;ܨ4Jb^^K 9Zگ_NqE"\c3{$CRBTuEX\qu4=6DwIr:b{=%{R`%s{MK]vq1Z5U/fY.*a}ykf:ΖY Z*zf%(x\25J4M98kqϝ.@YC`qLv5ǹ&Ɓa:i:I,tpS "/Yf<OrRZ\Ny~E8wpD3.]Ipt,oe;OʗXX[B; g_7y.Q@)%2{uŮI :|q6b"Mh$lٓ<@j+4WÞxu';cOBѶ8FxKSմۚ~<SkF-ow'㫯77|ܟᛇ_"_noư 9|>;v~_|ُqwWU?xg-W[^^GJ)8q:PJZIf Yc]SL)T28dYH,NP!yKRSAL4~ﹻ{|!*z^XK^J2, t% =^zć[:-Ra9:(U+olI bbqRC︽ž"Mk(`CDb7qhUӅ𧜾%\?W)DG 8?!h~SFql)ypN+k8Pp7ji)*V(6eb8:;TdX;Es<D4%x:9lw9F:2LӈwVUT5}܈J/hpm9aBHb[*M<OBRtϢFX"J5Ox%(Ç#>?M"ېc/T%PHK=M#QDWVm ڶAٖIA}MDä'E=c&i:^Mpj*{~(PT~3JQ;o|VT` IΞcd+#!3au&5})z$ t˚QKy2;! eA]\`HODjFJ%FI_~-)1ĤAW]|ZiVƘF=je1hc0@g Ux:皫\}f9fԡ+#n_qIq8x|xnwp*N]ŪkGչ+bYP&b5ƔfP@mբD /Nϝ0 s%\Yk7 L3f9Ii.y,߻.'9lgO|^ c$ )kf0g2`hKU׿|.\]%‚de2GqlHT8' VU0Lsi5(U_|jM~_@" no8N7E65U0Wk6|߿͏W+1Mu+V ?waOcȏ~c~$%۷w%axx|vt]M6~E?dS\/Yk& P(Мn}ib5WkiƣhivC6V[Pc %CDx[Ŧ=>,ԅW!YZ=dqYZf.CRUUM]Mkl+N$$x9I.RUr$jQBa^6ʺҦe=&6''.EW-ʂ!x|"RTxU>E+{[Fu]C-2#NeKgA({fkK"Pk i 43n"&G g"*8ۮq: I)ΝVPBVkLk%zl%pxHc?0^:YDUdm)W_)qO|uT7MlK\G=uc~q*u 3M3qYͶCz -֗,省/٧m8?6y^s{ja(SC-_HIf̙pN!\\:*-iQ,jۖYqW\_oGnnK^~O~y-^m¹0঑Gf;MϿO?e&3W?7__7uUQ[خ_Ь,|[޾}ϾS_=77Lķ|0<>>-|ן|B\]7$ Bڅ=uq~BXlQ.23ysIy[ KE}9=ki4Ml\AxUUlhƼ\J9֥p9sv趄}\t_*t:ˮ¬ -mSK^qO?8__hvYlaO 9?xY-gA(B>,Rge 7CY̬(wuQA4FfRL,!e=~x9_Z~2o5:x >Hbϕt{9%1]֩ ;gZ{:ޗE9;ÏtbNRU c|uN4MEuf>c|qbU5t]Kۮh.| M:tNIi9N,upf Իy #Jg`bZݮjw}KUUXw9{ *pȿ[vݞ_|& S/e}հy ͆}#]鎷orqs}4S?ky|I`8ԍ`BEJҒ"DYaUZAY~FVK,s𲰖Sf/.8N}? ն-۫-Sϲ_Y_R5!)y ɦ,-9(>fܼ>PwHm&gj^zϾSmկ~P{1tE dFTs,̜EQFpr͗6\ v,Y6?$sg/G+ZWSč=jhZEmsQՠ8'#"k;ǰח\ea:#4fa0in>",.ݻ?t.mmJsF)QLDɿ6JbހB` ѧ\5?41VT砚GtnOʿv??͛7\]]3M!rwa;<g_/ſz붌;sݻlWͧ_s7}gAL;|[ ~/Q7Xkx?4;i-iG؏hfh%<ĿJJbK!,oװܠfxuAI-$<&3vV90QlY'&\$Z`&3DI.%[R8_Z+ﹸd.\{4 Au]R5<[mί*-BrM ix܍Մ(T?+ڶa^ͬ襦&kbJ,(=NÈ*B 8 Y:l7+nfN,ϳmi4Nyx'ڷϟsuʿNZ0Kr-z[Q>s0{JMx[-߿D=x"vq*7ܚkNStkM>닂]J="/S?D+üyt hy3.u]Qf>]m~5F%.'Cc^r[._s!FZW-:){bmb<%g 4)\Ϣt/e6n::u~Fгh9V*3s{⚺RJiWt ]`],;)k(P0 ~lu]^ 0|#n:?rcb|NlZQU&՚Zl}t],>))J6Çi(⻘YVU.8nj%|MSs8p~j-]{n;mװٮn4L>Im[͚Dxe-֚䟎.E+\]yCsAvi]ŻC){ٹmeMg"i.m劋3ALK~0et9~.[| C Ld-" #d/ `²^lИ+R\_x||4u-8pw=ong5?O7濥? LqO nYXSb<Ϙp$uf5nxTGQ5PgzɅ>򦖇i~~(/ˇ< :I`Ez_n4K^ P9 T˜Jq[˂rw9o\>}pׯO~KìF LnVKsT3좶| m YO#VN4b':fZ] p 892K uz֒8QnE2u("eAu+iM).0y~:=q(0Qދ]65͚nZ]66|г^5T|Ei!rOA2vݽL3l'\+Xi6jWH|\hK&?ޝXMl(GSdz:9ȹ5.4h"qrmHj-qjrޠb;qjKU5TV~㎺<<!!N{z**koo}~w$xx/mEx|uVH@Hl֒AF}V-m+_~}]N z<R?c9DW n0/^}IdƥN;caCbI(-c$Z6ҭRflZ޹lsfEmPU5mV*5N#ԕFͤkW-JUs.g  +i_|v.G2~K@W؄'UUie̠jap}}z9OLSZKe-NԎLct9fa 8x z!Q:v͖z=o8#SqX*ht-n<]xad =q(tr1gdW5 i[5 !|x]."2xCs{ɅG2BSK XFNQ0ർ~cs<@uY~{չ3hʎ+'29\>'h;-fyĘ-enrKqSg"ǤL-̋_G15:g<^v$t+agυ{ίY͝bgTTr Ȱ"(J Iys,)'xIKPegAh1cƫ*b\_0wk,[N}ϯcm~w[g_h4mT? Ç;NSOLH&_e_ /_p'Wn8n:߲=--g?1?mU5^>{ 1כ[~oi/hT>q8?HTR jOJy,:KeW%]!(XJUyjħ 4Mb]>.S+$T8?h2dH<cR@m2 !<OHTl0MwWKjEYu5va1aqHh+jk+TK%L$CxRĹK zܧYt 953S,2I4h[F61L "O哿A3fbNRg~іnṼgh-mWajbSi x'bڎ#]:*R@J da-U]Mx:p 0etKT""iOȴqrǘGw]QY=SUm-Á] ]-&s\bT$@GN^,!zʠu@;|3pըh\,-1(WXiQ7RDqd?vI_|z(^mk;PxET;G@M3?#D=K R<"'~*:<դġ*ЉAT"33zn+|V}/a a}}_c ;v=9~ѴkGJHݻ6'O=ܾ櫯?+A349Wo?buV1 jcҷ{jNȯ w $nۚO7-կhږO){ׯ^5g͖$י({DϐY# @LMlA-kvM-]=uJfRA$mM(j3ϸ<{GJց%*sko}>Ǜ61kB0O/ps}5?Ox7ٙ_ /\6/LfӡkB:?D҈ m "L z<ZU;1؅#E_$m fcumIl]osPs٩7WI>H{*+)!d% Dm9Br,A9RvG7eᰏ1zC;MǏm[;y:hp8q{s[83;Y{;ou;<:gy?Gᨱ;#|} >׸ Ghv_fᄿog7MF{!}Mwwxoqssa?gJj dWW/^\w՗O>gO S ~/vhk:hhcN NWIs5?8g>?zfhf[1c">QJ'EJw skۢpE7 JD87Rh֫j_|>3ϟkOyjN?ythyU?߶ '2y@PV*jsT_WchO~hm"$ p"8'^clkxu\p: 80l-gZ_%T)Z<~|va8>v#!xyߎ\F_x:b>'\XB'2Ȝ# rⲚP6Ra\:rVx|ـ"V]3X%ݑ9̀ _#MiJ‰5gY^_#؇"C*tFעGoo߆R}GR=~_^`q%{}x}Vl}{Bp=nWFc?6i4N''S fB7GkO[oJ\>7Gxq#z]|?n+'g=^"E_|%F{׶=ö8_%v[?۝ww{KJ3(UIaUdHPw/qyy3tmx]/ CrEbp *}C7pHS)җ ^݄ym?///< xuJ 0h91 8Xt]uWV$I⊜NNլI{vD$T|v̹0oS} zc1oU?K98Ai+A.ћ˒o*;( "jPbNBD! p`m8=|m< 4%or!C/3|,śMri͌1ᑅUؿ y];}5'}_|C =Ə~#o/?ǟw..ΠEiq~v2sÿG88?> _?9v;?cQ;\\\;ogOO~c|ǸZcU{?ial TdK}ۦq*!p-~t bHÅdJ"M$BAx<=#kZvJ7VD H] `Rd<9%loI˄aQҵkas6RZtM %`:~cӜk|?^/_0l6 <@}Ĝ#~!%0NN0TcJ*O%./.C+Ƕm6>60 [[xz]{xc{07~Zn;]%vG o [<{5~D=iLÞ+Wߠ~>N#nop}u_~Ai>?p~~5^<k?o>}_~s<~k?u؝maihR.0SIkIaS\ዎ`p.CsהT=GfoH>җQ!~yyODrISVuz$ hFEM:DdXZ 4$9;X!ӯ~ß_ѿB4?^?i)xM!JmU4qhtpV.qW y3a2Bkۛ[^]Cksx5H6TwwwIt'ሻ0fӠs0v1=޳D)O^T{1s)%9~ihc!Z >b0!C5t-dLA *B>[#B\孮ҙ_/_7yeʓ}?R %.gzV<Қ  ֢?&zjL#4`m {ҏxrEm)A_Y9,/C~Nvt +%oZtj3`pb ,>#|u%^^{WWO58 o?{Omz<~xq5{8eO`)Cv;ˋ3\_A=wGo-mvbaW>DWf/0hs*?xGq~_?oovs)| 70) ZA&TڗS$Jwz>\'Nqᒒ'+^ 'o͞g V3r84GdFnw7?sl7hggxwZ>l-'c~HRJ8I{WYOvr&-<1iQ 鞟_|mRp8 G6N=o[ъZ H}/I}'T2w/U44 C?8_hw!7i<9r0'o6EY[ގ 8gp+Sʗukb69_x@=F'׈:/.6 O|P\QZB0n4D9 P`t`R$@d%|!JC BqJFwcl؟ҳ8{m=tn4Oy %;Xmqw{7/ |էx4[<=~?Oۺs8'䵧nw=w'O~)>cX~P5xg/?~<`{=]<~-6+ o~?/ Zx1>f;ZIoqi5+ܠg=kYbSuXfuم $Eİ1FiYL(Wih%M0ua_ȫ֘y)x .^x o_pq - d[Wǣ6$e$d'^im%ny|灅3)qwU<~GaAz=08{haJiɐ}S?!}hTlH$h"qh(OU䬷mZmG F[ W 뉘 W9m A`)0䤔rO %yM!LK~Kyrh(^`ɣDojĢD9Hѱ u$믩-Af%/IAcB"㟽1--~wW˯%..t-  }pOkpmNqMc#ގlde۠%9 k ޘRϝ&'Yu ".7B:Z5^\2HIG2AĉH#/zƲ^%)::}v/ 5Ə*%ѵ-N}1z~w;`[{pۧJx8ǣKCђJk0BM#ٶǽ.TMm4p-9gn-t' R']J u -Lpd$e훝Tޙ/9ɲ ĔEG=4?)RZJ<e^w21A"ls3|żH~4 bs1)^bH,^YHcTrl H5 GY GFk=ڨ6G8f? ShMAK;piB vR^ޏq5=\ߢ | +l[S-K| ww0Rb{axo^/gzk]*]0rp8#>(\@^ IUZx5@vtK֫_kB:_IIm;gz&Qe ʆAI*%nV5s-`޷F:*C gV6>zyUTT([]'K~ӹߍ&rAXAKc2&Ҕ/Z 瀘,s JK_f\R8&d2lZń$DKw JJ FR=^[ mp.Nk vݦà5iH/w'''8 /SȦo{{x3_?y??ŏ~C1~~O7M^;l/fA_u&=;;T Sr?1:x"W/! 5ڨxelۄ<9ؐ$ I: /ۉ(B3R8@ 0BwRCB)FF#~jXv0u^dINߦ6D8H^(@4=Q@%V|o[,3;}ך-sDs<}4T' >h2nx;J=ܽUS:~+tp?4zġ [( CrB2X("in>uHD pRȮl6LPoJ) Q0.>sc 0 &.(bt Ld5c6 ILU$061=)GbFAIט5j^ Y?TDkV8K'Mjuѷ3:O2:%`?k<Ǘp _D?hrl.$t-_(ƪ1GLdNUfwfN+^+0^sot`-6T&i38j<2giVQCo?תBIapg`"ԡ惄e`oMMst(xE-@.www! ء͋=_p8?C 4M__:wx ./~}~dzg?#g?ÿ??W_?ދ\^7߂~WCu޵F+=X4K*kѣGMM>}n lpE~Ԋ+sÞ鬒lؒs)NҊȆ]rV< 0(6 sZ0&B%;`ldS3cDWWWx>S\\\`w ..v Pa> s1xd.EWh4s%kn6x᝷O? }>}>W\O駟◿%~ӟ_??gBuO~ !?-58;;C*J6_!Gx46J(`x}Guۙz sg3[z?GamXtJW-!=Ϩy`k[1EC&/J-u"K%PQhD'ڍACHߏV$/z.G]]]LyMG|1`CD`KyC!Ɂ怯?)*bT#BG?sR|p"kh>s2T.K&XBۂ)cgi=U'PK<'CSp,dl4m:l6-zϪz ;(_\ֳm[OaY,x$ɐ wގ??෿׷Ѓݭw| >3<?]%~_/...ϟo毰lwsl[\^^@ެdwţGhY]YyS'o g~G}8gn?W7x} #q=8i0 '>+sW?j]PsI{(-KCRTA8)b4lOEMl!él:Wu nnnЅQVWB?ï7quuҴBj[:7bBSe,jayI[{v$S%[^A~s.Uz/ "$wbW+!6JI a0Q'%?s#Xo .(5`)hjk0μ7'(H6GQ< {J_<>N jЅ'OP(XyVk%43'gSeæ܋o {Sp2ԏ@lD}faYPPg\'U|Mvy a Ƌo_ǧ~#/)q:8'8Sn#JdƞjWxѣOwoGp8>G}pyqf+GH໿=oZk[w[[ MOCɹ[-*o[(b>hHfkxc:tY5[oD~*(yu6M3~[7770Q(xGflh +x<1_%Ø\4#<8U8SJ2Z J %WhmG9zSܥVV ۠mgs#G s«!fd}=Il6;cU9Yrt|dW͌õLW<`B|Z̜$_OI1>R{`GzB))It6-' lgggzIz8;az!#<T#G 0P,@ B>bh)AdRjq^c3s9*w5[h>kNHAjA P %+'A\ͦeF $g"!2o9+(ʚ .\%R%Ùi l8G’+y,'`c6h&s횤gNl6dh=Ϸ-2ƠO>џ?¬}v8{4Ņwk{@M+3/ʝaиlдTm^+ `е[ wރ/|? ~ƫӧ Npv[onqwmpb*9' J^t<?>s{\\\?wp l-~+o v/<\霟gRrAab!:춅 <,ch湝\rF6sU!=3Mvy?XLk-Fx$  m[= c joc?Tg6䒜HB@^{ $@QsLƒUN|DƊk|ypkW9_Mk;@XoNxc$/TGEnU{My'Dԧ! O {֐(R-ؾjTDgf?O $y37EԨADS\]j`#*e?GSJ5g-L\PV7'! |4FV~#Nb9k=[ov[(p}(,T1FߐR*|kvxcN'W3-ڦ{Nc+=Gϰm?S> ZǐR/>G'vx.N~_`ǓֳՔ-k?pOoѣGw !Dx o6/‹ϱt^VJh{\_Ɂ H‹vGMccrA{`SFmۦB$8 z3a狙!BxrƩ?mwIAxyrq clL`JqߒLb$9d0jy:BAvs>_\\ Ңk[-sӡm6!L$%h+߳ڞ[jr+a''*%.%A#oJxHS(M" G47ʢedҀNd>`u3| Nz̓?Oh?KOSFE/1׃}+ !1vB%3㛲h8FR>E2)E(N 4v^^&XQ.[9!2ڬ.$17:G&Y]v < VII1(:KsK H6. /:Hа&.96Q@[f_|>w $谣נv)NSׄMDyP}li{H9h}`#(y } ߃>:}>a}N$B^DxSi1߇Frqba0VP"KVVp`B4~, ?u~xgZDےn;!4r=kƨAD=T4U NUnN(=b .C# ޥ6I()Np$\D} '*ٿrY%3Xȉmk,C5H<ЛMV5pF>bLhs3 MH_h(YHtГ]y Sa8  xfl>G33&T0 2̈́T RO1%KrZ 4+ QZ,YDLR&u.7v؊¯~+|7 |7y @'aO3ҏ ܀> ;VCБbHkI qR bxG7xiJ*F&2f~?`õ rC,?T+. L0A 2ajǚ*QZ4}ʝȍtrnIZZ20J$%mbeF02 7CIfIdƩLy W9 {iߖLN:!A-xMx9Y|,tcFxkllTA0<0=O~ ?E|C=[:38@v߼ hx-E6]DY\:ܫd cRk9@ëx5N}LY n"HMٵ<#O3UŠ * ^q a_|/2-ßmbwM9$;ϘzAnFuJugu: iFap:./)%1$~h/Ŭ̸D\b I WE#Olz2i9Sd*-R+Jm0$Kx]Vd:Տr?d[Nasΰw 耗hޣz [B3=c%cZtT$2KP~DC.~9}qGOTH]2 6RvD>u\o\ȠNJy6H'´dZ`V0LqXlzMegD~`§Ϸ $pEz^&M! xQ/5ȗr&1pAz'}b$Y<tꓑ#6v>5bWE nd]t!!E+3ׁd.DS.SU$sIRSm˼]0G-= uS5QL=l 0&7p/L <{ߐŒz621}ZSsLs+o琊$ả!=Uzլd{5 Jl*%C^k u#)U̅L]R+KJ]SJ鋼m)d[^r)Gs\^&f6w)}>J+3gK.$͹_2hZpBjϪ칄CQҙ8^Pdao?GHb怱uC t2NC%`I"2h$'> oA8/(qc@NM),M@wx؂1Zrg'2;K&qd@?(sRPJ>ugPJ(TB^|M-kJA{yq粓"b,('U" KhAK?KUl_k#}9?lCK)M貿gzW^=(oeVjY&H澸J08kI5&TI@II9k\ŻJ{ZuZ~D@zH^٧Kr K壉 #RXp E %2㽔Z#|4WVf8b6IApiGvd&ZD^#Z+PZՌD5 h\b? ~0g6atdrmŒBŠ)DIq$+Kkkr2e xw7a=pv`ldR#YQp%(J5]`I^14HxSaj֘k+R|ٯ5_sKJLZUZSs_qZ/5?K#h99)qmS)͋ygcq aТe7篗'5Kڱl؄ID9q"!{TY WpUYk6_SGJKgK3 ? mwKH:qp%3:Д\j)Lz:ȐzV'Bh@pCu΋H dTȀ,0;un qwx?rO~ *|$ 6>g9poֆ'0B%K99C5L3L$h+M$jXX\AD\V1g5!HA,&iKU%3KJgR<Δ}{$VRgK3flA˿+) V^HLN!cSjWPBý=JH ksE̤ n"+͟e, "@ &j\-w /<肵yx9C$D筼L+|C"w:iF )()<:ԝQNFݣi;M&He @۵^bxSGcc*1z$: C?~ b恱g1jTan58(jm@k%{ϒdPċ݃#C ykFe994je|>Aa?0 uh\JIHFlJ m͊ʳ缺=8 Yjcͧ1:`5vQaq-mI L<6mTf!2J6m[M*j0r7;L&)cLlF&d%>?i/%(o1AŢP83|;i6q>oN.q$jIu䔾6V&njhˍ"+F-r݀I0= 8d55l!SCj[g':!G)Ȉ|Omlq ο >5#aMJH(O|hiՠPcÄFĈ̘-[+a O&Is^]wE[,& 9b Vi?nr~l|4TƃG"HI~}͟9Će=0vAG2gn ĆbL !YtATv08J |*Oru ޣ >7kgeUYFCx% CBB42ϜDA@Jz%-|=7Q r&-gK~ G8h;Z:;sXxr^X8 ܘ0̵s$Lִ9jz%Xl) @钄Xs!a 8jkjZN5{t EI Ip%5ˆETDVޘML9Q,)$1I(B(`$M\x_Sfϭk9۲ HJ%'EPKAg X#8p: @Hg&lp1y&Z42v\.Cs#@hP0Lq r8mq?G1l6 G g}WVtBƩwNd߹4q8\;?z ᶈbFÈL C =-%S OHoJ%y8'5ն1' }29j^ S"%B@x&yOvkQjOLSL|IHe. Foì bɿ\Xk$0iAYZͪ!!?+y XQ)2+)%MiҠm}% =wMLRF~jcn;J([B $\4`{= ~T8\=g-B$G{mQ#tMDL4)JckJΙy5r8'N^2-& pFxj8K-M$O4^r܈΍_E2[[@y!55{ieR?(ߨRMQYúhdRE^w€MfzPrL|$;<rnV>"}V>y>WA$= ?ɛR~,31 |/!"2<'k'v ƆJ~sAZkON,BZ@Fޣk)Xnfv@'ٺ B,I?|/ŖtԔΪwg6a O58+=IJSpkn rgŚ_c_RI5Bt@x>tQW!$GՍIhaD領\ Fae%Sڴ%!ͮA5vZ gV\T19U3z!rМ^Jt#K &5Y#q-ӌ(&J@+Jj`C5Ba#xxs$VX-1\JJgUr5QngiK1#1rxqq1-K dSCΜ}_ Pj0)=j prvja_2ʭYt.ZD!]Y.7|m7JvK"%׺RW& ],KU*d~~@jP|CkCLв~"_0a@*Uz EZQ @910];)fגZ%=)"4 1)\}[m9^#b5Ҽ^J؝m4y{*S שOlڐRAI6?ZȶALNU;Wkh&Jl)18o@J7Y*#r|_#,yQ9x~K܌D/H&Eag MC Q җG޽v-YPk]$燅sL6CD~+({W\B0? әi?`R%,hϹC pAHFI7:5Ӕ"k{+A%(K:0tג #qyrjDH0íBvAX*B.R"Rt8\&Xsc\˽ih`孪TSjU0+6^'Z[9ZuHU$9F\Qz!JB)eJ')&}4Me}pQ6H1)9"4ɋ)/V($M8 .;HGRJF%HctHZ:8B)oFmaCH虌60 c1rFl3m+@H$IJgRcsKRxx_ujs/#ğA5g҇b.7^_TrL$C|$2OXV`qI\oK,[K>m|-sxxx@ Oj7BN՛$@%:PHͰhRӚ ^wig򤵈Oe 鉔YZ zX6hLJ|O~D:b=;SP-&3*j2{3Y{=cϾ='{,o5)Ŵ)mo'bͭb V^C5&c6~ 5$ы?&-X;8Hɒ͐g PpE:^5>0XR,?1;*ؾ^\tTDq ^5IV4d!܊ڡu ~DRxϼG%9fgs)ڒYHJ|@+P"ot.I}ջrbҐ(4fD"Z%KId.k%of~s_-<(P} QjO|n;ܨ9 p՚ }+ J,lXj#/O5iK'oZǜRP< BJm$O-(Bڷgnumt0Бm _ĥI+M؍B4 QTUP~hF`Η Kq-V3X;ygΡ ],JBsUmߣ ПKcg+oq|wo9Q223 2߻5Zu& ds D4J* 5>Dt#sk %>R][x 1QQ8*s`͘5֜sXe2Ac XR)&n3}`^jӮV* M 1cIH)3{Ʉ)բm;(ՆJFZ6&M)%x6ъ9+-5 8+KUf9?}㥹N)%X;yC`!ݹ,^XTEJkˣQAѮFtK&A/2 P{VϚW<DҘ1h7[4,!}$PB9ZI\I4S lo",Y#(UJXed'ks1Q%B3S/:_+}IB~?Cb;mLǫ\)G6[e:!RU=w6׼Ĥ $u9kryuN!i *"̊Ogх0285Kj4ڶ0t1 wg^YlF:; F*JBy|b[2yC8j >(|D)å`'o;8ZSڸh>+s`%3:Te~(j?5ERD <9&NykN!%Ґ6ު)0($K.MIs= mɖ\KmRJ ySGX]@ 躮s7v˚P!3$*^DWU4`8!D6'~FX{pϺǫh\#O3#߇t[_#P>vI|Ot<*9+"T !<ёF&xp>3Agq;9h@ }7|sOYf7A]~1x:-{shœ\`_NbiT ^`Cs,є~G"9B^ `M:.ccB='_5O !I]|E ᠜k$}/)2X81Uh|`I"m>(` ,mfFbPuM,"57iDx<4/HP&Uu.K]Ak߃Ʒ=CJJh|.!8U[s!J BԸ7 ''&>;)іhCQ0ɟM'mu0>ۨym6 + iTR8^(D] `*n|'J`d`g 0]< !}ү؝A@~ cP#ay<LVCURB{uAKj"j=HRVE9ŧ@p@B@6 Z0-lz]\fBofzKL[~XUh(u:C2QL`qg)r\ں6VrH^YOqh=WDnL~@9R!B!ҨAG[=<A %\rJq[GQFmBѶK`Q1hZv8B<^z$2ZfKp8 RyQ1UqK!RG1y 8sȜ -&0~>!|bE:me1m"L :-ycjH d0>2!< +{|PCs86&Y!nߑV`mZ8|TӠ:G\SX $lh-heq363 ֦80XWbJ(( 8`ň2M]7dєbKs#q #KĨRR%0т*̈́ӿN8>>zBsr^>_kˉA@ UA>v[ƹ4u+ ;C۹6@^粫>(w\aж2n5|2)Jf<$ x ^rC'5Gu켰Vq |jKjhX(PPc$G c0{ᑩd%b&37BB Y bdC,8F4K@k$#:-Dᴅj|+ #ۺP;@WU1+@Մ28CAkk 5xuPu$kMN`H' NBqD~(Yc׈v   '`R z]^s:`q%pqq1Y39KbT# (3&v#.ت]h%p1 .>1d ߇4.'[ :The_(Ab"ن}֙j0>?gQhFWH%PpT1ك,vc4>Nq=}bMi Mjh-%b5*?늓3^L&Iń܎7x{j<7d6$%Y5꬟Fy1ET[ *NBtP?*1n.q~qv )=^C.Xݳ_ yxmGj^2 _+ |#sB3/b߻֣FWWz\!ޔtvs zXZ/4K˘s!.%9k80ycFxuYZy;bzHldhϟs$ M1e"KY, ڛSUq/i;~j\Z1dM@Bzy&ϿÍRּ}m|%9+ 1)9.ZK JCQ{9ԗ?ꘀPl-Pe]Қm",<$ Dpi܋]M c-ɁjmVD>6X 58fܰZi P  ;Kk$]Ty>>gsI0Lս~[ג'_]z M~+IsOaDbs=7V+Aqnaxxq00NKu=_:[6dbXBj~@`0: z o{]n m%Kv"Y͙輂˅Jh1<w:Pϸ>DjS:uɸ'j5IM:Y-.έ| 0פh:UMH-D GȤ&9FOBԩ4MZ;;Xg&Q4jkW',x>|ZEPLk-'rn9>>6{ 0 Ҩb&ۏ"T&rbb ܢ\HK)anf9q7! 8vCzrjd {?SP#'Q䄸u0P:Ff*e5cU9e֠95 (:e@Y VHlB%iRIXezrm;Zrz ` CWZ\P/ lz%Ҟ Dzp"Fucۍd鞓իv8xp\t>¿oMR[faB.=l-ऴ%;KDx\2e^8ДAJ14v,@P@]͓F O&LٿF$/3"({Z$aD0l6t?( @6ۯ拳D;rqAay!v.T63)kmd 8GJ: n~,K_\g̸`ז9BO[<%)\YICf}l0ΐ6a4̻B55]iHy򵴴кOlsA+^tm:^7\[Nڙ_k::svEGhG4ע0l.4- blhL*6h7=:K:l~AIYM\x5$Dº{Ee. y_ˍt%ؒ\Đ֚ `uL6%{ҼUs>UV4HBM%q~)Mɔ<]C;U'~%QRR՚OЉt2J VYpKRJ9 g_B$:%Ӿd!]~00ab=xYmE6̑#_+7IDBJx%?oY=H0hMUK)0.5 Zgҕ7O>hd5s`xMMhC=ߟ?9/dqT#HɇC$s*ɹd O3xa^wNXKn) - jpDjރs3ߋr` 3^ታCBjkD⚢Q#Dy"q<'_FJ$wX9g3 ׂ+ NLq[4[(jTeq`h пFب+! H~NK2@Ri//AQP&JRlc@SƍdFќ1=h =Xb` ڠ* Lڃ0:ma y>sh叄/V r#+ N0)rLjs)N_{H/' jxm}F l#qZNSQ7ɄDIN3M@j"ispL2*bR6M_@k@ds lbf] / m&X jK?.DBF(ߍ#q|Z\%AodL=r$J)sDp$:09Il ֑[eI R1jP$-|Mz[WYpR &˜P"4EY*%d  [4񂣢p,taI>*e=R*4K"YM@5$ȇ;tWɃ3qvSᕎF^s1FK [C|PA%jcu!IݯQfU*Ji} &ҟ)Ɔx썌l\*>8(y/%-t %Z$(!`=d=  JM7Vې yĀ}~-s%!LĘL\1S*&5 ;9;!25"Q63qGB$Cb$g51tFHes `(97l 'ȇI~xiMxx$R!F ^Xq;Ԗnib䦓`0N[q 89!JQk"Bc9˟̞J܌m6 =kp~~E%; [gв)pŬa@bHL6NE/܍?`5Iec>Ǝp"![A‚>8Q_! 𕫱j=f\e!<}^cXyz=Ti&Pk#H/).,Tc*"5 ҶkV3 !CDPK O<xYuz˔Gq1S6tUUMqUg8n(RB%FiUoX"Ø=oI{2, X=5A-4?"G'"clGId~ ]@_ӣJb֘4!苈zmT]hJq( 8!uPuqP2…Z$YB# e좬2~*$:sG|\:ؤkD8,I)YJzaRh ~K~G%g͚m+:T1 w,= ' VEF)K3ܥSRiJ%c xtA5 { @~RE<9?9quumw\Qٯkxhc]_jPŝ\ ?to>E$ƊfEX6 ADAL\~R3V4Y0[ i?z"%*RAD0,)ײX]q)]PXIp$ؐhV[^@u%0s琴QF튖_)%N p2ģKlc=)r׌^p|~.2Ra.gn{y@&h Pu@#ڶ '<@B4hmF.3ZUlFxO8tt]MBa:;ӐL8dᛟA|w]ֈ4]Gscy UdlGU[L&28t9q{bZ %itI:AYl= < {4kz[٣pK8@</ٮs&9 Dd擘*-f_~)" .mA!I1M{f~_5rgnSbkDr{Vi(JB,^9+;W[Gvk$X}ν"eI6^,!VJ㭞= D>))!J-A3)83?e{tk5j Z6pajdq59qTӿ$\dgI +yՈ ?ϝc~M>HR<|V>vIM8cv-PCz}6> G=}y, h‘wjNs~жU؇_%}-Lr杏M+G +j\pUYi%a:l7,Qvt N~ .!:dѦGk`,r>[}Ͽ0C /!6. 31C,'cpѵ0F!?HtM>gkm`lߡ)\,df.M\q{нj sSU>Xr::Y+ ^RIBI\)O4ڠ=w8"p0ftpXj=sS"kw}>1K]-(1 6}u][61 #2&m;q?_H.AM6W 2W$30f60(V8m`ab%v< )wB3`c[Ʊ;xhO"سggVLh%ٱ%]}Pl(B;05,%G %3>.IԹZ%OjʡSK%"G/H=07%{&iXj_P{98E4O2 G<5/ |8{^] 9pj2^Lj?oakOj3!&Г=gI*XJqN۴[J9>TS_5u*_6hs\dsY>RC]Y놩"dIb,2hRk GjW!2(%n8$Ni|&?5$]W7]A:]Ol[& 8BD!VhKHY{iULj%=*'X O=tPp]t0hCz׋ZA6 D#h1Yy@'6d|pb.._9$=S5Win|nƽ֪ \VtK&\J\2p_p-ܓ ҡT2'%=%#@Y52MԦ[ߔ_]ng:(9M0C#$ZNOH{ҫ |yM Bth&N ӼtLs$x39\NB@҉ t&t 57B0uY3&srMr\kZ3'<9&{'IE94DJhz^3v GR `Ѭ9n5WrU`Y{_HoK6nAdi< rJ3U^#ܪeJ[Iىq=q%&FRd=nNBJxԸ`ps9=!/T]VF^ jR]:jMG uj4YzB& %0=6gp$y𝀠S,QK ! Qh+ID$*wԆh62צ0\5عO3#hSTr튒)wc"Q\!CM${J+b87Q<ɦ&<p)Hz h-&-;vM~}S˼_Լڸ˫&EAj彣9h."Ō SV(j#fyg*rƘ¦!%HME9onL 0ƠoőIWh7(g!%bcj*xǪCFqmrAg7?iPüvv_ zs-u s.ɬHzz#Rg\6n}V,W"z!/FDG1"FGK#yk&\R*40ǽ1d*l90N~Zm2UhD.-, p DFTA:ogkѻQ?0!t?BA@#514LWj$K59'317_L؃G~>aPNBFn`4N'\_2P2)N5U@ _=6*X N'?uѶf{}~8?^y<4j35 8.KeWN8:4/$|1ya?ZyW7kY m%AhnQ&3wc PB۪YsN7K&?dt 1M.Ogcth*dV FŠ5tK`|O;1z]_܂>Ǻ7ʕ˪Bh3xeG'4Rt*pR*߿y$GpNYIo6k /e~$@Q^!K*cǀJ9%dP9={p^hAh\}G˞&rRY{RHpE+{>id ?m?SJE9ON:7l6n]Dw]l)Dn[+m*ŷd.U7(Q2~RCU<H g&9HS]0]s9(5C'OΚ^Cܫ}f!g=sy0RT@|cڕjS=nߛU:.Y!$S{_rWՍDC~[a#Bֽ ?_Jcw% !wi]~`BFEi$)%c|Zϡ+=:'&ӳw]u _tf,K|bZ73 iCS#17]W|"C׷!kH0:?J 3n)բQ-5Pⰿ0hl[v[EdcL $SyKҏUCܐ6鬝~*4?lb*^\D[J$LX:,hX*A}%\`_J((}EeFJ%"RIkws9`\>&iΝ&3Yh37J|-PIh!)}g# k+䄺9nV>:TMGlzg^i3O?#y41@5:-+$Ӽ'BsRcymLHy=&9nB]HyMe 8;;u<'"Vַ^դӿ׬}KUDc{Т$ hSS u'9ѨgY˜uKP6Nup?U{Μd`g*-s˄PJrkah9N{ yw;xR]BV!qt%MȜyh\Ht6E]fn6vbhdレ 'dM萰HsePL{ϖvZHkbJ^+𸁒1z@ 6MtnF.f:ȵ dnѾT6J$For $GGK-5NBR5Iq^];-H(բiDL}mL]3=Cө M$PD?5IjJ>ZXCBSpK ~|S68a6mv6Z2Ubk)-]i~:tpV@[ɖE2[0v<"pO&p0;4yP^`95U$[MMt ~ec,U'FF: /3矃ѭ9򳰤/(kZ5,& q._ϫ,p矧^Y.)01Daq</D'p~~)U2Q/#rmR5ƤB@sY~remICE^'E)9Hyݼp=s@ fߤya~OY*wK|"FBϢA8 \b޴0nٍqRoRlEY2P5 G" %>H OEs"wat/)R&4Y&r/ҵ @G.u),40AxDQ5x>A)ܶG1)Uv׶]8Lu;5 Uܣ.Rq]ELو):Hci<4X7M>.Σ|=IBX"9lw[zHN%k4F-|yb|BJv6󩆜87"ۍs0@p hM~QkYBր1Z ۠!hfJDװ%(uGi|<*,E!9@6&2EfMV*!@fk,IX#X5!C?\zz3*>gr*U,mFS"B}؟7RG7r;a!q@"A 1p:9QrBr[p3Nh@}S'_i z;wwhHq.Kil/?c%xD粑%p%@mbvQKj?1-V6HqXgB A_@(Atgߵg.."W Rtų"ya!Y1{ICkV00p"^pPBAxW)⧤T{v^/V*gyCϿQ 9KR ]YC5VC*vhZs#{5<}~!nnpqyמ>ؠNP-jTZSV⭷kv"$"+8E5 )*R)H.eA#O=l/A?n>GÞ_ 9q1ٰpz:^CPiUpF{md{H^5"0^p݃EoG+͚8MRULzT(ggw,,1Yq!i{AuZA(M:Nō8c5*_6x\j.KB)Ƅ>y0Q ?~o1NVm8: n<ϱݒЏDvx) |䁽 aĄy`{uKps31-ÔX{>QZh7ihNՠ_KJK:N줙$ISc 1 PIvm 9xU ^q4n]-]s'b+e |9ΣL\vbc`dZKjAsU)%%5<"cIbd3QoF|H20M(O,.sTAgP<78S3OTџAunl6Rŋ8OhOGi$l1' BYo¼ 떾l6R ʒ7o?Jǟki-Ws3oہߣR-t_gp3Z}g+ 5 ufnm0 p[۶..x7:puuʬq W@Q$|JTs R:hQt&2*!\*O½In[&}rPOdGm#<2y+Uֵ*?Kl[&c0bPn0JL Q k*' UJ Q?#  ]+ C9oN>GbjIB)i=ZPL/%}PV=?['hx -|0$"C:1&&a]p~?Y'1ًxJ)\__.A D*R1@fU8cxi:ߜtCTk$QRZSr[\I189efkj $?[Dr𳽆vօju @ŽŎWW݌Z1,kSRVCC1s8G/y,pRTus\ ~MX5"GBK}_^qM^0:rǣTK7Kz% 뒄\!/O؁ coC(?-&:m'IsK\麴^wD6 q+m{Lp(:'/M->} JѸhz2LX' 8l_eU0g&*c5xy0aKX!)k5 6,hr0b4ݶ4}8JJ')2 tjzn1p1k8kD,:S61"~݁6tO~Gh[XcR`(KHCKrkG8<5C+4A}˥ C?!~׬%Rn^^ 2 }Ea06-E'jTRϗX%##0/4r|.|}V*ȜxN,)~:G*9nqiTyQjxMc `^"ga:UM;֐! ]5eݠ 3}4x ) " B9,kG(*X$Hx:TT(H9MqKb ZuYW'tfl-5%nA9Ƴb{ɱ$7ArD4~v ߎXs֢iۀ4!&m0@*fH\\\DE鈫+4``!QR4M LG @= hEX䒗9_pew%Dy@ _-U9'.b6 B .$! ȯ9lZܥ-U'=FtAi][+f2G9k)zAAш(BT_5VKd$50*A_5x|foKŤ1w?*JU 럹lB烿1嬗}vd+1u{BUyom2W P@IvR)$CHDru?Sg%Ff# stAm3@=K@Uw5nv2-K pm"[dQ)"F)sArc:a!/ӵUv C ߅@C&k%FiH;GݔМՋiY #u,  (teq9Ѿ%a ɤoa~w RMmZnaӝA*`$逛NGC> *ٷ'(&(J~7_%U{ ]fly^fMTCs%"JsE&JJY;Hfg_Zk99f'?rg-In3TѥyY*qrJJvNhgi%6|WW[>Yt4O(j'I0XT2l*=r$赔E%E2TL} LeN/IGsh.AE~ƍ ͒.Cj,D 9 ͽ^X}s *-3o[,RZ_;S]p]r9mYg]' IN{cyE1,_ QJ;N{4KAhnD[p[pqj[,"YFd?gM490&.\oXvԞg ȉ })a/?hVuiMD$3 :X.'pѾdㅇ8h48;ƶl!DZTWeJdgj).)Uihf|6a6 Y W|Jжڟk2uf*J8-#KD`fk=T j]2!VgΠY '8/J(ΫDHrt^^L)EubeVT=-o{mBЃs{ Hnmb; SmÈԲ7! d }TU+ʮ1O. 0u nR$"I0>'.1g[&fj<yRkת uYəs&<5tЀÐ'40 i%K1og6t QK jS@!$5U8nUy_5[BO֐UiE-S2[:eG;鵔,{'Nu 3Z~WL J1$?D]sz8N0f#m2m7rjAUH+\ s ANssն~]:7\I$(rEUNɋ5Hf;GiEBvͦpꏣh<,7{$Ʋt?0}-a]:8Bw,-R%ޔΡd͕IY%de4^+%fJy x\xJc5r \a(I2kh笽 #Tyb:XlG+>ᾍ_2&UveF݇xګj+n_! iz JQЕ E pz]"'{ _JAuww==O -^k-֐ #ɶp6]% #Ge>/\q_;Zù*}ۿHmXWv׏qlwGmNLbD䋁Sx}A2ڭ !|DUU6(Hy'ԡ`0HN8֏f."N(,nl?fbPtKzX0&*N/4j-m3K!})y:Ps$I500i /QrÞF쵍=c a\ČR[:ǃZiUEJ ) -S2E(h8B^uͮ0M#n(&IxFX"Htmx@;p}BZi/9IB206M1~4F䉾Mёĸ{$DRǦvNs e),K4*G & ^1٧3xL %֡m 4=F@.{O4&?~7 F6ppT]UJ##x9Q%cйn޳ZZh.VD;v8; DR6<1*6:X .cJu0kQT*a}}39 89ŇE$ 㬃Sw i`sʄNL/C @~R ~ 1חG1{6m+Cn& 1bM990p~ɮlW]y&~.?sg,2H@_Pv5U2*{4N#5Ý\kK'yƧ<[L&nàTHHDdKpH8 Ap~uN?ʹs FF l!TUIp6S^+`H3r=Vٳ8;y[-O@T)Ze3"L1k N2 KN_y@?ܦ$YsYۮ| h!'*D~Te6y0C+͡z9d}&R6†SGQv:Ș\5 c=b@5CN+yd+ZrW ߃Mΰ/}p[Pv:7u?/_K$ʝj mݦ;mk AsD7X-'\pF+ &_`# S. à9kjxYb1ϑ8wO<,S#z,ߒ XnYZ2_ŢJѫؗ#dɷ!#1$M|ʜ&}?W)WNR,~tR#ԟ=yҸ{AiFpτ8ET#?͍޽̸Ճ=<0Z1_gJ 嵇 Z?Xx~ZCYԴJ]sHav޼Ckw1!50苕ɞk /r0]<Xl i%MGTqoM[~WBm=g`ɚ=G` .}{p^`4!?2T~^P\=Sa5<6ķ ^pm^7k3D1T> x'^lȇgzR\=}k[]$hS5 eL@O֕Q:mqg$_rs?e{PEFbAVGEϒ$"6ZP!bUs;tp$V%enI_sAX,.5s鹖,m8ySV̟]{4]jN| t׾wp{*ڽ\o{~.ũ%2k+5rXTo. f9Do p5_DbPmݒR1GHl̟G6[v ?ZyM_^*Zq+rjuxvh͉,hj$54 mbS$;U@iƮcF@n0ʄ<0?kf4\ݛ&W ]ʬq+#p!A^fՌV^A+mQL{_JHQ4ٷE?QR`֟kx %I5V|fc=׼R=6Y%"E+# V2q _I5 ]awaTJ>ܳ[okZUgK$=0[6gA0Q%;X,Oxv֠+]8;7i+'+%sYw|<$z@͵S z%^f)AE, |MY=~K @ hKP)(!Zʅ|}Hs.*Dn+ <оa**ulk~5qnT*&!O2v֧ENJv5$)8Dls잽?%Ind^dOlaCR!Z Kl$)TNB"YV5TUbWt% FIC1C0QZK%}'#jḌ:B"ߋ$ΏjGvBjIf`Vn3^?n[Q%Ci?lh8 =-D6-G!0Ci[~^P@0nҲr~s.Fmj^4VzpN*oW%$RKj%RM-3ߙ$H&:ܿ6TzIeYp61K5(Uj TH0GTyt@ M`9;ՠ5bP%<%nH9!L P c:VA߇Y湅s&$`"%,%sy2K0Os'=W):/'>Ρ%ZeNצNyrHkt>XyH@7]m&6 WQ9!$gˈ\ۢhN訄N'yv^)QqU* ca}<::?Gel@#SF5MV٥(mV:hj?ukM6n [49ϳG&0SmG;TUj- +ߒ{?+[ gHD"_7qMW5ujUן[$%uB'Ih@M)q}JEŴZspreILHʇ|&rZD֦6f7@I%gQQZ7%'shD V&xh\DJ#TEx֌EBM<'mK_H=ZǰJSzA)^"d8#,%n֨c.yb0u{8寤OI^PB?!E P |i!2J#& (Ysib)ԮkIf#y۬ jkE;jl^Y]"Qe\ӂ^ _{E$79x[98 q6F)7/s-:KjPzMTP{&|s),rpؼ4FaJQGJ-5őωy6Փߖ.rFz%˃qi:dP@G4WRKjs-_yQs2`~o@(6 Ys|BZePΖZk./nZ sf0'Dh4XޜPc:mޯ:ZW}Y*-<qx59f:3s6K?|5V{ơx%gמ+2#ٳBYLH~%D ^{ƽnD;ATh5k/#69)dPߥCP.6f.αsWMDV*1 *!Qz>%0U 9w|偔|2do 9ؕ?)l?kZfS[I-,%<.5["6I[% kj8/d Lx|h{ܧR^R/3m%H6¥IU4wZQU )9 #i9\?'/ߦm>gM/{)F+ck{X;˓5Føš -Yڎ[0lu&MLoc PL֪yB$xllgPR=dMujLV+[Y^{JK<K @2;0%IZj̝AɬoK\ vdIsW)y)r@a;*gR(^[Pq^#p  kH8z-b4>_L\^-RJFlB]M-X5n@Z)!Pm;*r|@и)sryr69W:tέkR:)Re>^,N)U"9'Pt`ܳ{bdkz,ϽT&Ъh:!)A1O..TإQ]_fF\??euB^H5~_W?4DF-WUF-Ιsl:g-iIϦ8ʜoy&O&TB7JrHM%#Cb U~$}54UfaUɒi>b, Ð5fSv]3!5b\RJaة+لc)XSŮEJ??o$|+M#`nڞ]&dfLEF|AEl(XBOps3o(CVEx/Y$+\jM97ymUZPZɂ IS|t'.nNTGVA@%&237&"1 ,m+c"'{۬'(i2E[,kĶ99ڊpNZGwwwH#^MӠiZH:IpkykMw t||ضqdkm&cqKrӤwpđL ^Jܳ֎m.oP[kZ{q'b<;-l$$q߷Bg2'$ $pV?h1n5xrgb1ߔŠځ?0cEKPd:uWgx*hU! YzQy/x@9Adηl $Jy5.I. 0xJ׊\hH"C'j""җ\9C4sT5[ Jq;_AΘsT$leIѯ3en_m(;7vqI%֟3}ni&i +N[ :~ w4w@p/7U1y<,7J@z9rE{NgW?r(6^dZ']BD7'2d۾VI>s$>Y3|m_kג9FP2Kj~0 ɮToKT!F4%rq`ϰ*3VK A@Rmo/ӑ%G҃}8b(8K"F bFqOh -/!bל3iZJ |grJUۨO83s9+K$< cq:Ծt%Vٛt~N v_a&þ0_?OzE|/ Yj?5lޝz9o k2<[Q+`Nԙa9I T,GӮro\ kQWꭚB9`"_TD:IKOp;t36$Qq5NwZ?1QjP+'Eb:OniA\+MgO4|'|?$tFd`⺜1 sk7s.>8 pU SэcWuK K"6`85TbZMֵGlҸrL,cg4DVYh3{@ߐ!Ҧ"r4B JY pRJ`ʼnV,%&)KJ@V__tn3r̺hz !' 00G2[Z*1/gFx</&E!C8)4/R i|g`' 䚽ns{hnG0.lsݺ)y(\ȟn[ʥ`b0.:'[٬U*i{5쿛' 2qB.vLy]Hnq׏jDZ<1ꍿfKW5"S q!B,¾ >G6IH ^S)8ptiT #X֘^(H'@@)y/5Dҭ7CSsՑgaoD5hߒk ܲ@R("C5YAra{˞)4H!BC4Q9yL|&A L2^7+fS7A|sf#[*ܒr.|5N(, C*9seαʖ q%slQAX\;emwGTq6}fO;^DndBc@ߛ'n$h||T?"8_z-Le{,TKŐKPԣ*\DiG4Qƕ&@(U5cYթ$iϳ;qg)L|>U;V™Tf8kT[3~esDNh快*tωy%GW,e w٭b^M?*ItlXȪ-N r8~ٍbRšetT o zJ Jy4\Cy#C߂3Fq'lVJg%UeWVNp{㬠H  ܲ :;W-c ;20ëANbq}5O%·/@ģb$!G%j{Go=7iM c?$F63LRKuQEL%ugeOvunTjb1FQ(_j,e]^ S$;nK_xF~_9T31:c Y)qҘ`i$PRМ;2hJˢ4~E~hqB/ ]]QcF,?Gt]9ND)Dmr#w8<ޤ9t2а"WZ:$վд7u{Jd4^R6Ϧ`dwa5}@=kL*͑leT> UkIJ{e@!S3R\;h9\H)ij۶˼G_?- D=we4Z62оy5"Ja<`{j>k"x.%`A߻+[_*J/bftHm>zNYɤ/j6=F4|0fC Ҏ㈵oGFלt"|*, 8rab^h/εn4ۘ\/kpHTH52j5H22骺 Auk6@{Oq-&K(d"/sBp JxI8B;wsjK5QcwtD f.d~aE{VFeaX.-qyVEBQrv>|X@z^sj^$-KW FF:!z%Ia'oGYH9R (i oFkULWyfMWdZI?3 $ 7Giv6,Q̕qs*@&#9K7WGJBaB%|Ύ$A!8H}?86؏?>q m[JZơPfkzޟ5kf%, n{>׭C<ZG;?gLFFTYҘ(y`v%2iv$-VбkCl 3g eot,ZW$@W=f 2˗esmoXMϮOpqee9zȎ)ЫqF0sCP$G ֱc!(M9 'ݛ|d ґ(Ұ O'a.) GVR߶:{8;kVXvfW'ҁS?>>{_a{XP6N2ZD~ uy[1fO5zIyy9kjD΅Xc3)k i{J|X `3Am-hj̣{KSG - +&,jD(45+sy$Vڶ m;%G||uTQ?<cǣ&rGsSJp߻2,=[+T \9/:rƿTD=cjԬsJ }ܼϬb:(nm;<2h8eN!%qCJXB2g(*o4:zknr tDkeϴ3VS9I/kvg}k`Ÿ!+Y@ˠ%qfX;7>B|!~vZ`{5#w5NA:Zzһ fL2N43գ0jVIeg+%m'4nQFK5Z  ^m$,~0㞚Rj}|nBpЈLrvNr.\{"^8#aaA6"lLhq'1q`zZMr8ԼUoir+YNi_.BhRhqWX sepuWw돲wSER0Q>+_}z~ 2ѻHͨFoHH!MʐM4k&5/r=`߷³LjʅHh(eC2F7nZ4"dC jBQ-Zt`a! + 2F?yC>f89 ur iIGW;3@9߯PѾ-j(VbkuOpw>he,hҘ劢D3Fy۔f+IJ.WQ(1(@YͩxW{Do Y~^ߑ8ٷ >*&T69+Hx-MCsoX#Aё?P[is>?}EcAIENDB`bzflag-2.4.2+ds1/data/mountain2.png000066400000000000000000003605641200563112200170100ustar00rootroot00000000000000PNG  IHDRx pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F֟IDATx{Э[vև=c9Z[S؎P!RP CG # ݅+ I*lǕ* UIR\ˆ,Zݭs1ǘַVXvw˜gqq` qqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqqqqqqqqqqqqqqqqqqqqqqqqqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pqqq<pq)pqqqqqqq;??!__k~⏩?-8 /~w//OOkFyD 8KR0$!*Vje|nWP< `ZCf B1#a5 Ҡh:@`K_S~w8[[!|1sQm,"2fHfݫ%?3tqN?=<}zE f|k>DKrKzV"r\K@T֊=?\k=b۶==:akTՂ^eثUT){DdJeëw?q]'W/oKq,j^q}zm;FJ#j@@{Aεߙ>`@q~?=Vg’jEKu?{ rY8.fHK1H퉚̄*ܞ4  ! I_NH+ỚUq_(? C.y[yƋ<^3rVUcBfnU * p3>1 倫zMX"#Y 0`eE8!ԊσP} VYB`Jxq>lۆV*N@!+1?/uuqw}|~\+\#ʶaGLR>G{eaКB.'г \!Yk}#1CU_Dt\{sYpk@ !0b`S TVcS17QJa& !0rXs5m8\|Ϸ}ϧ CgӰ]̧ChM+u"aJ@mBv9oKPPk\i~sb/s=w~Tޣlf >|r?F@,~@LZP8@de<ٌ̀ Z.4bGfh-EQEPk-D׿mw}O~cyO~'tq?4 k[_Vqc\^B- &B 4挧 #UdSw^tTkgx&L ]]OT2o׊1L }ٗ(VĿ DV܅ @B>BؿVEH#fCSB$ xVEnH1B@k 4HRKH !0-4 4o_o{qw_rO0݁Cg6Z>Ɓ15Z@ ޲kWYU\+Dj NG,ϒZݍM>]WDM*b ֧z@}}g{!Ƅ˧Q8Ba}R!p`f{#>{;Ð0.a'%?Y*gzb]o}o1p{?#/_}[Nx̑k۝~7 ҷ~_"a)RJ6`6\xè)~YDvPpc!cOnO]8(qjˆa@hVOM|y?{a8 r_c8 _qZ? i.|.y{B|5 sk=f.vͥd 1!Ro c^0 Dك7 1>A|3ÿFg/A '( ύZ)G #lg >ӓr4 ÇG'~~wc8 ?]+^<<_^Úђ\υ{ZQJ>yݿ^#D)㞞 ̊}BRbDnG7{aLbXx3~S?lbmA֛`9l.)1U}~@oj IBP!_4(@g0g}]gr.ߓ72ZV6 1#ńf4u[1YxSy> *Z)&諌cxጧG_~G>;o?3q?Ww?:VjFk = J>?kM޴ c=_/~799WꇿOm=|}8 jxzz婠Z30`f ջ|;gk@qӳK^oz=9jQMAl7l}n%Xy}#0,cOL4c`ZmG@a{_01Х (CdNXUz# _?b[W/܏b`1C !`Hr Ɍ b|ǟ89~{oȃ:H\.K wQcЭDqK%[ꭅCםnmNq_?@T7#B G?h"obs8bOI>*%~ZIDPJF9܃||cjw h"{/Q ZEjź.@at>c`X u[1#g˅͵ź>"}Rh[L{pga4멐-{7˖+cX:x4 o֧ռ,B.b@Ƥ+T BSMG@=&><殱 6 Àia6\WmwMWWL'fI/jC@J >8`ۿO !u+(Z}-9`]. b`2m۠MlACJ=@c6P=arVڅ"bjVr]@GĿaoG'~ÿ}8ʏ~kojJS5wo} jmMZK#S )mKީ`94K2 nmqXh[ǣT!?ֽ,V'>O $V6Zv;o;}s0rx_^fDUL޴t9BMGȭhd8+A v} 17{H"*^|x{?OC?O?I78g3}Gzc!8s2;{L&i>s?PwXY!b<՛} "Hs@iiZwӲ}}~ow9p4,e{{LZRޑ>8J"xSdG\!8onCBrqקC"U2%pZzQbFqݓ|.7׊fn1lg+OzG8;|7~%1?K藛"ڮ7/7ӷ_XF"".! <Ն ;z8V:=* Z (}5M(H{2[B@:ycLW!~ #Apd!XCc)гBHM{!{{m0 (!U 7J G֯0z |~8Ͽ4G[Ap[&=<>?B8IyE-JXr>ȾeUkB O@wʹM7YB(J` Hq 4R4ݧuϖҀ@D /s#PQE,PiXq]gs!">"TYg"'E0vIbu`p3!eX12 (t|D0*j=ګZgPLGEIx8Jȥl51o{twRJ.ty훾˗jb̘Fm}sz/߿YK -iy96y."}<9UeY2B=x- fspR:޷_vo7*J.P}n৪o O^PSϩ z z?ﻖahKm:`O@bЩg9j`R=ڑ^H3rZ T,& qCő/tYǾǀ8~?E_?ֺ͸IC@R"[n7~U&AkFU=2{{iB/n0:a^W~ׯsup^;|#z3i}܏9RQWݵtkm ٽ)hҎhTAV [qMf 0V{=P;|YI Ahk = w&Cs/d=Fz UZ@F م;,ﭏBB1h5ZY/oc6Px((8= )c[8/T~oG?C쭷^ ! "鵘MVC;,y:G fβ'ӳV0Hߗ \wtAn.||Ƌ/p:8 Z VnP+kw"@­8ӷRC#q3s Y YPP4PD 9fe趲P72tU{+vޣc`H@jhz! (CG q?xjb>B/(lԊ|]1Na1 } Skǿ9_8W%?K_?; /MPr6bj1F:{(WUv绅qݿVaп]M2 P xz||xqجJ "-Cض =ip>q>?`_=; * 7+" @>ͦJ PEp8=7-/;S3Dћ_@7A qwv! >ն?ܾ0s|}jz%0rdiyM1 #b N_4G~41zVp=9&i~cᗌ!r]P* 5P LC7VwE[3AT_h_k7sqswA{o{1} (jkXWz OOO4Ǭ"5ox^\X >ؿ2%-%{b~mDzz7hJĠM'8A7@c=J |X'*5]2t&[:`S& ~2tii-AÊ@PdZ9J}44 zF6Ⱦ#AXPa8% c2f4i(傜M!#OLtJ~O_ ?~8Ԡ>&|xxPJ),+uźn`6?q15,eC )]v_vUödK˰.}#o\7tXZk*rԭJ0 #mâZj]A-)իW fm336Z+պa@8KN'[7LR rΨ#&= 鄺 ajt.>gV D Db ,KJ;2t}B|:DLӟH<`sgm?X9^bpszL }l9<*-DiA(Cܕ`*& #XUFo~xīWO|]ʷ~ohq|ӗ#}!'!s83 !뺚zR%/Ӧ(Ҡ[j[0B #!%¸_,OE-]ϒ[<ѽw:2f'?i|S2o^1l{3mPs54ҐKźm01- {SkȨ`]m)NE{D ʭDbDoFA-mRK.~d(0y_N3tp%=C =C/=C׻ =BDPJ9"uPԜ[ZADvs8í;[E-Bw%>̔An6D!a`|q_Yҟ/uADqOaBO'TS1ZK]MKZk}#qWl-'Wpස2 ` d-e V+eA.qPZET"hҀ>.8D1MK8\_Etb]R]7{f"oO~"aC@R¹m;Z{EBEs!ROOWkq̸^P^ݦ~EbڈZ볻/ǾD i?vӧc-ph]obB09;#hbgne€]1pwM1!-N- 3. U?`M$zi!";M06UhKĊVǢZ ѶD #<# ׎ӈaHDRH"#!%+Y 1}uS8 j˲r\0X}||:JhXU' *8/+G$ jU')Ex1ȒFfkFϚ sO ־(1D \+j@ d*45?&f>FhD2/Lv3Jvۆq<y)VڗBc[<>/0 X˲ʮY,ScBJ#KO"R`[ .߭̌qlhBm )!á6ƈ={ +t0D:{-AjϔC.}("-=j +Eo 'Tb)#< t& ]4ehk2_቟{\9glۆu]QJ[eE)[7oԺBftz-x!$VK-Jb5RXvq_)AtXf!pĻ9*HV<<<`g *ԸMU+u[TU_ﳬ"":Oqв\^[ q05o_! B?iR<"TZBcD[܃o,hYPkib cB]3RzYu.y_5?< ï~)!Elng~f"^6YDO_bL'uBpLSmUʺi~kG=e&BHR3wE&ӈqRmsBj+W{P!ohkZ\TZw%7D<`yYI~lܽ otj3v/(ߵK|2iIׯ+Rr,$l"t²,XVkk#RJ6㐎ZX 衟q&{Ȃ3/˂#1b&L㈶,XlB j ~VjOhོ{zxN g{% XF~l.~ 9Of"HRUD(33^R$Sԣ߳?>Srn(6-YbF`&PRwj^Qr4C "hy`3( }iR)ۺ"po}xm(XxcC(`ֲcwYD~ _smwHmq]|oԱ񘬣B(ZH4 *B|…@ۏ}W{W9}:TU .oZ)10Bd x1@D|aWyH#D1чx hn DlŞ()6A;3#*zA ܁4&1‹GF0fl iγښE:&pbp^U3F8niAM?&mVV 8ObbY~wL}M8J-<<[-{ 0~@?&b]W<~BU{WC 2]_j;\lM7Ͷ + ~l߶4MkO8v?3#e=/hoZ*T,k>@-@J v"c`|wDz@ RQQys">9'.~ PP%3gX׀ݽе|! ЮKmU@]aJol"Uź.Ƿƈa`xC (Jh]`٪-qˆ}["7P@$ =3a%sT& L]7a EQBg|b Ӏw;]P2 ha"RkO[y j_@JL*HjJUWn4Sif]us D/ 򍿋jk'F&Sjx-iw0¨Jec"xkmZK~YKC|FђҞاzaJiF;?,gŒ"]]+>9EX-~r󘴟}*oJɶN}0N!+w@R+m+΋3Y>)2RoG;cTa:2A]3&nP.F_S-uV .K@i0 *xJ_3il>`|yv>u]@{U>+{TJ>inAmݧnP4@fHK zNϾW(EL5)Ԗu[[f?hr;.`taB /3 5hHjnc/p)[ݽgh;G:|kkjUmi^U8JrV6'rI(֯6Xk&5Оo@DH)y< ,Ee_-o*^< )A!x:l,C鉢ǧ', È~燳Mt 妓 <{<_5A%@h?Hk*(Pp 5cY_CZ9lO'ˇ!pL^ZˍeXc 190чD=vB!um ~5ѿ}>̭*˩5!3P!BDPJCr<׻WZC.Dr6mLʶ-CBzzpuTbwmh,!w[lmr3$vk}v(j۫YCJ3"NomG#8H!(3U; 0GH4zSyS.LqBEm">t<4Լuгi.;CK'jyºV ZPyz~&* $ٓ+J%y}^mm}4ZLĞ^u]ZUؓdza%O"A`)>e\@dÖ jkѪY!`9Z姲Oܹ _k?}PUz;j4 zUy<B4w"^ua'CH]@ݷ J%,%ړz6fF֬0"!DF!f`nVfzƘc88})Af,w3#Cvk=v(B=ꑓ]=;F+nUPrn̴TVWGV5kFʼnGk"S JoxU{a{hMm3$}hi 9oXs R+bhhw&RKA#;bk3.i܎+1c8Uo>8* l&1 p2KЍef-Cpׄ$[\*Xwm$IR+`0 CMy њW4!_)!a&J9eb+Hc Y`ҢOBP b+ $ 'Ƕe*8!=08FJDEU/y[aga[6[x!MRh Ui B27P!!eMDs`"0+!qk9RJ:Ƅf&2f^NʥY#M<+T)@1 p " "'ȝIG P1 b-Fp`\U5ԌC^1SߎCLX[U@q?_sz.Ȫ]d?W,>]݇wMlk?gb &V-ea[ 0R̩5nP0Thk0#Z.m 8!`K88@Jwe_REmHqoZzg.7yW*p>U+8t[WxZQP1BK vl d#D$[XNqQՆ\Zk. M7ljz^lVv CcY} 5w5t0DZ?X(Zas'qλLAǐ{j-0ߣYV,[Fn&f{y>#ň sݧ CPZr7 im\/hbFΧa^ɹ\7Pm|.k tav" [j^m4`!@Eͪdb¼fle3q8]@XsD~ R=VWK)YݚJ&{Ш8-i@y"\CdN>5ЫbU᪭Wvs#Zb\}83b#U &dcw+e )M|>bn8+i" [9KZ  RR1vk9<],ôO(B@)RLdO&/" P@'p~v}]8+\,Λ)Mg1 ym˸ &˂Gb@35UNԆb1 0B(joZdt*Kƈ?Ġ&*;iKto/qeF4NǥW*Hay:!Ef|FU i>P?,]@|+nDG(Z -cj^N = 4Z*5 !#oc"ɞ=ݴ iv}yXIݯ"sрq@pm_ߣČڴg)P%[k#Of-TZ3h8G(@R&6Ӈi4BkR2m,7R/7M{K\m(Ͷ8UWZò-0h0D zYf\zY6""9הl ˺`)[xO`L[4xgd6_㚪`F<8OFU0TvD=RH&h&BKj*ܟiWFwKbJ)>&C8+Gvle3qPeDL >)u܇qM}j3!b0"UZmjBe5C6ܶ[>J)$(y[.x+b: Vl8XKBvq>=Z Hi0vR*.\/Wly>L!h(KiŷRz=S,9{/7!{TkuV˲Bzv*[Ɠ)Ԇm[HF@c׆)$eꚞ)D85hm:.S,y5k+G^0!Z6ìk-!a7EPBh@$k QQ(ڐ.+Vm- ň*{4܄!A{DԒmhR[Ek"\.WV!FbD6`QjA˭ z`+2Kqb ӄBN,ؽkvQ0MU G'9&$]ޢrL"jT4=MZz&s<142rFTTkG^ ka7ݮ6\Wj@F@nRcYySFT5Cmaͫ2FT(V{u}rˬr'~m vGmyֲ=-g^dQ%X%)#^F "G8"je.´o$6E-vsnWBwTQ{mF4P$ AX%TKC0<{Ny]|95DˌeX*=jGqsB+c34k lZHQ1cZ.z}CP4fP5h>m(fXޅeiRPh3YV{ s$PMt[= GMCv)+AK"YIӆ\ciZ1b^0˵"g:C# Bz]P[1儇 u9@]Cԍbπln]`V%z`R!(= ]+D [/U0\jlvɌIF{Y^V >'<瓉PkM`SAEme *taBmZ7dmh 0s'48Saݝ6lyooê2m1jkKE^HkzC낥lP|r)iDLBDǘ1B^-h8^!4~,a@ EL@vӄ,+V>K- yCØpyz*mSNqyJHÈ7L&ZiN焦WnZe1WO=h_3À/ZWT3 X{X%Uzkǿ0q .Dk{7!7ٖ}3"eң8 "7]" ۂ`/lb?+?X/zc̊-W\I-[>\BW1oaneZ>0L|RǯJۻ0n6ƫXfuTH^* ++~L[?(^֐lTLIլLݙozlۆmn}t]03h2d?A }LUFmv(r5^I1OvЕ !݃z5!Q<]/(yc' 4BZ@{(E{%6A[oS)0Jv 3P{Yb=ԗ0ݼӔIvX.ۺ@dc Eb>ZUy@MuS^q)!vn1SV='ipWiҧ9AV#KT7Ld6Ğe--,:5P. J37M<}!, kai]˓jE2ڊ902beqp H.tB(ٜ"wYPԾ ˺Zއ&[`#< 3E`k u{?n_bcՕBK楯&e[]W1  燮#>xE S y]d&ײ[ 2 |w?:b H f[2& ʊ\\KAVZ>6ZߒZ3JkzsB`Kp)e˽I yBK-ۂ2Uga*E$wn}9+]XKm.T!m*YI f-tAdFJ۷6p@okt]VrG[q>"h܆1u {1+M,OA۵Z_*rЃ]<㭷eM]䜱bVb\w{s\K-9`#0 @U"b9mؤ$)`3Lj 4tkPnh $f0" J؆[UUY'Jק'w*CHEkC@^HK7ܽoCo>8{'=)! unJQZ-b,bjpK֞-1vºTPsz<)˥N3^8ͳToz>1rm]`ciӘHCIҺF.6k m&4U'ecKD`\$/ 󌔬=Qs;-ȶ̉DOXf82e= [ɸ .eŦ6="ێ5HYzRP - Pq:`ƂRW) PD[5# 0>=jjVzR2*L8ǧ'OGL}1& һFbA-*Ax:is4YeLt 8`֯63LUdk٬ ap], E$60 Ĉ01SH5;pZf!6|jqֻDlU*.ˆvAn!ItLt,BA ^L1!)Ro7ԬmRJE.͸GKs"Ni/a^7 RtF!G\^pW,eٿOԧ}*mMԂVRkgP bBb/R8%)|TA<]D)jg&qqp]T,(b.Ѧ+z{+<*u"`֒Lde}1Pm=akoˏ0CF}m0o!֚msn8Ӡ(} CpUiA¦ϧE qRVVlRVXu)agNʽ)%S^ʳ`8{DHi2r+XhdsmmnJ a03xS؆l&"¾ ˥>g kF+6ivg\lRf ڡӠ@ n٭$1 qnXMe!eq(-!..OO $K4D661uy54t޳m=#]Țm1$ 1ڪ ooH&Bi>t:0өO~jU|瓕cŦi<%Z@6JR1Qc›2vX1:=D'FyC}=# ײWZel+ଫٴnECnHcac]A-cf BJ+ATl 퇼ܤKZI i0mEk(-C1f1{b7p ,t NQY!dUV6l"ՂHS*T:Ĉ13!s84@%׭lO֟&n*&l"GD {Ϡ&1b Q$/KV|7Kp,M %vOԲdlZ&)iY,\QKC昬 b-U,%᜘1$ۚIy*pz8@ &QQ, .eeZ.(ΡeN]O`z*8!!FrJrƺhbch6ϷU [A$``ӌ-/eA)Lw_UURjހl?p~xU :9Y-j֮hȥpJ.BJVipTTN8O3v_!4Rۡղ)BMLUb2Z 12cKE`KLrcnȵڱl8O'8l9co[;Zqſ*7])['v O(4o;GR'#w^%L! Lw%+ J#is"0%64$"P1Ąi(@$)4F8),%Nb؀8$Li.pIV.[M_ i<%b[M&Yӄ!D`+eݰ<] [ih8%_ʆכ[`#=hTͬb ,M0c@I:7Ǵ}lSA _nhk E9\q\d+dV!Wf 6r 7s0=01410Mv hh \ڐKÚ3j"ސLQ)J[?PdM˶jW3ZFP>fI_+^!ҀRߌowm1SQ^Z-f4D4pnbYkc#.늬1>+&BH)SPZ&nm$H#qi1M}€P]*Jl;!o֐ˆR+6DvEbL'k,bh+R0' 6d)Xi! U(Xe44N&d|cUe,vdp_b) l'ڌ`xqzh9oF C`LB;Zk1X.eAެ?Mm9ڨ߲\fB՟rVE& (P++%+1DUjY-+0*Z\48Ofa}Tz]QuTnGbH)AAX ܽ"bT" N㈔BZM_L3 a8cg"Vejkv {sW.!,R Kpa? !"dN~Èyˇw̛A3= PkWN P;} jK"y3!Lm9gVMc/~1Y%E > t"8`o .O<>]Qr;zdj $j!lNp`vP#H"VP0(a1M %ְh90 'mvmqlJz]Qf%RH_·q&PJĸ`õ ^WoO\H]ħ@"(<FWWSfg:b^gk[$ @hSM+T3j poJY1WBʊׯ0O3*rAghF׺)_mYnڨ׆Tq~8cĊ.l-+Gsb j )3hb$j7 lA{X@/aBD "VҰKJesgKE D*ZKa5H}-/2ywkR+'q|>a&| D#h2He/6:օ*tWAle3,CbLn *'m0LEm ḓJup6T^'VZL,xŚFo}hC PI5onI cߘ6ZkswzSԊ!jF=j}_8n2dbݭ*L= .|bb7XsƲc3Z(`6vCh`D-- ☐ơW zo9_̑p"< ,j*E CG{-z]pV]Zhvm.֌R5ъ+Ƙ,g P`18(t=.Xm5]=:ZKV JF)#>2)YPZqPB(& EQqVמ-﵊1ݤ z݊6+`(LXZRd۲X1%S,ۂٟE^<0=1a " Nax"!A*yYԌu!`K/DlBfE(aqĨM MKqsGoܦfDD2!s0!ln 8Y11nuJ&r *htSA :xWV\چ"셻 i/ /0:0"Պj a@lJ`Z7-C<6OI^<8(}Q$Di6ab6\ˆzCFGY$[ٟ+]`F"h[}me{F`_.b$]zd|FXcU?D!$.9YpA`[K}*U^1\m5!LĖFol;ln׾39D *c$ JKeã\-%oȹ *%%,}S,HS[{U4zboL [n jݺ?y@! &l6׊e]i;PЫlV+늼e41ؒ 1ԳІ:Z"5OCꕻSo"Z-hרZEl`uِ lyP"VjHvѬod! cn&֝׆ ۡTj̔Wk&kĸ-Hc;K Sm-oK- Rgf}:h)%R  8 (b&< MrL#|lΗ[6 Oㄗ팱'Y!p #GKkX(+lQ9Hal.>ڒ3~XDODDZ9*"K `%/Q*6lHq=F#XGAT% ts\j))aYVK c Oeê Lpv)0^>h u@0!!d!K;Ä1&P@X$cY~ň0 FRfRӷfeGzF8 xB7xAW>ˋv[WkKf]BR) m k3"tн-zQٗvܴ$@0l\k88n1]MY06Ĉ! $VA@sAxKw-cqKhk}պE{Ve_wAwfAy;Xvh'[)O`_C'̊>*e© OF[4fsr]&Vjfvɲє9v@_K_Sծwڇ ج0L7m6m7X\YvTi~[JEa3hqĖDb]hZ e[H3O# l^el/|Ek7!n۬wg9KCg5%Ȑ) ely4hZ7Z̺8&g[ y&Q@` FO=w4* ʊUmJ$jnd+qCd 1@(!l+(ѷfѾZ pV]AUԢQ[xg~x'NM@ƀ0Ki.֌ٸ` )F0iWۓ7 # DLӀs߶Xs)[sw-LÀ1֨q,UZ׫ Z1 # }c@Պ7J[))⭗/Sibǰ{.R$pڑ0>lAe;w!R6&2gN ؂[\豢SgL6{]z ; \dش2!B3C/f l0qLއK3) -&$ƍ=(efl1^z#3pF{lgC^'}X0 D%)5mē0P r 0cԭ~LYժ]6coDZK Xu-DtaJ0CİQySb[C\7{5b51r52[D)'hz+!c@7{F6%ܰ63׌-1C4SDzXmhh-Ɛӈa8+q>lnzG[ l΁mLW tNغ J)v'ȧpݕ/>k6 7G=hǾ!&AjIsV΅p]L-[134b&~KLW 4QQiGnF6g:aе5Vi MlJ 1D$ǤlK8 0/&*t, G,q@1;T2cӑ1ȹf HY5=-^0SJz>[YO9N>c֏HlRZ7@!ZBW O>tn5qļX{`-ݍ [s+%tEp;D `ebгe-\N`[s50DW$C4}[H8"g)u5wu,FB^.[H1󄇇i73&LJDProoBm -W *J7ZE`Pcm}}شJ_[u1[ӗ4c_weM{`ÀH-hh)7'6 n-l|xRX@۪܃!aK飩1Z%AZ灀j+bs{#"3T"e˚4W UBB![j7QCagk;o;{kDvB}kIv]3|"]Rд(h)RYq̨*Ha@J'PmtÐަe53RpY,[IdKO}&@&̓O#6# K׏xڮ,WfĮϛ{ӄ/<=,خ&ۤ!!A@3͖xFDvXy>fVl-ӈ1t:aTM1fi&Kĵ1-l_ԬjEp0=vY?=xׁK/nSۨ49}YC憣EMQƣT?lZ]C?bo{Kn)p48!q@2 v-[Y2r:^sb nSCETF`\.T^/`f} 40]xHH 4 tlFbkPv>½n]R*6yߡ}TØ̵zI&xTg<83F[J_]zB9m8SrXGi hhB+bY6R{,˂!E-bUb`.zY%3-bU{dw;մMem ^Xz/|3n3{`w2, kZ60#q[lmSŲ"66jE$F8>I}fPvs;n"n"r+R<\ kK+I}.EPۘط6}F(MP)~`]8GubBVe5Ieu#1XwL,J}2oh] fjZ7,K Wa|@e֕% Rj3^=rdpǣ|;.޼YuEqn>4 9 =dWxYV[xx8#T q#^_qV۴w+k{Olejb2roO]۾ج?Z 2TG{ooy;vh֬戀C,6CDKr{u!%@e}c"nj3Zr[vw[9UŞVf}HW{7 iDDF,pRieb w`AMvVp7pD$ Pҕ]cW{VK)-}o`[?LlkHzvB6Jx|ཏlņ)<("Gq@гi{^@a@Hĩ'VeL0PG; .,%+Ɣl`T ¶na2.z,ٚSLL* ˲-2jZ>_5tF=3&ۥaw,ꘖGTl1^x뭷 q@iM=o!JkxzAxe[gݭ= K1Ȭ@UB{ mޓڐkRڊuY! hCkOnuφPC͗q譟gm*t9E31}rVl*Z 4RhK bXڂG145hPD5Angg]/u DLwXzlܴVM%usR3[;}nܔ)a& 1BO烴.h}cz+Fș, uyӰJm}p`)Ycw"?'j0CjƄs=>iHtNSվZ&k:@U#ustF&`FjByFOx81!@8" <#vuFhrQ]PpN1o1ٵiQAmkfoVkFUkڅ9U'fW!yhy!bk aŲmv$sXjl*>.e AaD65 E#ݜ%_PsZe:4sr^T&8eLS^qQ|#t»ヒOSx\L"${l=Og'< / YxyzBv8*nA"V|eEVkqR4M~iyxhǒ U(U;}6pKۿ-I$YaQ5svwp!y~,"\2#TUD,*&jQ]EQf"|\:.L싅$Th?j`S Pl{4|*ĀXk#BEfOjGr8r o&m-z`1w e|FSEV&9*k)wOTKyAv@Z1I[}P~(QT@-Ȋ xfMjͺqoY@D2/+ qQՠOC!V Rc%ᕠBȋ_/x^ՎXm/RDbJZxK4V0Kq l^/rX4%ԪdIiwR32)OfN)©UdU:ku< &ޟ_ʉt<.(J 8:Ox 8tAeݤoJe .BPEYK(:CRHؓ2bj'0 u.U &Z0hun|IvBұp BwSH@P,Uu &[zp_%*`̑PdL=On Upٴ"`Jx/ tQ7۹e1AȔ/_//I"ߒ77̯??XkJ.XnQ 8˺? @ vkʺV)>,|vE oGF3΄FIA!e,GPcL okyz?7URT$؊AzULjf"V'=Io 5$4P'hw^˜9jDu\%d\y6ӯ 'IMbLʢ74#7@e hK\Q szMA.NT'Mk/q,y_rxJJkEuIyݰrh[o(~%U)z#eѠ-_0.QKy%lVEh{X. e37\nU*02ʦfb4DN:_ZXxlMIb;ƈZ 1%ܧxMڬ~U-~ǻD~kqdmtiB=C5L-4|v .-ҋԌiBcPEE c@I;Eq%jN+WmŻيkXj3lY573&Q nq=L ޶h?+_:bާu1>pe5{X^k$dĤj C(!"q&LZ%:R#Y;CH}eO$~߾_4 ⺂wGRV!Hd3x Rڢc {/r]_|o??~ _{"G\ *2NIfI ,yRhpY a ׬Af!lym!DX `I+J.:7Fum+d׹ZT66`{5Ju &^s^lvCVx*+{B0UqB)YmAEhۻ̤O߱/]LsʧӤ])$ LY$1D;˽Ҙv3iZvvx~pk swduVLP<_r zzm/|bW!](0+(!fmhC)oooXo ~WϺۢ܅KBӃA?cTv c"¯ f'繽o߾/WJ'a4CQM>D #ͽᐚМ@ (\Rh]Ԫ8|]qdbcleʒfKB=Xɷ-K,hk@ ~-(ҩ"Έ‪I!Z mE)~4C!̈́1 3mu[@BE#:0_.څ_~e`Fo6;ڃ"%kB-e1ڞR+YYvW4[<͸W1}⒱trZD͙hS޲m=ͰIȔ*m*JբIb;mt6?uD q>|[*yEZ+jL( U΋Ȃsm ~jmۊzŷ/3⽀ VsHE}Mq$]C gck^QFCcb"ݯ"cPƀ ^6EQc+LljMroYI~դ~,oGւy m[Ciּrڔ@)CHfԻH\k.ȅq2nbsc}Gy///Yr> ;߾#yC4keˈPӆZ'͊(TQ4"$c&$u{mZ+pWt[ȫ$oˊ4M)^Yru{Qu֦د&kDfVۂv۾۷VwL }r7V-jHvJ $ra$:uP3dsԾ]D[ey1">0h.Q6l,4b><#}@W߾}vßg03}_~wZ+~M8 xop$\q$\ &]4Or}+RLpŪa[ɺ3E% ar_`rUX̤l&"GQ;y=HYQaζi1Fu/f\.CuL6w[%Y) )TԢ,w筴@PR[P )_2_Tdo?qh~Y ܍3u]T6B`ݵSٺsu]ՠCaYmFio+hE >X՛#1r@7ՋF M:]/!c IoZ=6Yc5Q# ئt %&Bd!2ྫྷ+= '`!F@ܱw(Qeő79tpmsY羡!mE%lHU8i`TJml)M'C )aQETUzCuMcvHz 9%1Du~E+MK/.,r!oZl8T@$ Ӝ]x1iRj) Y!IAUU5ZLʹVAy8"Y*$M歬x_ԭ֍3Z &]=$͐W=E $>!tTjc{_ M5 {Lx_;_z:8y9fM4Mejho`q=ͺU& Xo]+v}y^†P5Ռb2ĀBP1v 2_P"ᶪ6x7kSHeBԼBZb25N, p묢V?HB!cQAx1EhrXҕӌ/_˂w,wz Ƅm]7C܍e+:qߑKc a# VB #OaerA`-~[9Q,[?"Rm) 1;^TI-+ba%я@HPVI%5ΘCsiۜGQ*ڞWAS#[7UG T,$ k]רj)y7rQ7ԥaO9 Hp"uTPkHVTkY03KŴl*C*h}F- .VW1FdRDl?_/ڵ;,mF\$"zA~̈́@ooogq^WIZoB_θ^=mipF7EmJrea3e$,KW@v1F"/ۂe- ]g,}e.-6&ʖ5;-rEɚ{2 5+ H;/DP=X(8V3aDHT`ºH[Yc ?;Q"]fl;ۂ /x /K}zòMIv)2q4* P2#Ug,pBG(R 36x;ь8%|7(6 K̺䲵 Zbq )3٪hZR[Pjr vrk ="8ht'SX-mUGB-E7`F4ܤAGAPrXԹSYLЫRZQ kȟB0L$(<AKY 5kF ֺL0$5f^T869K1/S\LSt\QkP8^RXɌZ|VMU@$ϔD7 j&|,JD= !]! 1io3 I4 !w">+zJy4cIBXpd.dzU"ɔM%qߝ.JޗC~[#mWYe*| e0qH:)LL*^&E/+7RPg H=Ղ{ɈD6Pnz)RdTMK) Af|dF@)bhDӌ\/EP!! 7E Vt·ߐℷ??_۪0r_WzhG+-Vdj/+e!)͚ʖG"MV4&?"JSԏ?$W%}[ ŷEH0?y)͋42 {{P"RDR%yĝϱm"YdźlL#0K{rHtkE# BlHJ8GL lxܢ`ɔX!(bl")%A=B 4#bK%&W,\Pź} uk^.lւ Ht  \Vu^ x֠4n7^!kW+-}G(/bu2{I ^WuY,IR\f}_2W3*j#^]`QQJ^d (kiqx)foսEa<&FmWqTK${8tY:VDxƜ>k]esnNeYt< Tnۺd6ZlǗ.ZK"J¹Q)j$"%Dp ZuC)1DSJ(Px, "y9rbHɘu7kOU"O:^̸\f\.RlYU Q"GMku7)h#XJuk [:Bldb< l@yD䨚ɰ3*OؙS[9o"+bb~S!J <anURح6u[nMv#?ƈPy&!R ㇐'AQ)Han[qPPPGM;U 3r)X׌uZ/5ɡv2dgYx11ɜCmDP8J: >O SBNek b1QDD%Uv Yd{ɍX(کE )r}A uEV|}V[de\'5|֘uRB-~Cmubs{.ri{D,QAC#&f-3VA\rYrԁSoo`-$Ր!oy0T12B5>RgYx{ö,)*F3,gIB,"k(ض;\Sj^*ʿs4614X lTܻ]U8]H5pM yCdcYBZ1d(RT#%7䵶Zi43oȷ/_pW\."~{ò.2@qCTi0ȩTAB dJAϥH_ʼnp]7\.I,5{"ń4M߂R6.րЮj!L_=[c@e n=ONgnɑ֥rg|KZq\ķۭ7 p#~H(l?dVeۢѹ obPoqCB )Q0!tVRVϷoڵ0-Fމ6;j-^/:GDu2E$m{!*>mDdx5F^y7% nHn {kޯh*a ]f760_gPUփVYa/1G9vq;H28"5z/OƶELtK4!FB9/H1ˌ4hb)j(wIþsP\neSJӄy4["W~ Lm?J5SEscfsߤ *&[obRSe/=\]nA 6@VbMլJ=y'|E- ,nQ&"\-oEN ?Cz4>*m V8_ K9&xtPv2 "q@00طU96^PLp_6;mu֌+P,151VFr#VnS3͒;P*>!Hy d^v+wZ;?zu]ޜRrڹ7-& 2D@Q|:p^aƫae~Rm5;S+b(k璍}S}kmmNv`{{fH54; ixqsޥpLH?&+&4/[`DEMJfF |Q MI v Nn\Kڶ a.$2n7!3R@_լ$E[yyyq$>t~s+ Tdd5Ɖ(Y~3mm5BM8 px4:75mСPsDд=Bfҁ%J0邪e7!Gj>햺V8x5:X }fL> VQR uzp˯J)- 罻$+F$YUt,+n;Ŭ%Z1CKI6"aEp&iQ1VtD &JHo)1B 9ʣBKq =Ipc ENCWD8a"V|+J]O?K_7ܖAm`e/$)iʥv6nTVqJeњoT#Wq15[Alv9&zeu)P]PrF!3ug 8#F|]'PHb^$$e)ۛ!8S6~k7PۖmUǿ2X֤ __`]7noZ0BԨ-/:`6<%џ=(dk7XJ?y@ (kث ,f?Ja@Ī#:ZgRGY&j&I1PRG& Ldbp{ò, .W;NJHYAVi,+uiU-;8n.Qe;ة7<]pIh`%;a PŒtۚ #ؠ{@CfEYr0bPc2j#=YhDIQԱPN:7jsO"El \ =Yfs'E܃/JWO: qζ8Vss+ՌGBPd$}>LZ&)/Vb{0 |j֊,jAE$eE㑧=46Y9#uz41ޯy@Z#8Y؊u̲YK3О~ɽ ]$7I\Ĵ[׿緯̊(C^%QKCCɕ%e@Ϳd/frBe`U #4\b#CQ6,/n S8ZKcd3f2c?@m iԖ@ho|y>C!8f]md4i!bPUARASn{_JIkM5=+?cFJXo fY_~Afbd&mAGAFMd ?Kk}^yǘ}Cj{0ΰj1-h9]n4l:n .K#(\EujvP3ٷS<ʃN~:,6{sX Z#0% R,]MsqΈFk۳es̵Xu[*r|5T~_"n Fk_W\ҌU_u[OO+8Hr_:1 gDDq+P+RYe;$%`.:&:&`,&fHF`,AQs7EW R##۵dP)xe0{8Phc6)iLxAβHtyom~7n\EޮOBTOh\?eLU4U]S]pf \"81^Tf`@k R81hl?w=i%8ھHeɩ[Ʀuڻ,PB{zp̞PcljGh0JƂW<&^Cƺ]8<(rp-FK#*01BXn?v}zII#0]j,P0wܰj~+4LS@H+@$%|jf.M=V|w~(,aT->ɼWnnE](LOT\+4nպxU4_/e%2yn.j\Ҥb!̘+.3a[V5oe> uPQV,)jvZHz9ېߑ~m$HDy}ۉUc苓ʳn+2#?E1m>H3SƮrqR1VwQA$qB .e:}S4wOTBFzhFfP0bQGOʸ- BAO)ivFAXog;9~y ~M@IۆVp&r=0cuRtu%PsT٭]˜ӷ='FFx_6E~ض"g\Q LB eYyEJ@B!'^Ytq4e)*3m? ,,<*(MF$4eHf^je|ߓӬkߨ]-`ırc@J{jS9A3_lFoPYʦ 5򩀵><@6l?K4BLm u.72֌ZAQP7/~YxWLVb$(V^U  VEh3=T7nQJGu'p 4kXFdpڛu9NZBfr,ACm#9~ZȔR\.qo?~1F|yZ R;s-2>?А #LiHVM1sNבwG (E3rh7F+*a/86O35ڟ[:=\!$&fz}-/ȵ9pxS;,*.b, Hp!=E҄0J+ 51/C3udq{>g?( 97ߊ4V,/_FG֞f531V"wx FTnnx~rm15vJJ9.봭{lڬDګ:'ʍ4Iz_nVX K<=woGP{j,z*3!!!xnTGEجpZT~'+ͣm+-\{@w'+PjM h<څ6Yn/]ͪIJR?E7ʓȥvT 쐳{~{!f"?Kĥ傋:graԢVi%0]&e#VsmcPL'GtND&BVZ*0Fg4t[MADv0ӡ3ƏsKTsE: emB^^ܶiG${ r۳jJ\0mj:r0M߭_zʭR̡."!7Ҿ_wI|'AHM9b0Y9i2bB##*Wi$0eCz4Dtwa)bbCm`o#~;B=;~J|YK},L: `m'Co>Wj}F1* FGe0R^VGCK"u8M|Ō6Abg7&-p/A7v'/ߐο+Xaq "D& |̭Ky~=$>}F,D?_Ҍ7rۘSwZŜXka#׬𗰳xM,Vkֽ lk n1Y\pTĦ2.Y\"inv i| |Ao*+, D1eЊXiK͉JX{Lh!?M%0(rE,2Jj84ƽ#LȐLa3`*`#w  `8 X`j4S+\yw)w0-ciۆڡw~?s}QK3RUCݠS[t-G $]> 0!ԸG?h_`'<Kz)ky!+<ofPYFr5GZqLmJCEap EӹB'qq)ɈP?%X)踠u9uTs[S;RjD) #+%jXcӱV%Rm"&iyV01L1 x΀e ד"hmt{%#w?<Cp7\!ݤjE=X)FI :A$Qji;3JM1ɑiڽhF}woFw뺪y?Mȡ )l$+h|2h}$2abceF8}q7~ç9q_\nr^DW`YFv=mO;42JnAi`5PM`J֥3o[i&/@f "HTfogh1r {QMdj~!G5;kWy?y:Uh/Nnn?h$0 seCN>H¬֨]L|̨m&ㄤR5Ņv[)h⦠0 ֜-KWkkŠ)ƫ(ݴʓ0,K{OܠF%)ryBrJ = >2eIU+ߠH%oʣ "-!A[sVD,1jyBW$_3ٽ3vPe~W V}QT; r}~UAb jrv{Or MI Ic[1a qkv S>~u*/_Yh]?pϤ8[&lfn.sQe)ˋpj뾍4j3REi/`]Zm E;|+ f>T2[tKOIz,4x/+ 1QՏxwJ 5Y S[Czߚ>n!:3؟v{ }Ѭ`L1b*k7Y7oQHh̓U5+ VБzӱM{+[$bP4KdmS]Oh͐]:a?åvT.}g. ۇssq Ar*5zJy 帹 `r#6Pcch?:{D>uپ۱{=s2蘛oWY LMbQ^\06:S4@8CT VE:[%F1֢1*ynz؃ү}7DjQa0636F6hcdѲe69THPĖ%3^F°)+`Q,A2:LN X*n/uL{gχp㢇%0ig. B4LF:μϏ?;iӳ2AA3~)h@v%Ǩʄ f]ٙ"DU/P6Q@K?:c S&ɻlOBtLNPP}.W8Üv%𭨜r~Y~3|i]'B]X6"Z)Y UT1M dnTKai㝄buX֒3'w<yV<̭Oi%~G[ wY:"c%mkVcc]QFPME ݛcCG=go*EyDd(!ޥff!8yh:E7&v8 Y7'!lڨEgz )q;e4*w†;"TCRh5 :*D07\ynH(8^Q;XnɁSWmm:7#Sfˆ_C_9H!G7yԞ4hpVzй׬3ڶU#mTMr m~e^}QתA_K݋p $d咱7ZfdVHf +x?Z!e0)Fr!6|&}f;&6vjX̮%ÛU!kU&Pkkk;#Ӧ.QAa-Knnh(X8\so/ZJ={+bdE\!&=5䍱0b 1˪ $d}U엖 M/5 c`e*@ǁ$jʙƋt6XFlEC;%3rDD a d[7l~qK>/{BH(<O*F_a)yf}8_ 괋4s9j)nҧkॻt*Y~:E1Т/W~ծs=>:4-wд4%qZ%րZYKJmK d2= Hj9erŁ9!,b ǬRnJۚ5|sd>vRAcx+ L'Q8$R'xtFldC'UXV.u`&>?s8̩mbZ|vq"=eCA]! ?5fqGXiALQSx!{=+O+ `ς}2BLRje3mA;po(w6A$dD7VYݪh mϹn駍aU>K7wхFaVܑMs ZvԳxb pv. Q^񅻎:E{7qܲVJ-IxTڻT m>j `SϬ_g*lBeDb[9E)byw}Dv(esDzxSdlJ \!,`UHQ,V )7XB]ZW,Koa&NL !ׯ3R[?.p.0 IpF+UbnJ5I)(pRND"J )ZF뚛nVICԴ{}߾}24tixeq&0#ŨLm6ٛ^D ťJ\["(Hh4+\ ;s*A`XY3]6MgrlW2_A:Fƫ4?Rg.;ZhpzUS^ (R66Ϗ 9֒KTm]heq0kWPxgM܈P0S,) ho{QP*Iy] c  \D!=Nq`1 D%"F _ )&3MWw Ml{M4 VUrg,| eUMA I?L &/܃{eÐ6[V5 $ق#s%>~v<s޴3ļYA@/!c1œwmK(Ndx%sJQq<$;3ɒ9F-4:|Qz}Hz׉Qk;xI( $ *R4JffU:: l=HAz&k߹ |t@mvk3YϼG#7uXtd>ksђa)d@2omȒݗK>DR/o#:YKDJ_M~8j r-wfm>@4Q p8Y .zljC3?RzkAvZc .T0Y:*5ݳU2x֜,% {"uhkeW'Bn-m[SH{pzQ{`#jE2ンQj" #)ZE.:qzP :*32rHEdv ;l  sDC+̌:c bKF,! &wYm 1[Zxy#;4"W \T(UgG6[G4UD,X 2yoooؖ)g `.\.^p/ow_5{Mɝ͈dQl5'kD͊8cH7Oo~#bW^aϪV=G708Ұ?bD-~vmǬ3`뼓B+̓(I9oz8`so"Odw@ 0_.x^fѽxhQF Y2{r Rvc67Hr8׽0ydtck'zR)8=<ǵe{q#Bξ5F͂H"jNT9k8qˉ`A`I^)kk:W[g~LeǤ~L8K>hs7ƙ p?{ G1}* Q_z(:Gi*GN P Ot}]p_%h[THL.LZ5DA#)^9?|*j pJH"YljC_~2*̝})y]YH5V1_f"l; "0"x`Lcd&x-2~!J/;cˀ+¯O<밽xd#* j=y?ۗfDC Z\e!UvD4fCJOdFōp :uyep{v}mm^}|A|VX5鑐=BHMOFo}s4.ůV%"xvV{nՔ'ؓAG>{W}BOc{ڃ|8X3Ib_~^=1,۸ãp{ 4'YJUS+k.K-X는3~}Ҽv=1eE.W ȜI3>, !_6HWl&LU6Hk{)XA?6>;F7r[ h|F:ڍXX#iJ}tHFYu>/|$ h8akiP̉hwY=y3).kԋ}II xL䜅:#6R6f;_񐄃áa T kmr4lz;o:l>KŠ9;&1^6L^݅RJ+6af'S([a# o&>ʤqX<$U[; q~Qu5{`WIqwV`hl##^||o k4Wް ,n7uOub@wExx@ %8Og=w_ B@e)*\-D1f&J0*ѫ]xoFmˊ$s<$~rfVBICW~cpb2!L#I"6A ] mfX>8v9ΆƳjИeMm|A~Nc~]CҺ=%.R9 L@= NlLC/!cN^μ®2~"t!()$#rw95IE7)1w}ѺX_12{Kr?#$yj!!M߿;PJq0IM*-ߖY4z%ͬ2zk=-v y<:C2QXaH#gwBjEKR aoXB|׋Qn#s>hG_gUI%=P@?}dވ_,"!" jpħON?_d=~Ov:c l%hQ:|3F?Cۍ)m0_KK ;B{x:rH$+$#fCjY*w|ۻ(~<7d\.Ė֏;AΧsx_ps4;%yO|]{96{ur\j'!YZ@Qh?{Q0(B4}}DѺ5L6T_WDDdK;ueYހ&%DBQL "B9}9r:MrxuHhhȑ0ϯr/ܛ"6cjl =f_(hd+jΘ"V޲U $|u|S~ OJ _a51k% ~謋^o;ViilJ`jg1!JRڳ0QLfߓ<K}t?>nM#fY;>_Lߋ,:=ʺFm{}i գgGEKQc ̺;w{ oy/܈50PhyFZbɼCFPy?<+9Cc<Ǔ[f:hV~ b:$~Tqɚ<+l{Zo3JS}Ql%* \RˋzJT).ag'{W.x*TF_$5Sȏnim$UdwQCl,okK}^=WӘLqA̦uym˛w&U&$h<-dZ;@ !8R87W/nTLDԤFrL'~ͪ߈cWI8#'K;* BgqYz6n&Y6~ə]IVΊ#.h4rߏBjF; >G4Q8=)ؽ_+|?Y!![~꺫"9I$bOF%fCߧtTP1H?c@#$x b[^5v:Ȕϻ3bz([8 ˗Wi|ڛlίa4tZ;WݓsrUٵ MѳԂ~zL))Z~~3~Qj5ƽT(ewlvwg_MhJ$]|fiՕ m)a9TG=/wAfIs\n!~tJug*t$ CY,U@;\3G2 ]g2FH,=?#q!秋c(ǦɂGzm ~C?;?5#=`3g>lzU{$ܠZ3z_AFa6}2`ᡩ`[ܥ~C %c:?ڧ@ln^ 6fBre+(feYWAu!z~=ߡ=1xM_ʆy@ajy~e O-xdD!=bBhr^*ϧ P2xd3hkNb_,f$Jn-#HՇ[B~nJI$~nQ]Kn$,5h}fbHq!c* ޑkԈ>-Ei  ќ1ڜ{#"5CsV1 `ND).2AV+P k O~F 9RKaY韷gמi|!o|3^; g(Z=?aL!ٟsxFQ[}!|Lb5b{%="z(@ϐ:=:_zygY$&dgĸK~<a] BDH3~G]}"mtM'ݣ0!6ɮ~ޙY;R nD,={mGsGFzSʑ=#!DksT=OqLi޻h< <?GXSb47^ u`|b*@iB_zW WY zbAҍ IY̮w7Inhųl{`_6ݬSGz0$$ jo o+4ɈM]N&pͰU_;bgܳu#7C+BgyP{nt?/Ϩ_=S Vv@uwh83ug#mb~Pw`ksXe|:G?>(e]A޿OG=C/[=JIjɎ]kEubu/< od|,۳mQ_X Yw*^Wj6DoU!M s"=?8w #Uu]}>zm~{Dpc jֿgyeփLGZ`NKO<{Gt7gT@r*Y!9*Qa=)Wo9?5?;pvO88F=#>*o< bD"r4}FXNzL ;f{m_6{B}(wnUʧ367xW8tͭ.>R}ܼbOgFgGDg,\g㉟y폊yLЏzvfTf6qbBgggo9&3=/gO){,tK80 (QOD}{ĩ?c<1*z>Hc MA:3Kq+Q"%bLZwFUʉzÐ!WdC$!U(!ڜF)?`nUyY{94aC5`3&z)~gaha=+d{iG@,q+FHQX <ΌWFٿ'.z^^y::>f4}whvŒ1O3yg3gNqc:~0x ө!"~ K.Ma8Ŷ;#bp~7 4z1ry8Gdp~x* C m4JQ*`P"> |pPaLl]|b0>q^hChA'n#>-ew=8!`),I,,nNh*~sg,՞lq6=xvO o8#Nȳ mij_C)3?D=pdJ=it]NH2>;4F Qhc33K~YȎ3u%ӐGwz79Cz8~=L죬Ϯ/ȫ#?R0~,x'Hٗ=ۼ!AqrrtjSW-:ŸFY?zLϙ:s p(8KXjR:B&sB2E%4tTiq^8{gT6 88{g3g64{u>\0Ό۶ mkB}+. xp4GN~| ~ʶߣ Ei.eea330?sݶ]9ýbf\.:3u =m ,0tpֽe{Oϔc2>[3GGqeg!#Ԉxڛ|}|E+K\,d9*{eH\Bm,4s ;F|k>\7jgmB4F&ƉZI=.gNn|})z~TΎ1tq|#"o?_DzX%\3g{MR3F4{3)Y )}Nouy̮'xߣiFai~̼"#}Δ }V`ng#سGbk53JٯClf٫[ghߏ#QF0^?/"{d <ʴupx&qlW?3H-af ]١m;1CIzl3GdCtߍoK!n0gЈ\7Pw32~A\Au|@{T/ZYz‘?2>Xus߀>3}FEy\@Yxʈ93?كOPz}8RI8x~zm#h}$wwG<{~FW_15!KI)>{a𘨋F[WtV?r4R QWޣ` t `C3h<-?>͸[Xgv_d32j*z<3y͏b^ 鑋GG7@ZΑQ#ϓ9S bQ Q=^wKw4zX70SVsIQ|{g+?~N'6L} g3lZqg,>H?pDsU~9Y?n~/~\AlQM::hi)6_}c;#g~5b Z3bg ~gϏ^Kb_c,zM^ճѲ<>ڏ6z~9uHg]/~!ƪug*D,rׇ׌Q:Կ!+b @;MYP9}_UglN+Q6 ϜFz~tQ/z7Q߈H]_LCe;*jhԳe=SW!g\ֿXz|t=ڸY1̦>鏺n8C#VFZza,6ze궏)Gc./zhыP31G~,a3R`er|f{Qt6=Gϼ'zcg8f=&zrg=ɜQJ~(pOaM6fY=gfܣ asp?A jU]h^7iTyl٫1s[kWA]>1#ʟ{oz̝IjMG]tS~ 5;aP3$ŠyFiXucr/ݞw4EA?83 =aC>QFD==]}T BsFij5:|{=Hg# x4#;CގF/skJ)HF¾0~?ڨ=+/Q[E˞1_GP3=E@pT"Nge~軽~=,mu2~ﻀEyޑDg:{nہbsZl4!\~xN35z?gO.=lݜ(WGjگ^0rWFDgggxe88+F~_`h7b;caŶ͚}lD9qA}٣V>)GcAOPDEo  sS~AL?zFU_8_~8'FG=}پ~f7ϜgEH/CFd8nHN[?eX<(W.EJ ڣ1CN"*1o8A%f%}R$VUOesg'umI-Iզ=ԏEGy*g>{y{5C:ꌐ3!|'Ұ)IM{^ƧzjDeDycd>"`G\Pu%{&́0 ]z(w-ڍ oDNzrG ,~#>V(! }9z(`C@jVXh óq~xf̂HA$mˇ=5bKg ]>A=S5rg8%Q54_x?Ʀ_WuH)ʮriu]ΐhh@?U&rqllGG(\.n@zy+Fz=Y n{r+0 RFvM26P1^3gǯ׏I.~^(r-;󵷤i,dA ]~"n?џ(_aWyN a4=K{.‘1ay$;;FYo-!ܩΑq^Er^;ˢT9"T68ɏT}Gp|3gnTgਈvjTcghׯD7eckV4]jp~V5t,ψ8>{9#33YΔS7oz=(YӇ9Q6>) %)jĚ@v3& #B0ۣdRUt#nÈfL& %zOF#3~M>[s9qRV <{qtScgY\Jg}s9*8F|0QXZ+ zǻ,Ϸ"E D<"S?3Z><{Wv.~> Ha2WG݀C9ӅG *FСGPz(F???rPg#Mg%{o6>vV`???9#OxVtkɜg>|\Xg2Fk Qf12Y0cx}>P-?vݽ?9㉇=$f=+Z`ߜJMg;ĉP@,4bdV[*KB-C =QUg˞mDM0~7{tTCrHM{WemZgѸl-43kX=#a>Qu p=Cmg6#gɳ ѳà/| }oE>sR0#"|tyWMCߏ8C>{tA5}{hB\Az>"L1Ao쯛;dҾxg,}118΅6r[~A$ T|Ϟ`ULяgvo# ?TϠil#?./|(%td8Cm W5J9r|!e>/̨)Zgέ?2!xg$3@$Lv;̀?kdgAuH>qC?:G(ϠV16C=WiHuVa0 1j$$@Ht4R=-7φcBގr3N~v:1 ۖh<KOVO;{ obdϙ )|S2+zѝĮwk|p2$C/ 3hTS gpZ,͓ݑ^j+b8|?0uM=F}}a7L&c^h&fP8тGQK,s~;(Tq8ୈ3֟mqxƅ 㮭X5?;i];h T)ۇD0r'BBćV #.3Fm^usyb$QF=Vؙ3`}Ȼ ~T֕Y6|&u.ͧ5zV6N8;$/?~8+Z}Ʋ> on`2>cc-*B)_ҙ2#~rюkiOMރ,G=><8څ Rp1X/GnxC#R]j=lxavkI"s?eLC~5'HzR?S>ٽ~\ `o;W4Mq|cJcGdܺvƾ7ki?۾zeMW<.VQ~LPfSF^U>,g$QSEshG(t`6 h2*܌[w0EH:ïg&뒭8C ɡaCj}̨yxlL׏x af9#P>3?kl#k8!=gK<3CfF _;](#!+ߓ>mc&aV'[=lD&?Lu-4ڟĢ!QGЋYw7{8H O {cY?pCp7)0MVA,^HYw.'gh ,t#ӥÌ' Ͼ}VnAQ{23~ȱodS1+Mէt|Y3y_\MOϐ TKd Cv3t>R;#>G*)Fr3aTB۞:Gm׎uׇnbTI,F>z(|Jo.G}g/?z2(ϳՏ?RM@v2, >7 x=y63;Lgiڏ#x&vzD89y>bu(cI^׸Ok='g]~v3̋z#ϳ }!ugc^O싢9%y==Xhf Ǿ>,8 9;޻b㔌kbңCѣ #LϬsޏ]QH>)G#z uk-J gʣGhH~;,0nlr79-lC?}$Lu Wϼ96,[|<;f<9Csbn3/ZGg~l>zgT)<>zo@yVtG <XU8g#gkz|d!s>s}w$U{o}66F@4dp~.xހu#h1?OϤqe?b}g#v.^i2\Ƈh_+=/߇~f YG',?gl ~6Va: a1ڤ{a!R$NهWu;2>[?YfٳdV?B};x[~yyU$6kG"}|fO0pcFk?S$عftVu٬9v*Yx>FC =F3R`M dmz]YGuxgܔ&͟El>κMY6GgbΞʍnܱHkƑn~m@|ûGga4"6ѡsТa~-隟mqM}D䛝wf{V$wd?ܥ=V=3Fդ*vh R={<E4K 6"2M")>K{aHHi#MNn25fF Y4}p|\-^:B,w}!33dϣO={g#}E Ls30bӚFϲGR9|j_0v:rt99o"& Ӕ<3\w3|ԌZ rf=OX=fNۙٓS_C!m&\P !dTPS sYͿ)ʞ/Cs#{L=v5o=1Y;U1VjMZ @1Q+|w<L~e#YL3b^c^賙P~0ݒJײ}{Tg'`B)^ش\\ImRJ?zM3]0nw6 %}=f,L2й^?/눑.нٰ÷Y35䩥C!ʡ`8Ce 6>#y]Js6"<+lfϼչFFj&g7h^|yơ2k{vբnP+P Z#03"ebp#~HGiD9Ԛ@}<Ò`/BE-Ͳ!JaB[ k]6V11 jpۆBs+ˑΏ9zh#9f ;r"Vyël<.=%j 'P|uh0`V- "^km[Wۦ1NYפ(*`q e38Fc<Έs) MVhΊLS:bhpQe !exh̅#^r!x]Њ."D8XCJA!aߋO~nV뺶g 8Ш3o3|3PWx<{qF#hQgY#n&ژs< :R[w~nϸԡy>GQԃs~=ӿTf dRڞ?=~65,⏈i¹ FF{?qkFvJ*Q7C*uhN C#G#@sF037g>wc$-l?GB#3({9\Y63bߟI>LWÔFRiGS{f{E)G<|g-N_e3>hE ȩLJ5b{I}6ˠ'LHO]ީi$=#y@3гFA.[ЏMF-gʳnl{A>*$ggD3b숴zv8m}s F1 $[^`hM|*}pOJ `q{BjУ$#>>zK8lb ly88$ O{V8$gcgCogn7|G92sgog2/#=Azlp\InGt=Rή/F =3}qll7R>YSL}z6x6>;?*FT*ћlӏGVݸW)lXcR#8 lIV8]gүN1&?L[{L9,=gU;Z!qGg' 1*@3Q,܆uDޔ<.o{䣮罌ȑ9="p\ ^z'zg{h]gt>nRKsD&=}s;ЏZYt21 Tx#gH%/>3پݣsD(r_ i&6k@m2=:bCCWuX_Ȼ 9\q_ x}yA?~#3N)&tըt߇CQa}5 su|KK+ViJ!o )&0 zv<#Ds{3gICX}TO g}FN(.!7 %-yS6γgI 6|<:Z71 1@ؒ!1ۛ=, ƶ *3JX֌kY.TضuݎiJgSi}h'b)a+DWBeÛʦ Tx13'Df}2 mg33r_q6ћzR͕"p~7P @ j"w0zlݏ\%޳q~ uxBԊQ4Z@7x4^ߓu!O]<ڏ 1#.@"=M7MZXCbjEe?CN~8"a |T-.+j%1_x׼~mo|#aCg3ГK(3+c(jifWQEv #s wA](&ٳncbD~@1%$ [3bOT @TͰGUӺjZw&8U66 / *ҚE>Rr<_ďc ͚s%Tfle;r =0;ިT۫C;˞;m{}C< U"^ϓFn^=[9 :\YHRFg]tݨR:ŧYY#,#l?&E~DFu.-r Y7d{ݑ?\.o<{vY8Odr{3gw7,Ʊx¡<&r3>3%>;1n˙^l3fcd^3A_ho{$Ґ^N׿߻{60ma0>4IP8φ=c!b]98E$]4.gH!1FD]3>JV A3h [U/gS/߾O ^`K<93*OF~Yrx;H}5yf0WM`a5{t$-Ѽc6/O*9s0dЩw-Fps/ i=2x4ڤ>;|F6qON㤜3;p?G$ܞ0"232i#1{Y{fSL@Ǐ;DYj!#nѫ&FD1Z?>'yKCgmgG/~&Fy_y|ck_܏ֳNB_C˲ESh=" pS0͂@xO([|*H&$:>kgt#%eUY$Ya#7ok0XG1}gEϨ?~ιv4Lz;Bpk%t>84y>ޝ=P3]䃱YF]AѼ~ 7#>fu2K!2"U|hOY&\ ˌy?+ob->j k4YT*S/EgnPm^EP*"؋~rio!bY6亀DX/IiNC[}U癱P-Bholy|en!4Čf *LL~`|f#ӑgō]с#qOì&nf=ons #Wx םwj`&1TB9βY  `6(Kxd(ΐk~l'0Xޮֿ>[aMH};M=+|8_ԪqOQhx>ǚ%_2BHHezҚ&Da(4#Pe: /x)Z+RZ0#o}#~/" 2O@nۏ_oo2h?IDO_H##;t9<[Y7#2Hb ]AU*<2zn3 P[)hk\O(2EIydZY3zy0CFsm׷R^[^6{ A[~n@hl=\EښIF5}{[tY(V.yjy[ZǣVmyT:-{4[>G\&[R^]2҈ $\; =4nQk]qHwϟk|sMŪ͵:\Q =WS7  )llJΫOIb;'΢ztʦ<4χv8z v8PI8c<ء#aћD@~p'q\ᜇV h'W)cDJuDE޴m[[Z[_(-Aڬ~Z3>\LfrWok$>js;^l;M-39=kTjNxPkqkWM?=%-u=-Vwhá-s5w`jY8:spP`5j:eVԔTCI{j%3rlM੆-lkkur <> %-3j"'Xltk =6_v|z|plvLѷbT.O;9k Z+|xR=Ax|88yl\9~~'ˈחw\3%!J!C7\MP]bC /ɹgA_EPh!2W4*tЪ- HTa) ڎ_iAxb>Yo,eP2 +RZR\VP3:Q0e@H- nn S:e-IZ39O0U>MVeT M+AD^y=ZPRZℂpqϝ ^M3+VAh jִbmrgHJ,Wz-N۩dw"kp$}ߧ}\Ol7^gYYQ%65}5愼ޚ*TV{L4 9I3:y\PV,1"e4NgA/ZÈ it@z|~䶃Rϟo6 /75S:kFev=}cㄈ}cwq1W\gLa eRf@W|:o,g;L%A(3ibZ۔if5|F)H5)s`@#`Ye +\Q= LT镬 B8d4ߣ;[@tY: (ߝUdQNK?Z$Oj}* ,{J0U%QckLrJ8YZ."pn.]V@҈QZAfY3F&RnYmEh%ҵ!maA(M ,A!J:K$0ix(֭!2-I(G!SLZ`hj`GF,~jKP+uƉxGq"h]yP<{U(X0[ry{2f%RPgCBk[bU`1Йi@HF@kP:Y3m0)E4nKOTŲF&zeZSQKtMV@jjPʠܪ./ZYqE+B|BD ac-~Ҙ&h8o19\Կoْe.tDDR >~Y\.'oo ["`LnZV;L3r,01@ )_ŃvtSz|К Zr ɪN\Fvu=. V3hk9q>V V<(&^n2xO3 ^UĬ;]XOktw]gL*Z]KZT:_V?)xw6)`OӐX:>]o3H̢mZtӦse+9= fe҉R앬B7Xxp\K&~xV$0}z0ۥJ1'eu:ƕ>7 [Mgp\i4(μlTN=5o?T"ou+\qkqSj4zá{0pn*<)'XyYƨtDL+@9[nzIŗ8|A\PRn"z2T@yK)--D9캴gp:䵟ַҀȭz&uRBkyr{gnCY_X籁88|9t:zIwx||ȯJx sP:hT+J#as :|MX[`5.#L1)/fnTS-EEע_c29o a(3/U{`RC%D^r,7aʻmnSȕ̢QsSgSJRb`IyJU QʖkHDPXi ^2SP," .Nˤkj1IvOh4QsNW(PJdh W~I }kBHBPbqQJbw'bK X*ι7i&P+5SP$GQ H .ԕgC&Y/:B,aCFA>ǰ.7\Y?tL{I{ƴO `8${{Ds Zx,wy01YT4F\.'i"&x6q拥(YvH6qQ+ <H\W.(--II)}}r)ѿj`-:^M:qkYSA Sb 64ɓZ4ܵf+~K$E?ŌkXRɀԼWzNBH\j ?OfdHb;UwljRHZBm^#.vBu_נrN$B$2zZb̪ڜLyR/*q^M5œ4qTlEؾ021[$/}^j&DZ<k1y d/[%#Jvtlш[R1FtlQX\x Z.ЪɻԑC|Rw)j}(LU3:Eq<q:J'qxe܇P!DUlru]TZEA8FuqF7JpnRi|9$Ӆ2_.]6MEBU 4 D5TK?@L%^!k |(˃f@ngٺMj[*-U%ʪ|)Xw.`+o|r n&%G5.)koI)Q`)Z~cy%#t=t#{FS$N S(:*Y=ΡFU >jUd /F1`4O0w>km~Wh];T)v{hMx$Z7gFR u_Pٕ'NcvU!gM1+cZkaA lb*&ll7{k{ *=Nn*NO|-]RR&@UTh0%~"b,*ΦUL _k*$5 e)"}u&9=-9QIH*1B4ڶzrnɻ^[{6S=ZSK \.ۦFvh#n Ԟ4MWmjQV^8W>s˼t8&bhҮwZ PTZ`j#ƒk'l"Ծ6Jg<&k- @QجX Um.j`DfM /Xcz(7=`T^ߪZ{Ua7n2Xx"0s( qNZT]@Yu Sf 1d_[ThmߤX,sw#ffЇ OtZv|mdJ[lR`1Zm-\k |  eF,ݒU,{v] 8k|m`;St,QE TGNKɦѽQċpJk)[4ZKujw~d|JA+-Gn/3?AhD1"U,?f'}eUʊd)7_gꘜe*ITSd1aؒ "5< |+w}(S797''2"-ʙkp.ireqNpO'z Āzk-yhAy\gt}=]v\ʤq,TjttE`J H!J)"Ek5{k(0‡!Hfaz·j (L!ߛ2"F›/M`ȁyE,YUtYU2ICr>A 0#"9 g /K#4kBF#\&{`TӃ "J \(KnF^G !0&KtfeTeH>wJhZe@T 5X15u gt瀮3>0& AagJ~Xk r~L~q:6 Ur{?tTDH-0%Nȉ>:~BPI?pB#NE:7973P>߳C'C'_ 3W>:E16Zhq0>*d`1D 솚 \8a׼wtk˟/,Lt>"F c0CJ;蚾gtӼ.5dL[O]{x;35Y'u@JQ$G |8brXhG`pQ+<=sx{{ό<` W|{qq1Z05w.+Ν1C褞wx|z&{x8:N8].ZP1g/Ijg \fnA,LCի?KdA 9BB8!H$t@t1:kLb^#/o)TP+cx|~J*bR*w>/8oW!yLႠ,u {>!R|80 .+p8%~|ttJ܎}}y4M8O,vZэ L=ܜ}-3Ƣ-pteZs XKT7ݾ~!fT Bgm P3aҠ([t͚Ulٮ/|)QE֥kXR@Q_ v}ΔR*aÙD'H=<><{פx*H[{ZR"Z7'5JVj^V,\ׯ;Zy},֘\ "$H]`2)RqxG+//&o? a(NMv&F(ݦGE+9,[.`WM~Aao<2%un)f#cDEӂ{K`j5sqƶOFkDcoa (,Av .n)O'3Gg-q>Y<<< ]p\p\hr@eМ醻!rzp>>.NӄagcƘB'L2Dh&E5nfXU I4dyKvY@>,[t_ZN[Hvxk͓Ҳ*[֨[*J;c)MS \9@S g9(]meԳ 4+G(zsoOwKjoL7f[4[Cgj$<3^֝Pdh5h],wa[L ,Z['R sk })RԬK1i=IlyHpp%DSzHGC: 296w \.^gs.~e'_N?N wᰃz0 Wa@M9~4"E1{\.8NEfpە2#ipBq)TՒ -rmI[J:3]C@-2#jw'TEzX*o0!|];bQܴn͓q#]Il&m8d YSr:W4QOZl"#Z/+{շ{ѭg i\|||`Njط.rJ6Y="sO %=uS^9WƇZb z+2汕3pj|<Ɠ-)xbC AѵQsS|EAJ1GD.! bnN@m7&8t:e)uR14~>O,̤rM;u]z*b$~b&VEf1@=n8['ƵGmMڢ ZK{-+F"rqrZpU84a~,UׇEWDe 璔UQzلWپv 4ުo:rmCݻ9Zm_Zq!/ @&뢕ު9Z#H-vDV={HtTT}/8a+1PFxY$/EpsںH fR3`vW4 q UEYHڗƮ{}}T>_I| Ti܄W  lO%b8\}s!IQ 8I-/=|,gf(tVLEk[!䉁RI@ȸZhqG kAo￙h]Jf&K.Dw1F2JE#WFvt:{ !`^T:"&7BY0^cWkB*ol=. sQ{xxHݬORKY*dncq?mwZ 4w| ?Vۨ^]Й;O _r6U 5Oy):%D$2>[QCF;=7kN{ `㬙|bZ]s hYK>kE&}[#V,$Z_u {77S9ͲjZ@'3Sz2ѓ~Om4$ʟR{㣿#$I#qck*=5J*kIZDݰ1n}cU.+I ~Uhp8+;5p:ԯ4vcr 0FM.B8 8_aF<0dt{|?mW8|~/Zo Sc`6SoJʀ;+0PӢZZ jeˑe.tE$C1>DN4{ gy>!;Ai}ZDf v@mP+mHc4Pl=VEk@M d cp] zH+a%;KT5uPV#Rs,N>#?x£KX%˱naźHbhVz'yqLaǟj'!͢ 6&oiV",:뢡f-ǀLrQ]^O2C&keoKqsRJkMw%gݬuQiZ.^3!ߗ/?!7 c,<KR5]G8Ӑp!82?oD~ ϥW \.R`eszLů3\Ф$Юչ =B|׀"f;Ϲ\LHe9QtXP旆ěJQhl\*m 3r8&E?a, %y e2X|ϛI'@gAc"Łnu 38rFU| O k:]؊.˄d1 䫤(A1d69钜 TZ 99Bkm~jI>wҏZA"wʞ{C);NH;HBn 8@*?U'I+R;P Tq iQ!|/fyKTFl~]g(\Y}K:AR!_;XsyTh{Bp"haL7]d_){"]6R'=#p*jWXO-X!,,׾wF/TQ.&j^I!t<ѭ1Os5tB K&~Y!f@d[znc@ t-kXD2fixK0Ph5rM%׶F΍AE"Ckn[x8atw)]4 b'Xh xh׈ա,F`q<;Nz!\dft1EWQn8gA K-^Kd¶DE f6I,qxvIEź"CBKorX OV raPQ s^SL@vۜxwХkPCUP6iwE˰٭V)5@LUcv' , fRKd/8v`s/{M!hڢZgH*BT5ع1ONRA67tU芤ii<@R1lVFzjXϣ$7<RSZoZ^rd.F"ZS3yKDZ[KnV7j.D4xnEjG7ޗ9{<<<ϟq<&H}oZdrGcwxzz/C\.^{ʀZo^ y]fc t,"MjhlѶw Ny0YFi%,-ؚYkU!+DEx( ;LiЁ 2YjK7p`_ZiDlQfѿuP6*49Ŧ#{밬! Y;%?\VݜVUX5>`r1ot i̫ &$~P!틏cQY2eO*\J l l$ϥCd[f}S7Bī6@PN,{TMՎ<[y}/Dw!cQU0,a  usHFVYp ߿H0 im%Ek C;?ϰ`άa8 EtyZx#͠'+ҞqMuj8%R4H /x^ΎjUNElIQQ㮖#bߺ =ᐱOtp-, ~Ԑ(5f, EN6ʭ(_6!2;Yƪ2d+:[ -yˎdD٤E-U;ѺkUxdc/ (Lx~>Yyf0ߴ2%ReK21<2J$)WA6]UX/[L(kE7ےA4Nq8k SP g@b͉ruQi,+R*B$6L>kr1DWg؀aHٚY?Fm\q$KAP>gxx8`8e<B1#Td )s*,ZuFIuX;Y-[g sHXg-Z+T?/tXw[V7=0bbouRKh=Fg3VU95ws6%5FگF~$׀L*{VۻV}ߣQꬵ0$_K[ `Qk"mQ߃Uҏ`lilqm59N &*P4RmmLm1Ϡ`-/̄HZ!xm(}ɥOϕ]וh13`,aU}q,:ۋ%.k,Ƽ$o* f+LKiv#))><<JޟS>Gz{_Y:4*>YW 2W ~QZc6K+J^YJQY^Mֲ򲷩Kt&1D;G ӕ ٳ;c/oj61dX*qZjz ɵ-Vջ՚$[sM1e#qܣk( d{I^2rWbč;Br)*6ӥ?{U@U.7v}DWdl1S%䳝8[+ZɫFVūB=iuA3~EFZR[;vt ^/x}{Ãwcp8Z:< Ls#3)Yzq:0#>}O]>|yVC%WStIX"yh6mF!-Q-ўt@b5d6WJpO+.XˠNUU JkBC-Ie쥾k<=NgpJBO}YDSʕObnFU8CUi:>Oq*VlGV):fu4x 'xq:]q<"e¨>a;;xy|~GF_rvM5  |P&NJjcR[hhx?%6m]$2o*f6ͩ S+q`ZخϛXmIb;Ũh0 ɢ34^[{x󶋬@JeP"CtEΉN?ÄbBH)»}ϮTCJ>p<<OT,p&O};fҀ{c.kY5K536dXV(-(|5U/y6lEA).;l eKOZH֠QD~|h˚É lWkwdgcẋXЋLrVU.9ư#5n*GG0)JP!DG5Sw81Mڢ B^V8$L6b>RŸd9F"Ƭ+A9#)k:ڢavЩK pS̸@)"]OD|ڠ-dϻ7N;psm Sg񲔼|O䝐{nD"a{1:{6"jo0/"F~ c_'x{{߾@ ~S=~ޢ;vEXnDTrs!dȃ$ }|J.)g Vi?]ʒ;kw8b0L.hXcl(_%j`x5#LyMj[cYH(;PJ *PFڈ =;?rf\nN(Zr% %P5lV_YT Wlz֒lzO+υyPe4VI /RFAE,0_|X记Z|qx Z,2d)|Fd-S|)٥uҳo:CNN**F_g]1!"^g"oh:x{{){qp3i<~ bVUZ1$:2P*u3<ԢDZY<R7;(^iDfuܥg`-Qykd'z%1͊"&֩-%H4wNoF]k3<q6qAmA{bh^  =B9co/xy<&0~7ˬx ށAy9'5 mEs@՚S56##!nj儶e[Y` &ٍ zebB:S8$H8dR]kTRZ?p=Oӧ$7Њe\-YFнΔJa Q$[ rPx &L*RL++O SOӸ`hxL=cDN6ȐB9"]Z~2b{~S#ޢwmH09v=^.۷olS$OIuJkҊ#FqG+C!uA8 Ur$(!%`)j4&{e ڳDwLd$ hj3Vz`ngt!DxOd[Ec_p6 Mjjr8WDZ;DZҤkӕ~ A}z@-~a2ઽfPREHL^(5Jm^.EgRUDVJa.pc߭ ,#/B?1i (j{M񤮥oQöA-Ry6i:7$p,3xmԝIN@1IR5hpأP0zg̫o߾{4n_uq<?~1`rˆ˭iJ@m-^*fy  <%I1e~L -HKe⦔|t2_K({>Ϸ_s5:*w'hj lsu;t-rƦd_;68_.i~z?~ pOꮙ拆}*%$KABe6 . ćoX9ol!4NJm$DגI fPj-R J~On (ltkv^pՍ+@kNywi< 6%ۢo:Zb941~XK#7I~/k'~;fĹamoYӿw;heG| Z<>>‡`shAj>i4oſEH+{*GRt3C8p`rL9ӄYy޻|Mb͉Q:I}`{+aBHk;; _xz>vbĘ|0LcۍA*ṫfT"O3+WmyHj⎁ZkgKpVL5D@.'^HpJlXz%$^<Đu<5F ױt b$(iѩ- ]7O1QU1+|>ս>*jg*T3?OrA79 U֥c't.c6.q#f</ę3qti X9Ϝ'9(w>W@V YUX (jf0E$6H ~5{$ABA lVּ)9?Ǘ_Ego퟿a'wxx|DMI?|%E'S^i(L`̕M̂4I ];%>MߪD[פT:h0 [0V_kWxy`*#< (ʉY'LІ?Z5|`֬B3g=<>bx?/?/x~~ΖowfœϹ@$T=v;y90NjL ,Ū~E\ ܍^aQ~[Bx,s~J ֘Y1C&|ϘB{Gu\@{ +)_ˤ8LS(-}DEaBr ΥX1]G|WBߟ8Eû zv6i'ћMu얭WN㙅*$ ZjLSjHf[U۾&yʁ58lvW&n FbGYz2ZMÈZ<<>@k mL%unNgXkuvuviBȉȬO駟Btr0 +K0> N=Ր|Ƽ֦Š7OO|(d^ ;Cu 풇BViG8\s5QRuާ֖qEMcRU1 %uW1VwZTEI-qq0E;U(!"87v~>qP6*3q >ÎӐDr}osˆd ֈ J}@^izq';6:&/A1:H-*-G3-J0IkBTs֙A*F,B^KʋEߥtKsùiK[_wW-|) 3 qwB>*J5.hG|R +~IDnWĻYZ*5)ޣS=M3׹ ; 52zoxk˗/!r9iJ@K?岐]Egl]psW9(ꞌ_bՐ1F;)5OG]XKxܒ$)._XԵi`!bR7ŲQ-ۉA&rhM.Қ׷/Ka?LhQ (GiTQ &z/KZmfD:(#X^'SH-kÂ'p9g\2+2GN$|daS(/7N#/I*c9wKGB^AL:@ɥ>(cܫ{ gs?_-&V˚ O ShS-M\n G0 s) B1&aR8t*?*_ d(A8g* /%Ueղ.qHjC4MnW}6 ڙX?TcZEƶ: TpӺ}5dX"o.Jd<Iʂyo]J8А42u15w[% hyIm8zM\ ðH-L4v8/>A+M|2I -󔚵VxVR9 U@@zJL>Ijڣe 1> \1[ *WT`U2`=Dx[ h<pfS[1R({L.j?Wu*E; Jy<=Dž<(s+*2sx}Ma6ZsB_'tO%[Z59Y.\IVgxǒ{)ޢ$dܘ]NiXMD Xa *(vZ󄺯;kJ*@ >pR|=*@~o Q}_:);J΁29NrH.;[HÀ2; hIR?JjZϚg-.wEP,nɪZ(]`-AN%45*dSc(ƶ[KNjI@MŲfu'  ~X֖ ] T )c[4C;"% t#S >TOiS\x~~?>1^^^[x PbUV[@=%Rb=VuCkpHDVHM8m x<8$[Z$&r ܖ|[UlZz+;ɀHDpkv.P[tϛ<b0dy_ &R<DZ F42&C$tjߺd)~OPiS{8cdR Hk͋i%k%>qKm*(yǶ\vy5.&;o'ܠբmȶ'?YiHzwd.*knpDhU>5޿0~Rr)r4iR?~T!x|Lҡ[Ս 30Y Zv51g7TZ#.hZ_ T䘞cb/Y㶰9roI<{ tjW?ǕԒ}ڲ,_sR\XcXx˵X%B브=ċ'5>30ƚfwp{{{+LSnW# gʫpJ$x̒s;bU,eGMi{$/`k`YYkbUBop웓:+lu] O=ܥωf \sE+C6l]QQl\|)h B}BSgwC\v%vT{(Iw $^㘪4&ؕ_~z0 2{2F%!(k>y *9]ˢLT! 3d|b=J)(,%X!f$PWPV]eXҡ:TO[ˡ&Hju<VXdP0rbSv]`ytvJ@L(+~~5 ?z+Ϊ2 ɉ3%灔ѽ"J#սTJ2}Zc,5Tv>}c,wx{{rA2HX‹)'8Ũq0pnZqIȄVV1VH%|NK{L3Wμ&ߝzdSEG̯{Cvx"I&kZɓ*D\+[x ˄XtiaKfIag$H|E#=Rǩ8P⩥T*},b[*thbPe3$G Y7j^x ubĬٯ&dnr Qmj@N6$fz=<&7aaY{g?1Φ@6O`"+}oB 5FguqV S3OPY"8GVZPX5 4[YIou^G:?S0&mf\sEU$ TMaG`y6u1˧ 2%Ѥ-ʂw~rM -ZlI9|mNqdĐ%oӍ *Dxh^5jP Pem~69>U]C1)/ zb!Z9jvX%i.b: Z=X!U@m"Bs7͋ᦀi@[ݥ݇~gi%e\(;dIulBE&BZYt0u>&0nSƽIqt!@~g&x|8PJ# E(eu3!}ݕ1= 6`FL_]R#e t|lPKr0»*h -F %OAʀB P! &X2]񣨵iA-؊R ~A:p,Jg̪8!xK"=4ta VSs'ĄHs|rJYl%b3ٱw!nL3FQXn<9Gk1!_Uk4[]tb WIc.}Vk[˿_a0:c~;[Ogw.'I!wvh$qD }dLWƷ\ u1+\t mAe6xL~ePF}4.GahS:]g2"kikH*axF%ta%v|L=u%ǝ,ICʉF{Q!FlZ>;汰5;0ė)kr;YGk IztLKi<#+d$~Xk`=r$MW҆LÜ8$û%Ҳu{Cy'ou9-W5["jlBpP*&[yRGPۋBǻGimV;gl1ZkA^;A"]oG..^zK.ئ |GHH/ x7))0!`:bVcp+뒾 :? Z-:'1D}-$ouY} RlIZrDY1"ej‚J60&Q^ܔ v2\R,B:e;)r★~,.-F lKmq^S[vBt*x$Zw@&pibcH 4EjAvi+uUJӽIl[TՂJjunXd*cgGG|op~A-E+ [ԳzYDVYK Yc ȃ+pW}*ᇒPiE.J/kn\4{B3le\v*wN<`L= d7$pk^1*a-^3!G[V_@h$o)2,.?~M-zGg;m}s>9jp R)%L9>qgwN'gB&{fgKWi5+ @:]bUfJR(ƈ*OI'5% 5ݿ6vc[*a+`pIw h>$=Ws6Q?u˻6J`dRKz ȑund!#sq@N&J+B8zOg G(#N4~k.[`Eg=ZkvI ^~seFgllyV]-.**:[ @(-F,A]W2)8Brb8C:w>#[-O_3 W a?}1rkU" Z>>ڠ #6֢_Mk[g$8vRe50NM{<{hPbּp.Ic><<Yd}{tP*Rw#~ >j?S $$5fZ1ӟ4YK':el͂6\ G>SΖ#tGέkP= j;yRk@2M+K Ə$'q,*y7E{L<5>jn)IU J=keBc0O8O8oogX;G<>>f TgRlث&"`K3" X=uT,t{ܦ4 BNa?>xs_|O?}e4d!D B#<2Wx|EVp H2X:DAf2pRє]-v `cpx%WH"4madkoZ/Yrmlv=fyoZz]< .~ J0-@ =L2X;I .6|d0Bvp^3E-IxxxZtR~+b3#W80XW8u}iu,:_m$u,ZgjDUͭ$JeaMCD/3Y,(m*kQsk5$tQwX#y8>SĢW@Xꅇf^p.btO_es~3~7h{C:bN/sqmS*i6hUl'vUV-cB/)`pV%affȭ{.Tå0(9=_qXkx.%XYݮe F[! }c@MKk1xx?d!D/p_zzpP:kKn." ÀY%51Iϴz.hjdؐbFGB @*-Ih%A^<FF+n1 8dU0!>;b}RAI TLJFiXm`TRWR]'|zzƾ%}j/w`MjEv_r+ai ++#9pQo-WrIy  ӓ*Bpe5)EhD^t~N$ԑH2JgE_+;o*f4w@>u]{NJ`6JD)*,jΧIRЀ5r="eQCT!>慬kNF+AU2LItWD2(=Iל~,¢6}.sGW@Xc~? :c<.SL5Hk֣. ִN{$ƒTd͝uֹ{H)J('x\LZZ+NCǥJ]N8߳Mm/I?8 oos?=z"*yv=܀W|;O p~D>'|s.W{kaI5]>Irk( 8yenV`S+$2$\ЋtrtE^VAAEFJ@j]Ún {byBn֒icª:BkVZ.x0$JRK_C:h>T}*URw I@gB;I 會'4ˀ1k5tŏoWX߾}=b{q#^rzmcAݒ8lE&{P(ഷD$XlevDnw(J$,j:$Cb8x P f ׆_L{Vm 1 X*V-Y 8*y<5iU ) 騲&O>@,QywUKjl4/t%YwFٳ#DdESyR_tHl9zR,y޽ %ļ%iY*Aim'Y ˔$F"^j63S$mU~XeDlkf?|jN5>x{{+1iK1a?1Ŷqt^&x~|8]q8t^`aB&p81Q Op.' !#bԒmL^٣k,]\gwXER `t 3֏EBYX[ ~(>h!WK mzG֣WUŀV0dŇ@`Y8 ʲkL+6Ivr&f׾p8%L7EnqZwho߾5I4E_x{{p~R y48Cc,t"&cCZ$f:4-NW+ng)gY 0=gfV1vuOjnN#YAK{װ(k" q !&I"$CV}x Eu &"ߕeZ fe|!#ֵb(tEU`cnՃr^Қ+MLgLj\kE12~q˥(À\OOO^x}yA o}cFLӄ2{{}p13Yq!^aފEдѳv+wÐ]I^/~ ȷ2.)?{#1ɍSr1>Lýb}/Ƙ`>e'l2\%o*nEqsUfL1:mn| %}dJ)v;ȕ6Cj]&aAyOCޖkŹ@ʎ WHqGCRGR5k-nB1'0^+XPHֳf]CoѸ]Sjg[RDO%(jQ](/[,khl?bcb[|z ;WfSj*N>#ޢIti--.YH(7`t{knl'Z~8ТQ4BSI)c 1"hRlژ5V pKTY5U&r6[k~ *Fպ`dɕ?<<@)<>>.K)z(e$,Dfl`&mP0uPRdZ쉳WTk!}fșgj.٢Y^Q?ArR |)h,YCR}f08#{p09Qw\qWoooZx x}}]8Ki𤫇EIJ-] 1/w1;nߧ2jkmEՔ-EU qr97n}; bJy[_+RøFwlj5qkMe˥6u8@m hg$c |CTݻ7!EcHG3|x~z-ȧ?/=@>#^W }ߡwiOcXm* U+$u֬I/3;3~m{>9&?tEu!Yhˋ*U2%l,<9Wp:áçOXoa׿}p8y f-=} B%]iea6*5cYmIAYw 7Ж'ˤBCǵ^um`V=i|3j@ԂUbݓ,ĸѬơuLk{'Qr jK:an}5+ec _Pj^CiJl麮iD`ZP #cF* xpycJʡ?N6Nm )|ß'$W^AڿΤ{;O5bZE*] }J%VθGkj~C$G0Nָ/D^Rd%yǏ"'rvzp8;W Xq9X4DBS[B:C:t`c_~ ߿m~~Wszz4M0R0dѐ[vc lshApڢΆnsgB:[-[4 , .;bs!7CX1,:=-Rk>5c_!i"{2㙈 aTHB] 魖.C [: r@vى1L&fyXo2ou,UҷN~B_R{Lӄ~ J)|wGܝ;wPγxŒ*4a$H&G^!utіjilK!9ͦ*P-~V5 91a~"Ti눨"M}!xLp3I.8M#zk5v8́}Vk*rFUq ~Y8KIJmCiRI(J63&0G'>sg_9)M]|V)k@Ա#8}_~_?ONx2 9!)g;%Sཇrs(kDLS. *ZA[ I4*PO>( Ԯ:15T̲\Μ'L%Ȯ&T9+**X!*,,lZ8]d[/y[ I`u"&.UZӯZz=%fK' 9t3e8 F~Ѵ=BHfQIO8vE|>gm6 :uYaT沵Y 45ZHk:'gj5Ø{\ `4Qj\얬()M hv<|C; 1D8˶[)ĵF:g <ɰࣽb}hTZ`VL!VMo1 cocs , \`V[Ͼ+qp<|UOz*wRF+WzAj1ŞBL7& 'E­V \U9nfmeǔ齇 _NAg^?fmMn^kө]FqeAt:e%YlLӄ }̉XAh;i>/+ ēs>EU!9 W2r]q-Ux@E]L`}zknuCe5d-\{mjjψ^jlֽ =5 I{ 7R}ZcNّqa2F ux||,ϹT\XOmuNZvR >$Z,{'@֪ tٙ4~mMZWt]hLe.ipL8kvHL2e!-VU]EMXc-A;JO\f1֘f@R-ywG Ð!(v}>==-pp>K`- HycK=orS_N~#3[U\57 p)zkl_f8':mZ^JVרrZ4p -V׏Ik(\>- Vq͖dI*jRҹx!Qcn]d(U1T)>N}\.%C4*Rѻ]/#˥KOEaP**E *Y.o(jkXY}m TgZPnmť*^ᭃW#+7EB]'9\j';f;}2g f=bҌ&I r///8NEAPҖm?@7G-Èe^Vb\wZf;rxUjWMg*Nr%@~oUvR$i5O)G*`y:u<1V篭e:b<,:A_?8 crwO>ׯe@#nZ$ZvZ{UgLߕ_e-+JT3ܻViz({kfε[ϲڵce;m͵έ`ɄtHk'ނ "iUEDhe*ēm{?,tZ& `HE'4RB6{(Nmj݂9ٽ:[{ @%nS iR7Wd 3.x.j)yxp J9X[ژ ZȮVvŭ{9aVٵѮOsAAF{R"7@: Wx? A5Ofi,Tkfc S)&e2Yʢ酱%}/@vηL% H [~1ܪHaT}[^K|AD*\hHK=bGjVt bv^q>q^!NI䛓Ը2.A"? k-V$AσNiϏ\lsڒmUdkWdeXF![ɎDy@[| WZ([dt)5\>I攰@ET{\dBc'`zEu%F͸"9Z-i>}SsUW)dyڳɌ:~d.綀3[Z%:H@q;cF1DsH67S+s&Qj^A0W \6,D"Ts'q;FT&:%\+0 Wr|dMÃ.|DQy@Ԣ,mB?iCֵ:-n,K5CG- SS ^i`Zp2 g%L2j񖨜r~_/١ aZ fRd94e ZѪH_{ 5*Mtqod؈ Lt,/XZ 3&\pE)PB|t@eHd!.ꃠ^+ D(i/mMzzqj' T"S `D IP:"b108^pds؍;BnO@J$F\b,a: XU(T:!*(NUFD HDR+/˙[6N`[8j" P?X406y\Xa tzaC1W\A,H8bjPeRQa`xJr,a]DGxBeod\vH9 Z@逐b(44l%]#Ux{xx#xyy Ώ0F J{pE3ݮG'eÈ7_r cJ%a*NV-\]&DULg PkUVTE tkȥe5\KP&CR;&XY~U\Noy}PuߣKT6z) ZJ5zia zZ1^R(5 w$d\ۈ]; È!&J{}R_}zz§O`)Dn90)υ6D 8xetƒ`c; χ~᧳eVS\N\.R& @{J(<c cͅB E ~s_EmUu'&+bªU~ 3DaSrR $F~6/7wH\Tkz,)*3|%Sf62$j%PRk_٢/֠ly>{ /P;(υ,EVK[k3|́~"%8k4تo:R(Rޓլoa$jA5G@nH#Qq O2Zxv[ҀGgWãrF\KJ! UdA+O([K&&[ceL6q)0ϯtXH1Vg-|te]-D(^p`͡H;P]w&}q*)ZC]]^V,fte1nCuKM9β()ցϦe}=$N|v* |sfLU/890d_lZ]^-_{[HZ%Q{w[ym5#rݪHg%:bU ->&1h.f.spej 3j0Qy*\ Fj$~F pp״--^mCܶL[&EWjףQRp>viQeÓ$AJdH1-e謶v[BQ옭ly,—_4Z#B53g9LkJo$4h RpN9a0OeRfTB?9Řa~Bodlۭ@;F(?@y|"QR*@~R+NUfk N{+N9jftQ&~<upOn5T'ʞKW & &|&^&z2jDg3]3?kJ}Gy9-#)þnݧJ_:֒.RB,޶bm(_9%>-#?*;y9#aJԾ]jwZ]۾3-) A9͇z7y /AVPA-jWBRkb,LB{1[4"ݓZ F$-rPy ~;@-2Emz5؄:-kFߓ\ĤlʛCA[<@$\&t=iûuLj%_SK3Z[ NO K(Peikvv:9+O}BVwә!5E&{^  Eٯ21l9>;E>Z[vwɵfj-| FovU:*{ ؽ3[8&LmֹQVOmF.TQ-jZ`U}PPue` hHuH1"Ysц]-+{\V3^J;y:I4߰v<vN4QJ (CYK[ԼY($w0hD97,HDZE2* x%&gSxy[`/x@]Z A5z%7̅bM:29ZG :B@ ZVZp~.ـ'[9WUiq{[^o0,q9_iF>5S- j, T1{[#)zK/gU-Z+Pnd.*g䥛)͖-o J\Q}]9euRܣrą!m99hPՑ 9 U4_k\hޟ|~䳡v?ouɫ;yz3\9utk$EN󤦦 GT1>Xr\ ~k,ѩ Qt-iѾ[N[LN,)m% `O*e}-nu j^j/\HrB`٢ҵ VY-16(ʯeOe< t -ro% KdCܴB! YXBAA|BP"@eԚƐkъ#If2L!Z&YBQ LtIiĸ>ȹ %FU-*Mju!9 ͌x`!Iu-'llq%wZr\;̯E5 lo=On'ip[5oϟKMWVx~b^̟C)Z<C[`Vülha!tL׊aöxeB4IԐ~BNVp9հݲ8ZҭkZ-V7u~h4t#u$(g(9*[ͲFULg% "VPQ-{֘#Q)je ;kȁMFqf>ȭAC,vm֓3N *xhD@h?W [}Zb3ܥ2h-~KϝZАL-! }f:,&|#Z]eJ*I\ޢ懭<`>tYRF*u4I y=lKX9WMmpkd(;[8Pד'w+5Si覰Ͽ2ojleJ#dq "Yv:57yL ~'&#GM+ؚYS)Hŏ=U'MxĪZDMYkGK\cC@k9͵tvSsܔ01]1-+9y fj4%iZk*4U5K4Yс"s© ԤXgCK}Xx5k3yYNo{vdMPCеHŮ0.JfZ_DB02437!d'?sUz7*e͑P^rYR(?ߟ5OMp&%魹wKUq1&Y¨,G˄ lʁz7b]-X k7I ٶ5wND*^?#{ -Zfz/,jB^[y(YِO([/m1j(VP{I[9--9^^-Lndתy'JeZ*AMpH8~tÚdPrQ{])7\H%6ImU͵ luj5˖.ޢm!)un%I-~ m-YVԾ "g!Dh=eG+cqk5o1Z}zv,As7b:)IENDB`bzflag-2.4.2+ds1/data/mountain3.png000066400000000000000000003542101200563112200170000ustar00rootroot00000000000000PNG  IHDRx pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FͳIDATx{oׅۖ}cZ{sνuozP5< C")*(*Z44bԨZYƀҚGҌ4MG PU=s^o9^1ss zi}^kk>zoZ+aaS`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa =aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aa?$[{ R"C`F#0pssx$ׯyzz!noY 28u:^~{HΙ"=㑷ip0q&L<>>|˻w?a_sK1<t0 PEgi$8-k >Cjer{{ b|5B%ܒb7oPnO7, wR+{19i$2/<<H\W\yi;ǚ*1eVH);N˅0qCrps:q˅ Z*È 9=non%spLʉi CK!Oʙ4q׾5jN'a_{GJ^~ կu%H'|~țׯq7op8(cBEI)!X=9gea&N˙'q2 #A}>#"BLY#t`u{y{p97ܽÅw>oes"ay9}b) "f9N[X睾r!FJy6޿|Y _x:_x||}3o{z>GrY93-Z9E1OD~gϗo]̳O"" :eלKi' {8KoaXC#RjKjʟ+) h C}yOLJԣO'G;?T{a5K{  VyÈ 1'c>Ye.gۻ a%v~rû0p& @RD5y2<9r9kkJ*RZW /a5Vbo0 ?R/|1=?=?[qY4@N]KLC`GE[!x0PKRq:rss"{Η35gpw3{akss֊#T_~shgU8M#9R a H9pHɅә#)'qUG 0k ;{awg>ROƏs~ ͉oëR )*.8\л]E^Oq,5Sp.>:a%W>="߾{&Li'vPiLNysZ9.&F \.un9wqZ+˅aQ6~"t8ps:qsĬ.e&L.Y]a42o߾s޾}+_f&jۉֺnRb]Wy|>4_g tKU#"mRXו!ahut;R)<8QssN}G?I)cxH)R^cx2{Ed~sz'&e%U[p 9 /S{Ka?|+KuV[kd{[Y{`'t µM }P^ 'y00 óFBnKf–pR)1J !xe!LIonnܿKNC{ka?#?g~UYzmK^g~:cG. ~V~߲|{_D1r>gb{PߟaضS|OBz@)%I)mm^=&av?sL!T$B,[`'nN72 W.10WA0 pPWyOMr;TJT*>nnn˅*t`:e T%RtE89o'mt,}z':p:ƃCPJ 5ȥĕraq鼒RD;D;?lo30 \qy|xp{վs*T)j.?nc{t~@襔_J{c&BJc_q(Z"B&x!)_R5'J&;dra+ιo9ܗ_Gv3 0~$@JIr)Ԫw@gEܰ4sȲn)e;{q"zhw<>r!ue+E8xX}?omga'OELy"YJ%ݳQeYǑir|>o|4q<8'Rʬk?hu`zyj}]#PJ%Djb$%Nq斔"qqsZr N9kf*#zmFl@BN੄Z9oK3!Mga%&=tmLrH%#OO6q^o{;/P)9#-pNRJjC^qRx?I@ h_Z298_\ Ъ~U8QKV]VԚ.@t”))%_r4 .b†aF8ۉ>m!O7xZ)Q=?o Ji>K](wv rYr5 =VLˢ5sR)-7ރ?uߧaļ5"s|0Nӯs"ǁ{;a~G-HO{^Dc_ X>ϔҳBĢڞk6= ܧ}5?{aw}~QںE<0"cxW2_/5v>ag<Ak]kmex>?wߞ>yWj-NUJٜb뷵o9'I@IE/= 4MϬ{[c=Yet'9Ή֌s02x8벐ctU~Fہﳷag,؟{ܟy}`JS=З#Kπ}-@p spό}ZE9. 40Nmeq2#䜿tsw!|;65 0'=~ϟNO_/zs ~2}ie9zjt<m}R~Y'$h_U'5۷NJ ț5EҲPbD|PR{Hu^/r. OVﱷa-{^a[g|{o/x3kYB߳LLT^ڮA*`QO>^9 s88<%eHجY]D8s/qyi]2KsDU{P) a@\ Љ}9&g_+$|쒒枸䅒 02#;5Iw^Aj.\ݯB޾aƟrPKA#kNK㞜)z#Yumzӻ.ͥ*#sm>_]ijm {rUfn1YON;7WāGΉS>̲.<8qb=a c: ys̚W8N!h^1 0 @ZDݾ%A)Pz!a:8Z+ j3*Rډ܉ chl~]6epW!PO#1%nß Y6>@JIjǺV/z?~^uRJĊ:\uLoxaȲ?WBõUX0 o )97[sΐ[ޅ@kyMQ?}ѿKjݙ]Po~-;'x${Aܠma/"|)0:%g~M,l m+WcTyC|)Z?c'OB Pr!.+qYp8~֛ׯRk"`aI\"j[czRֺPѓHy4R)KҕMvɃ_C`l_qͮ;/"Lag8>>7!҄{遗#ĂT*>}a/f|$n?fLn{*u^2Lw7o^),0 0>5HyFC8"N)m'.s%H@v@Dpi7 40s+"q R)m`BK ]Onе'ޓ}3ߦg=N"v{1QߔwM&E6 'xqn?8ۛ_R}+oCła@^#/+1- b:URusn܂)_\7 zNZ[-9h.m\;V1m̰ܽ˓Vq^ >ͿӒ%{}nVy4c~0 #a/BaAE)%U@E%]()Bi+{BN 0~'a؂v BE(Up֘ɗ'~iЧ'm tџȾ݃{ g,%lU`AIvaYm[@}a| =_S YaT#xJ*pB8Pg Zxx? *aƏ @>{ $m: 1~RP'^z*)Ϲ 4]ג?yOn|km^?= xvzAoL&0W怸9¶1qv]pW(8Oz$|ZVܼ\.Lӄs; &Za?zRRKm}`BNu]4AqʖRqt:q<1rk'u5WAit:m>Sr_B`#%WjДD8y;Ж98A౶IR#& !p>?m~~ {RJMӉquoYXei%IR &A-#Zs"D^Ԡ(׶(8ƶP裏~F߬^ "0 @Ue) )XW"3*B m/W E%xJ칞H&=D!\Y@;2{MyO/IB+&Jn[f-?@kBBqp* Mx] (ϗ(Qt ēT<>͋[+fܧpSw\4OHR%O!be%ļ&cchy !_Wk֯{?{=pny_#0 @ε(S)$XAi!R~8[O^оʚ͛{lNBJ.<==Z_]H%фM]hEUD0˟~qN%0 pj 8_@<~N8rgx sItqeR|Պ^.0 "j%HZ 5 9AfRrD+""|slj x Z<#VIxj(iaPKJcuߔk~ڃgܳ=P > Wu{˞ykV@w"P@ 5]6֭1 !f5r-j/{}a&9RΤ%3ԂwB 'i2F(7FKcڀ6aPT'ir4 #77a"9Q}nJG)Jq*69Xc )r);DB|1=I]qa{"?I,0 ӐpTZȵNzI[j\ð vz>u-o/p}p)eZ|&_Ů% ͥR>$c>6D5A)%Sb">k"Uf܅ nh[n-=]8Vi@pYfʢ'}tM4q8v3aSKf_r/ !8cbidMDt~". _W!0j c=m|>퓌jKk!\='¤StYO'061%fB-""Bi[E?ȥeŨ\R-nP}F[w,nmHo Bp6N-?sO4MGwZՍR͐# RD+5SJD{ӄ7o>PZ{ʣ x}sl yY ~>tE0 :.Wù*ۻ]7xx/˱Ej5ڦ6fH4<)嶛 P~_wg/?7R+5Ã>1#"mur-j>%"RX'4]F%֞k)#Co9^9qܞ3˲p>)7_c]f\98}dmےj!ps{a̶Q} BB MgR i]GL* =?n0~T&zOx~N@Myqw m~oYu6 |?wqc%LEea;nUm_H>%p_ TYFfܾ/-KʼnYGs26B9N*fkCD<>̤?q'sݧ`Yb\.uxS8DZq^ T"Y01@JIog81&DX߄̜g3)_gZew[e0U tЋtN* Rq.omQg@ѹO~܃d{!m=h=zיd1j &OqmA~ODp& ZeѦJm^%D(eqTi ur5U 80 NrWYpS7:Z-_W??_:Xu{{Urμ{^ !چZ9Q{ aF4Qv 2_ 0p<-|*}x'Ԝ ma4q:uK\Xrf8q8gFK- |W&"ڥ0 8 ,JufdRgDn>i e]Oyhy쇶"ཚd[ *z@u!E]; P&75CBΉMra+#׬ dƱ|?;H x}\*0 TU\$Jm}~ZWkg6)-K iVM][9ZU<{qtiњL{[qZ7(]6uTKaYֆjS"⚡hyWuxH#kj f>z8NI 9;bq-"%0 @L328RVbZyZVfXJx<2N#kHx<0!|@ܨcu%bK¹qSxq}t.mc8N mƞV3NC)Q$:\q^9I+,䔟-BBi:p:Mq\H䃎j,iȌAk$n?əy]2#"ReBbĖQ!ʲZL9q?_4yAD'N Ĝ"\T#Ѭ&[LY#7sFZ)S/&aƏ  B[  Xz/WUWԮ5}޾rDKJ.ZdH5 KiZ/-(^'Uv`[Z@RU)j3ѓw 00 B)jz~pWrLrVz͙qUD -E̓Y;'mۆFi@_U='iQKKIOĴkSks2#1VބdpBln;\VՊJN8QA-MR#" 3xkLe^~O?a0~'ZYv,/ֻHO<]]Y??ﱿj$Jִ턯&@bXAij UT$G ҥSUY-tw~s.w׶FKd$#i`&JfؗHkJu+g{?aM]cԬ޷~XH+҄Dk$Xfu[JǶ6rV".oG'"Ri 6X M,Yf&u㈸OoޟDϩ"\Z)mE5|*mLSw82 rw{/? 3a`YRJl].uif'd#jPRtPvv~&(lOHO08G͐)>\ŕk@xˎBuo 8ڿU:*ee!ܶgIM~{ Jy6ٟM^{|rg ]&znڦh.}ѶXDt"#jB&==ٟ{zuAfo6{N>9i1ro9\Rb|>Z7P)W)51T7e~_ E~\{aZ~1q>btLۖ>yjٿy٦ JAqpGU:k:|M8 ށJQ\YLJ[5F{nu6uO)|idՐIktdq l{}E宆A.<ϟp0נ}%J*kRHq% PYiU*0} UAl}0[N[<>Ѿ?ETMY <8~pO-q]9N\0 b`5ȲFapbYW8RIhUxx0LX*sG|PwKV : L! J:]m=yb>3zv<0x8_-tyx|qxy}{Rx8ѣܺ.R?#|u|k)Sr"r"sd ~"#y|4eֽ"\,{u},z"qm)\Lhr6= C3ѓo7)5Sa]6ap"a`+͕.:^} n{u[%`SS)Uӧ % ~Xu]bX*B$U )&FZvTY0ߟP_{{5l]_Ov-777Ϝ{h>w>h妩 >5~>^A'78 U磦Wo߳~s2;' UBo%0R م g0{f-ڿ 8aA<<0MQN%gs ӛiO?m\Xc$k})O$zԬsYfU-FҜ-Z{ *5@xA<.8|H]hUetׁ&E:hBݷ:yZuaGx AN|K@RK/`AiBr<5~ݗ N~[=QpNZnO!%(tIf32mLPJLa>'ퟟߗX޲y[?ġ0=08I9_^JoVƏJ__|p@3-Eĉ8+K"LZ":Ҧ- {DhWUBO ^PJԨ%KExo.W-@U9úv;xW@fYcT`zs9!m^W4z= I$I+ N|ԗYʺ$8a 5_=+ZQ)b!0ĭ-^Av${{i[O8'v] Rr_)e~h]K"T|\iM0i:~;5.% <`SR:?$"|'_ص0~ډ~aމo@T\㑸5Onr%K)YwtiMhB-R>Ra)kEt͑|Jt{txMo]si Hi2B`yZb@blb3Zkq=⤭E6_wzq`/y}H43ﯱRn2500=tѵ'<uawK\Yqva3ѡ}I)Q#! sUkeGqueYr ~t:1ʶFF-69fңnA.*EhNG?=QR #rp<|  À^?Y&j4u=EkJ.U9v Õ)@pV:'bʔy&6!"U᤹Pm% vXtĹC^> _|>QJoqnv4,~;8g $=DF S x|x> 5[[|W-2'C`Gtxt#8τNV֤xy&6)>@u6ӎXp9163Ŵ^O^kQ[ZoYBqeSYӻsA/{1ZWǘ[p}fj -0m{?-p8^޿`r.Aр&B7A}N8usk!-&;Q+Lmba?w_.5, mQNb9TR+)5b@H_]U@L| TvxK-Fkai#W\b7?D GRfq{ պ\E$QB-5JZ :)B.?mE3|h՞TMK;@~./0~H] ?Z+׿zT{uaiawmfN%GUjsmoͭ]cI-q%\k O<>=, !ѾJ&3C*\'Ǐ+_kM)רBBYkf;rbIT *BWskZJroՈLJ .u_ADtݞy0-Jq<Sw#˺l!xR^7"K%QػYOΑRV=VN7UZ,N)yƻ/ '18S$i &RH$Hch%7}Kӫ# SAẺ}E\#OVp~aYo>~Z_>hwW͗÷۷vzt/ݧ&ǭ;oIV+Sj.Z3N|m\؝sHO||_bQMo1Y|7wU .4sm{#WU~.wG)z^**ovz)@kv.@)]&`a /gڣJC`]_Kxp>Ç.kuVK-PPrn<]_j bb`"׌xҗtj9!@۾{#̥Ux|؟_Iyi=_Wom+eD}_@=wa1f~`ikg_:^ͧU^ΟكK/e='aVU1.[ J-N?{Eiq?W]kchp؂a po缟S*ޗ3HH)H95sk)>͌4>1Z-%_N-ѽKb7:[R$+RtgFxqpR@i$9gҺPky0~=_0;s '÷SJ)]{O]WU \zO~iZZ ձů-*oqgt{%v.89Ǚ2[{GT-|k7}r/rq)T0 p&=ifp"^Tbl/Ojӳ Hme3K\\(QSDӪ:{}ly; WG^ѓ5R bK|Д9I[S'x|}^ I½iSz|G޼yI$l&<%Wqm&(By 8?+.r\(y2\91+8VBت/'V}azAxڌ9z:Vfj&ŕ 3wv=7mȉ7?s>Ӷ0 j&؂6:FO4aW#6u=0۷e`l.tUpm{[oum6ypSv9󵇏Immoy=ݰ'X`~uu}ƑW7 4𰲮 02KU00-uOG5g)Z*4gRHS9p`LwUF*BstL|VJmD6I'@xOOTO}jL<9\M8 }BOv=࿼_su@Lܔalt}eyk #.H;Qnv9WJsNur9)B+RG?{<8ﵗmFT=Մ5s6H\6ѢoU!88NG.|Y$@W$j2L_v7O E771EL+2+v Na7:GVDW=u)u؉S3x}+gҶuzEuO=v zZ2wZ z\.|e).M]P.|Db.ϏjE,xu%CY⪫+i@n-hyEGfoz4<'=iĩkUJђvJsvbY)+9&z/ _^~A}e;n{ip{a8MYׅu]Z@4M8^lu_?pzr0Mz=}kxF7 DȅqL{͌,KouН-+}" y0ǽmA[.M2Mf=O–P3p~2B)xOJo?/i]9~0 8Nk`ƏnnRki1?~8 |K_+_~nnO !Qb%S+.ݮ٨põ9&*n~P͹hE/Zk~2@mmϒZE)$q%L̙B!,ia TV2%8Rn9n_'?5mP),qay.Xc{%>x^a>7s\ r׸l|G =ͩx[e~zkiS=-˅|l>ҧ/h$De^|3[ٟ'J{A]mkoIO}&-mK3vm s'7K.qg]g>˼$܉O762j{l߻%Iǡi9z{)R-EC߾ }]r7*'{zӓR0 lZ&L*eH>O뚙.ya\̋.^J)[r\o~-X0~0 *| J<~uYb>xbm)A#_jL\j=g4{<1ckS V۔x|r)-0L~Z)RY;fe5V|TZ)ˊsDu8HɌtsam;ۏOGai0MqԠ6KNĵB1yEmk{Dv>eYtȗR+lE*u-mKEh=(]`)ݽ4%K5-rjFw71NLrɥmEgeBH"tT5 ~OEyD?zﶱ>(Q>P?{Y- ",ˊI-D NG^4.77+dmϵJHs^} RQIdRBB渘S${G' $O~fAS=۪@M3;rQ E>MP '|-01eN78eYoO7\/X|0~'„^wI9BpHuȅ&Ljcz\T}/Zt}ʈMj5. ļי<[ qA[-,vmS'2HNG9s8 AcdJPuJ`ɑ,KJ%քƁ*͉wO{<[n++oaPsb^/zD eȬq=Ɖ3hRd|Pd{y)a`bjYIyN˝Zap/ij@6ר{x4 u.]tvS3ߴJV?}|w(5Sj0 RɉR̮i3Z&jnr%&}j-WR&Hm}j L cH&Ri ^ղV0jNPeati+\wZ~w>0~"^_EO8|9!Y(܈Njj"lc]tY"0=g\qM}.ջఔKYɵtbRWqAO%|64Wx\Δ >5m>x5A.z?P 1rո,kWr$L(R)^G5%X#R*Rtpbl8rAǯbaQ͠'8qUי5&rEKL 4È# 2Xڅhxk, ˅mltUS,6Xtmvuͤxm\MjOxa>p8aZcԄZ=S4P/€TӝܶNEO,Lps{Wx RiA:6 b3_ha JHj"'KUz>]8 F|i%;rT21%♔3]㻖 :)ʒEtj@z&\BULW5oSu,mπ.U0Q C𺖯9s.+riֶḛ,3iba 53Zڃ$5ZkT)g{|Y$:Od8x~` E՞4r{:Q+'^ײڒ6PZSULkլJu /"2dm }/-N]={ՄyuS]~=躆}u31d _mS /&!^&[̒_1A.yya6x]x׸2pmY'} } .fE݌J *Ѓ#x-K[6$ۆQ{~Ra]bD(֠/#E8 (GU28/FEWfJ1$ȯs.7^.O79EA81MJ5Ri|ӓ. X28ǡiyx8rsXcdNخc m\ ;uQ"BqR,5;^<,;u#c n)jQP~ntHch- ג^ j:߽&M}B<ϛ^o=|+Ez"/,i]2Ðx?"cvgn~Ǡ?޽gz7XsbBya9K-RSr%Q$i>yu bm"lY\Mh+U[@7IGEH \\Y[u>8 B-Psk|73K\YEעek_Yj!9r?TםN#߽@O%jE׽#Q)a-+vHp| }-̻GR#e7wǹ'& jM_W-=AG.uє};% !+9UJuTd- VU5Ejk)䤭I/j.rJq~0| ]w[243R_t_w,qei;KZ˲*8'IvRwZ)IJ^תS)p+qj'qYg.BDpËg^Wb\_FA<^ơr׬+^W0H,qeMQwiqӏ6_aj3 J n`-~,DHEE9iEw.j5,st;TD)R0La; |qBuYĕ|kgk*4+ZAguIF;w픒kEk@k^׳AOձy+Ga^S[nzQ? 8~@CfVU9Wd$OKY)I{0.8^)F'RC.5.a=Ŗy{>s^H9J9T0 ~dmΞ``vpjZ;i 24%Gy⇠\֮9՗~ajחOTz 9jFB-%iNUeuTX֙R{ u1miRhOTȡSC_ܿRh*B,KiE'߁5"TAħ' *aZ3䤂f}hB1xo\eYYU ilJ៭A !]Ɵ"r7+?iO4xב$d ߪN1-m0Lɺ>vayօaŏDYTʥFxߪU@Sǧ{ּ2gv1FޜXRd^b- ڤi C]UӜbL ݝR|1^NG"xS>HJ+J%g-*dA&lA\-Ksk@>/}}^YJ箎xg O8uU&?~z=K(9RPϻDzyOS?W @~#Z<3[r֟&R~x-ixaΉH0zы YK&º.,9q:pAWr|~|0/ 09dОy5' jh7 x؂pb2y]B^3_#벲3}mHU5r<;O>G\ei^x3ZYgKyBfW  u/N~^Vn ->+|z8e0#ziNqU4ؗ T29GR __ڇjbLܒAHB|6]NO.N$Λ*UI|xxry捊l[p8AXY.1zK9F& aPż.έp0k=twx<2Z*C`\XR qYWq2DC0UHZ+6u 4--PЪk2_Xaa]β؉Ss)̚I~OrZe0BNY*m-{u+ 6v1V9>{Nе.u^$ITܢ3q]F'"בR(- XׅF8]ƄZ릏&k=8fJJ,L)w7o(U␾I2S$i M6o\V=ŏjZ~B8hG-P#_l"ީEU7-jps8ċ^-*|[3^|)/ƛ0@]RpsV'Z+aZmyX 9dm>znFeVU q8s|>=˙Ȣ.͞_ܒPkD -o|#3qLCJdDڽP| 9Vk⁰m̃^+cҤ(?U'`ZIJUR"Qeo \2ОVhi܌z .DH9v?QB".:)5딊k@ߓm xzjd)g/qUq::3ueKNt8ps_y:3}J5f$'kc`UW+z R<1eҼp9缜Ջ^Gj!pGy}8PXuP=€6^zO28O ݼ0:ra3:H*+x$>1L/|x7/ӌ3Y |!Bq}൬JD9 FN(*X,8uⵏm.qཧj Rx}[Cm~e2>t<6 B* Xp:;욺Ƙm-h%]bux.!h D\-6~mjBcdts{?G=%џ=)l~V׌U[RJ|j=_]bĹ XZ5A{ ^K\Z-ZjvK/U]_H? ;Wk?;^>'V޾*4%%ִJv2O%YOL܅#py> 2;Oip,qF@]y>yi |_8?-*Y\"V"Sf( q"Ua)|fkVo ہ!'Dkb\~KjkiewWq;|+_i>#]VkѶB$?9J3ș U*ǻN7G]Jl³U5/t:t82 K\BjVjS+)05#C}Lr#awχ_ OJ "Cυ"n;EEY4TC;J%y=1 @|@F*/ol zwa-TЋ^Xy>W&@p|>o4M "g].)&:ow^EeWg9N'"B*z"+l;ڽÙ&.糺!e-z!Ȫ;],K; &]Z<"e JNZZ0Ħ))Wn9XXkf]#rs+5uOɷ3* !\U.0@c#ڣI3N#a g!qwwzp}!%7A}ȇDͳ`^DM|Զtg pշR~WO~ZI.a>uP5]~)+M zŪo:t}jY(^ۭ0ܺ|mDԌ^KM/-Yzmm.x ÁD9W?&݈VR[S__ュ6 &㘼cοR˻!J%`벀|ou?rU٥x/,msr\q<3?'ˬ|?i<8qH5r)=_+|G| D'xàK˞>{#}VOoӁ\2ީ&fnUuF Z O򵯲<]چ)/M>x^}W?'$*K#~ÁooWy:_X fi& y!06GPD-yTX3{Z.uL~k&8OMc<$w'ky*ߛmzkJPes8:*"^.N fR6UXE\:KJzs~slxߟG^:IQ.!pt#&D2IUxBӒvAE, [&*~drgtwi]WE=mR7aTT*C-tT=u

?q\$'gpYq88c27RQ((\װ W$Н+o9Lï旿yoN'g.G 9[:ĺr/;q_+Spm2C+4!pFj9^On6֯ߙR.u_{|Z 9!8w9sфǚx9_}{yxBf|u0Df):=wR>*yooX.g hM€;L]@wko??qY.zsþFu@Jv%-7U5䬦^˻ nF8|wREgq!l>d%9RTwX&MB Zƒҽ,:&>z| 4ˏٴ (UƘ(;},|o8U0[GUg-AJD4 s̺[25|{eQ/EhXsnj'DvTxaGjRJ-Wҝ6~nlMTe]=a]dR|]fʀo/cZIQ[!ӝ*knk}Mƅufrpld=uSǺKF$(8p~VrwwAmG&4 .ON= > )RW[ʶס/) ! c)sۘf7O= ?K\|i*5M9IR;U7/tCc[X6MDo1O{> *$/}K,aNơ]ut+-%ys@$8!4vZ4NQobR;ZoIq~;Q x'˭t~;^~Ww ۷|/së[.ۇq??#_#V7w7ܝ5%/OS(!T9>C`pˊ~^ 8_鑛1/||կky6f6SsVK{Z mFW܆;;֙zt_ e]KMR8(˪ sj#_5j9t8 U*_WoYr D7jKND|,tiwWc{夿/R"Bؗ,u]zlzGެ}L'/| Yv>9es/":p a )w0Mڷ2S%yCgCD*$LN-a; UtS,+1m?}칻}t&º. c)F4tpJGE0(ؖ ez"S8=, (!!pKŶ-`k; ZI2U&V5xIV]y"?AǁRJ_~(p~۟ ۓ?C]p |q5/8ST6ֶ'vE wח_/CĻڨ z.JQ^"|/n<ޝDYHP¾ᗿq_H|\uyސ pՔt(vz8Y vy-C5k0r0a16-ˆ0xCk-otۤ oI-Äw y\oWRp[ȹ?Hma:grO;]w(4A?ԢG6yRP@vvW;"gt ?"șb+fg/Y C8DLbw0PBAd{{=PKM v 0Nl ]UC0*#uVe- ;{ay0!F7!Ќ\Z:$K˕ Al}ڕuC L1NΣ؄&lo|0Eq@}uqUcȦ9 ewyWEH@MrMSG>"s*9ߍׄ?NPˁH.l}gq}/8ʡsJ)=Hx;Ǡ{L{_!Uap.D36)}bGjkZ?!ÀR3*cp  !D(h+BbH(ĀOO0h6ԋu"}?:BTJOX9䜰ܮz O? M,oөRFp1lsPS%%qJfVcVIE Qj??O8 x~z lW8)8OBO(0me{O`a\/o1FǧO?~;妁i\ (F!"o \\3k܉EO}}["vm<'6Ҧq`y1hǗ} !b* QiDg -PGQa ]0كDVQwCQr G[z"nW 92T!|*͖vsxFn`b z<~A̒M2ZUrgQߖ_mbNsvpQ7qQXqlHpVH-# W-Vts VKAa0z QQSJJl CVSphd"rٰ-Wb7传rAӈs!ZX{U0;!RqGظ}OYSA^ )W޽8\l|13^D`W0m,WRumYPKB iF݁w;qB1x85lJrKۂ_?8Os(YyB@#?Mx:Mzi\ Yϕח]=>oҟ~ yė/ R3#qz[W3p¶&PM0ts>}Oj#O8< .I938T梶_o?cႯoT:{_0gg8 nU+ B| r_/"X/߰nU[Q7`7 vi N*<,٦Dn;!zf[5M6Pn!:sjޯFE;*wVuΦRmlJ IFu<$ IضgO3Os _3$Ap5qyKXs!t jA&L6p-|F6Lݰ\h!.Ec! <ޔ=VUF$:p,)!'%LqHk0x>? b[7-N'aGa0LRٰCNw:rzEC@V\ #8,uSu T!3!R'Hzw+, a#jXxQq8jAB)yѣPSFͥ+jcMazT!VARKX`B\Y-0Son+( <.%3{~Ƨ?a'ê hgK#-Xā}}OUeƚW q0M eEE\vjcRkcCZ)Vےt- Rg.zB# @^'ˊixz:4c'@V ys۶rdVr/H1aBj_%]k(-I9isᣃ3X  RV!D)l5*RrE0Dy# 1`ghNU:)TDJ nۊ7jOHRQ ` pXi8qp>?Op:1Md\}w| >??wX^_x{{Ox|ᗷ%!4F@˭ ;=᧧8?10uA ?H1>QP+߾zEΪU,wK8T  o mJ+>Ç ++^^^.6ӀqIhaEjEϫ`0MbܮWa]74Y :jjzKeJiּHCSZMEͧW Q# ֒T<~6JUZ%moNV FlP3)[~m-+F] <6 (GXUTq'TPK4 {ag0Z, Rb À 4"p4= #LG#!.^ +g10AF\!`Tx%:!z-JiHݱF3JJ0< r=a/7Lu“q\Y2*Ń2 C̽&jXxMYȵ תY6j} "nF nU;iTs{f1saw ^i}}MP* EaII9!QA!K\jpnPˣ|Qoo^ULU Ox:? PR k/ ( ֵOe|Pj+mJ dRuudT@H m %#sT$i伡֬ rp1N kIHyöܐ%=OzІ;LʦXTTSGaF}T@b|xum'ͫYcCU7 wtMf<L,\Mʜ`oT3;ӆAא-31`&^PPA,e+m^0Ӈ#NĂxC*R=R*H%` >@5: N(/_𷗯/ȷwx7ß>2G'> >#   ~wȁ7 ;Y3Hn>cf(һ9F户/_ry-ݰN%Q4ClBgOȩhW1Rઓ*3[՚:iLvYB,.͸(z\t:]illHW+#ӽsЮ?K*k%jy5Қt> (mj-"< A(-δ{ǛH8b@ڏ F2| BQ2wA1öZ"CZNٶ衃z]4 :+ 9řh/+[^p]nȵ` }#ޝQֈR@rgpnTb*ỵCPamyUC/+~^ |N/OACua936Z^~0k8br[,\s·og^߰PӀ@ݢG!`' }t8 rHۊ)mEyCƸcyŞ`#شmjUrnTL|L:!IM'KsyL!50hX/uaz|!Ơ6Ѫ@!ٸfl(4ypK N1tΙhP5ŀ`SMbȋށm4H[#HQ)!:gA@  Io1̺rtJ<K4(٭vS0:9)_٣Vo YC0=Ѐ!)DMDH0@iGgi0UR^IG}|B'Ӏ@ޛpE|-ݰ7|C)+,=Q /o ?"s_o7=Ӡ&BIPXLGn^!_'0o0Fۊ[ZuN6]uNBjdrpcTkT^ @}}$,6@qٵBQHQ0NQ%].jG˲n?EFFXWm檲'u}e scYV83Muf^9? W'}¹E썱J (_oZVR08I 8k\0 Z CJΫ::N\!7(kDI\V Qm}0 AECP".h5;ރSmKŶ I9 xB(aiÀBB&/{m]UWrG1뤁=aKL@^YZxberlNjA+BPLhp:%M84 D:aFňAb*i[W}VY:Ξ_ZrUY !r ?4c}O4?ï0 i@QಊHik^p]^7] A///bCwՁj& p7:is#r/?4U+"-xd\[EICp] a $q^ (.>M0&n; hk-m 嵃ZP #]څAJźmEE2AX1jA\2rTM JCDZv(+"犔*󘆓94Hje` 䥎8?Mڟf˹E]EZGY;ϼh8%Yfےb0~`G oˊW^Q"=;Oxw~8{l ^[l[UN|֮5 )zC tϸ-YW?C0 NӈcDX>|ů^qD01Ae ZlK`P,P{dA÷qBkfmy&ؑ#|gP'3ȒĶ TR3TjU+nޓMϬj3L=O$|-W`<R+"%qlq?TtJ[Ǿ-ǿ:5|QBo&$P**'81" 0Nt䕲]Mѫ"X؇1JJE˾J0+`'o~SY݄jA1찥EGT5)4oj-KZa#%i(AAjʵ0rK\ wұsXɱC#Gl1]⾖ g+k_dl kYøMG-j:}p&(qސr4k=9p=L?yvI{ JYQ/i!yWURw=ӌuS X`cf"Q9z mR=~*ldOvc42cK뗫3|8xzz»'LdSXa!#P jYYBp킸{o!dǎ3?N?(U`4 I hF }ns w c-kMx]x^4^|Ҭ?ӻp[rFa}` q1e)6 $pqgTY7>C˂Fxy7꫹niõ,($J"5ǐ;fN#Er}`RZTCc-9ڴV Љ^ԊfUXКsQ?h瞷V,o(`;X) &zn/oo]o¹'pEâ#bϬڥmVzg]|KZ%`DT< ݵ2p匭Vv܏!ڻ6yT E}vǵޡ)w[F}#TXk\^3ڍlX)7/ڇu5zQdT z>N 9'C*'1--RE0Vl)o]F]lyòT\Wzq''9먕 @g,qo#pV'ZwNa,vXhoZ+2iA"?GP3hiLlpBݫ2<-UKR ;c! SXA!x\ mAYVr#u 1`-@CC`V. n)#M'LOݻxӮlf7z0C"!VuɸL`zŲVL#aJm2LwUvpC:P9TamN2Wcgu$ >"Njw6q(Y?"ꍷ>nA U-uv}ɻ3]HB}zƶ^o mߧGGR_RR  gQ9|/(k0 a%ѐ6_< kXc~A|>mD XQwqɱ|\7e>;n AQ6 1^^Q*2בW`M+^^_Q2z">==#F5 MO_`oz_=|0!g0ՇA^zkH9da|,( kЀaPem@6B8PEyU ޴ qoJ~]zL 2U m*zHi. }q.&P.`t1E.ۖ0a@2Բ9D/%bʌ-'KAd9VaTPy"FQD!A#?뺡 9m(uAw0ޢt 0MNb0O'}F+ah  7vhDZ Ä!i~̶ 1N&Dja")ێӆ^t ;[\|9 Ɵ~uO1aPkKIw&;Xf.xCj'jj]_3k0>5qPxaL w.ۨr*+\^o|}-W<>O#{<u a{Qe;1HvF8b")r?+~)Es]x)"qkUVq|}zi~ Nw>: MQ! o"FD0 <QLR@cV+4t Ө#jQFCmc&m `hzΝB@*:4o7ApYTqmI x9A@Njq!Z0;5isΦx !φKQHA5燧;F0ϮPv[Zt> j[v*G`߃zԹ-v@(y+@~D`12ˌ''<{y@NH9\q^`u@pVliAJ7y0LQQ g."6n,8hf-d%OJ`ѫ. uOO (5vS(m")TF򶣷iˋhb:x,.w{(9kf64gå|»\X./RGi";d5jӓ].AR,E#0KEN_c>MCVVda q6py:qp}IҼ蚝:m|}Z3@ଢ\Р. $) AY|7hVUt=V:4c_fcn;y,M3mzޜj9M&fmzf GޭCKbeo6~P[uCOt~Жc}Dg׵p43vy}!3;.؟QJs-cY2jE-QyÖp@ '2@}㮪O Z!YZʡ# 9; !1F`,y7i#w;\ozF伪gU+>_RZq:x=iv Ehڂ}\=gފRQjɋWqPt0;ts>J.6joDGY2,D6ݭɥN X*bJ}-7Wtd\wI#hN&rcQDSR6r2Jz^ssش9R=oy{ 69GR`!ю܉3{BY MeK4c>nOEmo|9i[ á^. d=DAP\ova xg!9&>qCrvÕ̊z~h!xa2O6H0cۊ\Y)T %ա'ӹٔ0*Q3sH Sjh}왤T>X8o0ޣD[c\uƁ; J*&bJN1yx7 F`ؘUC֙uO^tmGFǥ5@ :hZs1N0%N UDgB23R(%jq`Hcݟw0Zta! Xɖ".AlI,S/3o,ŽERrAEN?vz[NiRV0`:BP%[Z1h7cT,Mb԰$BcMкLXTϵb :!o/+kdlZ,ۂ5%T+(xwf[+xϽ;;a|+ִ ϿɌa3F X ޾r}sOq>MH9?/xiƂPV@$(v Wk^'ԡOm+kĚ̮uԢݬ3^EfVжcYFBYbBs[aҾ@þrIwi4+ϟTd~qV˝XĽiB4:[9bE!]Ϯ0ۄnL)#5Ĵv@)Kޤb|<ܚU XSjE>߭dv˄lmAD]cwdv{+h!sȈSpQ.9i%}Ċ+r lkWÄimnۊj^mK! xBFAOm+e=X[z0a4lȪ~ڴp:Xa !xTqw+: Nj_ P,~yڃ%v1j&2]\T-~3r}Ĭ1q45[ FԪv]m4%t.Ҩr:jJqCת]8P(Z2pMYCvtW;o.z$n 6"pv9T/U}4ȇ甪G#aSwbsRzX}1|:ar>ue!?y+x{'x6,U +J֌-o{u{yyQ{)A _5eM]*ʆz05q U.eN#'q?k&0Nȅ!ۂeY8?p:eERMx{{_gܖ7<¿)_~ſ7L ۖU'>l6,Qr @kPuT.UD0!䚰M_+b٩ !vT\z8e% 8J =^^l^!C8Mns/(L۶Wg5!0Yl<x+Vy2s3i̠B[5PUtJ:Y;>b2^)Y{/ci~?/{sa|ow±Z8nc󏓅+LCp,*4T5_!c#y0do6ث69RHƨ%U"K7u5>t!C4ՠ' aBVC xtpd.`qGH9i(NK\zC*a)a11ʾ}|uzni4tmq@C4!b4E cx6qtFrVn#]l_B Z,^Uծ}:AB#U6q5e,kź1RӬj۔!|SARpBBRog\|iϵp.#4uQHӀV!T..7NiږJJ! 3֒0Nзa3AXhe[+s8 0"#z˨huِ>-ǝ0#*WUG)',^[?‘z{wK6G}t^Ղu[ˬ\ Z /8p^# IJn^v}u_ ?'v_~A+~- [8HƤ9D{<4㞜K;y>OT.@q`+aݪsԡ9F) ĵBFmn(UفewsWavUg!K3] 6ml+ɠ^k(6!>G G,wF0$x$,(̨zJr]w(:xM7N*)# `6Y -7#^t.(R!BDV-̈0A&•hgzwuoaw#pHwTj*QQdRޠl}8Ȯ?0ԀH7T2Պ(M3U qUfFXiмuvNAm0%.1>]U% څ9T+ʶa0+>|nsCD"ʨ). nhƌQQSzv̚e1 Tj\ 8Ʒ+L'0U )+ShhtQ֑tuf`@&P ݲ,n U >t^g +80ຽݾ? '\.  )mVCq u/u+rRzԝx}wSzŦe,G̝1`;yѾ'ꔼZn~V@_^.<#&a;!uZumZVՄ1NG̃muE-\ո˂7FN4)pt>xX ?IODH~qO*@^Gzw*|#?wW ö} -UY( c׽ 8P.xdѽ8}r@Gl&Dʈ5Dgm<\eMd;TAX=--/)If& LyYB40I%) @SZ@NODz`Ӭc^t M|ȚrH^d/ЏsWJӱe׾*\/Zt[DءrB:1Blz!!Z/67L rT 6(ڒ-cI U(leEnn$A4PI1ꞻ 9щ],VL ?}i/26VvzHjjC#47Ú .&$!`qD3JXMNa~Tz{ŚV,9! $Ic} 6q@v[q],iC!R։sQ Ӓry÷o_0HfS7M0=0#B$\nk9ԜI(z@q]nՕnc ީ 0Fĭ 5 8|]W_x>48?kbBA~p! /o\Jˌ5H5DZno ۺXTr+vd=|T!O¶ִ>)} k.λ6(fC${uZ`IM8a;Cm~A,^04V'U#.1}b@M)jHUڠbRâT)'Tv]R[MZ2Ob#p}u~Oc-Щ1b2 ?[`EHw.wCju Q1NsΣVRBE/^q309T0R!\ NL(- ׮6/"e. с'ApET$Y-5LFEδzDrCv r)Udx0f.MpQ}\+,̡i0 1:lq%3n/Pmju/ײY-^#eʝC <%]9Kc޷\˂( ^@J} ~iwfcBY֢~q{qF=ST ߰ClA NNRxrE )!`+kްnJc"yuG.$kBrCn 6}Б;C0 x|QiB6|ۂa9'n7,B=nܮ(9#r+3 ^qL yh;[_E9i1LNə$jV+"bg IOMºRq"&f{OBPtD޿f-Bb5TՂv4T{@T1tX܏zc3;xx`bжc6¿;ܶq.VE FZ`i \,Q^,T)qE*ȥA 7:h" T8?;8Dxigc&mEW̖E"C 8 gNzᇠȩ!mel!Mm H Q1ΉveCJ+q4^AoQ3s}:wCPsW}xZ>!қb۪iBZ^jOwהG*MZ>(%^jD6CaFEA)-o+a0r>`):hw`)s&u?ԓ^7<# >EpY|˶~ZTkak/JI"q0a5+ +pi C@iFAAyeQX'+uuSQT0n˂ع S󨷀B!2Pщ5 %ب(:1u* C]i\N'#\!y8h)9' @UN^2?CZ^P~X+-kdu*^ !BXTV$:!f4L;02Y2:.9u-C`d- NLG:VJ16CUHg`q\UfNt"o1/=۶DJl8WmDqhfmOmȹI^#I1 3KĖ2h"WZm$\j=!je> )$L$vm)1<0Y .|B".GpQ?\E׊qBU (x< tdZY/ F:୻"$}t:0N`6|Ox~ emTW`k㩳 )~ePWQ@<itR'5nN u R,W ĨSSˠ(̦ qP*uVpRU5ڔr|ԉdŞg kLjK-luPO^,o]=NL'0<[+v& Um%OM n#ws< 8GD`L GekS=CK$uosgsd&i?` 9E (q *hK㭥6U <v9(Ԋ(G250٨mBD"ǮU:jQԎp HQQqҪV]*Qj=#D oCump=%5ؑ%xoV7߀F z8q86 ް T^05;%HT 83hÑW狷Ck"0 n• fi y@4BVA.)ΐXTk 3 'uxEZZdV"<;r;Nim) 1@A}z!ϠHro;q \6BA qk$ּfFu- Z(X7NӤagΐg 8fg6>mwq6x2 먲 `I*Y6 ItL 1@ nT)j%v`l6"gU׫VkJje4Fu5٩͐ *NEz ~ihRnf"FV:;]qBDQ\AEXa#s}pA;l(Ud#cfKΛsFp0"yQK`]2jNr{4ϾfYz(XX6BXWcʳf#o8DCvh3fgѬ'Y3N^ӃP4m wGrܓ0]$#z-,bJ(Iu߀`SC"-F4T[SZ:-]ή#ص1ًj,>\UhՂ\uL1,f@d:E\P{{ YnP3@St;yN/`qWfL~$=b4q-3Bu2So;~zNCOr{8e\f>,M=$ACʊR39`|pXQ"]9UW'X4qqV%u`.&6xvpUPꆜ>FQկ[b<*ԌQrbi1ⶬȋf [*Wlۛy">?|:: =Yd8Lj<8: IqbA!8sIs$Y!hڗ`AC5 :+\!Yч/R0 S a+򦗒#AR.`@ ~vP_?1$r:=NUqpn0Ry- 1Yf.&L 4mmdBm^w:_Nt8LWe=ӻSW3e&[ (.f1ug}@ C4 xߣqa"* } _ 0LQ6- z/w![cu4Mܣ0~49zt»wRn7ܮ/EǞ80 y=Hq |2CmӃo[% ~~y ihD}P;/ߊI; ~#K;v8_9⛏yM{@qB 1ʯ(\r.u lEU0^n쀥l}ͩ.~XI݁w~hmRP1!1RZjij\ Ĩ: < zpЋ|Е[,)kRuC>>Qjº.\0^4Sޅ_nFwc a9U;wNS{ vu #;'C'@Nżb9}67JZ) ܺcBAlS$~qq&5A褘4CH-ҼSԩǘ> ۯwQm ͹1x5wv0DcQ9.{QLh|AGθ*Ds@ `yɀx\Aж2vC5&3䬹wrG 7dCyv#MF<p<;Y d <: 669 wLۉ6,Zbcb;ŊQ7A\ڸjx )h9T=NX҂eQ83|v4E׈ߏ *de(0rhW`BTPHpě pcپp/4K!jk2 ѻ\w Sמ#ݲ'kMJ5P#(zx_ƕ&C6Wec/zsƨUwSSlN7tf^{0ߝS85Mm>{iha_cG/[l]h vEwkT CP#K׽#SiżLvqU ~;byhi.9rtVCK=Wd&{_Ӻ+cFOx~~F Җ:uT:l1Ŭ;|O;NJ==T"AgʳFW]YLxmN`~gID*nx{u Ol[T`’ lFV`gª:bRiڲNnהV$F&(;r.Y7EG857^%G D[?E|ty-vGoAV= #}~!KkDT&NMIӋ f1R]{Rn>b&#kYL1֭<ez S]}m c<Mrκ^P.5@5N*J Y)M-4{g $/4 v|Ta۲_iS~-~?BwPw!(TÀ'쌣Pl4暑sn6e:QW[d]w@Xx&">CԴw< r_3 nkFEX'2Uz!"ar%1jn!2HB~rx}{fY[؍fjÖyt M=ڙ ! mLvZYr&Q!DRq\ e+ֽ;,RSZ#{Ƚ|0@iv<4@R9Wl#8pEZ+ 53&dD?>+QU,^|O뎫*wyt9ġ?0Q3{w+ҦkU(=%ikFڒ}&1)5i+08]w&c}z{4r<DŽptW<~½G ^+*Z >޴ FQKWlBo&<5)3+i<8) -لj@x~~2".OOOgXvGwJadIzmO(R=Ȟ(es Svp`sL_?co-hmwL<]#ۯߛSEu6i \aTc㉅XrUnC0O/( ;[Rapw?FDi{ Cz,*0 ޝ8=B}ҤÕ>휰Nax.=rR|q*@Q8Oȹ ec L^ u?:#ٷgG$d6RåΔi",+H8D//^ք챰sヷ) Hv뾼MdG,L R~SMB@9 *1`3Ev!|M~"wz0Ceɋ<"؍$ؾK0 TjdvFƽզ@^i1WFB6x=emRBN 2cy ^uKcpg^զE Dj\/ic݅8os8B8|_h:r-!TuCŞװ\"Aqab9x:=cg`\lLZJ IjUzUtDyd`۶qnR+pP2um FrUR9b4$΁KIB˸,!wx.>|YeCwXfq=#Ն'6=>It(׶ TBS61l 1BęA}>DĪcCF#.R1S|2(H1r$C}Vy-lT8LBp}glb<#mjrg5gJ2فV9S2v{9ՈLbXY\P&D شrΒmDݽ!_]tv\?=N#@<צvmy|kBu=iDyɸ]/^~i'x0Rje{[JMQhR4=Op(MOt: y04'aY_aC]^lǢWI?yMk6BwîȦK^XbhQvD;Ah\Q'0+c.Pޒ9! ,% ,6'"\t!"-oK@ȴOqOxyuqCtP~8H;|9_xhذTT7hVF UBt"Jk2>B8‼Uȵ%ʕfFp#CrX `.H%4M}C/u8'tiI.Ш %eCNP@U3\<\ek'j6Ri?*:OQs~^98Zwg;Nr$Q*P&%'+0XGNN3 /\0!NJ@ffcj{E%9QY<-ƨy0#BҖ~uFbIlI)@lep(D*4k uQsbZL.>!F0`'-̸y7{qG^-D=i/[ W"ib.zBj]8ҦDeaY!=~6;ڞib滮uܭ Z,`ltTDq0L'xquTqJxjg"3i+rZqi bөI;Dg>'ŇPr=~CEea=eeuab?ۭ7-iOnOxpc9{LhO; *!"#j H[F),~lfuہ6I6\OBjVdGڣG3K;q͹iE۶pfrlr,[uQv]`ۦ_=Ѱ؜*(ܢۍmV[6;(WdO F5%-·;9q 0a>yv-Z,h1#X ^`Wg?n5kF wLGwEz 2݌)*' am4&Qz[ }|2m,^T& ƀ4E0 (YӳRR v#6v.;\m=:+>m.!zC vcV0 .`]V8z S)TF:*xe+JK {СvyRѰ,vqm*:_Ցa֝%+@P1θ.x^3E|0z(B,SSWޯ6m#ؔs@x@XmAp- d&&.Vͪ h`nB{ e}l:miҖ@jԃzyh9 L>cGK;0Fx^ZNNrd٫Լ^^oO+H-^TPH3+ՙÄVGnjŷk I,3NC4F^kR+ O1WҊ̳[3 >~(lu.\YO*խcA5aW -'훎=qc~ET~۞ŵ}}k{ʢf)8_mLvݫt|=PTjl{xp(i`8A;t$&H?/ m e{EvF#DJ9?ӀRW,yEʚ&ƍ)RR .C /߮ t> ?o¹RˆaHe8'뺁Ef}l|~4Y\ŌpFIW,I-ƾ/>AE-B&;|;АNǢ =GWi儜26 'ĠSoN`U:F%Y* B0x c9M ҳ j҆l$iBn e<, GN:BN.!Da=k|.sTJh!T^{0BMcO 57>%0\1 lb<5z@=ş oل9D<e{Cɋ1meP\H^Ծ%h );].96E6zVyU@E;4a#+ɔvq ^3t6/ !؞ MZ)"ԫvqΝ=,aokj5Q(%% S/I̓„s躡#헂a<v.^Sodu0D-5:r- !݅ ]Mߍ홻jG"cz?x?#Kw^ua;eS`ޡ&\3JhUFV5}\hEzXJngL3#xUU@j͈.TѼ sJa~Dw~.p%(#o p5MRg ؀8xB &C2%wÌy>_>e,6ak/vG#(K爖@ʯdqбڶ-W̳+ !*),w"&kۃc k1 BV;o/;xn6 =ej H}O _ȩtK1 {xv^"ac;SJ[ O 0@3ѽ h$Mg2n͎ ;Dk)v !؞Mwkd(ZúvEך{*[ + s-Ax\Y&{4N%\5灅հu-# [u;Siz{:/ Du!5X`=Mr#{꬈[ ']h1E5ap–l hY&rc\<9^5A_ޞ,¹@D)NmRl*Rz֪+Gt4?3!s۶ FeCl1چ]+` t='X!6ڃ#{Ňǝ٣;!b^vO;\mF{$oH (D<.>AGϣ@*́$m #q4Dm(9we2h<gF# RZ^}"N3OO휰qz"M*%i)Jtd̫q=aG!0:oѽt!MߜXw|PЖ߉I)sl=Q]DCB{{̴k]@hm#uΡ3 =O)o# ɈUz$/ӐV:xɻ>"kuDPE_.Hk;SEޕqbc_`lAwzstA׸g#V/''fSNM(zEAhFޒ|-~}h˱2_|ڀG Qv]= 6ixe8Ljby&d|wGHݟGZqVx 7ۄ mw8ȥi4,W|T^rXisOLB8aK+^v89˗'H/uض 5\8OE.@ C{vcDcKm?!`ƻ?lWY6: e4w=:__X* b+ 2۝E2u΂HߑږX+?]X߰ZiKQQ}jed 1q} 6\vlNAa -b( M%B,U*FVզM0An'kld*`e }7zw{=1]CätGSv­;0vInp<)S}hX'M5,8o?[<,nWSMu;F״P À'8,J"}Zx*6S)!ߡbݩaϦԃi_3D-[94hN)'m^;F6z}<A^u/5~zv hDvfI~Խ;>Hk*7Js\g #r ǯ#].&/ni(#+4afZ7\m8b'{myr nJ͸^/`%u]qb2i1ŧya4NB 2za)3KX;zw:#FJk)ˮA*GOWS'% a"IQ{  mP=܎B}w}Xcpp>ûGI/W.V7LAva&sxEm|ICBe\;sPƃoY1y%:Rn] k_ED_z \͛EҪ0]ѫ#yꎎ{(C]d(0rϕv5TT1~&u#Ùa+k@˩`n炉' s$ *+R6\E;}f}c8\ܖ}a{Ua kcQU\aҧ+qgF tƝs`JV]4ϣ;;j+j-l+}dE n߲!s9ORRA w3J,ߩ=X X^/]#HE;ǎxQ?}ޛBMԪr/{D8GHK,پЙQ\;{bm^m7liHށ0'0tqp\,KdER- p"~,l溮/ߊ &Xh^Tru7SFE>q4 Υ8SGH_<5?~#ӄt0Nx]7>`Etg clԊZ]6wJb:^<2ok%݋ PPWR K>lȵxdv˿fu|[r mmx v8X @d{Vhr@ @9|Bc%مsۑwroVMڃS:z$t(1ew)u !o= 6Eѕ=>~|6тRb4K).ݙ 39;!D- eZbr!DLGwCr/87ܝd,TAi [5:%WBɪ?pH)ci808;bL+/A z r_&f\;7C]ЮIig6{"ۺqh`HG)Xe#-/TXp^P3Rmq6;@J+ުM 'o/ȹtrx~~ __W\ `ԥM-Ya je\ 1zj$c׿@M@!uE')ZuIN3бͪHw-_)2FȂ'Zw{C۠@( zj)o\-^?ΉfV(wO7T*t[˖Qvj6"lg`{.ƽy"lY@hЦc;ԠZrΖNBVc62'ō lZ(VAPvy q}lXVJO; hy| !?=1=]8Fܡ;%yr(ۊr2ć1jKY_8xq@4ViwJ]HX[ORld,dJ~޽{mp-bGgN'x"&E"RI$-W5hy0` U '0*(PL>+*{.>l*fĩ%B}GvT9{簥dha.ERQPpW]ΐ!WadKzXlroVؚwݣV{k^TnVwP7Q>( Ёx8uW:N' ?n឵ q' +pć0('8 תlTٴeT[қnC?ث-Ӝ9?J3,.Ok ŒucxVo;h=?zb݊XgZ0#ha4KxNQ|A h<`['z|M1?52G#KGGdG鐏GwӠǩsXz5寘G)@wN!Fx$/^UAWwq~5S6+3iQp˗O? ?#.ӌzeZ$}#שKsԉ 5P:ulRso(ł--H^_Vbn o T肿hp@ݍ3lJ!G#,K;hbVyddFK >Y:#MHu %m.\|} R{:<_Wb.%+9ycUia_ҫ.3_!<_Y-<>ES g^tO?//Oa?DLyvS:NT,W|,T d@Z7u#ZmN+qSj4и j jĢ-e?#JVv|j3fJQucjX HG"PLAo~6Z ^F*_$ K呥Y[̦h zlĞ%蹴@vg;&µXg|>訤UYdG&WWQ'BST}di;N1ۋ.{:,C&ޗAN 1嗿}ɖD~nRf)%|r4g=ɀh9YY8*Rɧ]qv~{4HiK$\fGLw |4gt̷mSQJ=i*Q6gV(FVW?7/zMwC]^j}DLL"cYr29ˊ)5!" W^&bO[} z#/k<;_XWİLrpW:ju#vgO?o_¯5BWF%4셌sR3Jk3 b{h|eoz<\nYÊsM< 0ҙY_fL󄰮E'P}bnf\e\ap|" Ex"Y|p9 :u_XɆDhNNOU>Wp.Uz 0b^r~vؗ R:d%,'a# NGb%GrR ykBHk|Qs38;.3x܋y)[s {dejKaLtm)V >]rt^W`k% v2]gpһ sѩB"scHУ@$o=F!v b1avTrĢ}-zd"[ə|># LB )A+w5Ĩf)kY>"}źl0GHG;|pL ߙ8a^V%;]22<0&Y.brXr&\!\'?l-~99`}l͍\X ;P'fɮxس@ 8LS4=S\@RL9)!T==Jbl*m2Ү E$ؕ"8I~fT8U( {8jnd4@ ;Сة5ZJ-) J_q -rRHK NAP(hj4Ye7s {)ۨQ1"' %q+PdaʯIsYrTkI ­>ɗu@|hvI)h>㊯_X/ٌa;_,_?ݸ*e] ot0%,{ ^"!|} (I': T'=No:h5RpL ?rn T ~*Z2{r : eZ&RY>?֨Q ғn|2m ٨&OAFӄ)n*.}1#Eņ&JSCjV$8yn=࣫S!ڔp\ :14!{:/XnY1^f~z??O{n9T;|IJ(! ̡moTč$9Kn.l^pR<ϦzhJ $kўHxkg~ͳ#Tۉh1;PZemj1˻f[e媘oSAX&\׈DzjlϥzhT.+Vz5T`tҗc-[rjH-O=o1vR煙rRD!W,{@Hx} ޗ(6܂=I XXdt p#qD]xƟQ!xvsݱ'H]xC~Ɵ/t.7TV4߳-`Yx6 s `QY\4~䃐ۙY0 "m5%YUeFQ5# GͅRӎɞ%ڶ_׵xCvvc+4ZSSA6] 0m&ߟ^V^^{B',+]FЮ2iSfǒbE͸rv$|~~)ד)ZfxyqU`X_L>RuUc@r <ϕDzlXt\AW .+5J֩'S sjuܾ`q>bY_ O//_oox nUU=\q:h:;(_lL3P:_L33'+ݱG9E!ʹjDz˲,5OIVSM +/#n7g2̈y]zcvm̖椫J-/VMWZSJY .fm[/{Iׂb"`<5Yk::TƮ'PqVQU*:,5!ae ,'Ǵ5"E?U`seM %IZ,b6gD, TZ g1ʆ!7bD b&NR-$rM+. J$b]ƐJ'ˢ384Z&G|!y/uJȀ;*C>ƀZAv 2?(< 4Ĩ*Ry_1$)%J?0%R6i!3yA"' vRrTuZ$.K 2rXA=0Ged)KC[se]rRanwb} ԏ5SJ__~1F\.ՔXH oo|1Uey7\+yn_ p{4|FKі=[%L5"Asշ`h#K tpG\3bgM-!|0L]R?cZbXCn}u@/KV#e#U(P( |btScC !Uà,E6\f ٛրtc@VrDBU}C8et _L+&np G8 \ 9`SkOetsg3`]ۚrTYy/fD JEv5X+X15sePf 3<=*@qSg1j t)kD$ĉ@p 4w198A)szKS _tOE2EcRQ,Dj]7s U_!wA2]0FtUMHK{8 L$N)B,r)bp}y䦦rVV>Cuɝ@w.-)!&Y-^1XxYBגv$(Mko,: g\>2uE\S.Js)J y$, K鰆 `@,l%LA.TPkQYÊZ믵dgXkc RzN_./3bANn L+q12f嚎`͜85FT5y*s# kVCZʿ5`Ho,x #V"E“:Q\wlIȨr&n%O b Ih\.yeVqD% nre.,T ׏(r HuEaτ!smPuy='rݞR] 8*A+nkbCMmⱫB4ކ-faZT hy_Ea:#* G4T:ӄyܔ+lD"W%5,͈bM E}^u>;|/VaվX%ΑPw K"r `b{.=Mي%ewъw4k\pnB,G٤{w\WKHg]BO lNښ|!;1`̕UP yY.8e ﷷnVl{y`^#vbBzzy,~Jqְ$Dkh ~q !63J_q %♏4Xy{ VGVLX:(OA fP$ů̀mE, ޼G%diN%\7 Ms0*!':UWuf˕{9sנ)R0kDbJ`~ 2F84~l~nbz,&r:1k $dBrKäFET%+ROb2(,3ZؗJqo6Sfl\i*BEK~nYnzn^hK3Wzke :wU=d&Yw`} ֮KY<.~xYsYA6sgWm`IT٨|pk $%fA$9rE Z{:V%8щA1JݑR~rpeXy2$!HUL1'2ܖeƧO:M~j zucآwD"KƼ=%r'WQ:&aK[,yũxRr/NAD+iUPv{ǿ}}]?*Y1MVe3} R=S=J2F2^rx<ޑb"3>}aͲ擥h4a \\a ;/,$@.&Cz9XPg;W{c=>|S$#ž.g N u&A1 E \'(x^1ME;[: q)# ;d$4wJv;W5녍Y$E&!ӳ+\5G[ꂃnz&{c8?MBz~J.)E02K_feR痪: Mқ\7+j qLW mDAREH$(z<wnz_/buX,Zb'ћpO69]:fteZ+ h 5ǂDt"` ,4TUs'%m4ńH)v:$F>²¥fu\rSJ\/x}1B'&*X1Rd1"E\!rg4,er}3{4@ /\O$GA6ň{k[#uBIʓC\ s$ߠe\%'+S~v:R@H{$$oM)+왱߯ASV#jT#7y\х[; ci\^J~l\/҆Fm8~Y- ̭Pz3Fk )oD@Է,\S;)@8|TF55zNf]B#ƬKu+S|N`̇Sk k7(\L~vՅQ ϺIq.ʣ1C$fRVR9ҥO;fVQ2u=ݵ9Rxra Qet?'\;\Tj5$[ ,DۭPϗj;E<_qe ~<>cYR;Ikh^~TٟI. gmKݦ 1b};Mu.'  VVR Gsr܀(epk/QVIM%`4zlb~ Yp2TLb] 3͛fEJ3z}M&2RIuRg#E?}#J2WMpZTfx,Я2Uo)`sS^18')VeaT~ )K1J\!{S .̗ )Q!2aqGi.Ǻ<:@hi4W,6o$esȮDiNi- CӸ\@ B\qJP^sh*LIXx[!DN~r\9vXy'jKjϣ63Rc$xr'}[ qm[ى§"E@oE0n@YyV0$sEf=j[9=fynI&ߒ0 {'4\ m>>m@ 2K >6>*myuIP5x\.sii.HCID3 OhI{ #xJ-[okY?yd06[1 ĊgYX\҆d& R\㨹x( \lmI8=8jQ%8M[=o%; 7#t2x+b=MY7? v,yMTh}r+eMuOUcUKZ*LPM|V! ]Xip)2(#ȚzM𘡚PHϱ#= @䊔8q֨4W%A(q |ϟX=|"O3"~_JEW{y}>}ºoïv{asY0O)_}@w%O'nG{g9' s9Bf)"D3S=4 (BP\_/B(LbO!tFVǾ[HZd*lmjuQ*%%RGݩQ]ۂcKYUBrוuB; KL}xb|Ԗcn%*x7NtbWja7e8E eyyn'|~97fcQ~9REK[F EOpBJ>UrGXxԎHNH\`yFI%ru'nwK+ vvLr\Av.$ IǶj[δ>V,X/瞲0BB*5_ZiJD":Ai M؈q 5 V]<ϸ^/Hb= Sc_Ml. ӥHǤ6N!2w_D'8 !!z]ET4IZP*ܒfLM@QDQ4#W.~y @B a_bwLlKGJz$ r@z:erJ j~$<26-AMk.1Fv2D(̪{WJ00-9MmXbeմ#^>R̂Eˁg^K3OBDH0ݱn\+R%:R7T[) YC*%5N݁(] ˳\*գ X~D vj&PG]ܨHGc-Aуc#upg,} #ϻ]dQۭԄo9C_S}00+ C2BMS<5eĦ>י&׵ZZ[ s@ U |#\A'^mU?cnkexuޡX\+ e0bZ>g9LxPEzחkv޵ր:+*p$.xc +&Rݹ՟ JSAהZ <ǟYg*fr;2 L(/69L*!KܑoT W˂) W?p_8Qꖈqv|2[bPP0ðQͦJϻm= PP,*Sɜuknfӝg2Y3gΚ7ϳɉԸL wRE YN'(xQDX$r%+v\{7kDJL$X, ndpWJV,,22Wch4G2wXɊ6`%zߏle]I|mk0Xؘs7sQR0$9 yBUs6ywڵ)N\+$ #֎P efdqHF lH`$Y)~XE8J Ta< .(_6zp)er].ug'f3'ԧ t$Sz :hYypr6t.sB߬ G5HOy!{NXa^ip8JLbt6 4xҒ 1o!  {5r<t0TjmHڙx㤏W+ ם CJ{t;4gFz_Z[*)rm]3!-*tNh ;YY%/!<׏#;9yTT($aC{`ԲplYnJ(0 RM(ApZt,akMU+JYʠ_a0pӦ[bz2g"c]"hd.Ŕ?l14 Vb1BdB0aबGs9\zYK/ ZέϪu϶@2HIfsœ8\ˑɞ! |eGJܬY\_jJ^SJ&nkkGwμUHh$'d`X*ψBE3o]<7qNaK!K وT}g4u~$UY`OT١i<[TLzKV6yvĂ+ﰄMrY ~k`~/h,dj d-&Jgš[=cBUu,y?K!] MR7l#HaX&z[.f>kɍ+ ]ׇivᩁpUf$#/Eb\/aUX``!ۭ_Ȋ VJ䨂ɎYقRGӟTG`?dTF-/hD+Z`H_ܯ9I][7jX&E{k{#j}0JU 1 '@+gΞ@(`yssjϮ?ڛmVîx}~ܩaA{R]{r)aeb}TXG$ԫ"F(γK$~4shNgZ%/gI%di#wn1dс·cJ/|멮L,N2`׍ޚңf#fw{ YDv Ec !l|_8#~*@nd;w`F*a 5ͤEٯ DaO9 :f4Ψu+cuɹ%I8-i4,/JύFݝt|E>O֝,ZgK>k{ֳgX*Jj6K{3aEJ!wxԱ5}aS?N[A XڏPcg$\7%`7D`.!WS`,URRemd=`] )2);^m#a]b# LHdn;iSOeRG(,gk[t,-KɣZr=nʔBav:DŠgk'R)X!!gk8>M%3@xyvT2+H;({Ys*~p P(ah5!"VT#٤2ɼx `e?Bj 6aV`d3-B{.VR*W)ruA)-W:2JoH ; uh2Uy[g't` ]Nj*uV iX誰'#`KFԍ$_?C628qFR9cC]";{BU?S95dCji"5$,Q❲hRm;EO6cĺ< fAWX}fb K9!f7vRwhs2Fk##t+:_\uy"J"7ȴFrٽ.IH)Mkq:E+SC ,]V7:*@ )yC>?8P YeJv xҞZ8["m^$[ң6Œ@%Mj'Xj j(HT2 u9-ex @uHVgbU2֝ghk:5.`ر"]}>Ћ9V1]z)7;] eC1j'*%nRq#Y=_\EdgqHYIH\Iv.K~%ܮi>n$WS,{r0+!D.ľZgQ@RNZOeڵ 43RhwSWu1E1Jm T"!9({Kqb\FR(R$Z.a kJR)!Wn2OE9(V"u] ld:j@JU?B\ﹲc5oТTǙJqXj#:Q݄16s m#T$eQr:KNSqX۸=5KWĬ?/{ #,w(t{Rpו󄈜F!P 8`lwdJyT.(e?W#`(`.KUJ_sJZ~HdEڛ\q1FE˔=C(yyoW }t**FYsX22ӝB!&ukMsy,parYid#>__z})s]=ɑ]]eYp̃R`-l¢%ku3A*(̐tg ,azw/e+ ԵAݮ.8/~FUMys"Q><<5 p"T~>WS~ISb]C"\ESBp4֊wkt#bfuct{V^{ eҕD.Kte`̡&\e hvfḀj$?M7*I%6m8@EùFkz*?x AqE,h~j]>Ib\ˋ9D$\Si< O⦙`gZJך))?/~:ngq KJJW"@HZk5ɦB'.x?Y +JW}U뀟5l T=B&Ǣ:ѓ@Aݪijx+L< \NMb 3+% "``}6ٳb"}"eL>Og8i?Zk5lE!+gd3ChKAMäϊlR2ɇ}v*R< Tm}g΃- |_-p7AIP&ծ:QJK!j{4US?s!KYJǦF5MC䶶dࢇq0Jg/nws\qڨrZO2 H\ JX?+k!M-`+#UrX9]1Q'K#Tkž5XnUI }K9>s߭"H3zFت3yR4J:+3WLM~j` 7KLvYq}r6x.dQd +ٽBӁ=;M>оȃNzeNAݤߛ{[бL^fp\åm,ޭќ#AQY-egӌ<=LBBnߕDeˀjt9 ]c(kTv"1mQz/_GJUKOxhuu @@^!vMbCمSBc@?[fc%*c6)_@Y䗏=Pm&- tO]h##) -s`g$1^S:Яu랻[};ʧLLijEN~e%zhԼ/U=feEuRG1fv_;NjYlLJ\&VG9pR,pL%F;#r!;BVLvtE6j?Iӯ}Obnn,#o.t2L_sػD-$ ΨZQcںфtX#Ƴ_xӲ)-cuI:,}[$'!̷nZ|gfgiOf҂?Ytk S 8?6猺@;ok9Ȗ`h# KJ'nz "?Fs@ItVj}/c|G#&40H-y4@\8"L~e7GѼW, ڃm#Ui*DZK}u,h|u&Ҷ, _01LC'͆>6z} [+֮Ǩ2zh]F} 4#Ζmr&O{v \BrOS ͞X8zuQծW$mhh 粧ifl6z0MdN9 Fz{{MHy %}ԲcFwmpIqN$RlւCN;Yؽ2w U¨+!PHI ~ G&!FQW4]I֛`{XV5|&{ -]>Ğ=ڹ϶3?C{ )RVMSw=y> G`t ٫ν\4m_}==# 류krfu#ݛGs._2g@=]a=G8ei4K;35*!RwYf7̦,z-`kJwV;H&Op>t?[g#.[*Yڭ ¬ϨQÑۣ:iڕl-kactdK!n$ͯKqekXG`*<>an2=tѺ: ?c1k @DUK]ja%_z!H) bĨ1F͞e^p%>z̰'TaaV ҡr1rM9y"8IWOyM'"贳L_#J2)qHJ CSc}`  oӒ.;]N6ht{ٍY҄|$wn}RF- w,b@uD !xt]cE sg,e,A@?큭-l* :JUf kM5!v˱O',Jӝ7IUj}E-Kvf4hg\K7[zyhJ^r>.5hJ SiNXP'=0ӆh!uK>'W㉀M[>.t%RKhPYs?@LSs{ ]As;O\K̑ e PZ1.^0Bt{tJ$:gmvo6nd [b]u2 wXGqe'y<(؟jK]w ?2iIАZ(UpG&3 LM۱bBHp\rv?s/8Jy %N跢Vs5\UZgd" J tRm1FLi˄kIX5襔xЃb]Kl#XPITJKm j ?&SG4˴[32e bⶤ |y !f ׿\.^e×NwB8~]fa/)@C-mtХ*3D'!b}G b&"<ݶeE,* @䦬"=r%M؈*OSP!\ZI\ZCO.5V= zRx1F|~҂< P_-RͼI'KպJEINtP4ZE7aSkst:Uf\䬯'x*]zԵE2GHE' ow5Z: Dl혳et&&AޕVc>Ss =kI+0B ?#frUӣ$c}, u]j *2ucܜo[5K.;w& E%'2נADrl p,4I6':wDZ:#{g<ʖϱY9ι]XSlbY6t%9??d'uxu1e/_׷7,q\+XOSp9O󧎷w4-Ԝ56@pQ;jfE=Q*X$.emCB!P R!_߰,\W^q^O?2_oRMI>\`m'~pD;Vq ZC|5C<'ks-$6.XRtJ m5ݒ73rk#\eG̃򍁘w,V^Tt7hj]k{pd]uy1%F@tNS#VBԟYVZ&yu?-BY;%IЅ5l\tו65)PF/&Kz6zMQو3`@K]fVSjbX p9L7IΗR:s-h /?tM{ z"z;8Z~p <OS_Lӄ~ ///\R{|ԩ, C4`~69\FAbY4NJVqpz fUS7vbܔ+,9H1NSFT!9RK΃-S=Cșq't|ݤƅ30\"ZLBMЎ. \M;s\C@H>e 39".;.߃v"2i%;zܠGdR$Z޷G 9vb >NN)#?x܋[Imenlo-X`p*P)|P!m*,Q}0e{,\h!.G|Ʌa^M$P(4 $-vGզ LBK/N' 0YrA ]MdYͩ3$" VwT`-FRݘ߶%d2;cΒ ngQ[A@tL E@׭>#zOĸ@}#М :6)MUBDz,9(!@ =4XP|ֆAL;oA"c#c2G~J%b 4dlkRy;ޗԷխ#KnGqAt=-R#ˌ3Qwx?!PCʨ&-h4srtI $'=B˛:'솺2U>咫z$ab;/G#XFGu%FCUzH;聋!Ům%ֳ#I9kb`ߋ{#tȟYkZA~1|E-O.?k2uQ]`#t'wקy  CǦA0E5;nwၟ~K*a <),ȪBⱝZ`f H[n%y~'i1F#xnD(ֆ5n3逘_;TU`+W)ZL"록S<ڕ̔;8{3H)QŒ5"ִVёHM gTSO+R C8=wE6вDb8TG^H)}mp5! !,LRt0βJO`I,oY񁚳%i3sގeg0Yp"!&*{x2=ɳ[1UG`#Nwހ0` uFuN9M~ pc=ax䊷Hg)+ Pި 2o8[|>B9辶FVXV+PE(܄ιК~^ͥA@zN)=j 7N~%`rPˊc:ێ t$ ]KB1M ҰOl_/>e"穊t,04dpI>,nS‹EhCbj&?Qm5ŸVHY;_R Iyb*TDWx_/X|1MM^__ SvB^)!B6bc"уFMíKѰR͘ZiDQP0kЏf&/<Jg4J8y1TרSk곁3(eMc o[Op(WGfy,2R鼆5 ,RRO* χ* n^deGF EÄVI'YkU#Vy]W8r9RKH%oHN ;xɯ3=?_s+9x,ӌe]~凩fQ Cp%zYlALG#lMTժ\4=dv-jky%!_vy"M=XYsKVyPqKQ$b )?*!D'UtU~@SMRGmJ*f_7Э+͓eVcL$L5!vnk?䮰!v㦵\~j9m; `kDX ^;[) m6KjV$yq\=L36Ĉu[P6Ax&`7 :4˱6'#9L H1HAQHEi "T-\eEq nPVO&UWkP$ʌ4p5Q\uwN -ocp@|'Su5 ~xvL~zzqQ+3P8DzTZk'JG04B-͘4Y@wꤒNPiO>O_~?a^;?3y4p|=;_$+nț"]ϲ"֌36"(D߈L E-VkkB6i2UCZcs;6Zk0mv3|7ItZxHaE-P`2"* \YYVmkrrRuJmZ{?@Hpu/Y;T$i\$~3+"7 čOh <wp;L2KQ{nh9𹢐'|or*[7nJ9쭹 Zl.w< w BJ|( / w -Ȋe,YD‚fˏ='Ca6-e5#%S&$KV 5 Kq+M%ӕldUvXϸ!DŽfRѰRZV3'sYֽ7Mp"Yx6@NE;vUl>Ҥz(N$!"m狊9p<3\W}ʕ0"m:mIӝjpDžt/ˌԶԨ`/|~Ra]Y]k ̬$]oh#x(L!^_r/Ez@JD3@,AqL>bE;㥳ؑ3:Kygݻ?VgY5k@()ex* s ci:}~7Lǯ~2!gey 6n*@Nԡ-0ӵ,.٧]I Sw"T[' @^]B5p- {%rUw;j IN3 6G"`ʹ0 9AdtfOֹOHL+O𳯳hY:rDaZ%m3JyL󳭍zp@ʰeP5Ɓk]9@FS!ϼe;?"X #s!z\J´90j?܏Mf7qr(0q} ~`BJtgŢw wjw"P G9NTa8'XW99ujIhoA'c?,X22UTN.T)%ƪ o.tPLЎ4v:3ȧ,tpn]pݐR/|4vָv_p #oK6r{{n!jPrG/ĤT~HV1tr(qLFreXl2nr9dU$s)'tƘ[5w-o2MM늰UJxmHD94; Ls*c&HBv{',kۜHB1 ג \su?sBk{&,V2էK1iI r-aM NuǒNyMF͓kbcY#AY*~bõۋM^. GT1Fduϻq*~=DKaI @ -(5<Ky>ؓ{]7֮n{Agzz~)by*q߄ P-vlμٰʂxN菗XlHMa`7`Q8nϰM“ko7&ix}0_}zN㱶*>&kcf%rJ>}sp$>d Q\/W4˲}O?/(*C eO>%(7w Rgpp2+>XV*\ -/o\@vHt)Iܙ(90ALdl1d0ZGjjLfիp/V{tybA![}޶@A4X ]qϮn^CFxA ZX}Vru6?2Xu-w@;^dKXYOJsdLq_e<+[;?ZbtWN^SQz_׮?O3{sG3cgS @}Zrʇ|n=P.sl@3E7Uŗ {'cBDhw)"  iS' ?VW1n4̾CVۣ$q0&wcK =:(LS$w|0PjZZQ ^ h1>J6,bj]497@s !2ծIƟϐ9tqð~;c0>Ws˗/Ɗ弗`C+AmC\ض5|b1{:^}!VD&P eY*9?>\#F[ל8L19Ef\@T]XRyfV]Z,X@sY)9{ᙾ :#sa%2ɰζ6st8iLlv3 )~#߫<szvMl|6%"Y 0 <9nH8AAuT@+s7fd "B|.0c>p Do?2`ɫu.*/'Sm ݟƓDzeCtzT: eUNyeģְTtgu:ّx<6y,wZ<烱PZzaxb uc+Ur{'|?iex$H̦ILb9L[]sDTܡ )8کDTmUn]kK&q8]s@ĽB?_E i.K 0~ ~`_+~9v_Wq+ouYA-o2I b'dP))Q2E2בҸbF4Ek4TYX+DٿRq%M۵$W; YWT nr3:[ RbV: J(Ws1~}z$.y:H/-\"uqQQ#ӵ"BZ[`\{DWƉE'$1S '$:@x]( RHFmY΁V5"GtR)ߣ m҉;<>J'15K&`}P8i bN'Ʀlo͕5f}~ Ӻ?d@dwJR=u{q`{eLSBuDIQ0k~PO.n ,ZkݿvR}1_~E/// *eYg~Wϟ?/ .K֜N /?yTdmTw&%_庎$(a7#%TZHfyEuh,MsU 2r.Ox-Y{t+*9؉j}`ʤ9 {34Z4Q߳N2Y݌~ +(ptX=%r rs=.r?yT#$5ҁPY@I^gaO@]OQdS2g#;<ž(St`T{M@jU+I>C=H)܇Gvo;>}—/_́pj@G_~~ϟkZ~W 稾/@A;Y;wW#[#Ed 3T-A3\rzG>~;gGAYgOHx R]:DJ^Ӳ.x| >j[~=S,utNq,-t?>VԩOłN҉hĐ\dA.Qi:Oeq&ٹ۪ [\+s'x7F1d?#+aYN3rKQbDž.n 3r_Wwک/qFw^ӧ1x<eY@Dx{{+ kY˂Ƿ xSڜdpa> csP(}qdrēPT4´e: l*t*\l`:xܤ! *KN_7a& < ƦI>a WGɦ"F# =/X3YX(iH9W|~GxQ-yfWy-1MwkP3mR#9A8AӰ`}cY4#d& TGEd]F̪ > ޞ@H>bkÈRhgg=gq`;F7?Z@֑iL1]Y#@D_Z7i2\G_~xkEAhY_ooos~X!"e?tM%[Z~!&]KJk~oF ^&k>0;ˑUU%k@RӁAtb2#Qb&emdV)?x4o>L#Ҧ׊5LQ¢2Ōv88}~c>OyLDWYP-8-n&{IT݄%SU+~-_+2tΰ<$ڴfr%QɁtHHd}kaߟ=M@atuo13|R^r4M5_[,Kesk\{?yPX׀iqg551֑I*:\w>(6UXBU}m9כ[z<Gk)ʊw<~GOr6 }3 .cٲ,khEP{*6ˡQkَ \܌i8VBޛq6!">3 '^|B>?{0‹XѨT6(MP]TbkQ?ؾ}tDϰ D1xQg{L~}V.|fX{[ _1ASgxyĴMizF7@Ց9 ҝDzQʙU{s:*1owo~,UGŐ0ղ,\S 1-IK#禾 b[*y)irOlA3@Y,{̺<ډ"XZL~`-o}*CZ+N/'%m8)Q+i89o`*H5,xʍm8wؕr@d:(ir,MDzFO&H@KD2hYi{YT9#cT[k^5w/˦#%5VH;muWv{cJ .$HY'*(2]WTŎ*|lbLX,-b9%*:*;YQ nMp~ݞOO~"2r. őfԝG2"LhЖЈ4y] hEGf`wdѧ_~x}˅e //W9фV[`qZōB%KZ"?GBiA΂#a݌yC޶K+9PZ yRQOH)5fA g}PI&){K3ӵACEF9[rBߙ񗮌]}}Zr&/ۡ"@Fq%\ÚM1ヅk+Ƚ+ Jc? +5u/ɪ3t R{e;כ$Q4r4ǥ\yHO(_e""_|{[|΅&D`sY$9Y HN>NαSL{y Hw KYޙc#’ޖU!_JbzrF*H~MS)!R0Nh:SbNj{|t9+(v}ӯ~pV+ӧWO^_1;+ /?̛zZfN Lz  ƪZiKۙfiA&XVpy8sڻ#ۋcю2ʅ{3py浈ν2|r@GsRc٫20H W:imfJsƶ:ڡ9%$@ZΛ;xr+`:h־2=FJu(j! =R1mNN,fH'2Z l>X± mu8J&'g |NHr%u;m5:-&';_;}1Ųs+vV QޜhtY)>3y6{~'eKjLFuZ ]RwacՋ[-*{\_̠#*2*J`oufܣB([b=t/ٲ$Ls!uMpHXfȈ*iĞh%LMukZ9<9_ \Vb@3.>Z׾|wІr{mY@c`~Y,u =(eG1:M`0]Wo_o ?U7ٸQeO2Oz٦1kcFJ&6/G0=?} ak gx>{_#!g)Uw7 ul!5M#O2uOL^g1C.MaY b%%UtSkLA˒j%űdc$l:H3gߙ $q|*[,K)t&ӡ^wt~`aB>F8;pǧn#l>Zlw&Ngߓgct.ߡlvokcQkAbuT )M&A\kVг؝}$lF%SV-I}" }l^GH׉Tr}uU#dA &_5=s_uUwFf+^+20 I4986g#Y hЙ֯gӸfur4Y wpl"*xTx#&ƙ5;J7 shGPL^ͣ6u^Ms޹.-Glʢ r+6_g^_񸯠{G9>o(QgȌ7Ħg#@FS7 nuTDth(nvŎ{8k.#St©\RT\o֓uѲL am-z-ҍNg\FB$l$Kђg`NpNgvt@dzLDSK lMx<R膒tRbσ4~ID~>h`dC0*# >Fm}LR7!o,{s,t4_yv{ K*:WIzї{ QR~kBY`Տ8t f]"9T qԳa⛿ :o{ *<ꢘg)cG*cTVMhBNI0 b\pe*+^__q',K'uM(u]Oέ\2)%Py)'5A49ABS4u692>$zZr%nUFzXTm0y63eI$J{DZ]<5voܞ~p]Vw~)Qg1uE[\ALDqzĩ`2suaD;[ #Z䯳u-ܪN?yMշl@k}% g!b(3YJtճ'>Y,J]la*;!\߇ lכbF."1z3 '{~lTv)ؙr[r[CriWI[_jUGBDg(bgg=M߂>/#5Ψ3,NV%-BF^^5cNy:WS;Ҧ>S }4y|ߺY옏;]GLR.Xšn Sʚ=z^rOn~E[|zkb=K-"w9>Z[I_moJw62HC4DW+)\WUYt(oȤlOlQ^',gV"RKV|Fu| "`( [})ՍZGWߖSM? 0Y#аUw; F} #Z,=-y F>`,4@$?2vT#w1(R˶̅SW-I)}1("\Dpuqa<.%Y%Qu$4zv ޳ Q=[C[eTy Pfh\YnH&u3C!Z}\f{ Q@nlVZ݀RGE}$cBQ#;,:M!fCl$+A{E<Tꑈ Z\2Za!%becgBKt|d cs"⁀DvrDWN jtV'`t$j4rٗ!cʉc)B%V&GJ{* 7H{Q=<0Y=s;ul< &[YZ2\f3Ub,>,KSN857?fYٌY7D6*#NtxC l[σG! \a\F_V+Yl4,K8IU/_eЬ|a4tsVF|?՞gbj) H^#hA(+ ރ;Secr)F<*xD 1Hl$rp.b$%_ mdh ,hwcv;z, QfaFpcBsu "ym]মC@yȎ.>ٴ7Љ6(wHuR#Z|D;Lb{BڣSBwUgyԴvKJYW~H⭇"/{'$$"(+e&As@UY/`-;ҴǍcb@o]޵}?GnbF%:E\3Pr'!+.K DM`NWն RU T#72:ΕIg5BtlU9K/l(>jQQCYab=G=Urҋ80?5ZgV08i[ Ս,[lwN\ޞvl|^ *]:Y 3Y~0&kc\.5b'hXje-﵆G|g8r?,lG:65X؆$Ph U>(|гfR^V,cºF{ dt8HiKVջW}=9? [( .'tZ{X`ϴn6ΌMvy8a6 аLFh L A{pBގ2QdK,ո#;e= UB-tRD|Ř/˂rہUό@l4[is+κout2ih_HLt;fT~OKV? k#i$& }lЊSpHll3G^,q=[1T,#Kkk4)&Rcn%;9H;4*)t{V~a쏘ћ )͸EoXghܣ;H?r5uX{KkgLͶ&cu1LwFXQ?g7]@-| ಘַ7 @ Dq°j[t)#ZՐл3}S\^.L~b-ɼ kX6:ͯivg~|cmVSOi:b׶E'a|8ٮf3ռ_5!G[V2݋I"Yr_;eQҞT3'um8?7*̀6p<^RGVʽ4qv̩30H!hJfjY],zgPHOX8cEL%5MbHiGّQwpsU C?u,Ӌ<"UZ ,>x)*SnH{qc9v@x&Q'FҘG& e\evaFB ;(tt#1lM@%Ap ZX;>D*H r@ . 3#˺r:Yywnعv&ܥì5 wqhgP\8Mw˖:t5'1|ok*ofut: ;Z @.SDb@uGoNR%Sj78kxtVמZ3Prbrcm_Gxk=D)Q5m[VfgR'j'aC_1bUk\IŃ%LD%[sNnWό,ʖHiD5 LT۩9&i7:aA&>Y'[(-{R 9|<1#s0%87[{R&[Vh>I$|oʼ0+5u,<;Tb~6zawȵơǙ2wș\wg=Ξ^#6>m=z=ݽ Qa_ػCQ81<U@ue܏&16vlHC\ ~߇CBYo|﹎?86fJU'_Nz޻%-fdF$F$KcCwZ׳bN;&&+#ťdyF}?t)y[)]c3:uDZw<ӳBs;۶׋L;eO K'`%=`$X¹ щsSbȇd@ Aʰj7w¦-AMXkͯ?ƍ[:ؙ{n@wsn%VP)c3Q*YMW#6ψ[=;?C,M%"iqݰ9:*&6^TSm?-`}BBb263+|'Tfbߏg)8U՚e1!Ɠ,H3y[R4(RDhbNb , eࣤGڿW◟MŽF Zm l\.nORT SbԟgoT֟o蘨',01~F`9)Vͳ )(Ǽ<t٧D@J#س.x1$r޿f){>B?~y#mPujKG٤%wko;lG-a]GcIhtض<ȣnl@`X '+Xmt=V:֙exfMt3mZ'ĄݒVu-ޗx?%GYatD$/x1m3WmxMrEK}k/sѳ:4YnaF179>pҡ¹D"!1^G\5j@罠5ש$yeǻFtI֯uMN~zlJ, ,11ϥ>X҉g#gQ"iGhC$@p+uΌ^ 7sw'|(]Cj|Ÿ<nD<}`^85ĭ|/>,--`]3{֧AϝR|>]lR޻7AW G=SNH=ϴ.}&@G W*aHi?9N~KZܶ9>h7# PJ0 ؄; b^@S{vttXI:--J52$[]#4z!x1VB fJ7}jskZIh2[q _ce4? 5Sº2q[]װ/bHiUЃIcxkzUDHYK:9>8s{lW(HL4,->oTInw[ʱפd޽-?@~5BcUb~NnKU5YIvLS#Į"3]yzWB_ (9TC}ows. b#:L!FσyBcP6%A)-ܲBʩd?D1M{gdz(# + [">\gj%gr|?WZ*//W=ё4@kj]9,Emx/NTU˺`Y5} 96M~kgD̏\Zk$s,kM8y`D|nS;B@K:#IONyR+5綉vL)b]gDH] D(X(0+~ɯ `?NL!c6}j,g יS>,+ Z.k`&~rYq5*ڽ߻ ΟL895mHC`Tj3y>6¢|Jrf6G\L)~O+Lڳeʣ_V 0),33abWT8uZרY}8!9KގzNfTpRSj $?g(/8DW#~ɦ0J%|9"Pǂ1@&K#N{s}pnDR,-!J`ںj9h޻3f'0W'=KPܰ,P`kϟZ=uڽ{ 3(gxV[ѨX5?:jdZkrgiapǢcYj492GMulx9-)hSAIFʑ]8P)k+M HH2%2 x4Ɲ#<2nN$gAu׌T, Q߫r{>~f=XLȀHn-[{>]۽Inv9eٖcRΚy&.Uڿ:!χQ4juEh/]_Q{n3CrG: zӔ\ H9H~1Nvzd nHhl aYpI@GmG]L}b4 >d̂$0lҥ;$g'u6蹖ܮ1kH&:{oSuS؎ *cVVP}vUZeVґ5כ"-}=3 S_÷RTMyĿ>vIdL-Y{=m;4GIoW{Rs<&͟tŪy2W4(%gΟ3ՑȈfIo8 {6Fc|-q\M ?K_ʵPs<&afu:riڬj$ǠrGp /šY-=Up꟩Zߢ6w2O=r{&Q;w/1{VĪd`ϚkbݪJ6,_g4)5z,h:8[\fZp߰,U;Y4:82W:@Ci4vᙿG _(ϑ w v )dK`6zesV[ c~ {c \_!Z)־IN XSblr!sx&m$u;uV~G9(U}k [}WQZ^Oq@LZHsՕHaڻG\#G'x.?Co}R >=6+2JdIXĊ2J %nq@qɿlʂ ZG"eIHmo\{vN6|#7u2Vk/V؁u \=F>cw' YJt$˃b~`, T#&ivXj`8_z~WF -&5U`S-*fh#i3+z2rʈz]~nwv6$6 FNy~9>RvQE=mBg@Z$*]{8QsDs΁U`sOɬߣ}f$(5JP%Ν>83%=`n ,n8u@p\vjGT#I鯌{#-woeݿ+r_Oz^V ) 7Q2hqqaӪlIj|[mg*G]!kuAoGHn65>NRl0?DVcH_auzrzdu0ߚWQp]OsbCVM֝]y>s?sBhnY՞sY-}|M]e;j:%e#ҽ'Z\;a۽_-zj5 L:Fg\;J3=G,hLN<#|F3^pE6Ѓ@V|ba#]ǡ":##-]Y#O H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FBIDATxym{V ~~k9ދEmņ :FZ JP5A 3SGiV樬RG1L5C^w9g5k{I!qǍw9v;Daa|pa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa =aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`OaaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`aaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaa%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aaX`a%aa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaX`a%aaX`a%aaX`a!ޞ0 ?-]?bJ)RsW:O/}$"RzGJŭ{yIߟ{a7-yR^;D90QJ}ߣ:03rR!Ffl髿~0 0~7~}f~UuĜ333{0k׻s51@)9%/?#"( `.pWۻ.|ԗѯz a|W9YJ{nA b/`&B@T}i<\EoC@vԃ_7}m0 0~ R[R[)e 9xsFs(Ř. 3h_@0c&!)(`OW?o|d aa|eyユ;z"k8{F?K @Jjr#t9\_0L @puuO=׼ta|#L|_{Į~ZVsĄ r.繶|j|R4pGm1 ;]d Lk.੧z}g-0 0O_~o3I.]RJߚo03; JI?c&xPJj mM }KpMD'/@ p[y-9/#|- )SND @ P A:tCLy*@џ/mvpG?s)~؇}={>a/D+E[<ZYBXFZ#:%8{"(R@&(B/",Zb@B߫`0ɼ>m]G3Dǃn/~ҟS0 ペo/eTRʇS:K* Y n@Db_ dZ\G))Nig%RV2c}$#TR Blt]A.(><ͻϻi_}w}Ԁ%aƯ*__H~G/R~{y9~/}jړ[r)Z DPE(Q)5A@ pa #ńiAl;tuف c&01&<]G?%aƯ o/#"D䷧ 'G#$gX\ϴd!R}R~Bb-,YB7'Y~\a}f}b3\qL)}/ _-0 0~y|ޯ}3>zTMCu!9j+ue&8aQ\O*$ÅN>e4Wr:$@@ :hu%:l[v;}rΘ<#$0]aÇw߿/w>z|ٛ%a _şr""zs.})x1I53ד;9$YO\wЏ\ R 9b?x=БyeJ@BdV߀j)%S 8=v...Ϊbn}w?<2/e|K{@\/` ROdSBNفV׾})m@J.\=l7[}_%B9g0 Apqqll-'>hk0 ...p ?B00M/ D4%0 M_K/}%@A@OhTjw{ D2/ w%XPrwA8~b 9 nՅ>'_0%g6;t[J-1#afAJi4Wanu*`ܬk\{,>j],n 1Dzn'_> 0ǿ5Y`ao\OOʯ#&&@ [&|8EyO+`RD1 H)]MRI&l-BH9cf|@ysaQ/qQC)t,bw&ppXmKZ$zj=%usaX:7ã\OKH!t%gܠ{l7[s4 0B/ e ӖS$ e|,wTPbi_G @@qAtPAYSU Pb"Ͽ=> ƨS҂/Cp| ^ 0 ' -7Cci6hN-f5q3/"Va+=B e 4%a:~LD>Hn"yRឨy2`'V?Hszo`m4?N9eupD( p̂"AȮ aN˴@zjCzv쐑@Twڊu)kBEd0 y 6 ߿_òJJs6zd \a|}(?N>|g9I U蓣'4"E}j~ $_}]CN}Y1EPD:=IA<Έ]8ddv.qݨEP K9D @8"99wB<Ϙi)7/9h RdNŕI 3@`ǖa~|>EOyϿ9as IA *,R D.8vUH͸k)8&0w 0M |A":&"ZwE2hQ΂XNk":}N*Z$B R&2RdfsZ9/QJ 4!q@D,uˡԄTiH9Y`a<%"7W5I4{n}G m ֻ,)ťO}vD(R>zuַk.5KMTa-3:ݪL~Ӓ<^(U( "6_Zl6k;l)3ױH2JZW (-0 0/"S݂\20A\]VUX{X`A[ (*+.RZk]ļ;x#vIQrQ-@9)KyA\K5I;0!x::W{`)8;ݞ "W~7hSmIźp$P0MnnnDovi'u;0 >a ]}sl[^wNFg 2K)0w跗Rz \YsuN:Rzꧺ??aUi @]7z-ۣHOORЇ| 7wrF A/58 WwRH@t28S5ߋBճNi&D͡2.S" )?T݂@|Wr*tQx<_ ,m>&u)ab a_M ODkDFtyU z߷wmDp.3/jOJQa"F8xOW=]ejCAR,@b{-`&`.pœ^-.an7s)SJ/ȳׅ~4Oͱ{Ywng;vK8ψ1 ;⺅ 9NOm)n:Wv'!%OKʔ i <ןrZt %|13 PNuS{=1PW -U:n=gcx~:Nw2>S4׿yYDj۾VqkS9M(NJ9ǵ a"@0__S7^SJ}>#du#sL(E0Os-qQO zZ#_\ .+;;EP@:AP #RUWwŖv⥚ Uk r yMF7qUN-@oO5Y!y\[6޽8RjNb!380ׄ@} 4'nU2NcuRM)4ѡhy;dK 0~%N_y>ᥔf/"x'Ƞ\@Eɂ)X;V#nZψ[{-ߝrV]:P:;~Ys66 yL tZDwN" ǖ Ժ ^֏E 4/^_Ga/kv;蛉H>`_u+2x~|=W߲^!@f=umjt.>SZgRDTTC?" T VmUܧs0뛛%IB(gxg-)O䵱;Y˶RJ퍻S;(,.zjSzTǨO@!t]f^,Z!ZѠ!`E/Q=1a3 5qhuj~CߌNׂp<)NO5R'kY_pY[R&=& l ẅ́ZrW῾ͻϜi 95ƨr"$d5bt,ɥ%a|̋oPK8HI׾ QI=RcZ61C`q$xH p$X,w)O0Ӕ0#✪د^ӲnSw:qX4We)%sm@Uk T"$ U~M0($ A}iBj- KRx$cLچL^1iiseَH$g}'fCkNqvkVCSuoIZ׺.ئ ՟iWCoIW BE2!&,u,s޼۪X3vsuvH`*YGة:1I?sAפDk|eKBW]\h1ɠ_4Θ7{]t3 VNj@JD* i\I񿔩: hqOֿWtrRqfs}nO|Ҋ\΂%BOspqM$Z6&1mY$PaD30>s?ޫz=ςTr5獳S>i0@T}ly9 "ͶU)ly9^_W<ϐ3!"1F;́7Z˫MN[-qO$bV3+/zfh\]Cr,F ꦿe@^u zʢƻU=Y$¬Ƨӽ[6u,OV& Z'};?) k[W~nRٞtjT`MJ@Z`qAXSs/_}p=;Kᆳyͥ@$9/&e3'IÈiDQ{gs0 ~ٻ'f-1YO^Dj >0?58 9S`vQj%!$Q-H7Zi.qNEr9G13r*>:CG;nz0I :УxKvBtNM_OLi^sk !Siw5 'Y*tO,#5PDdh)gQLAnfY+Gxfd$iK93>%=i:q)T~6b^lz`S $%f.u k*`b ] cl۝rf0M)tym~_p'Y_`L5^OzRgxm\2b1CLΩ@0-2N1!x:Ҫ$,E<-:t26R$QK{լ3͂|r*tΡ08].*So:bUW"jjFJ]P1JAmL*pu0,@Sg?@>/|b7Nx&;yl"<ĴtQhq4 ,'2HpZƣ;LΤm({p3נc-eTW 5ؕ\TU\^b7܂P/Ll֧~Y!Uq8DgkGCgǭFn } |sҾs0,`M-p.T)Z0#r)u QSc`΋}N(Й`Kr^jEઁr5lru?;D%$j3lL߷^ELڨ [3i]'Qb ,0 7~y9f礆4ǻչ ӎw86;,T꠽ui%luqs]OHBp--H> %Z6nkFepٜYk'<۹}#x=R Y{MxtjneՔ(f#ai\{rտ!5`L,NbNuaR5N:ƩM %)u4nTZhs^5}B%_>_1KptT5-w]XGZ8dO@Ry,矋vi1 }׿s~ 4J)ȫӎT%O$5@OX汛^@沚J5@€yӣ4bxwx1Bwrӓ:]U}QJA* O'c9]1yRMh]3vk{% \I5>T-O{#g{9;TeT;_hXV)03 ޥ<.D%>*1g74$Hj<yZfRJnX"6ǰl4-cv;xqsŃߑ}!D4G~$oCg~'w]^7 Ï篻f<kHOSsn9򽖲[ kpR:X,T*CgpMڜS7vwvGa&WqU.o"2˲3@bp l|;@0uHKs'/}:O&2N:nȨFCmn/:0 'f$ӂ_[vk;AIv8uDGl%h]1Oi֓j'p%$ ݃@tyB5i}YW+o .*J9-(+iD0jūd#qy un%΂ pwUVͽr3ZϮZrr;!1#no~/{WcNf.o޺C>~w|_˖a!Wcss<q}o\˪j]J5ziA_RV[\ZV`?_U1hYYON ˩DK-QhUItϬk/.8u"1_#;-')Qcrf .tތmfh-H͗8НY7/0ܜt:C\΅E8 mnl'`{a1Z [tw9u2wgU&׿eb:x0z88̇']? @@)#Y,GWm!i#Eq<ۛ[ c>cG;P8G>@DK 9&1^׋e zR`&1i"(jCLU6Mh>My :yXSJm0;t}}H4)R{ȼܿɸmBЅ&s''6Cz1FL99SAc_"g,(Λ(S8Mgޔԛ5$-Ѕ57vջw=avT jbX|؞S盶k2RAw[-%<^s&W%Իڢ@K=9e R}-Xn !xl+)>K]jwAzA2PJ%HΨX0=\E! =~Et߿78Mx<ʷ}_0S?1?k<Çz-:䘱nx}3sp*ZNɬB"8m~6a'|2e)yN׽臠V-yY҄q> zԫnzB=iT4Xq9B.S3j'kAznCgeZu c:mSN:R8ӌJTZ*CO*eזFêVjo%qrYl}NՌ6rSzoEݐYF8G\ `n֬iD{[z3nj]Oȷ'7[@ޑ"7~[b`L?)x9 b8O}.v؆^VE4 }˄;)edI` չl! f-:&8C@)9`*(A.׊~w.8NùZ/ >xs\㪄/p.cݠ!:ב._|@*7"zc h`NYU.'2 ⬛sT>r82l+Ep!u}4PqrYwM}G(PHs",zF`ZPꉗ/6"@m;t]$X !q/wmKiz~m,R0Uff r]TJFVqPP 0&R`&9ppK"<&!`8pgi N0̀~Mq˚#As6r&w .`RʿБ_?6*ڃ^)V[6Bff|7]N ? AeHp] TUqY9[>eYItZ݉/WXNkUAi56vʈ6C*WOwY%noozꥴ2.Wr~yD#ag}:=w]pElwȣCTOU'1ཫ{j4Ar""BS_̺HMNq٤B)8RQNߝUPM'qw~o DULP@vZ)REU{tsR]iXO|$:|Qil#R78Z-R15,兮-UB=J.!w`T"1 QM;I\\PbW1>-~m"4p#$&^~ySpuCWc^H)1K)߾޶Ka?7G@ Xyex2rY wɿykc }^ڃmrDZjf+;?U;4R8r.- *B@y'6@RZC|Ϋx\& ֏]B>ݟfʣϓC6!#VL)X*$V_Z_-;)0nvw:n$"z_RjZS ſ_?λ# bUUwLDʧ_q{ CsiBgME"nE U8Z1N/Y_Oz( 7չ!EUj6ƵC6깬O /mAP0p63!G{ f"_5_s?9?SHwjXW:G@ɻƲ^=3KV־:qu"q^IgHuEW[9g}jM;{=HTrAeh3C-}6K/@J& *#KфN±d :viZ?`dY[}eHӌ9//HYm COioƜ3D"@u D i T*/0#.pT/%!1dT$p!xjoavO /+ۥ0؏4!vuV |ɤѱV!٩2_oNVDK/./NbfB8^= ׂƺ.`&2xH. liKrbL(pXfS4M8y;_>jږv=:4:j冗/W6@nG\AgqB[3v$mQ{/͢T&Б~x7ҪΞZ=hfp*2jɵQ9OU"k'%c󈹮\y׭nIOΡ=Y?Y |p]~'fMJظ~@NB~]3u=SA&˓E,Ӳ G N *bc\gSS6U X q~#@ҋ/zfaN R.hUȗ,n].WV j Fl_T&kk@V6a~>Hi^ѮRL~^JY.w."v]{oXhـ8ccl~K֚``96Ų HK:nihT:ixRi} ZqZJ%ͳ:8;wKQcV Me~-1;dRHӄ)*]UZ8gdAJXjrfͺ&-@}WNUuQε -}s:Fe1|v*yi/EMz^z m %3swO䬧~ɐxOBlZbZy5.^6]oи+̓`^|&nY٢&N#9&Eةt|m|<q}}}fԂ]NYpWns7aE`'[%{܁B@&`3ǣ.Q;˒F\w=[&@Yw{K}D`F@wU@@L1.K:P :-4Sukuunw̬n|iYꞅ%XFUQ#?2c^(bc9'UKj#hKNن?-uR2"mW<|PM0lyQ9SRkFV7%,\bv^lj֙bWCysƿ|i6Gi#ӀnxWbs] 8np)AĔp "沃((iuTZ@JQG.9e aˌ&B~ 9~x΅=ofdտpAK(PHp˞Aw'?(B!%u 䢧Ivcpaݼ7) sI($-4#%> Q%" ¢wAP#ܷ~еN] A7(DHis" i1M*LF !tzbIeɧG?Z刪sr Pev7q{{{WqkVhgA?0F»4 mK59ϣ(bu E+8C`8\T%k=w<sDg|GC? y16qVwQ1f:`kKy.%fLqd2]l1;uaIII@]PfM\<:Œ 匍g89M? Q[](胃μ R@ 4ع\p(njxXp zTM߃JΘ ʂft.`38bL3$e@Ề9tL Gxol*S56- yx>x۩ȋr/G]6rpۼ4*7H̐:% \\nU\:"9-Մ(f*Y`|(vjLH]D.7mC}ÛX2`?㞛sk]p;!d]%gH(gJkNfD7%:"EEſLI'bdJ;Tj9r{en f)/ ]S"` N ^Vp F%\8gQcxA"f>] g&:lv"_" "uْj:D V-/-90 33 :-g 2Hk쀥(ȢvDžqBiQsi>adPVR8Ĝr 2ӿhUCMhN[T ,(8%a2g0N#wwU <e*.4H%F"%f}eڗxu$0 .($B4͈ӈ3+{fN0`տ;3dQ `a:c;M~Q OXwff0yB=CMጒJ.`G=F%8r "ŚĦ3r* .:HK1b6p%& gsT}l[qA>`m19p8#<„# 3Xx56à @POX9fZ;֍XpGlp5^G*SvնG{=R=#vs[aSOo1叾e!?\J)cIrnvYZw] >U&Yj$DB˪ܦZ}"Qտ FEQ$>Kr:-}u"y)EbF?(|nWBm"=s88' [q&q=Ơ" ڂRD7Q*Kt>1GMq5iBQw@! ' E)K[w˃4!9')bN v xۡ0P@ !@#1 t%eSq=뜎xv؄N=߻n~R0$o6]^7/±Wjt΃%iJ=0w PcM˰O-'=e_?v%kvr`k7b)դEOTҔ- t4Z_XC`w9k[*cHq(*f)udw JV7RHՕ!xm AwNU##K.ªW`Ț$up2`S̘cF d08uu =YAQ*#G(1yBah}UuƍtN0B:] EIݷ1M0߼->څ4 ΥpPi9i|7l0N̫H"л kP&Ӵ婚>gM[3E$c>c]OQ}S8]f8c&1a/7 !5j?~0d#*$'?rr:#qQ͎󒽋-8G8x= AL:DD8a`t|)&L  ߃C{Byq...Pvuv p5Kn \4.ި xEQE2Md]סsbID@%*\dqqyqiq;p< (v DNL7}Ns>TJsyy1s_+{gy~|uk$q?05M`G}@;yq5wvG]u&.;5iVnY崟r%]¢ֱ($p>YZ ;͏yऔIn:{Y< ^YFRD0?P b.S\yrэRK(m~nј|BN&8=:FϮn+,Pm6xxh*O=c!m~|+sc\?/x03 6eR a6 xkN]หUF =seN!o˚Հရk̳JII[h}k;`<z^=mNRΝ6[W=.//qKbO#[G.}2] >%g?ZH^ֳZ6>3Jp(nòrMYU'veY8=;,^ g1/w |_SJwۦac,Y;C㮻]u]]woG_YBa<}q%a!q{{Oo}?绮{}<3:\3ۖMqm X_K: ;w^6}NRmue)kX/Sh>mo5"ZisBLsݎ3%CU!^J`S?kcSVRXԁOmT[OzFKqTe: @JQOZ3PAC_)_VT@-;8j\O؂s /n$өQE`V: [$slŁosUůt("ns:  HQsy-6 ?\sx[Y꟬98\@m0 []F;Ęѡ,L B_> p]vC3 -4%uC:k=m]{-h6tn9ɷ IrfXvZPR-SYY%TM EK\}5*' ]9Cnq8aJQ/B:Nӈ1jЃj}ޡ8wݶG>x7N+ n3d1?*ߨqq47# 1gp@)ѣ»ށ-f?X2|#8&\#;~|DG*աnw ؕ^ǘ>!x~|?]wbw/X5awW^˟|"u.`ӭFU#Ar9^HHpOCCWWW棈`*OLzҪ9/zq!`ݡHA37\tư>x8b<%CI-sҮSl(wFpu7:- CN56#*@z4?yMmVA3W3 t 0HKBj*"B@Qg׸skӪ>%N[{Hs)%t14X}rSL rfĀu#,Z%AՖCvAYiEopqoSL𾇈CG)cEM!Hur^#@!>˜uM.Ց] "maHءlKvW:R\]6p;!u  } r\<Ĩ> 52VNJM}bq-ڮp1l6Bp=50gnFm]~.YG@%޷9g\__/.DtJ3{b&_Ϭ+kZgޝ?4".x{UX _Jhdnnpaz;gZv*9AtK½o7(j[^cN3;7~/)8n+ qS)GxxH_wx{ OWFOR@@.(|Pq̘p䈱/ v%%8sŰ#´99t>؆xp>=N 7~{OawqK ?sˋe=uܿ 爘" FLu *qD*QDܒB#r/n@H/uO{/Ͱ CAMB]8猛 '7?M<'<#N#x~ +.` ϐHG>=/)tq7VaY0ss]FNJ( S{eY]}6Oo,|Uo%h[qi0bԞr4sB={ةns}-[v/@>0']8cZzkH}q_R'J;'<.ZCXvȑQ20^ [s/rZ똷C+Wó9g\=`5AAAAΓ.;H1']Fݽ2Pu*jJ!'SDNGLL]ZmCLѺ Au,=f*坯-0I .K}ļsg, &X`NX)֝ctxÇqsssO&k'K}O?)iXq M8$-*j3iBAuBw2(ZNSDIyْwmw]6-96\ܪ6z3onjfUp}{Gp<1NwS s~մO =;\ܻ½fyiq}{~Kiqx}Ľ`RJg'n\-k[&l5 g"d=^[-yP'@Mtv-|y?%V'--BЅ:q~w8=a1Ky]M`h0MSq褟.xxk0*r׬h,EVmg8! &:bTK" Pq~`3l^qA1#E{]`9uI)b-GH  v;;4C $M$eq|״M@ Bj:p8^qANd6vĘjV޴'i5BǹV_NvݒL{o]=ϬokDz3gݵ]6{u*@ Dp}z zϻT)Wx駗%f}]> q#]ߣ{S*nbRמa l#A$yx3Ͼ ۋ H.` { }7XDͦZ }1͈[D-h9#/=<<9b.3h|yE/E03\0 -]߾C8{q8'=a{\n:n} >J-[5߅88cݔiG 8H9jO ()+8W;010` $zGI {WpAfGL {i 9NJ& EqK*wD6]j5nH,HR@Y k\/L0l΃B 4M@W**4ޭlOMo0w3q9-UZ_J8L+fHpY.>DԦhHu ziOmԪ8t]pXmuSNER]T*Gɺ.V$hYI5gFjCj&*psO˶ûUޒVϩ]t፜"1= 00Z!S7e:,;ꢂr=6]-uOHod~[A @)RT8#JCb< ǕFEE%VX0Nt!nQpcU.u%fR)=qRѬ ͱeTbk/-jﶈ xfڒzA)!/etԱ[\Owj,#&77pC':50&L O_!x8j ɒ$K]l/VKVVOt3= AA~!)??I $ggH6{fШڲ*p٢?U7< Hkz}~  0||g|ɧm?ɝ W^ч (昼 Fj;޳J?~Jwv965WWW޾mZ{ o>Пݻx]SKx4/Z'/3?L3xZHcTi Ą 7).L=f)hUՙ[ҵ{!&W`>)@r, BLXdomͪ"DAmINؼOiƬ4? ywFBTe# nq8"=%ʛiq0ПUšMgロ݊kI# ^|jp/*% R^Nw{Q+U%{_SYI1tf0Qeї}_pS+MfgH,(\>A&e:lbzvuMTي<|'|pN84Mvг}Ⱥ ѯ UMU%B5>xG~U]}bW^ 3G+ĆZ^9OL~jC22P:TT-tp4I'S7蔔2Nc"[ɞ5tC">vH bU !R]d<hŠ˜=Ϯ*k3NXѹb`+F!Z i@p'DyXiΌduáH1NkVu˺MJ y5 D0UB0A|qPTS{)ϤB -cd8?WP=mU5m&9^oH(;b'ʨDZ}k޼w|w^z͗/%T~ kD7|q{ WWW}?q8{F^'ҏ'#Ab+[ͫwo_w\ml2iʩ< Q4`Ĕ6rusJ B1 & ɐ(]M4crx(US,@qOя(q1Q6Ok10!?lmCR!̋[ hN=䡚|bn0:ptpND4)BB=F[&(Ӷ'Y5aGȘaR$I<>A6<^NcJm I/I}c"&kt8\d>AlYPja XC}qi J3H&쩦Bh(I)Vy="!bHIDCA +@ӌcP)1y)[5㢌2{8ʿS&'^x7SI#h]:DVH!Q\lIZUUѦn;GZM9GMM4l/Nx wU]SU'Iz'8д5MSa+C+JԆJ'b!x=.?^(`Xc$z}łakN6LX۲ݼ .ᱢJl6Z)Q떨40) 'vJR 8N⡫:O?*alf |4r_I)kdw, 쭦RVURJK̯7V g\E`B,*( HɶiۖV0!dN_:CԙmS('z%iQ2e)T6Π! mnŶjwbJ\fU +Q%nrR?e k;$-IE[O7'D3HH?|hgxbH#i8y~?0ܝ0p޼Ua ? ?K>yyw#zW5xmHZ@E0D%V䘦#wĤv|;. [nRZڢQr-:'MtT9.Tl}"Xr'ZkbʹiΕ9p^cHIK3gtѕQ$~xYڗJbp@ tY?dMSIFZE#\x8Ng l-Kh%G6?(k*Ȑ]՘kΣÍ5ԕVq9ErV@%ܖjjpchMUbeJ8H-l1[ȸV*0UR]1 -mӠNa"]PWJMѧ5$]ג|$-4Š'y6%pkYyvm@b:3tֽCL@*ng[A`t>TZ %7+Ѯmmۜ`ӆe0(ˇeL}Z%ev5=a lުQ)͖K%qQ[b1hWe*A\~36NNC&\P%` g{ܾie4peĐ:J%df۫ ;ᄀU0Mxxz#ƢW *ybe4ELҬNK,0M>m_<[lW<tn dqw`nVB//;S܆RNI&c:j4>L$;j6_1#0wȱ=FBEg|B 1xʄ I ͪ#)Ð@esՐ;Y.7 kjGQX/⮨>ݔ%xp*`gVhN-0PQ2 /_:#%xrLcªIzIl:*r+;ɯuB)OWk ~R)K@i))lՈ%82U@Ls¹7Cxiza[I3"U)s ;` ^n8Z4F9LeI[PGbhQ՚چ&+3RI;FD"Uk=aQifJցP1T3SnAO@#?8qG$zR<íY *e:/-Ғjrg6|C|,_hP`GdDu5 Xm4MUbXeujձZhz&*  \̔PiKO ejRTs2˺RvgUͥufx1[s H!b" ߋyմCQ:.W[]x8H& &(UpH~A~i8!qӄ+^E͚9?x5 <408I]ЅuP ({t8D^]zs ~x=bbz+^~h4VaG`]Td{ޢ ) p ѨxUC`r~n,?ܿ>ܳ=T7/^u3p1HhQZmQ5KEMSTu-RD%ҩpc@Y4N9PE< ÇGЋ^5k(4F>$N6XFcfmE? 3&zXu%ZpJ8#q>Ï&x8AAN.yӒVk,:e=A6< aI@6k\ h00 <[M͉#}vlTn;aʀ"]l5Q1J$*G\|K}%c_N'$=-y3>lM^lmbk1tF+XLMhM+x# heR|\ j>'ESפqȖ?~ Hcd'tS}yKja{uMW(/A9~*QTiwww|ͷ$t|*H! u2sqf. H@? @6e3HO<=?H#UEÓ ̎i809͚aC0z\in S\]5`ISw4uGXfjxsQ=ƏjPmRG;}/qwQ=6XyP)UJ=gREh'(U*ڥ{P/ D4/ˇK)Hj΋1I@.*' }4Yi]ҊOČUJ5@{1rK4N4iٳ' rc$%NHUvqHxL% |`Qaj˪nOGȂJ YPa+Z65lП%Ui49N{9s->8wD=1Ԫ#*cq#Ӑs+*+Ş L8t zRXlFˁ!>WfZߔͿlKRdx'YbIJk3u]]P9O9B G+Pk#p%G4W;ɞ}8nHUkI5lk.PD/| ĤelLNbDF')JcRhIflWىF|= ъ0fi)tĹ4{c(35fb+K\ֶI٩"'%(﹍2s97|0᏾ֲx!=Bku-#d JkC3/&D?aOBSD4ip6XӺ(o.'4=n1J|W R&R4~$:4%ZAӴl7Zu]sed#9,}-a;՚j4M<>>kX#QZXL|F& X8PVT.a^g ӏ#"81tTۍ")GKS+=nE4b$êYQ[Oݞ כׄ'F58 margoBsaR iE()cg|O%(xZa9ȂijW:7D s?6m0JQ7|J1ITu)cg:_k/j~ΧT5c豗;JC1l>b-n X*kyuf%;*Ķ&nP7"82YD0"Kä`yƔ4*h-R"1 OfAl%觧Kj9mNx.(ri^.q @ 4%"VA>f9Z Ǥ!dLP csքlVh;ɭ<[u#'~bEkꖦ^k*[sOJFWˑ7C:*.f8 h=',[PB)@99 ,\A/OBH֎Y>,,R*X3Q0+uVu3繙BqNK[UeXW| %2v-SsmBZ5l!2QޭҬjjfj^yś7y?b:7l[Ul6=NNPjeh8qc4j%urh-bĈTeZ tž9 vC*1'&Rtb^{|7aO~fޠU2F.BXDdb0u ecB *ڦ]hFUdIt"iQ-UKk[l]Ae Ǒ$;] Cd[ }'Qe &Iζ:J? PxgK1uy`Si4dYc4Pw&""%=HISk9*_+kOrZ6"YX,gVG7蔸b_ „EN#!F)p&*Mb!!z \J Rg6*aim4ni)JfrmNJjn;$d^Rǀjj]qcMi #a@XP!j;ZC[Ǣ]Y|+xYj&=M|EIRZ:O;Xgqɰ,W׫/p6iMmuQ rc@%%.2]\ؔW$(T^ x@NXt]֖؏ d=ЃT-)M80ň2.t }V*'un$&>|Xbx+k gx8?\/"ވ2]&٬ZD I_~:lF'bRAf^v$O~ lU\4VUӰiWtuM4|O+E$0 a3E}1`*ep*ZT:YR]KY*cG@rB6b&)i2a?8+> v;T+fF!ZT̷iG*o,!)BDO\5+x /_v;w|Hp"kvOQ~J$!af~z-!@J)8wLSdM{)/^~z&D]K'%c&m thr@O'>⦁ZjCx8ۉcVPՉWWtL 3h)TsZJ§--TE`rNZLbL1+⟌ϽZ$"xu 0M#!2C^ΠXXSQY~qn^жt1u((ЬҨV#ΏWkR#(a/*T$鈑ۙqzYkӠ󈭩k11=~42Vuk^mtSmCӭ:aխkY.cq}aq!tVByYhL|51N~=rbKZK<ܾxIZ=R3P$-}<Ĵ^S)FXV޽tE4xZiE=&RJg#M[De􌒓{>{?勗29tei5e2!:fIJxb=yv ]]PdAiO'4KL^TTU+I.mMۮ솶ljq8fME@dY>d=ȫgO11+ j\QAc[LӈeDis.֗!*e4V8ߔh{~JtO訔E&i>pյ!񆐻e(-FOFuB'>Ctؘ2DSb U-)rҖ1BUdKΒ0j"BG~xx*IyaYQUVƉ{GߟHh:qm R9յA!?dܤrff _,gNʬ gM\X dzҥ9҂VxU(nV[ MEAB&h\<wފjDImXM|YGCL%yIMI)SUvv@Y)!&z>iiC\ڼp8p83qҬ+noo0erSDBppT-ݾ7ꖵm0Jw+?2 jːdl%HHS}x8ZmigZi}9 ~-+$ݣ^e!߆__7H4KDLTYk>Z00Xt]5/^}~FƐAE‰yQꊛk7[i{0"*wN6Uqb,߷i$lư^j֢(#ez5P7P4-9޿?wF2s!4yPL^gFRd4Ft<8+P5/ U]BR}yxWZ٬I1&< X]!ɳ#Y/!Lh̝F w; =n11*vE׭H)& ͚k{F .7 rq⍴t3hKkE˗/Z`n!Vb1#C3N)~F_mlo W x?Έ)R4M^Ps{FR7q:^4q<sWKZ:5#ƌa|1Y9'`)[kO=L_Fg,{j9NXzVrz`Y] 斢 We2)ZEi{*$ RfJ#BYEOx fY!/ۮ \F E&EP,rb\h"('rn<(>/ ڈ lGnooy}/ g1%m%M*x=zUq}u;|8ˉw`XxBϝa> ,ĬJ}>jlZ#˿\o_ CdlXSc%E̼qE4NaYW:gotr?3(E< OcW4ǘmC*dm.6뵘C8bJI46%'ۭmE4 D̉~%i9O Q+ WWyqY,-7d›s1hΩv4a#(<'ڎ+*q8ܒMt*)]OTN"E&~Um2>xYٮYkTpRGcb7TJϪa΀j-NП0qb4ij)nJ<0ctߜ 769k! |) GT FFT|1te2S"09 ç>n5C/fϖ>js]*3]0cLLNbbc ĜwP!0y;ǣlmh]2oO1Bh[in 6":J8gVnFbP2Ҕyxk-]۱lfBߏs>pի[te?{7_s٬1N'k6݆u%&4vo{xωG1p{քXb*ل !XњPFG;(\xܹX|yw4H6NCO74Rt~D׌%%o 1|„Նhz79*ZêT- KO: ~؟H nE6vFdL3 [Wsr.U>UBN_`AMl[@D?Fl%6+Ih}9L5hH!PJXƃ'V&9UzYXܲƉM hmmks9]bZRN^DD CCekZ 8B5bnY;κnr=|/Yuv>/sO+i٭ś:a,Y`'%sB)[k0Fit JD%Mmlhچn؏$H佺uK]gM)SaDg[4 >71LghQ]3C$:ױy99 ÈO#Aˁ$lJtkQOۡx FuQzpf.~S)|i\8"${YgzϖEE8S䨈Dz6)tYC[y'?ᕒ i/ H%$9X2Z3eɴ17|(',oH| jG$P()7)3-bf*adniI+pGl͊zҴ7*^Dq4sw!FDfɯ*0ʢ5^Lnር2mMKv(n/L9 1DHg#Nv`-z>uYVTӦf.ctĽLSC~}Xt}0Zr}k9km]1J nSyR1>8 ϙ%nI"a8Vt{5f9U){$!|r# _=i8by~U ;U?2 #$E\JqR*eQS>&3I/t] ^|X~-#Vx8k/ 2ϴ(><]sԫGZ̬cJT4th^eN1Q)kRR,׺D_1{”XJF]&P8k7ɘd#I A9Hz;Niq;8IZƴ1<ͨtޠ3D*%:!*0^9-XO|^~˃y.Y\SJN&U(32W_z SٌN=(ˍYnTy.$Uyefz_hh=+ #>F-@p.Ik!8`)jRAI2x9D$m-Oت̵nZ`B=p@NRٳ?ALݎs[ jv_!Զ00$G`4ÁS}mŇC2Yps;'NC$Hsh|nuOb[sDH7T^ je3SMRGv'81 #գA@89ϳak wp̱RM›ﺎη2GN'!JUMj1p\UL*|5uٳθi)ʌ1-S4`J{EUC9c5xi`RGtLIGYksVɳj y="<qL䄷]%a@)Eސ)wmN(&7F&34 kr=߳5%J71aÈw1r_u8r+ϰ"St!ncP1ƢfMDh$6u^})6Y9{IJkѢ;Y?23XL0Ptkmk.$v̾?r8 LҾMJZL{N>DN="ip [ɣ+A X86d3Mi*3 Tm5;3"eHRMl֣~8͝,:YorȏLL1|Ak |J6]WCa`78dfM43/}a;'i:_x"Ԛ#a r}-HhUG=Du@i)-H8RpJsE -lUp< 'iHQDSiNK}ϤdFjTEUrl1o I10q{-5x'6e|N˓"e|rſڛDL6{rY+u)vGňc?rYv`O;IF4"8'u>rke'ʞRUO|)CHH#eNS!KUEUfPDli`(`bxY@-͆+8FY#ԓTn,19Yj#d㼣njVlDpaw$mz/~HQʸ_sFfg'("FW%'8hDmSY$]`[K0=ݞY\I000Mn?6-Ml8m[*kpn"uWac#]PHY!gy7"I!2kZanʤ/VIʬmE۔DZ8Dvnj)JѥJM"NU[T F4B+jx{cXКM Y0ec)8Np~xs"gԋV"Mݣbrq{H9!T)XI[o%{GQ k *|mJaSHsyw+ja 8?1N)g&ڕB{el B늦h k ;q`IVu]簝x2rr9!ʉ?U*o6`9|tYVa81]Ø)jicf?=)VB%j:=H3E oB,tޓدSUuMUY_@JZk,F!5t!#eƟI,xۊf1@:N'T>!tvhx/U`lh%Ejej*b+[m4y421B7vzN6۴29H8-ϙ$)GBt87dxa#q.>scTPv_ueq?pRNC31(5Yߓ-A01/ŏn ){> coQ_|éJJnP`mԒ\FJJkTU̡.q|OxJyfH@zI4ne.v|Uq-DǺW?j=|ݷh'_}'~a& *r<ޭXukѼ+ Jbakky6)3"SmUCpI«.⬁Ƥ.'+#1Kj+ؙ.U4""ma,4͢7 (*i)l&!;6n%"z{LTfQ8/I,% MjL Sp'$Q718댒.{"8 JYˍ uQ$}-Q\(4. W2ٌÞqA`B!Fde1vEpg`LoI:gcv x^ar/KRab0NWyf=;;OTjM29& LqHDyT%\'lQFЁdMD*Krae}͌3sdTWU4y6,MeKr` #H8Tw=ٞ;?\\s⚤c,_o9{-1[rbv(ѨA*Mۡ m1 s;Lg|DUMw-xH m@2$uFWnM_8iX/9 Á6| Zv8bYӇ}M1hn0u3@դ1ǙXR.|⩺ KQJShz%_/pqɊY!v0UZO0ޣt .i\<&2(]eEq<l7k-դalaY=OfJ弭ـ R4=ZT ' 0Eo-U<өsrhItC5ƪNYWpgnEf>bJE(꺣!"A! ǪP7 Kd<ό ^|^1K_:@cBrƛH*bb,E 1J16D*t1YHy]U2w.IJ+ÚETêZD]jx<r,lD_%gT ݓw~MCU8ad%"1. sǯ82J**+cTct, 737 M5IVX&-g~x15Єtf-%8Hkdt1u> .t#,ы TU߷%.eM{vd^glb΃Dbz8_G7\o%ooyS;7/Ie(~? -*EލLW4u:wW_ME-*c?֡[/btެ/SROK1D$ O~py&e+ao븹DlsY߿<xN sɨXQrU*D;( ݥ@*f%&-"R7{'GXk,2z{(~Y\ky '!*/v YRv,O fZKi$sDHp1K+UsٻKRQ6t;Blvy@sHKjV /=!9:O'(}r˳G6aEq%㣪*)Iwz.k"^hqN/jƓ9%Ȳ%,?U$-JEb!:tH8p~$܅ 9˯93FaHFr9>\kg\;-ײgϋu_%a.!# #!=ہj$,u#>"ѹFGg1 9, =K%e#jجeȪmOl9Ov'G/nn+RHo~??ğο/?`to4O>gNUKX {Bsm w1bfּyfݞ LJG#pz|0‰a1A0V ˘2CzY \*/޽gݰ^Y9/^ |H2{GFtw~.|P@k\SJEZ3TH cHhmxUGJ{Jv^@[r?=E23П˔/ⓍnQ4,_˲[\?'>.O_DtJAY%%t0ZbNڦQnH#%>!jCG٠-ihvr-5&) B9?,ngR[C]@0?qWL罀`>T9D/)GhΔy!FW|/8weg{&VIGILOYۄ1mW1 #)gqd펕ൔ~i}.sJ$[/fUIK  Ӵ-W7s;BIznɛ׳Rkig,<+)3cn&3[!S׈ Dc"Nw߿cG>8Q77yݯWo^qc0/Nr-"tyL۷o麎?x+&"",`{P/^(xb_ uAPdҬ7kb )l64TŪ*?E6e4^,~@G%5\+chC cLx #6egjwyz^Kt-ӂ|]CSϭ6KWYJibɠ`vC>\].-OrJ?1ϥ+i$$e"~t~mÁsܝskx˿~]ӟ7_٬w{]~s5j!`mGGG|7< ؄.O֒)?uXj.ffg"%zt AAZJcnQ*{ys l3֞:rj|zBѳ9-z/OS[Vʆ?\Le֣H1 +2LȨ U4EV@2J ::Q-qB![&fƤr`Qɬ`{\>7E0nlPV~[@TԖ Sb]RSW֋P̛>mh!M(^Y/@:# >&6h)Y"#z\)|]]AAz"q ঑IBw|t9)c~Lsʠgf2<*G[#s8yn4Xp]B¿ғg^,\Oe\ZȬ~/PiѳOVd2? j4)@9 @U!zsw`)2FsC|ī\#9ϺX5)5M4w?|@߾ͫW/jcі/N;[޿;~%k^| jOt9z2v7݇wU7ϝH#Ԫaט"DiUiw­G'e++/.˃l;/r_Va m=ÁϾ9Ȣ kbM92lU~y,' OJhղv;[-7WGN ι!K滕tMM抡>;/BDu$^f}g󏪪>\@mL Qqb{ǃ} =!=S?wԶx:Fu V7lk?7߰;y=T+^-蹺G\=-'l7ͧW_5%B?_0Nbv~Zl ;8Ϲ;PK\Vns-Y(s>p%΅Ňp}n̳3o婿,@eFV*ITԅy.O JŢԎOb|K0XkX;Қ8xiO"CWZ.;.~q-(uXO[N J$/b`<e1UM3V"ˊueʌNQ:Kc).7rjvlRcrz[jN.OqljQck'rqiL*?g^~vWWWWWkTR~.b> mRfyY*3潧i^xd *eHV"Db%5 0R),m"/J=除3x 1}"&= {V9U=/=6$-%ϵ^E})?Gٔ\{% a{{D'yc"lifc/N9dyQTTmڊUeg~ǻxzyAx8{>}7ןXZ/_v|<wIZ?p8yIӽk65~{n /ư{x8叿Z>|;$ͽqS9u,"( ,s>qdZ;v~_o;ᆬn>ӫy ?W[^^GJ)8q:PJZIf Yc]SL)T28dYH,NP!yKRSAL4~ﹻ{|!*z^XK^J2, t% =^zć[:-Ra9:(U+olI bbqRC︽ž"Mk(`CDb7qhUӅ𧜾%\?W)DG 8?!h~SFql)ypN+k8Pp7ji)*V(6eb8:;TdX;Es<D4%x:9lw9F:2LӈwVUT5}܈J/hpm9aBHb[*M<OBRtϢFX"J5Ox%(Ç#>?M"ېc/T%PHK=M#QDWVm ڶAٖIA}MDä'E=c&i:^Mpj*{~(PT~3JQ;o|VT` IΞcd+#!3au&5})z$ t˚QKy2;! eA]\`HODjFJ%FI_~-)1ĤAW]|ZiVƘF=je1hc0@g Ux:皫\}f9fԡ+#n_qIq8x|xnwp*N]Ūkwr._B0̕p)R2=E2R7%Z#oNV=fqX KRX9'ΧditZ̻|7h%EwNǁ}A]׼>#c,Rheq{hcybsd+,M9̳?SlK1,cR9MҢOy[:*cFc'l+VmmD*4֜$ )NE9Zܵm@# I9 HdQ6;iP[#'i9zaiDchۚzf `0!ulڪx! U%\HT D-٥e+$^*t<8MCZRaŌdGVH$ *i,cAcgV A=ZUScKIHD.&ey2H{X2%2fbĉSY RܥR TiETsǫVdHZ:Ċ3͘mr$}r|z޲%>)z12 9 Xt-mVu^6S@~Gsu mR<ٲ!Q*s0XU0ҦiXhhW5_|%7M<կ~/x:[lTUt<\mQ;|ã7?_{4pn⫟)Z5oG޽іO>~&#?O o%axx|vt]M6~E?dS\/Yk& P(Мn}ib5WkiƣhivC6V[Pc %CDx[Ŧ=>,ԅW!YZ=dqYZf.CRUUM]Mkl+N$$x9I.RUr$jQBa^6ʺҦe=&6''.EW-ʂ!x|"RTxU>E+{[Fu]C-2#NeKgA({fkK"Pk i 43n"&G g"*8ۮq: I)ΝVPBVkLk%zl%pxHc?0^:YDUdm)W_)qO|uT7MlK\G=uc~q*u 3M3qYͶCz -֗,省/٧m8?6y^s{ja(SC-_HIf̙pN!\\:*-iQ,jۖYqW\_oGnnGz<<[$saM#׏4͊wj~8Lܽg&go>7=oyꪢ^ӱ]YY=}#7W{nnoay||[>?Zo~E {Fآ?]dg%<.Orz.Jb/in؃ub٠ ٍyVstKs<K2m T.u]Y#WW[ڦ4RU qWÁ*?MQ3žsKx[ ΂sP8|X8 npY;Q6 b Ri̬Yx7Bz,=rNH-ejtDT},+",,rJVc$-Svn>ɵ"2t> /Y)>Crv8rgGeAnj/V8i|#(Īj躖]Ѷ].63tD霈҄sY$:@H!0ow9Gyv_^ߥX9h.T. sVJD#o rYH7jAc-v%$-xq9_(" L%y$2꣹2S|/gV1Z #CJXȿw}v{jf]s{{ՖD&Is.q~Ty<=KLjN94M_=a ;>я v#;޾}GLayLNs&nӏ#S7A MF*IKKIgUieYQ/ZN˛;t:\0,W۶l L>J|f~~mKK<׆5$><1rRDCC#;y?O/>׿B+joETT!85$SV%2s]G5_p/عT^gΝ^xIxh]1N7Ԫi͡FURs^_r 8Dc<,fnigq7ϖq$?K4sg-78 )Isa E2viGߟ|F[xe8"<]vq`{eY?9q~{Řkn[:KJna87qqVĺgAʘs)VYб,IXκMN+ʼn~%v\XX<(tСj9^bk)'9DF!0%(My / G?s O8[yR1jZg?_+-__7opuu4yPhkj ·y~}͖24u>gY_W[>K~||7\_oĔG_|#b v~O?pa:q|xxK=1#(ꮙ+ڧu )fؒwvga<5,7{9rxzI9X-OKl%wiY$==?VZ˃PP@rA{|;Þ~=_ʏcR򗿔)/vJBRse~"N\SKc.O]"zR ɬjNk*[ h !.6I}l = .ѩEwR{GlV:{.. ^1&.kP]TM=ŖF۶+fKek\S$~-wc5! 9'mجW3Dk+zin*ɚ$? JO0bAI~D\ۗR.Pϼ <5iiV|q@xexg/jf$sꤪ.zv;~y-߿}50b| 43 A e?r:HaNhz ڦ!%~zя>kv{~v|qg7-{~Oixؿg<wwwv;R8ab כ[n5~NR ӈ 5&ED^οΕa\KBXoຮm3.ˇ|KAMi#ܓ1/9-}|ݫjɔ=X[Bs{ IؒT3Kx.gQl 2}SNrDQq :~{Y|+HJs=ZJhqM])tٴ+Նn.XĔ5E k al?O6纮YW`RrS>711>[lt*OjMc-u]B.SӔDB@D4R]LzV* ]bT9vp?M.=wwgb^klWl[jR&|Cж-fM"qegiϡHJMJs2ї 0DeaYSl6bhLJ)<>c\]m躖q}GZ?gҟ'Xmk A1N{1$O[O|o{]/ |rCLJGU˗[/[UMO UHbVJas UҟFO3)p:}`ݭYo;v'&QTFq1d-ÙEr!yad%J-K!Af9bXQ^2>8gN32Rܖผ]/9fww8zk~ӟrs0k)\3L=-B,H"&埕؉`DiVW1=n cݭ^o躵z8NszfѺmi.xYv݊~dS<#<ҪzEJyqx[Y*g]Ji_O^_.m=>99yO\=J2EFwf۬Vפl}e=6?W U%&_2yQZm1yƱGk1yb~p_;wwr4d I:3VgG(ϑADϧV.84n )[3&bt!sDzLqyv0x!eǛ٫gT/Iw'c m"Nyrn yEܴ&fRZs{{za\7hnxqRU ~bn*'^/%/^;p?|xi> xz|i]4{~w#n ~/OH8D޲~Zly?'oo߲I$vG G궢]W<>~C:`+$O M~ZX6kIˁ el6rFvɕ/.'=}ʟZ|Vُ[[AqfyH I/Ҿ$F2Rcfg1OȰ!$qgF -qVlS]I6HL \ ]u+@l`fR9^zOÅ/>;#b{b?%l“ H4ŲJfO̊a5ưYoeB')['jGtz\p:0oVbBt< lBz(ftzff7qө[8YYU]I4:ϖV^{.{02q8s: 3MRf-G><~ a9nr!摌$g.R i x-q<Y%n.+RٗPwvV;^u )J7Ér.<-ZqAN{1fkt9y\(D-rpř1/o "m`$O;I5,9Jss#kVsY_692,xBҹr˨g_ ^T,bnP*Z+|p =7L݇{avVSX[xV|?Mۮ1_kD?RFYɗ˗7?߲NqԫJՌ~)E4Z7͢#dL_&y}Q"e1PˌeKk];ϨF|:oʪ`O$Ub->"OҙJ% V*Cij1&| e1h G&*z[1+!)y?4M cjx77ptVUW>aq88NJV^NH߱TDA2'(EMa۠g}uAJ ]3>r Dڈi`dsй[D]"Ky\>Kkx1:m&x`N(u'm+lU 5 ,&HLt2 Z7C Y3vYyqmN&IJę0x?䃆Ң3"=.~Q֪u(IKowΛdʧbUYضQDstޤ>3rH?p+%(i)rb맢* JY#Y[MIjʭ"4M%>c=cQ'hU"\|O0?>c?1Mfp(덴ڽhqkO?Oxѽ"4x=M_}/{#VGjӑ~/9G/}'&Nioc q|iMӶO~ /ɰi5巿m- 7!j%'{wZ\qEDw45ue Zb*,2)ep&oM.tռ0i z6O˶##](COXm5um_UhPrr8SlZ(m1T (+1dI}^EXk[&DUOYx<=a5Oޟ5K$ggfgʬn3`C+$E0BꐗOsyI,RյWɳn \#+{dW.Dx~iv7'ϟ/xt>$z0|4 =3.{1 iȊ6f@߇*KQ Vx ]^Uٌp8l{x_}|1#!;H%ěoǗ`8j.:x_~s>|#4;etp/gMFoxq?'ٛoݿK C_Wx?P)_ , Nj7ݶ;|7gϞ'? ?ӧ+죟ŋvtz_h8j.~\s+q&>=|~2̖̂307c>E}"f#tOBQZA$@E؋n $Pqp n-4WT-+|'?ş7<oAdR|xx3m4>zo=~.>Rӿk0{w>ģb<0]Hq =>j`7}yj;]#Oopw{ċ=❷w?>>sGo~ /Rŗ_šo`xm l;cşc3ʻ%~-qǓ'O[yPp_Xd"SB  tnyy+5̄\rl]fĕtB HH.VTbntA]i68//?<ſ?B][rF6IzX Κ.@[SDm4cRFQ)AIExl׸@vڎxn.ص>$]$099t:4"} O :W@?(_nn%렺.ʪ!I\3ѩu4rp9.DJ޴򀕯܎9mJҾOAol=ʒg8''8m %z`YMxv%A@mJI9 ߼'DM.Rzea6 eҢx]N;и1w8<0w a~77=.+;|c?=NpN?!՗~WWƢݴ^K9~WG88?>?`3xm?a'|=n_Bcʞ}4m= ཻL{)Ovt0N%ΰÏZ x@IDS(Ǣ}dM "TfҊ!KVLltS'!缄e2dF~XqtZkXa\ ]B F)rG4x%>λWӃƟ׿a0lm!0yȿ99FBJ`ʑ`TcOy6ƔTAßk\_]V`mӡl|2m`Ώ wxT;a>6a89@#Wማ縹ySTGK%xגmxB4OwC/\U$c~o e Jw)A^Dؠ1#2wrO䅈BhYu94Bm,G]TgsX!v|p1<,WXRmz_?<p8>`\]??o { >Rxg?oo!BIc4px_-Vp:q/o^g}g}\^^h_K/>}_~s<~~ 밻$Z!]`j6֒>-R;&\){ޣ޶}_ϥ/K6\CO>0~Iьt"83ɰI1&i8Irv85ÏW٧_w~ IOAk*1VmYC{UrQGZϛ Zk%;o'OހaC%Dw 3Gl6 NA8c:=KEgs(6To=ISֆ`''.Wٖ;<㟯)_8?hGװ]"~v@60}ݜ0/>W7_7GpssO>߀3  z.>pܦ;7_7a-ᇿ9[vd0XO83iCQxxgxvWW; =>/?Gw/^x .2w+ p૨'Ox3+$N#B DD!x$" HUЁ zK6mU"_eAԚ"Z'ۭ#___m`yJYm\\\D)ȹLpˣ_ 385 ǣF?o~~?b{'_c-..6]xA1b? ?T9l΄I==pD<"N I`?2"M l_v]> R /ݝgs@J@77' HY'}SIxVt < Ԅ*h쀾_{ۗp]kk`ͲkFB+)hyCЄ\ ]EJ`Ma楒?$?|# Z5CM Cca-xװFoƋy]/nw]w 8]w?m{|Ѩ-{/rs? ۿ @{Z۠j7'|/gx7/5./ =~?͋~Gx`KH+/^xx=!H镴lЪJ6־\ǟ&ԼP…8qK 8F&/t~Xj 7(8?|#EOl8*% 0z'Ώ'nv o;?@^bBtƻHN'`k8+~.C^WIڻzs6ia~M̍rDyO oE+S>zd6xIEXπz"wI/s9RMM0y?yCAъyKn%c|MIt0)>UM@ FF!E2_kO.HV/[)9 ;@d|1?i)=Y6Cn~_|~Opp{d-{OxfGW8~c| w[w $p.!)~?~_v?V(3g}_}2`⻿.xvx|ۻ;l;|Wz-?ۻɟ b |"͔w5:zkV&Aϒ{TײR?r( aHacҲ"P($%JaZӧ2_49W1%RRH<H]zZw={| 3l Bk|yapӟ<{~7׸{]~`lWWWxo5xx68vyyLF6ϲmPl㜆5|oLC)Nʬqj͈k{V|Eu.BL$֤#ZDD$w~z=Npq cYLdh>cXlǯ~ y=~.w;`[pۧFx8ǣKCђJk0BM#ٶǽ.T_}go=ßɟ?~_^Gv^xԣ7r@ z˯nq2N.s|x9KmmP=>{K|WxѶMPRhE!;MHAhDp -9Ź ,2 [aqr}`AJmd2to(۶Edq$ER,{m1BB?O;I%#'Xp8+ё&* 8qO6KOa/qqyM|qOa n_D?81ղOļv;l "#d>4z1wJ켉1/..S98˻>(\@^ IUZx5@vtK֫_kB:_IIm;gz&Qe ʆAI*%nV5s-`޷F:*C gV6>zyUTT([]'K~ӹߍ&rAXAKc2&Ҕ/Z 瀘,s JK_f\R8&d2lZń$DKw JJ FR=^[ mp.Nkyy5R \,MAk=ӐB_"HOO>k[Oq  _xTMNKV6Ǐz~x4/^<炏aD /_S t_b8=ǣx>l:_[go=__G?c?Oo.מ\40/wxq{,U;!7M^;lfAӟe&T Sr?≽1:x"7/^B6 N!jQ:8 ys!WIOAt> ^NQDf¥paRhFհ.hY =`ڧɒpM5m{ ӧuWg&"ai*MC+Pd$=QE4}ꐈxbR RBP:{Q(5%'8*V& 1 hsBIH ? !@Ppnu=S:ZA{Gt$ʍ m'O-Ax@NdBH &'& JGOe\.1h¤I-GCZ5}m 5Afأ{F'2G#4R5@;| /f@uD?tAX_'-݃I6x:gM#^& 2rr- yLZ ~m4ޱ«+˗Ŧ0 ;^ m7W;|8p_}˿|x7_} f Qٕͦy7wރ2<@)a0q4FàѶLJyywy @xAcEL}bNcռFvW\@rf!^ژ|c I󽊤&F'B|((spWZQ_qA4"뇊hw׾[ g`I@ I]mS 4vFI]4Ͼ,X;}8x1~~{ Mۿ[?=}G~Ǧ矽㯟=~OٛO~b&xw`=PwJ!J)xnooaFyӧOEۯ*,<Eʟܙ& bV8(R (چ&V xȮY} gq4 Roȗ& -+/P: )Zl6Tp:a 6nDD0mpy@mm)'-`\._/ބ>_}a]Ͽ}~=<~ >xO?g}O⣏>{7xS|~ſk / ]G?~_Z drwKcSy" X<QǏ?=t]80p;#O`x665Osj 1yF;H]z)w8ϐT4|Pj D]5.B'ʧ ϟ?]%_~%nnnpuu??ď~C<WfۿvJv[77wa$Ç~' SGreG- j. v%q<ඟ]Ӣe}"#yhBJ՝C<9Ezo𩨉M<3u8:Mn-0Jjt_>;|x1>sܼDziZ!u}xHG-F1!ͩ2U5<-F;- ?9*|u;XJF+mVy`$H|0(~̟O֑\,J@r7ETkju5S\_gg$w(=%c^H~' 5LBԓzS(]<5xO}ԓaāȷFc}~)8`G |6kv0,J(3o|*ipe a _<_c<O%1?/n[o7|~)p/tDxdLvpzޓ*q{U_E>}{.=zဏ>16nnn!eo|7Z㭷`޹hDlzJ&gC{nqzal dp!!AJ_KeI\koFMB?j NU{ul6I[=ߡ{GͣCP9 $Zde$+ٴ(# l]$D-s\YZcpӗ PXJd8Ӗ: VaÜYXR=||y%$>cqn]l^ ͦ] 96E4?¯~K|П?¬}v8{4ՕwkBM+3/ʝaиnдTm^ `е[ w>|WcG?6W ӧO(qpvwy&gMT8&YsN:=xOϱquuK<~)//~Ǐnp~!v |^|J\>땒  k\9x5d-Tpt`@5\撫6j=XkryD?oӵΛ'Zx`Zk02$l@`LwԌń\?npAclP;<~: EB]:kp'g Z՘e2r-#4VL\N˃;_:hZFxkp#y1:4-v[kʫ<%r> v?OxjPߋD1Ȗm) P"$>3K$@yZ@$9̓ѷ(*$F < RŖVQ(l9}dTmT 9ka"}i=w n6^|Od↑m.O`J*|(,T1FߐR*|.#4>Nнfv[MRV8VS=ᓯ?[oG.>?So૯R /^)ct.S$Q{AҨ~YAcpm%jEHHba[)jB"#{TlzEum3 "Y`NTýiq8GаdbC? kc4)}ϿŻヒl6|裏apxPK;z a$;uMشMk&!xQG fژ8W "!=3Y`/GRUJQM zBњ{(ѹ5^2?uNƘ2DZthU j#Ƅ6<bZ A>}L|%[A=au~0,p Gmv+|$?#~:c"K LHE)%t3 X=0HJ`A.@㘈x=X 2 2/yEԟ. !Uo`bY\{kws_޴6vT4=%H?"$t8$r&\.Z' XaBAG2!ON*f"&14.J)HG2qYkXct') @ȜUk$s,?T+. L0A 2ajǚ*QZ4}ʝȍtrnIZZ20J$%mbeF02 7CIfIdƩLy W9 {iߖLN:!A-xMx9Y|,tcFxkllTA0<0=O~ ?E|C=[:38@v߼ hx-E6]DY\:ܫd cRk9@ëx5N}LY n"HMٵ<#O3UŠ * ^q a_|/2-ßmbwM9$;ϘzAnFuJugu: iFap:./)%1$~h/Ŭ̸D\b I yTΑxe6ns)2DO)oZ6%T+2z U]\KVsln2ʭm9gػ}g?:#(7yH̩hXX6&{"&!Lb?Ԫ @|_S5U)RL~F=M5O]m.#3G'2`nF#‰0-<;"A8e,$3kSg}`EE(5Ac'>شv; }ѻWIS{HvdKn 峜ɡg \In? dʹOzUтYlHH Lu `" Kj\0=929k\,,ڗ3`_j3K7Zvsc6ɑ jS>A\ٮ./Kjh9.YxS[g#5U޶sҳ_G>Q5ɴѳf͑cKN`pK*̿ y[,Ig#ӹ3ߧ55::vhN͜B+3tNB7.B~Rb}CNT34A.lA] c,.2:L K ^F]ű4^[gsx$cI +dwq(~j{ߴjp2ubn^R+>?rf 7m0@Fj`0A\\0H*\\bS)ϸy%ԁߏ|^3W23tqH=,)vO)ȧ/#myJѦ#DΡ+sU{]j|ޝW(!@kΜM ,埻*bT5~ɠi ǫZ?"r~J֗G=Kg0{A1&)V!͋ZN '8mY؃%ȼ"a#CT*oDH$`QM Ǎž>5en@^޳6Ec s0;@jVk]x<~/!#`IA)ZX\^^@)P !Lc{Q6Ħ+qNFxuT(,F/.U~5BuZ,7qYR_y?[eQ +H% \֘TRy'g[$%)!p%2*IYkoO%kP"9|{nf.%5tn.ז&b6K)cO+F6ˌRj^Y$E¥ٵhqyPkDCe kU370Fi|r,BX iɵaK +<)j$5 د/9j)Z<ONȔy݄.nIdEx* ֨wq&!zj MA!լ1V쥀_k޿ 7ڵ5F㚵^j~Frr^I!SۼSBir @ìE%hv',o&3_/Obk%cٰ 6O)r֡mDB.2!&γ '[5r $l1Ч>ҕ|ϖ$=g@zq1~> 82atJgtΡ)S™8t!N.d'li-;`/A5ɨ<)>;Yavt] aҧ 60UHlj}r`:<F _O6 Va^ׅ^K$0rs8 jgHVH 5հ4fΉ`5x:bЭk9HA,&iKU%3KJgR<Δ}{$VRgK3flA˿+) V^HLN!cSjWPBý=JH ksE̤ n"+͟e, "@ &j\-w /<肵yx9C$D筼L+|C"w:iF )()<:ԝQNFݣi;M&He @۵^bxSGcc*1z$: C?~ b恱g1jTan58(jm@k%{ϒdPċ݃#C ykFe994je|>Aa?0 uh\JIHFlJ m͊ʳ缺=8 Yjcͧ1:`5vQaq-mI L<6mTf!2J6m[M*j0r7;L&)cLlF&d%>?i/%(o1AŢP83|;i6q>oN.q$jIu䔾6V&njhˍ"+F-r݀I0= 8d55l!SCj[g':!G)Ȉ|Omlq ο >5#aMJH(O|hiՠPcÄFĈ̘-[+a O&Is^]wE[,& 9b Vi?nr~l|4TƃG"HI~}͟9Će=0vAG2gn ĆbL !YtATv08J |*Oru ޣ >7kgeUYFCx% CBB42ϜDA@Jz%-|=7Q r&-gK~ G8h;Z:;sXxr^X8 ܘ0̵s$Lִ9jz%Xl) @钄Xs!a 8jkjZN5{t EI Ip%5ˆETDVޘML9Q,)$1I(B(`$M\x_Sfϭk9۲ HJ%'EPKAg X#8p: @Hg&lp1y&Z42v\.Cs#@hP0Lq r8mq?GA[iаv7vcZ-&ww$ pE&n(4qZB!R)K210b%YB)]P:,k! Syr-JOZR)GbZY )BՎ ^DZUtienhn*%w,VsV*x%ySJ0򶑵ov&&%v6gc_yE4'k.g/W!y4;glC^@ڙO@eO{J-^ؖZV9CECXʚ8r)tI'kvWUDO Hi!-q'BD<Z'3St}C+1 LY٫{T3QW|抖%rR('D}$'9ZJtS % b"l"y/ˁTdNӪDot5J ܙWjc([^ Ӵ7hDPWϹR䈏>AHkhi3'*ѷoAsKZ"qmmWdp.|T[[zK Eg-V>snӗR}Edx"NZO< 2R)"XҵG='Rj&>zd~O}Ό9|[r#KW-G2gFI5`I¼!h'CgP^]]zD˫%hAYs(<ϙr~]S7>Z%=)"4 1)\}[m9^#b5Ҽ^J]l4y{*S שOlڐRAI6?ZȶALNU;Wkh&Jl)18o@J7Y*#r|_#,yQ9x~K܌D/H&Eag MC Q җG޽v-YPk]$燅sL6CD~+(W\B0? әi?`R%,hϹC pAHFI7:5ӔsV ’Otq%ᎋo:`kx8&2>z8TIZ$FI옔xE@kŔR+S&~GTu s)H%:$-~7{60 !$BLFfW9#Tyę¶O $TD$31%)7Wrd!ī/'jPf Y寘ˍՅ*@!S$ ,)'La~6غu\%=˖&y _K:GAx:p<#i*1H! =PS.a&ЇEN>Rz3,1Դ&nYwSYBz"ud𢤸 7R$ ?)+8dr ޚ"ptf(U;W $!JJFYL&R!kPJ6}ҭ} mu0҅+-ncR #"   ()פ1tRON b5ߚE[s{CJQ7K H1ZZ!"lvJZ)a>hlvHe'BuNVka!]"xdy~'%0xMp:esʩU/'rq\;6By(Q\BǬ;!KJnsz~Z+x`H`Nн^ C?DS~+)TV{KQh =x! @A)WMr\hAJU9T=俯 O,sK>yJ k*v^Ϙ|avzʅ c1mgesI1DsP 9BXfHh p"@1I b6Rd3i`\Qmμ7rq])lmx7kq kOL5K| adc%oU9UjMU$D,*sLíJ\Ǡ-AT+܊{TA\2/#`h|>-偤ćA<%ABW *'.9{)! IKcVK!˨%Z\bN»Xf1EIkI)q}}=RuzاTnνÍyLQIѷҚN&*6QxBu9)% 嚈9tߥT0'Rh{}$ym?0F)Ҿ?skDncO".H\lmna奪b  ˫o8_%/ĥLBXW`;Jj:V*tͲ( iUAqK|R+@.Y9 jV ͇Vf޽D4&~ k C_ԙ+PYQ dJ7+ O.T Ԅ?@ύ9/xRJum-DG]΁5cZsJ9o`%osD.2`K`ֻ8}|v\yMvZ$H7)4؎1F&!DΤ3! s"$TT*i٘D4@X"D+Z 䬴^ըb.(br`/mיP\ώ:b]MCsY'(+h/͗G]4sL_d J&ß5Py1cnhXBTI\y(r2Mqi 2FDXGPK\5&OH.//cPKg^_u:97V>̓~3wN*QW R:-jmuCzly +h9IIr|:?v$9i *"̊Ogх0285Kj4ڶ0t1 wg^YlF: F*JBy|b[2yFIBMxu[]R VUpRk\m\4q\Q *|2?xWlZPf HR"t}\<5 ViHo?Q H%Ta ΄dkc6N)%t<#.ZB xt]W܋]MU͊ D̐ڙVBJviQ"ūcl}0{ HSTM#hB[4JGB5fLZH>Tj4]jqЃ5@iᬀ6\Ɋ/%=ab~ @ 3xA6a%+)rSk-j~#mUJV܃%;Rp\| MS-ͬs Cvs,@)r?UPm{SRfê*jGȴ_:s%>i/dhd'K%ZWi(D?xӹx䭧5m)5^*&.*>7Hē4ݖk׈5O]|3*;v9)ϧJΊ)B@$BOtI/oόymAC'su*A(\9SM{sP_ #Nl\%Za$#6cc{iX" Мg#Kx7үH$GX(a$I[wuxTܿDRk?)95ɜK={!qmƒ%R1c@ '1 \10V$pGՂ 1Aݶ#H_ ]$&fЁ#aG慿jvvҼb:h{qhT@I%s<7'J~ t.D7B)u~RH{=Ĝ_gp>%2pQ? &s s-ЇQs?fԟyE:!j`]  k[͞/\)\Г  wP A""$O> <!arj$9osZ ??jJ5XJx.7hI?yWd]#xBFAZ 漅MU]-Loik<ѽ* NghSQ& ?N7v@n`K[Jv+!;*}ȍhb3RQ*D(@54H|k1T18 D;+@N\)Nx("܈m"Q(vBLb5#YԮ""@""APDF،qi@*o4*&*[{)]8dU6`٠lag`35Aer'OTO,M$I5A\8?~̃Z ) @P&gs%xϝj0}'\І$k4"M;RJM j4TZky@ $d6-e,x&Ft砵b⪔@1B@ %`Qv>ݟ,\lcn$.zrԜUJ b&ZPCpח1[6BTbrR΋Շ~k {9a0<VA*V}8VxeAbgsh;ȫ\v'Tc0nՔ1 VƍO@F?E܌'$Ta 0 ;ZӴD:a0n.Ty4MEL j{HMW}E${! ;XEjq.HHVEP+ !q0N3ALZ"gmu4m`|5o PǮa"Õ1Oi[ B]y^_;4(!h\JofZL 1WR6':ШMPQ4ГpY;L'B|z\ۧ`Ay:^=wCmI j (c p/<25DLä`^BH\@8aAlLjf hmaDCǸ25PoAc$pb[Wj=phJP^9 F{Prh:?}mTo?â.UCd` ēY<ȏ5kюBArT 6_TAW}kNg?#u&k&'^yPQLJzs3|N$[ՠ m.F!<{' aƅd+AJl %H^LĀ!۰::SMg,  I 5&{P.c 26I4gOl i^\>mA DT 87Bg]qrKۚ$pۑr/}R-T#熌8āD1=K"F6(=!vjka_ RN|jGx9&z=Z5.n!EK W{h%{ $|H@-k!WfyC4kb!9ܝq$`Tzu\{zԨU/+ěxNqΡ!B@Zf`xS.ԥ gs&o}ݻ "k?R #oGLPi vĽ) \d#Ŗa8\{s*%mOKK8 HH#$7 ;=V}-cmt?hMc&:Kg7.qML0ʸwF^gIPڹ[5t]ÜF^\&7y~$̥YElvx1Ѷ-1!'j=j9{#%`]n,P0(eWCLθ:XsQR-]~H8gC}s X)9*!U%i&By#kMKƽT0VBֆM?mEc`0^n K퐙pɹFe@s;׮kaTgey-yե0,NVJ$6sckUldk&"r$w{ywy!vYEġXk{s )B\\`_X^cm#A^}Sp YAUI;8o\=5-88N8NhPO(pq{-"P~,J!J糹AG$_կe(k@&&%6G 90׹ِ񖾇喪}!\d)՜+\T)&z{s CV?x@XqlFX[ڤ#%ݒh) :sMSҬOrtLj` `lI(ctj 0t+DJufb!^E&,qxr0ʂwiΧeJZ%\vr/g3!`g8 N*Z.mH !Bm"'&&P@xm)^-*M刴9v;l-uH.(s-tlCRy3v11sD5|1j㑜6\7_WL 7}Lj™4vи4@\ 0+<iM$mU* La7B_3sUcG ߚ"\YOAr(J CvMQvYsHoND(Bnl2szROkR'R-PӅʆ/i^$E22VU,hT4RЩ%<:-AK@3윒F0stOc ʒu6Ȍ vm#\RB˥JE$=D*aW q[ 9nFü($Y^S?>_Cߕ&j}M'_KK뿊  @6EWm}ȨcQQJ}uui6Cᙫ3gW4~ďV~Ds- s<1MA"px^ fͶƤBjf )q{wӮAv=|$C MN$ۼZdOX梚lJXP8NW-A iImi1V>ld3@Q'{o^ Pu87_eE>, T\ݔL?,A<+J^|RNLqPRʢ,[JrTYa="4(%s9>ipj+JaɸXI2$pP%. y2DAkZ?XJ w9\:yA0'kJ=lBCI!`$,?C'qE"hM>|"VI%Lxҟ)#b6Os2XrK iqxUPc4#PϙΤG/>U6x' QkFJ: p/#| )h2߁K`ğX86_ $81olQǁ1s6@ZaV>ǯ, 8Ǝ#9i.EX:H%/ׅ&UDvFi[oUI(%BEHkb72s|+T│h`5xXkq8* $ F+!!!JD0i0ܰ5 v#N$C5XHi7{ڎ{U*bS[.骫 N8 BrS:m*xׇ(JFC ,2{*q3^c@4U5s3nA@i!!18HNr7_L&?;BR‰lE9 V$F}i"8$N*wWVs5"?{q_B(cdRN=P@l"BU sP o2.H.YL*&; ]0B-y4JN*.?hf9K/S FN# { O}AV5~R"W5 q8VḡH Ua cR%ɰcB*`rL8%I240v}NB@(X! Zc'K@/"EҶRu](a? A撢Bg ֒BkEd 삔ʄ8mys`Cz D0'D f)EmFJQ\_J14N-9qI5k~S-$ܱ|,.((.x[IF.ipBOI喦Ik*5u41h=Inx EPrEe ࡍu}CY@;w^8s-f%+*Va$&- f^ lia˷~DJTtH"`XR걏ej9R~)á4H!ѬցdK7zKh=7:a>!iSpc=.aCy-cRJNA JeG:zS$F17.k] te*=F5]W&LhF:mBOx XM# 26h6ی\fµx|*7*q)i>(I ,t(vN!|q7?^.i:1"$4O'n<.Me6op4rĴ Jm`t=t?zxZh uG*!px8^,]`M}s!'1g*-f_~)" .mAG=|337)E"9=+4fs!hh/a+#;5B@>^$/yd+fVqHL} B[Jg\RMi경t:z05FJWL 2 CQ$jDZB1&{J})p>]+צvHidб^;D >BH卭N#ͫX־ɉYL\j;nns}9V?gh[Ed<_2Q\ö)[μ1Ibh_c0rEQ g' 87$ ]E;nR/=RT},3'[,ڴ?s]_B1pSnG|Kfb%%3db9X}`"(d ,w xM;4%4e{ۥ+PSzT s4aNp4KN5W'c%R?R*I()>R9:ߟFGC @@ 88uUg:c9Lay\w] kjA_W>V"XB[C7&$/ZLumhF7 LĽ2|9#I6M8^)@og\,3^w˜kJLàZg<]yax,*L {` Gmhbqa>cϞX1MlF[dZ|waBFA@B|԰*t('Qj<)Om/ ܔh=j\a}]B ^x08,yv%ؒB©ex1pm†Z<Ͱ@O%`N\R0y!VpM]bP+|^Ni6s}0NjT2*ly#=<0|$,s]Y놩"dIb,2hRk GjW!2(%n8$Ni|&?5$]W7]A:]Ol[& 8BD!VhKHY{iULj%=*'X O=tPp]t0hCz׋ZA6 D#h1Yy@'6d|pb.._9$=S5Win|nƽ֪W \VtK&\J\2p_p-ܓ ҡT2'%=%#@Y52&jӭoʯ.8gu4JN#LVuҞj3im}fF4ڦ48,% ތ}~lPtb/ y2]BM8ōxCn֌ǜ\?܆7>s IR-pM#ѴZ;o 0hAX4kh\Bnۀ𒍛omc&d*v CQCWxk$T!?<ߗמ[xulBZ)q+b=;1'ސH*IHIy`bX{.g2 U HAMJҴKgU>|H.5QM&UOd' ]x?tꝅ36ji6A# = mR7:DEMӆ5@Tfy;ɓWzf$}*J]Qr9nQ$k7Ya衵tTiv@[l&c9'ٔ䟇n<IMpq1DvnנiUܯ} `뀚76#Pvyդ(hAVMr7w4ME"5yavxju37A3Em 4]EBӐ[t6{60[?-c#v&0߹82 &e,bTs#RRXu>(63M.c,'MJz.{\b.XuNX%5c>IOZzDJL-*%TV`ݖm5&eAHJ~1쇩QRlZR꘷Ǣm" P}4Ii>xrN+!.EwH,6dڍ0iF^xфZ|F& p-}oѪ]m6y:jh X l/: ־ru (W̴Nt~c#FtPa.l숑[nXfstĐ&n-h.b}D$ {Oa׈&KBЬERƴR٥UPt1҈j:H팕q-zw05@"$]( ~&] qPd0/GDV~&7֢){@?6]sB=4~9' IqyaT 0?K\Jf:ϩQ^H| 6HO]-A^xD߻ .!aΏW8M hMNKsx+,bٕNF +9}Lnz؏|ޕmVBk mu74[~qɌGk,Tжj\O8ݸ~i mb م6 4+dfE~c1h m#NL^k'(ϱrò ^ $A|:J\o^3Q87\SwқZB"Gyq PD-裺`y=km|H1`+hrN |$T· |d11.0`xggGa+T֞R(矁yr>\jQʞbZ6YhϔR&}N 6 [n[ oV%kFJsJ40YKlp JPRo)!ٷI,ffL\@vA6 BI{jYY\^4AT$ߘvTfU$kV T^\zuu㳄0ѐVHuoBϗ9C?>_d4.myLȨ<$xS#SZ9t]ė`zOwkU~^pq ^PPO Xk0!mr8zhqı>5OP|=dmirF|B d":eZ4JZvn(lC,K<%!Xuj.~ MgdTa3Uzj&BR6aaA3R) z`,R@D&.8/l *Y’N%s_"o+rʫ|LҢ7;]Mzݓgfbӹo$6hZ&$&CR=,^iF4V usܬ|tlhZ;tHg,G>ib~k`u ZWp{MIyk)O HD`?7ۘz6Lr4a݄$…!4:pqqx? O8r_D,Z+Ht"")q'7 Hkm*I;C A'/\T۔GWDNPҳi^v Ӆ3NQ~2|2_ARQ3W@X-i<{,l=,0C\,-JfqU dƮN5[*9Xe D$kœf[EZHɰVſ7vpX +P)} Wl.vׄI Y=5/Aɭ8]ZsKWϵ9Idpb(?CH6tjTT\)À,N0ѹkCmid4`E?h(5oT648IF45C1w]4kڃayZLH((I'ڶ' ϫ-;KsY bO t`lk݈p5r4AU k?7'u;:YT"1}WNHH(8'$9:Zjit*ܕY>N:*i@BM#"g{hc8^"VzAy~s|u$_ T|lI8W4J`%7!/wZ{F;K=VO"UZ,(ȗ~F’gJUj78Ǎ={%glxnx ̟ڶfTa`FΏȵH= es僗& IWy᳛r~/K uJP c!77xޚ~sGs=qld K.tE ?.~R@(pM{¸e7Jy쿵WJqQg0B2B|2ăH8l"5< ωCމұ7jֲHizdȱHRkUaPԥتAISE(B:W^BrpTaoS_v0LTr4Vs Jwim2e#Xs"dWC<`5Pc4z6TOlx~2޻:"jO?$U{ 9Lcgm!9QZ@|R%QlY )mŢrtJxj;l7~\YhkZI(4æۢm6=g+zDif SZhh=2lQNg+9^@םIq?8gPNܖ^]@Ȑ)6Y!Ow̚H'aDcHd HRJOG 0.^pW!iG[\^ɍKt6"sV|fM8 -5:|#WcbNHk$턅p0UDU0D  oI+=vc`|;uOZQO}T#|=eP$ OvRLIaXs9áu,j'!£cN$*R"e>[2 AOMѮĤk4~9f6@tI8ΑaĊiR˂50qP'$Y(h84)x1o k#y{Q3$Ow'dxCHdIp5tǜ٘H lZ)o?hQ5Pr14.I?~n{/_ކVp-Nm7 c8Uӄ֮waqdF|1PGHzqq.Y" W&fVӲinJ7u&J @DwÖY֝*U;_c"2piTҗ!%YPc?4q{Wq~Cw~kb`.@F'xHWo%p[FĉG 2t:gq%JfDف09hj<,pftcc #.$m &YT.3 ȫ}I)L,Sql=Xmf!'tu*2} .5X\:0@q:'ѡ`)i Bp(^Tr$ƿ twR+ɳk ZwSNgZ'a- ʐǣ߿Jy?%zP># zR0_jmZ| :R HC*\\zgoӧ8կ~ۻ{\]_q86Ts$@k Z(ՠicx˗;vE-ID<(WpjSZ+UꥠS\4#yF@zؾ_v]5y~^|x9\\\9ZV)@]Oξq$Yi8sdZ5kU^AtAa=erbl| O L[)dd|iԃ}0}(%C>Þ_ 9q1ٰpz:^CPiUpF{md{H^5"0^pYܷf͉HF{p SODȦrR)*&ie*|3;ܘz쐴=J: &F¯uos_<.yV%sWcTC<(?ݷa'm]7?nIGm;<}QK}C^thrbټ 0:%wɘ|{aJ,=(-r f4n4\Asg*Nc w {~OATeIoak&8JֱM;zJ[rjo" ꒵${⥵3s.*gj3Yk1衚qӒSP]'pHIYs;W|Lqa$6y5 ysVeXK4]`,$_),LϕM,,XJݮM-xynHbTTN9Еmz$kjIJħ/J|H bPO2h--+y(O+-}l"Kck%o~()^?=1[ g޲G[J̷olfZ9fw]W.kAm}GaKXm"'{{i#777{yQ !A̼ϧD1'I/Hz9XFK? xS6Q Tyoe=GHvB69lzE ;j9[  WpYu'ehߪ5Ky/8pQ2e*%BWX{%WW9Y/Tu+i'$FKkCZL&t5s9 % k @I2bxt{~J# O8gzZjB<$"C:1&&ao\~?Y'1ًxJ)| N Rҏr7ls$8/HZ#яԚTuܪ`W'5.Tk7K(U(vfժy`]z9 96Ǵa!?0+OsIQՍϝs- jb*6ePb -}yU4yʽJRP-&Jk.9H+pKrXshUلN>c^Bϫf==Cg )Vg>PN0: V ;F@(&eN}SRְx] [ uM[v^r,Ic{12ͤ]·~֜h6 MI J8WWWQQx:0.dET$sWHDH4瘻A+\"3N0ULN:ֵ0[} ETl7fB@{9`ądЂutH\zgG&">XG)TU&3K pN Ędh `-BI1TDT!Ws:uVaa<2w@6 j^պ*[*~ZlfgC2PȈK?6]Ʃ/);@Nq=@`0p<{u-^|{4l*3 }J*Ȧ>oJY}LbIbXрWEJܫH7P8^Y/=hiYxzmo9X|rUk*LGeؘKNngLFEZ.SrϽz/A&2>{Nok*rja1[zL<$06VXy?];Xe< B9t@M7^/1N#GJ9"Lu^LA6NcTP@e+ۏ -shd]L&} %7{djm@ZtR'Nt:p8zP,ξm?i5TG7A7U?*iPNuߛ6tI)yzq5 P Y (ͽ*+1g ~i业ųȝL$RFGWBgMȫ)*9VJv^]of5%<9$$m`a0ڒNJSɰLcOR`s[zgSr2a\2!s 9 $ Ρm@ RH7j4K^[r{06 STZk 6f߶ Xvvp&r2ڲN *󬱱bX7?Pŕwji5XDʍ2Κ*hr`8L\<߰F p=dZ;!- })a/?hVuiMD$3 :X.'pѾdㅇ8h4ƶl!DZTWU _ lt\ Ɣrڴx]h 3W>0V^,+X%kh[5:k3{B%Z"0g[z͵sUkRb.I+kgЬ߆Q%u"K~$眣:+¸*=wyl0y`XYh)>*mMzpp{oamסZvamZ֞W@J\NNXgq+ Iz9~p?z61[uP~灠dS4Z3퐽VM$?K͒0L3ᩡ< a08N0l.]y;ߵAcϝ/ ,3M9T!3Tu~PZ+o =YCVUJzRLlnRڳ|<Ԯ;)gLbH~>$@q:`GVen> ՑV8Lr9m((Jun\%'HP:努\yXZĥ(fgBs9jk|fj[2X*cƼRhmmc>Q'5}a^+GJZN{ϯ!֞ekrBVe~>N:,&^i Jk{. Jz3Y-Ctf<8])y>l6v6 @HhntNqTfX8 e_KoXbEθЄeK x0vx7{s4@sd10EVI&Y:j3MF{⿗fmJ b/pg^B^u3*X-r?`9k/&*UA޺dJmo$I]kx:uFa**ڊWf^1RtelCQ^WaH|(^ 62ǗRPq]slnCK?ǿZ 5dH-͢~GF @*l*9ȑEgy -q{N~pJ!%D֕cs]ct}?9b^hbv2@;g7UUx@J8o^>%s u(n>:8tټ 1J5ۏc:ݤwğD"""L,ĸƺJS }~LAHCnsǾ;%IcFz L2zD+uBK:8xܰgic5?{mcoϘqzBmW#1TV9w~/ VAZU#!kzGC{ekL =`?W]k'j;x$Lj[4 fr/{m-]hOh@K6=4'[HF"I?Ə&Hv<ѷ ]"1:Rׂ`{(Vi.,e}BEđD 0&t"ӓ$:ƱкGх6`ɁƄF!&]J_u2+"uuuJicd/'^d:{VK 3Ŋ53pxGHR>!:FxY'7kŘp̘"TiNa-J%#0 u^B^4&gG9!QDau0v.2=?$-qrC)XithHޏQ*2/!FH0f`Fm%~29F\LI{?'gί1xn@ [,}ad6BUŨg8F4c <|G <{;o+|2 *eSbF5f-p7i_xo+H۔d9Kz|3Rz^cەt]-XȐܰ֯^BJv&ch9ZO;},DFpJ`(JޮB3柗|l2g^ fh w%|lEK5^y.O`Wgsyt0Rbkmh]n)ڸ9kJ<|>{31'ϭǫK:5sjjZ(u\ӻȽofB^nJz4|69þ9wnAٕz{ 8K3*UK?H;SںM/',wz!lS ‰n|3d[2N%LWL8G\tA'rbbR#?prxX*5GYT%YZ2_ŢJؗ#dɷq@y QבT&>eNNIwUڟ}Md)p?msg)Ϟĸ_:֐z>'?5muRhW=g+2jsX7]LHg b_'`VY K\R.JR*J4sUZº 6X@WQ%%r"J#짵ust&m-bG|aZBvKJ!s0l-ΉVԿ^*Zq+rjuxvh͉,hj$54 mbS$;U@iƮcF@n0ʄ<0?kf4\ݛ&W ]ʬq+#p✠RBgjDjF+ksnTӞ15R5M&@mG2J3v =)Ɗal,皷B6&Dq]׶H\"}m$@U&|aK07&!Z:J {smmP zYt{l""y}kp4I?oԮ5}g&-xQS{a.Nc>s!9S9^J4N5<J{`K (6g3:іΡR"PB \E 'ȑV\(U?4yW2/^*<оa:*ulk~5qnT*&!O2v֧ENJv5$)8Dls잽?%Ind^dOlaCR!Z Kl$)TNB"YV5TUbWt% FIC19I\`(I[ , .ug mDR͑&9k#|SJ)OJskѫuK(Kh\t Kk&J7y2ѡK$Sn[{u-Yb~&HdC_܅pNT('߀i!am>ϟl7= ,JOcr"Kl\_):̲䭳"2k8mRl`"[Cߋ8[():08ʐC$i ۰d+A?2KV*+U~y3DM'b~gR?dK c`Z4<iۜEڳU ƹ6zÿqd9nXө[O5Q,`.pl.R"p)R?"m9Y{捗MylaՄts4jSJ҃3t:Uٟ|3.!ZP.zg>o}>h&A 0ғL*SBsY\ %A6gVS@JY>~>ݧ|ݔ (lU*xI,qCJ aJRӱ >$ς4-,3!(e)˓Y y#=Lѱ9q%,`*s6uȓCZK)op9 wM&Jm$ZsBHΖùE ќQ ,=OȽRUv=hD;*xJgu.t.4έg@#SF5MV٥(mV:hj?ukM6n [49ϳG&0SmG;TUj- +ߒ{?+[ gHD"_7qM5ujUן[$%uB'Ih@M Z>bZ989ɲX&OK 9_7'MEt CrTVebd.wdxO@iߚYX:sқ0y\Auq 4>n2%bK-IA{Q8<Khn\!.u3\Fs[E-)%}Mz%Es m )RgZMÜÇFs(I'|b߂dM^x;ϥ鋥P%ʚ5z En&gZ>=ýD0ʸ4=AahFIos^es&q.mRSo^:(Z:u_%ԠJDLS~+Yspؼ4FaJQGJ-5őωy?FPIo?Wx9#tOs`\Y#4,P4Qj.ծZ1\A^* ߛ314J .BV+!{ѿVԠV)mZk| @FksWۛ؜CjAGQGWuP ~ 3s\e!Ş'?4΃>'k dYKy\jDl*ůc% kj8/d Lx<7JmSj/6g$GKpRUk~hҤJ*߻f(*҈Zs|È_i6OKpw}YS|QX֎lb~dh '<0.l,HK5[@}SuA#|X?}?*t^Э&.# ,?[zvssFq{W PcBW϶Z{V]B]J)LRc Mf}[F^8̵#K ԼNK!| c>ޡ@V>BF)ڂ*-j zBg}b ^eѷ_Ԡ"B6]Y,h!~osJwnÊ(O%KՓxe+@_9&Y"mJKj] c5Yp!iϔBSԟ O{DhGQb"zM=Cyc!b ݶ2& )rbzH^)L!Sa5ϲFl4Չ0{t94 TwLFwXtHamLv1k9$7M~Mٝ΄dkٶ\ &|"ƳBQJABg}Z/t*sBBB aE[vs88&VGAXt3Yg:OzCuVg3k!A|Hߞ@_K ZWtef)2}򠪶)r ,}Ʌp#*j-q~PPvdu쟣R.&ydl(M~%ȵZmsrplG!&߹#@N* H̘IsK5Iӷe|lm_q¯JkWsǥJ%${:aγ圪h r䬋 Ꝅ&ʦMWٯI(k"* F dbUϜ,5mƌ._[ﵤ/8a%e#R E*9m Xc*Ĉ\rS5Ƅ'9’="slD KAO]PB}LbC۶7pN` ܳ<<<2o gՓ05Mҫ^kl"τd3^?Jr@_ZR}`BBsHm,d#.`I?t23z5_K&ofW:k Pe3,4y*g@l&' {О;p& Mdu䵸OG?#lی*k@3 8xL T-^DK O^ BByg42Sfz^XtEN$p=Y4=hn͔OKEzQYg{MC=Q}&w}hZ*ϵ12?k7ݶ6S`9_uNYTRkv7NtY\H ׹]qH78o;@hGk-"-Y?ctFA1$HM"f6 `Gc9rFK .kD M*LCko#H16ɲlOzDJ`K e&g<\^ bh`ou`]~3ߛ~:δ2ҜI8{y4Ž]-Y Wol.@o5K [kuF8dRؾ@ a 2jS<ɢ@FW,,w=KާzxLY#!t8Hm'@@gy-5DҭWz\'O«# HfЪ'תg?xI t Qu6aiߎ> +r&g|?Fu\UC{WQjYOy r)"?ͪ5p Ţx`µ8G– %!LDpn1Ч9gz/I]чpڵ fb `Xt\a^ܞ|$߃x0iVO:}v<3zm jr老rB8Kr1SNgD;KkS ;z uZn 0HKG AlCepODUfq ݀t#q+9k;p ][GOl62QL :ltFPX1 #Pv' 2@?oW j0fK:Yۜ AONބT$a)'Bt6Jט , 2Xie0S ͸9W6] L~.'V, Ҟz\r_2C S M"cCs {uL#cI}!UaH,X.eCNAZ^p1kD8fFgzVTYBF܌M?N=>i;g6ӖRL|FtPEe^PsQ;=IDczн$ _BE}XJ:o[5hoWX/U={"(LLGGI&D s&2<;]߂۾  '|VJ$6B-"m`߷YQB*NbPm"w%?[phEg ;20ëG[v}˝XyL O &$1{T hotD져7={ch<{NNVxrW|~EF-92FO ag}=gSQ4aM pbdm@(mсTxB:mG=іf]׃i{WJ{v8I[(\۞ ! O5㭰:] ͢bXCDy>~O~k}kN&o/B ^XJ1̇($x<`(p={xM֞eE1XZ?ۖF q>q%C@e)Y²ÿp~ϙ&X{S#|_+ 3̥ F5^vǯO fŚsmi/$3Gb=X +K>&a5{|&P>Nֽm1H2 AnrE$:PTí4Pq4.:n/"y&Yֿ'U:Jag+jH\:ܿ>E3TD|_@8+u qm9gSISs1# `i$I))XN}?2ht7EY($,-㦅^,8 Z64"YU,%sS G,Fp<1y:yYGrdWXuEPuM@}iW~%i~kȨ竽 n&Mmk&z{\cTK|bFV\[d? F#IOLײ,p@^ L)>%9Yzw+~9gn݂#Ɠoe#=o]mGp#ޭE3/2 `ތwρzZ9hթ;/nfAH'닰3@og픗LZKFcRpGmMk_g@t Ǩ93DXU\Leݣ6P XT ׻A@zߵ 0OWRڔav[#5C")YגVϬ~8Z+Z5R ʮWEFPw ~uR>;[-jc]sR ?h)%ї,mh?]׵Q_V-IvcW(2`5gW[53Stg!\:2єVGOyeY^CY׊ϲ!~=?;F/w<3 .$DRz⍑>)(RlF8ZF{&BRG M +;n5r Kx˜GeM{kuu]Obd/GG_+0ULp;x8a=߹D)Ⱦ%"`jؠl*sGcRuVBBL~ws~.[gXiXޗ/W22S#2@׹IX:l*J#k! ۆk=ZS+~&55pɁ-NS][,|mgD[t0U$)Y> +Y_sJ@ 1歩DziՌԻ W:hIYͅ L(ռFRtˬ{I [Wm?XdAHڑfGXe~PysTEGE[T"sw xd,Hbf: j: 6f4lL8h=Hvj F*7J%On}"8g>k5+d?Ntfn7g}yeJ+yGݳl4I @ԹW_e^ r?h{DdL4R+q["tK5R-fFeӮh, VOݓӵ>Æ_~9Q2g{i26^0+r*Q@0`&q̌:_{GԶ^@<4Z[+}f J[$'dBW=VP e]~Soo Y(*us@~~¶}BYJ^Ҋ&@tƜ,g$ QA>2mԱOj?d6:! FYPj$EL@ióRC~oD{e[|ɾ]P|yf RpX 5 {, ɽjuDG>23Bmmkw]aIENDB`bzflag-2.4.2+ds1/data/mountain5.png000066400000000000000000003473531200563112200170140ustar00rootroot00000000000000PNG  IHDRx pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxymmV >mZ{sν 1"K+%3e$(bH/t% I Jg&t*$( MB TZ5FYjU:aY*{9{ckiD_~>YygLbf((ѧ@QEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE(Ч@QEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE(Ч@QEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ((*EQEQ(( EQEQT((@QEQ(PEQE((*EQEQ(( EQEQT((@QEQ(PEQE((*EQE((*EQEQ(( EQEQT((@QEQ(C~=>oo77/}4MZJy]iyMbiX򛬳?oVEQ?f1~B}+4M%"\;ΘCHݰW_+(*Aڿnon?twƘ2d18q80O 3 :A"ĈyP6 tC㣛c7׼oEQE;Ç?3z߾#&0qD ߁CH8"u[ӄ=1WˋC/?PEQT׽v{{{>|11ė^]]p `fB@9gRPq~@u3yF)d-`"g\c 0/S_( _%˿+^}ݣG@D(bgc@RNŒm 1u`XgaAbFt19Kԗi(N;K_ÿ)F\v,3"tΡæ{9t]=6ݰfۡ!`%~Dv ;b(E~7Zc,Z?il@D)^J9!J5oKAׇ) C)9eEQ/S}}g{w?o#XkAB 1F%C@) c s D"s0 X20 猘"J)z/)c`E[6 r.8# lqssg+^=ߛ(evb.7sFJ G ]G^Yҙ"B?"ڟ1˟s!u\M.0`3iB)3yF|׽W[EQwj'v?l~[^=SO=aPJ9KE~gz'W;70`4{LD6 "Df a=,BN s BHQ 9p7<ַ(R|gQb@seð01uKl[1MsB)Ejۯu~ZLӄo)~ce&^Zsޣ{!`Ay1D 8c gL1TR6} /7QPQEy_u]^R|YSB-k'x8nv7ƀ sZNޭa>[ 1.}[o&ZH)M,#`rBXk=` b1/ᬅ3@뻊EQ_SJ\"7 @(%sKn5 WWWDq?YwuifRFsKÚz%/A|=OD l-0RH1!#R> !t]݅&\'~<40sp^2!OC׽T((:AIoh v_}-62 Eli!o]32ڸY;Pi%Qsls7Rv=||??&( v_7὘N;`Z~ͺGEXZkQbsyi۸_Kǯnb-cje-DA+mS:krSS4139bSxx@< R[lHQEOh'[\5[0ocuw[PnS-З\^to-< .鄻dcnQl=x&߳lJONaёݻĶ8 f{xWկzէ|g| EQW:Es毿t;9o۳2om%(0l߂x 6 l6O8 7+y&vֻ%hFEVJ`0H"Jɒ1Vz \oAdp}\^]ܦ\~ǯY߲(ʯH`[[G_>۟[pnowOҞE` ` -QX:3q m>Mk\ߺnvaG7tbrI`H6#2z`a <| !Oq}k^ČkuEQ @ {!pa.2G\SdЎ`wq+b d-<#{a#ԓy 2zG\@,@ݠtͲO˘N :ў a(bdL$$c`ζ:r!&@XLl类۟4888G8p -)`_תPEQs>OVD ]N- osvI{d?jD:HK!\Vw,up΂}sB)ҸW'*En=xBO~kaBS?onoөEQޟd- 省\OƝzH5I˩J\j`5uw)Cj+^^AAj:Z k d<5g~kC:;'J~ҁrM@ey9g@Y'=Mk㡻wSQ2ZBsA)o?6[\QEy1˿YNR^N_" t5moA%m}jq_ϝTw/5Zcս\W_b=Qn3q]h/Y"t0n3zq#,lezp <|^ꊢ(ʙ5ærbot}_kM)u'Z. 8Ha WSs~,,Bu@b5=qoeuiOGu9]D> Xc kP)!=_4-#*`X"u9W?VJ8{\Ss<7yEQ?bSO]߁! PEXg@©namY,!Xg a,Fkun`EGi1ǀf04IιO| RJ~kH(dܗM :Ȣl+|u '!va@i pHNք"$n\0 6 bg'a,@wTCx8/2d$ 9+85pQ=-ЧdR*u d߻'AyEIT<%*2R\"dfXc;/'= 8TWR_o K(૾ӸcL`0ଯ'QF/%κ_ZKR:Zl}.'3"S8 ֺՂ.H]4dj.?dv'h~XZ <Ԛ !ޅf5(f67&n1[ /Ͳ\hYXOZPD_"%&d.n)gpw*y=[ZofR]OCz?(QREu&~ k 90 JysBd |;#2H)#s-bXZ op/@O8ʩW2Xd@]dpgYPs c[8X`.]cVniSπV gc~EQ*2Agۄal^D;\TV'f!/GRn8w_sDC;W-2hsB(O֋-1X<%m}l"NbLRfB+ːR99! f},Fgײp6{EJHIy9;_eOŰ>U7vsO~a?+U(( !gOwi' Inů;׭Er2>x4(`c W'`!y0屮F<~1QpwRQ%g4# j `ȟ΄ťs9L{k'tAFsADNfğRBN99!I%PbB\ - "Ķ6K{'9 ͰOcCW""필 Ή] v1%=wpW$~w|~9u?C^EygIB ʩMD'yp HDqk kAl:P13rW;J cPE,i bH5 q`CS?,͎w/ N):̲;A tV/;^er59# v[i£ѣ\]`-WkZ3Ai43aj,}RB)"7Ɍ\' S':l^^q?Mm:bݢeb/!K>C_-4ߋzPR('\S%!Y:׍ѻ]MKW: ɉYN%/'l|')Kpof6bxӬ>U:cPH.ʗ9OE6J<#eV#[Ԝ)W\$j 1yCfq0S.E0|A2:Ęj?ܷ!k,yFJ bhfy Tρ}}luyl.>D 3l}Muۤ1ҟ!M';䶝S&ZQ]% !%`:#bpc },]1.Y#JXSz1xY߿?5BQw&~gfne+]~1&ӈR~ 4IWy*\ꅻO`KFNuk_w27)EQG>`,"Z>(eI f?EQf-6[1I) `uIz5n;$j0d-h`f0a)bf#\Nˌszg;beYb:˜zt:]߃%σ/n{ZGa{*1Өf)Ii eb 9n&C=Rr唭h k,v<%[,%1J 4x<WEyRĵYFl=JZB!jwڬxYۚ6o_KxIirnF1rbfRj"4ȵ !1qzKjvlg-ƚzzu:Fr$fd5;qSt#gqѥd=a&pW^ }QƔE`U&]R'-{ вbښ@ڒh-[c`AjT4ն8,S#\pСa cbqxKd)\@ Z~ R`kS.5, `3Y0ߖRO?E}?-zP坠 Y7˧|'K0gQv*o@kۗtINtЖׯ'kArN9/v-2C*^Ĩ,ʠqș dEv50,?ږpaqR uvL^j9gD΋Ai `䛿u)eQ"z.5D"KCK9AH\XJ4! l[+ELK׳{ۅ]`7 #ZAU nEIs sAN҈nb96^uzK29$Y>5r*Ȉe26P`.aiR2a7A Z6iZ{3׸4 N)ӚAb ΢q0#{Zq ~H\Ƌ9.e.Y[J!Y)R??_K()Yc^Nd~ [kn%zJ*Og† f0g] wůEDSz-oK1 zdϬK@("#2;o^kdlk?fkYv0Dc mMJ4״'[S)h@Jr%Xb oHFj f1i[":=ٿyn - Ҿo=W4?kN-05@&K`ØZN^J9yNukQ'%EkӲmgdOz:]sܩ9l9@>#^B|~'^E%N`~C/65oƚ 0pᧉ`e 2LDd9633Hd<0}6Y) KYئ 9`ڜFȅkⴚl-tmԯo4}['\׫ZK 0c&RzH "-nlWd7 sb >AQF`{X'v|v kJ:__`^[6u`ImC"fed.3ňiz:朱OC?0dl %zQ%^sWd?בQTqz#et[bUU֧)I&I 2N)wYNd ./.qcZ U*\t!{ORQ~x3 /< QXhqc1X[K$qغn znJTǨEh%%SkfFHgEo(2 h!XB%!o`3?$ (t΃/\dt(9-ӻG]tڔwJ&!ε0~Dneaej0ly}i@L R `j1pu!q8,|g #8{&}b1\z@-b&)c\~ٝȒq5`3\kBDTRHm8MP9Øs1xdˠ {\oAل<8&D&Fcp (9"dqU-T6j; p HaY7tҿFLC@--bD¯`[~OSKw3?^hҲt~|GaLjwbkN53FZxp` #~Twpuu1K@ւsA<B* ka;8+ OsOK \ |ἫwZv, 9!qFÃaHƿ@X[o<'@9%Zm8/sOPrY3..徆C ֔d$bL#dFbB(AΛP$(lb8BKUKAAB.tC*)HuCDiVo=4HiQ{Ycj@=)'i՝'"ʸ9a<ѧ'(H}?4_ō % dC@JP$'W~~^Wl^ 㾻ϮO4Wպf?&CD_9I9k[s y\JKɷh>`L93{BIxaڋ` V6ȫ"aue: epn0tJ:(tOSo^NX뼘h^O#rE n3.p2icgwW7О;)%$0ArBi㵶5S"ȝFݮf֎~ul6OxAEz aamMw)Z7G]l꤆Y~{.}!w;{ ]wQ/鱰wvپ[tZSIʼn8)R ?w/?j('$ 㭱~93J1p ιd*9b (H\0מuM~.gםwN'BX [S 'U MH _W)bd={b}{̧|6/f(sר$C?,i~5FC|}7NvrN}߯0B-ss񸜘$r.ÑsJEd Li,!3 ðY6.ߋ]' ûw3RhaQ<,88 g YIVQʵۇ?K?{>C>O|^?.6ŋ9cC/X _O΋Y{_\`i[C;Z3EY.;Ur,s@'xKHQ 3BNq @aa3>qb@7Ǽkwk`\_Z ] o9ߥ"]-(&>%a?+x:NNˍr{ _ᶙtEKǷK r7CRA)ɋ[r,D|wF1_ۦ s,7*әAԲlkY$J3`!* TUr# RH@r* kTפ }/*w4V>Y%QN[#KL6`cz2ʲ&;gFQL2d3bW>F/-_eeo>2R6s>Z5uϩ!9Y\wt n)h[^j))@q' [01Èo!r1)?v?\,z:Jv \%gƶ@9 pF  Py(DO8v]\שt5i޶0nMvRPq{ K:*/ŬL= O^e*ze\vN$#wMBTy9"' x|ʛ Ξu9}J!e!<ˌ6; ' k7P]7J,%Pr|VbY<>bu-sւ{}Wo@8:%E)`3 Ʉ_}@,k =5g<nƖJo_.1>WVjԬ`˲->ހ@Y~[b"wo,ճͻ=uXI|21C?syF{L)N;9p38!(l:#n`s'5bsX7upitqFעj i'QM.&C65ZM'9C%[1OHmPr<&Ə_W~}]U_譥3w]^~_n7x_l{cLjրoj}xݐ\J~#xZ1.kv=L!V2i8KSk᧔X21 rB1E`!)N(QRĿCXc[F9P"Bcq=aEI )g8xG+Swpy7wK)hnS7bY)>a2b458.T7/%#(su*f^,@z(gOg\PxI}FjY`)gNkmzȦD{ݯp7ccK`n ƹ" )(5(Xu"Afx&8-?G4 y wߓ&λ?:෿zRy\pFlݲI.Mja&g\5]#ĂGGq4l?QA5 ?@yg;+1|{R與oyfӄv/[1.Zi k :IRFT<!KoVW :K^%g1cSi9m6p)>xbsF:d)A 2֗sE@8@I,iҟ#ܥ@늃IbR'Mu\Kgw$=i%r#, `93ӄ}c<.HH1ۈ@"Y WOJJ=o,PӺ2K9yg)6,.z =k] [3V9˜D  ">&PNpda $\_ѲUTcD "mݱ|,lnqYB~_f};vJ珞IOqIT9H'I[Ĕ8!e9tuAҕjnu}\WɐdiړOr!s\"8㰿 QRJ0^- oęv>"![8orמjBfД%GDb+%HN TT9%-:v r" C@zyıeq\c[nl+w-}sҠWMrm3d: bBB*Rw{ 0bJ't@!aG$/ꨆ 2w)&;b88- 5yA[lK-{Eur~r}ә"*μ\2Io z9rֳ y 'fWoԿ.p]-tˇNl6_tީ6K5D&ҩj-9 5[K2pםL{),߾ugӱ4eX75n[ WK',Hu\O"}lY+"ƣЙdk_)Xj> 䁚ѳ.@"oʐӒ)ǰ,6Ql(djPO'Y`Qz[*]L;6c ?`C>?4|x7)kR~key>xx*Yebߞ3r!PmuhL o{/t X#:rDSJ9aZr8< <2LRB$Q$F. 3eeB5ňt^kpy ޜB:ղ}rHN%[k%VBq%331Pu,Srm$-"i su6Ȁ$r{ePX#`8b<L C9H֔0 mpHnA%fE> K@X\JF*r pMEKC28[} HA5L$Yg,:9:+ }K\]^U37y 83Ҭ9ڈeCD(V[8G`'0ɵ> @,O*^k 7 :8WKD$q^"P2bds*02`Gu}G0tEZn9yy#Q>f-@[t"ي1ٹ v-_ #pofpyJ7sRhtʼ+ɁON秓/ڨa9~7}3cYH^;),⊜Ԅ:f~Vh'EԄA{lL`Ȓ1P,c3[Bcy5E"[%QEn#UY2/4ؖ%pXnWJVv('!]w?~q?6 Uʯo@=9?{KJBAB[s TW^(G977D*8 aEyKGFNrSqKF"b%WO3s2'g?['2dekݲJ=Dc ؚPn R<Ř`ȥ`Odi4su%Lga!IƓҦ,p/Rjվ$KxaȢ &Jd4,O6Lf4j`ҠY-̄%C`3fFRҰV$kSRkT?׌YKg6F>[a<˘2@譃{wZW1_A]=_%Q2f'8k1Gqp9a խyi>gf5`Y!2b[/.uCLap>qf{֝/W0Kio- y\W?5vz uD/>ݯOwzseIW-K6 Rnہ}4FJ6j~-ф,>gc?P"_}BMc2~ d#B 8͘1` 8ucpqq<p<1N5_ x+().ʪoK!%ΌT%f/?D 4IF:"=62S0lxpu4H#Kw8y!#!ss)u_9kվFJ<-!1sfw2ePM4Մb=\9"Ն߽6Z~g̞\ *^@HbuIlߣ3n˛cp2}s{qp}tC}Iy@luk gԢS G9"$с3r ZטYƭ0`wfEg,y4͈C7=IȚ@#7X_5)bF^T6U+.4=m\6RjD2 i7d@ >n xkɶN]ף Kw,z|M(550AΌyN3bؑ3/\$o#'~Au:M'g xXg-@i{Q [<@4u//9K&{8gqP5ւ^:k!CfBe2;;KJ)l.Iwt^( [?C~[ g0y%7q ߺ|7ۦ@4eqqV1rg1EnI`dx_<:  vNGd0 uDmPlp@*vlr̈́|VȐl;J뗗;lp3pG[RBLG rl3S{/r8, `[&Xlڮ D`Ze*БuNz8cRIF鏵I,\ #Y CBnMeKu)*EՑlad2utFg,R0䖥 2Nou&YR8e8˵nj'z"_:XG%"V~i֐2;C{Q0G[6 K3_܃98yt{2 @HH͟W`@>7!9[8Ouq)" h^S- ,':5 Wv<:s` ySr} BL%Iuxm#<%cΙu^V7(%AlImJ$y5?N)U1 O)RFO3RePy8K㩛Ӗc ZU@kܬ D00r"1I!ijZyAX'E&2u\X836lavH%)7|G|H0h}]9?j_Fd]))RJsovc|wކ2!fxg:FF. 1:)Snwp{F$[K"1@ 9pɈ%z-ŏ !ˡ2x?~>aՃd^KvNxt:!c7lqIsvay.p;7?~q@~O]J[(òT(AN"SmG\D̆Q@)cY=GzX&xb$p.( (eٻprm/pP C8}ǿ/Q0o}[q}׭%!<@uZS<RO _W2 fsl0M 4!K/@v0ցK@S5[SW8b&0@ Qc~3_niַ(`ITw#x u[t~5`[ՙA[i0[JnF.A.aX3fqDo1l<}vq8)cm[10Oi[TU:3{8qyq.u{l3ð!@@I"Mx,)3 q+#n !Cy,rp0a0 ra ib*^8raO>gϝ ~}<]\\|J龵m0Pyi|sM5_٘' #7\˘rj)$9000ι~4w~Oo.n8}bY6KT2BJKRCLxzB :d.Yj}䁲,\"0~;`Frqdc@ݖaFN1N\eKԴ<ӛ{찱;# @GHq3pX^/`? uzbLSˆ!FX2)1GXeŧt@xtck-][Hy( 2bB5֚wuy嬳aNQ0o _? u 'M|` x#l6f3[PGWO$%x:\d/W_E\`Qt]?eWVJVzbq{3-oy+Zg`q7c:3g nx* Ek-H]ɤ zt8G\_^얛R=Ҍ'N%]>OɂG)ΔQd3RY&=5MV:ObI/!˜r~As) v1ln[[߷p<#焘f=Dѷ^.bePw@s ,dcO"y9G%KFoAvT4f& TWGW_OԬȹ,KLoa9Wa%Y^næøHZxo28[ ~0#WR*qG777??:S{{{}҃{WW "&*"PBZ.,Y* !xy/kd sۼsYvJVd{ .(O>zm!;/k[oe4;Gm-@*4#_ 1v7N_TKA*y#on^R\ߡtH!`GZ/4Y=._%YVVE3d BI.mw#<~<|k=G$3F9!I&\ 4gR^#"͆@ 6`ϐ& K5޳$?L)-mL.S`wIkN\@%5NٮCab\ʹ s.vIOK5Hc:X[*:I$1K%"8az}RC6uHvAAYQƵS1$vo Ұ62Q^ Q4OspNAFF#BCT-K&/B.]mz5VD4+)X}p1(. 22$Xޤ2:pwE4LS.H`x%f$ZԲI}/Xջ* {ndF/暭bMFa9Җuhʹtвd3l6~L QVUoƫ[K6v?0Jo_@/yپ~ypO}d\\\{pc<񶷾<g 1 O3 ȸYyԄtu,C;1KZC3(Ml6.ao1 fa"%@ xl3Ru76};1o'Zzmg,URJ=PYвpe#[i]/h!̕G~mHIDu,fI.1piPW8qoG?c07/?.qoMq6)O9`,5"#:GxK&x<."0#]]s2^x"tȕG8[a1d:HaFY,0uډs,l.K{?f7|,ҴZ:p}b]ɘ^ekl[\]܃vq#+^r?󛱙&k\0X wB3Wq<(:pI\4i H#|Knpu ~ނW[ؙQRG 2 z1t68- nGxtsPW0={YܻH!o9") &ԉbie<8ilee_wm=jrNq}.ح18KaR>I)[vXzQ y} h,i]M cS^f .(4Enu2Gމ9OJ m1S=bxll6=E.zsfYc[yw-u%0̍OXfqQ2 .v%zt}WO[x7 kJFɄb Djv]g}kQxi e Fmu;iqmWLMnxY1mx%1"# y}5(EDE6D֝ԥNrE%SOȊ99qN$U0-noUKd^Hhi& +@F?;[wۘI[U'V[mQdVE:r;OtT^ )œV}|@6q.R%6D(jEtJ K$E*34՚ kV :}o)G. o0.dyDbZ"&"QHnnͷeO0#:v0uv,קY*Hji!Nx!nnl7xi<3gS *õ\F@ vx zWճA׉x0 v9Ͱ1<|K~.{],'jm 9+̸yz\^]JN ܅ } ^<? <#[q]ृãGqss)G{i<#=|oG/!ƈcn豱jE&2ҖsNQxS'R:ՑGɪ/!@FFYN1ް?~Ǐ/3+|$+EWK[[v~"X=9<UI=;06Zb\wZu߶?7%RPU* ԛRƞ^yˌe;8x"H`fg~ZEɸ6 4:`p|&QdP`eŗ_Qb[jY3ɺ" 73\XT^ARQR##t*"U.intR(4E>!БIRnW\_z}+ןFV7T& ^8$3o?~E3~'\q:MpN݈'߮_+\??㟯_ۯx:OG|}<O'`> ^~~{^RKu蠵C !ZkB%dUsd<2g7:r (e3C$TQH+Mh ޠbpiTU;"_fqB* /+u_=g<^ W S1M"j ۍX>AjÿW~p.39,8 qrs cr "Ro+7ּ_𷯿7\+!:ޫ]DOM0 Hյ$O5E[JI]X<ŨƢQgbӵ·I56:KXoWۤjz`sD`!x-p4E wr u]Uͺ}n ;}* j=$.VDhr8tTUBG Qo1"c}ۏ*F"!Sl&$U'9r>k.\ؽ;P!+u b &> (G0W1ă1A!<1#!)u YDv$R R:^ `LlQ*{̧9*,~S'CXwU>}*j"qxzq{&QmycUm ;gգ:`,J@3uź.|:t:(Bw)>(3ؕN(fDJ x]TdL4G}& m^aO4=0%|wÂO PvٵX?%P'G"sVٺ&X 7A!!xlQr@8MR:Y 1bEL-;l12c!8C", 8CJ#ugkΚ`Y~&ĒK};Eቆ$}z§G\Z no7ccK7weAL'\>?ϳ@#Q9VϘco_~ {l"mW^_}TcxA# ;)89+iۛ judc59@Nsɪ7 -]ϱB|69K7 %т@QjqY} :B 8rpv7i̘J@F,gD[KI!ohhw1FKxS=E£z`,F¡#w}[e8k &F0" q8O|Q |D1u9AUइI)ebSO"zJ`̯aVS|jHUƬvuexV8JH{B$ J@PCe2gsVorp>-{l۶u_hwCKn+c6L7z;Z[񴢮ľAP:D r.?Em1FHsU |V0L6rX%v)5CVA;n;.Z3. 39wYqhXڮs MN#s2, w]e( Ao,؋&kF;96&:jǼHAo,꺳$  ˬ;d)vgƴPaRքT+oswáϺK!L߱҉3j:S IA)v2EHal ߾sF3>>O#y֋˫hF \LJ+?_!%Uu4)׿ ~uih~<rT ^_'?M/۷9b 8ЫZsAlyS蝱Tz@Z褍pBj+&BQ$2&T|Ʋ( -}w]5hA#WGmo7v5>N B/ :C,+`>3=,+ ѳJʽZytDнm!?CkՍ;>|>"x{}ú8N xC& A_8uN؛yY,H8a'. D"hb9ru=RMTW2@ރσip ]w;,iB:\h`XfYdvWu:Tb R= PjW kvFN6:{/9?=Om :fR!VfH!x N\ O@!Pk_1 }*VFȂl "&<'|xz4ғPCua?hɼJts 8/i+& I8P!QU\ {%k/`ᰈ:BOl^W\.~YW5ބ}U6NuA석3&x֨v趆 CT4?rw lYQ wL ?;TXb+qZ0W)lS¶U48jjnno5Ax^2R-v{mS|~?}'yB vlp-.ϺSg$dޱ\|`g _bDك re`///˗_u{r.+_ۊiu"do< R_O5m9 [^ooo,\] g(tM5[,>[}u1I~N9g\m%Ip!4sws}F5`]gUNjN&gߓB:9 nWM^"x"?L zoE:֪E38a;Q](du&F^wTf"fg aʀx#Eq4"r ²m#28ԊvpCqչzutP薣zg [PɺG hyEE6@}9eTVq `p pJ0ƶ{U¤mud|:Clwe<,1`$6EO﬇$D9e+)0sXB(zݠTB&c}(thRȎ#ᑌ5nS놚Q x 3*CǗYUt8)|9)Q\0kpزT n[ƷW|}yEfrO3O珺R ={,𑺠u=?K#,;\xz{ſ4Ob'g>PE) |D`ʊu-cGyUmٞ0Kl@9)YŚ .ۓt ڂEGZ<݈6WvN'~U!}uVX8_/m)ܭ}Bj+@S?ƸfGs|IǍW&4pFɄPEx0‚w1cg]Q0 8Ȫ=^*,bL(ZQkI0| E89١^m =?N$!Sضdqfc Npn1M۵Kx*5' U)'*ٱu[MaJIbmЃvZzZ{^{HVu_"n͓J;"r߃P_k<źctUy|8Te+$(NF&(1b|<4悡hڅPtl@l{F悔 a?!Nd g~Y*MW"5H/:.!cF_R9>a^qW:dz\ƾmxiޞ;Fe>?}Ip=RZr.ח3>ߢ@WcaЬmtdFm G) خ_R1N, Q.de;sN䰜OxK+]pvI錟>~_~?' W i/RP~pQr֭b Rex1Ngx~?_qO()ʎu߰&^nIa=,\;gSB>DpWncr1ڥ-ʪwwp*  S[*ڍ֠+ƨnRy/&Q;k?rhҸӤ+ߔ%z-=c;kUwշu SԺܛ"|$5vϖM0SĞ3u ~:ƊxP|G#p\mi ~ID3t!>eSk< #-Žwc l;Нb)Z<(̩$:vl܄R2B6EIYa'8-pEq鬶,r!j@o7l;ްo+^pS@rb6vu|zEGK3HVVGڧ>.}zMwo߆vfw#4g6*lxM=5]QHVwЦ5g"*@Bp^U0 | VdռcW=p)xLfԀ&XtgLU33V }d F8E{*91DX*%'n߬F*b4vf,s]T|S8F5p*@`]u,s 9"V1RWMYM̮Sy<7aTkf MT;j-<TMA݂X ,P]3GG>N3Y*lZxl9㶭__^m`"\>~4Mt?L][E*@'qbb\12Ry8# &\u2;*vv ]]O#G lp2 +-Pkt"UJE)*P\,Қ[ ծ^S{׭xQO_ӻ=_8;䂀Z `V\7E߄l">λ5͵,4J#:txкXA1A0)1)B s)ս\P!9^:^ Kbjs 5j>t"`i{,}AQ SHU^^ |Ҏ:AGv뷯(N .g-|Z젝=QK2*8*ziIp" lB79x XNˉ@>#+N1 quT`Ϲp'Sʘ?8@tvmF{})pIӎa+JET1I! |zV@.paK1PwŶ卑YPJTSB {Xk(59`N&l%4GL7 )v?"ytR F*C@ m,^PmK͞e0tMBG]M)G^tJF}}U{}\&$eHH o: Pvڟ󺾫, 0Qs@!]WF3"E˺@ {]343UJ]=mIs c:)0炽lXe9a>p:Rp#z\\r N>:LˤX FMJFnS"EA_Bn9 PEzYtib]=jUe{FZ G[#דrCB8E bFI//,:RHfᝩrɦ4tGkE±mM8Gݷ)NZZ42N !皻[Gd~^8! {o -v U=XHK$C(4m۰7lr1R)c &F Θ>}Or^Pm7nW?Gy}iFف-!W^xw>rb#Ê־v+n+c/ByYpط7[4&iS78<|}ݺ 6Z3Gϊ@=GrJ q$ju~Yy[DJ\Cxeo_2a^4f<e]HRz5e}/+290#Fϟ>OO0rz;!}*F|Cy1-'J(/` \PQ)32+ܨش'4"ko&FݷЍx{T˳M ! aI\߉;+[2i.YEg}ܫTLVꄑcahָ2`.ؘD}!ldD(/MZ:^8 ~VBtW]ԯ U$:ӄ ?MnVE~epUWWeVuģmu0@L{MwS :C؁שwG34(t>r{,˂ NAU^Fބ'ٳlL nfxsi.o_vB4Ğ6vPi‡pZNF=~w̳N9H:#`7@Χg<]>B$vݱm敵y ܽ5) wʮ[WF4.SX!7d }:kæ֊`pZsvE);G|pa]oضr,E1 MKˌ?w7}J=|+mKs OΎ+)seYpZNc/_vz$lA&8ly?gԢz=e{A郧xNR׊ip9_p),/28N8-'L!̌.^E )Ob 붙E&wzr Ydjg<̀Hg4~pmE* m!f?~3ل{ߐSb^m|//߰. E?} SgӾ w|is)RJHA<((3I??+i|(%?7,m`a]U;kwAr]XX)(MQ֧7[^Q)Q{ە5Ml&Z^dMeKl+E>\CTbcmhV٠AOvi=c r?eV'}))h-w=ܧΑ!si y-8Q!H#w̞gA, DƼemC}ق&Y U9[J_Ag$.]5F~#HACH՝t6h|X^g<3&\:)K5V ԻqA.tp~#%阨d0g3 De*d &qo.GuBM>`XΣV=w6k톜s`#܍ N{ UwC4EdJU7M*TRb2$oMtbBvWb 5X5[M_C)ǨBN6 &EqMUы)1mr#vjaȃB xzfM|U Vjb&E,A,{( T#%?A |rITJ0c=IECsf@ffcw¤BqhZp>I 2M3h#oH*piEFZuv?z6xxrVy?mawj1GY{O )gl銯_/2cZfEVT(5b]_f<_o߾!-<Z*Rް" v丏ջwۘ!u$ 7tEƵ81uxvڤ\tǯbkб@hD>Yѫq;k!rJ]0CKhUq iigDPjwjMڟ*jg}lmADGHV1*rww'tManWCB\zuAT8HOl#- 8r:Ag3 ;e9cY۶ A׷V!`7=>~#0MW: DۚPY"ۑvΡTZu|X'&6=ȿӗ=!†:.M8c6 +E;aP# PlmjhTmJ1%}{<&ͺ-#%|5i!- 컘I|q:O ;R-!\vFQ焂 O{Vb!1//` VJ\u靳ViҽW;4rZ4*(9cK;Rҳ$L,ƶ9eiY@V lº-NS q5祥(S=PDJ_bg!) ۾j YjRQ1sc#Rm&t>|:1̙gYhn#VFPE^ΘcБ[x,$@;|=L9VG&_xVվg&ɏ\QF ;C- !i@BHpvy&=#MN4%hH{ƋШ1>"i}8,G1;b a 9 mS{WBŤsߓMy=8eh_>ˢl6Y}왯"YJ@&4`غ !,xi'.O}2VJX3$QlRЍmU;͸\.8nJH7SqI4^\ǻQj^vRpGޚfnV*5vj@mtA]r3Fz8(M DS..Z0jurc8E#lZؓ"3*Kxb슦@&<ffuݚSrANmvK [)x6i64i/ؓ|`ɴ39m{Er6kZ1 &jۑ/C3;\ U dq;>>h0Tۊw?}쳥%%iX}r8_!"IAW<8ELr!T;}PaZ3,wͥX폡8M^{'d_~bYN-|A8{0*~|yzú_A\hu_]7WIbik'Ǐ6*|@-'{+d!8oD3g<ϘZ-CbN]&gܶ+^o/¨,2rU}J Iok{VlI~!y{NsZ' wvE;lϝ[j8M84T[whgA@@}x]~qM_q^θ<+ޅ ?=Ϩ_E^^beQ3J ۶`9e}~eCAN]}X@W8ꈺ_NQqWxꚐTmosHq$MNyf2^UBbf3>h+Z\; $]1!F5Y~£Cuk#woExxIlp|t`*l[ AcCEL'۾w8pɭh8M˶@OEBsI=GpuQvFWRȡHEJWLӄ\*NFspq' 2':hz&)#t{^s\@L D܄y؝’l7Ā޶=WBP=$C(tEo gk,;_GΒrOU( Wef%[gR1-U$HsC<b\]h!F8jֆm}}[@ݷ +"VT1 m}C5t>r`'-u&Xׂ14];--uo Qs"X35!h4OH9k<0Kt^JK%+$0nۦ@oy^T ׊u[UOO%urR\7D۪ؐdϮ@6A*)z@o`J"EQD K2S: J#>`YX!TܶomTzr*|}Qδ,:77<4@|`f {j-L]A3g8|PMH[7W%NӶfQV-R1[YDX/sJc_ovT|Vl1N˸Vl5,KZtp$4::0TZF..ų5 VKl922ڱ? *8cfӻSG},uD|6m[niu C@Zу\adp%bO^=c=&`AF4 wjgBj{9=֊g0 &?#쫺 'V a[{Zlܦ(9k9AYsHG㎬ЂV(>!M@9"gĄL48MŚr Ĝ :lv(xsDܛMzš*X<lYav,~H`tĖ!Xw5@DR }XJ1%R8*AU)%pW~ve=xgin^;VihGߜ^Ѫ"m|*,S'`qE;8a Z ;0yYPKmԄ\WBOgLӌZ ~YI u!x }O] "bꨛ&`Id\ $g q9" 6A 1`9}Ŗ4^ \@@O9ܧ#9\ih8*ۘ^]7$f]-%T؞>*$(5a ]T`o*ӚBg&r5,za0"M"xXmҪ'6E/hggtc<)PP5.90R.msg *𘍇P.&T8o. DNT`M+8h+RLE@}C(QXi7a~Duq5TF.vҠ;؝fXE|e#Oa:SlHmRxdlS"@|U}` ?Sl#󝒀Q+*e~kO&Pf.ZUN- \lAN$۾{]TP{`WFJpt"tːe,pGL ^, o8R{,`]=2b θ%#u'D@`1C[Q2) ^ׂRy^b4jdVꥎCmtې`*f:W2?zK,֑Y,uSb}f`S+mzLZeQNj+R:^9Ac%8̇9d౺ _͊bt [JvYUER\xd|Ae,Txm`NCخ*Mo7k0XhW-g>/I;5񼪵2j8PQ[jٓND@N W=!+KM0I՟+YCM_ UΉp}Qgj]IPѾ0zmauֲRltv5QbtnSoD.ΖRkEf?&Q =cp=RZ* [CN2ԢX6][< 7,Bu1&q hHvp|.Nw[@jшL9~1jv:f ֪2 mh#Qy=GFVp=FZDh~@y8,sO\ S{83Q|h"=!0b#\D¦s5,$YvɁ0UmPvTT3ME9kZ_wOOOx z6S| Cd)nz؇6`n(T\I Yi"8B dz1Nb)A!aB$N! <xֱӲ`NJ5Yg}i ksO?ms@6}0Y7X#CZeJ<țjTF)P=+U3bƚI젭Y9)I }3!߂ZXK}T L>? Rq>@*$e!bzCpy{r?c. ^< QxLmeg56<ĵ5*s-Ԝ K圱+uC0˚;[ց}0gXГD톜Lv,]yB8s`GSfpe.=Wd͉UPJb5uN4}Ӥc58I`AjtRN=@g{uZ{vN4';Ŋ>aׂF2W{rbČA!C܄Ts7OF[(@Z{ e樂69KNߪ9s$ߩXk<~W׻t 8l+F>4/vd@ Rjj:LŬ䏵 {ڑҋۗy!"'g2NU`6ZT7v[<xvúXon\.8?}!(5 |26_2#,BR7ž(Y'&ˈޔ8bWۇD>k(-#Ib.ZXY1L0,`dK X8x?;"iߑʜPWx| +^} \.g<8kfs=9U5:hw"5Gc+frnٻƬ"|GA)6A!g< ;[ hthZs8?_t1aD^=ŝ^+#v5 K*믄I,zRlNC:o>xrwz{͕2 i@ױiXǨH VxFp4޵ y!exN,tcP0)*ۛKbL]7mSP;/p9(o?RsVq352޳g HEp40AH2㇫,65%K9VSl|tt )H!.%S8bT. &U°Rw⸂uK}6zh\tf}c)Cd&ӌ8G=w lbZ`ژTCũnD4 ,,I$!>5s׀1Zcao>Bj)CIH%"`2 ӑwp&7z+5Z}~#ܮ߉[c2: W=h1;gnc@D~h&F5z\#!UBQc 6#ݻR_fL1t'9!BH;yB<3]}s}._(mx''D8&͠nzwQbkWCXڂe"Zu3D7i ;1eè;ܟ" mrB|g_3{!i\Ӄl=.`f Gc0~yߵ qm0;3$6~3ă-zo~oBdDnmur %Fr]z/cH6&6m:iiEip[o`f,ԑboNr }zGKB/\v@:g{{;PƮՑY0HC({̈PyF aZ ݩt]W\*BP|#7,س!c^;M /}aI'v8O+mN dxO8_jry3%NF A4Q?TyttssfAnۓͧTׄ">} n^@JFkU ygk*h^1/=ٞjXl|"H{B% m~ubަ̆f7v}*Ai+|̐|Lr\TEjS^dEP;{<ܻ !4jڝRu,& "h?hgm>sKbx"χ݊lTj6V@\63w>kVpS&Et%Lפ}i^G{yΫ~Lﰯq|A{>6K{ϋ>bHXfQT\|&:+_8T{F. )K8zX'߽Mu> 4'%%^ eĨ~RۊOCWq_vRްo>N=g87 ysa>܋HN:x'VvVxVa* jb'xWQʀlcةcz*IeQK NkT XK3NAZk(`;Jv.K?|:- HU* c4ɮ={"٢{g ̘xHԤ #[~[=y,hB:s7I;npL{;4M8x̗ox}}E)E_;oI{/N-kobdzaWķpSP8 R 9rZ}CrwqS`,C[c>uxwv :?>DXߩ<@^Ei )rh(BE\4ƖP1RBNIf8B~Ԃ+JQF;UpaSՀ9ݱ׻y^iyUpmF-FSa9 ;=o3\Pk863O_>TSwb_>"Mw{{@OvxjQZ樸OtZژs'wŐQb8_N84 vv[Q+#D%Kgæ7aVC v^Ȑv9ou{:<Ҿᗿ !lzD>m:>Dq7ߛ6g{ =Ï {XE +&iÄʌviA[sE]6h+cw =D:9VnW`];q2~L>zI~4r8Edz! 8;mbTG!3- T4=AgtۤV_A1!Ļ6et>hHFd`UA;lj@.6k@w@&]=yבÔ L{+JqBЄWHtΙ0t_:C<G~tYT8(MM>#egT ( iFpqf!snFu{@Gөڥc{mJfk-] ifliz[e\a~cOM;{DMqv! Tv@ӧ2󞞤?wQ-ڦМ젩w3~s93bh4N `0hK0&|cB Bua6[4o$a>V#mB[]TvsOp ۪]th7a]YKXD֥ X00k6G[v5D9} |WytPCϖs/(ɥZs(QN+Nk2By9ge< ǰ-mi[!j.҉)^|yPp8-'1/gLqByAW#).;Fgq}F btL,e{:yy@b畈pp**Vdtܶ&YJ/ls%VEsxx݉@D0~'_4 }+Ʊb};%=kF{QX] bHVl2-(o^)]PꑯhYfQ~=c8Awsd}P` |52ض.qY<==ݽxmv:x\h(U'`"Χ3NˬNp]_pXLG+ #$WK>CC+'N}T֡9TqxiF\Qv2ȹ"`KJ՜'~r$fZr J3@>E ݏn}CE!ECk{`I9e$ tQ|U`X3pڕ^5s=*bG G|J.Zquz..kmV`~>lhF1_kt=B[f}"u' HyGz4&=cr07\ ɵZfv95xPL2)귭GsJ`:ҽxYi\-j:5{~ߝdttarp=*aۺaKף?`gJ3@w#ѰGQɑXvaZV=ssu9 s :u13[s d0ᴜ֛BNb|@je h6zxcۡ޾7GL_@%{_" RH)=`Y8Euڊ`f`&?Ad-R7ZzT,̩`t: JSc yޕI7Qc [:];:ii|΄=d߯lYc@՘[1 z*=)@=Q~4;E_;u C n ά5Q- Wu8!Hz[J@rgmKŞw\h6Kꎗd:|~pG TͱjY^ aG_ّQr=Yo;&jIt]79-דv^?q9MS?UPu+ȾVãӋ tG#d(0Spj.lӇ~ك d{X3`΅Pud[HG5k|e\a:vP*(nLvٱGw^:LcYQ.6׊wu:j&~s5EBe9)ٽc 7ܥf;%RVTQHnm_&Pӌi$bu$ʼS@ey$O|"RE?pK+2[sbôk&mx͛^Ey~"R!FO`r bۑ [5yĸTø.O35Yť*' Fg=ICjۊm Pi]YykprHU0^o:%<]Tv+JN(TQ*>p'-äfܾV0JJd:#7Klyj)wp9/A_Ɣ b{VI)3ron9>蝐uMnU0Z-%d0T];pl"A!D[W^\~(cj+>u S=# ':]b/5 :T.] )Ԛq̸<-/+;IN'MJRѭ%po~R3R54m:`\HP}`{lګ! {ȸ28VbFݟp4u{?㪠`\h`Ha> O`heJ&$]}U"}uWӨMG 8)BiqSu0(Ej6H FiF6}X:xf)b~zx|9(YH}j+ŭdlSGtdW؊wH 4+ =<(Acɺ';Cd춮 ΢n +8H` l?gYGi/2N9k9.*gu.Xm*& b 5ݍzO] ysv^}1/ֽ $q'< Σ^q&{ߊ4[9}Z\tij6r@>dUF4cYN1juګw-]!6s5ki{VSUSdn[  4u)w۶Ddp)T4,,01a"[LodL6qR_osjM{ ~x~/>}jDRVXUsAՈtҼd&A4G&:P+άYt؊^u繦f1|YL(:Um1Ns'lj0\uyFpmњ3;vı /øx|[Bb??F&HV_Gkz+rmڵ FjMgcyߋ8}}ў-sCَ6UjPnM 3uDw{׸y$Ĭo_M 1N nY{B~Z/ $2r#r) _A!ZDsjiXH *;{A=Ba~ 8<== &PEo.}H .Z'JTtό)I:,Œo@zGqS3-(bͰ_ NmŪlQBw (/k1"[/SAiGjW@l`Z gy;}+pR E|\n%rpc3]1"';N/}oOwZde(7M~E'T%,mMЉHjOy?muԻSYYQӢSL+6-J[ }&nQp_fb?bŶZytt8 5 vhl]gX;N<)gTKsl@O|c.?8wa#d^u/?}C`=Xl*i9R?Yљ9 ѣ>kke=ɝ==#l|:`K|q冔ӂe9c5c^ E%_t: Ç7| {ڱ /%) gˌ\oWʈS)a"3OF@Һa0d0lݭξA90-ɏ.\5K/ƄD ;ZO6bTmnC~#ytJyiFs>» `ݹW0H=]{)[B[ҡoMF-fI޽@] %t@[0U)@!8@` 1ln)YGnR!衵j =N,UCM6D51-qIO]k "𬌆KÑ:gj`HûkLwֳA3]CH߇HFlQ&sƾ#wi}!rwXE+MuSgLu[0[é 碹]؞&v0Q-<GkO{^sM([7uA-U!i{}V7a:yZX^{,KǮԩЕG[_;p$qy;I{@Z;kn"v9~!=>͈j9㣾a>T  rZP9 ӴԈi֑Ӿ'muE)>|

=iC. dM- q㶭ggg\T:Wӄ895ߛ4 @㈠}\y|7Z6s W^Qji ӇaV=vvq>mwþ`)m"=sovj1UY rmT:0BuUFjtC5dJ;|9'880{|b8.nwzV L]#8ia$|Ɖ_p]yW`PS`7<Mۨ0F.ˏ/@,0$Rw/ MUO`zÚN{ZIZP{C?Zb3[53 _4-P*zX4ІsuFpGhZ*pCfvU 2AC?ɠWhj48Qu~w6S%YTZףk]aԚn+p\{fW`ɞvwWl4ce,\Da_}X?eW CJiʥ`/홙1. yo_sH W,h2ULd iÎBfo,To áLI͵ڥ2,I>zo鬗cLGU25A)~Pe>||—/_t qu7ܻe1>|]oly n+bg\Np^#޲`hQDo vbVl5B(t;'# w;q~B5Ŷo993"`[NT7N"G1&}l]c勡Ql-XɼbAzH;z< |f߳ $ `Xoj:OcmE 6wŮ~=|*9^ J_ H;A[l",.Y e&0م8(q5 ,)>)1X%emT;Cb6IkVڥ߀gz\ p޺I ֬^^P熁< t;$j韝oq ]]WpKmTcf6:= F@Fy(&.G`zbQ}Gϗg,83ێi?ou]Xu)ܱݺ >n,>zC,\黼g}= ǐLI: PM !%$eȥ)u y2=4qh[}S/UP0nX4do.zw mR@JM'WGl9gg<]˯! b'nWlJJ2b?wL^k`-LC~< kVrИJHp2BG}!1䨍qװRq#,}] b̡Rc>͊}a[C mOb<1l_ۗ 6UE;<lncUɨZ9#}a0œbCdd|UIV{X0ũgwd)kr^z9eKZ*)WlYvGwϋ&LS0@ӳ6W? ]lڞH}NX;jQ ^ Y`$Bzr ָTӤq'@zw]f0fqcŶRζm#(1MKh`ρ#Ȩ>20,$GZ#T׵}=:d;5iVs(еije 1#oM;Њ[UBAiPr{Mr3 +ơ#=yCwW=u gkc1ik?o~fUȳП's[xgM)Ô:<o. -0jlS|wU6R邧'_ ?j8y#b' yM G9!cD{ kߍ)ׇ-I9$ `EEQ^vhSk})Yl{m9)s 4\c/4M/We/b*{9Kf#1MMG`-wJE=UZi]D}{ݰ# =ppl*ʓ". ̆x_no>aYjpRkfxHuQU?EԚޑr.bؕP2 =2w* 9PQƂZ)癫2(=_Z_ͪOBgxu_SbS_^4cw,'|ۆm\73>}_pӝlwn7`g}y/ݗ|Q x Gf:EyA5*"7xf},c~+₿} ~A~~Xp=G(LZ7?N2)я& P?:?Caሱ;R*:k)jq^)\.r@E+X+~U_n{k?uw o&㶪3ԝZn7]\u2c,.8@+C/iuwG4FLbpO17b_2g]NF #:W9ip)'|çeҎ\veLa`Hgs8(ty#Ϗ:n/lM͵ʖ nR՛0,+c^{yn {K=Lȹ~ux!n}|G:Ǽ"Ӯ.Ncq|ב>L3{n`p}+yWR1K)m'!8!FSwnrT 7=FNf,e)ozF`dKnհ5Y`Sӓ?*򄧧 _~?}D2}\:T7n qۥ,^Q1Qe7e8lДćvؿ`9;eokB,v w >~wݥ{yfAN^sưoĶ=15=`"_*!(\EfV 0詁Ro m4.߅=kEjVQxtv4O:Dԭrgg%mU*ÄNJg&yA W^KǖׂYh85PGHGS)!!_?WApzZpy:79ӑ(9;a$J~+9֪Ͷd^>k}C1Fxє@d$3i^޻ػ;<鎽^eὩ#fQ%5@kTb6NQrC*R"ơPhO>u w4e!y{jk,~&|}gLF ޔwn(bk{ؔ6jf Տt!RQ h>6ZZp'B/#=Ob?oHrX!硈We-Qdy p2o`5}e~tCM1}P˯n/697ڤ'tLS?ݟr7}WI%Hz M(sT q)yxWmh8UM)!7LQ9g<-$__jA-O?;TV[g&md<#k xQ݃ߑZ/뤾4-S }Hx>:Gck+#(e"B2/q?^|~́7jTsi{ B br͏TķWC1ZĨw/{||= ic!$n ohdphR=&BށEY)tp'\qE.;N>|_gd]J]|+2y^|ڃ[ .fߩʅuW-I&L=1ww~x2z{H;I`,ANz:;bA1qsd+dIyJ[ꅁ?a , Gr{)߭GcAݦkǃArUu{AnZM' =wX1$u Mɝz;4X8^l6 RnAhZ 6w,cĀ\I#12{4]AԐw"C6fN#]TLl]ٴpDܟf$+<,ngTܶ7l)᧟~QWd5}bKq5h8>E~? njIdM8wv(-W~|`RؤٍE?7c;~ZFq|hq?v9e_s. KQǖg](rKb P=ZINԺE++/Do<<1>N-iH |f)rЎūHAΡԌu|_ixz84Sg=7+ w\O#.=F |ڥ\X#OҺN(hRt۟E /]lO\h[WZl,m Ac ȸ_tڑ;Vyb&;r>'XR'uC$ל ]aa,84#!t@X&o>_|­Z^G+7V@Mo:/\(jːM\ Vom-@bՀRaAΙ0 Ipg}q۶aN;?aś5{kɈx ?d5851c0^B*6`W$J+[{̵W7V|m_=: UP㨮m_}g7?(G{/@?p>;@]0>n}%qt{ANP9#mJmdOI wXFqN)3m^kOG=!YJ=8I(&ثfޝߝ+j@L]~g+ }sH XhnM5"`- }?|v2zWNUT#V| Q܂ MM!q) mW8r=2mMG{byd {>ZF%~Xh/HBK1螎Um6`a3[ujm|)kZoQQl1Zu*ãǏb7KCJҔ^:9#>CBq݀= I.Ykq * W R@XǍ!#~{ L.Ba=t8qtOl<BT_LUTH}r9Z ̤$6XigM4wMSQһVNx%m#'8U<ث'4+`Oسaҝe(0uA2 ,bIuXk4ψq2(Q,FQCشRz!8Q@޳d՚ lc UBC1Xd(tIyCj=͒u\-ܣ]fqG,E-kD/quӂ)+}u^W̳^ܕkOӄE-vaAE ,[Ѱ`AE׆mZH\ TG$/*l7;@FGB!2Љjtьfi":0MJ8ߵ5(d]~/xr3Gp7s18G}8x7gEd,߭ښkLY5xIwei/H ixݬp!LﭱFyL{ i ]F먱@)k+#C:t̻?kzc珆"p2TlTAzI869<ܸwX iS{$Ɏl b {D9ݧOBeD—yo"쮪3#BMaf.#73@tZmtO&k$=J!X5OWqBv˳lzouʇDsezvaoZĉVL1A8Ğ0WDTlwoQIVG22Vw-*2$} Q% iZ6HL ES5$8 ۺ4-}jnnalzrL*bNH3m[ '42ӷ`k-,>O/sf}1%#ك&տۆ$SS3z@>-SeK{&*DB4l%|XHU:CJzɮ?4`.Id: ~?|tU+>RW2YHmǛrߕ>w#eOtO=zՒ[So}a)!:M-OK$K޻:3 ypjFr0Q'30O$r\pftCi?Z+;!m\yLBEA *_zJ~.EJs#%j<̿HN%uy6)6J溞 A޷<[ut4wI|8O3\QSfj*.jK,܁'wj'qhhֶQ!tR%}(t.&%< @A9! # N9T[*բin [l׉u"Ri e5H81TOwqndDZUAc,<@DL.m7bXK3nv{Vb}Ur,D:fAJ|W>Bg~w3'*CHJ+65.jU'/Fz KXW[5Sf9n߁0MP2yRBk4Ǵ|,G9G}bTd 's?Z,i,9G m mĭK4`F4r_ rX|B6V]{?ûl16pI'́=ɞjtUDH-]>XXE>|!96sk* )atnDyƼzgrIZ78|Vs\늷(N e4Vfמ%5\ .Ѣ$ $|THޕ*YFs(YcH\GdSiDy ˆe??2^ڱݲB@nP.(C׎OH ߾/m&-`YℚM_LW/[dhMFnKt3MV*:"% 4`QS*\݌|HvBC;``-շK\F t'FbOJH)aY]{@@%W͟_W[;u@x״R!.Y9[ﲮђv/zՄD+t+A'G6ahxnd`oCm­@ˁ tsUĺLno&_ĤNcw%D7rP 7}vT+Ԍ$Z GTp)Uh n亓{{u۰lkvKhǭ+[bN2y(Zc l1SN'S,T!\Z$'&ewɥ"L]aqY(D'|rןv;~ZInBra_Dsn 8 }ve9ص>Yf&:w|WGldu-:) ]Mw' g!Q&"`.q YƓMssH!Wi49*.ju\EuDn_\51/E@F)vvRj'=:!ҽ{T2"ThjK@FV hvG(ò,5ȳ~I#^zxc^05'lkGE]cQ;5rdTz˓6&"mÂʱOz 9Еe'H/M~$NX= Le%vO \C@p"m%8pzǗ/_0wĴQ I8斢T4n,[ LMYi-Ǖe@߱y*fFpD*sς獝LuY("P"9&m z ȭTpu<)!Pv," Mn2kI&RHHEڃR8QZ-3ǤAh'r\pvwMǁP';R)y~ǷocTP({%*TS2p͸K{?K+ܜO>=R$\SJx{ '??|I('s5=waIw(Zj]IV3pH!8ĸ]˽ILoeAEmBs#E:ޱ8fwj,P'=\Cg]!aŸum961lHr BSvZ@#}*dWv#4{6!)U}"Ŝ3ͮlf)%RU!3KZ:Mn[0X }˂!N?Bjۭ^[眢`Aq|MX-MɼVVH#LTIsuI^_5!F/ZQȻlU] @1Q$H9?THMUC^ 5hĽU߄=ˋXlt(D5P/E3rB-ixҸHPJ Kaݔݎ!mkWth *w.ƶxW6•n-xKV+kyb S=%0،Sփ`ĊAݸOUTC5v0}on}/bLk0 ?4*UM6 U^X E`X`I5, NX Gj!H`19=9*cG9Kd=M:Z#Vgذ&jNXZJBq>|繨iF,KHϸPv#Z^iYQ*ꊦ\U2sU۔4ّ8ɵ'6|N4 %#9;#Ed"8ӫf%<I`WHvpE"$I@: {d)R>K#,VoTF-r5C׋eĢP>@5aA /L/BmnK$ĎH1U^~yht롛R)`'pp {BLh {k+}G42qy-${{}A9X kk;Q+@"2WAdr!/-?: $ţɂ~:Dk<\eW`zg>;d^"5+׵Qj~J/#B[&:) B1",kGP3R><+W{6{x24  zQ;=::(Ъ#L?Z"T". As8jB<3( /=^rsK O'mJϹ%4u/Y%˿m#g @:1YA2hT#h?Q%[;B#V*?!XnAj'&J4#Aau Igp!k@V#$dDI-w"LյJNF#''dcZI-#fupg=c F2I4b YB~n)m.#DHaeKR ,"1+!r+F%`]vS9꿓c]+*ӳ`W+A6!<{{ .Ш̲JƿUeFt[ أq~xP뿗Q= K[k4H["BM~Y @MjhH+wG8tz&b%GVE=ב++͏42t%֞?yz.Z@w)WML+Ǝ+Z?>s1l ^i< ؎WQ{ k7խw~|_cyz8"UTS܅zo[~Ng`5M2 ߊOJeuCct"Ff>^eW(TFxgFkFM9 4:Xb* f=CN+;^Yr ɡJsgvJ=;4g'Q",۱N P&z YQimYUX;r'9lk*m qw&A}$07j]S2X[+ -8U۾27BJЕӖFD!4<٪Y!%JI% 7Y}aL!nf=Jgʫ~s@݉h7Zٷ3nIBKY٤Z&a`Nǽ4wY{*άЪÉM9tB&5 Lndrt FT?TGn[5$Ieۊ GVZ8&z䊆᮫û#R@S"N~mg"G0HIt}I @G"ۜxgO1/F\SDILs@\S!+;xG=3)nωGUɤ-bc>{re%cuQr"# i*HnEc k}08T[N(Λ%SJb[t/HwyxtPXvV_ªZ?:pzaF+#*]gj9ӦׂOe'YLb2t ,$R~Y,;S2_,YtY8$eA$=P'J6V9JR׸DLރ\ũcZntT7lCX+ }䬝\B b+֢.'GQuu=R}#f~^x.*cI?N\,ʕL3&F?TMj\YG" U6Eu[&ֳzZJ/krA&iyEOAԵDbW1C(!+IR[?fXtZbܲjB 7Y<Q5!&_ pM z.Pj }ߝs9>'Z)b?%ȁ<%95%¶n8'M9c&%V5A1"f)Lv+1:˔ +\aV&=XFSH~*Lڰ7GL#nLmC,w)@T^.0㾫q"=eՔbtt!YT2e95$8c.{0Z*;Sp-tg;{vTGm9ϗ^DUR ,zĂ>[c{iB%DDNEkŋ|ER-XZ}F=߮BٵTm*O|czo2㊴nKɀ՛^s`psȣ`)Ƀb,-&t< c^YmKr]8x,w '3{:q~²1G!۞w02 6YſU Zנ]@"Q\(YQ 0=moeO-,F8Fl &LKI!6zKQ151C'+-IS=:l“)Ԯ,>Ϻ5Abn.LL>5\l)nq%ި5 ?kjV?'UCb/;ϒ.F?1.nn56y*ɭB|5Ч=8`y%{9 U7A,0M)J Nn^5x"GB$ z a"zto-kŸ-gk4[6eQΏBHǭs]&I1[#r\ bbS}<uOg)xH9AG3&-j=Qț=-&GV0ꈌ@ϯ>jCVՎȴft ZʓcxbudhwZ<KoD?s挊I\8h6L,)EzzD;d#?|-YɎ+(JXg|ZG;k JH|m#9#bQ?w\@p{I[49nw:ꃱ1m!%glF:#DJ&=š)2VG";erZ:4gBF&"lMQI,̱X z[ %v}֫uaP%2vm"PHuqhx I땾)R]P+\*~ 'j24"N{GřgbH&*YU6@h#C^lH+MY|dY>Km7e`s)̪I{.˲3Zb-Ayi|kq =Tޒ7WޜDOV|&zGէLS=gE?Yr,SjDU@:~>2Ϥcxcfǘղ0iB`2d?@sR>];MkRض璐10G+WZ?/Hk~|v<\vYɏ!&=d?$m&siyRZee|xh,{Yz Pk_͙Ц"<͇ 䛺y-mS-=$ ]PܭECiZL2H #-ZRr$ArC&ca_3Eϕ?BV,Mjbr];r}y[]rJդhr9uF-CHi˛1Xygw8b?q+}+_G&/hc#^-\pn.K YiO?dV{Q`YS#FbP浪юts?ӑ ViyYuZBMM0&V&j@WM#pPX0rTv4K';@@J^ @ZGթfPCj%ϼ4ld}uyX= SY^zG3V,ӕHpсѪgEcQ3u[?3uVH#ea!yKdam!$'W&.>TH9>&h⪒sܩ ! L5օaM%ydae6ز#JLKF{_CvvZoG8Ksu D4e汁r3onEP7k P-RF\ aȡt$vH[GeWFήoy&*6KfD$}Vt5w-̨U)h,J{Xճjw~sŷ$9)ت4&-m\1Mq9m[9CؖR<1Mغ{jgC1=|`8k*='bomDY')Z}m]ͬ045ٴ@&6tD3ciw,:Uhڸ[e@:teGKaUz ʙwn ;&jїVǒxLE_6a:4$CocjƍAY>Zs 1IV+?B4Kdʺge zr:sҕF  r Gaŕ#eYMq9잝=j=aV)ay{teuTIA-zF@`;Ð{.˲ʘN'{j53L۵э+ֈ,7DudFe4UhdZڿ L RcKR^WI|FsFkT-3)kj^Ÿ&s鍭y-x`YSF+)Fcnݬ互z7W^z6`1v$ypk_+!ϥm?%-udG{IJ.?[?""q;g-"~Ϻgk+6Y_="șs~ Gnn6X'Ȣ<ւ`QE.7=nQ۷oFmnA?FG. ps~ :O6b]vUa[<4)OA<1Iׂu:D ɐ R3`UGpp-.a\&:3Rߗgb)@5L~$n{UXH?ҹ(Y&,6Da4)b]2}Ra&Jp1Qp#٣5;<2iYr s!mYB/mݬTk~Lh^_6XH, Rq RbjX#l`iUpzvf:ud){ߦ[2| _G{I'ݏA_9>G`[ru)en|ז~V.׮',4D'F,v }':tv(3aG*GDByu< _Y ٟq&1B> I4C:Naضm5paJ)yTf_aF`L)%]^;GeuT,: }}" | -MFHv52jw X9~9W3G$N(W* kn4r6+׏F:8O?][^5DVzX}[zNbHnՕͺoo L~ur`vgᨵ!lo% g|JLCi_Vݐc$˕*3 t~9)R󑏉GПi# g&W%#Z c}C}iZƔ|/?}ٵJ&+EL&pLdfvj9HQ* {_ZGպA37Βk D7;O3i|4ev"O){A-.217n˷nd̦m=o a4喌:8بrSH.syRwBTЄל4l𼠝olh.Uso=eǸʡD=:G]gmemAzN?ųfEk @Uz*GUÿյgc]*HѷNW=~Դݐ*jާa!=Np)fEJTdH|M44!vk .0GPND"3ձF5j* GrhKHYi~Cs$MÿPdLȻ) _o\cRAHˉ9$¶n_hJB'`H)aeeoXG=H@p%Q52yضlXDLhtV αz!"EG$> LE2Ͽ;χ>s.=xKq搋)}pI(fJp|hz}DU;ny# C('(y{ ItGM ?C_~ aJŒm)e2"r߬a& ;VsK;ySM9p/ь$ZHz?ֲwuS run,IQZe^ϔrR=]UvEwG/~Su[]ݲ.fH8VC*qu(z3WVw6,pP*M~ Bp^e} G/xԱHPGܐ؝9RsY;ɻ,*ƊKs] iw0O;èuELO?kk۶:1t;\!Ӕ>i%C! R7St9 @|p;য়O?e7SH~kZ1hV<{PX"Dc,&DY 6a<$MDoŽPå!I|htH[gV- sïkX> 렉}icqRrKH8w=9f 7(xmES@  vF2Am8"(6줨"XVptUK\DSWt^Gir]"XA e|u88A!KN(ä~v_a TKkFQ3r̵<\-F>Qw=Q"VR ~=&=<1 w|Z]|}u]pz~/|oKgeT*R9@:&~xT@jVzböExρ,WL nx1RgbbmJV8#ꃋ>B6nvD0 kfMQr'M L[~%PCHk&*vs<(c#rC׻'8Ϫ(@f*>n+h=F!6}iB(dS+R"󃃛'џuäO#YFM1;&]{L>G&qTu S&JJ:}cdNk?3/re3y\#IFDRH3U('Mݽe>&csooo_o~4M_m[O3l ud~[+ظm!ve(-ayBۈ^KLTȄ.0jnQ2*'lvQzu ~'Heٍ~Z $i|XP BDGang3?eΕI : P^;" 0Q}-{!\q_0eZt:FP#_aЇx%Y'5S%c5'>:k> r~tջ򨩟 j~eRn'~Q%(@x{<Ҵwj 91f~@5e籣0p'G&Vc}Vq Bv0,H޳:3wd>~:Xc#M 6B>w D G] 0_Uɒ=hNUmg:#b޹s\gnb j07{aY&_f);~l%xNYxD̼hx{%///+H) ;25hH5ͭ7KBqضWwYP$hdR_!HvhyTn9V~"(*aIM8$m5S>͏wGRDuΖOٿ_֟Yog#wE63v-f(( Pnj=VܺHG- PgS̜EȇܡHR_ئRu/QLĤE1!>後~םy[x\S >_ R )Rs'˫)d$05F{"VRvq瀰A6e'p)H DH*qkJ_|c^7 dZS"o'TjY4Mӄmf=[O1%lr)) sjY1;NLt T *$7'FBX=5ϩ 4DJx4^]~]IYi1-p@L ˺`fۆw~H^Z򡦧do\'IH Bے8$塝НZTQۄy &y7 Jztyvy97߅2QM JvD@͊ZhhNqI^eeh*1W >*0Eq7]hJ˾J#A$o) B>.l&47r4m'u7a>=!-sXUFHG>d!,~}團Ե(ϒ!"!nPdݗDv ݈nQ@;+h@aq]%^ u)M)۹):4 /m{.ږSr @Nu{ NoF{d-DŴxPpaW; K? j9p$LEW5.^QuZ;sML|УGy;Gc>Ooox_Oo=ðs/_o=bͤ6+f9Zf%WpP\>ɉMj&w[BJ= fA߫d<#S˗J=|1MsjOّ=\R–R 0SP~"8DGGecyFRÖ; Q RښshFhBJUy(c`cڂS'*H^[ntnB8D;[(I/.\nw*VS+IWKk[ r2n6@$-Ɗ8(S̄ $iheF2iݞuD7/M;lF$@]AZ<ŭ1&]]!_s,Yͪ9SAaXZ1n\3bsvPu]jucs:v!Y rKƎ䞴8Bv$]w-Z`WIZdokz{ K!$lqfHS&$<{s[$&K!v $ٻ)I lWEI^pܑDD€m[vf'@)fBJUmeI;vE FI\5C 1$֞M{ܶNp)HIy/sp }rGG.kq{^}0%l73RY6GIf_K9&4<+&n)uZ$Kf|^p}:M=:4Ґh-kGISB3(s.Dj:O޾v{*.dҟuA"ɛ.:~NWW+iGY@JZ+Y#V-b*.w Mr% =aY6x " /v_=k_O BziJ1CO[&ȉ0[RVsѓ" %"̾IsbW")Ք(ҥEJf>;0 w180]\FOđш/_sc+"QWϷ3/rqn̚Gglu4Fv$Pn)ʱ?r3#3CÌTY2hu@ g73@J };M78tZϣ)ImϢ5K;!*DN5v"Ƅ9ȩI}fxW2NNf[tUj7&`{<@u8}5u&)‘BnWDaTE{9HSnuɄ V:xG㇬5; ;[ 9i?7 )JeBtG?i5;Z"%Ow nU=M^g &a[MO "e0MStXց=䨆qWg8Ju2aQ fЎe %(9 1/ч"JHXav&i"!1#?kgֱ\`x:m{G)J;L\NrL$+Έ=M(Uޔg)% N+pc},O'@ ˺P978V0'zTy N8<<[kHH{go|VCd5j~z}_a=sȥR 7L1M:a$%! |2DUŁuĂjo-WV]b]+BZc4PY@ ֌j)[%߭r1Q>XQpn; fy[òYމ{8rT{Ue2vWDbBN8'D}AxӉ/k'pG$δQ,Ko۶,T"7?.hX ,W쌯C@J :%눤ժ sEVB6-G\vG3y61lvm 99|,n}"e=PZxo\H&Ғh$p M:Y׶[Lqϡ6| ޟN ΋(9 +y ~L 8)<"`"s=pVzMm EjǩRD(;A=㯯'd)7Sjįwl[V1vS۽]|9XWyFD*Zwri7 5] ga Q<{5jxpy `>'UK5+IEc[Gn.&Xʂvgj$ƅVKkqpgI㖶#?*>'p_%y, m#nn3^^^@ | rۖ絋 lR!4xC^ IR4QeYňwa}=q<6n [< c\KIjT@ȑ=dٺ87sեʼn:f|AyRā~*\]3G?,5m8_'p&[`#u]("%&GYYCx4ßq0"qMYzχT϶1} R3̂iK1 >xLyZD7ƈ//䆅a55?zgGʥQBIbڢcl'[|(yf'}NJgMKf+]4$+MT8XZaH6Z c-wõ Ӷ3;ұg,+e|VaY@g>HRѯWJfINH2Vd!i*ovB+?CGlO9J p[_Ziz$iQlJVzaZB.C*}W/$5X?Y[id _mc4&jTdROv̬6t{nS~=We3:,3.V`XD4>"r4~E4 (q5@1y WTBCR" &GRg}~_B F+rv`pNvtj0Lﴷuם{/ o{w.Ғ_t=eK#d4TLn7׹תA:TLw8[ {(±࠷0\*q/ ߌ4,}J6N HYb)xHm5B<֑. ]D}E>_1jC_ҙ?5tl<Ǝynϗ&&^׵Vۭ¾1FU4߾%r#A.pOY5H#żipfNA17@-.m灶=]-7d`t@oΫ=m},hrDV:e[ݿGe4xJI$YnG38-+{k5f79hyy+?RH)aٖNiZӗ frK4hi(}N뜃b{@8_sr137G{>ą]NbBl]UҾxjT k=9$ LR]va]W+iTExHۛJ%Ows&QeZE+Ay"m[B0x$(X>Ջg҄L~RqD+) `u&BK}_srZ}GmYǮcC{c8#Hgx<*jbTJ=# 7A1k"mAG#;թPހ a[1crh=yqϧL=0 u*|֜]=}&j0n"vWُy]{G?=Zgh3}(߄\MIۛj%T(Uk2@CBJ{֨vFƮe5øn5{8י;<| \gϪ0/?8Gvv?O~ lHwoUU5WZ9chHf@Y'm imjA>MЏ%rx~kҪj0^YL>?_ e7) n"S{1L;'-߼wrf~i=V-<Tf{yY}I?8Jأ ȱg2ɣ8 Net{z/NG9=g9T]i;9)!M21f\nSre< '$σGm^D~Lwwd{b?W^1@gf`V2!"I[Jz_l-e&ALǃG" m> ]f$gBf?^Z0N|0o۶SUUU_|ׯ?²% Lӌy`> ܣlFN~+Հ&#_X i{|'>#7/ǣ[|a`+`ɯ$0p~9I>NdBpڨU$+_W#1r| VѐH3?)ĵO-q^sjB4.ӵGrRۃD}qvs|":94z[SᴝN{h㱳+$'4L%T Ƒxu-דkQ1%lZY𡶣$j'CFֵW$*&>#+O;Uݞ;'"%D3~O}1[ew<9_;"ƈ_Γ/7(gm]vZ!pGFx7M6ʄF)8r(IT$=<<9x΁<:ʱ(9 ?CCGa$oLˢ$y;HIl V'8rl$"t 9)392-w#z#UNw&@Gv#L@(1MY{NX,ǬCslEN9@v)a=urZ(JZg*kOW=U8!z޷.5#-$y}h!P'+ȁ~o] >MH2LԔ B. -+L P Fh)enP&n.ձ;$m>,< 9B!;c@Jɉ@)λ\P,꿧sӌ{sX1^tm~5(4);pG8A}jF!}ᔘBA* 90Y߶1t(K䑧|-I4[c{Y^*cΰ]cAY Pä/x`nh\3JB%Pu>H e#;̊" }#tjb*.sMR1IŠjK11m=a`VB=Ј;. Wi$$?É>+ʶGI.OV&tIS"T!B7mX /TOCTzfJL6L 8a>NGZeeW<b8;Lr"]HSF2]ݦRT/[#⹌~oD ߾};bRBi²,xN)K^T+Vu#,{"EmA.6rL3/v=ڟ#\W=":H>5˫u%£9 5cIaFw9VzvTwE_9 @۪H蘉Sk{Y@)_"1Dݳ:x< O _|oep߿xtd߿۶۷oXoooO?˗/]3~_* N|'bbtM)aMѷlsU|mg_>3F`m[!R'xDkqNmBhޥiMr*Q>>G"tOlu??SW(a~9?eY*I P{\~ϤEВVV|!f"g%9k^ӪO&ŁNg< Bd Tҳ!VIH9ĭ?[ٰj)gj(IjﭿG%a6ϟ]te]w,U]?MCK&MrR- 7cenhx4:L񿋌c!ZA%." eʤ'ux7] jlysyDۆ#BBJBɣh/9q qh?}l>&#+Pdk_R[=e_|#;H佯?|_ pՠ7Ic7frB9-#d@fWHMe:9 :ǭ^ϸх7R@~(F&Bd;J~dF&tҢy/*I TNca_;ϮA fY'chW 2ꂾfzRxll?^A<#ͣ>4=5t4H OHׯ_1s7J&Ghq-| Ӝ@p,xHp9/p{rxO}|Og@ӬuH?9?8ʗ>ֶЂϬa$I.D&n%0+G~PƄG(v'd32XA^kv}nr\+-*u@ȁ hf(au2j)CeVV9GGGvD2ъ#-WWǬ|>g8ړ:b\K=~L:iR6Ϙ 1 pL?]Aمݎ>*Lr)x_g]ķ1Rv>c7ξvTu]51?b$F#`׬{m{5aHg/m+ ,ISe#9.]wÌ'fx{oj2\@ZA܅Q¤?ٳՊ^@ED>OxX֭\rȴ!˂7wBG rro:b;_yޑ}y uT|gsbY0qkm>j x$i @stxYĘM'Ȼ6J9h[_cLݧgc2?Ox>R̢+-x9<+oJ)E0u}ZN C,Mgj!?[31bLE>`.g)F()'y &OMw@:eXء 7:)к=VH|`%QaX*f %Vk[owu78 X6DP(ֿُӌm\!)mݿ[}m>Rk^r;4E?pgk;$ -9%yqݫflO;,K,V~Jx}4}•Se9>dkyJ7?WaiZo%}5 LN=#|Mx2_[&b" wZ)5 LP?s8? b7S ׿m/ECcQ<ߛß@᯿oZcCyHY)u)c|ysEZ5em9Ĵf]?j\J/`-:0HY^ld9ҳ)^: @qrC B ~[ ˟1˽;A×m"m#\ p6χ aK<xJ~^EMyxHW.6@GY ^X!Rgs J2+zfZ(!!lG^e[j23}^!y_kəb)exӪY 5ǁ[VkDQQ_U/9$A?Q;wD;x dpчoTZbqI ;"WP@mSFe7dGbTyr% msg9}ŝN%N'ԢPAp@ d[$@k?hC}wZН܀\9E_>O!B;f=˸;Uz.~Ɋwf@ۭ{G6)[C~w,[QnrJ23P+ ?h=#.Hұ.zX))AZPQł?+BSB'<}- {}6 ҂*@i/QPߥ4^`p705*W&W&#Dr5A/r}JcG#VveZdC?gjZǜQܧ&T(.8<8E8Yu }̚|<ׄ~'l>VG J5M[0Scg= >Hg#V,l3 0WfSJ5Ŋ%G͕@7:?h8V%]u CF{puc9*N&Hs3m-&q}.& ZfY[?㤄.͘_2 V:\!VuU :LǗ/XĶ%L~0yVg7' ao1}; l+)3eW>{t#ܓq[ L qH%WG!K(ѵrPrtI>5 `AFנyu.h>D04"a*%f%އ53;+{&;hdNЎltxHzn }k=[Es+c#?muȦSqv5xDfnk.W  Fl :p6W(4W_<6ooo$-Kz8b䉀|BqGZvf]P4q _oq]{p(`A(i $"4G!jRXvP\v]A  i?0uΜ){ Put$tJ y컑YRoxcAu0QEUR*}cWzPf| Rm^_[!gmSS[|mv^`{]/OHUh!T]?D |8KʸY|߃x*@Wf= y=jA-TW۠/![RZG__^7?+?/x} Fe bkc\R=&>jЭ՘=;tF9 3,BAH0W4!&T̉ ;{?f+doф̈wNK5DV9(ѥzV!,u[*KH6Rx.e} ^ 뷃6Lu3OaT@ds/KU/T̹n}T6SZ6%8ў}Tu͑C@U' G+ -[JmG]dVdeP^_o%mC[\Rղl( DA"sM49# Hȍ_BEִVGn]*,RB{~δ ե}hRc bNRR?GHYQ-?2^* 9;ڼV}#]Kgb*UYzd#S8knt99M3d󰩶d\V|(:_jdMBC~ߴDI5bI)dtТlz}u<5gNZz1IŌZGo/5YZ#=S3FwtX QzTYrxI鎘ţ*@u핍Z*eK٭k2Ve <˲稏x)#B"+WW%GOMg hJ)7u:2>.:'Pʇ<9{rrWfG(f^^^qv:gTPuuU,h4`)3FNݵk5$;N[б/R ؂m-{ؽb>`Ågu۪?zP Uka4>w & -W5+kڛTvKF溒X2o~ڹ $֟IG }?; #gU̜ih F\?[o(@[54OWzך];SoxOG1xD@Y:H~'sud;9dzW;-t?0"ixNPrtutMzkp`pVBU>,GU"'u%rVз =He՜ihʗk %ºD8O~Su1#n pt؎>#ߕ _oϑ$3_t~\줻OZl{_Y +?TVjLdvk] @kY`vP"&0O-:6޹p`_Q-!$cGH܉\1?>xHx㖪$DH)9&8vG~r3+ SyF@W t\ F>ȴHCVՒ!'89%GmG O\\'܎ɽ ŕy+(sd1.ݿ !aH +/ȗ!?%ܼ: ylw޼D">Z}Ӡ5Ϛ{2?q== U^Vሗ :hQ'PRf' ޗ R" [-e}J- kX{BO;|oVdKe\H>R!**ҷ< iUތ@+ bx{9Xj͒8ac@JM=I uބ禮2*R =CǮL49|=ğ~wֲֿpޝ,ڷY k-B}L@9ڱt:-RȪ#ˑ=?:b=ֈG#1]a!샃K8G\F:L~Е̼ Gc#)JDctۄMZ\g kAr(i'I}u+ܤ,{XJ{b+Uѩtm˜$Y(X Ш?EǠpthłM3ؑ|ڱ@IP,5i)6jwgjBG#]j댼4[ĺ^"\4K7Af`gT3ARvW al#^yXtly>Wk}eb難v^K\ä4FcQzJhs?$1m@ 0kB>!" XIgDmB>C#u/^Mc67!3?z7Je%v@'CW[]\/X{OzXZ,cukcFG*/aE6"M{~dX#-;B,koґ%Si &t]ɑThUDR59!|(Xו L*)=k~]64zc)"R3LX=>2k$ht@'އn<}l=ݒ=geOi4uFd^-Ű6 m7ُg$g)^홹PɿhQ?sݧ?jgZ-:]e$k I ' 9'[^}\PKu4?m ޓ#wƚOBF:wIhyuOn䇌9xx#U%"yQ,ebDXo^pE<or\p$w}?҅rI (DrpC.r5q\m=}(+=+IM:bՀ>dmwaFW?^idK'0 {Y('vf aײK>ym@.lB` zHi^dYp.5u5 >1RZke=ш3Q3h4Z?Z-:&X:Hb,lCht۟:(sU.}ثD$Ǩ9a|y- Q#K忟׶+0ίʱ.FDwWgR],z]'uXSlWՏ/ =eyw{Y7xLZ▕pkNH1+q"<㧟~`bZ MQ_[rώz)0C<t~%!xq%Ӻ]B|x;jx%XIQSwF),ag%sѩ{:# 7Byc|+{c8/^G?x`,}-x#ڝ_~3QҾړPCB3@WYt@͹Zo6~#kyVZ\TB%IGZ_{=c,h7O u%i 1&q,}HBl 1b*:1\eW0wnV#Uc_Rܙ<.HX)Bwe=9қCQ"uVKFq۶mfA~h{k;g~ ]m}bdl c{%23_]b_p5kb~k+}Pwḋ!)}?;fF l35T|:3&tG2ӛ1-FEF)QN.Ȟ>1A#z.'Er,?s<3>ZuL!uگ~gN4^kd;{ql|ruιlȀݹNնqG/7Ul6 9N.t1~r#.v| G&MIcq/Uw٭h*AlkBb#<u[Z7}ܽ%gё: \![kܲ&g/$LNe}ӳ$s:AChҨL=b+-H7 0) '[XJK)e čk~I-#sQ~=W 9чV;K-~\τ-& ˱o4Le_u:ӭ XDO+lgx汸&"Ĵbn~315hG{2H>s9R8S~X G! vd kgk>*h a}O5Œ 1wm9[լ]R&G3@4ge̚8* M*ear4Ko!n{% Fhɺeߏ-Y~?^\Fٴc8" "ЌNzJzWXSCKsecV^xGY #]$:g+.vn#!QI~Tг\X8/]"[_ PZ3NP(=eԗYоPa#ʟnn-`Za?HN6K^|$9GJF&*ntG,J0vY A\tM"TSwa0`c7Z۷ J}WD_T8L722٥g=99zh u8|ƽlUDZ>%B9 N\Q{"dοp=LrmU l. A78A28 52:G]\^pQu:atkdCH| $80)tK=\CVGcto!ɰ?YOSZ, ܘ oyeYA8sQ @ƭ*iLne9Dx5+$@˅MG:HI:9 8#KſB1뽐W_Dξ50@x<~U![ȑPNHCwT g3+{RO1X~ Ӊ3Ht|IH@YAЉ驂>iQTלLe-3NR4ܷd7W4!PU瑐9U3 ,jr.nf s*BcV}YUΈ$t=*!QaeP! zf=*xH厪N ;#̜g4Qp4mK:m㐵RP"ܖj\(VUk9yyFȏ@G#t򳰌 btZ I@!hScqDHޔ׮* :d ꒂq׸$*.!8R$&fIBt ijřVzPϳ%†^yл6b† M ĄXH$D"֘72;P87p#f?kǸ .YY׻ /*j&|Q/+DZRPnpӍtbŒ)J <V2f\CP`H'LH^A%\6 U}[pHͷI\ؓfos/l3&?#N?|JFWI7ch~k"y+I bR?IC!TMv05$oٴe鈓<2'd(y.P&]S_:L|xF#g asp>m-W:3 t2&t\Z%` @c\d˅*Zc6ciw4TMv]WÚSةLÁWh܅,{UY]4AIOMaM0g#c+10+xfV*~(NyW( |,;NGv@C -Ix 5ps%Xz #_*Fh%IG$ q#Lhۯ?En p^?/&RBxĶmXsX(rӨrԋ*>}LavpA˳ 5ʆ:>+JcגݯWuOZN<6%i@hne#zCxZ&g_&?=t^>rDpvQ.ݒqve_͌rσtP#ž--@*j9A,^,ve_6[]ق( uFM$a_sAZשX}..g` Xxݫ2#(@Fdv?ZpڳQ~58[ﭳG :Ghrv( 99V#ψAƟ]IHY]{(uCƪv{^mֺ۶uL$`'LAR|t>ˇQa3<#^28Jd 8(aSD5gҰWdg FIgUGG< ^yk%=]㈌n|<iWIq0q3,Iwt¡YW, o?͘vۖ(z(#o{I='Җ: w|H5;+ {a= >5sb"@YDQr>쨫+?CoTb㯓pd&׉i[DأOA[#S wT[ca~DHʋ㏭k@h e3&<,L!LS$NN(`YiMiۭ{sޫk"X Xf,%Sb)w<{eYj_:CҋJgGFrBjVv j>VE̟Qz[SnR+r!lwt52[T:%\\g-bC4\Gmt rF#V Z{ 4_ ^=zm 8 ?hE׀m*suPhd7T\N\"%?3+ʉ >,F'V,P{^;rJ2`]GEQ1ūFS4ȁ}|5aǖ##s=}Q;)ei;%-bYb%z0M_|şPElZsCK$c '2ݵPځhJ?dMV&?Q^zdGzXªJ5jUjk\ޣ^Y_eGUU9?vr>[>G2$GAX΂sUHWQs TE9 5 s{/@[tC[z4aYzhVkCpA $Vܔk|x.!@C$# FP|wVcevwZkTi%|>lNgNbrji%"&~W-aL$ 0vׂŃu@ZK'Gs$*<{zXU33d3 QVgğQr6*WDb]?rGq,O5= BH)ERDձGVVru^Y/W$jRV` V `9 u]ߣT 6%tt}- :[ws3mNX4,nMډ\*U dzHbT%ԕ@W庿a~Vp4/?(I['~$&gb7zGs*,}xkYlbuop=4RKYM\2UA̾1'kdkj!;:6vFsV-+kV"g̫D&4[&Ϯ S1ZЬuk%(9ðXģjupecJ.u]=(,}j&x_ Moí p:ZgszgY;}cY.?~8k'OF-FEc 8*$ubp.:ϑZ+ @(9M'IENDB`bzflag-2.4.2+ds1/data/observer_icon.png000066400000000000000000000137111200563112200177200ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧TIDATx[wUU#4954ɩ(A%`FUܝYjrujGeu,Gaj1+"bhP EP-ݯûs{ʩ)Oqyo8|ws|ߧT=zߊ/9?H$zʳ M~҄ YfH;FޭSN=5w-u< |TVV:cƌyfΜ? oثkɛٳg3&M4w}~MMtR]]-G G,vA1c(aʔ)ϔT@EE{К>E܇zH0ygѨ,v7qnxo<V0OU_駟2E,w뭷 *//+.訏.D }ӧO%p?}ުU˃>H?8 Juj}MJ|A.q뮓~遛6mwZtر-B@/9>էy >yqkUl2]D7"'x]JK8xoK yAsS_e78a`({R\.R7krX5)rS6kl?p/KA?t0:]G~bg-k_D$Pa(!|PkZ3&,w,_8!\ITX|u{I걆~=( rN}G\~B߸gp F=ׄÄB3AsXO jꕅR RQVjML=9L#j:--)++Ag1ުhs* [R@x@<8>!+:|˜]^9Xs)ġހոQ#jѲ%S#EAҿ}E"X  !-H')*\N ǎoJ?X08p6g eff4Ηq B ,_RR2+PŽ;}Ajժ%[-B Xm<1! \{ƍuZ5n܈ S6mIƔ^x̞={+A~Zwé]1%Rd HA-[h͚5wx:ԣG99<83Q_A_)̄Q5:uz./ˏ5 SNԻwoڰa}wrz@q\^zZlY'` >@zW]5<ъ+1H48HEΝ;SNnY+isNQ2a(-WPЎG_|x*Ɖ{U}kGQ6j=K.1O>[ (tҐ>j(*%44n^n# ?3hGC8Xltq}qO1X69$8t԰x70KBիVW\qx4 1ذ_O9 Mc ]tµ`i> tl4Igdɗ 7 wZHAkD]M HC#89]{\qjƊj5;w|-ffOC7[};ޫ*Xڲ#DuD@W%WPƅ;ڃu,Y^.)Rs]5i`<8X. xK7xws008 M6{wKS>leUˀ}].BFk(SV^&DNEԚS륟tkn` &Md#X2he ǧr~HUM6>Yl ~>##0 Wwe3_s׮['차_?Ceg4!?$^^~C *]rF|d+~.RɷQ7 s`^O |.<ʠcR׆q%)VEʦW^Ɉo˓ aEҡ =qI bC4ԳgO./p>=ɓ'epAh 4h}}vaH|_O0Y n۶ &褫[ab1G"Ej/+C@xO q*Plp>" qufǺ4r-Z( @j>v" xtuRBx B 9#{POYn~a-ʼn{ `9oafNQɅx+}ψPXMP8ܚ4jlmX>B mfذaψuzx32'Dq{Wy5RMIn6mzQ O 0P nִx aQ,<6~8IeoڼIR#xРAYq@h@u<ɭO> RW h.0n'Kq:U"$)cr8 rdK/]*1F}K.]ve4ߧ #| tK:w]!8H׼矧W^yV͛73JYqS҉'Tʕ_/sf7ȕW\܋˗Dӧ[qs z7h=?tr-5x>2k,zjՓO+>J֮5S®]!L[?`%R|-h¸Ρ8XE n<A<@Y;wRr?JQ$qjFzf\ʔ 1gv#êXj֢0]ssdBVl939prʕX㒶PLd ;(4g޲"穧0/?W_ʏJx=79^!n0zGP'pLVK[V^EՍQ.)*7a¯;pHM`r^De%_y΂ rH|Ty =#k8=UdՒfꫠ:N1Ǝ-S/biDt5)SLW ÕPKfa %@Ĉ*q P8Wa:Y J ڐ1r3j֤)U:eAM5Ni1 c@of0u\=wb1ɢi99y*KֶNP*[aa, \2@,^StL0KP᳂WV 7anemtZ E|օ'A(l̋iPڹתe+3v4v\ ,B 7rۙ"¨o&jWNodkc<]See@p$J06P~Rw55Mv .+917)L{cfWRMOa47n,S\A}2מ=tR\4*&4(O 0iݼ9ٍ JlbEH8,5sQ+SJϬe/DŽա]|BxO`^X1KQfsO9K S9!\e3.LP^\FMV-KhPY0[|z_waocx$?qC{~\729^R,plF0fDϣTDgwkO2S . /Ul(D[1/'68tgNAbQL l Qַ7˜\wglw=(y W/hz+ xu]`!Y& `Muݐ[C[zo6s|VR"VnKUP&TrL(7X7u HiN,9ryI+UQ_#3Ȅ,c@Z^v7͆UxFvqD{ĵBG8= 3!B)ֵ8ĔTtk-ZgH!!7DY@5s ZW*D<C'|o$MVَGcw`ݷоɧ<*{Ui&ؕOؽ ]+(@N&^+ue;a%Dba!,[bD yG%4jSrz+%ٲۅn y!BUxfJ1Jn| 9T/#Šb (¸\s,eo%㛘\3)ڶuB sBV1{*p$B"6\ĜGl]1D(^\ iW')%kpcSG"ɯ9W' ~BqDWtuu)E:X [?)(ϰ>[kkBd H(Ąd-wr9Kd>J`w<@=yķEx2 (BY]k=kd(?^bwq2 )O\ަÚQ.c 馛QrhQjhU^ƍ{ӌf%xҺe$8Ҙ% 6=ZLρ: wO5%:I?2w0.\leJcſr֠YWp%fΔ͉C;\10H(Wφ柫-[ZLcǎ.]z]߾}&TV0K:3;͆ 1aE 0uk+ %:=i?9LA=ᥗ^.F9*5oV’7(_pTydrL|eIENDB`bzflag-2.4.2+ds1/data/phantom.wav000066400000000000000000004275041200563112200165510ustar00rootroot00000000000000RIFF\bO2j  38()$CfTC(#%9wOkM4Z+sDnYP~ ' JhWZ$uA^z]6  x LjS^(tHuU/$% >%7s%\F!:{$t)I aP4F{-z%>wMf"X/RI!&Veneb62uIyhaN,w*#!@h4j);65<"nAk'?@C4 g=LwzzjL+tLOb>}NR% 5 7""163''17:0 !KU-P{>* 5/"/b"qBe>;7D[D ",,TSt='#( '=;_;:GP:( &&39H$cSG("A%8tKmA'z# ?_^]<J.0uLxl^\8V5x6 +,Vp\k.*#7n9e+GsPkR/X>!u/bA!&-"/LL=$^zK z&&!3 8LPPB*'{1rxyy@Em9}9k=s5pRF<%pEi"K(d?u&)$7E* ! <[/LtQh!\0KO )O~* &I|/).#xWRrH`<>&y9.p8xy#U]!>0tOs93x*3A~L# %7wKh!M)c?s'-(*}(A|!"0j-k/$ 3"OgP)"/9p`sxiP(5@"CDWJ33;[?.-+hd|f, 0Bfsq~GjDn YY\p*&s/e2"! #(s,aA%->5 'x'CmMu:-{* -"./ <|<^Ho3/*1z{.)(0y03 .84365%|% l5Mlls_ ~azbq3 i4f2443f4iKTx%R S"t`X1FPH,IhlW3,ZtuZ*z8rKdCKzk=fUj)[pd= InuXu44FK >u] 3CrU#)-W-}k93)3whg ,42[l3+OY6?1ud< q_f6!6^V);`c!PgntMf _0O 3Z I ^j7eL @ ; ? :U"$ K>6`{Dpg I a ^! ,;mOrdTuIv\ro2 o8=~ !lSztK c#tHrH-!" 9/{m| +.(G9!)R#*' JOؙ'*+%m1k1 m'( n+:/Q+'.+[ <χr$25L-J]2 $(".Cڹ6 !).0(d׾ηAsC+;/)n`/֌R#FV؀ܓ o% 1r3+.· Q0~;$:, =! !-/'jUڡ܏Ih( I1XK^Jb[z!&)) (g: {@ (&- ) &}ފo y98f*_$h.'{ a_ ^h( dhxo Q721i*~ 5+ 9|l"&(G#[++n  (,*W!I3߬r x q &\q8$ #(&{tLhC*/,M#.f+?#, 'D)%Ni|VrCi6 u- xޞN #('d!j | &Us)!!_iS;vvyOFrOu F|P{s6 Z9rd#C XZD%>I6j&Q"gEP_/{./+L,`\A@]&ID\CwU?paQS| n5&TEA 3@YsQN4F~8 :j,tF3k07>3pGysl"t2HFrEd<(!6k/MAcW|Lq:y[#>^b|qj_F '/#c).Ze< Y#4 8k7 Dz 1 MBZsw]Ae4@ -+{(^0VtbyDQrhNސ z!osl l)#?]UB ) %S)&E P3)62 HA &# R[gR)#P!*߁ fs )c k)fdl?@ N f>v)%a9L#+IyVI|X  _ o5v~cMu$8y?n7 k  H " 4kEdZc #_eEgtdJ%mnVn4R7BYf25\a  k = 0kauE6F]g`6?sv6[  Cf %OpYZ9LR@z.&I[vg!x^ kRt\i z + 8*gdbn5wx& *!P!,! Zjc:  G <GrozP$ZM ޿p}b0-0_D H~~";~H{ : ' saOBax   3 a :(Rs6%t7H  S / S *~pYS kx0 O$U2D S#gu4[U)%sQ[7#9C6f/E)`8mbDW  J`/ ""R##""#%t%$#$#""O"(!^dv |#f Vs<z'!@:Uޞ܀kfےbןֵ* %ڸkcFas!~AQFE otDa1)._9<uX, "  (o=@cjqVD%7p g|(>UUDd(9 O^AfKqF4uf|'hA? s^/F5)x #pC'^{Ahngsc{U #yRc6,Z#Xk~wOFmep~@ FA98_4JvXb@  f { @  i 8:y~] a < XW U Q 2^8j0< y Y p l_6_j}]AuTt {['u]MJ6A9kG:>;dD/>> :_$,G=,/T & u ] $]S39g< R M(L m 2 -@Io A X6 k$E}OZ<*Sdww{jq>!o$L 4B= .  _  # S  $^|ZO c 5 [ h # R l  rx%gcSC7VWr"!!B&4^[@xUHqdNf;e'a88b D P Y @ 9 [ {qp\ba^ [ ( 8 O G [&D(/4MdE0#d^ yI޻ޠߠD&3"&e6lq3 ~N Z/ij2: s!2! ?! lrwqF p & "  3   | AN+\.):7"FDpsR4A^e6"Vus'Y` pe| n } 4+dw/o_goQ4N`  G Z 1 COi*#Q?^k|Xe!6rR3^&#if3zjE Ruzj:Te`SQ>!~c % Vqmz_|xOT6&J&r|.4 M WwB  VqcLLU6Ow_N\zh"> 0"OTD,PD)0/63F!=lp7V7pN^  )ztkmZ\Z'xqWJw=tPdZL >  rKG@!>_}xjh\~wF]uZ7Q]xj[N$6WjLjGLy>)R.Mw 8e gb}+ :"O6#!M" ##""T#E$$#i!E;8q{ H R x8ARy2"5_A8~FtRJ Y_50(KplS~@0PWh1y Qq&]M !/"" #k#$j$L$#"O"!!.! aon0E(" /t,RE-xlm8ވ@dA6` wgC R!nz6 %|_L#9o@ u!QOY$ C!U! UEM_B[<# + w1@y[B?8 k{D`Rra2831<"xSKK+ @ @sY~ y 5 1 ) I{w#+yOSR b}apfG g5kVh_Z}7kw|Bpv5{J-6k(eD,Ep3hmDVvcl3dmt#17 ' p @1=D[t|sVC]  Y Md]Y;H +xanl'dnK:3-$nQ^@G^ K  V l  jjir = |  +  [ w  W W\N*PN A@PD&ZSQ\%S+&{^kg@{.ht!n' V-vGC 8< [  >  ( b:aH  0 54`72J=K*(/#y$2sLw bRhy~ICUAK'8:Uj$|tz|mSU ) s jMKH:1j]Ipbej\_yTwd6}2^&Uxw8R:==V]7 S V:;S_uK~lj2%wnh40 o j 7 5 +  'BOJp'nzmD2B8ܓ۪F޾90uYV=sx1vZ xwHgaXݎ-۲^l{ܯ܏hyj>?[bs0N+Z)^SC. 7 kCn_PlQJS!"$'%&&N'')&$# #1" Ntr7 2  rP3TP?37V3<- 71~QIti / a _ x^jO&BdywX1DgZgo_#d2^3rxmwnj[{< r+ U k38YJ I!,""S"!W {$XMw'F \/]{Xvl s EPO|r  q ; U  A < 04`wTr_IkCW"2b ސn؝5R׋ַHٚٯ؃Yמأ\Sݿwj;Tm "M""J][p !!.! ,!""2#2##""#=##A" 9QP5kb t'O`@ulw1Iiڱ  E$ֻN(ժAӰ֭HۣHEiSOp2 RON R##%8&&'U'7'&%V%(%$#""M#7$~$$##p${$i#}!Hh#7/I\z3!@   + 5=b,Z~R; g[5"V.@25v L^OXۉ{~ٻړ-C6qXY2E!o5& L3eaHw~!"$m&''&&#'='& &%'$"!rhPaz|tBv x-T A g W ,1BRN,;#-muK^}'_ [٬Iv3!ܸڡQٲ;bz nIF]/ ZEQ"!">$[%~%$#=##$a%$#@#"""a!  cV: A @ d # I  ]&^ iaN73+=8iC tx/XFKز֦;ӽ,8չ-=؇bݚTUsr8,PJgt n SJ#.'*-,/"00D1$1D0.--,-,,,J-d-, +i)(((['$ m\3 j  kUK" g@D,hjVoGvLFdKM:BlLk#y&޺ޘ&Y Xt+{|Fޓ߮`Umct+݉ۤZخ׳׏Mܤ߻Yj8B[q7cZ!$u')o*k*))7)o('p%#"!![!#%(*1++*Z* )&#o;B } ( H #  7R ^ 8.31z0_I1{ij#yuz !<ԤGr҆hטټQVA @D^BB!U0U7 Mc#'c*-..o-h+)&#i!t4H/!"($P%7&&a&N%t# &V H+Po vtD)$) B  y*\7FJn"`QtffQBٿ3֢ .s&D/_FT| zb^cH Txnm#&l) +#,,g--+(%# frSc v! !ZE {]Z-E2 Y \Lw/4_)RzXvX!@;ްO٫ؿ(ٚ_xmjRw>A0,BpcRv  umJR}M`^J4tvH5IdYbd=2Gg2hmkg/GrFDFx\p1hUye/|]~ TNznX@mcdo&|n{4/r>Yk O F}&CQaV #  P0)I98'_q,ymGu5bRvmx"T)wm :/#' **) )[(9'X%# G+%grBF`~ jJ k2E N-MjD:i[Angv_ry^C= =`SAYu#, f1h)N0s_+ r  !h#8%~&&% $"'!jqfU~bn}# Ndg^J_'sJ]GTa{G {V u@Z (TBb]M@[omb?  \e;1x!{}O!"!$S%7&&H&%J$y"n` n ! n S.E [ q ! 94PquM01pEycw1U%fO: wTeb}sX.W(sz{+gdFk~ (}Y  Ria!s!!f-OMDMIOP"v !Fd2{ `1^p;j~WSFcTM)ަ'ٜt1RNBW{n5h:Tryk.ko,5<j :xNZIJe!##%'*--/.,*3)&(&j$D!s$ j !)#a$$|#!; mC g.b50< pahւնG΢̄N}Ő6ޫ^ O4i%Y7sagW  , *2 }umL, "#4#""#%&&')=**+ +++U*(&7%#"!I! V wnOD .2c?jpTSѵh*v%Q;ƌH4f "ȍHrʭ{NQzW0ww`H*]+7 dOB } 3U $/' *,+/122V20/0//0L1/100124!7>9:v;E;T:8W6O3/,)E'[$ 8AH G$-j3YرԸ1͜\ē#׹C$q&ѳLC&y/g4 F 7rcT@>xSY|iCN!p#$%c%%&)'L''&&'' )*,.V1a345L556z77k530.0-B+(&$z#9"r   e^UF:JrA}Ӛ ɽGY߶&ձ99Eze%''0ӤyxiaW_P-hz gg/gQWQT=^o!"R# #" #$$$i#!  "$R' *,'/0\2.3G321Z1*10V/.-*('$" ! !S! + { I>]bq9&Mo^ TVvL!"T$%"%$$<% && 'G''()+*,,B--,,-5//.,+*V*)))f*+s+M+*)) ( '&$6#i!;P Kvtr9˼4ҽ u4{} u2 x ϳ3KOV'm:o 5 ["D{YK!%()U)((()) ))($('& %#"_"K#%(c+Q-k..X.-5+)&$####C" 2F?nut?a k ueu]!Yp y+މ+".׽GĖzȇɉhMƒÌ*9I<ǖHθзӭeM4-Q)=m= uY >~Y{T#&G()+M,)--.y.d.X-R+(&%$%&(2+(-l..e.!-4+(&%##," |)$HJoFx  71hE %;a}?LČcPΟolɞƤM˅͉j҈x@g*Cq0qmr$)l$gl3 I ,o ' z u!$.'9)+,4.1/~/.G- +( 'Z&&(A+.2k6Z9::E9!741,(_%#u"/ jHOTRT qmAVdOTj n%ϖxĈW< ƮzͧφЉJ ɗǒ}dHطs*K~Th   W G B<p#' *,c/C110.3-,,-,D-a/26X9Z;0=>?>>(=|:62 /+(%# gomo}( EX#R-f) L|w9ͼǼo]AȻ7ief4#Ҫj&͋uyV_Z_"m  ^ ni1X9? 9E  vD&! ]P!"#$ &h'W(e(''(e((e'N'(K,0{5i9;z74K1-(%" > _Rwy` ~n2ވQVC6X˻Rֹ&η"]4 4130ܚvj56,  {u} ;@ W!X!K $\  . 1 \ $'q)J*Y*)T(o&$V##";"  "]&D*-Y02-4-55530,)&^$!`}x| -ߑ|}F V\b? *!,-< h H 1mX5 M l+C Q"#$A&J''r'^&$k#"" #"".#$$|$#E!=k! 3 Z9eJ0sK`OP̩6m%?B8Ƨ\4}Gy\N `, WbsPZ E I^pe ; \Vbs !\ 5"#$&K()()))(.('e&'(*R,,--.z/-/-*',%" {EeGA AQ#cKp3ܕnӋ~tʱ˰ Щ#рX!Ɏ;8ڊh@7ka$qDm0 V 4 c]zakfb fK 4nkp!5%8(*_,}-#.m.U.-+($H!v !X#%({*=+N+*+*('%,$Q"ACq3  G':ַܿ&͆ zſ?aʤ%5>`vɼ?|؛߿kbF`CA-0d ]% $.r  %&&1%"I O fGw"(e.3P7:$= =-:5.(#% U%P*.122M1.*#w Lg&  W ;o\Ibмt / 5Ž׺Ī]ұi4KN39c=N C , N % p !a%&&Y%# q^ !f#$~&(+/P2454_2.o+($!=Y+ !W"9" "!;!  ' ,k} } s8Pp.m(զ- ΢X{ʁsnգ]~ǻʽľʳ(pW6LsEw 06e+u {Kn "q#u" 4z!#[$%'*).*258R8z6k30,)&#! Rb X;t4 n.MlVϟ̊<$̶>uӅWW Yc ΃oغܱߍ,L`'hfqJp EM #q+!#%3&&'c)***z,/23E3U2 21P0-+***>*)X)'7%"7  $>S>;+ו#҃A7kfIˑȪoGaJg^H SLBqGp8  AH'~ K@e 7fUu!"%&A())*, /2 5h78]9R988876\655^5x4m2[/+(&$M#q!:fUD Jz ="~r)}Y҈̨l˛̌Zmsqf'I2M9U4K{H#FB 3Pzm -AvT,lkLy%|*.1/4N79:A:8 62k/,F+Q*)*,/26U9"<<:62K.B*$0b  !  s4݋s̨s(wu{ ˖!|X ϗƘjشvT͎֊C .~5,X( f{(#!si sR""9&*06v;?BBtA>;8520-&,*)(((((V)o**(% E ~ "#a4uizRJ˃οiLsĊȔ|ʑɃɛ͖k H2o"xPO_(1 RQ? < 1zu, ~ Fgh$! $&(*.-/F1 222@23210$0=0S0P/-A*'%!ZD p  {HOeU~ޏ؛gЊ%-ɅȡƩX5ƒ~8hqd'i)E 85G"3 Ew| $C[v y 5 J$ #'',V036 8T87641/l-p-.'014f6775a3o0-)%Y! T91 3۝҇[ÝkSҵεrk̻:ƿ̊½ ȼo24{.Pew ^Z 9q  /kQz=j E  f 5C D0@"$&Q)',.d051f10w/,)-'x%$L%')3-/0R0/w.b,')s%("[FG|FcCag j>r<붝%˲X e˰= kL D .  Zf #;g\sXy g $ /cv^  < L G  o $l(H+P-._/[/n.,*D)O)*--/ 12j4H542/r-7+(,%7!4 v`p@>ըǯrd-ƒ'S"   / s M7IWjD ._` % ^4BIz!]K$+059D;9^6q2.+j(3&%X&'(P*+-m-/-,,*q'"wz qIqk4QRR!}"7 yש Paϭ(Z:*c ºsÿ~gK k."&N'%5"|u$  =(5!"X#]#[#" e e{$S;w , QUu3   X 6 c%)+0584:V97O410.+)z(()&*Q*=*)6)'m%"3ZJIy:%">ioEͬ..PK#㩓av~Ĭʲ޵¹ͽBྴOe͟U#.sa|Z|!;$&(()'$ % M{  ? jA n]! R ~ '-k15788 7421/,*))))*,o/82t45530q+N%|pZ}+Dww8ݰ>%ܲ˩YwX ˴׳H<յǵ|\ФK!nx-  %FZN p#b&()(&+#E Jj5 Z>K7\>  [ I l #(,J/00;/y-+* )F'%$$$%' )+?,,-9/00,.$)"} ~T@[ [ |skӄ лy*T2C幔~: B߹ZƯTVߦB=6xFj@ W@D!!#$2&''l'&w%#`_A/##O;T5i $u( +,-},*6(V%" Nc "6%)(*3-./0T110-`)w$Gti (jE95j/B:̪xQ’˻@4GKU,ѭկxș8ӥڂ')L 6_ Zb9S!}#$$n%&(U*+3+++* *])(((O) **G++)&'|#7"U4Fz449io"\(LHpn `$Y')E,--D,?)%" )!" 6Ao݇5Dϐ4!UѕЃP,! jf66w6i530K,o'"6$'{: Sp6Q  { k eW%y?@YC%f&^I! G t%s ٔҠ$6'   0 5 ^w 0joA1 I t 1 i\*' iol! $$#2!V$ U[b[0X0ẺĆѹʹ繈ƻO Ūm͍͔̂ʯP ( = u$#%&%l# 5   G . ? Ur  ^>"%t''&%#!v "%),.// .p*%  + .k w&3fRÃշp^̷oêlcɼ-q3ͣl@{H  WZ _ NnSlz #&]B P E'C { T A!B! K"%(-/0q0E/-,@,U-/2443G19.{*+&!v9o" 0U'xU%PXy[ϴ2L´INJ!Z{$ܒJ;MG!2;fx ] h7-%Odz 4 '.'$)+5-T-,++,m.0w12466E7d8:q>BEIE.DBCA!>81*$af 0 6  \ ?7T1,(8%r##$&(+-$.+|&P9Ғ!(P'&=Xʉu2*0տg֐RWz( 6PC^AQRD2ܖܚQ.swE?H _s^O#x(,.//@013579H<>@JC;GHL"QTCVV{VTP(LGD?:250+-+(*A**T*h( % E fU?vʂ'ſʽ4ݴ .$Qy΍(vEiu{2KGrw1+ {>;~ Tjݵ۔"ݼff` e]!$'W+.2y6[;AIQ+VXY]ZAZXUQNKtI1FiB ?<(<<4>??>:5!0(AbvP)2͇ ?ʔȰŧ%ꪩZ!s  pi GsC>/*%{=@dn o?nu"*2a4=42000/t. .?/01126884^0X,w'| AU0%5A@Ā%յX|Nx~7DGYGDS>7.&  6 '/+$,)%2; _<9;|Nd.?+QtjH.ڧAUsl0`ӡ~LqFN1Yf۪jg : (76 - [ a(06;?z@?=9L6 30F-i++%/4\:T?BDDC?Y<|83-%ai` j3ԗʴO̫|2yȊuغYYۧ/w_M71k Bvp?ߦu޳CZkRZidL|F5 g$&,`13Y431/-+*)r))C,k1Q8\?EYLSX.\ \aXfQnG{;P/$(#!'+--*#n SߓTNM5ЏUK؏ҍ!)Lq*عerޘickZbe9~) aJnxޫg,?*J$2E p 9 #,'*,,+)W)P*;,y/4;BKIP^W[-\XSzNwHPA93=/=,)O()+./f/-&+&x! akE ,pG pBµM@MjRڀt|UB=ܹ6 ݪ>{ y Av٫ڻ޽W-8_pey!&())9(&#"!"o%)/5 &\b %-5;>F,MQ/RLQN'JD5?';741P1d4U9r=?AkBB@<61N+!5 .f:wߪݡIڦ[ͤƦ ifwS,b݇|:"cW  4 Poa> o,szB$Y]2< 1;"FNr 7%9,r16: >y?z?a?:?=:*6U445533=5 7788o96l0(" =@ ! 0Zt޶У:R'฻XKKː Iؿܨ; P= !)h`rNvUcژ44c:^= J|$)P.14R66=78>;v=^>>?zB`EF+FDsB%?9K3|, &n_    8#t΢ćˮ#4sѧ.j0рʻΉݰ~ [a v RiBsw\20~ L s 8 L o܋JN֒ ݝ}?!M-3J!f%(*3,,-y/1c469b=AFIL%OoP'PN\LHtCw}yto˔7ʆʾ9V{#P&r()w*a*(p%5!;O$G N[iHCزH H5 4 nZ>!C'-2A8)=AEJ6N RUXZZ"Y_VRNIB=,;::8n51-'7Zf ?ˉ㼠qHڭ7@Srż;]5T& y(cVv"$P$" c9 nMOEJaL(MBO0SWXXZWWYX+V|RNcKCHE_DB?~:4G/O(* = M 8]IµܳimB %$Ȥ__M^)4tުeCw] $p0u) 1 @0{?ixR9'wNIEBA@~?> >=;82,%.  zyxtpBkѿ,\ ԩީ1?c#s?#Lv̪Ί־؈~S)^?&:b&JD80vw7g \/. p$R(j+-./.Z/61486=+BGMRUWY\B^']lYIURR QrNJGECAV@c?>qACFI"MORUUNTQtO?OO0POOPaP NJHlF,DV@(<98751D-4'<s!|r]ճ tgOݳ#J3 r,]"7ͼΩδг:@ ߧ!f*})zlUc 1<3  y v#',d2&9J?CEGIO N ,b$*046789;>@-A@?>>,@AC`FJrQX^aRay]V#M|A4Q) lVXJ uذ%ΐ"2ڑڅ؞CVɃőͽ¹˵DGƼ̯Zіu˹z'~3nqf V& KiQuVTf!&x+>/~12k33~335%799[::);:9b9: =? CGM SThR7LC8-1$ G jI`h Q_e@P9U%+6ϑO=ʲǿwvĻdĽm$T|'ʮI΀Ћy4V۪%V 4Ln eV!#&|*1.E1469::87>776[6n79>}>= <98I:=@@|=7d/$,M u) muGG<w7^=m7:W[gK#ārXi&MˆŬǍ~ț1usXQ!  ( rg %*0)7AJFInKIE?5(Z )"gB.!w-YC׳\,JyS{q0 k۵ׇRϟΆ ѿѸЭAIɧ_;8ɸ͑5ڄ%s g `7%,44%#a QO!W%+43@IOQQhNFL:+?O Qb yys QJ(Sڙ-2?ZJeI]>D#+"$#"Lhٰxݮ#m3 PQhKOQY a lW #&g&%%$$""#&Z(&'#%%)&/u35'762*L! `b Xr|Ir9[o֍7@.GhV)5!g*gr@6)0 [${zj4 #vNdQ}$)* +`+*k'"}Ed ! t/;!8hF80ւ7c܀ވ,[s SV\I9l eJ(P*3{\]7bPE#,l V^ .#M%w&z&%7$" u ![""a#$&{'&3$! nzZ Yi}@j܅لRi͚2ȹɾfϟΰF}apH;%^ G 3 5 YTam aJ p =J2qz^0Q?C S@4^ U%(\*+./01d343.'!!!g!K,`PP,@ԝFƃXȻ׹ZӵӵƷbj^m[nSR!H +XLjZn- ]\/|Mg#M"[ucG;s3dG~CX 8 ="$'8,/b10j01h46B89W;{;9?52q0X/-,+H*l&nX 7v1E0;ǷѲq6ް8U)yHʼn̨U?ٵw GQhhBL_y@X} nI}~*3DK{dqjp` SQrf `#A'*+,[/1q20./24F55776]421.i)";0.Xq;[Ψ˴  S>Ҥ5K|8j_  O X0j~ * 4gXhkSD+ 9M_u[Be]b8 1Ll$"'z+- /I146s6.6365`41K/.00#0/f/.S+%y P4n"{7t1Δ ĥ׻ٻػȷ$«Wc<ց/ۥܸ9;tZG ,   b j n7 a @r_w#q`.^e"~4K5" #&%J%$w%&p(*)),"158o99;<<:8C8751,8( % T*T b^z\L#tnw|(îb׿f UCqüĖ!{O821W r" 2hxcfC - hOD !!#&(*,N03639;/>!?g>R=<;^82-*)<(&0&y'+(%F Y3uZUR*ң!Jn1ą%!®ٹ2.ͱMŃ՛݊l2|"F, B4jN>^   ]  j%liDN3{X$  t$ (F,0489U:n9766666/7777y7.752 -t(%C%d%$)"G u@ *p)ūv浬~ eJvn]'uڇޏ$$@s"jp ! :^ 5v'z = ` * 2 @!iIU21Um ; h9Vs")/021/--H-J.0j28455.79;z:8852/+(7'%&"Ou+5 ofF>8<`ƀͼgç/ çc8ﻖ`d31L@Vhh  % ]"$$"} u@j,7GL^CJ }!"9#$&')+z.V0V1t248&=;72,& #u!$ 0$+!?-tʽvoܴb߬]֤ܧʬpKehMR/pEE&%   Q##i+zjp ;h8l'JH.l<^ U"(/\48L<=2=;;;+=N=D< ;:m:s:;j<=# D'x/5c:~=?@AAApBBB@>?=;84F20-+{+h-/T/*"lS #L}ֵr ̾$ĶN>[w5ðַLBݕO NPC#%~&&')+t,*u& (% R `CTDwy 66s{s Ye d#(r,023$3j2*210/m/713 66y6K5R3>101343-x#q (ݩ0tи"_카k5̴bRĤJS6/ a?C6^!$$$.#R \y8 I S!^Wy! j=-TE~Rdj<L!q"$'@+-V/00/,*(('w&x%t&c),=//^,$ Leڪ!Գѥͩǰվ&R_uz:N qXKC x"" rNB > r-kb"i'' n}$(O+!,#+(-&$$$$G%'+/03+7:<9K4-j'T 1 bm%E.beֿ>_̳ż:  4%?˃|N5aI6> 9|)Cf {@nr Q$V{[ j #'o*+%-.//-,"--v,'*h)$,T1J6n9::&6.$ Ϗcxȿ\Z47BaFOȴ͐ΖzϤܾߵa_gt{ PV k | 9 d!$S&&'=)*!+** ,-I/0012467775311/].^-,w-..!.--N/1'1/.-+@%  Jj I oڥ }dUXpͳn8͟:1ð^(پcކkw]޹c1ZM_8h@=q  "k'(,/[38M?lEI|JRKRLLKJKM:P]QQ.STTJRNL(JGDCD#HJIE>5*#7 [}Ry[T̏W] Gѳ&"6T4ayƷU42ݎaԐғH6ѢtؗܣlSwE`N OI!9',.B0137;yBI%OQRbRBRQO)NMPNO3QT[biXk=jcgb[PD91) + t `"݄%D½ ]ʳTΨ\ԟ%ә!85%ƅŸƞ Ɏ-2Ӣ~ٲw!||̜ʫHɀt7Cնhau؟֣գW֙׏i)\r^C } 7 l1 $(,D03879;h>ADtFFWFFESEF%KQXR]^]YRPI@83.?+)!*4*(+% !] =%QlH٧,ЦɇDcƩDpg4eѧi ΟɆ~,c/]΂Tѡr$GѶqҁԂV#{ K`k  $q*405K9=?@/><AD#HjLPRRQxOJB80{,8* (%%%N&$" :TM _.s^n=׉zԵ ҅=wx_ϑ˄Wռ7zfŊ:8 '̥·:S J$*| %U!1h40 ' /5:>PBD#D,DHE]FEDbCDYFEDBA;?80*E'P$ i)9 xD2 l "wU jA߼AuP,˹v7DϷKXXQv|Fr܏[c2 O#& *.4:>@BEFVECBA$@U>?FOSĸƄԹt!m]&1;CFHI2JlIH*GmGHJ9OUM]ab]VMAo4);"? !LI!3*KlY+W5[eGh$ #v2z   wZ fq`5Cb|R٩؇.˕ǐļ˾۸'q4^Ƙ̼њaӨߔGxY; %",z38:o=BGGC?R@.DHLzR.WV(PGAv;1#}g zTSjOeܕ'Љ ǖJo?KQJFA  Rye uIfa7\Nr9ݠݕ݉܍l,0RH z E"%e(B))o+L.o0\12 7<<2?&>N:y5/L'ZV ot{{5uS'\HϝC* P*uHY ?4m s`1KEL=|@^y%dt{pY9 3j L,W Tq߱Zc[<.Թ]q:%ͳҵ(\.j7UY x kDG V` ) S  o 1 N?|"!! U@yjG !!J A2i~e3.բҎOifnΰ]UƩǽ+Ơb@WLW[H(Yy [! r 2c\  l G  3 $r)2-.=.,*o(i&&e(,13416@76M406.r-L- ,)%|" g.8N W1\ChƼ@|[39<;`<=== ?}ACC B@?<71d.m,(p"&G.#VûNjЩP:/H#1hdƘbw ~9$fL `!!r2*~ n' u J */o!"$'*@._1468S;<<);8655z5w420,($!lpDU vJP=ȕ{à޻nҭXK6/נ'u9CԇCMWMP,8o\ 1# f#-$$$%$^"e_!e#~$%%#~#^LuK= q   2 ZlB AS!w$|'))[)(E('%%'*,---*" @'=H%[thǧLjMwav~Oѵm̷[TxPwC%{ ! \"P#q#"!"=$ )+:-..,($" Sc "bO "ph$&+C# 32 "Q#Y"!N" #f",!!$'z'$ "`v  g am.+O̔μɬ\ķȺ}{|kژM<= x j![#7$$$%`')x,./.y+'$!UmmY y 5Y UV=n 6= z 0 "' *))$+-/12{2/'A< E\f$Tڛ(ͷx˶p'߽ÿ΄ Y2׆5?mH eQs #'*.0Q/+%d&8E jr#D&*f)<V S9{h"&)*v++>*]% t"w.!V,_0jŜƔI(]GΞaݧ([ !_)f]'(i8 dG*]K[V} y ?JP!\""$&>'9'-'X(*,R-+($|c+ "5o21sW3KF½xKg;H=jeR`7ځb~OZ[ / dTI  m v 8 `4QJZ)H KZ0 !"Q#:##"""#&(A+R-C/00}/k/1462+#h q]P+T)ώͱ 5VBÑMBnzÑVƫ0̿Ѐل;=HR)^6p  a @ kxS u : J < X u  M!t$&(<+-023S3{13/Z->,+y+H+*)U'=#tl ng1B/ܐ9њvϚˆ"Y7)aKM ʫʍ,LԿR:hDmpbkUVH   `  x A c})J!#$%-)-T///00.- ---,+*5*)A))*l+*(}&3# 7"y(l3\հ_ɓsÓ$MFQʊϓϾ>Ӽկp izy+|yheU[;5 e1 dI %7+069w9~88;862.+t-16:<.>>;74g333332Q/(  );q1۝.̑Ǵ'i׹ӽ…Ɣ'cǸŢ\kJaGswsCnXMG|-d   k3# '!%W*/z4786(52/ -J,.25l7|89;:R:8:&:86d6489%70("hX cө"Λ̵͂ɕ޽\N)Mqġ ם+NܒGےv^0X 9f7BzKu  t*D\#'(:,0356+41-+)(D()o+.01p0m.@,M*)()1****+.00-f)#{  CzWXڮ8ˆ_!Ø2ȓiлӥ[XGr[ѨR5ټV`ޘo}ٵڹ^7\4XX tu h '#f&),/3q8=BEDB?<9:9:<$>=<;G:584/*/('l'[&%-%c'){*c(1$H\# =%"19@oiCvQbϯҖ^ץܼؗq*ۃ/<bל9L48ߺދځֈӅWQк\Sـ5ڿٚZK^|b{8 Bh# &'3''w)-2b7H< @B[EHLPQR+SSP:KD;7D2+ 5?O bף׆ t--ӑuT;h%]HBe0q=n9Rݠ?Z`OڤA%پ}=(+9 4#X)-t0 2b359=+CHMPBQLOK`GCAABgCCCFIaID=5+|-BNG Rd^IdI{ڭ۩ժkCݡC2Sw(?hG]\یZZث٣د#ّWӴdղֱڜF  >'.) $(,/1D359>AXBBEUIHLKIH IICH&IMSQUQIBr9j+v ia5Hߠ^ծwњԼae16s&c6<]ݠi ׬Հՙ:ե?ԝҳR=:ǝӰߥkL+:JT %m #$%'*/49P=?=@@$@@ACF%ItIHI^N TTNaB6j,e" _@Jތ*8gؗցjvbY WDgW H}N8.p ٴv@ (Щj܊j1Mmw<bDK =$). 0#125W89m87889;>CIJPuUrVRJ=?-5E>  42ޜߜCa}3  H1~ci>[oܪ 2۟دӷ˼ H~rߢp/][Da-mL D'!P%c)>.m1J1b0g269975!7:t<;=DKKC:!2*.6J = Hy#W ?  "Y1:8"vnJ16cQy]̕ќfy~bٰs@5 E R%+04471,*t,(0 47;h=$;3)TA $ :E f X i G. 1irKJ C hW 2L=F>SvJm} 0 &+ :/ Ka3ubJK:9{H\dޤ)~V:NR4l? icp?]~VFWliCMH% Hevw\  C =^ s q \w+N &Bֆؿ"/@N; -w!i$ &%4$@"u Q "" ^ T '-z sj޼p4@1Ֆw~9Sjkj|(N$@8 g5vb J8"\# V m SZjj:%ߪ3ܱݕVU{ ru#}*/;21.;+2(&$$!$$/%%'%#P ^ !w݁ڀbP8I~ɥ־pſȥΕOմՀزnX|Uh d,k^B~j~ S0_-. [i!!BI%*l/X243a2.1000/-Z*$2~5g 5/>f+Ԛ*PӾe?=ʳI=ªбm#{vC1v e DV3 =wuv$?M&+-,)%_!!%*/]48+;/:6U3111U35745-#jD23/mMd ` ʍwkď!B\7sbZj};ɘhKER   F~~ c  O{4F1VC> =]-24%#+/1208.*' ')H/:59<<:6a1..03Y5763e.(["fn] G ~y`Uӥ#ݶݵsƷm7(&::ײݖ`4rq k N0Rv? 7 & T3M7i U"j##$%&(*:-./../1334u677Y65V78u8533290+%!%* Cr o@[7yܨ%Ԙʷ{Fʼ.J/=rGMڽuÓ)-ض>ݞB}N; fSNR$|k 9 2e j !!\ N "%<*,g,#*,)*U-../26o99%9752I.++I,-./d.0*)$u pi/ IQgq31޻ZaS?4Ͷp޿ֻ봌5!vΌgl̀4yԂآۗޒ6Iq/ Y c L t J )hgU u%=*-/e0/-*R(P''A))(&%&(+./L12345_53s.(u#jr/1^!" Yl 4#gm~͑xPɫũӳ?Mʶ|r«Ò5M5C`= i H+O9!A%()N***B)~'0%.#T""6$%.'v(r)))*g*\*)|( ('&#O G N5'r(@275#S&A'P'(( '!{( &/ڬ);3ŗ a,G !H+»I 5MSS ھ޻"[u 8 ' ".&v)+U-.K..,*&#T"W"#X%U' )!**n*)r(%W"#|)6 < \$"&)V)@(('2%B 4Ef?WZA+ӵFPCÆo~F_¸ hͺE.> *(K sɟϺҠތj`T9C? jz9s!!0!/ Kq$\')d*%)%! GIu` S"$%',021M/','!\ as DD Ӟ^Hʝ+ˢB;ۺHYRD˛`Y|֣.ܑ#ރiiU2\nm RIO-*8e![=mxEP"D$i$"%!&)R-16;>B=":50+$ NK[j WuZҠ*گCߍܙ+J0 U<`,66$8D<޼IJr."- Ha7 %[)*d+I,-.V.-+.036?:= @?<84H10-(%]#" WKm$aq2(ejP6%3߹ߏ߻޲^ؔgUF8\՜ّCԝdDoH.Yٳxxty*!\g b , 8JgQ"|%E''&'&y&'),/P2,4c69o>CE%EAy;a63=1~0G0/$.)o#' ^N[yl3:(Dncq4BJH5rVހgBMyډfՀ̅.ҹҬѹ"Η1e.k1ڱG ܮJ9v< /ir-Ywi%*/159;;:73115=FJcI%D9=95G,z$ c"%(.*+{-L,&]u}TT# reVg\$އܼ݇s"?ոsru0Ĭ¡ڹpEPݵښ5,/ 9_2#Q''%0#"v%*>0W47V<8BGKLMLEF:.I&##T#! J9Jr  oW0f-  c  IGvD ۈ!֘ԓэ7ɩӻ~ٸSy߲zŻM{8l,3 l")/|34\5D673:d<=>S@D.L`TY'Z:UK=- CVudk+ MoQ0L 1 l 7 &l<> >c)q۪lCͷȽþSظ[׸ҶSi`|O 6$+16875869>JC H@NTXKYVoR7J<,@ JA }yg0zv5f+~  X Y +  8 n  a`3mǺ°)q񺽻%jeֆڦX$c D!*L3{9;[;:;(=`?JCIQWXV k") /1Q223>7<BHOS_S>O"IoB;2*4$b2g Mj ;ޖ;h\ ΈpS_'zz gE@{|@-Zx?/ky;IA*Tq9a~ Q^j#*/245435;C#K}QU1VpPE8#.%T 8 ݑӇќ4n-̞ʳ8ٺۇ$>ha?)N2n"0tVtI 3b%}u#׬S~ٽ;^D< & Q K3#v(,05:=>>k@CHMRTWE[^]pXPG8>2c%fUn lPO1ӊs0ȀӶ׈Rؤ=^hqdO``[/)t@fۘNԲBϯM$׀ڻ5j2=dF 0$,'3 8=BG"KLIMO!RUYi]bgif`8ZS M5F"@;A8K4.(z Q \A<߽zיyԛ ϭqlDȡ ̔}RBDShow9!^x^ZP=;ԏ,ʭdžȽK͞ϝ~׋G+"" $-3R:Q@EI8MP(TXh^6fnuJxwsjohv_U$O"LJI^GD@Q:1&P M0e\ޭן}pɷʺ̏ i&ҊvM u'iqiDAKr{x_߷p]Ԁӊjһ9߮Z%. %(+.039CMW@aim}njea^]\ \[-\J[WkQH>5+#  p,VRMٯքtvoOEЌjԲNԿӠֹف8+gcߗ] PCzܚ0V ]4l"@ݿ߽)${5(F1  .$)/i6u?VIQUURFOLL0OS$Y\F^^i^\XR_KC;3.?+e*(#Y}hD9]](OrB?̨4̢nͥmm̽P΃tτDӃIE8-mZa6Nj b9)G M =T|I"(.07>DG}F_@83y3*69L= @CA@<8M52Z0-8+**[*)0'Q"Ma  |\Ipւ@ٳZ 7Ч϶͚ʲ ¾X/ɻdVCȉ DЀф1sݑKX~ccC C]#(+,+,v04J8:/=%?@#CFKLJEA@9v2{+'(*U+z)'&C% T lR$'7\ ],o vcsfS*F޽UΩȞ|cHƺ ư{l9eGѵ%ռوܼ^ ` 6#K*069S;='BpHM{O2NK^JKPYdk3kSdXSK<. $gx[ &|@Bu1ܫՍ;ݲ94E81b(4? >66 - [ C8%z\=H\rԾ?aEБ֤F{ n$)9,/U4:kBHxMbONXMLLaMP9TVW@VT)QZK4C9/%] _t!$DSϵюc|W߻Cbz$ReePA#%mF ׵҉пb%؞]Aݹkޑ1Op G D%7(<*,/2y6%;@fFXJ~L[M MiK+IGHIIHFD@T:1G(  NY'Gm؃ԇWϪ·TȱmՇ,:0xq93: (RA.x~ InLߓET1T&&] V!#x&j*/+5r:?iBCAw=856j8[;N>@B0@p;%620/-+)G&WR ( T'Sddܡ,(5!<˧ΟO)5)GbFYK"$)=t Qbe~2/$ ' ;>HD &,`147,9:;=>Z@ A@4>v@&\vyi@\Gf`h+ZE  9  < $nD!8%(,_.30>24F79;;8 50.R/1n4L67/9/:975 2.D*C%!DN#^la`\,2ӭIֻ7>S6Gֱ~\-ķc4.Sq͜b߾?A>o&vef 9G$.:#&'''&l%#s#"%(+ .0W2f20.), *((V*+*/(%$d&E(c)**-,,+)$'$#L>i`ޤGDfù۸:GGҳW~%I?½+۰+)n2Ao[ H!!'+.0O/,4*(i( )('%#("!!#$$R$#h#u$e&x',&" v?(X$G1 g 9F{xy]ۀl=i¹D 8c.0E4Z:g '[H#(,s.,/E/./\/j026E9;<a=&;6v17,M& dV+:$q?c%`гξЄh" ^!(f/6C<@?8,A? e  C ј*=Ʊη)>ڽ™ZwWu)%&m/P6:U=%=:>86t7f9\;O<;:61z+$Z  =Yk9uy۶WѾκ&k`N3}a4 DQl% ,39?RDHJLqLDJGF@7,$L}3\rTh#~ɘ!㾊Ϫ Q9`)JFc`  '|,}/ 25787S6402. +'$!+Z cI_Huֶ }Ww8&׹ٕCIh " '"X'",/1%2F2W359?GoQZP^[Q4C3$^x=1 ^7 iɑd{غ X ѵڻɾ_¢`ݯ*rP6 8Mb~&+-R,(%Z$#`#"5!#:C7kH{_8ߋ۪֛$ԿӎӿԦfK C%~+1,6;8 87y8-;>BG\NTXXPTKL<> DLtUZ0[UJ<.#jg (mSxeБ7OAņ>ֿ"ƹԨߚrxZ q  o m `/ b#'CPӴԐuсοʢƙÔl<^l #,7"@FiKMoM>KiIJO^VZ\YSJW=X0%|2pge Ga/n؃&: ѥ*{πwϺW0y2 3`Z"T+G  Eu#/ؒѽ})qhMȿNJX8k0Ͽ֠z\ ) `  &,`27<>ADF0I%MBSZbh7kVgw\\L:*hN~S'@%G+nv+:P=B 5y :    v bl6K3y@,̯̭͡ȫ'ůnpgW&H@lz ,uc '&+29@sGK|NPSVUSOJC :12C-*8(%$$!E P Ce!.R!"eZkcub@ i*x \n%ҝΚnǣj`W},ˍ?ͼZ]Ї9Ѷqٻo!0$ ) y4 P$&).2y6a:@IESXXS+K?[3(##3'O+r./-' F h=P[j-" A0# 9F^}oJ{Aݺ*ޗҠˆsȿjVb+h,Z޶ݩ%kq R<"%(,[2t7:=?A6?7.9($&"\ g L PzxxI$:< Lb Z Pr-EU't֧ѨX-ȼ(0|ˈ̿6٥ޖ5e ~VM"'2,[0s59:740M-r' w.KLj E)8Q r5U .(yno  c - FM[N- Ԓ3ǿĻww)Ġ.K^Zr; j !^"}""E$_({.y4888j9;=>q><81f)".$ ZO5 :ngF_]>i' T  H U p#oڝr˾ȶN*νO̥ӧa+3y"=I=  8E3T "%+74;???pAbCCC"D>FGGEB>5+"j*k F rj۴ۡ^yJ2<P e `#H]&Ćɾ/7C Э2̯%$uS0 j8)" 'z+20E59 83n/-++>*~(K% Z*rfݠؽ͚) Wpbs'E5M/CeޏRHiٸpE]k!tdRmH)  BRa&"v%z(*2-0U3#6 89<@EJ|NP9QNGQ=3%-c**{++*'#t nA ۤh$kLݳޓ96CkJ:&OQ.q^ ׳p$ WY &!#&U*-1.5|8:;c=f?ACD+FFE)EF5INRUcTNE;D3,U'"tKGjFڴ۪^ژݚߒs!t+:y$54-'#&.(87 p6:)M/Avt@ @FܡTޖߢߏެڣ U_ջАyfdJ եږ;P&AN e!&-37L:3@B.CCDGK$M*MKJJIII?KO+SaTPG<."Ph `LWb&`,@ܦعgPUN#`=C)ޣ+$2L?ڌ }ϐ͈΢#Fƺdoڙ%y %*-04B:@DG$JLNOtPP^QRjSYR\OnLKL(NMaL!KHID<<1'sq)rSg%ӆѲўӮՌ֧e=L#޲~($XS"N66};/5BRMi8uaאw=5 Ϭ͘˅%iͼЉYؐێ_2tOET6<m,"H'H-4A@-CzF^HXHGGHhHF{DA>|:M633943P1P-i'M<2H{ VI8Ǫ$mɰȃǿŬ¶0Ľ*Mf|CW    } M#!F$vs2.jT R !b&+/11102357O8:;;o8u35/d-q----V-+'!  S)_ i!̻`lr𺏻 i΃ nCH Tg ! duk F&Cy#}s "o 26#&({*t-W/-~'"X!!h!k !%&# 2\ GKDh=b lռZL| m {_: #a$##$#%%|#!!W" >(B+ _>k77*`RBB(0\yZ< | o-t5'%M/)R..'y# ld@EYz#Ъ9̫̎OՕTma^7lP #u&''&%%$$2%_% %$$"w 4otD aGJ#v~yݢXܠݲ liP-p?  xgUrV 4E[H ns/~ %fD Y;U+#C 0()3e#: "#~#!OflCJC)U fR9i,~ؽ׫N0״uج|)R)O4}5uh  X% 9!!"%'('$LB *V %39 x } 5p#j[Vi> '!A=RL a)MzST7ܨۂe ՟a:(aحڢהײ׊׻cN7>@ G [  H u_-K$)/ 5:<ݷ1azC|  $S*J047d9;?,DGYJLYKxE:-{#r! "!z 2=t mzJLX߂P-o~  GV~  5t jF׸*ԁ? -͉aV>˟͆!ݢ|8 !$&(y*I.2)8>FM+OM6HnA8-# n!H!{ _ ,Por#=e4ڤ@flHӠ W{g9~B}v_ a<1S IK6w8'7TRS_6xz߈q]C;u ]H"$##V%')4,j19uBFFuC=4%'aP7EHlu(pL}G\ ;DU7h . s K@>_.=J(3f ٭zmK IZq I !$&&$+#$A'T+/4:F=<48C2,& F`m%& sT> =ޖb>ڥT}om=CdSJ-^DwWS[0fa'S Hxg6> , K(,$'j(0('#(&)\+.I3R79:83,v$  ?W29!ܿة<[ڄnA7GLvV*U G.9;MK*`w_s{N~mNW GAf "$'*-16;t?5@r>;:9:z@IBvA>9777c63.)T" J8> gt7ߑu҄ze֨9Ӎ*0T׊ YLiNv@QI5)WDpߗެ'?t"my@* 7$ i(q/=33032p3V45$8];>AEHKLVKAGA<9899:9'61+#FG 69OuPޙ5,ӟMёoB̟hѭռؘ,~ݜ/s4zG-+aA6}JQNMX90sv 4DUjh>=3 !(.13474y33J58I=ABF]JDMMJ(F+AF=:)::g<=(;S6/%P(@a6~>#uͩ\d͛ͭͅEύZdٕۍXY~ MCtiVy v4@W6ob7Tp.;&  _0yLJ<&*,m--,+,._368~:=9564q433g6.:;z7.$ V2gd ͕)οL(LPu/RG"+JdB _M_938tOh AtP' "%'|(X'r%#?#$l(,20s1111[/+('('t&%m%q$  bea;ttG< #ͨеnӂփhU|FXpKj}<f\4PC'dSZ sXn,HN"sv g 3~1t#J0K !#%''&#^P?=a 1 ^j}No9s;۰ٖ|Tn`Kۯ,k,$x|4a9p2p-H2}QnIel u,V;LU][ NVF I.)  < vW_$-SU1-3b%z  F h 0]$),.5,]&b ~ 0RN }J"H{-ޞ۾ٜڗ()^ߕZJ"3Z!bVd ) 5_tGC~Ee N0, ? (!$a(N,h/0S1}1 1.)$!H y&. dy|p߯خca-Zl)slyt} ]x1 ' # r x]g,0 pumI BR S A%^ $&K''3)+/49q=K>P<8 4/S+'5%"c MZ? k]XDJfSU4Fr.]؉ح(A5Uh58/ e7YPB _@O 4P;T*q r6ۏ؏L3!j l"$&(+.L21579:;EZ?7>5;61*#Kp } cvZ6QFB[΁lʄˮ J=xa܀ 3 M-Pg^ }K,quT( mz.}S :݄5!GQ`C ^+!N%P(9+s.147A:?<==t=>n?>[=;;C:j8r52Y.)a#Gڈ`̗ɿȃʱϙ[!8G(t / {  8  deZ[g K ڶ۸ݹDMzAWd +!*&a*.$2407\9j;<_<";9a9{99::J:t8525.):$  v c:cdׁй̆ȀĆ}S(vґ-7bm. p^ZDPp b^\FvAj`xjnzzcZ%!|K8Z0tT (,"$'s+P. 0(124689p97\5[2/z-+*)'%J$" }Y u. 5+޴K,EkJW5u+ÚřuʫΝ8%I2]  /%X/}Bal U B "mp-xA!XGJ5;D<zW "g!7%$)7,.1N57R86'4q1Q/-6-E-H.*0&221-(Q"p uhυDsp~aMـܡbLEU\ 8@0< T bp Wt<-8~ڌٵs6X5 <[ 'z $'L+/48::;|;;:8453D3 3/20C0=0/,^(z"# {jבXqRru|&1(UϑԎD:S )O;@!(#8$$M%%&$"![!3! * i=fݟۊNNܙDةשj֣z?0+y lpA m}"?!`$p& ()+-/ 248:;:8B50,|)A(M(|('%5"4/ `(a*Ut;}aBЕb:;ƗuȑsH܁Vw^9 0 !e%(+*M)&"@rab] C_ݾ~"*Gq!? ,xD~ 4$V'*u,p./800/0W0/.--,+*))(% eL1p&*?^EH)BG1eE o k%(O**H++,+))*+0,,h-?-{+a(%2"Fu ]:6l*,ҍϥκ*׳4jߊfd' Q $ 6x?J ; p S 7'PLvBX~3R/:QC*Nn s  "8#Z$%M&j%#,##$%&j)+,*'f$ + 11V pڐV؏ՂJJ"؅ۿ )jg M +qOPP %OM2ym9Ss,[B`fE U m } h$P$I5)_s"{&*-u.,&@ H|%G M a gl"gF]7݂ۭڛ02ޙ8[rhK ctCTvzDL-E0w?7xnF N4?'L!0 [&|YB2 _h@1X $@(a*-+i*'"%g_ va *nI,jZ..Z.۠Wܯߢu\SAP}oV\<U *U2c * YQbNW  r#_1/!\!Tnl !)#$%.%# Fb   HzF^J4s]8`Φ˩"fAǞ.|agEEًܧe#JaK Oop |;#u&())' $;  g?>i>w L b !' !8!%&'#&!w"lf e   sjQԅ uͿϰW8ҮJEϿؿ۸Haz<fal = 4mq` v1r`K }  U@Io 9 2 t } &&-**'r#!$%%$t"(:} ,2N!6Lٺ,ХЭ2!`4=خݘHL2OyxmWXfOG!pouB?:  $  } m  I w1^{dxqr_]vSz%B "%(* +)?'y$ " ?U>3 u l=l#CSq[`L#ӑu `[ uޒxNP9bWNF%ZBR gH> T n N m   K#PR: ""G##$%'*H-0}220{,%/  X h fX"fDrѷҐZϻ{ #ܦMز6qϯϚЬѥDTw*zC$,`N"* C .Rv- <  kyEf[tF  X tuM#}B3:L731n.m,F+*/'y!-\ ;>p<ܓJϿ>21?Q!?@&I#$u n\"U&*-2=69;<<;9C51{-*('$!0A C(3g ޔjՑnЛΙ7zKcV־օ&١.L ~$?*{/36C869:;;<=f?@AN@=:|63/+r(;%! (' ||uUswj9꾎"h(H轜g@8ҁܬKNeP"##$a'+Z/23430%,'$"n ;W` >Yp"ޞu&#N9\L- q]sM %')((})]+x-.Q.X-,,)-,+S)&k"DI pޒAw }#Kڏ֩Ҡϸ̲ͭ=ΐ"΍ ۢ("ߖ0G >mS6 #J'*G--3,)&(())&(J%'"}! |1^A4m ݆ے6H{MQ M Un4&O"R'))'%$#"H!  1 };^8 -]1+=#_ߝظԍgԒ:6+(R+(:`Bww 5g$9I0t s WRKNI N 8ILg[!~Z.~ @@  VY =$&m'E&$####3$$l$" ] a  `]]ANܓ!ݵ]]ev_Ym(   C 2 b o 8 qr / gPPHn=;4zMyHG?y?g e < ="3%'(?)(C(A'%$###M"U,IL ! BD:+W.ߡ1cz՝ҥҶ\@_MN o!f<@ \ ]  4N\\& I ! D4)<9643 31 0.>-w+(5&2$a"XjhwZ"vۊC7AǓx0NǛ>xuڬ}hqfB  Gf*zK| B >QHOHٳu5$ۏ5ݡQ16?_ 1 !7"$(Q-26;R?.CEFEED_Bh@T>)<9K730+'T$ !0|0 v y3n@mgښG͈]ʷCnz ՛ie F=+ G z 0 6 V jO'dwۊٸُ8ݷ"c@Id4M`N S;u!l%b(_*+,;./13Q68;=>U> =;;::Z:V972a,%~<gg' mV|[Nw99r*ΣЃ&ЉЅTի\ g*^<16H-K7MN;/&x'{~^71Lj 1p  dk#~&(*A+,.12D4S56{6Q6548433V3A20/s.,)$O q B-) f~rrY(Hѿ?j!յ^>idQ2av45nC,T|q4 8gFHUeQe2N i!^!!! ;!"%])-g0D357W8"8y776:64 3l10b.+'##ge[ h ת2˯U8V> ǧƞĆ BwåɁ<0L9g -  |,  a #f qVn5M|2}J.R5| </3#- o: #"v#$&'c)+.1J3J322}3d4[4G310S.,t)v&"'Cq =QRgA=n t p:b^u ] [ _V'8Y+F:VFs: 3, !}#%&'D)+,F...x/90g0k/-+}*A)]'x$ b TFҳ<Υ ƞ'µf׾E^ly.G7~ I PiG0:x&! ; iiNAJa5XN xd^t!$&')P,d..G-*)'&~$r!*>gtjl f55~xTPmעHյ̸gť °½þ;¥wpьf<e2*!H D$m2U!8CDS XSO%&&XnBCLVL) CC  &F !"$"&)''+'"&$"! !/ QO ( 4hz O?bZE!ʮÿ6öǘMpAtW yY= i.$t7 3l"48s'zdw% gnp 2UN+y1s5  % jBB"z Ѻ WУ>"ƞƆpϯ t|i-U ;T.>Jmooe a ' CXwh H \ % ~De s J E `EYeo  { \5 &P`E4F/u4lM$sޡ~۵ݧf.TtޣW޳ߊ!/_UbNwI ldtR _\! | 2L!6 $ < AA b  . \ K`> xsw  { > \ Z> ) Lk[%1pNV/cߔSڀZv3";ay$ @j st9,kF]n+1 ] ]\ euxMjSInMAB) m FEhNMB}q nz6'@ڋ bcθϫBԺۇ) @lf !Tk"F%'(m(&#;vf$H Yu7GJp{LW Z8 K "?#$&( +7-./.z,)%"^ 3vM ^ )-)ܶf&ж4_ϬΚ{ZӼ2(u"~D5 (|7`d  T"#)#8#1#" : K.%8NW5x57 HPP  $1"$ &&&$#U$&A)"++/+**g*)'G$A <LQ2_W%֏ա֗.ۢhkC20 Q Pk] A } 9-n  nw_ny~|wf-YWL %W!#x%&%%&2()|))*~+*z(v%U" ^u-D$ 0_];ݱܗ݈qnH{7zW[?/4Y{Fsn ) [ %[ O8xY8ta:4bz`CVqQ)T` ]6k H<z)n "%I) ,./.2I4_5[5550542/, *'%$/$##M#"=! D_#%*w׽MScͩǕOTvŗǵʡ סL[ &5 HY1fgYT: 7HO(2?CS8#/1`A(B K*.#D',0468C;>ACBA%AA CB@(>0<(;9o73/,6)$& 2AXYz= p5ñȽQɱȱvoS:iê]&7BK M<PShG !"Z"N j E{o7Y&E|@~mP{?2 E+!&$0&'<*).39>~AIB/B%B4BAeAABDDzB>96.3/H+q&!  .Uwj&ێye ѻ̿EìũR4qߤ*w ? xd@j T p | QL{C,kBdtZS* ( "%$)L,.12c495:54333;4b43u20 -)&C$! - 6|Q`ߑOؗրjԪ@!Nٶ#!.Zw)by))wW/Eem 4R?5 . }% '/To"$?&N'(( )*))(())) )(_('"%" N< s k"5Te7j\I?8is#'8m!Wo5!*sܘyَٸ,ݹIsuԺl5ְػB;~RsG{*>& ! &()((7)*, .7/02443e1.w,)'%x$:#k!9^<N zn3z.En2%|c-}[UqKl 2|1ފjKֵըԈ|=r@  ax-$ !@"#%(,[/12U2?0l-*('&)&k%E$i"#zaj 6dGN^J7xXF0Lhgj,gy4(A d4$fmdbf WC. ! lK2T.;LV V:\:T50/( #?ux F[2DN͉|YėÀ0?ïÝĒht?ҤN3U g G,ZZW_6cW  e6I|L3eߢ܄\ثF׭ִ(ߧcOrQE"+ L"1&)7-:025Y8:H<<<=L>!> =;);_:n8>51&/~,( #D4 `?soP۶9ӊD΢6(%=Ȳg؍ۙR~;Z8a+pQZ V8 y J7ia GIFrV\K)MN}pPOE  `":&M),.?1 314556`7*7;64321 /,*2)(&H%#- ~jd VPCuR{[ٌَۑ4I3_79\H6`^Uo)8%?Yn_n?Z  Coq7 !#$:&3'((+)T)*)((7'C&$# YYQ#   RRy UGlnuASNڥON(;fQakw< #D)G{cEb*mNsK?  { =J;z]+\s}E2g_a}_  i0Ywm[xnrݼ_ ݽ ݮ޸qeT nA8vbW np4&vg]'hvF   a S 28Y <2 / L!S""d" 6lHbu00U+  R[600܉؟׍`دzDt A(tZRp5: N.|N@?d-m)0HVK6Ac2 dt!$&g)1+',,,-.01 455E41Z/,)$ k$80rUM =a%_Fϳ8 z&ə]ػY ra ;Q iT2((q>>6# *<0 XCj5 "%*q.1@467!:!<=d>>>>s>w=v;Z841/.-$-,N+(>"M b7.(eˣ-Ó׽ﻯ1 Ww7ۯ(aY ^Kv]l!Y&*-/I.+'# \z ; >>W"s='ۍݗރRSULz2 3 7!$m'M)*x,.1=5v8y:F;g;;.:q86631/v./.. .+%{  \O/4k}ʈȪ_W]ÇU6$͂$Xm?W X#')*b*)''&&''p&%"gHv E<i/U |=?,*!~ [)3!X$&v()))))((^*-/05/*k%<# F xQ`\|9֛I>Uѿ?>EӰԦր^.f4R 3A1>!#$-&?''&%#;!5 kM<p@}Bm1?A9{p; % #rn>QX Ig%# 6 j}qJ'ph[yޠڳqbэТhҧ]K?׻֑Cؼ>߽TFfrWU|g g ,<l y5zEvsU&PB . L g7S̳(V  zq2n4\U>Q . 2,KT}  "y>hJtbja:~?   F! #$'(@*3+ ,,;--V,+)((x)V*h*e)'[%{"q vY I|ޔܝ3ܘ5֏ա֓12֌M۫N.Y^TR{]>N!AF%!2{% z V_pp+x_}{rTs_j!M  ]o.nZk 7+u6Hy+\D-Q݆(޲Wyݼd-ܵ;QOVrܡK IHHA2 w5_$(k+,,0,*)!))*,,-(/W00/P-)$jD5 X:HT?e{ hh OY(,^  2 UrZX?0@*~ٿցԠSоv_҄Ge"o'VCi_T"n` i= MF"%9'9)J+"-J../1455T5c43Q1$/,*(S&F# .H6@ A0"e;;85w WhfJy? Nq Q x vr?g#5ޜ۱eدׇס"m+}} ޫP;";:L:86O542]0=-)& $ T hD9 Erޮ35ԫ2ѯ:ՐaܡJ |F |wYN !z#%&Z'i'&$!dS{ }<4AvԷΖg ѱf)؜xH6 Y  $&(:+.0J2+345}54h2/-*&#!1 al uLpe">ەh׬ G~ն-oOYp n &Dsi!$y')s))<(&$%#! K [L ~1heZ3` $+8)$ &&u,B z |]b | 6yb0XYgpx \\L#<6o_: -  R . 6 W<3<_ =9-O 0jyJr!h|5#S!|=-R$"}EG L8m}pi#E^I|t| *eb^+X'x^N  h D8-]z&E} H4^;?W 3 2}  "  SXY/3xvh X٫ןHb̏(ȇż ʃ̢ u0!,N (i "%M(t*+R-#/010.--c..- ,*/)0']$ Goqp h  5 a\Np [<@xuf;+NYr zFE $KpV| ֗hijЖϓ &ѡ$;բ֏r|Ԣ7$ݪX&c'  l"%n'*,..."-,,O,+)!))(r'Y%" IVNz 9 {K*=c[u};zFo; sv{M  4~A?-OT+J p62xc]ߝޖ5ڒً؉t$(w~MWz!' S ,= #e%4'R(('('z'`(*+,Y,1+)'&%X#v!Uz %:  o9 wg8]Cv5Bf*`Ej  GZ}ne`1.P5nsZV^B#!f+3V2v;f}t'+:~ uOJo!_ I1`Oވ>s7IHtB#i)  iDFyN+U;[*[ + tZT w!P2Q*Oe=P=J I71O7_?A\c I N YX'%B~?>faژܦ.=mc,e\ jN$.  KR14B[)_}^;2i.$ Z mgYpbt}m 7!,! 1zv.w[ c iv:m>i^XNߥܜtZ ڃLb"I>^`9)\%u^[Y \ I WKUVe| ).%IFCBgW }HD<#h]$ V aCb!K"""j#%&x'&%U%$g$?#!C -( n [ LzGb {ިR۶ڝ\ܽ .ތnd nQLMv<| T|)D 84flGB[<-H[+`P=hsq!v bYwg@ "$X'*,~.(//....//0p10r/2-G*&"TA] 2hxۅD׶K׋ϛe=$ً܎#ebf`J` q wEf0EV~bjp3a00rZ>9 # `|r!$J(*- /12<4457j88K86515h420T-*(/&#yL v o <:9G ЖoͬB)ҪfՓثܱ0yn/$M764h1,]($!>|  VrGۆl;ل U}әl9:oIeo-D:W`p !H?OFz!B v01yl+ $, #@'s*,--++w+,>.e/00111x0;.p+(&$#!=r i?4 tJzV${J!b߳a|ڥڝ7݆zO EL+G-9:2rG{ir.{Z8N,U-" b8`~s # 1~Z!""###O$$%c&.&%#"""-#l#2#7"k fc]$ V *~/J{:F0DerwD[(w?dwa{/ ^bG fPiN7^}FC0C\ E@ f ("Oa m_wNIG,oC an R :"Lz/%LDdo<+y%hgWy X{O U/{YTCz{!4imy J \  ]OES}qEIO K *] Jc,|k0$uw6'iY+a{KvB ~#=RLKj$5l:qwoXqC*A kMn"quBawzeZ= < 9:k"P12h#j^iX,*7 \<  9 T  h"b_'_&AtF߮IPMTf9qbP_/ F l}jecR^A- A N9hgBSww8,Ehk;y \< { p k>}w]$ ] E +*C|Y[*=L]yBwx7>)]hUG f ^j\31 > & c B iV DmKA8=w.H(^B.0$ cL,`SvnN_ ([I]N%Z.Ld;:Ec8V(nd , h]VeroKPjf?KB|1 ' 5/]_ikA F\#j"@da f 9 w a 3 a P  J 7 u=/)=K)BN-  k  {SC#f 1h31v%ިݸ5mڵ|}۾v;0"v6# zW`b ! V64>9C  lgYWe^5C߾ްM9q`r~SY ~,n@&T$)L6 6f9 3pic "?%'((&$<#! #H_ w2Ohu޷ܢbCۋy|֤֒R+ߟtNjFs 8 08 z 1 <{ ('[ s qC0on_Y\5_nz~}4yzwS > *Ob[bN>ci ?= u82?e;87c)wvMD&+< x 4 P  .kq4 J+dD:,90߆ x%]Ev>p'Z n'oduex%;yP `I!hX:9QgRSP <   g4Hpj,$U eZ\e @)wߦ &inSp^&`\-j: [ .J~Okwk x 0 &iK>61TxnnOadrS C i EZM]41Av -/d!PE_ ݬ ;,m؋4Wj4!el/T EQ6J6jpdy/8 ^ Q _ 7W=[gH[ i kb?EGP3q4xFJCu + SlDڱt/ r; $Խ3]GHN'wdlz 99y.t !G#r$$#2!6h'}Xi   h]D'v'8"}FGCz` tcC!_#$%?'(*1,O-(...O-$+(&Q%.$" neb PbHqbئPэ7|CːȯQB¬3*̸:Sҵ1)אۍ+1Hh=F ):T"H!:""*##R"!fPJc 0=,W`[>b8*:)(&-%=#"!KXrqqd  3e A;^?a ~ w)?ZL8 pc[MnahF>XH:]zU'Vy%XhGM2WisTU Sb@w vVSn ~  p x R or  Z I / 4  N  N ] 2 mX = NT\g;hL/M;!pJ.U~cD8?u kDGF\:~4h;=avc_/c> <  @ F HR{#2`0Ck@j{ac % A V)d[q&} r E  R(RW l6brw:f,X2b "U4OupM!UJq<mKK,Yq%KO=?t?aDu5B 9 J, W!bc?^ORkqw^ D + [  xX~E]M}p LaSJHncvA_APO/;'/&X(XG 'oCLMK:d*y F F 6 r  o w }.1*l b x g n o  wS.<2hS;>CH\f V#\ +}I%L)5Zv 96 9* 6nlKz}> j j h y!*Xx  S q  ! 2 6E7yv*DKr=E $5$ ."4?!/CEx@K&4Z[xrM'%`a>x  < _b [ C | ? M%-F&U8S)Q$1|jc}& 0 v %  H'nq$aZNP%i9U%N5,C{OcyM?.>Yz2" I XC>  q ` > p _ ) s[&Nc HV>Q-f=`g@w4 "  S  u4\qkkabC6:"p/:$qZfDJm^f = = W 9UNLk? p *  [ ^ Acw | i = ` - ?| } kBeD|8%dJd DG43dJ9 Z i -^xYg[4a{'If<9Q1N L | '?5kYuqYqi / Lng9snn|:J);6]w^h^1h-Cn}6 v r   @ x-Btfq*@~C$1J?LAZA177I@J @pTX7k ]g  -XTAL"l2\Ln|am~~)fp:UN.<qn!  \ ,  t x \ U ?]4EetsyZ s,^D I  # k E "s$l0Q&SY"??D%_q)(bM#;,W< >R  ] ?  L+ z  i ! P X D ( c S*:E1eg+A $pH|)x w}M}7Z$&X-c7MQe56ZT2},,lV>T0{fMUZZM o ~ F w a r ev#fB`/>=! 3 s  h+ 93! ER|_'i;0-O6GA=HO"DTNYBK^!w0y|8:YJ!A`F # R A Z 1SlNg4N Gx#atg(m y +) # &fi pC@^(H:bX5koN:1]R-sa@>Jv8=isu z v ^9ynkr+Ix V>yo K t % \39|&xlDaDbr{Q-\ykv^~)k@kTuޱIݔ~ۃeXS57O~ x1 ~ {TwS|kuXN_b ,d =  oI;!UnwgB7 Sa`P@Q'iDl@V lzDJ ߴ;ߘQkho 8e?n  u{'nRg~Iw:| @ ]5^ vXe__?j;i0`w5l_n$1D*ciGaKbn ~ޯ01L$JQ8^Vk;20dcY; ,$3{r!O6Yb _ \ bm/Z<*Uti)}h /s Q0Vo#/dcj_;}Ws!GbQnch}gsDPuQ` q } $-aTVYw . 1 4"xm$CITT;EE+I!2 z +  ~<  n T 'pWW? *P@6f:qeqmPlc$?- CXno>Vvc68t  mLVKtw+l? U a /TAPazxP dPy u(#U>   y 2 7w%nh3?/B?j~"m0[^/wu%X{^0 ^3N39'- S7$TpBG-e*3F%Y4Pcf:5^y5|Y-z ? %$ '   A L0o 4OxZT~@2td?cvD\~$q  >  g {n H ( r ~ ( } NY(R\u=k_[rbz+k, `ilt j  4  ' ei\Q6l`~sZc{W{Xm 7z9W8 : B Q " B y j m d & > x\dAFd}TLd{GT +10lCklTo#~" + cS{ " e A  I6q6bszi5eGvEMZ,8W^ms=6'vutkJ3!+Pp!kf^ho[jJ3b%Do)I| yM' Q2 + x{rSxRU,kZhuZ/ r ]:9 r 4^im4yN:]>am>  f]VS:Y+mcSm.uWVk@s{1 z+MI*;\/\(,SUH&c24QgbS'hv!"8By|ZGnH b  , > R $ %NoF  9 ! E a A 2 b \m)CxH| s,XhM3BW +_3uY%e\Xf-;TU]G^?w 0r1!1'?3AoD?(2^Gdk5`W9S/e# ^$"ACyMSr`_Z1iz?2d@*#Ye,wl qNy;EHDd {Q!=-rS(b>S p4Ryk54s]&,}QEU9|s5p8g H?-Bw(Z0MZY]?5Ygn k J|W}"MR.jNxOn-:}25;t|*DIDzWW sz|~!.4h[|`wEO.h_{mc< 7kVzb)Y|,' P C - U w w 4m6 R z2Qb)LJp=N?w 72IYhngd'AEskVZL_O29AX7G0zb9@/ L+)0`n8 @ %DLHC*PX X + G:'O&/-b&{\|@];w%N^ZqS{ R J RO}@svm/zt|m%jO'oCa y gXn|lpu@qp-[`:XH q+8,M/?[h|zc^3s7%|q j ^  \ y G  : x  3 x&J(6Cu@{|abN'L!qHJB[2^ @ T'UOAVVZ{vL`g*\ = h+*Aa '#aFa.D%kU\mJBUb0ma){ & L H o  r\()RJs>o}ikWUfZ])kc  q x{;sw J  E bB8S3%'md&BC!T`; ,_<` H g /u(  m L *U(j`!T_\tq]aFP97#kE U q n+.w . 7 m )v | ` n Wku>vI)(T[)C%\~<G #T7B C AH_ B J j ! {^u<[+U+-&\&"DZ,,]SR_ ax X l r Q %+ 0 ) K! d)9Nw` ;pwg iTS|  6 ^ &nnA MOh k R"; >#t } x6D=.DBPP<m5 P k`1L'}q_;:Rgo#JFLirO?M3EUdBO9! X 0 l c  X @ S# l  0 ` 5mQ 7v65pXQ[zpd~P'`}0"Xce}P5C`!Ty@]ap%e1KDkYv&C0&rzy|K*_70cY62 G 4 4 {E@7 n U K X 4TevUaKNn'qFC?Yyh .(}y3[j51JCg ;P8a}|JIZ4_SY\ (  5  m  . L _(b^ 3 'g?f&C_#($"\;Pb$cp/b =~N$bdhg}Y Tnx|<m#] *P~#-G@kk!Gn&w F\'h|'-{pm@.BKo2:c#1;KAu1c[:y 5UmSrq|mu)Tn={ *  . B \cHh0E^A!a/tST|-8% $ BA[Wyn6?F>+a{93u2 S . Pr.ihLyW7xa4 e kg? [cM,JdrknOp.1{bA_bUcx+r* iO&SzHb0f|ZSq*SKw\ N!ljO G j4nLvurf~Sl m fQT+[0B_pob])J j Rh)kng `lz2+y ZbvYuSstvPe30e\| ~ N<Y-@K|/;  + $~S~S*9I;+KD.S)fqvoB(ka6-\r3tVz-b~IzT!,=m4 efl]e w ' K c wppXi"  # xy{xwIQaHWgAR|-+L.` 9NqB4nXd0_ *F|tp{ADV?i 2J_ ^  x b ) - n P P $ -  W g!(^\ ZIxV"![|jC:_g|iDx42W6}eK*\>f4{yvO_JpkKLnU~h7~ & - Q H /5v`C6EI5(K:1:bp`@"=q_<5G_na"X  EZBO8ILiA6.]mzHKKNX=~-*d[P 4i =-LyxdhH U')i/J\:5;);*; H{refZ5 bNh@5\IU LAH MPA5M<68(r6Gtr4d r)J?9 t.51NV /keI }P"q7@4Z<2wTx(ZW*/ QU6n_X:Z dZG+,Z'VeMc;N/gN|*e8g/95@2Z  " I Nz|?~%ztEA0|2FdEd~,[uKA xB~[ /MYp\((=u_XknA}Eg:>L@*2`|j{BW+[aVQ &GQ|F6 ? %^ 9@d$#i3vMuh^c"$hqq]22K-eb"`fO54U"tmze@}o7PlK2O}O @w%+sJE##i,bMKkVi 8>R1U%anbm`)Ntt^I@4g5W X C(f;ADD6`6k QFvzj[sr{b@W:;S#yE=Fq-:_OUx5??.EaiH% kHa|vI"M;kvlRAGet5,:(9rpPAYYgky ,]C"= EC4AQs\y^/F)oOJH[FX7L,] o5kG|-&ToqU$r!= ;>L_|q zUnDD*xqQS77eOw 3NfbA*SfF( AM$`>nKxh4B/xz?B_vlt1PBDGTR.?;y%VUL<@!*|4DX9 I3lN Vi%mV7{C*%'9`{g= :]f#m3x1,~>}`)35, }p26^A\qoa~*?  , E  ! - rOARGhE+q2D &\:25&hI 0:'P4odx '!sk-"vim)*/D}5zd"V<SjA(4 )^{<N+MOYMhTX?<[!x nP's2_X=FW B\#;| iB3&Sjs7F<:cB Vu0] Xq [dEE:u iUn3nRy z)wj&%- E [G38gPZF~u~2cTHO4{ UA$Z%#S 4o^JVrT]Qq/t} R44y3I(CRWO/ r#A2Y E0~//0w  8eb}'2u74ZfLYl_I=|'W%8^ZWs.x] xXP3=a]ke7F^NlkAK[*@[4'LXnO$D %"M\_` D U * eU^#`asv5M5TE9hmL7aM2|m\ON"-]7<k(Dk?-0IUTs,#<"|6iU"lVIkJC.rvV&}n +]!D! JC]inW}+2M,,0abQLl-zB^uyIuk}}8E!$.) Y"_ &Q6,ABW-!oW"KKJd a)$72725C(st 2D>Ha[@xUkhh_5 w$7E^(lJv`&+Tueoh&J+6X_^msbP"Vx scW!LmB^JDi\Fe'M.E^He ?S)/RovomkRos  N.cW3'CvR))J]?d93(A1Q Qzx~R s)k!:pizLf|2b$S\/y{/D&h4?Dx_(/pr{nL){YDI f< %" #GBSsV;{n+SqZD?^'~mZ=m3"pq> *K|ZeD  5?hNt,OEQ9 " J]<0HF)34~|?j4; -VZABYc.e`r^| ~VSL7P$Dp-tcbOd%Z5B8N$w_R+dY" k,<RGf]xttVTzu.!N53va$ms^j]Hp]Qe;*0_ ?S2K(54CZln:,Ep}x E^k|dD(*62jH0#Zu\* Jr{l_o:n{kcow*rtD1a{gvTj~L:J5'Zjj yl-9nz;B%!sfH %?DB`D%F_[?)+3 R'PX7 QhGde.lc0Te1bcDG09izw vw,u(-?P2@X(il9[A-FU-Q39t9iwf\,CLW\O7"#j!/bc%]J4^YPn{eQe Ayzwf Gy?5&4WdFDtx@u%jy#yR.2K5U,#?2$ 4L^o"XT#<56lzH,\}vMg9$T{sY&$7?6#!0#>@/ ;ci>l .ALD)-t >Z!9nX] y7@1T?xBGQ3%Za>-]1y>_,/_!%~Lkh YMJVd!Bm> d\[]c[4 )q=32W25N#  NC3B" X$D!5mh:iXZNmkQ`>j_>2v|^*u7&r w lwZVydI60HN   n( x6M S>>O:Es~pctnkfPj1QP:_ *`4aWIPOC"R9j>3[Wl^|V!@<BMD?)j~+L0,Cgm{bzflag-2.4.2+ds1/data/pop.wav000066400000000000000000000335441200563112200156760ustar00rootroot00000000000000RIFF\7WAVEfmt "VXdata87tt __DD$$XXXX6666  ddbb GG##jj 22hh,,**``cc--99 uu__DDMM~~::<<yy44OO @@jj FFAA11==ss00CChhwwXX,, hhTT{{yy!!  >>rrkk kk11PPccQQ!!**KKaa[[wwuu ll,,**@@TT  22UUll??TT44&&xx33WW<<DD<<]]88FFLL^^;;JJOO%%DDhhDDss<<ssCC::++mm{{:://wwTT`` {{--##))O/O/33//O(O(q%q%!!yyLL||''GG**ffGGggܜܜ¨¨bbżӼ// \.\.)<)3>3..RRnnΞΞoo**߃||z,z,::DDpJpJLLJJDD::M-M-  FFmmйǹ꾸qqĸ˸;;կ77mmzzjj;;8 8 mmII[[))((5 5 ]']'----002200**'"'"$$ >>00ӓӠƠͼͼ赠ʱʱll00E&E&6767WFWFQQ'Y'Y[[YY,S,S\I\II>wwj j    U U @@ggMMSSGG++??  ||T T   YYqqrr``KKttkk}}  !!((BBzzII~~//bb    ppgg))JJll<>&&yyjj DD??d d mmSS22,,# #     ;;^^==MMPPPPAA((BBhhGG66AAnnmmYY##vv55HHHHOO--11\\aaNN==%%==@@;;44====YYEE22>>aapp{{22CCXXxx++BB  C C Q Q l l ggcc&&((yyFF44TT55GGNN** ZZ ll  ZZffvvww'' ::uu>>00vvnnRRMMMM~~yy..iiCCTTkkddwwddww++''##::@@wwaa::QQ;;**ZZ # # O O //kk[[22--}}00MM<<   ^^]]''||22    !!iiLL  ## PP}}lltt||TT%%66CC99IIuuUUc c ``||ZZ;;   [[RRUU))rrdd   eeCC<>mm..ddyy!!WW((  UUSSeexxss..((__ jjkk}} __[[vv"" ||UU66QQ33BB<<!!qqiiooGG&&{{VV\\""YY..BBAA00ZZ.. 22ddwwww--BBTT99  hh==""bbXXYY  KK \\ [[RRnn| | . . VV%%++uu00""..``j j z z  II%%XXww77rryy  YYrr((NNJJKKttss``{{""++**FFkk||BB22MMppNNaa//((,,yyTT))ss((--TTyy  llkkQQ gg,,..22LL [[ [ [ z z  dd,,::zz33;;bb  gg @@jjyyvv''55::$$ PPZZDDhh'' ZZ ? ? <<hh  ggxxXX6688<<}}qqAAJJ{{wwyynn UU00}}zzkkjj77IIWWPPww}}::BBYYHHqq}},,BB((AAQQ//uuRRrraaeezzaakk||##%%dd}}IIXXJJ%%ww  tt%%CCxx22gg##//jjddDD\\ll--mm\\@@RRssOOeekkQQ}}aa!!     ^^ >>TTxxqqoo!!++\\{{$$RRWWxxEEff""^^ ^^qqXXssqqRRmm  [[WWJJtt~~nn-- QQ    == 77  HH##  $$ iiQQ  BB22GGWWLLAARR::    %%11ccJJaaggDDppYY  &&  ++{{oo 00qqkk||))zz%%XXzzZZeeff''((TT66EEAA//II  ggLLJJ55WWccwwmm$$//,,nnqqUUHHWWffRRxxVVdd&&\\~~'']]GGWWnnllnn  AA  AAuuIImmrrww``,,qq::}}EEllMM[[ppCCEE>>  ##RR  //77;;??nnnn@@HHQQ9966::yyJJvvvvbb}},,,,ggJJ__ uujjJJrrppWWss((!!SSHHnnYY^^||MMJJvvtt<>ff]]OO__aaaaiiddee//  ((aarr== {{((xxww%%  II!!xxQQ33++xx::YYMM55``xx&&  ##FFxx@@]]{{00ZZxxRRAA''XX$$rr,,~~ gg  &&LLQQFF  nnmmqq  aa    >>dd??dd~~jjUUtt--||88vv__OO)) kkBBMM  KK {{ ^^GG ==88""sskkaa HH ssww ||bzflag-2.4.2+ds1/data/puddle.png000066400000000000000000002016721200563112200163430ustar00rootroot00000000000000PNG  IHDR\rf pHYs  gAMAaLA cHRM11gkA;R0IDATxb?(ĩ)hbf G ь P(goFPpGAyP6H4d`0Z@ 52al!0&,<gbnBu.2]4+X9^ޠDzEL)r6b{3h#F !PC+ZpUkCjvhFW˰ ^09 +KJDʃhP ?I!QuD N~02x  1"|Q/h+H%-s[ BZQ Cp 6v #ӷ6{WV1If"`n2,0ǩp\\ #'_w` rYzÊH8m V.WF׶ ˃XbteF wxعo>kQ C/L2q0~a[~ty2@U`o]Z<)xuW1.dž#Ā|h)G)8<h1\$1s 01\ MU\+uC mx^oXAîwCn 'SHaό h(1\[f1xfge{OT`@@jbYh9X.a!"FTl>{~;k5- PqP-%AQAIM"sx𡕻Gt«Csb_ygV=L>G 8!^a?"Ј/3SLrHPh' <$F) 4 }S6R؛ CۄkGv bmR0I=XAL>;P L ̱{! ;WUy<}8Tt0؝Fo^;2&ơV`긕HKC ALp*'ma@Zjn*x]+aa v ̵h;p$.';Q'Y_w_6< ߗ NK IpX +/s0GjW|Wgqֶ֚"%;pQe< zP菒/*]M I?2^ vÄpZ%Qz8 AƢ2 8# H!#V 6]r9w"L.${iFjG#};z{,|s,IA TAeE?9e=A=@xTʏ3Tȣu[\#ƃ30bL@bxphn)߃Jҿ]Pu@D)@wkWίhnj2A+?6r}3IhGxFORNpJ g|=A&o†2}PCz+ WJ7 [Cx QUl/xӲ%pPmP ~G6adhQENd@V^ /'7UrW SE,`|W8@'֖ 7Kh/SR ݘ$Y@!(dEř$?\@c.@'xxfĎOޣi~":CM{#%ׇHzG'Ge q1A@ &I @l2"  @+)1Ȼ~5H : ЀkF?.;W ȺJ[]5FxCBJKbq'gp5.;bj1m#=ӑ]u*E>du_\ѝ'[ԴyosRȊ[r9KbRq$KO=(+IX$-cP 5_ x4CԟL״yAF?vLEe3t+;W myME<$@r8NTG%oQ ~৐灁𻳯PΪʛjz`2I,(T?ڦoTʆVOLUN a~[ؿHYʌ__18g}{aYIV q <{!^5y F1& 0 0=, ^ziTcH8Jiyئd8AhQϸ!7J/zohQ|y}HOlPZ$j:UtsՌV'Pl @[5@֝AMR>L%{7Y%Ѭċ.& &_)`'P{D R,nz/?Vk\I0K>&XS6 8}Bn";00Ø@6\4-92S -2;+K2֪qEvLtWA?$\*- 9Ih\Ø4 8x"W' F|!.\D31LG+و϶C=zGJ?pzBУ=m.Ry@'9W0 ul1XE성P()mmER|P$o |rcmHy^H@Uv^Nkslp-ᦂ~zvg5/k\[D[avQEE#T[L i 3T76| Oؿ7ap܄!}R9I g8 @|@ }7υ@Hd?@h+9ג0CEb,)g ЖNW_&3Y_uD],0ݗIy%ӷrX7ʈwP+)9YOeZ'A  \R邴h u*YsJEP>IOOE`+ԆhKVTy)mAON7n\`66kKbaoDzw8S)Kc $}lYi,󻈧-Z4/Ō:aE?_P'QYc yz'979J!eq/<Ì8!*HID]cALR'u%]Q޾}J ,4-w&[M|mc;+{t-Sɏ;T5)K HٲO,]E-bBGlYԹMi4)GB؈M`^1?{5(H$u9:l#7׮1 BtJ.y*bz(5;"m'8Z߅c]s.@4|xQ`YEt=t4#uḥx8肉xMDԾL# l?HX ,b.k-z 8Ϸ*".bpNB蔨f KI dVCAἪ, $! EOf]'_Җ@H¥\E-?}p|N1?k^@)W;%=A,nun}E4_NgobwctU}XVѦ@ DO5$ւsm@M^^9 8~+)o Ek\4%+ţW~pw9 4i㼄``vScl@sQ\}g|R|<}+HQEP_H n (f ϏikoUFYbH'!z՟CΤ0#8rlBc1Fe:Ff5rΔ9^].@o vx<[,C_KfGab_A0'Nc*>ji;N.[yqb,Q;V8@#ґ:4:$8@ퟌV}RZhsɯ[#O<`5(YD5OM]noϕh̡@ ҜcsV&I jȷP\]0dI@gg|pWP VȉXq4+aax.U/ Rg~}'+Pucpנ^I6⪉՛iᝊȇQJ-w/5clՁfr۩Ev?K@TODnؗ ,3i죍66p4Kzf2prMFf [ȀU2Oq'—b`+&~ | ra4W&i8!&cNE*=QLoరߛmBಹ۽y>~BcM8Q&䳰,GWt:4r:?4Y#jqN|R~SVB0nidqMAG`i:L$g+€тJȂ F,a.kO6[:A%(vN҂@ ҁ|hb0z  ðeHH;+UF $l{6qV[Ҿٺ9$߂O{m^mxqo5`Ȥ)a2;<;j7`chf;| Pw8 ! .cUUhp>D2p`;}krnAev~Qg'gY0dmUч o! ֥)7ZW7Ύt.cS,"eGO[dIaYܾi{1; ˵Q0LCVq7X@Q8-lR,!a$H9}~IC➂zi%\][@!$~72_etO $1olW}k?Qoͮ¯a87 Y&i>t4#L"1N앉|+䘽346-]Jo IJgJxӇ` \ٓ-T_D)1#-C6E@ADa$a$ߎCxЀz;]av}<iqV!Cߖ($Co4l؄"0b֊6$>7$<Vbōt=v^.ml/b&.D7-3'zn?hN-05Ez:G-@x@WB}P^@l?T0w8 1,aAZWv:3P>;oYcj}`dlq3Gs-8g;:KP"yf=Q;n%<2$J|a3菕M>^5^D &ȋp M뗲D E?~sR֟Gjf/s& ..ݣjq'?FqQ`G-+쁬>>SK);1J$H~փH3[wQ uK/K p!NzKL*JuLf9% ]Q*VDxu,~8gU&!c̞X0ff?p4rh\3נsy*i[x9ndnG!9#RUsܵ д n/66Msз:k!gɹHE_q5YG3v;{Bܘ gԷX#n7Vah\ v9eoTo~@_9  G~T%5 =U|Ejғ Bdww^٤ebYfwPQS'0+*2X 4dƚ$P '~fj&.ǀ_\Kܕ#! İU%+K bv}jen ےo]|%D;w~@~o}$ci{h~ u!@# ¡(GO<1ps>V݊JJ*)<\ B`A־֎~Ddj,e1D;I4>j,5C:%*^b)P/ '%bX6,_`Q4 el=~@hP715u}x  @Vcq 3M\/?t\9{\gY3]k.-s:6W ζX(/ =5R3P"jCxNYΥ'Hߢ$}O^֙]Q*ΚƂ5H8! @O$cCJݘ 2Oӡ}SR-cZ*AsȰ4g._|2jΛ&Zǩ{Id |Chd2,%>[A?ovahW_+SƎ\ZfPMϾ_ wUkOCM{eي6Ryxf\iZ{LH)5&ŜVQDwKXҼo$:)Vc}:ьρsqW_ bSFNL S< ]ߟ]:\bڿ(…k@4-C#lSΆ@!ziaxxhlсHF" 5F`m_5C>( @ܵ :U"H,,A5}~D0Tڡ%s;=X . `-vɦ bܟE_lN»L>W *X2su^T&)) $kK5bk%P}жqQn~.ͺY8HhxOŧo*ʡx-mYsU o'r[`"lKvR},y/ʆ$d*Q.=rl+p_"FÿvAq!<<̓PAވA#qW &[e%Sf(<5`)ݥ@='N?_>YT{vQ~;%vY ܚ' &&k]K9PzN:~ /Wlnqs"r{T[X> 1Xһ&f9χrHTw׉_(pq)Rqx(|V%F'vD"\pCJ" fwbKe2|,̞ BS) @otH^98}X W @ܵ fz+!ESv3y-Ҥyo 1\NOTA',OEͦ;9DFq;j-G0Q:fG'A )T R mM!5Psm>{dJISZXwĔC/jȁWij'."S2i{=GRa}2 M@ mA:zg"~lɢ>fہ'&|׍[ J#HuEf쀂-}ߎ^^h@ :| uaX]!Fd;!AS'vCx4DZ2؋)yMD7|;$mkZ {봔!#Ana>cUo?>bF7}V#?/c-4,c1)d2yvtCZ} e>rgiyѦ2'Q63u}]lzWA`k[A͘ATa$)>/nXl$璿ambB>_I$aa_L+V8n+ 0i`tљ c  (9Kߤxt.bʵ";F' 7("jɒ//OA\eh :ЂVk8&}g$ʅT K`Gős6`uVP]x,\~f,s"! vb[y eu8-W;Gˈe1.#8I]"!GA.zi맪Vj)ۙ @4q#"(@ 6KD!yo@}v-q\L1'E|QnZa->rڄ&=BݏXM1 gޣ!5򀻍 )0B E_`̀ j+$e8"*&c^HC'=7 "y͇Ï>v80pAGѠEHcO%]E4v|Ђߊ^eczfӅcFm`F )s +׏{"LGv+0dctث.!`_ez!g/_B w )x0x1i"<16E%m}ڽGuLI:y XeM}}\S[Fg$H<>`{0jc509n:d VF*d . 8K{;ne p%P!h9~^vE;!8كi|и;̠t-3nc*io^l?rݲ،8xM+Pӳ"!EJʒL5=*# t?|%䡻nr⿹XGSֿPűII[ vSSvC#z<}UA7&f@S+`> 9ak n 훂ש&5bQ_[M&\cD$٫5}YJ:Ư_ʷ 0D (zQ'6fM-*h;2 `gqd[ꋕkstEve81k!s^>q+1 M(J&OƹazNFT35EK߁tQ4 +Oc!{ƛ67mfտ~ $ ?ɤyGS%֡D&N;~x8 bk3F3gB[S'GDDAeDXV-mW0 %aI&E-z%⫤+?LB=^$zh>_c +~A/.0#?ZUwd'E1Ϥ_Ms|ҫ%䅵І.M7Wx8ڷ6 s)G{uTo>^ŽK?MC[f_(dz/y@ <@!;YNH)V$ ~)9jLba^|%r IMF*f@mp/wa n@,9"YAf+?hE &zKogd)fYw6(2+qbq4A0j0Kt yW¬g› , `;*5&`q5US4=[Ӓ(S`w* *#xq)С3Bq=6eaSADNdMBxW Z#Q0E! 5HNDI8dGsb^=[7< \vBi8;3;"h-WтwSG/YtkîA?K>v; -z5Sbvq0LzֻѨ[`Ÿ٭'.9ff_wV*B)WzFeVåQR| ck}|?^'/"*;0qbWdXDr0SG'ؗDZI}AUDv/$&JDru7|l3;1l6C7UVD`U(_ePJ"Toml%>R_ 0 N1Z|tat!Sv؃sg:Mf3elFW`sqy|Vewr\$ bjZmJ<ԀT%|@,DjjgEU+OR0ҝUhPyu~Ng`$>ZheϒX!+}qΧ6[#e_%7Vra'ǹ>j2y]ڮeA ! HmWzPm dgnav˿ DU9 @~W}m:G$7r[GqsۮKΕr1،\@X?G ޸e#ta"g@SIKlk=l|>v>HQYEMW pb ̄Ƕπ`eB!F<6Fnk#9(ď@Se rXi^0E놹Y3r쟧4TPَ鼟w'$h2}-' :,OzGd]A0 kֲ8q7l&?Str<:s޸f3k\/lq߉H~r}~/JLv-״6=HͰ֐ {:=tv坨[n3A2FRCn~P5 ZRL]B c=8cspy44Zy l q-Hw :"Q7 DoA6)u QdW|?v7#)y8TPif0 BGm*2HŽm𮑨H4~ua/g.'kI,<^ `Lrb$$?("Vt6`-n[~t;Ͽ´hudA^7,JC7rfh̑5Em>;e{6+  PXaWF%sS+fHdb6c;)u7 qRMX ?!f짩A%S4?a&c=r8Fb$5{~df;04*| T vWQ :"7?ۆv)0xy&MפTxoi&Пg2o 8ͰEh~̂_#t^|fHQ> |آCF:UTc.yHWAGzM!yH >T;ZCs$܅Ԫ,| Ɛa^\)y˨L9ZNKu8/(TWߋ TvV셾F1HYRu/i B )B\{i\7ʵu﮿ %䢓4.zel愭,ZVz!8> `Vb )AKml4曠nv9q[3Ï-mˏ5gQzZ_A89~/;{ ,?Vݓ]ͤ8iUa ,QiZykଈ/v)׿bxM叒[EpEkAR[XQ9ArP0׀sxxI-FxOrJE$Ԗ9b=9|o>>$nJ7ݰFQ#z {ec۲-<u71MܽR_PB, Zށ۴jxFT~`ZvB8ڽ?sUJ@r\P) ~`Tj_an 13t7h% CaS(> O#oy>/cm۽P5Y$BuXm )~+ѝ$!c%7shod'RB>v&90K ,?)B aAI?ZҳEepeC[=~rExI/W/-R*dzAeI[O'm<`*#yHŀbot\xt <6%Y)WPSf+3L?*q/ޕQn{X3H2~pF濥6ZӓLzãV)t3<]#+\+d=)LW Jۥ8bৰHDݗ:ϩ`$iwӎ&۔j[|s] ݊B:NO݀D%hHT_8BCʇ|ғݩR!Cy}7nԿ>vE;0}ӋdѭC_Lzvm$W{6=Ô k]>"߾ab9k/rNFks(%m'Z_>Fܕ"K H_}7"}@9O&T.^mtf{jlyAyƍn{*sP"E@=:eH 8Z.6߱rYMh gcAUs'$Y5q0COVDb2ȊKY-SG8$^YO(0w!M~ ٕ @*TںxV`e:?^.yλba4$b ;pC⠢;*(.2 G+̻leTiD>ʔI(&ΰ*M_% B z F094'0Uc uDZ ėЭ 4lL/j6y`*^FΟ $ǭl ߕ ˫fK#ҔLZ|U[ss96@`%a 6%T<*2s4G$v;d@+~<]A0 2>4$v bPNl=w0%4quߓLTPh ejW릎wAhZj ^ӓzóxThU]{+u0:M@cM QF k0I45U86't|MOf mhFuGrƆatuzOvzĸ{k,Ӑ2Bj&֣DJ<ސkӁ(AE =GeXZr=69Y7paGKdGh_KkAa h#Hf%1 DhIi/"N0 $$];oU;R$ψ+l=y|v֬ ] UU15L/Ԯ i"#a 2x3?»?eZx>iޟ`K`a L?[*%Ѽ4-60,0<q2ah:& '9crX]&8pĝ1%e8XDS ec2jAЂPQ񾇇@6*L)`§'ʷYSr~mJpaX"@caG3e$$MK؉Д%WzoYn/ooגEJOt퐑.svB≸ ~~<Y%BMmZfvI((x4vr)@ǟ;nb5רBi}JYFbV :vTO9>V5DK>ڄY$eF eӻӉmXj+Pu{^H@dX,$C2Qf}yUĿ_du0olL HeKQJj: S#]1H|N(;ә.5Xiu[3?7P}Gz/ YF糟V\&Rx%sMR]m-;e(3.wafsOc2xhvq3f>J@Yq.ڙ\j-?7XJk&ed7/8/1 Ӕ%0Ә1#ěrV4PDB* ]`%V㲜9x5P]/ l> fYJ|; ؕ EO3bɌ8ܨj'2oP<{ɁAZeMX!re(;Og?iba/\PUwu_}GxѢwsN:M=\t߼[W݋-SP\W^)vd54R]ښH * L} cXuHwP!|x]L__ĜP[Iyk(PlKk8SX|5Z3FR Vd&ۣ-Ϲ-N۽[m*^@q[,4 zY raXI,Lĉކm۱߲}6~7^kJY+O+C򥧘vi- 9F|c*33o{3_dr.ZXu1B\se$_@)QB&me@rQǡi'J: tA*vvrΔ/AҝK4^\r]BT75EˑbB':4Ay0q]XI i&`elLv0g~-*o(B~ *B0 w|gDL?|$ZTn(5[i]cP ~Gr̹ Xn%PV5eJn =Wx}~1u,]-p]LO}؜G]I3x2!C7H22;>arˍ)?",/9f 7QMwicEp-u{h 0HNV"$mDMa+L7 b|^%Cf$ Y["{D/'`vv|\rA VU?m$7Sm== D`دE+YmyzH*xH4EۤvëbguY4~rI cKG@sQn ā5DQN$WOաRMuyխOظpct390gfl"A\¾/VKIy RD%4KH_E@XPÐBEI3zCBk>9@އCQAR} ^ă#` ^ےnGʮ$A\(3㶗%$nS~ES_d#BJT&IU5HoCKvfB]٧gƇ?p2vnŻ+ ׷yv b7YApRQ TG*5|!Ho,;Z8n^r Z}R *8RY53fVV\R[Z-rH_^ 1CО |E&s5` ^^IYĔBh;L4 ,My||` a}_56-Ez&HMg|%,)0!u\."o2FJ(xc3y4UFQQ޻[<<}G'= ^ -=\+Aa$ǂ&hvcK긎S^2?J.!۪O$#q Dv<璁LKu$@* YTZa t 58W4MO [:|W?yvſ^\ 2Ҁd B1jWdE;j*(H+C4 Bo+AɄM?g'1"7iSG/u&-gxʈ^ ӞYתGRÒc3.h|oPJ | 0 àIo;m<-1.{B&]^y =H撃M%4_|QK%<{ɶEu )nWYvݝr蛌odלv]lU}훀le6-_2(͟V߾rැ A;[cpkQːȢ&&w&M&iae\Pzv-9B1# 5δBh јg (@0LSIP.AHhR?qS;Gy"%S{1`-{+/Ӡ9hZ?q9;I_E>YL{5J JD%ۅCv:+g,_ڟbZkYuD kuic`ʃrD;>8M[YjbF5܀ʬh6Kۇ``.i 3 +?θ{6-^`JX&1ނހ0 C [4 8;pG 5KopAdV^_rk)ǚx)hn*rDV$֦0Rit}D'/8 M[ǖ,DTG ;姈w`GP\ZyH Wbus~_5Ǵ{vg?SQ6S#XdΒܳ0MMN]elDwЀ۴b|ni BԆjMٺbȲ̢$ēyĭ<ѝ^jVkKbgmNIǐd7S"f0M?C.Gtʡm YEafa*whKwēaB@QJopNN#Y:]ahF^RYP;^M_<&&\bMmXn|qA@r(.|;Y'}7sk*Ik y~Qvlă'v#Hl$J-WpS` 㰩A? ȏjT}xpn" 1_ d&DO`A!wƵ Gꡗ^]ο8 QbYXPG0 1Yk2K|+ pflrAM+G 5K 0.s3G Sbi; >'v8 ̐ lt". WtݣR_㲣3 f^{ی&*شrg FmXO3n gTfx'Q>MyD=u'3v AaҏiA {r3XAįsͨFl)(ᄁ\]lӶ+a#3Gm/BY]?iTIXTF5V'x$ h{:;L >u%8 0,Ahނ&S} DÎym{); yXP Q`GuK։%Ӹ r]\)Ppε-%4Z~( %$TM.oe^ yS`E oSjs {|w_WV!K9&"/hųJ|oQ&*rm5(eڠPpbtOeG|MrT<+3ʛ.>2"8gui҃&@`x;:B*v\P`9d yEqcG?;eʜ! i|nۛBtlT3(/*Fj$TiAq֔g7ĠO;%Vr$IUX Of8yLݛ/Pz6Dxz?.ZHwOyml0m'łn[Al {bCi!yu 3Դo4!5ٯE\!Q͜ݲP#K B`j }\sa\G3`Jqm^]Y5x/0{dFg@OlU4{](P2h Vm 6='($;yre\i#!{ݱ(zScmuD:7B:n}bēB+s"l] "eY Qi+-y068SQ]=E_N{p;d@}LsFA KbTWm#6f!##Þ1|6(_ @׵,!@uQkd)ȕ 0Ӑ+ & tBp9Vl F6U*(m}/TWih, 8"A H?g|P:Otb`)0!|gn'4J߱Hh2UP8 C[ sNw[dČ D9#^>7= T5ϵEQHf|t 23xSǩc;Ј ]kk+Aa5oc -ں3.@]8QH 9;6F""JUM h@R︬ŎuT聩Q⪐G`Uu Hi#SoQ'0hLܥDIMв~6G(Bo/ v~WM`W]>{tȥPzӾ-m]ڶW,w}E]ցώr"}^_b) IKQ\)j6ql#K˦A4r7f kՉs`gɌ&4*>8t zar%uN([ƎLB/ ah34U#knbim5,f&R%{#Q• ٨IXeDXR}(I(wm#;Gג3$ DU> a* #AK' ??YW"լ_NM){ ߾,*@$z۱JmGdco[@ޝݽ|&R=y~um9 Gv=dB<I vwf&Zd7)wݫ<?':a:=_1$kZ{u 9P@܂MP)~j+mt]6yrz75H1)!LLХb]O]M留r4H{[A39)зUx85n6QN.%@ۜeVCnU8wWa}Lɸ!7aI3=-Y U| 'd֓ll0wN!㲷CTl?vdQMcۓeHj3(i(c;hߣk0lTN?Y~T5M|% Bce\G'KE :#)m;ЅIZ $J+iEbY97N%!q8sA>Rpp Rm):̉N`[ G_z4/~'U+=pFS x=yy`ZA"a/Kle]uÇb2koɗ4X~h06"N9ޘ>h󄩘@?,>jv= I^u1/u)蔌Ht`h2҉{Y$G]ʭjǃ3FdFa:_ p[XټN!ЖDb?|Oc)qMH!H/B";ni=2鏼ŹCg/WW[dت S9QQ YQ/W(a8}i&oB cq~|Y<2 T*-ԥ=+z5ON]RV mG{oV5]'nñ^0U?ٹ-Vv*Q]\} i=@f$ ,7^j vk*ũ;X| prke{/Im"ku.Rs4R/18-!>G  =ZB1oGg~lROߎWkaa*5LZ5O\o5=j˳?ܤCq4;57HAkDpNImR dEtm L:JQ-Լw ^laq.6|]9֎A*/y߶y~MDvSax,L/DM9ڹwnޫ*H;H:dFX.j p/ ؽtA0 wMd \{H:=bN]/~X-c v @/ҮDw JXwW޼[-Z5X[!DN՜$o@66L|-wn#D೬f K NBZlo_܈]"~C{,^k?Ab&|F6jյ EKӠJ}c; t!v}ip`aU ֙ 14 QYco]3%G"~W3<1v`BS!GfG4#t5E!nR |i(SSY+C,J@r<Ym[ ,w~8ЦVuƫh0>sǝ\ē46M"?T-G݂fea{gȿ b)meQr R$'#+z3'[g0@ɭ!6Id}n;XWGx~򕺁db!RoZ#3aG ߻_EehRO<9AVq FI]}˺L~P32pK#^}}s"FhS8\W6z,AHw+1 .唯kt:IQ-sV„?1ޤ+1`jr/Rw ۯ!Yy1 m!qD{LM/\Zfb 2uCv{F=js"ZiJa^'{FM l]I0 _L[u'Hr8m (\5ghb]_j hxBngmp76Sɰ B*"I\Rz=}NM8eDIæ?z@voB?z7DW.\[C9q#]zRpM%Cf kH.3'6y+WtH3= /ΌpяL) k@:p>/Y@ Po\aM|&ϧ* e! 0O7+^D/gݤS_%OW,cE!?@#Ŷ CM#d g,av9MrҼ }zϡ=.V%F&֣)0pכf񬫔=/+k|N[ُPAۘTmŧ@\&-<RVDݎW ,U3AdgK-Pn%R 2N>0"=e*ՔR . i0;PBl,fOd 0nY4^~(s?MQ@#\?fAgRMZ}ZQm۔P1Vq\XjD@=RwrChZ5/b$@S6|jGMLNP @3+GPz<2F\.Uv~ r']גD1tDlώ$C7)-:,\Owӣdk@ݗ&Ve&Ӽo,q%m;7%W@= LVi|/Q2fT[bp,dK ?I'`ZRyq2`/wg(3k"#Zʹ` Afw(HrFNs(aZ4E˹} 3uQ21b=aӝ71KxortIgQgBX:"#M*g!'ͼ%  KXbgi| .h} E=M"ʇ_R^i%B3iqW ˰F>s&D JqhH캗)mYveLK e%Zsba=$6& $WRAr!\-*lj-WkdW]Akk|8il /Sy_!ÔXI5j+hW^ CI*#5 􍅪Bx:*wpԟC '>AӺy+Ė#"?q_k:(FRF=8tʺv[T5x${,|NBrW"-y3?ٿbiJ2N: a_n4GcW;k,UHUK+Y>=$$%"Kβl,*iMo/u8mw4_^;[Î]DHfwRr-/h]tS?j\WeQ8m"ll&9J"zj\t=B!;S<a4Xk|:3 dl?wļ+IbarQcIp5alm# 4SW|vv/!ZZ"%Țr瘟y8-ʹѴ.` @܉Q2SRv+.pU6ٗ]Uʬ >U-a`پ rZW|2 7ݯ-_FqMIqq98zŘbdqq=RThp[GRxYΖh!`-\ԮYj@ 00o^WUz {0TAbc%k%)I cI$n! U Ʌ<2-GڈovQB5bN9MsRػ[mzZ˦gT zܓ(I,G#TN\JQl6d]0?sjtyh址Q]$vT0cۂXµ[PC3n T0rd G'Y} _ }}Wa,f+ ^cˆ߱~X8g3/{x`k]m;Q`,5/N#_4QB1}e٠ P E扩(ƵD7H^܍ ;E'&Aqw $A 0o&;uvڊbTsG Us@_>i+@?tD{é'|c66On2%~Pg2kH`4ADv>2XD@%[gkB /$':\SCm~s^.a}ހCT?OǍ]%`7<\P`MYbMu,N6T^$˄=)>3^-!*B3HBaU刁ƶ  Z3{deC);3$G!IW`:ZvO]0n9\je6 N˂ZѕD d=:Ĵ5݆PlnxaoDCG SMւRɽAɓ1| >P\\v te!z¯/XǨ +__r+L>}NEh\Zۛt 糽QU? ;'J˔^q"GATน*]@cj7Z `9ܪ>oɔdǗz*.uK m9;S }AZ*H~_k(5zPʚl:<>WD;݅B3n 3DK?@\P Q]H42A颭\JBu_}B`V胬jqVfzptICu.+mi>؛޳Op=vBZu)ޒ$2{? ?fjO5,EJ?LM߻-*Jis^gkސ2 Kaa?9,PkkSxpw =Bob-hId|WB*}D\v{T2r{ID ┲Ia@$̶ /'| H v(ISJubS7: *(7KzU &,}{ ؔӲy )joEd=7FNJBhUAjupS"g '[$l\R?COYK ii)%dք^_ ׵%A02-R LHG 2_ Y.&D,027DŽ۱ښ°Gvo^ b*Vn]  v*S0<5P܉-C*' vaHF]|'=^\.nd>+q*!U+Ԋ喾r+`Gt'fAyzj=NرK3V0 >C9o~u- Hx)п!g@ 6D1$:mf&kpv~E +."dP!oX3*!QƋ!{Dvu %np"L7Y0v>#rn_駟 ~t5s5}DoM̽J֋?Aۅ'uK腉MwU]؈${@dY0C8Q'6!/Z=y1ݱZ<?WQۚ;#Y-Lg *$#siUz`ÈT9ȿx?"m E Ac %Rv6:U1X uP3UTI&{x](nYmȒ>^|g &msC"{~7NlUxo!Q"B&(YD_vp6cellg_a)Xe1eGJ)vd~z'gXpO vJ$z{=Pe"||{|V@RA@Ԏ>/&ۡ:hUy*T,,9x)A-[+YF4;%䠵u dBBJ @lfJore#<+T#4t{k!k$Z:la@.Q-P|"ޢύWcw./[W0H'.cvcEq%ӣoXGv 6,*I݅(]=h䘟4 .s-LAیA*4WmD,qj9`fZ $zч ^2[0bP&){ n}K` :h 4[IgSb^$;֌|A}SgelQ|ii#J9( 3-OĊ7KW쥍*}I0I$hvDΑ-T7%Ra/ F:V9yd 7DZ8qFrqeSTzR uYЍ&n:޶` raPHvLKc~46`Ȟ,pIeׇ<SW1'}x\qpaWEfL tt :cVzJLQ09p7'{TK?UY#t_Oki6;<&.Mr4nNH_sm!V~ h38LN;h(F56k%;6KIW{)H1W7P; P]%pP܅dS~u; 0 ;x I+8 eMD3r+A HVgJLW(;3%na11lمut9/մ-rj&^(*!NPsϐa^/i\eήʹs7(>njVrR崴)- za>adae?D 7<: H+Lu f Rw$d .̗4 -l5s )߅[axޢ$` ǫ00\)EmuܽpQ>0?b)CP/]BmZ(*Eg؁ga(! ]D%zb$"x RZqah՟ִ_غAA;w'^CUjN<2Ns^uDbN0!|4ddzg޾$vJ_NRJQ1lD.sCCTqhk!TpJ:g,ǚu*\Z3_v1:EMȐXo++'2~ AX{fkE@C Qv|`ĥܘ%[H}C^t^m-Ah Nɤ)1n{ N3! p s<%x89 JT_&򒠬:f% KrMERCTߔSr,/3Gv3tXަ떋G[Rb}syn t} mW9L`Jk uߔv< iXM*G^QyHo^)hӬj6l+!|MO5"Ÿ/[ײ! –a{n#=LBBWHhl`=(#az;+AٹZ܇'[g P/!۾FfODio _Mh\3)7fIH}|l|Aݦ$F͇mC/0AĄB&X2Bg}֊| 4Јͦ/xNG[اv^AnsŷItd#ƪ3`O/ )YNMAHt,b/ 8ꮉbC =o)$n'P%D.LR>e:|aJB}YWP$.XOda6tIIEf%`'y,e-An<扱~ zWGD)20w@:ϨRA A$n_pˏ"#f5BboNIClrcA2I ЏךG30cU zcқ 8[s Poe "Hq!Y@_K}` a@rތMwyDrwwPIɓyppЀרŭj۽"dWP~~Ԓ0܎J\ӧ$ʽ:zb!%mЂhIʙȀ͑`V.cEi|y")g `.` ^Ҝ"נB V5 HϊbJ=7J}f7+`JrA!*%VUr"f2wtgY5Vˈ;!H2;:GƇxG}$eq-yF{3hURƃcerd3+ک;?lϑC/)itBo^z3n~WR&`hQ%ӥP6,((GC69Gp P񴤄" 3}8ZNYnV!i4Z#8I?)5 XJ7_V`KsrsIB h`O;jVdCn̫ h8W%`n摾 NAkƀPyU`ƨjZ:W~.G~RZο+蘳dЛiF/B,886`iըe#sftK&pط{\RlBEkAv4aZϿPkxz<=J( +A!g4/=@j T$2#Ǭmgu%90c@ ;;R/9Ď=KWbX>cI[ z47^~34^7j&On 8g t' ! o\(Vį XyMM8^th<7rYq!!;WX `iUXɶ0bOŘ1ɰdKrwP0-bPcS(-r:Gȫ<RfCߒ]zG[W1lMIC*cwQ="P\_غ.`"?hukktihnB͋{5Q&m(=y) vnG?'];Ajg'?m!3 qV0%oPjVH`otƴ6gbv`?[lj@S~!ƺse *9'H,GϠ,T@X\Ra F΁"Wn[F⣫`3\8o|aJ 'i_&x+﹌Z,-P{i I-Bԣw3d& *kkt]I0  V<'&9:"]\U1jK[߆*wِIgaG,Ϻ󉷭57! Vo돢 ;2E *,rs@Eq$;‰'&p$2Wc,Wy&]jӴȖ!..;?E tDH N$!G\N4=>e8/BB,#]W lZ`h$VZ09$!HmKok/1`mmy* \*3y!2|d lWx9fkvĺJ\G.@" MobX~MW[Mʼn㨮ʧk"t"!: WR!1MExTr=岣3^X%  yLDX_ɗͪHߊGuPKnmxd)kI 3 )OCRx3%_161q[05AaZo7xs>ǮDoɤ İ9e_auK\ CeN i:;cb(sT1@TYy+[yzs)eK <t(@'Du²;N WD(LPE3q"mYGj g>RqiJ6$'ˆV}jxVsd̙llw*ok.J[i}5V<[||J& ]ct#wuG"C}!T递WNh搖uysބo?DvsbTeГ  0)]W4LS?VMl/K 6ՌA8,0cM (ebk+ U4o0'X܀Kيf.pM#zzjõGj/DD\ cJd-V2qMzi&}܂ M)aH fJiꢙ>1nZ&URR>Pђ\1ULa$QNF%' 'aײ0 Ò퀸 f6" $$c;@!@|]OYB6 @ڌT}l'J9Y ɉ { KM\`YkK/z_2rJhsi-U2;f%ni%yH?B%I1#F.+r$#\IDj&EJ6#+QrV'Ts_^='J)d%fm1ɬec%Mq f(Xu8^Q {noh!ч~ͻ  0$C&ӤH ͳWǣ6+$kL0cBIN\&`W)ؠ0|tDGN8Cbw_C88Ӱ I3,uJ,x%E7c;po2w+Y^&VN&i{qAkiOQ'IlnԚW炤h ڛogi^ρZ5Mpf85G%!KI832~Xjvk?;s,az/?k[H"T4@cl-3_GcX|pӑk`vé¡-EPc@rg#W~rag$$-={$Z1^a iن) <07EXYCʼڂ9/N`]Ԝ>~"CO {KKZ©gռ}~dڊ=%yiJu{?-X POC]1?]HB4BBdL<4SO^Mkv%Sȧg= @լ!ðUnD'C=Y<]_ KXF:ˎW T;k:o,Gpj#xK'VGft'Nx -&T2J2ޣac.r,F`҂e3f&Ddzw%0__ @s+)6kcK$믟D;x"uGD;@:?ka ?|PvK {hW&MET .98Ĺcݻ*#?-oO6T=ݓN[`0 ˭=q"w 3u@dblST@hYw C (4& L&MX`}(΅:qT?-^^ѢLϮPG)LdnQnzxSt_\bl1bvď(\Cjz#W[9/7&\MwǸvn_aۧlf4vNHc;wڨhS_| gGOmsQW* F)4}W`w81نJn[=Og'& nمU10^RhyUIs3k+% +I!#0&qNJpc~NV̘|A aeǼOCtvrZtNڜ|M)E %,q pv_rOˑr<).;L'`pwE~~M{Ru#eg0 Q-."n !qTuIb{c||P_򬄈?@a0^R ~HsѶY5Rf9pAe14#gT.ڙ?Go"l9m6w۸ZB̀Ԕ{y r3ek @&~P0Q^LO>K0MD >sC]@_(SՄEuA !RTƸMQTbʀUãusdxzH2z @ٵ @h5&caX^&}. W04 XEJ(zD b# xLI\F %LtEHxAΠ̍qjȁ.B_sG##%ػ0g,'Xx emG%YÐ;mW3qn1rEȡշ Gid݃oS8`pFZ5b0O e?q'Qx4&F-km(Q4as"'G)5D(͵&h&IP8 >[h_ЉAz| rAXhIם!Ҥ J6:ub C?$AtZ򞶨&ud*X[덲 A/Ҵg=;iQ6@1)3<B_BJ-nhb_;xټH1'Fʼj(.lin%ޯ)=Bg1jJ3 p2%vdWHeQ@#IRM.S/E2S =6+ i \zd6}Tbu[7 m @TlzՓ>`(9@X0G7ٻ.?S4N=}A@τޑjr^33gwbQ)5Tezc-.&OڲC6-2-D#_v),U;K% LPP-/ɖA&+ 0d:PmxVG;.^G۾(W7ﳝqS @C1*yC6@^`27+MjSH|싥Orc!$ 1;ZׂnӒFұ@! el,/^Q<͒@ vFjϹՌFNk 7o/YO!JTkDH7(2=!42iRp(P'r욐m6E1&|W8k껌#Ƅ$cGU?H ޅG< qP4  SW3 8zT 4=Hbv@hIM?i38e&:7%q٫#\%X\ٺ8`n%L9 i EoTi^MDsAE+/ HW}ʁ;& _+A6hąH1qPhG @h>x9Aۀ=xXZN Thp3A9&KtlңbvRPQc^֮FTM ٯ$`aF7/3@?! 5ҌRg a; OFA%/8kq#Ц<~#0Iѿ$P=,.Te9y P<[<7x-K>Z81x^+&b[;p1~O@ڹ @ni$+D_Y! c3mPRZ \ OiKnJݐP!'n0]y@E#r'Nc44l.,$]YIAbs;qu4&!WaQސ ޜE: F Q.:AOqHR⪿@B*tY+w`ǥکHiBʍ"l%IH^P H[M$3L?/_%-c#]I0 D= Q@TH1'$u;vgڟy&)>У$ilvdn`w$\w!HĠ-ҧ!'Cϒsto )T'{BP ӣݲT]9{ú z)^5w*y!c;cX*i gmo@MUiGJ |~2&UяYȥJ匘8&u0ES7{wy'F01t}&DH<(?vݨ䏞+&+1kHmxJ̰]s!]GwoA]c>v%900ZE?jZcO޸Dq-p r\Hx:LqO8Q ׋a e0.-{)D1d nMШ n@{K.ag*1 ~8ʰ;}n^"bcuq Xna-Y,V–/?Vp䤒Vzx?X@:)(#,]OEvXL2@Yݻ X(n{9vٰ~J5G*cXmo;ƌ!'ݾMϯҨ^-f#в7[)u,SJOO?H;TzRAܭN/a$L]~XU`2ŧAӀ/TeS6C.y?c6OR֓˺>w]uq:!0p8eY3h}UtY Rd]U!r5sF[8$ʜ{T c [[0i~+xT|Z:}O @oRKéAVk`xM4'*Xj$CHDTRB=dOb 'ڄJQ E=`|@^H|f~J*<@_ ?oXvaZ;  GP/vJ$I_ld$|*e hX!Hmʀl&StAa^lURPJ`jɼPK N<p$:}(;4sDRDrU”p?KfΈ L$~U~)}t؊A%pOJN5Xqח~/09HC)5ZKI/%L`K,\Ԙs/v1rUȚ((s0> ؜FB,s아eS]/N?:w?vF90 'EBAҺIO ikO[6@A?Úz]hBnb@7"%a Q kqf.zF%uڍkW1ߌߕ W'9DR~hdh (ݿP %W1[\<ĞN#u'GC Htj\ 7acXm Na Z:DϽ:Dˡ:Q\<0܄ԀG2YD9Jq\OH.稉n刍y u=_Dt@rv~i;+Xe}a)/A6T-/N?Q8Ihn2Bjzom(_5 ՀM`,[xJU\َAjem>=&1݄&`jR$)>*ѶQݐš'K?v90t68U !:)'DKgVBV+z%يp ށoxѴgI2ψ%Y78B "$q9a/leerEB;]uG?[fÍW3! n=1< ^(QA;pO9/üF_ICP{d ?QNݓ'H_趠!826騋鲗O/sLX'Z 5=O6Jd'k>:(}e-@e 7jK&:QJt-\CߚF:M3^\N4prhC[yMҺ?{ i Q 0 Cݎf?+/6BRl'[PJ!cKO}.B^76K =Ж;MSDu2b π `JB߫1S0d<1/`d{C2 ]D9⨛9> 4^J 7" |*zN넪fI} H;jS8ucWo X-l8c<+Um'BonMа9BlZ7UC$kMWO6O/le#mg .,q}ĀJ✟}KÕz[ BQ2tMϕf1&$ߪUQx2 \LbjP+qJc@wap쪟P\]w{n˥j)'aXHRM9E]؜4oޱB{'7, 'QeD™LȔ]ز/!$Z!$c ]r{٭iP:i!z0Y@#6->n#GĦb? 돦ezMk')ʻ/-zFVkÒ[a觪?; Y~U+mWӃ ͠D41ӽu󪜀Hھ?KJ*l^8xtS]sJ\eɤON@+T%Ѓ_3ty #"ʼn-pZ|A/=MJӞf,u%.6LԓgI }v&g%P> Co d8ךua&S"rA)Y/n_of/Gpc.Q %Gw2Ԭzx71gc&kGyߏ]A0 [ LpA2\6IdC.c=+/Nr2XD53!: /@Þ/1Z3j1-$9;*sQc\8]9U]w2פ8TdD$Ż{0E๩TuiQ5,.c.:I$JЧd=j5V+[i4K3Aah3@H/I$@`5k'?p4?uD`5 }\DxǞ"gg~u{ (apn Ņ`j7"UY+RS|"O&p? |-k4` J ]%SlF$M+ # dEi*"[/YlR=3b%T ,;s-€ʵ]>)u7\Lk9(aZ 6/*++M:|7E*ߺusώI&wL|)ҟ@ D;B?lem;ܕ v3R 6ȁHaZm|1ܫw;APHזs7 pR x{pWE#4̼}j49";6D.#szQ!hGuY#I=ZջOΧ86j!΀TȺxٙ~N5sa)0$e(qHZ禄ajL5OvQ$ͬJ _I5 VLREضgZn*-2.?\czc/_h;'A|zcz&38]q,am0N̒@mNts{Cef#RZmek=W8NC5&uny-JGYf2xR[RgAdri5SV ;6 [qYX;KӅf$G+^w4>FKX~ <8ռ%>Ģ5uZz-|u (kY&*ƭBUF fbqoų`A:jMuvG,"n2?>v-;1Eoy1j;cU@Kߝ:6. AMuuu?Jp\cp*mT pzlZdZʁI\r_6wY mČVxXlaDs&f͑re')ҡ~>zV廯 nd)k1Σ8=$"0`TFYAزGJ@ҡ"5%8hMZ&~X㛍wKf{'ڨHWD=PWpmU_ʭ&kAa B4;/vBZ;N '58w򥏠t3tu Luv;]G0r(iHk+?iVֻ{ &24䃫[ˀ=3JtkaN S~aI٭awLwfU xƼ+{sLK)j~.$f}Ib(.BFQ,DNWTW27kS0- 4zݙ q-9,m l|SbGۺ+GB %PaՊ>)ia$[C:-/|HC_ K R 𙷢a8M:?n ޞ`ҹBt_cnԦ<xru.Az߭*5)Oh#@'QЬfI(”ߴʧ^<:J@SlInm5#37 Qj;+ J>E%X՟EmǽO ABHH~\r"R0u &²lqqױ4KoQ+m粃 C^ta$҅w=laioO.%]v Q;wa-hkoެV["v7茎st!ZA' .ykxMx 65gwXjKQKzb@'+D\xnYxcje̊_PY^$x7y¬B|x/3,axHyXH4x>1P;x7£=]\mM|Ad 7LHt*;m57 ęT ;~~~Rrj#'mg0 BQiLu-i]$o;TSڑroо!y ʖ䕨l52LY8<DŽ:g Q/bApf#9 4S{/C*g'=fDc7u ġXXig R2am=f)2tʥ57hD'F#Ŋ): &*ijA\GĦ)252vJbLʏE>#x0;i4|=JR_Xa\ !'avl!R'ݮ'љO֥;]|~8!TZC{(9}-wZđG!aŚ'N8ICx΄l_Ύ5 G2t]9B6Z3J gز!C%"mo6AcKYJ*IŪo4)لa֕odwv=L(֖ۍHy[ɃA`pF=7a%wj+}p^fbho}?,4d<]W>KPEvbuct`긎Ml|mpnJodokGFnr5Ͳ1]X:k']ME` #S><}U[$}:CBLGԚ.'rWj.)x#.M|Ѻ14QAgsO2%k*oȸe:G O)KlRasSˡ8LT/,n"`}N֏+ϊ(ߘ:z=XeLҩJ5.P}nhmkڂ |0 x:HOޮea5BF.7qm.,&z- A[d?<|wy}Vh NR-#T,$€=ۀ,푺/b3~јpg% ΏB3!a28W(fBG^X%J%=& ȼۙ8*{1TfCYV^ŽumlhbDF6aٓToUIk?[R<-K/ܣrufRݖfs]ӱV#S:/ M4ckAT$;NI{ 3t!gw=Vd h#%oKCWo.yS6kj}{yάIAZoLl1U bYE(P PdȰ _hD1% ,Lg!D#\=4lPmiT找 6DkC2ه%* R+ܔR>)I(zyA/#E(T0Ai +:<5hOzc']_6>v-;!ZCYLaK/6caJ7t<+b~6r ekqp ) Zo ,(|c×g>;֥_XaGvK }1c.M8of?EI#4y;֢.s!Jw4 4a4Icz+Ke(qIɃJ+LIVџة 4xW1B厃{c3o]+@&L,4k"vb]g6=8ᆘO䬋t#bE˻.v6~#P[]2Ro \hA ~B{;~8Sev#33`( @ܵ HH*AZqRuT5NrD~n=  (908=S5ʰXda=P:0&"p:؝1&S1 iIJy3Aw0}cu>ؑriB`u(;P0Ȋ4~SRI$vIJ2¿ߋ`FFZ1 b{ײZG: eqaD[3F,8YZ@ƿPB,o/[/O ɅLs>w%)A0(ѣ5ij/ԬϡF g!@dR9X'riWkhh4ޗ`YAgZϾ9VK "slc`\ϳ[3};yYy+ UQ)AcC}18hwI],F+߉|R3fs;L'@.}W*_>ɱb濅)3?oGaހ+߄0!J UJ:q>y ydD !5_TBӪ1uSi -Y0z8 JV7ʼ[ esn[QdB F?3}z`;mRj*(dvIDzv ;gj.Eƶܧ(el>Zq E@sB)c;(!Qԁ $뻬G*@%8! cJhVz/)gGmh>/+sW@$?PI9 @l4"PPVglYQ`fܨ1&H2 Lvb/֜:94ы1AAZ+K(5&-%*$PX_q)MO.4ce%]0a/22^P77#۹K"{Ks4 &h ~_$pa]~S.,ҏPyntVq"qU99+Xv:B_~O0w-+0 "e EĭM'Ykmyt{/6S63Udx ^ʊr# [a4[(Up/9f[,sAaK"Y~ ޖ>x-Dz樺LKiT,j -GYHT'XӰtnỌErv68|m%)TMM;rIl}*§_<8B;ٿ5ڽ}ki/7ca쁓G_̝K@ CǕX !\ V|N&N@-bB?+UMN~zȾ _9x N >{'D7?gх: wƕk>鹃$7V`dP fBjvpfYvf$[hfYuۂeZѲ+AS)r)fj;`ؿ/~4ौn-MTV M cSp| 4iG̋o_LVA!W~oC/٥3saat+z[v,es `8D= mա.:'qM I3}׻F@ޛ:\6.!]b]/uLtl:;XcPm.l)sQh~7Ĝr`X73S[6[鳊=R 2QxwM:=.It1FzួŨ댞Y!YGD&q?v \%}zJas/f?'|`ra  $in`ڴs*h'f Bi-bϜ_jjT6s* ڄ\qd.- D& _=##*5)NP;0 Ee m$lL&t٦j y7AP5I1cFOm{? :f[̖N\A>-"~C8lևJXw}PgsqCp i$}5T/O?0+sW@ZG"x#xA+MiFvOB6I_ Uoʭ(n(q2˭ha(p`P,\9&l)0h1bjoQ(<@I0u0.T@(+r:@b x)oVE>[Di , yǞoӲ&(L*yRwmnI xHq9{bls{/fX*k|`@0a[% aՅ?h]^l4О a>?PfJ@,p RVO}Ă?Zh5083N/uVw&21+?@;&%XQ'u|N?&Kn2D 0եsScGj+3c盻U" kEE_ԣi뤧/g;/ZѽM `V[oi>T}W~\;aq+B,`=vz(2q,0NB^XZ!D3lI9&| /ۏ޻Q,t@5`C;“1$zLiY \{j@h,mn@jkV4L-\(2Nڻfg_mEV~wń [Ku#D&lZq;CKgvÈpC&+ ~Ojb&&L_dNLO "`rS . ʳS|~ WX@ @h&&G`Cݵ, =l, 34x r1:4 gZX%] 9kSw ^j1d,f dc yʀWbQuWG 8v(G"Q@#]/I  -μ)vcR`'^u~d$d.|eX'CKE?}{h?'%C֏G%a*X 4"oUJq! G)"aD!w uytb+rj!T"3'的'nF} :/Hw$/% S-, =@8LÌDN "lʣN}. 4VKCLN"Eʀ0G~lǼ Ȏ[~t=P82| Q?-Ao)Y,YnaoNg4A(VDZ7!zXG2({4 p܉oĤw exLkeWavY֤B|7R*&tJG|^ԃ;oxþ,?GaZGQI> iei4i /^sU7*C| `!"8T|jA\;*8bzz+xbaC~\PQ8ac KtenE42[kQCNb%@FwRՃQv T372xh좟*,=Ad7E:~=}c]a5_oy[@ʐïW%A:v\ Y<W5% pֵeA8* X?/ 69fjND/zB+q'>ےGRAōCݻVe^x$ M:`Zb Vc1ߠx2l;'!wLpKw1qИ0㋞Ý$}%OaG#@6Ʒ](_;a _T&ezӘ@ޣ W70^8Au2-MsE81ŖK?k9" z*ڃ!}Gi;bitLT9 Ĝ͉> q?'V\,CSS|w0-mR¹{+¡{z\+؊*{nښ//~]w6Y1a syM*t`^g[բT.i!NAeG*t`ޱڱ{]N6 1QJ E.7Ƒ"bfVd`tmhP'KyٽLO}"qJe X50:;B8l F{70h R{K-ț.db xHsqq$^ɞr^D5@-쵠~xzGO u%c@MUGDN#!f8E9;C4m H.f?9jJ{k4t^7*Bi9v;52?`Na`[-ntAD%6~@. $${鯼x*na4A = '-<]*}MK4o+82nG@eQ` JBr"QXHo:@GJs@vjD,#٦bՍ7>n(~f!K1Y{`\rA ZM5~b`Iƭv >*Bcf5~Ey >.z ,[`ACh'u@%U0'&e'N Xz0 87‡M5O@0 KU&g:NlM_\%'/,|p/O%{g a~4j4ִܵupqZ  Hg ZB2ILaHס-UMŭ_+`a|ڥ:lo%0АbK  |׫gIp]е.wv~v[Ϋ$.Q]N йC0 @DGZ#ܾxP0%g"aGPq5Ve5 ;Y|MNB۠Uy5 o-{W0e_s .M/~ Ņh d?B-.  k# HrW@FV^ArƠ"3'D2XXq>>/vSDvCsA#c4G @@ Z գVoF%eav$`ͫ(ξ VAv@.vԹX˔f{M T ;|QGo-sI L;u8˦#K!e72 w1Ls > b̈µ8cX !O8\wH04i 9q,PHBns J*e[ZXK0E%MZHK6q(@7@&C> ބ -zo0RO 5D=^]:{Y9C`\Uύ7[w.G t, ^bF_ArMȬb2jd[AxWm)q(5Nc ߺAH7~\ ( ks5o *룏_kvͼO@77!C`Hij#F=e`=>0~YW1!H YP<i @odfGސ(t*3 wDg#]&>ڧ 0,eYD= E7~T>QeFX?kӞX<ߝԌ39DyZQn(H @x(9R۱^'S[v{'#f EzH(cu?/n _8y)_f }f`4Z  F TѦ w êG.cĺt?M !5.C>p & hF,rT/#qUH}@]HA`k ˌO--Շ`/0 Hh0 F|1IENDB`bzflag-2.4.2+ds1/data/puffs.png000066400000000000000000003170111200563112200162040ustar00rootroot00000000000000PNG  IHDRx pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F4IDATxv8k{*?Z")ϴ?$XK˶,UH 32232ޱZkZk^+[ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ %+>nZkZbm|hmݞlt{~ӭ5e>d B]h~ɨO&0)kyDu{u㰏ce88$LpN_ 1\k1&/_y1k1=;9$Qql3j3k-;1nFg [kvz=?"@_ ,oW88i0*#Vk~w[y.g8$_EXNנ3) F ,+PoFN[g9g  smb1~VF- 8h)grwBK8F׶p7~w}ğ@*&q_slrfb lsoP3W36$mlG)k-grIP|r|Ѳ {@!#f#N!r?6@aʆ єc޹MHtf$H$pH&O8ٜ!(hO5wLw %.M8B |6:Šk< δ?(;p.c]q'vM0h8;CQN xh^W{ZhJh}O+=(@A +rMu\|qλ/f˶us/==ἓ΂-aM$1CC6Z}i\"QHǹcިuk3"}`Ox03YwmN6Z'p*كqސ-tsXbg{# 0 }wphaqN\:X;@ Ss>_ټ_?czuk#2[7Ĺi08H;çٱ»00@lhp)d؏gcW\aݡ'r| |'8rY:FNۿ!(89Le"x XwCFFA N6wgj5PY`mRDZ B?qcWq|6Ψע&yF Xm9k-^8\#Its;)RSTΝe"S` HwNl_5N,Pde)ZreEzتCOb=XEX'̕o;fq 47X o&{?(ũ'. B 52G8:#{ws@A# 3 ]E s[b6A#3XfYEp6U7g7bE|X͜/pݥ0{:0}ZtSZ~/#]-QL{!+, "H=%jj) n{+1;LǮIZ ZoE쀞%Ip^S8bb\G2 9p=ܟnXǵ! *~n[okܵdc\_ozkԛCU4 E \%1zE̽{6е5u"Z>5`ȲD.=Ɂ s@ǯ{ [.żo ai̴?#(s epCx._[YlJLwEo BD5B ЛD0Z+#qJk* (C`^.|`\bH qo7h<^Ÿsk} Shq\ا̭H٨̽g1?D]hNfP86s61Z.TǖVs r]_<̙;|~x@ӍݰjzDZ .?v|qHa.4akCt;\yÁ FwkѢ:FZN\+@`)j N`"5PN$!~.ANYF9pdH2gPkZEݼ+ \ho~4D,pU 冹&T낀*׾)`*0h`gh>8tAq.$p6~7T A:A8ר_ ,,RK}#*U^ww0h'w)a |?.,=3nind+`q0ÝF.e)OE: tc0>9ht_ Ra…~ Р,5VG* p4Zr 2y*cVU쳰`Zr/y6Lha ~lp3 MZkᄎ'?aVSGΜ.n݁y0+U^zBuFU%e2z watqe4\O\6.A@&u1,1X>WP;RFP+)Z My7 vFsPs~ڏ=:/qHQ$*}_k " ho6{)Ϗ3\3#Bn7Jx=jd E: V!™0pWIVG `]ׅx)pΩF zk$rβǜjSDՃvD/Nim 5"g:_؀tn3E u7LR\;0.3^#`8s{0kg)Qa=*hifjÒ^GQWy.B] E>,FY:{9HaNc@ ӎAskKk1晵i@?DZ5L q?NJw`1B%N|ߩts3ȭr& `H*B5qN:XSpo''C6Uޏ 4me\*8lGw58\ANP M6FTT^ .10Ȉ\fk_4.LDɍrwj I~]6uB7vr HdU.h%jtm<'Xn!`.଱OC<C2W Tڌ /tbxBXg"̅=rfZVjA K#,FaS썶1}]<-"8E/dRcVͬƎl FSnJ5 nSӥHnl`sm@W Չ0 U,16D3?qX԰uÎ~E;|q5u冹5 a3:j"tgtxZ3@[1>v`x+`^pckl~Fvm_3yr,>㜢ӳT5^1fݰ\u\cuYA}ÞQ_Qz08]MR ʅaXl0l `V? 36(v~3@KpJ?^JPk3lAl9{L@ܨ"1~AxDPzX,I~OMH#hK5UܧÂ\! '|0DёZDNq8xGCX*\P** `l#̆sZ߿#O@^4EeEʌUF\8du]5q>;G3.DY q.)[<2ޜW(u@"!.0s6)⽍O" Gip߅w t qM3 _t/=X=A!v@Y5Ub/ykg!e r@f9JjE!ٰxƙ#8xWFby-uBGY#wS]:#;})a ?S ކ9iO{(cs1@ _f"xM*;Q{yd*>GFB3.D5`ʾ DzOGFj$p=\&NlMZ4zwT &Է:uW@7[>@@)*B^~AJZPY&2|E9W#j #|8:\D{A^Ϡc&W/77l/8$ްOQЃJ̵(bn`,\eoS}tDlàa8px'whtOE /6DnY 5;hBeq\ |u:d(E7^TH27[t?`_vmj@hlh/1rj`8xnf/ aUg ?hmHqgth4% C< &Gۏ+H#pJ{grgWk+_ 5's~̓j"rM֋ya.jaؕf@އG? ^mgG0gT{p:r\AG;ࠨ)M*Z#kc14ٱr/<ƽU8Yv6_kRz@ua/#ЇOh>nCAql oǫ#ždklH]% Bd̢=9>sF&@\3@3W40,8ω1Z ŹnE܅~7sSa_s,=~F(5 yǏC@TG۪|MDû\ оs|Q@0w\ppf 3Wm0<t˕0T斟?@I5S).Ιàl3 s\%Bok\Jc\o814=N >/F1|FO]{,@p2%.FΥ`X9@Ƭlfr=#e 85\p~gS~n٫hv!ׯII.-\l}\..|D3!  J,6[J=U7d R"3 \.<>p-fh (6$VIF>mÜcըjD8X 0z=7~.vwqsՁmڭb ǻ|&v7ޮhzNj"!rS0Bl3bb4͵*+勔?,{RM@<R,3}\U_Ƒ8IޔLm8 uk+JX*t(X]S-t8> gqэ&P7\L] %Fgwgr{1/X%`錷k>[U@9GOF{s=[*rԹĦ~ܶxBG_$U;ip&̢>@*.Xu CmCGBb# 0Hu3Qv8) kfCL~aoo[mn{8 `vrpq]a&7s{_Q#B)6cﰒQ놁9Ыzvyn]R 8neFP׫m@I^Sv5g}9ұp2a00Kt': {`dI-( (pH{aB3L# ZI^+*hFM% .an &bDUՀ0yj/!o(k&OvTWX5xd1JHVq|\ as.lvE}EpF҇Q W;pD< mB-;* zj2|~Ԓ4s69)91rg".ݱLejgPP{IB1ơ,|ǹfE6.&2e# uSG&~h0~2pΐy(c(*~¹ϵ2W 点]+㎠ ^&*NkU{s}2 ~^3䐳 .~tH <`r,A-B!,Gd[N1)(& UE4NH{!!%X@XWCQ0#0sſsLyvZt#K]nr"?MKyn=IbX6Tq T.׵:bEe D{40p^69cѩPU lAF߻Yg? c؎YS(A`j`'NDiiY+hz чZA\ũy Fy3( hT̹:5zZjtZցZDmEV;dh\pʊ#g߂`@ TKp՘:"?J8*=K !vVǩuǎgì{ vyK겇wnhSz ^[bWTͤxN:_`4s{DԢ:lzT?V}IbZPJ VJjùGg&gE*WMR,N6dIuߛql>z#}'=(aK>(QĔ~/Bs=戵{{\sux۷g*e_wTA2)]9¹~zeSD5εRmM/dz,i BEhQ1}5EPWC\:wÁ = YtxFAP ]9 &95` Q#Jk#=^_Z릵Lrh"ޟqcAh5аݘ8jV!PIdScdCگ(mbyX gF(΢C 3=s]q5~\ D9fb{qOtFa3hdzǬ͟LpUpk*.( S̪ـ'Mѿ%ppDZ@ F4K_}=8gdhHT6y~" p,TS᫭ݘltYK!p\", #*xQ+FТXג {=oQ_  'ZI$x.Y.w K/ll i]G<۝X@`͹H|-iZ*"l巚 & ؾ ZUt\@FxqƈY{8l(vuWT,#FPQddb?m{TEkd#0TM <6s@7;kgu6Ø@Ҁ:W&` 7:wlUgvtU&`A]Wg/tVL 椕(h q`%:u蒢9RJu4C\1WɅzll읛hVPgfsp"1Ψ=<0QqxN[S|Kї4Nw~7S7FKr6E-epP/8q7QpNLS(pu`ӫ9 `GP4@Sa_-̳+0HAa(E\z-IZ p@SZ gd}PvF0@mAgyq' nrsT%B "#u_j4mnr!@Ph4(HqHm|878^u ꛼w$n)q6,ψ?ㆳdžsҸC 9:ܣeLsqDG2Z|-3ZQ:2Jl\9UlΜAsgU. >|A#RM%Σ  U0v5@M&8z䉻aٛJ$UQ tn&B+l-`!:"?G≘e,8r6~b@TvY!ѯs2' p&A0YݎmES+;^050:z`NXˆiFw7凕~ q1b[ZD:Uy\ ƃ~9fX"HE$?/(鸸*)w ؾk| diAP7ٌ:[5w`;~a6-fZi3_| IfϑA ~:a7 ?Ga,rp󌢳#D{ .7'PtycG㢛v_: bWQI.ul䋜;pR={g H dÌ05UY1Z*I+m}b9Q)GBCZߔmzS:p4x\eb8F*yh*c8kJrܓ?6CצU$P5D)vb bn(j & L ;klL7]x1&52fURWMDIv7i@Q wUEY)|+k LEIvFՀtA;NuÌ"@|79**{b'FWL>hU+C D,f(8 0Knwor#_C [ݴ޵ϰcbpANޔiRAµ^),xNn@f**".>܄8R;La> QNԵ[/U YŹq|F_ Y$qͪܗL\p-@MVu$3KR$iSAqD6K5Mnlf$&KE<Ut+pceV`ߦ f {op:uKOPo"_k z1־4Eٯ>B"W9R([U}`n}vvCI a\`R  x-u vUc$T.Ν;"D$h؉iL>v`ì·9-R 9|),}΋> e c(6򐃢nԲd1cZộ ;&A5:nty'aJYiM'w$z]>3g*6_z0*s3E\^]-.CygNiGna%f@oHaly4#]}I`rSy =Ί[ 7hY75(v6w+70=* rTCw#Gsp@!Ơ@`K9H]ZT9qcR4j 4A1Q/qC@#LL Ha6 4]GZܳfѶ8Oyq7Uw'Ìu\ŻnDڽnRM]E~UPM N!ADEͤK=dA]rY'DcP^ޢEɑȐk=e)& 4Xᳲə?3|q.=,b3S`\pˮZS;zbҍWJ_|#c{Ւqf9pDpSy>{<ֲБWb&Obt\1W6)?M6q5O\kjVb>nGL)izhf>w;|^}z՘W R8-`>ꏰ }>( 4z\v1 p"3w<ީrN*:P)zhpR5`؟Qf$ݍ2a#SABA8wuLF.¶pG  ۫|A*x#ѿ팋^:fVН]$[ b\.z.2Uȝ{ hK a6j3saSHF''v>A[]K2& /fb0 ? דވSRe?z0CGd$b޳Hį4m砌BLsbhd<0JL*čP~Alr3R5"}Ь*PaUt1*v21 |Y64><gytͩffkt c:@݀i/(VFMvj6Lb33YqJSy1[=Ǽ !*p^ձLmg ۈ9ό߆o2lVl`1=L*]%`}ZHˀ0AUWMlb\ X ҈_U67̂i \~ip//qŤ࿭p"'_gu TaZ͠Sf;V5㘚CW;Wq`3t4^$Jz*jxycWϣs:bb''0ԱRׯ;|Aa-}X)0zV@xT`>I1d`6[L/M9]G"h0&Ukt:*kUϐkxYzsݓ $9f~ ?nؽ^Ĵt=`5@M|AUE0Eu_V:hH0?Pi]LY ExCPZ'y@CΫHB9t_iIEXR!F{_d?8}g&0_ "eo0Tr'LWF@.Ifw#tSuis]"{9V[`W0:KkqUd=Jt"W %(\QSI kǕ$;Gbp Hpw{E4!qD͎b|OtYHOtc4rzt@zg9=J71Y:Ell 6U+5'c8dX;z;GbH;&r%ȩ2esv lwCaJ' ܂56j *{= 8D[TN&]{\#blRv@,X>94GA`S$P= ^}@5_s8-ȏ]<%M+a4<fM}קƽ1Ӊ{quyì}vf+1=6U-LQq9EܚN%Ɏ "Y.q*vqNnrs_ӥPɡ2 H$y\᳆'?/@)|V$k8(ߛH#.@6qou¤^[S.Qv=o}m PkfpMJ56I#WiZ/?XٱvnqG*~\Ur0?k)}~6#u%0!T8Ksxa[.r*+ t̓bn)43-47%9"80]tI=|*6<{n '篽s;-"/]as9w}QaӲT*qYW2;s<[`;fL-8XܟE5AG "% P SHo sUa(BMfS%? [LΓQݰ*N@)̉Ts:L$ʠkMN.Ï V<=[yE@2>gqn彘êQVWD>ިaN;M(^?\V\n1= C`RS-Ier;`|Q@)i F03=L@r]Eٰv0R );:%Dvg\ cfph[q6νW@aR$?o 1Ck܇wS\ˠw]$@a(iW0аr_к`4?nf:AMs:@܆Yڱ5*%wHydkGu u i7tF8:O J^~v4D{ng)phǯ׵FўN3ł \m3^2,ԈC҃ ̭/8Wk@k\.<.EIȘ 6ð\9fJ6R?gퟤJ}T7vE5=mDM@J5UW (㏀Pd<Xo&DWԁwx=j(:W|M.CH|Ϡ`jעU] yDM{s9طlxfq7F$ ?wlҍMHmIsW]Aa6u 6*VjvAűlnghfTμ˹o#)\`. <j"%2`)Yi @':ZЧaܯ>?YJjw6Qp15zGH|D*!-9ˡ}`.4!7N\۫4?J\Dv[(zн(&9~V3,h"O- O]9@P5ꝸ̃\^)9O`Vt&+7m3]M]T!5o0,XT*wC҆G@sLƱ' eaئ.v<6r jь޸TUn*&ĊX:LSO28$v uCP0Id7"Xaj7ǀ? M.0z8|@/78Ii.·kD@j {SfGEl,ϼ Pm~jo&:a61sj01!lNl2&iZt{ ۦT} r\7 7L_se7՞i"JS)O_b;U,&j(dY1wChq:- !E r(M6FvT!WmaUG]0Ast7NBGjg׋]}^ߏW,4h |jebsQB3rTDU'KwMY)(rhn.Ju}ps d4E5PPfY-V&ԉ{lAuq>׽ ìAE6 4 7bi\'#m8o0D_L8H7K7,at-h+lX  ͊rDj&|"8qPo5"UcGZLT^CW K8*ECDpIP^<2<ɀí̜aH^*An4TS4 S#]fK/;QPE ׵F0͹^:|w2"WH:[3$:fENдR!PU *.}H lʲjG_SELMf]&af@I6|AA1Rߪ ")W_ѡ9 =ȿDnqY~g ?m8,?Sn8?}`r`\UE텮ET y^zq:vC7ѬSˆӴ`=uF&yqNHE3:D\{$6&uVf!_9"u s0`S&2zbpEX1qAU-u&בW 0$bҷ9O Ysza^EajWyERn{11aVYti (ЊgWރHClb(^ vGz7*sx& bh7cu>|1fNhꤾQ1T\p\ܦ{rn~k!aqnټ,zܕOAKM@jonxN "nnDY'Sgu@[fWb_ʩ+uzݗ܂쀊@0JI;:"ҥQ5HtT:frQ}\B M0{tma-p>H594Ff}5Tkr"Ca MQ sI'CnpF=rJj7;?o^W' Esk7" :U4CM 'g: SU9zPph͵u5x1>;e*`9?J]TPUHG Z|a뺝4boOs0?+C*0Sfm 샂$Fݤۚتk&/% ciVEN }aR`||+Ԑk:+AK`h7,9& (!Q,ollN=9YrCP{2QΘutmH:YR ܋q<ޔAK1Vn2;f}8qW{ E|5;f}6@>&pnMsz qѮ)HS?4c;+;Ly:jR5=IieNg&(!&QF@ pZ5أh~̾:оy{!h uN[)lS{z?Bņv3Εnq۟fNm{"&LLs28 if3r}"qz7Cu9FɇqŽr(_Ml2#@s',rRe?'\kG*;ZS}YtUhu*qU@zB%p5Wwj:D?7kHf7 Hdc?][+ ݤ UsJY1/;LNV-עn y&Mz];)e^ LND>`(]ۊlj4Z7^{YɠdXs_+,xǵMbԊ1H dju4RRd.a 5W(| 3` u 1 Q*{[܎&ߏtĀq+=M(So9 4wT -p*̳-v΂_Q1+T Nl ^P˝8w__0O&$@ e? ϮlH B(9raLDT5IT. ;4vET漵h*#`t fYQC~32H+1aݲbDT@l&#hgQ xMsb3頻U\58#(~bܵ(8w-+yԁsfss;&`d;ɪ <҃p3=rn?xD9TС]O8%Sqx7NZD=6_VtB&\`lI YU H:NmrA,:\sy`ah8"W0We\l{Y%xJ9vexfbC0Mu5/6\mod}4h;K뽨V BjsM6N|FkP{p\ۓ<]xvn&?;uIj݉izg?yg1ytzX z#c} خeqE^nt\TlHMBU_{ڻV; gk3Jzf sj̕\qyÝ!V0396O|]c"g1ay`ʥ?"etl# ̭7 ڹ8f ]NUY&,@ (PV뺌9,j 3Pɒնg8a{}1o!f780YG 4a.ꘕRA!.(m)V,wr6=ܲdh,yDGꔬnUspځ"ƴb73[04Fun<҉njЩ=ٮ[4 PQ)}DJU&4ڌ3l ^WL&y8Q sf'+iwL2$w|\B9ڌ`M ٹ?IjHS@N59:C}HZ6=:w !VZ0Yo3'{ #Zj;vk\K^2rLGjnrd**#VKLeɍv:mB>g43pf6;0+&iplȈM,̆kA "%n!^:}9?u">'L:\DEe\l U[5f€r\\+UC7rt̀T4c0,3:;v㿝J1β7YgÈj C쿇a[(x= ے.h_=6bvl.)lhm`íE(Nc o1:r 1Vg2 sZsVZD3G^JfI{ &҃HKhԝ iSSӫDz:9"O+{d>" zN uK 7hW|&٘ҟ:)C.twl8s*$ [YuE|o{MT$l lj7,̰3;]^tif`~O봴)23#Ynթ@{:bz:q\~SSGAɆI:^)'T+5Csj 8+'" 16n Z9fRUsߩȵ4|[ie9ycwBیM v!zp`Aa 0)Npq2S<_brV 9:WuŰuqeE0gxh h> 0{gƅ :kt^KZ1ŵn%H7Njh3PLL$7:A$ԒU׺R"n+B+fGww/v<?Pvo-$c@4BDJpo/[e~56R@;g1wq-@Ni@`sDE|ꐯZ;u^眃33I&Uh]zyT Bǽ x=^G`Mm`me+ \9ߍZAЧEZϑW&f~ֵuqAPe AäqF8PfMGO mDlj@Iiq B?>nhs\gQ@y3buY0'u6. vj/tˁY^ӱВ* <~^@﷛#q`tAqF};.jaL'#x7"nhL5A݀ 9Z=>Ły^S"Q:J^A68pn,=ҾͰNݵy*FiM܁dv>l^0))7>㬧&bF-gnwu] ܏< U\J@s8^;zt$ 9<Ąpf΍>+9HPZDѬkkюU@نsd6+Da p2DW3jPn8T_lA. jv; v k]XA秝s6}BcbW0hI^&rM[;o1r*KPAQѹ\Xͩ3Eb+XV*9)U O <1i9 !CEl„y pq{i[ʺ6Eޮ`Łvh䴚rAj,LnK;"H?BR1ittB2ץ$b~ۂD 3]z7FJ<ZT)^8`Fgag3ˊYBқ"MZ5.ϜZ0 fxϨ+J :Vw?/2_޵\ SmЍ]ՐM"ze9 0O8^p).>zuHr^jfb1]L~Mzykl{-3&ʓ x .Wϙ52ΒIR]gҏ~z-wZx3HU=HLC7pz+ ^{9;da$M>M}߻޺R2yaMk)|wbm50rQOh_8~2DᜒyW k"a«jكC_,FYv^MJj JWCw#&6f+& .F $մXy0p2Mh8an r ˗ SZh[P_k& 2يyHνTc +q 2i럶3d,(T}{Iݰ}|o0Ob5)u;BiDE0nH7( bh.iL!p}:ULq$k\QS5Q-h^m9,\k%1:J;a.F+tu5{xɽ8<=R%jTP hyoA -=,5 Cynʴqa5Sv&8O#Lvk i&VA%u}-+]lB M)WPfX)>I ۰}KW^wtC.BIG g-P0kob &3tia77+"tbZmE-ca}a(;̀8rnrtd+a/&zbnɦ&8\H j ?dcJ[~v8~t7;\},Pe'Α&J1 d:$yH71x1au$qp5 7ۂGmLq:\PőYbaJ 5,z"<^yjZGaOc t{Zɰ8bcpõ_םb<.H]i l73+- <8p՛*Q 1ˌƐ@D3P9r89?Eq9((0Ǐr.%'|~F`VZ֓'N&W ̕Urjp#?Ck#0j'CoW7qYT`t+VQ:)},g7CkjXJhWm WĨp]ad'| ?{ ^L#OW%ǻwpE!0 !g:Jk .DvнA( b /MnnPt7N0WU8D]4de ppꆹjx3p-pհ=\9Ɏ!sbla"0\92siz5i 6\)F ;Mmcu^:ۭu)8WrBj~jQa7EppkRaOYwChi_Ws? ."^1ϻ|lZzO̫ >dUF!FLA%fA!vkpAXKgqnM 7R-ǁ~ON-\ 9y5ƛc<:0w4#Zrn8gby=ɜNBXMi& Cgi{h$* SUQ>>YP{‘ A08 X_& ߅ֈ,́-&0n&J|fҁIRpDJդ?6cx4Cqq/1l *hS2Aĵ%NO4wc45U q XJ*hz0:FQiusڮJ57(6K9'| Fzt)`mJ3@\XimӋFW0baF)urD*:Ͳynl0*N_*{;xOrgU B BhJ7s{u;9?0 : RwB?rP~7N2ydi08_錆A@H1 aTE(gR0zvΏ`_&RX ۡ=4j&㦽)ho @@;tStn&qCrJYh|w+|;5x*pnNIsKԃVh4/ EbzfƟqa>NuUWlJrRt<N配(%8 $S}ɫxS#E{x{j!e4LxwU󚛹?NHh-PF,/ZthG>S<_CܳV5;Re6*][dRs;Uσ;Q.o@zf gYP\hO{䯨pi6uc#U=AǮ'y=i{O)> 2Z&KEaԶ.mSJLm: rd[o-lA5PA}ouθ*S6ub1;I 5l4S{XGs:ѝj{E\cTx ۏRp"_GY.9liэU/!u o侇Iej # $Mٹ(0t]~]q &-WgK3@ٱEN (tWmnK T;d@e:Ms; o besM 8mᜟ+8S*,cA:K{w1,5sM0y)8i`PM] R\-PyT1UҵHzmB1F|_&NS y$ .$iBTٟN8,y 0*`ׇq*"ѷ @4g)=M 6J E@ɥwZ/r#Gαx`XaFgyM4@m( |X~gGROˆ901T4nuwSSs 5uRrYZܗ M_4&k ЬCq9v6x,0B*;0k]5\7R. Ѓ@`C/LBN,zf̅ϰHv7gRktFh" v\lCn7L@QvHr^/+M'ݼ=Gu^5Pю^qS`^:l8r\/ $(ID#e aXUl{峣WN'-snR9w7aPr?m(;`8R~pWrHt3>Fjƹ%\nr3pV˄03uR91W$֨|;L+6FKWHjߤ>@nH @c|U{s\;~}z#VSGyzet(T6QaTt|7E7]=.++A6ў&k~1 q~B\S-a;hzyTH+}}|_s6rOk gIɑ]HU)3Dި&;mP&ax,c)Wfs/zǹf;^ub': vz7̕E@ߏ*ס Jg'6ٻa1w$a*>jD"#^p32U"o{l@`ÍkGwU@0pz n3VӨ*~3TV=i 0c) L0 4Īa@3l_<(\O Ci8NlБ zuIk &?xܖ}0Uާր5\7̃NsmB9n(*̋ScF<$ɀJvP~fg @ Lwm3X$ЖD.ek!^%wN!m`_?(Bf:ѻ08"R 0wξu[p ?\ ̅[8;L`Q_u4w~Ӄ#-?D.{H>eǵ؈$w4_9,zxpܝ3 UՎXph?W@VmBȞ|;mfs|ԥ8UUhJ4 8i<8OHT@aR B5C_7kJ CP.\+Fg;;Z+VP,(y{Z/E JXʟ,0%(.m!c>KU/X[:*IP7ZSZ4M[e9uRw;V?QE9nz@ x쥊ǵ݅=醪g\SQ{O$=Y㿜&([t+Lh+GMޏ%IqpR|8 i{Vf#v.,s}&aPQuBW &5ા5gRwMYR]"VC'>gOZnBC=#U2m3dU106Ac7}cƉD TM^2)l8,<0d_ Crχٕh[vWc[pY8&)`f}]Cdlq89hz`Ž pD&'FзANS<)w]S4CPHL'CʀԨ-rMyìeLEb9R&01hpБ$#6Bcfw#M>dPE+_[sDf$Ҏݱ2&UυUԐ:~WFuv#a6)ܺ2Y09yF2+u\:40R9n@ц._ B%ۜ5HཕyS ^3s[ tqIuӴB30tF#*bj$n@*x5]%|3WL|9TX|!y-v ~3iUp3 TyY@F*a]rjϘ&OƬmnv֕r3 2~Bܸ<}k89 Od,kWj_a5 0 @Ezd]r&[7 [* x[[ivJ9暡 ?[9:)FM)swLwkUR z(1EΡj"4p.tb\$1&̂9c1֍ ~.,D2|&%0#r7Q, YLJ"VINTG(`I&kbX` HAd *+~ma" z)-󚀟!rg}S~ u-{<< 9,\y=̘{8' S|z BS$}aMp(0QtAQ7]1Pp+|:/UTTe$jď{"e6|ugu' #G+/TТn 6:7Q9Q0-Ej/*2eDz ?qN+9F!h`?BI'&?cӫ"&ך(LJ ?BgnvqR%ٺJ[5V bwgl6_ȡ{ЌsMSUe-REXs1&^7<0e9ـ'RVhU.31E"?;2ΓӨW yC~9knQq-p]$ qmIT%aTb& 24G0~ll:v "s^CCO,6k~ _3 oMW{uk\5xձ g~eFePsojyɀ!gA̭oPnFJ0Q~6΍$?OSqp8O;WDCCGw u :otElB{̳T=L@q Z<H䯌sBۏ/.xg~? 8Ob'抵>̢0&[GjT7kTp5XnUsz.;8sT40)ta4 jJV͟(PtC=Vǎ[8YG"㬭{'w*'@LаXmt@\jfp _;. QT'μOZR{f6 zlcpՠ|8v Zܖc N#Eܟ&Ε[iQU69woj@?0_|$OS66mSaC}};|'ҴQV1B<Z7?c9]ͼ5kf>fȪ9]“.@&qKwj|7oi.^ @)L@-m7~WٞY\Fnx`p82n#c w%6ƽ409qVzА*)B3)xp?:EDXYF ~-d<{(Z`i]ͤ6/Fg>]ԡ5UlO&V/݉^y_'ACla,{m&ɑ66jst20ݜMv1 ( N6| %bu4'\OY8W8z`*t^gqMQ,GIr;" £\i,N<|`}_лһZj*9<'h&;)3j]ꊣpK;K?Svޮ[&KJSLg2ކ _D.i=-Mrދ/dh_pj7{74cy^ɰ)_szyXKDӛa$>`k3֏* c|U W~,҈؋!5IzF=:+elwTeb$6pMhǸ;f8-V$lwiA)G׭[ F]\\ځG~ 7w#* ̃khF):,&8pZ %gi L!h=C671({y4㸗vѴC2,0 SL`QjtZ 2R29իyY:̨t L D0`Q-p=4֣.9›DZQu6"SD4k+j% 34 C_ ⃌wWfgmfO(XpHpO#˙ b$!n0l)Hd(\8G:o~Es8š.4g3)ey|:l0Sssw5 %zN_0X@/}rZD/`2j&gPJ g_؛0U](o@snρYx* ԌPVCG7Q6PSbaaX9y`i0\Gt%n'ud+$H=M4Q4;B!d :J)Ap{Cx`aek+Ga}a/P׷H?_ r)8(z0΢" ^0+ WQY1;|>9CxvB^. /} p,ܷ:À]IG \pYpsSt@DD0Nk3 pvAS ZTŴ+j >pJ1 U xw1߳IQ& Z%µEդwV ԂkSR x30f=~{j^`UL"g\:j- V1+9MsНIDQM^$cӽH.K54.rx Dz1vDf ~\pAє LXSfD?s5'$Ʈ4"u=h35"tn2 ֍wQs| Wq@{[cp=I-gr)$G'nʟw f,\gͤt8]wAJ} )uCiq& ?Baw]By:67xN>DU0qb}gq!($TC~)xp̀ߑ/胀9|&)] L{69sfL" 84guRq?1Ց O2 ,rlnzٔ=ȆM.D䋁+qO;Ks_}ҍ:k/0N\ >kxIZ- :vUlv7dr:Fy{Č$U?؎JDc>9Q41 - i $,)Hծ9kFw`L׍6[\J`ՙ׀4]rBhh;Sؠ< U}kRUԺM~rkG:CbXWf21|NDM:TngEX uZ F8͎S'/r>ɀ*Hp5?וּ['jNxfC4[I9jC5~3@UTz !y;w#H# ~Ќ (ݿapkLm'ọ@hU>KE2Ʊ"wS,(S9a{9ޮ@Q>ϯ)Ğ)Ę&g@&hS{̘sz(ٟcVe-zLQ!*f.c`=,ۛ8 xWc!E[18k9;@8wEIj||pٸk|"j<9:V79>6 1Pc=g3/r@X mD7r"nl&BS. o ݀H@S"8?Ls`K99IRJW\ \];m\6dˆ*3.q=,!i asMn혇>mrR|>/?S8A},b.qt ^嵇 5ш78Ins}iӬOyh&IgaFoJEia 0͎QDu:UTv+1j*IuNa, 9瀹Ge߅ܢNyTDu7FNa.o]~\^ h8}?v9*džybJBy{xpQ'qn FRE"{Qr$0d&]a3_\ tk{_{ϩ_f-0hpXje>0͹!N`&ܞ8GŀnM#D3?b٥ aw\ԆsK<}I_vnLYgYw݀+fIh? |k5O[܄McggrY!$`ь=8Ǫ,FV#w"JlhH#~:k|:g!/΀Q'|g׾^E.?%(eՅv.~$0Мa"V!ga\ד1X-H;49&fjri*F57M q>iaa$~AvGJp&9-Zf8h h:EbG;FYC[y*%ۮ&Qw}{|z0K̯c=. Pg%]*`oB ;]hDD*i]{γY*/`VӈGs][\ yq_O3F]Q<&olb݄.Ht`Å[waPT\y0ؔ ]"AEp2vZי'$1 峯];<4s2a* f_A 9:ԍs$NW/{ _Î"yXO'Ԫխ)Eœ_sz%UZo1,.0EqĀf6]@hGk&/:_`cI܃e[w*⠵~bc> HfkNU=˞V,ִy:n3zVe]OaϦ-M|g/kKqE Kդ%\.4CA$qP~rr?d `H~7̒Z{q D8j6 DxU ]9%6OVԺfr7!cR*׉)`fEXN{ y |7I=6_-^gc3b!hyrnI ̡p,ۈ`g̎sB(B&3!pຘw-M ޽Ӂ}RۥtO7ы9I9g Yp1cvX<ߚ[)5Of7q 3 \@ E[~3nk+fw>tƨA`U<1;S3Ǚq36ֲ+0: 95UKqN0It9.4y5t4=9>`0բgE=.+r]t)7@Hsuj5rM:zr#\/Q8N--s1C0jx< iWP"ᎳB聹uhY5I36J:au^nUO𪜜`y"'g?c@U[L aS9(þOvYpoA`.Sc<0T6.\( B& U"Ap5 z=ΰFuI_U P5钾^|;q6w,F7x 7|I؎GtmɤKVpp`ww9 ܥc6j8,@$/ bl9>:;=+@Ș4&B8\9 CK+x`"'c{ C6`Ӳ9)]HD"W0Ww`ܿZU}C^կ} (s} f=,JbX$F۟]smz]P&A WaVfl.{Z| t|& h] (CA74[YPw\y2~ùEuj48Ϲ]R8%H\M2 0 8edUh4d;>8o 9_CXUM[q5%Ut輘s?6f k.VrsuIhmc .a1V!HAh{tdrFID*]A*z 2XZjg_8gU=N2,vsJ`DGsoiMA~ǁmus6-TqWݭg<&?9 ] iq(4!<gp L>af V7'%zyC&@sZ1qu8C.pU ~35u#'ZY~Ou9a$ӡ<œ0k-`aA?\˨5abJs39;E:/0=,Ić g$DsSu8>,i$߄!f2`RyЎsj[lط,VĹbfŹA 7y'y= a;dp{o0YCA'\S xwy{9_rH[Q\._ҷ?jH8BYFN5PQz~{Ǭ3p 07 ٵOy XUssf (֙#lnbt8Bn|5H*_L0P ̂2چz*l;rUpN-,/&g9C7)qc^VŬa15=ICTls]M\[؇lqV:|JVoQx6DeAлW`_UѺOex1GO[@A i5 x-}׍;UVuZk 1z×Q7-n| _*fEϘ9%q;V[p q?0]jU0Ωq@=-c.LC"s]2G nXŐai2Z pА0Ćc\N摸|Yئ(*` Ua<ܲzS>{/6`0P0khoe mͪ00 ng_D6w&A!# qJ7|׵ LknKi7r' σ|nf48 p@] -YG{OV|(+Ș5o΋D:\Ophŕz8SwX'%" Kwi֟Z럯 Bg~\ f[)Jg[83{vu,ǿoSg_xgCo8w<έ;,3>[ 55h .Y` `u@:k"=z % bxA6`z]qVZy:|f~~A=~ V':I5qkJ` ,Z~u`W% i=n\~cF`֯uYCGZk/kZk5ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ ZkZ _nZkZu ~i?Ƅ`cLZkZ ;p ^ ZkZxeq@' T!Xkޗ*Wg>@3 :1 XkZ Z8`~ױnZkk}[' ѿ'ާ@Zkk}{ezsFu=@Zkk}×»L[s:09[pIQ$\L?|٫V7ѫtm5fhp>*ɲg! U or+tוּ(4|ƙv hYͯh&hGta 0u o83u#-L]5g:n{3 TXkm/l(6y=)䬛,Qz&]A 2ϋ X냭l.gY;_muE<7y?`杻ʖ|ѻ:NzqЄ]H J^ ϯFg>J_03[Y ldM~f_>Dߋa5 *|TE(6lV,KFYu)hX 3t%ZgFMن,D7=@VX/U,tN\ĝ03{9x]9+t# haǹ Ft]7u 2c-]|l?@`8.!GZwӵe9Y~6ezM@G& |EjslwYtu@\XL&;Ur܃k܌n0 h 59mlǏYk&AJ;R̀N9TN0c.8_h:>l@'~^_𠃞֡^띁턩c~h&.Qgq (z g{ǹkFc.P68ˑb>!Ԡm4]ьq -` ͍&f"atGW R\kم[fۚq֚O%syq|9/>X8a 9" OqU"|asa-f^J , ICP ;JNI7?2f <ruj7I 3-w"v^Dy;P#b>R5LˏM~%nt4<Š7p5|Yx ~ X]Oyr7@ԋ0Wk>, *(Tf$s81mtH-dp628^֏\DDJg{=8\t@żX\r#0b@lHk(jpO.m&H:$bu ,.bLj[Q<!?։~)qHsZDQG~~Z?.T+Mg X=s#nXsM9}c3A0w6HYʄs TmJ]Ɋ|`\-F)rZ޳us"׵ ?ly[g,{;IWs9|0炢rŰu3.gs[kTRg$L{(kѽ3Qp:ר@ V}5M#lChbzAR[gf6o]YUΰћ8fA>pν'DÚZEzn¬} 0SP}9.˵_8iwa E{~O2oB?zR jm)1@Sχ2Zk3 l!sö G,:H:5»8p:kO9|mKpAd7j#^E)\9j^Uv`H]-̵im> ZGItT x#As ǩfΞT+GV7> n?L|00t8hA m^`fuث?(Q'nqQZ$1Z7rm 0mZ0W3; T"_ϪXG{J{}g(n ] GBA,9ǿD.:n _laXOtsZ | b=/WĬ,*sz55B3^1;yVLc]HIx[Y..d5@!u<5?c\{Pu@ԆZ`À8RZڷefF@ S\s56Wr`~Vu\޻Q٪Q -<|ߺ·A?k\-o +{$b̹Ic8WwxUC>PA~)r=z GQX6:@pP6:b 4]?^S\{6@Q%0VK/`otgw(IgG)8(eN_7w ?W T QTIƙua5n@i"uT@6fى# 476]Ї&4KT}|`Z=ʟs}"m}dp>ð : fFD[}oHּ;NkVvk&04>vϑ0O+'^6!/U@<3U n0Oʆrg+ʘ,ϨH]i]mA=}u1cnQp<@!n0@urEFZk \_67xu;Az "߉ecMOy6yu( sr@:P6@N'T.;* t=ۢJs^He `#v M.+0U놳z&wgz9A|}:Η?lSQݽ{.\[X7L n]oroZ_giyΙH#*B_qTˍfx3g+VGkzB;"BҮk3,^l:#~xN7JׯdEV"а܏z/8rO8UGMWp}vt3$6F oa8!8NRf`歵@7uߋݵH2soe2 Hh(޿N>*դE|`@'s{/erO|D '+r0mW@c qtWU =q8:&UŊ~{-i ӱ"g!3E4ߋkdz+-PlV z0KT#ˇ\=0( |lo}b.Uej"v#O8_|™g`3LBxǬrz #{WtTK(sL70E ",. pzh7;\R:k PЈ>Oh0Bh`\] k;VZS(]Ȏ7@UY;?ɹQ*H"\w;9|$@,8-ACcC!^4ײvYuC/)~-Rf"b+50E鋠N䇝HDP-\6 \ ԇ:|7XۀpKT1f^ twT.GjJg?EU3E~ ' gm2`83sAvt)FN6B,WMygíA  t&xA7iOy4 o4$L"a,UwCE ,JTq؎"WsMĆh%"ӫ?)D3#p 䁹v;h-Z8d*sU; BQo LzE凉y7FmԈ{k6@2SrSEo˸ *uNdh. 1n2%E`T@eaA#~(a"׎> R\D#"FiJ,~Gރ?^Q֫N 椘;v5jZ+N WZWhݟ.5tqzC6vcw:\9&ᆸm O(jڌqP~l"HdŽ>E,|O?|8RȞɀa6?cID?dz9MɾeG\ݟ{d7갵V}Z]Gcv&vy .{7[ѵ) ΨW9hu)0_p9~&T4CjEt@V` aR}Gg,eXR_kvv̭,`1J sFȉsľpU?3 uIt'ϘF[, f&h[tC,РN-6V=Q>Jo0v(֔'}"-8`ZoR5< ] ́S<3 a<Xł?s`7؅"y\7HSN,vn(XO)K?ܳBD\)؈ ?ȑ.jR'c1{EA%ta~~K Di \2 =쑱I{lqjQ HU>ZEx5/։~5,AƋ[Uo1ww  7؝=:+nk}_fTȵejX6:pL( <؃nHgmq=ڍkx~c`5ui]NUQx7_ʴ(Vi3&כq9 |m~w 5lr*EKr _)UlWF6^`ǹuޥl+6c OD5qE"^gyG< 8~v)7٢!]Qj`.Mnxu?b0糛\na3Z' `u0 2Qٚ.:ff6"D5)a [ </N;z;sժi"saf4: -DEFQ3`i gWԁy!V+1 XFv3Sh?kl|QWn ~T0MJ2:VL/+f?s`pN}fkFݒZIQGfѽ9} BG􄹊`EQ)E!KnYhu]>T8~5p!1{kVVY[G=Yqma ߠGeg«| T{btx 0)7Pj 3vv~G_}*T4 44æP+52Y OaՋ)ʭL`" Qc$i1zЛi9koEr<uM_9G (3XI-mk'~#~ $u:S`KϨ+yl{%+g¾(|eJ ،J .W!pf`eԗ;x4 yFT*7RPO_''8^,mYxƱ`4i6 tB&Qn$ut&]춰iSOܴ9hȨ4{V-lZjs`+{8P~=</eJw@?o|aRm7<gEbsLz5d Ħ^5Ɛ{0d ƣ!]%0#v_ {CuLr2Aw) $ϱnW?#eNJb("BQ}O} 9 yu6ϦiNR܊dR`SK?PO5!$.}9pFir*;OlMg^pp;Y)fjLGj^B?:7q^UլTss<9ZWіJ3 %1U`=哊{L-P|C5_AdU-MIi}6Rز5tudy865:?}CCX+B"0\ƗA=9dΆ}W8k.`JvQ%e d!:|%s-Y `VvtVwz-x*'=,t}eJ c x+d&>Bf&<> _d概2 7K}QCNKQM6M O>31uHM9p׹u^`5jȾ9爜O]TCE0@]*d,)(dRVF|6_Aug(69fsfPfk[?u:0:w'9s4YSq2g[;VY(6Yc'0094y6 o58 P%կ4ئR;ϴZo^֤n5BtJ2BМB&#1+ڬj__q{ UOSv`/p'523n9y4l~ޞ?UipG`>(}^X_q/}#6O&!J}7Fv}^')j95c6UD1&D7I7mD${ZTY.7ig+M Z>+&ys_jҁ[R-)+=P_6ysi徜k fقʷcJyjA | ?/1~_Su,0v$U DS#;)*Iؤk? S݇A,=L6wdM{5ro綋͙ܪPw@ ۔g{Nc7uIuWw7S B0\0 و-PDC7,{YOgʨ@ĮZ`g"q08ߙDRfc`xolH(`muد#%UYN!iHC`Xcj_7>>ln(91u/t}V,(_Li6v,X5Ѐ o n̚+]YG01V~e1Jg2I߷W3ەqW;SO;naMvn,`nvN>8\_T[wK-1*麦AsMYt#'tg%د10I=Ġ'd3\vz 0Ni\bsmR/b1)ҍU.SV,7e0z:"Juzj?/Ŭh{FPgV|Nn8XHps.mz_:Ա_gO/6፺V.jGS9Fx;݄ͿtTq|æoF~P~X`MaP8Y>#5 Rk')T;F"8k(ڦǣ~,@ ۋ.~IןĨ^`s3W70X g^ms)G7θ5K N;1toWZq>N(Yt{N/wn$@9 JV ȕNr$㸅dUX VD{8Dvf5"cLP8$ܯV)0|sgsY[ԗ7d{ٟdsA1MCMuP p8"fXՏ, jnu@9.:7Iy[87F1)dq " H:F7X5j}>[ Y몷~Ij#* ~-? [O;~ 5ďsW? &tUB[W%(mŁ`<q>)P*eѷؚ@*z# L/5w l%mlPnXX5&=Ц@ºm`3"rWF29|^drc!ؑ*ocXIZ^éIfÃ͂ M? ,8 %c*ȚTp%LT^9eʌ'el@8Ch_Ɛ9 | `8"s |t7KoSCλQy6\QV .1-|{xV>[k3Eo?d@ UQ^;b*S~/(.y=:b }1!kʥ^Cz!L`#YO=TrhR}#wP/w9w NK{& -j{`ܬ,q]-mY޽1q+XϪ~_tVK5rὭvF2: }$WP&N=_|z<"!WX7>^ *]a՘qUkN xcM)dکi {@%򚋌:)Q4d6U8dLO^!J2>]" J:7)db=ݔ~TY @,V(;;|оWBBgy't7{XMn8dVu\2s0>gُK=<%?S`]$4)0? +]YwX/΅ϣ=aĽ93YP>pOogGeik=<pXq^tT?yӎ(P5dTNȨo&ChAƿ*ؕkD-q RfL4d7R$p4 볻z!Tﻒy@cɧ؋rH*ѫ2A+jU+*Wв{O%J~R\:66rǐ}n:KL{y~>~O{cƹU@?7r{ =ޑ}cSpp^.9TS}%' ֲ@G:a C>~1_t ]?X^6n T,xf"x|ġٷ 8AOIKn{N&eUJ ^!tyL4%= ka(J%U2  Ai llj&]-Ĭ.FS?wp>eCk -ULW1k:+%ꢴoz[''1v^\[`d][#T0 ̲+pG>KMO}%o8QG)Kκ9.jC=,$$<,g@Vd@g7+\:<^$wD!?7{a c k-)6^+~2^J {1ifsA3{Ǿ^L+j792Oo>t+uV=l~D)ګu.J0 d#80 V%<7ِy/y7 '2"R Jt>`*Hǫ!)CJ~2zk qIAk{pƿʮNesK7^ S&4*[at$) e>(DM!WzDTy7៕'4+ލ)w'MØI}st'l(Io;M0pe Gzk/ ai=Hl^P>{A6z~fiخO#S8]`36 ^(&R2O@Vf=[ͮ^n R`܄}iʞEp lRͽǬb X{[evװ1ڞPp~ 3MY,_[LQMY^){af+@LJC~,2SwrWxy,wQoKp݋b@ un& 4 T`ώ{8Pऄ3@G̤sx CZ+Jހ3vA )O1ky-0WrMH?(^l؄ܱn;i? SQ)%vR/| O!MYɌVdC^WNfaLz֬~YXI"++(~} :15WMUb@`8áf$ŵ.JK&2z\нѱ>"x?JC~ݔ 4}MSKd=KkWNFސ*7 %Snmxp-wFH0u)2X>YN:abݝcEFE0KHN٭ʮdE p5PCAs31;M "kVc(MRr/D2 lLlA3]wFZ $J!C F\E=Oa}8&a@fWZYgd$V1WO$'r Shp-ƺxΓ)8WW gc=9ò=#{hBo} +ˡ&i:` ԬwNꍁxC)_cp '&ٮԫ`1˺:~?1Tqbd;-`5CuTMfS/ޢ]`x#?SXE+,l I9t*{X/f/(i`!_́U`;Wz~.P[un(SA%?g?KS_kӄQ'8˟>7'!HYTo$z,Bw!xvN:75PdUgT2\P1`[WeJ7[Ȧ"nW4ߦ~w =$ li*myze 00KO}P=bQdcBV=+{4O&%mmCV3*3BM5tͅ`T $cJd \PBJ[k(]Lxxo 狂:}@eKe»}s`Ƌ`0a}:i;yi׊? E AjD 0e IS3VQ(ѰR el3M-eR_7'YuM@e͛BM5)w3J(sQ=>OGg;_GGBT8KA݋E6{YCp9p^` h+؜]tnj {f3[WC79pИo*.=IaS߁}hs$Бƌ%GLcAWrB` ?gཅRMfV*MI ΊWX|n bdŽg׵%xx1ީ |I7<(-io0futDE B*CNC HguK\7˺I\XsEOس.(<^,){끞Ndyf)Ctro2sgw|Ik^,י WcOzwSnT&9սOϢa-Y.2N OX3$8n%=yS6_0N"ZvԜnyFfB@ ޠ~pS >l]dRFA{Y+Տntz5 )kTlIS &iv(2MT~-mΣy>gN@@ 427S`ww3v$Wu-rzd|7&]`EcD0eQR\}se9?(z>?4GciY؝ ڍ+\Q?0hߦL2x2M<hcҺ`eC%6Y6eg {b ;n yQY;)|p &BLjR Y 1Lkw!#s ٲ/It7e#dT2RH*(PS2U+vJp@oVX!p}$l(Qgdr~W5KZ85MIz WL*Ld==~} 0R{62 xz}R/NYѡȠyn7۰C-I :iTJ{q&R(;{4M:)wӦMzLES6kX0$؆:abٽSޓQ~ނr*/k{:ʨo*8%7QC g0 4)j6&nR4)2cQ2`x~#B4^YWϬ wvMYjz?CbSb {qwAP!秔1S%T+Ƒ=𾅄nS/%  ~q^9%i7)`kg2?܏xS7m[@WA_s[8z+ꋭ`$@?*|MgեkY螱T&[Eƴk[b$"k:65)lG8kFTQCY1y_Y rͳGK@HM{`p@#;oaD#{0{J{k,c@Rtۤ@ϳ6R{($G5VJU^nƋͯ>8{,zS 9c6< UZ {t ySyKE =Kw\$K1[skxYW?c)__eESAQMF,8R퓪ze!g:LUOI*x,6gBz D9.> ~Kdh_Mfq2Mp2q*.NHiiT N^.SNj~wPldf{M}OHӤEu%s&v'd盰n`lv#Kn@?~RC 涩 YMHz39KYqG|q,Kzw S(2Ю {.|WY kO7 s<7e"'؂@?$QT 'd< ,>"L7 ,,䳯7dD+o|ʍ&IɦZsI"4՗Nt)YDmo(6+#R 3|57~-KQwZԃ*w8Hngjks!Ojz lW`Sk ;}4 õ5{'5c/fMm<BIk A=ݣnz$C{?ط;ʬK=B- %+JG`$Yi-ƋsFjNN#{>w1YTg)G4Yu7I?9Տ+.6d~ j8-g)4.]G)'{> ^tB- ރ%5МRPb_UECpD=[`Fdo');,U{( qjB"dg{ I6V`PB9jz 0]h:&սHRurYk;;x{`Ko;2!ԏXdBR,ԏ&lVb&0#`T,Bu *K"夬 8%fgq>n4MW\TZ[:uY4>3 #H/a$X \ q)Үq>@L"iN@TuSߠFZv ߬7@#jlҀ(Vk8 U0}p'M2؆>Yd L໅r@tL519*WrI؅o9~ 5Vd[ȴf3Ε(Ϻ68t@SPɞ[22Lg$j#l;MI+cjjLl֮<>%z 0D iUp "fwdPS`fQRPs9OY0CE|8Oȶe8f8!"y ! P`u0y :O` \g>Ftg,)鶩 `T(`؈BF+>iq/ 8} 8O<1ixC+@| s '6emtЄ7/EHCF!;` 0~uNCXo HFHZUiIٛ'-0cɊk>T^tZrjmaM6=*Eo"aΨ+OlOIgݐvL@` gcCQ^:XvFm?O OD'T($_^C kDD9x9hM$)V!@E6zz@]Ђ#l}s FA%]LwImm<𬗐aN%}w! Sꭠ> ºLT'mMl7Qfk65R>;iF^K?c9459GFc,S`dS0hInYDy>m؏2X Jc3$θcB>-g~Gz#GPPiS8o%`WSۿ$[ {hV ~-dؾH6]AqC0QkK|{5[QCYG3Rmj,xb=Bvv6d/U E?$%/Q)I;N5> 5땽( ,ԏ"Gijsckl;; *>R]?paU/4RP9 pfcdF2 o(]~Na_g owoi^i$.j^#<zu(դ,ѻ׮Rv&[QەZ-Iʂ, nM҈t2#;Rz屽çIZ1acwNְXI+PWc krwo oR+F uGX.ܿoE]Yޛ?%ٱ?v]Ry3ZbNVtXLK2/OpЗq `-K@' ݒopxHy~{(>Ma(->WaMjhj.dt/w7L*EՔ* " S3d2*뛷kz&F4xT-m[_07չ#{B漅`~S/Κ_ ]&U(i E`goDt65.YY))ڱse8jXod$Mpd A,xY;w;IM!'ឦ,¹2`賱I);o(uQn*<ĆFj/\( y>l;5V"zTW\Ғ | amUqݰ'6k];¯[Tymy|tOfF{Rit{:[QMrNqM=d-M )>3KZJ`53Yeld"{Is ̠zn(nNX,xV[R"Z }%[V@nLSS(eps dG c-[SQJ [=PQ4Rt *+*IQ Sr6 %3-2= 0C!G&1oBjK@C`}7GnIV9TcC`iRF-*e/7 >~sCV̀$1CXi6|*Pr )O^ { JSѷ1 $0%)+J>e29az9gk:7LVPPLϛR䟝 OY(2xO| ,c"QJg X>?;p h(!CܶSiȰgߚ#iަsFLFj`MXMI+-S2j$jFA2^WҼDL @r T[@JJ|ouM촡E\s2!ݽz֐%dRp w'89+w'k8!c.u+HgZ(tr2 6ΪZ7Mz9pPW TaŜrhs֖1 [h_ 54,=UoYN-dR5T:ҁKތa3͡_cAokѡ(_R/)23Q;zoW1Jgn=%Gwž"i Y<9&$xYg@ ڝ -G)WD7Q6Xiy@́%Httx{64Ԝ|We1#8'f~z} 4QI}J%kzV^vvæ0-w# Y&* jjB?FPbrfڏpR(ʽ0xIz(<d_@}e b)wfz/-S{L~-GgNCd {M}&)9 ATZweI?ēgd> Y1. *` ׊ )5$Mo(٤=aF(8|V[ഃehӵ)4I\'Da2P\C6NtA}4!Cn`=壓nڰ(Ga8ܱ'ɒ{o:[=D' |WPKҴs`qe.'0,M͍4f$kQypNd{ņKXnԲ=h;@߬8ϙ9WM ɿ>|dStWPi] qF6B6 M"춧w2CUfY?c3i@|γ 0(kJ\=GQd6 @żwMKR`膃Ͽj{d~~g֐ lǀǯ)D150O}z^^k ,|Bp36<é&y y )dsw e ΀3^nZG;&ε(;{fw^aC @5邺a¦~Ye pDlC'd< ٔix"tԝ%HiR=L%57Zoa9o֛)M}( f9qjLwPT7`%rj TBt> r0.Z:7 +$4+G؇p~u?Na/֐W ?0#Ioၲ,<6͊Mf=A"_ՏM!c;kT4Hc9{s,KQߕfmG{|]{ݲ`*&^)l(ULjaCYOZQ]ڼq >-dk`r>g\jJRzl};~c=psV^[ sybϋP(To,׽ّ4W(3uH"A]-d;`TPxv|67e/ !p. +a2q}8nz]8K|riȲ(sfS8bſߔ< 58n ®_fcxvcBu<&udk![`!Q+'qjL͢Q|i±&RE)9Ϣb}k2|^Ջ%ؖ fk,\Je3aoGsCCw2T'Y[?!MyRI Wԏh}WI{ ' R"\:*k`P.zA* {+:eM;z  vb<[RMYa(~MU-FdWz(F= 7Վ[SVwcӹcZP(P$d^NEAҏ,i,J;lp ;CI=&J0=&nVx5zփ+(lC()wy@MV)euH]Լ`4%&50F[{J XHȆl8n9a{K֎ :}B"Q~fUl!V[ wO{h?(r Rq/c4[xX?ԏ}5s>Z)7c4褦?6%$jC+YpKjdMgSvA׮pǃ~^/ȂXt6RףxFB4@xS#c!lV4Teݣ~6+`/)S+'dF&`V50O2Je2IT=5&c(*⃗^,<4̫'T2NW7Q3즳JݨW2H_k%{W* i~,j|;ݕgU@mO||k;+r]g:jz_Ŀڳnlc 聾gj!!;GIgn[YP+oQ*3C|GӇ oc7 m?*oxsEb"o`XWN^dPCJ >XHx)s p=p,70Ix/GծrRC`Fc(L&JxF]u3{=3=+~x:wO.hI{YМ'Eih?GAJg%$YɑP)9%SoJhئ 5yiXՏ(U=5aD`$RC-Ns:\6֫hRݣ𔊌bӵ돼v+dvt7IowyUhuEsK!P+&U Wo]z˫:{ hD6|6@^I'bꉴ/1{8 ,xFQk5(,5o쵆 %51N,0 8lRFgU4>.t|mت>*qQY;RvK\+V"3߽N"$KQm 4Iҭ U5d@:)79Õx氎[dT#hShZ dXKXJN^+\+@hZ7*DT'CV>3?NW]b@]{سG ŷP)7P=n uTn t=PʾiwsX,5@ÆӪcM}sUM &&T@L)cHy;%©r1$FcH0HgbNTy/eMuF+[r;FRdV$.ZwOR,Cgc\(eFB])uޔeh)%2#bӤ%/"Տ[Q gֹѦ0CP5W)d)LȞ2ijw#̊X6qIh4B u/2T0`8Z? ڞJSW@`( gP8\1)j]Qpgrg*?{~Y9b/[* c2Ù67΂^P<}AB)8KQy#@7?GMg6l!9jކ{QDSz_CO2AYL/@C%V/eu@w&QY=I]xH΁=Eu)WUY`e`RXM/xy(gvrf^OX3fi>oO˧b egܔg, `WL^ {m`7`c`W7\7LZtvbT0Ic"1T,l7q/>A ʿX,TwKs,C~d{-'.Zt͹I{E|zd1V 1sTYQ^M.( kGe 7ګewn)L]p!8 ɾjcQsi_ ?&Ia͒`\U*d]܊:Bt ,DB8pj@pg)O&X%5{ ,B~fkR;_=L pۢgdWc%b زI &ȕv^tt˓Ssd#PJI :M~ @? iBNZ4Y,eſsмio-6[ެ6Q3[(tIO6spݤeI͠i )D6𽃀2EZ"%UlJw^>ذ$o|#ogZ+hܔ :/(O E$%1Ia bXqPY#stm=g#P Rjӏ߅O7˸uà3qjLE _=KS`ʊ}rхk3^7 BgH ui^vs&[@M?, !/Yge@.1"aNޕ;ـ“31\vh05rjdҔ')åܘ.J<,PMY WM\s+NlIz*w)J ѻwf!hރQяU W P쇱`yMHxP/vdlOrRpNŌ7N4f6]jaF)P٫m*c!;yJ)4LU4wz)jdjuZRћ%6J>5@nZ0:(e[`7,tFv9ZD(JRAr1=9z̝F6G]@qHg+5I@30x7B}Z/u3vqESSo-J_hZK]%GwersPR[i\XE( ` % 4&A@ ffDzBB67Ùg"Wу}Rߌ6 xMv2K{3b*]s2Ey eE>ҁ5d gsrNv ]f͓ QʼGeI!2J^zLs-;ݛ^{?P N]b DYQQb klB xL ƠToCTl] tu8*خF'~3lv|h8㠾>!i 5ù'F)ĩۙ WfD:u'!M[SšMf<^M+1dUI ;%fpQ;)7COIC2#(5$*I\!3')s*$;K>/kU{؀MujEVcЂzoj ի9xpaw#d2@犇VdϥɑEp>̉nIòJu.G_|ޯK(9Z5 )P 5JVa ϐs=p_3Xyr6Bpy$Qg;h8FӽP'na P?,zP:tT eɘJ >6M㒜LS2aP_עt\/:>gSJ)[f>jhv*偛Y6qŬs*Oe#A# ks e/`!xدW[Pm f,ҨOSBC V͇C(kqT/y4+PiLzk^bS \,,7߿7@*|pSb*EMTztB &|Ć*GcGx}9O}op59l_5drݒ;Ԋ ͚mN}= !ڼWս!@-"s2e鉽׭`zSU9x&$|M5G ѤZsa8#0YDl;:'`Y}؍~ZŃ'8ΫSk`' eWzRbw/]x}u+9g:baAU} 9+H:W` 5jY7[j2L֍AW*x+XC6?W%d9-#%s+sJJ7&}ߊsyƘpxP۶p:79%uM{*"pɱ!9bon:Y&A'*<^Հ"s1i`.IDk* $mE#n^Ťc}@~`69ٱ*Os_xb1iڜ`$&~ݑŏJm+$[ӘgV^Cҿ3ۼD~(@Ri6dwE5( I&+:{wQ3;fmW>>zHs#R ɊPSrO?jSy*kvtL֦J5 8>@O MUJ3\SENn,@CK!SMW"-{kqVzA5r=-vǞfʎ}Ƚ7cQ{xN*&[q ~pFt[,w( |?~}.J Pu9RXR߅K~ 4(slL6 &P}zu|7~u@\uop;F}US_CVrzK.n1N:w/! dgt\V@qJޞy _@C&3\io9!V^il`@@+ §VqpZ\es:]wjTi oBi0i8Hc[8= ܃Y=pzc`jW w!FR`f+*(9w F6݌@Eg YFxQIJ'H # MS{xCxv)!HΊ̻Z#^9`YhH'&!)8VYyWrZKc&GNo8Udg' n!xaͮ^e9AFpԃ  K=#wϬ𙹘ZQq/*M` |`Z_`Qy ~F(8Œq mDH*2HWJxqP~O;CD0r?ϻ2*p'[,(SjG)V98Ymrv ]sĤʷ@R65yl`Pes7؁we4Έ'D7lpCY;3ȔKg0YUdO\OdƤEa=D7e-dP謜7ؾt=14[@:جW*Y4A.MY lciV ިm3\^w3#sOlvՐR=^dX7:I%. Ƹg p7`&:zyy&CYbFf]ߛkٙKZ~A&AxFɌF=&ŪpY%fa[= 4*8 XBϥgwl(r92 ?LH5,I'[knͬf}kA!gfooGsp^m`i$O_^z gT?BP`[kbo5>Aj ũ;Nq~uԹQh uH,Z6 ^u͎=VSwlաf[̋́P#g_7{ k׹Qkmvܛq ZQMԸgYn1 M LtnA T/jX(R@ÿ%dЯ5C/2fA{ɋ"T)EqQyj䁀3@t@{dru@,؀AN"jcY"^* ^ cGh}y\{Rl9<oOlչڕNKt;|GV>t0 ^լf Y@G#MyAzPxXI[GJy)nʖ*TK0JӭkdR k+-)*C+P03I[ǯa>:| K1)@r*Jo+ 2b ,tV܋L:b T@^iq>aǦ,E3VuI!TB Gp6ui'<7`w49^ASuWlI} wPMuݿtT~eQK `NF)> / =;oųN R  9IW+>w\fS) ~Nؙ X=zoi!1-_(G` L'9x7Ι' uYc3sҧv+hsCq]oDN='?E9+x+jam uWK =1l$-GEE0 H^uc dD @k yWv_Td]#h<΂P{( !%mTsBWe?n5o}_{(5s`g&!@=`7&&Hq&%.zONwB2:jbiM-Q^\?䁌Iŏe `Q]?CvYb *M]}+ࠂ>Jҳi''\C8^ Peo!U7 /^oAEF1I)o]m= HNA0 02&&r?7)XzgP:552Y0TAӘʃJ ^wToV$ſo Cg!zel RN(tnvc%L7VgoxLwҬCJzLV-:"(m5Y_U3O3 Ih F&GIt(Ck L~ /Qpn:v.XvPkG{`F"PW^c(G$ᗢ raImv}GC50? %drC7QKk4\w֤ϕXĈ0@:#CJ̈́l<M}C1"e&Dc~6w YvզS@[x*hn}N)dA1)c(k mJ!X3V= U @GkFe}FZPz9;*n(;J^2p)n_wsAȬ9}/r݌gyyҰH,8 @OO<Ѫ^{s@i7ưI{(:Y6ދMj֐ Eي*p4T+mE6) ñIn:k@In{P 1nٮLgxAxp6^&Tߑp ;WV{`P 3C8QO}oddfHf5!PR?6`kw<Z#7d'rBr~⎽`,q2)܃ JOLk}/V&ZJvHiWߴ>>rW*pcwSnZ\ Ng ?K *@.R):lʍq6){)[`;V= Aa+$SI-0 ەp8zCƘKǐQPkt?YWN!dԫ%JڟgX4hdy8)Cy͡5LN?uo~'csy_Dsa HWrfi&vQ8ѫQgqQYl,zކ쿤C`g*Hu/u; WiMbRlT{\}e7JmvZqu/* ;x7d1V!\m uC+0 LbDcsMr{8c#نb 3QWJS0Juz Gx6UC( g\>snA);DVl}=Zv}S?0ŦXAo#Uk,qxs4YH0P3Q"pR؀' @ݘb=;bm:a8~^6]W~HOqlʪWWl68:jkRR&$ZܴMJbΘ\ޮ$WrhE;ғ77[V:ModSK9dăz))!z[5O@`$y !#X 8lFǒO<w:D6$OE X, vOgoa;e}gq09dЃ`5f?@>1+5(i BT4z7$a% 7O  JByzdxόQu"rÛ @ce~ΊUnHh|1(AC$8gZGC&lFpAKO.拇2,uCSk@*5 kWb&*_,{IUC060“]sr QYh)pV`zOgT+VÃzQv7vR`aҹ7zsjޟF_+u.RL2QAў$Ocq>ŝRQz. zct/)쮌)AV o<|NഢMԊOe;Ifޑz {o fP)l>tx6ul4Htm>\nJ>[9%u'c귯Ȕ@'ߣ'VcxSg)J-d >w/翩/XV7b5z=9z[%ބN)E <5"S[R?zFnF=I_Eg{,|Z{l~=>K%6 %tVz+f@JN d @p7 PKBI&W??>M}ި-gr^ `ぜ6%b+?vAO&;=?EζVGg ^PBsag9رw_)n?UDtQ*i&-ܦrzY4̀ C" d`)tUho;B FJN %]y87,ɓTú~5ҖR܊䬚B\6/!aC9]pGC~JO=#31x,o-z̆ qĢL79ǭ=PlBjo6yDžt8)<?զY BB*l;T .WdsC@_:v5J@,YS6ڑ|S3ܝLY@5T^g`)h?BYK:kbнT.L8n`9D6%~篽ZF++VR9BeSv}Z7|ߋ3p*xػ)ZB"QJ2~Kxx^VR_Ug?I,_}<5l` RWt*+8Jf>k-x!gC IשfZj7;d<dZ~$U|[z[` ϫi<%6XYZϪ)3H>~g˜׀ݧ{CeI {fzÂM '39J;rᒲUg/U<n3G+2іNő(WSPeE`敄=Zϕ솢̒͗rU!uxSoe{cn!yh݋;AP{<޴̖Fl!ܓTP|IS`ϟ{3Y+ze leWQyONW?1&NYS޼:#>i06PGM iC}_uV9lkk'ZBwcl>YlX#}CO=XN?,_ԋξYj ]#y@CÆ<yRtrJw'\Xc3prùvW >1>Ĥ2"C # u46͆V wFEy %Y.kʤu vo8||&!ӑݓ.oVc{U?K;Ըų6,E}cb@>aF?Iο?}9{NZٍuدFzT>{o{P$0)6r|5-g/}ҹc3h)-1UVd0~ٽ?"G}M?؀Q6#͑yO.@.l>џ 4fWQ-u@;mvS\P~ty&eV+i[y}nN~@;h5#x (KcAdgR$j'~ac ꥉzS#%J}V` 쎍N?RzrGO _릳CAwj|?Ue LŽԩe/< sN߰ww u{(AwǑ{0vF6}b` g. Խ7Yfyq֗Is 7QsW(q^< uɑ)Q>~ؐѓ<{{| &[Q3z$k½(Ԫ^4vX#wKaVUitEX\j= -E,eUӪkmLKS@m3ҿVֽ)WvtV$5A/IdGEWSFzyUk<3MA!^7 9- 7^īI0Rz~h=*qBvSC%5lٲ,_X̰˃t Nʄp/X~!wxks`礬8Lu LiNxy!2=:&Yts;l* {)KndX(}=G/sAeSv0sLr\:wKg{X4InflfzǼz D2ε?JQpHoᰛDaΡCGVߦ(u^z7zСU[{̲ìs3X"Xf72qP⊙#NRd^Z#}SxF#1\L6eZFzŧ|Fޗgr,lC?z/_XQl9Bt`TGC0{(OX ^YYOR ߳c_>#fv3}S¡h+k|?aP/^ϻg# ΪioW<ѿ9cXCC>(0wI]N$*z2) Tͱz{o0;G~Lv<Ż ^G} |/F PCdpG}@|:U>\C[zgHEh}\W5'GctsS9.[E OpyGs Y}>\Fs 4ԋ5/+tղ zOt#0RzG-VI4Vf>/م7Ay:IORO/z%7w,6>r 4 :.%<<~pN:dPZunb㹅ŨgegëbgLKt|g 6pA Ⱥ)4#6F /lY J6ᵐ0Ct 1Ld y@a/!Pph}}G )Hm u>Gco.4w@]`܃8KdB?F _6@`_Z{ӳ}os؍#~O3nB=!p{fh8h `0{NbGE,d:#&7b*uឹ[;EL}z_AkX-O>ˣft ^#0σi ``PZِkmB1ϲ[tI`CgItg"L:-0Bj ҵbzƤR`Q"/CQ&L$ pwlB  K`,|;MvCEy`EI?" pjە= “% c`M% *`OOc}uzIB^™4i#@ ܩ5diZKMvQ`?+\yo/\2 gΆ}0 uR` @`C_zRO/GF#.z1cqY?lȄ=k?A7(`WOr Yԏ[qOG J4]͒kxfO͂ǂ=ӿo󵸩^Fރ#7 kC*ha?zE Y̛6zkv{|'.׫m5,f8M~kπ3) ::v.>f8X<; &}(O~9pX:g5 +>GЙ&nմxen% }{oVc0u~: q֍zhĹGM?٣Q2+h;H77{x@COHS N4EMN{K rM 'WV!spv5X@(Ag-UFW`&C,*0o~'%0)'j\=8G"G6wfƅ.qW>տgS?7K)؊~ UQsOB;]3*5j ~^2O)kg{SnȒ{ѡaAHͻ>>sdsc/Gr9N&|{ =;̕t63h H]fbYL![q0_uғ uiMz8 Z*ҝC!:<=u߽'eGs ],UWYҨk0`Vh↑/H_z^mpx]mzmQN}8K.mq4)վ<_7A} ybh..uXOy=}Mأiz _Ttn]dz5-~2Qg_ 3w ^v̪^YV93N:esGx[8d9} fQbs-zj?y9P4ro 6=v13GbgGcާjQ;勓`zww=7.-Zz`B縜7l[=6/ 6;7 ަ1. La Twh$m4>W[?r41FvW_Z &ɢv->z?gW8$\7?YR:;=+^)=W , ? ^-9Ux񵏶??/vK'}i 7"~^Pw:F9Jz -?GU=X =Ů&~1nwBL#kOJ ~k1>}?S`Hy#q`g. |<.YfҚQ#ALl? 0)}7#~GP@pKOo'XIg/f,.Djg~pqݲt[bW[u1gg~WZQ6o3|7}q%| ?[` ~ k ~ %p:h8Okwx?TiyTwU/~Wcz=Mxє%Y>Lv7~еz_~yϳ˼z ,LyJ틇N YH~w= |/8Xkjp\J2pxPb\v78G4QF Rޑ w{P$pPkp׹vd2&q?qpHw8z^X`v}UnK>Msy'ͻ2ϯG}?~> ~kǺ' ul8$Aә[o#Fz.K*]& <gʞ%E-6r.=8,3)>Rľ]nOzO:F 3@tVߣ <轖ߴaZe'Nxⵎg^\>4c2<^"jϖß{x{l_?{|y*i` V0aܻ?T)xԹ /3۶Gٲ{FAo ~s='x^l"ٻuDrc_??>-dG;F@wz,xfyױo_t9.:?W}GqsŅ}eVs(/ |XEفg^-ds=y⬞,pg?ڟ4-aߟgOvw`?L-~w;o87z_s$6",8& çy{{ճy}kP }q5z^y= wJZǯBx^y='x^?3՗RA?_!2ھZC$)u]8P՜K =R@dDQ`""[f LT֊0M% fCLUL>oWQ%"S>d*EUu+%ǔTFJLoϟl]wcTX}'UyY__TIկ_N,mCu۶i1!0zGĒ-痗bRQ"B{SޗeA\IE  Zk~yniJLmgkUQH!Dܶjfb9>lmYN!G@f:ϭ5RZJm* !O祵w3_W//~1MϟΗĘRB{=C8pNYM{kL#O6=4Fk ERt!"_>պ??ɐ\kcHAn,cuo|zz6S,"鴌!///""9jau]Ycc!1Zkt:]C/z3SctUo3D꽫zo^J1B#0Mes1h]RrŘZkQDD"T5efBd )%SQDm !0!-9cJilf Ơf0MnwU1ֈzZZ[Zk D`r9<==!VUSއpbB1)!XJ)z>=]fj뺙=??f̈"1&2/o(*wfV;sA"DdbU!!"z`CCT13 )B)Rj-L^^w09!)"YMZkhf803&bJ_BNj1DfHb@1F@TєsyȈ! Rݫl۶ﻪ `o=p ޻*g"wvmB`mT$c"✓\av ! %yd})Buﭟmnz9_.ooo"#8SH{'$>אR@UC@UM)C1ES0b6^4""mDB1g?!S"bӾwEs ׯuU߯9m/_rνK;#O}}}_WfHDjmf8y1j.Y^C+˺n۵ib !*3!!p)%pd!Zt2rBAd1s׆ ^[q&DSe]^Cq]oiO˲}YZo4T|6Orn/_eCH!p-X."DR}3RmZf:]u0sJϏR2sDɢo'U@V3@UC18ϳD$ [kcZwUZmC_6Z+#"33s)}kk_ p\u͔ٷET B&")Sd&DBbQUM̐Xe<!RoMDbf!ֽ>|oDc0D>R9Sv!@)Tr.Sə9r//_~}I)LQU@L9"LS)l>MȳfDD0Oi O0{09Zz1?lAD^=!DBliYrɄіe6*Ki6-e)2!xbeB^c1r! j~_o}~? "'#HL0g4S"9EDcە B 1胉bc/0뽫ZQcYJH)g3 ̹>`ĈU4b2~5̪f"z!Ĝm6s~_L!ec}ODK?vYD6f"ǐyFc|&b06?,H6R"1fU뭧TDDsDj 仫bf?33u[q]}{}Yy߯×/8coc1CO!Zk"'"zyjf4Q}6a̬L[k1v~_OY- ) B^[bΉL]I SJ:z癈Dm{/_TNz !n73 a޷uy^D"^g@̧i//o՗k <9_DwQU1;"@kzoJD^C|ZJ)+;9<1"(?Fr[dHS'>bLd3c&SkRjmfc$"US``Z1yf `aRi[)A!ysηb SDdPD1"uy.(@/~CmIkkeٶbLTœV0՜BkN糇WD1_RLk"P?lc~B1d 5ݶmxvcSSU #]q ^hiZ׍9NS MMrN?#~^oSue2Չ2_)uWiyAVj`TZ"aAdh Oٖ$(={^o30~RRJmɥf-~~zC~>SL"z!b"[GZ'ut)p`D߷1DUк^fBo͌Lmï~ڼ̽>$"rfff6cTi9S.eV!CUR,1$L,BJryJ)ZNS u]2M_bUBZ5|>"/~Wnk`&})Ep}1=9x>_jcLӔoC^l:6HĭUD,%cL?4^Cԑ Ј0ﭵ1&J)cfLUTי̤ Dc|z^)ygK!Z7Rdf3 /˂8`Du*`f)f=fS1צc 3(erBL9@)r>y޶}ߛHs^N'3]2ģ?G{P0B`e ^;!c[T4,rs.۶9)39BLL5 C(B41xQrvq2eqf"jHlԔX`%gQO%.|>mi[m]}IDEo۶"HHH"fXJeBBbAc D^ufCDzADZk׻g ctfCH-p9#UՆۺz]MPD&D"̹p`m[o%p⒈b91!X}y}}yy} ?l"uT͠֊`%\tj[E$DD"ڎ {_۾L^XYaVoJk`!DHJ Fė~߆}]r {~m L?鴘*+1oj3[R9!)'Qk^om'{ zM)3SnDZM1QǺ22HLFāK1A)e`m5"駟okN9XJf_R4M|&B3 !O}y p CF5)4-˲|DHt`z7,#KI)MUC`@)eOh,, s|wn{3ϜmE!}41wϧ1 y!_\N1&@Dlj)fU)t@a` RҼ5?(pnCH)y-*98l~#B./^^7'DL8ƴ Az<9BD ``f9-Be"#F"fr\>DJURCDD@CTJFV+2}۶].O2:">}cּXR4D1FfS)}ښ: H޿J[;z /UyJz dDSES(>z$1;< {>C,%#" "!\iڷm{~~r9{_dnk@ML[`P¿D.ihwOOqm1u)!o+"x~}'cEl.^mcL e "#Mrz-=gޚfj"b@Dm9^!"n>M33b 1Cΰ|5LLCJL )L;!.%p}OVRc‘b&Gi]W3X|>uvo|*D^z3_ļ7^ko<f5SU]!f"@)t";\ `iJ O#cRJmiw.W$1}3(00̔c)%!̊yW"u18UԬ>z!J`QBH$Ce]}oYt1 I%Z2*rڷZt>|n1ϟy'0S[D鳨rQ}[k!gr̀pYvS!?zp,كM$"oN__ "чSEc|yi^r !2Sr9{RDc ^љcixyz:h9",ff;p 'yL"Zkmyьc$ ˥ 9{ !z;AD^,,s'tm])"q)|_WSemtf{ً$$!l{6;kJdX)UC&N)]WxCy Zۏ ysF}Z[k1e{Zw%yiuUoT{g0`ϊ_hi!2 ym Bp&sm߯+"=]G1dilwU+k1YEk̢S)d o zbPfvDƵ6@`MR%*uټH{fSmO1D;pg",%R=} ֶmשL}{}C_|j} M)}yĴm1u 1zQ[٩ ՟!i4j2Mt_a5SK)smC!պm 21Z[_j穔씒wŝsT_K_9" SJ^xf[w_[!,-B`&7DYPQ)WT2Փϟ?Wl=z'MB @L$2!H|*%~|){9???SʦzK)!R u%^.OB!n7(6"ڷiY# p}[29(8kxW}#=ͼ===#h|ZƐ^A{k=0\owՋ1ƾ:H UgqVBr;X(dN@bt6˗ϽDcDMi<12p s0P(VsN̦귨ǿ8ZLDV:,4;fRb1mJ=Oms`%_~%f^LT[w&V3SEB0eBr)x}} !m9ggUE GiK/vZmB~e1GOOctD"mf72zK)~_CS{6G{J)Blz+!i23~@53+%63+ޱyr׾Unj,H8W'Tʴ,'Dڶ(˦2nW/Wm甲{Sct51et$rۺ9TNDl"~}}s@)]Tϟ?~')~Id@)V wߌ!jf0SHps]b7<$lvU1}8-g"ozzﭵsutq~e9ַmc~/瓊2ϟ?8lu꾛Y1hf)Ebz}yGm˶mLS֛rD{̔Rn]g`jNK'H B!D0SSh^4ʾ=~`mctDjm4;}r:y:5/B> ,riSb`FbBTw8}!vku/("1D*䲌ǐÄL2dݶiarOT2>N4MDw3;x1h dmTkBg@^:jmTk_e9O7_~JN^͠u"rTu}Nq 1n{DSk z>;"ZrD0FgGxC"Lޛr1DDBd@4շ׷ѻ'Ly_ Eպ׷7>EDdNޙ)L@HY eѕ\)`{"$J1{?5)!8~= RLx4OL$0/J [ UN𞠈uw X3Vv'"U!Bo931(0X>>bJɱ)cBoL][c'/wDd1D3C'Ɛ AD@N\5%˲)ĥ9e93)<,DFJΈo~{gjb2̈XEpw355D2WHjmLf"nf{h۶޷}ۇHi?8iuk׽9w989!4#׷ǟZ<:ADk m 2 B3H)cSmjfOOϟۊD!Dq0\UZ|@p\\&öUQuQD|\.BgdGAkLtRrݏkġjwAicoo `T1skɤc8rC3A]〈"jfTz3!Ē3dH頴Ȫ5@DC\ΎäKIϸEt6!0޻NSF}_(}]{mNi*D//۾Dty]d*#D[ UJ))QC5z4 0ŔRbRt !<91T~_bX Z!buRv Tm{{ LLn?xk.e} Uu) ؠ~=w qc 9JM` qLCD]܊Nz!fHRD3@ƇfuNy'uH([Iu|0h0{שּT Ԉ@UsΦ0F1Vkϟuff*\rN׺m;NY!ܾZ.b)Ep^<8""̄ĎKBU%0``V$80sC{;ϭ1$t_o9on*zow g3wk(u.өr>1bkryozFD5r:핟ֺ?]8|:R۶mV58phrݝ7AD1ŷ!z#IМC(S)ݩY1?z)t:]go m92F7e[۶1)fgD<-rZ[E#rR)iC9nv\D{[k!xna&Uc h bbecd>™<ڼ:c&ڋXY˗{⢕Rr ; C< 9OCt[C di۶S.v^Z(c1ͥHUcJex|>1s]U4޸vN3GwkvzADcdo"1\kuD׋R}^2Cs0'Z8zSct^ s91ij2YZ5s)e6s{wѻKFDUe Xd $ txR`k`+9L8FUTĉLwn8o'bۛLATEH9"1C*xz&{u'qG1TtoJiVUUirKJqSD@@m RH@@!;*)9 մDN 4@?xʓ"qhM[Tr)c|72Y{BtA݅AČ)&t30Ǔ}8 Qmʲ,1DQ !Je!'ׯ} MojmޟoA Tb?zv& $1nZQ4+37̜ReiF1: { 1Ɣsq۱iFU-.1aR cq_oDtou!CN%ﻛ֜C0ӏn -:ZuO1b`z`]BD b ./錀*c۶Kb&x>MRb430):%Ed_oo]%8姵]Vʌ)e""f#[CB?Tr<"Ⱥn۽bDBd уΈpHW!]u|!&/o[oU~&!Bs7Yy 밶&"B!r`?R*xDUU{oy?7h;s}!291gxCt*eb>[`U@ RLj6Hxv:kIzF՘|>XZ79!bC{=NL}N[}YL%ƴS\ 2͓ U),j5ޏ1T O\K15n=].OONi_o1dc\JtZ}/9.UE9%w쐩)ːv%[y!(PAd{]-TJqGLG3/af^+{8\/Cn8ML-|{}/мqp!ڶ5"b(sqvP,K.˗///̢Do@2pSJ~ҸY4x\uug_??U1SooB 7 rߝM8Le)~!4ك iھ|d -j"1&Ds֣ 2 9:5¬yj=8MstJhdi*6Bh`JL!m )9g:T*g|y>kvT$|>_"{7q?A/i7vw+Hē{%&&]MIհֆ1F&!h6Wf*y" +sr@."CJdVy8pk5ń[3e10 B7 RUE  5Sq-- 8!ZnāgbTJ`ӗz5ٓ)Lػ"P0Ms ?&pk&tjZ: aip3#S`rFpPoŒw.*<rmzi' 3HB L{A@#"1@DBܟ.TuI` ~^Kb?yj0wo5PozTַmlRJJa‚emr9㏵inz]v}{{m!֚LJjf='ב 9e "nW/nn<-"_~_sN^Dmzߝ._i-fr31i*N1Ty(/8CȚs&}o2#?#՜2 xȾo9CQbocCyȾW2[7U@,)pn#[)iG'8CH)ybN)dv0}Gi*y11LZSODL9bj!b$㰸,5HxX8^nsbb0E$@L1z{c̹r%" 10w0F"C5=pdfG!F|\"ٱ[CL)m,˃d~C&Cjkc @<- 3~}}K9lz2뭏!UW8KCUdξw"DjTB.y!>]zE":OS:| @pv'󼤔`ye^SSDidva$^;lr:7/4Z {=}o#4EDmy?}t۾b룔闿>Z"7_|u_mI@^u˹x}V7K~y"}tϸO糚d2v fz^izVͽWa" 1:3}quݘbZsWCXKlfBzImSy9o6˼̧Lۺ?0џDH?}zP8xaj){>/qXrr"lI@|< Sm qj|^b m۾mff?Op?j5!hyooZ#iY|%83^CB js.){s]\9"Czh*˼K)KmۘekGS^ou<ܸR:4M1t0<*G1""8M z݃ڠ3"Z1usrB 84YD0 P{Tciɔ'l"&)EHʁV]JHDԺ*t&"z8eޙc!r.ud8nU<۶ow޷m]_sJR"#!3ʐ ]DD}F fbr};N}yyAi|ԌcL)2+}w?DM"*̤>4Ȑq*"RcZE9'5Lښf ~f^趮uT۶=&ݶz>b2OowCEJ˺^7&8[9Z yY~)i*c]ұp 3NKIռ`{B8Zš!u!^? 9 $^{5?V뫻QneYޑۊcs:/j.m}yy͑u{}y^N#$^|:]n E)1% NqY6_a."`C}'b 92M)FW{6DH!S)pV?,VbL1R[u>w\r^>d}{]U[zo{MN:1@T = f9(8|֚ Ge&*fp* D3KUS F1FkÒz:!Љ;]:9p`e!>F}!bVS@"@MޔipT!S9sSkt0S[\k=̨Eœ'ʾchrlchھUoP| >tdڲ|rpZ\8MkȌu߷}rqPW @C$<UTŶms{;|:0o=b !9%fOkމO!># wkY7룫n.@!D"T. 1>pCTlfnݽk퟽k*{u\;r\*;=Rp53sa>>^J1gc}JbLsi{U*䜘pwg| v+Jp+!q۶m\GgwwrO ~_sNn۶2ۛ_'aR\(BTvw"x:0uY8kryr}zzJDCZRj{vmT S}N!J]7bY zs">_vͽ(\p뽐SBtG˕u)(9އ|cf&K֢c{g]0lrq!h*rJGNPrG| ``Oա9sU-!yHJM.,?~9-0trH;t3U)|^A!>zj"D\[pTюyxݶm.n>'ЅL@ B3ѝj >s=ݖ9j`߷{BpXuf0inBLz'b`v(V!Ӳ`'if\{uCXn}#oUM|d5zuvi)o}sϩK)$`hcZk׏0 f TG󶳊(ADBr1^߇zs*T,>}\ҭ`mQDRJ.ru =7gg`{γpZ2MD/>8^L >ɪf*ޓ!ĺ$ny !x)fz{[o~> vN4ϓTvuG{oG}[\w~ %0ƨ{u./iYB`N#@.@Pݻ³Hi&q"]U|c`@Wr>nTu>} rZpqh9kT o1Ɯ뛁n G xpܽmݜuJħyydqI W5 S ĉ*09ƻn/CKSz{niZw$lkT5Ƥ"~"q.| 2Q!BU@UQEGxe 糧&XL*̜b}_]w>-^ f1x1M3N]J^vĈރui* j!ȘYFo1&0Umm @T ɐ@VͷuuወPL FmΈ'k;l [`K~yyuvEuڴ#1RG6weF*9q!cu~Jqt",WyRJ!KOIt-B[>x !UKLGC) >8>Yn|.\eYw=(SJYŘW*q`r!|ڜaL!]׽iY"$VSx ]ވ1OtgQku+!c!>p tcI,)u[kݿ~}yj)ooc2Mf]7upD @:PRn#1Cb Z,M;SNi)&a0F^A$7`(%E0>.*2zFn7LHdR.D1k[ֻ V,3x,CTmro*tGc@c:ʇ"z:x,żOeۙ82.yS!1rfֆ1tDz~zsb"2H ~s{9֪.%St OBÉ[k2թZ2Fi}12d&$[;zdj!FU뽇)eopyL{̹ib z)! N0e60Z#ÃbXt7Gc\"rw-d9݇i-ܝ+pk])&ftc绫w٫C "y0=T1DS{t_BLHDC[DZ룯[&U*TBT;*=m4>d 51ƐbRs;~uvw_)&S]:I#̔RƒF |!D@TS}MLu>:Vc|zr$1B]dTh_]'2?2F%>ZV5p>?ƫx !CxhLvn[ ajY>ϭyFOR>C__zr-vju]Dh 5b2!#*1N!D@(]3ag1RW~z; d 2F$S/v O=7Tdzj'2Zm~!ZݮV?<0/.yRfc!!Au~BTo-*GEd0h9j> w}`|}k'XlN2M>~.4M4櫶RA7Yx .aN сTע﷛Fךn5\ݲKiiv0$:! םx)v;1R.fXrB"D˨$R5ȁ}R`0պ׎\Ja7b25CeBh[uYNf?t{oa/o-fT4}Gz =s\k)2n+8c}ۊe*eQ%.%}DL]Bz`q 7D᧪RW9DEDjC:!-sT&f#1_9ee:v}6m[;/T*Bd&1$﯊j@m x ݜP011#g5;}ol_fD畖=̭16F{sTbU{?r\r.շw0%ֆKBuY:O /6}N^Z"uAHOO*zL입1L8 syZo1n$CSRu|<)! rE{[sdh#:%Wb>-rmyRc^&#bm|{jzr@!Kfr}OO~ TWw54kky1>t:f!&bpyZrDrtU|>>^c>ۧx(ښw?q0p:BQi*~婜Ne//eq˟ٟHN%|(ue^+1[g|NRks ,Dhpp ;R<2KimrZs~_䦪^]1.TL],|:_m[׻3w옡}eKIcȺ)y^r)뺊(3{U3}bB΁u g9 Y!ux_̓8=ŠNL"<3uE4M yGsGG>x!m۽^Jij˲ra6yCt#胂'iDmUUo? @޲D20043E`05ǿъ1QTxs 1|ed9df00tۍH}˿tf"mTR2R>ι!cĺhe[%p^3FzTDJNj&c."@k;H4SB>Z__uߪ17 .`~E@F v@ǻ"2@gm|<E˿~k`j>K +q5 |ԏ4lDL_7sbc2||2)Z;zaدNRЏQ jL /yyc XfS0}D==<6_ tw0>`º+ 2  QM_C{&cJ`rtYUUYS}HoouZZ >@}ܲL1VfO{?ƖK➣>u !~ޮkCnHvѦooތ{*LB)E[D%$ݻ"~{gCdf ]Ei]0? z{)s{3<EF8 h¬:X:f?% *: f"n1|Dp1I>=y@'Ǐ f_Bܬ22ð0)2MWܺOϗ\яH{yZKZ11wYȄѭcs"[`8 1!bc2'#i!vםW_u!<Gg&~$I`q!@ް0_z€ q&cc`0@G@q*<="!AحGL#70|X/&U&& =\9q1v Э1n>{FDE7#1AD08C]5Eҭ!@ P@|TO-`hVn-bKV1  o>i1 Ӱ|JL5{5S@ȭW_L#^o;O9}[shz#}:ϋ}뽋Cf$J^ vLٝ/C̗IbdU 4yƧ˗u?r bgcbIAfv<{'jsc?.aj#oHGm4cO=*谞1oO]P#6t0>,10@A#D^hrHbwXOv oN(X6? kn9um{Eއ311պ[ @˜0!j1o]toSQ(Xk˙a ?tFjּHok1xkю>2O.5:\ 5LY uFVmDfV q\A€)02P?%B0QmIĤ ߉FԭwkAgm@(O)4IAj{Xm L=~Dm홿X! Ov  ABװL 2???+m O`\7NӶCq!|m2t;3Mefu[;܎}԰{p ![kVq;.p;珼tuK|}a_F'ظ#SPӿ6 T\~LM3Žm;}G2i"{}̶m]3q֐OnXAH`xVBHl"tɘ0thHf"`_֞$~` Gae%L 쑋!EL w #ذah DLz3c&?;DTk.bIDr18C L!CBs<y);:R0BkEى9DŽ>ݨwp_qO1zt$0YoQG ,0"&@ a^xLAɻi`(&ΈB0@0 `OV8‘n(gB/I`&` ]Atb$8 !(Q y})0;T/WC0b/4Ngǐ!H1޺"j>C]US?!Q7#2Dtmuj֣ 'r3Pad#wRD lؘp͋*=! HxϒQ] #D;zȌBF[70 #c%aO_~xt:. [gm!rq۶}{9&'&~g7ev gاهJgU|VJaۺ 98My>]L/BBӔ] [чo^{PT%H!GۇZ.;vuSA7 #:&p9w>_=^_Nt #j5b$Dچ +1z17yZl`ڑ 2w}4=1!<"#_>ah0bI_䈐=BgBj?nvx^r1ok-Pi[w &*!| Ȩb }mD:m ѝM֊HDj?B'B@L_aD!<>¨#@KZD:\PC#{ѻ"x=`!i'8z[:?򒏰0#G+ZD|⑴o9dOE1r+ DGc`1{Pأ>02xt (w7V#rF _̾ _l:pܽj{i`w+Ŀdܬ -bbd5Ђ"vhxF(|6<#skƐ0+/Ɛ;bȗ%5G흷{12VHcΧe^-b`^.h r:ȍI !r4M7)70|toBCdr[y3c]e )Ɛ?84-I>1.CC Oh)㺮tuq /OW^^I> v^9WI{Il?zQ ؀Q@ћIH< G=Zw NL3~ADhnV MMՀ1 5ZKcѝoZ%=,>)UjLMF?N1ݞkzݻ ,i*[CZJћ:0?~XD@4a ԭD8~ZG\#@D=`_jGK-L*00vhaXGJHWxpd1|нQ  `D󰆏G)MfGQ ͆toĀwD| *8_#;2F?;1 ~\?@-xȘBH\(:Gyh=p9oh b#QQ? ?#Do_5H?.cv\hxs8ot~@Ӏq͡Bm^$|)SMBӃ*Ҡ%bi~~l2L0f|c|{|1ŏl8FZ,O@AKGwQpHoNyAFc ѻ&cD`bƒ0_Si'U͹kk._-e.CկNY5!ޚq xGZk.p,:Pk-PJv1Gn .)FDFp700sY=z>/O_ n`n[q0 1-RkS#﫪B9??N3-!I1~CGU%~Nr(ݫiDTG }+~?HAa`kOdO ԉ&G2?TW0"ZB26W_Q#at;Mfq"fvs7?~rJhל qp*׺OOn0Fs`.353W5h m)"j&ztGF.w8?Gl{szwjmfbbL)&]DsU79|@|% \HjJL r:=?}jsmqd L?T'}92f>͈M ԎDƫd`7|paAD?[,ۖac٭2s}ιXIuHeʦdP Л%G_/M~"`E E&&ATD@Uusn2s5oι(W0ޙ+l3!i oAdyYrwēi Y|CJQ8f"ZXL˃g\uSĶctj'V- dMJ뢠gqqPVT8 _{~V0<ግpBFH6ag*C_0`$B΅=Pw) <7huqC.<..agَ(]!=jɎq2k+nF4X yt4J%2f*AMc%/Jc@%M5P:㕪g<:BŐے;Fmƒ59 =k`TXo %BL~3Qg² U\f^_<OD{?MAU9L"f6H% K+Ң4N!Iړ6궭)̋q!]os_̏sAYs5k){AJdB8)cFQYk-ҠVUaABZI} ӷ_ گzT(#h"7AHgN :Q5`Ї TZ]OpȨpCe"tJTz`,j҈wRWL6?i2!R̎fY?aV8AycH_")asRU#FI1bp` $BAEZ rH=Fe0m@CccbQ`܁sUĊ@;uŎ*T˶pm#h TKTņƌ&<jd]m %>*0( ^5>g٧HTQ1+Qn"7WK3-C rlnI9oPV*mժzl&v!T21Pa ,;sYҺj1dLxJf dJSRH?U4z>T#c u "561$l2e *XđxԾsSYXjioCjx8|3Z;M $qY+lJ) kRǐ*26=bg, 3TX\-Hm h{??H)HxlWcXĔ\ pC2|P՜̡5ŌsRB0#,7zrycl@iٖv&%z`o3dp}IB6_hH'`"!jUn_Yb=KŰ)Z&Ƭ2-^:Աì_K~{]q4}$hz/NB{\L!ǃ0 T׶|]Zb1@%گ6!ēٮdnjL݃MPV /ȦrE3L1 $w~cq4_|!8k0k-%a xqέm{1@,Z;Ƿ jJzb uZL!aC/n`ޛpXvi~n[c眉x۷Rj-:S4ݶQ:R6֞UZbL96`cR*ZkuW*t";V|9]^ xP1wEWΓD E Ա*vlF~cg6:n&0PE* gJDg8Nα;{_V |G $HODp֊P c,/3 y,l`FW@#}x!;P_}Dflց1@}NI-[%z-J$ "k}"uBBUl A4e  k*pMpS%(L$V"EnP &k&B]޲ ae <}7>X>YR}iNt>D IuY_~˿3_9ȑH{9nwwP< b26?=LLr7/c؂pInXPA5q{YfFŒKɑ>k`t,:PN{xJi(>YS}˯ZcrJ*FJʼn>>n3>ӏ+o$AdkVpڧ2x#; ؖ72c0($ 'dL;Eab9=~ccsB+XBߍrju=l, ՆT7u)XXVb&63ļNeԯ:Yq1*U1WĦSE[AM-cֱZh9ٷ2~++2???ǓZ1:!1-&"$JUM9^ӒK:Mab}F,Bm AeYO_ u<S.S)%#f9JNblJ۶Řyw)15*"e9)&" |y'zwoAܟ(O;;Q2lq jN8Q:>TT Y^W 1J {!QwY#񘢤튷z2D!=IG9J#i%g(ivǼPzִ_o8d עL\jDXk%{cm)lr.1#G̋ y@M7l:$}L2XUCSjn)QĴ]ƴj5,c9 c"mk{a[mQS 3|Rj78+(7=v6xӣbDʚ3hnp$ ڢHx}3_uktSj y#G =&hˮPv<$‚c~G狪G )u@L3\rs՚sB4OYm+ڜ㎛>ߔzm[`1X5я!x.^Mx9m1&JQdsS兙!L_T|\_^οvy|1 6.ue9|﨩 JZǻ m&T9h({]@Ysx2 (7 p ~4(e>+QbQm 8&]'8뭱='Dj ޕYbJ۶#yoiZu3bDR̥Tt_O'Y zI)zێ7)P7t;EN޹ 3 [Xt'L "y PHܩ(U]5݋uYDJvK5 ``w워vS+ xhD]xc=} &GA]cmT✪j1rP;y|TԞ%oWcO}^ aDVISBEUʹ6e>V!]}͢h6 @0m 2Q3T*c#,QcRUm`$͛o?3?EN*Ycam.粭;r44$=Ř%SK&@J)۾}_T6i @Hk/t ;[`0 9eu-"nns~]ZyzspXNԻӉZ?EVxcͼQm x,p@ FGV5!Yum¯RA64[ #% _ǞTKJ:2Bf pD)ThD MЄhC0z="J J&5 K+Hp 0m0]J -ZR ?#VuRu%a.@m$LtHz?|c7wSfYLTg騋t-ӐLvnTo?Ck7p ]Jq@ ԩ/f`ƠYX7[+2/6ƴZ>M3%O`(1s b6D%f9)aܸQWXAMɝ=Z131T@'5g>70?b"X jKJK: G0P\EXCvq/~B_'CbZ/ Abέ7®͢{պG܏=[cd)Ÿ3ufLə.p85ֺ)\CZՈ\.-zv>_^cL1&bo|ZYJѤKH^tA&,q"yK jN~% HNu.1W5߷xϗcL/Ο.rǐQF o .\vW+9x ɐ%O ٢e4˖]_MuGц&gD26 eB oI 0MΘl8m09Ĉ1Fr@Ykiz5֘RUX[Usʰ:==ܛXz"985WFCv50Jd&zFGNY@c{ZeK[ݟQ,KVȠu<i+Z<|Y="7lAfܚc l0Ik/qѳOnEQNp Zk{wkY 4xͯ0 F)Lp??=(RR'w5g'?jU?bk)J:O {8ַf%ܱu@ [PbMüms7Á^^XU=~鮯*pgZxWS'0\ 2m^6NDDY'µwc}0RF̶of|sor,nKnĀܪq2k9 Q@|ChX@_gAVdkv&IhP:иEջ ~5#L#<;Q@_@ʮ6A]c4E.oʊY6Zn*L; Gbtkw\6w$\YƔasط9ʯy@8K[pVk!z:ܢd ,Ӡ6+Z"SƒPc2^B{~Tj_Ua_>߾+V,m1 ;p&"ĿJUǘ%Dq3ÛiE8s! pQ%" 9_rFt #z<Sc,?EU~y XjS-ƘeY0Jt{̹"^U~+1rqCcȢL=1qzՋaN95 TUArh1rX ̚)Z*؃>,YtYt#6 MUnXq2 vsI{AAm½{9lUFGTJ)sNI2g(GTk)ϖy`t?ukU 8Q gME:;`wPz8&-![4fKNHbKΒzƥ;V.Ͽ`h)iW(R?X$gT 5Ɂsr$w[_UO f23 4RMLlaA7 ]ѯX'uPUγKv]":S.:pDԑh8.!ȬMwktY |L9`>Әm¥7t`:1b0iz2#t0Wk6^۝vkbA?)UkJj//ꬿ;ưD\@~Tu{~z~|XJ)WwsbRJ(c e4c`SJ9񿀩})'SLYUZi`XkRjH}Ma 31} Ҝʼ,!zcToߥoS +\cMd،E1'-%ղZoo/2>mzΔћ]$jDGM,׵p=A&,-oz쇻xio~ 9E͆}$Iמ9M5DFiB2mbݨ1юf}x5pO4Yj{=px-ճ*7eQ\ghd|ԲC% =mg7΃+R];dʈkRnýΪ-E͚10>mjb *!X- +Vqg6AVf}ϮߕzcLZQfA~cyv"M); Z>ϳu.y9mT~ZXrN֚B)f5"swwgݶmZGDb f%cѬJ0OO/Ιn;iƘ_ۿ)vWs"l{ ;Siq1 : CCBQYlTL%<"ƉGj&VmݞXі)5lu58_g'eEa;6؃'nݟ1RJaw5 +A#@Kz%r8,~ޚO@Ofq쇴||s!-׌Ɍ%0w5}g {l\u=,̷'Eǖ_mVW7mlpsbQ'UvWԀntk: &rs+܆]6 R7i󢱄z1LIX*t hM~>ȠW/;`2fٔkJIDJ-M-2jV*ubϭx˻ۅ:u]kwtw'8:|PW )ZfQt@}X[1"YS_`;  *Qj@G$wo~4H4FzݠU5LDתaqvК̹LӔR$yE$ @Ǐh_M^Vk ,Z%Z۶.[On0ǔu9U9swLYSL)_ۿQ>1_Y04Uc1٭O6&'Mlܭ."}}Vha ?P>SAQ>%TP[iVmŒ`>Xrw]ox4ys}|'Ȉ89 =4cc[S?#=#?`Co>mA=ES!l5IH;q| (^Zg#]Qw|AI)dعtP*lԏT| YF;wLa4401dL6phQN<$u @^lh ㆗P}J!KGiXR[Lm=O ~*Tض+5zMBK5~OfJȐgt5=2qOȴj]FVQþd:^:}3܍m{ 3^Y&4oL?Ѩu%n[j2 JL-ԁp|{WSn܆1a"fK& `JKlеdu0 %ձHk.=P'}ŴB1!fOwoY&2 n! IpW"z}IZ1:;Z!)L8o.Y>RC{G{uUĬRO_E,5ca9 vwt:e}VAczUaUi]R׾.cdʎܰ:,(jl7ׅ[_Ui`^&Xn-a~Lx@PUDYoqKK $,z!O6kE6PQL~1"F0HH) ՝57/?;~{Cjt-}yZ@OՇyAG!Ԩ-CIj| {iUTzi /҃ 8~WXO +3q\!7]o1>'"ڤJз(PՑV߯(1$5I>td;،iCDN~Ry؀TZOYa[: Sӕttl4È!1BVSR\& LK2\0$_Ͼ64ʵ#(Td p^Z+ix/o&OG*9of[-Ua&v@1Ua9ѾG\-ḨKVa6t~ėo8mu֝g#w۶ D˲5cMK Wb)Շ Z;'"mOr\v|2rӺkZm7;Rگpd4 XKY '5!J` bO* 6­:Bv\kkms|ƓްY.چ !#@ h .Q~s delǬskE{֐RİIHe>N##B_.?[$ J⫆}zW0%r/Q>#x8;l 8>m< bE.DO<,=WIЕv e2F}3촭iL2mtB" iFCCdX1d$>G=>ެ<5_MomnSFn*c'78 Ʊ#O&`e<C5>:bbudVr{2]0&[갊ޣ/ܗe[=z18TXzPk/΃VGO<^=jx1d\;4MDQsU :;O3\לJBJ{WJv!,֔ɿWr*Fmք0+ƪR -̓JD4MDt<ieYf&ڶmYZʷVCЬd{m$.Hl~0m5'7=m2醎:119Fa6b7/zGCKioQ^ Niv0P]Kyj<ۢ{♱~( C?|:x߷Zufl{.fΥR1lI9i",3>ms.r9_y2/H`vl])wk-ZuNqhyf# HI!2Gu΃.^pPU-Y Ha.mC *w:zrW ^Q7f,#*:sHK;eitꂺ@W"+d_Z i\nCm!eH<_(T;0? +ˁr:_ZCL틋fcxn-x:%F}(#v'I‘O*1N*vDD4>#_gZrQ/ZrIm3ƸZp:tpGJ{%0ji\mP Zky1F4O̴1D$>zcJ̼ӓwv?g////g":Fć7U.1oe=!o+c6D)h͊ aܘU%6"MCT%9$BNL  EFuL D~4d#;/R_,ӶZkN/%&2xm%ш0qEXD?o / f =[DlXzJo۪yUdj`mI6 y[%w73Nw+YQqh*U4wN@[l~e Z dto[1|_^EoJ!ɑގA Tk{מ^[MhQ \XPã>WD :î*OxyLIfMxNbd!d8Bʃ V(bgK m&{C.>9]v4AifB,K`Orx Vau|?>Ӷo+ c-ƜswI+"Uk)F3fX !R4Rr6FDxeY//!񮔒r*Um%"kͺ^_^^>Z뻷oĘ҇|:ȹnTܑR=PЎSPj IH5VR@?WposYU5kvRqXWؓ:V\%xvi8>זgqΌ,Y{_UHZ-U_Ϸ~:Ed|UEPXyХf"#@vת)eU-EK)/A;yц1ݮi&N=O,Z.U 1G%̑IdžE JO`ȑf}UˑCx˶ct *EK"jqsx~Ȑc&ؕ+լhɚkwn-#j:0еm8mV`jG '^6h̲fq h[J+t"-,!P7vfH}Cf;XL$._YI/2/?҇"˒mО-Ye.TqBۇ ;3]z* 22 v>Ky Fp5|,;&wuy{0SA3k!|+\5&$B^/D4|/o\? (6Md"#yuuB'풉2X 4c'c"ς.w1:m̷3yf5'ZLd2{HE6o49 ^a E#U-!-~֣j[G[}Cdw)c>LwI z=Z7FԢ/ﯬEqQ2wq>4Nyn7͔Ӣix\Ø]RB Y `y[;xR FzݐktP%*bK;6d1̄/STzSvo!G->>>RUNS)L )y~xPJfDjc4OιRw:ϋ_*ȼ,[|Uz{1^/k)̹.`~ K)ZGp|m#hjo:\MާY_0X*<#"Di[גhպVGVl dPWijyr¯ 3)%6\nOL#)\}k=ԱT*'"=s},'}OHZ%j֊'bji:{F,31\1pl;yxtWNnFDZ{qC>vi6zs'Tήz!*-CB9`w s}Z OM4P[Zn4angPlGn2b4n>a=T;ac i?\^?;vkyX-onKi(XW7!"wk\ ؜w-Y#oxQԧ|A Ь]u# BWA hj6 6!3ӛXȷZM9*Ykɝ.-+ݩm=N~]^2VzV{~+>x#|>WS1۱ӤJ{Rʥ4M"s2R)O4MP=Ɣ}^׿9u]sUkNi]!49a.%3˲,xRN?U(>fWiZWJcjwu.%}ԽCgˤF.h)p$bZ`̥@%1mw(BkZ.խLJ:zj3p#Al@D}Ђ {ax:>ϟo\?#GJZIʍ! ZkL!eR}g$fG)Kz? @Bk.:" L7'G{:"7MdNx7@|CI&a:ҵcCuy Gv @C(jE}c= #a21 JUeᆂ▾5ΙБcyFE3ZXqg~@kJc!~8ڝfd"8HL W} [fa8Xc/#fC&kynofϡP)=#ңa}ߥWm&xgY>?Pk-x߾u}xx~Jiz^^^0ժ1mSUg"bwQRJ”Rt4Sz\})yx<=~rN9}䬵\CXks~~[ }<pİ>`YsavU:=y(XyI!}\58.!&Ek;U"〃dJaK%M3pÕem\c4]f",|V{ݔt\?M?zOjYUcqIU c )ٶZA/%g62KA )RD=;iWD~XGJDdա`u3lsA56}3IiL*׶0]&O0bRax+^r4\ pShꖩAK:x=#FXNZ){'?L@8j:݌ Uz#kFpW-Ø[9 ƌF=vAstʞ}NBz 88\%ixj&`C6e y2S\??_{SJqZE\c~~Fw{Tj$̵֒+BDi'Ce#+QkтUmђik8%6z -Yhol.tx.TPv #6nC;oADFٚic a"PF:d u3\-@i&T0]줕 -'KO0ou* t-?'^q#Qw({YK) R1T~Z@t%RRO.Ö2LP w$s_n=md2‡BV DqurKi/_N4`m1C?z5MUnڸv *lu%G_A|Z: U؁aC@#u 3 s-Zf9Xv9<유Gksz]K)ÁE}c9ASwtzzz^u'S=Tf^ `-m(!L:bݷ=<˺n!cm^kM)ci 9}ELwn *ή![(|@']7}7prCwؒ[J :P"&EB9p7Y3T\UYUG!kWUasNisILxjݲ5H̟. ղ+ ߹?bU1̄#Pz1\rRw>DrTKE`8q{:Z Dcemo6`mXn-}ǫLmmka5v+AZv57ݤ5MNGŇ?eAf#8{/*_?@_cn?-rM:fe+nJD4NDqkWC`m;3y 򅘨 c`D1>w,nͤ{e֫a(`"Tj]ٳALDމ#͵lDMԽ̢M!8ѱUF!Q eTLeACH|g&42SIVUYɋ'v1{"L$0^m5Ƅz u5R Ӿ۾ٜ4yU9\j ppc ӛ7os^^^eQC9a)D# P7k̒' ײKȳ h'I"#OLDUM.QKβ7oG_[m+đy n,#WlnRm?\6n]Ʌ?|gĈmbKjs)KĔSafX[cEl\V$#ڑ,R{|%A ޻ac\$m#KȐ67ތ6W1AJBɎs+B/zk+4 bO1"~ :-q.7}-l̚qCq9)mpZ;Ӎ:Vki -#>J.YˀDc'>>|sϰ)m'QwnDb;֔&<(<1C d-(&ϾhΔMr%V87!yum@!c\.Wk-iZCɉg: 9'kRʲuñrU""BƘ%k}'RqZ)}z8;ၨc}D^^a c=pҘ5U*Y:1gְ#lz*rwnP=(ZO21h!ް{c/ NAZjňXW;|rt,\r;ًe]6ݻǧ蝿^.95zb1j Ğ īxү{}DlJĤ,O+7)ND\,,ankayO0U%ɐ{aH[J=ʦ*Flk w]K}$dO§ҵxX,1/1Fz8(XKqދT)F8TJ>4#Ukc[E=VոTr9/'zgt<߾yR/iwZ/ޕ_^j)ه0MK:D~poBc5Ra%Pkٶ,"b TJZki%"gm-Ԫ"(%{ﭳ&BrZe5\X :*m|wR:R㣈NƘeBH9Zg_*`[-,N}osn֧秧ǔX)Ecv_/Rkw!}M.TyM.RͥZ+Xi?v\e8Gb=Ӹ){ݺ%¾0=9'H "v8Q 4GF:vYnJTx<2^9%{͛ӗ_~H)ZS"n[Y+`<KAsDR$bc8mwa{m%m]s|)R9~yQiϗkшMUۺwTNy[ A , na'-:{WVئO6:lÑs&9ozY)=?=y1Rӳת!L}ڒ/+ C,4mSJΚyi?R滻4\12weõ?5/PxpB26Aj G ZCޡR g9"+uj!ecL.O?])QTLHg'[8c9o!=n[:>PVӮ[d:Đ ݧk,۟qp)>l Z*[eŔJ)Z1f]eM:gy֔UUDj%Z5oSS1m=9GƈI) 2TafcqU5OʪZrɹ"#TڔC 6CX:l nsLŰQgO2/rmP>ZQc*dx>ii]w4M{"J:skX")fΥRh՜D%R-Z)&TJ,x`bj-SI"GD.q`B8\lyk)=CwhwlVa2eq; ~|>|ij-zTkӾm۶QɹB]WSv31ΥD5|PabSsƊ4aE2x^1,yNbSA<ϥR20@Ut=_r.V²mkNIĤu1<s6 JZ1ʹZB;wk0c6P8+6F&l@c8#(a|^QF,"kI);q"{9#409VBJr\mㆧb~~0,jֹi FDE8hMJq.Ԫ<{V="3@+Yw#R_,&\sfPdJCavD1k 5jج_=̗,7&O:γmcRk-ּ,,]1Br%µR2Zjmj)˲ĸ1Zf̂0>ZK!"k16h9j)!XY,Z2Y[u(/؅|" 2'jI l>m!4{Wii:h;pA?78G\mJX>Ra1h挱q#,"<ѹ""J[cq+iĬ)z81Z Y?V͹*Zr99kNZƘӾ˲+/gfUuPe^zHyaKͥiJiJ%R*傯5缮kΕHDekR2k0e-朌i;aU}B|z/j,vnKvRfcƗٰ.̝dBг>a"\u_~@d?_->xdӰ{{罈5[^RFK)7D_)u]w" ΩdE3FAx[ȗrO !+{,-X+} Q0\S`_6`\8&nWU1J'<}dZexɥj:و[E)YDGZyv؈✯B]J^a*(/st:RLS1)R"s1h9,cl۷qYgCD. ^jU5s9AWێT#ZSJսNDD%c YJ5`!X1Q.YDZkQJq1YRr.OaGȶy^wȶm`r>_.KaYf93^/m3D}k3|x\ivnZrṁe ޗ\K()Ms>\ )%*,b*ϿWrzO?59!cB IR4C[h=|VZMJ].JTP6nz,ӼxrҠ9ci;'>_.e߷m{_֪iELU] g:R NLJ7R1,܀"ZGDY!^*^fYB71ӱ;itѴe ]:'eG&y*YW,ߌ翠yd0,bR*5Ln[Jو5’b{sy;{1r\r1ƘJB k*3c];܀_r~  RrC ƸG|nR~F.3*J "ຌKsJ4 vbҋG<CMc?C}ng= ANJ|aG\릪m]K)9#Z#lrбL(= -XՈUIZs^֜sn&1RUUi{)QluK1tc-y^urG,iqI.xP1i΅Rܱy0r֜N)LWUZHKhvkm[>&ZkM1i! 0VsKeYRb<$)㙤}1y||cT`e3/ n:B0ba&EU׭^/O.̽0&R1&kz\.z)&w有@")q-ExD*a~<)%=>=\5oJT?~L97f"rxC-@ӅV HC1XǾvv.%2edʦQzox;<={SݏcL)%s^9SJRU| =&4&Ur&cN4G#FDH|ϗRYBߝNZa 5( ED(])qW-FR*[+:bA>jRJ3 L5HTwiV/(TK3E*ѪX x֡"œrߴbm9Eq~1S9\r)e\)eRO)CӉ)+`Jއ)%daDPإ U)j?Y,R^?Vkz]ae^ir=_JD`yuHe^0XOԪ",iJbczϓK6"<3qNs1Xl=jwUUELz)6==$Kᔓ1vS >Lt\߿r]/ZȾ1ZKz]?ۺts.b>i PɚRŦ+A!< al0~I3]W+<ļ;^e9l{^뺖R-"S!xkxAL68u R!rV}LcqGK}|jiq s!)v- Oϙr2ݍĒ5~2,T?a@ Ws?Tk~>_eK.ۺƘi n/:EHqD꽅x_.)h%7GBRJ~yy.hNKU_k|>q p˹DAQ{L 4os^Ā:?{YUj!\K)Rǐt\}ucqx#3 B4D)SFڢj2nX*z#ǮR *ri(Ď_|gO]Jf 3*6Bf ka&\HK)Sqٹ0Wk9 Ecz]WvZH){۷Op1ki]۶\k9%%{,4q4U[ Lq5wƘr9i^  җmCo`":'1(#\<:-c4MCƱZʇÇo}kɹXkÛ7oe9ǔJKgT-4UUZc%۾fa!U#;,t0O 0uDSƵcL9'pl-%Cb 묵=ExsfRڷx<߼yȹHkL 1,1FlkwD_֮䜧YkzNSxS*zJJX!vn۾{-YTl-V#$ò,m: SsvYcc)s)$D\j6TUSJ1Fc,%yYNz]K0MO!L0c22ZusNzS}#FX"jˊ`I)Rj~J_ٲQ>j6 .̄.OSL0roTgYpC`z0|>O412M>,Zr.庮޹|+_=rFf9g"Mq^mFxT}{9h gwޅ1xm1C-ftOKEf"lrdMQwȅII=OIS;+5+Ϗ땙˶m1\.˺mEr9KU{ sc:+,ۺ\j-yRky]ze0s\]|L OuJ9}%9%#lXrJf1 ,Z6tdr.bڸ)TVgS Uޱ`@+,C&dX-BذTNN6=@P|^>^qHŸ14ag.buZD4MZ˾o2aTR{U94ˀ33dHz}yyFE~9_.gVL#֚is> ;5TKI1R}pZ|98#BHĔ!+P- K)x\㾟N#0+)i 1Y,V@<1ۊco-b>w=z$t8;`اgC U\y)GDL'f|a|jz/g76̳)Z9-16t^sJ+nq撫w^\ rcnrf)C>M~e魪Ld۾o[eֺK#FH9 <J1&kTki"H1F ڗ}Nt#Y;fMβFi%7q ciGG#A EЖċX|^>Tu#clwւR\.ۺj#3S0"&Zb-vh&b8E+qĘs{zzN1R%Pr^ 6=L :8xC*s(˺)u]V#&lvΥ 23\KwwwVLDD%RVh4MDa(5,===\1@ s. Ո0ItSK]y۶m[s*1 \0[!|:xdu]kL(nNocEdwkLԚse*S"Dl6{ܝuxRZiݶ.G覔t^iTiݶZVZW%r13H"S<)t5|:Yw\JTUnjQ~ZxwRҶmS-*#X$O~[rӟ_YJ5oӧ]Ւ5yXK #ΫM712$MBH(\c[r>뭸obl-byxxT݇HUU5$Ջ}v6YkUXruGYk-)x.Kv^fff1xG jqr+J5RցHeVLR&U!(jض1hm!Z#bFG#j9ub;3jUT(ze;PdURp-Z{X3@61i4"lBIcܶ-ϫ@_JJYyB8,} 7l"Bk7Yg`7L\|Z}L$i_ӓa^V>~sբ2|6"Rc-v3ȠTJl*\Y'3oyGqi1\zA1$zkjXY[rKQ ò,>9mTsNv䔘/U23q{r9_l}QeRyI$1EDV\=mG}ƔrNZ+vXVk9ÓRca^D1{gO% FZ%AN V,J@fa!N ^az]6 IAFX'b"jZ4W" }[˙yzz:N;7Κ0MInRzݎxf\.}~~\r:iδ O X,,!"LXv1*Фwⶖ&JOJ49rB㯼GpKD/|֪Gf@/lDHԂdPU%Քfs[& cmSác ?<3((nYi8A<|9k/?M駞Kq=]bU#^+)\9J9mQK9k5i;WjU]##Fk1;Pܣt:jySS mVR3i"ZSRsHRBRZTX'bg;5ڒE+c@P JYU:UpϱCD&Bc`Hu %;jǠYkmoN PKΖbLkzm 9xuXgwl۶nW#&=[xr)qD)T/kbc!RJ-j$ B S,EifêJoˎݮ?[jY FB'N<7I[D(A0N7S!6f4ƺ0Mo~Bط=b)}4ͳ@VֵY)_/p |%0].׸Ghݬ̢D!nĪHzݿG2/J1u½a6l2`LPҨ,JAʞGZ!Ydٲ}g>U_>W=XcoRt9Xce]-"!D\)a#=:k0)N ^pmwR1 e9pwwgq7w:&u4W0sk0>L!8ki{`xrK1 镼e K-Z1!)Z{Yd$i"FQKJ(z`ႀ5COۺ,"ܰ0ms;LcY`;uݘxfs3B>x01Tr1g=eY63G]ee2ɪ$X(= g |!@YU>:onkv{5sN=}, C<{صkvlf37=Y=B3[G8O`Mιv\Ubg~panKDe!3rs1uD%"mֺ^֔4O `Rerz8mۖ4c i6\~?6F Aч0=u \[j38VM !*p"4iJJЩT",ʺmfwr{ٲy!YJ)Xi*:N!YEǣ 78i/ffbu DBnuN~Ltnat*+_7o~2}^ 1ܑ0 "xсXSaUG ҕ|'"3pھ?QXx<:r8,[7mfᘚq?D$gH{y^$0p齦TqXzrYEL7So[lJ螘{ȅ".r|"AV/#:jmMoӷo=E"Z)eYZueErT XqZ;61Hw޻0Vs3S_3 @ >3qjQ !;A8 >lOKFifv!"?|X^{HE[<5Hx4L>[%PS":3 RDEGΉ"jm$(=}pW2pkSQ!B""n=<}ֆ2p8d`"n m[m& Ə4@=LE݌Hz뺉rXx[WUI)0K??cHp$M9zEHe•Ё OahaRRMYo]G7}@ *&;åF y)=bYp]|@{02X"ďR[ăFDYf4sJ JAIsǒ|*"xr󼔜CKu\.Sl[9ivm*;0{p{V趭zY ~zf ;|X׻'}GPollz9,r9asGƀ D|1x!4zYizV&\.":MklXoo93g  =8Zm iU!x8zݣwv8>YϧSR-9zuȶjmxbzpa9.3ְF$YiN$YLeZ1H?11WeHՔbb&^/@=1Gxxo>~F(8Tuoo)]C8#F" -** }O2#@bHjhC$rVV\y9N9oja18uB5J.lfBK5K2iǛ#m|=9:f^`niecA#AAؘ~[LEg_>wwHPD JIXߕ_Q$ pcOZYlERcw><@"IDص[ɀ{Dj2X;|YG3]3%ڶa9"̰VT}` BL)fsXAbNfn1 V͢ U0ǍޠSc\0p8\.0yOX֛:hU%є2!ufDTE܍%1G*1lFWϦE[dB8md]A|Tǡ@l=몝Օ5粮FrcVrFN} Jc_A"Pwt>)u,"a<=lEE*]#1GtaYc-TEX: "xX{AvQN)fڪG7A2I;u"+ֆ*@1IsYEq4Jbb$1IҴ RL+QLe67a^KĞz2͗^.,w#d`,K).*Od0.ϗUDZm  nE/g)J`aų])W Sl1^X̏Nsh<fNY{o,lṋV.(;:hICSn6m[#b5|u[[X822A ߓ'77_veYiFvxpELAi>-RV{{2f#"E yjK9T *V) &fY'ʠ _kI9Kx'bS{@*{( O[I1$GR5)e9躮[Âa| C5ȑux#hܱmǔ9aYlQUU 0A~Eu c\>:_u|ADF;!lޚ8=\|u'/\* m8Yt~<k`:!,xEd]/\6T]tǀA,JI=/a(1]o "}~c@;4!-lh|M%1FJp6jkE LE"Pq#sn$ '`0u 5*n h1V9 )u]S S~"DEqBB'ߕLc7?4:kRhC8NNUӶՠnzlAA;+tGL'`6h~R!ꋈvw*[d>DрLљxwO)]b;L̬NӠg2{&zF`ίJXLZ&YJx7p%d@>jrt$ՇxӴH\J)h8<QLx[#N)ڶi0RG{ER$/FJާXBNfp^׺,GQ\.%12|:ya LP^#Zm)RN݆y A5 Eh03n*ϗ<)eUΩaDTJRUA#PwﭏI\%+r}?|@)pЅ mD>š9c! k\=fF` ^,I:ň{~g+ Lzqf)CamT&XQT8I:?p)b]/>| :M3 'T:b#djJW3"A܆SDJyLlݮ* /ETF*; ED Eo3avŀ!{4tf3/ cR٢P>䬒bzsg mRb|nn{@n\.es2Q 2Lp{t:=\Nm 20FwD91ZH(HՀ䒳OgTJyx8mۊ嶛2͓>Z*4`ڲamܝix)t[\E'þ"JK W+Ǝj8sJ} h1Ϥ_ j㉢ۛ'lWF%̠y,V+KXO6%MD!R2%G{w}H5<9m)/ .&iZ"nG+G[C2z9M[ Sv{Z ke=RNŭ"j*;EJiuk}tfzYX{I+6F]8S56!G%Ũh$B{8h+T(lx)T4h\UGܘ16ݽZᰈH?rLjym[D%iRO%>okDSr&p2Ms}R.9O7Ǜ֚9{yƅkWQ'ZTxȢ\ n:\}"F7')4I8o2 ˶Uu 'Oѷu[uYQUR0Q扙qMT,OM@1@F|;z;8Ef&=%i]1j悴mWp*{)H#Mz۶GɊЗsf)kN̨@2 VTJAy+/rY#ra攳2T¸Z+,h n uBL9EWDР;X&SP> ht9<mAXN3L[@4!Nu畈.-hy*SƯ2Fck" Z ƢLg$Oy ԬLLW(| LTkcwHz7Qd[_3꘢S\DW> *IfNB[l3`8Gl<cRA~`<(" |7iYƓ'w߿'AUO3Pbnc]/cزLQ[iYac<<0 4uAZx8i>ODr}so}Rdt D)@=n/Zݶi<Oqv-)@Ccpws$vmLŔm6=NI݆ |1c&D/{)[M  Z1ʤ*=zctfaN*Y+3'MmiZs1|xQeeaM LDGBJ,Z6CWÆ>G5jm$*XcE5$~dJt[#Y?"\eV`G10aD9y!rY}R.PGD=5EmUTu.-XDstr7aHɹՊjب]-璠S'-EGpDLnD唓fK*ñ G0ED4o"g a.$p4SR;0|X@z |hGb%R?QN-6aE𸲃F=w"PƵU"SAF)i2abc[k)C~>GOi {?N9yTw٨[cyKɓ$mkۺⲄW@En#=F+37T@0ܭjjf,0ޥ]Ud$\2G\SД' Bu::@f$v2!CBkmzA7c£HeC%Q<'e8z=TS8(Ay;hrZf!=?=tqE}~(N"ZTrWʙ0VCiÐzZ[ҔNefg:E8m0C=[xTbw:Xx}*8 ڵ'p;RzVU ,(@]?MSИ60DI{lekmǛrYURcNIp9 " a0 Dn5* On|>E@R=֑[mUkR qv>{T7="*i< NB,{Bu%lKΠ=1fq6NIfl <_F[2[7 kHԯf "LDR҈:B8ܝI@g&YY\a,pZN9^V ۺjJV'Oc[ru{[TenUXp QQ]FCcQ77?<<,81՜b°W@:.oZmKI'Kgg:1Q;N|(9{"fn˲MĚ$ |y]Wiu1J917/9Ox5LUz9i,LL۶6HHcD.ai֔FHeD %)Y.}%r(kvUaZ{&?uLb);rMqo}Q}@];kI3kz.!oH\v<>zm0՛ H励1,Aj}Bncr|w, %!!hK)SʹژlLS9۶-˲meM)U1DNE4r H<w˔$ @H-j4ْ3 Fm, 9p|i@\|0Ûg6c16* Pjbbs󈒳[lrlںRT+53xioo'NT\ `$cxF5._{%r l'uc 4,:i˅ = ,T)DpWLZQh&̊/x10ۛ[LnU z^hSafܘɆ;;c#Fe>k;! u؜ 4]TjmBT/|@/V,g[h m 51,Hp/3 ɨ2?(4,xU#x[fm۶G c̲{/lq> 1.iZlq熈l~B(ըQd3Eh+BV4[J˲q{ `OL7 ~r}&NT޾}P̧RΗ3Te+&YSR)57sN |e+q9ɴB%g81Q80Da"\x8Lc]=R)%!Du3˲0˩,|z8_x1˻wpx̌ޛ 'wO9mmF9r{w c椺m9pY%R ^וȃPssATf&vPQZ@m(^ǖ,DD0ؠ͜QKQ3`&aeM2QVR `;wzk% U1e5cRX=bl",+erДZOelw" DЌ|>σz"|yrpD䤩)_L3Efr8;UCEZk5Mo}KwXIEm#!pxD]:Ak!~^&&M !#e%gamqݔu*I %M)em1e*x"|z@P࿮e^zA4FGMN 3ү#J.:pLSo}]zp:FC|4a*&G&yTsu̘Uؐ'NB10S)(KʊݱrOHgk'H^ RΠCx]wS?܋pCږRby<[pO@ZkA0??ۺ (+{r#c[8G(r N&ȔԂhFxS][DA[]~[ң=ח]YCv_n|,{Dߞnޯo:{7 w_J;v h&tYx* aX 'ܼ#O{ְM*%;V&$bX IEwPx8wh ;3$Ui: gclۆ]4B4iSNf&, Q"ufǂLXKJ9]ik4MW؞ ` D'դYq_~|'O-D)siQsĩEH~@ĉ}:~SmlGU%p3a\]2^SA"V"p&c Miݶ.I.#ЗbAċdQ23[3qG/ZB޳Ƥr34щB191)A>F  $ G}x8UE,ìs֑1y<qo7 T  Am&EATHZ8 {Z1HJmZ.{&INd@)KBw7kHQ"Sιr^l*5,n`f>£L'g$uZmMxZ]p8/3 Be.\e 2Mf[)y]A40FiNT&BóFX6Z)%aQ UuF\kt=k{?{|!wV#Kc7+ ^V@#͜qo?y"auN)Dgu.X$NvGCٳAN^g1 "&MCE!#6+f{8böZ0c3_} 8d~z%62I̷晰(aqV b/.!npr8&RI"wK6w">cyB\tKj \RMͪpi{WO%auTaY $:AgeSJ93fJlX'\uڎC-eu{2hh<>+$z1Vy:ecH~_V)E5!M^ "h՘J)sbi(8'%kD@{r*FDk8{'w`IqwaۖRNI0,)bѪ)J [ids*m{뽧~aUY|:1|q@ rppj :q'B3H̹Z|JD,!!-_`1R(U-=6XM Cﺮ6):Jz< Ʃ9ߢ(@]3Qڗ[Lj2=1̾ 0ZY$!p8J۶US*B1B C2Nzo}9hzk}.̜R1:U)DtvY" _1?bO~.F1 Ixgoo jlPj@As*aY(_~v2)isJ˴<? ,b>i :G6 \붶̭z6Zkv.o?so=!姟`"yz$T R~IL's䡐@3q^Zk,R& vA8b)SaYflw'JIiZ]3 fcФ2\T ZSՒa|#&iF詨KKmlq8.a)xnLG%y4OY4%Ug &nCUhT&#u93klALcigHUfߎC}tDJ%߁q篻I<؃-,秷ۏ^|i͓m)%|X*:PI@sG ~PՠUaO4l\ ,#c &3Tŧ}Hx8?yͻ7|^Ͽ/Z˷osȔ߄x]{%pt3RN 090I4ϧZmy5c"QdCt a9'RhuT%|$[-ܭLrSDUt=QM)Sp5%N}tմ-;i2RJ4zp'iUA@ M@7W,^asfRZ~ y#~ͻxB#5n+ٛF3"֔ӈ1h0L1q"Cܢbоm,륲pəUAZ5Q-9U-9MS*$OdL˄eǰZK4id ^vbly7nZ5 -Pho/{LdS)l>(#ل?|?(77r;D;Xg3&*7~wqZ8 [M:|8ֱgwO?yG/>zri9`³ 9"yNO\ê4Ase_w+= @w)1!N_P "ݳ~]Op_CU8)ÓtW`hR& 2)2zwGTpg}8'LYkڇ4ۣZ`wmTnooͬZKekԉ( RJh{khۍ)eahd^֔E0oWw7Mof"֪I͆jv7"T H>ji+<e&u@vPJ C,\84ǭ,p:yDyE3C*ATQ4CEM#P` PE&I8պ }t,?%R[há\,x4tss{ 2L =y!ʭiBf4!2Ui|QyNOz{ @qNDr N-6B}~T"4jyu^#x`ƅXc#"!r'I ix,4ٰ fI4d1s3D\rc ?$b7_82crwfR}$P|y.S{o}CTK2qp8phRcV -B ylFx`,0f"m:o?(:]'B`&V xO&NR&JA46ͭz_}6VQݳ?nnon_={uws} 8~ 98=7db[p ~4a0ơ!nС+\U<9LnJ.m?>\e|曯_}pt}2nPn"c&zEzSZJYDh(Ӥ"AwwweNsJAT\[_9\7"}|xa爕BDu&%I47_r9n2tm mRrȡ,"Zk%aI)>r= 2M|ͭT)LBGL0#&snVr_ʴsfz r7>eIim30gzIQ v#*E8" U,?Y6E<)($iޢ]MU?|x(*)<*S?Uy糁 .Ut>SB^woGH[T#C?>ܣGDr >  E='@#{dk}u;`}`=y2DmUT'#H<%H6և)wERՔRQr7)*lwrX>aq llhYmD1̷770tyB8* =Ι j}jߗHQJiO~!Wcz%#RSS>V ͻ/zm/|^>{ 7 ad#P;V>ɂW#"K."'"RQyk" ` |18X((2نmكÕ9yx^y=2-?GAw_}뷯ko޿ݗ|r~|(Ǜ 1fRjzZL_ki]0D)iX,„SPԭTex4/έ2ϳ@N݌t: +LwD`G"mT>b D%$F"n}Au9G/p=A7aAdnf~8wO)pڭiʾw=̲W{5`uUI"8F %%&%e,,qJ4N2Y`ى$`yr.z'\Ith -Ef6_9SҴntci(BDzX\!9D\>}J̗eXg.i)(w5JD`l0uQ/\ۘxg/Xأ-Di\o0d*Haq h;IPxހ)D,!Zۆ|ymy}䒏# Fz챫hBȰңwۉj7i֛'#=5KSۆ x&n甦i7Z7}:)VL?}_>w<B%;9_Oސ3jQӛ_T-//?wx<?~'pNe)ƵM`}BUAgH?Aa[Mc]\tm?W6"`n7{uOQmܲf,}/??79]^/tn~=h +6y\XG<cŎ}Rvh2χ[)SN Hg'ZDDX-!ͶUvVZK)2 /v27uq{{09H)rSJ.fc}j}d[9V'^wnm۪*GDRzecDwww9匥Er8YI3i߄!ِeLG7_iPϜG3ӈ(\!h <g\:2cL4O{RDxݘyꭷsT袉9TEDSi*ɓwoGoEÂeA%O)ea֫ٞP2-ᅚTD P#2hm 1 <ylnY@*6vx!2!}3:b>(ڛkJdĥ̂0 < ې3IjPo*YrJtss۰05:3p͝a`PEgH47mGV<:Uj~WJZ<6.<\DɌWؾɋ=}ի篎afPhCC~@Y.Y'boc,_Zdv ~￳ wї qo,LTi.DD}G>ܟzz/^>;>Bx_UaPN. P6wjmZÜvntsi*)gFķ{NTZۺOe*)Ji2nuc> ޠVZa|v!,Ǩ[մZ{|@joJ8R4rJfՈ1rƒR.%z!9;Hz!Ucpg #" l7X 2D@J0 _S[)8%ym&O)( gQF_rʹ<∨񶮢u]T|=YӮLǝq@Ok=noojm>kG!Y-baiNFkԴCE)%Pw#cEg3^)'(/9cB H?v0KcX&l;HLhkk ^41+\e_b3\P} 3hUލ$h4{l <w2d4(~GH,3Ju 3je)6fmR%DJNuUfvpcK+pQ%g OSҝw&$}44}\~Znp> zʡ>~ݛVRiaYg|V}_G/>zՋoon==,߽pե2E ,E Z% 0k\@?vqĨQtq#FEz6Ld،6\}C'OEXFSPt6My\H5{ "oey^$9mv-^+-G6\m.C)r{ss EL;CFX0h7*b4Bkᾇ WN 션CE;ullat9M1{`V+WXS洇vF5}ʹ`m{K) IJeu=J2MӴ^.a^TDSZ/+jj"ʚUR>] Y]vSٓWwxsy1ve!׆@^D)EDz]2l<B+W?|Ջ'/>O^~ &+z$xeYJ~˯I8tM"8<]WDdH/NyYRTSJl޿nsw|20kq)A/oN7槭-yZ x_}Zsi|S}rw4Ή/r%8ᱼ% QR蚘=:Ǭy@'&lvp:[Iv=h,wO@}p Vשiޭ"tz AS(ȃl47$RZx@Uy^zd38"WN:A]v LxBI93ٮ#aBG M*ffc&;i1z3Rj" `+#Qb]glDhAk0l¼E9H1q^ʔK(~Jn %)aAMnVk (e{$)͸0< 9Q!wa+p<b<>"t6[7_'Ogϟ>GNy% e^=m.ˇ>o~}>][Qd.g9vo?'!kŀ]e싟W_n4.33޺L޿G_{/䪏G?]N߾7׿|'ggDD~k'?a94OONӄMF;sƃIwaaCE>}}/w~Ͽwޞ[ZK,.b'svreT9FE#4|b]u]i2w`^Ǿ^&fyi}]/i4M{b.9Z3nS%f#Yݭjus Pu;Ń1ra1sQ3rUhE+<腋h)i|JQF3F##,t΂Fy sC{G0@N­rUvהT awaZYNiEt Kc>zYSeŅCvٝ&bO Wtc˸$,F#QԱE8!DTڄTH s@9_L;0~ptОyĤiaI܂aj WPF@hn+LkW"I)1z 9Z~fӄ= n-rC2786<>G#,.sA*la*Bucsy* ׭ ڷOyJ?^>{~~ُ^<{1OsD^Oe-L w믾ꫯ~^^ܾ8N7/*?CD2 '~#7Oh?/_Ї14i>O?1̸?}ggfvYW#u7_Rr_|Ͼoo QMyEˏ^|tu7/-Ͼfc g't8Li"Bu`sNm0N#z1G9!T9QPA[ \rD"9?)e`"0ɌJ)HU"bsdni$;l=e[3Sgj{x'Bl~<ҋ?rʟ}> wm|>ynߚϟ>?7"K 7SyTђT|ӻ˿ꫯOXW ŗ1eZ|> /͟O>|۷o_O?^}=AFeͺH:=0JNr m)Һn|XYJk2V ]3)'m FZ1Det0w/)Q2Ӷn6s[0guy ۽f|>{xѷ- 0]DZoq!~<M ޵HtOVx*{2,vX499x ,B fܠQb=qN:+;*\zo;<ĚT!89\2۞)ZmU1D5Uqp#&N9%L"sKZU,(T,躤UU[m]Er枲GgVA-e wi*o ˁib.xݟ}_CZԻ7}g/>O?t7o9-ݏ? ;:O}^/1|M-c0%aҿeʿPW/^3g3)T[k~1.< pS"m?z`kxzӏ^|O~&~7ɧ;m[ѓ&PF~l͉,#Qiщ-UL R$߲BTͫ[|^e澿Mtv|!܂9<-1a-SE3A>&d=gT0m+e$8N0C=`NazM??}ZJ|^rAK<=>/ݻw_~ƻw~oR%/g?'e^??}~7t(X_Qd9˫-5)Sdz> 6O<9BA#Wٿ8{fbÛg?cN͛o^-N~??9ē'@MvP}g'}~ۏ_|ɫO/u/?ϟ??N[JDct7a嫉Zd*3P6bA%j}􁤝1Fed[akIwk7= Hj)>(P(I࿢O *"HQ"DR1H`ziW]>9{n-}Xdz]숊[7L!@R& gI-v8򏲺 mrJq4d,DmD,j !bNͬXT"~?i\ eCUXԳ,ZN8ks.m Z6ƒ!"Ԟw}"SJ;aYqPK񹔒nL1s&RхEH5= 8=ZrI q:ybtyzd/Y.SN`JDv};ZԬCh''j-\]z>O>:Z՚U*9W~q iyn}H;59獡jͤk[]z n>̞<2]aǙsp??>ꜳr=~kW^+lntkW?_}yw#7Cfi)Y?S]ۥrK˧X8;}xƓkv:Wk-]Zgm)Y/U0(dz=Xc!zz̴î `a`Dd97F4=cKH9/h ! 3WCAfHN`A?2T ֬(g-!acH9%@p6:~+61"D`QZ-C3((*F1E 6 U?͢CxD[E4Ђ2BIj=F˗4Uk5Ua<"ߢq_$f)%;gP-5J2d,h ,3w]]vg,Mh3}_JAL>ƴe].!bI ԆD9Xh,AlRq_7MF ,`Aبa _ZTRpZ^d*4MBz2\EZGd!f%\u,S"N'SxZV]-TZ$5!r\SzWeF;g 9H)%'<@QV  aeDi묩)AQϭZY7%D"a2CxYg[O?ڕ׮r|tIASߺV~߸>5+%f/ 5^tAp^.^pZ+眍fqq| 7?`_XOt ab4R[v/}~k.ށi  Xk>;{N98ݭȓXX.Ƌo?/޹ne~ݼrE0SJz@XX]Zr/G/>P_?ʪw~{gf؁ + 8էDk-! s` 4dR*&2@q q`q;f|kFc۝U)i& 2Ό}ݨwRBdՒՊ:5QEb:ZHc ߟM <`zu0C2` Lt`*2,"EY zkVkRk׶ݤK1 ZÇap֑1Z) rj##g<}+K$N8.^-M)MFJ՜jA-m0llɂ.jM=6 ՊaiEX= J. a\rE^@%T*7AD5( J.8Z wmDBBI)Yk|6@kZkȊYFWvCV!'#Fm IfFC{XuBӄ\p_r-%kT.tHP tJ& ߶䜋ݴoٳgϟ:s'ϝ .1xWgWބZ~_ݸs;ڎۧ @vy!NZJzPC3NЇИ6*xsB4^q6D@8N1M6MMpc8m7$k 7ur1"r*SZQe9kG/W0~ xCRc1x,@SЏ/ mtt Q:> |냑r+&Ԅ&%N'̲gk͚5SJ;bL1}d1kMa ~Auk2}"Zn-1`dtrOJ^PDe3asd2>pc`ƶ!}zǎ;u♋z@ϐcLZ5z@W{߸sO>rزPy)e}s&A`&++V_ 2,ih٣veuuUXld׾ȿf{keVu1TCy`;{dyAoNt']ӯ\y9\h~(H?@Aچtԡ3)^]jX8~t{ogOqg?yљOZR%jvVIlIq@4þ'5Mc$5!bZU`ꃷQLI=)76F4(\uD>RsX"- Z 佫LJ@Rxc`= Ht*FI)s;wP{\k.Z"3 l|(d 0pX^C09U4m2ũN=Vhq.tF00 hB cգ-h6c41&b(|璝uݤIe6̜b?!VsLbbֶ>ys>vHiil>eB*n"C Kv*RрI H+!3`f"JC ,HjR,%!!2!b5uEӼYsZ$"HF mVZ/)u hk!Ld9K|)}-̜u1PzBtFT.C33C D{"8s+ W9NY\y!nlemK\~南8zDI$Ncϸ:ίdϮݸW_t؛sG.(AZc r(ق!\_''7>_k#2JCP`g$ >ȾUo~/AZsI.87GYc\:wm1/MMNd- e~ָRS󃛏+f1KD&f#cH94 Ԫ \Jw`k шG`4l*JՉB:hL)9JҪ(B`Mq m.EW^X$34dV/{]1B`ey(Wh|~uX弳2qJyl.*1 "!@)8Bьe|n MI!GE c97}cBuiO8qDD4{{ƸZ2ꛁyA hM,^77(uX*Tn?t5C`EݹDB)4ZJCΑR_r#Fq|scn{ֺz] VSƀ6iZ%3ff!s 7!B|fwwSAEu1fŃծŽHJ jD`J VPjC""ҝoM9_ʙgݴm\2,u )0diZϕݼW}}k4xĩ^OgӅ MQĎhr*;m7M~[UQXgSL RϿCdpunе5v{wX >|^'?YK펄#kG~(QJ5&i Zs2ۛ|pϾ8qҫ^iJIzCTn+o;uO?\ccE_ T 2bjTi1dBθҿsޝϯ~4]:q^cmFg yǩ\5+neyl={7ˏ?3y4֙wm1#p^DbLD}H)sʵT9ks>cҳPK-zR61F zk&0F):'3Fm0jHqkF_|RRwZr~Xqn%9R&xLW[O iƒ֬j[c$IԨtT`u< -zp+Z F$ָ.I];ABf>zl6'&8됨l?qiSu#GDVur=/aʲ?L:kBТ 6X*R  gh@XƵKzDP6!9@I@X^:aVWƘA"SD޹s)t5k!ZVJefPbrj#݊D&aQP- p1E]k-SN 2&Dl5cqR|ճ4 TYkwb[ϝ>w+\>{yi‚,>B~׿Y?Z^^~7oW~Y;o~7XIhi3b"@Ϟ=f2HíM)V.`L>huZk-yЮ6r.1t8LtOָvҞ>qJ1k jfzjCm^?'{+ӕg[>gϞ唷gۗ]x±#F'͸4A ~s3'άM^[tʴUS#Fj RkRfjz3K.L"Z6گLf3D 1ZkfbW2fJG(Η*;2q6PǮ(2ZlVʂ3[Zd BϚ&0 D8 Ȑr+$RUjւh)09ln)l+"ӑG0Dk!Ҏ-}kiJ@d1H^ [pTĠ%@MU{5%EdmSiksUD Q(:7m,\f "`ytD]9gpRR3ԺXJ0ƀĐQDJ) 0[dh3dрLԶmTZZqR +C43@ c5'>XY_>y+_y˺pWϣNb,[6ƄЌYgO>k7{|3 /9x@ .w~oyYy]ݟs}tMw+n߄fk%$ o >vKډɻs2 S"|$帻ֻe"1CJ9ض[;[Yϝ8@gn1k>vȟ?x~[;[Gן}6)TUk %^o|ӄ/8vI;v_~NzK2j )\s Dsc/C,3 `N ;Ql0 dhiy\ Ϊj R RX}@f@ +W@\7S2W jr Dj\9g+W\1FFMEl% @ ʎ~ՕP A^\ﮂ6~c g|hvk^:OV'1DB)RyKRag-95m[JR޴}'%6]DIqdՑ\+"YL"u1ZfZȀdI)!8hV`J($٢C'd16PeV#$DHᛧkMRI{! ")ewELXJ.Xr&c\ֹҐb*-朹b*"!#̅\iD$gMYkf؄R <rjXkR3 1D(xcD0_hg^][yʫoƑ#+9FjMsd5olß\zʳ/sMkW._>ʺ骸֭=8qg{TwZ|Vk Goۇκm1Z(tmfRY%3[:~2{x3ߪe77k5WcLNymӭY{Μ83"2/]|΃;}я~9z0[,ZwgZc'CkW^;vt:~ه[?ksą\RE;sֹ(GKkP0.ZRM8>Co1*ܥm;)04R0āk`M+lX,@#ISD!!F0lJLEdaKzt+c9,sN)ef 3Zr)Pxb.\ "F )zD(nIdYǐ%)i$I,D-%#$ clZ\kK ?Cm183{Jmhsv:c4^M۶(LƮ,hgUO?›WVlD׏ġW>fXmͽZq&K>(=/9:zKLk-URdB4254DFnPb)lhMke$ӹWqFc\00u֒qM"q*Z6sv>TZ)3\D~ދ@v8pI+VReih*X㣭q{?w+rGO=~. ]MXXv~?ل'46  gN >MZlȜ8YM."-VeB`QĀaق!!͒U o /RXzD罀0'c0t4*6h_b4m#4j\m[k8gSpR%C=3AZk̤Nw1 7Zό5]C̩Xk y19 6$"[ )ǖ/ x 2G6SЛ 0K-7'aŎڊ•ѢqrA@XWTO>)V@ơI{{]ۆIT"6M39%1-(A}t-[SZ'"B[YSa{n=xƑw_/pᅍ1O kݹzlxLh|kƮ,Wz9~{lm.5pտ0RPރ{÷nD-8q"ŘiPRl8b-$ 0 CAœxn;vط~#㞺s|w>DMC+/.EXw^} >޽w+/1=cMSjQd㧖&Kt}ek}I;V'k2s#Q4C)fCxir)j0KɥPӴ9šZ-0R23#/PU_8Ӳ 4dq)'0cufoVrVdfӶC?\5%3F{-m(=i+#\KavyR, ^ 4!.j Rú,̝EJd*'NcQ5uD4bd+a9XY5u @&l4Q y?эʔ|F >D-Q5c"<|%2j<%}-ѐA2y>##4t,v<ԙ%4(W*H~YaAՀ1b8gYǵ W"L1iQUxDRtZkDlXj1N&kDc48 XH[Kb->͔\&QqgmԶ|ދH۶)FdGBk,9:Nw ÈfAZ|7?$OgΜ~ɣ'SN)o`. _[ XRo#~㧎*<in?ns)%Btd8'oִmSIl۶OTy6\sY Hh ՕʷnBzx8켈r׫~cbUu1}l36rckGuFbȘ`:*V@RIX{ڕVVW7/![>u 4pmF[.2sJQQBV oZ{ Vf.ZF&HFYl RSqH ~j=*!M7*{ȩ4m %<C$,hdN'ќ;۩"9Z{(w.xS9߆0k[oAl?}d29 4Xc4~e|gN gXUv1hCaOџGl mivlk,>vo}̉3R?DD- &ݴ絖fkՑ:Z\K!=b~0N3ѲhcayΕYV߶`F9s,z3X5u4DЪȵָ֢s?D=[ !}Ca֓xYqv%Edd+H+Thd!Ew@͊ F"YC_+A"x4MA5yowD8:r)Zr)c|>ߟXBuV%9k1dZ'4];^Z* g-N~s$)`8?AAo"Ye+޼^t,e*W"D(Tc@+s$Q t0Vo 1豖jlD\J y3Rw%Ր!ĒuZ&۶DdcpMDx>#!FYZ՜9scA5l#RnZp޳˯tg/_jFCtMw,|yo=}ЄQx!3;z{G gN9s̗Yk-Odjn==s[kG y֊\9}}Cɔ8(ֺtr|ڪkXxkos9M̋,u,HdJ8m k/S^LY.4m[3B!B0DkNq Dg"CJ8BP9G;B a)PkƩ"ٜB Rjqc&yƣkOϟ9o_:wđe=[cqYcc&ͧWo^/6oNq."c"RG>wa3nz>(/R+92=Ͽx;O.RұaTg-ν^ 略|zLqk0V5Ƀ1UED~lSӋT@ʥڦrgTm>t[\.xBTRLQ@X,;W֯޾/ W?yfQʲUY$]Xcs%2׀+BeiEZ)ekEX|b̨,E;_2 Z!(z S9RK֒)kŒƆ\ 885%>ŁAy6  E*UO%zpjQB*Tء zoBRJMl1K2VMPӴBb쇾iZ1Bd j:ЖKYåElRwJ(}}k5;b766j-;z*!@M7hʗAF?,̛A# 3.U[zcbB. Ձ*0wJm۩!R_8 >Fћ;QG tFc,sE^S}?෤2 ZuYkڦ\j`m- !g/H92*-"1&REKQ{r\<~rWs[/udxI7B\(8̟o=u׷ޚoQw#'N;vj((BX+nW|͍Ս~?hwywoz)LL-DᣭݭC8SO}(ѕc rR{$K/{=5̙{_` WgΜY ~sὉ[ZthմK/bdT;{;o_olGbQkHκ|>W_8K_\Y^Qc3eC}jp^xѓ˫w~2;yA*)Ek-JQ֖GhvooZ6 "s&F5?0D96!j*ZJcO ܚo'!c b9綷wH!BD)U-pUd5v>ﭵeYՕrA`," ( P%0UA Ac0JE6ViҪ1T.rSZl,Y HSBv) ruPZÕvVs"KMT%q9 #Clι]js.dFTvf\aD5 BCΕ"i1!9E]YE,b@ Ai:\͹8k1f(D8#5)%qkdqXREXnVCdI\cLY!49g TD# FHs)~~`f8PH`{d1iō>C_}G_fue@c(^<8?7o;?;k+k,|yW=F˳~jç?~dً?/Ɇ^ !Ϸg!, [Z;M=l!KRa"*% ܡ⻊(\K1ٷÒӽۭo|ja4rsM蛴Zgvwv⛐sR`m~W{p'(eyS3<8R &t]:sk:c̵[~qμP+ CLicebɥւHMͫC8MRuc, i["HRT8~2s;:#2t#Tin9)\*kY7}o9RjNrr&cVYlsDؚ#EG Zձ*a"@20I&4G$ XD9]HgZr1K9+ VcκSM)c8Nk-Y'Oa2iCgTˆv<ݎ&^j'L2& G?(h b^ 5"MaԀ!P;"µ末NUͦmBc4Ɔei##di}vlbaBp02PcdJ֚]e) ֺ\dwoOrygmX-i 3p)49.p|׷k/…20iy(潛c/|؉#kGZ mї>q9+%Wc2g_}ŗxϜ8scfdO=Ug˷~N!.? H5) ~J)IҒި*>!aR5,ħ> wv7ܱL)--OپWN;kmtG׺#Ts;\:;^~:V>~qg;޸fpB!xZ|(TP䂄dwrzaއî}~svZCA֑1:f!A/G7眵j;%t Rt!uUe6'2Na|>1UJ͒:39F'wfF[:tY^h*b p1ۄdE Hի& ?=b!1Fc+"Z㌥RRQu!Q5q8 Ų&cMۥԜ1TJAB1F9Zf}f)ښ CLiNg9"m7{usVojƘ %`PcU+C'6Ifqc },Ac0h9gE2X qخ"̢VD%zjO:G+#`4œRS΄HD£]_d2XkK."8ıA@~zc+HYoZ2&bֆwa}r)UsE\>ۯ+o_>wyuyuՌa.ІVSSS3icֿ=Q\Jnݕ5{^}O?~͍ԱK};ڧ-G^/NMۉRu8ߑSN:U^yxflpAaaվpݭ;K/ko-//ƽn:i'֧QƢg'de2&ιX⃧G!Pk1jqjZu+k5cD"4]u\+kx$ug ]۩uJ[]'gc|ާC"R4Z2f|Tf: rΕ\LD5kiȘ!skfմ 0\%4n£Aqr:+>u;QC-&i}v.XWl>91-"*{кAD-d&!O9+LK0z*RKKK؝ݝtm|> 1xS:K7 sc M4d#)੯7 DWD`=]y^¹.ђ PJA.DV%-[hRkm9ekN9R05m^n]tc2ExؔsV[_|:b4&_@@DezVXbЄY<돾S_[/u/.i';5j;;7޸z+W^9qKϺd/O7׻%3ºoyŤKg/JEn޾̓X$3guR_ӿ/uVwڑGNfzΓ`"g'Ox򋇹'__xo}7W aQ$ M O⧿ ^xk˓R 6sɳ{4Ro?1b[?t7] 2aB٣C2O=qi%8 WV3a]=zSD85a91a:+~5G7rޟ?|ּ:Q3w<=:aO'O_`@o@5tkygó'jk$^íѵ=6QZ*U+;ota_xZXk-UcXlɥ".jޓSd)q-:UJ1qQ`AkmYE"{'R2ayyia&·@8i>k=r-\¦iD=9WKby'a^w$ۅtKHH^ d E$I؜ͥPՕmHlXzsm[Z!p @1&uRRwΥԜlQ.Rr^KcLM.-/;!H׵Yj6:|E|a$B]^VfT2`(R4SPe1^%3JNcczX?W?5eMNHC٢s]Ds}"Ť(S1¬6m>z=m&9f.\8w|!1~嵯f;QY9oW]خ~_n쓟 7Y]Zu ,{w{΀|N$c*%+`+mKDԪ N{µbPOZ*'K!Ƈ` R5Lcca!)51D#׽B11F- T.9SEcly[Ӟ{%=;B!Cwbd@"YPG0U{h E2Ţ;.NV|"\Y1 T8%&vbkuP頎UcTH4Rr.C}OdvR͈ش f^dV: a72=&F ZnFƀ@F0BkRa/ٶi7M+}m(Ys{cZRro.;M,*YbR͇k),꫄p>K-@|6K.DVhK˄8 . -by ORƒË x!q{[w.w~vO(LI۴˟w^c47xX?~Lm'O?9}sg>2%lI=U0=sU@cRx9 Y8<;Secգ뇲Z?{=+RBDj̛/9i'E=1e-J2k ,5\j9qW9y䳭g?XܤL9+ץn魗ۯ]|tGsγL Z S.ޖZJNZW 1Z맓iUSE#K1|RQ1K#L%̕Ad/!zgZo)k9; qE+%1A J!R*L~`(JT]], $ (N!ac*T6`4c۶1)f2 Ms}~O]:w7>x+fa ~:NA7=lհbZH; r_~pg%k E}~[mwmz9i OOlmn+4ݙg<_8M&Zj:{8<䜍s]r1\+KݻG|ө]2H!=ؽqt&">ԬsΙ{(i+=_;W'˿!8@6Z>ٍ;7|X[YSnl_{7?Λ)?' w~Mڶu'@mSǗځ<pǕժ Nk^*ԒQf#: Nm9gJXYPd-@屃7\Ju,{twuFx/I4h lTutwlD d@FǿsgX=kCNR _V-˹\Lڶ 7M\iAeJ/Vzԛ> G'.o[S,xFcHf @dF <ޑI;QwHdu Q6\N5\Fmj:UBZr%PXk#bȐ~YyNy1u,I#"I1b]!csJk&,o!Bk56lE&@:`)lFR:!!Z>?}˯{/]xiMb z'Kݒ%`/~tW{ל?r{ֿ _y:{L 3w=|{;w7>x/&C1dJ.$"/7 'NkM;D&MmZLyLRF[YIiP~Bh"U: VN)~bbZ7tMĵġ z6mhDdcN֬ [_m$Iyo7шy,Q_,fz i 2,ڕ;BC3^r/NWCkd2麮VAr1dW]7:)BA%)2s\9SLTc{脖q-TVz @=hE H?na(=B_:n}?d6jc+\J51uIuL%l^Ju*\];A@aֆ5qt5M8H,]7iF[9cVgjkaX^ZS{{{Z \kUHy>90iZ$ZcqZS\yG,_:w /,MTAJ%@'j~V'ҵr/G>o-OzkBh͝wn߻} `itSڥv&t2=ud2@p9}ARNx5x\9" 0;vaK1&E[7֗C!{7j, DVS`랛wxSqn C97i'Kvэ[7;Nډ!ckjO;[_|Zl6#cLC\9,C(x߶1Ɛb5D6PUYjggS d46Ty{1!*9k۰1qt"<cJa1 a4Z: cT s9G8<(w{<𶾅4 e :օQ@ VXa@xlL6W?X!d2m&Pr14n0KKKKX-2ɩK."B^As9BBMۨrrtεuā[8aBQ(8`4KA-PcluG\ \Jq{)-YVӘ!T(2cgC8kuکG{=䜌Q_ZDb )䔍 "9gm;MAT; Me6Ʀ4'48Kh \1sƦD:[*Rn<~ KpᅥnItqrumMχG_ hhR֓OvM47v|1Qb9㷷n<1+aY{qK/@罳'/"˟2:;{7Qɇk'!>}G`5樍 G֎-Zm>zLWZ7 Cĩ6ukm""8cLC) 34>.1w",J3( Ʈk֨[X ahBk-8N0L&s$]Ιs#:cH/)֎%%ƨԨY_crx}Uq{q}$vo8# 4VG#Fd,Y(.hy>_wOXkr\G˪@ԪVMMŔ)iPWNo\Kmժdwylx:.P*h;te* <$JHL f9 G;o ͩF:k Z+\#M9Y"k嗿Ta ܕsWN=zʬI.YGvo?8%`MwY#lxXkϞ>$}< pH"4CDޅi{wvHp^1:qUϞ7 A%7^?}a^y؛]y Πѣ *kw~W:tI{#'޽qzjD{5,tw_y7C_>z묱zDtRXe2)ڦ ა"ixPk#BnCRD"Q9o“Q7s)1RKLib5r$037S54fZc{׆A"|>;ݛAzՂ +JRXz̭R[t꫓.CP }M@E5Y$`sɽWLjЂj r-ZuXE%,r.X2ڶmBhKKӶm4cYZZf~o2X7G,,dI E ]ap9}c-"`#%vUQ/㱿;.8V ٜGR0YgY!#<Ȁzuj-Ω y"mߐl!|'k5dT\\ (@#H6-ANkɤχA+تp}keRYڻݼ=Y.ݷ{yC&TjqyutMu?G?xi}D@ßN>`nQ:+Zf{/~r:BLDNuK֖agfQ ?z"1M,rdTس!i;8[?z16DK{{쥥!_Oʙ=sޣ}}7x {۟}Y?ku< ʱO6˟?~Xg6g]㛮8 i8uo~+H?/vfkk :H9@d󄤈RJ%4N5J71IZ=Gd b@:PjLZ"1C9譺{"FcSD$qֺB7QFz)1O<^Y$G΢F~ܗ=y0vJ(A^ Z\=ܠ9.L6W+$3zϹƚR V2&94&3M*t5`ADvQqPu^Bl\7Fe(PTI:dX&4 ?w;*,W!K.;$Z9sրp-%TJu<xh}=?B=1nz'A5*R:Bjtm[CV5bV-$~H9Xk|[0@gΥ\R)C㝇IS{g.vM :"`go__uVWػp ?dz~v=`cmw\d>{[~l7^#QTJV__]XwgWkCH64qΝ;y7>x7m>/9!V\Jַar.Z`C >CRJVUhq;N&ScHYΫTby2UQwvvcI,Ԣ.+"M9s֚︇\}T FxϢ3h+Ziy +XTm%U(Uj!)cJ!4FEbwڞ6W/ڞY^ָ\CJ)T # ÿ:5cæ1h!&YZu(A~Prk6gjh1_7h,&{<+ah)&~asZ8o'Pr~Sz\WhqRjd%}zrM0CRdf|)96]Z MhP-\J1֪,:SLY([(7{0hZdoǭ/\>wk;kjItj;|~\~2,RDdk-Lχd[[Y;BH+eF}SHY?;zt|ĥ׷.3䝵ME3?ya_}lLtmv|0D\gi=y |\y+~ õ/]z0'6<;G7 O/麳mR8=RP9ftA++^'st:efPOyxC%y"Gc.4[%KRMD,%}DH&cU4*GɷVZG-HuZ !iJ)5BH؜T XsS'Nʼ7ۻaCL<p䑳'?[vj ?xV?kFIEׄR<ͫ}M۵4RB3'|{Ygw>A:,hmB )e"3 CNq})43!Mx DkȔ¥$crt{&a2O49e^thhG5VD*4K ӔYeֽ Be!]JS `R-:Ρw<.I_*"t]i,k]׶̼6!\60!koq"ي1Rh S1&a6V,\=Z}d|C f@#ԶMӴ,8"9+cL)eew\5 6r%zvֳ\~{oK/O'Ӄмx맓!K-[[_m3'VWޟѝwj"݉(rǟrgoquyw}7 '?x\_:k a8ɛ_^Ren۵]泭gt$Pǧ>dz`s{3#g/vf t0玾;k+k|DͫW^h: =\%xkky֍jk6s. 'z/j>`aqyK.\F1D9l-bTU.Dz~MڮC0$m* 8&x5֚|-:m)Z5. 2~h^\xw v$EYKj~>1-nxI2bj)ED&BLR: A@Z1ډp] ϧe)oi ,k2dͿ)~>k&];9ln Ϸw7 TEktBE2X (vF[Orn5zgD$kbFڶږ!J}@ ceS`17W8Yg n #Q029kLfPk>ZT6M-8ҧǀ,]וA "2jD1p/\zEʵr5ƴMJ;_8zʹ+nr2Mh9M/n}.;ת0Ec('+_jiezC4 "C> 7k(t8v0*|ɣN%;SOiv~ї׿|pi;Gk+'8HMkßiY><=y8ٗ׿ܻ?[ k[opl|s{7>'4u:gw[oҥ/|Gy/=rN3.,˽ /4]O~f;}ԯ KVK~ޓ{uxdE) a4~H1{W1 ZklNڄ vX_ИW&2뇾ֺ4]4-%g"lZLxu2WcLcU 5V)P1laTEX*D C7z-8&ʀ]b&HE)PݺBkϼ{֪(bh|-E.~:߼ΖaFs,/JGV:p`G%G|ߠ˒C@jx"$&J|RKh#BYc9K-ycVmӴm")܄HZ6cZZs^ #ɟV*V&¦isZ18rV K>&K bY@%RҲs67V-)Xw?s™˗^Wjѩoܾz걍cN_XYZQn}U䱓_nyAC:ֈ}xueecm 1f}m}soٳ͊P'<)y$_R%ր8Eyٛ}~SKg2T؟6NM'SkLy}_\{yuVJu֭bɓ @~=,#[O?+^4dnߟW^|هb׼ }޻?}ϧϟy_N8cnoݾp{ow:6x޳ٱɱ7⏶ۋp,fyW~G֎,Mnܽ|G5e2]ӭ,41$U1-:=j#"eշɒǬTd(hφk8ީZ++'D*oC;""S> ~؞5;j} k y'<tV(@h-Zmɒ500APc<Tɥ~Xs]7֕RChpmc~eyERB X\KafvC:a(X\+4{gȎgDȵA]X댱9e"jcR5PU׺g8gXg3N B|VVvr|>G*|O>o|ڕVV4Io"vE<|_y{Mf{啥Ϯ}2reH0Mι@>z䨦]ADh\#A$"/_8TI"z~0Sg&B/i{"ȔZw$ 8,د~,ukgO6{|[\vڍ7quwkoNvӽ',v?l|1ŘϮ߼q[֮,ָ! {u+WV~OO,.<~po{s?ۓi}bo#$/>ǿՉI3!2dH7CvZ`u֨2\C- Q "Mq,'g7.|pF`圵R,XcCh$QZϮ sT{ (CRpRyuRbj`$xk,:mv0B tvv&@´kUC}u9EA"J)"BV+m] jJsz H9k Ԝ'Z9AjWaKIA804MWvޅVۉA h+W?~-Jo8R 1~vsξ/^|qeirw *|>(׾Ӛ>߈wy_{5"\nEDsQdݏ;o~Gr|rgo?{zg.+4!ҋ{ }ٗ;?+הS?[[>`xzf)E glo7an;k}+K+˓UF(ass&[:t7dw߼QZߖw΋W~o:ݺvЬ (Z]?z>ݼn Z9r?9uAywWӮ.scL\+W%j_W7>XC=YrNNwK1eAD㤡EDrɺu<Tsbўaz,LXYJWKw Zh # TZ+ *NhҶ?Zyˇ玚{Do?*,K@U;L4XaaM 40K1B3H/ -MK7o|yo5 CB<00S*֙ɣn{e:%VH?zXh?@E0ʠoEC/ePHu?isyuψLm\sNXn:rʦDj8"so&kрZJ)}[Mj&4 ,zlΖ  Zkgx@B\rcBd6CTS5o޽S_8 avwg?pԹI;\?/~Gݟ=ueiZ{p' p2ʬ̮jS^'у dղnVUeFdDp0g>{9{ZzXz##H0R֒`iiH$=|~H)PPmnαCǎx^SwI.%퍯\"~Iusz _Y<ݏ.~tsN$4csnwo͛O>]XDNgO f6,,?t|ߌ+9=c릖ljSUWpoWkWb q=L&Tnrʃ_=|No旞+OWַ_>ra;wvnzGN>aRB2M pG:¾S)O>n^~Mw9;ۯR}ѭǷ^HWFkrqYZig&qtO1("i9g.hoG3D3_޼|:Tv03G޿C`O@ik5ʠJ K4!}&n,}$ vJ)Š@aOC+t4@af@v 75WGHAfI؉z3ܙM=i飅-^'Y>rifw.,tn 9AY^極j[Io-qbJƶ(i8益{?667+WywDih^;v@:37yK_7)[[~qYdpkЕ1fƏv/]xGhEV5,G[=9q؛g}z׉/{tAnrx\\tݹbZVV~[7bmCYdt~NExow*r]7_\ /-Gt^w?9rxzzE7Tu傋1X:447=:EG}A!wZ[~wbo7CλγgVm7߹Rs^4E(J@զ{a%]]x9O);<[,b;Wn\Yyd\* I"ugf$tO>V!Esoolo}t/,.DkȈ|? lms+.^v5 ޒVc\XJ)sQ 'vYD( "Ja{:0==B$Rnw46y ~N)RR$*O E!eYy4'N.B2FRl6`HRyҚ٠{#4j9qߌ11LlFjR&Kd1~kH:&A uzIo,+Kelo*ͪq'2FSQH1J"34j :3PbgoG ?U(@BpfX>VHh=cUrRdV,fbekǀC-")RJYgYJ'BwhS#@>J/]!{# % 1400v&"H<ڦc hklg΁B>eY];돮{,,|eC*IgYE^j\?;9ngׯ,/[3f^8{Ȋ??;첌@Ll|}#/s/{~;s?mEV7>Ź4 !)maI|Kۗ~1{uӳS,,,.Nvˮ߾]N~{el\;zɳ'kk\$3/"]kkk[OwT2s1r&RJ{+__˹\=j́?Hg_|އx,L1V]z d:[ɅŏjinQ$;p7k\M̓g_:pHQ1ˬ 2k%f#CEM،cLUHOKNV&b9(~BKQ ,#ݸFJe w&mщ;ril\ feNqO C_ vV,I1IǁO NQ)PFi%#'{ bֶmThU #cs-uIiM,+D%K<"( %Os,ŮX\Qt!b+@l$:W+rdfBUr;nV\S;m x\eSLMtg-,S+'/ه ~ֺ*BC05 XNk-8rg܍̶@S⪪Dk:cS\U24ZKHsӸ]׸bYRL![>#'5i*RII#TuW Uս^O·g^|cϿX@;™o?x#0!xL*cYw.И 3ĀFZٚC>xzO_~ފnQpˇg~ 7eLK|;ÝޣGOמo_yi}s}8R43/R \oȋq3QbOV<`V/'WO9xvkk2ڪJ$V>%jnzeww+5ڒ|9wŪ_Iܝ4qi5Ƙʲt[kcdkZ\:hp#b,c ֚FlCq5 Z[׍nggK?1fwwWλ^>!,K` !ZRDD}R"+R3֊'U')EkӸz7KՑtxvmT Ҡ t֧8 :fQX\j $1*AhҒ !Ϳ !*E Q|)BFR*¬_Ѩ=;9Dh4gpN u] {ͤt$++Y-v))w>O1(RrC.I/Qv2K\+I1yRR;%V 1k,RD8roff8g/ /"m;OfJҔ+8a**6w6-IpTrcw2>09A8 "k7tb>|Of b17[;[7u??mVl?r ^z̋g^yᕓGN?0ݟWV(Xˌ1Noj04tptwGϞVf7N:jJŽlpp ">=;<~4=~rԟ|+_d۱mr[qȉ#r~~fO~o |rӍCSG"n+:whҨPB[WOe_∘g>L1$ JQLu]nsj8MS7ucQyKZFs8v;(ccZ sANo~h- )RZyx 14u-ܜfSrQ T= HwV$)fL BO/I^E8eI\y[iϗшm[$K=dO1pJߧ i P$urGP8hxR Ȅ@_~IU' 7j*Ћ<S`TZ[Mꌀh q7c%lgIç9M+E1S^1Eֆc$b)194k4B Z !FR4MӅFCZxŻ_¼yN2YR'Oml)ER-ͳjsf0= ~ЊVeY룵U$NuЖ2b{Ssn~s"*_uRGssNWH<77_qν;+7z9wοƙ7Ν>w#Gf3~}Try 9p䑓Gi~c&uݧu1~…c=Ob|ŋlw.3`4F3p@?C'^8y3yxK_.A!aXRIKL}PNwTG@i՚R%GY,1 AyE P4޻8Ng{{SS̰7SJuR/J)F T!vMPu=ojZw] BDAhm!Y c(B\7McYfJh4IWK LҲ0s-XZ(ޠSѲ ;p ةc62&kD轧AEq8FQ !%RQ:nmW3jyS ;D 79e+^oFNF{r=#2hmN8g3|𝢳?lFV R:T3nonfz%iTN=={5v~~77tuo2jL壋o{y ~C [O("`5ez@m׈shcuz"Aѓ' ӋE^L` @5 ZQH rE+wl1D{|*IF&vxy#BJIj`BRwZ#H)/##9]5K'hܧc,YvJѬFın*D>5}%$d BbJVK#$aN qV֚0e s&8v[i 1g;Ig0s)Rc*cIޣ8ip&%TYRe }]mj75&K_LRbTJ ST) =-s„KN5D  4Q릮6J) 2z9cS !eS,X!1ļ)16%)֙e2@;j8t셓GNJQjRyE)DR UUe6 !&gk~th (Vks<)5_.&<=Wo߾g]{Cs_yW:{#'gfk:Eg~vҡAw0=k޻j.R#NI~xgrhl-}kn_O$l0ᬥa5x+կ=K: on]~񋯾.Lupnq6˲6w)UEm ]-6'kOַק{Sq-e}UJ{d0xBT 5i5qAJ?G4rSgN~t#&H+u)2k<7Z)Ƙ@lf꺩Jbk|Lc4i!HORRMZ4M]cp/ 8+⩐ *p#F9d%'g1&@`HʳLk/QL)EdFTZ) 7Sd!TM\>9*a`$ X H.z ̦U a}S[Z/ B%QZRM:]MJN0&ሔ*2h4Pkww/g~f=KsKoևa:ĞQV!Ã,xNԱSw_{|:~jvŹçO>yҠ7X9G{?{ê<~:ۙSP`M8BL)&ME֤^g~an05v:r;ӟ2SSֶ.~s˫_|/7_,Mէa}Xf MSJwOf|/sJؽ[oW?__^򋯾2 %HO89_\j0QJ ȯiYSJe^yp<}s`@ a4 Wk4PI~SJ 8e6$Nu]̖eqDVm!^Zc4FRr%jg9s"E#c@RX5)ˌ&STZN ARJV0 Em 80)r 45W9|TsEH)B "G!'0RHP 1IJD@ 6H`iʹ$8k1ȜDŽFz#Gd1% Ydd`V2 >EH[;j?&p A0;Udf;Q*u 1%1bQI4"-,bYtSALF몪ARLZ}sE[oz&ORJL3hf;'=z>']ڃOO߿.FE;4ʏltxqn9sxbpvG౮띝jTfvXHib4):(RR%6MkᆞX<9&\OR )1"-n1/_ŠPѭ#Pm0;ڽ//]-K1q (mwym+ҫ{Ku{C]nO(,iFŨ !p7lYvR*2kh=<;1Z!(UU9׈[]\( @pIՔ9zcF޻,3䓒̍`RZ{id/6$9B٠ Zy>P Udc"RJkecSLd^Uu]WއSQ@hcŢ"Ŗ;B̗ZȳӀr&XqŐ,>s3֊R]uEif&p<ɔP)DYij.Ґӄ1Zcy}T4iNSdߛ#zN<PeYuXc:n/ffŘT 2Ĕ B/c'ϟ>ة6޽-zVeb#M,NCr.=t>p9G :xp%+;pΓ'3a)6Fo><;5]|g?}z7_}SKsKEV2˸?[]{ޣ&xQmi֤ )&){OZCli H"pa˾tjS=kG;O}~(riAփ`afavzvyny~~9+jҒT 3qͧ_}޳Bۻ7^Y8r/Xwvn?~7e 1"E$TIDOמ*d L)JdxcgcX QiF"b| eH4b tp$Ӳ 'S=@.\)2FbUSJ>x17D9M ŊHJi`"'yzvf6ˬz{{9?=5>i G򲈜[DaH4kT!A}r,ZHB56ǒR 9'd6`㷽ep!B Z~A& h0ҟC^ʿ Ƀk%T hj_;'ܯx\I(ZdADKk16 NU]k龎TD~cNԶQ) hm CjE[TMd8!;Y>o?z^w;4< 0r=}t"/μxf7٬Stf3 ˽~okdc%4ѐ >d6[J!^خ.usӳOV66vh=[sБ}[t6߾yɃOo~e7?w=Sg-{Z=yt>pfG㰝3ȄeԒ'u7(>Fcɽ=sT*)}6*xOpJ,tLrUz#<_>}^OKѦ//g&oY_.JCQg羗!?,rNoݜ98[tsR= ͝o~8p0@\0%_}}ıS#K兩)q^ɵ͵ʩNcRPiEѤ>6LbhB&βL"ֈ(󺮛Q&R;;̜g҈.!"%!B=H+i#H H'VZ1cfTHbL!@Y4(Q p'i*h%,U'$޾f;mY 1=/~S! U˜R1w8h4BB5z=,f I.dŋ TYIDϮ1Z TZk1 c/<0JnJIpϜR*K`1sd:V[,ټ\W53e)N|Q>.?/?vX~;#_ݼ3u7~˟4<8 w*q;;|0b|2Z>$;cZ1'E`( @UNu@mdM~8jcbkLQ h14Χ\㈴cRuS#@S7!9rMMΤB1DmLY<(NE@E<%<Qn(osZ!" fCWH@\o<8Z;љ~*[U!))c̱0<C%ɐch{PʶV\ ~r/DaKW !%fW0-3 H1FvdڈC wf.qi̖5)d&Zex\ɛ' )FE[DA>X4%Agc6B%JB01DDl|sa=rȅ<&')"û'.K ɣ'>tq5]9;bm9z/L=`zv6IT#潽Oso<^?[޺p G^M='?\z}޳^淂0yvH10!F\ݸ%3EL9W׵Rbb"ACcY6ySJom[n >υSt,M-.dEhᣍ};xa~^_deuO>|rRlu6v{s:N)ml}v鳋.hRbRHc{p =}̻os`y+FEI0"-aAksSsۏoonDMjm0631N12T5̬n(z%i2+LV6$q {_MXX)1/'㉅P Z@qJ 80 SGÑ:vJ)!M 3;;=^NҀ( h8mõQFXJ 9JPvZ74(xJbHS* ߀n1s`ٿS ZbHZVBˋ j#vO kA=KYc[=QQfȒ5 sIa)FXB5YV9/9dfb}@r?M qrKL5.dPr΅% }K˯ڱCǺl"IYcZ,ϭN8<ܶ/M`g6=~gk30pb:j~v-,/ӷP?fwkoD=zvCWQ=zѵ_sk;o쩳gO=pyDէׯ߼{ât >4vo`mS~J)Ĩ0(KR 3k<)VrTJ)sy2rB/-Zo]딝n/x__u{*=jeI_{Ͽw~ً.{?=xګb[;[Wo^/M94{XcFD`ڽgN~~㇎/.Y>W/^;} 2i; 4uθS[@"RM0p[˚"Xe0"cMi1ɍm4@)Ke5ƒV !B)CC@2,5Kr1$HkCf68u]E,wvw1~d4-߆+_OI#Yc,ͻBP&T 59"CD&u7#?[4DKu(c0B]sm L m+C>&H#*dqҨ(Ϊ>F%F NBŕ=3x\P(6z"MC}3*6JMO+kB@`i**\Y)N}OJ A~NI" G3A18Ku"RSKAfqw>ܸ? {/xKg3DH)Y.Sp'gg-*j2v-/t++[[|0P8'IQ/oށ_"(߫ŋ7.nmm/N-"pxEqwvo\Gyhs$q5ϯ|z+s,E!refhZk,[l 1DZkҤubVJZJ"@!z̝6 ATď(:5b"TCLzGmܻ/[˗^scsTojqnuxڣgLooo\4`'yͫׯ~'3sdpfsN{i;a ӽ; S-/y!(TYv[[ʧU=sZ_wW -ˬ 11d,˳,(_kk jw$@ʑF$Ԥ!Ģ( h3HŔD',+=U-*q Ǔ$!C&TK9Kl(,EQvvSLS3ڦiT󁚦jD&Ny +HnF+T!~1LXs4i3RQvbjc,RI_RKUDŽf{Fhnu!X9M$?6ʱk. R:2lUDTJjhdQos%1yN68* n4 d !DEJPJROi[)Ƣ(316X"bMqBH%yzGqCKZb0ʼ3p4vϿ|[v-kԳB5 Q'O,f)",Yg[}0ϳgdUI'O{x׷߾z-;sGKsw{k'5 NI! ]/afX1FB5xRJc4ĉ "&yɶ (Hæ^LfCDnnf`u飧667WK 0rVçO~tɴeq3|p/WG_~՗HuU1hm.-^|N8=$ijKƽ>.>T{F8>g޻^ٷjZkzAsSSm_9kQ@ F_7i"dc!+DUw򹇉Q.@IӢTY6D*;5Dj}}#e="q{ R䠐m61@<l8nr7\h$t2?,F\;PU5i- QJQkM%"T)%S"Fb0AÓBa*5j @G@plj;&AԫZRw2FmQ2b`eI|((gy5$AL),˨XM ], MIhAi$&`VJ;[ FuroSlɩ!je};^}Kd&j2)*Rb>?ƽn'kSg'dI/u t*قZZA AKŃ痿X,hMPgkwo8~ƙ7N;5 g_[[[o<tN_V\: t[v&h~DC)b`kLQ:XkcHC8ִ'>1$|t[v$qB"vYT>ު7W7bpsg|(tz?Txx#pcg#8ll}}O/~P?ҚnǿgPa<|ů.ipx,|Tbh](kJA_=ݵ5b1{<[y039:jdSϜ"6M# ^Jt;KO"VUMD)pbpum3un:h%-՘*qlee@Q<,˔R26ƘάUvwF"Eui6BJҮF#en!:A;h=;q!Dr֠#( 9AqgS(RPkCQiMZ@kRϱ3h *SYdqdQ kP#!A)TQ$pKOri)@+2k9c鉊B1VbĂyL> D!*̲t1Zk6+5V 1Ct'; UkLݮyڻr)Ν:4$PnH?]/:q-; U?r\ex|:rw.bh뾶zvzظY=Ek/}s?}OşC?O6(V(4n" *EιZa.I?1,xsd@͒21bPy^CJX)䉲}zǛ';# X4уGh"//]-sCBIL]D-ԛHLuYM콯&@m_̾d2GeYWM;e)CM:ĠPYcm^9=5+opMck9v^vvc6 ;~kRL2g{:!+_MuNH+o]Y>^}/Og_?Eձ>&|k 9\Be #?ԀIWR &A8/֤TQ!*R@.D:PWT2spҗ.11&ȉA$GRt9[m47ݥ3L z2/w;Vnnln l{Szv:J^^3}/jlno~u>d\^: Wt}gνΜ}WH\6/z(|ͳgJ}-8:FRd]X{i㢼4MSUULAEQxEu1R"/e()1],scȳL1e'"^c1IId BkRDRCĶ6!˳(pft2J{M Z)]dvKvʁ' Yi=;Fj bd$H(9fD9s'Hq/`m}H)EF˿ 'Y LD[WbWB$K–PyBZ+!J JӍl ǮJ"Esan0MN%śژidkR+V)x,I wAC4vRVM1J0"j2ZJ D!Ybww+Kg_tUWHE^y͕+ t7ǎ$|{kz U]7MʼS|}kuO=LxBo{ԣ)gw/Z[['nlnrkMyu%-"'&"`FĦq6ZVyKI92lT8M$Vuާ4"XŘA9xNcmRN+aBYJѸ4&V28℺Ō$v3vGN~|7?Y^êN̿j+7u{oyZ\괙;2(J8Z?|]څN~Vcӿ7λ'NKA.R ,1h ZY[)[vIBUU)qOVjە\=$ RÕ4W x͢ QڮY Ў Q2TV\?e"D ?+Ac_ŌZt`x%~Jq@fЊ@vAG04xv5@e!ĪbI2r!iIc&#o"2h2s 'ҳ|\ڍZcAൖU)q,;hD%.EOa B%JhBؖ*E|Qm>yso/-1D_LK`~I2@nيޟX#hYZ/9/IHYc6y/{ZJXI!)TR"!B boBs7P8$U-DyPk !g JPHC58"&)%N]ao'Eژ%2ƈ~WUUSY=zvʍ˯z/q" }gul0WZn][_[^ _O4tБ'_}Nv?ő`owoVm̦S=)VM'~ϟ9+=uvqvKW\}Pz1ո Ohbq4C~/ }Ǎ֊H!JK sLH'<10R>qB`""DYiI8D{+R,4.q")EQ[ 0)vL!i7kRj\!"xj'N/v 3 ?ugփgcR K~P/İї_ޑ~>h3ƒ{+GG_8[pS'Y[6F7^_yeҋ(ŔPammlo4&Hc"Q{|-g_}3or򕹙ܿ·Q($0BZ1@%rZLNC?88j<9` )m&lAZC$ejx5ƉIid6+t&nD(0Xmm\SW )gQ{&-)-1P%7ы0( `=\Zytgf9ܸљ^}~g\K~>"b;[L޾k673C c8a>;յg;ϖ3_p5̜gyWw^frKH$I S|!xMDJ˟TSJ{fV C9e!#1v @\$i@ !PvK">R`A)tޑr/ 18פOM{"Gi-`T$PQA-4=XYVH(H1G#+*S4OSbD1h"mlQA+enrGafd3XWSJ ))E!{HMy}. c7535CD)ӑʲ4r|սR yLv@Jig?~C?;7ωVdz]g+O7f3E^Ԯ GFBؕFh&رdǕ1D L%)Ȭq2Pk-lygVU%" xRJ1,ϘS]Ѹ"6ZWEg1)jˬ%ǣ1~^vi ō3@ҏr"g_~h}~jQ2Zimڬjhzn'HS*@DsǏ{{>dU֌NSŪTk__ͭGC\8w'oc/~pO>l^?NlgeiAmԮs[^BYZ@R(,ˊHYnnFx/1&H^AjBex)k(G8t f1O“ }[X)rݓgM1hM!ĦS%q֤ӃSv6_\"Wlvzy7ʳ|/7<=4}mC^y;e=rF 1yt+8?xRvʩ,P'-3\wF;k4sMt"x"'Ht(uTsBQkwJ!i/@tIYyZf@41Rv3X1MsNbrF|fс]_ AP BJd @@F sU5iƂ$9ϖ? ,F+"=.?L5ItL:e+Or㐷^ !!F@i 젉+oPDBBlS${MZq ΂S*p0I"`_~aSI:H*C`sVйViR"5ƈQSB)՝';f^Cl"4޼ss.xCh\#{Xg:Nf5/8O?r.ʼT@8R_? n#F=|UWOW޺u7^;?}yw~)ow6s)j$H2ԵTf3p5m7K1I]PGG# {: 1lIuۻ&['t"e-|?].1ˁN)BJ?T;k3t#D0*ÚnYߡ b땽Awู|Rvp{5;79q͓gO\z0'NOc/>g۟~xK_<~Ճ3z^e1*T/A;}r)d6딝ۏoA´Z"-0"U5*%ĺk]8'kːmNJL8&$rg[d歭Lp4n̲333Yf{{EQv[cy^*y*3CsH4QBvK}AcDHmaAa A6&ޱN~2}5kDwM(DM$z2R8 Z(9hԂቐZ 0J1fԳLR X̪4vzhf6TS5hmR⦩̒`c* I\*1 -ǭD=i\A3D%:M6q}yZ1V1'M#ZS̼ڃ+^/|y?#j?gs1x<Ik$K,GMOٙh|W3XEh?7=}\R'3YJryJ9vW]/pxu .^~Υ"?vXӋ[|;ԍRdzRJe)Vdl&i,t[P) bAt̐l;S[oBQ0em>L-vDgkm\ǀ`M)ĘOoB;%`_ |]b~C:iI|{HkyVw2/1ݻʙӲˢ89ᄌ~,e dx;l?u7.p5}/Σ;?îrDRB 1g^9l\5U+"bml_?pEYbkTB,.2FW1K%d1N~EeY¤!7!GkInJ)y,Y̻CsWUZ$!4i62 fBIp8"櫞0@U@h$f E}LÍ-Ѩ=8Ibkhnf'mο;(1E!&xme&k {Q',. vO% nHZy}8ĈGݷ1pbmk`>I-*'}ԏ>%СrJ!HД9eg,)%eAJR!DĨSҤ&1fxcSgO?-BTJ}>\ylCcdp42ĐM)H `CVUunS%<﯈ݲSn_S2w| wG[;[wJޛ?~8 >~T i<^!x )b veY6΅fgg$B&`F ZD8}Z a+$a )wMZ|&eQMb {GE(B0Y"R+9 5(DID,'4.v53RZBYI6xJ<[,/ˢ޼6efv(CP0vn޿O?/rc=֛?{s9KW>7;k{9!@J¸1&{n y1wj;S#I\e9#(rAD&h$mș*5)mX6)EmR4UuS!BL{ro7='c{Wn$X$4y}h-]dE^Ck=W1$MQD,Z@" D'|Ru:eQmQF[N)r2 ']cET!D4h-"4q@оqr5"ƔF)r T!FM{T~"2w < Í퍗=XG6/^x΃w_,5qqC{?;}򥿠*ۚϸyx+_~W}5.!2,cN5JV{K LTe>ǫ+kk-Ɣ"vki1)DdΟqUI>@K8)F 9q;˲l\1`0JkS5Y1)1ˬ֪i\cGJ`:hƳ>B8aJ d+*ľq4 %`r]X ͸ތ!x"_y&[^b2h&_XP-9 j8QOE&]ޠu ~P``BJj5)1H[r=oȸ!x1A!!SRl$AƘT9m%.}"!DRLP8'<"1.v{ݗ_xy @#޿|۬/{qi~xCa|kh<^H6yDJ嶘-fR|1.-Pj2\۫1$"[̄&vApj A6h:B(#mR;?p7ߛ)䋤ZRi[ID"~ ,U;&U"A˃hn@)$h B5BQ(.%-a[.eK<8ۇ6HDR/h?JJɠ5퇼9F;')iIu{2#ش q!W kiWy 󠠉~'_zԫKK!@d(͕N~WئIY>=>x`qn?o?ͻɢܒ XF[wnZ5?;h m>[,bog ]xwO9):/^f`M/=AhYc₍>&=`j*PE SZ4i8E$cayR1Dfhmb( 7Be$]`2k90T@{{YVt(:M`%g@"E.b^""jC UUd+7`bp!c+Ф?Rʢ]ջ+wVgw.~,߸fuc>GwWz87nֵ*T;Q엳v3WX[xQUjsosjj);HH1F=0d7{j<;O!IBoDCR]*$%)~h E$ id&1c&7n0LA>\HdSJE霓1>xYax$ǍA+5a X~z90p( AyvQТAyq}ݾoFeRDůTkS!M:RZ ImpXXR B*aG (!0.Q' \L)" )wǵ!1fbZfuݴ΄G˜-nKڂMe )MecNIrƐjsU:xcwe7O8LN"AQV>x3Yb[=xcWz8ŤH!CQ/l3dF r" )*Jm|{SN}?9 Sx4N)mZ=*~}tؽxRHW1I#[eYҙͲ,kFT,(0JBK#_[YbmI-5܉0icHNmy"VY׀#ڱ*E*hMw YS;6$56f_?g%E#8{kw??ۙd]ֻ~¿׳g_~km{>_*tFQܢ(q9ƛ0f{<\#곧MlN8%fUWkV[ԓ'M1ݝS~ ۮB ޹ @|H6'FJk)!qKZ,eݸZGNW?6B {r$MM"u;qNvk "lZ,5gTthXH D=x @1$4'c0b"҇/NjЇ`NOZp@ 10+J!)PfRU9i罍Y*r "GE)v)rb$*'H?ĔZkq!x3%V(HR$*[J([!SJJS+.#A*DI~1HI.XSUͧ&,/w N'L"ypwcodz?Oɺӎy]ϝyWc`N,QQD`ФU9歇 n$qjHT UţMTɅZ8xزk|1CD@^SJ|JIȑ83ڷZ8isSMdͲ5 >\{xW~ﵗ_;y䤵6`q) 7޺yW^xU[%$N?xѣ.ݽ87SʱEX⣍!N[o>xxh?'Gn] /ꅗR۟} gIz N+Oj$oBWE@-x\Q yᨮ]5PD9IDd1ƴ#_FN rɄ6%9 H)m *JiR!R!V.V%E1HJ5 bV[ct8:~jL8[7kkl9gIR>VɄu\rӰ]7.pH;ξ8X_|P\oh+I>I:Ŵ3Y/Ͻ;o{^9|xnzO`xf,˙q|쳋O;$b&s {=b|sD%2Y\39U-ӌ!C.2(f3!z;_5b`|ce~]o̅m5;{V`H;1V3!+ꋡ[ YJHΛGa}R͵aJ X0L)qCN9Twu]uS*4c\ M|@h-p]U_hm[1͵MWw?l_Cۮ_G~:+FU#9'c& K0C /׾{ҵh5<(d4n}G/GG;k;U4TU3E*+ELN'dhnc)ej)ʄ 0]ׂ*0E;|)m[rВjR`>@$zs1kZ̶[?@oV@{$VZK80 ȀBt2̚Oum> ҇`[w?3ED'"4aS{.TALcb[@XbgP(dOڣgl$ 390͹`rަjbm+T{V{"s>b_&B)\pR*uUXj@94*+ `OOH=<}}nL`_?<:=zn_muo!k.<89ݰ\ PٞL<p{7VB^t}w||޻qo~/_՟?sͿyk w'aVj:R n`ذQ;Wsԡ&"(m1L1T^WeRN)Y7UUŔRٜ+Cćai1shђ8Α-6(,G,,f ose`g#04{N^E3vh6S+QǓVɹX+4;~7?xW'OF\]תu]UǢ%IO֮ߺ_3soiܸ5͐K%^ nqB"\)lN$ȹRwU@еe}PB1XYS)c@BP(,Epc\'6)Ȁ2_[N}a6P۶Ð-͚JpD .y=eͦ!t=a ``(Ʋs^E|t>FQ]F8p=V APTy@XlHU$bU4;V:t8 `0\Md?4 EgA+vUsXE4)es܊jX!:f3KXD!T*Gٞ}tHm>n͵͍0M+>>xᣓ# Cߗ򍽭oypQ_?/];Gykq8_,ݢ]ܿ+~]ۿo&Mf 9h̖ؗs1;5c]3v!P%C>dJi)%n)(xuJ.bw]]̈s_M"TɮUa]{-~Δ}Ie;Rπ(`@& "QDpf(ؓ!>AxȞeX8rH@D _iU{yO׿ҷ.߿OzUԌrUxw{^[k)ETUl}w.~<mo/jh;\t}:ݿٞB>U]N&gg]FȂV n.ixCh`$BD;2`ز$!ORKBo&5ljQgh4"B.0pu :QUԡ5E[YTX[~5p28lxg^b'-ڱ@*{`>iHRɟS!p᥌RgUM CޡG@g{7ZHV} 'HòC%4L9hwK XGq\wU*VIGAh$`/f6 gGizk/  ,R@kCNO*&f2JD|Γn\WgsΦg` cK.~a:_L&/>W[}w xyzRI]8icDf̘/\ f'?~W^W&ߘMɓjPda19#g,VI K]FH6H]luU8noxr}@vӖRL;0SJM ^ GΚhN dɽ<:21R-8F ɐ̌-VXb)ĈvA$[JTdPrFƶJoٛP&>ɘ_q@Ϗ?ܕ[nnllب7{/|я\^uG1[wY|U̍?|_}kMƓ[`b'8ts}Fn_bSÓK;0xg,:5Yø0FcfSxO9b1|%"Dce&vяlxotJӮ?~ѕ+[[[6C*V;;W.]MΟ>z'?'n~v7 s0.xo9\&Kp V@sD(䜫Wad+ MN&Psq8VZ3$iZ(2Q̊2s@nAy}g4J)٫6j 1\fCZq%[ r!FD)h2c6_Ȑ8r>a b'c;tAZ&Cxtޣ{iߺqv{W?'SoM6OiO-4|}{y;v/Y]D|W}<oߺpɁLl>+5/%{fDY|^]\*/!9'UιueJdqujno(Q#$Rq)&`1-kSV4xcm8pHH - dh VS Pt"WPDn TݿŽ'FCJyÏhj8:Kئl l4@_lS81/@h{} !b)Et*X_]׈8fx f1 v#RLBDY;_ו%ܨ(rMӔ"İs=w66_}իW :hԿ0׎?}i qmf̕wooݾqW^o_m@1XS7>I }<-lE ^н?{鹗7'.fgB2_~C$,6]AN >FklfV .RՕqMP# >" wBh3 KI1yWr%LSSAC8??%X]7$#Qş7n N?pY3 lPkb-i,tpDV rm Ɇo3GfvK 0(培[cPFb;3v[BdL2sP wQ'x HAoу.r}[<B*7?nĭ>V*VU~3bUn?cg0EMsus~翩u?ٛDלjp "]ۥ{+Mϐ9 9[_.LJ" QӶ])]_r۽>X-sD位t5*<%rdi(h;GNͭVJ*Aӊx%@ dJ)>xum+[nӖAZ(CT!GH4,W zeU]3 ipmS&GBpA^J"%kT)fhqd5*ZEBᇭ8!zRG梂J. |Z sbO,:`7)E 2I@ 1T&`r|QU5@;}hZf9jUӧox4z[.1ރ"n)I{V|'o}igw +fS7۟|~焅Qp+Ͼror.>,O &TwnP  2^-؇Jn6/̄S뺺AUD i2}X̻'rb4 2l$.%hY6@4u,ݔ i!ҚTDh5f8e:"]Lb .FdQo},v|aR<.ܵ-aЍ']y, )eUqH"ָQA|>~w/+}{%ҕ['g'<<=>ϟyngc;'Ao?s{smsmU WV?=g綃撃 ~{:ʠROF}3k(4>p1}[U(Kɥ}1{͡]fdACI/=Bιbr59Mqs.Ks;8@,OΑ8&dƽ -d1c'[j0EE1%puq[.ȉ"cUmd8x"޻KbaQD Q2m&,ˉE,b%{_[y sk;a-뻶%7Ϟ~׾{i9 nP[mIޭaTŚ sacq‑>yӻuU BޯM._ ?zѓ'kБ?Yj]tZy|o19C4Bwf.vTXMxL@ v}ߧԳp {_Jʲ5afjYK^lߘH1;r*"_o2e 5M]ۙwĄXT?13MUU`:`kf/s)`C),jbT1:GrDcX,b4P&M*{L)SI]vǣqpAT>V}֞uu|0GaϞtX|<;~7Uݧtѝ]޿ #>=~R}YQ#j]W"2{)0ιf @%DNZzL#^յA 3F)j%:AK)\7Ll8" N(> ;V%K"\=Ft‡{?] ?ܻwtdyc5*`JuރGEAȐTBdj(vGz, Y^O1|H茔EB }J¥l^M5G }X}n' c WB۶U"o\&y`DD޻,r6?'W^֋ߺ{i0 䒛i:oECm S.]t\(\8uN۝3UfSQ=N"vM|KM~GO7q;"UQ{Oo1Ji+݊|p3m[mP Xy2>y{?O%w s'oݼ5OLm1D%]=9zrk8LΗSnFaXQɅf%9GHT担Fp ZƘ* `ߧ!D$L'"읷0D,%Q `9@9/oTV |uժ@ {U:/iHHS D pքGr SK[v۵Y#UaaBqcx!( oVp@`(D̐HX q:6bJYLu@mBTb4#QΩ~( ؽsU뺪% }.%Mbm; X;<__ٻR(1ܨY_D.p}n6J/{4jlDs.W>z1 ww7w6?'g_zkS~rg H!hjcrafCS7s0+r"dv.>z ,㼩J)9ִ5x 1AUe|=jkKёdD"ETƗZfdio(&) /S!fTUm[I9s""& IP٧q)}7 ?Z"KϾ*Cf\{/ Ͼ6^-տ??k'O5bӰv|r<,/β#!}K\Uз?KAFrWTJ.f:` $c7uޜ#o V"ێHȅEkQf$gOkĶ[}˩]3{*}9[uN:M7L̅G@=xLl6jSrЁːthΐ *d,[ Yow"ݲ]ZtFiV$AʀcQXː ` H{ c\J1 Hfj4q\e$9#>+<z缥@:3Z K1>{+Bxo:M;Gd2V|.leM>cA*zGǣR[9jIwSX1~?|/m~՛؎uUw9|g_{kj7߭/&Q\NE 2Q&r,Fv(Tj²X.-k;ՒZ"i0K،H&f7m9la0Q2ʼżWjFBeHj^hT""+J:1"Ak]zD8iX[Ȼ!RFQ^D,!ԜF(ATC6QLNOScsNmWŝ}H/o q}W>⓷{U~)`뗯KDO||_}=#"2ٷW&ɯ>֮S)=IU} K.@h\JV? [y=sQۮ͙XzJ%Q"Hr)m!@:' Bιm#8 e S y@lшj jBl!Et7~ULj޻miR7'*eޘ$M~5%Vl41(j-6O\x.yl/*0l@M9sf[c$}U8["Uu Kꪶo;H:rQ?ĦRXXsΆaa&rup6}?GDNnl꺮-7孷{ݺz7t+ŗXO=^|ĉK)T=E#uma.D 9,09Ehe&GA~Fl1^1İf5@b %QS/=CޜXr1(b}U#bյ-._"}UU-R1"SCԒ" #,u}׵MӸrDڅD$O!.lOv5狷ѣǏt{.7gE$tqqq|zO_~מmgs盾ѣG?}wK;rC% ¬,69،=\7521|1H&A]Jth &,Dƃ@{0[ȗY(,*$B9'0W:bƙ%x%”s HW'yL*U=GXei/R:.- D4k*(Z4Rԁ.1dMXc )ښev;.3Ϟ]g|0`mW<~W?>ux+{Z<=~᣻\Z|ezS DFɎ'qr~~a>kҧT5>]3_6]gy_UlI)ۑͮM\,Z9e `.,?Sk!"jN K$(PUGbU G>esfEG~]5[J1xlqG th\١3ȂŰ/)@le<D)1:tY6"6 JGdYD CX^@2$^߬kؚ%k Z@j8˚7gB]9-&r89BdǙAë6ONr@B Dyo~f!zaPSw d2[;K]޽Kܮ!1;vOoߺ}'‹jqq>OM_)žSQ\5t?s"\rwo?_y7,\|'R??[!6ԟN>.opރBaVR@ lU;c(?W6~޺z9gw?{z[ݾq{k}~>~]LBNK 8AɅ! 'om.Spae¬nRάfI8*>_ *Fٔrn@w z2y K1uvTYb,)c2ϙZɫ-3tD{bn=zAG^ASw#s&7Fɝ8]f)9TМ-IZ dk~zW?waI>_}_[[d4z =KQ"i0s,tਿmG}}'݇w/o_v΋0+#'d"9su Q"(Ѕ "b)hT%r)v&ʜͨ6:(*)esHZ\)H̥v=2\]:.}lm:LVc&b1`6;1qW""3: h}=T3e5/AK0pD_480 l(u,E1!l5HBEl@JIt ]`. hIXDs*ދpI}!\ ح"Zr&r$"*ˎ*Ӓ0 OcwvWACS5?~i_ٯYX/~qp|GT}:v-/6FB 30$Lv >ӟ?{ofk?~|Y7gocGf|W͙-tVmY H>g|N¤>\laɴ̓H s4l&*8}-"{adO&yG"S!Dl/{CNLflcED$ s=ozoQ鷊w^Es) .MU%D aN` Ωd>w1S6q*>)@އPt]ߌB"O59|n?E"z_OnmP_/?G<9'W6 )$2C QYDX(oHn~1;;9[il\X۸~',\5" VOLh1PD4u֧)%  -Kd7 *@]GPVB< )gsIS[6y;@\S 6?fS Zټ\fcXiΎv4QfI) "u B[cܤ%)@Ȑ넀EGТX+\舕 B*#g1"\&D΢c3lж<K!yU-Vb.MsydZR3^y KGWs홭/Ew?mVArʆKc}Vb U)_t+Mv޶Ҹ댩itm.sP$(DizG(s.I+D9u}Fuʄ"4P"Ds1[|W0GbцmAG Bb|¬dgVi22KŴbD_J&rFjFESJM)#h~7nomXUZ%iN/R_3ux4y3󋋧OONy7nz$ETW&a?۟ڋ/ ^X).uѣ|a*;|{o{f!l-g@.BbT%ցSyD,Ӹ |0wޡB.%LH*00RlY,t͡*hJ3:.Z!xA( c `<PhVF{% r!Y*RBKYAR,RB];.bۅ2p( D ȍ766y<~|ޫ/Z-,Eާo/q ~QJɚo1CS"R[|ޝonl4ͨG?kgOy/`X<9xre) 뷿KցKg$Epc *&ssxArfsRXU"ϫ&Gn:狹DAьtR΀Cxuk1uk+DX /؃+>Y@kیLkQ(9E,W3d3M&)`t.OFg ιQzDs(\dWہ整a5OA`CʲDҙ1A?3CR7QE+qZ›7͚TU p/¬f%Rߋ'BP90s6!d`p:OGd-,\ʔ^}'ǧ',.]գ5Dttvqr~r1xzxѣʼnZ\4F'V ?xvgXnzݽ/]څ뻟f*lrJޅ$+9+Œp%v[ _aᰁsy;l"!ixMI1]X2K)YZlRN@#``1a"\CwèrϑFH\WTQѯ)2U|E٠,:X \TbLma2539C0@׵\}WKlg*[D9TX"Uk~7]tyk^y>|7w>|>2 "ƧeWVaaYjF-`0:]`RF- .S UU[¼1bgr֑mV[hvTz m뺺ls)FGk&o:Ob:nolU&=필wN5#c:Kl>bޞq/ھ45o;tgm{_ózK}vHD?|R!dP'3M^z4][a>[f"yT5BS@TE|uӑ.EA@ť)1v,C%O Z2y֑i@9`wѨ:.pE-xzcK)tu]DDȅ@ `#>8{C9 0u%gdakYTbM֤ɽek{;;[[k.][YqՓλݼףw,mPX1ZXb0ƺs;S\m@+͹7ydy1_}ߌd,"\لMSO&mMcR;w_7ԯE<S{;_C2-W[l9 "59LT2HWLi{uŐC̀H;uJ19<G09SC** stnEb-" "!҇@D%slBrXWUK.uTHc,/󭍭h%7UcuãcyfS5_x76ʷmu>?ރ'?}zv/ꗯ }\X7;gL8~n߸Mӳ;5(c1"REi I)̢ }R^(,!vXu%;"_y@-Ru !lKm1只^U>#."f[ԥ%g[E .G@}ee1/sR@`r̈́ZBGcF.1U^!d5!=VUePWe3qּ1U˪ᄦܸzk^!Oh4ub~7L֟ٙ3yUU.ӷkۻ4}]W2O|~?ޟGO։UUUy »ۻW꓏|KĔsʩCU5RB*c@`p":B!c\D"J}dU=;;Gu}oqcѻקx/+ zGYo6+5e[.Y\00`p? tN4/3ۙ ٚEd4V#aij_Ŋ1K4MpaҀf$(_ Q;d1773 a@K)fHADYXQ3꺎]˳̏em۸Ywk+lolS;RR۵]'缰`SxK&y7䴔\a&rf4wtsZt :n]C[Zf9sN}rDܗ> Ox/m3spCDyi"pDy7舐d`Uv X`>aDV"PK3@1BEs)CءE҄-%B hھKZ`0Ki%ud'rDT_n [ۚգǏ^޸k߭꺤}]Uټ"#>>}o޸9]n߿؜&fT~]Z4k?poֵ[1!]3/37U3GÝY,}׉hu]{ﺮgaD(h^÷ a]W9gNܶbNU]Ys612Ao) >zx?~BS61Z*w)c[3iX#8GRPV0AJX Q@@D9sbHycce"]à3%C]ַ]Ə AR[GXU2$S,0F@<Ƃ@b/bKŦbC|fQP(%u"8 bA<#]0SXmN ( "lI ۠{"Y|t~qWz{@`2,˓O~ʖ7tU;ԁU7Y?|*5/lcEOoݸ~tku.l {o(A+<;EР4T5M4ж%PUU5Fr.D3 l強7Wf2B )%xJQ뿹 OʗzRҝQrJjY !!ZEH8"c U]p,%3g3HD訰(9Rxmv%" `]XDUebt;"WM9}mK]7|ogo\p>~+T _9h\rOӝ͍d?ztm2lL7~7߻w{vq`&Z`wv_M]Dr!Rb̅ S Ohv6wO]Q-zkUf;J)ڧ?DCo+Wlf1V;iz PdbU+3uHXdk1%=]R2ޑxa2[Ā]: D戕)ɓLy LWBXe!EQEnPU ( 'Œb>1ut]u}]cقRW3|.CpJ(ƨ*%'Pt4DJB4E.Ft-ΪZOSۚ6{o{LV._/~q_?y?ƭƬ?n]ue7>ӓGg]7x].JJ/${ }K}jЗܥԏGRJwŐݠ"r~vnWMMJbcHh CU!D|=bԡDcH)K*RQ@Ȑb\t8S G2JB r{E/$Cy*zPsJ9BT̙hL#XNKCXQ.oRetC\ .VzfQ~hoO~_7;r.]{s?rՎ.kVUˈPR/B~f[[Ս`$fnZ/4h OƓzy{r|TS- |2..-AaѶ밹Kʽ*(ez11y?@̪l?;$M=D WQrGK_u3P^QW\G5 CJVC͐l-T1r/m׵u]ƣż],?FB^{;YX YseUVed/VT0#d`~Arxj'KX5V" T׍XJs\/sYafD/&8Y;٭\xUY _UD0Ā",ݭT_#ifӝٓGO]ڹ|Xr~-5nygM|77W >j rsUv*N CU>,jF9]cRJ,vu5rbd(uqӷ|J*{W \V+BDM.:\ 7 d:dB "Yej b*">a6G()o6SrtǦ&mʶ%sl)bNTADI3߱48 楀b!z%眷 mιƍ_'!_ٿs/~w8owp^+wONvwwxӍU !GXt\B`-Ќ7Z$ zdbQ77J`TX릎1UQ@tX>bK۔s1KTRb.ڭhOivG4v#=zQ./rPTaE5п|l)- 6|0 7#"VucZk:NQ][['Tp0kؓ/QqC%".?ƐpP4 HIAԧл9ea:C*9]&}>Ynıa9tΐ2'G8SBcBbH\B1ɂXAs>j忝mNs||9^؞o.]}G/]<^Z/ U]0sf+%MYEuSvB`VؔS[G5CUU"ڵbwJi3D*1%z<!咻+ujvޑyD˱|fإdk=lٍ*4"Baxgr(bx1"9 ADFcc#O$u G"sU@t[f;r'!"Hv& (8DA 3S!j&OnooExy7?W?_~5k1olwk-r=IXfS^%,څ m̳{a 2ӀsƺJi t>8XAE %j$'%@G|>^Ucpv>mOZ8ق}il})dSJfڶ PUzs&C}hJ}XVŸ/liB^GuyN%RlЪCJu圳vXw sPpw(¥5|L&i0ll,CUu%цNE )`2@&xHȻ`%9$a@: :48t->rceZkQ*RO?acW._9|x {Ӎ͗܋ݜ_ϋ?nnom;=s^ySN)'6usih4zw^F%,! }9k BQj)̆tqqY({ ZU)I<ɑ!xxDq_c"أed|~5 QU܀ϱ"\Rslg0Uz ̅_[K KԞ6]7_,ommS!gNsk ^mQ\A$bJ00Н!IЎC`?hRC9B()Y' ,9gs"YE`Dߧ*F"}E9cӛ7lhl\~I6ͨ\|4}Xg! }XTW7~W^zkmm66勈 1D9޼~tk˴G|r{Z뺺8;W$Ҷ]#Do0 @d5ƪH0H~T5umvv"9q~~^UUJY'1)qRu=35Rȑ/N XsF`ιILN}ޣtB!x.ER߳02y]c&.jLLSUUUA 72־K&sYq@`$> + lšfaUFEU"SBOξv_ٽre Euػ?:V_<Kv% 1a!ڙ`:NFGOxb5ӃƏgu]Qc ./8PfC^,\\R<|Ӌ51kѳʰ(/ESAe!8M3at:U 5 =k85 ʅ]0t2}ߋh49umY~1qCH耭pj-6ְ?^j[:i7i". Rh:h4:?;+-ݰ mKC0f烪b")%zSyԌL=#p1):؂ aɈW$ȜKˢwЋ\gs.އK+~{|x{{lnn޼vs{ck܌Gh(~{f{{_[ȣG ʨ!)#9l.SB2\J,FƠqΛ}q۶]QUiRrf*l䜼>  j֫w0W@̹C `c$aI}oWRؐ2e] c61<13Ѓc.BΕUtd0.<  )WDDC1!'d,Ď*vǮT&~vpiFD],>&QyrdC CBK.Eg L9 {B(%s8\e`) 6/Rd.{G@EQuXYw rU8X|_uU_ڽtuj7_Lo߹zh.>ѫ^ϒݿw6*\RJf<OcHK6b(%WUtޓ% @YktilMb("C1󷺻sNc7mp <"xK;K!WlWk.3L0R8{It`cn /.F"5ѡ38a.Va0B ޷mZWMҵnܿwioi>izo{o܌|x& KU](Xb1W\}HHUTU c EQ #McU>u}39dapâ_#קޤ,99#!RƹRUq ZWҫ(9g*62KTR ^$*ƨsd)]ƶT"H(TNlEER>0͢.YP$V0#rV<G@-ưpEЃ1Jލ P_= `T_o6uceKھ-fo__hTM;{'8歕 -UwHA 4M]WJΓcɜB …ƬbHFQa.cg%w%bي; @$DV\`-m44J ; e'fWЯ"mri9V6DD&2 }Qm:Ѯ[p.4X Whbg6 ge&HL 4fhV *);Xs#{XꪩȬd$;!Ĺ⢮꺪k[,pnkLmN(,&.s rHt SJ5\/Fh~XBVVG<\;cR]_uƭ<8vww7).O\ٻre7{/].UL\HAL-W UFq9á듰p)UUOżek^3mWUs>I}0I,7 , <¦W똨eڌZ\_hb0Apvκ6%23[!3f{ؑ   Qu y*"]:U@q̢hBAQQrJT샷\6Peftb\X ]>K7 7w6wy7-S~/?>||}p7Buuzi#>=zg\r*sf.ŇNܸD;x `)s.,e =@[,qDӟ7uň͡iWT٢l3D-Hɽh' cm95ǐ4 cs(r>l:"l$$,0dJF,{s9m},ïVPԭ@E@Q@Vi-z6*p2#M$e5Mcm"^+q2 K$纪b:::/BUEBUU}e#+;bq$`.:FUO?=}cXۨb%<jjwtrC}S&N/%{w8E,{[!c:*C𺻳9KM)b諒oޞλ4qkąKT޻*+])(,+ksH)"u] d9'bGcTm[Uhy )eSj\cUZF<ڛOH9gGd6BYb&Z- F*g3xVA?}%XUulHWKU3pgǿ Hi\L$ +(cBR2P6#RraK@ɐsKB',!S.l2G[[^yۮ5"`.u󋳋㧇Or*y{vz6;ko^dCS?A=Npawkws}M]+|A\f`)" Z sr2 "r)}!Λ |,z:El9(j!TwZ PЂXv.U8 `m@0&Pj]!y5Y 676mk4H=ulqWЬF"w|Ρ+jX8(G fn,1,wu]W!r"}Cd#Ւpf"6 sn^\[uU;r  iysS4vAֽ$u]/TXI97ͨcK'~Mڍ7^wڥkM5ѮRJ߻ݭo(ªҵ#_J1`D. ;Lw:WX'f1xGDmC9盦f{keت7h23{4)%iTВKPj-Q"6ԁe0e!Ѐ,() 0Y2߸ GDSdW1!ul!"P%iffr ޓr)z⺮ vVG]Rp jx saFl~ 9 ޣC.,,99¥dr/~ \Ĺ߽ѽGNOy{sjs2ٸvA&<#GD߸l\^ԍ|mu Ύ#`"R8)몶3VAE7yUfjPO\ŌZ _asv0>=_ "kYj-t/d8 b-hee(Y$$P%$꺎Y>!J!"9UJQZ0؉6.̚lPP 6`ŗPeA-HHjRYN6͈y޶ ʗET$M]"Iλ#t;1 N, m2jFUUl6vR3g"9.ő ">sգq=n8888h, sh}(EeX~O}XSjEUU*RTN0s)}-ۀ>4/s1dO|啫$ÓOܽW^ٸ>@h'O6h9S!#g"9{wI{sHvyhLbM3RsNU.fBDY訊6GG6i144@\m=PTP0 : Xq 䈕~Yx )j˴Ce^YCo-%ڶleH_XvbK{L&3_7C;㺮f#@\ p](~sa]dsp QF$2Qj%{2u]0j{# (szG.x_JFtmv]_U EJʱ03h\q6XǮm,lD/9w U!קMD3g+rWEnLFyw~tz $ON̷b羈S'q<@ {PmHQYd2G?}irނ)k_9:>o]ȅRs Ѳ/"B+26@#IAo.sI^9#@ѓm/ B"7C]כ.+ rlPaRd)4 &?w]/*!x32Ր/( l=kG_^0"Zf ʔy"s"jۄ$QIXs>UMTHS$9(L3]qj!&^TN)JJr)*BU TUowrɦ#c#ΏNg''ݟ/5Kd6cu!T w9JR!IDSRNfEϢb3d4Ͻ 1xONO֛)\J)ȲySUM'!ŋɖxm t0a)aeX:p`鹪R(k"$1Xh5UCgjQ< [eox<)UuA;??#8 np+/P .j RfȚS3cU˲Q sQ /_Hm(s@*,x6u]?sE$~:}sNQk;[Nϐpmm3ksBx޷F2\X`hQɅeH{\۬bEL"v.nTM/?GW^zQwP/T8wsK:͋EJ QoKG!8QerEP&vF{O򩧦:RD?or?EΝ/bmצc64Gv֘Y}>L'ӁŠ@w lPUQ(L!WQ|LP1&UNTUmRG'GRMNLD{7 A݄ DˬGK6{ R Z/FYޓC!AzpYWj'KYOM:K6l5Em|k")ւn?S cTœێsrMsRڶm{~qbp޻www676(EHOX`@S7+%Safټ?>xrxtx~v1_ؾ1S׸kӛ s)DY |  s79op@)%'Wؙ}_*̃yj*;C4o;&?Mӹ\ GQsZ!pnY66)kLe92$NDƦ˔!eolv և0-.!tm뺋 r䉼0 \{`DїPe[+`-K5 f"[F@ƒ)# sdj⊮KWU=J.̜s^ib83]sl&SmWB1Xc ф!Df%ՋxTChAڧ0?w~/_beF2黾}7o}w}@B)-]]ڶogOeYz=s!"r@L"(e`$= 3_ghz%(0 FM*3##a$tUZEfD{^{ EeW~qj8֭^Ͽ=|:c7=`ZkJw:FrQxTese/%ziz0DlG`}+wn1EB-!y uSD[Ci9UxBضbQwiXw! Ā@ۺ !RTSFzz:HIwˀCT? RJ4l``L.ځOYIZh0v;Л7 2C}*zw⩗ >s*gzz|z|}ŏW_ܴ:ՑBH{$!hjqgY{oAyWÛ<IM{>VyNd)E"2RZ ѭj!č)G'g=@ܬ1a'_͋w6c3c7ut(+GՇH.`pY4f@]#Cۜ9v8̮@D(ׯ_Y ,! {] @%v.CvEn b-.8na^p:m"m[yrʹޘЇ)e!Y뭷VK)y鴮GyiV=VsDc[sTZ7woms%qqO4W10DI)Zub)RKQ{*Zk@ǯm{oˏ_n$"V{YoKh!;{ߧZ`$*"!q &<%D*yXlOSbjE*fv\rfzSZ"8ۓg߻V3@ x Dm-4DU3QD1ew"s@,ևH` QG.iŵ|vBS[F\{DȅsL{N@P<:x8z)#]Qjm2E">bUeĴZr 0@L)-M><{Goٛ~y{>9ń'o#]zv 7Vz u~YW5!ݒaLLͺ5(jVZ5mo7P\ҡ6gwC)MZ)e^ֲ~xyJ ^3k)m"q9,Bzݓ\W61xHwysž"t}^M2.߀Zbz v?[>{hZ "ccZJ{9y :x٪A#[@7uG]i (EA$\7nԴ&ɈySJ $NSޫzpyS:3!!~ǧm[?{nf?яU.E<9eg*|;Ϗ/5Ο?}?]˯_7?Z9ācJڌ/߼ a oWJ񟎸 w~U; ERl;z2s`&詐#ok< $Jfl 1p,@rhiԮߎ(ٙ9XqL FAMAUAfs'@s& yds=i4ĭ‚vi_p<8Dtb1yFRZYڤ)hm< @``Ā[;rEjN9[̔)!TGPO鳇׏_͔ZkwG;h/cǿ{?&!Q0v)9'&)S=D9^/B{F(#v3bFgA;Gc[_WGESmuДEh/$J gh#veDH4MA))4K-FD<}c7ͼ"f *򅰂"o~_o.7 @4f =恵I 1y"q6fB4Y!$ ^'`8seYR۶j5x<8rxSi^eؼzJW7.e^/M{;[ rYTsO~ )C9p@ NE#;W32D\=׾-{xx%`6kmCy^ˌ{LEϯ>\S| pFA< pJiZ"L:Ap89ZdZ31JGxk9çYS&40عq۶m[}Ќo8(DBuUҶ\kstt]ò'۶攙cj!L0튈\kE\8<}<}vw{u;=TP"aZZǛ8E]b)ݜZR{YOa"=4MSxP71%ʁ[m1qxmgxV[{W[9Ř{i0sY0zbg* ЈY==S1Ϗ`Q104 !|-[$ p?"xJlWM[o3XU%'SNeeJ) h"K1Ls"kc||pz|;0/=ջ+__/~^Qw'o>]gw4bPcG" 1;+wǔrXL@ ĺ*e|aq:WJ;B1 5gBxY]wrtO)&"mes>==齟υ[⏙rJux?'!2ǑƙxWTifnݳ]lF@eۭl!q86D7ű3^yavt"2Sc `gLy&vYۃw,DkݬJmԭ[s5"VpttR[v}>8e0BcAX^3z:+Lb֚;<6g}V6DvƢP]تĆ6xLLxiκGAa?@C9sNT-Rk9䍋<bX4 ME')OwWo'=>2ԟ'n~t>%pyѥycz58ٳg۶""oBL1wm`vz:RcYeܲˣ>fЅ-.USB4bYOa]*-jw9ZCE AMN@m3#wPED`9,!Ĝ#"AM49RFw3YL7ݳtWfۄg "wkA@20tbMwX)f124Tf1ƛQTD)Y)KT."8E3m3!K#RL>&ܻq+yxu!999T5t Z6"Hz !l>2oeGH2Nڛވ)紕9]Cg 1Rn {-rgDy9 a[WS.򤧜smV0[,Tkn]ynaBN>xvFß? bLvLE]<9.󲮛ɺu:,j5/T -BLG(О@0V P0҇}Яgec9hB0-LV"xwJj/OiZPiI4hR9{mfG9m~bO3xlZkG&|U&|f/t.sm T)'`@ؿ_.<Մh%vPՔ"r`}g`m[EzrrUbk͙$L_ϸeO̦ `.RK1A3S1 =AW-M[! k 4SAs@D"`"D"IZH Kp59GDbkZZTUhm[#2VU쪰$='?Gm802"O2Oo|=V;330|vbZ׭|>l]#&ܦ>ܡu>bDZ 18#<'?|Zu%FDڡ>=~ZiVź j;LA) F ̧ӹMM#*D8ϳNl0^?R !iqj Ѻ;#G1GOwXoݑ/D 1x+}:j+v)wXC>~7~Uң̬@DByPSfQ1"ȀnbCϗKkg5oCsv7<߆5_utkՉH9O)嘒۽ys'j~3SJ3)pT9F`a]=*j~@35="= Sfr|ʹjU=ƥW/^y|72/˼Zڈ$U3W.O g>RH)$5n^2ܤ[e^W#1iyMe{@ HجZ?a<* wq?j,OWί>?:jn_{&=Țv71Ӕsf?ocryeknuZW  P@vMT0zzle)`y {oU>8`6SJF\Eݡd7Ly!cDcꝊ!Y޺:d@0tu(?_g:n[Wjһ'6?wS/Sv/? 0a0:B2OWbV &!49TvˈQSŗ@Au}Sg58SZmvsssww/$@]ŵV.`ZsG}S=j-r>=Ϡ֖6ՐUyޝY7K]5|#~KaY15kzfk6 8eRyDnRʵz,*Zj !"&L>]$1q-,`$3̘VbCyDޭeF #yBloB`b ZKf*c*Cf'Iz#V#2O\1Td۶IyD,j\.>ۺ<_!ĜWS=x|?_M9֯G{waӔws{e]Nok#/?~Żob439|]]RCϵy] RB<8<ɩLZ몒R[E{^Dr!R{k~? @{O=8DEC)޵|k#)K'u_F̴wq繪ٗ>*"bu*Uwމ2!aH 3WX![L Z zCƆ<;Ɣ".4-CŘY{J)O:WF AoU=B{m]Kn㈈`.u)^Ypfh^6۳.#ts[{1ŜrUۺ!b(:7ߓZ_? ?j~nB᧨ g=M0+\3"U S]&Vo9#TaO)M8"F5FDB, Zi`yaadW'E$vGmjc朧*1GdvRjomPHNmG`f1RZ9OLL!|8c( *)F氮kS:اEE|Qlcru/ Ę٧@>ۉo ! UZ|sU͗rIxE&*<  10_3NQֶb.`fR%UZ_9H5D?۾L.%XRk1m;*"Wvv۶:#Tk 1xFV"Pi-V/r~fOOZ[;=DcSёDͬժPw8EOEe9Y@:R 5 чSJB.oU6a+TYJ*MmZD Zwu1ٿ~onZkcf"jL1:46]:PDs"/J֪6[g\<̧N}pvp`p#8rKLd)9l? U#?>Hijm0hoMdMU S2!qJco͗Z[ q'֗2>* 84$D&RKk=Le0p. |9!rA*6z|?ea֤p9gŀibUIRǞZ=C4 7]QS`t\.1]4cfPcx?E >͋"2DLUp*" _&@0.3C$[mr:%@ʩEo@bT?sB`n.b&[v#Dfj)ȈICmϕgp*}g*4Mס SN`\##OZo; iJSt6WgVKWs"?ajRL>v!!v{LJi]b 9}6&;*;68A^ݾwU|9L@D2ߔMS&"3>>=1o60f60Q 10_Y^:\|Oϝ. jܬFLݺ`'7YctFPj2j鮦1>js>j[0r_;%BքSwܠBlCd1FDa,h~*9VWՎCbm0]<:t#(j/4MPKtn[p<^C.q;Ni?ܕ~:CO;Rν{~}E)&Dâޞ>>o_Lw2nsrӒSH!bӛO>t:y*\ob֢J)z `/U_rIׂWU}#2S.붺 LTQ onc ut>aY: EēЍxsL  쭻rٜnb{R/}'猄] sy_Տ?}w_\UK-> M[fbp`|2#Fu°V8⽢{@ i qDm|"r-Ǻ+\빏J)W ÌzӀ4f [;N[T<}L03Be|Sd>P!;@EsTBsu]7IN<R`j)[ vsW_yzӤ&7vW|xKy:?zӗ~vY;|C,G@^UbWt9OGUS9ćcnz8i:βWFB pR0a g9p:gwW>Z#pbʁ̵y<೔%t?~)`\舀~ĚͪC c:t"Yc\NK@"Od \Ub-1i1`yxw(L8W+vdU*!7Tbk>E 1zGC䔒=>>9z ]"!zo""nP;w-e]?>ozb-"j2Ӷ)1y]K/h_HܥRD373 ?7_6 rz8=Z^kIm]?G{ce ݺmPA̕y^l_ibDzZk0LR)'&[B`[k!T)6#2ٶ1gOO, _#j@jڭ> aD@_w8MYDLBKr[q{jp$R悤 b-ȴٖ0RʷW[e 8\qsru$&N1>6BRB?%r!8>ϳ'M.jH7!O>XUü̽ c:,S)C٭,K-G/T{qK$7m.4\#cKRjzhCkMEc ګ@7bMK"= 6c-svٟ!ppD9ZNOUSEBK/$ՆTcqwwGH{Z1OHoIn_!ܟۿ΋w>{ټKv9.ts:u-a-MZC&REzs/vӳ#Z;/N<3M1Xe.=v1\JIDnon# Ըn/p=h@M325mzR7PaU!iSj&,!ׄ,2ꚭ)@J-*o3ւCBUK1R 9gy+-?8DDϞ=kBdqQ7\y#OO"D@ իzԔ}^*+_#HϏ Zoм$h7cjQyY=ńLdP65U)l6S4H#0.afmUC1 Ds98Wtx,1!]揈1DS[9Wo~/oB;/pYZ*C!/Ო{l'w9||Hk󔧤j|+irN/'i̓!} zR|y)7Y54e|z|Zu42/tٙ>1e$r|NGӶUQSO,,3ҶmqPubx)ǏO8_*DL #~"B0nv4޶usG!>{nf4ܜ൧5%7[ʜk] #~j\ #4`h; 3f552 0U_˼koLǔroO?u͗SL1;p=x]MyQ1cQ)u}I6 niz&mmDC|E_ڷyux^DQ5Qz/!m̦<"b#DSx)yɇ72OKJ)s1ŠD?O0Y63~[d8/xsr8*HH[j>"uLu+SNyĉ5O:L4Oh_Kʙ?+"qbr͏ /·Wzy]v7!a~\ayZ[ "ZDzх` \A1vhY_ZTyW>&"L_.u[=PrNw" dЭUz ׀9q9`  tPlQZi`e1 'r0!"2zv{ʇ]:$!|9}vs6x8."r\\,DLnnoKrqq9zttC[9ޙӧObL)|=~|w7wƙE1攜b$c)ćpws`33>{ٛ7+lS4Mۺ|R$TKUiEDTRJ"c! kRJNU*~ޮBb)uֺꭇ!蕝x90Fޢ:!Ԇkp@fᑮ l`ώmL]Cc23j񌹔s랐^=lK{zmnsi?/>DVqj")61b"[ZTn" yʅҗj{vE,Pb*AB`90S @)&S- UV㘙k-JDw+ r`.va+7j8b",>D_\.|ss8V޻\'K #jq@C}d?D@l8cN TP<䜏t:SnnqV=^YjUFD%='һUrY$1P)yp8ϫX7N8#`Ь*7Aj΄ WN&XluߜW`\}A HNi rNşEט4upDPOB-mضm`R]j,K?`qQD$8/˔R7ZPH1p*'3x0nus1s`/޽r)%b#;^<{kkj@ 9RXIrή9jmD[L _C޺mv{Z821VJA7qIP{6BE@v#:fz׋ *BU\7szT1U4-#50HeFG̣Š`hM} 'À@,9t"0 %Ugu85@Oc`zV'_vmԴa8S1AT:nڱCNZ[K)V+Ի Q;jiڶ j-q2horȈzoiG[kC!p`[\ u]U$ f褝Q1Y8RᰈmY.p9_Gj)d@s.\U齙HOb7`0x2,}}ݚkiΛ^^xZJQq  >B600*2~cuWB!4cޡL :OSkŔ٫bZ1f3h"RQdouU>Dyxϧ3y\ΗA+7 |Ϡ^?x᳿?o)OnSi}05wK3QRHԦ<:}]8䜜ө*C rݝ&~^=lU0HK|:'N?t8V!XJe 2ǧi1%+|QSSlw"7_ _@Qw G?_5\54q}a N3>ǎ/zI!ѐ1FۧIL1匈zС{0,wV- BV)Amǧf/1iAcz#`ؠR6$q#pUb4D9G@Wa ;2@uܛP'p3x8#gh+MIS!F/a3p(ukcm =Z-<4Kq`!]Η'֍-B("l}y9/`FHpV2/ TmmH4|9pnabߤ'ÿ_+7Ǜ'dqJ !̲?R sø,(=>>zC!Jטl)t>_=@NSPg]yٙ',LH!Kqd"3!׽%&7WQMB޺G5Cb.8oh@ڑnn* G$s"sLꡌ1o,dT8/1 E kg_u5ި@63<@)XJ-u#杙J;j)J#!*o;L}@o{u΋<{ǧ~5obkReZNOsᲖ/^VB NJ_tҔe]YzYK͆PJ-5 srȭwTl1 LW @PiOn}@!!c~|R)DA=ĸAnQJsVj"B&齵! pjg+aV '2DFzkRj#e9RN{PgbDm|d󡘀 ,=~{f fa7)}# FjZs9ZýwB65;g۶>v޶Xޘ=U bL)6Y>"Yz߶v9yVBMռcjU"r=Ey/)b;/jޔ8 ? !۶yejrq+!"wԻnKR(TrcZ;\F)M3xdUsǘk{<zHgLcһ!Cw1 LTʆDhc"ESw_i> LjC$\g#lsځAG*Fk5I`]mh`jm''f$)Rc6XJ1pMXfL)!*Mp *y|S{v+岖e\Υԭl(˳i}x|:o|5Aн눨 -(.bQ Xjs,G0kzۊD~WF?)1.{GgAuЏbbQ6l+t+;wDKYTA@O!b`!mAb4UGyH4yazYQUϗc'rh]xrp d5=,ƳL?\_&M9uiʵT?==tb^7O?E113?>>1[X}a ^mȇNtE~W˸9dX s\}fлp*r(R DXGx$?V@e8 !&8H"Rclݫ{WMPEv֠cTZ>|PR]JfS,.z r-Cò`jbL9|vw>x~g).' oZk^-OO[٦s*~cWg8 ,X XE KDJ͙ !`pC+hm:V ̦F3Vf:뗇 Х;@"ǔrJbt**KNfܻٓHDGÛb9"Rn*Y];_&4'+BDYD˺gEس iCٶ1M*b"=칻.@rR$Quګt15Qmn d1xo-{ˉs-O2=W)K5Yd#G#wٝ9׭X(NmNҝwcl$( f<;S{h?[V"z9q, Tk3q{eZq+[U!H?ho 켞:Z3h-o)"k]x)EeiYS𸮗}SU sc!ntddGܮkmRJY30j({ [8#*΃kt9o ZWԯqח7Ÿpu MJ)&b DkL?܉HxJwaQp9t{߶p\FךsψJ۶bjho9,% HDvboM10q[f2iӵtg^+W^ܾ^_9/p0v'.SuuSk ĵR FZ0>n\u!:LthB" pajk2M#Em@1yHk>17ޛ:})q9c_?; ӵRN)v~Ms0DF1Q 쇊x∛.ݹR{w-0jRJ5Wt[>$B”gzuyG1hN'_jH1R])GoMibyi#29|<nooC r'Vl>4x}λ4p,j_dyvMu{!j"U:Mwi]J1+ ­^.~ GȐ2j[4go% R bӜ}xx}{CDw63|3n&'rFu0ժ  ءӼɝtۛ(;\A=& Ƅyz_4/ӧ󔜌$"V^~Uݼ"=x{{,'ٺ]uU5O1w=GnTf5mRwє^JƔ\; 5!t)j溫ksg#ZPJ1NKDyckm{ovf=~˧G/;=c_zkMUsN'*u5=KjkY۔r>Zfի㱒eBS뽔;^X#R""=b޽WW);-ٟa938r5-K=CBcC$]]hՆNjZu1Z2/4[k'sHR* .V[kVUJLSѡ뀨f2V6$ww_7f;ĩKwIJ)xqy-s9DDZO1ibOj?#4g;CpD(#EmL{}VJ\6oZM|>Rzk{|!Ro=41׿v:訦b̤}2߭uhnN_7S|`x>_j1 ^k@9puer?qI(8•?U.֋mjK6aG5f#xU@Č!I*o'??O^M}B󹶺Ox85ddR)g-T!C `> JԥI'h1F|Hj}Zw^ǘv1 $,Cd8RL.-"Z|CzGg/)9?;ZB]C-|Pzs`WbVjmӜ<޶RJݥ;-΀No/fAЩƞIV ܭ@Qwߘـ4!AmC`8i&K?|dQ';2F1slZkSw$en=cn f" ݚL8@Vkf\}"Zɝn !Jbn7?&W~y Clb DzUT ^`|Ly?|K~%&Fܺ^{~sOJǿ^lu_ϿW/:J-2fc;%ֻV{P^.Ë'> }O[ËoQZkJ)8kH1ZVRjr΁|.wm'Umo;NGEp|;$S f >3$wB <؋2"t`-sp/1smDԓO|OSE2,ϑ *g] PzO#= >8Z|v(. !bҀcLkmĴm+1*1K-]nnn_~m0lb4B B`0%u9gJQ]DŽn}뻴O>W_×Tlukp%k[}bf`~ @P.fv!ݘRj:tG^zC0b; $AJĘsw3!BU1hdQ$t%Blj&*ҿ_X/݅q,yd@+TG7 pX1phRO0Mj1fMM ,cHZ $Ye \l͉X/S*oPAy5 "қ,\{ss="$^WM{6OgU[{_yvg _8K+fu݇[`䰺 !z\׵NfBb2VOҙdļ4W# -MQ<쫂73ͯg~nÿbzk@9_}MpO] ?`hnJH:"V"$S޶dlZkA Ǯ)HdXFv7!;}m X&^ov@ܠa)b].D8ZKU+} @!p#"e! )iRjmDZkG\EL|>KGyr$L_zo!0km;p:0;!Y Եڀ2g1'twAݣfNC"i}8~ {`е`=}iPsx7&L5fc<:Z 5yYjVѶ Խ֊؜Sv/J}ѲMU9Х1ypvyU ?pY'}sɾ<OSol-//ۿۻLKiw¾ɏ_~,M>zqJu9饕?%%H)=N5$(< ABN˺^]Cs;XL= v[00|]>xKwtp~z-n=/&]7nIm9B w]= 6<@c|j( LzzވhU/Ky!u)ZZkO Zvռ0,`۔Ӕ[y.K6l_S/NQP5_ QȏG"f@hkWRA9 ŵU@J G"lc-Ac Sr! iTSz*oMԄiSzzzr  D=x90wTjyF"}۝%=uM45m//6gc}y>a)O'5 MS)Li4S ɑSn3X%)*O.wwgI3QdlDc붮8DqL\)eFd́意Y<4VnּlpZB@z K8۳'zXm-o.W124Ds`߂dn޹1=g?'X~w~~{ݟE甾cLu=Zt1jb"Һn6NZJ0g8 ]PB~? RlzHRl{FMau4<"s>a!#8UZc~;n.c5h?w9yU =7jTzzztGkK5ne9Y+_z0"W+ )bZVۉM" _Pwk0q?:mKW[f]`H)QT)^K)ZF\'X VC@Cq<&<5>`͚ǜݬ1tػr$bL} PTȰkjky!@t'Rk^G kжnѥĢWH){\21rkO*қZV7 QPj.{0zZ4u: y>[Ccd=Zu۔]ۿ?o/=?Ϗ1CHa>yz_?ٛϾW@L~僧K|h Uմct&:*-#"R2R 1R"ƽ]B3js'^^(x fT1W50o2٣Pu:ԷТ3MS\_%{p\-NC~^Cc|JP5mVxFW4e3(RBuaRO9PL̠Zj!z6)ϮjT2p_]b֘OeǏ۟Xe;l{xSUV1YE,ġ@M/zPR BMU92fܦ;νJ>{k߷6Xu^.n\%;nNLL+bt"SvtoIw* dt뺪z8x+_*0qKΦ{>~m 7>0u'LXq>;?6uRp:SYkje9Gǎh4,,1'f\Z.Z2$~AcV`tC^c}-Z@{[ {PѡϚ,*k S@ \4J3=pU }pUUauLڔ,/y8X(Zں#Zܓ&ji9Le՚V&x?w]׵B]WJT\plcm-I`IR,LbDs =f=Y Et圧ӳg{9rR0m,͠Q=lF`l>4,]?RƜ).w?`jݯoomln{JZj*T:W.^98/#ሯ\~;"y.j]h/R윑piQ;p- ` BmgDLeٹzvK|z\-D$VwSL6.bEJJ6UүoI7/,YszzZvb `vFE$S"fIZ""nsܻÒ)kwl͠&X)1YND)FDѦfH$Y6Gї.?!6utLrAZlFd`M贵L(Ic2"أWU{it.L&mۖ\FC/wbth ȞCO&)e8E "-K^rqF p8|]՘[RsRU#{|cv._OVTcMQ V`xe{scscmcgsggs$ OigshWOq+ٹs)ᎀuU螄XӧR"}A涋*]0`0hVHB nR9ώ! ]VU+HEdPRHr+[U@,>Bϓ51mg7PJ Ms9nW)X"R҅RFUJ朊*hJ#b1[;5h)')=TI.%xO v޶U}(6)ؖ7l vhQJ7`4 ltٳgnLzrz:9;m5a6yc7{E%Od2#` *f$b `9URJ۵(IR9PyكD1QQ5~YX I|ɒ {K֢! - U@!0\oL=–,Hמm^Dh}5M1( A"b9%BcSE [1v\xSJH4lFLϷ2 HcJLVw03vXT $) \LfgG.l_|7_p0 FX~'Ϟ{>҂UA&"[ĶYE~:'{@V")ǣ5`!1Z4+*FC5TcE Pt@#B*`-O)2ͬ^9IMQ Jw8:f鵹pyueuq:5u8*!Fw%Y {!TW ɴ9s&f<1]םMϦъEŨij#h\Ғ >n{k{^[}|mT!c2ZއGGJRn߾+G?]]+yb%z7,ik`)RJN)[}SI)9vb41&fGJ9TJ> *oyLePd9oq*ȭRm3 OlRnOD)Ft)TE.+%| l3"ft.YqEU}0OR>-@\;WWu[HZ-BS*|M6;ԃz}plzzv: ^ZW~iQBDW.^|rFw>=?9=y|(jIjऋ c8Gmۺsfly@S;F R%$~Xhhd jY +bU^B1 n8mŘS%s۶*9٥Ҙ365AL@1fs&g; ^uX- ip`xru{Gu[A*/xksk` bN㽏;;[ۛx GQ:\qǏ=~7yƳO !**[U?eU%Q4@+TYIf"Ks#tBf$3SDd8 #l0O0Af7ԼT*̀DVZj_XC) {B]j%/q=[Q \DPJbK*ѫ- R2tv̅hsBUȪ*Xe3Yma)cUmWա4)\PĢ֐AyWr>I!z4q^{rB`n]T͗_?/zk}kK7nwks|mfʫ朝 mku3?sץ*WVWזn r:9;f|\|^׵DHABU9秳&ή>/gqvu>r![V.c #`+s#f:1`QY M5]VDŽ3`+qشEzXCgik FTQm^МbɆu]#miuәM@@CكgMYAr>j@J XudiyQIP;p,Sv.A84c]7bc rPmPW1d[rM^2..eLLމIJЄRb @ȢjTU5U땕PEڶ.l73ڠ"ň)%~\2(ã] Kׯ^޽ k]L*TGG/A}UU hW*!1[ (E)|/M%bt~23R{?~.)ev^U흲%D)pJ] KV^sbYl"DD~(\BЦXr.ڶ]72CRHD@Qct65-#U -svLSPsKaDcWTtj7 1@"Wօ/}ϧV.m_jƌf`4\o=۾|'v캳` AIo%a1K1"Ἕ^!($—C NHat7]۽z!0^$`"Tr&2;>zrvo^i{٣6^[PG޿ X5ҕyjc"輔TF-4l,cTt:^Ye#Q{t1f319)zX뉊Ǘ?=؞&s];)/N=V&yG5[CSGQɦ `osK-Z@  1`e潷нP7Zmr4t6ޓ᫠,ZHأP8p/-RFC Hgŷn:@0f?-%; rCUKR#&3pfnCPUВ8`m/%LDL`84HQNm#O3 7DhQ\0^tx_}mlLH1c׭6.\9HzZdRQ\Mhˌ@>Զ酉 ޛKAm*)Ea|1{U@Y,i*& -Kݪ.SVTe2BL/ ]Ծs@2^O0-tcڈnT%Z >"lC-'Ęro[%{ .ap>јʊt]2u-U{/8Ϣ@(% s[9Q)3d",TYt竢NNN.n^_k&gLJOM^XlܺpԘ1bW &d=d9v6šΧݼ l bJ"v$D5lP9H׵L8hvD ŮSGg{ho iS"t 1ݣo(Fi6FC R,a7%?Z+`gq= ^XI#`TP @s"fRr]׈ ~1 pLĠh0f{K oXTeSS 75̃A J)E[.vuMgUTDlF)fQy(hsʂ5TS־L>ԘD 8&)2Oϧf=3:5 "nonc鍗^"1L^ȉ?9;}WM67n߹u$|܋$%XuU׵̦"yQ bz=D܌y5hN VW&0sbJ:F2w>|e' th@k8DһvͺU81^-Nd"dB9-*F3Bgbkg#3e' JiA+BĦV)qU2 TUDD"rBJ]}pX G1)9'f|PR(lq붶6M?~|WZo| gɣyK/5aŸhkskYߨ(Jb$❷u`7pX6Mh>t13)*䔭\`Ǭ;n|~18_⮟A~쇐*T|<_T IA/4DlšS-؆Ef-T ~Y5{dC* P9s2T9c9{^f8ox!0}(of~K<P4)J^SSYE֤A!WVfrDSb&X(a*6kVJaPvޕ";QmsN(RlL}tx.ι>H<=X9'[II6((筁9UmNg|:lJ ̵~-yB{?<]]O}v;v[ dm2 9Ӣ>VhjW08 d"H9'&VX3,)- 6`a"@TȦ lѬWbn3Z"*RlmML 6kvF]ԦS>h5v.ҫȃf^ ])%:C0ٚA:OT1甂)1Dd2)Ehmۚ*T,>x4WkЯJX{>5_Y -6/\ GmV'*jk%^3` @QK vچbLU6ϢQ!w8{{3[etЇdOCjflCm5 gRwv䜽9B@BlV\T0 8ЙU}R8؝g9r"6UyDLH)w.v])l^x8fbaQєTȣhҥO+vtG~ o1ܬ^osUU9D1R*i8s"DB>R,`%UEPRJhfHF 9q@ ޹\rbV#"3*0" *ň *9$+Pmἳ0] 9EJL}tYsCM)=v΄Fb&l>K)6&blh;oKܺyWϟyS >xٶۯ}}w{l]-EFх Kѝ)@ޟOgYs} x xcY_VumT ")AӨ^?痒mp:*r5g ۰a;Ez@: j C{A QT@Xu10fMf Zeܩ"Ƙ)@;oւB/ͺg.3!- b)O-@&'r*9%$k\NH1@Ɋ)LmcL {<r1[o)ҵa gY%တM>h;>{~ywiŭj.vj`A][.ˤVX%mMg'O~rw}Tqol<a{c{}eWyBx+^BK\nQƎc)&|UՈ9gP5VUU1s49Qޕ\DJ syx2 cn)%/Kl*h2Gvؗl3+fLP$3]>~e 4=q3CYObc%f{%iтHF+̺#3Щ2Y*o[XH@y6 C=YcW `8Pkٱ]EĨ*&B5ܽ|KuLJ~*Օ`TuFWؾsy{~'.e+Wb].9K&P8xk6/9"|R˝"27zRسO3"x;׶--Zmx}74i2N]Ƞ`) ˲=k\$#ޟ  P ~:= ¸Q}"'XfۮqfBHt5 \%T/Zwc&75A ȚYRXZ)E|)YNOBp^a S952Am;(JDMR>0$a/*6] usJ>eza36ʂڎRN6][]]Z>Z_"K'Ϟ1E^t#tj)GDIJ+y$RJv&9;aYR^v^a*+m:4y¶L.rg9ph+\0"s&62Jȱ$0 @ɤ`} qPT+jnak,Ъd* *3hP-U]y-NH!jMr wQ sN䜲(m}g϶RDLĠy/]ۙԬ{ )"'So9:>~o89GVW? W~* חV|vzvbڹctb͵'*dKγPS*;\ϒ(!#@@O?YiuշϏʁ<ɚ Xt\cIME{.s?02C dk+l@LV9y 툴wX'MEΚ%09p J9y E d~d [ _s[(1 P:,h ]"P!R"4jZ GUɱ3("9",,{e`d|z>̶jG;߇h}pptS4Ix1a||vŋ/nl`2RmWp,]GkvT^ϴӮK*72DRgfHޱIb%ZUU*co#d &#Y$KF$rZ-PD ;j1RXƞ,VQHAexXTLLR1Q i>`Yf$A= :r_SZS?X/eb~`%cAf Ue l muY.|>c̔RXx*;ΩKIzz~p㧏<h0'wϾw_=$݅ +޾qsc}Y;Rgty;Bu6=;8>P7vެ")eU5s(%֛);|hnPm'ju*! &Z<cu9*m e|`.RE|rJL9E 0Qu*m-1%& !kz:2AOoWB#l\1T4i9_*or*i3q^y{_ܾ˖-󓳓Y;;=;}~|}19tcmW3W^;z|<ߡ"CBbgWs%LhT̵Trh3Mpr|G$ 6fҢH= HE;'jt6RP>"څ GjQ%ە1y Ʈ3 )yγH@cagǚ@佣J){;PZ! &ggggj|e!.ҶmNO̪ 7"$2`x(ﮋU"HIP`+tt7ivGE94e^9P6Ԇ"}G* i5'/u "i~ ,01~{8>7Fb:;;SpgGrrJ2MoÄK DxЀhA .mpH(F Ds[6!&)̽䒲|;*H1{]GĎ]4%uuj)g#{BIvip<9?sn{l>;;,[7Ǜ/^}pws}3>#KQJwy;wF⚺K|>O):O1']k}zx O>{ݝ/GS3nᜳ%5tHy$"!$("h0,C @ PK)Y31Yꖕ/@)!֪ܙ9m[וrE ѣrPi;LEJL)\աJkDιmK9irI|gd}kWG4qCTr.1o^qxӻ|k_|xe8:Ŀ.7Xnurv2Mk[Kcg/.&gx­ C1F+PCOL}Hc;99JQf Y#pMfY8"RJ%1{eL+۟Q;TXef|IP H4Ņش=S@1\D@OtZ@$yBF]r*xdpSZN̈́Deb;- 2a E.~<6L.L`8"2B9e&6JKf9Fq.nrL}$"Nٹ!9bיblRbvE1 R.uS1ᕋW|a1Fizx4ݸRo''OؼqmƆ4k\vަ.-2WvǗ߹v!sQS)rKϟ~Kώ'ЁRBBLS\ɥٌ-M?sΥ䘢 {aa h(4ek x!;cR 5\d+@D -1tZD >^d!,KUJQ;m`WL A3Uu1T#1J5J*@~Od` \n,$#|> ovlۼt6_\J>ʖf+ 0Z|7=:9g.]Xc)EU)KWyvn'΍۶-4G= nnol &y;?:>zq"puuPhێd4)3sdJC$}&L)έKα朖$;3򪋝S?=9/]ܼڬyĬJnMF;+'x8zk7o]y͵N9Wrxp?`!VV_z֏|+N\3iEpBRbA*BI"t:0l DĴ˙J?о 59ڟv@S2d)`6M Ʃ*Q ,{_Qk&)EpĒK.*V1R,RmAB0ۚ)G`4i)RNV"{"@1~AAui 5wEZH zqc2Knͤ\\s¿>}xE`-kjBg ./PDM3&\>޿~>W7766w6vWUΣ~zW@G+ĖpvvDlyûZa! ZuΗs6\#//_$R,q[ËBĈSJEJwygBHX),6"ª <\$J1㾓aǀ*9K.R;|-pIv_*?죣ãkn^toTl^XUւ3Җᜢǟn?2݋k+k%a"Rd:}U}WVזRgbɀG"%pe8"؎F#R0RDc}4]. a P>r1 }%ڼdi'2Bhm5 @ 2:I: `8@PuϟXDE43..+kXYduX@l kr 9tLnYx'Hx"`9̾ ;"\+糹}6,كY`0p]WM3H1^]r(Soj+@QhiKIb*uLClrx|c }΢s·ܽ?6?6CͻR6FWd#fUUb]7ι.w߸~;7֗ntelgؽ:^Ն?;ſ"bGIu;w0D fHLdf 4}!E.mE|#jaU')!. EDXAi谶*;[ ŏl$n,^f%|FB&չ}Ƞ;4|vuE'=i66̀۶BUU)9CARpG?Ae ǀ kTŁ+Pl3fʰ" YVg+N a\;& c`Js9va4t:nP \)2By8O_)gΥb>8Th8<>9u]-^sۮkK;7{Oyŭ1y)b| /\v/_}EEU(祫irkZ`2m0"2 B)&bRwv^s[UF3A_t`aL]7mveΑPJQS7kcʩ1*`Hӥd Q|[; ![h }%v>룘hl)Y HN]+7ɎT fTŤҧX3#~kqdG&s[ H̪Ҷz t1`1`1 `lD`'bvޥ J۶C@ȼȈ'\zuWv^d:yW.]uU[l^Xx?xWv^Аj2vmr͓g{iK;6/ ._?y ! W676Lإα"Ĕc??>;.Yj ";91U5v1>iRsɱgV5oص!2Lvf ֧bfH9ͪR`'['gȗ_ '@Q;I ڙ[:A4ޏ{nZXG\?rV-9ZR<_yy;#@ȖTI@h +18b{Dd^/lv^;^|,{P$0LGBlK9V bVi$9l"(hEAz5wƫ|TH)Yq>#l> *3fk}9Zg^o,M^K2gu}gu]Ju'2`x|vvuUm1Y壣QW^yW8~dy261Y\>mU%x&/7`PIԀu>M dwQ~9w9)@Tm!8.C!)"dl]Wriw.vp8T'1箨R.lRT!T!C>lڗ.iSJtn߼uqb/-pxe{a鵧kkϟ?9x}&";Rզ;9`8<<k^ܾT5_={wэk7ԍ.fOk[+B]gH`v RbiUYM dn&-3 mVu~g Z)*0*6L bΔ'{s1kjpp]wIedHUգA &sf/v A@&@SH0BݏV !>-O C6\utvFSYX?OL;D46Ob-OҮ/ܧ?Z u]s眵U~TD:O .TU5ykYE*"kIKٹ|4lggGrlZfuR{N%\26ucW k<4KmVcӂjK)MYD@Og' _ܽ敛$Bz{g{Znサl򛿚w/k~  )Bnns%Ħu* V[ЕjR -@̖Hb[ ٙbEw]Э]-'MdX2h P } c.$);vd)HIX#hs1QL{6,*lT`ȳ,ªb:K`p{ؕ"](;sE$m^]{/}0rώ_mwc+ ~㋩?RI1ޘ}k&]ƈiRK>sh ;;ÑEa7+o,r:)/NNno .bL.?AHHQ.sd`wSԶj"6^J))e386h޵1FvD5]ch^Dݕ'Syyٳ]c(Ȣ@اCw$(,q[ ȁ[9Kc[@NgcfИ SIiómIJ;!Vdtyv&*Y l^A ,P쏷E}d@9og>H+Rr.yjqDH"0339uqFE2Q;)(D MY'"jS۶mۦ;x~xrxx|8hlѥ "lz-;iVSJiٵp84J`[|lol㿾 ?ysmKۗOm |UT1뺮iuе)aOMt]gtVUd"(Cl1 "ʮ b^d) iE*)) Sܜ.α7VA5;q6~OU&)hʑՙȤlR2-ՃAM]ds!j& rNmYį6!TհWƱW"sSsʹ 8YSR&pΥҭ_\{^d:'0z󕯍FeG/|{OLt}}<͊cRI+ zYTIn1=|ǫk+k"KkP_jKo˕&GώaqRU1hb@EVU0 TN)qt:R b) ٤jlJb{/bw,㡪?Z-s/~@jdlYXlrO> h Y@-vwOڋ}RJggEJopf 꺞熔}@.=OOUԃxd+qG#\LYDڮM1M}>?{;&Nӷ?{WnVN)+yzO_Vo޾qI9u-YP bQTh4 P@8NUz\CSa"rbYoXf;/LJOLuS[oJ$BrP|aXĘtqU7`o` q\,Wrm$e),T0шÞ=kz-iͻ繈ѧj5d +%A]bLu]sQŜSŮRʋt4lml~#g?;=<|p[o|9O~<}V\;RUwzWv^mnvԹi[_}u\;h=*glzvr~2σ꺱 4g BEZѣﰘ(@+=I>KһmSƔd2)%HQe[fh퓵O'r0}ZlE[ {rZ7'Y@]‹ ~#ԧBPUUjYYh!9I!B;fQݻjl,zw26G iYt_3_!:UPr9ͻM9'"=B7WB^O}hk|몂 58Wc)xORy?Uu0h4UOߑz%$l R@2P!B}Ղhh{{q+ ;[;7үtW>{w߻|K_J|߾s|gȨI8S)u7yv`MۺU%v)OZH+,rbD()'{O?%)i3uE)>q9's)+cUE{:*"eM{'X:V^$CK J)!1i1tٶmVMmKDTpPu˥PJmKFIgαAt C$-"G՛^{&ںuβk׶7\yxxtt|z4vWVVLeImf{W70^*$Q8=??ܟ(hU9]핑K+(%(13o *UURRC`tB3$~>-( ɢǠlG YRւ* a< /F"鼪r]י"]]זs$ef&R!h캒3˹x~"TT,ǓMSri6gф9E U}6Fkֆ͈+N9W>OW4+7w?}灪 mWNgg4tt֭oǣob_?{g{onӇtZS7[~OOm&b "Gͣ_JaJj,ɅFLDd4)+v٧?,%g]zw4"DK.BYISLHab e7dQ.,yIjy"T TP>Ν>OX=H;v켋[M):c';3W]8Dv D5H6\d%A?>ݻʚ+fS7ݾuO蝻w?I\dR ][(nQQ|ڵ뗯م6R >,("}072bZYzvalb>۷;R.#])XRlE8d~de18GDʹSO2BuoLr-'k26QhQ :a5/"oX{$&jXYS7D|}O?ٕv^:w>&R&3++REЏ{UzV[/b]L)mgC:m.* @. Hx~6qRaދbJq"B9>3{ ShDhO t&ou6?#e1V@"[ h*jD\l6`PDr.cģac0l68p&dN`ϐ ,ZZ[[(`e/?"Z:f#f G}!ڇ3SS0l6E@BFl6Q 0Uwrpݝ]K >$I)'+6VVIU*j_;/_xm8~]^;ԗn]xɳ"kyiþtǟ>*Y3!bќ,[m.0cg2s /A!Ĕshvڂ%_+:,#9B b]ճT6s.RT -k R"CXi]WιdR w6bB3!R,۫jv.h V6Pel- !mN` "oċTs.LX53cLH{"r^ζnߺ<}N^v`T_ h;o~;>ů5nPJƞh_fVr9d,;7M]ccgGD<=?}qʆB@FSusO5,3؉ ' r @sR3Y\TMB0I61Akl6[RBe$bE$PZetdH>\d&^HR|6@ Vy.zKΦf3U9^RR^4*G4bkZҎlS3%3pԯUĀ -Y93#l/H(DNES&&b,sԶq$DcUum4 ޻l&ePJ."6͇yS΄%&4@w"نZUU?9~ٓlRJDbnjoK. ɇ4ԿWw6w~Q_G{}<o_ P"_ߺ;~흍wV+| ?h~Pm \J4fd4Tú3S!u]Kca@BnId ! qu49$PsXzOإSJ=s V2UbPR }##8c[E{$CϕSbl%&JD<s<%HUB@*,@t̀X#\JH ADnlj]7So}K{٣Gz;nrʹ0xg'U80S%r n{K@B*i|K@D! Ds)%Vu릀3 r[%3#EG+#pB-~4XnT2{D )]m86x~~n:;K䧭9VP1z )["`u ˚+3R#TB"C0>JΎ{)mX3Ę)"@j眲}]7%-UZ)Zrɐh0BN"!6P#7x<ƒTt!A;7^ݿݯwpĄ-M=gӳ޻e*+ͻͦ#g0Q<7$ؼGVvwvo^rwg"t)heSrQQ|ڶ2RZByK.`5u]̊Gb(PDtf.s [CL1HVoΔ0$023Hh##k"پZ$oJ,|(z/1[_DHH"j}&[t:wsnjBaU۰&s=R|>&;+}}#%B@(R`T^{ͯ >ZƵ7Gը d_o}V~[H._ph䇤-ίhQ֯F)y7CmRѳgǃU۵Rgs(K)E@!K"eUuy,3:HѢ`T샷.PyjPzڜSLQtܻMhfjv-vˌvFbMХw8$@zkw p`Иiuu5|2'|K)J]!UXi-yπ41E@)D-'`ST0E|8itrېPU{]D4Mz;fw ;9HiSnB5oےKlj9dQB$tmg7N<ҎյъgMbn&'?~4 }\f " q zЍ:'iLHTLV_&-ETyFR"vݛ: *Ջ؂}O#o3ߍBc-eEJ3h,;w6[uΠ{Eџs<ۧ+{NҲs9RrN+'[jk~=?!\ÛګURl~?x[[Ý#Fie`_(}oo29 o\qmgfl)'u Mdmko~ê.v]-ߝýw=9>sc].9~̈)'O|oQ ~Ԭ( ", L *@Ѭ 1"ZZ,SYzQ~~wLng|ιmdIf7^ d)L r}y HK C+ { _Ve^ѮRɩyHdq,ڪjf6| bp[_cb)@DBDJ;DB`zE@\ݺ/޽KW\bIX]darv6^ohEo%Ofٽ'VhmwָrL~VNo߼~c}eݦ%) &Oܼrs}u0ic}w'AkO&(UUYV)vX cɢZws1T~E3Udl[:1ûSU;:ɾmK.a*-21ȏSєs F6+HUC8u#٧?cLU̅gIbk "&Ec\UĪKۣ/mOl:uK#hs.HCm䪑_b|{<{7m( b]͋}џwn߸Xxo|[{?/]3䡝K?cɥASwōKwHUyYЙyHu 1k1\xR$n3"ӔBHgr!ϲzVЬѼ \f&hIR[@ ?0mdDDى v>1䜭.Esm\* JPVX[JDhF48. o)P<Z8j$ u]ZDZH.~;3xYynd@RI͖u= > إ+.L*\sZǒӧkv."hw77_jq`x7kw^[_]{uU3h4̐<>x!ol|6_t>FO_Rr73yO郜I E3Ů>4PsΌ{YB_ wLKLUZԮm(IV3䏁}zo=(M`.IdU|>sr6/uMS۵m;hh`*MؐRL&lVU oݕ,?$Gl]oeyw:?.]]O~qzeXrɤl3:^mSnmnonO?h S#77lw=ؚRDRN{/^\ݲp;j(b Ygz_4+T;+E9*kl-dI &eDd>!HI9I{1e.6Ubd皺FGn֭ nu@jGLźCŒeš@ZFgzPf9; ];z#Oa@Cu3!`ȥ !?7FvplCI웎eVpڄ* N3^zg/$$f6OrL@̮ijBL)Qb;B>ORPsh#kDVu0Q3{t}u}cuj"ITFǏ;;k&_H)?w2v1ܖ9S;}ʫZ7ׯ\bU/Ij|tVVWWGї~'U+{:79u]s}<$,]5l6 U *kҭ{OD4iS&qo&dN)5@sXRT1ŮkEKN-y*!x۬  Llr䜫),p)Jc_HLt8*f3B^@sJ>8f "ND1lQRNJHBPQ| ЧQ*~׮^ݻ?wG^\p㭷7V x:?Eãaaͣ I~cFѯI&y7^zﳣG[I>}՗ܼcJ[몞Χ&;F#َ5K;h@ jjR RU= sWqdt }nWO=kqmxt6MPdpNť3۱͠1F12豑K韕 "F#2$BrRIColeE Hi+/mZ۶#"bV*&).z)b9}SW.v>˩Q(8IEs̤ +++"Rާ 9̹d7^`OSIk+k;;&YK7\;r螨kƍU0W9Mf'O~'?{++| zHI?H{??xR O==z=BT͗3͟}𳊚9y;# lH@YZ%1lNDW)'Pҵ])yr"9GmۊQެ7⼫ @lmض:f?;g}SN\׍>몪jlI91^=sԶ 0͈BS:99>D> BƢ*T~8auAT*LPqK_M>=y~{}e}gsw[ߺG/|Ҹ;:ܞv<${cz|PBDdًgk7.߰W !Yؽm`_ ýGOӏ޽:o^^Zu]JY2OOn\YzI!*X(uOhecu㫬ak9D1VUe$5@(YbQECpp1!Fs˹ZUgmQ ;67U !gH\we9Д#Sb)%"$&,c)YүF{6 )`0f1poxTYw>KI)Ry{w`8*HH RS0s)ڷ_{ջSOOم߻ҍ͵ѫ/}l6_mŤl4۵+=)t6ٷ͗ndu:o;|~Ϻ{u;b%N[@sHuH@&9R꜋~L !8϶2-J숈"chL*"YJv0Yя^0T,~!N@3d0!Ad5llQ﬈*O9K. L9Ngr ft`P[wqU&G2y6*)uU˖ꖄ']hT=U!刀y+"*B̎i=5*0>$ر[*OPH+Ü uSw>8Ѹ7dv|>tg'kk+kfejhӽ=QpacgcïRَ?ޓuܼ0]s\Ul>]0˯7yꭦnΞnp8~}~mk tȥnc];}rU)P9̅HLއlfr۶Pu)&e[g0q_וA9bx%:md %+}RJ)g@]Y])l~"HJ>48cg!Kάr7pMU\աα: 4RP(Ri -@D"b$ywzk&үÓß+nk/׶6WE>D4/_ܝͺC"El 4?}_ Õ_uELZ=?{xh[okeҋRg}|ָA,j&]3%+BF{5sy]E̅D39%]KHcGs&)G<9GZCAL d /~X3$eM۱?j,]89k:.÷|/\%nĐUO?$]7l968Xe z^UFPom0,t aUK&Hi݀9+P퀀@2GXrl7$1.9m %|b UpΥy.eyWSFy:G 4SUU9KNpXϏfi]ڹ4l ZԳO~#}A~ӣU>:ԥ(7aGw^;o\GOʹ~'f>^_VWW;l^``jW3N"b\tDhhVfg9e3Zw)>fU\u2=4P*};7&f%cSڳdR =`& $Ts X7ߙPSJvMeŪr`Gݗ96~c%&b""yܿ[R_??;yw~'7voηsʕ+2Zt"8}ޅL<84CNOߟu`Uc/XGGwn_me]J%ptͷW;*SJѦy"̳lI@9*w; &l" [`Q]U>x5sF]W& $BrErylVߧU❫*s@*?jW + 㠯ARLd  d[R|>wȰր!iOB5Au%`rl<@AĨmbF;GI:pVۿ&dSNU;m'ر4z2f- l,SvDwxDsf~6 %>PDCѱ0攉RD0f ﭭMh&Sf#|67 /^hwnYznn Uܾ~v_>ٳ$Mϧc]~3Z@!ŤXr~/]y7n^WeZSJ)>uߺ;?x?3W|v,/)HHT>"X>/} * "9l"Z4!LiAYMCu1Eh{C8SUb*RRN{C ,Dq㪮I)v*Ť޻m'n|0lM9* )ŜsUU]!QD3S{}_g=??~͋/.w<{˿>zMS( h)<;Onmm|_~KLHYዓ޴|RJɬ=Koç<{1ظv񚔂)eĒ?T s.aђwhZJ%@H=E-EYESNOZ^gZ{{ mzfI(QRTU]=3@i 0 0)`TE2E }D~ݚk,ILFRF $C7Nܳ.@{tAbQ-J  徃_DI1E&h6 4rL 0q-@ D1{]ID!pRR(k;, D~S *Z1hU],C=d}޾`!JιhmF؅م+RJŇi]p|{3S3n?RGۻO^~{$Q*lom:xj3Ý2'ű1g,ZծN)&1T(QNEb`=:j筵af9 6 (Ni!AHM3+rRLԜȜ| ʬ s*V\?)Uё(1JON /q^Q?h.ŬF9+DgnXt5aPS"wHLgEMCcm C8Ņs.R"%% A)޼&[H!@F % z!2] !{_ו1,+t !:p8rw:Pˁd1ffӵ'88;5opZigN6?|r5%ULꋫw~uҵן?~9%fn:}B0$`}WON9haheYh7> qo>z#AR$4y yxgz{Z&FPd"& ;#M;)&@Ɇ}|a(mxfp a$1"&L-͈(Q޹nZK;P3@n&qF$%J@ J p l"H DIډ[K?Qz1Te6HUxMG8**4ē CШ$5<9 oN`bbOJj1$<KX׎|J+%R*<˔Jx2[;7SB&&x}lYRJյ#R n'{?}O_+/vvwO:9!W"w!D1RHG.hJI.=@9qDM47BR "F))SDp4#BʘHJaq !U{{{ѰS$_(QPBB6,Ra'$%*(b R)@r>hRJ_\~3xVJ<ƘT{zu}O_=}ESJFNC_?򧇗}-f9[I7>ϧO:#Q 8ZLIzD)bOS6T׵! NȵMs2_K1*):p8 pwQJY^kC1ؘG ʲ+)/i< 'M2)B" :y"4a$Ar0YcHu*w?]`3}@k!B!|.ys%v RM!QPD-1.B#QqXSn/ 9 !Qڰ5RJI)n}R>1>w*\XhSWUfT}3IlZe58 轷6(|ks/u^?lL:fnwZi)VjffիUL )EneXk,Wwh?|}Ҹ,oݻ'I _[͇Brp@wm:o-,,,꥖l)XG+- ABg}(u[V#FkC))8Y`7H,12ǟ]u !q%Ļv3^Mpd46 ""s&%zBRɆ&6양R|OQVQbLRʲY0}m2(EB6?V7V/ݼ7W\~op 1o>_X_]Kw-HQC7Wu%TRv!*xoc{G,W7W/ݼjuw~p 420Q}_ony>adxhĻ} R"b0/ ReVf?3JJ(n3׬ DC Ǜl)@cLGuU7!_em(ИFɇA+@gL ^@ ^Ԅ @@:55|>UkM.[U^F몮1V-?5UUy<B0fQN!ND A )=y=랜#gߥ u:ݲPVRq(N$URJCbHR {jR<˄̩ WRu h)VYvƬ}ٲVzeΒ& ,ˢ(R)J -ݚZ}OwoN:<}T+Rvk^yyāRZq>./u;[v[BËX>t,"`Ē3!Tȅo=%8xIp$VA'_ 3PhB%$"fܫΥF)C P\<9v&v$̎wwwo֔UBpVLYGΓT8e㽚 0A@6ȁ0aD4"͸6~WZv cʤƨw1qOco>^<;:zȋ CyT=Z,Ymny>[:u̬)Tk}{;vOM} );v_ɠRI),av?rxyI!} % 1D*RRū8·>$JR v"ꈗ2ɜ1INKeb䁏Ś$C%CZ!yeq4AL<T]9dλN1ho;ܹ,oecꝫ|ɓώN﷧@ 5J\o~}}k'#Aw@v[/{ 1&k Xd6xAbn俺‡`i~Q/+᳇Wn_x[~I=x#BMzL&&4΄GJ,!Q }G_$E^ y^eY"a4ĘZ\Q5 lg'0 ĊJ)IIT{x$TT =x(Y|bJV} [!c`w#6Bj-]Z4j4h n bF'󜇀 *G b(AclR`cRJV~|9.x6؃BM~)i%P" Va<9V1~:8)n+]vw悅.B 1cP[`R8^=ROϷq'?}ҶR[i6_o?wy{3to/.,VfJ ˱;xj~f6miut[Igvvwx*l"/eLO/_YǮV&#'+H!뤵fIb{dϨV J)\Hn!d=$٠b9K2qM. WBkB07+>0tTU׭ $Gυxsp4baCgU]#6&D.- n8։'O˪zֶ֥;KK sgi2XYyeߚO3O={xzz[ޯ?r«r< ǥD8Ǹj RF].Xc=Λokcj4.ǪYbago^oΙ eLjD%'q^)[kMoYJ5D(6f_me+&f@J(xC1DIN'X*s"1˭B4%v@ mX"!IG7;Q#[byn0ք_1,XEu!(@ n|6>Y$n(m„kX# G)E DnccsARDj9* $@)j4Na,%;KC,]=.VE;r>x8Qe 1.E3ܩB)ϲ!RL`~v~T_nyW#T%`zqO: 1?|{uwQm~ ?Gj8ѵ]ǏW )c=uݯ[J"!"x~ӹF}wZUM~Bi\3%p8`rY&I1hTUwf}cvwtθ?Y{S\[b9[׾][OUYi`R0i>~ܛ 5_Qol}xϛn(ʰey3O@" ٤G[dM}K.=:(DZ+cJ,">K .խRJ,<#xװǍf@4iwZ˩RIroR'@PZ[kx!ɥe9  ey|m,Zm-jI)GQJqJ*/ώqSo9y_}񫵕 gO7әxMϔQBjM!2,HH^ չD4u#@1x7)b^L Mq' Yk}ѐ0LZmn>KYW B|N|סB5Q&rޤW4$ Vj4La`EƻiOyžŔR9.C/_U[zQ#ˀ~Ҩi2ib[Ō a"f1g[k@9OnGmcM𾮽Ri`o&M԰R)1C% !x"V֚ RLfu]e)& mYf(d;OxbXDK ҄JF@h<.l353՝b''WO\!<+86d?.0՝o/:+QeV~1x6sGN> OՕRExr9?$*ueƶַRY1^VQ !ZnBJcLa2<(^(%0A A[˝r B\  @Nr iF"䙞퀢!d0SH OUWYkS ΅T23v1zh1#.)̲UUBBRlJivFzpܑ'l7٫gW\]\:uɳgXZ Y17=7?;~tڈ|=+Rg>?x~eZ0$FgYRd16nvgӶ9=i\o=uf/3CrV7D?k'5sԇ <K rsa#51F()]Hi!Fy)㑵s{~1TO;5Q#6b$F=QDBCd7bhjU `<#On^x,cR,+vj?ɟg8 0Zobؖ%*W݅DADb@@"A 9VޏF# )zk{;e6K6Qcc\VUB);hB0򙫍VJicꪮ:PnBtc8W9.V YZ w䴩D k2TZ {B~_U/|1GS)vlͬb >^ܨZ6\|ֹ~5^郯q(fi;Q{kYpȩo ,);rv_ȊN-ggΜ=W*$ Ȭ%JeURDDT"(Jsuv5NqiJ&N18D\LQ`$ǵaD>20%J\"KŤP1&R;֪,J>ˬZE%t}`LqoojCGjWv;N'_+ 6GG玝>y{￷0PdDM'k<ҭV2ҌwqY>|p{=՛7BGW9?CrIJDiGNp2FHDZWk~{/V_w.WR2{yK+b3cjR9Sj|:j> `Z+!"͔1cO`'cUWu(eRM)#uw!F^ y_^GE?J=y5? -"EJP(4N'~k!k5oF#g?Qycj)/C&!GlNOu@L$}п(h98>V:R(zc]pXUJ)r}~EX!D9I6jh?fIUZkqMZKmXkh<.b0,˪* $vObyPJ!DVNvMvflg:~/L 9p{/^*͟|wο`p݇wwt6ce惗Rn7m=~ȟ/~?.ۏoCGE^0[éS'C椐!x)/C(FŘdZRX].`3㗓”F1Ek1nBI5A N 4?R #kY'"e( x41u)jeVwTxՍ͓ O<>l->3n[iawlˤ~."lKA7twIr,A҅7]8sr˪sb{};|=DDĖ fٜR"d lgKXOdGQ|s_2ƄR"k5|xhCZƦJ[_F{&-rx\)4Q0U3]9EBB-ze<\#M:}W\G߯૑rqsþnŘєXvlmQ<  s?~[BhIML8 Y<{JJy+jby3DXM]UZDmZYy EcwsR1Uu :1[ D<9<5~!j[R`/%v;L` gWSxlt:"H-Ի[-DggW:*ߜ~Kro/_|bܚ,%Fƭ֋C'ُ4]?e]~z;G`92s'/{~Z.ڙ;]d:&kلigkLkBiiL V(#/ (r+HȥR`Ҋ)$z)QL1dz)HyEjBd4B& V)X%{w9fv<w JJOR;W?oL7~ؚˏ:.گS#bf#=T6P{DaTvgJ-:wMߏjKxbt1$>{ oQz\Os^;t~7="H)j`? dx74!D@bl||8k$nhklHQiŎ_^3!-Țm 63{B2CjJ,˸4F{nR[>/r D')`ռA/7A`ޠ;@rD%_kR~+n(fHR-ng?h,\]]u]YkGs,#BMAeM 2E b~\0"2v[(Z6"#n\TYνk(P2r!e5 SV5 vfV)ڤDU91I 4!xT* cHkJʘȹڨL yOg3Fg֫-X>ƣ޸yaOB8@pg//}7<TN՝gwWV\tJxzG}0?}˿ͪx=\7:<ݟ~}fnfT"Fjksg\t/EVOȋU^<ʦ[sgzڕcW7l{qvW+*%XrJB`. $( PR|k0O1r/&aī{61k=,e˪HژsD Χ,L<9wT„&*ͅ/"H 4UDq?]l⎢r7m/|4%Z ZOCBҪ,~7UϘ& ΠeZH4jV dzhL8QA=8&fh#uUUUY1)ۭVRJ)60%1&ڠ&Q>,E} 5ˬ-VJڥd @Oc 3t* X*FDchoXRSl|B" 1! !N>'YzȘw~L-z'L1)5RޣgΟzw,#ƻ[}΁d(MX+2%!E{VV=p [|8ڽSON|~=:׮ޠxRe'{E+ߔRA z fЛH#B>F5;Ѻk,$Rr2Td9? d8H,66ˬA)cιV H;N."(Ҡ>zЙ^l|p_ON{{V[;xvojȩvZ</1"'l;Sʓ_'_#񙰳3D<}ԹSgW9fygo_xX94;=x851zI 'TĂjB&Dl^s^y0Z*B8 `QJ(RIf gM"RJ!8lfs:A@񄜚Az xwy84fNm6,f7f?hE &:-.߿j%dv R(ff[Sl!q "8S(Q)5N!()xdČXNR@=s# br )BIᾌDsnB#q3G'lkh<ƭֲ=tf yO՘7>ꓯ\¡:<}]\6˴Q1Ľ`7NOmd{Wv:1x|h?h3*G߻|#ǖOY5F44b%C1RJ(!ñ<ًKX32Ya%+؄*X/.dΠb1NS*rA @:r 9n>%- BPe,dK־I+B(T9ric)ޚcbJD@X6U$A&*HP}$*!QzY|4lCh R%ր:K)ˊYnxʲn }YV֚<˭5*+Tbw̙"@t|WZ!9,((<=<#k"H 4Bd];61"H UҏTYu )A+͟1~۾z/띵ޡ$lX([>y|tO pן~#ӭ:VaX~8Bӛ>zhݪZ+w\PZV{ffZD?N&я1%Ć bd,Rhq iJ&6hPU14AQZ D]jHR''a4I!֦jUݮ]c0iEeU]c?̡~{9?|ѣGzԃ˧^>oϟ>_8xx5[;[-RZvGqx$BNQ;+UULG 6HN W+Pk;RI7{2L3z^=|' K'Zyڜ^Q)-%و ʲlr&c"R|@Krʇ`$. )q P4, sgbh<@)DLQ2c!*)2eUL(q]՜K(+z.Y0'-At/@DZH}%ܱ~ޏM6*!ƴS‚qR*9PV9VVWz}g-~Eȡ V+[ͅ`HJQ#w%f*FDQJꪊ)U)="8 uAY![Ro{Su;V6V߻˿|hw|p[~{[G9rp-.:vLO27=z1s>H%:YmҪ)7lDU]:vjqvka\7ܻ׫Qud|A HbO=(%R$R2fK0z`#I195 2P <>p6g(% <ߊKz( J9qSMfs =9J*H)ۭa8EnvH`}g$l۟E p*Zr/~SJ{7޸j쩥AdދקΟx-/WDJimk뷮9>֝ӿ'Df*eL9|8/nmaup~ι´J~Xlfeg2K%!Zq|CySCN!Q~9<;β"ȎM'FH1šsZV*D4vΟY<9ƻΝ:&["g}yO|zi3{~sUGmn7ČJw:3>2ӟk*-eRBJjmno]Tֿ7@hxɽ(Ο<Ϗ_UU\K!%O_=~zKgf07WH1yߤ b^yRJ(ծnC͋:$t:m1Vuj0W)$7'1&R$N@@cM5֜TA<ERU]kbNI#Lf'|I`BAEv'1nBv%*iğ$M2-Uk-hmB@ļ:}ڢ#AP 8ޠs 5}H*?QQ\I wgMUJr<(J%c-Fy JJDj3P5Y ĺv 4y&,O!DuHiR Hy^ŘH|֤D1DAbYF#?v_(NfjVv_`/}G -8'WٷWW?ZCj.Ŭu~ߞ J L aFp!D6ŘRMLBjW 1QRRY/vbc%O]͚ mV/>.zgy0$ڳZIN"F09`MMəjD!BQ7q, y)`g1!5;B7>RZ,^k!dLAO~yYcֹE(\Z!ByLxZ(j^Y$ P`ψjj*\twvvUU&@u4Zp_E&h,&501S/`>xfGm"ۢ;6Ӫ`?p¹,{]>//ݼ|UΜ<[o=|]l8?s6ӳWc@-:9XVM}^)535#|$!2cUJ%B+3lnwg3BxGp[_'s? BԵU6%VMǠJDEDBm4] NvP dMTh`? UDcy췕>^Iݎֺ벬__D@1}e l_b)P&r*p''@Ɖ-ڠT#b PH- 2P0ohysL󯪒E׮*gbJ,:EjCg"$৐q}5B)AUxŲT) "TeD0\!k &[Sh5"jl:5y4)1VJµ泭'?s݋՗|n>7Kӭi"kY{ԅrBv=ӒԸ=[']ޤ5/Xܹ gf,}KD' Z}n16}IDѰv,F?p%S#)ؤlV`/\2 nʃ'1~Ԏ=.:'Oэ'wvvַNy/_pvN텝ן )[PJq<7J6 A*$O!E+F "+ʧGϟ9~[oy`@Ӗ_NUW^=vڥ[ܺKӳN-ҟ}\-΋W/; {u;iCuowƽilሂkW+o'G Wk;TUH-‰fUE 1ַg[R*.7yO/7o]r`4X_^_j??<՛궺< ;[igc;G [Jln^c#JKъǺkuzlJE1NjVj?ֽճo޸ww?X:`UV})/B}p $vO,tؙڴg_WmZ({5 tv⁲,4N?w1E@iuO^<çGSot Xe^JT.\6Q d*@sF7͈b\9N6/(,j\Χ''V.`!Q`b35Xcu) AJ#TAYVJB+B"SɉX5|L$*OCJ$J"Ҩ}#7b`'6ݍ1E|{Rlgg86s5mC ' yРe )N+/@6 O>k@3[YcLf~a9CHq];'p"Z; R1A࢏d Ak3 (%c5{WJB !h}]ehFpW;+2*.o=j,G.Dvfƞ?snobG+I ^nz93}w__ʓSTJ1(1=O>v {`KԸ{N=wN:17=]#jY-fPVeF`o؛޸q|Jǘ+WO_>}GwG.f..VlPa}kġ8w\pZ&L ._1?y;v~ι/|-vѼ-ڗ-" E5rKǖϞ8{oU9quY)`[K3K,N)ٖi \BYV1E A' Q(P5%@zp! Oc4QBT< *ƥJύ xᱻ,ˀ f魊#y7Dpr9AȲSE@4 '}*DklL̘$ ucH*[X()l!SLLu1:RAISW1>b]W4I-B1Bg!h|4F;O $ !wJ*T" nyC!} I$rCμ}/|q^gC:0cwݟ|?m))@"l=~x⅟'DSYW\{y|d;o !Gj|qo{/6fQ*ChT}᱃Ǻ. u}ڝy~{m}o3o} Sݩ"/<,wq\}h\U;kV+!Pkê&ǚCٍm3g;>VDZ942Q=,R*!ۦ{x>ʣKU,epU#nϾ|ܙjO >xrdI*`4uCˇe?ry5v0zpΣ;V^;vd(UyDByW`Biu=X=CD^!c2i6z8peUif>!rΌ:Gˑ"M nd %*"tITQ8Af 3Ip8!Z9F[VVyj8:s! TDIF! AGc 4@>G$')P{Rs,[Ea,Zc],n%sIHg" Mؼ2b_1`t<5UUҌm=(Pp%,*HBJV5KV!`w#ߍb5gS_.ݺ47=n" fYhwQ7aXm<|/-BJ"Ë8w~L\q톃#J+w6ao>NuT1E)ֻ6֯_~}嵍/-8|~/&ޛͱ; Ń`/;H)pRA< L1jSL c Aj)ڎ( H2"B B 11P &>R'/f`Mb WIM̾-8?=x"l n 'G)P$ta`Հ'.e/P UL`6S`&DdцU.Ć]UAk"V`1SH c 8.8$ D6H%*1mTy^}h Jg޾)vv)#cxh!x΍/LF >h89Q)%%SୱhbRR[Wa' Z!9'Jؔj;r̃meј1`moG}thwxxPp;kKۭw6h7:v뗍1^ן[}!0ɑJ3[IvO8i<ѕǗz7+roW5_`ms'^W7X_XY<c Sӭ*ZN'wcǁJ3}hk,I"2Ȥa( TgEQ0;nOs IHyg(Z{kSOF$PUje%Wnܿqҩs%`C&h7]mIx\ٺ. _/"J9kT*x^_{9sOtC$EH)Uj9/'0c)AͺIv0'/B7 Y(y Ģ771k2SO͇?CĪfV+B&Za (@`Ks%J@)P @]2A41~&$3@j&Sdn{' 1@W>impacŖMt<P6C#BĝCaȰf## D u%P00FSa9VcujpZuG.LMFXWO6Ï?ͱDq/~kO7yz!ĭƦ_?{3_Mh/> %bo-{?hƢ1b5hig[[K`Abu]olo<}]_\bwk]>v؛8}̡CS3vn׶Ug;{׭2Yz~sj7?3ZBJHޚ2vf({;)Vmb|p}rU]\+pow/o~~C)%H)Ykgi];ӜP)cDD'Vl! <@D%oQ&4P,(5zE'|dY&ּeRq~Q$J1k %B^iwE_v<@Ӿ55 55"H<\ҨMpl9q ~0U*_9 j-,SRzTͥeYJTY gq' ʓS (XT`EB-A8@`Y1M.=ALI5>|Ćbܗq]/(*R0w)% xlٿE^uc`K!PZJpJ<},[;/ dvQ"(R" ,B bݿx/n^w:=vd6c@I߳;[nQGO x'ϟ7l>:}S"*C7{o-3عqhZ.+Rۣ]w~5H1;5_e4r7fg/>tpnjP>ybp٫gWomot1;(U GC6:">xqVj<˥Z6UUqF;nz$$`4x_|jܩVb ?.fӟ̿(p_]]T?{/GBWK("ٱfNڭn 7776w6WWֶ֜w1 ?<"ۛ++ܻvڭ>wޭ_1̚Rw7OX>xzGqpt:x3Q=ڧ]ϳCu|鵊Q?JŹ[oMWJAgϜ4ݏ'J 1~٥[=(%P#PZ1mfڌŸ,C)q5\!^)i %JF12:BAm(QRJk9 ivJ;)4@ V[0JY"b$CmJ%yQg,"fl2jXrI 8☍w!2ϳ˲&NuD)Ō q)<1`|x(L888riOq A%GZ9*%6)T;N1VJ3>Jg[ D4yFhTׄnU1ƲqYe<\UyW ژ +URjFp;׀B;L+Z몪>!p!DceFǗN()<˿-3oh ./{xzx0xrjԮ~g_}Z# 1mz7翓t}kڍՎS R &#GIc vR1:VOv*Wlzۗ{ӳS33,qkh V7ϾrգO>[9[% k_G_秨{g/Xm%dⅷg7qQ i۱˗/?2;q b"Jf6ER 6|Ne)JzԀoZJU]!E],BJ#7P;GDMMIBHA) ƘI3)})&u'"Snf(ԁT SL1,qDҚ֮&dZ׵g])0WFi!P8nPZVUR AJ딚 9p fR)e_.ȹa 683@JS>hcʪ "@xDMŠQb_"E@\dK]^u Qb*׿!`ۍ1TUdOXw wb|&xk|+h4 R:Q 41BԠ9QI^NxE^4nJ0E!sZIxSU5ORH!W 0Q 1cBf9FkyS.Sޫ&^ !bYVe1&cP>cSƤT2" /.=lٍ7TؓOj9tq\]ӽSN w?s~nwvoݿ"ucb rًsS"6ݾr@Dic.;ӭd<γږO/RJ*OŹ3LeV|zr3yߓRmzSӽvn]dEf3)Vhޗ$V<ȅcs.˺dQpw0A)|njnqnqafmR{8hEU=_rȩO_۰)zËH#Q=u(ik8 W];IħVznf:~Ń3|%BSu )(wo?]'=I/\Pe (bJᐵ4Z+ R{Bo[P!D!^f@ӟ( C@h+j@;愇BYnyGDBDn)))Z0Ɛ֒?1F) $J)}p HdUe9  \MB$cs J%0'AE&@+Q& GuE @D|.HѠᨀJIAJ*Ibvv60B@-bUG.ÜuT' J D"Y5cШQ/Ġ4RYV1&~@mU]ל*("Fb!v̓b]DL&*!$of1( ` `g pxZժ $`sN$ $d`1qF@xz*\EDeUT_zށ&̋r%쀕B?tٷI7@)n_vm./ +.U6Ѻ?Ԯ~_|٧ngW}PwiaM)mmh%q;sL+ob`VRݿp*̯W7WEEhu#m·2+x8Ֆ\p)&}9?wh0lle vs.,/.[c DZJΛormvaCeU_gl~qKxP YN/?lvlk6O}{̟)j$˷O_[Ud . GØsOD|s7ػq;çJkÑR:F/PJ1KJck-#"o"*˱RJkS`Q`\߳eIqzzNn00)%\}N@CcB(`%J)A+SUU% xJJ$}}@cY]W)mT Dť Sk +*(6gyRn@xE !cTR,9}(B`PՕncu#G^@.?G++zJ$ /x鋫BI9.n.R.\޿sK'Te9v^1&0h!1W" EhBH%Ɋ&9%BJ!F)@)Rk%d(Ե#Jd3}6&`!%4 (ƐBBHdw2S̳<c`)T{bRZƷCR2y LMU-4!e nCjJ;5h_ 1Vw-^o!ǓmYv扭WVOHD@ꚰ)ڌfьmAq@N'i]44P(TVf"d|Ok\{9[:3:dx`~K|ﳔ(Go~?79D`"K.CP LL TvoǨ J"0i6꿎ld#?PFVWfV%3tKJLJ+Z;ODuU Kgy]EuBF`c >0sQX 1hmu9%.Jb{mo(S'wF5tCU e;w_w2|~^>;(t7mEru6 /o|۲(1Jip^_]Z͔eF磗7隧OG"2Q +mX616҂Q1F)zʉV. }TJJB,K*(^Ƙe^2'4Ƥ%9ZLq}V%"2LIJ30h4c #~(p!a2Ps䠀Y&X˧g4p.D>\s+cLJɹ:﫲{Ox4A #D ZAeH([b&Bc9/6 p2'F`f 3!(c{m"_2á Ә3):߅s2I{(;@60mL)45VB͒J#0㥕F뼵XRfuu#1rƘrUUUb2+)%@A]^'/OE+mR![m ".wݟlo~9<9*D?mXv?zO?W~ŕ`t'ßg[[V̼2 ֪q~csm{T.RNn_shәv4y\8}*A5ÅxI"w6W7WVqתrqhFKrKͫ_{?x⹓Nm\\\YZY/.ha#4 vx{t2ݨHs$;gN9ΐML^j[kc1tu}E@T-"'Ϟpc@q:S,VKWo_ۛno9ˎfI|wg/_x+Y3PY罿y'_rލʛ#mdʈ 0Lc6([묳e)zBLJ+eK L)^sΙ+ܠ~ZĤK%hֺJyE#21qcp ,F r Ě'եՏ'?ϾV^Z,}²#L觗/^>v߿Gq>F/]sR)VmjaDqDt֭''O%wnw^p,%UTkhkqT2ݶ,Teu/ c3޹9`{ҟOe"W`RFQ11;-g]Yn ]N';/n>qK{x'߹2aG4,|oGWo_ ?{rgPg(7v z7v: BTڤ%uwl:S?C`JjA☁"Gh  P!ȉSY|k$(Ԡj/r&`IReYZg+d^(ƀE50HD>9gQrJIld gFQ셳f&+# !N3Ea x(9F)wONRH!S( V?/}to?qƤSZc3i3 6W7_ Wn]x\{JWmJbV9{Ϸg3̔wv>weX8)*LK3g75蟽ýnցg,,~P)֗6/E5R_ǁ҃j^U+("Sޙmu0\ FR-o]]Z=wlQbFqlJp/YG843c6}j:Yk!JeUhQ)ppֈgS"N1%?4Ǥ<"@u]s. '忄\fYQO-Pڲum9\J66r)!LӮ몪r:k]a +zmEP<6kPП 4j }DDƂhIXp\\;fwzUtUW)Ŕsc5]bttaa!OCbbV';듈ե#DQ2A44Z@pXB\SEvGDU]`uFk1 G?FRR.B*f6[XXj4(f_". w]kab"6Z;rH1 j>fIަL`PNZk;`c r,b 1FɌ 1 @Yƚ?X|sJLtx^$J|Z)e]&{/_9{`09oϞ?៬.?pr7_|յr}P #ᛗǩL3+ׯ׫Ձi:sq'qI`~ßqr?_ڒ )>ؿ{s?x|#eMVw.tLixB;Oookuӽ'O(2孧7WV7VZ_쬌Ve Fj8.9(ݿ-9b/޾?ٿp™gpZʘ{}qkw&X^q WLx9y Yۻ۟}9ڡZk=yoX[nݻ̵R ^Z=UQEogvs/}_Wbo?OZrlwRBy'Njǹu]_{SgUXlgey % gOA9D7jҳRjC)_o>7UU:}aRڮm}+O0|^ [K'VE-|>S)FT%1QLh4Tm3K1Ճ"dbU]ZcJe.<bQbJ)(w ,w#BYH,켧 BHJD[/ O,K@%rJ?$૶5U RN6 1BCA ٚjNb"0 ~ޝ/1Ŝrι(Rzaa,| @L&trpxusN1EAB@suv+wKM!0!2Y7S&N*M5(I9ڢ;2{P@ -Zz1Mt![˔V93 ]h䜻1LR(t&yJ9眘XUU5.9S 1me3vfu k=J@l*S2F#*Ѩ(sN-uhRd`?ZsLQ^ӠşEduhcw+^0 u`/?7/p~+ro\z}4s--`0ȘvtL)ɫc 7)eČEчs_x~ۇOJty&GAOəWN-m.8kG/|ikm똧?4]sƕn?]Z^[/D5_zٮܹMNni Z݃|۝_c;a#ya?ꙟϑr=Τ0lmᄒ`9+\U|J)[XF̖9ι*rlb֖ebh&)#1mDyB{ƺD}O,'y2+ CZ1 3e6JwkmQXI/ 'osV!zQ{yڶr_׷)^`#,Au ' ,t]e ɜ\!83M^gpkbk@+UWu]sZD19[W3~̒˪Fe_.ߗwX~ D0`%s̙sQ3sgF++9!Sa尴sҋWd(䜔RU] }3bbSNZy Brfڪ冟Axp2D)H"[WԃAYUbOQFR,DgJERMXQ"<=2:igJp$qHD/uyk'O}7A)}1Et3[Ղ;lP)…3%_ :ݺw?@G[ul 9w쑕{'_| A;{Vƣqqߙ4Kఛm)GR1BDEYu( ɓuF9rↀ7w?zڙSgvs 5:up?BϞ8N|M%T()&tx3/꺌ۮ6S[pEwo|_\['/4`'۽ 2%rm>xKQJ9Wt%"U!S*B7cx)INjTiNn fRXViE*yVZc:$j 2c9oٕ?r s:r` rv+#!& g AG!f1> mJ"6nQ.mt9CH5 cƐb[,+yaHk*B̐Dj4 D{Js=w \aA!aJuxq]׵]GP'ۇ21gmP)3F( WF܀OU (uVieF)!kՈc{K_T bP~ Rěg$yP O__ן潛C9d'Idbܙgi7\FĖK>GѨ5*ȳ49u+_>/ݽGOf 48Uq&H1ƻJfB}ebDivB29`@^lOj?s~7޺{[2d͓m:j5VLu٭<[߫ =Eye];SD8q// 1߿Qg潛}֫g. A FD\}L)c<%X[8 LEQpw]`mWwl9!w]J&ƀ(/^h?t_1[+}g(T%z]IP4wCӶbPHRZ眴i71FkE]2uEYJiU̚RMӈ4ڶ JaY="t6(J)ѹ1s&rn) EJk1*s !2P??Z9'^pk|7>H,ys6S J[ʸ;{ѶK{(U_}OF[V_\v{Nlk7/JRΙrJ!sG}?ܽ{$º )t9 ZDbX* WՎsN}FLzɓ'Oo_^\~wC1VZ՛o߽q/F o~'\*Ao[+D$#,w;ףOzӅ4F)@`k6Γ8Ɣb f!@J-/+frJG6)EmAF^tJ9ƄȈ!G_R !z0@䵵3gdƚif9;ƣ/^4ԩ0 - Ơp%b,jQfI<_-ACjA SX^+&?k(Á,xJ3P=0ZJJn ƚŲ*H6`FuN3  MʲDLr>tr$:9%J6dX[VCڧf&`,˪,K`XWU5+{yկo|Wsi3хi|pxN*_zܞ6ӹ= <?w90>oo~.nP%1V1ƜrfZ\=y⟔Ӄ'}@%z)=۞tmy8+fL'{;|5N},?ejږ2Qa:,(f䘢Fs~1|<ƣɶx7}7o/♋|L)%G9捛?5y6+Ash\ud_ U(E;|Wo_m3.,01QL1kf.S#`[Xu,ryYXkD/-k3x}R6Cb ʙYaXBUEYs0R +Bֹ2-|0.̙16ܺ\5( !AIDP֠D F|QT KUO1*y:k1b`le.cuxcuKa }q|;uYUşN9ca2'$\`Fq@4JV(BȐ,Z (79/z``"6V;늲_R3BPJmbLBAp։Lke1#QbF6z<!:kb#bIu(ˢ4-0K 9rVJ) >${g2F 9 } %3hQZ `o=9mF  Fryc$1I#GbwШ+'Rrs!4~v}Gw8Kg6o8݇wy9>!N-R>-BL1x?yX3D\[Y,֨eRNb1N;׎t32Go as CH LDJQ9o<|_Zk@NOq2qڏ~S['wvY@'.|׿T}g/;Y-jmN"˔QaLYg, WNZ+"r¢t3q?'iDAHvh1fJd5(D|TӴ2wꭔJ1Z)!AIeQ*DmXbȟf}Ü;"I,Zgw e"^9(@|GPnRY}s˪a8rz`0(˪(Jf!͚YJ)sEQJ-4 3/,`:!BӴ1BQa66M_]D HHJ&P gAPKpt ` ڀ ԊC7w~*I~Gg?\$!,sӏv0=xqURr2(z< a )1sλ/vw+ G+Чf/r2s5^ܾf)%nƚ[ʧUJz\Zə&Mׄ|U^콸~G_}t7y'^v`)HeRRRRH1bcJ$\YTB뺪Lw+21X1"g!PJ. @,9%1kIb1S)B8ڪ*Qз sMUO0P J>B9?;P⑈;P -=%Q2Tg |@{<(~˯p.xo&@DĔsƎ%:0@̚vusi6(kT׶{1eC7$],A݋/jNל! leC@iТ2hF#qQqw?e!Ukc1ЅeIж<m~ saJuuՃJ֖Տoww8kgFAi>{>ՓW+eYhը뺔⣽\;!{O5܉ M<}XT"Ly`v8dm˲8:R_HR~ 1إ흝F㍍=iPamwo{91s/,(BJ}o~$-6!w_u /ԉSrgʳf&k">~W}'fXK?hMJ! oS!oM)ʵ:'7qՊ3Q1;g3es9mS9DEFye6֠BcŖQUu]A_R9C}TS\5'Zg>w зlJ$)bELȁwhЇ?Qiͱ@p8E>hSʓUfͦ"L1V4+sabd:Ns"'\1ʹLL9kceYFT y'9$F`DhdwL{pU $q0rJAk\s ҙʲLJ1F5F(לR,˲OΙ rnfC1Sʩp.C0ڸE$@`5S0v]Lؘ"01#[fJDTS$tJiQacogZgRzyl}Gj|J)dI($uYEkl۵__rvogίVҢ`Oz.u3No~Z,T ?>xx7/y5ru_^՛ZJ Dlav?r~7)+sXqo>y,1#jX+_>L)5f_}ye^4)\= Z6Ow=}sXA;,n<> NsY p=}K/}IRGq+gçuƥӗEW~&ZPDkRO5q&HbaDW,Smh%U>+Z;ƈ &"clsҁd҂3Q"93hQQC1BeJ!D=CO_ }D曐>pKzeӜjx!'Bh3he1 1e$ FddHR`&tr#",w6*brziih8*lss:eYV FEx_u]u7F1ɤ0dJ1%}v8'[#Na Ju/ÑYH#*#U<D)RM'H5 gׂPvѤzc\eQw]AZ1g"aS&m 3 !W"@Sh2 1hUE1 QLdԮ_ՂRJ!ĔҢ>rh% Z= VFbPH9+ōT;?8H5W׵F^# :5lmVEuɃn]ys߄iZVG2lUZZ)45c?w4ͥ-m?2~ucEiG{.֪"9g;m|?ViL)c *Uep}e5H!Qa =yLgi3ߍŪ% -u{ύfʧ6Ot%ɕ4!qEDXٴͭ>W;8t`u!+9KeJ*3QŝtF+h#^LCa2@28R)Ek7^k##mlPQ"b]eɂT+`+f#SDLL9eZ5[b>A2֡>QUQkԲ(5e*aNtH C:OK!&u]9 J+%ĉɤi'O;g~ 6Z_ls +fY*O@4JO^|8}xx% o ʠ IʐBIFDFWpdUqd{*󡐼_C5ͮQ#ffclQ8:(Цim꺮j2ĘRs-ABz9S^dY:SD)kmd,(+VeYe%Kkshb"mD6Pq XVT urq@23kιhe{l{o.A5HayW2"8"_~`cu>(8O97Qvi{xK^}79;~xrtL$9FJ.vqDw޽_ <71xn\/o[qgG|y'ϟL7*FJ\E\sI2Z }wQqę,BH=xaY8`$tzUZ>{<͜ڮΦ= _RJ~u+߆[/UYˈ\&ʈJ!J/|Є,*ղtJ[AzXZ)`ɆDfL`b*iZYrʠɈU>,nDEϣb`cEZ+"bm֦Wj# 1֦6m6BȜd)̟~PfPf's6A`B$ȁCQ@L@?˯s!w97`S EYyRUU9W~p8df)0,˲*Զm 3-0"h4ɔAR &}sgݼ-`K`da"EF#pi0OA1BŖy],KhF)]J^.Զ`"h4$kTƘeA˲4WN yЙHm;$YPe\ۛʪ,|$D**k B$9猵J)SjA/(1VX"SVs症+ XrH!lFB =,/-olm<}dhAkQDT8 a뵷Ξ<{=t/j,W΀n>|׎)Wmo6) nyh1'=P1= Hv{勗##=.U*\fqkk똻=?l) ]hs}靇wWߺ+_˺N?V#ŻXL@(PS=  E+Des`e#B[:AR^)ĻE /șujqILрESpb[ #ɦH9@:XDm.s& 1 WHp fbfNS Q);@`0+JX>K>kw!`a 1 '0kgv֏Vs?xhoV1C!d1s#lz֍q9=:*Fw{tpcsCǩ?} ̬~AǡP]J!D|? Bk̓!v2)㨶4]sPų"Ibu+ׯSZWK^:H{ۓmgωߢ-?y?u^R$E,Y}'C>૫_6_>/!b5"QHz#c!2ɬD9lĸgJd2!jU]q3(LBg\XaW%$(F~eaK99gwuҍUurʲh,k֥6#em`8"`QPkbRҗGʜ3 }6SoCvƻ+0Xd" Z+ KZYU UJ|YVJO!}Ų(2eLҖƘRRؠhC(ʒa>">߹*CEY5WE9Ji@K1!;.qrbχA6XmI\䀀 ry@cMiv]YJrJh/\\R*5{Vl@)SJ!3JƔjsigqH'e)IOY[h9E`QͬikR(Jbi5k)К~ɱ^})e,e)1VF,0!WNRww8=<{h8ʐgR69窨=q6 paثtc,fw^~cag񲗈?޽ѮsVZtcus`r 1i'{G[1!j{(l&+WĐ gk+J\~8^2_!OͯqڐmPWgZ,WN˼П@ȌTJ1Q ϟ>slZv;_\b`k$DrJf1p D=Vj-aBĔjErmnSHZ*,\ j"dʤ4J?1BI12*F xYiewJ9űD93d"I# ,r5N)Kہ*fNBq$W"=3;dOvPXTpӁݳdʼnxBUi`h)Ŷmr^p2@f28ks[ƪd@]۶Jx07m3;)Dd`>LfVebD4ꪜNf>TJ+E1fYe 2cPV9AB\T !0R ZbhGFtA֚#"7mN)yJA][뺮$T4ALGSJ g@i#;cLU(n0x|,H(]׵LPUQ) }竲޺2hBIq&ȠA(YQSZ2EMEm}FyK'^FPx7_^{?~Ψ)2fES["#WνʹAJzo*lO/77ms'.*Phydƀ[ $@1¾}ݗ޸xM oڮ%"V>">\s>;x+}#[%DmJ*ђN5)gb5*eΔ8lv2ɈZI/ [҂/(@P$\y&g\fڿC!&D k o"2gY^[ n-]1HBYΤtLH3 D!qyŁ;ˏ94s39RQ1~E "r6q\{kSi% (2 pi5F.64NŒ1F< 1<}d}mmiiifJ#R @`ʲ)t6hv \k W,,-,WsL b( Pީh@%E^< r4A.-s6X bcLL!dFp(6(YuYiSJՠ@{x+08BLj`Pɫ4fnb]C4ZSrR*e$"t^FڮߓHDs (mQcp>|+_=x@1FVÓdgoGAϏh~a5:~pzx4io"D{/UݓP:qr4}"Aښfd*ʠ_Ǻb kc 笱Rˇ`) lqiagDŽWe2M9H\D*}ulOd\F eWޛbvQI)cJӇ\/>yorU!RXǬ%gF@ V^<huPj`KKL CȔSJJ{U313.gJ)7d{48W~DT[V6$B2֠{- ZK|.@#U d]4E`Y/eMRz8 6ƴm# D4/'"2F//E}a!tm+똹m4R,+OD:5 1<fJilǕe΄t#HȘ!k2rX&啳XP$,d EԧNrY`4d;Z3*fʲ(CN1sJd1)'Qkm1m33윋!LSN)9IƘuh\zq0) uҒ}UZils)E>)&!@{Yd"c̠PI:RJbɴF,/zz㓯>?~WXݐ}2'&kpE.] wo>(\zՅ,8Bsz Lmh-e94&铧ִ އ,Ұsv]wހj1gKG+HѪڶ+?>MVVMfZSb"yimކ{]|MuuG]xݯҖ:S3gNX;w\Jy2%w~olWܼr n.kdc!J'Jۡ3\QKZQn`Y˳JbCO\[YT))'hRw;B &` LY!FN{cIɔV1%clQBДx,HC9'`u4hU$,]d h#2-:%Nt)dNRrJ J1~LX/9޲j}1EI3mwv¯>ΥN=y{3G[n}ubTWh~>}KzO흝%*9!mUUE]ƔBj5a)8WSVeȺ/ŔQ$o/'6޹'X@ V2k@g[k[5XJsoRrX?1̑6Z]ZN? k:߱j!Zs۹y杇w-'xĥ[ 8a9z!-9 %dSΔ2C)+%+ݲRJB!xc ڶwmVh 3hĺ>(˨<c|R,+dFbֶmB^ث1cڸ‰3{<",>_ӤSNc7ʁbSJ)uȠ"#2x&"wsesyዿǿzY[^TY2sN _/_uO>^쿸嵥a=TR5b>Ϲ͍X1ֈhfa2Ǚ<?XXtŠXh W3>@GQaLik-eձ2aq9tEU/Vư 1g95][;H[/:z~gj 1LgOdi\a||kTG?9~⻷>?Q(珯ܸo<\xwksNkv^di ),{Mm% N+Ym2%jLHAu ѳٔJXҨY[8׿7oم{'g ċhDB//.#bL:ek-c6VO)\RΙfiϐڤuy8{۴q.ͫ^9嘕ҙ2WwNl8qR)>|_͕o?rg97)%f?nfKo11ZCL^ V iKL1t]GL+QV(o͔z?pLBrR6bD<ϯfJ#&l@$,#(2C &vʨ4aAʖ O({FiRʉP\Dcz(L!+ּ2S@nPB{26>2= ^j`uY9 mB1%N`B1*L'Gc"N7F/G6EQQ盪Q)|׉!KRf;B`V1)L,md#SB'Z"@E&Sy4\x'OX?7WWV)Y3ĉ>xt_c?ff@ʩ BrfBTZS?;/laflkBkm<̶w_>qHkQ CI`RJí>*_P RN/_{|"[]\}˯^cȕsV[TGϬ[[_[ Z)cmMJ)XUETوRXE1C4qye5!mAZ@l1M岬RlFLUUq 02 P=R IE!%y|PXD+Eb623lzDA;C2$27s&|^d,*yLWr7dmʇH޽mAW^g P3PdrXUQwML&KK9}0i=39Wc/^u]RsV1N&M3-ֺkkd2M)&RGt@(?5(Q5^aGHt9ޯ1]'):_l:.H 9kM) BD)cc6F:Dk`ND<. I`rT%6M)B`"eY+$o@bSNmJ3+D"Z# VB.szP䔼B08[O?o>Onl™ UQYk9g'IpịA=o]?|i] 6G;|D녢pGwZ7]sdEY[EQSs>pf!8faz)6Z-R׃ vv^dHzX1%P+-K'iѓG[[F{/n?=Eu )H9g2A]co%x1*S 1Fu vmtz匘f֢Yh{X˘HV֚mkK8XNA9K0he23D9Ӊ+׮~㥍Ս'_:SNGH`a_+IQιt6E5\"( O1f`oV.x{{Ęb\U95@)3u///Ҽp0&ò,z0̈́-2B%ŠkPb.k#Z|ϑL23h<$@Rd.oVV5kds㺮٬R"ۦdA!+V9@UUZdM$?/""C><<%h:L1B2Zu4ĜTNJ"3X9LIB:*4 cVFF2'AF#qX&EY8rQkD7zx3lp~h4kg.\:~ba0GեV }u/cww6]j b/^,ԋ2peoKohxuv;`*h8gNS?˥&Zi%6b(3NDse;Wwo?X 'd%H)(ItfL*qq>w3.ߥ2s5b`beHʔ'>}xލ[n|ie慔!(@L(<w1 :gT&Շt0V!geCL:k)bXk]VU6\+$;Ph~:e&kmQ:Ds )O( #gǔHsؿ\8$@6 4J!Y,IJ @)%Brkp㏈ As d`Oi>`kT-Z*k1miՠf4Mι,KcѺڶVƚiDs-e, 7wk;fNgeYMu-hfaYVeYJD&NQ >@>|in0hx~gE6ߘ'GL':o2 {{1Ʋ,+{WDȉڮSeYSV5Zz>4d/R A˪ >uD`]sJ1EPU1:租{]()MS) V`)em}Y1(5HwFP.D19ʔoδ_E}٭^/<4^A2 !ѢhOŧ8^|+>~v˪ 4Q:x?zb d>XRJeFkm۷H?|`f|4gL1^OK( _`!}/|M6 =8C"o**WוGU˗.8]51ٶ9 *Xl$NfÛox:jO 1&RJRsRc23Hp#39"m pD`}'XҕL"ۇZa{b̜kRQ kI9R*2p: MէweDVJmS eUq۵E2F r"+ 9eI6h W~% 3e繣F9Y3AFT$T$#s99t} '$sCҬ5j ƁS}P @׵ bZ]]aBY ՔRQeZYY!n7V7& 3ww0EYe92媬=:[U|j.2жt"Xjm̠gl<圗/XtYPO%1% vΈm) 8#a@@˺L^˔9BUUpiZkMYTB9,mۥLNїE bXR=l8 S_TRF@amk)Rti(cL rFK92,VJtքpP8 B8QcU FʋE^lPf;L,KW8IUBȄ?3~~듯[k[?|/yP& 9Щu=> t6y_>hSk?}O_zpT>憠(FCJICOߝdʳ٬:5)GXr/RJGI*̻2k۶+A9wo#W_UY6Q5i8~pt/ bl( N<aݹյ=|PYoNtQ=j?*!眊$ƮkeBHzke^i:4F!V]狢󹳬RD+,J`8ť}islJDYU$TUu60&fXeQksJ9'q$! ݧ'wZ#R/xedП)UV u)a٠2EG>"A =Č_fLʢgYt$ˣ?)ZhK@}J ׋ (l׋w`0A۴MTU5NuEYTUR0&mۻu=G jKjs TtX8WXrkR#@e0sZ66E_LdB!&NVXVpLEP`&}V<*bTB(RJmVUuޢZc.e v'"B&C!b  gmFpHD.J|; &UV +RE?wF&F9sFE1LBLc`ѱB` k=}t#VAY Q&G#Fp|KkO=nݹwMOlxlzƕ\YljQ,[m an%&gw]C>Brwä1z!mۡh]?cgO66677hyyyk}SV/t8u|}vm]֢K9|ۏ{t/uMrT CY>9S@ %HkN)H 3qIP"TZKZ%Yl !jB!#AֺpsӶdJeQ~V]ӅXs՚Z<1 fsF R=V]DQ)$VsHkrXkW)̌11FO#&2ak CF CqkJ-Jj\YB+OI +SS&K,K9GU537p9+k?  !d7 b!r̮̈a͇2@!!6ܫ k-?><"鴤>< cR}xm-Xf`IU}Čի׷w}ߙD^k+e*%սŦ{G LЛXg A aB ~#͑~E409=zw:b$5ZYUkmeY1'{1×e>\RJMuIZ X)f괄hE:MSN|@q5n#j;>=S'UCpL4lṈp\]c)_NKȝ4=<> s)E,|#0tS>e)"_?/~/^|o~O?mtkIDc!|’$i>ӷmN7_~~~iJx'7~o#gDi~{[ׇg*JU{۷/|o m)>2 5k6zR*EJf+o<֧r'޿y˯zM@OOw/7䎪?H۾p9[޼/>_? ߾ŋK!vw$S"$ #i9`UkgUłT8[*u1&LGe7r)1@VhXrku")eiw;oB>:bIk'tG@` Hs@v<_Xz`_?v0EC"!dOsːnn H.N?|x9{[k/n[ G!! x@z}R*74IJ|dh:>zÇ5u]e~U`wg$gaiI"B ]6@@ 5r"k^gbī~%f.O(94cf޺?~MmϾٻ}oozwu7 ;3GCai?|@hyu}ߏx>3URrDj1U0'ѭGYC0 ["xwk#w(~QθXAWHAJ3v Q"5mahvYk5n>/sΉb9Jш{)mkL:y/?hJ<$JCwwwH)KZ $%3Ic|1듭tvR8Y]Ha50rJQ+d#ůiTU$P#EfOOOC5G(Y')%Fm]ӲimJ)}#G.Ձ%7:9E349CmUXzo0/3 녙r)L[4]*$T<j 4C ( !aN=~}w{HX|o?xәxߙ9Ĉ}ܞn?u^~G/񵯿Qe#csK"e_~_~?|/|iá?xu*{5"bB7#ڕ<7c))x,|Q ѻR !U"}G\80J'c^;@ynmvY/"~q:\D̨ou^2gfڶYں^R/OE$Cf̹,H܅#+3 UQϊΥ 9)r ي}_58K$wUw/ak]bJ1mۏt""0PO!_U HIu}]tYG5\^v*J$=+WmjS2.bH}hbu.a?aqqodF@ ( ai$DRp<27 +d[>|eyds`?DMaj77m^sITr)5$߿}9q0w>zmt{ף~nq@̑ 47K0 Va̘5in+M:̌ZX"hv7nÆSeYJ}yERy^bGyR`ΥL4"楔CwI)9 (8QI `B#hDiV/_ZZSiLJ;߼?893!-, o~~:-w^|z`,G3aD3/~拟~ӟ>oG[lوH- դ7_ ћk0+.V3);^Jc,^k Az(=\NKO4i6Qc kzi9f~ke{)'yq>IlhU5O"$fhg71RxD94piǕ4-ؔvcղ i8NHzƢ0wB&$y XN@JꀦN ].=I',ۯJ.CUՙ\-ʽ3snLe6u5̇m̧){)fI8awO:sܘ&B"#?d!a2xΠrc9zi}^|{_'7FAnpU07/w5hRor?癋p4M?x|ZNwwwwww/nnϷ50L~k$,\t\)Njûwo޽//?a/}N}v0t)HbA ByRUw EyhI?҈zCͪH a%1ƺmTDx]ؿ)jSaT yN̈j%3qXiJi27S>FmuǜOz9g3-Cm+=Ynj]Y |t./崜}#[}eD taqp0#pu(F8nѤ \P&<:, UN@z\b]Smdn{S`Q">=dD[kGfmN6:Ȕ$!^_8qޙ%1r-b5mC{)1՚DyFŋsZwDbe"fB)%7SD\փ|wj~Goz>_8/}u8".]{=YnQȜ$G9<{|1|W٨݇wo޾yx|on~Y}{:9EP#& C37b &1m)%7|9?9/ʄ:С>υǭԎf[$*}x~~/ջzs^n??y1ߋP{4c -dluHJ4ȴǮ)ql-)RN˅ poVJit?} -ebF >~BI6DOKk5C.,98 aP9"IDF4B.%jk]R"muX0X{tu[tc`|>:mD9ErY}K-D"ӿkk_K'|;$$*"J7gbC_Rէq9H)vߘ.<͟4:o\jަ<1呐jacD.SRJaH"9縂33=n˼,,! ?}9ʳ0 2sG&cK{g_|7Z'~_ֺk44:@jkbW{K۾j5[Bə}?j|9ӽsZJ齱H9lyR љLebq&fCO3׺?}D nƝB[["&m2ms{zz,eBab>zo]xJ{ r\p()&NuHt@H)i 'A믧U5άȷ'lkƳE3ګb22>r**",m>ݻ$D\/_v5=N'ZA2\ZwfnRC]8/4M֣Yu{ࠣ%øm8@Bv`A=3G+ƭ,\2Ӳ[:t84Ff஄X$̙pᩔdD8"\JV33CSQ(d}oSqt sTo2ME$]*(qIQ@=SqK)tLu@AG덐sglS:Y$x8>`#!p@ 1Q7೯~gR~~kߺ=~'w7wp,z[AMŏqG_qVS 1A8vȶ?6yS\I#Qr)1/޿{xûo߾/?{]O?˒o}[%m߽1A |>ffp"a\8^m-2A,B5ct1UUCRV=})JC0Te]%j^k]5I$х>iӾֆ;4i![nuNv4Y8{e ckBveőDQ C4D<0"$ ׾@YʬXjn1PBV`aꚩzAd`eN){jk>{a~:"yfYmaov>ߘy|x!"k_"1ST~ww$mߙTaJ.z|s"/WUPtHܼ(X鈘gixڔSJ)2abcD1OEXT*3cLes[]u0N'ly h8~1aJ!qlZ}ߑP(\"bJ\k[ֶEr^}qIG3E0n-GH< 1Q.;ߕ$z_^>_WܝS 8omS8PGs+:&N 2_<:з\gC8PP1qe` bLɲ,}tBȍə֚$3ym%"|=,p1(Q17PL m}Un."G. ᛂ 8HGҬ&)&W:\6~d 4a u}d8fk1#Pa6}) 3iVe~1 y@D=>>VOM߯&Dt#Dԏ.Fdl1pK|-A3"!EWί8+‘A  rI,y݁Q}1iঞ3tԧf{MK)offsTSk]u:v8}:r$r!R&vk{1 1 y>jta13s0t#aǣ.G1Lc(;0J~HÇ_*|'w_zXpE.qRI85Eay.aJ$bcA)>Z5k+>qw/G9ZЇWP[ ǟ$&S3-N{uO~_ǧ'P/y^|o~w(]ru]Ƕ2M3YݦfSpX̱wsB¡כw@w5$j>-Z|{{KD۾PU]JLda90ϑ f-p%yTzkj DǤSԍ]u@/% 4bui}`.@g^y { G><쵞ӹXN,fJ^o^~5RJe"Y׭̧\Rsl,0"iY@mk)%dۻ[&; Pc `;n#($ u0S "bWX" (wk||h9A &$)7HE"} =ʵ߄̒RPt\7]F%%9͆Ck-TJ魙3Lﵷĉb`4/AP"NLAFGc U#"]J)ׇv:|iYM$ZIDzw3snGmjhrz ZSy-Nj*¥ޢQMk77];z\:uJQU=G9RcNɏ@IJȜ NM@J%Mȑ;AiTP0sA @ A{fhpS0 bEК 3"f,ܽ=G|)F9쾻!(KVauJ#1*JfNeJOO󼤔b3/s즈~FS"As.<-޽5MTJLܧ>"dm>wGo " H"0$G2ApޟCxD&R̅sSNn:Pk fVi.}r "ۊ@2o[e”݁םIN˶mI՞@E$܆www'4< )eLR3 #GWݢB {.9>T`fWlC[K1# Ww].aqPoO?}Gğ|O/^~|{^7vfB*SZS\u*0luCwXiP/~~Z31ᑞM6~xG;:}x>ǧWz1."iqoJBΥ> LH1cYkjh։X'&DP%b311uR{SLuofM%CX|s,f}]/zw" &Z뽝΋P\rЏ{H<}N$+ٶmD+)Ekn||TQUGHha=&>s` `g ) tu0wh5XbLݻ*vKNcfr'[о^֛Ysڙ$aۛ_|{dg13N[ O24姧GBFd#BHއЫp s02P,n#whh@00^"uԽ @A轇(R$)n AD"\Vw_-hZʴkJ|W^#&՜3"^[1Wbd S7+{C[mAkZ托5N9Qu[O%f_98jFCMS9N^ 9<%GYd+5 hS<(1fu"01FGdvBIecpt#)8œG݆vf"3c_ww7/> />b`/hTn7_~2n*".I2-$u~)Wguc:S+:ł׋<68zx~7|o߿,3#}WUbo!9 ( 9M_,#K|hg4u1O9Kw]Y` FXL,>=CG@zRK0Sk|$kݧyCAHnH`DYь1Ln~j4G!:@/MV S ׆j_bohzwwH}:xk3sNno޼*4%޿{gūW^V3{֧2>Dk=<:F7*Nhve^"cq_݄[p]qJ ,c1PsH D@c&uEᝮBv<\fDZYQ0s35Dn(oR{(ג$jNt:Z])Ts)!92"D$}$Di.Vw(%u@r\zkCufU!kJ8=.7W{,˲mFDe*}pD`iD%˽=R1fHrQ\Gp\("!RXÿwmO?8}w/p{yLJ( ckm) KkPasE$qW>Q3 am5P3Y>o}u_?<~x @H4) `=|)e9[d21ھy$ŐH91:[K1:FD4{k{&V[WSʽon.۶A&^PQ&N% m-T A#=BJn":R,fa:t @Ƅt̸4q:3M(dk-,hxwu SNIP"I:Mzo9%IO>y||>˶Qvt⮶z<avy֩񚦔ưzlcަe]y$[!/WDJq=*ovp|Q4{3ҡ'H1K_maFV+1!z ̝0c{.vi1ラ|ysYr|"`1N@Ĕʾ}c0͓ϫ<#b{ bm}"\rNR{܆֢=z h5Nġf; "q}zL`P@ PKԌ(@`>AĈD_?'*S QĥȔR/^j-%?/~X~8Oy9r*2/_Meʜ2-AUR%Oe$C3Tq1-?ϟ֧G_jP(e~kL'3uB!ĮzC#0p3skS@=¥ͻYfW˟?鿾ߡFDE\H9چ\5 3Q\eDe,VO%%CA"1'EImxy޿{O9O'7>wVT7?><aoz[/a5/c̥}67%:qg5>q`D-&D7ÅJN裐Ak`] z}N,) T1v3%[.V8_҃M^9Ici}`(?oxssÇZۛ,^}Tf!wD 1dF$a0ӔawI=75Rz97%ʀP-F%1-xV4=ȲG}!NSp\PUs"3;j % SPZTp>"\~ss#۞CU[eu̱kXMS)Դ""RmUX=w$^xu0ca. ZqJ[zk L9vpIL9,,|{=-|LωLs-d.s% !K4h'-Q$tyVcXz>{xW[s:8d.GhDSc rNuoЦ%^Tu/oBgs%:%CS@7t~õkp993RB+l.b 2?>>R), SJ{U &D]uĄLc 0Kk-4mS޶=%!^FH-g(t@CW y}4 N2< 0 ;J1 z ;MݽָIS9w{n:f,Q^pj^`EhG{pr7@QK\mK,!ruwnZrDf# v.1Virڲ,www&B{ F qJ)*/ SJ2G0GSn |Fxz g Ț{ǰ)6'B şT0y) #QL@2T1ltDА#1{2^2x$)sRQ&ٯzvTwG*|ɑJ0s >=>0X;pCtk3aQIݍݎFy]ׯ|'˲޾}7F1t,})U>1!ED%鱏s̝a!1sݽ=Jsʱ&}Oc,}K.Hd1Zk9۶RԍImXXR`QH$D Z(m4 EvY?K%!c1<؋,pb0_xG"Iu1J)[}F#r}]7 ƿfQzȨ;2'qf &D:s?yNaՏIkmۺ)%DbAwSd)I[eI%qqr?/n飘E?E:`:EwP[HD{:Bd35]O lytb3-K7t`rs 8~tK/EՆHv?QȄ|r}߷}-e究H9'wJʭ7R<֏3V0LGLgEK}tJ:(q0Yq 壱Aq3S8ܠ];ˑF!88B ]>PDR|qwԆ\TGt:a!.v{{DO㣙.hCB2c*Cmm* b70ҷ1{ Mi%"ӡ:F~,d>8601`007"$H C~|pt6@ X80 i\- ZmLDL\|8ވc~5F_[#Z9B]^s8}۶~#>DOӶnz,JĤ:,0;ZoEΧS덙Eh͛_.u]Yw"aJt,fI9E6j8Mtp%G jk{1! ݬO^eY@ $JqHRfc&iZeR uh3i"AV[g}x|DW LT45!^jHC?R/@ J'GIځXtH4T% xF#Hf + 5Gy*uÄ6WmtӲ Rk=:DwSiG F  fJ)QP!"$y> MӴP=["̭9}`6T.jb,jrOxǑzvb86?cb9{q%dvIWĈ'pރUCu֔Rxp¢`Gj(B|2MO772"!MMEݽ]Vk56PQa~ Mb@mp^}s)Lj1ŀ `v !U`YA ƀ*(:gioJIchkzC޻,%wws6un|]†5}gI^8NFS:)tOD1 F#FPf)rN!h eD"7D՜} s431L5" X1] zSw3v}!%2hG# bEz qpz"`)R$9 &es=ڵ Pĉ;%ٶ= K{'1f6Jp 3o`f 4#,XWxr*<H5e֘ǻxESY<ܘe=1 dI@@:4UJt8xzr.fQ#0dz ߌAZ̊[h@;Iu<iѡrێ4yi.(Ce2-Ok,BJ9پo,s.S_uuQkt2@G{(s8=̹$HFM[CG|Y{o{ůu^#6_!P@%!<q7pEGF)p`u,BD\"4 o,+3#bk^_#BJt_VOˉt5Ю) Z)|5'i&,)b񺪎00N8 1gBRPFtP 1ciQeax度>O<`YGD%I MB~{" VZ]oj# s[AH $D:l# 3"^ UΉ[o H:@Js=)""@IQ=Ēm[Y diၘi%-z}ViYJ U9B@?S<(IU IRx%zGG%jo…=jqS+{ڞ &2]/GJ8DG[Trڳ 1z,aٍ0 x`DXuS)ZE"%i[)&J^:zʹ;?9t}ce$wFrA~=Lfz1F6)jk}oKqZ3! (HHm"u $%%;xLSvb>&T e ft:! Ï\˲bz#G@"Q~NRΦV[%0Scᒋd/|V(7_4|t S8#Ƙ,p + }PoD'"{ l>erZ'eW^C͉R#1\lۻ}t%-Ecw{sD2M4Dli^dfׂXԻ3zR>x@;" 1Awo wq`sDJm\“MA}`e#z3Rū! 3a{mݻ3k"~i"<]/)brp, Hu$̇9|)@%:'eY"5s6T%P ";i縰˲8X)EŕcryT%Ij݉?sS3D6z,mf1Z?̲)q8S^(L8̗nǷq)i͠1z۾[d <,IRB$%Y@V 1 $Ij1h6$13/i8N4RbX3e&IrssSJ cLʱ_G'0p7?x?:ѹy돐WQ(LQ0UQ?W䝁ZNt6^q>Ժ[} &݋z[q*@Ĝ1)E Q >`hX0J$QVr>aQ"0i2 A{ ?rqę=f/vsss<@fs޶]k?s@"%1y&aƌHx<<ϭ"Z,DL) s"5;%1u.@#`<!Iﻩ5u/ev7Ҷa7l{dLn UE$tSSQ3B[# AHX͛u5ƼH{C@A'0^HK@)DNF3^#mn:,f {{c _ֽ-ݷueA2AMCH)G>k5f%,G 0;(PB?x|-Gk::cae%L8)ހ*-CK)p BQrД% H,X֕&.j@:|K<>/Ku]U5GG ڦikT B0}=I|x=}t7+T[ -TED/^91}fښ,sxr)F|0)ڡ_CWέ>f>6qEKxS{)9JUקX08#FZk/,H=$Psti {q\.B:]xuz

t ⨇"-8ur˶mkl4N˺mmRJ)ԽwCGs)97/eP@f[B}6O;Zg[w?{p{z9=:)KFl~ZCJ)>{C.r)) 6u2^.H]3G PN910e+Z`۶@ Vsj褌^(`Q[RZnYZ9(Xdp%LN yv0?wSDU~ <_y{: ]Q"$Rc.5MwZ?$I< ,%yʩ*H,:xN9<OUgJC#юi@4*G Ʀ9PEݿz$a2ƺE"TmU9r9o,EgPVvOV"KQJQ:M:F7yA8UJu}\JB&H99g0h!-H:U]N KWjQCEҼÅl0;\{(ڈ%4?Vt@G*e5x5MsJp^>іRc>ީmbdbDLqɋ_YUDfQ@ )'S*,<H0-sHjIҶn!0SHLTIINH"\Ji#Z\ = &xDIBѐOwp=a^հeL'!.jpm9OНL$9%hI):$s2Sb`Nrf}t%4MmuYXtX)уnڜ3 9YPk{xx9i7j 9]{)i>>2Rrr{evVB1pF]h@c0`jҼ-(qO{QBf̘bС H¬>10Uya?5m =a%|Cʶ,'$D17_>l>MS\煙X1iVվmDL("aYbB !uDN:zSjbkQ!N8߼N8g*qF@Dr0ScVTr4C$qt[6pD9c.ϭ~OD˲D=ijJGA aEXM/K)EZ7{:(S2mT<2ƒV"">@LzX0SxnP'hiJœSbbҡvF~K{XlK Vavf3ҠWCIryY>2_"c;`\'_@JɌԌTGT!,˲yaBA$QJaZfj16:I6!X IXь9x0cNS cJsD+/%sLJZ1ՈX4iXݍ[oaԎCɲ̈8^xW@dֺjHa?|k"Ns6EY|^Kr}W[M6OaB0WFtû2z ^OXvcWWð ȏ2cGޏ,:bdWa lٱawa:= / !+ TA](.f@,)Cci0f郑 "<0y0MG7#6O1Ok֪}O907[@B9}RϧxZT5BqҡAf&} w/Rfqg"=1R”iL-i &i\Ka5.^J(Xa =7o7tBw=0pveaB3:A`9 S+89diuf1\e~0);  i cp*%U7=z#+Ra'H ;XzE .(cx ,a*9R޾}D)yYzQD9Km]@sG!Ti @E {;v:GnaYTIk *S󔤵G9=`rJ)vއN>\R=ssJ&&"y#1յ1muHMUkʥdU31:t:֛5E?9@)BD"zwwwc &2:(!8KO䈛ư5"yAXH$HoNRZ4͈{Ф6CE )a)DT1%µ9RHBKUQR e9F!Q$Rswm>>d4.BLzf wG'` "p5%͛,P!%*TJs}uaz+e,E1mׯ.w5ޗi[I57}m[msl{<$B2a3==,K9_l ((FH%I!sNId۶PSJv2AkBޏ00_ԡyA '(h$ρA$0։1m[e40eKb9wޕRAs{Vʾ4=].2Ki1ik}t4o>uߧy08Tr~q16F#P3cg3וAr5Bat|7% ûV;" iR}8SjMkMcJ9<'W٦ih.* {Q{<u8HfWe݈9F}0֢,\׳?k֗Z$LV4SRoM$DH8 4"9BdGztIOO-r#d U}x܃rT E&4SIdw>=Be©šbS6W7 )=<ϓ [%8z8rO89ҪWkBGO4`$LH> )7@Ps*{M9Tt@m֚G)^qӌJ#~(̢փRcϦvYW1ϋbs90ʐ l^ݿHPUjm: Er}J9 2 ܇m_]˹YbHȻG_fkHs0b53͛3~-z##c-ETIf ~͎E4ٿCt Q"8{zmoh0Hά(r2st|3 AİuH)\uxp1Ĩ$IRBR†Y)X*4|11` O!PXŽwL["atcIcrD"cD ^ѵ\ҵՕ%B١xT$@=^gR L-Mc>"%|8d^I2im\jk:eNȣ@9<<#A\/뺮R p8t2Hv406oS߰c]W#9xǎTp8Nt"e1uI)nBq콍1m?WH21sJ jo{t!7o^"rs{DF1~l҇tSDUDZסD}`(sl>Dl VK)Cȯ?0Mm [K)S97Xj%:=fIiݶmsQ6s79xh:܄xYm{r598N,`˾[b1꽥1h8| "(!ǽjzyeWCO8= 2f,aiiނ2-.)1"G)kExQʼ,/^+ YcC+Bˏ#1==]µI95+ I 0=C:jnt L9 D+$"ۖS%Qa'I2ޢ=qbYS!1ӣܜR#]BGWqvh0S ^9>FjD˯$L55BR82"LH1HLH).1y>zDܵ@`<!5CcE u])K xu-UquSSͥ,S@OKJi:(o$(?hdQl0?pgƇ@ ~=.niwf`R4 v9z>[kKghg"[0͜kz}[|>j2qcUк$)`+F)OOO9K""!IG.DƇT,4ɶϐ/?8?~:Z!Dpim@xKa}EKx8gԢ&9HǽѻcXT"-ˢc#Ѽ,uUsy^1i@DFaG;-:GpNUJG[ E@V%MtZC9Ro뺞!)fk} SH7ql`cSX| sl@ S÷v H%abDUՑ<=="i:!q)<#:di-m2k>=*RTʨ0FlGjBa, MV{OZs|1y3}č}Y͜93;3Zo*!I鄽ʔ}YZ'bيRV i>o/'0՗%pT3dJLP$/$g W%nkЦ3K[7l}ޚO3nD(=y""8lGUk)RJ-PJyyM9Kt[[Gȕ 6tfG^=O,'[ [# 3D3ݮ!Oiǘv~a`n۶Enp01K-#PUAנR l0iVEֻ@fdA:xJ#U,)<Ӯ˭~|ޯלsNֶm?݈}hޅnFœzdW^&s'bjʶ0l \+)Rzi80Z{CDv D757"3'3jkVO33,hb74ֽ[ `W> J̧Ѓ͗J%QV(D8H6qygQ3;aYWw+Qsk`hmkXbLBB@B9uU$[T3>"}BИBkPR/;)s~-$A5O!!k*c/E50Qm{پZr1_oWa wo)l@QqjE#EԺ84Ly0 qlޔ&ov}38Y=FitV"l[!o~:ZECP7NRoFOlh)ujkQ٧)*NSn;RL5jbG `{x~+C(#Ge-e~siJ)OYkr­68AU(˺n0d轗׵\7pT`*D\k!Pߙ# (ĸ{e-Kpy r떧|>OQԦؠRquZ pa[/MD݌Yo/w9mҶn1 ۲m+[JY<Ae|ooJvڶ-\_mc&Jy~~Fc)2%f>ijh!Đb4w8*ؗ`I+H`zJQDhYT44D{X H-Oo=B)ʌConkmf1k)!X߄ACJQɽX VM2&xv@~  dw^>}X0' xcgߩj |1:in8qlcS ᤫJ "4eb޶̐zC￧MxaBRN)Ny 1@~ΗZj٠8fn+z!hr~~y^rZ'RJ-Kӫwqvl*Kzn<sVrj)4۶ 1rD6b@G!]eJ9& G8a{0 0(U&yn{ק_UCk%LZ֦Aa1Mt:Az>?,˺"}4Zk (Ø"9J [;f Fmq^iBoV[ݮ mr0s)4,ڭp}8c+:wxОDSzJYy"e]c!F4Z]@@;5u\WUM)ΧF@u}]WLОKccXj5#Rª慈B\[5!FwG(꺭DA|SU cэ6_cu۶uZiax;vܗRDr'1M9kP۴nPm+)!M՚mOhJ7CFm `zF1о"as~h)!|3MdF ;;Ǟ#_Z,L9   VRkcGa/m-̼[frYWU7;pUuƒs7`欲,+f;hD4'fy^ok)ۈP-Jȭff܌x&XIê<˽wm]ݩR{Ej)02ʷm{_^^zk9 v$aA$f!M9 cO&ƀvJ 4ر*V1Ku819OiN)Nۺb!^_Ji6,Pk)" K2ޜ,YН5(w"0a3 DX 89$,c1B7 HW{&bD?vjNc0p9Lz%gC_ Da_  7!v30a7>ύܭZ[u6@Ga Z|!7iJ9Ɣ [քe#&hpf53hps̲Mg ~eY/r0D<ܗuݦ>El\iQ:I#K/<ouj/XT#(pX}Q>VTtot^wW|3g`^7z*1k9M94cT f3pi2˲,r9#f~<1{؅1ցP|=xߍl;3;Mlc F#Y)|ӿX?}[/oCcZ<{sNLʢ{̺\ΰ9OCl,8pT9q-8&AEur֑5se i {Zj缮۲9gFl0+3jA( ,券)bN) 3Wbκַm54 3hPE)qSL2}U-R w 仱=yo{ z;n|9)VeYK- 9KYZ *;2z-vZZݚyYB (a#] ,UzwnԆ/%c)1Lu#}HDoZmJX7?,5NNZ?;:wa>V="/u_4 [ (i pwC>ɾBsk˂~.BGxׁzAA+40 `RUXe۶ v9{GN[mwqB C~rtO! wΧ YrYjޠキVzo=Oy秧'Qݖ2M9gϿ֏о =hpwo0GY3gbf0b6_GDAtk =[붞ysN3/em]f,޽[mY~^o/뺥c iV#9ikk޽[u/1jQd Ԓ)E¸G3ϴ&7P 999b 5Q*rzk|'EoЯ j1PX"Z 1))#3Re62[ ;(68"v==s:NT 4#aDb*c c )iݶ |`{NPV/J$@&H.$(*("1t)OsyP{sLiS>Np)`V[bUr7Rkm֦<ǘFv~zoci^k&E3|ļGC"d##UC8g'W_`s 4 ?[?_oBҠDTJ>Iz_;t۶}~nziv"tOeq|~~`u Á +tQ|<:V˲tv}= qg'!atuV[4M6tIuD6bfi{$޷mR }ϗ3N[IA%ecZ{ V Ps`PSzRC }w[#d*,Ycv좻z7faUv[j.D$j" RmZM3ZӔRDhm3ݚ*kd ,BnV7@\joFKI$m7>O&RmwA;F2 zUV-B0J9Pa9R Ƕb1Űw9W!/ŝxw>4%"b {r}v'X͖ͧu5^/f/)Nm+|1@1,Z-eYUŽZiz}<1Rm1[ﭷvn4{5X[a "0y^'Clz@Z_5r\.XF kK) º",/AH^Xw0rr^me)-z#m]km:1QB3#3K)ZEdۊ<\̭Z( D[1OYU^z[iKCvC|g11ݱdFu_sSR ݄EYGe=Cga8!/g!w8Ʌ;7k#ړ`z'ެ Ȳzo+rWܺ!`RX zmۺp;D Lo0=Vb 1r ;BֺjGpZ[- txf뺴^{ڲ.S&b ;׺u3QM9h 9Bٽ)Ũu]<ȕpmu3 dS}xr1*й^ASjV Kq3Ո R Zr*XUuY@^0;QNdaI9(Bk:F{mFd{km+eʺnSFHm K뽶îC9`?OK ٢`%Wc|>!}z]֭[GkŬZUrĔԨ%+upܰ$aeEDܩȜ7wI0Ĵv$DF?ψ~OO@QEu.*N[nti,C/<>> "BVz#rP[§I5|'_U/FCݶqnԆ_bw_xԧnwb%+rw3Q\D (qBd_ɚfn̙wCS{Mb֬ëW_^ޙ!RK6̩d\^21: 'iBV VFBc,KcʈӞ38XB4H8c8.pؽ;3@BDyLBZv1^!RLizD~; Rb1[[\[E b)h#ƝkwUFά"fIT;OL+Te+6N,ؓ__^RӔ+9Zϗ3D{=7M{7b{kuCi!,W(f931>;JCDz"0QS G!yW.,bR n0! W04M_kEz8~R/m0pHO9csέuYSĎr !b4뺕TTAsb".Rp-rBGzCP ۷DpR #OOOM59/^ug=Š ݋Jy%nN: #v,삍q&) aB ,>fW!p߬ S۷TuZ7F>z1^˰`QL!v\)òFmѫTKЙCb5lUã[/#5qv2,Fa+bl#'#XH~_k?ĔSOìou3򲮭cα-Tjur:템ݍAWRdމ ﵵєPv^)Ė@3~*B͜5DCBTj7350sC0>*dޗCP=c!0 Po@o@T^9Q՚ K~hԽX"{/ xx-g0RpE23;!'b倳Ui!.L)>z(zH &v'=yvDofty fS^=ybLD6 !24ps|^2h&Nsfbbi@ѧ1ik1sYyO,//חkn p!7{|zRu[z_6~5/⣾k=iجY <aW:uё8<%NF1FоqbO'AЈq1Zkn@u5ADLs뵵fO ,S4gVû2m+l^ByaDЭEF_[;RRCVj5sNVO I)UB)sM 3 )t>S8E˺Te4%Qa5>9 !B7'1#Tvݶ{ V܍Rt=Ƣֺm!a Dʄ(4®ހ0#8sT;N2rn-x>uPcةA,"$1U?i`,>YCݬYo߶Mx>|]WpDcJATLDMEҤ7&_^n^reJTc|JNSvZe]͌|6t:U !/i|RV6&J)cWN_~~e!H;D4@%9|[n˺ Šp^ yU)(ȶ8))2 yssPj-,nx߽5Uyzz1nەȈL † V 2 {NzVJ)[JyjZBm4o)B&,xc3s{ਬTVHQYͨgrս[; &LI8o? ߝԾO?-B3<}DkfcL^ fl䇲_޽nSp-:w("˲7 iJ1 !(vZm1%wjR18ƈ|1C3F=7{yIDj~5/P"v43SUD$s1N'Y߷nE4tphh>k8yED#ь`mj5(`S)grL9gx#F ik&b20 .gR ,S99Bt}-ӯ]''9+ĉEa{ßل.XR4*4 Q̯EcԽ)J1UB0'neC*) DxD?<<朡꽗R>lA6rD콻iWjJYbaCt۶^6B@jEO1<><̬)}٧_ڶrRJ- bůI?Z|~z)^6ߐgdjR|Tqy 3#5le5aԽAEȉY oX (3ݮ}uuu]m AwJ,#.D9N`k t>圠O?ҧ'a 1̰ߗ&"mrA൪izx|<ϧӹAB2{Qa3`9R vPf07oЀɄuy 6f 4W7dԾO/}?RVR j٭!("H߅.S@C[RGpv^ hK15UN9v!D.dDC YĝRl[o@¥lD&"1( $|ZL {f?pXmCLD}mZB>TC7{yyq24ցºbn0.S1M KЋ ,TATo)k)[B_p)A :; 4D7iw Qyiؕ!+nDT6tΪ PEh1WOYX D[fp`6F-0ߔƦVZ;gi#8HuehRPB7] EpZ7az-RY6t٭B7[ BМ|$y !x|`x~yy~~na}_wtۭՖs&z PQ@CuZJ)u"E b9p۶˺![ԗk)|J<_/9d{ E\mr_|a\Pٰ iDZo/ ]V23𻭋:;!i",ۺ^oaf:|*yr/ekݺ9uzeA)- Z]3D\"7u]CP&offH4$w`ȕ|`'fd@~7@>}WE'>3Lq+C SuH"o 1^~,7~i1ů 3Zj+ j[ )뺚u󉻊N9a lAPk-Rzz(4sz}Cr1P( jw[ ppL4DeX.f!BLfYyO 1Fth|5#1QSNp9=f,rֵchR)E@F2ݗe]Wb'v^Gv涭)'3}Y̭w,?x 9s9g;ifBQGG|6,ZmT~Yx:`cIo-I_O|=s/3au@^|s۴;ujGRwO7#vŠIaL̻|2s:"{s'f3zEbkȜضT0`ɘ|>Bzqz,𙥵nEX ·(HU坹a "/K)[k}Y~3.M >hZp*o,?n* ay` iI)nQC tkϿs:zo^꽕EE8ĸSyW f˺nGO $S09H&rACkv_|>].i>RmENDS\fM%Vu *Nxvo-#$>x"f`DR/Y.[WZk{vAXi>M'w 3cRVLL5RnQy>rhLl)|vnams\kֺ:M J\D@˹/ ]F⩅)' nfD$*DjH'RN1 .cً'7LuzЧGy8@GFA FkN{q:1% sX 62Dwj\tXzcǻk"&ɁuUCD,͐ "x aK"|>RkY˺qٝCӺ`1~E-Y("ˉjxVldXΧry!0<iP#Q3{r1_~}ڼu/@ Ap]/ldGLґ@mq$#ޘ(Pai̠T8w+~`0S1Ъم,nŜ_.!r肭S]o7w;3m[7y˲SlV54ׯ9)81Km{䙧8ۑ٨$+f 1(()p'j'9;T? 6z7s&*NLz]/0ZYGb)Elc "P+;YtN XplÂ1tbD.loTcėy =rRvN-qoc^'>R'[}17eE~Bͷ7vp$^woȉ!gV9ϧY=Iͭn*CZEc nOo"$JCL9{Ast^f1Ean~*XmY'g)S;uYK)뺭A3SFbAqޡ`oG_ϥ_H?~WHFبW#VAP)^X@83QܝLIGe}+RܳF)=h0\, <^/f`w`ÖQsڋjo[Cζu[[C2soeYK뺶fDb~k|&nfXa9n>$q/z6_ub52$D*yϜmK5D1 K8nY. ,|wvGض Zn*@bP Yhku&Q)rdR jA?X7b;\ oݮ7u֊(?ddIB2|fR Ek5Q8 Z6鲬A,ܭJ8NHv Ç`7&qU dl۲n vBrgejXT hSNAT?6pyN}u`П8a\}`_$ʊ9w;7rBi0>0 -h6_QC,n%Y$fG"q[K;Lx`B gѮlY[mm'U'"Em3;R?SDL˺mfƢc4Tjf|F0tbiJ@4(@s|~Q^V 'wE)=M LZݼXb@k'ޜ]H 6_$ۜL9 c+R'曯[_~_-*<K//ϵ<姧WUXSxzzu:{ "Jbp!՜><>Χh{7c3O9O36B}#KlX! _7^gWmT|@G5P`dC.h΀6ߚ`2=sVg{Y$g-g7QyRN\m1"iшI9e]5 blnyݷ^m[k`b1Ɯ'1S)Dy/z0 i!&FD3)}̇ )?>Z]5hH93p:ϭcTj+8`&Y뭚wa~x<#1Z?pkmEQ4-JtdS)SNDT[%EeBrbn" .x1F9vHy3 Jt"'֯q~of>yF =]Nm(剳0RnCst s8Q2p,<b .6"by[/4ѶU@tU TѵnV[?)u3)OvBs\9崕:R׭4%ryp2,cTw#)r9g,a'̽7sG[ {(~1\W#rFy3re t\axbb8n&#;,m{ܽ%Nݛ(\2QHŨ27/5yg4?z|Ĕuc>4a1`=駟nݻ}ez[kw+uCF=:Qo0oGSju= g]&yyڨ˞ǣ{D+p 'a#'sC}|-k%Df9_7_đуz8 u @6l>5؎ a8`XFHt@06S_9;9^䛡#u&/d7Tlݻ o l`6~lܼ}+<;NT]I͟ 0wa齳xchV0[2򇕘ܬ)ZBNfrRBvFE\:^:(NLzcU(m͙ 5Vy%޸10*/Sa6wg҅:Vo{niEDI)*N9odl~2]6{efM.B¬F'q'"g&d7>\|ChQGORf>ֳL4Q>Ĩ D+Q;5<q}Nݷݵ*՚EQ1\8։"o O"1s#Q}VXkߘمD1/OgFo0?#P{%RD/x|c=??tOC\#ȅ@M^[NNʡ) Yc-QSwfl# Wom4ŀr<\חR|iwEU<(k5f=m *Sm[ Aubڶ2j(ܴݭV|̹ʑ+iw vDtb{iί7B:epk3`&D>i98$;9`7! V-|W[i'юڽˈ$LddC.° ! <¯ve+GsHB^^q@ : #aZH=B#fQNLD72@<`yf=tSx002 iv#G1ebB38ff{nܯh9Wa]O0`+{{ǡB18bq7v3Fq9nmcE,!z"cB^ʼn^O_kHl#՝<ԽT ډԨx"\]D0*D0h)bM#=ے??G?j [@5\WZ(;p6r: 9v͗3!"d1 o8pv$71U%DzKia]W"~||z-Ŕn+RBB,n{yme;5svB 8?”hRG>U']se5ˌV1R/kVPtykVg Ԃ<__#Zy>y tQ`|$,P#;ب=߱a .>?}ǧ v'"وw (`saNSO΍ZԩSj{.$ǥkT#Gs7 ﳋNma(I+&=@F*4UmͺAgk+eOlWwg \u[9?e{o~ NS#HؠYo=+\NmRM:y#G 3vH&]Ş?a_|K{8[1a_9-$O004\F }j`gdPvĊa耋 /z޾}f۷\_|?{u~RtbUrF"Xt[*ZVEi5m݀D ) sZ5y{ވ"})M~DezA6)h[Cȝл `D0vf#Mh): +8w6"58U#EpuAMVyX#9V@vl-q.GR8zȩz4̗AYw}<֙g|Ļ}4~]9|?&`Z'ؾNyZUt:)8e]SV[/~isB'cvOO6ӑrP̛ot'@4spLvr\{_L ;khRIBX6[`RMJ_'sA΁yL<`dɡxҽ1kSG2S i0{~j#R _Zt<ϵR0 QO9-vV = XD?`{/u]km||ͷf}1iJޱȶ | 6{ھ4ҩE͋rpNWPiKEvb,ص/{D쑓h (ah4BP+>|*x\o̍Vb$FQ=beh #$z p&qu](UYVaA8ۄ6\*n2ABQfD 0W( :5#1T G @ Ɇ- )}wpAđ#wx3xX!'NxA }l;:_FX RJ+*v0qu3MDjdV RhC-3cgÌH8v?6:++.f Bjb ,Mݯ/wOo~\Tlk#c ʶi>!41Tj^k;ǪeB<ÌөO\.x^p]rbDWGNĀdе%0)sڷܨ}ױt=C-Y|+,`1@FGP|HeO G}QoVi@Xr"g4" 2\E7^G"f%HpV3%Tp0˳.?>BQ}6b!#Huîfjg[}~|@n >FRwH:8q24J*u[h2dek8U!)0) w"Lby9VqŷH3z썊#+1ul?tjĴ??wa[m'v8M4kd7Ig-ƐSN1CS9_.D. Lz 29R[5]Dv'evrZv[K)lo}kL7/$}uh^}W[RnN [5U<ޛ_~2P̳G4 Fu& B>#NV +C75 5>XANmD: Q :0"0g΁@!XyU*Nd( *ؔ8"NX}aFc>~6cZ:g˘Kg6tB,U#YF*F5r2,x wGvvdd%c%dXa*p> UFzovN`F \>gă2Ÿ}q5r4L*]:9p!%sA.-ˈ$rX<{UTFc`Mx 8xwrvEH fC;,TgLb]v;"8"۾I3j@бuD q/04s#~q0umjοߧiyY[)ԝf̙Ԗsݗ|F'o|;;ps3Į옘ɔtp)Hj1 D-0Ox%#&o$ye`7}%g95aef&Ih(~r??i7Ġ|:MoߞN'dIAc ~yh`&z7\eN!({+gEDdi1:ÃZ3엾_:yq TvŸ;4A`b{Xa`eT~b9lP[zt+{_L )N=~"7!~:zuvpv{Hھ]>m87<| ra`?M b+ )JHAUPy/$Fu #QÂҏp` uom !Euea;6X@3*af1?G-Th"oPkz1KUo ysK) x<ܞP8Ʃpaoe{!a_]ͽ4eo}~~j-htDɸdLC X /VSVW<4Cӡ z]b^xԙޗðG" W;BelQ  v'(i4$Ј&y's?;v۶ZR`a-,!|:!:cD w4ê̮Vk|ZEEC,YZm,cldrN9X<=>>z)mZO?'_4 /Q< W/|k,HM2>ru\M( L:FMm(؇N?F-R|] j qx=5JԢZ߳hG<+X/A 8Z*l}؟qHv+NNQ Q1"kq3fr^U@'XuAEaI){ @Ưcj>4|*v%hTxI8q)ba8? i-╀S; #`v=1teݛQ3/ϰxWtBҠw&j!KVDjkҠ"B_o>ҏ_#[펻8OY2fh݅\XR6j26vPhE(ͬ{GLc(їXV NONJ/`6Ąf+l Ul=oCL_frzRJ^o#bDϹ]otfJ*~[kd>l{ E {a {9.;>aEyC=2Un-/-bcF+.frc砩{"q 8 j pm}Kpq׳a;۱c)3-p0}+sOVAΏ0Rm.zٝm)VJu_p;y_s<6ڡ&2#pxĖSh7Jڅc T41XtqXtp~1jް$îݠT#Q1qdR)NSxuWGrLLRvן7o>*o߽>y|YvaeRJ뽔.|9ByԪ֗b !^o_D2 R5H)gX,PDj4MG\.)yybVv5r{[0Rx#>vDNUB zm-%3&dc2b껥 Er9j{~RPu]/2SN|9r_yi r OfB^)%ab,붭G~z' mݗpUt:_rΘjmUp0zg~"rocLyY۷sʺk 5tPD .в MYhH߯thv;%eJ.@`b"@Irь0#n 4$n0!ŲB*õ{CCI xP{YWŴM&A;N]}@ 6;;ppv'*֡!Ag'Hvh8Bq98H^?ǡ{`M>f^h#rTMQEg{k?S'ܙ1Ɣ"a^k[$dBSX1qJYXnsPV~5Ͳ;d?/'w_$/7dqf$ a*c>QQ8\{ٹzpG8+T]^ Ke510TcFy^wS?Ϻ!~:u CT>s쇇,*Dt//rOӄbVJ9{x||~~qRZW~34g3rp ֚S>$nb^^^jm|2~o'~*=,V "{^-.Npz: `R>Ep`sx*!`PX$;V>3l2'w+aQ |^X4~ZA!f{7AؠyّQ$MPe  9 'fve~0ɢ+ogw 8PoĊ±Bdz}u?8.Xjn0i+oG[pX eΕG7ǘ8/u- q*3u}˻FaB0j>۶YJ! 5 fRl۶mWpנ7'ry<`agF}8W_t7#@2ZfƣQx TvYzH>py^r7!$ {JuyAqA#čVzS?JFS?_Rʆ=RNDS˺NZ ) {"5x'߉Zk"g9#Mf#Q!gw_YT%\JяX;<>^]Χjm*c9ĈbUme6rW$ySЦ,;ܦx`r nB{v(`@ޡB5+aHAQ;xH5`K0de#@tA\l;`ӽQ˳~\kWeQHn99lj֑#*{Gx2ǯWLyX}+fb0#>oֹJRV&$#R46%,LdCX?xtY; 68{. ΁'Жew|h9c?W`&qcfyÚwpr oyw;'ΏYdffz~\vmRk{5k!&6zS 4ffThas`m+!.3OŐ}ʶnBºMokoщ|J1pʼnb n;xD!4ĠAW>z0HRcIHukjİg=xhw! bFV= Bw.-a8q@0SܼBȶZ$jArUޓ KF&:O{;]m/ _m[LXΕ {AhH4Cھ8r$X?F}=J‘U(w0n}\p;êw >#,Sr볽㟭??anz)VEAYG/y:P֚aV)zP޷}4a F 7g??Ij>wfF>*lۍܨ8ڔ@dU}.;I oT^]??Ds.m[^~:C1Za{r>ϧ;֮חuU5hZ~orΥN NYWa>e]KmEEr]_K٦)y@L9'hm !{UfӔUUCu]_ 4+膧~ 9"/ >Ȏ;jފlydPoNVv8ڸQ&}7D[|8б 8j/2[~ş8{L4}GPףwMofn:O];ploPV9behlW eYإCk$b؇{-3pp>3Ϊ! ,TX82m䵲^Eޛ-6Df4"-qP5ڷZX 8z?GOHL7B-:E[I: N >sޕ@oܥ f- '!^iHq]9BW7_v~|w}r|׵Uf}QcJ!Kٮo>ru-ZlEDxrkz{1Πʭu"6s(@s)UElcagӏj'2 H7h)%Fm`t:B6 B@1aowd+Z} D 3ܿJ<.@f-TV[*O3Ǿ{ܼ* HA}'IFHoO8$dpZߎǟ"D>՞{O<}秾huzzu!NO D%"bXU4tb; ;3Qv AI[+sVBRp|>ϗ-OtcHȏO)!a>\`ґm+۰貱5ju7ueYKX$"WT_~O|6#Ʒ=y(Fb Ǹ!`q GI7[vA)u8KBap%>?8}.݊~% dif:۱:94 P u_!/:H;0"wl\O/?|>&<zZ 0Mp4f+LXX Ivs3q?<)r})6 ;%$: Mã~ʠ,ӠrOl `'#+ ߗelEnS|S0ů{~"2i@ow_'?w}Rkv")N'zoӔ{ ޻SؿV߽{cJ)= 4ٞS!?gij6'aֻy,Ŀ{&a/g֙YU[t>_D~?_.5f̒1X2.N Wطuņ((@.l ?)dXJny*)C^caK99 XM×h׆lξ'Mޟ}," R6+FNخ`a WqBFGA%#Kpkaot5U8v_f/ Wc dx_^G rsn޳-wnOM>  V~}hlk>$&(؅{oWAWA a| $T=oÕ{7l]3'6n~_͌wmjfĞRbalea42BR,¥RRI)_ؐvoն.+z|׍W@>8C;Y^|a1cЄg u)S&~pџt_5yBNDAػg߾ק~:{Luof~jm9)'&?N[)u];ٷ|ǵuYw۶7{ߗen+ȶ4K)<:3kMD{,|:?rv_Z7f|A5S1m#cLVK)05tU?tM,!: >|oɱjw`T.9^b]rLb ]@l Do)fK}b8;zmx(;ÚGxz!чN}S*hNx ) 'apP7s:)[E~6_c?|leʍ|nCuM9= P;Eb0;_ۋ=oO;vb)dTAH)01Sʪ  TQ(:ALccat=}fP[Áȋ>! ;B/p]<[*{x=hU:yǓK}#`n@)u;ie=8 ni<#QWZG 'q +JPw? Xp豨Om6YxԳxP@l=eg eP-TXv?vXDdZ~ܠrxu\sCO =KWpa%vu70Ԙ^*4)iSF~|]Z95;zl9{/$KZvw~#AnM8ϛ^zTdym Z}p:ڱһyvfG2Z:5DɥR'NqB̬"s"i"DExlԅ5올UR#hо=( +qV?>,eמ'؇u颗 AA5Ocݻ/ڸѯHKm-_7޹-mz幔: 1RcRJZr"{'HDoPkixsn`]7CjûZBD{o Zi2DdՕo ac)t~zyyaNHZ[׍RBZ!Xkٶi眐 Rg?=_~+GW@VCuf:x@~*O7QөsyTz Ɓ{p#d_=_RX+ yU7:*}? 3 hTQ rV U3jz#c ]eF^ȣzWglfi|=}4Es;>EoY'x7Yt*H% oX`_ yx(qY=ʣkIp4 *jGM&?daWdI{э" MVUȣ*eqFc|lX>I"a5P(ծu`#xP=UY%CwhcgѱB4c(܁dدnR=>h|sQUU׿cJQZHGT*,3<\aJVvfJV-+Adc` z!r5GH10Zt뷦.wjT܉* VD02wg"ސH{:1Y:w"E(M?}]{;c_(qGˁJr̒=:[5ݿyͯ_zi۶|r>x>~y\r~i%c׫08<^oX%Rzz: ֘EPkD]j ]DPPﭔs=ܬD^ky#"k.ٻ@)R@` 0k]D<Bd2Ɗ@%??oؿ|`u>G FyUGDgjw_L@=>tlwr]H8@%!zb>=2,Vh:[up{> ǰBc7sR]Zzy ~uh|~>B=RR`#||~w}LR^Tgydη{Z'P%G=hۃOۚ|q CÏ 4 ,{,=:}|9‘I]9@czgD֨kBOw15H"윫1ZCZ-AϿՉ z|q=w V_5ᡕP$Awh}CEw.&~xC3vhFE>UpՂՉV;RuJC=ëן^_᧿a64ךCp'~1uZcsIOOOt_ii\4N5By]7"R*㜳ZD1$BԧQD?G R15p"t\Kөw.@MkJOBk(H:P@ΥZcR+nWsVc3_?C9z~uq2k7F*ُ GHr7Aah9JcFǟydH"ª>24nw=?xXaSSU ABe *:4rd#ARigPݕ0UGBʻ8=Y p}f=8'~ ibM<+DݎŸˏ}eɱ9t$F<ˊlϳ 7^gf砛WYxrǧq_k,k9Xda!Xkɘ@银MMDj! HO6c \w CّO~LO _eGڃɈ cwȚ /~g=&1pzd[J*M_v|(iN6LϧU(~}?꧿& )itȧOZozo[V8㏽wCFe3˲sΈt>R[uQEzBf1*9cDD?6|U?OyYe_-j7ffjN[- y[o뺍&"֔<4s1֐su][Jι "ܹ/BtiR~أ-yl3΃G3tz﷝<JӗV>?1#}iq|8:N=J;I*4&/$U}-,(~d.ixo"Zs*4KWv攒bs;3dLkBw"Y!@Qm"DrQs^Cֻ{?g:]m/u>SPX틱7.CY>|JڑVoWM>'p79b@|,VtN{r}SmĿ7~Rr.Ze]ׯ*@c4MƘ_kvzұ|ڴ!8/}>9l ޺=Z]A/;esKK{0~wPA(Ԁqy?H}+(x/+;!VD;cw/JɺDD2[iwDwH7j-j׭72{ g~b6?=}zkF nNڋC:Q,W/T` 1#gϢcsv*=tbCxa?yG&>w]?'(zv:K'xyyɹ8瞟_7tYT.|hQ?㖲"|Ԅ8c5V4zk:_ ]Ċcn[tVZ~ZJmUDd6Q[g5d`G1F}!i@saf͌qY7$,Xb 9GVF x M.Q4_.Yi!8PzKMgdaŒE@a:Z5u?rj/ *T,8}|>asuT,~=U>^wpr$ nǕ=MtòwK5CpjȗsUe747Qƻ !7Y2!tG$^K?lz<ԧWcM)Ev!cLu&DL)ϟRnC1F]cKy FI4!zY6 kue79!95 3j!oȌZWas9.s>ϽukI#O{_@eRȬ1 |]'/5='\ rp+cG,g=/GT&>Vz~H tR"qhUbt7?_"3D.?՘qyC7(hpV5RJw q_t9vk:K#>N%8+Z0̫x;e#^h}mak*=S0jmۺ 2C:#BD5  l۶kb }3Wu#b- Uk)t6?w3W^:4omviMA{$mms!QyKӶ"R$2T1X[Uo??;GaF3Ӝݽב—c#D7qzAVRXs\З; Zpk4o7uޥR3uH ݾJntA#]m;LE ړ桝} ;*#>)C5B4Ec&UWMӦx6;t:i+%>Zv$}!7h1witE*KU 1(tG(1] ?mX(;ZDt吏8/׋1&Ki5읧!*J@,0.ˢGqݶ49{_ܯhF(DGOv8;*5B#4^֭~>8zSvuŸֈQ9a]޶"ܤnܾ?7q2zm[租=,KWbr.9zm .01f~{{3d Fd[P "2m. Nyye5"ɹ"s# `h۶[ZmuMb bwrʭUs!Ơ!.ua| 7o+q둤+#("?4`w`/G(pպhBv$ z:"j'4b>g_?|ցH#j'> ~ǁ?S*?RQQh~w(ad>=ͨf ;UwVF7=y:-h2hՋ}c{D.ZxLBC٥RdIs,8cy!2roۺID[SM΅ .K)tZkUSrRz00&fuDf]"MTk?GՅ2nޅJN0ޭeZs"Bd+ 1s-Z!"]rYr.ҪZ+!"a+aO1ds}_7̒ /ڄcap}Lh! 9-_]ĸZ?z`#!*Bhtk.x zG˻EDma{/u~]b>|Cէi d=/LQDdg^9Hh1bRecnW?Zekݺm98 qvZ_kMS|qԝG,*CL.)t>~zw_ʉr[0j >HMZCx8gz ۇWkms _^_zW#Һ.yeZi˹eYEWW872wn9OD"윍1?ϴk>^)yu έ5{ r2"Ho B63<"1{;Y93i{gikKi?o 䇧kk{THXQ-<T$1W,᫔+rG }+<:h.FpHEUѲguɀP]*U#Rq(ɦraH;Lzv|Gޠ7huű2>uT,@w>Ɋ ˒eY;zmؤ bv&#{XCBRYtغTFMq$&pe>mp!th/"@Mf(4@e95Ҥ5hҥ%I{SG̵gADB Qk0 7ޅ֪1.Z{\PiC$2!k"._{8Ýa,%ir XԮ "z^5 1ze|z2Ani8V֑G¥vC|xUV<!-5!?K;l9'S/'TM*j_w?oۺW$ !䜽<ϣ-b qҖTmkk c "24i M2oooD|mޫ@ZcZb1cN|CeY5DdK)ι?֦it94ZJ)m9W8J)1~i 祷YSZOcZ: :޻1ƹJ9)61ւhO_Dwh[9HKYO65fI [{朗!W24r@b@"4R{9dZg+Ɵ13w޻w欭1֚~ΥXr;aٕ8R=/1X) 0 z+ރXDjT} "a;[ksXA ;j~c7d?Eu!{dt"9gDpַޔhOjό}c-UeDG D] m[98yd.h<~G"CTZ-w朳Tr[c4C`f0tx|ՄkvխV@po:wι\m˶aP^9Š9[붴1N!x2x\>Dk,^ܺޭ1rq $Pk=-mݶX"}m]D$%OhA!cL[D޹uJ)4 ChƦ:Z"5$d}ZoYb1Q1r)V+m۶\<#bF՛Zwz;N-OOgM1/8 쉶;D޷4cJ6D:wjyyܗ] C:s_2 Kޫ\k=0MǏRѿ:oT=|>nW]Zq,zOtw,VzQEmۘ>JFvAkyi=ŶuU;- JK)!an 8eFFmmBC)cEjuO?Y;~{o˲Lκa)eY&;z{_pMd#0^v}~zVDzf$hX&s/4Ǘ-BTrDfuRu]7TZm]sj]C۶|Dӓzyoӓ?IOOcr1ƜӺnj4e'!3faR CuKۦi*)(w`<9ֻ !F(9%f&y>tR.Xfo4li#\5T@Nqm1%m2.Zs9{#AsnspJ&:k-K.Cʝ;|[Ƙi{*{T{-<Bxn1ffYQS xmDHcIH{̯/|:͵U斒<==۶nvsJd?#"=yK]71_}Z5Z+9T]Zca"iQ)˜Q 1ahHZեj 43|__PQU˾C4{U+OAZNSAD~{_m}}y%CeY__\ Z[߮Z>|뺮/|>7f91Z˶%|^m z5hݶZӜs0VҶ)rމp-mG; CT9gSUk۶R8 TVq4sH > C,[t4cdfUqq[RNtKi#$k<ϸkK 1m!vx0 ʨSh뺮vhEέ*m۶ՊrܙA|>{ӭs9gnlƗzqHz~g\׵7FکEaj}4M82wk&ZkNQy"=!l*½5k&9,鄀r3qx\5wm8*cg_J^ECX1۶nOOOZ ZDֹ'$wrὫ;Kwީ(qڴk5֚X {Ac WXcrCT"A8wT/HP#jPUSzSKQXrI#8jm{DXߨ\RƈD6ɥc~wk @<ƛ)%Es^1,ƐfskC&j=%h4ADs>Xg 1\k\[su%BO3ҶcZ9'"}[A@Y*mIDu9gľn14ϳ w:1tu"ֻP8J5ƨaY9fczyzz. Js;DڭZj2C>8}c>~8g糖ؗmrJλKm\r.i΢s4,\keُ>gA[J4ֆ!R%m'cv]wc5|9cz++S~_oeu]SJ)ӧZ4QM8珱?~Q?Nj;vPJ@uwjv@Nj1"#)!`Y02v]%C!^R4̽2S6DL%0)%-A]k.>MzqƯ~ߧ[)\j&R, @<[m뽏㸮kmДNbrzsYUЊr+Af#ck-X])H5|-_j 8[ea{Wȗ{\ʄtV_k=xý;oKcw:&qz:ϥeqO֚tnd(^dg&wmJ!]CUa 1R:wcmKVlO?,R; "pPJiYg,nr+wi"|KD(a4?N!jJN03 GZCZ׳iaI2R;=wBR1iFqZ+>Z+,1@)Ǐ֚΍s7k]Y=9^o)m//UfYv3;sJ[kMXrν[iu]!mK{1΃e]X 6H#\jkUZ Yvs>Ƹm>8ƽ#!hΰq ct-%d#Y:m88fε8!ָ֢qCJ޶hzAw}qư0Xg֌!2A. yM(D$d: VZiޅ دkJ yf-gsλ;ɐniXzך.if:gKɵkpウƺFAܲ,ם!QE]da@Bo!ꔟn6ー)]J)q1>'$(4{:ͭz%KD_o׫7-tD|tXj-M½Ժ ;Rqj[oZ5}p9gkkzp)Mu-څhZj)^[T=pi}m)V stCy:˲Ri&"]%?rMSU"Bk 8#JKy9z1K]e z;f}zzN)L9'c&GჺE&9%l1vY*ݗSm]ke'"iZw߷uumFDźd̷~b4^/ֺ2M@b kaoi !1ִU*n۶,NNK.:жL@<|*n7Ǝc1k+r魝Y>UyjkiS0 1t:q̌DYVM;!|YWkw*d {ֻA5D;QXs~O; QLܹ)c*By?ܗu6нSΈvޜOS:'{&{ 4"w]MySjRB/"h+Zp9O ͶX;cMz]a޹nmWz3Ȳܷ-ƽ52ZRK)ZcXkyιɽOdl{K&1f9fbT t:z܇!C&kmWUUזXa3ULxC)!Җs1wjgvZӓޝv0riN4eY흇!{NoPcLs,/*ciZ[J6U@0[!;WjAmM)'ܷmYmXBT!6ADNžs3y&AR)5-w9}Z)ÇWG ð6OPwN)RTK1v۶:d9 t[8 8Кi:pg]!Ɛ~7ڰژ^/Dw?Tt>U~{i撋. Z S*8=??/~RV0F";lι"ZaO˲\4)R0mz@ {{;_J9RRJC¢Ŕ2T 9s^)伥֚1wΔR/+w0(X`I {Ͻm[1Ӭ6m]WcIo#R)uNc{DcR5rޫK;1> c}ѵ6D}%8ZkSnKCi0cÇ;s ?6FXRAN֪s&FهP띈i*tfc,KƜN'96ꀈOO'cw N5x%Zin8#cu-TJ޶m']/;FRsʩU}ƚ[X+?}_s\[yWr%Ƹ_J8!έUkTkݮaK)qj-"b 1(@sUݝ Ӎ:P"hRN痗R)yclmrK/OrR18g˲K) wDS1BRRJ[J ;1|U|j"~S Cԫ.#w!mۈhcǏ?ZiA$x:9'LC9%8\Qz5Mӏ?~awm5qjKYE0~֚s.FZ3+`)Y""Rk9z9w@"9gj)D)hmRJQ>wzPmM3DuMi'vӑԶm]9wquB//՜,!c"OS.Tϣq!_Xx:xmko31Dp` `9n@,2֤1ծN[Ua꼛織U,#Rb!QYeGnn+3!x@duqF0A$,h[t}Pu0_;oU/(ܹZsέa[*g<٨vڃ:ga֤T1Sm]EB:p2ۖ2:r;oOs9Sέ-c1, Cҹk6ч{oٝ"`*C<Ͻ~D/ދ֪6JsCmۄҙ[k9 ރ X-18cSFG">=0m"uڏ?~ަi?ƐKݮ7睵ZGPk;_:s)c5ޛ`΁H:w](0XDXZ[[Qt$Rav,;)XkֵZB奵~\@g1P. I )f2H.AfGR٭5\ ;m'˺!2_3/G)zN'YZ/+\ER?Ӣ > Cvx:z۶3CXks?AڃM)jQ#[kzlۚs:,4 ZzhE @i YZum ϧвY˥df_ir.X[͹֜sѕRya(%Z-qh>1Rjt:1C]+nﭲK__jZۺ.s4Fo 1aH)MӸnw\.5c0 5ZkzricU)%mɧOr:s֩AiawB3S4:C, (󕹯Z[mqޖZc :ٱtPoP "u)wO#5j½ZU)d}I ޵zZ#Z/$c(][ӭ9R`kݖSȄiTO\WcҦKy:>7aǑbڶ޻qiڗXX[7NK5gCDVVr_Y0޺n)Q7LZUE*E8@_]0 ]ERDEZ¥R1\J=NXZ{{{/sV7@8D~oiao蜙{U9)3Hu(y=~SE=: NrI9ihmcǏZLHeY4u"?~IuYf> NadcTz m+sײX11VѲ½✫iqض< Hk-?N2urN0hM:qSʈ =r:kjM;-}@t|wwFa/%k嶺콿^IrZPf1t{zoKi$-u>M_}*D傇oKuDRUQH_uz!i;z8xr.v@D!F-Zkj5֨ۮ^=m{zd`m5}MZU|Hq%R{2jۺRj-trΧi+4s|:BE¤:Yﭵ7D!83HQD,$8N}յZa宓g"J9<R tfikf\U]jeW}w1­UUyY۹:WJn0!rzuef٣XEKdBݡvBɺ)奵:;z;OOeYUqdn5[kNڶ-P ;@sG'OӸ,,s)Τĕ޹Zxݙ|W8Rcsu9 Mo{D\.\Pc 0{G}fkx4>~sM9R ވ!JNiͺIˆuio6NSaYn9mRk->e]/X5 U~~]WL3R[ ;?Mnl>|xUmaL {9ܧi!amv}\9c^CsƘ8>x!Yo]גֹ̠6"b!̺E,XgTN O9}{r]qӱwѓKsvO.j[ה- ";E*,VKʩRzKw$ c<@Vװ:m8at順 e г CSkx3R5AdrN,l!Yԙ0"QHw,*ѓڪoi[XҔ\ZȐ1f۶-nzk%KOikyUs뺕Z{!(9KB$@p3uލO>]7c-s=)m"2cΩWsr]mM5Vkm3u{'R+ h&-/ZUIqk=jry/~RʧӉo[kuFU+4&w6"m14 cXWkOyn11Ơq, Oܑ(CLR*1'm[zk;g;o?~R4M̐S֪Bucjks¯Q%2EvnZ{}G[ZzoSB8G(i%//6 rC𽷔ֺ ws)%c0 $}kKm9יDH?~Q1ֹ0'N֜ufU]9dcd-ROo̼wu6z 'gN0wUYsf xy%vK)Rew^ Kʯ|]7]*릗RK5Ƭ 20^/5.z e)wYCojn4Z[SkK9Dipa^27"7 j°,u5.䒼*Ru3K Z٫uKUD %9g_.W/Dt3s`Qnei]Z4R Fv0ChXdYX֚Zq]9Y:ȜNr-!8ge݊!!m[muZCdᵀXPKeڪ!\$ou"ecJO~vky6Emooua$3Ā@MvMN뺥Χ<9R*EZm-5[y3oRB NdZyOq>t|xz:cK)<I)tìx5mXK˲.b}zz_csD-m,)LӨI14</,J!Bk]-CνVfk-ĠaEJ.RkZ7R+gp`fAI0k1Ds*:k[gi[)-iEfLu缀(wfD޵iFR1U(-@iya8O˲ZwdK)ޑ|5t>?\шpy7Mn֚< a'f ι4MZJﬖ{c >Ȗ6Dzz~6d޻C`71C)EO=${o Օ*km8)AWhU֊.9"^RR]ew+;>M8Ǥr][m0T7}(;rIۺ)B HH ,\Rzb }ܜ 610[kc0W}!x_[S%Ou4ZZk Op]Wa?wN7a 4Epvgƺ=3oJ)Y%4ՒOSk;!ȇymߗg뼾94yJD)*~_t#ܝSVt{2~!c(")Z%G{(scA{oMiQ9DꙊ!I-̐S9^^S9x7wVr_}pv5f_x\MyjdP31&&DΆ1[w:襥^=@u1ֺ-mT8"zܙz٩5K1ijVmd5չ]`#֘( C!xKmi֯8^k N"ujjX%\Ҷ!nb8_nۺC!RͪR0R[k:ejݏ}G}}ޗZ݇0c)u۶CoT;s1ZSkYoٶ;Ӗ0Xy9cqt~m)ksaY[~:r8:cb\524O8iN)r:eB:uU`v*9,2)eYA:qMӼ*p{WU"n0w{yn,:eۖʎEdkj 븪>>TJ[-`ṶZ >}RQJY?ֺ#ƚ%18w@HZZk덐 "^.m]ׅDJhXX_BMWn)mRw~ej}{mCԧY@z륖2'½DX[0y>(v#_^_sT}qZ0q%[ևaPgkUWޫ],hXjp KY">{Ooq>j8z̽5&B}L> λZzod8:]ԭ:Ck])LqλbkԪa8N5_ױj\Nx~!m^iR/:i| tXJ1ĠWQʹ27i~{{[!:?uU pRkU3kVv-X]9{"ZT |p&}tղRw@QԴ0jQ ;4Fgu}qR1BTW,:Д]ۢnȠ6v;˺֊fԅ!˽a%cunjQj~F{9|9z]%mYʹRJ qKIo%\8N:k}(n[6UuG<yZkMqVDu&@BpDsmUJcJߔoGػTEmF#3uv4G)No"CUR)W__. {wN4Ϩ* |/%r3!SlJz|bn갭 3xo&m5-p~zڶ]3<]ֺ3;7iVܶmdӺj0ZvƖc4O"mۺ.ϯcܗVJp_-%cтJ8uV"ZbԟbȨ2 @JYlFHj$vEM.ƒK*u$[9?<)e2H鸯s)Zc bא,z+ RUsYjm"p)wݳ)w^ZBs.V;iC3!.u4z6Kn7z|+eÎ!Ch5WF@缱V4RuN 4[%o$r{(fcPAkX%`Ii%"MY50WC1yڕD\dQe@0\k[ks/==k-94!N{&|+vL3u]t.:MhbAJQTGd4#]sCun-'!xDL&CNHVI"ͷ@Ob I 4~c%27@QDj)\z2zr-=0*-w?SVc 89[DN,ל̉tE-dgsq][v?-z20ꏁ;Vqr~7-ekmQ5TZsSg/Ɛpsgb- i*9tīYz.Wԥ_/"4MyGӲp%@tTzRZ~_J `aZ=M^Jyzzv^WGGf0knKVޥa 2!e^j͵:*^o(׫CAyr Qowh{g7E.D.C dE #螤pk޳Ha[{YC:9czcR}Fܹ[-0(6BD q8ͳV"Z8DٶI˲)HP!$ZSnNioEZ aYb Uq۶"p% ˞ah,6a{CԙI=(%jeSVq:N "s˲:^^_a71vR8Υmۆqԛ5#ՔMԆ t 9 %wcL~{OajԼ&2+Xj-qȠf=?gç?0MZ_wqSY]Z c)ޘ3RhFDz>aޮ|.ko:ڪsXJuህz?\R1+Z-8Jhs9Zc;Fc!Zr)GHu"0U4z& [ʚgSk-dk/9m"*wa)pyjUQwJ'(OORӬmK1'0n5&VH}H%v8?5iI)QJW? ʇV5.֪1)mZir>KٗgZe)GxVa䜷uֹm4Z'h6ޚ#1w^X9%'(xs.D@] R˪-y[+cQ%>avit5_-bD5b-m[.UcC4jXN8k6u]aYkuwTki׫9e 7s.IPՠ Z+pSÑ"83䜯[ki wOa!QNYPVrՒ/CP:zg23RB <;g!h<39G w+c,9$z9jWBϰC! !zCWNw6qK N>U1,~!4r!i>r]}޹ 3d𘇰IC"%[8oVKiV570qYtj9gV T޹`z+'km>/;XjZ۶toE&OqXzRVT7V~@*P5t%[hgrAXZ[:F:?)BDyZw00zѽ mBԐafqZ6Wk-x_w1nZ4XFiU4 Qy[+ l9#MXMwcCp""utQ::ִQk^=9?vbIENDB`bzflag-2.4.2+ds1/data/purple_basewall.png000066400000000000000000002444051200563112200202500ustar00rootroot00000000000000PNG  IHDR?1 pHYs  gAMA|Q cHRMz%u0`:o_FH{IDATxLo$畧 ^ bt!rUbIb*әٙEIH,7*\6`7,vݻ+98* FFD|xd><= ^^_^]l_pϧ'{pp7Mvf㍃Iw>\s{';ps{V9d;N|py4ݟv`db|?=q6x#dnvr7̶G;#=۟q  G;]Μ?o6&[܍pxw<\eN?ٟ Kssd8\O;Qo3eqoӸᨻ/x{p?z~;w'd>:3ˣmN$psapoݸ9G8 Cs7bNvvӍytw˟;;9Nd$d[ i{x!'X``C{7>os^?Gy1g fx<2h0 'NjSp2cG;[[&ɜkBz|dINcf!~`'u@";\̶&#ltoWR <&dgAPqE~ z ]0;nm3[^W]x ;6xg fOff]o܃ v@d3'x]{.|wn(+f1՜>ه g>sW +Wb#ë?=9/9<_% :sP;>;#>܄<]sCȎ}$ m 4p?<N.[+ݥ0n]0 pZoD0$Ď [>9J('%s Xñ>Fap4·lV7G(|6p8`.@|"s )d9>|Gw0rmM=;wnS-Xz+ # Gs8Qvq[eqg CZ`:)NcL&'(`JKAW)@8 X{+.rdwpq6GdI>e~^b vsM7r[~!)E<חa/r&;.AO_qۍ=~E =돏QXF};[~o]z}i7^cx WThɻǮʠ{}8sJ|JPdxޟd/Ie,"1fRAlE'arXPz7+ ˇ6'. RBI rGS\üsSOïw@9RZ\2Hi#(?!>dG.F{nk2u@ 4tkY 3O=*;j6[[)7*s2X!|^_GE#9Y4&}E}R GRIKfCoovڌ<8/κ !D0<#X3V 5;@'wy7)@> ?`RL xf>$WnayxUT:4$ܐ \I wЁ7o>,sr34( '0b裖l@ ==d0LX聫$ 6{ρP2?U|8 9Y_0Aؔ{~ ((ھ7]Z;ЎQ xp09GaH c;]rco\]|2$8©rnቜ;Cw@}v*?i K!0D@ |jp٣cB |BߡtyCS ?I )ZOmMi30>Ư_bG{@?)?9xcb6g} e*껓=W˄`tC" eP.ZI @ D0! g 1Hbmvp:Ti dhճ>r\PbA4us e^e.(?ى W1/G#c.#ʰ_-a  d a3fvk q8h],1; PaH`xQyy#zP@5W\Yx })!mHFPڸ^{?5C.: u=>9GbC4Wq|כW `mwq!CBi ߳m@Gۃ͵ǧ%?\ch$6>_(22D `">P;xApW`7JT6Պ{PAU [[ܣx>KДըPtN9Ļ=vxטIkw+SV0^"חG ؅99h4 /p*0gZCwj:gue5<7*#_@)MDj8&UZ]B.!0\;ro9.& z#-*I\p9'4n/8WCq qDqo|3| ܥ")`T9I (R_sAzylOͺ  ܃u0T#K$l&8!Җsji|װ"NSlцO-c Hb3aTx߯ri@;d > q=?8ߠEW hL|:6:{h@^xq3aՉQfsިoc>jl'g.+v8~qy2 rx='B_D|2 4@}02{=̅v3'GD)>. xqyuJ:CX0 6ˡ \iX( 8qt_6's|X&y( Z,8:yg,B1ЀFe4nHZ}"Z<ޏ^οX@GsBI5jɡ~ ! 91Pd`Z:QM\1jdbVZ3BM;DޢsxA9'U U=v%A@ k.Ld"u"yEMJ O8%s il}<.!JԚ/O}M=\V{xo{o6RVUISO--k!Mf)~:hJ3b)!/Ǚg} :|lyr8vP8h!E)g OUnRm:;:l# :"@Q 9=:1U>`$h%k$162DL6Ӥ*b?1r+k&[@#t(V7ah(ߪ06(?[fԖ'^<n'dFt&tF'r_j⏪IҀpa0I";sC%&7~n< Q3A& ̳l1y11DOK MS}+csdK95Nˌij 0|:z_>Z˪Fݜ6cl@ Q>x2 ~ؔaG2)* fP}4UJdŷ1/5"A87w3F@H"Nk;sRH*Td(j1zBu2F~ s 1=UFWKDጴdj6ɼ3@0;<*yL#铯$oS&J4}2܍UCyc:U#hWxAGrL1*mwVۨ;ܒT G84m1sr>`!sIxUcƕ A^eC;GGfhq'_P&٪J| H0'#$|: Ø!>m" g`U~&L>10b0AC?r[MlMF,嚈:ul˯mNȣ;'^7*k/XH!au 3DL %,}pMp0yx1Xp x^&rh &-Kyn o%JFsvO t$ٷa ږB=*pM@ҶʃoA3$'tzT*$a`faA VPzG]3Mp$1{PH_  9'ՉIF5х^>MS75J:aȰՎT6IjRM*_pϗJ4zLӺ#w\z,: jLPL2!LNFKH}q@PztܓE!2>J6yT2/R! 9UˇeQd6D3B Ma-ҙoh1D @@8.t- .uhfX6oorQ%}; ߌ3eif t媤*JYorqts>FYhC1 l ?BS0ԕroJAH@hTqRW 93L P'iکd`^d:PB(eju ]H=~_b%Es9Q U mr'AKn2HG$9zKl>Wd!a1a,',~fF?f"8f}k^kOK-WGΰ#= y\yX?3 7, !kqBA|;, :RwViϕs0HB_0̞ 1q/- Uؑ:ˑвUЫ &]iE8h@ h0ACc`B0#\>=,|a Ai@Ƥ7S_I;3BM2lȴƴX`8j܊ tt5?GQ/g&JHN-t%s n;ޠەa?=ݑT *Moi}u+tRXtៅ @^ ¿.Pu`ޯG]Mފ"mk(*Lir@'J >X /͡H2d[,u)5iUbU{x\N6T6xahC*xSL!03!Ks?5-v/Lm[ڏw @2'L̶V JԺo\%/T:v8<`GʑIj3Ҍ"/m;(hUFÕA T2R˴tSG[̸A@:=t7]YPK*J[~z*m qÈOc,q7"RwH3nfY7ͳ3L#xH-,Qp+QD=dXg0t#HL`h#=*<t~ -W-zSѸQrL_OPT^clYi5\%mzoNtS8GOTWL1(!gΏ^K!js`ו)_ 'ӮB};3X[p*k[A|dUHG p( scϐrEي9H0&VN+bc@SGltS0'`VM6]bj7F]vv*2o"9 PBP8ٱN{|dU(չWc&-a3*}/Xc&Oک X_;Gc0 sI5V o 2ߚx'BU#[?;gsL"2(7l9ʹgS :4^abWCMjR3oPςwLiAn4]=OQ{GHPmSHI1/4{B(,Wtr|EA{23bĤH2}=떢ug=GZ~߻VXj%d :Ч=T!  ~a~r!xf ]{T>>+LSLlCph^:T"3# +M576ZZTR08]ZӭmUev*5D7̽S3 #y-yz5W0Zo N4{ L_k]3sk}IͼdNR7nh $fOvOK LZZM|&7351_+*z#+X'!eEZϤl( :,Z.FLASnJ5$*Nmn|dqvS(VoW œ@-r4}K+c˨>~Ta26Mi0rgmXT501Te XlN<;:3ܓ̘͝aˤK#Hv0(\+SߛCon`AZŧwS X߯h^1`{X]ڌȪ*QG].n%>2܊X^Sg#̷{nnotkPE4]gbM/+٢h!!֋gjJϖަiUTӷ EJ6ؿ68[1Us\2]i`65" ޾ Xm@al)8-X,~UUJQG@(UPL;[3\q&˞eDBf4Yj +9M|lrr/fTYv6߃Npferі@O2 XxkQh h_9b)@Ep[.KdLMttɻ,V FH!+'+Ơo(Ԑ[}pi18t&ҹVVˆO';  ^h @62iCj|Jpm-$D4SǤ6=el R̕fN|(APJTCrҀ^vA%@!&ȮS剱al ϒH:pg:`X,]rD1л>˯v$]41un*WXp~,KFfS~fk[y>J?H|ih9 B1cҫTo`v*,cl~%+4DT3tiѽQ5&tE5L+.4Ѫ-eVd?"JK7M B#Q7vFmH!Lem,4Wܡꌖ "gOom=KhhY_lPmWKj%M|5F-aW%]wc/EECp5^YˈF&h}fM*[05pk@Z97yd7΢hP=bi)߫ 4]& 3|2ۄ;!| f9\)@tm_y%Ф|o@*f$MώWU˾n38Z]N+ĤL\>pA 4OM:4[hNywp7 +&QLAHA\vg**3XWl5lUhFV)'ǎ YvZHܗMF(<6⩀u0u#ES4գKGM軠!<2o``ڱ EGPP``CctYٌ6uRښDƽL!3p V(NntGo`6uJ,@0ŀjJ riUiZ{$W E~!(2-'Øv4av#GoXgjŷ3 {VcO#BK&l' #El7fkޛ4H2'8dž1|z$ԧbxP;ޯ,*}O҅ vG3e㾦\Mޒ3gs=7W}FFXk"s,KyP钱i+TYNr AB $|&2jD{;wa`YsE1_g\TvUaqF K2#Tܚf2H*g~'mF A~ZVxMB{Ljt^9 ?9MYcUL,;k˹.ij˶8IEw̿Ht*4Fk ,R?*(TOOwJ΁5 ^WvMQ0PRWqRHʃ@}@8=gl"ivm?j͢GF(E3f׵581V"սósѶ;bgc -/ޢ#AbZ* EOh8c5:Ll6ukF1OʭJ!UrTک|ZgEv6 M%j>٘9+R\6tr*Ntȭ"I9ӈS>"ö`JR9{K 9>ap\}$tmd6ew/>;9|z|p}qj?Y {6GDP&D-tƛL|Tm$ bz+ϛء0?^wgVK׍>R[f[f)#pTp+P5O)nC]8VF굕hNss-lw=`r?Gcn10*Rnnois«_ku)  f@RpA&Ltk=GrU*];T La@[єetXM3q؎"U[ad2ePmgmtcWIx EI]o""n~]@DaV(lӑw̧qe}\m V{DgĒlo|EJ4;""}tֽ~d-T,I0N洏 S 鋴)*ŧڝͪ mS-~rt{!>"Nɯ.ެNA:2']:Ri<)Ƽ5]e7zBhy+TN=/ SAϒ?פe,뺤8R>x[V`\D·B<;Y]o'ӧg݇,Y4☂>}{%ג2խR8eB9# WN. 67}PihgYaƼ%`0Q8޷)1d>=bfʂС?!=HC}tmȶVtMs _[v\}MTX&ttns84"6$.'ps&b<30M ͊5;$$wFδZ,@RݑԌJ~8 ޺E :;]%e#5c^tPd#MP2r2r-ɑ;mA.S4{ԚLh\qMRyZ]&b dV //9K}i޹h|ІC8f@nMD |/M҉&]Ay0u5EW010LʨԴY#gq`ƪ1$S>jRW+OX'DLaZeS ;nn6TホNMj=kW0ش?5=XOKw5}c̺i^W6l-(DɩbfH[DaZ֮=o^9F|!{(ki,,HJ%Q;9hQ+ LPpf< h>v W{Eڽ[h56>*+aj U>:XPӍZW>EFFQ"VG/LRP 74&-J6OɆei<\kHnV@g)q .!9ZV/5K֤X eAK\OУTړJU٬tE=$&ӚMW#MmRzlגn>?ZXA 64#Y0i[_kcܦԢ6 l6_&~XދkC0{[ ߳$,6 Z]\jx6}FҘ(4MiLe1`nN*'QA JHHS qҕ)MV}Ԉ̀ҳ%+fU~>(oG#?NTlUUZFvVQld B *s9AT ]ݳa5W Vr&hG@`q_6BFR_@Z^e݈r$hb&Min-+c$YUMo~|;ōxavAfLߵޯZ6MrBx2܄_žƐ8aѕtMyD0Y<Мe0f[}) p+ή@!rhYFSN`%'3NM3;9MPى5dE6M3kƩ)-3M7LFAF*ƕ7m {=G:M*N.Ƭ/ vL0s؄-N&5!Ewߔ;*v~K(JsBj4GMN[`.f_|HUȊ^Mv ,<"2=pbsQfncDkIJZEne9@[6g+dX=1T4f+ [擥=I*ő}^v1> R=F T.iߔ;^ٽWHb=RͰl"͘)u57BY(׷v"H~"3Pd8.qw'<ĐA|d( l60`ɺfEP:e+l=o3Cya٦!G4g6PW3Ӳ]uoF=۪s=OEO俌RD#XFKV@4)CJàYuYtgA'vPl+lD5 ^k0Y3,)sLO[L۔1ۜPb+b. UZhtwU*%]K"Ytk|YQbzk\& %Tpt8I4oKLcN^`G-JCժvz|O2]~U|䲻ht+):+LN"\ʬ3Ĉ0~_Nc&6_Ԃsi-’ZLA61΀`q+46ںu%^껤~=e31VW}29E *gzrNf|] E=i+.T۰ 9Q5==Fi{RFǎ?mthN H4;J°aZtV?Ƣ8Yv7!f Lk1Ml@퀯L2:@:U\gRM hҏ :5z_f`"dR)׮eQeUqGp[T1;Ͷѕ-zQ0xE^Z7.9AFs$ݔT[V&Xn[sY`񗱭J@3Ad*WDh=5RU c YMlEh? zҷF2c3Ԃ,hs-ʪ$? qq9#ܹ![fUm[PA ɀOnӪJKmH6[4]Mh-f# : Zi@*I KTx PL? .!0 ( a8%^|BUKUiQT&$+%]b;.Odm|EPO3FQ|o&I0g \zp[oȶ1ۺ~3v\߻.c R0\F@*&5YhbNДTR=p=Z6FƆȄCTrk_F >vz?yY%@Jly2Wt~g8R䛩faQ{df~D۰Gs@?4O_yiQc{eJJ֧hi.m{]:Cckm hLNu :jЩt0f+wl** `Z+gZrL{]EeO_sDÈ~ḻVPA.%`O"oV}*LY|AGpi&*W l(''V.$)j=%+I~l\u!n֝"r4'!ݵ T~l}YSwuG9`|i2Vkm,LF4/;E.jrn'Lkr"坦WW^w[[LhY2-W+-jv4ZRV[kzXd+d ѳAջW{zB)]pz5+,\cYWG+ _>la.Oj;h9%;jXͷӌfb5|+6A,0:P \ׂ 63 3pf|ZBuY5?emK KU;i>4{c&+MHFmkUth8kK# ux ؕJ[zW'2 WNu[$G>h)}ٴ ^Hӏ\CjϕmopT4W2(uE8Co8R+I,Jv]_g~>*쓚aͪsFX <&R7,ijӐCwW].(Ls OO0ƥ`4d~ 6I~;XvSj[dfBC0O\;(|A2u0:wGqIӫGl7{c†ƞd,G.TXS#YЫ[2>1ҳ"WYdQd*?fCS$L9:9l^@/4u1Vd 3ެܠWv+k}N>6OXoB!׹+;KwԩCD5צ"iNB>:F b)3&5o)qhkzh6jet^UAJ4b(M_PهL:ig3,+ɯbK@HREL0o*F2S\\6Ad DÂrp6҅rYJPm(#5rUai'CEgZFuΓﮆT=8dʮK"5rՁ\ۙWnf4aڌ@I7Bo#n\ܔ2 ki|~բ]BT![jnh=iJJP)4]rFuT*4H rCiv!SuxBR {LS:OsHm!cy;.1 DцjZ;UvhٱfWL5r=qn}>UnVvƭ 'vZΘ q& dT`*T{:$KѢϕNv3MJ#{޹{oG0.=q[|[;0kE υ;-G]۵(+Sٕm d)OݶOe6kmsr ^p$?W\4ᦢN zZ-O%I)hM~ JwFj8L]EbaLy2(ӌ &wCNATxpv,MCh,t{fIN6&ڵgj"j5f0DWe(h@{/E ^SЙ =0֬}u% ɾa# IHl ذ~-BJ>V\ 8Rzp9|֡bm$a2itH/Mj;(P@oL-vjeIB&hNH!FODh~u $N>AA ;~lT}-\BU.긦\nzR2ҥcγM?`ۨ@M/r-P/LVr+ Hh $+f*L(j&`P\;Sqf*v>%W\Kun]u}(}HcP ,sNTyr,[(G[+I7+4ԩ³tǶ梚iʂw+#0dpOQ5JZA- 54*شx U;9hsٹ{C*potu4HJV6Vx2ckv\lgk\1zQoH/`Lk;@Ut&*ZEy=X-GoAv^b4ۗ#-ڲI5 e7 {ourfOB{Gifi7m"rme* n4f)S4BtHZ*()`)t!jTfZ/ZM_CCk2K)StVe k{zK5%a H;MYͤYsԵճA=uuJM08e'TOI¦LCB?M_~0&oЂ>"'2[p9GFmҺ*! Bj,;mo_YM/l R K=M-_;(~"7?skĴU]ۣa.,֔X7h'kU$S@Ig@9=5c,!0O` ut49plPfd!m=3\tȠa-rYG4dIB3\QB4.2:kN,ž7jO 1鄞EQkf9:lnŻqaZ$ aWw.pYRy>0Tܠo%,"C \S3CW| !w4`qdkQ8ķ|߼0m_ RLM blh2#)alA7mEuw6˒6m[S Kg@1K=PCe*\Ke, H'ަƚ8lإPk jўoU-RFY 2ﶺsꄞ\jr$iܠIQŕ3ҕo^vYv TFԦ+-djH3B;ʐۅPu3됶+IגCk5Mx3mӆQ+p.МNJަ/, @)!d%Q,B`gZm&};&_57ʄVmќfÚ6s*!$Y'Yʞ/ 7$\pLs.Js@Wko sǰ沪 ĆۗΊ^aEzU}&ܫ3t)K~4џgA.HԓW}Ib[^6]xt)uaRˮk\xDKNhJ[ec"5Jw0Z\2{s.O"l, 2|s`}hG `zGT^b0~\\Vh H=#UN$E2,i,4Ы3Pwh;DZ) H}O@C,&v/:LKƃ:?Qf3a hF٭޸ΗwBbsl}`NU5 [**\`bxū~#>hV#`vXRRAuv:ҨV \ /'UH v18Evmm'qlr<]8LrTװV2V# 1j-Z(uخ$j5Wbœ9w|+LWAӧ-Kum䁖dȸ|VlecfҚF ejݦX8V'f vTڥ;f;i:x@pƳpa"G١1 שVF{ddS05[1>\Zoka*. !EȠQ-KE(=U)vq놝~{ ;)&fG&G+n+7շƁY9Ġ8ZMjUY$`:c" tx{YBE ]ܑ#wQBKaƊ/f)_N[{F\찼hG~y獄=S b(>l^ Jpmlr`7ig3)Lg􎋥U7D&%AwrzWi"H:& d3Bqϒ=6.<4eze<u_PUGpw}6zNmvK•ǠƮIjG9e%l#C?E&٭|I=,u,Mh)Jr )cjޔvUmd%qvx2?' V&/ޝQH8bw-x$ZAH9fS)V Y$$śVmt HLJEEP/ ޖfdNնZϧ8jӜ)ֈ7: һ*Ps*]$"`g'Y"H񯫆p*aT;Bi춍a7:UV֯buU[Mr6aƞ s4+SEh,7. f 1`z_N&0Sbrln"9Mi%d>Xg#~U[4t 5UGTK^1S`@.vs֟T]-bz3UgϽՍ6Y>K;xNs_{oSS5]2`id:^VRi]%*ꦪB.}JՌ_e=L;`4 6l.>ɋ36(Z2ijʄU$;4C@ Xo^IFZnfsS'rՀYG P+6J2 ް4 /|!X'v;mzwqtT߸!aM(d&vbbI÷zjR5⭵Ǻ4mQ[}+|_ڦXf#;3>Ծ Ku`LЯ )ho?1F={<4Sۘӆfl6臻csW1{d}ޑ5F@x7Ņv=2RUS޿mDOeL-:DefTg"|[Kw4kB`X2P\HN x%e͇j?DMu*+Ӟ)xKnaJLʻm&)}ʧVW[>n6y5`Dzg[@ed'{!9\-ȧyx Fj,DZJJNBPBݣB]LW6f6\aA(xTcd62zU t$4^d"HpV) iyFY߽zzqdoSFfՇNګ0xd7mDw*CͲxk:\ɋ&frk6%X7 Ճq5c[[*hjI<uR%aW*fI,LɼG5fC  pنkcb+KtK;h^2,U'#Zf}^]Z:4%U#4=Ъf{&GI]4"2Njt#!8*r]?>8\9;蓇^ܿ~~/?I;kglCv8xzsm\~OO> _n;wf}g/ٿ`kta$W G./L8]xpu~뇟^/Wܖ0*~Ʒ'<֍⣍g/sQjvgv3/Gǜsg9~~|q9OY/|q}}q> r}^agz;&iW?r(IOyG_<lgk?_|p/l<:_l݅Ov=Qo9Ư_yl__}~> p+ไ y1l<30d&|mKg/IU6^\^A_?n^LBdPka1q<eʘ>;Ř,>xOÙ 2P Ӯl qCB:lCTgxcH! %v>;| 3cT1f۽b*(˟p>G ?K€8[q>J!{ I >zfbq0Ia4gLFǁr?pg929aL,8ß/"qx쁏 Ã_hit@?@j2^ap/?y3|En W c W7@ѧO~ !N|r_ۗW~탿~o 7 ٨w*#@|q~;kG;'D `a&̌˝zV8.}72o N`lrGVi6y.>+F<v3D RA'c?r3Ctt] <@[84LN*n;Nisa ώמm\?>?J/06hi-3B&=>=]`C0޼%_&̳қKk6c ! OPW{u /.?{ÜA/"y{=9y+W? Ǽu<%ПC:Cq-A<)4ޅ<Ɍ _Or#| rv?Q)]Ň)Y.LyXZ^2\qֽoh e- yQ9ĝ`e(2)<r W?@H0bxiF$xbT\@3TF/|4pѽv4B̘_Gypx@ ;^I# C~6 Gp7#sTʀ)|>;i@ ap٧!$i;Xgl!@jr#?Wֿ?,Px@'rv:zi_} ?/Ϸ3+*h1|31o"(s"66pvģ!D#gD穴 I_AO֞/g./_NV ˏ^ LOuZ>v}Iq&TIUWx|* lW}lgs_gT)RKVlv+ 'vv?Z>$439pSz|:ZPf/s<>w.˦ 1(1` ̰fɊSƨpq ~NR΃٭!G`lJԈD`g b  |=l] ?4a )[d'| Es;pg1hbNc8eH'/Ԋ Wt<$2Η8zG> j1Pdܵ,'y ʾK/x PRdZjY*4R1d0 ;sDgēo@s!$/U(;П=FMxR'548"=1^y.-Y%O7l_~Q79)ᤅ}ovҢE~Z·|B$Ex"$uH?! ՛oGr7>_Pc4  ÷*?;7vWg ; cT8e*L, :ޝ 8UPТވ";;b;vӟO5l6md̚Ǿ$WY>y-Go ix7o8Sm29@"ɤp7O#C|rZaq>ο_ӟw{ٷl KW߼}xNYOeu=)Mϫ% *tG'ߺ1$8A* zHa`H^3!+=J5GuT; S|r\MYWVZgz^b1 t@SI<WJ1d "UA?=KO3誝 V=xopq\N|Ѐ7p wtz^0 Ӊ*ظ*!D<*?aniɹw-EyWj ?O?/| }޽9"py"ķ\/ ud;j3p29!6OI/uANd10fPA>C߿2=ah/cKx)3>PiW0ϡ>P{7SX̠;78f򣰻o\#zCߎ  _~P,3=L@4ozxT]O\kZ1}+!V#|zPAUo®]vzY|З ἕ|na|o~q ixO_;x JzH7EAb+KGBL2gg鿼P;N27U]VTg;r=_p[Ōkܻ1~.Ё\!&|o?ӿܒU1|-woMl/}]fb·O!(F'qH}?#+"&ܪ+<}J-"K =ݯn7-ܷ= 2J1{Ģ\lQHֺ#$FYT:Ra'4|ΠOR䅫k F1>Mn9~1eTLFRi8_zQ~_9JU.d<"r~ŗlO!*Pdz씬̿GRB2n ^O />ATJ$G|5{3?NVWЗvRq2*_o&m'ˇyv:&ŵu;~nro_-YIV鵏~t#zdƷ\t@NҖ/_W5ϓo,9|֝lj'…$ʹ_ T^cADTc~S>$@ch?#ٙnv߹=,h*Xg47 Q9Єl<1 Ζ}a@oE<?8:="mNj^^-LX13i-@>I_f4S~HuDY޼b%=%Fz7yJ?ql/fv9L8-~%|=o;nA[:Enؠ\_=Y8FPOV+;9S`0_~>*]Y%{w_Co'cLnf&'%%ݣ@}trD"B覦ݿq'*h%пok%L@VTk,C, -XMp{>:`’t(dCaࢸtnY,HԳ4$rQ((@,Z#-lbl(gJ4PTzr>rQ(P.'gm U{N4*_2Ef}?%IyPʐWM;3*l}ĺzsux/)CjPܻ~Ho vUp?}whPF*Q ut &ԏvpοUn-W-KH&vJb+3gߓA'ߎ!$#v:~ȥhvlh%(/;FbvQ,N2{K6F:^J(=b%+᩟~Q :o"[^rŷl3:6UU dT;+r[7@GKfڳympd?ճzk[=&٢q#9eHzzȾ8tEz^?\ӷ2S!O;g$U'L|PTߩI?rfN/ IsV&+t~(SWQ"m$i#f2Rlk?hq`?$lTd$.r "XC aޯ:OeLLV~_#( N'A4X '܅/TkgυU z$EۥRZub9`$vAp[^,*e RL~t6-$߉{B~3wWMbzW LauZfG&V;۞ɨ ˸ ]h)8QI)9qV.#C%8Ol'I|e̟}P3XF d[S)|x#(h)2 4=[KI~r*x+j2sg{f/O]],u tZ9S"8,,'ߍ7⺷Wx.(yhտ_,@߳" -wiSM峽p{.Diڌ]+qO- e#' e5'4OHZbwHw?Crfs4$9]jw%U}߅;H-/~WWyK$T_[6 0l|ߗr J\~|$cu|.({s;L[LQ|+?V" 64gs:`HF9'(XAO^HD{f\S*YHf Nܞ>޻=_?߉Stfo|,HbCnU/$ianSʽqԡ׿~k7:>Z^R>(i[?iBM6uz.{N?]]wi I/&g ? 'Cw4w1zHф1WmmrsVB@1d;xD#p !\8'Bv;4uAǓhHC=ΞO'\THa_J.<& sBƮs?zߟ%7s o$X9eVWt@!T{i}`g9|sNUʽ*wa IMJoQ~=]ۿ,~E=Z:O+2D+BQoj1bDzvr7L?9o_EUy4d; B Gs]ar!MeAY1^FM% @=9j+vDe^ 삣ˮ>΋NCIa/Sj[ s?O,JWߪ.|AG}u}^ fA!ce0_.RSt1sW%?z{73Cgehޗ#t«Mxp#@XDboT}+lT*=IgkE E ۳;{&I2yi'!oK!['GQ |ox{Z1X=tZާu !ѯg5t%03YuM0E 7 _Mڅ,Ӣ iQ.FNq#;ާvM1[x`%d=q;@=Hv=Jul|&T-YܒPB箵ڳ o؇ r9dw\l@Wp4.uLw&H @Z'n @ھ6^Zp(j@&[y`Mh_HRYmAzmSD[ѯȬ9Q: 7L;ذԂM1@FDr'֥'}s{=$`W3@rsh6?υePwU~gt wӧ(c=F}LIoyrs $^xjدm.`^ ^ :ZK<ͻ; 0;$ӝnE,m58dRKs.>x^>܀`nH=ϜX٫z$;O`\1q.V=کEZԧh yKamy Ff8K~ 3mt` ~Ԧ.З:g~NT_*5Ė@?!)"{Xйȉ&UV±itk1ՖΆx.чkr1d\1דKsM ]jH3 u!ľ ƥ! , ~yU9ܨ[ϭ 1)UKEEFG~RԼV80i~Dskh!ۗ&y 2@0|$Cbm(oMK9Dõ"~w\a4ww Jf4uƞx[;C@u/&C'*ԭ] h]l&#@CVyԺ5VPaEoTn2Ji=UCN߰(nG;G{>A??3+[J3= S倾YD<,oHH6KI~: yhʤ Үʩq<3s!H~vXK>󔯵9;EI2 2kVmHkwWtr!P2ҲyA^UAH 2 4G$<,xz;,RCLC8Q~q' |;XBZ ~L6(\{bKY͐ɷ]1_ 5)ʸ5CA 'FYքl̼c:^Sj jqQÕoME`\ޅם$s wo)YPw]1xB qﲘgmxUs*1WqG4㕛'ZN7 tiE4w$1s:pG38Vd;YWl#>.nfEh,^3蟅[Iv5(N:z%O<+/ϳ\ )ќLiAҳ>I\01*oe<(^GYe.~](1X'WAv\9ke >0@my_.>I֤)D?|*W%[ٰV;a~kV(>A.sQW Yu?!c*傺D,\I(daė_h;8֪҈kOp4vCt{Sy<#R(h9*{7~PT^`sc!=w)>yUR2C:z75hY_2YrhLL"E@:'?'P}{0.K~f㭎I+OIWō[p?##H?!uK¢o(hrbEp2QAC|cIđg{ 3JjA[_ BvЍ8żQ`i#0`zc[ 1N1*0HP{Ec.Ac8/M!/I{0+ :D8T$nkc =Zpѵ_sMWfVK V)ǃTa_3r;_/B HPG;Dx#v@|Ak`81Q$aڃbtء 5]] EտXVpv X`=i9MZ 頩ezD(C5MΪ'SV48Pp1 dzx]`pц =^Ziۿ[ <og5M.H2KlFWra? O _0Q L_PĎ4KĵMlsr!N\^mjɆ4c g"`Wd#5wT+ LvK'?5NnpyZ#RANsmghw'$Rɖg0=g9ckDQTǖ}JA*sH?Rov[2J( @iT&<} ŧt-!L\E1HEPt .ZÙrbsD+;(PfJ:f /CŚ:"p$&-dVgHA./ Hⳅ=]~fH&,o?֤÷u/&@3B ى&$YVT,+Dٽ" ۻ8YĪrt3O>|>xV;h3DӛF#ң_Zv9lBsPUU{Ó)O?Kcpeۮ,dwǺ}qQ"X= aFpB/7A}~=yaIP[Z MĮkn$Ҟ7yJ) ^05om;lmhkDf5+K}%Vl&2ZQnE֖{8:yeEm֧Ђ/m<in,.2AG = AgHGCbeEƺx]E9<8D4ӬFi-0I}c L륄30%jy#Cʮǵ5#@ Sr~zx+vLzx4j=IZt:3m(1ܡ_Q_ՓgSٕ?laO;lvSZe&@S~_~#.` Sb|54!wӡSP/ }~8ăfa_s:>8^id5I۱-oX^(1;r"Tl^U:IF v IQ@L.9PvFIt o~.̽eurw񦬐@k8v4)ٹ]mPyܡPKcDŽIuwQlݞLt <@hb\}lY =S8)Șqw+$fd^ {+ 5,I~wDoys퓬Hkv7 zy/8i&|##Fƨ^DkJyhR1c5S ÎX eh<ؐYaoswV%<`E&W{Ů'JmI!g0 lG'(p. VʜnYS]jSe!J@Iþ`1) /¡wǧXEu#%jglUX#oj/L{/xRy@%R&<- ]?74!58O z a"X7Ѩ,'[♽=rJYԾF'] wĮ?,ygh`l?n]nzbT}#Ԍ#?JLu$"kh髺s$x;4-:ֹD KԶy)"Q($kzI迚ɪ7= []Z5d1L[*HK0v'HuI_7Y&T4PՌŢ%e_fmDWݵ3y^X>9Q8<5$%s5)0ԝW;Xc^PQDKRЃqׄ:TRZ1_FjYC*b7_}gHل7}',!}|SחS.%svSio_hLY:0['p>sud %m#wY4ԓr#ua n{|rͿ$Cһ%Ka 9U;]rfL "ԯ[=Zpԃa~6WjDC~VG{ 5{pӝôl" x;BYS~A"L7ONi])IR獷CF L?c>$>GQG|ZJ_ %pAk' ~v)X )@3v2-Œp͂lx[67|+4"fȢW_yݡ~:Р_9׉]bm#=+]eyHB!AAջ9k&đ#4]OVD+ʗaP8RAoL@$43&g2 (x*J ڑ+))4%B1պ}'2pÒ$eͯYbu'1HhW5`=h9Np 7q̰DU&qd8uŗA^hMͅ\#N^=$s/)~B- hH dbccaHug h;HjqG8<'Vड़&6lC]6GObrO}v~ #0D:=>"ޕTBػ<ѓB HrPyAK&[=| q0'爅f%?1 9Ʒgs5 qwr^۸ D})g/@ kifS5C"9Gi >9,!D@+ֱICY$I?;$(H co[VL3jv` u1sȧpP Y ?:?+IŊkJ$4io$,C[ynجh@;>Ebjg?KW}\yTzeo"o|dUDC86Z\6;˩:[-!DI|^֗VQ!Q:u/@E#[ihY'w0LJSfX;lځaeJV8q(]qc$$Vm4,;LQP+|!ۯ݃gv}BsH+A,rof #hcWWMt ,շN^sIN3/C)@9"j F_A1#7{k!Dw$j7_X~"雿Ϯ -+%?A 9>tyȝYJ?RJGkZ fH_~T'_HA]lGܺ@_`+Lַ*EGGYCȯ HI$~;[Dj 6+'s!Gt|0&20ou&!s/0)y>!͉uQ!2;c㯺ʾJ2Dk=mS 8dloU2I'NCkF$5hsߺ3=oig4xܶ|I6@gWG[[T i|V?~~bGErJ{<3 Z*BB\UV*$3?6TiENIը y$W,wY *Ru#}F>PrO `pyxÏO`m\J__XµGzͭM"n [Q+B#i1bWRُD:`=v;Pi<&j ZÒJ&JBkd$ On( ]t77o?FV%a qȷNnzg<V,Hp =ۿOӓVAER%52+T}\Li`仗FN {EѾ{ﷆ=IU9p'#Qs`|öaEja8s؝T懲uzIR||vt S#pq<5.*L,R 0Wq:(W]"?G,h]xoԩ!䏃CNq+q=Y(9Sl8;%Z$Y&@D,5f (_zo`Pѻ9qQdߒxl箅[ϫ٩ (c-L"&?:UݲOwW{)F{,]aik"w"s+3*!Y"EQN$'HuIM9hJ0ܮ6@5Ϣ(U Jc}O3&iо0k=~4t]}K6ld5iЋhP\ a]B}Plf:Ђpl_-:93%^?v$0yT_^\S\/x7:(Oq߽ ? N1{FAS_>ht%J`eK:,#=лuПѫgx)( Cd'Ǥ? pˤ9UikT*OXz%- UX0\݀Eh&oAqȗ  8I7IrC9uxV0z_Ip 7mwʯRxT6ۯ_/# LDȐN7 &Q[|^"ry ڂO@w6s/O<,{@%/hX˖ ԼIշ'D w3B3{5p1 7CB}oXhH93s7ӍmYX<螶!5#ӐDJvwcХL]pP% FCA=Tcɍ2 4vQ>Mxs0&I%ވNqo.skA?ėhP&V5!|BL/U(yޱd@i܀NleWb¹g^"N;7{{byN]$g⤐&uHzP\2O/d<l cr޺nZ;g~TbW,4|M;ΦN{k@MߜM-0y寯Vkn^,zu{T!R jH N}"|. H$F寴L-DO~Q@wNݸ{oK2ƇyjGv ;1HknCx'*Bf ,15ڲŰ"͟q;ߠkp q(r a+-AnO$*UCء aNb 5PߩfMwMJdIBgh &P{4gnՠ'+1GHmiS +Id2eEBBÞ#I[]ssvma ~dR*7[fFnO^>a)l7]@$}wbǚد7Zxo]b?mZWex:#x@PSv([50u: y>"$fa/RWjnCatvx5;;eAUmL*)Gl@E ˭Ľ@_8?(/EeMak^I{Z1WSP9T l^ћZam0[ww؆IǼT#!^:zP+Be/g!2D\WRHzT $^Hچ0i_P7(@f>Yn`h 58O~4䯆}+?v5ѿkJjx{KVs[0=øl\Nvkϖ4F>LFܡ3lX6׏KojD}ӻFQ٩lgr uHسяK;V^dSB".pN/c$gA0b6TRe kf #jV*+R<꧱RA{%?J!ZoZ*jy.E=8֜Adt[OfJR _9,! ?}7tDe"\$o'Ӯ;שLj,ߚ:#!jkdN š+=eDW wKpw+ִ<j.噾҄ rRx!x'\0"r/I&!fBD͕ņj3[Ζaq@0ƫe v>3^Od&7DjP3lNwaϝr|VF%/ 9'K=N[b8<ə%C]kXb9x/fM~ $ "S:lq|O'8~zG > y3 ywKg&GSR+dOpfq'wƴ+HjT`QZߙ ̈́ %wa$ dT YJԔC:<]tA =ɽD[ԾDb.+byypy![՛b+1 RޠM43bO*,`} wQ&4a<6Fa8H֑J%js:$ ډ\5,$Ű39t?.գc 6nv$dI<7*AbQ(8us;r/-|$|ҁ!{c;ǦA:*8nĔ2/R =R0{)Lx&+U0rAI@ M7D=8[x4WdIJ2{a(>j)hV9?^€3s Q+?9 G+c +$^Vb]2jOHjk[[! fD):[kU+۩#z1^3۰kTp*a*$~pnw|6EV-/-6,?pre3}yWT\>1m[=O?Mئ}ٍR.0VǖM!P͊-J'7fsHeU=֓1Ӆ ־܅_NG:]:~FPmM]7N-x>\,>aMJz)(i]$4^ɆIvr@?vnҁ?HO8qovAUHuC :ZOɴFe6fP`"^8ӷpy2d:@#/h )5a |$\Ы왷B, y 9W0+2z#3 @0<} >ߝ3&wph\z[ёxIޛ뫇6pEߵ4dSIcȨ-~g3i%UdWHUFw4G|!iظ:&b$b%. !wLV}a8_!XM)?cO e=eWqC*-~GB8@dKRiž˞F +ct0irWIX\ ;/O{/ zk(HIJ\}rOL ~0BW#6˓y w;B/zm4Xwx+, xm0DvNd[bWQ,`}ȳ ~DV,!GFB:㭐9c`.?SJVȑ @职½<EV=@: UX݅l%h4OJ?w>kɢk逦 \Ҹ~ԍȎ dód%lPJw"頵Pzt3е3[#$??|S>L-tEr:{)& B"˱K/9-`졉 hAsx;W} Θz I㲻'5yCkT~d7{ DJŲ=ŻEz6x {)X0<rj6 RS=\5&qs -{GB,`^~Ι;_tzbnȾ=H 4whx2Nf2"ڵ \=Y ^XqF{^G?vq_JɬlF"-1$4 Vs& 8b"<i.5UEyj0.sv|&I Fm]A֟uep+}\ԥ ##*P&8m6ԯاZ4#sƨ.+- 7/qf/` K,.FX?xiQ8lIg!9e?sB5魬~~1:t;;FtQbsl?BH:S w]z79'F'@ޞ^(zΩ/.Y9N C:2-GgMHC6~|x bmf02ʇ!%6 CF{6nLuK\ ̻s\X-7 םwϘqӓҟ@ޝm1 3;Wk2;;#Mrr~ R)/ҩU:}f N{[icѭ*PPRd3^:&Rg"wy[ 2%HQvAz&zSOx]QbpE|h^{uͽ; LIf~2#mu #w,5_ +ysU. SS=#|&ޭ5(T58 RQД9~p@麂ƚ1SC/:'dp*[;'ܛ\Č"n;<)ʄnvMfIÝY"‰ķʫpi|odG{vnDX[k3=5:л&,>!GYӄ6k{p/j͹rG|) ;sQ4 Vߒ*3e?6hppL+GtIlzYF> F1R$CŻ3T0 z ͱL#H?gI0F{7!nq11hyD1E29I^2WyvMW*6[U3}o'CU$W}s;-Vk{{;UEvxI03t9-݋4qZˡ䘺x([Dzj4lA;I1mP_ !V3lw1.1AkjNqjp>`pS$$\O hzaniP5W$8kb)Wh]{* +- ! tIDtޞEJ?ΝךּڳbQM`tIhD7f9>wQ->J"٬R_|w5~jy_eRo?~!;@J`)%B{&4O%%Qz$N'q`/qłȝR-)J0t"1 EMq?'Mʧ` czUBOְOL9*4[_`Vj,(Uѭk(ʈos.uяSR*1e#熪Q/ɮr/ۣ+ehP+1֒2mC)@}cֽSAFҟ.F'rBN'\>.xXG+]kgQ_A2,Jrb{tGlJIt~_9y=cmoe{oIrD(Ґ~= I `ԤTz*N \x2]Z@)`U{&""!Jo#`r>5Z#M;ZXmGl+%L,Xu`-hZswt_-g΃0dN~0߃LK ߨc^(w2fG\~԰2B8=fSedҸ=8EZRڐGObܑTOmҁ F_"йCm̰h%'mdzBzBu|jZ ƿJx2xT`8i^tq+`fˤzvIJEƒ&+|˭WNAƆXZ޽]=m"FH[eEfϰK׹mr~CIba*_4HP*Cnu}hAnku0 Yxj)o 9]0s+RHT~]tuh(~nG\7v7={Bq8-o RWWPIi"8uK >U36sq΄途-3 їZmhS%2z, yu`k6}gwf4'H68_Z ìf~؁8M4 F⋢%(Gta"kg0u%O3;wEPskA6lnKTaĚ{y߼[La͹W0dHZNNXAnZ^Pr9 <!;OMO ,tS3[dfGl#g/|g|u Kp-/ mϬd(vMUKj^dݔ!: C΁R8'pHh @?|>ek.䬔p7 I^. |pO/<H&7ayNHȜXTA62BǃɯjH{bPjxrnz'#6Qp285H=wQ$ 9\"|Uq¹յj]UNjxo/>e.ꔜ&:a5,8?Kkߩ]PsVZge`W[ k$H :v3Qa[}|Zl/^Za@_H fi: fG!uV!{V(tce+iVSWtD-ߑK;@!L?+C C_~nT3W'R; HCg/vdN1I**+$•,zaAB ) bn$-]Zy&1{?yn# ٖO KUA.P@0'Ƈ씎n!>?v yV>^F{\^οK5=؅b,[j>- K 9T[QMOtjSУd?ӜzEC.tw!ӦϩGC1e??xH9}pAIa@Ql4%Ktlwz-X+LM3YPD/3/[kܠފb VfI5:K~EGQɖR~CA; ޳I%vg['+f#{(n\;= +T?}LK^mOv)~bQ.ҎϞ'^`} rwcnz EBjUK5`Wm8jЧT=K S5XY<[z @Z(C!(e ŅWnj*@ۥͪie0}L>EF/dNT'qPEquc|, 36L_^|ȐGo{N ^"4atr>! ʣt$?0~Mx> :’ܼ.:)Ǟj[=r{Cڰ!`͐Ը(} f[K-|}9 `7nk1Vzhb9k,$ SPVX7bt'-\jn9EI &5捧$!QUT<[kcq2T| $g$j25q\Z-{>πFcțLH4]1K_mEèc)3f'g=T9f{@o_?F5 D|O[Z[v%bl:z0_B9E}!ReN/ƚW~Ճց\ F`r9gdHC4v [灸ɪZ|ɐ `3hgQ6)*9@a;oViTG26i`T5-x KsrԶ\}{`CͺUixbɤM MuZ@3 GPn3򡬳,9a?^bS&d0ɻEs^' 9ux "~c<o4GS\s?(];d פ)_?.lNuB<\vSӊô \+; ۾I(J! 3ɛaHi :~'VqnSZ]O:#]3H0` /PU={~=ExA6Ev;wZH9EICDtm߈!)JRb'_ވ i gtCv(S)h\ l]ؼm{4 s^M?gW{gss2Nߞۮ0knj d',$,J,Y}ĝ6q_G)АKN"2/]Y#㏤vL>*YM!S45ͨoQ_vg/rT&l:?i>N͖ơn9oA6'-ݍDRxV:j/'ӽyOKr/K>jȴ mԐy^M ,`Y^#0|(+\COxRx*"*zY>u]~M 9t `„ Y7WJejVxyO|{O R}3kDgs3V80)BrT n! ʹK`G7E%J^LP*ЪKp7Y+%lh"H1nó:e!'U=?XG' !!.TYDHvNnHϦ/^߽ݙ 4(@KG:H׋0`zػtí؉|lHk2{|'5dj<4A K`d=>KO;  LVW|Cb.{0zTuANa5sleBM18%C}J)mh)0҄/` 9y)7c0!\Ԟ;3*-/N]+S_Y.pBfKmVɭ\whzB KSp:,{Gq՘vv,P΂=+uz:j}.J誱_JC\_A1飥irv۳/0sׯ3]`~2_l.cwW{⥫Ϭ8h?dD“ ᚌt+Tvge'm@yR2G\ EIdpɯ6?, Z̒ovq*bAw QUBNU 4vS 9Rا v H 1LsV[xs\=Hf@{fKQoү$2#Ed{/z*nAj03/l'.GB]x]Vp_yZҬ֊)'_y-)#y'0 ŁRt4eȰ_i/;(<"P9%5_K p%NlLw$M׭@Y:j`VE`u(W"j/^ޗjkRmM$Œٓd,+2PкK#.=@:R"XS$Y 0!l4BXD۸e&{>r69W}|[x.!qXNΈuC)\YnE#Ё+2U+uG ]ۻmV{0b_=e ]P!fIa`k׏.g{.TR@/\ҏ?}`0ꓚ.xyՓ +]UJoLxs17 1ߦ Kk!R7삌2 ta?n܎g\K~q%Tv !tސH1Hʧ6ÿ8ܛpip\8X$Bywf s0?.R}%pSygxU{&?v2LF=q%C_FG@ xPk=*_Xٯ]M=3Vb?c}^h> TZW9O:&5؈h^Ђ=wxwet@;(HYrjM]O-ܞw?vNi;T UФx]YV'-?㣧sg\5$X|}M*@G獵zbB߻G񡒰Ѧǟ5Q7d=~4Ct8hiq.QXRQ ?!ImBr>*.H{  yȱg+'JKZ _ E7 3{@n' i`#T(LI-?$4cP~] ԐkwmbZbP|"E* ж`&B ʎ="qxL7vb4XK+dqȚvG2%pӪUO F1N.O9"o#erw_4R,d2^4oa,Y wy klRK>J~f:L;/4hV E/PD.'EH^"@?-xA A"%Iy7':w!^΂ J`])4UB82Юy#=#9Vۂ@kx G]n@}{9njLHqr7+ZVbuU=)Hn:Z; zOkӦ*+ CO K`fABd'Z=?w$=pp(ɍrH9DEd^r܌m3`2~⾍ShM6f\+x4vL.w1㫝I5 ZM?U6`[)ʽ+,vwM \X= Ad#if,ysȤ~Cּ$>ma.њ '*!2"Aa F ۡ[J~ᥳyſjϷƋ|Kg^.{gKD.sK/?||xL{^~>ݑvv釮w;}ɻo<޹=W߾s㝛Wz.}7s}΍_}ۧ>wgoOx}?|r_78}箜?GG^}ۯ>ϝzw86޹WO?Ëo1_=ߗwL;yoF 칝ξs?ޣ+Ω.G u>].o|ss+O?w^eF_ B<ݽ3m=1޹ӛ{w?'׺ѥH߹Ιn[W]y;tLo}pln:i[={m|͇|{N ?I׺̒Ko>ztF]$tT?EﭮN/^wvL޾nۉ^:[׎zL$')@]$߬f_8_}/OO~yjWcbg_yGLv]J{>vۓwςkt{` p3=wO?O']T"۔x+OuIӁ΄St{t@?RVwa/ǹW<#=.{7= "}Iym t+D3uWw釉co`6Ǘyǯ>LӁ[yٴwΩ/'xRcE`j~\WfdsGt_*z.%ݝa$Aܸ@}?m[.k[tW_~#-wr~S*t^y{]ӞwF ښsۙn|W9kݸfN)iKO=$HX' q{N, ɺe?wd_j}g7d%]5=w{mD sLO2;#AYқ}^JҢ: )r'iAHd.bl nm/>yzөgKOU]n\}nn7+Y_~pk}n]*'lJu9qLނFrs #5x\7;ΥM߂|:_ݹ֥{.1$n{즴0w:>a#֓v [M^7O]2Xk7۝_>~ vك}v"#59HUwo\bzw9LÓ'Iy*AN4?š*z@Qou@ ۰Ek[R{oK o ],}Τ/i#igvK|tI3NOܷ\t|nvuϿ?hۍ`_2o5uGRW ڷu@}pGwkt|{2^O$ѣ/ov%O}O?}LǤme,${wdrOIg, <_"/?lL{NXٌAI.y?"6t{eq:lƳ}aj>wO'=($i|Δ"@ C6:I8S>g)=a]._Xv:w{ =&Ѝ(g{޵ }@+%I:tR-n l'm$=v?ʓIؙ`V_`f5goMNA=:B}Ϻu~oiR[OSjUz^hMwHHBPR(-V**$ }9?ZIr1{s|O_$MR{B;s٫KJroIvNydmAq'cZK֫{_{-(I9d[ϻD$5?uQ~p?{h_+le+pt=y.tf<)AroûhaR*!mhzciIEv>>اLC0]CQuJjKw;FL뤧<\AzqmyT7]O4]^gUJY,q+R:Њ/Ba+X_(31Jۻ~n>0'oNt'~WWo za7N yײ^]^'g^`4wE }F/e WX"8MjE;( 9;) ^QDG:H!W|/ˇ)w=ɭIo@/ZR?I!>S0;; {7w{AO 4鎌C<^d+\)o/uNF3I|"( '(P9qG&ub yHUK i} [џȽt4hQ̊jG:۽Z @<-vL]A]8v / S.Lw`(P$J=) :ڽu,ûpӁ3CCHBޓ6Α$۬BJ`K4AM+ddIyRUX0P\ܟ %J ^){g]\?񱰂e/SY,Ba*R J`> PWR)>Ǐy?o[.Nq^_:/:*t4z_ITH4KtaWx. K* te+%%'G>q+g:*h]-fdeOV!\~B{&`t HySW[7t#hg΍\Vϱ/tG%} XTs_m FEzA~ (&'pϥؤO_=I Jxž.i|.Hɒd_{w~ ʹ=)ɔfFOh:U?O~!$ۉT`j|n/ *Y `;-MYnTs`D`w@FPلyܺ"sum;z%%͢߻$\(M\m}ݫA˕N 8&QHj; 5X0^1 ɦpGhIyqu~#=ӤiC|wx(d.3@3H*UKn+Iޞ~dox$é xR!l5OR?~~a%ˑrsB~O-XWi~ pK3=)F J%{wyMBv8£+DžS#OH@~}D>@@Lgb'a;Fud>L*>mF:wWf\~lDE`mz[ z٭(8țh, NPF+ AT8ܿI<,Iғ !70(UP%0`E 筵}?ė/>LƱ_<o}r Y}&9QIdK]k5!N|Ӥ{?RgXG e/yHgiH0'gӋ3&d .'m$N'Bim(d c">g;Q($1RuFwdw;em3Lw$pB M;IfUN^us"Ƶi;փ;Cq%RjKp3#@P:Ol^$u1mLs66|~ $IxLd nHġoޜGH3xc>`L7Dta˛Eѿ$tӁqíO9s׳|t70LGn<^kb?Vpp1yf-heb֣7{+ū vc 4,II30t@jFU|/W % =)E%-Kgdqe"҆ {>΍DXA.,tc]Nfv]蝫rRUY>Nc$+h|Ѧ e޽ ,^w sv;K18֞c^ aC.v.Q *X3K.=óY'W_N^?|HEl }˅s3K: dP뺾n_7= =W$ICnGdR`~"|K* Uܾ(tBt ߾+b1$ě zod- >U%%-^\t B꽋AH݄Y{q.y`haBOhE7cԲr(*cLEId}ّ=u%h]a]IUW&*0]10>hO J?}mQ'~UGO%B*|VøRB]v а+I&|w6f_XS)r#Q$E{(@gL_Bs"T\(ܧgn^?J`7ZwZp`I"l,<@?h~ H u <ڭbìA!I1$Nu.Bp{'+iwp3ꥺ*!(L-=uA)tlH$+. KDI2IQ)RRP?AmrI'ȓz5Yzsh׃++V{0dҔ}e@Jtŀ͠ IN…EDϸ䆺]jI{-'}p?Pre!rh y-;(+xrziBr XнbKYE eN H}o'/֧2Xhl}|&+vl\*kvhY$m5Xο bL>&l(2sN ka0e _A%]IZ\nv>&2juSDW\.G?AŁvNp}H7'X?5:km߾ɩMJ ~:Na`#N⻌yh}i rWXTPݫ.kDŽjBA#Ejݥ>ZePp2 3b`[\U="K ZF~INW9Sg9'/ O`?!ZO}oz S5ZT *c*tT^vVοb)[0V6W|a.-ܦɽ@#*(E)rcA;ʃJn>.mלl\Bo܇[o^fN;+QPu:|)ջ푫u.7O\G:Ҥa oӅyV"[4޹\-,˿1 HUt]Qr077ҏÓ@sj1_+8p m8rtWT=>x ?/)(NfOe_'i!)@?at3Ӂ$2- $RV#hC!j♯ k0/DstSPl4ua>>/ܭBO R0>Y)} 0ebt.52#m%-]@H޵`͐t[&7Y`:9xi D)7~,a %+PV^bhg7rb:t Tl +ЌFk={Źl;:C؝eGCi{ ` v}{Lw|ݴ+G1Z@E/#ilJާz%1!U?VX0t(Ev@itW`@K;{Fohg$(~(2R5yH8ч H;72ktukAV|O*dkCf/@e uʧ" `jԕM}G&8$f?߅ZLMc _g'Z[r,7>TߡmݪN 9OGnU=+/=~6v4C(MK>0)FiV_2E2/|~)ʏ\[(P! zO×2rl$~PsAFWtδ B0%g;V g0 K&= 4c/F7S?aheеj ho Rŭz]g;)ܑRiY^X*vbś V{]s;$dG~wBR|WsEa;`pY܉L5Gf>'[k k^CO:`.%o"~ݫyrٮP^D{7?{r<=믽?Hb,gW96O)i[j ~ze0f""sھ2TOI(E/D_Íf!>(yn&X vxI yyiR0<kc^{޹zy0 :Oȭ9QH(:Oߪ/_ڟԼU3[ЗN甑%HR"; k!8>9t3Xx3<Ӎ[{}[/gHVa2d㥑r_JqJN]/hm{}~W!xĺ65H@⢯޿LCnɝkD?( v+I x6D:̆@ƈE]#4_+X72ls)DXn*rNhNBp#m=}zjxo uW[lRu)Qg7XK+ql3<>ZykϽODT^v KBĮmdc_BO,_y5qH`Âkd:{hH,%ӣtI^%I)@+͢C]{khh‘ַx1RʮOӁ^>[2Tjg_+gPm%Hi?xWGJ}.xA35 =W 6RT;w#r@j>@LeOO։|cC|E>OOЭrgnli{"FwˬF;C=( ݢweZ/a Qg:Cb):+PVKP댥 \**aU5@nS-MgTOfl@mNP_RD{S:} }@ 5;(Aǣ ޞ(C(۳}Cʼo;s֕殮I/sbkkggTfkhMZ bg5~9_@C[ {e2Wm?Ne!9=|,2ѿHI\ 7C\/#Z"Uix{HXJgRob'+Z #MwS$> 7``>3qDZW\+>EI䜗LiW aA#{?IܸtlaG6khܫNtR }=OW_j;yc\jE X:ŹGIP'\T kq<]$>HSes81=k d҄|E9GDp^@SyvdT(-CWra~kM@uU*4MQӺ=nVH0\ 녦%'ϷS ׉^s.&$]4twL6-2pV:铩d*^b$Q'7H4RrAnHQ109Y@ \uD!Aoh[}vwt `& A??\տ_ ?_9w!mvkHbN6%X#c?X}*Agge&cnW$1\*O67!) 9B~@;Nڥ0wU 21SZzpQPk iq2Oe ' }'mk/_ %MzV0 rg@IBُ>%n|f5$JqyDKU0`oїnA>b2x a~.#ȸ@=OLJ46 v-,Mpog3T>7 ;3e-4qA2c*na:U{RQW0,%OqOJpl(~CC)`Mc7;~Oi)HDPT-8X1nj("6UG 5L+Hl 9 eH }q]DsjB{:o P9˜OHnfF|8Ə8H}cY\u8$^M@ ԗ*<2Q-WeL@OhΖCj&J#$} I{e #3{>|])BVKd]e]ܮkLDu&?RH횔7,(Ғ">5% gl L$-"x-m%Ux)yAFk=͓=5H. j~ѱBLJwr=nGVjJB:]TW#K XJW .LVs7Z SE,r'%$lj{dvtHpPBE%R-rO6t cu=dyAp]fE>*"<^݃ez/:<~Wu-;x)%\Ɋp0`VHK @ qqotƤ X{Ɣč~?P+/]!sm3ty=ڶ# m;tM:1c1z!Stn} OANHWʐ3}ޟTKP|{o<[:` ۲Jǹ 9( s8M\x| _͖k0,q?CQf*s寊F+Ϟn$l8?E5]CWxeZ/ s+>̥YIy;{Y!t @U{ .KV9`m4j O+*>; =侗|FpS-4LӵPa/<b:*'jHw$eyu'>D`OuR,pu ZM߹&LKPfݹiby'郟߻9wvgn%"~/as bО7B+r| K{y@TwQg]kB<,.͆sjjϽ0Tڡe,:V DEtJo۫GY6lSo!V ƧiH Gy 1J&r#sIÕA vL?:d@]DߙԒTb'@ `G_zc8p+9{.8PQ<'@M @tΦv|IXTLYMi 1{*rS"螲tSBLj?mũ~wR:xj0l@RO5OvJjkLJK tbH5*;53|Pgs{b$"Àȱ;gxkŃig۳Xez'ѫ.~0(NfQSX@"BhΊJa]w4"!c#9'uMir#IS,'#d30&:N)TA`Fp&}IZ2"}^ Uۘ* 2Jp*Jt"etV$κ{: y 9|U?ؼInִ{0ZjK[-'Zq.z cE,3Y~,+j%* Pń'T 2:RW?{f~:f {ҪqZF7dqBuo؞r n=~MH"LJ#WJ 9&O#4ЪcgIh?~Sov-@ rZZ"?q^ mEzK2  nρ?\BF̥ ?hZ>Z5ϻe/O'?I*D_2#[Ά>LO\:O(L8e*ӚUa4 }TZ߹kG0[@: Bwo ނ)l:#%ȡlfO+>ץ6{]#b?*hIZ!FH' v=e2NL[9/є(#['WCFT]̯gsC{$g/~b%/aj=Կθ3[PQF|R(6Ww/ ɪR{ [|K@ VEXgO'§t@EO0YD .Ħ2I.!_m+)LBY3v_JRj+5Ā[S.Td6J]y:5w.Y`$7cnH"'_Q>dS2ߝe$ELO9ӦfF}t#',b7D:sCABf_'@ynt~QIlmT9MDMX6h2KS~C7`GNrb@^pƺaqU9[M: D3=$%Z`|Tlh!=.+Y6Z".0vfwV_ʍ{ J_1c_6X2rA X X/APtK.$>K1$ *,53lܻiI;rAA1I.Q6740l!@ңw\XՓ> ɛʮ=P(@T rU Ijǚ2PKÁ tuf ,A.L§{  )ۙ\@WDg̭SwƸI#8Eo컡Lz Sd>IQA.Vf!U7oVab^&YSh_oRvB1ŋn_M3AގEwW+ 7 \MyKzp}{f;C)m\GM/_=:zdv?g-÷=qx W:k| ]K+֊:YFB9nP@Ho]Glf11A+$bk{G(IZi`Ћ?ydG~Nt⒨/?Mؠ]P/SdOv$#J呺ԓ~S9w߽OmM̳[fux .Wpq:iBPbtyο ݈hp|Q]LHԚt+IS,._E/+{U? 4͔֕VaH:  ~*=` ۻjt%:w3n!3%JoDMTg3WZRp G`L|U՗^ $[k/{@f5T+6ZmP%f^D0G&`w{`@ O͡p@%WivBۤ8|#1Ρw? 0g|OzxRM[[Gk@߶,=tDQDיwCLi}04׳%7R$A2G&_>bVøMppۯT¥Ue_؋ǽLJuImA{ЌH-g4@XX^‚NjF|:+p"ˍ51$OCPaI҃ON 1x&dƚ㌛9?*d$H*gu?<48ⱞw0Ma"@vItQ~3EZ&R8m|_BLGv^W?yҐПM,w)rRCzoKKtA5iIL/Sׂ7F\A'01$ޣÊy泳F}ŧT X0%Ꙍ%8w؋ 0ju.S̿,>87 z#5(7C3=!ݖKߘR➈.0TAޔ :\x?qQEשAVh0ʑ (+0'ὲ+R5=Zh8Tؒ LhQ$pdTr .t(S13P-5s"?Z1,^Kfuoi~O| 2̓\JR x=x]0DbeXI{!G43kܗzG.|ĄKIآga-Ubp(j>MHjnh?aBơԯ= ֞31:ŲrʦzNXHݷ G}WF垣1 s3>#fce%cL$B<65B) wG16#ٔuw՜@ ەϏ9rPCxV9 Z ZSBTQ᝜'LɜFS+> 5SJ6cBry5XV^(*^y4Haй縅k{F5s&fCTm/~8D$2eDŽ&!SUuP!:8[eD /=@5]ԃaJ΄@{ǭ.HfI,kQ?ą_MK {~NS,'WPʛc5 \0wœn^M75েn xKzӺ8D dfAa20r/= ;'CJ4U6 )=V̪%:DVaՉ2"S`+-T.^G5LROحܱaVS#K~v\-d?Zp!]\Iy6'9ob8Й!sITFIoVW5cSג'Ӊ2'&7hC<4 &2@CPҮMy d0ͳ{Rզ]20m1{V5;?v 0=LLZk-!|O7c(GX4DȄ C5|arnoV q :}>P:am` QDijb ͂ R+$X∟Yu(M+hk4`Iޠ yo!,΋i d F<ڍd,Ri"h/Ж8ѧ 9ݦ+$;{m,\/~'y#IAL< j9Л>ƒ1X(]ispE' $q=PANJINt- fS'գ-DK>{NI|5׷X+'JA|8E-V,t_ EfO,=(PZ$tN9yzFZAnϢ1_u- pq8b5& Mo*ZnF%\zӥ*bYOs e0XvWɗj8-iDr{, dKrI",WLѲDb\6p-Q~}CAߕn|rɱF>|F|^a : LHd٠J.[n5y{c>Ik/0ANm\C~xp#^=`x 5PW14^hܤ&"W[8Q8S :aMzU= _7% Lg0 P@M;WU7.md WcsO|^kG.E ЕTʶD1^"AaGNcÛ)nBlRUz =hY5^}b1<·,)O^Ll isꜸH5LW$eE\a5S#ŭtmeyr? ,޿L)Z부щp$Ǚ̷O/5L:WNvv!X @r=KKjCKSs->{1x~L {\Hl\bbL'O ='|7\qL1\EDztʫBwk#2%$Ao*ЌK.lS|nW=rp}= v"O bT濚q5 lP>y8Bfɱ3_7r0_Ma{8?XOk;- /yV16*5?BvQɬJ񖟱a5Ppu6&$M>3}2;)d(}J. x:.ׅ3"mpI&j۳7hr_{'͛ 腶8Ր"Dv/'1j.|;V8֏ZIKשoK8Te^(F^v_0͕}ʃzWPC:mNijkv/vr<=ku1{r\Q2@,:o5WjۼQa' CXWb mZd@{`(5cB񷂗qV_(+,||cN7߆,Ծ@7JtQ%Ӵ_4\#7o93[ npES'Qm#/*`==h޽MhWH(A`l9RCHP(>hjO3Ձъ| Ms mu`Pc!B<fq4DaP&-ªb'Ыf"#, `Pf?|\C E$xfc׶*$푱*beq8Vusww 6|cԆ\V/ 4C _#lc-uOuؒw*iw.K%mb.VfM z)o N*Kx*@"$+/U .$ g\?׀]:62t R<0*c(߄ofV: &!90<(sdV+N-Z1e&I5t[3=Bq2">x:%0RZMTK|oYf+/3t$#ա!I^f=['7Y̙83~Ҭ]ȇ9ý6 7/[[ԒbwmW[.މ280?4A0ak\=bfcpÚsAIЩ+u"B;0ި\ #Q)_ 4K8}3?wl}3NBeWN-~ Ҝ\-g^hZ?dqKFXW2:`Ve]aOX"]ͣ.ФQvJA<1ˀ2.#i5| /_d|a5.VbF$\]L -K|@U(KwD}D>WQ߭";),ڢ-zglզ TC]SZw̷[=s^ 䄒:v-1 _ɻı!6sшXHt$ aG/|fmnh) P<=e7㑧.vH<0j(2^H4 !$az5z?P{ZI~̭a;0/)WqO8h\^ېq*L3ӊՀ;[xh Ey{:`TvKyM(f˳k wv徥g;abˑ~S=U[򞺦9{=s[c ^w }:^}ϒuYRHlog@К WK#6M-BfgajkOn4E\J]{]4۪UE2iڞKuߛ@Q^u#PF4Apb ptBeqke=B L4#)!j:BYwfqo/:7Tpq{|~Mb 11i#$k_hIk1ޱk@ql\3PSi]R>3IWqRWt޻?*&j yu&hV~ ̪%^jd8OׄlDr -Z|&GlJkVg{Zh,~`k7) 7Z'ô`P"n¦F 4R6ߢ^[hgK5P1<ϬdX\NE)1]{1 x =5@nxԅC€}0tGjv-@:$ҲRU[|zsH)Nna ŤGGzu{;I?{jEl8&fC4'swϓ>>$hI l3 ?6Ya[}7?EAқ:?ʡա 9=h`clЧefN ^,uHHʳ,`~،8 -ޞc?t_ ;̬OjPU`S" Ǟ+lП>jpwlpsO^ gJ `U%=b,7-Mp u1oq60gA,b儣OcιK'̹bL/yĨYo9ő,0ѩy %HgS$8#z`k%j޲޾.RPa;x# [~@TD rVg{Y h֞Yh?]:3ȌU ̱~6KݾJPp<3FSzy,r=LjK*G&|<T=wb9Şcb},)y跘tb}KL?t,Yf>O,^2hF=!CiZ` [[({W+0k?g])fmȴ((oNȠF7EΉ x6aVБ;!JpoI_,8WL\E3s#DN/xe!mݸ03 0[t 2T)GΩBi&( K5D2BY ?@؃a܎5=yFBfn_N̚1E܅cT$?:'ɬi+ jE.T-7`~S?xi"KV )tL"q)Bs [nEj';O>F%rĴKfE(Eszӷ'nQj.=?.N{ѨdBںU50^Oz#Kg^M[K`l'n0M/~\n'i…|#3a9&!x\xO~Q3@Z8u}]xTי7 Dcv6(V?b_M捈j>r>h DnbʠR M7jpݑ;p oA c0.Ͳ<n %$X%~OoJ: ]b8C&O?Nz?,0ƚQOjv hom;?TH :Pikѫs {tNOjyDJYV#4_ I.=nҀ$IP[eHZPrvތ_;.!`~ə>7Qr/ơ 4!Iv{^xCrDw0!*KACDb); wMIQ=GJٞi 갦ЬhFK$֣vx2|5=+,}2MeV- JPecN:d$$yӷmmhFTg-%Z7zJ]dìO&N h}ceHv.x<@w˽,z5KbVrxH~ѓKlT@h+UvM%fN ~H=O%Kd) ߘRnCf#抣k^.űr=?|Ơׯ_~.CEj_̤^m/Y25m݀ÐL\hH}x`^Ȍ[@jCC(`, O" Jl#}`=+DhJ;[ JP(v~`?Eh\;OT&?a1;6`ed=MR j]+wwn|Y[c?ku6? OܹdF6Y݃.V>06RعdWfcsw?Vqas @}΍ vK} ݻ߽{.E(- ^hG-o~Η[.)yGG2Jꈧ':Pg"L]i/ߜ3X}j{_8bWW &5XDD U8Z,Ua[Hauow)}?qO ӳ}b!|urq\h+_~xt/iO=Nvu/% b>+9:ט͚ͦe˻sࡢ7ndmv?PཝMx!H/ V5u{sc-=efѼ ??<9fr Pm5}ԱwBT3z *:n[pp5yw00bGn(لXk/D(_&b0)>/_|xLu ;)= B^D͚1) M>peIENDB`bzflag-2.4.2+ds1/data/purple_bolt.png000066400000000000000000000027161200563112200174130ustar00rootroot00000000000000PNG  IHDR@@iqIDATx sH{C5q+I:!!0bt2HH`Jj0`KI>)s9>*TTZ5@PLq^m`j: hl5"1/9[%&5HF%6ٔB980V$$ ʈ 1Q*0-jdEs5@޹H) s7smjż Є Ay E<u<$%TQ0q3 amVxuyh`\ (0@r\:B^EdA3’K5<fd+P'!Nh u"(5H0ۥnH\2(s(Ђ VTVޛ@Z̊@kH+fBZ=Pis{? /dhxiJ~S= :`<9w;Ai,@U2d 0%)P\OZ;8C~< jl瓢i<=1S C;e"r !>H@GB[=?ckMijZ] ALryCe=z4 t-0 7.8pH&(P9 5v;Gmn?Tt-0,t?kW2|>]LQ6Z $ =/#:N11/@C&b8 rYV @ 3kQȕO>OQMR^7n(EWxyb94`4* 3gGAx<[fצ H-O/w? Dv1dvCnMQ-n_/G {H^&g/ڋ {ˌi6goڛh IENDB`bzflag-2.4.2+ds1/data/purple_icon.png000066400000000000000000000127401200563112200174010ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧kIDATx[iU!b& 0%a Њ 1̍ڠW/Zq9,2G^&x䅼9yyu?ΩuAUujgo{sQoJӹ ϻO>~>ۂ?ģtIS=[rWWՋ/Ƅ >ڵ ?0n'3vHE\+s/þp /X|}Z{+S).]zczZ__uU.2ҥF۹;;3[c{޷DxIckj4w 8fqHJn*̰H$I8 7JX;bv؆WW@E.sThu8`_Y )N 1R57Bjӏ$>}gE!ePZ}B) T*T " Q֖{bDa?(i5 y:F1ʓ `@*6 'Nw:"w罺&4s^z@hk ]DEb8d90}g$ _,ᠴR)r?*`˰ar{lRʌܘh|3qGHwzzpCw`ۮ-^09(ĜYcπ@`06t/?榦r u/\3fO_0af (]~όOjUe~7h;`CIGi6Rhif""†Mqǃ?Ö 0j,.n} v!~H bۍgX׵aL<ëCY+2Zer:adN9UPMNJ:־ؖTj\zgRP'흞nt[#g8]czD)'lpĮH0LrK_1*FZXXmaV ) Gj$`s[d+iY@BI c!\ & 0l°ut@:_@++--LZ!Q2,PJJٵjXmPb)F7XkJjtjpȤ*P . -0MR@5H@K7jz@$ЉA!.ehnjALT !"hžQZk bϞ=s vz/ƍ֘R05Yʉ|kWW` #a4E`È(‚Ef*9QIwQ;w8۶m@6^Ė-[8YgõaKU$u2]3S)bH]@QWd?Xz!la=t=AL7fa`c wÿG몸0 5mMV`ac `ý^ Ie:`-ZYX *PJ8~ɸf?bؾg z><l38vX2|Tܸ$n{LoMI-6+"Zh9(v묲$8Iao0͈\F`PhHPI$"!7}a¸x{-~ѵy-ZZ1عc'v܉aWlSމ#Mߎ/q.$f h\ A V]bAD+ @D.S Kջ&tbrB) ;z܈76F!,`ppDww7ھcP/>:~2>zT~D fo1! ]%ag9k&B  `ϺSmIZ꬟ߵt!KELo 8V3|m9ׯ֯Ǻuۋ$XہG:~ `ځjB '4= X@3Ci w@0%FC Ja*Q;!$]Fi 5JG3Ŗ['FϦlԍQ?كq}8vj,t&"b f Н|[bG-S%HPql->C+ mou5/ū;ز ݻ aDC( "'-"f ]49RĨD8NnooŎdLy"[ vnڋ;]0``1W-o1Fox'YY\(k ߛri0C]K 97#IQ")Vja C;PI9P  ~O ]7B=;M[YW$<4;aAD C%3T.(pϷʝ`ˎB7@U N;Y|Hb:H_uҝL`2?N==n," Rwjvϩ _ :LJI0h–өW`'7Ǵ+FKָp+~Y/$0IW_+<6ʑ eKNDo#ws/RB8^b!@:R~Vr L95~P wA# Bg5B"!(7GrY6`N8hHپ$nH{@ĵ |h4 /~^!s6.@$HG+/RK  '?Qcl~γF[=8v$D@D _Sann(1zRQy9t/=޽I(sJkK+8B6Fy^2 (r[]{Tq!ּ k^U#QpKw (<dn;6ȃA@@Zk>۰ w" ~zAJa9DH=A5a2WSG-z'paˣs@;9Q#AQ)3>-53E`W1y_``ƟqٸYc:5aUKLb R蕠k4.v_]ۮyr4ބM7V|7aٵ7aaa! =tm|#n!3_Wa"S'`]\ ѵQt:rbTVkZ?yHڴm|K/݅9   O.e0"7c}V\7u .J45Q t}W|mic+@Z08oBCӔKqKٻl pѧcXƬiGf:GKS i K L'q; a3GIq,L[ta7]ClQn}:tL " r1Ύxy/E-N5)(VE O7061 c<}NC0 XQrY 6 b1qĭmB4&"AN'zWD5C`\ ͭhnmB˘0"Akٳfw8ihnr˗_x1ǬXFs媣.85*-{ JIENDB`bzflag-2.4.2+ds1/data/purple_laser.png000066400000000000000000000003751200563112200175600ustar00rootroot00000000000000PNG  IHDR@@iqIDATxM Qsɀ edU؏؎M( Pf pԷ&9vn)bUgUY'eÈ85jOb:bmǴWŬ_cvGd쐝svXSxZ `IENDB`bzflag-2.4.2+ds1/data/purple_super_bolt.png000066400000000000000000000177511200563112200206360ustar00rootroot00000000000000PNG  IHDR@@iqIDATx[Xg9#I34#7ӈȩd,c$037Gnf)fQD %EfDbJQƈEcܘ~>/*Zm~WE><.@\#],u XYи^/k\eiKc u?_uƀ~~E#]W֯uHJ6Q[9;q_\o3YW0.x1eec1vߧ+\# tkpZd$0r^[HjzCqcM ~;6Ay0_*"1Yrb\1c(c0n\Xp5a5:4_8 [b5"uU 6uBؐ`g}W򻋭֖{ +Sl99%Ki5Ke]5W^=Go1bz{e~"R`L-p;F8v̔X|w\gAW"]s"K0/%\ vn.{Jvl]Dǎ#_+gDd:ezWd|F=uFߘaw\˦I8<61Wos*PH*"!j'LQbLs人Xj:Tkk7ʣ6i2P:4D+q`}cƃ~q]W*^p.+a|vnH FH?oаDD憍:1];4J ̮]݊saGCYjv(񽒑pp!Ə¾C iBy|=VfsG0K8Mh[O6w'z{䊋mG湆%:1IuAwn[+ 4Kdzh  .} }=^7sec*u`~Zט p ohl:(!T⋆xwBGѩPܒ++"e;Xb  Q DKXc=i) J8/y3خ*]YK[sdJZ \&+3帀\q 8HLy-N ϱ : JqGlKF#xKV@(  T4XƎ~V}Usdo@y{p^zϞז˻51MfU-۱N7;/=*+0Q#y7xnMHvお}ڔ5X*Sl ,f;/>ݏgH q%Fxk-ui+Ckg'x5b$:r.L֧wG  t }h%^pvBچD p"(eW`#':^$Vj+$x ZrS6Q2g 7,@:)1DWݧeyW|$gj\)Y(t+ctg"-@b uMZTBL ~&Th8Q苼J/"IN4U,xD:}x/)e&J 밌la=eJX(p1ʨ5r Ã$ܐ"AMzHftV (akzY_{(H8;O7$3 dXQoj[6o(I`uY%V IoulmNգD޳EEޜ-ZV:^|e|0] behx ~\5, eBZRf!YY-y#`EA]QOҧAqCDsA>-Н )z̟@nX#y xZ b&g[D(\=CJb %SmﺚOԴ|\ts}ѲI)p#XC^Y3 dNlIC؝,P]a A>X9W2S'/Vi>ƋH/?MA)2aK\1-$is([*^K S;F꘯3Ia)≐} oEބ6C:›ӧt(/ h X>GN,`媏&uD'^n`с>CBZj;cLQͮ@w.~];^ -IyKה.o7iiL3n ՋHL1@yM ^KJ^[It1,*p):"+TAR^$N[87(:Ƞs̿2 cbC0.34AIM6`BfibͧGdޡ0[s6joJ =؝2ZG)< Fwӽ1=s=0(yk fR.G9 OpD>^u R+wTԛFjZ&3#9a|E$,\<1?;ݤZњ"ek-ڶbó=^o~hQ1&B$;M Nuq}AsEAyXY"/`VS-z7H=xLdV1eAX,P8Ⱥ 9 kj0C=8 w>E֔?.C_Ap2#'C2)>yhIt',eXQyy[|ӖO6>PZ8|<i&(f;MM2'K9|mZzB;V~tQRy)w@_ x C+܆XC$/Xhn3I#J\rSKk)͙zG5HI3;JUK 4d( rHnd)pb./v?J00@~NaNm쪆|A[IxQ??t;VPhW /nfŬ^PŬIZN`%zS, WHUÀ!v/Fz$vL}m62Mی,# de3wԄNw!ql6Γͦ:^XL#yJaex.704^Lqf1dрYc>`aUT5|Hx(ߏq̱qdo{xE<(ʆh54%q}9>MRx'T<%=ҭ=)z$)~?>'D /I> n9٤z;ӽ=wrStI>+0C$z_!9ۑ`^wT4fu;00~NF>rKUvTHd4;Qg\a4ܛd;ף{@YX< 0/s<>:Hq\) w} Mɼ5Rژ&2"U{|Y#ELAW;(qw* JWZ SuZWKs! `3bxQeU$d bNb.?$ hR~ 8aKa{ĀS\QB lsRdb? \v tEF_( Y6Iv#~!Yj@Jo=$ !OAsA!5~(mM6Y@Ix}WS'&pOx1C(PR_Ć-XO(2:̬RnWQ7#^2n2~"+扔邪RVTE8UT i njˌ>ĆK7px@[w3!%0:<w|?9X%Z iXu'!99 dHdJdLdNdPk hJ( =\(ud\om$cZ$p%]?L$g|f;LDw-;L?g,f—1އK#%%5f;]Bq3x zsⲕͣɍ+>=rhrBL\if hA߳rD XA0Η0Wq[fd*Dx-)U0]<2Z5fG̒-1k!~d/t-AXP.Yk"6ȜfM&qg3AkN+ >#t&1BVrWH(5PZ|zz@8y4qW`|cts豾dN%eb A|q=@7B@߷C6q=\9AQC4:NgCfB Lp0V42} +%}8TUH6XU9 o"x"tv%٩U.*B4*ͩHk_Eg߯"TIkv(_X~+BzwuN]7{YC37"l51|y7_#3<` EV i!)|5Au_=\\BbWv(5A*- d3,s! aֹin@>C 8U'jNlk@?*Khfas0ku RLHn:xU`2; ;ԙ;naB,ꌪ{Vd/PT/3y~N / >*l @z^"4o;z?Ż@7x޾3d7Rk.Hq* i I.?=\ u>?%T ~ ~kv|߻l[%rYBoA\<6`N5;7<C[4@qa9іE@L; 8g}'C<Dmm'?v:KT%zVu9|{9j\ZA"6S}rQ>kĿa'<3[ y-XT,, T$k pllr@;Fv;)H>lpL9Db\;P>6}6ȳIX t1lse#6v<ZI=ړRڜk/'Ήa 4~OI'Bv*o!vw:̳B3 3IR^:P4 ;UYa?¶OF *زepnQ(qO)9VfNTX0İ%N[9u+yd!A'2),r #` 6`MIz@]lլOjwB3Rwł Iz]d77HS:1Pd -<3dhb|a% $/s IL5w x=t:D`=_ ׺`zg",0mazÄ ,OUDININHS r_j;z;@@'[׏pF(`=ٔwAq|!+\FSI36gim#X_ yfnD91I ͕ Q]`w[k&YM&\%V>]|fKƜsJpx?ӿpٮÒ''$ +j$ vdXW(}',H?bYק:y bπO[DtNx1^Xzadvyp'xҩD%>iDV_2=={Qk+ɕ%2^bN4vo*N+[tyUƺʼk2Y\|o@q7F?fo Wi<rg1]ϟ>:A$ x='dv ;}RA Q['%dImPH1+|}wXwG< S}C8J77HoP=r{VKtDk"2]|p8㭱PX/.%ykLoR;14yeB+_qF f lL0^yEyhZ˄cRFN/x +ZqgIxW75y?/u^c.לϗPWfէk#VYrM ʝ8.IrΎ)0.wL=}oL+츳 iSCJJ빃nB;o;|cQ>Y CbNWkXeO$/ֻK:_v7 B|IENDB`bzflag-2.4.2+ds1/data/purple_tank.png000066400000000000000000000035431200563112200174070ustar00rootroot00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_FIDATx]OU>Ģm3$XSdsq 0m)eLECbb51j|WKwܾ<ɛR^9y I++O_dh~@1U{VG=\Faә$1Ҍ 4_-g2{#4sJWJ?_G& ~_ES  ,L <1㫓KZ!"+zWi@;}glh'~ӌk][O [܀ͬ iN_,t qԩZS:jq,`atE|m۶ՠ>"~Q{gxTDM:WƜ0n1'Sp.m-~Oth ]MLdR&_`&^ֺ1/ o.Jf@1i}15$po+u_7~7 h}}pׇߜ";@~al+Jv{9]R2w˄D$+=9{ yat^@FV_(EEBd)+ HIJE&(|uݮ>1=Dy]G)v:_tqϿMÿ)Grr¿ E@ETmb,\`/C.^b1Iy[; bʢYḄƯqasYkw@9V tAȽO.=ޖ 2hئǯl90~Iaw>.c64j@ߜinqq߀ï't6,kq@ڷ'=/-& T`T~Z ݙI)u@[8C] ;݃.WȃQxCm6UZ-Oц`tEj y-W? @? @? @? @? @? @? @? @? @? @? @?  _EU IENDB`bzflag-2.4.2+ds1/data/pyrwall.png000066400000000000000000002071451200563112200165610ustar00rootroot00000000000000PNG  IHDR?1 pHYs  ZgAMA|Q cHRMz%u0`:o_F IDATx\uvC IT*I*.Srز%Ŏd’X2AFH Yi y/!`z'@ IH{}֞1={ޫk~ޟwo ?O;_;^?o#m/_/~8o G և>oag|ߗټ2?[}+ao=0#ſ/?~Ϳ#r̼7s>4?_e_0~sG?k׿_CoW~wp~Sʵ]?/~'W 4=_9T?#8WsSn`~\rBέ[nlrr\WM>+'gޕ˙ߙOgWʑbcyYKo<2.G%ry|y9y"_:n^g<95kod޼&_\F~?s2_9H~OWNؙ9_r-Y(kyr6{/-[rz's,&!erszǓ嘏Xג͍ͭ]ϞklO~1;?_gXX}!o r,}6)9L>ȑK6gz9'?|hޞkN8Y5ļ d=)_߿sD\[?k~0;~ûϽ}y( gV]sW9w#?gbsɹY!w O*LqE9+7Ƴs$$=gy+nS9NQĴ[ΐYy9V,[* ?z!y*X'S׼,?Y?P$W2yq`%.'*UIwV+V"م,疳X'K*gחʧdgGqy%G)1WȢY4<|G?o9k=">b>GwK_CϦGVgVݕV귥sQ Yi/)?߳Ώ[xdzcLbyYVpN/9+U}'hv02w#s3gGOfEQYH-џ'=tw,w?k_gY9F~r6X49=gƏ+> G-X%Z9E)_9lqN.qy{]ݜ70$#=/BO,9V#8<s"l1(9̧$s90q}#ݹ}n]N;o /s9`U8ܜsrs|v,М S߸ymNk>eH&Ebe=yۏ+$/lsYR9|wn'qt~OG3{Y'L$_ҹ,.+;?[i~3K8i"Ac2̜I~ȭ69fCr7O8xd?sg"cY9c`V@`$|㥡?ϛQAq$C+p>&fq|)Ja:?]2H\fW5=+''RSϦM/Ѱg鞖_r9H9kld9Z7@^w+W9Z2*\{34I 'r>{dy3);MCB1(MsRCcR-<|r§?y$?&O!blv~(j* r9C+D;ǾzqdgeLvxD5,77Gr:0N !k/Dt/?,G.tҹxQAX-!#܂9-'cOmqrSM~w|dd+/"䘒' h~seS' %e/9OՐ 'YwXaAx}A9JE°d>r2ciNr!?@|ENco sJQ3wcHZ\"6pOL@}xp'yO/J?axϏܻ_u\X~vgOf f#r46._冲MEyY3lNKx~`yYHnDoM-ug{͢@PN Jz`;NAGHKrj&9a >j>SqrV\]{/&Cs?6Hڐ5=_K{!y*@o_`vof "Ǜ]*lQm^ hdm|bK:}~#`LC{^,[1N̑2Ah, sI' b8Y1bJoɇrDcsY?/5fqW& uR˿ ^):(s;YLjy90Bx0t 7yB$:`CDY)pvjg2MC&#Scsɪs@''1/$llOiHUh;!gxoANuj|҉sy9[RjZ*VD!b/WX^{#5 #J ;Wd_xHy^P#N2+ +sl6E$#b³rZ|v^~Hodl>,Ԙr@L/K'oA>AgN $˧ې`HRȅ0BUK_M'˅?Nj;"Hfc3O8ĭKys/w2s rc,NrC1@\AVHkଇ,,\H^7[Bc^{#'c'}+~sy^9zpHbb1!\J.)yГy|%|Bx>Žb$I6luB~q8%L RRPz 7-ߗlICTsJ:OE5r1 97"oNAgV>()pA pr_ޞy7nՂ*r a,}8&_@@ ?痹\`vh`;f&Åx/wj Ӊ+bϺWvLx٢9ZBY9)#0 ~/% F9&GAzX|),(Zx_E$pYDK* ꧂@aˁAFrY} ͳMdJlL\U♼vХkS $ yO5O,~l*+Plʞ B*ќ02Qp!-m?TAcr&aPe=opO`T n cD j&/,'ɟ&i=ײ;wKu,\@'"i{ ʺAU@ 3x0\H\5/m? 0#r ?ޅ<$Zgqj#y@h-Kyq: l}~UqA%-,$4N!E"/҉lhq{O0`CxΙJBg}\o **P($(<9W@)j?'V J4V W]Npgt0LF승(Eb E2GMd ?%Ʌ2Oi Q)=[fl<&:+rr?^\c wLx")F'FIVf )tz@~AVEɴp=vg4\KfGv"dL$OJğs[xCG-7f*y/ۏR⾗#i(qr˖=KL ⬀NL`}LD0uUaP'ɾ]^/m\/aW+畹dZlD3/9/[K‹ٚZdhmxY1 ~o~p F0:kr< >6` &P!M~X$alakDc+%yK;4rKCHO{W_ZVX |wV+{;LuF7䇼xKr|PfpAuIxr m`JNyRo|Oy!2%gɗ[l9b>g_௕A,UTy|x`>7W>091) p$BΘ)#Nr4ʜ-- 7=n& i2kC&dUC &F9EApPDa*ɑseL A Kpc&?Y/ s+N&7NY{"Xp|3˗ZjX qm"]RX6>Ƌ{[4lZg UaKe56i}[?I-{KY1yܱz'3gܥ8]=CW>r]Bcv3-M;kBVPe0+@../O.P'N2W.U֢[u]zBb-Y>gcߒ[Tܑa$dþ<  NؐhZqG7j<3@h"ir & z *IN`,1/n *I]`a2r q3xE7J\/-%Fa}nrR/clʅA|Q(U J|tC;urbsmc!rO ֑;ekAl*Wq' NT(.ar#RzyfM:K9h$yA,D7`m'<v2~k6"9gJšΙ# B Er8BދߦGP49V˧'[}P9sk2;Vw2AN9%X_v|"liu"Vp$Vٓ'ԆRt F:t&ey%C z* YX*0lY|`\KػfGi9=ZC7Qs)T@Lq l,HA6_5؅8+F޺ٗQt%sY"أ dOB2 ۆYy] n~ q."!<[|J0XH.:DV[@bk(t &Ә Y{*6Ae%yHΘO2aee\H =W)lӼZCkSհ4˹G¼KpV[vUնo6"!MҝݘU$`XKgD#u}D/S!wKTtt(ڹg6oksGeCԪ%v ؂@h_-] `*p2H>m6cv݄O,kNF44[L'/'mXjQNmy: +Vf"ĊBp&͋wsB,Pk2"Ml Ʈm ^s %;bǗXoa&c4pj̹#Icc &Nu3g8xs9nG)߱HDnb9,G.Ol{{Ėhm8@L!3R%.e ]zR,d2yB܁X"7ĽeD*#O&<7[@. 5I-@SX(@Zx=*dE#h3َeԑb'j5a]RjJY.p%9PSy8i]j<6U  9 3 wW 탲-v g:gI.eTi` pΈc6RلK@$*z%OA5!]wϦWACNmPCv31:{ZTҍ.ll9p@ @x ]* Y%4Zt#ٷ~@'f [ W`؆]漍B[`ڳM%LcS%@8 ߭ɁȈCe!kM)}/@:-|G_#2 \"ncEz.*맕N<j VJnA%,b0O&`YE_LcR{ T33=u*7\?m,։ ~ As %9UC)1" Z>b7oTJh~2f/m9 -]Y4 *$]|G +h Ӽoyecμh-N*8U PLx}F8Ϊ"6"U+j*K/ʏjL+89s7bca6TY`9h3ne, FT$JǮi]< .EJY`N-6'~TRxhp޲I'0u/І"i%ep”V#b5S<[ -,rJov?9Ql8ͫ&`s@o%kvc@*f*bJB5ox?ܐ1GN8!UF"v' Na!L{[??l6r fWyҞdTfH)NX?oi 5[F H p0ыT* ~-ɧi~q,r M!y%,e ԉTj{̓rP6V`)"I:<g+eoxRͳ߰gh =?I&8zkW[`~lz')SҚ@,&?s:)Xf!h2KrejdJ5/W7K*2 Tw=-xK,P RY:Hܑ{L$"{09(fS@O E {jC \ 1ϵ&a.=>"N {o*E _~ -VHG r;^,Jh݃?|GSbՌFGk˺FZ(8:J2^.Oe{K6+l#n&|UA-ټ: `ΊGʋ%X|-1{T1A1Q*,^Xݱ•#g2"A<0ԖUEYX n᭵=iPRYDx(@ uyS=Q*^XL8<<7uj9ŦWO6V'O%T02':z:6HC9lZlj7|zX &FJ- eOy Z^T*j1[4D["nA6bBPT=)ֻ 瀒~^1%n3j #+|82)ރ\~4uԫnYζʼ! c"OOq(N9tn^1a{RT gzxuՄd̍Eݷ -ehO bꦸ!,\Op,uۀnx(fzh<4,.|/#׊MF4KM?6W>m*91 Wy m5벷͈ʜ͓t$%$7VN@%EoŬ>Cy a 3^6`6zDCEbJ+`ubƌQ,U*W/f YhvJPҝ7؃ҒJ4fFfA3=iZGpw϶QtmKM~\*7OUz]ܚ6F݈ g/_`afPCpQ uY45B\$Y\7#⣵.Dܴ1=9,. |m\S؀0m=ˋΒFqSɂ܂L7ndQ0*L9Pix.jwlVHZW*gކY裌6鬃E._c> mR5+t hr[2}Uӳo@}E^mu@"7d:GH ,M_b#ougEꛡZU*RT',V#ˎoT!>ԬMBa=mʼb$U=8)z]0aQ8= },n=[W̚S5 "7uC4dy4ZmRћVR$b:h`,\Oa mBKLe'Y"iy\r _$r'JXd Q " </[ssJk9AH!%JDQxkΌC!m@Qv) >%c^[ӓ&-A X0sQqdW;ozoV|pk_S0&#Nv'9GZSLv_ s3SYJ5v4r'.S$th:QM"f 2ܗx_NTq|ϒx~2OH^k%ԵR50ch2'XR0m:TTBG>՜= %Er܍GKrPɍs Cz/LAQA_?7yÞc9VV,6ڨNA3%eqۯ$ Vw&E%U=Êj-ȳ#=:U!5\ҡP&Ƥx3n0+%O;ZW^!Tʴ坋O\rF(@K%j:^i袾a,},Sz?#_ yv%L$ `ZIO~1Ol_–3xG[ ů/l˓Yθ o_L?C ;A3^Nm3 7 5Ɏ;5 VG#FՌi<,k&A@`خB'႙mf֝*:>XQ\}CC[%޶V -^y;βP](#.ཤND85mueNܟј&M~#'%&Io{hBoc3@O@yׅ͆gfz>+ћzb!5W"9]ZWqf ׌iquʂU@V/3M~ ٱM?K']Td#)RkfXA*vҫ6keT KFwj?v؜3%i K ӝ!H̝`i*pb|k2sx5Ώ\oVdy%6D ;FŘGOp]zN?pTe+~%2͉#ښ LG;WsmiΓEuĀ&-_ę?ᤲaPt-KQx/HDBv*NU/Kw9z*$S^R1Km̔T-9OlON-Nzꌶ \! VYh̜C6u'f*3uC*NVj׀vRJ6VL/Z2cV)KCe,2G2w9Z_Sñwn%4֮P*W+/7@Qby~4eXT4+c"I댴%?+oŜrO19Rf>JTng(aAT1 e\9a{ED`tA5 51F"Yi6Vzxѳ.<B\;$jaAO nalo~#FHl!Szݺl28֓Da{0g)IiDb}VxJ0v"6[nזŠegMH?MPS >.H'@[r  4cGHƍіP!6@֖Ӌ]P!;0^Mђ\~(U= s"/a\mg=xW/d ? )fڦ|\^vp 1_^mP 1YQm!^CHsT_זBhhK]eKm@}T[R_jB, zH@b*c 5+Rs@vޛ'R;ITOWdBϲn_XIkwtNv4yYxVOA }&-cΟ+2[B V ŗ{؎qAtNzmfӶHڤЅ:Ѭ;ѭ"1ׯ"{ E|9rMuiZ%{;ypFR_IM"R3.Vƚs}EyuN V"mԵllI܆`Cq,ٓ Jc+~3d =| ϖ\1O^B, ][$|Zڜ6.T: oXK4sؠvW Ir^AY*,-E M 2&Z B*)6({d\"~-j`$-({ 6mFӦ1k$X[%)4LjB%?4Ȥ4Ո`k|+/ڕ fqXí@QQ}񂠚Y' 4ӳpc7v*8O!)`57bvQ0^RjIwsc[ X3Ta<9C"4[t?4O5-, &*_DRpQ|3hJzmU\L˝?q'X~i xO??$hL5oѢݙ`rsoyyV D]ev5As#r2JZ9) ,n۔BRUZ;%'AO(!*;9d)ٕٓxJNl'& ZXF%v/A L,a?*tzN`l{;@yQ& ^&W>Tt *V<{91͸O/PjctNe3 nVT*z 4:@gM3}>o}Z~ӭA_'9|ۑ${o/-i*SPEU&<؞׉<.dLSu{I t@;@4\)rQZ[w$q1*gAmY|D'ܴl0+}^ KiIsQU?KFGj&FQjj4ЮKHDƗyvb\f`wN\SDG'ɗEodUhUIN1yWa@Θs5;ROR_mEy˾/i+c&ɇepg H>߉9:|$mV\qRV M~e-pÜ NVRՄ7:N6 ,Yx$J]dɫ7Cm8z %~9DQo"E?EtڦXk:R+IxΑtR/\U{%Oމܶ'%s^Ţi1+dլ-ˎŮ  8 ӯ~eu~bFVREvQ yg |jcWӉUxy<:NJNNa(HdU͟xqKmێB/{HƠ(!|sIFc3r,~a=>~Un9z-;*mX\ʊKϖ=ٞD% C[W,Pz>Jșdf8,m֭Z0ؔAtd6T, ù&9I|_e]U\%9!@ djDA rD%TG"9CLNW}L 2%.:=zT@0}[D\{iU>V"A\vkkgMT~]A -]GƂV DIv[۲*NV{rZ%B;:JE]:SljIo)d+/]j^`UU1y Uyl U$3l,!OEޖEor6>9m#hD W99ª6嘿r޸]F%x`Gyۙ@U7O~x6r@X&gg|n玒F%gY~V~\G~G Ftt|40x&;ҔN\cꎐmԜ%"R7LL-މhb&j Xf?vą˳xΎm;} ڠFnV]G1NT(@+։ ޼w 5 jw.&?' އ!È\E@!%^[ݎ~91 (ݨ׺g;Pg^6Au\.Um{NG%BDt0t3L5{PZU/WBbz3˽4&QvmPFDUۮnf~VzeZFEds+h۠Aaxw%໪L=C_{#1-#f2Wۍ ı1a,? D"5(읾a$x+O.xF_H\BCh'!\w6|%B-  o8T$v8qaݭ濋Llkm&ggġڃiAA"VEꉁ/"')&FE*6^T^Dg_5\rrO̺MO#(ۘPf{IC|RPW-Ng6Ƞm@!gKB]c$ڠ],2.l)(fR 6>Pzg:Zc}e qv34.Na(7𴵰fxu'^Yyin|06f @:s` P\w 4 W-ڽ`lNHT(Iz 11{WqcNƻ4単|G77ccrd>JKwCv;Us_v̵#_5$2x9/]Cq&Lߐt m:xM:1E,O=OTIy=ٍ2 ٳʯVm5ö?tHPfp_tqXhg R#4w4u+&?zGb-yޝڨJgz.x^ 8/XOkBP-pVb_  OإBd2|7D }?ƨÇd7'?յa `A״aI$"=\jt'(2*E7*i|A)\e\ny+VVb+ (:E4 D8!<\5k\rMz>s;AD_5,Q96"mU[*:LIdk=olȾ9*8G<>L&W[^!3ㄮ4ݭ,;>L0$>M@١Q-`̥9$BC)=ý~Pl8𺩎8{XLrf3XjLfĴnJM&p4.&Eܽɉ"t'uL9@( XHeΫE.W%oIsb0eeu(&K],L$ŒՊdcvB^1C2//fߖ9>*ށ}1Y$$DUJ$l`<jvH9 fXCBd^J@0K7 wlC8%",9opǝÚ ě6.hlv#gM6tKi;8XeރAVDv'T1Qرj- '\¦/x&\!AE9{yT%qmd;@3BN)}r[2T+[ &ϵhtN8YurDqe[frgl d8"s4i4ĎaE2 p\)V~@*CvW"]d![Dj=lt+z* 8 稘9An_Uu3|5\ruYSp,-zvNCFq]ٙ(H'r:6\V'*܉X9j!k?DF\!1xWCkQ9Š.~`b# d`nls>ғu)smXk3St!w"7mvMVWa6AB%y0s]wD?|dNrB9wyr,w|R}C~tnBwҢCX,IfϬo7bә0|?{ 59[O3-1a֓"DSr11@қ '` j.9?E3K!05H!4Spc1 Kqm{p-l2U!{q7E £kT{g[ Yxh)c ;K)@7RضnTouG,މwGm$)V,8ĎJ'%8Am,(31%iH.Кn2SZˆV y|a vTS7wozhg]9}j/ش Z _3;(uYb8]dh 0'X >LWdÔnBCEK4 u6t!??P7K|M5a%3o+|ai(&:bp0#s`o=Zĕ0@J g >KîL @dH`R7q E[FM!M6pM^8RDQ)جIj^TUF"رwy'c9:`kBA1YdZy'NjY}(v_,u6X2a)qTܢ"PܓzķXi&1rRrQ&I|JBquV"E* 8T u˥IKz̙lQh[41HlgRsXS͸#qKeOr!t7\T(۩SjVcVZRM?wl 2zg9"J{dIsm M?؛F<Jm ;siT AUd*[w?'8:IkWm4D _c8FVu9F1Ȗ6aZ;Ui حIˆUrG(ͫYrw8ܬ GD(^8T:; -f[ʕz%6d #ƍz orJ諻1H9hXN$Ê*ח,;-np"Y2żJH4GO83#&ahe30;7bJm8i7^Z6@^)&wH7flϷ0W&P|*`:iu|Ldet@jyKQv>bQ(S n+0j|PFte/-2$tPAc k@kNj@OOɷQ ] lb.I-N}#bف\\"|rޖ=Os{PT^Y]p8 }{dGir_l f(<4d́@91g>zB6B)Si`/ipձ+TW!}84x _UI}7@.ċU9#H:Hsꘌ\ʉ r)NSeg"9jL +.}l ON['1IJT,dl ]6o1D#OKs,X,keW*@GW+pR+Q kwaA:*#ׇL9r9s#9W4hqdkmd#J>zrO9b 0I5g%hcӞ`DE- )EVrmQ.A6w`eSk!>+łFJgoK^QQMpċF6,,#mm*Sm_B 1ŜCghA~Ӣp| yo)w%53*?T͆T^S3m^ $EG6omAj}\طN!0+*˭97>CnN+}|ͯRJ5@sI+uV_ Z;bU͐ajgv6 N\SND5'*wZ/S3چ^KQ|ҺXjc { ^nX.+?&@.0Q ]Bv s =gTr|Y_ o lXϵq)ql<0]Ng +x|ORyK'SR~'." ;$wMu£jM#UI%:cڶ5N~ȭȩA)3? %5N/bMfa {tUL%,PeIOxD U6~t s8g*79w FWT:/I۸ύϪMˌ4YlI3U9Bpb;}#I*]c8@B72imahHpfp>e݁D zGId#r&xxO#xQJXNG!-/hjg`w$8 /SS'\y7/̧_*^As+n܇$OS/{x' Ne;%r@! 戀 VV#T{`#Nf/H٨L_n9D E@Q3 Hy_֮xIz Zq1e,kNuqҳ1fB'8&PxT?$/Kw։# 'GOhNUd=\\4*wUQPW]J?OA!xuhEͬɴXj+q{ ,kiOGH+X rgphvt|B(v`S%_>s54f;U@LVI'2+ux?;ʢ1f𰃪ȷ;}t[ Cm%BvGv6>uZiag ϺapK/mf3%xZ۫`g:)-7hTR**g;)IԌ*'uS-n5Zqsv7gF_M#mX>?'rI9*E-#\նӆL(c.WAzbdQ=*S(kfwJK4 *,1c&pY| @`dp$o16h)*.DNNI*LH"֕#z =L/|O]`6X4 z%Hkb,Љ֔wz Lo\(.&oŋfyvP7>*eEqԮuHivǙ!>mj b]x.۱uUC Tauj1sb^`-_!tx3LU WLS$%woeVD"[%JםY{8m1K?2sO2@E8yz;As@݊HMd\"\CY vϨ.=78lf8%U^ĊÝ<64ǡmw 2\11΄3a9n'v"5-+^1t  9 bG-?xz~<'6Qv3]b;Fx /tLU.KVTMd~'u| w 4k3MI'Hi:Y=?'3CFM~lԡW~M3Wӷpp񈞕mm) !%<&h#|^3s@y,$ϱ΢+ cy jy!>|,j >?/#=L0Ks¶;+?ԓ1&)kAՠm'HG E5ѸĿwp3 I9 Ft) PjpE:(!T:.U] wjQiPMڔ*"l˕fIJE/֑ 6-Dks| kyYCe%k̥ʍȬ`s< (7"$*`H\s沛U`ggNcXϹ "0bٷZh: ,ũRdSr%]zvEj|:3-6#彜3PrU mCNsd~S?s4RGDt̡s4^f'dh͏f'DAZ]yUTGm*+q˄wvpp+vr' ;tS@Yظ"mWӿ ]p9XmtfsDM(gȠs| 6@Joi,Ӫ*kT|Ar,@Z^vGdܟƄ8Yֽٜ*/Gg+r] [&WpB2o{wz<|`y1gw:3VI -gTHA=[ruL9 czhڲB:%d3L2&~>yXd~NhN#t+ܜSݗJ>өAH)ƨeRyNqiI`pft29 [hlJf'JZ(%1τM1BV[A;,wIX9pޢh LL`gW HHԥejT9OcTcULіWR>$[FX!ϒ<9|+5cmZ:?{ÊJLuXRa$8 ?i=?m حURh[7xF숁GV̶AS6@ŌL ߷urψTG$7h(6w,vG F$Eb2Esy2R+in_a)kՏXcF"=䋲GsP*O܀%g;ւw]ZZE~H]Ȇ2fِ#0вp124 pD$^v+ŮD#(f_>N'd:V}- g7-  u7XK-OA $M'{H{ ɒJ,Ҭo) "~P*;4Moi;]r&KITGh'Q6 bu)\5}9SPWiV+BdyTE{#y|[-o1*8VPCX1y'NdL\bY0BtS*ΧcT? D+_cq"/u?]HR5^ E0VVC|P[g&"ڱecm*B L-61Q$7thETcֽ`%"~釒J 7Q5mܑ^qz>wsce8H;U,!3N\)) nf'|>@O_1 e12>3][$tm%?v>ھ- yUL:.S~ p1R9ZFT6HVJ.Rp&Y)2q[ًS)҄연̼WlVH uR} [;̤k|0 Gk \qsJ^s_fQ m?#\8BV=,ɳ6rcbXȀ^^kg&%LRFXΆxfKg^3z̼0%E4)l<+3&)nz&fp2bۂ3!YOct1_B1sDOHk 0יs0\@?"Z@I5 V×Q[iu^d\O;2u߉-va|h߁۸6ѫj@!͙jSC3d]bXYO/ʹǥߎ%͒xBVs2~q)VY𮤜uD^!QSxΪr=PE)pЦnΝRL']j4lT&Y{4|m~PZ6$hRJ͜!j[b*F.u;t* pV6rۀ `1ΜݩA ;bXZnӼ+I1NO&TF=H3HEVʪ^m\+.n0#D'""f>g A>K&òA!INغu` 2VL88XxB:/#(BO*VOSlj`R|KM@vvT,Х [^F:j${iz TlI^X*8N^- LmKDYmg)؄IHm֙}/cd սM\SљãDxje0tR#b;e˘LT$ْZRӘ7Cˠ̵5ŎBko?QvוUa#-JyGj5jDLNXHs ,/-/H''zY8 R%htլ f )cՑ% r WwѦ%IJ5'#G!cƙ  , vp"~r-[GHub+ǰtZgZ0yL +ٵ[tdO(AT^5" םa%{!Nubc!&:6X@ 8%U&Va;x 繰&x|}M8Wn\&[m3KDj'bU]W)o|{b!ո8tKDm+ U;:OIx Q|r9ɤ/cL՗ 8fq'{O݈XȣWhzOd&wx;.cjS@Y3GM±u:5VKnhٶ[YI"2*Tȥ=`21)y$wpw ru%@ڨca4d*2ZgD%s,?(+Ld\zCa(960 ñnKDZDK::ϩ}o|BREf~SDl G \RZRc*`ǖ RְGU -cYK혖1uwfqnWjLXpNZL[[E&F,8Mwrڝࡕ,`-;ܩgUX@ f(=BtaQ 2Im: O -3b:]h&Lh#J7J>{AA{BGⲝ[VQ.e)`bHa3,IXчC;dڋx~ږ΢.XU e8RbySm<'a(+HjaFI;/3OTII4,O)>B, Pi%_3G57є k= .E]Ѓi3T[bx!YIJYnraئ9} bݱHCC*ICݷ+ݣc5Ju gԩ]:k.3CĽ6I6C>Pp~y}K)[1cݘ+`dӗP"dt@gFg 2l*|&@M;U[<҈zW]T歯ѭv#:汮|Ǯ˥ړd5(c6re A6cAtt:¬2a -DPl04v*Usr%TNt{*ܖ7+|=ubJp0GwU90Ԓ^}tf +B팹 M FtaŔ8Y1nmXAL!4K⌈{x|971w,=e!t?Skή8nz\ai#G-[&op<!'F3ɋz퍜WZ Ķ *Uy/RYiTlGK\#襕 MWd/*7 "AudNudI\9yٳo{RVcvNJL;z a|`z%%ry\ډ ^/uP56Rc v, *' 1m{SPQWAǃ0j? O"pڶYs6<_ӭ B_UNx\Pe}8OUuwLɝaCDj#`11=Fpr\Qoũ<^@3)l8d(T&*w-f8Z۔pj@R1(bCT)L+8u:4U+;>W< ,bA;EǟUY o.qc"$[ᬤT F˵P}pk-~rALl15ZfaNɯzlX;fȎ@UpK!9l,$D-+?|0om *n%J+Qn'n#0rOGAJWi9 b'+] V4nvCA~0&G}ȒsOr̎ImU{( WCm6DJ.pY 9c)G(N=Z((ࡣz`|5-ceȱe /LLј2<-V3L1ʂC=[%@@t;'RKl!EF2 a% jUPNWIɂD f{< f '/?!DxО?e t;*\d3T(ebit9kwؗOO|q[,7dz3; R(S%R̓feETb$/ȓ@' upէA4nޑ=Au(H}=/юAjX(G@w}Kxݼ4;|Wʲ+,~o.V< /$]pWk]< m-PA")!K0 qb7i,=rDz H1(~E실kUSSǬfbV"@# r9<bNtd;p(|8M86{=Tp_s(\+͝="yYY͋U46@ 2xd/̜SUu$+tɼ8MYҭ* ,z%*2WU+hk6[F̍R-ޖQEWQ@S+-cQ5ju|t<}.t C, \u\cN>BIȑ[g^9,["?T9~K)'C•cJb *u^γu yE'|L6}쫉7`E~Д ܅19@m"U{s r5#Y[A@T3Ji)"OZaegĦ#!n:42Z Nx_[^~Kr!NrlO` %!oV,ss5=J=2ж`1`ACr-G8 ~G97b 'ugX9`GRIMF(AKXE"~T$TG= ,7TZ'j@hb)kLgI!_+{䜏YT #5 Z+ `wr3r +bufK9%ATSZ< Y"JoQ*5[ }A+#)Is,B}R|˽4U9wL) NTJQk3' `lUUhU%]񏇎2$+:|{޽\W]\8 ZVkUjج3jrA@LqwOe(΁ @"MtsHG`c岥b]FR@+)p y?Uz:0o]dfرsmfz;Fo3 -v##v Ps&4Wǰ91{z,l>~R$p=843KnqHQnc֭csd%tRQJpnXcy!6t ,61 ZRn*.8nKIw2¡]1>ˋf*bn?3\' yne9y:B]&w@i]I,>LliS_*A p:>VF+G*yUp,ne/U0!oWE8}c}' r'Ѻ'\'E:rrf6͘V>jm9/ۺ䩞@F<l<$邲[c63^]p[A"~2F_wU#R%KS‰Ȼ*G}%En+4e}ReY%׫hym:>{_C)!j+ 5T.75!JNYgN`0 9/P{nw u;-IȸpC-C;PuRJI5B7&xս8!f'."ɪGG2w ȗ愫b*4C0$y"rx(x0jpőN,@2cˁh7s,)f2cgr7tF`YI ?Y )XR࿊ N2#l?oX(2d'"֖)/0JyBwfYD5 ۬r%+ǝBt>{Tl>g öY6]`)q߬cag* J`}'&}\Tt!d0N{^`Ӗ#5[W>ݑ1h"m̿n#?Tّ3tXqYVwd">u(tlzS;MxAH@\3),a*Kfp(JGl]`eKY =&ر3 k7 W(!ɧ^ܟ#Vmr|TҌ)WmT lИ}{K ;y2cloKX{(n0O>? u=@L@A?7:0jbV#ʄG f10yҸS5SM}YNǻo_h!|pTR8ҧ-|3ZVmWd v% $}Rr$G=dV;tfK8+Jq0B1;%(?ւaLNFGpQ0Fr$xXl6< Z HΫ::z8#DmG1fK LdbedDt5`źՕҮvɛEњi[*A`IJyisڦ$%O0 YnmǖJ>?xBkpj]CuJ -liZ+˒~T L z1"+R2[^+޽g 7[ x1~5&Y;HvrJWy6rfkƁr83*@wdWU%;.1Y+1iUe{~b;~cp$r]Ǣ0)*jɒPG!ۨ_ÃwȝcYNv YE][ ;"do7#;ΤDҙ8S_%UK]n:4%< \T}SbrUoP7j8uN8)v?PptuU  Ƨ (N̫rFcc^jsw4Z02\Rgp ҭ'~͙< Q]e2;u숱G2 U> )ɵج@c_H8eZ;HL;?&H Gc5.SU G"TU'TQ")i2OݶlHzr—YD%t E)5N A3Wb*1w_E o9N4,,]؎GfaI7R\ձYa;ԧN< ṱd!**ٳ,Qu͕SJ- E0Kj6maؚqTf5:vayI6@ ZenB0 jهY +k娩rnU<9arirv4:RӢЊ$Gm6dKNm(NO(= heӓilqbP\j =&$SksayÄ.y{`H SHcldQ,U˿`ni6 hfUժ{chfs*G ʟ{T몺Y:0ćWL WE',G6VQfRp-%by73"+#f ųu< mܫ%FQ/;$h];3o֢KgB)J8uaA`vTu"]ȺXq\ү*'[V~Zq jqO5Ne$99yWC6|Y[',t38-eL6绁m]潂i<eq^\V3 u'}mRFTYAɋЧD@X{scE`Õ%G{)8olg}6 l;ۢЪZ$L(}j LX WwF-N;t)36 jz5Zn>S돥oWD.aI of89;~4D[\!$Ĥb;J!s.,(uuJu8!Z) \+LjOV!1a$4/93 6;`rE b,}V2V3Ny*MCD%j6kw|K Fr "@ԍnɱhB Qm$Vq$Ȣiӑ ~YkO+8k9uheS+BjOb_b6˺huv?#^av_۱CT?^JlNSlbiLl7T9ђּ&6"8N{PIɷSad>7M(.En`\ APyOAB0У} /Bx{7̠b`*M j=%ȹ) w]yߧgS{L$AC :^{#y`` t'P/-Vd.|-_L3P~4Pk\E\V4rT5LFvj![i}bA Z3VSڭ=;hxŭjgtiek%'HkuX왛g}d1@WBl""50yU:QX-Đʬ轭tgyڔ){Xap3 qB 0:JH2q<*N翓Az67z$9|/LND ;A '*Ǻ|m/s-([EόT*)[xJ]"p{M>^?|w9Rc#!-:P㹫Iu>B~`NjO)d¸3Hyl9x )A?m-L(@#ATgӚe`\TBst*VDRŶCfDzf5%o0)c%M#ʙt%(P&TկsRKpIH#~+(Hs874RmP@T7P*enZWmISògl]V.If_a`6^=1s42::k3|*g&X9b"+>U @DN=GLM*?G: %BthE 9x˺CTp-i>!HTMh`PЇ\%gy|iȋ>vZpI"Ũ)ÿBgCY9jS*gQf5[ 'k^əXzهhe1<U 6,Y-O<=1}ӟC JSPPPKv qF 3TE-Γ\i-kCźe:.IAMa!wV vM(l|b6dèCr+=gil1RǢńڗ0x yZ0 hDi3k|N)ZоE<gl OWg%Y4*VtG[ʝpdBDD/3 ; R4J/+ǹ&Kg%N:So?Zi=TܰT\twDe嵕lQ9j͆g= F)c`n#FͲ⎥u rbFGq6 Uq25Mɕ;[ 3{Gk/!@1j*)NѱQTM[ޙ<0}G?&Zbql6C3[ݨn'87ѿO98yixyqzNDSՋ&w5CTS b<JBM_κ0i[eA:DBuh&*2GXˍkedc0.fH ΍E2+n|rs%3| q FiW^ŖmߠN^aS+WK+38"WgmE+*֎8\*Twq>֑D{C.3FLPXhh @NSBVx"UVnb\<'V@-!ӯ:H'S门X?@3yex.T[*<0+fV, ʸm[sa(ffj!UZ}LJUE*{<\Ri ޶4)ߪu.F:lY6ҭ̋rb%g LDH4y-vT%4D8X Ɩ 7%adnuѮ`^aTvKJںQYk*M>me@txelsb$Zd8diT9R @*L|N}F̙4/ϦWAXl<@uɨ*r ;GE C@AM_cB D~!{u dkC=bebsmyO!qj0LZsN1Bj~ES ]w ›N4](ķ_׍D%=#vQ.80%)f;pw"hp}nc* i1ڿ \Ě8aeoFe (?;&'#ݘ'^=es"InWWxbgfdzs*g}ޮ i7hrƓI=ZZ*zպ1'hD˨LA?Eab8`NG8meR6^z֧Pv&pZG#[q#m:CK*"X1"J%A G ZX pIVNpRaI&TBczlM6 M&UɒdBX;YW]5C k_bqg eW&f=7v#Fxڱ|@\ |ER \wfPi/sLqZr&2gn<?@EbLL*ABH1.uCjwd7uxiy;*YQ(PV9':)iW._.«P#}hv{}'=I6, (,eΰ yuDmkX JLb@}ו'V? ^l NJH*q͟wҒ1;Ŋm30]é dH& .Va}Ru:Ф <\C9*{֍`z1ȬL 4ju\t\EZ}Z%C,PhO|us32ª` G$(^a6N,1`F Bj0foO36#eڤk:lJ('K`jhH^;R? pinQ hHi;!`-rrU'%o9+4uސ6X Yex|\f*1W/co=<`IBކO4"hf >}|wgj-=U%PbgEekN CXwWv+ɈLEڨHՉh[y{=\qEqa͕* ;ƶiR]ڀ,=B,\46M`V Tm?IɗчC2h%Ʈ̢-JЍkжza4 9ruqrJ"gz ľzY sywTd{9oyt?)͈yvssF۵䢕 s3ݡL< Xtp!<,5\Rl~3`T~c-Gӕq >#Ȝ 4pJvW*0 1ʕ.^~*H FGhxJ%T-yZY|HSsdžPr~Xa3>Yb0-!gy=wEeed'ϩ)rp~ t%Ñj<`.;^*%mv /ńi=?̺ﰐɞv} g,OLlύU12.g a2C%6-c cG{g mk)rZ ;Gt:hD)R"TLOd;q*c }iiGPpvTBCr'ہ<4*dW!йFr6*rMHf&>$.Xgٜ۲DbUmL|jBv&( .fH*p Hk!8 yޔ$GPmDaD_B}V~OI\E6qf$=;l&@\c,FЪ~@ٯƬ3gk"8taK/$~XRq1G߱OmMvsGl< +\{uָmz'Xh=Qgung2^ WaJ+({j-KS[+>}ïގ.vA~y$u4s)3agmq5bB7k S[:6+ e=ƨVyN >ʘsp#a2 -gajVv%l OW6%H ëIQ6sIeÉmY{\n<;uµ[%ly:@">pxOβJ$< ~*e?ơ~,Ͱ^m{z EqJ+5EOHcWbR4 P/͊mJY/b=p:&zFm)eMJK[?f+vU1έ.`Gl6D썼=GpzgX;x,Y@RQO遉DrWddeL GAN6J4VJ[%bU:L@,ԞFk8[N ;fAMۧN,:4s5Lfedoy<``:CSd .W]b`lߪ߉ӰLOi 㗧(G#oU\ |uw*k/%*qhæJZd՝5-VB9'%Ws)Ȣ*LLB+UR?,0琒6XaXqF$ɩeAͷ=fwtD{OH ZDgCLtj[L/8tP2fƲ| ՙK\;\Ң$zEs4o,t3UHZZ%ClWrܗ5e!]Q9Fz%ƎJ\8oA 9'AbKm%/.: :Vb"TNC8 <9z FW˽@d\ȉF^>*6I5NfBw.&uмA@!ۖ_:iT*aE 6c* lklo'X^C˼pѪJQpF:30O%XD:ѣ.-  ,Y QN_l;(̣)Y JfaxT*ѬƧҐG`GrJ+/*mZ)y*m;a؉:!P$hi#0 Re myx$kk9uHjukZDSk1 ;Hyc|7'nA#uIǐU7 ˥yyQ9 DJxj l:2 g6oO(i1&f|0ꬡ`{l_zsua#mhBPֹykܽ $;|؂3뫣DxNbsk-SZ8\ms1Z0IA`#Q @u2.hPM^,j̓FۻQŅU:צU 1E)K0MVH%Mq-n[FVRK{S~?&*抴 oK GM6x`qXis<_}:GoA$ :je O4o?TXvu=; Z~&\s2Xm}n ;\(ˎXe5/clM`IEKF~BO"+IW3UpX3VYTD2!sS xM0 N:xs4t}gI5#F k!'ȪKnأ2J` 0%v6_Jf1H@N~4JŒ%}U.^, >wJ|R 5_9fic;~y` *_='=@H^Ɛ}'1|tzhȒ5gX4Xe ۖ9*/Vf PzL@+PeФ2rNR;mcezNM\.JmVW\AwUoԧt2R*C8 +1KR8eՙ-<ܚ3g*5旒tHQLIM-O""nb>?MƐ( \ℱVHAO/o*)#\v GWﭓèfie l`|`249KZX i*;- BzWμ-lB-H[ pUUpתџ ʖ݂WaawjU oA.I$q>*& i2_TL;nd =WC9vlC.`!­I h{aT{9aq ˳P;5R8RHUgL/yTg8@͟oYb_1n""ĺqĸgPSC@PD%teq'N|qI$ZKW=WtEH ' l5Wq|gYg9e%C" +$07^P1EGA!$3sx6ܚڷ{-yelj_;`\+fVm4#t}Q !rbt @^Ru[L4:VŊgxZ4%t'UoQ:_ :p; ,{Q!- !BJ, 0aA%hR_,`f+k5tavOc-V3b}YIguxpURYE%DakrYyiU`1YxRQ.zW0}vM [Fr$^&<{Γn||_vg:-05ؔt'<W B5NJ=uDJ m3TxzyffV٫\%ECZ6|O3ihϗwm3!K{vH7SS2S岭g^Ѐ62R lZ yﹳ9ܜE&?딊\%gܽɺ,YO{:J'\! * =ÀkyB=l rb KG2զd g0|HҤ8坖ߖU!9$$'j쑝4t<;~+Ng} a;j0vۯ V vWGY+sÎ,lWoR{+Cғh-֥7aEhk׋ETnzpE!;b #;?P=o6so4|GH( TdWx7ۈ[![3,g/u4 a873יے`(OuVEyx-hcQS 3!tbMZxXI• цqߝкC؇(䨻o 'uU(A t:FA7IT_qHVz4V=Z^^u&-,UH\y߬`L!0q;+F%S=cu1&n xD5fV򅆶^f_N/Jܙv=X c@o8qL_'=|7N`_~DC$Rl*C~: XR_TmY_4`+`ζWN^ډϴi#YQ 8:C&\M.S1x6ƪ <^,j3ofN4k$θkKK -OE▄ѸI*JD; Np\t(]&&aFhuBÆAL'@諾xդT"Lͤa&4ƣel2F+u +]M .Y}ږ+NW&幈u6@~#Ԟ-2ې~ؾUB" Rg" Xh-s+%m heڤu{rgFtkJ lK)bs6͝40J/y| leq ^k/0Ȓ [fDOt}UC&{f4  $yK"q=\neўo\WirOqi%I$Uf8[ 0x/S_}gP0vQ|:‘;&Ү 13BMb))ly~ @ܖJBπvNha Ur޲*uNJ"PP3\,߭4E pГ-.uo@Lݩ-J-"k:W޲: Oh,벦sYjGoѤR;>awLC,&lgvl kWzhRAvetwGOVq*P- '%X9c*ӗ]†,}B5 4ZMAeIfK.fQ- Ck@lh'j ;`*e} 舯d@K*Zs_?H`ΥӍwI0X=Ȍ=6PgO2K_ˈ=}Vے``]ӴTɲEm(hC}jIBSp#FYMiiUnj~) 풖"7[oĮ%SS!mf5#0P ?PYtjKSm)|#A,ӸEX/\9s~x;]tHDIfo(gIF f8(y 敇5!lF&zƅ 8mfEV]TWZ{d=0qOScFTlPC;nS9Id8_"`=q0k4E°*Ce/fFuu+7d.my,fnYU:>j=bFZ4VI y[ps'gX I7x[t[ޙ(D>w|w^OIA"/:u0b[يx3 ]iԀbk[JtAU(0(&֑bt3?{ܵr0}Yrm" J;SʃR?%l*%PUXucH(aHQ<̇J鵢3! <ŀI"6@ji|Ny>Ё̶V;$ Qt=(\S^[6- LZeA07qK/BqXđ/Bgִ@|l\TUV?[Fi1*YR"v^b̼`rK[>0,2nMR{1gecy ԘT.9&,ʓ-M8ShqA-m11j]|FDcmIN#O?!6Lk?yVc .wڝ>TĎ^;94C͆n0x&if<}(sSv̪d'v ^^>]|Q<{rd#h@:' &p?jtt>/5hYEё B_LgCxB#F̤m4],=9g+w|+h: Y1Zz$uqy1+e Q6@"<#q|>Hh4:bERƾ!sl8X8* }(OK5H3Lu_HdgP͈ge ݽD4("<]qn )sĕ\f Xmcn;kw?\(p&/ZRŀ"Z7X *;M9 p2`/3`ʚ-H wK mׅP%Mjjj~lĢD Pyͬ`Znt܁.Je 0"֎pbRDP{͋JOXjI'%~)忬(b e dU/RGee#OG,}оA%$Y]\;s7cA 8*PXXuO yv#D*_ȁVp"U4Z:9g{NVc ~ߏ((iJOE%qBOSܦdmqgd^0ɩrO5?|-$ XK~/cQ(>i<0F{c?n[MWIu~{Q%Hkw2#"\䯹?kX2*ߢ@ڥU@2O*...Qn; rʦc]:%@lO9 sm:,j KS}o9Ni%~X WK5| խ*2V3:FBl,8,#4K/M/T@c9Gޠ|9=w~C=$FyDoGͯMz<6`DPQrb6340ޤ#4%'_/a8nμ,$£'FX/w|PTD* D/5X@z#.^9m4J[5|bN+Zbf:;gҤ*[TbyVpБh~M8 +khpznγ P(.?(YJ'nth}BU>Z=Dd %*NH] 7Cv9#V[> uha. {ʟTa:7$q#3C)*9fӆo@CѐdZAg?Qa<(693@b,30=$+0F0vDŽu^N|ot舓9 ݍ M#;U3x[Yʒ V\,(}P`d0 i"~YLV B uAcnS>d~V:Sk:}HGqc+%nz|s E˱QAk|i?xa{|*)K"'/8S4cjvlK(j#ۺ4 e>/UU_yyfMwOOFɓt9͖Km t ^ ]4h%+K|"HNc lay |-`y" 콮hQ?}.U6VySNUDXb,~ʤ+27 g%Y\Z+项r>]w=Pɷ] {3g4lU+B0?H -R9Й=sAYap'm?gpVizZ9=i14E&D[ I,hVdLŵ.%-b@1탽 C:Sǫ%?@P.B cڢOmWn#<҈6nNNgWmc ܙ7w4_x) {̧wh\﹇G.aO\=| Q9!2U2m\ՙ*EI:4Xy~)JJd(Jل0S{ +hOږ&׬WIʇS~ûl@ȑ O lV6tܥH<*\AsM$emb ni+\?U S^啫y` ʳgד ݍ^ @F0 d,v ̣D픤7Y`g? "}j:@7]SJɡ=fYf{9@H51:T[Se;eUbh88gzǯ8ʓX4=9:v;/|J)0ؚ}t#@Uu&?!0߮_AT 7h?-6?d *G3ߗEG3e#ܻ|eC+[ A?42I4]EK //qLCi)ce%]˞_Dg@~8kVsq,] gJˊ?̓ieDc08K3zbڳm_e {TeVC`5kceGرll retr&&IK%* gN@Y5!߽qWS]Dʥ4t(efˆ'<+JFIybJS:>&:Zq],YJhW,$%tgxۧ =ꗺv@+Ѭʃ;pVW|VT5,(ϪHT#I-cC?G:No?Uʮ/$W`_JA! oq[9,M@xl; χy~=4.oS?ӜzNfӽŝѠڱH6\:h:Ɔ4W< zmѴꐾGOP4;g pyjwi*u249kUK^ܯp(3U@(.2dS҉yWʿ&}B tux&T+?<]r`Ja֨rl]q)[&/q1FIHd Vutf;bֽ]A/9>/hgݖ9(@ZNemgy׏sm Z( -S O(YK6""Ij5.%EO\TTT*ZKG@XPڄU4n>7O4ʹ1@ K}( zA->@TABfʬ *(߉3ĐE-%l7"RX ATgHa6~eX }&tQ g0h9,E&TJQ^?*J,m!Uo 5iP[)콈Pgfo9ɕ)dzaDdnOG.W=SGpUր)Nۄj?=}O.H7ME3rN_d?ԫ\+ǍӜ$59c/ yR-!aIP7q FYYlƊ 4P6Eb* gsS'&i;/A.7ُD#}R2k֫PR!\Σ}YdUg'[;}"z-x/LL/>/hG"̀uKU/%nR#xǼm]T\{:rrVBؕ d2Uށg QZҭ&X7kQ"wzO*H) GnٸeRfk֖̲(>8R]'cU|@GkԝwDNekL"[e8APZ)wp1]; n2|0Ք*UD# =`n'zٜ۪6̪yT5/Wy8`Gģ?rW湓VjY$wdP;;q5GUqUEo&M>MyKz.=YXT4` lAϱ²ؐy,og?>O4ͧs;s T++cCV|,mB YF2'.As/rכJ6t` {Vv+E] ڶoE+A(D~2F~_Se4 0ɹ8E_L@Ve~gXQ](2>/̞fe:Y{vQ\~MXV FaD Wy/8/azW6 aIAT ݡ`PI 0i1"|#GB]+ 5ȝaȔGIMM90.Y! L3/{_jEn"}3o^I:: >SQ' ,|2^א'љTg8RV=EWDauؽ+b!bg'#;̈n4${. j@ҫO:.qꨝE|kɒA-!*"|K9@?*ҤOZA W??#5:Y[؇z`ё %mңHI(x 0_lӋ#R*  R% eMe|\}YC / u^q@Bu9ئ'lz7U#_xZft!#Z5l]~!K%Bb6BwtH dx.jyo܈e·j!ջ4B9f V̮ͦt~M`18\4ΞV|0+Ih|^|`lbUW,{uпN& X=ٲr!̈́OpJUMCʥ926_ossvxO/39bikgUd$k\]{F7Yմml|;hIWؔU{yc5j)oI3B9vPՙQV͜%f29g~(\rPSѳT9$TՀ9Uah] #8ض\ Ŷc-0(7 N 1><` C\j(;::B9l"%zm殅?n 0C?W+1z[M̃`yqQ#ˮwCJ MQIՖǓb8lca8L~HrO6ڲ:kd362$_t,q6Q➟פi4<8E;@C{ 10O>Vh*ّy=y)G10geWxWU8/K픪{LB`mxqc*u%6Gkr!&E\.#5Zl}Hd?B H~iŰQu6z!+p5D[_(05bL2JjX %:?e>Uy5K$ܞm|Q%i^KlAg9cO\ߔNk?G㿶N)tiWҕ MjZ`y) bRL"RؗGL.MQ@/:f?;F cDs|m򜁘H5/(a(&_qB1,gNy?-r|d!\ IoQ XO&̈́ǒ:oļ;+戠ptKs![6+76aev _u)Lp`5aK4vӌz@J"ۑA*G:ek7̽ʃH)BfnSLѦgDaub 3uvpbKM HC+Ղhʚ9]?IENDB`bzflag-2.4.2+ds1/data/rabbit_bolt.png000066400000000000000000000024531200563112200173450ustar00rootroot00000000000000PNG  IHDR@@`UIDATh͙n8 xK@uS`ڬm-CR-Ǟ 9O'Tl~a1o'\2\3'<)OH^̐ʴ?"l\P՚6aqQ|&<$/BnC<"sBH| G@m #{>( vN! /s\awbnS)/Q6" ƹ؊\RPS 20 ɻ *XwBtUM"g@xr X˕O.%"yH>؎#|60uBoTjRn VF\+?>7#F45fƄ]#B@&;Sd`@N݌༻$\ \NR eH}n2TK'dۄ22g.O |po[qς7!w1pξSPR!>W) `AAm) @8ᭉx}6K\"h$PH 1Q7 +u߈ (NPlI dO;I7"D2Yg!en}/ #0E!\LXz8 en]ÕRWaں9'Cg[D@ބGOvK n} iwl _)Y_s8} k ROI usCt aek@<#$PоOu˰ &Dw):O//$ ne,';j6׏ /$pN8 1'6"tB(ԲU3G'E@#@18QtBݕނ P )rQY嫜siUuvHS (>Lp4"X` Нh04x'q } _` jP ?GW0)neEoQqBJRZIfyEG4RL xTa/^,^-"^.z}/a|8bIENDB`bzflag-2.4.2+ds1/data/rabbit_laser.png000066400000000000000000000002631200563112200175100ustar00rootroot00000000000000PNG  IHDR@@`UzIDAThα P< g%0 C ]*gj4t6K3mwf'ţ9g+F4Xp2rvdH n98S` dON&= Q+aK,8)gNB)X4x FJZPL+P7_zx [Aո6=Y,ZlB|82O$Y>7XYbba,i F^k3G5.-Ytɿ[F'G.TylRh#000<aW˵)B9F\'Sr7_(@8;T\FRZeG/ܚ͇XD BBf"0#X:H5(Y9<I ~X~B `(U~n/rn)P4R/cƒs/SbH4i<0$PImHW{`+#pwԥUҔr3/EHcX)V1#s"Y3dI/;\99ٛ-!~{wrJ#uGpତb,%ónl͝-}~4،F득K?H\U%xeHφJM!.vW_Jnr};9}i3xccw}˳eiQ=jz{}SLqT 80bz*[qstr02TT+g+SIRhk|8d'O0zb!|)ywlgL];-B)\8~'CHĒ$iT.g0ڽocUWƻUఽ?]QdlE9^eb] %U%sa k*:MndV4ݸueQ]UE4שI1O!(9P:A _̤ 4 ) ?V .1ץPZAӌGGv"Su]WuUUu]S#1j3"3!.""B.Ba-ъ'2J%suWs{?[^I*|U8clcC`fcʮ7e̬_Vƪ)se Ҹ{ўwΊژCU5Ju J!T)pC(D$@/3H1N<w4Ԡ,,AXIX?šWስ* VXSFknKRb!2GF0Cr#bb`>JmZ_z~|PeAY a:ɍw;Yb s)XlĐbJ)w7#aBpGXio&S=j`ޓ/]: <7H!fR` 1C!Bq3%C,N9` Hz|a -;9q%LVOpvvΟ<ۋǼ )CbL!0RRHX#ȀWHda((%@@FNerXmZik-E" Q3CU*\i,{׹BK3NÆSRTPWp:۟⨟ƣ6c@ 0J)D`ŘK4Ō*ӊX11w777W7 &ǔSpG"H"Q(1!ֆǰEa*WLf !"" ! !!""c b$FFHRݬd@~ֺ !d``dZuB$w\ >7@ppp>%LLLѭ*@H'Q]VmuWq  p}}E47QWVxɟfDVUp}>F5$_nnfg@W9z@p_iIpp.N3^ݙ=.LĂBI \Y1SW5sS SU)8O!'Y xz:~sݬ&Ja2IS`dRtVh߷ ._^-`9Fb`ggódd22T04iF6]a0uSQSѢQE0K=x'HS"EEsYv}:\>3H[oTFJ ddqCQ""EE08LW"E)HQ"P`fgb7{!dghh$ E0=\>~,J))2.&\Ul ho!VU:Z9X#8xaHg sՆHι٢hAy{K=w(T4`"[\a}ރuh37U""11 \s?>soimGdP`!ќ{mw>H(ZbT o;oU=X-~>U TE#ÐUUEKٜJJ_< ݐ[o;=Y..K}c0>%?lpeɕw(4KvSG<L u5U""Ji{9xB-pKnCԥ!BLz벌o#m`121[L 1h)1f^AVt<:QRW^xr]tq'l̵tꅇ!7C!r&Ͽ_yOh(nxt\vXTDo{t,B~xss^:7>|pz؞vKmiTwܠcGE JkG2rl᫷Jaqg>lܤkMA0,^xw'ݢ[z.ޕ9v}O0Bx#F8K߽o,IԨa4=iWӑ (((.PsB>(Wq}CO<'ooW.)z4{ag'&``$,Xb90ʍ. aS KŚXO>bծ$K%Z0o?Z3#4RPPPk7ۘ@C3n]̟ryRUҳS30VSm,43͎! ɻH$i|?_67D;=֞+!p 90K)*9<&ɢ$,HִmضZ1fgNg[TV,AV>d*!r &O1,AG-J( P^||I+IENDB`bzflag-2.4.2+ds1/data/rabbit_tank.png000066400000000000000000000025571200563112200173470ustar00rootroot00000000000000PNG  IHDRU> pHYs  gAMA|Q cHRMz%u0`:o_FIDATxmk7ÕܑbKM)uIh 6yQ 58 & =J^dF3$lf<A@)/$a7 t-%l}0  xqr^?O0A]x}r^Pd/`0eҌq R^3}Hmܜj)/^F8rpUUKyQ]&2&dzM)/8fLNp 9U?xQU}sMk;S4^TUuv||c?Ȅ!eJPK҅1͆2Vӎ/Z bw|0>A0$2G4?Y֖i>C#~Y~C~1><0>< `VOޓ.<@d?Fߦs٘~}^Ѽ ':7$}ʋח1g84$ڨ݀켂!Rכp7._6+f: Sy1jBȕ:~}un)֖b"+5AC^x(KB^umfH>Jc˕ҙk[9[6K%0 Xe? (5X_^s^WG[w5Z˖Exq%+~Pi[xyiUA2Kt$ 0}+Ud .Ǯ#N%2t/ދ)zhj^ y?|TMziyL NM)/:a T'\LbلH߼m[f)j=m Á7pٽȋlE\ł綺XċWPS Y}a)/?Pj@?Pj@?Pj@?Pj@>Mأޥ$IENDB`bzflag-2.4.2+ds1/data/radar.png000066400000000000000000000005401200563112200161460ustar00rootroot00000000000000PNG  IHDR1YpwbKGD pHYs  tIME12wIDAT8ŏ1JDAD_WD0t12 žm^LML VDW6w3@TQUZfWG['#dxX#v|ܟϧ˫ǿl =.oe+z3S6Uv=yfb*hjs`pse&]QC S^3Hzpz4sBhUSO !# !oP"NIENDB`bzflag-2.4.2+ds1/data/raindrop.png000066400000000000000000000022451200563112200166770ustar00rootroot00000000000000PNG  IHDR szz pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?9`ݺu@Ja 3=[Sb"3yT K"7bX YJ 4a9 &-R8Ӂ: Hv@,,,q"%"]d$6++k6) &"}P @3HHH0hii12ʺmڴɕXs)@4{Ŀ`Ç}ĠǗ 'LHbπ*Iݻw w9882yt)?(rvPË/?~ v(4@ŊPB-cϕ Eŭ[N:p= vߛ)K(#k܂j?~0| Z9 @Yee 3,$ % r(+Q*C1V@By!hA(m;`PY\P/rK UR ~R@ / 9srr23+'|9 p9~= e TTTxxxuV@p Z A"ϟ~m\A? z8 @lXOq \8PO%d9(A5$/q t@. ĂV/(݂_lA]]T3\!@phe\ |Rh.Pи5a0HKK7o2~ydP TNZ *MU13zPFFsoܸ#Pu 9Ӏb$9VL@aFn(~GP0 @]1PDI rPug-NL FR@H)# օ @94k>r 0#wIENDB`bzflag-2.4.2+ds1/data/red_basetop.png000066400000000000000000013511531200563112200173560ustar00rootroot00000000000000PNG  IHDR{C pHYs  ZgAMA|Q cHRMz%u0`:o_FIDATx\keYz}FDfef5I)$lK!E5_jʂL ?=a ڲidɢj6̈{9gsNgfPȈܽך12mۂH1[O"R\ec U͹kR)DFVkO)!BオnLLVDi*)%03U )%⠪f|]UTЩU]R)3"z{{{~~2uنMjTDMUa닩< cp|}{t\rz<BHLt7|3ӧ|JJ)%DCхUDļx:^.<1b}C@mi]V5xy:x\/h~)i*eǯ/קO>N!v}W///y_"3Ŕm LT ƨ*MDb/^T/ze,˿W_}MCZkp<[y^.o7ߌ!`)v8DzIRJDSɵ5"2eY~~~z:!5̪:Dr)ov髯n|zz~!MDƐ*\pD eaW_},wL_^^bL!Ca xKk50,B1#8FCbx\.1jf1B*2Ϯ@3 !>BT9CJ F!"1211i "Dr*VkəU믿~~~1Fjݪ ݮuY z^t~}}) )D )EPUR՘b CH)13պm[5k]+"qt:9)K]U1#çޚݖtJ)Ň9>ZɥQĦ6ƈ1}w///|l[Sf́Dn ud!&d3۶-˺_x:,z^J)FO!$c@PkPBy ct¶nHu1iMT< ox[۶ugUh$"eNSt !\.>|9Dd 뺄BZ[ѳ{1j뺶Vtm`攢R2sDbTu Z)yͤ>@*̱6ƨuS1zu]1U3:шcL1 !xso[m8˲/{f_DLU0"r<SJ1%bB$D !MEU T_js C[}ӄD$"G1EoVbLJJ?R9>y*mI`eJ.۶RIDbf"CZo90O0{P9Zr1lE""mwf2uN1muc<Xk{o9R>V.U$FU3B%C{j"#%tvyCL1>00>D oc /nTT) őy<:N'&uTRLd2Me&BMT7QErHjgC PDenmxap: ޳_oU0#t2jmZ޽#O>Y)[_UީU3_7|v:Cd4[ CD3!!HX~aΉTMuc aF33SfN)y17f"|8۶ھ⃪x §v\.! Ht2̷嶮ۇ _^^|:^^>4O/O> UUUp `af9ǧ́cwZTH)yj^1< 128sE=  !DR 2F`L43TMUIUkݼORU01!<1dHku`2q"P[ x^kk%ҏ~e)JD%Z`~zzeOH\.8x;{G [kr]J"ޮ?Qry3~bϾZꫯHvSe*aK)M%?D9S>)V[pc >~Z2H9󤪧g?Z ޿{rI1N!__ziZJ/oowb"9'3X Os[izq{!^rkKI~J{iff3S&iFA<1RAj]AU#1Ayfb$"2Mz8BJB!3n)%<c-@W23׭ދwLS<@)%zJqHg<ϗz1(|<Dz1SD41dfZ01"ºpz23xn"8n[=Qm["ѽ1\u!dϠb$:3inQ9 "TJP5ԈEz)p10 @wox nf!ѻ@ (sr)%i'3u !.5L?ٟNz]K)՜ ^Kzm2L"CTZmcH`sVkL)簮֍#\9D͹lLDD2MSt:~{D|~wz{{}~~Bm///^FߖVkKi:LSi1{({[ҧ'f! bLN2C/^lUQB뺦,8M(63Q[0)?1u][fu4m41SJ?qt:1T5CooSc. "CJz}Sx?00'@8pXrGK`drB)#*!v@%4O3R8 m@)ƜK i~}y^T5H*mkk}UG03Ed @CDN:`4;1md\/L$H?ضEd }!ߑ@o |!8zVkQ<jf9'&BD3C{kB0 RL!򺮣7cCD:^2xsSrv0DDB0- C̭uݞry!1|<ǣx{{{}yu]{4!BL"a*fJDV:t8Z6D@e @Zy'n+"z""պ!xQB_|ajVk>9Pp>zn[mUDU[3yZyj9Sʅj]UA9jZ"n#^^^Mp{|?ӟn^Vsa|6W\75}|?c mL=#w}/Eka̘om!㋊u s,k%L"!䔿f4͈U뺙 HOJ"nc;9g'3" shm !nFĪ9 )_m[=By47(ZK)ctf.%ϵuJ)Lx^aK!x<#tnsxޛ3yJL$5VU%@lmt>#;,Su]5*%m[ݶ ú,۶mmBH)O2# "{WޛcLuQ)3o&*9%' zCZCNXk c`ݶiC!@Pͼjgk^F@_ U5?*j`y6mx\̹dSSSDL11#Ĵ,73t!~uݘK?@CPu]CF`V9 Y SJÐD9B@bs=$T5K)3yb0My* !̔lȦZmr#)p\CDDB $3%b?bo<۶gZx̖>!&U !;oT &B"Uݵ]dpQ7=)ܩ>Rd"+9\ߞbL`nxn4q8:쾕2NGMxm۪Htgo\?R#ABZmHUDžy>;,zD~DOT&B!ۺ `[Tz[!TYkfRNId8XC ̮%Š<́ QBIx "w+ S;S mK)ȋ8( N*r.Dt٩N3v:fVJڳnm im[Ud߀ 橔zfCUHĎ!XJEML̈ho]kmn7oUUjc Sb-8Oq%1sV],h߽)DƧO@2HNSLɵDXJ.9\m4MMBudשL}zC>|PUOcu~QDb}00S%uo{]EpKε5fbI9jáS)tu{{ "){9sɥuݐ`1HeJ)%g$dtⰭKkp88Z穔ɯ@ѯ׫+UD͎c<sJ)7.!{{{7hc8L9g.z{m[ka1?o9'g,?ON>!8hDTJsk~.SVxֺC^m[EDTMT!F9ћ|,S6 @{O9^N秔#OOO̼mk G#dՔ2Jeu]e#BD211kTг-.yr/BkR[2dYQaB ɛE}̇CVp"]ht],T*60V] yԵ"2Nۺ؅[B$b"n1/eZe*V|zZŹ(U8mt!֗eeƯzֶID9OO[f2,`pAֵ̧޶msy²vB/p>hkH0p]73/rPb^kZu^B՜s4Mf"fVJvyw[Ji'ڶm>"89RH:5F'i׋0sJy cct5ZF#秳,˕Cp .B r.24HӺ^P0{[nWf!ߍ1Bp![GsG_})cܮ U!]gN8rjf1FGEb߱'`bfj9N0&˲D ?"|R&Sm1DKxAXp8υw<>N۶zy~~!8Y9%H!]@wn˲^SJӉ=|-۶͇>1mm}Rɋח{b=0󧘈qO>]oZk߽91\Jm]O?p!덙pa7dh|:?~??]ϯo*}Hm]W֭Χ31R>\Wz2=x3 !<(#k0Me53]z9Fsx'Ƒ%D1Z]\_p6nv^[뮌V՜3sk]WfBO֜qlV\ֶ-pYNò`X Ifn߅bJfz<bJ?|4fb"z igAxmѳ4O'[Z}G.1r^VtڶQ9CC.SRfD."#:hms&fG\4/cHop8:dt#|T$Zi 4ח!bH)x+`2 CI1Nez8L^}0SN1DJ#{D/޽'Z^BJqa>fbQMSw"4M)McHx\ "7B&D]oGÝh^9]<°z83!DBv\z)1W&q C\>]&"fbdBDUCֺk7Ub fXkE1VMUUmٶ549E)Eڈx/D4"ä[ç1DF rΈ:۪:RLcmF隸!!UM$8w mͽKhm]՟pӧiB\CMUcJ!ŘS6Ç}}}4fϿ 1/A5 0Dĺm%__xːAcHJQ|R2+!jm)zm4WɎzK)ҚADej{ cX:Fi"Z[ݧX9^+8ZO?Q׭J5#үoՅT1Oԏgf&"/v|E̹A~}!^B&cvYTp 1OGNbLֆ?TtVx"Ti]o"n5Z)3m[u4e$O>mIuiR\lۈ):b3j=l1Oh&@h g{fDSJ1y-ZBE8p 5An+i@v9 !zfjчRJɵeYRJEu R&v(F6O "F13Pj"9!`wbgu;zWWEP"bjfFH9%@!"y!R>̇¶n"s\ᓖ*rq<bLmwG[㡶Y s.)V{u6"*91O*Ye65uE\5{cfEcbDEANR!| {sGt:{}c-ל_hz]o8Dt#"]UD1wڻD|_JV>4FrZjB" 1h?|)ƴ˺)ֻ+#,t\Jn>)׷mmbFK.jS5Z?1_љx>8C,WᰃÇ{_օ@K)w߻ Q^_^Y\QJ8 N2TWC[yf<ڼ;ʝfrc1ߩN!ta*apd[m CevC9I)xn˲rʇyn`r^/'!!g[G"oS>T*}ht:: %c !1 $ӭΔ{MBpI>)ay%1~i۶aN)͇Iڼ zsIzf S~i11 1rR&wwh< Ƙ #|61uQUMCdEBD$*벸0ʰ_1:s@DG1<, "NS!ZHAOiH b"cVh"*5$I+BWE5RUdԭ4MSb)0{pw+$W&}t}IJ1Z9T9Tc>Nv-L\J!a_0`̈Bj39: .znCǪr81 m!B<5xSؕB@8O棎ooo!wwtEMz8e!#Go}9eUaJ)h{=pp#$NmYהT,,C\.2Cyc _v|zqϛR8 Ȼt x "G SV6L@{"#碪wb JI1fqܵ=0",erpeY\mxڶ$va7ul`1E:!m"9gD5x[f]Hn]BD){d;>1v[B/`>Bcz\\6s |G=~96ȎU3|j ⽧>گDۺB!suqjo9!^W#&S]W~Zk0yR.n攟vj N#u]K.}|T5ƱcOf!޻K1ܞ[.YG^¿2Q|\Z1 xF">XUҌO3zq/9M}pax_GǐeYZ`'/śbSas=f&$Uɹxju+{ fSû5K]뽻80[Xk^[9cV//wZ"t:պ/K11NG"p:2m)%SksV=O!ZZt<)EBӧmBidp~@ui"yRJjjuYDD۶nanmhmncsx<0u9s2EUdLnˆe*2v^ڐЕ܇CڶkΩO::q`˶mn津!ⶵqvIDj`S GJ)2Zk_>4Cn7_SJo/1&iux@ܶ bL8+82e9$]oD89L>6-2ZVNFDm\+r2cU"1$FT{ 9ϳO'WDm7RD!u] t[r`nzPS1C|"<YDRJ#n*""1%9e3Em[\#ZtpVId,FM @כ1J m 1dMjr9#?d1h)? D\טDdgϝvͨn $b ]0SSnAZufbp+C[C@ĄvbBw fZk'qměu]u]/au|>n_|13֯k|C˯ʟ^/}nUonJ.P[W5Ǻ.!Ĝ:׋[^W5"?v[rN^=\+wK[_`&5;hOQ1^D9p9ܼsDmU7[{ n9ݑu]T meni>)?~wߥGݶ-hDxb(ctϖ*ј<붹r={VeYrr.u]DFgb>vGJ;W*8Du)#Bێ1"2i 5Lqzwn!E3i*Nm99%L5!Ms!fW1WUzpLӤu)$B&v2Yzo)8  8"ݤ$)e&z5%8D -ZuA=ZqLg?lzN"s@XE۽ Vp8{n8m"GoCcJv]RJN!!`HMVs.{M7EDbD!#pct3-e !PQ/w>ot&\.>#*2b*SD Rrn3dbLp8,y/zU@L>{bʹ()3űc}!7y)ZE!`"7o}湨l0χޝ"xR7ٸ/>2//{~۶} ^̖eɹx<׷˺܈hYn^>HcS:NϨZC@Z9غ``uk<8_^agO}o~ݻg7a>Eopܶ-@n{?nAJv04Mqo*c!mcctaIEZG;?ûmCdtt>WA˲%"LKjv8}Ť<8x<[uh"y^ύun%pk{'$ -UNV=|m}\WO!Ґ;nMucr^Qkn6 XNDHrh !ZNQĖe1ǔv5Gm5wmS!"{9!`޽{ކ<ͧվn^^|/rN*LD4zu.XXB\ޞǣ4cP3齵_|zsOg\8y>v1pxrh 1XPJ!Qq\.S|{{s 4?Ol:V_ ܮq޻ºnޕZep< RuRU@L7꠻jv\fJyr'd3^.^/Xr.9*^G.v\ޣb)EsHsE乵ĵ5e1 y@cwmIGkM-fPD5f^1F*wfOEwgr_15bK) ̬wf.AF[Z7rqZ@*S167@)h8x"vs/ U]c +RF U'wWCcN'>~zqps;~2i>O8cVnp؝Ș(3iqy)K^>}ʹh)VP}W]HTs¥LV8\ʐbTKk)}]ח>FEDv:~,KvKIc3S_|,?-mn1S>s׼]eXeYōx<䜼9%a",7_rpMo|ɽ ltWYS79iU}x{^k y'7!OG(Dt>gog}?_[rm "[uwOv,D fV;!n⎌Vqܣ-8z0wR)X~0D"y*<}ޭ٠Wb {p}}7p0ޚխ.2T\"c0{΄'k]{oRF1Wvv1zp`90wȗ{-!#Y Qmܽ\nn wK`72@0!< M5Bxx G1h:\]E$w5ks[>W!?}u1fF@!89ciN'f1snL*2U9#e 6lu[0JNw3wݶVk5!f1ވPTrNyJ3XoSd&wF1y&%m ߡCf(ґt:24ML5r]mma>2Q9>>{Sn"ӶZU,0#¶nT|ZJm L0] 8xBvМpV5j5iN#!ǗښSLٵэ=׺!wC %އs~>E\kuBe]W諾t(QT"규bYkqUDHOP%.nngg.c1Dv:N`Wldb01LlWQ)?0Qv8ƘS܎Ķ!ir=O$<7PNy\.ovK:gG}b c[Z)ޚgȊ&nC//>RF@F9'']{os\ y͹q3, K~vFB-~fݸD]]VXm[fU8<τZ۶٩!r)Bx:QuXWo:#Uq^'Tkw3AKZ9%Ҡvsܲ,4-݋)){t3f,eFDUϣcR ⢅u9Xp^>*/˲ jb0! C]V5DDbLqJ/#r^UTf3;O[CZM"Td2 gyt]' ۄ3 X`gncV )r)-yWU>*{?wPkm՛z8PuIET1 a=/W\`)GW'ZQP"v&*kyb 6eض^_/;[6s j< 4#s(aD14fX|߆8`v#Zk΃ !"2k1D4{.nY}b_^ 5Ëu]cJL۶zڪK?~z@l{ rDڪ GUe1ԗ2_ɸcaޫRJ#T`ƌD|450har ^"C.Ves0x{{p8n!ޚ.r f˺RʥL2> 40l@Skr Cl0h9OZų=Մ{v垎CշTˇvK뽇1ęCrLaYu]TKu3wu8@L%7 ӡ^M1:.3E̡>??a&D|yy1.LTb9eEHK)>U- )L{׷7AT񫵦ħөն5Ťu_ɶlp\v@߁{B vgM;!(>(Ry?1yo@7Tkm>ojZDݷ IbD8,8xHBmx )0A'] o$`j9e_U6 B RއOH-CHH>J޴z[HVSPû{B UZg '\/Ui0Qh*Sw ژJ̴RZvVXEBPx`fpb3L7#*C9pﲮk!Fu3~6ESJ(G1F* /2RѦh'ȆV[17m\D2qT:C$ܶ6M Mn󠁄6]{dK) }|{KF˞kk)ƘލC !tC(ny&3M1 KC27}C\JٽoU80sw/)<_^Rv_i'R9ήC1GRvuzwǑu^.||mu9]/+]!w%1hn`选+D}۫ߦ2.%y`H[i]BۭZJgӔ]G`xNk;љDF4{̹4 O,91jw8),2h/}- duE Rzo}t#(Trz1ƺn}=yrrCzD.Ž'@ah6>FĄp$%0zO11iIPN.uY'GHZk`xu10twͨ*8PGTorA sd$a`.=eYZoy9ZOV@Ub*{u7}c"e,z 1D035ٶf#e^Y!Ⱦ t<1t}'b<1Ĕ|uk !!|J)]m \,0 ̘})d}0UWL)W+3r`7yM)Đs;{t=m1D!>==EFkuK`wOcm]5c81Q#M![oH>aznXZ߿omyg{~p<֭Lv/Ǐ{']5[@"?%Ő_^@7Y_="2cwǃ|_p8|Ʌc\>z}}siOxv5]ú{*Y;Ja!CXc!cȜDzJ3Bl 1ONQ$}!,k782"skzRZ]$x'P!< S}{}ќR10Ř[cKo2SIU͠.̶SΩY"";gZ{ZwI )n (3߱9!f5d"b.Mk`xPm~M%Hn+!& jlBTӀ\Y2M>Y㛁ĝo"ۛ;0q%.4M It0!4#b{)cITNGmHM@0z}}ݪ[skJI*ctΞGC$\e=f85//!^.· i*SۆraNhNc n˵NǓo}SnۂTd]e 惨p?LbB.]#r[aRrAVα,_Dx8}֥8w" eY]溭+"vZ=!1uJ4LUx<\.7Uʤenn_q[\܉y:nb7sw!"v|1>c<|pr)91FLm_fa-78N^,1Tۘ4ϥd$%jĵnLD׷rLr)Ӻ.kMՁNS/Q3}hr.zUL(*)}! ӵ9GZ |V%t\ Xj`Άy522008&bdw+Tr׷W0%{Ln/ FBU4R Jz~zQ7u?m݈~P@@0gfmmڙ4oRG]$K^F0!b^TUM Y}-ŻX"}cRDok4o[)nF;{2ӳ[" Tmܝsop`V['9D 3><rILRpt~:VfRvX]]x[8L,˺mz}tx<3q?1xPi.9C$sB6$04sq)~\̗s[Z27R9ޛL%Fdbvmy.d*rFчZoܓx RLۍSNL:]Qi#CмM9,͗O)?v(1nuj 1$Cn˒Rc̸cf/EJvYmX]맘s !öm˲>ʻֺ+KX]cTU5Sm"\0FŽ8){Sy["=kН4rm/Ds{өA{MWSݮ._߿E3c@W_5njDS50F_><2*1zavw<% >=*=YwCf(``Fz_ˇ**<#]nMeg6eYK)$uw1<TQKfFR s^C(N D՜RRyh%con$|  `?{I @|O0H?D}tk (?# @vFau7ۿCg}MܿC7 @?ك>;W1` nea8t3 3=ˇi_@Df1*'p3!NQ,{\5k?IǧHgGax l?o_ӿzQ8Po8\KJ1߷K_|D{x>Lym;c\[u.N> ׷hp8 ok6#ms8k|!e]jb V[}_sJ!RDq/$!M3f&:.Yw 7C`}Sn<7f? a>޷m}~zS~w5.f @(f(f;Y = -DU"bS DHxG Ff >ʌXUã0@U,S.v]/SSbwKc1nԻTՍ鰮{ݴǃ>+P]R}8$"X??]{Ljl(̉8T,==ؿ-lfq3=^蟽/H*xcU*=}6հUϰQWB|| f%Hul_1HI< @og$ufu#aWUԈW,7}$cc?$?2\1qS=Ī1ďGWne&{R ? 1dF!EAY}t::=fD(|9zZ}Kl֚;D(?,H4muwK[]~g>P\GtT8ˤjCXuSw!fƧoZE%D77)JN%gM"!mCч C1wx>?Rp],m8ˇ*2S`ݚۿ?g1b"hb^U=zv'#aiDž߇? |JmUdA mi_Q_53X+G>*eM?B@{BM0{  5U?Q{f'/&܋\M$ DKVe"PH{O.*p^K~v[e;dϩ1VBLױ׭a>=lHqߒB:^苔|wx&OW9QD#"#>;W~GY x>Ͽ,~Z\$(;tew~"|m րj0Q/+xyO-5{ЗF:Y7cDE+rD|#í">,VHͺ^#w~;bΞl{ͮE ?ˠ`|S}d~<:LA{']ף_e`; {/"/Vȹ8_OrW3, ǣC]m+AU">hQ9X=Q=?\9-o}jUu۪w!}< !lT;B_Z!yT d[lE\!ZH QDr/)V#bo]1zk[o}Cn>M)t<oϋݮsK9SBD"J~QfVFoWbFt7oN b*Rݏ D^~m4ff@Sikg6 t_Ae^TJ\`Zu9L>/"1ޚ[n%T[*[$ڶjjn_hc?vM?{[wjx2uڽ~;ZKd}<@~Itg+wffiAN{vZn"zT+}F{NL舘_,+"$x]܄G?7}qaO^mn9瘒v}A8'7sQ"^{x8= 7]׮z W`8B`!i*.?MهE/K6m[8چ217۫l/にgVuLdf/%{;f^{e^+mKD~ `0)&~'?kUMeuRrKna!{풀Nq߬Yq[7D)}PA BAb`f%Bgd+7`~NivQ,}@7aܴw^V㾟{}ݻ|jV߿˸s{ݰ˴Yo K 8P=^K>z[UٿG;?E-h/tglO D.jitvUk<=gYhqpzw~/DCO|1eY[9EUVuO/Ώr~q;J?+ay i{`w?@QSŽtebA$b͇WwuQ6sՄxl<мZ'_kgCmyZ}oY]&*p?Ow?EU]xR쭋g>OÈmffO9ODR13ٟ0 pY_ǝG=>|h/WJ˰WvoA'@tİ׌㇏܃ y姣a <؉^<^1"sL9s ORw{#*;N;?#V_d >/ f%ؚ};Ӟ]J!VW~=z>+_>T=~2~%{rKz|!܇hO/?o we#uaۺ.1槧>Ltx}r S>ot/"Q!H)==Bfmk||c>ݽCv!x<"(V]X3씢 Ezr\J)S˲ֺ !5?οߔr }DK^^y| $8kF?"x~L Y*zt{ӃQfӟ/ն=?Ir*Zc2Ry1O%tT5r-7 8|J}gz\|§c m[c Gzǿ{UOp>;^|B$ܶ*tѷS-`Ḟá̧43xʾ+'gU5ýՅޱ\o;pL;ƒui~f!ҽQYݹGS`"L؋,=2_c!| z41̄9>a iZO7ѧL>̄.q1uNYD?'‡&fxY?;=YP݅WPzv"|7xTռKBC_ghP4h=?-cAN߅wn,MZ]'3DwȏJeH_kX G6lÞ`u(v%C1c;Qz|qݛ!K^1Elܱ>|3 ]e1Gv&=efQ=1xo FiCHD|[_+xY`e̤(jm۞O,ˇu n.w33"vJMAUMD7فD[m߻A knkjjNSfv]{- һwϭmWw뜏nV}wv[='/uCgn5=|cf^u^O]i{7{P:Q>_Aawa=#s`c?RQ$ڪ/;8oC!qk-0ƨ[S33c|9"k^CB7,~'?y{0H{ Eχ@ەB~.~EbvM)>8jKak@Aֶ~֣gᣆ(Q_VUM;?(c!GL8 1-W-$@# +{p$y$Űs-Fߣg{mı܇zꎠ®x4"П=7ܳ>)iָׅ߯c !A-B>C~!U!?qo1!]75)bf3uOSV %P_.0Fw @Md߮lRr ?f쾳#s)Wj uU`mmz1 a1H!R-Z[*a ADfӶnAL>l?_GV=,-Ayt-<3c6|+GF{j畬ݿ6؏xfڡ#qu ~jv;OZ7St<1ammn!1zJM̌ '#>>s=UQw߲_ɻ(3|Q >J|q3LcJ>I;IIw4<L z=ِ#+GlY yggYw΃~t=1;wh|ȞSc2;{m=]鮒riyNܿ?qV1|7Qюg<8Oa""ܳ]I0=>cۯzG>և{d]3j;F?O5Qz8OW8}90MsL]rC b)%L.Aw*]^_k"ʅ)y zOwy>M3گ#?u\e@)s{Un!ma/R0Ős̶uCœ nל3׺!`mME\2~h` =;k*fI*3#gPwBj"{Vg]<-XKV=B;rEh/?;}HO1bo+ο-" ߾9Hi93|2V)9g_af:c6k!Jz(KHIdUJJRvr+WJ!NEL[R" IAl@s֚3ƚsIXĹwuWME"RЧ0oׯ=k5AvQйkŤVUgcqc!s.N¶j)>Y @S{y({fQb}me onV  pMѻ45Z?j:r7*imkN-⦁wl[ASZ!. Ua [k^ڏ5g] D\kHS[_uػa_0?NhM?֡4ȱz:7ma_>f&8l8}߿sv]CBZ|$AMܶ{%'&dJKmu՗Ci稉i U :4B{9h 15ZZk@u{bJ>;K = X嬑)e Fw֦K.9'`,/ogI4~ӭC00ADĦ1;tY GfsoB_`U딹V/Z -a0F+;O׿3{-NTLH9'P0bR*|$iP"(&LE÷o~~Dx?w1Hhcݪ+7,@dʷȺhh2qyP)p7yfuN8}cUQzJNÜ xͩFm"ƣ/EwN}jk:soG-,JDT}ޡFG9ߜ5zYS{;}k渇Z=nDvmk8t6zW6uT6p=cA2f+ ޠ5F޺~mۈ,hnJE0,[d)"RsN9}h%ss].e9eY׵:>z<^%ۭ1&gϷIcmcf& RG5LӌJ#2k5{qߏ E6R YDGM7,ai7)^)͠7f0=M+:jM!f~冚8{-͵^=*^]]i&.+di"0~07c.֞;@ڕKqZK.9RO09m'*9M[Tsa.훿ADӛOXքvzC")A.r[he; F 06@Y3A/ǷjV4 ׉ˏņC;R@}5]?Yu*m(rZMS{BK@ȶ8Jݰ76mi\;EWb!if{ 0!lݶ:!Ҟ(IEGwXw[n(h-XoPaTљ؟̩O_vUo߾kr 4MǸA"b4cc˦h%= xW:u^./_zvYK)m}zz8Vi}}S1F'r9S*.̵r.Œ+%P)xCpo[%s) ywYg4]{vp CeI qۦRjDUtPLQwjׄ7O,JƜ*>ڜwդ)Ԫ!/ݏ*ʰ : uobl-qjN Y$q,"X4dc-`ո o|W>H=ٕt~A7v,rlLL8{U͢\J2m"c 0fn^Q5z_}TӀV.z }=7섶::VHcuXGF"PԶǵӱ47o4<ވg#hFI/X26L߾GסY9$H3|J H]yYZ?1~fm"2Y:o;pJ w޶{9~뗿~vjl|֝hS`F 5L*}c !K-%fm/5WcerVU]`-@I)Cw)%kݲƘJNHVat1 B;)Y]LԔ0#r:].g3 Y(7iaBiptV[=M"G`m}"{NyҊ.ݻ$~Ʀ߭LYڬ30h6=bTfԁW c)~7sɖH #%b5&Ťm[-Zav:L.%;)!ksV16_+k_8AQ7 ]n\\'6`K5$# jt^C߾Oм}Ĵ/cz ;繱$?"v}%"3D`Qv 6?WYWU?nX-@ZRpxGVPCn[=.dQ|pmV8KbƯfa6?m_H{lT#'C+:{2['"}{5)pxּ& mQsb#\ojtrΓu\JIHky\4s,HaA$5yҶocDk nkJQ`;9QͅnYk Ƹ<ip4M4\-jTy~~F"|R̀nׇ/}yzԄf $@k\:0JrJ#= ]Ãt(1x![Q 6c"f=ָVskZ,S Own!EDBb+)GBұ"*\r6%mEFBZ"mE 5ߴ_Kk_:*_Ʋ[[B]8?!jU~#~m @fN͗Is<ؼ"RCBr[ vFFC;g;[ M#+]7h\J-09Tkzm~F&qxlEi6ёiqiGM4uݩCpjVF<ǵSѱ wh_l[(Ei:'7C'mKJnr[MVݲ&<#O]Grl:ʟ`17%;o%3!%fms"TM d"Tbn!`nگrnw^*Flk$Q7vjŠNXijmB{:hT;H}s T4_mhA}0fDWtRjȳN5єw҇^bGONϽn@#vܿ5{mGJ#Tpq cwMV6KA.݀ވ<7JsoKn;^ -4gk锿_ep01nD@DjMD\ʡ6t:g .xZT-nr8BprZ5z>??SD_ZY :B9ciE.DDq߃ٜ # !Yw𾯵9/Hw}ot1 h5lNM*sA"sf2&<s4Z1t:_CI) Ps<ѽqk國:P#z突u]p[z>g񯈱!0[GV918^zyZeEfcX~>Bw@;5PO8-ؾ㙨ꄽ Rauw=ԧVi4~ݵQ:E6A'<|7k=R~IiQZ^0M ADD^Qj"0Mz%lQ+h(9Y]%} >髿F_kmUl'^kvjifct,'SLtPБsҿZj?ҙCWAMWI\Rw_<.ND4xlgkzݿݟU[4C9[ Ý mh0z1 mB,]2gy&~ fBzpqu ̮FG'9 aM}=$nL佞IHٜ:4ĝ򫂽?q:M/rfDzB!b,˼t^aJVScڶ5T oxXTs?ϋN(BaDl6s3lw. ϋbrN)EE*Ӝ4OgmLLS09rS"dRMvqBɮ#TM=2Pk'e]?J_Kқ1UUTB!3V:}2+lۼ҈miZO1}лϞ(J+UJ.o1و53R4{ݘZ d'SgpRt\[߮_W־ܻ(Zwf")ߝ`hUh2Gđ&󓃏 F]3] 7$z8ff@wM=44 8Ks:'aĦjF0ur2)hK f"{kUۡH*㐨 az1G|4tk{A*"uEG0ȫCz~@gBV? 9|`VO" zW+^{- |_e%6ۺjݲ9硜4\ٷ-\(U_׶݈Hq@4eE=?tjS ϳVS<!YkVdaL >zZ ;ϥR /B)JHUw?_~>N{;ԡ6 G|&2ԥh6h:j{lln+׶ݵk>`ؼ-rFG mۅ17wD4p~f$1-ߋԲ[uRBVhs 4rzFKj̴:"ߔ/奵/?[{4'N^A#Q@ܿa]se:GeT`mo*Pf񵭛fȕ ȌȊX[$ O TinQ'?`ckԆ$ڧX <߶MKcFa}qQ}F:(:ÀxM 薚c3=}Z,<{;UdiB?pKlN#~tBHU8F{v^MURԖ>ϳu.LD<ϳZJ+ǘJQE~!#s!j{K]heTB)P Y V᧧gkt:[VD߹oLӽ2 -ikGdjz^"ugo#&zu~ЌK4LHa!*H|^kD8b)lYߧO$zc)tsӀO3z.3Wl}!FآmU]ajErtƉ#m3(wtOLs!rVà7\Z=Qbmϛ`` r4̰*j 0};mLf&F9"¶ښ#BjR1&H=1Ÿ'-Eq4L bEߣo攕۷K&9ƴn"m4<BD }Bˆ x>_G"r:[R|#%|Ԙ]QmOUݳ{ѱR5NJmSm>!^kN-;qU6YT݆:T ⦅tާr{8ZkXĸ"~~Y~!8DUm 00>aQ*/_Kڭ׶jjڵ*DZEs{:,Z?#EpL;:'N2ܮUG0i߾޿>5ß#ֶ.#AlӄP%5  ژ4חӴޮ9'>N)% ˗i~^52Sr.ĔsNav5NZ LRs)a,"‚HӲUoHRޤ}}C۽-]5F-P_9~"Y*QT$tz7CIe_?+X掶Z#pn_!<("3 -Ҽ0 Sxēm9<̳9g-k[g5HxgKjRJ{ׯ=_Y z?5jclc,hV(va36 ZkMfXCudϤs ҤAMWmp׽ա7F^6>A3~EuVJbn_GM/u_ soAwzBt)B0)mPyaf[fM)YkJ.emqk:q0i,h->ضm-lo3ZKCpf(79Пwtv#{7QP!j >{W(&BRonh^uvZӟZb*-'朲F`D!t[_y T>mxyh6Dܰdf7;A_eu81#z}GáVyr ӌM3L3$&왺`ǦWmݽkO 25CuGiꓬ{T -CȚt}&k~~'Z0yzވUчT):u9_kݿM/t9;Hߺ٢Y"jjhJ=;a ~ybF0; .!88`K/6l~@7|}э~[ 8L;Ui.1("mۨ4RC^txjKdiN}!I=TXՉբؒԥݝ= v5[9#jɷvt7/JAZ+ h#I5'˲ݣa0ؚ<=MHz/KʯO<{Z{1HeR8XJAIB $f0di'b*xNs_t8ʃfksΉb-r9鴤us[kybrvcVaco~6{T͉ V*{QA*ÃO4$a}~tI0,$o\nGfuڪ"KlFQ4عc#&޶xcm}SO=9'0F:Lj*ޕ cZk50saf0~_}+[ߏG-: S2 ecf0=lFX#8n!Xg c<}c2"] N~C6 ero}d@~ŦoΆE/]?ͤajULךA8 ]X"6sbmd7s0} Bv(k/QjU._ d*ڢ^CͽTj/izO}]Jԯ^g'wrq yynd7m1xçW?eo2ncl_V^OOOZܾ%r9_|O9^LB@DpIuJ<#^N1咓Uk֗"5 1G?/;f.9 ˾l~OU>AZc5׽X 6f̥d@\٘zO\7X^+VʤVVd!r'p,fG!H̐Gql|׏[;(]Z=15Y-z[-޹R  DRɩT#̕o|[νT`De]@d|mzWHy*ilz}q `2Fh`zsl: ZMY7ZSFhBik2`AbwYFy1R~a'.MmYtW[ I(kum,o2!Fͼ_$ yK[ڿ'% 锈Vjyti7:mSO!^ S)mM;n_}#(K7|dw~߷mS*;wJynmĔE87̖e?_)OnhL !xBDKS1RAOm^| !Xkyfҗ`ֺwiQ@kfLCۆ_.} t4C8\ifڶ=j2kTatJa3=( BXe{ڙ蹔g>3O["c[  0C4ɋ" 4攒>[2_+_84Wܨ PLOCYc]NT55!,6ɍ2szGw*+@~00ڑC`}bP tn64 ;߷;CvpV{5Xgt#4Ɯ^Tu =x/ `F.a0e`f3,xd 6 ,o.^ύtwuUh]UmL7r纜Iyušͤ>6h+ۿm=9[~_PW4n&O{̥u"n>?eiфy^|[KHۇ4O m[y 9!2/v[;].S1sr$K1^ !(_&;޶?## c\c7x &pt?jC[ئ!Sw( NZOES>>H޽OU۳=tgCοO?mj!@)!xH"lCjФ4\b7͗Ek͹Mf `wha=e{7 ZWLC5Z6Ɓ5BI M^`Q.f}C'4ﱍ>dw tl` ^roPJ#\!iˆ1eTϼ )zv'u!c;-]r!TVh4ij M x^߫<ڵ:ZaRӕ(wfGE֌r# ޶[1:vGFĉDc̿C{"w^E4M4-Z{>Y{SO)\XN42+Z[]b9+Əq)"sٶUĦivzfc "}i~ו37WӶ 1fumA'Զk?LC 0R ȣ' 5C|j{u?ױTsލ0QOuޒWYD8Yqߏ?3#Z|TZbEA#-3m7+rk疦ju*N] ?}.-Quf {9؇5~ojʡg9@Mg-N;mua 0z},6n_h.Ҏif9T*bo{>6ViPvn׶?9TGO: OswiMVBkTVqҫ ݨku\VGbT:}MN5uJq@V쒖up` ޸ dkw>JOpq޿~1f۶/^0R~~f(wc)iZy+XZ a9蜍qcIn\˗/۷?_%W^VbiV:,\r)>ַ]9AAߨ"mUk- f:g{{.Xi[>[;z :ڶ?nۊ PWv  ާ!rNc~s?S8gBS$""bRс~9gS n-yDe@sO-;ܘڧjE7RJ ^S4 K卨aɌ%i;H1❵u'2gBZޞ29̽Pw=׶s㳆F i:Rj(ϯp.wlCAtɵүCkTOǁ e`ဥNHFv Uۼ4ϰg'QR;.B?q171A 睖*{FA۶.eE@!mhT= cYgmcڤA*ǶʷAFjnc5-!pKcJd<>H97*G?mrZfz[:rۇ\2kJd\=<;W:R}N%x7`RRAjwww \kߨ np v1\q8O{ɍͽmnWC4 YUXku 5Vp$'k]Tk[!TcNYk6z$͈'Y[}l &Z(mϽ?NDV)୵ Ωx0 .lS'WڀhV{Q8ҒFD°lVp Owsu%v~yZi#,E"H8ltI{7V]Y+;*ܕ-1kijk4ϳҮu=[W]SB7B,'\'P+qln".ԥ֋t$ͪ8WN~( rgDH Ub 蔒E\CJ(dlDy.NYD}YWqV5K{~t[[ganxںw`ࡑ->ZR1g0,KU4鹊.RN"jiRXpƘë0f\.O۾S!{fj5뾯\5Xre۶ih測9Q<_Xb^S t&cvf0>|H; LIj+q4{e]#Nvkm* S̊[$p"H:eRkav/ʄ[)<۶}^gfzvꆴ VYoK)*H ԔJZ# ]uS^wBЃTst6 ZY/8['v9}<0 _3l?w['DtufkR NХz+Mܢ: .i=ݓzn4oz t=8z_6(%{b/f43Z,ůEѣ'"=莨vb>@,E~\eߘg/?<(N}WW :& D ^+hwS0C ūWzz|g&O$MZ}V :v3="RkU5/^%u[Rє"طyߴfiw3O…0Wku/H)%=_x/_{zz^iy{z~'m?ڷTQ![Uٖ!iЂ{כkx_zO_}zi6Q3d~a6E>Mno#nO?m~ y0-iϾ!Ҿ=!cL=$W\haUjZ@4J::+퀇=D+HG"VFs︁+*2 ?>&uDM)! ƾ!]rQ u&cՇmN2:z->}.q}D?S ~2X8k[v 4@]'I?c- y" 0GUӵBo!ukg㸸)p1Q|:SYj)Z13˲Luә)U"R:NZ^Rr윽akm%X9yZ>c)n )dI)-vXy#Jm[;i ܖWit[?]t*_{~{O̧YJ Bxxn[r>N'=3'mی1!u]uLׯ_wn]הRHB)ELHF.@52)R:SR)%S !t{Ȧ( N8|SՇGO߆a@%fl_ ꘠~پ,idHԒ&7g*t:cRNŹ@)e& ̚sb===}>w\޼y9}{||z||9{F9n[Jŋ{aRra;K)cOϥ]Xds*ob̟9oW7oX`H@.艤B2J j,Q^:Tn^Hn7\5r\`u˥?USsNGo>9KD6L}gg-"xig|@1&h A9m[wc̶凜eYrJyv\Mv0{y㻬6MӃ[&nPZYÆbƨ(ͣ1ճ:x\է2~R&Ds9w: %!BvmfLB"Dh-޼ybtΟNe^%pMYY眭ӒRrޅ_xws @Xxߡ;]gED$KR Ҿǜr1)\J(j5fà1b> $ jdz€T’.1m޳|qԊ[<ԁ"q~"!Z@DrN2[Ky'<1c1*"klf@{>_ky5RcB@DRKo.; gN1n6MS)\J ޝN/_5 gcཱུZއ~%KH4M33jwk u$dM[%T8[<==O4I)1\=u/ԧG\ucJA0Ƙ*\EDvSStiwww^_T] ww\xi Dȥj': ?κk)g_uI=ŀJϕh0nU~z\.A˰n@wka&y^v.gc<͚2gN9Ky/Z>/^pAfS{;D(ڋQDJuSyxxH){RJY-%z)|OlzUH})A[ھ>a$P@n" [gi&wkLZH}ӷ圄9,"Dm]9̓%*\j(,\ e>? Iiz<CDSB@k^J6TDSI`UT0rRXD;KDV& 0PAPOujn*0d,+m?o( j5n@:_Zԋ*R+*qdґh)sʥs{W5 j+MRSJD!7?>>Si&7}sޝ==cA031)LJZ4ij&3;gw0Z)%1z9-w BEj5UYRrJ`޹49gcP1:0%bk,rZR|˹+䌈!xlۊH)%kt>,˜S\כ qjL))B@IugZ,cbkfKB9UD"iZ(LaB@7Uւ"H1#heVH)4y}MHj.X)ӾoQkZ;kZE9P%"`NIS@H (1p[:uiydH8]ңSa@Cu(3+whJUSz_NRpVa12sу' 3|cDtwwן]-:S?sH1\/UyM4E$SBy!o; !\l&,k&!yUgTSrQYKXHZpDe:\hQu0s5U/KS<ֺ=F,9}ʋ9BK*z Ԓsαo>?_̲˹.K*" yf.*. URn[)\:eB}JsMgbD;w:-0M`ZTٖ")xDpn}g]<E/zեژ!ufc#V֑ B*{`@[0`'d//u A@a^I1ŔQg\ 4M^DaJ.Z })_o`,Y"+,RY7ML5HXr1jYJc, >Se3ZKY}dTafckbD0ӊhn: tA84YDB. ۾VG"#)d&MkqNҀP '罆`rБDS|;]T%kR04OK]rǜk5p] *,j7XE޾}mL}UR%Oh }BDOOJu-l*h7뎕c.|ޝOOϏ%\Ru[R.O>M@Bhw%cJmWeBP.,R Ѐ-]"s*_|*R~~{])xnڧNmϝAus˨!/D΃QW 4!4M!=/^ӔrvNd"ADQ$_ey["XA9Nyn}{tΖRDKMl:?| j̯>=}$_~.La  YT @$D9뺮sJ9MYm(c2餟s{ ,DdSL"&ݲYؒ%"ie"b-U"ջcmߍ1{]ZS\2Ѽ"ZR @5j 41Q}"P8dmiuۈЂȻ{S*"z-弫UғDt4gju͑5! _ԃȶ\+}lHd, .E !$ܲZhtUrX.Vv 3X\ʶqZS璍S;?N!ŘSBȹn+!k1SjQscJG>TK1 ӨRJ)Y%a=CS Egr:EkV PK)E'0TsL~ Sr93K&}ߝ<q79,z[oӲu'炵7CzZ8z0o?~)wcFO4}۸u׷۷p:-W/8f}Ę:Spў֚sff.:JzU~{]bCϽ~MM`5 lm{4R􄙎Kw,՞_A <igDQ].jFys8V,RKD4MՔ\tb{VՒ t8+}>_xYɹXK2C{߿ Bk1f]Wg-4ɍ@Ę[) 5O?u0$Pwޓ3eb=܏mkOOot^x3r*XrQi6hѼ:K1"Y);wDS1znۺ[y()XLEҼ"@HT|BRT.RE"L)0ՔELyʽeQgQ}j-FGgJjK3e-k{l]Rݤݴjc7ǜuu߶ZK79D"KąaYf"0GX,cZ)e]Rsn&TԘ" x{۞S>`yb{)4;un޹؎$c2yM9'g]>ŝK1ZMI޹;&}dٶVS+"@ZdoKTSEjْdsNRbL{kDʅe6ՀA"ᜏJ1Cdm4M @cL3"RnJQ Z[rƘLӬ˳u>xj'KlZAW:w$*ZSJs{7M =T.bj/}z}VΗp82+=m_߅H#X#EDd@c0f].in^o[R%T],0!""SNunu]K.qAǂV}I10Y4*A|>/ȜJcy6fsj%)cVf߮x×ua;{W#:8z3տrs"R2]98g gSkAK-c cxgk!Ma"k a:D@z^K9'=D$x?M"3Z,dt[ - 0Yһ]ǸZt#jNtUPMRYZ2huyی1NjjiR|z=`{|6a bO "".f{!wGL)RҝUsH֒ jm2a)K6TaV]Hxd+9QgvYSz=|q0m˲S@.|[U! hUJ)kơyZfM^zK1 K)yR>@P{- Sګozj>K){_J#B.Ȇ^x\4n7}mkEq? 6Ƥ#f~۶mvy7]UpJ)YH7!L I/,&SkIZt]1ιi0vH Aj^4YgArR#9 y&«W]dFҴj)>kC~TѮ9CClfϵnCs:@Jq9i:))f$:-K޶mc c k·Ko۾RM"BN)R1˱|"秧Dn׫UgSsOO_{ÀVV L)bZ=XkݙSAvy$6]F*ݾ)W_˿?_7:/33oRE-*You s)J#Y}Gp&]ι*uߣHiZrN9Ri91ȡZ1E#XkADǽkJaTFRrAZA$#4[+,,׳#x}0U䞯H/%GD2Ot:tljIrNT $j]ה180"iG%W1mW Y%m]@ꄸLS!h}D^it9El-8Nr9^=8M2:ʥ<<}_ǘmՅݝ1 \S*jeg"Fv\PE;TR*;/UD (Fdј*,dNC0wο۶o^/^ :`scS/h]5xi h)"7Ŋ0 1 f~~~\^߾}t\h N.ǘKV/,Zc,9 1隺#!tRycLK6UbtN]DmɫmZva )Z0i%. UMחE1`"4c~_Qk0!۶cԾk +r9zLUr.bJf΅i !L`-qɺPHu֪f:T8s)`*ϧW/pԪ-KNsJQ-Krw`>Cm1ShXKB&Dᒓ2,u5Zgqۺ{q?h뺮5ƘSRsٶs."N˲,۾sJ)ZmDwnYsJ1#R3jrJ)%K6r 7oJBS 6<[kZ)G.eMG1ŘNq@9gc v]yzk)௼~JP YY=H\]bDޝ] )oZ^Bkͪoޗ#62mz]<ϊO9ʉŘjӖk6\,a0Ma;oTRZ5 -ajjׯ_OmRno461 kZZεƦf$eMNdU5POy/|j5?9}u~3i߷"h^Ecԉvcj@Z.lE}NvSudVWN ^o"RV"F=h9` 9gBVU*Ut/mLu9-˯Sru0R'h/B +jX|˵J# 2!T5a5ris!mʀ) ®B@Hr"i 0:WoJm p4D1F9zoۮw>Ԁ8??j|^1)RXai DsVq]o 9kuNaR0[;isZ{[0U>S -Srf]D۞bڶ X;K?t"KιS) Zŋy-gﭶ)}m+L1j[s:yyV}sat!"o)TKaRy-}wkiBpʩR1H TYt[rRc5%`rɺ/?WmZnp|ʸR tl6X{TT'){U$t:-\ZUvp""m}X5tww]YDPIt=[cAmѴCC$Ķ1B] |K_4U}7*l9kۺm[b0ZWEJJ5KڂZZQSJ1ZT?4ڒSΙ!P0pAPfLYm\{?ض5Tr^]SJ0߷ JeY[U/U|)"U/8O1bRTӢca!A0jcfR J,L޹˾muNHJZTJy~zz~z֕vֺy R"ROhz:_eܰQ=4c^L_{_kӇ/<7 \seYc,RJ*ESBdK)ӹ>_e.1e mN;Rxf%[QI F)&k5̅TX,asrBmDtQQN9{n( }M ʯCdh 6HUс g;2*c<^ 0V9!?mdSݧ#9=hSݺ~V%\:ܐ1\@(S94HMAqZi$tH9):k_xr:1R >u޼yÅ{yz3\eY@Xt/9leS*Mzc:Giu)FD1FD|V.Rl:z|uHWDsst.`Mz5D1F KΟE[S.RtӂtE}}/۷S5uYTc4Skݷhm75Osɢ/\.hn7`aS.Z+:?F2 #P\ڟy_};_"ZiIUV|㜛~jU$ugxcZ붭w!Hduv|0Vk}^ccM>>>++LrֹZ@UdJ)TkuyYx[7fN dQ1X֢Q5D:Ɗ"oUd3 Q؂wDln/͵W0oҞ!(1l?=dT¥ls}!དྷ4sڍTKvg$}o5p9ܔӶn֔򲜜d.sf)焈SPn1TI)@*W9$r.K%sn 3SK9EfU3zuّS[r=v*~P@25d!Oppm>BsDos3_'=pL⌴͈²_oW=J\1u:KFz*1F݋ >|!n" ?~[J yi~~z&{HͽjVvlJ=P ˵V4@$,4WGRxam:O)N'k{}8>dkL5Z.;BK.&ZsdI0i^fΫ٪Vc-qg@CD Rwb%[KrSLu[o̢d#,OgRxi[wc 61S.%I$$CFiqI0U(B+D#"@t^u)(UX)YR0޾FcE,D?unPm|mqXPߘU3K}Е6L}wM Xľo:T3˗/Er9+nO5L5DdNafö|^X 3G};,w/Ns{)wX!\6ƼoDx]gay|z\o7\4!Wzl5ȌҠ&R9" `Ϸ&RE8Ƥgza uS;B8RuqgTEm] {5@*I{U&:˅cLVUVID(qOj笵6xOD*%Z4^V<\#:q΂VvJ5djѓZ&W4lծ_&RZrOi6&!"\Kb|C~B#ŘbDTD !xgXGSzZ9fQ`*.,uM9c6לʾǜs)ޮWz>c|1ʦۆ`I6i֪Z\rֲ!5ڶm1}v:w1Y^Gq)OVg=@5*l/j5yZ0!\Up>-{kdZ%T+NU+mcܭR2Y#N &o4DDm\;:"k}}߷m%$J.[%$BaN) ιK) U%"k] M|PY!h,V,9g,! 8oמ<׊7Mϖ[зf)DdܔB 3 =㾃hL04O*|xBs4|\i3コ̶mREL֢u{y$n1ecLp^DSMܓ%vS.~煅sSh L%Qku-%ڃ|i=&tּYOPkDpY%,**hL.W)t:-www*sN):k}9 ]e:TJ"wDt:_s=\RsŸGއ)LZDBP^**T1Bԥ=5S8PVáoi2P8hYtz4J[؋*(]j"K&_˝scvۺ!XY3 9B0"1R<眴c.۶Olj-sJBԗ(yXR 䔫T(cjn!6lLSRi T1ETqtNta)VXm1eYByg.d٘ 2M[ES9PQz;)T1dI{xTH-̇h :PѭyR s_w 6fU׬6P1 #j {pb-=>aa)%\uۚK^[Ji&L)y^\%0Mx(_vmBNֺv۶Ok{A\ZNjgVvR;jcˈ1Qӓɘ=?_9t\mgsжU_5)t5u]7-a U9(0Z%*D)Ln1Rŀ],UL5jS׮^*+9Z$AѬʺ3l*̄jHoko=go}9lSUʖ[ubi=ܵo=FF6{*#>ffR]q$q׃V9)_;kmg*r9 Q.{ (^kJo|EiVB8Ϛk'»Et41ӓˬmf(ֈmt:1j}gr1nZt:Lew4M!o%{ȥ*E%%q)·$wxL.pLJ))={)eg}՝scٖsf  D ⾯1FirWKNjw9SZղ:SKZnh]x.bLv*i(RJREG:\sY-VEGf`P\x<Ù().֒ZY͵M-rOlCXUJFza zg~CKosJ 7T j* x߈=EkMkݾz=U;/*RTӲ, *5=u4B\7E sL:GG"P+c_V1%G*)irΖ"Z˫I€F1Ũ!O3۞ wd1<0۶"PlYiW\EZs-@F SФP,R1"UwaU"{ 7)N_~~ըC6:=ckr`@E1kbJy^QPJ)RN) $,`2Hɥ^IBRq 3ǘb!kw ^msa ¾뺩VoNB\ΥzVnLcȔU5p??pM19k ?L<*\8hKfTEk7m5,YTs t&\ETm)&$9E@$Gf9`gsd>мp [J. TdH @#A[C)G|%Tm`V=1F63hivΉ"8}n(UK{cTS5Y\  ^r*̵o۶۶HJW9g.em]kyzc)x$"*U'-\23OH9NYws. 4 #`RKaeV\Y{hHbYgU|Zfu;߿O9+u kmqڪj,x^޹S9ƘSVLW9Rbܷm_y\.-ա4))RD-dsFPDnKi )efdSk,"Wcugk-: JS:_%= %6y9[oDlܘ֊mE*Z-jᜳ9jZKD0HR-xgOOO8ޗ0B1yѥEb>b9-4Ms^Y4Jm|@M@l:M}i*VyxXE?HD*gfKА-;EǯFKU\Xf.ZT&jF T5V{+TcVbL].m_1ѡ  Q" /c4CJ] :9Χ#z蓙}!bcAKhk>܍ћUK'hk46EkhOPo"gz"de/s %h9%a!KSPO!kK.?cʔS WKvNYxEn M5{dSI΅4AI0qCU4vi9-`{sBU Xs^,H҂tRJņADSsV sΩ.90H]pN:PcG \HtdZrq3giϹ}K)G[5i9RJ#X"9vY2ra$"nc4 twdT8<w~7?D[;S :Ndgks8c&ƜVfl|GI#),yޗKIZq)ĸ1 @u%Rp 4MzxKf~^[̛˙TUwXZJ&ml?>>"زl oQ12TYk,_"D4EfD,-TSD:ZKoTA/\j,lH)u$L:-Ѽy^nyt`jj1n@3 ҂}""RL: pEi,oj ZnnU/Dm,j֘f#RJ^D` A_{Pnnz2ګvŬ&Bu"Z AJBOpW-5qATmW0h[HQvh C=? TmYRJ\L5rwv*[&”bIA%i&Ź=e1=j4rvz_]/G~(UyBP6tmYfB1ky|1Fs.:#E4Dr% K|v+)&ikmHEҙ#eYtʨ\(ֺR=YkR4dj\=Ԫ rՕ6n6Mnf5lK/oj"BW?t(ZTz:1]AR.: %ǴW<%@3x]FI9Cٔ"tqWi%;sȫ"":N a+:ۜ URϷED6 q{DnT!: :o~?ּ?/;𖺄1nۦɎ>>Z-"u]xpj٫sFRRM5 c5Qcxҵw۪.ȒKI3omAZBM؝G#fVT~<>{]'jQ mogO%ɲ4?s'UsUeVvuU5!?WnztC TwאsdDfdDŧjU]h/B<"ܟ33 pДDoe5"j91"Іyb kW7{k-FN'܌x_Ea`^ݞ!7hLɉ2+9%bn 23ܹ`pօ9pN4NaZO)0 nv:pt 1|9,]JAVu|E!P~QؚR=Ƈ2/:jwCQE`f1*y)Dk5"QMBp2<ϵV0ݭKc.w{x8:@# 9rN4 |j3UF{f䊙C)qRʤKe(RL͡pCZo\AMEDM#906>opAl|!Ϫn,u?laa+mJ[#KVJI)=֑BH)@J$dN!H@艄Rl" nkJi:C!e nؕa"όć./._lUίš]O"E bmj1t9Vu!2#xUeY]X eqe;)|+'(5CLA149t[[S oV"p,519S>[-`w19GQ',A$?l&'R-<2oF]b05نܐv`Ec9Z332N_yb !|<l(I`rkY̽ډ㱵z:uwye=[)Xb4ofvN!0 7"wJcNK)!H)ŀE 0Fպqk~,d3D|y  )p¤^EBb拋Pa9ИU0u9,KF8TJ R4ei[14h^5-3wbK{]j)e:Z J1=# T⥔\r]jY$L1cr8ZJɽ a%Zohy8x<(aK)s_כADBPREF\ %, +(ѫim SZLnNט8VJai9'39S(2;D7UF%sBD\s9 'N4a6 6f]sR6 \J%ŘT4 w=lSݠoA]7A7b;ѸV8ռ-J{ @'w瓙jK9] qK1jcVSD9B9-ˊt@f3ǔ3 (9ӑcƜ' C0uݗOJ7i|9HdVثŁ~W[jn8[X.c5suB$e&aY\r2CӀwtkc!#"H,) ɯ]pGˢڅ&=ǤZ{s\΢cX /YT B=V.Kk].9Z[) e(3m[/-g?tAhx!umoov hRC-d׿/mnh\o z`$Gxz륔qnz%cx<1tR]qpe^q܍ HWgrRx$;[kδY [RWQ aT K!fޕch75u.@UklJ!,rM; (ᾪTyK <K7zH hg"jޙZ$@@z&YozZR.kK]kJQ8neȻ~ BB%*^pX}ę6# HKwƸX5ϺuEui҇204w(2uwlt{UV'8,m &nӋ *Ҿ N8Z|^aܼv'f*b x88ë١dJe2C(uهqtwsЎx8)&e,KsӲT3 _X طq)!(|7=o9kVӔ4MUC`fFLKe F 1&%hyΝ.{+[8(<#; )j=7K.9Ðb!TarCsAX$=Bkź2猔Ȏn3~Np*35oƘ EBj!LR@Kw-C(䜅jv<zkRCЮ!8 %[Ý08B)|yqquu:O f <\n n&"AjO)ݎ+| &ߏoH13 h28nu!݈ !;⁽Nf`8efE@ƔZY{y. 8 7v#^rNl*LR]R3 a`icD{=g[2QWN޻֘v ܼ >0 llILTkON#&uYBJ9=Z[ol]W zkr-%*̀z8 ܑhnlh ֻa!4goSPW80 boqq9+$XXBWWKP嬙Ru¤KݾkG18|:HsA^uq xQ@7qUalfuvٚ4B"6R?ưh, &&>O\VdeL,ANGx2K1Ƥ]y!asg*=U6S m֪'r\Q|ƌ{NSb,nczה{l!ywPJ3;ֺ!Ȧn- [-qo "R͕{یleKs^wfr<{c.̲\-`Ju "iڲ0KILAR6$63SaSL`bAj'Zef1uRF{!C]U=CI)\J)@ 󬭺t4A;1iC) C0fBZ,!%@i@ݽR;# ӊ`fJd&&D@tf[nTBj7ƂEb)#q콷y " c)D9*Tm0 9%310Pp}e>MK%kE^kK#Ƶjx$"bAZSJ,A!j{;4fC8n,fڊ]ڀFFlڌq}F5yϐca74Ͻ,P=$hXnǓ fu~iv{aio(g.// DSS|j30LDeM{;M=5?|Ӵub u'`m]H)zJIqQd䜃paڍ㪚)C"v.r7tZ'{9x~F@ fS`Sp-$DBQcu:)] XWFNc)`!L` 㸵0k!bk(ɴkeYRr:rJ\"q KN\tNt˒SApʀI@#Pʪ#PL Ɯ20UYdD>ML$z^.163e=FCYWaF^mMs$ޖ4Mq fĘrJO6H/RL0"b&}<4 ޻ ,xTxҮ,1 * I~wC Ƭz, - ]dmB !j.eεZ;O%ոOiZ{i~zg$oWy͉L*#癉SJөk#ʫ<(ư,b){*WE& )ss߅PHVT͎9}6 М1 Rܵֆ B.(!NӢqD p8ݻ;˗/rR2{ cj"r4hȏCJ)B)%03,9q U!6ȒtŅw%Ck29pd"L{wݹ@Dwsn)m a累a8' ܟ<Z@ CfA9 {;)C3M'aq}0b ʰ\mwڑ<*!Fݺ0VPRv]k4MLNĭ/ 4uv7L!Ic- sQlb^.C`l:Y(>Lj0ܩZ[ p vv(+y^7ň&bWf" u"N9ڮ[]sNf'7kf&sAr7wCLI{\jt: ۆ2w74Atcmmn]ax4MČRZ!L͏գa^BTWAyƔƸC ewl#`ƮG7(ei]KԚ\mhk ͵e&5!@FD`eYc^jf#_w*6NƼ=RTSJRj;KnkILIs`")r>%竫i:a+&f֣mZznNj9pIM3m}b*,qMfxk`M۲,<9y]jY{oLԵRZ B,1 ѐR '4uU7d9իWm8 Du%SOiW/˖f)tND4U?{̈!U1@BlːS|R4 u5Unj!1شڅٍ {03 SVr.j]yڍ;w1B N)ZW 0L)t:QRT=4Mt)sΨ:3 UD$4ψhv3gad%Z[@tZP%gV)%d/>\NvJ I6Va3$qg1>2]͍f¾* 1†g/08Pܩ|u8^K;:<}Z$n,&sJ1#?HVglWeg=u+dk}pΊ .w8ܽ`xhg6S&1;Z W KfHkL Փqܹ/<U&굪xjk06f|Q5.vU,Ͱ !֊3im902buX#ŗ9hܡ&e.5a'ac"M*wmFgx[ļED1BjnyA272RɂvdJ9Řnnnl ̋;oo8,XVuCcbFRogoЭe{k~6:{k4w"w5 4cU: ,Rf=t8b !\ݠ#lkgx֖ZREGhg>r8)M !~sr};_&-2n!с >jy(Cﺾ^Ke"gr꽧ta+R< ҔˊFXn[a bUW)l8cbn1 vO4+S1n1hRsB.ݸ11 &1 whLr@7{޻oMzIUuS> DϖYNO~}lH[=98n,N{SϾ0bRpO>$À=~N vВESk]czo iO\{3եҚ˼SR蝇߹u{9ݾʰ=.Biծ8y\:؂ ^LxQZ,|:M"I7bT-P425w1C)egs.,=acT[uw昸"Rȇ8gjœRkwH)BM!BAvwCS !i{;͋9B&DD< eŒ\09Z[:3 jLs)BB]Qph %8\@6%-#oه0o#~[nojO9եfꂕ8WDvj#5X2ݻwljifx<º%`ӫuaV){o_^\‹$ZoA(f;|jIHn&^TE2[U1j#DhdCLWU\+yʹtR!|qy?x1/[W1qET5ƐbF xG7mh jֵ2BDKRp:i?>/qnq^4:MNA\giucF$DRk 3!ȕ3dr8fӾȦB9ش ! A 1`e$ڎS]"$Yٽ{}˗p:}Mӟ䧪܇.~N;d7"V lÖ*rBo` ۖXk=!cu^..sN:Jcb價8FU9Uw_c )Pt:#\ٲT8`I'G n3;:Ęi^p/<-)/)﫷jN%hW5ݵjFz5Ari7x4B4)'fI)@aеJ.Lq0|$e1C0a,.3 Xf3uwlflPEF=0LmIO)3ByBs\sda=9ɬ2nXtİ8H~ss3 9Z: Ra<|R$x (6s)o:'lnz߇[(9f;;L4a$(\'jkK92,sfT^HNi%&s !9 iB.⁂D)b 5Ō S]ja A"9@U34SAgJ@a-)jk5ŸZ Uu9Z.ٝ (VA79'?կ«1^8lY͕(3>j}ó?` 5& $+RTx|z} KӋ[_ng/_/|qXӴo0/rmf2p9c"^i_! idwp2wcV0_պ9ˊf0C.l$1U3K暅KR 崜&̵Z[ S,[ku7PcIXtk63X@;4ӕbPt 1kIĐC:M,axN(7z!0pZ,p.(R&^Yh5xNes @!Υ QV! ǩ;gdEAJ̭U)ajRNڠa"T9Mfׯo|ߛYhƔRʽ\vm}u-MDj02]3Z}Cg77WWcyRݯۙU&I xP=4c<r@39PF(2TB L,]B{'$i3Lܶ(R $C cXt$7c"%4VJ12 /ڂ2b\A)nW[z"tTSLk7Ϋd?9KK)soͮ"Lr{B8rLC.a,>/i^\9Nq~쫧O_\?aGn]]Jɘ9 9'3_<5e6dؒ{WUp8ɀ'.9-Mӄ z`R˲QoիW)% qSN-XTW03 ,qp0ה 2ˆaXܿ({8w NF̉l50FWSfQU|t9 2y^юU^HEwevac:кQ!sn #;B)q#vvĀJy^0M'eC{&hRL?l'~ Ka("j$Z δeM4 !8yL!>tSf}}$Uq8P,c%x<裿wN!.jb10uoڳW~/~_tzv8}WCx[wcrȩ3G5z4M3*1kTs]R.04n9{u9YrJ0֘k.k5~yy!%\zo7pڇqjo[Dڈ :W P#殞p<GRy5[K9/ҵ_]]Nc e1U&"Dsz(@L;QTe#1N>YdUdon{|O~/W_Zoݺ{bw!صva(fnn?>{tMQLߏ " $@~ \*^( m/$zM cCn-400 "х*SEd:ښ&V}u4ij:=e˗p35lTewd"cy/)J)cY:ϓתs]H9Oܰ$\5 g9GUbT'}f֠9Z;B2H !Di 01RiM+ a5jHĦV r敜onR4DAuۍ4mI^B?N)!3iFj<\-܌eɹ`BTucB,b!TuX[K1۴_~5wܺ'|oÏ߾}>y:cQ uVJoEjyy926~ck5r2""%g<{*pߧJ.`k2aDoCK'2t(4ObwgO|Gx˗zWw!b a7D0Br !ULT5 !3K\2 dy&E!>Yzu>[G:I9F"@msϘeuAB&G'a%;RԺ|k !fnĜrևqH1" EjG0$D̵bU)$w[@+d"xK{u`Vn]Z6>f(-?>n`^TwmݍTXT#[׵-In 1Xc(0 {ecCX=tDچBoU֞|_MOiZ'1_]\8~"^^un}>\[n7<;wz/NMk2t֭w>&ql5qCھ^{楫&E,(:N)WW)y?}䋯~O  PU@/u&D;H]hZD{}um۪!v<~WǺ45v9u4ݻ᣷kmjvuuxuhs)!_}fC0|wp~_^T_=zуܹ{~߼bA$4Z)|*h1 ~ZqW_|7~_xտނAbѡEy"$Mfs)`)bTiBqVwpsZwa2Θ "4Xw4q8B]wًZ] AL_Ϲ@٢j;<]$v0)i0Sj3K.331aXyL4aiN9]`Rʽ+1OjVݳɑHycBF*Ce.fpBtjr <X b.\i=s=,>}Ya<8sN9ńӀh5 %3ڲ:]΃vqq#H&͝LQؖgv8* Vh5-۪L :5suO}Wk͍ͳ"k#W$ s !Djf{s& a`Of5()ayNJ F*\J)Xv㸪iK|! jiuE2vYPW/^޹}r~y(++zeQխ;o=|toOO?篯_CJby8hC"֐,O{g )\ɉڂpa9]pQtRۅho>=`v3MN,5<1k]DyĪ+'*@avh s9ځȮ{˲ns_XP:+9xJ)SJKqM%ln&ﮯ4ZwZHvS ,1, :y2qA 30 ȼRJɃfRbwsdu7ښ3KA,UTp{.ea(nvh3{-絘B9>z|ݸ1sojjcRbm-N%0ѩRL)l f,DUhF*5,)eaV֪0=ZbX& 5Da,Z/Y!53uRS ۡBLpv;4ҟU/"V~_;n[{7uab*99!oxpMt8^\x_pzt{7޽ĻWO|~}۟|c?P)߽u f 4½NfkglԺj}uu"W_={wyg/2,)vecLs?=WbDPZoi=b4O40{ Yf۷o!u mz=be"fBQUzYUs.Dft:m.$3c pnֺ,K1pL* tQ"ιH0d`+Stk7nPS8m=T0mqHt㝕śC* zfӰ\qș DkfI{P +Aofa84c֘e{G&u_^t]"I{op g:ؓ("+u{u/#'oO_C}% ajT6G>x[bڴLɡW5uZc)[5N3sDZmyRd4lOmռ;vDh̖BJK"|y6(5idĚ#f'7~ 龽sA̼ 63ǘT)XEč g ?-sSډAy,Sm/~qZj.|w CqZ+!ކ\DDuAYN 25moi^~Փǿ/~ų^tE.k4{(H*fn^_?ݿylEVv>?g}[~ON1.u]?Gb~Nǟ'^\_W~?wT49g)P/^WrN{֣?~nN{*rۭ֭͵.vWr5$͘ݻoݿ8?ߏ_Nϴ?w߾p.9Nr{Y+b]joE0"de^Mk]Pce`p/@R) g,e3a"dBf^ 5&B}VFιYq"qM%g*Q!Hh Sf[ ey31Hp;wDiToUX [̥D1 rj-8Q50#ƈnf])1 3G];[V2Cm>M־|7Ϟɱ˫|w>{w{nF\ 6o!q,x׿/_?~0! 1s2RO /Cy79Ebǟ}uiN郷_<92;Rp$BDo?.)@J)zv٤9O'7|/O$ʭ[w÷imGuyL皛ǃ`<b-Kpf1a4d6D?bBW9ew0Ic8čgU:>ϙGB@ml̸]M I7nkI TJ5)Pz fp z0UYL)3h03j.se()p$@xY4B9% W_2x8d6f.rv͹iۥ[ 9sJY#Nmd`M0WA+`Ѯ`ط&cF;,Pٚ˦cJ)b{>#{ . Ժ{k)'pkD0ibLrDsN +TJ%tnBAG,f=H)ܷ]|n˲@]@.#o<}Ͳ|λ?xC,7DJ`}N_y}8<~/x|~}U֭;o?|޽w=zG%篟=_^w_~wC )gw);wXW[)I,1DVѻ6ɣ~W3U};-\k\f;Mowދ7tzO޻wΣGoo=AщIAV[WWoݿ΃Ϟ~/_\>DzW_gO_o^_}~./Uq( Pơ3N\>xGO~WO^O{Rƥ.{s $`(zkZrVurk#X Ѫ9s#H3O*`O͍)E($Ɋc2~T#'[ِsH S̭7`tW{M>,KE[J 1kD8|z=]U;9T}0P"f>ڨƸ|oCEЍ]ވTf s-I-8]W%wsHRmFKLlA;j]B hb ],K%޴nD`K=$րD$kIچ H6ym&lmnm<D$TAk"M[#lcB]#f>XCs V j!0jL= LRFdo&m"c\湵>cS 0meU9 fSl! rlՒ}C}޽jM6r›gَǟ~~/߾{kIy;[~W+m]@4SJY$bNjkezk>33E쵟>}jj'4ږuۗ1?4ϏEN㩔s ֻcfDEU[C$#MkD93+_ a33`A#eA;T󖢉T)Dm-C$ 2!$po9NxQ{?K{7"x"hU_"e=)y>v㈺LVȍ4MLS\)C"D0ݧִ|S!v<_xE1cyo{w}筇@%!rJ!Ȑ T糲>@4\sjwܻ[P#j8c_iY)ap638o>Rv}qs("!12i\\R\*mU\]^|[wчqGotcq?oV?/Z7!Wn?aexw<8gU"^ͺj͝%?yxϞ/?O?{u{pӜuhnjGyAO"iJ)j@r2\R\;ڇa aak>y["wʐBH 0znD[0=+ULlHrk,XY9€DߺuifFy:o'ycklcU@^BX.2oz4PΚ{S9y 6nHu\2~:N1&UƘT'b)ZR]ػ!;!{!ԥkkipJJ&g ݽ%Ŷe#'1`!l&(9ϛ8K)H^bxmSDfG,,~H~M^u~òtrhg CB1X8Px_, 6C0 f`겠iեN'wC]k-ܛF+V:SPS̃EGhkՌ>_a+4/˓/~7Go7?x9%aYZŞ?8/KƒūW˟}ٯ믿{4Xc S hɛ&ܺ=ݼ:cL1y{9n[%߹}͆a ݻ/0[xpO29֪?[zon'oNb_Ns.ޅږZiU߹޽W<|;Ws^1Eֵ21BX,sb ! &4rf R @p׮sNX`AUU:C)>c Ld(S Rf J.r\Lf`Ę,89>HQ\pmYB$3R%Av.o%"<RLA7%7@H*6"!Dwh>njv.y^`{#ҵ0XZL4c7nu "\tzo)qp8F3ń!ԺL1ŴJ{ɓ'^__Pqظumfyc>uWfhof&LmoŌ(ee;pUS R BѭJhA홦`6Mwu5{s>9%HdM@DU֩ YN|v A8<PD~Zc&LN$ʄk^5:g$g^ R[@o8~o~ݿs'ƀfk 9Y9Nړ/~_O/Xr譇plO"V fMisܻ/?՝9վ,swq9lCtZZJ Dk"S ,Cև7$~WdH]cHM[N_~MO{a:SL"z;ܿsWϞ>?CRg1W cpLjn3ֻ;͌tJqs(x.[.+H̶ qh)nvOkǘzycs6W󼤔ı(ԻJ)7A9E"9|)HN)f0V=LIík- Uyd("R̈́1f>T)%8O(Bԙ (Pq7nZcOx=?>xn:΀vMbwuVO~˿ɏ_1oo~k,ׯOǟ|D}({0վv]|xoV9F QPcekm)w~,n7_^1o@-?4O,bf{{Uzrж'NV7;?oGΣ?w/{Sާa`;/v?w_~ՓW?CifK[$dF"0L }]f4-0 {#D02((;b JrD$k,Ī}w?gíM,f0|>_~wzG7޺z?xƜ`-쭻;ҵN_&"\0 Y]iv ~ !t3ϩ<%Wu!o @m+2s1/,߻VH<ʂ-%hNç_~yUX^N7gޟ-PH1ܺ!~;?/o~/:os 4q\C;\mY* x2_js1Z[eu݄H %Ҫ3唐=b1`34Ol@ܵék]{ԓKk]!TD]y#3Kqaf!nNt !ĘY`lJDk<}n9feo'FҳF|k*k!9ׄՌYZk$~gc"H-pԵ>Xby>Qz~믾~%Nfv8]@R npʣޗ-(6v>{"Ӷ a]TC [XJy|n1f,zZ,zrJFL9.D`p@$̪D֙]ff)(121ԺyA`]@F。i֠t:=[_V֮.#l15CҞ)!sFS\r17OSѻ{o"T[ ܘ84 g?M?_'i~[t;wa?1?/9``}&[{,h[DtuyB,PڻNn@ 23n4׺;H(fSJvɻ.ts}̈́ cy[oOo_^>y_Ǐ>}ݿ7eY릨 Q7?߾wn˿O~w.w3q;OWW?;s'NjNK)xbrw߾c!6s(vvvÇ٢13D,EL+7PdYS~J`RNᜣAsuQs?Ah.Ǽ$u>]\Z?o<|>zkko֭_zC3Fk!hm+B<3O:43{nQ~8=u^Q9@Ӽ u @UBH$$H_1) 3L%ĺA^GTI*sFj!\IRc-u.)%cL1Ey)8T;EdF!1cDHI)1p  R)JnA"bwbD+WwNKwܱ՜2q[缉U0  꺖D ,$8YVSbu]gGB\!x *)YV#4epqp"GdC(9/jjj{OZ( !(r10cM~0x6>D)[9],6yz *^R \(ƀCHQΒtދNY))DSc=i2 Wc)Y ܁&DLc3n9fQ@OA RUݪh8"gqi hSJĄˆ!АʙGb)흄+H>sgwTMONz̕WOOOz4T!u߼uvc؉O9J<7c>孛nT-LC.On`;?4;eWI975_;b0`"1%eRI)XU3I0Sg'j Q/lvv+W:Դt t߾tS=}O'?ywP+E]pH!!EYFwΜw:~?{/_Zޒƒr·qjRӋ)8g,SRWJ!(x'zӵȹ@LZ+Z'ȠԪ)^9㈈ JkkΡ-ؕB*KDb1`u69  JK1$&l6Z+)Ҕ HHҌV#M  0XJߧ&۴D ںGtr<)F`\WUs!Dc\H(tmQkBNL^⽽=cb07:\ !&tb)-,';;[um'&&bDBL6BJfn-5[?5;ET Yj$VbS包3Ic JM DP[ל3)""s2Dxq:r e;'ιwj0,bl³btΩuKT֚2dcd"P|RJ 1 JbDxhtt@5_H,ab6[{e5tѣΜx[WK|퓇4B~cs>dXhCѥewܸg_^?vS!NGۺL][S^LMM)6;ό.s`Tcl")c|)x|$?HzAgN'PUJ2 (D$3m"F%5 jtѧ@@U!dJ&lU)AzoD4FѡDb'h96!Ѫsծ]Jsly~ |2& A#BeXQiL!b>i*wDT1Y[ih;}Zô0 B;PCd4cXftO3L)(A2Api T+b8# r$c4FST SDm@KlLhm~0?{ZKJvrzt->K8gC 0*G!F}@IŅ;p%ƪw 莢u?4;wE̴QIRJ L'~"m!*7ZqSGw>yTpv捇,-9vJ%,R0+~3;9[>vYJUUkts @pYGK)2ROr#"J R}NVSxfyQWUAJ<0 S$pA,ρ :˲9HD6qP9K w ?R?o(Ȥ(icCLIuڞ10"!W\c!R&X$H/!֦ٹ:JI-[&aMTBd/̳h@ 8Te- Z5kăkNT4ŷɥD%R29Yz!H )hHU%!RJ!z8NG5A*%:2kx4jw^IIHj3>33U-NUH&TRUC""QJ) 5KЀ=%L(3Sb1rwHep/.wP[Mx_!<]]}=6g:%(T ~[C~^5Y!$XlU6˪_J-Z|jY J)-⼬*|FIJ), qP*U/K PU>8WVs%;Ib|b8z`) ۃnYfg_OŤ?:8kٳLgO'ӦD{$FCby9Z]:svu:ӧceL)%:#FƈB;k %<@1RoV c#6'g,qKD{N x wv1R$/Hp("LI gY)Q8]󄨍 b>B7aRS#^UM< @yGKZqϷ 4Bsr`*B ZImyI 2"&ڈt\>轣nJ8 QXRΑ+z̘hL b'?/<.7M dmoKIMs|ԑDHA5ZM ,Z2 VZq`3GD)%{2FƘ;XJ_l  1xGoM@Hg f|^d7R\]j")8A_ FLKm;Wwv?s?|ۯkouly!J9g?"~y?~L'1QI1U/GU5BW qCؾZlF#<_ qleyw8 !R*b"Ái(A ! ѺȲ͉WJ9GOd "ccǎ..2޴ $NRJNx0g?ML^Y&Hwn)C߸z[~dq{gutpβ,O,Etꪤ\*MGKhØtB [W) @cĄ4%J样M)Z9Z1FΡİugEZ+:0Fz+Օc+Ata 9LDŽ=;X42!-r]ڦpo4-b| ݸRdYNV ֒6"(l)d9F,h$&+:_EKR@(.:!r }!|gUYVHḱ*~nI,: 0b0dSec"M@F6@BHA|@)@tKI)0FJ~kZ6zɹ!m81rLP>{UE^;ESʒsFAuUQX]9%D- !07z1O9䙣G'&@ bH7Es;<⹊OsBʹ驧ϟFÅTp2Ǝ,.Y^ӏWɳ;Fju!aWpgbbemy„3Vݎȕ: qo8XE+ WTebmwa!()}úX{y# 7="2%;F" N|ͷ'UUd!`Bą&>7>}>.^I\LvP)MGbb FkL3ʌ1!F]i" -FA?z@)A˯ Fb̲"#FrFy1&1`81 yQ )Bg}UJ;vBLDE$nIVZ锕 kR"!CPƨzD_41FĒ6 n4:hcy!6!fI$w9g$5 RBz_,8c~Jɘfd1gU0T;1N<m8!BvNڞ ^b C`BVJ{(4i!E !ĈΕ@K YCg$ )1J2sEz1ʕd1@Xk38u tR֕e !*)a `( cL][)QB1!$BקĘAJhIElK/>{1?|N=4?BP(~E>uscsS2=#I ]Oq" {'O-D~Gmmm3d\$s Lic{*GK ZK7955s1 %aOu чq{ûssYHWR(ι"bXƔw4 cSB΅f8RRb(FRrƜ%)\ԉ퐇*huD>񭀅"$#ۼ0JP-J:1B0&ʻ(e !0 "<`*scq) Q# xfs(QkEm,a]W!(,hf1PJ)ZqGR@„gffc K'*XEO ځ^aJa0@d)d1Ȕ”E7:NNg_j<*U4 !KȸeH}9b!:窪op]ȅYUe8'+u ڲ,IM!x яFmB32o#[Ϟq>KΝ18tt6TSJپɭC叞=M''$Kșb̄0潻_ko| Gwf''z/-miR"3 S%@YhXW!Dq\ʏcDMĄdZ=5zףgARmJ2.{eo/HKk27)J >_8)(G\&"^:svy~a?aA8&}&JFLpXU53)1ƄQ*%*aZю!g1!cL9x" ۈȁRJ!QhR;;J)MvF*.9 H7,umV3l\1E:Wmfe)% Zb;R#iEKeO] 2 @ |EDi $FhyF!1&1ὗgY߇( @+EJF}c K<#1j[[{OaXY8 gJ%8" ^AdI˴ki'iJt0zVuMcJH|J' qα+ch@56h H9碵1ٚDT"ϳ1xO!0E ,E]ɌN I~.JX"jkRzxhvw Ƿ^xue1Y 8ͧ;SGnOHEs{ s>51$Q|FOM /ϣ~+: }]Ϸw94„Y䜍!>>ɵ6F#b(DɩSG#˴‹[K!TleOϟ70^LtsòJ1RJ!˙R#OsRյd)Y+2!,˒6 No˺1ҧ$6p.x .p&ȋNl-B}Rʡ@%$E*)ЇP6* )pd=pRJkk8|0 Sֺ֓ޥ3rcǺE'PG$p3͛c{S t_:{_l4"{Pm|zMoG-)TĄ<&uR_u<~")mK uBt'J#Bcv:BRG9Y\LuMQ^hk܅W3ؿl3lC(çwr!Kݫ{ʕs'N6xNші%Klߟu:?m^9}RS2"}(E2ĀC1D!P)"j3c|1بJ)X BQBɔR 8iJ)Ġh 2FaQktFpguV+Mx63dJ\( 6yOɆu4JL|%B[*1F66';wsG{.}ύ^J;ޟ7KT7ܟz@wdOzs_{5풾$#~Y-񗚹1=VtDλYÇzPЈQ٥C7Xϔ$pr?}yADMkO<39BOo\^_;49(}x Og{O;m_=;_{ҥ++Npp1&z=@̘fwC fg*?{?2TZr&Θ1Ta9gu]ו;R˪B2&!R9ai+@d!x*!DڵF2n!v&PMpΤE)\kN%xDu,%!%Ky]Z?6rh!3MIxs*Fisi-kJ< ʜw; Jo K$F!8lxmgA2䱦@Ji4""ռ1Í^4U _Gl JCi3Bp'Zh7;+yY烋SB%66h=9RE1R!jH9·Hom-u ;O@X)$C 7KZ+5{^^I+,sZ+@ĪYkR8礊Mٗy╓'~ۗ/,,&$%3f1??ɏ?ΞvC?=rGw[=XgчI+2c@OXRJcC ࣋q\H̤ƧN't SZ٥W?ay}rrKW G ! ON7( -+SPlI CNLӝh/0"clbr2rH%hT(' 4IygXUz(@sy >&h%MTBUWyͲi2<+{u=uWB8:_` \oz!LSh%y!ĶsϪjthηM^(K&9R9\R!2˲,zql]FrTcn0޹eYN c, )$1,L+g?}ɣG믝;?7==fһ9Ӻm7ջ?wv5vW.>335)@L, N[;ݩ"wZG ƿ6`\A-/_> BHƸ6z?dob*`Ӎ 855tCl_}h;Te $[;WZM{6;;抃@UJ4zutgwv~~С^Ae]?b7a߮ꙅC93^&:N"13WN^ƍ?>zH™13!4ɷ^_r%2ţGͭҺ(<ϥF)Uaگx kA)*"2mPcdCRsF#k-g\)96aܗ@8& b@Jnw>d CLV^reiڽhԔ*\F2rJjZ#q3Sp)a[- qәѦH)5*|9{!Uc3"BmѨ;E!`f>1j0"$rycr!D[KZ[O'OtN试vΘL9,?>|0?7#y&F7ξZ)HbPϷG//zĘFIi>4=7wvsZ})suUW7%mBdyv{),s.际y0`wdfF7OB!om=x@2rx&h?ON~|ki'OMw/]'HJJ3ǎs.&SP[RednGDFtՄl,HA@t ht ,3FeYg9g{0QRdm4"1Xcj9[e]ٺԍTNA!֥5bS4y8GDk.@!d/~E$c/-0. .g̶XюZƶ0RL7"&BMU*Ɛyt:E<#Fdc2cɚ}ctQ1Ji!x!6itK8hkܷvޘ[{Gtm.l\CK/q(޽$[lqBH;RZUvi1vm8v:<0aO)!sTFgRN(@>Ѩ 1*6EጓVJu" k,,a$rHB,pSJZkR9)Riyc> mzp.;ct~c}s'=Z{`(evw}-Vc7o>__od2W}{ш<,3Ee'<&ݳǏoZ9TuWRAɄ^Y\]Ab\xUg14 w:?C1 gBb6,.+ G=-'PE˗~2nѵR+)?ɏzdyn4?}'ZRL\ DuÔ2!X!ޒxF ڡ$bu]/.7ќ(rOebi#$IJ!' m;R@n@r)PH95& {ON.ռ8ySx#- PmZmmu!x!w>jQ}.|7_{'z,"Rz m^LU 1$C/ q;E191yѣ}dKLJ<1X`# cݧϪ`2ˈM_5⹓(^8Kg_9P'[=) Qǎ~u}EJ=ܼv++C?iyXIkǖbN)tBJ݈l#㏷wߺ[.W;tL) F}IC3u]u5+M(hcLJX)tnzzzb"ĸlmTJZUU4 BRgZt:JJr)R&1A@fFD Z4b J>&u{Gᄑl !(Fœq(8beYU]UupcV,譩):{I%ђAYCMeWAOj07c㟔dY|Zc$' rPipLR Q_!p?s[ۄtD!{J+u!>"^ Kyp*F%0gLJb1"#S11༧U=[.:rHht*?xxc@>Ƙ++{[?aY ~K! B2Ob`X7X\}UT7fgVg"{!c|23U$ϵ뚧Tm\򣲶+Ęe6zzrFmL3ENRqsw=%kV6kƿKDQ;3ST,%"!h>~b|M&!2m2cRǖ߹rşޞ%ʼARZ+j|eY;PI >4Hl];SJ(]FN#5Y!mq ]dYA 69!ƜtPI 41"&̲PR r#Ojπ7T}^^dȘ7򩁦HHɵw*bl#@GcE19Cq—Rsġ1*_(̡q ! X Ckr_sմb[{ (6sx9G ^rBSHW!xcLHꪮ)1眒%ROz86jN^0~B "1Ift>P nsQk}pY):ĐRLcɺ9w/)䬓J%eI*Ikh!9?~WWN|GENāgtܴ.=m1%!u=z$PP+)QU&&'&X~9d0 :Y6řɃ9n*J+&-d/z"/&B˟ĤZ(Ŋ¡(Ao޿pDO-,?y *ɋ Óp@0pxq@P'4z?hA޺owgD  ΋ǎ_O>z8]{ 1ʐ{YsT#9ť]֥K!/< m] qTJJc )D]޻nޒ='<3aJVԧ7<`)i88\)![J8Kd5 Ċ܌}11!&KL QAcJj<'Y[81vubBޔY+xF$QRքS'DS"ylS !Nw{1XBƸTRJ׍Ԕ y%cy7)He?Tc-&x6[%iЅHqt'c|TU_.SXV*9Fy ,Eg-cN'h))Scp[8&Y8h(r%D)@XJ4L AVmMR!Ĥ<ϲ=3Z P !ZkifiGrB2k,;:E|Vm\yw^GwBJ:&R,_{;DžS8!``48* c~;iL1j=uh"nlnlϢ"bm-c+D1nKYffpx|9L7#ytgXen޾Ց+BLhzjj1w?!2Zk\)w._~amQU;sbJL)(6뚮J+ʊɌ1#"b3%%]K<ϵє"KI11^;7PCXVIMJM UU76 ĕť1CUu՛GյOix/D12W%aT;RV4"&U L O`X*,BѐY*I30Ĉ9g1x~z©ݢK!槧߹|o RZݏclx?9'}z贆=x«R{%('/Oщ`p=pJɅ1%L!DU7vkwgkg[qnI:=,_rÇV c;aڧ/JRu}_MM$'9 A|d~ IM6i06:S3o&&>l/!F-iŦ;w9W~aL;}YeMi<B*:Nt!h)F:TZ@Yb)`'*%RH )w1b{/gYg&s!1"نVdj"rs΅R*1d˯>zdZlN_8f^(d16f-58_YM N-.^oz8۪8*+$bt}w9J݀quUS} v&jR) x!}g@趣+Nbڔ8ޒHhN-9iў5⋺ޟ7^BkkBdyއ闁1.ȩ"[D4&#cMF(0"tp` 7V̍gy&!R2x H3y-/ʧGo><59p8{h)ȞZ!acqM1D-a2%%%oz SY_ml]\϶w ϟ>s{ms?HY8r@̴B)euԙ._>`}<'mmzќ1%Fi$'[E܅s秧'zm<|NsB@XdT"ӦvvmkgmkQ8kȁ+m8kKS^E$X/ bJ itC{N\(Ѣ[HYU%f2_E[b1rќqX.!rIW%Ybfpha*m ΄XβUkDZWck?%V(O"68\d^㥩ISzCݺއv; @;?;Hg}'Nf$WZ05b*k>.,/MOLGv;!&-?Jo0L)H^MV{p0QNGIҌТg!FQ&:1C`GtKy" 9 H ۔00))tV%ƨaYĄ{cնBjmZkb7T[#y!/ H*5V\ZZ-lk>tgs\#uE,f8 i8SN؀I+BTJ;xO~c㤈hnu]YB1R).%J*)D)R2YN}眔ͭ+Ν;dO1g&ӆ1)?ˌիZ)zsx/9 p{8s)D_~Xcg;_GD/7ѩ'/˳WϞƈ_W/et|DΕu[{ޝյ2˺òGUUVB(>1>8㉥xT?NOLtRͭ'Okyꨴ .T.ՙ1]~ko߻Q }KffāuҰ)IJJ!sd䈛rii7ib?T}7g'~/3ǎ\TNC߾ɝ;3STHXIH,,YGjsB)pL%L,y )EƠ sֆCb ZkZg<"È"!H1Fk=~iK盫 LYDLK)yb!z䨒B*bD8`!Cݷߺl ޚzogqL mJzزs1H@y#2VHyy0*7yi5":3Zj39,!sz'j`z$Am|twf>tZр1?hQO5p>a3)FDpVk9JZu:w^Pc&pr,9B6 ?#i!q !9pK3ĨI) QNG=ypcZt{r4J1JX<|`}}rrǧ'& I!Zgo8~VJ7//l\N|ϔCzrɓ.\ۛ.M) O8r cpbe/إG?裫;%ejl+b!Xw<[]]㘒$u:;UϟYSR=y-9F+%%pҫ 1Ԯ1ƈۏ_ʪ`8(Gu题tN/-*זFUEѿY}޼OVGe-.Pn{#++mm_|̱cOn|Fãs3D AJݓOsYh}$ҩ#G?˿l{OaBcJ] Gϟ~#BBMd% 5=Jb!$GycBvjKO2 B(%pdGQJ,2d2Fh8ƈJJ+˲(&zD*Rrˆ VtsV) Ʉ |(@eUoNMlg1 cb]Jt4oD ,i9L~PQF!AER%ޑuUҚ8k6N+~|f ugt6ZYF{o|ѣgf !|굪?ɏ;t1 i]{?*A |nz7?uS;L"ݼXm9<6;WO//Ӯ1V;?looolomm9&f~7ϧ٩i ̌J+g4s!?!rƈRIBv{] 9{dq7!4|;5(%SJ,GD FLu]E!@䯿~;1Re3Z=5m tlʗs>Nhݲم!BJEtL>|H)&'kmb N&bMH`m?@fVj!ChƆVPeeak_*9Uu77ˮ]1 bmk[Wdf BZ)ctQR~͚0&ٺt)W !4 -DĨYBD S1F$ȥDhC1;Hsy9"?(bnA"!on^$\:s ӓMhǵ>d{lNS~{:;0G'zbѥg"Wj"˜WBhsw't!9WuY.ʡťiJ>QHLBQ:7ؼpx]^winny[}i{fg~c¡vxϟOknmwgK)ѧ7o<}h˵q@@v;_[NwĎ=kWn{fg k\/7 %!LONzw~zAv3C/i4(S$ Du]K,cx5QBg6\I N/05=|!:n9R*ppֵBp8K\I0&M10a $OZ;g9KAj iN+|wR:[!lK| lC8O&\( IT6]]!V|0c<ڄHLUU>)@ʒP@X'9Sb)3V׿c(=*nZ# η΍bܛׯq.RB)eU`LFQ"bBAb|8Gwd!{x1Ke1Rl=MJK)&- "8c\P%sƽ1qI&D(FK)H+uM.upBhc[SUptѓ N]Z"'QiPd"4w?p =7/:/]΍hiv6b1"v~zWϝ;׮=xTNHZgro>}^ j[?ݟZ9phvT98WB9_{ֳ|InKgOME͵cS0>2J>e|yvtkf淖~'{Z8CG~72 :"55/]~񍥹yȍ!}F+ s_޵_9'mÔV9L H\ HC12"wQ\{^ZKkN)b:"b )RHP`b=~QJDb1ѳ1i!nވ<r(p$9?C(bY]ݻ?ԎsTIs:4}hJrԢ=xPZwC6ZkL$}u: $-$) 9ƪ!h S* !h  "6Y: c@8mo#{j !hsʢ(bTk1: Y)rsXU#)jܖuUy%4$"y^pꪒ22S]~O3cH>Fx1!VU-t{c٪hLo/R )yBgޞ;NYp9]Zڕg$ȱqۣ2WO>`osC$5Dݏ>|쉕/֌~{'o 1cxaɓ;'h[^ߣɘ;;5K!ZdiM~=hSZzڼrtiiqvnz<'LznjjfrHpoE٢ ԂLv:sEuQw&??&|UO_,.. !tx7/]w:'c?` ~0Z禧9罢˺\+%X^XoZ>~|1H1aZRkRQ96#je>DTGyDTV @xgRXh Bhmٰ<Z,~S>:%VtB ZL)|&s?J01&)1q0Z֍! @QҀsE+g/~ {)3ۆ- $8g-L1^U1XBJ"Cf; <?4" AˇH2&h{:R0ƘOhB1OhBJѥT=Bf$[t 3ԂZN'CWe A|Z1)@J=} 8pBpއb3,(~ >c)FD;ڮB@=(hF$"Lѯ),%ݧOo?}6?;֫^8yrnzĬ@^QPCR$cvwmnYZw0pg|ޞa 9¨=‚8X9o*̔1~/-MO]3>~tRw;Ǐҕ+]:{ҙ3g[^X9 _aB+t'&/..OP\D\[ RLөgRD;?`<3 sˇ[3꿲'~f\S'^pqafo/ j~'+1a˳a!Z2aP@X7`XU?!NpC`gZS6ҍhRRr!Te92Y{{rfvnJxߐbD) 1Rb;8YJYCJpM xXrIVJ QHuА>|ޘHΔHmB3LXldGA5>ERCpn7 EWZs9;[Re}9~CY _}s*ĺ - xɤl Et'NP]P)U@Rdirb^DPRH ˁOM'V77=}:LtsK%S]RC sm g\kIR}%rc Z罋 ;:nfKi0pNQ0ƭJ%&1RftyH佧?QJ)jkGO)9G9 )ׅRIjkdsH[UmM%^򴬶׊F[-6%$S$'b_@=I:P\ٕ2f͏wsam&/:sh;MԢ@Nhq &{J) ,cL>6NEyl89_9+}ꕩ^|oo{m_<$@0p~G6%F6bەBFUlmm~j I&,ֈފEzd{3"HB@$,wbĢ(8B!HiDGcsVk#e0&u)BJB .s2&cYĔtTֺ`Ĕs` 9}d+ 9d96-:F/B R;L6Y^_҇@MSo) ԗ;BY'ZTmJcslŠq̉#Uy/Ep(@'>EBĤH#OLLbw; y ȳ"%:+ˌkUU׵ʞJ{((N+IeEL7W9bPd!P.6 B]1&Blv^ۗ.>z|$ QYP 4UU)1cy6c^b-/< S9e 1~~񕃶ǟt}}cz=Qqѣ[>{ײt7^}˗/}ѣSSWuo}E0;{tiiafzכpwu"ϋN:b{?;}?[_uPUuȑ/]lp8)*!W^tܹ~[{{ݸGS.&BjoowaPf 1]sn[6vv'ɾdJ}>8%Қ`LTJ8y[u-κnC+4 ڤuyI$L!ѺmUAF-4dFrRl0c牥peyq4HE_PF2UgJDH=!窍sGK1ʂ3.[,b8"4[ߩυp!TsiÀs(Z^Au H1!gӫ(!KKeY̎sJ CcTR_q8)&BJ)6C%QĜhCM)MSF1\(%  0\ꛁs$]_b !D1&>qzT>Y_tHg9m#vw_wRBĪŗHJB,)~k_U`njolgťC¡Ǐ)'?TtB|~_>z`L5>ޖcGrff']pHuYf'}! ReY֝QZJ+:9I*`l=wC;{7?O~pΑC_t̩S33òݹ^-gfrWz?=13-3}Kϝ8 w[?ngif(Rַ{1y3Ym-$b^ƵB<bYQ$ _s8QF6:a1:#e2 1P0 !LBH΀$h4>4)1)9D朥ɲ\)tsb11ZV90X⌥cI)Zp8NíbXD ʄ8H00-1HA4]O)VQD^[[Ji_'PRsy#c $'"A=~|)Q?J6F w+OLcyYFwӏ?yA.Ƙk=Zh%cLQ4gOs_vmafWzȗ޹vjk+P %OE,/,;Cx;7oTgJյ q 8;wԩ3G.O9RaY:Ge9WU^o GBmC.` JHRRREN2~8On2ZJ"8jzbbzbb?qGׯ>߿T?k.>̑xѣYRJյ?8t̜y~?L` 82ØO>R"y~A9|@[!eI hNHIPOnmcz̲|iw?*4"5IP3U(ewe:Oslfv[ե25@sby$j<13@ '^뷊S-%(TR$؍SƉHJ,)b$BTU*.) UPrkBt(mYmcgfRH0zTR,˥T0<1P :dGjGčmH[x0p8K!BHB$>'0RiED!DkM 1ƨd[˖^3)#s[l#] WBMremťs@ SJ$XXX?xm?"kk_\*ř)_Ɏ3~yƧWb]{"aa27f7O˟EeFk@%r+P%Ҋ6'D!F)e*B歞jR6m h͝'߻t_?,WVW<}r>xyo] -5{bOL1`H!iBu,j/7ևk[ϟx˪f)G\S޾ Vvw{Bx߄cޙ[whqQ0SG_|Ngxۻg-'?9uXv<~A/̵IxŕGRwrk*md_z@ Fe5x2-c&L&4ch4qzVYth1AF=ʲLIe#%BL1Byj\BG<)e^PREƭX?RZJc k˜Vjkg0==e]6!(%jRIZwl'pCَO ha<,JkLZSF+Ř[XONIeeho+!ʔwfܘ)+%_o #V)F>I@+2={="&@mkmRXr4uECMTjXR)iZ3+[ Z+G{4Ŕ={t}kj0xŷΝROĔy<-^3E1;5}`7c];%C9g][QS,[GB"gfmlom 2έ=|ȲqVuc{'-_{?gZ\=~裵Օ˰09)! `Q4`иx &F/)ejh()ϲ̹ 6?185NPGz{ɃG[RAipczZk}Lۣ/ֶ rOLO~чAF;++Ξ8?lݸwo%N 3@ok0̽7N=:3c`%ynYx2(nKRjRbXUU )Yc"dA.Y&i m̶Q!UUUUu c6Z)c1)iGbRJl d/{XFRJ-RCa bJ?1!DYk%2ɜ@Io8hIn3L0mL‰?Sy#B/~)qc"ם#MϘHd l䝖.ƶrRy;נ)˔ Y搐xW}"$!(V'mh׷w=zl]vܹΝ߿H<5?DwkǎMMA`C6썆3nJ1|Uw;rec}gSwŊ;;{{RͲ7??%\۷zUt}_Ν8thi<~oX4=%|L{hK1 ޸\^[;lmlxXdN n'˘PhͽIPkk)rAj0y @+cTJ "⏖ÄZܸ,#"Vo1Bʪ*]' $Rbj61B@/ie5:Z>1$1_~>_z|lBJMƣ{O#G-.99H!榧O;vo="ڰ*M؈N H4S+xHV;;(e2ǻrLǸon߾}ǏCx^K>zlp4||?zގۓSJ*Abgx&6x y $cm*!цPB LB jlQ,1 ʭOWeɒа\Eqp߾~qn.˲'_M޸-sՕ-zX 7vv>WX}aKJƔRJ!!"D{o;97֋ssB@@&ۻRI#ig{-' nǀֺV;x a#BM7hyi/SMLrMB̀mg{MtgμcSϒJsZkme*ϵZcb !!J),K)qOkcv.SJ !F)oF !^)%ߐR'F) !&H)c@B/Vo?[>'u:FB֘?yGNdr33'}>pZMH2hc!ig m,,?l7?ޞtV}_nm~bav:QYɳ'n\vG{\~3qE5(󕕛o}٧Ϟ1t1^A@լ|N_G6 A$GkFsJ*L{#_8UE@ EmK8 E!GWWo<~+:nY֘qחXyE}/s}E GqpqW%čn}gfic1!M (!>Zy:}?QJI$8qVeM'|2kLv&VFԁ &{Nf )Q/RJL\5H &uBpx'츒md\KchPY!rROG>?ysg8Úa\(T[x;yjcr R{ "孭ͭ"F  2gṰ cD<_\ŭ[[3J*1׏9x{o?Mo\7N9-ϿǣչNPhR9g ՙs1&$PxII!FkR)mMSQZkkL 獌FE&A )3&-$àB e!e+W9qaWT8?tE1>y+<Ĩ'0ĽGw<#f[[WoO>>2b` O~s,,pfNQ8k{;;Yb8D϶/-Um,/Y{M沄I)-!k\S2= %9S#`Yɱ6+tYQS"Ox\cV"`ҪE Ɛ0bS^8\1ƽhzzX[׵RR_>omlQU>o!%v)drR j[~بCLh/~nwRJ,%Ť7.$.Z]ךm̗hέolr 1p-%O'a`=@#KLI9og| u +JVRJY)`2R *R׵h;s`J@kC1+ sS&|$LbMzhR{#G޽t+95RRu{ׯou|ai f[J?][[^[˔̬D`Jnn)MTNoBO_@VkI5z4}?z퇏Xھuzٳtvţ4a NVP{HJ KS/^l쬿|_Z\M.4_|Oܟsezx_WGo?+i>nTUcrC~Nu$mJSk=;qm1-%+38vh.ZclYR I !x_ZNu0MUU]5)ཐ*Ɣ)%cl)kɪN  De{Ni.lm}=Tܺ=e2/OUJuI)U9~/")˔^!ʲJ[g9V=0ܒ.%dk@6i! :O\)hvh{D>.ڲǏ"5{pѽbc̴RJrNS "aNcd0hMRHlzR1!t 54Bl+Os6" Vq,Srh<Rnlt;?8Ȝ@׭cI,ǻk[پ~G_} ϕRק-׋sTa$TֶOGDDzsop;[oqAN"2Z {{/77f3k6RBXnG+lukD$.mJ c!" ! %*@"_VD > 5ɲ,RDBpS>TUeu;B)%1:SULRLc!1ERje)1=/cƦu]Yhܹ(D2";jP5г&+iO+1{?߽FVF՟F ZB1l/XJicLy]R8NUYxH 81sZ#5#bJ{k-Cå!xgmJBu;|BĽrͲg^>{nia]+;y{ӕ|αC;&ZU{R^9y䈰'3E{jeO66s33Ԃ*|99^;m}͋o;CDSz>ƓGSHB*V{Њ{)$7k@Ȣ- \֠Z9X1suU{_O1D2F[ %trgIo3O,+zg}͍n~ [sSӽNg۷vU|⵹َ$@$Z׷>z+_Ogfכe|V|aU=غtҟ'~V4Yێ_Fa~afʝH )^`fj@pobBcTRW٦&P)fsX׵,>9b*OlCB!9g,w. !2 RED=O̺2gn\pnc$tQ[jOᯢ_R\#+7f2J]O]$PZ5p51W1Duȴ5$ [~S:HۊAYBpa nAO1S'Vl1%BVP 4 eJ1:/ar?l lRe* D >VURTJaJ#.|8eiIJQE]V1FH)SBZW7X~Gm SJO;ý_Kנ'KO;A̹٩`Ϥ̭oJ)ze+;;jiw'7썒_?y˵م}o?7.?urv0!?~y6%dA$eYvnd:BH!VoIrC XV&!YJ2?њ@y?ua};hk: DL1<*V)b;?0$tw=~¾iMMOyoF=[ܜRvv_͜rX_-?\k}5Z,Xy9.q_EOƁm]Y[SJNM1)6% 1Nl[xE]GR2ada)TJkM@lp7 )d/"C>xh*RL9tsoCHdhYU@c% PJk`)&렴TJk#3G w\fW9?.Jɴ.a߶G{} Z7 6]%^%8y{eYFiBBJy_'3LSRRů)5!%ٞ;J6Eت%N.?s y's`ǎg9 nSMy(Vikly1vOnI(Ij2~Mٙ_t:ZVϹe^ip Ŕ(8{8dtmǷ>-:gμs`0٠ugE_^2p.aщ#G#jO2ku;VV UYykMJ ?p&D!:'Z}~?yp \uR5UK5 ka[qӺiD!% {Bdlj%k1DL#ORZqil&ƀ"/R 9FYIdd#Iκ6 hB:cF{xjs4^"Y;|2N--9%2vjサ03#t/j&sGXO#5ER)w{nK%.r HkL' WI@ZrL@IyŋOP{@_}ssEXyrlfPHpٹ~8!/?zʡ /?/?y}pȑ?HS=2,˛ol .;πIW' ):Erssmk~gfq,<"J1 ŭT@JNQ ^Jj$1_)]5!i&F3\31yQd!&Zx)5֪2t;|ss1xԜ╊De*eU5Qj"'U|x-74Ͽ1JJDU_o2hgwM m/#Amuث:Dj*D+]KjG߼N)Ą^!I'RFcU!D@0F!O.sR" ,CxVZF69˟h#/" @n!xL*Fm{>uxԩ_ DPdYުWn|Ad3ct^nolo/giՠ@(SS<}oO1DBx훏ܿE-;^ N-AÇkɍ1j榧92{3ӳ^gN6>+mm}}g SĔTpomv{?yݷ.\\c ces1Wd}QP{L"ȝK)=Z~pY7ˋiT(Ƅ@T%5BhGi)@O=)6XRYTU!JB6SsO{k N kSPLI-)%따s1&Iz:ςmRJ@9Dk h>FH1 CZ+nU LNKhtm@W*)DBR6_8FC-H)S2.*%&L\\(g' d^4nd/"pRRL"iK)qU*%ywq{;9 N+EN{ bG mEk!Ƨkk[ܹG9c&j7&_Q]u @I鬉!HˍONSޏH-CKKss[{K3SF벬1Āi3*/7?Yӷ=~|]Fe_l=}"ƣVcBk-3HJ,ˁz#y )ֲbbN=yFuUX[ )E1 !L)l;c;yVF7DX ]YJTG<Ēֆ#)E6/o;.WSԴj}otm S?Y^nnϯ\jS_1!@;;*,;]zAI'D|ѕoܺvs-'']׾8ּ+ ,Ϝs$"c B0,#ªX)ˍe>H3q݁1 `'8e=*#T \0-,HڽJ@Ԃ%ɼ{cJJQ_YOT1b§-#JQAuh!ȶf[;BK;/}‘DbHɜ"ϑe R*HZ>@,_VXpm>|[x")0=B$Aġߪ*SLk;c\!C0Bh+jc>kz}" /\y8*ˏbe4 V-˒n>z|ѣ435p?*Z?~acs#%&J֣x\t&_nںvoy$gj?gS2c|]kk.{ R)m4NkB䀮$;E^ QU孫V!&Bbh;s~":5F5JCs.!8b suLF^8JH@"&*T|BY SZ)ýٹ\`0wb}87қ333s33l@>l|s`fV򛇗~hr){o?ݗ׮u; %`y}tff ^]ZTkȽn*sK)ԨS"?! "UAJ*  $v{]mt]y^Yu]۵k'YIt=`吣$1kMXܺ=gF܍sY'pP^e{9`rl Dߒ[8 {?[NiURXF]4Zi+k3 RmϿh=m$ tB Udak#=9+! A%9ZiRH"LX 18kG1Za8Hi!6@C3'0WRjcY>61TJ]Nݺ󯿜%!"eixu2G=q"IUYy*o<|4$a\/VWoݹsݛGO~ }ȇp?vyPY+tmI/ɷ)s(h"=&TF[8ZSc2PN[kX.R:<@D)͖AT>2dQZm;fobXgF1JKp/NQ.FB^3 {wȷFcr\U/_~}ڽwzs ч@R>=y?{߾k\{O|链Շf{s."nlmW!9~U]rݧOw{K@5̀QJńl.JJ9UuEAZS׵|ycH!wvw@cYO +3g "moo&$$o'h<.ݎs333κnNg<YcVy^)CBݟwyt4R}5B6 mk/ռ7ٷ !hkMC]WB_%r֌=RxڠE@s c "DIW +VBDD&!Q&dP<{89))ՈY^ ccL$.[0F!B]`1pgJDZk$$k @4;@)ٴ~$F3ܟVRJ)smnnJ)3| dTB() QLHºZRJ!9aRi'E@X/lϏ /4JJ}bLF$TJ3J \#+:5]yOw.YVrPE,=v:=É?]u]e)JE0I)1D"kѣyJ u,0?\ DbBd2 ZjK5_/Dh&4 nx߽tq)Bx%q~!B]H_|+UD-&AJA$[/mZk[Q]QYllo?z;>tJ)վH,7(ցHIc|%s#VZǘggsXQ)>/g*2DDYҒȁ:LJƸp8ZO002%r̖Զ+N0jiYH!85cM{_*jl-$ԟO^l ˯pv|}YV۹tk Mq<wF6 e?B":-,HŘ8 !BN <<\RRƖ+ L0pCpƶ)hq2Bd<cwT8 B3g?tbؤ}}k? c ao<ۺ%fr.h\mgy~ԑM+:Nڮ(ung*e{;_wջ=pb<ո:wV 11^eyzo^:!rxDx8?;vym*;I)h\nml;E'/8#@"a"B2_ sSXX8\2ѐ1<W[/ gֽO{EޘInZmbJlH%Ĺc;w@J?So|}`jjB򕍍+˃}]oՕR! ɳ8yBkf1!{X^'\@ZkVD;o`dSbd9Zv(.j*6cDhB댑XQZmX(@$7jy9њ-L2Xc=["癄Ѧ+ d =z B;~K@{>oo]طŲ1nmc7=c3S}#X~'OW5QY{ӫW?UOɅ~/8+b98k'Txgd[1Nu!'/V773ki"()!Xk($BPgAJh{δ%?ܷoqa$Γ<ό!pq1 aέuRܾӧ ssn hecs8 땫\7<}h(+y>hF˩,R 6Cr)A=J) f _;5 !Ecʲ)viZIef#G[  Dˑ"WnoƴOz+~&RL{r(]>R ^R*6'?J)$V;(oqd5u #N{\d-\8hB"a9ֵZwu:>ͭ{ϞX/r5!'fG^~7{ZfVJGlLJ)SDT˵ti u)ybN) h8NMcJH qX!e>4U"BJ%h8YT@9c$omX'` )yF8^g1r`0b6 mb|{"йu{Z^ZPSC`f>r;.Y/% ʃ@۲KI٨y, `=ōa"I`e5<_}Yx!qJ^IuL/|rntAT\+rKR(1wg(%98"H)!6;/H2$5>!D勆sYawF)Y:\!6ܴiTܺ5o-)ЖP]xi"h;)=mz+VZ'Wzw@Z54&$IR1ZT\ a%<ĉ'&!&2Ԃ jD{'$kLpp vRJyVbS[q|1҆-4@h%$&Dda ~9&R|`1 0:rBGycebcù⁅NQHd*Mۻwx,8  ƄR}H)pu15o@+S2N:eYF墫<ˆh4Bt4 cOJ?tO>wF < /:Xџ*ܸ{ᣇkgt;(vwwZ,,[[<|̯]v/o~sٙ 8њKsK/֞\;D0)dLI)=dއm∏H(Fc E>k@A1:fTu~(ʪ,J)RI&kM}N־aQVaM$ 1;vnnom|挘S -:D}T?1D䳋1Ġ+U#JQk2m6mVW\3DED&)5/+Ŷ^|1 !kRnEH)AGL{e ڶ:TlRQ\ N)&BRJksPZ'_߽;9#ؐ5^Ik%zxK_w:Ev2uWCN96&NGU S a&n>ytm?Ͼs'OOYs%R( )\+ھSѳRTJwu2%=b^YVZ+cR:xϡna6zŒ#`_gJI44]K2N_%%L1&)8U^͘ $E6Rhcf gYVKIe%c뺪k6TUIrf0 x|ٳn]||{߯?xo۽|oqq/UZoF߽uzKK?y 'O=p`~f҅Fu3@Yܶo.m=Z^VB 9S5WykeBxĘ"))31RRI(qadgVGCB$2B)織e.dI)u2R׵C}Y6NFqmW˙%#ehUL7TNΎ<$hlʗb(2DZr)egR H+Ab:Dck6VgD$󅭧ғꃀ(d[Lq5(` BJ%q)Ri򟥒%yyB,CkR8IXڔ3Yj%wh |©^R8bO6;L<Ţ`?{ykex" `CʹbJ{ke]@_ڽWvxҥ'Or^+ׯ}G ,!!C)%,xWLUU)b*9˹^t;c;"2,P*f! jEc2 A()CaBLH:Hq%hFkA@ek [FTJ I+Q1O)Fn8ma@ZhQ\y$`n'g{?.J*N3sϞk=sg\UXc^^~ÏN hgc㯾=,t;|uD2`kQ_gO?{…C}&jz__Ʒܹ9'^^qBDgZɌvURbRL{s*0g_^kȇXUR=MZڢ(R¢(x30RÛI1ĺSƁh䩔|2G QI[p *ڶ+Nߩm^iċoO pG/}ɒ@.Sh-$BT)eJM Qݐ<" S WrGFqB !!H)vy1I$SL)ze316; >X),?N)@cDDKєAr_"InӒRj)pXa;/67_;zt,61&kM"=z_ʜKT9= N{#[h~oc\xpwgLݻwγ6+w>aqJe5gL$LPRVZ2ExdZ*cb2ZuU;2xCJ*W1f;kS")%FLgBPcM[iL>%Vդ1b="4ҶX)IU`&vJI J J+Bhc9d=ilWJ IH'Y!_<;=O|OWoB|ѯΝ1dY6q4\Uw=gxRl3eN_7~le}cf0hm⠵օP+D|8! !bcMUUJʘ5F )%)Ldb|$VUUed8FR)#d@Z꺖JJ1&ED |] YΕZ>D#>adJ$\e¿iR֭ѸB. F?+f:+o|ZwIdƸC --Dvb"W(Ο{Hkí Q⫨qID|Ӻm݅P@h3FbLl_ Oj-q4)V v{_ !?x|s̉^ov;HYaoimk3ῗ} ]|쳝'/_z1nDxUu^ yL+׮>|du8|/zߵ'~;714&>r$w0vϹAAZL(1ĘV}@9B{)Y_v'Ng)% gRHI޼)rēd=@H)Em <. R9똒,˪*쳖=8 aZ*+9uClOƇ k@D5o\ƈha#% 1h"vXjkMD!B՞(veg{? C !`n<`m&XzlQ1"4CL!Y甒B(L ؔ kXJ)Y1%k! Q4QPQ,@1JB |`>z{4ʳ|v0֘ W<]ի%E?z7x?|QԔ:XWRjZ?wHeU'/W=y  ӏ)YFD!D )bda~oقB1 g<TW[Fk/{4B*JWUx4! {R6{c {?&<Eu^1ה14JֵJ&,V*n i0VZʄHR2?ӈZK)&0eYfkSM0!Z M1pO3w}^[Fa]t&q77,-./ň]ݻڙgO<+/Js ᥥ^ի\__gb 1s΁}^YNԬ L &; D&d{9s0bgR- NArhR,0I @^ٔj3KM`>u0N)W#v@xP#80yl rmM.eF#Q9 lVӟS!ܾÈQsj@E4R!"mj2I%bލϼbe/+Dh Qi 8bQC%ǵIܲ1i9%%J)$' Q*ɶQ sZ|k-`#Sk^o>\Y=v/<|b[cR۷qYgΟ<)9ܒ6~ 0ZC.Z/W{3J9猔]x;`/1Fx8x/_%*ƐRY)IJ*HJ&kf M+5, ׵RRBc Hjb6ZKDy^ۏ:qԷXwG/WmM 5_$;/9shq-xtvgxRdFR\3Zp*ϲcB*{1ƘR?8A$b Xý)9WiݴQ\Jv:Ƨ̺\dS\.TJIN1|/Sx|crXC3h5>aV섭MhYc1PşqR1Vnov][}#FJsJɵ6!խii7I0Fq,RJ [Bpo\J0GBĶQZ R4b.!WHf#Hc4;A 5{=בb"!.F>8I[PB!S;鍳gϟ8Q9N4%%O_O>UO..NO,q33֮<[1R@f,;^rg{}kkgo7n\pO~湳sszN P_|l̗^);(LX312*)1.ZݣMh^HXtC|Jk~/-ƘZXcy.WW_,w> z=Íl#SS}nAX3Ơ^X~*{/^ZwxgWk/37&)Z^Xv9G@`ǃ9CRjK1/˲hզK>r\J%bJ[,|upę|s_$V, u!b-4D"QRB$&PYgc>D9Bx\X( 眯=VD #b]J@{iEnn.?}Çs x{:$<'Օ뷾ylfR흠勯O~ziVO~GY]DzDƘݝ#p'JJeY"?l޹;g-;yWzUk-ݘbu&0jI2`\SBp)סi6 bRbR_2ھARB)^'^%1^J(XՑ-1@ aVȆt @{13\#;/ 6R\B!n @JiNK)ÿ9[<'MSh0̒1 kn6Zq$|*YXkN..O/Ν<~߂="g߿~1;o)Ѩ( N;pҡ1ϟu?F@☚ ) 2Z{Ka!TQLQ>dαRnSx4J)5"ymii$L1G힌Q[R"E4b`V|s4Zמ]A9/RB R,4I~xWb a|k/)!PƵ)qR6vU\rZD=!b2J͍Ǐӯu~.:r{!x#G;+/66w6O- uUա6=7/y;1=  zVsb\b.7~[ 1lI!!FSV77<~t( >tkQX,Z[gQ] gF$b[b)5/c1/s䙒kx"kȍȬ@Ő!F!sD[Gʧz%JƔ&*d*GC T娟/\0io pJMxE\ǭc;GPl؋џ8hĤaLZˍ1Jue%?α= <؈14P SJˤ(ЀVLd/ZWU#\G"0_>}ʾ.]? dql+kW2)2RĔRVAݽJ\TqQYw\)%HJ5}Ag}K_^YO)BBYB0ݳqͳ 1Ch8:ߦmahBL 9"ض2 !o*ɟWaP2!R1†Q )MWhG+^ϵ3bL)$N1Fcm\J*?!ϲ&4$DPwfAVv2&uYbS^aݢ(/_9; G;[q4tDSӀ3!΅;Ϝ7;soxv߸wo?p/3DLj+:/_{Ysxqj˜~4y.FLB*LECظ̅yǘ,Rx#,\bQZC]9c("}sey`b!a֘'GdXl>#H,#5񘰮kklCRZy!D)l/׊ɒ!Iz)!S!1 X T(&ޝ,!8ĀԴPao,Ty=B<j =t#&c,1 W;1%XɞZ} S#!4TF1y.0uɰޯ+!V+Cy71)_B1D$ pso| Y/b,wD?FCJ)q-d>o~S{{\r{$4 o>m~?kU΅o;7;5]||6!xLh!~Ӛh{7ějhf͞NƤBc΁;k\~o4??3;t<;w6ɓߺ ΂)%?\56 ̈́E%/2BtSƥVkcyr9k-axVZ cdG@J0h1`2<"G5|Elv#$L(0gM< kl<)q<ȁW@u^HQESL!BXNHgId- K2ꮮ\)OG bG.'ݦQ%""Q!@R*% R<&Wt0%$26H! O!&$ʜ{]W:" fK1I"/⥣_3X[;l76 vR*);y^{ϖi'+tA٩%͘1յRpPFR$seU (%Y $A,(y&HX;c Ƙs)y { PSRV{E-D癰jDN2%!2Y& DoePk]W<R o0z=?=sMj>8pK{~YGAw:e>RTRŔRtEJXWFkxbxB3aXcb|gQc27_7;b)! X]yot;4bJ>DG&',Aް"˥Tх:Dkϟ}?yСA@ 8{ԑ#ju]}J!Z˖2ȥ R R=Z8Z) BgF" jj Z5poS>XcbPEa!c֚Oc!y&;۽{ZYkwzEF9 e#($fL669pX}*Ȍ}s8zY H4]q]{'Oζ_z󭆁_]_ϟoi]9* ,>Ѿ ]SZk׾qw緾;܀ZG;x߾yg?)3XO*.PhVRh<*`+dsԓ賺M1產=h9H[ZrA"lzYx[kZ}6$a!"K X l0"U`n6[7an3~'7l6fSv4CPV9tVD¦ *xٞ-bƌT&"H ZL17&Ғj 'Sa͞Zy%jGGGd_>}ǯݿRFӷ^}C˾@Kyv~|ӧ_~G-Mݚf57A"f6p\Jyv~~ܫc)[:{EKGeץbnBGVkJ­1:l1",7V#V1#*5M-. T,pð5+#RD1L61{QsKEՆܼOJGo1leM+"f& &ӽ_ΑZkc 1FPAq0""AJA,|da V],78S흠*Œk-x@yZEO}3!o%0zz㇟~葆ڽю9_痗<GgWW]\h8A1OwZNhx?ux{@.eټч_6s){_.?OOyeL+G͈0%ŤfTZJ7ukM ŒF,da;GiBɧs*Rmc6ncA ,s|ey0a6*/7BZؚpm:Gt,0ϋ3[;8Vkfv1܁m_M5!7& 4GL2dlBq0ƈ9k> h8U&N S  KS*6µ o""h0k@[-DfTU-x,Ρzsr\ s A@>~fO~^faϞ'Ox~ë8^]^-W~ާ^o_{w{QM>8"n '{o1o5#ՌF8 RУw-Rrk,H{{ˑjƵDD{rK;^o'jR=s .=FzaX`gS,s,`fZ/LsB6ƝHSTNhI! a0Q[DN@5!c΅~n@fy`/D?_~퟿/ѫW?{O=~ఋKl>~{?'OV)-P_98ΕIwWk)Emo`$W/v-)F;J?z[hjȩuzR 7#{2֚@4)q,DPPFH11v;4sPXx@y _G4ƈhˠJif|`J, WvĶMޜEV YrF9#" K-źmJ`̄m#&fLvKD6}N7:}\c0#s j@d@"hn !R,[kUa;#ʥ4fT1OZE@͡? OId"C.<=[+oVf43]hly//4$"}YoW㳳|=}~G4Z4sd˃EYG?|qo=xvsR0?}󫫓/ˏ"/rw֜c"0#%潯̒kZ*"8OƱsNDͿ {_rVۭl$$;"#cf^}k2rl `0yd#:"Bb5=OD U$$Ee=:%UoCxn6m|  I뼛:ДS ;ץU.l>kޮ WSZUEZ;M2Ǻtw vpj7fOGn:iw;{Ãd_KR_\|O?ٳgyZ=9ښN8̪2KPѢ 2]ϵVhեg`!cΪJTъ݃u!DGc.Z zuꆲ"u&眺IS6HDS0RX(lƬ)ڪ5*\UDJ9 /.]dzޤM$Z%eD2Gl|eb;Z@lVh8D%L)Ba~WU!F-^AAU@'C]D41|\+X`gD` 7̺"Q3'κc `7-DK7&DZKӨw֬`4@SIV! p6U|PR7_|_E굙`:ϯ;ϿrZ,n.g/_\_\_?y37o9hn\D;ud#f9}Ly[S>cMfQ !X]ws)1rZ9{QSϗaƨFhད[<9$̦ش]Vk AkkR3(j^k{-{j(@w}sdH rduc;3+dZ}hC$5A۳gGGG/=::[_Ǐw}+%?6?KnR,mCesv J)b=>><\ #%^o6OΞn7/6GϞz >zU=98[.o;U6#`m"̶NNߎ1rzlS^S|ZЉvI]O-܏㰷*cXo㐽w@H 1~?OC8Di(}CdVNϝ-S06M7ywj*!Dr4{ǜ  2?+׎7ǚ#JKiG n\Ͳ nCAr.b[ ް݊owjuc"JSFYa3(nj#tr\0sw)8 _}L$h`IFχܹ{1xW6zy٧^__+Ξ0ιݜv]8:޷X[]LwN|{7^}+o}h ?uG/R ,SV\m4\s5fl6ƀ6NsvbG km;ʹX_s Yli+ZUHyMs3Bd,i~JUsцH֭':%)*@1X8$&M)@C'nړR1;qɑ"( r+ڗ oT`!n< 8GBxe1w:9OrvGݹoӧOw_9?./E 'iحGOpҥ)9=]ED'?{gO߾m=9U<9#a \JnBBD(&4Z[Jq$UnuJ) ƌZ[J]QKFK-ETD;ɶ֌;?pu{"O\xۚhJ۝M5Lܹb8 U__k0U6}{jlDX.!l)|so2P}"%j\]sS*x%QRв!{yP97M #PJ !3ڑZ8vЙtȪ"L13.k`aVXYAwD; ݻo9=>2({c:~_lW铍fy=u{ΝQˋED1rCOϻ;z ,B"!x]ky!]y pY`w\BET$U*咼k ZU*ۭ\&¬2eaxC`YM݈Z10`XiXMQcQ \Pk@}qC'H]g80 9]2 QEY`ٞgcĘ3iHa9BU'*6H;rUԊMZc$\4ƛ/~>{_-{c?0G~?8 trV{gm6" 1R>~v{_Tu;nzjeŭ7o?9??;ou|p+b]ǧa;cLx"G+C _jH)u :$byK6/j%"WWfǾ8 M5-"Zk !z?>qvvLKfqe繷~QÌ2g@jjl{egg9"uRkoyvuuRg6gv3d%kݝ=:s.+2fTE,ᜳ6.k(R_FfE7ekGkը܈X3Td4aB )Od5>Vsޠ&&0l1Xjl[.men*s~ki'_;w|pp|pRzO?~'8ݓflV ه?}e͑{~ӧӿ~aa yl>y^8y` wK)xޤ{ ?W^sz\ܺ[" ф7u쟜=;'..fc?w{zڽ{}fSZkbJ8-bD`frvL)1ĸ}FJFDRRq7P\1I$@?A/sb2l~stgm`*r[Q)%"">==n,צ!i港C$U/#ƨ6Z0>9lcw~8Z=bIts,ۮTԤUpeeQ"s *]_<{%-b/v;~rvzۿ[fiD/C{Z׾v{qyo񢿿2ǏW==:晏?'ye[8q9g צPmK< N-rDu)\_KQ& hA nhYIM J=[A4w T[чDg%?OnG2׿lm޺ܸs "8gSLkDd=6u+NdR 1pk@.ĀZ5Lve*bjd[f {uλZj&9țYWfP{\?~ᣇ/vѯzRu̹Kq^w^?=:?8W~zxZ.}ߧBhKoxgG~֫ѶSGfOݲKӃ)8he8JwA5r)1Sʻj2[QcaaZw]dDXC9>4 SJ%:++wi(uGܼiad{4cS{" !9_k$vsuŇ"+1v.T0CYnª:1(ZlJk`G>h7ƭ:X߸+3y -8GhjyIkB6X# 2Qk1gGX.EntV:3%3?zd;z;x 㯲L&"::zK_O?ڗM1anq~ų[1d3O:c)yZsD 10 s Yj87#Z+R)zRʹ@km֦ayV`qf-2c6tpM#]q,-C1 * gINf!R uj Z9ui-ajFC8gEd 3>4filld{-Dj0(H "h?}׽׾7z|?>;ǟJ!" _\魣ã7^w`ooo)35#V[ j)bcj_VUB Vk.yoj1sm)"WWWVh.R[-%o.uϙ{ 5a, 8d0"!Z&ޘ63Oz1M'O@`gIr9`L)b&e7Ijqzcv sZC1D\@yg^)`Dؑ(YHOBFtHJn,,js>y;?#z޽wx󝏟=;]G<[ k}!Cs_99:x^ĭDBZ%4K; qTomxp:{R5.zrMPbhY<㻙qն;;a:DNiR<`{ӭyԀ*CdnVbf@ :G9_J!Gxv(:{eD@ZB < &Q:N@>vJ;J@qwl]T h&D>*㐺(~VzyyK]::>}o~uڟ݅w9?Tü|4&rRF[6aTmj{jSۗsTZ(`= ԏsH;ryD֔R*ZZy(ERTUӱýJ*ȑTxE=sgX`_GG+^\x4X'"G ZNET;rΏH"\k3twiLiuSC̳o~qZ1V89ZR_JN).fmέq[]שHm-vL *XRGTCnz 1+dTd Elm+2`dմu aBkfiR|987q +֘i܋whڦN4F~,ʮ*&iQk !tj}ɭ>o~?;_bbӯW[''eJ6_|3,-2qdA!99y>l=lʭyK93͎ȬGUX ԊR%e"dU1!b{g[!t]rg{ΝaW;neۍobmr,Cܴ9DpnD`B5b?}(8gn)* d拉Mz19Vg/&nB6s7\pc׋0G{4buk\d^9^X}.##4<\IEXx;Bh"8fR!"n\*+6:}칈:::=< S7;R/~o}G{ ܽ[Z_w0ķz:'?Y J]WsP#/Y&ܤt̹Hfm4_k!sΦKV%aHTLq@zi2bP`Zz!@aY_$9i Ty=223 IjmޓsUyCIsm]5nqK%Z&̽㸙i$9w)wfhvތ,7n\b6,9i7ͻi*,9U"n#ӹV"DznՕR6.WWzHM#M2oBn i~w] f~@)6l3n[9Ƃ%X);­VX,d!2LERLDϹsƦW"pDn\rmyk&ɹ[#44x|ppopQs{z}o?_җ_s{21˿ʇ%S?{G?~\X_V{޻3w]wuy q1m1R+:΂b9t(C Zr=8q]vmR̥pZ2vxrcɹ#@i3asy7G^EV:[kAUygtQ<3{j>!["jVWCZ r[cSU;f/1%: K-Vk:~NŲSPk\/ݻ}|S<|P׍kuEU_LLQPrd#VQεV9k>ʘRj8( 0S"%؄YDn?>8}}@vI*r"6v/#9Äqv/%;7M3#FH0cΑ JHWJef~cd[C$S',]4No%C6B1 uE#B@dgFs!XOnݹխ!N뫫>6¢Ip~u)F?؞=}ƭ9"n2C}(,PjuT2d&ԂrB,!l'ι9'w|֧Y?&Su꘷6޹zA:0ؕ 00''wakH30"bman0Oy]ivXiuӔBZJx@{])"8;O#(3Vq`m;ACքYߋu-"W5ztxdw\w{h__*sYaȾ1|w_wre//._`_WO=߇ ,)Җ<\h\aBn b‚0k6t)X[Ybֶ2AZcU.gߠrV3K%}kZEPfnŘE@9:_V%0=ڃW|~7EDƭ\,V{6̆zloIhVP궵}"Of\17fa?A 1'G!쥴^fJdMN-U0ϫE, 'Ud6)b;:TJ`*xBDVb kfǁozY=O S q+#V5(g3bZ4'Y58 yMD>!!4zz!;39fǞ_n0`^/jsqc쩵VKhq&p\N0SYsiVs)Z6..WqaVֺq_y㵘^_|Gܽ{zr{nwEuwONW/g?|x(9K6!v]n*kz)BǸP! ѺˍSJY؅=.TƒyG/%&3G9*Ymzオ9+ 23ZPk (€`唆p'90s*<(n*Su8  aTS !5nsɍu qv- !fI)TSPƩ5w#&SQf]7 TȜ!D):aAB0!vtX_w}H-.x7—lz~_w{.EaW2xo`v?xo%?VWﻔtr)jye 3H9oZc~lt]"f)58.ULu*4w<pΙ"kwсTŶ [F]ueGD"9qZ[w0>vvsoNw>']@:?y"yO0(1FD_%n]ק̏81UC"Cl!0kk-`_ 7X+.ZsX,a{zxht#~pY/SZ_ْཷȊ짡4K).Wr}ѣY߹}wo=9/xn~<:;{pΫw~ѣk9Zu)FCsk(2ΓG-+-`W?©YV1enu]ZۭܥzU-%+" D(?1PcTI5Vm{ ۹"&qjt0}_U5CΩ( #~G睊Z4qw>03 ?Εf28rιZHN\ԭTC0b8%[>zG?yO> 1,^A]H>V[SwO XUٹe߱hc(@yO)ٸBĕkjӐ piژnQxu\_7+?ܩv |/췄'D:DgT>q7엟D*,ۺ5|-7l{_k (,;l8*v7zt2|6ٟn |dʏl=0X@O荸,a5L|Ӆq؎9f3ce !N̾j:~ [RiCu!,t.-jA!j505'9kmUQ1 @1иjל R6u ,(ĭHnGEtXUtwD~왝V˽q*sBeEy*8H!Vb{pyO>]+o[ ,Rj:Bb>qG(jVubLjFU=88yR R_jq*>$P{wh9&u_U ;a8 M ?cD\FPefpd&Te;[uNO*ʀlqGBai* -"` ^۶=;/Zt22l7F1Ν_^Ş]J+zS=}_Uq٪rB\s{T֪aş(%ҍ6Gc3|*s6稬I nT6*'U@PT{lC\jDQZ[hvv~~~ޝ3چqH]_rh(l;X-u6!|^}W_}pkϽdžq̵ᇟ|ϛ(|#飯@t6 VZk1%f,a4-* FNh"XEA;g-]D8 M\dF20@Ԣ5ZRlvW HbAK.%SHk]4a"ϩ`mBn.];NU{Qj\\\xĹE `'}kMX[wVD2U#!y4FU"2Ȣ_Au^X. zg9oVl~V\gO..n~t,e;<3˶n?3SL aRR48U r01mX[}&1_o6/_|{O>o|so"y~"2U;"3PJr6eyS]mazJqp`bh~ujLD0iX,VTMQ D9< @9___S0o/>D&&sLP!B1xooo27ˊVPH A ۵XJk2?mun6(*4hVBPP.V-)x7 -bX]{w&!Z-jmdm @ms' ":X߾}vq_r``0<{Ǐ_|Gڃzn-}Gpmejq)Obq/6[Cθe(F s5kfqDάggM!=̄ٹsc &8D7g-#e1s-͛lzj],uT4"0#.es9g"Z.//}uD cvauMqvzOmP%#HYdJ<v.xByTtIZZ%ta;cJ]kvwCnZ ị,M 9ط!0 #b@$їȓa7!B/>P[YnV]X,/΅ыŷcA9R؉v)]\_P5S%{,g`XqKΩp9]ܽ\-O=r|VЈ?}ErB k!D v]gWɣsn7<7aQ472 LLP+sw"cJ!1LZ^ZqBn8;>yBA6"+Ɉ lUP8;q4~$fv[e# > )fř$9 aMgYmran*pڢjSÝ* #9+$r @[-H9j%撃!Ĕjm*qPUQѳg??Rz?wZ.O/Hmr>;qy}}G"q_\=:ͦ*1C(h kkO("0Z}dr٥.ʭ!ZI}˻\.?wTMru*v;_.Cݚ(secͅy"2hC'n A;H}Nˢ効9UxyWrґfq;?}7DuOHPU4,8p6rom?dV͊EDTXj^1/Z22V{fq-[q./. qooJH愭Sa5uz# &r0сd*3y_vΙbRve62M8 wAD3#QaRjup٨ڀXKm 59=z?ztKًs+ XΉ0ݫT[kCכf>|g2߾xx7 :إ̐6;cv.z :<ȥ]'b̥6J)V朳Z=X|r~ΝV{ggÝãz3 Z#ۍצgfXq!ryo  $,;\y !p!B> \DՂH}+hkf1箷ƏK}œSyZ+AJnFAZ+1Ts;zzo2 jD]kCiDAO/!Kݥ,cJ(7`T\,Tn1`/suLeF+bf@ %F7(R8tћo};~^o|kNO}4O?~v~ggϮ./.ڃGǧU`:;ڋB3#P0)GUC^TGa{{}J"r~yi.s:쯖祔7kU!9Es.9>h af4uݛœ׭)@2'$TwH6r3s$*".0zjaߝP '`"m|7y? r,4Z-_o;L.W"yl4wnbJ{7ZEJK}!rՑ|{+0Zk9{Gs.alu2iAO[ۨ_2;CzlRk.52DZqJ/..ruz+a../Ϟ\#TuS:=::Pj})jƈSLd!Da#wyyqʖ[ M-x*E',U+X10(a;tLשvh 7Uں8\bJd'b+uT+0KLcYEoWc;WFD7tf쳘#@ݖ[dUBbd&V&jR*lރD5}.u] QXjVL3BY}GF]:} &!F)eG#fFlZR%#>|~qq/Mݿ}o{Ϟ>Y~1}km/q{h-=VO(8ayyy4u < -e6J#ij{w)Qq"!-~z(,Zj)ys)bٸFioo9ۛwN;؁!06/m>yPlJI6 <ջHg!v(/"Kyy21"TP|w\+䜉Zs.Rs0DRBR +edbH9D*Zk)E;{u9b\Ed GB<\]QcKG3Ur(yw n?/mW[?W`eD9`n6A$N%rʹ }v9^d52|X-6Ra蒾_jFs,lo1FKŮ?JGV{޹g/οTB!oxХU52<ƔC$<rka9 6.HqmyQ(VkT)Z}Ϟ?<"v)ZKM!.~~L1c:{o8qNbY|=fRN;IpG DyM""Z+ϋFͦcL4y7?M`;RKAľ_P9_k3jc꒡3.mAWhpRs ʶ7ÀBJ97\JXZ[ P*#a  Jsc!c-u]D#Vȉj#nNcXK-upIEUS)&O?9{c3iVdXYcL!;kk-̕SK5̚1[wRP 0Zܖy\w33̅fsm42YXTTS@B")bL~}}}u//.km;j[@E33N5D:<7S6 ?vU6?b_맷B6s}1n6/BBs#z,%(x&\xU%e !,"*6ư3vni. &(OVrr^/?yG/prRzn6.Ik"zHh)0Tr)RK-{Ck<] I],F(PZ+,1m-KE1#[yc ΑQEkmqj*lm{?~);}`mD 3JZaI 4U!(tS@v_`w*N90T.cZ\ŎAs (3ĘHj55Da"tk \B_x ,5bC'gg/Cw1.Y_յrޅ\sѧ|H)PmVbC 9bHf4MSE~?/}gnFܚ 7P U`wo]w8 ᜨqXV}/[le|D: /߾S Es10v"npBIu;7K[>ҿ7UV+s Njw~qK=\^\8bX-vo;h ;qRm6" ð\,8)F|b a xtYz.]#xtݣý0 jY9l2* ܌+0Y^*%ǘ #€d,P+{mE13[ 3MՆиY]׼󥔒}'Db ZZn,֚uwE؆IݑdCUEEb@T'?]ef u)3\ !0*Ln!jyBTf_͒d9rΜ`%X, Aa֮9̲ bh}\}M).Ku>>-]'{ͶWzOOou ٓ t~g[cC` B}@ľK!̬1Et u^&%y̻j CȆy,կ^Um>Sd}g'M1bqEmcpb ("qCjc@ԌU=͙@b!f pCa@y+l $ ܨHaod5 [USk*!xL =KW!k_13Ũ"RjJQXEZmBbߐ3:R| OY~Rfy*Dc,9[,2 =3]TV&RUZ͋j)TƵ9s,Hho'c@ΙsƆdvUh2䜷Ykmc*Z[S;vd%΋.>Sso-tq1U " BQ.WhjX,P%\X$Ve HVbZk5jJS*'?|!Ru'_Nwmuv{rr2Z;Vksn\ZڪA[|Ӓb\-{Uxy'݅}} NPřO}6Aj- BVE-+|px`.akK0 .!ٴvQk^,¯[oZk-Ɠ >hrG_k}t@xcͳRl1Z 0;=ȮNj6E`#Zu0w9B'*Űvk- Dn.5-fπ]>U\:dFW7r*,Cǡc2Vh`Իc{ ՚ {Njk0CbPu]) >`$shqoj8z23Z}oU@\-Gλ' &E]Ci; L07>9q9ϼwMMTj59s!Z s ('4  hwBC1H7"C6֚#Ǎ4>"\i}kU[5nfwN; 8,|4ƪYtR1mQ+P "꺮yy5'm8uŗya%SlrKfS9G00%΢4\JiAa334o.Z j>{˖Rmh[sKIcMLðiQRjMt"V]¤yu7^v V#;Կk\:z׭-S7]jٔRIY:5?wi~0f;ޕZY{ogQ1LH}vN;gU-qZkfYk2*KUhK6#i㻄{6<-mXF~־g2D,NTT\:cٝkjm{>yq,tSkֹ,rvDHlVYk4gd<ۍʗ?Ǯ D;tNvX}lrDP6-\ѝtUfX {uL!a [I=VRrY,j3ؖEM UZخ𭵽juN}G[Qof @{Ƴbs88ϼ ;rއ%;oh6՜9"֚C4|J]Zm{jk~ p՚Rciif.&ϐ910vc=2&"nD(! 7/2M oNpY,(^xR̀9Eq)xG콷oOi+c)27a\-EZj !jHܸKpS0KqIT7\DU"|Q2 KE/~̹o4stý}cl럀DCsȗmooch̩K!Į}Zm4Q3TgElu mI֞Rw!m6x_J.]kUebzDu[Wm4'")uYyo۳a)0׵O׼fgs :l&wq3^]R !9vsΆ|I1V+k `͂v!zEJb1- LN,Ai\V{1q"jLaBX?C [ĖS 2g^/ofv[_Zڸֺ3Z#>g#SfָbJN2ZkfG3`KtRl^Vv?$;8ô5"T? lEuZ+vTc;OM8M}uF"N8qk"ӰzA k{U)BŘ&*8 9r}ks"RNuw)% b_BTt>xX.lJ]8E̡*ؘ˅6_ `[of3t]핹Zs)2tvfQj{b6'Bc+>N ?`vEsGZG?{"Rr9k-{AaN8s$D ZYA!l_ oV2MA:w*#RƉ]ׅ]ܮ01U;XD8bahnhG{\6}&UlWl qN7UُFMB>R;RC^ElG`bfu>P!Ǝ:q;qfxjm-7墖ṇnaL19$;SE?Q xWz#?[wnK]LW]KM̼LJϞ=9S0\__BUZ6UT2а{QJ1!snSJ]JfRt;ښ0ǘa ,5N,h.%|wrdsZ{P+psDnlVJaf !8ָK]GD8*:9Oh[2MC֚%EXD mmB\@=xWLU‰(g,ak8m`ɀnYMM0AE"wB;aB!j8X aIDa Bx5v3۠rCڿ5`p=FsčŹK˔Dn,Y8[<-3m+?La6ښy\5}]BDk-0[k Q]Z%j F꺄?}?X,㽮 z*jbԺ5NIH$LRb!Z KS<|ʚ22αYw "tnǠ`ێjd ")~ۻ _sRy20{b"RjRs)urΡRҔZRr. Hy$ w1e\9DyWUJi݂ZB&u]7ɼj5?2&Zl.#o/r|Xӣ#r>}-v/O_x97s`ŢV0\:U%Z[p9̭"ld!xa0= X(8M+MtQ9k4DfDZ9~8E ovS!F(6nNCI4&N+4"aJTX w'Y IΉ0A&ԱRJ"Ω]sk("9$4H\1s.p&#Moa:8-KFߓv 3}[;yv< 9UlW뵝ahl2]S}m6g\f rl챃@J2_o6s9,a(by^ ǜEGrs2γh3Yι\sZYsɭ0{{_яC"Z}fi,cj˲^{u>,)%f9(6C)ٹ0MCd8؀nF}ps yüYlu\E (D X_ucr+HEA̟k@u&N)X'\NPb!uZTkH#'8]]ƹf 5YRkk1 +6)CVv=_׋ǏZ z"V!b9\ZEEgbk}qq~'8p:/on͆ιC{s6R1RXË@tZƛfؘw ;bU!tDQ0Ee.'@DNuȜնuؼͷR9MI`\ S4j ֩ -TH%Dh*ôYI2$scε aSV&dl%G ڸd !3p 12b:9ly뵖\>gLD]L *ИÇþ#1g؎ X)hZG7"ci} ŒkcfN)QkZ5am4KOenv-X7E)#Ul70L Ȣv?odYybKlqν.C,U@A4Ѝnpƚ?O4 JmlD+@W (:{bŇu*0+KdF{(o6-?DR~r®):}R mܷCn|[~ B)JL {EC?ď7xz ɹH"jfQ6ZJizwʩ""F31rkC`Q1%jJIUTl{;J3J^} Z+-Sn~2SBL]vËbDl)޸O6zD!@`S0n^ݾxvurs~BJgCJÐq@ ~ٳV^J2_Q/ESN'lRJ|T쉡*S̡H` 㒣jC1%}.ޕ0D_K3Z_6,:Y} )a&=N loMMwuw'@33%ID< sXA9.͸xR˳GG;+3!#$$D$U 1#̷1D]@K SĎBXŪf*r8!!'7[5X~co| $yzu{~{„UwZuݿ10"VwWxylh0"ZסPU5vɧ.^_n{KmwIMul}R V! v)B KʋÏt{O{P׼\/5ޘyzBbȦC`Kٰ!ղaVY8ld>_W 1'Ϫa1@&O"[5"H)s8"0hj)%5s>porhZy`n)&Z3yBzhP9Zcr\q0Bw/GPH̳HѤ`z8,a> 1"DZ (i61~$^ S|0/NNᶕ~qorL_e26ԭfڂxl<}bh*,;1ڶ=6YJDK;@VՅ1Eg R#cx1. F-aoQ́ j]4Ў6@ok`1"0Km Jy.˲ocpb ^H0dMǤAM LD Symw)e..DV"5-֌њsW/_ܴEl{<}uuQ_<{yEnWWO={xv͹"*G3VќB Qur5smB72O6CZ9ʷߘb\#]*ܽ ebDTkK)z @Bp1*v9[wGh]t7˿NϤ鿮ʱjҩUǡ=t S f #~YtED4̺vƳo%tc%Cq\Tzj5u2)|]L"DC8EC]0)-`N)%C B뭋@ӓSqá:4EmX^FG8x2W:< Cw<*ҧI"Jۓ1A$VM꼻gdeRGL.$>}޻`A>)Kιgթaʁq$@55 g-e|]b- OB[*w&rÔ/̖\՜$RT%/QV!",qoavm CrE fwO>XEcLwbNKI0wU/{w]|kfĠb[Rᰔ7 rѳ131kGק-7GQHĞ7)1ӳq?{yfWVZSjfwkGAt:bJ#6Ƅ;! H90Z"RՔrm>h2&tǟI$wrv[a?!* U yȃۯTu8!.w i#WSJ)y.$U.=xq~8p{{DwZ+1D@ ӊko)V2Dnwvzꩴ(=0RќӐf3SME ߌrn+>JSC#$1g \f7]fM;:  =^ 2j M/C!kMv™p:Z0DRgفC܆ޥya07(;e7f0yޗF4ӣ]!닯}U;/Q Yej[PkR]'h7-) t? U5Z=̳*S]$" 1vS4$vā11Ťf+ibTmr Wϟ?{Øb yH4hCzkA{cH6ctO#;[ÐKg`nN3#K)j T!9oϴ+pLSV*}.ZnBD.YD^40QZ0uKN ׫ꞵV;nD:{)1Eߐ{dvnDjK!.KA֠Kuu .7%!;/R #^eA7b2]F4*hW1\j&>7't- Tc?[զK<U2C5SZysn1#3PrGPve@Ȁ&b,f\SNǘDkk]$ߎbDDHNp;8%tn15ZK-3r=ƄT\`e{cnY0 jE}w֕j6}a]ub_o\vw#i&1p%`1 ^˃7l6{09<(ƐRtVA+ "jiE{[`k"6"ͭ+rgtu8Db D .tXNs9qG^~, aԈAYTu冪YUl֚*ˤN=Y&qYuFTEEC>~ `fJ&(RLt~vsb2Dlp8_ӈ'|xћg''CJ)_B+fc=x>DQۢ^9Lr|BȲ?lwkgݞ<|) vZ;?D:qK-fSj !JZt#1{L]=gA񽟸} yY{BHLNѐWёt, ։0;ƈ]h,QT7^j:br^7$m"A FVz&D֪1[z*U3y·jr&J!J)aKpqyYyvqƍaFkfv="s]̀o}WOO闛ba.Q S9c_8&b. !XJHD953鍉LUPIT(cmDzdb$Td |GNժj!'^G\̸֧ǻ։ƹj1I7SZ`22@7XYwoBHf\DNeb5@䥯. -"jF*j`1E[ < 1!QNZL`=YS)3Ed@THPUvErȠUo}W<|x;q08UUޥ^KRa6TjzRCoṶ2@fo߻o=Z.CsZL^\!jꛀUUL9'6A`n-*% 便a9 ưe5 ;f zy}cf@a<_b L$c fКp5㔇RVjCaz_j+^"X["3qjQv1Ζ?ypÐkmnf;R&х#ZF/28Sbt2?Dhj>QU2/xYO8 ]Nj!@h+1{A'9ޛ'ӂ, c.;B|I.""B!S2= pV޺~j)eH*˥a4\wC !R sX]M y)dP[''7?'v{}.uki.~.zZ=@z5ϻ&t9vB phN.V~f{H"\jmf!Di9A΃_n~rnNl,SƁs_vIs\Jeb1.x7l8 8 sS'ܒ۔cLKD\jP|L1&4[_=Y5OELj8j[kUSi+K@I=[,GεCo}+LӤ*cN{߽1g mClֺtKn~7嫫9=DՈtqG0Љm`*z,_k B)M)K"Q[?_EGY1儀5rC"D.I\[#0*1b?_i{74OD1) Z11Tc0&@Ŀ~O'_Ja # % DGܹs:z֛/.q; ,0WDUC8x. ^)\hff9gHfeut4ժD'5\kQ>?a0?x[HĽ67/ZifaE8 h)ӗB)eCp'| kqW4d(>>#Zj+EOF֤%k͋?. \Eb`">"qB0څjo2υ8'{ġwqWu\aȭnO)m6[}{cr`5p~~Z kvŷG#cDV[ůVKZjuq+jv9.`/u'}?| `aBt9C!F!Rj|tK]nԿ|qvffK@qydGR}dZ%S2d5a3nbL]_C#jim?!X\R&.qʶyz91V=U/J?SQ/ܑ1!hy]#cS}EaښZ-e/ V#ޚG!vR#'''YLNN\OpA3;\8 c~9O1fݻ_^޹rraZネ^K="chVKqY+ƏZT uz m1>wg% kou.3hmRJ>2?R:J7Ԇa0/bԼOzQ^TѤ[1H.g~\]B,?puD"X&đ _,LdU-i*Wȏ{o޵mc!D0Ƙr^\j崬c}jxґ ޞwUfi=ƳDl"n6#TzI1εxjanU[73CONN;SLK~á=|Ua[f68 g}c^[k,Z7洔9ebx5񻄖2=ϊ9nw$dV[lنP؍tc;:^3)1k+(/|!,Հ(H"*ޙ iIW>-$L,ڥwDaf?V|ÐONN]p|Xѯ]D LS/u{YUq_Mk4n61oֱ7\b`fiiDy+;LQq|z}suso/+s?>S+vwp=9ӡlr*siyj<.4r=LĄ@gۻG{z&Fl23&V@#N1 - WXC`6Ɇ_L]un%10D%- 0$&~1*EC]S)A9,H];"cds.sRMz_gU KU7>_WD$='J)~WZbKo/޽ `fs&{)~iwOm8lQBfjͥvC̘RrcﭔJ" y&B4B7 ps W t?!뛍}/715ohbZ\1y%ۈ~40{ "Yo+aO(]~a .6gZK.{[]amv"!quuu@擟n6@(uպJEg5w&Έd*I{CB6TSD1"B Wkg^KQ` ֛zNp8 y92U/OtW\WDD֚..ׇi..y㍿:98 2;c4-X"UHjm0o^l6a4ѧeo8uۻc!pkwh.ZK)w7Uuxu{vdD袗8*>Z>ޑ|?N)_*c=J0seZ럼Ogf9ϐrAakm9F9̳ K3c~˭9߹V!Pl溵s>??oonRyj)!0Ennclҥ13 1p`[oa9BPUkcaB0wdj6Tik'fH  ĔV5B`re FU#B  I+euύeݭK. 1Zp99+XmUTA1ĪRCZ<)ֿX" z9oN|}{j}?am^\/XRt9ߌqr@=z=4pџaGdfBaGUU|IQ`#ݧ9'%7Je9ѷۀ}pw֛H.a^ Ƅ]j?O$v!} Qvo s0 ] _T*AJ)Vj srN$«Ƿ:|uiցa}Ѵk+0S+2-q 3h&r3 s!SG[rϤ'6aBK9Tǭ'U#xu}bO^T3q%r\k?7qvzG$ R{cR<ϵȸ7ߺ|PégB JW0wL` =/ ' t==?Lu \jab @}*e.%Ĉ"Qޞ扭]ܬeлj+0Mx<ܛ2Ͻ0 8OsΙgckMZo.TL0+xEB@]!;G#QWaS[]|D޻u Ev|dZ !Wd9ew#.ao}e-9">y"sq*ef)2RJJ^xFDZ4'hCuE->q-<@<33Y穔BjJDRp:W_JFdiѥf,3+p@۸UoK)0Hhv" EDfFb)Vav3=:T=A5}r{{k9u Z(z": asS79Û!lMl8X2Q01-I㝺i>Mbz/<}궶]㐙(qz<ϵ̵9u~~kw/{U+uaDzuoZ8X0y|~wX)DriژbWR[mMt8M9b-CN>E@/2qEOL~Us,.qaHH=jF'/BmYVg "x$:Ipoͦ:fl|"5)5$"zc%UٰOMme]_ &ZBw~*0@ ad1q-]u 3q Mtv('^ypˁZlŋ0%MI˹ni:LD4 2{VbSUb&buB4Dhy`?Y4SmC@]'؝Zm~ڈȗ&Cb]Ec\Woj* A.;5%L"+B`3u@[y]8VRā[jE$^Huਪi! Sz8s-ڄqsVU9nfj`1t r<@Us$.?mc@Ik4o9S!*q{$Ukf&Z2|&"(Z(Z):bZ[%䵔/ɇ )/Q@!DS`A)Vͼ'$i&³3/Zcwyr>c-K̈' 1yp"|)e G4rN!|h3n<v]FLHKΟЈVxZK.1bf8qvyvzU~a Ҫd'(4w7q|76UDN8ƔbfD#qܛJB * S0"2cZԿ;~AaERZ{4_ 5j3n!{C)MM-:6WO!Z+NB#z<ݪ{TkȩMUEeHtNkoq=y6yg?rRird7S%W bJ2+-4BXq*`!#|)JП `{O~`=;9쒆q}%7c`Zz2z8w92O]K{9#R)r?OƋůΛ$q&*.N6g/oݽ6"/?׮fcp{J /Z `"\inP'l.3!j{QDh RiH)e&D.@л @)uŸzJѓ߲L#3ft*Owu)#jHfCw$$r*gĸ,H" h!R?yy4#ZKQT$z'*X[< }up tһ+sА4@rL{/"}Iٳ7<;_}tBU?~g|#z6׏?"3RNV׿0S/ь'raa~xf(+^39ciEYX+7>UbOdfeyƘ8^M1ZNOOk9e!|@&T3#)< ˏ8+]Ihk@D{o So78P촔qLLZ98/Yէ ̘"xlbNDir1{1%"aŪb$؁N~_Z%lwEx#^/]sAZk1ki ]lIū|rE\_}y;)%7k)U'+-p3!':=D]t u%d\ׅku1W#ښ \X0vmg 3.;XQx`4ϽKQD{M"rDRk &i <ǢE Fػ_N!>r~/ o9a;_ZxGZovW<}?yg}iuDy*E:tŲ8kl6C0g'cz/nw', ȥH y1SF|1gڶ'_UxtW!w]!PޗkHߏUMTMK}/$2xlRT]#!Cm pY8pjaN["~D$ZVUӱvU1ǀJ3݃{8fc;޻AcP׏5""VaCC8?a8nOfj'oO?={pާ~+?ij?99~=۞l7vHoBD')Ə?w7~t)XBP Jj+׮``%t;1޽v62 ~7mݸ|#{uw%Os ;tK%"u[/A3*gj 9MDg2Nji<rJ (vWxRsΛJ1ԑ"c"h5e˜\ Řꆃ_|O~w\\lhIp^;w~_ϟ=ië"%ĤO?R1ųӘ0K/^ҝݹ<,!FG^^_"!?MSىOf*1n\T^$9?\o.9ekjmf L &$"u&&8ċ`W30pV@\͸u!qgA̛i4Fz`v9{E%#"<|u};goܿRq") Pks$=bيOc쟾o_mvsYFf8c>+(=)^?33""txy)]T<Ct՛1T_f<}e'^ɺro,\J9pZlVS 9y`Y4k)%z s@U[E"z8n8]mMT]]Msafi\T8^󫫟>~[w~GƜ9Ņ$ˆܽիO<[o}iwyޟl%(ieB^lG4eI  8gS[sRL>qQku }=3Eպ4D !>3S? 0R޻u1FS(ږE nHvF<̴T2q3tV9HHaȶ}C#rCm- 37"nΗ s M-Ai9]073O,U H7HSv{%޽/}&'OzkQ<;<;[ŋg>~Z$d6=/7\;Gtɞ]][{u{?Lo޹wKiz re-m8!5_- |{;VՇ9}yQUkϙTG"[/׹MZ׻w Y#DbuU*|f[}@D:0O>>qJԏo__DNB87nJξYsG!u^JY"<Η7! L"$(Y|UC(@l7WCkxݹnΙhn!xs)"O!/s{/3ݞHK TC5$YId.K<'"Qu5|3B Jm8aoEے<|pÇٓ'+z~v7 dyo>ɓ^>yu vl*Ã_ J}=p8B n q!&ׄgL%\j#l[O)yĘk ?÷x;7F){7檵|JKUU#˴N:?RQ6LTQ5C3>}CFDyC6 !=MHLOR<wJ׍ ~VVJ xp|slSI{{B^Uu#@DPʼD)yKLA`:!`6LB7ڙJT#\{oj *=YD4qKpٺvd=zpG?џZw\N߻}kٳ/Ɂp ";E@!wYL"bh!51RD%o ȩd9]("kɧ ܌ãw~1>x}τaRf|PZ䃟Ua7u4×:aIjVkW77ُ~???,sO_6w^/r޹S0H)n^bf+MWXsmMC`pW2KND#a3.B0 ̮o)pӣZ`} Я s03;1\C8?*1]=!]&&+XSJQWS! t]SMTk!X[:u470cpmPRBS0njVIVfL DDLSJ}7 _f2G?]@'f#GaHݻ7nG?;;wғ?O/6Ûwz{)'SH`!ƔsYEJ]ey&BB C\IDՠW'''~I^J׭5;˱Gd }.R_S^uYb %/6j@׎C2f3nDl6.xm|Zb<.vGP_{^FᑎLzm- "jD|UJ9<9[&"&](>j<Ǐ?y/჻Ƈ.N7Z[ y/٧>}wR鞰v֦"fඣ% QVmd>c\DA9g,CRB5nmvt2|B$@83&`zuO9lD 9EУF}7֗bі=*{2f[oj80"?5`#!ÐCLl+S$! NJKjF! Q/EMuX3e?ܛz5*RJexBLf0ϳ)l:jQvI֗ZCT˫}˳KPo䃟}w Va?MW771.xXT^!Pi.p5QDcD=S"_ 6"7|֛)DI)OK1Y$kcd!檅.ƒ|" *fjR8\3; 9z0)l6y.8,cH+%]In@XE5ǁn 6_Yۋ =zy@ZO|?l./Ϟ<^j͵>-gO~Ϟ|!n[Ϸ'xݿn?z0Nɧ?}[vOb5,[|/ @k]!">"KȻ=T?akݡk1Sac&&@ڻ[ *fʹ1<{o!D颦c AU!{?&̽uaGlUƌ!,"c;\\hfW7|G~|fs?o_KWyчw/.4V-;Ӑn U *b 鋻QM[k٫ZP׼cC\za"DQ`/ٟ=~r~Ir~w#̝}'m=RV j[Z挭ep 3%?h04YD5(cl=q]ʲ+E21e;nBiŧH FpH)֙ zku s1Uf.e^(8.k+c7~ J$BUbdbJ@{o78 ћ.;ɳ?{=_0OW7izus뻧'777O>=w1\"hNNpJO>ٓyi1>،?裟|ѽ__w}`@''Tk`CNZ)XJ<\[mbL$s)>׺rLիW :LhL5fc{H-bw"OSb (TN GFR%CDULBo&Dp[k52#{dsvJDkԳflɡ`͐`/>jSbVUO1p$ĵ2A љ%1Dpuxĥ:k##.cVU1ұ~y|wN)|70L?g'~!v\_z\a^Z 32Cݽ9Zk CTy."}ՏtPTqɂC RvUkݚ`Z[퓓<Wp'K|t [\:X^^ց c I)w d{bРZ2;g6溂p}8x_v8At̫EA+7pZCJ7һB Z^OӜR%9J-8lq'“aO"C mѸ٨ajONN,PX%q`S[sqrO Zko,.]8%{围||#ƁffU73%R0rt"_X9 Cki]Т"4 }Ƚ{`31%79V=C 9s V){o0nF'W<w[S΃ c)ecvڗ Wtr ?}?ۄރNM9~wǟ=}w7[tRn<޿sH o-"CLMcJrrz `7!+*~"Iޥq'|Oyr~vOG,:z$\x K"QW}} GZ:3,kҤ"r՞r F]Ems) @~dw7 ]<3 Gcd_\Y}U?́w4aRP̥YD9Cl7+8"Rg"څB(87xnO$Pzz RJ!izpyӗ/}M%jU79=}޽!~` җ>rϞ>^^]O{p1ܹ{߼5M׭|q)KODTX{/޶ݏr_5)uq,p*,u!7<2[j^GN)@ʫi {qG#uד#%3SWQ .^SXr[jƲpLܼB H3Qa 緷ڛx0MS=52CSDI0aӻg\ή\CW1;wӟٟ{{_^;L>ygzuӏ~7x>po_lDA!ֹֽZ:;9ίڷ{[~_rl9϶gO~O߹_|.;'Z덿Oip5?ʦqTU4p;0&]j=X/I++CgDH Adɪ"Yu?0||VϬ~ݫZ(L 33YT 2#=ͯg߮UYbew1/- x&s"/^ Ꜻ(K93$X!Dȧbʹ@w(M9^4[u r (ۼ RFR$u H!@BGE3]=OPӴ^tڢ(d:d1FLŠa}m`ۏ޼}4Ti8|_*,[0FԊ3ǴɓG;/?=쾥ŵzԕ[7XھUY.Q%?ygJEQLZd^)9b攓6NZ94(`c*9IxmU1b*T})YKo>}'y6kzkKAxڜg+3KhWj,{cgM] MΙnjTֹtPkZLmsLzͪ˵GQo>_j&yseظdPɪm"gS'lĠH+"!ioIS-rN99IW25U|`9cP4bQhkm hMD4Ft4Ha|b4}Ep2ZwURv?çOO>L)mƓϞDs*m9j$"=cBt&M{ɋxu\ou.?xkFґ[gO //pIm("zSiݶNؓ9I\ U2K t;HNs(\4,;;JY\[3p甭~$ F$Lߥ[iR1$LZswH!*Ť]vn>YphP! F/XinQ(ߴF)q1DI]9'.pԇ9g ϣ -I66eUQ.̡#G ts7767?vW^bwn8,v67!D1y?zn=w֓;&:oE?K@Jiw2~s~W&4O')NN)yoxSi99@ڧma(H$xMز(("r 1gMdcI8[}@ {oZp֑C?ֶ)eܣy3[껽VrfY{ЬSL }GmE`kbZteg6s"̉Ct`3]IٸB^|)rKw(rm ߶D B]B} 0Ƥ))zZ[ZZr%]•e|)Itm ~P )Sjo}SQSNYERL)hM95N)[29[eRsҘҲǮ|;yO~~?gXeNmic*幹K )FdL!!I#*x_Ѻ>xoyK"{Бo<\~Ϣ^K f}pw>:~ܯ_؋~>N4Zz@MLSYeIR:g[W:?hq5RHk9gş#79G~diVJ1Ƙ2$wSncDHYzUs|3qJQ`v$fDJrJ̄ J`ژu]  BEQt69DA"bu3z_H(r5h Sm;!"10LsNژR57֙G';e ^&}蓫Wܿob8E=ʜٷ/ˀ߽{,/,.ϭ/-F(1R/jE))=zl: Gʉ*zB/b+c4 zB)eEE jZoYI 6uc%$VnbfUEi+<uwEglJ[tyUV/޾uhU//fO}t@Ʈ/O#ڻs_&S4^\p bQ)#dR$hYV;rJjPm^zU%цhO3uD~Y^*)9D(#Ѷ2X3b$ocQkmN)cC ޏ{J(TNlڤ8(c dU)~vBDRp{{\Q4u-u]7u4MJpxރZ]ۿߴm_1k{[)Ee eY9d<)Eo93WUigoÕN>wǗ ~CH !O>_=vl4z$!.χbW,M)I)U6QgUiC )G,*jRN7H>ؓ1:?i,S{%EhJڜ'@,MpsgDTIIgYXY])|jB.ۙJ bW<)uf R!D$$JQx |E\"YGM۴!h1)mkq`N; ^۷U;;O&8ydtfN߼?WhM 1"߿1g֭CZhmm}߾AYe!(x57,-6x9UHѳbO3eܶ^J)#r7MAg){k[L̳~7}JicT `}h<.WGu齤LW݌YjdDZIbȹ@ݝ^6O6Ƙ9e"5 BmL Z#E('Q>/BѮRDR|uJpl ΢ا=+J""ea$A\BPڶ--]F B]!i=e΃0)eH(S+g9SR@=Z묵`ۛ#tڶVsU5No=x3'}s昒s>{:z/m5h8H)DJk=d[H5ĦmztK!|xյksá5F1盿G:z¹W;\QJΆl?|lk{5k4 >ĜSm ƘrTZ'z҉ij"!+JÇ n5cLx顪{O͌e96FM|(%Tŏg'Bhӣeܣy4U#)%8)~ܒ9KvtVd—X)$lL&bY9e"ԃA}+w׼$&RA{I*E=t¾T,qsMUoc}g&*clcVE3cBh ާbHu %|kPR-WF3g)1 +B*Js̐s"a)#`[} Pu]1/6t:ȹ{O?ExXHSZm=I)Τ:./ s Eqh~k\]ү))"Jޫ.Q#qL EiScujU[8+k-LZ{N~JF%5F[)AbT)9" ǰx|Ν._ś^ GPZHd$r"EYUeኺSJ(b웼% LT/wG>2+ fižxZ BQ)Nm2+d23 jc]:0%攻ɵ AjRm{/qNYgtZOSu#BoZNo9}᳧bǨ^~\ !$򇣑6:"v5/bg:ΝۻyÇ &)"Ue3y'!/ 铧#JM<1\Up$ ZZǓ gYlE۶2eQ~J>߬[zUiPjbbi[s1ͦ~>{v#8?ƅ?Dnص(KR5HY.@dգGĀp3/p ͐8.Ҷm!!xRKN{H2}ØnN&yQ^ l?hN0")|-z4BD3"Xsc"(R(ӽFTTY" {5!澲@ CS2d!qN&z7(S7;|J9O>}W ~";xpuy聃+KKϞl]^VJ3CfidܘR OѱC;~J)hcc\WW2[s?̊H  bV{Xg+ ) OcA6М.i*oZuF#/фǓpRpYnzT`*{)|96"fHx{,˲l*ҴBdYRZyNS˽Tm9~Ni.boS*J%?ɴ6&cA̹i[$"m&EQHjIG291>bLFkك1Fct]GQ)ib}!#Wt!4R4iPt$rFonxb2Hgy<5fPUǎz\VUm۶m;mOmJwƧO|W:4?a+].}r =o|zڙc檢?R>~TiCX"\amF-L1D@D)zkc1&u\w̘ȵQu&D#9(i4Ŕ|u1mDtqmۜ rW9wry4oGm-"f,?LA<_*Ŭ8ܶpoH#f!x1hcH1Aַ)'1 뺩erB@TS̜1;XQ=~|ƍ^_[[Yb~g*G:r'׼q{;;T8CyI#Je G1|㇏V@\/>U9/RF"8'R!bDb-R@u]+kL xSYЦZϔ>rK)IYF,D'snVA*qo+?WM~rl/s|ԏZeR$#jR̊sPeY'ci:X6% @ ˫~jSiDRiL}P`ӺpV)y)jJvN)Ơm*`MM4MY8Ϊpn&@ڶM1záb:L T aDWUK/-LϞ=pYC`mJdڙ3n\%P)Em6Y3|q!Z{k?X]}f_{s#m͍Ϯ]۷tѯ*X=~Ƥi|ۄ4u[EzY{!'ڬ@^ <ΒJkL5)(k%ƚnOrT)'"a_'bN,s "cڶa P7V t =QzB " vbqC,#DT3mGa{cQgsc,M1%Yr5)(rʺ>sq5oCɓb}H9KSbц`s>xϟ_~[6Pw(R?7.^w?[G'u[XژOJ(fRD-0B:v‚lG:RtKŝg97_=s=ppX?8h}Oŋ g׍&{?vھե/"g{WIh-b6ֶm IZmLcLy@20T D7ibx B"בSREQL'cfUhM oo9 |]'cN@)m&3&H@bϜ SJS9EIZKDJ lq%EVLZ1&$Ι]Qj{/YDN ()onԉ_n\S~p8Xsͳǎ~/߸u,ESjCD %P>}+t!oфSnBVZXUsAv[IiY@8jIV#Ph3YTύѤq:)Cl*1)%f󒡧#K5*ZЇcwCl/H/mgD9Tڶ5F(N̪,IKwpOYّ)IpSf fp?3β35T=DZi]k>])ڛC$sCCr昢d߶(ĩ7|i4QLT$XS1DH9iE1+V/*EQ(nepŃ'O&g-gn7]}@A|q>?yjmyw0&궽'.ݺy},9zt` ׏hGo?D*ì( u, &=sVD&[xjSHKĠHY"Qc)DJ IfTT:ĮVWhXZ1) ZI(]r@יs5:t: W+sg7RHU5k욌| 7umzIR*IfHvG8}KnҽǏ/^vAu!<ߧo ^kၵ#mln<~dwyBnᎈ:g&BΙUfsGSM-Ӵo޿wѣAN>aKꩋB4RJ ^fL!yHEQI Pw)3gPI)g#`JQT*ZJ[S]g6R3]./ָ/ ã k%GZg93 eBH)jw `o7Nu)^2 2lEґJ&J 82"tu5P$NӕJQ&=!bjC߈HH0+D(P` I MDtNM[( 8Ң(O1R>$m&2Wj#s2g cL)z›+_u/|+]C^8ubTm+CoΏGKHܑG?ܼxڕ׍366[S DD13zkr0 1m[8SdV1O6"KۼEjӆR)eV*Esfc6)ÌVJ>2&9IXfV1Ҕ4^pL!6mc!1b&Kjb[=!~HK3`ZBz?e\w/i&z Ь4تB1yx< j[Ӛʲ"BZ}PuKϻ3'߉{,1@"D9+ +Ҥ@DཀTα3AA)mr&܁ 9Ie 4猤r3brذ*" J1 [hbgssk+rLn)X^XX^Yxr֣}7JDH=yo2ں{wɤ9d]B[[;~JU''x?b}a4¿7ÿi:ɜ!(u]O:bbG clYa>"qsDB ƤUT"+RJAIUJk| $~ $"$$j2fv^HR_0J#1e3%ݗMfeQH\al^ؓ[EX4 %Fsj| O9ʹ os_M'Wnϟ=ysE! Tʟie̩c8Z_YY_Y׮߽g?ݚ{!<]|ur1& x生>K )MD@B7w(MsJ1B^E 3B@))!Ť5,r hM1ZfФcr(3R,tAPye!b :~f?_%QrgRI;g[@> ,#NB D(hۖPF#d!L!%\R¾1a/#ɧNk8 mz΀H EW~9gP@GBG$$s?+M@xFTz6R"9dPoB9i2R/(%&MH%Ē_p~sBbT?hA׺j-Zk1*뺙NkmHAk**d#϶onǫ 0 0.8rd)FC4uDVR'\@b:I9ɌP.Ji )1zo4ٱ(AmJ7 r?gwAHX쫆R/U}0u]7ZTȂT},M#ff+xV=tE|?(> U&PJM/>RzB+N)23[kIwO?sƐ֠X!|)mt#@BŻ+D|9sYqJdaQDX!h8L8jVtmsxq 7Ϟtg[[+R_%7YgO?޽G?"1o <߼v׮YssT\PYJeŏ^X)؅NQ¹sgl>}`O>xZ[W2?[?Nv\&f5O| "8M1H1+NjgAlɈpX[){Ü3 jR !+RqgEio| X"-@Vbd\X)k8XB$60+)`47't}B1d+"b$uƈeH*CJ%SaMw1TVZ&Ȝʙ9F+3g}/J߼?8u~#7_oo>__Vej"uO>g AYvɳ'aݴ?._ϪRˢxsmiT҈D C1u\kÙX:C"ɏZ1+( ^4g *#@O0Jgq<3WDԟ}qX'hסgxMD_gu7FfTE9WbcR]fDj0^0@5 ᣔ}4L}3`A/ITmMΓÇ 7s4bYq㵝M;B|NaaVF\!icŔu=!bNi[Ή41iܜ\&[jF1!J'Gb8zا8?,tQf1 ڽIOɿ|bܛL?y?Ň<飇ll&S w66kw3R\8x/uRU_b}>yA(&(6gJkÝ] ҡ[hnZYV2wI1CL))Oe56@Ŝ1E:mDbr9cBHT֮( WHOpHQpx1v% b EU!62Zc1|Zk][P@UUbO@D g"62 AKWp< qSRL>u{VW㭷VV=v o>uջw}AeHkʱۻzVqzdaX[_%^ $g8 ^7LS'cX3C:k[\o{/. ]| TO"MhJ=L@ EYXSg9ȋAuN>9x5?ypa"qfD k?U|^y⵫}/9.Ysxy06ԴM 37/1m)E"ZL !4mcu!A1dѵK֊f/F1~GyuZvK}s>KaF_Y[7Ϸ<}z~MhAY.s+Ǐze'˟x:}+W\C8`5ƐP=NWeѤԇ/ƹsMr 1>u٣G;֖O9UjP_(& [PqΉgk\8s@0ڈPJ78!L&MHB; ,xR81'J I̍ uv6J1&(H1ibL j0zeܱRBYYsEN01c a0f2Xg އԡ}Y!s1FPDB6.I]9#BH~W^wykw۷>re}nѣO^Z\,&:o>٭۷/NEA!%/~}ۧmó60֚ѾՃ{45fsi*g+H#!Flę2bX 9T]gD$mS+bLu]RLXBR0N!)9'+fz~fwYƱ3 }# ?JJ$ 餬*$d3uݤX1_(V7Ptyݤכj:H4>rC?v2Y`]sy5DC}%בA12xfwfcIKI74!xi2!kP(On3(UUAr x;>6*!X3+-@Uܿ|Ʒ/i:&MfƳ_|O?|{[/-,nllcsg_>fp{q<уϫ\˱d~yE 6 (yyYey3(oe[RsJR Ns\$}IKAIb$" 6m (c2K#1Ŕ6ZwdsY5B, J1%u<0oi{ ,U+bXbE4ƌ&MZV$@fu{7-z/~GwoX_^քu(F*` ŝIWɌ_cDžs.u8W G]Ҧ(9A2+CLmU8gVϧͱW^џ#`/ݸ?wյzX Ν?w|>R,Ϊ@q=zO>YݷzեW~(lks[veBy < 9Crb g/b"!@p8t 95) *g蔺y69g֤AA(pʪL1MCZ"Rdo!iJ{ݎO sֈM=:<3۞XUYŔBD6:ԶfG.0~$RJ3_\@ς})<#3$fVIJm 列UFun,<(GdƟ6M$mΙEsM  Ui:ζmB)ݕ SʉD|TO'V8%"IJmw[\Zlys}qS()ۿ>W[[[?裘s4Z9VSJ.v?trWNxCp"B\7G޽bss ,%] B)`dMpY%'^B8+"p M)%Yke)4M $h=27M&ch4+JYkS1ƕ%zlqnw6fM'^,J{dZ^Xc!//OcJ1g2um"α$9PX i|0LFk$ {ъ19T61dP2eE$k7^1#!y3iϐ(yeǞjF9_u5hs%14 %ڗsJsL3TCWEQtZ뜒|'!bv"aS{Ro!5ضMJe;77 1>'$I8meчVW?vӧm@!xo!IJ(?уŹ/|!;WJ⇓XS">u7xɻ}`5'O{=:=vKG`]X^9[щ9H:4"?uNg71!㬌[*%gmQW5i@lڇR&!#\QL.H@AS1ƘPSIF@"sڦF+(X1 M)cYF@uEI6~22+V,MY9gCLr uYl-L^l[{dPtzͷ}_!\ޥO>^7J- >O_].#k s(!s`~?W_8{PMsmkW0>P !;<>~,!s^(t͒ 9JrP.Q qJD@q("@J,N1JцYE9LBDj59|dq0;x5P6׌B@JgfȔĮm qV8+ҤtJQ)1/<$s?B"3dKQf;@tO>%ӁRoهDr'MJ5ZA HHr/"ch26ΦcHKxE1i1Fsd:"phFSYK?jowh4L^ffWb h|Z87oiIn$//10yt󅃜bh44*G:6m9cZ[kmnDq07.,,>㕛7O/.|1eK^],,VEUPD<| Xs Ic ,d=ӻu)eq:JYp.Ƚ @`u]c5H diIQHT+R NI @YɧH %TFg)%a7a_>*$EY."3BeYRu]KtZևX+u B5Hpos}+tѣ/}ѣ G;x {<=pw Shݵ{w1aJiwwWcc6ᓍg=t@)uyy MF*rٵ_ܼ97(_9vTRKoZk1R4IXVܶm1InJ)EA'!vbN9,av$5sh4O&BTa&gcEYiZ  J)U\EcRyC}$R/ϊ>p7Y֪c~ޤpGD:__bnBA)."~qE$_E'ɥrqR"vOq FФ_eV>gRNa֤Dr΀ކۛb " iAs`( uIs8j[fZ7&q s%"c4$&OXF9DE]j͔RYc&TH2;t:OANDL9tg'( j1%F !uN+ǜ{&R@1,˘ (PSkMRhԶMJLbȓm9+ZXe JaVjϽy]n<}#Kdrocs}ۡsC]sW+9ʲֈ6-i"*n˗w'g[[!F)E.~3ǏG;{FkD1\{}曧N[\ۻn,/A5ErDVYb)eLHwGgڼPh;0ه\O"Y1I9u(l1(LٶmTnC\>gW)%Cl,^Jr?`/KQa%{#Am˲44M[댱˂f)VLrR<3=thP!(+U̺MD)G%lrιxBKDYkJ!5. hf!^I;SxR l%T|쁻xvJ&L9mۢ(sm (%B"pPk CT޿t㍭O./baGV TϟWeUMӶBJk-tM\X>xʩS}9K~O?>N>ˏ&[;qt.ǟY; N>56}Iq 1Z+CJWERt.N( į)7d)yX%%jlk!ed)N@oW^! %,TRX,[ay!yh3w_mDDTB2bH sl >4m |sN ,KJOvWm}ه/gϞ<9ښFLxСn?gf G/^;V.9¹iR*w$2phssiZg,&eY]~r D5VڝTVGw9{,h~dQӁgN[XkgO\]Yve1ݾ./~5)Fí]DD:yYX1g1hZ<ʷf)EamF}0F_IL6cD]RK菍+$I 0.4jsDCКJŔHmsJ"eRYo(5R<޻;ʫת766>߽ޭN,/B"Tg>vԉs#-͏FJ'Onl-,4{2%VQŹ9HRT9?K%ﶵ;Jʄݻ_l竁H'{0CBk5R$ J]WC`ޕKyL8r1ƶm/!P1Xk&qJy0(iZʹ"8v}I1Q'Xl/K70cΊxy;S.˪A @|` X[=qmDiw(o38D7R u%0 HA=EfM|JB)EmtQ8+fMZ*2c%AaK6w?t:ʲ*,˒Y$|iZsTcPkvggw8ZCH1m"Ľ1rND(. b*ƃz՛CFZ>޹yΠpRwTEf<}_|w}Ss~Oᅲ{BkMyȩ╓'-.EQphsgϐСG[[n*#`%r1@Hrl4hKݶ! QM){G.Hsd`D̊%=DbH(@1kl@r1@dI) :Bk= sQnJAIhw@Qd⬓&-r۶ ZStZ!No\xIxolw߿g_=ph/;;X+{wn=|;?Kê:yȁϟOfo<..D(Cy8Kr!-,XkO? o>5,!;;\/>8ʑ#d9K8 ; HK|G\e, }!cf ($%]Uq]CHsR5B ¥L&r'a۶EYʡdaoޝ,QIo 2XCȹRoƳ};In*Ŭ,< K./7g d2)*:+1'v +}R9gct:  ZK2WwZF,z/iI1m6ƨXr&ŋ-<ݽ6DB\]^DhF(kx:}qQYc'oq/GqK;{>t/9[ZT~buͷ~!.~S:F9|DTX7Ν;}Qa}Q7htZ(k0BQ1bΜHb9#a A` TAq0{bLh"-"@D|"VBbVILbEFXcFhۆYUAY+@M1Fs[z΀LƱC^{.=y|z_yGN9yǏחD/Ϟ]wo8/m+NspZQGSJ12i!Dc&u{eeGsáu"Hs:J_z}ag,(a9(*q"r!D:*2/^ t]7"uHԍa;:efI|[•M0ֺT2!HH GoxV&X-ǩjGw9Ϫ䥱1r"ƴ9oz*;ԞFœ˿^ qvo h8yf!4G$/Sh؟%9D W<79[S;bJmc@io@{1ڹbLbQr1FkDʲ!N&I4! JMz<MxP#1ekn >!Xc;F`Z׷<9\];[!4[7 "P, "b܋i+?yo?yb8i*bDͷy_@`EQ&qwΝͺQ UW?v /i)Jj1F91&eV̂/lC 9vG$+)5F bJ`]!'?ZJ)TJjWhc%"AH@&@2S\1zw<в"?x ! C k|p2@kcwΞ[ZXZtϮ]?Ǐ_9xܩ3^cmeh8 K9{_hOFwRΘ}뫫6~h(Hz߶"ڐPNSN/&Ç~~s!EBgqo2~o\qowǎ,ŌhL gbAYZ߈f ^ϔbA=5'FSJ)yIXw u.4eYLƓ̼< G)'cLy⣩SK,hqcI=NM"~M{ݷ_5F+SJ#QӚ&ֺmd }R{>%_ :az6.fns9W嬋1֓hZvb.s6wFk;Cfx. 'm"Xo4y/LjF,n P1O&z:15FHѲdXkm ")>zНOط0,P DrL :Pug~GÑ5p#_}Lauj0xyx4?}@ )#(x|kr&ksI[kc'G 5 ZpZhirNQu@[&FD]p%[0HQ%bմ+ g])bԚާή,I؍$46MS d΋HvS>ʩF׬>;}8{3^;9gmaݠ,ז/_> ^-rt.]_Y9:&,3wCm!ĐbJ,ܴ?v7O[\{VX?HO-3N(~]HJL;@#ְ,(%򎄧9JYge: &z{{Bfǎ߾qx|irn8=@$_=ݧϚ +P C b DF[߲=B}tZ[g, @bZSARJ9gv" ݨZoa#U{RyfEQ|Ƙi=5ƄB(d3*Ƙi!崷; R]_Njх7:w׿/>쓏G{ϟX_?wwꪄ6~`yaaaa֓'o8;(Kדm--,aǎ51=ޛL8AUh2!7%󸮛g΄(ćO?y6?AHr&$[JI^}/p!FP.)rIpV9TeL1u sN96Mk<_= B1%>#S{ t%Y,!gKr6}uj6yhK$=`Ҧ]a+4MNdBg,S0>"=Z{Ύ}L#b!pjGFqefܤOB!idO)9eAIk3"SV;f&[$҄m"jTB{(23 ^+HM! Pso۲,އ#1M$E Ǐ_썋-/+V1Tہqi=zˏwIw?K.n cZwg_؁B_>K7ny䣭*K|W8wL0cۄ(],V„3>IbHq9ucpeC`gA $LRԴms.$[145mJ.ْDξ^:g^k#SkmQm띵( DL}BL&)h$Fz>o\xdzBu/>~;sO'WUQztիVkJڝ;0\\=}-w>~4?Zxsf^sDZl6MQ;bgk>E=O:8 BI  'ia٤;C"& =t$'e5[)sF):$䆑st'm&-m]=5"ciݕ<*Kϙ|"G q`^(-'iYVx-[o"p8L)Yc3+l DZLHܦ_In/9~n<&K+JL~279㫯ш.B멘;ЦuYcڶ1`PEBιbӶ p+?5,o ;Zݽ=<77㽱P6M#"n4uqМ:rB2 =#H)|捇Ϟovv>r?Ϟڷl1)yk<7[o7-_ܾpp|߾_ +8rt',U$bz_} HaeJ9z/(,Q"S$PJО9sF-GZ QJ>rL'+}ӑtK"d2 f2jvr2ڈ<,2EƜp2ưb Y26?yL%1boڝ'쳽WVV7We?n^cm>yeWFΧwnkm--:sB充kAׯUZp:M@o.Fbt+ogO\Y.aISJYlɜ3wE{ʤ'ey]VPD ' CJY ĤHESFrȏ݈h&҈ZZ<6gN)ߩ{vy{Q') aA_Hp)KAc߯LBolr:JU 0SEkՠiZBK'fسXZ+*Y _^ܤϿ3/.. B'srn?|lJ e|;2f:%&ҠF KiE: U"W9Jz,8I\ijisfD%()%DZ0u/3͊SL'™%T!@G1MS6MeYfVD)'j0>i^D87SQ-[;|󯭮U6/]ɕ+ge^YrP++>rҲ 8ϟ<|wAjanҍVVbD7^pQ9Lb4n\eӧGU%_ĮWPY F Yb.-F" !uP QNHbL͙YYk !B!Mìuk,Ek%Q;I)}/"D◘soL=+Bug@V8S~MӈEZW%/}+Q`} +%XYlRg?J+97)-~̙45ucZO'5L)m؎!Gd-k q CLdlV1cHsSۏ'IsZc ii4nʉ#GGorr(N>t{ƽKUi*|G6}N@ê:r{?y<*WϽk˥~R9gf~폾b{gkEO 4SR0g5I|R)"KP̙HhqŔ!-1rF̎։RW Rl`EkBA۪FW.Y+I?KNBA#!&fOK1@_̞z o} 4i,@BP?dJDO>Nm8gD9ȝFT̩7 @R NSFr? :P1gsWtKSsӴ)h}BT8 `2ǹBeQƔ@"mL](WR A#=m̹i ˢpimB؜n֨XҥZZƺsNַD;YY\XY\bߋ$$ss83N޹ɥ˷o݈}oef|wgϽ~o[#tOV^SJMCHʲZT;oeQ5_pa4ZٷlenK[=:M, Al!hmIK<',5MZ#hD;&9!PZv|!kek5F˨`0Ҵ܌MLù89u_~t.^~~ƍ}+s#uMsɚP}+L!R9W:T7ic/ 7(P53(/VpqW/FJK[>|щ5@=u][杠¦i:Ll5a{2"jCJ)ԇi sNJȓ#R&cb3AkBdunZ5J9y%&ǔRYW*7Q٧U9\sL+̳0, J t7tz$hZ'N|/$yZuS7 Ï%yL/Ryd"J]$w #T;U!KY3JK!L:}J|m45((rUbk6ZzڴcFZIZk$&. `qMz! sɬmHDDaH1JG2U" sNF޸i֫KˇbLJp.ڕN=15KoL9?ܼtLlF e!Vu'O7Ο?7> >}_C pg! VW`Ds>y|6xCU_/Ͷsg-?xΝBضR0 Ġ(sI7cLQbk,%s"e&2 11eHhdmVir$qi" vww9g+IB W!RL{? Xu|I)WsW_yCbwk>|>;gyF&%]}hie:7Veuc"$@ ᣭ-n=~`csժ(W=~kg3g_;sFI=mZbf<ҕ۷Ǔ[Z+/t+d)O8X_d\,V+*gKJm{/bs H S5u>b 1uN%C@ڄsʜ1ATG%LK~}E$DHm;x`0j TYc47 "Vj}mm'?j *%o2r[̩cCh@>|R>;oӺknYVEmzd2J }E.Zl9eYQF,} 1S B*aD@wc?+|ާ>{ Dv$%%TR]}]Q/kOq]RQa" .DߜfN?̽QȌTQ188Hd 2Nk~mct֒D]ΓhכMq#qH;;`cnrŋϾo>*f:m:hlJݽ'[ǎ/,n'޽}|fzI}v/^xԱs3ӭDլQ_ݹ|}2c/HURNOϴ'&˯^NZND67:RIU~IܙJ*DtN'@N,j60yރbHLe&K:Sݞ !9/!0t.9 eoԚ?r3g,{w﫛ݽ˗rL("bdJΠGd4od:U3'2CK -ŋܹnΟXY<{[gϵ[Rimec3VG_ݸbu񥥼IVf'LR)r2Io"@ƕ֔ &BӅ)%|@1? ZʀnқðNBRfpj&眓JPCNGܸ9uxI:NRӐ3сp251 Akyݹ~趈lT_ٟQ"!ͷ-)b$tbLJjyc?"*Q4M"WV13*K⇔eEnk+; YPU:˲`PU*XgSO[Ǧ:mje۳s?'o;w`ff۝:qh)RI٭"gol"/`=!%9 WrR:j뤹@u6gJId AJ995MW˅ @w@kZ J+ $s,M/؟S]JŋeYB@ݦl8"cF҆҇?}eY]8Z,u#,Ac #2#R1d,2YUsz0Q"Izu0FJqwj,|9Z1$V3mWf&&,cv>'Ϟ<>?7jH/)phcO7}˻o-vVnORn 񂔔1ƉG.XYމ1i%ֿ_Huᅥ/33ȰN'yV5"bF;(BLDQ" cBR%HOlUYrq KBI&k-Q FTa@ԏV}c<8>&H*ȹ:37wKOؗ:b}Ꝼ__6;2;{ ^zһ?zoB˓S x榧я E"gޯnm?yJ)tzxW5ھAc(Z:bzYkw]}{8"! i>3^?SJ[X)!TA#O:cRҕYk-CqPQ&r.`AԨ)8wޑnK&dZ)Ĕ){ \)'aj >%lf>`w Ʃ>*Fi\7;Dz薊1Q*~㏍11p0+|8꛷5uȜ \k%1D1ҸBc!L E1:HIB1!$&D! (V4bBJ%f no387=5pDTarmqX_\2:%e?Z_o]{ɹ)4!K_U϶wΞw=8SJ67޺yÓbL66&x?#$qǎƓ'{{?fߧP-Dhq  O<{fmg@]gAJːH71>!#H3BJ'J)c#MTc$MJDÜ&3NiU[mn?x{}lq0=~7׾on߿?gOOsss<'COiB4Rǽ^LNybIKA$ĪZZmlm}uD(h<'ppѣv^y4ʪ*Hwc4å"&H jDRRJ!RJ !|X՚t_{ֻWo\_vE !P_ R3g>y?C[׮}wۛjw/YO~rw-o!1>ƪbmG>jsHM  KԴd{d<% 1!>H9O2Okm 4A%XrPHƔ.@2:t b=08ic|O?uVo@oq7/;svnnwqɉ{~.9޾p؅3g޺C&&EA+"TUxsW^!!%H<7eU."֋yeYyZO)F9!ֆYѤFH!{  )+ Ǹ1stc3BTHbR#Bk9Rq^_^&tҎ7Z:uU#c3t\R,z pc ,7Fbe/hlc%e8@Kr4!hF5qCCJŽb,ct[$e\UYbhu3FJJjh8&pTkI9jE&җTUi3Kd58Jk5 NXk] dlUJ T dn3d}ff*kIh, PURNOL>^yqŋN[x`ʌ>LT%8 GO8GxqnybJ[ߺ~`30d!~GϞ=8 b,/xYZKn~+yn驩݉ ngbjoNV#;1b3M!40F;|:8[C@ |(3у8ӺCLJH6W(3zb5={޸0?;@[._kW5ÇΞ:u魷9BBz/\tӗ/1 B ίHm榧Я^I9;5%zwV ԌR*)$2)cp439I/p\@8|I8<}BsGZq }kw[ݻy|DWHI>!s<sTq)*SYY0QR5]iژXu kc?:R xȭ&MQe#,T4autEb J@2%#Q?EDDy7 3413!Agu|m 4һ֬^|줔:[_^c1GL!s:"҈*  EQiAN))6b 䉢U8sV+Pʇ *ܺ*%$V"eY԰eŁENU|LqR9x%$L@pQ`0dO [|ɩ$pFd+ɲ RuIVk)';OtZ)br-kdm9ZX({ѽ<[&rkO )52xS'yon_}\y›o恹"s~xaauѣBITgzVā9psI ^kedVÇ;SQu s={~Ź9*JkQB%D),o?Z/V_-LOXX }%(0N )Rbq)Z7Xۭ7a cEQjy,v)F*< F񒯐1N|1FVUwR)#rƉG@ʲ";yH;L(E|?XRKk?!p4p.cB,<$4 EDz؄ UDC M.D DF1mJseQ~mZDǔʲ"~Y($!R&LfbJE2Z9窲J 3cf0!3J%T!z[kKuNii2Sץ>2{˲$( -ĘR菤RdJTRg;{񃇠ߤTȲ+kkd@#1Zp}o|w/-3 Bϟy;o.uZmIư>*SoOzX[Qg燣ՇWwvw67C~Yv`n N6S^]_-mg(ҋ&Șb<%E9ËTqH!|=ȁ#h36BȒ[;܁'N;CK7 T͗>~rnƍϞg8pviу8ŹnoJ[O_80rsw?MLz? 6G[J cdtv>x77omz34{MOL=vֹ~Fx?}kOVV .?Β'}IHQ>PKöUZ1(td #j儉HR)ׁ2d (K)E=u4J #&hI_NbD)H8#ْRP4)c ) jSY&hiZ$H^?ƂҸbpnK`TVR䤔"EI0JAjVL9& &*ELiL֤b ԖS Cɋ@^),˜Rӎ:DʜR@>RZK)h,Kg1k$9{cf1z!$)c !A+MIе qcq^sn4&&9cL^UU[@0&$ ?}pisճ++gJF%9Uܧ۹~4S Sbk^݋?x?c+ݻOLOqrVvwSVKv`8X쁐)`s8hşΨWoͽ|g'&֑Ç.wc ;;;G 81DANNzS@)2uN@/a;vud?,ڭcXֶv;w@s*uȌN!DyLJ__ML?{Jq$co>S[Cejmbo;oׇG3g/4,똒81R<?yΟ=3CXYUEђRQUzp3{΁>! `Bt2%ʒ1RD^N7=RBJHquBR„P*l:`--=0ZFl,29pΥs^v{AX kn2% ɹ(]JsDQ`!%!ކ% cd)&޻io/8NUUUiMG|RF:{DJ )O 9hy:sd@K=bJi<\_9ŵ3cL,˵VZ5F#)%!Hey-~iu՝`0 1/>K21(?6xuRhDeAJRkmQ0 [DGufœ'sJN8t`:QU1o=_{\JIz c֋ LW~VA#ס;!~rGcfh֦cΨNgwwwѣw>~ N927==ݛA߶B gTo16h01+hJ24;c Dd(mh}t:1au''ZVhI!~kkV{^/˦zlkCŰyȑ}r;8y;w囯<*aDt<}}V3gs_~M~!X8gJkrHrpvoi8(c8y)FUEM?w<^v^UU<8;jFp) nCmBS2~D+M101hqwvxeK)ўs(*bB @~1!ģT%1!EUSS.#Ck͹@LT̥X(cN7$ROr"gJd=^<4 :=Qsn9眻JD18`ww<Y0hvvv@dCGִ1#42y#*7NKx2Fr{Uƨ1$bfBx"^RoE hc>SRŹx@buʻJḱE' :"bd!c;ϳ*T{ ZiBa%&%m7ͬuqBs C 6z,7U4ۉV3&($5!c1U^Oi2CEQ$dU9*j;m9+jeVEq4B@[H7Jf0jBRj8(i2^ !ЦlUQƕg\6BR*ʀ&,2BI FcL( A1y 6UiVRF[g]N@{} X%M%F V4:."bP\RHFrdۤxcn{ʋ7Ϟ=039t*gx?"KʊG/_L55>>ϷvL !cDR,~5g"C&$(a RH,C0Q)#:`1s>ƠRJ!s!3C-TV.(DVDTXJA= q@68n1U>%eȗI~B G#n5S 1ưk:?| ?Cx٧|T;eQ{osbJO__~'^BhRۛ8{ > _;ro0l~8连pucg޾kWY[[[o{#Gjvњv]J=xpbf1)1e,ϗ}',C}UJbŐ0XUO[E>;.B)d!04Ryep4]Oimw}r `|y_}wwvO-.;l)[=x> CgMwh#bJVTG9ih2d6&K@y3NqL$& IF‰.CLUZ ,OIܭ)d &kchp4aMd/Uѥ|S?9V12!FD4sC>ziyM2ZJf;.X}13&S$nG^1&9{pBqq%E֏f^) 31[l~V3ctB@h\d ;blY#AhO&BH"ѐ(8E҅V+~n^}8 ﯕՅ .9*-zUUGy1uӝ{u('&s{''ONon~~/6QYU;)U֮mm-?vgy۟]no-NNP)Ele-!ݫ7947)pIC69gD&L"H]Ef;-tE9WJ#C΀PBr'5aBQ5HBQD3bKe>x!L9J1EE Q.bR2ƭtaBѤRdSs6C\sқWͤ&,V 5RQڀz5k'޾h !E9(% kBsN-vgDJ_"6w}~BȔ"uGUVUeA)Byn*ŀCBQV%pru%) SQ:*s6{! c2ZYVHUxb 2<';Ǐ|۷?}^!DV%rff7vW{|%q~qiA/VNͶJ)FU{j͋owжs{o[K=`Ot[%BhtͭyL< 2~7Woޘ;03sdqtn-9OYU[{k[㕕/_nlLh.'.]zc+)ig8?On޹}ȑۉ''N~NyIηׯ))VI!@LqTw?z#/,r!g-eUBdc9ˁrε6V!:b 1 )1l8:es@. fT$GzcJ >YYm*o2:[ 9P~&T5JGķC%q.9os8>GԒy5,`jqdlOv+A1E:Tq!}sռ9Ƶ<#wTv\̯q E L?Q6t$13Y{˲h5~ ((KIA!cND4F+R2Dҕ2tRCW(A5!gc!g@ = &mٽJkEm,>MQRSk;7>>~].DžICĽ^r Zy^FWW[3/D!oLYxkw.}?A/ ܉y흭~swwmkk}{֦.ě=ki>QCk[/o/?r{n?zxΝg++,_yaibp͋:E=phqqcmbĄm_lng&'U镫"+q&țcveggiZ)ܫur#TJq~̹qSZG<`kggyo?|05s+16gYzfM =btޓ'9: ,3<*K<9I9hcH9cLQNBN@]t>uL|J]χC\Rj)12 TYqλKKVB*ؔ |#9C$/-=9a}a*|y k{W)nw>g 9E૲dתqCA@1po 63566 Ha` DJ*^I)PJShcպrtq`BHJńJ딒w!8qjﭳ1Ʋ*G2ˌT2hk#WUNHKÔzJ!9)FmG7@NRJ8!D!D>ȁ\ZTR|u+9w.q`1Ot:RԇW ?Srӧ}uٓ'f5ͦ @Ѿt9cW_+vD{AD#GB~y)Th}cbqGN_Zrc'o\Z=0=3;9951mqө; GWVW76ַE!_jfm*%)߈흝<ÄU7o>;}a"['h q6Տ9?~>OzMv0SZi&{[ rBȬN$竫_x,"V2&<:CUUjcDl@Es T$گc\iMy*kR1}UDs9gRV>"Ą$'0V9G (&tɓCk͡6K)}T5z؜0Ji"7S<۔ZIy$ @h Z#o8fĔ@ @3k}1&3(%%ڎ1\\ZZ}MrD5XzHNɹ"4Zɿf&팒#SbwB#g/G%"2|(CN@)9e$C?,!A˲jI%R"g\*!c $!hR>fY.9H!Z4F^Q)M1F>8 V8is3^Y+> s1@*,'O?+W~yn33w5ZuL)eȄڪz80_~ʩY%`hk"T :X_X\z筋εΕ^ z=dz8<ff=q+EstrSKbL>R|mk{ϟ{o;279cDq >xL^:NCS!QJ&DL 9*&k2d9X*:2>TRc1> 4_Q>Q*(򯡻#%>rNirәŐΠ>P1yVeY245an\es)!e3nϤ"[4`FUX;DψubUB E轗U֋)$2k9QsN|#n FI$i,"JiU]Ǎ!ҾK l!EHa.s xB~V|8WIap!R%ohbdĔV!$ GZisNEoASYV1FgR&LI*'IZLpBHw WWoߑBfF>rTI',Y(`zb܉ۃ &X ar$"n]wÃK6F 2nw;OX8r拧BD\VSp4LF%Ǘ;kmĔlB۽Ui_67|8LLNF^ozb]Vh<3F %%:ΉVw,:ku_Y7ʔpT[k[[;gi[Ek~zzavnavf7mh͕G|d1rB+dOWיcǞOQҿ˲0V9~o<~_w} 8L3~ QUѲTԘGoܿ? N..?~!ƘrAJРU)R<#!0y[֠?"<BPZab>v 3m#\(xC!,7hMZ+!uR)dYZ)R2\ b Ɔ"0ʲ,K"Q–UJsIvW f#k 1"4z@1-Gǔ8D(ALD%e30kAJ3ZkC ٴ'i hֈ輧\?[;;e9R C>us.,dPZ]/^)˶6LJ~6ع1\}RR1:Ol_F7Oq/,$:k$H%SL>~YXE7Ę~N%y~;޺{xf#J*`8RƎ1pX4$LRs=#G,GR*R8p1f{g,+%ӚyZy/$HhqH']4!t !gR蘐 jDLŔ*%խ{QkmJ),?b$NiD?p Qs#CkADTM*;4W ِ1D&N骪e1YwfLr^h(Lt 7q% dlFP)/}ˁ+Ƙ@Yt &d )ؓ)F!%5t)MVYc)pL1< KE!F6%2*J,cLH>qƔ6*y8ț1TC s <ys~:@%ƨ^=:?wJQ?|#K{xSeL`fb?_ӟTC WܾrځV^mMfi'.i6iʹey`~΃V t;K %+^\*mee\aPvkkۛ)aBׇ)))ju:hc'ʕXe ams7~s:Eg}d3#0%UB)SjGR^"^-@NMy)1F+B,S7n7c&eLis{_~h|dњ} ZY-|ͷ~dwqGg۹!~7J!UuK)<~Ykw67LOҤĞGss4A޽ֹ1`emɳ3,y]J٭Qi'NR)J)B 3N=l(sݾ-\h>E3'_n\h%ĉ}v_|ўwiբ$`o,;<=gg?b-^:wҘC 6nhٳz`~wnj` +fudR0 \?jnEA^ :9p%B>b0B#bJ)Esϲ 88o} 'ObLQ*} !V11΄+8cB-wgٴִ;MCĘnD4!&bx|aTlJ!MBeZ@sYYWimĿ7)+ƒl›/25,5mk IMߊ5tOɖ&\c(R7ajvҳ"r ԋZ-4RyRerQJE@Ι;3΄JTJ 'gZRAHPUAMhއBYcZ )"9cEQyV[0Z"X+z]E@G 8S]<7ܸo?^g^ydL*|jwL+kݕk-tG{{1+G/K!|<ʼn .\81z #գ2?#G,kE՚vzٹi%ۭ^unF!;KN9zС ss 3SSSDv{\kJ[S?Y*w%b1y/C3d#'O ɹ\?us+^)TsQjU|p?X:p_a 4lJko?zrccaf©JJBʒބR<͵,/O[o8s!Dm29A/ vRZ)eYyK1 bZBXF)EmtնR~\eQFRJtBdYN?ŘҤ4F%( 9҄v&I当R罔J jPo>esdtfJC鏒`LPlԸB$}@vl7fԄsNIM@<ϪvO~ǜqX*[E;}fo~45,}Yu:` WjDFHPO酑Mƫ!c|ew{n+%Y(% \+M.-sy|Sb4+I(b <>ЉZDL,bG9'GŽ;PV%#!)vmD,9e4K%mU(T)(f!;T/4?1!1]VO9[JkxΜ1/"8zd_߸1"kC?tivrj_Yޫ<}zlfn$O?{_&EE~wQ dY?ٙ®BeJIZƒ(#!@J\i'8Knpq"%5^rA( ZkS1I)"eV0$6% c,=yoZȲYR4~'VK k~'Nḑ4>(y4:WcukuO#>99#VUU  p8b{B1g~ɖC#E`."6a$f%`|֌󎔌1}J2@댰JY)MJ!t8#\b)ulL xJZ9)Eۣ(o"z;_Y7i|λOmŒ`BH\JA CdrB𥭪*$18EęPZ慓 Ϟ}}G dlL?R8;/ڝw﬿z1/8cTu g\7GYO&Fj0z=)%gs O_ԳL 귑KMh<_ؐy9)jKq9ϟ>czyNu)a<ҡ&DPf!hcp8u{Y#!`̿N)cbHUU*%RbP"C@^DIzVKC<bUզskTYOeЇY.t1ƲLK(&$VS2!3TGk "zn1)QM݊1ٟ}i(on^~lsµpm>D4tΝ~=. 6}G篿X[[yN꫍nOIB"eT@[^Od66n>|wKKESWVUmcLrʷn~,KSsS&(XJJ 華lw1εVN$( s5elC)=WRqY1ƪ"P}.RbJvYs:DB މ1fG"${Ycf&ØKqNքh])o`iM~V us;w:I)sjg!dFIQ C4YD.s'/ )sFkԏFO 'Z`#Y?~'&x]h4$B,)!p漋1h42FyF1}DR*h9}HGB„ݤ۪1m#=Ѥ(˂U"2prRsN)3Jj( 7aftAFW!:RR6R9~}1'Uv1k-91Ʋw JKƹF1)]YsFeRTJzApaqjgWzJBVzx,+9V܋X8}=?xk_RJb´UV9OL[Lփkk<|kۋ <qc{ksk濝vgzj G[h)v9Q&U7|!nH 1n>aYǾ877??w*Rv1ں~N8ܿpġCgOZ(Ljwة9'rtرq\i*cJJ))+߻qѹ Zi*VOp"%B 2M~RDιV9FFӪs0xSL  79c d-J*u;GU>LH;0E8JJ!W1ChBڝp!BL4*@F'/W;eT)6ޛxj*D 卺X@=**/aQޥympHI84DeA@J90Ҍƿ7ߙx9GF&OƥDRsY3!䗗w?;NyyR*D]rmKH) b %kAHȨKȐsCR;nPNq1AR֒ht!HaqN羐| >Bb✓my9R:b)u~WO_rLI邯)hşOhC9Vz|bj,]7wvJgZ9c0Y7z>ג[wgkmZV`1.Ͽ,ͭMYOR{!pB ZD)١-(cֶwQ1ַs0'$lzurxmųg:flxv11%4\DҊh%cR)%hY\9kcxEH>Cx{J:騤 ƸVJS1O>{ p8 !*ZET!xrLOOOzy^`r \m)YӶW |8MMMUlbM }yxJ)C!ЀY_ v !%p8 1J)"輋1i%L ;.IM9+Zǐ)%M1YQdmKaBruXkcǡ~R׉!FJGDt T;kÙNwN8>?᣿'/^6zh?++U{Rj3?=Ѱ,3!03 @`gR2gf_WgZlJ\r:3>pСCKKF+2!拵_cSo]DÅ5Sһ=kO>_!ݝڔpPPRmm^~;[ӝх%1(2Z8ёOW :Lq8yTh4 !0CHJ4ᬬugԅLTqŸ31Ek-̀hB&L11!&m8$$BR)5:s>Fk)V:1,:Ǟg$8k1eJ)21QYRJrDqDa9_gBZk+뜑ꍣNO}wί$"" 1TNOL9~cnow0LSGc Jk?~bheR, cV=-^Kʑ abj$;}Ύuy\圧bGgfhJ/9~?jG'3}ճW/:zzY1*Q !J?Ax?J:LsO8uم9?RJ2m*,?o}ګGsnXdcY׳C u:9#&62՞|Sl685]7a}F!Dk rH +9p&qdrR !|$”sZ+fG٭;KYv$ cCΧ5^t.8(ݗ\`͸7cU텰#^zwN=[[`cO|SӦ77E $c4Db5;ᢹi/7!''t]٪,1a "[Ҋ=d%5aR BYk$ج2r.H) HbfW}1%ΘVZ!fHyߌs$g̚A QˠX3|$2ˋ,s۷廏tQYa娪EqCTn0BBc c1'&O_미FS,9йÇ;~bgv6J!c!<biqȲL=̈́ȵ;0rgc eY2cJcDhŐqFU?n3!B[^ݧ!b !BH%|?zxBǿܘ N,bD#sB{ĸ)%}i+ZR_^ٕo7&&=B etkcDg]1aDžPJƐRL!;1Q18gFdXUj&N>1%ZK6UY\D2F󃈊E(տ}aS)ű52˘Ҏ)w:霫* V3@YVh08}p !1{cDc(h zJ}cE !ſ4q.cDΘx K-(xt!hHJA&E"#9/\u++娊)r)MnR hRV"ژ,.h2h CѨ2XJkV(Y :pXU֘qFuR& 2"Cрs&, cEQQi!SՇgO\{wgo!}1c3h>>ieU?6ww}seDO )h31"$9?{`nkkOOL|p PV,c6sF~/'Ko=rBL8d?ſ|ͷuNSooߺ𡭪SgRRE6㨔*Z-ը,T1ƂE@3SJM<.lec&3J)j@Q "\JrcRI*B!xj/k:XNջZcR[Bc, {8'L(eS艀񍼙Ӊ_Hu3=RBdHr^Ƙscn))x/t;R  9>|8(*p0BNosss84FC*%Wdz ceYCfȕcqFkɹ ܈!@`)M6(,t;RԒVHUU8p (E3.JzY%L @HjZ*4!h60$@ GDt:gw DŽk3QhC@ ɲ#(5=4H'% rӋݽwWݻ7:E pWՒmkY'?o?iupMkI6V޸wggZdY'?X8oO鋕G)<]TkǹT;ol+Τt^kE~GQIp0ؿJ8 c>ٝjnw;>]Xi!ī/߿{eu. 4Lf1_\'M}bafGC.uz!RQߔ87ZWz7n|`0>491aLlƑREeeS1ESd 1VeT'C1ŔJ0iRbJƘ2&Rpz2dP3β,395֭V.RR8@V|JIi ޓMH"j%X&w@ѕjbH.:}J6%*I? bei# a1s1?z4CQeY=vfZdhRy.~GC(3޻@AAp}}/hrrZ:ǢȘ!P*VZY kb OB1m'M={n;-35ED)Vژ;KfY9{RGNi휫}R,8)=t8UUi Hd@c@dƘiׄ&6cXeAu 1@k- $Q)AbZ1Xu$#S*v;tJ8BiU(Tlr^pNvuhahʋnś`@MgrqftDqZ]߽t}^67Ru:N|hrs=_yhqb8K1mF3qa?靽7kLZnYv&&ϟ:i#Ef1MOMǺ,Xڼ~$0 2R@#G}VO[q##0 ׂ(n+/~ ~ jZTȘu·_^ƃ;;>xD!l"6ғE0d;ksJ錒sbB j\Ƥ)F"$Db,-4UbB&#c)q:ؾJ7Bȋ"R·|8Rwu@Y3Ξ<ܻ?oR&?H(oYЍ9ɇ!e[˶&ޙιnGkN-dMV1:ĮUJlNN^9&+x8Yg9h,Z,ˌZ`0deYNԔ*e<"tjՊZP֚0vk0"qL JbaqLXU%mcJi3J" \U!p1)%6;85xZE)*%SB֨:TZJz/ʳ^8WR-$ x?M)}}ƭ[7LMgY+sΞ?w~̱;77nѰs!N̾u~:knWB0;iw.9 Ko N~LEEJ)WzP(aVQ}(ye]L cB%0;MMNv1 81޼[o?dh YTۻwy{w[J=0wa rR҆1B1Fd5BƘRJ*EeR2Đ`R,7ZgL潧qdBJ)D/u Pb3 aNV#֚z͛J+k]^JSL>D1 !ӧ`{Qr n&s_ɝSx7Mj4YFmSޝ:f6yUFZ*ce+azzޗr*!FZ K^16 9gQioQoJDthOowv>1dGPema @lQrN[>Y5ܦ4CJ>=d fZ[UU 1/2΁\p)(VyM)9w S/*HW)eoEg C8-"WJLIJEң(֌1'RB'LLH8K S!r4*2D}uf ExZRƄ )\'RJkBṙW޽sT)ձ,Ǣ/\ϯo,ZzwW={rxjQr c+΅ S>_{=@L~O 7޳y!"N܎}B(%8,{>¼_v:s3j UtUk>w ssS^jPη^vuU(#`q7N1(gbo0U:STRr6o=z+ɥ|SmH6B zCDL;)"|JK 2R)ќZ^Qv6EU?pRQ/kN.H΁2pM A_7QvI1\|}򤔪ikٲyR"kRu)"pFhXU6h@ !$2TUwŘZ֚BH|yEwvȇC/z)=D?u)v $ݩfFjjg_WLYe;罷z煔:k16ɹM1jmE)DZV@c-HEtV!Ƅ s>B@;$m&Ćj]FS8zm|A!D1u]^_HE! G]?hD?ˍ_MOMzyB4$JzJ@T2vX5(1$Akc`zƘ$4 @JQU&QI#HBTLRq.RgL1=~jeu5?sQFk=YaRy$C_&d'ۻz٩vl1@<Ĵ6}Αݺż7Ej>soW[sVk?_evu QRRZYKhd+g-B );I‘ROs;;;~DPE-}{7,K`(&G3 q;vg3 &e:25/>[uީyc=[~g.-eUܟš$ӗ/qÇ+^Mt:*r3h3,j炱U&sཏD&DWH)TJ=^*AjKl%p`BR(`!qF|!C!@dy$MB "c`f,G3RI+k翈1wf>{dk =$bpX敜GES xKԔzޙS>0ƪje e9.V[)k,E9̲,'{a6F#dY^䶲Rn+U}VUUqѵLLY N45,$疢a4V5rfIQi:Qʦ=vSA*E ʄRWb #"D2c9)ոg(^EuA6`b%NQ)śSMH75dWvȲVK!S+)2c| bnVX1!a:ZO}oVL/Jv\Ja>~H߸p;;_^6SԞ{ss1[~r2CEnV{?/d8*zū!J)9@a(ĉɩ33{oC 8ba嫥f̌o\ya 9#y^Ytu՘lJyc{ѳg?)YX8}(JƔsᰴD8Geyɓ/}[[ۋSΞ1RLV H1} b d[+e>jKJPZ ӳ#HD8vENYS*rR"*kH I Q9JSLnXg ʎ`H jHi_Z5CO_^1oVl`hDȧe'cTXCF*IY6sɉ7cto^9v㽉5窔t%Ӛ))4Ph@QyHԼ"c)˔“rn92RmHD,R9y|h 9mbBE}Z[U(%q/ >DR8Fg 1Y;Z ! ֹ"gLH*{ǹ 'QY0%LGDΡΊR!i)Mw[[feSӭivY@OoJpt7Νx>?;;_]c A1Ju"$={zsv`1FQ}$-cA~zif> )D”8 O=XBvCS.hvD\KrcgG1s^)%MDQ)T!W=ٹOywavNEe8 @J򋕿뫷oYV JD5\ jr]z:IgD*%iyFJSv"U1bH)98g4Od8R@ qR*<2 =VFǧ$RS*˜sBȴ̮^[̲#EQH-a_L }|BR GvD4~<%!x{Bw12!vmXy^hmwvvvvZbgg:imgvމag (PdE--Paqß=#huMD"yDa.|39gwXkT(@0*@܋̓{pzvmumǵ`ZRA%!^n6ժVDE_k >*W??I nk635"fNoS2 F+"Y$=̧޶Aəfd1L,Tֆ3V˕dM)ޕRi6!ψު 31 M(7P&6S~K-;גSJ01 e"}tNfZ *e~X-=]*,8b! ޹lTZm:d܍{w~ D޹鷩2&o +|w?Ia*M%2|tv[oeX?/9>2޺!ow2ZO>ĔR;_fG?oC,}V}ͯY`|N\ycw}]st?̙1kQ&xo?ɧ7ONλ_E4CMc2lG5}O?M+~+F,)윷~ l &AY$ %2ØR8t>1$*PJ6 )?"H["Q57/N۲j<5;NVfnۦm:"db)%H΍P #\y ~EV<3ei@Du~cnNXC6ae$@9&ev "X/))vs*%+HբPYBp[;4ǘru!=捰˥F}30Yr.f9P@"`MB4uByK I&TkE)"m[>/~L(G ފmx+ݸ(|j@Ɣ޹ҭo~v}kܐ޹Z_ÃǏ^b˵ZP?B0Mc&(m%v>C6c@'w_OW_KclH?G%9>FĻw4e]hw9fc|CQ6 9e;M<f&^kE| ~PfC]!7-UZevi0ų~+Ðڶ!K:,Ɣp}ۃNظ0*dDRzDXj K.EDCp7G{۶0\r _,qn#o27i~7 {B>D&rMIg/6j4S$*0¢ HE5c[ܯ_󋋋/^XRPj tSZ9H;Gk:ur&|9ՒK.z֝/%#DMEtLi_ C! MsG_ݐw^W ʤgG_bݺ:>ٽxnGs $RDVǧ^V4{U5_J}qyŋg/.=;sz04rekzU+1 ATU$ZVhrUXD3"um$ba"@DFke̹2kEyr6;q)UYUTCfˎk>^ggܞΧV$b{Eus|&g#Kd7m-&Yd`~0o~@urZ]:: ;fڮk{+@7-sFw3z>ZblRvt.5RnvZj9,~#G$TPj^ /*a:"o\2ǰh[rWglQh|\0:GkJ@DE|SBaUԢUJaoU8ﻶM@sNW"ZyTѶ,XwaQQQuޙ9D${-f>6$! Hq΁*s5A0Nbo?/~}z46Ee?ܷm>__evER)mg#o2:PQjo'rwu,Z/#"z{g'_VՇOպ Rk,o_p!sD5*$69WEt]{u?~{K4"l{w|`FfND3W@0;A&ϗLPKakͷ唙#b4sߏ>8fvލ^m1`^R=zx歓~GnJ1raOvʙZoӴ–6 0qlhirr ¢&Y4LmiGUrf4tAh2 ޕK)!xZ-6Cps7m{ZV{6Pk>ia c1 91~l)!j#bS/&y#Ke,w!\mr~n'rR m30 <nJJv#չ0?Z={ݟϾݏxj vO^<!eۿ''Ƿ}0{aXqgO~'}7-m7 K?H0} 1DMKvYB„s23vm"08c)_߷7J6ȁ@@9~ׇl6 nz:Abƭ';Y_[j!%{\j)|_꣏^\W^+PJv[`h <D67ej)@rޓs9'"luaKsf(XV\)B Պ}y1푳skBG a"0 8̿i>}xڮsγ([aZt_,>+/4'`E4A<&<}_Cέraa'^~4, /r1#sNOڦ7orjJC)y4#;U8mD"BpUHjnlmA՚e7l=>sy[u[N0(qh'EG[WvNm&l|U*1e;F aB"&m6cl90U414DXtֺ*(:gdå#Q1FZJk[qqe0)ުmfK@YgZXw}˫?hǏ;wo43mۋH𾉱mi;b>x᯾wjo0 8l~{yؿ=WU\6w͗ۍӧO TV⤈/aL)C!6X{Tnqhfα~Ǐ\mNOѯ;/B𥲈Z*C?x^0uއ]N1ݳS{D7ګ_{_yayn؟Zj5O{?78`G@@0pSl` ʬ"UkRNfr5K9TJTMfFHēL !q*DB)҂EZg+:C蝷Rm"(( Z6 ɬTYLb\{Ym!aijWU+ν,cDȈX +IQ4ZT4ڶd}hEKzC55M̹2̑w_m6D.h#m~ɵ:rØ*לse^4R0Y9'tg$ٲ8]H4dm[Dln3{g>'RZsmڷཫm۫%3LjM 7_qC;Q%S%Y: s褦D! hNr ~s%猓f5IJ{>0nTaBbdB?fwQf#J.M#{܍/./^\l=:Z,nܐү??I.^UK Hgio~)he~~~J,l\E]\0 `U0;QRϞ_^;|ArXTm!T~{n]%jǁɅ.ߺTU=t'7_3qj"C(<}}gIo^:^-yNZ[)"&@DPCd H޻̕rD*INO9rN‹E0Ku4,J!`ax N-ɽV6081D S\5 ZE*]x!xC1m;ELsDլVN\9 fdnͤvkѾ&/sPnU& Z$dem\*xXk\)%$q",yO!0\D4#"yp6!GZ-mʜҸ fnk,9D_k4̈4ߓƺCa_ n'b{GdHz[ e*j*~睷Y>yi8uJ>:(Kb(8ɢ"qr䜺 !8% 3!}ot KADl`݃,=Lbє )'C28l EQ<09;WGGoӧ>|}ٲyOX+{|9kƎӣ7_|峋og~Sm"_|?4޼rUcb921ߺukX|͘gO{cB·_ҍrjx/»aWf};cm۴EL9BݹyƆr+\Og'jf臧eKjO_}9JNSX)Z _׿~py {y4%jȵ"gh%"s"\YŽs!`2s86mw{ !"#3i@l B,p)ȱ0)Hrulc"̋¬G"}P.b. nٙ֋sk7n$3f*W(Sg67[k-< ;sR۶yVi3E[pJYՔK\p|J#[.W}B f9)m3)ȍcZW2:`s͐%!eYRd#Yo*զs$`>PJLHCl[PY[.8b •yD qa?1$"Uc6ԊKi4`L@ &s 1H%0Edz[&V}ߗRqT5j9R'\l%l3ՍDۼOTuѶշ?v{;s^[!h%mͯ7o~Km "qZahi"=}vWmW%05_. @TSIqj_6rjQAO"؍×]^.+] oܺ't+wV =/ßlo~_?}套 zRW}o,|ˏ>:8BZ/,R{ש>&RR.;f6ReL(oDĆŢErJ!7N)i64z"0 ~0JU\KArdHd\EaD,8̈́Z'\r6v##E? p,٩m6%en`I!Vv NcXᒒ9%͓C!Rpv˜Njs@«Q Z?Z/Ufss.;c"JQLN"Un|9mRDqlbR̢u0S0Yw<Ǟ]Hs0֦FvmD<߮x;VBuf]GS՜%[s/; ff)l]N(v3WuDfHDYmZ !8VQV&皦1Du/,84bP%B*5BU(@iCwnۛ09"*T\eɌI>h֛nz~j{7~jƆv՚>{f#!<{?ɣ_{_S~2\׿HRkm褵?&$Oa m|IPy=KU|l GMsm/gG_ ݾy'?"*6a!O~ۿRѣ?}'/ݸOwq 2 j;ǜl~ᇟ>|㰻s|woZTDKai,[BDXب f;iɦ,ƚ@0G*^]m_4-p"baLBGj.GDD,`2,6ؙbOT-R>빽d11aeBJfʬΙX@"fjg-S:c;mxUyymƉf5شSQr٬VKDnΑsbKN="U㧱i~\ U70@)''SqZ\nQr9gn4u= E5ƙspY%*s@!6s{fs݀h=03\JDk["R'S֊)B  fnbI" µL" 4ƨ֢I! %ɕ93qfQ "RJ9D"m&ž0I&0-]Dv7<{=;l޸櫯4iET^iɍx>{KnV&vD2뢺;ZTGϞ={g" `]XЕyH#"+(sG1e&4n*f#9XДss^+ݣ}7|g_;oq2RRΩd#W4/@Hø^}?޽}ޝr,6/Y.mjش fR%3q)u:A gK$KdBn۶cn'*]kf5Ew[YjS;{E`׀#IK-dETcD<9]Xs[Ul<ƠK!G 68r â FUm4iTbNDjea@ctޏ)eٙ)eLeWM4mSJ~s999198+R=#1c2qvIs}s4gggU-Rb_¼蜛9aƚm^? vNuD~Bg a8rfXv0R1&֚awѮc>Z1&&z1vUiVN)TT۶0'JmD5gW<jQ @Ԣ"1F j9Kiw"}m=lBgx'_0!:ur 1Ncr4rΥ -Yb[bts4X5R=;Q*%GU<ree["H @<-Q 3k۶)&r-D STlY h^;' ó~Ȍ.|?ܪX!n\mK)mڨ&DXrcíiiOSoy{uB8::v΋Ԯk }n;>::9>y\./^l6f)"bӴ1Fr.KPQf}Vl7a"s%D BuRd?؅ALM ,X$FAASZD.  l1o!ژzUӈ"9R(w vP(Eb)r8kmy#\=m>"S`yXɑFyH Mu5t޴·~:gZƔB\stzO~n{''>4!Zdyt;k+lvϵmqUu)SBu/ Iًw {e5XKy-G˾NS/ w)aPӧaX]C[5鬒M4 **nH&}/~O޼_^}k_&s`6r5ٳ_}~GϞo6U|W璘!F7w@UAM :Rw>c<pwBDmT–Tld ̂ (oVT_.؇]u}Rv;\BB`%r1ͥ ,h Es༓r.Z~FQ+|!YʵjQ;)%G]m;=JJi&_8#!R6]@imےtN3ވ2}ϳhb9,gUdv|XL`ʢ"l$Œ0pDDV!o, JeE.%T _ ȕ"qk8)geʥ#\rMg;<*6(7DbKY%bYaBY"e(SεdC9 !㝻sr⣏?ZjX7ʽ{[$LRb ~7 kt,mwb۾O<>],zX;Py?9r/>yqqIʎHTj޻8q`/./Kjvzpx/_ |&ĶT}嗞 ]tns5M *9#ĀL^'^y7^y{/} ~4yGD< ow}'_|у}{oy>޹al5c삦#B[4/lb/C416#2^!$Uu.8R9bQf&$ղ-0L28%,F@V"MkaUlPQr@b`tD@f*1g<.5䑍wpz}?M<ʬfU7k@ͩtsٻCpޕRyϷmXjH+kDM7n],(yUoEgZJQbwJ)ԞoWM۴EL4 rlXg[qs!Nlv8Pm\gwg3}ބ"Y)@1}=ش䜊 à!2!!m bmf~SJdsS}m6a9fQD$hGAn':K{"WRj eo #ETr䃳M\;y1V.9C *EΞ|'㋋7|zUrĴ1%l뻁ZԾϞ?;^,"̪?\V~7b+^0-r޹ /._u^I.fsXx^=<30ĈRn?|'޻y?ak)DNAJb.o^{o3&$9^>z/Gmot#~޽Zk9M-yRsٷE2#9k-V@":[SP-DsM.uεm7{MdSK@Dsrn,clڈR;–6e.Fci㤢rq6@Ŋp6t-}J-DP=R HrV3` a9cǪL?L s2 V;\}! ø Xt]Pi`0a[Ecl6OcQEamJ~wrTj)ݓ#<rkӵC5cNi#99wc>l?5Y"91}g?߶)oj8Dg?u#3CUq7]}V\VzjX2ZS2~T˳l|O>6ۭx{gFQ Z=mlpMDTQ18'YGf BR*Zj*VQDea* @%п!ziD !0xBaBHDD{ qb\+ zD-ƑSU+УG$!bYDr]q~GtRb+Cgզmwq\6DƳ2~M1{DGEhEoJ 72bJ){43b16mc۶펙ǡzuuclvtk6<s=.q.14zwjӓAxhðnf UE&@>sks4C`:纮R~MybTa+K iSjێ1(XsABj|۵n~3K]^WH537m!nccRR jc-^4u f0D6MVCT(f XJJ'ϟ/.y +m̓'_r]ۚ69Rw޺uןrRZ6j+߃su~_|јFRwBDS*̵i[(kQM9;Gֹq{C@BKpԴal[_- &0YS H>P# W/J]ׇ, KMq4"z&(yn,VG*7 },RLfAB)0XJQ Fk9H`{GfD9"p_ bǎcJ)5M\,:SÐs18 n+ܺuiO>tXm,a|ƇشMu~?;wTu>}wj9J9ĕɈ>Bg?ä4DR?~UăxB{ŗ)眳`)ojk;Lo# ^Hrf%$ HD]׎bpΥqTmC n"\kx`B4M)bwmw0G\!lPf&턕e>Lxgk{|iƶmrHeRj.7CӉjH;X_/./ÇoU6(SWn|iB!GsGouF~~2Ĉg}_wVj/ßjapM: !n+M?-r#\51%3M?@O\UV,(V/oܸq؏f_|m'Mݹҝpۦn_؏InƜ) k]ol|yyу9ݹ}ؓFFYL!,bDy! 萜B0JSʕ}pWgs6G y?v?y?Ar(<}z[ j`-a9@8^.a|?83clqc.Jп ͦngw@-iq#;Wÿ}Kу/6Ϟ?ٳ#.NOnlo~orFL轋GϞ>Sa~Q!jް63CU|0ZPe@$sMC)g P"7YL48Hy;1=l8vs2ư\1\N932"ΛE4۫+i'O\n.chUӶl+( pvvvql.UEþ_tnݬhw>DP6TE{$(׾ eB0G(瘘>Nc) { C6.DD iZ@8&9{B!:WWDZFT[wy vmD4 # dCb:VѥMmB $7Yчr.1ro|O>h~/b#$ P{؉X}7~M3~?_^<؎沬|trD9b{"U~'~&Gd0M ffc#|Syqq%#aPU*Q͓6~/{ɋwo}ыe#Xo8{筷ܺ5s)VK2rɱyR?|~O?s7VuSDSD`aFTE:4*j<YʘM}~\*4M4wT l72Ðxu])e:Ct`qRgH08MK;?_Ŭ29`vesQdRנUًURU5L)a>l-řM2s8 ϙRb, }ׅyRr޺RrlB-u&%h~gђ x@:=1{S1O Ezqqytb1Ɔs"fubt!$\uq )-y@ ;dqEټHwHnاBӶz>m8·reFU9眬2mNm9j PYbxQ(~b-hg6ۗy2-TyErZ?.dkvO|41- !xzgx'>ѣ_~çg?}+_߽yvf)1!6O0}rJNN`Fe^^~֭x)gC짽w/ߺRV)ǜ+~{?sj%ap"n_~ͻwQ.&RY$xB0uzrI{㍯ճ^qr,K+61XoaPYD\\|~уO?Zo[G5IY-bCieYa,1IteHaVBȹR2q<ƦI(:MiC<]]mCp Pz۶~wޛXCF{dP1u}'"9yLD1tB25䃷Q!$Db(egTf";f.M1%a)ZØ^扷[;g\B8Dd Bp3ak&9}%R]JDo& M4iڽr릊dRv11__[򽛷Vˮm}U?{_==fGH4\\׋xo۾$a+Ui~%yo>iώ!0z&#)E =?ۿbae{92 8 dR٦XGDtClsJ:~;"fS0XR-̥vmۦGq?9aMTztt )%DDiZca adjmA;[Gzqqi):k֫5y j9 cSlnkbu b!D ڶ;=qE)Z+΃ eCۯ|p\fNi2D;f=9rd_Y Tg,I}ToRJi,v{skw8re a(KUrM<ƨTm;DHi4P>m\ \&jy{-MҖaNRVaBWc [xxc4CJ)8H%b4B,,Xl(whjcu/ߏs}{}٭G/.7Noݿs >R,tƜb{,gfK˾#/|NNsO=aJV}/Ty?Ӌˣk[nלϖr)R!6B"ŒMwNO7qrba71m6r 0nﻞ}XZ?.߿}v#[SmoRmYk-dZ|sٳO<~/n~;ˮ&"M1$"1І3_PXLTjU8gqiV voٿ;J9*D΍THdeD\.&.Wa4z 9 gEP%D#<0;WK"Wjf@Y}{OsR B^UX**䐙 жY^YLlZ PwEWkUl1Z?6n9r cC2G`,LJEtn_oVPclYXjSzbcAl۶1ٸĄyZbQU93֥ XA%o-Gc!Ab;"Y=8QHD :% )%})g jY^EUr["C"VS)]uVDýmA)垫lzmQИbXEEuʵ'o)d݀#Y)Dyo?/%c@H>xbM+*W&;Qrލ޹ǟ?lb<=>ok޹'uí\kM (wM{Xz}^zMyvq>>}~qŋ'ϟnR4Z~&*Lh.,7^yF,爸bcBm .7Eߝǫz ӹNJ}()PMshH%nF>|ϾxrFe۾~es2>caʂ6o,:]ZZdLt_lAsΓ: c6޻qR3ъۦi&Kcclz"L)29uiiZD4l)֮j.ĦiDtf}PXt{ED7iU9֥<$Ht wu%f:&a/3z6$5kb\u_I;b)%:IRDM؎ֳuL-d3K]{uUY˥H (ݎL״MΙ{KQPpMӺo1i]kq}tC@ngjKZ1`+Dy1~LR!X%ڗǕs圽h?m-K\]9mۆH̥T%#ԾXHe 4`sk'B8\ȗa5ͻ:۞Wq>fG̶$`F rB4vo9!'6nS62Zn؃WJr wR8&6KCVaXl6~AmӐ7L̎s"sO|pӦ۰3uFd&bnVVH /-(Ry%`cz~Eo#)JEpXR `hT/K)rr)2cMQmw8{7۶qZ~?41t}@ƜsJZs@\syUMQX&ɚ|J)u%% HDTsqN0(( l jN4D!T`@(xު\Sʏ_{v_nk/ݻ7NOuu?v8"ӒrEmDm޼Y(ӸRjCm(4 +Ww\Mcp:KB6rpmw뎜3A[`z:R'$ \ !510~G>ѳg/·qlt/RmjԶ]5IFγ ՙji^FkqTsl&FVhu{Hq4; R:E5C4qUe-lhI;޹`"1sV^,M ƥVTf<'EqlsXb?}"J)8Wm6:G+ )AӘ{BtZM*.@)fG!̪lAyݿocYjhUmP|NHHJ!4\ه+~υͷ|<|p1K1ꞅRٹl8h6:Ș?Ul$3M&D<j27,jgX)ֶk=o2g9'*6D9]xu%Bj`񦉖R-[άp :q/ȑ)UTdJXR 9oz0)>cyz*ל's4e^sc@6MK])Ԋ83'02kj6(DTtlc^.)(!B`!V`3y>{~Ӿӯܻwv|^.޸yv||Zy~K}_փ%bh⇞,&.7L2m6x&Φo`6F6:,3ՔWfP:e,Mj}qyqyų>|~qDܽ48 l!JA*RjADUQN O)MHi$k.C̕kLm *s "ry#"S0SmĶm;s j!@T}lH1Bԑ#)hDιcŀDԵ|!il\j-uJ8i;**%B VΦ%pר2XȈaa:x<#hҁSH{wR"|yyZiԲXvEjGCPՒSyZ3W\;wVf#"6ڽ;f?JIx_}z VF!تp %bAch75|roD^@h!wWf5v:NGBaR^l.Pkht#ӷdX0"SՖkk :'4ZkԎ4F׿<߿~_͛޽wnmKi55[YB!e%ِxy>=ήDğv_?dWRd[%2j=DGD4>=?Og D]!r1Z+-EɹmaHKeιJuq:G* Et)+ "Py)*S*` H^eWuuSv Be*55M<!ܴm)uXưa}E-cV01ju@fr&(=6McZ!URd]<sΉC{,YęQ&G3ٸհdz_U0(ϝٺEPknPkmbK],eJi)b0@P8L0׷nlibӴycKRDbl n Um"*hmcVivõ4"LTD1{DJ;f/ClgDD4^lj&€zaU >1l)bcbD~sHQU/v]}|XJ=D%B%*6%Vm%G̒d<";C0ۖj(lDη+2,V@tKRKe/*^Ω[!Ռd!r"Ld3.61ɐ0 s"̹~KU" [n޺yrџ~O?ӧ}z}vt|zZ,6ˆ\s4Bt0 &.6{сc"<0gN;qD6!8ۂpEGT"EQ Ɣ.'/?yf~Zzj1QAXx5M9R˥]׵SJoRji?*-l˦y"hY5NMu9Ƣ]]V1-VuC/\ku߷MF>Y@ltuCPrc & !ȈH>81m.XXvb;)SW"ّm;!x^36QXTkuX<@2cӶZ7:0l@7g@eDk5'M%+"paf })%@AEs)8Xx^85nն{# :r}hR?@Uru\۶}߃ ۶]6QDmSIqjU& !mf+MA刊Hܞٚ4`qhozz\9;;ZV}^Nˣղk Yh; E CBDaLg˘Vf1)CwD̟훔s{8+,Cȥ]?n7/.W;wwnz'E* MZʶqcoL9甓s mEs@yC ،gq-I[@5b4_~b+2xiۉj0ُSf#Gm f6jsN{|tԄK&-[#s, c)ڥĮJm: hL#V{sEygd(0jHDJ!x缽&`eMJYoEgķ z`2溼e*"8ó:U´Ϸj,pttD*n\.-Ȍ{}pWuӧd\gd>G*!BX,#cXVu!Cv!r,Z2y8c{m,u !2#X83hC12gyL5"9pav'a-*='8# w;UXp~!y>{:{g-ik'fb C-6Å݄6s !iZcBi,r_&Btmg Z#Gv 0v "䒃SB" Ej"",`GA&w:E[K9ޗjfLH"ZKmxWn!ß,Wv\޹qʑ;^AD#5'- }G4{xJ$X-dZ1NPK5?nR.Cvͳ?~~q18G.vD7^{ef\mfA"k"=v]˕OϟmٻFɡ.@M(U{牰.R`! DnAy;Շ`$5*Zf&J)eǮLv-"JQ\1\1Y9TK 1"8&#kcSyV8"q,ѕRs"s5+W iTVSܫ0Q;oj)AdF75. g%dSE yANa w#wǔk)RkɥDdZ=_Q۶M9G"YTnD~/"ϟKڶ1idn_k֜GGX,4*}#R@C ²^ke"}ˆ/s,5Jg뭛~MzPf,V!L+%dRju]L+@hΆ9qH>x蜷b۶%Rr9T䜣r)Ѷ1RUzaD%GZL\%+\->dYS`dA7 z9ƘUi`2 \є)ل s/]ząs2n-uе-B$$bM !Ce{׶!B9BuvRnFP`(m/..q룣a6E(jClu^XUD7HMQk0 =Qe޳(n9Lȳ4ks9g#/R 12mL#":*Cf1eaKV+-\oFz< åBBDCojH;<5mD9~',0X,'e*Lb2c#")8r J"VYT}9K2zgLhtK1(# ZZخab RjuoV8窺Z-͛a6I!UԶJqF";gY0 `lUq&ֹCowfQ5п Y$\ (&+uV R&碬1y` schS2C:s.tp+.qZa%daI)m릥"~TAmR悠8gkJk-~aP' $H0Dm MNDёLd 0" ja^J;{Y4XKI9qlF2?YCGF۱ (zicZ֊}.=f! Αkok"?{[յiD5mDDt"F \&PǦ[cb/m`?t۝o.%J7MSK9r;SZ8& /,4hr "?ɧƸ^T' b3+Xy?gf,!6LKDV&jt+4QC!xQwmއX+T!XR%hN[}$\kնk!1o{"˥%8O4dKATcn*;&v]_Je.1Fb4S#ےsHTJuv=(* 0-?9T Rm0DSmVĖ(1v .ι! Q8[r 8q۶E"u- n;%sNmv}ۇRrGGG&.M9ڶn?l2yE Ehe1*rf=b ,>3lOp܌0ߥ([Kf ClZU+ @AR2ZQcBg()disA4ᖈJRJxi hbTДS!te6٬yR 9QM)MWK¹>IS QeGtNQ#eR EL)f}tl~_M@94x"[U)8Z|~oA(2 %x471t ]wZ@a&<3kDDB.mTrѠSj-%~ǟ܊JNP+<59¹[M/N== *zueDӿ@jZ%c`i0}' S4M6HC%9Cu"(m/REr !RQU|~M:@)4-9ƽM\rڧMD% /ZA@Ξg!E=3ńyU@ki0LwŶurPBljs^Zcn('0mUFNi,tmg"j`0!1l6MvGDjEy;4M㼯-ZJUվC(Mba4M(sr1nuNYOҡ%,n2;oiv6*σ6R۝+ XdF!BUl MMcTH&ѻٳgn>D^Zwy\hyL~T.9\J=mZ 'I9C }ʹH ^r4|) pee#?jG~?1u]*~G΋ W.sM;ȸiXšލ|AUrJ3?]Мli9E,K(sw3IE9@lۧ'7+#s5Wѓnv!Tfd7 _/ϪHw07Q`d@;r0 :컮i8[h،#"lI{^aCGK1XGDFt, r·O?m8Ţp(bC Qm+po~ܱ'@*EE.SFK+`۶@3v9eyUTA!2@ ;w޻v߮V!CCRmd$9szsy)R:%2Q\.TayD!L$SKr) \slL!Pd?m'DUra@]A _ecAhN̊L8dijJ-JL`Z-1wl~[[>1F v۽Wl7_K!Ѭ5`$\&9RUaT2:yęeӖ?vvsU7/ jmji\sSbJ'*AckHs#XREJؐRHi,5CCjZC0 Α]6( 0Z*ѕZJEߛb&UԸV#Pi`ӔR{e^$v~SZ\[{JUׇYɔ&Z CqMAA&C0TTdEku~ ځ,Rk1 %_Rs m׭-3wmoyJɖ4\ V{BkaJ)6 T\ 4}v!x6s0Sq^+v]; y4״CaXlZsNB ?=፦KWI&!9?"{ QT5{utΑ7@f%9OHVs.3Թ - lZ H8&r!5j{l.xe2ES՚UY}&d(MTRHM٫"Pc@T~|)eybɨk<%~ R:nˌl|+~>7ۓ΁ YLr罍jrt|TkR+! #RJyLC/Kc a?밽&'裖{sF"CxT"vO^^^_[-j"bsνGJ2%ö"eزhd[6 3P,V,S-7XE5X"{{;"V3?X/{Xk6c+,:T=q1D샀m%,9'D(؎-^vxvjݱj`rwPBͺcE7Puc+sh̦iyBeC?ֻ ۶?yKARZT+}@2N;93О"TUXT8PkABICh \z___c)rmQGRXY0-}~7z:0xb`YVc8ɳFJ)7L9nooOȌ3s[; ^m4CLw/nWfYN2R!pӔUN8HFJ2.3/SۡXŌ'ZkZiYZj j~aMi_0eyAOu']ܼ:Nv&c Ldd~\-Rpq31krc>Zm^"d潷4:Dd۶ePjsr(c@RI&1ΆmpocK umwr) ߑބesN@,w WEt~53n2!,İ[Aʣ0R |[DQTTIjk4sKM4JBf^)Y1ru1RJdHwTrYi޶Coqw5:`)ryD~sY[Ձzp6l{)n˜s}ۡ 1XR QREkmjJ9Xjc&p }:+H9Z0v/fQ}aۭwyG<ܬrAH<'3`,Ja/v A`ARkʩ;E,[yÇZ[B*e_.W+ƿہ2k1>΂RJJqbٶ5h) kZ֚+ K+o?K5H`6]x .?ČskЧl%ƻt@E"rB~LN㬵eqlYX@, 7ry@,!#7Z=sy̏@hckw1heY0 Q[kZʞbu]Y5<LT(hT[/|@D|O3lZoo{2cm"vP)ziyVs/ێ1x"fm|"k =`yBpE sf.c9YanAB{١8@hw+[){%v[04mDAN[kmnRX= H!u*& kk!UJQe^RJݝ"UՌDC$v0xlV~0ޟmߝXDoi5,KJD9˹-5dY)inV=;!=47#5RuUX Qk]׭%s^YC1jЎqCJ A){ i Xhz< 0yzLE5Pp* W5#{ SJiySJ,ۛ )wHt{PQjVb_:&Z"# b&1f"T.(e13,[b"Ѡ/{wTSJoooH׫[Dܭ$@hVD9hl/~/Sp\tsODȣwS!G]56"!aYoX}?Ӥ*@i5ɲ̽w&^Kj .92S#gXZ0 s[]G/0_RKmՆaref1|7X4&B˲u)>===+c!@}Wy{1Vn{A31qiawQa1Y ]Ui:CyV> qlo F@jYqe۲LCZJ\yz}{x0S~?ND/9BH,ڷry2Z 93,{>=S!jXZ60MG[6swT{6b*a(u[7C=zcԌm̔͘(6)}r*51hP}`_PYe Ҥu"S(c~Ce6h{y5VK{Tu"HB <3f\pL u"4`XZm֑C h˲,e*"M1>=]R‚F:e|` }m`js1&eZ<¥}38`vx<4>~Rm̲,cKF浵Zk8\#鋔U.hhe#@ͬ!W!S ԧx|0)Ug9?Q21u3L#ͩ9yʀpֽqLZ:[,SJwS~zG7lJƐD;xc0![Ɂ䃹u[G)eg""Q); v8G!#CPD$К9al@+8nLdý䃅sScyփ8KV؄cg 7UR wa)P+|!D\bT`krgҜ~^wC/uwV sǔjZi)o9w̒{u^f S- =+UCcߙjN{\ dmUUCP ݧ)ڈ QATjEHdJyYf!Zzox 7t%(tligG4MKǵ&*TA*6A?0;O"K R!#f7r8rC{u]WUYkkw: _!ELA5\Je6\G I2AM@ 3 wQc֪cXݓS|m]Yp:價gLPo։Ya)c *̥@RڱWϴ3k5OwGɡDʗ6m(4[R{y{})<J@D.˂ b)+[{fdIv{{ӡP,EG,F,RL)ٺ4˲{!޻a^S f@#ŬSambMZ cTUSiE?ukjP^!٬*Z#mfwZ1Dbb֭ lnCjLn/n8qܑSRZax AD5[oLJ)tI9ry<G hsT}w<EE}%QͼNbj7ԣ6F2͇+%02Gh;Ѥ5w6ӡ]R ,胱9{}C:o)p KsY"<;TD2L,3GՈnpV֭*Ӝ^[n]Xp@[c2C >MK̶mO)44ff/by&޶$Wp)`dCZz/p~}})ӧ#6/ kYKm8iw }mb\ugPmZ{So)'On9y zSJ9OeVUTTcizڶƒ=BLN8\nC/hbrX8Pc39q4hIChSUe1tXc  꺊SUQ ¹bM5!!Pz7 @b:4A*Zw)Rv3۶-De^[sXrP(^z {k5 Ho'5(J[v^L53!Z@mْz5Hĝ(n_@ 0 {#FiC:x+(m?+?Y*VcJ{>ŰkMX.> AUz3 f!c)3KpNU/ts=hSjmq^C  8r Vuupn lPZrkm!|/ˌ&)c}^!yiz\He rAoM.rrCپwڲdfSa>bhr5'I˾7Zu\/sHn1E%o@ǘB VWw^."Ģ?VrDB8Z@d9Y#\;~F 1w OK);TZ'ͽKձf'VkD Z3#SD~މ\CGQ;;2m ̱1~<2Z"^*[wbtK{L)97QAbCLЭ;WJ`jJ VZ-l<<dž HL{1C  |Zpu7A֪Ôl^9-2wo4XKM9c|?Zn{_%Rh19ĸEDX#Ո 5Y;>.UmB#Tp`zz+Cu, ndCh)~4Mi ^zo9ۺe,sH9NyH/Z/A2+zG٭]הǷoooGZ֫hBab,JmLu DF RʧOkj|xAlJic18@Vn~ 9""1FUiΑRr9TluELx+1ުy !~vcXA3&WC(GtR$קCx?Haxxwܱ~F+!Բ;1?7cK7CPkcaB&Ԋ5iJ+s8H5#[ |4m[[(Q9k);8~UbsAZ۲\rN|f1|+%sod3!D32>W>&D1MT& o+v/{*@/1Fb!Ɛ0c#gB.x܉S]i)4 Q-,"{kC 1ExZo]CB%İmkB(Ŕr:Z; S̤A43s)qOyb!ugYF x̻Ykuo=sUyU%^4MO-iݶϟ_s)Ĵ[lݜg-mX:QlӜSjS8H <k5Dڌ2{"܍ +(Q͡2҇s= XJE"@V]J9Y:5N, mXb GʣKbέULYD5HD;>1'J BYJCma%a]ۑ~;3k11$M㑋뵶u][k8 ͉U4FUl䢡FP|a]kK)/s6RbT"4Ns\㺮Ŕj;Í,Ӻޡn=O3ɰ^mVaaf]Y_֪ͬ1񧱱_T7zN,z?Rz*pG!5$"Ȯ*XEl̔yNy'ra;rkkȃ]. Pgf)޶;m<眭/tYX)t%///mJw=Q$\ }N3qpZA?C5cpU_ѳC0(@HgUA4M%Cx3OV)e ڭ :֚uKp[4i"#8 &bg[A"}[ٙC =vYc|N6,0/3=t=n۾qeZADގ%mI)-{NeCp/{f$bkTJaCً*Gn,çR}$&V& P"YՇ2e& \jU:zo(;Ϊ=+晽$Eí"Tfކ^@:$Dx<0neFX7Y4}(,1nG"mb,j-ˀqrHy\cW&fwEc}\ ^C1ܟQ^0ww 72rZxz; yL}ߙ!=y^R\jz]nZ&q7*:ςA4as AkibL'tcy s" ;T&Qü[G%ϐ.dϵ^Bp t,q{kLRnf4v3t۬Ѻm|p.I#HMi}y[{$La?T7#tHJwo:zJ\o;VG5g0b!5%tќ8t*bBrN",X}ǨHꭙMUj"l"ěa.L#PX1K9B5K Y5gw=wU\.uV{F1}P^s<9Bb23rkHR%bbwjRR,",5 11X, כ7T[vB{Udģ2c b. 8{Jק;F/E[CNL-c%eX→]/ 1u42*m@i]aTg桃oC^yk [xDA1'`.pN 3/".,6UaE;M#$"/hho{kmQ>4OAcf̜r̽?8ӋM"uЮ^||0þt# j꜉6L?wܟC9S<{uGf`m+0Iۺ>UȎe|ﷻc [UƑښ;u?ɃGB ί^4rq2~0P9BW(J)fl=.R >Tt8Z}1^.0Auw>u&:;n1%1F PwS An(dq>B:]3IG}q'nz}xBSFMH0;&6pC羮|_u[99z 1^J+UL5,ȖA1^b̐b-_?~1AcbkV Ey;d;Ǫ ىo9x¾ȰbݺĎ="GW\uѺ2BK)ŔRvęy*{@f!)sq&tfO8%e4Bzi^^q\E#T1:AF9؈%"pa>>vȝ9L>̾-^u[/)9JDm)CVPjshyx<MͿʲ,9u]z0?[v2Z~ii9iZ}Cq:m sm/_\Cqw"gf,C ` v0b?q S"cU̧ǘBZ[iW\UCֆ̀R*vdNJ)3rPEc]HiC֞_^inz//_b\k`FІx-;v=%d# ޶鷧)clUOO7brcw*½cb%E /ha|}`keJw̌fCt_J /9Xffc|z~)fNfVVjc"!\^zk X!v]ؚS>I4!uێ E8kMܡ^xJz'RK7{{ŝ'LuNG !H5(p[J)Pj!Q J2i%4vn^jcYv:y /aWt@0ekۇ0@ eBcEVcLAJ`EN18 OHVpb?=|sHPb6[+pɲ>䤀*f҇@jPw*!Zݶo#h].Ww<cJN}va 0"'<9kY $ܽ[kjmbQw?n7LhZkx`.yzyciv#FKtVo?{KݺVw:vDz"N ѐ͟L K4fZ7̤`MyN9-sN)ǘ򔈎8|Xw1^.K2nn1e"\_|3CylDA D2v.<fVt!x#ȍѡi^?GI$9cGT;^]đ[20т)Vu]9.^5\`^A>tBd\H)D~0RplZyӴۺn9g86L秔l ~`W5Ҳ4(BR[5 pߍ2"mfaGWwO9ǔAcH%(= VJ1jTXQc̗5N~YY EwM^zkrhC hTXqZ{=aYm[ڠ=g"!L{E qTخ@{P0EN[eM}Xvɝ?|) 1QNzssO?¡);> J@Ca<i}LVEĬڶmSL`SRZ G#ZŽ Hfk)F_Dh]}kmeUNzz:(fr9r1eYq!Wiv-igHmr?o')ɺ Ӈ;tӘșFǀQ{,{nSjmv\yJ9==?an]Wsϟ?m{YGk}/zc ARD^R"#ݝ}u}lWĘ 7>O!㱖Zw?iȩDڰ3d{G3"ᤰ7:f4 AcIRx?ܫ{aX[?&6Ѱ(zO)˔b<-5! %Z9/egBRfQUYT، #t/3j4"\j`ib۶Hg43 秪[1D./Pqbc=ܹ;.Hm/P/ \Ն;ju[ӴPk]朧 F7[L H21Bt-1%dv pQvBH|>!t뽵GsV̻n&C w2\vF*™#q i صbL!DQ91ǖx/m/` y^LnUصX$QSEVP#{S)uK9ϥlD4hhi:]G9'h†+:uM X`Y`1c]%(g<(OI{hF{Ǽ.̏A'@NP0|ĒsEsB7m{m x5#ZyR 1<}TϽ;___EGw*Sj=sX~d|XF ÃȚ-ё lzbQG|f̿Zv!o_򰵾:Zai΢n';A:BbL z;6ESJGXU)jnJ3^ qP޷C\$a Z/$,!)K) UjhijJ[_֚R9#֎tIf ! nR+tL90vqTA U[?W1vrQ)!uC[~^JۺCin}?b֪7_m[:/hȁкv8磇p $ '̀-n),j9L~ˇ?0O3BmjugwW Ƕm!D 1BVD͝>LOmo{zhm K9ElCu]B {kAr׳j5r6<02`{ѷN"}6(j}i}WS&bUZzz:Mӄ gfvC9=\&j0yzz~J1o[TtV3}Ce秗^?S|}{뭉J){ ͽ0gW̬V#yH#Qʾu}`m֜眦֊;]u秧ifZ53V| H˪؄@'`2xvQYz摆 >s UJyoW D^-lf#k\'w a5i߶}rYݺC /ɾof1Xk9^}Q ;;Le)Cdw/)Of$OŔ6rެ6mǏB0"[)|?eg URb1E(룵b=֔sk͜c-d1D0 8\cO",0Ӳ,H_I :`/w="<圃j-4MvSz]ܩJ*(R"szPͭ5hͷc\TO`cx*51O" 5|~C5+ɲ ;9@ժA(5B(WD̴kvMyw RysﮪZ[oUPm=حPi߷R^^!b}l[kucb G pb&Ÿ>&*櫯ERJ1f+#r܃Fx7_^CfqΪuGD2Kxvh%F!0p G93f0ZR 6u5"ĘmeߎKw4[1{Jm Te/v ybL~\yZ)Z]UyMzQB+"Կ;f'=۬G _u5Dyaz`pwji7~!a0LMewAs>"V.W됄v#g'cCRk1<۶߯l ;RPc+6'0NRk-P drA刵S t0:Ⱦ)h՝9 +bLӬMTT !g {eZ)N:Rk#׷3/\.D^k,"ooooo7`58G+'r E~zy}//bzߡCifmRc;BLG\ ։; D_/:8iLNTo4dw00*o.Š*ǃE/Kֽ0AÅtJ)LU7*G"Smֶ Z(!~9ޫYfn#z:? a1qbtAbq|÷{P[Ym형b\W@1ew CmrY"fT[wz 5Qŕ0@W*-5Yc\NVt; Juk`; Dz`ؾ<ͳ]8, )U{G:Vb^kY~?J-۶NA}r\.WB\/2N<R=/?ȏ0Cs4ܯNu >^fu۷5 >,˒R6;D۶c2\. |J1ė31[^R˴kr86i qh>R6Ojay?A1p|m DDdsvO_}sVY9֏RJk64M9hh|1v޼>??㤈//?fۺA^bn!}U9حJХ"-6{px@B %9z-|vb>8qyRub!J'eA|H ݒ>=?}R_|y/Gb}SY7Z̮׫*+u|Vf}۶"!x'Jݺ6Eqwf4ϳyoaGsRLBjN&bgim6\f]'-d/ꋜa5 NPV"D?pǔ?N@GC$ C)qTQuJs}/hX) >Rk)4qsv!yXUCiкu+yEDibwwjfJ2ӼE5| p)%}1V w!=h!Ɣ[u^!"!u]u>?4gTPhc ԡ؍G>ٮѠvJ1d/лǡDqyoR8㱦1qn133+!ȢGfGE1ckN1jm\3bٶyYEFq࿏y0 y9a猨^; ;fGy-L78 ܋zk9?_}'޿%roӕBsJm/*w3h<!,Z5 ޘ, "\i!$">m/۶nXKfGS4M8ljD5RN<_.}/o<Osz;cD kmL؂HP} :` (xM*mxrm[R>>a1&}or齗}êcd^!12CAkI&Ga8Ԫ V5||g!8p68E!`suvf1_;:hp`㿸`4`Lx$f"DœL1`~k_aW>Ҹd(4Kh;EÊͅGuy $B9ńRa!}c U3k1Kmmwa֞Rz~~a=񮙿~6V (9?.u]^bf&16nk1H4[ NL'e' I$m%_h`{Kc_bYˇ}Ґcf:ÇH{m{m]"hTItBh?&\.קݱo9;XsͰ.}r~ !}7A{Ccx^vD-,95vm{mլ31,3,$"OW(}!\0uRqgVpӘ)OyĘDwwN\+;bC?qʩ r/Yh@F{{#Zx5y\\@5ĥ;tâ'& ,`xu;.&D+X7^z@TCiTnݦynT+7TEBͶ}R‰[7`8aC>)'B$qDÀZsb`b})(_12;gg8#_ݡb41D . AteH1Lx:`B;s)Ly;V#9lǻ,|nZewAcHۺ!Q bpӜ:l"ze"dAӈ/קj!i})&"o#9_~y^b ?k+e]$DQ1raB6SNHVuGɎ тmf| ?iU믿ÐT/@|ʓ*n}h8LcǰJ4"ŒnkܟbL"ߕgBo~wܼeZ+RЁ2TLQT[4AD_k)zĔzf" #iϟ;cɹm2P[‚s6lǘG"1 rmмkPۺaf!<t~" }53X`,䨼@}p[)MD?|Ȣ=%)+ Qqf^qS4^*du[)h/ ƔA"K7Ǘc" UJe8: :@o[o~w}4ۦAj)oo|n=a'W31F8)%e1OSN,8EXeڨHXrS*$8'>$6z##3Wi4GcG4kk1zo lRUJ4]Co_0_u'aE RJ >X%w8NnBNGIZ!VG"FdUmuݩֶtV1S&'1wu[a;8S!t' "L(1RklD |ȉERXCz]UCDCDc>/3b+'FL j+صN9Uzbtş y)Jk:F$,rdATJT# r9)eVhbJZe'<>: }a)?vDYď}oLL녺Q2Ľwfqu>a'Eɉ)?0z%a{xHXR5:atYfE^NG:Vh(kpk"V[qVj[yJuY.9}_轗֭0;(y\02K3ITcU8JnJBNZ˧)z>5*#p=9ҧ8gIGEfZ ƀ<abLA/:M˟/\)m/dPymcgјnXZMm|UbKP >̏)~ZEzy׷R;QTˇ (h(YE*#` |3K!cst2*)ȪJT̐ ޢ}}͟[tߵ5~{;0g8s]p!"8q<6N.t?YGGq sV;9!D h#m8Isc_>̉輢? %akc$m QB}xq/2`=~#(& {~Ӕm {CNiNSɮy:~Пnvx֛us:"# 8`aIHUl;c``,l'F3 a'> 絇@*Ȉ"^ Ta~f%%;M;~gQ7f2#Dw\jtNu, A+&0Cg:mcy ;!s [] ?)W@R)KDfT6<,ȍ D{13suo)$?;X>W-Ez.lNG!R촎@1yա[`o >58dIdV-f `ȃ`N "Gx'm\Ϫvi#7z<>}zӧ1Ϗ믿mo~b4lʹ¡>K{ARK֛V}9ܑ2 ϯw `,ƄroF!2,u|Y<\h s]d7T3wLʍy^pHqL1Q>>Z;C^B>wiiujY b1 !luju}ND*zi~a5Kr=2:14hՇ Gy1ccc{HBL6t ^Zqb7{VOjǙr})=Q]f=nTD.F>w~ҾrgnC9 K֤iDZq6B H)%mjXUsB[?oos4au΢`(}>s33޻g:A_#ԘŸ J:2F!/O! <[3c By~w> *EI<^0Їna#bMxW)zӧOӔȇIaꫯ}>|t( ļ[oU5[ZJ "ݙ) >MrQ-}OB Rj QDG@[d7~ a01o#-lHv)C7}ڨn⸜K]5[s ޭ.O܅<<.i1ga1牣 "yj5]C@RY'Dsa \]@1Q ;#}biq-{M@tZa5BSmrDq9Yߧ bT`Lj&1z`c .eDGÉãG9m>F>Fytwpz0k0^",1WzD~爎pk:tZP{Ӷm$lND5f6K)B_?MLqF0itoY>x&|w~\Zs1ldq=eem܋6>fb3vt 9=V˘YVuGs|B:殻;DIFUKhosfȽxK)|A1<ϵRO4Z4cADK/[_mݠsy~8k4%'çϟ?3K)iR n=Oo?_^._8 ĝiD N}Jp;OӕQ*:D?noAÙ_\Ou}ޙt(HL/W8(q?a[T;3s#.|O \e 8)9I?v3t(d tɽgljọ}hsV\O/+asǠ3RoȏQ! b|w%q(Fc9fΆzJωwoy>w pX( N#6 w'(Ql{igy}ZRSq #HE;$W ѩC:%sh<,jFR3  :_0%jfJ k\i,Asއz\PQe!(0?B;}yHH* byy(y'>zϳwYMڪsわ:?$ftLtk6 sω;{ y-v"q,L #Vſr R~uo}upX1A Dd)n"QJݶm [_/SE6&04~c5 4Jlx!5&lG*?k-1|{s"̬ʬU (0  B@vH韵Ц~LoVb)1[4 F>zX- ˼7>oP^k#V˺'{EK$v56 ѫ7nwj`:N@h0=^ª %ofk\^v2{ ZN5^]p%[/Mw! ~VF&-?jmڼ Nc{j[ L=<#Hm.O;JB44bqXs*r.ۺeト׼n׈MzPڦR!@mg-Yfm,K#ttO=Ň mm;Q% `%ODg.>W/ Y}x 4_ZrO~?wD7A\9L///c5+:P\JpZݿ_> k!Pr ;Հ.]+Ƚ㍩_{r0hS;4Z7; ^O|F:^7vRvcÆ *'Br6CҍѰsۖ~'?gvnkL;qEJ)m\is$5* ǥ_0C)Qk11U@L4mcʥRʺnJd0ɣ1{R:c@7oi!}%~wOkOOY"5xjPޟGYwq@). ^oЇ%U:Q] ?hȒR2/MgU{Rln}YdqL m޸:κwIߗ-}tdQ' =~VҢvʣbԾ6eT ХCZCF~~ $=};]z`pZ4`m\~Ci.vR?4Ph7-ZsBZ: oZ{ĺJ D[F'ZZ"!ɩל_r,orU\Y22Aߍ *hLժ H/e'޿q.3oD}n\ UuI{MG0F5[]vfE}'yګ A7-ECj=Uж,R?drSbw STPb6-KRJLWU{TsJ_>~Y?mUi޼yv[oכDZJ{Mi=Os{IqoqA A":N;KETERN^וUUs"}y&؆ zbyU{)P$AGAvn{qZnu!cvëԒ5{#MJNs7N=*rk1VUk=4Mzۄ\h%S7]n_?rkޫz'MÞJMau竮xoS(snTcU'0<^l<䠍Q}%a0]x%%n6j^;۱&n+JaY)lvZ TQu$}p_9~ponQLL\/oBb]2e=2~Yl^̺1\TrΟ~`%M+K#,h 49"H T!yt8=sƌVQ;;{.轏Oۖ#P;(rrhn6 J?4^tmQ:g7a͟apܱ7h_ T]3ؓ]u,kB8/f!m$֦ވ: ֵ\uYw?yIE; 4n'ct; m+!~ A_]e]`C+Kۧ>~cZyb++"J)"J)yK%˴PfV{׼Zsxy.7`ҩh9ȶ jt<]iCMtߕ( OsXvuj|Vt߶@jWa*w `YLMt3&Vsίo~헿LΆr!L;|>o뮵iZö_˲J_^kU hoۿ :Bξ8n''#suQƗW0o#:4Lފ̍vZZܭx r{!4F/mEAW۞RzJ}zjs.(bXS+޻<'7@}l\ Jk B&ql6ýQh(НV;}>2 { kֺQ#x8P# inlB#nennBCo*_l@ lC,n__:ĻO^jt)rZksNkРw, U1:(] )@TUM B7ޣ;ozj`ԓ.d5S0B*58aƖݩ W .a=(L)Rw?K[e6.˲mDPHe^A"/ QqJ)\*DORkuInKJ)0xiYcs)9!vAfs癈mO>"1JVrD:$Y0ƔͿ_9R[jCN{%-&0=h26K [3Ⱦe@fՆSMcX2&1]6*^}a%ܶ =nY1hZk*<ڶM)eWqasu$TMacKB:Ɨ85@|3mB(guծsf=WI5VվA|>O7w/v:wA"bsPm,U yFՀWnD/6~(4zݘe 2UrMӧڒxOU Lԏn}?Rw?٧oˠsLȚ$2j|%'K)ݾ~4]%#D3JY.Zguj$Yk 9͕a8[iaD15qZ YQGhzPK5<]Ԃq@BtF`0_:\T፝/ c;vy2i,U7/S:}q߫Zkz~~~>_۶s͙R޹uUJKDke۷S Kk),&,SJ5k1=b&D B \J)YkurJ)kMJ)+|~ehlfc,֟տI"pmgK@ ybbHeKK HQ}fi^mF.^;i󱫲[nHnnQ|qAs fL{J+fC%^25 ރwbf2w~bb%4BPͿ}0\JX Jf]a>{O& 2~֧٫X5붨Xl;V:f~ ˻/rGu2wmkQ]ߵvMCI1"KG};ğ{SI)Ƙ׫Xhl !{Y @KFD |^sJ{iBD;@)\kNJ\@{/z7 ZٶÄڶi`i)!~_C[zSjB1{Rt!% *WDPZH1 Byp/ׂ`pz t#ƪY7Onx[Ll`of(RR7d_}ת=N6-v"7Ŀt01 C~m~y|x_g~ۏz~\J)+NۺJ 1ZW@%{\0QCyܔ1suLdk-2ZZki0 46)Zuۈ4wмZUU$Wf?gW?81\&2 i*P)jH'HUVKeyЀhvg03)k _ C Z VU_:^\b5zFW%HuP4tgo4'%n}R,2jr4ly.p]"pm@ Yvb{;ߏnڤswVa vv[VyGdNx_~w~GkrVJ[kkBPUQaf1F_k(D%TUT)qUshgwiA_dv:gLt:۷o*}RM!ޮk%C\8|0W9eI)hXpOOfB)scЀ5k><<')!GfQ𺒨Ij]  rbяDZS+-3A|/::{1CG t;Oy+=iO:Vqڦ $֭ʚm !En2Ds#l}wgmI$#%}rC͐SDYi_Ы )=Rs^mzͷ;J_طnlCJ,Ҽo~W?u#3̔.04MYD! bٷ ۺ ӯm~[n1XХ$CJ\h1,˲̋VsK!1 ޅEA&+1\L΢݌)E0￉oys@ʶ%la'ѐ,o"=\{KLEH#Y}Jg'jr(1#kW~XYA*ߊ^o>qѕHtOhF '3߈F V|:bwtn?>OoZ'дeoj7~C奆Z'/QW2+Z;G(քc isul5r#ƵJzE\K맟|j2g =Z q& @|}VkkA8@RNP pPskX!5Knv2Ɠ?7 ~j/8De-1\uWMsMyDhv7_DoGD+}XJyguQz^u *//X@sfY篯:$ûhc%QzZ /I*cJhBDo~kYjf-Ġ0,%OS8&u$ YkdR!~?X/S*̥M;p?|s>=ߋd'wfwVe@rWoo_jJ,戹wpaQd4;Aw`jV7d7~Ѝ daV$Ue}Ф+:ˍj?i!p߮}cIһV|^sC;:olcuHhҡ.)6mL=:Kfu-G5\Rw&jc.|R7?RV^Mp-K)Dr~lSdvi9!R Ѵ:wT؈{Wu =ؤۂ&M& ^ *:VFn ǦԴ\gNj^ڮ5;+qs~RkݙPBrJã[K{zq[RB?C.f9nt:#a:)}@PGZC./ꜱלJ))UḴTwisAN {(dbJ}Nm4m =; É22j` v+ JijY_iz{km7MOOvPl``WKii`n~wU·{ 뛧~7*s5I5OAk%4MR_Ka߶-my 4O{m˹La2\)$lq>ODr\{$RʶmkΥBRwN\#U1 3#RnZDSk)!uV)РQa X㝷9C!L`JR{̿s-]sRJmz&7ݶ;jOj>kz霘`3-eFS*DV =2Y6-Y$N3az8xXֱ B};goh=y b?wkiaQ6'浔R^߾y_uv;jVua1;go5d-%Ƕm[ Jm[ϗ3sEQUеm۟c^ً r5"ꜳs&*`Aki}.HhJRJɥB~R,2@D)]oZ̕$EmE1uR>x}GIBNҎp⭦ <=:,ؽp]ѡX!_v^wԍ)d~J}R}Wk{dhnAӴ׳R!zD;p@; cin34rXY0|HR)>рL}9N2{F'$o)}[Z_tL?q:w8 Z zQJ}'J)Y[7UUJiI̥.])9*2}P֊hJ) Th8JSΙZ+SR1A Ze9ǸK!kt:ǔvk]EF !LR?^(TcޣZ~g\f}mpe=a61JF?S⍀ 3;H"?#610 !zLͽ蕽YPwrҩЕN.Ï:kcgaР&VׁҰN o>[Bzbԯ~v`{0\oh̙G\CnԲtuuDΣPw̥2g$)$R}?,4%,aUԪĪ"B@՚K&b ʢUZDk4Zs^bBkگRONcL(ET+|Nb_1Qnw -5p 24p/N|)Kki,zyR[W2\^^^z[s)hlLx8n2_|~YxZc9iv Ơ!?}宰 Z8LAxtŘsN wJ)mӀAf+mN)fB9%|vksNpR;?˿}2tVhFu;Ԭ JK!{/JtC'RYFX6@뀖RnQX( .7JF]i$Of6ouѵ2$mri^ٝoZ^㇙u ~yjݧs[mYrI,!-~>lƱ]Η"2yB˯ TUgRk v{ c&)%Y*dfJiRJYrΈ<z]s!U {ܘ4o+ 8kʺn4IK}֖Rċ*i9=!qZG33~__{J+5I.ˀ@S`;߻{۽:{7KH= ?֝1c!3b'GQm1J .ؾ|nM :N= )F]Hs|J ia+2]JQJJJ5},0c Q0i/4*%ԔzƦԉ[샪@7aЗL=U>`Jii ;2Pyd3D :xTZϥNKO)S*[">_}?O9痗wJϯ///p<2oRyѠ<>mۜ ,\`UJPbrm}1m݌~ew@WUk CG[BtOa"KөzOg.NBz;\gܣ#Q`!@Y4Pu.׿ۺG]eZQ1?#!xįx:˺i-9燇7oޠR1ys˲h}Ͽﱔ!cs(RZXkn@3WD#ޡ629R&笅05""%u@kk1*jep:x u]kuS2Z i:;?3Y VzkLFKAfba+] nԖhdn\RCv{pm7FȶYJw3ԞsJ=Z5 EÍ0l+u`a;@;sXFק8 {.mJ)# X$قC,c x]W&$R+O's4g9:WrFc֗ILZ -DZܶIu߼R mJͭU^1avA~71KSJox{gɈzИZJc.c;Ak'"={TJ̠uJIiG t\!Ox<~Ҙjxxi 滫lM}#[QVX;OUm3P*iy2Nx>E`ZߏҮU7>X ŘXlik`۩Bd1!1 @.:56բ^̩62Xvym8U Q5Ph{fNͶZWӟi*W% \m;>cn9ǧǷoN!Ę9ƴ;4kn:OC"O`#GfM$r;Rm cڥf*'" C6Y:8DRCmR1R뮔~zz}&uR -qߣ1Xc~z[\Ŕ][V{oy:3g~O}aՖ+_OľiEn i^=&F&.[yF)}>m *J ]Np9Y촾+{b- Þ-B;t<fQݞZ0~Xw9bܯ&"D>Du]wU !9;_h$ :G>tzj6| vkc|~ekU:;ɹ;ל#yBJ?=<<޴rFB!Y LﬣU\ Ih)EpRUt?gZQ5wʈn~i(?^h}֐LV:N &iSs 7Jt-Rx8}ӟ@TPRʺ>q5޻R諯"*;uok3sLn5ƴsxo[J9DR"iC{sX\]R%OG1:z*i :cZ1`d.TU-%CR2h4hUZ+=3ǔ*U)gAv);;31RZ" 1O__eJY5kK|hg? GpGifDnʝ:,vEmT ru&'4#T :J䡳k,dKsbG?XuÐkx36HV />/knwnmD2_ 6/4a6CV\j9QuPն2 =X-}**o}G?e5 ue  dJk*j[u4MarJmke"iBd9+dvV7ƖBJ,ӛwÿn蹔nB=oP ~?֦蜈}mlСWnCOj=4Hsw3HvswTvsoGRABZ18exKD}:Br`/Lhu֚BTiS7O:`۶\bR'@\9g"vtZ fTkß&da Z佋1v֑ DcVF<1<[kT3{x_["$ Zcs@J,]R9D9}Slv.t eh 4nch}Yلpm複z! 'eV->fqc=j|MӀQl?㪶EZFAĻpwPaʦV0S툓i?ئGӃ S TmF^iH}̈tgv@}Z9`\7;wHל/~}Zk03,)]vFD -35yUcL1FɇB+VZ.9J,r97c4MZ+/,\JwS~=ZnMkd߉.5-Y zD3hߓڀ5rV~9/O'vEldšbaa?*"Uy|\K!c͛ƚ~yQ+}Va]oim-SVQJkJۅT%b9uP+[kBO%]s^ЛZ+||4/ qe@SZ6_zX˯,TęVIfN)29ZXvcnBʅyegOσoCjm$_=:lC%DM_%ʚfR?4AS/$+ݸFM']`G#7-CZ` xu,-D~)` |#I*zb.ҮpB+ۯ@ =_ 4D\Pxd^>CGss)9-k3jU$ ϟ};Sm]VZ׽P R S0hz&Lx1/J@{{g%iSڙ+#ju]Wc QUM!z]|<=ƟcTwlT 3^jiշ`/ qli70$ʪͮxu:9trGl1Piz䧾n >=UU *}/ ,!?M˾G`۶i|&UDH9˂ e6\g|x8]u[sц51Ɯs! tv[A I)Yk])eYfk SqתbLƘyYĐJ՜ub6䬑!MEq~(Rʢ$ *Dd8뭳_|yL)LTr!k:rm?џ_SeDC9ldm[i6UUT 8u//L}wyL$7pr^JaIJV5 q0DE)F?fUdcL)6hK1FD$Eʪ*b&*̇awU8uZwfoZew^TsJQD0\IUeve>(Kbm3B РRֻ*d@jXV Z`wmJQZR ߋ禇L/sDD֠RZTUA\۶۶?4MY[BAo@ )g**m1d9{JWIܥAJfĽVTUBw+WbͨUEo瘉c̈ZRDv۶ lX1сR}߸~}=;B@Zkf _7t"l4*%EDjm_mCcֵ<>>sΧ+O? |B(9#b!ʹZ[LpXB޽ )l( c%!*%Zi5儈X~oSL,K1m{Lx8&q9 ŸIIιܙ9km1朘y \jǣsq)̕-MS`3' km)_v&f.xr.\.gyN);wGtbeOD9"޶#dAjpcb8#)gm)֔RRڽw.[UZ)]8*\;)bLh{ vo~DDvd޼ ru>>=( kͼZ+ytD\xg@Tk-ֺ-t`.˙3sS5m{y]7k0) Wka5WVJMavmf}wN'krv8SJ䇇ZyBk=cTk}gP ÏaoݻwiVJ&q5%u *+` DDpT1ƈLq%x8" f^/J==;Sr=S0MpSa[0sڶ;S*f(BN2ۖSd%oAmu@?>>hiq뺉4M9m넨I9ƘMTZݴe99Svޕ|^1&TJyR4qC>@Jn H +P YӛшrBda<ϓ1V(K;$D4";'haUVWeyV53*DDUiWjRZf15J+cYho1%&L)Z+R{)%I"p\05XJ +e{\n3\ ,j+ qA1h]RRP1rUykm]{g9_@ca۶ۺJXAT:gd#YO!\SBPJs6T\٠T֘s{/j)iЀ(i 5x:=ϗ4%FGZNUXkrI B)̓ Ez-DƘeSN1R1{۶R1ޱZAcܷ}6DXM¼.P9xi ɀp~}EcR!x4f]o//2a!L咲h>ޯ׿۶u}\tRJ4p9csN;1R1h# >>x?UUsN֚yYϬs5t<%L^/9k*!笶ﯷUܙ1@\cTJ)ŘjUe7Rv\NqG)!zv0#^E7D߶nQCsN#\$}e5*j%N* Yu#" *Oӄ=/t:9ѴV޷ZIIET<7!,S9PΩrUJ=>>Tnr{圗s9#T(Q)%k]J{Ze.(s"BjƢ,kUVRU.;ѠT1ԓN*3֪*)kP9e_|1Yxmnp8mWJc3]gan}0luv]W<1XkR ;b*]QSK"f&YC.SFZIE✗VesaIS!tI h̅䠗iS.Ys%&ƒ3s%"9ȠsqK9c^.W"1,n%dqϭJU)\A[3dX+&F:F\%9bns9kĶBv7eXb.e7s :4MF?"H ZrPvB|~=Ii-JiIrp!xBUz R.9L9h1sE[̜RuCR덨D?)\+C$j^f:ҚQ3*t]=X xnJU<[RsV,kB c܍>R)rbiˬZ,)EĒsQB#F(֪Ѡ%dUo(zc)90MAyuOSP5Q){oEU 3SO4neW{(s+QRV7i ~ys.BZgz,J9`]7I.0Zs'*>ι_ zۺ:AH/׋R?u]+imSJ?<. o0MrzJ!ZDRQ:;X+/l+$֋pCiK)>DD]1"HD19]27xȦ5 Iu'b.EO be%: DƘB5h!_E&ワN샷m0ϳip]o\+1ŘAD,T D&YǜyhsU)l"5Vv*Us!&y$sr.9S lJs*bT˼]ׂrX;D㽏εNֺc!ޯ|b܍11Ui}"jpF4LӤ]ȪnqƤ&6aW&@C%se&Ut9JZ4fV缰ej4%& B].Ӻ19=R޼H\ra&!L"2/ Һ|<&J Y A+9;g)=nRt:JYki9D4bS GafƘn*X=<O#T 9irjs)ƘcDwcp9R_|R۷V /׋*X;hz[^rnS)ḀU}uVknAM!H|>> 9{9hKe9^.v1CʶoM€\sGL9r<SJ˥je+01B5VUD8J)/۶ժ- pDcS!RUksDXtƘ>d-$(DTVh~Ò$ Dƶ3Vì h@]UևNiGvmn V<=`Fkm|qΝN',BYkL@>Yӭs.XkuyrɠAV⾋V{E(Ҫ,O :<ݧm!FDGq)Yj)&c 6!p)3SeL˲cACD" R!r^p??nWy (Rj|a,8"Pv.\rloavQoz㺭qO"Ȑz{)h#,(^DCbJU="RZiSڹyupXTsv*)eZ)%.v{n7DSb@TpX {):$̇nlNc9~s~Bl/5b~KL1eYk4\|oK)///J}ȥ "2Z1b(5 -^/ Be1h O'cRWds6ƜK^s|Ƹ{BU)< -l,j]SJ۶/•@h$RRֺ7)]0sΈ[z=/'"%/b jD'ᅇpz΀b >0q. rBXrN E" *) sN)%9Cu9}h q<>-83""HN)?=>j OOOO">}0ܮu6:ӅX۾}jU9!;z8r!@\уWXN)O\U%"m03W_Tt)5"&"c3\aY/J_^_祔\zIׇ @8)!R ~p{R?(޾yHJV qO$e`sED#^xS xຮuiM=)ąky'l$9RRJy5`6ϳX;M뺮FcwJkfZMk=seJz" Cw?BwgNTJBHDYi08k ^ (ҲTŠu! q {j"}6bZ#j̅reY mۄ˼L$3{Ԇ(xn 94h\zXUSf*gN1֪K)rxZiTU)kx/Dud \k)t:!jJ)ѦSʇ mRZZk:ӾZz۶Mi-{<cpX}m[rek8NJiЪԤvޜo߼!f"Z)LUUcP2wח=A%PLOBW_K@v[U,\|W8rZSbpZyZֹu]|F{h ۭ2OodQ*8!(kǣTiŸK-(Urqgo~,s^z<52[ny,h;3~CqbZ ,,0rߊÃݻgĽw۶ |߼yìe&wS]D.&ҀXkEB,a-͙ڰ/DUNUkYcJJi|~gDD*t8iϙ>裒.[w&`۷өB AILSK|c߶"J+c\S򛧧0ʕ@v3Ѽ,(g8/9eIm=&k .1NmIZ ~8,w8y?|R=n1)LDDLZȥR %q˶Ɔ0Q!Xg) b\#H} .ܡL- <%RN;VΕ.I̪0Z3WȈ@+5n)Ηpt^$9.);4V|s4Ј(:2QR/sպQT*19qZ;gnt:e{W֭I+ ӓnwi k*0*sh{4XkBmuνn|ݻX\9|nkP1\Vs)y/+}u]cvd!_ǪTIW6zEh va|~[o rx4_(NSˮc~JG>B޶ej;ϓN(B,%VI&Z#$uVDS4=? A{-sV(bDXkG)H[k__^6sQZs}ZkKΥ`)d-DS!Ҽy{]fZ)ei*W wr(j&klr,Y+sĠZAkpl~yT r-NDv[q#d9cNGm]z1mĪVC2nTJn"3ǣ'bSʵҾ!O>h甒F$3^+ =&z>[C9')!$QմDxj&D3 g!-Tb#$@k.e߷eYe\rʧuf//)TmpN'5n.+)n"6~Y@do>9o. EZÚ{.Wu,:2g, lSJb,R [UD (*n[XQι6P>u%I=Ħ@|NkaiG)y]}ZrN\RNS>TkՠwA)=>i5rFK@b4BykT5 0,{@kc0Y9OBT*䒟^_/ ND|kKiH)#]✓|8dRMa:/yYZH_Z),rb=<.T`VE^Py pbb,I9⟹u<CbAD'˲l*T̤GZ{c@^O,v)xS"@]t̙r[ OhZ[%$LMDP{ ˇLY$؂DncJ-D߇ EI M!k5׻|-t@23,>y90Bț7EFy&)Y4"|LJ"01e۶p\` nt:u1!]|RrFJ9ZcCf^߶Uk 2Z Qr ZS98/=۾9竪ǣAS<B5keD#!hv[0`;_Иg"9Ľs2 I9ItJiYf6ؖ'El-$AsJ)Kš("`}5h*Y몪1J"L ۶ h[9K\Hr@\I $" 7<ĔsJj+r5B>'{NttΥ eELӲLòk)Ã$݋RE\Re1~iS[ :v]W+U~V睨P˖p0>??Bo<.")qLcP<>Qn5>>> ru R; őY\(V򌴖n"QeѠl¤g#J)LއRR)Գބ05**-PQ5z-df(BϥвL󼈉оor\!{s.-G-Ÿo0d';~%(v#*κ\HʵU79gBR*lFci`+h@lb~gkkXzTUr ./; Z46x?qv<d;-˒r<T(Lo޼=,mnt=(2ZyYjm߶uu)U/UkD(>I~A#9Fc}۶-✛Vu17 -sr8S5֊dTaX {<|}}Jw20r' zbgsΉ\NLo !D˵4mjEԅ(ƴoYm[)Ay~}l:BbݱH|9 x}y!⧧'qK1ˬUksڶUBqr֚mPJi"!*y|v:lB^4p<eaIr?mFmߍpJ1Q cpߣR*LJ)u]m7X_n78'|Zr<cܯ,Oo5Zmq'ZJ1}YWQμL!J+c3T $7c*(}"*JݯX19ǹRvKl@.e *->X R^ ILQb>H%JN{Hǃuv*Q{BL/Q@!<{AjESbPL/v'Dt>LGI݈Qj}||MyXku]uBW RR. 1 ZJU]X|6?άG9$wDfB]J3ӕGDrzȂYUt}v.{c p |)eY8^T҇,؟O(x>lb wd1( hB (Ͻ7 ӱ=_$u/9QiN`fh̭1R9|߾VHXͬ}ߑ@NsNs-^"8`M䜞Z\J {Pkm9aC"hH2i:,"2!-(G:RĂ!Ҙ;wsA Rj&u"SRcu]bƸFk)V 6..1u]׵+/RHExe!mطVS­):\RH{Ukct.qZ}_( ѣv{sѵ1JX݈OXn)9RjmHKIqY0ZsD 7>k)93BNcVY0@'= ? R <HC⮍礶̵)i2"u{oR:B o%˜Ki i]וO15{9A!s "rSKhEiǑDE*JF8@3܄pJBPc+8Dt\E3}b:1LgQ֭qѹ6LSI6_a Ds X:cDߖBi3)xfАOvGMb^>k(SJxK)hrΏSy^`$l3_j)ZwqXZqκ{rcRzˏ`8{咎cNaQDsN tۆ)uY)??=mG\XZ|>)"%1F0>^w$VXKjN4LǣiI$&)#1)5hRhK)яhJRԘH S!6ut1Z9"<ۆZS<4) %BLc75:Ju¾o@UY؍eUh=Mc"%4q1D:=Zmcuc)&:H ̲x <ZwiM)'ظ~X?>>Zc"^)>b4kG)~kmhgFZJI)uP`_֥&ZsygsIR*)} 1L岮k)~Z5)Z\PPkDz nCon-/q =p(~))dPU~_s=0|>$:Z @Yk 4oطyeYrǑZϾJ~&Ĝb2òƜH[g5B-@;jc^mۑL;H;;/8})@& r~qÁ GƍuZ 2R]/u?fK% 5Rsǜ녈P_s >hH9v}!d-j abkHښ<#«1[h۸wRd)(31sxΉ"TLJ9kϣWc?vݸxb#Ԇ)+a{R{|=tLa, fC+[Kj)uCGśL1%i"sg1'i㜍1.`)!Ed1Ơ\14!RQ.䃗 `QX1!>::TSL%֡(qcc5ּ9J5ǰchtsR1_Z+bTR:BKOGJ^/,JR)r9ЍEtD"R e87nDtDZWJ\hG dB>@8蟿|1o/` 'EJ!fmP">>xxXAUZKtN! >mAN΂5nYV,c1v4s?c\:/ |A B:5(JIL{ >ι|ԙ!I| !Hk~SRhҗu6)Em mhH\!$+R3=!% F9e:mOX5iMm7jk5m"dAs{muLFYJ=:so"ܬ1ZkB(Eةzd!lnwcdzxni|nԈhs1qٷ(akEs sx\ѤhB"t,ၛM9pi680n]vM4AY✳:fu {/%f/)cΔV%+B>\}Ka۾iRk-%)JFko6s" I6_THs~N9~ULJZcJ gD Cs.ctM{o c"{lú̜KBj_xxGKbNh牘K} p3RhjۏTK˂_"Z˶=~CJjEwv Ȏc(CJZuDLQ[!m̍{#VHIJ}?^r:P>߿n8RdI'XRH٥ȤZcOϳ޻Hiva&y` ZrY!Y㐒) z-U.R ߅ PJ %ɜ1{/O_f'r*Ƶ֜#](({yQR* 6(׽)&@hm9grՇsn9g%R*RR FZ{R;ٙsu)qYܷ} )Qіw=VYkUReRmܞ%|>;[}{}th)$sCZWkm--k'W[GGݽ魚C )r6\)&3̀ L]kHSs6*6Gr eJIH ) ?X3sN)"GKw8ޮӴV)e\v"}IgxHf8֚z>@!}b8`DQ uAC}yAZ)8F?"^)E>LH!r-"8¤0QJKm\+6]x c qRuAU/j;R?'T1^հ9E޻9s'VC#ƥdnʨGv9g=RuRnĺ\T:RZRKcXgᢑB)szg"2FCZ[RVn! !V k6R :D+6pg ;T>}|xo9oᕁSoovB Qr!~`E=3:K۶bBW%V1`% A)}!ޏ@ DRIޜ"c-sFunNqz?JfP+0Km+hZb /J{ e]W!3 4'8wn՝H;g2CDU&m%e7pàdSIENDB`bzflag-2.4.2+ds1/data/red_basewall.png000066400000000000000000002353271200563112200175160ustar00rootroot00000000000000PNG  IHDR?1 pHYs  gAMA|Q cHRMz%u0`:o_F:MIDATxToWAIdiLcaÆH1"A$HC 9jEzlѠ̑VɁ Av>0+@azN_-xp{zvz<ƿ;:=ܾw{sno;G[KÍY>ݝy\[3|w+j3wVml.Í;;<]as Q19>6g|6w`wpη'[䄣;ㇼpՙ/Zy >w3q2܅r߫oo}^ʝՓOvF 'ݽ3|h! %[8W'@{g{do3wwwV7VwWkxۻݍe> ٠+ i{u8BN3٫AlPs7&V H=^?GP?SpňGy摡<9Dp)a8s籷VvM"0o oAlPW13~!B@+9 rL2SDp ?+OkoovVOw^P*d}ڧP?T08s ;k Un~p&czp5"qyTA=* `wuyzo||x@{#&TW6dTs&Gd6`s7^_I|%>{t`xGG;kwvWf:ރ_%DW*gЯls.qx܎}nQ%vE؀o9 a!=zpw7qB򭅛q;*'#9B187Q/%#- xC憌l(ԉLp*Fb1}!"Q3ᓗi^u{{yg 7#~-+P V>NАsJR;$9Oyp wy4j2N˛HwH|ڝ) o=5DqgaWa$ 2 tv%Ͼ>ʼ/~ TjH uĎV  ׿9~ͽCm"$t>iqS6"9 C4?쳃43¿kϫ{hיǬYqDp!P6D˕s1UX0 dĨ4TKu6c. ͽNiZR"1N ncݑ-gF=G7e6?ۻwwV-荛W>v+BxA]dc@msL#dѺg?+\6=žx -(:*}AdCu#4HmWp_xa ! ")O[ pqn'Ć\T~0:j!a`i؀'+~ӉҚ`+]vda*@T|K)(.QtM J fƅETʼv`7͔)AC]\quT%i|qH\Z,[hwC~rybA"<3 s~u@~#nR`$d!Wix?ځd! ȑOƏl|Ժ"g~r_AHK`Ql b''D z?ta\E10"Ď8)7unh~l4>wzC}UNٯ__ ;0 '1J'/G*R -w˛3~DaHّ[~*|Q QFTr}.  E [LLFJqZ0ـ#Ka]cXɍ-#`5g0Mx8徼Ylcw 0H!AƋ:BA*(ҭ+}{X "oKT~MPd Qk.9P;[P?4(.楆78E_XoW`}w!6]'3>RVC72~pExCk68:^]}x|Ehh4˦ A3H 6}_7~Pt?M@دev\ZuqFe&@؃eK@XDP9ۿwҁ&j`.9"J1 ;Aoa8:N^ۜ1sC0 ɕpn`.Q 8+\u'^~9>,<+CCXHtZHYbF" BHb"zнx;Yοx>;GA꒡uM:[2ԟ!{=;&'`3 O4tW "!9Ŵq1!CzkF ޢ  P9;(>]Hv*VOȃ%"_\dCDd󋼚xF 'qKl9 cZIjqb{5h§p<=[;[?BL|i1o6[7.% i+QBL"UO :Ŀgy(v| َpB᠑GM!` LUo@yR-i#:8fõeUZd JcD\v=?ƘA8 zI8 8tiڏ Dy5L{[@'v A[ x3|SL跗;rKފ@$Q[xW)y%m,jRˇ(䷜xS:hhY$G( fxRZ\7v!Oῥj6 ]Y0?&?f<``؄9'26'LXȩ5vO3N(x%ɧx\5 wsڌs5TГ}h˧)n*vdJDقY AtǾ p& čIJƼ8bg2@i*N̙j!e@ъ e$<1ZF7}7hҹ\"rgPkuHXژygadUj8FB EyXKe?Ѿ볜p7^"T̏0#ZDƨ[Bo+k8IЀOK!O03ƌ{6+\o+9>2d_AO,q F:+aNJOL 8HrO C@|P! (>Q3l'i,Wfn)U:C~eD _1bX`K<,%T`krP*E1A_ Ncw3*kWHKF4ްWHLL *kMwٌ 3&:1]` {,~dj*IoEFnva~2 x4jX3{R+3l#9yz/YI Z6{WS0&j/Ӆ󍸛ˀ.佾`+eM&=&>CK ,A+zFMbE VEzϤAp S^ -pE#74`4NZ.ng|n8AW)$! kkLϰEo%2*Ə),ܡ`3TLSihzؖ( "L_."ٜxǹW~^Df̈rˤK#hvd%L+%"8ei!9+f"I(a.>M3Ǣ߅xy%ƀb)v$j.棨VgjW Կ >"l]'.x_ XCU)>ӄΤ!7QrWiQy!!E'%DĿjPVaC[j؊ #N*d(ljE|{v|4 [ѐ쌡p7:J18\Ó=B *([PRTv%q#ҁ("dM~buSqHCk5BO*6>lhgz o@1stݛW<6 IP3SSn΄PKga5x8ЕX8cqÀ%_VvgsvAjjwEѩ)ym8g f !YQ}5CNna(UgN =iά$-K!K@Bz:Wh;)d i\n%{dE;E;V? 8NOeR49Xb2B1}SXSCo2$<ngKZ[6z{xa`ՁAu C|*n $ HFXOY .k!AOD3 yLjp>QըtgS0)3W; uP=&㡖ɹ=km nB 2)Z{Ci=`2MYXTxMjxM|<%gdNȷ+ը'ZpY+rWY5V"s|DvL'Ɔ1zd~`xJ&* 5n+jcՋ),f4 jLw 2YhBZqX&y풠)iRM),KF2F)?5a;O^' OC˕R1^8h*dsgW@b:|bP)FRhѽޘ+jaZqUm/=~(jcL3,"I~!R)>4Vh%& nVo ).9B9O\ szgt69>zt%! 21m*aT)"kZQ&t3cr0Ti0T՞ZFdE*n߫4 ְف9nѠ+숂Y T nB[x^^x >7O`3IwcW/l`3jskm9^%&eUҭ+f0v{jҡ2@s #yRC`'VD 3y#I' tL9 |eKH | '۫*[4#V]]g 'ǎ j)Jl>-ZSڋc@3j6Rz@>YY-\M8Kzy=mSAfF(y5+iz.w(wedo`v,CDj8ذj=]*FN_*&NMdܷPE)dzB>fFp| "6z}K+U\S;lIJH'ɪ+@a=V_L#Re_7W"l,g1ΆŖKToۥT.߰`jE ""XbDppv6REv+aOan96#e>W!wr%ҡl?W fJ㾡\׃mbӦ K O=a#Y"sVѥ`W`SRv c=3H8#O>D=OTaU{oa*z/| \26*ԹL1<5F!Qr>Հ@4ج=,*<֦_ḋuf:)ۚʮ*l~cN6b5364UXVRIj1([g ~zVxM1ҫ 6h}_N+Wwte~k蒦l~ =rG}uzw̿h*M~ 5MnVzi  wvٝZ+d`q؅7`UM݋BC9xM^CZE5#lvݷVz"սٹӶU>_dtD4Hl]KB -+= טg0l֌ f`T[N%G:UN 6XhGaA"3gȆNNQHGi*@-T0TR$e0A . ήGUi(mh٣~tޱd"8(6cg(iV_xɦ}m>,CAoze!}PWT˵ƿ-Nf)#S<]Rքh+pƷrd]!Uq7gJݼU;0c0bc[omNx$̦*ڣ gASnk/7b\0o -v⇽uiN=];L \a@rc(CK|kh*fT}edX YYNktWcVWad@ς 4L>=@ kILla) o2H]^ 6,bEJ#t"f/$)hddj R̋)ِe֧c3$o iۍ7~쫉H@g)q nz[+Aۚ%Y9VG L"2#XR%z 2{bakX+o-⛬OkJ6R#]mRzlד`Ϗ$5IoU.q`@3R ޙ+iƢ?LH|UkTDOdGWo᳿}K|  -4ݒ{ƲmL ЁK6z!ۃrB̓`3E61"-e1ڥ`.M*'@*N q~%) Bk%[f1(QO["`Uv*6êWVUld Me9W* I ]ݰao9^$衉# 8B"Łɨ/B~`g!k#sLdp/BcPZޗ J݊ruMf` BffHڽzJw|nrp[ ?u>rYAlcŭxa?كfIߵޯ' `-MC newŸ0ѕtIf"k,yaβcVN94a)/CuS1fXɡ5LY͙ky(o\#\+)ʦR 8WA޽GskZ{hCH79aVݝ]RrJ>pVTh/5W/ tjLE;[_H֪4n=,^XޮM&]^4dSS_c:iC 2U}{gLE.6PoX$1/>Cfq`FʵM[+5~H2eƞ=by?Eeu59*Z>&< eZ )vӒOx `[O}Q8e D/cg]ݲ]v|Iж'ٲW@8ŖM߰ KC-ڴ#X3tg5H{):\ʅ+=$P#p~vUm'PC?wM[vrVƛfkm;ܪhڜY}QHUo߷LFE"#6Iфv#cC*NK~c֗f;&G9lBf}D$#HrgY%jwzϙUwBn4GM:vMV`.;>j^]v ,="xbsQMޅT< 8 ؓjj/rON`rcgRUV2Ξ ( G h^$@N/?׍\.R[WD<*ARw+ز rwJYג,zM!+%歯7&9>e^DLծ5(IR>-W7{GCVgc;ZQVXeLraewut{Rt*gMGs˙= 5ba.:w"\]+|9(--jsjZg@Mf08`t6Z]✚W]RI̴fk>a * {Nf{ 9b .̪zi+.Tۈ 9RQpf4UUYSEZy$Y5 a䰷Z@f5Z'hn/cH3-cJ:ڀZS^ ᪚8K5}LOС2 B&*Nime3ZռzWp[0;N[}]w@MK }h?՗UirI;t빬CVO@93ATΌqk2իf" @fPjca-:gЬ gA^1` EQ*mڣbP p͵*5 K?;;֥lzqM}f+ l'n^4~"`WCC8:}  6 @&I*Kx@`~.0  8jEO[M@R5Zzw*aYa_ ^(~ր؆%4,uhD+H>\')^1ۜ eB^^lK%j`:-4l,.+w FIMS-i*FQ_6FƆ&5rT4Ԉޯrd~;ٌڎƼ(--O֭U:Yz@-fa1{D2Q8~ [y8/r"1{NI{KRE&}5]t4x0qm8ͥl5 =1u0iR&AduA.KбOXM߱i0;b{cZ/{'176Z햌Ѓ\j }s{=\ܬ뒊3{& tƀyK[֮U2+?*''\HREU5d!T5.*Yw#;iVWg[e~(Uz[/Ojϲ/IװIrQ0Ih1"}T5a uE*;M^y^]ĥY.xgb`Znoferl-+k =, %:lpnŞpqtw~6ޛyy#n^ImDPIEz̙oDVl&`D -YeX`l5 , yK 2h[̸~jiK 0ܑu?emK*4G4{c&Mߑ Lת.>p^N? 2+%䷂z#{'2  1-KS6rha @&A{QhyC)q-P &x9\]S|V*쓚aͪsFxLҦ7,0ijHxơn]O\(\s*OO0ťb4d~>I~; Zlf͕`f\/TXP;͂lZ9;pIs뙯OD[5ٖoƴ zW{*dSaѧG ^ ev}S6UqT<gِ A%L_QCh*hU 1: u{ѱڼ"ϳjXoBֹ+;;TQС['z`3 (룯cT Ha5 ][fX:{iNڼ_? Zj}n%|IJ4iPXCe]e{ J7|  MIC#$E.$XNWw|d OJkU$  B?QA,5s*ulojXIt2L+a\yՐz(m\!`+{m0`0m"PMniܾnRܔ2ki|ࠡ_iپh$ۛ Sjϐ-{wZGB=qC}ЎweXʝӹPr\U|h. CvVRu^hӥ-c01NòyCʨh Y^u?iUm$m}T-?j_ѮXk{6(}5]"ϏuVmD\:*wƼum]3I$3PاT`*@D%̇Hs%nқy)@id;7}^"}#m׭?~PGs-G]۵(^]OMgWq:'l΀jQc隋du2 Y%A4p0{/[td4aNΤ%٪MacC|kym'3:EhRFT+U[n$[q h!LlHQ3ƭ]fX"~#7O+To6Dot H~uU Aoߚ1j#z^ӌ@DZsd]B_hնbm:`X_N1aN"h~N.>Jc渴|ߺE(osz x#IACvMz%hwzZ9Z -mߍj“P+Eh w!|/umO"M$SrH 0WhQN{z pYiCN }\Taatl[wDy \/O_+U܂\w%UB{8dv촾RJ!TC so‭QǢNj*^z e?35$KʁYL 1G\1S%ZoL2âq*L6(ZwI2"XU}jq +/%fpTp;&@EnDHo"BTRU]=z,(ɀf:5xn~[[J梚iʂw+P#0d螢kt͕0?wQhiq.TSphx 5;9hsٹG'"v*(V6 y ckv\lgk\zQvFy%쓌$U:{tb8RmS#bӳ\Gì$e] !ʯ'e/Q&6?[jR){7\hm@/!қ%k.(B/sBt:Mp_3Ttu̡_Lޥؠ0UiTqVYlE=iԶ.,6+/H}}Mt60T_(Ecm$f)޼@,qї` ?r?Mr{$z9^e+oYܤa-2%uqfOB{Wihmle[O1De[xԪ?.Yhʔj4Ur>9BV%2+I UhŜjfh5} `8׉nI@EHgU`X`_^ Zo)N `>6i}h4e2`g{ ލgIB&k2zOOiIs¦LV_:'hx!< lm adIVT2\_뜣hњnA @!-CWQm6m:aP}i=AuXoZֈ=kj0,2,Z7h'k5퀤P@I0_J2wU M;\`4 j쵂L7-o1Cw b-N,W{D@q'K:U=8лy5{E2)U=WxUq#To7ąy8O8L2P|u㓿8&~63m[g*6AR4}Q HȺv r>QP^Ja+vl7 &j;#VrH;3P]*X2x6ӱnr%6M56,Z8n ;uKԕG&`w@F揘.J_Jb=NpL|'9-&9mk04qmEk"um5;-[]mg U/fUҪYe~&P6G*2GhH&:s\d Z+4~( juWUȖUҴ )6ƯѮق_[:SQQ+RmB%_FDZ+)oٛ!-Zh:A+ (\ΞלB3=jEuW܁`}8z7;k",NWG{[<<5c9e(@s5+!: P @Kj[5dj;V:H9WҰ6]ԇml[CCmzŤ-zzPiH.l)^Oڪ~+~Փ#`!s3` P^U#?¿(l* {#J[, }vfz4mb_ P>[P T3QZUMXUuNX /L^U|ߊ4q_[IvزbC h\ԉj /;(=8Uu,w|8#~ -Fm  T=.B:- / jўoZU| *G*emuz'\sZ eilݾܠIUŕ؋kyc-Ar+C*3@iDB{7"]*Cn 3HG$%k֤ٗ5ϴ G±@wBB;)6}I_zM D;Ikكk:2#'zMb;&kn flAÚ6go8]=!$Y'Eƞ/ 7$ܓLs._/q]QU~K(1˚..Bc4@.o_:+z,3ɽwFRzS?ُ#>T"iNx6i! t£IP*QvqK!J_rW*8+=R+Lӕ$#U:d w=ɄÒo2xƵN@wL|֔(^bp~\\tEW B=#콜H2;,id 0?bv]/P-~9G-*kQ*^~sO\T' fDlZ@F9ʆ=(Rz|pɓ|e!AV)iO*_z~%uhbB{w}㓩bIm)յq^R["[o=d/k{oRf052`h,uKVqVN`:&|i63@3_Z[kTQwLTMjOD"#lu>\Zoz0T뇨2ՑAk @/iQ ھvc`<0@ ENmvK=ZǠήIZG9ee% Og%E 凭aW /i &$qt0zzvF]9Dž15/BY{=6f@-9S3F"(04;;Jkh H> %p9W@@,B7"WZo.1KQE2=7cPa+~ kѪڦ~u +ZW4 *џ*L}ҨbF0A160$C2*l11C=ꅬ}q+6m_ .'3XgR; H*29K%t!'b؁điHpΊ>#/zrjj3{Xyicf.zxADT/nVfЌ?#0Uo?Fݗj),T`X99tBH[llb̆L4@*9ztOU,Lo-6bVi{"o\u4fYYVV7 AR,pf_Nv̲ ,O|ëWhBMRP{]Si,gfp'J֡bLm1 nJ$axX%ciw=ڡ,,|'9M׌Ki<q(ڃNQD Z1*ZTm레 0cd# >^OނUBH 6Yݦ$>(YYDsM;|7M]6W{ZgÔ%A.|{G p~*~kL+]i+խtBeu-*wUс/W( Ђ[ ك#Wp Y-u[i^W6y$a<6(JudE٨kQ Ph&fj邈Ы]fcjF2ϘoXo9Ҷ2'2ٳY7]6'q~&N"`4V4C}dHzZ(Adv.Z_P8㝛Mt>[_Z!'.OWs-"ygoR]uOG> ?x[Rab:m}?⨥9!S֛otLhM̉ t=SB&A^|Ƌ:k\CYu0U%jGh1ݶ!bv-Rk{ho 3WBn (oW%qk (ه0g/')j纛enoSp ,dz?ӎry{~ҁȏ&biFص?_![rfje|u#M/,lVOy7N4վW~4_E:`F6@+b0"JlghҺ2TZA)W3~-08>y, m_ ]n%l6QQc$;<+ {^I"Px_n/3MҫEfqr VzUҕ4xc3BX'7QyEٻ+q*ǰ&j2T?1iIǷ,3ռҊk[k??zǡh[^FnLskKL#;3>̾ju՘_ Sp:t((6ћA :t=k -:kF ݀38PHngZUQ/&&<6+3pgzѣ>lO0.5 pq["!hZɭ ؘk?i6T{ol O }:>ZR [-ozZkuI$~.|UM*? ۑV,`qe8GЭK6i u~>ں)@5p4.|Cڵ6q$ A/j "o9|oA0l&D ;<ܾj.پ曚RjtuY6"߬U偆`HO~w3)'Xd `ւ (Q `v@6w;[<^}"]6 1 ,uz~ NPU,~ض!*syLz5T5-.;,-c*6ק1ڪgH3uYƜ6,jfsz/~;>w#'M:;Yi8g{S T,5͝$kWGr+55El#zo\"C46̱QfoOuf@.BϷ}I`fBi   pY|M XGHTg XܻB8vm\:dE*~CRS0S.SkkEƖOڒ]yx6et!#;K"#kt>^o_o Fj,DZFKPк{,Oؕte-pNr+JGIьQ^ t$ Hu$5hvWe{^xWo<c,S-wa~K"m}ep:*f~)A9~EֽLo5фs-ؘ"&ˏ+?QKZއ<8g}~f.O|7yM]~99lbwϗſl&Oz8>q61|b|bbbwSO'&9Uve;p0ys^LL>xNFd19>.iL$;m..8>s^e֞pQ50zQqNåaKԣ<ɩ:>L1wu;6əy^\T?d<9#yS$xKOr9~Gi>'^v͋/>় '3/j8m-X'<&^%ۯ OO]yRO'-grK켚z2x5!Os92wف<oN~l[3HVt2+^9^ YB y'55ynQV=_^U9Ư.Lgr 8?|!pt&e!HQއ&-EvupzQlVq&Y.y:(xZg2oEO OW3^:dHC_W[\iy^ 3E1HG$fw!eOS߆ kQq+N^BnǯſL}c>|]4=b+ZN{|>~[ԟ6], YP<~4>Bl:Dx׍qmƠKkoC3ǹ)( gT>6dW{IG)W'gQ%_"w&&:=iGW;HV-§͞G#]4dm+ZWȿ%ﲽm4£~AA ABʾE$CWʹ?= }_Obt{v|TSzwZ~푢]6 _uYge2]zʎiDNZ]]^qaʹ^6+ԚDcr"aK w~ѥK^uwawI_Bx'ا9&FW)zUS)ZYZ/`>$ͦx9W<24.C8OyOA;"iHE 6 PV'\t1W^Dxk=c뺔Ͷy#5d{'@܌ |ՆystΚ߉!<>i)X -=׋&DT= a=S\ eK+wF^;b(Mʪu4n˼jzd;9H_q3PcmL7Q"7\. /NWc:EǤ芄s394~LFn"I'}IIlw?_.SXL(o0_gB5.>y| x.0:5ƀaJFݯ"b2^w]HD+e(U3]^燯swOc9zdy7IŢ)' HD~8+6~WX/] ^1/>sTzÃĄB^5:<$7Ea&O @$0zI)Өk/:I$Es5{޵g{V)6~yXǑG cv/7fBrf ~<ieBX+E|G`N77~0|n|pAO sn84R'Qz%!dtIT{̰qQRЫz[8?zNJGuꓰӫ=dx?!ૉ&dSŀi[E>8hEJU ¸6KyLWv~'0K3-.ko£"_4LZ8 N PK/Y(^=fk]4_ŗba o3wTw-6LE|؀c@Ŗٌp~2!4Uq Z!NHmfJs4f`Omynvt.jS7`uutu%t׃9DYp" f4>ÔJgK8_M̧ j CNSP㟆5{ Keu"4\;ϛ&%J}q ʓ5X[0IË|Ӽ 6Qт1~Q =[,mgdЀp>sl K%o'Q[U6t2z2A4W_FwqŸ*;u֜ф!>l9I;5߇x)ѴyD+Ez=LN1T܃ ~;p 2|Uda'>Lb< ~>SJ|bb *`&Һ+oۃ򦽂o"đDZ4IHޗdpBqdЏvbω j5,q^FŸbԭ q+ѨyJW~<7mO+ב sBZ峁j=Lߓv;<`שzL4^4G1^KԠ[QwmHjƟN̡g͒|^dɯT }}XOK+w9p _'-~(xF'uy,#?)h=#GlFȫRɤG=}}}'y}l E!!(NZFn%qq>NMFǫc ],hVBR6=͂Mx:+z?}a}a?Dn×Mp4!4cFӹ9݌i)@?=l6:zHXm^ eġA ?p0bD7Ϸ-p!yG1sALbhyNtrY"-C/C֯ZO"cTcDO3O㼊!S2&޶ 3?lȟPKVPD'n5FʟxG2+3z&9L9Zןb?k'ҮAmjtnegQdN:YK&túJMM:/Z4U79O%AgD=V{ؗH^ǃ}?}W;YUf|Qʥ.F&@uv,S[\]ԿGML?he䠈zֵ7ABr4@S{HUdt_$ c]d\;.xAxi ?49 Cn$OGYI`xGկ uXmEܘwe$6E[ҷJ8Gi.ao98 0jaHZXTpsb0f_aPOflM 9B9 ?O){_&ݟ73=k')w{IԿJ.Qp(~@%(aӬD>0r8^QG;]6oO's$Zu¡X n~͈*@3`Pٌxƀ+X!v,q9?bkUc[V? qSe;4{nH k8d$ s#E#KP/hntr;_ͷ'M.+7>CS[UufP.ݲC]pU|M2.zsF5#׭܍u*3n'Ii|ʬ>]&Z PDoO߹t/7(&e鷢pV4m;a^?<ʵء9S5&?MvNt'BHn3718& )5<b~Y+ rlJoж(~ф@u?3nQ:7Ɍ'͝OOFp0{UUƹGrM-D_٤!^09N<-U @^Ɠs58mͺr2|qyҀ`5?Z~[Y2/20P޵;Ė+(f-n*U\h21ӝo޺sA"0Mޔ:ԶatxqD,˰yDD/ӱ1k8M䳘iRr.$0?[:,<7'titς?n[NF\Kzaԝq r }zE/M#s֡0:8ʔ`=\EŬ.5ςP^Ddus5͟ҽQ: /*{KdE UU 5@M`'NbWHҬ2!nn?`MwInҀ&+!p/ENŸ^L=*e2pd4\4N}T8qY{kMskI6d9* B@:ET ]'۬yE\E+("̘y|%9vd!le<lۉJ٭a (b/ĹvxcB-mK%iF8LH 'WMSo }lk [Feh׸0r֬vfl sz5\ {ץ8f-#-]ϱu3{ɏ+[G٘ۅ4P#zbc*bϧ'IϢkOyt+NiR<Qj+Hhl\Ts{[KGϟ3.&:;.Msey` KQ5p?M|[6E~00yc] #S^}@ @xiTtebO$%M~|cahK'Δ{7V?@x,I"JC5y`jXB W5̬4J[]Ȼ^GvSkoMc 7FNX/ApA9eߧwS{ te[h&@82gDBuYB5g4}_DZ*x|42$[w C^PÔ4\g8NRpz FL{WSB_`gu {Aҵ @I|lGP&ed9.O)>e(MBT{4ȝJU[٤ uO a&xv"_25;p6A/ؚ3k2wT4_nW.J326k@/9LZu(c1$I9pLE&EP8D+z!@(xM y _}UrWVJt?;{EչM֖octϺ`$ʵ8ˤuȗ'd`ShujP <?DzS;W`Sn8g6Pβӥj|Tڏ ܬ]l$_s/3V]p! A9I15*u$8pgMq:rhZ#IXԛ ;zV'$tlO䜃 2‘G(EHfc.άM OOf MS}Dk j?$ }H#V0? 0EP4kLY xZI3xwA;20W6_jɓbK㊗p@1мC->Н|ҁsY]nVv="XdTCc K7P9By+XG*p_B(ǰAٶֻp3 v-GK$gn~ڪ[AwÚMټ['>N1G2 ]$snJ?ә uYsR=PQ d|VNCN88s.0wUQ[&ӓaUԏӠœQ%%QtڡfZ'_Bkw.ˣj~75^Ƃ Ӧ;j Wݸ\_P= e^{-SCkIs){<ߛa*|[2*?ώ3#Ch4ŷOavUZƥ" )0JeKwz8\OD=Hea[}YgKۧ:O'xuQ%YjB0k2LEr([Ijc'[ ]& lHi;]^'A`Y'+w ZJ- %ٍՄL-&&}nx)^4mN-]@9~(ՙ VV7ps ,i))@$14rp|GP-]{I C?g?+č T fnqj47xOP4oq85_rcnN2QV s?i(WZ\y=yԌX''?2AY!)J<%;S9nK~nQf]ïADF'Gſ$rr$.iƟdȥR?B?r%6<(tz~/4kWcϢ}:ݠ$JhtnojD"*H}(TB.YS'yk]yiMztn"#t% X nXv*5+&~DC8 <_xemcKPȡK!_^$rhDkӠdzTv5t/ښ(D+. H zˣxpC2ݮ-pG :I4vKۀSl @gAAhm!j+9o,tE p уؿ11x\_:.,i#>u]- ah>pP:>$@b)•# P1 @6 x_aVOQL LF cp)d@~%k6eOȥoΞl\X ,f=o|%pv*ўL-]2< ۱Uf+,,Ñ(Yz/,?8q,ނrb\"()q.:*lK D9Dqp!lR4;p/YPn[g֞P8 Ԋ6Yݏk2H dD0ա a ,rmʜV]Mc`A> \=a ZwnJKxaC&~_ kBC&q 7hKHO>5"~8w$su":0҅co$[/#"6G 5s2\~Qb/g7f:+ xR&#"Qi=G _[iqiA9Զjd!kiKE( h[z'=7A8 sSj桥>*Fj b}Жm3aLKQBǼZwcS_gfQ7bMS'PNS-z)_3rry0YXփÈD+vOD4pm$hf@9iCa565g+C- 2xq @$E-Yb[X&̒qQs:CM-5ϯE0۫;]Jٓfk!?=˟P T}0%UvJпӈ*&ɿ*K0݋z>(ބ4eIwKuTO5p[8q4 M[A?qÑ/3hGOj1,_K,4i4 Ms٭/*}m3Y9: Âf@3oc^]TڛVQo,& >mhfh'ߘ"L&U ,W*SҨ@4:,h-1[Rk@gYX`Ͳea 7RU,KK< a`Y}StST.XVo`d(C@#>#%VywtςPL(bNh5Tu S IwMzpf_TJ<^sC;R*Z8O 0vIK+PI'|!kÌL)4E5'0 vof ;2&^?4J+]g k'QsGIЃu9d&pJu)- F&Rp.6ۗ!:D xcbSypup:r?si.ҟ5Ռ}vsCLgU< K@: j zX#^9lO:A<)TIoL[`n{ W;r!/n~hHKH8@?`9fUѭwL$oOqK̯Tn3쫫 6NT}%{QZǒL%޶t~7wdɲٿL\Z';pJ2 -64l?0Ryk)^0K`Sw vM#@ ?HٹY{g1zQYP{)vH~"y>=bz#~ܤ{PժN=,EcT3h,ɜ$FWa]$\u#J(X5Y[1V"%{ўI]g{ϛuiJkfjm؁ SF+3?\&U+*. {a/] ,SqA,6EBR#Vfcvb;xH6Q3|{+%:mI Zх _Cёij3Isxf_}3p2W-/V@|_oB/w>d }75pqR>).mC=UYze1qjy0pVNGº13%ܪko@UNy&!SJ2 (`ylv@.٩{f,չ{o`cy)hª'fag?U˦`Ѽ5٠wV:лqB~h?_qڄ1<܃k!=Esh'㕺aX9q0$dO=D5$&zh=1z R( 5.5/@^GQ Vuoact(l:E[:iۅ\9ݩ!VրγԑuVn:LBڊknqIݒ(R{\qo-[u -eL,kVft>*¿U*_hO,x~Qf.ۃt1""hQUg%XQ*?H!؝YHБi2¢c9ESXXբ#Ko4#cOmZ1)&5}#h@w#k{1Nk{hs8 X۹2[nS} _chb#$zoܼ W 'M=sK֓EGK'[r<(ӍjvM6wԘZP=olrz&w^[_aE.*l'4u3@v (pSqZfgz5k  y4rK+¶G\KkC+zy/l5VO%xlw ϷT$Ҍ]֥#.~7vX?֛H!'.rKa_XayiD\=xb<9(3γodץ `le* =hdeKMIZ@ m2TI֝%jIYwA>pYA5-<T')<AT0(9p}JuCqǩrPb[kO!|\2d(iq_{K[tiټ5ķ`CMVw&;0^^8u ɢLd(r8jB4t=-bz8/8=0.,TISHqIb 93y[KkQzY/^3$- ZZmAӸ9q8ݳ )^w>AX<콍.,7!j;6?{̥'S-bE w4z/gQd)ΏmSnxǶNw/ԳEpJP(SN> \%R̴ uF.> Vz@ 5}LD8F3=wi4h!V9otR 7㙅霋V}P23IjM j#6wYXS( :Z;CW 7hjIJ:[x0jБ'es7h%To<,uְվfN[]YHXK8yw'(H,ƅ񛅧جr.ͨ,#fIͳc`f:0/l,BjvfSR[ +ŎQkFhm#֏bA}-ҳh?{PwꀹjuNWi84䒵Q"7f_Sh#yfch)rp"$@pGF|S :]l߂G42ر(d4u~k0 SKLp7m&َزjv6,$F@ ͤtϣNԽ{X??C @4.6饩ؑ_w@k0rr0NL#YcG7}&sm)5*VyBݛO %7ge=\@jVR pYs!)u\?qk{^;>:sB􏵁Px"}^x,,ߏF3q߽5,"H3II+W~7?WbDuY*nJO$- < GѼzYUԭ`d0ʶY0) o9T;'x(̈<⠘Y QbT`2vv`HtPU!8({N۷hUpIٟGw4I9-ŗ<,b>S(P/[SwE1 B%xPkZW+M_{Ty@С VQ¶zX5`\^u[ q*2yAWT9FȽY>ƝKhjV޶:Y+GD^ГWAGxfm&ht _HK⯷M+!!2Zbm!إ%On٦`X0NwFLd+гph>/h[K2I'ab=`'A%65f,م@{F\=6RQ[ja[II'`CCa?7vS_$J89֜ >lmؔdLS9Y;|/j'?jN=y* BkFfW"a56(tuk%a,ҎD-sL˗dsaÔ'צ{PJ|sY֫ eˁ3UͿm) ԀKK/M:bf BnHg?E͜UMdI #O:8D|M B& C<6jm1}ό' zUJpK&v[39g6jAhVa>ck.x0.|;RoSQZ{7Β#ډ1.<KψgvKD%b;ABptد[ e&־iϒY?3f -0xꏞw`vnqnrD)">R3kcRC" :ZX9k<Z@P)`Ӎ"T'"N;{g`po[R]MG,ey26EN^6s^o'ILnMP\S!v5ɞ ycD@/SSi+*Xte`x$x E <(˾ObጁYM%x6+欥JD yV؍ۻ6Q7o_E}`DiNQى#hBSnɰ>l:%Z5М}es I^q٧ݝ<b16Uk;?2=@T"fZeqL̽:}(?oMsNJ\&BCK h ]/3ϕ)O!r)`}:܇,ER䇦["x0S>a7S%Tsq7%ξ:'+*ΰs@$}jdY`ϥ$ۆd%'+,f#a@=DuX݈C%?5+$,zhwN&ANJх4ob` 3GCHYv%7Gc3f+͊ _}Rāѥ-tga* $ᐿg;NnYiۚ({Q8.l#LK},&khMK4󈻶g>c+`/-5vrz'ɍ+N Oi ^?5-FJ @vj tT.מAV-rATӉBcܴc藱868z8*܊[f<>Y^cj[5/=O8,KҵF,=PS&,][t $WfSSv~!ѧ-4ޝ*lQ2lUdtfx%ͥg'KjWFbh== >ԔI~ծg.N@yթq}gQN,*AnWߩGCuĺh[k+m.HlF/VӐw8Ha,aI^4G\j;%ZAtPHA{!}PbvBg4L]]vwc:GnBd%)G8pXOV2֨ꗭfmSwj-9n,>q}`j"{ص31X5OYl#zn[ G;b$=lkf~Db!$rUDƼ4aE7m"`$t& `<9v}1,N ҹ!{W{<ִ, Kǎ Yg%kcdPnzޭY9#p&ERB] PR3{K7ߩ ٚH|kvto&q .=3i.聳&Xp%&Vʍk'7<7n{ag-hbp)t*Q-t4xDM늎Ks ~=wL1fwDe=[y-gKS:1BV?b<`Z)fb,'p+˥XC,*)&ؙ2a}ByK2IL-^hJ_5Ĵ P du[Dt sI΅gw2 sg Lݔ]=BJܹu&GI [Hk6c+`O{95.7]Tj72J :(NDW[t5Rb^DZ +P̺;;%o Cqc-[ :V7m߿_+h`@&5ɩ ϾƑ$r2{wNK?dx 0EY۹[s+ͅeU-j-F2~}JUt/k(&z6DZlz7Kq{_HFӭ.a3]ގB~T'ŔW =sb;c$:(ː8İN; IU'[hwR`g 5OC_ EKNDcJdb섂wga8Ud5`<}7/o,œsv+A.vMkk<͍d[Ս)"cw-]ϣQ![eimŽʬo7#P;`peX4N{9+7#Hs/\_=ì5 X@,۳2 hiN[= I W V8ZfI{y Eb3 ߄3PC=H,?i/jjȉW"Z5Fz*(r a=4:~oYkQ/Y7Vٟb7dX2konѹHa'$v)'l|'y2ά Pzgn !si!n`Ё5<5Ɉ`_mF%ag'yƗJglГ:k8:M FgxҪwgtE 8QxA玈C'Pg!K2}y7+hcDN=s?h+-xaʤ\"p%〛džƗ,5eMm{K'8Qp{Ьt"?iE)Q>gfǢ3D.;,L̾s/G6+0S<(Kn]2xTFx7Nғ-}XO>rR5'JHھL8!CqRՏuI9e(B::naa`$E..͵P<@7v` tX=Y`$0zRA'c{&M]/ZE)DDHboa|QKl9hKf%̬yINpT5m옵yFRXvwu \dى,%3n0;`l[ aמ3/LWIaifu߯B^(^>dF- Sj~,p2r "Ǧ VzU< ?Z*QS!75`0%4 B[jn:0ƾcjjGHڮvhqlQklܹy$+3@,4A~N|۰.͵$}Vf?FDrᎇ6WoD^R "X?;@flsL/O?6E r~F33hMYKRecnE($mb5%rӸMBY~t"4(l:-{."< Mvk6";u P: Pj::v#gQ [<#3q]sH@A}$Ï{Ïy" eM; GnްGP5by;oQVs6ōe\>d73E` xtkjR ]{^ EE5̟ 1stˆ\’xnJ1\EdAO P^6I\Jb1ޜ)uzu>w#oyhv2١Ktⱎ}Eh-0si)4aؚXFB[ghbyu2 pt]Pfpafݤ{1m~qiEb^x"!p! fΙeXV5r9"!@čB1"5l|x&ޔR)_nLz#Dت-]zh6՘rF[M:jp}C@% S@"n)h+i3I"~j FG#'gQ/#^:bx&`'y33rWc*K\nCוO7srgPv$^Ic:5Et 'ɋPˠ@#Vb;Ƅ2EW^YpSd"Ѩ v!*TRc,ٹU{jڢ D{&/LZ9ܯ[ހp&|W-5XC77qd?էwiaS3`QBSssjXi6iI=|}iAx^N6m4}W)u'YdN Xn&'b3]|-olT$-5h`j^V*aPV m@'Q95:1 ƱV{f=tlyMZ  mgʦPtIVܚ8 *5qρy9YU CȽH lPA Jډrfbmi!NJaatA CVT'V̛5U &9w@aTspQBWkoVK+ $ =tpxs\QPC({wfܙ3GJ_yyؚ=3PfVV-r av(Eƌ5*'`^D$񿏥 ޵yyzxLFBUqa4omHD{0n; fU>[qd>̚B:ZyHv,ckkbsA43 \`Y:EAv& xy߂6toiB[K % ̃ YkkX3L37@~Ήva H< Ai%|ىY5N#ʑxdHhT x[FDtZ>W' :l8Ф{巙HT*xn)m7_9KY .wt.w:Ns( O=kJַKiڂMHdX-YK7:~LGXljb\%IcmBxi4v'ԙܝ+9hckMr4›+9أ[3(Nv )?x6oLlIJ3CW&>4yƀSdR!޳,eS7 hlwrq ͉ f0 z 0|(pce[Nץg7^Zm!|1tm(}낈#݌f6!"RB'+!Vir&́]lmT`UsXne079YUy5宆^'$͑>0fRútzJߤ5L(^n<3#*\;n i9yogR`jXJ^;-}0:rF';ͦyp.M:xw;Ѫf TPP֋WYNMdjK{ riGKOښ)|lgW3jqkO]B8 YN@#|Cf `gm$tiوb=ߗ( eyDa{pAJ"&Ϲ'N'aWxrP@Si'DғcO>n QIMHOyfrQ=;YלP<ڱ+>uiMiynv 2Q:X<ⷳxRي!Q˰Xύצ<^9n61מA0¡INtőSÜQ;`G3.-6:Y }̩Kg:iǦ6V5$y]Dj&64LK:B;uܩk#Uڞj^F`V[f3"C@5~&A,5v@j֟U.os9Ǭ:(aʧL8D4O(v.=xUMXM A3nkwCuH b$ Jp\'5*ABGٸyѼcVg @;5q3CV7fT1kQ/.TW.yH<,! OW)oa 筟z-݇0U)@sCP{#\db=؁g3% gQ `o]oŭdd]toͱb\zfTl%wuLM<|[(y%+nyhxpO%MvT[$pX:3?wB=Ω!I}敠rf!sPDhw$5{]L15W-yfN vxFϯ<&f{yߡw۞3㊚Xĝ/h@]G<7NQ-Nqp^ԁ-"Ga:\v']F/u9w)Y1gnFjq/ #GV^:&T 5 3WsaO>ɆF.bTti ;~޿l7[;gNZ"z3\q9`1t9OԼum8Y!(&t*B zO,=R[ˆ<z̟yI J?m85*WYRd'-)KY-,CsaQNϫVo{) `xkT+C9cjRIj~iXI\d=/?qW y`hrR7eR. $;$+ܘ0Xw=.\&nsIvGaA`#j(B,Zg:5T1&`bp{" ,R`l,ES֝j @LwK`ҋ+S5, ѧyGtkW js+K=i@$,\|!@j԰F1xEt&BoqV9=~:a7<Yzgx!+#97hzr$/MBiቝN}SN#x#2J9AF礳-wO؈{]e-yH^b4GAwHsʢj[ &{#y̤߇DyLqN= :5d'+5!yN` @us5|11P;{I.ϩ~sr[jtr}T0 e ^5(5e&ofݝa&c7o4<Îm< Nyl";IeS"O>JP{a? Q;Kyb?,]AdU:B5cݍYX"nskmPKL# n7 0*|g;zxJTbσ=*Ԣ;O8HC+|3+i+*GkkV6aUƩ_ؿ` ~jԑτf<(FVS9Axf=tz[(|?h;dKxt2@T4y}f i+xd"} ՘OL;uȨ#}Ռ Vq5~m<~.< DMU{%0G{hz??:}iG?~xԓ÷tӟGџ_<|~/>yŧ=x''8~vFGχ[z'u :F޻O?zO>x׿zt/>GǏ?Ƀ>j'w⳯}ٽN>:ɧw@y=cOu^s};xVMzs{x=uӑ>~޻}ǟ|p@O~ѻOEczt_ocٽw@䃻o^:@ |yNNԧӥӫs7ڣ{ﵿ_rV\ ]ݷGo}|tO?+½>HOA"_}~WNu}ս_q,g:Ftؗѓ:Xs}/<~W};S otśGx??>eW_?"{;NBu{Ǐ8::"\}vW'_|՞u?\:cPοzǺXV8WZ'::;fw^ss&iz,=3>}O =]?Gэ#K';~bOo YK-ߗk=:)l ];=2G=|3cD8d[7P֯suӓz^gd:z&|釺xWn6Xrܲ~Ɇ>ɿ|o8Χ넳;oR4FIB7~7+N.uM/asٺwzI5O/Ouӥr.YV`3'uݳ!^Zscݴ S&͓ݕ}x oTHfK#2uuQ@Ƭez.랎\B]$]ZOOozҒ`ϱu.erzq}s\ 9!#khT-ct]er- L\dZzNjsнW jҿdzO."KzC=`7*šupR||֯µ6xzFoIYDd Z3uIx^S*/I#k3le\ocs+c}s!/rz^&]-w~dz7?&sidvzF9/K!֓R%M}QV& T+I Y@'hGGŀ'g%6ԯ)릗$Z z--=lX'[`ez},[I,7>!$gOЕV 7F.+ůxտAT]F{ܥnJerכ}?P(bО&3מ_KF"IM疛[cȞօ:NM[e"Z׿vorX eDDzRRO]ؿpz&׻qgwoduV:׉H dzސA&iI6rX͊"d"b-U>'BJ*נ`'NCgӯп3:6_GzF[Nˍ-B:j7 Iï4uuӟo*It}!aUy FׅS[AA}OVNb?-]ڄ%#:+&x@Hb!]wxh}ܙ Z+)'y-]|nvk\_Iʽ`%։>D7Oy2q}dҩy1yv]Y]fɒ0}JKKпt uTB-P<0[!iT17){|#v|w1 S+h{}%-wmLݓ!(.ҍ!ͷ+!peih+ g=I2coVF蘷~P>B76o_?/cZGi{0Ag 01:#r7es+2!6qWVKcZ d2}E>҂ s~wGD&Zc" +ԥX1wwoHs1st^dӸ%}/z8"G;7?Q犯ɖYDǃ1Ο:&"Or]QP\RȆ trr4H}%!jez@Ve#@$ՑVXK_;=_a;8RB=fdAt8f Zٽfatpdnk=Ll]V.)"f /a:1j(MBǀWr!(2n}+L_PvUg d:xPMk@Y `!2\6n8rÚ] RzYTDJ;)h+}L==]e}I];oWt#[O" qzv L:ZB>pI̪s%@xS^_Z@DtqX!wصؽqD6r !b\?[6*/  _@ʉu oBŀAvL5pI e庑af_=C>j(L Vu~Hgu ^=ob*;AA}@Cz^bLuɠ,E}@2EAl:FgU"tţ3un'}O-ޱˏ@~. ԽOV6(C@.xI+"H{$ Z~C?M߼ Wq?X\>a`x=62u ABuϿ*;{]T}V)~"U݀-o.΢cDDw>qL tHU8_(/.&O`1u/#&.ҫx7=A<Ȳ?x E%K&XT'SzO[,ZDn y AT:\ +VMd, @y !bK[ZQZ$@2t|-y}v̽*(ps_%JdZ 4͉Otee߲Q?;\JaA=+ O5)U |yOX_hyo? k%xх#X !̡ ,TH& D %Cm/@Ll8O֯tTj!D:!PH5DW1bU &,!,S VaA,{Oz򐧗u gt>B/F}T.#c74aMAI,D u/k5,7^g ٙ'6$"~=1zU]> ҇5EA2}ٽS nm_zu.{hXDz2ZQFTШ (N=e' /xoK-mY(vE}?{Ly/ddp?=CyWuԍkdaR&FÞ|_{dz؎H*{82/B?JkOA_< $h]6%6Y_3 4? q:@ϳ6yѻc=@kd:=xԑidDX@d J#.wrA\)6A"8 ՛ʆ5X)&b_Qa-!Y%|P$oV!LEɺ\ba7ظnl>5sm">ѧI8 EK9SyL -TKփ?~ɱ!0F~pO\v)Z$zrB-B VL!x-; >o0,Yf o,SkGUѥXtJ^g_@ߍE&dãM Σ' ~d~d%L< {N XQ:Rϳ1k=Mky!ЯP[І|TU^|9!כ`XEd) ɓ:ull,ND޸8 :j@CP/;cYR'~/<0;61,-]VAEjm` *Q*j$!hOޓ1qױƢ7O{_>.C'H>#;#SDf+**#j%GtOUzgu$pc|nD:tOMlI xtCS&ˑ Ȍtt@Qu|@ Ӭ'׫ժp/ýp8NBIPJPQ,QtlQEEѢ CpiMsZ0be_?3Ɠg{3;{CMBH7jt,IYA; ;6I0obAge$3*M8F8˜UyW%r A(euOl^$u2LsomL $߽$`L7?ÖK (Ay[ݞrS x纯{fnap\y*gvFcZ͋=j?ݥGo vkW3uW,  %I h@{P'%@B{F7Uͨ vt1ۢ'pɞ,YuO{k3@y.M&BǞzv@!+>}{o@f2s;S-@$W1ۇ ߶@HnOx Zh((PTv^ފ/r?jY|o3wsFhO J>6vvۿyqDHō/jqx7+ծ)k9>0 ;dwe˿e5b/w<Ar_Ott+8' AEH}:pU'`V r'BnXk?춵.!$ƒdS6`A.GB,b 2(D5\7&vߩ.E`vwXhΑxp9mGm{rqB~;~ړX OcE"YqafX~ LNzs",' L>o OQxқ$`-_Y!n,M XN -\_LtI.ީyΖr|~ќVW% \R,FؐBSGwo^,Ϳ_hX. ueY,q ](a66Lɱt$@v0TKMCWd~.WKe͎ M+7qAV  *\}0OC[@xؿ 1+DV_3)p:@-<·5w2Ҥ]RÁs ':H8ГS1x\R3֏|Zv7/sj퟿{YWs000w;yh}i rgXTPNѹcm5a"R-sp_2(t8s~ j #/'=V?WU_BdaQ/ ;r_dNsΉ{~eS1$OH]^TMV:tȄJ!]<9Ճ}զ㯘ya `rA !3_с^ElcȑbilWHձYA%SJZ@L'оbvoלl\@o܇n[o67r3C(z]Շ:'GO#Zi0DB~{9KlwNW KoG"&u} ">2A&mFqxh`Aw2gGv\)?]UOƩO *ȏK)JS 1ydrIZl O]t Ld(H-8+ P~Hzx櫥šo6hQ(ܦ>+6M]aφ]tcS r'>W`1f,VκwVX]frޣHT@'֣vt铞$3,0ZY"ۏrRP0(+T{`1mpFi1Izt6[J%4$=њzOޜzz*vv'~*:FxOϋwj+,fb:bB;4jneïV3 us?D) uBJJ Dj'@Ż5!t]3[:SKx0;JIѦ~u'&8$f?B-&pc _''Z[r,7>Tߡ}ݪN 9OGnU^?)/1~6v4C(MK>mRӬted_loN X+?BzI c`ӄ  2c]zEF)9ݱJ`>4)VX^2ٔY@7v{1KBתq]أ&6Hru_Go̦0rCJէe+۰Tڒ~AowHzPB!!p5I?xG& 6 2WᲸjF=ݿf>'[k k^Cw:`.%/#;{<@l_LNN[*vO2Yzž^ H)B~y3jpO'`YZ<w]KD~N?(ORBE;i⃒W!/Kn]/a#KXܣzRenkrLڻ+@?wnYbD@q\l|V-ux^Rf'/]FJGP"J3B"; k!8>9t3Xx3vhc-`BֽȾۥ3$0v2DHy͉8%I]/hm{}ʷ!xĺ65H@}om}xE8x6SW} e{"Ҝo(WWdܾeVwS_s91Yǵ޵33*M 39&{5~n9_@C[ 26` UK>o_$P.!.l-*4gHXJgRod&+Z #M+o(I|nLxs}f؉ ?/+nKrOQ9pzӎ0m7ܸtlaG*kwѸWÛg*UzdeHr?~Y5dN9pt8psV@NnbD#y$>HSes81=k d7 s)xIn[Mb FO S:DcPR }_Aaa))geTpէOd6QcCz/RXVG;W$WJ0e>}`b=!9{ˡ 5pʌ>2|R=xw]IY@pq!%.Nn5&}YVf ")vNJMiI Ld朒u3FFaV|O$ -]xg-U%Ux&yW@Fk=͓15H. j~BLJwr=n^GVjJB:]Tg#K XJW .LVs7Z SE,r'%$lj{dfW`ࠄ KLhq[喟lƴ{u=dyAp]fE>*"<\ݍez,:<~Tu-;x!%\ɊpR "vߎ: sjΖkl7 yܢS5]xou2:$Q"%y0l,ܝ<&s)cj,_ݭ;P@ZbUo\{d 6&UxNJk7 n ЄZa}AWx nßɤ{ѶLɶCkJפ:j #tko~R rBrԿR/y/ Byuk<[:` ۲Jǹ 9(g9|isJXMĊʵON.((n*ahw+o赫N~ꞹi*,b`%gClVGD22S~/RƙWw"C *H[()gQgzVdh%7.I*STtX7|X/ij$9}_G4' Cɀ_K\M(EЊ\+9cv}B77.j񌽣 ~MHE7tB U{"8L#v({8Q~eDۺi6U:i~.po"IYMKl"7Y>?'Ļ)\II bdìCAVIMjI-I%vt@}И3|YZ7_1**^C^T}.9 K3;<=x6l0'{~\Vհ5Y8;JJ6_=U沙=>HFYI5y&nf%wQ:1s蝚CL(3=1~a؝{xkŃig۳Xez'ѫN~0(NfQSX@"BhΊJa];~z1ӑߋ[p 4l\$˩ z-d30&:N)TA`Fp='}IZ2$}^ Uۘ* 2m+Vyxg&[zh9,vzbl$2|hűں'fx-cpGK}廵jM(HI% yd}Xh_Zr',QQ]*&<ީ旬zfё31dV2rݸ!%SԠ\7kK,'k8n?fwKi#oGLwcDeRY**7 .6~V~4`Av~oҧ.?<sWAR+^wHO$H[R 9ß+H{@wdq i4-D2~ o$jegMX->L?\Gj'.֧B[&2iA*0e >*-ܵg-^FC Kb`Ai7Xo 葎~c{ofO+>ץ6{Ub?*hIZ!FH' v=e2NL[9/є(#['WCFuN淿೹=#WhK|$ B\}=-Eٷ }@,}'l^ wN'!NrYC ]u}R4۹7Hދ0vْ{͎IW)CF`_Q-,5hGjH kfJeD"dG V*(*j{F2LY٩8/6$=?} Sy`@*N?|f8I*z85]Yj4: |(U-BdU^ȇO%6 rGv@B`?}Μezfəڗ2r8*K,=-d ",QtB"RwWAFA:[C[V-Ҩ:TQSj?W GM p5⇊6R,_]EJ{ML0LV;=hM\ߎ@B?M>-} V͂$*Xh%~gw%6iM t ю$0M eLu)IBzKaٮ(j޷N(l\M+At@wq͚ sD>y'2d(O')rnfzJ΁65C4#Ȧ=e& du( DO J^7:/jsӧd :Nbkϑh"&h²AY;Jp30֕ ۨq*nY@'q&(RbmFs ?q_Ȳ]gi?@]t4ÀmZyFWn5ݣ9t0)@K[F*н"ޙFZUGa&YtO}@JiN4U ķئ'$w DjRQ!^"-Gψ~I̙.GF!-O3n%p5 tO22$7-@t!!C,y1ۍnD 9Y_'D.gJ;EE :yAZt?"#чYlVRZMzl~OMuʐI2_ >[܇>yi1oX$VN S!c` Oe?qךw``fcŬW1O@Ma,xVBU,f(% ezBB~YUS 6p n]$ٽsAA1IΎQ67]40l!@ңw\XՓ>n ɛʮP(@T rU Ijǚ2PKÁ g ,A.L§c Qz9P;2=6)*N;xyfCEJ۾/<\:8=>TdӁօ}#To[u_w ߷߶>g@kX_ Ղ7F\A'0mARad] `М 0=c920ZwFghgz_ E 4 eWl>Xɢk͙/kԳB+%kfӬhL "/6%!uoX:cA H:0@Sp>hzKذY!7*4ʈGZ Jqp~7+oq ^UYrt~kjPA}TT9da}5bΉ_??o?qJc+AGKIOnj% hyhq?M@+clMkt phMvvTkf$(…'[OԞ`FϞq>=.hφAХSJ{'\r7b +çR+I;Qq : ^{2YhDؚF /QN$*[S.xs~k=nZD;C~e Vfqt`װ'{PCaOx8pԣ$l]iJz܅!zr)C gRHecrh(ӒOki_ ⚫ |x/ ~`J"J~)pP?!ŀfm [OJ%"w@:87J9\ij +ijf= ^dv?!V2Ad:NfI b{ɣvQ};ce9$g&Z5Chָ/?.) Z 8 B8m]l EOZBW6}6j # mƄ 8-kPbUlhÑ:-sq )6N{vkzL͆\j^8qI3eDŽ&!SUu}P!zqY7w #^zjZ3 []n~: on'X֌ D~|NS,'WPʛc5 \0W]J75LJn+ xKz:g8D df_Ve`^z ;'CJ4\U6 )=V̪%:DVaՉ2"S`+-T.^G5LRwحܱaVS#K7n_~v\-,~` C,ҹlPuOrxqI3C-璸ݩ8߬\k6 r(!%Oe6; ONnЎxFiL$d }ۡ]@an}^cJWvXufaJ;Ȅe·t3k}XNCTjL ?d]&w;ng0!6E6/,H !hj]bb,UYWbܤJO :^M { `qNK\'SH7qj{Hf>@[:D6p6Y6~'vIALܳ3j9>ƒ{P&zJ;+dᜋ$X~}C96f[jAP<8IN^գ-DK>{NI|5׷X+'JAм8E-ӆV,t_ EfO,=(PZ$tN9yzFZAnϢ1_u- pv8b5& Mo*Z.F%\zӥ*bYOs e0XvWɗj8-iDr{, dKr7I",WLѲDb9mZ∇u{-,3Tc/ B}0W|F|Za : Lt~$ i2YlP%֭ 7JϚ=B1$5Zʗ 6`.!?{<{0<(xU ay;Mv7<}%fyvsy틴N{<`{@-ԶA'̱)]@9_+YA$-.-X`?Qbnү޹ڬ꠽zm K~C{j\u7=5v,RΤR '\EqP {46h>q,+ɨZЃUs~5޷,|0"`m?w[Jd⟽",|(Z&)nk+˓Ygen7 H\N#=do(ar E@Ƚ",,p QJ{UYw_ Vz^-Vn)11St8>"s!bqAu3h Nn@@ksu)F -V߭a+p@3/:=]ȹQ2؉ld8>5Ȋ˃wSjP'>쉡 #<O=+̟⨾ Ś!'ǢJWoϠ~6ad|;95kldc=MK2RMXp,Z dE}'~+[~Z& BML|'6^#ٳVGǕ>^5a+GItyS9'TWU {;>9P8/7*jdæѼ''gYu ̒=X_n E>r1I6C .0r?NG_}Up7Xd8^Wa/oEDj4`}9gWoVß!qH9#Qpth7&e_="i'r(˂5E85s`SyɫR~D?NKl=l3|iufYʮp Q ^J& -gWY~ݣQ;]|;VP&(*EGx^_NziF?_sg\;,daM2A)^hjO3Ձъ| Ms mu`Pc!B<fq4DaP&-ªm~Փnh±m`tj 9wx+?c!=n?l _B"[saiŬ]=wywǺ`h7MmUKn*@3pʛ56ڢ[To[2}zƥ$ͷoeI]M%ӊ0RجAr(`ᔪBA[^}?T0$XyZ(t Gg13! p !\ߕp 8WVC&|GufVkX`S/:FS>&: ^iԷe_lr(ڜ$]_#!NOL53*D('#Rwf[JJp)́3?Klt%ed: $IWL`[u04!9ǽp&9O[ 00ÖCw~ϨMu^G˟_أ5w"r΁jONG D]#EePl5eTBns 5pINJM>>@ܱl *mPάd9gfNPQ6Җ TZ+ZA1PG6(<@߉֮=e2dA-G'kob$Aք /; _i9c3B|ncGk×ELjofhPM J*H{`2x˃#?~'\/R]n*7/N\ u3Qbp~OcQ+2<@ҧ՗N-sd-n0Xe}j \]]o1>&! ,7?s]Xp*j-n@mIҧё I$7S2Q/,<=?5'Ay{^bkdP'3 Oa`߾|ւЀ%>`kzr){$ khB BQEXk3-긬T߸\b#- gty2WQ";~WmHl٦ TC]SZw̷[=s^ 䄒:v-+1 _ɻı!6SшXHt$ aGo|fmn.|R6M;xJ{4n#O=\ 4G?"-o Dm#sX>Pi9ǕkBѳKSљK8f;kx+NťPClb8UD''AX30H%\ %}wsT,19pP~hOL}(sLGuxI6^BAD/Ӌ2=S\s ݐ@hE4)L'{F-}ٳ1Tƣ+U.( `LM7ٳ{g彘 ,_j{q$aA;߱V"P›1\O-fnrH/E<' \g Qic7"YRؓwЛ;N{Rzu R*b&v_ݵ y_ aD]C VC_MikeIhQ [ONnڳy:+p=;mSS9 luc'V :.[C 2m1bӥp>a)iax 4 i}Hޛ̃=U8ݿCd. ZeDԬg Ofw4sbV7<ְp}1O.ܷtvLv9oʕJszSS4g/gN²tk ċΡoT'뢯^n" R З ZA*qiĦ_EhPl;L ѕWxԍ-НUkFx[Uz`*Y& RP۳v{(ޫ. >"P2&v3P?:y,GZ(~f=eu7D ]GX1, ] k9pBfCLHw_hIk1z5YD86Om.)oիE;aiy-ΕO"C^quIZ?(j=8m="5!>їB +}:߼L&r)V0˼6rM OPpQtDZ. 򶡧@vXĦ"FMoFO ؓ.K*?^Љ98\qty*l$L? VM<5q͢vn(z36mMO 6N+5w/GdֵPEOF$ \,9fȡٰTDiS[8}.@‹vp-vM.7oTO 1Yd"O;%&l lB#[O:;-,e-+Nᵾr =qT gH5-(Md2* k3Ѕ jYVzJ]?6Ya[w MЍP0Gogu)Ca(X41loKi,iy6c*apC ]fր;m5( )cOpwOPS =;td6'VX/Ob %1]Eț8ʺ8y  3 }MrѧBqdj#\t1g-15+&*'am's8mq$ Lt(f>{I"?uwzlm3d?z5zro _~׿_]U'@F0RYh˿]O *e+EmVH9벵rVzOE8fN=0cUi:s,{Ϧnn%(8)R<XT& 5ǥ_#FtT=wt9Şcb}#YRo1WH!~XZm͊1&}Xd z"B,Ң >b!vPX+:W`~&f-S4OͬiQPVߜZK /!3UA}7EΉ x6aVБ;!JpI_,8WL\E3sbq K"'.q= 0[nt 2TS) )SfLPFjeleP~,_0zs9 l˩}3%3k5rQ Xtp'4PrOӷ^Z\'!aLfw`v⥉pz[Wx =H $R(47Yv@hTB,HL;v9xhUv-J@mvb _?v4j8:=E1:NtU!5k-^ n1YREuXk2LS3D 2Y7/ec=,$=WŻC]Zpsi/jH GüN &Ж % h |DD$/CMݚQ+e)?|7pRE~>If(H*`J(өA;=~ D1hrE/!ZQ fIJ==VA AuD0R]eTbJ:$[Db),fy !\3 B-=~j&DR1:!0^; @8 ̒= rt)n4V+VwC8}5Ka2"Z 1vBs ]7۝i4ԒVLC^,%rh㺛?p<7?|Q : y0VmݾaYFGO!9802wݮsSb(ZdSi@geim˲$ێa{ dGt]]c\~/gvݵ^@sR%Dk`e Ƞ'Jb4 Gwc4&q+]cpn XW?!"Xv0m6L4p~:]G ߿f4^^h=ao Ab"JCtg~c޿'h2 ߀]tOD?El,/n~]),nYh4HDCOi@* W.>#Ou5wp؞Z  d MH^&@ d6->s̅ 6A++KQ94G/_>N@\e\c'[_At(U+cxBv:p8&-u@dbDi4[,fnqi [m{<| <||iBVCpXQIQuZ\0~S?uLN](.UK uӔmN8nU7O?0XIENDB`bzflag-2.4.2+ds1/data/red_icon.png000066400000000000000000000115331200563112200166430ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATx[iUյ`q28―C6Ɖ ({4 RJ+!?^)V|P_-~H]'?OI@2<{N}= @3u[WDP8߷/ܿ׉{_;yKP_o~ƌGeǀ`^:lnn[ZZ{'&44<2ilkEp_`٬)\l=x 0udZBMM}թ3g0ߙwEć >lzJvn%TmDh˾[m3\Y(ouJ,+ӻ7Lzqرv|̚uڕ+!paہ)˄)82{TWW=Afn/rG]yIӥBhcLgGG|N9售G"$2e3gNf+XaULfDZC;AxQ.3uD}yiYM8>cfC.^-@! *aΝfϞ=rGl enٲŜ{'5MjB>3%,)"\CԱA"q؇)*z%:ɋf[0 /ߌ] p@۔'p}Vنc ]%t _́ \@/Ow@|(&i9D*|WDcpq@зnXW@A ,&Pb; f|e(-y w'l#  !iUվ{ ;/:'Mvgڗo?/lG3>%V>s^?l:>md+fyS(MD&7hp(YiK't]ZQ k`A~u6Mx|ǜ3KjڐCIZkh 4{mkz2o_d"g_[I1 xm  4`b98 e~Wʖ|C\v2[!, mmm%A\3 v_o]ٳ-ɝE> @ R~)h2Ό3[d[_l~t &MSs+Q(|hrs7?dp&q)T&SVD `|kۮl~A @e; _&~ ]5+H2ڠv$dq\㴸Os=RV3e0#o)G @M>ܜb$d@>wސr; }hso3YY>jh|;/[ف{ ?/\hZ-8awK_8^\ŻOdW ZVN0YC<*]Ҙc$ML)O$Nq k{Z#0/H [VrXc8a-L RTF`* b%k*ňsh'I3/ovw3hzȗ™.rM 'Jhm" YiV ',@-+EIHN!|ifd||M>dxo I$+ךr-p] p3szrI%T%?H e4 B)zsrv7m1-@4RX%r-@[]}- ;BHzO}^a!#;pwk]ҭ uCnvBk:$@7p$C6jg, ,MQLyQ)]ywV(rO%Tuu,I.h=%@騒IDu.$X@7yUhU(wqT]@PbB} C߇FR-@6 TR k7pN?Pr(p $5$qKIytK ӍqXa]D}uyQN/|疘k0Zy_Qjm(kA`Jf~&-G)fcf[E?yn.(6W79ZT&>O~bsA<3s;= ٪dgkQEݻmx}!6=VX\ ̿=;"w'xю)ĭ @5,;@&4VfT!f tZggMVx_KNK!M\hUfE /KzDΦ,DK{bq1G,Ͻf,&sim?-#G\+ptfͪUsAO|+:THx /r&FB z7v Qi(lV un|& 6l]ԏLywǎ}}o̽33sDѸ`DxjɧO 2y:jQC-bĺNN։۷;#M[|m?q٭;xڸI&j }?=__^2$-TjiV0g[k@s궼`Ç.P ÖIENDB`bzflag-2.4.2+ds1/data/red_laser.png000066400000000000000000000004301200563112200170130ustar00rootroot00000000000000PNG  IHDR@@iqIDATxСj`_l"ci1fu}ma0Ķ,ބ &/uXX,/Vo?<(fnvv1(HF G !B%%HFF""f?i9fS0:eN=Zv+k,}JV3|sַֻ޵-n7X-^/KCGԚno5$EeRQU?f)a u9\ߚé;X(p[NjRXY &K~a+Ar$7KrrJNg~y}7y~q1nj߮]-;Kd S.2&O2nL2zL@g:^OA|éNRZq=01R vE&NsdT$-#HFHJz.Iavq3.Q7H5-kf hﯙL%tqr2o!v(vIu.:>$:.B"bA?*VJf0_8o`}]%;LJ;R؛0`܉eõsc*k׻ɾ}rd944Y!0Ww2<.BZJHW0?4#MAap}P*E EMFfJVUz0S~.ť^RY [ %B!XHRp\o=X|IP0cx/ 1Vܽǵ ~W#>q9JSuGtCap]&imھkmlO:<+;HJeGwJ(UNS=2k?1^\ǘ P-AT@G o_NR>*HE>I r8lq'"XB-;ZઓFj绒&(q-PKog~4z_rhEt!72ypze]܌^?AJwzg>pLn"Hv=ľI D Y4EK+.׫F2[պ kj>n΄ 3샟IK)aG}4߂g/3ae P3+\2nJ"`#j}>l >,#zȮ=!|; UHbPay @o,NHzYjJA@W U06w l0PT6Ğ}~BM⠈¢Wa 3zz %P$FS0 5a*2&T.,;wC 28 sӝW$|*Eů1۱s)q`: X03`Ž Q.w^Jc2:s+Qb:PuGb&S5`DjB3Ŀ^ђ 96M'v@%qcE`zPBA~[Ca.S%*n.x4K ŢNK%'E6$LG Ng\V\>X$ɂ+C9DbJ; c/l$L!\t+#KOFJfpŇZJl&] MRdx40k yR+ M:jT!×KJ H_7_^gXTq~sa%1@L䚫 IZJz\9,谾j'}tOͶܤ4)gAq$U45kxH)i߀P<(E]zG'5zlzkTEWqh t;bI9G!F{[i*壜aQiaImYV4eh!zKdMѭ@u,&y=v" -@؁ W4QX$ew*edjJU)nĜ?+&,e>?܈ G`ԭ\>@!`VO+SFmWTm/CC\$< T61m %7FmҰtTV!U5oHe)S!~,,$'w-r~3W$$mIA%S PIy'jgݚōZv" r2f ,Ll&)%##)a\FhRKdh buBҊץeo- {t,hxK|pvgZGfZq^Z݋cɩkլ i咫V`p*2DI^'TCX-B?T٘&$6LfFrlTY2::$u.:s7)|UN_)Ukߕ=i^sG[A @%:V*⺸> } )ae5FZUotD<8dpX@( d-Ąܜg3g%њ䭃E—U.5 ~|;]-ʶe?ؼ~OeP~ΓJ +&"!x32NnLzARYc(1jٰ[v*MW2YMsfgLPsJo@r<}*4..nj6miƎo|@{HgbϻvY_x= C}.Xū'MZ\>_)7q8`k$FHs[+ o? |)\ټy=LqdY 2 V5}26~쐥0p%̘~ol9ȡßֿq;P-̓Pf&|y~K5bɿ ǚ$9KL2s}-Ln܎ j0MG~m!F%Bc#,+ ehu en aD{}PO[>8/R! ;שb+`@9/CiJ }Kzmb6鞬;P dv Cط+}[JX#kw*UJP(bz(MXl<fv.8'4k,?rc}ZN8w?E|OqQy=8/'Q2, iXta2p`VA)&HY7[e?楕K1N(Xgj[ʴȽY0j"ht.qU=o>1'ٯ}s~o=̙./+ !X_H+XnG^:]uq}\'׋uqC$H)&+DnzgSY""'4< 6H6X^*~Dqt`&5u0ўwGrgNOmߟ9 m>| 8x?C$r~>)̬s[bEk^YeeuUf쏥$̧Yz=| ,)[EȘ263!g"#x͟>}Gsb?« Xi#'w;_e-9)/]BХLD ڦafD *|Bn˟&=s<٦&,`j0Ц W*(̟ *ϟA1?=U89>5?Txz?YzG: z'o;c{V6,B}η)pj)G Q@#70q\ERƧ_ lF s ؁jVu<}k`K x32f  |)bK0Gbbıc0$(kKQĪ0rQ>iAKplHUki'eL-R,]&/m^ xQFDk6ћ(nD¬O!}I?(á|rꬺIkz=s.%[ X 02PfQTrQ>Iy!oIKMϐ;JFgmNjұD=Jg 60-2.-0021;$C#@OLpe;d>P&~>zB3[\r2X2Y2Z2P`= s{O19QO39Q6 !\۞ 3F ]SKs7'I|j?hlk[5vty.('6iSYses~""X[WY1,<296fG̒-1kb, (٠0EJCYe6DYZ^"c6ۚ b5DV n,?6N>5h``Nl6>)XSٲ(2&oca_umGY`|[37ڬc=`aQOswm?V =o^bKf߾Fz4zo4BRR!aQ; C>믕;+Bzindux{E{&/"7HT\=veQM"ĺ@Y""ֿV Z~cEG r%!ҌYnse:۫ҕ.c20o[o {Қ` a{.ĵRTGd0RXt E4k ч d 㺽HSݸnlfMP qe&}q(HkU2 ԣt-j5Acu4b1:7p3 ;30| q.vzYU9k!"k̎ڠq 6hDr y9<_BMjV%?Vk!D6;WVUpOS!GWcx(}roq)KFH"z31SI j?h^(sFs׫J؉P{=8}cya EӒ]NmB J4bDt6>AsQdѠ'2LBzE6_X'?<"!eA,EwD *(wW{'C$p{v8>A] c)A&7q)aȓoBe}p)w45&(LOy_ye JӒ">C8J C1AvmŴ0}>j̿fqHBs:0LI]bd3zgcHHJ))}*` AR?@}ݿhƲ'2}4nF̧ƨ+;DB6I-H!CQ;!J2;@ ֱC$$yzt{C˧ Bm7x=t:DDDwxD/ρkLu\{h&kՏ?lE !gr-OM$<8e\&9!CSL>[{9]$ٌߊ>{ydž . &zK{Б-/=1NX]72hy>IJhLTT˻\%(t8fLxK,:a- >W1!̶+žm1ٿs0w] 9]+;m,Ȳ'Ȇ2~<akw>jdf͇x>A)4N}!}CǴE=LL[^'}h_l:fuq¸t]cl}F;H MniOvj<-~{((17o!`xz?j6DMF׷YNѫ(:{AuYTK`$:16PHQSHH*fjikъș-w"h p \fhb_+|U%&;tOI Q6O=Si){e:(b&³ WW"OCPVa\M I.v-җl.*B I7ɹwWPb* |1b<^qH8NVGf?6S'xɓ _~Y% }^㣔k3TraFj3 ~X@!dYq}g93t3yokk_gF1&&P9CuGXq1] nI'5q3Qr]}~QDFmzD*Sh;9Ͽֻ~PwA4|*#nS_I^ww9/oWOTIENDB`bzflag-2.4.2+ds1/data/red_tank.png000066400000000000000000000032351200563112200166500ustar00rootroot00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_FIDATx흻oE'xH!P03wރ 9Ö%@AA*1.x! 4D:[ۙ_F~o~cWJ|jz1gF7fYl־[~{gC&;\վ+~:<|8|KS<_:[М^Q|=h~~drR?8ktmq$jEOc3- |5^ j wrn@ &F^4q3J\& Ƴ _er4 ">U[ݡbٞkS})*KuKk.\Ra>ޘ;ޘX})Hi|JX3^)?]Y7` Wç߻$ڠD±/?Ā@Cki6o>WRSs,|zc'Z`A~uj_J(=b$>݀ٴv9|vh#zС Ծ ~Hr6A#kA5Vk_?YU d?Tg8 @hvs6Z;鳻Θ 8~sz&OD >Yw 1hٵ/?_FÄaPPex"J'M[7[p7:\;|.<ɚE"ZKiȽR[|/F`pq@d\ZeR b_,򳜁-vNn\߮ l^8?@tWd{P.=r\~ruˮ߻8!)fscS? ~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?~@P?t@t@JP?cdwu*h8}IENDB`bzflag-2.4.2+ds1/data/ricochet.wav000066400000000000000000000773101200563112200166770ustar00rootroot00000000000000RIFF~WAVEfmt "VXdata~ qOW?|QE[E ;T #"F~O=ADX5,-:v0u:9{}iL,:a\dp>C[I-0h\wt6LeO'W@^5Vi0,\Vej9x+ZM%w 2qCw^e \ 1Tifvd/qZQ Q%n6lW[aQE*xfGAv Oe(B^K$n .n7%Vf)P=wugiRbhekOrQ5p{HBFc"S;?o4}k<e[p*&-p2.iGgk>`2/| RMMWIl]oi.t=8Rqzy3#, l )Tf) n]h_W>M;D!Fgs|\~J.}DT_,/s?dN'6|{XdnBLW e,r~S7 q&0Otfp BH3v U&igl7yX$#jX1>#LA8c5D:lTh`GkilgTkj([GF(TS&z9T8PZO<({:huEcS7^*^D'(AMuPP\5\S }J= B$54:6^jW<wXeuzF*4QK_z '|[k!j,6<a*!yQx"Pt/_p{DQ Q07y' :! ~$8kai7l~'+UM&j$PTHwPv5J@+jf+OGE#dl5Q -z#uQlUXQf\eEgz-hL {ljXNs q98Zldjg{vPO3H8B D|.t*F;@- VU^EUq?H'*2K -(lnE^47\7QRN5{yQ6QNg_o( N2<0y0X=/=s/h']*C$XNsy-%kbxdT5UK 4+$m"%7z#:phDM'%LXI"Pk>.>c0D74:_T3S Yt_J,pz0(NL| jX=.DYsL f f7C/dy0"3g[q<4f@ us  /G=H+@(f* -@~#:t62(~5@.j n m+ZkP+>]m\,MM~J=*7\}@3:Y ry:qS"4 Q "^[,d,c|jXhl29ul /! -Rq$/^nY^fy)[do ,UzRjLZ4.wpGdxt'Me{$k&o%c-MwRdv|< p*:3xp1Ow@6,PK@+`;:<+N!M ,G|=^Wy1e=`C9lUU44nnn1h@tQh/"bQA_  sVUA:+WL5X}SI oFtuqA#?]<L4j z ! c 0 .XqBCHq9i`Z"qLg=G*P 6BOk{1R=8tqjk  `"x/sGdZSb B L|^ q6 HR N7]N ob# l X o]5hfTHlq$i8cA% 2a_U)}  '  .BIm" 'e   { G  G;9_Gm ]ezV 7:-|(q~3P>>H Z)X   q' XLw4Nl&0di^MD:[:o * 7  hoaL7 zO=.  0- R}O\  mK Z8` Ms0Kq/ 7| ; CBoq   L( _, {(l@ ' E  O { 1 Xd=+z)9HsVV?`*8?  V l G L m 3  (  CyK V  ~ F 4v{PN?\E(a"=BQ:8`~OQa,E_ jY  c  w qy&A^Y9 o-PKS+r91'_ f$x1sP ) H_   Q;X6 6C k@ l7] I x).&QZ6w`P |vL`\2I < er z x ! { +^&R 2,e@}qd` XwoA>(CM ~J  /C,. mW+iML kHQ jI ` [thV EexI J"&$ cm yne $P~$f H r&r& +vV@ 2'dm~ 7 f\L f5-5  8ncx ` 9`% WIH;Ca0$giCR %<[ >@f z Ysl$ai I w T%  k}Mf V n@!_o Sj!~ G E;~ QKR<H R  R uSBG=nI1f g F~X F6KB6 0ot  !>m`>zukF~jFcvQ=E eG  sJLh*>>rl%aGx" ^ 6M :7$ i'  g\9 ,$?,Ka > 0N i6a u P k)  }U' 3<8 ; Cv , kv!;H< @M i>[_!?;|Ug n Ck Dt-   f 5dE { "< knֶhڮy3Y 09-A)S m! - H[ ~ c Un 9@r 5:D#i Wul(l&e^h;دaAFv@3 * @   TIvIA5 Xqn.Pݜ>^H B  n7"!fx v u01>8`u o0!S@FXYHNh\  H.ގUڵ+i4  { gq+g;?s>U8H ' Hi7Q }c2jZzrEH "3; DDlYfM .9 V+,/ N8 &P/v$,O5)m"=h' '~Ys_dWj+ ktSg 0 #|VTӼoKk m LMth a cE ^M sU  pV$=T" P| J[,M 0 &C0B% iҊ ڕ  5',kp $H   J (`Nj*@  ,D!}+K"z+A4 0b + @l?pS\rLkp_`8T i Z|}AmhOD O  tPz h) 1ܺt$-T2!$yn8dapg% ;,_nD | Ny ; 3XA : <mmA4?_c G#lr|%K9N3hA51 *&n {7 X -E p,  0xG !2b?5 cht \y\D! 7 D[[a  ~+zp'Pv* 2 gN!p y Z52S !'/!!9f qP 2 >@׌Gjl  c|G/|GAY #H*;2O^Gz 'M g;X wKMq&|tulN>+DE ?8 k(4 " ?4='? v{ {  |pN= 6 9U%} |Lr XiM O  LFgnl'c1 ,S; !;B!&B /FmC i 7 h,2' 5 i$kN)Z1 ( Y+oK2z^ F=>u*8l=aqoH K J K% OB]fD X;FjYpv)K ` EA\z!T?W}P'%yYF C U { hO^`y6]ݽ߶_t e ,W H'}$'?6 h QH IzT u Vh! 2 e .>!4`@ ` vNܷ % a6G.3{/#$}Az^ Ep  WNzn2[Uv*%  #Eّڣ HvfF7 9*\ߴަ c@#+53**00 %#T 2 h iy !]#R F(e+`  M+  Z`$XX{ GNNw *_\r;.T0"U~$&q$.x?I % Q| Qܜz\w7 HP 5|$WTDpx%=0#Qjb`S| ? { tL [, }WR j&^ % ];V\VA ZQrg  M]n/ tHb' )+ \mc"47'b!w[/ v6&ux\ c@Y G' @I!jXJ ?.$wb/}q@T; S pi!Yt+}s4Nr Sc m L #dL%+M, Kl V0b"KmlQ=E}X e &E# !)  XPWvydEuq_Te j,"Ӟξ TPy |A(;+ ` HLV& V "Z!x#"L$ #f_f=nՑ̣ ӊ TIdv+!6*$ <I[ڽC) >"S ] $  w ۍMfg:P t V%_܂)*;/a-7$dx+D,0H $k TguXڇx'K? @JGDg[ց'uR @ Z ؊+oZ'LU L141| (0!DTeJ՘}& &: jAeN\ְBμ,ʛ I|Ad8; &+  ] 0   2J=~^Q*: egu @\ 6ߠsXd &R p| r {)l  i54\t_K\} Ln  By$en c.Z(ݍbM9^?*@" %$ S҇@- yL*(0 ^  +%_,;$V")&- `)MNlZjl3 [gZq DG >ݕ hc. ِtCS )'(X" $j m2 hOb o)[y&U;+V$ṾX;Pl)<:<-^iIFfW`߿peS؄ߛ ?~#-tO )fmXDv  'aUF3$/:m  6~9b{&*(\P28>E]aK>A # > p ݩ>/':=ARyg~#5 5am4V~'5k#J5u-G J4Lj; dX i q& "#K *; V?[ &)a7"LDL(?-s./%V jSہO3)S U߀b  #QV%~!Y&f6rQy,He2 ;-q g(/*)ݸP^-(`b RN<ab9K?^!'Y; 6 [6f Yj<*IU ] u"!O#b#KOwo/3nJC*\)*%,BgE:B!j˿qݟ1b byA d  fG:B Snk &^,070n%! pyc  "DX{rpޏOҒ{' 2_3 % / zנ<-O8FV7"|3 PB-2<*Օѹ((d/ X J {.,"#/%7t \'3/^^2x}ʋR,! 3!A!{ Ec  7h*Ҳ=V)s+B*l "j`u o'@ q) _ ۳eCy'-6#Ӫu+@+1 sl< QT~ rU `< ~!M$ %$(a@KgυڶIL7N#-v)$ &B(T Mc @  X и-!+ٝp5<: Q <yNW/*=92Vh= /)!F8& |.N W2~#>~ )ĎˏD݀U VQ  (,",AU+"MZ˂%Ͱs5i,"Zr+%aG ֿeujKEϞ#s0b{z;+2w *_fi HcZ5D@Q+=|)$'2!F+V & 3Co RK @ "h$p ,&~dJ% 7H z&ڧk 1 .N-.K? 9* P+h m,$ +$0$(m 9 ^ j a߃yh7s b G Qh= QJ3ӐAێtse%6sp" ~uQ89z=#U 0({ .}X/, Wc>e p_|L&%q |{") xn!f;l6q%P@G'H~ #b7 (jj> r. j I* A]O.@g?53&.a?m 6aeX<'Ӛ3Î DmwJѮ<#P ]&+6) U#! Jxܧ9 J Y&s@ < U##/%݆0c*$C L h)HNx3>#%'Y"|$ߜai  z( ]1](5L,'k `)v)_ :4 %]u s <45 p` .֕sK iMtXjb= '. 7 (F{ !|)*'OAwb \ U$'/6,vx|xD[ ݪ%eoRlC5$* .#@ %+M $Jt 5 m$//$ ڿ ] )+M0| yn HS$I^re^6/ # @  v=h=b0_wY.HV [!M* ܊SbDm Imj/s  .U?f? Qf y J, mag^o uPK ~c J ͔͝]Gy~!v%i ]YiA } G'0(|k+H  p'- 'z t $bM HO*<"'  w"M+*qd BTܗbט   *, Prjx%4g M "Ia hWjG L$=E 5 5 ^ X  ] a & z _  Ud] 'e j X[AT)!4N< @݊##H"P0B.c!ׄB"s!5&'$Na$' 4)"'!x %-7+&>X߄y:f|,<7-{QMǬ Y]C u #|-!pv! L8^&+v3{l(>=O 3~ `*  d""5:R3%aLJ/+Gw #!;.a-H,rC-?"r*" e*2H v . Qs\P_{2 = d/9csy&E.] q>@Q u^OWWhn? n& .( |!3x'br(H2*Y,*&,0N Pa>T*ƍ ъÒM+_'2a;z0q% - jQ,YW2[)is$\!kۍxBa M!+=1w* ̻J"#T (?@=X90),`pB*P 1$kY=j)ρ1`yJ B    AC(~\s;8Nd %< S]"653O*ԣ܀Yo $:!,o'8p\r9 '!v^}36] l ,I\8"Pj ?(+y5 . R#wt\_[{O1 X4_!9գӵШ ).&!#[ n-B / &ޏu՞mG$ڙ $V3|rv`U""zf!! A 6!#%+a646*[& OK 5  A,cRS. io*"=޴m%m %*r*:%!z J(Plq W A(5 W +}O !n$xq՜A~9 R> (^ LE(?s u_ YN)t71a>u z>16,6 -@D{*)akѼW[{ ?L9L b  eo*q`܋ |m0%2 . `YP!<Y#zz efL#2i+&)(t%mR  q)ߤ!= 95r ڥ)Q y ^ < k\RQ]$B 0M85* ![j0އus G' 21t'eG?F '6׊.|&) 'Y$:@tB ct,Z L# Ga}|#K1~nN  s  T r.jT \ (X)(  wݡ@ajpc q+U *;= . 6V}V^ G St4 \ H@vfvs+ U&+z/D1@j(rԼs'tz)#)?() #x&" 9> }ѽ e +0?&&j|& KA #S f(  V!fXnV 4 1  h `LL߂ xȟϫ<|{ es$&& l0 t{$.,h&2H#- A2`wn~Kz!+.,>= *{iqT!Ek(N[Zw {1p@? 5 N+2MY ̿OߴC .ss| .R  E!aB}|X " -=- `(-' 8 : ާؤ\'WV- N "7l:[.zsjJո1r_R VR" d eX  `X,r~u/J+ $9B8~y ])6۸& P VW`&t b;= \^bG^ey, 2 } ӝͅ    3iqӉq^JI Ex(o( -&<sf**{x " q a-AߞEFYm kVM?g'1| ![ XB%0Sy7!\+%c"P(S %5A;.uw6xRX{|C m 4Z 2U-RFI4 ~+}{< > -yc\]x!~,)+0Rn#} ڊ-96n *<C I mݡ }Q"ݜ^ 1 #M+ N S =9 Gt]([@. }V=D  \)~L`S v fC)`)#c oG6Y<?0 A?'dH d O "&cD1 @ ~orYx[3UI  n^F  [ %SYHKSyQ|1ze34?wk]m :\Ju ~~~)m]c[%$Q" ݫ#$tѰI _'teB'c@_xKE]N4y ke o$#ym'6G 1O!z= # 9 xH>sd<'; iO BWAb D +5 Q Z%:%.*E `xl eB2߾KskI HmHV ~Fg&  \*# )j_J`"<'\Q'$U.7.!  . :}-B0[7 !eJ_gG-[kް{0Հ+bq >&   %"Bj eM$ڊj!2O #'CG&"o>5ӃGp v   #YU# IZS@_"Z>6 OH7-yqpU !!= c&G!,)g"V|{0Syoi p &m*rt4٤T   T"DxG e{|Bbr P  Nv_R!^" D}Pk]` \ ' "E:^kݿԺjl;Pj%I_G.*\PJXF%;$ > !)rNOGX #NB `1 A6b#V2|"47 Z(!Ia!n!e ߯$ޫn/Zwl.!n& J ioQ0Ka^ Z'1}3(v5 G^ ӑk} ~w21 d#gKiSTޯO, z3"8#%"Mj: V !`̺!Ѕ W'3$/,0)GV# tSx+ X߉5;8 U_ "A  ޙ6$ !-h/,*}^` r6D'NOK +_ !?2D}4 ]q`=p2Y )n<} 71\ix+ = w S  \,+yb Zj4 ҶhغfR1Q`")j"*% : yCHޱAzjA!D)*%l/%%t0ڧ (* Y"L](0+t=xuyw2, AgR~[n 9$! !/v> P).ނ.& v5Cj27 1C 5% $i_t<99-O9 2 =,=. [Zv7] c~/Qn _SQ%`OY] }o 3-OP CT\'&)n"(X vvg? JΉڝf {\2 | .3(A.zUQA[a%;3E <<<\ 'q[8H Zs - . AD #HiM* ^#+ 8  :Z ^0/ g _6 / l(&4:CA = )I$ bUMR&G6G:eFr Jy3\ޅܼIݪ$ޱ  :O&l%!"{lCl K m~$i.~X)<5)9 &)OC W 6?7߉V߀T O"[.q-2 9XI:1Jq*Gsb> Iy  M W Q`\W D  AMjS< }ub (Z _ۃ$7*LF Zza3!] <C` s*i \Jn a97_kSfU!$"+%g 0*0(%<JZ?RݒpZr 0 QOh$N r)݋ʢ'ifW&- !8 !#F6z% R]T6)Ch/*E!.G!%'% !  s v#  U w 3^2Q;h[ \+MW#N*" xܓI`'M `XIt * a Bk cW`yu-d8I f '_] } P Be[ }eZn 'G(w | 0 H]Td| ׁC k  ,g7u "h'i'R!]v++-_BEVLU'>(h$HPA_ fK&hچ ՄjoJ*%W K ,.\TC%ak<\NTkC< 3J -"QnPi|`!c. \+% $%f !=@Td֙iЖ-z]h /3 ) 0/' 8>B 7"f J b [!T3{ S e } [XWa;{j~. ,# h= ?5&?) } Z 'x1>l%+AE~!r7 ZENt8  3:Z/: + B #31kzXLX+F& *67 $/m^:~O Ow #<c B + D >S5 0&nz "  ? 8 D n$)cA{'n`z3g0 'r, k r(cD c. l|>^ 3I anq z$mz% QcbY-8  n A    0 $TJo M( z  n kdr _d4D$2 n1c. ked K^ m`/y8g FH`kLu x{NeN(uN}':M qQE_'/ek f Gu7 ?75Ts 9Z " Zz T  NxnHZG?? u( n1CUX;:%&   :, P&r&|yx~gf\  i-V9#:p 2.o .  36 tOG:\*iZ 8k e,BX3W-o[? I1J\5]c_mEZA[Up;uUo2LdG?2'.em\8R`m?;u[6@kKLOgIqx_V:0+q 0 5><NrB> \ w,Ze1Wz)Dk5<I4X: Z`. +*ZoH/+;YX;Ic NKh`0UxRH/ M "a n\nd*ca~ VJ6@L2 C5du(y?aIa6kECsh^B^o!|itQ_$Dy{H;a5zl |V\\ApOSKTe6L3y` x)+<u)Ks\N^jr }Geuu&R"nN3u *.d7>K) -$o |$'hmu#/,w6 py&}E 1@Xl xYNGb>"I7t4!i"_@5L"S{ }+J') !  "  ! 2,>55.'"-,3,&$  bzflag-2.4.2+ds1/data/rogue_bolt.png000066400000000000000000000027101200563112200172170ustar00rootroot00000000000000PNG  IHDR@@iqIDATx Fg% 8ϩw9WˁxLR$$@\%źk1 LJH>RÒkd[YM.<' {vӅ7`VZNuov Uè 99"1/9zMk^O5.KV%\\(UTcE xI<y\H蝫4咖{wsļH CeCn^i ,w %E@*k&="0WA c,E2%cLqpb^@B(sO>(Qy!W@iׯ#0_@ss-ub Ɂ*CP?]3H0nSL\r(lF3=+T^@VU@Q `˄`^d^*koU@ / @cN:ib/ {mBO4 N7+^ TgU@*p>jk}ͧ@gr`8 [VV|vlL9u {~[w|ݺ TA˙%oz]`[ZM34@a |x{޲`V Ʉ&9 TBK]v=h~ӷ&z߱Ea|9_,Vl$x_r8@f^ൟP2yt dì u\i~3M&5cx:CfSb[@68˿ t hz;uSGMX!Oy Y8.nU%T*@:Gq4^}OtRN t@ޏQ<Ɠɒ</ECW`w~aJh%9@I/b M!6Qك8nF`p]A+xz ,k)M|a=k:IS+;p"C\U 9% @2y5oOݓi-$$Y%^}2FQhw|~9hc^ O'%;.Qz^U @ ;kd~P?+DY BdH'@=, (Х-zAo`YiW @/XM9x1AJcRh<| <|>2 !s8lNSb椨9-n1_/G sH\&g.4ʚ sˌi6gn4Κɝ hIENDB`bzflag-2.4.2+ds1/data/rogue_icon.png000066400000000000000000000125141200563112200172120ustar00rootroot00000000000000PNG  IHDR@@iqgAMA%`M cHRM浧IDATx[iEobY(A\XD[ApAE vOhszϜqѭcqkmuZqD"M#z -D*U*bzsoDd|(\"~qwbB;bobݺ 3{|v۴׻87b8Z寮ќ9swK[ZZ`ժUp=Okng n"Ͷrjc=&ǣ>J3,ϟ~tvM-Zz`ҥxຮx%ܿL3 @.P _g gΜOvZS].IDzeJܷ9 <|YU,˖dwh`luuub˖-F6Nڷ@!z{{kZ`…qBM5uBbӦMw:GԀ6@a ykYzc-iK"m L7`բ wCC#Xh9#8gDEQ>}'D*IBy;F0C( H߂tm7K$% 45Se!{񕕗]']^["CoK;pc74={A4vdrOتCKGP|(>6#PM8sl߾'f!Ѩ!CCeeVpW]u%șc{>Ę͆ÇnXҀ6Q_?z91j^':WϑΞ0bc/w2t~" z cEh?h`MMM@-Z5OQĎ9;vN8 TJrGA&V__W Uyg ug޳=*vu%RIٜOxi=}WIi8NqhSa#:/ jkFHmV7T_t {E] GK{h)l@ݐl5@t|əo\E' 5.tD =Sߊ;J wj DM`ٖ|oDPpMn * u$ْBٶC PO,]G=Gp\8 zɾD WH/}ii <w:KX0'L@ii9 9 KZ)f3hB 0Ѵ8a3 \ J@[Xx -V] Ng4T0'L-N|XACtf2rH<`[A (b."ґQw5Bu] ^;-3KQסp<A7'Cb%Pg; *'W\dJxKB«h3'+),]{ǻDZtCqGGL?dLx\Yٿ#n8T\~_aݺVX(TLXeC- 2[pA,,BISE8{67r_̀@ѓXSB%v-yR/xJlPwxa}1,W]k.qAuLF%~mCW!ty r+|/?N`0|X_ O]ȣ+aFc؎t`Q0ĭW8F|a>L}9Vb9]Prع]#9X5l;Hcmo7;S܉7"AB2vKqiw] CȲ`ۗо hooK\$wmkm*;Ko  2Ć+ؑE'HpuewDBc'#=,YDkNsL,x\ ً& {;wBcc/jkolCM=bx 0-Qt刮j@v#mwՍ8َA] XkGL44s?׉.}[7-˯*1Q:(TQ;s>w& ǵX:~c,UUf dۋ~p::ACUw뙌S'ہ`[Ow~uۏbRt&L.IPcC8HUXjvpf[#lMLOEh'gN@D-#P3u~-ل9 /FXC i-Q#ŨL0dd uil ,Tb-_.S3d [r Bb}5veRZ"W$gƼ[M^<T-P _ąmV5i*l&m,Y<0 U Q (0Tmf\BM,cbX^ .0?2 E`$)-G|ȫ&$Q4xd-t_M^TY0KG]E5 BM(SP x亷Bc0(k慙Ԟ8yJɓ%KK%<䉕]]~jF5?|~ T ?} * ]XUz'G\ku=Q#+3BCZw-|VGp5S?ysǡsWa3Hb_e x9So^+~^\~v_M͊diyxa lHb$<YWN ^}~=v(ܻW)ϾힻA5Tϭ ׭k9,^r~KiN];`><\9J( 2?kOOK%Emۏw^x8jۨ>q vz,,`U.#78L\1D$7Uo%޽<#DvT )dͤZ&pϑL\=K?V-+e}aͺ VD"u9E0-< i,=op^& 2] \8T.O^G}G-еx5PQ1pG~oO_Z]kG酳cF&<p!t/Y<_Ƶ nruF y:/k2(2B #GØWOjqʼA¿hNF}kYsϞ=opO ӊ0~gf p.RE}+?XerUAgeUU?~R׬Y=o _9uf͚oͅogZ]vHEf ej6I@A˺o6я/tIENDB`bzflag-2.4.2+ds1/data/rogue_super_bolt.png000066400000000000000000000177651200563112200204550ustar00rootroot00000000000000PNG  IHDR@@iqIDATx{\ՕT "RAȦ "1"-M"Mi1DBD$1Fؘ4j/MӔRMgggYN Smw̼s{=99.T0+**WP״%ۧi OxMmP3NsBq='cM.+pfxl 55^S) 0Yzǎp|P&xvJQ03Y0y >q=F@ !.WL=R;ER+gJ?1%Q^SY)Ƹcf /KkJZԠpTilڸ˜/]j>{7>ijMWʯ >67`9wAA9#m2{LFr`=?ﳾ=8~Pro땒jQtY!"1:/r^%SLu1C1K.Ď]qуx 6i)&5u>`w ywK|=|V7>*RKkBGi  Dwt.qCg93j3~ӕRm?%kwr@ҿS;L]fNWMW1c|m$;E {N1S7k>&FE}HS\p"_嗖CfPr($#$+;/ nⱫ wC~33MM}&KL7s~?mb+ssS3 ނasbTgˢi,:BI\.DBȈ">wLhY xP_Kƒ^SoJ'%-HWJ82F<%dɾw]7 > iÐTD۠j'3 ӽZzV!T T EA~Scy*Y>(Jؓ=Q E"s}l[滽R5ܠ|YZ zFF*B} i`m+L3kZGeW(\&,v ״c7·7aN}Iߟ)5j5AK0>n#@_u6\ eqMPXyO:2yL=1`f}ݢ7|kVv J(v;W(evzI1va_ M}߯70|&Vaj!: \R^=QBm xJO`\1c_xz,uGOTd'E|K}%VnPPD)t@ ϜlXY䑲DdvÐ>B?ͬf)%}Y~f- muvV|j<N ;"GPa6 xsUpB V itSbvIԩ0f\a9z҈>e9 ɁVd~Y>>},w=P  a,I$AsÅ[e(!5i?5E?蓄/D%Gl"@*W,$l &呒R wq O"-QzJ3qπïpWBJx \ ^aP;fXM?.{c~Rk}+v#5?b[%TINfM6ßa\CNlIn{m@>\ۈH×9Wj 4B7@}+I2k[R{yXp`j-i1_39fodw!KAqW HF;>>h`gw5P޳PAnua hVW78;pnSMfFUDZ݃r~zF]$Q8Y z*ȳyB>9 lEP][̼ XP$D_>^N# y Kl滽R3${N^WuUH!hKTZì9ZB1g~A.XMZAj#J]r^A,`M,Z"$+.,:gH(A:T('*C%'ryw ?7t+ P{`z{AH^>i97-| 4[멈.yU {"I>Pe6*p6;E(fP^$N=,k *VLAibC70.347ڀ k;OOnݥ>3S?#::^iBᖲւ0*0s 1\Ϡn#:m.u np'RF[9՟re-Ή2?V[ȩZ̈(1&$6LfFr$SEcvq7t)dže!y)ǰ}~ll9j}=hQi` ;@,WF.cb1`Ÿ{)+KZod+];{dHgoNw"ԯcA֕67'!`aqrG5?2m'~+fr9s!.?r׷%wYw2[aEKZ+Wq\i7sb rE Xww?b@ g=jz #OG@+ +@TG"W1;cBSzFnH$j84oy|X1N ˉ_!=K1G~;UBto*^?dh}yZSn&P"^T7HS RƲ*n2]qCcߴ?\|)!o7LH\<&мGr{* =O&чrf}gpǏ1'3"0"?bNίN.ф!A@]΄Y&^M XYX-ያf̠B{>шиڎLiXfݏn s#@1~'ї߹;ޯ!tnpTm`H ;$agx^o-F5?JI -00~ ux5PzX[&}6%qDs x81ޜ;*Q#Q}|>ωуr~bŸ՚3hHdEF+SOkb7&+آ$qN޴`oüόQC#"ã"#3Q񍌊g+  z)SLiS^V _Ŗů)3XD#7y(ʥ7yRno}jroһW02;RIYϨ!SQD"#2*C~?}%y9]rYbk'Ί Ygh= bw&Y(,I)묯2\OgyW̧"L4rKroQd~Jy^$O;_VUc)K[WyA)1&MA& V+% YfZ oT-N| s,#txڋ(10(|SgkPOS(?ۣG o0Pb^ [hPCȴ 6tLИB(is]e `^V?,@`@q z)o;oYu WXo4)`h M7knP@V]g¦q (@䗕G_VznYX AZK!IA @;~?M1bC48;;JL .B1)m/E`lЕ9bQIY<{^iV$-! ͛@;a=R=D_Gw(w( oΏLĺpQ|G <}&fVfhWL|u[g$>?%aP2NLpvK%Ai fv*WW“3+XE@pC>`y|} 9υ&ɑ 95A[ Y`kɭPzw&zvޭY m!@ ьsS݀| yϪp#&L+^ ,L>3kaȄ!%" 9JvHGXUHg%2ϭZ>6S:@4ª*,T/a EY"v~@MX|؃2o œSqme2b M9T?Tw\~ +xQ YMPAwcwv4.m\7hs6\03?t6!d`~@1P!tt#k16DFD' |@"[[oKe@m ExD:#-t~ ut_nRd'C5?ʃt!bL$>2\{l F5LĔgfy%YȓoBwc }7L} nPL& H>7Kl2D'鱳A7XTQF8PM#X0d٠l0)~3lݿO@'+L]1;{kKK~o@/x\"&9$T(.1v:̳B{ l(0I$2.2<{(8׈YE zzlw-ʊSk)F !? 9 (?do9m1HՉAY ̿WT OU{xЩ0obnAz-ɑ'04-@t XM9ծ}Xs oW7>ϸ~@mcWmCD:R{fФñV$jvu yyOk~}-孆Pp^bO!¤'~es"Y=41Rʧ׶̵)5iDdy duq MisH{z ȓA+{Yal٦zovb}Zק;>'VCL}U>R]'xڛ># N kj:Eec (;H Mn7tx]<:ED`ENC״\;EO:E/+m[ڊl d@"md( \8`Vj.+̎P@M US_ĥF7uv _\ c⥵9a9'e"T6LFSö[\ž$³ XuB? XDV8|bUnq2J&2í]w /#y:t&O3E0$g\#0[2| \> 8$ Y9ڛj;BYRG_~/[Bay/;{_sHAQ*}EeܽLR}DdOX 8An#I'RoGx_Կ'c3 NJws]K-m9 kNEHq>g~R3@fN{f#*1>3=3td<=ܰ&(]xExa|vTF ˱۶Zp욖֌:|(Y1KK0Oѷ>5N ,I?5O'N|P!?`\5"g>0 ;L ?v65ش9KN,{-p҂޴zzusή_Z'c47``:/WT7E}*C5ꓣ͛kZӚ=9{K91o8SËxҝЩ_ܓ}hv:'Gu^?&px'(]>*'VEh&yivR缕W4DL IENDB`bzflag-2.4.2+ds1/data/rogue_tank.png000066400000000000000000000032411200563112200172140ustar00rootroot00000000000000PNG  IHDRU> pHYs  gAMA|Q cHRMz%u0`:o_FIDATxZR6'%% D2-Cc $!v 2}+iW1g%6^-hV+j?5^FeJA; Fi梬B0ĒulMW4C%tVx7Ds- !Oqj$9ՌDh$@'eCaOAJ,Wd@gEQa`<}<ѻ>7"E1N="zOěZp&SC'$<8 ׬:KvUpK.(6z9zG] )0< "깽뻢N/cLЃ6H9MQx5T|``R.]ܝ /޶xxJY5MCJ̞bp5PY± R83 + _|%`<6.< ` Fs=IxXݞݬХnJr /xHĵBsNLK[98E(ou\ xTK&'ýn]*|^SG!C,?8o@)xbzM#ã/=s)ATʥ|[wkcC DiMl,̱:kS-+!؇MeCRj(HN@F:]gU*}@9nNԲ4<9k?5f#sloy'zO;R¤3sz*iBap|䭊e3͚sCWuȴrɆ-uMCSQT]wv8}" x>[OxAn{ P"n)7qƝ\r)x3|:{eYK? :M_6r/7~;ZLJaJ}yÜ`uDx~ \?r@~ \?r@~ \?r@~ \?r~_V$[IENDB`bzflag-2.4.2+ds1/data/roof.png000066400000000000000000000045121200563112200160250ustar00rootroot00000000000000PNG  IHDR@@. pHYs  ~gAMA|Q cHRMz%u0`:o_FIDATx$IH$Pgd7 LE[r f:|/VbxO5jK{xϐW zBgubPw~~Xvqi?24 {Ҭ2Lz#wuv8!Ѣd^n?X M7A}>)nW{GÏxQ<q')+}U, C~؛GL6JU)Q؏Tr܂w뇇90`! ;>F+i!7E6w?Pj,άzG@V>{-Or껯_{tbE|Ӗ.гY3CE'Ȯ^ow\x_}SNK #ka G4 Q:]Yr>ŰZP> 3XT%nf o/v ]ݵT<7čc 9f3 OZ<,n =$ZsqMz$loB$ZUSXlu6D㕑U/569oK%S|GTy{-ЁMbX˦1+cANs,]^o>{ï(U̹v&_<r&czQ-urg#s9.柞ɖ>ԖΡ~XvB͆{G?-S(eZ΄6nTRKU^J`ܬ _O>-,uM;gϴ-yw^4N~VUR|IH%tor!S5-2.THpspl\/S| ön5R#r 8;NѴwBE!(C@Y (5"PLYGஶȔ>c`zXvOó) XA}T}^[e:h$X~u!C>$1\]z$\Eu$@OMNNqqEev Qh(pcc~'R`8".!P%zSb%5S7`-;Q`(5Bp]^\f{ i3}0Jɇ{j%wlHsn_tʱ*#y G|e5٦#aWq瑟Lۼb&[3. ssR|z\`֊;5„1eQ5=&a3P;1կG1dI,:.Ѡ遵Pp!:J/_5I: Ί ʑĈ$2E ǔ\׭. N u_ W^0gc]I 2jn9)bJX^6MQsԻ|/̬; pq6W]k%k'lTt9h[ٟʶeaKk:('NW~/_%ݑf gO I#kOk݉|Mg"DwyDgzpr`2'Z)rviNdZ =bT/)=NӢ*?|,1BE?j~>D1߭k)߿^Xs0#21ֈUbrF Dk25{qC"=ԑ u_ӣ)#:ջD87 EM>ی׌ss00*%*%[1[100!! <<ܻһҢբ՗uu((22%.%.^^ջ,,9977''TT 00nn((c3c311v$v$ZZ+.+.<<>>w2w2LLۣMM]-]-{8{8X6X6''PPSS ,,9*9*QQggӽӺͺxx&&.%.%GG 7744##--&&44ۆ[[$$ú̺44TT  xx%%Q0Q0--^^؂ЂJJeeGG00''2244++eeAASS ''!!K K __𿯸55--YY  tt}}  ''D#D#eeeeߖіц҆nn$$--**EE yy99??''!!$$oo ..44<<55]]MM} } $ $ ՑMM>>77ss ''!!**Z&Z&""&&ہˁNN99YYHHHHAAjj**N7N733 dd** ;;٩۩ۊhh?+?+&&aaAAPP]]ݚ_'_'//4-4-  77!$!$$$((((qq I%I%..22`.`.^ ^ @ @ އه--|'|'2,2,""33$$DD  $$((""KK^^ق߂ ""hhDDzz || 44]] ~~bb{"{"ddOOpp8#8#))o(o(KKEEll[["&"&""CC22..44$$&&՜wwZZ&&SS $$ HHJJ $$IIҸ;;ȴ˴``44  \\--ݡݐ͐,,kkي 7"7"s2s29944%%//}}־bbs s ݯ++͎Ɏ11ppGGS!S!VVΣk%k%##??>>oo%%eeFFGG44kkllII0099KKhhLL ooތٌkk44 )) // SSX X ll  {{QQhhAASS;;44.. %% BBTT_ _ // ooppeed d nn " "##IIYYOO uu44>>\ \ !!LLBB--55==~~((++$$IIGG  yy  !!''##ccaa''+ + SS""WW##''- - EECCَDD MMDDnn}}SS##֙ۙ+$+$j'j'NNp p qqpp557788 * *11z,z,rrCC ττTTCC001166׎Ύч݇!!wwEEߓ00֘טnn''R R PP!!vvsspp''WW||$$K$K$WWuubb߶ދ  kkhhuuSSjj ##ii,,++mm,,66YYڷEEvv>>HHff%%5&5& ]]../#/#&&t t ZZ>>QQ %%;-;-++ ~~[[&&""** Z!Z!yyo o ""WWvv''xx1 1   77Ѩۨ||~~"!"!yy zz,&,&q,q,k&k&!!((99** a-a- 0 0&&݉ݬެ,,))N/N/''77~~JJ((9*9*$$ **߯88dd٭88ޭJJLL]]A#A# }}!!))55&& ;;KK Ѭˬ~~++[[ޢբ>> TTII~~WWLL??MMeeuuzz))!!  DDVVܽ""7%7%##nn܍ܴ״55 oo))&&==yyܶڶڞkk, ,   CCD D kk77bb֘՘ե c"c"**W&W&mmְѰѢڢڹ88**]*]*߂ccW&W&$$99ZZyyssz#z#%%^^E E ##55::11~~++dd}}XXHH"" **3311&&  ooNN^^''F-F-~9~999//! ! WW55dd޳Q Q ##HHԧ˧uu!!J J ffߺӺII՟L(L(--%%  --[[""11##&&GGڄWW##FF  aa66ޚހ܀ii 44''E%E%VViiѺсƁƞɞhhZZ BB##[[,,``xxMM]"]"9'9'FF ^^ݘʘɬɏ܏  ׊ΊNN  ))..Y(Y(<< ==ԿTT  """"$$//ii22u@u@-?-? 0 0HH^^((4422"" ]]%%11O/O/ss''||CCՊ݊  &&77;;11$$(( J J ...-.-BBssܜ؜yygg "",,**llԻʻww44::((((++yy֤Ҥݬ $$3355B*B*ww ppTT4 4 aam(m($$jjحԭԪު)) e+e+''֟փ̓bb66WW&&""!!&&44ZZ;;׋{${$''ooKKъ11̝ܝe e &&H$H$KKޢݢݕee:*:*$-$-!!j j Ӣ%%,,%%::ԻמVVyy((^*^*~~;;zzԼjjգ))E'E'^^{{ ҄;;--7722rrٙיqqff/2/2::Q2Q2DD,,۴~~=(=(u9u9==33KK8*8*k-k-""BBKKOOۼWW  s!s!**%%MM^^١ٍƍ ͣ++,,- - ggkkֿܿ--^^&&%%vvxxSS''%%44EEς܂ܵD D ee"!"!ll##ccJJՊ--..!! mm55KK<)<)h2h2++``RR77|&|&~2~2%1%1""k k xxڳڪ**5500BB--ݝGG((66w6w6((tt۱S,S,11^'^'((--ђےEEoovvJJߢ.'.',','88## GG%%55K5K5$$||@@ѰŰ)) ]]22888,8,xxXX**55z3z3%%}}\\NN33u u TT  aaEE{{ݸ::֯ʯʷǷ^^@@.. ==aaOOyy%%##qqss((1 1 M M QQYY&&D D TTII>>3 3 <</ / QQ[[ԸԯүҪݪ> > 9"9"--%+%+eemm{{ ϢCC\\[[[[~=~= YYϕGG\\$$//qIqIGG00ZZ @@88--++DDVQVQFF""++::66pSpSVV1D1D%%  ss..**99X:X:)) %%bb::ŗ՗HHvvDDpp;;&&''##??[[^^++FF##0000""NN//>>UXUX8\8\IIF'F'<<((ۑ <*<*BBOO>K>Kg6g6VVߥ  ++CCjMjM>D>D))&&qqMMmmEE99MMNN%<%<##NNee__<>ͭ| | //>>11 ddff\\;;H H $/$/5511)")"9 9 BBޞ''}} ((33/*/*22mmp#p#)0)0U6U6889933U$U$ ϱ]]KKTT66==00  AA+ + FF ::L!L!__ooccMM11kks s gg??u u $$4444g#g#MM߈߅--77NN''++??CC!1!1 љyyxx{:{:tMtMJJ"5"5||>>݃҃҆؆؁5599UUXX;=;=  55##,,RRyXyX>>AA55mmɥɥ55(C(C-8-8ӇRR7777k;k;d&d&ʞtt̆̆ȡȡmm͓))HH33 ϨMMC!C! Ύkkgg55EEIICCS3S3ߘɘeeRRllӸ~~::))((++ p p uuںں^^aa''''$$ ׎ю++A2A2((ssCC·΢--++ճHHKKw'w'+'+'ҍҁŁqq88 ##))]]nnجҬBB))A(A(ssܾMMKK<%<%s*s* ) )!!aa &&WW jjss!! JJ00 XXNN 9'9'@)@)$$$$ffgg99''=1=1M7M7y1y1"",, BB++PPuu88JJ  66 nng,g,2424f2f2w&w&}}77(C(C>>b+b+cc\\XX QQb*b*.. ) )hh9988EE\-\-::::++nncc``**rr!!!!@3@3n4n44$4$LLՒ~~//v>$$$$ ffssģˣ˦ߦTT|"|"&&~~ TTxxӫ33<<33^^qqՊՑՑTT..::(8(8"("(VVGGU2U20B0BOEOEX:X:##xx""HH] ] ''99::++JJ99 $1$1~4~4)) ::%%ڼݼCC? ? ""2222""̟??Ͱ 7070..  WWmm::88BBa/a/33F%F% ʹشvvSS-1-1BB{A{A+.+.  pp||$$>>IIBBU+U+ Ϧ66bb77GGdCdCL-L-9 9 WW**>>y8y8BB=9=955 &&A1A1))ֽظظ,,   2 22727B(B(5 5 ͕ŕ``e e !!]']'ss--üߌ==## 66TT;;  $$X/X/&&WWww..҃ 7&7&)2)2V,V,ZZڮ˘ߘߣ44k:k:$-$-чшˆGGޭl$l$V;V;>>--ИКŚQQbb////eeߟş##**??AA'/'/ 00gg99--!!J>KK))K3K3(( 55SSȄЄ 7'7'W:W:<>--((AAAA11KKQQWAWA ԏԒ’VV77-- H HMMe=e=!!сSS L,L,MM\\UU::YY))""'@'@iIiI;;BBxxÿʿ((??DDv6v6""˲˲GG66zBzB@4@41144w*w*uFuFRRII// ϵ̵ ee##::==<,<,V V ~~ۼۼ''`?`?BB00ʻ##zzIITT00<7<7+*+* nnaaUUMMyy..<<22\\×LL݌##88<q>&&>>ddx`x`<<ttۻӛڛ]]  TGTG!h!hhh%C%CVV^^ddppbb==ffpp]]@7@7ll ]%]%q;q;^F^F{;{;##88㽴LLee__  1100``uu@@))(2(2..q%q%55PPFFPPf+f+kEkEHHZ2Z2\ \ RRHHӿؿ''s!s!LLHkHkououUjUj0O0OB,B, ߭߆DDIiIiawawee : :::^^֬ ,,BBDLDLKK??(( }}\\!+!+^^ssff>>a a ̳" " :M:MGmGmvvddg:g:PP%%55lplp__--NN&&pQpQjjeeDD//ۇۇxIxIddaa#A#A ))H>H>jmjmzzXXVVBBYYxx ' '__g|g|llt>t>xx{{מi:i:YYRSRS++II IIגגߖoo~~ii ˶dd ++g?g?w?w?++FFSS-- + +** B B ""QQ``źź$$EE>> ( (773535IIBBӢj*j*X>X>V2V288((8844GG#I#Iz2z2ddЖ8 8 NNsshh+2+2 XXttyy))BBHHe=e=##llttHH//JJLwLw~~dd,,44ssYY\\~*~* 8 8h9h9--hh؂Ăěܛh-h-CC==KKһһ33++ݵݹ**??DD99## ``ee%%00,,BBLL22GGJOJOyMyM0I0I(D(D#9#9/!/!VV^D^DPP*D*D^,^,::RRV&V&3333\5\5))%%ll   ++f f 99 r+r+hDhDOOGGr/r/ss__FFYY00ssL L CC[,[,NNaaVV--̌̒33WWdd/V/VP4P4R R  AAjjww__ % %̇YYss > {{{{ccffHH~(~( wwttʪЪllGGU&U&//**::++XXGG@+@+2233.."$"$<E>E::``&&SSǶͶͯ  ((h;h;<<,,˸ذذggo$o$5511~~Շ88ΐMM&&&&{{..||ɭҫ!!88//33##))ƸƸkkUU1+1+JJRRBB!!||yyר vvԪԢWWqq\\Ťj&j&u(u(ttҫoo<>W&W&++hh..U@U@3D3D55SSؔϔBB}9}9hOhOxVxVLL556677!!KKK K A A4Z4Zcc[[4F4FZ)Z)> > && &&@@JJD?D?!!::ˍ  662>2>'7'7H#H#AA'')) }$}$F/F/&&b b ^^QQɇ^^̐TTdd>4>4g;g;++ yy==JJ!!j/j/==<6<6Ԝԭ­ ZZJJ&&BBJJ;;]]}} AARROO&=&=77&&CCGG22 ̭##HHT=T=QQ'N'N33Y Y ֳֳ̐ˍww++jj--?:?:3232ssQQIIL$L$⃾oo\\ rrdd//|6|6B)B) 77\\ȴѴћ"/"/cBcBAAe,e, ǙǴƎMM;(;(<<==R*R*\ \ ̝̉ŝӖ 7 7QFQF@@((66mm%%GGVVMM..׍J9J9/?/?0000WW!!ˤˢ==##77DD;;PP//@@QQHHV,V,\\Ҽװ;;3Q3QLL--ssNNccʸ,,0>0>KBKB77rr44ee;;(<(%>ɉkk55BGBGCC**jjաff**0C0C]?]?  22DD܆܆//yy3355gEgE;;   __44^^%%EEMM::PP--૸Ҭ//rOrO;V;V>>[[ؑHHr r *+*+99t6t6##BBԚoo``  HH S S>>00ttÿ//.Y.YffUUz-z-bbYYӲӲooRR<f>fEEee==Պ((kk==`j`j||nn$J$J  YYii޸>>&d&d0r0rT`T`44..ɐא׌&&GPGPmmss[[,,YY++Ͱɰ##TTllieieaFaFCCɃVVܪܪII""LL22̘̘ 22<>EE+4+466gg~~˔ؔ00>>ܵܛЛssjjrr>>:P:Pz;z;hhZZ--QQ2"2"JJSS > >55٧٧aaLL00 88UUUU66ыыrrااee33[[XX66MM jjNNSlSlAaAa++FF99eeՈՈ*K*Kcc_g_gYYAA%% II  :(:(EEPP<>ppHHhh%%BBoXoXddbbPP**ӺӺmm o[o[mm'']]??մմ %%22<N>AA00::ξξȧȧ' ' ##3+3+5 5 VV 55{!{! 88VVCCƱƱ>>rrkkTT0099,,Q Q ͖88==CC֐֐~~****DDPPEE㴫kkڥڥzz 3 3>bbѱэ##@@CC))ll22KKgg}%}%BBHLHLgBgBK*K*k k 99yy2!2!++p+p+77NN *.*.KKYYXXQQKKuCuC2288FFŠܵ@@OXOXQQ88c#c#--;?;?FF?0>0G G EE ||33<<55,,VV~~DD11*K*K@@ mm66llLL$$55|-|-$$WWrr66bb((QQb^b^JJٜ}}ننҼҼ::o:o:ddpp*]*]1122 LL==LL>>rr~~}}lAlA R RDDMM󵸑mmss::[[ZZ66||?? <>TT))SSjjۭ  cU>VVPP99ppϫ) ) ׏99 77m$m$::I9I9 GGUUȮȮJJy y 00@@99!!55]]ιչՕ{{b b +6+677  [[{{͹-.-.=S=SG[G[GGa%a%**\\ww.. ++}}\\==ppS>$$OOە  ((====$$$$wwԒʩAAOOTCTC'' bb44eUeUkk>j>jJJ٤NNC`C`NNN%N%jj))}}88NNPPF4F4ijij<>`!`!99DD}6}6rr||×ٗQQw"w"9393,,]]mm))< < 22##L,L,..&&Ԃ??,,  > > vv%%ާuu33__AA׫,, ⰚħӆllIIƐkk҃((^1^122!!Ȃ::rrDD  SS88llڿڿœ]]66#\#\nn g gII_ _ YYEE^^``2L2L))GG 99NN+Y+YRRT7T7   DDRRnnnn [ [0@0@ ' ';;EBEB_^_^aa.I.I!!33""ssaa,,M;M;DD>>!!||55YY ՅeeVVgg;=;=PPNN@@R/R/!!pp ++T;T;5?5?22 II<<B7B7ULULSS@K@K55^^ii##636388x1x1ccCCmmpp55s!s!!!kkssYY@@88''BB PP<>USUSPP//Ђvv%%,,абűŲƲƫЫrr++2+2+<`>r1r1X%X%!!SS??vvˀ\\l(l(NNVV(A(A66 !#!#77FF&O&OKKE5E5 ًЫЫZZUUz#z#TTYY[2[2򋻋ѤѤrrհhh%%22r=r=x?x?e/e/ ځHHҜҜbbΔ33OOLL9*9*66ɶ99ee]t]tcch>88**]]66,,EE߄%%..''CCn'n'22g1g1$$!!::::F F p p  ZZA A F F { { 11 kk00 $$ $$] ] **KK44%%**&&WW))YYYYWW + +"("( ss55 44!!mmUUܲ>>qq{{LL-- //xxݓ NNAAUUBBٶ٣ۣrrFFUU22mm**^^>>  e e ( (  HH##~~##) ) _ _   \\wwwwWWbbCCwwzzcc  ||ddYY77::FF==]]0033tt   IIx x qq!!kk~~\\kkLL WW** ddLLO O gg " " 55jj  XXuu""vvww C C MMaax x N N qqhh""G G iiaa) ) `` zz  11J J o o zzww !!66}}GG::]]77qq]]||kk kk  ^^__88bb""LLnnaa$$ppuu<<//==00bbnnDD 6688nn2 2  ##11HH,,h h OO]]bb||OO((zzrrqq>>QQ  JJuu@@((^^;;,,..::mmVVzz>>CC!!__wwkk""RRnn >>8888$$iixxvvvvcc[[OO``ookkyy8866gg IIBBAA00 AA==##HH!! 44TT--!!llSS4444''22$$ ;;UUMM}}bb}}hh``]]vvcc88;;tt}}KK]]^^77 %%ZZgg \\NN,,dd~~AApp&&ccrrVV$$00VVll__//''????00&&3355++--//!!   bzflag-2.4.2+ds1/data/shot_tail.png000066400000000000000000001306631200563112200170550ustar00rootroot00000000000000PNG  IHDR{` pHYs  iCCPPhotoshop ICC profilexc``$PPTR~!11 !/?/020|pYɕ4\PTp(%8 CzyIA c HRvA cHvH3c OIjE s~AeQfzFcJ~RBpeqIjng^r~QA~QbIj ^<#U*( >1H.-*%CC"C= o]KW0cc btY9y!K[z,٦}cg͡3#nM4}2?~ 4] cHRMz%u0`:o_FIDATxڬym[z~RTR$Ѐ0vw4M1! A=M4Lt6S7nhdHB%4T 73{o?Zy2o oy3o5쵾[DhϬtӯ|ψ+ǯ˻OhG_[1{=3_>|LDB@DG_}+D a7,w >q9>:ǁa^N_xd9!!HH""=̫A(D qj궘 'E ]O~wy¿Mֈppw[W֫D L,DĄunCXQ/ޜ"\'_{>m{9{jk#7.>5?|sw򂏏)/y<]fvbG1IbDBLDu 8;G=}QF$LLLX 8;{)A4|"wO{7w$IiOHĀC5 (ID %fJ$HA(Cy1bjEx/\k dž/81,ԾB]]~1Uf"l?zU,I >/kCOg3+ǣ[y|WWS+ʜX_h$%J~ ,4PB&AZށ%Kd/^,{ŔdU{BHdD'J   uŋ^hf5df*E՟dƿxh""@݁j'+*\ w>Or Z_üDŊ?MXwOǔ 2(D19.Ag-ϖP&"޻ Nߟ NQx'oxf>qDR!/W$I$5wh?۬L? bM$2T FF$ :/+39LmCI6i;)H~Ϟlx3OT1|o+:N!AdAƴlx#' @B^#n}ygʔ뽥d;?w G{DxL3QSr29p1P#AB>nNgr I0ldLɖ/d-<@"K/Q|Hˬ~{0&mBw<5kdvgh2&a&"\_A6Q.kPo+Fm M4"|qq';[zΟ_KQB"Yl^q?;VaLl2my2ІGXPPN`fl線h0FiŌ=sX CJÐ66r4H 2 Bï@ f-&:mï/:UU"`YqB7i;\E-_VFnG ";% g~*@@ #dz cڤp!R|!?-n rQK^?݂?{pP7/Qx81=GW8 ivet!ox#I[D"C]C]} 4@IFxM<$Icڦp.*]6+|拌0P/>`%H'ßƴI"]57gxX{g_//$ ;}g$gq 4&apҕ\ȳ ɆG(@BL DG?z Q[ƈ)ϴIi{# 'J 0@$HH PߕvHCJ Wҥ\U%oe7xo Ҧ_ 9DhR.Ӆ\ViG/P;@'p/9% /s y,ӷoJI6.R*]zQ(qn׸z U/|'z[.V"_Gdp!W Nv !'rҥ]ҷO!xZ+0wP⌓Y 1>#LOFbJG5HH~ܳ?I,i'ٲ來x i;`P={Rv6FA"Bnה*7ww? aL[HWB҅\ɮ@[މHHuupK,p_ ?·qqŗeoG6ȣ$@DH PPHN}c"=["fI沞I Nv܆^d ၃ӫDP@v""~"ϖYl$t>oy h[mwk\2w""20&J| ?з% b\Ȗpp_"D䄄h W.Rh(u/-ш'Ȇ-oyc[y#dvrIa^qW&G}3ERd-ϒr.e#_Ȧ{a/tAx%@o{@=(Ld+̌cydž;[_q3^0gu9 3@+-ox}D& "6wpI!>c؜@G dGn,HXB@BH ȷZ訂,fX5H(Μ9Qny~mAHPX/4ܵr|wXHwekް@[H:-*|AM tPP *0`ahB% $7+&0Uo|zj^ oqwWo)', mHXhzy74P5~j%2v~6x@Ren4HgxG ;@y oV#<fr2x;cr&H< o# _XU@qH#W|f 0&``b ވ=K 85>*f6DmPT/(L v³像<дBa$&a)BBH$F+G llxByk6rͭ!b&@&bJxTj 3%2"1Y|Y^%"<=6/$<̛_s_cƧG{DoqҎYhGA1艜O<ȣmxh?0\:߈j υ/wOG}_e[fY/x͇͙B7ŵ|7{ aC!!(q 6@͙DDm"lO0@cLe!&!"'-%7@'fW⍠0JJ[Wgz>0q|pDd4Pb$z4E8:EKY# 0avFl--[*83: i뎡\HOᄂ [fɭ O[D)}'">AO!ijmn c[sh!{>"A3sӄW~z"P!BDB 5AHC; 4 $rzBo+HnQlb-JH=j(qCzH8%*tA3W1"A^{f=".n0Sz\ІLč?a5 >6fAOD gtQǯyH@X? IcK'FFT0L83|}/钶ΚJZr{ ꖐ Vx1iO8<Nk- @L@eMDvK-70+=!gdJ%~;]->/Oqzgaj(Yښcb$@$,% ""$y3"*fd@hPK|~"\j @6CY($Ԝ_ ~gxݠ4WN.Au қ@ȍ;K׬:r WSiтjDl'9 ;W5͒U/_٢)ҟz M=@AkNSM/-F{F/7mxoh]˦p>.]ėį4?IA|? G |>O$':$8V|%&0QM`Vk[n;q@lG曯KH|Rz=Aa- S~TH @0(x _>7K9/.VyY@,s/ç;B06jaǗӫ޺.5uX'e`nJZ_-J `xi\~Mn\ʜ5ߏAs=6y_fx~~^ cNy=O\B >s]ZܹcO @ O75GƺC, o7)m;.mUB uo ɼ%J?{{ݓgǧ?<{s05V tٗg~꣓G^oߌ^Kh+߮>{Zok>]~q /ğK~~%4r /_٭|#K/m)]=' @ *]7Z_V|3x^~vL^^2|a`VzCi6!ljj}6[f6`}" _ :9ajm:O>[ٲ3/ ~1ie}=a_ 9g2f-{q|e+nwWF_0єfgcԖ A wsc]ʮR:6uj4[gd,8)cRdMJD_NyM]mf>Ll^{+[ZZfaANm k䍋eS/ :&m^ݻZw *68[kgbdV<[Y.n~,Ԇ=7|i%g+(XUJ PmTZ;C=rOk_'#S6 4S¹z-GjOKzctzlM6`ً3S3*s56l6GhTO#BQ )\-ZwGɆVܞtTػihoylf+67s㟭Xi}C[NhU-[; HDph%t 7spl,}f} D+:v,ENLAN'CU?f|f&լlU硖LvK3 s4xl _Z_V|/Vt^ } vP. ƒ+ց$۴ŸmYٺcOc+V_՚:1"xT 07#x:Z>h?&-?_]krKQiՑ9m33_Mv{rt*nÒ{ >dw(Q"bt07s { vi:JˎjpZ 8G}L~gl[N~u*s12__g\A]-{wثLr >[Rm[~gh^l]/;fŋMvX?AnVeV-iIV H%Ƴ'1l]vf;_[ֽNeRqcҟ]Cɪ%/O%-=|Ya^2ro'e],sG eew_mw obcmrjk~ xZ6AkzӨ_MRJ.GO{/UA~⹽w=I|-`xҬro,Q6ޙWl]{S}˙&9Ҙ_O?-IMN?h+l\fbڷ͇6kV Զ{-RhMz;Rዚjg3fBܩqhv#ȗ1nuo{;ޔ[TUlgゔIh[O;kheQ3]SZ4Bд;Y[;5}lok.ˬvKXd%BZhC˙&IISV[)7z7C5pcf[&BQM }QoVouʳ;'Y =q(!kTy^5^&A} s FY[ [78ϪZJV\i.s+ySC[^xZ-$Ԋ <m՛ϳYT:fOe'ؓ,8M!AS9<'^k)e^-׈:۬YZ &Wl_Y[TiKn#+ }l|<Q8񄿻lț$fTs,+ ࡪUM+kyIb-g;["\˜J.'%U3ɘbŊ;)n#0ZdzE2n.Yh] "vq@Z,bJ㟸M2N9T_$'GRO]S#-ymIgN=|m*hj OT)^BMhm9Ѩ:Ge_ZLB?:Sۃ#ѪD:Ɲ~sMcniȦJLMȦ}4w ɶu|2e^˶WѴƝG<}6AD>.ufPKd^<_ٟ;=$&!uk}kgu2_4 GR .l]1],yҗy+~άv埄QD GB#6&b&ڛuOU#̊z ר?tj-m7߽H> Fs_kV|iGOBȶ"{o~cţ[:W/c^|vp/j=& a5-e%&SVZ{~,O</4PDx矮O݇wxY /]|DClJQ{>&zIrh1WP/o/{ }`>T?\ۂc+>©@#?8;;'klb"K 4G)&?JO#T8!z)\?h>y⼗*Wk`oKpKװ~ Z*k8?uC?kj`F,Vk T <#ek3wO(|BitE^kxjLZn+ssxlmU`ɕska*4~ 5ca6|SIc W\[]mZao/?33"hhqPAj;OB@b>7͖ 1[Q9py8 hA$I܂!P+'!B]؅] ӽEHԎrl/ffUn 4{dr¿wM/Z5?Qci0oZ1 CUJ!4Pjh=)#Dܭ.=پwF5CmG|It >[PW?_VP_ {&EaEEi1-O?aDhuNQErϾ M8H2yiݩ:8^%zaTu. 99dA <&M{D~Zn Q#p@L*% 9ʂuEybG5ٿע:R|9i$2 Up[ȶ (*ѻ{ȖyOz '6o3X>?ChK*jn1G³M~=M9Kw ? 9[s4$idMڬKR&^O&87Y)$$iû __L0c^Mט&2qqeH[V.d-ohډ&l36ӨFp"@ nŘaLa#cox[lj\E#~Q_?_ ?f4UǸx״|*#~/٬(8QUR%?1a,7r[-dJ­#s6Ӡ#: qiLCJiƴ]ɥleUm6y-Vşwq1 N!dvU4GJZLMs0 >~x3"=1!)qVi' _tV#0,sMmӸlƿtekaH76Ӟ퉕g!bPW^9|aaؤ:i+|!PW@"X3rL%o!BW] f`1mӥ\7}ʘ%#C x}.|w$o4ÐdX䂫~y]UK`PLJ4`B-v+ Qa$0]8GGPޱ  p+c3Iiq UJz">@j3>ЀO>S 0{q(w} ,a\ez.Jm= yfO4P yP<<;[I)0ld+r߮Z;QGgnCwt%/+w_O!Mj5)ӑ{H6`fOvڹ:h "sEdLet!NS2kixZ;T޳%?h"nn<5V;|ndM'8IbA/B/ ib ,%1AY"~'DDI̜d x'rŗ\7Tzk +|s#u6 iIZJM܆pZ__r݀7}Rb!T µߧf Eae?>, <ޱ?ѰW-~ jtQ ce[&@fCޒ owﺐ<4)Qba$n(6W**ՔCdBF-e'|q v5_]Q^0<7Q736I6BYN.y'W\/,#UWl]=+|B62P5Fw#0K7RwkY7GZؿM) 6 ~~?EySĪ^@d iZUq׆ECz8 j~#%Ɩa=Z~U#s\>)3>wj3;l* em,/]E \fNd-dF âK+K+J3dX?q䈻\x-  >x~-qEf߲JYU,0Wob6.UT-GZNךeVh26N[ix"40oiگMpO L"EEICdߤ(~L3\<҆wէ4AyZM{]?Lu #$Fytdһ-d# 2 [OmCE,srR`Xk1Y>#}6]V.x#l|fȆS=aX; 0`9(1}u M-ZURZ.*]Vvlh#\>!D$NJkovSJ)"]+˔[_,,͆E̩cGcQ)ǎ^j, vAJLFԵ3F6;Ck d&jxHS &]\Rs.d Ȇ2ra/vzl)q)Ū]7TռҐ\zʆGyXٟ6&&ʪ\ڢBzhCFqđ }މZOD>!V L .ǽvJ>PD# ]hhC 8D(UZ:&\ A!_׀H4'/B2I=Btpl_IUVA@g㵻sD#84ޢhHh3$xnFwpNh 7+~v]iQh#4` k싈L$m:u]"݇:SBA5)IL% 5|A*U '3){zסSp7;1v&F <'L-c]tU<pɤocjk٭߁`9΁.$5$%hıWgقLC!1wOu!v(/0EæzF2D^*w*&RLPPHhDU+ُ(887F_Av+xIA ZrL4^ :N$ËT|,BB7J8L߀zvߥ#LK_ Q(I17M/A"@1" b[70~o^7:>cXCOg,r#;~gdK2OǪf93x߆톹ˊ 2 +HhhzƁކog jfN AݱDJ8&: m P&y\7 D|n'P`g@{A ~u^__uj6-'#$EJ s4?ǹc{ 1H(PYؿ~"ˀ  CHwt?ҮXkZ y]Ddz-%P,dN!cX>2B?0"0P `=">SUsx &HAH'%P迱 |!C=a*@/:ⴒqk(RD*Pop[P(|Gjqhi{-b)P_B}U?u '- 5=~E >jL{G`lSAy fxo:Vu"5˚^% N'Vx_Բpeϵۦ"Ӊ |%O)RECU*yq˶[V.־x)|3}e|jDXwl?RΫU&wW~e×?@p5'4[PN_^;fEG?b{VyȓhyK)^xW~}$EWV᷆h'm{5۱빢l_{D7yYsuXK#jl"g0(U|薓baPjVkє|T$[fx)Vg}뀩kjs&{GS/Cjۼ[5Uuo'r{ׁPw"'/U",#TədRWc$z vHΊ5|Q@Td%K̷a/yә5Ve'5hՋ]۪W9q(->KwHke竻x!!W6wՏPӛ^s3WoC 3<_̱7I)jeYYſ}ѿ̖ǭl'Tu_{YZ9'0A|4p6[E6o/OKe8>ţl[QjҦQ̵SVS2wS#Dt`g@W-D={l75~oVXа"I}]`bZNN߂7|5b)1rGpD=閭uMɮM9gT|hkq1%u5A&i U~[{bY5)Ԡ?z2U)*auW~e'_t0k]}nrf}Ṿ*^L B /R#mݙY5Zezm ?S^Ef (>515~U5Vl ϪY T T\P0Qɴ_?7 X࣍)Q6|<(⩬- 7IkV)Vx<0bUrg*[8VКlf^ia}6쳍4P$#hHЃfa~e ͞i f̓6RBs*[lV_kYљgl_j\X9&Wq,jU0n6\W6A2HMMm̙g5zn8jͶꙺU#30[|mj3<۬34ЀUlY7IFwwE3|K D:ÿ/@5mٲsmZcf^|Ĉ5 qy(Ш/e͹}ZOM묷l=ݖ^r2%Յ$$>5KsIw+ ~?LeOLW te굇:_?W ] WzwzѭMaDZ_+W}J֒gu@56[CKBAU۵~n׬vIzkllji$-\loBҳ*U"PͻZΤYgm ~M+p>Oc٫ @/7IguZM RxEnɝM}euֹj'-u5 l@6%D->ex :8zRt5$?[-ze*s2:t >1pku*Ӄt?q(ut>Ż}9s٬ve놯en1AkkL3xDsFfJ=wɫ۲u_S.iWYAgUݤš5=+|8im4ˈǽ8{Obum75-'Ow[^eKqj{Ѓޖ޶e 7h chkuZ?d:^/{m/Zt1dVC%paɅ +cc JmփM6^U=ZrϡALL\P5VgQ_}nє>ؤmjoʡZ[B1-&ʾ&ǒHNޅ̲A/+dT21I6OwEXWI&}hoLn( s#L =[\_<鬹^vg`-Ih/jcŧL= ܡLl}ÿ[}n3XßI_j@JsWNco+{?kY?T .Lkhn_weɩdd>^,4G7VJ-]0gkEx ԲAzFM>KR<휝KIU0.~o^Z04;sي|CǗ$J 7c ¼_IO%TTWJdΒ}KGLZ%~fgvV<\T#5ڝN޶Eڬ3NymC\Ts3'x(=g+& hW@@m濯g )|XPdzN[[ro|#xr7kxFO>[[;4^'\xqJMvzP^x7:u[MoZkTnJ~  r|j L-+]Mg}c t--=z{=hO䳊q-K햴n [t_7l-Av4>>żoP/P[vY!dIso ZRU)6ɖ6<@B o?&u_/A:;LJe:hճeK>, X,mڊk?ڤ:SE-|FU^0JI6H@ÿc*k j(EfZ~GҲzrlj~YK)Z? ~ ho-DT=ℷVx͡y?i+}fyc3 _pG|YgKQ}!;KpexN``Ջ_z6qwcGi:Ԝe>~GBߎ|L3N&ϲ=ob[0ƿ'﵇>+_S8*U#$ĔjJ3`{<$V `P3$j n YmdzGB p-jc馸W)6F-4P+F2 :_|yjQ z|Uw3Sɖ9-wS?*^J

8Hj6JƐǂZ<-ꑡܻy3ݷ^TU&{}tow L Ymap\{y8VŸZ q]Z|57ߑY~u.DBB^YTZc_÷z)E t;@b#ZQ }C3D HaT[ߠ@{?oKju-3 ;I/ h*=?ӧ}nٱWO=BU]=u/3P8TuAA"db_I߆r /m7Ѩ' ?-y議[&zKQ3 ~}ߎ2$_/5ED1׾?OЌ?o{5!ߣ* [=TZWC00;U\k>l?C/Bn[_+|]EGjG>;5[*|-|𭰃?TGAѼׇD2|D{%O\&SPsC;"p=n^8E`ipl.MN~ʋ"\[Vפ;/-m3WzkG|[ ۟ԩ~} BEv5x6m0JKNږ{u 2;[ "D?c3m?nOaR`[}-0~\\|ψ'- >`=Y"z00{)-e|'>/}}x5>_/_wog_`sGm/F/7kY.@ t\gZ;/b<{y*l;l}:/}*'=T{,aß:E[}?K Q- dHG0ozOa`bfaџfhK@8ο3 InF<||Қܔi0Og1ubk8n7ޢ_='u1:ЌWuZxpl~>f6_A@KӍ?}cQ +9{͊ O'ŽW‚?/M$)Oğk_90b*swO-v[8E&$Y 0_^.o_?kE]~=< H$$&&IL$7. دE.>_+>J$Av*g^,X:լXQW,q S$$Q37f~ ܶꍴ':OTyѯO̔Hx3IJIU5aLȨ )%,Ggڟ >w^=I$;Gųv}F?g`ѯOi$#ၪv{h^N(>Y'ZKKӯD ~Q_sz w\;lg-pK)4QFkJ 2%d|.MWµt?{7ٛ?/n7i-o[xN~Oz Q=<I$ 2-oysLhYaaDVƘqWW/68 Idd6 xkBL<_˿[SƘ14~_TT*C~v? Vw7iFVvkґ_/$gkdmfuߦ 5x?laaȐ6rM='&~?g =qF^8lae6\,kp(^"l柱o"6 'xQ?`\F.x)ZR?h3O'wď_EX`+=q{LeWBNlI60uzP"6%N%Ou3fHi3ԔL.O@Nn}3 Ҁ_١iVG0a..]gHUH/nTE]%,/>0f4ր^qq2]5KLWUIhaII?_o~?ƃI@aDavJo/d[^=%p뫸]w_6 fq;yW7`"22b˧CWW%Szjo`kXWaQ'426Wr;K+ kP7Pl76P_.lx# LJxP/a _ՆP㯆h0x,ߔal[ox;c<l#>PJ+z ~j!\uLpezqNȿy '~6CUP?ǿ'̻j3.p¿F 60ÇבN.=J͉fO4b‘clz zOlUz≥T|U{O󘃏~iYV0Q/SRVt!VSk|zScx?F ~ z^kRfKEdL-yOV]q[X(I~خKm?Xk)yjpli֯sȅ\+j?1Ӏ Dϊk_oC7ooнx"u:/IQk͸M؊? IxK˕w2?M:Pz-yFac;4W٢_m_T47 ?^ukD 32 c~<}77}>im4 Ihd(;v22 rC+LiHCڤMLrѯM=,bW64 ߕBC10dh-[}v0+*14mH_Ȏdžxdaa؆nalVI ! ex[m4N7iv;(BvrlecMplKԕc lPQV\U5 M3;w2=CɫUem)=!7xBYiCX 7& 4h ʆ72&0IRoKuk|\]9fKtQ 6[N͗I+=B"`s;\jPC ߐ:M>U6MXQ.F26_N^^U l7򚈼&&vyF6D +(@;ؿf@Ȅ$h %p#nH~}3p1 v#8 nT(H3M$6}"64оstOT7D;p7J>PD8 6'!LfiҴ)}=4)"IS:mx،Ƴ5*۱xq_qNĄԕK;~5 x "cl(7n>Ԇ/4ҌqM.B¯T|Zdݑ\<>Njv9ODGE &~N7f2$Ԉ!uYxThU%o!_M߄&&$gI9=ps/X{&p{S Zv&$%#!G_I7Â]$ud2dt @j=VSmJ@OHg%bJ8sk3b#]P, Rtj|N>S `U)gLh?O>O_E߈W w?!5>ײ"B?aj-⹕W IISk v ӆ)aZ'V q[L(ȘQ@yU $$`%ZCM' "2G M.$MO3&HX:~+-HPclu}:b|/ 3$Y\O ?gh|GoBb5#F<,Vt9ۧ%p? l_şFh~~ETK_Ǻ*=jLjo&›tt :>JXDmd.QcE?!O;8+8d5[&b AOX6եpbϞl310 dޞV'ZXkVnp7x *AT{=ZbM %~mRP `PBH ƯČ["/ ~>d8-\Pz)܊c_{KB`86OVRH_ӂ.p4u/_+G^D䩵9fLßOC%/h L>k^vB⏋}@_ZnL_T_ oN'h"A4|-fe@`c:|6}it8_ N;ޟ_=# j-sj/ZʐDHe? plk0FE&R1:+Xdۿi1F oV;>ީXOQ)үf+>W;栏ѢqxRɔhGeWHa _12NJ߻4H4Q>bU|i/+ex;P:{iCS0 .xW-G»h|M=4^߽4|]=4[rz8Lيo+c}]&~ ~x |I#1wp K0/P4" 1xCE' Jhoj;=1-7RJ\7nJOo&ZҸaKcʪWճ&}EML+?&VDOZ70m7ol/ɿr9 ߁>?ߴ犻w p)W<2Pf']D}jz*4gud:<˸VU3W7hV]y=ZwO F k},E^K ^Jڿ7@/5&V3V7/(;x#K3ξEȰB[닫?Uɾj7uF愄`6˓Cj ZuQ>|oW4?H]=sƒ]@#z=2ۛ>C*]Fg6yRgAe=L GފWƒV;Bѭ ۼOUQԋ!ǂڳNmdž? cA8,0˷WzGٲe|ln,*UY|_kC֮e, Xe&gWnffYg<ٴŸ<*p*O]D> Y  A'?_UAMfC9ѯE["AMD1 0V2һkzh/wm]O%kiA OiG.-[;])e #~{CɚE=gC1ƫ1>Syx<Nz[m^m9h.Z"Xӥ?L; Qmy][m^ui|<.z{|QzuN:/7庩M:-e%`@ HT"hP-$J4?zW^ +k\ŸZ][,<=N(8!fGώS}e=hN(CӯN:p21Ȓ Dp?B#-eemIz{՛Ev>5YZsj-ξ󽣻/zfnw/M>KoE ޵U>G^Mͳ?d7I}|~Re*%_(+]^wbךCszXlS=rjޗ.szS}_[;e?T}υůAf?_kЂ؟|賗{uwz]˵6\t^B0q&D Q({wn|6kU'GK]JΥ(g[;H y=ۣ]v쯷Y'AU<]/k?Zc @$B^GKXgş\7vtI𫄳m!O{!{<>gW/kIfskʜ8ހo֜%w%dk-Q߸us{Mgozz]>?^~:WS~1.ܲ2k­:߲ͷzZ?Wvw/Ϳ:z&F!,G#hn#~{×^.YχpP{D {r;yM>/yQ~sb\׷yp?Sz_}F7ߖ}M 2\2w{+67n@F_yy}?ԣLşKY!dQ|@ v[FoWKb] dsYgg>E6VxČLWxgajCᑈ}_}#FMXPiGrt7zV)^yU4Ö(xy_OY3v6*_l|Zoˍ\@.K-dy, y0iͪkNkҊg˶zcћCJ.9XR`KZbD 摓%z2ǏBm ¿%E.> !#fѕ*>O%>4Z"הzwK=7',[Nw:s_al{zk謳΍~:c_`?-O/қ%cVSLM6y? 4ә/;W%ʨO6~=4ٳ~Iv~?jtM]}wy_V%^]"rßlҬsQ-g6 jC:6f)- ބW熿/ cUqb8?@:}<02* }jYMo38]Ld֕;Q}UV0YsP?ie[vuonYϖll^dǖ0&p@pC N$x؁2XRPKw[ڒ[-}:k}9un]{УϹ^{byÖ$|scpd{zͪ}~/O,,bc-(ueeKnhVdjZK]?v='qQEsb깗Yw7qh1dUHF`Y2ʮpY8fVVŦؑMCp tW~}a'w?E? ERGT];en :-ᬪ9a[24U?K:#,_ hҋ6A6 Z/fn*j})g1_O% xي|n3ԎՂm6$CصT6T0֛o7oqE#_% <Z_ŃT!A{b>D'a ~!c{p2+7 SG~aA$,$~F"Mlzu Nn~@@ $NVnfM8m3v[_ PyJէ{o;~V 0 `=;z S}nO蟾fԯ.(8֖Swuz ?gZ̲{sO|G)b~eZCRu 7R7éݜ-"b@32= pFX< zujQe!~ʵ~hsF"j0VE).+qO)Bի{X ܓ0iWpۃ ֟SBN8|u0>1龯bҰ0@φkRVrZdoY\z%o?BҰ0WTF1y$(@VzIOsY 3':)M)~k (-"F%g@fI",B|<=D%f3TLzL4@5n|GNL؁YQ\M4sа/Ҹ'` ]|| !lM'sKgkIF>OU-Qa͜NҤT\9I'-lz\[AeUfsϠPq@Q_a&n0EgS̖8scUc}׋!IH'm*}r0׏*]f;_ҤFW.tzN ncpx³_=j7-i_eCR"IN7[,ukrh1<(Z5kubmp%Ȕڔ 'i JPJP@|.3"Ԥ?V>ͨ>N*i :kI}V_R?{_DD)J) ?I$?k>?@ ri$o5~?54mŀ!{m!u9jŗ.x`pJEsJCڱ FhZHX4|/j_ѫON{fwɻYenyFde4q ua俫݈4""IT u4'">@F zc `oo5ܶ+Ҥ&IHiesnEZ ``G$levsKӾu)#{<[nvkC!=+{nc~Оե>NSno7qbx+}8E<:ޛ;Xhoߪw[?ҟ;Eeg$H[?=]R6 }Y)SeoSpjmZ^=ne^|)ƱIEJhZﴥ-aKҤȬie&_HwisڔR,A:F~M^~(*\ 6*$/F-mAtopo7'!gn,qjҬK{r&#J=m_PϸLG<C]MjYx__ȩS}RsgK*mV fÆն+Rjif6tP.2+HN(գk^o'ȿj+)z7 oAG%JmidA0_V~'_#dž%"!` ` Wៀx]چVfo\ ýv`*K8"mƿf&m3?Uw&IZ?C~[eBM}٘M"4\\Hi+e X#W!8ـȿB=~ 4xO<*<\WFf.r(B՟fVé8?>෼uwoi͞$9ϥB/EFBȮPa SdiK#ͨkgR߆Kx }ek(yS a()=;.yQΨ}|5\U<`J.pK{@ h=CWBM@xPϤ.Vg? L4Ca-r$ _/CI,Mu'$ؐ?mvw|J[ҭrCZT76Z5wX~͗֝cgђI"H+wȏ R.` ŌupHA"{o# |gcCawxԟ^ACQn^9b凘 t&qXa_ e]ݡ~1 MFD礕3PR1ϘS#@#B+XMp)~-Rnj7wY,ɭKv[6Y ?Bka7usd"Ƨ%De]?"{ʾ|RlH)NfrNUxeءvt@ qt/q4[# 5D0Sݲyˁcĭx1! !& e L@GBu&v6=p3|G<}=sncWYq F/\6AP 37bgVī:XY,8IEI_7ɏs.=.ׄTwq%r6Yؖ `#iNb(r'_krA Jy%/ b5,cz&_1FVZ Y7<ב7%p2WVqS{xPy{VI%EH~_?,?(b3swK(PNFV?Q x@:ߓذJcY<aEi!I~KC-ߎCXCZ+>-.ߔǼ鐆\KBLrPg܎K=_8hHy2яzFqG||/xcyC'5)y3ot!Ⱦ\D$1pSLʊ2VadmF |T̓V;XUmjRAz(}<="I9 Gs*DDnK7BB MOS૑CÇD=\n^H8ɾB07*AX&%B+Z*FH!x$4cQ'xt\naۉ~b) J"e[ y-D;-x/UΖ"aĉg4r '.gay[6@ғjh8Y˱|=^Qϙ >=/ 'St-A_JAa0fnj<_q;>-sCn'ni-ӜD 'R$,8 j8!;n_5]^;-淆iγۿӘuᬗT@;;tYK3 wVÙAks47aa&bBu@ "zgc x6/mqɟ9w> j BDn2}Xh93%0< 5T> %b"Z]gآttGf eS}3[qcuLZ"(·Ҍ[j~cG}j}nCpXD+HܸҌ?lq+fBΊ 7<ޒT&f>%~aP 5#/AFoxf+~6pֺ+>cf#!F-+-g♵򊅔A!ԙ1}?%j œ+tׅ0J[p1j}SѤD 5%$"II4Ƅ/3ϰsaZ\~]3~|}]?@}_0-# 4jI,\''.|q9%BZ/%XǪ`((w``dx&O #o#-\!Bgqo> ^ǏϮ?G[Lo:G1/k}2&=|?yCP09@:wa?U2ށwCݳ*i$ PB9wc}_FD`Uގߌ8`mt( 2MX }XK$DB#uDXb`\>T}*3l}o DG\U0td?5Wgd | Yګ{@2n f_T'yEGa@H"iqFs5W9ao@+%PէQo(;^<@p?w>gn>1qNJ1T M7j>.' :GN~=l ^@ ?<\""AxlKLק d2ڿ/kw1G0CF}.đ!rMfB/\}a ?;<% *| ~'d)|=,s{V_މW^?i ~&㵉,~aBzx:TDا /82>Sk:؜/upF//C? "cp;^R 9w3>9TC+[=,~>@xa~-Xɾ*G`*|u'( s㨿1(b8?4+ ;x>oˇZ8-}C=d!ECmjO/1bK@xMz'%9^pb2[>GUmac4NF?^_fR-7Ř1x@9b[Pa MBW'rDt\1V_L`5\cj:?X9g-/p)^)b9.QFu$cw<60_!и.umQɡ/J|9(=Wbu\kTKBͼ53Z\#'x) 8WW Eِ M+ *gdTa7D쯏O?Ux1LXLu2x"<:(EpzFP}B7ąhf'@'qqbǀJ.Mua`/Hk~9ָUuWiU_',1Ȏ)x>sx+ѳfXjH-Jo&Q38~QH%p$0p+Borrh J)9⽳rbCHI><_+uGsViP0(/n7k3x,. '7ҏ~P-/Éᮑa0οoǘ?/-EGq_)H*)йч_v t r ZV/̺/x*/V^0 ٯ:q.X!@ۨLrê~W|{\W;A'OU_͕ugϡ}qB8C5ln^Vl=.G(~5d(h./}/%O+)ba99BY츛1kY .̻p~tfW p +hx)O!ҏ)!"wpz]^0֐8#tp]Azkt0qNd9[bj]Gf~X|" ",Z&u5.v(C!g껹~+{ <@ TYlncljfI=H5p<+^=[fn~72)e1~p rXͬl٘2< oٯгv;k({of,zO;.M-]SeՇuqo2uZ&p :oNѷ6QP4 H_5c[YκIfe "\N[lW=M; ]K65T І97w+ 劯Ϟ :{;-:"Kq)r6V:{ G XmU/@ 054_-@.WҏafOZk7ڭ`%yuML}jr77۟%%ꑑ1&   ء#VMвk+_9L'i VZQ"*'XX ]t9Җ~M2u7Ŀ׫zeF֫2ro.KV= E$DNq%8cpXWdsGzUtկWY Vn`o u ?n+[z%EHtwګc)VRr84џqwkҗ, e8b̍.U8_AȮ]h+[B5qЮ}ν sᔂjlSogYs_H=a_ѕ~ZߙCϋ~}oOgiPk`1B1śH[ 笷/^}&?/unOwι>ko': }_=οQSua"bX/Tܢn2A/2zUOws3YJ=X#DۇzXzR/tF.ȗ+zHˏ.k7Yp;DaXdbxXC,;˛_;L!{ %Qw."_c_GvұWGrk xˏ11ekK]H{}Mk~;p0PVR֍|]n23?8󠐍rŬŞzjgX^m##*?JU5הOFYu`Lvd\^>ߗ;9YMYȑB\a ZZI8WGrz'4*<Ƥ{a/rpQ.lGʿoy8M6*ҫVQk5mT|}^zɜ-A*&u;UiKʗoUx9!" T{l&=5~?|ԵɎY^Q:b^:ˊŠ?[igU{2R`[]ŧ'j0wM-zZ \j5F~lZMcF|}jٽ^UWOm\AZR4:#{Wﴳ:UYпn?\,G|.jsחSZO2VRqa SrYjΨ۠!{2gEc5`[sX,ez'> KwSKgըV~ꫪ kDK73>^TM呿s NO \i@]^d'܇eP)>2l9v33S:HƧ7!jXzGnOݳ_DzCA6 7/Ȩw`wGp!N#<}q''+ЏaDv_뉋SnBQЭ_nC\dz: ܩoO>|;9n;'μˑPX;עvRh~5L>~`Ea~vF3: K}J?16@_OWo .80fcRTݒ&_~_/Mw} >~Xa'c?k|L@+:5Ϳ-DpIENDB`bzflag-2.4.2+ds1/data/snowflake.png000066400000000000000000000054321200563112200170530ustar00rootroot00000000000000PNG  IHDR@@iq pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?, oP>;z; X<Hb?!0@ Z(is\vZ h@<h5Obej; hQZ:t ~CY\@Pߦc9x*a OA<@S@Q;W=4kb|P՘r@Z RbTBi\9gZ &gG<)@|B7b$%Ě|ɳ@| ZU `߁Mg f/څ (@) V$b=@ff րbhr@b[ Nb8^4>\ ě d G%CDj$#S@ @,@@=I W"gpDbAc%گ.71 Ni H=e(%q tmhI श@ۀx]@\F籥iyK@lNм o;RhA(đqdS{]*X;"OPph@lH 91{2hU9e, @,$#oC'4RAD /H-h 6T(Bk!T d=t$<5Cc:-D(${Aˑh54ĆG(:P Xu&A"J܁h)?C[k Bo}CSq p$8')@ Y {-ȷbiP_@4E @ey ćKA%mUC[XK ̠!6Bo0!CSD0' TF#@1iz\Óđc|!@kzr+%H!+Zu `)bX,>ʁRЂk/DApoMTrBp@ mR@=#P3R+x  )jJ5A-UPj:F@[rx$bTh LCk4} GqezZ(ڳzm0a26_F-@1 MHMl#n͸RgHzP Z8a1Bhc/hc|[Єж J hD<B@C04ȴv)@@zx,y к< - dCV!xߠ @LXc TC+b<Zu+uWӡ~5G @p@KDh-9#C"Oha_Dh4|}Z`),ؠn| ?:@ ĂTA8<-΀?Dc2?ġU$6pu@#G 9@Ko ρ^dw$6" H]'(AF24X3ԓv&1^7 [мwZ^hr`@$֘ֈс6h!OS\qU Hmr@xI ht<۔:hWM%b>@-(v_> Dʰh'NN7A<)Q 9 '@_H jߡ,y'Jh}dgh2PLAKuRC=( I3C{ ж z Ŧ)И}&4CSϓ5@4 j8Zc`>VX IENDB`bzflag-2.4.2+ds1/data/spree1.wav000066400000000000000000042120541200563112200162760ustar00rootroot00000000000000RIFF$WAVEfmt dataRRQQhhFJ duEް=82%Ui38zH#  &C)jm[Vm} (-2az@x' ޹C4% x7?I>q}Z7s{Y( {> LvC<  <3 m[ ֡4?~M Ft4N{,R[{ c 4oPV.y |* gQS s)?9- p -k O 1`HAJ F "c"0, A hX/U08.0  p!Ae-Qm68N~u#[ fی ^A0 dmEV0'lҝw:XM{mrLSh "{uq& zP,s"j /^]@ft\ msa6C4({eoD?'; 0b..au+r^G|wl6 Tk FtR}H"_ w:H`RzDX eMg&Xv[q& *G #/ee Lb A ^ d i; J'gd- o vY zs< ,[6p' 0'ro 36DH{5EdR m a\! - Y,>u4b%Qj5M2h[ .;%/#߄i0cݯ}N & jPx\N[/]$,(Pozg\syQ^%H:HaA R oOe rv M w+v 8LZh j(  bwZd=D~ j-M8HZ6#vUWۚܿBT14#aD ?lݮ9ydtM'! C.;AAa`+z;Ag7M_g}} qFvo.D#L( l.-FM<%s,tFW4$1r9{%),: kCT=vO AVU~ܾJ=( &4: '}a\&8i 4V\D3  ILcg8|3| c{^ByO{!~;CL3#J޳gP}w@GL~u|5 *t-g4Dpozn]' %j P[z]u! ?P N'=har Ws s 38 bi3dY n\d2(^g@@+HkA;[g> 5|F_, 2PR!/^z ~e1  ?~ I~%cފ֭ql -  'z'ӯx_ r6` [ -Xޙf  i)b_RF2l%n@g4h 'Maa K 1-8_%pj3j[3^\,tQJDMYQۥֳ0 1 9 I@ ak94l ! nK( N;qR{[ـ*:-uմzd<=j9O_P4t 48  !oC]hX+ 82 0 0F@ + 3B3Ro):nKz"b1W3 8lG6C}$KY F .QjTH\,o 'ytfzJ$zsGУc#l-Y-ܧP߮қHx3 0L0x J j`t?5x xKs <E4Y ߯#_c+E:d\٘q-Vr _ Cmke3 ح׬ h^%}#f Aڏ";)j8u|ݓdߗRj R t6GN]$5 O$!F sV2  ;A"LplQP`,cD V:7)L=ue+@XAػzZUQT7tS*{  $ .| .p@4QR )b)O.m3bL)2igU~XM9 SQ~]f[}q {9O%CeAy[!.V8WPTټDFbK FhNF'G-e (0ݶ־<6ߵ"ӎE"}r@gܒRMxh{/#^dRԭlczI 0n[Hgp>DH q SUWY5EM  Tn^*850 ELE}eJ82/ \GZ?4`i9QhҔҹ$z L @e<Ks\Y pJgzL;SF/dgw.;!  Q{ 3i1zb / Oo,/xk'8 EFjFE <xP8/>oߥڱգ܏ F oWlZqr X&dJqWcBmݟ)yj ?޿>})Pa&V6c!  2 9&s% ] yGwڀxV#Lڎ D{nx%uܰn1D^ #!`4  r k_{/c>Uh B 'cez , jސE_h^ [pC2C8ܟ!ؐ=PՁQJ/KxP V _[79 /l19Xun QN !8~.!~yK7SpSZC"AiW- ]IЧKt 6. mZRd ]7^Á)C 3 |s@T& nw \% @ >{ cыrHA^ oUS&# aE5(3}[ & A* \4 PR(,!} S]'R1| ;oi{4=KKc*&Lv ) N}%j$r[_"9jx@Ԯ-RcL>P~&*# lXo+k.af`m4Jsߢ޷ۡ Ԇӫo4U2# l7ORߓݥVAl>.m8*D !db n `=xXcc`qALdAoiU)U3H p"wy  lܷ\ )Rd#]x'b4e8z z 8 $ / Q  IU .a*ߚ>|4mO Z@ + x } [Y+R@ 5* $ 17LO #=  QD5yٺIIޫ<n6n9XxѼ`|WQO:T=XOkJޝv1(ZQ 3t[ [q X  %\S 9S(p@}kY^N'u< u! 5?4x)b!UK -wKaU J 37Kyn}a$Mݯz8osߣ`rYm־b:S*? $78}7-YP pL\p. + ;w\S~5 @ Got=  [v&o _ ! nl5rO{, D !ӚAg 9_xg y;B|qтͧޖX6a/TVۣ<:k M\}gzQ 0NcE4H|'?}b D^x<i ' qcpr%-qއN-<W8 G>؜:<`g_wdMo&flb[H_61_{׹PʇOlYIVa:ދCմuޭsgrWR83 ~S,n4|34 "s`*!iQۺ{Ұ wL<HBjV־ǂĴMݰpN Mۮ܂ͺ8P|)M+1f \ V 0 :f;sHdXL `x9 o rES)#40Y?yxۙy@%SB%=Y`EBT߹{ Q_F=F`d4; MM.H۳4L ( @;;[ #2 :4,"ޱS*ZxdB t@& /fP;%_o4eϯ1S 8(KK^_P*^ۏ%:ۇYޡյ(v3jsM,5XVNSi &Zf V 6 @B<iV{s;ݘ̐`ӎY )6E|~ ܠQJ(!Y@5FԔ+ ^mn  \  ik64;5ۡ=˻¯àQޭVM&y P _,+K(bЃõxOSsp&+ #w ND%p#/^sEn6 "IgS3$[~u0L^ ~?(v' LQ/",0)W vcӄ r|q\52ClI-ݝ Q?fpNmi xSٚ(S; '  ] PXPl҃0h w }։[zhWoc e݌Eo׽rA9 ޖB}xGވ~kz e HIW  > A!^}ݽ^< S=Ls-'Y.*N/&")DRWhs {H f /1S N4T$Yuu 9yJ(zr?BI%kՊ_@|F(i t]ٚ'#eӇiKۭ~Љc{ ! xi V I+VVqfx "  U 8 ڥ'-xܸv۸OuO5ߌոG2y"e`. ?ehS!h7W1EޱZݔB`PҺ pwBڮۡ2ٱs"sWٍԲ۲`sI+TX2qKXp_&!U.0joWI߃a^ 4xhh;wH5P a\:ckyTޢ 1& ouX% GF]P  5/mՒSeQj[ʠJmɷ icE4MBzWRU O XXN ߳#SNB,c.K W\w;' 62& 6ՈdfUG{D)̾R KX|{TNQ2ƧRڰឭ6}4]f |, $7% e`& kӻзvtWEe%8̈MCڢp knV  V{/ ~ w5޳hRω.>hB|fˏv^12zZ&}x1PjF}'B|8nLKGC0xjAd$$"2 6!8K :pIȝ?֌yRcR'J;N k<?OE7 wֽ)ڥ]",٭יȳǺM$EגWRV UV5½F}b G6η=ε'T4 7d.vץߡb:NԬ I+ t M_i'!1$Saru91E6) ԫ(ȚQ:wS_&{2!gAl˶pVTrk߉W`s1! H?v_zH 8/ u.>rCʪՕ ;f̔U7@̼ɖsžڐףɵ(  3ݩ6Ƙ޲?90E( Be248B;}$[ N $!Mbvbisxʴѻݲ DάA$[%ŽϑDV 23 ? j{|ft}Z*dܙAѺ<3' 0a2PZ`9PLQ~Kҡ]rPC-Ҽŧ 3ӈJup׍؂ׯLӌ%*p ~I ;"W˘B --qֽ˹wn += j6)ρ֣_ +rA tqx1c<歯oºQҿ3##ZЙ.~lЖ޶'ԋ_ӎ% mx2b u2B,܌`oL~ >IM lƓ3#Djd ,ď  w7oz.M|"̲ 6ڡ͋uO >ŠXP tc=H^jۊ!:T&,< ='V*o`x![1!  w 'b- W, !$1 HE4ۓޮSـR7\Ӧ'ӺF(A+ɇkpNϼz>k|ͮԚ7#bť{~0.prmٸP޽1гƾޥ׳0QUP#|kĿDQ c q.6nnibjr'1#!% I6Mςg)⥺ib0#f!TFH`QT+s !C Ww  Y) S c>IV l0!%##r0܁ޜ ¦Acr Zf*˔#pȑ9Sۥ+IДѿq`\˾V`yԙA ":()}>$@; Oݫr  l12m8@ӿǻE] *+#K:֐-Pڵ^oɀŧ^ Wk/OD1F`"֙]$XԌ?Ϯ&d3d(#W"IZŠ.t:ψdېu˛ԝ3,^jfaՊӞLF#S2r2 PVQinܗ"4P˺=fޣC졹W y1=7X@U縓ۭۺۂ&ρSx,~ K <E <# d o 4\ $lP~H,Ư:ģ 5 >QF~i g!)8ɑda{MڑDسQ++2 ֈߌ  u0U(P)g t6;Yݹ7$zB͒ t؇z<Ê;ʙ?U˽5Sjiòg|ګW۲ طl(ġsv A 7?*4171L2fLɧk`cd H y%!g ;pm(N3нĬZv>(yʒԮ7 qѵ%h¼,¿'ZHۇkٞ|ڽب;"x"* /,%F, /ۙETS MґcqЃҗYdZS«8'CS'KE/ϲ'B@ֻfР֍!{ AAB&t¿9\!6 C9nߔ|rFGcڽq݌|5*~T7ϱ\#׵; Qd{8?W ٪фxXȅZ\ V"##&$*=,$("2U A)pw"ӹ{ЉU~Qcq[~̃᯶W/VS>%+d/,E 4d\.=9om Z{j~R$4 c4 &3!DGܩ[zIwUҝj?U)o OՔP]s#FxG>I J13m|ո^h .$Y q@xE:֘H)P<ץ%y8`-m8٧т i}%XNҼ޵8n`V ѰrAWVLjָ+%ϱQ+آ)ɹa./< V B؅j",#,AwO\q7 h#!)^=-tܒy߁ٸɡ 1}Gq.6cY} .١ ܂OsX vQq ߹|jyW Dnhy]F <` !|. !2 %m+? Չ}Yӥ~׻ִ7̑Ӷښuњغ.SI O xEK vy*fϽM){5KAEϿU[x*\Z.nT ^.V?O9\/i\%] 7hӥߢ[VivoWfT9w|`Zмȿ7qΙҚ Ӵk11EK1C2\Bz^#˵X3}ȴ׻=.>ߥ[,+~[]X[ oK 2 w X.h)&\̄ˈډݙ.qEd@-qeom μւ0 !["~ Z>(L%9# vc  #"%+m{  7F$ oF(=P[ke ?oӷ؃jؙoOEr.3  #Uk.T݉ y@Wh 7VѡƝ߾2v} ? |,mnζǺR%Ҵ !|`a{ ;_kvIiI'(x U ?ٸ s5ԌNߏ@xߍ đgۆIFG-{ >w<_MqpŰï܅T)х\JܬG1Gbcϒ嘖˛ճ󸤱ڶcD΁|V qL<:<ZٻCYz(؄ܖf3%v% ^m93آ!Ѳ%aYnׂ4Ϯp'Utƚ- =.dH֌ȸٕ| {2ـ<4tNQ q/AM <o 6n:a׼Ys3T<[}QV U.]d |!Ccڏ\lCS'9D 0**)0IB CΟӶȱf$nۆΤHŒ҉$ħ˫L'w//ҵLv7 ߙ܍EW U ni[qX3#N>Eq"9 ` !f'i 1ހ ҕ⸨=U'>.L(. ʙ=ԅ &vY_fXܜܧ o A0<ޢb ü7#^;U9W>՘2֊jl7l]ۯѝ;fj q+\JĨԯq{ ;T֝ ,xžٞ+XYۿN˫Z8اXG)r~ȝŦ<V,!1)6_q 7R؈ص&' D < l%דDL/sܝӟ6'9 4"*Q&ޝ$qۀڞul<2֜I&ʮҪPR*l.k If _ W t 5i[XICdU<nt"a۔V8Fѓ]њ<f :QɤR5eܳ۰4-2Øٜհ uls@x j%^D+2X[*$ ܎v"/` Cөī'‚ی4?:& j/.!8|`/W%%&R.\ƾ %7I4?ѤΨɴy4WɸԻ"+Ɗs‘ Ep׸#6Lܨf3aUE,ޟΕcܟe+;,<5.3{ ewLӡgbJIFhfdըV4uefcƴ򟝴Dr߂!KZ(< 9>XAkH)4Q 06^+L3' X U*  ,-BW8w І|ԢvӀP2ԈBKo5ٶրJ<ͭpei޵, z'M8ߣ|/7~$77/{GQM`9st %2-13 vV2L;uI,qۦBZhҦ+#ܤNlWт3>&R*17ziޥx&׽Ҧ^|IS=_jf̷$ LC^qr9qϳ &rɋLNBW4G?+AIOf.x_M,YL1lB4yu*xF ($> Wb6w9Ҙl *Ye&ܵߴ Wܙ ڠr=#"ѱ+ņŒ׍‚A:'7= ܄ڀyHk'5ۨ-ѱ]4 ZSfCbaCB {`ڷķN9ؗsϕÙDI֥u?uSdUP³UӝӲX :VzftJ4%'J[q޳ D|  &h>&t͢G L'e3N&,+/Lp{x͂WԱcWuݫ.1nTؕw8v 0鮵 /aI!& G6V" II%Luתg|3i/G9[ԟ\mUD-ɋݼφo [: 2ۼ  >PP#5xːcz]׵lH# *Rj qۥמ[(ZJޓ=1ߍ0һT)!M8A9"ֽ 6 -6V]n`Z A$9d.WFҬ j@3{Gp)218D2nt HX|Ȩ epl a'ƞ3ըف*B4<q~gpo]ۼ˄V5Σ 3)-״\ o$;"ITմmA&%vvݝL!;c"3+L#<% L&=ޝg,Z-Nxōͯޥzb_kљq{ˢͮ.4ˇ6MӮ3!TXU]yD <e$1,?\%8ӫnmY=$edAM*9sx} C2K%kVl~=uŲ"GAֺ>MƼ>ݚfďѽ֧Witۏ ڿt1_Ps64tük-mTjɇƳ,p —ۆ-ǺP 6W" 2NDl" *0.A6i$1#&4/+5W*!"kb1&J LKj$3NЅ:E{})ƺ[6ͽ֪̋vrڌPj T1/ZU`̛;Vʊjɬ_u:=1/Tp°=ï)癴ʹRw0P\i/%./.&%5z'(e [& ^|Y' PpߡKᨋ(fCK`Λ{V)rD6ح^¼ߎ^-yʸǹG-4 ͳQ`ܐΆ`q7KU<<9%\{Ʒ{| v(]}g"!XҘ)!ك֢GuqSS  [cۨ&9 +t"**#%i 9 *+] _;D̩t O#" nUj*g4%Тa)D@= Ќa_G4ÔW#++@>,l>1 xك;*/'?P Wn 1Aܘ fhGeU >|A(rAh ,y.W'H/ ;1z 5l`ޤݽr€!ýcа6=µOoV:{ l1)jL}ܙ̈́Пmu d֘tb:WIcҪ`--"BK>9_={z*L.h>#غŻ׽^C]$q1Ì]5;ʇĊ|s3@fYqKҠIt#ړoCRA6 'd:[iqب=5^DМҗ?l?W{Rَ& 2(7)epu }xT zߞץ(ns$9hkDǘp.jݿsOZQ L G! tP1!%:%f \HPRTH%݅xwdا>oA]6/8- ֚Q ihCf۴E^U-êüJ ܵ߿:a͝:qiW;tzvc612]%'(D*(mՃGLF_˕Шմ9y3<Li'CX{f#7 :hڜG`Pΐ`Շ߬B -wBv^rSLΜt% p8-9y \ 0`[]\kؗ8ӽ:DR@bɮQ}$m'иAW:!dSǗ cDhT]j m q#9kQm#L!z$,$U"s ; d c;8HIZ<Sߙ䙻u7  WfEmek'  @2 M848&y4 W#{ ( :8 i=ihd ͚y dXkh#- @-%b('6-?-.+H)u T?*5VIx81mй_ھ󾽼i?d צى2/(æ֛—&d *&xuĪ'S.PBh8-. 31!/$2>Sc<sgok>ُ]љٞXbeMèЪJێ0T, mvE\ֽB;dBQ 'iܮ`+-(R50 b<3MV>52G,L͜Ԛ +ɦ3Ԥ*ٱ"v9?f 6֌]鼿GhL/܌݆8[l' IެӽX DќLYqQ"[(Ջ!ߧ˱Ƭь؃.7 hu8fyjaUο8kIt3RaJvrA柴ØLjt-\]NYzZdMLș3ʭB סX] Ј ?p$b y <#oD5N-B@);)PsnT H͠^*ݲ ;`W4 i  Lլ5wia$ҟb&_ˇ [H҄ϷeȽy^҇ݵ!A#0%w:5)sޒ;70e ȅ 8ѳe…~ LWدNǙsDz&D"܀\hXFݧ+P4[Z~2R'8>a(}70jPHܸ 8=ʫ/Rh=Lڸ& k-D/ɵb=_;U G9{ܔ)ߌ]>Цgٵ1]%˭՞{r,ɠt W&W,2#$:2o d"S,*i}OTNX 6 /hE?1(r 2Gцwx΋GӨgяս_(EWߞJp+߳ߑ:, eJ"+ U+1 2 Y~5x< |${ E-:Odβ3ΑDR\,FyuZOz§ބ򙿩=oƼ]֪w;ۺMd~(# سbsvQݳŘ ?3 QE ed^UҸX/ŒMLh l . ayvq&5 9r.  /ֻ[)͊̊GO$o4Ə*)$4F3"Q^&2ᖳʴ;v<\èxŦg8%C1>Ųӣ  y1 :߲syP~GCH,+nh PYGӮjAt޻*fva)w+ -(ZN "c!=2803 Ch=E*qe 4oρɪA)%5'-Ɛ@r j 5#ͣ] h LĺIYc JЦJڊգصڹڨ\ Կ nDq1dM̉B.HPa1v/f L0¿S"~OXUdo( Fs$:;2C,hUihC9؏բ릈K.^вCXӭ}`y 0 sݢ'E =%WrYU% qB̤եméͲ()>šR2ܴFޱ)ʭ:`ذlԶȿ_۹ҙϐlʹڅ<tn.^{\E"*V IE}Xn(d4$0BO $<K"ܐiX⇿c]u]6ϸ\9J`7K?ܜˎ".@9۹ܟdC녶6OҮ0dΑʽ׈ˎ ʷWΰM P u:V"ݹΔjk旻$i~9u!_WhqTK^x;A9I);]=1|E5/.DN(V230A+ ߂`ڭ)x _6ٸΒ݋Rλǒ8$Bƨ{fbڐȇx3ʱeߟ=y '} $ MZ>Fm?6Ģ]ώغ- ɫ٭H|ӭxĐC"7͜ǎܯsaD2¢ Ւ]+ؖ+H q5C١ʚ)PlީSuy|p62ZMF/  AG; m&LBۿ<_O1p Вܸfeh}d%0 LhGh1oѧ~~ |ϯ޶VL\|ߴfyo%5%0 !  .#J)w R! &4$+)h\. P 87${$H=F4ېl r3; ,/*_ '9 ׊Wwk(w_(9XAg=mwhOO~Vxc?2r3Eϑx&\|{|띎SuVҥȧ73ӯejܿ2 :|%t6.d {9cގ)(R [(` ;'Q;5:׵"D nӞHy\Ry7:&<;Uݾ#'?:I-3\V#w~|4w&8XʡB]1 vuٟZ.a m %' m"{$aBL'Sn N(ƽ0\@؁62᨞- i#"1|5. (t&! sR ھҎUFЙ1e$}!ױΫ khv'n"J#*1GAe3׹@`?Y׉IH׳5FXXlT%IթঠŔ%'Tgè֤̿Aց>9ٔREI ʻіi 5a=Z"u!F |17 c=ɁҒOlڭػ-)&)V8ޯįlS0\WN7_|( o f ђķ0ڂt' j!A s"#!c*c )ˌ.„uӧ^ȽK1}s`=Ľb:c $կZ̒ܔVfԸ9xƵ{EݝݗpeͻƭݥC4 kײzթ?ɿpPҟ`{zz C[|֛ir WZt a&,/6;G 4(2})^hD#0%V #[ iߧߜԛaR &'}geg:ݱMB~1[PӔ ˱ |t |יB!4sȲȠXN<ˇʺ%,7ĺӿQzֈ͆MѤlWq+|4[\Zr!HS(5ޝYɅQ0ݕ:*ڔAػ8̚ʭfu*W&*f /In>91dr2, x 1(#ڲb=iiZTpf+KXI@62=E~ͬu4Ԋ5G{Qj3֥,~ApĒL02p?Y@EwOcǑv@/"luzE#%.؜)b } /0_ $tE#{H)&\EUkdl 0#&*/#Gb7  kv*O"OW3>V@*% u <| #,VxgUh's$)$11M W,.k%ٹF;l |0Yʿ oԜrǸ۷ S۳jׅæg/?hHʱ֌ܫ؇ ר:xxÇϺ-Yב"'ȹM`0`jƯ~  ]|im_DyMG@tHR]ٹTj׎a%'FK$" 5 4#(j 2"GC7PPDmC7(zG(6+'O*(_Гȥӷd=VZ'ϳ~b</0 r n 1 5  HJ3շߠӶwˆo6( :$*+'# e(K/0GLYq'a2t-840"7 "  HVѢ'W42ֹI$T qPߓٸrlw/:ϡBZ4cU񙅪cZD6M[4&Fu^PդE!?z^ >N^'ݮcܹ˻%«>Ӿԓa7= ۯ pmBI6 [<M WbC`e0ޣȖ5̶ uhzk%c]CC2w 7dK|Anž~ƟΚɨy5F U`רmj'' _ ig<X]mɋvHhuFoXŊ,>9JҌ, axӣVh` %&S poA.& ӆx}"|±̡Ƈ o90^ЦRj $\ʷbY [K$67qڦ%{\b t Ֆ'Qs%2%R?p,+8 &5 lP7pكk$ӎ=V YVҩl15Dž5J g j3Rknn(_ k Q;c8!TLN-D&'SэtcUӽ߮+nIVGD4Ľ͵43݂cPG Yiڟٷ-݂Ё۲d̝ #v@ZU͜VaR@!کXցԘٞmI@.ZIjṙ _ع!"'evi̩ӏə֟Oʗ*6 `Ԉͻ=y߿4+@>*h  V U*q0 c  G-) QB/0MHf j/s;sGuE,-k_Y0" !8s*C)ULbHC802AԌЅ{ .\u-]$΢c٘{'+f1.# -s,4k"?(YLB  EmVe馚K]aw~I6ݨ['"`#XΏN0HRlؔ?ɛID ]ҭw絋-δb%lý6fܞ$q3׺80YɯeԝBĐWٛS5U͚𲡵Q+I-!Ryg8:H04o 2; 9-85 R.v:Bi"$  |>8cH[3kO 2 ҨEg %)UѵxƘ̡}NW٣T0ʦ;fKcɅǂ˓~8bƎ*qEN6 t}g⶷s0%|HU=ʻ\L(]ٔ bl":sW mF O`f_<α]lsDQ cؿR3/Mܓ#u҂=!! s/<x%) [=7nDo?NϜ%$\I΋E&] CEMUpG$@ٻХ=ݩYϻݳˮ8ޡԦv]0~ [H3#4߅Ӂ! eڿէdlZٳ5+ ˎs?ɆVlb:K!~4Jŋ6Lؼ"K3i1(qۑet ӿdet@ {Ɂpb (6)3v1 P.:V3@LInA)cQB[ tY9RH ^]Qr~to"JA;*F3OQmF5NF`1ҧ Uz nZ1 VϸsĠ]ڽQ9em; # SqS=1Tr=߆w"F]B5ԺJ@y|V9؍Q\pb_9.S~-s|OF߈h4TrgOӡu:zڪƬ=1; X,i2+e':$6ay` s+ aQ )$ǀAٳ^pģydە C 2Sےl",  C[=z&f@!}זϾIqԣfpWF9Ǽ{)##()l ZMy 'j|د+W"3$V!`Tp 1C7;0$)v $N!Z,,I9pC? q81f3a1 Ǯ).4'z%=/)5T &T  rcR mmۑލM* L "" _"Mrŀ8賮'Zu ʅǫ ҽśQM/PĚ Hb?t͓x$"@}n[7¤ȃ.HǖƗνޡ[سQ ]K -,6=}0$ "r90.;xb6Q|-K1k+2!G$'- x#220b5%1# Bq64F1JQK/=-Q8,0.0 TjAp)^ڻb=Ҏ=@j6ħr֮<*hȱQЍ%w;@k 1Y%!)̒L!ЀI-ը閼ljĖN䑣iJԱ2[^SaUշ4lP MPIpJ*ں[ڍ҉qjqX'#mt~T1 rH ]'W` 0  S1(;""! : !] FU`ҢJ7(ٜcJ.DؒK`},Ѷֹ>ζ_РJ_!`}Uo b ".e)$_)xtr#$ Z'S!@nOc z:KV㜧2Eu;@˞YB!,c؀iUQ}ʆɉTDž`Ά ]4N"8s5IU #SWQ!$(!r!Y  'IB0mQ Qgp׾A:ݳɧ_ŎI.^ 8ϻN|R5]c*ƹ*Oʯ˨=Ʒ .̛-(PTc  " U 0mU $ # = ;ڐΪdb!"MEPĻRISd} nMygXE1 *1[C?i=#46>  Eu?]C&LBɆA ^C  -`0֊ܝ×*ΎOUcxKGՈɲ# ڱ ӤT}w˟9^t]b܈q9 aϾӤ889~\Ҷ\æ޸;Ǻ_Bpw^Z4K~߂hMc 8ݒ&ɚaB߻GFs' e.76.(K+? 92SK K=7#$,72<(7-{Uz#A/L0& au#D)i!?O6uN(} + #', m;7;G;g a6'4&"  5)59=y&%_68gΈw^2V_ޙ ׺g̚3]&@^[|@Ѱ̼CJħ֗sonZEۣEҲMp) 1kV~Fk [CnYM(߰鮌]ӭ˹S^RϳRa3ϭݼ${ZòGʝڭKQ BeApoI{ Fa#  )>ABA46j K?isco[=QfJ;I=KCR]O=T:DG89hL,iH&lSQRHM< U$h| Nceyh/<~JEhH4{&g((~5ײO jd@JD3Kz@eH0ӿ?7]ۻpJO %04X 猽EhP^OFdTip ϕԞԺЫC,p!CcC(gٜC؟P9 (N)H ‚ɍ(!2୉=ۀOC&rդ{À\ܳ":56 F Ckԩ|1` 忴Zo)0COčƉyES~3 a7 D&\!iv! x5z}}ȯ7F?ۃس̅! _I ^%6*S( '@SM޻$k ) c F1ng W;ұِю'J>آf-&q5ȷ{~ϻMn#еJj,¶{> #ﻎ82Ѹ]͹e&7Z~W0\2f31rM Z WwwݜԈOږ8_鴦\} P< pزC}} !f !*. ws\:.|{i~ a ? Ci4CNI I3;0 NRGL:ӘZSw> +&9 3&%<46C=8iJDL\N* 2:*  4)F؄ oVf8\|!uiRa29ӯIو;P"yC߯@k!-Mgh /ٸ^OұܴRF& r1@ܱ0zߠg!IH8"_8wԌы&qP`rUmɑƯSs}oFe]_}}ېW\nJ H W*Av; ;  !5  !y"2&81% ?] bHp>o!,$ Z f#(H$M!$  B  Y(/94%_6t.M;7f28)%E #)1@951 S"#+`)&[Z3`9%ԎBwVD;FaYr"ޝU` (zا¤ȢcɁv3¶K;pԭ@ePھ`ѾڊO^uպ7"H)%eմ)ى6t7 . 11W%&.#a<q~ 16l#5:1~GKL-a֦X( 3 &$/ #^2%[[R۲{m+Iw5ݽ٦O#ަ 8  {C8&x/]pծ׽ƀ 2TDp"7Ϳ5!0 AӖb[?C1ԈJSL;nٻ|ʞߕX7څEZpJ z >,q)*3 > af(#1**Q o pEtmY%r.֔% Y a 6! =" ""& iF) JD%m)ٵ|= xY2#XبZƛ _1GU)!T޲d]I,䶷׭#:>T(vTޞW)Yϩߟ*N!&݄%qq.y0^Ep'tc Ϝz5\vnϨҦX7J䇗ŒJ$T L͟ԙ 'D؞^k)ݻ(ɖͰcڊѥAˎ,@w_ϲ޿K׼Cڴ VӋnZnJ Ѧӿ Z ْBܜנ$6;  'lSPsd b>ѝw󹅫U:^֯ä,{IpA%ئӮW9밙j9ד!f[˕ʧԦU?qUB@Yy۹ۦl#| ǟh2XuPK" $ *}`-.'8!y241?4c0,'"c"" L L (&)%[Uq9>4 G,Otڊ|˶[nե`\ԲbQԻV5޽?WW gʐCc j;:#[6,W>D2?ߘ! ^"kZBԛرMƚ#\ p"Y)  !~/S,i)s  7oj\ +k | YGC%'$ ( wO K='c; @* Uud0ayۮ׵D-ػR` x!`S,w*!ٙi:ew7̹ѵ>pYă3˦}apkTZ f!Vo׾ڐbLr?!`סJ}λӷt֨d򵘩Xcȼ„i hSڄ2. uZk $ s԰*p|@lڨ5Q&[,"'T $'c O3@)ԅIʼnW׽ԙQ|Gɵڮm۹zPDt pܹx99" 3'q%* v&/y.y6ݷ߈7J:Oƹt츜a^KjSĠɠ>BQ]'͒;+?ԣ,UJݧN9yogGþ7GQ Es 8JgY KfWEnI ` DK&\Kp_Ӻ{ qZJ(P31+`"~ĸګ Q-K_u%4)R3k'g_g" !T&]8p r MVqR͓IӋ'Ӌ-٥F*д `\߫ @?T0I;_ߩ݃UX$   b(#tIf ,Mg=Jp' `+Zj 'ݸ}F=;3@ɊJP-n TbJWudg ,DQNR&eӡ ]5>t{w^Mv٪6pٮ*t8ܯW"_`i|z l ":E!?!E -)69{< ?E@NJR VqP^RK!Bo>11(A$V'^#)-""Rk ?3Eqgr͵Հ9u# $R^ N'Ab!}#޿}LSF@Bَ܉lʸ|;B֮cM"MׄԑmwQHЧ8f7IϰuP86.أƳ dעƪ˱?X-bC3" Ty(PohlY=a,$ z , l }"J&'k!M##R'))0/: 3@:/>6e')#a$((.0316^094#83+)$&N-.55-:0 B Epp!& , dm8JMC4mg &r h?j :CbNҗp`a!MA"НѢ˃ή9(G±nJtϖsȬ *?g;0H۶|. y !(H T jFHB46K=$6 >^OyWӥO 7J20JΗx˴ چȃ_%~ZxBRDͧѐ\\  Ni]f JB_}'] fI u' fW/,}C?)ʹ˜3TNQޭZ~VoyOǗʷ?PֈрAzڄKĀ2۴X`tk֜!΢][¦9ŝ:Bݼ(~!VnqrO a7B 9&1!(7#j!+%C!|)%w ٧^q tg_ɹ%8% mW^`_H D t)>#$"461D4OD;SSEqC3%O+ '&" `Z !D  $MܟΙ5dWW`P{Ɍ#6ƭA]>R@"r1dm YsFඒ5R3^J"p9= F٭1g 1^ֽĵڸν~0ѲTd•_ϔspCn_^ƈ׫[di8*N>䨀j=``լLD,jԸL{.Ws"H=pL * ,'6.%T n& ?'(h Z #;%=j<E3=E+ 3}$o ~! ^$*3W!0&|l"!WP 2 ~f qՊM6A"Yo%(!%?"#1:4>G/C,;7*4(B1 */"p#H pWLez(߼X~ψs/f|hѰ lgjс r9SKʸZ֙T5v  F G 8 } ;&$g'/9 &p ) %_>u#)ߘɯњW+ņucJUǚZDsɩ>); ½ڴԫE8ɶ^B^Bke Pjٳ{Nηu;.m(Ǭ^Qԙјڠ%܍fޤs?I` ul%g 51  m[HJ`"4@$HȾb>5AΫd==ЭՈBw%o`5!Ko[; 2jOEG/D;*5y-"HZ   Yd RcmNgy3K $;)*OP٩6@aKߑЀF?3z;T%XXÖ}֭*ݦ]T#ؗ-Y~cŵhԳgγgGr&4qӰā 4ӾN~lZܹ:A_lytwe G^vd! >H" 7)(+)-#B'lt)^X<$!_C/<54 4/,O6K'&C&: )Kmp { #1 G$Rjokq4XsLg _  $ $%=.5;8P c .  %(!O&[^  ! "X3 Aqf/7mG=DDChгķljvdvNԩ9Ͻqx( +L'w;6Bݖ ֲϭϴ!3D*=2ߨ)ТʹUu7Awy$r\{;يW/C5W /:tBym3qW]rOt!*Y_C+Ջ̶ߕ"X9р~KQ^ƚ ]ܮt$[5=}9ݏ#2M } FHU+ZLxһ)U39ڶd(pͺݞͿڃփ <%+%#8#YmRQ w; "C$#%$%6 9XCSbrunQ!B&%" _NU%z2ߌI ,!M&Y'ew<` QJ W(52!r9/"isqIp q) [ph: IfnVL?.$Լưٝml 5ypG о<؇Zw-fԷ Ƴ¸7QXF/ݳڰݨ_ev4՜|ZT\"^׭ E.Si&Nuր3 c)veCMnO G l}ag}K]0_&6[-F8d2+<&8IDr@G'B=5)g w-u !ۮƅjµת`c?ur^R VrI3j8  vq1w 3p|˴Ĥ [ޘ,H4Γ̖Kp u -? r69'eݹ}6 Z7r]ޯEt6Nu6#c cK'6k۩Uy[ t>jޗ?w Q  C [$e-">097;2*|1'5400" Yj"l&W+{.&lOW.L nY 0 /qkn>pB!I+P %h*6f  ~4/&#|r ߕ t]6DИ֍$ԿѼ˛2+u3ӆvNݨޒ::Ҥq٦' Y aFK_@͇ )ĪDֱoFbϙɹS߭Y6 bpeTч#Y׹ȡ,Fېnͮ “X*jwݕ <*SȊ$'Jcܨs ;`&hh-G C's(&o'"S "&z!Z  !x&+":(}q juK;~ ,>Uq=2&B.* d-2;8F,)- N~ ` ^) .[p 3 :fB _gJ pe·ƞױ4)c[LMSojvɱNП{uV]u\gѲͮLվ5EdMp.vىCTܵ;`>v͙˜Ϸξl 'ܢ+ӧUض{n!ЏyOH˖zƴTo4Sݒ)!YGSMEp#1!a64x:'35"L6d'@02I?KAxKXD8MNQZ[wb$f_cJQWF6L EA95P$J13401e7() ^ n .RDГVӌݙA4{`ւlʹows oOggKg+R?$Rx&lI$X ~`%} 5h A3]t_!k& Bz&%`.̄gϕ;ɤ! ;}@2cقͲ H!ۭ . mSӡ@Q0% ȼнgk3&2Zk:Sj.z_!',(4\878,T1e!'-!$xu k fNQإ҃ٷ_jډ9u-# @DQJ~}ZС%2=   &> |h x A b !  ; gp+SbϋjS}hrS Ιj%pd~BɢˤԾɌƸQz՞L|?JK¹7nʿ|:7UL'܍ì >"%q\Rߓ$"+Fb0,˜ TΪܧe\Gn˄Iٳz@SҠP'AEhߨEЉ v9W?Q 76~<N4 )y'Tt f(%ud {,#$DA|! J *-I;*"vOel mF ;osQ}`U["ݜ;$ۦstJ@$ iVMo* 1 d*@D6C\ɩí$tm:)bF#mՍrԘ_քȾ9 ԝ/%K j`vܜK:;ڃֽt!A6R.859E" _ | l#53eT84,+* n8? 2%tZSEB%b N e D"% %) 7 6hl\z 9 P{'cscqMߎFvF$2@:`&)lOo,0f92yLBx|{n!ڠMk6 9}qcKVg0OPNs'~Yӹ-ךފm9  [ 6 RdTVe^s8Q]ZڱRD򮖰&$+<$y̭<&ȜWÞ|ɋ8,˚yΒ=u]ɰ7vϫSϜؠY֢Փ;1g60 2 kn}[V8 t#<p Hl2 SdJKX #-Y/1#tz T5 4% z CK.<(@ъ UϼǤ͉̠^qJ S@N Za 3u.7 %  ,u^DEAA-ٟݏU@o$q.)eۀZXX]I =ׇAϽ۹=d!F}d95$ Jc":߳deON~?yn׋AζPp֞Ęk,ǧп##jӨޟU.#`zMf "Db:;  '$s9(W 6, 7*4$t{so g  |u jy<56N*c&Z# ٶ'Ӿw|jIVFgI֓׸D`[nTR *;<Ŗ5bֶf٪wй҃l*| 6ߝ_ E65[߲kd 0JV  2C k|H _ 0\1D  $";5^T"pl<΃]pмZȼR6ɖ*r;ff{-rH ѴHmWߥlAީEtU%È{ S̗ ϶sй|̼6¿޴޾[Ra7 TcT+SWQ#)zوϐҜӍ k#8F7(8 ;273,3C++h,zI&k2 & t h J 1c )T&V^՜̆w&ւ:[b%O +*)9 E\pK  FSw!fTΑǙՃσ+m-T9MOՃϟ1цҊ;bUy b,{?}Hn՘$п֬Q WPE @ߚxhx7[;R*aEivvZdDSmG콉?OwW7 7_bHp߿]S8`ۜNڋPL N-%}I)D/ (vRe d+ - F^ ,w1*1-@.7))x$;" " ?+ H _ ' ' C CL Z0jX6+ ' 0g i 34?#$$#P] q )n֫ ׍!J@ZNևU6ރR(F &Ϩ̌ӊɖFב ی؏f޵iX:zš(xLyKU{-v*3VcޅJeEI1eD!   suL XV_{   J A9$ )^=$ 6xw+2'B9 W kq9G$#$"'=)#(+&8&r"!{ a  czg0`<cDFԎͺ,ڒسx4 )Lr=@7/U u` 4 u D $|DުIݜO6= .5 K]ڲ.:ͺd́xqǃxzUd;^ݦ#!rlK;jA̟oݵtؽG>ԭxͅʐ˄@)Fs@{ ivVVF+>)% X Zb7ҒS8ڵA @4 O MlFH cNW},!G0!@kl6B 8Oe H Ue+"("X EB[h1tr}<etD$sկI] (d)Ftz[5 \% !" <4"0= O_Dw"&-3*"*) #j 1 Mh0Ng / ,!`H8' # Tן:#вpq"4_xJْٮ+.0"pFP)2IiZɐۆ ѳ{5#gOԅcψɫ7 c)Ī؇ѥӛ܂VQi&wC»Ƿ$3Ͼ_˔߆Bys;- ]n̮d̏xg H Ux![dKIXFK. aj $!L$M U,(E24";s=>D:Do-;`1v(a!Fn#!%E*D./$0'g5i-/>{6Fo>IkAD?G8c:'11#B  v  " "O!"')r+3+;'?!Z9G}-$ k ,.2<,T#o r y \ I | B:qs*!yc  oZt4|{݂eH4Kz'82bs,s6݆ӬgԥGّY, ?zD/1jWT ML?Dwi)w[}ݟNF| (!`:s_o 6d_r A q27 q> 'N Rg 6} t ) M 0r *Fxkq s By D@QT ݧޮh݊er!C -QZ[ &ގ^إ6.% R *& 0 j#DC|sQE;܏l-hM.!X zҰϔޛseC+ @37ڃzt̓ϧPxuutӗΧ ۸̷] zRڄQݧBڷU> Z; cIsU " P-(S*_! OZxPaRI H ~ E|U,}5)kCN>݀ 3T:ڝ<T, K:Iڲ4Vlm}6ۍ0`d:?'cP.$O̻;ֹԖL;ҒlLe FԸA}}p"YC &z|;Dfbt^ " &%2* >-@+h<)9-<: 4;Q54?3A 0>(9[#;--C4>HEPHB G?(D<<764]-x0'g/$- 8*$ >X}%[*D"(  4  ,$R&f"@4)I w E E?[_Sj>$(+%uX4 ,B}wPjJ6r/H(dc۬NڤG\:*b?"T ph߶Wk sU^؊J(םGi?ʇ#Ϲ-T1&8-rRXkJ$  '$#rK W>@"]N LM8 WB ]p{9  1$&#Ui@!"&F$((%$%|T'8." :#6A{A<;1503.261B5*v.O  z;Am2NLz!)$%D%N nmgG 59 % o wZ,)7]2?86u/}2$8*jd| $L   {e %>T]1^cڨ+Uy2o2rڢۋ7!jTq#\;Fv@',AFmB)vDXa ;peF9l`ކ!Kѳ,gә |G$o[8)[ k:1L $g  /  h ) f @f&Da*g%GVI Ema\!ƪז%Wո*idmMy@)q d{,  O ,=`S߽inԶq؟y?S{WٱLݽQi|}ry,Hu>"X>y[ O+4kDt a m "i:!rX0 AiOy9 P MO xO  C P a1 ! z_ZJswS+oJ;rrPzT5bwiG o`޻ܲuKF|RERbtZѯջKvЅX͵cr7Eժ?ُٿt9}.O . _O7Ru]-u a qA rs %uL28 pC5P(" W /_!" %5 fA =r  ` CF C=*F 3w!x5 <N  *;spt}e{e3 ύ_ڋ:LUySގ7-9*c ~ [v P)F߱(OMO*7vZS9s.yѝ0+܃˄!NbڷMӏ[ǁהz׃>6 >sBuñ֣ƍմݜ@'bB"`Ƅ֑>DR )9&HL;7 * $>6&"L | E 8  M[E Ih' 2[9N9u2,I(`"&@"&y%tI , RmDQ  b V:` V!u 1S1jgS@  X  iI3 & n# 9Nay wqB ؕ?Llnݏ{ۨO~Gݑ۴P6t?3x|(ҔZLRݰZ*ܤCS8.*OkTZg@E@ '/(&2A-2F-;/%(yX!oX %7!g(#*('"M 'pa^Z]O4pS'vy * (A֡G..߀N:i Xn#E-v >qPV3`yeQkfڼjˬXê QHf) LDETQp&}_v G?(H2"74%}, (~)%zlm/qT~ t+(hl{@lYK"زzTצUKR UmCW|bE5! !M  :bj?}%To( t  hJmj$Lp8UEijj/a+hI?YI.> SGDZHAUݬ߆ =qD8@߅'*ՠύpޜii 0 S_ |L,|b$f0W # f  7y=B CW1>GFA J U*>lSL2u`hz9 u,wnb 4(l/D"z0#n, &GL`W A:O  \%"J*%,&*A!*  47]q". s 9  pD 7߯*lc5\_B~ܰ ֮wR}iEʡ%HƝ;˨΄FȉDƓմǛnԚȠиʿIbgrܲڲR+U٘PwفT=c_.ϘE]շr{WB}˾{P#}7Z|PIQ vR[O{  i6r ##U$)o",!+$ '&!$^!5 &\.W!3&8`.>6C 8B"-a;w3/]#/.+j %"%B0!":)#(J[C % XiY!Q.,LIPf? *l= A ^  XOE2TX 1rra>  *  ePek "[ I 2j Oe* A +)m& 7U* fZ$tcZe y !{ZV ڛUeCΔ֍BFXߛ\;b!6 m%H<VWڭ/X ;db3GZ)XT/~,2ߝ93Vs@u!(*+bU,\  n' { \s' ) 6  kM B  D[5 6 s` y޸<&h9{P~6|7Ζ52̆-ۼnJ zr c[<:k#!Y+g  q^ZN` J%"X  j5!K Ww#b%|#_'9K% #s# ~ ]aE462Gc iT kC$^j?!O$")!)//0.)j'Q ,8 ,z @3_lSpq։aXͺH{hߺvJtN2+L2N~U':m4J v?Ide*uo"b1hHjzt4ބ`ۄc]Ba (?{}:7 HGO#r Z 5{  = HB n \   `?iMxX͐cWւϋ9N*WlA{qؑgͭÁCʓ 37f2#ñ` $ҢQ  3//@kޫ۾alKP+ ` g!:C[ C}ٷާ`Z1xV J C4Z  /((s B\ A^%*' QE`  dG_k">^\{T=AP%SD\rg-D5%r dߨԨͦ>Oۚ&O59# tyBZX1&Ir z[/k([D  % *O_-y(ة-۴ξcރSEe#k&{WޕF<((٣מڡ܄Fںq;ޤF=:kp"+Ylю~غ|܃ٽVM &` r ciES9W2w8s|rl gP9~C  'j$RN%&<@0z% 0ٿۃ!YFRݟ{nA`98JXPs)z9  @2+<k * :  BP Ri7w$  g )ea0%]7Ld6a H@z nV+T 8@J]` AW w֯E  Y91;qB  Y;U iC] ZHX_:,jW)^Bo݁Q{ۺ~ beBD?eDs/. C({ӧȄb<c \)\ ߥdWDq,"Rӻ~֦|.?Kdm_k+;sr .޳ ݪ;~ײn׺ׄS؇؎PxG,8tE2q>8N.@WK[_QXgUיݮ܉K3YսFjRzӓNW֡D.S<=㾥&5$U-«ň0Ώ8cw%S3bڰ_صYʾ!Jܽ͵@VOڵ^u)5`Lb۱iͨѕӣn_أݡJ%Qd ^E u h+ZP [ 7   $Z^\@Gu.Nq"X V ]sZ nE i u7  z- 0#''l!n)W"]J/s_ f]n$ \K 624 ;4\ci   E h./ZM " ~5rRG~Y:U i*?  w  A@tݮ5l#bB WocjDh@Ml܌ Hf | Lflqsz9\o9D [;*g^w{Y{A}$cM,JfM/T?-XڠOU=}yӨԨKSBҴ`<'wߩ9BSNb}_CqnqetnD-ߙ>ݵ?nӁxhȍͼ͏DŽ(Ǎ$th ܇Dl:?LpB } J  {  'y&b~ nw3! F {,ow %Q+/.(d!(##[""&$$E'$($"-&4(X;5(I<5&y6%.$(T,+ 18/8[2<4:x4x51p1+.&x("_^lE.  q  )$ [ ?=El#_. z0xP&cjd۰ص#۞jLGpl5c)tC/5aH4?!6q۶C6mԫmFr؆eK2u>a YRN} GopA}s܇yRղ~նxڡ0iߞۋ^ UT_QWG!26/rEu ~L"Xi cjp lFwv[#h3?_hFA{%PkxQWD ,;f Vސ$Xܛ Ea =D/4c0qX;bNJ۫ڻ5jeg6؂ UY*ëF;P͆ ')ϳΈYRp߲NSb"s >wx[OS=pka\d~r ]s  rAK @ 0 }m a8cs%L NG/Mx^[q{|߹RLg&؊~ƽ>͡oǒnԋjNyMIBOGEA0ݎw&Өܨ׶Zڟ"xfe{V6zD+*3PsC& D8/ sAx / 3 t F { b 1&IQ 8kd5~X@4:Ux x -`;+I j{d oKRu- q o _ݖY߆Xe_O$Ӯ̅^ߺЮRԬߋQ>w/(~dc}GU%,}V(mI^]E &|`D LO]TAFTAzwA  }ZrkY!In1@  yv݂JJW\ٜrߨ.: 8OlW٦ɦK։oe`՛¶]oʮ.҆>^]Fsu/a-Wgٌڀ޾ݭ> = ?{T@ P >   (9ETT  P O3 4 ^ B-*:8\ 4s Q e  VZ @K 8X B oy sboNp^tq*D '#N!BR' I )Go^AM'JO81g)+kG$Vk:Rm.E-u&,z:Lo"dhSq&y^Y$p(~TʮkVE]396vEwo76{ \onVz7ˇ\ϐ7h(Sܸ5G R  Y " u   1 _gIL^s6xVdtq 8^a5#ڝߛ[ 1|BqnOrZE  kH Q F lj I\   o  t  I UU 4F8  OK _ 'rt " L sTFdr!|zrl 'G sH 3 . Pf=>84\AF 8  F2UXzG>ߺ0/W5X\\{o  w! <$kXK9$U!"T-ilq/J%Nd)7(`e#[>P hV.&:{WuS< J>Q ,wvGk  .]aBZWzB`8mB@z@ l 6 ? @ ^ A O C ,e^ r>6*{8"(m+ pNlDg } 9YVd: x ryi F f' _D4oTP8Jk6&K 7Gum|_-٥r"4c2$К(q߽Υ:Ӊ d7QظILXۢ7%?^E&:zB4!4ևw9 ہӀC)Gbyrv9 v$6+L*ecdeui  5 6$ 9" r'(%^!zx   ( )  ! (lC= 4:=?s\   g " U2 M :yvL  ]t 11 V [xs.@~mB 4 b  F .|HS>wE&qo#z_~oI8!j?s=oTbA/7 )*LAA&~7#^s9apHF d !VYps0ݿ>QP'#@g D;ۮca ۘه_DuO8e_'wGj 8L)_b!P`UL? 7    YC _t w  esea a & \ F !q{S,*, !{!J9x:}do 2 2 3!WkUA[Ko߽v1Aܽ}O2;uIXd0Zx xqlF(r7rFj+%xp;6 =M YWqZ v@-4] wI ! z qj XhB; 7j_@5    &  6I  z8 :@ .[DuB_ ggU(8.V` > " @u XAn.V9TL2 iu=NcfF?[څVjҀHЛʓ ؚK,Z!EJ`}\n>l7_` l>MF`Or# F` %(L#+N=P{ uZ,iN8-O4O(.[@P[.ldbn zT q&nUja`   9p3&Z7lH}z8HPS6(/3q Z t]Z\}qE ,2r>6DXީ*{݇ٱ0ދڧO q_dyvߤGf0Y>"^%q(!$[jyX8THf79m(v{p ]9W*&q,U<[g0nvgd,D8 x. @ v6qG 7 L #x z  kB Oi 0 ~ d 4qpBX(uc%W dMWL_+ #]7/)g[_ 7  BD k _s14 n.] KR M_D?;c,&|N57*;8m<2PMQMF8 ?L]V 8?~#!` 'D"hDQDbqnsԴןk:)hQ*Tj|5hdL k>   Sz=|BW| {xd I+kWts b 5f/>X1&7RaQt7xlb6. XE|0T-y\)9$8ׯOp>0H,nFN&\p })\ @cwe    $e KExhh. nw:b!P5 %NW Yw}&HP)9$C_ HR0L0faihYծثlVܔ_WtocܹpX7}YoؼGקӦמKԑ͒ΙZ؎vhTCHڍO*݊ڞLo8]Q_E1w;\9B ' t lJ]qI0;%CL{ 9_Rf `#' )+:.*`1e&1!/KU-,w--F+A'D" f " $~$N<"H@CF!!y##9%'R'5))c+*2*"<,D*1FA5C6y@6^>d6I=+8<9 ;D:278/1%'o1 <h/ tl'1  ([)Z5 <!Lz [8r_5Y|~56Y׭BП[I5̿ͮˎЇ%&#mxҚeW؛ ݘgN;v-> <G%2qne>W+̰1ƄЗl;} 'ΕӉnҚӒֺLـ'rmtK  x j ^ 57'E\WBA"1`m@ fT o Lk_Kx m z#%'n&!f:E9t:{cSHFnOL9)kTpLT 0EaO <k[l543~Vov[`biA߄_!Iߔv^ 7 ҮDx?)xcх=ݏtLkpag5/it' % WlzzA !6[Ce<0K(-Tn/kr.jA!F#2j^ -Q Z d ],Cr&T  79 m#~(+(C,/*2*~2q, 0,N,&:& q  1 _eI,(#$#N%((!,#&e0(4S)?8(9(7(0''*y%S&$#$ "TLg*  b{  h 5 ~  < \J  z dZ  |#d$X"U!  6#!#Lm{^hD!ֹ,МTĹ'kƩ goDάw*HhBZ.LAQX5 _|ݘ!Caݟ~js輵&!TZ~`1̟ƪTҸX֧Ԫl޳RXq]$,SJ4rھ֪`\s+VMyO&etN ty!^E3fUb } {qmi]= ME9$0 Q W 6,6K& f a   h .nu-- R;o`YBKdv5/<`)2ۼ݂yhJr 7&ރvѵUԊ՘ݣ0Mچ9hr ѕ,_K,h#dBfuU(ڟDؓwK/Ipoq,/~/4'~]xQO%E[J8<B < ^ =      5bv%ٲPkh$PܻKZ-@Ա,0ߐkcEcda((F M4 ;a 2v5Iinm40Vڬ7Y7>>R z 4$ *  `WU|<Z1  { ^ ] h ~ - n 8  >U|42% Cm5$  I  P ( l 2 '  $ D; V 6\ n[ !F  m} fnWy\DS$LBzӬGly '~}.h] j E `   dߪحzXJiDUaֹ͙Rqԩ'n؊BVKk K={Ibtt e &$V N^#ST^Yvߣ1'@qtށxMޜu^D92 $DX [ cc 3qbD s o Y > s:o1W.<? \]J O] ] c |!l ? Q!YK uq - 68gfbT}p>BV#N0t; Z  5 V+W#|[$yvto2l%+}X{5rEDIj  >M  . q y srxKnTm6&_%!߬h&FJa `Le4 Wf2 P3U0G{K& J  y  N u UG# AbBDg #J~$9#z"!HD fh'Qh %  KwD+K b!C2f/MFWwN$_d58d'AF|3H Za4Eb _e5#h@V1ގ6ք[ Hmׄ|o|+~3UVN^1Lre~-6RJxLN~C9 &Q5p! |: %CQAY ( eu # 4?W{C.z5pp a2R6dxؔ=MFݛ< wCP$[/_P!@Y*tL[% 7.f4ڗPݴNTejpףaiٲߵZO4-;Y<["]$ۤPf fΊ9{ü&{TrCyt̙mbؼlڂ̛ʋ^XOqPDy`P$&yr Qz[A^P*%( .Q R  "@  2  G< ?i&uF5c C0q*]J?2 {zg  ;[`7vjd5g2$tw++ku\\|8D ٟ5ֽDpBih MW= NON {  M w 4 8{k K  "%!A$='!'# F##% %"$J#"=#!""!6"'h:R%2 ! n G mf! /  ^ k z  T $4xNGY^ ݩ!\GqS]pY\KyDL|0ڷ BaկK3j7vēH0Lƣ+dek3ȹʗtU̜ATQV{WHW]\BpkOږ;בc؝/ڏ{a? $jޟxgWއ o:9 o ,   na  "D"#g&)*(/x&d&^)!,y&.7'.%,s")"&$/$($ )(=&,c#* " l Tu pcR0uS/ Y eYC NV2  %SM~Ke?*  D{9k^mL7\WRrTH CZ:un7 skft  !c+kӯ7ͩfޏ:b֠ػ Ug@?3< J0Sy2l!ܦ љoJ1ܝҙӠaۉN2ϝ̥&Գ=ܶv*d(C?! VHs}^' f UEkl2$)^2`b&q{QN8A[p(E A x\:hNBfD_A&Q3FPwIF "B7/pYz0Fw'q  L sn1`r;&\!-NKC+ZP4' /__6H8u.n7)\{  @qKj h  p JN >" 4S >Lo5M+ gz =  }'q3{/D nlܔw:=c-LMb<9yN{@׮ޮ4ρ~{Gܻ֌ջ*.Ѹ޸ػgUy#Y5Hް06w-w *J_ G V  B O < xJ ld1?4!&A#*s)- ,)0,1/3 448:4]8f22/,+,8(x1%J6%9&=!)Au,DC/&E:0D/C/AH.S>+T:(8)7T*J6';1$[*!"%%I#kL$&k("' &"  ~ Bg)q~\iG Eq aT_LweW;>! PN qh s[   UqrN]S@P+K< ? i  t A y  o  yr9  Pz VOPfp`LўOѕz8 PhϡB\WgѱQOӴ ҴlΣEѝ^bv=:("E) bR;j8ASb73tݰm|o-ޟCظ4K *TE\N+H[  < !9$!#: Mx q2gIPvIIHѧQǫ2PCbҥwݴ,w۶LgX6ct, ` z !0/ R s` ; D !  M0X1Y MPF ) =@a!% ,!+10$2i"0#.^,++a*#'"M|WoF4? |8Qc4Z0ܼ۴}߿o$+S6MZ6%~w/k:K  30-|r ^p~ 8fp]IVI\k}0dT.sKd`r"*91!3(2{*/:).)q/M+/Z*U/%-x*\$  .P e0,a4~p1.#uB' y v q_ bHY z #'R)>' # X \  E CdVV]4}XW utwBZ1 ~ mio\7ܾY}mmkaI   &,"p2|D#U[}S׍(ԚܟԞRբդSN,u/ˤ_3Һ֝:C ߸[8ХV̵Ƹ.z/ؽܽk1q{WM6^Bt#WK'4=@&+K'AsaX6O#%Wx(;49?3x   U:u) \z;',G6MdZ@>g >leF z#S72g   /  sho,   RKzmMaxhӌ7GΘ`* \J̚&٫֍ص31mS )E~85AͩulwDSbhOhʬ tae2S|7фÌŁΎu~څԣڕO.߮ 0K B64  {[E C 1B  urf7 W1  )R R ;Z ^ ' ,%2/U*/,/K,.)-(R/o+3Z/r92=2=51\;u/8.5G-e/(V$ ORgf E V  Q.R;dEmEVMGxYYz|u 714h_i3l9C8a߬ kVU<)2U֌RR ٘ЖiܦҞnv˿PϬ+ $$'1ϩǂ̕ʄˠp0=ޖNҀZagB߁;s]JgBBWei|lnW5f G.;*9iI?EXc  o( |l Bl M>kM`r$O3X.EK$\Dc> XC! >v\x&G"^v8X0Eޏ=jg;0էh׫> (^ 5)yf:ؕ*װwfϠߦ>ѼeKy/8f-q :qMj\K>v QvхBʧs.̗U>Rp2>|R3{ ^ U[ y "u(0!5'4'-"z$$0R!9a#')8)& $I@%f();#(D(a )"+#, #-!-/,)@w# 2"T 4  / j  B {\q^b B/*t^( XoEũɿ'g?̪`|Aqjbke'ǜďvwz̍Ylˬ@G){lk2*nkP?,x^R{g(B)'E[NqJc BG  <  @[7,Y  bG H ij %H nLvp~+w} \l# PacCk.Lz R@L`Usi = o q )@ ;} I  `KYG_[NmkY}^/)bޤbܥ@:" R2WK.ht[Zcߣ  w r}@q6wkp]a=lؼ~pӁ@SP[oc= V-YNP<{rP|U`W d@8g+_'7S 6'>*GYQ](4߃yWbW.7BެtUqt%pi ԕ. ش1ڗ֥ݖ2Xoo3t(/e JS"M3A6ܟhOؽܙ3&`E14T߰3׆O֍Pܳߙ.4MD7%g,aOڛj=hoI߬h> 0ֵcI9w YA{чJwٮaBۘ7h(w~]E@1@tkNaV 8L?!%?&$s!#["%#"#k###L%0"P$g, 8Z  0&!c'd,G/2{5 r8"::#;!<=-I?=97 632 1`/-<,*&x! 2{ef`~3|]")Pns* !Mp[9$g7Y/b%|hԱ٦p֍r֮#s izK.    FXB3t +a )'% am9ub~J/?bزѥHe9ωYЬؒ)2RQr vLa׊խt-eͰyc"ݨfۘ՚Bg{7K%׍<#l\* ۸zF]gBqk!3 ?ٍ׵ܭ J ; $RF܊GE/vfcs>p#'j1ih\xsiX>2)(|D^#'̷w6ћPDCX,̓|a ʓy̎3Lr-ڮ?SKozHL{[130MG2זEڇڝݤ#Y](1Y;XP:Qfo9D*VgUUhH` @4  qTr#o8N"T|'s'A̓΄ ) S{Fӕu A='q_KۂD*CL>G(jx7CRDt3x 9 _ Hnj ~6 > z4&9*%-\*d.-3-//1/.1*($$2q##F%'ny'%P!G !} HmS  ^ ,iO   Q:E@T-:+$Xݷۯ*;v;ԸPC[ւzM:a'0w[3֟ӊeN׈ 2rka]r'TjL{KPծ,0bDL`21hZtF/0ou4d\QOBFV!a9t<(2,ksdgJI,-qR d\! RpC, ~TVS Zw -\De   q*3~V 2&6 V,aaL^ o2QO x d<8f)719u x v = s ! "P0^sT J  F &4^ =2(gPih?b׆pӦ޸{զϞ%exƼ{<#uÝęƒǡ˄˭ќϳ}ԱN]ט7;ډ<ۆ`ʾזߕw{1՜ifؑZ٩҈ۿ̓m ۊ4ҩ/ҟaӚъdѢ؈ђ"kZݴ܇\dyMz :" i "N 8#G#t [+( %V,/5;"9:#<&+>Q&*:c!2 )"&\G*4*)XF**/)$7}':(9)5*3\(G50$F4-#u  X t ?CNA>dC d7hvxE_F)e7OM|.Gۣܟ'I},Dk^{תDգ͖яn}Ȑ-ͨ͜ωYvW?*צ"޼VI&)ErV*|Fw %wSJ _oZd`3";=GU_ 3Z=iZ V  77iDuUMk (nP݃kfܪwެE H3`+l5K;uh! 1N9bي{J|UFRG:R@әv <Б.mՍv۝խIf:kʡJ{GC'?qO׽v#M\'_]]34КOf m&.֯d/ٕ@ Х& ߫oԔkƻӮǁ(ZIwܤћ]_-bع"̓f&ϫѷЩ~* 7TC5UYڥGH<`wS.Ud4t='Zް,ILJ-j[+tj:`ޓO"3޵$ߢnh%~</ r  @u =} . nJ~`4 {! HJ -Ie+X)nDPX[Tٷ<=@l(Y0ޗa3btl2  rI\$jS q|a"%'m(j(j$ #?  !!)S.624!4"3 355 4<1L!+ ' !wQ:3YlM av7p* 0g*04ns6*z}7}     k`7 V,C(XnW`bf#۸gdd{gȴҶٶڴuoֹb)+.PsCiǝmNhica:`~ܵ/mߓِY>7_ٱݮ[^EܳP!1V9 r}% i/4   Y { D)1 g $ "lt#",uQb\  ]|iN~K !c#4  B%U j>eT73E {d,Y գ,ՑI2g'Ta/cY % =!W*  ,3 $  j} \WIBlVDdI(j<`V*C 6pC v^s/f[S^o*cwk؜K܁aߑۻ(iԋ?Do%ǽ4b9kt!Q̑hpƟ.ƝκKɋ\Y˨=`Л[Y֞.?X>'aߴ՜J֓އۆ ae~+%DeHf\dKp1J#r< m8cST%pZ$ b* LjI#R܏ѴE 8qߜ-vIͷǹǁ<џMעmZKθ˘o˿F]dج`td/vk1i|ܾI^DA"V|LX8sqs\ކy#.8eڐ)l+ޒg0t 8 ^Rq& @p=i01(r߇=֙|ђs֤X[ȄԐ1&9r%6&6(7n)S8'M2j%(&%N$.\~n84+TvF "qHۋܺskl˺_ÒǺDſ0˂DITwQ U^V}Ոߩ}oJY}# 0߶3qȶȉ8˨Ɗtɇ̾ӴI҃t̯|{-ʩC-f)_@0!PӣӨS ܻґeltۥE]UDM}k^ i(b #Ʈ#Y~ٜꜴH A֠1[R8fv΢''Sǭ-O|030W °h4ù]Fc*Dzdbҹîqe֯ ُ9؇FՑ)nI֚ړ-۲qݷ}ZdKTq5-G`}3Qh;jy9Au ߪk^82u u ~ ;. R P  <kZe !} ]  ( Nnzn'|rZ΂Q` ҚTʧg2CҺ\"u3*jc^,ݴѳߦ<"1ilk6By*  ($ I `2W4]DFtVBuBi2!Nj~t,& @6 ]ޅ\x ~' |(L >8qGv AO(uz"  , R T  @t8/4>. Q~;g _ n  yJ   JJ {~ =W%e 6  ) w a{OQ܁T ؉Wޙ;RO:+\ݘރXڿ=YgМӔڍܜl?Cؔ͞ҫ\x;ނD "89*ڍӝֆ֑JW{DkRm Uv _Mr*%R[q,1[y(s%W-Zf {+I:Z"#!7 Y  *H T 6,:8JS;=gUy\ |DAO$/Y+=9 l"o*k6K #5$$"j#w"dC3>yJ Zk/s>`s  7-\zC8[Kkkc4lXYb.pSH SCB /vЈČWz_]) i9Ζ3=ޕ*DϚIb YхݿE@r@πgkXq?[.tXŽ:Metå>D (vݷݓhMO28FבݺړScunf˖03a\gAϒ׶ tьN/|?~͑zϜbذ C;UF:-A9>G=> D&@L BN?PASFO3HMKNOmPQRTTUS*VCRWPSIPCcM?cJ8 [l' Ck  UE9|  ;h ' fI E+~2 VW^BobyB GRDIpjϔ ؅&yzzH#h"vث;߀ oB`Z)r.2ۤҬ ޗV ۜZ жj޾|h;ڔʈƅш_"ۻܠ5j Xr>* /1 Pi3O'p"'!B&E!!>(.  n YQA[ & '!y /  x; |{HMqWU*0Uq][ܶ" h;/bcU/ݗAbBmro2ڦG֔U҆Зi* YhUX5ĮԨE|eͭ%]ȫѸpk#9ܺF(cJGa$k/_<{~TT &U %*6 o-rb8bv_NmT   p[ !#U' u*))"'o/$^&'#%#y##"$"%#?%e ! $!"(|$*7$0*="A)"*y#J)q$%!%!Mbv WpLpO_t zR 0km@Ex",] S[ƾ0@2Qx>jgŸœń㾞NJemͳ^ ȻMɖx̢˰H6Բ[Bޭw-ݶ#޽3ҵYԈIH֖k ܢט5q<ط363#fݓ[DhG"emTUh".w>p4~Q){[k!avt. 8    { % 5 X )h4(< O + d99=D3 Yx9~1ق5r.+]`Α }؍MZf+V<XI&ܝPGִҬ*:(ڽԊ{Ԣ>.԰oחڰQݰ2-&w|Q\_WbԿzY=[ɓĴDЀҘ5OܻޏNjϊң5Dۂ21ٞ"_RS9uz`+ cs!4NDk U- P u+$L   RKWX PF;t As)va+\')0l  0| @|B Y'dA~PFۺ!+jlˋJɘ8W칰͸vJ .b7 'öؽ/a`̫x#;> lY wJ; mtZOvkPw[y*^ޅ/߳kFOVqA( n ^xB^&1J=\j'qh{f%-r!D]wBRSݙPuuݸص8!֦߱ڹ{Gݖ>#ނ>^ٛ-` nӯیޚHQXҼ S ʘ։j>۵kݩߡ\b4;~+pؿטaru=Rtǁmƕha8~P$,V }t0@q_  Y  }  q V lfj )\pPd  X=rz TJar  K jMa?A%>Isk[o{ vD{S}Htӧ^&fqݥwnޒ8U3ΝhұJX^/|UPDPa+x 6ηѲcB ǃ vdU +OV. pt I  | I|d3o 2r / i =f (    P /) x@ u"1%a 0*P%(&Q-,306h07.3)^5 +7-g6,37,69,;0gA:u>:X:^5y:1:.8*7&9$E: #+9#5Q&y/&y.k)O*##9Px"6$#+#<-,#)S%3g  9/YWwMaToovi3/5*2|5bA˶)ɺiѺgǀܱ8ӷX:trŵIJ@`QƣŐ7vŽ8̰R4>òݹ)5ŧh禮D٨U۰BPԪ,?)4lΑ͂L1k47M Ԗ'~"szdxt|An{h\4f$}{wX`|)oy0K4Yl*:v}JFsG,)MukڿD^˭efͶRƐfyy6}PvKMāwdnʥśS:õ=jkһ׳7Ћ$'}B;؃ػ֬u_M6M+HtI+ Y 2P ۨHːؤgnvg(;84 KT U& b ;')[ * y(P#G! k x"\"'(~.$1*2-3 4J95$8135@/d1-02e./5 *3(R0#-' %$))P%*3&B0r-4364}80 :b,>/RF;Ft@GCE^>k?.48 -0='?-#W-i 1 W0E,L*zW'% $1 X(ur, '7 ` s 5\ >  xpg!W +_#^dN_yfػ*=ʳ! z9UcWV96Ylëҳ̸e7hÚeÝěĖbÙȢ*tnOTȀh ު Kq>O Tz2 O x1d{/mh ;o  qf +T 0'K%3 %b Z'!$!Y"",J!!aV|m{9" | M$ n 1   !$$() *T#!a$('( X<(jy(z6œݘՅFѺ{J<]gy$%.󴸮ZѭE^ggJę Ð 8 -εCƌ̷+ʩ0CŢ};ǵȋhɺc6Bz<底ݹ=VU¥b$gF"-˱zזωѕ:މ9ܫ|ݑ ݎr ]^ghEL T} M KBS# #x r  <e@b:Bj%!+Z%0G+5+1,)2,3.5+u3& -!S'%#*!(y#T'"# o&X8[M"0 X T A Zy}C  0:fI! ," K{lX'7phb ~' @u n 1YcCoD_$TNmӐˤ4Z"ظsӐWӲ`RϿCfѳ!ؘ?E*&5OX%$^Փg՚ˇӺ!!ҟ ҨQ¥;uFAóϝĤp"Q+ݿ5wp<ڐ-= 25> @P5}r7b={>WqEroH{a `/[da:/J 8M  N } -l_<LNxe^YEnhgY ԟ\ozJ8Ϛ+{gfE\\ ʱ_5Qv&GMIcŽ\5\jhRDɾB5e{R綱NŐ)b$*̈Qͬ=> aժΕ|й̃Jڭݽ=JUDb4eJ75&!x e6c|Q^-_^Zj9E p  "  A1n #/,4o=[=C: >8;68;4_806g+G3*k5M-x;3*9%&4&60('++q/*l.. 22631@5+2 -G*%$m%k 3  n4W#DHJ7HD =^C4E1$.q3 ?]|OPh0xakPHTEߢP7~tݎ޿xL.k8 M$ _ ?:?  1Tr}}QH PLUX3 \xCq r$R Xj 7" ~8r) K Iu z $nVyG_r(F݋.%h԰r9GQ2Dzo\ޯI{Q&Y)Ȧp$Äj0+ēhZy]״r%?1hSͳd5ٍ֊ݏaڬݎߝ&<ٷװS3׷jg0?5[@h  z`Rg7t';8C |hVJ*E#s"/o;K'۳]D'i#Qq(#Y6oRS3;k"&_    O\aw3Ij ' X~LjT ovC !  j e%=tV h]O    " 5 % x? FZvF ys R@ +O  . - sHjik 6$MR dGprSݱ+ 4QnXٛK A{r. vܽp܃Y@w Ίkd"#ظff$kͥcA^yt!΁&؞ӭկ,ܹ:ݶa%4XKBH$;q^ U= a +Uz=H X z Kh Q  C Nta#Xp'   q hi d !~Hh?X @y "_$9$:"V_ UsYZbT9en1RHkB ?rjQ m l IT(IHߛcX/uKMbNfX2   i  Kc/XO  E'E,0l4I.;R'e ` 1g R B#g (W S&" $*@'%&$ l#b  I j$By 0SE 4P{XkZV ;k^ ( ? \4P Z# I ] aMC=M0ByOfBP3А!*ҧͮ$0OGi׍0~՚>DnuHEׄ+&0У؞eS)q-5ZҒδǍ[KփƌmЦƑXǁ΃ɔ*(aIktЍa&_ٲMՏܣEq`98 C.Fk@U{gfzy3O  ^_)v7(Ov`@Th3nDi . .R] ^ /K{ "lw@s#Y7?NS  LcU^8-0~ o. h79XV'" _*:-&+2-*'# L bCr <& r @y9 x  L?Fa6ז+Hqݽj.eSާ1޸عڃWR&ބK Q\peWW׉j|k|. ޷1rhΛ3-ܘSi׸{mKGׄޠe0xe)FC5ǵ)ϩ ϛ|sk0(npgN  %,uT  G. 7 r c OndY` A ^3OOd MK A :`  "tG$ ) $.&.%)'(&6*q, !m),#$Q !;j #$(,$c-+,(.(//'-T(U)(!"e!Rat h \Vp~%i &? CDۃ@$Moz  a %(17%%)-80S2k1x63;;=@@EDMDP@ O7F.>' 6&`2x/;!3mkܧw/8d}vPy؂k=Ղ? MI߉wY4rߞNIm40l[J>}<n]xa[H> !2.:? j G p L xw> s  d<cyg   7GW ? hl&r% O4p{41(MGaލy0ݿ t{Sfޗ>b,ހpݧ&6܇޻ܲ0[8ڈ,nz{۷gB WeߗUTAˑhj֠'¢AĴʧ]tnkF*s<уoΗ΁JЋVϪe0}*RW8 cFU;ZHCHnۧG0F3k9rH=  ( huv ] } "#$]S}4 mZ. %#)Z$D*t%)(*L+..00(.h-l'% D#f!'2#&#GX%sIC, XXp+w. Mr.,X A: hi pA4|.[Q-tfI]o[Uu W0,jB L y)9Fo 7&] 3O7]|]u}r3gX e)A2>NZ,)l V 3 "N$B,)Z` O# | ]  a e-L ;  G@ FP } h a 80>on # ")0ͧB:!+XߡEݤ SٓuU@p2edFCiۄںcmV4JZ \ oOAvaq@vlz -YK]v JN,Li[7<2_ Z'>U6+4 >Md = H < y Z   0Dt  ^h g?E008HY/m&rt~:jdmH?Y/U r ;m # (:n s""mc3qlb?)"$$?'u 0$s'#v'!* %x!h!zJ X3"~* + \6 tq QF~cD   I [) vDMOP3`X^zNرسϚm@ψ ftEJջ"lމm8ށ8N>;ٟ,zWFU@`_iU {E9bSp_I M t6K@q%'>*1& Or :SfkGq8tI& ` ^ %9ThVCGH HFHB-Uwܑ-Dz`hjG82D>:0`zցѺ=?ƜQr\27/ҹoݸQ7pS UJ{fN?-[n l4-:f 7{ p wsG  kmO Q J  oW&!K*# {%EV%"(b#&{$$$s#|"-! ,/ e: uP[>+;[ w| K~  ^O(@e CR7a  g h~5Z')'d&O'&? 3 S#t!+0:0}.'9]7A3!k !Q!6!   < Ua9O2+&@ 4;aP\ kYJ` 5L7 Fk L`\PIma n-T#lqd{:Xo/| u gp^bLM  ` qj"4"I  Rj#"r=@ L% .B,6270\1W+$p"aLAO!O.%#U&p u xJ7.#  "H ''1#~iM v< ] @_ UanWWar0̽ZЌҏҧ1"6_Lx, dQ^[&ݻg 66 PJ O' "q%A& ##*B!.l,Z'h'(*#.17z=A^AF>CX:q?*8"=?6;|3%827I5k:(9=::C:5:1:$/9+7H)5*3^//9/*))".f"4%x5$1N ,V'Q'%1$S$1Y"<O80IRWOL Lے'ҳp֢>yd=הNKϭwsɝÁ;PhF>.ɽ¨ŭ4eSwѭIEG۴#Ž+0eˋ(~пۮ]Qͳӟ M4߽(Zqd޿ՍP}]N֭߿;۵g.Ѧ̻ҝԞZ@(ײˀgʉʏ_͆tҗ؜ٛyq=\ߛܢ ܉ЂУ@Tҧ`ڼ8aۼ~76i¶Då1țр"Q'oZq)=E͝=ݾ\?ӏQcs?¾!ϐ'ןsҴwϪȳ^>kmJε‘Oc^ЅvJИUۗp"}YQچ*u_ ӴWǀQ}qݖ/vnQ!dcڊϴ8Wؽ7u,٣Y+AV$?oɲaɺ +UWAL̯˞Aǯyďq]^{ŠeŷQϱ  s r#?.EmG$2!(<')6*(,f,026480/4([.#i-"/!.N($$0$A"iq#&X!+"-{$"+$^'#{# B!~ T!e#$K&'$#&_"%!'2$= s l\ [bAPZ *hٶג8]ܗֳ5՚rԃؼӠqځw٨ΊfЗ>նիO g‚<{S{mޢ8:'$q u2P2 . nY!0&%]5/{! Mm|  q0^Cc+/Ü#gBo1Mn ޭ̪*թ`aý3ѥҠ ,PU7֪!,PlQ׿7,q/-8Urܣ$q ޟΗnأ8g>o歼S/ƽŷġ@ĶvޔЭzҥ׈ou55{ҁe7[,EAvG^p1:^rmTT 9 dC z.1;S~ ? LM2"mܜBӥٗSiEӕ̺˻;y%*ٟ(zUϱɰ# ʺ̨P߼忢IGBݹ\K]x /ь<̾Ӑ]1/Χԣ`8ָ J{;\C(O"i1 V%d=UY7E+s{F} -<%*fwx 6` }rgl  yrtoK"" x( 3%2-[11R0/I*5_'7++*35 4k2,;'P(+&iB ? dX^(  c 1x Aܿv٠ޕ6ٶOƾqX*̐/`rp7mUy6_Ӭ֪#"y ̴ܳڶNS>]HLœ?h'" ҝcԋNQ&ٶݬ{ ѿФԥj o]1'a+{9Dݮݛ,R֗̾1Ooַԭl 3 'R`*ݥCݹ#oX1bA\&'|6؁fPH4޲u͋+ϕٿ_JȻ0ԅz9:H̛=T{ˤ_o)6Ƨkʗ͏ӈL"(tk>K/!5M#zl  ,I%GP!\O% &J S#K#_!*ANZ!G)39&<S"0"cP+7!*m""u|  0i  6 L ) 9\x qy JYAe3ԷG@ѐއӲA~_ZРދgH:˦MvX|&lZ1Z}нq(xKV1ŦݼχЌv_b0̷0Ԟ5nckT¢BʄԪsWԇ(ִ۩Yf ߪ6r[lB&   32 r}TCM n 6  2gd- C C^S yA I+u#d޺ք{O5Un 5Q&,&ZZ ?mOD,0ezgi:oA+1vF];)a߻0LGqwJ kw   Oj51[N+0\t$Y j_}!ep h h䤟f 8ͽ Ϙ5>#ϸpâҽI#DN/S{ʛ~uۮN8ݫ&ݝ ߥݶҸ w$Yk2 bX  uAI]Gr !P#f! y H! # #z !W#2().'*-5'"$$Q Jl !h! c*#V(,g!)P%"PJw m 4a p zEWwUx۷ٿAF/\ڦՐw?–u^jҥԉxĤ򩗦>I''ժڮ0췮ḛ̹eŬ]dþ# ôUtG\Ǹ e>T@ЊJEZּސߗ޷D{KLp/@T;V B),BTRPM:AzbCC?$K0/sfSiU ]5ngK A{6y$~/U~ߓZt&d FH|R~2 R/VM}:}!  !n ! "%*)U(V#w "w&4*-,s.')H(4d1e"5-  )%(%c'/$T62r) ~#$ <  0,J&!.!n,k%%|"K,!c ?\yd duto0}_ Uv Och =bP-mFֲگ ^1]?o!گVIVv Q0T!=J`g15!O"KYe2]^(32^ H  #R` 0 t 9~YY#rVS0W}[> c>XZ2[uaPߐHߌ߹ڪuiP>%}.ܼƒ$ɛٙ{ѡ ¦)D%\È"u` @Rӱ֤֕m̿S@,O۰QO̤Q ro gi^2f" sRH *Jkb\,H.  )Zo8Bm"*}1 b!DmeSa 1Ovt^ ődûYƉTocA:ʞaYsp=ݞ[d o|n`veX +o1Դߠ0/2־ 9wzi֫ Li{RRlsa J+ y xf* z)0/ +L3& ;"$ o r'E0 0.K.!,D*L /y(7+:~)7%$J1'U )E#!-F)3b$0O+\h,"1r)5_*$4' /!%t  S(2y+."B&0 3Y+-s +.g## eE. |rz4 > N}q o ,l\ #'g F . gLm!DkWL"+* *2$* v 2kY)O.3807)J0%) "N#$/)-*}3v*3-4#2!728k3:9?>A;h=24+X-)*,.377<49.1-/h57@TD{JMJKJ<`9*1(&'c14;>=c> 3H>b 0 ] 1] px h r"_u 74  T~< Is j+nKyAG;`C8@:8D=;5?7EFQ2?z3 B3C4C5A7;3,3*0|$0!t+%V$F!A#U$;gLJ   9 +?S >p Uޓf6yYA]/I9Tٟy4ԶUsL ۅվ܃E֟;Ԯ]VӏՔQcwjj|d>&2s% \ uhn 6 cCK X: ZG8I i nB i4Oc%A ! #3" =! v#o" 3":&a&! p'  #L')0*,> 9 g  X Q 1 !Y!{AEJH($24%D7 3h.v,%j1&d:#=BP DBBK$H\.R3V3 U$2S -NO&-I$YF&oF#D!E'N1qZ5d]l6[o:];m\8:vY?]kFdTIiDPfu8Y3S<]GSgMakQ&mQkJb|>mV9Q:dT&;oV=YZB7aIfPhViSpdE$U8E1;%18>7>AISE&N:1C18v05,/p)(-7(j0'&M-Q)|$ z Y"a B 5 `mm^s&g` o8e);w=iܳ*Җ+ںϱLjE,r؁΂ޞ@ۻT޻ݴ}Qפ &0ޖR2x߇ހ:mcJ ߂eD9׹$IN|G\xK1s#nQr72y)udey{9#wp ai8^OP>ob0's\LUcrULڦ0O4,|rZwcsCXR''pr@!$bv"u m-s& ; v#+$''&%eiD"#A'A#K'%$!#w%,Z,,,*I)+'.A*2w/5.41T2/05{6 77337X5$=58/8?1-$"5!%%A! $ N$! m$QWlC{MajBޛuRN|]Sp /;߽~QrDa[Pfz;x-*zrqPns&tMX38bk "2*.v,&b#'1a!y<\(B'?$&:)K;j.M?23D;LlECUKzYHK2XDMQ=H>ECHUINnMlU~NmXHSy?JU:>5[2,.',$+N".".)-.R'/VUdL Sf_jkckl/+5@NT P hq i Nj O$)"&3$!#9"#*3 !:98/m(D(s-Z$j5+<0*A1V?..8*2(.t'Q,<&+P).Y6,3*j.S(/+H$+&`&%,(r/*1.[5545,,*a 1m /}/-=bS4  C 6 .H{@ިج׊<O{>9gA?M.m;gt )   ij  A ~ _  j 9u!LV#  l!( -r&*$X | 7 'Xg g >bOke o 2  e T `.x {.Q/ [ H  .Lim/bM'7a$\>q8jNg׎qfmCoл̹#Oұ׻gR۽ݘW> ZvS{U. l0|Z>7lK,jy 50b8`gk1!Cݤv$ܗQs|Y~: 7Qʠ A #ӱvџЖ.`PY j'I !7 #-64S1(% )#,$ -+#**# X%a',,I--./'G(-)g'%53U.6/5-37+;,$O( /p$1$f-#G-&f)]#l!;M"&$'0#%Lx Y!] ZZ~p N u /)| 2:^/MtR_(%~?Wu(yMJQVN*KE@;40*61]C?LHKEE>=A7G>4926285>p7>339*0!-L2"2:`)9@T0F87EB:%;3/K*$ P;A:dc a ? $<  l B oK B NB  mj1I^a% kMߍe ~,ݚn޾ؘv*ֳۘ>2۳fXԠ`JU@>/JiN ~K  qxx%d!% `!_' ) ~%1&w2 !U Q +\ wK_p eMaC/PݓBMBBЮ _UͥKByDadNQ oB6 ƭ官;B֬SÍѓpZQӇȔ݋wΒ{$[ HC  wBff˟60Ƽ۷(}7T@Dyy޵DTF,wcOZ =wuxm Z- #0#/0+/F 'cp(8 ,\ ){)qj) )l mzP#'"(<#R.h)1.++*##^h}B!%(,1S296K>8>;6)9E5U497>=???@@]@WBY@GCFC,C?EBlIMHDGm<=;EEUVa`L][_NNE]GIPLSUZ?\VYPU UY\&`Y`S_Pu_M \JMsWQW Y^_Y}bkS_AS^&W_|Y`[_egdmho0h{o~gl_dX\VrXUU[VnTTsQM JFB~B= >*;tAB@IhHI*ICB98:,P*" "?J(_&>)* &  ftds=', , anznqH:%SPe,?J^بިZ@̕?H(Ң&I8Ġm߾²Vгٰۻ*dV~xȳzVy/ʲ$ŧ"i ƦۼpݓԷDŵˏyaOۣҬ,ڧؔ$Ոd˯ЅNjӪ UӠާOϐL hJȱ];z*XkDͷܷ8I@)ĊN[]as/ŹeMεە޵.о*֔yE.Lӭ˅wBp݃p40/kq91mˡC.ζzo,#b19iYVbtq t#$v ^]E c  [Hy(}#F+;$ $ !`"h"%#5k?I E/MyTל/jF9΀bv,%ة5r@(~}nqڗPYhZ3ۚ~.ݼݾvHٱ'^`-їJXŠ.<ķȩ {I.mǵR̳fŷd`f۟XF (HAƩ&΃sKS# эuț8ɂx/jڱҮVsυ׮ލ`47y޷s!̠̈ɴҺڛ֞P׻&y͸ϾвDž͙ųӟ];ܛێիϻ$ƽwЮ˚"1Ļhu³kůFxìۺj鸎ܧA𤤰$ɲ`ҶB* d^ȰGpڹ+óȖΌLuSan֎ YbhU)T7p{"V6fC(P4[   + ] fwa"(t!1'<0E7^I:K=:{I9@3<2EC9CK*@PsFQI4GB>n;&G,BRJLjRL.JEDz?_Cy>A3>'><986301I,Y5,2* .&>1/)0''@$k'$ p# (,(?(% dMT^ u R n+~YXу2{[*%9،܊b_״pa61ܝRs֧֘ܪނkIMFH>~t_b-.VD[e;`+C[|M " N d ~L9v R>> Q 08 NS IxhkyLlr D7ۀճ(2&]ìY@ANǬ;ǃ$󪠲K4Y,n)L >H46`Ƶ"ؿյMS8CL]3μIa:N9ƀ5^.qW6ZGgp A!s#x""!" A!'%% !;!*=$0,30A'=|LEEt@IQJX\T&SReN`MNJO4IQ*NUTRRIHFBIDGD@@ =?.8<.3849.6E;5!BC8@ 5A5A5 E8L=O?I8C3E5Cw755*+-#1'9 1i8054,4r+1'+50+/+)&&%!%'"F =/. 9 ;9:m#s? Iuc4ԮMtЂ˴įʽQDŽ|кDFҫțةih[MQގǠzފ߆* 9 Swz%if7!XߵڂV3%޷zONtlMvӁGfdgFǛ~й0.ƀΜ'$>T9F@ͤBشshɬԼeĵ"uBۦ,َE֚dL^")M8,  z NGz(UMf\J  t- BC%!2'X",'+'V$V#6}F |D"%).04^14-s0Y*, '(7 _ "O">%'.Y177g744K0/+"!H0"r_%l" G1U h h 0O 4LG&S0 %L  CHT=%*c) 21--B${#EF~ $!&=!-$Q( Rr \2y pD gA o Z  y au9# o+(^*'a&Z n 6 j| Y~xU. )g wFUtV.:AF] B2  z K '$ ,Y"h)'!' )8*Y625:p552,-|*l-:138';<=?>C>C>n;T7 3y/9G2M!@<[lLj]kOSWGJ~J?>J6,C{6|Q^=U?M;E5jC0A},REK0T=P^ FS>@? 02%{/-X.43$7f,K7 /u7-5T(,Ab  30 Ci }  k e78g8F]++Kjp M # bS 4~H ~fb^2rސ[=] [Ef6<e1 d DeJ.ٌS =mޑ q> U]E(WE ' n!Y )PQ01K Id#!&y )KO ( +#kn :"%)+ *: .75JHBS8 !9&&t"#r< 9/" 1#G/%6 -F{  7l  ;C xm& 1 (lp"v^ jp( \  A3FQ9  S %M=UG6/H=Q$+pjU~zYi+7-/u[ڬtQtG<( ܐd،.ۆ׀l[ՑBzC߷Nۭږ#MD]s5AL~k U=,\=!Dg)!: >"1_ Tcw $ '&N!) R3 y#s&.w.>20-m-&|'2$^#%"E(#% #P!T!E# $N+*+1K/\5M2{:5m<5p4p/('3((o6`3jE%JX>M@J?B5:>5m?3D@#0B0CB}0h;-7&,=/C4rF58H9{F6?]06)0:%1#g1!n-#-4%[:):*9(76R&G-1!6l;!+%wl/4{'p/'\)#%  ' a, +$"e!"rL F& i((*3%g FF9 P @" XOrSa ,+'  #[ Ni 6;W6zbz( -   HeU4 y  nx"^c j gV #LK f L.v( hAN 1n  S Ef    , Q $]\'$HPI H088 ~!3)#,!$#'(:(C&p #j '"+"+| (JAi 7  F+li  c +CY6|zL[1]+h-$`1y;:TZލI3 ]{֪c+ e]I8kСLU@ &ύ/P{sIˍCŜO ~ʦٚ\׹Ѓ<_ɳƋEp-ʡSʋDžƸ ikտӽc?.7˕ռٯw׏܃`Ӗz̹ uokн;o bó>ƛ9t׆YԄ4!fA9 lӞV׫hTa/"qXxx,U82R- vZ{ _JZMkNr5G p lOqk _leEUw i X9$~#.0*'.p"j#V)'$(' 5!yrG/c#0k2b;X9314-*0s-2/'-,v)(%"$,%AO !(% %#!_x1[h sqf ^n'(f!  3XvQ[5 J# f @  & W{[yvJ'$ =<Mh/5TF>U4o2MA qє!"c G[ժɆ~AK݁Fz|vڻJ[ZlGKt!1k"R-e܀Ș_ڔw ՋG5+ Z$_?þl1}<ׇzC;Bǩ\]LŤ/ΜʤʸˎEƥy“: k%`|EʨӋA`RZ9 ֙Ս8v}:QU6]g|tR|J xge[9 Y%0  >SWjDhY  9go 0V$ $   } 3,Kjhk  m .RB < d 6Q/CK :^  {4 WE Yjuhwv   fg Gj\Oijl )34-! Sl Z# +3O0|)X(W+M1*%i#{#&z +63,B/#1T%+T+/  [lq&2/%4/% c ] Mt &_r:=$"X#% {lbl>#$U(*(u.'/",#:E o /S K r[ {dSBe\?Vd5 && #2[*fFJel.Mj'=5Q!fsuG4E8+R#J\,I5F8uߎrDy.B5x U'>HhN ` l      \w r&:U'$]V%-0&0"d3%3+&.I!'&-8*&r@/C{4F7I9C'45((+ &w(J:3?& @43I>N$DMBE/;#;14+3)76+";9.f=U1:23f/30M>y;VIEF\D99,.'*#+z.5>9@+CDFA?B4:+2'-C(,|*.)/'r/#a-)s$ 'PGq#D*y#.,[*6's! i ^88?f]GD h! Y {Y@? q  (  > ' kg;K!q$!s > l q#!#w4j%),4&:S,t:+:*+@-NB/?$/4B2H7G5'E52BP/=J,=s.D95fE6 @-1>-e?- ;f)7@%Z<(u@",;9&0/g0z2906#~8(77+"0}'$Y=U0K F1`1#@^!6"g93')k?])F'ؽ>ӑ"ʟk$3yeq{O5@ͦnͲ 0zȾơ]7]ͷ ^Crǰg5wbεޫZץ|(~jɸè^QzҳXyȾv.qٻ˶o@,>fX{ 7B<pt,n W PkMU"]%'/B6".'"(h"P)H/2"8h*|?0>308I+2(l3*53*3t)^6+5+g1Y*>-A()$<'#+R'4 1v886;8?5@E3EGDEDDH(JJNIOJPLPHKB&G|HMPQUN8RHJEEWB@?Z;?*;G@;EAALZINM0PP?NNFE=;[;86?<2>:6K3-+4'&$,#.'< >GGHEEKAGX@`E<=<5v;3@9<=9;74825;7773Z/,0,e7I1;u4m9f410+ -s+v+,+D,-(P/!L,%#8'>$.$/#$17R !F+  !!!'"-)K`b g #  mU@'*--V1+`0&+7#P'!Z%1#&+-56}9935)-0*25;=;>w@: <698;}570^11/1m.+(# hD*l  8Kv!!,N7{'$z"}0&ERKw xL]-uɼҥR:ג۩4i=ԕK ۺ6JA UɵԐz6~Ŏ2INyiۧ8ͥ6ȶUO̮ϴά؜R$LCH@H"V7 1$ SO 4 a D < [ h D  s 7% -@0)"y.P '[% kB&))qr* 'q; D#--*4 $7'9'7O#0)+5 @"B' =%7g"2R, C.]35l1B/T7t"@-D4E7nF8Ap36*/&,Q&,$(,6g2.C@@RED>>_5,7'8+aDB 1#Y7$l+_%+!g("*#- +O%%),1.3'{   S~ B"'!!%%?u  j S/R  ;jH .ZLl-@  c &   diL5 5$&f|!{   1 ga *1e1/,*(,,j*W"+37?(DG/I2iC.6N$+%)7%8'~BL3B57.'!=g* [#P!1)1)G.1-x3'6-XL!S]l  ^ x  3 v+ kG ]x d q w}V'$ouR#ӖEѾӤڡBy4PѪׅ3΀D_e@aaі ٹw ̪g9=0\հ"Ҧ׋!izQ٣QՆߡ` ڷ֩ڌgݎڿ܃:`ܔGGջAeF pn76׺ Am1gڗlL̔Dԧ޶Uaɭsʶ$Ӿ5OۛՎړ3Aa۝6_Q؉пyxӐYb1ٮӮE.\3´70ܻH٬@6 *8$8&>-_A0E-3LG~2B,.?(ZAE+!E.;FY.cE+D*5C)b?y%w:4<012#2=)! p#w)o-[-A)!H""N]&(#)''X)$u)(9-}*0#>+"!$% a.)9&76 .l&h3)6W"v0=x,? ,nl.5P' =$V9GE.IV(G*G-$3&/c:6m/>5+4R+5.:4m<8:6:7<9753L2M3Z1w*`(?TI"p[0  A [).6R7&ְۑA]`?cf w@՝vɐФc4+O.Cǒ˩ƒȡ(B Ӳk+R״=m );+֪ݤYI~{9Mxxdq $޾E~վxCɨ޸-91/dwDԂSӚuUԢш ܰrXީڑ`ܮ$Ww0Ͳղ_մː8ħ׿0`DWѾky21gR Кx*絠@ ޘw&͟Pbіצ1ޞǰX\-Ųi+JJ%;k]rM ,J3۹ ƥܡ?ع@GxӠPBd=tṻ6վ&jIUȔg%=;)NՑa̲e鿙= ݵ̽pݸ=r̭Q /[ 8ģ@ Ш؈ R݃֯΅̑SӛcjZ] >?;I!֬R3_Rp̳8iMͰŒȥĻռSc-*y"2x⽍eyÆ/Ɗ#6sNӧƺǹD[J׿ &Vak*M ]3`HZ?.B;8336,H3&8'XC/\G4@.B;S)@.9J57N`8KKh3D,<$A76 U: B(J0I0E+B&'> S8432E9JB ?Ok7|/,%^%1v[/d" 'z& R {Ax( XW.f G JR/m ! ETN;3yH ?K~Ga׸ҔAVѬG81K&ܺ@wPgڦޠH Vؑɢۼ.9Fwi>!5+nkjʋIėZWFtå ʑtʓbָ$D߸/˽tMZڷ9­Z){P@Zn * >ݛ;/x܎<7ַtM]4Q;+yNzqBTG xYQTl%ho[ҢGӡDD ]N}W R/pB׮ڷ٤ޙߣ|gWђzHBщܴ ƣѠlż ĶC˿6ϳ*ŷ!Xkx*[p͞^ĶànŅ/»ɚŽaʓs3;MԏJgqh|ω˦͙ˈˉ\1e 6܇O٪>a<շ˛FUȢԁ{֦ڻ HޅضjayӈBI7+$zt41{ޡ@u1Kw ݄=:Zu-*B 6)g͜3/R,r̖ٺXׅδֲŮXZQVi}@֢W[ ٯG  'V-M-1-(p.( J!2zXz] ~((+'S(;"c)$!%!(!,; & $*-.32==8 7S8]9w8v;M0W.5^5@6451>z=;794=:==@x<@~<>BAFWAF=(E< h2 l vjGqma)%] 6.|vIhwRBՏrΜrgx%6/4 ݋ ?K_}cߐ"{QxM|ٍ׋т}I͇K\ʽ7)ri^   KmP[p o&G yiwj  z$3 +s"'~) ; . s up >K| g  }  5;V ;9c^hT4gcO .yg  T X e\s /m^ $#G'*,.$wMU 0e#c!^!j  ;#[$g&F #n9 )a1~"#TG\d@3 59 X #B I <oZ*/'  aL/U 41~C)*"0$2g(a !i!_GfCJ!_52?:XB:?Z6%<2 A>97k1,f40P5,UC;RMQFfO?PA&SEVjNLA>.7?0F2;LaB1YM ZCScH_D V:9S;gQ'F<>27.+!"(%0<2125!,Q0"%# %)g 9 @X u3$V.!@u,2u +4 .8I,x 1-<V UQ $ ( ' %;|3,W@  + I\8MhR5[kNv`P(J_10_ |_Xt2k5daogÂ&e6ȿîR˿vSwpBKVว=˺~뽞ݸP浼\mX-u 2ʔ™D#E9Oç6Dܕ4*CJS#Z%|>KW |!&3$?("i, (! *$'/*.,36 ;p4O.s '!& !*+ / 1 9:A74 R.0(6|4:6EGBgJDICJH^E:D= <996891W73<=LEuUJUS`rTb{KX?6M5D2E46K*4(J6 N4>[CeDg]D7e>\5rQ/uNG/P*J)H-Lc)D>/,M37T(([B).FF-Pi$;F>Q;E< }:8"m4'07!-GA$`R% 09+!}{9$#  & 6="Y# %+"q*@*32Np7&!7d"O6@460D$J *N+Tm5QU0K2'@FS"A?<;8;w?{=DF"VN.UU8V:L.YC&83'9@?3&\J5Lt:"B*@*a?+h;]+S8,:3vC@ON[Y0ZoR[Mo@;DR;U6i1+5,,4,o8_.B95>}<.B<=e;;;@x8|Ck1$A,6@7!C3* H2#1&.4>4B?-:G&7# b%0 47#:|%^tX di   ) w .b;( y6 { [u ~ k=  c 1  SG z*D'.'..1h09(/':/"( % $,k#)l$N(/$%AKYt$   5& )}pD  A|n)ܴp l^ dN H z Y-PG7*!vC0QF 8;/%3L*`/)0-{,$(X2~%6&:e*</,%^" + $#%vM T!!RzNeO sc}wH2 [mߙZa vA@KGО`;T-Tڥӣ'l'gފ7KCސHvӤͳ;ـ1`BQ ߎ}ԃҹ̉Ї~_ )m&D`΁ߍB}XpܵQq`ȂURv9:6p/!HlBTQUWG8\QWd[9 U׸ փ2E*-cf_q/߂ %F$b ܨ0 QT#ܻΪoL@xһϣeϛ}!Z߃Ϲ*8FI.td0UCԻ\Fɐґgڮ6x;ҌɷΏt۳nٱíN_HХ Rqp8Ư yVýƘ̣›?eYel.J}ɴͿ#ݔޭXV)>o ˺=ӲBײ5ުГb7C)C+miƑʔeԕ*CەU_͇qrr:л({ʯ?é73Wq. ћ7vwKԺ湊ö :`d uC7N*Yۋƻk;oʺ9|4çjǞ uњt=ӣԉ$ͺʸ.Iɘͤʽy+شוWȄҾx²LԭTwS =Ezsɔ'9ʾÍ^Ɯ";ʄtb/nw˭ړ"Ⱦ׏ǣ9ɭ5$M]CfRBpVG  P  D`mA/ 0"z!>  ] R i#K  Vv3 89$1),*[+'%/Gw`%#II"C%$ 6#%<p 0 9 r5d_ ^ y  xBhR؏i׏ڼ97:O x,pifMMM>Շ,dI>d 7  3O*| rnE&LC*1;5Z?)Q=&d/"\ e%j! &c))*#\"4$<  $c]R 0Q6Vh2Z2.ظwNr]˿L}0H2j ϱ'4Sx N_ðɾo<ӐV\jNZ<Ё=D7ͼSl%m}-ñм^eհw誤̸ƼvªK+?ڰGOmܾzԶf̚pܡͿ^X*fyS6ia@%~>!$",0]5=0/;(&4(8.E/4I#:`#49O+~AI)#:) 7+k8*I8);+'6><.*4122,10[- & &$&v"| " L! ^ ! ` . - (  :`l) C'%"E|  O  $B#*D*&(:)5*5/5:=?:>1B#=>5@9@?y5o2p0n./0+e.0:4a@5?5^<;A;<>=4A:@J;9H;,<^991,1(m0%5, :38`3948-)"*,'F/,-%,6X,D:GX?UF4B3/:%#"&zi OE GX a<9>t=Ls֖Oc߷*|ֱ&м'f~ LєP ~ːݳ^L ~=ǐ߄БAifپtɾgFEųIUʗ<ĴAЯʑA̭iTƺ:wlmʱ=#p3Cx¹Qɹң,(Z1g{ɰHNT ڟzޥ9TPiJ˲=[O9˦ոЊaiƙwrg-k:Ͽ}'1@zח[ڼԠ\ѭ-''2ӭ 8G{*3Yءh~PBB=- +3Ckp-E84n*JMao&Wwl >f" `Z'kwRl+CY޴^ݏ>8F`֔x?ۑ..+}p/c= چG4"mԢ˰Yzb%<ؒ޸T~i\#Md09 y    A+)5])3X%. (HK j ^  cs2 /  %" UtAz#4|-bXޖ<>Oi HiI/oicz]/[2$6r . XwHM9f\$Lqv((/q?}\;! ۲"κlȅ_-㾵W&D<ГW˵~l͊GѴy,ǁÝ̭_ˬ O[Qÿ/ ޭⷩ鯯пÙzx:ʷIjm߷Tcb٭k' àw W磤Q \ ieP GR N  E &o8-/^3@8 4!+>#f> &IA'+H)'D'oD1}L:RS@SW$F\MhDYfe1Zv'ZW+^)/^a'FS*>R@/=U+,{Q3Z2WXM'I1(sG g;_51 #"6 '!%pCD l 2@z7 MP <4  !) 'x*U*i"f%S4*E6oK65UK/C'@)(>-:\/:2<6A;QF=sK|?CTWEVUDtZGdSyfXW*`RWJK=-8(@.j3 $1!X7'<.:.iGA?@l9170y52 Xgq  g  ?   : IuK|l  nB dWC% Bw%)*E) " 4u ([(N)$/+'1?%&r&(2 u  {,  ) B& # 9 v@1>i#y %0![ l% 1 #MiZI P;tI xak 2]A)1,O_U[ P%}Bac?m  %7 =.J/  JvTpA^BR4Nڿi1ܼ¼/M>#`ɾE~h~ݻLĠ۶ǯ鿍:!˴T7)'q|ӳ h[>̽R®(@âe 7IJћȗ/̳᫩S|YaΨE|SM9_>}ձ-ACڪgs<ڰSܵ*->)Kz pե ;7ݼCFݬ-꣤o Zlʅܯ\Ν)EtP0֝FUԘ5(G4   i""i`"a"#A0c+}:40'b-8$(.%F+2$)$&#!!=*+f133]54A6B,.m0"+#(d(0 (W""1'>"'G* : mY Od ?c6K!u -,X> V  6 B@)e`]/AX1cEyڂZ U܍ J]cj Z5r3pp> }6J@ Xj{Sݐ4  (e4 B;^wpi^Hߢ{3tAoV,lڍۏn`j$ڃˀoRГ]M~ԩ˄} ۧZΰEVӺbNd!ʓg-4ƉJȼ2PǪש&g:2(]ґҙ֪ƫν T]f嫛$<Ϸş*^ME{J@(G!r0x|ƭO^Gڟt- Xz̮sѴڂK 7ّFhL\ 2`"+ -,!V $o (w (N15)<(i8U3B?Q<PADUFXDF3=~/1873q833-(&!" #='*}0,.u#x$c/+*% ,IP"_'( !1 # r"1 )-!0(z !*> E  XZY%{ 5n, )t&1319',,+++!.2(1e$/9 'n;+3h)g41o.1^(n,v0 0/.'!)S R7t1/6)4:H:?>646+(pc u EIkV $@9$'?$lusB tk !?Ss ?. l$&naNl~9 F] ; P0  dv`> Z# l!('T7/?''"R(  5#m2a&+K t h 7*dT1 =3!<^B@G'5$OoF|*As"eDr`~Pj)AH^Fm?I3/nyQpRV)O+'I%7 2U  " ~Nf"# 1*i)W"&I(2 2lj3 :h%)BGQ>8>L"H#wL#Kh)LV&:E {=@+4J'4tT&EO.EJ1I 4(5+3+#'6,-*-#'.%,&/"+<E.:hKp   8n   &" #'" %)-.4o%-]Z =0!gf  i4'?1 n V o)+v10!03(%  ?Aq RU "uc)A+#+"~' *"5+=0F 97r,v- #4&C+o\$ <8E'l<&7)>63=Q8:3A01s-@H37J/"N~#0 b| ()}2 t`7%D_D9?]Hƕm:9Ў޵ۜӹԏҖҀZpߤ"0 ӆIܾ)F[?݈*/ o _9*& Y'  %)i%CM)s595&., T*0=3 .-w)"(bx#k[FL $B 7/3+D-% &z3 #{+T,%7&4&6%4=("OH" + |")-34I797Y+)J!*!!c#L V]' ljt5Ed e(0@ f} ^PLT h$*Tm٫2n $Ү湅ĵ+M.Ȯ}$?s'˫㿀?/ۥrIϾSĈlѢ>]6rd ع ez )vL</4 6Fx!$#N#2$Qc.y.' = ^uL/Te Hsx$x2NrȬ/58ȶ9dA (u~۩ձBƺJZłéЦһhU5BB sۊGLܺTC X@Z&$|%#?"J0j[  2bRQU ^< 5 C m  ݑϤEKW|f?O6k^5ehUPfX6a_#  d 7[[Nwt&VԕA QلӀkǛ'*ȰZηJ)cӍ˿QҿžؔǔϾvjͯt1ՅÿXМԬ-e{&+V& c!pt$&%*h$y%@ VRD>3 9T*).I'&%m%CP Z'*( B C}?2j*F 8>5J:_ /j ]$<"O (V+&M& nW_N;1L5XZ9ٻſQbEAMͦpX/ٻȿ6<Ɲɺƌ=Cɪ+\l6bjG{66.vֿ< @Pp s!DL1<%Y".F -%42.(N"QvݓݼZ٨ چ؞ڣ׈4ظ1ٔ1Otz&ɖee| Q"J;+7XD?B"2=6=Jb _1\g&<[z9`D8jO>gOqZ$zc,jTts"zagsf[Z[IUdr]o c(j^V^CcAm=Gl8I^"EQQCS:L`VYKQL?]eG\7IO.BB3631(O9-A;<A8D8D6?5?@;8C*T*>Z"+%#./76z=l:Bl6C.?*<*=++0>*m<"1') X,#2&93"B@"FYk<  5 C `%E!"=&[%.#t-DTe2lmC4   GJ +O@} r%+=%"@+z;)1 |&:  .!5g='uDY4<61z53;=8-A>C;<22=Q:`DbABA>A?CBMMT*WTH[HR?J;9(G*6,I?U8?uX2L|0}G/ZE)jBT+E'ZA %9$2-&436+00874=#2(-+$ c ,)8+:+<,@}.YH4R2P4K=fI<@D7A&d:C<(K/*Mn?4~"<6J2dA!  #0yl %BLݢ٫=\(*qƲ&ЫϭZUƒ+zK˘6п&qjnAY٥!ս W}nԙj?{YϧwZc1_}A^: @ͭeطD0d#Q²j)؞2`S`þqőɓҶ]:a:Sӿw4Z'ΧʗID˲'SortY&V}iNpFJi=t!3S!*l-_fۜC5l BѳЕZ#m+ڞ75 }8۝#B-f_4%OA> GЛ5cܗnKx E{ <a8:@W y=$7Ј ӡPƞ˵$n#\/Dz՚ $kUɛOK߳K;b6NG=_{yӣ{'ط3ͽI]c}uŹe-dx܁.&bشڍ C bp]k(+NF V LxL *gs O+ &ZA pysquEgOiXfp0I¬+ђEs!QsJSЛEyޟԸrOlȏh8ՎC0A?ڲmH-P8d* }ݥ ԍlC)NUQ|Gܒ¬z:XFN}H ̬4_Ga\پa?Rk©%,j_t̥շGʷһOׂ=QBpƧE ܴ.שŨ'%ץ֪פ m既و&; [õäOtNψ#{HNߙhຒӔnGMs;Z3tM4}0צTW@߭ ɗoUUwN۴Еlϥ˾֥HXXJvջ/=g|ݰvŠ2]ʕ Έǁą̀$]7Ϻľ±)fv~d8ɵ9FAZ-֨*"CŲq0Ҽ)>7ŕv[ JDDw濍]½ծߠEt־mC zA˻۰.fשL7eͻ6ϻ_DjR ƚ)NnJc3N(,ħD]Ҹ󺭷oA߶lI|܌>{ fu醜T@mxNz!Cֽ'`jآ0q8A)Ϗ֮yeIЃvظ<@ceñP=1y3pج;.VѢגZ\ 63·Ik"as  8 ur! +%5#4X5.t;'P#P &!"0U4q@*֠g`u7?zi@ՎfWry@Μ #6|2/ܚ^ޤګr0̅1ʿNyͺPT? 8CǛ]*o˜L+ut u(rm97@ο0߀x_۷đCf[p1]в_ܽڭn4Fq窌񷭳(_lAгT8čMEΣwً.eEψ':QUS ^'loQi#dz0j2n@r g״*3~G!S[Eß%#Gݘу߾8~@0a iBŋ=Kx:R rRK 3tN+:! 3jyoO s%h lw zPO!Jt0g'>N U0.s7?Z(r@%F{Q Y PG6& ^"R !|1 IaP('-@ 504~[v]Pܭ7TWlӚ[ʉ#I<:6јZ˼˂TaēGwƬſv_, \`7%AԽWĦiѸ΢r#:z)isfT5>ȋ>׵h\NȲg28a`TOɴ̦D *~$' ) 2 25;3}X=)p8,g5*9s&A#1N=/;WuBXM WvK2Rp?F-0/E,0+`1N+wE;SDM+>B8;5<7IWA>6*#3&7 )4&S3&( E# #Q"#"33u-0_'wM |  S)8&409<.Y5.(,3!5(_:% 9!9{,E*zF^(XD4I._BcI8%?*"E'A/C /X?"42q?w<~FN2?6CA0;(08:48r1R,*308/:)CW.P>d-;(!"1)#bbk# gll eN KnW|VLܘtIߘ!dfT\7&B܇ѡW ,XF ]&ntKV::ad` O{  %܇:G4:k]ra)*m.I?ՐܤՁ9$'3Յ&Y؆'gڄͰ؝ҢѣŬȚ%Ѥ}ǻϮN8Т, FH Čڭ۳ ຍӿWXǽٶu l7tRC1(ܸ^Bd֒4 ( xl!]& = 0 9R J)! -v&2*1"1$/8 E-7v,@/6+*$(%l;)?Ud> G <; :;;4w6HgCZOUO2KRGLlJVS`fskgaOjEH>)ZRreqbri|fme,WzPJ@jJ|9qB.ZD*>C(4g!=U-UC\J-^yD\Q/;15@_-"U&)<2*F+7^" $V '2W lqK6qn@Nk%H\gA|~H a$D$$&!,'>7bO5K.$@."/0A8K5L=0EZ)9*~3(/>,)"0!5, &q= 5XAcD-j۰$ZBQ^YџqʾYȺ*`[3zF3ӂأm߅ɺ߾Аs^Gj܆{ksPݑyڼEߣ0\K1fcAՓړvMe׾B(އ 7<:Jgpf2~& k  /nlJ$#0*@eQ"8c d ( )0 E.Y <D 1@ 9&5+@;5s4j.).!%HrI!jL Gv%-k!*7') !(m%:. .44t44.A1+E1%07y2G<75@8?098nAKS*D7P8'G/[.47 1( ' 6  pBg!"!F 7EO  < n = _ / n m "-h' j))% y!Gu6XB  J  ? /x '+Vv$ $5V|'dZ S  DUI D*,)2Z127*0 ?&q>m0 #^!#7%)(`',*m(+(' ?$ E O? z E s ZKuJ=IbAGO24+c$ɏ7'9{C0ӤDOBcҶiےjuG:Ƙջ|=ȨсSڪhՠTѾmRΫ}uڙeOWǰ<,N| ҥUbqbIi* f ' &: | ~ j@lNfn C ?^5Eoߛ OfJv2<5AQRȰ$ j2`yFieT3X9mо-xʎʽBƽXǃǡ>GSޚ/sY:4P yKh "7QA# Ya!Z(8(&!")`'(B..ql$ ^T5w TA;\mw^Z   O} AH E5ؽޛ! /֎ԒUѕw,ʬ&^+QN@lݡͼw$̹.DQt(]]oʼ ,^yoͭMufgn! *  X'| Em  m6!l os ,'H~ocj Wr (tRt/ǡvӔwګ̈yy'6ݵiIV4G4񰞽nZ„Ѧ p!fIE4zÓq-w̟2#ެ8LΙ`Ӣ>[h'l4:}hʥܿˆh ɫzCuDT؃@ͲՃ8BDИͦ <\Ubԟ ^z%vѿm8 U9߬6?̱y%%5 +hDa U#kV*!J!.b3c*_!A*  '4#(.'+-21;(H5x k " n ( $10+(. /r/B #g>@! 8mЇCɚ 'ZVNlӋpK4QQPڮOZ0oNa1ul3 u >{,d}By%2)L,* 4*j) !  X hZ GF. ]iuA],iI)*ҟlѭ=ܗʋʠגʕǫ0-ɠ|48ٓBӶQ~DbCIH#x$m ݲV$g|D [_H  *## (P$# %a+$N1"/ &'$K,P..4|$.'1(9+_#UY#(&.-%V+!%,+#~  #f! eCn,X19uDH*7'Xr,liqY#:^ˌ ΅^qoڷHzg>—RZјǏ9חd4:0M(^Jm K Np zXj Zb-;T .3_K%٥|JZw\L=TA ^EY6AVE27n,<4\E=CS7=.+F3VQ= MC?B<%@ ?J@?54x0P-S=x5+G;>/ICOPfT~[OZiGQAG@>F;O.@sNXAJBAKJFWKZ9z>X.-4 +C1xG/nE+:$b0!v3-78h260 /`;(-<1%o  o' a@ެ޷ XIU(bb;Trs? !\{s%: G,  "As%*zk Q >X $ (Q1F =Bk:SJ?ٚn׸Y֖&̣P*˒I6?ң :6~9\PHع7ڻ^ؠ4г`)Rpĺ%Ṹ.1ۥ֌@af-VK[7k}<ڈFڋܷٽ.LvɰۮDހez&μ,ts4" &l'v+( &(Cc+1]./3 (n!#`L(SxSA# WV   / K+  c2NDN F0Poh$}Ѳҥ{^FDTkޑ5D   P= eej#,T%g&;(?AC1,27  k#$ ) ]/):D42h)$>:6{`FAY)\#1*!yC&,'c#+ 2.<P8N+7RA$I$B,5$92}K4S>'HKp F!^IM 8IF#VH+K+*$KA+O2Wp5Z!4X;]@Z`:Y8Rg8H&[/F +1+7Ei 3qT S *  s>^CmQ$ -3}2j*D w#f'%,u?4v\1E/H8}@F#VC'Z>+4'. 2+:":A-0D 8bBn:5/b# *;770<7E>;k<;/0#$l! !s)c3>LqHWArNc.9!/%5 1Am4[F.B$9r"V3d)2x+.)5*F hP /#}:=YxwHU~Ƽժ#ƍ ի׫ζҐʹzf;U8$a(77_2S |  +%i>8b@@(*OY!V1-=<[:M:?0|,16)=25cB ?>>::B+}(*[# @0'u(R )?` 4ycP 6 rT OS! . :# 1TvzF0  dbzy> C``No!{ v 4 F)* ,~ #} 4  8a:!   $yIlO$?)["c Sg T   [p Y/` I ^S,|) !+m"1w&`8)?8.@+3]$5($I+ *$!a 6*k9A ;_$;)@5@7(.9'4.);Y-%1)/)8558)1E' 2%0 %/x27EELK4MMUV\5[SQcG^D,8@*5=9:>>B=6JBOZ;Z0)MxA>56%G;>_Cg=]89U=6S1T],U+Z+\&T(P)L=T:)Q2'`&V#AP4Y@?CZs4 GY'761 E)d$q*2p52$/&(G_ r $s*4; g 'd8J g9,{c?~Ut4dG=fo;pxv؋i3 ޕbژ?;߻0e"ܝ[Pʚu:bܕ=FQ,ݨUso Dk` nO   / B "  VuzTZwDrEMv= ۚΒa-#tExcd-##,?ebJS {+ 5^ gkbUU!  so4/'7\1|,-x+$%14+4#,3,'&"% :] ! -0:k7v:}PM֘Ȫa*َCFU ֒k=Ȳߕ^@َගΏßҥ|]ƺyU [;(In&W΂˨εϏѐ˂Ӂgѹoɾ({?:ޮmvOF~" pE  o M ' _~"0]/>o@;D-ʨiȒ3ۻ̮^EԢHֺ'1(ɹ Xݾ~Zͱ妢pYۇķ ONĔK2Ĭ#:3ȇpwZ{0r̡Phzڿ{DɫJ&fդfKQdDɯԥޚ1Ӯk}6-%i^ ʷxcvýJ[@t؏Ȣuxګp6 V02, /ɮ9˝a3c߭۠Ο՗6A0LF,.|ڣ$U/M8Q4]XU &n>~ҿDV.ٔϔ;|ȁմ~TwۮxzĀf0݈==F٩DI͚܌^USU( R~ 0 ZFsh nm1 l1jWmЂu` yi`͆vuqFز׈#XHC"O$ŀÛs%"zɿJ4ΦԶO07ط޸YJ!IKnfI2* 7TAZ  #~c{\[b ڱx_}OX9kȴ.f̔؟jՈ) :jFtIب( !$ bW+'>f!D"&'U4 4E@=F*9 =(,9_;!M67.O0J$4%.0m']0"<+C]/?'7* ,$V)9 ;J-B+2 2jL;L J3!% -l`3Pb>#)H`8DB4:3#<2 9s$4)K"QR/$K0#A5(KWf<1 a Xu {J %7(6+08'$ #G%r,w 7 !<2:D:r=?FCG82E-O8WFAI>>7l.b80>72<2?$6QL\Z]QT)@0B27_730 81UKEXUIKZI.>* T*(07*Q7!*q<+ ^ uI*-.2+V,10/4,2 & 1154;9(44&"' ' )))\/+.I,&L"-% C:MI:@65+ s&(2f(;7B-#!C7.;0iq  ( T P#K  y #% J R $'* $ 9q q D#"t@OC>7T$kqvz-}z4< tSR QVC1\rY7!>a |/,JzڗmGٮWԳЦڠuT.?W\ nyڱ2Scznw!K=~Oސh˿ݮza_ڭvií'XJÈ;/؁2\cȜغZtYĪ÷N5r*3Ͻ/?ę+)φѿ{@$p:3$S]" Vm,-|V "^\ @Qdt~0>A_U0_T e? `;? Jg#0[(2%x;>M J%֮ޚCnڕS(bZX R%V%4K$"z#ed @% (&2OT I  j PSeG Ac }O<&   z"*L",_ a GG-/>y v({U8Bl43shJJS6u̕<ǿ{U٤T3ّ]8Ԣ|ϱS!rѾ3!g(Րm(n o_S]f巆4<κ/˪aX>&oӁ Jzt&2!3-t^ @, .m M6go }z r$ !4=m܉&ք2XuGorŭ54W,qې/2KIYnYmdr?tcksٲ33UBQZX*7Ejȴ͝Hd{dM*'et^Ec }@ P8 ~ %1% f  @v 21%6 [\LEآMx "D0,]+W}s>OPQ"7"ߎwA!%he۾)mT^ys) |2eƌw̄6ѬОƴUYp #ٞ"p ގٳɏ'˙ХȜk̍Àᾣ͢ O˖d)uˉ Qch+4Ф$З:gD<-zɹc1-Ƕ NE“Ř(,V[Vِjވ1ͺѐތ,ˆſٿ߸ʃjf+6 {s:*߹2؍ @УQuސ<շyϢ*׺7a0ӹҴ_bV90 ցwv!؝mJlߌԻ[&f2<҈XqU RYvezS'W,3QXޗ@Ӗͱݼ% ٍ#ԟfلUDHvVhV# oh1 0/ -|=9!*t*=,lJ\SajEM 'c"/ ${a3! P# "r* Z ok! G.oS.2D \1kL!'-r=#^_c;k?߿U?MS6bb3: B  I[+u+YݡRjx[hAZ F(DB n-JX  V+:0>:ޕACxaA݊X1kǽ-qI2Q׍rʮ$@ߒڬBܤءqy0F sh?2` !@ J@>1 i>@,})ߡjƀ*оҵt,y澭^цĝӽƵ;ЇOyƓÉ_6F̦4ς&ҥآ~;ȇHhKL:*ԷUnѯmĜý4~ճ֡w5ӹC Ϊȓפϼր)ϜvnvĬ6Аlɂsƃޣ'v 0R!؇0 3 -CB lVPr_ JW}`/J%XzW׀c>;%F9z2 W/_HK?xE  t,xag3~Xbu3  Y73 H_ T9/+ih-7c  `}-M*11X,3g' m!4%/u! ,[%'f,h\<$"cG#o~t ` Q 6!!rZkC h0|eW!!.%,$&'F)(+& +N)3+h8&/ 3(\ ,*a$(6*#",; 7e+A8L8y/6O-=,OAx`WbW"]JS.(@/@c+?;l60(_&ON(M#(' '$Mzo z  x 7 V:bP\KDZs9S fjB $lHS "4&=itbH mB # }9&L 0W@%i=BLzaZٿv{pHҿS'Ⱦſwş]B@+þaϷ|ӭ˶(ʸϢqˋϢ㼿˽ͤhswNZՐ߷5۷p_ Y ܉&cCZ'+iЩ;yf' LuO܈ۙҤu)ILFrմi#ΧΫ32׌Su+ϢD Й'ό/b.ՌɢbdmTܳЀe̺MʷWʼ#žӁнipם/u@ҡ5D͆%+Xڳ̖e-77<2;yܳ_ٙY8W;_ +)е\A) ?xHٝ j5#%1jiv!}#+1,4,980fE%z/z \/'9 1i=W5FfMw; B'$I("_7,A$,>"G9"7?*:6M?B8p5+R*M& "=))Z*/  6NY?v_eܖo;- _ l >@ 3P V $Y%c-+>'5/:H=*G$"s)/?4vC>?>;B)332,7/G4v(/8\4`8%3=4MOGABJDK ίq2ADΟt(ck.Cx9c؀̂1pjgОU@b|̔؟r%݊VրW٨Y#ܯߝK؏ۡϸǧʢ˄ Gj/Tz~)>z̠ٹ1 ݖv[ߗηaܸigt=ԏrb2ݰzfӔ߂}Yma70ӻխGOn&-|UMJ6<-1> T 9`+24" C]:Xb#$ L&)?"{3$%$9(;%z:S!= 3-;5;528[72|*4a460@%p'y$.;#0RhbQt hV #v :?`8V, j{uO5  #T!y..-,( k 5H' ,w:X@B;=71h3 (3* Un!-i+h)*[p r',g,2"!I!%[,~%,26b849G*E4=J(["#V&'&z1'7+9j"7Y 3-=BT+EnXD=T1I&;9 (O5/1ADM[PBV1Go03Gp9M4K36C ,0h-?@'F2~,"8!"/(97- :-6'-w<%M3#(.,;e?5:+37$J1$&.^-1y/x)O/{'("N $q cN LmU \ '}!%`8'/!YP)t 1 J=4' G68+)!h 5\$16.u"p  6UG#+& @$yu)L*;5b7 6o1p744S8-4#(!D %8#,-5:C9AZ+0 g&P ""*/f"x!,5*#zr  l%x  xl:)OfpK&dʭ״ٚw_z\gȋњӑVަ4HۗQ>}ۈݑ9\F: W[8 !Mg^ '^a:f \ DT* x j  r buB .H~ um ӸW$t\ޭ ɢ҂zM@נƒ8Q"è%ʒ3·5 𯫵/g¹PL0s@iѮѤ@Үgv kĶu1nƧƜC!ɺǀMįƙ-C̈́s"&9'x) 5;ζKȯݽޖ}Q1ܭ<ٺħ܀Toķb5_m>9{CCq\i  V?߃~12tC.MT3گs&ڟ{pR"ԍWٷ^Ё;ТnI`/qQD @HaA G z?Xj0Ծ5)h\HH&ыwsd|^_[z!"-4$"j gG*,CDy i ['9./@.%E+ GO # ,!QqU%o_ (`!`:d?*e*Q]|UBs lMb ~!m iH %}0` P  L 7X+) %z<[" (+d))/&+v !z!*#  Cio!S* 0 &.#(K|^$ Y*QOۦh1 pL=<7UryϿ}Zi)[, l<9ݵ޼vh+0σغm%$׿Cd_zhŐoRf޷"&yW` jIف֧ڊM3K+ށhfY.Fۈ>|SSm Ѣ^3,b֘(dã KS/ЛBQh'[ͅ]l%F z®I=EI pI̍khCA5*1fvǣ^B |yŋ  MLE^h?iKI謇׵AbƱOܟ۩wpZǏrCڲ-ѳǔJ(ÞbϵhWi CvP-Ė8jWϼͼâČǰ̱Í`hɹ†!6ĄĶΗ̿Jٴ=#<.̨>֜P%]] Rami} l%bVx!a b GF/HQva   la V }2s 7  Joٵ IF   #3K#=!r% NOO)/**$'~  (u@#0I=Dy;xBH=JGG:(>%!@9RM=`PYX.P0PWKEB80=&5A4<&=*r7E 8G"\B3=l1m50I.2+-)T!$# ($-" 3-873,% ]FC fq#%E%n'Z$)Z  >,q,/t*""OhzR  x8)b`$JM~ m  qyܡsץֆօw"q{6"2ִ"HsDNډ: #ÌŧCɕamO3ݕܲ׬PS˟b׵l$OӦUsTݨr&݋ڂdP TXԘ_%$¡Ȕ6RqNmnr?^ϯ؍1śEVfXƘ8ҖfOhW!ȀIJ~ BJ<ӟPիI@ARCYsC݄+؍ٜ)9K~9C>ΩUЊYpӂʷ-џ@N ΒJ{ԡ[A=4ڹ)z~J1F^ MՖF}wmi^If߸*ʑNܼSA'kqȬ&Ʌ轐L97qy.@w8 }"{$h ?vAϢPң `B ^ KR, 9G }i+ ux +, fZG8 ) %(|8.P v/5 %"(.5j5D;X)]LL'GQ i!+-CJ7I H,B/6=5+' rfp"m)*,}#r}M &!) %#-M!(/,|-,88IT;B)-(-638F>?KRFK%DH%KUyLNULKdRw`GZNOQ81=V=3GH'J@LZ)SZ UH.?R94~/U/&7e(F?3g5 0#!&jzNd M @&& 2-+)7<"?CcA@1)O y-Y%CY)4*+" 61`9.B}%2j)'&(2U8)- /w&%9 ' D"/OLx .#,#m( $)5 hEe0#0/.,)(}!% w *&!\]!#2q y P|  w }@##7׶'#ALjO ގZ z6|V^i /ٳ'i\y "(G!A#Gu \ %7BLNOH1C 1T "܅,U;Ϗl\gV]Տܞb@Jj @RJ@2Ӈ-uh|̤й؞ĵپ%)KDze8װʳfRµ ߱i& ij@"r0cl@k!8%j)Щ٭yX[ϵ*G$"ۺĴy͍هF}'nݮ" 2"W4 hA6c y !^7's/C/95/#.(={8@_?A[Jx@M<-EHQ SYSJTCRSGRO14;-7s2=*1+-&Z:/,A5e;b. 0Y!-9 /4,:l3G@P;@A9e=,G6N>E0<])L.t@$?00$8/9T,`G ?LFBb5@29+Z*&7 nF+*.t.,"@ ;u&|huF* R1{!Hv+b *" !\)g.7?s*5*@=+)2H/F,$"? af Y Rt |# %Y `## 7! "TN   ? q 70(6-"!' b%6(+i0(4&?<0/Y,~ }pw#u-Y z  f [ |DPw {9_P9  z3%S P@V Gi8C/6 $&A)# :.V1&. ) QD  R71 f 0oE  /@" [D ~tq7\GJt8 )oj_'eoQlo#&P(NK %M(.1.z`.< a+#(1 62/z1jqjlH  {# 2 {8)9/1/%$(]).*/)#9E)3A}*F8.:I48#'#+8f346;35I) (5@'P9M4H1iI6>B -z@C%G&Q-4\N<`*GSp܂ΆGȼ̝q…Ɨ’9uXȧȅM ˘{tS=߭߫UVxNݳEȐ>oF܂t0h!76{ &@ JߟKk+mEb|֍;8 K ZJ <M &*!.#A*N6V$U-J^PL_SPjYKwE,0O51oyYu`cRpq`f@SbIhRoqTaqaAgqNXaWD"dM^MVFWzFYA-^}=Y&5O0G3?1?r6A~>8.6*K#9$UoT# =lgd = W <`S Y+#9#.$0:'2&"p*T"&]-)(+16,n5^,0`1Ee+M%(149%8L=5W@*9_)M >&]&8/8(O&(%&*$* 1'7*324;:F2:,-01,1,*%(I(+)46!m-Q/Y-L2;3X!W$!o C'!=%!# %j, JcA^eS5  Q W8I"^R4U vvnesYҺ͌dg6e5]xO'Jƪxfܐ-ۂ0Ɖíޯl Ymj_ :wpzfxJ?Ѣͩ󺯱{ Rwb#$D췌,߾Aݺ4M?BSҦ~øKʝٍ±x$6kzanޘmr7S*ڳS!K͂Wɤиuӫ[ݣp"&*C@Jh8nh /N8ӧٖ ʪӁ%JgB]=(֎՜!F>LjX0v`9L0Gp} /C O].k' t!#3(%r(F /*n6f{3Y0m#I 86  6;JB6\ݩaV =ӬkثUFs h(&< &m4FpZ/T.q$0( q *3U4Q94 G$p L%Q %)1 R);+ C #%#<)Gc%&!V&*#,(W? x0$4.e/9'(Q%%`#'*"Z/y!+$+>%$/ }(f =3Q-Bk15A>zKAI.9=f7rC5J+DA/K5bQ9tMCyPI"QCHi@M6;Mq)>L1Y>6=97578Z..U11<^=<<><>J4Jc?=;2*0|',y+3"72& $Xn?c( )H,71!%}{ oE܁·gռ8aHtG|f}%S ow ) T.r+. 'm 3p3  -W-#p'h!$@H  0J <\ Q$y{i&|sY]FǟtܰIؼΟ!sS,.ʈsaz .{ȓ(ƅRN/3޿կOҏeǽQ.=Ի5ΣTڶζf L1b.OQ& Z?ٕ|hoؗ:#3j9ֱü%ӦV`ޭ3OǏ5k] H^ru^wEpψԿ1L UӱҭȐžܹc¶NuѵƶCqaʹ ðz¸{û^ScLп ԙ'ۿ侮"̐/N[>&ʼn]6 0F6č2ˆɇĵjӱG݅;`b#s.ۧތ[ֺ҆[ՃkMH5ؐ JOn>^. x %S^b% m@)&,<;9(C12 %!( !83>P3f7$b8 '6*,"1 ),#] v%o 1)F,I%*K` 7HZ]aG I5 5wv5p (* EET+ٷBx!{nE݊zO1) XQ8 { ea@$}#&z&$!W! a   9 qH"0 ` Su '% $Y J  ] 1#ZD3Z  ) N#IS ? d?8VU  j^#()u[m] OQ\%,>r,<6"D,808A=9>0#5['e*29>I69CC?6"A0;>$w+'.N-o7/bA,B1mE4A.763;08#u(!x*"-3%;1 F/6A~=H[EHADUKWI!E0 H3V HNED?O=17,73=nCCjMED=55-,3.j::|GQ;'AL3,9*,pH?NMBJQ*4Q2]Ao?Ks/5*1~ * U C~4# . > + P   p S=q5 4%x//;x\<N^) :  hZ m&>2*!C88-7/nk NJ A_Q*#k8-2#&bt 0`/s\> ykw $&:SR,J-*1*, l%-l32:Eu7CX!& ,{*sD(3M@]U =H;jBM%T(EF?0:5A83*?CaF>D3=>;NB8:."5qQPs0dcGYD)?.3t%\4!?:#9OQ([+W%N%#kD X9h4p*1(8(% D+E !QfKpoQN x q   @ւfΆʳܲԟ%37ۆove9gBi̯ wdkZTt tNe%X 5  L,7$XbOC pFpTߧEު`΃\+cA+ڍUܞ@Ni߸ٜ߰rhC@NrhlToڱi|{c,Yz3%]YOzg{8)ܫҡӻM @ؘjxHrrkSQuvW78K| ]'O&6_%5(+]o29'F&9+4AM<O_"8-,#7 -fCC2J1G)63k;@#M :P7HU'AE( 5-?1'O4<1@:/?C@2;B%=sB3*>7z=2`+809b757=7F->* 9.>rFDHCM0.)s4'3+r#%*,]2H87@@+H :@7)/ EMm; r[" v]&)A65 J+*H+`-(,#M$.(<-0M6%;)@/=.D53N5N/N!2Mk8IQ97TB[G[E]4I_KK5S6 =%K;NAQBUCZ)Gh\RHQ'@ ;-5,D>5>\7 A|>6='q6 3&l",k(.&<(7B8C>eB)3 /(!u $#M&"'!o+&+&/%Js$!8/kBQx qD:!$m+a*>X 2z)['LxW  T )~,/-92b>B5y0' 't :.YAm6lD.A "x  r{z #d z#7 e & j R/ y ? x7i fQ% l^^ ,"659&81!4-M!X%U&' $!)1 "kP7 Up-M+YC( {-ۆד7.KȻLYzOVa9ɺa&̰"4N娦K)񿴼QĿWZ@Adq׮ݳ]ǁɓoH,ȫ\یנQϗɱsÅ@$p*ffiPˠY̢qޚהդ.CɷYѴĤ Ӂ~^ƌlŲa!]iR=g[^f/?YF< BflP3̫ΡuJ{Կ{ˈ=¤ؿ2߾8Y@1҅D,'ve`ˈq\"\;&Ű$ǘMÛ:%quJ>(҅WcԨi Om;Nֲ[֬fsA+I,.rތq|-b믌䞇 BhQ5YJ>YЂX$>4ɧf]g|kU &ݼ<эFŢrRG}.}ׂaҤt{_oսHL$fG˟ݸX˩ G\Lr`7&ο.ْ<2NO>Qo S5%k) / 2e -8 462F%G'! 9" ( !D )'6!S'Y?rM} :; pg | u3H# ' HQL nn %h N "L > f>or#+ 0).,! -9<_Y U (a -rt a= s&s%3016 _ ^?'L v%q"'<" (P%c C  &2-sw|7@8 B  ! y b ir!/ 't > ?M  =:* = >~T ) Z $e9C "$O.k-( '## v#J -.%(g&,O(/1S%8) E=vME=Q7r84.0D%+(Z/_)\/(0 +LE# '(iN#q, AD V a . B&" wk8&%)p .QW_'J ej+> Z lj  HE/v ׹. =bܧܻylet.#ذĈVƦoQ 1+F f3 d  N2$4"X   ) l # 2X Hkl'sF d f( 5+S%M 1'#0L/2)-y)A!m +'5EXyFpTLv ߾7):чW9Q߻;8Cڬg[>'փ" /Uh;;bC؟۪q8QD-E)|DTԧv !'CΨKȇE2G02J D4?FqRjBD vֶdߴ0PJVJyx6O{+ӢS*ӌϷzY64M`<'mfw[c'yjޤuK FuQe 4ytMq50 1aw blf  n^v8'pfdZ݂ݘHަwn7ٿm܎HY&ԸμBTM.߱ԅ*܇`G=ަjbѨ{jy[c!0xaݱەCؔ߿% r vb]QE di9* 'fn ~ u%$&# "|#*g&D}Ym  j S"%<.& U |"pS+ 8 n9I d$7xZ qh S$&k p  t*#5n,:S+J6V:$.  CtK. "A[ #(a*|.">r'#T  !2 GX`) i}&W%W6f)t<[T%I RUΠwӜ-gم?ի(;̧Ǣ/ϣʃ |:Yä e68Ԙ1${na0JȝitǪB~hܟIj!]Py A_SYȎάO$Ȓ˵AĹHm82ctiӾD$u ԈzeS (.<,0>B7 :)5B=)@+0! (K-K!/z"!9'8%y.[$)^8/ ?t7PwB M<#;$-I:)50!u&["2u39; @FXI7H43$&"b%$!],) ,~ *v01&#\ (x@": ?%"lv fCC.6j =" qL !|Ӯ- ֦SS͌ΞiKl ĉ!Ɵo5̦2\rٺӰرu°<ƺPƝfA\k %Ӌ)A=sxH#1TױҌ׵ܰ0>yȞUBC!)X_pq9)x`efK4mCW3z7ޙֿ{ķ_;լ}pn3ߑq )†%jٷ̺۳Q7V U#FȷۨT2ڏ֠OB҄ԝNhOW^ögA. b lP޺~b TazpsХӞ>Κ>o0Z~hvi2 ^F| $ "#o 8 X pg[\| pA v)<%'5 Z -A(Z '>/| QO %Qi eF&Gu+>O`d4iDo'! iQ(Qx \E$F. sɚE 'Ll1 @|kA$ax -@{=[;!;Ӕ( Z&ҕ vӱȵ~MUe̿ȸ!Eٸپ{hiչP^͙ޥDE|Sܩs.!(X8"ɹ/^[Q ¨ϳٱ(õuCѝƨϹHkOPM#Ѫ9ʏCUơWˡJؤ{N"G𹬨|g,ܣ|  :)Qyf >Ь'ƺ$ƄÄ$\b^Y4˝ݵe/ F}ǽU6ė؍_=y΂\Tq˔HKĬ`۰qO9Dmջ|ۼD^UV+FګҩՈsװ_oο_= ڦ289X/ްUhhܙˍŽ Կk"I&61SیѫOT8l2> ܕyʖ'է=! 4f?(0IRxtwoYژmIJI"[iUa%Nr-Jlj qu ]  h  J*E0S@IO IDu_yC<" a'uwo% ZuNiJ= \i9 l?,4^1KۣԶFL˴E{̿nb?Sjiĺd~)vA;)ҡ ig˲2|ӇlӖͽeĻߛޤ_ 2~$E$ +/35z8A5 <> Ha=JcDR@4OJSCLT/%1,|: 0D;`P\AQ:H+.>!@8f6/3N5z/Bh1/Fn2HH/D+?l$S:^$$)D5323-P2CHmC=Br*(8 +*#u!a)`>K*x6a'(=d/I=:[J6;!#5@y=2&)"5>v)z81 #40uo }Tp%n %z    < H8 1d/| &xd \ uoT [$  &`#EW N zWћ:\lC e 8a_/p%d )/T$} b$nh6M؅x͡3gZgQ@w/ :؝n;+s  *@n/5 * *5#x*_  % ; ۋܮ}Q/߾- ܢ} TD oGzn= )8  ' &^ 1PGzia+JH"i1 !0# [ #){-< .9!(2 r +) .l-z7%(' + N_,'r!L4&"b3,$24$J+ "&?y!,(d Q+'/l(88#cV$@(l $ E 5  a+H/(=+i&/&$"7  @!$   &+m#-& J H"7%$*P)F8d ) 7$ e w * ~ oH*QG  Z OM@,kXi4WMo 4 T1'_e [o 1S A  6 -[x*U!}y rB7;{ uWI6wے'd~Ά?ʻvQاQ1$ݑ;teߍߜѤ $ 2%UPWWr] $ P 6<m$y%; w  9$*w" u.W j Esn100+*"0 !J PDm% OFGvP7Ԏ4aHT]U@0׮w$~*;HwV'W]* Xs"l_% ^brӯȹpQ`lֽtzgvΧѨ܄׿ĎT).o۴[wӕe{mY٨ĘS/ٸz̶ѿq)Lȷ @ܭWĒԺPeԝZ~ۚ|撺̟{W*O\uyV7!? Xrq\Q`C!fhM59eڶىrnVʩņˤ…)SOyҌmxЄ*_ȏxhծfKo;bƑêięU`'N7% c ˁ[ȾЀ%42!Q)>ι,ZFZwRq0Еֻ=b{(Ӫp%/qkm…m79[A/GmCj?;d[aa؉z\,Ҥ\ Yv8&e}ai`7@*w +! 6N  qiLc u W =w@ "} v E[-Mu-%3qyNܯސun=ߡC2;?w4C5n fT?k?K/ x w % "vvK   ^?";r=]V uaf}2 Tvk{8L4sh#"S 7ڹ rޓ ܞt3dp#)B c6 A /'bbQ)v3m6 >P/)$I)yK3Jv3@"Z'6b?ilLkOb852"R:i10?(;wGDDQQQXG4@?N:HEQ@zQ< T>Y4TS1>S7+P5,dR@)HE9R!>H4Q W(e/!*K 6 / 4).1'F "c N>>#22B5 @k)nm vށ@,۸1͘قE3ooё;jȴDZg/ʔ pل;.ԶYlJӀQݹEuYps'4 ix3Tgp' D&1i vei%7J$k&\7}Q5D/2I!D\G?r[J2P+G)B-tD2:H)P/G.oN1TO(J/L3JG&M8.=3B9&K:`Sm--N!B72&!x.4#A9H9I|5DT=QEAB3~2_3116.B1+S.E+ &'k;l?ABCEhA?F;dA0@Cn.K?'33 =93870=2962% >[,7P% v"n&6$m 3I .K * { ]"%#%''*3 2(V'+!oGG$I!V)Z8( 2G#\ A  Cn$U%3,^&6,E!=# m :VIs'#_Vn 9Ojc_N ۢN|X(xv! Z  Fi )F $cRX w$ S ( *+O':&2/:;;+0($*+ "D$ %%!-1k8%'-)%'Z (*~&g$f$'Wf O QUǰԇߎoՍXr%b7yީ#JބߜXM-|{!U ݾ`ICL}(vLJ`ÕfqeUܡٯG(Χ޻٘e0Eͽ Gf\jݨڄֺʅqލ6ջɀݗ9vmU*DHt§E/`ΖĻ]1ICEԺbvGef OG2?fyCo[ڲ~,X( Ҟ2ݯ7NHϮDMݲ|߱# 8ʢCUѸ֢ڇ lG٫+܁.Q>yԂ{Ӯ^߫B)u c_ c)i p )v\F\+-6NJ4^A? Iv j   C90|G -,`5$1to,ev%jpҀ+Ĩ|i]u v H~OoJ] T%3 J%+:("/&^s5#.*#of\ !'"&fY~5[ . '$%&I m("SR   Vt F-q;`O9!' W]ysAZ EL_[$# A>2s@ ۨh vDL>srge57܃ˌ߶&d{{ٚک|Z c@QI uaCzfmaq   E' #$& /*I(P(;- "+re3$+*  | 3T"I#("$-u&/-">"  #--Y?603+''T"H1 V%%2u*z7)38,7!3. /'<)%-t2O>k'h$\0:-60<,/_>y,8=F3TF!3$d5d""I(;C=CD:E?8&6H*%! s%8-EJ;tN;~L 99*S& e'a) ,*3k']2uAa%"Dg+k=,F5+7/@1>%? D&6]["TI|6 se3^M!wN- D"W ^6Ic" 5B)0K [  v' ,*K :&"TC (!: &, )&8+ H<CBU4%)L&4^"F5DT9N*:5/!02:8#SG'NY&H'>('c5&k#,+$6s? 8u&!0,: J/$6{8 #/ jEK! E Yq@Eqn 6  Tlvr Dqv z<%5D YS%~w/%+mޟ]r 4 v si _1H3 ^z ars OD .F'#+K  ^$"&c '*P0. 0QE-'%<'H)B'!L)#G,oj*)- _3,?S"H"#(^#$`%g#*/T,0/.96=Bi ,","9$ENK/ 8!* -/)7-1%OV H  Y2(C2D    x9 ^] J V#v&x !z)!3':A)2<=&7$w6[+ @1F1GE*6:)# (+E$E)3>6TEa=I4@'86"y.%+.:BCYK_WYB-;3,138?]EHOPIK65* !P0<,@3f6*-%(( !$V! 1,+w,'*'a( r W #!G  "7%A0;x$57'*C3>,s7%6N(6&R9"D4-NABA6(+n"$*'H&+":5=y=A+&O"y#G$.%% J3B 92&  L&,;N,82 ' ++7&#K(l?0G93I3QH@%<+)  ,(2/'"" C  yc%>2bL c < 5  FE'4lO) ~ru \A},".) !NN<gp c  uf+QH*9q QsN:G݉Ihٹ־s+I6GچDh,(q*v\ ivW|؍QݚʶQJij؜-֥ >xӔ/;c٠1 {lZۅer,?znT$!p` <.(b{F]&ܺ3_OUزyͬOXi{ߛ Ç®Լ=P7ծͿʻ¸5z%4]&;=EӝXbM nܫ@{羋j41B'ª˽ŘӥΦOEHԌoҗ,oPܯFݘqϐ<ʽ޷ֺ8FufՅʹ.~w[z۸]s| VW 6!-Y "w  cq *9 i  k. qXHC#o h Y # ~+o Fy)t HQ+m% ~2fC R 7e0>nW*)cn7܂п;?1 ۢӠz o.i.nʎ+^3SsL5"s ohiK 1` V %O?Ornr)M[[p1~}>`GCaB@ ܣzWKԇB]-ٻ m POVJ*Qns0 oD)MQ&#!q %vL"* Q"81jY) Q % 6ojiEnMeMTl܍IR4`3snH}yG?Cڄپžv^ƞ,Tͦ9ɴIkR͢iSfW(|Ol_`ju^޺.ˊzMms}/*cGյ! ʓ3Đ6?w߶NjbƓ}{bR%ɂ?ƑWI==vؒUj^ɴߗxHʥռ#ǚ B~,ܘӤ|Do%Iҥބ:K[:ˢwj͇څ0u%~N n4щpWֹcҌЫ8GEP~PΌ<޼Y}Пc=>ػ os7n`Ȕؙ`K̖їMſi{)A]ȰƤ[7JCdVZJ_޵{ҹTWڵIt(/}gbrۯ/^lz!s8`) (ڑѻ| _.vA M ( eT$f *|(~~#o`{B H@)څE(PݏC;NY~( 9l d"~He t] lj f $YO a w0Z GY*$*Q +Z$3R"h k`#*0G$!!  ("k,.E.U57C1>PL!6>,/%063@'=2?% (y"("#,+4)7D5]65S4 <<=g;P722-0..,)'&( )=/19~9BB:EAs4$;(3 <."&212z>::=4l,1$5*T5/@1B3d1~=E3DK/)7+'3/9S8B:77=9?v;K4U,D$ {)?#d6. >Q3<04'-xq+7+z!'%C$$95%#W#Y$ O!Z"(}e,&+64507510./x315.0e%'+u*y%*X&@=?A+.R'."0,48?;sFq.6R!.j&+0 "41^-1 99X1O ,s *j,'1n0.d3mg4p+ H"N_"K (*&7 #T ~@ b#X!,`/)V*>NJmk~ I)( '`7,GB07, --T*4*p)$!N _! '"$ &'"(z!X8 E!9:*a#\[E  g g P   1 ;  )"$B~^ C(.w+C EH _5 l :n <NuתJ+<2$PrV+ۨw /ߴzp6 % b  6Q )BX 0@::,U% ^a,  J e;w# eS Q$72 }! T K, Ug % f & gX^ c0$g 2  ajOgd(8("{ FOy#-6&e  ' F  LYR U9 :v] z _ {u1 %8  \Ya=iHZ e1 )|ΙwAх;O0a& $܆$y6N#?ØD,\ ŷ<֘RT!Q5ōy6UYްݴU١Ո/;9ֻ͋?ѫX] >\6s#OXĚH͐QZңӈ C2<ڳc˗ں҅2ܞr%ʣ!Ϟ6ׇi܊ITr РZºvُ؂W?I }KAƫ t .0 i.  K. P%F2@gct1Wc]U  Y|qDi'CDr$r B8Q- u m " QHzr9#- U9~^9=c34[DzQD=Uw? xGۏۆ6ۇ%~_sQ#>"6F`< 'ލܻǷ=ބa:O a1x&Hʌ\F1ۊ8Xڭ_ٱռӣsx._`x.sVzVzod q;3ߕ *_oQ ! s  r  u KC@ =J L C`BUE X""2L4l   %  Q  iCWYz 1onT֝TطSU | -'YVgYx# X}Y zNgeG}dFh + >  N| -zn 1Kn` Y;z6J,8 J  o # 6"?|'x"J- Cޕ@҆ɲϠA?bAf`Y=Z C7 G zl'/Jq .|#t$H w^ZT ]    * >l Q;G=%  O 5@#VHc   & X !`* j  uS{{/* TQ ~4lw]C>J֚(P dN ;E[ ? '8,IH//5)*# a%r]4$]*F0:4y92 2)f&m ((.09)'+8/04($[/3 )a&w)&5d# :) _&#,)-M.'4N'7J+1(I)%4 8A*&!1*0$Q*g] b*!01-d%Xk _ "A 4;  Az}u+5\0v ^8 $ #K % [  -1L $RD\Q] 'k7]KPJ 7B   b ~K& 2 ))+ S OE) l ;!C2O R# U bA?zZv% = + ^ 8$-$~F k Z 6bT P  8b(W h)k4t7Q LmۇˣBg,{ &_4t 21KyePtP_b UV_ԡfڪ ` j$\*$ښ<[q+[ܞֶԉ͟ҫhՔ֞ڕϡmSDUԿԌ߮ޮ<ܥF}И+A%\)rC+P%n<ވ[=jM2q8aGd *_jcb7>7}V4]jr*o^'$$#v^ $+1!  :$! o j I  3evx ~uf4b )L NC2 8Vj ,  ^ < 4;VLAg6Pi n f  i {EH ]!><" [* m u.T0N  g B&-59'+_2;9s !_ " T# Q&"6  T  p|7aP*o ''u%&@#v'%D4/5C++" %(j#  .  C;u  pWuJ| w$![n/ 0 B  CIQD ^Jj)" 8$  S`@O8s/a|.'"V]P,.?2g7Mi; ZO t|  p #-MR+=40FQ|ؑWwJlC$nَ3д~RI:ѪS g1"hA" 7kUB}Rܽ,:7 ׶VKMݖEݐHԜQ։S3 ="6ܱIw&Nݘ߮s+B.ri+xTʣv,])'Lѷ ;zKQzDi~hi(DZ|!Ѻڷϊ :4fAKCFg.\׾ PU>pˤɑŠ.ώ>׆#Dr|o>Us )F2B nkJ, IQ jRbV| f w vBa\/ Dy"( d w m~ 6 .1v o` t" /; wT  J U5cۉb1l 4 c DOA%  : )*@+/0k$G*( r ' ;rׂ= BQ< {l۩mM/rrweP2ˣ/]OVfnhcPu)D;ͬ Gc6GD_Lq ary  )%,5U2l0' 4 ` (=Ve%j,*'+e)&$P` !g!!M!)##%&x&L"%v (t-2+Y' r  /7 7:C@c;m31*)C(cd.&(:s->+, F #+V%' ${# P  6^ -Q 4m4 2m] # U DC!K / 59  5+ ?I)rOQ J7Wh!$6Sn E  XCc:^5KN  CCj}aoEz? k "'ݷ؁#F5ֆrПe߱%9лm2;ޫ5"۞q:$ЕC͉Qܚ׹߀0ѕ JՖ=M{ߧIW3vޕ24T7ya~߬?ҩ;xǨ0>j\"u1AePOι2X͔\/ ajԟ9܌A˽™"ˏ(6TޑRH?}ʯ/p}oϷ>aٱE͚`׶HJ$AHij/jL±k[ʰȒI亅;\v(cr9ӢDw5^!0&U4 꾰Lÿ ʻmMЖ? ԷbʫŽu’&OD,1Emtwrey:$ tt % eܚߚm5"β_sؐܰf $ #fk0@ d  3uJ8gw>" "*t 5 H# g k& t0#H7ܓgjQ\Vڑ'X̱Z{]|ƋJּ'h|Ұȧ:9ۭ/ŵ&էlM%; Zm 5ǤY1ȼ!󤭝㥣߹FqŲݳҜmˬ .Ĉ ףXد%tʮcxɆ ɨ'ג(P0 J%8In޷) X.xT€(9؁hvPxލݪݛ*٨ȡʶZҠ?Ջ$ۈגpIv8f(0دQ(A׍Κ˜CeLސ;4ӦөSҿڷXVmtjKȨS 3W/Cٮl :ܱ>ȥճ"(^kę&̪tƪ}Ťy&[ئͤΛ!]lޖs=kPؤ׀ȇi"{5x#͑IArd')VۿBj16*s `1DY \Us2bZ@E>12cҕpƮɗK˩ݬ߰pfэ˫ƒ'ۜ,Vk@ ޻ ߃N˿jJjY͘ɝʣƸѹ ס?NإҲSIO7i+Z@ 8v)&&I Yu~% % m jmR kW'&ߡ0ۇ8| \ҁeҞS~,SPNĪʲfQ+dڱ:Ϧ.л/Au8dٺcUMLp/$V1 :'no+bNQr -RZR!?~b|:SC] L' M7 H0q 3}?Ya Y 0sj2(d'7 Sߛ\jb(b?66@ph,3iqߌ xyq  \ax@< V;~< mT > 0~! %~H*4G5.K)jn (a(Q[Xkl8H*3&} ڂڨ"@k.ݰ8*~2  QCSa< 1!h { @#IC u &: d5zM swNY; Cq* $5^:_ x7)yp-q(&##4(E*)w53 Z81*8EALER23A #1\K-sK'T#&&/ -4+a)87$=?x%/z S,*1y/1MBt=N>E90=? ^ l$} A2b([7.'10 -c1U0150r6g0j.(e*"q+6,2#8D/7}/.s!('( ?% !& !V  l b3! O( .asg 0}+8,'+l(;T/L g   B)&=,w(0#B#:&+.38';R "( @"P0n&IB tG0  01 Xf! '-r%S $ ?ss m"a$#4e%&P2'H3#n/+% \#&+)5&15145C+A/KzM^p2 <"# U'5 V k'2# ( =!d &6 @ RE ߻ fL$$(2H*!ط40>4nl-`)m 0 #: T 3#  .12= #bsE  {jU ! $^ }PQCOX '<  D71.?  7lvLrDe2j y~Ҫ݈V8|՗ږY++fhs kq& (Ћ*BS/nO jA#7"kˌWڧ;#|(׫bJX̴d`㻴I4x\^-vEp tϤRZcҷ,)Ƿ/҅2M<+4e֜N@DiF b' =!P9*zF" &##m%<+]$**'pg  C%6",,:,'9?*!--/X4"&gi"%q-1$2.f"&& `')1-0+6-(]3 k h 7}|nxy# '#n m$2U8|<CrAH[BF\-z1~ %/a*&!v04:%:::fK4FWOH$98+$ :zs  -x M f'r!!$`x/#$| gi c T#7$ !; {\:9 :O#'%V [kj p$h*9%7u0 '?6,7)2)1&0*'2 ]Pll" N\L @]ڹ݊;ڒwk{A՞ߝ"i k" ,x\bc 5BL{c + > o . : <J"M.C1.3$9-&).?# Y lC;*% N)( +  n!x&d'<1h D@{+&ݩժ״чKN4Ӏ҄Ȫѧˉ@a.1>* ':Z\S3R_)*%5lD 8~;P%{zzk%C֦+9+ON!P.V&f׭_j\Mlr@)W؛e2ߧO7M=C1Hv~:)ێ*{'K&ہk:ܠh܊5݃avo8k&En !hy{   {= FW#=]ϦU[ ƻAI877КC&>U *_T%g]  S Xva-F c {(&Kk !   e   B7  .B]n 5P%N 1 #"sbvBWڳ]%YZcvqE;M|NSr tҵwѿyH`<^l=(Hz8 +%"L(.*Y# -+;9K1 /}$p_+@ a7-y , '.,!Svmّm/~]/?9Yy_zi { pmn<|d\Ηj%gڇ0yϵəԇ ˰˓ q]ϔdZja -   %0T+*b/t+J O sv  n fW M)esi On CU3rs $ Z~ u UK] `w2%$E\xH0 ] X IFm  B  kq i> !lS|uK+-1oeq5M" [ۆ)հ/Oѯʗ ֜ٓQԮֿɛK`Vyȼ`3 Z{EkbÊdקچ~X—o֛49a+KQ V mK An")# 5azU 9 R aq 5C f '_rNj+ 1 $v?t&G4$r)$ #%%)!`_&/"iud0/^+?4~)#$  AB P E_)%!(6 A=3D2*/+ ^Nt(++57n67q,.%)qf ]w^!p%^D$#vaS{  i}ԶHӜx*l%֨Ԩ(ŴzDNJ8QM̫ú[ח߈o#`&Qvʨrα %G)l܎n96~;J'u(/&()c#'t"(%I+0$.& 5  #}(~" -{ |[cC =@v%a'ip| 4[0KE Mb6E+ #= [ !)#P6& -  R# L.W. Qm\+X^V Cz.;p15 % |?1b%X $M! ~"(   Om&l$5'1/RISIm80+.:+F5AO1>.6G73A17//>99w8&B-<%26:I4GFGFc>?5C9/756{:kIyGDE@-8$2#0_&z22;"DEV?;($(- ! &$[!"/,o,'. K+1$@T3C\9d?8}5h0)#"*q4%2(N3/?=F@ A&5g:9;;e:6N7@@W@IG=@>=aL_BLH@A>R@;A8;-2D1.*3+5>O0C3 ;]00)$ " ,)/ N 0D7% i` &QSFN;HK s n<(%C& *$F)S&q%G*&,?P Z   bD[ ^X5iޤ?yB*,+\2Ŧ-Ԫޒ&Y6 7D_E@ٽgsx6M(c^$ 3 _ | ~lt ~6޳cAg'ێ̊^s)مcߥbR݁)`geՍټ/>Bؘޣ$nctE |#!(X%T'!&# O{W .i||c}>BHRd}qT߱٣vӃ yDd#\ȬzՋm [yK_#@Ÿi[֧ hϩͱ|ڡT𘲟r 䪷}gǶ購Ϻ:sǬ3R≠Cӟ܅v>:&^d9]Xs4 0NwE % 7wݓ̿ԮrB>Ց-ʻ{֗-ɐ·czpA-S0cÝҁ;qϊڃ_L ׸<;׭ٵþhF>*ܶ>aiqH;Шʏ<od49Cg'D יVƋ[\׮Ӌ'Hغmۀ+d|4RYڬ,֜L?"XڰJv‰gBJβy%pͳǞ 3&v6oG4fˮzұpӎ̥nA9<6𸸻Y tvԍWؠZˎ$+6–JʚHWnٌMUsІ__m%_ݠ | ?Ӥy+ZݮHcUz֘eЫ%=7Kךh) DY·:ߜhGodNuGdiy܌p~f\'ZI / < 8 d(#$"!," $~  8 "X95,H(qM##3o W3  )m w\ ) {\peR@\?݈ :VX;>9kh%Q 3 k1=wa ,=k*!6"{:(=-`=/8>?)JL2nHA&E2I;NGTCDJ:=@@7OB *>+=#4S.G)W3, 7'*80=e5;\.t31#)_01E'%"V #wxIU GtrM2T=4, ;PY6C RLP@ ֥һZ" 9x;ShP< *jht# H xU#(wh 5&wk)Y,m'c2+Lx% ,=b120*)!m _$7q2/46*d! ]Mh "%6x%.#%,)-*~G#  UX"(),~5/x'3![P9"$%5%+x+0&-#nNE"({H W\ P  . #7 & B  ! WP|2ҚBDX # ?Y@w^!<'?Kڻ]ɜCxC۪=;=*iϹʿܮ 5=g]|1ٞ=QlؕT5שy]0E-ɷԝǭ͎vӫڙ? Rg4ލ'p1"q@]*Jx toLD [%b(:*=-p"c nHUF/.4OFWP{GF-0|y|&o*5G2?3@#E]OmGLHAf;7 0H7 5?F092"m*p( , 3046<59-h(###-*P)@)$I',90/-,%/%--)f#-1(f5#W&p A5|'\966%.'+/:;r9 :/7/j2E& '& $9V[? s gk' p2b  e #L! X p y $B*  W++W.]%:.8+@0"31M $`!`z$()p8/=.<+!4%~&o!J+t+5^87 ?;:C6=V(i1',8291- .,.$6/@9"=/#,((-:7-F*J8~M!6E$7%n5-6,%0-Bb/G":p(, P$='d1L-f<8l -j&%+),X,%(#&-.3,`[(M"'%5t-%S#W Ak 37O{ )B[!8  2(Q+,,2p((zH $ &0%h# !"&/($E "h ,M11{75.(h-!r$Y%s"/%L'(G+)+U#* )P '()-9^9n=g?6;^:73.&&*:.1@:! :9j8B>H=- ,"B"R .#S'*-&tv0Q JO: a V 7 GcQKF f WJKlo499+j{څj^M6NOԠj]+bC~m^ݺTsfJ]A?-QVn,ݢyCk AI z&.WLb3,l{Y8n|tMJZn3y2)<(\9:/)l1i7lo[lMUJ2el/U֫ڑԣѿݴ.FJèlĝ^z߮گ ٻԩMbC7Eҩ%޺4ȚsQvϐbڜtt̲_:kHhQihIl6v HĬӺFݗvf]ٓzߠTBr$ܕ;ܳ OJٗܮ̏؋ځR1qMDBL Վ=Fѷy[!}y|oLY+£Lj OqSɹ޿־}˯˒+җa9!{ʳ) h󹎰{M(׮KXԠ^o M۠?+Mg ƳOEWZHǟˈ~ėQ+1 `E3|Jғʘʖ<½,-d"Nìn%~2FC#ⱵV|Ҭ_Ͼŋt?7֚!b!J bXq+d[[EH6c؁[黼bˆ}fhmʈ1+\ț؛جڌmtwξ⃺ՍS8̤ÜùvO=[gV!^sȆХԂ[gګ5m  K d*dS @wp 2\  x$hW+ hNq6 HY)/; lEXF i [ V A !^z9ek }=ou f/K>c1ka"*%N$G:4r ny93;WX~ݼ Q_Nߪ{Z.!-^?":ЄقHߩcڏBf`{=a~4e8jݧr=KxT /yхMԉ;O٥|y0uZ}8X o7b ֭U2yeߋN(Tߙ!.(}`#vQs ISXb NbV` m J e l R m P . 1e9n̝Rl۱׳&/ݺӅ# ΃&X.-Q7K >'8~nioL3vP@A  :@sI(vV H G&C  fK  2j+K *f 5l_s W\r)   4_  W ;>uZ 6T".}.uOc{ JH WX^ 1 '5 jh$8 L [ A{ 7Y7 7 <{eW:7sӜkb?}kAޱ P^ #K l,_Y\H8-0+vsГ6ЦKڧKI'ԝīQ5kLI:շ Kο5ey1H j4w?""RrvrSs8l2,tˤޤݣokыD9s.&8e |ݐL:o 0f5ff Qc;M`f&>fvB+/X[/h Wb ;5H [  nIb?% E"!g]&]#d-* !d0Bv9  1r ۬ =6 >DAyiGa!+UBh/lk(5?dJhqu0 [ZM r5UDSaaPji|2(sN)`Vo:n/N4;އWҕF̓98ֈA;p ɡ׽ַںI۳kMI>vR^ب+ʅymKq[SF~ } H a ZA,AA}VbuCۙc% P`֪;ҁߵ]6̇**F6ea̠.:֘P'~ݯLG Uh5Kz jvUdP=ܠ}W}eNH.hݱq~>A-!ԡwٚ)DFLc߯P>6}Mב5ٳRܓՃZY ؎3Ӧ ?oۭĂ`pivM?HO}-x8mq%b~@h o TC+sn d. QQh/ }$ | +;(ہڷ&Ǹұ˴j̥.SǕ͋X߯E 鶧)CNs\ҍclܿ9oU2b~ g%uuU-ے_ 'H}Gx=zm/{زܦ܉SgV„x 1P٠~U>ݒhuӓiƟ2Ɔ·\ $J{ļ*ȣ ѡbΘ³ƿɂWl k5ƿ˝Gƥq"R> 󸿷Ǟ q|74ntD̩Vݦ'0kݗَ'ٲ l/LJIH92,\:R'+mٶˢJ:ږ)(tvkތ иߔk]y,@+ە˔'FXY+5ڎ&fJY W  \ %[Eaa oI ,' +  baw ݣQ .nk:2(00#!! w5zC/W  x  } Un G g| i=gLJ -SY- E+v 9 # 9 L+3N5̘V?h=!?y_ȚكЄܗ`0fٲМىGک<ؿ}ܹqu8/rOnWޖ#$$*{ݣK5c?Ѹҗ ޵Ӡ5ک4ҬM%-Xȋςym^ҥ.(ػ+J˱йՖ“*SyƤ?U̿BYЂ«֬2ʉƘ^ {˟ :]5-ĉEjyٗ͟kZ_K[{Hh̎\׊؁ϣv֬!G0yr>f35'okWJ0(~mn0KHYhJ~^T>`jgyׂuѦucZ]xۘFצ׏ׂXHͼ։ՕHʻYLܭڑ9]fd'ݱ){f[[%(@ oA>yR%%<% +FQ SGZY<f# |CS z) '@ ? j% !j:RgS%!!' } ~ [FH  v 5 c ")J)-{ ADh6 p G62,mg2  "o&l!I>#^ $"g!A^&t ,*~3B<<^*T/))#(#"=l:8:l29A0F;J+l:0W< 08,&x&)0.+#"`  | 02 0 c )  #Y? 7`GQJ-#:u3I߁Tr A&|\XPn[NxC xwb h ET37}<&%A%;4=-Q R @|Yfw`5d4 2 C .P% i  9  !xw)[| Gu ; Y# R(*C/*s44>&*Y 3(2$)A&#-) A3E=."$(U+!54 -*u,%(,,3$M"_3!B| /i' i  Jn\ vSPF 3"@Whh$8<:_/y_*P0J#CM Tv&u߲vcs30+j )A)Ezd- O n M C$ #(l w | ; {aG  2 O1 ` z F ld kUA EM  T(&! E',06,4 %-,/ 'U$)( !)"$ "')k/.3M13010.Z('h*'%$%"'l0A.a# #^ S"p _a 8R.$O)Z  Z1qe$    "S *y/p(' )-')!.$h/ST#a>)&H&")18 ( I4! ,F g M ] .C %#l9:m:$ 0<dr 4I>x@s9 5 QonKCL  Ha"B (vXL fV`,*s%V8u*%< .(M.*+i(6-3Y+:-3%-@%m-2'0'*!B< N -43'%) AG>Fo" E\m2OP YCYEHpnsќB4VJKA!ݥ %#tJz+ > sB C)A!i; "@  JD 9R bY{~a4  fT )$ aj4Gs@zo$.^NLGه3.ޘDdϬ L -F >FݞK+  -ծ|_({ܿ 1%gZK O v \#"b K,)+, c":{=E'5<+5W,o+;.@'; *K %$70p/c&'{."1Uv q8C 8mVP mB>>vt Qg! ^ g ^ w8: HY!46#k- "@V( ,7-%*F$/il}" h. +6W,+J)+0//"(("t!'D1c+"&17 +4R%,"%n %{dn# |07AAY)ۿ( ]kM|reܭٷ̨8ؕ7lԦ"шӤ6hGlW4уFyݭߖڍqB=.߻oގ]Ex*hgؗɤݙ΅ԯɠ%T,Ҡеϊ͠`ڣϔ[̣ʪйfp<"'۶`f=W R;=ܠ .%c߼.fE(%U}Pwi~m?Iߓ7xFϚb=->He l!_B*eV& ;HE|PB=p3Ύ8ʻB]9>J:T\b E _ $G0K ` y  r' Z+&',   k %#o't   $h]?(xk 2vhSE"%J}r c |n~ `D_ g E- <u  4,o [#<  f  }5.nx&YBbF{460 Q"QS&߄Q4܉%hQۤ8Ӈܛ@ݱͼ҃ǠPbڦ v>F}'INoc aMD[ ! Iyd~ ~ gKvuUV JAW;F"Ҋ{%;NrHJmV%MTX:E@IIhUv( :?RIvh >> _m>}p5N9Ҙvpx܃ϗ%}ˌ!Ϳ>,֮l6H%n۵*ťO3&E Ϡt\?]*rb KJ;/ #!q}k0/& t," 0f o3d?c;%cLt!aMK7]iDl1P/W|p^@ f'WOߥ~c3f.}Ll:Va-X/s1U`lUMl0>,iLRAP1KKy#4`Q1h[80k+_K u97yr{ l  9@r  Ari   ` IO yp v;0# ?r4B?d % }z2&J[r}1!7 K 68w}QYNy]X oYh?" !:"~&&0#+$Hl)N%'[3(&1$5,H*#&!3l28@9==,6 ,6!4.$,*W51$5 3 4S7:3k /x2*4+L)[6I&v@1i;- lsu  @+|/&+|~  L A' _ ?$rC@!".W R$&pI$I$Z*.!f2#J-" 7%)+K!W,&g/I*72N0<'c5H$j%#m'`(^(/&+r#4(# _ u- ~! *$->5~j"mujj > | g> b l I^B36D [;!M eD. 3 ;^f k    !V"$#2# QZ w$L p8CO rYn ArGGN c  f?Vx /`ll x3G nBh ! [,#l[$E`V&/-P6!'s X #(%~0 4"!N J5^ M<  ?9t  ~4^tzVFE݊GY6S'-gg+2KY a_M# N ^i[ ja*,')$!E#Ne I++1)4';2U:u4.f&+%o./()  n)0/%z0*/"/n)(G9  SP h Ewu %Uu?iHd LJ[ 'h-"rSc Uz;X*|f- f  J Cߋ./@G˼&\pxټfF+zZ=G؆ϗ@͗Ϗiܹt{o[~!/-4qi +T=3 B\ vkfة=Mdm̙Ʌy$y*Os*@*sRԷvSުqךPԸӝ˨ܜ-!|ХŬe?ϢkI &ӃJ*B5 ߐ7٫ٛdJ٩ $bsؽՁڱbZyCg@*h7[|O5#grZV:~C;߿/֗։bݴ t0$fڴ};ڻ^NpԍgKo:bj#}u= p  + ecS6 9_BVJ. ?+3 Ikus7: fl !T8#-`4'j8  r(:"  m|  HKSLl fI4 JEݎ. @,[3*3|  @Qy">r5;~P&A#<  VK~u<   F9k5  m )g{p(u.\@a u q.7XR zC_  I3 z[ bM.$ *< Gn!o7 -H =Ogo8X |v&p Q8t k-,Z1as]^/i+=|ZEn}n5  v+ St,,gq_% '݇YەGAI8b%>p,5aa irb+bټX]Ζځ7~t_12y>]@BLu^T|!t+.* w  }pT&}')'-0)F-!+) N,g+11W0)'$)%,** S,!/#h/')jz'0++$ "U Cu-vm߁7L|s!}јKE].X/Zipi~+^ ; ,/ ' A vb@&A[ Zb?lyIAD2W7f< 8mF ] p  p27'[J[3fE Of A YV&3 v< ~ ".p+!Sdh(4V)d%"# y  /v02 * V \ _PK -UuaboICz OIk~ixIxfG 1MGl6 l,QMhMd:IR#*X3JGK"@   Mz#-EVw   XpWޫ߲RDx M 9-t+) 3v^E &T }% :%}~ ^ b = j p1%=&^/ Kn^8 `x  X I9gj ] QGg$-vo{+,@&o9IE L*W+t zQ$܅O18g9ߪ.kR X =&"!%#$'%C%&RqMYq + @  ^sq+C; WS%Tfg>n76 gl4(W#F( ]p ; G%_ +2.5/a 7ao }. E? t>BIo]" j<]Vz)4"~g <29 S e+(  &-9 !  }8"k/\#:"X33$h#?%.%2=&9,J-~H#.K$K%4&:!+ J"h!wYYk 'b9*"k '(f&)+ S#0yk %&%!'7k K E )  [O@Sy,a& eyF ^ D  u J J h P6 = 5 i K F& c -"J'S [/"F7A09$h)@a-(-"!8D 6w*(4c2 4X!3 1B+," | k$(z,H*+#1$?X#U# }|)x h.g#(x z F!5w\/{,  7 Y_5 }15&Aj9TSU`mQ;RYش۱WAIp1pZoKv[3 `) gfu F~%GoWH.cwM m y7Ip\+|%&  J  /y  Hc}/zi1=k5~7*@aj_-! R..7 +kQ 6F ;\ @b 21}|Z Rz=$ _ D\ @$ wY%O% "G6AD"u VOW"pGH-UQ>f(rqkOpҴ9}ӳGס٦+57~7Dab 3+?_v71]zSTk߶ڳHܡߣ*jou)e{iك< n5c]ܿ.ߗ ]CR2v= 2h#(Q +!&3+5*$#SM( P- tL Q  /r1% NaI$$Q/' ;& p%i$P'$z"'/!.5" @!A,xut +/Flyo:SL o rP>= dF ]t;]d޼N~ ^V:(xߒgj@pXuf`AғgQOQzY|uh U+TxL(Q|? :o;dxS"ђgqZ|dgJ"L }F7B  %Zy?p e T <i{|%n r j7 Y  KH 2#s7(,) _S"O9'#d[0A.!h c 6c J34G d=Uy?MpLqZDPmZZE4i   q0(wL#T p -d(SjcD|~   /GG Q\  K"OnXG U>B%  `\& b bWPWR5 YX.ޜ YyLoA4˻N@f45ezB\dX)(o 'P \ zr w;  %z!1  w`# -   Ua 2 3B Rir(&--3H/3/0"1+4D(8*7e1.r0x#(#+I.7M89s;3;1?:3*6D2F34g0O9&03f(Nq!f 6' wN  ! P!i q'! _QEM sCCFS  ! O P Sx R$ T e ;,!lN =a k r] \s/!#z#!V .|cBL < }r[P&|6xLVGFV|Xzr d Dey G:> P * F[% L  :0E z+"UV}j !G 6 R0 - "'&A%F$%J#%>2d Z  OX[69      TR <3 F   yC j$ &P (((F*"#  !c4% ? d  : 8=CGbDh_ D Yl9Q'qs<K 4|JdMfI " . v }@, T;sqqTHz9&TA;4 . EK  )5U*}~&a@nT fv!  a  N sr+ 4 2&GK cWH $0  v ?0  !W !'HU!()V#0o! /@(}? '; !&1'/@*3/+*f&[-"%]!%j'y"Fm.?V)#/.+S,M)):,*l)y$e&X$/(3rLA! !~Y PM!  X + HeyMBQ;!GGf8J5:n}*Xt ]~tt=J-Q 5<Oy/L@2)h  VRUNwQnY;}/ "(uq Ph%^=$5x97ݗ.Gt%,4sQ^rAPZ/VW ]> :-7-cg}x*f" h<&oܦCtvͳ%ŒvѸ - vz_>;RoޚJVTU;O?J,ݓB0Gikc8ٍد1z!8ךEaAөۖܜչd5SkϞ7 ˼~־1g~(x> 3^osW L %]@5`n3=bTB- tmHBGK&NI ;L1dajsK/HDz  u(@ o$ֿPVB@޷>g7Ly^UA)^Ge΍GU_x^pF!x۟ 5ߖ]Д^.`VB%3+֊֫=hd"OF| I#\zr 9{{ -=,   Uo~|7b # X0 ' 5,t  3)7pkk'In1\74C h! brFF_ ) 3 =  I <U($qzj E~:{ ? ?byo,m}wq{)T9"SI+Jd`<Һ*ܴ#M!Q`t !ݔm&=ލ3A 6M١ګAGJ6pmkU= nmt)q( % G8lcXWإS8|ި&Z,M55Una6L1?ߍ,~+HIL r6v?[DriB 1|W^+ [ UJb Z#~6_1R3o-9%LR  /!9---o !OKQ9(d92\61!7!',3g(w1("'!T#u #!1&%  tfk.] ;#$=))0&`(!*%5180<5c9]5f-&,&z51_2)S3!( =78n3f. '`,h(+O**H)13:~@69,T+h.\2/56~###.!42Q2Z62.$i.%3.(* %'-++,J%!,E*D8Y<0K1+'t8m5Y?s9^91F5300, &0Q+21-0.*(+',&-()*e"(kL+i )Zs b$D1%D=4g&*x/~&*"*%.Z"]JJ),"'+**6+y8(L/@,.0201*+'*)Y.25><&B;:32#2F,2U%*5"iK*!6/;7{9499g<7M<39 1+:,7_%.&.g5"@@{J">@E)59++h..F+$-#' +i .et2%Z+c6,~:'|9c0&#$O| 4Ml  %s z di:B\"S  n@ RP9,[  1a 0 X SX3    SzE 2` Wo-G V4E +X "%"XF*a?$nvQگ=.HsBN1$6>WF;v Dc8Bj  ~ q C| Ok/9K_NK}"8m3t$@*" 2-i.*  *&+0 +8,x@ 6t5,4(6#g-/2u41*%@#v"$t %X" )1t } "q !) 0@7}9QfAmj?=&LS gs0)"80M\ .,!!*+#, &N-(/w#&}C".'#$%h$5%e!b&!`'E%#&@>;2 $0C g-w  =!tD>1 : wu V'   D Y%N^2>,01 ! R% YgU _wM` 7 V'#B1/6 Nzv*5#M<*5?C!7)s$K,'W4 *#,.#5&45^9e8;<945Q34@>{CF:3#'+l#5M-:/[5C)&\#%-n4/1i+'%3*$R$\%QE0W"U ? -i  sIDr <lX? &f(y;#~K .KUh[Uiz.!"! !(%!w @_  w,<%+$i. (T yUskk\J> : 6  uB|&| A)lW`L4^6ay\O9QSE:eY/OroմyG^0~,ߥTUKrI29z{g >oG |&_l+ 1?(,h5.13n x1BB۬ud֜e߰8gCܼߟ L"THl`8q܌|lLo"=EL܇Wy Z7.I#SӗӘٜ[ܸ:@iiݧ&4<1]vժrx]ҳ|PcPR3!!&uچwu @ָ*NyU5΁Ȇբ2υَ̪ӏSRI֝6߫Ї͊:mFg1D_ZSFjm,į1Ϲ;ڐ҇:/Ò[{Z;tƉ99SZ:ܽ_YώᾄL^Ãş}!;⾃v:mіJս]`1iէlц.r=*;ta(!7.#u"U>SX(b&peߤ<@!'BbU;^q3is֔ێ܈dr.Q9ݿ8s܇;ԊOمNڳ[sս d a!-=D[t֚9<Ox!g`c-;~p.&ص "QD޼Cqخs,y%~)j"^r 6HS~+l[kk?ߩYeodf17yW5:e $3FX&dgԪgZؼ`ǥ']27ù[͘~Z'Ur,俀}Š~|@2 ]Ő˚?=M Ƌc϶ݡ.ݥvԏtZڍNUށ g]CXܧ, ߸,ܝc P'r׺ݖطޮF)kIi݄q߭&B  /&|},)JQk܈i& ΐסϳwc&bԼ׹fѤ{ۃ/DܾHۨאߓ߆/b;/a@M=-V'0\8%71]d/>E&O8؁')`':قi5ֿժ4b9'Ei)B0a64ݖv_B 9 J 4l~ 24aC"y,]C ~&>RZ ( 7 6#b E /,_ C kE AoF6NSkP;>h7wI nhx_uW3 `2Fޥdlp%i/RaF9TIKFu/`3 X.@PNJ0&UVa6ځFS]n%):H* *sm \6'.3Ve@E>@U|wX R ~7nr{S ;\ e UO Sg4@IM=Hf e5( t%AH$zP,_u:1g^RX}-8kUg\   E4a 4h ~O/ \ D I  n+J.QQ  dLqVj^i `Oll Cx  8\ J !J,0V50UwmP{(Mx!\9&  do  d2 n N4FCO 0z"O-y  W%[ni]+2'w&&D6k #$n ( {w 6z? z]~i 'wz\ -n]<6 Z  (] $ cE * Wo &F C pO'YWW F 4X.jxOqa @ ?0 ~  G,  17   2 0 wZXY 1 >" )& ^gaB("*!&&+y"!T|$@# 1  L]#L%::Oiu2Hnu U 2}  0] nfg hM9#I HO$|'")t&=# T!)|':\("!f%UsG o*5\u gJK#*g Z 5x \DI7 TMJ4 dPb].+;Ui %] :  K  80 p 6zcOQ K9 b]@. |_)"UEn^)I:a|?=/`pyJ5qoCFk VPF,@ # ,> AV+Rj~qTxHV7ۃ ]l i^4= T=T< T `> u   O imd=ETmOtO+3#x@A%<ZU 8 28 s +  kM&c 3Sy0y j @ M Ad!`D u%'+/,([$V*w)"$P",p#+p' V_p ;$t#8%R!'= $8_m!/(t} X cS9$  ^J  ^6+m3 I<>M s ^    *u/;] #[z[ P mrT T$6#4!#&GC,cR"6*o8?$e2!H.6y&;(;&6#,({-+c$+v$ (E!"} a$l'VGq]  !!P#!q!_?)$)e &}$C#U!]'&$_=y!a%V))G,'!+&+I"u'#$'I&4 52"$|11Q..s& "!hz{D #S ' L OOIU l r@ n n x* P : w     M5  L,l u3^ `7  `C"a f'S" e Q!#   H C }%y!ZQ!;g 9 Z+%O r R ?C4^?V- i6$ ~'9agC}ߥ/neF# TJ ^5\`IEM=14sTki@A % av V V1 4 /e{ ]( ?Q Z YZ C g  vE3oV5J2{_x=i`.LL%kS CI 3@< q/'cQ{%.c#_vmX# g` gU xV   T UQ F*v}5K]ER/M@@KJ fzEk?maHV_x>ޛM[ryb! E-݀ע?־؆ۇ9+W%jzpLӦmV2ؗ5ޣԱ9ہGڙd2 ޛګ`7fޠݣ߽Yt'l 6"X=LЗT8y{[*Uӷ/e+ۡۥνAdX߭_,]`l+]xu#^t-ddJ{t(VMaa0VcQ3c2 ;3~3<.y{i$T#n >e[J:EX8L۝pEP)U ;^JJe B$p{5 :mGp:= a.r-py:ouނuYVs3ԠGlwL*;{5us!bM?-O*"L޲pWFAFWB-^ьJ+@z5??6ۃ04 n6z|׏TJ`ϦڷڼSS~D6byOJTr4?< *Fۄx3sT [ߗL݇Xn>l*zԠ֫Iԙ>wgݲbا?/>:P4Z{-_y!BUz`1fFJWroP [9 4Xr|\,80VC ^9N{O,FaS*k!yU y 0n/2W?1_ZS5Z 9 X ("^dC-OG i i,  ! )3c%= CW4 Vt5 NYz:?n h~ Pg k X  R ^ :  J8  }   OWg $Sl _<!%S s[ -X l= &d(g M ( | x  Ia- 2 }`e `U -Mlx  baJ?m& $DL-) n=Lnt2{x"-Y-Ap+^@j yc!}#dl>ZEydRMcxkjq;U)!YS'٘kr#< `b)NcUK}0APf ?5F8^=La1my  x1WEGq |{ ~y [RL  ! $~ gh c .cK kc ~EZu{(0yeG  Ff_&-QH;] >H<0~kfv6[7Q p~-{l Y@<1.b[ : tf"3u"%kfG2-\Ju:IJx>P1c ]( l Z7p Sof^ 4zL6j>iU1x\Eqw+5l&s]4TDgJE$OVfH^ pv7\ EdO?ADUVU'z40P'Up%`;tE2E"Y/'iגQ LIW{gޮvQjz CgJheC `T<.jF>cf?!cG>x=xm 9`uP?U [  X(?t6}P  f"dX $ Y4#a \H7!yH~i 2 M g %d p _F\   bI 1M [ cCB G]  n Y[ k s  t U1-)X!!:D WN^3 tD  a 2QmK ; wE tlT LU ,  : y 9 B_ -   9#^, S   t aU P < C Wk  i 1g="-2`eIQu##""%$ ) "K#$#N&9$s@ t   "7$R("*&:-v#m'ZG<kk lL|j$J!x <Twq-RbePRJPj CZ}>@$U+w-V' ~g  T dM%AD  nVE M*" _C = !oA k!wEr{003 cyZ e^ oF ^I } gG )0.  wvn- jD KM~n!o @4tIqh|-rH9tx}t  L24r[ t^o = N #R_L R 6 F1j'1Rrit?d!) y a@ );\ v aW r[H AW7 o k  /3w!    )UdR3 ! KQy  K ; N@#U i KZ  tU^l  /$!_ 8VWcqVV0""%u#-B Ej   *S '#$ r~9 "> C I t%@ QT? $\ oW\ P  So  F e\%|KI ) CP9 .#?L: P V / ^N G  |0V==QimVW&]Т{djs`"j1F{;~ d  (q-5G &=~grZ[x Y+ b>'.!R  ;8"iC #&3XqNC} iJ \nU74bhYr*f? \I`E.| rH +_ju: m[& 1   44{2ACnj!` Ph&  d TY*xLGފY.L1ser P [ ]< I+7Rs}3UqwII`9J߾X>J%bimX8 !j(( o"3k dY } uJ45G 0 >(By o? $ r~2$m~ \XP(K`9yY3t6m8lr>ׄݽ_$ ػԡ!'ق>1YJyDR(#F1_L('X5\[5>L+U~pd9z~A J o _E! #! E [Fyk VSQ3 o07PD)[ 5:Jڔ|ښ(fL^z  f b'B \$(Q;3 PT Z+4 m Y p O#7 0 w s  %:> a:.bkOz$ xOJ S"F$". Q_ ! vhcJ`X'E}\ S/ Q b-q L MW 4%k+cg |Ca߷WH]G= gQs@hS{ w9n& ]5c & PNDUm4\{` * Q}7sIuKF {eD gQk KU=p4N ^U `"LՉAGOo")DEٌPU>SӜzp b"x,  m 9 S  ,  $lx_{$G[@Ef; Me#CT 8PFN-ڬ_ں-fڨ>Zn9m׼#ȫУA])OJpHێXC\Y:YT '9(Y6h6~s=n*r;k9[1\C2m۵ML>l?Yt^6)> :%_g{30 +$ Q%Bl (& l b  C%&')M;4 1 R /!`>I?H] C gxq)$O.UDO$+[x'ry<1.,0qy QٰS ;MUd s$ eO'J &  QJXRZ   zmEEij{ [4 sIm)22Ou+~3pm{qR GaF# *  FS  F lm | 6 6K'^i  /  m# Ki3}$o [)PfGb*d?v,("&J?gx% *g9Y؅V9ۀ7;R8$pQbAES"sRU rptf5F$+h w ``^ E:3t 0lg L+;"=DOxt_'bZnFQo{s&,2VFn8W    sJ^Z } U.+ ;Z oL (   F^#n *!* !hJNE 2y18"i5o%L, ~ \(,)3@-k,[(U+3g-6n Dxm %z2$#Y1#'c(R `b%$ =~GAs a7 -I(%"<E) ! 3&&r '!&>! /V8+(.2lk *%"Z%C  P :!Z 6c   wAmiQq/+Q(P /, ;Fn8 o 3B N G#6 0e<+' {? < %, k  P(& 0"` #pm E ' *r&+ +$T' q&v%L$&+"PHC ^U2 N 3y i  8%0 !GC| y#g#%S 4&d3)"7$!2Q!+]$c&++T.1$)\-1f"$.z(&6-n %+R ;K ]4z o  "Qk Hs $X''GG$\;X7n`EpOlzhRB6u)[6sZefH:{EUh3Um,V X " fjYK@ H'{+ u \p $ڏ}Jއ|C wtZ#y?aC  # Tp R)GL ! X^O   "B .- : n x%$!%&B),y e3 s ",D$V $T O~U/j C (*+A_8oh},>p,W s=PS\v/I wR dn#@!(I%(# ; y4&G(Ln M)f\( / C/c&e/$x k @$ G [  ' q 3Y ; $ +2zvMCm m/0urP ~,\[׺ע}:A 2cx@-\ZV0<?-j@ XO V!Z>   9C;e$n U * ?X'HWsi)5fb_oؑey;܇v'iu`|TEݬE-۬E&!0:Sta{x!)(` R Od}  ""2zI^ $WBe^,C/qk v UQD%&s'fM d=Qe,%#)"t$" 2Cz"s 1|  . n W2zw(fi kHCt ] nu bl-\ 13FlQ 8  dkPE" b ^A  1 n |$: " .s#/"!`\ K 6>80-# ##1q,9#*H" @Yt4&Q 1q~+Vs.ӕ 1D*}GhC 7r`OB[?v$Zk :6SZ,P WU#sB ^'  4-#" /!'!(iF s 5zb^yLSHa(H[vߢWܚ_WA[ C _7 a 1tx * y|w(95\&B#%Gյ\&S s[q8EpM<9\702&mILr U 5e \ݓ!Ց. nTDs Y\op@=}3 6/  \ #s .GFKq+InrpڲMe̾'sZQih"Ӣ=gpŸQTJ|oOH3j byU HLL< _ J n4 Lh~-m %Fy s]NI 9 A-a) 83t =T# EO>k n Dqߠ&Z' xnVZ[6xS ,~p j847 "Zeo)l ,- - &9R O`&WGKXtJf~هH=|P7(ٳ 0ec K@#.JGmh t;At0(v1ՙzR&ڼ5PӼ} զ3ߟѸm߹W,awѻҕoݚ)ՙͺmǷӦćېըD 0 ϭTKܑW&ϼٹԀ{]͚%{ғgTTpأԬDةCM!KM5G + lP\ K TL}o\0 m0= Rߧ4D+qXVFݺ; IoU@>"0n 1WЌMه_ݰ9&&=wT͓3}j1Df%M5 tvosH %,to K.gQW{z8c4Z6'(dgi)E bqR ;zI3\  (gf,zV" 0nc"Eo9 J X!, $dZS I%E VS b K+ G  p ;]x  ] x6#L4!a/o X"%-%"F Fd M Xx E4'3L'?Q UB |Fz%  ?3%W@) ;P ' U Uu h UV +'/Lh Mv]` n QkCiY6ZB/|6iPv{T BDG "&#n W$J   n  kY|s+ 5BA  dU_IR  e1h}nZ  #^ >qr  )0},b,$  j:k A/jpSd ctV'5*UTIaV|I#xE1.-hT[ XQaծ~r׾RI(\ O. ٧_x=fӏ޲ތ]0E:5֬ʗ͉Y"L/ḟ$!mHz% 836dA  ,XTo<G[>{pm 7 MbSU : Uhaj(c^rE-x+`'/.H8ѤבܰX!}vsneVͶQVm$w2ݻjkNr)jeCr +-{q=gr4g\MKaG iN~5? #`r9 M NRT ldz An, F& H $7 >MF?48o '1s;-Td/y |h K?$naakP $l5v 5 [  8c1 ~rf  p TY NDt ,& *=Gh&MWOG} @OmxA:^ U _& F^B1` 2zabQ vSqMi u߳?`<3.5[ ON+ 1 %!+@+ln `"!>p6#( 2  " "8T6([  @  ND" }!";& Z9 [OZQ24Se֑ڀt 6޳k![2g^*=4_zLq> |~& (][0a\fSc>1l#PE}v18~MLFJdLsH2M4` RaT]D߰ ?b_+' b4F; n.NA H}X\Z! Ol ;\ Y-޷ I]r#==w|Em *,i | \e-\,"n;m-&Z!ޛF #Uua!D'ՅހobfWSфזXv^7+ƙFi7k=oЎQʨakC^Y9>%G@רRާċ9ϷίHd.,^e]@TھjNgH4JC1NP'`ޚZH;r [bS'BlLrU`;lpzqN*o 5Qm: "9׀gKuo[z=vG4MSܷ pm P"׃ڧ+ӿuJqY™ޭtCΆݝ|H7-M $pxjZy*5^tO!j/1mVtݺb-ݐ9> Vw]%[։Ϙבk^>M?yX@i * +N  js ZR&T8 j[ A;W'.i l_ZU=I*# 7 BjH m| +DQdl PSϔgsg߈&CGQ[ 6kk3BX5^Va/ltܐ ֮p+Mi*d:0ڿNv`0ٝ`G[ܙ)^lt$vmZmK.; q $I ojl`ޡmVf:(ґ|moc{ڳ<] TSy 1 >MK eTX( LU[=\*gČyL*Iwyӊq]uӥժ<˚%׫>dB^Ƒ;ָז5բʬڝѫʃپ_ՑӹcE">%}ږ׊tߪHg-3TpΉQp)a*o1= RX٦ןړW޸/t:U\^(t>,+( [A[׍^ ߵcb;̞\W A.UAP1 aczEU78SMO XLj/ ݎjz? _jz֐&g Mo~ W 8 6\gA ERW# <aTJ# vx2b_ r\ }7K`uv( 2 >RXݬ%V\d8ga(4޽BQB3MTg *4l5x5eދ+ۍh7)`Y|עޮ]OpQ1Ax6.z*3 ٵ,#\ƻKja{EjaF/ޕ&ߊ8ɍKUݭ4YZ B3xžN˂p#.'Ͷېʁ"ETDmW\^Uڛ\AOؼ~߄f}k޾*ˮY&vٔA܃& BHdcLd\2TnFM  % .5x eH"U~,| 1c.5 a0p(EZ"-mrh"Xf  > 5h  p1-pMgT56HN2 R j> )XDV 1 ] <E8Q'.T#]*Oxvݾ5R 8EB -k\b,J|2=)7J7sj.B70(H=vlh-ܵ^i{1lΕi">LN' 3\H C'a)"V!83 TA ?n=vT( WD- KZ,nZ[9N8=F9#V ԴH[ QPлjTJ.!_ְuNqQ51X=347H_xo6jB ܱWٙϱϨ0٬ߘrh,ֲ!=ޅ/5PڥU[ŵ\ւӏz(0"q`N2s3_ٸ Z-Y-שQ8׽%τKd|`ۢ5Uxi8O-H&o;ؚpp!K+ @vn D 2N&%Yd9L0/K4*b#P{]pPP! j}Td[q2NS { _W+Hhb *&$ZOa X z@3Z +; 8 3%G vt XY ","P)"F2 w+) = - c e #p`|.$s4g- ' 4 !4 L"_ 3zH(+ _;>k.h!\s y zD~- Y f: ;>,c E  q,"k3\ ~ !"^ +{ G~%!d S ! }u\yg 'T|zKhru2Li ~+U xc}~(   z4E߾i3|9]8$O Qs~کHq~y0  Nq (Z d`N"kODaw#K5 ^l/  9OUO }" $KUftfcVX-8 2Lm#& N+{  S:0 O*, g,E 0%jx:/})D6o0DF'  ~gs\,.5B[~p W#N BX:NY]7% 9g`pFe  Q4 z   g}Y S 1 iPB5! ,Ӎ N g@A W<C,3 nN]3 ~  Y C3Y8u Ai 9# } f+} h &} f,/' ]km b!]!* A xj#a,==%r2F=O  I&'Gw&*= .#D/%2'-!!v M)* !p duWd# rW\AI LGuE -*O#7 P wl *'R Q){' f Mw &  {   1, ctf(>*(Nf  kٺۃE,k׌[+ 7ew?#l ]!KJx"2 g ]\ pIz]i56u{nfno t //c0Dݷ3VVHpݹ^h.8 &gP `4no 6 u( }lwcQ?:>> T }lq Sr($40Q$ Z E>}#}xeU:"gDU #"@* un7 E%h 3 .0C {e( % x k+) fX/4M U-XYe E h(2 | (ދJRf  1 = 3!  @N rjNO&&eA=h_VP?@ ^HzB>Mq?"+WHt# MOkg ' X\nZ 8NbD=  I!Y|EDR2M&_~gQm& Qݰފ*ٱBV9r <2 =-pyT g  ~  U q Gl '(%#P%  ;*),)$04' c.#E%|Bw U OF 4:%*%9UH ;p ,)%! m& 7Q'&$sfNG Y o S B # O Z05 ]"u? <O r v,Q5  m9NuE2  =!' Yk8L <pI my, j\l1 Z @ D!y'"pI C*_GC  >0ORw g}E ^ N= "<|7.D ;%q+ \ S; j QS (C YI5?Mop  ؈Y._Y -  #O  l W bal~J,(  q5HKl' z,}f!P ZgK^b-} {.S m;dA 'Tt62J~Ja3 Gg:j LO#} qY1& Q ` ; }A9eI% [{ 8O(u Px%+ o$";5X0 , Sy-7  2? A >'  f|)I)Q+ QpU8Oܤsh} Q dnV> vŘWuDl%l;;D' 6ZdH7(x(>WV+W!r]Y$_޺B7hEf'A F TH  P|NBulW"+@s:1X}i/Rpguo$ "wx ` # {  }  %Y q@BEZ{m E%r'rd[kQwd ,2K6  |BN O I 3~)[ j pol # gBL < ~$@7+gO rO,L  JNOvr ED&%7W*>$j.ZӭҁPo` JA    ^Rw tnyM  Q wi2*ה $Y*`l  rCg # KwN| -=l] N>3 p my&#q d8]`F"V&MHZ[6L7q 12%4gs Ez !@~  G+7#1J0) v?*4)7B $6/7r"%4:}((99bf6,/)4t6~E1!y_"I;ua8HH [&D@[B @* s VTn IGcGv+/#ڷ?1p\޵@݇ϻ07j;1 B0  vCHeڜ|[ ~]IO}lsظwU'97ߞׇܿo6x Ea.S:Iّچ=X )ިևXW2V/s̓"؋cmC0oBWۋi{n+ G$tN۾y0`0o~Fmіʂv ќPzv̐ӄBuݵO#̦c}gv_ #ڞEaFIѓdXgfњ:Uשc>ΤgpJߍ $bW5 9_wYκǰцH=e}{ݨ51ZXq۪(4}Ӱue.ۉ),F 7R TpɲlQ"nPܲ` |8׹qV -'kreqm'E$RMv . &  5K na{F8L@ mu)57hޭ=  wk ҺY*g kuk6(͐yy< D4.T\q_l*Ҝ̻ S[3w37S1" n g V-wE2fX$  tR3wnGtC/z%U G N# gM HZ. C y[- =$#+{ a,*@ E+>BKw`"&/c15Ga( !!#5<=  ,'4-^(#B0,4/$ "#&,C/|275/,/.<')#s#^*,D7?1?*|-{5$k(^bq% 63~917%&*(+67('r!<)$;3-]C.>+& uC=OdIK#([Bb=1.o)'-H-',,;g;N}Lu&_"T;K;;.0-/0!0&"g>9yB>0?=,,q#$g,,!!%(#*!"k''Q~!,,8Q9"&! %b  +!#3#Um^ OI"'_R(p'%r s pz@DU h%%!P o/2t7#d#$+&Ay&$3-(#(]GL#r-(%/)u4<+. X c  ~+)$T4.k 1/(  (")#,<(-a%&x  '<#0*+ -w w V}B'  Qk2vQ^Bz/$H@k4B$ +JR:lb Fg : f*Z"fc5+]#[X '/uE ,HdTW W:eWU& a0N 8 ?7n yD'yMT5(V " % , %& u @^I /X{eK '> 8r{k%*"B"q  1'w'D82 ;SZ  ?xd1'$X..?`31=is \z3 &{ 9b$1+5P u!!'%h /W tc$2/z' Cf\ $ M5 \ lo d|:c< fK)/%+>u g+& + :9TQg!!< /B{/,)n! fW U ,!P $ >.{8(%9 * #`2/)- cS ? f.}X)ZVٮV ^rd9  #AY0Kt{:Y9[ 4  K dS$S *$v t1\a RF  : $DEW&Q1(/6,-e'+t&_"7)}G#0Pw!1t"j$<t )$->8v$CQ'.J|^'_*{C  a z/!5G t&7={ $ ky04*k1\'.v,%2E0 .)5,.& #'A)l04"G0  9 Y##i :Ez&n Y/:EIa|o#dl Q!CS blJ24+A,eW|).7;xr Lz#.\):4%, } P0hC,10w"$c}sxt1#3+d,0|C%6"y$)~"@>_  %+ %n%G &<0T db ;2b-7=tM &S d)z-"9Th w8P ) &5   vL3- G&_3 7E/ =fNu l Fu 1T.\>(5N ?  /5N  wc4+AN 2g '!kB  > y@Y2W)OU(qRZpaa U #6yM H~  p e $! K g" kpak  sa t"P<ps W ggYK=)# , &%1P5l8Hp"0X;Z ^$c0'ww'  M @u]%'3'eym 2i 21 "}m! O$(7 w' 9 M Xg3*% xac9L (a?Y8^{o^T(G$ [  #s >DS P',5@/F\ >  *5v /'J* BH- M4_w3# A yTe /(   6 y Y8{i`( ` )eVu h&_VOOv 6 }!A z44QR L#: )(64: XL&h X x '\ ]w L 6Z [! jY{ϓ'k[0$#wPY܏L &',!OUN |?Γa Q(jMr( gm%3 |$` & I" "jTMF]F@o &4oٳK8 ,  f/#rX A K\,`4  D)JzL,&sR: "8i9Wc"qOCUU~5(v* 9In ^  kJ *\e0#o$  ;h(1 !96'+-x__"0   R6 ?#&AUb9!'\W4r 7!{ L X  3f .-1$ h,    ID$` ;n2 Hq34 -%#H! t12Sj%!-)$# Q^\ p{ Z0A)+Ac >z%73 i [ b $# K# j^x # ; K*iy6!G !6 |"o!xB eJ`fw<9R6c x6u' 8[ O/ - NE[l%1)` =*\F_DR4RZ r | opIT% yq<{=%*`E6 )~TJ3K+m0Z&+ 4zwK<@f'&"8)+.NTQ,[bӈ/Gy,c$ kq l~=Q2 Fnoֵ1Y3Л2 |"i0߉3S,R0nGDҒt$#DPn'ݶ "V#yd[LR >zk = 3nNG#!F U 0^>v~ N'<V C),B n nVO-Wx >#km"H {:! *9 jc$ut *sH '{&TlCel  ~/PGe JO4 4 ?P~(_O. 4   {n?@ [::IS,x&Q ` ' e 6F _ 7Y]y*+ s44 wQ]#  G#H*R-  d% 6$ )u6tx N^H (3 !q( |+Y, Y V"BI1s ?' < h z]sJ #ҋQ*tLjtړ6r9ǴSws}h, ?XZLr* nk&>Ԟ$q ڇ H& m 5w-ݿu4-`ڸ_ddۇ-\:*ԃڴ=K(ݶ yX 5,LWY=di $]~TQTg%گc`o[:##=_'( ]`Kn` 2 @c?LK'\e#1( 8s[ qH u\ 90 i 9( '  R >^]@ 'F -l%""  +"  4d" MO$%8[ &(UC%F  2ݩm0Y E]:s|M  Wj +D 8O A f4\Y)&hb# % u)+q\_!#(\ $ho^'`z\ & 3 h >_#e.M#y>G ~ Xt V~ )3  Q!#<$% o o M0=a< \^Q \  [^*}rX'u V-wk Y "YA+;, wSQk*W$|$$ySj` MXb# WEo#([ b 1 0 #IE SS=C A m!R #%-$ i$ LS, e 4*%3Y6 ;&( R-Y!P#?84&(Y75@:k 7!}>7 0+O t aWxyhBB| ѱӇ "nn.) x%=,X+Ih ; <"F $&fB{pOqY 3>3< ;;v  i% +9n   vt ` H 7 N [  -Zv19ZW3cQ d k$S= i<\//Y;uH:a4wH S oXCDE!j$%J0 CMʓ` jӮҗFܔ-ٗ;gl$ġə>3 ׾ п{-,Lj"2h3"]$4(".8h7GD ?y rޔ('6 4U> r  "sHV 'wD"b !!cXIJV^Q^ hւh2(JҾz!6h%)_k)7)&#f s  @Jpqp*[? =C(r @8 [ܭ?y9+#!00 y j ;Jbߏw x) m#4Y 4w yZBW G []f>d  SnMY6KK$v @^DSwEO1{x H 9b3tXy-y~=ȼ ߺ%Ϫw%EJ M W # {dTO.J Etii-('ݩKVEDs+4;%>& dT(k   v7OݑVA,T:@HlrRs-YSZ$r׌tP9 o,gj#H' 6؀ۻ S _ 5)g. gM V'+k DGE dCGmG9 = Q"$EOw  e :"Ssqކ8/mX|(ZbQt:ve$j%_K`(kxf ?`LЮT~ӌ&=ێ #׈ۦm" XP:X!Vz^׮J)3j]?"&3 ػ-ynԶ`߯x!}SyW  J X&Ko -i8=O`)95rVج܌ :F[= RɝqSq۫d ˧g,:ӌj ީ.:̸և%B H+&Zou sP u!ycuLj[O:,^ < { @I$%ٹ+]StjHܯԮܞ ' VK"׍ Z)r[ 19't[/4pJyߟj ٵGg\@Lj;ٖ$3ou SJ S:^Cєk 0C -  ˎҢ0KWj#|ײ6YOPFCXPwHQ|.sBu[@ߐ<C~s&ѓjUf $FL'c ,` JJ=)/8 UnE(C :"2 k(Th& T ݙ.]}  gfH;" [ M Z!T ,8gt  USvy 0b1G \d S'" TB M19 s,cPS => <$D+$ӫ"wa V<~Vz2 Cs6 T < EIkmVa/j" XIB8 RZl,9 :&q   ,w1%8-!uTT I$ /x: &  kZ"$d>.Mx* tw| mZ9 ,Q*w! k o >U,: N} K x>G-)>U{ |pQ)eE)t۫C#q#3qVtޭX JK _ # s!P-"%I3cR /_<8(g @݁udZ| F\9VY;JM`eZrU%þTľ@ O+A՗۲A* :d Tu߼nf 96&Az5U`ϭT^s֬cU`㐻)~u,i qj+Ŋʾ0 [B' bm~ > asg5k@ \Ԙ$[kc܂Z΀(Ht%Ν&S[ =L#9 ;%ނO3'! yxK?WW! uhd' I0=qX8-S  q A MtM' ;"-/9#)\ xP[| % Q gp%"J r $ B(=OS#/@j TjYTM e!G#sj G. &]{e/# G.5;k!~ i|jbrS'O  ~~lܾm=ڸST=#i\}tICTfH0eƙщΙנ f'5A ΰFt5Y ޹9j8ʴؕ,׺ ϔ^;?Q  ݬl^eO|7-pǚҘ9f'@ ,088>-"3= O~5/  m% r _>X"&tu;;JO&\/%X? .)[6ӎ mMΗt΅]ګ}(S}  eL c/n ];x1M;z]H>ߗ~xnewB Rz| = > WE/Gs3* 2\\J\]Iv#'t?4 IYYp|޲nڈv ^aZ;vl=  U R\B6)$<RgEKb З=Կf 71ϼDŽˈPߛ ӒѼ{5fu]Wڪa &L O~0e9 15˕r.o~!~ڏFҼtߒz ûXݮ(ԃ[&EFg<˙Ϊ.XbݕCp0ջ^_-k; G^U0.Y3U_@M`0El)+7na;fr| !PH.:QgxL| cyw_[]SN0ΓͶ\ѻͥ`ܞ)UAj$myP٥<ˬ͏Ҧ1 ._>#i PG!*GGһsn#hp#e9{l* M ~$LU,X LN4 ,jO(+&& ew: ]E4\ #+Rz̮Q \ JK/x P gAOZU ^B% @d9FB6!NB 0+$0Gg'{'(C(P#.{"- *)&.T.M1, s" "Lm,$}%!)$ 5R%2#[O/ *!#6Ho 6#s %+4 vq2 !=> !OQ{ *Y(3w.$$(+T*R251C$$(#---z %-)@+*')3,2+-: %w13"H7*-+!j+ 'A3%DN6'/*+?+A<7d7e!}43*) z*>.S73*&&!#E)'x#& /C 6WG,)#>"i%!.&+ '`x=   i2L('!&dl#(97ZB%%?NC>:A B!y+174"( t `" "=)"R&(" '711gxuP ,&G#Z$rO9!(CB+f<R &#6w e / z ..&&&7U&~%]u #&| t+ % 70I-O &! T R %*Y ?P D7m/4-s[h>")&D>t8s=6J!()-A:3,|C  K" a+'9! ,'E q(?x xn1{ .!7#cG 7A+$4S5a7.) M=i T 5}s3 { w8 G e& : =F+ # 1l$!+ ;"   pM' 3Z/;7Z"/g-^/@B>69%w0q$1'e\0&3|0!6'9 -*>##"`BbK.u0 <  ;`8[9 E:} $bN]^ > F= 0&)cpl Y!8 I+&K-#K7[Cn!* l ( 6 A)ȍ?V%< v8uݖ捽$Ηgx~ڑYXqG. 4dٽ6 C ؋<0ps-sV~B (7CۤW Cd)ܱ.sbL5i\B@ 6 }B8Q9ҼtZ6 = pff #$ ݾҁb}%&t} K 1k@l@  '&%% +c> pC lTf1   =c q7D;d6()*aX @ TY7˳ӤͦN]Rf[Z4 ׵ās>eFD(Jo9S5|, =Y ` 7 fR\.;kz(  . y(p{P Y*Y Ycc : &x/~5Ip um b~!DA%$e$  ۬@Z tv9' F" J!&3z:n4v7ї't9HOy: #v&NOIM *-XRת؅e d}1fن؉u#/7(THf%E0ա6dwx8?c@X$ BIo>l3_֙A]jz.qq |#;ڻs%RS|]PײIx>Ւռ؏اE,7*sF%HƄ۰- @<ٚ"2e/DmDt+U!Ǫͦ׆1X)$ & XL:(`  #$q v $+Zxl".#&ho2(- `mg3; <! `#i" vjhw:Vף-H %+"0zjFw[6~j-?9=$o'FJ>9B+vuM#%2C ] A $H#fqw'.5-&10\do3GN D3 `K Y h~}nOoMD { d^Y5)%72G :g$V"p IkQn $~]:" % "*"'uh _ !  p '_%E 3ta  3!#3S2.,$A%+W/2 $&U | J,47'7 P!o 0SwM%a^UH ' i~\uy %+#R]; 22:j r!~57TrL"#1"2-/. ?-+'#(Z k K,$,&$6*.=7.l! 2*/2 (!0(ol$LD9:1>$J](SB3$ Y*""W$$r~N0FS\O /& C<}k+lF988<33# h < to+*3CA7a- ^ m! ]XQt7 @$ 1i)"196#k  A"njdFNV * _g {} J(! Ft BCx+@ k?R}\M]Ol~C$ *z4$&(pL"qJ0A}\$O?,c $#/L~ 0}ohGaNB۷>̰S GZ@LެWy3]߱=2$^ j[?ܽ,8<͛ͭ BRg( L y :2ۯcߤz.+zmiY^ fȒ^mGǾϼHCҫӃ߽Cm9S aǞoa^f`MLihЙΛ_D4l8/9a9E '+FF ,"l C W 'jT) ~/9Um"L5_ x5Βρ?`)I Q۟/\#Աu `$W/"mփۗ؏y,׏Gs %oݒJ as'sGGPt>?u"6 !,M0Br4fqlkL[(R170?޹J0r_&>~O/ k`n QywfsC}"C#! "YFsB$'bj-H9 \? VCt!߫J 3Ի!7 vJHۑ|kOpqYpҡԥ-51 s # j>D\y- 0'~0c܂C)L6 qyk-6b׺ߋߋ:.#I .؀^zm& z-{"oѹҳl!?ztאKNOyߔEč޻J}ٽSg קB5܆# %4?^ysJ@(u/gVJ]en')  qѶSo ]&"S&r lp  MFxl"p+T;7:5"T|Y C%7zV#ٖM  $& 3bhby'9(-#)z#9иՀ*!.,2?g;a @wjAs#*e$1po!+J  $ %:v#9". `]`2(-b\!RPQ&+, 2i~h|!4n43!C 6,83tebMOBeU[h , y j+f&&78qA&X a0& '=7J!%#E[ ($:$E#u#)N-!=! K/0#'^*[% *h(H,EuRZ^#,hyL6`)?MH2: 4U  ) +; !d%%r:_ ~r  e;z\32v554N T[H((s rzX!qq)z %GTs35 44  !":R?7R; l}p @ '/m4  2^Sg'L ?]w" '!$!p rL L h r#k  96i W,]","+1 C ~ M#_#!k { PV+ V k+ K  J=NJjd]S  R4lU(64s^]W {qݿ#u ()>!< 6 c)', x,Z]xA~a 2 (2m-m9"*E dA 9  =j"TMV Irj_ $|!H02+Tڛ_օ G#S<l$ P1ee Orf #-_t +:!Rul;?pB36>>{~% Kw+9oXrQMo y q 3 ^)Ս|(;7M8fh 'sz!o. iѢQHD5 p@$˂- #uH k ݦDk ݼ O`< +l+cv3\d>["C 7  %6u KH(m , (G$߰!M@ |#/S 2n8 "$X4 J3 ~ 8.x: \#'a+&1_8 ix> L5)#$X :o,.6 ٺ!$<*u %,Fwuhт i ?n{$!@pŷg8 B Q': % mS!% /\ /Pt -Dm  /93a&IGNughVw=^ -] 4=;V`bw?}xa(0jZ] iu@ ~$OqnfU.K"5~e#;٩A 4ОLB7;>\((^iכm^v#(s n^24|^!#R ak(5DA-tw" ^T_<#h i $BQ)*/`$'!K-C}'O N'/2Z'Xq n>*d2 i#`&] Y{Rdc 5bC% ={܌ߊRiYWd#rcЮ2WάĂݏ wd$P#-IO &)%l c[ sud }-HإSr.&P!r\fKT,7S;V=" ͸Ӷ[48r1ځ3q2 "Fު2ǮW6[^^ڀC M8ۭy̪W2TLwx(LLِ|I7 $Pʅqٱ,8a\YR <:7i1F g~C%iW/@#(fLf2G#A upHړγўH g Jr& ڿ 6 Nlk3 / |\ B y SI 7=rr־0A7"  _e|G9#!C&*7w.DT [N7nI  tH noW J۹@QC\D?c^[q  ZucׄW a o| ?W D[jJ^bA@ t7U|c_im]Qڔ  sn.in݉mzG z Fd#- H;ݡ + .eDD~n_ U- In2w#^J0Y $:q{ np >0ظ+EQF:?6$%l / 9\5Bۦ@rxRYԪ&۷dIߏwC [  qgeawK=JػT |7vJ9#D|s;H  $TS FH0U  l ! _m4>f_{eea2ѷr=5 un>uIv3jNn "j$!m  ! V!"0(}vPv,(^ . cC%9   -0*ߝ wA2e#Ymnb/|43   Y; UdP B(< C t"'nKoq Ldw!*o1/!)KKT" L h([+  5{n=km>{?Hˊ0hc?cG۷Zug?xv [2 e/ X#܍ #(3ny<5Rot% -u ;Odtt&E(81= snr p dzu !Sqo " _\@1:$8 "Y'ah'! F &#*u 4r ]J(',7 \ $y/J"i` @rI*6iu)x7'vF*x!F+S6=`ا{4) 2q #E,d٠N; zc ?.3Y ) I .ZPL)1 x ' 30 txht5Z;s7vk$nk .DtpuҐZ'+z™)ՍyH:=ٝٙ dCyWnaj]dӽ_YW%< { J6 x- J XJTP {-x aQR-wA*uXf nG 2C efE R> Xj9iiL8hu' ! %-t{k+X>+VaU! E%\#_lO 3 2   x&Ag7E[} kGuK_`^լ@"'_ܻ>5muF7'λ+Ke/e = J[s֊9TPj~Tۖٙ~7c &, xxMm T22  9S{%W  4D.1t 5?[ C5t@` ~Pp1eP-$`\6~6l$[8_ i  ~8.7~-b z|mA1l:a: *'L$ o`ݥ} hJ(*EJh@_8`՝yuTX4 Qu*& WO8 6"z#8+ g&!#K R"0x mfYBW9YBOnJuN!nw  h|Tr޻bth Uw]"K~  C #WZ|*'6!;(ZI \ $/$7<|5<Dg(*3>)9 _4e h]@ Oe % C$l;7"~ܰ\2#,Y%Jz h ^N BM%$! @ -. 9"%kC fcR|t XC]ܸ;<%(@+.Bp + S<8/ޙ-a#%=T $=z3a| {t|L׀ #S rlH(*8".H2 d)-"& B-48,nCP#~)=%%? r   558  L U :B,(*-(* ^  i+-8 kH ` $/6)˷qR'.+7z|2ݬxJp:5b)i ^h-j&p9 s /IC;O (`  g(<5\w(+-H$J(M0d7#&(( A)35 O U )*( s  o }5 X arY0. hx &! d X3pm_p :\lH  G b:fV`'j o\Ab*#y y2-*l*a(()D&((!t;$"@(Y%&+!*t !I!M  %M Y   ZBR 3 qolN 0ߛ--?e%88'0#/%&vw (M4i aZ`jR.( @Xpz"'wIZQ )<?\ >u%9 MD*>B !": 'A  t3` !n#ms߲p^!k,Z=")4x - Ny  "w"N%.u - 5 zY B i((p1_8 Y[y P# q  8~ ~ #m"5 xjӔΦ6l4_%-ۢ$r#)!{U GE  |t GL @Q " ,U] w{|$4 954t qsh=*C0/ %b340314. 803*x)mJ #" i? /y3,R^`fo)xeػS| ` W hqtX"8jX=< RAK P oh^ 4  "|Fي,'!g2<2  @x;9/s yޓ+3 hb' h{   D, i 1'{"l K !#cLr HD N&w` i , U~ /Ijc i& Z% _F 2zE@ ?]%'FW!E*X%fߋF5Ȓw^Y(&% Y`2Z!!T/D `X, Yj;|+=dX5z#>MTk%x~YLQXzf p(@( 0]{_yZ̯O ; =\xMIŭFw}ѳr& DX  #Z M|Fi F+< vtw % |oNR'@+FM4  +g#6(o1 n. 4 Z MRA ek!a$w8>$$W?j--#"JV"z)G#}M G&#q( (n%^&M:-2G /T*]424E1-7.1@9d7_ #20h10QtZQ=A @)!s#l<%)sp> *`.&dYAIA&b$xI%&0#b-rY + x $X5<8U/4 U-m!%22-0PTt'&& @F;~"$  )C1xnX/6(d &  $j)keyf % QJ>oIH(0|Fm@"Rv #p Rn UT&:$ ^`d  &| $, .j:1)S-hN%#h*( #0 u a<E /6<>'- st~R .tdm$& g5!9&ng;tG"_"^!q!%a "! &8 b  / E#5'" */V` P2 2 S/*V?<9޹00H N>  dv! <y'#(!o>Pk2#1h5X5t<D G V t>D G V R),N{D J rB^i'nQQZ#DR =q e /3E_  _ kjzB'B#3"^z:D 90lQ < :5>G} t"4c3Uj  M Lp LߠD9 } 3jq %/` X 9**& % dg; 4Z0:X`7?c'?)J߄S_ Gߣ!ZoNTO 6" U7 ;XIW | Z/w< j!/ajURE ^  AV3;̮! o z Ӿ4T %уђ^ <7p lG` MXd` |g` a#" ^%f`nC_:5 u e}:/ qY Pb*I.s.za/^k @  uvh7w BB.R/&#0yZmq 33cox >AU;%RnB'&A=  6 l*A)d k9 &1tyX(-pA%@ ! > I 2DE  R Wi?&*(@b%G! %o"4(DxB 1`*$"p7`! D "j$ j{5   c -*=[ffp_"܃<RP"T7(K',"DdGA 9 [K!@I{ 2 ql E O(.A|AL S-owq`sD@M [=x%E#+2 !B[rL>,%| +)%|7*? L+Uzޔ g&`9 ' -9gduQ kS1D;|R׶٦b67/ "S  K  bډj eS (4- _j_ 7/ VS[g[ w2Iߘby$6}!' D=ϛ s( ֫֕*0]>E/ ЏtzՅ:oY:ZIA*&8<ӽ=IpnL /4 cd/7@8C}ҷCF޿$x^c%s؂?p铨Bdv\zϖٹ1  xĪ&Erw-&ۣywI u ( P߮n! [ %$ #p : +5.b>pp6 8+-iWح P *?1Uk+ܕ{,ҜJ7sf԰Zy5hծg bupA^aέ - $ (*;YͶ- ,w}Ԫ%(! Wj-|)o\Y0.q   _Б(  Cܠ^9Ho M .-(:R<Gm D W0 ! b 3'U! T4 o Q-*t#Gf e7zn1#3W3&(}n|20"&$%F$O $-;!  1y$+*347 k / gz R#+j@b @I( S2"\ = (-/2#4& u !(Y({mL ` 4S27U4+ p51914R ,=s9 Dw.-9 R; tA'2-? P!"  6t4%3  *r  dro l F )42 {)3sn ' (#!*J?>U v .{f SWB% DzslX StqGJ hD8s@zC  J p} ; B 78 ru_t!*Vw6mPX 8"& OOXѺGg/C 5B%Ca4-%6m("\@w t{g2u/&vz 7 : ; ]~@:G )vLt#u, -.W-krT\w/1q')JG4&V)B3 %E d3o|VwVl ow "9%y :G~ !f! -]H` Jd }%h D .P] dc` =Q'#}?ty. ///" %!:R' [  *+q !u '-;}&|)A+dS|wn-X"g.t,QI * 6@/r'= 3Z-"-E"86*;#+"3 #6+"+76"750 3 ( y 3\-$(&2[8M&(,H$Y)O.$.!SM+D130 tk[#!!K%& [X 58ќd cJ /5Q% rX$g @ " < ^F'%[<[S# sKND:!j'7#(P?<H{}/cB 32@ 8~XIh  4tY# --+>:,yK/fq "#@*W_)< " s APhN@2 Kr=GuY<P!-Q}#U t' "+ I( *ءO7 h0E & C'tW'c!9:$BCHJ DT)-)61.r4L, 7 >"%yG!2(+*  F~DB 2<ld +!$$$s W% , "ql(}&-,X1LMK*+>K|sMd!yM!  P]j} -P $o XI2.Xm$#%'E .f_F%7(H S$:*#e%-2U"%_  Z 7c aa / <o C(.$  K e r8PN/P $*!"EQ=$:`)&2 N#D3 KX% JI%&w-$?$PS!C&p  H!)VeR `  o w P=4 ) 'w 6;e֕b; !q?/, T< ND  UxXrf :!sFq:z "M +G, ^: " : ;h W a*,Ȋ w= r} = 9ծJb~U>iHp  [2p1aA'  Q  % F b  ` =2[&w!l؂VNr }w gQܥ6IWnC݋)z_aJBCa5Q %  # 4 bJW 4 } q lRu $(L),0{v x M (hvXs[, 6,#eޡH 4T$E;!)& #0&c&!#K! I,H2"!Sk$'QQ&/{*QMS; #`I Uc.z)m  ? pUl- M|RF U 9V|~ |Y,(S"vxK :^z[ 8s2])-#(&!0c*]|d.*-A+ n42q+Ba3,'> p ~ I %1&8 3 P"?,<۔g{n*0((%&,QMXvX9q$$ \_ 7F|GFeKݙ+  Uo nQB70^x") $ T9C(l j/r>(z;q s %(,<'!kd4 052rTA4 XO5f %g"Fx S`E]_ V:/O9AsB6(F}CMF( \ v_ptER5nE, Ru .:0A" "" Vz8*/  % | )7 !9  dfrm.X"A4-B.y #s |2` e  mGl2'o c .^ L'u*'AjyP| u"XG׬ݹJACQee |e2M^ ?RkH L2 [ rЋ e:G98*"u/+CD 3) ]6'[W9hH\hnkX  ?s![ z-,@w,T\l '_ΰS}ԝ 2o6>&D]K1"Q"ek1 Jpf}t bILҞ `)&] !3|RXH  wH~v&;*?}("}nd @30ܒx.$VY pp i/W6q,$Rf u&[}/]-|J}v%. v r*r!a /)E] C G u\ nXP`^Yee twh=8u0( fq FzquN#?#b} nCNA$-Y 1 42Cޟ4-)#6$@`PVک6xHj+ \ 1m2/a/4 p89(( 'J& Ʃ֏^ x}a ͕? %؄:IUeT!6jCNPeCbIČ`+Fxݧj6;-uos߆ 8 mE0oܹYN" ot؜޾9ۍ}d$/ {&sh/t <% 6{G- _  nlpqm&?<- I RK j: 2A1,@ PbL3 a{akXaPfrk 8 YQmd {qQ )p+Ddۦ` C 30'?#o sQL"C =h e;m#$ G# P B0$,P:A)9o+ B UK f @#m<  "2S#s +/!,M*.C,_/>"|G%w- W+ rgfT1 5 fS y  =F_t0F!${^o%  \ goc:N!5 bwH~. %|VYz! > U`hpu $8T$ PtKu % 7U#\6+ .S & (qX  X'(2h? Z"3`5g wk:SB  iO . 6  aTa %;fjt y+"JcbN)%_߰#֛pL)^ ~0+ >in Az 6(wr4,  @!k2$.1#5vz m>&l  >_D^'/(Ḥ  M p+Vr  K"v ٗ#<(?;)"C/תf  J(Ue-X u  i &M!%e)$88 Q [ JfZvA;0dh)\ n O~.! #k& :**1{& aXQ*#0=v:(y n+ !  )S _A3To b4P"e &.Gr>#"< DY_EsJ5%>Q@S>0h{a )*, ;c?~\F2ppqk.K$o' >A0z] D6N1" z  l;   eF+22F؍ TPtBNӯ\. vfKD;d#"|y -OH8 (ͤݱߘ& #!ؽ۱Twv vWxlډϟ* d]0g \#WEDh \RѦs)p"{'r\!_v u(QL\X w6%aH~= ۅ;L (5 A%T auy1wq;F3p [*iGɻl6/)!XMl%@a҅J,i _fb/$VA hGmAO 3r-O 5 S}.^o2/N$hj&gdO F ' = .]p3  P q =GJP1%|)KEkA/eamLVނv 4K= .)i]۬j9ftF'j  J5ZK4  $:j ҭ 4 dհHi_q~sQr0Tw?PSG܊U}3RtF8,Q2]b#3 ?FJ!H%6 tzb}!cpuY7!rtYHQGR'r۪6kb^rR{vs?mߵ8j Aݳ0V;5QH (_)| H a^i V=]A[ %ng  < (]@pR5l;g 6j`#B!q K( / Gr8  \z߮% ?u݂ TYcmMB| u.  -Z)#֚=!%zx= K4vfbM a r SZ IWK( 3I&?/  1T@ ~(" i( XP ~ gX /, 'N_A7 qTX9sMC#C'W'򄾡  V]2d6= * ?R'"r3۳+9o NO%+C\ ي cv 6kހ 0CJJt7En%A(% !}(O!9Iv 9R#g{)@+v$qm=wZ| o=Q b o;> qW b< <O^AmC >{# 4!!2lxDT1,lцFnDSX2>u1zN Cb#ܴh׿4c $L{Cc*0 WX/B91b $Ń{u^bo#ѭB3ޯ|EߎY2*bz m]=UD$sӁI `nWYŞ?^S&w2 ?|V7Qs < d A o}\Tg k" KܘV  <i @. J& ! M ܈ s$<!p|p. a"P̲" !} 'B W kc RB SY 4 V `Ah ` H- K( pޒ_LFf79}N4#ܘ:ީW-K׎) 2 22чZ? Me3ϚڊpEyJ(rBFdQ i3v FDC]""w'`ր#0S w*pDjmz N͕iv7HS'v:؝u -̓b[]y]\M0Ƞyb9"thU՘0YFݡ,ZߟbO _-jV !t -'!_/Y5. @!ޙ cE׿\| z f1 |ls Sp޾5[J6m{z/ Bq) r XH'wwm jN MLPGd]W'f 3 ~ լ(!g95|/b$3@Em0\emP1M<~ R!1o0+O<&YSd>r Y;ީYL]Eܮk HMݰ(6^ ^tĩYػAR(U,R :%ܤY-K1 :n|_V ٝF4<Bf2  zBވe q a6 V  H z~Y1(,4/$] U0# 9kUw%߾`/ (Wl2 G`   /*ry3 6 Rm#;Tf8uc lF (%( .*W0!rݞ7C/yݠ,VT$"uaK%%^ B!!" x&ݷcG LT 13j.H ; N( ,ݾq #n [3 ?j%  !0 Ԁް>U`erޫ 2 !8 >N$/?"VyQK _LLl F+ t3{8+TWq:vB2ސ#qnlP2>- b;ׁ* @wݲ|[ k'f) /Isvr}m Ue]r-E!YBlV*N1}ĸQ܊v߰#ᾟ~KRd$I]sbLu$ 1z(/m zCzc*#.,O(" e<&;2$F#(&NbHB2UI )@  CK/1  ~׽D\D+6b3 g L e Fbl a"=XSu_\]Jrp~C-!u;EYg <,$]>GXs 8(=A S5 _(<A_Y J Sy&  o m l;$ y% h  q~y:a g#00m9-c&$)J,"1 P M4 P , d 1)n;&(("-|&)19|)C["uk)K"[ ڦ; + f O r: I nRi&  m  L Gt @| .6 t  &0(z~!, 8 ;, f %K/D8W rS+3&,s"D  #dN fmx]:v(7x fi':rL* nWC{(RP!BE:1Iv׭ y\g `$ h ZR$I d 8<* cB8.pa tCF $%V :(;: q$ t"%! o b ^m+=#x- 1#P ".*( ܦ|Gou o$,6 ,%{o ]Y!oi}\X ;Ga+S+ҫ[-qWwJ CLIN7a R-%w>s}B_hl!t 3 e|=4E  oS 3Hލ=J(h~X΄ \,ܥmmvvث^Z>Xj:q Jq?Ac jD1՗+od75 c|sBQ '4Ղd& f z is&|l!iZ#!H"*0( FmRV2$4 _1 On\ !xB5OcfَVVh ~>p"40; ]\AsV>\~?l 7 k Y 6%$I H\ : b/p|s n8ۉ i% =g4 gH0! K ; $F IַQ  6C 4{%Cx @-&h'1`o& $:єֺ pݙ "*UF֠X:X_v" > + h.8ttL \!D} O9 D dV$A mB|%E!C% tQ!32 0 r2 X #lJ hx2*@"G(< r`WJ2vv8 O g7 p 9Id/F #xrל]0+U ZV,k. k@XX! ? " 9lI h<>!w! ~_ ."ny\} L*p$ Bk0V7(sE{ "XG.c 1   E|; FI0&.&Z -"% , "@X $C{2>#C1 > v QdH2%@~  e=.ވDH s*ֺ6. gpJ xm(n.U evoH}xg,A73@_7~%:"T  J  K:9 '**V~wIv80y  -+G]g WC[AJ3( '~ . g&!;-:nwq<@2 $kK@*-B% -{A a'j ^W  /WX wfS\64 "r  7 $H  K #Y2Y[/g.w"# %8$w&# ,B+4. | C"v ?1#}L 0+ ("#kA'4#!q !B2#>-#E $&t ,Rs C%] %rO) %Y' ۶++ %~V -)-v? hOt40+A$uQz & ;'40V Je #  g+G%6;/u0X%%}3 r Pzs (F !/ Zic c) t0 (!c> h ^hY9(0 q. ![R &#i  I\ A35:@Km#"}> To 7<(2=}X#m,p'&! u\P! T  B , VNEU (?( \%$<=75![ -l--NbC6_,15,J1c^  x l+#?Tc%G*?# -AQWpg ?T d >K ߷%z 7{ ]|  :zTx34MwMd Q  ~#](r .'#80bOp 4' # L Z!v EWAb3ekB+! s0Y x44,#5[6 6`6H: @.'u.(w  !.f=$>'  Wn r.T2 # a-Of# x9g 8')wi cTN j *r `f X(!( ZV n%>CtQ)]$f_%") dS@ !oSE  y1 o:y(RoV! . ڽܢ0 Tqת '=0 BB mk!R/ zxNa q5C_zL z|B/| T Q!RttR  M = 2iY Vd|quE.` B)z~+ %)_06/-p ! ~y9=xY޼w U\n 2< CԖFS{ Y0){i ث|;) *g B6 |+ "qnjZq"_$ Iu1kWF/NO  De ;R յe Rۻb BG0ɬ 8!  vt…̪Y TTOV:,B2 d;zUY oĢ3@xIbfGh{jV[OS Z)  N] ~n=|-; < v n4/NAk sCԗ2 ^ lDo & ` 7_-3iG(d[zZ~*Y(X )_p ? $j5 p `mB.B &>l!3~}  q b%5x z 3Iv!=VWr+ ,kx^ ' ^}ZT5& (\"  d6o< 2jY("0+%l.CN',#%Ws|3UK 6N:U:񆾎8ݴa}VЛ1 xt{W(ŘV׹ٺA6 C/6|ϐq}+{Dw ֢RLߛ8A߼oԝ&]ٍN P Q,S;OU$MiF-"hh'vV* lM3_f <FNrwZGE#4$VmIۨz N 9ݺ 5&-jYZ)[17=KϷI$`XaݽKfH`cl"&uk׫5 HP1Sw(? bM .  Ou  E d t 9 3}\ o ^L11 #ecpZds U O|ڑlw Aڎӌ"| :iɱLȨ ?SEߴ{ w%,'|Kbhv's^ $} 7Z  Q(PsD@#R) :ۺ?^K U`fF ]z- PS1Z&0%G!i|l O-A/"  ^Ne$!cxk8^ !٦ք/ $ N gZ8^ p3fd> &aH0f϶ 1/1kT$O;ߜ'm &&Dq0/$P ,K4 *6 >h 8+l | [^8 + M3(U>&["V E7%|S FNt N&y7t }n߶F0x ;I.ޝl9 gW95 k `^|im)v-LHdR"6L0 Q #/oIK^Z\ my| ;"VDa>Ff {!% K [)e +  6F=%F'  0[M .3VHJxP%%d6P+7 F 2c118 ՙbVFF*4!.  X  ^o%=VG$u!/07 5 2  J' " z e 4apێgrf*8 m RI Wo:ߎ߾9 V?V}Li""E g ڛ  SDl  ? j(4$/Ք $  lV6 : b 7M_6 K H+OK/T'G u . p  wRZ'~! +t i$ W$2- @;b'Tp28-m { 6}i r2[]L6"d 6O>ا) m݄$g ޗlPmb^qlF>M  d7k<5kd ! ~[}JZۘ ^r!$W ߻ :6 ~LtnBηr_|fl"WmZ4+ }dSٿ  g/3,;6WoX~JNT  9 8 #m$Eۀ!j$c I I (D 4B^Salp $Bԅ<9_G d8T fk9Jβz D ( pyeۙ'.ٱߢؠ^ #Q Zpr16 ,|' ! [#*y[$/sW[ k ow b8x"ȼBFD]AAGtY)g,w<K̗8YXzMO~S1CXeܯ۳yrI(1H}&yZr GLsqϸ 0.p9{ b%(0:6 < ( )9Fa,D++^Xc M ڱ4۽+Jtv?D" Ue.s}d@O3}Mnm  {2!  : ?b{<4!_! %FV[bJ$&-[uP  + 8Q4~ OME ݳ T{/2".\gFMLC-hU 9-#%o;߸T2@ PD=xqR'+Dgs:PP(*17T=[i.)f!@Z !Q[a7;/OMx"K Z`5aJ2%4?r--#p{n&;qDo)X0_)r6v-l6$cܮ^,@ %*T<8}wh j ^ RXLA -L 09: \;rz3?!?\g9fgb.^U a&8:^K$+7o]Ձ[,Z"~{G!w &L$!0<9,#1<- ~H@4i<[,V.0H!aq  EV [+ xn X  > | u j 7Y;= e k(F|+<`LlM1  > jRk*w(s 1_ 2#&(%)O < & >$8#-0HXcR%R&=&'aA 6f@3@sS*3(?["  # .2ZSf"X}{M 5A  cC&+ 0^) )'/0|-N ##&'/EYP O6,M+%F@*( a >]iIn x#H% : E G٠S<   sk&- Do]֋  \eg%*}F!(\08(#o9 uO =#m3:'"$ = ~0g/e(Gp R2/N)Y%'g#4C@$!|  S ~;@4Y܀7)2dl$`A]aqh1t H*=j GTuk *~d#!Rv|OQ|Eڀܝm "#g^[ۻ;Bu0P+_T'UxU`)r (;Cx  ܫPu- 6r{ʣG ,4?5Ts F`(RִYlq">?qߊqU# %$v܇Ԙr)%YJh1C 2)]N YK6 P'nٚw*9 uH bJ5 r}ƾ'Y0#Gix :}n%P ?wۢ' < X!yCL ?xP! pgBl)L: ~Z'q^-3h!9*,dZ _ ]HO :+)$~?" 18Քb"hl$ Q߯_ue]AJ >@5yL7j͆ `}Xw@B,[*(-qܯ8jLHZB+0 auXNd1 F KD T } $H "=K!9!߉ڔ<\*qc_M&4[ 7^:ylI+9) A 5   G 5 "s& hEc;i.u X Y]; n sH  zޏhm> w+&! Mf T _R }$. W s1] !+&B@ z~uN&b]k#! p$wH iE$ 0!f a?>_ ,Bɚ׋T . pQ  Qdnx(W  W%d [h 5vGP;#&} ER yT<K(BZ%1!@${[_ n /"E)4,%4/:9|G<v=^ x l@5h# #1Qk|o. *k;M/!9(kc҈$%08 s b% f\[$-U D  !T)=( |^ W[S:  e Sޙ! *9 M;I*R D R U "L#3U݋a=-qafJ(}+ P>2A &2!4Dݵ" J4 a)t9 r )Üĕ/y ,1 %Q<<\\~ҳ4Jx( 3hTܜ=7=6C"(ܟOӧK$d V@>4 (e(i"?!%^)m .wc,{I L"_!!}}cgdF&,e7>RQ Y09T~(n$/U}^p ?)M y)>/f  &p rb$gj!)GR'T4+*WFO" q !V#^!U % 8-LP2|DVw*z</TNQ  5"/p/4* w<#?OU! pu A;| Uw)/J{6A( 1 9NC^RV@Tqy *Mc%  !D   m7\B27zFSC!g( _ -W"$!"KsG O a`B EJ$&D՝~,lGޢ=:R(#*-%wu ?=\5}N  #yh?lVhilu z ? 1l3 !  DB>n^ z puMD:Dex:8 6 :N a%cH}  E:UEGeWc( 7ߴu# 67%w g`  '/ݲ4 r } p"Y{ҁNrO֝d [0X=t6D !osS" $]/Q'+Fvco7cul5T$( ? %B,r(4ui&5k*Aj+Tp [E S e+[  k )SQy~jG%+ $,- 2D>g?e R^u/_W$8p$tru 4|ShNGA(*XQ  1(Tz~ SY: -m6k%H GBTM-a#* )bia 3 GP&#] ;o;u%{$ 9A+_" R{=M?SK@IE9"!&y#d7 #t!#+"nͧ>Ι >(a3`  B8w3 .Yx u   uGo (LD/K4 #Y Q  1"\v,Y #g4xr%,$3 @k` ,<  KN }#x_ * X<,? ,{XP4,p#&!< E,_@'%9 >_deu )dTMk' <'  8 E  nc* +K dވGso, {M^9&q$'6(g-2F[xR u( zY)u CAyV U.9F}   s 30oE c@~ a X a<L z[z" @#O"D) 4 .*+,2!-$n ''o Om -1APD XJerW _  F { ~B  09 ;  sO*N" 3 %8/޴'0IhܬϢ A rS0 h7 ~TM҅FA0| | d +k STd , g +,7LtRg:OAYY$^HU  #>( -/ .-!X E7 v&1!P%o Jٸ4"E* LN1) $/) &0oo2*%.I]UR),7#g 9p%e  8$(\ g&c$X^:H:@*4.^3r#DT2G$ 2ҩ'7>BKN{;V [$&(g.K 'Wlpdi(eVc`M  ^@9F iKi-(2DNq[9DH $ \n^<2 {Zq:^s[ P=UV8Z^#H+/G| R G;7dr-dAd\q2}iE-|%Zm;ą9gh>]ű2  *h]J "/a"`dex )$2$1qۛ W1 !? qtکޒ7^iV`:/Rfxf#)> ` D;Vc Ch"v -5D u $L im+T < ,-JI!w$3%.hb*WUP --ge@= S"Q(!Q)C :^ -a@p M%@-[ ] g P N$^L  9D ^4< aUzI  g Y?YjDa@!GqU}Ke <qQpF Pm8EpXyN)~IbjL5y(3gtR=q fNhfu/؉!ҝ@Utt `^_ "'QT Z/n  I\۴ O$GauȃNv@o ="w!viocy Y{> sQrz|w by2$$&ufJ2/;%' S .aLn &D$ "Dak  ;$xKy]usqFA4_X C1.Qً2-< i ,  rzY/zޅu r\ ! {Ⱦ$ڻ?Zx# F @t%r&-Ҷxa' fߚ-( C+cA832"s}uy > \Neh Ay]VI yEtZ L10+E!s0!hE@i)O4X(GHoT('@0 lp  ؁D+"+ I<(b \Zb 9\q_6f"#q JE W#~-"tݑI{ޱ  y t _o('1j|*$G.-8!$3%E  Q d  (, . /16r"k,*f$ J Uz,X2f* '#H r(d (R3w q'#5y]^b3a ,"RMU٧p.!P$"2"H K#-_`  le 2 [e@9$2?$P-{޾=7p" }+oQ!y30PF I %*U(&6#!4z [Cxin .-}(=P 3c+'D(=%N(D:mg-A*s:2b Y#i .w)0!+c(V!Sm F=q  3$ "'  kc";6g.?%9!/e+U.]70!gh@r T+b~i6Y6Tx) q,@ hGt.M5!5)pe$g N(f&^t+v- p&Y^  @ 2>0 f  Ew2گ q>q eAO 5  Qm`",} {. W x ;Y6=fjklqYVW/d,0oc!QcM1 WG '0+*wG=    hR;+ )AV6(X*s##w ]i (j(|$n&l&`G,vZ&{/V$!x#p% :Av&@ Q }H|vR/*!0LW"J[ \& =W  %$+')# %hO!3:'(SYo2n:E -zj;M 5[mR!M%"q">7^ D|>>K30]& p G C ^VCS,\* c7/FJwH*.n׆Q&7d8N 6w! gE%Ee ) 6;  g,~ ^ o ga ? rs . @`t;s&x'VHw [Q gJ t2h2OC,Zn9]y;1sQb4߻k Sl B5  421&C J -']|"b_"wW,G|H&f!s!B[, >)%*&ە 1D"q|ߗNKRH Z6]A\ e7U2xBSD:7 P in  zDb Im o KO 4!"na,كk_1^ u"9C Ar72 =3|Dȍ5L8unلşJ  yYr٧Չ܆c~<1_~xva˪xd w~0i :) ܚ"TXQI tKx,olS;MQ K Y; b08SXu!#ik 1Gߑ UQ /Uy& xdZ 9K/" U(JQ < hwOڄjW9qό^l!z6  ܌$܄vrjڠTub>}vtK0ѴXE![qFu&#M^HZ4 |c6r7GՉxL\.cHc.Ԗq,)$!$mo! G 1^;iU/ݛq7/Y,G>rsVc?ܷޫJWE3v  ,3ٰw35}K!W! - FG4Eh/E  'o\ *ctk"z(E$+C,(pg,S -* P3PVl KCڋ$*šf'E=WQkʂ;\B H%9SWؕo_eg%1QO?. [/j"C2  AX=.&2#q% i  3a) `eTZL LQ# _f-Mϧ׋ ׁHb3" 4q QwA , VοXcS[;F 3~ ]yCڟ`IEڿް(d6 UaWF >_  1P*! V  >^R   AS`1$lQِީ5%&#Hj,[.9q Q*/> /MHS l!#Z?B*Nc0V[='#2b!r" C9 ) x$W# `$ c^? q } ;.6C!M ? ֥$L!KLR^݋1` 'Zw(ݵ'g " X]\7{Vf ":  0{!+ o)/<h?% ZSAgj %>^ &NPs aWDf Ge Q! bd|Q#cO@!kR 9bW,&Mj,;D/=;4|& J  3,%&0P 7v z xb kdnf_o? /( nȃXZ   8 6hL} yR7Di+20r]Q ], 72[=%)c rݘtvY1 )o5g^ z& 0J5*J7G? ٔ[ IE lea M fa:SA dhy: I-[^~54x YV$ 4^!=iOb"n  )/"}@"NAL A14l"7a`!Hy O&>Oe O1u $$+aFu w#z?((>-zn *r 4&{w$ld  9L&6~ vbJU3??@% %(9#0(~6Qn/#xr)0 |  ͒H j F5n 1 BGFW ?wBK rbpcZ 9$@Z!z0ރK >*Pi_:X.9^"ްX% T0&-s"-+ 0ilV #$[ &k%>2 ' !PJ -" -R%)@EMA=:#JYL,)C g  4od V["? e fCe Vbڇ*0 ]T3r 7^de#~#A~^6sB# مKjd k3 r $w]?SYx #|2M$p n@8FφLv DҟI5[X;/8N X(hy,c݉j6L@7  cT (sM -K b Y_Y 5EfY݉6ce^~W~p ~](6ܐx & oBPVV1IժM.q 6 siwXw$7|>,P emxy_ ;"$ە܆k;W NqGiKTi&S/{ )kvBٍqI"9 ?[D3Q:z[q] ~ :q- F",No P* $Nj %H@{^M. r4  Av޿Ÿޅ [i֕ؔBlx L#K#h4o^͏`).@ݵNy *T4|q' BPx.20 TZ  ~l*~ 5ؙ [1 SJ[W9' D՞\ UuN@)ٻ x\1F 1K z b~ i# ? Cb KA4qCZߥ ?_ܰ gM "{+$SuG y eFF nݗj; WZM &> 5U 9\$$ +MQ<I-) %&[wb2crc lRT 0] }(- "*\CV+PuPfW-Vޮ#$e ׅ^ " d*ւ;jx*? \ T~"7( }&n+]jF;-o $"r8$VJߌ~(aIj l4,"@ g f4 V{ּ|[[Nn\b:Lz]>Jaom/UOn 4o;ӥnx'EnE> 5`(xk'09%I,j% K%S Pe9R)rr *!ýaI{i  Օh֓$D !mprv uL'V7GTJ(܃HQW#Hn Z2 yN&C R@!Gۣ*? kSVf' "35M;aR ,4x߅=4ۢo8/l^FO BRX1 F92A SUkmuvY #AK Q U >3 h0 [l{Ns H(T-/ 6S8lsE5a w $KZJ)3^/)Z> Ct١0om+"n@0%xJy 6 M \L)#' w}.Gcm&b_TK@,b T2wNo#%1ִ;m5oS>0;1 Y^<$ϚA})) 'C$jp  C d uX \pH:ea.N<g߷W  { >Z< >r~`֣- '^ x*KB"$ȿe0x7b؍ x7ŶӋW-,Ib {k _ h=j * :5 [D.(OEyQ?&fN3) kzo  LA M J qb ]! {F a~}1i?:'߈ : !߻O~)MY Gg* \)^ KG ip& &M  +  ' / i9AJkd?f@5k!b 8 2]1!1&y7C& 8XH%o%bRP > %KH1 b  ."\ ZbV Ԑm7YW(-Iޕڏ49#-:,.. j I1\B\M5&*T  o֤,!^y?!ݿM7+Z&e@\E%(&S4`@o` [ 1h%#'X<YN!  j!o)v lO\ )$`y|"  .81ANi6s j e!sat'z'|KU"!7tԓ/ 2r( qqNq (R{ K0 'S9;RgJ bWHa l  h j/Rrz; &4Kn=ܩ+@)! #`ڗ!a TBrH :  #)   (3e)g' P.gPsV!&N.79MK<_#_'x$gx ![g  qv,*YBZNشTh  [ f =X  b>@EMC+\ `"4cͥJn3p]6_ B4&U( )SLg~/~10 5 jŰȳ_ |v a1'v߫kEJe8d5'wB "Wb+laܑW! ; cNLdEЕ9]VRdzvOl j  ϙկ FNHOj &"M>(  r, /O+ߋz؉xv Ӟ  AKnb#gM! OJ ^ 7 =uu0A (р'R[M{bwܹߚFD ;VkW'+hUS $E\s } Z+w KK_7Ew I|r Xj$Jc' 7 `2#Q4"R]}s  jY2!>"$3+2``Z %X gK<o $3_ T:\Z7T6"EVVr, x Q X h / O (.11#|6Jiqn:hҏ0kj <W)vfu,K `/' .Fԡ%6X SJ $\ ؗ 3u{dbk[q qtN"B#&&˓g")?''By.[ uW^yL-f8+1BA!h~k J(F*JW&{?-=,t)!cb) 0gx) 's !W%'Ts-ODiTj6 |s!j"ay! Tu-MP}}] WVP CU9824m$OP4?/$u V ۿɠЦ .> JW : G-14: Q1 1C4& x"*7.mYK_1T+8g ; yW gkWp M[ _TIB %(~V< Wo*-$^"+PU/ w!'BBF| ]   (n  C :} yW"T$j868>8ES\_7F %j Bm.RY  yA9%6S7r)7:;EFsoX;[1X"rf-G$CD< =m. ^*'*L+"!)O o~8J7L3{B9 'ڞ#,%  % oQa#:efL$T  'j'  *5La <6 @[ AO "۷Aaut43[ g$$llU:4&!!"& +!50 y  1/ "s ^Rr J}~I M St=;`#T[K< 5r)R63{z TMnCE:ծbO Q#   خZd <6<)Z(j7~'M+{ #. 1QW q u a* H0&_H.)4] h >T(5 7 <?#&6 p !5i9>=`j @ /< c  a Ey$ !, $ gV zmr'9n &)pN't$92 S 2 k8!3$4a m )]3 ..(]iLhZ  ~  zz [+&^%UX=2/h W   gwI8v 1 ,D]  DV04 ybp',_ < u:O1.v!VQ k6.\~A [ JP#X(uk l3j3-#* ! 0{ Y:!@* ռ|B{ Z9 @,*lxU K"N H& *b!" Ex  ']%\-F <$UK BG ?Z&} +X#i >݃\  Ho~C.UbvEL {!/BGKk xd \z]; /P1CPk}@ 4i~ &U4,XQ #xXJI~& Bg"g-J RAS>] l߅T ;=a/#t  IF'KWlG 5|0)MR_wt! f݅@&vN !".RITx Afګ_0f%F w/.8(E#ܦ;p 4ar75| 'k r N @! t?b<o 6wc~8qu _4nExIV *=*DH?YZ2#:ؓ5cx ef@ ބĤS M i{J gPq.c 38] o   eBq  Lx֢2*;&- 5CC %.&ne! G?L9<dE!$!?dߜ( =*O$; A ' U y+aLH@P ! 5 ڈ:l;OG= gKl |6/t hi;[v< ie)T W'T3lH2v&_ c 8Z%+#xn}VW#)$ bp  :ip%D *҉ 43Ι<3B< [x#F5K`C@.G { 99?# 3 Mi] ~CܾT  + < * 2[Qt b2D iX '& (DZ oo"&  C 6*o7;GA Lu<Rd: WW4W \ :"Vsg = !}W=uLr5 #2Lm$ X_*$'s/Q/r# @w) W ]EO  IFb wx <z  .LSQ WRM n&L+)<&'ZJ]KXx 3 pJ ޕw(4 Bd${)m,'nR ) 9*jO y fRYpc%K .̼> }B(Tg ߺigT5HEp ) &js&t #{#F= ]PG >4/ZwMM,8gloSAy ٸ[Nzkz ( I lMH T-F J}~7Y$ 4/>6B5, YxդD M!!1HhF~(c;% }  u͍јШ4'׸pD'\\@>p wDybxG{nK Q %N( $ }%"i "y 5 o6F3OFTH )0i veKv[(Il 94 }S|18d! 7 rF"C;(T-+ROi3 Tw`(o(!seA ؏D"Jd! gGa1?tP y%z_8 5 { ^wb m9 . x1ui + ~#^7^ [ pd 8&U "x1H [^(58v#L S0{ioL8p{O 1X I2/ba *i~"+^Y; Py#5( (Ǟe yj %n/Kc}\  ڇ%К1L ^1r p j Z$ 0Xur NSj2? :' ] \s$X ?&m՞ܹx`adV~;zEXj>4 ;M DB.wdL ` $!kCf 8 }}p YR7ާE.f3+, p 9; Iٕ߻  -0wN2 MT ]< G w}u K^EMSܘ ]ڬFBY?l4q=Y{ Un' oSFq+ +\O|`E<V]4SsH RVX)I+~ +&Mb1*Z)W  ]jD^܁_$  JW2 SV n ;g_CL2#c6v ) H ?  %xLa!8W([ aD/~&odA'L` k l r ] SCF mF5 )<ߙEM_t- L,lܡ0n CK͍X{P yRxi3X /, $p) WRQm J Ya! A{9 %O W&n-ds$Jbm879 #m; ZL  #~Y u  /*RpZii"+E 5&}hA  L( $>g)$"= $ [#c' 7 ]<#0vjS 5Je+1nD]TFB6*R08dؗ xGDQl2:GF 9 >+]xܐx2&}T"?B_9  \(9-\[i f 1 cA@ y 9;Еo = 'w+}[9 rupZ,7a0 >^ m3,,m$\,U*~O~8H/   E]BYeUj s I8]F%ߓx}+E( ,6pÄu(/[]6q;sY #/ U &IN~'j }H $u: M"c_ +xz #Vmc~! 01(!#J {@   X  n ` A 'nud)H@Q'# C{9 lKF;D 0+!}u/X z-ߍzHG9=q\N@,/6%f F | ] %D/D:"#-('%()+O6)3EXc;%"/!s~" 8 ; Nj 3v0%CG / &  8Dvia,2Vdh^$xz-6Ol<~E W;  WD= g( 5b ?C>l| /  kAMU&a~Wz YZc#yP`u ) UVS @"!VV'3g3^eS$8};n)}!17 {W!VZMZ˔9 & Eplo gZ,!VڡoL߾  V!o wb t}z > |y&(B g@#{5.8zXkm^ m !ae!# 6 N  ')| * 4I?b{TdYWmѮ}8+ny U1xF lLazNwDG$ cǧI a t.dZj<5(7 8, *d #{r8 i% i J  \ZS$+1)H.F FCIV!Z e @ FH}r</(Ru /<o#$v -/[+) y4 m ZOb "!p>#JZ `Q bHl!( [  _]qՖV {ءz(d<lu^MJe mCEn9T ;> _7 &HNu"b'$xT.w#.T!n* C `` >b l]<Gca % Fi H<".wvMy TCV|[|K (J^ 7 BM$N/J#OB 8Rb en6@ i 5$!XM m[&%];? 7 B1R #Q:3 ^ O ` \ :} g>!Ov F;_޾"MM&2w &^ p /u0"iY Fe+^;  l !Z$ ;6Ck6bNn8stC'Grl& 9{ }* 93 $  9`  Mf>w U=VhK}) = a*us;hI"JBT !+z*gڄ>`Xav1 (d OR&P 2,jy, {8f%S   dWa?d =y<' f~^G0lDp Qz`7R &#0K-.(M;R 3:^bogn.ohH<߀ZBfCT K DZli FBcf< |I6 i U.50 |, (  $n@o 6sh X6.@ 8 nCn]d= .%? tO1ڵj,],of  U!&Zv S?  yA8 43, 5 0Va.DQZ.# )$6a\Ϩ۞ѥ t CV4y a^@Oޭ68XF]}7+ l\B S ? ou 4a@6,/.oVv ;.V?i@59 jW | Q!2TZ)/1Nx I& ;ږ W9+`rֳ  C;t6Wj$ ,;$+iYP  E,  8 U w T  S&]IHV, LjdH#8Xvt4TLimZ ztH %2sP OK) o6!   _ P'$H< Mu\ Fk >z71 ( 1   H8i b UJ#nhkRlj#^1`jCA S" RN4!  -wn  8`(hJfF L-h?4 3-J -H(X X* N:N S =  Q? {xC-&6mJ: f)`,vt 4DCuOkOHa$45( q_eްp\/ '%^]?T$!H ߏQ 8$%lo " P[+H8h?  ,9O^Lm0 GAn86 J.8=S߁ g%GԀ`6?m V; |4c֊h)/@ iJLhs4  /0|%pи S^ 8x1RGH0 GVlV(ORw 8  6FtI>T$rF ~(USF E?E$[eNH@ `"M}`V ]K g4^#)B$'" f 2 )b#(ڲKE \&W Z*m3mQ[\* nh` -`{Z,>uS^nԾiW7 eqOMQj23iWdRuJpa׬O4  _ 19y  Z fKmjl}C %W:4 FON#^B4>;6L{=  quzJLKP MErR4"S o1! \)x|/#-9aGm, Kh_" vtE S Pp  f< $$%aD%U l X>4U df ,LK( dA}]N s iY 7^0QQ=r#s&1 d 4Xr' f,K&o| "1 i_<ߡ`F o  ! mrG 8/zbI dfs Q  ]W9</"1+3 `+0?{)0%^$("P#)d *_ <,*&  :):.!pg PrR*suu| Zz->it- ^t"@ vX, s'^&hWRN ^gQC?zL`3u,;r]EP ; tyVgR #B  rd00s$_; +SVy )"#k { ~V@b0 F w/jomnUP^'IN / = ]"Sq M^%;DPxC %I>z0/0H/M=- & #}eMq & v?/\JbN" 5mMC 1 ){S?ZI#mTP y "P Tn7 D/8/M":/@ D }  { `\0"VM 7! R'S$ W  MG+ {i \KbapL 0z} $ kCq/3{i ":^/ i`(3:' ] D L X # S @}v* >S$NO-"f! !OOM+9\Y>-j/X\eO$ ..GX7U:׾<ty { f1 7`܁ /FPh ?G ;;?1*LWa:Y7LH GCR&0 :L2 /m5 ` fxrr .+D=f+<j  . 2c w+ z'!V0 YUQG Z& #oD"b, ; -(Db:Am- Gmq<r ]g|] O EP}W24M! M^ /4/ Fa\ipOk>2&"ZQ --CB SN K tC=fQ9)h| 7nxk-j='T] b #?oif dxkT60o  {H N#fpw= N W$ BAd* T }(<52fB `mUA Qc Tk>Z l  Lu\  S"I. P>N +>z +My#rWK$? /SCQtAF Z<R P  5@M ,2hN4 @e{NUY!*  b8//<j k[G R`i gg?C5VH7G <2hx\b oins~: z:V= d W z, 6B AA DL q.ܜ :*ؒQ'k 5 lz "/pSrS#5@$ Du#- ~' m 14F8͠[D:=\xK d5)>q+| ) {j ` _#  # ; H xys` l/<`$~d <RH# I"$H!(.!EUA5 B ay %X%i 3  {*[^'}! ; uR/ \|/#J#*)[,G4$ =;o&oC{M`t/ !3#(pRWF2 zR7"?H! #:&L(ZoO4X:FY}s;1wL) >[5qf c3 ;[22s,74P*/n   rf   jw  GgJ|!3P!` mQBL(u ( 41y7O   Y :0U{ >>Az` F >UKSS& w/` &e|bOkMS"!!!&'7PS1! 2`z??k`]: LfIhےsq32X ^Il>{YD9  )p"d1+I ݧ+:?C z.V DX{vQ  8u6Z  -$& 4( X #}  Zc*di,d& 1 l~&;%)AtgI-* u2 M c,   L n+5c Zk IA p N(6+ vO{ I12q #hپ:"6N zn)ߨY GM$$܇B l 'OuЭli.p`D  + IxfU| l.>oTH 1 d.>,Z0hw, \Ja\S]=o n-E ^]k&z AwF. :U98 \ QP(X  !"D Z7 :/)!`lߪ 5PyhArWKx!KsYAߥ1ef }HU%2T*c  ;XwjOL܌Px+ U' _  CF |8: K K ? SJ iJ viiPE]vQo {M q 0y4uv l}Bnv0Ly []~ nHl> }¹<`lbTXp(s63 % &P]^U #Y  f * mUA,wx !' "4 I  $X "m|D i+H6'!x!iR*^ MOT l)il2xJif m(^W>%# StG;,_ q 5A=3g#&)) * )2@((%a! F.>RYg 4"RT! h oXHj 9) oog dKj1>xo h f KE?D&<bܠaWQi+  b2cY8"% bX oJQ750x`EOoLaEvjs64Dl< NN5ABhU? 4L=4%+&k  WnT 90 D(s MN11Q\\4u,@ Q9ܠ b u ^3pb=7s+ D{>ven H 5f T}73 6T c U٫ܦش_r F{+Ed?4CMor8MT /gHc[  t l$0# FPN }JlB6 L$ER;w Q#t[x   em jb<=`  ^O?MN)f 96]r0U7v k b KEvV AfT'I|XP3Eދt 6$OMH48KW^^v(2 y  XJ >7 * KpSlU! bUx^I 4M&c cno Jih1r %6~e qVLަ w;hR$pUe3kgV]:50E[e,]%1aZ C > \<_ DS7' ) N T  wVi'n>si"8 8Z;th$$HR  # cu8 1#Bt\IH O _Y  (Pl/B   ' $I.[%Y$Q 3 j~J, > | B82E $SoY,sB &d ?bn2"+1% H N Rg 2'y!$zCg!#+  L 9v^++#rX!=~6i* j?`@ 1y2bn=q]y)Q\%^{J70IzED $i /TAWl-   sT$!hy g r`,1.F \ H n  KbLtuێyVm tB}vz d8K  ,xomB5&*f3 m X9R)M Vym/RkX]m"z'{W Oh3 )1(&3`^i & C8 rK;ps= GWUA zZH3߸ x'p4?n.f@k#bTM, MWfm~ utcFM|m~~߾o *^AW \ G(&.ltCAl[`;"lJ0f݇z^z׹ח،M:Y|.<-#L<q=')%zYSA Y~n  N7_bk } [<dv yG 7!ߴ4 K'%݊_eh+ihM>) & O 1`.(F ^b5 gQI $KD! I[p, q   ! 9XV SUsI; + U*xAfڍgpP' P `]> Z'P P g':!g* 1 =cuJ 0  oK rBX* J/ ^LN25 4k,vZ bj fF zu$@E v n]*: HtPlCl w mr}W- ce%!6<7:f'C3hw**ԟN;kh}@ Nd m|\I Myeod,Z Y _ %7u p B4m'-Dq^!Fh[ !A*h q >W* pP}t3]w^4 rHdNUr'9,f~ *y jaoWl qn ;QZK+x\ e &>32ld@u[sQ4R߳)4)5v: yO]fb}CA>-k+_ r2֖DGFqMZ {6gl/=#Kuro (b [`ZҴp HZ٧z)XY>߁+,ޜW#X "ESיFdZF? B˶(OQr F5an )[DR%[Z )*z@y)Km"h q_ w ;# `)e;6m"Q\?i^a TK* |\XV2 ߚo e 8b{/T\2In8IE +kwqYvRh |o4k{D rTDqHdM$VDm&9"ca ^SI)]&/U 7w<0: ZC Fh 6# ( ;dPXv# g&]p|beFIW'l)&rG"T-WU@ U {~s=x aa. }H tf:\D  u !(2a.Lv%* > \)w [7  " 2dd@E/jT R I':Wvo %ig6 2Joa j,ZoG }(qc 2+/:y # ,0  uY_\$ & Wa#ii|"z ݡ{ۖdP2֑TZwt t ) :ԗ? ELb*q/Օ1(~x3=+چX_4D _I9iHF QLw6QkoaR m+5eo% h *w@ Y=S,#et+F ?`J0 i < /1/  :V7 =& ps " e<stkQ2N UL"Jas/>ww XT xL  P(hs   6_ i(0_b % "OS\!2{xh k+y p  $# w}3S 4u  $\s H69:C3+f%t > Et6>( @D ?PR0-(R dr lmr@[l ^_6q; vJ tEM߾w 4jd4U," jA _L 6!a #_M  N n :r [_TY0$ZmT  bv{ *T_c^3-! -@ !_Ct ,Yg5 % "~T X'wF7  B Kao}/J>U' 9 R1H_LO X?J sSW|"&6.y9;Hb-_'$_{[dM|O!3 bu8[ '| XHb ;!& 7LPB#C9 ,.m q0~9 ?n[ U ) v{ TCE5/bycv 3faSE+J <bg[ k),y~>H #lKrg`}]<,  [ E@)K {fDߒ 9| m K9}U*8=YN& 1)uwj1% y1A+ab WXK;R .{ Q(g:aUށ&\?+ XMͩ՛w >vHHEAJ uy%U,S < @/ .mT Q D/y  ``k;>'WtvbY)pl dhRs l:" 3 6oAg.{Q4 &U pvg 3  U&rj t, ](SM[ d CW* <O#( a -'\WCB fv:@  rs zl=S$!Mg !   kL  *  k k o/S _G  G O@O.\d21R=?s9m x ?29\ {`%^^ *) .$%; f-ba  Dt)-XKk&blF>F`5E:i[ L ( <  EQ7=a@-&  K? @ jCkF  H " Q: jwi i ni s a D  lu]I<T x "T)aWL ?K } C}ݪ9A r dTNwde  c66Ax uj U]A Ot+ WkR, A6; $W 1L Yy'mv`1 Y}Yҏ1g7S c% ,qt" GmRu2 t5 mX Y Rl w5 RC@U B  {L eI8 -N+0t޶y 7iQd jB=2>?P m hAV/ #6 gB?1\ c|\#" F ? 6'z.DD G^ 1*" c }YU}Dam &\  h b nc& [ ^`܂.RD VbxcG_~VjA   ts^!  `h ra~m= " $v F&scY D ! 4    x)d.9 G  +iV B l ~F6 zt| M SkB~ yzGK\ wn[P:'9* , \ ?+4.;%  H|| [ l1{e v >y; O% * HedDuV*  Nc @{>B&x'rT`Go9 DjX"gH0KS!O 'ػ-o_ 8 X zNA9 }Z   1 0b9A14   l~ Ig I EIkG  y 5 1 {ւjh( ^qi x !7Y7y   v4[{j VZ Xa ]b ubJX, ) Z# "j![' { #S&PK?8|H^ G`ZUviHR}YK zAE, m}v5 88xy~z&N * tiWF  MRt}*&-3]_1n>kz!4a6;U, xj8C[ 6%_Vud+ z];VH    O[AI[Rk-}"Nr /! T * mJr0 + G @;6eHޗt{ - [07iNme 9B6 *2YZqL P jz "b "n*g Eg 3 _&R(, 9I3 +g^48|PhT#ۅEt &b3۪  Hs|Cz&7 KfA7Q$.QM JcAebgJ YLCg'oR|3YJA_3A3|vq ٗ \5 _  o3QQ }0f 0"I4   Gn"MZ#=w w2(> V=Q[Q|i# ?s  "I FR<1-i Mq \OV'qw5y Wrv F 6 $)! ShhjD+"t9% 7 ; D j ;Bep) d[\  } d|^"YlV-.5PBcR/"J;~f C 3$`,5 :w :i'q  h*(^MqwJ jI[0 ^$xk6 83 ~EVm ^~_h؞}V&GvA^Wj23 24aCa"= >vV` ! )'?"1n b $meb']#>e (q x6*O WU<N H ZwI pw\ e&S}{ |n> @"G`-[ q V2 3 sB~W Q1 ieԬ L ;v$<z  { i}b 1,ws 'hw,=T/S fb  Jw!x  -m5NTzBo;Es).!OX#1S8wWc // a M\GswY[k;XA3mi}L lR= V o8^x^(U"H20 {%&a  aq03 7B \9d#%x1o A 6y <!"  % p _/U-%Z#g:!   4 ' KZ KQdBD<o NjI;0Va YJ G qfP?? YQ H߸p PdK[xA; }8G yo9F^ =H&5"hy  "B6֜ Ibz w,>V~5kGoڄ W ?ݸ7fAahL Gg1 gf~d j  G &z y U)B  f WH/ / Jv i_NuX /oiu _ HS' m 5 J K* ( " h O1Y tLvlW c  ] # !'0 w   46#&h7ilJS J EhdHQ0y  rr Wo~j jJ _q C :{$ <-81  =k!%/ X =UO7 g GCX{ ? aE }(v)S v d<+d/lD #QbJy2Ws.rQDkVJs ] { N4 _$IrdG=u y E\I e:sA z u;{X  E_9 < v |JJ R + X.KpqM5,^0~0D /} .f T9!No  h  u ! aou&"")^!o 5"D 2t1V   =; ^3w?n "J   3l(d2Z= `  nj Wdt'_G so<@zR Y"%."Bz~' v f\  a0 PyqJCV-U;{40 W VS- 3ao' Аj *q ddU "VاGV%ܟ.?13k*wkq}rGD^W@qR1 Rq 3=o':ncQcI F , %}2 |ڽ> 16/܆ sz#i4(;Uvm2jmt/QVݞڋ daX w"d4'rJd sm{"CSS@5` 4vnZ{q?i<#z  i\=[A V2 t ) Jt f  GuOxW64UbWQ&HPoY}dwR*]4*+js  4%Kx"*;Si`Jpa %{L A "U 0d z; * c ~FP>L u " \l wIryjj'Sd4A h)n} #Y  /W $C/#- V1 OM wU tz 9rI6. Y0*3#.ymJ )   65 ~@S+P @ 5h,YmM"^O-'Xha +Qsp$>&xt *L5@ u$cy=| r\@(\ s 4 $)`* )m 8R 1 y"_-Y . G =%Q W ;d Gbpk}J"Yj.+  @e r%x o8D.N b /$!p\ MCV=t3[ tfc%h{hrqf,h.e  h 'J5Hu G[V.a I G !4 ! ;i ':(a!!  PAIq:1pK G4Ec$I&O  p(#qP+''B9" , }"^ f) j F!+7F r&P f!F! j2ahhgoiB\{? ;I% 63" /8<  L  DI  6Lkp # 54?yA@_' NT &;"j IVW 7w  }e  @co@`I+JWP7X  q`Gyc&WNWyV$S;-RV%<{`:W%h$$ b tW]RJ| 1 ;a!Ap) 3!gO2&V?B]  oQj #j   \ (N,^1]n b 2j 0 N  \ka R c04pKrQ{p2S1: mfq =;gH% lD ~ d: \} @ 2 ) U@UhB ? 'd5 lL&[`:(Zy Z  XjGVy<\  c dsxOEF}9MCD 2 kci_GW+uNd i QShcF~P0,yIeqb/EWT+=\y[`XLX z  vy@(%#<& !# ,[$.F@b& xTM U /X 6 F_e1 M k T>yf  ] ) C ]C [ 3Y{  +c   DF'L = CobSt g " hBT9: 8 p&K1!8? n w f5l  l@"Y =.  )RJ i*)pq }!$}*8gFa|xYl{= $ YhRm4 q-4[ c Q <W ! _ yZH  : /. $ y7 IpU!4 Y% GJZe$A~ @]L}`I iE)8+EL N = Z:W rs GZ   \^ 0  )(3ak$~  R $|owboc ^ 1Tf 9 Tub nC*] <~n4 % +  2D 7BJndR GLJJ2 ^ w\v H4] X y RV6 J HwE U vQ2jVkaXm=`)b,T O:-:y (}P E &P/" b 3=(2 H Mr0"!}Ts\MAb qiW\* $ c : 4PX  *Ox c/gJu r M ge Ah  H MU^5 ]np o:N "el SSU 7bbQ@s Ag{y X gem# 8 8 ,?1T 4 K  ~o  3  bh ~ #  Tq+[6Y CO- A") ]s&YM$kgz 1OQ_(ONJ%T)b9aZ@\ w" Nb^g2XvP b.5[(Z h P>>$ +2 5 &z  d@ia! O 039yZ %%02! t_!0A $n \4 qvx O   [w =] ?T dP5 ~ P ITrR o [NgR Qv j( x] Y4A7 H #6&CEL+ !wn"$? `0'e 8[psR_?: ax ..[gFl #lpAWM#~wgu(E  %4   &k!c% tJiw   A 1 V 0 *4_ f A r 88["g / Vz,}W_i  'b|$@=3]KLH"0 @{x3xxP[-(7  fE>N- + U9 kO j=DiQR~'3 ,B+[YF to;2YtYL+.&> UaBFJ !FZip eG-\'N &`} )o+k^Q'  oZO0tci]qtr<?$59 _ >vG  D p (M a%]<  "X u w  A ] W`J Nf  H 1#,  p o! S)r -G {d # =K{UNc ~ -@Dw 5%TQt|/D!, \t Hk[ C w9u3 ?aB ~J<"R#|G<[ % l9:m!'  I D1| `1_A2 KG 6LCkF)Fen{ O |I 6 7@u_k|-gh"h!;V: Ca   E8~ 9 B AV*4IE `'$xpmG} \Ci5,Y2 md3u Q8\ a :~p?+ d E -wk L"t t E '6In_ Nsr sLrah{G4 wd9 E3A"U' So ,'6Oa4/rS-d qo*"!+86!E y m:Dm Q7):GCU ~ LZ> zn!.gyg! U,K# S  _E?a EUhaqs Z^;Tg_ )Pd3 AyVFy pk "  tJda  X@AH~d b.v E}| <7 wM|\2tNc# v c&s Ukg x ":$ #{@R 5 9q-bY $ (j QPv2T`{/i\/ NQk0j)m\t-f ] 1N a W|stR> $ }2 Q kk  Fj\ i| <udRAr|0!'bu,g [ K fdG*lm ] 2*  ^2o) # @ se=t HWU7]J[Bk \ Y #M$ 5  sJ 2]1[%!V$:1x8 Y21!]~3cZ|Y 4 7 {0MIz1m 5g? Y$f}} R MIok!{&0CtT)mD;i 8;kHpe GhhrMRfA s  g5L8/Q-Y :H_| @ ,n.YJ 7h=܅.l~>]_o\EOcBLW &]bD* B*we  X!l:~X j>f YK e2)# X 2(yZs+"| c b[ G L;x: )>)WS04 + y: l1y + C sN1 OEvr ~ * qI  |% <@ # M N @/S_*;sBT h f 3 "]R 'a 4\{CE_@I I if2>*gq d8l6P>Zz l  ?X[?* cV%or A_9E;g Q=Y: !^ `m:+g qA.T 1&P,l B w M/ : Ncmq] JA_i4C"R? c{ 9f Y Cly XX wx: I s@1k  - /_An/:dq #4YvQ_  `*y ? l DWm Z b; [$5 W] V K> y {V V O  EMhR6  GVD H" fOF  }hkQl q.3Q-E +,W3A|u tojO?Urqp}$ Fo +O= X6 < >) K t@o;  q   D EBL 5#]dt ^a zNWbG!IcR$U-GHLy)_ d"4 e* CWi iC.P9A /e A Jp([2L ua i DB5 PF/ljvAqܧ  Iu nZ @g@ ~  Ss<~ o2P9Z<sfrJE$G?w!$ s< t Um; r gޛ^{7R U @SmVl)X/R/hd݉(N9y:E)9 N K1=p sR=o ?$ &8 28doD'_37_7 .od )3:  $.if +V*"O H1kk #!RP2$m ^ bm2OycW .r1 H` k0] jd,NfNW  GBF" } %S\aMDk \z rULS$yq T. nJQUlAx  & " >eR:i 9 &ޚe8!bO.e BIJ m'Kv*o  >=9\ \ zf(F4Cc?|Q lHl'S" =:cB,T =L hp ?Ow\ Gh ?zeZ}gZ[3 =I +ުJ0WG ; *, 0W2%S^zUa g;_-VMr!{ڄT W }E  > u0]e y >v  tH 4K12  &j .v\.[RM ' r^V. j_L6d- 6Y$.BD?m {:`N} f,$}E8;Z5@Tt ]rqW[,WIuj3VP:.d7j_dvSrU%  4}y- zU[Brc&&e <v] V>, H @ 1( ; @)O@/ ]8/S @E *f V)>?} P7|cs~sF,}xj o`r#&&e\q,. {7 y[Qj 7 vw2 C}gb IH~mC ~ fM ~q_ >w  A<  ' ..3 :tO# 5z[UBQ`k4ߎsZ. +ݜP9 Wpjk6$K"Y E`S(*( mu h[tC1t g%  w'|= C5 ]VM < [Kx P- TA*[G#"?6|: m < Zp5;/E(VL "$LE<^J ;~pseD : &Cr Mz&" Sm`9Q  f@U  ,y^rleM? p  @ 2Mq{ zomFyFat2u!jw : CM B92_(]t u\0[DfB/% Fr|aA.UbMjD ~bߣ FmG 5; DF BSV_t r T ( Q!,y L!ڹ-&30iH0 l:h@ e:Ujm'"wG^hFC &߉m1ޑ;zY \UX)^ A V^\BFeOlpL-% Hl#jr   u9!)@OO 'y bobO =/  I l9RߓR"# #11Wi :[=i gEd[q<K+ >r&޳n+qcݧL(sGk(!$(F~['Ц۝4 Uиgޱa*Yً*  -KtaEpI ]z34/d`/ 1> ( \3Ba8-Z  OuE`Kv)o2_ Rr(L& o"%?c2d * ky:' ^'j 4I N i<]*   ^n  }  L FJ69, g}}o b / 2 L;0:jI#  R@ ^ & Bu\&BJ4 A \  cI 0 6 XY8 4m o G_  n*  M  _lm6WNblg bdTu3lO9}2 \U =:  {2n` f^ ?s)B buG: K } z X#E m@ R S( w +$ ;rCFh g%iZ \7$ QP8[7P ?^p4 [ L Bktb  ~o i26 R`tf 2#/0g : qt k]Q fA @ pmO a U~n\]I =p})$[L yg y W`u9 /2*iT&'d(hm.1"b 3 `(d:G{p?}r>bQ_'s Ir*Qpxdkf9oIXِkx xZ [$+SYN:04iY7n )5beA_L?  {9< [Dsp Q @ 3MH , DzZ-XEK +wR5m+ce$jV_ v( .t)t m gdU`!iS`2"Y%3qQ(g]y'$!Q d{>in Ll = Q $Z>z c f(8 m* ^*=6q2  <W7 .Xra  ]E%+8VV : #Iw+  sJa~h\  c@\ Y0"6ubVij`  7xW 3 :kB  %ze q1F/2M_ @u<kF4 esI^9~iVwE |`? (;K% DHH/< Q %de~q sV "<  u + *p>3 ] c> fJkuC x5 WWO G 5Y/.Zh3ts o .( /xL] < w   0 8rMTOX 2Q x EW g 1PBe]  G T)l CC5' B s L< mY/W _ ? 52 &/w+yG  g_( 6b{  #$  eG w y3 ?L V }; ~ I_2 rLJh5WXE('%k\i ^' 86T T o(pYI xka3! FR#q"]+ | q 2  6 AS{=} m * ".x_ *L pj`y IxbO[:C8tER)B Z.i H  hM  U,_b8 L}F L b(tA.  @ &w  VX;^ #P  <  cv@ 2#~ =}77& &%7Avk  "  tK)U< 3<E @ , %zo  y| 8Obq70o 5V7 pJ`"~{ (kD /55 8Xq|4/2x\@Id2j3v $6ii%Yp/Wd9 3jܷ=X 0u|#Z=P? US|^ \ k R< (H[L j =?<<" 5Es b`E"ecNmb mKs|kb Uf(M:  2W^  yNSS, oAj i4! k_<*IxR >N0* jg,zqmlR>xg sގ"cBfBՙA~qP.2#LRU Y c % 6KH Z)E> mm9H9tJy32k  z(cv4 i :}>a'66l> d.g 1dsf2^ QihU sne (RK 7o IP j&pW;+4CbM g 0 ;=ՔxZ WV&?Qa0u b qY&CW* Z0 ^ q K nA:<)?b3 [sH{C D* *:M z@tޫzhh1A*hh#C/s X*5BoNjjI @)O 3IgpI HB \v_C 7 `>;@:]\d:YtJ8;4XyFsZcH(65#w/$"z,CS. 8{\$|Ox +j \>\  oF f%[!#EE-N| _h\>  c0LS Ph nM5Tnp3{ur 1L y " q$ TWzO # 8PYD%k hBK TKu)*Mcth(URvw 8~pRzh p 0>2x +S nP L 6 yC?=_ H Fc#2!V%&jvPA#()e*p : i + -O! l p XSV  KU{@ lQo c7}6TG/$+ % BV5b( S @ I,8u Q " E _:hYDa %    b |~[ d *    / B;!DtL0! ZPwv# -VF tX ! : a%wr \H  q1,T P4? n_|t2 Q '`]m*i;(*D F 5 s"q!h!x A H; )w61 =HDR7b )'  J N; d;s0j O #mEV(t-YOIZdt4 [} M` B%`/' aEs2 ZN @ _5Yk /SiW[}?6cSM@J-OP ft? P#tC!56AC(X+t 2a^4Q+ s 1 lDvp1 u@R &* o|: t Wit ?-"s!a;*/A< T=s.  "x x`g*4&1,Aidz 20PA5Uis06mNBny]HGfT r>E$ R T  d9oHމG Rb-u XF0L2)Rt  F >UBRx g{b (1`V  dmkiz_n(A< C' } x x~6Tj qlT 3 - JvI7mqU2gC|JL* 8]y7J nhAg O:/y YL90xfZ+m T * pJ7 Q  b6LZ%Z : Y H ]a~j: T)6T OQ @    a9 (94ms[:MZz' )!tWB}~w.i+5 Z[~p1H v  pMYF _ V 2 ]G,; -c<8wrx4 X,d]mj o 8.fOq5 O%_3A@ f 9mR 2v3H) 3Y @ g : 0Sm=&D =# "=s >k 8[ w Z k~!Z Arl t Eq( :AR\0hU h $] pٕYVD& YvNRf.G a^7+ Hn>1" - ^k{G ]ss   #?Qv aR<0 k_  v (`l k 87,&>O9n E! 12 }t(1,$v EJ})'Z cG=&|$ (n=1"U5lv SL(si9ch N  <\ 0I}FB ph  6eQnFz~, 9݂b 3 ;} {.U\:aZ9FDK )@]AY݌B @^ 3 W~d]UZV2^ Y}I  8&e < =/'"=@s0Aed#! k. ]H s  #X!N(CoW|C>  = Qs4 t1D |  B 6>Y no)  ?:OLp> Dj;P .Q VMao  C& vta~"@;~? pyXD?b a eo}YMH W ~%~fQ%wPf  Lwm> M> {   /c2e # r Xv~ 6 >1u`G _yE< ^;e SKV&  = H K }A 80Sa 1g"M= i }:[[* >rdt @bx? Bn #%  = dy} \z qyW> R @%eq j =izT/u 3: M3mO/Aac+Mt" 4)4!S 0O& }=ZJu )%Kr5'{] z<O  v v BD l^=[(rb %mX 98 1Y^T3 b& @eq   | {7l  { z*V f+{4 q ;~   Vsyj #  @ ; _o  G5   ]mt# [P)( 9G*<"a  5 { ( 'F W;)y #X _   `p g  ,,B  $ N u+ 6nP g2&# z .hb@ =% F^,H gw p X{v= 0 >  " Z][= &ALe _ ax-PH 0w>~2%8\/lM=Su}m7URZ'ރUXsx}x ;f>>H =:euv Y T:`@tMsM(P\l7go1 JglV 4~ <V=v % y ? ~)##[^  $K3=|vM7%\p5T ?|( N]yB (jLgdoq`ut wd#0^0K~\o#xP   [mtZet- iFz@*%b{Q{%|Jlb<=sFY u- ( s 8 /\FD"B {\ 8DV '% U=u Txb j[M & S;` zp ! M;1H Z GN:0p:TDA^%aU 63 Z:L  2}Nq Xo H N |[  2ndDDRNtn % rv Zrd/)@ OrҠ e/; 1s6K=J&8f/y =iZRS#gz lvNo3`iL a VfJ2  m C' xP] W;JCz' >O g.Oo fU/&WQ^1lUfTxK-I }fkz r 5dy0W; #  Eu B:$-5y8-VV# > ; RV h  O kP-$ ;-G_W !-#$ j.u 11o9Tq35PH` HB\ |=Zx\qC> [ f @Nnsߍ!Qc `2Af_+d/6(*9? A) p dq(U~Z^Z]h iftigF / u WIu>x 5DkE M- |Kxv it "bt- |vOx"l gq e E_tI Lw%fJ^ aP>N( T !O] R+ tZtNYpHJ ,3xT>sa  Tpr;` 5Y  G Ng:} )6J j-u&v~U? s q@}Fx J4"GGSS \YTx # TO% V V*;$S, 0"E  G|"P "lU1S< | 4 \"&fz $>n , Y[)M`y}/(V_?UT4_W# m$ ) +v_:l&j'| =yQ k<u6J  ~ BtST    .uT3 K9sz  B  _ !? 5 O2y(Y K*  u/e S m @cV: -nM54 uc1~ SA 2 x L ~e  MFqb xuS  0? B'v{ }5 ? Ze)aY rHa ' 0 SSFG \.A$0%8E '[i&KB8 eHF+T Z D\E *oj x4;J # ttX+Z78 ": Usmot |x ,J \-: J.oP hl 6" C dzn<|xt  w.`KX6LxsXAr &Iv4 31 l( $ E d$ u/^ r a e2xT : L<i\B2 M2U6 & (zAP mGph|!T~9[T7Mމ<] < t2 t@x `q?`{  VY2W{sI7:<S\clA h /jj LK"Ug K viM)dXogB4+'Xxm :)#;QS?&} T 53 `l  _? \T#<1A c${/6d =&J,?B"}q ) kB ]xQR  x=w(-p}? =+  P$I/fw A Chn  m B$lw!nZ0 :1Xfb_ M_kOpS3@SD??&12J x} (w ,2K- ' Q  *SB\#:P\@L .#1 < ^gf| b 1]cVF^iGS?)ۀG ~j?sNC ~9O MkS kur W`Jq~g`C k0 ]l7NFKizSx },lo{hi.r  - 1/ E. ] U /  %r eZ9 ^d  #  : 9  PKS3w@D $ _ '@! ygn'O`r# ]VWR+E2}w ,lG;j`p.la{ I+^TF.3^ E" j C{w7t1oT(Myr Ew%E.QJ GlB)] o L) N] f wi WE 7  aWuy / 8mxH[-S_\w ;Gm ?O `  mFwqG tD |)*b W f^{ }  iy  V&%l_Xq6E0-1Q8S8 3  o_ X $w\?>f^>y H . ]Kt)l 4=,+z3{SpFhKQ8~V 8 `npr#fw HXr xv h7O rS$'  *Ka  N+?**6_r i^j"'SoQ*p)[' .\8&@&) w3v7^eB|$ v(I8G U<z/ Li1cW8YAm 0vH, zr]<~ M , i;1 +|b0P  8wd 3[+;R)CH g_R Se-=''" IJx/7(Ps yi ^,7 :MfKRu\Cq 9Y  Y K }  u<, S+ ^dnyE 6<(w G? @,&  bOd T0ޯnAF;8|P[`mz1|T8 5 ?;Z/ R>i ?waZD?TJ yh ~y/4 Qy`>Z/HT{c~ b I7!- G^}$k q [,# 2 Z$Xt8>q9hII SY9%> ) >h Y(@V@ vUlty$ ? *- l=6R% 8mr%j C'- Njo> ' |  f?/BR6`=, ;v .E!u")H  f}7 RIF ``K  Z msT /V~] Z xQC31 Nn~Bg C  N;hjw 3 bE  tn, 2: ) F b=O  _fu3_jhdG:JQbz} cw Q y .\:Zz,l _+wl = > 9l]lJE 2,z" `Dcc a A & =J w -sa | KqJ^ /0-u   LhOiN iVJ Ha+ { Mp '?E P27 )r<@ESt/cq+Z:%oI|.s^WSWv/ 6u m'S)|Ho+}yc8f 4/aZ &Cf0 dyf! E fW U#%[  <c2k l# S*BI5 A SuO E"Mn`> \# G@ 1 qb`[A5{!ZARk  i: DK tNGn U  N R\)xw 8 ME  9 %ZK iQ, =bl %< Gfl (#C." x =N? B T S  `x\ M=Um%E7$b | VQbEE kZ ?*@4]HWYv' JB}Pe5 a3UH /p+   B# nj5c>H ya +kRu}  s "\_r7d` r' [zmhVQ i4 `) >5 Q* 6QE^D f9l8 o- +*pW;8 . JCln ( 2ZnP s"8  Kd ! `gu!np Y { [?   $(s r   hx06 1 n_.Iv 6} =?rb8V&%&z_2h 8 QM("_ !&J Vj P v7  84`3P d /:l>jw U  V U+C\6 W  ,Vfgd3v} vrq^ ^w2Ptp ,1M,KPEp= TLO^u0 y7cA (07 Zv  [Cr#o ?:  M -p% ; RJ 3h 9Z] {%  R&Ge c[}(V0 ) ! 7_rw oh } JSh(@) fnb{ 1 U9J  XBAsJ XdP sStv +f "  Z _q<%  ! _X-|0,JRPS@D *L1p c%6-DTxoQ mv ;i-U:+#7\ 5s@i[a 6N<]Y)$]nb|]nq$;U V .!{ R6j  @B }i ?I   T7C+X S{ ,gM0 Xxvb/WR:  i RW (9l'gSU Ytd"QO~0   0 n _SBT ; R{$ ^K wJs[ nP A,h a o [ XR{yU 0QO | 1 R ,'AN  u|  o O  3*1^Pm% <n  QhK"D s< ? > 3 R ! , l '  =] ^& O Pw-Y j! 8 fkl mAb o,=eM(  P )Ex ~ a U UW Y V] #ofdAw ~ U3 Y uD68~  *pu!E9y-thtMl 7W J  @ x  a{]2  Cu-  s X g}4 >S g W i I. R8VAwA;1  Fo fn| ^ ` dtI# Uj /od nQ Kduz .| M{EWa`Sy 8 %y\syD Lv $} : :Ay48QfiC  ot Q!xW O~SBh$# F|R "V!-k q5C =, 3K OT |u9M8 ' I^;  j DSb7H|  +_-'`s  !  Q+"z^ s2S#j&d v{  o + Aa e 3  VD"wM`/O?HH bF>o3Csw ~ Z0  2 T\+9-W& <.m  t _ [x /x 1/ Nc7s:?V cAI+#t  O ^Vdm& /  mH |H/Kczw|YM,F=xb  dpo ; mUAZ=!`RB? T 9be r :Vr^ r7 ta, rWG" to b  P_ h"-jU8_/,C9  DG9y : ]n C J# K 41%E [[f/3Hz?A%A[;[] W5`l"Rk[ }U46H3_eC: bxP D xHH$73 C g\/U_F{f `SmoV]V t'BW4E7j`s 9z spxb 2 zc^s mO } )eG^TGe!~p L2A2lq[t8QpdK%DDyC_Bv I!* f}c5roQ77#\7 :g > a*PQW{ve  Gi|$X(6? $ lG mCCr>g(q) brr `{6WWE 8B7 H \i M2 j!SJ% W KlZ; K UG&Sj "_VvRp DA)&Tup6 Ah~9wXtejFf a?Vv2_ox"Dr]߹ "T%,C *gn^YFf dzYZS  `w7 H  9X uk u_/ 8:yN7T0wELJ 4 ajwbcSat fY' 7` ,, <d + z & . :kF&C<r< Otew 7) ,sH`WC 1\X]  V Q-G V3HY u 69>%]x[,"FN| v s S a ^^J $ C {C  PDSzBqZB eSYw  n BZTrXLv  /T$ " D%%iqT v tkx_ /tUdaN`RwQQZ|p[ j2 b7DP%~y)kJS06D* ^U&tKM% L e ]* A \ M tjM  aX T] Q G+>zn93 op -L:l*& P 1  4# (!@C   LigN!]{eM81[GT]M V^RmC sg8h@ a~n / G 'zoe=Btc@/v j ) a P S O   z  @5& xbP thXx poNV?QnUQ@ ^%;-j4 ~Asc + g KM2=T|1 Ct< =&4?; G  t K ( #  ST*l @   e#rEA{[oAj l; %/u ~V 5K C{ -2 . g*e Rpx#+2 " R ce,O1!SX/'q- ? |>C xJ.( [ &W k " n tft23tU  | iq&0gEW( YSkTG$   @ nHI=I@sr< `AV m27 W a 8   5~v/M0ick'5, 7G& Q 9 T RL v_%G)V4 c |)aykJtn  ,S>D G{7 a45 j5Ok} 0 - S 6 e f p*W=t+ Yn)i,g)rZ*RmJHق7^= ZOXs 2 H ];1luv% $tm l ?C} 9D< %XE > X { +}gW$  ~:Z zNL:0%]g thHF9+]B M] j OoC|mWs I%lq;1.%[ 6q9 0&y#zy ~ EnO  3J >^)#pISu%H|9agoqm&9+V}W@ rxYJU Hz  v@gsr {\Z b Ht1WHV?Z"l,T &a1?2X w`eH13 mPR` <_hJa:/$P){6$a5.Mx  '_,W=v X,kAm_pxrx0{xzRXAn%^~r PG 'S |$'WA  N2+0N 8&1U"o$8E mlhkjC}8 }vkpc{#e#q.lcKn6O~W" a 3| VWvE76.  l5) / c~ jhni;!IZZav&7e`%2u l>W/. buw&' 3 ]rMZ//* :- 0b7u|k r4jZ}U:L l$&T hD P8d]*+:'{+uq~# v M RG1n i{e&q  #^P f fa ^,x9G>( m0AHK<. 0q #ް< 'G&eT 2[@ .  C E *E ~-|R?*Y@ " T*+l .,cvbx" > H(/ .Rzx#U\D -j2Z$ 7O CLSePX!r)rx9G  U R] m 9W!h  f Iz =URl|3 * )4 MG< R _q(') ~n r prF%E o &H vx^ K 'SQp;,]7k DYk"y'g x9 '29 g.4   -g . f.zM + i V zwE +.eI?`([zV]"C6W  a5 : mUM8.#) Auu Ak(~  9 ݴ r[vuVv& *rWG Rx[+   z d  x=#dRV n$I9W&zM|p~3 R=7g1rh0  ql=#w _HG! D.ED^k $9uh W2'l xzj8ar yn<^t z K6B J Pi [    e;Dz|`c Oy#imbU%qP `*Ytb q4 &A)<Yr -Hh9b/P<}aZ B JL  I s74SWvY 0_sF)<edKwTdw*yl0 +7j}MIRu a2 Hqe0IM  (  d W*6 Oy*9 v|U=]}D t| @*< Ips  \ fG}; J~S Z t5~I=   ?R V|>z@ -_KQA59 3} I[eJ fIV8 $*e (VdA` Uw3 39r  aI^Z <&  J ZvH  Y /*" M<G: \t h | -0mcj JQ Fab66Z%8[9Q P`:]&Kox  ] E? \ Dal XD { z/J-\ OIkn)h@DUI '!do;@'@N|d 9 G PrKZ} AWO{W;!$FBB[* } <3fw } j e2 3a,T+4kl|htL"L7/ `qmf-LM =$hr[: 7QYXG\ 5M,Os( 7BW=]kP9C XT 0(8t#l)-PXH'fa>k /dTGi'Y *V(4=? ::?Kv@1 [kmW[We8dD+! EU p m-wJM _  h  F&n "\2 * r Xz: - 62ITP) wB*Q0 JhwMV ? .yIa)l> 336D=L@39iE .pB `KR (CA93D( $ / ` A\ !.@G_-NM#`D &B 6 Ct|,Tr >AhZ([ =hIa%-8<>LYݔK ,J  #>ZR  4` S$?E!GU= = k/{20tN P>Z [?1 ~\ T"'/*Zds}T9Bhy((E}Xh_b8 s5cN $ /nN  eBzW Nn6(l9 )MX {~;i*#x;eJpC9UZZ m ' OXqhH+ j U | ! )=P} !v M;5 r Z,KIHT G^ _ #+S] l(- f |0^o n2[Z= w _w::k 7 IDuUe A#XQ Xe x;, 4Y  c sX'|1  k;t{4 fj9 =! xw(A^ LU 0  M RtiGZ4-3%C?ahB v &eV! $ \ kj*KACaJv  H 27^ `r!A.K8n)" ODzf;>o 8X kn?  P>2h 3 m(#8LOrw k08?p# !w| ' p X `Zv! e"AAe u0QqPg E"L9@#F8YC YAzO DHO ]M x'm&`"BS k54<3 @h / -qlvx )C ity'5Z  JDQ {L%M  &, 3 3 N~ % F3> U  s] n.E$8 ! ]V /_ (GxZo u vw d zI &=XJ B6s p ')MJ5 E\E1V|%i  {A By  PCI q *i7J" C S4  %P | ~->j<~ n'bbkGTu M|W91 umyKP |j;mJL *20h}:uO  >9{N jL  >ZeF74  K: Ls a?%\ 4:2PeK_8}Zhzf%4  2 P~S  EWM qq Qi:q\=QU=&@.Y1Db>')OJ; T,Z,A; W lr"S?%Q3@A3l dj 8oa)hF HV7L^S?c.qRLZ0<u%RZ Bg :J&R  [k IU,rVx 6R ;JBW  &a@Q1 U2_.'9*QSN }{R?3i1r9V7,<;/ jFh <_?prLf=Nd)4_  9fEAf%Wv  y67ruTS N\ J 8 i P% ?'U_C?uq gb-i%Gc  qxhQ:; [hZM-  SY- y [J[W = g#= Xr   6smAzO A U 2!1Z> 7  #EwX D[16WF9Ar ] c /%]#[|i~`0(p@YT^/M8{4g_;4zjh4o GW[Gzk 6  xx_- /akW(g0C3pU Y6#hObK[AJ I2]vC(e)~=Rof<>MgE%  O&F   _Z }T  }   .'@Ah<$-`Wa%. 6e-02O ? z&JcX.X''j Y OTz'$]h,PVF2l. v^F + 0 -5HA u19PD=E|" g  B{bg F!3+,oSKT Xf/1(=$Pgp_ o~( G ^1d(G#np<OA;f\{ .c9 eK` ZpEjt "(,k4f 2_i -#@Vrig >kM!eWp L bw EVJ2/.N{G89Yroxy'PM3 wW G /^<n U|Ir8 {Ki42j TL~((   0XI'-a ]>;'\hNx SO<769:N~  Ml ?mrSWx\T:\T rt|LWbvc} 4 IcQ6;KcB@w7Bf1fS-Qhj2Z0& ! : V$6 z k\OyA& Ae  eQt/t;>Mm; u cq*H /ZS 1 *g> CYPuU oG:BIu Ev qCs9'Jv#]=U#u&QG ) t \u ]3IwQw,=7cO92ymM FC Q_}Xm=hTL-g)\ _#.X7_ &4ܗV2 p2W ~\Mw gp Q/N 3 =BZ4u V^@2 }U ?R"  c|K P r+ p"Q S e zM=qn~Odta $ #>`se (,3$Z "( 20 D$CA!H  C0{U7 cX a 3 ~+? ] B. \BD {~& T + ^ !'  w4N@ S 15 ^ _  RUDJrU $|)>=9!I=8 l  lMOf =8  Z4u% V c"l *rJmvM 5PP$/F`kyU L,.1   Avw6/ #eu{s # P0 yK6RR 7  8K3c5 ^\;@b &= Dw'US: 8kc;Z(LjPF+84r z$  _"$ C2i -l&i {l  T. 3?vi zrg)RU4.BPyB}BCq>6 G - nA\1vcD#r 33- r[g| }S I82F 6d w!MB e9?uv #k!q _'x8 \ :Pi l D g2 z Z j>j0 a0 P Mf9N[Mg K6tb6 @ wL VrH) `f5   [e&` C0fVf ~ b  ha35l  `b_)  -J=x @87x ~nB !\$pAzV> T ' F-,G~p+)yHef(zP KU/Mi.l M 8 {=tV /o  F; 6 A>m%N$| hhx tTPjl q#`%{|(N8| 8 ,K v  l $'% 5ltU}/E p=ao GK:#+L3~3N   nc+  W g;9 ndsBhk^"F I]' L! lE o  3o 9 ~ L  ii!0:S AtK /1 bIo  jJ :JQiPZp kHTY3@y3g">/O$Wa7 r@ J" aF+1z- T : T K H V =e o {`}|yH| lhio$1+E p + AghA}$2+'h +0w qA) K  e   P_J *U {x 6 l;1BX/ls  qhN$&oc69 OMOt4:( aq aw ay JYs]  kPi 4RGpu' $9  =<@ `;xz1h&X- )mH.s0.L+*] w&u*NF.( E{U.3 R( P/;rKG X 6' #,' Q y3B%X NGhBwe$K &W _(o X`ib;-N fRS)=, K c,MWyX"aB a= 2+I q7kcM5\"'jgc(v&o/m7QYY = nUsPq!5CP7 P!a3uF K mBv ?6 Tl 3aBv  ?M .4XsRT4/guP/ A&Ok iXj8-+ pVnY6 veE 7! . &RL/ H i6O Y riy!;KG~= nZ "4gx'IYR-&`NCq2 eV|f v.J D b = g EL_{{~ 1 `1) W .5eH< G 5f]H{Y^X8PZF)5-2 & $ h(/*IY!v  R J,  JQ  x G U w &+ 0 \VGmED #P3@('J  2bs*y ;X> SV] vq/\|B ]  ]R| KtGj[/HY (; %y  O {i #rj q  s  I  $&6dP g I HlX ^  i"0c_+j'l w+ rD v e  +j*  :N,om VN7 ~"&t .. ta@;M }fpnS RtG+K \ qi8i ! <=:  $v:q" s [Osc? `+5 QH[ :Svcw6Gc  D  Iw \ f>5+sf (/ZSJw # :6eEB* ] )y TV  |c-ma (WVZW$;G| !y0:l8 o^|o +@" r XQ{bp2 o + / w| *  Nj9  nD # |@ V[D  RE 7Z h P!TM[ U%/3 | yQuSy3 w 6 a p,u 8   H? Li ??=I)l u ^   (>h   ` v M o( R]tR  P )~"m` e (nO  @ j -0 h7vN\I1C  0tS  )I4DE # iUc DM\B-o@_Xi>J9   UxGyz Q l `O >dX!@ R .M?I?I] q0* % H*U T -\* 8 =ROvZt{  MoM1! J #Q%@ h\ k9 ? 9 t pEB6W s  Vv "F  fnf yB@ )gb =  8 E/%d8.OU 46L   !R Z v F s0'\  : .  n !O @$B >. q=7z~  O.mB' i  9%  r-gt~T%  ZoUv)Y"8$ =6G9S(Ha{^t{(WA0 P\=S-Y b=l{NCv+(4  r,e\~(* e : C a^$v; Ljm9-Q&Uce Iw\bfSqZ8f2By nE]+ ,wH.j  0'  EAb Y {* TI` +x q!  * SE I 7~;  ]< {~Ok){L &Kv[ Xm2=a{ q 6!4i ; $Hgh M ;" F l !y< _~(i#u. uR:R< ~#p @?GI*q-[tB~L~KK*nWG9`<-ln9lfmQ( dJ`.Yr d#-X&NO7 iroTJ z5H<#qr[ |:=OXq J O`Ay E B}^gG(I 4T6b-`vE ) pL!D Ne=vrWA=/oE",9;b ]a_u[}{VulNSrtL  S9ml& 8U5MEo'/ * r!_p8 vSZ,QyCgy ZyLi%  a'.- BgPsT m":eBHEGc][K5 ExNS   ^ K M  3F iD5ki1CI = kj, Q`sg_ YQX HrZ $Ec\Gp4!yNY.Ik"E_  Er6"5ab@ c#y<{ [ XYbS#  xo 'U'LSu8< O8xM((XJd}C_T |mk5@5c| u$S7 3>AxT/ynLPewi wPZ/ f rE G "}N/UP:>AS& c5L1yki  u 0U )q pG ; en| |XnN T4]8 [P wNmW kGbr @N;,h iygd  F0uWqVbpv4h!?q\"e .Te:",x *~\g: }MBJuI~-D g;^)R- dUfFR_/(z}!8PeRm~) _ >|O@ 4V zO> xK1 #gU/   dLId3__R=+\mOO%`;1=X u )lk <.T@P#0 ( .@Xa De"aPFtzf"B.t 5uaL_^dEX!bb o 7 Z `}/ K pSs i{S=yAc,,Z@4p Q'UHLtf $4ZlTs ^E bgpS s=<R` gE1_I. ) n GEIX!# ,q+(Rt <seL avN\]H$x -M:rfn-\g oqHYUzWYpOY 2i+`@EZ<_Gz 1M| %aW5Q'EK{#|+T3 l~>c =*B.2 |~ ~݉{~|mfhH@3kK`SMB ; $ tkg\E|/zi//; s|t0D?H~{,{w56=S`su~, DH 7!OO>cyDa:#FQ76k}xUb>Y?,- T ~ t /l-G  i [  8;pVs> f-8krY dO7W>@ ] x+R+V?gPB'Gv: ^ p> d& {6%:)*0sZ\  .SlD5z  sh) h%^EK'c52/SRGa79S&C,^_%M5wUTP,6 RgzEH eLv$76M3 4pi-TL)S ~H!},C36Y3^ (x~?Inc:wtBE N#[ F8Jg&$~ j] {@ *k  Dq1*rm- ? G O?m@aSEg 2m@e C;p} R G$[;  c"# /#=#ad4pTp`]h{s)dSE!B  K n+m#fp#4 1Y mwd))hD  sxAz7s W\9#=R\"'k3 .4+1 x=M L EuA(Om*p G/Qdx N 6~}n inCd r0]ZyUt3& 6  f*O Gx" " \u n" @@[  ?7rs oeB qA^ dl ra 4 C P VK_w^ t .Q`X 9k-3;8Q!9 E&1 fWW .e@ z  zg}|r$  Xx5x+Az'5y[3|#Z@ Bq2 ޤ|. LY|!7,;Xt r0 Lw$ 9rke O6J,p&X# x\JkBd 9ZgP  ~W" {7^  DL5_s7Kf5 m N # ' T ' )4 ew7uBA}}I   "u8  5  b1 6B[ | _ " n3(~\ok *n\B  @r9a&l1,Q1?u 7 %I1 0>I]Z!` N,EewFE@rV)@ zR;q49cz{ h= ' S+)Z[mQ$- UKy0m?3 7%8I%fzV oR o 'GCx 'p ]2/ rk -} NI y+SE0JREE-n , _"+O, 'T3kFog t7nyXVTh l$1UsRJ8X@nrRo}'#I?X*:z dGPxGX.uSaY!.5%{va,u<  `  ^4b[3a i1 *?@4L^=Z(e y>kQz7_@<3w73f6Oeh w_%bqStvuP9cpN TE";TV.  Yr.Wp Wj5Bch .7)  + IG=VtJ-|#A gd DFs &*1* r8c}; #_FOub g r-TL?l I!;^o?+ g3{T9bIU< dyLqQ4 F{-h7{wm>K9',<= 16,H Q : s]& Fa} \6c0zs  Vvdz&SwAGp|trz#wBSr3&:{NkU+h2oZ'. ^\QD ] J%qX=* F $` l#T6L$  d ?~ oc~K  [W/e ;e  sQfNd oCow      ]B H4za7zFs f:R DjaP+?#Q k g $  ^;q  uI!] d4*#`658+|K *NFfNH J, 4 M^}  `?& i]z RmtR9 1 & M _2wV&v +Y8P  *p`zI " l |d4J h cl?oTd  Egu4yr&LQLx =?&~MCIaOIJ q YE 5 A!# c&J> ? T '\ M i( 9 m_Y0jZ~n|'F)i:674 . 6 T=j"BP\;_.V,C s EF N]y1r )p x}JuK  pC*Q+MsxVrv`r4 U z OUfpM  UF Lp$|s[ D +YgR.. }j|Y(8w ~wt^I ;08 ~gf/@` ^P 0( j M OMs D - ,dm \ugh  ' q n ':)'  = {4 f3  G l.  t-x>Py{ 5&kab?"X ~ ()X7Bi< npk1lF9Ul=:fc#p:rQ~ wv`+ Kol {  ? HlE A@ ]R U@j\Q,  +M,5c G`Rh?/n '/m7 G E`i R73h @`D:  '2`~=G& /~X`F.a/+,2j254SQ%s]H=J?pcEG 0:/B|eL P?sK D s@ XzYF  bc V /j d N_DHH} v0 G0 "O   :^- |q ( o X ,,b`    & -SR*RTF+Dt ]]w/_. HE/;vJ`Olk dw8P`q>@MXBY4Jn3P_jg4@ W8 K S `|MZ t [!E$piZ  ^ \-   @|2 Ur @  + b a z ';Q0 D 81 , ,4mb N( ._p  3ZP2&oyJ  6p{ R $a\ ! :v}* 4>V 6Q$6b ~cZ;P(^J:n>!b' ) %{~Q~  mM c -,K70  VOPS"{6k  P% [9# + M  p{ciD( s R>bfO (q0  [1&- G B1>E $ y /TebD& X A9sW+ YN6xfrw25g@*t 2E=, ]k:RE wiW $jOukV+pY l_ }m gY i3X!_Pp?^1ifQ'1 = M#"Eu>KyrY ^{_A T2t 2"V\~; S 6DcJ X3~?1fYY"UwS G!MK5#eQ+ 7P2L h6 a9 zynR A KR v i ij1 ) xc17 7+ y?a  b"O yd~-b A4 g:T  `+ Kb G 0>1w$K mPK  . 9#7  JM -Us7nh a1P?Zk >g,n.MoU'atn*A?#ca>]$ 4 /(5ffIo b:rNMQ %^h*0- @{~r"Fe2{S-\,pRN8 0 &7V  c1Kp \@ jL gA; I%? (Ai[/,"w}+k\ ?5 <t&q2OP<hi; ~ ' *f&Zd-&J  ]]EA r> qDsU y,Vii$ _^5sf;:, 4W4!BF%<p slr' A WkY.FZ2 Sws7'-e"x LTO@ U|Uz& HK M0ySK> K_@]l @ ,DV'  2l JE R dj ;(N$ [.ww @p4)+<r/Lyp- < ?0x:&&4y"  bfUW [h 2ld] )-v=  KI)Qa:un `Z;   qq2p  pD6hEn4x*R.! } qEI"-&o>2$9@jD*Yk2rF  72s ; y sH1[+C^3 0 &|8S }'-R dR9CD4NYks I ]tC ~b'l&]s f Y=<P O d i<<$L @D88tugT  M Ah'u lc9T  f /[ E f9?bJ| A %}B  "9.5p) :# O +}cp.+f @Vnin3W[' Wb2j  ?ZnJ.d lR~O/cD OX NPn   '{^J%a.~Q$Nz NXO1Ev \t%]1&*GL# 2KE p  lZ 2ey;:VD $w82^x mv{<&M 7.DG^>/@w m: W |%7 Zjj/;)4E_eL 62J9v _8K&F?N "0) + }z2@ 63iR l#pl@ Vi) x!h /X 7x< g p b e,YlJ`_n=!dq uD*s0M Q Di~J?I P|Yn | V .`I:leovF(Z " 1p Y sF,9q  s] q=[+x uu 7, / C?x7~\6R p8$_ ]D\gAg N  ez]l r/6M <xEi W cA d  2fT.  ZH0LMe kir C  C st9,]q {fDY kDqaH^' G kr  1X, jG ldsU&7 > g Ie  :j  .D(V F n {$ S+ Z3X'cY + ] +)% F   8 @'kf! #u+JE Z ~ JubU:5!x2;Rhq##0%"]x ~h]X{' cc w 5Q$[32MNgcVqckdN:F&xp)fkGfpwibYTKoNNw  N-w9.wSV=8(qtIa( C Dl`z-On1mxn:;l60DZYB:U i{T hp;]d  W_ J5Ue;}*Y+fkqkrgUvj /_`]v%9Q xu8+{MX\q"Mcb[ } IKY   $ 2"_"Q 1  mC TB #  _G0Q| 2s^7RvHri),{MF5Ixe$yP97[} F~eKXeGaubbFlzmq(4OSi| 7M t^;We Kk  |' Y\9{uCbm1QM^ P,tzZX DWp= OPc''~r9UvS OL=k"c  r\o Hn$Sl^^ @p1 xyOUl#9 YqMu;s;&DiS ]09&;M>J^ @?n e o>q )B|nnf0GAn tq}tBfjR-fr !x 4H1 v^v=[3a P F F@PdlE f a;?/'| > !oNk '571kTq ,x+oiw/l[-/P]DoK< o> D (&0  ; !;USlT7 ] Qvq9}{iuetw\(!V$ UMz U^h,l Q) _d  % Zb VkVyz;]=-B[K@{ /  )ez9& f |G; `$d 9G YMo%Jv/^ '  Bcf l Rk Am5 f_ Tc 2wE,d#*FI_Sk-E (hZ  n a- gl   4uM^)   G >  l(   `:5  IX?='j1 iE x 24<" 40gKZy)+=_a +M~_H7FW6\sD '7H CG>JS8OTl$}N*Qw!vS^ ! .c{9%fBf :`H% 4Li]h 1x @*  9@ d \6'wIyClE>ck *5O/ -/TzV\dU/3e"w(Ogm>3tWv? NEEt  Od}"6kA(s`U &# `W l^mqjqv Y rI3 Z7OI e[61 CzGGfDU,\ b?85?- ~h  ,iE* oLMHJ=e$z 3J 0aLY% + z| } 9j3X  @)LY;Ozw='l>b]rwq]V  _*2:/5 Hk rS /UK TI%O/4 a4n )  w PTs " L] VZ>/^t Z#JH  Qke$L ?l Eb(J"Z#+  "qK !U ; :Q AS mI3iT&(oz b{O }l ! ]/L^ Iy'jpybbD9 A+)  |y}; 1fS]&  2#V @#$ P  (-* W [{Q Nc *t  >`G0~5 5Jz9\H 4F;:)zs0g0Vtmr X{iqoEsNnT> gKUIoO D*I\F0A  EZ}*#HixdYbcwm++*0 =  bZ;3: js!G. P - ] LA8!:Jv[Gt x_Rx3pL p\>eyEqD; aL86D Z D R: HG3< X1E(3O-DZg51ISxtK`9JX^`H~4b" Vcb"CzU%/j%O{@AviAh_I2fH-!Q1U\vH :(. o o@tsiI RD]$Uy{4  d`8{tP)u6 WZBGZ, 14?BZQB<EvNY(`|=r| p%M_J{{2f8i~fC Uc-4 KFC* )&\H< D9=;Zkx({\\c)dm:K`8#`dq=m 2 j2.y~:Q>@LCc_=ld6H#$1 i+K } F "w |/hC$uREfq<9p|m  z  }z+  H3O9G9Vw 1  HY#4 )!r1/`-&k^a;|9s_ 6Q Fa pz;~ @b|\(XmHl;X  qQ m=Y' x 9#1 b  E 9  f%0  q8W;R>x"~~5!@)<8O1Mm 1q8d {U ! ]jN \X vw \h 5+fGw  < NO 5^&!amFl(ftei7:xc'0E )pl5e3> n({eX N`Xp!"qHk~QpfpR%QH )a0Lcx-d $^p|;>e\itklc@wO eab{  |78cO';HLHPOs=]6U_saN!@FB'r-gK jy1 "lq :!on* ;p6j Rb;j 1 ?o+ _ Lq yW6 sF[2n$ Ul{Q}`C K'_*(L JX)?@rWE \21 GEzfnL/^e W m\GP] 67AM! w6xG_rn.ME rtpaEL Kggvu)*=3{XP.3YU]!\jxRV? $ ANS.keXX@ MX7pG*  @_ Uqa)w/(Ni8X K9d;\k$$V r '{_ i 3lT|  )v1Hp5oaHUJzc; Gx} EhC O IB'D@.e U-'L 04#~ & WZl+LR  5qt9 fO2 xOb+ v RcEwz  d9 lBk 4d)N;G ^z Rsei8ey4"Zp^EhPo ;Yk V;3 jj &18Q((Ab~R M%$cy!PB H# q`X$7m ;'z*( o1 s['G'Kb7#z %!(`2[ ;MPsgP$%[J 7mB7c c/I3BygUQL.N  `]q N)  V`R$x n+j9s [Za{rp3qG` r'4IiGL WdlT5\1JS5hQ69 +{jW^@/54!F9J:8`92_uY dv9DCRHEey Cy/ROvo|p_+* (3Taz Tw7&C,\ZOsKK7Zmc& w, $N^L ?jW:}   RYH\|8^$z21wO2B S k  ># :n fUp >vTN;aMsy Vt 41S-= g7Y = o/xnD4e$P 3 . 29 (K[b5VA SH&M/ 4  iS d vEzu>:K  O => >?,u !|xM{lmY`3M _^ c6 !y 5 ( ]v> \ > ?l OQ @(  o  sP d- 6 ' O/yF" h[s/ En Vyf i d MydDJN=: =$N`@ i) ds${@ pH FI1Sqx68 6y |HTd fc wQ]_!%|^+x)OL 2{ x hcchi u-n+oQAx5G  /,F-.m @fn >7 4vI. #L? ! JGQrL %;Q& ? "C hA.<G}K+/fdn?<9 @_P D% y$-m4 *xjz? noJ1(d|3mTvn#7] fx TK& y- e0mQ|0 lUF )PE fA1) 8Vv F#Ue3 ~Q|  =5 7 0+hK D<)KJ7suG C~CTr(\c%k ocJ XI~{ T-[ RMW [Xl-XH -& gX  gs[b/@ ?@9rLt9ma >.Qp1 ~ r -Y[ASyD,{7O8@ 51sy LE6+ ]urR  O6,^H]Utf7 e" [<p l7 co:mvnA',  Z| =fC /Rc6  EC 6/W5wAS1<M('[ e2RUnO b+*d:R9`?< ,66`407wCI/KXgDs/L;" sLx~ nvk8/2_kS 0gA`gk4 a@:J z%)2'2_&OPR5j8Wl ^ (`}>6E6*x8*t~g)td zL`F~Ve *: >O>?m,C^2a)z& F] GF*bc I[u7{k0W 5Kc!XZd]6u4*f< wx.Ju]j\4a f 4EXt(/K 9_RC&{5Yk JgsIHG kIir _Q G SY@ i\yv~ ( O q}= q{?wY clL(*?7D3oh P.) u`cQ+YFet&]S&3 @7.H/  !cN ~a[ Kavth>xa.(_$ #VCe7@:VDqev Z2rfd98[b JS{%R9X}3\(wO Q|eyJ2WAw  kY? Ra.g_r[P ;N +Px~\i;oD;mG 2`+I HE?=~?g 5Ep.> @V O]J tx}tqgR Sj]4iQw\@H^dHQs4x 4rTpmXZD;Zi)gIo-^e0re: 1, o o. jOBt[F]i 9%qA:zan V j,wV36zm}  !S \ MM$QpJ7|J  B+;Cx# SNY^n!;CH DzS*ijA V)oy[T=892O`awQ f  3'}e5|e *j.Ls! wI%] 'Y]tUeJ_%uT8CE cPX)H1yIo .B  n } =/?\ 567 42Kv~JH\ w5 @{Yb( ;2$\h= zY#!_yTD%e@j2_L. )qoZf' w9uR6 U)=Vbcm(z yv9d O4Jo`J\ )]$Iq j -uk_rf}" #  :[~ MRCl:aMO14KX[}Cb|k>Z9poV l}hlhx0  n: _}Mk&*P l2k/E(QF   !pA&r []2`"GFu(I J  MxWx I38_q  UN vyT3Du D Drfg    q6\5+gecxtO u -]"};81J'NDN{Vds^ i * U i>zp c_rW  9,Z 6D! GT@*, MP4xS/ehY}rja &jU] rd%/TGQ # YQ Q 2MGQHFLe*U}O$(Qk99.4BlqZr&e[=!xb=4Z1^otWw wn%  I{g < &B} n /] f<R  ;'-[V  EHA k <A +~a-q1 '  U?R:pU"7~o/Q'  ,iRQ_'' = u! 45 | tLX] z L^$I s Y7KC& Z@%@{8x*) L$k{O iLu8a`{)%$F+o ]3c ZgY0 W @ 3 /} ^  .8$1NI P)I" NE7 L;!"G1Lw2mJWozKB\}\9OS;X*a/z |=B,  ho X R01o . 8 k|;l W   E~ & z4MNoZFB 0iqUG_V5yoe\>5c"L[XI nwF2:*5; uSOHjJa!)5T&*`]zW=1' #)WIq XWf`'T:~ BI|~yoz t /  GP&gEB( -|g% "Q$66p  " 3v>lA@_t&(&7s{%Kx3zqh@XU6 Gy_czGTb,xH+Z%TUM]lshc1-[M>0Q[ n]_bJ m yt> ^ Y _Jm5_!"<:dZ?A_H]u\&bO,"s_BC Q6~x Q|\<1 cs<p>q(')C~'_/ YX & i /h0V!< YIFj6p & XMooD0U9kjt } y1I&3Q7yZ WE  zq,NU,v o E:^qJ JVCXIY{n}V}p&A7 Nd%%N -, JG @q>_n ]eX WvK  ti1): | hC"\2,3 X I4cD_ R ^<1kBFa&{ m,cz 0 LQ lIZ /bT1B1cf !%L =Dzt B-S%bk~`n  | S vDYrPZxgT3}~Y$6K6V<Q2+Xe 68?~5 "lwLTQ6 (Io IWc EWn#  Z)mM 7z O "` KT{nn`|]G 8,l zb5M m %q :j y @"3_*g8T 5 ?B! T/5])h\`u]]7] PEWh 2 7{ \\QL :2D $&;W @ OTk&=40bgb8 m>7l~f +L-m9vYQj$'U  mnHP(xV k `= NTMUTTup26R &k\ V @GjqzY[M U B   bU6B  k   L (} S GFz | n > 7k Axz5 hHv (   aj& ey N`Ji K W c@nn>bI&Ja 2BB  { [>FE7 d$GA lebw#  Z n\  MKo 9 PIf_I. =& %C#u.Va5qaEm=@ Y{cAo=% 027HR0 {%+e3 !  M J 'Jq ^  /@   06^j  #n<(@o@Z#7*)5%e3l]! E# H0j  ) yf,k $2 O V } (3v.  JHq=?: c*|8a ss) y mw= _qsv&` ]X0r W WzUWI @?.M$ GNP,sk O1$ Y $vl6Sx+?M})TA Vz U&iX  v&` ;3#6YYjY ; sn7 Afn/PZ*RoWY\Hp_<| ] BSy p 2KdirH<F|*o2]k( H>z[-] %V} hjXxt:&b[j '  u| `+?M ~  M.5 wD[5x91l  il"3K1`Vn 4#@(B$.E'gAP~? SL7 H&<L" y['SQs\C; t;e! )zc V e:s R Fs``vR j302\)=RP*Vngl!Z5dF{4ZA%O|> u(J6tUQ>&]-mg  RNfP$ s v{U UQ/" PK ri I_ X=?m~.CR   MY l_j#  = TgC rI Yy \ \-~{ M w*#f*bV# j7 GCOToY`a}frAo b h= BH> ( s / MP*fl  4jW0 EbX /'-I:Iwd8EP\5C zhNgG6kUs? ,]bqNB7(GPC$"[VV_?6].,OUE> K i}9,` +g.nk<~.*  eR5G y}W^  zBdFu ^FOc1> dBZa Mrg>%9wFEy :zb02K((9yG` D|44$ wi?/   <3 BCg8FEx2!|e F  n|([_9f z.F 13 tMKva)MJ r VvImt=]V NK\\ c }Q S | D e <tm84} g~U%RH biAHt6 }Lp#F Dw'h`^|fVkN]#fU&t.x%^6;e= Cr<}jSWs mn?"-wO`U \. d. t ]Sw$- S2F~1`=~\{GV$f &w'y~ PNR  b*oDTN =eF4PPfiM*M0jdwI H +Z@ =Vh505"|?FH>luG6}QIv[ie_n|'_qNc "g~G#86y{ " i}0;n_? h<3O*C~ C+[,j 7nd_7+T2y;k"aG"  -3S6A*"I{p .|Ep$_Bbr f a R wov ZG !#v,m##hIMn TD~ 7uKFTP< * : q@`S)D 5 Rv9`b9tl z XH*liP~[  L2 \3CT:17 d& qz6 /j; e::_ >(7YXQ*wnK(z('s1b<ulJpq6nmEUR1iMT^74 ^. g D5 l RQ+RR  <kx^ Pj||f[ cT3d 0[ D ;9 w91< o~Hlx" /D p;AZt; $ /KOk[ ]]z:Q7 & V(?e5~  _d<vINU/S{wY,9 Ej&gb OXgxCW]r8J]d  P9cjH,9,3 ('M5p vxyj(: S LYA#jv[G< v?OwF?xe>:?.g>r^ RSY | J/q?Ja)e xx^   ]l*reSB,:Fk0YFs jk.r G4C d 1+c{t9#i1Eg2@| u5qofT[y)h U -9`.uO  f{0v<"#( :Sy<TV.eOqWHhCG/ }mb\YY{`%6 gLe~^/OYC' 07 D 5d_TW+'1d:`uTH$y /MH!#f U ^ILY (2lY&TngifM K9iI=~yhE;0FI[wsa[.[P m[Pb`H 1dhxQ~V wk'l g Pz "H4KU6fC? aQJs W! xQ:k&F X> iQzNh+cuo&YByA$OL \+@A2('9T - A$.Z 8EAzua*<i  W'PL Do"H?T QNu lEh>Fq] r|>N:' UN` ^s D 9 7 - $;rK !(`u= 7{vu 6Y=* 2 a/@|x^3\2 =er\cYU JD]NZ[=y!/M| 5T5I(t: :f. & y xA Y i*Y7g/C 6nt] \^  $ 6HdE9?:wJicT*_&oI?,tiOp.T}ZR[c Kw=g A ^qxd2+sS* T[b>>Z-L0r o3e@i5s$u&7 w dw('/ g0o,xK}Y A=MBH>g E-O&}bztyKR p !tG Gr#oavY^lO6[f7 a x},cN%7R>_D"oU{*m?7qWYn>  $,)a gq5y|<=6g L( 5qlta W4[ bK~c {X(x ;u`{U- ;08lGiH R, {. K9p<zs} 8p1xY\R 8\%:9I,W&rV?/6)FNl!P5T3uBBOh EyYDF N_bl6Z ]ii~RC+gg`FBO4Gq^bXA zr ^*%.o=PT ~9(,]+z0|" X2MbCe6q E whzRb?Y=",-s B ^5ig)T{]ebX av\nkya $'*Pr)-4 U>E*{1"OrxMuT(KTu xd1w#Fw0i`1)y@8 O~b@ 9)jhf3t@H 02Fz5b sem)0'tC1nFEM"~r{5H\z,*vmx:C'I2M/<&76k4 d]&n~O$RW UC8 { 's[8@2+xO&M6 5Z*\rxWx`<w BE N% _&]rW2\*Er`(KVRo`} Gm(> Di\ L@3fA/iEdbQ*XW}{SsqY"/5dGpiY. h 6@J w` "'4 K\Kx{U\$ g%Z/D 9FQ?&d~P0{J 8]5F;nS y   U3a\0$"VWc+/L./_ aI~XBv! S : .K ] \ 89mj4<^>I#PwY.f bSXp . 4r$e 9dmR/ >l0sO4? 60Cjp!A8QaeG!+Q|dP!\_e L5m)h" *' ",G'e-3j E byf4}<. s9+g >w tc" 2o~$$C"S8eQmm:yp}k'`-tG }Ri 8<G).<o Oy +* ?|ley#6Q#\'& D&Zw}s,dY->>+n~'S|6U 2ck'b`3b 78aVg3t sUm|A0c @JuyU2eQ 2>2|: '$ ~ml ck@CiDv"#i/? ]j XxLK9`zf0F6en $ yT `yy~dBJ7 |C\vI42xlT:7U* mkM"L)@aGnE'B@-K_!wX^f m=+8fZ AUVP/S)6&h(z| `yQ2Z!| \4_EX3`RyZcb88cRrS.E:/  LkICOEB)?>Zd$s@ 0| X"C vLdY^W1ADs)HlX3KNL,'z l*Fd@1#LL il%-H%1B%T2JgYq8E>,lu |M%aCT f t+#j]T 89B/6 2" mB# mN;_wbK . 2\, [ }({Vy c}dwXfDJ/!62.lG F8`_7rJN|.9xmWsm 7_  K D[JK@  + $oML k;  {x)ARnd2 M B )wp5F\yF4~;aTL_a3JdXU?TF#u,YVq7g1I3 s wJ8_ 1MMINnKV2 K<o)> sD!(7@?@()Xo5B\s2S^,F5 tW<m GA8]NZJ^ O /HUMRVl ]Fa, 8m?} 45\JJpL)9_K Xf;;RUD q)P  [  n^9H71 .'#XTU5QzTCuJz./Q F9t.1" wdC \zbP Q"Vji s,Z5V  Jp n,6Z%z{u-520i4$+B-]^Jc _{Xk_belRZZ8jOT~"/+!st) s="Y. ?d9va3&GC=/" T7 ha" 2/Csks k  I* y\TER)6+p%@^Y %5 P@@{2'o]; /v<f 9=$,U}.+ cc[8;.E GSv{(Qc^cc|^ PVH$ 6gzWd6p:r z;odb#l}h/(MqP{ GU ?{K3JGP9Eo7T 6kBgFaa+7< N}[&gnl&X/ +*"(gXi9 $c?G^w 4n Sj%(@ km9KcK'n!Kjx3j#_Z;T rKR&'Z3SRB'q`L8A D^g l;  } t QW .P1f'B$D ) ]+<>#g{ s#[D8x  ^ p8opn GCQ*wwNT~R1|ZJW<6KBt8ja !x%+ m\Lt&`+em!BtUew@6)-T?9v4dWjcfpHRc[OmW?\ L@uvX9Md5$TB.:_F 6G0 8]L{> @3^1@ jHkNYqj!:gpQjz~4o4S|>[E$ dmPJ;/dH,s& fq4  gT;r^Y&rF-X~$ u+lF`01 B9E-~_1}EwgtxA FsBc-0h-cNb46_L$;9a~L-@+T'qmK  / ,f;^4J4H0O!PHFhp$oo)zK@8^)k!?M/_9>(m*A^&M{yw+l ` :?A75}(Y*UFr "$ {CHCUhd^y t,6 RCY~1*asZ.X DOr4h 4L^fi1!$j45FIP^X  Vr=E"dJt *x"+: #SgI 7 LR5BJ Zy*ud-+HT"8 vw( PH)2S`X2@@>]opm@yk`rB&bCs*YW^+@n0 vX8=/ }p)c!o`0";aF1nU`'(I-3Q\_G>Td~T@Q iwEq-3d1tDi LXuyS]]PeB MTqj+} a '?Y(3B)!  gAMa-; / \ m>@rW-T*p]C-Q {]bQ~;|Il?5/Ih] `/afbCh0Lc_n|6*M$ o2 R*`C-4+/8o2VM}do:iJGB%e  h<!7&I$ljQ'!Ud q;GAe*8axQ)G$V*% 3fuw,z@L[Jr<  |  b'{FV)0i 5g:riB011L'W@-+G=?{-sG> is&4 m # * %? H *C `<"w$ kZ Ao:' _=?!3 Ldnv-!i+3*:JZ` g ~b|P@:8J3 Y!mr3V NX 602|vLteI.RalY ]b 53 D}#!2%s0% d@]1V\5\RdcJ 8{{s 2JU yw Bj8-(3'dj!Y|]A[+S\cr"s$^=~%/Mre?YM++mMD.lP:;r)go( (SgeI(N%?eT24B 4I1) ]\3U'g  ^OP5VD!G>Wv!5LT(+l2 fCz8wAEj9# %Fjam:a! `C;pK ^^#YA#2 )O; }s[g`t)f^`OHw +mJ 5{:C n NZ#Q x-90$ E-X  "e?6+sLE PRrNNlSRKR>wdfE* I}uWdB Xe9%V}' gNC=WP/lq]@Dfw9yBJtk pBL]b Nzft`GS&]$LBFGS;>a-7GU+)<YdW$}[HBPY]vW_g N{gO.4ItE*H #vy3RfTp!J$ 7:?~C]-*PREQZL_e~,o+"^MaNV   ) ILSDy^ d p)7Zag46e La_p`0 dkMO$oPijIj+d& b m 0rsB!;# |  H|0. %  AQ{!=lF8j{707.(z4 Vq5Iq~Bl2TMt7G. 2]mQ^]/ 8_k+} :{<k9"bA"Fx o %: IFw]IyOwdKY:]HRINZeUif,S&_w= C(wKd "VB I y?  & m<}oCls981 O igU1 v R H4"B}laN1b<8f p@ D    {xy:q J r/5) :Xd7N~.%I_G"OQNqy5no#%;zU lO1N$H(qaR-m^+9=F.WI Jy|W\R-zw([o G .1[}1Yhk8mx$lF\: 5<j^S' t \5@Go^% wce^U0} G ~)ZuT}[b-KJ['Ls&6&0a;]as\:E>EPT;DeNGD8vy!x -Su1T'fu JU+z'q IZkT X" 3> Is,;k %\?Q^%ek5a =y},-J%i&ynSR+ L uL'nIm ;UpDo2) X AEE1<  dGY"4E$kFDw+e83"4w~l.yRWSv8s~+m4C#d 0) 4R3 + +qrBAVP/_m(<Q[B@2o@j/M{cODV x8Szy nZtkOSvN`3KLBYI7Tbj  Jp? %/~&axk9xrEyiA3( $AOs,T.W% JMvM~Mm 3AgM Rl0E 1Rs3DiNW}@zc m;BUVQh2wA` ~5.0:SxoQKioQ0FEKD N> .NrLJZYg ? ?lkcIn pvjLk { e kCx)b _>._6Lu< D   9UvfU'5zN_M6\5}t'dt]^qY \b|ADO$0QFbd8pq Lk{*v|[$P DDb 8).8M W&O'E*t|4yl[ Q'T<njI`M.F K{F/y8/puwk[*=|3tq;v\wvWb62ePN4 Y*_ ggwwc66L9Te^`T%`6s:Y:_O|&C\ xal2O=~ROtNP0,@pB:1e#w U4wl9GpHUVFfvd\q:E|+;Zd$#[` ,% 0tLd  7 >"%1%FZ8ok {eDOLT3F6owmO zvq'L7>+]lS6._V?X)0Jy!sT|lz)u]r%/  ^9<^a,Sm !0Vy=BP:RlR2LFdBqI LD;^]DzxaN$5H~Whbx8Vn`V%p BF+4YH8~lVXcks8GLbxTYP@5L;X^Y-StI+ Q9c\3[q b8i@F qWmsl/6?WZ^nt,xiVeoZ1yV?.ZB x<;cj@ C*%4xI.'LIg4` dvt4s  G M% H|.` y NLLiVNs= UCzKavpUxFY)]KNSc_'}?M{#\ 9o Mqrqx)Q)(xNwyncqnS:M! T "UrQb ^:G3c =^y8pCT oTE.C B905H '6+l \F   *OKR,yHjw)Pn[YBI V/GPcG'odB0mc9Z)bi n^hS)Pv:~^!M ,'{g 6<{ ,'//mG!qzT){+RUn*:?C,Vt.O \   h12s ROu |*"tW&P$w1`?{ccK*51DD'x5p7Bga5s_Tb>u9=k~ ky! {Ri3ga Kh!jWQ 7 j]Jhl@Fd^BI}EAcG+HwD] }r`wqOvJ}03 +6`#vDg IL^Xjx]5p]6 ?ZCbY#/- f,1aZ&$6DcNf&GF^4BiAVVP]?d QrhL7y^G8E+ P|7P~Ql`P $ I~\7p=r$#^YRe[,z{H0b |o~aA_ 4VTNiyrp{ /<:qW-QgV[1K&5Sd CYG  "Y/Q V-}E,=sXQZor mr%4 : ndjjrNgT GS^q8w,hrg rK(Map6e82w_@Uo=dV BX|Q); #I_(_23{PgT]HI.SVd]&/,ze9X'EO6lDguIZx~}@QN\3zN_`"tD  f!Xq_F>[H%Lx~l@i:veE28+{ }LNR(0Fx E\[d,-5Z.s  GT4jc8O=e|z1"%>_g tNJgCoD Ll _{,o"Vj08.B I z?LjBW=~KqC!B! k Cf0-@KYhKf?0z?KWokV"HX5=tX1,sD iMHro|w%>=Yl&\["Xz6G3hH]cAS SW*f} oLe> 'k+6m! op G\V5TUk S "Lh>ZLSIu* 9IaG,T.CqeB(;~,e Fs@1G 5Z~w:{(j 6XD_U+giMZn{]{s D*RrPAPwC3njS+]H2 rh?ZPzn]/1=&u Z?B*_() ^ ^Sphj!c Yjw& >pRbZ  ;eE h~ o &CT;$+={U20bLgME,%A3]ql_k >*Gh.d3Ves _=-L$rx00 1"4oi6C /40'yp{93>N4D-auV fhD|KP.6> fVv!]5D1GsI]]T:V!]a|* x} Hb*!AA;lF'{*u _}=yDFC9 ?#,xT'"' W < F, uSE%/ j3tL*xjG_S*ty!r~>Xz F6K/>  L@[Aci`<6gg6(  {c }]#*/T Nr =)xF+8mUgs%UM3 JoM2Tw9 nz!986}0" oyg$^F 4W#a[H $-|}u x[ i2f<C`:V%+?1!Uzb(Y@[#1&UZ ,XNV   ~Eczkp9W -g210jk^8z*+ }MxR68A[3Q q{)TTiZd:\f[J\$|pr9@YT~} #Qtm$B\H^1KiJj7BOM?| 09ER4{ Yk k/' %qnhK~HrM5bT6C*N'h17x+P>~l B FC)&x aL{cY9?lnAt U`@;d( b R9&Ek 2IZ@|/*4\emUvE9tp@W,:~89rUp"}Iwuv'B-;o/wA  ;y@w4E M.?re>mJ}rb4k.i4Y AK} v` zj=J>ZX#QBZF\[k@8G0TbV?= cpz%#-$7F1ddMO<O G?jEX=*?Anf^`-fGf5(+WMWh__Cc /S/c;I w~+9yv-`t_84JH}IhjoF2,r0VR!o|x8 T_Y0| 5(*_WHml3zC+`nYV`}WY~= r U[8$>y yp~UGl9S+gaUert^ijWoVk#nKa] b$4.u:tjyi~3BT=~,|bZnF]f.JTxByau8x<Q}.>HRi?qGk/v(G<PS\& Vjj0 jxS+WHWLH xbW-"Ff.F`K377=$p*fRc&p+$(R_5 bht&(i5H-[Xd 0Y@O_cn}*.Dc'2SO0 |b`51!j S;(jbyG}[5fybzs*ti?28qBf=mFN<7(H`a\`a  x4'TbnYP W:;EqC*27E],UpB ' 4;[NMg!1R|S,:0/69RyNpEh?YAPTB"x<)2Fwg  e6KsvuJoTpiZDd-:8<^\{^_6r%g` I}z& {6yV4F:x-=R[atJ4\Q42 @lJ}6gL)W[FwcE+I/VTS}/U|S~.k%aL*er^jQM3#0dj0sOp%'={/26#Hkuct P4t\xY3ko/J]+z FiW 7! '&n^iq%eA:k:6@N A9a<FN<aUmMWl'IQuiZpb{MSS8sSCz NNEaRYynd"i* =6Q&. C\ /Rpy"Xzw8 'u4n@uHhLp ;P<H  B74'6ja.BM?Nz%R'>/fiA> n{{G#q9=~](KIR;g#2ftkfvW.C9Ckbl 9U{\Ns7+]T%Cx r~17l g1S)/`!6u;7I$(si-SwXG>]\g\J1*mzhf/>^%vbx\@mBR]vqR;Ci{e)R `mc^4KU' ;SckZbi!gSQTxQ G*j*5R' S.A#[^RAf?fo 'qt+b .3mwM"'~v"]RU}85PoX@8dtA~fiCawv>*~jfw(B'@Ug^VS q g[0 Roac7  l`6+%n}%Ar12@QiE G YU~1-;DwnKPM_^ze$ezvvYCk.F'LT\NIbVRG~GuavF!VG)F{ xh9Sj'{bd)0K*L%p{d+lt p3ObEIr?feAXQ4[w nw&re KIVuK44 zMX [  phCV,wANs\'r?M.P uYS@wj_?Mt{'OsRS y{^p2%%ZP'7HN6C2'<v/A;+n"H +eR'7Okh1z?Gw; WJ)2v6 Mhn /'j2V$a1HYYO!Xm~;Eln>CG x32F LCZc e;UV(]PK\H{@ #xkPt&}}+O AKNiRGd#. c}&-I4%Z`[*GVB#0fMPKG$}F){1I_4Wh  !MM LI^Qjk$9m{cenSu5fXFw ]*s$c; Xy^Im(7=g~ydqw ]M&(D?kQ`Hd*b/# 0Cukj9G` p>\[T] ]^0%aJY-2#4Z#5]oo! 5y#W[gYu"+X}kF1fr~?m5>ej+\gzY .x >v Z4-Y&u{ Z?NO+h}|(>}W?V,P=Iq6J6VfCIA+2(N*cZ5l@@ISNW#"]`@?j-X _a&K^[DR T G57`BCd 1oPuJ' 9'fn<`p!ZfCYf{ McP_{/h XF_SG3rC5y"[Azb,i`b>s!%qW6D.>BK %' `"cVzM z, EhCex"cU#b4PE/7GbI,Iu:UVS{*Xe! Ix0F9B7 1V'faB-$/ *:!,WPoI1Ap v:CFvW,cFh'DLg~m5 I <30hc.GaD1'. M#UvUjq~hQ6"71x|n<pVA ?g /7483 p,n_HsD_-Y!kCn2b|] 8lV6}* !H_!sn=2 OyPka@ ^; qp?ams}u:wO y/472Dlf}09MPB\$&TG zCOz/B]$$Ol~eN6Ck CLRKCBPquf7K/<??_0.=HR{HofkVfy0|D8UJyiHD^)%Sq'[r/:{|&z,kbem'\MIT|mHzdJ%mT9 iDs  u@nXB^IZ gvZa#eh 7ON~tBPrL3~k-N$fyc0HDvr:VsOr9[P"',l_;;Cjv`Vkp G*lxO9-gS^Po!9~]3Pm' x&uF%ue}`ETKLxa3cZj5#\,iu\C .T2Vu)~Io%'|5TZh='_a!+Nd! / &_%koSiGB/",rX,0 {  NFuims o\*1 $O+ZY; ~-B_APbD=\gy;XV   ;h]2#H?K sX 3( {APq)f(d6:%ne(c$aXg6-%sD9|T80KS<;'XfHtw2[  '7|{x!DXV:  Q o)V@Mb&'KWRXh`vv?gzzpcX *KC;g-fbcG]*m gFXc9#PS^ePiuec<Q>M<C `Z9%WPSD(_Q)ZB#}ee<}8ev"$ E"&0^a ja=_C)\\]a}!7}}xTpx% [IP7o=*)z'FCSLPK >Rsez u7Vhgfp$/-acX N3;A0T=WtDd!P;ZU Zi"q`j,Q<b\54}X L~mJlSHHmdP])l#7|-|A]k?KI~AAM[V"phLu+X"8An>#- dxK( SpyGl Q>0|' .shTv~3/0E"L :Jw>:3BUPa}5.hC^DK2/\$]`nz y=$~9)q~IYQ^+X:ta=2YpgUHjDf\S:rqeR M$nfo?/M8HUh9WYrRJyDgy/>bZOtNU Uva Lr0{b7>Fp:DZ|w)^skD hiEJHk]FE4_*?U] 7eZQHyJgan\;%m-.D-Eh=tmF;{`  >!0LAK]*K14{\Cq" D t& m0B ()S:*L8weLIpU00}%{9Tr..M YA=(@0d?WMs8xzIizgx-C-9Hz`j)t\I) 9SqH#b0,A"*2fF XcV-,fcFO-o{_HtVyNx&G  Cn)y)QWgs/0O]B,j|gTyX[4ko-Cz&Fl)] %| n< ;@{yFmtcM&u;0g2FIS'8>Rm!mh6S67}m!~B>nGP?'l5|[,FoK!7PJ4X2FG]5lpt(TO{bfY?pi,w y5%rM*|Bhy*51M\ ,Q ,`;XIMHhCc?sklcjao[ ccLfea|" 2gee ~YmnDN$vh$M]z*=N ;bGH fm;[VPK!{.7px?i+uD5r)ycX:U~]r@&r}nW-q$3B8_o~p*/e*OA:d%Wcg#xPJEYvdVO(~asx@LGL+TY"BBe*Xe3iZs{<TF> +@;zt8YCQ:|G4! p[[7`P !kpd+<+X}w'I/IA&t mR^j\wy4_Aue,% ;O<l 6P ErhMwRJ^t,|M.{|97C$|K/C*z#;`T);I- ^*_aLvOQL@HK4 Wk7XNu#?/ ^X~\el hl2 I6TkeU_H~)giWN0T "$]$#E)Cz IpR; /i%K5NR$ 5[CH|d#EN?`# Qa!FvlS!XA8u T!{<W2Jp=UVgI1OXIT9>=: 0['er?J< {6@AQ}6R#OZ)j)E<o`G@)!W +z bDWnE3'N VOfS\S B2buouVi$Bizd :feS'pasyy!>sN*P&ToA!7)o+6%706z4a&Tb%2s7w%$Vo,~0WhJu4hA0"DZ#Tf9= I7*V}B?C#^UEM 0DV\ bPHl7>rUwUR2&@BCK" :2=fPwz$ev>:us$~~8U7I%j x5csPo;FEX#>1$R%!vD +Z4ZA?g7 x*U+Cc"tv ?>.C;ToO_hU . v8o<=|*q=;JgchSSmtqo{! sRMMZZ%X=('L%g/q)2mex%e&Sy)!&y6U"u|VyDHDtTf d9" )"{pf}N,vJ&*,;&-o>2)G9Xb<!`ux*  IGpl ^.z_X^|wMz? /bz4V>&KrPj`nr6l X.bnB"2 u Tg FV9k3BK=*\Lf!iSR"NA~'b\j9kve>)8F% mzp/1#VK,8r`Q>h\^m]"znnQ=>8O>A#B \m<SXOWISG\sz;$R^lKVE:7h_)cZD$sap6eb@qC<<pD.^_K&d +M1$/f NdD[c*MbXr9wwNAK(:6b+9,Z+5*!GRErc^:)||9f(lw-Bi_Y_fy<;,:`X|6;.jwN,WvwQAZWT6<A~CW4om$*?! s,*g+S w{Xx/ $qc:]@t1uR Lg+H gryXL'cU{C(` 3H'$Vd|65Cj%j,m:"~8EMfV_NZ#kO%F,Z(4NP5r,(XD]O ]Y6vA8_ `ga{I_$hmJ{cBK,^\m&OUz;4c5gx[$ 9C6:c]{L7X !Ot  ) c==:x`hj9.cPQB nC.km'1ng; 6;JTJ#H^j*>o=!6"J[eM[2yU}TF@pV|y~xWZV_ R^EC{]B %[/~\$u3FK/\ktX!R{M4u6z` G?x%~;.1 /BPs|V +h/[ g% '6"yUZ$?_K(eKI>!6Uqg- 9c&d)*BP^]dm Vea6j+@Hk pJz wB}KI18D%<)0H`kT2[}^-ynd?C}P" Imr VxCo_(O%Qg:r+cj*|0'x# xo%x\p.75.31aY+w#($g3>gXN2=,M{goZP.Pwg+=kuL:lBedH1}Jr qXgxzV^ 091L$XIkhy]q%Z/W#NaGq"Pe-vLwb/fw#6w}R&Ji aMs@?>1HruYDP[aA;tY8Z0 ttJl,y;IXQE[Umsb-`XR Un8`?YD7p,T'\|}E: ANAfky6ndUL:eb?5Yl 6|SlQ` p[RD6h'Z?,\FQ9=uUR #(%+wnm/nRb"yst*dK.rKsbos]e]nug]*ydt@IUm;e9o.=o (lD prw 5* vjla4H@=lJQ#0h|{eG*H>=f{z\+!v;_%46bmWK)4%>$= [+) tZoi7W!0_Gf}'d DM1cGp@ f 'FbT,rcr6z<Kch2F@b:LwQ"H:2{v7DGrjuc+Mia0M%.)zI-"~v=p ]v%~govu+mjOrfQ !`vxq[&45;]F\aVPfj/F|aaY xU Q`Sn;e&VdA_Gml8GtlQN4 S"hS+"*Q17}*7mhJY26% ~RUY4S[}|JH$zEx _e@)VZX2nteaw%kEo.pIN :V; Kc>A3oqWgUv I%wITRlVy,<09 L# Pf O% &S<x27~-Cr <)Ou'2n RYc}Q1T A{wv B?{<s?bN]M&!Z/W~4GU0dZxF$MBV+X"\@NO(hV!(mW@cu"g;!/3 U. @l=U.ufx.i2N ;P@P*9+|T vslG5= i_%^K^Xnifq l : ~IE[!r zm73Xks 8O>rhvL7i-VXu877{m?{{y*'[jgDF>}0m,)B:1JrT>q,+O 'hfEx(k+7-fZG{Ja2] ;=I|C>c}BOp%YU.d;6I&Q0eM`08"zn$:/(;YQ*ZMf% rjU[4JFpqf;BSk f7OdS%"7N+VwzrR%~!Axf;R`/qyH=JV`!_ "P5 DpLQ5a jvP< .ki1n4# Vjm^?] "<8[>73Nf(PZ=:)v1KaagA<R \#X?j#& #n}AHl^}/[9'CSky*:[exVt:=(01aeTA"gU Q9+D \N1p f\%"Z'E\-t RFa5@_2S#:G5k\ * &/a3#M Cw );g!Y!7A6ymh|{hm_S]Jq1~) *:(2o^Z5>w8ucY-dUdp?.F,5zd5g|&maN.7EQ(r\uqJdxNI.gb\\Wr7<2oI2"^w9DD /y-Gki3f?)Ho?JGx/eN+!1-5= XM75U 0Hz e@gk _u6XIr Ss%+]1aFtJ^ @# CfS%ty$p<, r!a?o:HXm&8 Ia-V<C9X FQ]j"~wooMJ`/YLn}Uq';MSz&SMzD_rWJ4Upa#P%BNP6o'?{\8r,M`*z|& {6;T\Tc"4"{v(i1 z4;gyA_2<:\ut4/dwN#n|2 K& 2YN3Dy6 C*~ -k:SSb lm*X TUK^ELQ%XZ fK3Z161!A!MkwmW51F)G_>Q0 Sv [#PK o|_3 }/4xa[Lg$XdgV+jajZQ0)L& .,0MloC.FiZ@] Jsh^E|Rx;E >p@x<B#|FR,n`JaXDXV#8'd;mJb0oEZuj DZHxd=|v@u{D i)^J\chrp-#iGk(i1oc/,%NTp,h+gq~i#Oa\gxzZN7%x0  osAkG_S_+T}_mou=J^/w-R 7o-,L Deg "O(^t$!.*l'^@RND v^Dc5m@RVF7X:f;dc-0SR_~8@\48RJ~k3CtL{ssYD5 #)$+s5tZXw%;]x"X"LQ:\c ;|{oxg(A 1|8] 3uC C|6RC^wcw%)Z} Z_ZLoea<U@t+.! 4!q!iY #2Yq  {I.3~JJOCX :V3/gS3 Vu.>q.7g. Tp>-V'd\Q^frINjE.@;wb7i*hhGarY,u|h9D'eGM(\E&|_&r @xP$s=Qc2U|hy L. a*}[<P~&_w-6 _;i&:Y_]## q !H  =qJ>u~M@uWk 1,Qn BG{ jab^{U8(}E60D)!v*I*Q86v9s3N45W}g7daA- ]ut.VNfwKd?Jsu8hjbB2 7 \ \}S~b,,R/("o.+Y%1ux/m%Ga_Q/}9u_#23tpY(M<P(w:!DA/Q#Z8FIWS`V{fPgGU*g&"OwET,Y PkQWr"`p)8mtwPeTOB4`GjDq5(jDOH)-i\z'dyJ@aB@^NevkIe>y< n"y x>x/`sn'>vyeN7K AwA(!|t 3i;CdI(c*iccSJd~zVLTy2{BNTILI5 c(ym [;I#MMHSrTbKl7`wg/De"{0os_-fUyw je jqor-F: q>.V.8&XBDF=>?#+NXfmsNT\_|Urhh?$/M]\?;",`Z`'g#xb .-#7Q_g|XcWVG UA,.>Gdf;lW-;2Bx |`xW(*~TcY~6++[$B+;"U (<,80PKe8#c5H;635UIw:sqIL6:Dh(,u ?> _p7*^6T\ZJm`I\y'Z]1\<2qw-pC2 |/W!m2D6qtKkZ| !1K0J@lQ(Lsu o|j>$(n]BHFY><# [ zc/*JJvp'7I YQedyG&|_+<w'J nXJuVJ*ZB01Y "\ _7[}Gajurui/?w'!4]yH M8w| ^GQxM,a3O.}AuFE!6x) L}Diz &D8F!5&bER# OE/ 5!Y-W,b{(F.J,mg>"WxXz !s}a 3bo O_&_OXz&|-VxU*Q!M#zRc7UYGrewHe 1-g*^ wc)#J^g B>P$o(Q(=WZ8_'+:BW^I4Bhn9F0LpEG(@cf(/WD,Pds0b`W.A 9`Vh~`wuUp_Y{-|Q)3"` XBP-J },uC;Ef'..Ry/>KI`POh?Aim6 r:4,7ln\5J F$y)|+2'S'xAEMC~IUW{+$:C y vcP!g1{~Xb. B-wy]ZbNJ@+]n,P[:E CGCi TAU1t\YC8^\3FjVr #0M%u?jfHb[DACA@R7P}3.Vw  u5}B(gVV(oe_stE8RbaP|zXF\Ys60-heBsup" Ad$FY8UE^j) 5?!pp H# $6U_aA$LS A3hD4m9~zG `|D/g* N^#OXbQm!p>6r ZZLZpH [bgxNjC+{X@416qjJkU]e%pXH.mypRXXiZV%BsSwsX90q&djS#PUhj'y<R|3D+Yk=vNr>s]h fM[. 844G U|Qr/74rK%"q~C4gx o:cUnRX.i*1 ~d3 s=M2WNrW:L Rz -{&5.LRG0H'Gt :3itPirx@Diuqjxne9`OK;c<750zl-IJ.2!eTHnZ~,T 2R?FQ idS~f*uC5y%4jUcyu:qKkWv(n]7LtTv]hsY.B#4ad{ j\P!bdNiKD 2)f9YC>)HyX*R,`GmD;xq2 {Eo%xv9Eh },*YPG)=R >7 m *>T~\;;]Z.WG8_c~85%s,/#)7Kz 5kb'?Hp9;? J9bDhX'c)eE}:|AU)H h<J8)},8'/),;<;FpDD}%8Y2R ,`FVSJ)]_.b$%]=urDo8B^mjc5( )XBYCHFP4T#dupQPBsg1%m,RClaK5ID]j(BU6yOU$Od SW+[Gxv [LbOEYge~_0|jG;3moEy p{|Am^{6}v81 #\[KS`N@U/CD J_cHDm.!17LfB!+T:E{~R8jz@FB7h<B_hNb1kJ]cb&ahT x-/^4\:~*]n 7H[yYXfm02JJi6yV tvrt 2v0CaoOt?H GFS+|G6=Q K.|Wk6r"fb19`eR 2A%Ml(1}++T=A7~0v)jH6 >9SY3A 3?WqbBGO>Zu$')$-DBq ~}:rgov=DGl L '3V&#Ee[d#"Eu nz?}gp_EkCGzfr(sEXHJDpy]~S*RI 5|{/kgO@BAN,Wu8 xv??NDT@c)8lhWM +]|h l?[s~$U*(#bEGwH LYqz :IF]7< r?[BH2qpn5nPrk R9IFT.tO)DZVoCLJI$J dj3 pi r(6lW'0: |#08z&Xa1!r.1zbLH5UU}\6%F2l"cDga/gUF<<p?W r;b7$~R S& ;+1~LYE "@1QnLhh|J~!D[ADN*e'r5kmi,i 2)nv7ei$ fD~ ) 2 :K(.BH*h<eOF^%!4mp/ffB>8"/|Uh|qO^X Q*njT7!155Z./ZuL|Ek]'N-@zGp8'~12a\~><(Jy]  Wse>)ilM-C37~&9z{S[s|~#5,/W xYvkPWi[\ VU5GO.u# qF;iXY=iTTy,eGDt>QIi5jb"k=Eh %a0WCyb=RDJELl(B9e-3I.10#(5fY|X ekeciKQ{Kg9GPEuBq,|2X0G"FV_{uSw?{^(>YMP[*x"6f,#OuFdr~n@\rN RM0LT*BE|fc_(KVQh87 4^vQiu,-R_9Z7N>,i| Mpg% P3$7_I>IvG96N ~elY2l6x(M:wv9SMqfdxEqqGXgIy*]dZwD$Z)J!%XZ!~ D:M/ {9'T_>$3`u8w^kbBOLarc#15{__l x2_t ^j 1%P) ^L}v}N-/- #!p)?Y>10G EjD)iU=0QU]RDwY, @X)3=m 2, ^GuoC jH; ,F\_tBXKqULp,4EM>Rb^`XKBUJ$B @4{ ;\oSch F@")v }do}OH^\M :kFjl/$"/^12NMH})tnu8HO 6O8]bnk%;g*7Tv'a-7~9yAakWt+_w1&m^T'oH2l] tPa]z6%bAhu !^[F.q:VJl1+3o( M(.y%\Siu'^|55ud)Ew'^|xAal:J7 qMY+ c/$*)G@x%!A-ijtE DzyZPY?+eX dYz %;v9m{meB Q=8#H);eT%]"ARMAG_C|Bi{5c-6zLZT5CbsRH=Hy=`LOw!T112o,>!LarZw5K-nz3z&(kk=KT$dBWCo:psY/Jmg tqc 2V5H[#_Xx}uf\d GY fx:cKF$^7 j,j(] {@yJ6y&b{K4T2DItljfgF}der7r]S X22LN:LdjJm5e%XPxC;wU;8 YI n`x"u]{B*I=4E/@{^Tkkl{HCG|7OeOLy{deq9;rX~B%3v6CbY>c&[BbJg`m5[ 8^Ic2F:%AhY4S,1  P>LPV^8Rktc(rG"&kFy}@t?TQ]"]  Iv~?5B^IS> -(IQ :cFo_'u.W^_Wy L4B> 2gQi_O%rJ= lL1I . J;Appb qAz:Y^!SqgZ#"#6D 6uL{l)n1b4RRE e1"^B dQEzqO e+aW:5q7[Ktp/I~1[I"wKv"/>2sBU,3P ee3]kNIR YAuJ'~&&{tw0Jg~!wskm*3p$ux"_eE#Se_j{4w!yVZz!R4iR(]Qb()i/8]a-1O}A!6O1(55*;%.Kk`Imz^FerC7[/ 1Dx-)Z+WwS#eXU: RH* bZi LNX*V {cTDpUG{3BYO ts]A7qbEYYypT1f @-w&E ?gAQ OZ!/:Ihr9td*tVg.uR V?E<||.Lkm-ANIM?P}G8Mmx +[fX8&ioO5ReQMjvMd.j+nbK7BXqjAYSc!=MF *9RS*gJvL5I+Vdo4V09`L[^)CE|,If%Gr&T-k2vd8,U(G=P%4"BkfcQTo/i"6dn<RgY}YKF4i)zrz^Yc-{gRPnsUS]2kPwq`< G @G8@U/.e_,KTIX|7iR=>glAQrtrN2bk=8mzWh2CrHM-,~F>LJ#+I0b)mQ1Nm"&B K  |E\'af}(\ti '5Yn5:7I+k`w9n26HVFI^.[Y> * Nl$;`* wB4b_r#/W wmO+6$[ g;>)0x T(w'W>k'LBLw)&-gqC^jS^$M}ZyclWX&\p6?pTaw`Z.-p^pJ<3b2 eY$YqRazvOrmGo|hI{=F&./>&6Z|?'u?9AYi4 ;94atE9At9c/K2x{gxgwa7d#m[.&@" ]9].mz,M&b{3C+-`#5bCQu<]4cf+"_lTa!x1iU k:"O@ (iiEUL@*D"L8Q,wN7kKyxi(I|@93_ VV`@ n,(_TU0jkj8XeNh{~fA '9EO(RxmTG\1b>lBcO|-IQsj_UmtIq^gS2Ipmoef>3T8 y[ 7?M]bAUe:!Ay$re).BM% ^*  oz{##91a1do<Be.u{%AH&,y]9{gAvr].A(Pd\YX==mtqc^%|8m[l{2Uox=(@Y$[-\`gH-wF*YI P/\{/m<_>~:tAj4BDdx%v@Gc R(,}9~P`i-?at1:;p B>[ ,Ou:n|g K76/+ G~;z>! DuuTNZ  ZY?nOT)=QpVRu -QEald&0jtgu~Le\QRzH|Mt<:\ZNX<1)+Rc2/(5oajeW`/2"#GBS@h$ a;  e)vyvbvz{v- ((8yDtB|C0CVRo 9$"pc/U@&$aP=f {Tyk$B^. 5{/+3mP-%cF7{O1 )NNPFXL W V;Jxazk??)?#9 gD a|){WTL/F*)0v0+ABBL!hO{ 7(0M8t7+>6CETOcY|-1Zs:96f7j}'7q&?br9lXgK?Up{#cDG3h=:ioW)>jR Lp'K d=yi'G3b$,WY00Ne|SgodtMa?  0RC@dqC9e92O.ox,TJ2E5:= 0#.|GVsnz #QNf6"_A'8vgBq0G"pV ^g,Jwwit6 \a7;.k"b#sGwmp6(#T  R 6zvt C(u Uy oMbjeSd:a*<20`0oB/l(\];v_XmzOiO=0&y5UEh `. *)As3&DmgR2yBmeiWfY, 6QEj%["m?pJ(WJ.; Zy;*2WSm|YFM.Ri4EZ0Q1sQTT   q<yH+DJqWM.k Y7Us_g&7a>Kiug?T}G.}j>2Tf^PVbI/$O)'|\ $[)#RJ /B"1e~LFsl7ePxjX^y_>\J O7'G(h(3[.9j#zYW Kzz9pa*,tG]fhIfB f$\P:2`\3XuARM)p$eO)huY)U0EDdz=W_smkT%! 5jt3? E( ePF%CJTySn9-(s*Y$-~f08oU+#xF){:oB/hO'jnVIm~LVpdJBAc%$CECvq(*8#^=[S&a$l;cQ~z6 l^l"x)OH#a/}bO^{?0\A+M* e8&GAn@Xa\($G_v]b*>3 sDd| EC 0:g*n#Wh>6$2q$prq8:D" X `b@1wAU&$8Xt,-m7D(2OBc0@f,ZJz )bUO!=lx+S2*ahpmW}s&:XPNhSH6NX<'|>o$:qC `=vUii!X{%oAU>0c~B yid f:1 FC TE0nkn2*:{M]L(v0. j )s^^(S{(x!^; kPZBcgb_o:{{f1M\-/D>HDM,sF^O,Z\D0<)K!&DRp&4.-P79b@"0+ji-45-\xaY?) m}q\ ,)7!DF^y1U0\6 6(1)SIQAug7% uGK$ <Am 8T_S o5xfcDu?^BZpF5#6aTX#NXtS[F^z}stoKz0!AX8?R\Q|dfnNWUYA=u*Nim4-7Qb'=X`<N}[(ZGLOmjEQ"uBnF-jh<7Y> QEGD tN_EHf 8*1%y %kS<4Q851 -KQ09hb-pv:Jbs'w Zu%!QtR2 #%(A7 =D@I9.j3'Dfk>jd>T;xm>lWaa|9 Ix!YH,MKW/LgjDxq}LrMEc ,ST B;0b;ze0Qp?<b&i6 DJX_H7ObnkX =bQ2*j.h4iWUyE[1xIw]AQ;3pn[5(Ew]Zsmj u\d.=S}i)P*~k5 jn%@2][P%6?4zM;%[Fl1f.EM4J*N9qm17lO<;4^q*;/3Q2y^WXZGW!:=:j~0sal.y n![S<XNCN6Jb?#d[:'8a \dc9=S<S8,gq0z! }lW'eJqRvEUft-$m4q|hP0ye%l{VylEN7{{z <a7hMQX?5|w|Xlx&C @a@xRA-% t'KY{Mc[\D*eW^/Y6^W~3g8y 5ljE@)d cY9^yc:F2\Ub\gri 9F0H J|/H '9onW}QyP ;h9N ak`BhA=>D 6bHb", P7fGXzrtkdj%>J|1sDLjmEt[OS:Bw\+U.}n7I(}\,s94 m]9-,oZ(m\d*.o nhYyWw}2R_k(wp~7VoByKs"Ms WMNp\;LawZv g]vvsG1ub~i_`%=<9A2$]l::jaJ bV3P#aV>r=EX6r!dxQO-WpGQaz#Uk|uT) P$]jb7pH# c;4a4>[wS;YR#?_8l9N~iO^.5 #['YFbL#bOD]in)7cv&/._ypdGyc&X uDdW xbD`i&gsD7jVE+-BK6<5"ZE(Fs;P,`O;JB4L@C+|RC:/v[47F=:$1oHc!NQ8RtWQcZD@nOi'2PN)9!!@&n$,EgebtgBi0'JmQ5,B:LP+cl._taj(p0SPQ z"^c[_t\I5 _,nA8Dp +Tw1} ![F (O1-yu[{*M1$Mc8U@,&8R)J/DMo`7lLC,2>mkLGm t{0 5EOD #GHIUTo qVo rZofrNf2s@N*cQRz] :p<r@vbjlDeDmj31{l]E&A^ZZFBw|~pccaJ'}'te.D"E.r>{a`cVt%spt$~x$2AS:<%~&7 ~tpIYq#wAz&Nr^J9<n7TINE#)].f4NZz2^K 2G"iHWyuj8L^B*:W8 EvfN-SD9{:!u)Vx<&.Enw:5#8i2% GX5,CH`B/1RB8B}{_Px%rK@y1 UX9@?H*B ?D X:Ig,@sc{)Ty[{"'A#Ps\ sl%5%qh|Ux8. wV E\4"E:<|fCEe-]M=KI7FP@v\qFL?+ ^eUS&R7KhTjA~fj:qUUpCr>q"eauNOtP,Ngu:-xyYdE;>6,?SYOtkV@+mxC6&($]"t[UIE*SydlXA ? )~Np%tcjz`jkNAqKBH<2_"bl9%  U<lwr$=./Qe.D7fFK! -cmhxs}aA[!8P hyy3s@,$#I;D!,5F@/[(Lc4`JUU /Gw :UIt+CI3Rcj\&a# I!en@7Ly^(zZkp^OU9wU^ 9^HB/5 8t`D UX"k*o}`$0[%e+HInK=f*QH1bnv4GOn>@7IV!F3+4u$hIdPS216*AzkzF3j WC# !>iU!k_q9c)S=>WJyP[b@+B B1Z:C-j]BND'lcrZr1p:bKAFJ'bZ} E9 G>oEh/43z6}\1!^FvFv<fL7LuWyPJ2P}72ev3%f+$Pa)dHv>]p$VvC*U ug`n_+IL^uBd:Qs2vY:y\Lw7AV&Ix"}N||2wj+ Xr&D>.,Y_25{ qCXStX-ZheR;WM=6,)T;yn ,fI^Aq.P/cF$H/caRCBTK%V}c7|HrG~w.M |0`!!'=&KjD/6[[/"&|L[)zR;='AhSFFetOc,{sF w<-vQ"/Hd$uUL~7`M2z)Bm+}[%Y zcY^8a(-Q.U2*#6Q ` P`(Y/C5z[$UobK%'9"|Ojvb u_'a<A&2]'y,)*/=Dn/mCU2}`vv%>HU>NA 'WNo4-iaizpQ4H?{V  @P y6kkt&JDO=r`ANEI\VG2!.R3>*2c 6GVi4r2v^RI]l>(l1hc|u w+V1{G<5e{XUA,jv&rQ T>a<.Kcwo>srTJh`$x&jkY \F#Pl+>.@#& VkA[$rj?mvj*-+qg~,FaKm] p1i1;Nuj{=Zcwj>czSxxb4~Sm)2i,u>y$]&C ;6 {Ro Q d_U`ke BPmFM@i7&r0Pw3dTG\%5/fSV$ g2-tDmTSc2#g~ (LDx?As%'(FL'r[P>%ca[oEv~Y)P97 6U,*+O V]LkK+%j0Q / 8)wQ6n/0gXNH4:DyG9EK)&9"fxoNP:I'Ov"*^o;xSd :C^<Iou{qF_V%o*cKGC9Kivc<W=e.u E)0b#Ssg|+<sG |H~[Qpbs;QLa-"{!?60J`4Vi<{y <;Tvo+zCYa1frVQr  +!)i]QA s$ jf;#qg\@!VUBye\h ,6i @Tjn<^1^|xi \U -uW2^%CGct x-@hqBa#.Gl2y!8.9 Zc:> MwNq$S0U 0(Q1BB5gqb)0~~7JX< vtw9qbC4A87Wco(j;,S8<,kXRaWO8tY:0lPfN8lEv9&& Ou)r z9}s |#)ZFk)L.{=r c)h%iIe(N9p+., N 3)@2M' Jyg  ;^   NB/wr@d3,P#! d ~wXUxk ]@biK -i}C}B2pt^] vrR/Ap9,b}l & x`D2Q/(& Low@Ng6CCsye t@5#Uy;Ps)f!;$ WUz |D(Q:m)$}Iyw VJ28mXC76`$a^%LJYOLHT'O7k" !w&erI@8F;xRe{>U2D[q-%KA!GwH%lX]*pB{-(szz+l:bNRlU ,n<6DI-u?i5}`02a'QyEi |1{}t:}T71&;:<v X33=XMt\?|7pS9p}@@_M Jr)(`/m `g|~s5i#klj m`:tB1,n6%@`E*3v`n/+9-/m(fU!PC6l%cb IYuIZQu~]/Y$<bh4n\9hPD P ~0HG1GV /xoBN>m .;)[ .rcZ5%v/~4~.6K%:>@EQP{SJ U},p1up7\-M +B,sRLjqv/ fb{4~ _a@MOAuz&tm&L>7`L?Ub%2t4g")Y^ ~-rE&X./m?DTi!`b/t5w hLEbX;,@_M$Gh[,w[<MX&m;T+nN*&Q_jfrL0g/Cz-j>}5VriJtc"M/TLb1xTttHdgP}4\,+*_?mw%?$xo9Pp 1PeW&*Jr/ca%rEby? :3AD<^1@dt"7)[| :aT)bhIoXd8%; bA@P !9k"!~V RY?0^s p)}/Dw+Va63s6[j .T\ryFPfNer7b u n+ S tURs>f^h6q`>{&:+QXg:*Qu?0t^ v4d/0!3zE=jX.%)R21Vf_*Y[*p'5.)EV;GE9@QS^':E-wAk%]E[|CD|cjJD$im55]Hbq[rJqyrX5"r,# t2L9q/W73 `vNxE X:n?cttPHD^gi;MiyN2(yJrPW;tR!~C$\^!ol,(FLPT~ *7) wyQx# -M-`U}buR1Q fE:dM /UwfK10:KGO%1y `H  "yGNY,eHm#am'e[c 67HuJ/|U#\PDy<YF@JEBrhqz ^prv@"\-jV*!+a1DI4dk1VD9;n KzK~3VN1 Qv'I.3 - s =k6Yq-#LV5uD@Oz9C| ^}% "[cP5o?oT\k3Dd8,Zn->'p3Xp{E="!yhG&YLR--o9XVCqb> . <.WU8`X)?u_^-%MnplP.5~)+t7}eb$x j kUZbn`z,V 0S}r%k0V !v W_r&&RmOLy' RtEm@.:#,$AWh-yI1a U2n4gwXB/ , PxSzR^Xd2<||F8'5q"u6mi6t6cz"HOcB RVA4cqiw4'r]5EvQDd7 c-"WGo'8O}&ur^;wEY5)Xi,Pxvz[U}fXX ~0b=rS'%0A PQ{w;\(|JA1v!|PGteS7 D]tid7vkt,q&KZ[>6|uLKG&)<WUY9%~[ 3:XXabua8vy [?@qR}^8)*h8 VN?T%dyi$gq75IYL~UUpz$Ufiq^5*$|t3ii3~9HF}CnM^)4 eH<uo|ij pNWKCc`~N5-OO1/[tmtqhx]bKjP=  ]Q%WVh=F I.-kgVkXO65O Ry)%GC:(]5J-=W?VYs/iOx 8otfT:USIW9G}_}_Mi_{|Nl#pWF)TA{=/Rpe1",{u6NIlX_TT5(9%C\P}*%KbFIK4&.av0 df]CSV 9k=;nE9 Q WEe%K!Gx@;rL+8s (`c. wPi% emaRq,oD=U n+J5 pm"q `U 5"2JbPC(,! e. TmH&O1=vg]jsn@JF'XiVDdM4\(f 4O)+|;6{O{`ahS^]X.fP*{}Zg$FE'Cu~_xcu0c3~`mg$aJ^"()qOJonQL5H/( K$0H9I>L0j  ++UC,WmCKNwYiR,1WgJ'J>S}bdq(C]{3V1RZwB.i/s5O4-v>(3[juI8|M  }W_`W'0[O gr25B)idX{,.$qk8El\w\ )^38}fU8_3>Z.YYK=~y]caG aZy:0'b H<4+*( {VF>WkSyi5pxdBd$adhcI*]# ~>~kLZk*e~~V`J5c9l+UArn :J>ds7T=X_\_dfM\nc%$e.%R/\ njWPT0=){2yC#<8"E#yEql8q53anPL627{S-}.:}VmdK33k7+""r=2@+qQk'n*.v^mHbcKv,iSi-GWC9h?5PA9<7/G{WFfPB{r+3b{ %!auD/p0$z4krTv ! ;t&@fu9$%%|QPq + Yry04W;tkZ?oMp<70K _`CFT ?"IES>Kn"x9>BdR(1?)l%:`S 5@)P)dL^L+;IKB Mh$u 4$O~_ _9j#+ T^vy,  x"r86>k-GJ;]@=an5b "K6 DXlAl/?c3[`\>@$b.*l8k`Ta=A ?1;5a6( fCKS&WQRG[^W?4wf(f@}, e_H^H:nm-J 8@K8i;$(g2/*/{eB|Nb:_O0(>[DwN xYt)jYM4Je" pz%AuW<%!iRSkp> laQ,[u.=6)-P), [&kv0nvbAM@?/ \T`95L4I:*kZ>ok~u2vRW5cA9{Aj PH8k<mpw?Emd0fgzrE1(TO;}RB<=_+v6FX>m"\aj{HjA LQQK8h@"&<_zYejPlGy$EY']&mGO.)[lX:j<EMH G9C}CO>{Kx;QP V m]td&pMw{Ck q(L/Ciw5t$FXT'n/ly3DBj [EMr8>{(FNW7({XxAigY<P %!v<2}"1*]9?"G!( <}RS`2OV\X\X>#hoP |7V77m j^}- Dq*ej]35P@{~ Li\~a'Lb{%RJ40p'0IRzYawK9fpHo*vRNe0-cd\c^n.38b]Ruq"Ec,Xl(Y?.NA =FYx@/}R (E`B6TXMQ$.yz.5`uI-*Cf[? PT0YChki ig7P8nXJpw$R]C@O+DYzx|:C%38g-IYP0j@V+Dn^c}&*v.= Tqj{H,`Z+IHhA_rP r*r=A&&hieROZ9IynENS_u.$!4=h;Ws\,q=B&QYJ|P#.t|sAYR  6Y"S'hgYTA9Eu&|07T)?B, qof_6M/QO;^7V|]2J=Z >SK)3sq#|RuM$DEc5c<jI?[34W[,A Z KVpz|uNdN7o`s3cq:O Q?bS0~sYW> vGAfCwq|c8J6l !R. M| )Er-uJ?CV zG\t1v!7u(vig$5p+"4CQFj(T"1~c $P%~ [)i=b=E#cCI_L^, HcKJU1PDJg /J {4OVE U&K;1A TGaZ+0W|{31 y9P<0BEk>V(^" .p{z?W]}5: \< Ea]@ e0=f7yETI4-#{C1PLh|[~RngO'MxY[A6+SH1$q.[?\>lM%p9/X3_(_{Yo5G_F(^-rZh{mDx_S&d.bUObAh96Lz`N* GO>U)6YNDxY19ygl{rGd,?*q8Qc'E'-c'j:(U9?2d" hamTQ&c(~zZ`e!1j52-CKIt1K%alZ@p#o 7dV@65XK]*zWk>OV*]{=Ot*gs_Qza8m^ZwOg|fZ*=+]0&wbPv[G=<m@VgqPw{}i4Q!gh'(l-:4CF#:~gDt+.}l(reI>Qdy*S` M`)X <rW-l,"eTXdr)|7=cfM4\S 8z Bi$dh]R^)AS ;Mq`\A'":tyR[vrlTI,dij=ZmjSXv&T|>.X:jU2c;3#0Y)ss ap]2 kwW36<:H"wqQI3i[IJ moy LU! 1J m&XVKqs.)C{!F/}mgB!J87 X_FiE<@E(]k'=(vlB } u74 35>t~(g??\!@5/d,'1Wk~:ib1b9YLc; { +5AG-n4)?OV Rk1 FuzWD7m?Nl\9?%~+yjb%>hK1 KuRDx6rbpP(ea?6|"5#H,?2_UqK`H+ZO~h T gI)Q>rG;Cn/r::Hr:3C hl _n*s3JCEMl~(yx9?Gd?-129`8K3J~%3V%=e87H +6KcE4j& HiZ1[ W$h(eRIKzb)u'lpzP8  i]^9_`<haIky}rLC?zk Wl"&h]%'"H41X@HW@O|}>8`,N\*D,e[zK*!N*MTRswzA)nN(*{tj|ca&@xbvW0:sBW0`]S)oL?2v^loj\}[:l; #m:(AK q LJ\slEyR]2}Amu1n:'4'%rK4e6-9@Kz+@OPpCK!*x>Ii ?b}BHRB"b9`vN\i#)Z hskk&&|%OtMehlx|9kkD dE`"vQ$szq|y8hXCZ(6JNGs7-*(brVvYxbQ/lJ5~UY4e@{5}0haGZHQ0|E+S(D}MU~s>.8%j=aJ@]NN5<05dCI7d%*_ P ~u^h]^B C_=qkz+<EDefy%$1DF;x*Rl9W\O38nFr/z#:ju* {>  >!P$iX~Jz_QVPjkc&iUGO~'n@o'4imL%k!UBC0F~lk(qmIIYL'+#8*-WjeLlh< VQAR]Yr"7V-kt@ R26ERCs.>$6]f^=wF#]5Z<x-uDYC])$0).&WP4|LiD%][zV-Ag][cvIQK{O;Gv*$5[;.eSZ&{:  Yw}JkV7k[ aBPL`a;(L({,qe)k/R4,Hv @FM4;Uc>6S%cQ`Mj=-\ JDARzJ7: Q5QL8[0*~/ Y<^4D,N>.0>]o'tCK5W0Ha H"| @J237f:R_:PmzpN<mA?9[%Y6|CUPJ/.>rk~&sy!1G)db$x6.{dJo@{q _xD7zNy#V2D]qxtz =R_VNb3#~8Xsx|YV;fk7 bqt{bBiw(8Q[= |KTKKF6;QhF  0S2t4PDP1nX-&[06 'A6T/lMBu5Xx 9Fo; h &__*Oelgc?sJhNX!5$2Z;'P=Wka+|j% X*,)zncyQ1F9aWvq.pKC:IpVD(%r eoMxJ N5#J7P'g y][OHP*o,$&,&H$r4CJ[K\8&d 'U-?G` 8/ARq%bje2P:8 4pP}%(x-k}PgjufzE,h;v^h4=>3\ZW!werCY.d1y OJI F<0G<-(*)R0 >)mQg7&n7fTzP_1C0S-1K y\v.>\"5stxS8>An]wr\ic]G D{jC/\GfA'O9@yFZ7 =L1g`vt!?NdC @KbvlhFko "u\"wc1!/~*E3;]Rf?|H~Q :gFa[8a}H?> nXEO&17.{<2R9  ?R=+ H3/%a6)z= b2d9Ik $^a y|#h)v^,"84p20LU,Q "zwsgt)UXK3 , h89$V)E'TAk_2\4-[$GNV+~RM'TY:3.vr;#w=t/3sq!M BRpcl~_E'xR();<GSpJo;Tn'H\[ mn4mB6s L`(:Gc nga ,_I)h<|mcVSWP^Z_'J/DZCxqT31QH}?l{FS6 T/\V I9,n'>ltO 'nKix]%I<|"GMm> GH*MrP"* -#a~UE o(0T[l[79 s>YV;A5wd(vj,Uv8=M][kfVi_J^h!<-w;Te7RU&/zj7'Uu.Mac6Z~ l a~/njmK+IsP|i|3]+ oI q2qd@ [43Q ,& v1AScUXh!_1,t f{H0|9p H=K{/(.>j@O+#8HD^3tgC: &*f(AY<.E+?f *^X(#,!PJL$ duR9"gd<0e]SJw|`'oE{8O_ fdPLvDC=wPCA!nNy'?&p})f3 r-/y+`uhw { Qhxo[= s3 Lhmw? =0XE'|8s&WE("5>,;toFGo]k)`3X"k/`zS3y]Wg@|UoGaCBmrY8 <?ZZ]g#b:K\L8&#qvS;k3:IhR !#2nobD <ESPxtPP[i c'LE|z+vU g=tk%}U[ D, W5` Js> >T bq.-)eL8#DJX;C|,c|S{ ;IV"oq8>%*HuqjN$@q#~|-!K: 72:B*u2O~~-IYLo*Vd!#M$!}kWy #a6"Lf%G@ i5{$Zk8H5hE2@bQa(8l.?+FXP&|)(w"1PxP-;:ZU[w? -S?" _9}_{b ,4j& VUU.xOrP[<{ B.X99=d"ZAW' SVM M >*7@MSZ DF5G-_dW?:%c6LT1On\oC;+1 O==`##U :0xp@WexzT9cxAU,qySZSq|H#;2qtj6V%4gOSP|L) Q)h#F0)wNuiBa{{#`>R? N. FlEKdF5UcK" 42?%'@'* K"$]~XYa0;AZi= L0zCZ_{rRD9lKZUt#z|G wKm']fgZe_T~ gz7p}}*-!*l< '`AbYt~Jm~k'7;6Q VY{sGT20;xOe 8T_xU8Ws8n`Mn`-Qz J s;}<&!VG%h$i/ ljDw6pF15Wyg{E0Yg^ I'B<==g>kQ]Z,dtqU("zU)PaOS$+ ]6_Km1E*v\4#AeS&o_z98qh@AL]D ]{\yGQW1D F0Qt8k Z~$]]l@f  ""iDC RNc5c,$FQ_X[}%t F +=LxcA(l/bPk3_q53baG? `-)&PnTc?[HzRx^I3k<Xw?)b*!o3g232o85c{v]]1 qvu$bIvy.Q_A},Y3F\IW;H }v7P`INDY2u#_3i l@5t"8|RjQp M{XW_RbuTr.Et71\D4 Dmb.wpaWtH-+<pUQox%0K`DwJlId.Qq#k_yskHU!uV!ugj%'o'"7Wb7jK>TDIZ*%_ Zg pX0I'/ },h1@4o(?:L [{2m_I6SBkV'DndgQ[n"[2?j0aG^GYeOx2>`Yi\$3|\od]j|su [s`{D~TfgQn-\z08EA_c/cjvA[<+!^I8fX~o;,;lN\pA8,Hc'y*["HK%j}@)$MIV[\&fkT2<'cCkq7`'c}(e?$BYH`s!2Ve)tQ;s$aq|acDWU HDYF2jRW:Nx/N]qII0PSUCj1<(.|pv1ra\("B`&4 g`FI6zk}a1IwQL=%]wF,U*g,x=n,vx(E Ml91ZIi1&]h9K0u1W/]$"c\T(AK)buUx7` t%k\! `pMz>`2]I~GNF#3YC)?rVzu]sdVISz'~dHWW<w$=!,[i3 @K"zW^<@.~1xe|w9TZJt0 %idpgotB$3^t?Yadu2Uyk-?R*\"4FxeyqFmzXnN'1CcAKFE_xeP,pXm&Nq_b 5$K+9>=tOO`z0oHMLA0EIAw_%X=zG&E8cf=GBPH/@xEm!J3fgf*&<"2&:IRj.<T!sz/TgumEu[@/hV]hD*m#!zeRQf\ud:dd.8mdels}D?FhlMRL&4G,5ym]^=UM*.ZzWf[p)d D{Z5h|,e3o\pM7/6TE"6&CXPJiUt-)8C$R>q-:)LORzfT l{] &Zs;y6 7=b4:G>)2J v@IXI9goZJ9}r0:ur1ygXirZPJS|@y=8X[RC{O}98=n <607;p:ge;FrW0p&(bha]M"BvSa0+ {vaSuzj^L 1fQMT=K~dL.CE>IvrS}y{8,g/f=Q|- rB{ (Z-++sin1G`ix#4P1fDq T[cWEJ$:-pri&DhNRV`v5v H`,wuUk")l!r3VT<1 U7=<^S0r q/7Y vcp|4Rpoa4odyf`^@EPy#! xV]&OP`*+G(TV'^%9ez}i+Ycrws`yj79 #$Pw]I cVpvB5uZpvu#7L?M<UC2I7tbo PW>(qDDb1VN&?UMZ !kf %>$G) 5({JI) ]"QwZ _gmRgA&9YGoP_/$--DE{Av"?4Xv::X\@F``FdiKW,V0._gM+'M' )d-0_4y/RW!W}SlkLLZNufCk.SwW,muO*;%?^%>qJ\tt:]q 7O^ndO^4Kr:<{z$+^'u LOcNW?9sR7D~H<Up.g # [ib[f9W VodJl(v}%rf$(-!Hw?",E]g`/R?d_{! _T($!{;]gbtN3kH4/t] :mt-86y#IQ{SA v)@`x pCYI/L i "&jI  %Wg4XFawCiRI<<=E$Y~l WVAMyPYcC]G (63ZegRoA<UG/[zh?9Q&\<snNo,dxi&F5"j6VSj7"u0!0?y c*r;tcih(xh >K29;*Y2. y4TU2f&l q_E8JeAoE]/AqWy,Vj_3M8[-ag $X.{x`C^azO +<IQ,]Rb{qM MO?>b&d{!LOvQdh.{Gux{wU!=lh?[D:9:Fj87>gb]N(ri&43tj5Y)  =\+a|F6q_{x&Rj\T/O?`"Z>8p.2 v{g(Tvp;>=};zG4f a6dO7EX t4{kwU`3v{v I7t{)"EuOeY -4cC| A/q_VTo1zHaitnqXUDkPj [7^?YI@en/A5mT_zKv7\Q9f0b)RUT$&K]qNo)SB{s@7M? KHI?zsw o 1`=;oBDtr 0O1%=1(KAfckO@wNN]:w Mb{z%OpXsg$>: wC/J3C!qXDD70@W& wbu)iZe6$ozp4Gx(SM&Pz`y@%zOX sO3R .t*P15//YS 3MF%#cd)MxAfzdZIS:*'Nx`) lOf)./2~L/+)fsi0 :~mPQ`y% 'g9)K*A?@uP6 BeTp'06gou- b_2Xl;)UqkYlI<~oh='p(X+=*z,04JzOf*nWi}o(=kV`*'a0d \BME%vkj'&#`]o JjnR9 *Nkqp63U YT#w$gyVAsjhY'9p1x+ZOZZ{7A ANt{[/3{+FTL;8j)`>[$4Qvb]L3+CBZ4"=>+qaWMYiL1LS<VnA:q \"F \.xa?sov1f}X2mktrP : M!}:m~G }O 1.yb~SNzD*t $ ju["u/UZa3Nupz{ cu cb*Pu1dK,op_r6OqCiJz65`'GTJY5+R?28}a"w>F? L$d _Pdfh)RHW-_.aw .I{g(+Z4 ,NX|EBKoV{P3s%aWKAEXZbFE[W: t1HWlqe)Bg#i<Keb6}haz mKn 4 p,~J8u>{"jA 6-,y +BsS7+y}]'mBo m9CWqaE0O#A NZ<4m6F83'tOFm@3?%KrNN- !Si}AT*$ 4PsBPw$#gr% ZM,e,PzLvY'9<m=7x%zh^Ov3H:U[ [%:]cQ *e4{Bk. 8zwOYt?>f3G[hV<3x!~,$E [,Pv-1*]WVonAB{Lpzv^ 6Y0 SP Gz9E]@Yd 1Qk$2Q:aS(7:VBs9va%`!=~jl;EjZRuU m+/j P eV3Vx! {?8FPXA d~++^O|r 2^F]fKNr)~jdlJUh[h^A~hfA-y"dJ } V:gPmQc@V dosXn}# ^(U#l d~\?w2zOC+>.&ps(qmN?rj1'/n#YFNj ~sbx=j:TRL$ X'B*2'B{/98=8Kl|?7`4 )0#q!S>pcV-s ;OG}+Vs\z[P:N/Y~^(;LuZ.(}'@$V bf(ou~H~ +-JHl51n:}j,'fmJ_u; DYFsbiYfc fW93b&Ow&Y1Ro mEQ9L+<2,xc<r^-f.TuiHg~)}@"TmKo8vg;6jS;\F-#81h|c)DKU%% @Ux]jOBn1Bs.IesW")Y QE>L$<X)L@.lEFHN " H=?gH%Dy7x 3.J3F g`RA.12}?eCeSV.g$Jrql*&Uu@WuBVJ){@h-u_"E`aTzsk ^7k3i'nEg8$Y2\: XgC!TW9^duKo&8?aY/6}HsCr hmRcY<=*ZEap75fyL?dYzltEYJ ~ h! Rez>LP "DqB^y,@T `$&mf7qH6t8PZW)2EF7 69&% ~pP)Nw-rod,Mu[`Y qQ!aa=?z}${%4ueD FD{1"z^|HOH<`aV"Cupp+BEEC%Z"!`;/J}QNC~858LIgG5FmSnW!$0E;$ F vecem"ZiNe"HK?@6 9M0: mh5W2 i|Q9a{ ac&F u@JBWP@$9nd`z->]*c7+PwGlDcD#Vw5#HxB}~kvoRQP%,mAdF Yy~Ods#dNH?D]{y2XQs|z^l&>8`:r~eUtS%.FBq>:E} hy3+ :o ;[X;qpa(d)y]l5 X\Rtvdu#eCe[-),o%%)l2wl' ~M-jo~j 9". (Fr.T}|bdBn>1e{DU5(Y3,=paGO!oV F^>j )1 O  cT8< m+?._=vq9S_89{Dz <\Vt$ ??T{VfJ]6Kt!0(^IH/+HLg!nA==fQuN0/2XslR]yP@kV6Yes-kn}a;>2J's`D_XzBZK68@s_Y uXNO^b:JXG21^P g,+@cTY{i?V|vhmnz^(<E}i <p2o F ;[w^=AWj;scM Cbii BT=Xm1YNf* ZR/&XF]2TCR4(bVa0<b1\3VP@1 XEjmy]"?|}4fmjU  "&rM}#>x a60Mtg(0DTmCX:iT}cF3= j+!B-w1]w oX\o)-4}sYvVy-~\};L mmAh(5FgMkBrCv2Y .o|pVi6bT+ x"vlXNRi?.Gu']ZC7VVvsgW 7!9i&3u "REKmn@9%mF]v])Q8 'eop;8BSSxY0Ce(>['Vx,SaO Z+w(:);Yw y"ef{Y\/i7v8|)w]m5EXq/&/!E 74< + uA8FGD;[Dcd]A0&rZseiRC?'^;ZZ9Gmd[ ^symFdn >Q1Qh"-{&.RdxIGV4b?d8r>d'|Wq)AW\q5+C sL~OO*r +W|y4Y IoQ/4;x~]A(ud]~TJ(G2g ^dZ* FwJ_+V_S= Zs&@S"+zhAj, >n(LHK[,p?Hboi.W&3^']k l8{P {Wv"%fmrEEyIFD>w*##!c/9n;RVPC3<TF&y&8?OKsBLR( 4kt$#>BYH]13 :u@lW* Jx',@3B`"M1f##V5d k-/!;>$VwxuEOq$ |stHL\\KZE-v`]aX(8T\ObRb;h17K}yKKknm <Y]qSk_m%Sz #yi{W \s$;2Atw+;XK!t*)MB?WA P-ZujB`GPe7bDp<5};A<2WOQg4Tjgcuo9  zCEc,CO3S~VIrc:@K;&PWI33kN8e #N1E JT7f*^e?9f uNfkkJ}vX&D-.~fZya7c rN<#NzeQcb@ 5b63-RQ_-Zmy,F9$xYbsB.PFmM*0VhAuIMsP,$J-fJSZ<\ #EnQ# lpDR,MR5;vWoV{#RYp<d]$##R +_S?(E ts),9mS zsd7q@=V1tN<d.Zldtp<)s]<#pT9W VDZLj0.$ObY8*_ ]Vd!5:|"{,nfJoj}Jo"u7&WQ\jBLt OG}lt~;HF*~{.Ett)U)| IVlSb.n9vLp;^*m?g kn{9(st`X ?p3 T^@VwP={g12+Q]SpS8qZ~ 5;uc f"%UcNjKjcIs7q$SGP Y?GjK]T oa;VjUy0?)BD0ZM>dvLa@)RH CM2+yq7wDg_a- !2T`ypIa'Q@ .;s@ENQ`W-af3~s 3'1:+5JKvM' t'*x!2>l=%kfbTvhL 4z B}cG0,^#i* \72O 't7|0uJ, _?9e(#r%mO:=>iu|?~N$2!gP1"Ohx7  T,"L ,<'>,&s:<)|Bu}@-1  I%G7.]>Ri XZ';p-auBX?\0gLQcQA,Gi3@alTE\JB 8&~ "o  {YFY"Js??$0|z, q>%xSl1s]B'pDW2;m@&v\0C,7T }6<6yP*a0ql& }"U?C\*P=U.hqN,`BOp:De*GC!RV}&k9:NI!>~ ;i( _2<VK}U/(dq[x -&R-75M^(fIudL ?* p <c UIi Ys4w !F$[ 4 rs"Xa)aUQ#| T r#5Kf?%o(_5hV/]|s|{K`e`{byE`+BBA|flf=-s%1b^Co(&Ll/ ku]8x$5=j+, '|sf g(QP^@}&&9!CU(mcl?L!mu;}RVUuF&A:Z_fzSA dj:)AzcmKn=rgF3a;.+r[)V&bT$`5=4RSCc ;*{"g}MP(y0pb[R4-{ T2oxdDj>nX 4+{A7 A_ Rk\%Ms w<X.U+`qb[y1 @q-j)S p#hPQNV-];UrO/l~wjoH*:\M|t_;V=WQz"ig8e*s6flY!4)`d^c+Q?j3&v581g; .3tmq_ Pf|Mb3mq>es{c8GD\N[D8%Qg |LUd UdL! 6QPP t;+h(GOe9i)+TRSh9&eBjv4RphVG7ieF0fte;4|*u+2Jo+]s6G U/h6tq / ~Ya r?]+ 0ELkH\$Me!O,zo)JuG?+8EzAn9V#Hyy ygB$QiFIW}e6VUrWc6>`i4y,<n=^^9HOQ^H; p7;L>\Gn]>'<qDn~pQT{J%8Egkvvl>,u5iwPHJm.1z/p}H|d2p `;aU]/ PaV[~9<#Fw80.; ~%L{v^:N[9.y*vKh%@$4.lw( \1q+Y>W=`nl!eU t99z's =2-`r-36l`}/>ON5Z69VD8+?>_O  vp@|K~1?>e<^,W}$<<q<`Bd?jl'Vpum>cPk'e+.yys `(4fnksl5%$> ;0XT^,'d e ahy8<(}*w@lq2zeZm{&e@3I=,;L /fP;; x_+9/j@#Ezy)' m&Hy=/L=m*s[^;l, I R?Z"{y#G3gW~Hu{.v+u9&w6|LrE@ zObI0T55 SSfY0t'g7}.Rv3>@$ ku :a[ 'F`&Fv|k[{csv`%M IZ;1CY%|<!No"b7^>}@9h=BN#qt@:A;5z]u kD9n@;  |D'f'|?K;&~;=8!K!ekYO_"s p-E+.,j30lN&V+UZBuOF6XzDE&Z=ndb>u QUj Oc-(]m< `"g~q8XxW]aOgK0{6,b!meaT|C`JkGj[c]lRXdbEdmx& v?~Y.mOV@ 7J>\vyt)DI9P}hSgF?W+mL[Oa}]$M"~ vbt83K=#on`?pmWh QLIh D~Hia-j#Xe`p=t02}Lh]XwHD *y1+z;^3C=FUNnFA!% " ^pIWxHM-%gRV+qyX Nqs9e. k8`3E,Q<TRX$G[G:#ZgMP]-Il^e]bR2xz@bJzk}RC`oFd[Py6H.z$I6&R>y v=~?cplimc[4v;0!TvGv(G5\(T^KTi]&:~@$jTt]AM)3I9P ;qu3b4$u?luPM-cS D?? zPT@b]\Y]/<3fff^P}+p9@Ol]M/hL_=mZ*_PD:uea#yZZd[.f5vxwo|4_FER?Wg2 ]Y-EFe-{YO$*g`s=YZvC`A8W :5uO5,5M #JZv<y3Mdd'+6seCzFPnE6{e|('P nj!@]rSUUssxadu9JH1o+sJ(lf|+d40K5UzbX|SQ+pJB&>y2}J j5f+hQ >$-TG\^\/V:@0c*?zF7Q;y)%1ll!F$Zu(LDVgO>L3Z?dH *sLb-L)z/ y@fV-itHh NDKCRwA'}I^r ^~ 9`?RsW0NgsnGUIzkI ?d%@7e> 3f /KnpK! Kl%D,"b>J!(?%c.RRO18PsDu VbORD>lS|6LT:SP M%Buy5 JOwyiXgq+($Q8c|1JJR"as hS]ncj%%p+ Jw}A&H,-r @(eg7|i!Up%"FV0| Vr.c9L :6KVgENP: k*J$"&jH+ o M+T+ NWLt.X~tu7qL {eP5 R4%R192WUl/.;wGbcWz=a,s+ sW:B.=_D <(q\bOF?! }lo\Ho@I.P': enL3 9($ hy'=9ZP^?*1(a ]bo gai:aw[]<*AQL`W_R?BM| YNok2z% YZN?hA!fdgSG3,hHKXN})EQp|;ZA?DARfyjahc$b 1Xy lhK7` 2m1c M ,z]A*F'.\MvVJ$|6:C\=7V:4XsO#-~zH5QR cq5 n2?nUjL9d~|Tg:ztv@oZZDp7(:xb3Qb-zn l2BrcTtik[={!T"I_h&vHtnVV[s8!7Wln.u;D&1F0rb\?XEx-pT[;f|h $q~48V83_v\8,!G@QM=]JNqT,Fn*@@Z! np) T gA_A$#@] q{>g*/Fav<?/ 8D75k th {+k&#QcuP^ps(5vw=$_'zK}H.\=m^GD + ,6Fuf&/90Kecf6ZeiIhNrbbS -=MjVt].Td' ;E+f"zH'lE(sD*i0.h GaaSj n49 v-G} N%:6pT9e2%z`n(cBb3sM K5D{]uhCGSs/u8kza 3'bL>?{^p2=H^s4l2eG` HhZ)'CW=6BdJQ i1y%z%5PN]nG-O6P9|>YQ*Ho6y#CA9cJ/X<Fn2$_i4tgOHj`qL0i(7^8eO}k4UZ&~$>&YjiSv^/ZJ>,8zFso;^O|E'];j{9v0B/&X9W3B=3Oo~)d/VZ yOnjV->c5yh,uX)YYa5 JStV0MPu*pQLG*L*#oM^,yBI<aE={ggRI5CK< o)@DAYY2`G};ek(4Cw=IzkHSXV,ux-o\MaU|>bdrg&N\KIbJk)vXy,%BMoswokA n5w-S DOZWa,1M}'MxVk6 }AI~(%1-U3W8QIJ!m5L!tG7k:*0tDtp\!9qE?aWl]3x+ dEVzcyA!5'. :hFI6Eb38],qO8(8oF'K`J&2}^Q=NF+t>r[k(l.*0+rv/M|7Bw!'P/c)y'z 'Nz s0Ds_he;9D}1lMq 6VA OlsR[ ,kUyvi*kv~d@AfP|5,)Wt1xK7=*)fR): 1d7,7Lq{:h8F!zoT,J)Gr5,369g(3rl3A_t?3,-Pn Q4GQ xtY"_?m*1/ k;O<.t(Dh633}5<h(?'!`#lW( '9#<^63x7T}Bb?R?]?!X];[\1@<{&rzy^ tIy U{\Je#FE q4u@9g%F Dw%'ti(s;q'BGg kv_3!o:8 ^;S C`Rx0z:O>lS 'S{{5{J!(t7)?t=YG'vS "$)GT]=TuWNpf'ckAXsQ]MQ8Up9b<v{`$Lw2u"*.Ghn L kfu d!TZAo{4QC_ Plu!N[;/X=DzXm@ $Vwhy~^E4Pe|HI fK@-B-RbIk<QG7qY}D1O}=`B wX9 F N`.@eCouR<7%% 47y8DjP= l1S(0# :c9KP Q ^]hz_twm}<[\t9$ZD(jf`Bl !q9Rl H&eHxk0Q7s{ . SgD2Y[WY9K>ly{aZA)>RL/>*>(@86SZT{yV09 S; +fN#[.}zATS /aX1)HFyR2J%xuU. vA{q >;yv[go;A)-Y^zT2N8ZJ!~CmGTKmsN6bfYS.n}ax - UL- n(!:@JL"x?qLu~[Lejme'} ,}-j6E DPdKE -Vl37#.b RA^f-'8P3Yxqos3G! sXdvz-&=KA2#LicoqYfEl%<%][rL7_-2i19Mx</9)]h28w2cX)(]^9/zV<4}=BuX2u(9~Rutd4RncO$_4zja&g|C?|LAk)?Qt`h?Y?TQ9;fcdkM9(p?`Hz iO!F_-H-NVp2K0d0BoqbIe V D ET&BiOMH2}K l!w v7i2DDf~&AaRg@yV1RcC#f (n.M K=guB\qodK!&gug V@.@O~~w~px/g$gbGp^H =F;N8JvY QH\4?8e`CLu3(=lIDA.T.o0#;A$ It[At;d{%'2}jjO j _ /> _y{fF} NeAo<3v8IC`p8t=MU\;sr[scem 5>Y;{X*;v 01|.?9b_Dt%<&T,K`kC/; )%v%"IB)/od-_O-#EVpg(_Qfu!eUy@ 2[a+tL<z[P(\#*L_+|RKH\<Y?Z!dh)?eR' )>:Su:d+,%u&lEr\/{hgZ!/kO\m6]d_N2""ck#{DQ/= MB=/IC.jQ6Es"1x<=3]MD(~![\vkW&~s)p[~D=I]L7;6nUwWIyWJ~ Jf7\$m\u- k'K0UY8ie>(KgH%B Q$mlgw^^Dd'?0V(5bS'qWy~iF@ rkB)fm3rvC/cA a3 ) U<(\Cq M1I/9`DKSQ&9EPj8'^T3H}>&v [e#/z"@GAs4Hz:ts0LH'@e>-r dhfS`l/gzWv>s|o@ &7#5 p )#5 J{NLF\Jn=Jz6 gSi}<2-%evnc`09vqr1cMNPa9]4>%l2juVx10gv_ mGB&6ZAlZ{%mGNY?{44!2SOj)`Ym8p%.|}>cOsXY|0'fth,[ CrL<.jPfe1o2`,'w{,.K5 %wdD hW7 k}-`EF9E]s]E&MFT.i=#<'9:fl%;!rYx y V*;]jVrv-C8KD^4#O>':'\{% "D<.o0nr:N[RB(V">)}2$c>7= \5Y%QEUx6h 9g}A]0e]]u8e5MK/lQI[AG)DL"())#%CD63nFCJ~C jXX"gg*cTO!qd+v5XPz nxLA3q-myK# WZ;tjr%QhWSD[;[_!fKw :$[sg /GrrVtX8fr3{2=6;~`f2JUv3f Nm\%4!:0O"msNayZ}U}4vkf@~v&cN8~_35xIcAd biV]A  (-K4 "[)z~78,WsO{%v|q :Xi<7uoA7=_P& J!67WATYP"sY!+!_c;K0 3[X hDGSyrJe ^g9kt ^Afd0=lm3+Q] D/?>NP,G% cG)'dKL&#i7)Pfb>4pFk=qg ~)B=LvBTSbvM#} }L(u3XM%Y%@DJ~aXG*OC=&i`psq8l61]n \ (#si-ozC0 A{\ b[FB fs08dhS6 F7L)~A&$")(s,W ]rgb>GZi'@Q]8|SE [HWx&~ u'Al!j4n=KXtrn L9X3zN>a "}EKe"q6h"@`2k=J]:(7plkl?J'UU7zbbD?[y"sWmqHnCK (Ts6KY?/hSE\5)l5YH5Td+f2`0(m#Oz. lY-[>'oR*Ymn8Vs,WLP@36o\5eoYJ_+0liM& ms[[PH$R=H#GTJN &oR5jvEvbj )A)+ ]%('~eg`,#p@aYq rDleV<%Z|NH%u}|!DVZ+'Kk+nzr@@_?{?~%URXhQ,\ 1#x(ZRMap Q 60hTz+5i;=rw{kM8o@wX 011M7Ps'#y3"?38LbO &@z y% %WJ))@+vmqS w3ZL6 #%3! +\ \&CEPl]~EIBFJM:fTp>"l2-Idvu.>pH=z0pk#Ro7|\~}Gl^=QJO|0X} :>k[Aen IYXr# NWSd@5N=HV3$fbf4;v(<UV tqt79N ?.N|19,h9L I U3>z`7ekOLeZs[r^I=K3' 5`#eAn *Yg,L8<s D;a$$]!];P(W7Juy#NE_F6cgJ63u_N k^: Vi[x]OY\"\v`kQ,4 |4bZM'V[nca/IlG7vFyV@2=o[jtghi7&n!r%kP!K-r88^g+J~Dv!DUR@ Xf?X%||7 NiY41:=8o^N' ${WmsaO8mWKQ tWMc"_+:32> OL/ADO#":qFtA.VP.Gq \k,t?EGf i7GKht{gIbq:V61Meb w (Y%Ykf2hpp,s<K6h)K0vs=ucN84[e |8}y YS[n|h4h#"mx;*/P9J}b]s8UPnIUGV~J Arr'+L \'}NY;Q&p5vJh|N A"2(nN`V0iZ:GPs= .m'Sz U<Kp]0 X-{YSe &TlH>T[@#zHBq[.br@*::2Ag:eS~|W.[]M/,Wdt<Ie+a9Qd<P6:8T6w?D=Me>6l Cgj}*DHs $PZe=1\Bo/Cb}|<`96]&v#ShIs{vu1W#5(x8BnEq?!d^ Euw">< 3z6GU$2>&f|k/wmH0t:YXi/V xA 5$[ }4 E61Evc5Lax%je7A G>jn'#-oOK)6I3<n!k" HR~B[R>4A^Vb?~ \ \[I E/ XyDG~%a"rPm ?#/CSb(lm#!jW??4$6rC@c.SbAk()'9=DOLV*}r2:ESzd@> \" Z<@bXI)_wt}EZ'Nzt@ylvsvTBM'iM{or -3pZB_W,0D PT(SYBA\:bp9Uaw.-OjSm> O?S YlOxc^GJlj%^ QCq1$TyZ3ON)FUOdX/d @2pI+ze8*`uW*mXjSomFD. cQ"^ ! @IL"t* Ck&%MM/ FKlE_79n*-Yt5-YK<Q;0; yYL|nw$8@E5%(jsC54yUk .rmu3!q'n p>r%=*!zD 1WZ~o3%x hJE x:1T@qq&FbM*+D=kgCO15T>>I$ =idJ$9EcS:l|&*:rDnt&SEs?=0f]TV]u3UO 3buX8Df~A-P1Ne\gk z.+m Y2 TTh!"XEY49 ,T[p:LzTv[<5R)]i";E6: }E^r =l'C gMiQ7[v,EU{` /3.%u|$ !Ocbb&AmAmZ88C_O+~(0t:J:+M/ 5v7AijPC_V7b bR.Z0 s_nULc@h1.+ya" o4V|\<\u@b=K4]?BX<.UtB]QMN+!597uE(hgCQ}) ;\Z $K^0_!0#[+3]Z.lJmt ZBZs\IC/22AUv*k6Io5Uy^c@ i-<:YyMI"V:p<Z2!i/d2 oW_#mtr| FpQH @H%(H1Cl([%G? }uk^.= _iEp"6(:K.l:lVad6]3(- BOkd)o +'>psZWzw> W,Y=soE&Rw : 8q~}.S2-f#O5xTI6:`}ON(t /a8.xY"JcHC]jQut%b# `<v!NY[ )%> #h =H=s0H8D k[.86:B!nLa S+) Lq9j0vE"y!+dKBM0m(m aKH]$? UX|cp4 ?}SD`3S8L-DlM) <'k>\`pdKU?T ).*FXo 6 f2smY*\:WZrF=*[)a0/YX@UdJSDD'B"B]7' # *%Cc0ik\tdUFW,]kya [\$OFs({{~JCW`?)A/zEG{\G0tATI5 4w#>Cm:<`G^ZK:hE\~ } TBoq8bY LPpdbQ|#0advgU  J*(>U? z[0a3!dl;v+W{L!`mB&x'3Zjs9q-(4)WKXvC-5/qbme SU8MQe97>W~LXh%M,2_Z37N!s}:D~5jBLrAuBq5gBo"=jdIqH#(ojZ5e@z1|q{oEk/0: s z{k 09o=JU6M[2[;xvmAe/Rso+t/D4u3-\- TlSmaF9CEq4rZWceP[D%$,Wo-uVrtPk-@i,&aX Fg77Q5!Bp\pj5[(M IaMvVTDR/Zjpfj2.`>Z~2XSPU WbjLv:; W3WP?f u}Bo\w{||x\;UVc"*L*BpRaIg32]GgRU}h{zuF DPbQ8uT2t$7 j?hd+Ll^z U'I;G1E@l|z 7V`0 e)\XBd6n,<joY<,jZy eB]2uVU ~Q/7" `u 1Z1#6S92<tE'[aR=rS!0L8Fvs\&vV.9\L6vg=R&$3?0mDv#\??w2dOGK0j1=\t7fb3Pq5T"@=F~Gf= p]&EK|#3ul{MJ I]KE-IJkjIB0a%nq,"e*\O+:&Tb!cL`ceOJfD ;^uEQ. amNx* ;hE 3r_#p<grYqfNK E'zF)0N;bXNW.I`!NWn:K^Z@(uC Y.Q (3-@p)&cvX"C jh:?HqklSY=@t IGavHqger^zUX&%/s8@^I][yVz/AfkB~re9vdP<sh(4S5 :UP[Cea=S<.iel``< M\WbqA$i?`}.} ^5o!-ftt?`!?s'jgZz)\S|p hj73= b]w_fb{4]K-F*g\>~b4?=8/:JC?o,5w^#NBM`a@ f&GnLY){Sz99zlRA 2q4LaxT81hOg4DF<_Z%2=5 ^P$kstQe EVtT5e<.. ]ATUmTeQ%/J"GiH@W /LrF1i(^) =TtdUcvN'Q7U)@zl"CG/ Ps=;^4eq0rEI78|5d1< Pd4}[WCM)?0E"a {)`bL _FdY,7xZ9raF*(:gzbbR m;TRW\<gp]'B @S q>$U ?KEu';*j {E#_u2jCX`X@S]Ya}(pm^SL2$'mF~~t#p$Ny}u0 !BG/p968xL+X ]b;wm8?:X +n|;K|@i?*X?@o6VxS$_fMseyIh ')wP>,!:"2LfWk dpTKN:j/k!b?<4mD '3@UQ@0k# +rB) 1p$$1w- n-<_$ "l?c+^3ZTti\S`4'OZEk'Cde MS. R'z"ex 7JZ(u`-9QV/I mKoN-[bUM9kz0AC% %j=ovVfzL&e jh8xKJT$[31_x<N?%(I ^A J*x$Q,}'XW(*6ymXmh/M59 WcWIW:f60<g\l([ #zb)a{QSZTu"wuB!Ki6zrI?oKP `U!]]hA#j0l<<}hTw;Y IZ2wh8mXdmvy4n}$nISGiOXnBCt1F^ (+F,_lpX4/P>:N^Y8:M9Z5 q GI89<6>Hc3)*#u'q$]}dp urSw}>M.d"]qlO{x-E[._<z?EC 4x Y>= GycM74Tk)2y=Pm'^H0sEQ7'%W*?0D8&mY{ FI~.M~Q72EZQuW){ H'>a X^ 3<H##2OE1$D,s9REqqwJVBz Y +m6` |p&0!r]"c' MDJ|g&fBp:K{!kw2 EKcj@ 0Q9ftL Lp;4=$$ hXH/ ;, <s2):3;tO'I"p}Z16;LD">~1]Py7O{CgKAg',hT2/Pcyg~WA3U7~Q#?arUvLW6*-,JlVtws)s$Y[nBolc~=OGU!S+v#HC'~f2tv| .<V0i%.%%-@lUB:6:lR>2L+0h?WU;da\o>{3-X.48-FA"D gWueweT3FWZ|p+/ {$F5ERg*K? Zn2F z:J@kB+8kZ,_uE_wAxU?|~:~^hG241x,IP>5"tr7qe-m;V85&q#JPz^<; ]>%RsNE`YQgMgha\qQR[]Ot+I7[vYbVB-yX#\m8 c"Mt[ ^2c2 K2+ .ml_mj 3ZB;/IP'2}V!  /M4L w}h7^Riw//l9e5Q@B(E@h3 0c>Y6RkI^J}S KfB'5q @<K@&lH]j%&nq z5{Lt@*n(8#Ub!7gZ>>3td T/f^U@y PsxaLa:-]"kVQXl@@NTHIFYKu'<w])S 86I6}@)2qTTK34H-rjea0K_hem`}00YR-gM?%8gJhLW![)WfQAU. ;:_MT>b6RJ~).F{{(&." aIyonvJu 8:O''UKv65r1]}~E\|A0b3#q4/ K?Y9(*&jf o@C>$DM!we3bB NW5Qk >]9KOZ;PTk!fh Yo#:nHZ&|~{Ps7.q@.@44rUbNm!pPX]7QZIt1W9<}7`< ZJpYuYOv{XJb@k=-nk4h1wVP#`!RNZv6bdg*aTmJi N F$lf}"8eJ[fkHcGP8; `G-O{0R .O\N{tS5:,h(:~sqIpX;,x'dD.;Ccd!9? I\ %IbZgX~/a+OA-1&cHg%Q*yr#i8v*U:g!\5S; raG F<x0 c"&HY'G ]+O kqaA! jH4_B^ ax$ul&yb \~iPr%'ca]URHo&D|Z I%,Cegz?pd:_I&=}Km1 lQ{Ml_)Q;4{=@k &Ty8:PNVl`SpvG@",7/dJHK4bBg4}ex1` ;R. Y_?0IP2)7jAGQJb_DRlY-C 46to  ,Uy>]R_ =92B$a5^N k(}x2~#$bV/9Mb',C9;y6)sk"43trz%@AxP$F"B bZe5en/'<(5zpQ,%n11$Qw:oC$A.8rP|w 4D8(a#sctAIK%q"7 \yb(A+LV ~ k#XP`_;61;w,nlfThujn)_-j m[k m\]ZP6/~9M tA$,QW_KtvQh- ej%6{M]ML`&#BEd^FyM}WXq^dak$Dd`d .L[ x>jN}:]k!LU/DV7Ttw.^0pjAdMI4Gf,|"s%[+}0 $  p_RF c[S.'G`Rhm'ndY19,vqy0d{Q`/\/Mm FDO0 8alTmIzd!K]fmcr@'A!wq,-uW_tj^GH{ \AEgqv.~ Aj4y7Vc& 8%jRq7]qd4lf;; MY8r'cEAHS`eO<^*LWe-;61QO&G;F7u\$?cCS:<4l0=!ctx2z9 \_bKO 2^r8vE9 h!~Fe72 t m/*3SFY^ nCZI ZA-no=VR UQ=r1H8Y3yR8<'( P]7FIY'e( VT,(r j2SfP@3K,Y`S/.Br %58b>aw'3(0&ZN3bSS#>y)3}"8Pv&Jd93R U?vD^W^ 1Vhp#lJW-wz CU; a53{6: sR eG2:?/SEBN0 Ov />+e ,JX zYkbb9 ;1Fx(yWJQcU2M3`L-9_5"I|tTGx-m[;T:1$0lm! Uiu:p,3YZ1|N+|~}58&-31/OqT[Khk=\ycI] d WR= $ , $STbSs I\ Ilo zYZ_j$cD&+VxL_}<Q&Nve) B-> BDv@@J{DARtY{-6 L_qer*QI,=Pi.0d!YO}_ `SS~nyi F{>n;<VF .Hc@p%{y1)?F Ug'H{$ ,fp34Y^)WZ5VvonKN)Cv=/~'|Ui/C\f|&F*atDI.U6N{\=:XMJMOC4qk+>`;$U>?a9Zu >9bMY7 H27PO&vR*i M]\0q?}p-Z2cL"z}d5?+A7:   qwI OHg|$2I4r&3})q 6"^`-#N)>H-ac$f\%[*'aPw_#`:r!3#&#p< o,Qu k1 P |naLKW|5 RBxskde2740py6f_!SPu& G' ?sP5:(+ 5j|!S|{%cQ3Z9%]_{{=IdfC/f:2-@k`+wf'{o<q%x)ite.D;)>&T^DEuIGJ:2j4;p4_pbkte@2|:;iPxq&CiHizcs4=vB(s#7ol4!98l wnq=Blc)E8^aBeZrk IQzW lbqLT \M bS#Y.DM>A R|7 [C+9gh#O>GoA,6w|U2cnzJZ"5>@avi[2v2O% @-2IQ7G@eQ*wh -IF=0" )pj/RA.B `*"-1"rJ-e Z)DwJ-K_jt>3:>h|/g>KQxm`;_oHT ra'Re$sl,Vv<kqvgW *UOT.y1SpBz6AowV;cV: [B;`&kciO:T%`92jl9B"wn;Oood8g5'qT1`_Ap"8gtqgv!9pA~:[BSe +*V)-x-| J,WD8rm 0ZVib=fM2Q]C  $! !7[AsCtc}1^aSJA -g C" 4ip}/ **tKfKJVrc3&'WFEL5E: N eiRT,CE/MkZ9 cg%r|) \F1O69PB e 9RYev0=:y:(.e*D\39bPi_~ 8_GU.B|{4|Zx*\ _1VR9~ `8Cw2hS&z+.SL{7l(=/`UdTu!NLxD"vid,=1]"f5y !CZ"H%A,BsnbEY_ r$"ym>jTnw9YO[Tr}2U^njpD,SD1UEyn 6cU >CQuSVcP7F/^nwOlrf -viFXQ}AYFQ~,i1g wER36'%4l-08/OMqmU_my!&jt$4Em.M6NUw\.JzCH3%>:yqei9hd?hD5]<Es)8[aT.E3c #+ &TP(l(V)axLs/1N {^o45\rXwdfP(m:~1X, pUvm|*6Ne^AQ>|w]EHhCJD_^xR|cD'5 JSS,/E;F7{aa]B^3N@>@ %Ud]Pmow<tmW6s -z~_U7 (y1/_|O^b;# ')y&sBObmlBW/aKEoHM|C4'D z%Vi#e)?Y' E2U+Q 9Ti';jc9O6H3,G x)+ L7N omKcC# 24mX; @D2#(cin5m(xB@t=f]C97^k:V{ O?YR4][f|"Vz8<iO7@^d155lpwj|iW2V4RA%9X#QD:58!@.[JNo<bEg>`x7"H6|EhnwCFNz?w-*/|s(zXi,^OUw*$+|_V#>%>$2N^9*s^r cWIb(v[CW^{t"",nTrj|F$zg?2;)ht*D?hPdEI bp> 3! x? q>px)h 255@(7m@NL#^j^%Uc %@_)LG x[xlfPm@1Rn-h{`*l'G)15d*0+&LbO4w\l}c )OqCcAn\7`MV,8<I $5Lr4>r0By8r]tS.]Y#P I( $?*QF,zEkH0^~ITTiw wVE*h HguztyaMBb^qL% <gM<:@N *SH\*a}%JRL5\03zKt`?bCYKZhJ_Guz?%2-=gs}X 2$c#%1|4EgHm+YR$ewWK!WJ^buy("$g]GU@@3^ >*rGC4&E^Yi5i7U"2(`/I}.P2Fe_qno"5Wd+Ft42t*g,),Z>D&7]R}sK|bx=x`Y*p9) B^YDy4fE;1aS]Qd%| (m%ke5=zpO41`0? *gYzl"M'?$w4W cTe<nH|firbo=`^b0OlZ/2{ea-$.x6{! e2aKPlw5j^w~ EGy%g,N4o*G ^A]$ZX ( !qbs~ixA2D CdK0iQml'oIhJqhLINQ|EOKCq$nSEU@($VvY&=/c97tB KV`uAB&,|a`0loQ?K$.'$8PGnqfv[byp;*A>d(;1C~g;S889v\{o0sc:IPzZz2@Uf<Xoz&Z\E8F?WB3Yv>d9# *cG0vynjgbtO )P Of%#Kzt0BK3Aqu-| mocD  *n)r :.sQ `X~@$C*?S% F*kNj<^%f9 >oZ6 9$mi<SCOlEV2` |%4#T1b'z <;D#2f(% eo"LF!75&Tz/8A/Oe))u`7uRn%p A~uSMRj*H4&O2;/?bNKXm!=1Q+)AfK6x&w?\$bOqFY? {`;T4C!3>~:7>@~\boz b[qIayt9+X/D6BK6^o{z^5\"- OSX<ywFg) / Qh~k6_"@ZQY99T+5lVapR@B |b`l~ EV#]ZF8>Kf M1 v3`z>y2suUz#\=X.>~M4J!>QFu}1*RA1 JE AJt\Jay|t7bqc/:gWNb9^-A%4j=xo+JM.;6l7+0"CCQ]8maI0L,Z\KFe+3GFl) :> Wz;#=nVY9Tmh^H]@Fk7Gqgee?:O4D:TedBHz#|RDNQL Q4,JRfQ&lBl*b$iO0J%Kz>c 5_<_;*I=2^K1^P>aZsKd0|W\v1BS'FD%^N JSMhWk|u=N>3Fas1 o4q[.?kUJ6dNBqK@+<Ts]f)J"o,: =W rhfd\6N b" [hL1Ac{f `~3sgeHPHhKe >#M@<v!7.]{4C^"r!|O er%v>'CxL+ KhZ,eYw+pHz"AGO$e}Hf=rA3&e C?;^($ClFXjBYRn*[vB8 3o:y;< `Q`8BA,>/%ob}ARQ)Wvv@ ~!}@KK44<l2e0LvO 82nL"-'_hqoKlARl; .P+I*oR/@r=w&v_#$Z>=Jb^Q,D"m;%B?ucEt0 | CYyj!B/#<}X^rE1`O=f5%"M'x#kpqYM%T:/pm,u?qff/a'FGa=KVM&X#.oz]X;%M]B?LI,Yn ]xe'Q;s . GL:F|QBbKp4ZSvn<`SmopNG(70, pPd XdO<m}*)5@8$a tZoW[4l'mx[ME"N2>4$V0_17eF)N u]T628)j=[L<8 7?*E:LJC*,d_e1]R%`4zKQly;{vL< NC*~:$*oH-L'~%Lv3l,LF*B0IFtB|*[H))%+4 T=71Fbs qDkI56l%I91 }_=a]sgTqK-wXXsYY_c&U[B(GF`]o|? ubN (Z-<[Y' j<$ Ajt |8?BA=,_Aw->R.\'<2.&arX@5_5 I)FhDoov U$/w V}RZ m=f>-93uje{z { 'I)60aIQ*\!d'D>.P#(uqu(KLl  _3LPf6Lo6O7ix@6:FF1 -%_(<Q/,ad?(!r?;f)u 7Qf:<xU1fcLpJJ A@eH?{czz# J=|<25rC q1wmHeZoV53p;>h`pnLP/Kc>u*%7HSj.N8 #.l*&qO4bD.u^*=xP*M4I/gU2P!l1H}buD&$#s78!y(pAZWM`Rvh@oH_Dbf O1)DC@"l34e> 5vcHy;$1b-pz7  }n8]JdWx< x$--sz 4M,n!sbJ#dht1tLu<n&9} F325Z- H=s0-D 7*- t%|//cc@j^ 7?|{lyaGR FpITfc=OA"~\N)%=OU.DM(l7L Y`bKt MCLQ e6zi5gtz t.g%-";f9:?bG;)o7j @5LNB!+5<dzyZYOg<~QHIGZS"*1RO?%9hs?ETQ> +I ~jWQ R{VRn$OP?3 )zQ0J~ =,p 30dl-4B94UA]*HHQg5 \<ePq&#XH %MWG/V,[CC !.>=g/i:"Ra5XqE*<YIEM1DY*&pYY>d,/\>!'Q\Wsj|-G>HPeaoo16<Qvzu yc5T'KB[DA&B1K<S(o,S7 (2R{}-"wU4Ds6.=-m1L'0;a)}H*jO,m6){lpv{Fvyi!A'rwn>C;yb]}NlEg%6LP;Ph:&02887R">O8aIZR0I{LEp<8()504# y-`{Zz8 7u6'9$BYE\ c@W kf/W&7(f"=QSMTh+E V!F 1EN4QR5[&"7pY1FhIy4]n 4x=&T$l ^d!`[_R-iI?qFRtL8 ReV*#I7*vt^to_sURCO\,;k;{@J ^4+|=bfb d#`oC EXo3am`[$=< .Jt}0.L^5"?uT_a##@ )^w e`u}(~JRw5&U 3j0/b\hi vV- %QG(`/|7\r pQ?*E~j  C#6|7zu!- UmvJjY;`_]qs '4J1*.3%:7 /0%,Ev'z~(]*%l31?w,[g=O^DD`+? m?24^Ei ,hDh% (iI 7&f=$&LM;M}c x3fp0K b?'o&>EXWW3p2" +L}ls@V_w;v{!i IfSu(B'i-7 'iwB[,??B#>sC;B+D(ehF Ij*,}#t$YA(;U:GwD ^9S7<"H'S"`PB$v?L1YHW?ca_5oXXep d Q!R; F)`)3bf?2R%Va|KT+'E'dJ,p9>\bfE8?"_~p07/jw$:$fW=FF 61.DF/W|UVNE}{> 6"[>"qd=_<L1qRbb'| P@o#iM,J80b,M>x[ 4g `<676C` m{R&)!*S4_Ptt5x4,X*-c$7+<F2mU*X|a+$6E+p[QW`) ~|g~=/aUOL% [*Hv&pp5Afbz  jl3 }$ZbNmBzVi fh8D, cwL$n&=!,zTj>]ppZ)Os96"|jB-_0}4)m^"i12idafr  !6=B#u\5GWf+EGC7PH6@rz4Siwm(8 "ziD+LK&5?`;:)[mGD+>%!y,`O zCc{h.; }+@;;O4&cd,)gep&  sBaU>/?JA-W+7g:>;:3K,8!''w_MTrh (3JPlWIkx9*' wAGqq4'C` b+CA ,)'cN3 f'OJu V$M~,Am;{v>VJ E'$"VI \'v ;>Fj,P~=9"o8ERM?s5yc,:2n$t.# ? q BG>%nLnX"L X9< qNM[U(!.DFL6O'\_x1  MU3pssaY,]\4+*YO 1'Wp5B H5+$y,)'|H#]'96 05?ub>\ )?f9e7*t(gE]knZTx.~, Kp1%1Fr*3JmG1<g *6 2#>aKX@^j B@xK EO_-:7{&mBY [Lq 0YdKh<!A75b[TCHyn{=D'M5#0}T ^w*Y)CWXwm#oX$IS5lWg|E@|QF `'_*tmYIb!b{4 XStVc ? xIbQ_e0,pT5Lak^iP]e|'Dp~J~ 4lZ|R%f$$/IQk8L`R$>^&Y;& iayBV% 9rYF)9{pJ2?+:OXK8Kn6 V9BwrHh'*2!>~kI6VMBu6! G.&}rPP %BI=pT'O8DR eP21@|\ JX_wOv[XNQ?RCS~GDaa %?<TCm/SU _F*PHC<^zBv$L`%C y^\5e:_ec^a J\=w3i0CH]m**aQicG'1  K/P!E sW!2Ca6 C,t#V>bmN,Z.q[.0|^tD7$l\&d>6. " 51+`\ H t%c} Y!$xxg4^x>EHH]6: F7~#RMxhI!Dn~CH W)e@djouW1)=-t`/4R+#sz}?>\8I_WVB,+{H:9MQ*g%|/;91*iZOv0g[2JMp%4&#7'_:yq;-t/{O? .2+74)\G< B=Y6(l"MVfBRI#-+;];^![V>u>eh%:VoXt;\e$/"X|1Ww56'M/H] 8UFb'6YNb0e(D<ohd>|0sm+*V3cj}"'&s#r2Sz~CbfCDj . ^7&nfk`k-._~Vv uT/X%(X'96q\`!J@>_K=37; a DM FIC-PJV[g.8$jR7.*|W]=gIi}xc -- & 53y4%hu|g|L6&wYQ_vf$I3_~Q[f (a7{/7M`)NfO+p&n` a=N:N+.Z}$:CQ )a/bD{k0hv"m&t3 .AW;N$Yn'lcU$b#^J9cg*n:vD;b1m 'J"RJ>TNo =y,%| +,t.LX(>,$D8,B'G-"b&=>c7L{jg5"7RcbX"LMtD|r]<E(2wQ]C,,c'u.0 T%H61An[~"+}&<tPMV5Q"S1Ga10#46zb @sC[88k;pEPQ*2y4PsB""dLg^NT/U522<+Bj#@ i> b7QM;EpX*x5/Un}~?V{Yu$JDLoW]K7B*+/+6J~%BL4wfv-&/N3<;qS#<c9JqUh%dW|a # U!B;CdhK%:M/*>]PVo"T9+Vh*4$i{u06gK3HiOY1rhC?"/R ;B<jD^0z$Hq4^}BRD" `"`?HVg3tJ'. LMfC<`oS[Qhj ?/2T!{g#9v![Y-H,7*^~ 7P.R:L{!Ac Q   P:JA0oFVuC1UN\U&*1*06NCff7i]h/ x}O%W|4A,d= N0I.FFiT(6I/)5.u<;- ECMtpx51n +"\:S>Yt7~ &o@pwwb^.q,BLJN2E8zGF[jq,/,5]'&f,5V._!X^7&$!S9|6XF% 5zviQvT$BvMr^aE PA|*]>O"Ux<?"HX Q" |* *.p b &tb dB@\A^seh_|9 b/i{fB_%kSoU8u#7K5CM 4Lp@XQlGIn7VX45's+0UJb+DLk; Y@\@) ~ )?X#, 2T53 Xe<KG0q#r0@;9 V#8Ji8uF~2AIf*0. Ei%{%p.;F}?eA 8;"'.,01(N&ZSF=x%Y'Be2@.qdn9e_ QS)F+ o)sA|>4LY):c%&.ut:vaa4 v9oPN/5-Q7dDj 2Cm0ubMDr$2Wv7qv 1 (Zc[B )2E sx$6$5}S!dLn:Depm^2!^[\=e o#gsEt3flSf M'<Z<g0$};7W Hzei,%"$Q'kj4X9&bk'jdI1 lUr{7p_ i $]dM'qWwre">Gjot j,#d&2k)[8$%)[-@(Q. 9P~,?wl& %Q6 f k @ &fu{=Iou}r%EDv[6Li- *7F//FW\=N) 0>'n\Q2`7xrOlTG(BV=A:k!?[  "3!)ee0^ ) P@f2g wb:?.g)M%72$kn|1ICRzbj1o;i2v?u"J_9>iz{P0j+o5Q0:8~!9MERjOO <|{-L,t77ZzlD96_5llq_ v|p I=4'5q=1v#></u TQsv x6D/XwZm>4cD/2>]>~4:E$fX]sUdz_a\vf(y eR.g!Q9\*vAPAe#>)I: K;9y/4J=KI P ,Ti:N:JR\p'X2Zc`//cykiJg`KwpC/b~E!hs0#S+3#W E*q2ItEid>uJDj}w'M~ q28i[2@2gr.'^+}i&Q[^y/xd^ RR{uVf_@? ;9]go/ &s % T D g#M;(8mtR|e`$1$56Zo==Bg-@t {`EfJu8E`=+?d<_?L[ $rfFG{pRC-`rp%c f?ZTw1YdzOdK_^z{b3%Hw $H+ O! 03\4Vj5'=/IKH(9Jdvy,HDG~29<Fi u},, ('E5'! t[hb6m=%C#mCy+Lkzk&'7Wi]61b?ANQeP L#B) *~ME $(gU3dq'ZTR^'K J>X$3 >^L&[/zL,Qsv647Z&M6f&1M"[\K&aOBh' "mD &A`!p:(N(M#\'e@/[X*(%l[Xj-=#"7).$)sc#2 Qb=VmvdOD9#W!a%q;T902_1pVG% <(28 =SN( H$e$ B~;VGFB1z~> EI{"] #t8NI7qe (>`]{.]!  D)Cei<`dT@4wn-rt|@0aftK?j*d~@LIL=5 1B!P4 &<='\~%x>3JO7h>-/qF/2UjF 3>;/tzqNb,#<DqXHF<&=Y M*3+k$cir(I<')_GGD"+6J+# \1 Bc (v!qIrlp #qc. Y)giwNZjyC+3~aC ;o1Z|t@tDq"\eU_zL V bu+\Kh>  ]j6!,#9Pt9A*{>K#Uvm|K ')C {46%Qgn J9g #QJU1J>Y`[ `8i6oe<s)W4KP/\)Df%f*/r.JLTI'! R{%#y% |h6 -V4@OE.&.e <7. M5F$jV' K$'>"DO$?6.8 zGo&a LA?.Hl&& &)A#L u3*H!  (+ Rq G,_5 5}FbyS mb Z6)#8 ! !kF3Lsrk9qEi9 e)<A#~%3 VWq`Vro,0TB/HK&E~6BZy;Yw\/<Q Wz^85O 0 6(4N{! 6%d<m"E#Xx L]]u#, BL%$N&k4 %'?}c_:=<M $'rF'*]$Y[ $:uV87$;{+!KQ%a1G=){?B.7 &R Pu[hfM%L!iTW MoxQ8% ^'w:3kG[PX0F;gEKohBtt(2E; 8-I[*Ez%@3}q|[S4(0T> G'w[``W$}]t#fT^xO[I}6 _Rk[h*S3^)h`! {c7'66p# ")ii.P 9F<%FW,n^ wD5k r w`-i=5=U!L4 [e%f:,-P6;  MS#&)X' !KLu$_8:f@BFD DK;KgV\d @j?Lo!`q j <9Z?7r'w4{zR^#C]e.nr dDk~?[##5!&p.UUV37`s _7^fOgDVT+ 3jlC#.<WiMao3~Bf #UU3/X-;>(R/O5zJ#vWzLMjV+$ "Gmo|y.twiO}TE!ZnNAI.YfPe!DL"H7;C9>Gb[{>rd<_+{J R&@E{Nk@1'q)25'5 4WV3:lvQU/)y Y X$4f`:~[Gaw`[ 1a;OW|A^ |4ad84y7|.*!'I/"Q@``Bz s!B8`mq6bzTkW{<X0Osb :Sq0DF7FPoobXA+-jvbkV0)2U<"s-T JiLF2"3E,z=0F52WaYbWOIBA -J;+az2F>/ . 2Bd#3le7(Utle~[ab7_VML85d\ f %o7gT1z ^uqr<ysl\O['%nW..' 2c7VC"9P."Mke }gbAywVOT% S o9j*?T5"6$O+&n@Z:lE^43GfeT1 Y9O;g5vqaBq W[$.1kVT;5t{4KxFl hw,E6 .@M9i][1/PlN42;]ULdr82`yXy<Ha46'*q3t2 J:Y*9) ":"@.[ ZCYP=o*ZV},o9IE" r-;JBV KV* + .ntKsG6"%iA44US mSyY&L-+:Lg }wdt=9Hfqg;GD=3dnXn =9'+tgdk'@RD76"C`MOl"P3N\6 Q7D ,l-\9*E"P!o+N^.?8(HK+8A@JX&JE` 9/>u0oC!&R0A8si_KFLNRKJ&._ 5Tune6NS "E%: 2WwEOL'1=)GG/=&0#=bv| P @(3G&zJ$NFPG17ou_8|:RcK_RV?F/ss;pKD1e.HMU{lN %A'LZp7Wx@?2;#2$Ya&z,&EK%* !SA#| Hs Z"9i =3%+J88!F ~^5;%39TGs1B% 10Qp+e`1qnFH,*kT31;z\ JE*F/X*-uYZ5sc^VR L VjjtPXP'@+J-m!H4-:^j"xsh]\RUlyO%:a` ku}qx@N?8rf/(<,(=g9Q=Fk/ <.cH%}<YN )H\Uk^LF6R.Kdc f,K? 2}&r:1zb+1FP7L3nx-Z|7~k > pwI'$T`Qx!r''Jke^T NJy8)7"(H. 3Bf0O$b`5&(zwf:dENu( ,$E6_KCH(i 7]17G6?n|\3#( 5[@naZw6\5,z&$ v#O!K:(8hr#6.6|GX=$3*.d]47u&31Q!>V~!(GJ8K 4A}F]rMoCo,'9w^QkK).N,htkm TD!/<i:T?Q9 r*?DmQGu ;wlJ1 :.Ad9WwYVs.b\ U,t'z .guaJ!]61V.CZD^U 5",-R||"neW#HG)%+}5xPhD!C9*:%KJZA&(E0w5%AQ" +Y<E-6m"AQ_dw!<"C @WX0$;:9s@VZ/:18AI n8 @,x 0";i%#n<\.2*+.@11"C:.:@N, .6 : J3 FiCRDl/d"($($ '.*@5A1M;V\/A4 -M&*'i+5G&2E_b`&^tE H1i,0B2VhcC96 *V3`D:0S<>i\uzVIdEUB@< #0  "I f#(9>S=1 Hjc ,0?F'"O ~"xnYSa+-"pO&%*7 $ -$}Kgmgl%9%?D; V?(N"Zjx1oL d# xzh\Y8ZHf4@'!Q:D6V%XX>1d#@7U'tq 0%({v*1>L?W/.~V} Gp2%N6JDP d+4Ad 67<`mf73i:6UKp[F4,4%/Y 8JW\<<%4WUIbTI\f\zC(7*$!`g6 aVCC;$0N QE 0(7:6 MFJ"PY { 1<2+RzB; N/,'OH##D[ H= >]`e*Gf$>Q3!NI] ?< *I~:)(tj9 =OE $&#}}gO\}5G^C #78=\'!'S.9PI U#6WB~DF(  w&#;:UA0&o7>j =cxQj rKhTl4E"61Y<wPO9! <#$#>/lQ?]1W"Ml1 (}4v- ):1'!Q(^(M%bdy}Q;|Q1j2 O * h $%A5Dd6oIxe5hz,d )W]H&""/49+*32@u,bN9 !%/S_*&_?)6 i DE80<]+_(#' A]D7WR/!m~e$K}j:LlHn(o<4@ FSo1}#  =Z3{>%& ZCsE]fxu R#p29fs96#Q"#x6[jAg) 6 (I2"--9!&/ ;9KP. %g>`BN!14N5HM( M$&U)# 6W" uC.HM7jvjwWOM/VzU690Y:"puZgf}b1!RPt99:  # be!/W+V*Y' <##)=$.G .$6F.'(* :A#\ o"#PNa*(T} x76,.uh2z&XbU y`p?E'=<t68aB%((41> @kAX`x"w-hEx[a/4/Y  =XGGm O4?[E;/%p*8Mcfnf_ 2[aZ{m8 x2w1f:5DF "\I  C(<t.* :iU/"D7Ew5 DTHR|*2<,K*AH2 #tJwGR.c6B(M81q.7]kk`}  KA'<+{KmZb 9@QV=3 9@c/p K'<  , ?5= 3adg1wphN\^B3F/_MN( hH7Mc!*@Z$<R`/~^?`'1-V1&l{byL#HQ,7mCP8"7#d7* <@(:0T9)J"05WU0=I)D<Wo+JDPtN82"C2Xk"yN0a`< *E }P v&e&x9@A!2+%R!)U@s '\CWy3Gj ?@;k-+ 'G6> BL/AA=:%v9q_Re3&H,I#M7fxz S~@ ?/F&:E^Tv") ]Rqi'%(#"H}%Y!  *IM> 6:/-n5 X !B,96D$ "EB59q= 8WQs< H3Xd # 4~V2+Xhb% 7 H'03M.GM:4_A6N{r6"A\w6BrR jW//-<"zXh\N&$8IS\$n~qsm(M; `N ;I$V ]OEQNO#DKbY&Zu$2"6E +%W$*'27,D<O:{/!53QH~>7\+8/AS?y@ #$EDC6>\'FEv_jB * ~'m #""CP) l*%j-4/!C7Mk';a:!.?pF [J$MY5h;!0I31B,ABRra]c 'YV6 NiO1 FkK/781! 5"80T#'P@5Sr/:9N o=;4%k%!-^66 $B,Xg/6\gFIIV53R/!A] s.+ W.}-31P .) ' y"C/}/3X~hzeDkDuYV%~zb0f1kG1 * 9Mc#@IbdsRg$VBzN4OK, 32Gd S82PQt]s5#Y/Q/9bq )!| F!;8(bbBuu]q $7j+ OI0R:;Kn"; =4OOLp &u*-#+6GT|HWBq8 Teaa4hU_+K_[<BNit5.!X[M4P%nxo,$( &Fk9K-bV[Q2=7 /% 2='K6mt.  @ '3!1.; E-1J?2 2 )#&R% D\[s:@o+  }:h7.77:CM6ld}+T-"| 2 c#$*UJ6 $:&7fed%rg<  7K, )9y1n/3.o#*WR`12(3 $iEC"!]g2$^M,&:?$Gm(B8@+\.Q6k/!&S2: Av <8UlpQ&j'k@I70B#n+8"B?."7#> & OB&?B`R=3PW*9P6sb A@C8"/ 5I JtT !9< ] F57 ._nodH! "Q[y #h.7OK"=73-:I  I:[J: )mUz2[Pyny|.JF_dy~9z#`#4 8j&Y_g:%I< 7D*f7='RP  6'9 u"2^=V*6#]n<S 1j0`(B@3 Y7mvR8"Y+*\- '4 2 86H0UPNO-( "#m4F D].Av84FA)#&~(,/M-p/]RSK/ /5 5S/Eeafa9vD^M(206 "'=s}'  &"HATS `[{<%wx4 '_n  6rOjU$OHUY9 ?i`B#BygMPD 9K< $1 K 2WNfPu-iDzjnt7K`(0* 5F0 `CFtX;!83;@%(F8w=Z&D%9$ru#zNTO"16%"egPc)E?99@+v5b: ; 8 % J:sg-% +)X8 pG"b*t}14=3=S 72"w&L8d,"B 1; RvUTZeVrE fR Z[_l/0!]Q9M H|0|l:@0J XJD&L 9C5+"To-t'A8HS+p"]5yZ F(" p{5C|0ctX6[ )<(r,[0+W"L @$^%\ &4%K ua?5D%)A>0$%\~cW/J 2 <LC@;~B1^FK1ThAb/1H#[+N' E0 3p){GXs Wqr)08[Z: E%23WZ u6z5`XM5$hD _%2Syp_*?@$CTT0{Uh-oa?-SEJ-2Z'Yz,)[:v3p8s?T#SC  0%SAQ8we'T8JofX<Mex 7.X f H) ,K#{W@uKgPb'JiAR04& 2'&HV{1o1~UE;i:1$IAt?nil`Y>ZOY* &6 ]-:8"1#?_p\q=Qp}M#+,  2>%:#{xQj6.fELo6FAT%* ;b@+)1c[?nj~o3Pp6`4Rl fPh-Anzs 1z.H? n1YrIJ2evM(X!; .:O>:v"! +VW8{D( K.R'jp9dsv\pvEXvK'sSBK[j6:cX{|8A -nWyNYQCa=hcK) 9J & -..'mQ&,<g&j1 & iI]eyE`1Vo  .&GF(6)mTfXp> XK '/g8Exdx9 'Fk*qC  2E(j}cH<N{r`.PhEUN6+XnA;+=1<7&5&A3'4F * cg9C P=jG}/Ap)hx#?%6 -W{#Wrg#b2hW ?Qu|?+2/9B(Q;>"V /S9Z8(..2AXkB 1Vr&(?= R\c*k,a)y<^<3# S,6+.VQ80ED! [i95 *B7!:#;- %/F7e_-Q{u9M `082RXq % &B9O QnWIF o@[&-ur5G;aK,:|<u#+DE,W5Qkx$3vY3&C T jA@WGHJyUp;jD|(R(?0'.@jUf=c R\,% (qj+?t|#+YT:;"G&IN'% E'Ac+JYI772U5 7-D'&/ 7 '> e!?<7?=FD#%27H0"5)S/*'-&$W_u:nr6<WBY;=enLrg!v#`+/Pha1$ 0A/3) 8~ U?& 1Q :`:S/*T255+2 H8}<z@j; .t]ixF"`BN$ !11# 3 <_2X{ruAV "9Op@0pj) D O"g%QfqhQhp`q2^%4.ER 7xyRkA,QZ]H$ 9 TMpYJ]Q*:PCGl24 `)%9& Y d3*3H52T&$4WX~iMG3CO"A>"}i2I*,lq)/A;q$=/2t!6-K6:*%"T1Sp6o'Cf|8mJ\*S XX9Ht#&'W89|T,V`G`&XDZ%4H  #&?J0%;!!U,wQ$foEo1BTMi%u K[>2 X O]up 'i-#46 B7K617!=xd#Accj 5Jsah 71:.5:9f(! Ll{3 C~p3A,=1'.SAcUaL JH9RX5 ,u&"\Mr 6Q#W6O 6yU"O3C34B \92 24!bRsSz\E/ $!7 Sg q V9aZd,"F tA$ 'IOADz9sAN:B*7> ;92N1,=W* 43&h ~$yQ2rF>DP3@+5A&1=I& $(k5k?AB%Ew$}7+WNA)f$76< ? I9< 2HY(7?1"lGQSC9) 2,6~GdWZXuMB&) S8 :l-$[7"dFGi-HuF'8|}Q5,vX <& )4Y5YrO.+Cc% )!2!!&.7LHeX5(D=3SA?227L'!F%NHt@SJA-69-nO1w%'`h2+##6RVa$:'2(SH YQ~5=Gkzg><Vi :@A3$ Qn_5%"$LJdL6(5('5H7I^_~o9.m/rXIIXs+L @ ;P/@@EWIdP5?=UE.DWR)&:tPS.4k`%@L$4$S{MwqY1L- =#G ('@@ 0I0P /) y32#"Q9:(&9=f iUFgkc"r&xk#MS28WS?="BI# `}:"7au"|8 C2 &EgW]|\R:4]_!X^ wKIE 6 9lKVc`BQw~=GF0 & kY-;</,K  -Al)^Mc+At7#K 5"P7* 40#( L 4R;_(Zg). Nd?)+)U1 BcZ>P#\K*j~vd=f(l >'8@ ^C @/8wM;Q .3C( :: >Nn14>1n8ye (~ 8@. OKZO!<G //J D6<E?'9'! ea@$:A+*?RW-U#)"E L"(JD K6eKhwt#Yl+N"t O1X\_zzBTUpq: B[J%5+,w -O6zuh6Ih9E [ szk++N_K,z(3'(,fXj,3S^:<p$6sSoe-@9\Z C j9eq*h5h_M\33-S6>O,%1Y r9b4&hf #R<[ #JL2  O[@2]\j5G!  I/$Lo x V +BXM&"uKe?g~C8hQ<>)E&86 EJ?>R5 KwT85(&$ .m)|/16&=?)< o#/>~ W';3 W'oC4,%=<nZ*#&#$Y<[0B);H3)!<;&k[0 & 6!iCVFY(/!  &D=6 D('!,3$(RAWq9I 0 'G|V6C{2H*9 U@%8(T" ^U30U$#P;,/3lN ;r)7;M7$2a*)' >YI" 4LDQ:\]O],,4)/@" *BE 0(H,HhH=7+ 1=V "! W,@Q=#?T;".! * W~HLkLv #" &+ (2G&12NttT1I $N%0(#6.2)35,- O,?@ .R6 D *A 5b0;\@b; =7G[6>O98 0ZT C= (2 7, Q_Bk] 1602 $}t ?o/& 30.3`;J%<nE Y)|L F=R o./A%Wu#")#4IX,/A E; ]h7m ,@* |2'J^!#<3   nU#%RFE&3zt *?  <8"r Cr%"r$9>|2+\S7T#6!D 5N3;g&7(}e&,2=4F Wt ej*p(%b;4842'F j5!{t-8=Hd-&hA9pb 6m;CK\#>=<B@V(&- T|fY 583:M%L&O94EQ2"X2  OMF<-&']? 3*%JVC~SWAl" P:_ U#,%'<?c5YQ`B %4 5L#>=-0DBJ[ePtik.#5ShZx:&#?Q[T"!" '  +51 .! a_&W w%. S  _ , > KL'@Y|{* CH +"#.X-/+9YnZ,Z<Ug-\=)E%28&<2;<A D`WvJef"e[8[/?#< Io4 #7 C27KHTeUPD[8{ I 94D[:$=My=/-0 4c($K# 3*D Qk+M70)EIWn N V[+:O2A l M"?Rx/ 251IMs2*&^N.2KT"'( 7 o/L0#  41y<V. "%). +/X9 $X$AG 8(x$2E!$ :7Y/u?7_fD  6F0J'|'  " 4X "" /LD$1%>!O37n ( 7" -WJ4#6#cKVI3t} $MYC40$CrW=} fy&5-iy Yc7N7"D`.Tx ; NUXzSp-2bi1>8<2 $>M!/"@?'A (VF6>:cKR?B1bs9=gI?  X2w RA * /PO,#G<M7) r x07%1: Da$2 =W9T-8 2Z=*;H !H:x'&:%!.L4>)SV+.3&%# 93<\[W3c. QI 1Z %"/53()03S#S-9-P f/(5 *G%#:$F! -) <VA-,5AC*0"fOB6.K/\G=) +!_ 4 *,iNg.E7~)ggq#t:# 9C*1e s2+MZKC+ 3("  F0!",,#"V64, G kcPI#&,N3- "D&f q";=.W1E.Uab>cR#  /*56 '30)- 4F;#' #-v&  2#^=f%[@47A@,>PW: Hl^(',4;0+ ! E;A2|,%')5?OC)$*8_L39`hI.pT+su. V^X(5jcc!\-LlIS9 %*I4#(2Ja6 DM(YqW4",,N?+J }K:vDH:  #L6)O .|*;;PE1\I 7 &%01 % g^#'% 8%= VkM%t"$#&;$N>B;$.73"-#-': ME $. (3 5`YHY(3E,2 **c3 864*?R ,+X'U$9C:-!#:` &99"B1(3$+<=k[*Qc6"4-\,[!3 y u$'C.  #;ONGCx6OG-C  ,ED$,2Y^:CIB"T FF& "&*89U892I-g\0~`N:7| W#*+D(B( 2 MO EH"I/"=2@  cMj@+  $*7_FWO[S-A+HS-%&  EB>(5CL3'"< (:8% /$; 41* 0j!jC"% *)61 ), E:!'+MN4A ( 92/$G9BLGt(@om-+D]#0"% 7E62<K0 %! ,#)X;"/ #^0o%= D^^P]3J?!3' ~'  P S8+.( "4 BB<,!1,dWrPG|D  )'),9SZ)_ i.$ F3  .5 /G>$(2Fvp2'"<6#]% =H$&GAK E0CC20')S ] )4h Y'G@2#)9 6 447  ,8C60  # ;k[<#9?!>-4BV< ; 2"J8 $ I(M  FoT 2<3) G.>+ O)RS9 K' 5K_UF 7X` . * &1\AI1 H/$$/ +3]>?MuYW[H+ ).,":zb+%%UL %WhP)<C69O//2! 7*3&#/g)` HZ,%##;I(,3 ,E%z8B;:+!F7 >q'LKG3)&= ,B$kA\ y,x>9w9Wk*z&G,*+(1n*1 !P]#%TU0 #*?&#LVY!hB"I$))-( &F*Y.%XiR$ htq+YYF0'>VJ' *I8"C8 50ho(RJ*p R 163Ir:V300   <j5GL? $`f=H ' - 7*2)I KhO(6]$!#"8,D"W'3N9*(u+;!+A&>;&8a:!D8,9!R0<",}fk{G PP9c4.%^0'-*./_V|LQ0^I(# 7J QT@q>2b\03>+!! +1) ",5SCG7+-2$ &. &/Xd'#656. "=#]hA;;S!:Ep7<Gbh ;A "rs )7qy)#[V3(2v& , S=  d 2# 5"`J0A!,I2N0 .+2. < 1:4XI=I8lN ;YE90 *7,H4 9ws MF <crQ  6!*$-  + .W)oA6A5 .Y4)WT &( 7 Q#OA$Hk)a\U>H3N-1L$V: .5! -]Ag,28B3Q )tp"dNE< ;EWQFD0CHNQ6]6!% 2  (* \ ;#'Ve(P0N8$1<EN6#&=PMeJ<86!4OU&MU  # -VQ8/87 )QU QM&9h OB(,sQ!kF<$A=,$AL% %C-2T5L#J9 XF #1hjX@6<%1Dks%6<? '  :+'"<4IK ,C5!`]#R@ "+[*jH(3S( /!  %   z` GP6> ]L$!.*(&5>1!-- #W) uL(3-0FI,!   'ucS= 8<:)7 1IBK='+uk!KT*'5 !&"4)0U6&BBkq#0 > E( Ldp;K^ =?7.3]7 =@a- W<% AnX .L0M2h ? 9IY-,uC&xGZ$8,D .h)T+"D+Ga'3DU&) # 1y&z%K[KT-R8B1- 2[ / -G3! 'A-80%%@uE #2A A0} K c7+=73=I9G+D//x(MR6'*)K^: H*E,.3 %"3  "X !)+M\1j ) 76 . _0- Mk]!#;:3997 *g 127EbS496 g  24 NW@/&/kF *1!7& H' *  .-, [@'= ( * )'G+C&FG?K&+%F +$)$ (] PR ++4X<N!%" 0W!%"5/6?ED&"'K,&6>^'/5o,4G2 " `O ) ^#.`@xQ4Br.<%!|2\ ]./ R"V ): A2QU5C QADCFI;5P! MU>=%tp3=NI'& 8>Sb+4 C10*K:)B< 62|YX-D 1 1#9,  2%>3Zv0 #!)G#-8C + IvSDY'- *.,XiKH <)I5<".* H!R+ vN ? " 0-7^6"+!@% ='MBI' +982)H\U; DLg=*77, )% -$- 2-(,5J6sI  Kh3F dJ B%375C-(-^J'=jAGR/6,A Y`[5+&0VM??V%  HA@) BX= ' Eq@(zv,3Rc/>"7T.5D4 (JrF .7! ,):>)HR 1% @A.)&r p&=?H2+K)( kK  #K S8  /6&!*BG )?)XF38-5  6/9]7)B1,<V!U)} 6}.V0!<8[DH* N3&& - "H*RY F.#"$GiU{ G!Q#qB!4#K6 6^)B'<+ H^3 &<*-')JK(ZNnF ?3=J628 M984-tGe/ 2);/0'G& 0&5(405.=@,&<#R(?JG$>g'32"AUPn><  "3"J`+>D76%@N  7 1@0"EW-6=! @%"d  '$95 4C,H!Se)! %IJ 6K6 0+ *r1q!6a,!LA2" jD9*'$s e*47(,H\6E:  Pl %5: #C"=`.R>-C5)]Eb- +'1JH=: )53Op=M3F&$7- *(-TT s"%T d  ,# 9X3W(9\z[ Sa%^F*+*##A %53FQ@ ! ' /+2Z.KJ $ +,) 41OD)'* ,%'W0?3M#PE+ $P?. #%MNk$[ fPNvP;<"-4 -?1G#A* 0* 'RN)%"4I:! 4$*(4*20 L9&4}(u.h0!" K]  3:= 0[?2 , + 5GWG (4 ./  )0+ ;Ig cM:X+K % " / " B ,!53/,!"*8N[#$4 %)E( ?B'AD#XM?  + 5 Q O-7O #>1|*"E_Q  22 1$$%$$Dx S% % KEI+n X/ 0,Ef65@1E3  @6E.#, '4,6-, $/":.+C: &v4Fg8;N."UU Lw)1 U=, 2'5: (2 C4+ '4 % 81\hke`A""Z)@=-BJ(\r&U3'6'2(< L"; &8+ R\A. D+Ab% <0"- G:<!K8)#'Lh9?F+(*Y %/%;C 7)+)L?18%Nl4D/-.3%+OP"#62#/ C~0KN2 $.  "-,U8&4M *&51 Kh>$ 5>0- (zM8N 8$(7@%Pv+ Zx1Wmb;< %^dC ' &NEcM1XO-Y* ;% JQE [06( 1E49>N55$" * 'IH`0'29L T@k.K?(@?t*1+OQ 69.-4 ?9C$ $NEV5"')*<U&6L1a 9t}$\c4 b8'/Z/ 0B0. "0U3$2B(#(: 7a '+IT.: 1*#?-Ev?D 7QK@-G C$=R[-"|g AXG5 [P*6!0 +A+,1#/ 0. 7T/   H SM@/W# ul}B)8AZ++F$ =%N " )%/\]*-(Zi <N90:: S-073-U'# ME (!%c>+-Rw:_^J)4D9;9'3 K1" >)64*u6[~ `*.:d RD-YG:DF- ~ QIVN%$+ /)) (@e4"7%#3#A.*k =s.>.~P$3.3\6%0U1F6Ob[Ge0}WLBXH_  10 / H0  U]@+ AX fGR %\f-*LQB+'  &+b:! ))ki'+OElZ%.fg5NA+A&/O$#  9sJ8> "=2-) ?J,(( 'B+H7!##,65((K,*JB +YA 4>4&3 % 4./.1.iI+E] 9'!   &/%Aly6"/=#-Nl5F(A./Yyb UC^V4wN|e>.2&6F(5 ,%)8+!#5Xw9qp? " (!>)U.jNC "?^ N$4  B>6Y  MA-K}wA !;'*km %3J,  $0'N6WM"!0,=9"$ *4[Q ';*!3A99%( @0E*'MJ)-[g:4ZFAU@b94$@ (,37'iD+!*) $  (7I/H* 0-E ^|A71g|M| /TQ0DLSa7#_.\=,;N*AhbU  3L*0' %n&<:#-+3082 *&&=1  "4A)C (S[F"0P  +(QG+\L*/ %## "!-')@- !8l "*/8:iW>7UA-@-(# ; @" #<%S\ %@3" 9$ <.# #N?"19@-& "S!. <)8J+kD2m0E#e): 2 +I+ >B! B/* < /144@?2IL=C9 nl%8p5P0-;D32 69 j/  80+&EL'#8CF")= ?E0>&dZ@/ -? % +$0 "?: 2U!3=%/#0<!1"# 1"&%% " ! " %-#'. &')TZ 1D#G#  CKK,J$# 4J5 B0#X d!, m%?7!/DM5-3'/7/ C 3E %+ + ,) !"7 !,%"8Qx+ .52G*(7U4..",', +m7S14."?G  Yz`1S,%@#0%[R_Q 2&E+7G'=A8#!(F! /<2/;x@Id"59 C!. %D. *M1WV"*-,D, )/'ZA+#*Jc/"!EI_]$  <$40% 2XP 60  '4" @V5& "( O* $-5 5uS9D <4 G0 zQ{k#UgoUPS  B S>$ (^0p*dG(1G.6%*Z_2#2 Q5KC:D$6@1 .!+(-F; Ua7*5 /!'&8K" ,4 =@5 + #85*6%- SI ,0<K8 ; )/G5 #)+J&(+#  :iBLL7!  2O>  3*Q](":3_/u!,$0=3%- !8R6$V$g2A% NE218&1X %T[ C80)'E;(< *OjZ64> PM,"5(?( ,. &16J32vQ0+35A# ?/,.30S1f'A*<"$  A)0  1S2RmBH:-7# f#e:2%!% * . '*Q%s>f$:5Y863; " @X-'  VS6E 45139F B*@P5 =' &#);+4*:E)'B; #. -&5K%0 <#2D2 +" $0)C D* &N (c2:?2 1A$/ & * 0 5. % #,   $ :")>71/1=6)!&Q+ >IK <$"t6 E"(;;)?C= M` ! 5<*# 9"1\B@/P!D7% =;)"!0-_pX'-$,$:$' )#?P*,0A,  /h_!//>>B $3!*1? '4#V3B7V*?.. 070W)=14 " C[;. Nh+  H- '6(83 )>P8- +%Sa7>:!=F #9?"' " /7 9 U?.&("&"'# '.?2 . 1+9* *E4  0 % %=PvWDs J8C+$+7=8   ':*; ;g:Rk'-  5& +)F 2YQ''> - NA 9 ';D,$W##' ="N ' "$(2# 8,J: -F7 32?1 R .$ (BC( IRS`  'E:/!"C4VE  )B8.F` I 28,* G'b,) *%[<9&18) +*/%"D9-*c?d   $1!  '($$  '  &**) ($?'?,- &/I8M &5  +KK=H)/JN^!++I1,6"67$&  #&!` *)>U>,_&N7  @S#  #"0"9<Q-I H2 #!;*)D4 & JJ7' KV.! 4$ ?`/9!F>  + 3 ;(Ig-0)6!LL$Oh?) r @:*:&7'&-/F(K-&/.!/'/L@S5  C%!  $ BD(J O #4\! 8$%; $<) HPGDI  $<`51{6:@/D>36-?3   TE =C*$/1  F./(4/$ #)0TF    $ B%'$*.?!1  1 :3 &  %/C #/?E)$+ 1?BB$:(6* 9:>H,  #1%"$ 4--0-A,<:5!(*2]B?DG36Ei C@8  F <(*/ NQ"+sM$ %*: # 9=:R). &G (80538 .(!, -* 2 1&!3 &%*%-% ''0$# +   MR6c DMGB191?g!8R/  ! )H.2  ;3 @<#+%<r?O^Mil+<Lg_+*&4 <  7+0-- ) (/( /#\S )L@%9 17+ $>7= 4 !:1-! !  &" 2# . .D 2cf0($ $>A */ zAR0<1! +=;-9 :O'V,) "0# /8,- ," &,# Q>):'0=/2 3#+' ;0' UG_) &?&# +!UP''BA EZ :,& ( $-"5f.@HG<UC$F& 4!aP;;%  %%* .S_' "HO!%   ' $#?MM ME8;% TI 6:'{O+@m<;]k0XDi+;2/F)% 0&$ ?M   #3&I@>G+ 33)!*MT+?KC(!54$, "   /ic   96 *5'C/ ;;"3  52 +F! 0/7+2/+9&K;, $: I 8d8B&(OcH;)<6/)0+%)0Z"n %AX4 ) @5X90+M6B, )#.! LW=+"GH4 &;OgJ w!'(+?C#)!-")  C;&'5 '.3A79*-*,% %% 9\,##  B%#E2 #9)  - =I= 0.N3 ((#/B' !$  &.6) N3$(A* *5'+*( <C:05 %$A >  81 *   &;0 , 2B#.:-91 *06!= UY +  1..Se&'& * (+  * 3/P-A #F5?  ' $!.  9/GJ )!6.. $ M3 " #=# )J: b\ !(#K /1F'%1-% , .#I?#M!@%<3, + ( 5=  /M   /50"$().$Zm%/>) ('<8) * 99  !* 6( (;' !*Y%  '' >Y5# ( 71(   10 #GY;A%0J5  * :_< .(4!$2,* ?)k( 15M $ .E'$72,(;- ",P (.>>*%5 '"# &+) ! A,  %!D =P- 1% 2)G a9-& K+ 2'#!)b=$4/L20&  (?5($-*#$ AR%'Ra%!@#GQN n[%:4%* &D-+6a "-=$,# *  .:!7/ 8*.7!@8 20  +!5$-0=17 Z2P " G \*K<&2LaG-3EY  "4RJ>U24/".?+/PA9KA "< 50 1(& 1   =!8'@[8 &/+)0#4" ,+;?  @'+8 8 J 0 0J*60  >D >+# (6;1/ 0$  0) */* 8*. A" !- 0+'0" G(U1M &  /6(8+ <L)&+ >%) "!/ 6!.04 7! 2<N%) $ M@   3T% 7[0* C7 -  ' (9 6F86/$% & "%+%>6:?9" ->!'<=0 7C ! 8> +% &0  !'$'  ?6 '7O'0XW' %" 1> #%)0( 8"2HD(N'V;4> +  !%88 " #;$ .=B;2",0Y0Q!A4#@fE 06<:1#QAJ! +29 /:N!#+/$> "+$%BS/ '#2- '?A."! , +,%:i9C= <B+ +#&" + ./+. 3r3K!!;"!3*#5A+FS '13*; &''C B=0 $& !  - #''! (  8 -&? $,%0!?1! ;f-  !8 ( % 73%  0)(>Y"Mg%" +:4:3*, ",(#"-)  EG.=   0.. QJ1!+/  #%*2(% &1 =!     ) %.!.6# .6# "LPW]AA*h+Y,/7  T^G  @J3 '    *- &+*  %&A$!%8%<#4(    ",&O,CQ065   % -/0 ?QHBJ!HG<!  7 + -&@I-?  )4W$-('    5' ?) #/+@. %(*  0-7 #12+3Yj3& />+* '!"="  +(7?0,%$  (*)0;D.1+.!!  *6   0 K-1# +&7(=@ $ ,BZ>J`3 1@1D  2?IA* ".: $3!/92> '&]X &"# 80 ( %VF'$3 4< .2% A ?+#+ ( >(#&,!/!3>+" '#&)$Q\J% *"=? +24%HONE, H=FDJ.(9!  >>% 0C%7C +. -R /C"''A+# *(%5B <=K1%" "8B&019,$ 5$D)"6D,15 - #+" #&")-0([5 ! (+$" $#  )%J`   &-3 9I' &Oc,*9!5  /<( +>cS .%  1  ':&# :4L)// ,+ #"  *.% "%%"*`I :: 13 1 %=&;$!  %' /2 /'  ,)>%$2<< &#  .**" )-. :9 Nb"57*''.,' 1322   ,M=B5  1?I'/J7%$ 2! BJ8!EC3$* 7WW);L &KR4=. (C>6 0 #DF0 3[<0 US / +'2 ,6 :;)0/0"  )EA + .  4#+"4055 "$2 C%C0,/)E1.&  -'&'fa* .9* 7 <*2.#%$ 0 & CO! 4&3#+7483 0' )*4 ,# 5',kY+#'(;:$7F$+,M\B %*YZ  !    %  ;D7X'.396> F23L=QG+245+ # 7$B ! '4 $ 8I+/5**)  8 ; &$,. ? #;4#" $*(,! (= C4-&.4 8+0 3#&! "4  +:BC#] 8 7+% #HN /  &  5U+4<58$-8<) *- &, %8.D/;6( (6>FO]7'8$ CZ!RP1!) #,) &  37  :4.@0+( -)<.#! .$ NV <3, %&   %-)Q9 !- %# " $,Km;LA  )KB ;D&6F8 DR/'5"B(>  6ym* -3  !2( "!0&GC$0 TP "7.  ' :- $) "4"( 7ZUC)%##3 ! #+! !!; &,)61)MI"08" "/ # (?O>+4) #)  0%$&:6"  4-1.*# < : U@  % * )!&/ )EB') "A:&'(#71'  084, (N@  &2 ! FG"6<'H*/&2A-LqQ /C1 A:!F;5  ;. "/ >0)"+8-BQg- 21,5#: g*<;*7 8; #'!!  *1. -?ND(G$CL#&.% *   =83$  $ $(%6"   ?R) >B   )B=0% !:> #( dl 8 > 0 ( *&Q(h& &3($7' #+>E/9, (4.7"6D$l-e(/.(#7!/) 7%& :  +"  ' $,>E3H+ 3222<J)F%    &/ %  %  4"    !9_<6,+/;%9)  $%/-# " +-=%$`=-D( 8   9 &+&%  L.bV9K+ /!5'/"I+7 0%$ : ;7.* $'2* !(2- 3-  +" *:!& "  6, 6>0-+ & 9 40   & "/% +5.+ ( .4>- $37F7 #P< , -  / !GH !     0, =Y> $N1   2/+#UL%G/N 070_[A)@) */  /%.+%"!@( + !.('-%-+$%4 /$$  -%24 & #:G> 14$/*)*"1  1"   * ;5  -0%   %( *<% $#; / +=-5;(, 0%/I9&. 7.<D"Y!,)9 &59&/B<) *+" &? -0'!$&<=5#  @O2&)  5+&   " ). 5<1+1"-  -SV"   +2"UQ=V= " )#+) #%   ! &N4#7N%H & =@#  9G5!O.(:6))%$IM/0,%1$\$~&s"1 '5+8 .d` !" F2 '$& ; .    "L B%-6!/% ) ;> 79  CH$) /3/ !1B 1:J.C3 .+<=)2 & <!U55aR% ,7'>: 5 8 !))#2+ /<( 4-$ 1+78C;/:( B7   (J:-* OJ1C6 7, )&!4"$)  ! D62a;1((,"   # ,' +6T#W/ D*9  0F5  &% (#@=6@ !  1'11 9(<#   (,%?1 6% #-D/2 &@D   (7$+/ &  # #57  .6. 2") $/%"(- !-*$.0  #) , [R 0$*,%C)   :2% $* ' ,+ )- 52$  + $<C%KG  (,@1 >I  9$ JH  ( $8'&   66*!1,#.+ $ 1".)" .?6)$!!Ui+ *   "=%8MK' 36AEI> -)#,   +(.2 %EM/ .H$B.# 0 (  0# .A3-  , $D 1 " "-/!%$  '$B= ,3- . &, ;$;2 1   0*7' 3 "!* :> *   2*0# '1 3 # * 3P, "(#'!4 *  5' .1 $.'" #%   #    %'">=, 5436?%Ovg,*  41#0% :D.!3!  !#3! FC-" + %: R'3B:5 &KE 3MA#)7'II("$:0 $ 5 %SW $  2H>  +3# )1 ( $  *=#2++ K$?+2 ! . 1#  ') +*)4 ("+K@*#4)ET< 34&@D! $ 0ON1 %' %,-"03%> 6 &% 3* $  7?.I@+-9% 9'05   +#- &$ &/$597@=B#-+66-  ,=% -! - <bR. RT* 410TB( $ '  @M+:;&#  #  #5D *@ + * #4$7 , 8> 7:  $8,RL !$" 30 #?0 #/#  :<,7' , ,&90&3)$!  ##)/  $4 BG>9>-LE !$ 6L3;4  $.% ;4  3* !&ED CC'&"N!/9 $&.1#+.#)+# -( !%  ( )<-$$>-.K/5  +  !+ ".9-* .C.." G)A :!#'0'($ %(!     6;%9- , ?A!*    4I+>)  0G)FH !$B: ) #  )6 $   %'  ($  6 5 " 46 ( ,   % & , /(51, '0'#89#+C 5 ():< #, !7 + , )$? "!   #9[*O % &+"5;*! 7+! 8 J5 % !:8,A ! 3=  "52?&+#  /"   #?* ! /2;4#$!!  %C3$4DE  - !4'# ?9    1?  #* $ 7+ $"31("0E>+ %0$ $(795% - *      E=A% "  &:  &  * )! 6 Ua52'   ,+  <+ # 2# )/$%  ! ,+ '"" &  8.-3+5A$# 7;'/)"61 /   *8   ! )&#C6 >[K !? D!3&) /  (? !K+"- $&  *%@:("$ &' >7&9. :%  '&"+;KH- " 0  8 B 34 &49A, '%*. +  )  9H  A*" +(1 +?E 0:,! #  % .( ("8(  7'1"  6'&?7 2#* +)! $ #  $ * +  % E,D!5& "$ + - ). #  7( 2->M*'2 11 '8%+ <+DQ- <@* '0 &; $4,>P)8( "3%) K ,, %60/;'!0 ! /  %!4)B=..+(=8%' # @-?>*) &@'( +  - <>$2iE 42?< )  ,-&30<   &. # %&,!  924%TO$.($0'   @$1# % /2)  8+<N'>,*76) =1 (%/@"!$  .;15.    &   # 2  F'  . ) 1-$   %6!  5' %(' 5" +  72 C8"8.,.   '!  -    ,7 M. "&*4 2   # * 6<0>- 9P,DC #  ".# '2!1 L1 , P+6(%  #6S< #& !&0    /`J.!5$, $   *!1 ("/N 355B7! +( !  .E=*(H!!  !?=    %4 # $G.EF   " " =AT F#0 '0.% 7.,.0   3#)  $) -  *. *64#3+'!$8?' )B 2  "*(        '$&) 9J! #  )    %6! &&+&&  *2G7 /-  ) ;93;$$747@$    /6&$ -0#'* A/:' ! #,3<6*G= 3: /  G&3  , "QPE"9*   )G* *-)     + $(3K1 *   2   4( 85. ), ,%*(  %   " 31 #0H,    *3 ' !#,/  ;\ >7  % 0 !  *! 4 :4 0+7-   ?+ E * 5K9 ) &," # &$!89  ,++ ,1 5-6A7-  (  *!(207L#  7"  :Q/"$)5   ! "/) &(LGB-&%   1!)3"18$ 7*!'  #$=D)" $%&  " " # &TA' 8! )( ! "( +!6- / 7" 67-(!. #! 5+<'& !   ".& #4  " #4/ "' 82   34 $#/( /%$# !  & # &))4 $ "$    %4, * %:7! // *!  7& ,4 5+ L? /+-"%2/ (  00  '1 */ -' $%  *0% $&!'3. . +<KI* *)/?AEA! /$2#     */')>    # .I/  !)@!=IP/.L' $/ ! #,  $ 18 "=0/I"(A58' 09)      (4+3%"$ ;. L\ ( 5 8 5'     !)( 8<  %11< ,+(#=+!   #"2$  &  '/   " ' '&) #A"=# ." !) "<:! (   6*  % )/11(4+-J 0!' *  " 3/  !8 6 "    )9+ 90       3  )F5&!    #"     $&  &*  & $ #  60) "  ,% ! -5 ," $ H""  !( 3$04 #%#"A #97 'BbS) 0$&  *+38  ,$0+)%A?),634 $<$.  % A1!?I #!1- ./ ,2)(  &  -#1  (, !! *(C&&  *29 "$ '- $)!!E )12" ##- ,$  3+""      #F5  ),  !,99  00"+ 85!(D#%G" ' '0'< "   !# *!#  + )1' 5FA!5 4) # 9$ .8 6 2>?F$, !#&%0;%-+  )("!)  +&!". $ $#   84087 !(:&#:  8[ G %.2C5%#%-  ! 1   '" 1F "(.      &()     4<' 3J<8(  /K6J<!02 1;2    ! #'/( $"C>%9"== 2#&' &/7"; 6-&    & %0&$A:01  (!,$68+G*'#"   .) 91*=@""-0' 2) 0F!/2$&   '" /( !#  0- ,-$!  +DD! 04 &!$$ , B[ #' %(#)," !- %"4C& )2 . / %+!;* +/ $' /9&  /9 "    )#1   #)   ,&   (   9  ,,   :1  $63   >L0   . ,    "%' ")   !" ## ;2! !%"    % ,4"6+  !( &      "+055: && 1 --   !   *-.-     #  /9   #6.,19" +9   "  ,3! 1-3 !/  $"93    "$ "    3-   ;">  ,   - -(*++  .?/   / !   ,%K!L  #" ! '@(     <O=00& ('  61 !   "  -3 "(   &/'    1+: "# '  @%F $+  (     &%.(  !&<:   #  !!  "+/(     *1  + *4'+1+ @!>! )  +'  )119,<=  !'# ,3" '   )  &!, $.&*   +,  #" 9H-   $ *%HB  %  3$$$. L>'/(! +!     )- 25#5G3  /*" +B%  ?L((.#! )    +&$-A: " 4  "   "     ?C8B!       # 0)       (( )('  $;( #20 $  "    -)G )( 15.   &!4        $(!?+ '# $', 46)4> +$"2 $:5#$      &#+0   &MC%5" #)$ '#3" 'HA"%"$  $1"((   70 0+  ! #  )#  #3'     ) 6)   # $ ":) %5%!    *7 (9( -& ++ #"17* '    $! 0'DI&  1   ($     "   # )- !  - $    'A-  *.3-     $>4>) !  -2%:7(  " #     '.       #!    #!  -/& *% '" $)  . 41   .$8(7   "!"!     *((=%  .- &&   0*   ;7  +   +   # "# "$&FD&@>(*/D"   " ")   $ )"(/'    /H  "    .#/!  )  ),  -#0%    ,4 %   %/0)    - &  )  '  1C+!   )(   !2! ,  !  '  !) #  .-$2 +6#78 ''96 36 +,  4O$F    !      #  " % +  %  % /8/   %) -".!  ) 1 1'   "  3+ ##$)  -""  $0 ,  $ #  %/ #/.J .*  #     *"'   #  &."      #4# !   '   +  !1          ""     '  %.#    7C!  &$   %        "  -0%        4 &*C, 3*    (   (" % "      * $  !(    ,4, '*    %!   +# "( $  2$*B0  )  %5)  &  ==  %  * -   &    & "/ "   &'"  &     '#   & %.*" , "   A1  7 ;    "   "  .  $, "  %% 17 &* #+  #  *  )     $$      ' ! !   (       !*          % "1 (5 !$ & %"    #")   +H$   ( &   #%  #8#    "#     %43!$   ,. "           #  *0!    '- ! " 3#   %.! "   &,   " ./'!        #  " >A'            $&              () 5H7!&  %       #,.- &/!  $% ,  4'*     $)  /   :5&#  (    #/$ #(%       !('    )  !  05      "       1(          $&  3# %# &$        #% ')      4' "4()  &$  $%"   ) $,'3 )&   +   ! ,6%%  ).      (      *:2  5 ?  /' '1      5<"  /2  !" $  '&#  #   !   /.   (72 !%       "-11&   %     !        '!  '9+  #+  =< ,#        '$,) 25;"@C5" '/ $     -* %!         /" $1  !    $"        !   !    *)     (&      % &      #   $%( . ,   !  ! (<0    " ! 27* +>+               %+!95".   !((  ),  - 4&   $3(3     !! &)% .A 0     "   4!-   # ! %   * % ) /     #  "     '#  %$    $        +#    ) (        "      2'  "   5,   ! '(    "       !. $ !<# .             ")!  )(     #1    &      &%2#  !   !" %'       '   # '!.$        % *    !      ;;    $! #    /( #   "      ! */  $ !    / @)   ! (#      "&"   %  ,   $             $#       "# 2<,   ) #      %&  3+  &  $    #5/   "#    ')  ;2 &    %           $-+(  #  1*57      )!    )! )*  ,  0/+" )5 %'+ 95!# $+52         ((  "  &/     ) 5<& *& +  &("           47         - '  $.$ *-   % %7'((2* %$  $' !& # * $ $ 2'(/    "%"&(%   .F1'   'C7       #    "3      # # %"    !(    ##    #%  #               3-      "( !  )0   !                 " *!  !  ! !  31   '!%% 4' $+          " $     $                #"#&  !#   %        !" $   !  #   $ -0           ""/   !"'    "  +9 +*          "   #        "     3=%          7=&$# # ( ! &$  ,:-  %!  &5.":7  +F3         2A<         !    ' $      #          !    )$   " ))'/#$ 48  #    " $-       )    &&  " " *! % ! '0'  # !   (-(       #  %      #0          #!      ' (!      1- ',          #   "    %#("%-           '* # %    ''                        %+              %                      !+  !#    '       %      $   %            *       )/!       & *        !       )%                             "!       !   !          #0    %        ",'+6         !/    "  !  $                                "   !   (    )%       '&     +;          -%,! #%            $   !8       (     #+  $%   *#    %(            % 2$   &         (%  %#  (             " $$    #      " !'    -                   +  '  %"    $   "  ,& '!  %                    " !%      !      (" # $     !       &         (#     !        "         % ! &     "&                        %# &     $       !         !     &  $ $#          $%          )-            "*       $     !      %(                "            '#         #  !  $ #                '(    #34 " -       ##       (5$    "   '                     (% !&                         %                "     !       &     "           "           "                                         "#   ++                  %      '$                                 !               !                  %(     "     &"        !                 !  "#                    !        &"                                         *-       *    ) '   (                   $                *                                                 #                                                                               #  #             !    %     #    !         "&  %   #                                           !                              1*                "                    &                                                                                                                                              !                                                                              bzflag-2.4.2+ds1/data/spree2.wav000066400000000000000000012660541200563112200163050ustar00rootroot00000000000000RIFF$lWAVEfmt datalz{nn56 ?@nnCDlmIJ !*+./  67)*ab89TT$%ij  cdTU lm,,IJ  <=RS-.vv[\JK&'EFUVRSbccd11PQ ,-OO)*78VWgg23lmqrllpqstEF]]MN+,,->?BC23MN9:FF pqrspq#$'(01XXvwDE^_GH{|SSVW12>?IJ()pqGG,-01Z[%&TTij]]op12 z{  3 4 BC*+xxTUGGjkfg{|5 6 k k fgef|}  #$JKrsJK]^/0=>\\~~IJefJKDEkk'(?@lm<=klGH""YZvw_`  NOGH23GG?@XY:;mn67VW>?23YZBChiEF~HH1256ww./KLXYSS*+uv12vwbcjkFG12`aKKVW/0<?WXMNKL QQ 78 !eez{PQXYII78IJ'(z{;jk|}67uvmn  78^_]^ rsCDZ[ {| 34::n o   stHI?? GHOPC C @ATUMN (( 1 2   9 : LLNO;<DE()xx?@}~01 NO 23IJ()01./ ,-_`gh12''?@NO_`)*PQ \ ] bc RSEF=>M M   | } Z[BBDE_`!"rs XY|}_`op23DE}~[\XY56XY`a34[\ 01]^abEFLMPQ#$45  b c EFwxdeQR  [\a b   %%yz +,]^~TU<=uvmn\\?@BCST./xypq)*'(//QR&'::rsuvz{Z[`a 0 1 /0kk  q r h i   !"ij^_NOWXz{56ppcd<=NOwxOPjkopWX/0fg9:lm{|^_DElmyzRSABXY kkuu>?PQ KL##rs =>klLM[\TUrr'(ijSTBCef/0 YZqrRScc<=iiVV,-//qr33yzxy_`YZ#$DEhi<<  rr*+ ::8956]^vw"#.."#12ghQR    FGopxx;<wxno01RSKL23zz11Z[nn$%]^%%/0LMabxxOP'(67gh,-OP--9: + + w x < < vw<=XY_`vw    AA56eflmGG9:   \]wxmm QR+,DEgh||AB,-klST66()\] xy()'( /0_`BC]^fg=>45RSEFvwwx$$QRCD ; < wxEFtu  '(   <=opHIEF9:gh FGNOUUvw == ==jk%&EF~yzjkHHpq""no;;h i P Q   ; < uvQRef| | xyC D $%#$**WX%%   ./TTp q '(/0OPff ,-ST jjDEij`accN O   BCBCIJddXYGGEFz{ssFGfg1245wwNOZ[tu|}pqTU   rs ! |}& ' "#]^op\]QR!!5 /SLklCJ/9_h ]Xh[w^7 Nm, !nq .F][Ho;H6 I4KVO ,i'o.uYz* bls*@ _V2r,6HOqD5GA Fw[Wv Xfsl^mhxxMS 8s+!}e{JQ!  `.MgG8\Y5P%rN{LFjMa]olrs i x nOMgPt|R~9JY F #)HV2B.pYR : ERvQQ6ue@<@ oleJ@"q b "M j nJu3C4gRb{J i[Vm:"]%WOY`zqG8=yv{#z *ki0A,M5 b GjCbN V!k2zFy Rf0P k `)t"}AlQLJg-,lw L ? $N0<v-\idu.p ,tjkn0mGjd}fkg$y%7(g?]3KVRiA. Y^ jTDYH9  } A_3mVt-P-D*C# Q~zrJSofy6Ck/]%sJ&<}Fj&|p x e I (  ^ YYx Zk7rSACK*vGJH' F 6):*jEd?]7-HdOlI  v7\gC\[f;qb\B YL6 W ;9F?7> ?y } E5" 9 M|+g684^;)br B>g/ ^W 3D: N2:t ) o 5>{3C;&WZ/ky -^!g  uOU;RHtu3Hs|q \U f s 5dc C Mf'% 'me& = #0( j e <r)>OC~3$ R XxFD+DD1oWBWAuY<>Z1%7k9652 O|FST#Rb+_Sy;]n Ia" f % ] R QK>Ej=9<=YlU*[LRcs!"yJH,!k-qLb k~C?(Uh"pmK";3}kw1#!sK yIzlqN7M p~ , c   fT w;0"f.yg & W b < ? - TT?KXh'PN e  ]Vk9prh yWZ Z"cG5K~? k! O r - v| ? d'wDr KIt S  ;m%}~;q8xi-@ ?v7 A \&F}SL:t M  t 4(1 Coipb"M{n^W$  i d V"p>## Q {B 7" Bp)VQ0j ] 9~!` ~57rIIG+ # u ,06( ..O 0Ym=j  `  Wne2 bp"h$e@j 0 E k 1ja@`n2 hFG@vPaE;z,o7y\/&6` zmy V NvO#X" :\ ' X{t 1uD "Odx} <[oR )  \ 9}GT;d] B r{ dz(EUZ3G"   7W "D #/gMv<(  <o`N 8  O   #Ahjv ]d } i qi5M_XU ~ z'b x E o@Z}&|'*K/ ;z  $VeE){;I-Vo F-d E}q  Z"3 2c0?UK^/ZNvmR>~s?S)b>c)>0T8[g@yU$ez4oa60HW@ :ICj$`)yK:C]4 K$~[XI.x+54?|xoX)! Y m } T@5hA  1JK B&$=TD X U  Yd=x,mASPt+ZG5[IQ%Wtk~^ ri\X3^zvDb'/y`*u :t\M}J'Z7`Y &.``N_ l  lcaj:k`kc"?D6" Jz|G3 D'#Pz>MQAH:_ (XeRz"s@CApB/^]w9eK>l ;k;SfJ"k"Z^AH4q*B5%*]|d[C_T//LF  q?1`JBbB+>(~[@Ez=~Tw tnvb2 5x 5 j I  ;Bm(|23W#f 6m0gi/8)GX4WYBR g 2M@<h9M#d 2yO8Be@X,%26gM = Q eL 1yqRcRFc${i; , { #  N ~ p 6 F(Z7&k2n{ ) ( x B/fT5^7KL !\9M.6/qaL N,I>}8| W dW c , ; W 7\ |_%tmy?  U$t8 C -i5 s}0a|\ % n B 1 ^^s/@b971[(K  ;u tr%|eokcZW 36s1 ) X n  6Es*;q|  U   ` 0 YT5{>+_ Mr0 \?U_  ` P h+n6;k i#R$cA8V] 'D   sUO84?\( B 9a18?  ]4;GGA]( m  1   Y  &B]t^~'H.d4d5Wi@0Vvdu}yC^e5+&1]xjC{-$H!y< n & g Y `@X$.vST(#:Q{gei|Uf7=jx<J Bx-9}$X  5[  , DzGKh.$.5; ) LNW$I .  s U'n  H'Jiy1&v=w :9; L)D@`sC7  s | O: #ovNaO  t^^c0 hCkTsF&C<q5ps<5,||ILWpI[ C+M_t[h="*0iD[ qXz2F_A!cO ]9l1wN`2F=k"mL.8pH6aiK^3M u #QP  t!1`j;:~@+F o    [ i)/;s%LjwK#*_ l( F@PMi*~K oD;  G  ^(DvCZG %wo!G~sb/i7H R* a |  Yd e&& e[qY"s_@ a M^O6k4H! 0  0 Rv1B|gRCv,U.FzJKarS+.Ho5$eUFJ4qqu)(uu5c:'[=2y=|29ztHaX#GN*  h5 9YZIxmJP@Lbr a g=]r+,`?a Dark!` }  4 j Q /6 1J`l\2}A?Z,uX + o e )  u,=pxb7Mf  l6 V?`:FIu6`EmZ3NhbGCJGH xac7] a%tHq{X0xts _<vN-0z_:/<y ^ Pmi + ?vQsxc 2.s$f` /&_"f*R-,D@|.L1SBU//!b=MT+9z! DTzAF l f X ~  * V~N+"}$ 3 ).o^yUgYChixQ K \ Ry>T38=0uV iq;U{wV/ur >ZGEN |$T$Mw{TAE0r?plLbu UL Bf3m&.Eb-@u?^|v1VLnU.C /5  > _ q;6~wR#PyN| 6 KKdO0  ^.@)@gx5wev4\ I s  'gEa' 'i r ?S~G w N9=9;'M3H%Y! yK  [  q Tgo I1 mj\/3m2g~G N 6TM kRm?6XG%"!&V&&&m#w#^H}&(\#`PR1:; 7 ~  vF9]-6Ro|`m$9]34>NK CIf>)U$DjwI,9hn#Y}QRNV+UNkUbVkSE]S2b # ( C ' { '1C38M8Qx E l }bt2vidyO  T  e 1BYZ@.dc"w5k*@fEX  9 u y^ R'f `*{~^st1e3c8[(z oi@(^90!^mv"0a=%    Zx G @ :Nu;5}RlL$ ke=n~ 3v1) !g Nf_ [  vE*9D(X:Bbx@'JaqgY3oM3 %z]Du0[ql* 2fBx'r  ^ " w+{- m~fuk- 'M gv ? r!RpTv Rl   _Z(]cp7*1/a~ >hWO(ih@yR2' Yy$L'Tf?KhgS  eB  A&cO; [#I  ekhfVil\^EN\?V)Qg 7Qp ;Ma D WTx0u`n ~'isuQn   &Q  /( tN !F{04$ ~ ~ ?y$  : @pk^RC<&& O X O j FU,1 k< Lp:z~? = v N [   VcQo_1$\)U}v/@T$(A{ $&9Jh]^zX"VfYU-r= b . & bul1_C  ['R[O GVE,C@kzpcZ   `e`^Y bWK9$|RP&1" ~T_iQ YxSPW ,(Nd,\o9XIoDNKx?t"S-wLK):P#99k >% nxx)4I-ibGf/T @>|Xw'xM`Z*i]hKN Peq1}U ^(  E  z\.e9@ k E+Py2^Gvr-)"w 9(v %("@SU}^vV5]TJl ~ O9) p hQAo]5' @e'2a $ Y dz  ? y T Yb C z:}A[}qj6 )97Bp=M ?>ql r %. i C8 [ #0%AQt#^f  .%P] PJ PR lcvl;)s $gs ^nlXv\#`7J B j qE"vc5=  , M 5    %  m P`ID"{+:7>~  R{YRU5>c`H?byG  o j * d ({&Py1DFHVQ> D ^faR,U$#߀݊߻%$_XriL}~ . V|% [:1ss2g;{Z  E7:)L<4IM#z k"4M$UO  z{   zB2 @-~(XOcG  P{iC3ry{ei( o9 D Y qQyz|Is#8O{ ~ x  C 8  L_|_8Oz - c j!h'LC r  nW^|+y4JHLUhvgEJRkq9 _ [ ! u6\gj  ;OD{V E'A)'Ank<i o gjDP$8~;q/[)rVnn K@` S Pe1<  A WkUsjj>~Zg U { Rjg e]m*'.J>rKyGD%IX J *U) w6E'6U\ 0l ynv\t/ &&.4^>l UaeUoj; ^ afb.6v  IbCDMGo .U=g-*6)M\  r[k j rNeLf^P5 :Vx x i" ZNPP}}^SFZ68v> %  # b w c8]w\a#/ z ;oq Zu*$luXhx; Q}V G01oWhw:!n K ?w0 1 ZeV6$,Qh DC3)_[& ,dnv\p  ~ ec)[nm5<G9TlaQ # g_EWe&I|Gd59  Qp` K LoS$`< 9H QX ~ 5Y=kCt|<8I* A {%uc H S#WP 5s&P V$r3<@W[;+ B E#1$ *9{4JnZ<  &^ 0 | [~ ,}@%b#LP!$tCc+:n#o y f OpCc(K=YW $w=x}ANp>bGހ+Pn "Z8e ax_xV:>;=%X2W  > S #&H%J   G / c \6!H<K/aO  &STY ? N)I.J~xa [  >t:*n@7:dmqcx: wQS 15  i y/CoO*Ju3 T!')*),'(#mW' |أ-A#7ItT!$z+3./B24./&`' D {R^ο7́g`VjabO!$*,/0..g('F~ ]I68\+ U3]"="%" o lSY3ي*\|uޥ+z v7kN&z  ;qKz= E  wDSF89.ID3 ?b2 ]Kr k *U B I`auGvmJ I;i+ ` wz S   IzB#V!sZls , Wk}x0 /T8>O6[_73E%Q^Kdq7\s 'J}O}'M &9H&$N:A 5W9^" $_#G% "i-;5EK( uFi ^ ]Y~xl#`agc$v   6 q Ysy@ak T D2S ?3?}  [cNK{\31  5 e O' POsL4 ubF )" j  r Xe ^`&)[l=r>C%pnzq`LJgw=i_W %T incN M#4< *Z % <  J ]l%M$@5*3,M>5f25EI0 B t+a vA ^ O C=N: stw'LMA,fF  $  $ WJ5S43?uSRb KQ x ! Ju>W8#t#95AOw%i| P{82.-  _Qh1. \i+#qk7[ez;!!! gW\n>P|ߢ߿?(LeT'z\d###`$:%!"e 6)!z'; E A'@/! _ Uit|1݊&]i T _l_$+I / '*rSl=W4RTl_ vO=gH( I0 3pK/&s g Z q lJfo$b:>_ or`l R ;>H ~ A ~ + E " 3n-%B8S{~ m t,B l ! P%6K?{xa8  G F q Bu>q|"/yV  {H_Fq-] z#_Ub%W#c8  N!''(B)$%12p+}ߕߩX]Ը1Ӯث<]% _!#[(d**,(*!["% /y(߫ nfR%_ WNR #""#X>5oܨ=Pnzݔݽ /~ u+Ea#'0 - Vbj P ^m P7#m%deQ5!:\2P tO8u  Yo"n +v8W6SV dY @ p!t |[kI L2\uq= :Xb* E c h: G,9KZP]߁݉޴>{pc~2  t F  I d xNg p -  r?j / L { R #f0C#[@*{V\qmu9Pi@-5%Ev$V8 pV`|H w EzX`7w~RIU d= })h&o0..4m344L01D({*94 JFphNuu\S~1$ /w&@kG cJAڝ܂եWnӹbcL6*pfKf\ a =1 /$  z   oor @o> ` 71x : 5| rL3gb-M'i-O9 {8 3O H < F X  G;@g=/j D_>wq !!%0&&'$% A  $=w)h19eZ+}0tg1?{B  q K #\ WOd`;? h_LD;  |==,  % ZG|u -@. 5xZ B c t r "S*9e)oU;<-iS'ZIa !!"!f K ;qRh-(yl"`$s&$&! #|xNqG}w69vmh9)c$rYm,T41 smkRY=.{ @ E'H'435=R>@A=f>44&J&3>Z HKԯ~ 5!(")7*++&4&$= Hݞ O.Ť T@ԞL$~  TsCl b  ck4*%+ 9 ??;C/ U4WAEX 9,/ a.[=ClIqތS^ ݆B8j#Q`G Y;#loKbg()*92I266A6F67181'' G ?{* Rז݌h)cc1 (P`8YGXeŕWUЮ{Ԃ"{ ^?S = 9r*^m>+c sCGz O{ A#(*n,.,\-&&6$ +]8w{AT#/ 2% ~ ZqmE ::x$Q db$2k#gX my5g1p7H  r<D( 4 IS PVf+^=ur\CEgm|0 EF@~7t\   ]xLKOv. ?Ko:QyM)( H9 bS'GdB=pM*y3RKp-[+&`pJHa   i ! #K  ' F / ^nJ{qVqDzK S   wY ; A`>w9#2p^!4Z74 .MtobrW 9 cD'  |h Udr {[Pyx IsBmSlkz >^Es}SJ3n}mxI   {k  ! [m 'kd+;fT  =0ik AVuf= ,~!{szo 7 +AS3  '9eHlU\F7 %Eq@' !NA i c  ` ?K<R$03>+k]  Zl'WkyM5iU [;#gyzV":qTEm9 izD?bDA @: F( ]"Y! nu_O| oV9?T zK;Bw-  T X  5fra$ 6 >l$Gt -9 sd(,AS&7eO zi: _!T7p.{N"Sx]rf6]eY-F   ] , 2 p 3  aYu a y= "8nj>al [ >v25}&} j~ $7QwV?m%G|cOWB !cS M0Cp OS /Ygsxk Gc  # pE/g-*j]WgR (&\S|2n[Pbvy- >/ A oeQ~t  }C**; $n0 =7"S1XF -z Q$7T a@46 rO;G>Ri' M 0S&9B9\0WrYd "EN ] }>SM/N5j7p{{gROQkF :]P@`K  W *l +/ naRY3aFVe9R)'f1015546/2v&). 6}~ ܾfۯUb7FmIj B*ݍ 2eҌSaV=ۖM0 M U@v D!fsqr .a$TBAaR/l|  , D q]z~cJ|QKSLM3iM43',y z =|;j#  ye*x}Z  K ]&IL( :kzc*A r  l#rdUB.ly"_gQWuY :   _ f6!2cQVrn'*EX S ^":2)b,yrF :k1zH&88Qsqlzz-Drl}uy HJ`XAr |. g 0`\A:d?w2"3z/N}>-z> [ 58 x ! =K%Yp]TxM5   = 6 ZDO+DDr-zexUnw@JXw {<*cUn&T4}352?6TrtpU% "=+%Pt3(ICb:?x\ J k 4N[g g L - % 6m wUr>A]<([@Dk(lJ Qy]#9RzY@6 q^juU+%`BHrF0I>I.:vf#' A}Lf^T"4Z;]Ll9MR;PvC'Uq`C )OFG01jVh!|i~D-B^/O\S9Vp(l/rE9L4A#pykKxp3*9-Kz6\CCAx:#[QnQnaWibhGvR . q  X{]Q !*S2z|QVz\9 &+U{2A"(dbqGL6~|zP?!bu,xZ6>7}rO6OpVa4+3$=xOtR$]\ ;f~?tiR;-p=Fu; ]$ #0T[A+0d!a']>`g ) ;  : t0:'R.  y Po4NhhDd]o}z,_CT tLQ&@xKUi R7Ot/frmFO6R(K~;@5-Hq!"EHb6)#EZgm( Q2c+ 374w9 l^aPH o#pr`V5I8yM}LG~^EO9vJuWU'ZG ?&lLFK6Wt~zLRuGpbD 1fZaC~y Uvx3g -#Jme(x-G&&W2l   $ & ]  \6Q~z37 Z <  V t XFXc*7(Rx] kVlK>d?=Nzo"l+7c#<[D~ Oi/ZOw|hRzdnVMx5u$WyN'&KaIZh$  .  Z '^BCsW}(oKBrz; = ++ZD!:@1V@#Op:n@@:XFKGW @G}U;DK>b3Sqr z!IY:dJ eMNxK Y^1Cw'Gz3L}HB:XPGX~ X{rwe$wB dLPO?Y+2 m[u}\/` uH1 w$,W6vPFFSYHQ! @H5 (UbYKwEP.C!vQvmZ*Y SAo+$gK)^/w$5E P  V13&@ZC@': Q?MJnsAt`j\|Rf^ 0>u .sSMl Nu(7,%-'^3r7zvb7]y!aqZ6rJFrAJ \ ]1[Sp^p"{r-fB'n{q#f}\W~?)Gizlf6Du{ I8RW*~:1 l8HiRE\;?0C$s:q&Nz15U|O H|Pj4efi%hs /l]4:m(XzjF< a&W[^['BV{hQ]ElET ".e8?3zNa_~!B4tmKX2>! ]q%2@/[50qv{#wCQH'qy@ `f S_ ^  gMJ   j 5 KEkOE&{Ma| >j 78c a &uga2_0&!2Beg#uG>v]pF:z>j` NBc@iB8}X9J_~yDg9@169 DHk  $W % f|0tLz{*iYK} g  C j]RMbxNZCWx~D:QdqpC{`mX5%/  [5C+{+T[=}8d @HyXJhpT5ws2b(;!IH7`a2eq M 4d6Y"Jn}>%@Y B&x!I#v4R_"+=l}]PAj=}1V| H.{iV[E{+m kS>|XH%>%&!m?VPtD75*bKO^T8]`6vK2n8{f3^f]f x  b }CO+;yG+ v;H d wON1tqN}2 s  Lq?B~/&r3 o o E TlTVchra 6bpy:kyoLx".cj<MzQ/v8/&A(O)oc = i9X7?R7eU ] >a^)Z{+. H>q?#PVqGCN;(U~IOX8q^QDLI:c-pZc3v]xa~UZdN)i[g]q`cH(O]<@`([{e$rPr*^|\;7r1I|BHLB0yrP*\- ACO     GaE9rC/|?,u l7W!O?JxH`"sV!HZ|JfD7WBZ[4J.?8}RI`oP0Cu#-?{oI4l?#g $[V4EOVC=9{r Z L1=0=G#hc   ! !!]AOXCi=[N;q!<ZC#*3n;9vB-Gl }7o'Vi%dN \ R -3C]ccB1.3Y.H"b8|XPx o(K 0 NmM&"#B"rXOUI,i ~WK"[ ~@K-_8S~G?r\ypI=O@Q)1[ i cR  z*3TvP8n1QrW;b40ja DT ' } = n2 QP%OPguh@  +z t*jaZ: Hwan|q  ]&W06>wjj`Byc'|zes2g0pr^[ ylFm{hpIsbH=b iM(y>2o GL6g`=;Grt@m-<OIb5)3; HV/SW`   ~ -<('X!UvgKWNm1 < 3  GZ  >4XWEXR%c = 2 f( N@sTr7sJ:7z*vh~ reP$i{]14n_=Kk=pTE6) aw^0h: ZFFP8~h~"#G'{Ax>$XbJ(C8/f< /#P\ 8 y C (#WveYi{]^o UCdm:R_YV'Q4o hZ2 i9~EbJ|:=RMv[RAI ^ &F( 4A/ W  r$19M,{T`@7r;: r --Iy +c#&}"qndMK  C$W|3  "n>?d0nbW L!&e/7_-x"2 < t-kiJ_K N&B HSHk? p;)s7C`?T0,((=Y&qh ^b*  {: fQ 2 acod\]`p.Vt y T p `.  >R&n<6c"5/(  1 R6jqO w 4  5`XQ_bI s4T!JdyKTy*8t d RPZGZ%qZ23k[s ^3KAC]g,t3j5 _5P/:_FSvO"#|)aj W#OU<]P+VUls2S}&bH!q"AY6 r-|id?aY4GS%k H+oDws8nyBR5hMZvWo^RTsGWl)^/e )mK~4H-d$q"L_ [ ,7bS::AEy^:G8'TA r,^IHJ7)x/TpiF8([*Kk$-3R9sri* _})\ }GbQ+Hs5a80ae$ 9l*'c"vDJFW|=hAk  bQ ? g)&9 oH( 3p\|N_*>P!M~9QG|G.%Jny$X) 4^7;<8BQbSrgCVhT)vm%6l_VGs BjJ$3P?_| ZABJl^x{m)nxHt p0tf!s01(C:~ I vGf{M|r8hM+~5bsS ]xG`P%sL9f58$KIMfU33h-7w6 fd#uwQF"3 J4.Va  lI9mca 5|^t];h$Ue /e"O (VIU#v@%s0/&)$f):c?twpG[Oh7v} ]SZI0y@j_t!,$x}H1oe0F!Mw % /T6M(qO N&Oh C [v6'>]q3Ypmd9mao<&uI2>~KBj{ Dj\& 0}4`vVchY`VTtMUC<5:B7>$n o# ] ?  ]jKSZ>fsm Ac_{i9fZl11*OhzzK* K7REI:ViF/(0.b-M:Z(T 0!)UJ?D<jH_u8}cCw<<2W4@LqOc(g|]oTsX9GWe %<ET9k +ry]kg/B`hv\25-'l:  P|alF#E [g(h-} 6@   KM\s/5-.kcJI!aw)UC"*+oZ#/oM}~h+!U.;<k;h'iV3sb! S0ZI|orN+.$q-]tD^0d GC i # h  *t|Ur1.Q`u J g .  7 u]8%Zg_ *u$ ~ # 0 N t #LEp%G o { p  NfyrbBgj@   N + ^ - ] 3p }"0&/s+Og3N E{ )+Q"jqH=} VE34H 8SU,XFT>CNaU+cT6vXjdndEvx"XT?{y_<g  _Rz.c,'9P9g^    \RSXO&|ViMnf  WI T FI&f`{Qk(rsz1 }} q&h+D`=0 %'*(4 }_V5u q ( h:)So/V"JC+t ,Fut},* JI 5g@}K.zJ   ? wNY7H[_&1i*98   E_&kY2CJ{M*Zv(;i?,B#7n\jRKz~&f^pd7jFS,yTQNgYcvv" #T L p ,F DUzyy d . >  t}{9KouXCs|[{T35rV)785wO-)<;:GVx ROw Z }  {rQ-XqpoWNu[\e>E;$(dAGNY#)S BM2f:VM7.SVhgmr d>w8b1fBse@@q|TSg'k;N}{[kRZ`ad#zLA v X m $  S  Zb Ql  " jD6S|gH3w<Z<9H   m ( r9[R2|N ~ <#l<  ! *7F2#3dzK88#k{v+^ AioTxxs_K3w_V=TB;f-n ;|  9J 8  l ExzQwRr@YI M \_K7}K 2jV%f7ugF=bz]a1#V3""& g s  J<z,Iu Y; 'ttm $Ek T[o* Xwl{0 sw z5t: "v ]OM   1 `  KIt8S{>?<~e( sY|9I_;05dq"~}|W`w5PW;oHcZ\J<hA]\R$8 (_8/Nq) Nb@5)ccP`! ' =Y R  hTCUtY_'3m%D - _i6S   bQDYhfj t e > s % >  wD9UNRYqoL{UdR@ K  | d w Z+K$>x{O[S  0 s = ?;EsU3*B>,";`d- {9Y>* . Z xs*Qf }. k `s( 3w=^H}C<|!r,Q 6  X " o V> `{FXW l&hLRu    Wa^1U43y h P oz   S.ic;rP7 6;cl`{+`oO S:D A! pO h Y ; %! u kc|  o F q.2zf~Y!K,lHZG x  ` _ n7 , YLtYW<- b`'Y !] g .jM /Uqe?.f <!:Y yu~@&wAW[pc<'OlALoy^14J6<&~ _* @rF W l!F<r  J U M > e 3 G<P]ezk65Ic"Q9u]\0W\[ w u  @59uN4Rg6]~<`{g0@;kK'Sgs2W ?b  {   6I;.iljZ-&  R S v s  + M5< (uT"Fn]D@D7 u|/%o&a!eA4bg(e(G*e^d <is  K7 E=GAx f 0 6 A-]1m6/D 3wzG2.QW3qnJo\TGms>f%f1   ; 3 * B ;:W HB/~B 83- Pto f6WH|hhMa=wc  s W6 f(z.}H%aA+]&= Z   3j 1 kZmsuG| a` SrI <H]N~}.H FGp/ \2yZlN-W9J@Pt m K  > nLm] n  :]k& 1 qk_ B&5Tz?4Oo)+"e 3^U;l.#l;E5 Lk4 W 7 dI: Qk[8"8) Dc_Bk [  W0EwmWd)br(:`Z>[/zz]OPj2ayI2TQ2#j/2 > # >6Su > cmB<T U s '  O D GI2&^$ O>!80 9  @  ? CHYbvdm  # i'? e<!?1l'=`t=+;?y&z , gK -  !\ ('g- <+tb$: V ^  U <YaLmJ<h|   1D2\nq?mNs*V ~i   S "i,%_8*q<"NdN H   un2Z0P&$8Euc$mn(euE7$/- N`Nn)oU6f  (/ m]o7?/<f u F,^g7s 'd!-VhHij%A@ k _ c 6  - 5jkI\E'H[UXG  \6^Ud0K<* F*^bA p =L  zD2& . }=F)03%#n1.ufD:U :w=ttnP_' 4Qk(~@ ;Qa'V& |87jr>[neKN^JRT+N1fdpHNx 8'HtBmKhIp|ch0GiQJ;&q%lg/_]]#p?P~l^29 $ _5 " =y;'gn WV _  ,S  U~NK@l0iW{' ZXx@ -{1sJl zr @n~F u 8 W  Kiphb UT\s;[#riTe&% ;@'"0E\j$pQ3m!^Ug @KGD0mMy=;W K6 f ^ }Y   e{`', pl9ME  GS Tv KKub q= xa,M b9 )q^XSWAfUa#'cfC,?>o hF F#_jVI2M d {Vj_3: T 8~6KYaY(9d$lM]&M5.I"2zDyGL)  (4#K=b O F TDq-E&N0Q & A   f J-*%5##n M~!LHT#I?fUVE1rJ"W$8R[N`L& ;B 7 i     . p s )C:[fV A+$ABE fY{^#Gwx1oG8U   ?-X8 >{6yE   B42/4w0 [0gvzZPsKcx8!C/ ~43@ S0 e* # ~ gQO<+v O ~ Z B} Np%u5O7`[h{&QBT   _ 3  ctVtP/3@{z=?Rn(`= e0~m`F U\^k8pJ&U>O%AJvt[6O*&{QP^-PjS{%g1vkb"Z9  p0{i-NN@ =*u=E\KDr>AT X { V   'Q YuDp ,)R~~Y EF{`W {Ws}>@ ^|GHa5@b u3qc e  7Ow6)0x|[LR=|! '$*puP^.Ip,\ I rdHLeg+2r/2]E]}s  l  X T 3v2z.eC;L% - ( T|e^g< d. : F  ! Q  e XRzf18o q}%$=/?&cc]]Fe^IgR& ]  M [ /2   G / #`j!lVpN5S6chSko}(CEf):ASAR&3!5E`z   k  wiS)3-bdJ   y  6DpR|8":"r+ 1XODZ dq{vH  oVPH , N!kI>h  C| <X h +<0T _z,0/B6NT\q`Bqtzqog(>.l?(}g / kA>[. ? BrhHTCJL P%$?'$$ 3 A ^u p)6Z@d3Ny  @ 4\ +XQUd cP/pnOQe%20>;9:i ^ZT  +Hn/W$h " :Mo{' qCaGA)GyY?|>]@8E ,Q[.DQ8uZl_F<'W3 | ^>{ 2g  ; "FBCGG<! ) {' p u-q?qz-\b2C}DK2 \b Z  &$ 9quLm0m& *dF  Pr zU>~i A w k OoE=W,`gPl7lBzlM  KR4W- C Q"6g(Tx GCko < 7N   ew;CV~C29=m-'P3 l r  C`D,C 1 .^ph/&   T,tHUru1##Ewu(uAela G< B u   , K `x}}6f3%O  e G z % S [ (HpnV57 AQRxn!V 'heQ[.Pyr5IqBor1^ii} M ^ /3k 9 ?a `^TwQpED}"_= ' B~p|if*Q<.pM 8lWoD,7 n c   l ^ Y jS*8xHq  r M *  G#e a26os(k>=HY&N l2&uJTMH7|N/fh}!E xb sd g c<@ n ? [i$rLvH4.W'y3N}#yo3;u'|2a%tKk < 0 0  ?y t `ntcIN$t ' E  [ aMXWlfR+8)=H4z3UAvD6ZJ{?0NvL  t Y /  ZFuko7awISw ?cyT |! OUB>`F#zbuBK[[ @tA|hZc/ 1 k^ _ `q1t xn '#{2yvZi~ & )r D sf P,aq/YM/}2%#h,k|~Qn v ^ wjp4(E&  KM^I2  NRv^wb4&z H |  H P  e] 9J}mFo W WM >o I 75Ch%cS  "^;a]Z g ,J=%!mZT2R`PKEp/1)g-I?5ILxw!Ie '  ~ , qj& Ai-]q CL `lA  $*   K  \QiG*o& p;bo?}%{4'f}4G 4HNY] I o i h  p  <P 5|gn/o>VQ,rn1  J  B KaFx+:b;>,*~ nH/uAodkHIMlT> }  ~vP  m (W0h)]Lm7U5  Y&se_ c df;O]Mt!7_ 5 R e X~3be,rHE j| %  0  ] ~ @`TN+2kqZ5U m/16D=l|vy1lc[ub'sVZ J^E {#'  ;}MtBcVQ  C j6U{* E "&~vF!!/L g*Ga`<\KjsTT?Au9yE Z-*/ b ; 0  4 m : B ' k \{8n (s=} \ ~%0{PVxv W0X|=3$9N"Tm /m*n5 ~ Pzwg G t 9 Dn L  6 9h e6 9&FF = q \ -$  m k=._a:"M?TOwJ,w:n)t&5hc?~D ,o  b > m ^ O  * w_tVr)Gt7RK v '  Y?pxRtf`sqN)V;`m%)Pr< .=_ $r0%] (RdPf;C#bTIzG4>fL\G\A[ BkM6m2Q""\-!>+,e7dFgvkUE$fo^c41|oZ{}6aKv9.rbN"6fa'hBn#k<&6k '( U MX _ B  NP>/ /$N ] rL]|L^Ze 7H?sLt 0y{kizvNB6)UAAj]miRGyCl%@AD>mCt-:5Yszcm@HtYm? > P@ t4 W z= $r$Oo3|OFY.ZjKn,(.p`y(G#*lE;b::_x$]i=1ky8 ;|mI0~YOg/%O;IhBp>6fXDYOJ>AUtGA$w#QBWtusn#En5vzp:F'xQ X,9/=EsdX"[g+0wyi[$}H$mz~e(JbYR5&`NF{ L+V$0h~J{$t>  pO;8>Gs]IqP'5*J0 OllL2$<#0D@I0rHPdk/f \  c zY7" !z8K~ WEj|@A8RN&WLe-Q)DT0 A>duuS'?O W)CCR0`t9>9WY.}/Rn*08!#7j[jE]#.)=oh :@~?8/ V@RO?jk^Nk SU6%h"k) &Bu^6jeM~KK= *>Qg0!8xQ04, (W!a:^8^>h3k,)ZPgfg<1#KB0v_\*mZ25M` _.YcePdJ! $ 0 ) ["wvsK$(YK\-K|1MB5=6y&5+mM)u, ] 5C/87%{Ons\vDS.8bdo %8 v!Mo#PtfP#5FSIim UP^  x'(@v} I"H5n#Rro`kj) !Qj(N`YSR^40{mHlhJ^SlVE`8qtlG14x6<^uKZg=63!] %GPduh?RZjS<sx*;nNb{2iCOEF7 B6uH=3*[yFg(/IH=\dRelWQ  -fW^(T0)Ii`qNA'wJ]pzQvP0viBg.~nh;EPo{lvxvq86 %ZPA+g.ey&MT^T= m88KMWo_J   y1E'+ 3m+%yWoFil=5.bq1GYtMuUc.Bu0 vI!^)oev+Xbh2%*X)nM7~4`f-2iZh Oe%PZOhs?}w[h>)[B^M2HbgCQo|gj#q^cKOw lBEvRf%.`* \nJa,'!p?5q$ >c\[5@B@"@/B"Mos SD(\"rkuET4t/HV8>DhS Oy}+ IEeO``5;C!ya Z(ZroJU|r0Aoy\8WJHR7`c 'ed\!71%7<NB_43C K&,f[L!2QVCe&"~IT FzBg>{ ,P9 b7E%-)/z;u4-Oi46o.$GCTYbKZn:4Fil{>a_>: G&/6 ?>_9SpN{&'+jHc@\#ZSBg`tC'U{~4&t/#TAj%o*!F\CWC 4 {V'-54)hi/ ( ;Bx]3 =xAvJzO)Kk?gO2qh'v$mOX+!Ji} yA 7_2F|f\Ol evahw1[-p7==f`SS:PXv_tY('%s.`?)[uOR@)7 rpLLvoH?7cwp 04ncV\.JZ#,yql0)OwGjcR8o".;~rf4~ 'nU6S(WjF x`TO%"v1MXSVs+ AB8~vD_N[]UT!N?-P/<w,me .kXPe7L[3BtWrxq%z!kKiB>Z'm@6ad]: p\8/m0?+v&=o`Nm5>'&YBJ$uL- h/4] ad#tKUE y`N HzJJ'B ;POt/Y3\XjPNVs~=seuLOL_HJeaV_N4/{iC;=w|+rn+nEl{X:r xm%jYB0)nIBh\;Bz-\\LU|[=+ e-?'*qlcxFe#:jXFMdnV(/JaL\7;aQ4B  d'I[0 b|F`Ydb *lr.Yt@F]hW5(-I,P c-t@p.Ux#Y | DyRiN%ySOMHbeD   )8E8/"(@COjbY/]WoU](Q  p=t;R>z?Di]=&Z2[-cx*xGJ|O\@qF~][EP^%|p47,t3guk;A]&QmXAd-X#u!ZoN~l- Hzy}_w<MQW `-dHj""\ IoR 8- c { .A0&Aiulz8DaG6%\^Z%GS?2 .4jjE c([=}W=TU\NWuUQ1i9tq;Cz[:?  s\'Y86+APP br =_S W%\/5edY[\L>` :8v|nP\F~%"daf <s1m`G;@&B}cZ+D"4!^MQ}+qZg9~pTb(y%<(N&]oC_fFfpMd@y748/M k@{@qCpd4cs  #9Ca"|8|O):4on{a_mgQ&76b\og(]~/ M* .a)E4fjPKTs<LcI_wQ0C C)iaWA58EK 6|E+;.m N2)6#f7_p#4B(R(zHFH+jCSBAP6X ~B8%#q_/K;3WI;x*E-zu%y/Y;anx7 DO{Hc4GI#/flVIQ4:JIQ,pZGTkRD37. !cn}PS2uy  F  ;!_u*B'(_O_]u44IBgz  ffI1p{7CQchKW, WH@[rR6`~ls\{NI2?5a@kMnS{q ge%L&7EiHj}9-XcE3:2hTU2"uJDsf -9UeIU\uUD= u( l6 pHyqFlumSA Rm'gFJdpyt;PIk& L!xP~uY:!?Xu?(Wy_u \H2/C>y^xbg$T \d'xL+n+=O7f@7 N2kMF/1xy6\fPg%} w9 ^v0Q&s(TpdUDY'1X!HXNpc`.DMa(2 lpgczd>"6X~\O (6 R+0k3X5(GzO91OC :, X lC OV{T=4RW(rgb )|$?pVj{^vf omk-Q(Us&MID%5Z)O: bzFI'P0PkT*f$jA>KjNyA(~)-MiHTARns=1X"vA}({UWT] dpte%Er[G}SjG 7wIaEF< a VRutX O!tp72: .s!2[bmzQ03  YFN B Ad!G.3'd;Sz!>-1m+ @a(kv.;G38cwZ!~,jI|ClW aa2AOtc^]8.E\/:H@VqbBc'^pp 8:-V(cA k2(4(8B4AE7( n8Vv {QJf7B+94 <]sAqAR(JA(:L7SDCN Aa`@b51xv[X5K)k`-n:-qM=mKOf h'*`(KY\qDU(ns  O Yv5RY{<  R /  H]*"2X4? y  K  BSfVGp5PKcmyn>aU 3 ?j{DO?+9#+*lO4.#^5oIu@[{)h_!G[ aM_ gL  "&3hS"oB 42" ` Ka  qGE/Z)S z(q ^ 9 6L+pp7~+9Xz73UqgZ."-l+Zhs/b5|W|$ >@3mLEP\_;L& ,hmQilq~ N) V;.@q G]nU[i 29l p;{17HR&B:#DwXNZ G@ 9) +K k4@lV8'rVj{o M pZquQ%`5b$yrEsd5Pb,0s)W!b#'dH;>`E lk9c~q -jNb{jV;P4_L|,g%G"6Ew^Q4oKT>&Yn.5r6Gl\=X\D!wgjS { dh'jY3jtG+!n28tS O 0m!JdRK|l1`A;,2)!pHD`(lZYK#ALvFO nvi\c& shC/t8Om*o 3\4t-SGYm}v%tZaeYtb9O]Fu_8'*p*&:Z][Zz<)+u>R-3W|_R.`1;aTSD<.M,Da;pl}%^S" C,,(A Mm?Q$/(LiGn-)?z{?Qt)*k[.eI4<yiQ?!oQ)~#cBDk`7u52LEh55nF7"".\ .@ 8.  pdD}Bod5,u~#]"7 }  x <I j<+ /iZ} y 8\  g(vKo3O -uOmFr ]t^GzRDXOshA8y8]DLro[CYg4r !L+saJY;JL`$lQ~ y @ )UQgXz_P4MS"Tv6*I*4H_M~{dJ%(+OimK4]30Sn}:FQn]u :|l??,b~f>F?~{ "\Zc}-[+#i( W. zM+"m+!WQ qN#?kNm[>NE:S(5idv?Qu&bASC=|hNxh$:)Eo#PdOx3-nzj/D|F.,*bGaO!`Dh{30z4&YO I?L+ \L|,mD*G c)"y25G>QRA#rQs nODaB3:e45kZXKrZLm0 d uO Og Ws'P6s)=k$fXiwTalLZ!AeRO&~EwZhIgcs=#if FC>lL48$0Fw5Kg;-LS;;) Em:]!o r@Pu23. /@u`?+fft|kf> X/$'d[Vg9 m: ^hVcm]cgLFN5<'o]L NT )RrJbgh;]$Qwsk@dR ;_hrc4b^|D0 pwhzX_[HJ bYgJ^A` : K 8}oVTq+Q 7oj2:lPr' .AE5@a;427V_"/EElN`7$l.{uttCk{R$K}1X;`:eG!Z59_- <G^NI8(|l:wlkY4-  [ T .8 Aix>rfxa.;uC,H9A4{2TWhWtDNs2*l^'Yj_n0r*H^*Uy^5%.p+.iPjr{pO,Rub_+mP6 S?VS| X9^,(cCT"?RXg CJ N %3 : l. JmL @h=8xf@M+Y%\=PGkE?uqE&BY~ 8o#Hb65QL;pO   w u Uy<y(n,mPh1Er2Cy*qt(mEq6 2 phdt2[<!  < n  Bab[k 8t;O`]j]1'`_cCBAP9l;X,H7S|B3D/b? j#D6wVms~:6Cpy"g7osSEd9E |D#W-_{r3bG&D?@40*>'*/  *b S  '7 z&(J1b7o8_O>"n2x[\#^6( `{`~e?gPX.'!S0#}uL,^Yu{9z-yZ2I&IHG3K {-egZ*Fq1Ib-2tiU|V_}M<GoE . ~  ],{AuQ:{3Q'M"@W9:d}QLV#j8rO^lF9uSO(mBe9n7d*\5 ) X dQbUo $APw&!%e \qU vwHhrllAk{8t'AXQ94SVu    %   }z> zd7m  BTPTzqcWrwG/ 'JYU]q6m*wQeC0?_/Ei  6 }T ^%|"&wjDe*:e>R6!gU\px?BGo[^LA$$//x}  _ k ,  ` 8Ex-K{|3z`R, L9 C Q rJF"!bPPXKQCQoj|Fz_%s9C `e*;Ch!* ] H   h @Vwsn>MKZY;G*iA:}9},i U+_~-$lFBxmG o7 i $ ) %g7GtAR)z)2}J=m#/*LM= 1E%X{nOAj9Icbf6 S4/ - r~Pq*^KXW B1-sr^~8?=A'R xk U .qD2 8'<z   ] o w,!x4)y9u/2Kqn^d*K,]Cod:mxs~q gpr/Dfqh%-Hb^j7jH~zSM~` q**a ["uPXFc *+bwb`wf`%NSjepwmxH*7\@&1  ~ r @x b9|jT?eQ]DwxF>FR!@Ypc*>_Qy    =;PGD.5q [ o    z8s _x" , W-@|RJ;(^;|163o 1SIY.Qx A\T L5 ~ t m A x u   iC`x:1"u4\|P xTr wW!R S/G9>\Rr8 . l J  &VgD DxwX& >   I !  16Zc:PXH5r3MlE!_OFqrC>U<Q {O>k`T>jlMMlVY7P = L H0  P E3@@9qXpP~g$wJ9`9R a x  cy!*Eg5'RW&  Q=f> H 5 ~ u m^M` ~4E 4sk>lX#QL3Y[>l_(Zc   8  Pi c fDKHQ  ,u W mpef3"8^)|T*^Tuos7{aFhjv8Ip W0<v.kA&Xv9si& |o4zf[gr+@!. A8DUYPIE|A_%#5 xH@m: V e.  x -C/P.bpo @&{)05Pjh~| M)"]uzk|<{FMj0b%"`<(Ct4e&;Cc-X9#+C6sZZ:?(&h:%a8;%hCA**F-lt@<;Qb  R~sL J #fVOj L    L F R-|8?f\7l.El  | F  ' !` !-!VQ J 9+  hqe3BIzl4xFLr UOA'h6\9/" #R~ 0  5  \  r0_98Ua+v1*VdL _   =@ uoexu^ ^"N7Ap1TcG-YWr8E#Asj{Yf M  F_d.#@I(4m58nX32dE?y[u@$ C5K!4X|${.nxjop]\B$7J t  # I 0 o { S ,%dz1oSOy}?0e6*B`:Lpkq(>D JJ5hIKzkrb1PNb dy mtdOqr@HXyMbb"~xEZlz*(KU3S HM n8.P.  k xB$   [ &^gigToel${`" hWd\c{H-WiX{[]  Z0 0 ]U\"6_sFT[>MV6lJ`-T)vVKtMRLzr U8H' v,X{R /hrQ  I0 Rd Im}L'Sg9   ^ P M F  ]?Kon  + |  &2=c3FUSY\Xw ^T*BXE4l RG85m3QjO _|AsS  i E y z8 a 0ElHCH@ )gAf8|AwT>|j:jav! Q;]_]w0GwZ1F-9G,HJcT[7E^/LCQoM<=L w1K\K^cg%k M5@^8\h5/aer&NO   ) { *dOCe|A84I) `_HE{Rl_F xM.@=g"N"B4:*q   - \*$R9Q|*0H]!R<_ | _Z - =9< QPX|.(C?.D{GrP0qXjYuvHR.]Fp]FM0 ! Cn]C. N EE* ya58}g~T ^j zu | a,B//U\- N :l;4 u!(vq7 yoQ$ " : c~   b"qu{ lU#sVVnc~- yX "i oM" \*ieb7!F0E  [  x_ V [ t#n;'D \0/4N!p%GyeXjf \u b V  1@xX"sbrJeY8< ?w) dX l4 uZ meEx,^| 8sHE1d8WPQ^G1.~l1U j b7NqJwmJp D HqK&  W t%5:B,qzjA|;['yI W!OjNb16Kd z * 0 a 1 p~-vbmOi4C4A=.B^=olGA(VYm lSkvtdM!QBj:qc x G qw b / Rd|10 m  :VpE ytU\fkJooi,D+ui{u:O m #  U H }]N Rc3\%I ` \   -  EAyN2&{Xc =R7 & zkIJE)fEp`D 0Oj<w-#_ u ^J  s  o}Ej'e  :'qaS}nL>D7vC}TkUH='  n{  APBP0eg < b ( } J C|PJ3>uZ>gq TG 86-aT!zrF!   >& A'   Y@((  gLJM k,n; X4WW ~ HQfHg x=^|4,QrAF ? W ^S  B  F S  q#/Lx<\)q Y ~ vbS`Bl7"G/DnaekJmg,^!p."/a_   e)ZmO &T x   :c(,LG5L;ii^vo3n) ?^aYb.n$k-;'rbK|HK cF_  1UJAZiOq2-e  )/  r s @?ScHJ @nsM]3U}hN(]+ & < C VAqY?]@Ms1  z=yQL  eTJ3>~eclX@ d]8?  ^ {0g5j  7a\C+WTA   \ R L + z O ()Ggw=C(lD&Xc 6 :_[e*^4G04<a/(5'*CtoCAH *[hkv   k< <PB=xQ   C  & fC j"%l?8!z/3lCT#?N+M=p>qp3I?! {^ jp  A(qSZz%%Pd \  6 :@3Qv#=t}OIQlkj,x<4/\0 t  ^ }^Z hV?@- y  8 G  ws Jv/g 1Ne7c>N\kb|(m-(btZvPY_t pi l  9 J%eLNDjRq>=Y%?Afy\CG viP/sr6 bw'&DP) lO{l; x  w H  A1V? OR@rFcWtR%d4%(xuXaE-e`D`u? E p ? % K j92]T}w~ g j` ; :xvGS"B7[]T=ncVe !r d^{.6SyS -FbJ-W^ `u? x  G ]+7Bdya rk8.hvC6n*S2;g^$"Vt+*Hy1}b4Zfw} K/:u\|#n"Fhi7'zIK[nhcO%haOQ [h*%,9S)}8wXa f{wt]cneHn5 !  "g l ;@6bq?J@ Gy{iS8x{]RYV f    z z ? &;=U,v//}$Ie*h?<=!X*D_.QuEmbBCkFt9v]_DedCgW(:Z:)GM<tmM  n C    FJml8 Jo{>-nf/re 6 ]  D|6b"aO e:. + 3g4K7_^!u HF_owXkGCNT&l\mk  >a^}pbq0N   |  X % cZhWMon6o?Fmk9,z`-0g<x!]oU]jA7qdT   4 ? ' ; ,` fxD:> wM"&b ej+/IxREP2+qWB`2RL[:)$ : & QY jLj 7v/^  *   kS\]D0{j'Sgu:mKwUd#R*Qx[F$x~t(vxV? a G ` # < [O8uU=T)r~6Y|gBwqWA)Qm[;pCTtx` e>  WD,dH|   Q 3[| 7G3mZvB=.wd<QdtYFt?lUKL'9P@Wo %0|i[pdND`CV/<,q:wr17'Dg {~g ~nh1NLx'tvS XM+&7%SV.I%1.K-?J4\ @Q%sH<)s<&H5 hBk?h"P{&I(#3A@I~ }#cOAi %U$,M0/_Dz<|t$2a$nr2Oq1Sx(e?OFYG/z- %A:T`@ _r&8q; _0mF@-KEO8`t%~S< O &nRH{.;@%nRsosv'c1 {Kc.{_?j4qg  ~%Or3%%Zwhe=_fEfFSG~OY~^!8o %rf8/{"?BSnE;v5Ke}y(xPv0s[{< q C-0KwO( 6 f:HQ`&oA9QtD_0 A`;?`2?Q=?3@[51B 4CJ]s7c) c jHG+1-()9:], z a6PrQ@2@8S8xBsP lh'!n[m9frV[|=TJq%Xs[F!~ ^m9E<t  <0sC*{E9~A`gW"! b4S.&) m6wIb%"0#f6\% M N9jH[0 #l Fk9FK~.0=vpVEP+F9i]')aCDMXNg:+$qBn&4"EKv/F  UIX^mWl4 8!==\Og=`a2a%7s[]r4t^4x=R 3z&Pk2ym~s1f!YkLRp I2 x^ -wvM,;oN%CX&SVvYtv:usvY=_('DtO:dhsBkc+'VN $jrW@DSnah<.FPhnVj3kL *l-.t"[61gsR JJH7U8s)i|&r@ {h#!E,_pHBMM?0:wuEzPr/}H!?|"6~ivPCP4r8!i)|tSMmf=[r@";()D\%)6JX@iwd4N!lx#O1\eHQv]^q2U2w V*VBv&l}6!ewiK6c|WM KGDe$btY0&+u8sn#GP;J z8-Y\dkpfTX(nD}}@g9vi*7dBRsw ,l7 G#o+# N%Tm-fHA7wDDm)@`&[*a?bfhUM+t#G^(T=ng1s]BTDL*]&c|L@{PMY't^~/8W07}`_ p#KD_`<^"sGAkw{P/=\jN2*.h `c5 UOq  n`TUEy0E(h-e7 e|z+  lrUqg+ <;$q,+eRv:H8I#Lvpoc$=NPV6^VE .JJ8[(O2}&UNUUUOJMv[9s*%cOo,qs1v?5dVUM*8Er(v%}lWo6fR~a#w7WZc:BHC~Eb)X$EG||Uf#N*p`t kT`9ueAbVOw}$c~yHaoxAr'U +&S`EyZ.m0}`XG@ Xg+0u]LnI"rdulj |53r,Kh9XLfqbw> #Y{U$FZ*4t2"g[n8F1R*6kj #_:n.v7JGKBkaXHO7f3&}Ag;@WsX)?Y[W0|*s"i5NoJX gq)7AhgG%*=o93~',0F%W1,\jeO?Xy rJFr1s{@7/b D>|9B0{~DIi}|x-x7pp B{\pN4 R 'vU0yBNNDF2aBhkAg7#Gav;{j!;q XY OH4b,{g7f!G/jm$%3cF( bg-M2]&w-ku0If@M/3J~U#\F W)@G`c3GC,=hK]tfIe} xv~hEP' in5fJT`wSwHj\[J'0 .k}`FrBb>|xY(c# 2Pb*s~Rc4K]cC0&:`ch>wP !N2>Q37v9{F XWcY9?cU6+a_x#DxC)`Cq|7.BR_de:am;Uy?x4U^"z\~G5ScYgb1.+DxbHdi{ z<tEa{ntM.b9zcjUv0r.n %@FVj}:c'5?b2mL RuQ1` r %F]p R_Fl[_tD v2`^J,y}tt, mj>,t |VO5b+$]i"n'2;] N HYn`-%x5AT <8 ?:t5aH:k Gv!N|F<?qC zE>qi"L' 0{+%=NKx/\T&dZ%Xxr"E4/w{ixF66E -R,+9:'<5!&nw6:h'.uoQ8)4M|*M5y~ehCc Sgb W/HX_:UYI)MDx0KH|BRmkKYMm`Z/pb y7 em k?b4 I?!g#_ 'P&;dL;"> ];gRVN|+dya4 2l[P^CGN/NtQ;&u9g ~Y te!IeRi~d, |nMWXE[5dVkn{P'y?X%/GCFJ2z)VH-/`(aGVUZ6=4CQZ0rVy~jy~#9\`/Wuz5!?e&15wg[3o"`% 8Cd? S/OgS2"46UDOLw7HF}L_2c@;(MQu8|0ix5Hr` 9nJu #V,:+e0 BL>*x.0K c!DieZq _sg2&j[GfH]t7[:{XC. y 6p7<[\< *w"Ppt M$xE ` SS-%)@?~Jj9& YLR?}*iU0L}TD"W/H/TK\E+/fY:Y+-$CH5~gRZ5\"sg@bj&gjPg #eS}a3}pY{hOb}s[.W p;twib?wIsv4!>':GtyYA(=|8T4IBC#Jp@oK`VQTe"s=pe(> +% n@Q'OJH9W+r"J}U1 I{?VhmYc!g~dUlp7+]jR=qXD>Ym0raZYTs_<OcL_E{ >3uuhwP y+t)VhH5O^.f-RcZ[6*>3+;-sC/"! E0,]-;sptPUgaQ)9)oCE)u-g-6B=z,:cm'k TmpYvy!+BE=a;BUxu%,;%g 8t/}sD:-QyA[9^V{ W9tD[k-*PU!wpA `^N2:h >S[%R Qz,7`M!wq 4QJIDQ)iO"&|,VR<o;FI{zGbzJvUG:(7k4|.sK!@}M{Xe'?[~6/.Y]>!i((ge3!c@Fm:}[tYH?{ 6WA TY 6V Qd M7>.kFU.tJVQ_q0C:-Z4=f`V53:oSxfH h31MB A3\ 7 ?J [o~B3H,_=bV5{D FQ%\# D}7tqtsdp:=Vxw5TAit Qm7Mm/ }8O}V'I:+{zy!rb>HGn~I4c4 "La0>NXpYX$ AZH}oHqzW(L9'mm44* j\041Hh/hf|-RMgDMt9W|'_ s [SNk(Gx (M=!YMx>5A"1,l?DF3=V {"ubzD$>ixLXNEt.2 "y*<9x|^<q^Z5ra{>S;+EPV W#G3QwH1^$9$hNB"[@AyJ .]6E* ~] *Ze q~$"o;):r98c)f ,$^MrO10I&s `xYXHc[7VnM{=G%b j;5CK#<_`K6s!PIj9u'we> -"Ao67TXSVU{y!J8EbwPB6=eO9yD)~^X8mM#P^jZ~Lz_(  -r` faB!1,4[%gZ>#o4(i.A\ U|vgMn5c^M`*%V7yS%eaHrI9Ku.y7]#fd>. JdQ@3"Re[It)>9j8Z{}RIo#z][vQFs~,)wL|VkD+G kR rC.8r'T!B.o]xPL<GWQ+Z'B~i 2,r+yG}8"cUa{5Au/t`kj<rkw*YIG;750;qUq,4 Bib]%]W\\ :"{ii6|K~Qg@FdTwu78!kv-D&h (H~;f^t DfAKhi-07|;trM6};K5WvInjqbm [M&+-~qT?.-u-H1"q 6Xn~q )+HynrWievEDI)cgy0/S-HOlI'W[dQ /xY&n} 3yjcw84 Jz$n! @MJO Q[w3F%T$J0[CV=hwPv]  8%7:U2L*+5DBI5=zt 88F@NN_$u@ H4YjYbURWZKCpSq)|}([oZP5)$0T[lSi (F5fHK>} D'EJT]   J~tPRn\sNa39}#n>et+ eE~"y S_[m[U@8IVPW>m2HBB4pZ'y)DU8J*>r{0nDH_Z. V,aHaVVjY?PN=)|5Hyy%JD3jEuE:7:r%&~nzemiCw?N r%Hmg!$n}>_i~]:]xC$(,%ItGWbbCF `6J(o^.1 ZM|H|8 ].+\a-uEp"3slL7!l=ae?]$h, Zn__;I$m.4/E}n%jv@B90 KYmzwd=zDoVO_\^OY=z_nEgORMPeOap?WO[3G~AVUG! N_PFgGB?l B7A Km& 5AU!W=uNa1HGuc8oRku V$  kX$&dS|Nk>6Ub;eN?2~4y4zYwE&,9m2s"{>/!4B.O<V, 9xa 3Hu |}&e"?:<DunbAsa3"ahcE$D&_c>A&wB)qAk` ( q#,Wc:E&F/'_gQ!w _vby76RG]L_ +CWM?(yM &+;p}jQW8AAn"-'PV,@UEq 2tWQSin(\(Z(GnG199`\w@mftVX8+[_^?l}RB-|>B%|fyq;}1p9At,hPQXFHRWK ff0zZnu 7F1u[?ExO}7 p>>:D+VXE#N)eP:=ix9v/'`(eSR%D<~kEcX,m-31G|S=o_w~vl]C & zHAUh='z^\0Z:.'Xb81{RX*8w]644`>]kXG)-5#eT Cb>m`=,0Wem1lp GuQ$idk.D$!`xT([}rA\W:e.-)fQtEVyHR&@/QdmIKv2yE]N8G[\|Dv!6@3|&>=U/fmB?vG9dsS3.m~Ti;xB IXp>reOaXhEsF6'ySD3NET>r;wq}r OF*:i-B@)a>+{Wxg/u"!;f@.Q}!AfA>r +8xY 6@FoGS=B,AQk"2LngY*^J{J$C'9nFxW y&_!n[-*W'1N}9MlZpSvgCj#>GjII%{v[D1-EN}Tm+h<Ga9~.s f"a;'K7Y<)/6by$,8oIW,3zS?x9U2cAJ=+5{mnG>c +.f[[N =xX<R2V^3YR`}6yt%,+o;R;u~>V/E;8oH%>Ggm}q'y8aRvn;p %eYtw2\jbuB{kvSS>!&zo.2`[>-vRl2p5j.D  0:971H\8lEWP1, foCCKUq6kJ3}Rf*8CAOU^wON48A`7b*(WcEp5ed*Z t\d:}IsX R}*~ vl,\.`M M}3d &_]Q  tTF$fv \le#>mB};a" c6}3"WggRg 1Mr.h1gNLH^B)<7l9]a2C9![d|~o?_ W?Nn ~_,-]< Fd\Q QtK<l\Q>{Mud.^]~$L\'H*Z3[ [N3UV}n3o<[C^} u4>/'2/ss)1p?J!M}oa7AEWq ! $V$tza=+vfQH%pA$rpSJbrdDply/:) I_@aVU0Z$8kP E}Ax)N7}<<IWJ2C=);n=3*;u -m`fSxK2 c>SUL 6e3?[wZ+uSf:. +V`R2# KEmNWFZ:se.[VCYNk e t) atiHP#.*THG7vpYW\X1PBE;X%{z(M >Wtav_X"E*m79_PFm| ,*@QVl}V K%yzS&{@d&)0'". : n0 q#]:Yiz_N_]K[u+1OUjpQgHenk7f+}\#KanoD2Dp>eM6FVfm-|[^ixj6  b<SYLh7 J-b-U7{}|KV<5F[2{khV:R}Fk#`mU qF *"bG+h_zr  W?svqw'y BbO`B?LQ3r"1rs9y 9*/Tk4Ys0,l)5Ob{- e|.g&z)vpm `)}{[GVOo}#f@CRCVC VF/f]DS) C!epi2~)O OkP>4nu8Q.}U0A{iM`z7'i#G(rGiH P:{ Gj8qGf"xa@JV7uSK$la`PJf9BP#t>E\L9 i~%o=Q[Bt8_`bxcc4"u7(:~'=bc=xV8'Eyn`y:}am3=lUVv Pai>ke]Hj"6>[iIKs / lD+_C T !w'_a~[sE6b{92IcbeV+g><f!Z  D,]=7,P NM}?s=k"[{9\D`_$;D]am$W,Trm83TC9.LlBt\'$(DAM!  #JV9*/|QBm[y3hu26?w SPd!Aq9N X~ G+z=/?U=[$$2cVC1Y\\`_u B@YQ4QV4l~}P ZAAo'S:K1e1VK izCW&]PQ[j]8ZF=D@cdL 30p@*[G[ {8y?\' $Yn?g czO ##KtM*N*O t2"V!y0{\G0YecJEM Qs:* } G w?+QN:d=S|!xpac N2u58kE$2ua mV W6bY|ep4OIe$"VoG=hDNrJ dc~kwXiwsVEno els1P U~>v0U3:YZ4-ZL5q]'D2OVn$/whXy :p KH3b3' /o<>u64CXPTA5t!0\H6)6vwE#X2 =K_1wr=e ]"XON9S}wYbU4^XAPS]Oq[_Z BOMqC[[;K #(f:Tw4b I@4(QvXHIShZYTK`FRX\"f )17\{ufYh[sK0yI.9R#G0~2rC-aXJ't{hfz}FFi /c8lPa}F6\;TAadq\!R~yBf 5$z0gth1TZo.'dY=ek&Q6*ny[}/x7!`p wq_af@SD w?rn1&a.Y \8: 7He,*u((>w[F<Ow6p+WWU r,sfAX9OxKN*v]-v=REvHwa^\]Y.)n&OW0ap ^z2u[EhG>T1Tk c~{U4l,7mAS"W$` KG>[}{(Y&]"Er( ?) c!gqX8#}w\'Z*<7V:;cwZp0mh;JQQ%ht6a@^2j d+DZ=ctA1m/@8Yv+[YZ/uIS7lk$E,g$wL{b&u7*(F& u6}e;@cREP98aozsc |KPH:XE\; 0@5hzSUd<[8'yH;cpRj^~'(xT1Y)cp*oV[#E6Fk@k4!nykTYGv#j,h_}=5u:+z)X\Eyj&Q;z1l#a tp`. **usAIVe,l%WA[]|FCBn le{A=yFQ}g|% b4Y  `BR>(S-h4xw7}' FNKYL G%O_5O+M|;Z::dWYF}j+_uTu<6!% $aYVu_lRDe]q/KaBLwtF$ 8Zkr!?7l} BesaG3=RuG)+Dq&r"HvN`;i'#(,(O]hx,{U rGV}jO!!-3VH'bvSKP]am+i R+ 1zEM^i.DC AxT/?Y'4&Gl#gi&X3 4A0s- }xhRI6 utK-'@k~6*r.)=Jp M=6vXT;:7T3$AM(1R d!@ 2T z0;'-Dp3tdFW FmvPam3lQ*R&lK4{2d/5!TV'`&;R|GSm2;eu`I(`7 /T }C|J~y/X (U$.k{jxVu_!HsAK'{ {s#|(\RV,fV CemhM\U]:F9q !@iK N5?oG"I^V]4xYe(,f}YP?*znMq:MK&~s/ hy~1D,Wvh|,{T*f&^Z`LiL)4?qma6rU57A)f*CLK` f73N`DrB,|=F5mtOC;  G7Sn:Xz^iq|1mdAno2N;Up3(Zp&f`\;c= I%cV'bW>'i3&".h~3(~ \<`2P$+,gT0RvL1!`piSH@=*Scp 3$ GTaGR\,E$|=kH:D9[*lq/.Mw]hxy8@.gUrS.@.i\ <<<<KRIAYD +E@o.HG^rCfP=kmEA$Vn:UKp(]rs 1x, ]Z')xfyQLz ^`U,X/ i'7%|wUNP=RpwrJA2?M`uEe35G1ao]\8qjkkq /Ib44n:]i~h[aFRG:Y ?e|u]F 1* 0=.SKimpW @M6lnq,1)0gW&C+*|sokxj<,$)`oV2|7H&06xia?=WW}pz$X~DZYB6ImM>E?E,SQdf_^uac 9 x>%z1zySh"CNU&}8| V+!5O} WU(1Z+sU' n_Esc0z7) Xb{V(%D'h%_.05d0JLd+Db,H CeduG4O6S`&{+84nan/=|#8=1Z=,}+\5JBGKXEw(wD'a1% 0;Kg mZ,2g OSo K|CZ=!HBW1hfq 32 9GR9Ld,hS[hr?.B-yc=I\= 9SE;Nlf`N=-CFr6n`8' 0@04Qk&~{ *ALmNI@6s0|/9GRr7T4 8&bJV&p;ZUmdn- U^%#Wk +3-sftupI :Oi ={YY|1?04z=Nd(|kXpN(M_S39 7yz*'Jq!o8WJR|~n,2K%z7h+i8WW DlIw<4,9 V01g%-LY*`y#i1yV@yQ~9r @:Viww; VtN"!+<_%@:OV4,e]  {{X:=Bo 6D:Rb$?YZ3OA&T&L=]Z+H<]~t S14TR8,- @f\ Atqok^bvAPN|{GK)B S +w~\l9 `vcNOoA f']eP{^t8oJnU]$Z,?CaP .$pgFSh6/2> !]*/(s ":7e&ChEB"\m|*xu> YK~_^@O0d0GpQ<+Xkf]-q_$| Y._-cW A$~ToJoT~m{FD;yGA,NYQ<Lp;0c)Rdqo>!*LxG!6kI: <Lg#/kYzC"+-c+-6GPWXUBy U:VH,>ZOq:wN[PF 1*qB{}J"*:4$jCFQ,3bk,pm$`m oYAJ0\<fYf0fk#lI,IL)5pnm+IOA"APi2>lQ%o[5 kTu~dHzuB($eO9 d hM4m_j+r!MD[g7^/x_jVyPIyUnU %F^iN Pj7fl^KOTZ>X7P$iRf<Dv+n8e@q-!@V;#R*o[?dwvdwF0" Zt'%{.2|=N 0HW{ha?}SByicii|5`XRKc83nl,$AdwWAJxOkeEwUtvV]3r{%X-' NS/FUyiqWPe/-\TxiIa#  fr5{o|YP@-AfA(K}Y$;5DJa/hd(eo7h'RJkQ{4#0x\E.  _C0U( S g`9h+cKElE[ "KZI V.A/yLV]uXHJJ_<MUAj.lC%sD~2}GC{ncrp*/{J|xyld[ |_I'*d?S>l ~1w ]5-1DR9G} 2l\ f4XPtcrbW5ST%UP.: ipG+ \*3~'8K!k]8-B{u^.Yo ofHl;Kx6WV/5>(o{zff! d ,az$ N{40q9F:L]IE6uLQW1nQJ.22{F<;a=ZCv{QmDO~`v5?x7[rAC2yrzR3>Xd]F/'t7n<ld%tv:pk5Jx{5o}{\C<JZo5C_eU:5,uWG?47 ezBOiK8-u& <tnv5O$HdyzgL+M!` b,d.2*~/iC`S^[cWgGj-jf\P+Dk3?6HcFo*= Jp-6_kgIk1.85(&-OV)v/]qB}~FB{r836rxG^&/%Uy*j":kvgurIE6Wl1MrYS*!DaH#,|FE{"Emy+Z8;g?'B9kSv7,;I*9^AFDbZ['&. 4W JC!q,Rx/efu}rAo*gkSe$UFmV*5n~H8+NxEib;ad@gge \Ee7|A-ET@$~7ZeSZBR&k|F Qc;_KQY@VY~~rQ{ +S,~T=o  |08}Q}/N)>y]|*N904[+aNKJH5:.i*D 8$nGP+ Q2y[IU1_Uaiq"q$_eg?0=s%/AW+Yh~sP%ieI@ JcE}T^J 4!Sa|]')I1XxDsfQy\kR|]sJLhT?b+ BR0=;J%!ArP_E*"CG>3w<} opAq0|Jut0cm`mWatt!N\f",g|bt$KPxSt.G*l2 L}(DA.(_ud+ ^:'fBL['u$+: f=& K];y JSe"GVd$I 78U{XhL/ ,?Vcyi,B4k'%_|a4f;L]A[.E/RghT%+mu+]>Dh a:"7sqfd8m6~F3p GhLu)/GjH@Y]SIOsuX }VPt _1 x;~,i9a t&N}M;iZq2~*m-KXIIRr++hDyZ0BKb7DnXa"w"0C`y@cx6IP^X?O 0+Qt[jL )byel#n/ @^ <$:Q?+hMN`P]#q=D h@ 5E9nA+ !?jB3O%  LqN' vTw:8*`%&e#QRSwn<sLO=bCoM9YDL}mksw~B$if$#rc{X<;!!"S#0#nR<Hs{:@+%m??pNY4Nk(;>$]u!>,Xf?g]G" uHRzm]K6,I`'`uPr{ l4bP$xre[\j0(6G^|260f#xpv0rXme5E]'8.jU.h9$/ogYl_+Erv215_W|` )F|LWOg.m /_N6 w,pF,j)Jr]ki*L]IZD3!d}9*ZV1%q2$EgTi^c,Zwgk=k+[3 igz!RY\C5R1h\s~[lm:3; z1o,K\XxXqu{6m-'!R3BScIbdmh<.gGjiy,zqhye%jxq7 _N^[G/mS<CY3=as> |LfP3dc1r^., #^7.,;K,/i}'#'<S*q: (b)%c'H\&n>zb#jQK6b?bA+|ZIplH g<,:aHTH[#~`A* &=(dLjwoR(<m b-$;32MH):5>SOj4Xta&NjR=?0'$J+: MUc: gZWDmGqg#I3HRkQP 8DjOD,(g$`%Xv;*u5K.x>$k5#gG <C?yC'CRGJF.z~2Z{yf Vx$Q13I<~}"I@!gzr#eAMn6q Mu 'lUY<YzD> n!=7%:|AWS:Nv!U\f}{;?P9VJHU]?Ng+B#7daD"r>S U>eRKK dW6v /jqj>2`I19]  ^JJs0^_m9Y-(8X=^Y+Z;&{0Z,i,0b*=h/{1 e Zg%b&*kiaoJD>"${Q4( 3~YU{27 &;.!vtn{U Bp!nQ:J)$[~Q3`JvW9:ao[ ]dE#-vc#RKMQ i~ eeA*! m&<@g @ :%]nkGPp[m+ M81I:4B[qZb6eWD,=VX,#cYBe )"%B[y:z ,W==x[=#It "@i2aSfA(l@qg-y;/CJxdB+KCsP78`!cqiG- hvX,b?P|@ U=k6sS| 6T Ne*"xnBM\7y8U F L M{S`,=(z|(a\Lj,H 5~P&</Ane>'c_ ~`o=+jpRcfPQh/*bt}GxBlP9&=}F 4%OfneN)V 6Tu* +TA$KI8s0P!H{ f7 !hwC XME43(eu'f1CFXKJdm<#8I;'|Ex^'-MA |=s^u0G >$= ?^!{xG>Hz y,NaY#3p `AjR5 pI6Xw)8j~|}T?N^\<+g&)**$"%%H^|T &83|,bcW-7H|~;EbcO+Ji*]+F%qXrHbp@POb KVf/C `0yiP{_CdRvtO]5'dMQWn exZ@*vL.!-Q{W.LwzQyIR`2'_H%H5Yd16.sz!{H-$eTjo/M9n\g7q;%d0\GrpKSK\X/$Vq]Ge8"q) z@Mi713;M3h:+ w E=t!`{ZUYK6@SNS^HOKNx{z)c2-TMnL.-4<\yl9#RTd ^J1@ >?QuIn+e')edEnAf T4|lji40M [BqA9sL+%A /hK*yB%2eK#'<LH>V3+*-/,] zmy G3/irr~]{SDp: `YfLl|)D7z^/|k)/(n3 h1xlO$(E}!+0p TY/.ThxM5KBgH %] (D5R'-3Bop$hA,;dyX) 8=|" qq!PTo#jRQX+cQhdk3Mj vnl~><D ' prGqgex.P1]%) 4==3e" IJ U mGY No`Zh< #lEi%GY]X?OD:7?StqmeAg=E  ((jjE6A,h+_D~mukZ8 v)h' P UFmqY@'U j(A^A}Y N7Amn*A4 m_ 90G@ymRfJ8_4cA1)i3{~T^1'"1fMyW-}vT_=lB:1K9"g1\k%z{L^7=) (G-e+fX2aAuM<!5eR]hVmjQ$xLrz4C2YXB; K?w?&YH$ye\= C$`+~?=Sr 6R<4:MH2 ^ Z\ k 43Nt,)~\AEM;!<.6+ :.-/s_ Sf=dy1j-n+E6 h"NE YjwIT&;($1A+NfVXR(EL9O2+3Aw\{ x4]JfN< T<7ecXe1LA&C(zTEtvS|fU("q@`fN!?D g&>z c$DdnO5& {> 8fR{3j^M| 7 =Ol9^KCS@2rbZ?`yR, r#N$U1{ 9O8M"YL4N$$jPvw&[)4JAB~ *xK*G_\Ocv$O;l0`K@g5O;liLd[|_%\JJ$Y.p vv995zj_5;];F^T|HFsFKLo}+{ALC%C%hfJG#}hk@yP\Co :&)%g e_|. F4DL kiqQd%Zvaef@ L9ep:Y E&i,eyHIHUWGDsjdA63&{H0}6:Z{MH4l3}Ju*@LTY2]c`a^T@!T"FD}p!w<0O\ja\F}mCr65>76F (FSvw)PsQ4[3@p,-i e #(Z^Vs1'3-L$1#"! l|(Oz{*=)B2oe>Iz<79eLK grRgelw|x;hL,-`6$:Pf-Io_a&JtRdo%aKdufV3Ay18cxg\XWhYDdz. G]Td)Dru0=$e}]kittc1@HZei h]gl<{? qUy%GEE(.8P FiPk2s0O&PH5@7f.m#\B!J~la2't`Q8a>phJ8u}wm'f-"E c>;1:qUHXGadiMC HuS: EO!%d5qsE*s4o5<zu+a9mE m//j xKD^,\&N + YX a /tWsS}!@Wnd0eYE*1 .#7ItOCfHJ6|J#>q~j8iSNfY,qN )2.eRYbOUuP#_)8#\ 6YF' (  >Zr1 as9 -_Jb*nd?(2ewfYoez`7nCh4>KXZ4[\] .>d%o@Od*0e7O#NzS~4KC7Wtn0 fKE@4'<dPLK~/fLW3f )V2_58 ",O2TLFYFhQY^S?O} )Ol#~CFlEI$r &JCjgg|HCp Y$f 3y?J:f4mUmN/e6V;YjL>`qsGITc7""8^m)<@Q$N2{ V:Qd[vWY+}ky.N.>Nx{xZDx75:BKFHD%8C"@"xYBA0)U*2:7*GIr>"e 2UR|/Nx n~K~QfJ(-8kOBhF\~3o!8n%jM.pyZTe2m8u |h0u1|*kYW#bAkXHY+'iEK~9I^3oA\4K@*.^Zi0HHqy V~61"!Wcp=cK@G[9MGKFHAu96,9=DVm},b)d62 ! B8n08ALG$a<4GL}kKjHg#nDFCn^@,Co\dM=j) 'RBN-{* WJwTwL:cLJ@Ykwu`dD"mA& Cz.WlzZ0@e|UsciYB"R RsgXveHW]uuUmK590zCf]G,RA6vC oEYz\dTFF&: 47E\xna<S> :(*Sac29sX&iE*US$Qt3kNUS{%s)%,_|qQv``D *1Czyj4gqJ&6qyW.hv~j25J&~Q2WuDf`t'>X8oBl1dC}v8 \i1]7{nbon) J~u l6A"Yb; X` C~f|4m4.w"@m+41u;fjR\hj}u~; h5I :SEzV8b!orYkoB] GV&q YV/Xg([8fG< VxB!Jr}h: /Snc@-]/oW)ueqGQD'`gPY4l3coVw/cmbK(y4IoXb#s3U%vIjVx['iaSYuD=uuIlAY 9(1)i;1H0#Q}BL'X8Z V>|@l=0G>|ga\gAHe/ xGj~jA wUtmk={pC.,9lPluq5Y)+Y8F@7 J.=y]WL0r:#3Rf\5nT R<_;Y'6d*> gIF` "a,6j' fyhQcll79 qR^+2>j~.hag{F^a&N ,$5. Hb2eHT;O5x@T+@OQgC`# a  AoAO86B<(f<4N ; zcSAYsB00FDV)!mCEp Nwoml2}G2y"VlO7v}Z&[uJ+v1=[J";,\tO-{yKg_{hQ\Z4fV:_@V/;DD-7j;Ka( 2CCA(]L=vB!|d _y4 sal4uMp##1\eFNP?us ,(SfD)@6$--R]}Y]81Na1/Xa:xK.i ua v<~ktR 4wHtR@Ww0VWc-oZ\(PNR[elr6vu|%DJ01d)7T!ct:I:jGG<) . ~0FDu*Q1)8B^RYjY Hiv>,6@"<_v)Xr T "nKzD%t3B~tW>HK`4|,=7:&D&\e+-Xdg2A NP9Vp8dNK}fgr?H1E&o]`L DQ0yg^~az+2&3NnIyi!]Rb~6 1>GS \jpY3;j@%-D.a8Zb}U[ID|a=X.az6[> qOk/8 Wyy_3dxZ@-qY fH%h[,k*HCav4,rDyy/6k10&!; +znc6v+ dDoXlY|<$}< 6A%(^x<YZ0%\M@q12>SpT ],Jg P Xf*_&\ kZ<e# !'uHMrLnN,79fFpV5}b R_HM "> y)R)AA%_(4Cx\C#3gCM7yNEOq5D7G x?>8n d Cb}3HE'x\;o 81+g56"rr"MEO"$VW2Dq|fh-EWaj/aG"!H1#>E0|;4MPD3!.l+[xz"a.+Fv:%j&I+v@Gsi)If4hPI1b*8XR|+T+o;zxnN^J<58?8JV7be[uF* ]<WV_JR. &t7t%[Glqm0Hm*Z"4 B A7.I*0AZluhyHox_$tig8ly<WV8KO/A0PW$n/X^{w*:a6ruB'C p0C@)^EJh;"#6_U}5"u6o4$M:yx=W#-A# ;X[pOxradHt+6s64* ny4zsZF2s&)#,BCh?GQXP3%8LCN\ejKpQk{Z@, [wE4VU6$0CCDl&8>{(X'3Vlstgo_^^Ce&p?tn[[s F)J&'X9K\h3p3rncN"1 a}qVloHu{9}~~|pw!uy;~U6S~pMzYc%{)X911 R}lsiS]8\x }(l)h p}4? C w;N@VuO}5U 0jy ee)x=3YD|,} @d;SUTDbLec@tjn M!>_~Tt1P'lJk5fsTM~]NXa>2j@cr']zLQ,Tk|~5ngRL\ sQQ l>7x[w~Y  %&>Y=VFo~3<xI9^(Ei}d41';gU={9!:UsDD&/ i.ol"m+/l7K{Jk b#atj?PQq(VK,,5Ebvz{f3BbjAWxF5!|_H;69>@:'\MZ I]8`MQQ5G 15-tEf gw>m du5iQ r(|Z HERmO T/{!+AXi$C6;'Zu"k`>H H^%BF+f=Z*l0p&_=lB{'.WI!\whN/ =q +CNlM;H DEKVbmsp` A5N ,8|*N=o5zlI)M=g ?K4zU3#?CxHXk#TBt-t^)f;\wg%~AkUB4)+m" w 'Vg"}B 'P,, Z6pn{?? zv :DxfLg{N8[M)Rq<^gj3EEe<w*th iEZ} gjV, 7_-YmB jH619LkmC/3K`s!`3^$]0fom{^t!|>G9Ima'3z%Am `7]zi! 4+zF[j^rrld\Zeb#yc @@lG41F[c85o~_;J;(.9NYiIs? L{cLk3`4z_J&<18?PiEZ*9ON>6w 'sF\++E+v9- KY+Y8$bVz:#GZV\M53ba'!>wx6 M{DG!nX, =2/ x1*D}B#" 8A^ne^3/Xja<S Q -y %E[]WM.&`uwS@f|~hl8K!$XCg09_4,%]]=2;V1eq"6>\{-!tv1nf\R-F+6 r%:p,TmodP,iMtg|a#CkXxek6~(_|^~hfH6!oxf:;wJKc^]7;RJ"yG%I{y+qVzmo[4:}c<. A&Hr 4r&nBs wIRo\ca`}{K>SPB3jmLn*v+ K6blW&ez8eX V _o#?f%nEMY0k } 5Xd0 B-YDWDHv{%y\ 7G2!9#$u"0''Z4:6#Nq~koNb,i 1ptX'?XqC/`ge\3- ^G; ;#eH~uqP%4K]zjsondR5-60"(g.Jf~rHH o_(2"=jd7,D"M,KB6|-));,07=BC9A;.z476bC}eamD)mzmlr,}819puZP, `^ u_  G_TG#cD]wgTz BT@=w/i2J^$g@#L]qU=]0}/}@`c'vYZ_)dj!EcL+ ]sjiDK=B][UNABVz !<o;OT0< &Ku3u4HL{VN3jLT4$$$Y Xd"#%,|@;b8p~~%NGrU@WqZj@$F|q5GT, 4drEP&5!A~Bmgl1{e9tQnN<5v6P<BFI]K%NOMD6$-a ,90?yP;P?YV6v`?x|n1S1F/7`%,@s"C(-g?LTV"O?$cC, .Hk %36 0*):&N-`9mJsXsalbaaQa<d"ec[L9% Gzd-wH&+IvkT5.V|v{o*?8Dys"pa0 :@yJ .OCBIUcrHJ| i22h%qgV_$:'R0[ERm]D'w#Zm+e!czT*v"C/660(|"q x&5Ow"V:LL9p;ykzv}'|; L7=H ;lh2?avnnvg+.L}7!G< [ua-7{+:\H)42u'n3 Yn/mQt23{Ee-a1zQV-~$4#}"XTh7(:wlh"EQG, t5$Ni,j@NRcs^<6N!r{H>HS,-w7= "5X[ohE ltqzVz"w5Sff$aY&4|JD&zL/|Or%/J].Vv5cn+g4at!4DVRH2Wv7Yj[Qb*a&8qz Z^NVm  !+M65$0T,.w4bECG/ZgQ8^48p$((jL-9.4R?z n.GQaL<&P20Hv $:1I[Jo<l!X6*o'EK4el fqd"[D|- N jdTy$[qg?PyEY& 5Ebig<BRG&< 9~q7vh:X33'PwZ;w?Az]B7M<Jn]qkdO;MZ9QVS=+d?aL!rXTdHDL]w#1h&RMYTv*BD-Q`@;WGHwNxc_("q pwlXr]~xW vc.]\_it|rhe}moe]WQ5JZFsG~Oz\ghHp#rpiaWJ9"!w@F[r1azW(j'zM++PPIHp^x!dQCc97310#0K/-,K***i++++s-(4@rLX\WRC?"ItC{>C,+g]%WxQd8&e @NI9X i?/o y=pCK/y>E\U45V A~H3C(}[&|shU?|$Ype=\0 e'W+a+lC,Zt{IcRP&X{fpt#n`O@W=Jj;A$G}Dn'\|ZPGcaC*=,`oOoa iZl)YzqHFfA*&2>6J~Ymf3 D!E.6.Wa KADR)itFeaP@NZ,oaB b*/Z(rk Bgtk_P'*[gWPXOQTX]dBju d&MGCYB[DOF9INV`mSz.%vJeM.;ke9( KP +dBR;M[2oulpR%+uy)pqn(@ xcyI~=]b?H(#4E])1@uaC$2p#D>u\Xe{ .} XsVR ,+0%m0jy#^}[PZcu<2I+VgUD$&N]N`6jq '=P2|>|ti/ mF;YO@` A{<=E$(QJ%:j1D5n'T-ORv@P[%NF;G*V~F%q\RXsY:|U8DsFTgcxSb--;>2R_m_Ym{+v +s.  =vWYFt"JD`hL;AFYsd#;eg-{_=aK0xNzxfdX<PNT]hr{ "3)<_<5/,1`<$IU^Cd ktS2]l}cTI*%  &xd!b>rVdhaRN?{*RH,rBRZWE%}?w-T?pqH,g76a Fv ] ,hCOSPLE@<<b;<6*?)l=b4z?]=&Z6N."+55,( 63(>WFpclT9c~% @R)~1'vtR'kPK2Tfzm0=&24R*0qyz}HKyzx]*#&XCUWCi|N.j ''Cs%e? x[f%SEX; 7:JsK6r8Yp)$Z, YV.'>opf=aqagsg0tO@EZzxN1'1 My!4G-Ue[YN;zJvihncs _ JQq.6f\uhHFg|a ny5jWA/*fQ~:d:)5 Z $oYskn~O0GQnM:=!{i[b,fr)` i ( 0u0 AT (j8=FS_jszx|jxhmr[C*#j&<3% 8FsMLDF5#L1Y{n2aN=#H/W/,rxZPvjNIbw;?.c\BxM<IBp{2LktKqR51FME-v*TnFRu8`i3Ln& L` 8=ptlI`%+cTQ&wn3<65TsdbICF"v%rh_)mfK  t9 t%]]U[ mi 4j}s U!. .8(: b2#Op&fn`9a?uaS{;.*i1G@ [Anp%(1r0( _bW -tLdn#gOQ)?y~m JK4(IM=2oR$ 3+U([smL-9<7e(<'*Fz`8^} oN,T( -\7TpL~U798TS[ GY j8!MH*\R-3n*NqCD~<pFd7P'S^C<x [D]G U ~Z%J@hci25Zx<m4x`7,o;B0QvB+;Y@ ?7N+yZQZzqR1-R+90=f7(m2o]}_x92T5DCU} ^)v\R*US[>auU!2['|E-5Y.yq`]Yu t t'YFQ q;Qz&/xS>h qkZ?IRmkLBbvPMX$sEM=b\& xg3 !^o<:Zoq\g0C,%f,'?Wq(b;E6.<CNDB<3%Ve Dck?+,>^}W- oob,am =e|z1`G/ZffSY?q=+[eX8b16D l= ),l*sl nzud/]DbMuI42mwE .n1wH!8REc3Nh_CQLuZ'9x{6K!Tw1#XBq n Ohv\VfP&^?`cO+`NPf  [}4}]H}OLbX;*1OVM<qdQ/ Ve=a:xIe-p8We^EZ#& He%u/w8i@PI,PVWTgNDI,G!KR!Z*];VSEs- .;?9*R?PF )m, M $:L+XF[5SC+ dSs50eUBz~N}DreS2%0QjrbO<ej&Aqm |WN<`{{:vccL'4 J.DRNc8yS>e=4Pr?_ kedJ,Sb[U/Z 8u|0_'bhBp-:0<:*N#7:)K yh9v'wT} <gi; ypeU? >py]PySEhSp."M8eZU@0n GO`!+r5<G?z;/aC\6U;q)ydW'qL! ?ixxmUc!]bue8! %QF!x?{$Jb?~;Vj:R!jopsC17q_:_tra b&<3bLczjI#wMd=%!p3XX[z3UZrw1iFI7JHa >-V~4pb)km-Va/1s vBSM.Yo5b5'/Wo}2vI`CVJ#[vt3@FHE=1*D[krjl^\bEt/!"2Pq ek<cmU4b[!u{mBM !]X"2S X!@`~D ;iR%$p8!%k$R*w`VKbi 3TMVuN;`#`]!45BF;o$eUPM]vkvG/qF1NJ<],+"# 1&L[qC f2]{hj ';>16ELME3?Xi2h%:?cu`?_usS{Hux6}n>fy(s3)$dMSWn{k9mS`]J*Ry@Iyc"}e8R|FA@L@y?=<Y:7/"rVO\}9{ kh>C! :3tVi:KJ6^e-A<w%z*;6])D_92.f@mYY +f(d'U\ &R E_bN}(|G  <g+XUyWR+(+Nm"NrpK|]5yux~|e\cx 0PfogR0+l@hS{cki%\oE)  s!peWs PAzx<{YO]J d4B=%icW?/6S=8Dkb7 o/ 0L ^,eFaTUVEM4>&-"%#(//d&II,p`-Ya]lx%NE#[ff]O<&-@HC. | vR<ZI'F6gW^y{t{Jn|qP !k?#$E|s006@23%e X$)8&D[KJ?+Hw$64LMboqg SU7 b)R7Tlup:u[?~"WwUQk5i}.kdj+Oh%rKna[c=WA& ?mqT<-,;{XE 1hMV#'#Xzui eisG Im)NtcLcP- Jnv$K1/qDZmXh '4IOH4"0;F?|=5+  Qc.;&ZUt9kDMX1!\-)U@4y~N}8W~'V^u0 QckvqaZ5 }m[DN6gsV,T]o  6b;R[R7uKtjr,f?\cP%y5jln]V-Wg`myX}v?i`^&f^ybvk%0W ?/!x& |@rYB-qf q/Qn wuW@2 /f 3R dgY<tky[FDfX"4C*y*Dn<<*O,T0kqg@P,F4;23DNSRN|G{;,"Ms #>Xiqpfj6aVKA;o8r651,$Lq~c2X.z ?-V5R52-|H(%c?E rRi)xf(\^6tl#4dHA4'p?  i?i3Lx0 ? k-MutU*%'{ZFPD{Yhl7ENDo|NVI {2aoh#EB'D<6.+i ?{V/ fN : <"-P5<b?@=<>@W=3; >UFi uK)=.K&t?|m\Zg}X2 6@?5&+QqvS 1@LO[fot&sml[Ca"g!H4 V6q~?rV0+C=5D)V/$u8NdxqRT%T|%w ?w3bNe0cf X_xc=/7FUo}`!0VxM54oG8j"$ .40" 1DPOB)bXg,[Xwx[1FX.e`y/e5 xpDK(B^?Ue1f_~/j@ atYVjmj~+5.y{<TZOn5I32JxPE a ;1DqZ }U7w( ,G~yH/ 4_SG}4m~S(f!~ Z $8ISSH3  !pkw<]v@avr`oAX1y~+i-0)io) 0z-~s! 'xI7m F(j`?# nE   % , ./..,'tlpnaal-:5 2HTTDt#o}eY;giHlBJ<cz|h ?/ NgxfF~8n@O]&&Qqne{^x^gdKr)Bi|~lH$QxqioZ0 +BG93J[fif2\ G+ =w?p`2 Av F Aal]7w: #0:@*=h0"=?(r`]kyb]l2r>xaws@S$>&:DF{`` |:e^^)R[t?y Nal&2uYWn(j#<B05aoOw)x9cJxX2 %" [ P50Bh*>>) tL{1m$l(z>e3!jfi.sxIV*L\-My=~'/LeOo4q/:Ph~AcvwiM)lQ8%xt}3V%---E'XbfbYK=43<Oh2H`xZ vO"nUN\KgG3+n0"AZ{y2M68]fc@~.s1pJt{qBN6a>Bz-1}A&K2xR" qb@o+Il|CvZ(G[%VOJj`.hrK,Pa ZmcqYDLk:'pbW`{Q w?N>h ` *g~H**)RCuD{J;{<@yP 7X,0(Pa"qeiC{'Q ftaC`on 7S^~7qeJLJ]|U=46k?ZwA?~|> i">1 sDPuaoI |4|-5RXbH" LBX% N0/4fWHJy] yW<;*)53Ke z}fB#m ~S 1DL]_U =uci?& 4OV?R|*zjBH>kdtOG{Bfy1mlKQ>3BTnO(RaQ#n4&P5~'Uz}-j{nc.WL@78w2,#x>X8 1Vor7zkcu<T Vg/dEHmbjZ?E(9SG#)Hu:`8~UccT:lP2Htv;fX_{1zO}!;Searw(t{hT;SH@]`w [r^?NhVUd%No#ycL8$,0& ?Yf/dbS5 a/pl}aMNfPDuyOK qNa(e~%EvV3huHrFc;$!4\G%k@xTn_Pb!]TFv4H) +O,-<wH&MKA;1W$JK'*=E3@1](- +CQ7P@ F.l]WVf0u%X|vPQ !Y6^#H"C4QWo!*HOafiobiMU,7Z- ?r&W<zTdjgo\KM"<--b,:Bi?/2-cL }J,':e},h%>OXVY RC.0Vs>[svg\VTvRbPHJ+? .4+D8E64%|Oo/^!^'pCp#LIfeomddIK!)%7U]{{^e96.<%B.@/6(%+20':]~%5EQWVW*TL?.Cx(7:h/s.oG)7|/S Djvg-<:5NlUV n^mJ{eU(ncxL+<'HFMGK*B2 SxTGSrF~jzy{qQ^$*aRv!lRK}#]3 :k .cP.plF[;((=g0kyJ~K M (o"0@n !TvshsC:)YWZ 1<?=7*\DJg--*484q)a_ k)4:;5)3H\o}pX;rXPZu0<7t* Z I*05-B#.Zx`m 0><CE,AL6L#0 o%0FPM4@=+5 cNCCK];uPSG1Dl^/%,+ O*VdMBI `\&7H=V~[UBr&0{y?u7C^$pJ7}=QX- 7`7tUrx^< _ sc]dw( A'[0r& pSX// 0^ T-J`klcPl5UB4-/8BKPRQNM~NRX\[R?#%37,wN0z!d3`Mmi-cwH0+@G@c4~U +LchZ ; `PO _~&7GWc&m%sriYE.<d,G\fcUl=C -=C> /rua^]Lf>|2*$#'85TLbo`M+#DY^R8 =i{}}c-Du% ":=.p2%8ITX Q%<9B?2oXSbw0tkv~zI~ %A7]OljmdS>% i@,Qq}[#7,5g6- N{je:\gdV<b{GczC$t/DV(w8Xt3smGK@Lmc7` ?l 8xYBhgU6 ~[IL g!--'#v\ ?OM9m_YZ*`7kDzPVQ@ x~| M4yZ{[#y]u>L4/?`.M3lXlkX9Pd>(#/I.kDVbil je\M8|}5%[Ey^mnczK]+< .X %6\>)?:- lbckvqaTOSe7|'(H}7'@FAZc^O18]B@V~1c %*rYe5h| "$8GO_bkiic[NB+!zc]f}:q oDxF 4p :i oM#5k~D5Qhwv|^vWhaV|C4+(Q*1:DL\QPI<B+ [ cF}|"6G@B?7*[ ,#.7=?=7-! !"vger5JVUG- 5i),)_W/=^9g%`svFBwE& 1S$>&RU\z\R>$t]H8.z)u&~#!B]l,n=cOM_1ildQ5:nbdh|k:]IOkO{#4c@*E?.\*)]=z6Yz\#v\gBX%Yj0FYekjbQ7.4.nYThbB,*?/io.sl*pp0{$nK6HB!MqC- 0^JuY5IJ46a KNHVqFgxwDg^Ik#gV;vv7n:WmyxkUR'-rK2*2Jm.DTZ VH0 `qEg:n@X~OFgvr\:vK#*6_ZYd+jVSb 8b?arnjV;*qx(CHaAi{bq 6] aW.jo2uDCHkbo;}(xC[d_NW4^dVW\gW$Jj`(uT-"S2d[!^zUo@Q?EOKpcHp;QVjI;-z@i9;y$SAoAd\6nxvl\J7& S  x2?F\tx{uF7SbdlZ]E`'rmTHI Xs3fQjO,NFk`v:u ]#<pdY;i`{ LlFxkGE37R| &/@C6k; o:QrCDT;om!N{q^>yZ1i!\;[Rgfv>vt_>UgG>Jl#&/ x: {Ewcy~9sdd~R@v/T""vo#z%" <[no`C|yv{4RjvueG~K$7r%Oxo!,zPC$}&E0rf 9_E2^b8'+\C(j?{/NZ\P2gdI5>IjO}.CIAv0bR C6))CZi)pAnWddTbCM0$ s=6'\S6`?%7\, Bx>qFiX"y~WtFjJa_ZTOLJ)IBIOJQLKOAS7V1V1P3A8&<<92+e%Z_r$/>R$g9z>2sS+Z=5Ek4/=@5kZ=V5@DHhmRLv qAWu=H #PP4 7W. 0[5|s0 *m4b<dCrJPUZ_c+f=dH`LVJHE4;+*M:A<* |`V CCW|"] Ii+[g^Fj $%P^1R`\IH'pi}pv} 7[s zhN1:X!o%{&|$q[<  7X}!<MoQ<I 6,_ 0RunAsR]-E/"?m  C`k(h2Y9@> ?:2%,D\r y]9-%^OlwmQ}%M[DlCmX13uezSH{^Xxjgh{[5]twhHu? sxB*lMckdUB3)U(0?Raf>w07Qw}fP9>$ %8AKY]SS>%h ] y 4h<&y(wAk %9D]TsU{Fr*[7 cUX1kb4RVe!iaN3| ;"U"gn i]M?6212342/*#)@VixygS>.&%+7G[ p vMmF10Cd%D^ms9nM`OJ>/{L, (CmP({08>@9{'[ 7rWMVq!Db(zI[\N4d8X25\/BLL,ER9g)k[; 'sAT[Lq[~~oT4.rqJ0&bo7CauP93i>5[b/@^.~-<Yw~U'q\U\rl'YQSoZop[?Gkw]=#Qy=m^,e[Wjpmfr O03G(Pp&YiR4ZM]g1lmjb WME1W .=QuCvDV`F+CkV{<cXaXk=%jO_hWQ:X%w__u{uJ~3xh1k,o][hl]bz6[ r:y\pkZg8T7dTZwx|9&F]kqoIfXG3lm =)CZlwxnCY:5E+8LudnhOT(hiOFMdJ+LZxuU'c9mXUc=Edm}hQ>l.G$o$b+f3z:@B@ <E8_:hA\L<V [UDU** .`?w:{x*j!'b' ! roy<_#}.+~iT>\)D77D[w5IRQG7%  p#e4`EcVme|qwwo`K3*<#N3]=g<i/eZJ7'z${7St ,CI>b#2-[!{X3#))" +8BILLH@2 *CZ1l<u=r5b'CtjuIr1_uyMS!$viq (&_9>9,pB;Xmvui"T.:7=@?:2'#12>>GAG<<0)  -:<3/PdmfR1i [Yd{ &0+182!|{0]6MVQe>@# ?_~?cgy@dL4 ,<KXa!f9fGaHX;N"C7+jYWc} ?ph 9 1Tlxu0dNHh%{yiU@+%(& !,5<>=90%   2H]krp cN2$-1.& (3:<7+!&#3To{dB2H[g ib Q8 ?\jj\D% S #9KV[[rT7I:(| u %!5JGiZwls{]8 ygQ9z!n o| %5>@;- y-r<zDFB8 *7YmsiR3-ALK?(-9DGA0;MSM=#('"BduU3*?UgrrfO 2'=LSTQ I*<N,ur@ Alp=$.2.j!W Xk~.y_|vNymo '/.& 5HV^_XH62OcoqgS59Wmwt`5?hsmxKzJ@0`-t?ydoY<FtQ-^;:C+E1@I4o"9c`7 '0- /KakhX='>II?-|pox'IbnmH]i@}sZ7}.Rl{}r Z8$&"*8??:2*   "6FQVTK8?^uy+d6E:7/"%?KF13F#K.A.)! zlly"P3qK]gqjSd.XG2 $" +4=GNQMA -)-)!%B Y1e@gI]JIE,: * /?K:RTRjJz9 veO6/;6" "*w*w##RxvY;!   Aa{&-'rR,pH,$/LwDq*ALLBf//g3 K?a k{eMX5 l/ *I7?A6;,~dhW"ZiiI?Jf+=ED9w'x*~N|oyZ 3 1=FKLH<*3DLLD2*AS`ebR7f]iF^eX: f>( )@%i5GV(_c`VD-wD .O'gRrvlV.lGjOGUvA^eX:jWTd :s[en]r_hjR}65DHC5! ,:<_FHA/k=ibl?H\tkiU1l;lPGU{vB4^`eX:a1cRTpkdk Mg1,@:[@j<k1_F'nb9^Sbgnu{{vk\G.{|*6?F2I8F1?4(mJ 65Hm !,S45-Y*qa`m$G d+wD}QxRiHT5: Oc!u ]Z-l7;:5#,M#kx rY-{F&F4gd sP"|K'/S!Kp (3,}cI2eSP\w /H7cc{iEdF,hK:37RCt[~$p)C! cSSe1=?F4i<q31_U<]u|ShHw\Xnj`a ilw` uF04Ny# .BXkk]{WZb{oi|Q6 %-;@NMYRZMOB75)!#-t<uSn~V (<lM}t@lk'J*] /M;@?6'k3vhvnpnpt+ygb2sb[_o 'D^v1:8) sbR}FI@ ?DN]Hm{[vaCs?| jj| Dx#hw:E#Y@*88( l.tYLMZr.g q = rfep+B\u~]h1D.)7Wjafy/]}5}J]P4D)yU<41i6Lp <eWtW5@d |+I}dfwAsl]7B%M<)//j)M/.J} R$%zAgQN[uCe|$(j!J"4C#H7BC2D>/7Qgw~{p]D#tkr>aZ}o[S5r*"n */Mm i:;ceQCX;wLr)c#Yr:jCV7>q-zZNVm (<HKF<7,LX\VH1cL>?Lh2`EanlZ:i0aS[vDPvVDG (8WSeldMOv.zW(cRP]wst %332'JZ_[M8|~*Kf{zgP4 -Nfqk#S&,'&$ Q))Q!"%!DQK6 .8"=B:[0hjbR<&'A$ZLol|~u`nDT!5xhfq /$MA^RcU^MN:5kwTwGJ]|0WvuifHi!|%IcppbH'-DXeiaL,-AOU|UrQtKC=876'6I4c-rulY> 2_+A|QQXVL=a*:(/O#f6ELF2t.oxNsC{Oo >6gUc_L+j<miu 9bc93rKm\uc_R>( -1+0EU^]R?%+55, 'A T%]5X;F6)'&JOprvPpO*oiy0\}~dC|{|~{ngh r+Qw(55'tM%wq{ 09Rsm~uZ2tD_9%#5X"S$KepkOX:qm|A YKarY@yvTe.c s;TaaWE.#09?A=3 |bQ9N[Wxml%G<ED7# 4\i@Ioc>!@[r}}nR+-Kh5FH;uY9|fap,I7i6z&{kL"\C;AVt!Igxzr^Bm ch}7d|^?%  +D_w|fM5  )9BEA8+lXOTd~!%#qjv#G<gwyW(Z%wp~ 0FXwwpKa.{[gLVN[_sx,M`dZD'|olq * BWht{{uk_TJD?*>9??E:N,Zgs}rW5 +12w-r%vtmp)BYjpMk}[D&q@8^|4_wW/_.^D=G_.ALK@* qkp$D^l*n5e8U4@(+(A^{!4vFRU*^`ZL8"  "0v5u1}%(55>U@q;/{bD& !;@V_lywta@oIg]fD l~h[;' w;Os97ETa<VGcf_R?' O;Od!Z'~ 2dwQ^J?BTwMyCfz|{kTL%!xksBgFk|b;uX0 $-K[_UaB?'* (;b]f8%+020*!Q ~c<8TfkcO4xz-> B%:<&KOF3Y7&'>f N&|@UabV=]5 3Z~ ?Wflg]W1<{e^f~9F(?6#@DAt75'4~1 :$$p s @"@ #(%*.)/&'" (5?GLLI"@,21 1 +" -<GLI>+182!;Uelh[H0Bwk 6":O_ijcUB4+qR<R\ZL6 &+*&   4+O3h2z*rY: .I5[L`WXSE=* mXUb 1/J2Q,F+{t}?(WAdOeR[JH90" /#A6JFKOEQ<M2C&2 $-%1--3%65/'  1"O8fIpQmL[:>|}(,GM_blgl[^<D"zYGI]7=IXOdHa4P5It)240)g 6q\[!m  Jx/+:YB+C=13e7rd)"v*P/?2E4_6887 5K1j-{("t`B  &0(@%JLF8!~ppEevxgEyWJVzA&8GQW}V<O@.t o N*~9DLNLrEA: *0;<3! %4@J QT#U/P9FA7E%B9+ 0.<FBX@c5d YC%|g^dy DY.\?ME0?-qky7m2Najf]Y.C+"D)b8vCG{Ej=Q13" +7?A?:$520<*@#<1'Db}'4;:3s$Mxhgs-85% |cUR[o1J^m/u?uFlG\CE<,3+%#$(-26 :C<c>zBHMmRMS#TSOI=|-| (<C<%wlq *BS%]>^OWUHR5E!1 ,7?$DCG_GtD=0t a J1ye[]k5aU"=Zo~|o _IL8%U$;Rgpwr|lT54BB4&% $-48;<;71(&/2/( -AR[ZL3%r0Z6O5W-o4Wf`D|T;7Gl ,rK/Kdv6zeiL'uG3PfsrdI%"(%7Vqv_D* &1:">4>E6R)WSE-{}3GSWRE0,89!/&)+.2468;>CL3VCaJjIq?s.og]SG:+ 0>FHB7' !5FPRMB5%  '0<GQ W Y/U9M<@8/,v{,=DC6"yqs~ (<:FPG`>h.g_P:  (AT\=XaF~+ c@.@KNF6.ANVV$M&=#' # ,62I6U8[9W8J652*   )&u]PRc * h|Cxkr 6FN*MdC2P<Yo|}ta'E7#?=4" *NhwxlT5-7<:3)- B RXR?" 0Pg'o.g0M-%$dI?Jj$6DNKG9!b.ynx Ot5kb3vbk4v'Z (pBBVchdT; #5EPWVQG0:D(QUOB-ynmv%K f8sGpN\L:C3qeh{5dg>6#T1e9h8].J1(K i pQ( + 407P5e.n#k[A/ET5^EaL]KPD=:'-  + /+(,+(# 7P^^O1cYc%_zGx|3FTRZ{WK5~Z0E'g46/ y ^;+9@>5#7!L&Z#`\P=% .#K0c5u1|%weE}np%X'J^cvYBC%ubcxK1Mbltl8cQ;|$R<;Qz.c$3:<7b/7%  1ALRTTQM+F3=02## +'J-^*d]J- 4K8SUJh2neO/xtu&Y?_sZ{+udG% /NfvDyep}Z:zcE%xy7L(Z,](XH2 #<RafbQ8)9?;/.=@8% "Hh~ l'T=:L RN@+ !/55</[#s{kU:(95DKIWEY9N':=Yj+pKkb[pCr$kZA# #-H]hh\F(5CE=,+DZ g4k?dAQ:4, Px2QemxfQR#2 11OTcilmh_ZBC& wlr?e&6@D{A_8:* 1$=*D+E(@5&0!A.J4I1?&-x}G/xCORK<&T mp,;f^sxiIn<g_k.k8NWSD[,aD>MpX0DPQ|KM<'=/TFeVm^l\aQM=2"3 L^c\H*+:$=C6\$l sobK.7U k,wKwekwS~3xdE!:a&-,!e9 pir,Ql{{nT2 vw &'#;]vrU0-LcnkZ? &481! /H(_Orn}}pzYa9?14KcYYL5o>rny%9@;*-:<6('EZc_M2 ,4870 #&3<=90"/J]gfZE' K q/JZ\Rv=R (0==ZAm;w+xshXC+ 1;<%35!? B?5' 6FNNF7$!)./+!  $("39 ;80#%8#E-J0F-7$ 0?,K?SDV<S)K>.   -&:5D?ICGB>=071-)% #%8'M^ jmgW<x{*32*8N WR>~mm |)39;<;Y7j0m&bK - &E ^ouo \A/C'L2J8=9(5 + )D7bAvD~Bz8i)L&Ft_,ux4N]^R; '?Q}YoXlNu<'5KUTJ7"! +FW^ZK2*&L(b&i!cP 3.Jc-uRotbwJ]09,689.KSPB-u`VYg{v~4^iE /Pkm P"*  mdk6P*^5_8P24% >m-:AA:|-V,  '>MRM>&zpq|%0."  " @`vr[?#   &28: 6.$  "%. ?H D6  6-`Lfw|utbSD.! 1BDrLI7b.lhstx$-);JMB- }sZNO%]Mwjyxk S'6=JME5/FV]ZO<?(Zp|zlX?% #6DHC4nfk}=Ylr>jTU[8Q9zjk&HboMl}Z8 uK_OQe1D H)>@'QYXM;"plv#D]lql_M6" (CZjrrj.[IEZ+_ YH/-@<GZDp7{#w gL)9O\]-SA>L!LB/Ce} #6jECOQL@x1V CBRrCkf: fF9> V.fo6 bPVn>r o#<,12/)xv*Lfu$w/m7W<:=:3* %Rw h&9-.+!dKIba,a9>:v0= 3gLApE04P>rc3z y!4AGE!=G2d$w~{nY@%   8N ^ff^O9=T!^$Y&E%%!h]cw*QjrgL%8TejaK, "5AGE=-  2@IKD 4:]z&v%U,.4RUlm{y{undUH2$}2N"a>iOeOW@@%$vy8 P ]^S?$ -Niz${,i-K)%5HS%V1O8=<#;7.$ 5IU$W,P/A,.%*12.%   7\wz]3  xQ"T089t5C,+ -Hx>x[uQ?@S u 9 `yr[@$ $'+4-U1q47:=>g=B91&,L(^6^?KA':*T.0X HwqDut\ |D "*06m:l<~:5-"%PpuV* $b-B01.1&Ce 1[yp O%#V 0<B?m65%qbfz"F\c"X->-$lZYhut}3EN L1@8-7.!5IW]\TG5)!4 =DGF@6( *35. {x~!,-$/>IOP,L=EK<U4Y+Y$RG5 ?_xw[3qncyVZm%AQS0G804$ }y.X}q(L4"84+  D bt#w-j5P:,==:5-%|}    0AP[bc`XL =,,7<:/";NXXM,6BS]]UxD].RWn)OfmcJ%s{5ke3#2;E;c7u.y$pZ;{*5;;5+!,.) &S|Q m%l$~ 5azW' cMIVq .EQRH6 'Fc|kI"!*-*#$=NT L8)7AEC9g+WT ]q #/42+';L[fllfZH1,660%  )12-# '<MX[XNB4%   %5DNRNA-*6==$7,+* !-462)  +10()=LSQH:* -9CJNNKC7& 9LX[SB*)<MX]ZQA,"!-Jaosl[B" ~ u%y)**'!& <GIC5!  0?JMJA3 "6FNMD 4 % +,' %7ELMG;+* <DD:(  <a{uY3 y#''##>OVQA) 1?HI?+2BLOJ@1 :OVN9 "5BIF<*1FSVQD4"+2."2FT[[R2AB*LNJ?/ 6 HP"K+<1%3 2-$ .8;91#  #*+*2&3- /Me+r5t8j2T%7.*;6?870'  -CRXVJ 7    3 AGD:)  0BQWVL :#$ 0:DKNOLF&>;6L-U$VL: %/43+   &/32-%)105N5k3.&q Q) "'($/ 62"}x~3AFC5.76,%H-dAuN{VtVcQIH*;,$CYf g ]G )#:EE :($**%  (D^ q$|%~$v fQ7#&.'2!/$,<DC;,  4BK$L*H->*." +D%T%[X J2")6EAYAb7_&R< .DT\$\=SNBU.QC - "4=;/ %'"-CWis xs,h:VC@F(C7&")*-#?KNG5|}'26 2'<a $s$Q - +Key |j&L,$+% nN;8Ec?S+VCIV+``UA%cX_x:e9RblhLc*U ?& '/ 4%3%-$  0Ldv~#z&k#S5  '+>;NEVHSCE6.# }tv$*'8%;5'(:(E4G<@=290% 9P_f e![J3 1C1N=O@F83& F(gIalizY`>?Ee&z5>@p;W18! %,,& +/-% %&,.*1!/)*H_mpgU<7Paih\H- "%((' $#05- ~ >T_]O88'V0m0{(~wgM-wz )G^l'oLfiSy:|r[:whhx 6ELH;:\#tygM0:MWVK7,:DILJC7%-G\ltsiYC) $7DHB 2|v  &EY`%Z)H(-#  2G T XSG5 $*,(! %% :ScjeV>   9NZ"\$T#D+ ,7-;776+++;*B3@56/($ *%2.4120-+%"  #! /GY dgaR= # (A-W@hNpUoTcJN84/; @=20)>/B1<0.+# #/<:UBhEsCu:o,`J/+'<(G"IA/ulp (020J*W WL7)5?EG2FSAp:0$ rW7* C T]\P8{y*=H*GF=W*\S@$ *Jdx7Qsc[j<g[G/ */ . %   .>KRSOG;- ,6=?>: 4,)$<N[cc[ J'2-00-&   yqt 1M&_2f5a/R!<$ @-a=~EE?4'iE  #(%%8FLJ@1  *95S>jDzFE@u6`'B     2AI%I+A,1*$ 6Wt .:CtHSH*D8'+67-4DIE;!,%"  %7E$O6SIRYJf=m+ni]L6 %($(39:6!1.*3#0&#0BUhw)}BrY]jBs"tkZC( 196)!.42'~uy=S\[N8-@MUWTLB44S%nxX2 %BWbbU=}9KSQ+E13/%5K]joj\'F-,0/,& %(% $C\n urc"H#'!  9a!,6?DFlBA8)m`cv 06;K>Q:H.1ze^g}= T`aXF 1=[u q!V,46;:5, A\mo_?!,2r1N*: ;Px0js= n\]r; m c2pnz >T^[K. pny> Wfh^K1 6Ocptm^H- "(($        &5AFD;+-&E3X6b0c#YF- .N!g8wG{LtGc9I"* +%3023'/& %*("%((#/BQ]d(d,^+P#<$ 3 GT Z!VI4%.21* +<JS%W-W.S+L#B5 &   #!# #++ $#$"+Kd qr1eEMU-_`XH3 +CPRG2(/1.' #8EJF:( "'($5J[ehbR9#$!>WgjaL. 8$W$krlZ?% 2 ;2@@AF?F9?11)  ,DT\YL7   ( C XglhZD)   +0-# $%!   #$ %%%%# ';HN LC2  "9,M6Z>`D^DU@F83-  $/78"54,C KLG>2' *&334A-MUWRH:)0COTRI< , #$ "&8IY gpvum^H.$0<EKJC5# !" zy8KUUJ70<BA<2'9 Sgqn `G'*3:=<5* *4;>><5-$$,.,%(5AJMJ@. %09>>8+&*&()!&  #.7;";/7708'3* 1AMSSNF=3+&%(-3: ?$@#?90% $:KTSI7 /=B?5% -<FKKF>4*# '(%    $2@LX`d"c-^3T3G-9") %--& *22+   3M a!lmc Q9     " ')( %( 19@ CC=2" $& '1501<%>5%8!L/V7U:K7:0#%   *6;8-8 SkzyfI# '=.Q0[+X I/ &<LS$O,@+)$  7N \]!S(=* *'# #+.+# "!  "*- +#$**%3? B;"+),+$3GRUN=%  5FPSNA/   &1883'"  "8HPOE2 $.0 *    *486 .! #.7 ;:5,    -<CB7% 0=EE?4$! "! &273 &#BZffZ C%2&O3d7o3p&eR6<Xk+r9l>\;B1! #9GLH: $ (:EGB+53#63,""2?F6GIBV6[&XL80BKI+;5%6/ /NckeS7 1NdooeR8 "!/'6(6&/" ,&577A2@&7$ "-%352>+A<1! (!5;:1"!8JV.Z>UIGM2I>+(H^k-l@aLJP+L@.$261$!  ! ,1*01+0$*  !!(27 73) ) 34.""C^ q'xAqT^]?\Q>% Dn3DuLLI<('12)  !!  ,;DIG?1 )4'8042)* '0==MCTBR8E)1-+F4W6_2](R>%%$*#) 3F.R7W8U2L&<)(88PDbJjJeCV5<" )?K(J,<)$!0ER.T<MC=C(<2%+@P(Y-Z-R'C.(35/" !1:91!  -:B C>3##()'+9BB<..<A? 5$ 1BM,RENUC[0WH2%041*&:DE?3!    !  +130) #+,&  "" .670$*"518;3<&5&)ARZ)X3N6;2$(  &/3.# &,12/' #%  2FSVQE3  ):FM+N7H<>9// &@U#b#f`P8 !4&>)A%;-"-584,"#%4=>9-$/42*   ,57*25'<=:1%!7HQ#P'E%1 &CW_ YG,  &:DD ;* "7GOPH9$  .695* !$"  #2:90   6 KUUJ6  .!FU YSC-/DR W*Q-C*."%-.(    -=HNNI?3 & *39;;70*&11+ $+)9%@@9- 2JW YP>% (<IMJ>-  ' --% $-1/*!  $)/2 4 2-$%01) &; FE:&  0:<7*%&(!,*$%19=> ;6 0'(* (!  &.4650/B%LNG8# (?NS OA,*9@">-30!- ! *0 0)%* *%   $)+)#    (.230'+7!??6&&*': EKJC7(&496+',*$.HZb]L0! /8:6+ 9]v~lN'$,/-%3RhtulX=  %5@DB9 +!(,+&  ,8?A=4&'4<;3%%/30( 6N\`XE)&BU]ZM9! !-35 3 -% *364,&2%41/5"4, )$3(5&- #")00* &18:6-! *"5(;.=09/0)"! "*-+)10 (%5?B%;3,85(,>I*K0C/3( &7@@7&'<JOL@.,@OVUL ;$ ! #('!  !%%!( ,*""# "))#   #7ELKA2   1BNSQH9% )01,! (.- %!?V%d1f8\9G4()*P!n.~78q1T#,xvDa q&s%hQ2 :P^ d"a"W G4 &6?B;-.890 &!:$H"OOF6" !# !.695- #%#  !#"# (**'" #'$   % '&" !    !%"0CQXWO ?+!   %042( &2;><4& .9>=6+ $:IPNB/ %('%);DC9'  &8DHE<.   "! 1BNSOD2%**+#=I LF8$ '154+& 031)'3970 $#.7=?>8- !    !    !#"!%-0," #.450'   %)'!           $ ( ) &  !),)  #) *'!% &'%% &"  "/694* 0BN SOC0%)' ')%%3;; 4(  *143.&    &--( & ,-)'38 82( -:> :,"(*'  -?HJD8 )   &2:<;4*  !(($  *00* #'%!!,20' #!,0- %$4 ?(F)E$@5 ' &. 44 0&         %19<;5) "1;@$?)8*-&$1:??9-  $,2551)( <L$S,R/G.5($0895)$)%(055.# +'=3H=LDFG;F*A7* .BQZ\VI5 *.-&'*) $ "#+0 22.' )386. "!#08:6,  (141)4EQTPD2 , ANSOC0- 9(@)?$8, " # "  !+0/) +7(;+7(, 0B N5VCVKPKEC62%(8AD? 5$%))$ %,14 3 . '   $&$!%#( 11,)9AC>3#.J]fd*X0E1.-% !-573+    "2<@ =2! %055$0'&'#  $$  &-->0I.M(I=, (9/D<JCICA;2, +/ -% #-33- " '3:<8/"#&$"'08:A<C8<-. !.)6?9O5W+VK 9! #'&!     $%" (3 992&(5<<%45&>A<2#$/55 ."&19==91$)4::3&!,22-!!.795)).,% %)&%))% /8:6 ,! &'! /<CD ?5%'1:??:0$ )251(%/30( *:CD=/ $))%   '-.+" $6CK LH>/#/78 3& (27860' %**&    (-.+$  $(%  ,;DF @5$ +6;;4'   #%# *3:;80#",22-!1?HJE;,  5GSYYRD 1!'**&    */1/*#      )0440&     ##  $-8BJO#N-I2=2,,!#! 1;=8, * 528=5A+>4%)= KRR!J<)         2CP!V SI6    "#'$% '$+%,$(!  ## !"   "-8?B'A/;311$+  ! #!#" ",242* %))% !&'$   +7BILJC7!)%%! %($(386. -;@ :+/;@=3%5OahdV@ %  /9<6)   "''#%++& *:GOSOF8#&.31((:EHA0"+/-'7MWUG03FRVRE3  '*&   % *)# !0<DF C : - "'(#       '- .*!%)*(# '1 662) ""'*'      !   ",11+"   #,142. '!')&%( &*24.$%.1, !  #3<<3$ -<CA6$ # ;NY[SD. (>NWWN<$5IS SH3#@ T__UB(  "2;>:/  ! &2993( *2 42+#!&%!   #.!3+31.0$,"   ", 11-&  !%((( &#  #%"#*-+ %     #+.,& '-.,%%- 3774.% #+00,#  )486/!  #09>>7,    #'&  - 9AC>4%   %((#  -5970$    !+230( "       #+.-(  !%$(-(2%2!.&                !%'&#"( ++&  $(&  %, /,$        '-/.(       -8>>7)"+/.( %, .)#$!0=B?5$"/7:6-         % &%     ""  $#           #.32+ !&(%  )7@C@7*  % %  )1'4*0&' 1?%H*K*G$=0 $& !    -6;:4)   )5;9/ 0;>;0! #%$!  !# !  )264,! ! "" & **(#  &(&$)*)$ ! !  % **% '.0- &    !"   "3?&E,C0;/,* +8 =;2" #)*&  &-.+ # $)!)# &7)C0G0C+9!*(5!=+?2<442&*   ""   #+/0,&  !')(# (,)!  $('"  !$$ !         (*' )..(#('# !'++'  !" *5::5* !"  &-. *!!  !#!#$" !')' )13/$(5;:3 '   %** &      ! "   % ,/-(   "#! #$!&'# "# !$+- *"  #* . .+#  #'' " !*/0"-)&+'  %-0-%  )1675.$   ##    "-5: : 5 - $    "!%2;> ;1"$),*#  ,463+          &+ -*$    ##   *130) &)'(-.(  "&&! $()'!  $#       $1:=90  #$ /=CA6%   .7:6+    &'$   $# #'&# *8AC?6((39:5+   ",10*  *- * " $#  #'&!    %**&"&%                       %'%             !''" +<HNMF8 &  $-/+! )//* '2: < : 2 &         $/ 6 9 9 6 / '          !#!      #-49:83,$     #(+*%         !&)*'#  "&'$ !!            )5=@?9/#!$ $  "     #)--)"                      $()&       *254-" $+*4,7*4%* & )("  !          # *,*# $%#"'&! #(($ #" %(&     %'% ""                                 $$         ' 3<A?7 +    $+. +$  #(!(#%#!  "%%!   $()( %   ! %('"    %'% ')("     $&&"   %)' ! %/575/!&"    %.4762)!%%       &. 21,$      %/685 -#"! %('#    (%,&,"'  #,0/ ( #%#&/5873 +   &)' "  ""   %"%!     %))%  !   #%#  '*)$"!          !)--)!    !                     '+*$             #) *&       $+.-'   ""          &,-,&      '+ *$        ! ( - . - *$       #)+*$   !$ &&#      " %#    *1540'             $&$ "/7:82'          %('"    %)'!  "1:?@;2$ #$!    %+ - * $    %+,)"                            !  $((%  !  $+-*" &*(!&)&)7@C@6(&055." "%"%*+(    #''$                      "$#   &*,*%         #$"                 $ ''$                                            &' %                                            "%#  ! #"       $' & !                                          % %!            "   %))$                    #%#  !#    "!                                                    "!                      #$!  "$"  !     "!             !%& $          $$ " !"     !"                                                                                        "                                                                      bzflag-2.4.2+ds1/data/spree3.wav000066400000000000000000042120541200563112200163000ustar00rootroot00000000000000RIFF$WAVEfmt dataRRQQhhFJ duEް=82%Ui38zH#  &C)jm[Vm} (-2az@x' ޹C4% x7?I>q}Z7s{Y( {> LvC<  <3 m[ ֡4?~M Ft4N{,R[{ c 4oPV.y |* gQS s)?9- p -k O 1`HAJ F "c"0, A hX/U08.0  p!Ae-Qm68N~u#[ fی ^A0 dmEV0'lҝw:XM{mrLSh "{uq& zP,s"j /^]@ft\ msa6C4({eoD?'; 0b..au+r^G|wl6 Tk FtR}H"_ w:H`RzDX eMg&Xv[q& *G #/ee Lb A ^ d i; J'gd- o vY zs< ,[6p' 0'ro 36DH{5EdR m a\! - Y,>u4b%Qj5M2h[ .;%/#߄i0cݯ}N & jPx\N[/]$,(Pozg\syQ^%H:HaA R oOe rv M w+v 8LZh j(  bwZd=D~ j-M8HZ6#vUWۚܿBT14#aD ?lݮ9ydtM'! C.;AAa`+z;Ag7M_g}} qFvo.D#L( l.-FM<%s,tFW4$1r9{%),: kCT=vO AVU~ܾJ=( &4: '}a\&8i 4V\D3  ILcg8|3| c{^ByO{!~;CL3#J޳gP}w@GL~u|5 *t-g4Dpozn]' %j P[z]u! ?P N'=har Ws s 38 bi3dY n\d2(^g@@+HkA;[g> 5|F_, 2PR!/^z ~e1  ?~ I~%cފ֭ql -  'z'ӯx_ r6` [ -Xޙf  i)b_RF2l%n@g4h 'Maa K 1-8_%pj3j[3^\,tQJDMYQۥֳ0 1 9 I@ ak94l ! nK( N;qR{[ـ*:-uմzd<=j9O_P4t 48  !oC]hX+ 82 0 0F@ + 3B3Ro):nKz"b1W3 8lG6C}$KY F .QjTH\,o 'ytfzJ$zsGУc#l-Y-ܧP߮қHx3 0L0x J j`t?5x xKs <E4Y ߯#_c+E:d\٘q-Vr _ Cmke3 ح׬ h^%}#f Aڏ";)j8u|ݓdߗRj R t6GN]$5 O$!F sV2  ;A"LplQP`,cD V:7)L=ue+@XAػzZUQT7tS*{  $ .| .p@4QR )b)O.m3bL)2igU~XM9 SQ~]f[}q {9O%CeAy[!.V8WPTټDFbK FhNF'G-e (0ݶ־<6ߵ"ӎE"}r@gܒRMxh{/#^dRԭlczI 0n[Hgp>DH q SUWY5EM  Tn^*850 ELE}eJ82/ \GZ?4`i9QhҔҹ$z L @e<Ks\Y pJgzL;SF/dgw.;!  Q{ 3i1zb / Oo,/xk'8 EFjFE <xP8/>oߥڱգ܏ F oWlZqr X&dJqWcBmݟ)yj ?޿>})Pa&V6c!  2 9&s% ] yGwڀxV#Lڎ D{nx%uܰn1D^ #!`4  r k_{/c>Uh B 'cez , jސE_h^ [pC2C8ܟ!ؐ=PՁQJ/KxP V _[79 /l19Xun QN !8~.!~yK7SpSZC"AiW- ]IЧKt 6. mZRd ]7^Á)C 3 |s@T& nw \% @ >{ cыrHA^ oUS&# aE5(3}[ & A* \4 PR(,!} S]'R1| ;oi{4=KKc*&Lv ) N}%j$r[_"9jx@Ԯ-RcL>P~&*# lXo+k.af`m4Jsߢ޷ۡ Ԇӫo4U2# l7ORߓݥVAl>.m8*D !db n `=xXcc`qALdAoiU)U3H p"wy  lܷ\ )Rd#]x'b4e8z z 8 $ / Q  IU .a*ߚ>|4mO Z@ + x } [Y+R@ 5* $ 17LO #=  QD5yٺIIޫ<n6n9XxѼ`|WQO:T=XOkJޝv1(ZQ 3t[ [q X  %\S 9S(p@}kY^N'u< u! 5?4x)b!UK -wKaU J 37Kyn}a$Mݯz8osߣ`rYm־b:S*? $78}7-YP pL\p. + ;w\S~5 @ Got=  [v&o _ ! nl5rO{, D !ӚAg 9_xg y;B|qтͧޖX6a/TVۣ<:k M\}gzQ 0NcE4H|'?}b D^x<i ' qcpr%-qއN-<W8 G>؜:<`g_wdMo&flb[H_61_{׹PʇOlYIVa:ދCմuޭsgrWR83 ~S,n4|34 "s`*!iQۺ{Ұ wL<HBjV־ǂĴMݰpN Mۮ܂ͺ8P|)M+1f \ V 0 :f;sHdXL `x9 o rES)#40Y?yxۙy@%SB%=Y`EBT߹{ Q_F=F`d4; MM.H۳4L ( @;;[ #2 :4,"ޱS*ZxdB t@& /fP;%_o4eϯ1S 8(KK^_P*^ۏ%:ۇYޡյ(v3jsM,5XVNSi &Zf V 6 @B<iV{s;ݘ̐`ӎY )6E|~ ܠQJ(!Y@5FԔ+ ^mn  \  ik64;5ۡ=˻¯àQޭVM&y P _,+K(bЃõxOSsp&+ #w ND%p#/^sEn6 "IgS3$[~u0L^ ~?(v' LQ/",0)W vcӄ r|q\52ClI-ݝ Q?fpNmi xSٚ(S; '  ] PXPl҃0h w }։[zhWoc e݌Eo׽rA9 ޖB}xGވ~kz e HIW  > A!^}ݽ^< S=Ls-'Y.*N/&")DRWhs {H f /1S N4T$Yuu 9yJ(zr?BI%kՊ_@|F(i t]ٚ'#eӇiKۭ~Љc{ ! xi V I+VVqfx "  U 8 ڥ'-xܸv۸OuO5ߌոG2y"e`. ?ehS!h7W1EޱZݔB`PҺ pwBڮۡ2ٱs"sWٍԲ۲`sI+TX2qKXp_&!U.0joWI߃a^ 4xhh;wH5P a\:ckyTޢ 1& ouX% GF]P  5/mՒSeQj[ʠJmɷ icE4MBzWRU O XXN ߳#SNB,c.K W\w;' 62& 6ՈdfUG{D)̾R KX|{TNQ2ƧRڰឭ6}4]f |, $7% e`& kӻзvtWEe%8̈MCڢp knV  V{/ ~ w5޳hRω.>hB|fˏv^12zZ&}x1PjF}'B|8nLKGC0xjAd$$"2 6!8K :pIȝ?֌yRcR'J;N k<?OE7 wֽ)ڥ]",٭יȳǺM$EגWRV UV5½F}b G6η=ε'T4 7d.vץߡb:NԬ I+ t M_i'!1$Saru91E6) ԫ(ȚQ:wS_&{2!gAl˶pVTrk߉W`s1! H?v_zH 8/ u.>rCʪՕ ;f̔U7@̼ɖsžڐףɵ(  3ݩ6Ƙ޲?90E( Be248B;}$[ N $!Mbvbisxʴѻݲ DάA$[%ŽϑDV 23 ? j{|ft}Z*dܙAѺ<3' 0a2PZ`9PLQ~Kҡ]rPC-Ҽŧ 3ӈJup׍؂ׯLӌ%*p ~I ;"W˘B --qֽ˹wn += j6)ρ֣_ +rA tqx1c<歯oºQҿ3##ZЙ.~lЖ޶'ԋ_ӎ% mx2b u2B,܌`oL~ >IM lƓ3#Djd ,ď  w7oz.M|"̲ 6ڡ͋uO >ŠXP tc=H^jۊ!:T&,< ='V*o`x![1!  w 'b- W, !$1 HE4ۓޮSـR7\Ӧ'ӺF(A+ɇkpNϼz>k|ͮԚ7#bť{~0.prmٸP޽1гƾޥ׳0QUP#|kĿDQ c q.6nnibjr'1#!% I6Mςg)⥺ib0#f!TFH`QT+s !C Ww  Y) S c>IV l0!%##r0܁ޜ ¦Acr Zf*˔#pȑ9Sۥ+IДѿq`\˾V`yԙA ":()}>$@; Oݫr  l12m8@ӿǻE] *+#K:֐-Pڵ^oɀŧ^ Wk/OD1F`"֙]$XԌ?Ϯ&d3d(#W"IZŠ.t:ψdېu˛ԝ3,^jfaՊӞLF#S2r2 PVQinܗ"4P˺=fޣC졹W y1=7X@U縓ۭۺۂ&ρSx,~ K <E <# d o 4\ $lP~H,Ư:ģ 5 >QF~i g!)8ɑda{MڑDسQ++2 ֈߌ  u0U(P)g t6;Yݹ7$zB͒ t؇z<Ê;ʙ?U˽5Sjiòg|ګW۲ طl(ġsv A 7?*4171L2fLɧk`cd H y%!g ;pm(N3нĬZv>(yʒԮ7 qѵ%h¼,¿'ZHۇkٞ|ڽب;"x"* /,%F, /ۙETS MґcqЃҗYdZS«8'CS'KE/ϲ'B@ֻfР֍!{ AAB&t¿9\!6 C9nߔ|rFGcڽq݌|5*~T7ϱ\#׵; Qd{8?W ٪фxXȅZ\ V"##&$*=,$("2U A)pw"ӹ{ЉU~Qcq[~̃᯶W/VS>%+d/,E 4d\.=9om Z{j~R$4 c4 &3!DGܩ[zIwUҝj?U)o OՔP]s#FxG>I J13m|ո^h .$Y q@xE:֘H)P<ץ%y8`-m8٧т i}%XNҼ޵8n`V ѰrAWVLjָ+%ϱQ+آ)ɹa./< V B؅j",#,AwO\q7 h#!)^=-tܒy߁ٸɡ 1}Gq.6cY} .١ ܂OsX vQq ߹|jyW Dnhy]F <` !|. !2 %m+? Չ}Yӥ~׻ִ7̑Ӷښuњغ.SI O xEK vy*fϽM){5KAEϿU[x*\Z.nT ^.V?O9\/i\%] 7hӥߢ[VivoWfT9w|`Zмȿ7qΙҚ Ӵk11EK1C2\Bz^#˵X3}ȴ׻=.>ߥ[,+~[]X[ oK 2 w X.h)&\̄ˈډݙ.qEd@-qeom μւ0 !["~ Z>(L%9# vc  #"%+m{  7F$ oF(=P[ke ?oӷ؃jؙoOEr.3  #Uk.T݉ y@Wh 7VѡƝ߾2v} ? |,mnζǺR%Ҵ !|`a{ ;_kvIiI'(x U ?ٸ s5ԌNߏ@xߍ đgۆIFG-{ >w<_MqpŰï܅T)х\JܬG1Gbcϒ嘖˛ճ󸤱ڶcD΁|V qL<:<ZٻCYz(؄ܖf3%v% ^m93آ!Ѳ%aYnׂ4Ϯp'Utƚ- =.dH֌ȸٕ| {2ـ<4tNQ q/AM <o 6n:a׼Ys3T<[}QV U.]d |!Ccڏ\lCS'9D 0**)0IB CΟӶȱf$nۆΤHŒ҉$ħ˫L'w//ҵLv7 ߙ܍EW U ni[qX3#N>Eq"9 ` !f'i 1ހ ҕ⸨=U'>.L(. ʙ=ԅ &vY_fXܜܧ o A0<ޢb ü7#^;U9W>՘2֊jl7l]ۯѝ;fj q+\JĨԯq{ ;T֝ ,xžٞ+XYۿN˫Z8اXG)r~ȝŦ<V,!1)6_q 7R؈ص&' D < l%דDL/sܝӟ6'9 4"*Q&ޝ$qۀڞul<2֜I&ʮҪPR*l.k If _ W t 5i[XICdU<nt"a۔V8Fѓ]њ<f :QɤR5eܳ۰4-2Øٜհ uls@x j%^D+2X[*$ ܎v"/` Cөī'‚ی4?:& j/.!8|`/W%%&R.\ƾ %7I4?ѤΨɴy4WɸԻ"+Ɗs‘ Ep׸#6Lܨf3aUE,ޟΕcܟe+;,<5.3{ ewLӡgbJIFhfdըV4uefcƴ򟝴Dr߂!KZ(< 9>XAkH)4Q 06^+L3' X U*  ,-BW8w І|ԢvӀP2ԈBKo5ٶրJ<ͭpei޵, z'M8ߣ|/7~$77/{GQM`9st %2-13 vV2L;uI,qۦBZhҦ+#ܤNlWт3>&R*17ziޥx&׽Ҧ^|IS=_jf̷$ LC^qr9qϳ &rɋLNBW4G?+AIOf.x_M,YL1lB4yu*xF ($> Wb6w9Ҙl *Ye&ܵߴ Wܙ ڠr=#"ѱ+ņŒ׍‚A:'7= ܄ڀyHk'5ۨ-ѱ]4 ZSfCbaCB {`ڷķN9ؗsϕÙDI֥u?uSdUP³UӝӲX :VzftJ4%'J[q޳ D|  &h>&t͢G L'e3N&,+/Lp{x͂WԱcWuݫ.1nTؕw8v 0鮵 /aI!& G6V" II%Luתg|3i/G9[ԟ\mUD-ɋݼφo [: 2ۼ  >PP#5xːcz]׵lH# *Rj qۥמ[(ZJޓ=1ߍ0һT)!M8A9"ֽ 6 -6V]n`Z A$9d.WFҬ j@3{Gp)218D2nt HX|Ȩ epl a'ƞ3ըف*B4<q~gpo]ۼ˄V5Σ 3)-״\ o$;"ITմmA&%vvݝL!;c"3+L#<% L&=ޝg,Z-Nxōͯޥzb_kљq{ˢͮ.4ˇ6MӮ3!TXU]yD <e$1,?\%8ӫnmY=$edAM*9sx} C2K%kVl~=uŲ"GAֺ>MƼ>ݚfďѽ֧Witۏ ڿt1_Ps64tük-mTjɇƳ,p —ۆ-ǺP 6W" 2NDl" *0.A6i$1#&4/+5W*!"kb1&J LKj$3NЅ:E{})ƺ[6ͽ֪̋vrڌPj T1/ZU`̛;Vʊjɬ_u:=1/Tp°=ï)癴ʹRw0P\i/%./.&%5z'(e [& ^|Y' PpߡKᨋ(fCK`Λ{V)rD6ح^¼ߎ^-yʸǹG-4 ͳQ`ܐΆ`q7KU<<9%\{Ʒ{| v(]}g"!XҘ)!ك֢GuqSS  [cۨ&9 +t"**#%i 9 *+] _;D̩t O#" nUj*g4%Тa)D@= Ќa_G4ÔW#++@>,l>1 xك;*/'?P Wn 1Aܘ fhGeU >|A(rAh ,y.W'H/ ;1z 5l`ޤݽr€!ýcа6=µOoV:{ l1)jL}ܙ̈́Пmu d֘tb:WIcҪ`--"BK>9_={z*L.h>#غŻ׽^C]$q1Ì]5;ʇĊ|s3@fYqKҠIt#ړoCRA6 'd:[iqب=5^DМҗ?l?W{Rَ& 2(7)epu }xT zߞץ(ns$9hkDǘp.jݿsOZQ L G! tP1!%:%f \HPRTH%݅xwdا>oA]6/8- ֚Q ihCf۴E^U-êüJ ܵ߿:a͝:qiW;tzvc612]%'(D*(mՃGLF_˕Шմ9y3<Li'CX{f#7 :hڜG`Pΐ`Շ߬B -wBv^rSLΜt% p8-9y \ 0`[]\kؗ8ӽ:DR@bɮQ}$m'иAW:!dSǗ cDhT]j m q#9kQm#L!z$,$U"s ; d c;8HIZ<Sߙ䙻u7  WfEmek'  @2 M848&y4 W#{ ( :8 i=ihd ͚y dXkh#- @-%b('6-?-.+H)u T?*5VIx81mй_ھ󾽼i?d צى2/(æ֛—&d *&xuĪ'S.PBh8-. 31!/$2>Sc<sgok>ُ]љٞXbeMèЪJێ0T, mvE\ֽB;dBQ 'iܮ`+-(R50 b<3MV>52G,L͜Ԛ +ɦ3Ԥ*ٱ"v9?f 6֌]鼿GhL/܌݆8[l' IެӽX DќLYqQ"[(Ջ!ߧ˱Ƭь؃.7 hu8fyjaUο8kIt3RaJvrA柴ØLjt-\]NYzZdMLș3ʭB סX] Ј ?p$b y <#oD5N-B@);)PsnT H͠^*ݲ ;`W4 i  Lլ5wia$ҟb&_ˇ [H҄ϷeȽy^҇ݵ!A#0%w:5)sޒ;70e ȅ 8ѳe…~ LWدNǙsDz&D"܀\hXFݧ+P4[Z~2R'8>a(}70jPHܸ 8=ʫ/Rh=Lڸ& k-D/ɵb=_;U G9{ܔ)ߌ]>Цgٵ1]%˭՞{r,ɠt W&W,2#$:2o d"S,*i}OTNX 6 /hE?1(r 2Gцwx΋GӨgяս_(EWߞJp+߳ߑ:, eJ"+ U+1 2 Y~5x< |${ E-:Odβ3ΑDR\,FyuZOz§ބ򙿩=oƼ]֪w;ۺMd~(# سbsvQݳŘ ?3 QE ed^UҸX/ŒMLh l . ayvq&5 9r.  /ֻ[)͊̊GO$o4Ə*)$4F3"Q^&2ᖳʴ;v<\èxŦg8%C1>Ųӣ  y1 :߲syP~GCH,+nh PYGӮjAt޻*fva)w+ -(ZN "c!=2803 Ch=E*qe 4oρɪA)%5'-Ɛ@r j 5#ͣ] h LĺIYc JЦJڊգصڹڨ\ Կ nDq1dM̉B.HPa1v/f L0¿S"~OXUdo( Fs$:;2C,hUihC9؏բ릈K.^вCXӭ}`y 0 sݢ'E =%WrYU% qB̤եméͲ()>šR2ܴFޱ)ʭ:`ذlԶȿ_۹ҙϐlʹڅ<tn.^{\E"*V IE}Xn(d4$0BO $<K"ܐiX⇿c]u]6ϸ\9J`7K?ܜˎ".@9۹ܟdC녶6OҮ0dΑʽ׈ˎ ʷWΰM P u:V"ݹΔjk旻$i~9u!_WhqTK^x;A9I);]=1|E5/.DN(V230A+ ߂`ڭ)x _6ٸΒ݋Rλǒ8$Bƨ{fbڐȇx3ʱeߟ=y '} $ MZ>Fm?6Ģ]ώغ- ɫ٭H|ӭxĐC"7͜ǎܯsaD2¢ Ւ]+ؖ+H q5C١ʚ)PlީSuy|p62ZMF/  AG; m&LBۿ<_O1p Вܸfeh}d%0 LhGh1oѧ~~ |ϯ޶VL\|ߴfyo%5%0 !  .#J)w R! &4$+)h\. P 87${$H=F4ېl r3; ,/*_ '9 ׊Wwk(w_(9XAg=mwhOO~Vxc?2r3Eϑx&\|{|띎SuVҥȧ73ӯejܿ2 :|%t6.d {9cގ)(R [(` ;'Q;5:׵"D nӞHy\Ry7:&<;Uݾ#'?:I-3\V#w~|4w&8XʡB]1 vuٟZ.a m %' m"{$aBL'Sn N(ƽ0\@؁62᨞- i#"1|5. (t&! sR ھҎUFЙ1e$}!ױΫ khv'n"J#*1GAe3׹@`?Y׉IH׳5FXXlT%IթঠŔ%'Tgè֤̿Aց>9ٔREI ʻіi 5a=Z"u!F |17 c=ɁҒOlڭػ-)&)V8ޯįlS0\WN7_|( o f ђķ0ڂt' j!A s"#!c*c )ˌ.„uӧ^ȽK1}s`=Ľb:c $կZ̒ܔVfԸ9xƵ{EݝݗpeͻƭݥC4 kײzթ?ɿpPҟ`{zz C[|֛ir WZt a&,/6;G 4(2})^hD#0%V #[ iߧߜԛaR &'}geg:ݱMB~1[PӔ ˱ |t |יB!4sȲȠXN<ˇʺ%,7ĺӿQzֈ͆MѤlWq+|4[\Zr!HS(5ޝYɅQ0ݕ:*ڔAػ8̚ʭfu*W&*f /In>91dr2, x 1(#ڲb=iiZTpf+KXI@62=E~ͬu4Ԋ5G{Qj3֥,~ApĒL02p?Y@EwOcǑv@/"luzE#%.؜)b } /0_ $tE#{H)&\EUkdl 0#&*/#Gb7  kv*O"OW3>V@*% u <| #,VxgUh's$)$11M W,.k%ٹF;l |0Yʿ oԜrǸ۷ S۳jׅæg/?hHʱ֌ܫ؇ ר:xxÇϺ-Yב"'ȹM`0`jƯ~  ]|im_DyMG@tHR]ٹTj׎a%'FK$" 5 4#(j 2"GC7PPDmC7(zG(6+'O*(_Гȥӷd=VZ'ϳ~b</0 r n 1 5  HJ3շߠӶwˆo6( :$*+'# e(K/0GLYq'a2t-840"7 "  HVѢ'W42ֹI$T qPߓٸrlw/:ϡBZ4cU񙅪cZD6M[4&Fu^PդE!?z^ >N^'ݮcܹ˻%«>Ӿԓa7= ۯ pmBI6 [<M WbC`e0ޣȖ5̶ uhzk%c]CC2w 7dK|Anž~ƟΚɨy5F U`רmj'' _ ig<X]mɋvHhuFoXŊ,>9JҌ, axӣVh` %&S poA.& ӆx}"|±̡Ƈ o90^ЦRj $\ʷbY [K$67qڦ%{\b t Ֆ'Qs%2%R?p,+8 &5 lP7pكk$ӎ=V YVҩl15Dž5J g j3Rknn(_ k Q;c8!TLN-D&'SэtcUӽ߮+nIVGD4Ľ͵43݂cPG Yiڟٷ-݂Ё۲d̝ #v@ZU͜VaR@!کXցԘٞmI@.ZIjṙ _ع!"'evi̩ӏə֟Oʗ*6 `Ԉͻ=y߿4+@>*h  V U*q0 c  G-) QB/0MHf j/s;sGuE,-k_Y0" !8s*C)ULbHC802AԌЅ{ .\u-]$΢c٘{'+f1.# -s,4k"?(YLB  EmVe馚K]aw~I6ݨ['"`#XΏN0HRlؔ?ɛID ]ҭw絋-δb%lý6fܞ$q3׺80YɯeԝBĐWٛS5U͚𲡵Q+I-!Ryg8:H04o 2; 9-85 R.v:Bi"$  |>8cH[3kO 2 ҨEg %)UѵxƘ̡}NW٣T0ʦ;fKcɅǂ˓~8bƎ*qEN6 t}g⶷s0%|HU=ʻ\L(]ٔ bl":sW mF O`f_<α]lsDQ cؿR3/Mܓ#u҂=!! s/<x%) [=7nDo?NϜ%$\I΋E&] CEMUpG$@ٻХ=ݩYϻݳˮ8ޡԦv]0~ [H3#4߅Ӂ! eڿէdlZٳ5+ ˎs?ɆVlb:K!~4Jŋ6Lؼ"K3i1(qۑet ӿdet@ {Ɂpb (6)3v1 P.:V3@LInA)cQB[ tY9RH ^]Qr~to"JA;*F3OQmF5NF`1ҧ Uz nZ1 VϸsĠ]ڽQ9em; # SqS=1Tr=߆w"F]B5ԺJ@y|V9؍Q\pb_9.S~-s|OF߈h4TrgOӡu:zڪƬ=1; X,i2+e':$6ay` s+ aQ )$ǀAٳ^pģydە C 2Sےl",  C[=z&f@!}זϾIqԣfpWF9Ǽ{)##()l ZMy 'j|د+W"3$V!`Tp 1C7;0$)v $N!Z,,I9pC? q81f3a1 Ǯ).4'z%=/)5T &T  rcR mmۑލM* L "" _"Mrŀ8賮'Zu ʅǫ ҽśQM/PĚ Hb?t͓x$"@}n[7¤ȃ.HǖƗνޡ[سQ ]K -,6=}0$ "r90.;xb6Q|-K1k+2!G$'- x#220b5%1# Bq64F1JQK/=-Q8,0.0 TjAp)^ڻb=Ҏ=@j6ħr֮<*hȱQЍ%w;@k 1Y%!)̒L!ЀI-ը閼ljĖN䑣iJԱ2[^SaUշ4lP MPIpJ*ں[ڍ҉qjqX'#mt~T1 rH ]'W` 0  S1(;""! : !] FU`ҢJ7(ٜcJ.DؒK`},Ѷֹ>ζ_РJ_!`}Uo b ".e)$_)xtr#$ Z'S!@nOc z:KV㜧2Eu;@˞YB!,c؀iUQ}ʆɉTDž`Ά ]4N"8s5IU #SWQ!$(!r!Y  'IB0mQ Qgp׾A:ݳɧ_ŎI.^ 8ϻN|R5]c*ƹ*Oʯ˨=Ʒ .̛-(PTc  " U 0mU $ # = ;ڐΪdb!"MEPĻRISd} nMygXE1 *1[C?i=#46>  Eu?]C&LBɆA ^C  -`0֊ܝ×*ΎOUcxKGՈɲ# ڱ ӤT}w˟9^t]b܈q9 aϾӤ889~\Ҷ\æ޸;Ǻ_Bpw^Z4K~߂hMc 8ݒ&ɚaB߻GFs' e.76.(K+? 92SK K=7#$,72<(7-{Uz#A/L0& au#D)i!?O6uN(} + #', m;7;G;g a6'4&"  5)59=y&%_68gΈw^2V_ޙ ׺g̚3]&@^[|@Ѱ̼CJħ֗sonZEۣEҲMp) 1kV~Fk [CnYM(߰鮌]ӭ˹S^RϳRa3ϭݼ${ZòGʝڭKQ BeApoI{ Fa#  )>ABA46j K?isco[=QfJ;I=KCR]O=T:DG89hL,iH&lSQRHM< U$h| Nceyh/<~JEhH4{&g((~5ײO jd@JD3Kz@eH0ӿ?7]ۻpJO %04X 猽EhP^OFdTip ϕԞԺЫC,p!CcC(gٜC؟P9 (N)H ‚ɍ(!2୉=ۀOC&rդ{À\ܳ":56 F Ckԩ|1` 忴Zo)0COčƉyES~3 a7 D&\!iv! x5z}}ȯ7F?ۃس̅! _I ^%6*S( '@SM޻$k ) c F1ng W;ұِю'J>آf-&q5ȷ{~ϻMn#еJj,¶{> #ﻎ82Ѹ]͹e&7Z~W0\2f31rM Z WwwݜԈOږ8_鴦\} P< pزC}} !f !*. ws\:.|{i~ a ? Ci4CNI I3;0 NRGL:ӘZSw> +&9 3&%<46C=8iJDL\N* 2:*  4)F؄ oVf8\|!uiRa29ӯIو;P"yC߯@k!-Mgh /ٸ^OұܴRF& r1@ܱ0zߠg!IH8"_8wԌы&qP`rUmɑƯSs}oFe]_}}ېW\nJ H W*Av; ;  !5  !y"2&81% ?] bHp>o!,$ Z f#(H$M!$  B  Y(/94%_6t.M;7f28)%E #)1@951 S"#+`)&[Z3`9%ԎBwVD;FaYr"ޝU` (zا¤ȢcɁv3¶K;pԭ@ePھ`ѾڊO^uպ7"H)%eմ)ى6t7 . 11W%&.#a<q~ 16l#5:1~GKL-a֦X( 3 &$/ #^2%[[R۲{m+Iw5ݽ٦O#ަ 8  {C8&x/]pծ׽ƀ 2TDp"7Ϳ5!0 AӖb[?C1ԈJSL;nٻ|ʞߕX7څEZpJ z >,q)*3 > af(#1**Q o pEtmY%r.֔% Y a 6! =" ""& iF) JD%m)ٵ|= xY2#XبZƛ _1GU)!T޲d]I,䶷׭#:>T(vTޞW)Yϩߟ*N!&݄%qq.y0^Ep'tc Ϝz5\vnϨҦX7J䇗ŒJ$T L͟ԙ 'D؞^k)ݻ(ɖͰcڊѥAˎ,@w_ϲ޿K׼Cڴ VӋnZnJ Ѧӿ Z ْBܜנ$6;  'lSPsd b>ѝw󹅫U:^֯ä,{IpA%ئӮW9밙j9ד!f[˕ʧԦU?qUB@Yy۹ۦl#| ǟh2XuPK" $ *}`-.'8!y241?4c0,'"c"" L L (&)%[Uq9>4 G,Otڊ|˶[nե`\ԲbQԻV5޽?WW gʐCc j;:#[6,W>D2?ߘ! ^"kZBԛرMƚ#\ p"Y)  !~/S,i)s  7oj\ +k | YGC%'$ ( wO K='c; @* Uud0ayۮ׵D-ػR` x!`S,w*!ٙi:ew7̹ѵ>pYă3˦}apkTZ f!Vo׾ڐbLr?!`סJ}λӷt֨d򵘩Xcȼ„i hSڄ2. uZk $ s԰*p|@lڨ5Q&[,"'T $'c O3@)ԅIʼnW׽ԙQ|Gɵڮm۹zPDt pܹx99" 3'q%* v&/y.y6ݷ߈7J:Oƹt츜a^KjSĠɠ>BQ]'͒;+?ԣ,UJݧN9yogGþ7GQ Es 8JgY KfWEnI ` DK&\Kp_Ӻ{ qZJ(P31+`"~ĸګ Q-K_u%4)R3k'g_g" !T&]8p r MVqR͓IӋ'Ӌ-٥F*д `\߫ @?T0I;_ߩ݃UX$   b(#tIf ,Mg=Jp' `+Zj 'ݸ}F=;3@ɊJP-n TbJWudg ,DQNR&eӡ ]5>t{w^Mv٪6pٮ*t8ܯW"_`i|z l ":E!?!E -)69{< ?E@NJR VqP^RK!Bo>11(A$V'^#)-""Rk ?3Eqgr͵Հ9u# $R^ N'Ab!}#޿}LSF@Bَ܉lʸ|;B֮cM"MׄԑmwQHЧ8f7IϰuP86.أƳ dעƪ˱?X-bC3" Ty(PohlY=a,$ z , l }"J&'k!M##R'))0/: 3@:/>6e')#a$((.0316^094#83+)$&N-.55-:0 B Epp!& , dm8JMC4mg &r h?j :CbNҗp`a!MA"НѢ˃ή9(G±nJtϖsȬ *?g;0H۶|. y !(H T jFHB46K=$6 >^OyWӥO 7J20JΗx˴ چȃ_%~ZxBRDͧѐ\\  Ni]f JB_}'] fI u' fW/,}C?)ʹ˜3TNQޭZ~VoyOǗʷ?PֈрAzڄKĀ2۴X`tk֜!΢][¦9ŝ:Bݼ(~!VnqrO a7B 9&1!(7#j!+%C!|)%w ٧^q tg_ɹ%8% mW^`_H D t)>#$"461D4OD;SSEqC3%O+ '&" `Z !D  $MܟΙ5dWW`P{Ɍ#6ƭA]>R@"r1dm YsFඒ5R3^J"p9= F٭1g 1^ֽĵڸν~0ѲTd•_ϔspCn_^ƈ׫[di8*N>䨀j=``լLD,jԸL{.Ws"H=pL * ,'6.%T n& ?'(h Z #;%=j<E3=E+ 3}$o ~! ^$*3W!0&|l"!WP 2 ~f qՊM6A"Yo%(!%?"#1:4>G/C,;7*4(B1 */"p#H pWLez(߼X~ψs/f|hѰ lgjс r9SKʸZ֙T5v  F G 8 } ;&$g'/9 &p ) %_>u#)ߘɯњW+ņucJUǚZDsɩ>); ½ڴԫE8ɶ^B^Bke Pjٳ{Nηu;.m(Ǭ^Qԙјڠ%܍fޤs?I` ul%g 51  m[HJ`"4@$HȾb>5AΫd==ЭՈBw%o`5!Ko[; 2jOEG/D;*5y-"HZ   Yd RcmNgy3K $;)*OP٩6@aKߑЀF?3z;T%XXÖ}֭*ݦ]T#ؗ-Y~cŵhԳgγgGr&4qӰā 4ӾN~lZܹ:A_lytwe G^vd! >H" 7)(+)-#B'lt)^X<$!_C/<54 4/,O6K'&C&: )Kmp { #1 G$Rjokq4XsLg _  $ $%=.5;8P c .  %(!O&[^  ! "X3 Aqf/7mG=DDChгķljvdvNԩ9Ͻqx( +L'w;6Bݖ ֲϭϴ!3D*=2ߨ)ТʹUu7Awy$r\{;يW/C5W /:tBym3qW]rOt!*Y_C+Ջ̶ߕ"X9р~KQ^ƚ ]ܮt$[5=}9ݏ#2M } FHU+ZLxһ)U39ڶd(pͺݞͿڃփ <%+%#8#YmRQ w; "C$#%$%6 9XCSbrunQ!B&%" _NU%z2ߌI ,!M&Y'ew<` QJ W(52!r9/"isqIp q) [ph: IfnVL?.$Լưٝml 5ypG о<؇Zw-fԷ Ƴ¸7QXF/ݳڰݨ_ev4՜|ZT\"^׭ E.Si&Nuր3 c)veCMnO G l}ag}K]0_&6[-F8d2+<&8IDr@G'B=5)g w-u !ۮƅjµת`c?ur^R VrI3j8  vq1w 3p|˴Ĥ [ޘ,H4Γ̖Kp u -? r69'eݹ}6 Z7r]ޯEt6Nu6#c cK'6k۩Uy[ t>jޗ?w Q  C [$e-">097;2*|1'5400" Yj"l&W+{.&lOW.L nY 0 /qkn>pB!I+P %h*6f  ~4/&#|r ߕ t]6DИ֍$ԿѼ˛2+u3ӆvNݨޒ::Ҥq٦' Y aFK_@͇ )ĪDֱoFbϙɹS߭Y6 bpeTч#Y׹ȡ,Fېnͮ “X*jwݕ <*SȊ$'Jcܨs ;`&hh-G C's(&o'"S "&z!Z  !x&+":(}q juK;~ ,>Uq=2&B.* d-2;8F,)- N~ ` ^) .[p 3 :fB _gJ pe·ƞױ4)c[LMSojvɱNП{uV]u\gѲͮLվ5EdMp.vىCTܵ;`>v͙˜Ϸξl 'ܢ+ӧUض{n!ЏyOH˖zƴTo4Sݒ)!YGSMEp#1!a64x:'35"L6d'@02I?KAxKXD8MNQZ[wb$f_cJQWF6L EA95P$J13401e7() ^ n .RDГVӌݙA4{`ւlʹows oOggKg+R?$Rx&lI$X ~`%} 5h A3]t_!k& Bz&%`.̄gϕ;ɤ! ;}@2cقͲ H!ۭ . mSӡ@Q0% ȼнgk3&2Zk:Sj.z_!',(4\878,T1e!'-!$xu k fNQإ҃ٷ_jډ9u-# @DQJ~}ZС%2=   &> |h x A b !  ; gp+SbϋjS}hrS Ιj%pd~BɢˤԾɌƸQz՞L|?JK¹7nʿ|:7UL'܍ì >"%q\Rߓ$"+Fb0,˜ TΪܧe\Gn˄Iٳz@SҠP'AEhߨEЉ v9W?Q 76~<N4 )y'Tt f(%ud {,#$DA|! J *-I;*"vOel mF ;osQ}`U["ݜ;$ۦstJ@$ iVMo* 1 d*@D6C\ɩí$tm:)bF#mՍrԘ_քȾ9 ԝ/%K j`vܜK:;ڃֽt!A6R.859E" _ | l#53eT84,+* n8? 2%tZSEB%b N e D"% %) 7 6hl\z 9 P{'cscqMߎFvF$2@:`&)lOo,0f92yLBx|{n!ڠMk6 9}qcKVg0OPNs'~Yӹ-ךފm9  [ 6 RdTVe^s8Q]ZڱRD򮖰&$+<$y̭<&ȜWÞ|ɋ8,˚yΒ=u]ɰ7vϫSϜؠY֢Փ;1g60 2 kn}[V8 t#<p Hl2 SdJKX #-Y/1#tz T5 4% z CK.<(@ъ UϼǤ͉̠^qJ S@N Za 3u.7 %  ,u^DEAA-ٟݏU@o$q.)eۀZXX]I =ׇAϽ۹=d!F}d95$ Jc":߳deON~?yn׋AζPp֞Ęk,ǧп##jӨޟU.#`zMf "Db:;  '$s9(W 6, 7*4$t{so g  |u jy<56N*c&Z# ٶ'Ӿw|jIVFgI֓׸D`[nTR *;<Ŗ5bֶf٪wй҃l*| 6ߝ_ E65[߲kd 0JV  2C k|H _ 0\1D  $";5^T"pl<΃]pмZȼR6ɖ*r;ff{-rH ѴHmWߥlAީEtU%È{ S̗ ϶sй|̼6¿޴޾[Ra7 TcT+SWQ#)zوϐҜӍ k#8F7(8 ;273,3C++h,zI&k2 & t h J 1c )T&V^՜̆w&ւ:[b%O +*)9 E\pK  FSw!fTΑǙՃσ+m-T9MOՃϟ1цҊ;bUy b,{?}Hn՘$п֬Q WPE @ߚxhx7[;R*aEivvZdDSmG콉?OwW7 7_bHp߿]S8`ۜNڋPL N-%}I)D/ (vRe d+ - F^ ,w1*1-@.7))x$;" " ?+ H _ ' ' C CL Z0jX6+ ' 0g i 34?#$$#P] q )n֫ ׍!J@ZNևU6ރR(F &Ϩ̌ӊɖFב ی؏f޵iX:zš(xLyKU{-v*3VcޅJeEI1eD!   suL XV_{   J A9$ )^=$ 6xw+2'B9 W kq9G$#$"'=)#(+&8&r"!{ a  czg0`<cDFԎͺ,ڒسx4 )Lr=@7/U u` 4 u D $|DުIݜO6= .5 K]ڲ.:ͺd́xqǃxzUd;^ݦ#!rlK;jA̟oݵtؽG>ԭxͅʐ˄@)Fs@{ ivVVF+>)% X Zb7ҒS8ڵA @4 O MlFH cNW},!G0!@kl6B 8Oe H Ue+"("X EB[h1tr}<etD$sկI] (d)Ftz[5 \% !" <4"0= O_Dw"&-3*"*) #j 1 Mh0Ng / ,!`H8' # Tן:#вpq"4_xJْٮ+.0"pFP)2IiZɐۆ ѳ{5#gOԅcψɫ7 c)Ī؇ѥӛ܂VQi&wC»Ƿ$3Ͼ_˔߆Bys;- ]n̮d̏xg H Ux![dKIXFK. aj $!L$M U,(E24";s=>D:Do-;`1v(a!Fn#!%E*D./$0'g5i-/>{6Fo>IkAD?G8c:'11#B  v  " "O!"')r+3+;'?!Z9G}-$ k ,.2<,T#o r y \ I | B:qs*!yc  oZt4|{݂eH4Kz'82bs,s6݆ӬgԥGّY, ?zD/1jWT ML?Dwi)w[}ݟNF| (!`:s_o 6d_r A q27 q> 'N Rg 6} t ) M 0r *Fxkq s By D@QT ݧޮh݊er!C -QZ[ &ގ^إ6.% R *& 0 j#DC|sQE;܏l-hM.!X zҰϔޛseC+ @37ڃzt̓ϧPxuutӗΧ ۸̷] zRڄQݧBڷU> Z; cIsU " P-(S*_! OZxPaRI H ~ E|U,}5)kCN>݀ 3T:ڝ<T, K:Iڲ4Vlm}6ۍ0`d:?'cP.$O̻;ֹԖL;ҒlLe FԸA}}p"YC &z|;Dfbt^ " &%2* >-@+h<)9-<: 4;Q54?3A 0>(9[#;--C4>HEPHB G?(D<<764]-x0'g/$- 8*$ >X}%[*D"(  4  ,$R&f"@4)I w E E?[_Sj>$(+%uX4 ,B}wPjJ6r/H(dc۬NڤG\:*b?"T ph߶Wk sU^؊J(םGi?ʇ#Ϲ-T1&8-rRXkJ$  '$#rK W>@"]N LM8 WB ]p{9  1$&#Ui@!"&F$((%$%|T'8." :#6A{A<;1503.261B5*v.O  z;Am2NLz!)$%D%N nmgG 59 % o wZ,)7]2?86u/}2$8*jd| $L   {e %>T]1^cڨ+Uy2o2rڢۋ7!jTq#\;Fv@',AFmB)vDXa ;peF9l`ކ!Kѳ,gә |G$o[8)[ k:1L $g  /  h ) f @f&Da*g%GVI Ema\!ƪז%Wո*idmMy@)q d{,  O ,=`S߽inԶq؟y?S{WٱLݽQi|}ry,Hu>"X>y[ O+4kDt a m "i:!rX0 AiOy9 P MO xO  C P a1 ! z_ZJswS+oJ;rrPzT5bwiG o`޻ܲuKF|RERbtZѯջKvЅX͵cr7Eժ?ُٿt9}.O . _O7Ru]-u a qA rs %uL28 pC5P(" W /_!" %5 fA =r  ` CF C=*F 3w!x5 <N  *;spt}e{e3 ύ_ڋ:LUySގ7-9*c ~ [v P)F߱(OMO*7vZS9s.yѝ0+܃˄!NbڷMӏ[ǁהz׃>6 >sBuñ֣ƍմݜ@'bB"`Ƅ֑>DR )9&HL;7 * $>6&"L | E 8  M[E Ih' 2[9N9u2,I(`"&@"&y%tI , RmDQ  b V:` V!u 1S1jgS@  X  iI3 & n# 9Nay wqB ؕ?Llnݏ{ۨO~Gݑ۴P6t?3x|(ҔZLRݰZ*ܤCS8.*OkTZg@E@ '/(&2A-2F-;/%(yX!oX %7!g(#*('"M 'pa^Z]O4pS'vy * (A֡G..߀N:i Xn#E-v >qPV3`yeQkfڼjˬXê QHf) LDETQp&}_v G?(H2"74%}, (~)%zlm/qT~ t+(hl{@lYK"زzTצUKR UmCW|bE5! !M  :bj?}%To( t  hJmj$Lp8UEijj/a+hI?YI.> SGDZHAUݬ߆ =qD8@߅'*ՠύpޜii 0 S_ |L,|b$f0W # f  7y=B CW1>GFA J U*>lSL2u`hz9 u,wnb 4(l/D"z0#n, &GL`W A:O  \%"J*%,&*A!*  47]q". s 9  pD 7߯*lc5\_B~ܰ ֮wR}iEʡ%HƝ;˨΄FȉDƓմǛnԚȠиʿIbgrܲڲR+U٘PwفT=c_.ϘE]շr{WB}˾{P#}7Z|PIQ vR[O{  i6r ##U$)o",!+$ '&!$^!5 &\.W!3&8`.>6C 8B"-a;w3/]#/.+j %"%B0!":)#(J[C % XiY!Q.,LIPf? *l= A ^  XOE2TX 1rra>  *  ePek "[ I 2j Oe* A +)m& 7U* fZ$tcZe y !{ZV ڛUeCΔ֍BFXߛ\;b!6 m%H<VWڭ/X ;db3GZ)XT/~,2ߝ93Vs@u!(*+bU,\  n' { \s' ) 6  kM B  D[5 6 s` y޸<&h9{P~6|7Ζ52̆-ۼnJ zr c[<:k#!Y+g  q^ZN` J%"X  j5!K Ww#b%|#_'9K% #s# ~ ]aE462Gc iT kC$^j?!O$")!)//0.)j'Q ,8 ,z @3_lSpq։aXͺH{hߺvJtN2+L2N~U':m4J v?Ide*uo"b1hHjzt4ބ`ۄc]Ba (?{}:7 HGO#r Z 5{  = HB n \   `?iMxX͐cWւϋ9N*WlA{qؑgͭÁCʓ 37f2#ñ` $ҢQ  3//@kޫ۾alKP+ ` g!:C[ C}ٷާ`Z1xV J C4Z  /((s B\ A^%*' QE`  dG_k">^\{T=AP%SD\rg-D5%r dߨԨͦ>Oۚ&O59# tyBZX1&Ir z[/k([D  % *O_-y(ة-۴ξcރSEe#k&{WޕF<((٣מڡ܄Fںq;ޤF=:kp"+Ylю~غ|܃ٽVM &` r ciES9W2w8s|rl gP9~C  'j$RN%&<@0z% 0ٿۃ!YFRݟ{nA`98JXPs)z9  @2+<k * :  BP Ri7w$  g )ea0%]7Ld6a H@z nV+T 8@J]` AW w֯E  Y91;qB  Y;U iC] ZHX_:,jW)^Bo݁Q{ۺ~ beBD?eDs/. C({ӧȄb<c \)\ ߥdWDq,"Rӻ~֦|.?Kdm_k+;sr .޳ ݪ;~ײn׺ׄS؇؎PxG,8tE2q>8N.@WK[_QXgUיݮ܉K3YսFjRzӓNW֡D.S<=㾥&5$U-«ň0Ώ8cw%S3bڰ_صYʾ!Jܽ͵@VOڵ^u)5`Lb۱iͨѕӣn_أݡJ%Qd ^E u h+ZP [ 7   $Z^\@Gu.Nq"X V ]sZ nE i u7  z- 0#''l!n)W"]J/s_ f]n$ \K 624 ;4\ci   E h./ZM " ~5rRG~Y:U i*?  w  A@tݮ5l#bB WocjDh@Ml܌ Hf | Lflqsz9\o9D [;*g^w{Y{A}$cM,JfM/T?-XڠOU=}yӨԨKSBҴ`<'wߩ9BSNb}_CqnqetnD-ߙ>ݵ?nӁxhȍͼ͏DŽ(Ǎ$th ܇Dl:?LpB } J  {  'y&b~ nw3! F {,ow %Q+/.(d!(##[""&$$E'$($"-&4(X;5(I<5&y6%.$(T,+ 18/8[2<4:x4x51p1+.&x("_^lE.  q  )$ [ ?=El#_. z0xP&cjd۰ص#۞jLGpl5c)tC/5aH4?!6q۶C6mԫmFr؆eK2u>a YRN} GopA}s܇yRղ~նxڡ0iߞۋ^ UT_QWG!26/rEu ~L"Xi cjp lFwv[#h3?_hFA{%PkxQWD ,;f Vސ$Xܛ Ea =D/4c0qX;bNJ۫ڻ5jeg6؂ UY*ëF;P͆ ')ϳΈYRp߲NSb"s >wx[OS=pka\d~r ]s  rAK @ 0 }m a8cs%L NG/Mx^[q{|߹RLg&؊~ƽ>͡oǒnԋjNyMIBOGEA0ݎw&Өܨ׶Zڟ"xfe{V6zD+*3PsC& D8/ sAx / 3 t F { b 1&IQ 8kd5~X@4:Ux x -`;+I j{d oKRu- q o _ݖY߆Xe_O$Ӯ̅^ߺЮRԬߋQ>w/(~dc}GU%,}V(mI^]E &|`D LO]TAFTAzwA  }ZrkY!In1@  yv݂JJW\ٜrߨ.: 8OlW٦ɦK։oe`՛¶]oʮ.҆>^]Fsu/a-Wgٌڀ޾ݭ> = ?{T@ P >   (9ETT  P O3 4 ^ B-*:8\ 4s Q e  VZ @K 8X B oy sboNp^tq*D '#N!BR' I )Go^AM'JO81g)+kG$Vk:Rm.E-u&,z:Lo"dhSq&y^Y$p(~TʮkVE]396vEwo76{ \onVz7ˇ\ϐ7h(Sܸ5G R  Y " u   1 _gIL^s6xVdtq 8^a5#ڝߛ[ 1|BqnOrZE  kH Q F lj I\   o  t  I UU 4F8  OK _ 'rt " L sTFdr!|zrl 'G sH 3 . Pf=>84\AF 8  F2UXzG>ߺ0/W5X\\{o  w! <$kXK9$U!"T-ilq/J%Nd)7(`e#[>P hV.&:{WuS< J>Q ,wvGk  .]aBZWzB`8mB@z@ l 6 ? @ ^ A O C ,e^ r>6*{8"(m+ pNlDg } 9YVd: x ryi F f' _D4oTP8Jk6&K 7Gum|_-٥r"4c2$К(q߽Υ:Ӊ d7QظILXۢ7%?^E&:zB4!4ևw9 ہӀC)Gbyrv9 v$6+L*ecdeui  5 6$ 9" r'(%^!zx   ( )  ! (lC= 4:=?s\   g " U2 M :yvL  ]t 11 V [xs.@~mB 4 b  F .|HS>wE&qo#z_~oI8!j?s=oTbA/7 )*LAA&~7#^s9apHF d !VYps0ݿ>QP'#@g D;ۮca ۘه_DuO8e_'wGj 8L)_b!P`UL? 7    YC _t w  esea a & \ F !q{S,*, !{!J9x:}do 2 2 3!WkUA[Ko߽v1Aܽ}O2;uIXd0Zx xqlF(r7rFj+%xp;6 =M YWqZ v@-4] wI ! z qj XhB; 7j_@5    &  6I  z8 :@ .[DuB_ ggU(8.V` > " @u XAn.V9TL2 iu=NcfF?[څVjҀHЛʓ ؚK,Z!EJ`}\n>l7_` l>MF`Or# F` %(L#+N=P{ uZ,iN8-O4O(.[@P[.ldbn zT q&nUja`   9p3&Z7lH}z8HPS6(/3q Z t]Z\}qE ,2r>6DXީ*{݇ٱ0ދڧO q_dyvߤGf0Y>"^%q(!$[jyX8THf79m(v{p ]9W*&q,U<[g0nvgd,D8 x. @ v6qG 7 L #x z  kB Oi 0 ~ d 4qpBX(uc%W dMWL_+ #]7/)g[_ 7  BD k _s14 n.] KR M_D?;c,&|N57*;8m<2PMQMF8 ?L]V 8?~#!` 'D"hDQDbqnsԴןk:)hQ*Tj|5hdL k>   Sz=|BW| {xd I+kWts b 5f/>X1&7RaQt7xlb6. XE|0T-y\)9$8ׯOp>0H,nFN&\p })\ @cwe    $e KExhh. nw:b!P5 %NW Yw}&HP)9$C_ HR0L0faihYծثlVܔ_WtocܹpX7}YoؼGקӦמKԑ͒ΙZ؎vhTCHڍO*݊ڞLo8]Q_E1w;\9B ' t lJ]qI0;%CL{ 9_Rf `#' )+:.*`1e&1!/KU-,w--F+A'D" f " $~$N<"H@CF!!y##9%'R'5))c+*2*"<,D*1FA5C6y@6^>d6I=+8<9 ;D:278/1%'o1 <h/ tl'1  ([)Z5 <!Lz [8r_5Y|~56Y׭BП[I5̿ͮˎЇ%&#mxҚeW؛ ݘgN;v-> <G%2qne>W+̰1ƄЗl;} 'ΕӉnҚӒֺLـ'rmtK  x j ^ 57'E\WBA"1`m@ fT o Lk_Kx m z#%'n&!f:E9t:{cSHFnOL9)kTpLT 0EaO <k[l543~Vov[`biA߄_!Iߔv^ 7 ҮDx?)xcх=ݏtLkpag5/it' % WlzzA !6[Ce<0K(-Tn/kr.jA!F#2j^ -Q Z d ],Cr&T  79 m#~(+(C,/*2*~2q, 0,N,&:& q  1 _eI,(#$#N%((!,#&e0(4S)?8(9(7(0''*y%S&$#$ "TLg*  b{  h 5 ~  < \J  z dZ  |#d$X"U!  6#!#Lm{^hD!ֹ,МTĹ'kƩ goDάw*HhBZ.LAQX5 _|ݘ!Caݟ~js輵&!TZ~`1̟ƪTҸX֧Ԫl޳RXq]$,SJ4rھ֪`\s+VMyO&etN ty!^E3fUb } {qmi]= ME9$0 Q W 6,6K& f a   h .nu-- R;o`YBKdv5/<`)2ۼ݂yhJr 7&ރvѵUԊ՘ݣ0Mچ9hr ѕ,_K,h#dBfuU(ڟDؓwK/Ipoq,/~/4'~]xQO%E[J8<B < ^ =      5bv%ٲPkh$PܻKZ-@Ա,0ߐkcEcda((F M4 ;a 2v5Iinm40Vڬ7Y7>>R z 4$ *  `WU|<Z1  { ^ ] h ~ - n 8  >U|42% Cm5$  I  P ( l 2 '  $ D; V 6\ n[ !F  m} fnWy\DS$LBzӬGly '~}.h] j E `   dߪحzXJiDUaֹ͙Rqԩ'n؊BVKk K={Ibtt e &$V N^#ST^Yvߣ1'@qtށxMޜu^D92 $DX [ cc 3qbD s o Y > s:o1W.<? \]J O] ] c |!l ? Q!YK uq - 68gfbT}p>BV#N0t; Z  5 V+W#|[$yvto2l%+}X{5rEDIj  >M  . q y srxKnTm6&_%!߬h&FJa `Le4 Wf2 P3U0G{K& J  y  N u UG# AbBDg #J~$9#z"!HD fh'Qh %  KwD+K b!C2f/MFWwN$_d58d'AF|3H Za4Eb _e5#h@V1ގ6ք[ Hmׄ|o|+~3UVN^1Lre~-6RJxLN~C9 &Q5p! |: %CQAY ( eu # 4?W{C.z5pp a2R6dxؔ=MFݛ< wCP$[/_P!@Y*tL[% 7.f4ڗPݴNTejpףaiٲߵZO4-;Y<["]$ۤPf fΊ9{ü&{TrCyt̙mbؼlڂ̛ʋ^XOqPDy`P$&yr Qz[A^P*%( .Q R  "@  2  G< ?i&uF5c C0q*]J?2 {zg  ;[`7vjd5g2$tw++ku\\|8D ٟ5ֽDpBih MW= NON {  M w 4 8{k K  "%!A$='!'# F##% %"$J#"=#!""!6"'h:R%2 ! n G mf! /  ^ k z  T $4xNGY^ ݩ!\GqS]pY\KyDL|0ڷ BaկK3j7vēH0Lƣ+dek3ȹʗtU̜ATQV{WHW]\BpkOږ;בc؝/ڏ{a? $jޟxgWއ o:9 o ,   na  "D"#g&)*(/x&d&^)!,y&.7'.%,s")"&$/$($ )(=&,c#* " l Tu pcR0uS/ Y eYC NV2  %SM~Ke?*  D{9k^mL7\WRrTH CZ:un7 skft  !c+kӯ7ͩfޏ:b֠ػ Ug@?3< J0Sy2l!ܦ љoJ1ܝҙӠaۉN2ϝ̥&Գ=ܶv*d(C?! VHs}^' f UEkl2$)^2`b&q{QN8A[p(E A x\:hNBfD_A&Q3FPwIF "B7/pYz0Fw'q  L sn1`r;&\!-NKC+ZP4' /__6H8u.n7)\{  @qKj h  p JN >" 4S >Lo5M+ gz =  }'q3{/D nlܔw:=c-LMb<9yN{@׮ޮ4ρ~{Gܻ֌ջ*.Ѹ޸ػgUy#Y5Hް06w-w *J_ G V  B O < xJ ld1?4!&A#*s)- ,)0,1/3 448:4]8f22/,+,8(x1%J6%9&=!)Au,DC/&E:0D/C/AH.S>+T:(8)7T*J6';1$[*!"%%I#kL$&k("' &"  ~ Bg)q~\iG Eq aT_LweW;>! PN qh s[   UqrN]S@P+K< ? i  t A y  o  yr9  Pz VOPfp`LўOѕz8 PhϡB\WgѱQOӴ ҴlΣEѝ^bv=:("E) bR;j8ASb73tݰm|o-ޟCظ4K *TE\N+H[  < !9$!#: Mx q2gIPvIIHѧQǫ2PCbҥwݴ,w۶LgX6ct, ` z !0/ R s` ; D !  M0X1Y MPF ) =@a!% ,!+10$2i"0#.^,++a*#'"M|WoF4? |8Qc4Z0ܼ۴}߿o$+S6MZ6%~w/k:K  30-|r ^p~ 8fp]IVI\k}0dT.sKd`r"*91!3(2{*/:).)q/M+/Z*U/%-x*\$  .P e0,a4~p1.#uB' y v q_ bHY z #'R)>' # X \  E CdVV]4}XW utwBZ1 ~ mio\7ܾY}mmkaI   &,"p2|D#U[}S׍(ԚܟԞRբդSN,u/ˤ_3Һ֝:C ߸[8ХV̵Ƹ.z/ؽܽk1q{WM6^Bt#WK'4=@&+K'AsaX6O#%Wx(;49?3x   U:u) \z;',G6MdZ@>g >leF z#S72g   /  sho,   RKzmMaxhӌ7GΘ`* \J̚&٫֍ص31mS )E~85AͩulwDSbhOhʬ tae2S|7фÌŁΎu~څԣڕO.߮ 0K B64  {[E C 1B  urf7 W1  )R R ;Z ^ ' ,%2/U*/,/K,.)-(R/o+3Z/r92=2=51\;u/8.5G-e/(V$ ORgf E V  Q.R;dEmEVMGxYYz|u 714h_i3l9C8a߬ kVU<)2U֌RR ٘ЖiܦҞnv˿PϬ+ $$'1ϩǂ̕ʄˠp0=ޖNҀZagB߁;s]JgBBWei|lnW5f G.;*9iI?EXc  o( |l Bl M>kM`r$O3X.EK$\Dc> XC! >v\x&G"^v8X0Eޏ=jg;0էh׫> (^ 5)yf:ؕ*װwfϠߦ>ѼeKy/8f-q :qMj\K>v QvхBʧs.̗U>Rp2>|R3{ ^ U[ y "u(0!5'4'-"z$$0R!9a#')8)& $I@%f();#(D(a )"+#, #-!-/,)@w# 2"T 4  / j  B {\q^b B/*t^( XoEũɿ'g?̪`|Aqjbke'ǜďvwz̍Ylˬ@G){lk2*nkP?,x^R{g(B)'E[NqJc BG  <  @[7,Y  bG H ij %H nLvp~+w} \l# PacCk.Lz R@L`Usi = o q )@ ;} I  `KYG_[NmkY}^/)bޤbܥ@:" R2WK.ht[Zcߣ  w r}@q6wkp]a=lؼ~pӁ@SP[oc= V-YNP<{rP|U`W d@8g+_'7S 6'>*GYQ](4߃yWbW.7BެtUqt%pi ԕ. ش1ڗ֥ݖ2Xoo3t(/e JS"M3A6ܟhOؽܙ3&`E14T߰3׆O֍Pܳߙ.4MD7%g,aOڛj=hoI߬h> 0ֵcI9w YA{чJwٮaBۘ7h(w~]E@1@tkNaV 8L?!%?&$s!#["%#"#k###L%0"P$g, 8Z  0&!c'd,G/2{5 r8"::#;!<=-I?=97 632 1`/-<,*&x! 2{ef`~3|]")Pns* !Mp[9$g7Y/b%|hԱ٦p֍r֮#s izK.    FXB3t +a )'% am9ub~J/?bزѥHe9ωYЬؒ)2RQr vLa׊խt-eͰyc"ݨfۘ՚Bg{7K%׍<#l\* ۸zF]gBqk!3 ?ٍ׵ܭ J ; $RF܊GE/vfcs>p#'j1ih\xsiX>2)(|D^#'̷w6ћPDCX,̓|a ʓy̎3Lr-ڮ?SKozHL{[130MG2זEڇڝݤ#Y](1Y;XP:Qfo9D*VgUUhH` @4  qTr#o8N"T|'s'A̓΄ ) S{Fӕu A='q_KۂD*CL>G(jx7CRDt3x 9 _ Hnj ~6 > z4&9*%-\*d.-3-//1/.1*($$2q##F%'ny'%P!G !} HmS  ^ ,iO   Q:E@T-:+$Xݷۯ*;v;ԸPC[ւzM:a'0w[3֟ӊeN׈ 2rka]r'TjL{KPծ,0bDL`21hZtF/0ou4d\QOBFV!a9t<(2,ksdgJI,-qR d\! RpC, ~TVS Zw -\De   q*3~V 2&6 V,aaL^ o2QO x d<8f)719u x v = s ! "P0^sT J  F &4^ =2(gPih?b׆pӦ޸{զϞ%exƼ{<#uÝęƒǡ˄˭ќϳ}ԱN]ט7;ډ<ۆ`ʾזߕw{1՜ifؑZ٩҈ۿ̓m ۊ4ҩ/ҟaӚъdѢ؈ђ"kZݴ܇\dyMz :" i "N 8#G#t [+( %V,/5;"9:#<&+>Q&*:c!2 )"&\G*4*)XF**/)$7}':(9)5*3\(G50$F4-#u  X t ?CNA>dC d7hvxE_F)e7OM|.Gۣܟ'I},Dk^{תDգ͖яn}Ȑ-ͨ͜ωYvW?*צ"޼VI&)ErV*|Fw %wSJ _oZd`3";=GU_ 3Z=iZ V  77iDuUMk (nP݃kfܪwެE H3`+l5K;uh! 1N9bي{J|UFRG:R@әv <Б.mՍv۝խIf:kʡJ{GC'?qO׽v#M\'_]]34КOf m&.֯d/ٕ@ Х& ߫oԔkƻӮǁ(ZIwܤћ]_-bع"̓f&ϫѷЩ~* 7TC5UYڥGH<`wS.Ud4t='Zް,ILJ-j[+tj:`ޓO"3޵$ߢnh%~</ r  @u =} . nJ~`4 {! HJ -Ie+X)nDPX[Tٷ<=@l(Y0ޗa3btl2  rI\$jS q|a"%'m(j(j$ #?  !!)S.624!4"3 355 4<1L!+ ' !wQ:3YlM av7p* 0g*04ns6*z}7}     k`7 V,C(XnW`bf#۸gdd{gȴҶٶڴuoֹb)+.PsCiǝmNhica:`~ܵ/mߓِY>7_ٱݮ[^EܳP!1V9 r}% i/4   Y { D)1 g $ "lt#",uQb\  ]|iN~K !c#4  B%U j>eT73E {d,Y գ,ՑI2g'Ta/cY % =!W*  ,3 $  j} \WIBlVDdI(j<`V*C 6pC v^s/f[S^o*cwk؜K܁aߑۻ(iԋ?Do%ǽ4b9kt!Q̑hpƟ.ƝκKɋ\Y˨=`Л[Y֞.?X>'aߴ՜J֓އۆ ae~+%DeHf\dKp1J#r< m8cST%pZ$ b* LjI#R܏ѴE 8qߜ-vIͷǹǁ<џMעmZKθ˘o˿F]dج`td/vk1i|ܾI^DA"V|LX8sqs\ކy#.8eڐ)l+ޒg0t 8 ^Rq& @p=i01(r߇=֙|ђs֤X[ȄԐ1&9r%6&6(7n)S8'M2j%(&%N$.\~n84+TvF "qHۋܺskl˺_ÒǺDſ0˂DITwQ U^V}Ոߩ}oJY}# 0߶3qȶȉ8˨Ɗtɇ̾ӴI҃t̯|{-ʩC-f)_@0!PӣӨS ܻґeltۥE]UDM}k^ i(b #Ʈ#Y~ٜꜴH A֠1[R8fv΢''Sǭ-O|030W °h4ù]Fc*Dzdbҹîqe֯ ُ9؇FՑ)nI֚ړ-۲qݷ}ZdKTq5-G`}3Qh;jy9Au ߪk^82u u ~ ;. R P  <kZe !} ]  ( Nnzn'|rZ΂Q` ҚTʧg2CҺ\"u3*jc^,ݴѳߦ<"1ilk6By*  ($ I `2W4]DFtVBuBi2!Nj~t,& @6 ]ޅ\x ~' |(L >8qGv AO(uz"  , R T  @t8/4>. Q~;g _ n  yJ   JJ {~ =W%e 6  ) w a{OQ܁T ؉Wޙ;RO:+\ݘރXڿ=YgМӔڍܜl?Cؔ͞ҫ\x;ނD "89*ڍӝֆ֑JW{DkRm Uv _Mr*%R[q,1[y(s%W-Zf {+I:Z"#!7 Y  *H T 6,:8JS;=gUy\ |DAO$/Y+=9 l"o*k6K #5$$"j#w"dC3>yJ Zk/s>`s  7-\zC8[Kkkc4lXYb.pSH SCB /vЈČWz_]) i9Ζ3=ޕ*DϚIb YхݿE@r@πgkXq?[.tXŽ:Metå>D (vݷݓhMO28FבݺړScunf˖03a\gAϒ׶ tьN/|?~͑zϜbذ C;UF:-A9>G=> D&@L BN?PASFO3HMKNOmPQRTTUS*VCRWPSIPCcM?cJ8 [l' Ck  UE9|  ;h ' fI E+~2 VW^BobyB GRDIpjϔ ؅&yzzH#h"vث;߀ oB`Z)r.2ۤҬ ޗV ۜZ жj޾|h;ڔʈƅш_"ۻܠ5j Xr>* /1 Pi3O'p"'!B&E!!>(.  n YQA[ & '!y /  x; |{HMqWU*0Uq][ܶ" h;/bcU/ݗAbBmro2ڦG֔U҆Зi* YhUX5ĮԨE|eͭ%]ȫѸpk#9ܺF(cJGa$k/_<{~TT &U %*6 o-rb8bv_NmT   p[ !#U' u*))"'o/$^&'#%#y##"$"%#?%e ! $!"(|$*7$0*="A)"*y#J)q$%!%!Mbv WpLpO_t zR 0km@Ex",] S[ƾ0@2Qx>jgŸœń㾞NJemͳ^ ȻMɖx̢˰H6Բ[Bޭw-ݶ#޽3ҵYԈIH֖k ܢט5q<ط363#fݓ[DhG"emTUh".w>p4~Q){[k!avt. 8    { % 5 X )h4(< O + d99=D3 Yx9~1ق5r.+]`Α }؍MZf+V<XI&ܝPGִҬ*:(ڽԊ{Ԣ>.԰oחڰQݰ2-&w|Q\_WbԿzY=[ɓĴDЀҘ5OܻޏNjϊң5Dۂ21ٞ"_RS9uz`+ cs!4NDk U- P u+$L   RKWX PF;t As)va+\')0l  0| @|B Y'dA~PFۺ!+jlˋJɘ8W칰͸vJ .b7 'öؽ/a`̫x#;> lY wJ; mtZOvkPw[y*^ޅ/߳kFOVqA( n ^xB^&1J=\j'qh{f%-r!D]wBRSݙPuuݸص8!֦߱ڹ{Gݖ>#ނ>^ٛ-` nӯیޚHQXҼ S ʘ։j>۵kݩߡ\b4;~+pؿטaru=Rtǁmƕha8~P$,V }t0@q_  Y  }  q V lfj )\pPd  X=rz TJar  K jMa?A%>Isk[o{ vD{S}Htӧ^&fqݥwnޒ8U3ΝhұJX^/|UPDPa+x 6ηѲcB ǃ vdU +OV. pt I  | I|d3o 2r / i =f (    P /) x@ u"1%a 0*P%(&Q-,306h07.3)^5 +7-g6,37,69,;0gA:u>:X:^5y:1:.8*7&9$E: #+9#5Q&y/&y.k)O*##9Px"6$#+#<-,#)S%3g  9/YWwMaToovi3/5*2|5bA˶)ɺiѺgǀܱ8ӷX:trŵIJ@`QƣŐ7vŽ8̰R4>òݹ)5ŧh禮D٨U۰BPԪ,?)4lΑ͂L1k47M Ԗ'~"szdxt|An{h\4f$}{wX`|)oy0K4Yl*:v}JFsG,)MukڿD^˭efͶRƐfyy6}PvKMāwdnʥśS:õ=jkһ׳7Ћ$'}B;؃ػ֬u_M6M+HtI+ Y 2P ۨHːؤgnvg(;84 KT U& b ;')[ * y(P#G! k x"\"'(~.$1*2-3 4J95$8135@/d1-02e./5 *3(R0#-' %$))P%*3&B0r-4364}80 :b,>/RF;Ft@GCE^>k?.48 -0='?-#W-i 1 W0E,L*zW'% $1 X(ur, '7 ` s 5\ >  xpg!W +_#^dN_yfػ*=ʳ! z9UcWV96Ylëҳ̸e7hÚeÝěĖbÙȢ*tnOTȀh ު Kq>O Tz2 O x1d{/mh ;o  qf +T 0'K%3 %b Z'!$!Y"",J!!aV|m{9" | M$ n 1   !$$() *T#!a$('( X<(jy(z6œݘՅFѺ{J<]gy$%.󴸮ZѭE^ggJę Ð 8 -εCƌ̷+ʩ0CŢ};ǵȋhɺc6Bz<底ݹ=VU¥b$gF"-˱zזωѕ:މ9ܫ|ݑ ݎr ]^ghEL T} M KBS# #x r  <e@b:Bj%!+Z%0G+5+1,)2,3.5+u3& -!S'%#*!(y#T'"# o&X8[M"0 X T A Zy}C  0:fI! ," K{lX'7phb ~' @u n 1YcCoD_$TNmӐˤ4Z"ظsӐWӲ`RϿCfѳ!ؘ?E*&5OX%$^Փg՚ˇӺ!!ҟ ҨQ¥;uFAóϝĤp"Q+ݿ5wp<ڐ-= 25> @P5}r7b={>WqEroH{a `/[da:/J 8M  N } -l_<LNxe^YEnhgY ԟ\ozJ8Ϛ+{gfE\\ ʱ_5Qv&GMIcŽ\5\jhRDɾB5e{R綱NŐ)b$*̈Qͬ=> aժΕ|й̃Jڭݽ=JUDb4eJ75&!x e6c|Q^-_^Zj9E p  "  A1n #/,4o=[=C: >8;68;4_806g+G3*k5M-x;3*9%&4&60('++q/*l.. 22631@5+2 -G*%$m%k 3  n4W#DHJ7HD =^C4E1$.q3 ?]|OPh0xakPHTEߢP7~tݎ޿xL.k8 M$ _ ?:?  1Tr}}QH PLUX3 \xCq r$R Xj 7" ~8r) K Iu z $nVyG_r(F݋.%h԰r9GQ2Dzo\ޯI{Q&Y)Ȧp$Äj0+ēhZy]״r%?1hSͳd5ٍ֊ݏaڬݎߝ&<ٷװS3׷jg0?5[@h  z`Rg7t';8C |hVJ*E#s"/o;K'۳]D'i#Qq(#Y6oRS3;k"&_    O\aw3Ij ' X~LjT ovC !  j e%=tV h]O    " 5 % x? FZvF ys R@ +O  . - sHjik 6$MR dGprSݱ+ 4QnXٛK A{r. vܽp܃Y@w Ίkd"#ظff$kͥcA^yt!΁&؞ӭկ,ܹ:ݶa%4XKBH$;q^ U= a +Uz=H X z Kh Q  C Nta#Xp'   q hi d !~Hh?X @y "_$9$:"V_ UsYZbT9en1RHkB ?rjQ m l IT(IHߛcX/uKMbNfX2   i  Kc/XO  E'E,0l4I.;R'e ` 1g R B#g (W S&" $*@'%&$ l#b  I j$By 0SE 4P{XkZV ;k^ ( ? \4P Z# I ] aMC=M0ByOfBP3А!*ҧͮ$0OGi׍0~՚>DnuHEׄ+&0У؞eS)q-5ZҒδǍ[KփƌmЦƑXǁ΃ɔ*(aIktЍa&_ٲMՏܣEq`98 C.Fk@U{gfzy3O  ^_)v7(Ov`@Th3nDi . .R] ^ /K{ "lw@s#Y7?NS  LcU^8-0~ o. h79XV'" _*:-&+2-*'# L bCr <& r @y9 x  L?Fa6ז+Hqݽj.eSާ1޸عڃWR&ބK Q\peWW׉j|k|. ޷1rhΛ3-ܘSi׸{mKGׄޠe0xe)FC5ǵ)ϩ ϛ|sk0(npgN  %,uT  G. 7 r c OndY` A ^3OOd MK A :`  "tG$ ) $.&.%)'(&6*q, !m),#$Q !;j #$(,$c-+,(.(//'-T(U)(!"e!Rat h \Vp~%i &? CDۃ@$Moz  a %(17%%)-80S2k1x63;;=@@EDMDP@ O7F.>' 6&`2x/;!3mkܧw/8d}vPy؂k=Ղ? MI߉wY4rߞNIm40l[J>}<n]xa[H> !2.:? j G p L xw> s  d<cyg   7GW ? hl&r% O4p{41(MGaލy0ݿ t{Sfޗ>b,ހpݧ&6܇޻ܲ0[8ڈ,nz{۷gB WeߗUTAˑhj֠'¢AĴʧ]tnkF*s<уoΗ΁JЋVϪe0}*RW8 cFU;ZHCHnۧG0F3k9rH=  ( huv ] } "#$]S}4 mZ. %#)Z$D*t%)(*L+..00(.h-l'% D#f!'2#&#GX%sIC, XXp+w. Mr.,X A: hi pA4|.[Q-tfI]o[Uu W0,jB L y)9Fo 7&] 3O7]|]u}r3gX e)A2>NZ,)l V 3 "N$B,)Z` O# | ]  a e-L ;  G@ FP } h a 80>on # ")0ͧB:!+XߡEݤ SٓuU@p2edFCiۄںcmV4JZ \ oOAvaq@vlz -YK]v JN,Li[7<2_ Z'>U6+4 >Md = H < y Z   0Dt  ^h g?E008HY/m&rt~:jdmH?Y/U r ;m # (:n s""mc3qlb?)"$$?'u 0$s'#v'!* %x!h!zJ X3"~* + \6 tq QF~cD   I [) vDMOP3`X^zNرسϚm@ψ ftEJջ"lމm8ށ8N>;ٟ,zWFU@`_iU {E9bSp_I M t6K@q%'>*1& Or :SfkGq8tI& ` ^ %9ThVCGH HFHB-Uwܑ-Dz`hjG82D>:0`zցѺ=?ƜQr\27/ҹoݸQ7pS UJ{fN?-[n l4-:f 7{ p wsG  kmO Q J  oW&!K*# {%EV%"(b#&{$$$s#|"-! ,/ e: uP[>+;[ w| K~  ^O(@e CR7a  g h~5Z')'d&O'&? 3 S#t!+0:0}.'9]7A3!k !Q!6!   < Ua9O2+&@ 4;aP\ kYJ` 5L7 Fk L`\PIma n-T#lqd{:Xo/| u gp^bLM  ` qj"4"I  Rj#"r=@ L% .B,6270\1W+$p"aLAO!O.%#U&p u xJ7.#  "H ''1#~iM v< ] @_ UanWWar0̽ZЌҏҧ1"6_Lx, dQ^[&ݻg 66 PJ O' "q%A& ##*B!.l,Z'h'(*#.17z=A^AF>CX:q?*8"=?6;|3%827I5k:(9=::C:5:1:$/9+7H)5*3^//9/*))".f"4%x5$1N ,V'Q'%1$S$1Y"<O80IRWOL Lے'ҳp֢>yd=הNKϭwsɝÁ;PhF>.ɽ¨ŭ4eSwѭIEG۴#Ž+0eˋ(~пۮ]Qͳӟ M4߽(Zqd޿ՍP}]N֭߿;۵g.Ѧ̻ҝԞZ@(ײˀgʉʏ_͆tҗ؜ٛyq=\ߛܢ ܉ЂУ@Tҧ`ڼ8aۼ~76i¶Då1țр"Q'oZq)=E͝=ݾ\?ӏQcs?¾!ϐ'ןsҴwϪȳ^>kmJε‘Oc^ЅvJИUۗp"}YQچ*u_ ӴWǀQ}qݖ/vnQ!dcڊϴ8Wؽ7u,٣Y+AV$?oɲaɺ +UWAL̯˞Aǯyďq]^{ŠeŷQϱ  s r#?.EmG$2!(<')6*(,f,026480/4([.#i-"/!.N($$0$A"iq#&X!+"-{$"+$^'#{# B!~ T!e#$K&'$#&_"%!'2$= s l\ [bAPZ *hٶג8]ܗֳ5՚rԃؼӠqځw٨ΊfЗ>նիO g‚<{S{mޢ8:'$q u2P2 . nY!0&%]5/{! Mm|  q0^Cc+/Ü#gBo1Mn ޭ̪*թ`aý3ѥҠ ,PU7֪!,PlQ׿7,q/-8Urܣ$q ޟΗnأ8g>o歼S/ƽŷġ@ĶvޔЭzҥ׈ou55{ҁe7[,EAvG^p1:^rmTT 9 dC z.1;S~ ? LM2"mܜBӥٗSiEӕ̺˻;y%*ٟ(zUϱɰ# ʺ̨P߼忢IGBݹ\K]x /ь<̾Ӑ]1/Χԣ`8ָ J{;\C(O"i1 V%d=UY7E+s{F} -<%*fwx 6` }rgl  yrtoK"" x( 3%2-[11R0/I*5_'7++*35 4k2,;'P(+&iB ? dX^(  c 1x Aܿv٠ޕ6ٶOƾqX*̐/`rp7mUy6_Ӭ֪#"y ̴ܳڶNS>]HLœ?h'" ҝcԋNQ&ٶݬ{ ѿФԥj o]1'a+{9Dݮݛ,R֗̾1Ooַԭl 3 'R`*ݥCݹ#oX1bA\&'|6؁fPH4޲u͋+ϕٿ_JȻ0ԅz9:H̛=T{ˤ_o)6Ƨkʗ͏ӈL"(tk>K/!5M#zl  ,I%GP!\O% &J S#K#_!*ANZ!G)39&<S"0"cP+7!*m""u|  0i  6 L ) 9\x qy JYAe3ԷG@ѐއӲA~_ZРދgH:˦MvX|&lZ1Z}нq(xKV1ŦݼχЌv_b0̷0Ԟ5nckT¢BʄԪsWԇ(ִ۩Yf ߪ6r[lB&   32 r}TCM n 6  2gd- C C^S yA I+u#d޺ք{O5Un 5Q&,&ZZ ?mOD,0ezgi:oA+1vF];)a߻0LGqwJ kw   Oj51[N+0\t$Y j_}!ep h h䤟f 8ͽ Ϙ5>#ϸpâҽI#DN/S{ʛ~uۮN8ݫ&ݝ ߥݶҸ w$Yk2 bX  uAI]Gr !P#f! y H! # #z !W#2().'*-5'"$$Q Jl !h! c*#V(,g!)P%"PJw m 4a p zEWwUx۷ٿAF/\ڦՐw?–u^jҥԉxĤ򩗦>I''ժڮ0췮ḛ̹eŬ]dþ# ôUtG\Ǹ e>T@ЊJEZּސߗ޷D{KLp/@T;V B),BTRPM:AzbCC?$K0/sfSiU ]5ngK A{6y$~/U~ߓZt&d FH|R~2 R/VM}:}!  !n ! "%*)U(V#w "w&4*-,s.')H(4d1e"5-  )%(%c'/$T62r) ~#$ <  0,J&!.!n,k%%|"K,!c ?\yd duto0}_ Uv Och =bP-mFֲگ ^1]?o!گVIVv Q0T!=J`g15!O"KYe2]^(32^ H  #R` 0 t 9~YY#rVS0W}[> c>XZ2[uaPߐHߌ߹ڪuiP>%}.ܼƒ$ɛٙ{ѡ ¦)D%\È"u` @Rӱ֤֕m̿S@,O۰QO̤Q ro gi^2f" sRH *Jkb\,H.  )Zo8Bm"*}1 b!DmeSa 1Ovt^ ődûYƉTocA:ʞaYsp=ݞ[d o|n`veX +o1Դߠ0/2־ 9wzi֫ Li{RRlsa J+ y xf* z)0/ +L3& ;"$ o r'E0 0.K.!,D*L /y(7+:~)7%$J1'U )E#!-F)3b$0O+\h,"1r)5_*$4' /!%t  S(2y+."B&0 3Y+-s +.g## eE. |rz4 > N}q o ,l\ #'g F . gLm!DkWL"+* *2$* v 2kY)O.3807)J0%) "N#$/)-*}3v*3-4#2!728k3:9?>A;h=24+X-)*,.377<49.1-/h57@TD{JMJKJ<`9*1(&'c14;>=c> 3H>b 0 ] 1] px h r"_u 74  T~< Is j+nKyAG;`C8@:8D=;5?7EFQ2?z3 B3C4C5A7;3,3*0|$0!t+%V$F!A#U$;gLJ   9 +?S >p Uޓf6yYA]/I9Tٟy4ԶUsL ۅվ܃E֟;Ԯ]VӏՔQcwjj|d>&2s% \ uhn 6 cCK X: ZG8I i nB i4Oc%A ! #3" =! v#o" 3":&a&! p'  #L')0*,> 9 g  X Q 1 !Y!{AEJH($24%D7 3h.v,%j1&d:#=BP DBBK$H\.R3V3 U$2S -NO&-I$YF&oF#D!E'N1qZ5d]l6[o:];m\8:vY?]kFdTIiDPfu8Y3S<]GSgMakQ&mQkJb|>mV9Q:dT&;oV=YZB7aIfPhViSpdE$U8E1;%18>7>AISE&N:1C18v05,/p)(-7(j0'&M-Q)|$ z Y"a B 5 `mm^s&g` o8e);w=iܳ*Җ+ںϱLjE,r؁΂ޞ@ۻT޻ݴ}Qפ &0ޖR2x߇ހ:mcJ ߂eD9׹$IN|G\xK1s#nQr72y)udey{9#wp ai8^OP>ob0's\LUcrULڦ0O4,|rZwcsCXR''pr@!$bv"u m-s& ; v#+$''&%eiD"#A'A#K'%$!#w%,Z,,,*I)+'.A*2w/5.41T2/05{6 77337X5$=58/8?1-$"5!%%A! $ N$! m$QWlC{MajBޛuRN|]Sp /;߽~QrDa[Pfz;x-*zrqPns&tMX38bk "2*.v,&b#'1a!y<\(B'?$&:)K;j.M?23D;LlECUKzYHK2XDMQ=H>ECHUINnMlU~NmXHSy?JU:>5[2,.',$+N".".)-.R'/VUdL Sf_jkckl/+5@NT P hq i Nj O$)"&3$!#9"#*3 !:98/m(D(s-Z$j5+<0*A1V?..8*2(.t'Q,<&+P).Y6,3*j.S(/+H$+&`&%,(r/*1.[5545,,*a 1m /}/-=bS4  C 6 .H{@ިج׊<O{>9gA?M.m;gt )   ij  A ~ _  j 9u!LV#  l!( -r&*$X | 7 'Xg g >bOke o 2  e T `.x {.Q/ [ H  .Lim/bM'7a$\>q8jNg׎qfmCoл̹#Oұ׻gR۽ݘW> ZvS{U. l0|Z>7lK,jy 50b8`gk1!Cݤv$ܗQs|Y~: 7Qʠ A #ӱvџЖ.`PY j'I !7 #-64S1(% )#,$ -+#**# X%a',,I--./'G(-)g'%53U.6/5-37+;,$O( /p$1$f-#G-&f)]#l!;M"&$'0#%Lx Y!] ZZ~p N u /)| 2:^/MtR_(%~?Wu(yMJQVN*KE@;40*61]C?LHKEE>=A7G>4926285>p7>339*0!-L2"2:`)9@T0F87EB:%;3/K*$ P;A:dc a ? $<  l B oK B NB  mj1I^a% kMߍe ~,ݚn޾ؘv*ֳۘ>2۳fXԠ`JU@>/JiN ~K  qxx%d!% `!_' ) ~%1&w2 !U Q +\ wK_p eMaC/PݓBMBBЮ _UͥKByDadNQ oB6 ƭ官;B֬SÍѓpZQӇȔ݋wΒ{$[ HC  wBff˟60Ƽ۷(}7T@Dyy޵DTF,wcOZ =wuxm Z- #0#/0+/F 'cp(8 ,\ ){)qj) )l mzP#'"(<#R.h)1.++*##^h}B!%(,1S296K>8>;6)9E5U497>=???@@]@WBY@GCFC,C?EBlIMHDGm<=;EEUVa`L][_NNE]GIPLSUZ?\VYPU UY\&`Y`S_Pu_M \JMsWQW Y^_Y}bkS_AS^&W_|Y`[_egdmho0h{o~gl_dX\VrXUU[VnTTsQM JFB~B= >*;tAB@IhHI*ICB98:,P*" "?J(_&>)* &  ftds=', , anznqH:%SPe,?J^بިZ@̕?H(Ң&I8Ġm߾²Vгٰۻ*dV~xȳzVy/ʲ$ŧ"i ƦۼpݓԷDŵˏyaOۣҬ,ڧؔ$Ոd˯ЅNjӪ UӠާOϐL hJȱ];z*XkDͷܷ8I@)ĊN[]as/ŹeMεە޵.о*֔yE.Lӭ˅wBp݃p40/kq91mˡC.ζzo,#b19iYVbtq t#$v ^]E c  [Hy(}#F+;$ $ !`"h"%#5k?I E/MyTל/jF9΀bv,%ة5r@(~}nqڗPYhZ3ۚ~.ݼݾvHٱ'^`-їJXŠ.<ķȩ {I.mǵR̳fŷd`f۟XF (HAƩ&΃sKS# эuț8ɂx/jڱҮVsυ׮ލ`47y޷s!̠̈ɴҺڛ֞P׻&y͸ϾвDž͙ųӟ];ܛێիϻ$ƽwЮ˚"1Ļhu³kůFxìۺj鸎ܧA𤤰$ɲ`ҶB* d^ȰGpڹ+óȖΌLuSan֎ YbhU)T7p{"V6fC(P4[   + ] fwa"(t!1'<0E7^I:K=:{I9@3<2EC9CK*@PsFQI4GB>n;&G,BRJLjRL.JEDz?_Cy>A3>'><986301I,Y5,2* .&>1/)0''@$k'$ p# (,(?(% dMT^ u R n+~YXу2{[*%9،܊b_״pa61ܝRs֧֘ܪނkIMFH>~t_b-.VD[e;`+C[|M " N d ~L9v R>> Q 08 NS IxhkyLlr D7ۀճ(2&]ìY@ANǬ;ǃ$󪠲K4Y,n)L >H46`Ƶ"ؿյMS8CL]3μIa:N9ƀ5^.qW6ZGgp A!s#x""!" A!'%% !;!*=$0,30A'=|LEEt@IQJX\T&SReN`MNJO4IQ*NUTRRIHFBIDGD@@ =?.8<.3849.6E;5!BC8@ 5A5A5 E8L=O?I8C3E5Cw755*+-#1'9 1i8054,4r+1'+50+/+)&&%!%'"F =/. 9 ;9:m#s? Iuc4ԮMtЂ˴įʽQDŽ|кDFҫțةih[MQގǠzފ߆* 9 Swz%if7!XߵڂV3%޷zONtlMvӁGfdgFǛ~й0.ƀΜ'$>T9F@ͤBشshɬԼeĵ"uBۦ,َE֚dL^")M8,  z NGz(UMf\J  t- BC%!2'X",'+'V$V#6}F |D"%).04^14-s0Y*, '(7 _ "O">%'.Y177g744K0/+"!H0"r_%l" G1U h h 0O 4LG&S0 %L  CHT=%*c) 21--B${#EF~ $!&=!-$Q( Rr \2y pD gA o Z  y au9# o+(^*'a&Z n 6 j| Y~xU. )g wFUtV.:AF] B2  z K '$ ,Y"h)'!' )8*Y625:p552,-|*l-:138';<=?>C>C>n;T7 3y/9G2M!@<[lLj]kOSWGJ~J?>J6,C{6|Q^=U?M;E5jC0A},REK0T=P^ FS>@? 02%{/-X.43$7f,K7 /u7-5T(,Ab  30 Ci }  k e78g8F]++Kjp M # bS 4~H ~fb^2rސ[=] [Ef6<e1 d DeJ.ٌS =mޑ q> U]E(WE ' n!Y )PQ01K Id#!&y )KO ( +#kn :"%)+ *: .75JHBS8 !9&&t"#r< 9/" 1#G/%6 -F{  7l  ;C xm& 1 (lp"v^ jp( \  A3FQ9  S %M=UG6/H=Q$+pjU~zYi+7-/u[ڬtQtG<( ܐd،.ۆ׀l[ՑBzC߷Nۭږ#MD]s5AL~k U=,\=!Dg)!: >"1_ Tcw $ '&N!) R3 y#s&.w.>20-m-&|'2$^#%"E(#% #P!T!E# $N+*+1K/\5M2{:5m<5p4p/('3((o6`3jE%JX>M@J?B5:>5m?3D@#0B0CB}0h;-7&,=/C4rF58H9{F6?]06)0:%1#g1!n-#-4%[:):*9(76R&G-1!6l;!+%wl/4{'p/'\)#%  ' a, +$"e!"rL F& i((*3%g FF9 P @" XOrSa ,+'  #[ Ni 6;W6zbz( -   HeU4 y  nx"^c j gV #LK f L.v( hAN 1n  S Ef    , Q $]\'$HPI H088 ~!3)#,!$#'(:(C&p #j '"+"+| (JAi 7  F+li  c +CY6|zL[1]+h-$`1y;:TZލI3 ]{֪c+ e]I8kСLU@ &ύ/P{sIˍCŜO ~ʦٚ\׹Ѓ<_ɳƋEp-ʡSʋDžƸ ikտӽc?.7˕ռٯw׏܃`Ӗz̹ uokн;o bó>ƛ9t׆YԄ4!fA9 lӞV׫hTa/"qXxx,U82R- vZ{ _JZMkNr5G p lOqk _leEUw i X9$~#.0*'.p"j#V)'$(' 5!yrG/c#0k2b;X9314-*0s-2/'-,v)(%"$,%AO !(% %#!_x1[h sqf ^n'(f!  3XvQ[5 J# f @  & W{[yvJ'$ =<Mh/5TF>U4o2MA qє!"c G[ժɆ~AK݁Fz|vڻJ[ZlGKt!1k"R-e܀Ș_ڔw ՋG5+ Z$_?þl1}<ׇzC;Bǩ\]LŤ/ΜʤʸˎEƥy“: k%`|EʨӋA`RZ9 ֙Ս8v}:QU6]g|tR|J xge[9 Y%0  >SWjDhY  9go 0V$ $   } 3,Kjhk  m .RB < d 6Q/CK :^  {4 WE Yjuhwv   fg Gj\Oijl )34-! Sl Z# +3O0|)X(W+M1*%i#{#&z +63,B/#1T%+T+/  [lq&2/%4/% c ] Mt &_r:=$"X#% {lbl>#$U(*(u.'/",#:E o /S K r[ {dSBe\?Vd5 && #2[*fFJel.Mj'=5Q!fsuG4E8+R#J\,I5F8uߎrDy.B5x U'>HhN ` l      \w r&:U'$]V%-0&0"d3%3+&.I!'&-8*&r@/C{4F7I9C'45((+ &w(J:3?& @43I>N$DMBE/;#;14+3)76+";9.f=U1:23f/30M>y;VIEF\D99,.'*#+z.5>9@+CDFA?B4:+2'-C(,|*.)/'r/#a-)s$ 'PGq#D*y#.,[*6's! i ^88?f]GD h! Y {Y@? q  (  > ' kg;K!q$!s > l q#!#w4j%),4&:S,t:+:*+@-NB/?$/4B2H7G5'E52BP/=J,=s.D95fE6 @-1>-e?- ;f)7@%Z<(u@",;9&0/g0z2906#~8(77+"0}'$Y=U0K F1`1#@^!6"g93')k?])F'ؽ>ӑ"ʟk$3yeq{O5@ͦnͲ 0zȾơ]7]ͷ ^Crǰg5wbεޫZץ|(~jɸè^QzҳXyȾv.qٻ˶o@,>fX{ 7B<pt,n W PkMU"]%'/B6".'"(h"P)H/2"8h*|?0>308I+2(l3*53*3t)^6+5+g1Y*>-A()$<'#+R'4 1v886;8?5@E3EGDEDDH(JJNIOJPLPHKB&G|HMPQUN8RHJEEWB@?Z;?*;G@;EAALZINM0PP?NNFE=;[;86?<2>:6K3-+4'&$,#.'< >GGHEEKAGX@`E<=<5v;3@9<=9;74825;7773Z/,0,e7I1;u4m9f410+ -s+v+,+D,-(P/!L,%#8'>$.$/#$17R !F+  !!!'"-)K`b g #  mU@'*--V1+`0&+7#P'!Z%1#&+-56}9935)-0*25;=;>w@: <698;}570^11/1m.+(# hD*l  8Kv!!,N7{'$z"}0&ERKw xL]-uɼҥR:ג۩4i=ԕK ۺ6JA UɵԐz6~Ŏ2INyiۧ8ͥ6ȶUO̮ϴά؜R$LCH@H"V7 1$ SO 4 a D < [ h D  s 7% -@0)"y.P '[% kB&))qr* 'q; D#--*4 $7'9'7O#0)+5 @"B' =%7g"2R, C.]35l1B/T7t"@-D4E7nF8Ap36*/&,Q&,$(,6g2.C@@RED>>_5,7'8+aDB 1#Y7$l+_%+!g("*#- +O%%),1.3'{   S~ B"'!!%%?u  j S/R  ;jH .ZLl-@  c &   diL5 5$&f|!{   1 ga *1e1/,*(,,j*W"+37?(DG/I2iC.6N$+%)7%8'~BL3B57.'!=g* [#P!1)1)G.1-x3'6-XL!S]l  ^ x  3 v+ kG ]x d q w}V'$ouR#ӖEѾӤڡBy4PѪׅ3΀D_e@aaі ٹw ̪g9=0\հ"Ҧ׋!izQ٣QՆߡ` ڷ֩ڌgݎڿ܃:`ܔGGջAeF pn76׺ Am1gڗlL̔Dԧ޶Uaɭsʶ$Ӿ5OۛՎړ3Aa۝6_Q؉пyxӐYb1ٮӮE.\3´70ܻH٬@6 *8$8&>-_A0E-3LG~2B,.?(ZAE+!E.;FY.cE+D*5C)b?y%w:4<012#2=)! p#w)o-[-A)!H""N]&(#)''X)$u)(9-}*0#>+"!$% a.)9&76 .l&h3)6W"v0=x,? ,nl.5P' =$V9GE.IV(G*G-$3&/c:6m/>5+4R+5.:4m<8:6:7<9753L2M3Z1w*`(?TI"p[0  A [).6R7&ְۑA]`?cf w@՝vɐФc4+O.Cǒ˩ƒȡ(B Ӳk+R״=m );+֪ݤYI~{9Mxxdq $޾E~վxCɨ޸-91/dwDԂSӚuUԢш ܰrXީڑ`ܮ$Ww0Ͳղ_մː8ħ׿0`DWѾky21gR Кx*絠@ ޘw&͟Pbіצ1ޞǰX\-Ųi+JJ%;k]rM ,J3۹ ƥܡ?ع@GxӠPBd=tṻ6վ&jIUȔg%=;)NՑa̲e鿙= ݵ̽pݸ=r̭Q /[ 8ģ@ Ш؈ R݃֯΅̑SӛcjZ] >?;I!֬R3_Rp̳8iMͰŒȥĻռSc-*y"2x⽍eyÆ/Ɗ#6sNӧƺǹD[J׿ &Vak*M ]3`HZ?.B;8336,H3&8'XC/\G4@.B;S)@.9J57N`8KKh3D,<$A76 U: B(J0I0E+B&'> S8432E9JB ?Ok7|/,%^%1v[/d" 'z& R {Ax( XW.f G JR/m ! ETN;3yH ?K~Ga׸ҔAVѬG81K&ܺ@wPgڦޠH Vؑɢۼ.9Fwi>!5+nkjʋIėZWFtå ʑtʓbָ$D߸/˽tMZڷ9­Z){P@Zn * >ݛ;/x܎<7ַtM]4Q;+yNzqBTG xYQTl%ho[ҢGӡDD ]N}W R/pB׮ڷ٤ޙߣ|gWђzHBщܴ ƣѠlż ĶC˿6ϳ*ŷ!Xkx*[p͞^ĶànŅ/»ɚŽaʓs3;MԏJgqh|ω˦͙ˈˉ\1e 6܇O٪>a<շ˛FUȢԁ{֦ڻ HޅضjayӈBI7+$zt41{ޡ@u1Kw ݄=:Zu-*B 6)g͜3/R,r̖ٺXׅδֲŮXZQVi}@֢W[ ٯG  'V-M-1-(p.( J!2zXz] ~((+'S(;"c)$!%!(!,; & $*-.32==8 7S8]9w8v;M0W.5^5@6451>z=;794=:==@x<@~<>BAFWAF=(E< h2 l vjGqma)%] 6.|vIhwRBՏrΜrgx%6/4 ݋ ?K_}cߐ"{QxM|ٍ׋т}I͇K\ʽ7)ri^   KmP[p o&G yiwj  z$3 +s"'~) ; . s up >K| g  }  5;V ;9c^hT4gcO .yg  T X e\s /m^ $#G'*,.$wMU 0e#c!^!j  ;#[$g&F #n9 )a1~"#TG\d@3 59 X #B I <oZ*/'  aL/U 41~C)*"0$2g(a !i!_GfCJ!_52?:XB:?Z6%<2 A>97k1,f40P5,UC;RMQFfO?PA&SEVjNLA>.7?0F2;LaB1YM ZCScH_D V:9S;gQ'F<>27.+!"(%0<2125!,Q0"%# %)g 9 @X u3$V.!@u,2u +4 .8I,x 1-<V UQ $ ( ' %;|3,W@  + I\8MhR5[kNv`P(J_10_ |_Xt2k5daogÂ&e6ȿîR˿vSwpBKVว=˺~뽞ݸP浼\mX-u 2ʔ™D#E9Oç6Dܕ4*CJS#Z%|>KW |!&3$?("i, (! *$'/*.,36 ;p4O.s '!& !*+ / 1 9:A74 R.0(6|4:6EGBgJDICJH^E:D= <996891W73<=LEuUJUS`rTb{KX?6M5D2E46K*4(J6 N4>[CeDg]D7e>\5rQ/uNG/P*J)H-Lc)D>/,M37T(([B).FF-Pi$;F>Q;E< }:8"m4'07!-GA$`R% 09+!}{9$#  & 6="Y# %+"q*@*32Np7&!7d"O6@460D$J *N+Tm5QU0K2'@FS"A?<;8;w?{=DF"VN.UU8V:L.YC&83'9@?3&\J5Lt:"B*@*a?+h;]+S8,:3vC@ON[Y0ZoR[Mo@;DR;U6i1+5,,4,o8_.B95>}<.B<=e;;;@x8|Ck1$A,6@7!C3* H2#1&.4>4B?-:G&7# b%0 47#:|%^tX di   ) w .b;( y6 { [u ~ k=  c 1  SG z*D'.'..1h09(/':/"( % $,k#)l$N(/$%AKYt$   5& )}pD  A|n)ܴp l^ dN H z Y-PG7*!vC0QF 8;/%3L*`/)0-{,$(X2~%6&:e*</,%^" + $#%vM T!!RzNeO sc}wH2 [mߙZa vA@KGО`;T-Tڥӣ'l'gފ7KCސHvӤͳ;ـ1`BQ ߎ}ԃҹ̉Ї~_ )m&D`΁ߍB}XpܵQq`ȂURv9:6p/!HlBTQUWG8\QWd[9 U׸ փ2E*-cf_q/߂ %F$b ܨ0 QT#ܻΪoL@xһϣeϛ}!Z߃Ϲ*8FI.td0UCԻ\Fɐґgڮ6x;ҌɷΏt۳nٱíN_HХ Rqp8Ư yVýƘ̣›?eYel.J}ɴͿ#ݔޭXV)>o ˺=ӲBײ5ުГb7C)C+miƑʔeԕ*CەU_͇qrr:л({ʯ?é73Wq. ћ7vwKԺ湊ö :`d uC7N*Yۋƻk;oʺ9|4çjǞ uњt=ӣԉ$ͺʸ.Iɘͤʽy+شוWȄҾx²LԭTwS =Ezsɔ'9ʾÍ^Ɯ";ʄtb/nw˭ړ"Ⱦ׏ǣ9ɭ5$M]CfRBpVG  P  D`mA/ 0"z!>  ] R i#K  Vv3 89$1),*[+'%/Gw`%#II"C%$ 6#%<p 0 9 r5d_ ^ y  xBhR؏i׏ڼ97:O x,pifMMM>Շ,dI>d 7  3O*| rnE&LC*1;5Z?)Q=&d/"\ e%j! &c))*#\"4$<  $c]R 0Q6Vh2Z2.ظwNr]˿L}0H2j ϱ'4Sx N_ðɾo<ӐV\jNZ<Ё=D7ͼSl%m}-ñм^eհw誤̸ƼvªK+?ڰGOmܾzԶf̚pܡͿ^X*fyS6ia@%~>!$",0]5=0/;(&4(8.E/4I#:`#49O+~AI)#:) 7+k8*I8);+'6><.*4122,10[- & &$&v"| " L! ^ ! ` . - (  :`l) C'%"E|  O  $B#*D*&(:)5*5/5:=?:>1B#=>5@9@?y5o2p0n./0+e.0:4a@5?5^<;A;<>=4A:@J;9H;,<^991,1(m0%5, :38`3948-)"*,'F/,-%,6X,D:GX?UF4B3/:%#"&zi OE GX a<9>t=Ls֖Oc߷*|ֱ&м'f~ LєP ~ːݳ^L ~=ǐ߄БAifپtɾgFEųIUʗ<ĴAЯʑA̭iTƺ:wlmʱ=#p3Cx¹Qɹң,(Z1g{ɰHNT ڟzޥ9TPiJ˲=[O9˦ոЊaiƙwrg-k:Ͽ}'1@zח[ڼԠ\ѭ-''2ӭ 8G{*3Yءh~PBB=- +3Ckp-E84n*JMao&Wwl >f" `Z'kwRl+CY޴^ݏ>8F`֔x?ۑ..+}p/c= چG4"mԢ˰Yzb%<ؒ޸T~i\#Md09 y    A+)5])3X%. (HK j ^  cs2 /  %" UtAz#4|-bXޖ<>Oi HiI/oicz]/[2$6r . XwHM9f\$Lqv((/q?}\;! ۲"κlȅ_-㾵W&D<ГW˵~l͊GѴy,ǁÝ̭_ˬ O[Qÿ/ ޭⷩ鯯пÙzx:ʷIjm߷Tcb٭k' àw W磤Q \ ieP GR N  E &o8-/^3@8 4!+>#f> &IA'+H)'D'oD1}L:RS@SW$F\MhDYfe1Zv'ZW+^)/^a'FS*>R@/=U+,{Q3Z2WXM'I1(sG g;_51 #"6 '!%pCD l 2@z7 MP <4  !) 'x*U*i"f%S4*E6oK65UK/C'@)(>-:\/:2<6A;QF=sK|?CTWEVUDtZGdSyfXW*`RWJK=-8(@.j3 $1!X7'<.:.iGA?@l9170y52 Xgq  g  ?   : IuK|l  nB dWC% Bw%)*E) " 4u ([(N)$/+'1?%&r&(2 u  {,  ) B& # 9 v@1>i#y %0![ l% 1 #MiZI P;tI xak 2]A)1,O_U[ P%}Bac?m  %7 =.J/  JvTpA^BR4Nڿi1ܼ¼/M>#`ɾE~h~ݻLĠ۶ǯ鿍:!˴T7)'q|ӳ h[>̽R®(@âe 7IJћȗ/̳᫩S|YaΨE|SM9_>}ձ-ACڪgs<ڰSܵ*->)Kz pե ;7ݼCFݬ-꣤o Zlʅܯ\Ν)EtP0֝FUԘ5(G4   i""i`"a"#A0c+}:40'b-8$(.%F+2$)$&#!!=*+f133]54A6B,.m0"+#(d(0 (W""1'>"'G* : mY Od ?c6K!u -,X> V  6 B@)e`]/AX1cEyڂZ U܍ J]cj Z5r3pp> }6J@ Xj{Sݐ4  (e4 B;^wpi^Hߢ{3tAoV,lڍۏn`j$ڃˀoRГ]M~ԩ˄} ۧZΰEVӺbNd!ʓg-4ƉJȼ2PǪש&g:2(]ґҙ֪ƫν T]f嫛$<Ϸş*^ME{J@(G!r0x|ƭO^Gڟt- Xz̮sѴڂK 7ّFhL\ 2`"+ -,!V $o (w (N15)<(i8U3B?Q<PADUFXDF3=~/1873q833-(&!" #='*}0,.u#x$c/+*% ,IP"_'( !1 # r"1 )-!0(z !*> E  XZY%{ 5n, )t&1319',,+++!.2(1e$/9 'n;+3h)g41o.1^(n,v0 0/.'!)S R7t1/6)4:H:?>646+(pc u EIkV $@9$'?$lusB tk !?Ss ?. l$&naNl~9 F] ; P0  dv`> Z# l!('T7/?''"R(  5#m2a&+K t h 7*dT1 =3!<^B@G'5$OoF|*As"eDr`~Pj)AH^Fm?I3/nyQpRV)O+'I%7 2U  " ~Nf"# 1*i)W"&I(2 2lj3 :h%)BGQ>8>L"H#wL#Kh)LV&:E {=@+4J'4tT&EO.EJ1I 4(5+3+#'6,-*-#'.%,&/"+<E.:hKp   8n   &" #'" %)-.4o%-]Z =0!gf  i4'?1 n V o)+v10!03(%  ?Aq RU "uc)A+#+"~' *"5+=0F 97r,v- #4&C+o\$ <8E'l<&7)>63=Q8:3A01s-@H37J/"N~#0 b| ()}2 t`7%D_D9?]Hƕm:9Ў޵ۜӹԏҖҀZpߤ"0 ӆIܾ)F[?݈*/ o _9*& Y'  %)i%CM)s595&., T*0=3 .-w)"(bx#k[FL $B 7/3+D-% &z3 #{+T,%7&4&6%4=("OH" + |")-34I797Y+)J!*!!c#L V]' ljt5Ed e(0@ f} ^PLT h$*Tm٫2n $Ү湅ĵ+M.Ȯ}$?s'˫㿀?/ۥrIϾSĈlѢ>]6rd ع ez )vL</4 6Fx!$#N#2$Qc.y.' = ^uL/Te Hsx$x2NrȬ/58ȶ9dA (u~۩ձBƺJZłéЦһhU5BB sۊGLܺTC X@Z&$|%#?"J0j[  2bRQU ^< 5 C m  ݑϤEKW|f?O6k^5ehUPfX6a_#  d 7[[Nwt&VԕA QلӀkǛ'*ȰZηJ)cӍ˿QҿžؔǔϾvjͯt1ՅÿXМԬ-e{&+V& c!pt$&%*h$y%@ VRD>3 9T*).I'&%m%CP Z'*( B C}?2j*F 8>5J:_ /j ]$<"O (V+&M& nW_N;1L5XZ9ٻſQbEAMͦpX/ٻȿ6<Ɲɺƌ=Cɪ+\l6bjG{66.vֿ< @Pp s!DL1<%Y".F -%42.(N"QvݓݼZ٨ چ؞ڣ׈4ظ1ٔ1Otz&ɖee| Q"J;+7XD?B"2=6=Jb _1\g&<[z9`D8jO>gOqZ$zc,jTts"zagsf[Z[IUdr]o c(j^V^CcAm=Gl8I^"EQQCS:L`VYKQL?]eG\7IO.BB3631(O9-A;<A8D8D6?5?@;8C*T*>Z"+%#./76z=l:Bl6C.?*<*=++0>*m<"1') X,#2&93"B@"FYk<  5 C `%E!"=&[%.#t-DTe2lmC4   GJ +O@} r%+=%"@+z;)1 |&:  .!5g='uDY4<61z53;=8-A>C;<22=Q:`DbABA>A?CBMMT*WTH[HR?J;9(G*6,I?U8?uX2L|0}G/ZE)jBT+E'ZA %9$2-&436+00874=#2(-+$ c ,)8+:+<,@}.YH4R2P4K=fI<@D7A&d:C<(K/*Mn?4~"<6J2dA!  #0yl %BLݢ٫=\(*qƲ&ЫϭZUƒ+zK˘6п&qjnAY٥!ս W}nԙj?{YϧwZc1_}A^: @ͭeطD0d#Q²j)؞2`S`þqőɓҶ]:a:Sӿw4Z'ΧʗID˲'SortY&V}iNpFJi=t!3S!*l-_fۜC5l BѳЕZ#m+ڞ75 }8۝#B-f_4%OA> GЛ5cܗnKx E{ <a8:@W y=$7Ј ӡPƞ˵$n#\/Dz՚ $kUɛOK߳K;b6NG=_{yӣ{'ط3ͽI]c}uŹe-dx܁.&bشڍ C bp]k(+NF V LxL *gs O+ &ZA pysquEgOiXfp0I¬+ђEs!QsJSЛEyޟԸrOlȏh8ՎC0A?ڲmH-P8d* }ݥ ԍlC)NUQ|Gܒ¬z:XFN}H ̬4_Ga\پa?Rk©%,j_t̥շGʷһOׂ=QBpƧE ܴ.שŨ'%ץ֪פ m既و&; [õäOtNψ#{HNߙhຒӔnGMs;Z3tM4}0צTW@߭ ɗoUUwN۴Еlϥ˾֥HXXJvջ/=g|ݰvŠ2]ʕ Έǁą̀$]7Ϻľ±)fv~d8ɵ9FAZ-֨*"CŲq0Ҽ)>7ŕv[ JDDw濍]½ծߠEt־mC zA˻۰.fשL7eͻ6ϻ_DjR ƚ)NnJc3N(,ħD]Ҹ󺭷oA߶lI|܌>{ fu醜T@mxNz!Cֽ'`jآ0q8A)Ϗ֮yeIЃvظ<@ceñP=1y3pج;.VѢגZ\ 63·Ik"as  8 ur! +%5#4X5.t;'P#P &!"0U4q@*֠g`u7?zi@ՎfWry@Μ #6|2/ܚ^ޤګr0̅1ʿNyͺPT? 8CǛ]*o˜L+ut u(rm97@ο0߀x_۷đCf[p1]в_ܽڭn4Fq窌񷭳(_lAгT8čMEΣwً.eEψ':QUS ^'loQi#dz0j2n@r g״*3~G!S[Eß%#Gݘу߾8~@0a iBŋ=Kx:R rRK 3tN+:! 3jyoO s%h lw zPO!Jt0g'>N U0.s7?Z(r@%F{Q Y PG6& ^"R !|1 IaP('-@ 504~[v]Pܭ7TWlӚ[ʉ#I<:6јZ˼˂TaēGwƬſv_, \`7%AԽWĦiѸ΢r#:z)isfT5>ȋ>׵h\NȲg28a`TOɴ̦D *~$' ) 2 25;3}X=)p8,g5*9s&A#1N=/;WuBXM WvK2Rp?F-0/E,0+`1N+wE;SDM+>B8;5<7IWA>6*#3&7 )4&S3&( E# #Q"#"33u-0_'wM |  S)8&409<.Y5.(,3!5(_:% 9!9{,E*zF^(XD4I._BcI8%?*"E'A/C /X?"42q?w<~FN2?6CA0;(08:48r1R,*308/:)CW.P>d-;(!"1)#bbk# gll eN KnW|VLܘtIߘ!dfT\7&B܇ѡW ,XF ]&ntKV::ad` O{  %܇:G4:k]ra)*m.I?ՐܤՁ9$'3Յ&Y؆'gڄͰ؝ҢѣŬȚ%Ѥ}ǻϮN8Т, FH Čڭ۳ ຍӿWXǽٶu l7tRC1(ܸ^Bd֒4 ( xl!]& = 0 9R J)! -v&2*1"1$/8 E-7v,@/6+*$(%l;)?Ud> G <; :;;4w6HgCZOUO2KRGLlJVS`fskgaOjEH>)ZRreqbri|fme,WzPJ@jJ|9qB.ZD*>C(4g!=U-UC\J-^yD\Q/;15@_-"U&)<2*F+7^" $V '2W lqK6qn@Nk%H\gA|~H a$D$$&!,'>7bO5K.$@."/0A8K5L=0EZ)9*~3(/>,)"0!5, &q= 5XAcD-j۰$ZBQ^YџqʾYȺ*`[3zF3ӂأm߅ɺ߾Аs^Gj܆{ksPݑyڼEߣ0\K1fcAՓړvMe׾B(އ 7<:Jgpf2~& k  /nlJ$#0*@eQ"8c d ( )0 E.Y <D 1@ 9&5+@;5s4j.).!%HrI!jL Gv%-k!*7') !(m%:. .44t44.A1+E1%07y2G<75@8?098nAKS*D7P8'G/[.47 1( ' 6  pBg!"!F 7EO  < n = _ / n m "-h' j))% y!Gu6XB  J  ? /x '+Vv$ $5V|'dZ S  DUI D*,)2Z127*0 ?&q>m0 #^!#7%)(`',*m(+(' ?$ E O? z E s ZKuJ=IbAGO24+c$ɏ7'9{C0ӤDOBcҶiےjuG:Ƙջ|=ȨсSڪhՠTѾmRΫ}uڙeOWǰ<,N| ҥUbqbIi* f ' &: | ~ j@lNfn C ?^5Eoߛ OfJv2<5AQRȰ$ j2`yFieT3X9mо-xʎʽBƽXǃǡ>GSޚ/sY:4P yKh "7QA# Ya!Z(8(&!")`'(B..ql$ ^T5w TA;\mw^Z   O} AH E5ؽޛ! /֎ԒUѕw,ʬ&^+QN@lݡͼw$̹.DQt(]]oʼ ,^yoͭMufgn! *  X'| Em  m6!l os ,'H~ocj Wr (tRt/ǡvӔwګ̈yy'6ݵiIV4G4񰞽nZ„Ѧ p!fIE4zÓq-w̟2#ެ8LΙ`Ӣ>[h'l4:}hʥܿˆh ɫzCuDT؃@ͲՃ8BDИͦ <\Ubԟ ^z%vѿm8 U9߬6?̱y%%5 +hDa U#kV*!J!.b3c*_!A*  '4#(.'+-21;(H5x k " n ( $10+(. /r/B #g>@! 8mЇCɚ 'ZVNlӋpK4QQPڮOZ0oNa1ul3 u >{,d}By%2)L,* 4*j) !  X hZ GF. ]iuA],iI)*ҟlѭ=ܗʋʠגʕǫ0-ɠ|48ٓBӶQ~DbCIH#x$m ݲV$g|D [_H  *## (P$# %a+$N1"/ &'$K,P..4|$.'1(9+_#UY#(&.-%V+!%,+#~  #f! eCn,X19uDH*7'Xr,liqY#:^ˌ ΅^qoڷHzg>—RZјǏ9חd4:0M(^Jm K Np zXj Zb-;T .3_K%٥|JZw\L=TA ^EY6AVE27n,<4\E=CS7=.+F3VQ= MC?B<%@ ?J@?54x0P-S=x5+G;>/ICOPfT~[OZiGQAG@>F;O.@sNXAJBAKJFWKZ9z>X.-4 +C1xG/nE+:$b0!v3-78h260 /`;(-<1%o  o' a@ެ޷ XIU(bb;Trs? !\{s%: G,  "As%*zk Q >X $ (Q1F =Bk:SJ?ٚn׸Y֖&̣P*˒I6?ң :6~9\PHع7ڻ^ؠ4г`)Rpĺ%Ṹ.1ۥ֌@af-VK[7k}<ڈFڋܷٽ.LvɰۮDހez&μ,ts4" &l'v+( &(Cc+1]./3 (n!#`L(SxSA# WV   / K+  c2NDN F0Poh$}Ѳҥ{^FDTkޑ5D   P= eej#,T%g&;(?AC1,27  k#$ ) ]/):D42h)$>:6{`FAY)\#1*!yC&,'c#+ 2.<P8N+7RA$I$B,5$92}K4S>'HKp F!^IM 8IF#VH+K+*$KA+O2Wp5Z!4X;]@Z`:Y8Rg8H&[/F +1+7Ei 3qT S *  s>^CmQ$ -3}2j*D w#f'%,u?4v\1E/H8}@F#VC'Z>+4'. 2+:":A-0D 8bBn:5/b# *;770<7E>;k<;/0#$l! !s)c3>LqHWArNc.9!/%5 1Am4[F.B$9r"V3d)2x+.)5*F hP /#}:=YxwHU~Ƽժ#ƍ ի׫ζҐʹzf;U8$a(77_2S |  +%i>8b@@(*OY!V1-=<[:M:?0|,16)=25cB ?>>::B+}(*[# @0'u(R )?` 4ycP 6 rT OS! . :# 1TvzF0  dbzy> C``No!{ v 4 F)* ,~ #} 4  8a:!   $yIlO$?)["c Sg T   [p Y/` I ^S,|) !+m"1w&`8)?8.@+3]$5($I+ *$!a 6*k9A ;_$;)@5@7(.9'4.);Y-%1)/)8558)1E' 2%0 %/x27EELK4MMUV\5[SQcG^D,8@*5=9:>>B=6JBOZ;Z0)MxA>56%G;>_Cg=]89U=6S1T],U+Z+\&T(P)L=T:)Q2'`&V#AP4Y@?CZs4 GY'761 E)d$q*2p52$/&(G_ r $s*4; g 'd8J g9,{c?~Ut4dG=fo;pxv؋i3 ޕbژ?;߻0e"ܝ[Pʚu:bܕ=FQ,ݨUso Dk` nO   / B "  VuzTZwDrEMv= ۚΒa-#tExcd-##,?ebJS {+ 5^ gkbUU!  so4/'7\1|,-x+$%14+4#,3,'&"% :] ! -0:k7v:}PM֘Ȫa*َCFU ֒k=Ȳߕ^@َගΏßҥ|]ƺyU [;(In&W΂˨εϏѐ˂Ӂgѹoɾ({?:ޮmvOF~" pE  o M ' _~"0]/>o@;D-ʨiȒ3ۻ̮^EԢHֺ'1(ɹ Xݾ~Zͱ妢pYۇķ ONĔK2Ĭ#:3ȇpwZ{0r̡Phzڿ{DɫJ&fդfKQdDɯԥޚ1Ӯk}6-%i^ ʷxcvýJ[@t؏Ȣuxګp6 V02, /ɮ9˝a3c߭۠Ο՗6A0LF,.|ڣ$U/M8Q4]XU &n>~ҿDV.ٔϔ;|ȁմ~TwۮxzĀf0݈==F٩DI͚܌^USU( R~ 0 ZFsh nm1 l1jWmЂu` yi`͆vuqFز׈#XHC"O$ŀÛs%"zɿJ4ΦԶO07ط޸YJ!IKnfI2* 7TAZ  #~c{\[b ڱx_}OX9kȴ.f̔؟jՈ) :jFtIب( !$ bW+'>f!D"&'U4 4E@=F*9 =(,9_;!M67.O0J$4%.0m']0"<+C]/?'7* ,$V)9 ;J-B+2 2jL;L J3!% -l`3Pb>#)H`8DB4:3#<2 9s$4)K"QR/$K0#A5(KWf<1 a Xu {J %7(6+08'$ #G%r,w 7 !<2:D:r=?FCG82E-O8WFAI>>7l.b80>72<2?$6QL\Z]QT)@0B27_730 81UKEXUIKZI.>* T*(07*Q7!*q<+ ^ uI*-.2+V,10/4,2 & 1154;9(44&"' ' )))\/+.I,&L"-% C:MI:@65+ s&(2f(;7B-#!C7.;0iq  ( T P#K  y #% J R $'* $ 9q q D#"t@OC>7T$kqvz-}z4< tSR QVC1\rY7!>a |/,JzڗmGٮWԳЦڠuT.?W\ nyڱ2Scznw!K=~Oސh˿ݮza_ڭvií'XJÈ;/؁2\cȜغZtYĪ÷N5r*3Ͻ/?ę+)φѿ{@$p:3$S]" Vm,-|V "^\ @Qdt~0>A_U0_T e? `;? Jg#0[(2%x;>M J%֮ޚCnڕS(bZX R%V%4K$"z#ed @% (&2OT I  j PSeG Ac }O<&   z"*L",_ a GG-/>y v({U8Bl43shJJS6u̕<ǿ{U٤T3ّ]8Ԣ|ϱS!rѾ3!g(Րm(n o_S]f巆4<κ/˪aX>&oӁ Jzt&2!3-t^ @, .m M6go }z r$ !4=m܉&ք2XuGorŭ54W,qې/2KIYnYmdr?tcksٲ33UBQZX*7Ejȴ͝Hd{dM*'et^Ec }@ P8 ~ %1% f  @v 21%6 [\LEآMx "D0,]+W}s>OPQ"7"ߎwA!%he۾)mT^ys) |2eƌw̄6ѬОƴUYp #ٞ"p ގٳɏ'˙ХȜk̍Àᾣ͢ O˖d)uˉ Qch+4Ф$З:gD<-zɹc1-Ƕ NE“Ř(,V[Vِjވ1ͺѐތ,ˆſٿ߸ʃjf+6 {s:*߹2؍ @УQuސ<շyϢ*׺7a0ӹҴ_bV90 ցwv!؝mJlߌԻ[&f2<҈XqU RYvezS'W,3QXޗ@Ӗͱݼ% ٍ#ԟfلUDHvVhV# oh1 0/ -|=9!*t*=,lJ\SajEM 'c"/ ${a3! P# "r* Z ok! G.oS.2D \1kL!'-r=#^_c;k?߿U?MS6bb3: B  I[+u+YݡRjx[hAZ F(DB n-JX  V+:0>:ޕACxaA݊X1kǽ-qI2Q׍rʮ$@ߒڬBܤءqy0F sh?2` !@ J@>1 i>@,})ߡjƀ*оҵt,y澭^цĝӽƵ;ЇOyƓÉ_6F̦4ς&ҥآ~;ȇHhKL:*ԷUnѯmĜý4~ճ֡w5ӹC Ϊȓפϼր)ϜvnvĬ6Аlɂsƃޣ'v 0R!؇0 3 -CB lVPr_ JW}`/J%XzW׀c>;%F9z2 W/_HK?xE  t,xag3~Xbu3  Y73 H_ T9/+ih-7c  `}-M*11X,3g' m!4%/u! ,[%'f,h\<$"cG#o~t ` Q 6!!rZkC h0|eW!!.%,$&'F)(+& +N)3+h8&/ 3(\ ,*a$(6*#",; 7e+A8L8y/6O-=,OAx`WbW"]JS.(@/@c+?;l60(_&ON(M#(' '$Mzo z  x 7 V:bP\KDZs9S fjB $lHS "4&=itbH mB # }9&L 0W@%i=BLzaZٿv{pHҿS'Ⱦſwş]B@+þaϷ|ӭ˶(ʸϢqˋϢ㼿˽ͤhswNZՐ߷5۷p_ Y ܉&cCZ'+iЩ;yf' LuO܈ۙҤu)ILFrմi#ΧΫ32׌Su+ϢD Й'ό/b.ՌɢbdmTܳЀe̺MʷWʼ#žӁнipם/u@ҡ5D͆%+Xڳ̖e-77<2;yܳ_ٙY8W;_ +)е\A) ?xHٝ j5#%1jiv!}#+1,4,980fE%z/z \/'9 1i=W5FfMw; B'$I("_7,A$,>"G9"7?*:6M?B8p5+R*M& "=))Z*/  6NY?v_eܖo;- _ l >@ 3P V $Y%c-+>'5/:H=*G$"s)/?4vC>?>;B)332,7/G4v(/8\4`8%3=4MOGABJDK ίq2ADΟt(ck.Cx9c؀̂1pjgОU@b|̔؟r%݊VրW٨Y#ܯߝK؏ۡϸǧʢ˄ Gj/Tz~)>z̠ٹ1 ݖv[ߗηaܸigt=ԏrb2ݰzfӔ߂}Yma70ӻխGOn&-|UMJ6<-1> T 9`+24" C]:Xb#$ L&)?"{3$%$9(;%z:S!= 3-;5;528[72|*4a460@%p'y$.;#0RhbQt hV #v :?`8V, j{uO5  #T!y..-,( k 5H' ,w:X@B;=71h3 (3* Un!-i+h)*[p r',g,2"!I!%[,~%,26b849G*E4=J(["#V&'&z1'7+9j"7Y 3-=BT+EnXD=T1I&;9 (O5/1ADM[PBV1Go03Gp9M4K36C ,0h-?@'F2~,"8!"/(97- :-6'-w<%M3#(.,;e?5:+37$J1$&.^-1y/x)O/{'("N $q cN LmU \ '}!%`8'/!YP)t 1 J=4' G68+)!h 5\$16.u"p  6UG#+& @$yu)L*;5b7 6o1p744S8-4#(!D %8#,-5:C9AZ+0 g&P ""*/f"x!,5*#zr  l%x  xl:)OfpK&dʭ״ٚw_z\gȋњӑVަ4HۗQ>}ۈݑ9\F: W[8 !Mg^ '^a:f \ DT* x j  r buB .H~ um ӸW$t\ޭ ɢ҂zM@נƒ8Q"è%ʒ3·5 𯫵/g¹PL0s@iѮѤ@Үgv kĶu1nƧƜC!ɺǀMįƙ-C̈́s"&9'x) 5;ζKȯݽޖ}Q1ܭ<ٺħ܀Toķb5_m>9{CCq\i  V?߃~12tC.MT3گs&ڟ{pR"ԍWٷ^Ё;ТnI`/qQD @HaA G z?Xj0Ծ5)h\HH&ыwsd|^_[z!"-4$"j gG*,CDy i ['9./@.%E+ GO # ,!QqU%o_ (`!`:d?*e*Q]|UBs lMb ~!m iH %}0` P  L 7X+) %z<[" (+d))/&+v !z!*#  Cio!S* 0 &.#(K|^$ Y*QOۦh1 pL=<7UryϿ}Zi)[, l<9ݵ޼vh+0σغm%$׿Cd_zhŐoRf޷"&yW` jIف֧ڊM3K+ށhfY.Fۈ>|SSm Ѣ^3,b֘(dã KS/ЛBQh'[ͅ]l%F z®I=EI pI̍khCA5*1fvǣ^B |yŋ  MLE^h?iKI謇׵AbƱOܟ۩wpZǏrCڲ-ѳǔJ(ÞbϵhWi CvP-Ė8jWϼͼâČǰ̱Í`hɹ†!6ĄĶΗ̿Jٴ=#<.̨>֜P%]] Rami} l%bVx!a b GF/HQva   la V }2s 7  Joٵ IF   #3K#=!r% NOO)/**$'~  (u@#0I=Dy;xBH=JGG:(>%!@9RM=`PYX.P0PWKEB80=&5A4<&=*r7E 8G"\B3=l1m50I.2+-)T!$# ($-" 3-873,% ]FC fq#%E%n'Z$)Z  >,q,/t*""OhzR  x8)b`$JM~ m  qyܡsץֆօw"q{6"2ִ"HsDNډ: #ÌŧCɕamO3ݕܲ׬PS˟b׵l$OӦUsTݨr&݋ڂdP TXԘ_%$¡Ȕ6RqNmnr?^ϯ؍1śEVfXƘ8ҖfOhW!ȀIJ~ BJ<ӟPիI@ARCYsC݄+؍ٜ)9K~9C>ΩUЊYpӂʷ-џ@N ΒJ{ԡ[A=4ڹ)z~J1F^ MՖF}wmi^If߸*ʑNܼSA'kqȬ&Ʌ轐L97qy.@w8 }"{$h ?vAϢPң `B ^ KR, 9G }i+ ux +, fZG8 ) %(|8.P v/5 %"(.5j5D;X)]LL'GQ i!+-CJ7I H,B/6=5+' rfp"m)*,}#r}M &!) %#-M!(/,|-,88IT;B)-(-638F>?KRFK%DH%KUyLNULKdRw`GZNOQ81=V=3GH'J@LZ)SZ UH.?R94~/U/&7e(F?3g5 0#!&jzNd M @&& 2-+)7<"?CcA@1)O y-Y%CY)4*+" 61`9.B}%2j)'&(2U8)- /w&%9 ' D"/OLx .#,#m( $)5 hEe0#0/.,)(}!% w *&!\]!#2q y P|  w }@##7׶'#ALjO ގZ z6|V^i /ٳ'i\y "(G!A#Gu \ %7BLNOH1C 1T "܅,U;Ϗl\gV]Տܞb@Jj @RJ@2Ӈ-uh|̤й؞ĵپ%)KDze8װʳfRµ ߱i& ij@"r0cl@k!8%j)Щ٭yX[ϵ*G$"ۺĴy͍هF}'nݮ" 2"W4 hA6c y !^7's/C/95/#.(={8@_?A[Jx@M<-EHQ SYSJTCRSGRO14;-7s2=*1+-&Z:/,A5e;b. 0Y!-9 /4,:l3G@P;@A9e=,G6N>E0<])L.t@$?00$8/9T,`G ?LFBb5@29+Z*&7 nF+*.t.,"@ ;u&|huF* R1{!Hv+b *" !\)g.7?s*5*@=+)2H/F,$"? af Y Rt |# %Y `## 7! "TN   ? q 70(6-"!' b%6(+i0(4&?<0/Y,~ }pw#u-Y z  f [ |DPw {9_P9  z3%S P@V Gi8C/6 $&A)# :.V1&. ) QD  R71 f 0oE  /@" [D ~tq7\GJt8 )oj_'eoQlo#&P(NK %M(.1.z`.< a+#(1 62/z1jqjlH  {# 2 {8)9/1/%$(]).*/)#9E)3A}*F8.:I48#'#+8f346;35I) (5@'P9M4H1iI6>B -z@C%G&Q-4\N<`*GSp܂ΆGȼ̝q…Ɨ’9uXȧȅM ˘{tS=߭߫UVxNݳEȐ>oF܂t0h!76{ &@ JߟKk+mEb|֍;8 K ZJ <M &*!.#A*N6V$U-J^PL_SPjYKwE,0O51oyYu`cRpq`f@SbIhRoqTaqaAgqNXaWD"dM^MVFWzFYA-^}=Y&5O0G3?1?r6A~>8.6*K#9$UoT# =lgd = W <`S Y+#9#.$0:'2&"p*T"&]-)(+16,n5^,0`1Ee+M%(149%8L=5W@*9_)M >&]&8/8(O&(%&*$* 1'7*324;:F2:,-01,1,*%(I(+)46!m-Q/Y-L2;3X!W$!o C'!=%!# %j, JcA^eS5  Q W8I"^R4U vvnesYҺ͌dg6e5]xO'Jƪxfܐ-ۂ0Ɖíޯl Ymj_ :wpzfxJ?Ѣͩ󺯱{ Rwb#$D췌,߾Aݺ4M?BSҦ~øKʝٍ±x$6kzanޘmr7S*ڳS!K͂Wɤиuӫ[ݣp"&*C@Jh8nh /N8ӧٖ ʪӁ%JgB]=(֎՜!F>LjX0v`9L0Gp} /C O].k' t!#3(%r(F /*n6f{3Y0m#I 86  6;JB6\ݩaV =ӬkثUFs h(&< &m4FpZ/T.q$0( q *3U4Q94 G$p L%Q %)1 R);+ C #%#<)Gc%&!V&*#,(W? x0$4.e/9'(Q%%`#'*"Z/y!+$+>%$/ }(f =3Q-Bk15A>zKAI.9=f7rC5J+DA/K5bQ9tMCyPI"QCHi@M6;Mq)>L1Y>6=97578Z..U11<^=<<><>J4Jc?=;2*0|',y+3"72& $Xn?c( )H,71!%}{ oE܁·gռ8aHtG|f}%S ow ) T.r+. 'm 3p3  -W-#p'h!$@H  0J <\ Q$y{i&|sY]FǟtܰIؼΟ!sS,.ʈsaz .{ȓ(ƅRN/3޿կOҏeǽQ.=Ի5ΣTڶζf L1b.OQ& Z?ٕ|hoؗ:#3j9ֱü%ӦV`ޭ3OǏ5k] H^ru^wEpψԿ1L UӱҭȐžܹc¶NuѵƶCqaʹ ðz¸{û^ScLп ԙ'ۿ侮"̐/N[>&ʼn]6 0F6č2ˆɇĵjӱG݅;`b#s.ۧތ[ֺ҆[ՃkMH5ؐ JOn>^. x %S^b% m@)&,<;9(C12 %!( !83>P3f7$b8 '6*,"1 ),#] v%o 1)F,I%*K` 7HZ]aG I5 5wv5p (* EET+ٷBx!{nE݊zO1) XQ8 { ea@$}#&z&$!W! a   9 qH"0 ` Su '% $Y J  ] 1#ZD3Z  ) N#IS ? d?8VU  j^#()u[m] OQ\%,>r,<6"D,808A=9>0#5['e*29>I69CC?6"A0;>$w+'.N-o7/bA,B1mE4A.763;08#u(!x*"-3%;1 F/6A~=H[EHADUKWI!E0 H3V HNED?O=17,73=nCCjMED=55-,3.j::|GQ;'AL3,9*,pH?NMBJQ*4Q2]Ao?Ks/5*1~ * U C~4# . > + P   p S=q5 4%x//;x\<N^) :  hZ m&>2*!C88-7/nk NJ A_Q*#k8-2#&bt 0`/s\> ykw $&:SR,J-*1*, l%-l32:Eu7CX!& ,{*sD(3M@]U =H;jBM%T(EF?0:5A83*?CaF>D3=>;NB8:."5qQPs0dcGYD)?.3t%\4!?:#9OQ([+W%N%#kD X9h4p*1(8(% D+E !QfKpoQN x q   @ւfΆʳܲԟ%37ۆove9gBi̯ wdkZTt tNe%X 5  L,7$XbOC pFpTߧEު`΃\+cA+ڍUܞ@Ni߸ٜ߰rhC@NrhlToڱi|{c,Yz3%]YOzg{8)ܫҡӻM @ؘjxHrrkSQuvW78K| ]'O&6_%5(+]o29'F&9+4AM<O_"8-,#7 -fCC2J1G)63k;@#M :P7HU'AE( 5-?1'O4<1@:/?C@2;B%=sB3*>7z=2`+809b757=7F->* 9.>rFDHCM0.)s4'3+r#%*,]2H87@@+H :@7)/ EMm; r[" v]&)A65 J+*H+`-(,#M$.(<-0M6%;)@/=.D53N5N/N!2Mk8IQ97TB[G[E]4I_KK5S6 =%K;NAQBUCZ)Gh\RHQ'@ ;-5,D>5>\7 A|>6='q6 3&l",k(.&<(7B8C>eB)3 /(!u $#M&"'!o+&+&/%Js$!8/kBQx qD:!$m+a*>X 2z)['LxW  T )~,/-92b>B5y0' 't :.YAm6lD.A "x  r{z #d z#7 e & j R/ y ? x7i fQ% l^^ ,"659&81!4-M!X%U&' $!)1 "kP7 Up-M+YC( {-ۆד7.KȻLYzOVa9ɺa&̰"4N娦K)񿴼QĿWZ@Adq׮ݳ]ǁɓoH,ȫ\یנQϗɱsÅ@$p*ffiPˠY̢qޚהդ.CɷYѴĤ Ӂ~^ƌlŲa!]iR=g[^f/?YF< BflP3̫ΡuJ{Կ{ˈ=¤ؿ2߾8Y@1҅D,'ve`ˈq\"\;&Ű$ǘMÛ:%quJ>(҅WcԨi Om;Nֲ[֬fsA+I,.rތq|-b믌䞇 BhQ5YJ>YЂX$>4ɧf]g|kU &ݼ<эFŢrRG}.}ׂaҤt{_oսHL$fG˟ݸX˩ G\Lr`7&ο.ْ<2NO>Qo S5%k) / 2e -8 462F%G'! 9" ( !D )'6!S'Y?rM} :; pg | u3H# ' HQL nn %h N "L > f>or#+ 0).,! -9<_Y U (a -rt a= s&s%3016 _ ^?'L v%q"'<" (P%c C  &2-sw|7@8 B  ! y b ir!/ 't > ?M  =:* = >~T ) Z $e9C "$O.k-( '## v#J -.%(g&,O(/1S%8) E=vME=Q7r84.0D%+(Z/_)\/(0 +LE# '(iN#q, AD V a . B&" wk8&%)p .QW_'J ej+> Z lj  HE/v ׹. =bܧܻylet.#ذĈVƦoQ 1+F f3 d  N2$4"X   ) l # 2X Hkl'sF d f( 5+S%M 1'#0L/2)-y)A!m +'5EXyFpTLv ߾7):чW9Q߻;8Cڬg[>'փ" /Uh;;bC؟۪q8QD-E)|DTԧv !'CΨKȇE2G02J D4?FqRjBD vֶdߴ0PJVJyx6O{+ӢS*ӌϷzY64M`<'mfw[c'yjޤuK FuQe 4ytMq50 1aw blf  n^v8'pfdZ݂ݘHަwn7ٿm܎HY&ԸμBTM.߱ԅ*܇`G=ަjbѨ{jy[c!0xaݱەCؔ߿% r vb]QE di9* 'fn ~ u%$&# "|#*g&D}Ym  j S"%<.& U |"pS+ 8 n9I d$7xZ qh S$&k p  t*#5n,:S+J6V:$.  CtK. "A[ #(a*|.">r'#T  !2 GX`) i}&W%W6f)t<[T%I RUΠwӜ-gم?ի(;̧Ǣ/ϣʃ |:Yä e68Ԙ1${na0JȝitǪB~hܟIj!]Py A_SYȎάO$Ȓ˵AĹHm82ctiӾD$u ԈzeS (.<,0>B7 :)5B=)@+0! (K-K!/z"!9'8%y.[$)^8/ ?t7PwB M<#;$-I:)50!u&["2u39; @FXI7H43$&"b%$!],) ,~ *v01&#\ (x@": ?%"lv fCC.6j =" qL !|Ӯ- ֦SS͌ΞiKl ĉ!Ɵo5̦2\rٺӰرu°<ƺPƝfA\k %Ӌ)A=sxH#1TױҌ׵ܰ0>yȞUBC!)X_pq9)x`efK4mCW3z7ޙֿ{ķ_;լ}pn3ߑq )†%jٷ̺۳Q7V U#FȷۨT2ڏ֠OB҄ԝNhOW^ögA. b lP޺~b TazpsХӞ>Κ>o0Z~hvi2 ^F| $ "#o 8 X pg[\| pA v)<%'5 Z -A(Z '>/| QO %Qi eF&Gu+>O`d4iDo'! iQ(Qx \E$F. sɚE 'Ll1 @|kA$ax -@{=[;!;Ӕ( Z&ҕ vӱȵ~MUe̿ȸ!Eٸپ{hiչP^͙ޥDE|Sܩs.!(X8"ɹ/^[Q ¨ϳٱ(õuCѝƨϹHkOPM#Ѫ9ʏCUơWˡJؤ{N"G𹬨|g,ܣ|  :)Qyf >Ь'ƺ$ƄÄ$\b^Y4˝ݵe/ F}ǽU6ė؍_=y΂\Tq˔HKĬ`۰qO9Dmջ|ۼD^UV+FګҩՈsװ_oο_= ڦ289X/ްUhhܙˍŽ Կk"I&61SیѫOT8l2> ܕyʖ'է=! 4f?(0IRxtwoYژmIJI"[iUa%Nr-Jlj qu ]  h  J*E0S@IO IDu_yC<" a'uwo% ZuNiJ= \i9 l?,4^1KۣԶFL˴E{̿nb?Sjiĺd~)vA;)ҡ ig˲2|ӇlӖͽeĻߛޤ_ 2~$E$ +/35z8A5 <> Ha=JcDR@4OJSCLT/%1,|: 0D;`P\AQ:H+.>!@8f6/3N5z/Bh1/Fn2HH/D+?l$S:^$$)D5323-P2CHmC=Br*(8 +*#u!a)`>K*x6a'(=d/I=:[J6;!#5@y=2&)"5>v)z81 #40uo }Tp%n %z    < H8 1d/| &xd \ uoT [$  &`#EW N zWћ:\lC e 8a_/p%d )/T$} b$nh6M؅x͡3gZgQ@w/ :؝n;+s  *@n/5 * *5#x*_  % ; ۋܮ}Q/߾- ܢ} TD oGzn= )8  ' &^ 1PGzia+JH"i1 !0# [ #){-< .9!(2 r +) .l-z7%(' + N_,'r!L4&"b3,$24$J+ "&?y!,(d Q+'/l(88#cV$@(l $ E 5  a+H/(=+i&/&$"7  @!$   &+m#-& J H"7%$*P)F8d ) 7$ e w * ~ oH*QG  Z OM@,kXi4WMo 4 T1'_e [o 1S A  6 -[x*U!}y rB7;{ uWI6wے'd~Ά?ʻvQاQ1$ݑ;teߍߜѤ $ 2%UPWWr] $ P 6<m$y%; w  9$*w" u.W j Esn100+*"0 !J PDm% OFGvP7Ԏ4aHT]U@0׮w$~*;HwV'W]* Xs"l_% ^brӯȹpQ`lֽtzgvΧѨ܄׿ĎT).o۴[wӕe{mY٨ĘS/ٸz̶ѿq)Lȷ @ܭWĒԺPeԝZ~ۚ|撺̟{W*O\uyV7!? Xrq\Q`C!fhM59eڶىrnVʩņˤ…)SOyҌmxЄ*_ȏxhծfKo;bƑêięU`'N7% c ˁ[ȾЀ%42!Q)>ι,ZFZwRq0Еֻ=b{(Ӫp%/qkm…m79[A/GmCj?;d[aa؉z\,Ҥ\ Yv8&e}ai`7@*w +! 6N  qiLc u W =w@ "} v E[-Mu-%3qyNܯސun=ߡC2;?w4C5n fT?k?K/ x w % "vvK   ^?";r=]V uaf}2 Tvk{8L4sh#"S 7ڹ rޓ ܞt3dp#)B c6 A /'bbQ)v3m6 >P/)$I)yK3Jv3@"Z'6b?ilLkOb852"R:i10?(;wGDDQQQXG4@?N:HEQ@zQ< T>Y4TS1>S7+P5,dR@)HE9R!>H4Q W(e/!*K 6 / 4).1'F "c N>>#22B5 @k)nm vށ@,۸1͘قE3ooё;jȴDZg/ʔ pل;.ԶYlJӀQݹEuYps'4 ix3Tgp' D&1i vei%7J$k&\7}Q5D/2I!D\G?r[J2P+G)B-tD2:H)P/G.oN1TO(J/L3JG&M8.=3B9&K:`Sm--N!B72&!x.4#A9H9I|5DT=QEAB3~2_3116.B1+S.E+ &'k;l?ABCEhA?F;dA0@Cn.K?'33 =93870=2962% >[,7P% v"n&6$m 3I .K * { ]"%#%''*3 2(V'+!oGG$I!V)Z8( 2G#\ A  Cn$U%3,^&6,E!=# m :VIs'#_Vn 9Ojc_N ۢN|X(xv! Z  Fi )F $cRX w$ S ( *+O':&2/:;;+0($*+ "D$ %%!-1k8%'-)%'Z (*~&g$f$'Wf O QUǰԇߎoՍXr%b7yީ#JބߜXM-|{!U ݾ`ICL}(vLJ`ÕfqeUܡٯG(Χ޻٘e0Eͽ Gf\jݨڄֺʅqލ6ջɀݗ9vmU*DHt§E/`ΖĻ]1ICEԺbvGef OG2?fyCo[ڲ~,X( Ҟ2ݯ7NHϮDMݲ|߱# 8ʢCUѸ֢ڇ lG٫+܁.Q>yԂ{Ӯ^߫B)u c_ c)i p )v\F\+-6NJ4^A? Iv j   C90|G -,`5$1to,ev%jpҀ+Ĩ|i]u v H~OoJ] T%3 J%+:("/&^s5#.*#of\ !'"&fY~5[ . '$%&I m("SR   Vt F-q;`O9!' W]ysAZ EL_[$# A>2s@ ۨh vDL>srge57܃ˌ߶&d{{ٚک|Z c@QI uaCzfmaq   E' #$& /*I(P(;- "+re3$+*  | 3T"I#("$-u&/-">"  #--Y?603+''T"H1 V%%2u*z7)38,7!3. /'<)%-t2O>k'h$\0:-60<,/_>y,8=F3TF!3$d5d""I(;C=CD:E?8&6H*%! s%8-EJ;tN;~L 99*S& e'a) ,*3k']2uAa%"Dg+k=,F5+7/@1>%? D&6]["TI|6 se3^M!wN- D"W ^6Ic" 5B)0K [  v' ,*K :&"TC (!: &, )&8+ H<CBU4%)L&4^"F5DT9N*:5/!02:8#SG'NY&H'>('c5&k#,+$6s? 8u&!0,: J/$6{8 #/ jEK! E Yq@Eqn 6  Tlvr Dqv z<%5D YS%~w/%+mޟ]r 4 v si _1H3 ^z ars OD .F'#+K  ^$"&c '*P0. 0QE-'%<'H)B'!L)#G,oj*)- _3,?S"H"#(^#$`%g#*/T,0/.96=Bi ,","9$ENK/ 8!* -/)7-1%OV H  Y2(C2D    x9 ^] J V#v&x !z)!3':A)2<=&7$w6[+ @1F1GE*6:)# (+E$E)3>6TEa=I4@'86"y.%+.:BCYK_WYB-;3,138?]EHOPIK65* !P0<,@3f6*-%(( !$V! 1,+w,'*'a( r W #!G  "7%A0;x$57'*C3>,s7%6N(6&R9"D4-NABA6(+n"$*'H&+":5=y=A+&O"y#G$.%% J3B 92&  L&,;N,82 ' ++7&#K(l?0G93I3QH@%<+)  ,(2/'"" C  yc%>2bL c < 5  FE'4lO) ~ru \A},".) !NN<gp c  uf+QH*9q QsN:G݉Ihٹ־s+I6GچDh,(q*v\ ivW|؍QݚʶQJij؜-֥ >xӔ/;c٠1 {lZۅer,?znT$!p` <.(b{F]&ܺ3_OUزyͬOXi{ߛ Ç®Լ=P7ծͿʻ¸5z%4]&;=EӝXbM nܫ@{羋j41B'ª˽ŘӥΦOEHԌoҗ,oPܯFݘqϐ<ʽ޷ֺ8FufՅʹ.~w[z۸]s| VW 6!-Y "w  cq *9 i  k. qXHC#o h Y # ~+o Fy)t HQ+m% ~2fC R 7e0>nW*)cn7܂п;?1 ۢӠz o.i.nʎ+^3SsL5"s ohiK 1` V %O?Ornr)M[[p1~}>`GCaB@ ܣzWKԇB]-ٻ m POVJ*Qns0 oD)MQ&#!q %vL"* Q"81jY) Q % 6ojiEnMeMTl܍IR4`3snH}yG?Cڄپžv^ƞ,Tͦ9ɴIkR͢iSfW(|Ol_`ju^޺.ˊzMms}/*cGյ! ʓ3Đ6?w߶NjbƓ}{bR%ɂ?ƑWI==vؒUj^ɴߗxHʥռ#ǚ B~,ܘӤ|Do%Iҥބ:K[:ˢwj͇څ0u%~N n4щpWֹcҌЫ8GEP~PΌ<޼Y}Пc=>ػ os7n`Ȕؙ`K̖їMſi{)A]ȰƤ[7JCdVZJ_޵{ҹTWڵIt(/}gbrۯ/^lz!s8`) (ڑѻ| _.vA M ( eT$f *|(~~#o`{B H@)څE(PݏC;NY~( 9l d"~He t] lj f $YO a w0Z GY*$*Q +Z$3R"h k`#*0G$!!  ("k,.E.U57C1>PL!6>,/%063@'=2?% (y"("#,+4)7D5]65S4 <<=g;P722-0..,)'&( )=/19~9BB:EAs4$;(3 <."&212z>::=4l,1$5*T5/@1B3d1~=E3DK/)7+'3/9S8B:77=9?v;K4U,D$ {)?#d6. >Q3<04'-xq+7+z!'%C$$95%#W#Y$ O!Z"(}e,&+64507510./x315.0e%'+u*y%*X&@=?A+.R'."0,48?;sFq.6R!.j&+0 "41^-1 99X1O ,s *j,'1n0.d3mg4p+ H"N_"K (*&7 #T ~@ b#X!,`/)V*>NJmk~ I)( '`7,GB07, --T*4*p)$!N _! '"$ &'"(z!X8 E!9:*a#\[E  g g P   1 ;  )"$B~^ C(.w+C EH _5 l :n <NuתJ+<2$PrV+ۨw /ߴzp6 % b  6Q )BX 0@::,U% ^a,  J e;w# eS Q$72 }! T K, Ug % f & gX^ c0$g 2  ajOgd(8("{ FOy#-6&e  ' F  LYR U9 :v] z _ {u1 %8  \Ya=iHZ e1 )|ΙwAх;O0a& $܆$y6N#?ØD,\ ŷ<֘RT!Q5ōy6UYްݴU١Ո/;9ֻ͋?ѫX] >\6s#OXĚH͐QZңӈ C2<ڳc˗ں҅2ܞr%ʣ!Ϟ6ׇi܊ITr РZºvُ؂W?I }KAƫ t .0 i.  K. P%F2@gct1Wc]U  Y|qDi'CDr$r B8Q- u m " QHzr9#- U9~^9=c34[DzQD=Uw? xGۏۆ6ۇ%~_sQ#>"6F`< 'ލܻǷ=ބa:O a1x&Hʌ\F1ۊ8Xڭ_ٱռӣsx._`x.sVzVzod q;3ߕ *_oQ ! s  r  u KC@ =J L C`BUE X""2L4l   %  Q  iCWYz 1onT֝TطSU | -'YVgYx# X}Y zNgeG}dFh + >  N| -zn 1Kn` Y;z6J,8 J  o # 6"?|'x"J- Cޕ@҆ɲϠA?bAf`Y=Z C7 G zl'/Jq .|#t$H w^ZT ]    * >l Q;G=%  O 5@#VHc   & X !`* j  uS{{/* TQ ~4lw]C>J֚(P dN ;E[ ? '8,IH//5)*# a%r]4$]*F0:4y92 2)f&m ((.09)'+8/04($[/3 )a&w)&5d# :) _&#,)-M.'4N'7J+1(I)%4 8A*&!1*0$Q*g] b*!01-d%Xk _ "A 4;  Az}u+5\0v ^8 $ #K % [  -1L $RD\Q] 'k7]KPJ 7B   b ~K& 2 ))+ S OE) l ;!C2O R# U bA?zZv% = + ^ 8$-$~F k Z 6bT P  8b(W h)k4t7Q LmۇˣBg,{ &_4t 21KyePtP_b UV_ԡfڪ ` j$\*$ښ<[q+[ܞֶԉ͟ҫhՔ֞ڕϡmSDUԿԌ߮ޮ<ܥF}И+A%\)rC+P%n<ވ[=jM2q8aGd *_jcb7>7}V4]jr*o^'$$#v^ $+1!  :$! o j I  3evx ~uf4b )L NC2 8Vj ,  ^ < 4;VLAg6Pi n f  i {EH ]!><" [* m u.T0N  g B&-59'+_2;9s !_ " T# Q&"6  T  p|7aP*o ''u%&@#v'%D4/5C++" %(j#  .  C;u  pWuJ| w$![n/ 0 B  CIQD ^Jj)" 8$  S`@O8s/a|.'"V]P,.?2g7Mi; ZO t|  p #-MR+=40FQ|ؑWwJlC$nَ3д~RI:ѪS g1"hA" 7kUB}Rܽ,:7 ׶VKMݖEݐHԜQ։S3 ="6ܱIw&Nݘ߮s+B.ri+xTʣv,])'Lѷ ;zKQzDi~hi(DZ|!Ѻڷϊ :4fAKCFg.\׾ PU>pˤɑŠ.ώ>׆#Dr|o>Us )F2B nkJ, IQ jRbV| f w vBa\/ Dy"( d w m~ 6 .1v o` t" /; wT  J U5cۉb1l 4 c DOA%  : )*@+/0k$G*( r ' ;rׂ= BQ< {l۩mM/rrweP2ˣ/]OVfnhcPu)D;ͬ Gc6GD_Lq ary  )%,5U2l0' 4 ` (=Ve%j,*'+e)&$P` !g!!M!)##%&x&L"%v (t-2+Y' r  /7 7:C@c;m31*)C(cd.&(:s->+, F #+V%' ${# P  6^ -Q 4m4 2m] # U DC!K / 59  5+ ?I)rOQ J7Wh!$6Sn E  XCc:^5KN  CCj}aoEz? k "'ݷ؁#F5ֆrПe߱%9лm2;ޫ5"۞q:$ЕC͉Qܚ׹߀0ѕ JՖ=M{ߧIW3vޕ24T7ya~߬?ҩ;xǨ0>j\"u1AePOι2X͔\/ ajԟ9܌A˽™"ˏ(6TޑRH?}ʯ/p}oϷ>aٱE͚`׶HJ$AHij/jL±k[ʰȒI亅;\v(cr9ӢDw5^!0&U4 꾰Lÿ ʻmMЖ? ԷbʫŽu’&OD,1Emtwrey:$ tt % eܚߚm5"β_sؐܰf $ #fk0@ d  3uJ8gw>" "*t 5 H# g k& t0#H7ܓgjQ\Vڑ'X̱Z{]|ƋJּ'h|Ұȧ:9ۭ/ŵ&էlM%; Zm 5ǤY1ȼ!󤭝㥣߹FqŲݳҜmˬ .Ĉ ףXد%tʮcxɆ ɨ'ג(P0 J%8In޷) X.xT€(9؁hvPxލݪݛ*٨ȡʶZҠ?Ջ$ۈגpIv8f(0دQ(A׍Κ˜CeLސ;4ӦөSҿڷXVmtjKȨS 3W/Cٮl :ܱ>ȥճ"(^kę&̪tƪ}Ťy&[ئͤΛ!]lޖs=kPؤ׀ȇi"{5x#͑IArd')VۿBj16*s `1DY \Us2bZ@E>12cҕpƮɗK˩ݬ߰pfэ˫ƒ'ۜ,Vk@ ޻ ߃N˿jJjY͘ɝʣƸѹ ס?NإҲSIO7i+Z@ 8v)&&I Yu~% % m jmR kW'&ߡ0ۇ8| \ҁeҞS~,SPNĪʲfQ+dڱ:Ϧ.л/Au8dٺcUMLp/$V1 :'no+bNQr -RZR!?~b|:SC] L' M7 H0q 3}?Ya Y 0sj2(d'7 Sߛ\jb(b?66@ph,3iqߌ xyq  \ax@< V;~< mT > 0~! %~H*4G5.K)jn (a(Q[Xkl8H*3&} ڂڨ"@k.ݰ8*~2  QCSa< 1!h { @#IC u &: d5zM swNY; Cq* $5^:_ x7)yp-q(&##4(E*)w53 Z81*8EALER23A #1\K-sK'T#&&/ -4+a)87$=?x%/z S,*1y/1MBt=N>E90=? ^ l$} A2b([7.'10 -c1U0150r6g0j.(e*"q+6,2#8D/7}/.s!('( ?% !& !V  l b3! O( .asg 0}+8,'+l(;T/L g   B)&=,w(0#B#:&+.38';R "( @"P0n&IB tG0  01 Xf! '-r%S $ ?ss m"a$#4e%&P2'H3#n/+% \#&+)5&15145C+A/KzM^p2 <"# U'5 V k'2# ( =!d &6 @ RE ߻ fL$$(2H*!ط40>4nl-`)m 0 #: T 3#  .12= #bsE  {jU ! $^ }PQCOX '<  D71.?  7lvLrDe2j y~Ҫ݈V8|՗ږY++fhs kq& (Ћ*BS/nO jA#7"kˌWڧ;#|(׫bJX̴d`㻴I4x\^-vEp tϤRZcҷ,)Ƿ/҅2M<+4e֜N@DiF b' =!P9*zF" &##m%<+]$**'pg  C%6",,:,'9?*!--/X4"&gi"%q-1$2.f"&& `')1-0+6-(]3 k h 7}|nxy# '#n m$2U8|<CrAH[BF\-z1~ %/a*&!v04:%:::fK4FWOH$98+$ :zs  -x M f'r!!$`x/#$| gi c T#7$ !; {\:9 :O#'%V [kj p$h*9%7u0 '?6,7)2)1&0*'2 ]Pll" N\L @]ڹ݊;ڒwk{A՞ߝ"i k" ,x\bc 5BL{c + > o . : <J"M.C1.3$9-&).?# Y lC;*% N)( +  n!x&d'<1h D@{+&ݩժ״чKN4Ӏ҄Ȫѧˉ@a.1>* ':Z\S3R_)*%5lD 8~;P%{zzk%C֦+9+ON!P.V&f׭_j\Mlr@)W؛e2ߧO7M=C1Hv~:)ێ*{'K&ہk:ܠh܊5݃avo8k&En !hy{   {= FW#=]ϦU[ ƻAI877КC&>U *_T%g]  S Xva-F c {(&Kk !   e   B7  .B]n 5P%N 1 #"sbvBWڳ]%YZcvqE;M|NSr tҵwѿyH`<^l=(Hz8 +%"L(.*Y# -+;9K1 /}$p_+@ a7-y , '.,!Svmّm/~]/?9Yy_zi { pmn<|d\Ηj%gڇ0yϵəԇ ˰˓ q]ϔdZja -   %0T+*b/t+J O sv  n fW M)esi On CU3rs $ Z~ u UK] `w2%$E\xH0 ] X IFm  B  kq i> !lS|uK+-1oeq5M" [ۆ)հ/Oѯʗ ֜ٓQԮֿɛK`Vyȼ`3 Z{EkbÊdקچ~X—o֛49a+KQ V mK An")# 5azU 9 R aq 5C f '_rNj+ 1 $v?t&G4$r)$ #%%)!`_&/"iud0/^+?4~)#$  AB P E_)%!(6 A=3D2*/+ ^Nt(++57n67q,.%)qf ]w^!p%^D$#vaS{  i}ԶHӜx*l%֨Ԩ(ŴzDNJ8QM̫ú[ח߈o#`&Qvʨrα %G)l܎n96~;J'u(/&()c#'t"(%I+0$.& 5  #}(~" -{ |[cC =@v%a'ip| 4[0KE Mb6E+ #= [ !)#P6& -  R# L.W. Qm\+X^V Cz.;p15 % |?1b%X $M! ~"(   Om&l$5'1/RISIm80+.:+F5AO1>.6G73A17//>99w8&B-<%26:I4GFGFc>?5C9/756{:kIyGDE@-8$2#0_&z22;"DEV?;($(- ! &$[!"/,o,'. K+1$@T3C\9d?8}5h0)#"*q4%2(N3/?=F@ A&5g:9;;e:6N7@@W@IG=@>=aL_BLH@A>R@;A8;-2D1.*3+5>O0C3 ;]00)$ " ,)/ N 0D7% i` &QSFN;HK s n<(%C& *$F)S&q%G*&,?P Z   bD[ ^X5iޤ?yB*,+\2Ŧ-Ԫޒ&Y6 7D_E@ٽgsx6M(c^$ 3 _ | ~lt ~6޳cAg'ێ̊^s)مcߥbR݁)`geՍټ/>Bؘޣ$nctE |#!(X%T'!&# O{W .i||c}>BHRd}qT߱٣vӃ yDd#\ȬzՋm [yK_#@Ÿi[֧ hϩͱ|ڡT𘲟r 䪷}gǶ購Ϻ:sǬ3R≠Cӟ܅v>:&^d9]Xs4 0NwE % 7wݓ̿ԮrB>Ց-ʻ{֗-ɐ·czpA-S0cÝҁ;qϊڃ_L ׸<;׭ٵþhF>*ܶ>aiqH;Шʏ<od49Cg'D יVƋ[\׮Ӌ'Hغmۀ+d|4RYڬ,֜L?"XڰJv‰gBJβy%pͳǞ 3&v6oG4fˮzұpӎ̥nA9<6𸸻Y tvԍWؠZˎ$+6–JʚHWnٌMUsІ__m%_ݠ | ?Ӥy+ZݮHcUz֘eЫ%=7Kךh) DY·:ߜhGodNuGdiy܌p~f\'ZI / < 8 d(#$"!," $~  8 "X95,H(qM##3o W3  )m w\ ) {\peR@\?݈ :VX;>9kh%Q 3 k1=wa ,=k*!6"{:(=-`=/8>?)JL2nHA&E2I;NGTCDJ:=@@7OB *>+=#4S.G)W3, 7'*80=e5;\.t31#)_01E'%"V #wxIU GtrM2T=4, ;PY6C RLP@ ֥һZ" 9x;ShP< *jht# H xU#(wh 5&wk)Y,m'c2+Lx% ,=b120*)!m _$7q2/46*d! ]Mh "%6x%.#%,)-*~G#  UX"(),~5/x'3![P9"$%5%+x+0&-#nNE"({H W\ P  . #7 & B  ! WP|2ҚBDX # ?Y@w^!<'?Kڻ]ɜCxC۪=;=*iϹʿܮ 5=g]|1ٞ=QlؕT5שy]0E-ɷԝǭ͎vӫڙ? Rg4ލ'p1"q@]*Jx toLD [%b(:*=-p"c nHUF/.4OFWP{GF-0|y|&o*5G2?3@#E]OmGLHAf;7 0H7 5?F092"m*p( , 3046<59-h(###-*P)@)$I',90/-,%/%--)f#-1(f5#W&p A5|'\966%.'+/:;r9 :/7/j2E& '& $9V[? s gk' p2b  e #L! X p y $B*  W++W.]%:.8+@0"31M $`!`z$()p8/=.<+!4%~&o!J+t+5^87 ?;:C6=V(i1',8291- .,.$6/@9"=/#,((-:7-F*J8~M!6E$7%n5-6,%0-Bb/G":p(, P$='d1L-f<8l -j&%+),X,%(#&-.3,`[(M"'%5t-%S#W Ak 37O{ )B[!8  2(Q+,,2p((zH $ &0%h# !"&/($E "h ,M11{75.(h-!r$Y%s"/%L'(G+)+U#* )P '()-9^9n=g?6;^:73.&&*:.1@:! :9j8B>H=- ,"B"R .#S'*-&tv0Q JO: a V 7 GcQKF f WJKlo499+j{څj^M6NOԠj]+bC~m^ݺTsfJ]A?-QVn,ݢyCk AI z&.WLb3,l{Y8n|tMJZn3y2)<(\9:/)l1i7lo[lMUJ2el/U֫ڑԣѿݴ.FJèlĝ^z߮گ ٻԩMbC7Eҩ%޺4ȚsQvϐbڜtt̲_:kHhQihIl6v HĬӺFݗvf]ٓzߠTBr$ܕ;ܳ OJٗܮ̏؋ځR1qMDBL Վ=Fѷy[!}y|oLY+£Lj OqSɹ޿־}˯˒+җa9!{ʳ) h󹎰{M(׮KXԠ^o M۠?+Mg ƳOEWZHǟˈ~ėQ+1 `E3|Jғʘʖ<½,-d"Nìn%~2FC#ⱵV|Ҭ_Ͼŋt?7֚!b!J bXq+d[[EH6c؁[黼bˆ}fhmʈ1+\ț؛جڌmtwξ⃺ՍS8̤ÜùvO=[gV!^sȆХԂ[gګ5m  K d*dS @wp 2\  x$hW+ hNq6 HY)/; lEXF i [ V A !^z9ek }=ou f/K>c1ka"*%N$G:4r ny93;WX~ݼ Q_Nߪ{Z.!-^?":ЄقHߩcڏBf`{=a~4e8jݧr=KxT /yхMԉ;O٥|y0uZ}8X o7b ֭U2yeߋN(Tߙ!.(}`#vQs ISXb NbV` m J e l R m P . 1e9n̝Rl۱׳&/ݺӅ# ΃&X.-Q7K >'8~nioL3vP@A  :@sI(vV H G&C  fK  2j+K *f 5l_s W\r)   4_  W ;>uZ 6T".}.uOc{ JH WX^ 1 '5 jh$8 L [ A{ 7Y7 7 <{eW:7sӜkb?}kAޱ P^ #K l,_Y\H8-0+vsГ6ЦKڧKI'ԝīQ5kLI:շ Kο5ey1H j4w?""RrvrSs8l2,tˤޤݣokыD9s.&8e |ݐL:o 0f5ff Qc;M`f&>fvB+/X[/h Wb ;5H [  nIb?% E"!g]&]#d-* !d0Bv9  1r ۬ =6 >DAyiGa!+UBh/lk(5?dJhqu0 [ZM r5UDSaaPji|2(sN)`Vo:n/N4;އWҕF̓98ֈA;p ɡ׽ַںI۳kMI>vR^ب+ʅymKq[SF~ } H a ZA,AA}VbuCۙc% P`֪;ҁߵ]6̇**F6ea̠.:֘P'~ݯLG Uh5Kz jvUdP=ܠ}W}eNH.hݱq~>A-!ԡwٚ)DFLc߯P>6}Mב5ٳRܓՃZY ؎3Ӧ ?oۭĂ`pivM?HO}-x8mq%b~@h o TC+sn d. QQh/ }$ | +;(ہڷ&Ǹұ˴j̥.SǕ͋X߯E 鶧)CNs\ҍclܿ9oU2b~ g%uuU-ے_ 'H}Gx=zm/{زܦ܉SgV„x 1P٠~U>ݒhuӓiƟ2Ɔ·\ $J{ļ*ȣ ѡbΘ³ƿɂWl k5ƿ˝Gƥq"R> 󸿷Ǟ q|74ntD̩Vݦ'0kݗَ'ٲ l/LJIH92,\:R'+mٶˢJ:ږ)(tvkތ иߔk]y,@+ە˔'FXY+5ڎ&fJY W  \ %[Eaa oI ,' +  baw ݣQ .nk:2(00#!! w5zC/W  x  } Un G g| i=gLJ -SY- E+v 9 # 9 L+3N5̘V?h=!?y_ȚكЄܗ`0fٲМىGک<ؿ}ܹqu8/rOnWޖ#$$*{ݣK5c?Ѹҗ ޵Ӡ5ک4ҬM%-Xȋςym^ҥ.(ػ+J˱йՖ“*SyƤ?U̿BYЂ«֬2ʉƘ^ {˟ :]5-ĉEjyٗ͟kZ_K[{Hh̎\׊؁ϣv֬!G0yr>f35'okWJ0(~mn0KHYhJ~^T>`jgyׂuѦucZ]xۘFצ׏ׂXHͼ։ՕHʻYLܭڑ9]fd'ݱ){f[[%(@ oA>yR%%<% +FQ SGZY<f# |CS z) '@ ? j% !j:RgS%!!' } ~ [FH  v 5 c ")J)-{ ADh6 p G62,mg2  "o&l!I>#^ $"g!A^&t ,*~3B<<^*T/))#(#"=l:8:l29A0F;J+l:0W< 08,&x&)0.+#"`  | 02 0 c )  #Y? 7`GQJ-#:u3I߁Tr A&|\XPn[NxC xwb h ET37}<&%A%;4=-Q R @|Yfw`5d4 2 C .P% i  9  !xw)[| Gu ; Y# R(*C/*s44>&*Y 3(2$)A&#-) A3E=."$(U+!54 -*u,%(,,3$M"_3!B| /i' i  Jn\ vSPF 3"@Whh$8<:_/y_*P0J#CM Tv&u߲vcs30+j )A)Ezd- O n M C$ #(l w | ; {aG  2 O1 ` z F ld kUA EM  T(&! E',06,4 %-,/ 'U$)( !)"$ "')k/.3M13010.Z('h*'%$%"'l0A.a# #^ S"p _a 8R.$O)Z  Z1qe$    "S *y/p(' )-')!.$h/ST#a>)&H&")18 ( I4! ,F g M ] .C %#l9:m:$ 0<dr 4I>x@s9 5 QonKCL  Ha"B (vXL fV`,*s%V8u*%< .(M.*+i(6-3Y+:-3%-@%m-2'0'*!B< N -43'%) AG>Fo" E\m2OP YCYEHpnsќB4VJKA!ݥ %#tJz+ > sB C)A!i; "@  JD 9R bY{~a4  fT )$ aj4Gs@zo$.^NLGه3.ޘDdϬ L -F >FݞK+  -ծ|_({ܿ 1%gZK O v \#"b K,)+, c":{=E'5<+5W,o+;.@'; *K %$70p/c&'{."1Uv q8C 8mVP mB>>vt Qg! ^ g ^ w8: HY!46#k- "@V( ,7-%*F$/il}" h. +6W,+J)+0//"(("t!'D1c+"&17 +4R%,"%n %{dn# |07AAY)ۿ( ]kM|reܭٷ̨8ؕ7lԦ"шӤ6hGlW4уFyݭߖڍqB=.߻oގ]Ex*hgؗɤݙ΅ԯɠ%T,Ҡеϊ͠`ڣϔ[̣ʪйfp<"'۶`f=W R;=ܠ .%c߼.fE(%U}Pwi~m?Iߓ7xFϚb=->He l!_B*eV& ;HE|PB=p3Ύ8ʻB]9>J:T\b E _ $G0K ` y  r' Z+&',   k %#o't   $h]?(xk 2vhSE"%J}r c |n~ `D_ g E- <u  4,o [#<  f  }5.nx&YBbF{460 Q"QS&߄Q4܉%hQۤ8Ӈܛ@ݱͼ҃ǠPbڦ v>F}'INoc aMD[ ! Iyd~ ~ gKvuUV JAW;F"Ҋ{%;NrHJmV%MTX:E@IIhUv( :?RIvh >> _m>}p5N9Ҙvpx܃ϗ%}ˌ!Ϳ>,֮l6H%n۵*ťO3&E Ϡt\?]*rb KJ;/ #!q}k0/& t," 0f o3d?c;%cLt!aMK7]iDl1P/W|p^@ f'WOߥ~c3f.}Ll:Va-X/s1U`lUMl0>,iLRAP1KKy#4`Q1h[80k+_K u97yr{ l  9@r  Ari   ` IO yp v;0# ?r4B?d % }z2&J[r}1!7 K 68w}QYNy]X oYh?" !:"~&&0#+$Hl)N%'[3(&1$5,H*#&!3l28@9==,6 ,6!4.$,*W51$5 3 4S7:3k /x2*4+L)[6I&v@1i;- lsu  @+|/&+|~  L A' _ ?$rC@!".W R$&pI$I$Z*.!f2#J-" 7%)+K!W,&g/I*72N0<'c5H$j%#m'`(^(/&+r#4(# _ u- ~! *$->5~j"mujj > | g> b l I^B36D [;!M eD. 3 ;^f k    !V"$#2# QZ w$L p8CO rYn ArGGN c  f?Vx /`ll x3G nBh ! [,#l[$E`V&/-P6!'s X #(%~0 4"!N J5^ M<  ?9t  ~4^tzVFE݊GY6S'-gg+2KY a_M# N ^i[ ja*,')$!E#Ne I++1)4';2U:u4.f&+%o./()  n)0/%z0*/"/n)(G9  SP h Ewu %Uu?iHd LJ[ 'h-"rSc Uz;X*|f- f  J Cߋ./@G˼&\pxټfF+zZ=G؆ϗ@͗Ϗiܹt{o[~!/-4qi +T=3 B\ vkfة=Mdm̙Ʌy$y*Os*@*sRԷvSުqךPԸӝ˨ܜ-!|ХŬe?ϢkI &ӃJ*B5 ߐ7٫ٛdJ٩ $bsؽՁڱbZyCg@*h7[|O5#grZV:~C;߿/֗։bݴ t0$fڴ};ڻ^NpԍgKo:bj#}u= p  + ecS6 9_BVJ. ?+3 Ikus7: fl !T8#-`4'j8  r(:"  m|  HKSLl fI4 JEݎ. @,[3*3|  @Qy">r5;~P&A#<  VK~u<   F9k5  m )g{p(u.\@a u q.7XR zC_  I3 z[ bM.$ *< Gn!o7 -H =Ogo8X |v&p Q8t k-,Z1as]^/i+=|ZEn}n5  v+ St,,gq_% '݇YەGAI8b%>p,5aa irb+bټX]Ζځ7~t_12y>]@BLu^T|!t+.* w  }pT&}')'-0)F-!+) N,g+11W0)'$)%,** S,!/#h/')jz'0++$ "U Cu-vm߁7L|s!}јKE].X/Zipi~+^ ; ,/ ' A vb@&A[ Zb?lyIAD2W7f< 8mF ] p  p27'[J[3fE Of A YV&3 v< ~ ".p+!Sdh(4V)d%"# y  /v02 * V \ _PK -UuaboICz OIk~ixIxfG 1MGl6 l,QMhMd:IR#*X3JGK"@   Mz#-EVw   XpWޫ߲RDx M 9-t+) 3v^E &T }% :%}~ ^ b = j p1%=&^/ Kn^8 `x  X I9gj ] QGg$-vo{+,@&o9IE L*W+t zQ$܅O18g9ߪ.kR X =&"!%#$'%C%&RqMYq + @  ^sq+C; WS%Tfg>n76 gl4(W#F( ]p ; G%_ +2.5/a 7ao }. E? t>BIo]" j<]Vz)4"~g <29 S e+(  &-9 !  }8"k/\#:"X33$h#?%.%2=&9,J-~H#.K$K%4&:!+ J"h!wYYk 'b9*"k '(f&)+ S#0yk %&%!'7k K E )  [O@Sy,a& eyF ^ D  u J J h P6 = 5 i K F& c -"J'S [/"F7A09$h)@a-(-"!8D 6w*(4c2 4X!3 1B+," | k$(z,H*+#1$?X#U# }|)x h.g#(x z F!5w\/{,  7 Y_5 }15&Aj9TSU`mQ;RYش۱WAIp1pZoKv[3 `) gfu F~%GoWH.cwM m y7Ip\+|%&  J  /y  Hc}/zi1=k5~7*@aj_-! R..7 +kQ 6F ;\ @b 21}|Z Rz=$ _ D\ @$ wY%O% "G6AD"u VOW"pGH-UQ>f(rqkOpҴ9}ӳGס٦+57~7Dab 3+?_v71]zSTk߶ڳHܡߣ*jou)e{iك< n5c]ܿ.ߗ ]CR2v= 2h#(Q +!&3+5*$#SM( P- tL Q  /r1% NaI$$Q/' ;& p%i$P'$z"'/!.5" @!A,xut +/Flyo:SL o rP>= dF ]t;]d޼N~ ^V:(xߒgj@pXuf`AғgQOQzY|uh U+TxL(Q|? :o;dxS"ђgqZ|dgJ"L }F7B  %Zy?p e T <i{|%n r j7 Y  KH 2#s7(,) _S"O9'#d[0A.!h c 6c J34G d=Uy?MpLqZDPmZZE4i   q0(wL#T p -d(SjcD|~   /GG Q\  K"OnXG U>B%  `\& b bWPWR5 YX.ޜ YyLoA4˻N@f45ezB\dX)(o 'P \ zr w;  %z!1  w`# -   Ua 2 3B Rir(&--3H/3/0"1+4D(8*7e1.r0x#(#+I.7M89s;3;1?:3*6D2F34g0O9&03f(Nq!f 6' wN  ! P!i q'! _QEM sCCFS  ! O P Sx R$ T e ;,!lN =a k r] \s/!#z#!V .|cBL < }r[P&|6xLVGFV|Xzr d Dey G:> P * F[% L  :0E z+"UV}j !G 6 R0 - "'&A%F$%J#%>2d Z  OX[69      TR <3 F   yC j$ &P (((F*"#  !c4% ? d  : 8=CGbDh_ D Yl9Q'qs<K 4|JdMfI " . v }@, T;sqqTHz9&TA;4 . EK  )5U*}~&a@nT fv!  a  N sr+ 4 2&GK cWH $0  v ?0  !W !'HU!()V#0o! /@(}? '; !&1'/@*3/+*f&[-"%]!%j'y"Fm.?V)#/.+S,M)):,*l)y$e&X$/(3rLA! !~Y PM!  X + HeyMBQ;!GGf8J5:n}*Xt ]~tt=J-Q 5<Oy/L@2)h  VRUNwQnY;}/ "(uq Ph%^=$5x97ݗ.Gt%,4sQ^rAPZ/VW ]> :-7-cg}x*f" h<&oܦCtvͳ%ŒvѸ - vz_>;RoޚJVTU;O?J,ݓB0Gikc8ٍد1z!8ךEaAөۖܜչd5SkϞ7 ˼~־1g~(x> 3^osW L %]@5`n3=bTB- tmHBGK&NI ;L1dajsK/HDz  u(@ o$ֿPVB@޷>g7Ly^UA)^Ge΍GU_x^pF!x۟ 5ߖ]Д^.`VB%3+֊֫=hd"OF| I#\zr 9{{ -=,   Uo~|7b # X0 ' 5,t  3)7pkk'In1\74C h! brFF_ ) 3 =  I <U($qzj E~:{ ? ?byo,m}wq{)T9"SI+Jd`<Һ*ܴ#M!Q`t !ݔm&=ލ3A 6M١ګAGJ6pmkU= nmt)q( % G8lcXWإS8|ި&Z,M55Una6L1?ߍ,~+HIL r6v?[DriB 1|W^+ [ UJb Z#~6_1R3o-9%LR  /!9---o !OKQ9(d92\61!7!',3g(w1("'!T#u #!1&%  tfk.] ;#$=))0&`(!*%5180<5c9]5f-&,&z51_2)S3!( =78n3f. '`,h(+O**H)13:~@69,T+h.\2/56~###.!42Q2Z62.$i.%3.(* %'-++,J%!,E*D8Y<0K1+'t8m5Y?s9^91F5300, &0Q+21-0.*(+',&-()*e"(kL+i )Zs b$D1%D=4g&*x/~&*"*%.Z"]JJ),"'+**6+y8(L/@,.0201*+'*)Y.25><&B;:32#2F,2U%*5"iK*!6/;7{9499g<7M<39 1+:,7_%.&.g5"@@{J">@E)59++h..F+$-#' +i .et2%Z+c6,~:'|9c0&#$O| 4Ml  %s z di:B\"S  n@ RP9,[  1a 0 X SX3    SzE 2` Wo-G V4E +X "%"XF*a?$nvQگ=.HsBN1$6>WF;v Dc8Bj  ~ q C| Ok/9K_NK}"8m3t$@*" 2-i.*  *&+0 +8,x@ 6t5,4(6#g-/2u41*%@#v"$t %X" )1t } "q !) 0@7}9QfAmj?=&LS gs0)"80M\ .,!!*+#, &N-(/w#&}C".'#$%h$5%e!b&!`'E%#&@>;2 $0C g-w  =!tD>1 : wu V'   D Y%N^2>,01 ! R% YgU _wM` 7 V'#B1/6 Nzv*5#M<*5?C!7)s$K,'W4 *#,.#5&45^9e8;<945Q34@>{CF:3#'+l#5M-:/[5C)&\#%-n4/1i+'%3*$R$\%QE0W"U ? -i  sIDr <lX? &f(y;#~K .KUh[Uiz.!"! !(%!w @_  w,<%+$i. (T yUskk\J> : 6  uB|&| A)lW`L4^6ay\O9QSE:eY/OroմyG^0~,ߥTUKrI29z{g >oG |&_l+ 1?(,h5.13n x1BB۬ud֜e߰8gCܼߟ L"THl`8q܌|lLo"=EL܇Wy Z7.I#SӗӘٜ[ܸ:@iiݧ&4<1]vժrx]ҳ|PcPR3!!&uچwu @ָ*NyU5΁Ȇբ2υَ̪ӏSRI֝6߫Ї͊:mFg1D_ZSFjm,į1Ϲ;ڐ҇:/Ò[{Z;tƉ99SZ:ܽ_YώᾄL^Ãş}!;⾃v:mіJս]`1iէlц.r=*;ta(!7.#u"U>SX(b&peߤ<@!'BbU;^q3is֔ێ܈dr.Q9ݿ8s܇;ԊOمNڳ[sս d a!-=D[t֚9<Ox!g`c-;~p.&ص "QD޼Cqخs,y%~)j"^r 6HS~+l[kk?ߩYeodf17yW5:e $3FX&dgԪgZؼ`ǥ']27ù[͘~Z'Ur,俀}Š~|@2 ]Ő˚?=M Ƌc϶ݡ.ݥvԏtZڍNUށ g]CXܧ, ߸,ܝc P'r׺ݖطޮF)kIi݄q߭&B  /&|},)JQk܈i& ΐסϳwc&bԼ׹fѤ{ۃ/DܾHۨאߓ߆/b;/a@M=-V'0\8%71]d/>E&O8؁')`':قi5ֿժ4b9'Ei)B0a64ݖv_B 9 J 4l~ 24aC"y,]C ~&>RZ ( 7 6#b E /,_ C kE AoF6NSkP;>h7wI nhx_uW3 `2Fޥdlp%i/RaF9TIKFu/`3 X.@PNJ0&UVa6ځFS]n%):H* *sm \6'.3Ve@E>@U|wX R ~7nr{S ;\ e UO Sg4@IM=Hf e5( t%AH$zP,_u:1g^RX}-8kUg\   E4a 4h ~O/ \ D I  n+J.QQ  dLqVj^i `Oll Cx  8\ J !J,0V50UwmP{(Mx!\9&  do  d2 n N4FCO 0z"O-y  W%[ni]+2'w&&D6k #$n ( {w 6z? z]~i 'wz\ -n]<6 Z  (] $ cE * Wo &F C pO'YWW F 4X.jxOqa @ ?0 ~  G,  17   2 0 wZXY 1 >" )& ^gaB("*!&&+y"!T|$@# 1  L]#L%::Oiu2Hnu U 2}  0] nfg hM9#I HO$|'")t&=# T!)|':\("!f%UsG o*5\u gJK#*g Z 5x \DI7 TMJ4 dPb].+;Ui %] :  K  80 p 6zcOQ K9 b]@. |_)"UEn^)I:a|?=/`pyJ5qoCFk VPF,@ # ,> AV+Rj~qTxHV7ۃ ]l i^4= T=T< T `> u   O imd=ETmOtO+3#x@A%<ZU 8 28 s +  kM&c 3Sy0y j @ M Ad!`D u%'+/,([$V*w)"$P",p#+p' V_p ;$t#8%R!'= $8_m!/(t} X cS9$  ^J  ^6+m3 I<>M s ^    *u/;] #[z[ P mrT T$6#4!#&GC,cR"6*o8?$e2!H.6y&;(;&6#,({-+c$+v$ (E!"} a$l'VGq]  !!P#!q!_?)$)e &}$C#U!]'&$_=y!a%V))G,'!+&+I"u'#$'I&4 52"$|11Q..s& "!hz{D #S ' L OOIU l r@ n n x* P : w     M5  L,l u3^ `7  `C"a f'S" e Q!#   H C }%y!ZQ!;g 9 Z+%O r R ?C4^?V- i6$ ~'9agC}ߥ/neF# TJ ^5\`IEM=14sTki@A % av V V1 4 /e{ ]( ?Q Z YZ C g  vE3oV5J2{_x=i`.LL%kS CI 3@< q/'cQ{%.c#_vmX# g` gU xV   T UQ F*v}5K]ER/M@@KJ fzEk?maHV_x>ޛM[ryb! E-݀ע?־؆ۇ9+W%jzpLӦmV2ؗ5ޣԱ9ہGڙd2 ޛګ`7fޠݣ߽Yt'l 6"X=LЗT8y{[*Uӷ/e+ۡۥνAdX߭_,]`l+]xu#^t-ddJ{t(VMaa0VcQ3c2 ;3~3<.y{i$T#n >e[J:EX8L۝pEP)U ;^JJe B$p{5 :mGp:= a.r-py:ouނuYVs3ԠGlwL*;{5us!bM?-O*"L޲pWFAFWB-^ьJ+@z5??6ۃ04 n6z|׏TJ`ϦڷڼSS~D6byOJTr4?< *Fۄx3sT [ߗL݇Xn>l*zԠ֫Iԙ>wgݲbا?/>:P4Z{-_y!BUz`1fFJWroP [9 4Xr|\,80VC ^9N{O,FaS*k!yU y 0n/2W?1_ZS5Z 9 X ("^dC-OG i i,  ! )3c%= CW4 Vt5 NYz:?n h~ Pg k X  R ^ :  J8  }   OWg $Sl _<!%S s[ -X l= &d(g M ( | x  Ia- 2 }`e `U -Mlx  baJ?m& $DL-) n=Lnt2{x"-Y-Ap+^@j yc!}#dl>ZEydRMcxkjq;U)!YS'٘kr#< `b)NcUK}0APf ?5F8^=La1my  x1WEGq |{ ~y [RL  ! $~ gh c .cK kc ~EZu{(0yeG  Ff_&-QH;] >H<0~kfv6[7Q p~-{l Y@<1.b[ : tf"3u"%kfG2-\Ju:IJx>P1c ]( l Z7p Sof^ 4zL6j>iU1x\Eqw+5l&s]4TDgJE$OVfH^ pv7\ EdO?ADUVU'z40P'Up%`;tE2E"Y/'iגQ LIW{gޮvQjz CgJheC `T<.jF>cf?!cG>x=xm 9`uP?U [  X(?t6}P  f"dX $ Y4#a \H7!yH~i 2 M g %d p _F\   bI 1M [ cCB G]  n Y[ k s  t U1-)X!!:D WN^3 tD  a 2QmK ; wE tlT LU ,  : y 9 B_ -   9#^, S   t aU P < C Wk  i 1g="-2`eIQu##""%$ ) "K#$#N&9$s@ t   "7$R("*&:-v#m'ZG<kk lL|j$J!x <Twq-RbePRJPj CZ}>@$U+w-V' ~g  T dM%AD  nVE M*" _C = !oA k!wEr{003 cyZ e^ oF ^I } gG )0.  wvn- jD KM~n!o @4tIqh|-rH9tx}t  L24r[ t^o = N #R_L R 6 F1j'1Rrit?d!) y a@ );\ v aW r[H AW7 o k  /3w!    )UdR3 ! KQy  K ; N@#U i KZ  tU^l  /$!_ 8VWcqVV0""%u#-B Ej   *S '#$ r~9 "> C I t%@ QT? $\ oW\ P  So  F e\%|KI ) CP9 .#?L: P V / ^N G  |0V==QimVW&]Т{djs`"j1F{;~ d  (q-5G &=~grZ[x Y+ b>'.!R  ;8"iC #&3XqNC} iJ \nU74bhYr*f? \I`E.| rH +_ju: m[& 1   44{2ACnj!` Ph&  d TY*xLGފY.L1ser P [ ]< I+7Rs}3UqwII`9J߾X>J%bimX8 !j(( o"3k dY } uJ45G 0 >(By o? $ r~2$m~ \XP(K`9yY3t6m8lr>ׄݽ_$ ػԡ!'ق>1YJyDR(#F1_L('X5\[5>L+U~pd9z~A J o _E! #! E [Fyk VSQ3 o07PD)[ 5:Jڔ|ښ(fL^z  f b'B \$(Q;3 PT Z+4 m Y p O#7 0 w s  %:> a:.bkOz$ xOJ S"F$". Q_ ! vhcJ`X'E}\ S/ Q b-q L MW 4%k+cg |Ca߷WH]G= gQs@hS{ w9n& ]5c & PNDUm4\{` * Q}7sIuKF {eD gQk KU=p4N ^U `"LՉAGOo")DEٌPU>SӜzp b"x,  m 9 S  ,  $lx_{$G[@Ef; Me#CT 8PFN-ڬ_ں-fڨ>Zn9m׼#ȫУA])OJpHێXC\Y:YT '9(Y6h6~s=n*r;k9[1\C2m۵ML>l?Yt^6)> :%_g{30 +$ Q%Bl (& l b  C%&')M;4 1 R /!`>I?H] C gxq)$O.UDO$+[x'ry<1.,0qy QٰS ;MUd s$ eO'J &  QJXRZ   zmEEij{ [4 sIm)22Ou+~3pm{qR GaF# *  FS  F lm | 6 6K'^i  /  m# Ki3}$o [)PfGb*d?v,("&J?gx% *g9Y؅V9ۀ7;R8$pQbAES"sRU rptf5F$+h w ``^ E:3t 0lg L+;"=DOxt_'bZnFQo{s&,2VFn8W    sJ^Z } U.+ ;Z oL (   F^#n *!* !hJNE 2y18"i5o%L, ~ \(,)3@-k,[(U+3g-6n Dxm %z2$#Y1#'c(R `b%$ =~GAs a7 -I(%"<E) ! 3&&r '!&>! /V8+(.2lk *%"Z%C  P :!Z 6c   wAmiQq/+Q(P /, ;Fn8 o 3B N G#6 0e<+' {? < %, k  P(& 0"` #pm E ' *r&+ +$T' q&v%L$&+"PHC ^U2 N 3y i  8%0 !GC| y#g#%S 4&d3)"7$!2Q!+]$c&++T.1$)\-1f"$.z(&6-n %+R ;K ]4z o  "Qk Hs $X''GG$\;X7n`EpOlzhRB6u)[6sZefH:{EUh3Um,V X " fjYK@ H'{+ u \p $ڏ}Jއ|C wtZ#y?aC  # Tp R)GL ! X^O   "B .- : n x%$!%&B),y e3 s ",D$V $T O~U/j C (*+A_8oh},>p,W s=PS\v/I wR dn#@!(I%(# ; y4&G(Ln M)f\( / C/c&e/$x k @$ G [  ' q 3Y ; $ +2zvMCm m/0urP ~,\[׺ע}:A 2cx@-\ZV0<?-j@ XO V!Z>   9C;e$n U * ?X'HWsi)5fb_oؑey;܇v'iu`|TEݬE-۬E&!0:Sta{x!)(` R Od}  ""2zI^ $WBe^,C/qk v UQD%&s'fM d=Qe,%#)"t$" 2Cz"s 1|  . n W2zw(fi kHCt ] nu bl-\ 13FlQ 8  dkPE" b ^A  1 n |$: " .s#/"!`\ K 6>80-# ##1q,9#*H" @Yt4&Q 1q~+Vs.ӕ 1D*}GhC 7r`OB[?v$Zk :6SZ,P WU#sB ^'  4-#" /!'!(iF s 5zb^yLSHa(H[vߢWܚ_WA[ C _7 a 1tx * y|w(95\&B#%Gյ\&S s[q8EpM<9\702&mILr U 5e \ݓ!Ց. nTDs Y\op@=}3 6/  \ #s .GFKq+InrpڲMe̾'sZQih"Ӣ=gpŸQTJ|oOH3j byU HLL< _ J n4 Lh~-m %Fy s]NI 9 A-a) 83t =T# EO>k n Dqߠ&Z' xnVZ[6xS ,~p j847 "Zeo)l ,- - &9R O`&WGKXtJf~هH=|P7(ٳ 0ec K@#.JGmh t;At0(v1ՙzR&ڼ5PӼ} զ3ߟѸm߹W,awѻҕoݚ)ՙͺmǷӦćېըD 0 ϭTKܑW&ϼٹԀ{]͚%{ғgTTpأԬDةCM!KM5G + lP\ K TL}o\0 m0= Rߧ4D+qXVFݺ; IoU@>"0n 1WЌMه_ݰ9&&=wT͓3}j1Df%M5 tvosH %,to K.gQW{z8c4Z6'(dgi)E bqR ;zI3\  (gf,zV" 0nc"Eo9 J X!, $dZS I%E VS b K+ G  p ;]x  ] x6#L4!a/o X"%-%"F Fd M Xx E4'3L'?Q UB |Fz%  ?3%W@) ;P ' U Uu h UV +'/Lh Mv]` n QkCiY6ZB/|6iPv{T BDG "&#n W$J   n  kY|s+ 5BA  dU_IR  e1h}nZ  #^ >qr  )0},b,$  j:k A/jpSd ctV'5*UTIaV|I#xE1.-hT[ XQaծ~r׾RI(\ O. ٧_x=fӏ޲ތ]0E:5֬ʗ͉Y"L/ḟ$!mHz% 836dA  ,XTo<G[>{pm 7 MbSU : Uhaj(c^rE-x+`'/.H8ѤבܰX!}vsneVͶQVm$w2ݻjkNr)jeCr +-{q=gr4g\MKaG iN~5? #`r9 M NRT ldz An, F& H $7 >MF?48o '1s;-Td/y |h K?$naakP $l5v 5 [  8c1 ~rf  p TY NDt ,& *=Gh&MWOG} @OmxA:^ U _& F^B1` 2zabQ vSqMi u߳?`<3.5[ ON+ 1 %!+@+ln `"!>p6#( 2  " "8T6([  @  ND" }!";& Z9 [OZQ24Se֑ڀt 6޳k![2g^*=4_zLq> |~& (][0a\fSc>1l#PE}v18~MLFJdLsH2M4` RaT]D߰ ?b_+' b4F; n.NA H}X\Z! Ol ;\ Y-޷ I]r#==w|Em *,i | \e-\,"n;m-&Z!ޛF #Uua!D'ՅހobfWSфזXv^7+ƙFi7k=oЎQʨakC^Y9>%G@רRާċ9ϷίHd.,^e]@TھjNgH4JC1NP'`ޚZH;r [bS'BlLrU`;lpzqN*o 5Qm: "9׀gKuo[z=vG4MSܷ pm P"׃ڧ+ӿuJqY™ޭtCΆݝ|H7-M $pxjZy*5^tO!j/1mVtݺb-ݐ9> Vw]%[։Ϙבk^>M?yX@i * +N  js ZR&T8 j[ A;W'.i l_ZU=I*# 7 BjH m| +DQdl PSϔgsg߈&CGQ[ 6kk3BX5^Va/ltܐ ֮p+Mi*d:0ڿNv`0ٝ`G[ܙ)^lt$vmZmK.; q $I ojl`ޡmVf:(ґ|moc{ڳ<] TSy 1 >MK eTX( LU[=\*gČyL*Iwyӊq]uӥժ<˚%׫>dB^Ƒ;ָז5բʬڝѫʃپ_ՑӹcE">%}ږ׊tߪHg-3TpΉQp)a*o1= RX٦ןړW޸/t:U\^(t>,+( [A[׍^ ߵcb;̞\W A.UAP1 aczEU78SMO XLj/ ݎjz? _jz֐&g Mo~ W 8 6\gA ERW# <aTJ# vx2b_ r\ }7K`uv( 2 >RXݬ%V\d8ga(4޽BQB3MTg *4l5x5eދ+ۍh7)`Y|עޮ]OpQ1Ax6.z*3 ٵ,#\ƻKja{EjaF/ޕ&ߊ8ɍKUݭ4YZ B3xžN˂p#.'Ͷېʁ"ETDmW\^Uڛ\AOؼ~߄f}k޾*ˮY&vٔA܃& BHdcLd\2TnFM  % .5x eH"U~,| 1c.5 a0p(EZ"-mrh"Xf  > 5h  p1-pMgT56HN2 R j> )XDV 1 ] <E8Q'.T#]*Oxvݾ5R 8EB -k\b,J|2=)7J7sj.B70(H=vlh-ܵ^i{1lΕi">LN' 3\H C'a)"V!83 TA ?n=vT( WD- KZ,nZ[9N8=F9#V ԴH[ QPлjTJ.!_ְuNqQ51X=347H_xo6jB ܱWٙϱϨ0٬ߘrh,ֲ!=ޅ/5PڥU[ŵ\ւӏz(0"q`N2s3_ٸ Z-Y-שQ8׽%τKd|`ۢ5Uxi8O-H&o;ؚpp!K+ @vn D 2N&%Yd9L0/K4*b#P{]pPP! j}Td[q2NS { _W+Hhb *&$ZOa X z@3Z +; 8 3%G vt XY ","P)"F2 w+) = - c e #p`|.$s4g- ' 4 !4 L"_ 3zH(+ _;>k.h!\s y zD~- Y f: ;>,c E  q,"k3\ ~ !"^ +{ G~%!d S ! }u\yg 'T|zKhru2Li ~+U xc}~(   z4E߾i3|9]8$O Qs~کHq~y0  Nq (Z d`N"kODaw#K5 ^l/  9OUO }" $KUftfcVX-8 2Lm#& N+{  S:0 O*, g,E 0%jx:/})D6o0DF'  ~gs\,.5B[~p W#N BX:NY]7% 9g`pFe  Q4 z   g}Y S 1 iPB5! ,Ӎ N g@A W<C,3 nN]3 ~  Y C3Y8u Ai 9# } f+} h &} f,/' ]km b!]!* A xj#a,==%r2F=O  I&'Gw&*= .#D/%2'-!!v M)* !p duWd# rW\AI LGuE -*O#7 P wl *'R Q){' f Mw &  {   1, ctf(>*(Nf  kٺۃE,k׌[+ 7ew?#l ]!KJx"2 g ]\ pIz]i56u{nfno t //c0Dݷ3VVHpݹ^h.8 &gP `4no 6 u( }lwcQ?:>> T }lq Sr($40Q$ Z E>}#}xeU:"gDU #"@* un7 E%h 3 .0C {e( % x k+) fX/4M U-XYe E h(2 | (ދJRf  1 = 3!  @N rjNO&&eA=h_VP?@ ^HzB>Mq?"+WHt# MOkg ' X\nZ 8NbD=  I!Y|EDR2M&_~gQm& Qݰފ*ٱBV9r <2 =-pyT g  ~  U q Gl '(%#P%  ;*),)$04' c.#E%|Bw U OF 4:%*%9UH ;p ,)%! m& 7Q'&$sfNG Y o S B # O Z05 ]"u? <O r v,Q5  m9NuE2  =!' Yk8L <pI my, j\l1 Z @ D!y'"pI C*_GC  >0ORw g}E ^ N= "<|7.D ;%q+ \ S; j QS (C YI5?Mop  ؈Y._Y -  #O  l W bal~J,(  q5HKl' z,}f!P ZgK^b-} {.S m;dA 'Tt62J~Ja3 Gg:j LO#} qY1& Q ` ; }A9eI% [{ 8O(u Px%+ o$";5X0 , Sy-7  2? A >'  f|)I)Q+ QpU8Oܤsh} Q dnV> vŘWuDl%l;;D' 6ZdH7(x(>WV+W!r]Y$_޺B7hEf'A F TH  P|NBulW"+@s:1X}i/Rpguo$ "wx ` # {  }  %Y q@BEZ{m E%r'rd[kQwd ,2K6  |BN O I 3~)[ j pol # gBL < ~$@7+gO rO,L  JNOvr ED&%7W*>$j.ZӭҁPo` JA    ^Rw tnyM  Q wi2*ה $Y*`l  rCg # KwN| -=l] N>3 p my&#q d8]`F"V&MHZ[6L7q 12%4gs Ez !@~  G+7#1J0) v?*4)7B $6/7r"%4:}((99bf6,/)4t6~E1!y_"I;ua8HH [&D@[B @* s VTn IGcGv+/#ڷ?1p\޵@݇ϻ07j;1 B0  vCHeڜ|[ ~]IO}lsظwU'97ߞׇܿo6x Ea.S:Iّچ=X )ިևXW2V/s̓"؋cmC0oBWۋi{n+ G$tN۾y0`0o~Fmіʂv ќPzv̐ӄBuݵO#̦c}gv_ #ڞEaFIѓdXgfњ:Uשc>ΤgpJߍ $bW5 9_wYκǰцH=e}{ݨ51ZXq۪(4}Ӱue.ۉ),F 7R TpɲlQ"nPܲ` |8׹qV -'kreqm'E$RMv . &  5K na{F8L@ mu)57hޭ=  wk ҺY*g kuk6(͐yy< D4.T\q_l*Ҝ̻ S[3w37S1" n g V-wE2fX$  tR3wnGtC/z%U G N# gM HZ. C y[- =$#+{ a,*@ E+>BKw`"&/c15Ga( !!#5<=  ,'4-^(#B0,4/$ "#&,C/|275/,/.<')#s#^*,D7?1?*|-{5$k(^bq% 63~917%&*(+67('r!<)$;3-]C.>+& uC=OdIK#([Bb=1.o)'-H-',,;g;N}Lu&_"T;K;;.0-/0!0&"g>9yB>0?=,,q#$g,,!!%(#*!"k''Q~!,,8Q9"&! %b  +!#3#Um^ OI"'_R(p'%r s pz@DU h%%!P o/2t7#d#$+&Ay&$3-(#(]GL#r-(%/)u4<+. X c  ~+)$T4.k 1/(  (")#,<(-a%&x  '<#0*+ -w w V}B'  Qk2vQ^Bz/$H@k4B$ +JR:lb Fg : f*Z"fc5+]#[X '/uE ,HdTW W:eWU& a0N 8 ?7n yD'yMT5(V " % , %& u @^I /X{eK '> 8r{k%*"B"q  1'w'D82 ;SZ  ?xd1'$X..?`31=is \z3 &{ 9b$1+5P u!!'%h /W tc$2/z' Cf\ $ M5 \ lo d|:c< fK)/%+>u g+& + :9TQg!!< /B{/,)n! fW U ,!P $ >.{8(%9 * #`2/)- cS ? f.}X)ZVٮV ^rd9  #AY0Kt{:Y9[ 4  K dS$S *$v t1\a RF  : $DEW&Q1(/6,-e'+t&_"7)}G#0Pw!1t"j$<t )$->8v$CQ'.J|^'_*{C  a z/!5G t&7={ $ ky04*k1\'.v,%2E0 .)5,.& #'A)l04"G0  9 Y##i :Ez&n Y/:EIa|o#dl Q!CS blJ24+A,eW|).7;xr Lz#.\):4%, } P0hC,10w"$c}sxt1#3+d,0|C%6"y$)~"@>_  %+ %n%G &<0T db ;2b-7=tM &S d)z-"9Th w8P ) &5   vL3- G&_3 7E/ =fNu l Fu 1T.\>(5N ?  /5N  wc4+AN 2g '!kB  > y@Y2W)OU(qRZpaa U #6yM H~  p e $! K g" kpak  sa t"P<ps W ggYK=)# , &%1P5l8Hp"0X;Z ^$c0'ww'  M @u]%'3'eym 2i 21 "}m! O$(7 w' 9 M Xg3*% xac9L (a?Y8^{o^T(G$ [  #s >DS P',5@/F\ >  *5v /'J* BH- M4_w3# A yTe /(   6 y Y8{i`( ` )eVu h&_VOOv 6 }!A z44QR L#: )(64: XL&h X x '\ ]w L 6Z [! jY{ϓ'k[0$#wPY܏L &',!OUN |?Γa Q(jMr( gm%3 |$` & I" "jTMF]F@o &4oٳK8 ,  f/#rX A K\,`4  D)JzL,&sR: "8i9Wc"qOCUU~5(v* 9In ^  kJ *\e0#o$  ;h(1 !96'+-x__"0   R6 ?#&AUb9!'\W4r 7!{ L X  3f .-1$ h,    ID$` ;n2 Hq34 -%#H! t12Sj%!-)$# Q^\ p{ Z0A)+Ac >z%73 i [ b $# K# j^x # ; K*iy6!G !6 |"o!xB eJ`fw<9R6c x6u' 8[ O/ - NE[l%1)` =*\F_DR4RZ r | opIT% yq<{=%*`E6 )~TJ3K+m0Z&+ 4zwK<@f'&"8)+.NTQ,[bӈ/Gy,c$ kq l~=Q2 Fnoֵ1Y3Л2 |"i0߉3S,R0nGDҒt$#DPn'ݶ "V#yd[LR >zk = 3nNG#!F U 0^>v~ N'<V C),B n nVO-Wx >#km"H {:! *9 jc$ut *sH '{&TlCel  ~/PGe JO4 4 ?P~(_O. 4   {n?@ [::IS,x&Q ` ' e 6F _ 7Y]y*+ s44 wQ]#  G#H*R-  d% 6$ )u6tx N^H (3 !q( |+Y, Y V"BI1s ?' < h z]sJ #ҋQ*tLjtړ6r9ǴSws}h, ?XZLr* nk&>Ԟ$q ڇ H& m 5w-ݿu4-`ڸ_ddۇ-\:*ԃڴ=K(ݶ yX 5,LWY=di $]~TQTg%گc`o[:##=_'( ]`Kn` 2 @c?LK'\e#1( 8s[ qH u\ 90 i 9( '  R >^]@ 'F -l%""  +"  4d" MO$%8[ &(UC%F  2ݩm0Y E]:s|M  Wj +D 8O A f4\Y)&hb# % u)+q\_!#(\ $ho^'`z\ & 3 h >_#e.M#y>G ~ Xt V~ )3  Q!#<$% o o M0=a< \^Q \  [^*}rX'u V-wk Y "YA+;, wSQk*W$|$$ySj` MXb# WEo#([ b 1 0 #IE SS=C A m!R #%-$ i$ LS, e 4*%3Y6 ;&( R-Y!P#?84&(Y75@:k 7!}>7 0+O t aWxyhBB| ѱӇ "nn.) x%=,X+Ih ; <"F $&fB{pOqY 3>3< ;;v  i% +9n   vt ` H 7 N [  -Zv19ZW3cQ d k$S= i<\//Y;uH:a4wH S oXCDE!j$%J0 CMʓ` jӮҗFܔ-ٗ;gl$ġə>3 ׾ п{-,Lj"2h3"]$4(".8h7GD ?y rޔ('6 4U> r  "sHV 'wD"b !!cXIJV^Q^ hւh2(JҾz!6h%)_k)7)&#f s  @Jpqp*[? =C(r @8 [ܭ?y9+#!00 y j ;Jbߏw x) m#4Y 4w yZBW G []f>d  SnMY6KK$v @^DSwEO1{x H 9b3tXy-y~=ȼ ߺ%Ϫw%EJ M W # {dTO.J Etii-('ݩKVEDs+4;%>& dT(k   v7OݑVA,T:@HlrRs-YSZ$r׌tP9 o,gj#H' 6؀ۻ S _ 5)g. gM V'+k DGE dCGmG9 = Q"$EOw  e :"Ssqކ8/mX|(ZbQt:ve$j%_K`(kxf ?`LЮT~ӌ&=ێ #׈ۦm" XP:X!Vz^׮J)3j]?"&3 ػ-ynԶ`߯x!}SyW  J X&Ko -i8=O`)95rVج܌ :F[= RɝqSq۫d ˧g,:ӌj ީ.:̸և%B H+&Zou sP u!ycuLj[O:,^ < { @I$%ٹ+]StjHܯԮܞ ' VK"׍ Z)r[ 19't[/4pJyߟj ٵGg\@Lj;ٖ$3ou SJ S:^Cєk 0C -  ˎҢ0KWj#|ײ6YOPFCXPwHQ|.sBu[@ߐ<C~s&ѓjUf $FL'c ,` JJ=)/8 UnE(C :"2 k(Th& T ݙ.]}  gfH;" [ M Z!T ,8gt  USvy 0b1G \d S'" TB M19 s,cPS => <$D+$ӫ"wa V<~Vz2 Cs6 T < EIkmVa/j" XIB8 RZl,9 :&q   ,w1%8-!uTT I$ /x: &  kZ"$d>.Mx* tw| mZ9 ,Q*w! k o >U,: N} K x>G-)>U{ |pQ)eE)t۫C#q#3qVtޭX JK _ # s!P-"%I3cR /_<8(g @݁udZ| F\9VY;JM`eZrU%þTľ@ O+A՗۲A* :d Tu߼nf 96&Az5U`ϭT^s֬cU`㐻)~u,i qj+Ŋʾ0 [B' bm~ > asg5k@ \Ԙ$[kc܂Z΀(Ht%Ν&S[ =L#9 ;%ނO3'! yxK?WW! uhd' I0=qX8-S  q A MtM' ;"-/9#)\ xP[| % Q gp%"J r $ B(=OS#/@j TjYTM e!G#sj G. &]{e/# G.5;k!~ i|jbrS'O  ~~lܾm=ڸST=#i\}tICTfH0eƙщΙנ f'5A ΰFt5Y ޹9j8ʴؕ,׺ ϔ^;?Q  ݬl^eO|7-pǚҘ9f'@ ,088>-"3= O~5/  m% r _>X"&tu;;JO&\/%X? .)[6ӎ mMΗt΅]ګ}(S}  eL c/n ];x1M;z]H>ߗ~xnewB Rz| = > WE/Gs3* 2\\J\]Iv#'t?4 IYYp|޲nڈv ^aZ;vl=  U R\B6)$<RgEKb З=Կf 71ϼDŽˈPߛ ӒѼ{5fu]Wڪa &L O~0e9 15˕r.o~!~ڏFҼtߒz ûXݮ(ԃ[&EFg<˙Ϊ.XbݕCp0ջ^_-k; G^U0.Y3U_@M`0El)+7na;fr| !PH.:QgxL| cyw_[]SN0ΓͶ\ѻͥ`ܞ)UAj$myP٥<ˬ͏Ҧ1 ._>#i PG!*GGһsn#hp#e9{l* M ~$LU,X LN4 ,jO(+&& ew: ]E4\ #+Rz̮Q \ JK/x P gAOZU ^B% @d9FB6!NB 0+$0Gg'{'(C(P#.{"- *)&.T.M1, s" "Lm,$}%!)$ 5R%2#[O/ *!#6Ho 6#s %+4 vq2 !=> !OQ{ *Y(3w.$$(+T*R251C$$(#---z %-)@+*')3,2+-: %w13"H7*-+!j+ 'A3%DN6'/*+?+A<7d7e!}43*) z*>.S73*&&!#E)'x#& /C 6WG,)#>"i%!.&+ '`x=   i2L('!&dl#(97ZB%%?NC>:A B!y+174"( t `" "=)"R&(" '711gxuP ,&G#Z$rO9!(CB+f<R &#6w e / z ..&&&7U&~%]u #&| t+ % 70I-O &! T R %*Y ?P D7m/4-s[h>")&D>t8s=6J!()-A:3,|C  K" a+'9! ,'E q(?x xn1{ .!7#cG 7A+$4S5a7.) M=i T 5}s3 { w8 G e& : =F+ # 1l$!+ ;"   pM' 3Z/;7Z"/g-^/@B>69%w0q$1'e\0&3|0!6'9 -*>##"`BbK.u0 <  ;`8[9 E:} $bN]^ > F= 0&)cpl Y!8 I+&K-#K7[Cn!* l ( 6 A)ȍ?V%< v8uݖ捽$Ηgx~ڑYXqG. 4dٽ6 C ؋<0ps-sV~B (7CۤW Cd)ܱ.sbL5i\B@ 6 }B8Q9ҼtZ6 = pff #$ ݾҁb}%&t} K 1k@l@  '&%% +c> pC lTf1   =c q7D;d6()*aX @ TY7˳ӤͦN]Rf[Z4 ׵ās>eFD(Jo9S5|, =Y ` 7 fR\.;kz(  . y(p{P Y*Y Ycc : &x/~5Ip um b~!DA%$e$  ۬@Z tv9' F" J!&3z:n4v7ї't9HOy: #v&NOIM *-XRת؅e d}1fن؉u#/7(THf%E0ա6dwx8?c@X$ BIo>l3_֙A]jz.qq |#;ڻs%RS|]PײIx>Ւռ؏اE,7*sF%HƄ۰- @<ٚ"2e/DmDt+U!Ǫͦ׆1X)$ & XL:(`  #$q v $+Zxl".#&ho2(- `mg3; <! `#i" vjhw:Vף-H %+"0zjFw[6~j-?9=$o'FJ>9B+vuM#%2C ] A $H#fqw'.5-&10\do3GN D3 `K Y h~}nOoMD { d^Y5)%72G :g$V"p IkQn $~]:" % "*"'uh _ !  p '_%E 3ta  3!#3S2.,$A%+W/2 $&U | J,47'7 P!o 0SwM%a^UH ' i~\uy %+#R]; 22:j r!~57TrL"#1"2-/. ?-+'#(Z k K,$,&$6*.=7.l! 2*/2 (!0(ol$LD9:1>$J](SB3$ Y*""W$$r~N0FS\O /& C<}k+lF988<33# h < to+*3CA7a- ^ m! ]XQt7 @$ 1i)"196#k  A"njdFNV * _g {} J(! Ft BCx+@ k?R}\M]Ol~C$ *z4$&(pL"qJ0A}\$O?,c $#/L~ 0}ohGaNB۷>̰S GZ@LެWy3]߱=2$^ j[?ܽ,8<͛ͭ BRg( L y :2ۯcߤz.+zmiY^ fȒ^mGǾϼHCҫӃ߽Cm9S aǞoa^f`MLihЙΛ_D4l8/9a9E '+FF ,"l C W 'jT) ~/9Um"L5_ x5Βρ?`)I Q۟/\#Աu `$W/"mփۗ؏y,׏Gs %oݒJ as'sGGPt>?u"6 !,M0Br4fqlkL[(R170?޹J0r_&>~O/ k`n QywfsC}"C#! "YFsB$'bj-H9 \? VCt!߫J 3Ի!7 vJHۑ|kOpqYpҡԥ-51 s # j>D\y- 0'~0c܂C)L6 qyk-6b׺ߋߋ:.#I .؀^zm& z-{"oѹҳl!?ztאKNOyߔEč޻J}ٽSg קB5܆# %4?^ysJ@(u/gVJ]en')  qѶSo ]&"S&r lp  MFxl"p+T;7:5"T|Y C%7zV#ٖM  $& 3bhby'9(-#)z#9иՀ*!.,2?g;a @wjAs#*e$1po!+J  $ %:v#9". `]`2(-b\!RPQ&+, 2i~h|!4n43!C 6,83tebMOBeU[h , y j+f&&78qA&X a0& '=7J!%#E[ ($:$E#u#)N-!=! K/0#'^*[% *h(H,EuRZ^#,hyL6`)?MH2: 4U  ) +; !d%%r:_ ~r  e;z\32v554N T[H((s rzX!qq)z %GTs35 44  !":R?7R; l}p @ '/m4  2^Sg'L ?]w" '!$!p rL L h r#k  96i W,]","+1 C ~ M#_#!k { PV+ V k+ K  J=NJjd]S  R4lU(64s^]W {qݿ#u ()>!< 6 c)', x,Z]xA~a 2 (2m-m9"*E dA 9  =j"TMV Irj_ $|!H02+Tڛ_օ G#S<l$ P1ee Orf #-_t +:!Rul;?pB36>>{~% Kw+9oXrQMo y q 3 ^)Ս|(;7M8fh 'sz!o. iѢQHD5 p@$˂- #uH k ݦDk ݼ O`< +l+cv3\d>["C 7  %6u KH(m , (G$߰!M@ |#/S 2n8 "$X4 J3 ~ 8.x: \#'a+&1_8 ix> L5)#$X :o,.6 ٺ!$<*u %,Fwuhт i ?n{$!@pŷg8 B Q': % mS!% /\ /Pt -Dm  /93a&IGNughVw=^ -] 4=;V`bw?}xa(0jZ] iu@ ~$OqnfU.K"5~e#;٩A 4ОLB7;>\((^iכm^v#(s n^24|^!#R ak(5DA-tw" ^T_<#h i $BQ)*/`$'!K-C}'O N'/2Z'Xq n>*d2 i#`&] Y{Rdc 5bC% ={܌ߊRiYWd#rcЮ2WάĂݏ wd$P#-IO &)%l c[ sud }-HإSr.&P!r\fKT,7S;V=" ͸Ӷ[48r1ځ3q2 "Fު2ǮW6[^^ڀC M8ۭy̪W2TLwx(LLِ|I7 $Pʅqٱ,8a\YR <:7i1F g~C%iW/@#(fLf2G#A upHړγўH g Jr& ڿ 6 Nlk3 / |\ B y SI 7=rr־0A7"  _e|G9#!C&*7w.DT [N7nI  tH noW J۹@QC\D?c^[q  ZucׄW a o| ?W D[jJ^bA@ t7U|c_im]Qڔ  sn.in݉mzG z Fd#- H;ݡ + .eDD~n_ U- In2w#^J0Y $:q{ np >0ظ+EQF:?6$%l / 9\5Bۦ@rxRYԪ&۷dIߏwC [  qgeawK=JػT |7vJ9#D|s;H  $TS FH0U  l ! _m4>f_{eea2ѷr=5 un>uIv3jNn "j$!m  ! V!"0(}vPv,(^ . cC%9   -0*ߝ wA2e#Ymnb/|43   Y; UdP B(< C t"'nKoq Ldw!*o1/!)KKT" L h([+  5{n=km>{?Hˊ0hc?cG۷Zug?xv [2 e/ X#܍ #(3ny<5Rot% -u ;Odtt&E(81= snr p dzu !Sqo " _\@1:$8 "Y'ah'! F &#*u 4r ]J(',7 \ $y/J"i` @rI*6iu)x7'vF*x!F+S6=`ا{4) 2q #E,d٠N; zc ?.3Y ) I .ZPL)1 x ' 30 txht5Z;s7vk$nk .DtpuҐZ'+z™)ՍyH:=ٝٙ dCyWnaj]dӽ_YW%< { J6 x- J XJTP {-x aQR-wA*uXf nG 2C efE R> Xj9iiL8hu' ! %-t{k+X>+VaU! E%\#_lO 3 2   x&Ag7E[} kGuK_`^լ@"'_ܻ>5muF7'λ+Ke/e = J[s֊9TPj~Tۖٙ~7c &, xxMm T22  9S{%W  4D.1t 5?[ C5t@` ~Pp1eP-$`\6~6l$[8_ i  ~8.7~-b z|mA1l:a: *'L$ o`ݥ} hJ(*EJh@_8`՝yuTX4 Qu*& WO8 6"z#8+ g&!#K R"0x mfYBW9YBOnJuN!nw  h|Tr޻bth Uw]"K~  C #WZ|*'6!;(ZI \ $/$7<|5<Dg(*3>)9 _4e h]@ Oe % C$l;7"~ܰ\2#,Y%Jz h ^N BM%$! @ -. 9"%kC fcR|t XC]ܸ;<%(@+.Bp + S<8/ޙ-a#%=T $=z3a| {t|L׀ #S rlH(*8".H2 d)-"& B-48,nCP#~)=%%? r   558  L U :B,(*-(* ^  i+-8 kH ` $/6)˷qR'.+7z|2ݬxJp:5b)i ^h-j&p9 s /IC;O (`  g(<5\w(+-H$J(M0d7#&(( A)35 O U )*( s  o }5 X arY0. hx &! d X3pm_p :\lH  G b:fV`'j o\Ab*#y y2-*l*a(()D&((!t;$"@(Y%&+!*t !I!M  %M Y   ZBR 3 qolN 0ߛ--?e%88'0#/%&vw (M4i aZ`jR.( @Xpz"'wIZQ )<?\ >u%9 MD*>B !": 'A  t3` !n#ms߲p^!k,Z=")4x - Ny  "w"N%.u - 5 zY B i((p1_8 Y[y P# q  8~ ~ #m"5 xjӔΦ6l4_%-ۢ$r#)!{U GE  |t GL @Q " ,U] w{|$4 954t qsh=*C0/ %b340314. 803*x)mJ #" i? /y3,R^`fo)xeػS| ` W hqtX"8jX=< RAK P oh^ 4  "|Fي,'!g2<2  @x;9/s yޓ+3 hb' h{   D, i 1'{"l K !#cLr HD N&w` i , U~ /Ijc i& Z% _F 2zE@ ?]%'FW!E*X%fߋF5Ȓw^Y(&% Y`2Z!!T/D `X, Yj;|+=dX5z#>MTk%x~YLQXzf p(@( 0]{_yZ̯O ; =\xMIŭFw}ѳr& DX  #Z M|Fi F+< vtw % |oNR'@+FM4  +g#6(o1 n. 4 Z MRA ek!a$w8>$$W?j--#"JV"z)G#}M G&#q( (n%^&M:-2G /T*]424E1-7.1@9d7_ #20h10QtZQ=A @)!s#l<%)sp> *`.&dYAIA&b$xI%&0#b-rY + x $X5<8U/4 U-m!%22-0PTt'&& @F;~"$  )C1xnX/6(d &  $j)keyf % QJ>oIH(0|Fm@"Rv #p Rn UT&:$ ^`d  &| $, .j:1)S-hN%#h*( #0 u a<E /6<>'- st~R .tdm$& g5!9&ng;tG"_"^!q!%a "! &8 b  / E#5'" */V` P2 2 S/*V?<9޹00H N>  dv! <y'#(!o>Pk2#1h5X5t<D G V t>D G V R),N{D J rB^i'nQQZ#DR =q e /3E_  _ kjzB'B#3"^z:D 90lQ < :5>G} t"4c3Uj  M Lp LߠD9 } 3jq %/` X 9**& % dg; 4Z0:X`7?c'?)J߄S_ Gߣ!ZoNTO 6" U7 ;XIW | Z/w< j!/ajURE ^  AV3;̮! o z Ӿ4T %уђ^ <7p lG` MXd` |g` a#" ^%f`nC_:5 u e}:/ qY Pb*I.s.za/^k @  uvh7w BB.R/&#0yZmq 33cox >AU;%RnB'&A=  6 l*A)d k9 &1tyX(-pA%@ ! > I 2DE  R Wi?&*(@b%G! %o"4(DxB 1`*$"p7`! D "j$ j{5   c -*=[ffp_"܃<RP"T7(K',"DdGA 9 [K!@I{ 2 ql E O(.A|AL S-owq`sD@M [=x%E#+2 !B[rL>,%| +)%|7*? L+Uzޔ g&`9 ' -9gduQ kS1D;|R׶٦b67/ "S  K  bډj eS (4- _j_ 7/ VS[g[ w2Iߘby$6}!' D=ϛ s( ֫֕*0]>E/ ЏtzՅ:oY:ZIA*&8<ӽ=IpnL /4 cd/7@8C}ҷCF޿$x^c%s؂?p铨Bdv\zϖٹ1  xĪ&Erw-&ۣywI u ( P߮n! [ %$ #p : +5.b>pp6 8+-iWح P *?1Uk+ܕ{,ҜJ7sf԰Zy5hծg bupA^aέ - $ (*;YͶ- ,w}Ԫ%(! Wj-|)o\Y0.q   _Б(  Cܠ^9Ho M .-(:R<Gm D W0 ! b 3'U! T4 o Q-*t#Gf e7zn1#3W3&(}n|20"&$%F$O $-;!  1y$+*347 k / gz R#+j@b @I( S2"\ = (-/2#4& u !(Y({mL ` 4S27U4+ p51914R ,=s9 Dw.-9 R; tA'2-? P!"  6t4%3  *r  dro l F )42 {)3sn ' (#!*J?>U v .{f SWB% DzslX StqGJ hD8s@zC  J p} ; B 78 ru_t!*Vw6mPX 8"& OOXѺGg/C 5B%Ca4-%6m("\@w t{g2u/&vz 7 : ; ]~@:G )vLt#u, -.W-krT\w/1q')JG4&V)B3 %E d3o|VwVl ow "9%y :G~ !f! -]H` Jd }%h D .P] dc` =Q'#}?ty. ///" %!:R' [  *+q !u '-;}&|)A+dS|wn-X"g.t,QI * 6@/r'= 3Z-"-E"86*;#+"3 #6+"+76"750 3 ( y 3\-$(&2[8M&(,H$Y)O.$.!SM+D130 tk[#!!K%& [X 58ќd cJ /5Q% rX$g @ " < ^F'%[<[S# sKND:!j'7#(P?<H{}/cB 32@ 8~XIh  4tY# --+>:,yK/fq "#@*W_)< " s APhN@2 Kr=GuY<P!-Q}#U t' "+ I( *ءO7 h0E & C'tW'c!9:$BCHJ DT)-)61.r4L, 7 >"%yG!2(+*  F~DB 2<ld +!$$$s W% , "ql(}&-,X1LMK*+>K|sMd!yM!  P]j} -P $o XI2.Xm$#%'E .f_F%7(H S$:*#e%-2U"%_  Z 7c aa / <o C(.$  K e r8PN/P $*!"EQ=$:`)&2 N#D3 KX% JI%&w-$?$PS!C&p  H!)VeR `  o w P=4 ) 'w 6;e֕b; !q?/, T< ND  UxXrf :!sFq:z "M +G, ^: " : ;h W a*,Ȋ w= r} = 9ծJb~U>iHp  [2p1aA'  Q  % F b  ` =2[&w!l؂VNr }w gQܥ6IWnC݋)z_aJBCa5Q %  # 4 bJW 4 } q lRu $(L),0{v x M (hvXs[, 6,#eޡH 4T$E;!)& #0&c&!#K! I,H2"!Sk$'QQ&/{*QMS; #`I Uc.z)m  ? pUl- M|RF U 9V|~ |Y,(S"vxK :^z[ 8s2])-#(&!0c*]|d.*-A+ n42q+Ba3,'> p ~ I %1&8 3 P"?,<۔g{n*0((%&,QMXvX9q$$ \_ 7F|GFeKݙ+  Uo nQB70^x") $ T9C(l j/r>(z;q s %(,<'!kd4 052rTA4 XO5f %g"Fx S`E]_ V:/O9AsB6(F}CMF( \ v_ptER5nE, Ru .:0A" "" Vz8*/  % | )7 !9  dfrm.X"A4-B.y #s |2` e  mGl2'o c .^ L'u*'AjyP| u"XG׬ݹJACQee |e2M^ ?RkH L2 [ rЋ e:G98*"u/+CD 3) ]6'[W9hH\hnkX  ?s![ z-,@w,T\l '_ΰS}ԝ 2o6>&D]K1"Q"ek1 Jpf}t bILҞ `)&] !3|RXH  wH~v&;*?}("}nd @30ܒx.$VY pp i/W6q,$Rf u&[}/]-|J}v%. v r*r!a /)E] C G u\ nXP`^Yee twh=8u0( fq FzquN#?#b} nCNA$-Y 1 42Cޟ4-)#6$@`PVک6xHj+ \ 1m2/a/4 p89(( 'J& Ʃ֏^ x}a ͕? %؄:IUeT!6jCNPeCbIČ`+Fxݧj6;-uos߆ 8 mE0oܹYN" ot؜޾9ۍ}d$/ {&sh/t <% 6{G- _  nlpqm&?<- I RK j: 2A1,@ PbL3 a{akXaPfrk 8 YQmd {qQ )p+Ddۦ` C 30'?#o sQL"C =h e;m#$ G# P B0$,P:A)9o+ B UK f @#m<  "2S#s +/!,M*.C,_/>"|G%w- W+ rgfT1 5 fS y  =F_t0F!${^o%  \ goc:N!5 bwH~. %|VYz! > U`hpu $8T$ PtKu % 7U#\6+ .S & (qX  X'(2h? Z"3`5g wk:SB  iO . 6  aTa %;fjt y+"JcbN)%_߰#֛pL)^ ~0+ >in Az 6(wr4,  @!k2$.1#5vz m>&l  >_D^'/(Ḥ  M p+Vr  K"v ٗ#<(?;)"C/תf  J(Ue-X u  i &M!%e)$88 Q [ JfZvA;0dh)\ n O~.! #k& :**1{& aXQ*#0=v:(y n+ !  )S _A3To b4P"e &.Gr>#"< DY_EsJ5%>Q@S>0h{a )*, ;c?~\F2ppqk.K$o' >A0z] D6N1" z  l;   eF+22F؍ TPtBNӯ\. vfKD;d#"|y -OH8 (ͤݱߘ& #!ؽ۱Twv vWxlډϟ* d]0g \#WEDh \RѦs)p"{'r\!_v u(QL\X w6%aH~= ۅ;L (5 A%T auy1wq;F3p [*iGɻl6/)!XMl%@a҅J,i _fb/$VA hGmAO 3r-O 5 S}.^o2/N$hj&gdO F ' = .]p3  P q =GJP1%|)KEkA/eamLVނv 4K= .)i]۬j9ftF'j  J5ZK4  $:j ҭ 4 dհHi_q~sQr0Tw?PSG܊U}3RtF8,Q2]b#3 ?FJ!H%6 tzb}!cpuY7!rtYHQGR'r۪6kb^rR{vs?mߵ8j Aݳ0V;5QH (_)| H a^i V=]A[ %ng  < (]@pR5l;g 6j`#B!q K( / Gr8  \z߮% ?u݂ TYcmMB| u.  -Z)#֚=!%zx= K4vfbM a r SZ IWK( 3I&?/  1T@ ~(" i( XP ~ gX /, 'N_A7 qTX9sMC#C'W'򄾡  V]2d6= * ?R'"r3۳+9o NO%+C\ ي cv 6kހ 0CJJt7En%A(% !}(O!9Iv 9R#g{)@+v$qm=wZ| o=Q b o;> qW b< <O^AmC >{# 4!!2lxDT1,lцFnDSX2>u1zN Cb#ܴh׿4c $L{Cc*0 WX/B91b $Ń{u^bo#ѭB3ޯ|EߎY2*bz m]=UD$sӁI `nWYŞ?^S&w2 ?|V7Qs < d A o}\Tg k" KܘV  <i @. J& ! M ܈ s$<!p|p. a"P̲" !} 'B W kc RB SY 4 V `Ah ` H- K( pޒ_LFf79}N4#ܘ:ީW-K׎) 2 22чZ? Me3ϚڊpEyJ(rBFdQ i3v FDC]""w'`ր#0S w*pDjmz N͕iv7HS'v:؝u -̓b[]y]\M0Ƞyb9"thU՘0YFݡ,ZߟbO _-jV !t -'!_/Y5. @!ޙ cE׿\| z f1 |ls Sp޾5[J6m{z/ Bq) r XH'wwm jN MLPGd]W'f 3 ~ լ(!g95|/b$3@Em0\emP1M<~ R!1o0+O<&YSd>r Y;ީYL]Eܮk HMݰ(6^ ^tĩYػAR(U,R :%ܤY-K1 :n|_V ٝF4<Bf2  zBވe q a6 V  H z~Y1(,4/$] U0# 9kUw%߾`/ (Wl2 G`   /*ry3 6 Rm#;Tf8uc lF (%( .*W0!rݞ7C/yݠ,VT$"uaK%%^ B!!" x&ݷcG LT 13j.H ; N( ,ݾq #n [3 ?j%  !0 Ԁް>U`erޫ 2 !8 >N$/?"VyQK _LLl F+ t3{8+TWq:vB2ސ#qnlP2>- b;ׁ* @wݲ|[ k'f) /Isvr}m Ue]r-E!YBlV*N1}ĸQ܊v߰#ᾟ~KRd$I]sbLu$ 1z(/m zCzc*#.,O(" e<&;2$F#(&NbHB2UI )@  CK/1  ~׽D\D+6b3 g L e Fbl a"=XSu_\]Jrp~C-!u;EYg <,$]>GXs 8(=A S5 _(<A_Y J Sy&  o m l;$ y% h  q~y:a g#00m9-c&$)J,"1 P M4 P , d 1)n;&(("-|&)19|)C["uk)K"[ ڦ; + f O r: I nRi&  m  L Gt @| .6 t  &0(z~!, 8 ;, f %K/D8W rS+3&,s"D  #dN fmx]:v(7x fi':rL* nWC{(RP!BE:1Iv׭ y\g `$ h ZR$I d 8<* cB8.pa tCF $%V :(;: q$ t"%! o b ^m+=#x- 1#P ".*( ܦ|Gou o$,6 ,%{o ]Y!oi}\X ;Ga+S+ҫ[-qWwJ CLIN7a R-%w>s}B_hl!t 3 e|=4E  oS 3Hލ=J(h~X΄ \,ܥmmvvث^Z>Xj:q Jq?Ac jD1՗+od75 c|sBQ '4Ղd& f z is&|l!iZ#!H"*0( FmRV2$4 _1 On\ !xB5OcfَVVh ~>p"40; ]\AsV>\~?l 7 k Y 6%$I H\ : b/p|s n8ۉ i% =g4 gH0! K ; $F IַQ  6C 4{%Cx @-&h'1`o& $:єֺ pݙ "*UF֠X:X_v" > + h.8ttL \!D} O9 D dV$A mB|%E!C% tQ!32 0 r2 X #lJ hx2*@"G(< r`WJ2vv8 O g7 p 9Id/F #xrל]0+U ZV,k. k@XX! ? " 9lI h<>!w! ~_ ."ny\} L*p$ Bk0V7(sE{ "XG.c 1   E|; FI0&.&Z -"% , "@X $C{2>#C1 > v QdH2%@~  e=.ވDH s*ֺ6. gpJ xm(n.U evoH}xg,A73@_7~%:"T  J  K:9 '**V~wIv80y  -+G]g WC[AJ3( '~ . g&!;-:nwq<@2 $kK@*-B% -{A a'j ^W  /WX wfS\64 "r  7 $H  K #Y2Y[/g.w"# %8$w&# ,B+4. | C"v ?1#}L 0+ ("#kA'4#!q !B2#>-#E $&t ,Rs C%] %rO) %Y' ۶++ %~V -)-v? hOt40+A$uQz & ;'40V Je #  g+G%6;/u0X%%}3 r Pzs (F !/ Zic c) t0 (!c> h ^hY9(0 q. ![R &#i  I\ A35:@Km#"}> To 7<(2=}X#m,p'&! u\P! T  B , VNEU (?( \%$<=75![ -l--NbC6_,15,J1c^  x l+#?Tc%G*?# -AQWpg ?T d >K ߷%z 7{ ]|  :zTx34MwMd Q  ~#](r .'#80bOp 4' # L Z!v EWAb3ekB+! s0Y x44,#5[6 6`6H: @.'u.(w  !.f=$>'  Wn r.T2 # a-Of# x9g 8')wi cTN j *r `f X(!( ZV n%>CtQ)]$f_%") dS@ !oSE  y1 o:y(RoV! . ڽܢ0 Tqת '=0 BB mk!R/ zxNa q5C_zL z|B/| T Q!RttR  M = 2iY Vd|quE.` B)z~+ %)_06/-p ! ~y9=xY޼w U\n 2< CԖFS{ Y0){i ث|;) *g B6 |+ "qnjZq"_$ Iu1kWF/NO  De ;R յe Rۻb BG0ɬ 8!  vt…̪Y TTOV:,B2 d;zUY oĢ3@xIbfGh{jV[OS Z)  N] ~n=|-; < v n4/NAk sCԗ2 ^ lDo & ` 7_-3iG(d[zZ~*Y(X )_p ? $j5 p `mB.B &>l!3~}  q b%5x z 3Iv!=VWr+ ,kx^ ' ^}ZT5& (\"  d6o< 2jY("0+%l.CN',#%Ws|3UK 6N:U:񆾎8ݴa}VЛ1 xt{W(ŘV׹ٺA6 C/6|ϐq}+{Dw ֢RLߛ8A߼oԝ&]ٍN P Q,S;OU$MiF-"hh'vV* lM3_f <FNrwZGE#4$VmIۨz N 9ݺ 5&-jYZ)[17=KϷI$`XaݽKfH`cl"&uk׫5 HP1Sw(? bM .  Ou  E d t 9 3}\ o ^L11 #ecpZds U O|ڑlw Aڎӌ"| :iɱLȨ ?SEߴ{ w%,'|Kbhv's^ $} 7Z  Q(PsD@#R) :ۺ?^K U`fF ]z- PS1Z&0%G!i|l O-A/"  ^Ne$!cxk8^ !٦ք/ $ N gZ8^ p3fd> &aH0f϶ 1/1kT$O;ߜ'm &&Dq0/$P ,K4 *6 >h 8+l | [^8 + M3(U>&["V E7%|S FNt N&y7t }n߶F0x ;I.ޝl9 gW95 k `^|im)v-LHdR"6L0 Q #/oIK^Z\ my| ;"VDa>Ff {!% K [)e +  6F=%F'  0[M .3VHJxP%%d6P+7 F 2c118 ՙbVFF*4!.  X  ^o%=VG$u!/07 5 2  J' " z e 4apێgrf*8 m RI Wo:ߎ߾9 V?V}Li""E g ڛ  SDl  ? j(4$/Ք $  lV6 : b 7M_6 K H+OK/T'G u . p  wRZ'~! +t i$ W$2- @;b'Tp28-m { 6}i r2[]L6"d 6O>ا) m݄$g ޗlPmb^qlF>M  d7k<5kd ! ~[}JZۘ ^r!$W ߻ :6 ~LtnBηr_|fl"WmZ4+ }dSٿ  g/3,;6WoX~JNT  9 8 #m$Eۀ!j$c I I (D 4B^Salp $Bԅ<9_G d8T fk9Jβz D ( pyeۙ'.ٱߢؠ^ #Q Zpr16 ,|' ! [#*y[$/sW[ k ow b8x"ȼBFD]AAGtY)g,w<K̗8YXzMO~S1CXeܯ۳yrI(1H}&yZr GLsqϸ 0.p9{ b%(0:6 < ( )9Fa,D++^Xc M ڱ4۽+Jtv?D" Ue.s}d@O3}Mnm  {2!  : ?b{<4!_! %FV[bJ$&-[uP  + 8Q4~ OME ݳ T{/2".\gFMLC-hU 9-#%o;߸T2@ PD=xqR'+Dgs:PP(*17T=[i.)f!@Z !Q[a7;/OMx"K Z`5aJ2%4?r--#p{n&;qDo)X0_)r6v-l6$cܮ^,@ %*T<8}wh j ^ RXLA -L 09: \;rz3?!?\g9fgb.^U a&8:^K$+7o]Ձ[,Z"~{G!w &L$!0<9,#1<- ~H@4i<[,V.0H!aq  EV [+ xn X  > | u j 7Y;= e k(F|+<`LlM1  > jRk*w(s 1_ 2#&(%)O < & >$8#-0HXcR%R&=&'aA 6f@3@sS*3(?["  # .2ZSf"X}{M 5A  cC&+ 0^) )'/0|-N ##&'/EYP O6,M+%F@*( a >]iIn x#H% : E G٠S<   sk&- Do]֋  \eg%*}F!(\08(#o9 uO =#m3:'"$ = ~0g/e(Gp R2/N)Y%'g#4C@$!|  S ~;@4Y܀7)2dl$`A]aqh1t H*=j GTuk *~d#!Rv|OQ|Eڀܝm "#g^[ۻ;Bu0P+_T'UxU`)r (;Cx  ܫPu- 6r{ʣG ,4?5Ts F`(RִYlq">?qߊqU# %$v܇Ԙr)%YJh1C 2)]N YK6 P'nٚw*9 uH bJ5 r}ƾ'Y0#Gix :}n%P ?wۢ' < X!yCL ?xP! pgBl)L: ~Z'q^-3h!9*,dZ _ ]HO :+)$~?" 18Քb"hl$ Q߯_ue]AJ >@5yL7j͆ `}Xw@B,[*(-qܯ8jLHZB+0 auXNd1 F KD T } $H "=K!9!߉ڔ<\*qc_M&4[ 7^:ylI+9) A 5   G 5 "s& hEc;i.u X Y]; n sH  zޏhm> w+&! Mf T _R }$. W s1] !+&B@ z~uN&b]k#! p$wH iE$ 0!f a?>_ ,Bɚ׋T . pQ  Qdnx(W  W%d [h 5vGP;#&} ER yT<K(BZ%1!@${[_ n /"E)4,%4/:9|G<v=^ x l@5h# #1Qk|o. *k;M/!9(kc҈$%08 s b% f\[$-U D  !T)=( |^ W[S:  e Sޙ! *9 M;I*R D R U "L#3U݋a=-qafJ(}+ P>2A &2!4Dݵ" J4 a)t9 r )Üĕ/y ,1 %Q<<\\~ҳ4Jx( 3hTܜ=7=6C"(ܟOӧK$d V@>4 (e(i"?!%^)m .wc,{I L"_!!}}cgdF&,e7>RQ Y09T~(n$/U}^p ?)M y)>/f  &p rb$gj!)GR'T4+*WFO" q !V#^!U % 8-LP2|DVw*z</TNQ  5"/p/4* w<#?OU! pu A;| Uw)/J{6A( 1 9NC^RV@Tqy *Mc%  !D   m7\B27zFSC!g( _ -W"$!"KsG O a`B EJ$&D՝~,lGޢ=:R(#*-%wu ?=\5}N  #yh?lVhilu z ? 1l3 !  DB>n^ z puMD:Dex:8 6 :N a%cH}  E:UEGeWc( 7ߴu# 67%w g`  '/ݲ4 r } p"Y{ҁNrO֝d [0X=t6D !osS" $]/Q'+Fvco7cul5T$( ? %B,r(4ui&5k*Aj+Tp [E S e+[  k )SQy~jG%+ $,- 2D>g?e R^u/_W$8p$tru 4|ShNGA(*XQ  1(Tz~ SY: -m6k%H GBTM-a#* )bia 3 GP&#] ;o;u%{$ 9A+_" R{=M?SK@IE9"!&y#d7 #t!#+"nͧ>Ι >(a3`  B8w3 .Yx u   uGo (LD/K4 #Y Q  1"\v,Y #g4xr%,$3 @k` ,<  KN }#x_ * X<,? ,{XP4,p#&!< E,_@'%9 >_deu )dTMk' <'  8 E  nc* +K dވGso, {M^9&q$'6(g-2F[xR u( zY)u CAyV U.9F}   s 30oE c@~ a X a<L z[z" @#O"D) 4 .*+,2!-$n ''o Om -1APD XJerW _  F { ~B  09 ;  sO*N" 3 %8/޴'0IhܬϢ A rS0 h7 ~TM҅FA0| | d +k STd , g +,7LtRg:OAYY$^HU  #>( -/ .-!X E7 v&1!P%o Jٸ4"E* LN1) $/) &0oo2*%.I]UR),7#g 9p%e  8$(\ g&c$X^:H:@*4.^3r#DT2G$ 2ҩ'7>BKN{;V [$&(g.K 'Wlpdi(eVc`M  ^@9F iKi-(2DNq[9DH $ \n^<2 {Zq:^s[ P=UV8Z^#H+/G| R G;7dr-dAd\q2}iE-|%Zm;ą9gh>]ű2  *h]J "/a"`dex )$2$1qۛ W1 !? qtکޒ7^iV`:/Rfxf#)> ` D;Vc Ch"v -5D u $L im+T < ,-JI!w$3%.hb*WUP --ge@= S"Q(!Q)C :^ -a@p M%@-[ ] g P N$^L  9D ^4< aUzI  g Y?YjDa@!GqU}Ke <qQpF Pm8EpXyN)~IbjL5y(3gtR=q fNhfu/؉!ҝ@Utt `^_ "'QT Z/n  I\۴ O$GauȃNv@o ="w!viocy Y{> sQrz|w by2$$&ufJ2/;%' S .aLn &D$ "Dak  ;$xKy]usqFA4_X C1.Qً2-< i ,  rzY/zޅu r\ ! {Ⱦ$ڻ?Zx# F @t%r&-Ҷxa' fߚ-( C+cA832"s}uy > \Neh Ay]VI yEtZ L10+E!s0!hE@i)O4X(GHoT('@0 lp  ؁D+"+ I<(b \Zb 9\q_6f"#q JE W#~-"tݑI{ޱ  y t _o('1j|*$G.-8!$3%E  Q d  (, . /16r"k,*f$ J Uz,X2f* '#H r(d (R3w q'#5y]^b3a ,"RMU٧p.!P$"2"H K#-_`  le 2 [e@9$2?$P-{޾=7p" }+oQ!y30PF I %*U(&6#!4z [Cxin .-}(=P 3c+'D(=%N(D:mg-A*s:2b Y#i .w)0!+c(V!Sm F=q  3$ "'  kc";6g.?%9!/e+U.]70!gh@r T+b~i6Y6Tx) q,@ hGt.M5!5)pe$g N(f&^t+v- p&Y^  @ 2>0 f  Ew2گ q>q eAO 5  Qm`",} {. W x ;Y6=fjklqYVW/d,0oc!QcM1 WG '0+*wG=    hR;+ )AV6(X*s##w ]i (j(|$n&l&`G,vZ&{/V$!x#p% :Av&@ Q }H|vR/*!0LW"J[ \& =W  %$+')# %hO!3:'(SYo2n:E -zj;M 5[mR!M%"q">7^ D|>>K30]& p G C ^VCS,\* c7/FJwH*.n׆Q&7d8N 6w! gE%Ee ) 6;  g,~ ^ o ga ? rs . @`t;s&x'VHw [Q gJ t2h2OC,Zn9]y;1sQb4߻k Sl B5  421&C J -']|"b_"wW,G|H&f!s!B[, >)%*&ە 1D"q|ߗNKRH Z6]A\ e7U2xBSD:7 P in  zDb Im o KO 4!"na,كk_1^ u"9C Ar72 =3|Dȍ5L8unلşJ  yYr٧Չ܆c~<1_~xva˪xd w~0i :) ܚ"TXQI tKx,olS;MQ K Y; b08SXu!#ik 1Gߑ UQ /Uy& xdZ 9K/" U(JQ < hwOڄjW9qό^l!z6  ܌$܄vrjڠTub>}vtK0ѴXE![qFu&#M^HZ4 |c6r7GՉxL\.cHc.Ԗq,)$!$mo! G 1^;iU/ݛq7/Y,G>rsVc?ܷޫJWE3v  ,3ٰw35}K!W! - FG4Eh/E  'o\ *ctk"z(E$+C,(pg,S -* P3PVl KCڋ$*šf'E=WQkʂ;\B H%9SWؕo_eg%1QO?. [/j"C2  AX=.&2#q% i  3a) `eTZL LQ# _f-Mϧ׋ ׁHb3" 4q QwA , VοXcS[;F 3~ ]yCڟ`IEڿް(d6 UaWF >_  1P*! V  >^R   AS`1$lQِީ5%&#Hj,[.9q Q*/> /MHS l!#Z?B*Nc0V[='#2b!r" C9 ) x$W# `$ c^? q } ;.6C!M ? ֥$L!KLR^݋1` 'Zw(ݵ'g " X]\7{Vf ":  0{!+ o)/<h?% ZSAgj %>^ &NPs aWDf Ge Q! bd|Q#cO@!kR 9bW,&Mj,;D/=;4|& J  3,%&0P 7v z xb kdnf_o? /( nȃXZ   8 6hL} yR7Di+20r]Q ], 72[=%)c rݘtvY1 )o5g^ z& 0J5*J7G? ٔ[ IE lea M fa:SA dhy: I-[^~54x YV$ 4^!=iOb"n  )/"}@"NAL A14l"7a`!Hy O&>Oe O1u $$+aFu w#z?((>-zn *r 4&{w$ld  9L&6~ vbJU3??@% %(9#0(~6Qn/#xr)0 |  ͒H j F5n 1 BGFW ?wBK rbpcZ 9$@Z!z0ރK >*Pi_:X.9^"ްX% T0&-s"-+ 0ilV #$[ &k%>2 ' !PJ -" -R%)@EMA=:#JYL,)C g  4od V["? e fCe Vbڇ*0 ]T3r 7^de#~#A~^6sB# مKjd k3 r $w]?SYx #|2M$p n@8FφLv DҟI5[X;/8N X(hy,c݉j6L@7  cT (sM -K b Y_Y 5EfY݉6ce^~W~p ~](6ܐx & oBPVV1IժM.q 6 siwXw$7|>,P emxy_ ;"$ە܆k;W NqGiKTi&S/{ )kvBٍqI"9 ?[D3Q:z[q] ~ :q- F",No P* $Nj %H@{^M. r4  Av޿Ÿޅ [i֕ؔBlx L#K#h4o^͏`).@ݵNy *T4|q' BPx.20 TZ  ~l*~ 5ؙ [1 SJ[W9' D՞\ UuN@)ٻ x\1F 1K z b~ i# ? Cb KA4qCZߥ ?_ܰ gM "{+$SuG y eFF nݗj; WZM &> 5U 9\$$ +MQ<I-) %&[wb2crc lRT 0] }(- "*\CV+PuPfW-Vޮ#$e ׅ^ " d*ւ;jx*? \ T~"7( }&n+]jF;-o $"r8$VJߌ~(aIj l4,"@ g f4 V{ּ|[[Nn\b:Lz]>Jaom/UOn 4o;ӥnx'EnE> 5`(xk'09%I,j% K%S Pe9R)rr *!ýaI{i  Օh֓$D !mprv uL'V7GTJ(܃HQW#Hn Z2 yN&C R@!Gۣ*? kSVf' "35M;aR ,4x߅=4ۢo8/l^FO BRX1 F92A SUkmuvY #AK Q U >3 h0 [l{Ns H(T-/ 6S8lsE5a w $KZJ)3^/)Z> Ct١0om+"n@0%xJy 6 M \L)#' w}.Gcm&b_TK@,b T2wNo#%1ִ;m5oS>0;1 Y^<$ϚA})) 'C$jp  C d uX \pH:ea.N<g߷W  { >Z< >r~`֣- '^ x*KB"$ȿe0x7b؍ x7ŶӋW-,Ib {k _ h=j * :5 [D.(OEyQ?&fN3) kzo  LA M J qb ]! {F a~}1i?:'߈ : !߻O~)MY Gg* \)^ KG ip& &M  +  ' / i9AJkd?f@5k!b 8 2]1!1&y7C& 8XH%o%bRP > %KH1 b  ."\ ZbV Ԑm7YW(-Iޕڏ49#-:,.. j I1\B\M5&*T  o֤,!^y?!ݿM7+Z&e@\E%(&S4`@o` [ 1h%#'X<YN!  j!o)v lO\ )$`y|"  .81ANi6s j e!sat'z'|KU"!7tԓ/ 2r( qqNq (R{ K0 'S9;RgJ bWHa l  h j/Rrz; &4Kn=ܩ+@)! #`ڗ!a TBrH :  #)   (3e)g' P.gPsV!&N.79MK<_#_'x$gx ![g  qv,*YBZNشTh  [ f =X  b>@EMC+\ `"4cͥJn3p]6_ B4&U( )SLg~/~10 5 jŰȳ_ |v a1'v߫kEJe8d5'wB "Wb+laܑW! ; cNLdEЕ9]VRdzvOl j  ϙկ FNHOj &"M>(  r, /O+ߋz؉xv Ӟ  AKnb#gM! OJ ^ 7 =uu0A (р'R[M{bwܹߚFD ;VkW'+hUS $E\s } Z+w KK_7Ew I|r Xj$Jc' 7 `2#Q4"R]}s  jY2!>"$3+2``Z %X gK<o $3_ T:\Z7T6"EVVr, x Q X h / O (.11#|6Jiqn:hҏ0kj <W)vfu,K `/' .Fԡ%6X SJ $\ ؗ 3u{dbk[q qtN"B#&&˓g")?''By.[ uW^yL-f8+1BA!h~k J(F*JW&{?-=,t)!cb) 0gx) 's !W%'Ts-ODiTj6 |s!j"ay! Tu-MP}}] WVP CU9824m$OP4?/$u V ۿɠЦ .> JW : G-14: Q1 1C4& x"*7.mYK_1T+8g ; yW gkWp M[ _TIB %(~V< Wo*-$^"+PU/ w!'BBF| ]   (n  C :} yW"T$j868>8ES\_7F %j Bm.RY  yA9%6S7r)7:;EFsoX;[1X"rf-G$CD< =m. ^*'*L+"!)O o~8J7L3{B9 'ڞ#,%  % oQa#:efL$T  'j'  *5La <6 @[ AO "۷Aaut43[ g$$llU:4&!!"& +!50 y  1/ "s ^Rr J}~I M St=;`#T[K< 5r)R63{z TMnCE:ծbO Q#   خZd <6<)Z(j7~'M+{ #. 1QW q u a* H0&_H.)4] h >T(5 7 <?#&6 p !5i9>=`j @ /< c  a Ey$ !, $ gV zmr'9n &)pN't$92 S 2 k8!3$4a m )]3 ..(]iLhZ  ~  zz [+&^%UX=2/h W   gwI8v 1 ,D]  DV04 ybp',_ < u:O1.v!VQ k6.\~A [ JP#X(uk l3j3-#* ! 0{ Y:!@* ռ|B{ Z9 @,*lxU K"N H& *b!" Ex  ']%\-F <$UK BG ?Z&} +X#i >݃\  Ho~C.UbvEL {!/BGKk xd \z]; /P1CPk}@ 4i~ &U4,XQ #xXJI~& Bg"g-J RAS>] l߅T ;=a/#t  IF'KWlG 5|0)MR_wt! f݅@&vN !".RITx Afګ_0f%F w/.8(E#ܦ;p 4ar75| 'k r N @! t?b<o 6wc~8qu _4nExIV *=*DH?YZ2#:ؓ5cx ef@ ބĤS M i{J gPq.c 38] o   eBq  Lx֢2*;&- 5CC %.&ne! G?L9<dE!$!?dߜ( =*O$; A ' U y+aLH@P ! 5 ڈ:l;OG= gKl |6/t hi;[v< ie)T W'T3lH2v&_ c 8Z%+#xn}VW#)$ bp  :ip%D *҉ 43Ι<3B< [x#F5K`C@.G { 99?# 3 Mi] ~CܾT  + < * 2[Qt b2D iX '& (DZ oo"&  C 6*o7;GA Lu<Rd: WW4W \ :"Vsg = !}W=uLr5 #2Lm$ X_*$'s/Q/r# @w) W ]EO  IFb wx <z  .LSQ WRM n&L+)<&'ZJ]KXx 3 pJ ޕw(4 Bd${)m,'nR ) 9*jO y fRYpc%K .̼> }B(Tg ߺigT5HEp ) &js&t #{#F= ]PG >4/ZwMM,8gloSAy ٸ[Nzkz ( I lMH T-F J}~7Y$ 4/>6B5, YxդD M!!1HhF~(c;% }  u͍јШ4'׸pD'\\@>p wDybxG{nK Q %N( $ }%"i "y 5 o6F3OFTH )0i veKv[(Il 94 }S|18d! 7 rF"C;(T-+ROi3 Tw`(o(!seA ؏D"Jd! gGa1?tP y%z_8 5 { ^wb m9 . x1ui + ~#^7^ [ pd 8&U "x1H [^(58v#L S0{ioL8p{O 1X I2/ba *i~"+^Y; Py#5( (Ǟe yj %n/Kc}\  ڇ%К1L ^1r p j Z$ 0Xur NSj2? :' ] \s$X ?&m՞ܹx`adV~;zEXj>4 ;M DB.wdL ` $!kCf 8 }}p YR7ާE.f3+, p 9; Iٕ߻  -0wN2 MT ]< G w}u K^EMSܘ ]ڬFBY?l4q=Y{ Un' oSFq+ +\O|`E<V]4SsH RVX)I+~ +&Mb1*Z)W  ]jD^܁_$  JW2 SV n ;g_CL2#c6v ) H ?  %xLa!8W([ aD/~&odA'L` k l r ] SCF mF5 )<ߙEM_t- L,lܡ0n CK͍X{P yRxi3X /, $p) WRQm J Ya! A{9 %O W&n-ds$Jbm879 #m; ZL  #~Y u  /*RpZii"+E 5&}hA  L( $>g)$"= $ [#c' 7 ]<#0vjS 5Je+1nD]TFB6*R08dؗ xGDQl2:GF 9 >+]xܐx2&}T"?B_9  \(9-\[i f 1 cA@ y 9;Еo = 'w+}[9 rupZ,7a0 >^ m3,,m$\,U*~O~8H/   E]BYeUj s I8]F%ߓx}+E( ,6pÄu(/[]6q;sY #/ U &IN~'j }H $u: M"c_ +xz #Vmc~! 01(!#J {@   X  n ` A 'nud)H@Q'# C{9 lKF;D 0+!}u/X z-ߍzHG9=q\N@,/6%f F | ] %D/D:"#-('%()+O6)3EXc;%"/!s~" 8 ; Nj 3v0%CG / &  8Dvia,2Vdh^$xz-6Ol<~E W;  WD= g( 5b ?C>l| /  kAMU&a~Wz YZc#yP`u ) UVS @"!VV'3g3^eS$8};n)}!17 {W!VZMZ˔9 & Eplo gZ,!VڡoL߾  V!o wb t}z > |y&(B g@#{5.8zXkm^ m !ae!# 6 N  ')| * 4I?b{TdYWmѮ}8+ny U1xF lLazNwDG$ cǧI a t.dZj<5(7 8, *d #{r8 i% i J  \ZS$+1)H.F FCIV!Z e @ FH}r</(Ru /<o#$v -/[+) y4 m ZOb "!p>#JZ `Q bHl!( [  _]qՖV {ءz(d<lu^MJe mCEn9T ;> _7 &HNu"b'$xT.w#.T!n* C `` >b l]<Gca % Fi H<".wvMy TCV|[|K (J^ 7 BM$N/J#OB 8Rb en6@ i 5$!XM m[&%];? 7 B1R #Q:3 ^ O ` \ :} g>!Ov F;_޾"MM&2w &^ p /u0"iY Fe+^;  l !Z$ ;6Ck6bNn8stC'Grl& 9{ }* 93 $  9`  Mf>w U=VhK}) = a*us;hI"JBT !+z*gڄ>`Xav1 (d OR&P 2,jy, {8f%S   dWa?d =y<' f~^G0lDp Qz`7R &#0K-.(M;R 3:^bogn.ohH<߀ZBfCT K DZli FBcf< |I6 i U.50 |, (  $n@o 6sh X6.@ 8 nCn]d= .%? tO1ڵj,],of  U!&Zv S?  yA8 43, 5 0Va.DQZ.# )$6a\Ϩ۞ѥ t CV4y a^@Oޭ68XF]}7+ l\B S ? ou 4a@6,/.oVv ;.V?i@59 jW | Q!2TZ)/1Nx I& ;ږ W9+`rֳ  C;t6Wj$ ,;$+iYP  E,  8 U w T  S&]IHV, LjdH#8Xvt4TLimZ ztH %2sP OK) o6!   _ P'$H< Mu\ Fk >z71 ( 1   H8i b UJ#nhkRlj#^1`jCA S" RN4!  -wn  8`(hJfF L-h?4 3-J -H(X X* N:N S =  Q? {xC-&6mJ: f)`,vt 4DCuOkOHa$45( q_eްp\/ '%^]?T$!H ߏQ 8$%lo " P[+H8h?  ,9O^Lm0 GAn86 J.8=S߁ g%GԀ`6?m V; |4c֊h)/@ iJLhs4  /0|%pи S^ 8x1RGH0 GVlV(ORw 8  6FtI>T$rF ~(USF E?E$[eNH@ `"M}`V ]K g4^#)B$'" f 2 )b#(ڲKE \&W Z*m3mQ[\* nh` -`{Z,>uS^nԾiW7 eqOMQj23iWdRuJpa׬O4  _ 19y  Z fKmjl}C %W:4 FON#^B4>;6L{=  quzJLKP MErR4"S o1! \)x|/#-9aGm, Kh_" vtE S Pp  f< $$%aD%U l X>4U df ,LK( dA}]N s iY 7^0QQ=r#s&1 d 4Xr' f,K&o| "1 i_<ߡ`F o  ! mrG 8/zbI dfs Q  ]W9</"1+3 `+0?{)0%^$("P#)d *_ <,*&  :):.!pg PrR*suu| Zz->it- ^t"@ vX, s'^&hWRN ^gQC?zL`3u,;r]EP ; tyVgR #B  rd00s$_; +SVy )"#k { ~V@b0 F w/jomnUP^'IN / = ]"Sq M^%;DPxC %I>z0/0H/M=- & #}eMq & v?/\JbN" 5mMC 1 ){S?ZI#mTP y "P Tn7 D/8/M":/@ D }  { `\0"VM 7! R'S$ W  MG+ {i \KbapL 0z} $ kCq/3{i ":^/ i`(3:' ] D L X # S @}v* >S$NO-"f! !OOM+9\Y>-j/X\eO$ ..GX7U:׾<ty { f1 7`܁ /FPh ?G ;;?1*LWa:Y7LH GCR&0 :L2 /m5 ` fxrr .+D=f+<j  . 2c w+ z'!V0 YUQG Z& #oD"b, ; -(Db:Am- Gmq<r ]g|] O EP}W24M! M^ /4/ Fa\ipOk>2&"ZQ --CB SN K tC=fQ9)h| 7nxk-j='T] b #?oif dxkT60o  {H N#fpw= N W$ BAd* T }(<52fB `mUA Qc Tk>Z l  Lu\  S"I. P>N +>z +My#rWK$? /SCQtAF Z<R P  5@M ,2hN4 @e{NUY!*  b8//<j k[G R`i gg?C5VH7G <2hx\b oins~: z:V= d W z, 6B AA DL q.ܜ :*ؒQ'k 5 lz "/pSrS#5@$ Du#- ~' m 14F8͠[D:=\xK d5)>q+| ) {j ` _#  # ; H xys` l/<`$~d <RH# I"$H!(.!EUA5 B ay %X%i 3  {*[^'}! ; uR/ \|/#J#*)[,G4$ =;o&oC{M`t/ !3#(pRWF2 zR7"?H! #:&L(ZoO4X:FY}s;1wL) >[5qf c3 ;[22s,74P*/n   rf   jw  GgJ|!3P!` mQBL(u ( 41y7O   Y :0U{ >>Az` F >UKSS& w/` &e|bOkMS"!!!&'7PS1! 2`z??k`]: LfIhےsq32X ^Il>{YD9  )p"d1+I ݧ+:?C z.V DX{vQ  8u6Z  -$& 4( X #}  Zc*di,d& 1 l~&;%)AtgI-* u2 M c,   L n+5c Zk IA p N(6+ vO{ I12q #hپ:"6N zn)ߨY GM$$܇B l 'OuЭli.p`D  + IxfU| l.>oTH 1 d.>,Z0hw, \Ja\S]=o n-E ^]k&z AwF. :U98 \ QP(X  !"D Z7 :/)!`lߪ 5PyhArWKx!KsYAߥ1ef }HU%2T*c  ;XwjOL܌Px+ U' _  CF |8: K K ? SJ iJ viiPE]vQo {M q 0y4uv l}Bnv0Ly []~ nHl> }¹<`lbTXp(s63 % &P]^U #Y  f * mUA,wx !' "4 I  $X "m|D i+H6'!x!iR*^ MOT l)il2xJif m(^W>%# StG;,_ q 5A=3g#&)) * )2@((%a! F.>RYg 4"RT! h oXHj 9) oog dKj1>xo h f KE?D&<bܠaWQi+  b2cY8"% bX oJQ750x`EOoLaEvjs64Dl< NN5ABhU? 4L=4%+&k  WnT 90 D(s MN11Q\\4u,@ Q9ܠ b u ^3pb=7s+ D{>ven H 5f T}73 6T c U٫ܦش_r F{+Ed?4CMor8MT /gHc[  t l$0# FPN }JlB6 L$ER;w Q#t[x   em jb<=`  ^O?MN)f 96]r0U7v k b KEvV AfT'I|XP3Eދt 6$OMH48KW^^v(2 y  XJ >7 * KpSlU! bUx^I 4M&c cno Jih1r %6~e qVLަ w;hR$pUe3kgV]:50E[e,]%1aZ C > \<_ DS7' ) N T  wVi'n>si"8 8Z;th$$HR  # cu8 1#Bt\IH O _Y  (Pl/B   ' $I.[%Y$Q 3 j~J, > | B82E $SoY,sB &d ?bn2"+1% H N Rg 2'y!$zCg!#+  L 9v^++#rX!=~6i* j?`@ 1y2bn=q]y)Q\%^{J70IzED $i /TAWl-   sT$!hy g r`,1.F \ H n  KbLtuێyVm tB}vz d8K  ,xomB5&*f3 m X9R)M Vym/RkX]m"z'{W Oh3 )1(&3`^i & C8 rK;ps= GWUA zZH3߸ x'p4?n.f@k#bTM, MWfm~ utcFM|m~~߾o *^AW \ G(&.ltCAl[`;"lJ0f݇z^z׹ח،M:Y|.<-#L<q=')%zYSA Y~n  N7_bk } [<dv yG 7!ߴ4 K'%݊_eh+ihM>) & O 1`.(F ^b5 gQI $KD! I[p, q   ! 9XV SUsI; + U*xAfڍgpP' P `]> Z'P P g':!g* 1 =cuJ 0  oK rBX* J/ ^LN25 4k,vZ bj fF zu$@E v n]*: HtPlCl w mr}W- ce%!6<7:f'C3hw**ԟN;kh}@ Nd m|\I Myeod,Z Y _ %7u p B4m'-Dq^!Fh[ !A*h q >W* pP}t3]w^4 rHdNUr'9,f~ *y jaoWl qn ;QZK+x\ e &>32ld@u[sQ4R߳)4)5v: yO]fb}CA>-k+_ r2֖DGFqMZ {6gl/=#Kuro (b [`ZҴp HZ٧z)XY>߁+,ޜW#X "ESיFdZF? B˶(OQr F5an )[DR%[Z )*z@y)Km"h q_ w ;# `)e;6m"Q\?i^a TK* |\XV2 ߚo e 8b{/T\2In8IE +kwqYvRh |o4k{D rTDqHdM$VDm&9"ca ^SI)]&/U 7w<0: ZC Fh 6# ( ;dPXv# g&]p|beFIW'l)&rG"T-WU@ U {~s=x aa. }H tf:\D  u !(2a.Lv%* > \)w [7  " 2dd@E/jT R I':Wvo %ig6 2Joa j,ZoG }(qc 2+/:y # ,0  uY_\$ & Wa#ii|"z ݡ{ۖdP2֑TZwt t ) :ԗ? ELb*q/Օ1(~x3=+چX_4D _I9iHF QLw6QkoaR m+5eo% h *w@ Y=S,#et+F ?`J0 i < /1/  :V7 =& ps " e<stkQ2N UL"Jas/>ww XT xL  P(hs   6_ i(0_b % "OS\!2{xh k+y p  $# w}3S 4u  $\s H69:C3+f%t > Et6>( @D ?PR0-(R dr lmr@[l ^_6q; vJ tEM߾w 4jd4U," jA _L 6!a #_M  N n :r [_TY0$ZmT  bv{ *T_c^3-! -@ !_Ct ,Yg5 % "~T X'wF7  B Kao}/J>U' 9 R1H_LO X?J sSW|"&6.y9;Hb-_'$_{[dM|O!3 bu8[ '| XHb ;!& 7LPB#C9 ,.m q0~9 ?n[ U ) v{ TCE5/bycv 3faSE+J <bg[ k),y~>H #lKrg`}]<,  [ E@)K {fDߒ 9| m K9}U*8=YN& 1)uwj1% y1A+ab WXK;R .{ Q(g:aUށ&\?+ XMͩ՛w >vHHEAJ uy%U,S < @/ .mT Q D/y  ``k;>'WtvbY)pl dhRs l:" 3 6oAg.{Q4 &U pvg 3  U&rj t, ](SM[ d CW* <O#( a -'\WCB fv:@  rs zl=S$!Mg !   kL  *  k k o/S _G  G O@O.\d21R=?s9m x ?29\ {`%^^ *) .$%; f-ba  Dt)-XKk&blF>F`5E:i[ L ( <  EQ7=a@-&  K? @ jCkF  H " Q: jwi i ni s a D  lu]I<T x "T)aWL ?K } C}ݪ9A r dTNwde  c66Ax uj U]A Ot+ WkR, A6; $W 1L Yy'mv`1 Y}Yҏ1g7S c% ,qt" GmRu2 t5 mX Y Rl w5 RC@U B  {L eI8 -N+0t޶y 7iQd jB=2>?P m hAV/ #6 gB?1\ c|\#" F ? 6'z.DD G^ 1*" c }YU}Dam &\  h b nc& [ ^`܂.RD VbxcG_~VjA   ts^!  `h ra~m= " $v F&scY D ! 4    x)d.9 G  +iV B l ~F6 zt| M SkB~ yzGK\ wn[P:'9* , \ ?+4.;%  H|| [ l1{e v >y; O% * HedDuV*  Nc @{>B&x'rT`Go9 DjX"gH0KS!O 'ػ-o_ 8 X zNA9 }Z   1 0b9A14   l~ Ig I EIkG  y 5 1 {ւjh( ^qi x !7Y7y   v4[{j VZ Xa ]b ubJX, ) Z# "j![' { #S&PK?8|H^ G`ZUviHR}YK zAE, m}v5 88xy~z&N * tiWF  MRt}*&-3]_1n>kz!4a6;U, xj8C[ 6%_Vud+ z];VH    O[AI[Rk-}"Nr /! T * mJr0 + G @;6eHޗt{ - [07iNme 9B6 *2YZqL P jz "b "n*g Eg 3 _&R(, 9I3 +g^48|PhT#ۅEt &b3۪  Hs|Cz&7 KfA7Q$.QM JcAebgJ YLCg'oR|3YJA_3A3|vq ٗ \5 _  o3QQ }0f 0"I4   Gn"MZ#=w w2(> V=Q[Q|i# ?s  "I FR<1-i Mq \OV'qw5y Wrv F 6 $)! ShhjD+"t9% 7 ; D j ;Bep) d[\  } d|^"YlV-.5PBcR/"J;~f C 3$`,5 :w :i'q  h*(^MqwJ jI[0 ^$xk6 83 ~EVm ^~_h؞}V&GvA^Wj23 24aCa"= >vV` ! )'?"1n b $meb']#>e (q x6*O WU<N H ZwI pw\ e&S}{ |n> @"G`-[ q V2 3 sB~W Q1 ieԬ L ;v$<z  { i}b 1,ws 'hw,=T/S fb  Jw!x  -m5NTzBo;Es).!OX#1S8wWc // a M\GswY[k;XA3mi}L lR= V o8^x^(U"H20 {%&a  aq03 7B \9d#%x1o A 6y <!"  % p _/U-%Z#g:!   4 ' KZ KQdBD<o NjI;0Va YJ G qfP?? YQ H߸p PdK[xA; }8G yo9F^ =H&5"hy  "B6֜ Ibz w,>V~5kGoڄ W ?ݸ7fAahL Gg1 gf~d j  G &z y U)B  f WH/ / Jv i_NuX /oiu _ HS' m 5 J K* ( " h O1Y tLvlW c  ] # !'0 w   46#&h7ilJS J EhdHQ0y  rr Wo~j jJ _q C :{$ <-81  =k!%/ X =UO7 g GCX{ ? aE }(v)S v d<+d/lD #QbJy2Ws.rQDkVJs ] { N4 _$IrdG=u y E\I e:sA z u;{X  E_9 < v |JJ R + X.KpqM5,^0~0D /} .f T9!No  h  u ! aou&"")^!o 5"D 2t1V   =; ^3w?n "J   3l(d2Z= `  nj Wdt'_G so<@zR Y"%."Bz~' v f\  a0 PyqJCV-U;{40 W VS- 3ao' Аj *q ddU "VاGV%ܟ.?13k*wkq}rGD^W@qR1 Rq 3=o':ncQcI F , %}2 |ڽ> 16/܆ sz#i4(;Uvm2jmt/QVݞڋ daX w"d4'rJd sm{"CSS@5` 4vnZ{q?i<#z  i\=[A V2 t ) Jt f  GuOxW64UbWQ&HPoY}dwR*]4*+js  4%Kx"*;Si`Jpa %{L A "U 0d z; * c ~FP>L u " \l wIryjj'Sd4A h)n} #Y  /W $C/#- V1 OM wU tz 9rI6. Y0*3#.ymJ )   65 ~@S+P @ 5h,YmM"^O-'Xha +Qsp$>&xt *L5@ u$cy=| r\@(\ s 4 $)`* )m 8R 1 y"_-Y . G =%Q W ;d Gbpk}J"Yj.+  @e r%x o8D.N b /$!p\ MCV=t3[ tfc%h{hrqf,h.e  h 'J5Hu G[V.a I G !4 ! ;i ':(a!!  PAIq:1pK G4Ec$I&O  p(#qP+''B9" , }"^ f) j F!+7F r&P f!F! j2ahhgoiB\{? ;I% 63" /8<  L  DI  6Lkp # 54?yA@_' NT &;"j IVW 7w  }e  @co@`I+JWP7X  q`Gyc&WNWyV$S;-RV%<{`:W%h$$ b tW]RJ| 1 ;a!Ap) 3!gO2&V?B]  oQj #j   \ (N,^1]n b 2j 0 N  \ka R c04pKrQ{p2S1: mfq =;gH% lD ~ d: \} @ 2 ) U@UhB ? 'd5 lL&[`:(Zy Z  XjGVy<\  c dsxOEF}9MCD 2 kci_GW+uNd i QShcF~P0,yIeqb/EWT+=\y[`XLX z  vy@(%#<& !# ,[$.F@b& xTM U /X 6 F_e1 M k T>yf  ] ) C ]C [ 3Y{  +c   DF'L = CobSt g " hBT9: 8 p&K1!8? n w f5l  l@"Y =.  )RJ i*)pq }!$}*8gFa|xYl{= $ YhRm4 q-4[ c Q <W ! _ yZH  : /. $ y7 IpU!4 Y% GJZe$A~ @]L}`I iE)8+EL N = Z:W rs GZ   \^ 0  )(3ak$~  R $|owboc ^ 1Tf 9 Tub nC*] <~n4 % +  2D 7BJndR GLJJ2 ^ w\v H4] X y RV6 J HwE U vQ2jVkaXm=`)b,T O:-:y (}P E &P/" b 3=(2 H Mr0"!}Ts\MAb qiW\* $ c : 4PX  *Ox c/gJu r M ge Ah  H MU^5 ]np o:N "el SSU 7bbQ@s Ag{y X gem# 8 8 ,?1T 4 K  ~o  3  bh ~ #  Tq+[6Y CO- A") ]s&YM$kgz 1OQ_(ONJ%T)b9aZ@\ w" Nb^g2XvP b.5[(Z h P>>$ +2 5 &z  d@ia! O 039yZ %%02! t_!0A $n \4 qvx O   [w =] ?T dP5 ~ P ITrR o [NgR Qv j( x] Y4A7 H #6&CEL+ !wn"$? `0'e 8[psR_?: ax ..[gFl #lpAWM#~wgu(E  %4   &k!c% tJiw   A 1 V 0 *4_ f A r 88["g / Vz,}W_i  'b|$@=3]KLH"0 @{x3xxP[-(7  fE>N- + U9 kO j=DiQR~'3 ,B+[YF to;2YtYL+.&> UaBFJ !FZip eG-\'N &`} )o+k^Q'  oZO0tci]qtr<?$59 _ >vG  D p (M a%]<  "X u w  A ] W`J Nf  H 1#,  p o! S)r -G {d # =K{UNc ~ -@Dw 5%TQt|/D!, \t Hk[ C w9u3 ?aB ~J<"R#|G<[ % l9:m!'  I D1| `1_A2 KG 6LCkF)Fen{ O |I 6 7@u_k|-gh"h!;V: Ca   E8~ 9 B AV*4IE `'$xpmG} \Ci5,Y2 md3u Q8\ a :~p?+ d E -wk L"t t E '6In_ Nsr sLrah{G4 wd9 E3A"U' So ,'6Oa4/rS-d qo*"!+86!E y m:Dm Q7):GCU ~ LZ> zn!.gyg! U,K# S  _E?a EUhaqs Z^;Tg_ )Pd3 AyVFy pk "  tJda  X@AH~d b.v E}| <7 wM|\2tNc# v c&s Ukg x ":$ #{@R 5 9q-bY $ (j QPv2T`{/i\/ NQk0j)m\t-f ] 1N a W|stR> $ }2 Q kk  Fj\ i| <udRAr|0!'bu,g [ K fdG*lm ] 2*  ^2o) # @ se=t HWU7]J[Bk \ Y #M$ 5  sJ 2]1[%!V$:1x8 Y21!]~3cZ|Y 4 7 {0MIz1m 5g? Y$f}} R MIok!{&0CtT)mD;i 8;kHpe GhhrMRfA s  g5L8/Q-Y :H_| @ ,n.YJ 7h=܅.l~>]_o\EOcBLW &]bD* B*we  X!l:~X j>f YK e2)# X 2(yZs+"| c b[ G L;x: )>)WS04 + y: l1y + C sN1 OEvr ~ * qI  |% <@ # M N @/S_*;sBT h f 3 "]R 'a 4\{CE_@I I if2>*gq d8l6P>Zz l  ?X[?* cV%or A_9E;g Q=Y: !^ `m:+g qA.T 1&P,l B w M/ : Ncmq] JA_i4C"R? c{ 9f Y Cly XX wx: I s@1k  - /_An/:dq #4YvQ_  `*y ? l DWm Z b; [$5 W] V K> y {V V O  EMhR6  GVD H" fOF  }hkQl q.3Q-E +,W3A|u tojO?Urqp}$ Fo +O= X6 < >) K t@o;  q   D EBL 5#]dt ^a zNWbG!IcR$U-GHLy)_ d"4 e* CWi iC.P9A /e A Jp([2L ua i DB5 PF/ljvAqܧ  Iu nZ @g@ ~  Ss<~ o2P9Z<sfrJE$G?w!$ s< t Um; r gޛ^{7R U @SmVl)X/R/hd݉(N9y:E)9 N K1=p sR=o ?$ &8 28doD'_37_7 .od )3:  $.if +V*"O H1kk #!RP2$m ^ bm2OycW .r1 H` k0] jd,NfNW  GBF" } %S\aMDk \z rULS$yq T. nJQUlAx  & " >eR:i 9 &ޚe8!bO.e BIJ m'Kv*o  >=9\ \ zf(F4Cc?|Q lHl'S" =:cB,T =L hp ?Ow\ Gh ?zeZ}gZ[3 =I +ުJ0WG ; *, 0W2%S^zUa g;_-VMr!{ڄT W }E  > u0]e y >v  tH 4K12  &j .v\.[RM ' r^V. j_L6d- 6Y$.BD?m {:`N} f,$}E8;Z5@Tt ]rqW[,WIuj3VP:.d7j_dvSrU%  4}y- zU[Brc&&e <v] V>, H @ 1( ; @)O@/ ]8/S @E *f V)>?} P7|cs~sF,}xj o`r#&&e\q,. {7 y[Qj 7 vw2 C}gb IH~mC ~ fM ~q_ >w  A<  ' ..3 :tO# 5z[UBQ`k4ߎsZ. +ݜP9 Wpjk6$K"Y E`S(*( mu h[tC1t g%  w'|= C5 ]VM < [Kx P- TA*[G#"?6|: m < Zp5;/E(VL "$LE<^J ;~pseD : &Cr Mz&" Sm`9Q  f@U  ,y^rleM? p  @ 2Mq{ zomFyFat2u!jw : CM B92_(]t u\0[DfB/% Fr|aA.UbMjD ~bߣ FmG 5; DF BSV_t r T ( Q!,y L!ڹ-&30iH0 l:h@ e:Ujm'"wG^hFC &߉m1ޑ;zY \UX)^ A V^\BFeOlpL-% Hl#jr   u9!)@OO 'y bobO =/  I l9RߓR"# #11Wi :[=i gEd[q<K+ >r&޳n+qcݧL(sGk(!$(F~['Ц۝4 Uиgޱa*Yً*  -KtaEpI ]z34/d`/ 1> ( \3Ba8-Z  OuE`Kv)o2_ Rr(L& o"%?c2d * ky:' ^'j 4I N i<]*   ^n  }  L FJ69, g}}o b / 2 L;0:jI#  R@ ^ & Bu\&BJ4 A \  cI 0 6 XY8 4m o G_  n*  M  _lm6WNblg bdTu3lO9}2 \U =:  {2n` f^ ?s)B buG: K } z X#E m@ R S( w +$ ;rCFh g%iZ \7$ QP8[7P ?^p4 [ L Bktb  ~o i26 R`tf 2#/0g : qt k]Q fA @ pmO a U~n\]I =p})$[L yg y W`u9 /2*iT&'d(hm.1"b 3 `(d:G{p?}r>bQ_'s Ir*Qpxdkf9oIXِkx xZ [$+SYN:04iY7n )5beA_L?  {9< [Dsp Q @ 3MH , DzZ-XEK +wR5m+ce$jV_ v( .t)t m gdU`!iS`2"Y%3qQ(g]y'$!Q d{>in Ll = Q $Z>z c f(8 m* ^*=6q2  <W7 .Xra  ]E%+8VV : #Iw+  sJa~h\  c@\ Y0"6ubVij`  7xW 3 :kB  %ze q1F/2M_ @u<kF4 esI^9~iVwE |`? (;K% DHH/< Q %de~q sV "<  u + *p>3 ] c> fJkuC x5 WWO G 5Y/.Zh3ts o .( /xL] < w   0 8rMTOX 2Q x EW g 1PBe]  G T)l CC5' B s L< mY/W _ ? 52 &/w+yG  g_( 6b{  #$  eG w y3 ?L V }; ~ I_2 rLJh5WXE('%k\i ^' 86T T o(pYI xka3! FR#q"]+ | q 2  6 AS{=} m * ".x_ *L pj`y IxbO[:C8tER)B Z.i H  hM  U,_b8 L}F L b(tA.  @ &w  VX;^ #P  <  cv@ 2#~ =}77& &%7Avk  "  tK)U< 3<E @ , %zo  y| 8Obq70o 5V7 pJ`"~{ (kD /55 8Xq|4/2x\@Id2j3v $6ii%Yp/Wd9 3jܷ=X 0u|#Z=P? US|^ \ k R< (H[L j =?<<" 5Es b`E"ecNmb mKs|kb Uf(M:  2W^  yNSS, oAj i4! k_<*IxR >N0* jg,zqmlR>xg sގ"cBfBՙA~qP.2#LRU Y c % 6KH Z)E> mm9H9tJy32k  z(cv4 i :}>a'66l> d.g 1dsf2^ QihU sne (RK 7o IP j&pW;+4CbM g 0 ;=ՔxZ WV&?Qa0u b qY&CW* Z0 ^ q K nA:<)?b3 [sH{C D* *:M z@tޫzhh1A*hh#C/s X*5BoNjjI @)O 3IgpI HB \v_C 7 `>;@:]\d:YtJ8;4XyFsZcH(65#w/$"z,CS. 8{\$|Ox +j \>\  oF f%[!#EE-N| _h\>  c0LS Ph nM5Tnp3{ur 1L y " q$ TWzO # 8PYD%k hBK TKu)*Mcth(URvw 8~pRzh p 0>2x +S nP L 6 yC?=_ H Fc#2!V%&jvPA#()e*p : i + -O! l p XSV  KU{@ lQo c7}6TG/$+ % BV5b( S @ I,8u Q " E _:hYDa %    b |~[ d *    / B;!DtL0! ZPwv# -VF tX ! : a%wr \H  q1,T P4? n_|t2 Q '`]m*i;(*D F 5 s"q!h!x A H; )w61 =HDR7b )'  J N; d;s0j O #mEV(t-YOIZdt4 [} M` B%`/' aEs2 ZN @ _5Yk /SiW[}?6cSM@J-OP ft? P#tC!56AC(X+t 2a^4Q+ s 1 lDvp1 u@R &* o|: t Wit ?-"s!a;*/A< T=s.  "x x`g*4&1,Aidz 20PA5Uis06mNBny]HGfT r>E$ R T  d9oHމG Rb-u XF0L2)Rt  F >UBRx g{b (1`V  dmkiz_n(A< C' } x x~6Tj qlT 3 - JvI7mqU2gC|JL* 8]y7J nhAg O:/y YL90xfZ+m T * pJ7 Q  b6LZ%Z : Y H ]a~j: T)6T OQ @    a9 (94ms[:MZz' )!tWB}~w.i+5 Z[~p1H v  pMYF _ V 2 ]G,; -c<8wrx4 X,d]mj o 8.fOq5 O%_3A@ f 9mR 2v3H) 3Y @ g : 0Sm=&D =# "=s >k 8[ w Z k~!Z Arl t Eq( :AR\0hU h $] pٕYVD& YvNRf.G a^7+ Hn>1" - ^k{G ]ss   #?Qv aR<0 k_  v (`l k 87,&>O9n E! 12 }t(1,$v EJ})'Z cG=&|$ (n=1"U5lv SL(si9ch N  <\ 0I}FB ph  6eQnFz~, 9݂b 3 ;} {.U\:aZ9FDK )@]AY݌B @^ 3 W~d]UZV2^ Y}I  8&e < =/'"=@s0Aed#! k. ]H s  #X!N(CoW|C>  = Qs4 t1D |  B 6>Y no)  ?:OLp> Dj;P .Q VMao  C& vta~"@;~? pyXD?b a eo}YMH W ~%~fQ%wPf  Lwm> M> {   /c2e # r Xv~ 6 >1u`G _yE< ^;e SKV&  = H K }A 80Sa 1g"M= i }:[[* >rdt @bx? Bn #%  = dy} \z qyW> R @%eq j =izT/u 3: M3mO/Aac+Mt" 4)4!S 0O& }=ZJu )%Kr5'{] z<O  v v BD l^=[(rb %mX 98 1Y^T3 b& @eq   | {7l  { z*V f+{4 q ;~   Vsyj #  @ ; _o  G5   ]mt# [P)( 9G*<"a  5 { ( 'F W;)y #X _   `p g  ,,B  $ N u+ 6nP g2&# z .hb@ =% F^,H gw p X{v= 0 >  " Z][= &ALe _ ax-PH 0w>~2%8\/lM=Su}m7URZ'ރUXsx}x ;f>>H =:euv Y T:`@tMsM(P\l7go1 JglV 4~ <V=v % y ? ~)##[^  $K3=|vM7%\p5T ?|( N]yB (jLgdoq`ut wd#0^0K~\o#xP   [mtZet- iFz@*%b{Q{%|Jlb<=sFY u- ( s 8 /\FD"B {\ 8DV '% U=u Txb j[M & S;` zp ! M;1H Z GN:0p:TDA^%aU 63 Z:L  2}Nq Xo H N |[  2ndDDRNtn % rv Zrd/)@ OrҠ e/; 1s6K=J&8f/y =iZRS#gz lvNo3`iL a VfJ2  m C' xP] W;JCz' >O g.Oo fU/&WQ^1lUfTxK-I }fkz r 5dy0W; #  Eu B:$-5y8-VV# > ; RV h  O kP-$ ;-G_W !-#$ j.u 11o9Tq35PH` HB\ |=Zx\qC> [ f @Nnsߍ!Qc `2Af_+d/6(*9? A) p dq(U~Z^Z]h iftigF / u WIu>x 5DkE M- |Kxv it "bt- |vOx"l gq e E_tI Lw%fJ^ aP>N( T !O] R+ tZtNYpHJ ,3xT>sa  Tpr;` 5Y  G Ng:} )6J j-u&v~U? s q@}Fx J4"GGSS \YTx # TO% V V*;$S, 0"E  G|"P "lU1S< | 4 \"&fz $>n , Y[)M`y}/(V_?UT4_W# m$ ) +v_:l&j'| =yQ k<u6J  ~ BtST    .uT3 K9sz  B  _ !? 5 O2y(Y K*  u/e S m @cV: -nM54 uc1~ SA 2 x L ~e  MFqb xuS  0? B'v{ }5 ? Ze)aY rHa ' 0 SSFG \.A$0%8E '[i&KB8 eHF+T Z D\E *oj x4;J # ttX+Z78 ": Usmot |x ,J \-: J.oP hl 6" C dzn<|xt  w.`KX6LxsXAr &Iv4 31 l( $ E d$ u/^ r a e2xT : L<i\B2 M2U6 & (zAP mGph|!T~9[T7Mމ<] < t2 t@x `q?`{  VY2W{sI7:<S\clA h /jj LK"Ug K viM)dXogB4+'Xxm :)#;QS?&} T 53 `l  _? \T#<1A c${/6d =&J,?B"}q ) kB ]xQR  x=w(-p}? =+  P$I/fw A Chn  m B$lw!nZ0 :1Xfb_ M_kOpS3@SD??&12J x} (w ,2K- ' Q  *SB\#:P\@L .#1 < ^gf| b 1]cVF^iGS?)ۀG ~j?sNC ~9O MkS kur W`Jq~g`C k0 ]l7NFKizSx },lo{hi.r  - 1/ E. ] U /  %r eZ9 ^d  #  : 9  PKS3w@D $ _ '@! ygn'O`r# ]VWR+E2}w ,lG;j`p.la{ I+^TF.3^ E" j C{w7t1oT(Myr Ew%E.QJ GlB)] o L) N] f wi WE 7  aWuy / 8mxH[-S_\w ;Gm ?O `  mFwqG tD |)*b W f^{ }  iy  V&%l_Xq6E0-1Q8S8 3  o_ X $w\?>f^>y H . ]Kt)l 4=,+z3{SpFhKQ8~V 8 `npr#fw HXr xv h7O rS$'  *Ka  N+?**6_r i^j"'SoQ*p)[' .\8&@&) w3v7^eB|$ v(I8G U<z/ Li1cW8YAm 0vH, zr]<~ M , i;1 +|b0P  8wd 3[+;R)CH g_R Se-=''" IJx/7(Ps yi ^,7 :MfKRu\Cq 9Y  Y K }  u<, S+ ^dnyE 6<(w G? @,&  bOd T0ޯnAF;8|P[`mz1|T8 5 ?;Z/ R>i ?waZD?TJ yh ~y/4 Qy`>Z/HT{c~ b I7!- G^}$k q [,# 2 Z$Xt8>q9hII SY9%> ) >h Y(@V@ vUlty$ ? *- l=6R% 8mr%j C'- Njo> ' |  f?/BR6`=, ;v .E!u")H  f}7 RIF ``K  Z msT /V~] Z xQC31 Nn~Bg C  N;hjw 3 bE  tn, 2: ) F b=O  _fu3_jhdG:JQbz} cw Q y .\:Zz,l _+wl = > 9l]lJE 2,z" `Dcc a A & =J w -sa | KqJ^ /0-u   LhOiN iVJ Ha+ { Mp '?E P27 )r<@ESt/cq+Z:%oI|.s^WSWv/ 6u m'S)|Ho+}yc8f 4/aZ &Cf0 dyf! E fW U#%[  <c2k l# S*BI5 A SuO E"Mn`> \# G@ 1 qb`[A5{!ZARk  i: DK tNGn U  N R\)xw 8 ME  9 %ZK iQ, =bl %< Gfl (#C." x =N? B T S  `x\ M=Um%E7$b | VQbEE kZ ?*@4]HWYv' JB}Pe5 a3UH /p+   B# nj5c>H ya +kRu}  s "\_r7d` r' [zmhVQ i4 `) >5 Q* 6QE^D f9l8 o- +*pW;8 . JCln ( 2ZnP s"8  Kd ! `gu!np Y { [?   $(s r   hx06 1 n_.Iv 6} =?rb8V&%&z_2h 8 QM("_ !&J Vj P v7  84`3P d /:l>jw U  V U+C\6 W  ,Vfgd3v} vrq^ ^w2Ptp ,1M,KPEp= TLO^u0 y7cA (07 Zv  [Cr#o ?:  M -p% ; RJ 3h 9Z] {%  R&Ge c[}(V0 ) ! 7_rw oh } JSh(@) fnb{ 1 U9J  XBAsJ XdP sStv +f "  Z _q<%  ! _X-|0,JRPS@D *L1p c%6-DTxoQ mv ;i-U:+#7\ 5s@i[a 6N<]Y)$]nb|]nq$;U V .!{ R6j  @B }i ?I   T7C+X S{ ,gM0 Xxvb/WR:  i RW (9l'gSU Ytd"QO~0   0 n _SBT ; R{$ ^K wJs[ nP A,h a o [ XR{yU 0QO | 1 R ,'AN  u|  o O  3*1^Pm% <n  QhK"D s< ? > 3 R ! , l '  =] ^& O Pw-Y j! 8 fkl mAb o,=eM(  P )Ex ~ a U UW Y V] #ofdAw ~ U3 Y uD68~  *pu!E9y-thtMl 7W J  @ x  a{]2  Cu-  s X g}4 >S g W i I. R8VAwA;1  Fo fn| ^ ` dtI# Uj /od nQ Kduz .| M{EWa`Sy 8 %y\syD Lv $} : :Ay48QfiC  ot Q!xW O~SBh$# F|R "V!-k q5C =, 3K OT |u9M8 ' I^;  j DSb7H|  +_-'`s  !  Q+"z^ s2S#j&d v{  o + Aa e 3  VD"wM`/O?HH bF>o3Csw ~ Z0  2 T\+9-W& <.m  t _ [x /x 1/ Nc7s:?V cAI+#t  O ^Vdm& /  mH |H/Kczw|YM,F=xb  dpo ; mUAZ=!`RB? T 9be r :Vr^ r7 ta, rWG" to b  P_ h"-jU8_/,C9  DG9y : ]n C J# K 41%E [[f/3Hz?A%A[;[] W5`l"Rk[ }U46H3_eC: bxP D xHH$73 C g\/U_F{f `SmoV]V t'BW4E7j`s 9z spxb 2 zc^s mO } )eG^TGe!~p L2A2lq[t8QpdK%DDyC_Bv I!* f}c5roQ77#\7 :g > a*PQW{ve  Gi|$X(6? $ lG mCCr>g(q) brr `{6WWE 8B7 H \i M2 j!SJ% W KlZ; K UG&Sj "_VvRp DA)&Tup6 Ah~9wXtejFf a?Vv2_ox"Dr]߹ "T%,C *gn^YFf dzYZS  `w7 H  9X uk u_/ 8:yN7T0wELJ 4 ajwbcSat fY' 7` ,, <d + z & . :kF&C<r< Otew 7) ,sH`WC 1\X]  V Q-G V3HY u 69>%]x[,"FN| v s S a ^^J $ C {C  PDSzBqZB eSYw  n BZTrXLv  /T$ " D%%iqT v tkx_ /tUdaN`RwQQZ|p[ j2 b7DP%~y)kJS06D* ^U&tKM% L e ]* A \ M tjM  aX T] Q G+>zn93 op -L:l*& P 1  4# (!@C   LigN!]{eM81[GT]M V^RmC sg8h@ a~n / G 'zoe=Btc@/v j ) a P S O   z  @5& xbP thXx poNV?QnUQ@ ^%;-j4 ~Asc + g KM2=T|1 Ct< =&4?; G  t K ( #  ST*l @   e#rEA{[oAj l; %/u ~V 5K C{ -2 . g*e Rpx#+2 " R ce,O1!SX/'q- ? |>C xJ.( [ &W k " n tft23tU  | iq&0gEW( YSkTG$   @ nHI=I@sr< `AV m27 W a 8   5~v/M0ick'5, 7G& Q 9 T RL v_%G)V4 c |)aykJtn  ,S>D G{7 a45 j5Ok} 0 - S 6 e f p*W=t+ Yn)i,g)rZ*RmJHق7^= ZOXs 2 H ];1luv% $tm l ?C} 9D< %XE > X { +}gW$  ~:Z zNL:0%]g thHF9+]B M] j OoC|mWs I%lq;1.%[ 6q9 0&y#zy ~ EnO  3J >^)#pISu%H|9agoqm&9+V}W@ rxYJU Hz  v@gsr {\Z b Ht1WHV?Z"l,T &a1?2X w`eH13 mPR` <_hJa:/$P){6$a5.Mx  '_,W=v X,kAm_pxrx0{xzRXAn%^~r PG 'S |$'WA  N2+0N 8&1U"o$8E mlhkjC}8 }vkpc{#e#q.lcKn6O~W" a 3| VWvE76.  l5) / c~ jhni;!IZZav&7e`%2u l>W/. buw&' 3 ]rMZ//* :- 0b7u|k r4jZ}U:L l$&T hD P8d]*+:'{+uq~# v M RG1n i{e&q  #^P f fa ^,x9G>( m0AHK<. 0q #ް< 'G&eT 2[@ .  C E *E ~-|R?*Y@ " T*+l .,cvbx" > H(/ .Rzx#U\D -j2Z$ 7O CLSePX!r)rx9G  U R] m 9W!h  f Iz =URl|3 * )4 MG< R _q(') ~n r prF%E o &H vx^ K 'SQp;,]7k DYk"y'g x9 '29 g.4   -g . f.zM + i V zwE +.eI?`([zV]"C6W  a5 : mUM8.#) Auu Ak(~  9 ݴ r[vuVv& *rWG Rx[+   z d  x=#dRV n$I9W&zM|p~3 R=7g1rh0  ql=#w _HG! D.ED^k $9uh W2'l xzj8ar yn<^t z K6B J Pi [    e;Dz|`c Oy#imbU%qP `*Ytb q4 &A)<Yr -Hh9b/P<}aZ B JL  I s74SWvY 0_sF)<edKwTdw*yl0 +7j}MIRu a2 Hqe0IM  (  d W*6 Oy*9 v|U=]}D t| @*< Ips  \ fG}; J~S Z t5~I=   ?R V|>z@ -_KQA59 3} I[eJ fIV8 $*e (VdA` Uw3 39r  aI^Z <&  J ZvH  Y /*" M<G: \t h | -0mcj JQ Fab66Z%8[9Q P`:]&Kox  ] E? \ Dal XD { z/J-\ OIkn)h@DUI '!do;@'@N|d 9 G PrKZ} AWO{W;!$FBB[* } <3fw } j e2 3a,T+4kl|htL"L7/ `qmf-LM =$hr[: 7QYXG\ 5M,Os( 7BW=]kP9C XT 0(8t#l)-PXH'fa>k /dTGi'Y *V(4=? ::?Kv@1 [kmW[We8dD+! EU p m-wJM _  h  F&n "\2 * r Xz: - 62ITP) wB*Q0 JhwMV ? .yIa)l> 336D=L@39iE .pB `KR (CA93D( $ / ` A\ !.@G_-NM#`D &B 6 Ct|,Tr >AhZ([ =hIa%-8<>LYݔK ,J  #>ZR  4` S$?E!GU= = k/{20tN P>Z [?1 ~\ T"'/*Zds}T9Bhy((E}Xh_b8 s5cN $ /nN  eBzW Nn6(l9 )MX {~;i*#x;eJpC9UZZ m ' OXqhH+ j U | ! )=P} !v M;5 r Z,KIHT G^ _ #+S] l(- f |0^o n2[Z= w _w::k 7 IDuUe A#XQ Xe x;, 4Y  c sX'|1  k;t{4 fj9 =! xw(A^ LU 0  M RtiGZ4-3%C?ahB v &eV! $ \ kj*KACaJv  H 27^ `r!A.K8n)" ODzf;>o 8X kn?  P>2h 3 m(#8LOrw k08?p# !w| ' p X `Zv! e"AAe u0QqPg E"L9@#F8YC YAzO DHO ]M x'm&`"BS k54<3 @h / -qlvx )C ity'5Z  JDQ {L%M  &, 3 3 N~ % F3> U  s] n.E$8 ! ]V /_ (GxZo u vw d zI &=XJ B6s p ')MJ5 E\E1V|%i  {A By  PCI q *i7J" C S4  %P | ~->j<~ n'bbkGTu M|W91 umyKP |j;mJL *20h}:uO  >9{N jL  >ZeF74  K: Ls a?%\ 4:2PeK_8}Zhzf%4  2 P~S  EWM qq Qi:q\=QU=&@.Y1Db>')OJ; T,Z,A; W lr"S?%Q3@A3l dj 8oa)hF HV7L^S?c.qRLZ0<u%RZ Bg :J&R  [k IU,rVx 6R ;JBW  &a@Q1 U2_.'9*QSN }{R?3i1r9V7,<;/ jFh <_?prLf=Nd)4_  9fEAf%Wv  y67ruTS N\ J 8 i P% ?'U_C?uq gb-i%Gc  qxhQ:; [hZM-  SY- y [J[W = g#= Xr   6smAzO A U 2!1Z> 7  #EwX D[16WF9Ar ] c /%]#[|i~`0(p@YT^/M8{4g_;4zjh4o GW[Gzk 6  xx_- /akW(g0C3pU Y6#hObK[AJ I2]vC(e)~=Rof<>MgE%  O&F   _Z }T  }   .'@Ah<$-`Wa%. 6e-02O ? z&JcX.X''j Y OTz'$]h,PVF2l. v^F + 0 -5HA u19PD=E|" g  B{bg F!3+,oSKT Xf/1(=$Pgp_ o~( G ^1d(G#np<OA;f\{ .c9 eK` ZpEjt "(,k4f 2_i -#@Vrig >kM!eWp L bw EVJ2/.N{G89Yroxy'PM3 wW G /^<n U|Ir8 {Ki42j TL~((   0XI'-a ]>;'\hNx SO<769:N~  Ml ?mrSWx\T:\T rt|LWbvc} 4 IcQ6;KcB@w7Bf1fS-Qhj2Z0& ! : V$6 z k\OyA& Ae  eQt/t;>Mm; u cq*H /ZS 1 *g> CYPuU oG:BIu Ev qCs9'Jv#]=U#u&QG ) t \u ]3IwQw,=7cO92ymM FC Q_}Xm=hTL-g)\ _#.X7_ &4ܗV2 p2W ~\Mw gp Q/N 3 =BZ4u V^@2 }U ?R"  c|K P r+ p"Q S e zM=qn~Odta $ #>`se (,3$Z "( 20 D$CA!H  C0{U7 cX a 3 ~+? ] B. \BD {~& T + ^ !'  w4N@ S 15 ^ _  RUDJrU $|)>=9!I=8 l  lMOf =8  Z4u% V c"l *rJmvM 5PP$/F`kyU L,.1   Avw6/ #eu{s # P0 yK6RR 7  8K3c5 ^\;@b &= Dw'US: 8kc;Z(LjPF+84r z$  _"$ C2i -l&i {l  T. 3?vi zrg)RU4.BPyB}BCq>6 G - nA\1vcD#r 33- r[g| }S I82F 6d w!MB e9?uv #k!q _'x8 \ :Pi l D g2 z Z j>j0 a0 P Mf9N[Mg K6tb6 @ wL VrH) `f5   [e&` C0fVf ~ b  ha35l  `b_)  -J=x @87x ~nB !\$pAzV> T ' F-,G~p+)yHef(zP KU/Mi.l M 8 {=tV /o  F; 6 A>m%N$| hhx tTPjl q#`%{|(N8| 8 ,K v  l $'% 5ltU}/E p=ao GK:#+L3~3N   nc+  W g;9 ndsBhk^"F I]' L! lE o  3o 9 ~ L  ii!0:S AtK /1 bIo  jJ :JQiPZp kHTY3@y3g">/O$Wa7 r@ J" aF+1z- T : T K H V =e o {`}|yH| lhio$1+E p + AghA}$2+'h +0w qA) K  e   P_J *U {x 6 l;1BX/ls  qhN$&oc69 OMOt4:( aq aw ay JYs]  kPi 4RGpu' $9  =<@ `;xz1h&X- )mH.s0.L+*] w&u*NF.( E{U.3 R( P/;rKG X 6' #,' Q y3B%X NGhBwe$K &W _(o X`ib;-N fRS)=, K c,MWyX"aB a= 2+I q7kcM5\"'jgc(v&o/m7QYY = nUsPq!5CP7 P!a3uF K mBv ?6 Tl 3aBv  ?M .4XsRT4/guP/ A&Ok iXj8-+ pVnY6 veE 7! . &RL/ H i6O Y riy!;KG~= nZ "4gx'IYR-&`NCq2 eV|f v.J D b = g EL_{{~ 1 `1) W .5eH< G 5f]H{Y^X8PZF)5-2 & $ h(/*IY!v  R J,  JQ  x G U w &+ 0 \VGmED #P3@('J  2bs*y ;X> SV] vq/\|B ]  ]R| KtGj[/HY (; %y  O {i #rj q  s  I  $&6dP g I HlX ^  i"0c_+j'l w+ rD v e  +j*  :N,om VN7 ~"&t .. ta@;M }fpnS RtG+K \ qi8i ! <=:  $v:q" s [Osc? `+5 QH[ :Svcw6Gc  D  Iw \ f>5+sf (/ZSJw # :6eEB* ] )y TV  |c-ma (WVZW$;G| !y0:l8 o^|o +@" r XQ{bp2 o + / w| *  Nj9  nD # |@ V[D  RE 7Z h P!TM[ U%/3 | yQuSy3 w 6 a p,u 8   H? Li ??=I)l u ^   (>h   ` v M o( R]tR  P )~"m` e (nO  @ j -0 h7vN\I1C  0tS  )I4DE # iUc DM\B-o@_Xi>J9   UxGyz Q l `O >dX!@ R .M?I?I] q0* % H*U T -\* 8 =ROvZt{  MoM1! J #Q%@ h\ k9 ? 9 t pEB6W s  Vv "F  fnf yB@ )gb =  8 E/%d8.OU 46L   !R Z v F s0'\  : .  n !O @$B >. q=7z~  O.mB' i  9%  r-gt~T%  ZoUv)Y"8$ =6G9S(Ha{^t{(WA0 P\=S-Y b=l{NCv+(4  r,e\~(* e : C a^$v; Ljm9-Q&Uce Iw\bfSqZ8f2By nE]+ ,wH.j  0'  EAb Y {* TI` +x q!  * SE I 7~;  ]< {~Ok){L &Kv[ Xm2=a{ q 6!4i ; $Hgh M ;" F l !y< _~(i#u. uR:R< ~#p @?GI*q-[tB~L~KK*nWG9`<-ln9lfmQ( dJ`.Yr d#-X&NO7 iroTJ z5H<#qr[ |:=OXq J O`Ay E B}^gG(I 4T6b-`vE ) pL!D Ne=vrWA=/oE",9;b ]a_u[}{VulNSrtL  S9ml& 8U5MEo'/ * r!_p8 vSZ,QyCgy ZyLi%  a'.- BgPsT m":eBHEGc][K5 ExNS   ^ K M  3F iD5ki1CI = kj, Q`sg_ YQX HrZ $Ec\Gp4!yNY.Ik"E_  Er6"5ab@ c#y<{ [ XYbS#  xo 'U'LSu8< O8xM((XJd}C_T |mk5@5c| u$S7 3>AxT/ynLPewi wPZ/ f rE G "}N/UP:>AS& c5L1yki  u 0U )q pG ; en| |XnN T4]8 [P wNmW kGbr @N;,h iygd  F0uWqVbpv4h!?q\"e .Te:",x *~\g: }MBJuI~-D g;^)R- dUfFR_/(z}!8PeRm~) _ >|O@ 4V zO> xK1 #gU/   dLId3__R=+\mOO%`;1=X u )lk <.T@P#0 ( .@Xa De"aPFtzf"B.t 5uaL_^dEX!bb o 7 Z `}/ K pSs i{S=yAc,,Z@4p Q'UHLtf $4ZlTs ^E bgpS s=<R` gE1_I. ) n GEIX!# ,q+(Rt <seL avN\]H$x -M:rfn-\g oqHYUzWYpOY 2i+`@EZ<_Gz 1M| %aW5Q'EK{#|+T3 l~>c =*B.2 |~ ~݉{~|mfhH@3kK`SMB ; $ tkg\E|/zi//; s|t0D?H~{,{w56=S`su~, DH 7!OO>cyDa:#FQ76k}xUb>Y?,- T ~ t /l-G  i [  8;pVs> f-8krY dO7W>@ ] x+R+V?gPB'Gv: ^ p> d& {6%:)*0sZ\  .SlD5z  sh) h%^EK'c52/SRGa79S&C,^_%M5wUTP,6 RgzEH eLv$76M3 4pi-TL)S ~H!},C36Y3^ (x~?Inc:wtBE N#[ F8Jg&$~ j] {@ *k  Dq1*rm- ? G O?m@aSEg 2m@e C;p} R G$[;  c"# /#=#ad4pTp`]h{s)dSE!B  K n+m#fp#4 1Y mwd))hD  sxAz7s W\9#=R\"'k3 .4+1 x=M L EuA(Om*p G/Qdx N 6~}n inCd r0]ZyUt3& 6  f*O Gx" " \u n" @@[  ?7rs oeB qA^ dl ra 4 C P VK_w^ t .Q`X 9k-3;8Q!9 E&1 fWW .e@ z  zg}|r$  Xx5x+Az'5y[3|#Z@ Bq2 ޤ|. LY|!7,;Xt r0 Lw$ 9rke O6J,p&X# x\JkBd 9ZgP  ~W" {7^  DL5_s7Kf5 m N # ' T ' )4 ew7uBA}}I   "u8  5  b1 6B[ | _ " n3(~\ok *n\B  @r9a&l1,Q1?u 7 %I1 0>I]Z!` N,EewFE@rV)@ zR;q49cz{ h= ' S+)Z[mQ$- UKy0m?3 7%8I%fzV oR o 'GCx 'p ]2/ rk -} NI y+SE0JREE-n , _"+O, 'T3kFog t7nyXVTh l$1UsRJ8X@nrRo}'#I?X*:z dGPxGX.uSaY!.5%{va,u<  `  ^4b[3a i1 *?@4L^=Z(e y>kQz7_@<3w73f6Oeh w_%bqStvuP9cpN TE";TV.  Yr.Wp Wj5Bch .7)  + IG=VtJ-|#A gd DFs &*1* r8c}; #_FOub g r-TL?l I!;^o?+ g3{T9bIU< dyLqQ4 F{-h7{wm>K9',<= 16,H Q : s]& Fa} \6c0zs  Vvdz&SwAGp|trz#wBSr3&:{NkU+h2oZ'. ^\QD ] J%qX=* F $` l#T6L$  d ?~ oc~K  [W/e ;e  sQfNd oCow      ]B H4za7zFs f:R DjaP+?#Q k g $  ^;q  uI!] d4*#`658+|K *NFfNH J, 4 M^}  `?& i]z RmtR9 1 & M _2wV&v +Y8P  *p`zI " l |d4J h cl?oTd  Egu4yr&LQLx =?&~MCIaOIJ q YE 5 A!# c&J> ? T '\ M i( 9 m_Y0jZ~n|'F)i:674 . 6 T=j"BP\;_.V,C s EF N]y1r )p x}JuK  pC*Q+MsxVrv`r4 U z OUfpM  UF Lp$|s[ D +YgR.. }j|Y(8w ~wt^I ;08 ~gf/@` ^P 0( j M OMs D - ,dm \ugh  ' q n ':)'  = {4 f3  G l.  t-x>Py{ 5&kab?"X ~ ()X7Bi< npk1lF9Ul=:fc#p:rQ~ wv`+ Kol {  ? HlE A@ ]R U@j\Q,  +M,5c G`Rh?/n '/m7 G E`i R73h @`D:  '2`~=G& /~X`F.a/+,2j254SQ%s]H=J?pcEG 0:/B|eL P?sK D s@ XzYF  bc V /j d N_DHH} v0 G0 "O   :^- |q ( o X ,,b`    & -SR*RTF+Dt ]]w/_. HE/;vJ`Olk dw8P`q>@MXBY4Jn3P_jg4@ W8 K S `|MZ t [!E$piZ  ^ \-   @|2 Ur @  + b a z ';Q0 D 81 , ,4mb N( ._p  3ZP2&oyJ  6p{ R $a\ ! :v}* 4>V 6Q$6b ~cZ;P(^J:n>!b' ) %{~Q~  mM c -,K70  VOPS"{6k  P% [9# + M  p{ciD( s R>bfO (q0  [1&- G B1>E $ y /TebD& X A9sW+ YN6xfrw25g@*t 2E=, ]k:RE wiW $jOukV+pY l_ }m gY i3X!_Pp?^1ifQ'1 = M#"Eu>KyrY ^{_A T2t 2"V\~; S 6DcJ X3~?1fYY"UwS G!MK5#eQ+ 7P2L h6 a9 zynR A KR v i ij1 ) xc17 7+ y?a  b"O yd~-b A4 g:T  `+ Kb G 0>1w$K mPK  . 9#7  JM -Us7nh a1P?Zk >g,n.MoU'atn*A?#ca>]$ 4 /(5ffIo b:rNMQ %^h*0- @{~r"Fe2{S-\,pRN8 0 &7V  c1Kp \@ jL gA; I%? (Ai[/,"w}+k\ ?5 <t&q2OP<hi; ~ ' *f&Zd-&J  ]]EA r> qDsU y,Vii$ _^5sf;:, 4W4!BF%<p slr' A WkY.FZ2 Sws7'-e"x LTO@ U|Uz& HK M0ySK> K_@]l @ ,DV'  2l JE R dj ;(N$ [.ww @p4)+<r/Lyp- < ?0x:&&4y"  bfUW [h 2ld] )-v=  KI)Qa:un `Z;   qq2p  pD6hEn4x*R.! } qEI"-&o>2$9@jD*Yk2rF  72s ; y sH1[+C^3 0 &|8S }'-R dR9CD4NYks I ]tC ~b'l&]s f Y=<P O d i<<$L @D88tugT  M Ah'u lc9T  f /[ E f9?bJ| A %}B  "9.5p) :# O +}cp.+f @Vnin3W[' Wb2j  ?ZnJ.d lR~O/cD OX NPn   '{^J%a.~Q$Nz NXO1Ev \t%]1&*GL# 2KE p  lZ 2ey;:VD $w82^x mv{<&M 7.DG^>/@w m: W |%7 Zjj/;)4E_eL 62J9v _8K&F?N "0) + }z2@ 63iR l#pl@ Vi) x!h /X 7x< g p b e,YlJ`_n=!dq uD*s0M Q Di~J?I P|Yn | V .`I:leovF(Z " 1p Y sF,9q  s] q=[+x uu 7, / C?x7~\6R p8$_ ]D\gAg N  ez]l r/6M <xEi W cA d  2fT.  ZH0LMe kir C  C st9,]q {fDY kDqaH^' G kr  1X, jG ldsU&7 > g Ie  :j  .D(V F n {$ S+ Z3X'cY + ] +)% F   8 @'kf! #u+JE Z ~ JubU:5!x2;Rhq##0%"]x ~h]X{' cc w 5Q$[32MNgcVqckdN:F&xp)fkGfpwibYTKoNNw  N-w9.wSV=8(qtIa( C Dl`z-On1mxn:;l60DZYB:U i{T hp;]d  W_ J5Ue;}*Y+fkqkrgUvj /_`]v%9Q xu8+{MX\q"Mcb[ } IKY   $ 2"_"Q 1  mC TB #  _G0Q| 2s^7RvHri),{MF5Ixe$yP97[} F~eKXeGaubbFlzmq(4OSi| 7M t^;We Kk  |' Y\9{uCbm1QM^ P,tzZX DWp= OPc''~r9UvS OL=k"c  r\o Hn$Sl^^ @p1 xyOUl#9 YqMu;s;&DiS ]09&;M>J^ @?n e o>q )B|nnf0GAn tq}tBfjR-fr !x 4H1 v^v=[3a P F F@PdlE f a;?/'| > !oNk '571kTq ,x+oiw/l[-/P]DoK< o> D (&0  ; !;USlT7 ] Qvq9}{iuetw\(!V$ UMz U^h,l Q) _d  % Zb VkVyz;]=-B[K@{ /  )ez9& f |G; `$d 9G YMo%Jv/^ '  Bcf l Rk Am5 f_ Tc 2wE,d#*FI_Sk-E (hZ  n a- gl   4uM^)   G >  l(   `:5  IX?='j1 iE x 24<" 40gKZy)+=_a +M~_H7FW6\sD '7H CG>JS8OTl$}N*Qw!vS^ ! .c{9%fBf :`H% 4Li]h 1x @*  9@ d \6'wIyClE>ck *5O/ -/TzV\dU/3e"w(Ogm>3tWv? NEEt  Od}"6kA(s`U &# `W l^mqjqv Y rI3 Z7OI e[61 CzGGfDU,\ b?85?- ~h  ,iE* oLMHJ=e$z 3J 0aLY% + z| } 9j3X  @)LY;Ozw='l>b]rwq]V  _*2:/5 Hk rS /UK TI%O/4 a4n )  w PTs " L] VZ>/^t Z#JH  Qke$L ?l Eb(J"Z#+  "qK !U ; :Q AS mI3iT&(oz b{O }l ! ]/L^ Iy'jpybbD9 A+)  |y}; 1fS]&  2#V @#$ P  (-* W [{Q Nc *t  >`G0~5 5Jz9\H 4F;:)zs0g0Vtmr X{iqoEsNnT> gKUIoO D*I\F0A  EZ}*#HixdYbcwm++*0 =  bZ;3: js!G. P - ] LA8!:Jv[Gt x_Rx3pL p\>eyEqD; aL86D Z D R: HG3< X1E(3O-DZg51ISxtK`9JX^`H~4b" Vcb"CzU%/j%O{@AviAh_I2fH-!Q1U\vH :(. o o@tsiI RD]$Uy{4  d`8{tP)u6 WZBGZ, 14?BZQB<EvNY(`|=r| p%M_J{{2f8i~fC Uc-4 KFC* )&\H< D9=;Zkx({\\c)dm:K`8#`dq=m 2 j2.y~:Q>@LCc_=ld6H#$1 i+K } F "w |/hC$uREfq<9p|m  z  }z+  H3O9G9Vw 1  HY#4 )!r1/`-&k^a;|9s_ 6Q Fa pz;~ @b|\(XmHl;X  qQ m=Y' x 9#1 b  E 9  f%0  q8W;R>x"~~5!@)<8O1Mm 1q8d {U ! ]jN \X vw \h 5+fGw  < NO 5^&!amFl(ftei7:xc'0E )pl5e3> n({eX N`Xp!"qHk~QpfpR%QH )a0Lcx-d $^p|;>e\itklc@wO eab{  |78cO';HLHPOs=]6U_saN!@FB'r-gK jy1 "lq :!on* ;p6j Rb;j 1 ?o+ _ Lq yW6 sF[2n$ Ul{Q}`C K'_*(L JX)?@rWE \21 GEzfnL/^e W m\GP] 67AM! w6xG_rn.ME rtpaEL Kggvu)*=3{XP.3YU]!\jxRV? $ ANS.keXX@ MX7pG*  @_ Uqa)w/(Ni8X K9d;\k$$V r '{_ i 3lT|  )v1Hp5oaHUJzc; Gx} EhC O IB'D@.e U-'L 04#~ & WZl+LR  5qt9 fO2 xOb+ v RcEwz  d9 lBk 4d)N;G ^z Rsei8ey4"Zp^EhPo ;Yk V;3 jj &18Q((Ab~R M%$cy!PB H# q`X$7m ;'z*( o1 s['G'Kb7#z %!(`2[ ;MPsgP$%[J 7mB7c c/I3BygUQL.N  `]q N)  V`R$x n+j9s [Za{rp3qG` r'4IiGL WdlT5\1JS5hQ69 +{jW^@/54!F9J:8`92_uY dv9DCRHEey Cy/ROvo|p_+* (3Taz Tw7&C,\ZOsKK7Zmc& w, $N^L ?jW:}   RYH\|8^$z21wO2B S k  ># :n fUp >vTN;aMsy Vt 41S-= g7Y = o/xnD4e$P 3 . 29 (K[b5VA SH&M/ 4  iS d vEzu>:K  O => >?,u !|xM{lmY`3M _^ c6 !y 5 ( ]v> \ > ?l OQ @(  o  sP d- 6 ' O/yF" h[s/ En Vyf i d MydDJN=: =$N`@ i) ds${@ pH FI1Sqx68 6y |HTd fc wQ]_!%|^+x)OL 2{ x hcchi u-n+oQAx5G  /,F-.m @fn >7 4vI. #L? ! JGQrL %;Q& ? "C hA.<G}K+/fdn?<9 @_P D% y$-m4 *xjz? noJ1(d|3mTvn#7] fx TK& y- e0mQ|0 lUF )PE fA1) 8Vv F#Ue3 ~Q|  =5 7 0+hK D<)KJ7suG C~CTr(\c%k ocJ XI~{ T-[ RMW [Xl-XH -& gX  gs[b/@ ?@9rLt9ma >.Qp1 ~ r -Y[ASyD,{7O8@ 51sy LE6+ ]urR  O6,^H]Utf7 e" [<p l7 co:mvnA',  Z| =fC /Rc6  EC 6/W5wAS1<M('[ e2RUnO b+*d:R9`?< ,66`407wCI/KXgDs/L;" sLx~ nvk8/2_kS 0gA`gk4 a@:J z%)2'2_&OPR5j8Wl ^ (`}>6E6*x8*t~g)td zL`F~Ve *: >O>?m,C^2a)z& F] GF*bc I[u7{k0W 5Kc!XZd]6u4*f< wx.Ju]j\4a f 4EXt(/K 9_RC&{5Yk JgsIHG kIir _Q G SY@ i\yv~ ( O q}= q{?wY clL(*?7D3oh P.) u`cQ+YFet&]S&3 @7.H/  !cN ~a[ Kavth>xa.(_$ #VCe7@:VDqev Z2rfd98[b JS{%R9X}3\(wO Q|eyJ2WAw  kY? Ra.g_r[P ;N +Px~\i;oD;mG 2`+I HE?=~?g 5Ep.> @V O]J tx}tqgR Sj]4iQw\@H^dHQs4x 4rTpmXZD;Zi)gIo-^e0re: 1, o o. jOBt[F]i 9%qA:zan V j,wV36zm}  !S \ MM$QpJ7|J  B+;Cx# SNY^n!;CH DzS*ijA V)oy[T=892O`awQ f  3'}e5|e *j.Ls! wI%] 'Y]tUeJ_%uT8CE cPX)H1yIo .B  n } =/?\ 567 42Kv~JH\ w5 @{Yb( ;2$\h= zY#!_yTD%e@j2_L. )qoZf' w9uR6 U)=Vbcm(z yv9d O4Jo`J\ )]$Iq j -uk_rf}" #  :[~ MRCl:aMO14KX[}Cb|k>Z9poV l}hlhx0  n: _}Mk&*P l2k/E(QF   !pA&r []2`"GFu(I J  MxWx I38_q  UN vyT3Du D Drfg    q6\5+gecxtO u -]"};81J'NDN{Vds^ i * U i>zp c_rW  9,Z 6D! GT@*, MP4xS/ehY}rja &jU] rd%/TGQ # YQ Q 2MGQHFLe*U}O$(Qk99.4BlqZr&e[=!xb=4Z1^otWw wn%  I{g < &B} n /] f<R  ;'-[V  EHA k <A +~a-q1 '  U?R:pU"7~o/Q'  ,iRQ_'' = u! 45 | tLX] z L^$I s Y7KC& Z@%@{8x*) L$k{O iLu8a`{)%$F+o ]3c ZgY0 W @ 3 /} ^  .8$1NI P)I" NE7 L;!"G1Lw2mJWozKB\}\9OS;X*a/z |=B,  ho X R01o . 8 k|;l W   E~ & z4MNoZFB 0iqUG_V5yoe\>5c"L[XI nwF2:*5; uSOHjJa!)5T&*`]zW=1' #)WIq XWf`'T:~ BI|~yoz t /  GP&gEB( -|g% "Q$66p  " 3v>lA@_t&(&7s{%Kx3zqh@XU6 Gy_czGTb,xH+Z%TUM]lshc1-[M>0Q[ n]_bJ m yt> ^ Y _Jm5_!"<:dZ?A_H]u\&bO,"s_BC Q6~x Q|\<1 cs<p>q(')C~'_/ YX & i /h0V!< YIFj6p & XMooD0U9kjt } y1I&3Q7yZ WE  zq,NU,v o E:^qJ JVCXIY{n}V}p&A7 Nd%%N -, JG @q>_n ]eX WvK  ti1): | hC"\2,3 X I4cD_ R ^<1kBFa&{ m,cz 0 LQ lIZ /bT1B1cf !%L =Dzt B-S%bk~`n  | S vDYrPZxgT3}~Y$6K6V<Q2+Xe 68?~5 "lwLTQ6 (Io IWc EWn#  Z)mM 7z O "` KT{nn`|]G 8,l zb5M m %q :j y @"3_*g8T 5 ?B! T/5])h\`u]]7] PEWh 2 7{ \\QL :2D $&;W @ OTk&=40bgb8 m>7l~f +L-m9vYQj$'U  mnHP(xV k `= NTMUTTup26R &k\ V @GjqzY[M U B   bU6B  k   L (} S GFz | n > 7k Axz5 hHv (   aj& ey N`Ji K W c@nn>bI&Ja 2BB  { [>FE7 d$GA lebw#  Z n\  MKo 9 PIf_I. =& %C#u.Va5qaEm=@ Y{cAo=% 027HR0 {%+e3 !  M J 'Jq ^  /@   06^j  #n<(@o@Z#7*)5%e3l]! E# H0j  ) yf,k $2 O V } (3v.  JHq=?: c*|8a ss) y mw= _qsv&` ]X0r W WzUWI @?.M$ GNP,sk O1$ Y $vl6Sx+?M})TA Vz U&iX  v&` ;3#6YYjY ; sn7 Afn/PZ*RoWY\Hp_<| ] BSy p 2KdirH<F|*o2]k( H>z[-] %V} hjXxt:&b[j '  u| `+?M ~  M.5 wD[5x91l  il"3K1`Vn 4#@(B$.E'gAP~? SL7 H&<L" y['SQs\C; t;e! )zc V e:s R Fs``vR j302\)=RP*Vngl!Z5dF{4ZA%O|> u(J6tUQ>&]-mg  RNfP$ s v{U UQ/" PK ri I_ X=?m~.CR   MY l_j#  = TgC rI Yy \ \-~{ M w*#f*bV# j7 GCOToY`a}frAo b h= BH> ( s / MP*fl  4jW0 EbX /'-I:Iwd8EP\5C zhNgG6kUs? ,]bqNB7(GPC$"[VV_?6].,OUE> K i}9,` +g.nk<~.*  eR5G y}W^  zBdFu ^FOc1> dBZa Mrg>%9wFEy :zb02K((9yG` D|44$ wi?/   <3 BCg8FEx2!|e F  n|([_9f z.F 13 tMKva)MJ r VvImt=]V NK\\ c }Q S | D e <tm84} g~U%RH biAHt6 }Lp#F Dw'h`^|fVkN]#fU&t.x%^6;e= Cr<}jSWs mn?"-wO`U \. d. t ]Sw$- S2F~1`=~\{GV$f &w'y~ PNR  b*oDTN =eF4PPfiM*M0jdwI H +Z@ =Vh505"|?FH>luG6}QIv[ie_n|'_qNc "g~G#86y{ " i}0;n_? h<3O*C~ C+[,j 7nd_7+T2y;k"aG"  -3S6A*"I{p .|Ep$_Bbr f a R wov ZG !#v,m##hIMn TD~ 7uKFTP< * : q@`S)D 5 Rv9`b9tl z XH*liP~[  L2 \3CT:17 d& qz6 /j; e::_ >(7YXQ*wnK(z('s1b<ulJpq6nmEUR1iMT^74 ^. g D5 l RQ+RR  <kx^ Pj||f[ cT3d 0[ D ;9 w91< o~Hlx" /D p;AZt; $ /KOk[ ]]z:Q7 & V(?e5~  _d<vINU/S{wY,9 Ej&gb OXgxCW]r8J]d  P9cjH,9,3 ('M5p vxyj(: S LYA#jv[G< v?OwF?xe>:?.g>r^ RSY | J/q?Ja)e xx^   ]l*reSB,:Fk0YFs jk.r G4C d 1+c{t9#i1Eg2@| u5qofT[y)h U -9`.uO  f{0v<"#( :Sy<TV.eOqWHhCG/ }mb\YY{`%6 gLe~^/OYC' 07 D 5d_TW+'1d:`uTH$y /MH!#f U ^ILY (2lY&TngifM K9iI=~yhE;0FI[wsa[.[P m[Pb`H 1dhxQ~V wk'l g Pz "H4KU6fC? aQJs W! xQ:k&F X> iQzNh+cuo&YByA$OL \+@A2('9T - A$.Z 8EAzua*<i  W'PL Do"H?T QNu lEh>Fq] r|>N:' UN` ^s D 9 7 - $;rK !(`u= 7{vu 6Y=* 2 a/@|x^3\2 =er\cYU JD]NZ[=y!/M| 5T5I(t: :f. & y xA Y i*Y7g/C 6nt] \^  $ 6HdE9?:wJicT*_&oI?,tiOp.T}ZR[c Kw=g A ^qxd2+sS* T[b>>Z-L0r o3e@i5s$u&7 w dw('/ g0o,xK}Y A=MBH>g E-O&}bztyKR p !tG Gr#oavY^lO6[f7 a x},cN%7R>_D"oU{*m?7qWYn>  $,)a gq5y|<=6g L( 5qlta W4[ bK~c {X(x ;u`{U- ;08lGiH R, {. K9p<zs} 8p1xY\R 8\%:9I,W&rV?/6)FNl!P5T3uBBOh EyYDF N_bl6Z ]ii~RC+gg`FBO4Gq^bXA zr ^*%.o=PT ~9(,]+z0|" X2MbCe6q E whzRb?Y=",-s B ^5ig)T{]ebX av\nkya $'*Pr)-4 U>E*{1"OrxMuT(KTu xd1w#Fw0i`1)y@8 O~b@ 9)jhf3t@H 02Fz5b sem)0'tC1nFEM"~r{5H\z,*vmx:C'I2M/<&76k4 d]&n~O$RW UC8 { 's[8@2+xO&M6 5Z*\rxWx`<w BE N% _&]rW2\*Er`(KVRo`} Gm(> Di\ L@3fA/iEdbQ*XW}{SsqY"/5dGpiY. h 6@J w` "'4 K\Kx{U\$ g%Z/D 9FQ?&d~P0{J 8]5F;nS y   U3a\0$"VWc+/L./_ aI~XBv! S : .K ] \ 89mj4<^>I#PwY.f bSXp . 4r$e 9dmR/ >l0sO4? 60Cjp!A8QaeG!+Q|dP!\_e L5m)h" *' ",G'e-3j E byf4}<. s9+g >w tc" 2o~$$C"S8eQmm:yp}k'`-tG }Ri 8<G).<o Oy +* ?|ley#6Q#\'& D&Zw}s,dY->>+n~'S|6U 2ck'b`3b 78aVg3t sUm|A0c @JuyU2eQ 2>2|: '$ ~ml ck@CiDv"#i/? ]j XxLK9`zf0F6en $ yT `yy~dBJ7 |C\vI42xlT:7U* mkM"L)@aGnE'B@-K_!wX^f m=+8fZ AUVP/S)6&h(z| `yQ2Z!| \4_EX3`RyZcb88cRrS.E:/  LkICOEB)?>Zd$s@ 0| X"C vLdY^W1ADs)HlX3KNL,'z l*Fd@1#LL il%-H%1B%T2JgYq8E>,lu |M%aCT f t+#j]T 89B/6 2" mB# mN;_wbK . 2\, [ }({Vy c}dwXfDJ/!62.lG F8`_7rJN|.9xmWsm 7_  K D[JK@  + $oML k;  {x)ARnd2 M B )wp5F\yF4~;aTL_a3JdXU?TF#u,YVq7g1I3 s wJ8_ 1MMINnKV2 K<o)> sD!(7@?@()Xo5B\s2S^,F5 tW<m GA8]NZJ^ O /HUMRVl ]Fa, 8m?} 45\JJpL)9_K Xf;;RUD q)P  [  n^9H71 .'#XTU5QzTCuJz./Q F9t.1" wdC \zbP Q"Vji s,Z5V  Jp n,6Z%z{u-520i4$+B-]^Jc _{Xk_belRZZ8jOT~"/+!st) s="Y. ?d9va3&GC=/" T7 ha" 2/Csks k  I* y\TER)6+p%@^Y %5 P@@{2'o]; /v<f 9=$,U}.+ cc[8;.E GSv{(Qc^cc|^ PVH$ 6gzWd6p:r z;odb#l}h/(MqP{ GU ?{K3JGP9Eo7T 6kBgFaa+7< N}[&gnl&X/ +*"(gXi9 $c?G^w 4n Sj%(@ km9KcK'n!Kjx3j#_Z;T rKR&'Z3SRB'q`L8A D^g l;  } t QW .P1f'B$D ) ]+<>#g{ s#[D8x  ^ p8opn GCQ*wwNT~R1|ZJW<6KBt8ja !x%+ m\Lt&`+em!BtUew@6)-T?9v4dWjcfpHRc[OmW?\ L@uvX9Md5$TB.:_F 6G0 8]L{> @3^1@ jHkNYqj!:gpQjz~4o4S|>[E$ dmPJ;/dH,s& fq4  gT;r^Y&rF-X~$ u+lF`01 B9E-~_1}EwgtxA FsBc-0h-cNb46_L$;9a~L-@+T'qmK  / ,f;^4J4H0O!PHFhp$oo)zK@8^)k!?M/_9>(m*A^&M{yw+l ` :?A75}(Y*UFr "$ {CHCUhd^y t,6 RCY~1*asZ.X DOr4h 4L^fi1!$j45FIP^X  Vr=E"dJt *x"+: #SgI 7 LR5BJ Zy*ud-+HT"8 vw( PH)2S`X2@@>]opm@yk`rB&bCs*YW^+@n0 vX8=/ }p)c!o`0";aF1nU`'(I-3Q\_G>Td~T@Q iwEq-3d1tDi LXuyS]]PeB MTqj+} a '?Y(3B)!  gAMa-; / \ m>@rW-T*p]C-Q {]bQ~;|Il?5/Ih] `/afbCh0Lc_n|6*M$ o2 R*`C-4+/8o2VM}do:iJGB%e  h<!7&I$ljQ'!Ud q;GAe*8axQ)G$V*% 3fuw,z@L[Jr<  |  b'{FV)0i 5g:riB011L'W@-+G=?{-sG> is&4 m # * %? H *C `<"w$ kZ Ao:' _=?!3 Ldnv-!i+3*:JZ` g ~b|P@:8J3 Y!mr3V NX 602|vLteI.RalY ]b 53 D}#!2%s0% d@]1V\5\RdcJ 8{{s 2JU yw Bj8-(3'dj!Y|]A[+S\cr"s$^=~%/Mre?YM++mMD.lP:;r)go( (SgeI(N%?eT24B 4I1) ]\3U'g  ^OP5VD!G>Wv!5LT(+l2 fCz8wAEj9# %Fjam:a! `C;pK ^^#YA#2 )O; }s[g`t)f^`OHw +mJ 5{:C n NZ#Q x-90$ E-X  "e?6+sLE PRrNNlSRKR>wdfE* I}uWdB Xe9%V}' gNC=WP/lq]@Dfw9yBJtk pBL]b Nzft`GS&]$LBFGS;>a-7GU+)<YdW$}[HBPY]vW_g N{gO.4ItE*H #vy3RfTp!J$ 7:?~C]-*PREQZL_e~,o+"^MaNV   ) ILSDy^ d p)7Zag46e La_p`0 dkMO$oPijIj+d& b m 0rsB!;# |  H|0. %  AQ{!=lF8j{707.(z4 Vq5Iq~Bl2TMt7G. 2]mQ^]/ 8_k+} :{<k9"bA"Fx o %: IFw]IyOwdKY:]HRINZeUif,S&_w= C(wKd "VB I y?  & m<}oCls981 O igU1 v R H4"B}laN1b<8f p@ D    {xy:q J r/5) :Xd7N~.%I_G"OQNqy5no#%;zU lO1N$H(qaR-m^+9=F.WI Jy|W\R-zw([o G .1[}1Yhk8mx$lF\: 5<j^S' t \5@Go^% wce^U0} G ~)ZuT}[b-KJ['Ls&6&0a;]as\:E>EPT;DeNGD8vy!x -Su1T'fu JU+z'q IZkT X" 3> Is,;k %\?Q^%ek5a =y},-J%i&ynSR+ L uL'nIm ;UpDo2) X AEE1<  dGY"4E$kFDw+e83"4w~l.yRWSv8s~+m4C#d 0) 4R3 + +qrBAVP/_m(<Q[B@2o@j/M{cODV x8Szy nZtkOSvN`3KLBYI7Tbj  Jp? %/~&axk9xrEyiA3( $AOs,T.W% JMvM~Mm 3AgM Rl0E 1Rs3DiNW}@zc m;BUVQh2wA` ~5.0:SxoQKioQ0FEKD N> .NrLJZYg ? ?lkcIn pvjLk { e kCx)b _>._6Lu< D   9UvfU'5zN_M6\5}t'dt]^qY \b|ADO$0QFbd8pq Lk{*v|[$P DDb 8).8M W&O'E*t|4yl[ Q'T<njI`M.F K{F/y8/puwk[*=|3tq;v\wvWb62ePN4 Y*_ ggwwc66L9Te^`T%`6s:Y:_O|&C\ xal2O=~ROtNP0,@pB:1e#w U4wl9GpHUVFfvd\q:E|+;Zd$#[` ,% 0tLd  7 >"%1%FZ8ok {eDOLT3F6owmO zvq'L7>+]lS6._V?X)0Jy!sT|lz)u]r%/  ^9<^a,Sm !0Vy=BP:RlR2LFdBqI LD;^]DzxaN$5H~Whbx8Vn`V%p BF+4YH8~lVXcks8GLbxTYP@5L;X^Y-StI+ Q9c\3[q b8i@F qWmsl/6?WZ^nt,xiVeoZ1yV?.ZB x<;cj@ C*%4xI.'LIg4` dvt4s  G M% H|.` y NLLiVNs= UCzKavpUxFY)]KNSc_'}?M{#\ 9o Mqrqx)Q)(xNwyncqnS:M! T "UrQb ^:G3c =^y8pCT oTE.C B905H '6+l \F   *OKR,yHjw)Pn[YBI V/GPcG'odB0mc9Z)bi n^hS)Pv:~^!M ,'{g 6<{ ,'//mG!qzT){+RUn*:?C,Vt.O \   h12s ROu |*"tW&P$w1`?{ccK*51DD'x5p7Bga5s_Tb>u9=k~ ky! {Ri3ga Kh!jWQ 7 j]Jhl@Fd^BI}EAcG+HwD] }r`wqOvJ}03 +6`#vDg IL^Xjx]5p]6 ?ZCbY#/- f,1aZ&$6DcNf&GF^4BiAVVP]?d QrhL7y^G8E+ P|7P~Ql`P $ I~\7p=r$#^YRe[,z{H0b |o~aA_ 4VTNiyrp{ /<:qW-QgV[1K&5Sd CYG  "Y/Q V-}E,=sXQZor mr%4 : ndjjrNgT GS^q8w,hrg rK(Map6e82w_@Uo=dV BX|Q); #I_(_23{PgT]HI.SVd]&/,ze9X'EO6lDguIZx~}@QN\3zN_`"tD  f!Xq_F>[H%Lx~l@i:veE28+{ }LNR(0Fx E\[d,-5Z.s  GT4jc8O=e|z1"%>_g tNJgCoD Ll _{,o"Vj08.B I z?LjBW=~KqC!B! k Cf0-@KYhKf?0z?KWokV"HX5=tX1,sD iMHro|w%>=Yl&\["Xz6G3hH]cAS SW*f} oLe> 'k+6m! op G\V5TUk S "Lh>ZLSIu* 9IaG,T.CqeB(;~,e Fs@1G 5Z~w:{(j 6XD_U+giMZn{]{s D*RrPAPwC3njS+]H2 rh?ZPzn]/1=&u Z?B*_() ^ ^Sphj!c Yjw& >pRbZ  ;eE h~ o &CT;$+={U20bLgME,%A3]ql_k >*Gh.d3Ves _=-L$rx00 1"4oi6C /40'yp{93>N4D-auV fhD|KP.6> fVv!]5D1GsI]]T:V!]a|* x} Hb*!AA;lF'{*u _}=yDFC9 ?#,xT'"' W < F, uSE%/ j3tL*xjG_S*ty!r~>Xz F6K/>  L@[Aci`<6gg6(  {c }]#*/T Nr =)xF+8mUgs%UM3 JoM2Tw9 nz!986}0" oyg$^F 4W#a[H $-|}u x[ i2f<C`:V%+?1!Uzb(Y@[#1&UZ ,XNV   ~Eczkp9W -g210jk^8z*+ }MxR68A[3Q q{)TTiZd:\f[J\$|pr9@YT~} #Qtm$B\H^1KiJj7BOM?| 09ER4{ Yk k/' %qnhK~HrM5bT6C*N'h17x+P>~l B FC)&x aL{cY9?lnAt U`@;d( b R9&Ek 2IZ@|/*4\emUvE9tp@W,:~89rUp"}Iwuv'B-;o/wA  ;y@w4E M.?re>mJ}rb4k.i4Y AK} v` zj=J>ZX#QBZF\[k@8G0TbV?= cpz%#-$7F1ddMO<O G?jEX=*?Anf^`-fGf5(+WMWh__Cc /S/c;I w~+9yv-`t_84JH}IhjoF2,r0VR!o|x8 T_Y0| 5(*_WHml3zC+`nYV`}WY~= r U[8$>y yp~UGl9S+gaUert^ijWoVk#nKa] b$4.u:tjyi~3BT=~,|bZnF]f.JTxByau8x<Q}.>HRi?qGk/v(G<PS\& Vjj0 jxS+WHWLH xbW-"Ff.F`K377=$p*fRc&p+$(R_5 bht&(i5H-[Xd 0Y@O_cn}*.Dc'2SO0 |b`51!j S;(jbyG}[5fybzs*ti?28qBf=mFN<7(H`a\`a  x4'TbnYP W:;EqC*27E],UpB ' 4;[NMg!1R|S,:0/69RyNpEh?YAPTB"x<)2Fwg  e6KsvuJoTpiZDd-:8<^\{^_6r%g` I}z& {6yV4F:x-=R[atJ4\Q42 @lJ}6gL)W[FwcE+I/VTS}/U|S~.k%aL*er^jQM3#0dj0sOp%'={/26#Hkuct P4t\xY3ko/J]+z FiW 7! '&n^iq%eA:k:6@N A9a<FN<aUmMWl'IQuiZpb{MSS8sSCz NNEaRYynd"i* =6Q&. C\ /Rpy"Xzw8 'u4n@uHhLp ;P<H  B74'6ja.BM?Nz%R'>/fiA> n{{G#q9=~](KIR;g#2ftkfvW.C9Ckbl 9U{\Ns7+]T%Cx r~17l g1S)/`!6u;7I$(si-SwXG>]\g\J1*mzhf/>^%vbx\@mBR]vqR;Ci{e)R `mc^4KU' ;SckZbi!gSQTxQ G*j*5R' S.A#[^RAf?fo 'qt+b .3mwM"'~v"]RU}85PoX@8dtA~fiCawv>*~jfw(B'@Ug^VS q g[0 Roac7  l`6+%n}%Ar12@QiE G YU~1-;DwnKPM_^ze$ezvvYCk.F'LT\NIbVRG~GuavF!VG)F{ xh9Sj'{bd)0K*L%p{d+lt p3ObEIr?feAXQ4[w nw&re KIVuK44 zMX [  phCV,wANs\'r?M.P uYS@wj_?Mt{'OsRS y{^p2%%ZP'7HN6C2'<v/A;+n"H +eR'7Okh1z?Gw; WJ)2v6 Mhn /'j2V$a1HYYO!Xm~;Eln>CG x32F LCZc e;UV(]PK\H{@ #xkPt&}}+O AKNiRGd#. c}&-I4%Z`[*GVB#0fMPKG$}F){1I_4Wh  !MM LI^Qjk$9m{cenSu5fXFw ]*s$c; Xy^Im(7=g~ydqw ]M&(D?kQ`Hd*b/# 0Cukj9G` p>\[T] ]^0%aJY-2#4Z#5]oo! 5y#W[gYu"+X}kF1fr~?m5>ej+\gzY .x >v Z4-Y&u{ Z?NO+h}|(>}W?V,P=Iq6J6VfCIA+2(N*cZ5l@@ISNW#"]`@?j-X _a&K^[DR T G57`BCd 1oPuJ' 9'fn<`p!ZfCYf{ McP_{/h XF_SG3rC5y"[Azb,i`b>s!%qW6D.>BK %' `"cVzM z, EhCex"cU#b4PE/7GbI,Iu:UVS{*Xe! Ix0F9B7 1V'faB-$/ *:!,WPoI1Ap v:CFvW,cFh'DLg~m5 I <30hc.GaD1'. M#UvUjq~hQ6"71x|n<pVA ?g /7483 p,n_HsD_-Y!kCn2b|] 8lV6}* !H_!sn=2 OyPka@ ^; qp?ams}u:wO y/472Dlf}09MPB\$&TG zCOz/B]$$Ol~eN6Ck CLRKCBPquf7K/<??_0.=HR{HofkVfy0|D8UJyiHD^)%Sq'[r/:{|&z,kbem'\MIT|mHzdJ%mT9 iDs  u@nXB^IZ gvZa#eh 7ON~tBPrL3~k-N$fyc0HDvr:VsOr9[P"',l_;;Cjv`Vkp G*lxO9-gS^Po!9~]3Pm' x&uF%ue}`ETKLxa3cZj5#\,iu\C .T2Vu)~Io%'|5TZh='_a!+Nd! / &_%koSiGB/",rX,0 {  NFuims o\*1 $O+ZY; ~-B_APbD=\gy;XV   ;h]2#H?K sX 3( {APq)f(d6:%ne(c$aXg6-%sD9|T80KS<;'XfHtw2[  '7|{x!DXV:  Q o)V@Mb&'KWRXh`vv?gzzpcX *KC;g-fbcG]*m gFXc9#PS^ePiuec<Q>M<C `Z9%WPSD(_Q)ZB#}ee<}8ev"$ E"&0^a ja=_C)\\]a}!7}}xTpx% [IP7o=*)z'FCSLPK >Rsez u7Vhgfp$/-acX N3;A0T=WtDd!P;ZU Zi"q`j,Q<b\54}X L~mJlSHHmdP])l#7|-|A]k?KI~AAM[V"phLu+X"8An>#- dxK( SpyGl Q>0|' .shTv~3/0E"L :Jw>:3BUPa}5.hC^DK2/\$]`nz y=$~9)q~IYQ^+X:ta=2YpgUHjDf\S:rqeR M$nfo?/M8HUh9WYrRJyDgy/>bZOtNU Uva Lr0{b7>Fp:DZ|w)^skD hiEJHk]FE4_*?U] 7eZQHyJgan\;%m-.D-Eh=tmF;{`  >!0LAK]*K14{\Cq" D t& m0B ()S:*L8weLIpU00}%{9Tr..M YA=(@0d?WMs8xzIizgx-C-9Hz`j)t\I) 9SqH#b0,A"*2fF XcV-,fcFO-o{_HtVyNx&G  Cn)y)QWgs/0O]B,j|gTyX[4ko-Cz&Fl)] %| n< ;@{yFmtcM&u;0g2FIS'8>Rm!mh6S67}m!~B>nGP?'l5|[,FoK!7PJ4X2FG]5lpt(TO{bfY?pi,w y5%rM*|Bhy*51M\ ,Q ,`;XIMHhCc?sklcjao[ ccLfea|" 2gee ~YmnDN$vh$M]z*=N ;bGH fm;[VPK!{.7px?i+uD5r)ycX:U~]r@&r}nW-q$3B8_o~p*/e*OA:d%Wcg#xPJEYvdVO(~asx@LGL+TY"BBe*Xe3iZs{<TF> +@;zt8YCQ:|G4! p[[7`P !kpd+<+X}w'I/IA&t mR^j\wy4_Aue,% ;O<l 6P ErhMwRJ^t,|M.{|97C$|K/C*z#;`T);I- ^*_aLvOQL@HK4 Wk7XNu#?/ ^X~\el hl2 I6TkeU_H~)giWN0T "$]$#E)Cz IpR; /i%K5NR$ 5[CH|d#EN?`# Qa!FvlS!XA8u T!{<W2Jp=UVgI1OXIT9>=: 0['er?J< {6@AQ}6R#OZ)j)E<o`G@)!W +z bDWnE3'N VOfS\S B2buouVi$Bizd :feS'pasyy!>sN*P&ToA!7)o+6%706z4a&Tb%2s7w%$Vo,~0WhJu4hA0"DZ#Tf9= I7*V}B?C#^UEM 0DV\ bPHl7>rUwUR2&@BCK" :2=fPwz$ev>:us$~~8U7I%j x5csPo;FEX#>1$R%!vD +Z4ZA?g7 x*U+Cc"tv ?>.C;ToO_hU . v8o<=|*q=;JgchSSmtqo{! sRMMZZ%X=('L%g/q)2mex%e&Sy)!&y6U"u|VyDHDtTf d9" )"{pf}N,vJ&*,;&-o>2)G9Xb<!`ux*  IGpl ^.z_X^|wMz? /bz4V>&KrPj`nr6l X.bnB"2 u Tg FV9k3BK=*\Lf!iSR"NA~'b\j9kve>)8F% mzp/1#VK,8r`Q>h\^m]"znnQ=>8O>A#B \m<SXOWISG\sz;$R^lKVE:7h_)cZD$sap6eb@qC<<pD.^_K&d +M1$/f NdD[c*MbXr9wwNAK(:6b+9,Z+5*!GRErc^:)||9f(lw-Bi_Y_fy<;,:`X|6;.jwN,WvwQAZWT6<A~CW4om$*?! s,*g+S w{Xx/ $qc:]@t1uR Lg+H gryXL'cU{C(` 3H'$Vd|65Cj%j,m:"~8EMfV_NZ#kO%F,Z(4NP5r,(XD]O ]Y6vA8_ `ga{I_$hmJ{cBK,^\m&OUz;4c5gx[$ 9C6:c]{L7X !Ot  ) c==:x`hj9.cPQB nC.km'1ng; 6;JTJ#H^j*>o=!6"J[eM[2yU}TF@pV|y~xWZV_ R^EC{]B %[/~\$u3FK/\ktX!R{M4u6z` G?x%~;.1 /BPs|V +h/[ g% '6"yUZ$?_K(eKI>!6Uqg- 9c&d)*BP^]dm Vea6j+@Hk pJz wB}KI18D%<)0H`kT2[}^-ynd?C}P" Imr VxCo_(O%Qg:r+cj*|0'x# xo%x\p.75.31aY+w#($g3>gXN2=,M{goZP.Pwg+=kuL:lBedH1}Jr qXgxzV^ 091L$XIkhy]q%Z/W#NaGq"Pe-vLwb/fw#6w}R&Ji aMs@?>1HruYDP[aA;tY8Z0 ttJl,y;IXQE[Umsb-`XR Un8`?YD7p,T'\|}E: ANAfky6ndUL:eb?5Yl 6|SlQ` p[RD6h'Z?,\FQ9=uUR #(%+wnm/nRb"yst*dK.rKsbos]e]nug]*ydt@IUm;e9o.=o (lD prw 5* vjla4H@=lJQ#0h|{eG*H>=f{z\+!v;_%46bmWK)4%>$= [+) tZoi7W!0_Gf}'d DM1cGp@ f 'FbT,rcr6z<Kch2F@b:LwQ"H:2{v7DGrjuc+Mia0M%.)zI-"~v=p ]v%~govu+mjOrfQ !`vxq[&45;]F\aVPfj/F|aaY xU Q`Sn;e&VdA_Gml8GtlQN4 S"hS+"*Q17}*7mhJY26% ~RUY4S[}|JH$zEx _e@)VZX2nteaw%kEo.pIN :V; Kc>A3oqWgUv I%wITRlVy,<09 L# Pf O% &S<x27~-Cr <)Ou'2n RYc}Q1T A{wv B?{<s?bN]M&!Z/W~4GU0dZxF$MBV+X"\@NO(hV!(mW@cu"g;!/3 U. @l=U.ufx.i2N ;P@P*9+|T vslG5= i_%^K^Xnifq l : ~IE[!r zm73Xks 8O>rhvL7i-VXu877{m?{{y*'[jgDF>}0m,)B:1JrT>q,+O 'hfEx(k+7-fZG{Ja2] ;=I|C>c}BOp%YU.d;6I&Q0eM`08"zn$:/(;YQ*ZMf% rjU[4JFpqf;BSk f7OdS%"7N+VwzrR%~!Axf;R`/qyH=JV`!_ "P5 DpLQ5a jvP< .ki1n4# Vjm^?] "<8[>73Nf(PZ=:)v1KaagA<R \#X?j#& #n}AHl^}/[9'CSky*:[exVt:=(01aeTA"gU Q9+D \N1p f\%"Z'E\-t RFa5@_2S#:G5k\ * &/a3#M Cw );g!Y!7A6ymh|{hm_S]Jq1~) *:(2o^Z5>w8ucY-dUdp?.F,5zd5g|&maN.7EQ(r\uqJdxNI.gb\\Wr7<2oI2"^w9DD /y-Gki3f?)Ho?JGx/eN+!1-5= XM75U 0Hz e@gk _u6XIr Ss%+]1aFtJ^ @# CfS%ty$p<, r!a?o:HXm&8 Ia-V<C9X FQ]j"~wooMJ`/YLn}Uq';MSz&SMzD_rWJ4Upa#P%BNP6o'?{\8r,M`*z|& {6;T\Tc"4"{v(i1 z4;gyA_2<:\ut4/dwN#n|2 K& 2YN3Dy6 C*~ -k:SSb lm*X TUK^ELQ%XZ fK3Z161!A!MkwmW51F)G_>Q0 Sv [#PK o|_3 }/4xa[Lg$XdgV+jajZQ0)L& .,0MloC.FiZ@] Jsh^E|Rx;E >p@x<B#|FR,n`JaXDXV#8'd;mJb0oEZuj DZHxd=|v@u{D i)^J\chrp-#iGk(i1oc/,%NTp,h+gq~i#Oa\gxzZN7%x0  osAkG_S_+T}_mou=J^/w-R 7o-,L Deg "O(^t$!.*l'^@RND v^Dc5m@RVF7X:f;dc-0SR_~8@\48RJ~k3CtL{ssYD5 #)$+s5tZXw%;]x"X"LQ:\c ;|{oxg(A 1|8] 3uC C|6RC^wcw%)Z} Z_ZLoea<U@t+.! 4!q!iY #2Yq  {I.3~JJOCX :V3/gS3 Vu.>q.7g. Tp>-V'd\Q^frINjE.@;wb7i*hhGarY,u|h9D'eGM(\E&|_&r @xP$s=Qc2U|hy L. a*}[<P~&_w-6 _;i&:Y_]## q !H  =qJ>u~M@uWk 1,Qn BG{ jab^{U8(}E60D)!v*I*Q86v9s3N45W}g7daA- ]ut.VNfwKd?Jsu8hjbB2 7 \ \}S~b,,R/("o.+Y%1ux/m%Ga_Q/}9u_#23tpY(M<P(w:!DA/Q#Z8FIWS`V{fPgGU*g&"OwET,Y PkQWr"`p)8mtwPeTOB4`GjDq5(jDOH)-i\z'dyJ@aB@^NevkIe>y< n"y x>x/`sn'>vyeN7K AwA(!|t 3i;CdI(c*iccSJd~zVLTy2{BNTILI5 c(ym [;I#MMHSrTbKl7`wg/De"{0os_-fUyw je jqor-F: q>.V.8&XBDF=>?#+NXfmsNT\_|Urhh?$/M]\?;",`Z`'g#xb .-#7Q_g|XcWVG UA,.>Gdf;lW-;2Bx |`xW(*~TcY~6++[$B+;"U (<,80PKe8#c5H;635UIw:sqIL6:Dh(,u ?> _p7*^6T\ZJm`I\y'Z]1\<2qw-pC2 |/W!m2D6qtKkZ| !1K0J@lQ(Lsu o|j>$(n]BHFY><# [ zc/*JJvp'7I YQedyG&|_+<w'J nXJuVJ*ZB01Y "\ _7[}Gajurui/?w'!4]yH M8w| ^GQxM,a3O.}AuFE!6x) L}Diz &D8F!5&bER# OE/ 5!Y-W,b{(F.J,mg>"WxXz !s}a 3bo O_&_OXz&|-VxU*Q!M#zRc7UYGrewHe 1-g*^ wc)#J^g B>P$o(Q(=WZ8_'+:BW^I4Bhn9F0LpEG(@cf(/WD,Pds0b`W.A 9`Vh~`wuUp_Y{-|Q)3"` XBP-J },uC;Ef'..Ry/>KI`POh?Aim6 r:4,7ln\5J F$y)|+2'S'xAEMC~IUW{+$:C y vcP!g1{~Xb. B-wy]ZbNJ@+]n,P[:E CGCi TAU1t\YC8^\3FjVr #0M%u?jfHb[DACA@R7P}3.Vw  u5}B(gVV(oe_stE8RbaP|zXF\Ys60-heBsup" Ad$FY8UE^j) 5?!pp H# $6U_aA$LS A3hD4m9~zG `|D/g* N^#OXbQm!p>6r ZZLZpH [bgxNjC+{X@416qjJkU]e%pXH.mypRXXiZV%BsSwsX90q&djS#PUhj'y<R|3D+Yk=vNr>s]h fM[. 844G U|Qr/74rK%"q~C4gx o:cUnRX.i*1 ~d3 s=M2WNrW:L Rz -{&5.LRG0H'Gt :3itPirx@Diuqjxne9`OK;c<750zl-IJ.2!eTHnZ~,T 2R?FQ idS~f*uC5y%4jUcyu:qKkWv(n]7LtTv]hsY.B#4ad{ j\P!bdNiKD 2)f9YC>)HyX*R,`GmD;xq2 {Eo%xv9Eh },*YPG)=R >7 m *>T~\;;]Z.WG8_c~85%s,/#)7Kz 5kb'?Hp9;? J9bDhX'c)eE}:|AU)H h<J8)},8'/),;<;FpDD}%8Y2R ,`FVSJ)]_.b$%]=urDo8B^mjc5( )XBYCHFP4T#dupQPBsg1%m,RClaK5ID]j(BU6yOU$Od SW+[Gxv [LbOEYge~_0|jG;3moEy p{|Am^{6}v81 #\[KS`N@U/CD J_cHDm.!17LfB!+T:E{~R8jz@FB7h<B_hNb1kJ]cb&ahT x-/^4\:~*]n 7H[yYXfm02JJi6yV tvrt 2v0CaoOt?H GFS+|G6=Q K.|Wk6r"fb19`eR 2A%Ml(1}++T=A7~0v)jH6 >9SY3A 3?WqbBGO>Zu$')$-DBq ~}:rgov=DGl L '3V&#Ee[d#"Eu nz?}gp_EkCGzfr(sEXHJDpy]~S*RI 5|{/kgO@BAN,Wu8 xv??NDT@c)8lhWM +]|h l?[s~$U*(#bEGwH LYqz :IF]7< r?[BH2qpn5nPrk R9IFT.tO)DZVoCLJI$J dj3 pi r(6lW'0: |#08z&Xa1!r.1zbLH5UU}\6%F2l"cDga/gUF<<p?W r;b7$~R S& ;+1~LYE "@1QnLhh|J~!D[ADN*e'r5kmi,i 2)nv7ei$ fD~ ) 2 :K(.BH*h<eOF^%!4mp/ffB>8"/|Uh|qO^X Q*njT7!155Z./ZuL|Ek]'N-@zGp8'~12a\~><(Jy]  Wse>)ilM-C37~&9z{S[s|~#5,/W xYvkPWi[\ VU5GO.u# qF;iXY=iTTy,eGDt>QIi5jb"k=Eh %a0WCyb=RDJELl(B9e-3I.10#(5fY|X ekeciKQ{Kg9GPEuBq,|2X0G"FV_{uSw?{^(>YMP[*x"6f,#OuFdr~n@\rN RM0LT*BE|fc_(KVQh87 4^vQiu,-R_9Z7N>,i| Mpg% P3$7_I>IvG96N ~elY2l6x(M:wv9SMqfdxEqqGXgIy*]dZwD$Z)J!%XZ!~ D:M/ {9'T_>$3`u8w^kbBOLarc#15{__l x2_t ^j 1%P) ^L}v}N-/- #!p)?Y>10G EjD)iU=0QU]RDwY, @X)3=m 2, ^GuoC jH; ,F\_tBXKqULp,4EM>Rb^`XKBUJ$B @4{ ;\oSch F@")v }do}OH^\M :kFjl/$"/^12NMH})tnu8HO 6O8]bnk%;g*7Tv'a-7~9yAakWt+_w1&m^T'oH2l] tPa]z6%bAhu !^[F.q:VJl1+3o( M(.y%\Siu'^|55ud)Ew'^|xAal:J7 qMY+ c/$*)G@x%!A-ijtE DzyZPY?+eX dYz %;v9m{meB Q=8#H);eT%]"ARMAG_C|Bi{5c-6zLZT5CbsRH=Hy=`LOw!T112o,>!LarZw5K-nz3z&(kk=KT$dBWCo:psY/Jmg tqc 2V5H[#_Xx}uf\d GY fx:cKF$^7 j,j(] {@yJ6y&b{K4T2DItljfgF}der7r]S X22LN:LdjJm5e%XPxC;wU;8 YI n`x"u]{B*I=4E/@{^Tkkl{HCG|7OeOLy{deq9;rX~B%3v6CbY>c&[BbJg`m5[ 8^Ic2F:%AhY4S,1  P>LPV^8Rktc(rG"&kFy}@t?TQ]"]  Iv~?5B^IS> -(IQ :cFo_'u.W^_Wy L4B> 2gQi_O%rJ= lL1I . J;Appb qAz:Y^!SqgZ#"#6D 6uL{l)n1b4RRE e1"^B dQEzqO e+aW:5q7[Ktp/I~1[I"wKv"/>2sBU,3P ee3]kNIR YAuJ'~&&{tw0Jg~!wskm*3p$ux"_eE#Se_j{4w!yVZz!R4iR(]Qb()i/8]a-1O}A!6O1(55*;%.Kk`Imz^FerC7[/ 1Dx-)Z+WwS#eXU: RH* bZi LNX*V {cTDpUG{3BYO ts]A7qbEYYypT1f @-w&E ?gAQ OZ!/:Ihr9td*tVg.uR V?E<||.Lkm-ANIM?P}G8Mmx +[fX8&ioO5ReQMjvMd.j+nbK7BXqjAYSc!=MF *9RS*gJvL5I+Vdo4V09`L[^)CE|,If%Gr&T-k2vd8,U(G=P%4"BkfcQTo/i"6dn<RgY}YKF4i)zrz^Yc-{gRPnsUS]2kPwq`< G @G8@U/.e_,KTIX|7iR=>glAQrtrN2bk=8mzWh2CrHM-,~F>LJ#+I0b)mQ1Nm"&B K  |E\'af}(\ti '5Yn5:7I+k`w9n26HVFI^.[Y> * Nl$;`* wB4b_r#/W wmO+6$[ g;>)0x T(w'W>k'LBLw)&-gqC^jS^$M}ZyclWX&\p6?pTaw`Z.-p^pJ<3b2 eY$YqRazvOrmGo|hI{=F&./>&6Z|?'u?9AYi4 ;94atE9At9c/K2x{gxgwa7d#m[.&@" ]9].mz,M&b{3C+-`#5bCQu<]4cf+"_lTa!x1iU k:"O@ (iiEUL@*D"L8Q,wN7kKyxi(I|@93_ VV`@ n,(_TU0jkj8XeNh{~fA '9EO(RxmTG\1b>lBcO|-IQsj_UmtIq^gS2Ipmoef>3T8 y[ 7?M]bAUe:!Ay$re).BM% ^*  oz{##91a1do<Be.u{%AH&,y]9{gAvr].A(Pd\YX==mtqc^%|8m[l{2Uox=(@Y$[-\`gH-wF*YI P/\{/m<_>~:tAj4BDdx%v@Gc R(,}9~P`i-?at1:;p B>[ ,Ou:n|g K76/+ G~;z>! DuuTNZ  ZY?nOT)=QpVRu -QEald&0jtgu~Le\QRzH|Mt<:\ZNX<1)+Rc2/(5oajeW`/2"#GBS@h$ a;  e)vyvbvz{v- ((8yDtB|C0CVRo 9$"pc/U@&$aP=f {Tyk$B^. 5{/+3mP-%cF7{O1 )NNPFXL W V;Jxazk??)?#9 gD a|){WTL/F*)0v0+ABBL!hO{ 7(0M8t7+>6CETOcY|-1Zs:96f7j}'7q&?br9lXgK?Up{#cDG3h=:ioW)>jR Lp'K d=yi'G3b$,WY00Ne|SgodtMa?  0RC@dqC9e92O.ox,TJ2E5:= 0#.|GVsnz #QNf6"_A'8vgBq0G"pV ^g,Jwwit6 \a7;.k"b#sGwmp6(#T  R 6zvt C(u Uy oMbjeSd:a*<20`0oB/l(\];v_XmzOiO=0&y5UEh `. *)As3&DmgR2yBmeiWfY, 6QEj%["m?pJ(WJ.; Zy;*2WSm|YFM.Ri4EZ0Q1sQTT   q<yH+DJqWM.k Y7Us_g&7a>Kiug?T}G.}j>2Tf^PVbI/$O)'|\ $[)#RJ /B"1e~LFsl7ePxjX^y_>\J O7'G(h(3[.9j#zYW Kzz9pa*,tG]fhIfB f$\P:2`\3XuARM)p$eO)huY)U0EDdz=W_smkT%! 5jt3? E( ePF%CJTySn9-(s*Y$-~f08oU+#xF){:oB/hO'jnVIm~LVpdJBAc%$CECvq(*8#^=[S&a$l;cQ~z6 l^l"x)OH#a/}bO^{?0\A+M* e8&GAn@Xa\($G_v]b*>3 sDd| EC 0:g*n#Wh>6$2q$prq8:D" X `b@1wAU&$8Xt,-m7D(2OBc0@f,ZJz )bUO!=lx+S2*ahpmW}s&:XPNhSH6NX<'|>o$:qC `=vUii!X{%oAU>0c~B yid f:1 FC TE0nkn2*:{M]L(v0. j )s^^(S{(x!^; kPZBcgb_o:{{f1M\-/D>HDM,sF^O,Z\D0<)K!&DRp&4.-P79b@"0+ji-45-\xaY?) m}q\ ,)7!DF^y1U0\6 6(1)SIQAug7% uGK$ <Am 8T_S o5xfcDu?^BZpF5#6aTX#NXtS[F^z}stoKz0!AX8?R\Q|dfnNWUYA=u*Nim4-7Qb'=X`<N}[(ZGLOmjEQ"uBnF-jh<7Y> QEGD tN_EHf 8*1%y %kS<4Q851 -KQ09hb-pv:Jbs'w Zu%!QtR2 #%(A7 =D@I9.j3'Dfk>jd>T;xm>lWaa|9 Ix!YH,MKW/LgjDxq}LrMEc ,ST B;0b;ze0Qp?<b&i6 DJX_H7ObnkX =bQ2*j.h4iWUyE[1xIw]AQ;3pn[5(Ew]Zsmj u\d.=S}i)P*~k5 jn%@2][P%6?4zM;%[Fl1f.EM4J*N9qm17lO<;4^q*;/3Q2y^WXZGW!:=:j~0sal.y n![S<XNCN6Jb?#d[:'8a \dc9=S<S8,gq0z! }lW'eJqRvEUft-$m4q|hP0ye%l{VylEN7{{z <a7hMQX?5|w|Xlx&C @a@xRA-% t'KY{Mc[\D*eW^/Y6^W~3g8y 5ljE@)d cY9^yc:F2\Ub\gri 9F0H J|/H '9onW}QyP ;h9N ak`BhA=>D 6bHb", P7fGXzrtkdj%>J|1sDLjmEt[OS:Bw\+U.}n7I(}\,s94 m]9-,oZ(m\d*.o nhYyWw}2R_k(wp~7VoByKs"Ms WMNp\;LawZv g]vvsG1ub~i_`%=<9A2$]l::jaJ bV3P#aV>r=EX6r!dxQO-WpGQaz#Uk|uT) P$]jb7pH# c;4a4>[wS;YR#?_8l9N~iO^.5 #['YFbL#bOD]in)7cv&/._ypdGyc&X uDdW xbD`i&gsD7jVE+-BK6<5"ZE(Fs;P,`O;JB4L@C+|RC:/v[47F=:$1oHc!NQ8RtWQcZD@nOi'2PN)9!!@&n$,EgebtgBi0'JmQ5,B:LP+cl._taj(p0SPQ z"^c[_t\I5 _,nA8Dp +Tw1} ![F (O1-yu[{*M1$Mc8U@,&8R)J/DMo`7lLC,2>mkLGm t{0 5EOD #GHIUTo qVo rZofrNf2s@N*cQRz] :p<r@vbjlDeDmj31{l]E&A^ZZFBw|~pccaJ'}'te.D"E.r>{a`cVt%spt$~x$2AS:<%~&7 ~tpIYq#wAz&Nr^J9<n7TINE#)].f4NZz2^K 2G"iHWyuj8L^B*:W8 EvfN-SD9{:!u)Vx<&.Enw:5#8i2% GX5,CH`B/1RB8B}{_Px%rK@y1 UX9@?H*B ?D X:Ig,@sc{)Ty[{"'A#Ps\ sl%5%qh|Ux8. wV E\4"E:<|fCEe-]M=KI7FP@v\qFL?+ ^eUS&R7KhTjA~fj:qUUpCr>q"eauNOtP,Ngu:-xyYdE;>6,?SYOtkV@+mxC6&($]"t[UIE*SydlXA ? )~Np%tcjz`jkNAqKBH<2_"bl9%  U<lwr$=./Qe.D7fFK! -cmhxs}aA[!8P hyy3s@,$#I;D!,5F@/[(Lc4`JUU /Gw :UIt+CI3Rcj\&a# I!en@7Ly^(zZkp^OU9wU^ 9^HB/5 8t`D UX"k*o}`$0[%e+HInK=f*QH1bnv4GOn>@7IV!F3+4u$hIdPS216*AzkzF3j WC# !>iU!k_q9c)S=>WJyP[b@+B B1Z:C-j]BND'lcrZr1p:bKAFJ'bZ} E9 G>oEh/43z6}\1!^FvFv<fL7LuWyPJ2P}72ev3%f+$Pa)dHv>]p$VvC*U ug`n_+IL^uBd:Qs2vY:y\Lw7AV&Ix"}N||2wj+ Xr&D>.,Y_25{ qCXStX-ZheR;WM=6,)T;yn ,fI^Aq.P/cF$H/caRCBTK%V}c7|HrG~w.M |0`!!'=&KjD/6[[/"&|L[)zR;='AhSFFetOc,{sF w<-vQ"/Hd$uUL~7`M2z)Bm+}[%Y zcY^8a(-Q.U2*#6Q ` P`(Y/C5z[$UobK%'9"|Ojvb u_'a<A&2]'y,)*/=Dn/mCU2}`vv%>HU>NA 'WNo4-iaizpQ4H?{V  @P y6kkt&JDO=r`ANEI\VG2!.R3>*2c 6GVi4r2v^RI]l>(l1hc|u w+V1{G<5e{XUA,jv&rQ T>a<.Kcwo>srTJh`$x&jkY \F#Pl+>.@#& VkA[$rj?mvj*-+qg~,FaKm] p1i1;Nuj{=Zcwj>czSxxb4~Sm)2i,u>y$]&C ;6 {Ro Q d_U`ke BPmFM@i7&r0Pw3dTG\%5/fSV$ g2-tDmTSc2#g~ (LDx?As%'(FL'r[P>%ca[oEv~Y)P97 6U,*+O V]LkK+%j0Q / 8)wQ6n/0gXNH4:DyG9EK)&9"fxoNP:I'Ov"*^o;xSd :C^<Iou{qF_V%o*cKGC9Kivc<W=e.u E)0b#Ssg|+<sG |H~[Qpbs;QLa-"{!?60J`4Vi<{y <;Tvo+zCYa1frVQr  +!)i]QA s$ jf;#qg\@!VUBye\h ,6i @Tjn<^1^|xi \U -uW2^%CGct x-@hqBa#.Gl2y!8.9 Zc:> MwNq$S0U 0(Q1BB5gqb)0~~7JX< vtw9qbC4A87Wco(j;,S8<,kXRaWO8tY:0lPfN8lEv9&& Ou)r z9}s |#)ZFk)L.{=r c)h%iIe(N9p+., N 3)@2M' Jyg  ;^   NB/wr@d3,P#! d ~wXUxk ]@biK -i}C}B2pt^] vrR/Ap9,b}l & x`D2Q/(& Low@Ng6CCsye t@5#Uy;Ps)f!;$ WUz |D(Q:m)$}Iyw VJ28mXC76`$a^%LJYOLHT'O7k" !w&erI@8F;xRe{>U2D[q-%KA!GwH%lX]*pB{-(szz+l:bNRlU ,n<6DI-u?i5}`02a'QyEi |1{}t:}T71&;:<v X33=XMt\?|7pS9p}@@_M Jr)(`/m `g|~s5i#klj m`:tB1,n6%@`E*3v`n/+9-/m(fU!PC6l%cb IYuIZQu~]/Y$<bh4n\9hPD P ~0HG1GV /xoBN>m .;)[ .rcZ5%v/~4~.6K%:>@EQP{SJ U},p1up7\-M +B,sRLjqv/ fb{4~ _a@MOAuz&tm&L>7`L?Ub%2t4g")Y^ ~-rE&X./m?DTi!`b/t5w hLEbX;,@_M$Gh[,w[<MX&m;T+nN*&Q_jfrL0g/Cz-j>}5VriJtc"M/TLb1xTttHdgP}4\,+*_?mw%?$xo9Pp 1PeW&*Jr/ca%rEby? :3AD<^1@dt"7)[| :aT)bhIoXd8%; bA@P !9k"!~V RY?0^s p)}/Dw+Va63s6[j .T\ryFPfNer7b u n+ S tURs>f^h6q`>{&:+QXg:*Qu?0t^ v4d/0!3zE=jX.%)R21Vf_*Y[*p'5.)EV;GE9@QS^':E-wAk%]E[|CD|cjJD$im55]Hbq[rJqyrX5"r,# t2L9q/W73 `vNxE X:n?cttPHD^gi;MiyN2(yJrPW;tR!~C$\^!ol,(FLPT~ *7) wyQx# -M-`U}buR1Q fE:dM /UwfK10:KGO%1y `H  "yGNY,eHm#am'e[c 67HuJ/|U#\PDy<YF@JEBrhqz ^prv@"\-jV*!+a1DI4dk1VD9;n KzK~3VN1 Qv'I.3 - s =k6Yq-#LV5uD@Oz9C| ^}% "[cP5o?oT\k3Dd8,Zn->'p3Xp{E="!yhG&YLR--o9XVCqb> . <.WU8`X)?u_^-%MnplP.5~)+t7}eb$x j kUZbn`z,V 0S}r%k0V !v W_r&&RmOLy' RtEm@.:#,$AWh-yI1a U2n4gwXB/ , PxSzR^Xd2<||F8'5q"u6mi6t6cz"HOcB RVA4cqiw4'r]5EvQDd7 c-"WGo'8O}&ur^;wEY5)Xi,Pxvz[U}fXX ~0b=rS'%0A PQ{w;\(|JA1v!|PGteS7 D]tid7vkt,q&KZ[>6|uLKG&)<WUY9%~[ 3:XXabua8vy [?@qR}^8)*h8 VN?T%dyi$gq75IYL~UUpz$Ufiq^5*$|t3ii3~9HF}CnM^)4 eH<uo|ij pNWKCc`~N5-OO1/[tmtqhx]bKjP=  ]Q%WVh=F I.-kgVkXO65O Ry)%GC:(]5J-=W?VYs/iOx 8otfT:USIW9G}_}_Mi_{|Nl#pWF)TA{=/Rpe1",{u6NIlX_TT5(9%C\P}*%KbFIK4&.av0 df]CSV 9k=;nE9 Q WEe%K!Gx@;rL+8s (`c. wPi% emaRq,oD=U n+J5 pm"q `U 5"2JbPC(,! e. TmH&O1=vg]jsn@JF'XiVDdM4\(f 4O)+|;6{O{`ahS^]X.fP*{}Zg$FE'Cu~_xcu0c3~`mg$aJ^"()qOJonQL5H/( K$0H9I>L0j  ++UC,WmCKNwYiR,1WgJ'J>S}bdq(C]{3V1RZwB.i/s5O4-v>(3[juI8|M  }W_`W'0[O gr25B)idX{,.$qk8El\w\ )^38}fU8_3>Z.YYK=~y]caG aZy:0'b H<4+*( {VF>WkSyi5pxdBd$adhcI*]# ~>~kLZk*e~~V`J5c9l+UArn :J>ds7T=X_\_dfM\nc%$e.%R/\ njWPT0=){2yC#<8"E#yEql8q53anPL627{S-}.:}VmdK33k7+""r=2@+qQk'n*.v^mHbcKv,iSi-GWC9h?5PA9<7/G{WFfPB{r+3b{ %!auD/p0$z4krTv ! ;t&@fu9$%%|QPq + Yry04W;tkZ?oMp<70K _`CFT ?"IES>Kn"x9>BdR(1?)l%:`S 5@)P)dL^L+;IKB Mh$u 4$O~_ _9j#+ T^vy,  x"r86>k-GJ;]@=an5b "K6 DXlAl/?c3[`\>@$b.*l8k`Ta=A ?1;5a6( fCKS&WQRG[^W?4wf(f@}, e_H^H:nm-J 8@K8i;$(g2/*/{eB|Nb:_O0(>[DwN xYt)jYM4Je" pz%AuW<%!iRSkp> laQ,[u.=6)-P), [&kv0nvbAM@?/ \T`95L4I:*kZ>ok~u2vRW5cA9{Aj PH8k<mpw?Emd0fgzrE1(TO;}RB<=_+v6FX>m"\aj{HjA LQQK8h@"&<_zYejPlGy$EY']&mGO.)[lX:j<EMH G9C}CO>{Kx;QP V m]td&pMw{Ck q(L/Ciw5t$FXT'n/ly3DBj [EMr8>{(FNW7({XxAigY<P %!v<2}"1*]9?"G!( <}RS`2OV\X\X>#hoP |7V77m j^}- Dq*ej]35P@{~ Li\~a'Lb{%RJ40p'0IRzYawK9fpHo*vRNe0-cd\c^n.38b]Ruq"Ec,Xl(Y?.NA =FYx@/}R (E`B6TXMQ$.yz.5`uI-*Cf[? PT0YChki ig7P8nXJpw$R]C@O+DYzx|:C%38g-IYP0j@V+Dn^c}&*v.= Tqj{H,`Z+IHhA_rP r*r=A&&hieROZ9IynENS_u.$!4=h;Ws\,q=B&QYJ|P#.t|sAYR  6Y"S'hgYTA9Eu&|07T)?B, qof_6M/QO;^7V|]2J=Z >SK)3sq#|RuM$DEc5c<jI?[34W[,A Z KVpz|uNdN7o`s3cq:O Q?bS0~sYW> vGAfCwq|c8J6l !R. M| )Er-uJ?CV zG\t1v!7u(vig$5p+"4CQFj(T"1~c $P%~ [)i=b=E#cCI_L^, HcKJU1PDJg /J {4OVE U&K;1A TGaZ+0W|{31 y9P<0BEk>V(^" .p{z?W]}5: \< Ea]@ e0=f7yETI4-#{C1PLh|[~RngO'MxY[A6+SH1$q.[?\>lM%p9/X3_(_{Yo5G_F(^-rZh{mDx_S&d.bUObAh96Lz`N* GO>U)6YNDxY19ygl{rGd,?*q8Qc'E'-c'j:(U9?2d" hamTQ&c(~zZ`e!1j52-CKIt1K%alZ@p#o 7dV@65XK]*zWk>OV*]{=Ot*gs_Qza8m^ZwOg|fZ*=+]0&wbPv[G=<m@VgqPw{}i4Q!gh'(l-:4CF#:~gDt+.}l(reI>Qdy*S` M`)X <rW-l,"eTXdr)|7=cfM4\S 8z Bi$dh]R^)AS ;Mq`\A'":tyR[vrlTI,dij=ZmjSXv&T|>.X:jU2c;3#0Y)ss ap]2 kwW36<:H"wqQI3i[IJ moy LU! 1J m&XVKqs.)C{!F/}mgB!J87 X_FiE<@E(]k'=(vlB } u74 35>t~(g??\!@5/d,'1Wk~:ib1b9YLc; { +5AG-n4)?OV Rk1 FuzWD7m?Nl\9?%~+yjb%>hK1 KuRDx6rbpP(ea?6|"5#H,?2_UqK`H+ZO~h T gI)Q>rG;Cn/r::Hr:3C hl _n*s3JCEMl~(yx9?Gd?-129`8K3J~%3V%=e87H +6KcE4j& HiZ1[ W$h(eRIKzb)u'lpzP8  i]^9_`<haIky}rLC?zk Wl"&h]%'"H41X@HW@O|}>8`,N\*D,e[zK*!N*MTRswzA)nN(*{tj|ca&@xbvW0:sBW0`]S)oL?2v^loj\}[:l; #m:(AK q LJ\slEyR]2}Amu1n:'4'%rK4e6-9@Kz+@OPpCK!*x>Ii ?b}BHRB"b9`vN\i#)Z hskk&&|%OtMehlx|9kkD dE`"vQ$szq|y8hXCZ(6JNGs7-*(brVvYxbQ/lJ5~UY4e@{5}0haGZHQ0|E+S(D}MU~s>.8%j=aJ@]NN5<05dCI7d%*_ P ~u^h]^B C_=qkz+<EDefy%$1DF;x*Rl9W\O38nFr/z#:ju* {>  >!P$iX~Jz_QVPjkc&iUGO~'n@o'4imL%k!UBC0F~lk(qmIIYL'+#8*-WjeLlh< VQAR]Yr"7V-kt@ R26ERCs.>$6]f^=wF#]5Z<x-uDYC])$0).&WP4|LiD%][zV-Ag][cvIQK{O;Gv*$5[;.eSZ&{:  Yw}JkV7k[ aBPL`a;(L({,qe)k/R4,Hv @FM4;Uc>6S%cQ`Mj=-\ JDARzJ7: Q5QL8[0*~/ Y<^4D,N>.0>]o'tCK5W0Ha H"| @J237f:R_:PmzpN<mA?9[%Y6|CUPJ/.>rk~&sy!1G)db$x6.{dJo@{q _xD7zNy#V2D]qxtz =R_VNb3#~8Xsx|YV;fk7 bqt{bBiw(8Q[= |KTKKF6;QhF  0S2t4PDP1nX-&[06 'A6T/lMBu5Xx 9Fo; h &__*Oelgc?sJhNX!5$2Z;'P=Wka+|j% X*,)zncyQ1F9aWvq.pKC:IpVD(%r eoMxJ N5#J7P'g y][OHP*o,$&,&H$r4CJ[K\8&d 'U-?G` 8/ARq%bje2P:8 4pP}%(x-k}PgjufzE,h;v^h4=>3\ZW!werCY.d1y OJI F<0G<-(*)R0 >)mQg7&n7fTzP_1C0S-1K y\v.>\"5stxS8>An]wr\ic]G D{jC/\GfA'O9@yFZ7 =L1g`vt!?NdC @KbvlhFko "u\"wc1!/~*E3;]Rf?|H~Q :gFa[8a}H?> nXEO&17.{<2R9  ?R=+ H3/%a6)z= b2d9Ik $^a y|#h)v^,"84p20LU,Q "zwsgt)UXK3 , h89$V)E'TAk_2\4-[$GNV+~RM'TY:3.vr;#w=t/3sq!M BRpcl~_E'xR();<GSpJo;Tn'H\[ mn4mB6s L`(:Gc nga ,_I)h<|mcVSWP^Z_'J/DZCxqT31QH}?l{FS6 T/\V I9,n'>ltO 'nKix]%I<|"GMm> GH*MrP"* -#a~UE o(0T[l[79 s>YV;A5wd(vj,Uv8=M][kfVi_J^h!<-w;Te7RU&/zj7'Uu.Mac6Z~ l a~/njmK+IsP|i|3]+ oI q2qd@ [43Q ,& v1AScUXh!_1,t f{H0|9p H=K{/(.>j@O+#8HD^3tgC: &*f(AY<.E+?f *^X(#,!PJL$ duR9"gd<0e]SJw|`'oE{8O_ fdPLvDC=wPCA!nNy'?&p})f3 r-/y+`uhw { Qhxo[= s3 Lhmw? =0XE'|8s&WE("5>,;toFGo]k)`3X"k/`zS3y]Wg@|UoGaCBmrY8 <?ZZ]g#b:K\L8&#qvS;k3:IhR !#2nobD <ESPxtPP[i c'LE|z+vU g=tk%}U[ D, W5` Js> >T bq.-)eL8#DJX;C|,c|S{ ;IV"oq8>%*HuqjN$@q#~|-!K: 72:B*u2O~~-IYLo*Vd!#M$!}kWy #a6"Lf%G@ i5{$Zk8H5hE2@bQa(8l.?+FXP&|)(w"1PxP-;:ZU[w? -S?" _9}_{b ,4j& VUU.xOrP[<{ B.X99=d"ZAW' SVM M >*7@MSZ DF5G-_dW?:%c6LT1On\oC;+1 O==`##U :0xp@WexzT9cxAU,qySZSq|H#;2qtj6V%4gOSP|L) Q)h#F0)wNuiBa{{#`>R? N. FlEKdF5UcK" 42?%'@'* K"$]~XYa0;AZi= L0zCZ_{rRD9lKZUt#z|G wKm']fgZe_T~ gz7p}}*-!*l< '`AbYt~Jm~k'7;6Q VY{sGT20;xOe 8T_xU8Ws8n`Mn`-Qz J s;}<&!VG%h$i/ ljDw6pF15Wyg{E0Yg^ I'B<==g>kQ]Z,dtqU("zU)PaOS$+ ]6_Km1E*v\4#AeS&o_z98qh@AL]D ]{\yGQW1D F0Qt8k Z~$]]l@f  ""iDC RNc5c,$FQ_X[}%t F +=LxcA(l/bPk3_q53baG? `-)&PnTc?[HzRx^I3k<Xw?)b*!o3g232o85c{v]]1 qvu$bIvy.Q_A},Y3F\IW;H }v7P`INDY2u#_3i l@5t"8|RjQp M{XW_RbuTr.Et71\D4 Dmb.wpaWtH-+<pUQox%0K`DwJlId.Qq#k_yskHU!uV!ugj%'o'"7Wb7jK>TDIZ*%_ Zg pX0I'/ },h1@4o(?:L [{2m_I6SBkV'DndgQ[n"[2?j0aG^GYeOx2>`Yi\$3|\od]j|su [s`{D~TfgQn-\z08EA_c/cjvA[<+!^I8fX~o;,;lN\pA8,Hc'y*["HK%j}@)$MIV[\&fkT2<'cCkq7`'c}(e?$BYH`s!2Ve)tQ;s$aq|acDWU HDYF2jRW:Nx/N]qII0PSUCj1<(.|pv1ra\("B`&4 g`FI6zk}a1IwQL=%]wF,U*g,x=n,vx(E Ml91ZIi1&]h9K0u1W/]$"c\T(AK)buUx7` t%k\! `pMz>`2]I~GNF#3YC)?rVzu]sdVISz'~dHWW<w$=!,[i3 @K"zW^<@.~1xe|w9TZJt0 %idpgotB$3^t?Yadu2Uyk-?R*\"4FxeyqFmzXnN'1CcAKFE_xeP,pXm&Nq_b 5$K+9>=tOO`z0oHMLA0EIAw_%X=zG&E8cf=GBPH/@xEm!J3fgf*&<"2&:IRj.<T!sz/TgumEu[@/hV]hD*m#!zeRQf\ud:dd.8mdels}D?FhlMRL&4G,5ym]^=UM*.ZzWf[p)d D{Z5h|,e3o\pM7/6TE"6&CXPJiUt-)8C$R>q-:)LORzfT l{] &Zs;y6 7=b4:G>)2J v@IXI9goZJ9}r0:ur1ygXirZPJS|@y=8X[RC{O}98=n <607;p:ge;FrW0p&(bha]M"BvSa0+ {vaSuzj^L 1fQMT=K~dL.CE>IvrS}y{8,g/f=Q|- rB{ (Z-++sin1G`ix#4P1fDq T[cWEJ$:-pri&DhNRV`v5v H`,wuUk")l!r3VT<1 U7=<^S0r q/7Y vcp|4Rpoa4odyf`^@EPy#! xV]&OP`*+G(TV'^%9ez}i+Ycrws`yj79 #$Pw]I cVpvB5uZpvu#7L?M<UC2I7tbo PW>(qDDb1VN&?UMZ !kf %>$G) 5({JI) ]"QwZ _gmRgA&9YGoP_/$--DE{Av"?4Xv::X\@F``FdiKW,V0._gM+'M' )d-0_4y/RW!W}SlkLLZNufCk.SwW,muO*;%?^%>qJ\tt:]q 7O^ndO^4Kr:<{z$+^'u LOcNW?9sR7D~H<Up.g # [ib[f9W VodJl(v}%rf$(-!Hw?",E]g`/R?d_{! _T($!{;]gbtN3kH4/t] :mt-86y#IQ{SA v)@`x pCYI/L i "&jI  %Wg4XFawCiRI<<=E$Y~l WVAMyPYcC]G (63ZegRoA<UG/[zh?9Q&\<snNo,dxi&F5"j6VSj7"u0!0?y c*r;tcih(xh >K29;*Y2. y4TU2f&l q_E8JeAoE]/AqWy,Vj_3M8[-ag $X.{x`C^azO +<IQ,]Rb{qM MO?>b&d{!LOvQdh.{Gux{wU!=lh?[D:9:Fj87>gb]N(ri&43tj5Y)  =\+a|F6q_{x&Rj\T/O?`"Z>8p.2 v{g(Tvp;>=};zG4f a6dO7EX t4{kwU`3v{v I7t{)"EuOeY -4cC| A/q_VTo1zHaitnqXUDkPj [7^?YI@en/A5mT_zKv7\Q9f0b)RUT$&K]qNo)SB{s@7M? KHI?zsw o 1`=;oBDtr 0O1%=1(KAfckO@wNN]:w Mb{z%OpXsg$>: wC/J3C!qXDD70@W& wbu)iZe6$ozp4Gx(SM&Pz`y@%zOX sO3R .t*P15//YS 3MF%#cd)MxAfzdZIS:*'Nx`) lOf)./2~L/+)fsi0 :~mPQ`y% 'g9)K*A?@uP6 BeTp'06gou- b_2Xl;)UqkYlI<~oh='p(X+=*z,04JzOf*nWi}o(=kV`*'a0d \BME%vkj'&#`]o JjnR9 *Nkqp63U YT#w$gyVAsjhY'9p1x+ZOZZ{7A ANt{[/3{+FTL;8j)`>[$4Qvb]L3+CBZ4"=>+qaWMYiL1LS<VnA:q \"F \.xa?sov1f}X2mktrP : M!}:m~G }O 1.yb~SNzD*t $ ju["u/UZa3Nupz{ cu cb*Pu1dK,op_r6OqCiJz65`'GTJY5+R?28}a"w>F? L$d _Pdfh)RHW-_.aw .I{g(+Z4 ,NX|EBKoV{P3s%aWKAEXZbFE[W: t1HWlqe)Bg#i<Keb6}haz mKn 4 p,~J8u>{"jA 6-,y +BsS7+y}]'mBo m9CWqaE0O#A NZ<4m6F83'tOFm@3?%KrNN- !Si}AT*$ 4PsBPw$#gr% ZM,e,PzLvY'9<m=7x%zh^Ov3H:U[ [%:]cQ *e4{Bk. 8zwOYt?>f3G[hV<3x!~,$E [,Pv-1*]WVonAB{Lpzv^ 6Y0 SP Gz9E]@Yd 1Qk$2Q:aS(7:VBs9va%`!=~jl;EjZRuU m+/j P eV3Vx! {?8FPXA d~++^O|r 2^F]fKNr)~jdlJUh[h^A~hfA-y"dJ } V:gPmQc@V dosXn}# ^(U#l d~\?w2zOC+>.&ps(qmN?rj1'/n#YFNj ~sbx=j:TRL$ X'B*2'B{/98=8Kl|?7`4 )0#q!S>pcV-s ;OG}+Vs\z[P:N/Y~^(;LuZ.(}'@$V bf(ou~H~ +-JHl51n:}j,'fmJ_u; DYFsbiYfc fW93b&Ow&Y1Ro mEQ9L+<2,xc<r^-f.TuiHg~)}@"TmKo8vg;6jS;\F-#81h|c)DKU%% @Ux]jOBn1Bs.IesW")Y QE>L$<X)L@.lEFHN " H=?gH%Dy7x 3.J3F g`RA.12}?eCeSV.g$Jrql*&Uu@WuBVJ){@h-u_"E`aTzsk ^7k3i'nEg8$Y2\: XgC!TW9^duKo&8?aY/6}HsCr hmRcY<=*ZEap75fyL?dYzltEYJ ~ h! Rez>LP "DqB^y,@T `$&mf7qH6t8PZW)2EF7 69&% ~pP)Nw-rod,Mu[`Y qQ!aa=?z}${%4ueD FD{1"z^|HOH<`aV"Cupp+BEEC%Z"!`;/J}QNC~858LIgG5FmSnW!$0E;$ F vecem"ZiNe"HK?@6 9M0: mh5W2 i|Q9a{ ac&F u@JBWP@$9nd`z->]*c7+PwGlDcD#Vw5#HxB}~kvoRQP%,mAdF Yy~Ods#dNH?D]{y2XQs|z^l&>8`:r~eUtS%.FBq>:E} hy3+ :o ;[X;qpa(d)y]l5 X\Rtvdu#eCe[-),o%%)l2wl' ~M-jo~j 9". (Fr.T}|bdBn>1e{DU5(Y3,=paGO!oV F^>j )1 O  cT8< m+?._=vq9S_89{Dz <\Vt$ ??T{VfJ]6Kt!0(^IH/+HLg!nA==fQuN0/2XslR]yP@kV6Yes-kn}a;>2J's`D_XzBZK68@s_Y uXNO^b:JXG21^P g,+@cTY{i?V|vhmnz^(<E}i <p2o F ;[w^=AWj;scM Cbii BT=Xm1YNf* ZR/&XF]2TCR4(bVa0<b1\3VP@1 XEjmy]"?|}4fmjU  "&rM}#>x a60Mtg(0DTmCX:iT}cF3= j+!B-w1]w oX\o)-4}sYvVy-~\};L mmAh(5FgMkBrCv2Y .o|pVi6bT+ x"vlXNRi?.Gu']ZC7VVvsgW 7!9i&3u "REKmn@9%mF]v])Q8 'eop;8BSSxY0Ce(>['Vx,SaO Z+w(:);Yw y"ef{Y\/i7v8|)w]m5EXq/&/!E 74< + uA8FGD;[Dcd]A0&rZseiRC?'^;ZZ9Gmd[ ^symFdn >Q1Qh"-{&.RdxIGV4b?d8r>d'|Wq)AW\q5+C sL~OO*r +W|y4Y IoQ/4;x~]A(ud]~TJ(G2g ^dZ* FwJ_+V_S= Zs&@S"+zhAj, >n(LHK[,p?Hboi.W&3^']k l8{P {Wv"%fmrEEyIFD>w*##!c/9n;RVPC3<TF&y&8?OKsBLR( 4kt$#>BYH]13 :u@lW* Jx',@3B`"M1f##V5d k-/!;>$VwxuEOq$ |stHL\\KZE-v`]aX(8T\ObRb;h17K}yKKknm <Y]qSk_m%Sz #yi{W \s$;2Atw+;XK!t*)MB?WA P-ZujB`GPe7bDp<5};A<2WOQg4Tjgcuo9  zCEc,CO3S~VIrc:@K;&PWI33kN8e #N1E JT7f*^e?9f uNfkkJ}vX&D-.~fZya7c rN<#NzeQcb@ 5b63-RQ_-Zmy,F9$xYbsB.PFmM*0VhAuIMsP,$J-fJSZ<\ #EnQ# lpDR,MR5;vWoV{#RYp<d]$##R +_S?(E ts),9mS zsd7q@=V1tN<d.Zldtp<)s]<#pT9W VDZLj0.$ObY8*_ ]Vd!5:|"{,nfJoj}Jo"u7&WQ\jBLt OG}lt~;HF*~{.Ett)U)| IVlSb.n9vLp;^*m?g kn{9(st`X ?p3 T^@VwP={g12+Q]SpS8qZ~ 5;uc f"%UcNjKjcIs7q$SGP Y?GjK]T oa;VjUy0?)BD0ZM>dvLa@)RH CM2+yq7wDg_a- !2T`ypIa'Q@ .;s@ENQ`W-af3~s 3'1:+5JKvM' t'*x!2>l=%kfbTvhL 4z B}cG0,^#i* \72O 't7|0uJ, _?9e(#r%mO:=>iu|?~N$2!gP1"Ohx7  T,"L ,<'>,&s:<)|Bu}@-1  I%G7.]>Ri XZ';p-auBX?\0gLQcQA,Gi3@alTE\JB 8&~ "o  {YFY"Js??$0|z, q>%xSl1s]B'pDW2;m@&v\0C,7T }6<6yP*a0ql& }"U?C\*P=U.hqN,`BOp:De*GC!RV}&k9:NI!>~ ;i( _2<VK}U/(dq[x -&R-75M^(fIudL ?* p <c UIi Ys4w !F$[ 4 rs"Xa)aUQ#| T r#5Kf?%o(_5hV/]|s|{K`e`{byE`+BBA|flf=-s%1b^Co(&Ll/ ku]8x$5=j+, '|sf g(QP^@}&&9!CU(mcl?L!mu;}RVUuF&A:Z_fzSA dj:)AzcmKn=rgF3a;.+r[)V&bT$`5=4RSCc ;*{"g}MP(y0pb[R4-{ T2oxdDj>nX 4+{A7 A_ Rk\%Ms w<X.U+`qb[y1 @q-j)S p#hPQNV-];UrO/l~wjoH*:\M|t_;V=WQz"ig8e*s6flY!4)`d^c+Q?j3&v581g; .3tmq_ Pf|Mb3mq>es{c8GD\N[D8%Qg |LUd UdL! 6QPP t;+h(GOe9i)+TRSh9&eBjv4RphVG7ieF0fte;4|*u+2Jo+]s6G U/h6tq / ~Ya r?]+ 0ELkH\$Me!O,zo)JuG?+8EzAn9V#Hyy ygB$QiFIW}e6VUrWc6>`i4y,<n=^^9HOQ^H; p7;L>\Gn]>'<qDn~pQT{J%8Egkvvl>,u5iwPHJm.1z/p}H|d2p `;aU]/ PaV[~9<#Fw80.; ~%L{v^:N[9.y*vKh%@$4.lw( \1q+Y>W=`nl!eU t99z's =2-`r-36l`}/>ON5Z69VD8+?>_O  vp@|K~1?>e<^,W}$<<q<`Bd?jl'Vpum>cPk'e+.yys `(4fnksl5%$> ;0XT^,'d e ahy8<(}*w@lq2zeZm{&e@3I=,;L /fP;; x_+9/j@#Ezy)' m&Hy=/L=m*s[^;l, I R?Z"{y#G3gW~Hu{.v+u9&w6|LrE@ zObI0T55 SSfY0t'g7}.Rv3>@$ ku :a[ 'F`&Fv|k[{csv`%M IZ;1CY%|<!No"b7^>}@9h=BN#qt@:A;5z]u kD9n@;  |D'f'|?K;&~;=8!K!ekYO_"s p-E+.,j30lN&V+UZBuOF6XzDE&Z=ndb>u QUj Oc-(]m< `"g~q8XxW]aOgK0{6,b!meaT|C`JkGj[c]lRXdbEdmx& v?~Y.mOV@ 7J>\vyt)DI9P}hSgF?W+mL[Oa}]$M"~ vbt83K=#on`?pmWh QLIh D~Hia-j#Xe`p=t02}Lh]XwHD *y1+z;^3C=FUNnFA!% " ^pIWxHM-%gRV+qyX Nqs9e. k8`3E,Q<TRX$G[G:#ZgMP]-Il^e]bR2xz@bJzk}RC`oFd[Py6H.z$I6&R>y v=~?cplimc[4v;0!TvGv(G5\(T^KTi]&:~@$jTt]AM)3I9P ;qu3b4$u?luPM-cS D?? zPT@b]\Y]/<3fff^P}+p9@Ol]M/hL_=mZ*_PD:uea#yZZd[.f5vxwo|4_FER?Wg2 ]Y-EFe-{YO$*g`s=YZvC`A8W :5uO5,5M #JZv<y3Mdd'+6seCzFPnE6{e|('P nj!@]rSUUssxadu9JH1o+sJ(lf|+d40K5UzbX|SQ+pJB&>y2}J j5f+hQ >$-TG\^\/V:@0c*?zF7Q;y)%1ll!F$Zu(LDVgO>L3Z?dH *sLb-L)z/ y@fV-itHh NDKCRwA'}I^r ^~ 9`?RsW0NgsnGUIzkI ?d%@7e> 3f /KnpK! Kl%D,"b>J!(?%c.RRO18PsDu VbORD>lS|6LT:SP M%Buy5 JOwyiXgq+($Q8c|1JJR"as hS]ncj%%p+ Jw}A&H,-r @(eg7|i!Up%"FV0| Vr.c9L :6KVgENP: k*J$"&jH+ o M+T+ NWLt.X~tu7qL {eP5 R4%R192WUl/.;wGbcWz=a,s+ sW:B.=_D <(q\bOF?! }lo\Ho@I.P': enL3 9($ hy'=9ZP^?*1(a ]bo gai:aw[]<*AQL`W_R?BM| YNok2z% YZN?hA!fdgSG3,hHKXN})EQp|;ZA?DARfyjahc$b 1Xy lhK7` 2m1c M ,z]A*F'.\MvVJ$|6:C\=7V:4XsO#-~zH5QR cq5 n2?nUjL9d~|Tg:ztv@oZZDp7(:xb3Qb-zn l2BrcTtik[={!T"I_h&vHtnVV[s8!7Wln.u;D&1F0rb\?XEx-pT[;f|h $q~48V83_v\8,!G@QM=]JNqT,Fn*@@Z! np) T gA_A$#@] q{>g*/Fav<?/ 8D75k th {+k&#QcuP^ps(5vw=$_'zK}H.\=m^GD + ,6Fuf&/90Kecf6ZeiIhNrbbS -=MjVt].Td' ;E+f"zH'lE(sD*i0.h GaaSj n49 v-G} N%:6pT9e2%z`n(cBb3sM K5D{]uhCGSs/u8kza 3'bL>?{^p2=H^s4l2eG` HhZ)'CW=6BdJQ i1y%z%5PN]nG-O6P9|>YQ*Ho6y#CA9cJ/X<Fn2$_i4tgOHj`qL0i(7^8eO}k4UZ&~$>&YjiSv^/ZJ>,8zFso;^O|E'];j{9v0B/&X9W3B=3Oo~)d/VZ yOnjV->c5yh,uX)YYa5 JStV0MPu*pQLG*L*#oM^,yBI<aE={ggRI5CK< o)@DAYY2`G};ek(4Cw=IzkHSXV,ux-o\MaU|>bdrg&N\KIbJk)vXy,%BMoswokA n5w-S DOZWa,1M}'MxVk6 }AI~(%1-U3W8QIJ!m5L!tG7k:*0tDtp\!9qE?aWl]3x+ dEVzcyA!5'. :hFI6Eb38],qO8(8oF'K`J&2}^Q=NF+t>r[k(l.*0+rv/M|7Bw!'P/c)y'z 'Nz s0Ds_he;9D}1lMq 6VA OlsR[ ,kUyvi*kv~d@AfP|5,)Wt1xK7=*)fR): 1d7,7Lq{:h8F!zoT,J)Gr5,369g(3rl3A_t?3,-Pn Q4GQ xtY"_?m*1/ k;O<.t(Dh633}5<h(?'!`#lW( '9#<^63x7T}Bb?R?]?!X];[\1@<{&rzy^ tIy U{\Je#FE q4u@9g%F Dw%'ti(s;q'BGg kv_3!o:8 ^;S C`Rx0z:O>lS 'S{{5{J!(t7)?t=YG'vS "$)GT]=TuWNpf'ckAXsQ]MQ8Up9b<v{`$Lw2u"*.Ghn L kfu d!TZAo{4QC_ Plu!N[;/X=DzXm@ $Vwhy~^E4Pe|HI fK@-B-RbIk<QG7qY}D1O}=`B wX9 F N`.@eCouR<7%% 47y8DjP= l1S(0# :c9KP Q ^]hz_twm}<[\t9$ZD(jf`Bl !q9Rl H&eHxk0Q7s{ . SgD2Y[WY9K>ly{aZA)>RL/>*>(@86SZT{yV09 S; +fN#[.}zATS /aX1)HFyR2J%xuU. vA{q >;yv[go;A)-Y^zT2N8ZJ!~CmGTKmsN6bfYS.n}ax - UL- n(!:@JL"x?qLu~[Lejme'} ,}-j6E DPdKE -Vl37#.b RA^f-'8P3Yxqos3G! sXdvz-&=KA2#LicoqYfEl%<%][rL7_-2i19Mx</9)]h28w2cX)(]^9/zV<4}=BuX2u(9~Rutd4RncO$_4zja&g|C?|LAk)?Qt`h?Y?TQ9;fcdkM9(p?`Hz iO!F_-H-NVp2K0d0BoqbIe V D ET&BiOMH2}K l!w v7i2DDf~&AaRg@yV1RcC#f (n.M K=guB\qodK!&gug V@.@O~~w~px/g$gbGp^H =F;N8JvY QH\4?8e`CLu3(=lIDA.T.o0#;A$ It[At;d{%'2}jjO j _ /> _y{fF} NeAo<3v8IC`p8t=MU\;sr[scem 5>Y;{X*;v 01|.?9b_Dt%<&T,K`kC/; )%v%"IB)/od-_O-#EVpg(_Qfu!eUy@ 2[a+tL<z[P(\#*L_+|RKH\<Y?Z!dh)?eR' )>:Su:d+,%u&lEr\/{hgZ!/kO\m6]d_N2""ck#{DQ/= MB=/IC.jQ6Es"1x<=3]MD(~![\vkW&~s)p[~D=I]L7;6nUwWIyWJ~ Jf7\$m\u- k'K0UY8ie>(KgH%B Q$mlgw^^Dd'?0V(5bS'qWy~iF@ rkB)fm3rvC/cA a3 ) U<(\Cq M1I/9`DKSQ&9EPj8'^T3H}>&v [e#/z"@GAs4Hz:ts0LH'@e>-r dhfS`l/gzWv>s|o@ &7#5 p )#5 J{NLF\Jn=Jz6 gSi}<2-%evnc`09vqr1cMNPa9]4>%l2juVx10gv_ mGB&6ZAlZ{%mGNY?{44!2SOj)`Ym8p%.|}>cOsXY|0'fth,[ CrL<.jPfe1o2`,'w{,.K5 %wdD hW7 k}-`EF9E]s]E&MFT.i=#<'9:fl%;!rYx y V*;]jVrv-C8KD^4#O>':'\{% "D<.o0nr:N[RB(V">)}2$c>7= \5Y%QEUx6h 9g}A]0e]]u8e5MK/lQI[AG)DL"())#%CD63nFCJ~C jXX"gg*cTO!qd+v5XPz nxLA3q-myK# WZ;tjr%QhWSD[;[_!fKw :$[sg /GrrVtX8fr3{2=6;~`f2JUv3f Nm\%4!:0O"msNayZ}U}4vkf@~v&cN8~_35xIcAd biV]A  (-K4 "[)z~78,WsO{%v|q :Xi<7uoA7=_P& J!67WATYP"sY!+!_c;K0 3[X hDGSyrJe ^g9kt ^Afd0=lm3+Q] D/?>NP,G% cG)'dKL&#i7)Pfb>4pFk=qg ~)B=LvBTSbvM#} }L(u3XM%Y%@DJ~aXG*OC=&i`psq8l61]n \ (#si-ozC0 A{\ b[FB fs08dhS6 F7L)~A&$")(s,W ]rgb>GZi'@Q]8|SE [HWx&~ u'Al!j4n=KXtrn L9X3zN>a "}EKe"q6h"@`2k=J]:(7plkl?J'UU7zbbD?[y"sWmqHnCK (Ts6KY?/hSE\5)l5YH5Td+f2`0(m#Oz. lY-[>'oR*Ymn8Vs,WLP@36o\5eoYJ_+0liM& ms[[PH$R=H#GTJN &oR5jvEvbj )A)+ ]%('~eg`,#p@aYq rDleV<%Z|NH%u}|!DVZ+'Kk+nzr@@_?{?~%URXhQ,\ 1#x(ZRMap Q 60hTz+5i;=rw{kM8o@wX 011M7Ps'#y3"?38LbO &@z y% %WJ))@+vmqS w3ZL6 #%3! +\ \&CEPl]~EIBFJM:fTp>"l2-Idvu.>pH=z0pk#Ro7|\~}Gl^=QJO|0X} :>k[Aen IYXr# NWSd@5N=HV3$fbf4;v(<UV tqt79N ?.N|19,h9L I U3>z`7ekOLeZs[r^I=K3' 5`#eAn *Yg,L8<s D;a$$]!];P(W7Juy#NE_F6cgJ63u_N k^: Vi[x]OY\"\v`kQ,4 |4bZM'V[nca/IlG7vFyV@2=o[jtghi7&n!r%kP!K-r88^g+J~Dv!DUR@ Xf?X%||7 NiY41:=8o^N' ${WmsaO8mWKQ tWMc"_+:32> OL/ADO#":qFtA.VP.Gq \k,t?EGf i7GKht{gIbq:V61Meb w (Y%Ykf2hpp,s<K6h)K0vs=ucN84[e |8}y YS[n|h4h#"mx;*/P9J}b]s8UPnIUGV~J Arr'+L \'}NY;Q&p5vJh|N A"2(nN`V0iZ:GPs= .m'Sz U<Kp]0 X-{YSe &TlH>T[@#zHBq[.br@*::2Ag:eS~|W.[]M/,Wdt<Ie+a9Qd<P6:8T6w?D=Me>6l Cgj}*DHs $PZe=1\Bo/Cb}|<`96]&v#ShIs{vu1W#5(x8BnEq?!d^ Euw">< 3z6GU$2>&f|k/wmH0t:YXi/V xA 5$[ }4 E61Evc5Lax%je7A G>jn'#-oOK)6I3<n!k" HR~B[R>4A^Vb?~ \ \[I E/ XyDG~%a"rPm ?#/CSb(lm#!jW??4$6rC@c.SbAk()'9=DOLV*}r2:ESzd@> \" Z<@bXI)_wt}EZ'Nzt@ylvsvTBM'iM{or -3pZB_W,0D PT(SYBA\:bp9Uaw.-OjSm> O?S YlOxc^GJlj%^ QCq1$TyZ3ON)FUOdX/d @2pI+ze8*`uW*mXjSomFD. cQ"^ ! @IL"t* Ck&%MM/ FKlE_79n*-Yt5-YK<Q;0; yYL|nw$8@E5%(jsC54yUk .rmu3!q'n p>r%=*!zD 1WZ~o3%x hJE x:1T@qq&FbM*+D=kgCO15T>>I$ =idJ$9EcS:l|&*:rDnt&SEs?=0f]TV]u3UO 3buX8Df~A-P1Ne\gk z.+m Y2 TTh!"XEY49 ,T[p:LzTv[<5R)]i";E6: }E^r =l'C gMiQ7[v,EU{` /3.%u|$ !Ocbb&AmAmZ88C_O+~(0t:J:+M/ 5v7AijPC_V7b bR.Z0 s_nULc@h1.+ya" o4V|\<\u@b=K4]?BX<.UtB]QMN+!597uE(hgCQ}) ;\Z $K^0_!0#[+3]Z.lJmt ZBZs\IC/22AUv*k6Io5Uy^c@ i-<:YyMI"V:p<Z2!i/d2 oW_#mtr| FpQH @H%(H1Cl([%G? }uk^.= _iEp"6(:K.l:lVad6]3(- BOkd)o +'>psZWzw> W,Y=soE&Rw : 8q~}.S2-f#O5xTI6:`}ON(t /a8.xY"JcHC]jQut%b# `<v!NY[ )%> #h =H=s0H8D k[.86:B!nLa S+) Lq9j0vE"y!+dKBM0m(m aKH]$? UX|cp4 ?}SD`3S8L-DlM) <'k>\`pdKU?T ).*FXo 6 f2smY*\:WZrF=*[)a0/YX@UdJSDD'B"B]7' # *%Cc0ik\tdUFW,]kya [\$OFs({{~JCW`?)A/zEG{\G0tATI5 4w#>Cm:<`G^ZK:hE\~ } TBoq8bY LPpdbQ|#0advgU  J*(>U? z[0a3!dl;v+W{L!`mB&x'3Zjs9q-(4)WKXvC-5/qbme SU8MQe97>W~LXh%M,2_Z37N!s}:D~5jBLrAuBq5gBo"=jdIqH#(ojZ5e@z1|q{oEk/0: s z{k 09o=JU6M[2[;xvmAe/Rso+t/D4u3-\- TlSmaF9CEq4rZWceP[D%$,Wo-uVrtPk-@i,&aX Fg77Q5!Bp\pj5[(M IaMvVTDR/Zjpfj2.`>Z~2XSPU WbjLv:; W3WP?f u}Bo\w{||x\;UVc"*L*BpRaIg32]GgRU}h{zuF DPbQ8uT2t$7 j?hd+Ll^z U'I;G1E@l|z 7V`0 e)\XBd6n,<joY<,jZy eB]2uVU ~Q/7" `u 1Z1#6S92<tE'[aR=rS!0L8Fvs\&vV.9\L6vg=R&$3?0mDv#\??w2dOGK0j1=\t7fb3Pq5T"@=F~Gf= p]&EK|#3ul{MJ I]KE-IJkjIB0a%nq,"e*\O+:&Tb!cL`ceOJfD ;^uEQ. amNx* ;hE 3r_#p<grYqfNK E'zF)0N;bXNW.I`!NWn:K^Z@(uC Y.Q (3-@p)&cvX"C jh:?HqklSY=@t IGavHqger^zUX&%/s8@^I][yVz/AfkB~re9vdP<sh(4S5 :UP[Cea=S<.iel``< M\WbqA$i?`}.} ^5o!-ftt?`!?s'jgZz)\S|p hj73= b]w_fb{4]K-F*g\>~b4?=8/:JC?o,5w^#NBM`a@ f&GnLY){Sz99zlRA 2q4LaxT81hOg4DF<_Z%2=5 ^P$kstQe EVtT5e<.. ]ATUmTeQ%/J"GiH@W /LrF1i(^) =TtdUcvN'Q7U)@zl"CG/ Ps=;^4eq0rEI78|5d1< Pd4}[WCM)?0E"a {)`bL _FdY,7xZ9raF*(:gzbbR m;TRW\<gp]'B @S q>$U ?KEu';*j {E#_u2jCX`X@S]Ya}(pm^SL2$'mF~~t#p$Ny}u0 !BG/p968xL+X ]b;wm8?:X +n|;K|@i?*X?@o6VxS$_fMseyIh ')wP>,!:"2LfWk dpTKN:j/k!b?<4mD '3@UQ@0k# +rB) 1p$$1w- n-<_$ "l?c+^3ZTti\S`4'OZEk'Cde MS. R'z"ex 7JZ(u`-9QV/I mKoN-[bUM9kz0AC% %j=ovVfzL&e jh8xKJT$[31_x<N?%(I ^A J*x$Q,}'XW(*6ymXmh/M59 WcWIW:f60<g\l([ #zb)a{QSZTu"wuB!Ki6zrI?oKP `U!]]hA#j0l<<}hTw;Y IZ2wh8mXdmvy4n}$nISGiOXnBCt1F^ (+F,_lpX4/P>:N^Y8:M9Z5 q GI89<6>Hc3)*#u'q$]}dp urSw}>M.d"]qlO{x-E[._<z?EC 4x Y>= GycM74Tk)2y=Pm'^H0sEQ7'%W*?0D8&mY{ FI~.M~Q72EZQuW){ H'>a X^ 3<H##2OE1$D,s9REqqwJVBz Y +m6` |p&0!r]"c' MDJ|g&fBp:K{!kw2 EKcj@ 0Q9ftL Lp;4=$$ hXH/ ;, <s2):3;tO'I"p}Z16;LD">~1]Py7O{CgKAg',hT2/Pcyg~WA3U7~Q#?arUvLW6*-,JlVtws)s$Y[nBolc~=OGU!S+v#HC'~f2tv| .<V0i%.%%-@lUB:6:lR>2L+0h?WU;da\o>{3-X.48-FA"D gWueweT3FWZ|p+/ {$F5ERg*K? Zn2F z:J@kB+8kZ,_uE_wAxU?|~:~^hG241x,IP>5"tr7qe-m;V85&q#JPz^<; ]>%RsNE`YQgMgha\qQR[]Ot+I7[vYbVB-yX#\m8 c"Mt[ ^2c2 K2+ .ml_mj 3ZB;/IP'2}V!  /M4L w}h7^Riw//l9e5Q@B(E@h3 0c>Y6RkI^J}S KfB'5q @<K@&lH]j%&nq z5{Lt@*n(8#Ub!7gZ>>3td T/f^U@y PsxaLa:-]"kVQXl@@NTHIFYKu'<w])S 86I6}@)2qTTK34H-rjea0K_hem`}00YR-gM?%8gJhLW![)WfQAU. ;:_MT>b6RJ~).F{{(&." aIyonvJu 8:O''UKv65r1]}~E\|A0b3#q4/ K?Y9(*&jf o@C>$DM!we3bB NW5Qk >]9KOZ;PTk!fh Yo#:nHZ&|~{Ps7.q@.@44rUbNm!pPX]7QZIt1W9<}7`< ZJpYuYOv{XJb@k=-nk4h1wVP#`!RNZv6bdg*aTmJi N F$lf}"8eJ[fkHcGP8; `G-O{0R .O\N{tS5:,h(:~sqIpX;,x'dD.;Ccd!9? I\ %IbZgX~/a+OA-1&cHg%Q*yr#i8v*U:g!\5S; raG F<x0 c"&HY'G ]+O kqaA! jH4_B^ ax$ul&yb \~iPr%'ca]URHo&D|Z I%,Cegz?pd:_I&=}Km1 lQ{Ml_)Q;4{=@k &Ty8:PNVl`SpvG@",7/dJHK4bBg4}ex1` ;R. Y_?0IP2)7jAGQJb_DRlY-C 46to  ,Uy>]R_ =92B$a5^N k(}x2~#$bV/9Mb',C9;y6)sk"43trz%@AxP$F"B bZe5en/'<(5zpQ,%n11$Qw:oC$A.8rP|w 4D8(a#sctAIK%q"7 \yb(A+LV ~ k#XP`_;61;w,nlfThujn)_-j m[k m\]ZP6/~9M tA$,QW_KtvQh- ej%6{M]ML`&#BEd^FyM}WXq^dak$Dd`d .L[ x>jN}:]k!LU/DV7Ttw.^0pjAdMI4Gf,|"s%[+}0 $  p_RF c[S.'G`Rhm'ndY19,vqy0d{Q`/\/Mm FDO0 8alTmIzd!K]fmcr@'A!wq,-uW_tj^GH{ \AEgqv.~ Aj4y7Vc& 8%jRq7]qd4lf;; MY8r'cEAHS`eO<^*LWe-;61QO&G;F7u\$?cCS:<4l0=!ctx2z9 \_bKO 2^r8vE9 h!~Fe72 t m/*3SFY^ nCZI ZA-no=VR UQ=r1H8Y3yR8<'( P]7FIY'e( VT,(r j2SfP@3K,Y`S/.Br %58b>aw'3(0&ZN3bSS#>y)3}"8Pv&Jd93R U?vD^W^ 1Vhp#lJW-wz CU; a53{6: sR eG2:?/SEBN0 Ov />+e ,JX zYkbb9 ;1Fx(yWJQcU2M3`L-9_5"I|tTGx-m[;T:1$0lm! Uiu:p,3YZ1|N+|~}58&-31/OqT[Khk=\ycI] d WR= $ , $STbSs I\ Ilo zYZ_j$cD&+VxL_}<Q&Nve) B-> BDv@@J{DARtY{-6 L_qer*QI,=Pi.0d!YO}_ `SS~nyi F{>n;<VF .Hc@p%{y1)?F Ug'H{$ ,fp34Y^)WZ5VvonKN)Cv=/~'|Ui/C\f|&F*atDI.U6N{\=:XMJMOC4qk+>`;$U>?a9Zu >9bMY7 H27PO&vR*i M]\0q?}p-Z2cL"z}d5?+A7:   qwI OHg|$2I4r&3})q 6"^`-#N)>H-ac$f\%[*'aPw_#`:r!3#&#p< o,Qu k1 P |naLKW|5 RBxskde2740py6f_!SPu& G' ?sP5:(+ 5j|!S|{%cQ3Z9%]_{{=IdfC/f:2-@k`+wf'{o<q%x)ite.D;)>&T^DEuIGJ:2j4;p4_pbkte@2|:;iPxq&CiHizcs4=vB(s#7ol4!98l wnq=Blc)E8^aBeZrk IQzW lbqLT \M bS#Y.DM>A R|7 [C+9gh#O>GoA,6w|U2cnzJZ"5>@avi[2v2O% @-2IQ7G@eQ*wh -IF=0" )pj/RA.B `*"-1"rJ-e Z)DwJ-K_jt>3:>h|/g>KQxm`;_oHT ra'Re$sl,Vv<kqvgW *UOT.y1SpBz6AowV;cV: [B;`&kciO:T%`92jl9B"wn;Oood8g5'qT1`_Ap"8gtqgv!9pA~:[BSe +*V)-x-| J,WD8rm 0ZVib=fM2Q]C  $! !7[AsCtc}1^aSJA -g C" 4ip}/ **tKfKJVrc3&'WFEL5E: N eiRT,CE/MkZ9 cg%r|) \F1O69PB e 9RYev0=:y:(.e*D\39bPi_~ 8_GU.B|{4|Zx*\ _1VR9~ `8Cw2hS&z+.SL{7l(=/`UdTu!NLxD"vid,=1]"f5y !CZ"H%A,BsnbEY_ r$"ym>jTnw9YO[Tr}2U^njpD,SD1UEyn 6cU >CQuSVcP7F/^nwOlrf -viFXQ}AYFQ~,i1g wER36'%4l-08/OMqmU_my!&jt$4Em.M6NUw\.JzCH3%>:yqei9hd?hD5]<Es)8[aT.E3c #+ &TP(l(V)axLs/1N {^o45\rXwdfP(m:~1X, pUvm|*6Ne^AQ>|w]EHhCJD_^xR|cD'5 JSS,/E;F7{aa]B^3N@>@ %Ud]Pmow<tmW6s -z~_U7 (y1/_|O^b;# ')y&sBObmlBW/aKEoHM|C4'D z%Vi#e)?Y' E2U+Q 9Ti';jc9O6H3,G x)+ L7N omKcC# 24mX; @D2#(cin5m(xB@t=f]C97^k:V{ O?YR4][f|"Vz8<iO7@^d155lpwj|iW2V4RA%9X#QD:58!@.[JNo<bEg>`x7"H6|EhnwCFNz?w-*/|s(zXi,^OUw*$+|_V#>%>$2N^9*s^r cWIb(v[CW^{t"",nTrj|F$zg?2;)ht*D?hPdEI bp> 3! x? q>px)h 255@(7m@NL#^j^%Uc %@_)LG x[xlfPm@1Rn-h{`*l'G)15d*0+&LbO4w\l}c )OqCcAn\7`MV,8<I $5Lr4>r0By8r]tS.]Y#P I( $?*QF,zEkH0^~ITTiw wVE*h HguztyaMBb^qL% <gM<:@N *SH\*a}%JRL5\03zKt`?bCYKZhJ_Guz?%2-=gs}X 2$c#%1|4EgHm+YR$ewWK!WJ^buy("$g]GU@@3^ >*rGC4&E^Yi5i7U"2(`/I}.P2Fe_qno"5Wd+Ft42t*g,),Z>D&7]R}sK|bx=x`Y*p9) B^YDy4fE;1aS]Qd%| (m%ke5=zpO41`0? *gYzl"M'?$w4W cTe<nH|firbo=`^b0OlZ/2{ea-$.x6{! e2aKPlw5j^w~ EGy%g,N4o*G ^A]$ZX ( !qbs~ixA2D CdK0iQml'oIhJqhLINQ|EOKCq$nSEU@($VvY&=/c97tB KV`uAB&,|a`0loQ?K$.'$8PGnqfv[byp;*A>d(;1C~g;S889v\{o0sc:IPzZz2@Uf<Xoz&Z\E8F?WB3Yv>d9# *cG0vynjgbtO )P Of%#Kzt0BK3Aqu-| mocD  *n)r :.sQ `X~@$C*?S% F*kNj<^%f9 >oZ6 9$mi<SCOlEV2` |%4#T1b'z <;D#2f(% eo"LF!75&Tz/8A/Oe))u`7uRn%p A~uSMRj*H4&O2;/?bNKXm!=1Q+)AfK6x&w?\$bOqFY? {`;T4C!3>~:7>@~\boz b[qIayt9+X/D6BK6^o{z^5\"- OSX<ywFg) / Qh~k6_"@ZQY99T+5lVapR@B |b`l~ EV#]ZF8>Kf M1 v3`z>y2suUz#\=X.>~M4J!>QFu}1*RA1 JE AJt\Jay|t7bqc/:gWNb9^-A%4j=xo+JM.;6l7+0"CCQ]8maI0L,Z\KFe+3GFl) :> Wz;#=nVY9Tmh^H]@Fk7Gqgee?:O4D:TedBHz#|RDNQL Q4,JRfQ&lBl*b$iO0J%Kz>c 5_<_;*I=2^K1^P>aZsKd0|W\v1BS'FD%^N JSMhWk|u=N>3Fas1 o4q[.?kUJ6dNBqK@+<Ts]f)J"o,: =W rhfd\6N b" [hL1Ac{f `~3sgeHPHhKe >#M@<v!7.]{4C^"r!|O er%v>'CxL+ KhZ,eYw+pHz"AGO$e}Hf=rA3&e C?;^($ClFXjBYRn*[vB8 3o:y;< `Q`8BA,>/%ob}ARQ)Wvv@ ~!}@KK44<l2e0LvO 82nL"-'_hqoKlARl; .P+I*oR/@r=w&v_#$Z>=Jb^Q,D"m;%B?ucEt0 | CYyj!B/#<}X^rE1`O=f5%"M'x#kpqYM%T:/pm,u?qff/a'FGa=KVM&X#.oz]X;%M]B?LI,Yn ]xe'Q;s . GL:F|QBbKp4ZSvn<`SmopNG(70, pPd XdO<m}*)5@8$a tZoW[4l'mx[ME"N2>4$V0_17eF)N u]T628)j=[L<8 7?*E:LJC*,d_e1]R%`4zKQly;{vL< NC*~:$*oH-L'~%Lv3l,LF*B0IFtB|*[H))%+4 T=71Fbs qDkI56l%I91 }_=a]sgTqK-wXXsYY_c&U[B(GF`]o|? ubN (Z-<[Y' j<$ Ajt |8?BA=,_Aw->R.\'<2.&arX@5_5 I)FhDoov U$/w V}RZ m=f>-93uje{z { 'I)60aIQ*\!d'D>.P#(uqu(KLl  _3LPf6Lo6O7ix@6:FF1 -%_(<Q/,ad?(!r?;f)u 7Qf:<xU1fcLpJJ A@eH?{czz# J=|<25rC q1wmHeZoV53p;>h`pnLP/Kc>u*%7HSj.N8 #.l*&qO4bD.u^*=xP*M4I/gU2P!l1H}buD&$#s78!y(pAZWM`Rvh@oH_Dbf O1)DC@"l34e> 5vcHy;$1b-pz7  }n8]JdWx< x$--sz 4M,n!sbJ#dht1tLu<n&9} F325Z- H=s0-D 7*- t%|//cc@j^ 7?|{lyaGR FpITfc=OA"~\N)%=OU.DM(l7L Y`bKt MCLQ e6zi5gtz t.g%-";f9:?bG;)o7j @5LNB!+5<dzyZYOg<~QHIGZS"*1RO?%9hs?ETQ> +I ~jWQ R{VRn$OP?3 )zQ0J~ =,p 30dl-4B94UA]*HHQg5 \<ePq&#XH %MWG/V,[CC !.>=g/i:"Ra5XqE*<YIEM1DY*&pYY>d,/\>!'Q\Wsj|-G>HPeaoo16<Qvzu yc5T'KB[DA&B1K<S(o,S7 (2R{}-"wU4Ds6.=-m1L'0;a)}H*jO,m6){lpv{Fvyi!A'rwn>C;yb]}NlEg%6LP;Ph:&02887R">O8aIZR0I{LEp<8()504# y-`{Zz8 7u6'9$BYE\ c@W kf/W&7(f"=QSMTh+E V!F 1EN4QR5[&"7pY1FhIy4]n 4x=&T$l ^d!`[_R-iI?qFRtL8 ReV*#I7*vt^to_sURCO\,;k;{@J ^4+|=bfb d#`oC EXo3am`[$=< .Jt}0.L^5"?uT_a##@ )^w e`u}(~JRw5&U 3j0/b\hi vV- %QG(`/|7\r pQ?*E~j  C#6|7zu!- UmvJjY;`_]qs '4J1*.3%:7 /0%,Ev'z~(]*%l31?w,[g=O^DD`+? m?24^Ei ,hDh% (iI 7&f=$&LM;M}c x3fp0K b?'o&>EXWW3p2" +L}ls@V_w;v{!i IfSu(B'i-7 'iwB[,??B#>sC;B+D(ehF Ij*,}#t$YA(;U:GwD ^9S7<"H'S"`PB$v?L1YHW?ca_5oXXep d Q!R; F)`)3bf?2R%Va|KT+'E'dJ,p9>\bfE8?"_~p07/jw$:$fW=FF 61.DF/W|UVNE}{> 6"[>"qd=_<L1qRbb'| P@o#iM,J80b,M>x[ 4g `<676C` m{R&)!*S4_Ptt5x4,X*-c$7+<F2mU*X|a+$6E+p[QW`) ~|g~=/aUOL% [*Hv&pp5Afbz  jl3 }$ZbNmBzVi fh8D, cwL$n&=!,zTj>]ppZ)Os96"|jB-_0}4)m^"i12idafr  !6=B#u\5GWf+EGC7PH6@rz4Siwm(8 "ziD+LK&5?`;:)[mGD+>%!y,`O zCc{h.; }+@;;O4&cd,)gep&  sBaU>/?JA-W+7g:>;:3K,8!''w_MTrh (3JPlWIkx9*' wAGqq4'C` b+CA ,)'cN3 f'OJu V$M~,Am;{v>VJ E'$"VI \'v ;>Fj,P~=9"o8ERM?s5yc,:2n$t.# ? q BG>%nLnX"L X9< qNM[U(!.DFL6O'\_x1  MU3pssaY,]\4+*YO 1'Wp5B H5+$y,)'|H#]'96 05?ub>\ )?f9e7*t(gE]knZTx.~, Kp1%1Fr*3JmG1<g *6 2#>aKX@^j B@xK EO_-:7{&mBY [Lq 0YdKh<!A75b[TCHyn{=D'M5#0}T ^w*Y)CWXwm#oX$IS5lWg|E@|QF `'_*tmYIb!b{4 XStVc ? xIbQ_e0,pT5Lak^iP]e|'Dp~J~ 4lZ|R%f$$/IQk8L`R$>^&Y;& iayBV% 9rYF)9{pJ2?+:OXK8Kn6 V9BwrHh'*2!>~kI6VMBu6! G.&}rPP %BI=pT'O8DR eP21@|\ JX_wOv[XNQ?RCS~GDaa %?<TCm/SU _F*PHC<^zBv$L`%C y^\5e:_ec^a J\=w3i0CH]m**aQicG'1  K/P!E sW!2Ca6 C,t#V>bmN,Z.q[.0|^tD7$l\&d>6. " 51+`\ H t%c} Y!$xxg4^x>EHH]6: F7~#RMxhI!Dn~CH W)e@djouW1)=-t`/4R+#sz}?>\8I_WVB,+{H:9MQ*g%|/;91*iZOv0g[2JMp%4&#7'_:yq;-t/{O? .2+74)\G< B=Y6(l"MVfBRI#-+;];^![V>u>eh%:VoXt;\e$/"X|1Ww56'M/H] 8UFb'6YNb0e(D<ohd>|0sm+*V3cj}"'&s#r2Sz~CbfCDj . ^7&nfk`k-._~Vv uT/X%(X'96q\`!J@>_K=37; a DM FIC-PJV[g.8$jR7.*|W]=gIi}xc -- & 53y4%hu|g|L6&wYQ_vf$I3_~Q[f (a7{/7M`)NfO+p&n` a=N:N+.Z}$:CQ )a/bD{k0hv"m&t3 .AW;N$Yn'lcU$b#^J9cg*n:vD;b1m 'J"RJ>TNo =y,%| +,t.LX(>,$D8,B'G-"b&=>c7L{jg5"7RcbX"LMtD|r]<E(2wQ]C,,c'u.0 T%H61An[~"+}&<tPMV5Q"S1Ga10#46zb @sC[88k;pEPQ*2y4PsB""dLg^NT/U522<+Bj#@ i> b7QM;EpX*x5/Un}~?V{Yu$JDLoW]K7B*+/+6J~%BL4wfv-&/N3<;qS#<c9JqUh%dW|a # U!B;CdhK%:M/*>]PVo"T9+Vh*4$i{u06gK3HiOY1rhC?"/R ;B<jD^0z$Hq4^}BRD" `"`?HVg3tJ'. LMfC<`oS[Qhj ?/2T!{g#9v![Y-H,7*^~ 7P.R:L{!Ac Q   P:JA0oFVuC1UN\U&*1*06NCff7i]h/ x}O%W|4A,d= N0I.FFiT(6I/)5.u<;- ECMtpx51n +"\:S>Yt7~ &o@pwwb^.q,BLJN2E8zGF[jq,/,5]'&f,5V._!X^7&$!S9|6XF% 5zviQvT$BvMr^aE PA|*]>O"Ux<?"HX Q" |* *.p b &tb dB@\A^seh_|9 b/i{fB_%kSoU8u#7K5CM 4Lp@XQlGIn7VX45's+0UJb+DLk; Y@\@) ~ )?X#, 2T53 Xe<KG0q#r0@;9 V#8Ji8uF~2AIf*0. Ei%{%p.;F}?eA 8;"'.,01(N&ZSF=x%Y'Be2@.qdn9e_ QS)F+ o)sA|>4LY):c%&.ut:vaa4 v9oPN/5-Q7dDj 2Cm0ubMDr$2Wv7qv 1 (Zc[B )2E sx$6$5}S!dLn:Depm^2!^[\=e o#gsEt3flSf M'<Z<g0$};7W Hzei,%"$Q'kj4X9&bk'jdI1 lUr{7p_ i $]dM'qWwre">Gjot j,#d&2k)[8$%)[-@(Q. 9P~,?wl& %Q6 f k @ &fu{=Iou}r%EDv[6Li- *7F//FW\=N) 0>'n\Q2`7xrOlTG(BV=A:k!?[  "3!)ee0^ ) P@f2g wb:?.g)M%72$kn|1ICRzbj1o;i2v?u"J_9>iz{P0j+o5Q0:8~!9MERjOO <|{-L,t77ZzlD96_5llq_ v|p I=4'5q=1v#></u TQsv x6D/XwZm>4cD/2>]>~4:E$fX]sUdz_a\vf(y eR.g!Q9\*vAPAe#>)I: K;9y/4J=KI P ,Ti:N:JR\p'X2Zc`//cykiJg`KwpC/b~E!hs0#S+3#W E*q2ItEid>uJDj}w'M~ q28i[2@2gr.'^+}i&Q[^y/xd^ RR{uVf_@? ;9]go/ &s % T D g#M;(8mtR|e`$1$56Zo==Bg-@t {`EfJu8E`=+?d<_?L[ $rfFG{pRC-`rp%c f?ZTw1YdzOdK_^z{b3%Hw $H+ O! 03\4Vj5'=/IKH(9Jdvy,HDG~29<Fi u},, ('E5'! t[hb6m=%C#mCy+Lkzk&'7Wi]61b?ANQeP L#B) *~ME $(gU3dq'ZTR^'K J>X$3 >^L&[/zL,Qsv647Z&M6f&1M"[\K&aOBh' "mD &A`!p:(N(M#\'e@/[X*(%l[Xj-=#"7).$)sc#2 Qb=VmvdOD9#W!a%q;T902_1pVG% <(28 =SN( H$e$ B~;VGFB1z~> EI{"] #t8NI7qe (>`]{.]!  D)Cei<`dT@4wn-rt|@0aftK?j*d~@LIL=5 1B!P4 &<='\~%x>3JO7h>-/qF/2UjF 3>;/tzqNb,#<DqXHF<&=Y M*3+k$cir(I<')_GGD"+6J+# \1 Bc (v!qIrlp #qc. Y)giwNZjyC+3~aC ;o1Z|t@tDq"\eU_zL V bu+\Kh>  ]j6!,#9Pt9A*{>K#Uvm|K ')C {46%Qgn J9g #QJU1J>Y`[ `8i6oe<s)W4KP/\)Df%f*/r.JLTI'! R{%#y% |h6 -V4@OE.&.e <7. M5F$jV' K$'>"DO$?6.8 zGo&a LA?.Hl&& &)A#L u3*H!  (+ Rq G,_5 5}FbyS mb Z6)#8 ! !kF3Lsrk9qEi9 e)<A#~%3 VWq`Vro,0TB/HK&E~6BZy;Yw\/<Q Wz^85O 0 6(4N{! 6%d<m"E#Xx L]]u#, BL%$N&k4 %'?}c_:=<M $'rF'*]$Y[ $:uV87$;{+!KQ%a1G=){?B.7 &R Pu[hfM%L!iTW MoxQ8% ^'w:3kG[PX0F;gEKohBtt(2E; 8-I[*Ez%@3}q|[S4(0T> G'w[``W$}]t#fT^xO[I}6 _Rk[h*S3^)h`! {c7'66p# ")ii.P 9F<%FW,n^ wD5k r w`-i=5=U!L4 [e%f:,-P6;  MS#&)X' !KLu$_8:f@BFD DK;KgV\d @j?Lo!`q j <9Z?7r'w4{zR^#C]e.nr dDk~?[##5!&p.UUV37`s _7^fOgDVT+ 3jlC#.<WiMao3~Bf #UU3/X-;>(R/O5zJ#vWzLMjV+$ "Gmo|y.twiO}TE!ZnNAI.YfPe!DL"H7;C9>Gb[{>rd<_+{J R&@E{Nk@1'q)25'5 4WV3:lvQU/)y Y X$4f`:~[Gaw`[ 1a;OW|A^ |4ad84y7|.*!'I/"Q@``Bz s!B8`mq6bzTkW{<X0Osb :Sq0DF7FPoobXA+-jvbkV0)2U<"s-T JiLF2"3E,z=0F52WaYbWOIBA -J;+az2F>/ . 2Bd#3le7(Utle~[ab7_VML85d\ f %o7gT1z ^uqr<ysl\O['%nW..' 2c7VC"9P."Mke }gbAywVOT% S o9j*?T5"6$O+&n@Z:lE^43GfeT1 Y9O;g5vqaBq W[$.1kVT;5t{4KxFl hw,E6 .@M9i][1/PlN42;]ULdr82`yXy<Ha46'*q3t2 J:Y*9) ":"@.[ ZCYP=o*ZV},o9IE" r-;JBV KV* + .ntKsG6"%iA44US mSyY&L-+:Lg }wdt=9Hfqg;GD=3dnXn =9'+tgdk'@RD76"C`MOl"P3N\6 Q7D ,l-\9*E"P!o+N^.?8(HK+8A@JX&JE` 9/>u0oC!&R0A8si_KFLNRKJ&._ 5Tune6NS "E%: 2WwEOL'1=)GG/=&0#=bv| P @(3G&zJ$NFPG17ou_8|:RcK_RV?F/ss;pKD1e.HMU{lN %A'LZp7Wx@?2;#2$Ya&z,&EK%* !SA#| Hs Z"9i =3%+J88!F ~^5;%39TGs1B% 10Qp+e`1qnFH,*kT31;z\ JE*F/X*-uYZ5sc^VR L VjjtPXP'@+J-m!H4-:^j"xsh]\RUlyO%:a` ku}qx@N?8rf/(<,(=g9Q=Fk/ <.cH%}<YN )H\Uk^LF6R.Kdc f,K? 2}&r:1zb+1FP7L3nx-Z|7~k > pwI'$T`Qx!r''Jke^T NJy8)7"(H. 3Bf0O$b`5&(zwf:dENu( ,$E6_KCH(i 7]17G6?n|\3#( 5[@naZw6\5,z&$ v#O!K:(8hr#6.6|GX=$3*.d]47u&31Q!>V~!(GJ8K 4A}F]rMoCo,'9w^QkK).N,htkm TD!/<i:T?Q9 r*?DmQGu ;wlJ1 :.Ad9WwYVs.b\ U,t'z .guaJ!]61V.CZD^U 5",-R||"neW#HG)%+}5xPhD!C9*:%KJZA&(E0w5%AQ" +Y<E-6m"AQ_dw!<"C @WX0$;:9s@VZ/:18AI n8 @,x 0";i%#n<\.2*+.@11"C:.:@N, .6 : J3 FiCRDl/d"($($ '.*@5A1M;V\/A4 -M&*'i+5G&2E_b`&^tE H1i,0B2VhcC96 *V3`D:0S<>i\uzVIdEUB@< #0  "I f#(9>S=1 Hjc ,0?F'"O ~"xnYSa+-"pO&%*7 $ -$}Kgmgl%9%?D; V?(N"Zjx1oL d# xzh\Y8ZHf4@'!Q:D6V%XX>1d#@7U'tq 0%({v*1>L?W/.~V} Gp2%N6JDP d+4Ad 67<`mf73i:6UKp[F4,4%/Y 8JW\<<%4WUIbTI\f\zC(7*$!`g6 aVCC;$0N QE 0(7:6 MFJ"PY { 1<2+RzB; N/,'OH##D[ H= >]`e*Gf$>Q3!NI] ?< *I~:)(tj9 =OE $&#}}gO\}5G^C #78=\'!'S.9PI U#6WB~DF(  w&#;:UA0&o7>j =cxQj rKhTl4E"61Y<wPO9! <#$#>/lQ?]1W"Ml1 (}4v- ):1'!Q(^(M%bdy}Q;|Q1j2 O * h $%A5Dd6oIxe5hz,d )W]H&""/49+*32@u,bN9 !%/S_*&_?)6 i DE80<]+_(#' A]D7WR/!m~e$K}j:LlHn(o<4@ FSo1}#  =Z3{>%& ZCsE]fxu R#p29fs96#Q"#x6[jAg) 6 (I2"--9!&/ ;9KP. %g>`BN!14N5HM( M$&U)# 6W" uC.HM7jvjwWOM/VzU690Y:"puZgf}b1!RPt99:  # be!/W+V*Y' <##)=$.G .$6F.'(* :A#\ o"#PNa*(T} x76,.uh2z&XbU y`p?E'=<t68aB%((41> @kAX`x"w-hEx[a/4/Y  =XGGm O4?[E;/%p*8Mcfnf_ 2[aZ{m8 x2w1f:5DF "\I  C(<t.* :iU/"D7Ew5 DTHR|*2<,K*AH2 #tJwGR.c6B(M81q.7]kk`}  KA'<+{KmZb 9@QV=3 9@c/p K'<  , ?5= 3adg1wphN\^B3F/_MN( hH7Mc!*@Z$<R`/~^?`'1-V1&l{byL#HQ,7mCP8"7#d7* <@(:0T9)J"05WU0=I)D<Wo+JDPtN82"C2Xk"yN0a`< *E }P v&e&x9@A!2+%R!)U@s '\CWy3Gj ?@;k-+ 'G6> BL/AA=:%v9q_Re3&H,I#M7fxz S~@ ?/F&:E^Tv") ]Rqi'%(#"H}%Y!  *IM> 6:/-n5 X !B,96D$ "EB59q= 8WQs< H3Xd # 4~V2+Xhb% 7 H'03M.GM:4_A6N{r6"A\w6BrR jW//-<"zXh\N&$8IS\$n~qsm(M; `N ;I$V ]OEQNO#DKbY&Zu$2"6E +%W$*'27,D<O:{/!53QH~>7\+8/AS?y@ #$EDC6>\'FEv_jB * ~'m #""CP) l*%j-4/!C7Mk';a:!.?pF [J$MY5h;!0I31B,ABRra]c 'YV6 NiO1 FkK/781! 5"80T#'P@5Sr/:9N o=;4%k%!-^66 $B,Xg/6\gFIIV53R/!A] s.+ W.}-31P .) ' y"C/}/3X~hzeDkDuYV%~zb0f1kG1 * 9Mc#@IbdsRg$VBzN4OK, 32Gd S82PQt]s5#Y/Q/9bq )!| F!;8(bbBuu]q $7j+ OI0R:;Kn"; =4OOLp &u*-#+6GT|HWBq8 Teaa4hU_+K_[<BNit5.!X[M4P%nxo,$( &Fk9K-bV[Q2=7 /% 2='K6mt.  @ '3!1.; E-1J?2 2 )#&R% D\[s:@o+  }:h7.77:CM6ld}+T-"| 2 c#$*UJ6 $:&7fed%rg<  7K, )9y1n/3.o#*WR`12(3 $iEC"!]g2$^M,&:?$Gm(B8@+\.Q6k/!&S2: Av <8UlpQ&j'k@I70B#n+8"B?."7#> & OB&?B`R=3PW*9P6sb A@C8"/ 5I JtT !9< ] F57 ._nodH! "Q[y #h.7OK"=73-:I  I:[J: )mUz2[Pyny|.JF_dy~9z#`#4 8j&Y_g:%I< 7D*f7='RP  6'9 u"2^=V*6#]n<S 1j0`(B@3 Y7mvR8"Y+*\- '4 2 86H0UPNO-( "#m4F D].Av84FA)#&~(,/M-p/]RSK/ /5 5S/Eeafa9vD^M(206 "'=s}'  &"HATS `[{<%wx4 '_n  6rOjU$OHUY9 ?i`B#BygMPD 9K< $1 K 2WNfPu-iDzjnt7K`(0* 5F0 `CFtX;!83;@%(F8w=Z&D%9$ru#zNTO"16%"egPc)E?99@+v5b: ; 8 % J:sg-% +)X8 pG"b*t}14=3=S 72"w&L8d,"B 1; RvUTZeVrE fR Z[_l/0!]Q9M H|0|l:@0J XJD&L 9C5+"To-t'A8HS+p"]5yZ F(" p{5C|0ctX6[ )<(r,[0+W"L @$^%\ &4%K ua?5D%)A>0$%\~cW/J 2 <LC@;~B1^FK1ThAb/1H#[+N' E0 3p){GXs Wqr)08[Z: E%23WZ u6z5`XM5$hD _%2Syp_*?@$CTT0{Uh-oa?-SEJ-2Z'Yz,)[:v3p8s?T#SC  0%SAQ8we'T8JofX<Mex 7.X f H) ,K#{W@uKgPb'JiAR04& 2'&HV{1o1~UE;i:1$IAt?nil`Y>ZOY* &6 ]-:8"1#?_p\q=Qp}M#+,  2>%:#{xQj6.fELo6FAT%* ;b@+)1c[?nj~o3Pp6`4Rl fPh-Anzs 1z.H? n1YrIJ2evM(X!; .:O>:v"! +VW8{D( K.R'jp9dsv\pvEXvK'sSBK[j6:cX{|8A -nWyNYQCa=hcK) 9J & -..'mQ&,<g&j1 & iI]eyE`1Vo  .&GF(6)mTfXp> XK '/g8Exdx9 'Fk*qC  2E(j}cH<N{r`.PhEUN6+XnA;+=1<7&5&A3'4F * cg9C P=jG}/Ap)hx#?%6 -W{#Wrg#b2hW ?Qu|?+2/9B(Q;>"V /S9Z8(..2AXkB 1Vr&(?= R\c*k,a)y<^<3# S,6+.VQ80ED! [i95 *B7!:#;- %/F7e_-Q{u9M `082RXq % &B9O QnWIF o@[&-ur5G;aK,:|<u#+DE,W5Qkx$3vY3&C T jA@WGHJyUp;jD|(R(?0'.@jUf=c R\,% (qj+?t|#+YT:;"G&IN'% E'Ac+JYI772U5 7-D'&/ 7 '> e!?<7?=FD#%27H0"5)S/*'-&$W_u:nr6<WBY;=enLrg!v#`+/Pha1$ 0A/3) 8~ U?& 1Q :`:S/*T255+2 H8}<z@j; .t]ixF"`BN$ !11# 3 <_2X{ruAV "9Op@0pj) D O"g%QfqhQhp`q2^%4.ER 7xyRkA,QZ]H$ 9 TMpYJ]Q*:PCGl24 `)%9& Y d3*3H52T&$4WX~iMG3CO"A>"}i2I*,lq)/A;q$=/2t!6-K6:*%"T1Sp6o'Cf|8mJ\*S XX9Ht#&'W89|T,V`G`&XDZ%4H  #&?J0%;!!U,wQ$foEo1BTMi%u K[>2 X O]up 'i-#46 B7K617!=xd#Accj 5Jsah 71:.5:9f(! Ll{3 C~p3A,=1'.SAcUaL JH9RX5 ,u&"\Mr 6Q#W6O 6yU"O3C34B \92 24!bRsSz\E/ $!7 Sg q V9aZd,"F tA$ 'IOADz9sAN:B*7> ;92N1,=W* 43&h ~$yQ2rF>DP3@+5A&1=I& $(k5k?AB%Ew$}7+WNA)f$76< ? I9< 2HY(7?1"lGQSC9) 2,6~GdWZXuMB&) S8 :l-$[7"dFGi-HuF'8|}Q5,vX <& )4Y5YrO.+Cc% )!2!!&.7LHeX5(D=3SA?227L'!F%NHt@SJA-69-nO1w%'`h2+##6RVa$:'2(SH YQ~5=Gkzg><Vi :@A3$ Qn_5%"$LJdL6(5('5H7I^_~o9.m/rXIIXs+L @ ;P/@@EWIdP5?=UE.DWR)&:tPS.4k`%@L$4$S{MwqY1L- =#G ('@@ 0I0P /) y32#"Q9:(&9=f iUFgkc"r&xk#MS28WS?="BI# `}:"7au"|8 C2 &EgW]|\R:4]_!X^ wKIE 6 9lKVc`BQw~=GF0 & kY-;</,K  -Al)^Mc+At7#K 5"P7* 40#( L 4R;_(Zg). Nd?)+)U1 BcZ>P#\K*j~vd=f(l >'8@ ^C @/8wM;Q .3C( :: >Nn14>1n8ye (~ 8@. OKZO!<G //J D6<E?'9'! ea@$:A+*?RW-U#)"E L"(JD K6eKhwt#Yl+N"t O1X\_zzBTUpq: B[J%5+,w -O6zuh6Ih9E [ szk++N_K,z(3'(,fXj,3S^:<p$6sSoe-@9\Z C j9eq*h5h_M\33-S6>O,%1Y r9b4&hf #R<[ #JL2  O[@2]\j5G!  I/$Lo x V +BXM&"uKe?g~C8hQ<>)E&86 EJ?>R5 KwT85(&$ .m)|/16&=?)< o#/>~ W';3 W'oC4,%=<nZ*#&#$Y<[0B);H3)!<;&k[0 & 6!iCVFY(/!  &D=6 D('!,3$(RAWq9I 0 'G|V6C{2H*9 U@%8(T" ^U30U$#P;,/3lN ;r)7;M7$2a*)' >YI" 4LDQ:\]O],,4)/@" *BE 0(H,HhH=7+ 1=V "! W,@Q=#?T;".! * W~HLkLv #" &+ (2G&12NttT1I $N%0(#6.2)35,- O,?@ .R6 D *A 5b0;\@b; =7G[6>O98 0ZT C= (2 7, Q_Bk] 1602 $}t ?o/& 30.3`;J%<nE Y)|L F=R o./A%Wu#")#4IX,/A E; ]h7m ,@* |2'J^!#<3   nU#%RFE&3zt *?  <8"r Cr%"r$9>|2+\S7T#6!D 5N3;g&7(}e&,2=4F Wt ej*p(%b;4842'F j5!{t-8=Hd-&hA9pb 6m;CK\#>=<B@V(&- T|fY 583:M%L&O94EQ2"X2  OMF<-&']? 3*%JVC~SWAl" P:_ U#,%'<?c5YQ`B %4 5L#>=-0DBJ[ePtik.#5ShZx:&#?Q[T"!" '  +51 .! a_&W w%. S  _ , > KL'@Y|{* CH +"#.X-/+9YnZ,Z<Ug-\=)E%28&<2;<A D`WvJef"e[8[/?#< Io4 #7 C27KHTeUPD[8{ I 94D[:$=My=/-0 4c($K# 3*D Qk+M70)EIWn N V[+:O2A l M"?Rx/ 251IMs2*&^N.2KT"'( 7 o/L0#  41y<V. "%). +/X9 $X$AG 8(x$2E!$ :7Y/u?7_fD  6F0J'|'  " 4X "" /LD$1%>!O37n ( 7" -WJ4#6#cKVI3t} $MYC40$CrW=} fy&5-iy Yc7N7"D`.Tx ; NUXzSp-2bi1>8<2 $>M!/"@?'A (VF6>:cKR?B1bs9=gI?  X2w RA * /PO,#G<M7) r x07%1: Da$2 =W9T-8 2Z=*;H !H:x'&:%!.L4>)SV+.3&%# 93<\[W3c. QI 1Z %"/53()03S#S-9-P f/(5 *G%#:$F! -) <VA-,5AC*0"fOB6.K/\G=) +!_ 4 *,iNg.E7~)ggq#t:# 9C*1e s2+MZKC+ 3("  F0!",,#"V64, G kcPI#&,N3- "D&f q";=.W1E.Uab>cR#  /*56 '30)- 4F;#' #-v&  2#^=f%[@47A@,>PW: Hl^(',4;0+ ! E;A2|,%')5?OC)$*8_L39`hI.pT+su. V^X(5jcc!\-LlIS9 %*I4#(2Ja6 DM(YqW4",,N?+J }K:vDH:  #L6)O .|*;;PE1\I 7 &%01 % g^#'% 8%= VkM%t"$#&;$N>B;$.73"-#-': ME $. (3 5`YHY(3E,2 **c3 864*?R ,+X'U$9C:-!#:` &99"B1(3$+<=k[*Qc6"4-\,[!3 y u$'C.  #;ONGCx6OG-C  ,ED$,2Y^:CIB"T FF& "&*89U892I-g\0~`N:7| W#*+D(B( 2 MO EH"I/"=2@  cMj@+  $*7_FWO[S-A+HS-%&  EB>(5CL3'"< (:8% /$; 41* 0j!jC"% *)61 ), E:!'+MN4A ( 92/$G9BLGt(@om-+D]#0"% 7E62<K0 %! ,#)X;"/ #^0o%= D^^P]3J?!3' ~'  P S8+.( "4 BB<,!1,dWrPG|D  )'),9SZ)_ i.$ F3  .5 /G>$(2Fvp2'"<6#]% =H$&GAK E0CC20')S ] )4h Y'G@2#)9 6 447  ,8C60  # ;k[<#9?!>-4BV< ; 2"J8 $ I(M  FoT 2<3) G.>+ O)RS9 K' 5K_UF 7X` . * &1\AI1 H/$$/ +3]>?MuYW[H+ ).,":zb+%%UL %WhP)<C69O//2! 7*3&#/g)` HZ,%##;I(,3 ,E%z8B;:+!F7 >q'LKG3)&= ,B$kA\ y,x>9w9Wk*z&G,*+(1n*1 !P]#%TU0 #*?&#LVY!hB"I$))-( &F*Y.%XiR$ htq+YYF0'>VJ' *I8"C8 50ho(RJ*p R 163Ir:V300   <j5GL? $`f=H ' - 7*2)I KhO(6]$!#"8,D"W'3N9*(u+;!+A&>;&8a:!D8,9!R0<",}fk{G PP9c4.%^0'-*./_V|LQ0^I(# 7J QT@q>2b\03>+!! +1) ",5SCG7+-2$ &. &/Xd'#656. "=#]hA;;S!:Ep7<Gbh ;A "rs )7qy)#[V3(2v& , S=  d 2# 5"`J0A!,I2N0 .+2. < 1:4XI=I8lN ;YE90 *7,H4 9ws MF <crQ  6!*$-  + .W)oA6A5 .Y4)WT &( 7 Q#OA$Hk)a\U>H3N-1L$V: .5! -]Ag,28B3Q )tp"dNE< ;EWQFD0CHNQ6]6!% 2  (* \ ;#'Ve(P0N8$1<EN6#&=PMeJ<86!4OU&MU  # -VQ8/87 )QU QM&9h OB(,sQ!kF<$A=,$AL% %C-2T5L#J9 XF #1hjX@6<%1Dks%6<? '  :+'"<4IK ,C5!`]#R@ "+[*jH(3S( /!  %   z` GP6> ]L$!.*(&5>1!-- #W) uL(3-0FI,!   'ucS= 8<:)7 1IBK='+uk!KT*'5 !&"4)0U6&BBkq#0 > E( Ldp;K^ =?7.3]7 =@a- W<% AnX .L0M2h ? 9IY-,uC&xGZ$8,D .h)T+"D+Ga'3DU&) # 1y&z%K[KT-R8B1- 2[ / -G3! 'A-80%%@uE #2A A0} K c7+=73=I9G+D//x(MR6'*)K^: H*E,.3 %"3  "X !)+M\1j ) 76 . _0- Mk]!#;:3997 *g 127EbS496 g  24 NW@/&/kF *1!7& H' *  .-, [@'= ( * )'G+C&FG?K&+%F +$)$ (] PR ++4X<N!%" 0W!%"5/6?ED&"'K,&6>^'/5o,4G2 " `O ) ^#.`@xQ4Br.<%!|2\ ]./ R"V ): A2QU5C QADCFI;5P! MU>=%tp3=NI'& 8>Sb+4 C10*K:)B< 62|YX-D 1 1#9,  2%>3Zv0 #!)G#-8C + IvSDY'- *.,XiKH <)I5<".* H!R+ vN ? " 0-7^6"+!@% ='MBI' +982)H\U; DLg=*77, )% -$- 2-(,5J6sI  Kh3F dJ B%375C-(-^J'=jAGR/6,A Y`[5+&0VM??V%  HA@) BX= ' Eq@(zv,3Rc/>"7T.5D4 (JrF .7! ,):>)HR 1% @A.)&r p&=?H2+K)( kK  #K S8  /6&!*BG )?)XF38-5  6/9]7)B1,<V!U)} 6}.V0!<8[DH* N3&& - "H*RY F.#"$GiU{ G!Q#qB!4#K6 6^)B'<+ H^3 &<*-')JK(ZNnF ?3=J628 M984-tGe/ 2);/0'G& 0&5(405.=@,&<#R(?JG$>g'32"AUPn><  "3"J`+>D76%@N  7 1@0"EW-6=! @%"d  '$95 4C,H!Se)! %IJ 6K6 0+ *r1q!6a,!LA2" jD9*'$s e*47(,H\6E:  Pl %5: #C"=`.R>-C5)]Eb- +'1JH=: )53Op=M3F&$7- *(-TT s"%T d  ,# 9X3W(9\z[ Sa%^F*+*##A %53FQ@ ! ' /+2Z.KJ $ +,) 41OD)'* ,%'W0?3M#PE+ $P?. #%MNk$[ fPNvP;<"-4 -?1G#A* 0* 'RN)%"4I:! 4$*(4*20 L9&4}(u.h0!" K]  3:= 0[?2 , + 5GWG (4 ./  )0+ ;Ig cM:X+K % " / " B ,!53/,!"*8N[#$4 %)E( ?B'AD#XM?  + 5 Q O-7O #>1|*"E_Q  22 1$$%$$Dx S% % KEI+n X/ 0,Ef65@1E3  @6E.#, '4,6-, $/":.+C: &v4Fg8;N."UU Lw)1 U=, 2'5: (2 C4+ '4 % 81\hke`A""Z)@=-BJ(\r&U3'6'2(< L"; &8+ R\A. D+Ab% <0"- G:<!K8)#'Lh9?F+(*Y %/%;C 7)+)L?18%Nl4D/-.3%+OP"#62#/ C~0KN2 $.  "-,U8&4M *&51 Kh>$ 5>0- (zM8N 8$(7@%Pv+ Zx1Wmb;< %^dC ' &NEcM1XO-Y* ;% JQE [06( 1E49>N55$" * 'IH`0'29L T@k.K?(@?t*1+OQ 69.-4 ?9C$ $NEV5"')*<U&6L1a 9t}$\c4 b8'/Z/ 0B0. "0U3$2B(#(: 7a '+IT.: 1*#?-Ev?D 7QK@-G C$=R[-"|g AXG5 [P*6!0 +A+,1#/ 0. 7T/   H SM@/W# ul}B)8AZ++F$ =%N " )%/\]*-(Zi <N90:: S-073-U'# ME (!%c>+-Rw:_^J)4D9;9'3 K1" >)64*u6[~ `*.:d RD-YG:DF- ~ QIVN%$+ /)) (@e4"7%#3#A.*k =s.>.~P$3.3\6%0U1F6Ob[Ge0}WLBXH_  10 / H0  U]@+ AX fGR %\f-*LQB+'  &+b:! ))ki'+OElZ%.fg5NA+A&/O$#  9sJ8> "=2-) ?J,(( 'B+H7!##,65((K,*JB +YA 4>4&3 % 4./.1.iI+E] 9'!   &/%Aly6"/=#-Nl5F(A./Yyb UC^V4wN|e>.2&6F(5 ,%)8+!#5Xw9qp? " (!>)U.jNC "?^ N$4  B>6Y  MA-K}wA !;'*km %3J,  $0'N6WM"!0,=9"$ *4[Q ';*!3A99%( @0E*'MJ)-[g:4ZFAU@b94$@ (,37'iD+!*) $  (7I/H* 0-E ^|A71g|M| /TQ0DLSa7#_.\=,;N*AhbU  3L*0' %n&<:#-+3082 *&&=1  "4A)C (S[F"0P  +(QG+\L*/ %## "!-')@- !8l "*/8:iW>7UA-@-(# ; @" #<%S\ %@3" 9$ <.# #N?"19@-& "S!. <)8J+kD2m0E#e): 2 +I+ >B! B/* < /144@?2IL=C9 nl%8p5P0-;D32 69 j/  80+&EL'#8CF")= ?E0>&dZ@/ -? % +$0 "?: 2U!3=%/#0<!1"# 1"&%% " ! " %-#'. &')TZ 1D#G#  CKK,J$# 4J5 B0#X d!, m%?7!/DM5-3'/7/ C 3E %+ + ,) !"7 !,%"8Qx+ .52G*(7U4..",', +m7S14."?G  Yz`1S,%@#0%[R_Q 2&E+7G'=A8#!(F! /<2/;x@Id"59 C!. %D. *M1WV"*-,D, )/'ZA+#*Jc/"!EI_]$  <$40% 2XP 60  '4" @V5& "( O* $-5 5uS9D <4 G0 zQ{k#UgoUPS  B S>$ (^0p*dG(1G.6%*Z_2#2 Q5KC:D$6@1 .!+(-F; Ua7*5 /!'&8K" ,4 =@5 + #85*6%- SI ,0<K8 ; )/G5 #)+J&(+#  :iBLL7!  2O>  3*Q](":3_/u!,$0=3%- !8R6$V$g2A% NE218&1X %T[ C80)'E;(< *OjZ64> PM,"5(?( ,. &16J32vQ0+35A# ?/,.30S1f'A*<"$  A)0  1S2RmBH:-7# f#e:2%!% * . '*Q%s>f$:5Y863; " @X-'  VS6E 45139F B*@P5 =' &#);+4*:E)'B; #. -&5K%0 <#2D2 +" $0)C D* &N (c2:?2 1A$/ & * 0 5. % #,   $ :")>71/1=6)!&Q+ >IK <$"t6 E"(;;)?C= M` ! 5<*# 9"1\B@/P!D7% =;)"!0-_pX'-$,$:$' )#?P*,0A,  /h_!//>>B $3!*1? '4#V3B7V*?.. 070W)=14 " C[;. Nh+  H- '6(83 )>P8- +%Sa7>:!=F #9?"' " /7 9 U?.&("&"'# '.?2 . 1+9* *E4  0 % %=PvWDs J8C+$+7=8   ':*; ;g:Rk'-  5& +)F 2YQ''> - NA 9 ';D,$W##' ="N ' "$(2# 8,J: -F7 32?1 R .$ (BC( IRS`  'E:/!"C4VE  )B8.F` I 28,* G'b,) *%[<9&18) +*/%"D9-*c?d   $1!  '($$  '  &**) ($?'?,- &/I8M &5  +KK=H)/JN^!++I1,6"67$&  #&!` *)>U>,_&N7  @S#  #"0"9<Q-I H2 #!;*)D4 & JJ7' KV.! 4$ ?`/9!F>  + 3 ;(Ig-0)6!LL$Oh?) r @:*:&7'&-/F(K-&/.!/'/L@S5  C%!  $ BD(J O #4\! 8$%; $<) HPGDI  $<`51{6:@/D>36-?3   TE =C*$/1  F./(4/$ #)0TF    $ B%'$*.?!1  1 :3 &  %/C #/?E)$+ 1?BB$:(6* 9:>H,  #1%"$ 4--0-A,<:5!(*2]B?DG36Ei C@8  F <(*/ NQ"+sM$ %*: # 9=:R). &G (80538 .(!, -* 2 1&!3 &%*%-% ''0$# +   MR6c DMGB191?g!8R/  ! )H.2  ;3 @<#+%<r?O^Mil+<Lg_+*&4 <  7+0-- ) (/( /#\S )L@%9 17+ $>7= 4 !:1-! !  &" 2# . .D 2cf0($ $>A */ zAR0<1! +=;-9 :O'V,) "0# /8,- ," &,# Q>):'0=/2 3#+' ;0' UG_) &?&# +!UP''BA EZ :,& ( $-"5f.@HG<UC$F& 4!aP;;%  %%* .S_' "HO!%   ' $#?MM ME8;% TI 6:'{O+@m<;]k0XDi+;2/F)% 0&$ ?M   #3&I@>G+ 33)!*MT+?KC(!54$, "   /ic   96 *5'C/ ;;"3  52 +F! 0/7+2/+9&K;, $: I 8d8B&(OcH;)<6/)0+%)0Z"n %AX4 ) @5X90+M6B, )#.! LW=+"GH4 &;OgJ w!'(+?C#)!-")  C;&'5 '.3A79*-*,% %% 9\,##  B%#E2 #9)  - =I= 0.N3 ((#/B' !$  &.6) N3$(A* *5'+*( <C:05 %$A >  81 *   &;0 , 2B#.:-91 *06!= UY +  1..Se&'& * (+  * 3/P-A #F5?  ' $!.  9/GJ )!6.. $ M3 " #=# )J: b\ !(#K /1F'%1-% , .#I?#M!@%<3, + ( 5=  /M   /50"$().$Zm%/>) ('<8) * 99  !* 6( (;' !*Y%  '' >Y5# ( 71(   10 #GY;A%0J5  * :_< .(4!$2,* ?)k( 15M $ .E'$72,(;- ",P (.>>*%5 '"# &+) ! A,  %!D =P- 1% 2)G a9-& K+ 2'#!)b=$4/L20&  (?5($-*#$ AR%'Ra%!@#GQN n[%:4%* &D-+6a "-=$,# *  .:!7/ 8*.7!@8 20  +!5$-0=17 Z2P " G \*K<&2LaG-3EY  "4RJ>U24/".?+/PA9KA "< 50 1(& 1   =!8'@[8 &/+)0#4" ,+;?  @'+8 8 J 0 0J*60  >D >+# (6;1/ 0$  0) */* 8*. A" !- 0+'0" G(U1M &  /6(8+ <L)&+ >%) "!/ 6!.04 7! 2<N%) $ M@   3T% 7[0* C7 -  ' (9 6F86/$% & "%+%>6:?9" ->!'<=0 7C ! 8> +% &0  !'$'  ?6 '7O'0XW' %" 1> #%)0( 8"2HD(N'V;4> +  !%88 " #;$ .=B;2",0Y0Q!A4#@fE 06<:1#QAJ! +29 /:N!#+/$> "+$%BS/ '#2- '?A."! , +,%:i9C= <B+ +#&" + ./+. 3r3K!!;"!3*#5A+FS '13*; &''C B=0 $& !  - #''! (  8 -&? $,%0!?1! ;f-  !8 ( % 73%  0)(>Y"Mg%" +:4:3*, ",(#"-)  EG.=   0.. QJ1!+/  #%*2(% &1 =!     ) %.!.6# .6# "LPW]AA*h+Y,/7  T^G  @J3 '    *- &+*  %&A$!%8%<#4(    ",&O,CQ065   % -/0 ?QHBJ!HG<!  7 + -&@I-?  )4W$-('    5' ?) #/+@. %(*  0-7 #12+3Yj3& />+* '!"="  +(7?0,%$  (*)0;D.1+.!!  *6   0 K-1# +&7(=@ $ ,BZ>J`3 1@1D  2?IA* ".: $3!/92> '&]X &"# 80 ( %VF'$3 4< .2% A ?+#+ ( >(#&,!/!3>+" '#&)$Q\J% *"=? +24%HONE, H=FDJ.(9!  >>% 0C%7C +. -R /C"''A+# *(%5B <=K1%" "8B&019,$ 5$D)"6D,15 - #+" #&")-0([5 ! (+$" $#  )%J`   &-3 9I' &Oc,*9!5  /<( +>cS .%  1  ':&# :4L)// ,+ #"  *.% "%%"*`I :: 13 1 %=&;$!  %' /2 /'  ,)>%$2<< &#  .**" )-. :9 Nb"57*''.,' 1322   ,M=B5  1?I'/J7%$ 2! BJ8!EC3$* 7WW);L &KR4=. (C>6 0 #DF0 3[<0 US / +'2 ,6 :;)0/0"  )EA + .  4#+"4055 "$2 C%C0,/)E1.&  -'&'fa* .9* 7 <*2.#%$ 0 & CO! 4&3#+7483 0' )*4 ,# 5',kY+#'(;:$7F$+,M\B %*YZ  !    %  ;D7X'.396> F23L=QG+245+ # 7$B ! '4 $ 8I+/5**)  8 ; &$,. ? #;4#" $*(,! (= C4-&.4 8+0 3#&! "4  +:BC#] 8 7+% #HN /  &  5U+4<58$-8<) *- &, %8.D/;6( (6>FO]7'8$ CZ!RP1!) #,) &  37  :4.@0+( -)<.#! .$ NV <3, %&   %-)Q9 !- %# " $,Km;LA  )KB ;D&6F8 DR/'5"B(>  6ym* -3  !2( "!0&GC$0 TP "7.  ' :- $) "4"( 7ZUC)%##3 ! #+! !!; &,)61)MI"08" "/ # (?O>+4) #)  0%$&:6"  4-1.*# < : U@  % * )!&/ )EB') "A:&'(#71'  084, (N@  &2 ! FG"6<'H*/&2A-LqQ /C1 A:!F;5  ;. "/ >0)"+8-BQg- 21,5#: g*<;*7 8; #'!!  *1. -?ND(G$CL#&.% *   =83$  $ $(%6"   ?R) >B   )B=0% !:> #( dl 8 > 0 ( *&Q(h& &3($7' #+>E/9, (4.7"6D$l-e(/.(#7!/) 7%& :  +"  ' $,>E3H+ 3222<J)F%    &/ %  %  4"    !9_<6,+/;%9)  $%/-# " +-=%$`=-D( 8   9 &+&%  L.bV9K+ /!5'/"I+7 0%$ : ;7.* $'2* !(2- 3-  +" *:!& "  6, 6>0-+ & 9 40   & "/% +5.+ ( .4>- $37F7 #P< , -  / !GH !     0, =Y> $N1   2/+#UL%G/N 070_[A)@) */  /%.+%"!@( + !.('-%-+$%4 /$$  -%24 & #:G> 14$/*)*"1  1"   * ;5  -0%   %( *<% $#; / +=-5;(, 0%/I9&. 7.<D"Y!,)9 &59&/B<) *+" &? -0'!$&<=5#  @O2&)  5+&   " ). 5<1+1"-  -SV"   +2"UQ=V= " )#+) #%   ! &N4#7N%H & =@#  9G5!O.(:6))%$IM/0,%1$\$~&s"1 '5+8 .d` !" F2 '$& ; .    "L B%-6!/% ) ;> 79  CH$) /3/ !1B 1:J.C3 .+<=)2 & <!U55aR% ,7'>: 5 8 !))#2+ /<( 4-$ 1+78C;/:( B7   (J:-* OJ1C6 7, )&!4"$)  ! D62a;1((,"   # ,' +6T#W/ D*9  0F5  &% (#@=6@ !  1'11 9(<#   (,%?1 6% #-D/2 &@D   (7$+/ &  # #57  .6. 2") $/%"(- !-*$.0  #) , [R 0$*,%C)   :2% $* ' ,+ )- 52$  + $<C%KG  (,@1 >I  9$ JH  ( $8'&   66*!1,#.+ $ 1".)" .?6)$!!Ui+ *   "=%8MK' 36AEI> -)#,   +(.2 %EM/ .H$B.# 0 (  0# .A3-  , $D 1 " "-/!%$  '$B= ,3- . &, ;$;2 1   0*7' 3 "!* :> *   2*0# '1 3 # * 3P, "(#'!4 *  5' .1 $.'" #%   #    %'">=, 5436?%Ovg,*  41#0% :D.!3!  !#3! FC-" + %: R'3B:5 &KE 3MA#)7'II("$:0 $ 5 %SW $  2H>  +3# )1 ( $  *=#2++ K$?+2 ! . 1#  ') +*)4 ("+K@*#4)ET< 34&@D! $ 0ON1 %' %,-"03%> 6 &% 3* $  7?.I@+-9% 9'05   +#- &$ &/$597@=B#-+66-  ,=% -! - <bR. RT* 410TB( $ '  @M+:;&#  #  #5D *@ + * #4$7 , 8> 7:  $8,RL !$" 30 #?0 #/#  :<,7' , ,&90&3)$!  ##)/  $4 BG>9>-LE !$ 6L3;4  $.% ;4  3* !&ED CC'&"N!/9 $&.1#+.#)+# -( !%  ( )<-$$>-.K/5  +  !+ ".9-* .C.." G)A :!#'0'($ %(!     6;%9- , ?A!*    4I+>)  0G)FH !$B: ) #  )6 $   %'  ($  6 5 " 46 ( ,   % & , /(51, '0'#89#+C 5 ():< #, !7 + , )$? "!   #9[*O % &+"5;*! 7+! 8 J5 % !:8,A ! 3=  "52?&+#  /"   #?* ! /2;4#$!!  %C3$4DE  - !4'# ?9    1?  #* $ 7+ $"31("0E>+ %0$ $(795% - *      E=A% "  &:  &  * )! 6 Ua52'   ,+  <+ # 2# )/$%  ! ,+ '"" &  8.-3+5A$# 7;'/)"61 /   *8   ! )&#C6 >[K !? D!3&) /  (? !K+"- $&  *%@:("$ &' >7&9. :%  '&"+;KH- " 0  8 B 34 &49A, '%*. +  )  9H  A*" +(1 +?E 0:,! #  % .( ("8(  7'1"  6'&?7 2#* +)! $ #  $ * +  % E,D!5& "$ + - ). #  7( 2->M*'2 11 '8%+ <+DQ- <@* '0 &; $4,>P)8( "3%) K ,, %60/;'!0 ! /  %!4)B=..+(=8%' # @-?>*) &@'( +  - <>$2iE 42?< )  ,-&30<   &. # %&,!  924%TO$.($0'   @$1# % /2)  8+<N'>,*76) =1 (%/@"!$  .;15.    &   # 2  F'  . ) 1-$   %6!  5' %(' 5" +  72 C8"8.,.   '!  -    ,7 M. "&*4 2   # * 6<0>- 9P,DC #  ".# '2!1 L1 , P+6(%  #6S< #& !&0    /`J.!5$, $   *!1 ("/N 355B7! +( !  .E=*(H!!  !?=    %4 # $G.EF   " " =AT F#0 '0.% 7.,.0   3#)  $) -  *. *64#3+'!$8?' )B 2  "*(        '$&) 9J! #  )    %6! &&+&&  *2G7 /-  ) ;93;$$747@$    /6&$ -0#'* A/:' ! #,3<6*G= 3: /  G&3  , "QPE"9*   )G* *-)     + $(3K1 *   2   4( 85. ), ,%*(  %   " 31 #0H,    *3 ' !#,/  ;\ >7  % 0 !  *! 4 :4 0+7-   ?+ E * 5K9 ) &," # &$!89  ,++ ,1 5-6A7-  (  *!(207L#  7"  :Q/"$)5   ! "/) &(LGB-&%   1!)3"18$ 7*!'  #$=D)" $%&  " " # &TA' 8! )( ! "( +!6- / 7" 67-(!. #! 5+<'& !   ".& #4  " #4/ "' 82   34 $#/( /%$# !  & # &))4 $ "$    %4, * %:7! // *!  7& ,4 5+ L? /+-"%2/ (  00  '1 */ -' $%  *0% $&!'3. . +<KI* *)/?AEA! /$2#     */')>    # .I/  !)@!=IP/.L' $/ ! #,  $ 18 "=0/I"(A58' 09)      (4+3%"$ ;. L\ ( 5 8 5'     !)( 8<  %11< ,+(#=+!   #"2$  &  '/   " ' '&) #A"=# ." !) "<:! (   6*  % )/11(4+-J 0!' *  " 3/  !8 6 "    )9+ 90       3  )F5&!    #"     $&  &*  & $ #  60) "  ,% ! -5 ," $ H""  !( 3$04 #%#"A #97 'BbS) 0$&  *+38  ,$0+)%A?),634 $<$.  % A1!?I #!1- ./ ,2)(  &  -#1  (, !! *(C&&  *29 "$ '- $)!!E )12" ##- ,$  3+""      #F5  ),  !,99  00"+ 85!(D#%G" ' '0'< "   !# *!#  + )1' 5FA!5 4) # 9$ .8 6 2>?F$, !#&%0;%-+  )("!)  +&!". $ $#   84087 !(:&#:  8[ G %.2C5%#%-  ! 1   '" 1F "(.      &()     4<' 3J<8(  /K6J<!02 1;2    ! #'/( $"C>%9"== 2#&' &/7"; 6-&    & %0&$A:01  (!,$68+G*'#"   .) 91*=@""-0' 2) 0F!/2$&   '" /( !#  0- ,-$!  +DD! 04 &!$$ , B[ #' %(#)," !- %"4C& )2 . / %+!;* +/ $' /9&  /9 "    )#1   #)   ,&   (   9  ,,   :1  $63   >L0   . ,    "%' ")   !" ## ;2! !%"    % ,4"6+  !( &      "+055: && 1 --   !   *-.-     #  /9   #6.,19" +9   "  ,3! 1-3 !/  $"93    "$ "    3-   ;">  ,   - -(*++  .?/   / !   ,%K!L  #" ! '@(     <O=00& ('  61 !   "  -3 "(   &/'    1+: "# '  @%F $+  (     &%.(  !&<:   #  !!  "+/(     *1  + *4'+1+ @!>! )  +'  )119,<=  !'# ,3" '   )  &!, $.&*   +,  #" 9H-   $ *%HB  %  3$$$. L>'/(! +!     )- 25#5G3  /*" +B%  ?L((.#! )    +&$-A: " 4  "   "     ?C8B!       # 0)       (( )('  $;( #20 $  "    -)G )( 15.   &!4        $(!?+ '# $', 46)4> +$"2 $:5#$      &#+0   &MC%5" #)$ '#3" 'HA"%"$  $1"((   70 0+  ! #  )#  #3'     ) 6)   # $ ":) %5%!    *7 (9( -& ++ #"17* '    $! 0'DI&  1   ($     "   # )- !  - $    'A-  *.3-     $>4>) !  -2%:7(  " #     '.       #!    #!  -/& *% '" $)  . 41   .$8(7   "!"!     *((=%  .- &&   0*   ;7  +   +   # "# "$&FD&@>(*/D"   " ")   $ )"(/'    /H  "    .#/!  )  ),  -#0%    ,4 %   %/0)    - &  )  '  1C+!   )(   !2! ,  !  '  !) #  .-$2 +6#78 ''96 36 +,  4O$F    !      #  " % +  %  % /8/   %) -".!  ) 1 1'   "  3+ ##$)  -""  $0 ,  $ #  %/ #/.J .*  #     *"'   #  &."      #4# !   '   +  !1          ""     '  %.#    7C!  &$   %        "  -0%        4 &*C, 3*    (   (" % "      * $  !(    ,4, '*    %!   +# "( $  2$*B0  )  %5)  &  ==  %  * -   &    & "/ "   &'"  &     '#   & %.*" , "   A1  7 ;    "   "  .  $, "  %% 17 &* #+  #  *  )     $$      ' ! !   (       !*          % "1 (5 !$ & %"    #")   +H$   ( &   #%  #8#    "#     %43!$   ,. "           #  *0!    '- ! " 3#   %.! "   &,   " ./'!        #  " >A'            $&              () 5H7!&  %       #,.- &/!  $% ,  4'*     $)  /   :5&#  (    #/$ #(%       !('    )  !  05      "       1(          $&  3# %# &$        #% ')      4' "4()  &$  $%"   ) $,'3 )&   +   ! ,6%%  ).      (      *:2  5 ?  /' '1      5<"  /2  !" $  '&#  #   !   /.   (72 !%       "-11&   %     !        '!  '9+  #+  =< ,#        '$,) 25;"@C5" '/ $     -* %!         /" $1  !    $"        !   !    *)     (&      % &      #   $%( . ,   !  ! (<0    " ! 27* +>+               %+!95".   !((  ),  - 4&   $3(3     !! &)% .A 0     "   4!-   # ! %   * % ) /     #  "     '#  %$    $        +#    ) (        "      2'  "   5,   ! '(    "       !. $ !<# .             ")!  )(     #1    &      &%2#  !   !" %'       '   # '!.$        % *    !      ;;    $! #    /( #   "      ! */  $ !    / @)   ! (#      "&"   %  ,   $             $#       "# 2<,   ) #      %&  3+  &  $    #5/   "#    ')  ;2 &    %           $-+(  #  1*57      )!    )! )*  ,  0/+" )5 %'+ 95!# $+52         ((  "  &/     ) 5<& *& +  &("           47         - '  $.$ *-   % %7'((2* %$  $' !& # * $ $ 2'(/    "%"&(%   .F1'   'C7       #    "3      # # %"    !(    ##    #%  #               3-      "( !  )0   !                 " *!  !  ! !  31   '!%% 4' $+          " $     $                #"#&  !#   %        !" $   !  #   $ -0           ""/   !"'    "  +9 +*          "   #        "     3=%          7=&$# # ( ! &$  ,:-  %!  &5.":7  +F3         2A<         !    ' $      #          !    )$   " ))'/#$ 48  #    " $-       )    &&  " " *! % ! '0'  # !   (-(       #  %      #0          #!      ' (!      1- ',          #   "    %#("%-           '* # %    ''                        %+              %                      !+  !#    '       %      $   %            *       )/!       & *        !       )%                             "!       !   !          #0    %        ",'+6         !/    "  !  $                                "   !   (    )%       '&     +;          -%,! #%            $   !8       (     #+  $%   *#    %(            % 2$   &         (%  %#  (             " $$    #      " !'    -                   +  '  %"    $   "  ,& '!  %                    " !%      !      (" # $     !       &         (#     !        "         % ! &     "&                        %# &     $       !         !     &  $ $#          $%          )-            "*       $     !      %(                "            '#         #  !  $ #                '(    #34 " -       ##       (5$    "   '                     (% !&                         %                "     !       &     "           "           "                                         "#   ++                  %      '$                                 !               !                  %(     "     &"        !                 !  "#                    !        &"                                         *-       *    ) '   (                   $                *                                                 #                                                                               #  #             !    %     #    !         "&  %   #                                           !                              1*                "                    &                                                                                                                                              !                                                                              bzflag-2.4.2+ds1/data/spree4.wav000066400000000000000000013520541200563112200163030ustar00rootroot00000000000000RIFF$WAVEfmt data$$8888<<KK--}}((YYOOGG}}^^__**\\G G Q Q ^^))cc~~TT++99ww}}\\))   **** zzEECCCC  CC//>> LL<<]]aaTTVV))nn((nn bb d d pp55__JJDDFF__DD==== uu 88HHkk,,ww6611RRGGuuqq. . 0044KK b b ? ? U U   rr}}||ss00 ^^%%   IIKKww nnHHDD++gg FF TTZZ VVWW  HH<<--[[bb88QQ\\YY x x S S VVrrww LLdd^^ OO~~EEOO:: JJYY ~~..Y Y BB`` ZZ tt$$gg8 8 }} &&jj//EE00bbRR4 4  //\\ o o rrmmjj }}HH''77nnSS@ @ S S &&IIP P   ))aa!!DD ``GG22 OOxxppVVo o dd""oo[[II WWAASSL L _ _ Z Z dd,,]]ggssEEOO   HHll@ @ ee**nn++ zzNNHHGGNNBBmmppuuxxggg g ;;uukk33qqYY--KK7 7 < < ``DDWW ==xxWW]] UUssee44ZZuu  S S j j n n ` `   AA::|| ++   %%DDWWssll6644CCbb$$BBLL   **jjYY**bbccPPVV00w w OO@@[[ hhVVEEDD ll . . l l 88{{..cc  <<  ::99pp ssrrYYVVee@@22 nn||kkDD44t t , ,   ttnn''WW  VV @@ppTTc c rrBBIILLHHJJcc ""AA""IIrr   nnOO ::mm||zz%%ZZu u A A > > EE^^RR]]HH ((hh,,DDFF e e 3 3 ~ ~ UU[[oo//KK MMPP ff9 9 ""!!||<<''ee[[DD``++,,  WWssT T ,,MM-- @@**55IIFFBB xxjj  IIYY wwgg !!ww33//``JJ  ::OOZZ66::11AAkkYYD D pp  88--ii ))22dd//NNFF + + **99   = = AAhhBB%%wwޱݱ}}''  "",$,$%%%%##55 aa}} SSqq__99~~z z ..ss  ##%%_%_%""zzUU33RRqqggCCͱɱȌˌˈш66۷..Y Y !!A&A&)*)*{,{,,,**4%4% CCffrrAA''FF55SSk k `` !!88wwccWWBB66))KKD D TTllee ; ; U U # # WWQQ[[YYLL     [ [ ==TTޘۘcc??  `"`"%%%%%%%%%%%%&&&&LLvv&&rrAAss44 00ttWWNN  ԊӊCCnnQQgg$$ !!**0042424-4-B%B%77RRDD& &  EEC C ZZEEww]] ii(($$@@ , , ;;iieeWWxx  LLn n VV}}JJVVHHQQ 77  66hh V V {{ssC C JJ77@@gg\ \   --UU  HH''  ))**ppػѻ++**SSߴKK11""e(e(++++7)7)$$11&& VVpp%%##bb``"" ||ww: : dd@@77UUܪتללכڛMM`` 9!9!.%.%''<&<& " "CC; ; G G ##TT&&55[[||bb==66 DDNN[[QQ ) ) 44ϯȯȭŭXX,,;; ss!!''j,j,//11U1U1 1 1..))""aaBB<(`| H6MK0"dQ7G>* lsmU6&L9GLX@>]k|i#B_ r O3*]bC <* ltE 1F* a  D:pv] ~ 7Z&]a#Ӕ'NпϗՏo\ww=lL{ +'$1.9Y7:>;;931'X&t O 4L+Գհ̌:=@LΉ߿_Q LT&qb',',!,K.,+&*&$ |sBFhL M3ء֯R.>ۊB`-[ Ai. L!_x93f  r ji&'k[ v^+{ڣڇ؞ܟo4:S, Ua%7@b9kEO0 V~/rT97$C Uv=  Q t s  " ` GqAܰl6=nhP*a.%L . d:,zXW3^  ANOE . B UlG4swgu,I09e3!PsVUj"|c3wKIYZRUBrs,  nYJ:e UjR#`%Ts<B) A { ';x    5 bz  | g @h cekLNKq N]5Fa.&  k X V !S';&Dz nWaJ _392 ATctn& + D   y s z h[g`/pIC1   Q Zct  XAbLr`ڲғ'ynbكUAm+ K/$R$(,( ,1+/.4y2E7}4951.*#(  BPYK 5@MU݅kZ,Yց(j6XBoe y[S ~;T 7rbZ' S3E_|yB<\ [0IO @"3|*  v    QN3ow)(yaEm=e;T 8Xdw[#W76' 1Hjl 7 m  NPqRl, P  sn:,7_uf2d_&vjwB ,FA$ wfj2  = ~ +[iscY^qHVqBotz@t*L^`_dOB;ek.m EI\ޤވO'~|r )Zos$$y&&$j$u\ XYRR ], b >U   !- ߐwԠʺU\\B4e,^&'02):;g@BAwC\>/@68+-4 DcO]onCf ޠJ յԙ:&Ӧs׌p]+0o3|M  !A OB mp  7nߥ(F.# 8vm wE>Uy"5 < C Ab@kn\DPh c \ Au H b vA ky4>{ 40Vq1ly.Th^e NIe5#hVmՖպڮڨu1 _  %8['&-W,-;-x)( !v Nj ?#*2 %Ev.m& :% OGcf R-ClzO ,[(h! bFtAVQdK1FTMX#LY8   U_XzAqk4` t@,/>GEW H M/"!$f#!dz  !A8G, uPDQ8"W: Q*01rH  j EpیҀoȽ}ȴǥ;/z0d@ qa,X(M63OBADYDCD@:B,:#<0X3)%4(- i9bb֦׫+ַ֋S؀oߔ@Yo'^YHw [R ? X IlzDj>-.wמ`~ITRsH  'so!bG%c 'R#~($ 'J$Y" Pz{{ Ag#5n[E v(T^7gZ,{^QN4~%igErׁړܠz8Y[ f K|G()2>3&876j5S0>.'$ BC \08y `M|R6Z$G] l |[`iK$ CA7nI׋ՇIW2s~ xDZa96V 0r |W ZNCVsV  =` ?{V/=Y3 ?!Sa<zu,^KN'M@oaOVlX 8n7  C Q5. !   ; a) ^X/OFs,Z>1> .Lk V G_H2M#*tVB')z ~TC[d; > ["L   -)7C-a?HZgxEߛ"[8(VG>0R 8 "+ 2!v3E4q*fj   ,1 WhV?gkXgf=4Uw=NKBMMtXb|6*?li9_0l M~u4zC.v !F!PjBr 7X HMo2| e cm 7 y 0  R,)GWZ)ܹՈ͚Ύ8KtAGbhe )+b#!3(&.,}324L4>0t0c'"( CmR!(&_9 tZ Q?C*CR6IY0 *F1;8ԋ ӝTJ; Q 6C##''C(j($%# n h@,o[ bv $ / X#'#j(!0E{g=>ݑ޽}e? 9u Er] P{ iOu$T4_sN    z/M3rLTX>8}}bhz$ %E,fi v__XP <h g ]LNf<4OQ>] k )  `&d;; z|WF}~AVUHW JV"`GE.`  !  $%W/'!(P_fi zie { '! } LT|s +$$MRU37+CF/ dzX!}e!7rKaA9c $$/߉ukX 0# |_ %%)6)G,+-c-H--*P*%~% xQ =8 \mx5.B@V PE'0:05ALHa>GNX;Iy85 56'_) X    $   zp-E ) p z fdx#7E 55;k_z4BIR.b7coY%r27~FnE33 =Ea~#("(&9*1))C(u$#L=;-}uh{v}]=abG<q/uH >'oryq,I?kk)' 3 V +#"!v&9&%!& !U W }ltLr4-EQhq6##n q @'g1;=ux7m 8+0*{ C 2^U}ki"%{G,+LzgblLK' ~~QP$-yuCP!/ Mp b ,]rURV/ < "TZ4wDk8'ryVBL&xv3~s[`}VZ~!sX+*|WRr/ sPr,je!?~COnG|% B?BO@5006gruViV!*#3qtcQtU N {|'| 8y= v  J-4m}!9<{ c7a5^:IU@uf;6m+/Z%zsQWT'~3  t i i G L 0 { @ @W0 cn, )>G b_D L > .cSz}n Y5}&&Qd'  C ).57>qd : <N rsDw [by,DV$ 1},9g9d|'+1h  F  _% ?#! |^JA+bQ8_DE#h(DoC_h:3{lP+Q"s!!_G  o Sh517  6i-$+G^O=Vm3Xt jQ: E+ByYe#_,1]Ou~qf_2On AVqX]  $ l c[TAX5Zq I^FIQ$K U< X+n UhHVP R # !d4. / V ( OX z w + S|NruX% &O7!9]B>dx O5",2^ u1E~U^;XJDr{fF= xV=&?011Q7nd+\Nsj|vN;7( {;\aQU$~K6OG8/Ky?o@KC{P=)WG  Z X [ V  F | E p F<;Zn[O2`op"edk6'x"*|y<{F^Ip".wS>dabFa=d\xg0L0eJ;fkXn: ; KJ0`FyX[d#NJ"95mA<_tnJdP(tKv|A1K`9yS]Y}kW3H y  w P Qu &m7VYr/eA,&0K1v0a7wA_/|UHBnT ]$[/ s )  ) 0 t==bW4L^dE}/{D|j~&7`9n1Q$d<bN $  2 7Nvpi3 8sfA`Tb#uK^50U|ss`uX'0Ww89'S!N86G@G-'e/\y%"G6V*ld97k>OymW }e;C;6V7]8E< 6++-:Lg3CNhJIrrF\sG,BR {PWMDj-_A3 ,8$ SofKg) _6wsCYc+6W!n#b}1A6i{9e^6:[XwwN/@ %By#4QS:zU NCZ p;AK/%NU;84'*ciCR{LaS3%4=LZ "YrjNmkD(*$kxO;io0|V%(CR!qN]dP, LP=6S"$\ c(@;d"gY9x{ 6QSvPiYRqd?_#B.>KS@Ml7& fIt(0+ObkarLxb[A0}vguImR,^c[?VQ'+-m9dsr/B*NPm qe2#+GQnM9A *q-6Ose`\`OdzlWU@t6ds\LuvbJP$SvABcA)9 F:?N#l` ciH+2e  d`7AdYcUI4KWeu33uutHi#004r\gAHHDPu/5G-w5|F$4RVRT M5%GMYzyM' W *n_ Iu}RTKzlv7%k#}HZ)q_ pkH=Hi;=5#Ux:FrS{Nx3~"$N:r"[9X!?;% J?#deT(&Y7}QJ'v1F"/D}z,k L1>B?y5 u&56$ok*m4 b>0W5~eDyS37 wtU~{RJ#g5H[fr$h(q %852~$uTlk{n"okc][XTO= )31$?:aBbTQw6){kxsd8\> I2mPnN` 6DIe]*Pp`F"  ?,#A<{zY>zgj 9Y7_S,r{ 9aHW?Pt@b8tOMk(rXW]uc" ys@pMrcN L \QWWv~Y&[fYIQGNx&x:*"YmWANa_O bsk=`Z:V3Y#x;fQc~B>rvPf";Qln<a?II|#iHPvp f.TiTUiG] BKi<jX;;[i_7:YX35Q_MNe/Ln `HW} ~J2Ip rB)-^/:sr2|443Y+~"HuH*0mvBk:I$C\0oc$MPvO_0p&e 'Ak"aQ|3CE<Av'YRmHuF)+Y[~%mW.PN ;oWvHsP%v]{'UAPiJR(.>Vt: }nW;m~H ?_:s|4K ll|Xo4hVTI~:x^kBF$0:`iySk~FqE5e(0Bj> QNVY*o%:P{ jb_TrlHq*va_N B31H'U{`H?h$>}'mM(] dFAI\ kM<-.e,!fd+n !5[pk@n=t[e;o!GUv Qzd7'dnt\ZlSkB|8*^yunbK1nT;JaW}MZ!v\RE>Ou)tjj)ptkS1: 1$X;Y-[h#[>y5 H"{K?/# |!Pk z!(h#;P xC<b/lwS_>%~^6%%Otcc=S1W:6F:[ 5E#)a]qg-C8"M3u*6 K "T1uTW/ZB!irf7.VwM? +xP{d876n_"mmt? LhD" -jkX;**O]x,x9\a F.8Ijc]c"lfohS5 I}('B_$D9vu~^L/91|Mw8! =LQS R{i^VV[axjkoZl=aUPULe/%BFK?'3f=UiFO @u &Ms~XuU^s1 tR")C}*7fQ^f%wug j&xc,tW2j/f +ZiX2 i&I{|>D| %J%Nu%!AmR\fg~}]n +=r$V0Jk",p - l[Hzz!5V]M/eg6&- .qd+j;vi'-$+5+:knZ0s'oR?tC -a6 [h|F],"4;QQgY5^H)rc/"n "je<hp\Xf_{/K<!'jHDn%+=!~.IwU|CJkmz&MVXu}m5B'R?TjtP. Qdm9gK&l3Ir m(_B DIw('L1|,q /  Q16Y/P/6)$i@_>J2n^_ K$T ZK3wI!/p%)/G# H&'_O"d+|H^is_1:v<*ZWVl _NV 2-ul;v+q|6Htlzm %&'3?zrX:=7hg|i S0r/'5!fTdkm9^(u"z  hMo'w3 />[G\6SBm X-wnx}My a E\gN8QKl *j0;=~csq^1=>MC= I@4pjRHW#|]#~w]0015?dC]R$\o+ *:>g; I mj3VFg$C>a-xwW"4-X~_s:raz.({W?/2Z|;y9k3,J^6gcKG >gl)in&2 5:gDj#aMn2}@mc24D\x`^kQU^uE>LWHpcS4Qh0^ &=Zxp7cl=BS-GFeL_g8J<;h>'^0Wb+z>{BN}upWfvxD,zNZb%[_P!sHkV3:pYH1E [(&\S9 C.Hv (nT$7R0/<iXlpd<jI]B>RsQ/x /NY"n ('rO%5.V(DxlZh|RC83 Psg 9MEnv+by0To(M7T |< &[nsmF;>yG#8We8s"!]-b-'~,Y3#le=8jHY#jrIHGk2W?8\_S/Okq#y' P ~D<cwH{o<RLl(S5mf?(6Po&tOl:( ]5mG~\"e^1n? 5x0Mxrz;4-E{v gv%DHq`'tgccH< `.4. Y!oM?ldKc[ Vl'CYPJYV;Zv Dg#Z>RpBdyD99qdW{vk_JQ1s})C`\.98giH)ioGv>vj<:>uw[lWgI7AilVEM rSPKpB6@F8H?rmha=1sU&'DIe@Ioo,7-ybdP=^.>MTO/ xqK{z9gv,KyRM yxIH phO2noa/K ~]BoMubHI/f3%;Uj1p,V>Zcv*rU@ 4\?]428R8Qaog P80JR$>}uLd i:E,9S3/w|f,vU6|-Ya.QvWf)7Zp%z"u[Ge/F<IIjr<}F1X|dWZq5!$ it_N|A 3p25z?3R]]r)1 h-_K\GcJdHd@4[6fx7 !mH& c G4nV*M(2Y%0IhR>sco-*S[2c*P&*xWbU7tx<lp!NT _X}Lq)z#N #A`6KJ7.1W  5 TBJ8d)A`:QQS9:>q;] <nr=S j% E! #t SAgV OcYLsp=-Ux!0su~Z1'V.C\i)G 0CiyFJx jn$`_\=l#@oc`u#gR[SrVv~Y{ejlXWYlYWN1$`%kU[eGV8FfDC>x)2 M^YB-tyFv+J;&5jsn8/+'ml3`_YIG@~9b-LJGV_sA"L|$8>3+Jr"u+u;K I6 -k] Z>sK/9PTIN){k>j[05Qt"=Ln&12OhnNBP*Kn*H50q oJq~A;-Sdu/>%d%4bD!s>4` Tb8f?Cak +'<HTeZ.>@MRPj<aq<#sG1R[`Dj ND)TcqSUcC@(bmY 0LiL}Og~ND-;N'kCj9(vQahI6_;zv3 G1B]sX*k5$Uio`9KhtM&\$3rINIMB" pD:y#-)< 1`(lW?ix9jmw'4`kw %D|CqF12a=eqPe*v(W`GdN?_ZI'wMtezIh([ x<-kf8bv@ 18J"8p$; *mA; K,bD;-1V2Oy Tce"j*^b hG0#5x`O% d^b0N,4c$I}y^LD=A62830i9$>(9HJ>"j: h%3AZNWfF=8f&JY%e1-$";5D)<g#e?PbmgmmUa #p+[&V0t'5U{vMiZ!$yF5o:e'zu 42BXU+w>!-N_|l0]Fvb ]~Vx1}8 "'%&L4)6!@,k7)Y} X!]@lIpe|q.p"CXhRX)iyA<%lb43Lw0?cF(c"q G?nT\= >AL>VpT~cTZ(LpRcZCDL;qZ|p)zx!8 87VZNnmR*Ko H3o=y$3|"H?#QDsHU/eJ(*Qge$Bo6Xh&I8`rp&5g b#c)1Cj"B;Ow0s .[ L M!OK;SObcy<V_'u aLlVM4XfdTCNN6i@J6vhgqJ HS rLP3 Q;F/P:RK,tuyv)`uqi~d.Di@<SRgO uLF'/v3%PE.\1 OsJ?w}]EluPe! | Nl@N@S9.zvvQ|2eDf5?P8M4I!'fS$'4h~.F} =mSL4eR g;-U!M4NWcOELjRLJsANWfBwy1N-7 ZJages]9W1(6J3Q3@nE76eZ4 W_oD0Pm"LcEY f I\u %?g`A!|m"a8UDK| z]q\^nHr3R.T#@ o4dcEw[7yj:y v/1}ht@$)(QAp4.}U&NuF|r1hV":prRy-w#8~UVVX(Sp lk5 *w!*z A5Pwx>0=bhwvOQm KSahxf;uM_*l!x S!"3p"9Mm^!+|}[HUn&n m&.@L"Bz\0mDJN5'L<wGE{o0Z &@u|BY3`a%.d* ,@enMb 7r@,R^GDU:}X-;Vf!m>= wf=##X2;oJr(<Q_B? g1jv'w% Iv%/2.Ad1L8M"P/W0^]%3t=1iH  4|fl  7LH*n@LZ nv~)*VQQT#f 6=w0+6{w60eUvunR#OS4;NOtc2HS;hpt\Q R;c@,2mZd XhUZDgLGO.>&k}+=h 3Ruc w >dB%D^Qx ~rdIexxC;NawFR(/1e}0( Hx?\-B/x8hz+O96`]'(|> g !O1Q ]]Ne4zIy3Ulsik4C0'kA'>nvMIw;E0dcs?=l&]?VUP %tBA+2dPx<J| C<] &:goNP$>WDCX~r+h3{IO@)gg &[+RLau-Zd5EjC[uX ;/?'b?WC`Hp`z0QC# gZj$H=Ls bF- vGRNf1mZSSK]4h%AO_0,DJcx~1gT&N ]Semyx-14JH?.*J@m@9@)av< el7J"=^k  Gxgz  AlZP[+Lw4S/M='79pm;$P3 @=92m)Qysl6a-g^W,`-eG|1Z(E/@?;C%2P/&\Dmu,L=pd9(J[`t:L!5r.< y~0e$4xRk{ffaN1,R5HROu}bZj,ouqTB56]yl:Oh uegwn5^HI.8MoJ oHf|p!'](|"1n"r \r#cHCmS),I^zen_bvIN'G(eS _iw\[!^!)` Jsr]O'))i#5dsJ,]MlEzLXv[DjQgg8/=oh6d;8{L 2mV~ tY)3j)-f*CIKL_ENFO<=lr&\.K4n! YCtsMz?tFyBsMlWr,6OFE/2(@1A AUD=G/^hKtIXC8Mi"xl;3OXoGdGIiBghx1@$(x(ba3uT$k.*J7QN<*l[ ^z,q_E 7qnnrO)"[+/8~vK(bbBLz3^gaJ h@HMZJ:I:~dRS AM 0tgPW{eP}m1J"8E lm9IW" + Q P % P  ~ B;;_nOcsF/ <30LR "ilino)|wN,c a  t: &jr yK  _J>h8 0GcF8$I PMA:uhFiG^  =,   @ Y D SE awgK`L]$68 )yg.N7^Ofm   t3 4 YX#Y.FV&d=tpx9}3*Qct!'+6jk#  H 8R A 9 X aXJ S}>:Xn>Iq?y?9zxH;f;t: 4 gz 9 1 r o Y jMm f<IFTqCMhfMV 't%wZ 'uW=+p y ( )Hu?a!  D ^eA  q m 2MJ_|dz8H/.zF'u}dIV @7 W  U q\4(gKew L/  0]OJk|-&qDlx8 ( # : ^Lv`e; w ['e[\d)Y '8R^~N+@aJt|vMWi j'A/9 o   ; A K A os -  B +l9\#-^{>}RDj K=bE L i . };X _ }:x qSIMSP.Xf])Z>E7e Y ` S <  e eP N / z sOw !&^? G~[ZM<# q k ",P>cLrTE)  Qvs>~& :wrdee8&gU(ZSI x/ 9{C` m jx ,  R > #   5 ^:blL]6 r*g BO!v    6r 0C\fV-# sWzp.nil@C,l:8`O^ y cOt'f  Y ] d G | qno!{Lb9:5)0t "A$_#3 >; .WL 3"cDPLxaj J L o: So >  #u} # # @ ; 3?>@ $uI0&c[ \cD6]s4  `  I !"<#A$#^$2!"] 3 f->k4.szoRNVnw$36TI  z LJ E^HqaH h $ ;4dێӾzϿШѕԔ}ٔ7i>h& j $jc X!#$A&&x'('S(''''c&%=% $q#! ZG + eU?gA`xA(-({ww^ m % 5.[f !"  4  cQOE'/Dz^tڢbqͷz͐Іw\w'0dZ 7d,{K"a!%9%p(n()*a)*&'!O#9n<5 xC)#}:p=amyEufGOOpXH 3i8e`]3 y y ETAIz@ !ؐ9BAدrً_ޡ݇8"x JU ! !!y T!! )g.s?cI4;  |$o ny3(_8dmUb}CF?E`R m,h6   < y  T ` E >kqOcf5725$ P!Zw* 'uS;.  A I   ObOYYe[ uZ9Oܐߒ>|ؼtܑ^q_#)l @ }J|X& \ ]h FVZAda[rX:}p#dy\? A  'd2^S*u 5 d I @M|inQYq޾ޮ֢Agؽ3Dbb< `DS_>#Z'[#,'61h,4[0511.6*( f1 N[$>(-ًvؑ7ۮߙt4[$8 ['7bL;@<G>f x\`2wCLH-ޅۜ7iLkw !5nLF{a 6 BT=dw0TQk07&x  = R0Yb(48zw1$7}jo2?ޮ7X.=`bJeMj# 3oSW6"h; N'zi"i=KL[F H  b 3 y G| ] D  7 1Q<.m98;lZf%9W:ZhW-Uk2h?="GYSnxawP y (MX$mNvm  `Jzrn>7/{P$dB'TYYBY kFY !=fTj_eL2%Q9{":9}MH8z. wXD ` ~ [ :  NU C sJK)IM}F{CQ9Bj=t a o < C  2B  F;A{ w'Q-lL5nc>#` lx & 7  soC /Ig Gz ] ; " V &Z"XFV_w(Vu~, ,l].%W $oE"j  e) p = 5 ~j,aTm } iF [ " w(z}M 0t  #j O) qYnb -{ln1_MpWQ R   9EW`zEc!(W $ <|^ABJYږsҞZW"IJjJFxkPŊʑ%ӣղ݀g$tx( *1V35:>;@@'EDCHF2IRGGDB@\=<;64.,q&d$9 Wn3|E@!U<=D< -"t `HWO};Br$Sme7wtS*= X<0La@pTU J 1^3bxb  X KDkAw%Jy`|+W_ kJkJM6'sF 6y> N1Ϡ ;ˆEPQ*߸RcJl`!E)%0,5L2W9J6^;8;::97734. 1 )L,"&g5  zE 3?$'<ޛݤnܡ^#$Sc)C PR F @Y * z!!o">!!a<|f S7Le ڹZW;ˆʻȼxa˼vӑmB8x pgA#$2):+J.0724J57798:~8956>11+r+%$ f ^ 'P9nizG(pt "FL;[i _W+w"J=1F @h"6rmm~kuT2$^rck /7Oi"+!&#(%*&+'&*Z$7'4!C#Snk? A  Y s'(M@!NI?.o|Yz % JoYf^ !1 op4N Q k90nRZA9xݵ׃ѶYcų+bNYfƹPn]a0!,!+r,3(5v9H;<?>A/@C@D?aD/U2,)*""qR$ڇzشiؼۏ,('U?#"M^I|9< _^m i"!5#"J"P"Y q N} ^`l )&gїҵɣa(ij^Ļň=Ȕ˒єx}n޵ݶZvM J!!+*C21[66776 74Q5|23/0-.,-,-j,-})+8#%?G  LPzPI=Ar.)8zio^ݥN\qLPlsR6#Xnc C'D $ K J BS) S eAkNp _    ?$p  s W  f k =[d.6T$] j~fBmB$RHG1bb7ޘٻ)'GۛS7i, ^ )*p@; i U P>=P B$  #    I9x F En~{2V"k]kWzg}hfDR\Jmh2!#R  @ i Q t b 7vvA:}b=m ~S=YsIj\LHi]M'@4jNa4(P ~ 'F{B  ,E "d,-"Xd  #!x P*e|,7] Asm&Xh*FXb<GO"k-@[I{c0[8%f0]0w^ X qg  W A^^|,= K   %N,0AtcYTVqHS$:8a{3ߜߔXֆXwԃԹ=ֽ^tic.Vk {e". D(&-D->33{788:7`935.q0(*"$<] (~Fu/z,#}CCx #g |?SJp0Y  <L&~d'nj• k2ξѕ. Ic~; ( jG()L34c99<0; JS4Bnmy<t|kd69k u8 |  K f c& V?7E Gh/\br d7"a3oU  ? -  Jg   , =`-#>+|ad N ~  eb |PTb(u7<&^+#D<{@l_kP \=T (4;5j { D 3 wTP: \oZIy Ye_$/$J _sBk  F 5'j: +hx!L "J"$#$$9%$%%h$Z$;#"I! o& eb BXhaߊ١ԊHF;ϡΕѫΎѻvR-џEօmE>J<f h7(k!1"&&**c.-_103 34g44:4K2D2,.z.(( !I VHa /#1nX   s ch   p | ' ( }  WRRXh~t:[_C{f@+  bV ? =Tzd<, i$eF:-S24+߼>%I?^ X jVj!'%+*C,,Y+-=+-,+0.j2/<3.H2U,H/B')!nL4 5JMס *#Ŧ ѻ-_0sdr:ÊЀРUsl+9()]0065:9>l=B%AF^EJcIL.KJ3IDC97)O'R<w.ۦժեEcҒF[!_w. ?"]> " l$!S%!e$!s?K|xn e 8M|O"BM:"ؼ֦Zbǁ ɻB֯pRV%76HK% C M !+A+0$0 1/f+5*{t V5,9?}p l 4 } Z""<%*-@0V3}1v4f-0M$k& n,7ah}`0.*jn "U}LTB's"~ t^B=" $} $M#!; 5'Z f 4 (QGZh\~4K1"oC Q-, Gun~6PUېp۩FOߚZEQ? ) %8]8A" #3~ C}\&/@   MlDSnD2"rXH^2UQ I 8DT-}|H 1 lE`$A =L~0  jO 0!&!',w*/)j.$(@|@a6.CnZRI#+vXJxcvS #'!!R"%%(.8-^75>=i;>< ;/9_1/p" cn.;8ܳ#ּwي`ZluC* NQ_ Y "',703:679u89~5 6..4$#"!1 }Hry_ {ս3>cm)ҀT6&`" XaS :GA #%(/)+*-))*3#$  D( w L2tފыi۠2!bK_* }n 9$().-2G/P4./3X,0H($+k"e$%) s<6L'>0Bd+͒Qʻh_dZs׶!,Rfc%$$,,;3Z3Z88?99I6f7}1b3+.$ )Y! gy CAG!fWu۲ِ֠Q~`wSja5VmG*Z )/ w aSK <x *V.n?Z]1Ih,ԗӷR^t   .\~ J #$U&(~&K)|#'!Z, " 70 1W : lG !X$iR|A[q\`L2qE $~ R aTl. = !M2 T%w5s sr z K:'8 j! !%=P/d "`@:8*% ܶh/`]6i؉ܹUz<\ok%E)-51377::==#@x>l?%ӳ\0[С΋1͜#ܷO'L  Y SQnh&&,,#11a1+1-d-(P($l$"!j!^R: _ % 44+-`*XewgP4X}_/T n  v P , j  q { TNo)%mCJ B\:2R; -OaRHr !T$.!$w#M"R!O "!#T%%p'&&N%#q!CWdJ9|?|~3ׇGϳaɥɅlj[9N<ѭ)m - 9^' w#7&=* ,00/3.l3,R0)+p%U& a w;[ f X g#u$L/#eҦfZHv-YHYNl  ]3';?4ZWi# 'E`C)L2E7{w^ W a    D+ wsUH&ыԌNz=ncSI R!C"*-;57=)?BCpDDCHCA@>[=;v9s6460.'&>cbT-ܦ9֋Ђwϴܾp-'DS&@ԹafT @] >4 ;2()%0.K87M>#?o@B)2@[:8f2.;("v h  U rp8M5ߤҶܽσW'>҄h״ۄF-J] i_ & W9#&|#"! [NIߑ75y|N4dg^C.eL a# "+*,1z011+=,H!M"  rA<=L |'PoxU/ [z ? I: f bq%!h(%'$A")~% <N:=!5bxD?1LFhj   ('-+{-*)&$2!$l s |W#{23اۺx ]P?)m6m 3  du!?&*X!,$d-&C*P%# D w~sڭb@KYT,#  '  v  va"2"%9%2(8')(*(_'%! k I& XE17|@Y/52RbOmטկ1چ G_ ~ ; _>f!%W((+;*,+D-..1201/.T,])p&!x1I GHVrSjV^|&{=O+ g k  ,}5 _ n $ P R' (W B sx'mQ|l@d<|7Jv] yi 7 " !#xq#0d~@ eLLF*( ۶߈sԚ<ۢz5wT{9#)%.*1-q3(/~3s/2/0. .I,)@)$B%!_s oiZw fgOgߌi3.ӊohqRϘ֋?M|Z:1 w l  QQY'!g'V&-,22668 966#.."#F  kIS7Wkeߘ_&G\ lk Mq!"$$>%#^$!!K~ z vn Z&">L `X=^3]+ $ |   r Gu # , 23Xw ޤ`ۇ(^h: l =5r)<)32;f:?=H><758,)*S  +@/QxEolE=,Ubxc߽lDGL$ 'V"i)S&&2Q V \>/  rUm`mQU o #!B& &6&&^&&""Gs$tw n o*T&@Fm}6k~q`$Rׂ#>Ϧτ;T5 `  r R q ! u= D  ( c [ X f W"Z#B$$h$" !m"l z%@!&Y! vDA )y{/w@' CQ+ݴގٻs%ј;F[5ط_1INxd% 2hC$n&)),;-20,0&7*J!!q /# cY7l A 2[ ')t025 7o64723.e/+h,') "$wy3 _vY"٭{X\Ll/3әЯނT6 }2  7"Y (&g.+f2/,21/,*u%"exz: hn6^ߋHLڌ)E" &?yy/?Kvt|S4 Y(o?X~*؎rؤۇ ف=Vа߉umh ; :yK*f]"3)M%P/l+Y0,*<'"X> [ wL]F]>v@\&1 UZ>?  X  N x /3 /  *C޻޾EKVϬy[+EA?eG !"3)).N/1110w.,)%&"zx I*n3uy.2ӢXытD  O7]$ 2x! 'I#o)/$)>$(#E'"B%!\# ! ^Rr!h8W޼zؘӤPM̊ʻʃ̲Z/o֗*hyn  K ="($-5)/*K, '$: IWl&91`^ZIۼ}g[h; ?\w{ / '5 UV 7 yX-mI }&cb5i_aNH(\K7. j fz  " " u  :PgQt>NrZ:Ν6ΛPۆA^+b -P L{ F AV"++/7;@ED5J|AG9?O.4!'q4R j   F J2|٭ڱm݋BSۡJ7˕̤*Sv O0D .c1  K T @  d'nKfB~y6K }<y"$n()++))'%$#'#*"p uW S L1nD2iJ9kwe!(#LAݹEМ80fR&#-2n Y2/O"#(%s*l$)!%" !q"$#'r)7,./A2/V2a+Y.R%_("[i $ 3 BS6<s \T2}f bE?.5 1$%xGܣתֱz1}Ȕșɻ_ׅ - q_~6 x ('yW"$!L'$%Q#(!.%3SD5  y$"&2#Z! 5  X"u] E%tsO^O ;ܐֵٞۙهҎͥҝʗϝeϛ/Ֆؘ)JxU+x;f ~Q C$r K%q!S#e#/l ]7_  QkPU p .: m ^N"r %#'%'&&#-"'kD Po4a0=}@: ݢٕL[SI9L,H;U e  ^ a qAWQ :E^5f =Z&b - <    bTz}Fk! k#)##$#$ ";? mkUWs#A(8la#ewweG#2wLZ&O ?yi~MfiuN|K ~  l guTyb ~DB9m|2Dl9 0   AE"߭~Yہڒܑ}!ӆ։զF~Q g j 9Uw0r""!&5[ p v/OIw0Lc+ SX1667   q    @J  ' 4 zu}>7ٙECpxKN   5J  '(-.>13Y02*- # *2   qP+ZA8\j6l2ogܢߩۗv[i6:$#)).@.32'5x4M22-.&*+'($%i \#\S>`UPS t?1yI_Rn} R߭:ڪQ`ԀGӻӐV.RY3%I l(. p X!d$O$&[%>' %c&"#7yl g npZ =iM}s4]tjd 3YSܣQU2߷kNݞ IѸGm֊7;50Os E > 8 x ; c ? B  S\8*gW%-%bXh"w$L%'b%(#U&d #2< 0 ` L o bQ6 BwT _E?" (.|߁fH |q-"WQi {d%۫܀ۖܥD&E&u%1p eJI|ps S r  F C I~fCkWF p_hAi` Hr:]ba.8`3ecJQL({^q*}0)?Lnu 0)]x>" B , l : } O03yo+jud a3[ '  X0C1 !!!!!.!h W (N)~u@(E6N$ܪ;܊Nޘ33LR#QY " }atMq B *,_ rw*Ma ? >c+]L4_E" t# "  ~T ImK#AMnc -%ݞ0?~jNHr.YT  y # ^v;Sz^}.  bL g2-ڤӕ0\ybs\BF; _:Mo iCPw<`!$*'*1,0/3/,4*-0# )F"Pn ]phI@b+){bAnC2M\>T&e R"Yx~{8~ci } <M3GfK .@$d$"){(B('"!"J/X iT )U=~?PJAe(ݘpڲ׊ ܻ$dEv2CB M3 )C 7uA* j+YLUu ' :  8.za! $"2<P zR@+yMts==f~-"$zߐZ 5ddӫ;μYr@" jK% ?VNaHn  u+C 1# qwp%opa ""$@$&$N%""Z*k v Xeu*Q,jX_;xXM r99i3E,MHp2  YMD 18  D[i{7)) yO \KTv&|j $}"($>)$'a"!wZLuC3*YR}&&JF>}b4:F|KLU+Ex!pn#/% _1D Z ~  Y*Q!G sBfF$ "O!&$(')&%b# -  wI0s 58xFEj(,1 Jp.T"JNѩJժAx7s ` Y q~]J.n ` y   iJ xjI  & E O =  C]37) g@ QSe He9qM t6GzU$rx5axP0 Rd `:J.0~XaFWs uXZX9@V ##'(,.10=30.2-6.%&<' E|ozE,*W:N.?xK` u/{ܵ@׮`T|BcduZWO|k eI FLOu /  8 'Zh!)\+/\1?.#0')!#MT)mX""X%]%F&&E##"\ rCVWkYHV*J)x f N!1$&2%W($"A#%T'~(o'3#<%OU#t#}8#4p`qD2OXZst<ި.ރuߒ`a"Mu  *  L 9D q kU R y #zk{  oI  ` l Y8.bjG0Qk>lX)pO/l9mIpQ$ 7Am~߻D3M>Prigs{d1 L  !-Gh9xg1A bR{\"&x!a)$6)z%&q$"!qV _   # 1>uQxJFs@DD@'bGX6O|wZfF]3W1-1 5? !$ A&&"&"&;#&#&{$(',+11C5l6572M6.3(j.!!( j.R 4cQ wlC*}Vr0<8'4Zsb'rS ׋r,͟ՠќb4$cPhNK8e6!&'4--1145I6T8D8:99b854/.J)'u".mq|PmFZ% E  ]6aC.YS9`nXLQ3Kx".Z3XsߡT޲":] }|J%  Y "+&2.7V59U8a87!551M3/1-0+/@*+/G'-D!'r!BMt{ % !d|{YB81?UXw޽|&X-A10nj6}r_ (;xI}Z(l3g?)#   [wTyP'g'?07179-:= 8;{37. 3(-" (bL";bro  Cr 7 tHFt,2?@i"\}"4noxG:HvU^y+9-2k&:{NfQU2PD h2P$")(..132l617/`6,*4(l0"# ,'"iU _  <P{Vx(L1[[AnxoP: W=^NPPv}BoaD1Nߔ|ݮߞ'OMF@b ,&q"-B,"'2-1.I.,l*+'*&+?)0.63N<6?a6?1:&/  #0  b _ G-w ];yl&tDsUh#^,J14A7?cX,1$uqq&n)&NoiZ  :6k0! ! ciucvH%W$+&N.%d.'"*G$(e < < h| %7hL'- GnA߮ޜ݁[LU&&޷&;xs K lx\"3"1%#!&F"$4!- ~ ) 8|*.&cyMae1* Wl= !w m-`O0 sU*`.Z r7pv`97Fw!==7]:ZCs4 \ _] qJ Q +X A%_WP h9b t -A@L&9#.(3(g3#d-7{$uE  (XK@WN"6q!&p8e;<%;4GT@T݂=ށyO\'3zWnp]' j1QO p `;i X/flje  O%g()&5  }. uc3EBcB _p4Yo|9;#u6.F]0ObܼՊKIN٧k uW)oqbWc%!)%L,c*,,n+ **&("&pX%&4"+'1,6i.8,n6v&0*j)!!+[7[cQWufc>b3,/8yV(2@5Aj}oEA/3"$QV_n ߕrݿelcV+2aP1$|Fg{=C a '& !)$"D%q!$#`"i!i  K"#%|( $*u(3$PX G& #BQ#cq-f^ ;:LhWOE_&`QAw'*M3 e4Sڙj,ߥO.Hhhif~ (xW[R $%)+]/o0X4Y53786G7-3o3#.,.()$%!q3S~   _ $8Qo0d$:*'Y]WcAiZ^#QBI R?y3&\wt( &}uN  s  Q % K-4b i$F(t)-v+0*1(0%y.C*# W^)z W = | G(< k Or)+X{VH1"ym]\ߠ{ w $n[?+#%n.J/95?6D@)3)<,4;$* 3 < 9- C51lHVET9T/OD3[N-a3i O/se? af5z  g2"y"!   #%(,B0J2#6e47~295x-/ &'C2e} T aRK^ve(])o/qyq?M74u7XZm0|x#t2YHmN$ p$=#S'"% B*&X)Q.f0'M#+&|+?%o&Y1  +u  I F7i&GV%l-j#.ݘja3Z{rw)HkR  x5 h|o4Yj| -_F! <"&f bJ@G  m~d s)_5DA? iMZ6H3F8kfW&}h\OOV&siޚޏG)%TbiE9MJ_6DgpDN`un u!"%"/&y#3Bu]{>$@#(&'U%4",9 # _D Wg1 ZD fu,?cFJ^) tRV ^Y%L _M}!v Ud)T> !% ff!`!H*=A['$elB3S =9 S0_E %HK9FRUO/g"r,KA5`_oLwG0IhyqfxoBC( G p_b 9# j%@ '_!)Q"k*!(W$'R 2Q.N _ > W4fFeyy t0dmREB'H_kR`It3x{hCir%n[uIg^U}4+i1 V) ae)Hbs+.Q=ts$I>c 1mW  *  s&*7f$$Ibvf&uSSW} ]dcdR#-B110^m93}U#(~`DQ/M$$'&)& %k" hoK P"J& *(!&+ 6w&C <2 q<$c~K`_p C]^HMQef7 ]H" 4=el }Qq/~)F @xu(jtk  : /  &mWvSXp n { ( mb(~ H9e$z1IhS|FZ[v}k(^mfaCfW#y{5 ]& !"aCi;Qqa|-S` !020?$=[g:4S{U(w H "]2"&)**(c&##~ A Z 1EM e>! okvizh J;[4g4="a[ QIx*GnbF4q"4L<+ sk+>UHq-  HsK zP}Q,(|w< 8BRL9   (SBQ  A  3X Hm j y  =  t ZYx xn U,\P8@to?Q6L ?8vi=wzx  wk" *i{' g  NFE79b=:j11Y!  ^r Lk +  I?G3G)*ma&I^SxC$7~);"zg{/),e:Z  $, w;(  ^pC]d0T + 4X  JIM  Bpea#WRJ=0<L>\>T^&=+ _ EVwn C 5 v  \U/3D/mW  $Z ;)Jcua!BeKFyf#gݼYݢ^EKY"H  : e i]f9_p M ,05r evArHauJ6 I (*n B} B 0o=c%aEu0YwiU\LN1GRo;}A1 H  * 6N  0" ?x  Qis)CZ)dJRtw1tD ) Q 5 j :   G   T 1a 'y.(10 &k ^ ,tQgm I ft'trc#N;vO$S567FfJJhiEjY@ZG k HV 3[Cwpr ,   OIsy_)D:z&|6.{bF AHCV`^Fj>jZ%`g6tyAP5Orr}OoG"4l PjF.!@'   _ c S'}  d2* e z 5 5a  ps:sQeJn zleݏ]Ckߣ;6j6kez# ot 7S U4u  / 9,{ }U+%  - O2U6U & L+2  =Qpi6<4nru0SR R{<D@'? 9F-F/7{.* L N    qE  'H `G   T T  d ^ . | : NBrN>:brt< !~_hbwDC9TFOqjhe 9 Z?a Dg |]UTV2{;tP2C$  h q?0H$  ^'H 9  7hMWxS0lF:6e? A {4o2   Y8z/=_sv%_w&:!k:Y( zL: ^6.|_!#(E$$4%$GY# ! )22 X 7 T"  h ]p \{#}:C\VxQ7Je܂vޞtd|IS *h I = u."0+## $!#V"h#8"! "7 X wN| ae10Y{ZGZ0Zi`XHGNH!  ?  u   3p   B#4TeI(3 &" <\c>r[m qF 6 1?"Z*M#0'2(k29'.#)$F ^ [bh ~ -3a#36Of Mb(.a al 1> =+GlX+ /F:  _4 #F /6 UTdw&xOL{W]<Vn H (  *].%b3V1h9,NK;C+S|a0 lA/4 J \   6M( ^ ^ W 5Jߙܕ$d'TޏlD.26[xp Q _6 w p;*OwBx "w  5 K m5(wg16ap1Q<y%mxZm?FD޻Aݬ,>BEޕmcifu 4" +)%b.(1*v3V+3*j2)k0'-%+d#( % !I%d[ I`x~Q'MAh{}bV- F :A/w[eyqKL-VQ5S: a | 3 ' & U H G  a- =vVG!'Zj  Kaz ^CU|B4( .+R9c3 Sz = ^e k$VO6VN$N(dxbpuH#?3 # .( K <>r.l-X{Aj49Uu $K r D 3 \[k(j4IdQ5: *u 0 xg~QptVdH4'WIpcpo`"WQcUM 'w5G&iCD"E@  3; D m   /I ^0 # inI3M;eXl]t.X15aBVb3\O?q>*RM=(=Sc[;vxK d   0 x' \  O ` /4;<9x=o%:WZR9#!$ DB+y d(=Xi-|`l . e  L #`<Nc<<nT+x v ]  HW|.TMOd. AN'^bfv,3l WG  )1$|/ o (] xsm| DE|s] ySayJ^LUWa  x    :;~OHj+ G43>Y$ y  +K/1j{3=PIaoH~7YA H-Zpv V o  %'5  M e    K; E;c7@U1E<J"6TdA8vA!W5jnKIj>F i 2ow4 p.11{D< (  f?6b bO{Ki|mSo)<P"`z n ( y_J! ^Rej  p  y D L K  5 O n| [o`HTs+g&r44GH|Ot~:U}% i $ m *mVfjg& b !+2*Mz'3(pkW9\ %MDl>/Jz>X13^WJH= Bg ^\!4  3llo,ye|1q6{wz'/ W5  {I 2 ` S MQ-NM rGh2BIyV0!;+RBOI,^`nssJ4nBr3zE{_*S3HKIr G J D X "  )#n90o aK<Mv^?tUW\ &~U4w*mL 3Xo*F /   8/ {gd+MIs/!qj{E5zJi=>;Tz,p;3s I9 " q   u R  : 7 AI}Zu507EBZaFBEH.13 D n \ k *Kav_bQxh!@p=*`H>{&H`n5tmF;E@<-G|gdc9V!E977a>Rjdg>x%>E6]:3vs0/Ch jv<`h ^  . _ = e  s.NDZ6dO GU(iaR%%C}No5{~#{avvAIoQ j B W ! F)  6f?hrF6h' H%Y+(a1)>^](xPo:L'R9 a3`G:6}I}b ->1`S5F2mi Ive4m|'hy  d.Ilj6Tdo1#Rq!k]7Aj"\|J=?_|9(vto3 ^t0/Gll=^PDk]`_dme hCcg|<^C8_]8#Qm/8dw& `Ib_=NTZi ;bK D   gd/o2<Vx-2A,@!;MpKKx-v ");z=tmDXU9q|FfG'hKx4yHPz kAE)`0:uGnJG.2"{    ) - ! 4  [ v"ont;C UP@nliW+l&S$NP+BXV;KKBI shRUZHcOJ=Z"2CA=^#[^a  3 m gH h /uJ7[uHy=()MoKKbI~4h{(O(b0HgzjK1zn.p,iFh   %3  |   % R      kAp+\*t83%V~)bz=Qa39do~~1&4TT1)MMW+=M|[bUtujWHZlwZ:K:tdNs%D|D^Lu ;`V5Z/7W[^adL+M.$84_hnDUzA&GmQRU:G7Bu( @`Qk@<.-&+  3   V  eSVvwy{f>,-4lXj[Jk mRwIC 8|QjKy-f65PfY L %00(  Q{,  e0YKY\CK cOW/82L".v@nm@[_O]R ?\pf EeI Hn:y7ZTG?   c _  U    >~`AOwX!-q9k Df:8u>SZ;.&B9%C;F^X,H2 ukYR.!0QA=8{;/5 Kc @WyC`O9@d8~)z6Jma}_ ~ |#:LJJ:V.k=so)eor}CS;lm(^YvV^NQ!7rc .%p^x\./+lp 6SO&pG:?xY*X*M'gV@ H&SzO[xCuT dt!WWdj'[!Im*Bl$u%>#BTI[EWTTF } DaQH$#K D l^[,h+Cwf2V57^tqHW7v4]$X2}8/jbq&=sm#% 5p)F-16MVBc+~Er^Zn9swKU'#9k;HOX2(C=MAB^/!2dwy)X||vHYQ4}"|oR[/?y ?0bn)POVML023wTmU p}5,pKv )vS wOu4sG>;Xk+s= {hnto@M-Yg *C(e^dHJ< }6L IH9_}{5in0' GQn@>9n/zPN`Gl~%!RZ7^ xp B 7j!*[yVUvnr.i56v $AdD%t*@ZVF?4:* S:*S,5\j;` V+oj9Vl5KGE,C/cIrrh']xpQ GK):b~6F/*l\ [HIvrV<$9fwIr%w(a;7UzA}P728v[^v>DaX> ,?vcr5! M-ROId6OA@9]1jontH; 6t^K0!}!-NB+ J||BUQ> =2j?3O0\\&B~GDfZSH!8'7=DAF&SVqa#5'tbqRdqB4Z:14g(u |?i4EOiQ~ #0`TBuE\ M=nM&(D(#'"H A "@pT|K o@ ru6W{03KDm.!xdhAd(sYe))yv'1$>Bx;/E%dY:[ul]r /+vw;5s>#x&{P+> KOGy;t nL=F'[y;+d1V]x9^g{x9b P_&B^f : 7[cbEQ iE`'x3d<Vg%s{4=8z `TW#E]"VA+e^zX,~9W+omL  vx #TzsQ(",o7Y>$3[u8;5i\I r= $SqDC/\pEz$N7rSLd3{sB,v dTR;-kV'O(SS9cdoj@QX'D|T83 , 0xE2AGBTA-T/ / k\iHJn<#?Q!?zc}w-j#p;}KloeI|XF??k #V:-*rSM\:)8GV%I@2$j '<mkHA|Fn 4s?"wOf6O#:tC-U55[ oue!{*q+{[XFUsEPGL$n&"r^6@z&FNs C7Tu/Y*{H\P-"i(uQ*>ODzv0q+a%{aj*  &[*&KJ7C /Zon#28z~{JP HLH9%P=*F^W) q Z A\9,#! XU=U7DBuKVEZ>: >!gbNN\dp@7S"-P{ qzoNrIlzaaEOymqeb.pQ'*36}%QCVwaqsH^(dmn%Dt 2F0Hp g Q#1#T`<-xi[?z^N?.MDWv H%dIzCq-SCf `NLw+b7pl<(|8oF$!@3& yWb#.@yN3`m8C&k;,ZKq n(Aao}rzd7!eN=FkXU8aw%*usZP3^MK5% s24.(h=0y_<y@g+w<v!MlVeG|[e  = { %v J8 Q OV h w*5^sAhHsIr&t22 D$7Yp|rQ> 8F4CJG|hEuq84bNN1-'&@:Z\#wxsK F;*7J7%;YZQklSp 78-2@ J& ]  Y 50 HXDqeMVgZpbG\3u^C>HJ4 P<I>GH j^&]U t?C'0i7Pc<) (C. H 6; H bq bW ? Ylhl!.YIX XkKIYse>,)f>RHQ_9>AR\fP8 FjqvtJwBM4YrRKUM"L5q0<`B\?@D?Z7hmn:zq^^*P{AP 6l}@V Lf~ %9ifhn\:/]*(O$~nH*.l'vxtHZ$Yb^L]M``Y*9p61!|6_nZQ?'~oe?VW5m/e8?,e47) {4&] Yi?g>Z_7'.a+]-}y^{K(u,)iT]_<\.H6A+-v!v@2a&T7Y-X| aw^ 8>?caBpur1>RCH#25 P0o c S9f{,V:^(*yJKA< K^r`O|xdlI52VT hIV!^ ;g`b_+|I C<W `k:I"  <DcM g<+)G<qKABV3^~ F-  j #5 UG <1V|Uw $YO3?BVxZMmXL4+pO' WN~$v?!/CE"YY5H3gG/ &B%&~l_k,5 2!"Lr/qe]]#XGGn#!y(ZX AY; mB$7x>uC;OMhqd]7Y7_%W51F(_VYyr:PtKJ:j%.I$:)6 >hks}.&0Q:lVWX43ULdc~.2_&U[_Uv(oor ~ZD%:_M>|[X? pAC'YR,n-X>alV2 *H~:LfK.B(T<=p^) 8?z4]:F 1:Lt#9e'H'S</7B@o/ (| RR"1/)y^w%A0C_{{NPt }o9w LJWfq'Sj=.2wL_:!oHr~ }Q*:riz<$.:n D%4 )6#xiLn"-yF 1H % [ .  L < -8 . #>`vrt}X/{Az%U E\yH;`~x]:SVMf' ee3rq)*Tz7@s0A@h)Vn-&<PqCJLD=#}hoXNxf3ie  1X g>8yXC64JVHr{ilBF 5<CIz}Oy%2).vsq0Ivt^Pp 5  $]fRi{YTw oqf/& \\ <V9*Uhs)dLJZ$yZ: _l,v_.tJ;z@.l<'Zv$:FTiOW.5/ :YC\;"} iP|evo=(1=&h[( XLu  E w(_o0)mN"cbi 5+CN39d-Xw]sgOM=Bw>3{0c]HIVQ$7'%wy;SU5"#@;"I Zcs.6"b(nf8^bIQM >eivv%,5^ O:J v6kXLt)XrVJ |qUz`6fJH|r.')t  H~ (y0:xC)>M5Da<FC$ e;2R-1o* jB0/AR[ V   Q C V]-*}KK -_'lgF]'JL1CPX j/`aBM,-R7<B_UXL1x1N`%DBRQ cq3vnHq+8=]rif(f{C l^s ?1y8 5W c y _ Jg(w:e6}aoM1I4 "Y53<J 8/s8|}|{FA]9<*.n223}/XgeE0M{pJ0 Z`i:Hgmo,'_e.rpTpl?f4)^%xxfEp,'+IV{ ? ) 4{ "W?uC@-%f9NK=@y7,_@0Dd4B"kK;X.2^w}? }gM@HIHX@)z* [2,d,8 }vb;H2\:<e#P|F|#Y7 J& +  \ ` * w  | pK+`|`FR<>m=B 0R{K>D=cn A;xlrC4kJzi<@1T&x!JZjF}ffF`)F_u9;v(_ ;oqn@cCvO<78egC0T: V}%09cH<w,sf[;Vi   l]UG&W[[fa2V1\o3oc6; p{%nXT]xk;7L2 L903oOQJe|g6*d7LWB$4J55qj-6t)^K;M.7'X&'SH[2=lm \xEs3-T% VOx2ROQiGqm5a=7x&#7L+ |#K$ +wmv:Mr9F~?BQ8TRm3@<s h p 4< ~k#;~'oN7FEdTN Khx9IU'8w2"biq4V&) p:3V4 !He[?:>/=NbwAM:]$ dD('w*Oc(r8{mpi|EPm.FO~>Hc /w8'Ji[)m&.i,a> o!q&<ddMJx-bZak|$y;78YF+Y-3 Q *IvE=2bWI1 VI$6KUyy Oa&;tfvQwDZrzbRKY=YKqTV 9i,@f o. % [ `7 itsEu0rNBWlr:{ThD/ |/W6}PP2a\IR Sz,2?).!^2*nUW D*kxnO5 "D3X\0X=wJ@A*)27- U-uFzaXB)*y[#mhk$ <6txwx7' oy2}v#!I*nb,Kk3 NZXMFm,*rJf]c82f, O9`nTY w+{K}n=?YD7kL=;bEr1`sc HjR6!eS_:Z!f}6iN wH -jW6AF, oM_,<)?XJp88Bp1CdvIq!~y7r\Ws[fW:<La!m*qCi>_ U$${x9ErM) ,5#vK^l5m=}bSK9W%3Uf@'q<'m,-1$)X!^1yS f^XQzt"@4[t>xi ytaU.r U >50~kALES+4c_~ -Mj'>ZFHXk@Q*N=3NtPu6E71L=8;tG=*zTh0P$5]7B(#Mkki<cf6<] ({huz6-`q/o LHsFBY&~ *]d6g&WTXD~E'B<=B"JdhtrCz  0Q=h2:#Z(~h6K8{OT6GX5:2{>SF9Xgzs"lW(<n'yWoLu&y0g1G  c'~hn 6w`uNb2%; m3VayrJ( ,h@ h0 o\;j/{51d8F2tbzM#cb[cjw{jxC.qh )E#< $[GX {OflKi<f~Go$1O &Xr\ml 2/80' onlf^;{+7hMD;o:Or?$?tQp[XflA;urWY_ETe DtyrV5flw9@V&:9O%``5 eg  _:e/xt;2[)M- [p}[{W<DKv6Z#3j13~YX]yu )"U9g-~( '_F*9QHJ&.[08euzr]K  7nGLjJx t_hGK# {H`9S"~+7?-]oxo3Hfc" ^~7~wZ9+`BYN ['!fA hri?yf RPWkR~v>20;}m'E-,MlAJ 0'f-_<,,{vn5E/aQz #p 24K@la(;l1 ) = kG?uwsK5>.. ix>BpF<92,VQ7 |=\50PALDSZMF8Q\^u4fo1m{WBJ(_sBqAE$i<f %U?YiL;0^>5()<xmitdgS? 7w'p%)" PV0tV]!=a`[jG-r7U]3+<>\  ip=#~GaV0q|Q-_?nD~.A*^VX2(#jdrw-E<yXGdNFDf1V h;@>HWU>"%&H1~`b4-wfC @*s}9v;kQ6Tkp[7:x3{F)IW!}=;C{>ExuY[Ch/4Oj|e^I` [DB:J"u!N_~O&"XYGf/EdZH4_yc nT*;0O&| Xx&Tbd_r@ DxSA^CI%?+P+R92LehS%$we<_a )Uft@l-8Ys7TB5 \EV@%BDMc.h 2YFSl=8T`t<X*HJA 1^z NsRC!FYg>q )~eV- f~-JKFGek(Sm3q S rdgwWmQ9 !>1ejRYk7PPW~G~&&CHGkJ~kz6g;O|)@N?zn tO[;%;%/>^_"9L`Ui1=%k8=t 1",}VZ?=-y20D"CoMhyC,/dgyXKzQ 4| }ihRoD4%}~5N3 {h.t y7YkroO'U'UsB!.6Qz V| PfV+1=s@A O0iNLk&vwp5ND5RGh8QolY=k\AD5>>6gA+_M]hFo_A oPrbEb  N.mG3wCw nq=]4X D0jTL~>,8a0cC*m? h|K< '$!UaK# *k&^z4eL?$b0BiU( waE@8`3xtVSfT:+0E~ 85Q,z@ p[B`zug;$=7:5 2}0#Lw+7eRJ?y]Y>cC`o=X.=_}|SK,Sy<8$Uo --M5_qaxOwZ8<)E;4C&&V0%\tls?D xbM.:b))nR~T3~3Sh7O$@:.Z>rbu8 4O-7.CXe|N8O 44Me%' Semg$ yz},NT{O<M) ;\tNz7xuYJ6IZT_l\f_hbJ)kJLk`>~(P0[WOEFd~^iXR"`<W5VR@]TN>(f$1((+DBU'Ggf .c+p`9o|0u J=TUQERz;aAjbX@=8^MZYr*xr_&PY.zcVu?Sr,Xx17Ry(`}Ccf:4jw}Vt#C:_.Y 'Nw"PHVD b|QB|&XH}{l!)Jod";C%8=RS3BncC3N<X1z%^@ Lh?!qZI_a  pcmDS~kXX' $wX>} M!RF5< n.Z.7] SsLw6vYyQ4k H J B7w!adsv*8oqDRuxhicUQ }8cG!2HIa'b8B^ A:BjS9tGhY"rl %"pv70t (&T[,ic- 58AJ!T2&ndtW49),kIidj6"ZxPdDTaK^RabOW6J&HT2&xlsk 0l%%FgRqQ\&1l-K^ph8[Iw d ag~P2c1h-&O@~Pf Z72%>i,@yBZ*VlE\<iK\E.fydm:f0d<N \XAI@qjnHfZP1f,gCC->-O!TAAWs4~$1g/WR50!wMCT^) #d)jH%EL<6g]>"/;IeY?GxW[VV[.w^ +JcB&QJ/&! g.gPRHF 7]u=ye2f*Meigds.^DsT7p8 .RJma'2;8%V# U-/zd4f9'788*yvr%F.)2CSR' f+)A1Kew *Yxh$9e92yO*!4`4[FER@O0~CWv\TTZ)^ &9BN9&%(R#2G@@f>vi&44IFLAHy_'b/y[Ds\^ms>[Kn=@ TW DM>}#P f"2GE"BJGD\ x_wMeQA6-sHbU@G.98a%F$5XA05g% Tx&AWiv~q<)g07 TVBJf,K`."As O* }CT  5+Ts}>2qgd 5yEki ?|"~OUs8_9s19&=V0V N~Wy\/b?b%3` o}F.O;7:h?GAnRn*UY sI=":~S-gP-I4O3'q%:={9TK<S!  H2@qaXD > kzc-<-/qx?yp(+s> Q# 7Kkf=,Wk.[$5II>O/ ,$hz/%xw:A60=3i8K,p/Z8Pa\3l" ib>"$`D!"CNURqPmxq i *CAVDpA +{rgF>ff\-3NyahguQxHK/izvOB<>&*u9"bxn2i 4{\D=T rS14]s t`i,FKoS14vsYm-(yWR6p$HJEc3+- 5S37 7;~Gi0~mCphw^a PVO,=I Zx/t `'41j`x [vH  '<HPD4-0,0=q|[EVW*0&vWu' TT2b!i1A&e(N8^mA'!ufs Y# pHC'HMtR1H>]|,kq=P I4`O%QVx:1hf1g%wQz.oHMd;L:/zg $|(R?+xw!Ub!z_3_0}3",qM>Bds848C7stZ,SGu%X2m9i*S a(aNdHXtePiuP"' "}\Gf7u,m{uIgDYt'f(-jGsI*D[L/ M5 CfUarPFh:YH3rXC/  9JD# +W"1xmWa+wL_I0zG{Bn i)I("tLxmi;N[ eHx\iz:)Dp ir)&'lvVBz&.;w5%}P$,l %3bOYk @i3z&/HH%/K~C nQZ*j}&@> q)deC~B '!-h2T|$5zg |]Vg|wtRC|%/=SC8PH <C\xj=` yU5ci4toIyl\%VN k$ T)Ak 3-><!NL e#dc2&9~Qk*=y3<}QmO29QTvwM]`hS*}SmF\kF7/Wz7>23dy^DN}=+|Eu 4nHhw9 3,$"$JO4.X-mqS(`E-MvDTgWnG]hXUDU^ 3}?I 8;%cmrDDw!>H-nZi||lK7[=T4=EcL^.H#P\K ~/>om>0y1 pZ= paqo:iz3]X`T4:nNK$&a|yX#BK/<Kp&f/pe<v?e->}8i"z1.X79R8U RDmSU'Ak}YU!,O-O?'GUP,%H8.]}C;1W6Gq p~ :.4k-'~U:.4( $(^C3v+|m jw0n}LJdgCl_K~"o:Q!)+b<(\bLWOj[27[ ;s=h`j$nNB(7:tVbn3m6TA3`2_W]I&3Y`W^ =JIlY4"I1^K+6XJo6hX:g   t`3L RlTwj4[8bsk?02-*tOzh?P'o3V] ;k5ASiX +RT$;{5St0c!6k(!/+C ;M4aXMk3f>n!8!laWV2+%)t 9 ttGNjNsU$]C E,~- ]4l4e;Rk7  > X^;- 5FwC!K]k&f m|vKx&]lL3UmU2;`! Jg7pvgw|MdL@9myugK[. +loz+| TJ(='~:<]gi{p43ePm?*q@b.TOCLE;Ca,v`Ua}f%]jAX=5&T]IIv<mO`K B^p!g!cx0vN@N{V5BbGWXd5]E6+x-9V1 bM4mee\(j<*)mo]uWGW7O>iJ Z;:vLE&,57`sucS1Vp* #6j,\^H#P4 ]3ylA"KSq u q9o[m>ml8J4+>'"NOb>z!Nt+=t~@R/ouCrL*</1|:5 7-U.Yfe\0olpZhPnyqUl(k#5P8+AIkI A;{@y0qrtS-7Wj.rVp3gTkTUk&u3Sb9oRv.\^UpyTpD9IG9`Ym`0O> ^ %Ni9sltuyz+&Gap!sqszQFm%5I>|pkVc7^N 7,f?\YGgKe,hUr}z n cappE+HhF2o5z#&uLc#; As7xtDpB{%IbioN>w YhZxBja)-kc"sWnlFR&jWGief'8@q$*=pj~pj~{)[Y\DT)|OR"@t/rNQ%[`10BNSDQKa;IBbcfmUkeH`I p?$-LP;OrTKjP-CVfO9D?+s hqt^b 0`dR>Y[a\q!o?.r{,o`j>HK  Tz7V@!zM8-)`r x4yIhVnnz(nZSUVUZq N<z)pW`x6~mD_t 54@j{EV#W}G-=7_c2\aGM:eDU!t7fk #*8m/toqqbQbe2DH&6u;xoT,uF!sh<3$r (-a(y[}8j^;yA"bB<an\qg, P|F=b3;(XPM0ZInuc~2iJj42PI}-FN WUH%*}OjWvZB%szhQ|wJN,A}w&rl "]a7~"S._&"%CyMb.^0Nrok_~n=uqV@WKcRP kgIEuyO:#5BH8X> r &`?xe  $)]0f[efNJ)! R4a$uA WtunB5)}B"(fN]I(R%xT&uJ V6l66E?X,)H}u|ZWg x.!LQ{k0>9( AG )B'`}};>T[2T#<,6dW]O&3j~BU,"rmB>33E.]K/~A:-PO _z?`qG>SE&97yJf)n@_qup*/WAEcZc0U}2[ b}Zi)l *GdM,w:A2a*'tGd+S5/qx<x6)9S^3"RL^rS_87Nb)46r`z<*MkmX9]pa~H8XD_;IN8 0+#01cG|.- KNBH5-8WG X pj_9lDSG #47p62P[cSt] 7Pd[$Pz6{uQXUv|CF^ y1Ak.h Z;% FHVJ:&p[BYWPJMM"NSQ`iR>;D}i?v?ld6} Tsh0O$N/h~qILb-) IT_:wfa*<`sn B~y }4%x?MWbO^o#r=Uuel?!&Ja@P$@`ZU]OfZH l~yM $t Qq%$_LyPr4dYO`w)RTIKxw#ufniRqc(7hNoCv_<61f X>:u!9TS&H]mxU] 'si'H<[ntsiXQc| .tfApfZ5I)9zIuRO0>.?GH+x*ag9+t6uv-o)#^1 W x]HC92@#fA}B" &Qw <uMQ}XW tFC/C~|PF}=-g!(w0DYZjx$h\mR=c:0gOWp[/>hP]nD^ d: Fi%5!((E6C?*k x(XCR{zkM{Bev5cnq 0pP[ I0wHV B%k&c |sq EhT: )](H3-Zd 6A=)k -nW5'jb.SXX{$ @ N4Nu.|_n>"] #^oit ^-S'ge JN&jc>Q CZmf IxBn;U!TFq[m]cI<uIDQSUZ-Tf:ZMe6iA5r\Rdj0ob L$HS3ReH O(%97D< cd  bAikzn;@ew59F;z18va~}n_> 9n|z0Rp-W64Eo\#n~dj 0J,;GGV> Hu0L_jm:%w,13bpc|fG ~CV%F  7?_<9aVp7ZMd-m;@w3D* ~_YZFKRs:FX0&| Ob` <pb4#6b3&Iy\J6m/}0h%Bh~Fa]1R> b88_ 'ivh@e9!ZHEpl9k> OvGjf <:'4+tKqwzpgXS?grS}P ?h, 4w!B!xwZ|Bk>h Iwb#.>U)zXs5o]M}K\fUk6]9zDqK_d=/}*+7V=_AxV{VgNRVYx/bM$'$ysacm,`'6@ _> C7!*=Nw l l+'}Ta<Cg6q&P-eW w 47mtj5mTfYh0[}:ofi*/,]6X8:_a[>Z>Dr]OR)tzM :XZ{7h<$f#7_[&2wYtrM|h\(U gtJB=ud1y+wD{awWdZj1B]UEXTcx'k0kN/l}jEUMC:J;];HFN'`tP<-@*~x abksj;e5)H[@s4E:#0V%pFef%wnIl 3fywUK_Y}d4iAY2[A$fBz1IT7 B {Q;nES;++? @vd?GFmQ-I@SX6tAbl:$;y8 J]xWV&(`DhUjV&=/b7TbLM(r-4UgSZ/ FO@vyT@g _y_z|gov=2>l[(e0v8 BA(I(r?p`J( Um:p^ 3^5.R}\f#Y1(s.w?dx;#K>[2~bd"Y@\l.Z$XvJ>wp~N tmv]o x9U)K!;1snBgHmiB*9MH#Y|Yw9SM$5O ~h\`4|-OFd9P&) SbOc3.+PHUk0 _wK ^J'Ww@jH |mdkW1V\9/P=44W]/R?iCx[x:~J K3PlT6oT]w z1!4 uR4i%deX0h2#h0Scw~R45eL~4\>x@<{I?S6W;-S/OxLFtTFjZ~ ^>1c6@^sxav; U7]z(a W\)bH`eT}Pd&<;27o1a}]eNxHE~={$t>f1].iTbRP:9$%*X3b*Y\mV:2Wxt;}naXH1P"+8N}$~xJP2}y.E>diM9}GSJe6O1cD^fai1/=?[;XH(=PNp8z[S]z=$|D:q :8m3# (=M[`vo(o%v~^C<1 CiG$, c^$u -T3(}Brbz>uX?0E1EQCxDDl6=YJW= 5U=jD6EE=X4$,2I!Hh];1(<|Rj/Y2Yu Ja"4EA_'0 7E)/"(`|r]+.ySk_7uIW Jir-\?>Z3N._t1#f-[NRMT@lM\crdJv2IG$[`lDD.0x= ,zD0cBZuUN^1%HZ$bT5 5fwJIRZ r nH1f`Y'sm_.Ps0T5N>||4kt VWOLdOTyH}<U|97LgIsat<@/eMj_ brT/yN_ 9wjV_5gdRnW|1$ +HF;4A(li`t6rvh@cqWvlEj pb4/I _ I@wjM/?FD><Il`PC'!3:_}T*, sVSnqDK| WmF*!'4_3"I_j/N-^55'cHKkn;"# |4[O8&DdIN"00Q+'%h.SNk~AM}Y={Y?HW~}V6SvvFze,.Q~/RWfj3Oni* [ Lw6wR( zZFIFS dnbN:bL.gwNVGIJOSXs\PWp}.(M:M+F>3<:NlMG\kP s{^y5]!eufo UwO40uo>jq&{,?S`_8:n2pWjYfj1T!(d3{kt7 >*XX?;,s,Z dx 9GO91v;&(/Np2 )c0'8I^g*CuLTaJg'T<KQ #;dS>.!I``"H q1~jb @U*{^'![M~CJ#$$B-r:CH`_]]i"aOwZZC@^@2mza"I/DqoHF}zedfy}N0+Kf#'^nn|0b_<FO^|w2/a?o`Bi |p{l[W[gcJw@^Q&6(bz(.g_]9lTXFx5@((  (w-J#M>\G, R? b%@kW Eb>rGm-pjqlR8ge6o6Cx>Q;(sh~Eu.>6{LkI F]-rf%~*XcHHHXVht5]DQ^]-iD%HoxQzJj#epRE/]0#m1gK$xBGErG \}pI  !eJ!,^b7M|KRKOi,b2zz_4;}Yo Xq7v7 g2_G]"I=5Xl[/9 D2%1U!~]63EvZc#8cHw2g0Ot$h' lj&Y!g,7~j* *bY;3pEx^AP;RW<O;ZXrk}:q${ Ag*Z'5Qmtm  `HB1Yo`EFEoj :z%0?\~Xq?V,10B&>qkd#(&X5o@q{[$QmBZ"y8B=A]\n* 6MBh|~A {5{6F 7=nTU^ox pTO vVLiB)[bx!CcB :av*8$9Jx>WR+[eN:o=Fl):| 0~*@!: }ISMSv"eh^KBV[osTA_ P)@FE bP7L : Q%w7$S*1c)Y_ z5MJe=CS} 7&IWszr3S;ujQP}-_8 mgOJS*csxpa*W_C<?BAw?oDUo-f(,Z; O%x..e"_J<>>di1u@#Y:X:&Tmb:6LUbLIASpD?aS0Zc[RVn 'O:(9KbRm~M#o|S oCp$t|NiW_}aOY]qJ -\DWXOc?..< \5oRX= twH -zS(a(j%s-:4q'RX,"8y1 j7Rh_Rd9wq@I /Ye,3u.X`GN/ @er4%_BK iGo  )Mwpe-PrvX5\Uyub ,mN C7|O6*&~-6qD^s)Dht\" |tHkeuK i/ x3  c?j[k^y1E{+LttqU0]IaMc2;iIfd 0T+x?'}?&z =td&{Ga{Bl+q$z6Ua6PRYto"-fU=5,?uI^M0Te*b7fIv3R2=!=Svkw Bk2zh`[~O9X,#M5yDP[mW~sx1S #Z p,kX7<87?',pNNUa'!k g 9L(/2V* =lmE1+W-W2{;FQW^f+naquu7T,Mc0ocy0[fU;(h! $(_##ug@9@wa8ymv.GnxR,! d~)c7CD2H),zi[eV64'tfBLoOU3!,KRyu+Ilbd"P\[7[8 Ki:a;6BK /qqTmhc a=:bK5,[9F3>qhJ_ [e{a`ssXsF_.%.J1zvK )q!^? W"k&<f\qJRCV\FX|g:7m; V%z6Mw$# OzD{v)C uR~4coB96+o!$ fh@g*mDA(^Gh\)} g803PD2bJ"up|<cM,Sx.{*Fno6u'Wu0{K`4+T$[(c,BJFxS:\D5\/ h8*:ixy~q2[7_0M:! m,K>{rADG;' :B48]TEa`3|^PhTO$SxR?@7fbn:be{$YMX4 a:C~OajS4$$ ,c#F4uNbMZ>5xQ>}/J J|< $/"w}VS  nQL\e31l<_q(9V}fCQn|N*!AFH3EVJ)6>> BRpr*SS:(:gFXp5jM<!Lu( sm[7c! B7md[i0MiF@vj(g5){G|V)h8[~IQnD1&dh05$Z`Y6e|-  ~6Ya6*F.amcwhr{0A<^K$Iflc [b;[w@k'Ibc=2b ME""q9nQ ~S {a2<7Q0*1j2+w~c\(J0<CF&yV !O c_0GE Xgtwnq FF#0iwVhQL}mU~8s3sa8dH0]"dk*]>{VxCHMuQ rh1cAC,)ORJ8v H1>k8eE'a{/BEFM7q-1bdI*mnt8}=@AfABO#.ax`5-Mc,a.:;8Bf?X_$LrjhLx/zBu-NH80*5x  6 "kHs"GT3~wz' ~s0w^sN]8HF",h12.U(nh`#Um)&yDmlyB|2P$Ig$tD!3 u<-8W{qqhiy"$q\pVYeMl+gokt(7nNM4l+ K,i lY1l[ z!U=Fejc!v'ypWEe'Ul%o6 1Jk o0wX'#%1 C8%Kd- ~ 3z71[yzMRzaRLq*GynVGd"xCu{X/CAjz7Z,sj^JYzmg#wAl:.Yn`S@9Js#eGCs/a{7~nMZ w`<z`Fy`VE@<*u !c]pU1cU96RYZ[n;2~_Nd=&1>Pa>pP"}8~? QV0RaypCJ;s#Y7"1" pNB. W:q@#1'Zx&&lLr6kK2a, @cP?nBh%>>!*1oAf-]lJ7..r!&sBS|gO[;41w//n_`70f-[ 9vla$6ObV%-/e*"x  T1',/+%[=^%mM^ ^ESA--"*Je|$;.@,R!:+A oI~a;qYu'xQWxtBOt/-| .$cyps/]F;FrkTQfO:e2xDYp.k7h+8Q/;RXLF`[J:U175?Fg\eL*BLPH2F/rj$*rTj1M&sJs>wB; \m$SgWfD_6\)1dF^Fh\kD>f|]fco{}XlN.0$ +qV F~w0S" 3:[lD uD $ 5[X EhbYHyZs<Cuw#"|d/h-Lg`3dX<#5H'^l}C={ d{2[R)zHSsVlEt4X qKBP`CzZ!<z.& 5ka.? 4_to4X=:,)4//85v LO*/bL4MRMJ_V7z[6A~FyA}.#[c-<CS m%P30B_HG[pbb3`"uKrRlt,l,>@:9B]9*ny2AGTh\~k\he}FAYP5%Jc)nK.p!X"2+58)fjA4H~A94Uo1t ".A9x.`w|6a[wM5t@ei{Cjegp*[9 L1/9<tB)-EV[YNTK9he2-e) 4HP5OUem!}xdH?A\Fy3DV=[>6kx:&1%>lMZY,AH RJ42235K>N3>G&a!ig;0^\)x/"&g i>nAUS[^\[3V+TEOx;*[i.zJ!) 9e:Mg@1c0p#mcY M?4,*`-<8NoT%b /ou/C]3$i8<kf301m~'QHVe5j_>Up<-;R`.Zh>toIUx%=2C<r=P7  ;Mg)JFabctU7QHN[27uSDUT _2"W!sS<c_vdcq QLxW1I,Hj&poQ.NU?v9aR\NZlkx'i6k7]HV~FLt({0$_!z|hXCg@"'_xs4<cjY*k/~C&%ta_V5.4Y2" Au[=M|\kSMgED,"o([HDx| u@qFUVu`H`ILT}N&O2SQI.rq7C-7jf2yAS&,LT6,n,1zp#qAQS4dn;n,@M{$Ts8OHd#WdU5 +z*549g$~km&`Q~vQ$ 8R 8m s`<8Ml+%e9p`#h` 4y !!hHm6n)~qJS1jc.nue69326O1b0pmmA-~GceuaJr'K-Oh DZm{_1h"F^cIM -=kZ} yn0aFo&8 3 j T@55ne /Tw8u<IF_%2OK}4vO'J4:XkWQ%Lv }*`P#lublT4;=CgYY{ ru['+O]bdehu}1;a8tV"|i/bZthR#jS& (IbeG.>{f@PGHCJ!J)AQ+G$v Cc&(dNp5[-Q2<{;nIJrUv& 2$NsLJ"c/'Txb#hI,%d-E[goB9Nv3}d8/C@-o!VO 8jXLLk5 k *bW-pt@hP0 Mmyn&imGYpC\ZF@9xV4n_e]gk]W"|5$EWw"^=g I)38@H(I48>>.}A\n$f8 |P $D%ty@ 9SXOFI`cKR<x$ }_S(s(;LlH,)o ^_76\p'.JP(P-e! )651\*qRaP_nLhD0O[a"0=QvnXYr(XdN/ RH0]} ?VGQ@?[~[t9\iD|%T_-tRwDL zOn_- y1iZ))}=W"9_2B$y Qo*qG?  S3L UdUV\lf@m,,]v/AQ%0+h Fhpk ok{ 7J KWB?/Q}<,2" *CZ[j&oj\B ;d|D&Z w!WH$r:-( 8^r 4`0BkQEpIZzltDs|mjra82Rq< [, V~]$hp_kxf[ VMRyNG73VzirqTb<6uOCu 76YUAq1X| 4b9_X$Yr:$4HjtMFrwGR>>x,<LHj8nm0{K,Z?9LST2i7m@}Yw H8rIG8vrw; iSO`&4D(Vciq$1be}J7S'7dF*"Yi|kqy+[:FeqzWO)8xy %NgkaLw-hryPC u;(([@8?Su  F#+#F|.;8l$x`A3)@Rj)_}Fy`JEY~G"cSw9tQL3 vT7z"@ G=S "%>>!i@7gk>#-S(kgHJ0F $K:vY"*g:.xj0U9l|  8mvpFJGqh*v jBf8xN7mfOc?}.`tR9!/f6Lf.yV}ltxczOr:^(>$7dhKD* #c4c] CtZjp(KVHLq2Nad P!s*hAy6|v(kf^5- =tGTFaq?9` %X-|S;BKR53hw^;c!}ssfdcZDTM >v X$./1?t6R(\?k@[`)+xTYG&zi YxoW~a@.( Qt-U= o:).Fu].:_3R#!Z$xiYG*ypR.=X81NE(+mb->} dH<Ec6 M #Mzrq/rqhN+mer  j6i85mBi?zvuz[C)\-L*}'T;^vpP8_JWto-vSUAbvJ[48a@9GE`Soue@ tU9=hY HTZ >PMEFNjlA{zB> iRX  #y7LeKb=2=HWw*NzfGlf^_oRCkx[4t>[3N?kB(=<]BHX&wTaOB.+h)m`k J< %6EB>tw)#%D|D =hi37!Cy r?G2Rv ozprurkPU' X]0Pr3)~Y<KH.tN1f-:  ic/lykvL{1zr&xM6 h>f@^$rREdpi}X;LPe~|zqrW]-J>;@KYh|H[2aCKKl';(]ZqSMFXy^ N+=<^.%sqx)$ z/)G 0jWMGK K$6RBOB_me//dN~nvOsxJD?gbT>g]cz#(4z I,;IWph{5 u"S#C`E!_1C{lJXEkI8m]R|U)V U$ f&%[F\.PWknMHSC^_S;_D3+' PEDm`()1%:`G[9mhP&CV?CN\6]fF 7~Zq~c:gP=?/X! LB.[2{EA`A*mjvW8C<;h:r-5G~T(VQ}q J}*#}=X! 6yZ:.K`HeSz) kMHJFL:r)qY<$Q#@r^DK  AO-:> D8S84<=+Ji{ %$9>+ &-3yMIOiT5cOM6=\ltzq6!^7osT6%v$l5pSyt +8E=e3vzqbVYqnD:]fW;~wkYD*8hX:st)XH#YMQ '+_/95;?;, Aexu q]9< $'& 3U.mxvq^:;ct&sLP;/% nuR#Qjm/a@F, g7;r()ysslX>':m-`I"o8,N7 <AGNvReTPS2O B/8s 8Uw P{kQ69 ;EYaX`]V<~xvSvtst{O No@zwpkk,t}S$^Q 3d[5 ~#qBlvu$PxzJ*wC ,h@a`0}.)qB}l&!v8uGzUydbs1cJZW|ew*_C B%An]tqvkPt/ T%.'(c 6@Qq`bXA@i/?nm-L4#nt3Zk?_gi+W$guZ82 mb%z7A=L/#+*UP^^XUWWatu.rt*xFb6 {gv xI*LW_zi7a,<<)U`Wg4UsXD, .MSe2AAlnRPxdj@  GVEnom!SPT9, [qMW|L48^cuP# 1n5td;G(h]O{\|uksaVVn^hot{c0{f%4DPI0;5@Th@rqe%Q;57% (G`t+N#1 &,)P<"[@e5G4g3*RaIk(* DB@sE! |^E4$ UIZ~(_Ha<"054Ce8 Sbv UWLU +J.pY~0 _Y{~[oPL :Ch-ix6Ks)^jb/rD,^aL9wG8:! J"_${e&c5WS[Q6u )\F~5-12RZrQ%@45F]oNtmaT_A!88t$Rw- F!YUN$ ) r]zM3bf5u f1@(&/. "H yX?f1{%:Rrb^SiOb%z!` ^QOj7Wn- y4FIVi3W,igN]hB4=WyBpzdHdlD3f?V4RgX5}:gMqxL"`F&L KsS?De?@wS=-3].-/;:YiJ F-HZ_z*h l-8k!_K |foUJGL[t Jlxveu)vd>'$q1REAT;W;F?%EJJC8~/+++ /R>^4M XPa5^w@BM d,Ge folZltB:HUAsbnk?]K@H_-rgD0N e}P.FKb2o}9?OVe>SwA.CC~1exPbM>n6Jw?t2TyDV/L.bdn: tYMQaZu-R x3{ek%*CANHS=\qD=8BmHWn<|srZQYuY/JVzX4 X^m^ `3p2\GA/iZ s CYF\3`s`iB Q.\Vn Gw]@-Hkf;AZdgb-SR=k(y )@^x [nW@NmVguvkT46P 5p>04i7{kb_do3\f+1#W#7#&+!A'j4Ll,WgbQ=/+-3)2q'E]U:4 S&}CVXHX)yjz*vc?iK4 t70>4}:q_q~w1q!r3vH\l wFxmeZ a[zy}mT@";"IZ_R8#JXIq}G&%w.kDy\wt=["C^2glw}18`}g>q> >n/W*}n'?>Qe,#LQYeE~'7''t3`ELheTTQV5]_XfK?^76 62749:4&R:}'|gWLFD5~0$cfpcu)c9<tEelq@=wH]w iujEw :@F8%v  rEf*# ?Z 7x[rqryrn`Fa-L79/ Ju `N?=P+;W=B\nIo|9Q[VL9USx[J& SO"8j1e4<<G}kI\Z|b:L;*2mF+\{%p`Gz8uw`ot-zj6 Cc fB!-H wK]3 zCZ*sF@&VgdV}01ABcv /T>!;,##'$Z)2Hs rf' _37\]}qyvd'yc.b6&3A@";+joaImh] c9RRs9pVYzyZ"AF8[Cqd+?yP@/i765?Yr>^[colz`}XjU<X]YF' : (Nw+5:b;.>IWo`Ea3W4A;;, @ X% q4/YtF)207l3Wp!#*=\xT""T}6t]QC **E]xxd"7g[@SwMs!BCdJgI<('/6Nn){I6LX/dxuxHFphik fR.*1+DoH Iy9 ; tD| X)C~RVYo`@o'/f<F,6cf]>ko_?m,G] :go? +Jk(n$ @]@ xw- NfHvEs|].pSz2E^16ih~,c" U  /6$,A~T7->k jXk:DY])3Em.YTK2#f]$CZWS(z~aW_ns^ +Rfr>(kO!#e;MH:5X&i-xSs :^ koY%n"c4x3*fXpOO5!+MWV6Xfm]G"kjva/{a\esG~qrXD@%8 M&JRR,{5rT+r.pr@My! y<7J!1E0#- 7E<eMgkY2K%Z6kS<T9dJi. &14=98+_SeV.!;Tka9-t0D4QS[^iYyJ6" !"  b!F':&=%L+c8|NkV/BmBQ*8Mv'[ "H`ihfp';VyCZ >]#dh@:HT*Q +npTSFFJNVYeu%* ]o[+GGyga]V+K[@;G9jXCenIw2g,2TiZPLNZvp^%91/m$<eJO,XEz\Cd+A6 9 =9<,nt Uv-XH*s.&ZY27azRDPmx;>jc;1EorD )N,!08DUxkaarJIcDvCUj6yVyrkQ27v3v8-y&Vc4F2k@0BOs"ga<mo.A[*}(a .V\sp\8HDZJc`RTfzX,<J*n$-?OGQA'xfYOF+91!-|'_+3-pS;+%n),%Y25VQC5XLi8-dkI(nFA =@`rlt{@cnE29g%@3JH(FHLRYVdxe(L!,^46Rd18RccQ`- g7%,Dc`'KfB`\# e| \1 zu\c'lC3yMX9"N~N> UJT= `#%:PieD&\ 42V{9E^qF{d*vS0i WE1w*s'wb96i!0}8<4=e?yGu[a~G1"  C.EwD(; 0RRl~c&l"'%h(6_p9o1De.'& %yuH'|,)Px^5"%N "6[tKUG<wZRl-m[9  +zT}Z ?uE~D\gcP:1l #$DI X!hDrTCHg6FS^cw^%/&Mk qA*>|?D+ fA& 5a6EFM;z' ,;Ojr&j fR?(T(dokJ72O7@LX e.pI{Zcgn{b,2YqiCo N3}~l!i5S[Yw}-]e#J.=<GFhH>+GUJ+|sopzzb 8%39I=CN}ac{Z_nqN*.(h#LXj-seI2-7ELH=/mT>J&Lu{t6b 4YdY@% &Iw093 W[%{okmk_@r]OL*<'4G6<=5,-18 \O #&9n^ <[D)={?ELSUPsC53$u~$uomg.\I&.M {wf}[dwgb %:GgP@X-_3cR]I+ nI*sQo9e$`]^j /ej3g*IY^_ahqthIvGj=x^RvK7C7)0 S.Pv.4(-EV`]EC-sfVcQw~ikFu=vp45c 6Wiq{9\t"6TqrgV7GDIDTcwuneI /IXK\!WK#;W* n#CqXx|w|ibl}kzc@B Cy9Xypr}~y[uq(hp[K:&;9kJCNsm3@` VV,NhO2#q 0*N`bbHc(v-e!!m ArND]V29!jN9)y)@@`6 4K?v#^;5i!&ERzK\CW <R5cg?7SG?eBQLBxwR":b-85(S1CLn Bg!yxgL*NN>yZN[{t6{j2Ma p.{_zvkAXC* k32\`-s=KF7&%6HQK4=0,b/68H]s]FWd[7W ^-N*/ Ch`5&JZiR>/`.(+B`Y_I: 2DD<s4X/K/P3f9=;-0zs/RCI a>HRk ,BIJLTOcxN ).>Jq0 /l -Q|%j09eawn\^8 V4(U0CZl9n\7r YZk)~MT+r; g$~15v3a)D m 7nL]bx%LLkE}dG(x >%)eg3NaWxW (( )j6zI e&kAE/~(O;c6)(Df> D';GMRVST$F$hvB# 8N_nzT)M[m|6A1 }ihYYH].lu_xd>}5 C-a7w@IXt| q?gi^UKHvQYcBs<wLggF~nAxgp[4K0( ^=tU   q! oacigZ`]Lj. -4L| ><bwzw"y`e $z~H7HN H$}vtqlft`[RYb{"B^(xct[C&~v6X{HCB;*#?bcCZb%;cJ>7:X7z3, !9;(~jenP=gS".=PblrpjnqaCp;vpvk-uPGZxU40j+:=.1YsxiL) f: 6RoI~,;?3X[P>/#\.zF -1':(dL(A=$/Zv%=Ax*kcd8mzK|w=_=!$ <F<Y#sP@liI9?qXM{&v?~#ARWY`r  _/lTB3 ?s^Hr&H'V  14$1Pt` vZC54|<vKjV\VRER$Ybeh[pBC_ $->Sfm/dQKn'~{fA 29:81! [7? 3*9y)uiebXC)=]q4 M "m<8\y6J{[`f9q |H =ZtbRY=F1+'vn~&Lj/i "QZyO"Q$J6lQLWk =k0g<tHAXZG"sX+/Y^l&fS @*6V48>DE?0 Hp}QvS3 (#HzAn%a<G>$CY>81@,6( \BO xV7 SK:i;^  0 ;3U|~i{bbb^XTX3gFG5}fFMZ1>FRi8ZaL#f2/J`q}y~jwbq_tcm| 2CD7$%M{(y5 2OvemmdgTY7N O`R<NG++=HLMPWbu f-I=5=5.Pg &8@@?@GY#xD_lg%Q81> 4k%pBmA.|fm`L/UbYfw 7;m{.^NNts\B/0`0rH`t2;,a>2>L"ebMi@"3#_g2iZa| 5>4@q?@ H]~9MSPyJ[L;_x0kpv=iiuoP7%$Cw?g  (P})1:6q:<>@EN\skYv:uiT?12tF8j[C~[;" 1B8fa1L;l$R\;*^leGL(.."ZtU+kI.  $&$ #%'+3-P"cltlMEN`s~|hODfPKQf-|wiZD(,up5%yt<eihz5M_hgcPNB(@FJG;-#"+=Vs|zaA b>!/W 30^Jf=bX:uWj<D+'-=lQDd1nDEDC?7$dD+f $6Z8 $,::PEdQyas5p2>6`jAK y: ?2;l?g4pj0lT4eJ'I_H:&; 3yAU4:( a7 @~p\C0(,8MlticV';K`jmIn sz1g}[2 8ritvvmXk>q+~ $+0+'/05C[{'_b0q[I:+&T#p*e> $Oo2BDuLMF;c+9+0Qy|E^]B|g`^R-~vm._K25x@Ib{fVD% Z`%HpXCRSMU70jNii| 44&v`E&Gz80oDfl_'IL1n~bTL)=75550S" 2j|kadus-J;+:0#sO5,2Hi1>1EBMP\^rm~yfuCr*k`P9 w[]FD854,6(<%F Q[bhr !@`x&Rz!rKSt8'!$-5:(:26,/!(""#**:&Pl[uqFDl:)7!0:&e ($Ai^$2AK-TA^KdGc9Z*M!A%:8:]?HOO#F09%* !I-=KOKC=n:N5%)4Q2iYwtwgL/ :&m7GME){kfbO\MV\Fp(|u\5s \SXi8Uchnw+|!ZV}pL)$LfwpN*Wh(& L( >O[MbceisO .);ELRaOu?0*5Ot 1.hDL d>#xQ"!> (2 @^Pe {]%DVWIJ{6  R3LgAXbjdHc*cditU#,Ojx{oW}88[ux&dFGa#om_Mz=V0<"/.4;EPYm\I[']cnx}+|f   ,Hjb1>^y'-u3YA1[k Nw'{[n8t"(EtdDU]"? B*3Odj_sHq/uvm[A#"A^vZv$lNcg]oYkWdShJ?8 ;ZH^|h#38'b9 p\NAR,(zA(iIIT;@;BJQYfx6kq3! #1^+] Ou 2AM<W[aqfzasN[-2~W-cTez\g`a-`mV> [dkA ,_I_6jwPkak'l@t/Rv  [(v+oe\I%s]B & g,6D+\EltqjX?&.B8T`g"i`e\L3gNACN\daNL/ 5&H[8_}f1rO?&uDaEJ"_@Zku y4xqutsjN>@k.nLGT$d*l i]RUti]9F 0P|z,,f:sGxa[ex3Q`v :|dnJ 7j]9Vq8^~P ,EW\knecKFKRO8J}+voiR5DK%AF5`/ zph^(Q0=#"u-' s>z7_ 6AR~`\L7%! yK.V!)vR4.[ ,SM{quN$sSm-D MZ0:0 N5_yDtKb/aYR;& i-:; CGF:,.X"7 $Q |qiZB!:v2AEB>=@.GRQXXKt2Jbiio7c V  s2~X'hAvl]K;9Lq 1E9>DDEt>0q _UT]kx}qyR\"@) ws| >&pPTG~-wt5SZ&yR$tYB&3s&) !C[f/cISe5y qLsP(L-""R&(*.1/%;#cH} U.Vkfpj3ej:BA;,tUS;$ |O/y';8VfkjhaS:|2?gyW=%.%T--)#) I)e9KXbj0t^{l_Z*_;qCB6$ \/ rIyaE'xmhg.d:[GK_5-e{[<$0L%k04/D2W$q063$~ fK@G]zr7sy^qMs@x4~#wcOGPloT0 FIC2{pbUE3"  &@[q|{nXD5+|X'zolouz9l1z%=HJMWh|(Mq^"K.0$yaSTxbZ}.|>"<NSEE`&i_I7]59H!l)3669@MIS`pu'0o)Cs8f' 9)g=OZ\VHK@<@GIjUvaljRk-bP</-Q6H[kbt vpeWvDe*fx|Z3 8]q_f$DTURESj\l<Xp}I!%('i?n G 2EsZOt938BKQSL8$) /51.6Pmfq\" T$|3:=BM_v  ySJ{Jqimz[,yka]`kBr 3J*gU}*dACN G.wkcZI,3fsR,}}p|clacfenqx1jwX?'/7(N$n 'GWWI. #=NSxMaEB?@DM[|posSY=7=FJGB;4~/^3;GmP~7Vmx}!~@M[t{R7++ 7LiMvyhfwj-qTy-S9//F1 /'0SP?]z,Fo`4|rfVB+.<FF+6Js!^]4c24=6`aG 2" "$3:@^Nc I081r@N'z -Qkxxt u5nP   $1HQNF;~-tv}{fCT&sgb_[VOJJRcy}{nkMg'o~0RwxC7kJNG:30:BTFC>80($'-n*SIQho>ieLC74%<Vt}O]>_}~kn'Pj u_reUGF?x@FOUWU>Q\LrEy;k.G  @ GpeM8*)8X".&[VZ* f"sFV#$(*,/8F[&s+kQIUuD` q?xvugM ,4 ]%;Pdw6T RrJn4L2+C h |,a:O;B87<*Pv  &5&U(** ,(1A>VQhatfyZrCd)TF=7434557:?DHdLLU?dByW|;bR:b~wD_$<$qI@pv }1X}ZzY+8Neo n fYMEBI:&uTLFMi1u#Ou$M"@dJ/F9'cX{MaM>.E.>Rp<:f_eF(Pr}f]qH=4)_ 7e6#rG{7\ ^iigbSNXl;zCmew7zW Gsj[H7$ 0u*\7=]w5d[9% (06CEIN@P!NLQo]?q&&8Qb^@ q[\ao: K kSILS[`gox/]#)6*P-a3h=hLd]cog}mr~vqw`uQrFpBsE|Rgw eR?*qE{phbh][Y[V^W]]Rk>|' #L /2R2o!v`PJqOXW9[Q9:uyni.`cSE=@+Pbm Ip4U{Qu-Z@+(9OdojS&0YlS:%(7GT_it0_$9Nbs}~yojm|X*us{u]QWlmWB,}fVMMXoqI) %5Py(67*:Vfkieb_ZSJ>1",=Pf $&y[.V9$,<.R;dMp^timmWk3e _[[ctzR(=z+ 1 6 @Ql&GfyI# ")hTF<5{0+#Dm}o)K66(`7}m\K?<DBVyo1_z~%] %/$i9Gu A &.:k>3#&W!&/*N)_!^K- iG5d.62>LUeR-B/$-Ix!DBarxwxkP=58FV_YD" $(+--[-z+$rP* &El>\l k0]RKj>x<|Hz`s~eK#dh?KlnG@!~ 5m0>WyD|.a?]jc.M7,4'tS-|W,-X p(g;r)eGYhL>1("")8Om-=GJG0?\2 a?)G_pxy{tyrwytv|9cxgWKB=83)|b>jPHN\nU%*+ ;s3d;z 9YZ [. j/uxvW*>oi5i[juf[L=6 ;)M6e.~ xxC$0F^t D!Mnwpr{]:h3xiT9<[z <ovXLN] wf>$3BLJ8zZC5,$*A` 9Qh'5:71.h56Hdq]Ku9U'A?QpsiyeehSqFDM^r +613Yr~}~x{vY2 !>a%/0$ wbPGGOWYM3 {|  p aVMFB!E,U;sOamm8`jH--:#62#;=92-m.X9DI,]nxwkVr?c)^bkxx{eM=:CSeupE% @!rKv=MPOXrX|iXsN?JJLNoM]ET4LB/jB4Ce{U3 iX!N6IKH\LkUy_eaN2 *Z(.7FZ-n?Wuu [F 8.%$4Kd|pS3veZURME=5)lE$s T<-(*0 42*'=S m .a,8DQdvkms*xSuzgN/9R`c4[YL}<,^6r:rQ<8Kp. 58?Mb}b1h)dUW!hCykxbG 1+#D!U-\J\vXYc,xaxwIsn}l`\]bgjh`TB*BlsZD2%f$qO8.+/#6*;+>*?+E/Q6dE}`-MVzr|x{ &4.\]( 9cqC+7t [h?'Jw.3+ r^Y^l|Lvp``r.CN%PJNXLNN5SZcnyzpbvRJ>+hZS&T+Z,_+[-M188#?C @7&.;=3  /3/-2Fvg}'3IU_gqljd\SUJ@3 mO;{4];6PmJ H 8q@O>06-# Z"zJ!8M]o/1ey %<Vlz~xnaSC 3#! 8]yF}{Z}A1(#[& !uA?k%,,$ ?zT"-u &0?V4n]|}oR'(Ph*'\vsIV!: ! "NOAbto|VX03pjrusI,Zz=r!!a(bk7>#+8+A7E>I?U<k87;CME[rjxzfG f6^<^-5/;EHG?KhXr9c {5sI^ZDc.bS8k^[^chnx 6]x'|ojWQ[p)|:]J9SP@$|W5t5qkxzo j0obAd8tKrYbfLx6$&/22m4_>TSHr8" koSiHlGuGE<,/"F&[kt{\9y$rj aUE1hN[[i9x3KXUA m 4smkmtw} 0 G2NaI@95:6b9~@LZfzjc^BD{ABv\}8'+=Uj x7~l|xuy*CVhx~u[7J} I l.?KNC)]?"qg[8>m^VTSSSQK!D'>+<.A1M5_=rIYm?c ,ETYW7SYS~Zj}yV7yj`]]h^\WPBIB;3'"(')^pcftummx %V}z "6EMONpPWXEb7k/p,v.24/$gH3*- 7CKG5O(vfUG@EThz.[xk]0VTYnev p,UV<' ? S\\XTSSQJ3<M#dvk}Cp!_J0}T+{^C."#/ATds .E\"r@Xgpu{0L]cccmcKd.c^VL@4*m%W$O(R2aAwTj<S`howZ%zP%zkV>('>Sb1hBfJ`J[E^=k50.+#5?9&w`N?43*J&]*g:eVY}MJWoR  k6m7}qf{[VR2JD;3-2Fj5U(rH^iov)T}WW0u\QNMpFN91,"!% 9+ZDk?)jDT]`aQb|cc`ZRJ?Z/! q@7Wzz?zont|"8GQ\vmaK3rFooP)#HXbw 2KZ\P8tSw(aTQV^aZF%|iP8o$P:+&, )!'N}. F,e?FJOZfr6yX|z{xsle\O@. '7K$_5nGtWob\f>e`WK:e'8 V. 1DP1\Jn[b^O:%%+%g4 -GfGrM{(1/y xvobQV@/4 .19BD=*  $~%'''$ j1zx~ 0^P")*&)7U}(0."xqk`M1zO}j^YX\bhmqz2OajkfeRZGJD5FKPTUVTQMLRawCk;gz*nJf]`a[WWCP*C- |t`z3 "<OYYO?-wQ+ ,8<6p'``m$Y #/E=j^7  Z+qE|Ik`^3bq*5?IS^m ;cZ,tcQC;?Ty%Lu+On|_rGI72484' sjo~ *.+"{c^kvXC86:|FkXgmvBy-Tx 7SXJ. r^E$eSNWmfHw*yhQ:", ?MW_izweVKB4"-5<BGHB3#.4;Ll)y'8:)748<ADRRejtyqW)?T[aP,3 rAoG$ @W+`BWT=an}u_L:%'6@C>16f~qkjo(zGf9Vsv a+YG]\gknvk{^{Jr3bI',z6-972a/3.-)7Wt}|&@Zmt~nr\dBW%RT_n:_/hf>Ri@##9Qh|%>NVU(HN.k xnR+f? kL+,Z /S.y_' X0Neqo"]'9$  }&<1?NXT<eAh6 6ndN2 1 Rr6Vv rR%14/h=h!]ez$9Tr&CLsvc;wvNU7"1T /H[j|1Ja"m g L"Y6z rqrqk`~T\M@M2U8dQyx 1Pcg \H2%&8Sry_G3$ '%-. +'%%).%7SB|NX]YK0 naULuF]AK7=&2 ( 1I_q}jXG?@,NQgp2Sux\?v_H2vO3&)=_|omw )BR_m~rd_air|}U)~{paVRSXb q1Jd|-CS]chow{m\qG^.I3+5<?<4& }ncZRLIJQ\k};Xlwx7tVqkqsvnbTH?<?lEXMKTJXTWdPsF|<8~9v>fGOR4Z\VH1pSA=BIKD5% %$69II\OnI7Bi(Pm|l~UyCp6m/s,)$ |f~S^GCD+JU\[VV`w~obYV]p!Ip t%p;vJU\c}jfsExfP7    +Pjw{zuDut}jPBcC9LVYRD4 |g]]cjp"s"uwxy}  fP O ^8vKW]`bfknmkgd_1YDRFL:I#E >4(% .22-%~&g3SAEL=P;L:?<-@HVk0BS,dDu]wrO#dD$y\D0 upu?h&Jgx{#s2dBNQ3^jrsnd\Y_l|x|th/b>]DZDW>T4R(QN LJLOQND3mL+ (>VqAmr6MS$k~zcL:+!&2CT_bZH06PmjR<+$(5JeoXE90*&x5D?F K JC34R$m . ;4@[<. *<IeP9PJA823q:IDNRPIA8,Gw!*6IbzrydfZXWRZVadewd]TONRX^fq#~=LTX]rcZm=}eE%  zb"L03@SglI(  3Y(|<Tn $#!'*)%!"n(Q5/BOWZUL@5) "15/"!.8;t0mpz ":.L6Q9I;3BRimZSSX^_ZRKMZtycJ1.ZtvdhE]/V"W`pmXE97CYr =d{!g)[,U-U.Z/d/p)}wD5er^MA;;yBtNr]okfyV?&~~uu$/;IXe&p)|,-.2:ENND0mJ2'',," hQKVo '<Sj}tbO >.  &;QcnphZJ<53579:|<s:l5k-q"| De~<Wrl^zJ7{&p^I2lQ@?V1l"|xpo|~v{0BD<3/7KhyeZUR!LH>^*_M* :fc=ww1raN$>} &2.rL!+>NXZUG2 0Qirk\Z1H;437>FKLI0EP@z<9;B?KlOOLH D=(2$("! p6nSGL^u &'%.<M^mvxp`wJb0RJM_Cr  "4DR^irv{Gz|ZmMXN>ROD3'%/uFeiVG:.#.50",Eh)%>RK{I8yhS6 %Jj (sIdlYUZcjgX<]1rc]XqMW;B'625>L(^Axb,%aD\kqstvxxtjYC'vQ*dNB?CKT_ku+**\ |l}C&8IT[]^bl{%5CsLQP,L A, }pbP;( +E f >a! nY <h[\hz%,18EXns`M;' 9Vo|{S  g O?4.+<!HPW ]2cPiwt2TiqngceikdfEV&8 vVGrIXWDk4( :e/Jez?h`e{kuxnU2 zkc\~SoBe+bgr&:Nar{zkQ/k]VOF8,&)6 Mi .G`u!/7=zBuLtZumwwuog]QA.oZI9'yhYI=9=GS\`_XM$F)G+T,k06=BB<-0E[rysq]eHV9H3>4<;EEXQuY[UJC.CEMW]hp|v_D( naZWVmTQL2>-  ,Or:Vl{rgb`x\hWWPGK:H/K%Vm  "9"Z2AOZd!o*}  vW9i=mJ5,l-U4C?5M.Z-d4mBzXs '($!*%7%?CFHJKMQTTL<&(1;ENWcq}~nXB=-[v vkioyZ&z`E,$0 <JZ kz%5ER{`nnbYPC/2DPVVPG>6.z&w |  5M!i'.4:>=3# yPjS+I:MIXXccghfgcc_\[SYF\7i'~ybTPWeu 4[{(GlD_idyTJ:ytsTk,_M7#Q'Gs#C^<v\pz6EJE9(qbQ>+seYPMTf q%]:IM5d!~/H^q}ocTA*#:Rj!1 <7$ lL*{qf\oQ[GO@L:Q6Y4b5kHMPQP LF5;N,ewuh`\_ivzdQ?/!  0?LX_bb`^\VI2 (NsmM%BdjJ3$ )=Vv{_F4;&Q\aaaceogKg4d.a7`D`P_WZURJG8:#.# #1'U'~!  3E)X=mRfw}q_J6$tfWI</qWC738 C OVX)V4V;Y?e@z>;60#)L!ktcTInDaG\Q\`^q_|^~[yZr[jc`pUKDCGOVWN!:2!EVeosoe V G=9;BKU]`^XOIGJPX]\R>%.:6!-DWtcoguihhfdehnwwq{mY C, {vu|*Gd~ueP8<[xv`K9-(-9K_rf8wdRGIYw#"(B']$t $,20 b~K9-% '6DTh{]D/ |rmkow'.) #Mty^@!'/5o9W<JAGKLZXlh|zucN6wrem]q]}beaVG=@V~ +L#eWqrgWE5&    pP:-)f/>A[{Ip`3lYKA=|AoRjmjje[L?:_'x,P/I^rb7 h#A!|sg*ST4} Bn fA!V5u"u%4H\i?n^mvnuS|F netbRb;c*`WE, =UT``XK</'$%6(J,^-o'yy lU9  5GTZZXX\fq}zpeYNE<1 ! $'"  mVFBFR `m8vU}pxr k8cITS@Z'^ bgq~~xzr[E1 '8B%D?9Y$qxhZK8$r&bBTeH=17]  {pe\XxXY];g v)D]tv`J6!(#%-6: 7- sh_ZZ bt 0FU [$Z=SWIp;+zfVKB7{(#&%")' 7 R!mpY"@!& #'+.-( '5>FO[k$o2R?;N#[fq{gE.$)x7^LD`0t" ,66*  +CWiv~zn}`}O@5.-01-$  2 DS_fhc[RMMT_inlcR<$  '-5H<Z;^2V"D,~_qHm>wDXx?\v%+#w\A8!YrdM@=CN[fmoqs`w/{~~iQ;*'2Lq !%,(6>BWNrY^ZM8 *,*%oA{^C, "=Zt>fv)p:mJiWd_YdJf5fe`UH7# %2=FNW`jt{~xj{Sy7",-(1DXk|sjfhn|x\;2rKe^\jVmUgW\]Ne@n4x+$  &./5C;V=d:j1i$d\VSW]a_TC.)HlaKu/#+/14<MphI!{6^EKS?g99@May<cVGl.}wkbrX\LJ;@">H]|uno#r7vCyLzWygyy~tP #"5CO\{ku|w~gQ><3a/.,&q_L5hJ4'%.>Uq!<xYevWRVbtvcM4.KmqWA/  $5?HSbsqR63FIE;2,-7DPWUH.  1Lh~~fE '-t2^4O6L9W@mL]piSC9*2G-\)d"`TD5,*1;FJF8# {ngeju$)+++0;JYc b>SZ7q~th[M?50.,(! #*-(%3 =EKR[hu~~vdN4 7'JCP[Jk>q2n+g)_/Y<SLI[;b+_R <|0mKf]icu]SLMYk}nL#-CYkbtEw1t%l`RC6 + ! 0R|"A^vjO2#3AM TSK=-!%)-27:<:5+vqt}&:GOSQ!L<DS<d3k+g#X> &*)&$5'H/P9QBMGKDK9R%\ hpqhU;"7CGE @:$3*,(%  !AYjswxyy zwqaG( -+! {  3Oag c ]XX^hrywjS5unox&Jk *8HZmxjrSL5lQB?DKQVZez2gmSEEWvlO+ ,B[tufZPHA<5(} "+6? FK&M+N'PSVZ]`cdff,g?gIgIeA_6T+D&0&+/0)rf]Z[^diow $+52A3H1P/X.c-m,u*x'v m_K4.;D|LqYpm{h'S.;11/*"ybM</'%(19Q2\#fkmljfcaabhujYOHA4!&5kBIQ,c{'gDNa5{ 4\mN+ 2DJD5! '@\y vcQ@}.|uidejt0;AG3SGgZ|isxwri[zH_2=)ATc!j;kRed]pUyME;,zeF{ u| /552.5-I-W,^(^#YRH=2'(Fd~/F}Xne^lPqEs<t3t(uvsiW> 2 FR#U*M1=9)ES^daWI8'(471! "(*)'%$!#1#D#U"a!fbT?"!)0452r-\&MLZv.DRXY\bjruqfR8|fUJFGNYgu#Fj   %#oI%)2q0g#a__adgmz"Kr )39;:879~=_B=EEC<1# )49963259AJR"U4SBKKAL5I+D%?$:"9:<>?=:3)#/50%!<R`eb\Y\cmzrW9%:L[fnrvyzrrvseYRNMMMI> -&19<<72- )''&#pSCBM^o{}y z  -Lc pw)y2w4u/t$ux{zul_N;'    #08:4("0:@BCE9HTKkJ|B3" z k^RG<2% .<FOV\`cd`WH4 v lhlw!+3:?DIN5QLNaDo3vt k]PGB=:61) )CXflmjilv,z1^/<%  zmaX}Xxe}-;BE IQ$\9iRvkrXn5Q4 71G@PJTPTTSYP]NbMfKiFhAa;Q2:%    "&'&!")0 55. |rlgdcgzru{ 5"L3fE~Yk|zmc\[{^geToDw7y-r#bM8%  !%' (&%%).5<5COKhRX]__[UMC7o*YC*u`SOT`p !,4 4,$3?'J:SGZQ_[afbraabfiid[|Nl?Y.D/xhdjx  (4?GJF<. "1882*# !%$7*>/<46719.:/:398:?AENG^Do;{/"taI1  !(,,'!9M\f7iPgecv``bdecZI0zqcR?-|xsopw%1?QctyjU=#  +Li%/467:xAhIXNIN;F+7 .%A1P7W9Y9V7T5V1]-d'i#g_O9   %05774 /*%"!#' /8-B;LCVE^B_;Y5N3@519$;6' <R]_YPHDF NW]ZM8! &.33/+*-5>FKLID>82*xqmns"z+01/-*(&%$%2'^)(#rX8%2?K(Q.Q+K!@3&  })2:AKVcnutl ]G-,>O^hnrsuy|zo!^3IB3JM KF>5*   $0;DJM0PFRWP`Ib=\/T!LK R^jneO/ %/32-.<%EHA0xbSP[r $<Si,|=Qi{aC% ~}xfH#wjeju-=O`m*u9t>l:_1Q)C%9)11,;&@;) !*8?Id[gjbO5rbWUWYTGw/dSE>>FVn-Oiz 0@KL>%uO- '( +Haml^Gz/vx~%/3- "<VkvuiXG ;8<.G?TS_edravUpG`8G.)( (),.,$|pjlvy u"u;yRcnstroiaW-M@DM9S.P#E7*    -9@EIMT^jv~{o_L}6z!| '06w<sDrOu^|q~hSA.  sjjr '2=HUc%q:}IQPJC>;8q6]2E++ ytrqqrv~ !0>IKE6# "(1?Rcqxzvm`Q ?#/9#L[elprsrndTB.  #'*--,( +9G S^glleWG5'4MfzvfXMGEFHG@1$/6;>BEGHIIGB;3*  " -695) &8EHA2 !%%! "1+G9ZHgUkZfTZDJ-8' m[NJO[k} "  $ 7 GQVWX[blx|pdXOHB<6/ ( -@P[_\TLpG_EOEAE7B0:++)(+1>Qj#=Wo 1?GJF>1#o T:!  *35- #'' !$#(<QcpzxjV<oT.=H+`v/Ij%n@VV:hvrY@(#.8>B&A6<E4R&^juocz\r]kffx^SA+ +Ie{mZxLkD^EPN?_,u-=KV_hqusjZD,!')*+/5=EJIA6) &=NXZTJ;* ,-% '9K] n{yiT;!1G[luvnzqx{qia[TL>-(7CGF@8|2p0j1j3n2w-%  (/330.,-/12/((8J]krobM5'6@DB=73/+(&'+06980! $4<<869?L[ky~zlXC2%%$      (!5"DVfry{xrkd`^[SF3)}-u*q#orw~*3894+!&1;BEC=4+$9Qg|{rhXA!fWRRSRL A 2 " !7X}  *0.$ $Aa}   lM, ulfegmu -Ldt|}%{,w-t'srqn g Y C*!"     /<A<-~2~CIG?5,''*+'  !%-<Qh|ub RHC@<5*  ~ 7E HB6* #,572$->LW`&h(o'v$z#|$z(x,w.y0z0x.n([C &.F\o||rg^WQE1 k^]ep${;QcosnaP@4 ,>'U!chcUD3(%'+/-#"% # ,<C?0&--'5HVa il$l&h&c(`._7_A`K^SXWLU8NA0! +474* $4@B<.{|&C]t $-5<@sCkBf>b9Y1I)0   &-//+%- L i qZ D/#).2|4n2k,q#y ~|| ' 151 & '178647@Pcu $,7yEqUlekpltkqchU[@J%7$}m\NC;547BSj  !(;M[dhhd^VLCr<f7`4`1e0n/z//18CQ_ l*sLtlmaUI?5(zl_SD3 $ 0;CIIB6*  zka\[_foz +6?"CHBh>84/,,/7@I}NrN`FI6.! "$#!  "%(++)&"&) +.5?LZhp p dP5 32G@WHdJlIqFqDnEiIcLYKMD>7/" }{{}'8HWdovz2{CzMxOuJpAg8Y1E.-/11.'  ' -/-% &+ --'*0%540+ )+2;EOU XVQL$E-A5==9B3B*=6-" $-4871&   "&&# !!$!)#-!//+ &   "(*% %1772*!!/CYn}}n\K!?$9#883'"*29>?;4-'$##$&()(#!"#%*.23432/*!&-36 :@G'P/W5[=YHQWDh4y"|gL-#"!  * ; KZgt"z)g1Q99@!D GHHINU_gkh_P:#  +1342/'pe.cHkb|{ %={Xlt_SE3kUvBo2m%mmnnnpu} .'718:6E4R5^:iAoHnMeNTK<A 2# ~pd"Y(P-J2F5G6O4]/p*$.?Qcr}{qdVI?70)" !1@J QUVVUSRPPO%M1K<DC9D(=1"   %(20;6A:C;B9?48/.+#'$   "&*,../048<@A=8%1+*, )$ !%&# }l`[]ckt~3 I _4pA}GHG|GqHbKRO?Q-PJ@3%  ")058;?CF IKMNMH>0 "-:EOSSMD:3027>CD?6* .?O\govz|~o\E0 %+.02{5m9d>bBgFsHHFB<5/)$  %-6AKT\`cdcbbbd h lrx}~{vmaRA0k\ROQW(^:eNkcpuv~|rkgc\Q&?,(1 6:;:62/./257873-%! %,6B#N%W%[$[$V%P#I GIO SRH6zja]_djow";Umu a QE=5- $3@KSY]aejpt tncUF9/)&#%*,+'%$###%+4>HORRONNRVZZSE0"+/.+&%%&'& +6>,@;=H9U5a4h4h8c>YFLN>T/U!PD 0  +8DOX^a`[VPJD=5,%4=CEDA>;;=BH"L4IDAO1VYWSNLIF@7, |} !"   $3AN[gt/@Q`rm\wD~+vhXF4"}utxznfa``chp{%,-("- 9#A%F&H'I(I(I(G(D%=5-&   %/7 = A DHLNOLG>2 |#})4CTdorofZ!MB91( $6A$E2G<IDKHOJVI_Ei?p5r'mbSC5&}zyz| )AR^dimsz!*z/o0`0M/:0'24 664-  =Xk uvqib_^]ZSF2/>JUao.AJJ@j1P4 z|#1CYougZROMI@3 "-:ENSTSQOKHEC@<6,  )29@IS ^i r&w'w&q"fYL@7/(!%*-/.+#$,2650$&4<<8325>HQVUPH?9446872)+7 CNZdlsvvqgZMB92+%  $1<ENV_&f-l7pCpNmXi^c`^`X_P_F_:_-]"YQE 5 $ '7I[ip'n7cCQJ@M1M)K&G&D%?!:3 ,#&.49<>@@?=:72,# ")2<EKOPNH>2(! (2653249?FKOQPKC;5-180<.9/22)7!<=80"%'( &     ! $#  )3=EJKHDA@@@<7.# +>NZfrzjXH;1(!,9HYjtxsj|]zPxDx:y4}3453-" !)2=IVdru`G* ~rjgip{  $-&8*B*K&PPLD 90*))++*'!  /=IT]ejliaUE2  !7 Masr[E/ &+...-.16=EJMNNMLKKKIB8*  !-8BHKG@5* &.7B LT$X/W:QCFM8V'^bb_ZPA.~pfei/qA|MSTTUX\__[P>% &09?CCCB@>=<?)E9LDQGSBP7I)?6029CJLIB8.y&k b`eqs&d>XWOoKMUcuwmbUG7% +8DMSSOH</!     $*2<GS]cfd_WOHC>95/'{-o>lJmSqYt]tarcoengqf{bYL<+ *3894) "*.///16?L[jtz{wnaRE<4 , $*+)%" {!x%y*|.1.( #-22,# "#" '2<F|NxWv^vg{oxxiWD!45&GWcije\QF=6/)# 1@IJD;/$ |usuy{|zz~ +<.KAXL`SdYd`cjava`^XPH>g5F*' $,-&  )6AIN#Q&R&R%P$N#K!G @6) #)/5871'!.55.$ %7HXdkmj$e;^LXTTVQSNMIH@E5D$FGD:*",6@FF?1  "*5DX.k<}DGHHIzJmKcJ]E[9Y&S H8%)4;@E N X cmssk\H4 8Sj{ oX<<Xn{~yocXOIDy@}:/  #" ")18$811?"L TWWVWZ\`djnnfV>$  "'*)'%"!"&,4<CHLNONMKF@7-!  !-9CILKJIIIHEA:1$"+16<CLV`gie^UME=5 + -=ISZah ouy"z,w5o<eAXCLD?B4@)=:77:AHMLG<0"   #5BGEA=&=7@ECNFRFRDO=J3E&A? >>>;4(!$!  $2::3' ww~ "5AJ(R:]Lj^xn{zmz\fJO94(  $,#2)5+6*5(2%,!$ zrpt{*8CHL4MJO[NhKnDn;k0d'[QE9-""%4$F Vbi kie_ZSLD8'zbRIFIOW`jt"'(:+G.M1N6M<I@FBC?B:C2F)H HE? :53248<?=5(   (4>FJ}IxCt<q2t(} 'CYjv }sbM5#8'K1Z:fAqG|JMNNLF=/m V?)-8= ? > :4,% '2:>!?&@+B/D2E2D1A/;.3.(-+&  %5DTc nuyzzz y yzzxtk] L:(  #-7>?;0!!+7DScsugWF7+ "&+07;<82-+,058:93+" %-48 ;<;71*! *:EMSW Z]`c c$`*Z2P;DD5L&QR OKE?:51.*&    $&$ tg\VUY`i!u'+---.1271O*d w}n_RF; 0% !&,/0.,(%!*27:<;85413-J%[gllgb^[XSNG=.#.7<=:4+# .@O Z^[RE8-$tjhmv,=JQSSQPOO O%N<KNEX:X*PB2# %: M]ju ~nU: !,5<>>s=k<i:k6q0x+&"  !!   %-5?HRZbiqw|}zsh[L>%01!:?CFKOSTQH9'{upmlow"(,02'4246341/,)%"  %/ ;I3UG_Webhffda^YTOGD79&-%.7@HORPG9& %.6:<"<*:0:4;6>8C8I9N:N<K:D6:/0&%%+/3!6!;CNY a ed\P C"7"-!#"#(2?N\fkjbUD4'    &+-../5=GPU*V9RHIW<e.q z~ ~ypdYOHC?;6.#  %),-..//0/.,)# , E_w w h Z L>0"%''&&*/48::6.$ &1:@DEEDDEEEC?<71+&#"!! #&*.27<AB?8/%  3BNW^ci ow$z(n-`1Q4A72:%<=<7/'   "&)++'!%1540-.38= @?%://8 >BA<5,#     '08= @@)=66B-N#Ybhlpsvwwtn e X H4    '7EPX\ _bgmt x u kZC,!'($ )!5)?1H8P@UJ[U^__e]eW`KX<O(GB??@@<3#"/:@ B?80 '  #" (/6;AGNW#]1]8V:H54-$#*/1.%v nlow $/452- %$2AP\dhg`TF;2-*'# (,( *7ES\`\SG;3/059<;5) "3 AJMK E>60,)(&!  !-:CJNPP!P%M(J*F-B0>/;*7420.+& *8CKRYajrwwqeVC. *;KW`cb]VNF?7-" $,3 <FP!Y$`$ddaY M?- *38(835=/F(N"SUQJA; 6531,% +5<AB?;4-'"    !(0:CJOPOKF?91)  )-,'!    #+4<CJOSUUSOH@7-$ $$ !"   %*/0:2?/=(4'  %+0/+!  '+,++-037;?BDB>6/)%$# $$$ # #%%"  ")0 7<@B BA?<83-%  %,/-( "'+-,)'%%')+-.-*&"      &.5:<<94/,)(&"# /9AGLQUWYYWRK@4% '/6;<;6/&$-5983-'%#}!#%%%#!  & -2 6 9:98777 5&0.'7? EFC<5-'#  .7:82)!  &/20*#)6C P\dihbXK<-  />LW_baZRIA91' $%&(+/35641-+)))(%"' 4>GLMMMORVZ[YQE6'  !$ $"    !-9 A EFDA??ADGIGB;4-)&&&'&" &+--+)'&&),/10,&  %,5@LWafihcZPE;/$ -;HUajpssrmeZNC;4- &  +=LW]____`bceeb\TK?)12 <DKNPOMLLKJF>2"    %)+***+*,2.51513./(,*( &$   !)*%&-59950+(')+.0121.*% "()(''+06:;92( ',,*'$$&*.11-$ #+3<CHJJIGDC@<6.%  "7JW`b_[WSPJ@1&1?O]iooh[I8) $'*,/38=ADB<5,% !,9FMNI@4( )18<@AA>=<=>??<6,   )5@JOOKE>70+&#  !*29>BEEC @ ? @ CED>4'  -7AJRZcjorqlcYND<5/ )"(4 <AEIMSVWTMD<3,#"1>HOSTRMHD?91' #,3775/(")!1%4&3$/(  #" !    !$"$(#+!+ ) %    "'++("  #(,.-+(9 EL OLE=5.'# !"$$$!   !   ##"  #'))$ !%+3=HS[ a dc_YRLD=5,! $+4=GNSUSMF=4-$((%-$1!6:<=;5,!  %*.00,# %),.0 35664/*%! #(-132/+&!#' )**)&! "0<FMRVWXXXZ\^__[TK@6.'"  #*.132100258971)   !!!""###"  &6BHIF DDFLQRND5"% )*("     "(.379!9&7.48/D*M%UZ\[VPJD=4)      )18; ;'9-44,9#=@BA?<97654.&  #%%$"  *5=A&A.@7=@:I7S4_3l3w1}-}%wl[H2 !" # -%5,918526(2, $ '07?FMSWWSME<4+$ !.9DMSWZ\]]\ZYVSMG=2& )6BO\itz{wpg^V O H3AD9Q.[ cilmljhd`ZSJ?2#&2=HR[$b5gCiNfU_WTSHI:=/0$")7@DGJLORRQK@2"$*.1222211%/),*')!'%% ( ,13321 / - *(()+-..-(! !+5 ;?(@1A7@<>@<D:I7L3O/O)M#G?4*    *3:@C CA=%:*8-6.4//.'-- ,+)&!  ! $&&%!  $&*+-,,+*)'&&%&$'$'$'#%!  "%''&#  "#   $+/00.-,*(%     )2:AEFC=6/'   "%(,/2469<>@A? <6.% ! ""!!$&&%# ##  "&)******(%! #*.27<BHNTXYU NE;/% )6AJORQOKE>6&-."37 9;=>??><950,&    5FS\bdca\WOE:-  #&) +)%  ""0*<2F7L8O6P1O*M!LJHE@:2(  " "  (2<H R['_2`8\8U4J+<!-     "##! !"!  #$"    "%'( +$/%5":>? <5," !+5=EIKIB8-" )3;?@>;62.+)&#  $).35 42.*$  "$$   )3;AD A:0&   !$')(#  )4<@@=72-( $ $ '(&! $*+(  &1>J U]bc_YRI ?4*"    '08?DGFD@ <60$(' (& #      "$$# %*/358::83+      %,15789:961+"    ! "  !%%%#! $*17<>=6-! #'('#     * 169=BGKNNJA4#  "%#  ".9AFFD?93-'!  ).10-&   ! %(,036762+# "" "+38;:74237<ADEA:0%  &,032.)#   $* 046 7 8:=AEHJHB8,  ! '+*& !'*,)#  ") - 0 12 0 .)#    '+,(!  $&&%%%&(+, +'! !'-240( $+-+& !      !   "*./,'!   (0563 ,$ "%$  . ;CGFD@<963/*#%) ) %  $*-,&  %(& "%(+-013331.)$     "+3:= ><97542. (   !!""! " %''$ $,47850*%##$%%!     # & * .4 : ?BCA=70)%""#$%#  #&*-021-& $ ,$2)71988>5B0C(B>6 + "",'5):+=+>+=*9(5#.)#     !"    " ))-//202000,0&0!-)#      "%(+./.,'  !'*,+*(&$   )8FR [beggfda\TI<-        ! %*/23 1-(    "',037;?AB@<6.%  %)*&  #+28<=;5,!       #) -010-)$   (-134579<==:5.%   !$&''$   $'*-02'3/05*:#=>><83 +#    " "!&.45 3/+(&%$! ##      '+.146!:+=3?9?<>:931)% !'-28<?>;5.% "(/489:9862,%      "-6>CDC?;630+%      $)- - ,)$  %*-..+($  "(,.//.,,,-,)&"   $(** * , .37;<:4, "!&,..*"  #')*($  #$# $'(&!       %/5763.*'$    #'+--*$   %'('$   !&+/11/*#     "&( ) ))) ) ) (&#    #&)**&!   !&((%  '07=AA @ <61-****(%      #(-14!5"2 -(!  ! #    # ) . 269<=<7/ %    ! #&),,(! '1: BFFA8,%0:BGIGA8/&      $*0342.("            !#%*/49;;72*!  "$%%#     %+28=@@>:3+!   "%&%$$%),//-($  #$"     "# " !  $ &&%"                    *4;=:4 +   #&'())(&$"        %+ /$1$2"1/+' "         "$$$"!   "$%%$!  %,1451*" #&('&#  &,046676541+#     (2:BJQV[[YSI=1$  %))'#     "$%%$"      !$%$#"#%)++)%        ',02 33323320,%   "&)+,+ ) %        !%'))))**)'!                     &-/.+'#  !"!    "#$"! (4?IPSRNID@:3+    $'&$ #'*-.0256640*#      !##       "% %#    %),.034531-($      !(.231-( !      #&( '$!$&'%#        $')(%#(**)'%$"!        "%)++'! ")1 6:; ; 851/,)%!    !'+-,(# "&+.01/-(%"!"#%&&%"    "##!      (-.,$'(",./-,*('%"   "%'() (%"'/5:=>=:62,%#).2452/#)'#*+* '$    #*/11/-*'$!%)+) %           !!  $')****)))(&$!   !!   ) 1!6 9:952- ) $     !&* ,&,**+%)!$  !$%&''''%"    !###&") *(%!    ! !                                  $(*)&    !&+.1 2 20-*&"                   $*-..,($       & 09@E"H$F#B ;2'                   #&(*+)%         %*.245530-(#        !#$$"                     "*29>AA@=93,%    !(.468887530*$  $(+-023 2 0 + $       &-36899863.(          "(-010-'! %*.147:<=<83+"   !$%(+ /2440)   #$#                          " "                        $''%!                "#"      !$$"             !!"""         !!" $ & ' ( ' %"        #%'$')%-"/0/-(!   ""!         #%%$" !!!     ""!               " % ' (((''&''&$"    " % ''%#   !#$%& ' & %#      % ) - / 0 0.+'%"      #% % #         !!  !###!  "')**)'%#!   %)***)'%#    !"##"!                     ""           "$% %$"                                       !#$$$ "!             "$%& &#%%#%#           !  !""                  "&)+,+)&"                          ! # $&&''&&& $ !    #'*+")#' "                    #&))'#    !#$%%%$"    #&'&$!                    !!                                                     $&& % % #"                                   !$&''&&$"  !#$#!                                 "$ % %$#"                !(-/. , ) & % #"      %( **(%!        $ %&%$!     #&((' & $"               !                              $ & & % # !                         !!                            " '+-,+'"                                        $'*+*(%"                                                            bzflag-2.4.2+ds1/data/std_ground.png000066400000000000000000024330601200563112200172360ustar00rootroot00000000000000PNG  IHDR{C pHYs  gAMA|Q cHRMz%u0`:o_F 5IDATx Io#uWvlWٱ;I;!I+MBa H\fa| iN9 .l3$q+Ď˵W@O+nXKB)65] mQ4S1r]#p0y)5O3u "3TʽYUvzsi.f.jmr7O@ pawߕOSomuc=QFaRremDce ($R- jjp+06כ~~rp~a1-|?*JG,n[u8Vʊ5vzFRdAsw[J䥦BKH*G[ۭtvl @1ߒ:nz飧h~/4سs8< )ݠ aL T((B@RZ^,݉Cr;{V%8!$ѻhm,MtftN'0?Z~;,{z#2\̭3}>qj=vc={U-dh`!̨!W|+ ")y!Hh}߬rlAp#=Wf~>J4}ȁf=RqL;&rdeq< ʦ$Tċ ;],O$8!Wc~۝.v(}6XTs}Iيԓ-35mW<0ڿEDqZ. ." $:J12 hP ÈV,ȏ21 :(n^W M/ `W=6w$&+8X{c4ԑh1G)F/409F̡L -)p޺ËD˨ri#{M_-ݏU 췎Y=g;so ' y )6I.cq%?YO|w>S VUI@0(2;fPTU̗uS(ufUH $@b("C Ԭ*(Iq7C?}i6,lG_]ڈHp˛bȧo~yrqlLʑ9~Y3  Hlʮ?x[W7!EлfcYKxSgfVH So,gu-ā$Hr N\AdW?}uVRCFv+b1/^ClwO#EUFB33 -WWO:]} {mWٶqAQn,<N\di.H?Պ)#H]pg%Q #řٚYq?k+4wWxe֏D S"Q,Saȵ~lޣÖc D(3 ;g!C']`h@\"ð6M\wU,Ӿ ,+ďԋ./ggS )[ 1$*0fy&@O?^]u,b D>re<ȏkLLrjh ΚY@Ev!_sY{JZ˸ M_=LF\_I?6ީM\mrD2}Sw&VZ1Yv=sXyFǮa=:9'̿4~d`h$͠$?~tiyfݶo#jP㱦So/ N1d%q]Y|jR'ncڦAI3e .e#]4]yاDlLeIY㌘oO4C=ϏVmדهtPu%"t3GqQ!PI7׷e(9iQikaLC(;$(eՏ6։aM-i=(`lk|Q^u n%=Lآ*H.m( $H*iWUvrI  sc{bٲUV[$e/Ih`~|wڪ $II'iIba# lt anAZ+;1BDm۵=4yV"CuMOb hN$kI{ś @}%M#U1ulsl"Gm5U:I$\䙇4K$h>B040(ݯw뮣5ZәpߥU ~L2x'tÃ˟_@-ek_[ܳgHXVXѠJ̫&DQL3wR;vARMm.5%跉.ßr揦/KT*T\hW7áwAWU-- =xeS]<[,OrK*VLU|<>{{8\tG%,$}LHb4+fE LCTHиe\x w! :0)mu䊁Q'OEQ^J4V`wۛΪa]]r~s%o2z,I|0M}U -|y8Mu 0,b,fn֡6єF937,"ds&;<Ȝ\sOG2BEYaXh8d0t`,Ճ,~>}F CJWvkiki\\]$P駷o"vŹlI K ? zڮZEY&a`Ϝlv?OuĬX%KAо8.b`Q$Y2ϒjN6EA4m:X6XSI׶8 _qE)\*i 6v|5.|ǯ_Eis}m}XБO km# KrWT$'?$K]Fd>\0GE\e!,IHQT۷jB(v<iAԪ+h́@jA]HVUQ;IS ZxoZ BQh>A) Hkf3\Pc EpsQ͠.>ϖŬe*Ei/9+:ISOIH>yu:ºiySDPCal⺫4SO.T^{BS 9+o,Ӌe$ zrlʰC1ip5Y-Sm#%gRL)I/2n^}=;cltlzȯ&˲ Y"S-* WL tsw+9"37Gh5ԅ,MPLe"w/`dyovmi2\E ,st(vARn><p JtZ 7}J5r[,p}%#Ӽx.?+{r^-.Oޯp9ru@\_Fx>µ"<ʂ6.geY7N`Io?6Pzu >D8] ]P-Mz C꫼ɓ"\w_ /϶IqLz* azb4^]2%#A!ATxȃOQYQp!覮:=d5}\eOw-mC@yЮph{:@++X݇ Sq2GsEMIea3"jY S4SG8'Wt8g ( "ŝ$d[6<ڦ@!&^MT%?QUZñ!f& 'ʮkAa $2,l4l,fk8.u=!aq: gMx4[.Wwդal΍_xnH-ܥuFDP6H:tXweݳ- (ʮaӲ)h@9Il9g 6V) L2%%P|\]Զb23=vh*Ţcѩ 㽗a,03 g1Ιñ#RzJ6lh/pV?Jw$r$ԡXr/w=7N Yjy߇GhڼYsV%m-6NI&_E;E;m<ӤI& Z:W0|:N$>3*{hdx64U1nmA"konn4U!Ej /`VtD>6+xb9~2|&<.ܾ?e%btqZf"2bx«e^O~~—SƌCGbxPű7 M~}gL92Qq $ax.ù]e1V,D5e/UӒ1)uËАߟl|_lI~WDyLŴ}s寯a^~a@؊/[o'"*+Tf˨#%GvBwptA߹WC r=&[Zjjr%A4ׇ,a8TS4+~@ӵ*o&~x|(ʜmYJcqv@*RX:Nͬ@e={C[6&ru"yD!$fYzMud<-Agy'&}8 Et fUGu6dO( %K o7X2)hUS$EMv?I_ox|FAEfVj$럯oooyhR0:쳿3kvyKN4mK!F j LS}*s3V`㧽mjfbqY"~cCE^]]u2MHN6eb dG&bμH I5p<[5RɊ*3?|֤25[q]Y#H(lɦz`qg_5K*a*۰:pt*bo;Hܱl6#pǶi(s K/~`"LU ْh"Kt:z< #sZܾ6k_1dЭ K]T8բ;# ؿr_y =d(D*a 3`dU0C &Gӌa)5J¿?On{&*Kk9T]攡ٺYk&P,d:WgoNX_d`睿1wzr>ѧΑ4O"PbE#T֩ʲbM" /s7vdl]Ct՝]|;G9->%BP+J#.oҾIb]Plbq3hQ =@.&.y@ 4m7(q ])2ۇ<1'0DtΏOulV5Ey6Jl[V7L-D/D6 ~edAugw#HX&/}w1EU4U`g&,2~j~{7Mn7gÉ㓶X"-{Vg4&㙳t ML0T4:QRk[En>ݾ\oWc+6| `45O#YNF2C3q03\^dZj(ZR^Wd } +$DSaл7VQ=e|1&<}~G(lv,E䀣TUoΐՄfټϞOӟ2آM]hf\n'uR.=}~ج|P'* A.Nt[m.J,gh!]Ni>?S[eɫnC;8<%ٝyU[~{Ω;~=ap$y\e'8(.G#&8gaQ˷w"^ t[m[}/Ijp~\fb 3͕ʬEDaFp58p+Xg$ЦI^ QW@TKt! ݆k̮ ֱqˈu&ι}̸f4s841 b7o_Ǧ5I.D-ać) defzh}}~3D~ a]`UZw>mݖ+hBZE qbU#bSPV0o 鐈(2ȭDDV]! ǰFyW+RC E*YmǧNFn@ MΞnWB<ՉA P?TCt՜_4`6R?*o Zn1&0-yNIÑQDt+n2$Hl|49@8al /.''ӟEI USԝLLJ8;ҁ/wDF^QGc?@Xʚ^?$0 I]]&̫W3EeӆӇF\ujF_#DHBt]bk}q2n=E6]nf^ $njLjt2=Ogw.\ź&UNCL^·)|g;8@ZLp8f{辱t^lAPe.\Y0F5`4-<ү1Qd [=>%QTW,5)/vZg*~Du,^ j4"3>,dC}" @5maXґt$"$V/iLm{v:δiN H娟b>p@*h`OyqmEY8T%'珏 L@0$ !uCECn~ÂJ,SMӎk;P_EYȊ+!.LC`Rb &QA1'GPx}t0xn CJ'W "~W gn&5) dG 2+$A&^|~ 3>Y¬* ׻ cNt 9+n{ P DG~@6D$jY.ݻl#5\_{|Ûþ;b+Sq[_^}q,٧m)kv@CQB:'_]Y[BR&Α:Jbh{ \Z'%ä < T\\9l[\P&Bi>`l0(aSźiMIv7Oj BL2Z^lVOfǐvDZ1!+ a6k@c%Ut]&?~|1o%iE;Vq۹:$ϧqʳ"FE6b O~}AX8Peþ2lptUIkXYGp2O[?#xF4 qWOMsmaU<ܼjXN+(EY#~N_^Ylܝh-nKVۻzR|C0$kRQaq:<9dd@4~m=e%Q&QT%uddf;ϟMnayM.Os;^YbG=L,?vKvtD]^ZTʱ!T..'W^ 4Mࡥs?. vY!E2$<218^)n :TIWUi bg-Z ~d3{ Bzjs?MBD6)9\4}o}(vl?,˝BwE%whn z7i)JX??*KEXd~G5 dvt|>. N4y$%(6\49G@{:œl;˃[:T#,CHjB3q Ǝc;$ɤU+$ Z*UL6d2q6Ɨ[KyŤkXL*Fcȉ, 'RX9MS78pIVWehzƻ &(6zAK;%UV by.H X$&5mNw).f8օfOλ$ށ41(!ݵj}RX-p.+p xVl}svo//F#z~;Ug53B ,ɾrwp.#=WkH Lg&lI q_)]1jPr^$^~ʦ0B.N #X/)5'>l̊mN/axsz^j#e$HxXBC~>CjIqgޠ߅3_-˻wE]؝!"/, J*tbZdJZ1R)4! 輦kp^NX8|dڜ631YR#YCEz$yN H5(s#M:,Cm oO JM9N 'DDܳ_~<|t3~uC[o_Y& hy$Nۊ…ˏw$'JLʂI@B&r~gp9@ H?7tH܅N9(A|Aω|Uқnn 2ugo AYK7W`2ij.Z1}iuwŋ_zO`k# q¦)~tr*w;$ fga`ȭ?'&S ͓wSHe8Mb3Do~Fۼׯw׳b%niwxTZ?0񃽯7Ao\AGw] 0秿c w)QUm5G.LQvotnqGA{wvmmšƗg9}4.fl1C@Ǚ:Ǜ|>YLܣz@B$q6A M˴<®G訁. `ƶ~>VNLETڶey>Rax鷰t$9ahB˼A&eS2mZf^Vvl4ۊ2:D& qن?>/n1c0R,#HЀ KXJoudN͙:ZݮV DۮnuPZ-!{(E5G#dIǠ_XV2/ow^ٺˬCdXn +󺨛 V VI׵C Mռ|ݝ#0 JlHXLEс uY0Ž~)I244N'E>c>pRĚn٫/_.>Lx;Rhx<׋~T@gziyEÐ6{h˲PX%N\"'m\&E״yZixzVwȱx1nN`nufӺ*ȋw+~zظ[ zpvGT¨EuջEP{D,4(/2"PϯCYUD X*0kf Cρ;yg2kʴH)X3K ԑQ9F??>8 ;DGiBU= *՚XˬszuY zgckQ +OAXE%Y`oݓuJ|`zyt<7lu>^}Dm`~敖mUc913pb3;E ժ)csM܈؞ |!`&vVRWKJnʝ$܃mlw~Tqio,98ijgd)0q!-QbW4bֵ^84qMժ|Zh92q-vqBTxESZԸD(7VOfSQfB@3Ĉ`j6oP-(u6vžiG+mpR_<.W5p_&,FϏKpKc83NLfѻa_JVhwgmnwW |UAB#WgS3,J ?\^onn+1MܭD\]^D/݄93Kw53 ƊSW1UCP˶CGQ{:! ~ yX{{Hew|aUUMX,ɂN 7op2T =vuZ@[DEa8XgQ5 4K@"d|~>:'I(ؤ[+gո' ~UjrWgL)`nѴ4N0 ȋ}lQP$Hv`^Džun}5V um XӴ6dY>m4 ~{p #2T2[;Ąqk bT0K=Ŗ\z1MSIyq"CvdX$nB:e$( ?IY}aLD@C 膾߈JT^եP8b .?y.I"pf!HH:r "N2db@<;uL>( ,* J qW9(KP䉝 ӏ?Tu I>Zf f6k0#PKTey1M@,"̎Kcض tmCa yRd 4.Mq8=ۊ R"8)K@<{ AV>mhCNI]}M-I IEk Nuvum8+<_/wұ;0]HӐE6ЕʜiX(^Hd}k")BW%7T& Ǐod$Mctɴ3]=l~j|wyn+Z#UW RU\ca]o0iv Ќ0.hGΔuw@.E^x8I^iQŖzWͳa[ ȃHB D-'Z߿_Et|vq# ][ޭg)%?== ܤ؁@ѡ|ÿ]ݧ?W,HCx\_V0 6''i>GO=rMw1 @u݀ǔO{,趶%5DN0m0V >U9  D+Zw p:nOs*SXXJMB$KA6>i:;K~{؅ۛ[a'S?\Ъ#$//d+Qjz:Zf=iؐD i>#?K2^(=erd/:LSTI,hHIڴ77ej;`K25W.b͔GjD ?Db7qp1Ɔҕ0a 6Ѡ$6ٚ2!`&eY`Qy&'aBrHY<"@nCShm_7(F%A`{ ( u7x0/*{=xu8AW_۵Ԉ40GYڴǶ"h%7t,]ю5[6a<ag&S55v ]+كy'3Xf9d۴0_]46PPG'NJ) gHH[nvK_i0b?Y:<<ԇdsF Hh&k*̹͗0ٺ6|]LKyYnà> #rdLgg3XrjvjvI!yQZO~I/~.l in H*dmOe݃c`ŧg^ R&50[ԙ)du3O׬|M̟xAmHP"^l~Cx`ɪ16jqm#(Y+0r"`Mu؁WD>-v?}ՅIdYȃaX`x,?^V7̣( .N,ոfQEjȼ%zfYk4CLviرrUA>bD)WZG]U&mN:$swm )\Be2h"" 4 JOeRb@`tGIx:jz~ˢPtYxX#\̉Q kE"|n y /\ 9I‰,ɜ=]]iN'QS5r`A ) 5%6uhφ$4AUQRADX%Si}MWuP ,YJ~~x.ߢ+}?~h XLFi.u>r#˫ӳas}qn LE:O/HGd`XӃ o£Ɩ&Y&bԺ4NwnKGz% UF#ȪD݇2c>7ŝGEPϢTB9Btƈ1 g%y{s{i o+-kqswˋ:}4M9jOu4$_ j7hSd Ԍzȏ­ŋgSb5}3}*5R܋O*Ě"lן__-YyBqлWmYO#: PT:fO.Qakp/ Yj_4KDgz+6hCoozoLJ߇AG,,:r5gMiMcd2N|FEW.&e&q`QfEU|l:< GVy<֔O[mi4c84 w1i ImN77ԳoPڞ/C Me^|s6+8+{=ith.(6KCӼK}*tQp~Fy\H|kt2y~Yafn@ ֔ޭG:zvEcD[z+ʂMDQꤦ*Ns\֕DO! H^1qXtKEUi Wδi# GH$6ipm~/=P 'x7/3<5RxjѰTՐ\&͍2+PȊ⨤NP`,7JDs_=CnGH@;BWŸS N@/b;g~Eh2뺚fg[BDWLI5jHͲnJgEEaHFd^r |hV/\{;NK]I I: +~_IW%G9 +e˴})b]@VյZϗ>XoL W;^ ߮n,<$ aK0Su,㰈_V0@L @,2 \eAq@1!VӎH} ȠӡolǛ7soRp]Sx@.bA6δ h⸉8L[o}# 0Pa=[, ,4= ֕9m22`Aռt \SvBc?Փ.@znT-"w&8InNCZkp=UlcM?lkl:tgI.eQ.$* G `vLY67WhFg0 mw XdETDj[iJ^ƸEZ:nmHe2a ts9OKڃ__GֹZ=O!BLx69%|9Ș/tAt$rX%#DfC%!oRQWa f^оr [3Nd)bc:W44O4M 'gTAo {ew>='tG=vz+>fҐo "bDHew/ \ @7G~涤* Uiu Hΰ8Z8 }jRoO݀Yx&B"4R)aٷ6PЈ>+ɂ:I ȋ,iި&"뢂EnEQ(ĝa0a*7 <.oס%WdgqBt\$4KBs4',x'n>Mۺk0;(FdQgdJhd:Kj*"HQHqA ǩIEːN8HI=p1 #} v۶0Lq;V[: MnE^h٤8QDq?_sCO,Oh((^9؛{P(܈ ,٭DؠrwhBUF?m]y(Vߵ< (Ց"4ibUQP tŭii$|믃%3flaLH_^Ϲ(DApkhK?:!?ugٞ>8A h@"Q^rɚ|64YfFPhYXڥJAʴVSIRQ#&'nKӻAz~5qLǾBi/13f}^^s,P5EN*ۯT gWmE~\z=NiYR9ΘIa:}$f`8{j(r3:&鶻}8ka;tW*ΰ'9ZbڄT׸ Q*8_MR5![R8I X# }R/#M`84epwel;~wvVI Q1!RpD̪4OrPŘJaY0#^/0 q^H4ܐ*ht,4m%5XXnA UHXzXNd܎zFo^Y[z=TER$iQ Xzl"oyZǸ!J౛N@;xrȔ355Aݭ kMk2QiPA}g~*Dauzu&4hᘭ2[L G+p<<:.ARŖ`z<R79I>2ӶX 1!E =Sqth_IࠔKƏX-X͵k;MWqwT#^Gmb u^ŏ??dٖ9Ammvr:`.YXx']#"B.9`L!$mԪ=֯g/tVo܋8ZG]tc LIˢ80C6ܯ増 I.|'Ib.a|./V7<µ7)I$T. Vh||uN"OP4nu2,>PlhڧwW/ü%xGc4|7QS2t >sHw)4G&zu`͋_oOX 7D"W?CbK&:jO_Xϯbv[ 65d}3: t# c@ux;çdMMv T.-j[vGڶX~|?i5 SU xW- Q[i霌KL ʽZ7"ymK*0i]iL5qpaM4lqcQ7^'oIfuR5yZryx^q~F'`yt 9 AGp4ZMz%F@U3*p66MHcr\d8T?NŅ{Qb/eVͪ+q\o0kX&~< 0wVV6/r< .7 D''vlUsjieop~L߿u|'1ISPZZlVW7 V#kFtSך4b4 ]?">eqmV.vA)+}n>,ɖv6G)30f`4 &!˺s]9JuJN7Ӻ]׃xŲh4n '1n!~}L[O&b@waه%6x~86t PD,n/g7-r!1!t[{q0xϚOk? =y $Yl2Ul]d2|ݬgMAjnMKᝫMlRũ=QAGN \@F VO[TVQwU+26A[܇^(mf[C: 1˫2*~誷8գkdi\_\r $銤iV?~xzyrH,v \VHf~0g^\\UR^HFHQf+,-jDOzl^Ǚso 8MQ)#3\zr86 S} FnVS $p(wにZn؆gmtq`.OIYM]<ÎL;g1wQSv}C4 K`vd4M~{ZϓXT$ B7L"r? S{մ9Pde$i>Ms<[9,'E|Iwu#6QtnNו0`[S:l qtP7WDԡ M_רS̚40&6#jɑE;mtIƲCkA>߁LuT; iqppv;r7!Pԫ(Nԝ]WnIMk{%TC:ҁ.37pAn^NE xTaGLcV90w j$iHD+F5 i.2ܢ#H?{3+ 0SL Ǿym .pj׀q.jZ' 4LzEuSI!\ifL\)%M̬U=!NHq5;ۚ&~lM"Ct\%$l,nF50lQ-|EaE0D~2h8^.VXݾIu u.;}:!4.ֽw+>'|8&y8NYhgr ] # tOdv h !ɂմ)?qS VxAL7hǔvX{ș`B[4x1UQWd4 /I@S5ʸ= U79g̘)A" qk^dz!ʼr!K3';&p "/K ˗%ѐD1ͽ,^˞vO^WJ{uoeq"7iRF$I ^~"qIZqf*ݼL,kmA bC֬ACOQ7|7O  2CэB qda5_n!gfjx5qDߐ6Uw=K1Raq 7~esW>xFk$ E<N[V뒩')pu8Hwu.KVy $B1I0YȺb=9Gx)Nx eG&)3sSg Hq^R(+@5I@sQ>Sf \{ڲt?:u{#bx8fm*l>an_ءO"Ċ.n7|V$T#T o wξi ==fw<t*Jtx}O8'ڍxMjisH5 qX@C=6{lnvRT*k'm $@-@SE*ut7L`|c@:89F r:0YF9hCxz7G,cj&;ѿD4/,ST%=?jea7MD Q`$D1 {I (xڕ \DoJ{!t,=ڠ!Vq+cyuκQū7fzo\'uy7['ˋo`^y3|II I]ok6vlVe0 1$jx0$ !gt֠ׯmE!~qti罣Sju_1%0(um=,pn@U8#ȡf  C9W3[FfCNYLK̫T^\yK:4Cv{s :6] @88bb)/VǭPA( 7!x8$ ؐPX jETdjdb.1D*rV,AJJ%#Y pN ($ wls>{wi#"c(|]ٮ Q\AzO[jpx%X@1#ɩH@佳ɼl%d^9Iiz.s'*ܓbv^K3|fϝAo%~/kvL-d({.˄aߦˏu" ] TE^GfiҢ&1rήΞy瓟6_e\as'=I?r gwŵc* ]=3 7I8O]߻Uu A+q >xK<栯,STvQY-/!\p@H:_bgQQ'=ɔD!~ Ht0Hv l#b&1M{nvIwA#uC/t1`JBy4-d0,_FJj'+|j2l'eFfQkPTڭ8۝$8XbzmY7E~]fBI*Jj 2!muTa!/>rYc,2ϻ_m# 9M$J4qziE zE6HưnK.q'KI#gs;VGȹ EѡSGdz}LD54лp Vt2SV\( gow4$NYܐIeW,$M>slUpOSXdl(0$O@k DN v 85 ݾ=}8xF-Y,|и&0fgTş \]%୊ԣ_L2zJ?[]277Gv)?tiǻ k&t nwVU&o~xs(bzIUW_sE `TliWW9P{=7S@`sVySł̀Aȩ 5$;he~zD-@(hI"Y, YOLeYNmo0Mvb$_E'*zE8iY]PWO OZ`FI,q@Y/ܾ-sڎic<pv2}ci!!4 `j 0ݖUڨYv@`Fa^-ׄptfiA{ Y RQʕ_<`VJl#N]w6~aLwOc{QTn!ؖ"À `0Ol[sӴ"L77 ;k߽{lJgbg&p`- xVu2PE^h*baYZ(?G!Aۻev::{D>PmA`=Wxp6dREFE`QNشcFǫzd$s|_kx⏳U|LOwr[$zY痽;wkZ_t2+kIg5Y=mf\Ha볪ݟ/WAӕ,J{f׿?$F ?>  Y/ QSӠBsx󥩑* "U u@@CeȲMǪ)mfxYuhD^V9>1$od? Q,9|adE#]{أYr␶̺+pSsB̚6(־ !hfLqJU}zv|iݣ/4kK2(wN l ۧѰ x_q`6⥪]MZDEs0va,MP{w.7Kl*voqs=53`B3iKh]ɅV+Wʀvbc w92<"w9Yvaj_>= x&KB_N2d;uHej ! V 5rwm7=U`YqzAXTV){@\M>ٷ=K'yRÀȇU"W//Ϗ.Bk+ Όn_m?ލ|evuLq8ܑ͕)n1~yiOZg0oywDQًX^^YSpq4>*{}qM !Xg$g@"w.f|hv/wO4#6ǹLD Ď,ImE}Xl)(Xfi¨>rsxtj9}y4z68NR[xH$eXGZ[Z (РyH }hčn${) LsxqX*yFC 6lk=Kw#%]L=q{q>;"",v N{}]Tfi@yߋyӬzdT姝|w4l-(Rvmo. `ɀ֩?@ Hv7H@^3=LgqBldR-།gWշ_wqu1/kR(l)(T̳֭Kg^ӻ1v:կϓ%W`ǍY־^jqAjPBj;Xqx;xL^OIXyЈwşKwlksgF2)S=.߅ {vƫ 9d0(y~`DJR+N8 $GȝgO8I9O$L~8f#d* lcwLC qqux*H1e+RQZ2S3b ziRKAe.9VD'[F\# A%&&bzr_ՔhYU:sLfBmj**MLoWox(BĎEeEϽ $Mؓ)F ݯ3eBЇU(aUTEqLHm{չ3xԉ ˪Rl>_H%er1{wNz>( %K{B|Ӓ-gBt{9S]*FuG<00’7֏.&L}^;v5O#YbKmAFI@ dr O EN7JnhtI]3gԴ[b[o(WUO9MCxe}q}Qc'q}DZ~V?}6j4:*12 V&wn Dl$pyW 1~& +BGPAfylOdF36/|que 9"n"`I^bH B%L\ZtܱojGp6n-'06ڍRgjl^AӒJ_Г MK(\Cu{% ň%Z,3f%c>vh\5G݇Oe]L4jnO/aJsB%&wp+btzaRh4?Zw2&LL&FM2lm0!'=\̎0X3mNۊ0ڷ$Bbs0vl8v-2MӴI&ǵc@Whzn Bgy^2ԨΪ߷.lY5u@B{րT=(}z}d4v=&C'XH'YPQwdڷ@a?-(.zt<%כXU̾=E~X%uKzs.*AТp׳-|4qm$ex0Q{c%mV[v͵ qovثJ=yj4ri68ꎏO/^:i#ad^.jlҺhuu Qwz6ه>S4hfk)>g%W$- 5nZ+갭"HeAQ^b=S]/*ؽA]^^21/$U^@ q/^&E }󠖑Q}dMN)NFsIa߬jMg'/W+ϿBIEEx(j88&m OJiDF`}2g F2D};eV1]Ƞ",gn~' ?Ed` x?b&3fz׻8x>O +J2UA k;X$K!M6zFˈaY05B4s151/J~2Up`BA[BPw~su=2RS҆*]3{3?Myr9vzc˲ReEZW;0b冎hBUlŤ/Bt O»jVXnp0j[dٍ Orٹ˧,xhYQE##{XsV Ox9A.MSmu[E r+#woȳꥈDw dkY:ȸ KR)bώ'RoVٷ 0=k⌲i&}ԇϭTU*EՎv/Y=dx@9~wvHeB*S2V -vG BG^|6vt<!Ch1/JF`<60E] R Nxʙ jQ((,@,󙨚Xh8^ݑi!a8 [ٮdžV暓'DdTkUr~ܞy~qQ5x|Lug\E$$,&7آaѷpV ,Xk]W52A=/Kabo>_^c(xmI*bdjP ! ոnS3;^ȤTKZ! ,#Uֵ.{wn!4h.wHRH.34*ߟeDZVeҪ$ ]\(**G ꁝZ#! h2&~INSL؉c&UQ׍f 0UnX|]Ȅ` Xpוi:9^'fY})Q?pZZgĆ`k4$MR4.JiRQ!_e) ܸO?0[Hדd|<9r kw_|*ȝ[fa=jjcHW i>ٚYbn>:vx H>b,^V_˕RARfi`( OQ;Ro~$bx~2͒߼%Iz<ᦫy=G48{YF,!o)YPSH1C.(3_)d9ONOL}>{_h1^,2kx9$]mІGetϱpCQܽy=~a{jXv+6Wc Lŋmq1QPXd ;=l+V }.Ro[4`,YBo7;@{So6aśٴ0ǧ2zg9Wo^^?m$Hje:g% F,DFID&)ao _;`B>gձPVte|0O4D2H!U㰥,JS) gh}d=Y󽐤:ܽ -@!X e2,;,Ts\cp E,b9Welw W[PY,*9qm/dEq]ψhf!rv8$Jql/nHY7qOYZƔRДB[q hwۀa/T)pF+K) g f.sZpf`_$%T!#v[}h0m9mv-4-ȪbHJ(A0KDxSh q5 PbH).J,KM˒Uɲ7۫.;mѥBU`|90!k>%S )܃ !s!AJLwm u{.c*-S(xQQ( c뺺=~O0kzfD~ZĆOf dH#jw_D-s:lÜNw~ެnv+"2`9W-eo5[p9ݸ拿ۂoأe\e|xvhqs1D0^ϺS`cDޝ޺i)jGL99=^n@REGiYW ڬٮ,)Ѐ^c4Qdy(CA1-' GQ RU[1Z S2 +eTC6\ :_F>p$U,&{ \sπ)L w{s6ZeqMTy"+_Qt2~r)pra )>\o.zYQ#دemfalJq`M狅i`A:WE#ݽ Нvj 3U]J ~ٷݺܩ&`X/(ưLA$*>$nclXcZ<ܙp&f_Vt5+ki7A9;z͗sx/WuP's1f,2!? ׯ~zXJ9I:CWP1Ϊ$#$"cVuܦ$ퟚ3KpDu[CCd Z*-qqzAZaL'XDRw>(:l|Q~A"x2xpMl1hq}~ض#zW,n&]"jS`֦0&\DK,+y ;1ObǣI H&I%]"]`] ѝX*/r,p(8.4` ᖸlQ˖&|^dBzc CDh45fh8TXVŠ+֣W^rj)><_m+ &F-П" 5";^)ɔDqsE%o\$Ӗg{p2]'sP`˒ȋ@M%k2Pac@am5%0xIj-IE u¾Mk/r<ۀRuUIh 2blj,84pZ?qAުrJ>_L/4ws[ " ,S)CDj #ЀOǴԡ{QkPoDz'iji\9#P1A\𼘆e0h(s{nyT2ӝtˢpvuBXLwvm;LG0t2ۓw LzM4w2 MW0WbWr'0m%WEڡ9 aX#4^\\榥H&H BMG/zRZ"ܺ;H0(D5&Y^+1<ަ <$N }mrvT$N|.s$#rۯ?@.^Zx-rm$PAMry^9ZkX[t<9G' z{ PfYN}ɫԩ?30(Rh= lZ uiVzZ.6}?AiӚq,nlx)X,NRRyԩr7PӋIg<8 @P>;«Hi-I 籒(F<> y.mDa $+$Ndɿd<ؖmɲ*EbQr9`Bkw0{ٻS^pF0EY&QFq'ޝ?5>-d"hHjd7v]1 phZպTzwґbCm]È/E8A[03eo{sž0 EZ1/oN(rՑx`~rU%)#Pgr atkmJ@^Fqf uLPgU ﶁƌ9&.|e,D$<ؘZzx6OT$V='cSQ>+$4~;%M@(5,N 7Ⱦ/؝NJS0th4 qe3*9t&:>0 Jn=yo)P3+@K<]MH}6(mUR$f4ױ :r 52 vwkau*Mm?B$ (ɒix$+\5 jun?3!"!y XD<+VuY>' Q%@nm>  Mv)*CDfr[^yL(Zu5wNtJ&/k֫Ϸ p,Gpgˢ }DJ,rMO{m#vh$SIMr$3v'?y,z+ߣAV8|,/!Z^U$([FS.VD;rQV"Il\t$5|{e!"F"5(8I L s""x, B MVBPYi^\okkHkrm1Z᫟~l4ļtЇT)72SʩM7|IbShcniѾܨގ[G2t(y <<.I%:r8v{@w ͳR.7X#+2c>Ru"SAiE_K3XG.W'ՕjJJ"ad3}9WXߨ.Gs0h{ֶˈ:nbҔߍ \#9[p9_ÇW?v~pf_>Z_}okr麘?U&'cy N9 lkO ] YH! 9NNjhEqL%IAKk4F&&n-JZc Jx"I{ĘMqBrn10k _8ڂE |K yRJS!4(kRPE&U|P>YnTn64ƠsyR \KYuDfr:S-xsF*\W|1OFP[qD0f&,f3S,Œ|rFz<"؀rX@&jKIL6(  v`Dj#);M˗})$T$vX@bw"=kjqx 7,Oe'SADXwfZXvO&ȍ]li@6r|PA <幣FjUYCuR5e?ٱ[h TX_'_&~Nh2b>d=x~ T%AP@d4YFUn%Z?Q&p~:_` d(HߜyjHf?{{b5]ak V5Y9(2b/EQztR k]J x3P6,ya{T]#:GF:HGݲZXi_Ag47t>˪Xf{d & I {)u9Y,cU(~g4(#4)HAFnӳ3l'b4O360Kzy1:^M'##J~8kb9o~̿>{_3vlD !R@%<>XKt0D8e:IC<]1Mq?7zI-nA˩vQ`Zla")!MӰo>0t[tAnAt0,Iai{y2{> =*RPxMSPhQ " *y8h)RdM N$j q0RTD ±% _Τq" ׸;:3 7;'9 ^2I:YT6eŕ}}\Ud)P5s rhӄ90s@./X7ۓӦWyZܔ RèLƂDmY:K`@jM)iv0^hz8 Qkͩ:ϗȀmN~h:Fmy_It//ʼnQv([uAܙ{-Ѫ8¢,]|gAf*{kϝn"`{^ęqմDA`yB(<1I5VBlXOXDqi-z]#0܃jݹ=z>Z2>AH6?!j؍ڛ=y ve[z]?wzshdBx/n}P{8bWo^V#V%_7l ]RIeb 1 smdYɲ< ʞ,@G/+RfFH3 M2E^|tͧ'm@Yq,E6)s1C]nU DA[LȤjiW0[iG8Ӫ)ũ7 w="H)b]wmv TXsno<2o܍RfrYɥH%D)T j b}bgi@03`2h]EsQۈ_ۼdV*|VڪJ4lf75>`f=wxAJ{[q<*TpClYԔB%~~wsX˼J"i,BcUZnp9AG1#uEh"˓= %Y<]Uj5KCa#,-퇏W_hCN6^-UQI@0ΥXrZ}s#TR,h 1>݂ s4]mw |? :8lIӢIhFX\4CJRV'JXr/x@_=%z[xpQQg !!!k$A1ZPZvp}͸0nrwN̈́9qְbIq=? ⮷>OFHۨY䶦9*;pt^mQFR)J[3q9cOرeɤ%`ra`1{vq$XDD3`쑳8Jc[nX!#:P>Ն_oԙ9yP&1kG4î;A44M&YM^&^wNd2 CpVnHq1&yiK xQ*(I4as6=f=_OS]UA[|~ 9g߫p Hڝ{q ~,C ݢtzSޗF<"j<];2{Ux%`dIPy^>w FP :x3/g}ak"UdryM]}ɛJφ`՗m5Q* nxu<ƿYzEF ]&r,7NNf&Eo.߶)/f~+p+dw@OA8Zo F4Z5eE.$AN/S˶r8*"yB\V&X$^nAR&!L!Iv?6  Z&V9Uj׉LCgs=/TDc3,{':!Sf5p7v!X}nr졽l|ϧh*8?: 2MSƯ'I?9Yy-zCUS&smNۈ°n莐B$`hLȃ /ŇLobO$2ΏȵS tPQ!Afu{!Gxϋ|HQ/ZMZ)`2.p-t 1y{{YfLq1Y׎Jk=]a7lw$Gx)Lv+_O8zq{AE_?N e z*"Ph"HBW3ϊVFQ1 =1(BiƋBL+qeqfQsv7+rIA"+*gkg#ڴQcߦz2>9O+{0ٰ<7D v[O$<ɂ(fzyzȚVy 2B^g;1&Y $rK=ŸCbA$qyHq$) pE]eYVY )'ͲFL)q2 1;ֲWٳ}NPuCQe}5zdzO;X*|:vVWNLf:'f <VSP"fa}?ER8Kyai'pgr}S+oVPx/yqiGyy ˽Xie9OѤSiUpG>BQ4,DGȏTCE\~v\XMEoʭiwub)z|r=y{ ~,bx;eY;KAmBq5mGp}iFde'u9ɓn0q]Q("+{|=~ P vrct.54mv1D\Nf7>ytܦ 9 wZ %1ilk@R<`܀vGOrwdT(9ѡu-`8N.,4?(޶ J-(,>$M(WKr14i;+e$ţï$-gͼ'# "z BMD^rWQ]a?hny&m?om1fMRaO+? "US-" _ i5kA(e}fz|M²]˿ e=ᑡϞ=}a T!]Džs}9?B&@ls$݅?Xbhr9,wG%_gkcA:Inu2e% mw]iFŴ@Y HU߁^AwptvdXmnYfx0,J5lDFel#j<*I_o]`rlp#V|*"k0ݢ ,2["7"oӢ y-%V)NLT:Z 7N@#]6FGZG-b( nǷ0Dkْ@{ Y ݛ)JqOm<|Xd.gfϟ&  "_RՃoFO5S܎{3cD؂>J ev9z&?OqqE2.+TFļ@ɫ|3VHwȷY}B׫ŗ,lUy|xbf"w=IPxS!w v XMk/*"|a(AyRo/ݶ;@jL&b\Bx~ XHg4Z[#L'a;돗_ךkEJޑ]u[TmM_IZE<'bﰧZ+b"ٌ@TG(m!QS';^{y;j1L"I2&8>n.ѧi2"3WڅIX.׌ГE|VGNgߐ Cm';4FN6Z_PPN7''ǒ'J#weMY(awٶnS"h8,?_\)4H1QoE^YRyLˤ4YOqhNx_tD< q(0Fm>bqYr ~YC5j1)ΑRI!#Hf[N'`Y!`Ex |W5EM !N!deC\ŐZ7^%k$jG7."jces;.^KKP+G#&t[]ֆ,/W*)MK`-07>M@|" 7A1;:I''84z2FJ7X@rxhK~w5[Wx($L5{wxu~ᘖ*Ty]R(7t~ۘ3কNiGa5QE51MB8y~2.ht&c'0j(` ,  x<aڅMqk3H$JH gܻ_Lz!*3r3{̖֩2W9iS%_*UZFQ̨78H:?`); ez 7pHd ʋuX !$I\}j=}ۏ^UBq\Mz]?٬ rF5r2-!tDIŚgm!ۡEVmTC ϳe| eR8H]$gh Bv;Vna`t^39Q˚T1n ɩOocE)O?ݑOq*iZ,WϜ[mis4KW `ӱ 4D`"`HF/ ݼ`S$SM2JdlH$$·[?ҟ:1Cj.7{!b$6ޛ)yN6&ܹuañdzxԞm֬}P$̃ͰjeE ]s \JA6 r~ ,uOLa8ƞY1@"3d4xngx!ʝN3FL{ܴ0̾cbOf&*TmnC6UFY&g`15R~:E܃cK%ɮв<_o'S1jSs/)I"lF rH7BE_՚Ƞȣq fg|.ϗ,kF_|}~E>c=FbwBg<&\R£e<9s&?sJeծlk^"8@0A?[<uT -^-. B_rFTu10(! ެV [ߴjZ47ӭ[4"c C4] -Q:s^!yԴ8KXJ}}X F 8&wbffiJf[TFQN`dL85z/)tvgxɽgRdtvZ?:֚ʑo 2u㔮׶vH(eZY63@]At2dv5Y5Iԉ4h7w8$<|PL4`i*gm1R%UघxkDHPuDY.oN;Kz >v+KR,0fqPoB;pADz|Zļ*활"9#!8$kU /^)u;7ww A(ac볶5a}x*_WxˆiwV@y⹳Z\ / Tzд^sS C^"IS!J6^>+0S0^fa"AG{<Fy6|aNI1b(PW! Z}o t(˄Ńq9{̊f{??fi9C bIOPhf52&Mޕ ItI_0Nj?$#L샩w [}j~}OสȢ34sdtʊP鬾]MV(OO(^. yu|<wƎELz(\pon2\T2$El]oO,=p绥էY0\$l%vJ6eUjp|bwlB"%m2a*j*qN`IcJ FGt=nVϦ(ۻ _?9M`E%1RWoVJQ>6~4e@ܮ2 Y]YQ8R;5MjJ(osh!,&ghPV<_/ 5 ĝuQ*i ƹwdyŰ37Wvzhd)^S K̏7ɠ8& R'p-`F3 [7oߝ 7n o$ؚovk4G- ENz`% }]X^ u=Xw "ެ\N,QtXy?4-Unlwh86EM9&x09Np=7ˑه6/&Q5W܅EpD#Kq?xLӕ`^XgO}mt#T OCP+GW۶(JfY#9 CyK/ECiMd;Ŕqd | 0CkGs,ˢ C)\фϿgHva[iNL**B)S!@(_,r=fhbQ2XicUE,Htw$^yqq6o~zs;9; $FuT 1%D88dp!˰ˆf8Q O lQuYP:s:pϿganLY .^磩z K:$e(-e~ f4I) -h|MG.reAݐk,v3^n;d Cc"M+IF*ciH' (&8/ 6u= sc7 ^f^ghuJFURĚְoYqk9G/'8X?V!bIpld]E@j>J`![l];V߽ԁRIYWt) PO㵓i[ՁC^$~pw o$W8KVg>[KYEZmVKLI3%#3zQ֤KQKs %rȔ0sgM- OɊtREAm`/_Z: 8; 2j|mVͲ,w}koe;ONp(2vլf]m^U3RTzYU*UL0TM^+2·P6:v6)x-}zߜ.VJp/ dYFjK*г&i8"?N!IJ.A ꊇI! !h_U%$Eس] a쓃f)]>,/*JbՔQ HJQ5k1Jȯ F/Dp,+KBA:#i'i, d $Ԋ =2K<@aJ*ө=` P)a|YUV7@)\<D`khtc "w$<ʹl Nq[d>u.:Y2U48~{t><{ UM5Mx~fWiЧ[JWH5>:B_vB&uHY!G!>=Ӟ>-O-̤@%7!vB5_}Zž^yxj9Rn@=\ܷT%+?L,̋oo/ͩy@vW-ğŻ}fhN5sXRi(~ײ22^ǫH_򴭫o?~ C= }fy/.cp"ro1UEҌ*)Va !I7,.܅*'gNv (8Yu-UUUXz Iߟvc}] 9; sw14@U@o:uy*dZ2VLsxF fqېcש46 \Ա'6[P՝tˁ1K{y_J ԞnnSH`Ef'YBԦn_ΞHrMqJÏxJ>Wx%3HD2e@ƇbX^o^D]`E67cA?FEP󡳴&tjh ^J1&(:崑( ki-ݒ.0` 'vXQۥio?"qd*n1/s?(%N%$dJA V]|1"Z␦~vrl6ÑTΟFC&')NŸ*I!Ʉi~yyfá|0eCat]4h4sD6 b@fhjc,>MWX`&}jAW˶ >i Ht;<ϟ!/_fwb7DsɦܶmUTu*-V ,߶Q5YNoᅩ!I o ej=?k9Zs寶F8Cw2)sq4|TdO\9>7ںe~޾^ݹ )oaT) ⎢GT/GgڛalLL7kH4j5NJH` w>\Sl[- `~2wj.Kr4 @ؑ(" c gi(z/*Պ i,<9 rO.HG 9q`kj t:|vR[eu"tumC'z=j4k=Sx q>z o n4yTeX8R]x >8(Bbo)/Qr ǭnjH c9Ĥ"e$XRX${ɕ"SP'DKEalkS es=QppF^6 [_"adN!Nl%Xg1M2 :Q_H$N4R0wf`Aɹ_gѱS`4W?ԟy ؆`kRBIGw]b>i_tQ*696LH5$hJjIJw+vu OVXmsrJ@G v8fvlp%>@YWs|tkHhl1<3$PRurYiL2+3e·]/7?Zz<|Fq>M,& 4Fa Gi"R#3<2#yzzXV]wWc~2_kp48vm(.N9D}Y)6ћzZ%h ^n\,F-œR; ᑂ  {Q>dtIHJX,8mmgvT<%I2CQ,8GӲZ =E>5/DIz9ɠ1Aw?[p'hv;MKEՅʉ4MC25'VcF߰6axn) CAJ. R,.5VYaVnqI,O<.J}#Y4]b%d^Nϑ|<L.Q|BʳU5Xב3 yuAhnp V;"]` :g&LY|;9%gwc'=NZ 0F~YUTͱY8eYt)9NFzp:j#,z{?;SۿSGjN&4D-]3%l[eTomDMtf6"fnZ cY WNиAGv,'0<"&N,L= S_E){y&<5JN̵f)3=Mn9`,s*={R8N҃Er|Dsvb哟as*Np`:]lniԠ (\!|ʆ҃$B?|I b u&JA8B崡YSa!pLQr`<u)pM¬͔vn6-LuOo?eM=0m\@ 7تaU "Z7 z Dબ^YXUU`H2\<0d6K ~;~\N'àn9 Țpwd]:&6)=éspn:$*+F^xWX؋ɚatR@gA?'r(nުXNaysV^1!*x%P]2C桮U^*ESԦi=gL,>,ʲdTkS$eMY^( <l QQk4H#5cC@$g ΡIS)a2 v!%qI'9΃"؄M5ܟ!-AET2R 煩 љ=mEa\bmYedl $$ yhKvB&4M Y־_ϚH,Cx`<9}z{6>%`+VdF+s@Q$y\ih uZtG8ڬӐ A'Lbk>^Ԥ^ʥVX1 7;N;s7ojM@Q|bmKdEQ<_M؃nSQb ,>}cأQ:$Dn. ~FR ME;|vrY]YIjxxfZ?<# tDwQt_礄hd2\b"8gcI ԥ($vS"$7c"KT#̝!X <{s7Ǟ}VDbyjew(z hinJ|P} BTԛL 31Q$ښh%F Cgos>fȴدE&Q)r./^-|4c!ZNv HEDLvE΂4X-r>{~b*B,T84Bk+!VԭՍcGĿg)|ZƲ N~KIh͞\±b7*9DΠZi۶8/, !2"T.NG݆g^I\H4:"J :Mz~*-p8w!J6h0UEy#t}}o6Ê`C7V><%|tM*!*Y)0:) "* tY rY*Tĸ񾛒q`ebpY^xICĈf)$Vb-]Yg͓ vN^jV`>mN߭3mۈp'ER")Z,ɋ$vEiڢ#-(I[%Y6(n"5dsw0{ҷe:NImH_%Q;,8/#&4N@lhIAF;?PUo+0/ 2蜑)Yh^]uxlC!A> 3C1\%UJ䷏]ÐE-L5+~Mxl[$˻35ZRLko߾y}S|68 f%)Jޏ' :)tl+vgPHX:"ktj3 *GIȄ +ABA9!LLJ"O}p\4Hh/ϋr%m_@2ssOR 8:޶ rWw--/ik;Nz/襹PE{)`Y؉m%JdEq^Eof#'˪#]J뿯^8?_/֛-|ԼH$0;ZeQ 'IT7)?yDl@]7^ !L9'V{r DWg%/EWoucN,Z뢮GIԍ,R3̒"?os,Gd8M̏wbNuV>Ae erliRy(i~z{:၍Dyѩv%fg*3GEXuhz8> IU=GMIs"w_/wg*EA{͉U\qE^]GҶaUV3Q*ZQ|+(bM̎oRw '禤~`{kS74b` !Mۄr!̀\7[H7˜~;9?gejzfZES@ɩZ[y9B"Ʃuqtf cMP!{6O4Z?'UN%=`H$٦@P5(;wDGa۫[m._8a8(O~qFT5ڀ~PMF_84dXӋAW4 l0l Q%iyMWKOXɻԆi%6 Kh@<޴8JWUw{}dSsꠄ"-|[Q@ۺBP{PCpL*UCE><{vfi݄AB(]&}3/ ^xqQIFpS7zJTiN )2;=xxzZ)֫:Ee\>ԫ_]c8Th0` (>RB`ؘPiXŐ2&ޣ~K>ltT$M%=c"f_>JP˴zC,g'nm+i,#h:|vyqqq{;;5;ZQ"$(,!@6 mm# 뭂$E$8JtMN֍@$Ud Оqq W xjl\S%I,~ow-xN۲Oά9m+ W!$`ql3dL҇i;;X$$m=4pt9ߧ{K?I#,<U k{IUG殑vE L0_>__de2Jy\QZn6$)xVR +k`UtIA 3 N۬A:%"%\7o4h=8H_1w3-I;=P ~a"&6hϕaUq8?&sVONONz,w6t*YR^eyAw>p{`arv695pMAK!^8te=jKaUf)TӚ*őaH|zoeI[ @tmƧc^i&iwW͗oH+q?,>GOڦ5\)p'&_)Tm}"e@2/4H\e:2jEn6t#B^u943UVah1;?k6L~td2B {%;d $0d6ptfmZQgB$eIvXNL}c_iډ;I-Yq}wzF=}p޻nz'?uo3cW sy-6տxQǠeAd0ˊ_ĿIK0 ^ށXyXY 鲛yN\e'HvTLጡ[{#P2J!n68y+nN3A4#fא/ ׵ q97.x^*8'ηجC  .eUZ `$KI8ωlf_?]L12"c4X`v7Sh,H~S;#2FhKnId q ێ_,2O-n33Z "丱%%NJ̉%IAYi;zOjTJ.'#IIF˜;EuTjKpc?c8 ( uM Kʯv[ 'κ}` .~9t$Y:,=mjN-CRgTMeh*X`s5F&Ƞ5؆};mhtO qb h,|AYػF~]w&h;)r5:4euos%f ~n*tȵ0Fan o߼k6bnoMo5wnDLyNbEJuS2VX!$J.bq+ljYFy:jb aC"(JXVJMr0uf:CfMu-( [rCc}Z(\ޫZrj}|#-X'vBJe7zKDXOl[LJZ7Z> Tgg͜*yMQBO"+)HbrQ1t}5=nfh~{7%*$@N1ur21\hz/C4"'$I^q2{#r"l@1a1V|ϒHTbsfZ;)c43}ݶ-.գPċgI$J;? ˗\clOi<퓥??9F49Qj/vwI ҎGP@XRިէ'BQTUQNMٔЄvoX#A/*@_'%xXHB=P( VNUG/ 6q/;NݤnmLbx_@B\le.mo_k!R>yyc}b@*"_{P>|Pea6YB22ɶ *3۾5UHSl־3wX} I27C8D{ 5ޚWzsOU|1~R=-Db jqIJ{ʠu a dUI&00 ~kWj(=Miy9xkE2F1Y@HSֻrGbZ ߏ~8weN].X&^6"p ѩ3q4kvx$NsWbYU|e7cm$du:Pgֶ眽?;ͳ/*BxRSs BCWIW {MREuo@uܐZzvyutx$ $yq\Npzvv6nm"9nQuHݰy~mk/@ 2Wu0xKbUdε`}Q Ƙ2Eח0}YA",U?R|v:O,2bXCP2˷ynkz(D;TI ~yrHh 1r;"Pqal"viOn]sPUeeBx Jb׶zdA(fh:!n?5n(>߽_]6u3a(,Xu:a`箱H?٢b}u: љmDqp(nEԎItI[ԿZ Rh:-۲,k6J$%.ǞA7}"f^xxN(LŸ&]d 2?J!!ē F~qF$|c (-URej]xOW ĺ D?B)qD7Lv:F(r.E&q J[-6) FqDL.?d_RjOO>{׹ULJ#l&B ݨ4K\09_x30LmiYپx^kx^DbWʠ3hA#R+s%^!͹sR45]k3$k4m9+QkJ8.<|W3bV`)Ȝ$p9I n80|4z"zAEMQOionkd :.9>8[WHp 2if]D#s?wrBԼ77.-Ѣ;Æl'd*VVg !QEf\v5ȱ۷b;y~,kxy Vʌk:twМjͺ'Y l:.W6V gKp9k0]Mֆa{8%V cIb?MPBj&ap=CwϚG&@UFB1}aó~_/6~b tbAE HWi0ݻK Hp"l A\jm-gD$PBva˧v1ܷ' MSjݫABn3x ? {uZv[QY l>9|r`[9ٛMLW,-\^8h6Gq 5I5$;^ ^o܆.t F ` m]9JlTHJԕj(2$Ț.8۞)G\!0$铗O5U,7K}StU(rۥ$8D,ߤ"( H W%i*^F hjN 'o6RDHpAv#zFdI.9-ELu6^_٨Cx+> IA7a?-a=@:sA)̞f_3狻nh$=M.:ݷ;tJ+m]+,>z~nTq,Mtʈ !xX$!@0LiiI\;>xp]$JUAEUSc]$S$]Je'#r7eixU&beh ^}X9.lR50&gw5//uS{j<]a09iՃxٔui ~_~ VݣKvChCh ZmZ۶S ˂b2huh%W: O5n؂a^ȢG!@ # kRZ[i^ZJ]уU<>]b q>T!33\{Eb >h65WDrf~|"^C.H"vm}Ł!䙰"3C-Ymz3&͈z?`Ӹ<(t#ߢhj__}7Cllq8 ><.eJ@JhwH=tA[YfҾؚ4 5gIVg175&2۾;A&FL5<ˀ!6xԋgJp,jMIJH`+B)1u&4 'vZS)Ke(]IWd.(Rfܘ l0j@v0)>SqyYӽsW87`SfqoEYze&p|8m՝W(7-Л7$֡.vtdy 9KM'Ǻy81 &9գI9çTS~/2y&~Lg"~ů7W]7憇uS+E1^F bt~2הwW)ZfH ,Ȃt(ۑ;q;@iMUC >\;Olf$I *3$QvA]*C̮րV%R7"$  'FB 92Ǧi^oj2JƇ. Fl'Nm0 Juˍ+@iϣ˖Kw:S2,qAтh*'M8%> ėH<.H"@;4q{hUtLp%j#h ڶ叇CdMϧA` y4]Z4[Z@\G78]F/Ԟ  x: љ6mFQXݲ%ْ bc&$$c;Mvmh@ ldYX/H{9+,(_/c;'ʧ9Q^Z[[y78x(8[g!6­]eK"O @’pH__B%2 ;{=oM÷D Q7ѼV_wK?[ߕ% J%-RS(rٖi.SKhWMhhR,ʍfT kRSi.Ѡ4X%NYV#Њ.cCc4 A=Tݜܗ&LVäP((ZS>[('3AWn+Fţ;MmEx0 tx`F( 8~Zt޽li<:bpaJb {}gxԮ( wh,7Ga| D NH{Ŀ\USe] >x<UvbbeM'$KaNKQ8Z%QMUf9 cI{4WN]Yj@_/GGw"~Ⱥ\̵v-Rs`<7N5|b Fz&A2O͙yqvyuqm,-V 'nUC5x7,~IiDEBU4>Vz6=򗉙%!@Wq߼y-cutW6nAK][kg}q6K4C%Qs=",CF[sqo;g3$4II n}4H9AqĜ/9>Q%W~(Y{”49֚'EWuB ǎ;{<3Iuؾ!oL:4IA$t.JY>4ÝFwĒJ$N#FVs+mg_tHXMaJ qV"$%->c,(XO% "L+RVV?T@ HA+*'oh?|(ו[L s,ʕG]| ezsqbW?`M6K@\/a զl*o)'V@.cȒPI+BBBvS%k6">>"Z3_.Y yArgEJ0H:aLqPY*xAEBf1P7uk9]CLJ$wŢކ0?$0hYxHQ'I^=^MPZX ʚVIDOM}. UYFW(>8O国ݽx| s'`_.ӛ,6cL= B)" eU*r>' ­67hp0|oұ (bA`4A \qдlK;[EѷOzG m]]iYxԞ|. $/F7¹~u\Wf#r[21tQQ5uP.*BITK7SVw%y܂-3Ujn/F<=7J,O޹:NgDtl$ d"@gY\КQ|>O^6u"p $ug#7byjCnY&okQO2^l+A nR(L_k9n $m &*yE+m(BiXoA^ E^*V$[&fKvcNwB׍=Y``T~y…cCAddsn7 $lt:u'!W~1X^`6Ҹ5J.OmUNO*KS|lI-,ÞLSlrfsr;O!MJx3?-yR=L.Y0:e[GgYWJ#IYkr4cBixO*ckNr@;m,y@އ,zf{ Q9T/.[ks{PZ,EIq/3Q){M2*X|$^MWJQ=M\/B}0­k:]!uM;KL¬<-<)sQʊ \^aX; {sX$CZAg$EVUe45PyF[x "AiiV °GUP hZPَ:|2vwî/nV@syhե23(Eo[Ջ7׋(ˏ*yY܋^kkՇ"Ft^-` ( i1όҚ8j,AN%)|Emi&ng T 8yuuI@:VwͫWrSBptwJۚ'@h~~vz$ץ!BJi?,9FJ,R GIv*.۵?M`|7"F5`֠Y "-a"qRwSA.b1 GCM}WUuqv84O %Uo6%]"bjfY9(IYXHJhG„DqLf;{?ϑ=)~237QX?/gFY%V"EQ- bCvI`8@ϧ+*)vrY $32X`|8iWxf a{x!0lz5t"S,J! U ETeZDY"ڢ-?1"N  TOb%In;8[bO_ !Qm)@$(,ISP:xy {[ZF3䶨~Aa#m4fq˳5^QCSЃ!<0m{M6Jf&F́dufgY m?9RA^~9N;%`-<͡jz|s-m^ڻ`״FZ6+M[suuaq9ɊTғegM`A / \G~y? `VDPV(J#&bR)Z]Dh{DAuZ`mDQ'qĐ!/f 4 xDpX-7w+$YhbpCYU+^yƱk/-^'Hma籛,}ajL`Z/>~m'Qlzkͼ*G'^zHbznL4̫M`8XD&EB y)MF ~0jbEVBe*K+v7JQA /ʨKgjV]0u.: / *û?0vsF]81+Q٢@e/Y$ PLյN}sKU)FԆ2L[:۵Q|Rl\yea/s: B+D^STۻ(_/$.P b;{Ժİ7/?dj+7vymtTK L /u]jOu:z %rmn+B,w-WJU`؅ e*WLhVu)$q ̯ʯ75_;:8?_Ð_y MP*PH+4w;5/I8>`2cy"/T 0P4YoU':Ó9|}Q~1@BIT )v>Y8BjNO`%RĘk'{}QTRQY|0E8UDZ5r-FdnOב663`4M eb'^h9s.~Zڭ&ʲ 4fG`wqSA bf"-F% ύfw祦i._6:=^:6"5ҹ(5.SEBgA4j?3)\\[!Q%uvaVφFOV(HjA'bKm p$ p z=@P܍hT*Z9  J{i-2,-ykk2jf,&Fl{=d"'BqtznLR*jCO΃So Wnc{s~y^2]2`%k۲8s*adֶmwr%hr1" q^+d>߇.(q-Ia&ߓPA&$N!ǁz8^edxA>(%G:B#A׆tېy2pXk _i ;>JLʱDj~(G]><|%b@xmڋ l>\44E]}Ckp@RG,QD ϣHLIv 0=մ2|z3OjIu? wn$O7V"/.׺lszCM GL;bͭQfjLM8?QUd5z3[[{ix8N,]w4!ـeB4MGpk,((Zű|GY+ Y*C|@1۾GVXcks<9 <=t(a8;x)3>E1jJ`8Ggϟ=*AracH/{ǯsG.^ xvv id;e$eX5xfi aݶ$xVR`2c^8;'Ҩ_7<ȡ.WExWchpx9%aΆnwn CPвBVlw$0.UoR%tpD]Ak`$)Τ) F*_ߛkmvb 0O x^U4h~6(}X a ̒e&ZQUmՇT%Mf&3$3Ì ^{9~cfg|Gr,Uf3w7zEdJB߭w%lv CTSml3o|J=,nƽzỌOc$z <{;V]"kD'P8hz:qn PM$tV텮y~>6'z|tsj.&WB:d$:'!H\9 -g(N[ן2( "V͘~zaެ"R;j~veہjua$s ]<: E ,VlPJ{ݖV߳s/Yl`1gAr)`HP(@HEV֠--|>GCV`0|+1dN3 Ϧ$a&O XHJE, LJ̀@LFiەjM ̸sJW7_ `%(@;rkJ U#|XP;_a iSv\ IO_~f&rz=cT5!P$15iƥk\" ^31g da"J R[f($-QR*cEIt1L5rRSX8ƘQ<=A2x U^KHF,aJݯ5˷ZD7)4D/%+ 6*˶| gF'b -+нsf˴ rq-9k%#Џ.ss{5`hz1hǷq,ݦ"h6m}yV5unϋBw1V6~rsh%rJ~pb))^2lg>88j4Ew1EP[x RM*O7ZEjLqPh*<džAAoS,cv;Ȃ9mނXHw[&^[c;@ b5g7 Y.A -$b z6ܥ#~^\FqYgzֈ\`4r}( Xw5pdy63 :[Ii4 |/ ^:8x~oO>*j>Q^}d+BI8Om1"3ػ޶OqL5 o  pJ#͍ Џ۟+C2ڝN_VTA@%C=qP-F,׺\Cug9cm4?f70fذY uZ;{}VZnv m-ZKc[+ bCmQ"ͯ9 HiYbMX.H×%,ۋ%xv|2?g({M伾<̈́d}gwUO x WA;.HEtMQN'JB.hy"NJt&~aU,4&xI`Z$8h{4ӳS˚XH^4T?&I:cQV O$b;! ݷs,%L ֖1M?O.?B1jf/ "ytSy}&nY#HliM_㛋+V_ŋ((b+~}RKi~6ж"1 39*gZF$Aз*A4ie{"]Dԗ,LvǓ8J8KD7VK6tPvn,ޤh(VyP (qkY s|A \hT䥹2g WoW5΋H洭(,$I1'iKx֎'ĵq8 B M3 oHRS싶c['|[c<)*Ft!iC~H)LH V+ 0b蕧U ɾ|v`[S1 w03FqTמ?(Ԉ;ՙs_ ia-$^LUG'vs#y a<~7^5/ 'GG,ÙK"^:,ʍ{Eθlqܳ5#p* -xD d_Lݶ۞WF&7w!ǻnp@J3"Iy^-WaJ"u1`ro礇ZY߳5#EEfp4huZ.SlFQQEQ ;"X1Ԑb2wÂ){"p .45Q@:zw5Ϧ߅:t"LPZ@qTM68Ms[0J0e[m|B+翼P&XTP̔XЙN|T#ZWunWfIG1u b>̰Ł4 )vk}MRd_dvii)X%NN;]@zɐaxΝsKj(^f>,̋< Up<рcXբaׯDAȰ>VL1hx#Ien?bOsdXNǜ)[Π*3_g*82ׅ@,Cpڬ|7ܕ e9Rw}^]|zz~'KHb,?>< `?E#4Q'o68M2$ [0W}\QOr214ƒJlۓzk:jIKjR_WÕ僈:[u&͔=LApޚ[8HibߟoUOnw[z1^=Zl1_Lb鏍bx`hfLirxpEV ..F PJ1ԋ7rGhcŖwTJYh vLAHUmwgX&4Rap˃"q?vueO3(-fHfV .:,9Sfgr+t-,7rT+<-{}:a9J$I:eytA(볅:r6w G#dD]oH NÜ(pAH{;;\>0^uS*cm94' Pp$ˆZVv6;蔆x86g9\%..\؉8.:~~ߖ^Ei&cCQ5.HyDLùmӇ|e 3QDP㪌𗻯Nl'z v.b@``qxnYggѰ?)ݓ*`ϽdzN*Dӈev" EiB)˶5cХJy3"i$@22^łfj>UJ~fԏAN {? $r֢hjm#"WUF,+2ܨZIAL)XS Ҽ^`AeG1]B8dY ]˕ djs'Vh.ѭMBl-ԺVi;raFsz'HU`=^s]Xw( }x $^Rpc#7B;2ʍNac2u\/'8cOBGHe8C<=)9 ݹWW1 秜+wUKRJsLۺ^HBꆽX+)eQpX*$c~h$KǠR΃yUl޺ˍI B]~$r^wV{'0EIV +5X~CB6"Q<=s4''/N^8`QEB-8i?/~{fb ui3Fs{^svBɇYʒbgxA6kh-llۊWίc/r 6 !Ö-8Ԩ6Ovw\GT:"xѶ @h E.2HP(9V+O@QkqzJYVpnm eIp|ga.;q |(nvq}fqܘ {zHsc)+"'#Hy{w{7i7780pHFO3 EQQB*ƛ]ʼnH$'QzNkx}1b'L=؛<{vz`yβ7V4*@?\0k!p ʋJrqQ^~꺾spgaF'qiI(!D#H/nPiPHf9U.qBDA"+s :Ρ{-?J HNj> ۣjenwÀbE_m+mw(jK {)P=Hױ-keDaNi@=0ZV;βR/tg(p SEG_C Йtt='~ï$ YUA )ZT,JEg~eu :h2X,DD^+Æ?͗yk_ q+7=,])|/&}_]?W3T8'ox:/C3L`$[ZkhqLVҎβ Eag@iDp1V I!ڽuo~}ӊo)9ra%@67ʚ?9|XO%1FQB«}q4~!JR Eu">Ϳw9 JY~ 1%bya%>ݻw7XE7N\Sw_n?3@ZW'JD0{nA(z>PY|E`h%fI+٢51`H̾O(ߐA;ED|~$BVoc][$ `L7T}i'zbYBLiNӫN. 2/fVii1NR9@Z!dVZް?ED-~⧯aAAtswf})1-RLQ[oՎ,9B`_0 *u6bM=a b{s:(5j=W0$lgN4OFp[#b֫ɷGՇF8{5XÖKgMOas$GƓْX;2,g8QU ޹v{lMKW$!Mw\J0K7<U'ґzS!j,-4.!1R$( 5gjgOdi,;la%f:fm('ד?9{kBaY`|2O~ܥQJpxU{x<h9텗! VQj]JEGXǎg g 7QEq\oNtw>v2Hiwz0jp]^;눲Ad"&}BFMl_RNf Sn.H o\z}(BJQ3_̖ւȭl(Wgjċg{mc.ԧK r*N1s9i m$C*m( QQ'BPan|$gMQ0qޖ Ն mx=BqVCCu"AA)8) &<b=?:653)"'[ R K{w@@e UNp&alk^R"]/بՊrDG[6ѪJ;߮7s};$7'}ۏ "m;Gpt@Oh1jj6zY+/ (^G>h}{w?@".zUlƧ]P`,KUŬ+/ ^wh.h \t,Y T,LJ/l35X-ȗFYS8gS&%e|杏 cqTv(Qz\`yȈTkRM SY(Nݙ J<&Vq;;F'ys-O3Tm;ږ "I["X>BjjGO me)'GJsܐ[5(@w <+%V ah2x4&KK iwCE_M3 `M4UL~a4[5i s>"{ЫsnffWy(Y 8H^le^jŽUf_r&b\Z4YڂSTtn>a,$_gowEh˟+;)YS6{{B3=QD:~1N6O+癋Kd~|=Ap(@;I l?y''#7p53",n8[,! ^%c9<ɪB$ADmLZ]Invc+8SV$ei9?M3RF([5vmPl[znprcO;?fq)p45g@ Jb^9I8?jIMV y,߈ 4cXzP9Om>1^8x<8lgZ Ltgf๢aMSUT PqE~DqrB$=›_|v|2dlAqfڂƁ-Y}m8~b>AR"I% ok# k=>BrK:>h49/AC6r֠ ͪeOFY?PʭtUR3kn°]b5n&hgO`):.6f˶lmjk8-:yGSuqy2ަk.1H36Cݼ#)GGJ4K.{E[os*"!2_mˤȨͳovھ>{ij(L%Q/_Ӂ5;_~Qn CbϪvkP5N2\%;Rlu-O5Y5$%]Gu0Ο#y)ؤ_Lj͒$Cj=H- z|? cE5* cpRDbGjX?CNfa V͵]^\Φ3SZ %`GCgݽNw[P鎂șHfu?gK)}^r\8ّ+DTk|"h 1ZKW}hʭoSۨVA'l"`eCC5r).g_@.;:k!1ȰvQ!cXdda1sI@f ʫ.^*MFiME ƷӁDZ'~edQM^ExW'jj& MYud4Gv_5g( zCYVI=L$驊y{f,m73/24c`;qXu~߲l=k @T5YUW/Y"jDP:<'ȊPm, n(BHd< "Y81q B夎H bmc3$uV`}r;'&Nt$Cr E5|2'mvZUQ U94E(нj=Y  ^D4ARg@`W%c0C*6Fd&;ILUo%Z d]XH5Ĉ4݀}v ,XeiK4!`Uׂ-A.λ\d(1t8BN`#źˌov}sH $zYVI{u{ڮKӖ$0`c|lGGK|=980āsc˳~Z** \%;3c`A L`kۆ!Nɇ t'өsaN U~g̴Vo1@ֆ.^ s95OAKA3;PGf^)(d_Jڎ"ڕ-s,Sc)CNf֩wKE\)|g꠵iXP ~f ИDٞTv[)5+RJߗ9vu' uRMIH1g9S_LMNblƴ:0J D"=>{YRqd'M~ڟ[ɛ_ͯEIx|0ق)dj,HE:1VGjd-nxPS/1m(€ydp;j/ۭF?T5 JWTt%7ԩv|`58"\hFZGjy䤻߰U Wi[OG_7™yȝ\‘Үc,됊*ںl) JyZ4X2}v>As"e-{aiq 6**˗廵I贏\K2I?l``8zYjճ͹<(_8rВ9(+,֡]&ЌᖿY̳Jox|sFD!Q,I.$C2N+,2#މC"3x#FAWbav+ p3JX%KZl(Faro 5e 9XIL.3IN~׺^O`Oϧfߜ,6 ?P7, kza[Trz8>w>{}HY&2ӫUƦONU4"+~h&fq"ļ-Ht&1YavPi)b:FIFEHSkcMIӤ]/t,%ʺyI0_BჁ rQr,ks|4:oqZy_W4̊ VfCV=[9 )hj'7A,٧w 6|pz(le-,QSveɌc,#IPLۤ[3U|ӶL"u7I5>Ĵ6brxf mY dqy]vIu-_",qnQi"t"EwXz 52EWh~XeEW1|߱- 28;~*sb*Y~GR,]M ǞzRϋB$Imۆ ws,wix5YkH&eR "[mx=v;?!p&($3^߂hY]o 46@~}x/Hz._݇n4LHMQcٻ:NCcz"UY$( 쬍]zC0.\:u]GO}ݽ?w߶C'J.aM;7M0]>~r*v%؊(ser<3a-Y]QyWj89h0X8)ʇ'7p>xlY/]*2Xa{&0q"weL"I _PzZdE0Q"r"i¹sP")yt8Lw *leQF BLtS?87(  xĎJ(Q}C>E4L{&/c{oﴺfͅJÉ/ɻSTE+Jiie-ex\h#gyqv5|5*;9;3EHv\I$zPhYVTr~W>y.7tlmo+#ZH~}7L=1mn,R-st7 ˪V֫'FO詚q΃nvzp5ƙ73mVKJ`o5CIb a7C7 [#8r۾}  U&G1;DZxabzάV'"d2UP/罗997a>/v.V `AHX 5-^`vT4Mʼ)3hᲾSY3 O% <Љ%A~\NۡUtE8#ޤjp"ߏc'2iM¦=$v '~|L3gi9?\UzKzhf+ SW<(bwCll'sM5cU\3'dp&iC$k;&(.TIAh8v|:&K2G?3B'Y,"(`NAx<;g3 óFWUu>Ї}r2q3s`IWTEi1P*"m֛$IfXM09ل+(y1OF6?w6=}>O9m+ ڗ+d؎qxkӇә$mcbcоK=*F}ruIO*˜';$UvN(ûd;gKhFNḥ*<,Opv^lM\~w Qy\t$ n=y52pl8gL"g 9CPw` 7y!峺i|Xc yiW MU"Q]{~2[CRx3ȩ 'ǧWgr_X.4Aʤ$tf{BWkB{,yY7dq0,ʤBd%Xq)dߗY9VEXV8'UV7O^z^nHZ I^ I-߇'ر*>ׯa]斟&fW<_= IQհ 7Y+xE(E͉\PQVde^A¨ {LWW:Ћevv\_8-՜,MIl&ZzrCcշUD^e$32VNKshĭwk/:maʘn4I,W"/krƦvl FkV-8#rQӼ-^_y[N׫5G#qkzjgx4zu:8Nn')=Jauf~{1P橤( ]6Ϯ/4אco7 |$("wnV|#n/18o($̠Э@i`4bnmWx&Aj7ׯtY%wr$E@$,Ϧ#c>H3T^cx%m5m֟m:)^fq8>^Qfim B@Utv Q"t<Dž~.4 q Zl'nidu32f[|3$ %M:j[5VI \AiD 6j-CB)k·(+~q}?I㝹ͽܘA:_̣ɡj+qZG˒r:: Ԡ[w$ӶGH5ZDX'\@7' '9 IHbј,S?(rEƚYHỉgى`oYz_5~ Y MQ``_ڜLM#!ʢfH0-gN_ 7bIsHh@ HH` ۉ$lsJ!ӹ2K&mbc[.}TE~^*<:BJvJS(yZ8"uw0 tp~wwtԐi9~1n#&*&qɁv 6)w웄*#Nڲ}+TiVp2vg&d,+bhi$4`V]UjkN@oM7) p>`c `.ݹ=v>?VxdžgUVAW0J" bԕ!cfY knK~[O4`("^1׳bXЎkbePoۦIԵ"ՒB]a%(l!($BvdU5ig3 Ѫ.thdAJ)E|^0V>o7=e>2ȌTΡQFiRO:Zn`Y!zmtf[zco7Ez{m} <˒_/9F)$-IS1[F8a9J8O2ZH4?Xݎc۾?%󬶭{ SU~%pBJ@y2Ř" ATS4K?%Vd(AD;MN娈rW? UNc 7;L#gFe!.я =ɷ'|5`hS4%|ŷn]hʉ y?${Q$VyIBqm~P+ ,꺾Zz3 +%NaV"+dS$~*]|DdzlE'X#WE_ZO),Dr3ƖYU=oHzJ>ȐtZeztQ=8w[ q V% >4+$yA]EALTRKVaAAÚ19Xp QaL>P6/) g[}bEfvfT/_Uqj(z-B8J]U ΋ Ar<==mKmVD_!h~;ju,$TYBi PDSN/yp :<>h7!X4Kڐ6?#tquh6Ĥ umavȒıŹ 'eْvZqٹ|L^ș |$Gjlo}=X@ 35 Zp$\7}$wMM8NXRGJ`$2(MT4=9{.t- ,#m6 cdUC}xzu٥ HDa jQV]`UFp64Rs^}6ea&_7dGk?>f{ &#P^NsQ^H%rJڰCscvI3n2sON,N״,GYؐt6Y+d[ssO-\Œ4IoϞ=}ͻ0x,OˀEdU@uj Z`>z` M!.\'-j\exoI \ 5ղOB/ G=w Dm1$֨+e[ (6SoJ.x7,$E Jqf&jWve#B$x@h]Z[Pveڦ-Y(֨.wE[dL_p/+*V{>\Q<9;x,״^_فm4ˬ9,lͮ{J{(ǐ_}v]˸~\m?):)ٷ_/~aC.WR"|j0ZEV^{MgEYw20=*zXo\/֞Ia]H!yUP$Uʑ<Xx0G'GO5iQFiTDI0{i=g"pȳD,͉7dx vų" )}_ΪS%׳toN&kkBHQDU`bx5Q{~fm@u 1 ( RCnŗjX8*up">~Fɒ| R͵kd M;e[w!^]A"" r`xѠw[3XO:  +I!`؋'Д`6iж<8hp]=Gޛ{Dx7ϳ0 ")i Ĩ_s s`?xXI3q= z4IlGS @/E6]d8q4MaJSx0Lg(/Hi:mRljIJ-Y.8VZ]vg֏I LG8e؉ρ1ewH8R `H1Rv$ UcqO`,+/m]`aR./|x YZ*s CIJ3Upt}|{Gv^\8+e8OY! v E %]ɣcdQm$ Qi D9וRh!{AǐzW?|c;GÑ Tc^ |姫 [D(C6p4{y^Ɋ>f)7nf)JE* 31!aӷǧ6?`\pNz?+Y! ^ Br.wZB*9p4)oC`a 7CR,Y'p}DHJ%REAq,Z=?S2*q? 04$9La_|c N^|Jͷ ?\.SEQMbZ5V+J+ d9m.}?^xS]L_:&Ⱥ:eٮ7dJ \UF96)ywlfH+MaʧF ZxQЌAw<=:hÄ2zo_kEYe[BF_Awa{Aj.?^~dNkFPvjoV*'~_U)ƾ Φf$Wº|:&d E^ < d 4-%0msUB/lsbfxި\=0G!k/XyPH>J\Z*1$"H#)\NxfG ˀV+7y(+wQ޲6)ţGNggyj*H r>H0J!\i JC6;TXߛY ΰ$B+ּX}wz BhY\y]λ L."v7UP?{q*|mnu'Z]D_. 8:޶0 s)Q%v6B^Ҡ( ?͢ފZ4H48(R ]Q<|3r~ae@1yᔈ4'择([biJiBpZ1an10U% ' ۣn+nl]E&&Qne0&@Ќ-oLX6ڍ"R Je/h>l5XA4,m==(UD`oAr`.$2v,&CPn{ĀmϯGDi8ׄǛNUmfb93Y8I劅Blzmpe%*y)tI!(t:dw0pDi5 ]huV'`@ m[pB 2 k|&vw3q0峯/v?{xD!rm0O$EF8{FӍ\7Z{oi2]^u}y##\ .ZW90-23o+m.!eo3|Y &ǣ,`UqH ;ґ'`>E\a|}ғ'ux$38;<<>IxWn,VMqPѠxTQ&SN}ţٖ5 ͫ!* dy,咦pWfXvi04 絋KًzO ȢLRa^XИ ,1Weqʂ qPJcUTu$ n8\3]al:'ǗwwFKkS{l ^0lvQLSܾ)2I006b4|IQIy~{m.ܓe"!.JCHs5U (8A9QGr]7t-*Fn-hB(rX- v+r" >@pà>*(\x>HTqwᬛ'b I6Zū?_!"IN3{nⰬ,88M/Oc_SMͻeK}zhFG}{rIif(N4j5mO T0#28'\Ǟ.03\r$L"7("蹩GH@qfl @=GPN7<*5{Co<j$SGK0NG1j:m'LS;-tmj4;e ~7G1[A.pdv?6ps~yPF &'sRfuѼ.*ͪ\~uP܏|tZ V F@t$r22_g%WRd^Lg+e㺎58g vYbꄥ KQ%f TnIU?-BzqMڼ_o1zCY(LK MT*T/n6e"Gh{{$Js QA,%6d; $uIYf8I<:^w08%yb9QMNQm2%./ %& ,c?Htt!yW]ƽr~i1EQ afDOAdɹ"! ( 1{14?>r6U"v릑";ߍEYX}4r rN!(j mwZC3zLO`Ôv]9BS^kdX&pGlu˲|v>Q*Rm"ya}M>Nk /̞ڶ0͒˖7B:ҴiNm}hC 1»Vk(o~HW|_7V8Yi*[)6(cg y ؜x> QAY"WCVyh$Y"A{,;RD(ED=ô%_O0R'o8͌G;KOP P[iln\<(rc/V9, adq19#@6\.{3׿.Fg ·4ŬqX$IjY$$N2 ( qWWXX "!Ney||UmPU/MIǛE9]cbK$ȖntOAuQJ4GY$E֕:jj(IΝ< ۳!)jlMYݞMf?=E,䂝u|hz.ChjK|70t5G2ZX؋/=v h՘8Rʖ2JChY&Nn!C=Bx\X&dNpڝ-TiGvdж)Z ,:l/irW?|@-\+Nϟ?vGe}::>}c%gM|gb|1 =;^Zİ\ӛ?^3 oYkm3{MM@P+}Kȸx}s, ջwR8TC Sǎ#3'%+RcOF V C g fiDD; lؼ@f9ˋ0)׸f9U;Z\ $ 30mhdREq.%N+z窪?Mda}IF0˳ϟ['џC uITK}c_[:Vv5QTjw7`te\@4X"'FLɾԼOj#ƥgRCxkq,kqlCޕ;J V+a GqƠDs2X+VCrdy2HbEYY2_ yDȷA6Pl_JUUR&'hڝ 8|6=z^jEggv9]_kQHY'i䏓~Pk7dZ3 d֭5?P(Q/^L @љmEQʋ4ta!p `I }tW;wp8Ii9%]*ib$)*XN~JH7d"S/X6 Yff1}@1a+gm&")hDFw%JK]Q:6qNSx7-p9Placi/   vIwA4Kĕ|Wd n4zWϋ p20 XuUc$r2o8a"y4މ%*@2#?wq5VIņ8_R,ޱeZ-.|W=}Td@;7B#kTDz^R4{}Si^ jWU;Rs10,0̡i" ̞Liw?<z #0H ƾ_z+rEk߫Q&@ &W%È#^۪7PTFaD,0: SIZGWRP84!&YTػk_Qi\亩$^gK,Xo蒰 wkfS0a$Y-4?AܭkVjn]CRK7q[[{]31Z)P&om jKԇaSm jD!YqCyfYެFhiogS8ZΝob/[0 0?ÓoeA"7,bCtud'IBV商tSI~z?ڗq fvk7)ciS.RQ C`@I%/ry} @`v' a; ,MzrG[[c)%H"l6MA4Z$wg_{6=_^r L}S4%@UӈNgl?2 }6:J6b ?vV7xodJN<9:>s,H:5(DA̘Nf?`ӤM'eԙuuTC63s uRQ/f%$8MhpV@)bDZz,_DWA/m;I4.[Ζrſ* &Nv .1=:#?ˊ͛vXa{_SN~_BP2NAyٔ2^_faYEQOc(8w0!W5%4iZzSA6,HRE_hŬjǗg'F Ő۳ˇ<-f,# %$P -' uYw{upVJ(^~Qi2f˙l1b*MԳ,K$\L>'vs3w/kov^K{_O/O#ܳ<5By>isϦ#(խ%R P`gWO' X#R^䙦ɱ\8^қ]zQ ,RRQ2x4Hx3 /LNƋ$hb՝ק&jt#ct[^ (lwF?k>4vU]|dsEGz,_O4{ؠ E@HV򐪐ISv>{x|(!1 MWf^/̹)u-FxI7< X$K,&ѻ+,}pz8(Gxn3ӓ7P #0VRp|X-; 젪҃ pڜՊ"gn $ǩܪ魭-Mr G&>=y-הFzw1u~x`El6F poAH݁ӧ|c/PZ*@bHFY[Mr/3b$?4&S,& ^qԶ?$5>: SqLw9Yh 7P*) tiijD嬞vc*rKtًS?.NP],2jE4QaI|'AsmG ^n" HiT4bie<ƶ(XՐڅB֪۵[#f<^_QPVG -bxK1gOk'kQX_.Ef` * %!4$o\ժjb W$VptD18) MoEr[CeI@FW+;׫5D8.Lai֣YZe-\z2'Pͻ`^d[*(@'2'0:uexh)VEY(!H"s;ݬ6nZa k \WWj7~z ` . ]8Z4qu(y ԝ~_vS< ^ NjϏ#o3Y)my JER#w93.] dMʂ%hQ rrS"F vҍʷ ٵ*W5S7$I*\Qk.{Ubkk^l`-}g ,MgPyXj I=[J@19sֻSTjUf쁱q"rbᣣ3vnŒՊKR%@`/3`lE / 'G8 mV PES!6[;NB$d|q>E.<+$J=lGTɑhi xafU$E(,M˖^?m.~g( )'(ȭ㛑\ʐ]J̨p %N,O%W*!8#7EVU,Gpk]׿0 p6>E9~Z/1]̨u/fcGfN+RL[oח~&|hh @yma"QޢSl'9$H;Ak-Ҫwf>9Ùy^ć 3(\i*i`If CLe6F}^6{Fdޔ嵳:=O`g[M/r3q|4^^|(R=#< 6 `!YA}P #y{>O=z] DH}nmޒ[YNۃgiHyډ0jQ@ AplteDϑhp Ӳ78QP0n;c e"tl_|mPR^3c7n0tx M8oydd&O?!0+cˠDm!AZ{,I}ske:XAGP )2("%|M`h62)y1{gxqشlGLU%4ESPF *GelGQ=;;Q&?-"CB(aږεkY"}vB 0EZɁu %!*^mk1 *H]a՛yJDIﻥ98Gq \I@bN̵Kf G$'3,5 !b=,,z<#3Ngp M*|uw.M㬨H@S f]2:4-+|P-4Ӛ iOi䮣yʥpolqpa޿!5'$L:QTMQm2B.!FB+ FPHJ@h`ej:MA*C$_YGQÞ醪tHZ Wmw}7^MpFw憼*xq@Q hQU0uR5?k\N[s#u:#'J*w擿HRΤWEx}k^//D)@ 38OrcܬCvpDr~F>4F|v͐b+ʴ:-7&RTx 0LVRK$)(N$Ob6Zw6A&~ʢ,0?w._Wp.u =co504H\ceImhb$pry ͱ BDS+ eՈuo4k(n㣍=;=K&KeLcj'rW 'p>;0!_m#܇;%je˒e)e;N=sE=4N;"KE-HmHv`.y}`U3o&Vb^i"˱|gl)U?@:4N&„JѪPTF^c^}њn霮|,ruWmHKQl5CЍ <_55ZSeذ[ou=<#P3$]Kk!u2\cn˅Z- WǠ A8B5(YE!ժ7Mt;~Cbj [EdQ5,1&&av| @L4!e_ƕɣCOSZ!gh ɦdFnbӃ/UV71,hw`mTvCz$kLQW% ]6b*x}EI0GtH&VsQ<ޫaG(5)V`JPUᬮb>FCE*E̝/R{3Traϭ9(ҖB:9F|<[gnUԹuO}RQ*)S':Od|@XxG ң>`S!ͳ`n*.J}$Z5R12f"!: c,KJ"^V6[HvښX@|'Lwf"K0 a,cCڧX6ŰY)KFs={ӕ 5K۬>bPv*[%Qp6\.#RW!&fiTqroТRX{v4 !5%㬵a~B3'l#ц16ٯCO???AfO1h1P1aФB*$}& 9҃.+έsw S_\- ƃxoERg”/>=_gx197cc<{yr 'y$sc#${;=s:6CߓGkDs – Ʃ䑟 3vyZp]7#1|HKBB1Բb$ Ea?%1$lmFj14M"~xzƞ8ggr/vX9K?8嶍( HR,ʖ=<+_3yɤ=dq+"Vao dv;wEjXI6N@M\.g)\ ЋU^Cd:[8YY{xaV$ֈz ~ˏac8G+ù!ϔY8ͧ7`{Cg' %rb3*!#~- &ϝ'][mhy~i"($Ht;~_|%J~X Ëjn4ve ?({3/zgit}ړKizESY#Q.FE$8+iAj$A^M.TX vԯhI1be&OJ騪Ti"t Vd(*7U~ <Zww0 WCtQkAR(`p͍ m^%Dpx Nea/(uZXOʩYV/~}ӳG@6Ms^J,h16Uߩܩ,ݹ?K6S ۖ}ˉj1PШ~pp0tiP{wn\Tg4 o~q=:g.U$gPo:ζa\={}i 6O<*q Z 1P~|=ެ69 rߛ. Xpܙ0 y*#h:xq=XcY'`+ܵEe-Sځ90"&R b}4bb+؜ls1pfŰpq:dZPw#'M <}+@ӣg$Io? A5tUzXDE`63/N#+wB!J(dYn.NOz}'sDk(O^0\3uPE:Xc2;̆R-6ڝNg\jRm8r$HjƄ.(4 w?'ko`p"e֊4@ rm>M %݇Aodg2Ʊ=YMN/iM(J)54[ &D^"UN7ΚGۭ6^r0 J{kjUCIjTOɢpQSRKFZ3Nk]שz.`7זa/{V< 'Pl^JXޑ<[JeYZ8SJdP[Vg 9zyZKoi} f}BPOp!  :60M`EIljIr=4\CȖ5bH M#ϲ3F^E| O*%2L#0tUSMdt;\B"745 =8\D>hU<)Z ,tb_kl!Ųz["+ֻ;]Lo~.|iq)Y /!<`p|釟TJnf**r4ƾSo˴5w kwFqgiezR9V;il"aanOi6ԣo[;"ϕ+D(pr~L -`քH`-snj~.4@%v4̉W9At VBF/gb<p`sIVhjEK7I1R*9n$N`A}F"zY sr˛HHDLX(Eq`Fxn p74)|8PXKF~RbX@&,,%MHģeA ):ƽ^c +_AN@3i"ڿ*9!jjVnk;ͽ$_A< N(ϧA"02gr*l4lNܩaA I?UJ;jޟ?x{Hdb2mW`7s&mE&␱;?ϗC+ 5]kd415 Vl&|t6r\/[|DG"UHz7uP>2oϿ}$eR2rPZ߽R}?X[ sz'' ,Zep6ɱXxm2i\ޘ}f}f17p4EvYi_ݯ;U$^5w ;⻮_E)H[+}e bN0B`Ve@tͩEQ&V:(4)ي;V2}^'C2\gSrh%Պ"b(Jg+/ӋOwQj:|~[ PL" E,!DEUE/p: ;Kgre#gstN!RCw5(MyKmo9ϖ$ B% xcQ |~D'dtvXBzr"}8c$!3R&I]dQɰ9v,U7:ðB<\E<3{Nۊ¸$2!!uƝ6LOIiql@B v~ýk(*@}Z^j @xkCrJ/=m֣6YVkŵ@$Σ6-3mweH.O&d:eEa14ΰq/mOTl4;-@A8UVori$Z"%ixж0'7XYn_>|Qڀ$8țXHQO~c(6v`7vw( 5 "ʽ0 :B!lCru6ޚ|:(+( J]qv!fd ;Z{iAXp2DA Ϩˆйƫ]y@hO3O񵾵}>ͧ׎f  Eʊ@A[֩I 㰟o/C,x̱ov7 d`u ʲ勥֕y~e55b.SY߂h[ mrͅAS= r;\ZJ&d`GzhV p"KqE(ֶ+9`2H!duezvJq$W޼^8o05ʝyG2avY7, rVn뗷mrjg֒t=k ͮ!hi(mBgEjh\ד?4Oڃ3^g1^a/GO G}5Y w]NpN`/>yoMϴ:r=<9跐VOQь>G'#v=v|Eh盝xiTndwt ێu~+vm$ UD90P#1BN0` z[AtA1mͽw/3,b(Fjש3E/ K$˴gcMQұ#yDݮd/VC?r?q4;3HYYȠ?,(88N#/ -RFsMx$Gg+(J勻x\ ݐa)@e(ǂׇ0]\,IC4vGEfpht1Q+@r$iܼT>e4FD]e*Zv3{foe凈(&F`^ͮ|lka! > #땦j.o~|w~j7 XY GAW;d8lo~}SN?ロmԱn-P3AJ{7F*$ "@r\a #/Rl"M "G!ԫe$ (DJ0' /T/0A*Qj*B4lc1WKKm>8Jf0$n#/H dȹ,7k} ϾPI2o ml.jc 3,N#<8v<L[j ϟfd;:1y>#&VMȰL뷺|9S?*Y_4{byU8߉b/Mp:ɮ>`n]ͩJ;d0\b!gy_L =GAhK4Bh2u!8ar?_ݾ.di o|>)4z;80Eax0Bn "jY$q阖(.Zz1v&*%/t;Q8MbmU@Ύa44_x>"ˍHku(b"k r^HLiE_!J4,B%]U7EJ%+Œ2cKReMR6Է*L ʍcBQP*Nv\ӟ~{![f  p{&sV˚o;ӟOZշv퇧OzGeP8 ˄P4||@@H(dbDYyŇ&"R?=6Gpl4jy:6fyh66 ;=Fs Hj n{{{ndNIo`/)/=)Izhze B xྜPH/6(ŔNB,O˾Sy%3= $*J HEM)eI>pt8Sh HVE5\/,&NlfA Cȃa֧EO1ۛ=;~|zso=[kM ^S$yyqD6mdEYl `fcGCl,|h$nupm`!imNi&Ef @y4mEQ7IJLIر)I2Ye&73^dUL"K$SE$łވ l9ykߖ_i1[uD{>ZaQoBgq_7!ml)Uv-[(6O<T=y_^.Ssnnvt}u~=,/a ?\V.qR'AڱMrn{{{e̵à ?܆WCpȊ\|u?؍x:"DQ7N^܎%FIVqN]+S<R?PwN{h6]YسzʱeG?~c B&N?fvĨua(/V ̜H x9t&dL.Z}&a(ygۺ-vR졍eHER,W9T\LgB1݃}rEftC4lUNlyv fB@g;zڌo%LD>VP|4CZ\7 dP#8i5#F潟&)dS/0V v8(uYm]s0#,SRV\x-#_4K,WBG]xP?*U9o&o^ֻ҃(R@~'؁Ash>̗8y~ФJA_Ɉugk"Uo 8VلUVKFSihj_'qBR^ 6 ,ES`Ч/!jVJ׏-3,4Pi.fsU b(J *Wa@$wr`D!>YN?+1hj8ῳ]wѩ~L8Kdt"moFvPrhKROFq,=}B>+ kYr)1! 2u7M]X_¡^quokw簇xe^B],GNK8?O9isKchHvئ~EZL,˂Ho>hM҅,x Ȟ˅ȱh)N$a;UYn_պϗ&6)R HICd1${yu,ԒF[z qÙˑVb! P)C*S4@Atk|r=#CJiS˛7$V8hrb_nHU<tSpdI @Jڒ ni[&NbiYH䌂B Nk*!_e^z 5LcP\cua]^"E*ASV)quvYIb{gYu3GP0FNﶻ~`Qjz4T?,֭U^2FP70ve^szݕw-m{`K˺DA/MD)JY4`EJ58$o ͷ R#?nol2FB1znl4 ܟD45mhskŠYU1nZpx[KR|:NG h;0E8Y!K &3'惤4f}:;PJf۫;L!TV"MYQx!Og~CjN<0{d ,6ѹ__)5vQ$dJ<%إK4m5|$e3 )@Q5;YgfzdPMRa N'LV?X{8GNqdAK/|3{mQ6$ (d暰.Fӏg089^UVMr[7]&3 hv'TH 掺,V?n I^2Hk{r['hE§zϡ=38ߎNW B`׳C9,4 8EN䐹%Mt,AIX[WV(n4mRd(S'GܶDaXP(6%G{2$O=eI-KE@D'"ys·E!%ÁTކ=mGC5hOf# BAPIBv2ጓZNJ0;~KsTt$G76IbHdqY9.OϚG>o P9(}`Qhb;۵ruO۽[VbU| jm1f%n0NҘ gyEdE%M2~/_/HrÇ?>E MNA:Uyq6bY)vq0 hr Z$ΞLr噀Pf^EVN,+)"!&#XM(5}=4*,s3|v Dʤhx't$z;ou't&,e7 r=qJ͠4Ix?)0Gx B@y?,>-ő%͛wA>!y C0e_j빵P( W*{ceoͣndQrTM0u_a8~C;Rdsw 2GspTvCwO{OKcY(RT@&2N%wFEi|\k׫RnpOm{C}xc#g@TYE8ʔ-dc$ Uh|m̴*IXHjzRtǵ##ݨS}3NN'CmLfB`KcXZak0M~LᶹqogZG]@tn&\,62GBpv+DowMI4F|BkJUkf[27⓾1-3 z,X{ ǧYGE$bdV1[W Y3l@%@XK3XImi?VjuɋWAc<&TxkzFq ũԀh8XRT<VxN͍Rк"-VA^#8ԭ}keZE*l︇@ SƉr]JD|j@H8{nϝ߯PpF2͑]X)҇agY^58OV?~+3u{bEv;i=a:Pt^m[a攸$e['q^7U 4h:MM>P GYoFAXNo^DwWBo6;U ön^|[; w_.(CIa[#XY98 YYlq?=i:#\fixYڧ#YiZuA (| 8.iU-(N'"$]ZA5A C՚->3*~JW oVd((Ikh #|Mߡ"ii2MQVaQiX xP0sQ@XMT7WƬ뷿}\V*Q.hA䅱}%Y >^%^\AZNVB5HQBc77Nl{ސxIM4XED] 4ߗ{ Eikje5*AW8+-E1y7:/H,<(3b5Bj8:.*#OVE%- M'~"K8륔|ߩi4J"zO?߿}@/fMjPiuJbsAai??:VDvݏ9o;nz./j)Fr[`X& xEavI2jض cpy[!21t/'pAh=Ç],gˤw;灄bqĺX`jS%If dj$Xmj0S_l0J(ߴ8nl>8 IUzZMz]ڐ&$n ?[sIa 9)bǢ IBv hz$H`*]R5ZK(CϹ>a3Op%YRj{= ?neE,MY ߱4CDpaa}73gZUuhoCUk.]tŰ7!۾S)\ZLmūjbi3P%I( Bڧ"/-+h:!q%D{rډq.= WԂ7Uͷ*kUg9Q%YZGyJhHv$4ze[_*z,)f ض$pi\٦ kewpy brq']xxfB)$@"!6R7?is<((e9{PݨmwiTY﷈vԐ_ZQ Gl9}_|Iv&TAE;TY\O!0 WSuAju'rÇy!ɚT14. 1],ǪLiAPpJ'q27y^VA(煛Nf;.eHSomq9H3Rpݧ~`&\DPV$V*QuSA78 `IE^J{o *g_KY{t-<B ViBN % 8;6OqḀE3XiY"h*m栙=_6"63g8 GXZE41=P5a"d+z2I^ =r'p&v!H*٬B^RdwhIm#p۟a lg$\uJ4+q$Fyz틒qA`$ Id΋2(  ,dEư šjT]0 .SׯW_.?WOuq \+75:ՅBؐ 4)/5%gZ Y1$0P e%8:޶ U;EKmQ;qEQ7O}hHc'Njdk,]vWr|)=1D((2}.WL-U#k;pb.uÍn*|'9}m(E9*DckJ#9>j*xbڟ1[N,]љG$`q~rCFLl[lEl RƒE0lccxp''^L +&Q,5MK%^(2- R$ \G$ S404tVQp?19zuxvj4^FՊ1 -*b7lюR5.apI2lۜ=/'7]nyh&YǂP(9"#\=|v_bsl't  e$bw o&]%__oQ4ϽχD@ Bz@O~hn?fQ$*֨6nʽf|{qs26AR{m/du*!!Q\EzWケ(AI&,! rf]C<ƒ4÷wVedYyI+Z9 s%Od;A-A dN 4K &ex]$"?W0,j.,BpY J/V$xGQZڑݶVg:q`%3mvze0I4E!:pS"[ڧ?{G*Ŗʼq^^ {~xN24,VJ"]}WԈ_̇/G?FX)|7M3bx;9ꝞQ)2v+e#Aa-Ug hY !u w4}E.zNLVepʟd #VDwJéqEl`sc0,MAHh \{ PaLs_+ȟ|忸VƂPG{(q1QegG` +)i,Qm.{l3NED4<"@r6pr,gYB]UFn0>hi! 0iĶ ^ttj+gxNVF 8@"*+u ד8W:].X -E8UWIk?߯&7(e׺y>O /|W2{n?qv=pzfECiZi4dDuL90jOU!P էON?LZQ .}hE} W.US(*n؋!dI3pՊD1j.ADpM1,GeZi;_4Ƭ!etJ&$ 4πQM5}G VAmSdFCo%>Ft/"㺄@0׮)j^2fQ("<_}Ntt6t `QAxFx߻8[wQ5gSMV{0r-o7fxp@hڲ+M*(Ba}!Nط"|OeY mpI2uD4/f/^jןonf䰬  cy'Gg۶Ea⾓ŎXqZ(<Kѧ8n:][L)P{Gz՝s·-.C9ݕxS5G?/#VtXCgj{PhZ/X*?ʥ5HSUO<[VE]bcjLkEGZo#I"!

z\% >srd@ؿ&,F$&)RDqhb  <:?حF, "N" d4^f{VCugd1(2 E| (_:79cZ#/SA1fy1t ϔ[^Ih |9,6ITq>[_|w>hUtI} a9 vMAzw} O+\ey~۶(%qSHmY^rnnn>1OV򒐧p`aHsETg8HRA-/r|n.=UQBQErb5oYQ ୋs,+f(W"[Z ɒ/KU8$-o߂4tcmGpR՞#!wE9?v?>#oaV/4rGǧWj.T8F SߎvP!gs 1'EGQ,l(o4dnͨ.Jb`gRU[ntTͨ_Y$Mg1OKBcu\I8YiӃSvM7w22gW7kv'̆E4\7 ࿹,CF=hk/#pKz8M9Tb71JܧaYX7;S+GF`@NYG.;`0 B˳ ̿ZلLb(fi{y<<]7{Ǚ嬷 Ӿyk""ɑds AVm]&>"EEmDž<{as<`bH0Xsϓ~ܦ0}_;$d2ڪP   oy T UvLxI$vr#^wu>.VK~FLH pk6ꅼ ck'YZ]N:8 *rDS±[of5]9"{La~ƒ3'SQ bu4`#wZ_IJ%,/z@) ,=mBM l 1xŚHIo? ӋóK<@WbD :8/O.)vRR&hv{rIbrߘDԪmb# D ,BRz'pcM8 JT+* &:b؎m'r-eg\DiIT0EJ!1?~ug>iC[\^})Kb r<2tG}]3W^΢q}z|3]TЬuDF4Ws8|;7v+f V'K@ߦ ʲzI]n~<`DB%y:3E_Yw!=r% r LHT(j# [ n٤Ҫ\̋9vA寯~!w"urd qy0L&";?}C[oxG lu^.H/nd7ۊ,WG/v.cwu{l}~1 (e:uͣ|ģv^/ :ki!>•RxT6Z].uk:Kj, \ZʽBsy~׎t,E@qVwtxd9ya m=G7kJ^#3' B pLSu:i EqWx~-iBD).exC꓃oJ|-"-JOߥ)c8>/ ֎a`Xo05&d$POP Odh:zQTĎ?UٔSc|y.v8y?)XxeZc&~A資O 3}5N8N&.r`4QJ"BumOgٰ4}j1r}B,M̙{%aַv}IS6dߧr<(B2(.pEo.`GeDP\"+FA$P-4BTCXc&N3ómO`qtfKnQfG Z$<;vٓ'U^UlJUn{ !$ A;9}>u.O2?4b2%pCrNZρ܆:{uݜ̉m•"(N3^Klm|IbG1!;]tNR8”٧} <*PX[+|q^RFkmrIqL≲\r?ҭ JcbЯrnOٓo?+Jaqw%P6g- :8ޕY,aYc@D^v$$$prӣ?X;l&!Hx2WUt]<l20,.+2h';kt_9ۋwO?G5'YNõ/Sڧh9;/F6*h$қVަ];K$J=XY8?<89-|A9[^.Ȋ&-#ES4B}w^=< ʿW\&2Vx 6?~Eb`erQ85q_ݧ[wJZIt:L <̞ (jC7#@ze$xWƂFӺxLJþX9jk q&@I)I9 8>Fw=t<荬q4ĝ.63)NLx0#iy7\2,K2sW_.[_Z8eHg5bL2F<^f&^JԸxq@'u`HT[9h9g,fv1 {P \gx6W/x&Yl5#0@RRȅBw2c(N꣱>ֶDYLlYnMV88v8{D w|iG eQL" s핒-4?p(R&9V;-UM͸i6KwWq C646Ks VJK[UWoѭ70dnVB]Dͫ7 >Bȇa81 IٻƋ ;?^mN^l6ϏOS Pw]*B\cW@c›h:` ֞n9: l]іlUղlDv?Ys=AB9+e,X1_o AA=QiW kbVRۆiC/KռP^cnXkR^Y; xO4o:dW9m+ HB،XKI4tvԦ񤍓olc00hGZzȣޮ&k( '3KV3nn$kAp{uy9f!t`<@(̴֠,$p@ZT#Pb)c4BYS$^y,KdA=]+/Pۊ-k%X,5}|kq~3nwTyV sĩgЧ$rgKrc/*%,\`H*q$JqMI5 B!mṜk0_pmZ.ծlo7˕ vx]ZU{rd("RzKW FC@!BJ&YT]::V~=y1 QB< ň\u̘kQ9Av/n@wu} 0<$ՙNU2M3$DýÊZFɔ/I) cƒTx$+e-4KyP A+[ebYKUUQGQLLQ*EaئD|?=!8YÑ9åPHEͥ)V4V(3;vր>X-EJKMa8ʬPzͫx 7$,B08C}t{{6=˶.λæiZ,H|7m0ع<3b( HʼĘ64ު'r/;ǭ4.nf(,oIle#K rI =X$ `.ځ~ӛRV -Elӣ il8? sQ3@`xG0$ڌ[ZcE/ HɄ,& k>`B#pN=]oTz۶0)["`$[g4C[R @hQhL'--Q@ ;K"IvYc(**Xh; drȡ |/܇XvoCىSdemk_.vZB7S ARqH8Xl]pctw\ G0?I}x2]ye:C6J4DfEsx'XRE|AT]vm+ڏMYEY NlVJ)RƴMUjU!k~ }UӘO/ q9<@V6]+SqBY"O XJdD2:=&޴ {z#BT~W*#?zxpA ȫgџSGPpT:f"מV ~nO PU5_-;0|KwL\&U૕R f㛎|,"3]j%ETz8 , ^XOφ޾;YObaBvJ~l% #$yRWNl}.SIᰎ\)YkEJI/.gʇs^")jujZRh?SO^>`o?q<+aj ee|C;a [ݲ,EVt݀* foAг|KjISѻFpȝɚ - JP/^|jp$1j;c!ZL$>4b N+ţ3p=I]8]IE5HV ?5 )l iؾ\W"c#dvYilg M:}Y(_>`HlU: ~=;4}3 +[FH]7paU4@,p,[~RuڊVB;{3̹CP8Bz! jsdN & [`ʹ}GUF:5`tǧ3mIxHݑ,v}ЦS@ 4m"#:IIID|XrfQrGt>TE16iwjߌy HAIr$8Ab+O@ ^ H "h\.=6VB 7=UaA҇vb1wcI뀤_gzQTe̊⪥'YU#+'ZRY@e$iPGގV 0 Y{F@'VX bc\(|BJؠ6)pYj{'_~=fv뻚qBZ9,&N$ӻn=_e1Z/4^wj1?(XXtQm2Ak?Abe[痿\]_tv뵝bQ1ѭq Pq?V`釓?ڀI JLXԚX1T`g:zi[xo`T[{{s~Dl-U,SMY ;SOs;N4:$ER `޿'+"1eqj^>wa7mG8҉@ X{ܹ'u3ۧg/ⱕ VçCg͝3GWG _dy4\)+fûA砷 fWh||<7|1ţrY7t,wc- i]*0\}1ȶ]. H!:W/g6XJSZG^TH), di6SEA$NqߘNmg%]X !M߹JrMg$ݰL[~)Qo\;]BrbEf.b5o P? /Nn)frḎP͒y4 @o ܕh{f|:;~y |Kv;SoY8D4mza8f-0w Mz1y͉ `5vWλ zN'1d0r ٪6jʍ1r<a(A6 -wqܺ (B)ӸkuZ8rYQC)uVY([a^b űN[U>x F"xs1]G(b.%qGS(dRBy&HW<BJaI&N&8~Lr5{W/jST-'˵ ;C1=/teD>ѣh[ڞ]78|b\iU k~kJYI )dLFC3$I2l*dB9Ofh4^0)a;~s9*E1"afwO\۩*ugin[S[ٺQ' \_>b2.˲gIr\Y17N0)Gg,m,ͥ3ub)XSU)[(W0C>@Q>^uA'I(f3'0ƝDgkUP/`w/K(:~.s5C #LT σ$l!pDIJKt-x0, htje{m$\:ND1ZQf,v=|uX)AoG-M{k[zJC ,X.P䳊RfmeIջ/6wvyN+)I oFSz,C8F Sj[0{+NQbQ8v]aP7PXIvuIYmk~۶8̽8D-[ۑ;ۦE_ZOC[@<$;e jrI$%=z%H>\;wA܋ EUUWE`e0䒦,0ԊG}$m=܃@(kf #k bł=èT7ށ68^=:]2x@iL+d, 9&Gdy-`OvJdC;Z.̙A6_/^Z˞ Im'h t>A%w<[ѨHHEjziT%y4!uЛ3j6YR O jJ rK,*gD-AK! WEFx(ӯQmߴ#NaƦ$]Rr `t͗3? W Hf<.p_xu{٢rqQnwTS <rVDd6mn+hx+GNuS>_էkc501+:+]"i*P$.f.rHSQ![UGp8paW~sƶ7Jpyzmz1 ڟ.j9E *¡h[lVVa&; zX}~xd)`v0w 6Pq#ÏIT(Η#24}MFX(yZyo?Q3:i*$&'+4m$Yokvw7Idqۼm/%8b&XQLF .CS f^i6K^`hg2,ؠ5F1~GP(:ߴ0ۀolΐ6idzlϓo&uZؔti @L`{?#Փ_HȀV-]7 FR!"'cmF໧Wme(WM0"[QV`::Qmb B/Mw0\,AW}RJ `(C"lnl5إ%fOY[$Kd4gb8I9Vay^m!?1=^OEZK~g83(=e9A$,t1/NE~ VӒTt#ςN'93]ͱi4Pr6XXL%}śT&}z{glt C[/I8 ei$o ,`O;JDyfW$ Z[/PrY9olTƛ^{8^O0:?{po]wV;6%"DZQIRbA8lQI\$zk>UgT{}h?H_AD1kR7VF^{~Pi*i4w8+-O{fqf!C7(a]",bߝ1[ysrڛc4$P.pyI5yH%J_Iߟs7Qe@HGH NG1 &A@sɏ',v~TNitD6KUyQ@ ? OSm<ԯ UM(Z<'r\"Iz#GCP2 $06>9~>l=9=q`~P#2C.tЭe܋iC88v ^$ԍa|@HgxMKEu:PkY*F^^}+&Ms g#A}+n"0#p Kb_( +Sp 2$@ HD@iW wCq ѩ_9m# $tň vp;qӇ>omi24I⤉/c1 sBtvy݇}3~][6x0^v Lԋ31zʨ= С~͍"%a50Tr$)7p&@M=l ;k{ewݟ>?Bvj`Y&"DS mO|U+YLx@TJ[IVb-qGyn 1d"LKX Etݛ^n9|Aa̍}>\r(6%I BeB_^5G{LFW>83Sr+)d=-N>MP Ԍp&6ACɹQ##sPXz!1#cbx7d <;0Ԏ" !dXSN"[]ϠIuC6V!,2D8k 6? CgY咾,3i5i}b$O]LAcpQnnx1V2 bh>IG?ﯗjg2R4W(F_L iir|cq%Vg0}ocwWcfW (Fq}, Bܮ/?X7/;SudE/L #U*RtҙYj;f_;Irݡ9ݩ90wR[h'jHd*RuFhҩ_28=oxڤw}466L=Û0VZ0EN1̦ZeHe1>|d@3g1/D}(gOKr{ [݂*œ.%i%4{bN7ọ75fvk H&@{ ͛҅ty85lau"e2"E0tyH$$`H 1"i؁Pugz}`yW5ͮDVT ALN'k+Kd`(  )>A蒎 %m`İ;e8(z࣢ 6Pe$C͹J%"F|8:߶(s_!E$ScgCI  K[Hdk؎[vl٦dQEJIKG`}3|ןl)c/c,DK:/E/a, w8ViY,JWL%sӼlN8Mfp7H S\I,電'Ɠ.dUjQTX[_Zם6x(q' <)Et0͂lY/#3DHwnF840e ΂ύ]o"V1*;wB3-SV ȝ/Ϗ!g|?n잯WDB)$(r@sz.+wFS3M3Bu ЛW .56GM DvjO @AZ*d 6=l sL!K'Ƌ$}!'8Gљ1$NL}ׇZ(*=GV1V>zcnA<"A|\"#Vѻ?#RWx=jn?xǷ8N )BC؎?ysBI429deNngBяN׹|ӂEOþ+rǟӖd^8%0c,Be'JEpqxgO;q6wooë8ʦ)bxOYhh.U(4XHkQ*ճӘy; fᏃ=<<$r vߕT1‘ ˀ2$#4:@.4NN3J/-t6N5%׷A*B}i4DŽ~A(N 0BawِMgajE̼n$ RQyޠ:[{P4S**QXғOe,o # ,T(fVWo7 %h)9:9Jcȗ"+js9ۺZ^}[{;[4#<:"Ҳp^t]Flw` MS}lJēx1,*^Ja F?bA4m_`HYMi?;9 ɠVf14D!8ܴ:yhTaYSrc(_,CNU 2ago$E>+t8:嶭 A HMV,9L2Ef2y\Ɠı=v\dٱ,")@esG\BNE)!ٷA0QFi :ZųqoX,l.0Dbv <K~eQK5Z95h6fp(Ysnwhc.y"]W;dc8z ͧx*Ej:-h9 V?9Ԭ7ՋL&S.VXQ@@Ec 6ք.-,Gd& aֹAN)24 XNU DQ]#Re"MXĊrTfm̔r"-V@Wz~m놺iˑpclNuVuS^Kgpu<"4mOkb))h}q:t}8/9+ݕ팚{BA2Mos:6HM&dW5L;YucoKYEV֔^ ۯn=o6|#,BI"q-C{|zwq@lB$$9P-LIO#bȀO qWr{n]By:!E# %RujWdR,g(60B2Z _Rҽ e@B##HKE'BK|HH}bhC(+BFӾ{>H,;՝Igb!A DTVMdu<{;ᒳ3 Qey,deYNOء#$mMAT"v5'tft\K -۪ z8*Գ@ǣT"4{jàJI m?%Ɲ @I\3R%"CU.e(7Ks'1[v$Sٿ~:焛V߳Oʴfy}M7Kƒ$_^_]>ksh Z^]ox;Ѐ&NeeT )!9*z?/%I ӓnCS7Pp81p,xhN~yWsKݭ5RWULD&·oX)1tdQ`r2WFYn]J-BVlWl!?{fL۴0, BE @K$k8$qLi_:i$MIv۲]bX{00p{΁~PFdłefـhW*\.%YTRĒ,.[s߭S٭n)_Nhrū3$lYEl֪imzNt}`K e|^n1'ZGeͥeZFQx|bcm[},ESJ&uvmJ9XFɸvM4(fj˱\%pTeq6VFwеmX Z惥F$̝ :bXrw`낃Q=3vͰ,GҼ:{Q%ˑVe#jX(eO*ݝu%___>|, zJAG' C:CD,h} .EI[+׃z'e7jr@=ƐJq,/?4 P ^v_ͳB^vE>/d;*;MYA?аu$`Si(3'jpM`!} PeowrwL==~d:p5U7*䊜qX䏗y L3dnOH2|yð~ivRVJ7Ͼ4Mapn;[:5lZ%i?0z #iNU5@D mPr ͯ~1]9> ^=(=*ۻWyE`8ϼ"HST:+Q#ab#glZ|YzmonBl(FA(boGBf, ^^*V[ 졏}uB[^Nzd2SHHYN<3,#P+|p߷[NRFGq.-̻0CJǹdb1W'BD)>@a`..n>E8rRMYzK]W'ѣ [NU)ϿyoLM2ιMAdI;ho:n8=sh7V[ڙsh5L EP>]\J*`ox9\/e. ߮\I@=I ^ږTQ_̘Ȳ慹5'ƲY;v$Q*Ԣ̽FIwm֎I1g8(Zv(Kr ZzM}VKlnX AdD^O!HHAOxe)rexGP8EIjј zc&v*,s=t}yF ok};=,u6?V`vMJek_`TvTA!\@!IF#_ kn)h*ںߤ4ht`.1e1 Y{*Cw3St51>>}ՇT{˧jv=!Yr:D-WF1D7L xy#VN1 iU b82+leO [qҭN$|D"Q.γnm,Ai>Aa8#hd2ϵmP8Fa1-%>eBZndKoexUA$H!e-ltv]˵)d\mT*chLPDh<#'ר6h$l뫩N v c$zI󠙧pmX[?rx:PZ&YMDze2=YWUY&Ԋ׿=jOy*VB{U7jUU*mۥ%`c&'|&Qj}٫O׋*{GuR))jeBn@L۾s{nyf;ňNm2EbMdwЋA!2i ˥"r8r)2^I4u2̞u ATўYTVR^k8f ,K ͯonn`]lڮ$w\(ht8xPM]=OYtnVh9ETMDaopA^Ku؁E dKu;G UX[@3"tBWN|{;tKPt&OmQn˲;0P2=ΐ& ![^[~UFzfHUvZr3)T06 =bsV˶.ˁ;'I%G'R4{d)6ˀ~k>2nҎˉj$E  K-A^3ūZ_Bp0s|aaR^OfӥqptTkVQMpȏ""zg2tޢq:?ȑ&zh«o>D zz5X~L?5zڗqF2u7]onnؗ ݊te8oH:ѵ//.c{VU*9,[0Z(4bC$}nEc2~6O?\.WgDQxqzS;+'ϓa|bIhtkS%fU6, A7fce~\ZZW/#٫8nف2C+l[\[PG囆]W+lI7) r䘋 FG6⏒:~2>+BI}ُ>rr{_,_R-ثghʪ:wX#0d}Ly!ۃkdb([~ ).mh7ɲ6DW;Ƽ79jlYkWހh3l?Doʱ(v$T-nմiW+8#YJ+j1"^㍉rb-'[ 2BLRXGk ;?()|%wߜ7Q "pqbAG#R"#o7l2m]Sis_R1Lg},H{rS_fj~9K۔x(s0JIqN)|i-#:ƈhƫ)9me 5ZLQ"^Πy|7N Z4j:A"Z-6}׃"˵Z{6XbCoC(ƫq8|ZUJ狖 %oF}ac|q0^%as(I7*U?hζRVmvsllB;|K3?ьAՄ`obadVf Y%]әh&@ 3uLCqzx@S ӽ`6_B`ZWgef=H(C__7+14[EuhLzZN(j7B,a굻HW@I18H>#'=-QjE/%E$;n{ob5L6*0H:#vW}S\/cX>fA~hz: QufȇCM:\c Ӣ8Ƣ`6>?8㩞iMm$J4ANN[,ͥh$68-4xM:$:;mso1Dig\5v_/B !QT%P >j5lD-:hMdW?4HLłsL{6Qz\&%IYUSRiRXm0LdX@SD$t r-&Cs<~j+@04}xȃTg|y,D }@Gr}(O`JXSyβ%x(Hzےc8LH ExY`Kwr@HflM[opHFק3ϯJ7.D κ*&f8no>^O-vI!JQRWۛ.~:i~/#IcPt\dVl互#SM`㙊cxH^HIh s7fǗGbVT({'N N+1[w}p<$z<-_4ݶ{yQMzo(֖JoWۯ";e>E^U`ߓ[kkne|"n?I@^ۑoD3!^HB ?>n$M #c(Cr.$!pQP+|ry;k8Qx*ρw^'[ky1,%l$a|ZZ)YWwsKx/7QGXTjRÎ~}MrL1 ;2W6ZV*)h8O6끞P|\>< l/]qȰO`^2/2 W?_= =J>pC#whOQ Ik d0D浃Q5uX`:VUsrWA꯾QEIP )UfwMFxw훕F=ӻ/J}++d0`YLTJA'C[7vO-0ߌ'O&!,8饧Y*ղ({vpFMg2΂>Dʧ.f2vX0K0H $zpwʥ|X:FTMv;V7[ߓԆsXIp&_f2/}Mճh! @!í˽J_pwԙs T 43 FHVamIKΦ7Ft&Ols7O(f|km/K=9𑯹ǍIԸ#kp<f=BQ}fk8zFf* a"Ėec<baЬ)<#r6ʬ'&M<6H<髫ztwci@ )4J %Xkf:f^B^dxNIOO(CÑ^[+_!;%ݝ 282O;L8wv=0(I*X,j "Ep~p5FcbL;.JFhpt&maIQȋ8v E /+Pt9MMCcNm+^d˒c-wqɎziN3{`[%MPMcGUa{N$'YF?#KZF68%I* c@CF]ך:B˳8^P&Xh̞X!Z<#(DYH 3^6Xĉo  %N"a|iΘt}k];8]. {ٝ=>><UPQ b8&wG(|aZ Z9GV_oO~J|飳vj\9I7F Ӑ8FSsi$*$-iRP U Y8(fG˳7n.z<0ZFS␮ֲp%_~d2-AhAL;j~OGAεE}c=9<%+m,<`E ݯgwWDMQKʱ}F46gn&}@:V !POxƊɱ.(Ydi0 A R`kB)Aqպ^k" tQjĞwIJx8=hqϑs^;Oq8sP5~2>v{fǝWGH$Ximᰨca@ˁuN{UY8=O#wbj:P}=؟\v.A~2툪(i%c=W4RjC ꆚ #7tϝ^JD栱m$rG3!VM?=?""ugˌŔΨ-Z3uR%`'_B EF1z:í#^`0% DU$V8ʑ aY,EP eUoqQQ nΥ4&CE9'f:,AiIGa\8kΉ?;u6oĕYoeqV%ozӛi6+v7wd p'ٜJ{s*bWoo^ejȠ nׯpRnmq2I "X\jAÒGuM7k(,zͨȣh/YBqly A^\d<;SDZ=A=8k@ ,s^9B!?S A4 ' ab*L WuuG)Fϒ4Ptma!@eɲ_I3itҙLIsImGd[-#B܇]}aw}0( <c9c!Rׄ\Id+ hXdT69OC3e2<:` $Ks /]ɴ.oY Ro'ŚX(6첀t%/NOk[81$ `Be%PЀĉvxKirvQ{zEB*mU%,g v8mQVwLסDF3p MU |R '$ ή GsUǚYgJn^M[c,M/G (BB 5\k~8j3,1U#T",b:|ؒZV"[{xea>OiҺG/#GY͆xvX,cF>_^)vj= Öfʒ-~d>W5w &d^ט"}J}P4$ ݛ%n,tQJ,<8qdo`dE4CC Zs~N hYonWg^oT} u{K- O\s6p\0J}x@{o\s'B?5/^=NqO?K=F>~@W}:ihgݻϓ Dnp1 `"4k";Z?_9K'1NjKL |l[O8KRƭ¼.L%!XEA5fzOU\tn.dV>'$H hD'I>s 1}^Y\( bR\mA(?29n7h \Y8 DX,wO?} A&> 8ꎼQ%G~f83!˖`]z:+:|p Ac' _gޭg<^b|a,gi d \[&PfsHGaNj/:7 Z(Cexa^l#Mѭ2UH98 lחo/<kxa-ή|(  EfY/6;NYlLlurT p׏v,ABHhO8;@prp2scTJQ4䛑2 ІmA#FR0/ I/Ggۦp14WfSC4iwSm&MkM&86`;ܰ˃Hd;\ 4|Ac n6UTrSk}IѸXlal4wWrq\泾 %1_xtG| (iJ&0|Q,kyV@GRB$|2Mc#(U6zyy!C>Ua<hq0Kh^z"c粲Ȱ,ea%5gu:}p䏏9N-l)EQ%òR޸٫e#_IL) 3F]ٟ^- `&bQ憷Å1Jޠ>L LJOa,lK,,eQ8^f.cq2pK toElߪ_U/ iHr)8eJl޽W팄 =lߝә>}* N̙軽Bxur~}OjNfL1(kaÔ-qm>,n< 6Rxh@B gi./V+yq_d峿3px>?ncI Ud{$>O{$PFV$2ӆ%A`+ophh-KNL:|(cyѬSfl5#ʱ' Jby|X^U ުO*rVZcOɋCȔ;%aV(6m_y+eee8 FUTbB6l TX":1dRpHʟmc,VMS>L-^A [0 ƲM?ioٸoSb'"Ri\@w(:޶(rER(QM-$u"iч/}h $MSNbْ%+vWqgG`x93r6`FR A4bu(=9>-ph/o *rxG9 8Q$1O (FjeZIN %I*򫝅hg)QĐUO Z HsJt(aX:)pb;gy/J^S,윭a57t4bȣR{ 6& g.xf՜>_ϿŢ٧)Wc9]ފZq/1rM,J;{GHƈTwkEi2ݭ1bB$T6i5 {^8( /ԿW|8`ٟAݪ-(0귗~֪ ?y$y/6;\A9Ͳf]MwP)J8)W.58Or@@)U,Xt:$Zd 6(E?YLƗ_rq_[[bGsF *(Y>=a\~Q4&Tp jOO!3ן8Y-.(i9 Dn`_Y.n=_z22"7ަTx9#Yv t&WKrsjifɐTUK GH1ǃ>~W\\^d$uo`  @G\#РͿ(2'MQUb*ZFNg5gŞ1񗟢imj5?:9={])KS qR5vk^"BZ\'O׳$Cg`0 / Fos%80zc) n?Z%h5[Mc4Ihzp;$Er#{DanjUp3-iS4e:egdNmRVNDaY1*Iˢ*rcTMrrGgB "22g?XU0Wz,tȒAkGV[Jh'0` /26Cr'Z^A ?(E@Aeű!nTG$CrS?5;A/\@:W!ͪE׹PLqD̋/A"֧|R{ZTFcwrk(Ya]E!Jb1hOUF>YN0 [ݼޜc*RNip0EYfh$D~.fY!jtGSN6mFg2`píq&gUi5o)1)'zW=׹] ivOSJ* Qry극v$) 8"dnOU,1hN.0'6^q`l*\g ;4yoa{NBǴHa8cjzf% 7$ gϾ; "]pKWalMӞA=sRbsYRU]9^Zq*W/./.f}O=Ur؄g~sBdIEGk>wTn_/KW` Vg' Ho<N; tM.68m3MWY-wc!.e۷%\)MMsNj3}KnR)^˸(wZFhꓝp xHxHr|Xe. љmQH$EIdŖر K(PjS/EChvb;eڨ]$ŝ">9{77sү @ mDn&VDƷ7_N+nyz?6ag{AW$F)ɛM:i6t>a'1s n;TꧪbQ|D3d:Byu2whiڟ ƳQ8 DV(r2tG(R #i!"Ǜ$#o{+ = c7v|FZ-\`a4M( J/jiAdKW@y hݥ\סm9@k}0zo;o:LQQ,D?[.A7!kk=˽m_7J;Flؾս|,󪳲aJ{/6kܟBnd1q$iW?|*5 ڃ6-m*I!k"FжG݁e)h:٭7-E蔀gY+CɄm+69r^teД, ͺZ*ypp.j6 -L+Y,ϔkeA(U:)HbT_v*~,X7 %~vT6 k6vh C֡UBP8fK_~U{0tz'',&Ir|t4K~貲PRkf{KL)#p#/jZE1V#8Kf]9/mEϾxqb%(@*7G%Hi`$:;F| yށ\hawسn`dJҭSiYyQ1EPŤlq$Qsji/H" E΋&n_VKI=XOi7?# }u~Unn|[-x7`Ͽ~QH^ vQʛQ{QxTFdXYa/H"=Yy2l 䶣G)8P,~{Ɉ17<V3,#@V gQm%NѢswGi\t^`J"B~`BFc$G@GVVJq"QGa$B!ebR@|  a"?a^v x}]js=5$3b)N4%Y4(|Va ~hy \mAl` devԶ0mcaFI&i+7mj4RJCI2 lll|v7[ZZomia/|E!8LPj3}:<*4Ky쥠Catmr~T)?{xg ""<{cו4=BuoZ'Z7ˇ|/e o ;afHnNL55`A gNə0%pBX@1ehb:)b0WIR^'GaB-P y uV9714u z;"oނvߙoc ],! SH{=xper:gixݺ)/rx>H<9ah0u |DzM<. ޙ3BU@>WD;&fRH]ωPst;Hn/wDPGWvs }`m>!qb~ֹ֕-0juZ"i \ GnrFzT/`YF|uI5?RQ&B)^[~WXSl_iVp ʹˋ0 pl'(=ѭY=c'%Bz5^( ѕmAHbD-,;$hR4A=h{ =CAEIeK")"٧.ofG zӋAF34206HbH֎3&( ,iG@gzwX+:Ĺ 1{ Kc 8aVr 2K nS< %)z^ˊ Ko7Ћ7r17Ũ;0m9%ڣJ!X\xooBr‹*n,VG4Ssh8ex\)naQQn~Ъ)D@BP|hRiܞ9[ 76]/.^#cx0~D?(+m( زMԃ`PTaB,!XH?XV$̹/ %aonw` VwFU0vx1ߘ+ʊD~7L;w(UjP |rsJYUXN'βxwy 08Rb8{b5goR.־]oV)}f`Q EZG/`Ticfi7OBe[ 7_8b{MQiud{x ysI4euYT)^S%Y! |}q B+(%ĔYR ֟?:/?*2YeVc!Q-ONckq'3,cC@ i̸WIû`=鞼l{=8⻯R/ j]uq˱0~lcd,T= ^zsѽ& =oҐ#lL}>w2[oUE^L߿,9WuѷsT]-vZ ˼zC/r>SI6Jm?+^f"prZ$Yг;ot8<:mi~Z`C7R2Z'|=) adH`d݅*;>2fA8'd̨=6pF0E=,Uլ ȶialܣ\#Q]磊})/N6+׬K},2pqYKl2vE.7oߪ\1xfGAG^fEP$]\CXd^=nP^l:i*bwE3@H 9"&};r4:0UY>-.?}YjmPet;yz@ńg aYaBژ B 5fvu= >v SX 8͞ЫjIyɘO4Da^`WGfOB@hȷ\{gOKUUtm=3I/U%R"fXl:j\4ɏ7qJLHEYT^8o%)fl^ȴ>HB.R"`JK9ZLԀn`}N8B|_ׂ^8Mdpyƍ$˥+r7OA i/|pnd( Pu$CJH?Ŭq(U]nMg$Pg'5,!sfy7P\ީzz~P">썺H{}P@b*NMhM7Dxzb0r``by:%LWo4: :ԪKS R43$tp6 "m7-o,gVzoM 2 iYhA(_O,b =͢YQip";3 V*):_/~xST*dQ,bFU:@$Tg0[Yh6'TB$4ShvuvCpyV [,?bd78.rðlh,}(-I.,Pj˥D+O}}W~Zd%D) HQ,Uy9L?f}RYKCYmyQ,4I CYF˒T4駓ӴV[2H-  \d"˺A\iE%G|3߿uySiPU0Cv0fh2ct>}gg k)0]4!1yK;ʎ22*CA7( 4s0dATkՅYI&l}F#`>u͸l_{S#\[5Oinmtw7%6͒DsڃڽISu~u ӕЀ%P?r]zGpڛ#JZƲ w8 (64bAl7 38]9bV{@rsD 4r9IPp8UU;Tg{t:zY+ptnmQj %v'NK]M٪uTiӴmiVڥQR;ﱍ +qt6QGkj0=z & hK*f;0% ƉKkvaY#N,31KL6a,@ S7Gq$첰!%^$ MR2`iWRIrK\m 松>Yl,4^\^sҧ7Y41M< cH`k^L'E[aGsך\)tAy2<;n6je99l3(>H3BIC&P$̈i &LA3Ϩiw,;i{s^׎ӹdi&4덍ՍR 0P\BɿG Օ\9&D굝J_OĠAKru7OCsfo~w%HGuYz|h(j*$mdE6p, /]Y9>Qg{Р=G)&bH0a0qv.]` 9+A'i"^$Q`OA@"Y8bkGbC yyJ~T{fΏ޶hvg6k%ۗ[nVAqfOŷصk3h%Ӝl!a>Rͭg. ܸwqqF eOugL*2!"T$ؘK8騾;jur,D}r3LDfֳa726D6|Poh-yB~闏>U(#ّpfpi"[TR64N8A }*8EYAȲ Od)h"WDqUq; xHllIe"EXgT_auG$ x.#S| s W0Y3M oa$@MԵ]5MӤIki1A%@HۀOl?Y~~/$H \x4r^nԊUµv9tP/f(:&n _l^\0R d!8w2Y5h*^AuZ][zA'7#i,@Re` R|z%MESi2HI,$\#$ #u'+έHN+e '@$E,tqoڟ “1Z- 5S )XB#(4 69M g8zKD\nfTa NatS"/vk~}۲^TS], Wc>$vBg~t=M ˒ˑ鬫qXB:a[,xYgXo{JmYp9Ug'rZ⬭@  ǟi|9#}yzk{l-VU ׌aSqQ|N *@|~.K T/~:kA$$esbՔ(Mur9hKzUkJB $ZGn\8zJ_S9VLu; Xc8C?y1Tߙ;ϟ={+6σSz&EMR[>@J䒅:ÀI0@lEΉ:f"?<}~" Y(sc<7}b^8lb+q,`uӱ5͠6x:O\8kY(=T$q77[6^p=ߺf(t5~Bcow{i܊!L1Vftq:Z&˯}ݴAx `/GLN=\ZOAU^+Ho6$UݨʽvF Z(`0Mճ . }o| $ ZB0(~~ܙfr_L5񚐭=.$sCLUG#1$s/S垠;t">3t4K*EJ f^1mΔ{g} I4> AQj(dbAWN¥f~L ,es /D+WGVTh-x@.sM )J'z6(LqE%R%a m-}kMk\يDz-Y%qIt{0oꭚBy7Zt:$ɭ($}iPTo6؂^./;< 92>2'6 &wwZoR*dlbi~~+Uۯ˭]}.s劤aLYj;5'e,g#+Iayw(z,ՈJi*B40#Wd /4YyR-Zwv0^lIeqof$aPZNO-ӢMY)gDE)B! |D9?R "n{'a;VPE`V]T"Wj"_ieCXĻ?Hk~G1N "IBP<VxVԯ||}޾v$ovnAkNdo4$Q:;:KUXV~]+}J{G6g,NAst f~;ǗiC?{ Lg4/"Z,=DwWÞ@ #c=)0HUhҜ0s{R8*Uu;+Tye]qPb ->\X _Y- -3j pF Baԛ0TwGÞU ̤/__$\UIa HvR!א Q==Ocm߇ќZU&z.oo*5>1 IpF7BX9vÅ sHk!htz|2smc'E.|b-30q0 kM) {#u4H߇^bs4N|-@(KTy&A6`{yyfҐuKRJH /R#sOwv+CVt`Q}X=$ HݎoWw <ܮPꚞo(pp;C7~qYOw}{pC.8AYx{1fe`/g_XTsF1$1%Yl Qq $|VTQЇB(CE8]mG'uKM1'bV]Ya EVe>xUKGKg*'r`{(.3 4h99!&gq> B.@s|a뀂'ӏN?ixsUXo7F-3,suQՑ\pՕɐ2- 8 ők #y ćAnVDM4I(}WӢ( ĉ]Kv,[["%Q\ث p{>{RVhyWHC"Aq-9i-M*9iȕDIBwα8SHw0+'"q/W؊2BHTkw2TRiƆТzB]jSc |L'1ܴ|3'7bOK@YJo|lG_M.&Wڅ##+*f"!6 ?yvWܦ9ehRd5_DDhׇBhc~Q1UM<ˎLRuUڡRk>92Z>pc0 _gڠkr$! 9Cs͇bxG+b^]G LØςI| ?LsߨLduHf)[B)/_J2NӃQCW:q=y}+XCB}-2\ `LJ&6sUuaqv1uoίH*\ZQy=$AGUs !N`3ߎɈap9U,Qk{s0C(/.?+8l&/ F=n!G?Н6c&n ɉ8=g7ۅ$/w:17>ԅnV)`->U|lvC]1'09DYr"HѴ:z %qJ^]*y;O졛IfW(~w0}=nDHohH(K;/Eg۶Ea8D,Ye;8uI[?n t&E [-5QI>\ }<UZvҐrCKXn&mA8~scHڬ,pg zc!O"Ri5|\ g8b{fLV8bBڠ4E hHpBQh; ˃c Nq ط[`hʡmZ$A0w+3_|zI|n7`\,4$XVBK Gۻ[B`DSW^8 ;}8x ?4QK0\x  לY#$:}#Q(%q)ݱ6ӊ)1 Ud +*ZP je띝nߜ80$|rW aAn!kdx[DZt&ܒGѻIdzRw1JI*NN rfx ׯB#J$\s*6y0LBXR,Bq4ieNB"/4f°NփkJ*0|r`UaSŧo5v('o;*o>8(ɤ\kYH7pE/[Uz2!zMTC";MRd~H H,·腝HȂrU!վ{=0%4uI٨63*L>BB/ţݽA՜2#0 )#2j}* XnL _77$ o8WFv :L/YqA="z|?(wZ̜@sHy? O#jgq˰f0!Cx+2~`JMbd۾qӘǓS]ɘ뻷(:pfK2Gg_;nv$>L0ﵚQVuO4cAdš!hN89K@EȂÃCyozVwZe8N;unյ}'JQ<`%l6 \ԮʖIU"#! rsnX>Jp4oӅ'JZ#;NVBE ţCţ[-9CR"(UZR j]4t@x.-nj0ݫw8?;<{l|dv,˓Kcl)l;m2.-qGz [ِegA*2"b\_Zccp{3?[:n^7խZ&ԙfHe *148C\ϖvnB`4QtHŁ輸%Hn 9ꆋf.T$otEV63otrUjCW|OQ=1F/GWܦA I,uyK;9M'qnْ-_:Ѕq]#5-Г~ws8lDk6{opRfs9!4LmyPFׁNfn:bK5b(tV.U"l΍-)rm*ptе=glR0sE6#e(u$4=X ' PA[|*WZ 7t:l\q`<-+8@\+( H 'r݃ޮn!-<aD#Hsf4;C:$'GŚT,7w2a%)zr1TJ(čfE 8qA1: 6[X3_q" 2( ڥ)rrQqmʍ$@_U/N.VblF96 u p ޖ$݃ܨ*0RJ)6ptOyL7 L:#&;ۀAiػs@FZ~ F'8IrXoTгWK<)IaVʕUR"xLoFgtM++E((jvdqP =s A_^R$VD gs"O"`Me@T,6Zan۲rq}7׆mn @ѹma|7$KӬꚦ&M:M>O]MeEZWnC06~w,<:~W/ƏW?:OyH0<_d-{^.Pfh*ҫ&7oF7 G]b4fH<Ci-;R' 'Ly Ya8$ cLP\䒤i$B)I@W$Y^:f[QaR@ Ҝ8 E x<" `Y&Lf3syؔ O/Ό(+9&b6p}vtHIV tJEjˍFJfaMl·'C\^A3%: Q;HXcN[NL%$XR?'BM Io'nn:V l5-Aֶ޿ ?ˈE 1wQ*SVʲPb=]siR{X#Q2|C -qBY٦y(ç'SqCz럆[r^sn3|jգρsWvjc5wٌ> ';qN'iB5灮G$ iqB$srjs+RK}poW"U$( ϴ `^$Y?L+НGP;&1d]6qkJ]l͖Ρp 'O&P")[aX8 GҸ0rn Z|usy=rxA5 O3skongtҬWd!l%~wwƠ;utĝ¦w/66ߏ 3#Ƹ]HC0Te0ߨc/:^g[zp4`EpCrI=i\!(A0 S9/+C`T&nkS\1cRF&l1vֱZn g8 }K΢e(7$vivƬ^r /V0jh<8ɒ6ڒ摤TXXmU ;_ë0jUVjDC=|(haVH ď)2܁M=/zet<%qjkU{Mu#Q;R@B?@ s`7Ax~5q[M';sxzt|x;Yn)r3kTCϲl\,wl4==_.쉅\ǑymaA$Yh1274/WK`j Jި@aj˂0t `a-i;U䍓dr%pB<'ޞ(M*I'Y}'=|J޼B} a8mA}+HP8­勪P~tOdgk{`trIH޳H?q֍,}{׏HM(0ap^Scl {MeH p FQ4qM 1=nnƳIVLč5MB 1i1Ng_Ԛ+):,?_ïM x`WYm)hr׻Q 'Ċ>5wBQy!Ou[7,=b'F(8|zlM,Kw$KAs焉^- V zo : dEM;7K$eY^GqeS.DLĤ@ љ6iEaU @,B,ű8q'LәNqqIdbbz_}=|;5n~>6g)Ɂ  aM"A}7**u>~WX0,6ɑ}0'U|)*?# 7eZS;XEA\dDz"֍|2p<+dx*B'@n>T-v+Z„Fz}2Mghzs $1_-ՖK31Q*K:r)ł\zKlmR``sӰ =a#]A(BAfOǃ_}Xsjt{=F#&R*kY1-+ [ZێP%JpD6IDŽNFcRD)VVՊUw]"\NA8WU5XO@}E!L E~zJ*0ZmE%ߞu:Max~ܿD 0C4Jpo/Ϯ24tuS4ͽxgWyAQj@L<M-EsX#;z~aReW0}RG҉Q IS8՛֎É1Mo6ja Z *  V+> <;8Q·SSm~g+b,~]P`y6Non#0,/F^vwb8nǻ^<8Oء+ 4I6 "\aQ45Z_yJBC!17<,HDPܮ?f.uP)K[Pv7yv۩-ݺ}(M ( BnR(QJ6k83CGx*u&\]YeLpj 0@~LeQ%mn4˭Pb%^S9`9U1&R'poNjY ^,JVw Ah=:Y`،A>6DHvvTo" ֲmkיgEEpoGZ!Kq<#MbML9aNJ26e6 IA1欷O,ʰT)5M8ċj) *?N3kj ð]";1Xfi_eoڙ"L;NB\ -$Kv9;g/xV(eACBG, VfAU,%P!€PD4֮<0Ln 20Q-WX\vtY {tCeA;6SgqQ&ڳLWL&&$( 0t/Q}^eng< xziA/8/!`x4!yOI da-,IB/0n(7lF|./bZ}Ez=WRr3~|MM[F`%âd1)]ߟywe[kI'/&l^x TB3VITcZXHw\B0Ќ/ ?> SaNw]OL) `YD#}0+N&椧 Ţ(65$Gsb-=i13}l|lmm,*Hm4/,smbon[b:@ɗ3F G8 {tF0M/_+47B L!JF3Sڝ踏S $X(β^ۿnDrݱ:MUP6q%1LVsZ[4*Roܩ^+p9wUSU T᥄˻ 2O(\)ϿŦ( m!! )tn&FqACgzegP)ZX]I8Gx!^جcff) oj&?,&i;%fES'TJ#a%WpBZ3k6c GoC.<SVU%@ryv͍mVic؁eXudd8*XF_Ϋm#D!`(*-q'3yCēcj,$zQ /pۻ.^cDNpB!LT*&7tvYk0W 5Y rE&iFu+ӑ[Fa< bJ1ggE0&(& 4CC7lnwha֊K$uc:Z P"I( [lF~8@MS%`xFٛsG*0pU.9mHLJ3qfgHcε5]ixn9OQ3,bq|WhH=segyzZhbY f9Wmnp,~_kt09J8NNEw L`uTs|"ouSo#lF_o*߃ǙDT(cNwD^Kb&Cg@ŝ42d^ky6gy 2bLD6U_$~M_N.NYngVfF$E=܏)xAs9.]( P"EDIR5IVrJ&~gZT-kDaSX0>= \yQTr\H獞֎h}թFg{,7z@r!nHv;)hKmv?7TY@O2G''R “GOw ~csЩtXͧO>5>Lxy[c1†@ФzITꯑU q^#1:WRw{66F LEPl@+L/pZق[ݭ}Z#2noT [~y؈ĕ9`T% V F+\X*gS0Plni6X-EYy(n^(P4D9Z>$l,mqr-6>y#Gm No!XI!òi8?Zh,8e$I 0ihDu mФ"-Vp!ȆEW$C7WH)rH8Ynz~z^A泑'Ì_hr 3Z4|wrI, |Brv60]\EZiI;4MmЧhQh6Mm'H%(Rĝ"#3s !H_jLA2u&$0מS!-MS!bS%+!n2p/z{\Lct`]{,"P g@qFP B w28b!Jm>O^|OEb 9jE`8Hi'o:KM/ R̅鶆rFIC ,C^xU4I2sb8o', p+jPuߙuՃ&3]3J8&t L啓;DҔ87r0Y/r]kw?~WhiDAtP.P6\ʵjRfPj5V̥Nc{YWikRr frXGMg|Q-qh->J$@WUm.Gde@QRn2N"gO}kVѮbz-zCE-cMq8@Ikķ{H\Vfyѳ`7av[a O(IA+ M⣽NSemTgwzztɍP4N<>>,ղ|=H7`y۽ 75GEV_άM<1oWmg:UHQG/0O#sժiSE4xIb e {p.qZB!c\.󟏀xM [<ʘdp{\58IMD[$GTш  ]Jt҇fМ P+qeb$#C;ͽvo{t|ڮhBwRʣ2#3k橻cMbG24HIs # c#-i2?m(A|/ooFE8zwAi86YktvF NSy8" 8: SL*+eiI6_>Iʦ_.z~x/'(dzru#Ӌh75F~;8`%VxUS?==p4Z&LJތ/M!1 t` "1 p:ub0jpuw2"=?ћffflBJa!4hnvW/57HAxg7OL  gfh9vAac&`4Ci(/YeVfŪ<<>8]T<Kd)NH ,I 5M|hϟ}3N&WwzS8qI|5-?;MTkTTE\tFhuV@4S`AzV6[D ht͈P2U̇0Qb"ZmEN%֎)TNDF 7z pbNl,&+W.aJHxyXP ڙ~4-5Z7)i͍r&H J %첫bUJX=B_ BSfiU몔f|B$n5ZVNmj6m궺NUm=^!zI7J+ Pyfzi JMW  :8]IO)p4glm`- JӶ6.lC1Lj7mM::2$) Ph 3 K%IgfH0|4=|t"R!ojpg|BQyF2IVRYƋG |pt#}95T"aXVaot+Rg}<$qT}6mw5H4^|r<xZ,%A&O0ʬ 7ML3Pep0tGhM]kGHɴv6<[x𮾳 t91ZVTkjEAHap. /NЈf\_؛WsRR^NdQl2V0hAOFN^gqliXNRiOR,w?ӋDoTk@⋴# I_Xb^.?/QH>Eqc8tj52x"a/>ߏB=PjNolװRTEF¦86&>[`]W4$C7#ɸIM,ˈsa nzL̎'$N{Dk+|<VPd8.T"o̍ "cb5k.gw;o(dki-1b+4Q6UCR!) .0H,RU6ugP4ύak۵&|Yr<bQ< P m:SSe b:1Ŋ(Pe`wp`a-Gmse4W 04 !q4}~ VQC CIunhCA؄oXgLkCoͧ{Fy~\29i! T[ͦR)HF@ۻkМl}OQ-oy0mQګg- Zvݏ6~U-<T\oBQݴnW؈Hcrz0zqX+Dg;ʡH& %|rm9v}46M=]ts'k,ϗRd(fEXJ*U c{GA?u;Ɲ([MpZ0EDQ< W/_=7  3Z:3ѩ%zX=5Pv, GOOE?pmfnI!Ң oՈ ܝ\X[̹abk)0L2ï8_+{j~<7- n+˱d L#auA9YWh'GJ\bvǐpwWkL6eK|ϯYwgvzW<+t"LەN&9D3U sPTU`^8εt~P?v,y_DjtMb2'D"/TcFIc`y0orZ,@Q<]MvV;rZl<C8djP +IE&G',ʣg/ `I#2l&Ce_CY]\UxA7O68(& ~_yQzv5:|wgW/u^2^Z8)alzؽ~3Ēɑ=W*r[U/deׅ"tZr2¸ղXpsňpM1_yMj֎!}%a6Y=T^V6GzՑ*g\ oH;q>K0BC-ɭID/ߠ(J1bl)x_̋N6lr&S' tlw .ϛ(^ f25R׷)Fh6?Y"s8isVAlhŋdNDZLvL3I'͗Y'7Y-ɒ$@У|gs̽x Q\#!ĂXr. Lz\(JD#MI2YU֖njZ<ˣB2=34kgsVҚ6=Q-!WQqQb1OR kRV}t[o_v!b"ۖ ;qM\(±5PX-ߓA!wzWØNpCFa@;p O7wSe.f;:\ޣNJh~dno&̚Z{ElIZkbdً@qyL!z8խ\YjLIOًÌv1|PU 5Dn@М43` $Je‡ׯF̵]`.;kATʶmsjuG~!ν qͿ09LT%C|őmL_6!,7dJeBZKD ,JS5MZ㘊>Us\o8tAm*tT;8˲90"%RoNWY԰Mpst7"t&>|*x-j<$prsQRq9g>Nbsd>"q%6ܞi©֫&.<-#kN-L gHӱ/7LX٨lls4fD,?$Q)v)6UۨMLGAKֽ:ųEIS 2# OYRV^+Mo:B,Nu~z ]ďGDVeyoCdaXa#/Jg\PP_, HE~9;)3r6j]`cxhn>u"qKsF30 JQi@DST # "pҥ ]cp beKBF8#8EĆ^3i:+2xS8߻1/Ac1tkd6b؋~:ƘNNOis60d z²ϏZ Oxo޿|nk*hUDKr ZE# {DH@i)-Hfquz18"Xp񇣯\kMیw `6nYiv"o_&UU,@oyz#@Ԡ>x !p6̰1ѪTа'y:FË )&%2R!W峇GN½a{,%SZ,6N53mz׹Ҧ:2[LiUsy[;7op@fp@BxVT1<G)2@:>X[b3۹H.D5/H}bRwn:Р馶r{%f!L݉?ccHF3n^oE30&\%7TZ6P6O:[sdD)8ؗ^ynjȤrqޢ]dKr6R}9n<<55eՇ&N~:YD|$K16z TF=b͒S&ζ!3Zf=.W(XNl՚~K,)?}ΦzLJփ{J9ʴP#Ie!{su\$EBZ5Yk;FXYԜ9G88%vqq E K׽[B (!(1y+Nj5i\7t&EC2a,_)qvP {u'prbOO>&r%ΨHaY8JE:CZzn*srTVWr&d7 yT0t}3= I0,cBa^^6VTC*`D(n]ۓ7WsZgvPrp (1DrD45FD~ rqrBB1PA$s<#Ї޿ٺm6h#(?3%!P\TR>AB?n6@AyZ"=v-D9do!0E0ϰLę Ϗ _+1h p6T9vn赽nAuNJMSaߵ@1a-Ž->JC,&Kr#T' ^t3RVe![Yr3{} FvDY"YʢT+WƾѶ,+<}!L H6"mFCdA)w /Qv:i,ZR̸=m/XnK KK/y] POa&_r_4nCI7ꩳܲmwLS@89@0 )V rNj^)F`ۻU68Fܚ60,! I%' &'ӛtҋ^q촾I6SOll m!@S^~3}gjkM¦ZO>GJcz.@fg.mof9{ [vRA}6\\4icY l#KiJ`()$'DB4ȦxZQh9cz=G`p<@oEa{vW #d9]s'7i֯Z*YYa;Mq$T|h k,t|', T6}JM4IL^gBr?N'bYlܡ EL~5@2{i5 }P8( ÉOı8J&6Pz\J&  +֓#Pz×(~7N%isd>ȼ7t:9WJD0w_MS3CW- eTC (JC+8+kIY: }3sn;Pк*^9=&PzVǔ@Dra X kZuϾ:]^rԁ#U*>/-߅(>GAT576~Džbݟro7ֳ7cAfYS *lmnqE9tYϦ쉱+ևZ ZWgt<# (MYaO[cU<3#\|i$Yec(:S^ߞ w- D2ȓxUׯHGnL8ett/;N4 b4'KC}* Um@O]q<>2\&Sݜ's4`"xd`RP/7*t[8 "bKBi4R( 0YM%JkMp2s: @6с`I JsoVׁs0A2 hL"Izcju}et5$Q. <[Ƒ6Q˕ZI`x8P[B@́a 8 q7+> RyMg>7 ͠%41ORYӌ D|"فx1'gmYW pBC.>0KW) V9{f+/d}s0ɈPv1&~6 <]Q6{-Zdg!Dz9^Yq>~XKVVsMƟI  A`ۜʊ"}1 Z 9%7ax$)[pp|2v-+ڕuu/MM7,JQ)kR };>= 0=  a_O So=ѧf5H#"~Iڽq 1h>0, K"L )`٬=5G2伧 0y,u HJ4QBAono|W\/ýNBg/}AtZEa,jtd{b]$E" Mu (Ŕ` #|p׽wZ ?_tU'5 `{w'ƪ˳|&K18)3%/1 HTON+j[Uͬ l!qxvDN}cjֻ\^ ėFGaz7ݓg6N ǪbeP'gsw=\a"bN}rg:VB#lhurhi؟]g89ƥyI7n$b0Qa#sz虾( OeyehB3Π8fLӶ8.H 1xIL;S}~tZ$Ntvb mvBB $P/o_{x)*!aY-g(lKfDVXIRI0ž?M-G!)\Hp,-hnm`qm!Fo/vp^HcGY?\4Gg6ui W\>#H@xE68qUQIm6 &DZdwꏆ6h "ړx<#4n&..X1] #C@lwbz6ɔ=,=oy'z}U`$v_z绤5i6FQYa$T_]nP//ch9E c.n0DFOX׀BFKiNPQŝ5">QI+\ZKnnK0@n_8T8\|zpP{Y^_ HW۾7=;c(&X`>d8knP,rgo]X? ;CUmF*B7KEJf `ɜɄݿo8cczFxiMWFDy$cffEmWZ z&Eq3 KN/.>UtAMꟿ11ݫyA4h/]mTxB,69EOJZ~`"GAɬSadJm3,Ap??Vnj& w8P]GG;NipB:PzAzdxF!&&hRSkܨ4W[.Iа=ycdzcP2bOI"Ɏ<\и1-35ITr:>=FZ!vة= &MQ4oya^&h>}xŪ*|_~`(9v/d4뀄I(yd7p8RUw8kv}rZxχ=/軇9H! |_ך`ky4Ė2<W1=Y,v^hSqDB& p" =f0TefyarMh!hU,<3[wnE2xeR)1}lktZFKY|PRL6 >JF 2͐)VZ!z'þB`gۚl!pSċbI49jzv׿Iqc&We(IH' Jy;,*j[:>L )Ri @T'vax{RԣROAvmG]Eݩc/cs4]Aܜ)PjS÷z]O0CG9@!VA./c\8X%B̓6Bfi Vf<٠EIWBD"*e[߽>zʋp$ qlίkr,AHE4CB8~d`FQȆH;`qjAI8J$)w2)B8pbPC ˜|Hv>$˫̞۴0bElR$4oNtyh;I\/ٗ:^dQsr/Ā~X UNq0_@DYP`\`=.Lio0Tl30eq+Xj\uNC`mԷq~uy]. MR3mׯOhV(Kܥ[\|2/a1$*[j Cu9%)Q4 ¹7Wx^%jFI gZX.Pm,&)(ڭ \w9{ rwպnTGdYZ`*\a)mp}?|]z{7w%>q?QR2{zC#Hn5<}nX6ۍ&>zw{;>ZR5v #ԅkMigêTBmDR:buzy>̂7^Id9 m+Zm,\ry5K4n&t5y~Ѥ17w$]S?4J4ۻQot2[ZcJ %i qOmvۛW:ON|\Y32 n2X_~ hT@/ϮV7̶ ! *(R T(3WTo{NO0UѾgOe$gh›yzߞ2P8 paI|TKmCZV)闯|$FqQ'>r,gjuZNQ*Hd' HƑI)WUՌzMeը{rծrESbQZb# ?w;bJq f̈́3Vː]8U U"'~|CY4q'fygiR"&~bWmȬ"D=Ս] .J)P Z8:ua&'lxP`FL2ӹ aR77kuݰFW]rG8oRU"1ih4~ݻ 6DrؒRt0]-$Mq|?Sl8kA%y0DٝC44?㈅ ouw;xx?gu*j\iTˊ=dgv.1g^<{^m3z_PDAoP7&Agx۟2 G@?kg&y,wR|JНu6 bJ",=dRS!Ej3"ڬrif\+=DOEȑZem~`p=k7I>2|V|zd o |P [,Ac TAeXZkw-4h{H^nQp< \2!/@No>d6-[:i9Ƕ0s|!Jܐ MO5QV%R ![o%>eMoo b~'d'K匑X22>VKV6zSSxJi{IQ$*WFS{cx[ U2M'bin|};BeTF$+F)`Ax*Hm\F"xL?|~:Y$ ηΑaK#CHDB!k ,l)F8Adžs@gwb@;*DW7_y(z7]k g\m= Xv-i]}0U0ȣIǀ搷|b ThXHv2 p2Ru a 䎻|v/92浮FyLhŬȲG32+:BJ(&"E&1I5C'NRi0'Đ)#ǿ? tIyAX*rfvG$1Ŋ"-FmpVFJ$*Bb1BxyBOMS='~SV*a 5z+k06' *^ޜ;\K`:Krg]QݹڒІG"!u{Π@I<_2c^]*/ZlQ b3BiXX/"kwz~"s$ƣ:c-0bAȗV@~ Y>NcB?&M2ݩӱuYd:W `nZzKwIiy9eZ?O `)Ƴ}qMkls$ "U&o8s=EϞ?ot G'_B&YGϙ\7g+e=C!R"qA4/oN:Qk[mL??i+-WP1Kznc>(+! 񰧅6 BdRN#xmOq_G(QWDF9h;C~2o/v%"ݹĺ s\]_^9{F=Ҍ(;fK?g`!{gٝ"f:m?t si>bD#yT/X$"//LF-(hmf9ptmFVȁ,w1P-А[L!ApI{`)dn6,<@Fq *"0QmֺͶTZ̑89z!rCl|$(R~aH; @ymq7MqI)ɖ,y:7Nܴ(P~jRHb[lm$n8w>(t5 #w#G' dlJ8SRJNa(nLBir)εF5t 01!i&mf{L=w1}zѺ 1a8r8Z -{ 6HW[,5*A=Z5IM@4<^~bG`ŒTY9a!X32m&Lncx;Qfh 4(E--.Y'ЉIέiб!?d9wUP dEVLF$B0+bQ99* 1)stmux>FvPhZ[,:7:MِVEcyb`r6ͶN+e8}SGPEʪRZW^ݺUzǏfyeL *NMsF{' nKeeN 8z9X4;j@ 6gc:%1&n_ ?O#@ 6^\ϲ单>޹8׊,T4i߆v_lnm|pȅ#_1KVwUeUSAگ*v2 $VX+,GD8,ɩT/dVS, Ź2HsvPQsOG;n\43B ʩq G^^К޵"CD{ڿZ0˥~ <~Ҭ Zv 0< 0D6L!nl{8KIY>?.nryETliuV`8)P^_5@ǹ9H/E id'Θrf ))??@Z p2v@>$uP"?t6oۖ6y Rii G ݺ׻ љ.mFaXz_B(نL u4dI0 XemϹw99鷓8MH(zPԝ<s}{Шmc'[Teor)E0|2ȍo_M{h{ݽ1+b}\eD&N3$ff-A]||IyW69L%W=Џ0$I= SP drT9+qVfQ=>o:}nl>ݙn!WnghIEɂ]QS&0\͑@B3(xf{@RlYmG1E$‹_hT͙9I LZ҄m6A-%2>~2Z1ן0vck4dz͝0g} `p >n]ЍYpg/PSnJRW.m{8ty Eo;=CQ7_lomQULM \$Q07Zy5" nN3"R0=@3x|?ḾY5]?^ Iß |r76} t<_BQJj;G-) cxYղ4g$|]q[2w Ç%noF?3)+Нw@4mKEy) abtk}+W0"?uPkJlV?p.L}{%`7*CYUC v&^QV -PYp$2i$A+_OϿ}zp<e*k(CMQи3z'p $`4)}- /K0KLN,( ^gͬFZُ6]mPӋr m)RU6pK3 je/Lh2S$Wcuh7]]`v'+:XfIZ~k C(`iy.8'BD[W͸*Jr(g2V? 9sGWUpGrEW؊gA|c@QB B ̥*Ut-uWJk뛡c`0 &T_m# s/-eaYv-7ݴ舓ڿHqlq"k$EJ(Q޻g{ǿo5͆+%h*; ʐJY I$"m6vt=q;Eq}xu|c9 m1<@c5cLp,˅papۮ7զ8Ӻ[V(`kKʃN~o/.*j*$A-Pqu)bT* qLVnMy^YbL:ʃbB$T {m}GQ,kT5I19A3t>O̅ɳ zoc JRۮ"o[C6LdQn;{;왋opkfê99~NL!Wz3$3v\kF_}TR4 ֈd1f-0(LB:{uѴ:>"-%EyM>3C;5\7bV-s2g;l8$q YU*;ֻ7!@uW `T[L.:8^ =}>Ie4 B!ʡGuB;źlM=>f8BR(gL*!&V _IR4Fd-[+Ib>-27dt2h9SK,K* @ymQ[HEÒg+A-O/@SM[8iQ#X{R8Eq/>_p\;/.jrad(jLªAL\\!0n z2k!<3T܅e0Sݷ~e@H pIB;PD#w=S5<ׇtmW wxT.h ,KZ*gx$QU5$ &=OdS^GU`*XF(Jn&D?p֎*b߽P(|:7|T?MfhXCS]xbj"R<_ע4e)!-C`U׶1 LUlmþw> ;R 犮B2k01xH+&Js. p(C1yNnuyC񕫥iYT 2`f~H߭Bx8}vPҙv33'kgP)r4I&JO@{enV4\4Ӈn10VkL%,x:D"'ﵱ~a^8|}fT+lu=- 3XBJH @^䋍\bQЬm۰ͧlRZy"qTwǟ&ocXN&yq7 DdDA=:IswEi41I$ǤRp^gҶ fU2W]jzM82LPaEKl P1۵q ):Cl2~y ^R:ϯ4 ?}~-TsX bRZeu| ,wg6UR~&/[ۻۇG^g2K\X4@PɋY+`4wj۱U*DV.4_@4f d(8|=uPWijEXmQ") Po7B:KKP<u;9`(F3 DQtB*eEt՘0lZF=|j)L7ʹjikJ$s *1[m!xȲY TEfW8`\=.Opw||VkBâ~Qey 3CQ yg.d8^yrqj:ƸpKr2QnއO}ף%3kB, d4-d8AQjw}n,?j.yr<_)IkA|S~B=:bvg7﷯ۏ=޸I1vw.ϦPHPBIsOWdkaIL8$vfk'/NۅVъ< Ly[N1/hs//gcjro^C]0%I*?cGZ+$Nw+9CdK͒T3(%sj 5ӗ 0e0ILePvaG#!Fa/|?rYo\\^TWgb2p:DOԊ43f %p]͋aj#Cb('8$_ϵu0N[ 獇|!AdmgASjR 3:rmU x4G,Ε9i:|z"xɲNO͵1H\.ڍfZr!ٴ[Q*$5nZ )JFrTʕn{{{'WHutp{s3N$ rqz,t ,Z<> | PW0 /jP'Z zxevy30LTVX h$B{(fFT2noAsEafyoә$d4خvDWfq=0(# 4[e1>^} †1 MSJ:ڑi3A`/Hp횅8W\ӷUF+2P/@<~ԋqPj(6BhW^[Fa@4Ɂ.'F\hn<)yF +r,<YvМ`,C76"NHGmӳ٭;n>Kڵ`͝9DWo>O^yFӹ58!YZ?jB(DđiJ+,v:|NrdHTHBFϏï_4jq}#lU>v?]&U-[ɿ;8… dBΤgvJ_i}\Ѹ۸'xG}LN\phZi:1YFgb- `iİ\l<|G"`1P_-9*m]kՔ&mfBIWlLb/?[d3ٳq)_%V.eDi L*6x?ڶ}ea;9\>&X })`IULN/kB az.4==ZƕIW8A/l R Є]cQ8欅=MIfak wxca9@{ul0eH]Ujy (Ca+ Eۛ( By||z\.`EXb!fB !#u#/m]0,!R(FI6}kཊ$ }4R{.l1 P/n Fd+& RlHpa9"3kvHN{:\5PKEtĖ 5?eâ$s=r*%|!G'<D܆Ho>[`$D,"kb nvXCct0l,Ļͧ؁t&1LU|fHppo;NJIvÓѮ^t j뛷*H(c5ꭣrEBc|x<@;d6Y`eus[m{ۻB1<_('sv&,y,&@C*F-fK@Ke ^4xp&Zim9``~x:ŗΣxWwC |r,քZ"+>"z(cy:_nb+Y XT,I,74%r4ȊL҄Q^?(E8|Sx FWڜC.)8Leㇿ< fTm y~qQUP&2ol=tms;껶Տ/^>49_,@ZV[ H Hfn)㢾]@/Eṡ/kWFuf>b%zzx 3B\HPDH]Tݭ#=nCnsLrz8h^(q8MP9cJ,x=F|Q֡JǫXnS& 1^#-е#u˥ b25$2o1[ q>lJўO0\8ʼn z/+Gtn\)ܥ ,:_aklO=`"\?@1YBK* "?*GE&6t ɳ~SKb7CSwki)MRʺ}x?rgmRɺwzOԍcuy I7|bNR㷳[yksb6?t րZd<](يN*sK"o+ Qb ! }0jՏݟ6 癶m8z*Iim!(XJn'7_AF")kÐ+s1suӊl;?w3mL"ptfi[QGBڐ@Hf3`gcwxL~~4yjLi8vlc`6!Ђ$^ssn\<`dOH")4FA) QHzPz`E1[,+r@X,-4]182eV]DarY؎]g]y9@+FY5sG*֪Ux4Ŧiaзkjv+np ^KT^fCv ?=Ǐ_B3D`_/}paqJ9C {jh:YNVm6SF Pڃ79 9SnT8v=ZP\jb5C{GDZk_U]mߑҢ<{ IB+]y^h2.\bsoA]ʲѪGHڣ6ۦI?؎`#ۣ#t"Ti|/=ȵƍa}5I3Ty6T1ɠ$ 2Px?ݶ]]UU v{qo6C, IlHċ%(N&Y.NdLGcљ?:s9+GMU*!b?NNR8G6Y OQ$-b\6-X ӀPHY2oЕR9)"xQj{;o?`NqZi*CBưHk ab l؁X0=TSIbA (:Ӽ ys]vԷ?u]'"J6׺l0wΐYp$I?=NGd_,e>o: \7QԬ4 b37H|<PIVK]6?p?8洭(|"!$$bc x'ii3>v8}H,nڱbc0&6zx|[W韒h*Α,tt -7)$΋;f^$͵!nH6L{ Jk6t٪v E,S}~ FY ܁xZ'JN@\Cuh+Hv6f}¤ h1gX@tkWRD\I,bb( av&lp<qr`9SWΚ3T 3[[7VdX8PAIey3mP]-nO͖{Aܩj%CT|yIaZ=Pv`D1I ed"_:wۆiV rPXh]e$ X/̹Ӏuhكttf[njKC@y@~1#nGyd[uzz'jcx7Q 0LBׁ8Rn/ >t[|FD2K_,ms^3֪l-$gzjK$"°lS&!nm<5NPp8tbˑHءnݬYŀ]m{Z@zZͧRq֚5&΢>Rf֮[ΰY$AVʀ(!3;,ц梧;f˫y7t0 -@]S7 c ˳Qo'i -$x۴lo|:n6!2|˙9ʆd Llm_ 8|gQW-G9ɐҰg YU=GA$d:&E/4VۗQװ ` '7JHY*@S۹~i´ݚT.ӅX>?>cř^,Ui3mۄ;lφsVL#B8 '^b4_1N(8$Lٻ{b +1L }߭r8+0zf*鲽)4t% &N@UT5\ۂ 2Ĉ5 {۷,@ +J^1+tvG1oƸ;-ɫed)o:1ܽaiYo˷*J t~t:iLxĎ ]F}ѽ1n Eb&B K«t1 K Ȇ~ښao޿ m?tPn״ ]\4cBU]ʝ vjnsך NZtF$ ./[Y0Gi^W/ vOI.Ea檭0L*==;ƫg9=o(k,ϔJ-SC @5U8[w7zw/sc+t-e!v \,ĤJ 4?>4Ν^6-,UA@g[M$<OhPev8cx^v,<|L^~_]6&)Or88P. L+V7M,KgEq&PZtj}=ک;OB𰸒nT[|'i,Ryx^^XQi1Xt L+ חm#4l$M1,=gdb[fJ -x4Pnnlg1=~ARgۅZm9۳)[<S]pCLxmo13qI&ASx #2C +E\⛯O4(eYۼ(H=QCڳ=ec1Һiq0S; N-\*j'/rb^X@ xڃBZ8yjC9y8@g15bLe?0%0\qt$N~gi.q20lɶC?]ݍ'Z˙ٗ"'n7a$0\^x1CPޞrMWOgS,Pk#{.-PyR~2ꍖNɓgrT)O,5_Y"ƿ-C[T ,hX6GwL U5EI貉}Wc&K놁(RAPg iC%;=dbB`2ѨPu.qHA< K2R?24e3OH> u yj2`wq}$`f8?Cw%tl/}:/4@(;|vDQ= ǎZӭs$IKuN%0YN!XI yJ"0CBHWrl&7wnh+$d|\!+ vioGA\ -Pe2!c7߬!]bj"24ۿw,Ղ=8$B ԚLJ|B߲tHhe.2@%(ͦ<UP"/PsLpp.ԫZ?8:߶(SERDQ{˲' yiiZ1- 4 vzȲĽD+~$@s~^uyF#-aC" cpB;D#~N`X_*+Ќ"x>ievHPZE2~wx^~Mҧ-LץJ,e!'Sv7mvcdIXN8 u|g_I`UhKNkSoօ'2 5#3!'ɉk$r}gуO]N>4:w}a^Y ɜsALTv;YO$ `VŴW˗_8::Z٪۹I8G v횦t/7XJ% 趃l5 `׏p<PcلM R~[Kȶ?eR*Wʣm d[vݻ_#.Q$%mgj!g CW?XW:b0EVDilqn}ٲ}O/~ۍ b/nhND@ұ$P`BYRIm6S<*5y"Š8g](oVKR$Qz_~L0}B@uX䰓GG][ZQbB]a"`PIXV >΍PԌĐ5`Jz+4PSS`hԖYn^Sõ𼯦¦I@E%E qQB=f+libZx[_>a{ Xy}xվԴ6`Q )+Y OfrV. 4,p0 <5td/F㉳-rP'|4@vtaHi&fhAN3`/ F(VW2λao5g6涕VVϯ\_XrkmFwf Ƀ} 57 %YȁA86ΰ{I'g~9RbasjsJ]c8N:s?~OЀIn]'@Zs;2#Ӱ#0 \ XbYU׃>EW"b0L*.OrDl !VaBz9B2'o=-I67NOmN3p}2k `49<~{ҿX._+F:jNCE1*pIo쮭znAIqv{]4L}ޝ_-"F\H9nSH<]&(JKiw8ܽu9[1lC{w2N,7Viu*Z {VoI2$ $6_5z(8( ljxb;qd2+)N*T_[Z T(-tRdI&'޷׽W=sd2VO vu I4ҭ-2Dt& ;B.ousl~EoACLкT@QL;x{阁[+$N&yDhZ8`ʻ2XB7"h<_ql6*dyj͚j9!QT.ʭvS YIb`습n,RB.OHV Y:O\a1us2/ /wKƚظH^*o<*C7Oo۾sy8еYb@l={y)anl 6{0GS㶿xiԑ!; K7,^]ӷy-m'%?OLm AvwЬLݝ.VF<7%`֕y^uQ Y7<<~/z?1>Pl:.jE!RA1QźTċq,Pp_\ryrNѤ9Z5K.M{=S &=>h͛a"cjm< ſ~}?h+ߞNFoKO'YbU!UgF|h%"N~[ZLy`vOՐ?~^ n[E!|wsf %ܺ.X;3zWr%|,;\)?|{FNȦ#Ȥd89% _C[8s&Ak%m\Š-9[n@?DRT$ IXv6aY*CjMM$SMFX|嵓|j:>A!H' UD}]ӟ_{Eor=3'߂rf'8&|,dܜ!_ȫepNʂԼ`HwoBH R*q,vޏo?tNb0ET2盋qw$2/]]ڝXWY8ҷ]$Y/} X,Dh0OYs4zJƠ7."Cprsmx~}kڟxV.3R?Q.mUAͥv( (#x~0 d=*c vH&O16 Da0-:f**yܛXiQ29č2ܹ괺m^R]H ӑ4J'`1_+ µZ(ngY&l bڋߍ`GN`@GXka[a$±DBwy}t,qBٲ-oGT)]>~pV” *QGC! Qnn&Dp:ńNtJhf;.,n{Z cyv.,fiagWEX{d2Efȍ0 )a1bcj ""2W'?zʷD"\{ş@O)Gm'J_9(1ܼ ?m߯fFJUA( HAɃB7/W-dG_ǨgżF7cȘcCr\]J9`p, Ύ%, ]ҹ&=%,ZYǼ|CPAeN똇JQY+8غl4]هpEv"Vͺ&f{{Tr+ē2mVX A4܃WFN͋j0P"KĂ(Z_ ޠ?yoɶ[v2eÜx4Y̴lN&=IcLzQx Ð"rò!$`;*KlwVwI4}:X|V*Ԟ?)NX|$}z=[),"0w{~)j`l+* (\^|  s2S9'44ŐYRV p ޣ٫Gn[np=#_r Gѻv:\27_Md՚ݓQUǑz]Lͤ l!p0|+ I<,о*7NҌC/ 1QJlx]V@P!vAE(BGQ~VܨJin{ۧ@=ڍhsk6)8sUZ\W L@{#qmL24œw|٩vs<Ǘ`2 F!҈J6x  0R8i[Pti[aWR !!jԴݤv_0i_n&M>LMU/K c0_16``/|y<1~"`F oZ7`]U,W+,'p>#`bVnsN#(j49S}|&RV<><_,W*B-ޟokgAC*A]m{PbuYR2` ϱ5t|jH%na*)b#1z\!rx7F ptîN.gF`ؑ },to^t1QmqHSNa aʡZ7VwlE}բtY96cɔ0Q{>lA/WfHP aʓzsB]C3pi6Wlow*!?XG*kֿEϧI86,``.okDQmyTYd5)RE d]w=jM˛{Ji6)E~.2y?0nPsz~ O?U42M̜hy:hJ^vΊT M+ x˗}$0-k KxӉØi-[櫐Q2A13|\B`U`[1+,PM\TE^6a{+d {nzYnrb-7Ovﺠx{쀶5X(>UX2E߽ yŋ3(Y{Bg?k\\8%_\5JbrKUEK4{Z8hCh-ıbsI)4TϬPe^:"ga4{?Dq,¼T(՜ [^9IA lx{0w$iue/l4Ў. 5Edb1[0 r=PJBL]"zDHDV/CXnb`ѝD=}}v?'~R* jMB[,C,$0Tj$"|X4j4yG':Pٞ^"M8vMWdNfrwjDP[%ھ[ۛ'#14UzoV8>C c<= Կ`!BsWg@\_/Gq_0ۀ/BBPMZ۩/ævkҤiBCBՀ`c0c/p=K˹9p+_G=gzמ?zdWկy1-Qr(GKO{^ :!\Qd+B8&n|i l'w,y,\'Yv0D 㕃G:7SXp fؒXLI83t,K\gztJFI2sF^$lrAtNIz' d߮euX??|Oxb) 8(7_-5SLzzjP$g~?gR]JۇPFB0YkYAOp1~ YO U T>;>_ @ymEa8%)kr})SpzW0&a٭JS?ǚߜEc(3?' Q0|^4bt_J sdڊpN]kV[_hL̨5d^ H@EbDaR#P*<1&2KFRS},ʇ9 C3,H }2H0C3 ;68GgD'tD #XMOSPoZ3m4{84 Rz1Kh(`FA|N碬3t8 RsyisYZwNœSC8f]0+l6OwX4\NmvGYp^fG W,d$U=<Őrsl{okF+U1L>7voV'C [  EDy%%%}DV'B-8 Y3v5`xϟ@|W;?r_δM3€@ B -$o82i~Y&[X -Xz5˽9 qLnn 8f{?_4uԃ9>~f\鮐KQ% vs٢Հy"'OP Uj-1;肔S>\tM_:\&^C7%gN3Lt,j|^ θ6K}(^B) J۫f"RG|4{{Ǐv-zc "^i~eZt~6_XyW23\٘GG'LzL?Hfz{+TTRQJ>ܱ~0niD<G0h`#n,À8nF68thp@>ލeM2F,C;JھCZXf9v%6r7G6{|Q4pJx4X / Oǽao"E1Z<`Z,KHBԟdHds?39IH^-oZ9ڤdNR :(NfBN'6KKMGqz/W;B5&vdBB4wtSU!P ᨔKH$$h@ze M.3_5IYā6Ti!o0YnVv]Utm${f~GMc3R.#:ȀYv})T΃\>$av;6F./E۶aR\8Xv,g7Ik A6qƖT%S-Q8y dyT)>~|>QtRvr)IrB˳l|L JݚLΠtQ0(Fԏ=y!A%͝9}`H7lJ4 ]H57vb(0놦(i00*JH[0כb]V1i,!ǚ,liM¤H9FL]Ӛ>`DNjr_:W=G>1|.=f 5@>+ @ DzR"wb\vbgVɐ떋;f`@S$8*ClCTZ% JKPdMʥJwb34c|Y6fYۮ(["< &`SG ʧ ҕDwr): &jc*gZ44bE-AlMSp^>)n7 <I!$}+tB"m$,WVb .viFF/Pj@QM&j=3}+KonlWBݛ:B /vNOEXk8MG/ @V ;'8+NSr UQiN8؍x wBmřOK*D=@*_TJ :b_؋-ۅrlךB*gxVu+_٩$ IӫRTPlUU_\+j:3ǓvH'I`?[0g/]Qnd/;ښ*+cYeA`Xpnfł8^Br[!R+tjF[ 9 )$B0;hl: \[w O>I֎/9+?dШh'z׺m?3]9 XTUl!jBvn$P@I|zWO2S/"?~؋&hB(.%34ORR1b&mV_-%q,E;) ɑ>_kZL&$C]\L.E\]j}j Qw*!f )rluI(6涊0 ӥSԎ\d9Nsfp+~#`BI&NqbXV=dη<;w?| m>_Lb$ *)j>H`>ٰ\N۱n>|58!6g9:BfAKCIX?EрK|eұN pjh[ odj;F;MEZC'|v."&!8&]Oo6#$\ڋtC=xtvs?g'|?k X6  HU ݶI k8v7RW_?nr5lvfaAYDaxZɕs_JPI'g[`3&ga:'G%=µ|q5Pvog_|l a"j1`GM6 Q`:GQIQ׸dQgON! + AR/5=:8YrkXjGQVymn"upAKNg=:yt[ZЮKRmC1Z Bf~hMf`{t;G'jh-|6Pʵ,'5|VSz_ym;,MnX?* -Q GsL<=|J .֧OϻVcrȄ2#8L,}s2Ô Ԏ'c 8BM ccsBߑOq\7ן}*Dߟ5a ;{xw턐I*բ\$Hqu˿2l*H"@!+.=r}qwo+I(gAhD_9ޟO4:=?9IqܙU)((-k.E!$bn.GX $Vm")C`o\E0M>8Oj +],0( /Dz,=<ٱ9N3BEVD"8.87{ |ZjHDFg&h4X9+!œl7ǏL~7 t#X~:w}0|K*A cRtw`g׎rqI$xVll l2F%-LA0x" J(siNL$! $q6 ?(:紭( -HB@2b7č83tؿiL;66ٱWz۝9|Gst.ah#(c< C-CKG GsTJHܮm 1W/l>% *X ZMwṶ۽K `$*ZAtV~ZIJ|"UL w8w s|l}l!>b=p'#<>ِ-J@׽;kWN:jTƹnǫJR6~Wn~?~u@'Jnt16,V 0q0ٙ86lІI?(j8 pV+- 5sl5c2JuFld 42>8b<\}DEQ2qPen~Q6$QԋsNO~|I޽{?zmZu- 88;hQ<"Bȕs*:],lÙP4dMґ[NN^ܸI65"F3 `% !UCOw;y2Y1!#0OREEMF,kj).Zk֚P?8G }EWe @R4l6ȯD#? ^MJþt!GR%@ 8Eoۧ?|~Go^Jyh=o8MFA$mbl`` `㺉Vf4ZP8{z=T)ݸ^u'т`xXfjEa)( DM p?ZhJ35p/dri0V'OH*$Ei <]Zԏ6]=5ۅ|°hԟkt1 tn&-I %r+ R~>_M@IUGlxf~3yYHxDr ǟ~=*Frq5CfK5(KjT>F`:_|K pd+KQcxk>gBDaA DGvx3!siDqPhX,Dq'8wt,>i,T:Uu]S7*d3Qp|'tcغnLY(f t&=V(2I0|]|U`p8HP.&CPPaAMS4>;8vV\2ɰf* &ȩErLXxT/߹<Y.yèo͜xL2Z-3]<i=%*T`ˋki)hҺΩ1_﹫ c,)22p"r5{شvevP}wֻ!"Zֹ \,!0izY״H gJtzî#ފbR,y,3T7t~”z3!|VB3Tu(/Z^-TQڋPp.i[aK /ĎIӦ3Lc;ԋ6iR7ԩ8@$~hsHW}~w}ݕt.;hn6MЁDZ^j@Dn*=֬(#ݜCbaa8zuuS<ǚn 61g6Q\ڭ͏9<)^Nk @QoVTLdv&3D<۱Z B-we;> V+G(z^^~B!#,lyH?޳My 俾A8ՒqmIGьbH̏p\ +0r=Oiק:)6\gi8}rSh#TBVCpQ_{xj[L *Y8!%G9rvwERYcEuY]1Y3sv)AqHŖ6g͞4 2A@٬sQ 6A=v\}[,LrsXBiX裹> NmfQnF5USS8 ]Q 'OO_XOWsAу,g hS|j/׺zeS$0#1rts;]HQ֬" tL"-c1KV' 5b({ rxv)]Ol;<;" ^CYiBRc}@6.z;ζvTcj{:Q>txwz*nSUd)hte9?I$ n).sFd2V5mJSt((@<{tțם|n/HEfOuZ %^pRQ, T 6 `p$ ֻ 8h }/ ~qqҁi>x{`Gk:tIE) ˟[ttThvQ&l.ói 3KGG{uGۦ`HDx0F,DX՜%5fQCcfkp74; ?TN,!gXlŒ1Gٺd2 9xVz{m 7]d1M!w~:i~zA bR9??ϧϞx4k"Ywm٢zZT2^ޮJKXוꭝ\k'/G''V`CQS7rL$R'DBTk''tq < 8 bdsL],j}3 W6W#40aTKe!pDoW]mj%Fl}F(,;:Qdd;#D}u^^Q, 6?WWR_ó|7es bZ$٠i2%vygyUz {@ @]c©x-lQlnAJ"8|"x5*Ըz$iGHӯqww$~@TJVw5<sU_~/!}$oL/gN^y U'R8J89 O&ti ! i$䧿?O/^=??!𶚮 5m">V+UZjd{,8KeTY!|#˭V\ٿot1kg30z]/bg׋X 7jnϰ|N 80{c#J}Bݬs/ ն_!k.@9@eM5GU-D ix'ǹ*e Oyۍ }(chL'Z˓c!£ˋuC3!Ʌ4򵏆|m/xH spޜɋp6n2S>Ee zmc<D=(Ƌ:KK*dum=ϴJ:[M?}Xlk!M}'>s+#Q,(ř efb|>ӻ>7atba/Ptf?j[Q66x766mf4$m<*nJLd2[YaWxss1s'ώ(^:@[k8~$Jc Z1 \v?sW|fvty;ݑ1C%}u/gZT qgԔK ep(G  C4RBVhmLdѻxh@S#˅}fDYҁ4[ wvvִ4IGc o9x8i|ҳmf8^ F =$ՎI4gSی2U₮@AV1+YL0 (A>"qvN-Jc6 7nnӅt'jiYZTYl!҆=cZ, QyG$MoV[ 7r3,U*TɥcqLJΧ1!aBZ6WR[)<'Eq禃lbH-ϧwɒQ/J(R W[siJJOID_]|mܴxQ0KN}`$N/`*"12~HMYAWعzss<tBpn=4A?>Ԯ/6K7}Q8Wf8m-bn쫹 ɒPCҪvߎz>XAp#j#$Do&s8x4zX-P$]נB@Wq3)6YʢTmP}3 0tǩwޞ\Tl&NޤG,5, b]RZX cY˔py[)T%(~j))XOy{Cm=Ă0 5䧙7FbDwʚ|_^<z:t:.3pN7*$fekJ 8X*<RQAEUF#n͞9rq,˰~Ti+:F7pXSo!1 ڨjMݸ1>|h1^VcҼҶt"({v.'عMĕDI$E(TkUU Qo:w@y@]'qV}q:BXmijsw1^#D!*F1aY eBRDV`TGs$6kS_ ޚ *q]qHzsOi'B|_~ E ;6:ɗ#㪿0NI4brR)'5귟#d>^(^dLxav,ԓ4xLw*,*2xV@2MݽVEh-]WYO$E!yӱuaJ ܎Ov60MEVx%KYhZ)PmRĉR2EQaΜw1gO5wfð8෷v޽{X($\z'~xLYuC! h/ErI.KWR30 Z@B^(<.e l"5g:mAH?M[38 Ήj>b↨Osy~ Aw 7;b <~`R#%]aGw7 k/a~2L `s9ݻu Tv0N ~68chf*3x<I;[jRmۯ+Ƨj&>yB>_o-K1Փ&lm?\i_LN y1$s.:8.'8#Q<(nt G9y&8rA g{Q)ˋ}`iR>p:&ߪ,df4ޕ/ ݥMO FŎx*7KMkVIov I E H|ch1#y#%YsV6H6:NL;m/Ml70;hC}Uޙs>;-bskFVŊڬ4rc0fvSyWݛgo޾A"P!.RĎ4\<etf"P"KRRٟpNB UTós](6O\bHE{q2g)d޷׋` w@a,3Wk}nn ~bd>䩊S8>˲iwZȮ&2ɵBN&0ca#=2G[`Qðl9 ~@pӚ= F'(̐ 6"O 43F'P_7y+M']Nn&YplU)ȧUu,qv o`K72`f0SI RX(J97OW? u(ZHr="mm5R,1ߟo,@I K0ճNq 5[ɤQ$Qi8 ;"7Ž lI{. %ʍ͋ˇr#  vN8+v[sC&VVbG'쥎ǩ :,@e[6FoG9n&EĪp?,nǶY(*+Q1xxz|M]\| WB`LjL#kj™z-r`a28mNEk8Lm1³܇ru;gՖܝN% x ű6cw7aqBr uY) mOj(=ikb1C*?>^o&-ug>:O@%\<;<5ݳ]BqW\Sd4&ŰJc0*:F#RS 0rBz=sbeKǧ O],>˱ ܪ|`:#(Ydp^… JЉ@*Rz@^{Wǟ~)2VbeZUJKByEd`(W/ee;?Wkd6IVz5&T4%^HSaKQژ(HЏ8|r:|F8 EP0J%v Y# y6 F5-^,(E~ҔoD>2aA:sg\@Bv7olDsVƅ@\ q1Sgtt:}c>L&u6b[ ]@B=/s7snWA{ZPqp3̊++EJ*"LT5DM^ȕPJQ|h#H O)#mg)Ty04M簌3H6]VX 0J%Uӯo4jsXnS\p2!~"9>QǾ="aU{6_< 9.+ "HXH3fe Cf)Wvҙ9/}`xZ#\,ٞ}rE1 >SJf3fh&8\aFrEb۞f;NɱsJ,_Է6<޺.7XO$).{lȵjzvqATiU+]HRŲc%R '0T#hm]u2Ov`у]H,E:qǥj1)_ݝd﵇_Lkיy~呢kY,;>VA,`XГa?Ӳ\f&'Xi7qk޳UGGM Sj2tc?G$HEi7T&`,zWCg:#45\wL/|EJX)VFay*EmoDslvy 9l 8X++Fo@o92 2)$< bYֆm$VL5+FOkB6M\@z)w*_2:CVWOx@۳d,h~ M`lРlh 9'ݕ$$Js&nZRNc R rH#S,E+CS{tZN򞶢9JYˋ Rnq5_?KB_lm(w?K4bHl}~~t}yrI h{ ~ۧTլCO/@-?bi:eYd ЀiJiUY]_\\Ou,j\Ygi~q}^x}?I^yQq&L/b'A3r pV`i FQ` $Y|\XKЕqm?8y/W{6@¶9 Z'cer[j5Rœ&,N158v}x0 T皽DpZY>fn=z$ Ak-F.O6h{C<{ Ul\*%H\UB슼L?NV62ۥ072SHy)SS/V>8$:vdΜHB\P6nCUqBSR&ōgmLkdT}W{)Rd|, 4F]U< 95X_!BS2tpTԖ 2ݔdn E Uh;-At R$)pԙ^wjcfV 8ykpM5l-Hn&f'!0Up1loDBS[5#uR堺 D\gM3b,ϣޗLU>{riW&iQdJX`t-L-Wb,I/z#%B;rW E=s #4l"`j.a X*viڨa dZ ={:eV׫?o>M30<4d2flT7t (,`=?yy A{ۭ[E~W1x-:5O3B4IM Ne<+<_̶^j:􎄰إٳ8$Ҝ(λ WypŐ0tCfR$m&ꚞ*bv۶0Lq_D-ՔےǎIE'iohҢW,$mT j$۲$[ "px339$}ՑT>?NHtGY(t[U> {+h8߯0 *\e<N:mE͉DbTdFo By!YQ-d4&"\" ˹V+j*N&޹fCw>͓S.վ-)W x3 KHsGf`ssܢPvR(>6~:2 ?^0{|IҚ-{4C1#Wa (vsa hastoyU!;(j [O'xO|qBPeRp@.,G6Cs\%9\Hj}k8*4=j7o NT$asC865#~&,5eJ³L!WqmR܅Y2@"% e0 }1_'RȤ\JdLq.@!pfvތ泐BCm1H:1/Eޛq߁` !$-i$Rݤm_e_o4iL5jʽI 6 {kƆB0Eopr =CgKɔUY8)ơ?ð^^. i rfMi_~A8\ޜ|@'-G0iX_T[}útf=q@Ȟ?8f,Dj0B8 kRya=lT^==DğnFQAdw67jsv6PrNHLJd)[yD8LntZ$N|sӲAV R8O00ho p⚈r0]a*JDč: pfrK^XoH!T100G$X0}x:+Mo;V "^QƫUD*)ZK.WL. Xqre`Xd[GH(*r4J$XcQ7P w>ٓZW-Ez-3?>N5c|}puv޳6O ig8R '>QXoP> 2^S٢TI,(РSJIYRxnTd?Dp4g~ŝ㪸&˘xh u:з۠#0bPFy't~$HmDۑIU[-[s:HBmdAѾdo E'M8MEP-R).Cv ~KZiѐ /F3S0_|9+c.yima$Dv?`ȄGQ,Ȭs(!u.Ait4 ӧOZ("8ubhe2<0s/׀:G.gWx9\MɝV3!Q 2g %"QmG8FA+l ZE5dM;ǝ/A #~, p/<6 #co݂q:U?#Ҭ[C W՛,dܤ0:b+vvxpDxVe)H%Mx$gEK͍J{,`V}PwMT^){yaf|~9rVc^mn;h5t 'rcW?%1{uH$ nUuC]l!_b>ϧ.ڶaBUM̅[ͲYR5Yjȭ9?*fe/<&bDhyƒb+}W:ܬ2(^׿t/_n5%d0FXx5K,e5/ &WCqZ%) Rfݖ1ur:ΊغS=hY8Ļ(Cmm_{IqgSM4\3^ar|f0KPb 8gKvB+rwΣý*U&e,>̚I$$b(.P@/,Lz4L? (ŠtPH,:2XtI(sJoMڪaE`Uwt:.ñ7e[.,R<.`g1ĎfN;\ͅu䳧 ~z~Vea־&?#9{~ioYd^p٬t "'/0L " j*`$F7*JDYjorcrBp{.o}Dzvv~v8N gKq͚n)- 4Iޞ>.p>:\P(lVX p`r9%|'X9XTN`WCjZ$e?.(IX @*R Y/V'wϖEҨ*]t %i/ p1D"H\CvdQnl'Eޛq|`sq0HRf:MZU*Mڴ:պu-KPH0`1n^ޏpty~ϱ" HAԜ/@h4Q ^\)ys[Jd,# e 8wwRO\,%w(@v 24MsCbD2샥tW0;*̌FnPw_Ov+GG a2l"$o d\\m34PwϮCF.&|r*ͬ*Y:=[˕j_p{_I2zja+! ҍi1I ڪe: bFU:H_?}(JY1T+lq<=LaK^2$ HBTK,;XۇXgpᡋ'laمbW USs<O4j 1[ڀyVRׯfƱLU# 2v M Mtۤb/}!gf{T۝,LlAl'h:8K o L."\M!>"b9mNMAWǢ6ݮo -idO4؋jӵ;g\^us[4%NL" >?-3'|yKF)TEO 갮6ׯ3~Ipk[pGD.T(7tuGٝ8׶Z= ?_m-,fSK ~q(enN a@+逗(^ 9ChnЃtjuA8:W?,m/_QzʍO8-=:E)(.ePKE4Mq&btE_8KoD=ulI0qqF?AP٤hATNbh, P{7j o<-pk(#g={P߿wTWjgaͻ0|?o:k#B戝ru~tdcq͙=ZS gjM`\˓H4[?k;b",dk2m R&n'?qt>+d"#]}抍ۨ{4`n΢xke4~(=~WAI!he3;{`J>Hk 'BQ e* GBӸ2,C0M~Cft"s0۵T\k)|2EI@ H#1LtHq 4wP1zzoh \%ٵ輚۶(LtH,Z]%Ď$LQ,K,ٲ)^@@ws; џ^cuosٓTI@xvK7VwW|2(;5h2M)vhO>:>.Nʒ6#rkI5,xZ3{~Vκ*AuY:2<}wHMiXGGdAnzRgaenۺiiQ}z75' *R xjٵ&.&x/͊n*q CRhpcp1~kV.iy{Zn9 Nc5CA]F9o Q#bh:Ml׍/CLQKi˽vpy @5_Ʒ&}F`)51];LlemE|mN3h܉ b|B:OM`'2bEA&RG&}jYm&zw^X YR!X]bs<2 %TӜ'%f5jNR0 cb=1[K&Nc:K;}eP80:<8\(ibԬe(:l<Ӟt 6o'1, >>}x#:>BVHRo~|yx[ؾ{qy!h9CdۿVBX\*pymھ F!\+\ IA1 c(ތult:tVMʟ~ xe[$K]~<[]!0YRRE4moñӋr R,jѓ ybÒi٨2ps]Yj" ^J* ux=n,ͥ~Q9z_E $dFA$E"$<|s9Ǭoo_ˈFio7Lx]i9g(FMe,"~@emwKo=& w@ ; 4N@>Ą3sF؉ԝH D OQs6GO r=wPcDL4E BxcW̚ZNiuшFL/A(8bŇ9)NJ6°V:S1nb'q/~L[ z$6t:1 $fg>b?6:>{y}۾ş|i޽m`~t}G daЉ&+ 1)efFoF>UDG"}xF}+I&R~l 7fsrS$FV gzh:B":ok- M0 W|9yj3HiUK 5H>xBlV~7ah2XRL+r`Ӆ&k'խu?KUo}*/B*ɕjlUp<۶\v[0BX_oPO&S4"ҫbL Pp,.-,TPئdXV|}8n̜&H" Ph9T E y>tȈ)udyq {aqiB{& _AkW׭d"s-8RM0sS#I'x, u%-Y$-l__}<;Ld6иhL_~"DAK4ks)'S AȤ)V=ܓ5BؙyRLl"L/OgYer\ݙd8n31MuUh{s!/p$'# 9U.@sц]0bt{Z<}7m]|AHGdu zrt[ޞ~Kp4KEd(0@6*tT 7jͽLRMتoD(@RGQr@ IY6Mo !(9VMu 0B`2b%b8L 6 7v,F4mcP5\[qʡ?kGi8:Ƅ_ ,r>AcPtfi[Qm !!E`, 6؞8t2mfi_:δ>NԱ`@;{ι;O3W!mlw8)}? ( BEqT?~wc ɲ4IZeW&cyiNaM4E'œ~$3pJ71 iqq8>u,}P]ntiwxLMs0Y]vL]™ )kk-F9?z ,jU*a JB-p28Д#e@ Ɯ;i6ӹh 8GU?r=׿c/?Zĩ;X[[[5!I-w{ O| ;j)-G_/|!`|*HՒ5W<-;mFx|Eb:ח9+x@H$ve]6 c`ϲ5NJ$I5p=< Cϟ=Nޔ' mw=& 3.$H˅Rp%H@KR(D8[SQ+: ೮C y{e.Geh4fPxF9s9<HJaL)rlD26Hfeۺ˗$JRV+o_KpndWةΜyHm˴%)ae^s,޿$]YsVI;MLK{ǦNNq+1a@о}ӣf{#"vZEnl$Xv^%BI"SnurW2GvSlJh61^  HUDz2Rɨj-.K 0p[ ǣP*i0IY]o;ITWE8FXʉ=TXn4k=Ot{趾Y.Ve+2!'RV:$LF`RﵤaUt+i Lb.<3kkISVV'ӛw:k\uZG@=*[F -RqgWVHȲhҗ96(b˙ 1? sg{:$cT .SMhjFࡄ1FF>!?wgC {=2EXjfr++S&Um%hMOo"ES"Eat&MV4+n p 9ǂu}3geۥdvc˳`Ƅ|SW)pTЋʩz+qٛ&/._Vr70|:sgA簳&tzE^/XͶ s(knsNlMqR:+fy$2Ҍ4FE d$57n:BSXB-4|4FoXڛ~TTu8ɣQ ?]_Ag*}| ᚥj!ܟnT $}z:Cdluǟ dݸsJt \[$*bvGa ]iq/bƒώg}ȡFь/ nENQoArzqsW]F^k__ޮ7YkW4WE$.y7[Ԑo~(-dhZ'BM3%qc NRL:jXI4nC##!i^Xq<ò( i:I&Qfy&0 + 9Ń^\2G|Ukilj-ѓoYFg_8: |@(@ OqL&E~p{NgMbI`BgPJyg}KDU!l!3BZ`Xvnr C7Ht`؈OcGZ@~yqp h`Lݵzݣ[6˕rJzIQh+_,Zuuy|*inֶ颥4G"ɐ!LaZr ]׳,CӦeRY_o466HDR?}SMFyxp?W?{ߕC*zjNbB!Sܩ_oԓbBr|ު^7^)D!K'I! %Ket ?xabM|: jw>B"r40V`Ll`Gt/?[J4jnE?sxDK?u]s=\!6J0\"!J$h, H$ 0TMӧbʭ=r8gt2PWgWReyCV Wy`8O"{+q6&XcP+Rd&7dn\\#dt"gZKofX&<6NDwIKECnl7kju?Kp&8(F[ҢN^1wT%j47eY4ˮjUy wlri$\eB*K&:/Eg۶Ea"5ؒeGJ.)./"(vtQhVb5X@)JEW{ww@>~rqo`"Rh 2g!-V0mF? +-#x/WwL+Γj94&.,4G!8ԣjG"\VproS$̝]:dt2|(5.| xoը,!2!%Uur,̐YL䶌SH&ILw>{8|ұ lҳCR Ey+dAp87oU-Kݹ{[}ry>wWhH3CVn7z/T>k@g`l8+6Է1{jq 6!r@(xKv\ }- ۶R$p8`MbǣtC_KwB-,hFEy0BCPh~{O(Nt2$q $-R CH4 aÐ G\[J Iۺw 3/r 5.aJlYs~ga n!I;?54e8@8Yl3 SgdZʺF'I2KaW?f>jJ" ];ǀ>tv7Sg= xG1!H3H~fDpa}S!f孇a+( _lm# ĝ&J,Y޷Nl'hM C /CA6˛lɖ,(wq(}'83a1yv*Fn"́ef/{ C'$¨y?ku ĝ#`Fwm$ZMå$Ct`U[qۜ Ŝ<=.%ϛBYӸHY'tnS25m܍}辡DK'{ ,`6P(Y~pVken8c%FǛశ_ HDDX@|M3r~Z:xEԘHl3tBE3Z+rٺkE/.lyDhFzHa0!Z2?AC<4[]-7+[Nހ0(`Ս,i(C1X}DZi[VTQןM̩9 ($ @<%SEpݹ'XVJ$>>>sm;,8?Fvƍn;vQ 4M p4 6'Qĩ\Y0I\sl  ]2 hmŞڊTZ9>@`$( +^J\RRT5 v`"8le8Jw̵BpH-/Q2CQX߳a x2_auVaUZQ1ahZ ۞q8`u/rT}vnMM=h7[G|C "f @ѹ>5ja$ IuuNi;ӏo;mnW1" מ;A~7\kv{ D{DhL(g1X%r0qLx:iDއ.3 [L"FiTp$كm+if{(d9:rFzqy1? cDF(bT\)Ơ=b/ \@<ݡSAϳL$ɢ-Qw[S_{UVۡGIEYoDB@( W6Ͻ_.]ӱSb U j!V G:"(StC.kFsU3xMQdkdJ],pEcn wm)W2ͯ ŧUy(53|@SYD AJ{YFїQ}G6KhN._@hĎ-UV`0t YQ<Dx0BnD J\%EU @$aĬ@/P9ƂEў9N"N]Hkc mLt;.J%)X8.Z8KHqM<^DΫ( dEVt ?te(q!Ҷw /D䅜x1SfXe:˭-(}'AE $^嫭NEFGz1zj 4zP6۫&D BC2No »QÙ>0GNؕ^{z3M$`BEBZʝi̐TJ˛e*dfv^۵;oGlC[YP nQԛ~bt^bgWۯ<}ټ_ (AS }sc(bELl` vZ.h6ZCwMPr$rRWc}9+[ܖ6,t> $!$! >u&4q:3}&6I/ɐ:vm8@BGN:ttV_@6qI-}x[7^1wg‹R֡`۫:Q-t_}Hx]}jlϗw $~ʒ.!/FĶ6P1lII{iw w Fx FRc8m0s!N:hNr@P $el]?|bv3w{G8?.ah,zb57 }xre`tP.մƈF瓻7Zo04X8l{^hR~Q%ۚ&7ѷ=$J-B6K+L43X !J|+ ' v0 ZE EP4'$BF5pDfe.'UGLnqeMox9_#7.v/c`4fccThq-=}! I6ebt(8:; 5O瓱ebZkc":3IjXÉ$%%6hۅ傔tٟZӇ'j^JZ}DVam;c>y/e@"F<ӧ!VP + <`r X% 3<~ m+xVEIZ~^A؎g =D2,8'EJ*3J)0(hn@RR$urpl?%AI:oH*U;so`v)"]mҚc'0(z0šMBcdU0yۺn,glO:ڪu͜}r⾂2[+1zY5$E)sbEخ]S:N*j 3r M xLZ}gK*״!AD$졐a&͐1MrHSyB$^\Q,6M(XY#I,dI^#áշ _0&I ǩ;FX`Löuisp[΂_sfSGCPa$d`&kű-ݼtdlZE)K;@".^ytm/ EF=5@k|ʙL-$0AJM楫_F,t`l)|T!\iޚo߽}kPٕ,r8]u[F vL&S@uptQ~"e(W]UE2 {-nK`ēosynӊ8/!I Km9vkgѴdL76mv,۱ci $-ģWapwރV}iH>%ؿQN)Y*<O7,H(6՚X-RȌ]2Jھ口8箷lb-\{4b5 \]`Y>PLN_<@q{1 t \9- jh35$uuJC+͂@}-x @IM ;~z2vM}XVk/ ]i,!$nV%\|4 gB06~|*\h4Ob PlE"$HbEE>)_xvv>==,]G \^_}}q3߇` _6eR[~YP:]T%)Ny_ {( X*˶[Hjsp:V<=\P12ghzG.d%ʑt8bNpjF!h-t 7>Ifb,ZW n !)lcN5]`" }FU"w9zta5wC"6Ja\KmCl\QVX*L{F0Ξ9PN"b$wno7I.v"s$ZD"!yYڝh2EvHhK$TR4=J-KCc$ 1NRUAWPF[*N1؆2]AN "/(tʕL{Ƣ0oxaIiUM,i~y+iRfiX@ 6^c{{⽿=ߋАabH3G`oC_@HR !\\Dܙ/`x%˻IF'.n"^ˋ z%QrCxM+pl[`'nܽx3v~iaO(u-ȑ,L "յUmLEݐɖߕDU˓gՒ*2|G8IYg(Kh{jhzU*$,,ɪP^'*"+sg/m&+134٭hf9:ԝ )Y,9,eϲ׃AP P4}c㓆wvB֨@|zUZK T#ӣqlq2A)hҔZ7Y)w/J|Ï+E-Y[pkt̲uZ|^<dei%RcLDW{8{\zRoeQҼ",HJQFJIj A|~Vo_Q>2]7$V(xu=}F/2gu^4u ͧr+ӣf Ѕ^v ۸+덳qb,$Ybh A4E(|~㍫ q-K#[d ,˚E?oC?8HRl|qZ1۔Ht3'QhXoV1p9BcrUBq*Z%#02|7 kf-\aRڀlrM` nx3Pjfi39F).r}5CaU~ha[I J~IQ}np)<=~7*v^1!$H'4E EL5L koYodE2QEUZʁL4:ZwO}XqI1̌b'tuQ JҷԊ$GO j|dqS" 3’bεocnM?|:dR$qnB"× KeЂ @.u0 E|{l 2SFc喜>1J:w {C } &([/אi{8EҖe՛5p{b Ӡۇ4IGa)oδgEY R+'Eg۶Ea7FQ-ǶKR(<}(?E"&H;ZjH-^ x9sw0ùuyi)Y><>ml7#Aws~&˃{!YPViE%̇%`h~E۱8.Y;J I tjl1 7\}YsLEt?wqg~9auw (V׳ݳ^|x{EMt~ РvT;B=L7$ W\’ E$H5!`=XG_qw~ D%P ڬu={ƝL\'{JBqPWw'[kh=/@b HtV Lfl-Af+;LcgnuX!\%{pa8x;:{SҎ=e)UWFo4<Ǘ 9Z:hI|[͏~Cwm Ao-͆t6J3==ũ2QF~o޸m* $Fٶ|@8$+pTAHxR$HlD<'0,D[`ND A ?Yiώ`aIbAë򩃻rX<+ao;JULh#[=l6|>ތa_tG B],G7{]2qtt`~EB(F:R.4x7An)Dm8B)p@ѬT!]#b?hQߺ7(R<7}kx9C& q䅦5"8E|N`O2!㙸k Dr2MiYΗE0 #<_M3 ` c'qIvNXo7i]/ԩڦvnbu6lca7LKw?3童9TjKZh%'#^5<57fȉָKp($Xtͱk-@" %~bOd1$^sW3_'0&r<`F(m tT]9 Y>!N] '2" 4M_57CX9WTȒ"1|s5:^.\\xz] |lh= qV\ގopW~!{UKΎk7AzeC9΃vGmhhblFb2)gE1[.zy, >YXkj1xv@l1oDxyJN.K`2k_ET^SB:I2! ZH. 0_Y8Эmdh~wA@#Ԑ99&(N&8 |+أLјY +q'Qb17pw Ɋ"r,DƶC׃A/CӜdP hd:WVԣWW)$ Yi^%aRFql香</ ˢQH~:Ɛ%b.lfwk߮VXEar\ֳV}JYV1u*43Y~-*C+\Uf8"A'+S_;D閃+iD~%WҧdҽP(-ؠRKj_=* ,yӏ{탴H_ $Iςg*ʹoUwh ;X^xR L.SzΈm/O|ޭjOOy\i%"3 5#R?.մuW*)jt7`4U~?{D,cDu\ "]I*,wC{G)d 2*$\glʹ\Ohx*)5Lthx\w+~{+-QZxϿ<{| wO(B%hv=W(0/^c!1rGVl4:VC(JO%3hy \R%nuä3 '1-$C@_ X e8 s9%4$+̪_>]E~'X"$m11 OD 8bdkuQy7FNr,Gv}kW:x|5}<}]40 ̄@cL$fHSXҬ(|k,V NDu8N?A FLKH3yjۊkVKeapH2i3tztro9I&4-MY@If.񮺽|zΏ5q*"D[ /`}]}}r T㺵qzO.;}a"7́}_p @Ӎ`l-ܖ)Rr>O@ _nOo&P@.{vY׺ZoNoY?B:tgF׀تzDz9bEAY<#`5$#J̠9[)r< fY;t@<zO{u8'Hc4kzx:rNe+^Xځ+#ѹ2 @xVd;><tSlV+gO#ǓNDƛNK`7dh{&a(r<8m:Ўmu `#Ym8yb̋8Q޳᣽+ $3,˄_t`8~ǻ0ޒ8'^hė]Ejaą &V7XSݪ͸"&\uen"dXQH,4B\k-+EY:׭F3R 85\ e9cK!2a)CpH$<v3+6 o]R^0OAG3&n?7R{hzT*"dy! 'wS,'ׁ\UŌaI #hL50ZV<zJ Dk׵f6 :zc "$>+#=m(Qul=: Y@Glƶ2VE_xl ]K+wA ]d%\gw"cPj'O_>h|Ol`3"3HH@|~64sݬȥwgEY8J'g`0K# 7+3I$ZZ#dfG޼2(6\P , Y/06QkWR<Hj 3 E$p@:WK&$ F^qC#`$"- }+ߺevA]߉x6?_άM+ v6$KX:I3NkB/:iN'Iԛؖ- k_B=\q9~;8HqǛ8)Da\"ADC[`GIz5C}qT.v{:hϝܚnb7d  F\GQ^͍aWܭ _⤂a3Z)LK7 b˰JW(c,L1 )EW؃Sr+oJSᕖI_Dq.\]-kdq*-fUhS{ecNٽv;O'?okJg&v6-n8Ϩ|uW XPh**'?xOO\ϬCKdIyCKw ݞlf>B^۶8'tv֞8&b tm<,q(k/ %Cc8eBk5TbmU'C$dI* p9s!"Ki{RM@n0Rd(v<mPIllLEȈh ]MWh<5tcDXQsw?ܭ JniQTph 9뛁d:}D;һ DZPME 6kZ|! q| FkgzT3ÂBi5)#_e%8D.gc8y_ɪjF*Exd2Ih2vcۃhp|t,9 bVϳЍxmh$e27fY> 3\QiFa0$";1zr2r`0r1(lBBǓ~qf:#q?غ -1|}wpV٩(ԚaWdU6@Ur Y_7m+ 16Řhtmk'MSU{6j?tkfZ&y}nI( ]P@| li k}"#}>Bm|?} )(eja8a`#YV%"C?rONKk';,l_˵lPPq8$K%|"*CCY,mh@o؎RCbC~Hdf?!.͇{e !bn\;Њf.Cx0L9{|tw@;?kc6Z9:/j#p&T~>in%eR3{R¸.$req8;IUZWW|dke1r#!Љ nt{1̥!1u 3ML&ֆG<;EVB I\P%Pj#:6nPB`(]| aAmgP$3)6+i%XfwW5qc K!NOpn(M<&4.V׷狫h4i+A6roA8Ó f<9ee _a\DHE_ü?0#{8 l^'T'Rml3͜{\bt3I1byQޘ-?%hը&)awPfDrQb#Bq/OS :Ԓ lq !me˦U8p>׀$p$@t ̔zԭ9׭MƝ fm4N~>Ap804SbDP'@XΤ3ޝ[# "ׯ_WUp"dP( H?GjL6(?~7'V,Ebx  ˓+Ӱ3Ŭ{>Ivє=r -IT{PРިZ*ݜ{~X<-NCA\DD8*\y?4 O3Z5'{JeQYK~7'jBC#p8b@[69*dHn!^%x"12%d Ve2KB:8]3>y&JTœWu{w](1 i*+Ի/!X dZVo5LJS*G샤%s(_341sH ]})K Osl4 ,'LXV08YA!Qhɴp)`wOJ*~c("w=WVDeh u-st:\c<+VS^vIUҾ=xD,w~Ȳ2vG<<Q`hٛ cpa7 5bY#m'fq:VhUa!S8<'IGq/l0Ƙ햬KҪӺI]_i_ik-EiX( ~eҕ9s&ԙ_^WWV>z e,UVY`4M)0a Y<rݝ?hg @a$b 1%$h&FogZJb%+T:WX,ݰ~|E@Ձcp>ϷZxT ފ©ˋLr=2\Uчz-g3k P oO)`&og!(A?Ѽ 'ʘL " b`%gn rÿQnxoDMS)\Y8gB,KLqfJE C1qI0,$MFa8 g5l6U"峬n˶#σ[EP[Y@J?f!x0֚l}0.ƹƺD%98Y60A+gYr+lY  '&\֮IS3441QmK#M_0 B^ NA%@lrLy: xⳂ7mxiKnkAK /4(/ }>F(b!]2'Ђa|nE16εLTШ0@-H@1TN0B~_Q:БY( Rn5[r(JS5J\7Ǫ׶&XӷV(e3Ni5n.9qx:2V䧇'tLjBÐdaA Jy! j-gmVh;siA0t3(S=ݫq@)gٔU*sϯh&,jR"(xv9ꟈ`Υ@a У8Ы e2Vڑ`ks..[P< 6&P8ʰꝩk(1 n=3&!t5F9rhR=>&^tn-)ȸi5:5dUo?OPx{A?1n)f9. 4 N4Ym"H^.B\;?wBT@& w͉lc-"ocd}92O-ϖe.sG }GPYEZ etS-/KP#;?u$#Pmz^N' w⾨NիwcHb;aeGqkzegև7R}pTIU ÉcJckcs}Z;w[nx_KVn5:,W&,e. ZZs\ی%%4̈ #&to7c(8A4W^C1#pGpӻJu(0Q+T@U.$3.%6 3moJ-\y_w+[7p Mp}W"lcD%nqL7r>|_;@!l4"2=J8>Y?|Y/l`hKXDfAw8&0 (6FT`bOp PQȇbM $RŃ~Zk:-? B o"9#h|v|ޭ/zo h YW78h 4!SmݾeL] ۳r, JӧO:m @]+P 9`EՎgs) ,0; X0{vYn C7t㌏A;x'X< `D截$vZ P AQ}ԲJVyd Ơxb__"D< {g@NX1,6]-WeSsmsFuqb;$Lgܗu8MslBЍA|.Z=0lH  .yh;Iȸ?zҪQ.s(J|1_8evigc5l[=:3iP*p i:*ҍ& /#JhXCł)W. j^d`-.B,LKjGcD4QJ"f:n)G|+6ļ`/骽焀'6}kvXtWQlNd( a\>U1 xCg ?P+1n3ݙO!,r/&vrsr#iV|ձ"*,N)DPj8٣  Pb3L<uD(8~|uԘi+/jVOQ !)sïIz| 0 e놮#D$Yܛå4w2سY)11|~{׸lg{~_Hl4F#yuXqϞevWמ:C]^ q6/ /q%gvA.aVSorx$5fI%'OPc۝{ sPQ"&ڞծ'oG]?Fl>UU5Zw-yA@$Evǽs'$ ky{>H?K>w1{4/-X,S(5wGsd[LwTmc8p;/z)9΃[ R//Mhqn`Zc\79\Z_m: Z}*q[֦ 4 Á? 8 4II'c˛lGjIp׌F}<3>t-ǣ Jbٞa:E9&}/"n-c0DpWa;n\hzT4) ndl(xd[:}d6Z]^lW>mLXHDgeR" ~A "3=yyxguK2m`= p(jr-@L A4fغk - V/V/5ʄN[t!@٢G8QGŧѵ"O@DsV!ɞ!j*Omg_N%.UC<kM q5ψa0@!*>9vce (2*$N 5GḎ=]GyJi0&V 4b2D%3fso5^KfT Ef5t hR&nj݁lƮ?U,;*W50X%eJcsq1ָ7KsYή:T[|E{BbAdXԀt\֪)G%yx8CчjiFd-0m(vϙ8B3@z%LdW:a܏8y3 cA%Fb=.F$[^BF 0 X!PR{ݽ[݅x)Գg)| COR,: .%qLTXc^g;ߔfy`Qwrpm0ZJuts4mӤ.qtĒ$J(K4KWA)a}S30ďm*7.U$Ne0kλѯp׷]:Wb,*sDoLqW>x{ɏřztvҳ҃7 F?ȧ9#0P៿)2 LI Ag['E]^8Gr7G@5Zj{suY-YmzdԪBcm!L?Hl|#9 8b-P(3[aq_S vl'x:T:ndp2ef-m0 䭍xG?Lzz_z'qám{?3u_5k,Y<*E()9n@]7VՐ_}:`$E_/cmh [h(O04\ޥHZ(Q F"^+|W: łt{}kTՒP"yR1Q;vZ{-R[iHlKEZxN=?:{qzg]?e 7Õi%;SIX,~ȇgo޾inx׼eYfW, LJsdeMh p}agS*_ьRS i9 7-5TÖE:b?}\temq4æj'ӱj3/GY )0B/خՆZRK h(wR޻E^‚J,M29F~=z#ͥSt)+9'PM5s"k) 2wp2N%# S1~тl9ތA+Wo<{ڽŹdUE;"NUpq1(@h6/Χf%NfЬ-HI'htoS4Zj>_rEe4'͠Pf_?]D4ʥC7`f${F`˵rFX Bgp1N, =y0_r#7H 90smv}u78SqSO+dKepl4Ju(fD" YV| jG8HZbx}͚9Rh)|c\mJHS|oyJEA0* BE:W6e9 cḟȎ ”i۞m߿vpSw=7$k:^usbp@Џ$XX2ܴ՗jE NSu@ErQK%XjTJ/WUYETބ|EH$H0Z$eAYlvmT-ddzɇ@ȤB!~nMG*nʱv\0E$I˭9 rYM{8 ,{;H ]*@?ތg R]8 #1Dw-Fdl o " @:Ikv^qQUXKm¼L>Ü;()Ae$MW;Yj?੅t.u{هz`)iIҢ%u($)Z(]\^'= c=[Ga\쒀X͇sbݤ@2Ss,G@rإц׫>7/YN8L͍a =qxjv##n6Ovȋ*N+x8$Ď0bELl52߉t574XԬ8]&$B}QFUS}ћcsv`3n #V'm4DEFUTjP(\%$>b)hSk+jOY (Φ7=m eōmkOTwnL( _R} 7 0ά tyx..$4lR/1,R4A m1鏋8NM)WXg+ߏp5` e %6'5^(l;|QzhqgWxQo^>=8y"_Zݒ[-8֎( z v=UT߾|i7G4'³~dEfʓ {~vv0@+s)~~DU+ysc|ҁBn aD>N*beHEQf W0eRyvˊ#2rŴ ulgW`x9\eN0Mӎ;GRpcJ)2K?^^}$p)/ @ֺp]*Iղ"i*ΖSO$zcm@pT 8F?LGiWf./ǗˡiA Y+K8l8 'JM}~ݓgg"/,C #IP<^!&A@@3m 0Ks')K]۱ - 6-4k$MrbjJ")W 3R\8̗Ĺ80ȟH$/ `g'} fٷ=(ФXS8%Υ1j1w %RF~7-+i:hxuy͊J6MȆwFjӾkCgө tqÑ7 EAY]'AJb-d-ȮO5{sfKgx53nJTIk6Cأx%a %Q׷ ;mLK^V*:|hz/?}rSC<0 ivyKEqo挳j.UI ~%QdXfDA #/^>y^|,+)[=Wr hkdI?`¹w!,]H!0FL0>Y$=k>=dѵe,FN6'҂O-7.1cVEyo{\*Zj-WK`48pΫ_%w?p h Ágy*J-wOeD}wS6'/E,US7+KBL kUurao"O򳔖 @F!OF=ыW7ˈV=̝mA 2c |R:9D Q ĐI*B&s*aEM"#n cݻܳ뇦7QR^/EkNOnz-Mgv_ZUkwP z1DBC'FKR)- g!ا9&5MHrT_ jԟCt)rGH#*ԡ7oyGP[LqUk3``}kf  %̟2r 鿋Q{P0^B%ݹQI^׋ \ʥ|uyQ`w^CTy4ln ;9ڎm͆^1$]u/ЛfXk]>l};s8V, ȝTDCtWE=)^siu:^uZ [gκz)Q˲cX[#E՞8$X2()LE(:ݶ s{ԶdN[@_ڧ( h#Mb7ҖIQ7A'Hw}@k9(8#N' [2V+= `(,F>!TѝXօq/i)~z0F#w銌 %AxՂ{*hf;+ËYF"+[‘(T8Gܹg92Auf<G4#Q)*dKڭxiR1RCчh8tR~.G^={r[. ߁Rzs( [ $  a8QRIT:[ɇG ׳!+pMv()~btW*YʳէEf c4KzۿoEMYc^!<]8ɊlF5q٫3knP\+U7pm+ yxӷx33jr*Ͽ֛ ((UL 6!=B4lJ횶`iNL&?]nS;j#N|({k3f$2[cfMi C-.Z7v8Xm ߛwp}4 @@!#,_)Ն:SI~HWv_^s<0jVZ^\q~rhyO׊eitB[CД|Fˋ:usSb1OȤ2k$xtԪpAb9 N$"TմM6diR(1al19y|O`M0y/>͐Z(u0> ѲlHr,+@(]6! H9c@Xb"Y -V4>rýC_霜1:]^^.ƈ EG#q#ᜲLd3;PDHē2{\m۫7~-EVo EfOh$Z/0/_}lJ&(k`W%nCqZL]T^0?'O%)@ lئic#؊isq0K1_[AIzh™UEG)pp\L ;ځ8@ld46:F)@ a7o&O@?F׼,NLqr5>TYK_n O? ٖm8F[4Mz],p$ Oi4{g\{F8_gla'sn3a:p/~v=fqzWk*FڨV@SYv{^/Jʕ E2[?+R^>TnnnҍJ[(](Nv0޿tI3Ú_fSٌ QSq޼+ \4e 40qbet 65E{5kNTUC}A0kAx@I_#u6vd}^=3sϙC^] K9;C;QaK}4BCLEC|jbAZI˂,^J' _#oS4=ͯT^i-AX\oLh:ɑHdP5;M,M5fBٌ`@?vXWc49w9gtJų R-EEvAЧ<#I{Dq J\TQfPOn[.w*U@yu.ށ&DOT2n!rEN\~N7B1A|"ߏ ~Kϟ7\nWu[C0<' T]݌noȏʁ|w@ T.%z0%an,L,LȒ,Q(Ru#@C-IpjC2G jm÷鍲z3}St`s:ugBō)@|m2hYj,U}8xISE d##ir;U az5~P-W$-^~du/7cGaxz!Eql%9۱I8d(%%ӻYA?|5JÕJ}И3W50tYobPVoktM6$Iޟ Oi7J,W:9DWd@Ot+š+{Y I+mއŔ@ iGdꕐMgHb1&ww߾M‘>l LVmVIf`< nqrve Kt;hryiX t|UݎҜfpS:z|XӍ ੰDnZ_3֗b)>[25f%U>ɹ+W  HIc ݃jGlSl.NUK5 ( ,eq R0yrxRjSp98쫀_>Hty~8?þ|R%4q}/#E$O[] Y4ƚq*Huh(Lt߮4Bb@__s!KJƷFeUJ#)͑J #x"U0yq7ꕽ wGۋ+JȂZl_Nԉֹ91jaYR<9szq95ZJ\l/N3Ԗ!)4[̥AX1WRԛW %p:gw_2 Vңe,$D%Q 4͡:;@V'k9~ici;OPLJ<:Bbۢ_zYcWnKtKs{cM3<+j'DsGQ'fп)Q: }x/JONG](= "zrP̕mNJsԚY흭 )'qh6* FCg0T8 M(!./[:C<-,O>z%.&xH3HħG}Uջz^\/ի.iO\ 9a~44X&8Knq @ҙ=mEa .q vN<}Sf6cccCb0Ah}Ջ4s7rק4EY0΀P /#YN8F F#+~8԰2{Vƺoa0poӣ8γ(J_fAdg K6w,%l]K<3^ qu aIoTWyoyegg/](Z #E^X,YrVa rRxE4o !|r-)oNoAR8Id<,e5FӴt*{[hβ\n)ֿ3~8VU3I V]S45QеǏ3]Xp^Te@yE74F0->7o9 wiՃ8<\cx8=:.{-L勽ÃpbiϐXMa8g18}?Xt/nz3XO +RBT0~n+7~\L`H vd0 Jh=ٵjU6Vcҙsb,\P "uC5U7k*u٪6 )iK#^/_Mes@ k [ere8zq E'EcD(${ knN(ǘ7[O 0??? _|hv*{#?- TJ x!3{\^^EA\ ! A9"8Ҭ .d^fAxw$f՘-gxnXmr!D@CNe!"hRB(@ITlG݄~ijWK9rMZēw톁oUM5H.eE`̿j6ԁµ=+ C3lItDM(z\Nړ@_(:D(#HPPPqKR=3=TLULw2[R11qC#("s}svt%nBN8Y#=3usx/^%" )g/OߔBlm5T@^ Fu8!>C+Avt1;9JF1y~Rt@o۶q0lڝmaL'`II.{o4 /} 0vm7g7dȱ\|m<_Ι3 ":N&(" cc"UBƆu]1쯜z:R=F+nUW[.wZ0~M'ܥ >t\)cbQ*JiƲ nCr ˯?_j̄:OD#K<ɱbiڋ/v` %Jh|{orzicy^Fcöy|=iX|,$8Pz[׮UUWy[K!'1֕}AЃ:Ҽ W7?~aljo9m) |ZR6(\&?zSbn`$GnhuXTMנSt~;H%sp qPg2f2V%Ya PӐ0a<U\^uHVA-vg[Nu8~%l| bCV'5o!EJ) ,9Oqrlx9Ǐ?YִԝzmۛF̴}vz޾>b]-`見)e jA,| ÇC].g\0 H((q&ENfeMmkE(:C2/9C>|hgԵ.]d9\mr Çn}!gAQSŤbCtB(V taɃrZ[ 8 :qMzw23 xQ,ܨi>F6dNx#!IF!*ʈ p ra1]ʠ70Lñgu8fyE!%KUa\6ęDw4E{(=804c؂WŃW@VnF""$v&a@m79Al2]) @E)s91XcUOF @љmDQHHjb-d;'F) ۧ.iRƱ[ڸEq+Νs7 [l 60 Yۧ"jzIJmX? BwBvϾ;3\w~(/_ЫDF5sah3)%yoɓb61=ceGXS#>Rd3e h(4Wr̄`b6She9##cJG55ǟfb+\O's vg"16 X{ej ZBm#Wȋ/3XR{ɱZa>Yca-r CLOw'GRFfSlFBhN=Uepl7A:eh_0,-OڭE$/ҪK4,re맳g_NOջ_u)'>7KQSdi_Uf iO=}]L: :^]~ۍM)Z7dR"SeO{BA0\뾻ޤа;'JHr9)/aٺֺު/p2ƺ=;9_VJ =mcZ#j'f'zJ$0j$;ݹ0kmDa>/݊; ntl d2O?EAtzk b#^@Irx$(~yE^3BÕɊgalD:^=l;"$! ` oz]Zb39N3Mw=mhp cp"I{]LMr@ A"q{}s;M C87ƪt[god9WOuBc[|T(vnYENT)'<,,ϟ^^\\BpBDA"0ܲAn̯kun<@7!k:H.* {eFc#hȺvwbb/=|v`*(aN@&X͗ ˸B$w(wy˨Z-B2P굇_~AwpOj #eam2-KFMWR74kcL-7XL aS'^J>1#|ZD!qn`&rA#;χ@ Һݹ4>H 7 Vۏ4jZ\J [:뛍,Ŗie&12A8T-GqYgSXa[ڃ2r]&' ]f*\>93f0$i[ љEq6^0!f tV]iy0U#4vHMڐH0`lcm~{}=[o R I2 ]ϳH|Zhwx/r*W|+U[ҝӛLD9C=sʨ};nK\%$OkƢYnmI-̫#5Lu dZBp1E|B5T=tVCBh];Bs]!8`4m6a}862m9XE3Ԕщ7MpJRoV`zeV`Gb'vvWFhJ)֗Џ:ceu)PU$N1+ aRKeY+eZ Q;w<]ΈP*'7O~y Y7fQHb; hAjebnkx!im>T1VonK:_[Uv/aXֵ*}2r<%2q6Ê+xޭF?,wҝ<70eץzw뢁d<ۛb}{wјj٩<+|Dz?^ornAdabTb: u.&4GaԿ>WԨp5!",EP_>o|U憎4'&$ u<ؔ$FS>>nh{w#2hɏq!\k8$#WQ8ȋ7o:W)BMSȈBuN(Lr=RvͥX,0^-%dinԛ[W7G͂Nk:T"L.8lHS7lw}keٖ^+4 Ԗ@dY Ea3uh|./%Rc{0ψ2]N De!o4 ,s4 Y&E.}eP3x'(7q 4ms-wzx56xp3Rd~} W;v~y!'IRl0_hzMt:Ͷ \oOv=π3a\Co̮?}Z,! Լ{vYZ*pEޜWGU6Y$kMm/r @"!t)lf/#40 v9Mtz=z|ABD 8coTpt.i[Qz@<`I$$3m.M?,q2ԉX,0z ѣЂA ={9( iAeE&wp܅ϔW`$٣:M3KR,TffGeb,6M>T.EsXժja9z.xgx]\onw[R0cZZ!W5$(&pP O74vn"/߻%+"s*}wx:J?u/kه3D_Ҳׁ~sq'Fsc^|&b^z ħA#& b,}g[K_ Qiw@ȠhODǒ\a2A(L}RI3b'06C V^M>Ywj@>FY"o 2kpRj%AHz壨hpdrRd3||oRSqZfϏ}:G4bOL˷ӓATϑ94)TM(" Cp6w۽~W-'bcYOtFPRw7Q+m2-hpD̺/( $)Od\#1p۵^ ב!obIXo zZWĉX.`BTDx[MXn.szcxYR|Q-P *sĭ cUt%7^8xHfL%F$uP'{'AS<׫\R)4a8F0L:^n62Q[E6: C\Z+gYvp/q| f LbkL~vnŐ8'Wsy(K)DPhfr5'+:E ]ڷqm2A|*"6VAS:G/D~&_WUGJd1"v QV*|ِ,ORTYx6T~Q̞6(-l8NҤ3mf>SKI'N&6-VY+33 JFHFkqu ħh2\g~>l%Q: G\9HBʕ&JЁk<Qj~u1Y"vzϿ+idU$xrq"'=awK][5m/_< L9KW2P;,uAx=߯,V,][%Yנl^m zr||KpWa[!t:aKD koRk&O."\ L.V%P]Q&yN[ӥFDG2Cb 'PlvL]/rO,dH1 m1jܴP)na^Q74}q':;~~{Q3 Ӷbj,@m ? 'ُ/_] FR=9:Y_t. FiYh6z۽"sE6w*<ʕx^l^%*\yeIJ]OLP$4-6 EPKlA3<+ `8\lF\t~gfb I4;4-*$AB^GIrl x9ر??ہ-vVk,@'G\+R2E&Ipg),wi ݣZ*z<@WT D7~Pg| Qn(>SsM͕rլt~8Ql^ٗL!YoV"%.EQ#˖_m'@>S Y,o(Jĝ).ĽwHbX<4mIjt]ŗ抌'%GY H&*x9Zn4M_:Wg֜dr"Bgi\;J o/2u*r>5[vg?>֋~XE'NT䃖ku lzZFz?B2EM(~t7DZ~xшWRCX p-vi8TV =>Uy6~ojbi?3R]Sy2'7ts z&؆9>۬n8 m""lv$3}i{MCI"cG'iM=wMCMmj֛A nwiӰ(vmGl JOIdM [-OhFi̋Su ;HR86J?\Q U͐F9De@rI||xUH]ٿcP0/qfs]ۚ3rS#t],,(:0 k[6 iH:M;M{ՋNӟNgڙd a1!k%/9{;J<Cc^/(K,m_wRd:,XX=S,Dd (HYR+/_,rt|pc{l zCgfUf*h{o-m(m:RRlؙ zN&D! 0G1@P1DqybH}6 j=# @f`϶?$iPlMJ[./Rt~N]]Hf;EQCA{zC9vnd =6 _CT=+F0-g ׺o{x1u ,R"'d"]c'ۛmےɍ6eY&`aeIr-GB2Dg\o:Ňo6<@(^ ΄X{}oJV^I C1\ˠ!fhv%0,2B=[,9}w=5$$}𾾵3C@)Ǐy1T7E8 bUZx.t@/yJ!%ngY KDH#f/y@~T8,?*GXN#a Cq]lz41.숳8" }Q7A(*~~N&Xfk?X' %9^u աV|Z,}["$^q0 4EI8:[N4N%˕,V3|\\- p{k-j VrBw;'3 ;\nGqp"n0Fօz?Z)Κa0YwA_iCNv3&=I%ՒgՍhx "Ӻİ$[)ۿ`}|X;:>tu(z6Egԁvh:8YôLXM(2vh7w^vջ_彷HT`igO9if0(e"h^`Ͱx08~>*Qe,@ Kwvp=)wp:/fg^CQd]'u12jRZp4]!<2H9rk6dz'Ժrt^m[Q^)RԞc;mZ4ڠh@CsC xHX)_Y>z2,[e{IFҲ(~97 &y6ZU/W@9hi5):@޷)a) =ExwWL9$.P֎MMhZ!$e8dL ;$+ FcAwgz QGk 0F|:SP1 62+.(H7 k$JPn;>KOD6lm92/Vi66v;v"gg Cӫȍ71# L#1B z#zvs0?9Zqnc>Џ_ X8 / .:еV(02Oc۲0 ŞiCԆz_omSS*=MP+?s K3 !JFa@8(!v#rPNբ kXa0P$ģ Gq'_)PI^cj:$yEh2DUYt0zbIX;c(]=avXв6q^}|-4-lvq= C+E۶qnCҰ,Y8vbI&]@m:2ClkY[hR7{OŹ.sqT!lH{tC/*MA&Qlv*HZ/("]lf=tsub'mBx2+r|Pm֟xCfh**)HRQS"~t0-r%ō-_uKZUr3w R>ͶQ(i>ލ&]XZ. ڃ xy,7ra }/-3_-1";\kMHX4L$I;8 g5]?EꆚIHs˨^9Y-KrNT^[;x y·m5_xoח:0J'-3z'0/ONӪ^C^`ԝZsS¶fnfU /Fݱ7 t]i|Z *#J 4 ^T[2?qx6-)~( Q]YSV$/lYd6f8d>wiMiH]dYk4{΢9;Hᄟ'hlq~'ࡲ!rkʵdQ9^RU'XŒeҵqOX?],PY2rs~2DշD\LeQ/C7O ɘg!BxHCƬE%@Њ/CzrX(Z!eߙIrUgL 3tVLS8lh*:XN@,u5X7^_ sܨަۨesP=Jc.Sܨ,o\aT%:b+Q8;X-V4GIb3fBh!|:\{Z%URoWiG@\~N8tIo4f|x?ι\n|/HUlm ie ~Pt,s&:GP}S[pɝ" tPt,p*0y}ea6 Ԕ4Ux+y2zqtk{3,k˅na41KTDZ%߾XCk%XdX4 }u^ {rgj>J}dI5nTopo x\3<<\f;aKN6@R?:~Tϒt NWލ{:d)Iu G 2ivv<ۮ=l>Dy8<((9)4 LtRkFEEbl4E &+USvӖ> "p_ /KҴ 4i$Y-HxvT 7o؉2@7lM0N?n6IQAnZ Р bfu=QC%( 0Bczs&PσNVvݱfUW1O&EF2fɌjf!'$V$ ZjD Kڋ$m㧟oS:P&?\|KӈadݘO~t>Jgǣ U?lN`ھ}4}ةz;ԭR_ R!F\h̶Sq,B=-B$vt/-rF?hCTl7["F^\w$ṎX}l4+[I t12PnX+od A1TI",pם[jϜ{1<2҅4)E(Ct_T~Y Vt4;VBQI݉ <_!{/rwkcW!"]++̋9fNHxҔv+/b'l,j.t!֥}#ڮW:)1NVsuqxwReO;!ǫکe%??Ϩzv3ID^,Bg擎zj|%c6PقtfmQ澈DRHYeII>Ң(P (%8YDj(Rܗ?0s>r&G&`gab'6~Bo`@bHԻxf ZFf{g5cٮr^9=:ٸr()JQRf8oW"ʈ(Em.:}7J!N'sg$-h@J%Y)͵ڻڑ0ēZX W/^Is%slfޝ뀫F-q3 4y a Iqػs|?|LxڐM>/oY`uAq;5-SL&s#l9甚ˆ*ˮ|(ǗPHkH?}Ъ7$/V%lWƼys0G]GOvz˴*={ͻ75i"4Bu\AfZ%YgRM61^p\o/P'pbȼT\`=`q#7ݤ~{^W򼽵Y6pB |g4]|_4JZ) AC9uǭ$DPGƠ䤯{>R3Ufp߾!"x"ʂj Y|)AIb/ 5,s=ӏ! -fF`@% r>oBMTdJG!/߮fH'*EMem:O8jEp2tR/PV7Y A0r105' Xeh [MWoǓj#jkY @pԫu0}G=h];ݪM%Ic)00\^C w/;1H chĂʪ1G14(!`X%sDY-eY)IScX,Q\E7#x"zϖ'_iZ5j(}|()-z,(yDL9F0jv\8} 9vg a`ڞ7EE.1!"A< Aؾջo>rF,3=c,5>qBDEǜ͒Yʈ,q"agj&X*cN#P9$Wa Iez;fyÜE^  p('Q<XɠQi R9qҭ\pl#Q j;UT^;W80&e^X*VHc@ӳŇUCv`Gf 0S'z&髿isVX$ YqݎI'NK;mY\9ڲXhߐ@zԯ0 w}s.&|%a,ǸI}RjDJ dt35Ē(@LZe\^l=Eϓӛ*-$mF߳sJZ RYP(M[ce,gP&+R:8Ja)ۛ{[6<+ kHz7:^ >lZ 22!Dz*`iָkvFt6͋)N2Py-!zpO]4 ?nkmT=qu`a_:X25Y{Cؐ֟T^嫯UM%VmzcfvK"Q3@BFb Ip2n~?Kr&RY$Fϯ9J~:dyFDF*h6`0hߜw/_p,5{z؉88DcXK$Z, d6m `vssҙMk0A MmMs5θ C-롙Tq΃\Qtˀ-1ٻzMԚX ,@SQXx㫡ٶ{w>Us>N˪OS zOX҃/@<5ӆ=mz.dG$2x9^;{;;~|ZH7 iٝ_}4m8`8 3wXY+Vx)Ć$(sQTe( Q4M.Hh*۷Yl-2lm8f@q Y˶F,Ut!a<&=&2 }7>Fu ^}膞6@V,4:bPJ'EܶEa `XT(ɲ8L2SrY8qbX$J")6D!6p9̻Oi;`MY/`凒 HD@Reu@RgyOi})7_$Fà 0 $n$\(ppNyhƳRQ#4 -hL@-Q1B7DQ#kb sg %is˲1Gq&υ7[#:d71ǍxShddd}sŷWeBoő`a=_+zj~biOR. n~>1w߿WJjME5@VshExCvFp;\N6kdZ}'Ik5hudqNRz6:.̍Оźe5sI7p9/n{Y֫UR^aW9Pcrd;.P3%1A&y"Xi501Zƫޤo>|:wrsȀIvN 4#2k$z||>5]yC0΋؍Q@GΩZuͯTO(edPQv^0r+*!T?(gL0QYF╾esZz(S ѝϺ."aG"+NYs\?iʳ ?ROwO }ϰF;2a{6oxmDHE Ƕ*Iw@3Y$YXpwIZ_5)+CCsaӦmNi&1,$y1Iٽvﮦ|s%7o!|Π~iSP6/X fv0r}&%+n,fEg~X a.ך QcYlVgN1g#c!b,@g?qR^:oi,Icp=(?|AaDN=sjBGh7yAXNHyrwqLU8N61FH(FWť$eJ|om [)asՖWJ⯫Κ S+6;9&e{}p2gKg\_g2A^p3׿>=9u[faZḮ2%L"X`G(w D1q4Ru#IK`&EOCM8kc%ҕaiK"W7T1;uUrF&o! g\;Q'7 <$Y)#ӭvj_՚A5MJ"7x `(afBpϱ+K|ĦĖZ f)' yrni&]$!~^<mX X=z3gv6Q$YR)6zYJ2\^7MrVd2pvWYܩsIRp ahQn2 [#G[~oa,#AnlV|~>AeJ^:ok#SxF t2Ģh~n8!G`?wI\8<^%h9rE14v4N$55:YsHFA;ZYH,'$5>SyH 7fH<.7J4 Re(n0ܭB৲ ƛx8RTVw][Sqw ,$F \1lFPl7;!7lIͣ맻?Y޶da:E!q݄[&I@~kC`lwt5CA:9p|$c5( 2[eϷbI+`A9̱cn-ۀD9+Lİ`'iץ5aRcNnA!QRcmxwe3[fg#@3;N' 4.Zcx,WImpf:tsU`8,}_ˍ63Ia&"]^IO#$ 릢!R6B3Z~ښ$TsPj3BY*7[<䡄jVnwfyq\RiT!qX,V\q (iqڬ AҋP 9N ިDZ"8Z?|c$p5>ڭVh˅T_6y<гTYkIzXelr>qw>18‰ C1d 6^XxdX.e90Bkzr7Ӽ$&63uݹ_;KQ-F +j7mVeK)D!WF) '-C!tihyֵ,8Z.f3}ܝ[mC|{ƸR-{J7f(p sX&"v?p/RN9t㟿}?A.iuWR$ l/!!,nh֟OVe~Q2bDwXrrV&m"C`$J[-^p}zؚj/^a|->y~?\Ta9Σ@mE7yv=;;B1 <x/qS9+"Ӧ\g„tn0H5?﷾ҌWpKvMB!Dm≟XK"7ʅFU0N j*.ur%5smSLrJK$ XP1,38 ^^BMqP_?&B\I3rV8t|"p~v\Ӥd4ܑG2Y1, 2%v9O.#s3ԔNRYH2`R :҅l I~R&><_:xO߮C+<SR> <)cu8cL Dh:'[b4{÷~2cꕶrt̫P^׿^( (٣s{yC&$+Qa$EJCEj,E %W*&XP4q4{XUXJhSf! Yg1JjFEګj1[Y02/aQQɧ3 vnvmFӹw))㯿?LL tµ\3{ea6z BH!t7 )ƒN 1{# goB*5QNRG2&u(tI͗2 Iߵe"T>4*D!8m|ӻ77\*K"">HW5x @9[' y=5pq-ִ7 PQByj=n˳ZDLC^z*҅Ii(fn6Pv+Kq^# fDfmdHK X-GHEHtţ$)?گR*37U%On=hzn__@XD-sy\Yޠyr!w[g;xc`H> \BQT^$Nbt4;x\ȣAYb(Or$Srqw@"`LK3İ auߜ_H?H3zIۺVo gL?s!34 83%uǭ׃2<A]4~9a{; zq4IrrWPl`X0l}BADHeRnX>=oK G f ]іoky,vVI`|4sgPGv tS:>TFєx r\-Wޝm;BVrD#vz&7vͲl[W/jR@x_E@ƆÁo?>^@XBt#]KI2ExQ"ϰLA +Ve(i͜ӓ~t[3lk Ͽ8:ExX<[{`g13|r1-j~^l$DJa<씇=}}ƙA=}/^O"CgEB(MPZ0;Xqu+^Y 읻ZD)66rY)NX!K06CG ^K~]Yr-򢺨hA5A*WJ0/bd*Z6EgbG(X8@XΑ| Sg/ pGOaJJaѦ#Xq?u7 \*u=BU:; 4ņ9V:$lzߋ_zy6zNfjϮb$C,SWK!ewn62p8Lr,5_H*9-;s4M`U6 J {ioWga`4vDj*~|ZUU6b[c 00K/#{=y+9zZ1$b"/eM2. ol r}~ qk7跣_>6~hv.$ !v6( uj pEx$nXXfuսJ‰O__\vqؘyiݘiӅJ띞1$'R|'_k?l=qGكNFݔI`Ihe>4`P4uysUbQ@:9Iݥ]- Fi $ (8o D}\\DDDj'nH\& ld!A3ŻEDڒohzާ)xX2Rkf:+1CtnL3 ?^Jl ޓwA퉢(1Z)m~x?A5-y&=̕wJ'Ga8sTї=urHٴWy,2K@S 3?`\Ŧ ' _.~ic9ЍWdޘNe,X Y츾]E8֠w4O}8b( ͡YQ+82WisGFg^CNeI$bgxƟ!J'숌9 ˇQin^4X, plrLsяSAaFcU Cg~w<*Zm9bE6Ƿ[qw?_X3[̊"min"1REPʓX!9ImËP)Ή6F-(.Tv`$'F9?25\?D EĤ|Q4Ap4GW( &ٜ8ܬqS{ǂz*#0 $IL՛JJgZ?K4cFr`N)>"fjb H|uLۅ!Z˨wJ7wv έXnNν: F3o90P@ ۷P+cqa)!Qkr%ȇm˻hL̈bͯ$~=_V_ G;{ ((ߊ;xEE`]`5!QE& ҏW9KIMVʴI4r$qǝ691 zFV"DäUA\2B"LӅjQ. x#H"3M ð76e2KQj+U^TQU2d&{ !a316 Xy}t>zhnz3=S\C :D56U[PoaFPψp]CTqHUiZ%.Z¤1M I(E,k n&]eaUD<~P  I Vo: m0.#LB]Lt2,Pzi+c@0>\^|Px( R] At3;PlV%   $,et&6}G\ϙs5:2UK/s_}:bn鶷hTb/L|) 0bX c' pT1{gcґݐZc\!MrL>[ݨ3 a6SY.P&׫;$O1й*-V6[ߋёD!՗+gEts!essIDo[XySǒ]U~{|y|"6ISG$\T]o#[o>\q&n屴SecԘ0ύ^O(GB$iS&IC*˘ t1?9EWЯnݎo:RW3(BÇ0 0RUQ'ؾ}\̀S(qs9fN˳(IT(%/cS < I14w2}aQ[AF\\nX /˂g }>#t[z^@n@ ]~\ǃV;gRonX"|,xgF~T(y0ct|(O|,Dve Tt6ǭuB(u`H`!B0VKdƣ+L)d GGq2mtU"K4 Ib{ėt*gg o(Mx+U3knڊŖlɋv'lheJۗ@;lR-[ ;[mY%Ϻz8s9s*\yCfcXl,m!BE*\BRL^^\v{y91\,IL\!G)" 1aaRcl>VHo .(q\i` QyIByB w _1u '@i* 1.˹JG=Z)RX[mؔ/I) bfٵ㽷{o{zo$ 0'OC*Az Pm~jƓn;ׯm\'/_f2kpli}jC$bT*Xyti }*J^'])4\<Aw/7o?[ژtloUHMƹ4ٳQw7)@P΋4Ax %a.}3"y*.ߙB.KIk ͎M0 C^5J2t9 [@CTv_Ϭ-ͯϥK[i<5fj'^5i}~BO忇o^*s4CAE/* O\. &CQQ1h/֎ 30! xm?0j*?|J|ePB;sS|c5[!F{m|ugmqւa #\!qx6l=p ͅ|a=J\5N*=5"ag6 =a\88{{$beƋNMזw)^X, l!{KWVl?V_}M Rj[7&DžChIzڹl6ibT5;rJvdRKHe*t

k/9p=l6rh-Z6溚T;59E83wX[dTVץqkJՏ׍=3'@n4F"#.V&8-{zB,'wn[˕3FhRZaM¯//yAoz:\e<:8GdR"/Qo@j awQ X,BacG3| vCCDz@x \a"*Y%O|4aa Q`|5g/ `z5^ 8{fTE)%z$p+%nigroDS?Ҧǖ4f `>3,F*8'V2y 4:mS%Ϡ$44r]Zh:2uN9ˋN׆C%{Th& G4}_mv@9 gEJhf`R1ś,K("4 CM)x٧$ 4;1p jv{w~\\ mg =5o/ּcrwHD,2 /U `eW寞( G%ްw{۸<9Zt"j{b\Xp* b=MYr8a(R[R,A@H15 >^LGrf-t ISS:vaM!Ȣ:+X /EgܴqnKdY^Đ@ P3Gžtӧ&dh IHĎE-ے^7sh$˲W4 IZ8eZ"0EM4KH{]?+P9GO1y~V&1DN'_펜KFj2'Iu}ݬɪ\,.FA,HZ\UkltA攗(Ǭc%%܎8ԔkzoMDAfO%cͰ`H'FZmh6lMP$<(sn_8 9.b=c8ְe[~u=PIpyZI(9lEٻw|&./7l`p8̪t:l 4Dy0 p 3i;$(l$qP:rtS^O\(X#0},a ԜGk{P!B(]j5ڥ <'8^س 6!<sEOA=Gd!|;E'Y2sx'!zBīU0 QoUQe@_{ AIPa# ~M6Z0nhnϺOk4Lͧ!iڜ9͵IҤ(PyZO +%I3< Ҁa@V %1J,rjmӌS( 1ۣknm5\,A* -^d T="Ʀ), i[`b"xb ffGǦf_K۹^mԃ$pql0ӕi߹zSbMuM7L:>8xr\ZH+Se YsHMsQtz("Qs<{+kIل##]zt!?w4Ow;PrZ?9W;sj^}3B0a;>8r,ZZ =y| r|r|:W]RQ97`,,DX:cq@oV#hZ)JQDt"uj^GPP, PJk3 -\ tR-L(ן=AԧJeS_?2ULFK{#{8@dLlWN󍼋yQhe7|SCu1[E~( l#TEt`!G@2yrfW)<9UeIʅA8cY27AiMeQ\(𞣶J PVJa~ГAOQG$`#\}Of4-e9IPNl&,Ir9Z(׫՝v jb((ΌΦMfі9EBOb4E0)#wk|B\&h<tTE ᆳkcTg\drV|Nvo͚`G[9)4C!.MI)8۳)IYTkK^ؤ,#E7IZ[˲BW`,Ӿ˙ws[YOڡ]gQw,%m_C'< kE1 0a9,O[~?Gмh|X*痗icine-(FjxjØ[w;-~iJna M{W}w{Nì,6&stB5gle/)+Yat_lB~pw2&[6ATe]_, zS)aoC#̞68.[H$qn&f2}ڗ>5MMN&Mc10!$]|Fvr++o5L!ʕE P!-D$`]ij`򖽾GQ$wO_4eYł|rB <2 ۙFbbjn`e-!|q+q@b+y/u,@B0C9G{0*X\<զc5y[ k23c -o}h66[;Pop7]9}!Rao&p;{xASڊF#L#\:)Ar>UD#0 ;C: <}R< CgKMSBڬ](ʊV!χ0&W9u# {cM?y{2:>k[XR ( AAi.ۥ]UW~vᙖndHLH$A aCLZ9@.藖9疷.?biAY gYE^- O| `<uucJa |};}bqᛳQ#2xiVfg}|0!GN);[@dI*dDjCβLı< A$DAZO4E‘|2}wp;PЁ042^s s%[:!K7,M0xJŏ^6za1' 2|˟L߁L!ghawf<5D(7 7Sʦa$6wH'3˥!ĂK % LOjF)Oo>b"w/J@l `T#y.(9%oeX^ &|tGdQJ鍔.>RW_7$QF A&VY\M'ZY1.kMBiG'Pti[aqc(!&Y״_4M9iM]4fm6@.K^$-[:zu=%ˇ@_TkKYɞ .WM]Φe(!<߼}$HI;ٙw>L>T˲L6 cq84 ۶0%P|5p-rCx_ p= cD)}=̑gQ'doVΔʺbw`_Ȓɢ}s :0V褒dl> {FsQ,!4UqL|.rr 1>5-ˤ)_O<33q VkXUP][ui?vpJJgK{JZ3̣laKM0:?s[mGK QK C wKջm|˴$2$ٸLwZdbwo^ 8O"8b>ØU"D Ǘ7WpoZ#pψ uB1$#{ {}cwu0<Ȳ\i3,3_-nno'X̃9qZk"VʮȲ p,803,fȌc9ǫ8?Y^U?Λ's+@Er}5gVA/˕J*¢( WfaǜS]EOi9RӞXYbfC}/;nbyHj4'PE*|;$,#*3g6%_=+(*Mn ^ռݔ̕T'v YETH5&>,/GgܦFq@$$͊xeIәh_N2<4&^eDz-Z,ІXܙ s9KdF8ĜX|}XY$)@ ԑ2q""Uy ilm7&jn`RYb%hQTUD?jeGvIPlMش?1&4 4Kzwm{}ϋIyd絃@_wAAH GQLlQkNh̦d#"psa&"lˑ=nN$ _.yMG%:[J'[EJ٢j 2l]'n͇[vkNrX wDb1&zٿ? J`ծ{;O:f/Aum ]R3F!01n|&"QBe((<i]X94lA|,`wwwŕO|֧ˍθ縕'TA.B8̽9|3dM2q}yS;Zʠ!~$L}>˰R?lכ 2N@>6>P(<{ Z*Cȑcޣ Ri8;=-Gi>bN-=#3n:׭^GQGߏֽI !HbFj# kgW〨 !Ir*o)ݳvx9q?\rd,ۍ(ZHbL.)fRyL󥕝ݜ$gO6]!/W 8bj|ؙ 2Y|\&ŷ;px᥈I0]W" L&|!,w~Z!#{,۾ssse -Ox#t@9CrgJO 1s&Fei~'M vx0\|4L=JDLl6 v;C2 !"u|WZw{g@q"zȠt=[!:.O9m+ IhABBS7iK3)L6m,lfBmh饯z|݋f]3.PÏ{ ^8yJwcHbrBɝRvWMYGAL&@DAT&&HJxG:a4<ꎑU$)"[\Vk2p  PBYccg6 cC՝%`weMc֓'K `$j7rۥ0Ӵy)9Wvd'Fz:V1qgqs$‡C+j~|hc I E=v޴#2_y^lWٴ(`*֏ҋ"ƙ3r)&3QMqZCP̲( ,G00l‘2 ,t}atoGh h3M nbQZK#ؐ?9 1 6McXP@7nJz'=m˭F0F^hg([ϪqPR?9{Fdb7k ^߰A#D;8?.qq 0"Fqsq޺UkM 5k־iW>ur>$ y N, cc8: UT u8lHf+YA (}Z@~kY nJz3p0r-w./)0OFI8c*Ww<#!~rxts?gB Veݵ(Np> _*oJEQ IAH)ʥ02PQJB(m&Ga[8(6:Վ@5a@zѡ #} 3gX1Fmse^]=layB(NY!xusצWQa. sH˲9 *5clǫbqV6ZW;x Hu1JDO_5c1À'%?}<_^4 oo~CTV;#Q+ȁAF"XִWߦygAaY`k$)t}Fdm tv:]'v G5 &1 ][ <E+$%P${W5Kcʊ+&GHSc)[_ƒPVkxwzuuo1O!&eގ:%*ӻ~姟ӉL dBJ4Ptf=nSaK3'dfLv pWCn HBHPff؎;^b˱87gy8pq `'I؜7ds 7Q=d]&ѡ,sÁVϑ};^8kkb]ik6"01HX*&eF(?/&)[)IL@ ⬹tN avy.4P7Qf3O8Ky_O>Jѕ#8,t, @xe.VW/ݱ'ʥ 8#$+|@ācR1o%ξԦTuJV$Ow:HnC `lW|jm㽙YD >jb=LW}[RYmXDt͎Nos}qug2.M޿ FFOvՖ0B_xG`[ړ(`a"6¢ۗFUeMt y9J PZ݈,0<2 `qFV`m@2o|%Bm&wڣC"2!) F`f ^5;JL͓=D"A˴ͨø6q2${^C) 67UU$2'?~i=GsB/2( 2ᐰ.z[sDZ ͍3qņT x=ar{jv.Ga:'G򒑤.Y-UJ[)(ny%I"l i_zt>﫭vskKUr4W|33k2^yNQB$הN Ҿ(yhhR`6pGXW̑FTQ5p|yxY5,}y)佛<-27`;zF4@  C"}>FK 1.;|}4oތݚl`T,\ʬ H'9 Rdf)lb&Bۂv~Ga[,6J~|ͩd6~zF%/90yȌ?w3m 8ER(ɶ6;4{-ZH=f==4{/%YEZ(wy|?` rAop B P!_/lbKT3*54Ch_$ Z$>0F"f1d&8l#HʤL x؝2{9J2MF  [QdY,/gn]C\M1X.e`T+L`ě[GF͙i)ԛ q qtO^јeov@ǁǶ- 1 bb~;߫ـ@qSa.=[JZN ݪ ]I7`l^P( j ͠t\Ȯ48:$=/HNt-WvAȹ{$ݝj&}G$E߈3T+&3W Z!kEI9~C *Jd..g2(qvF$JR}Ӯ!gKQ`oT:H&Wk[jRo5)smglw噮obwuP@t #ܞP)ݮl7e4G0x,RVT0t'SQ{W*yZzиwPQC5 ^9Y9cm<[D_\~W{UsĎ(jkt25{i"蛇)lmݎ\ +m0,p%uM' "!Hdv 1ܽss2Z/sv9_:d-d7XPE(b(6Ս, ut|ɘ-nMtz=epfƆ >,ƽbrؼmK'*r,b(Ɲ6'Mq`'+/嘂W)rҎ3VoΆ&r1ZE"8EczFf&/sifn'# r P;_O*I,KaOXl (H ϵ.~jk?~ {;I8eRVT dAr(A%Ya(q6۝F 6և^$/Jj󫫏C}4cd2 4\ 4a<^^ZF Г#v&[6l̂7sqUS?q=aRBa4GH!/&PR%㹞3Y1JZEeQ,R j1 \+EFͮf$iQJ]@ 7>?LdJqvaic[E,o' IIoн`r?%]CPHCX{I `lڡK2p9gl-H`j;g/euV-hpqhyJ윞Yi.̍i }=l[_>!Û3x1DmFj?~yڢ,Ae)lQ$$iiQ4 vsǣQV5_x?˥js'W~0DVV7k6<R(8Vu+V86Q,1s`Xjy2RT˭eCךּoN׷Q7Mbjҹܷg'tl*u(Q%Ld!%R>3 '?DO3 d3;Oi1^=ĉ9_3+ȀFz5iuկ$~\V%glN>?1dv#t%!(ɫHJ.մv}޼I\qbZ=AB~/hVt}ș sچLzp~>ۉ$Z,ȶڬK& L>ޑi[^cWPJ֪C'+rPԞhEZ> =' T&\$9dT.N|#Jc\ ur#cpfs> 988xFY=Pd$F)H`=.̝Be"2XZExㄬdYҫп, " 4FV?8GKJ" 괜ԏ1#( 2ׯR)OGpWQ\FkE(z># BsO0CEQY|9b ^(LPlYUbJ(4jjVԬ-2N2g6$yS $$ v'-x6$Gwf|2WC`Eb}ggg;cVgVNg=%47o)xeYJID4)O gz_\|،!A9dtmTj,,2'y Y WxB$EªU  E:b_ۯ_]^6j1=yR)Y덵KdTd[kOawrnu "0v˵rQ7kku2bliO1yқ,g~zsnu7_^ n쭫 I2dMr(E媕I^g5-Fc"Gռ RQJV3U(wtC{tΡЋqJjgyUR9?g74cЎ F.p#J|>_δ7+ ó/0 Yl`;c'RUVUc+U8JFM``0 9=σ܃ϸC,(sܻVb9^,#D9Utj9ʆy|*7̮?Q-:F0 Q۴$RTvI*D LtӶ!J^+f`3q;dU۲p:WQ E_@HAbi`{^^OoC2rD2\^.o%+Qgd!"Ea. >-q$Ivz)Jfԭdw;m*UM!RyWl> 5$8@P$}Bh#"=4+0N:u}@]vR$y+״Y<L+?>x?yV2!Y@\tKq6aBdy6 t^֛?{SGE>y ּ(j@N8nF=V W˳Nod۶Kju”%ecvV}r9ǶL:ʼ# R7=i0EgxZfܶw^_3]wb t0, ^s< / ]ۖjn]_!Oeਡ9cb*چh.Q $qRT,m"8| Q7Qb CV)d{?pNNNf'DUw@G<{rhҬ Ï @WvRfYzχc;@˭7.QF%D99.,(RLN$ 0ȩɧF38:=HeSft-$ALs wF5 ͝\Tf@8xwaǧxqn餩#oVcWZ,Ba#K݅?=4i.qZ/# YhT($ M  vƋA)oa%0 3r_U1f 7%Z w׽'ېYJVg4gR_1b![/ϯO5BPt2ɤ˵L,'O mwGGܔ P`XtL:''#g36ۈ~,:`L0^)ٯA ]w̦%3U23=4ڸ R( \au*% 35WI#-c$*SF},|A Ypo΅$ITo 811OJţ-BsѾE,Fx83NۙNv:%͸S` BHB R?]t{aD^d$xn֞J~k R9ׂa-AJfrCӀ1MV#n;fc.;LL^a({ۯ]o y&N&Hd!e9!ao[¡S9Ȉֆcw;+8#f zlBbmL s0,5R(u b4G'ɧAAx;|xt7t;WWgS} ^ҜUmD^AJ{2O,"y$N``_Y7 ,#F#0'QEHT,ꍝ\!Wk`y,W YA=| pC;!k,-3pOaRr;;nE>r@׃J,Bu˗(aQi,KRxLSKнç^uMoQ֝Fu AM&-gqܨ1զM7$E'X1an`b;>MI()rq}{I&G2'@Cehki=p }tM3MSq&W;OkBgHl%Q~iX+ A!.JP>QUt <2]W^qsѺ 1s{xLNNWi!'fai!Sq^h qS%ppLP U+OFgifs߽\ic88h-xlrKqRmuM_=JS9.TkVĚ>zZX㼍XTv*[x>&ͨ@!,0s\FHT]p6LQo`rbnqeu2~ "/m<ǰL$Цk p$KO4VVG1 F$T*kookIW/f??_ _%oCGTM2E,ͷZ-DZ_B!}7~ e8G.(tX,Eb4AYGGru2Ͽ}іrezTvZ!xx}Fjָ?[̖0@0צb32/|9F)sYDX(b92)Y[⒬g8 X!E&m߁M$E%"2Ms´\S宓pti[Q./6^z&N?W#L2:ؘ͘U ڑD/Wg:G砅_g(LL)0}ӍBx%%YrlOp<9dc2 Sy(H,SO/ikz؈mQ_5#hyiA'FҊ'; $oFD-U/|v)G,,&0 u x z^J>ݖ[:?.!x1F!4ʹœsXDy6ځyJcddm%76W1VڳÓl<sY'c||mKsooh"l0Yp:qn ITqx~{`gW}t]tz8sϏz3h9o;]h1a!b:|`65HH1hZ:*eW B)\C${M^b@sLŕV7S]"ǟt|_Kx6ךbZ6s[,Yo:$@gggw{cpDbLh@1ct)lL2K YKN.A`A5.dVnx*D@AR8Mfh}o̼ BQEm6p@Js~RZSwghjtޮ^{I-)E bdžtU2\(ZV_o{ )TZLa8/I dOLݙ2I;B "'Liެ;RR2/̓ZnAщ1!Ac~9Ȋ>}>9>qQv-O`y5HNG{Ӂ1b|Qk4<ߎV}k ڽQwcmm=[_^}bwH{Ӷi bX{zPOuTZA9K"'tUBR!0p8Fth0Y)!8n2#m^j0b{ IEP'*=HgŚ 6;mvҀO;NDb1Vhv;*, i>(4KhjMLzkg&.|LZI#w+~e{p8cE?+ݳ%nI+쿅foĤ{k ` Af!tn/~S! "zp#3 `{x. ՟jE'eMI8Vv-sl9% 0CtK4[m0x^_νM+1ۘ-6MfjӦ+Ng;),Isi 60 z<1%L)I0`%HDa8C}3 ơTL&MSOkA)vG4dH.{\9|w-*B\܌Oh*I a ٜB,ѻ'C}3bÝi0(aex <0/LO4[Uip3#Nz9YF^y躩t7GէZ}ԅEl%@N;eޠ9eWꎺaLt< |G \55k]O$@dRLֶtsDbM+oa,ebo4;e3Yg.>\B+) C~w܃Q*gu?0]DQcI4@0y6*jHV6PLYBBw4\m.m4]djpAyX0AnV7UD=4\L41fQ/+9u6j{ C ŧ~k GxD ,"P(+pNFI191Kt92$jqh3 *wrzgmSV7ͪIÑmVT,2yE!*lׂ^Ao)QDVb,{!$RϞot*kxn)Zz^܊ \#ws4 q#7ttQ)u 4ts,PM7jt_5Ǜ<_$5-6^~>ך1 "?ZRApкKbg~:VVf0 C1hg5KJqGx\O:' <ҧ/}#DO1 㷳ak0W+7&f 91Fj)PƂ0uY 'VhZ--yoviiq So4zc4;p4 /GOv`|5dxJb<1o*ӟ/f`=jh0RGɻ:lüVbH/_eI%1IZ+-ȣN`9"7ҝE䑯~ri=żm<ܖxix21{~FI'axOXmFN: /z t NQLWʬA PˆBpÃaE%YBpib<#Z(d͈&h0, Y啁[ $ xjm=I]?~P6yuIhH+!i.r˰;B4}6\z۽ߦU[l]"󓃇o,Cҥɯ+ yP&D[+ 8&ܡ@XFQU%#̲;s6dE=<26JΩn/=|.ܱ w==ٷ=Qc$\o7I_>G ptj` l8>{gML'r# ڵv-1< RG[dq eE^iݛ,A0;{}.~d1`ۚ )g8 %yAYu8]mB㓃,UE13kwm4fS+@$\ ]o+yJE\yu]w ϲoGs}4wDm4*(kϬX{]ӂh.VDv ! ,'G~ù+$Cv{CXաŜ6O1 ]-+zښ3R6r.!ynRt0/)T,ژёME i:mN,Yͬ`O'ݑ9/E0gZJTPGhp ,u![ٛ2Xasm%KReepܳW8L^YȒt,~՛ը%с,2]t/oMJ$gY[lѱ9Vx&T[Od$w3i٭%MXӯpyDFI.,%{䊏s »)4"+}vπ4z9BN~^b!W[RP&)b}:.),\G}w|?{2R?C6QJ(GRzϾKnG\۲Tv{w1^\Y1 T.jjh 3BPbX*n/=r&͜.q4˗Yptfi[aւ$#@Ȁmٓ3/_v:HMI4v0;B{z;-{̷?oR~.VY߸,+}2[h[сnS?RUH:jRj&M\W)\gWz:7j]ex:,VշBi{io颶P7$/@ѨlA^l I7kCԪ nXD\IF`BG`Z&bgyI|qq,CIbԢD?ZkRoAd5նUvz=L1w(֫lPA%˛W x+Wkq!(cx:GIz"A4Ha6xmUN lNWOރ/< *0k8YK-TVxF` w1Z  ]d$Jީ>{ P]$JvQKrA>j#fiQAJzh̿F>(AeV 2-+w,jRQIH) )LTmB+ p+4ɆQ1mm(ZּI*Pc SUa֚ #vh<q?py;*wF{OYAl,`*{jxv$ϷxZKݔ!Ox@Iob"Ƴ|jhV+z}P) CwmwLzcݔDr|T$s,^׻]iTgz CA~fN3C!I+syu]oLa e!H>=<'(`=YL[-LFD, $O凥DDEc q % vh=y8Ht$U}L'rD{pYixw:no˒XoU*W ch}Ki4xz" <.~.&PJUJ 2"eIߞ9W5FMfYqPt^mQF H;&N$og&3ɤȓbgl(NID#`xٽ.! ,Du`#*l/o~ÍIc}cULܜpʋTdxvuVl6c(JKUQJ=hWX8FMgp[[+B2ht?K`-$A.fLxHdV Ď9CQwi0@9 o S2r&cQ·*34$$v,Z"TXCDa%&,(MD1^kP+GO5b ]EatN. #QЍUAkfw~;!$bK$F%q² Y=_|Q̝ЍK~,ը!qӇS^9-t0I"ɒ* E~w{j0IsrKW*Nf9.8rD0xh%$Xsbq0@f( (Q1dDAP8dO::v>;}. ݁hױ"IAeLDhxN\,~ӍQ&&i _z('L[0^ӕ*dFbjPXq7Z@U/Ȯl2T2-RŃ6q +±rz:U y?NWjA8i{MG,#Ky/i-yPA@\E\7 ,[d4\7hjiU U;}γgçŃ[ љmQ⾊"%.,YO!(c-A&uرEnI.J).N|̼{KA㩙@2 T;Rj7{H8[tIu~ ~!FlUkp翓Jղ(EgϡuQ{erdM"(13ͺg{jEy8gQR/ۖs1$Ҭ,DāxZYJf05)seX-i7||bIt[PT"iL3ZUI)!`3-9ܸgt| D˫ڞ'xg8i>]n(Bc&l0nDď|=cmIy["!h0%a4J4^*o*ŊSmaX r%Q $>$|NQ>N8(Y8=|`𾟚it.Vs1[ ]]7˹.~^R%ǕvC簣QcpQE;Ha$4eV%O0E:(1f&.2<N*jv8L2b.)=WҋeYhDa1c77` rWթ96&$@ꚠͭs}񉡨#OO+^#ҝ ƸH!2T3٢ָXGƲߧͻoFrzVT4UGRpc2O$[y! >˜󱄌A\V]`Isk{qZ )~iڙB̔@8wXȝ*5B?/Nl? P˕uo,fyՖbX?6.Zbtc9CW'le3YbXR7wOQ*vB>L̊x˕=݇X jaJ`sv^?Udiwԫk58:vsu{zc-Kp7wk?0 []  ( sHZDgC=As8PRIS ,_FsAw}}ۿhSm4tFl>+p>ㅼqX+i_:H~f`ِ'ݟ[*gkxIFn=x G1OXO .D;Ƽ䰹e06'B?x1^KU CI0Q=h7#xjQ`8dY\gh8w ȕ~e8hjآˇudFap;WkL^K9/B8r׹\Fd8 Pr`+XMի9*!3 !O$H166`MsO(B!*N2$i=KC:jS*U"E-1^];ӱ[N&!˖JԷOKYjm$(|n6;M( DcvǡBC6XV䀔S6f]E^9 ]]\XQ\Nc\I_VepV_m#$$Z'mhE s%I,:l$JH!_#h/"xn"mw8-H+]YU*hu^xL(J!ȋVPX,I3s"!(,y&JSl$\=b,KwnoQ]u?7Yno?{G]c3bDA 2fd-XZ1ͧ@x,:98e$]$Kf*^^ӕhV˦FQq&&@(]`F@Kz zoF4(`#>A GvOcONN\ߝ6GIUi_1\+ٞmMPt? 3a%wۊߟ$voGRueKX!P,|yq%"|)GקW+evwѻ3*+Z-m-NHB? IooO5t~I04Ǹ}XRukkkfOP ,?QB$IJ/뻥?dܚ4E<ؿ򺿿ۺi&oJdDK$=vqaV GweIj^-C?IÜ,,Fs|Gq%e*h3X_zò X׳H4^4֌XE?A9xM<-Y&dH]p, M(wSp7Om !uB(9anY34^dž$BXL_MpF L f"O \c"*ܜr{ZF&ϣӿ۽(iԌ~`@kH@# E&vvyI<ʞZj\}sjW@ k/EԶ:X$dcj)!iHz)˽kә6h !>Yd}w4-\d30WMVX$D Wr]v X+ie0ѷԙQ3'}t d(5[(ri+*c*Z]BrbbI!+͝:HiQS@II ]w_> >>a 3䂠'8L4չu, 0$`> [Q$BJ}'jy9ږtM,̒aL( u6ɜR/x2g~k`\.,=?uؗwkӞw;1tk|,^@%1&Bj OQ5li rҫ$VOׯj?u_ w\@鎝?zH+mqJ3tԞXBDꪔ 24d]HQֺ?_9fa<=7Fw{E0jk{߽FaeZnel^֟,50KrEtz?xC_*ŕkq}ωRKAֽwya2oݾRjQo7 ZhN `CÙoOG20~xQxۇz>Q'`qv|jC3.eJ` >‚8^-1ytp 63$2*׋SE;(*$HKBʦsޛRۚFmEN$umN0eg A?Ze@ 틽(v/q;!AUI1E޽S`W,sn&LY<8( Yvvv{H!DdeW]A0,MI0Ͽ~bfg0'x8$Kh5jYۏe|c=׏lŸx rhXeUGvk@TVrdW֪ZXO{GQ)li0'~&ڰx\ Mлje{dJN=|be%(D$|3%VwNWw<7PՍT '1Q1 cXVxW^v/yx.׍ ,ceVVyqBXme!z4/om{{=YLHȅ,s'&2C/Tu+GsD+*A", ZF wɰض[(&A͛@ 4gy+p4 ZxB4/N7@΂Ļ&6Os0D^PQkkϗG@gw0eSX|Χ<`DDrje( (C(` pb(3n1tETw3~dd(0xLdPbq&SK 0Ps`FA3M'6[f34:ŲN.O>2euxzjl*\a<$q-kfa>YMRȄ 3LC0s@!,I0M-l%i^9uǝ2H;meA_~*=*=>b|=x|[ʬKyWs(0{B5!vljB(x$zM0 A<bqБ6q]GQxja;kn_ӕdzlt1]AzO<-J#͵v?tVx RTSOT]40t|DE]8'fJ[;ǕvBY~I>DY=_.j΢zɔ8>MӘ(,ANM?@KE šg/_1,gFL0;ʭm7ZVT(|7ssxr;Bmd|UCjt0SiRg3@II^*ڽmh !n߾yR/\KosѴfv kXzk@D" LǰbMm N3mTp]//f]k~;͉r CD}P*/VD "Т1?,<6jDXǒmRfu" 0U mrr2H|M!g0,!q^)qc]CJɤ_|cc_p*fs#p߶aw8K6U\04Cu[}4grtEkKsVX[ΚLqm \8lE#%h~Ѭ\@PLz #NYkj4o0/nn#>C?y+E$ 8O<.!2`%gŲ3kt.hKЩL\i_# 0VKTMs1- B>{욶 $񓬜2Q3"1h z$GQEh.)`zbpۡ=Y`x6]p- *R4ʑ`~)U\Khq<Sɕ y[Fa#` @ҕmDARoQ؎6s4HE- M)b-%Jn?@ 7C.f_~YiqH@ X V CӣgG$AhTn2!Kۿ˦X5`Asþ4`{)ZͪKZ΀*RhdbU-S^y ɗӳ?[Q [LlgeE,E8I2<3[Nçw;;,Ü_;כ1N$s & I쿶%?ЀSLDDbWYԪ[U tO;)Sm!hvsuH  .]jZ[)޼ .܄AAnV; ȎQhJ6[.n95s1[ul.bi &0gsA&|6K¤DKE&x<#z@li&P[*x\(4y[!8'S) #P¸0 _KdL'~$_ %!buS\60nۀ @.M4M]7}mvڭ]n$61`|l_,s{$Bm)ZOAJ2r]4-D,9Eq\0}g;B'x+HǯV^4LߌGBfdbdy:rFhB*t}j=m|*VbN NCX9J " ʪEc"Yf}DyH `"#2UWpBDUSip ZQ !"#fZ,"eTۛPZh"ngI翾Avm)D:]mn7Hhlf`93Ff4s,ܺIQBwx^s3fͿJ/@x'xRJdYϞ0e/ d@vvμw Q %Smd̼Ukj0Mﷳ!/qK$88z"ިKRsPtP)}۵M>B ۿ^y(sĩs8w*z@Z$AmMڬ tx1⭽v ZNzٜP5oԔu (1ӳӿ|̉)i3Vˣ 9sǞ&Jv _-Plmf,B`L0l488Ԫio*aJYESdh oUg_gi&RV$*!BHJ4i:v'{6g<5|{s~{gm[9>>Hd깾xt"-S!z: l /hw{z/ !7a {,^oTsP$/a05 z:[6uX"mm`2-eG^iAPծv[؅aهw,ÀΏ6fcs"UbD bp@rNt2u䀀pϿ{_qGbt8Ic F.5Ӑߝ$f;a&$EP*l~0nCjMGJ|8| yw샔wv 6J尯kb wm,{@K6n[zt.,0Ѵe2_[Nax{ԱWVMNO% KpaEATtKu3]W*tÇ?ooėdiUem,ʒ(rvT?>S:CAgqڮeYDU= 08y kj=4p7ɽFjmr,) 9LsEf)CY`Tu>.[f)kk:`Nx9({nw\e.@=,ҊP_AS$+R{*b &V;grI !I@3`MӘ(ۀApe(Rppú }͇R4Us#$i6 y>(S*Ëu?/./":ЁzLѰP`g{P'&p.";֓$FO6f|7 P{ZmC؇r򢫏W;{1!Gu=1lfI4%oV}l.&!ФKmU}xҪ~غUԮ4h-0ղtd>9/) y#ëQs]޹ Պ1-ܕLId:Jy W~!ޔ]h@eÞe[f{w-m,*H(e3_)*qƻFǝ79Y)=YZ;_|gw=8yhN)(v"Z!k^Њ"c$|,tF3%UfXf:C?@!)b!J򒀤};Zo/EgڜaB$ІXxɤd: mfC_$m4v8Sc!ڗtyHá ugA vC>cy1ȗOE۵(&"۶o$ND)2x&O eqe9z8+!Jd~2īP,H-I;oJbX eE}o֊i#-< )6SLO? B5p@ "b 0V ##F^({2sŲTxZvtZQh>)rfOATFDKJ/ONx9,I|Nb4.|`y%6zBھtG~Ss172O.6Xc8}UY+eo:^Ǐq@$BwΗWa=?94=}N'{ \ra(c9@dQC4gliNȤQDJ)KhF#J&I\%9 -MQ %ʁyDQ!4qXQ N! ?'hCQ wj- }lj,F?_-(ܾNi!/@Zyzۢ,qd>Fe)Xs <12+oV՚̕Q xUJ2#;Z>3fRoěfTime- =5Nn7w B1ɥ`p_%|yJge;fD16 _ϗFȂ*vzyaǛwnh=`U$/ 0|i+xuY9ۣ/Ak&ɒfKcE'I7@M?.?ߍ1G42, =yזW˰7&_P$E( tg.`rc?^p4}cTJq.>>==^ӓ'NFcU8Hr`ćDQJgL&YdpК$C ij qbQdT0iٳEFRNq4EYoÀz˗/΍ムd8[7w{G5kW![14i2N42^8:ݶ( #QJfnF\7E 64n'N,K%Y+Em(aa1s$T#Oi 0arSʈUS*OI.W*wx\:f/ J_4Bn/Xʲet͓I# C;8{LHHadw#FR<|y][/ɁGÇݧnI 뇫R&qwٮ Ґ` yxqqa\+;D9˝tZU}aĶ5u z]P0 wg2nkm9Bvԡy+zDyD !$+eDu?>j]\Noj~hKm^dR1QRAue8ETmHgmE^UU$e34WP @.r?@8E1H1s{.U!ϲތeitzm{g_*b4KBjMmggF1HyG"qC;>@5Q'5E&'~F|gwg+sjIJʁN/{g!&dD G56Qjr)0m2??LQDN S˱3$[ +tU={~yT,~Y\ ^%&pL$ x&0BxHC+qP;:lYyﺭngaH;~!0uaĽN$g#mwKc7齆gOOZ[R("'|? v\qK6tD a^QRAp`[i٬qۣ9d'OyD `@D7Ui`ci^ !Xb U~mM5Yb & `tk)zjp̑\Y4_4x0>F<`eniͯo.(FA4 ׄWMsۙԲe= +tL"h*ĒVhˇr![@U$X=Z Q]:ͤq2=gCfI@`X*͝VP , Iu8QzM+ZMDf2]hGVʒ-+#@V0ht$SvGqKPtnMQ,Yd˒l9%CR[vK'L[ t@Lc'/}e}=g};bVwi,\׊ ;'beJ{$,rh]ڦlj>rh1Ge KOqa1vA؈k3 d qyϻDuŵ1s)4>ޫd@Sa9wDoXw}- ag*[nw:": }C"𔏁Er2^+^N9-lhO󽅽pnR%l#Sd1BVظ{뛂TTEǫ]` nzyg—gyK?; _OYcRݫ QuF>uՑ ӄy)&*[ٮ+~dÄ༷.+w, [W5@[ն.[mfT&s12[3?{t{;W\DHz#? TPf%ߏP?LR^<^/1Xap~!J1m՝+Ns7(B/rk Q0y U+HS (xP+OuDU#$GO CþHi[y398S1,e7q1WX{G^53ko|*ElݚtrH?~(TSKq4EHl*7k[6TV8qy?y.LGaUx3<j{{fzl>I9WaR4INh n Oj2f+iJ$&,IwropJ7^/n͝Ecu6DU8}5q%N\b-iʘD@JU?w͐ >)Bx>P,,3F?ͶҚ$:Uc,]G_h)3[38"N'T˵" |Sg6%lL8ue12/z/&1_c]'\sfOgR %ô_Vf|# N~1N,ܫkBԤVhtXK/YE@e=9c;Pti[Qڑf7$v'N4i;/әv&m:Sǭ86qbc0f1 ^>_}{yΙ{q뀾Q)!e)'BHy8ʖj>r\\ p]S"-;a ( $QNWQT^q4Yu45)0o@[_8 ٮcp)m/t?X'7 ߠ$]Dg9wolj#_X-Od A#&2>j &C2#\t: ưplFbm% R#,+\ ̀d\MԪu>iQVMt ˰gED6`' }ش-D>е)^ʤ:lkc ̳h``1ӦdJP"(d|3ZoZ&zՇd ɔHejƴ() Z{d~4uLL I8GN|5  "ʌLt%p@k&DT)*LY*OH6049VY!Ccm8=םf(<~˰TF"xfn!98yET*f&Fi^% UM _, G{Z*)d2ӓea?"Hݼ UPu!/?NssKUMZNsd@Go/,R8h[{ $xɓh:Wy$J{OZ+#'ϗ'3|JHB*2I ljk]GlY,{1ge{A ۗR? Ffb, Hn O'e]-7ba8ղ`b1Q {ӫ{M۶ۓ rm  Q@B cqunlH+[DP9W#%3;JX)WZiھ*u4FNqOm [ w~\(@n ̇ΧnO0.1fEacx@)G8'6٧]o<~0˧}tfr AAac\4ќ2n|-{oT}I|/8{ҖuZm0 ]bU06Vvm6w'q$/`Xv5wy fߋ5)Z ʠ@`X5LUIB6}W\Z$dMub|&f%K3H(D!MC#>WVWi).oǕbD#k#4H' |{n廪>.JȚy=J956;Nd8*;AM^pP_{9r&339ðL6ӭ<+l6[)mwV|*wφŠ~e]+z(7]d_H @h͒'_<9Ǝ>i +A"`vLRY@y3"PVyYMY!ƶ:!lNT*h I1jXA"4mlF,V 1UT( L3PtmQG/NIIVl-8\rIv,ܸn|8 jH? s4?qa4Q#!UMfwaQxkCSHiLbx%$YH<7lMoo1m5vN"H-?eABW"QN}vr|?g%=z4̉,*@mrPnH;>j.6DNqj[AFQh$ +7zj1[O[@'@厫)a-}$>.WKpU@IJD'^eyƲE"Gq W`14NsO?.teE,cvTQm7:T̕yxuGPTU1oDkwfH}KꉭaXEhZ:cs6XS0`|:b% {I2*V`@:POC)*2Br+V`ȩ[of9l8qm4uڤպ6դ^Mbݤ]lզۤUYU8)>al!~H/HOf ==,\;Z \ޯ\TS7Gq1_Ag*r!8]V$Ƙ-bpVx%J쯼ϭI;O<``\a9Icj4TX, ,Bj;n"{;.Q̉<(&ux4έ=\+MAp =3 <;.鵬Œ%9ALN9=a=әB4jkʋw7w%u.>;wƕ+*Uo?AQkģ|Ode$IAOΠ?'BAgptP4[gk{COwn6{i5fU>]OZd>1Iz0$BI *$(xzRiQ'q"⨴QBe0$p瘼( q0 %86M֝v]6^iKS4u3M`&PkMdu!ϵ:,OYgr= MۓKy_}A |WM՝] $#x-0-4p7Ȕ !C3DV<}]սi˷x64"K4.dI8~~HoBR4Eq!3M-,uL#>Pz;kBUӇpc8:ݶ(sJ"š-9z_d?' qJ剒 X+F?5j[O!i-2)bHɥ# -O2U5a8 ut|4w,ABnlm(a@! s_󅡮,vCg\aOT.<8E;F]xV{8L$VsÁT l:Ej ATKj.pb9/2+e̦b>˂"`) GQ w]IyT􁹺RŲ]0RNhc,:p)+ il^d|0VX^7K4y|m@4d'@W, 99|Yˮ/OUmda|{ǯpmc77@ńϕd6ƏJfmV}[RJ@zmF4Wu\ah:ų.i,*z2w'gOjEk x>N[ #_L:}Q328sL±J ?-ڿgdD2mۊ8ERHJN;j6m^RlQH{swq?eTrybs[%fz 5 ;\LۍRIv?1,=#$$1 7 .k09j=OF\ ^;4-~[+`&ГWMF)z,B{-uk.O&Vl۾Kcq$Vʹ9;ȭQ2 Q.4Hz7HˇY+M'Iwtvx8]`LD!\!A25ؿ>]r?O5(t÷C%Cnyw?`vc{y.Ko߼nxɁ0hQ޹^䬰7[xx`i[.9l7qo6_>f3MVd.O-#mn04H@nOi7U)M٘(o[()UGQ&@lw~i?h C(I^$P ,(O)B^" <O?`$~NԈgo?eT*+jyveKy(s(Fq@he[,N'S*Omv|yQ腣h50@39`s||F dj;CǃIJQh#z1PQW@O~{>h{+?1ϓ[? (Jfev2}4H=P)p A๥;CPQDQd h!4 ṻ8/Wۡo]W"9;O /łHDGh mJҦ,@i۞߈pe9\ c4 Xx8h$*@S_:q)l=>_t;CO*Պ8MeS|\hGn1 Vz.)ӧZZMfj6^(nRL12 6Y"_+1NL=/"\/W$P$t~K.PA{2,E.- ORl9ٹ/fEmfJ VaİjA'SvJ,zÀ1'9fhIIh2di6b# cZ{ ="(?cȽB+v8XZYug'/R̖X6IV-~IʦZ LehQJYz~҉W)!8U# BY[ !j t/ kmۊ0))(YS]H~(?h E؉Җ5(J)NqW<9HLCi4t͑ 8qL@bgd$F8ʰIY4Fl\^]U/ 3Tic 隨uvBWj/#KM* [,`s gr+ WW[\kTtX*lLwozb,>cS4 +̾"vϫ>8P 0S+d5IwGDp!#-WXAX*}'MJ\5dx/dLҿ~l1W/E(tM]6D H8l h//NOp>0lsxc.*a{,Bؘ.~H_G=fjDe BE5~6\e,/C6W[˚+#%^_km {HdeyȉHUsQ'&mc )IOE(q7)= p Obi~4+$-*ϸtWU(:>e9.)? ]zHdCw>o j<Ǜ/N<Z l9η!!o-u6[%GE2Uale65V+WEi MFnu,q΢4j*ygċᙙ:! zdrPHp ʳNJ &ͯ&Û -k+X&a,,ֲiǐ8d=iWg/j ݢ`o'n,Mv+ONk\q^閠̾ߤ`# O{1O !¸?(dXz4K%J]|S^wŧnn/eN;B,V ^ ]x-"nF~Nq5 Qi t8_ZƗ(bwf"J9YFPbQI 娷 %Yg.NMsrYΥ?~z_B,ZIDt4(*\@XL8Ea\mz> nq<6XAi!gZ"z傭 1hdk}[Rs /."&I( "hY8a+ާ7nZ9[; ^kfӌ#`9QַoYP.Tntyty(=^DGg{sgNP N,Ygb$U^+z'O ؕFq0uQbQoS$<ʩ$> Ek59CߜSqyVIue'M^ 8`)/ Y-NsXEewKٗfv[?]j  D?Ζ,<90i%^hXDZ-" ڹ/I\D1pRm}\'G]R$<CFq4-`v[ZgYVf8*Bbc/ X:^pQ-߆MgBP A &j*(L{4(  0xؙi*MԤJӯmkBRM'4Q3̎q+6z9ȜGNIZQ[ɱ΋ӶXZB2Kp޻`$vy{=GrqCͲPmϫw$Ͽލֻŧq܆~\_w{U03z1[Fʹ"H"cgz(D(=sMP; ܝ(r7}vS q8F=`$JUd%`4/4;'Pb` ;ìPEY!p*+_n7IDy*(o8$X` inTPgFȞt:Л!{XBp|%3sdnǻ,O@4Ao(ٓOdV$y'yJ2\磩qZNf4V558IaƷFo&ZMf0!B.b#|w641sC(gm[uUTl(QA@gta ڮM0Zq.=>JcY9(>Yè6'd$?wOoVۂ+l{PbwXYB|:?m}yj ҏ"d,RSsʽjH׿_|Qi?_Q H1F6l9EjH&~z^vrB0t4ؚ8xrRQ=S4)WoJLZ #pS%Y?vOςkyvv=V:Nsh ]D޿~ cDkRE!r54Jb` ˅z};R4N+b5Ce8ABC$KCln]G!>|UJ2EYz]PdN  7 U##e( ]1fF#]7D%of 2YvNv5^Vu ddĜ4UiBͩ[;{{l7tWr4C7UD 7zw:z|IEaHɧu%E{?F/L@#| e\ 0^(fofH)OLf?_BO?z~ZijZe rusl8t<dauǗ< P/@4Ocl*~~_ PQ61k]!8y 8;dubV뚠q^c?/+υtXCvc>?u @љma/lðf2d(6l^EHV%$, xX,1xA|qds{ޛC_p8xi6v{dQHDXjۉ/uYeA!p|1"O\T,ZZƒ(썱QDm f֚MZuIF*e?qr:`ϝ. JC/eNlV~oC=ʅ<@A]ah4pvtMNXqN@,``XI?FRgN'rIFOH< Y &|cn\S6=q"] 12`umO?H;Z^&DFbtvz5,)iRX,0:tD~m|:)Q4JҔGI{r`$0/WTP2lCu he&֎qL?| *"t p W̕eBV3D($@薶 0Ƙ륚;(+Gh6L( U|yR?DS&[eoU\hǮZ[<0]8dkŪp蕏BfLrq./>xH@Aq#N˳ptMr$CRGfTԡ/IZD}dx9Uj$ ϻ9FRfN ݇ǜ͔TQl 8>DP5XP=xRYEmFZ=X?|x=@B}ǚЯRs(;G%0R&1T̉>}Mope.Q䴅jO0R mP@Bgb,-t\-=ZƩ$!I.MW6+DM((<{KL&Oolo_!T-}|r 8׹l#;+M >k?/7ktdr5hѿkG:P6}k! ֦P[͇4V4 +gRO뽳ԏ|7d8enz3i3wD2A.\7 BsSw{u(gLL$KGPwI{ZFC HW(h0TW]g?p Mi*b5)d1R[[K^l?v^Tdkʕ8=zz(7&q^9vX8R:IptmSav-[.MӴڬ&$@ il`+Vu]'qbN,#syd>^ly?:C\Yt:X7[],Yɑ* ,^Fg~[hJbS}r*!({ zCbeY.ą7=yqb3)*NiO} UطR.EU.!z)sg:4yB*~b ,mQS8-l"8xw} eT.L0h)Ja,Eցb08ri 4N׃u<2Ht[ں6_U,šoyAőqjyLS*XT7DV m ŮG+{ۍmpLƵZMG!̍fcpUv,UtyY@i q`9,}?e 5T? FdAPLtp={iQ%vIRpEZλ 27V28ST(>9qǼhNtK Ɛ{2͝|.Ѻ9"?}tOF}?:3%A_s͸v#\ܐW:K#1p=_,<ŹsR=e1wslj}˲XTJdA\, u9H wp6Ye&J#z)qxshu$F'vT*DZ`B,JZj 'Tvd'-#+2o=Tcy 7v`xy&+l<^m_V*~ NWpF8CXvgWǯG֭,1;λoj+59 x/Ε_ ћm$Z= %ɘsH~,Ė|3Ƒ{8Yi}G_^`Zߏ *Wz?kt90~-}fqV4"K",(xIQNNS?~I!<iI.6F}x%ΝEA:|F}c2:`0')EDDp -tg^9}ԛq1*eѳߊ6wQ 5#5ʢ!nZ{9(>n|ZR4֐<Q*"A љ=mEa\H !!BlI3i<=ji33q&I-lBҫ]z{W\x }ttGǢt'LLAcY4@w)`X`fr av.XIڎا\/'еs3&Udy"Å_˝|*p<Ӭrx^yڭR,Bޯ=룁ܪ5[3e4lpi' u.ȃڗbNv/_׏j_o`ɀ<*Z:ET7eա{ u~YɐB H@ %#x̕Ip8D#Q*0 6eQܙz%rF" `'h@sXF0 eyMyKXMcxjoV o IGRE|K!ato뜷+AO7(v6N`T(Y&t Nhm:[a.0> nn4 ӀV7g cX!]`88nX)j/wn`12+|<(KUD"X9ʼnWщ XxxVܮ\fi Gݠ>,]5S#L&F<'k{#EIlA Eqn '87Ma7KgUnW9yyu0T |fmt2)8|.QbM[e4%qm}+#e"8sP3;"g~;(ZZ6'~eh IЙaFN[0⥢J̙sd zpD@ dfGp2OEß`ۦi1f}H%iqЌWz~qyK"V:m!/dsU.8#@8FFd7{M|61{o$< q%J.ebaE1w\Rx QyHjɏ4^$%a^$|RY!횶PF8i,5Ե0L/:g )Dx4Ŭ1uYF"؊mT7VXm7R׵Z[s~zF?{w>ѭc/FGڑ1<Np:p;cZ);xRM,SYeaPB`F#4s䇝J<_)O((`4vV+_He:٣M?gd,.,4k00t{oMx_HdZ[A>uǚ2YZVi S6ߞL5;-#{/EתjRFV7l)zpx`\%;'A쩣Ks1r_nxncӽ +eD2ɯ1\6ԘN(\^TuB }1iu>zdL8t Z;w޹6`b^?KB77`Ol8]5:f&6-SABd"֥^Ƌu"fDpyqr ͬ-Y{)naLrQ;F!Zܚ408Ig[dδ3E/rivO;,˖$tg.>YE0 !t:s)I\v83niA\?CO0 K@$nB>!x%#EX؀!rn5ɸ`dCڨʕnGw~GUE u퍇_ HD?#v9/jP\iBAb֒jt6l_Zm)g)T]4^7)y N?#?LޭGϞy6%D$.ɁqP}G)$ BM=ԋ!:-iop\,mkjb[EF7u!$BDhZS?nϴs~g}} r\}QQ1dzSӦ>NXz7D 5QM }1B8@x<BUUв]!1n*r ӓ7I) #( v}@3BZO?dI*H]5)I."X!]{\!$ 2 n2$!%5sFR4I˥X{&o_GtI7_a4IQYAujAkY=tjgh 0M p !d Ry{|4Gi)ljhaԞ! 붕6(o\] @&Sw- \N('5q]Y/YL%dFČLl渁(fAsCḙ|!?8!d֤ 'aR 7wϔ2RD36F:b&oA8,`D`#)ppOq$B]7Q2~pxg93F/X jE_˛8YxYA$qAh#/[zӦ4%%1u>1?>>xP;>V c@fi8al,N^y{{~tt mډˊջk:4CK&2Mh^-g\5B3c{V_U݅Ed*AHdr)5e떣Y(Dﺦq8ZZQ\dsk~z&wcUI ٿuDO|4FHU@x ѹma>asMr#iB]۬Z;m&/ Mz]vA@6x{/\ $}Ǚ?/YN:ӫ4A`u$[O/?̀&YEJ7n]%tNT3bԜ;6wNcb-E!w/Gu|o.eFi\莡ZV{?_h[574H5@Z#?\Tˀi`;\2d>wi ܉5Tsj߿>ziwGdMA <'|vT~ Ӻk &ȭa{|q;o"Ax7ZNWcSמ抢|uyvӒDVH^IkHƣ!F`mˎTww7++fl^gRg簨%orLy`^޹y }ʋ%N|!OI~A4Q"h g[uMrZD*5;2MQ8U$,HCs4IRyy^]ӿӢs|nN NrE9՜ezq¶6 vNʦ? G` ],`a8-qqXjM /THu[n愿Q^v(B$,|6k\]omnAP ~ZYk5Os j?U@KZq-1ܾ?lN}B`E3QʠRFr\Kո:]9E^X}4:|>vM|f5 w<2?7߈ aIb9, ;wd~b%1ө=;=: 2}[ĸY_5NgYWu0l@˷?~28<*T|{K34lqz;;|do/Y>xMB]ds›h]@6>Xc'H*@6K )akxkgՓ'VW6')9~=LH, sd3G FF` xh!Q\Rb$(o<YخERQĬl cj77(S%5ʮmKo뛶D,#Ƶ||  Ģ Ob >Ezh,D2VedE~Z.?Uo0xs&jl ڶçȬP,O W4~_i}l>KK|HRp-ƣa? ӳ_~2~՛^VvW EưצNIrԜM2 E0/r3pEk,0Re0 dIᳳvA1(<))Š,[7̷vѤH I ޾17BDbD2pokUy}rv~,IJw-?`0f23 'RTTמF16F8X8hoְ=:I5-֭r\$QYZ^NCYP(Ԃ0浻8/f zbsegn#8F$XA a1n4YKxFaFxpNUUgb< 7UW;N۾3\.m:Ra0 z}qa~$$sʥ&bhFcl@ @ddkTm0E٢2":rF! gj!U,(C#p F~؞#D<^GO?~2kl9D%~~fp慵CdNRLowͫ?1!Ǘ.\`nE^ZpM (1Q s25n PJQTM3!ibQ)mme}{T nޕhLaaj)_ڍޕ4-,YetPcPLH$Uy@'A߮//?KDڴќ|n^}M@K5ZYn]q2>JL^}qÐEgY%]TWQʩt>m8mjSAւJp4a=+?9*˚v_e95Κk\`Xu-=Gpt\}/5@[מdLΈdH%hr4B\ɧYjDdD`0攗c>)  y4mEa(D!X6HKXc'NqEl\dY[D;D^.+;>RhAXA联sXslSM [XLI(# lBR 4ЄRʲ%OHL'N!N @dzY?k-c.; :O~q|^seW/|zqp9=|,!p8Βtg}(;ۆ!fy&v Ka`&|H`z]l%Si"*Fz8CI'Ǐ [+ zCgg: pb2 W|'r1^0RIEQ.)'Ċ e)[mZ$ @VrDRzJNO-^;g-( 1T@Jsm dL|HOxl4QI""h\4j^-,oOR[Nɥbgq6M!6ad_.'8d魽EşVAik,A@a d:)KH Q|UCgrZ l:.b\k6{!i6+0ȗ|ͬ"$NҹjaObXe)[?8::^n׺wc,ޭ䥖U 2nN4Ph_3`w:@s}p0nJVv d6qLg=Zc(]K =|$cf-nCF5j/wb)["+\gGwq9QVͨ|c#IL%\@׳uXv zq%+ӭǷii[մ(bQpL3i.v} 7_pgc`|\9mWm,ݲ spXp|8oXԘ~W(zuw\)$%߾5 "AgZJ '[r1W ̈́B3 Ƙo bJ]!k4rZD.>wVdanTbRnjO)ӪRu[8E\ 񷓞iJQNҶLy C=ʸȆF|-tC2AWVlEB8Π\ʥ7p !flv,B@ŽB8:ߦ(%v&M$mV( n&4i`_ЁJ(ܛv|; -ۯ9={L___iU$z<ohN0q|_ O2Ē2;VG2稈DG5Jӹgx(*+I`#>f\gb!bOXB&HV$rYdJUIz=A-'@J`$)B1DX dn~VIhӛ[qqGirC$4MTz;8o@Tsj^ ŵ Cq g 4%P ,!x<ϓ kf ŗ[ S,Nfl@PB?~ Q:lF,\/rf.urbuT@fbQGp;6'.`E.LYY%iR35Ye5NUU5qlwy=cnm?@?c:{ozQٓH NeR.h~qF֪e Jv/.- t3۪i2#Rrp̘[ j^˂>ܼY)׊Ld*^ "S}r-|4D,fgo%\(lqE'sˍOE@5H~s8 >EA,#۷vEZ`wAh9iafZZR^d A*e}>S5$ļ*J1W{{aZ_TrZ4R>l*fV[U;aX$(鷟;-ϳG $[Wo֫70t9xit\7rI]sP'0_c2louȐ(ZT RLjF}gTG3t:R=+p4x}08FGPlI_/vvw>:ؽۛ@x.'O6uF拕=V-Qg Ý32WehݨcR뚸DBקl2+$ː43"^l Lj,@  ZY^\cL|ynX+ZASsoԁcwoyt mh8BEDED1@j @_9Rמځ]={;pק__ά9m3 El0f];NE7lozL;Ʊ$$6ް-hAOP9yF1A4BzxMF& <)gysq FH}MSFN' Tmv2`.A$ğ1 f=ڛwTLЭ0_jFP$@X[IR֪CAPYEv!E' c8^@_"ߝ^ZL$jF…G.( Xژ) 2zL6Ci.pX/YWG:8H zZe~O?y(/ GDӡr?Q2K. ,M=$`Q%} ExP,!K#v:MK[;W(nhAvqЗ“E1 G`x,ȓ~"#QmoCYE~(UxF<zlne#\({t<6&B$͂y;/w:0_δi#㖬ۺ}Ƿ-!!\ 3]gڙ~QfhtJK! rv؎,;,ɒlY꺟`G>?oOm't= uYSdSݐflOXL c=T%CE1ԉ H QDCtQ]ÐL! !,ͅ+~e<365h{c\G$$(ܳg鋒 Թ`xIi,S <"Pgb@q\S'fknShLl>$H4}@1@bSvLctg^wu>Vy:ݍ[7jRұL_1$1 ~vPC@pPKHgŰ"r4,H%!Կ6.JHegm'zMy8P R.HٕJ*ǚ[`|8F5VÑv6 Jm RP!BOyqRr"~`^Td2) .h֪i$%I a߶#ٻb TV'WSJF1^_ 'C;̉ Accforej~{O҃C!AÁ{z=p!؀#aRS5Y9.@LN<˃ -A1vv \5jA#TeZ' wUNX|tOsD:]vw?MP),1g E P .؅LIdi MW3e׵}\"\z_o'Eg۶qwR$%QԾڒ"q AhS/}>P} 4M$m$^dks$IQ"ŝ 0~x4eOm5wYk}S,2zb'Kq04juACzqq34&BdE:N)*Z\?י:&n'0=`dJp=Q'lV-Vo䒙 4MlbpF0%K\2 [H9t`3A2W7 I<쟏ŴONo6F<>(Lr[7?>̊725AvfJޱbe}mߍ]",y1W  dž!pu8 JLײTF' vv[b"M f 0BMppX78Gp2V~WAGJ[6c8TBX lq(Cb5GVdR"KR^jw6Yzst@/2g3E>>z&jgCH_qd%iM Nd ๫[tKBMΑd7/9/Տ Q )+@\B "du` n8VS崵 5&4̣yEC ["o>OO/SC9VAo[Q8||9fO7z<&@`iVgklQgx"uDC bZ OȊ{͝K?m߹ٺ̧O^=?X(\;< "|O_Zb:8'HL%M30g+@𣓡 a c"/V>Pyz֋XN暦-:51Ťila4`Pd;Xe R5>G[mt˕ul|cٱnhR5 b !@Z iSxTF2P(pY)\6TLT˧|Ptf[Qwcll@ dHNtZUEZU]Vjڙ,&JȐ!lf5xrG_=j4ɣǬDpERmv𰞜 A}2:0EƋ=ɤسɜG<^N7gH 2XZ}k0&t^Rk=yˆ^1m'/fX,e Ek3)+ @>t$L|pxtWgIt**,Km[Swk=JQ IYcNss9Ul?p5 bY 60XbZm0Q]/D B7t߾|clmoИFCԼ+9$B;!:ZOdnP !IG?} BzF4j;;(. g3@XU'Z#VQE$@x0{}>3O#(R?LGzA:A8@41hEET ˷[Wg]s`r*+8I&xFMt}Y(@k@$~7g ~͸ z okc`DK0$%)_>r2࿆\ByxNckZ!sۭ pR\:\DԒaRMBֆ$U $O˲8ڮ]7#0lOm201&kr\i,NJ*Hdߞ7A[^M' k<#R! j&)ÅC8/KoK!m@K@i6;q؊eǛv[Ջν|f9؋^~zRv6 "'˒nfEЍ[; $DXUJˎGiOZp >4|"v5U[+p 9 kLϯ=k2EVʧb[a PIxū,']̜17Xm6xètWjEVnM(WrDؗ"pFw?ꕷNwUσ7YzI+,.˟g,R(Yo'CǕ o? rc©f7tjrtL7p`bd `|a$sǗ'xu7Nl1Ҟ~%Ķ8 $"QxPvgրKmɫAƸe :m08kGH8X2]7 %ibd0hrK7^AZTxq\qg tZRUJ*F\׷L &ËѠ?*U3o+|.BkӇɥިe,@Qb6\ Q$Iɠ]8|=HXlhViG^c/v"QY{~KT (-&KƝ\|+Dժ@hvAb -rZ!'UO~Fxtr^Rͬ77= C߻5|A̙'#53aw̒ uqu޽u!lwU>K1D [ b$ǰPl{kO$ki h~4~TO狵9u!1,*P2셉NYLbI7blou_?" d?Z.0xY`JR)Z@-wiʭ#hR+A- BS**j[k ZnT5gC7.{˳^s0_-ӡ ͫܳOBIK, YJ1{r||)Z8ot{2%{t dQ]@>f%2WRfu߮^蚾Un|d/?g`rH_ZHd>ejNGt$KX{F$LtA8 0/0mr1YN4^xJ{w'AdeTK1Y3S v/;@b17\MNIŀY8yIغE& 8:6( %X6djv'&_;ILN:N[hG; |ba9xP#T1o7z v}I$ƣ( ;4KNjaY??h}cQ1)L1o?<4 tV2/.h '(׾o1,{zWd$\ρ{Dz10^*Vm\@"j^Sbh4M+N&+zlZux#_/f?? qa65 eb]xѶ`)i-Y"\r:'9*{ץ0[PcEFkx5%M0OInV[cq9:w0n={(hNs$DAuMB\:wWaq/F1_pIVB4M|RXRJ[I4G`$8X_RT1dtfYV>q ht@4vx;Yۉ3r՘$xFȕK:q&s餔wcкl/M&B'3mUiD++>T\iۅ>63^PL|TzRbhrŁ (`&ѻb9GLKm0D+j-UhwuWoz4k.^K+q\FهNmY~՘g(NA4M>GέV^y)()80 kj孒ds9Sr'>}E t9]&mzGUMGf q۱!O bX=fKbrFkb FZr( cNՍ䌒mwLò ل :N*<Ő~sgJT,G{ڥi&Ă5WGS' gJˆuxv^1q ;*OߦU 586znfnۡ">, ig50eesi::/I 'e ZNI2lc]`!Ī ƌF%wƭ(Y+#G#h]wQY Hf8@+e6z`I`E>{y9Mc t?8:洭(kAHEB`̎̓>t~әf&C6m񒉳؎c HB,+=}s9F\.D/3"B4l?>BkKFCkX%O.3tUjy˳Y>U( vhx1mߛ 9N5+4(x9ŝSxm.h'f^)i{uZA4,MrNR4E;]6RBd۬l[OO:krpB PvCsNvl%lL3MR:*A- +l;;ue0ЃU McIlY٢ z3+! :(xCr/ǧ\et,jHѼ 6^X{1rowf@nkHR(%7&i@>,joeir@>_zK&b"Vsplt-TNEoK{Oy@]&51Cbd&rnV@XswbprO4:YO,qE!O48#QoNf\&{wƙ2n?^0B6nv=ACdd k@Q/豘G0pW7J#C,Ŕ ÃN1N_KG,$ z*_,Äw*ˈnX,W*ڼ?#5Lb&<_˃uLKWIDl9El(rhj:gi"1>7A߿/2`Q֪zu~i{4P2M %tTU3XBa:4\ӗgTyF. [B]Qq=aSn!gv4$Ҡ>HX^ mӞ5crsV%mBƻn&m&M;oiod)q d K @=Uswߕtn!d:#<,sŝge V\ŅxrXCh[4F9} E5 p`}ulHLjp|Ӽjcy^a2 _si1;tZ}-\ \-R1vՖpO1[<` ;T!fQ+\ʗ('Ph#P^2#N5!au E5cYI- x,M|&؜i-16B"(*e"B)IЄa[.DYCfw^d-ud[5-Z9LÃc6X/#lܟ82[ڃv3qlݙH'9CThAhܑ?_\s-I,OrxdݩzjzC1̖H:!,B.(^yl ۴[}硻0|`+%0 }5s2 ٷg?y/ mj c~=]rXC3ID/~[a/) (7ul6\߽֔C}4kSSUm&C & їl$3zٳJr]ImXo5(Uڭ]eis_d,:Jfk5Fht&ȗ'g)8"yT b|jnHWWW^hKE77de"kQVpɨx@swpE&AY*)8kZ䁋bEe96\$G~i=FZ'kHѫtys:ug8e*AdūW4Ǚ֭wt5L%Hz3dA+xNId5Rb|HLm(JaGAT>5zy-3[kwHs7ʤrOv|eV1D`U-;v%H"SCnv㣬(:68+W/:retlS{a~oyFnRabibA;&H(n{.Q2u6bh2QzJĒnp,_Z/e\Wn.!'a7m 8D%/%62"M-עEGb'8Z$!QT?O| s~ %cr`Ff( :&pAYX7Xc'Z Y`yCk͐yA܀Y ,Usux(XQ| *B^ t!aL!y,5 j8.iݍ J,Fi.%A?Y{d N~_޼If1_&$)( SXU{_\M+VkbՀNլ֍-]~؞%v}Nı%W$DUCłkb ='.똓Xȶ,%KYI{F؊ë cAo/aaųfR^`rr'7'F]Mvv6pfF3ACtk͛͝ջHx,$Ҳ' E;g:O9W&aؿo\tNH.@u.1ƶ(\+ܚ\An]"imlyc];a4u7#? gE m{ތx+ZPη"*8U;cy?_խFgbnQV0t:`ʸ C ^,s7{|s2`/Vr K9IߔbAWz^4Dt"c(DБ9P<)PVQyt˓_e(E%P]r2o 4D^9R&jZ=DIRC5!7OhHvZϾ}sL\I$L,qVQu< tn}wF62`ͦcAz/a$O˔縠FXp4.^\ 8A¦^ 0 {:'Mj={-na9/ ,r]Ma+Ѫ  癕X]7K0lQ. Y{k%K<ʡhس&t $YW{'YXŒ,6`!Z^:W8yWwO|wx~h\̟zHy fi@<um9s/3bNFR;:%8U !E`ü_&iT(9[8*Pvw%T>Oάm#]$Mq.َl[(ЇE4h&m$Hز,Iqpf91sI0 qEh~a4Yܠ0jNr4v:E?r]kTb*Q^ʋ=I GGqsxèEyy?ܙ~Rq( x>ʬ3F GP$/M}K ˴[4 Q/A1+Z;S̝G֝x:@Yt&.Ne"$ :ӼB֛u!c!.Z0M7v.`A%G,Ls֥BWe}6;琢%[aYfy ipӽjO)V;b9])ʒTz^V " 特k ]44"qZmHd&wh-3%. NoQQQ*H94^X{kkKk +E *G/ L@f 7>Ơ m x(J@I Al>Z-Fy_^%6J@ʋ MXVirox1]*ypC 0eb6GqɨjŃzh{wk4ZES4| Sm*U l'zcl TTwOQBE3 N7|ŨRQrd/,ϳóYIO^g S4HEF(az4Df{ux`ĬO#SWX|\ -@CXdfn|M3XUsh*H$ Gs{y~kĩfU1 \ֵ-T) t"Y!))qEh̏ڥ `r6ssz'*b/ 䊈`Cs Uh=.4j>}64Aw*$G8&Q@ 3AAW?>OGGFA9S̟V`$ rJevlz; \ ݋> l/1M90, #h=˾$)U*abPtqanzI4`DWE(AD &>nmoif<^U"M8cl;Il$8hxF%6t4g&Yۇnq"maл-u߷SÍW$ؿ% "T|GC܏QfT@v2\Tg0t=9q2y+*U+t-F7U2h2u-12Ӌ9N\a-A&[b¢xsc:Ԇ @̝n;@|ԬUM@ /7V'A$RR˱(QU&~95 CsTca䆮Ky}f6RQٛ۹ +՟bӸxL!BfZ&\BO%K2Nux9PtҺ6v^%ʀ Ep"]8fɋj _ |̣erv MKRߟ gfFDc~,@JJnڰ FRKЃUl$p~6\ &y!Tc=prfbǿ6㺞83ztHYWй=ӔLm14x\(DȞ{Jܽ{\\,`CO}BH )Vi$a1VbhFID(xl|#V$ۼZ8DQxCk@t?%YdH5a.$|0[1mP@ʲd;/4-TD0ecqp29w@[^$OᲔ^g.GZdFXa\jM1n/hϧzhTT'g@GptmQy 6q.[մM֏'mӦUQ7ꖪɔ[6݀m1> w|8:3)t Ţ$- Dܵ{4-JY'qA |; {Tk5kH(N綉*0T4lka%lmM!3]דd7WĠ%o<޻<EPʳ#}]0B+HfDBj7NN޼>^N8͗ ekhd%Ksqx@,Ŗp)Q[[HNhZq9+IqUI"&]Ȳ뫋A[zt6W:y|ld-A3ÌP$*9BrlX+P-k/YOGRh/z0xA1'n&³BFf]L*CPRvU$Qei0QYs֨//^v6|vm&3ias8iJ;B_dF͆nm0G KUҫ81g@!qyr4Nr|sYă~͛?Aӓ_ͶM^oncCna۶=w F`z Zt/<~~pɔHHootxCQOWOOpݽr1gJ#mBUƓᇏ,elk&rFaܲHVdj֕x*$Ld%xE(*̢`3,A^/OKaR2@A H"|>&=(1hEwM (ݚ{E#ly|^۬xK ƂʄC2p>1#{AHDRD+8N3tQBcIdar+w?Hvڻ݃R,VQfj!8I*I1 i98A"p\DN`r|ehZWTϴ<\7f$^SFd;P(yAU*DD^A#yG>LlΑLpt^m[Q8ĩM$/9qҸMAm_>-EP4ilˎmɖ%YCܻy#H;=L?_mޥk(KVEEwv>xGotU=]]N ,4EN 흩37 scM yC,e3oA8"N` r#$ 0|LgOVFJOA]4jr{Y(A\\ǃC3g};r-AܬHfSiP8pt9fJt] +BL omm&TvyfD;ҙ:_0o3\ `;{b#VedX\.̐ӠHʮJXfv4>7|Eϳ oWggejnԤb[K0AIT$X-(`Me@b$ pli:D_6۞AFG}qk)ZΆ}#YJ3f/?VՌDO[ [5?tRg5B#ӷ$YP;OOϫtH DZ[;-FT0<rovL*U#3ઈ˫U^? dyu1uUFDZ?{{b1X.ӥ3 9 C0t $Y v,~V1O,%G|_/~o:hVZp &2Du4,Y0޳`ۑWCEU%:0ՠ_Dԗ:Rِ'k}~zcJ*(Hbұ6ʥXr vi~y;׳$DbNyCHQelFvs93/ZtF>+GG ;W@vZ!q>rl 11˄l>'cCXaaPks؋tIӶ~yiaF/Z'%i{H!{+v`{ $U!nLmFIC qal?ًqWfPXk$\#Nle8~ufu*f.rO)%6[brW7KѦPxq{ރ l3h8y釗/պF` Xs " MYfNty±t2Z0W5Lc=Yק$U|).:&$OvP6=7hzN5V`u X~B3l\uu E*\D8IW""(/U])H9N`?%0?;ax.DͲa8B` ިջ;2X?6OcC4L2Ḥ%HUUau 5őj_]ԑ^ł(BNLtӀۏGW~?/Gۦql09NLS3mnv;mնMM7ڴ6M$DZ9/{= A;sXB!EeH"WcU{{ٗss=hzo>FqBKT@!ltx+#$ug{2 Q~A"q=tpMD61U "kR-9dNfOH I,!([&0{ﴷ.&NCl5Mqc>VZ{yw2羣b*E=]=@w:f~|>^ܚEqz<`") 8Y:"eۢXT-)B5ܩ`tb"!*q\䘁"-ED|O7Ve{=#O-NcF%$Cxx|9Bzo<$H믶 cqG8ӊi}]:Ex']t=gSC]~"<#G+T+ /(ƥI\Ehl\PN\'xYwыr׷1l=1.6ԙJzп,gxjܟtI.>|zhjۻ[fp aZwxջ&ë["|h󙴭7kv} _dxÓZ&O`.p;69VlIoȃIR/e6rh YPHeY-4J+7 %n&fCB:y lOnFXE(ʳ,5hl _aJ#]V:N~yx(Ts/~)rwחՖ,ވ-jCz^%˟_}8 OfLagy1ϊ46ֵlf+CeaN4v|ڭ%e f*pHӉ53i^&GP(Gs`ٝwucY:-l7mӒF7+Y^,q(XlR1430,,D(T<ۮ I|VX.C?ԟ`t Rw> ؊;sgV NVףR,EqXǓKJ @ѹmqmh 'rjUM&mڤݴٟjz.v Q8cc|l^~H?ck*((YdIɸsAtڪoA'/`P:C)3-Ė η͖jL@ZF 2UuƠ<)DfeZ&̘)G1Q:(uw4-06jny$O;JI"Pi9X$)\by&@xe hh/^^]_,7A7\-l׷;G]3vvc!~I((ƉĜvf%ؤ4Ē_Y"8~!j ڋyM`H`9D!t+'Vn)Fa,-lh^bQL3DɠP(=W( F6K-P&LphWuE(ޝtMYHı4)W"MB뵽/G59|{wŢ:}VhڝNH1ͧV:2n|jFmIgT&^O$Myc \+펰S ) Xhf<ĀXIlj&c~]?{]ZKEDjhx+,f{rqk\yӯgޟ U&wvw}ۆ xWG/nWW4~}ފGw2\}Q93qoIX%=<*OpJguV'pr>'B (w#NµE3]k0 '͍&bxN,p!LhOl!%3JЁՖ5X~ CaҤ#ib1ILg8N4`Uw \QyT( d&`Eax '1YTK7_΄Gm+0l 3tL֪{V/fm"%]&t„Jl}K~=;u/ŗ*B@HQ3/UY')L8ͯ 5N,JT s)9'ckoӝ@wMZ Ǒ\czMb*E (itbqi%:GmX_]R8+57gұ Q>q ''bI A =KЎ5;;{5UbПYf]J^3(. 7nq^Z:n;@Y??zp P]IU9 x=Ü"O6#ΫZ5Wױ1\p Ȥ,3y?Nq6C=YΟoY;V<{j2 홗 m]eLoz]uC\jŘjַa$H*H3[; VI"PqqQ̞A$,Jj_>=H`U:K, mf5F/vN[>>);wNeG))B_U%a%kb<0krMr'3>?흟[B'mqk[͗<4ؾFt6K9qhakZ( %dHDvVk~ǣ!8N|g9}vNH)b &Pt`xS<$ zVdLӔqt2MS?L BZi+!Wdgp1H]ӲVm]"[Ro%+3EA"+'󭝶i'g4_ͭ=s$HpPepUNڂDxb(IS}w?+J2*kj;Zތ˜zT[H\b g{AY6RQd,GBMc"AE<Ö[1\C1œr `Et97:  :E<*Wޛ w޺}s44`͖ʰgx<䑼m沔i2IRIϟznq5i-0L E i/\kt,_$܏=rZ 8X stxҚA #!qd4˳<}+RW흢epE"|P,8~hƕ,$Y820Mk 5\Cb9FQb$j%0 Pb| 2k,yN,B3mۊ0gR8Dj%qRd-д]n;E 4Hd (8* n {=@Lk|%pX(a3e1):]WO&|*THt٘H W4JXد): "Hrlb0=P˗[yt6# b8bn l6#^}K,*ݳ;L>7˾0R&4N`IbA߲r%'$Y$ DHMR~fؿ=^/kʣ4^[^ćN$iOPo<-\= B g(VQ$ bBJ"8.=S%m b"/FR'ٲYGcw)9-Q?6;Г\pnk((sU($uia})muE>8ߞ=C8lCnfn0 52MpΛvXW+M="'.zG| Q8jo_Tߵ:^ܿ}r)|KJ@?oQT;* |zk A&+@{+Kͫx9ܻQwmZN`Y1Ʊ'ju&aLE4m`1 CF<|3M>ϿkO^%7g4 &oDalyNE AӟMv޿uC-s{*(iyd^1)X,fP؞8 gMz`T{|yil*4kZA0 )$!,gfg:yqFLB/JYcУm_v  ,t*+$g/3:ū1M Kw6l6s3cXIFؓhͶCDC/^:]YkW]͢Fdybn&$oBRJ??},y(Cib'vckKm`=|:S'B+hj a EN1 P4EQÊ8FʝaX^n ~X~B#CF0&/Ut(W\{ezɳ;xQ-)sj~iĮ:U2 [Gpvؖ%,0i_>ޱ'ih#xTO_uN6•zQfv1@У,7Ioo@([y`2)t;0 I l*:8>h **Xu~OҜ{$b ؎ۆaw>hKlAAOл48_R΅ QOPD,l5^X&f8X4fx:1Afuyr;ĶGBcNGK׬ȎYFF850= )2^{_덵i&( k[r|ޘW0 ۄڂda>#d}C_X,r"gmA鈸Aڝ\M*6Y11(B ]@aj _*dA/64S:GAPl!'2g Xtn5n}8=3f`#C[tʬ@PYKAh\uLw|A) RJh`c kD35\+m5-׋3) eBGP8qp}1T'!=big"kOXǿP00 ͗,IA*,:Yu]mR2\ʹyƲXjʤոiwʓ"qZnIR]@(CI/*cU' 4,5Ϣ@g4/3$K=30l",mֳX`ߊ+ڇIaN罿z}%Ҟf#5A^jAFe N뒮16̞cId岬Tk5m5﻽.Y8!8 w.Qv0bktc#Ď*{t0=d:E1Q%1aၫW Bo^zYu`\@H84M6 d"`Π PK cːR> Wo^ݵ/|:gd4B㑩i%db#T=KCw$ъҞ\\EGŸ@s[/\6N+jE;B\{;r%xAxu D /S\ Rgj̶ND]Sgg7ZqN8%e!r"J  /,V`h?Y/BT4Ԙt=dX=!.6\t>pp)|iych:Z.ހ^~z ̝ۯF#paY pF76բ2J#(o#/B {t5Y@ԫ&F߼!q?h@Կx^X~Lײlq.L|qh7Ğ"jWDBM$9ΰZ}C3!QDKyg,))8`L-79zRֲzmY4.q %eQFz} ,"(I>\٭^[Ku- o\b? A0(Jm b^7ξCF]ɨB `8jU@>hM+UXg)~}=fctj\nǃE%ӟ.߷_Pr}zٮY`JgK+5g xKBsieq CEA0IYd2oB!4 (ru,& @Cc8"8<0,Ht};ϯ*٫Q'֥BnV<:QӜ>\zڭz{<2}wWukj-?n]nYz\IM\Nn'n福Q5| P0V{n.'M<YUL@wD"eq:3`'px09`aATpGRZeB^jÿhP){W %56 ϏJj6xuush8m"S@ ʊP8JE82MY^]+<Aj Gګ/MFËN5O\m5/>wbs ( =hqP[ss:Kq$XV2yN|…UQe0~Zu  EZLjXl>8DZM֋hvھ9D!8jҝe 5\C "\\E*gG'Vةl1'$:K=Y /]Z@0L6ߚ}~p ښ-*By5;9> ̌8dC4O `T{r0 QWHgLTn.hUduM=}d]Rq].؋j9{pQ0-\4-bkо_)$; Ǿ5V-U$!yџǧ' [֌Z,]tD16!mh2%Dh@Lev09&|:KmWՒj M4MOMcuzw}c)`t0E3M(63K$&M2r beSԙ`$.WEF'7L@a,݇0^qRp ް@ÃG)" f3/N>[ٳ4155YaP7-#QEq̗, 8#3hI1dd2:O/ϝM,S7Еm ټ %E6`HvDj9IEV 3 `5e]HDPt:oz>?u;0Ƥۻl.@t+iU_Zt}XB(JCB=Eh8HNK6hix?6..;O}2ĂWIM+\T*I666NL;S>36IM6QQQ;='`? ~cS6ZqG0 wὛvZ->[z~⟁"HΖ #&NZsz AO1:@Lm.6r[$ \2'$DdY2g!Sq[w$QLV3i:qR|nZ>qB-Sr1"X=x'"['n5 <>^;gqlY qtW=vUZY6 ɘL 0S7Ly|=R/I,4otRu$8NpąsE|Id6d{:Wf!pCryypueB6X~Uֶt8}ULkim tޏmb5V?Pc/C>xUG7@Ob8Ϗ~|/砄13ukCQjE, 憊2)L "N^uɁWί޻@t[*VJSyLjl gNHk{>Fct g `**4 T`xJmaؑ,e# pIl=H5H50O7gPәFD\c"~ /^*ƐaXQws`>[P Xʣ~ I.ҭF %ֶ\kԁY||p[%(In8m#;CƮU>"NBcbI^Uk9ƳBcmBXхl$Yd[_aEIɤכu е6vc>t]eI4צc+c9o(Q/p$8PMc]7Cf"fWF;7-P|="їןQrxǏXt*!|`@'̉`ӻ_޹>%P=?8:K|MHBR(:R=?j&MS)ժ9[bdֱӑAמ/$:L?D?FlSXq΂|wzv4 ]k2v FY_^ R{ -f J} |!Th<$ϨMI]#(<=:Y#lAB*$ >eMAA'I%ѡ(EA,ߵV{{{GGƅ+Q3% R4M┧yփ,ߜx`,sNt<Nn 8QjͳrE ZVbڠ 0Y`8  K =uߕe&2Gmئ(BG IqY#۲Aj;,"-f ponh16F$@ #j\ z?wLUߙ08x_ aANyd%E T!PnRl.5}Wn2Eyix$$2[BKbԈ. p8~Ap~ `Jݗ{nr]V+;~"bh/w?aXx ,x1wdc6XKLx`З5,BΌ̕V #Kgx& (7IW\dpVsp%12&DYSI`24C$J2, ><'X*!>b>o_tyx=`wznDx%8Q M=7 NW+,N2sQD GJ%N{(",_#/1{.TAY}8e9~U: G,Mi]Ni& ژ9~_ƕFA VyA ̝!1k[o_뎾O-ZRcyU_JAh \@— (aopñ~2*qyiV`,YV+FN{jYi}sI07L{40imlls4*R򡪢jR/i*jn^{s? <0O2yܹ|Gݫ":, kp^׳!u]NvbHIq,}#M-y®S 05vT8nd_k6A”RͱD4))RGa\|RXlbePɁY0+9De"ReKyhjлI4?A,>,$V䋌bjDn׌']Qь*RҞƞ:FLCvo^~Hn"&HZ@$] Bѷ|h1?MPTN·홻 YN?)^))oF|^|O pHO?B_I߾X&MSWJJm$\. w;x,E3yuy 0Eڏ| Ŭ;Yi=iq|XD' u^ b_+Och%u|ae˦ũj,ݥZ*.{;{0&󞍡׮H #5eչ}/rloRQ bނAN \=\ݬvywyIyD -@+b8:Pk K7tSu*Z# `hF*!4$Ϣ2'$^cFß]Es.nӓ=5n *O+lspoUe0zr4{Cv]( 4U>h!bx{Ѧx_hѣ.bI`8ώ BWK;) zT!l1zd0jSYQ:y`c7!*4 zHF+ ,@_ sgl#&b8E4;f]$<?U|8u~:%.) OmYh`exZn*jW7 }"NsX|[ptfmQ"HQX-YviZ4mE^֋EnE4)'5;vlKvJΜ?ԭ[(Tg=*9SQXi.V=e;_S?[&Z,2ij h/C^ݺdBSrsbT nb|CbeId,w{CBٴAnFL)8/d_L&ib8I ~mUEH???7KTGȔH8+者)/~͋H9^~ϱb#6u80Jy#l}7 Fe봇xBUfy*x쒀ȺhI5 lHt<{vZQkSf?/jIaE)jK u "`,=m +mݸs`_>z,!J)7ϗ=pL&+iO 1N:gfr`.4Fc8&,KIL|~.2$X;ۥI(dxHT؊8 Ff8}ZcBѹ74~xw"(ܝo{fp;eU=靥*yG<{nLa6T.:b%bZٵe~8`:Vd1];or lS$IQw<,9m5S_pY&[__lA¦z1Y8m:p#679<_6/X}tp@g2ҰV:)% !N v鄩UvԶRi;{9e V0׼I8' W˫`|Z|U_;ulCO 0ô;AVr)1•fP4eEliQD@ƳѪ4T0X-pjf".B\i&p" A9-syQY@*y$$ c8I2l9z۶(})ZhRxKjImyO.ܤyi 4(nɲZH)"u/˾r09\fo n96lj7pZW'H,}pgń C+q U85x E_WK5!:VEs( HUZ= ]qYibiWC!˟•It`lilˌL 峟rP$ڍ[5/ף0ՆJ80082lwPbo0w?r7988؀ʯf[\(3 Wz 8/BuH:+3 x ^ٺ?~q0f|-(x"<}>Ëb۹,ȴb6cd=8ҫb3sp,N]T9ٻ0+' .g0RSkK1T[*]Ȝ̴|#] )P,k34 ˪Z; }Vdy"ly[H8Dԏ՝ ,_ʝ~h{_&cCғ$W/tssu!:U#]7q~pu!yl.m?߾};0ȏ;0E 40^ h?L=Hxv Y0!*sd:rXV]ꏛ~"UZZ [Cb)EFi=.Dӂ1H&E Z%̱2ru")jٖ=5Uovi1gFdI""/*vűL+Tㅳ=އ$I Ie]&^4c9;y,(g܏bJBD(%fb@&dHIW%\E|\) ګٹ BZqpHyV`H?W~ T+Mƪ7x1f9?\47نNt3ns7rQ`^y. ̜QҌ}܀NWejH*-K$2blf F9z[WUn\'@#Ж9YkZha3U"rxCf l57E2ݛ$YT* @$4uP4ZU+0l;4dh9 O}Κ06Nud:p5jz6(}BR%kV&N(Z#O[l@IIljdò,ɲQ )nNN y09; ןrY#R<r#fEn4O[ 9^5uu:=:Mn x\7tB^H͑EX6/B&h6qpy.0姅PWK!wg7Ixq-|&%PDrtZf0j?j'Mg3mj+u^\V̙3:|e1O80O> o瘄UZ.ΞIP0^Y.qCWJ* ('d~w&&$hIg3$KQYf1O>Y"f؝P$$ZͶϡK-p>Eaes"5(^~99/^k1U!2juB߷,~cnt b?=-~\$mcȶ/^||3???/`p1pVGK{}Q:5Js'Â5t:mTj^LI#V3 Tc mɘivbgVAd\#Dd.eYNcz^ZOsȝ>"VL箯>}tB.oT 5YgfcBs G(LV ٻ3aR|p|x§y?X7Tk1_d_]0u{?(wB6oAڴZh['bIX SD~s"SAs4?/Vj I]dX LZϗ݇^zCϘ8u*2g4UZPu|;(Dn,Y1U vY!B} &:kӓIBAiIw|{Z#ܰ\,c;%1cR ~xwgLA!\O7PX \M(a6?[]PtMm[QݒY0Ҕ.L>t:N6/6L۬P҄BXm&k;w9=s5E O3$a6Hbn޽߷W6"Y\)f ,\0W&AY`g)@/ReZL8?N! [/wivgcbL1:'i `L! ypf0|VT#mN`NA>$by=''/K;+'W/g8D+ .^%9y^RmŤL|M 2D">@$5O0Z_U6JC@M%I 4&셕qfqP} SƤȲE>Lj0R3NB"):zc¦S[kޞ}Ue3?.KwPqBFw}s"C2(L \,?.IrMC_>H bE`Lp4~h7RT+NsuvS*=;:9;~tIԩjK֯=$rvg}E>~N俟wڵLñ#BPϴjkEe;q5I1{44_;O/֫kU;vぁؖoEetQ$LI(Qgd,P8gh/b:@d![LB4FGJ*&DDsa\\\ ,jߒSұ8L궺? m^Ė2੄X-2,h2llܓft s}Z,f4IM=Y(gh5VVD|n#s%0tBWMzA| 3e "ԼhN`/UJŲL$۴0ӻmg3Y۴mCUA/ԕ[yZNgU:1WWZ)^о,003dERGƣڎg"I:rRW 蝷'_V3uڑꏿYCx`&m9"/ nstVFɨUkX z6Xo_>kvAӅ @[6F aIĄ6\wNԎI 'f"h$p83_Rݍ,('&Hy I&1_^,)IJol"=جˏbGYX(3vYC^B.҅\AO?w\nɰusȈ*ǘdx1Mi(4F[Y?>e:nOf8+s%ڈ 񸇺4MګP}'%yY5 Ϻ:# ʔȪa"GK $mEU:/Xw3oO4T6+Q\('+@c}@'6U.$aګvg>"(Bś" h~n=;;wYZV~'A', BJb2ׅt>1Z^ݪ*DSMMQ{w-6-.*hH%3xT-.-{T x8$.&J 7lf=]sh jnl[5#"Y 贯0?]ީ4Aپ¸=~_`5sp$hyje{:fb(L= r#LgV$ӛ󩴴FG20}2DSjLl$$͒KK$EmOptfiQGHBB lqL:[;LNOm>-NL]àL"XcdaϤ2@hi*,΃jo`8rTp{'IETLV*Mxt b뜍UVP"o4[Cql4~5YfkU%BqSN⤋auC25uk}/xeXUTNs1_ͯ,@$y|H q*0NqTGV< Wjdڸ:lCeײc&pn$ Ēht_ﲹ_4!a9=Qn=h[8õx5QWgsz:Vmmx/Ǫ"}L'L_ңmg1|њ"O~R4B=IUq;fuߜYvO Gxxgx,/!d+Sizႛ*`T(6SǞlB IC  &Rsz>_ٴN+gźNJ4 rfV7@@ e}H(|,vT m|9[HK )͠9`Q8pAp$ju->biXj_XRn Ғ{@wIiZ;"fPi?VU]BhX8Mu۝`*p}X{ϟzV-tjUx2e&Rqa2l\ 8z_A,$=7y090SWMe$rwcϰ/S5'G CE..PTĩ'?~:)=x0Gci5j-Ztd5,f|#.gUeeݎ–q{)ƬyEHd jsWdl:ø,& Su.Dl_  QB禮(;rLջ×υVʧ7uӌE (Z9{L70b! 3(rF#N9>|+UqrL--3D =A$$7BwxyQ_>C1ѧ1fFP,6ZL 2ۿMW$ s$[c:TLqMNj q.kQ.dPr O%OcY3ˏ,u%4FkkM( <$(ɃW(>Qx9$rE~RP۝2'[g+4S$}P`yaє'ӵe/z`i-0:іVJjYTG8?,(q|<2U+JZ8J)~C܏Tml#;U}9n7}Fb9T3B»8ގoB;4TڝN}u@K咔En1$_lv" t(K|e/[+^j$Rv?|όEA] bC3?O;=ܿߑuh(RI@ʰ  wveC'n |X4ȮLa5)(X͕Y-o6;erynf.(U꿘Xh=6آ,:q ``rkX@ѕvw:_ɱgAYNjݛ%|H䫣lFpqKhM>|:ėCCWٗLu뷯CtӨ VR5b$μ䇿 >sM]aG P,TC}TQ/CI }9Oo6/DQ&?D (e`Q.$nPe͑sb7'Z%$5KTq"bψAgQlpHW Xft'67@vli\,lx#kb͘ǼH*#HcEH̭8Ic'40 Aw{Db$N!/T5Zr n[S*b(A,I"I3PMh4A4IP[BO߻{?լr")4| F-w^ GP8awgz`O.e xyT`Y xzfp{=h\>S@`ą'ÞJŨke0ѳݻRmԷr)""yuYC 0+ P{n+r,WQt](B @љ67mEaXZm˖,ǁ$N $@٦Lt)BR&-/Ȗd^s}ν.?^WRs[$ʉױ|װ&*1=e:t̓LT# J5D?iEi[J[#ۿ/*"Y%DS[mPj/m;\=nקIhQ_XűSBJͽHz_#O=Ǿ8@[_Nh[ 9E[2gȂ^#L+ٛ/{|{kx9+g$o}[/Ol ucH'v"$[P;~p "ϧ}B>սUXݬUh֝;tN?z- H SɑQJ\BaWV/zX=8ҚRH7gB$Yz{3ۚ\‹[LUٱ،anCatB,#J4Cᠺys셹~74]^pa3:<:lt9%8pg,.p1Q4E/3N;YTX,Ϯu@朩s.8{FPjwcȐ-G(`,5PNG\BCLJI.R}t8(RZSTb9 h=ks4! Qt4K3Ye)2D4 %QQt:FEH y/ O.7*B,׽{}IXx{hZ:Pnd}_c'qItM6m !1$ XWvKfMڴv8o |X9wI0R< @^"NF3/1j2Cd v?gPbDzR\:+/,J'_|/ Jc,L@r4N)^i$Ne1EvsicqљM seF`el|G|N׬Uݟ.Y\+LM1qQ"-"2K; '"W26>48Wk@EV%00@ 융ݭ0.Y^-+xnXz RIdbMYg$@5oo10 C%J5pTܺ1\tL9=Ie:2Xc cK[9eH szRX{ 4URVpU8^:Rw[T&( L^K {>~oN =hQWfuIB6gfD>Wns%h O?<~m# \BzFBKȎy(WMI=773fX&ж縔A Dq{݈RC/4SU:AӘw\4K7wC4\+^@$ XAkٕj2SvҠHZywA$œA=/@C`VԻ$R1M!a!OVӡ$=wm:ǀH$qe`V)268x8^equ޹4CK8~ƢTӇ#|UzFTviddViEg1Ov)q>z0'E A䫃h6A Ťynj C/]N=wijGFq+s ISmhg4Y`{7_~Y{F1USr!8ѳ۷Og+5(VEL"}wn}u7m"r3"Ο@3PZo1.+Jz1~?Wv4͋ӫl53r9 P쯝>xe͛7p60l#'+4t3dXaJ9J ȉ]xH ,$ #A9׎3<C C#pGax3`v`'pd$aT9|Q*BN ^6}.ܴikiA`5}߬lJQ"1[:XTә9^/S}:a"E kDg )%0`8>OMgg42r{y6M"4IҤth\*+8lꚆVisȂ\6*Oq, K8AK{ @&{yWBRP ƠM4 a SNԜI4Jn|X(ĕ˺e|ݬQcKT땽r0׶gm7W׊\,y6ݧpSԦ>Pq,4n׫[LҒ cndcNꕚZ/EWڜu @Cl &8MҺcԏ4vJ&O[ s gW?@3}P<Ǥ dR3m3O1 5Q$RM30 跩2r% m)RI0ngR[|03mEg yd<9.jRlC1&Gs{)-p'(ht8YtY\Wli#1] ! CtސbȆġsc֐c 7!1"v>;i9d)G(5מ>e@@! %fZSm]0̟~? )ipcxHVmK X0EMB! 1 E2DJ ty*G`,Z$ Un&EXFl> HO`9aLURT)_\[ m=IS Iāxp\e:Jyt1;3EÇ!huKfi蠨AZ[D0gTrĚn,QeːnoWJLtbDi&} % ^H`'ϟ}1^c 2L[)-ցE{HbxS7Pِ0Wk^7Wͷ_8Oխ,$g_sxN൯B"QE96t\ lZ_񓇭fŭ_>o8?|•|E̵1%<<+qْ{ ^lK7k=u0p&OV:!%^L OS5RTD,iF,C4Bo|wt/H3lİti~`уUiXz)W4ċ62 O wMXxAvitAgxOrd< t9,Igu.ˑNBRVi>o\R  p1 >bʲIFD{VD<8[Y&ibhg-"(0Ez\)HME*RX!$)gjmki .DG`6Gʗ_;WWGq8OF C|czp`>jx8YFE(:x wUX8m6,{a̬"pPr-0ٮP2.a2Fp<%RZBj0Fmxl͋9q0rU6v^mmow>tq1,1.g{4jJGRrB2MnHC{-)_l_+^[ÞCU$^_ Kj5ǵ[fƜb;NiY8 /t62Qf$_73mۈ0}D.Kޓ& z{Ӌ@ EiĖYeI-J.(Og|?0 HDɅ1@Rp0ϣ fqƜXA'J}Y+2[`Ϻ3chpm MN<F1$Xxr*5}k`a J㔢t7AkrDr!P:^t!"7!q[%\=+2-+߇F'"` v;2T5\nnÐwI0$8Az#gљKtnαqa=Q M.er{Zs$b^@3h!^gsr]޺WWsիW7j'6K*0>*pkϮ\kةglzɐo?|n9fsYUF c 0Uy2 c%IE2z^.Z㫫\<#)bhf0\].HRUg(BAeHǘ&L W`-׳*li0B,%9/%x03m4UC̻>ϫ}諈Ռ$Nap_o~pHtcI ֽ Dz"&Lֹ>{5!^dVb,zFdWKQ|'=z~: 76W014mX`EA^%A軦UĂr蠽o8~904S<*SǡKN) Gt^]^[۩5v|:s0 0N|j4/17iP)ResXc Jc *Ҷۻ ~QT*(7ͅrYTgdQ0ȐtqÈ"4b*)09=fI Qi2M엗E^$qB~ٍv~(^:'R'%Sц gb 8'UMƼvQ * :)$I#-34zXVkp4䲌Qr - ^PvF~/G⚓:=&:_fx@\˸f I#ͿxyϞqjcն].ͱ VWyV%k>j<@X 3o ~!FV5 5 }"2BA[ վI/ ˜LGW7g4O1lgDIҋ5r8c8Ȋo0LcW I&M ة,Bf v Z#p#Ѐ=}(Hl%aRA1 O #q9a=9n,1u"H^h/ G1uj9;ՂTk>zt]]"IvͻIa ,{?ݓ WeiƞI#LV(()V|tb'2 hiT)VV:Wm}yIجcQH=fWYVϐBsm k%,ˤ-|-Dv;]ϊ(pO|Pre]M^>MZOZ_&Uǝw|=З+͈;ҖoĂNCQ| ^}^ h6@rnj }/awkO}&9դ p'#{pBzH7g;[UQu@}Z)7i6tBLY+gxSby2'x3{N hBŀ;q:$vL>3mlNR'&ٴ @HYOҽN<]OI3ƣZii[f7M巟{I#Ca'T'&Ivhj͟' :$%SX, 񽴔fSI?߻NvH___!'26R>1)R_Y=<=9f3e`o ,6Vl 뼼u{>OW W$rt:\wd(;H<z350lf߽=1uaoyV* Y:W3v7oqI$c2RJb֛y9Sfp}jx$q|L3u(K/a'Pe".H3#ݙg+mŖR|cŗ #|vsxODo-j'3Xm aj:EPAP!+}qgB6C;{`,3yeH BN&j2|ogxm8Ďc[ϕ)C,JGϞ`,.&#탞X]# P˥j;hRt8<'s SݺR/ODgr}d~;tu rw=8#jhD ǐH~+Z- W3Ⱦrxp@2p4i:I&ǃ /rWΠ>_HJaˎ=X3Q,UҬhs"N}ՇWg9ANn/4AyK6]~o9pG{%JT.]k2@AHuvjiLQVtJLHDkmD$K|P5mXrVJa<M_2b̃>4p뵝(rRᏮvsu nkųQj6#|k|hiJ`:Q5.ܫczsifFZo6n7=ݮhh8t!OU,@x< ^J1z]?)ݿߊ|( PW]u=< `Eba*>Zeŵw[/-L"z `^Yc,*l) ly3bi&GD!Weu%€b؎]*~T !u(Il0,sնH) ~Pi+ԛPtmGރ]ŽK.)id[n4AYm&NİX)]^{G_y 0\M4u;%_s7F-lqCGL@q q(#r: YU0 OzodYJJ;GG?}aP )C?0z\dま/&}m FȷC``MB&`t54m?<24CILgO[kvIsFI|vL?ǥ"C:>=b~$tXfe,2)>=D3ji*-@ޡid!*ʎAժO'/Tx`+i7\A`T@fI'ժ|DɣYB,|UO~ - '3i~v}$?I)\Տ8/)9V.ٱ *SŹ~}E-w`:K I\fuLWƙgSMn0SKg}w J$*;c ~Qj06%N:@r}'dV "MPta}`/L &jRo[JJmݦ#$ m?0hyϣ{7UkU`?% I[-YVLS^JhR ,Y"gd%%Qw6U0I!POĒ>_a()ǀ'O??ĥV^#~Gb#I|z(*ŗ̗b1!N8[M10G`<|#g1ib2@Mg)!f3AhF^ԡ22 ^k@ ݸ+z%ԌB7IW?Wu7¡Lf͵tNeB4f F1*M"<~򲽠ҿr1ug`/ N ,P7K,TX-JjF.~?ĩ%ءTDX~#-ÿG\W :zڽAD95,w k/Q+eE4elfB)ʗKW`~o-S  M3]w{>2қ1Q_UavfN>H,T\k}P~Gv2\ 0Ɛiyvmus\{ Bɀ"\t\+}_4 RTF~p 0< QJ8r;QeT0AB{(m{gT.PCCR#](_#҅r6ў81_ c<ͨ/;("JȜZՌuCWEc$\;7fM&8q,ƒ1&`$qQR|g]mJV-;C OQ)%"Nhvlp<LQC(էqq˥&9+JYۣd׏no6T`hF0BJ2aH}€~ȵ^ @/ ^v ; Ga"?Rk!@h~<=uK!;,䣄Hg'֤i3޶ܡ -BHr*B6$J'9Nn,rMԋ Js]))kz:AZ2\=*e볏?"$z>ฌ Չe|89olf'+]5/,ADIgptSi/w`yy. b5wfs4O`>$Y6*꟞~T+$!~ss||#jMkFisokoRU7Ns)O}:ZV)eb$zxysuy݂o6y:A_TO@,f |Y%i85-ˤ$sfA~(nk[4BJ8+' +4g٫9Σr4\Z<-G #>OKS 񯟏o%e򙾥; -B2W*RhBR$:@R abuK7@MQ:9]BEHW-/rbx +[hQd^Z KX?&*j7CA۬1$JΊr^)mmvzs2j/p}pܙzd SYU"a2؂>OѲN.FQF>II>XOi~ehh24RJ}Z9j/`nAw(lh"ZyЏnQgrysM3>"B~"{ VE$q[!nRD* Jd22 Cwh{hyXc`g8Uݭ=>xb!&aBm,.M\zz2#s èldvbLUɈ} PMq(Y+&G^\Vl̘ kٓgJM8brFȣ6Ǔr9N/ %)'etܘ i*bw3򇉴P+Tp/-?$Tpr|:Ke+y AY#Dz"t^!I3,10*ju PtfmQ2EQXpڴHtMۗ"Iۤ^$GYJ(;;s> O}Z912C<'Pt:V cwul1BC_6"S*t"h2E$K8XcLritN :ΊgYJhcQ{ͷ_20d6L¹8se O'qP,8 笓0)Vh V{0ߟU9jϲC!U踁 e PcVM2[mSB/RE]U#/`77$GM'l]V}ds8NfET%Y }]ՊUtu$z3ONyg/EgpHDHc1'םS3iԙ 9mKJ47~ZIH$اҋ="@P'H Huu$ jB6OybwYl7|'hUp ]JHU"W`XZqVY1˽cKTPط=Q?]˂gj뽯L˜R _"Uuǩi#pI RQ"+GِD i#2V)OzxL6ǥ6&azJ]˰>l=o:oP=)u}a e%w&-RG%beXuĆN(Ĥ (RYbx&:^@"\???!D%})j8%YQYG l$4܅2QDNv B-+94ΗYqЬu%%p$ )Ш&='aKiڨEJpgF,.^3ĕa[mV6U&롊A2ֺVmU8:\Sr( )1 έ㚕fBd>!#Hxr|=q5/cCq^7W﯂$X,T2JM@>DCnt{3 &H3,ǃ}6OB{ qB03cᅤVΠs.a(0 /BZDg_YssQmІzEȖQSMxYG~qh69V,bap?wxS@7 ܧ?ݸeY^;(:涭 _ԋFlbU"IvbqʯvL`;:,4%R - ]s.UW KBD% DqY{&BaLĕX!rVʅSpߦ K4reYRZ(ϊ\6F'SVǽkI.z3 iW&b'h' 4u`! 5w[`XEU=PK,4UQn9\Ӭ4rPAtFBV*j^U p`0pv޹ug6NHz0\xRź1'I ~ΣF1qSP:&E xKZnz(B3N)$T,&w s5%v^&`Q*)&QD~&e6쳳l8v]9sӽX %Qt*qK݂S;n7b,B0TӭjA-|_VT@qrSM`T:.o##7t]4(![bLf7l@Yo}48Ng$Mu s-߰_߃|Ү6O;%,(uY-եۂ,$fv9]ZoF5cnd^Z 輺Jmt|fFDs}iaڟgm{^6:Nۇ3}Zzq2MUqG*4rg 0ccӻ/_Jj:DZ{I X.I'@0yzzgzF,H\4m)m3ySX#X)N$M0Ǧe^}T$LwTыEB9g\ZYNUb*ɓe-c] qȉ"<;`Yo쮽A.NYΏJiɒ(a2\׭JڎY଍.sٴY^ H ?Y6p UUXu[\@F$Fl^eѨ;W\*%?P yc^9}~Ƶ5y0rh<MQgQB*b^s"&RR`ţV,VxJqp ?#Cӛ?OzȍX`kUv+ֳa+-E~|sx0`EQ9b5H GWuHh`?>K 1HkbnI_^V򅣽W_NGz'\Y 7\Ӷ8llc BH!ͲvSWU~hNITBHS6x<>: ̫+}h,f:]ęT&G*1Ʊ_<sCdh2:3"H  $D鵺`>lt gGgCG`P,^D\|VfIx,C=heN vD>pO@xBǚ:# J|m}S%]5Ų҈Z fΪnG]&+ 4TW:{s1iu'IE[fc#?NjDX nQ,1 7iDN0 Lknf1HL̛:i4۰rsZs/QI!B":mOPI}8(hTV E1_ݵ}q1kAA#Ǘ?{^յ0U2#0WDSǬt'%νf7Z  Gg$J6Q,lҘhbm\ m5G(p秪_^tn(JْJr``b& ['gǠL ^kdQ8?;`\&م%ɋh-\ូ~i 8X\$?>;XcpT .ׯ{v[u1{-ɭɩUPPw:1MOE^YvpF'0([bk{kɲ@lmEm "X8KT%8 X e+ ePxS޽w+gAko` zceNC~:6gr7o]YA.U&S{4RwbI%{jAy@Ә9׿vcx\-TޜFQεQWa ?ohvexDj7g> +n?mNmWsJOۋ{GYf6ry gTNg %X,*UAjsŘQx*$M(jOt E SE/BM +5d 6dҺxcs1oo= C7ZlCd,g{MIPG[$DSoƏ$KدdQ|}xomyhuv"T8q"G[`* MDXRrdG; ȹ\xJs: X֫$$-j%nՎK%R>pXH𸻻-]m8s7E^8^SдŸnX6[w6ZEUpo޾փ)d8}kO33Ixv[wvN''3X,A֕xh4̥Y\nTVS)ܻ,$4AKAiO;ֿ~ylGVhx Q.sI+غXx.M# \Pm}?p9ae֮nԤ6C1.ckv=K&@6Rd%^]=,cRǓ*cf$ŵ0(VZK Vu"{/g9ܯ( "pvr_P/u!(ZCpWR׳ƺF_ H$J xdhm%R> N~r'ȇ<펞lGv[,%=*/@:߹ݬke0q apQ5-}r/NiO)74{9ϳ|I8_gZMӔ%(/14als&bmpCnSGñJbe >}do.}xt!ygcn@2& 1!G3("j~zVv>(X, ]PN1' Ve8KgR ~NytX?ZGh3.`9=]>Ax2|.1*>{o&Sb2]EYVZcUQo ʩOF=/> p@٩ߌc0c !f Tb$taFV)"_%r#Q*;5WEXKf؉K+mNۊЊ6Ʋ&vi;i?v{'';g;6о ޻{5{}g'FGQ#?Z+k{wK Lt|<괸~s<W*VQ>r R VN4@ ^uK?* 3-õt js#c|aHTwfiR%N jR`}0jh\GG@/ luO0 rڰ:^fGY7,g^"/e!ɥ~5Zve?hh8<Ź $!rALm1ϕbSwù`,(vUMh$oRPpõol6W]F1 0 eH#XY$Z@Mf@dfBApzWn/<p0]5sms=gY6_3kNی°K# q0qM_?ܫtd;c ^IH-h_zt98J 9AhYX@whN 08BזA,P0m$E&x کؘu~cH\ /B=8cHj$ݨniVPe1Gd:z0Jh fWꀏt|?c\[OT'RPf~DQ Ѕ lHoQlECҔ:TE!Q.b5j1]qUtAM8EYc^ dz++>9z?(:D(F F#if_?3?lgigwtfh4jyʥǟ~s/ TڱBsE0βcgo,gyehz\3cը%fKuG/b#yњwAwE w.S?tihkϛuŀTQۺ1mL#1,okDeg*UA"DnE<OQ2ff2'"-ƅ3HUw7Yvۅ' v;k0]x3$-SN39FM;x]BciT &vx}JKn]x$JUIuײe(n=y\7hܕˋ"ڤyT54 c'w8Syg2^]"pP岲5Ӎ| 1r*;ooRZZ؋15=3!Ȍ/?uRJNѐmpA@wrLeVOwI@P!. 'st*#+<\(hDQh')2NDԿW}s# J&ͯ@d 2ƒ?|FC0|ܨ|'}ߓUc-1 h[oFW.˲A&A2ƐidY>z C02 EK9pPX,zQ8)eC7BHD$.{{cن[0푃Hi,K'H֙5x_OFa+XKC%8DЈI6\.gWfψn`zW.䒄1[ Ue_J Y깎R^cg$HBڴMOԋ&fMդFm%mB c0`|+{Oߓ(P H}xs Wd@$j;{rV׶ NX99  A~wd!Ѐ _<,D^nDzᱍz1mjU6gЀ x~kJaY[W;aLN?,IY0h;N$`-aإjI(fU)ų\82"~Ub:]lmNi Ù bk훶{{uJk?6,|4Z(1ze[E!rqGRiI1BY 57ӹں= bKytx|qX(sH")v}x5l>?]ZMlJl։ M꡿{FO_)ŬmyVrT~R<=?$S$hPͨ DiQ/^e_~\/a4&1 $(PU ( JA%Ӱx2-+Z=2J4>tdEu=h۲7M }"`yxy,THrx2ܶ6lMLǜTƳSIFd$aH5_{h'@CLbŰ/$J=R^jlR|A8(f"7d[&Y 9Örl\R4VeU/BH-AOm# s")ZdKn1("h{lzı:.)(R%.C<@y-Ùy8%qFQP9zV%DV{Swg=6;MEh@֝DH8Nh9ޟ9'ke/o'ݛ ;]B{f*FyJ%FB3RTxuK0{*(H ʦN8#H^$cfh+ZrWdO,>T-iVCZngeh01TOF{?keynNqcC%T.&Б2^UDAH8dPd{b o? ᢊd?ـ0o}x)8y]'e e`h*Qq&.;!`j -В Q$ ,y!hX !gUu$ u6{5B8!3l 22 H^!HV7Gխν:ܢYfB.yQ9縁#UGqş/vP:ţgKz6S+bdn(/q |n՛PnjY5FvOBˑQQe/-U+@<+wcJXP>Ns,\1P{!Y!~hELY`,*ifOD]pO7>{L:N+ VY+2LMkVh%q ,iEn 戌݀!Ckf9%-Ӯ$sB~@z KCJZ!Y$b pl Ėk% NJblӉķD!\~RA+X@ܰFjm+?|5M-=+ 6o[X M)e$a|8]02K(UaF.c?v e8ݶME\dY{y;0Co[h!SƨjQ5 CT>f2}x՚^,b;MaO5vȀ־/rM渦_MC}D  !j"|?l@|Py.'$>|q\ƣطךQ~k*5Fnxo?ijXStgz׻;>9E/ˢrw]o'}kۉ%@9 R:K-R3>n:BI&VnMܞH_?bx LYp@t{RIa-Q[j]U>z $+b}Z퀠98֐Y 61+tfqj+-OfCXD7!@6} f{ijy@q޻%4w-0 j,e}8u-yQQ|ceWy/w7cIJ[gg@wW M'Dф$+1Ad^;K=l )pcRۙ3S;[M]4Q܁ eDKxYfuS/BU$Ilذ?N|Z!< >5fsלE"+DQkLQ G 倓M<_h4C(,+BA*ث UmmGژ'=M [ 21]K(ɯ (0Ie)Z3Rt1Fk+)54\L1ၳ#z-Ue([jM[4A2A\$MA@lw| ̤u( tv1J8݃Je1MS435ݣU,qxܥJ[%E5k'2 Nkb9 _`Nˁ$YRT*LU;-A$YT9|% -\Yō7]}I6/N@ֵꋓjm4 C6`D^@ v>]IFR9B;`l834X4Y`^m*^ā. %Y]Η,x8Cg-$ Epܙ&}R7nykVa_|i ^^dOjKeh*c@+szݷw_>^6JD/BF8:68;Ӥ]NӦRu:mm%vbc;Ӥ.'E> ˹L ͑dPp]. 4;{9Z XΧЀ*ˠ?89,y(6y(hu"ǝ8,H 7Wq$BVߵ{,("g{F`gO*ΕAbaaXNmy+\ n3I"XDȞ ⥳_^0eX\G5Q$,+-Uj"(Uy-P[Y^iK{<(zixc:Ç?CEDQLؐ}cیtNK$+W'xrﬣMo* "6jSLI!`")@]k:h8!ud'4 2Qh߼P ו* e8ܳc IB(8~_`el^!m~HT7}öMpzVSu`ybcH顼s xd-MT%@6C*a0b 8DsO"Rc55CIJiUjgwEjfKYj0H%TkB{Pt%@WWy;Vܛ_ެz C/'>|5%C?6'EgܦEavK -e[VI;mNgҷ>6'L8M;$# ! @Ws=wN`uh9hْ)lI馎^ h@u<a"c1 "w(D)4|)o؆8Y%$5;,(iA2"nňL㠵i\Gs{s "\xahL뉼We#\l:v H·?Φ7_[\M푛- nCQ= "蠾d%/QxK#Id&EVg3$ER:T)t A)?eB8Yl[nA-l:8l4JEql2 :G8G[|3!UDPU@JoR^uRDRB/ H$JYPد$qƟF .G^:fis*>y}J*@ԺEQ-~)۽(;8F~rP( &3oswvͮ9vN_wxzۿ:r64KH}ơTˣ,;#a$}xi-ͲZPJ0t5")9<]%lMͫZl2D(Hqμ#8uYpf] mS))؏2+Jbҳ7i `/^,oMFPq9я BhBҎ)DĀ Q4Jq9Z-YGcn HZ.WTRv;*QG_:n^@@ Rw7/|ZgHʪ_ۿ_[/'h?eI#?⍦fuM$,NsBn࠲,T3ZkAJ4lg'ǧ,J},r @9\fmhsm8feѻ/_l,Z؀|!b2x4lhYen^~z̙'Gֈ,"~y/^~̀sm 81`;ڮmT4s#lҤiԪڬ8c0zEn2 #4II4@HK= o"/&œKs d-"5<["+$!+G 7^@RLNjkSg/Exzdk]- vͺTϑ/z54xڝC:İ Dz= ]M҇weO6a*Vy1iO_+Hkj[-Y8 0 5nD~?qaV~ n&%Նߔy.GR{.0;US. .`yjOԑ,-ˇ@+dN'LlKڭQߋ6X=XA8TG/N@."a bx(RWE0)`es̭bw_~8ur0[fvRMFYT3rIjUREVeW=w \$bri1NQDil5`m7h^_Q$`b+ UQﴫb5 R Q vO$A=xvwwwFY{߿]V!jAu4 qZˡ _䈷\cڨj4N n"+xeZ]&몂J /N#$B;:ϒI]M,CK4D"'_5 a_'rig8&@08sΕ%7# +Ree'.-nyiv*U F+ kɂu P+(G$lhi䬭EY XA4(wJVa!):y7ׯ6?bb`Z @i=LU(5d p&U5)÷ITW,w i)@:+`8,* Ud0 cArwQ*bd /VhB)LsQjf܆X+ħw ?mU-y+pKaT gAc2#Py>N5QW_&W02ɲt;\裫kC潯zRS M'n)(z̚ӶI  vcqLdip_҇ti:nصqw- w!6Mg0씡_^^kaV,pC0Y"*ZxQʥ2b4F16ǀFc/< *B[16‰H,\otחjG_ƓRz6L} D.GP`%@0/uy!Q4-"Ȧ0MNYm4s՜L1gD2akm4e[Qd<(/&_E̋WQ K&uT;6Y„CG_%g !WkօJb$i8NJ&OG8Wh>WTjd3yvwCO>CG*N`+!)\= u,Rl|2zK#(/t[YzHQ擼c8rRc;8Y ŇNZf]78m`Pz9>k70~Qaw{16Sv5)}>L)>UA5À|bz1R]3SJkq4'# |hYN@L6nI V:[`"V^np+ A{|tPl-ͮjnb+eJ i8ZpM.b2aӷ,vÂ"K*:Ӊ4}cC!BUT3,2h ?GS00 8u:Wgkh{{`h22_u=B]#gwz_bp6$IX6t 8ܵQݯ];ZK/Gg6aZ-Y-[8v.aZhiK;lV L!dڐIƻEVd.q̹8<3KN)=pG M֣ &XYg7CdWJw@=dϱL "Ͳٖj.m{:Ӝ[mJ x97^՝IycΈ[ui K H;1=ȭl A`I d%p~͗<_*I3<}=w@cmϔq{Wj4֎ GF4WFm`ܚpi'.ׄ`>]G˟^v;}NbiP8@HUSFMm b<z.NJ +NhFhcT֫?nh{}ppFRBBE;5]sB(b_{3D!xbvdX0 [ѕc{h$RY)Pfc6dA@j;^g$f%*A1 |^~pp*Ke[?'NeS[E4A_nE@*O^C^I8Z>K8e@E \i`Ŷ!I q 5ˢ To?"jF 4Y{|,#8WY_jKZg]1^Ǫ:EyC/ǻOrus4A͞3g^Ȇ4xh(Tla/I gI溃֐VC,Wv](gCE76P 4"[^rvp\,F9FF4ӀdлaBQDx2lxS˶98J?~*3 Z;S~QMvk"= hihMaUeZ8¢o{vϱ*ƒ[Ea>g`ۑBl9<[Sl{v-weq)-U'Z!FHmmb%QOOIx!I#w7=(YwDP;6m&őeIT5M-i{ӝ,& 'Eۦ;6vl4ɒ&KҵMq>ԮҭR&]invۀ1`@{yKnogob2;(!bPb`@֡vIF&Cczkؚ$C`)f:nXbG(a(`g|@A'\V6ZӨN|9iT9Q*MsO'k]gǰ ơb[ ״̍'ˋi!f$V3pRx`6j`r4*xB S:Ng b[Zb'g2#݋Z%GD AST& bq7Qlq-1b03@Ƴtp϶J;͂xY9 .=xr=>\Zk$N| 0"Cb rTQ6-ۭDDaPvڍhDhAI̷{S;Sni-DhHoa0,c(7 5M=n6~F$ӱ`7͂Knxn0fb[&2Gž9׻ګkrMևዷ`v70arOjwGBP({}x 5؃sѕNm{se O tgQ0od|߸'?^rIIQ.Cs{hJ(X.6Wz<:Z9!>=>#ZwV+ҟ^C&wuь͎zoi$}P.eqgq"'%檭. q2 Sx(*"/p85YoFI.Qe틥 q4->E6AӸزMD.0`` բ߿t@n[u`~mC[7:Oepr4m$ X)b(rnCCjk/XT!KLHPqRIlt*+1GIḤa0yۇr$|i ZޫLH-4ug4 `oo7ʉt ,@ OB1ǔrXۯhY{'i! oR9 b2J\rIf/#sm/O8RAs.yd,RP3 -97O 1NT 3Ll)Z~]|)g)o:\3J% -9N>L\Q.fQYcs}uy;S Β| XEh-A@LR~֥IZOo.V.{ig/\WBĶ쥡  Y~Eӳ:yeEI$Bg# >X{V{T73v]*P xucI領VJ nfQy޿f{ DV{.m[?8a&h)`|KiY6Z^mTr[v^ԋxk>B w6@3)Xxzta{u0w=g.hmSBDR2e+s ` !Jlϸ1ORΔhaE׾6e1sӏ?e%GYCG/SXHƝJ 1&D2Oܪ/+I)"ʞr'e" w`pU,1 Ŵټdh>{,?{݅S]3K:)I~z5:/f2(!Vrt:<|f7caOMdZ yȕP |6^jV*~XU+ YYZ$ظ_ǽS;E I*z[Bkp_jF")u=s|^d0»q4uK$$"+ KJL CT%]_q:<Q+V^'v'uI68dƹ^DܮV'~C2fl~4K/u$JRoZ4r3mB4(pRXMJHDZrp)?VLŢ0* ("%1$٪5UIW:%Yd\˅y[{p}8jFцSi)%sx !d( l(RtVR ArU=kNpuMb<v/S.}0r>䔫._Y<_wj\Q;-brk7X.lj,ʬ$?:u^w[zD&!IBa)0,Aclyq]J= o*nUjeePkVQZd;!lFj0O>~LH$J?̓\[PGޠ9|s] )b&#X{f'dtJC4 HRCn)!v4Y[jRK^fP zJ1}mQ8yt ,nH1lF"3%g'-z;FrrzZ aP/yf3 wrO:T[]%ppin664T*|5 6@;4N|=L=+W=}דjK>rрi/~xUKx [3`),I""ĉ4%ijr*W 3~:7n,?kHo䬄TJ\$>O&`qZ#YttsÏx%E(5Jr]ciWט[y(g~17FJ8eomTR#Ēy[ݠE>3k-^noFyoIC;"ɱM ھ%A>IvlY!KnDryu> o vHLŲ0ɻ+geSwxJ8>_TqhY"I6P"ce8!SE•(2|*/  N)aF=Ք*_;`+(ͱ5.%a\ 5f5 P2y4KƧEZQeOOٌ=¾&T ;Z:C%M4է??m=yeƥHx5=0+x}7",bNu~}uM4P PML fUy x|)J[E$CF%e^^~&`FxQ##ds"M)K*#'^-b&`Z^u]咘G5l0[IR,U58:涩( Wk,/rvBfqt?̗~`(m))iⶉ&k_,K$sOsxDDgI@孆??85^ܔʛ,~`,'xAK&nEw+00oup03FZ&%^ۯ?i7򶔆Kg/2] 9T5{Pϟ=κ+2Y8x';&jK={|fj/V[r(^Q...A Dik}I.[_: ,tbIA1#w˖>7}SQn0@,Y^. ~L TWW-oy>+s~./Z-.Sz`<|q;7p?hfdi5~rpʡv̙Atjy聘s@qvԧOlo!}o6bpfżլ[?"WbRVc}Jh&a4AJýenh&T0"n,{ۃn`4% ~ڡ r jn؟YSR.لA}81Ɲ>ɺI(UJXJS4?w)g?;##2 R,qbPu@F]=.z E B(ud$,2 Y s< 0}14!n]^qa$Xsrxz݆} ˈDa$W bt-{IJVZ55c60֏Pkhf ^BynZ*4*M&g4cIXѭ H% *Ak9DAMRbAb$X &Ib6WE AlK%#4kuVn GQvI%Jo*%@|D\#`*(6K!髛kXJ*BH}٭UkýH o!-̤ܭs[`xt0V%!ݫյm e9 Hb& rX`b|()*%5[[Bq;|/P 7X06g`lnU{֨9KKd́ge ]9؄Ia`7ĪKȂb !x._=Ũ=lq#}|48JJY ؏͙~ћiaBdُf |1u=4VC>Zm%I%L4}66` as~.|A`dH/*x%q$iѸn&=BM#r_*H8 ȗilE"uDD,-z ~vjZݛ>Lak,&[vz$/ggȏ׏ilFߞ/Ϟ}wv?|wty n$Ē{Ք,K]}[R&K煷 O;9ApחOfK%!+P̫WdU g*CθMʳ5 QLL^b+ǹ}n 9>K<^zA]~g$03E[׭0%uvW>ZyгZtp•C'nCNmhNz`%N ( bdZhOI ئhI΂p`ggayTDSqf%a o{ 7; E^/n5jG=,v+NDm-Qkh frx:X;{Yy `Mm :ּS/ϲj_G:~p4TE~Inya߹RrW`)rV֤Cd;u"Iɖ"aryq o*ݟζ:FD b˜SZ;|7߆X6Mbt]k.6 Qݘh(D.Y1U>("")Fh8"nvf'G2oՍT^d5V$V ́TP$*TA#E0-j Wn8z~pJ6+̻K)b4YwJMQe*2Ѭ4ȶFe| 54I 4[e=MAr[b&ꏺ3ij f HB M)UL0 E]~G=Vn)Q8K ^zyz6k"Ys)(]%(S߉l9WT.tmDJ,Nl %PbP MiQ$2ӱ xf |U;4fBB\dP=(OZ8ETD~L#ch+j"GG+ ׇoO}GNiQ*2z{Hw_A5˶ +8Ys$!MJYibEaM 9 ccm\Tq!S' cp,T$J xT*IPVs{s8 Rgɚ'Nc`b Z $fgVop /<ڇNgOi  c(X]T&<ِ%AykxgJK 9@Y"޻y rl>Nh$ B,!8g2]"#-SQ4P4E$7Q\DzWaPU;ZWd\e.pLuvGɂrQ8.9e;RU$ 5(ܜ|<9xyPJ1PX7'aBkf%}x!0 q?iJ>"BYuf\{ݧQ$h8߁\.\ۍ*&,&s\8&%#!v";Aj4T"gT8_RZv\"%Yqa.~\~7uYݛG%U?{HRUwxokh=|Hdox$UųOԥv˱<"x1O m8x29*?'fTv1Y푢(7W7efZY8R8~>0^$enڒFV%yd/z!( a ~U9JG8hXΨ,bQ lSPX)KU)#pbm;JIK| >3КJMZ69}ܑQYnVmI6j>AA#S!ku9Ѵw}etкU@,L| .p/ 0:5nMCOsg轘s@8dYN<7NC+bgrJE3{!GR[yquv 2xs { a/C ?*Cpd0 YS4K/b ~SAr(< Lmm4 ]c ރ a(_*B YwOo|"5ZrvIPd&F8cbU~TA%5WUUNmƢ\*tvww$ZAtOw!'v@fiiu o[,iM. =qZX6zagrOF#Q\«?_vzA:׈,{b+X .T@/h}蘭f`H)cX)ŻObO͊7v~NL\XEKDICq""Pb [OûԋGeFmҝ,L8C4?P.Q v` !tu4d xݣ;&|!^*VlN lUR͂L HDk{CB.[oϊn.@4 avH7= XWGrs~B"KHa}u\kt\̈́HMA +͜g6Tݙ㛁\HqR9`c޿}t\pWʱjAY`BVǧpm`G(ݥ}$ɍ{ծewz6Plh<ۯJJIbgϻogy[jo L AhF5`9چ4*2ؖt1d ch"!8=xIL9/5AZ @љmD"%jŶg P />}IyK7EQdɒ,[H`pgs;( Wv|':0[caU3]M<~xF@hC*j= ۡ:g* l׾vz5Y ,ϑ\nrl"Y_VT+Cc/Q膹V֞eZnvKLυR񽝧aXd ȷCy+2kYϹB?Y6Ou(\3?څ:L.4UyO !^ Q8,̈́m Mg;aWXlZe2Ee;x2t0b7Jl nҎ(}ig2t*CF^lŴ Χ8+\u(2خ5ۭ6}Z@@ַh@}+z\7V6/V]'߽HAb4}3ĶI|N C5ty]LՇq]w !A5gDP UqK8 Ynh&TLXn\\(c$& $`~}oB0 44b# ?{ kC";׶4TNŇYlX|ozqT}TI"+R1,T-9ERJ 7N!2_D1EAY+x\k Pڅ3tc*vq#jηUW˙T(tl_ S8)Nh=$u ݣf./V{_x<1C/% 4VSJ3O率i˙?YbWT$W3|׊ڽ~ޘ^Ny 2&^k8'+LMύpUTlJ<}`44h& NbcT}>u{lI,5Ģ)[=! x•gR'hPh`>p%$RLʦ=jl eM@&dД7;F+iRۈ@!bfvU<SrHlNYU9%TRr1x`.*W]ZtuDXTg&wD rd)c?ؚoF #YXJCX:nd\ YQ5R #HmŁ2]$DhH{wR! Rdo-M_s FS{iGce0dyQ+rp6wTk=RxCRYzXnOP_/PnHIR>P(`J͖(ViiD ߎaZBDZ[Aogw+",bLfHّdUsE(BQ K@R~1ɂ*^Yox7ߌ!#4Jqz;LM"Ȣ2S]^qt +B1M$P\\ݪ۝l]]-uoGk-쓪w;9Vw]$I (KbCLozsKv2{tp6\rxv)BPZ5_PVKɲd4`-{"TK(, LᔠADMO<$ f$#0. ga7yO< 6CӰAzņeXn_\/V]!hdp>N vN4OA9+x<8^}GQO,ٻV1*<0V̋zo6i1̵\,Eq6ti@}9YDa0*a[?=9MHVXLwЎc.dze^TJA)!387eV9hWM-jLn0oP`>i-qX7/4Ώ=\Hġ1$Hy}o}@ y# pj8dbb(A'AD EXX 4zNzZM% L9!.#(nQM@;meQ@.FS3ρ#JI0j6pqYÂε.]:j^Yh.'\i#!6­eCjH^_W A'bt3=.JE E4HD;<$ì %觍:8 dZsxZEeYneh:a%1R@StJ8\4_YO{sTñATǝa'ܴIX.`fE7q]MqF*ٟIpk=ηWɽyAbP Eէksm~H-)_UNdaкQ`Ai6-B\>gꌀsbZ' Fz)yF^\ߍ/6><]~;zkd 2 b|>Ӡ3~W7^A]}Yg/g3ʷ/n9,eaB] [wD^>t$Ysf%KH Y,fv줩L=dzۻ^t5qIصkcv  Ђzp|:yja)+>;=Ӽj۩)q%q=tZ>"p~~~h`]=|1 &YMo CRGP=s-KZRQka8BQ KJE:p__B vl)\T"t šh)U$y|% *5?x}FT\QdM Nhyb*T i*reۑ\:-l%{Ӆ QP7t>pMbPg·?]3kFߜ;)`sK,X`DeWق2`UnYld%Zbݽ;kņaϢU|n~;Q" qxh};h`uWvFjW*^b~97,@| Wa{v^nW ɽ,@ 69Q)r1"+g;8@pM؋]ͱ=Xazus>bmݓ8Ό-4$6LIevm'w[H8:Po.}c)wZknZWx} '%ӟǾCsG/0{ןTbY̒+R@A\|TvpxL! Pekh~{S?(N`ڿ;S_IN8Z%8H38NbE@xq/Mf%f:Ieʨt iz/(PXan*hԊJyFa6'r*`;]6^1a-,wodSGgG|lPA\.J>Bl}4ᙼ"#X2 6k%Fc5ɱ:[za A+ #pok?)nh7<zuE z.f}}um[L3=.AVhqgq|m\p:߼oءA0@^gتcL,QS"*vK&K Nl5&qoL`>b~bE_ jcwpViA,N*]-@",=7[>@|b6 _F,EcOtiL=;.7뉮)Y, m4PfKOm,.{(l3iyzѲ-8ܯ}U[g `ѫo-xZۓ4ϱD9'RV_9m+ z!zx06$N4ttE7L.ڦI4Sm06& azz茖h=}Ws%f/]N:bEr!ͼ<~]ȟONNfcb-!w͕CJmE'P1,^x2~w1C]uݜdLtF`D_+7@0K% z$|EL}dAO''Ŗ/_'Qj㦳-bTLOPa>O3k]Y>:Ơ $J`; jp?I&nZ|$2f!Զ~v$=}L'$B}[oIn/rVA/NjIZNAB VQG1 ^XH',ٺ5]jjuGYaНYLD ߊrlLDP1A鯧1&cV;"HJL{4.k^%H H٬3dF #'b+,'8t=iefpΦ ނv|>Lczj(bAg\ v R.rC*I?qO?pr9n .6D]uc8*'86Tn=\ (HjIiNQ/ eqBA4؟N'`!f#PZuT=\atqI#8$\ant\ޓ1 YۑEQoT*Li8lwգ96u1)<؋tI j0Npc+4E[4^bGlyDm7qOA;s|LQŻ4D_խӁQ$S}:grvnmuh<! g=bRAc8'qf^*U\Z8RBWK-6%̞5IƏo~kߏK W]xGfG孝^Km9)WYcJ%EGe6r$5ZAl8ز6l+7oڽVӒZ)?Wjy/z6J/q_@N#ʥkPDY&Xm9`bU' {f?h)ݕ1w|7U6@lla\qvLғo޼l%ɉ<"Yt{0(trt\-v$$YPlD,UjRTq4MR*rr O`),*!iG^T9B֛Dq<2 _?]=E DX ~N ܁Vuɇh\*:3$S+;H]˯V+e_|aNj VB ҃vh\|qLUJ" t;.$EsjgKiPEhz}65"^ץfGC ~}P:~gʊUM׳Mfc %7^`Fϳn E2r"e\kϖIMBI>{ԍ|); " ѧW ~?Ivmy$W"IpZ)7z~wwo_F9 mm˔8]9{s2X ~eZK o 틓V ELeTm,  A j{,34B;o?;D%<&/扲&\E^yQ+u{t;L'?zERDss{VkZZxP˒(@" 44d$} q5H\u!׳5,"_h"n))=r;X9;0 El@uK5BTr9{yծk5\U%K^T ;m4Fa vfʛHOr`Z\-V=jydiB奢~sz`CwqR&[0MS tŪ&i&n`.ՕJ672YԊq-mu.ZShfr{Ą ;'Mҧ 9F38jVTĔ 4֖>ՊtIJlC)B/>/}&j~!%'{ t*`93O<{۶0̽HԲdN AqEEl@?HԍvX֠(g/? =s_t|5\`#`dB{O qXu5Ap,7R[zGwShy~pi"/b"~zQx( ESF(B _|nVϱ\*BI9b"HH ar2['7/^:F"'tv͝ߟUQPI[(Nt~UZצ5'ZeZW.p^K AݽT$P/?:Brhjo9q. Fy'PZ%D<@,X{9F8mx9求ZI[d1%MR^!T|LTSq6]1UA_0焛 )6 (mcaȢV+ @Ж(PE^$mP%b0FRl,= ~wYD_-(_3z]FqTIhaAEIdU>32B JQ"%Ej\n IK{o\Mego_i_hh&xY(@ABqL\@ chQmNѡ<ΣZǰ9]nbD v]_iH@"8%4;[ss7|ࢿUE7 \DJøg4L]?udzVT5&dxoTjm-" \| V\&PwH /Ǚ< qCW}_F,X Øg[dLU*3m6* @Y t}uv#||ar8]A0{5حNd+# ٵۏ46s@ggfUe;z~MĐVa9>ڄNi,҂r D`{{1\ӞfI?l\M۝MңtY bóRP Y(q2#noʆm4C}HZA4A%G?zͦAeOOLQ##E&q8zfY1Aue8% JtZ70 C$Ippumo;!ll :cy۳+emzY6W_zzyJ%rҴ*0&Bm\鲴IwZ'Z7>1Vŭ`-c>2{nV^8FZޫ5Mh@IEY>tXMdHh0ho4KcK6gQ!pYq4|ǩ|R3C 2@d皾E' x붟tvAdž[˦h]saQ/^B?_;nV;tf|,;QouOE̔aLLt$ʭZV+ţ?!%j(QQ1O'f4qjMR3 Dx 1ؿ ²6!tZ [\>AeNa>}{fH4?iocFNc|6C/6Rk(.g \bq< @w4'u#. V&! , $1S$!mt~~G*.5M`Ir-o6vmkҟ*D|5K2 *џAAU)l7v#U4[ _Mui,"-\@lo.5g ȏzFf'.%Ñiջ.{r Udo1b^l=ʻG]&;k.xXܨo`1,p{ϦUɈ0wۍ wS$B=,DQb])4FRxq!jj_!EBcr s܋W/Qhe8d/*|:yM|G㊼(7 ):W.k qL]I+AHI&e%7wC5L`R` `J&AY֩nMN>9p<9` M֯x?@Rk=w-Pkk[GiـwMߐ ;R eLG+11T Pk;#p4TAZabt?>2' LQ$~ EZ6:2[|n!aarmk3LN<{ \נ p>1h?<8ڳE{%j9bd4,pSy3VRi5hmHbsn?&٠B'K dE)ʲP4{nݾ2-{{Og=nK>1MOb8%[ kh jA oXYv1PE'JB"0E,~2cpZ̵t3)uQ{Ǡٸ5aب Gqg! 8K ]ˉ$%'3uo`wc[d80\͍D,WL}~uʅ_K|1 Ҟ!ddϢ#$i)]ӭ;~XˋWo BG`n8*l%*&x^{uxDn6MG璘֎&93X< \DXbQ_&sR65V&N)KAת[!!ƁcbL,=i#g o.'|E_<ٚ{u6I6R >F~>WZs<$6,J k[5&Ƴ;^!i`+#I)&Ơ&u0gX6ffs팜&vp?NIFj€xkni0!FCR,XygyF4"HqߔGx"x >QRH%-\/ X{0J4۰GVqUU;׷PrF'HBմUEV\"14S߹Nj7j'znQ ,Φ-?U3x&5ve*yAKnej!2 ܏p<]m|t?\,堞+{~I\pZ.BE됕(zn!Ij_]<ov$AVȸaޮW |3:w)Ȳ=gv@rEI>vJi,o*X66"MG[unp\Y:["iA֦Vΰy٧'W/H@1u'ݩcY[+5ߍ{׻7"LK8*: >GrsGa X$ʱQvjsǛߪ"/*;܄Nu@HѬwQʴ}H n?fHYȓ8 ~AqM^_vT5E+bh $oBCH(y3M.'0ʴUT}xSmTb:1f7#qÐcA@ꆬCg E,Ϊ^ۃ!$FUG[Q1tKD.c|vm]wkNmC"ΆĉA8+;U7^2 [Kd;KM˕rP.^vx7,5*{LOB#utCahT d4zh40|2 c(uEe v"/NeҨ+Eg۴qg۹&iBUFAh)$4d_ƇU)cѤ9qbǎ|d|=>/}%"7C.p}s_,_Z#O,SUۍVN%*:E+tdLHˁ>8EKg[ ~`eqԻZJ'HQMM6(鶆@FlAW&Ec2?QA=;P+v5U,h`!i3E'É9MTg^ǡ̳'?JmzwH1jDWf(OcjT7  ixMHSc,ϲ1b,& T9`v7JzbAoIhV).'d[.3mN NЅc'4t:Nl;t6؎ԉ/ Ё$!'}fvEVU;R8QVny .8G$CF$WM۰Ah:)2G6H .Ϣ8ױ$FyHӒhXSZZw b ިk|5gy}d`>SUڛ# !C=IAOzWoV7i$5jC`ӿ[Gn~p,X*!첧J_0,N`,drg+#qy1^Mo#$ۖtl8xgNCCgp26 Pߚ3-헖sOWuI^*ͿbXj  w >JQG5"Q"R]hD5%LK|a$◼@im^s3hQ"i]vb aqKٝBZK{$0cx\o)R7杘XZU ?> Bliwzä?G}ULOa h0B=DEeQ`L[W_z++PO?lݺG;&ޞgKLxfENv?>r8 }çgg'sh*p i 6ŖseaǗ$ar2l o=r믇]=X ޳'.}bRE!r?˳Tڤ  ew{s|"0""LKAe!# 2~Lcj]\/+92#Ce${:#YVK T< !A uZB ɇ /:힫;*y~\Yc "PXr 9JLyAh&I`9F`,h>eAN i!w{6+ 4D: 5@CNX}Qݍ*Wd _+*@ A>%(Da2K`)$‰q81Σh`LjI@dP*@޽>B8r^=8skK$p?a#w+p9]"cl5oEH"lf,U@ }_߿aki󲵶!}⛑<>}w!]<6'm ^C~XB M8%$~vKSe'Ggڜaڅc[i:n/N;gfOk8i IhZ{~s睹/]uv蚮Zo%EZVwZ p1kVeQ52h"W7ZRIeI@&"(sv:F30h Ml%t'N;ARMۛ;Œ G@\x]kjLt'W.-"8[7&&}$A?+% fK/DCsXE!=c1F 38ϚO[<-}@էvQ-B &,(C8|j ,4G})t}uImmNO#85'|'8Ƣ> C22[|Ae".KgC2(X4dF`&icx6M*,DTTZ]W OpwK  îɮ^F(qT2=A0\z>2{F4HǽpѹApS+w1]#1-^8%9v"dy2m*YmlUyPdF <'<Kgz75-'PALfS^bEny }v(e?bCQؖ՞h~fq]'W05)|xxqU6Ee+l@YBN",h㠞lE+f w,ZA.xH]o$Ad`n [>hƫ?p]ʯ6r?oWg`.RrSAJ[^:؟&4]0ZFXi+^~nאַלJLGeiΒDVVf0,U%qPjkyp7Wy$xIXJIogT ۝_/4 t;6S|*_l_lH"'7w 0DFjBS th4bB&)Zsyur/Kó;@Ԫggg<.G4K D}q3|^ޟt= kTZW阾_:Wh2@Ac 0k/ʮtuvux 4qŬﻈ~+\!Acix9CCz7j!S/MN.bntg"pa^fUg퐩2IL!_^~].euR,VdԍӨX+-iWT\a%Rh~j,D!1'0Mhy^]Ԝ~??Σ|5t<=eNJV`Q&A< 28fN!{ܴ"ղ=]=2lFx|?Q&C[AΓHǁ卓,|K0ɳW? ly:_ r8dHL;s"ljD;xS;nX {txh|5|}m "xITXT?),VrH&PIV{^%ZVƕ^loj;j\i36(й M6̽ Eo͌,lӏ~:h\&VQ-;ĸ,~(ͳ@3vQ1j2 WN}=qR8dqMA)(g&g YF BjwMsM9t:wWPqyq<%LFQP sӇ`E^ʋ(YOzh^Zg+P5֧2 2 >4]e Z^zd5b渎15vR_~}?( >ps``V/ޘwOSqʔ)V |"X$>8iFVJ35M h뱿+ӝ'wWBef%rb>$283 8/`={'"B1/#瘣ѳ` <= Ffk##k 8=>`Y``$qJPHzẀRINם\XYyEq0-F:`8"pp2ĭ͇~l5Zgپ ]Hi)/DH-WjT4GHs,4R9` Q׫4u-5mx?'ȡ8|v,qIfdyOGelҟIT='8T^kS/3AQ ^258V盲T KxG/4+ ZAf0 !R$UP3#\hQ`?9LkrdԾ Pycf20SϟZo Wr^fVozl|ӘK7XT$@JR()RscB&KEX*.diq>!XŲ\9la1RVņ,&$t/VSm/GWۦǹ1l0q$=j顽i&mImik$K4glsHHs `-u^#*T|ZKS]u0>*nxHs}=McCP"޲);]fLCw $狅B\^y^fS6qtW+f/.N8UHj[ࣷn)sմ;H%2"Wykq$cfsZW7\RRKk)Nxu}!E(. Gy$(0 h"ǷQTA? #x 2Ғ&15{{2y_Qe,WMg]TP԰\ӽ>S{%qBɓ, #E Oi9,B ~yP?G /zXA넉dT̘+y7oNTZ$ "i/F[c#Ӆ`T*y~r!rDJ)Բ "bM"H` ooJi oc`JJ ǓďiI!*%)rwUmm/آ /3Кa)\ @e5vnʞ#2Bn&Z@\XR8'aځ 租!#E(3S8k>],6fIx˘Fx.*ra hHh G rm)t8uEfE>&8gvbćGE),7 xA^ϣAr_~,> ׋At67QNyVޫ%EۑiI-:X4u)/.%To4,MQȆ\<}ܹH66p7Ab+4F@tŝG^ ͏ZE('pLEݷmWgta-:n,H_>L_]ε@<{F4Z6_%.Gkntwے4Lh _l;+İC\(<^RGJ.3m~:Eq@JE:ɳw;bպ^ ν \BI8`|0tllp@>HE6zL| yln5`npww9[ 0&d7IE߱E ,$Q-Az!4%we; s8].\Pv#ݩo*7t=gZ" ]V!LьZzh(Q0y̐giciBihVV<Зٶ5qKei0v~Ysfل>6!e-^㬞K:Li@ܵ\e:nĮbId>.a{ps|O?ym6JGC7TF.bUTSzp 7aŜOmDb2\ic?>ړXtYa,K,Dݍ:$~=;PZrRx"j=Cow~{؝:'_fdum]X 11;$9SAܥb4܁R o!r2׷ʽ40t9櫒,&@IW]1 Ðw7}`!,wMq3pyAÏX-]Xf8N+зo8}:&+Gl13&O lKrXM(l'\DJfÚ-jJmlc|dUtLk A %~躸jT2*^ܨt;P 4DQotc"OAMH@m#&Zc.RM:zv:!yFyv5 eDfbeGj[k%3YnVټRv߿\;5Tr+5] ӫ7o~o7/|˵=2dl-nwUIՅ14U)+<Ȣ]hn͘"ˁ4#JSgp DrĔtJx7\ǍFlZ #%n 1ѕ qE+btˢW HJiʐQɠ·z,i< ̡mV력ylHb%i=<B,8c!CAȆILjk !YΖy^.ȇڮԏI@W[/?8<<&B\xk;h^-&8h5U ou_BsjժF-o0uRWKqJo$n1ͭ׮ECi8Ӱde,>LhD$VAQ̉)i"! Hezﴢa$T1.DdDRXt0o/GgܦabHB%ou:&MÝdzIiv\$!Er9瀡 dC6Bh YV۟+DI.0Y tM6J.(<!^8x pMS|YɳI~~y8a$_[3<" 'D}^MUT|<<7WҜ<,2 me\M$+^c!jÍLhyC#\&JsP9\*zWƢ{; _L&Mj/IS"I3\hU^H#h/zU?>;M_ FTX: WQ|%2nφMR۷bjZ.eqV!ah^+wxD)+sV#5e"tåiiO [߾u (RէȈ*0w情Bo˯"KYaĹ@ܕ%Ǐ$W]<\jQ\A r<{O Btz7Vj-M DkYc_El<%!A!4a|M_{(/7g l)0TRtAbME ӂB3m8)eYcp4v&m_}(}+E+hlI[-Y(^_.g0㒳WZt:)Rڞ|++Q[ꏃXL`*\PmǕoFs.BTu*b%B FFw=]̤{y0*֤lS!hvkyXܩN]y 4Ѝ=݃~A=F{p^E) :]UWRbPȊb?rVU\#/:j5\]w-oz3AGN'^tu~ Kcl6jn݋Q]"ΦMA~Ml6ˀM!HJ7_A1|26z7%ZC+#?~8(BZ݁"+b)Q)qW}Vn68&h%-2P,sa- FŠٜ$0dumLýG'Opzy8z͕okFBnh7"BEW#{lmoַ(Q04) )7@iJEICj\۝uMcia !Qo6'$.8{f·7tteo$#|TݑʭZBUyBP@13)/Puik"4ER800).0vpDdw"K `&JE y)BQe$VQ(VkUŮb|;^' X2C+. 0clBAjgv:YsVلX-!GI'E@G{M.64c˱V$!b/9߇k .@+|FiY~x ַ|NRW"#h)AR$4ZC314A*"p!Ax!6Wr ,+0շ3e#ܒߐb;K5A݌î5ܘJS< )Ft{y?RwhkhR<Xޅ3x&OPq|//8\@GՃ @Wd5\uQ͗3p\cmt7sF+vRz<6KVDʣ{>D*DN;e+}RYTmeyR$xzwkjSm } BB酧z5i:o8j/T+(iEvZ:8?oWi%VUV&<+EY+w^Fag-Uk؏| 0NH5$E҄y{h[!nl@=`*yy]R2>]{Ðkpy)'Er626If*a&Ɖe͌ B&{J7ﰲyosnr?K/M<1V(qmwf!Tj ?|;4m/񫾠Tw>Pr '^CUkrS5biES\Pڎغ%f4y}:CrQUlo(טNL 7(SZf*:`ȜP7ݭTK2C8؆RU-8-于 f|Ѩ!"!kL9@L8DHy . V$  ߚX@ڍۈ\-*$Nl .<c`CGhUE[\e+{޹fa+Rz0V N k`;77gEQ A[lgZ]8R*=跷sύX oEZ`pY~xuLhyh=$E?|g̻g {Z'Nj΋82Bi ύ*%] GGEUiYLnB(`гon'_SB2_`{/@uwH! $xtm8l рo;y X鷻_/GYO?mvpz2*VR&ͬJ%Zdzɝg?fa:U[k[Rѣl9** Dz)颊XbF#YGQ$@c@G|2X/&np Grw*YnLͱ4HIu]D&YA勧|O4O9ZvIz8v2 [{ЀF$ EE.I"y l)IM?cunR\WiY!학,@$1h5;m'wuV ogU0 D?P94&Hdp|4j]IrpEzճE`Ҩ`1"#$h$aoG[ f( s Cabmfn,E66,O*6;&GfOۂtYd"g£\[(9Ԡ; T *\]$Qװtwtm{@K0zL((bti< Q NOY:@ڕ15w3Ƕ or}[ _o>8r`qۈx$r=aŸ>m-M㬗V7h]3:='QĨj oklH>804 v /Kp2ӌvMY@pA0Z>I3m8(j-ٲ:26EO1(P==MvJ$BQ)RmH`xLh3Gd'q;f]xQv/9ʮNt=fu[fYPMݾ{A\SꂱZ@Rq],c_)`,Yvȋ_4TejL2)~{rqq˟? 6:c, )e/0x.l-0p1+U[\fIbWߍN".w\*p};e'-vnq') {p LzAJ4V+iEnŒ.OAv.XEWUa?,g#Kk ζ<M\c3<<l\\IXe&3͘\q!O ͢ +8N_􉶙zS>Ih,,~Zh%ZT*!0fA"n="Q2kxTA^Y$3r]\PEgvzr*dh4@_PKtB !kc|4ƦRY.Ҕzm˅{kVOB_,/LM钰?!_]?#ݧްSpay7lrWzwr3rDYKQ2"`j[(~2QQzUn7;3MսnnMG}/(!Rp `J(9BD'4h֐(c ZcPW'iqyoBqܦ@1m%gu^Cb^S^RhYiV4k3~Ν7#+S+cD9叾QGMMR%9 y0ww.c1yeh $8!(oyc\"̑hVMAŗut}Y%)Ɋ [W$%E{ dt6T{ϟۃ U)B^0pp4 Dܝ^8:0 {_0x,fHR2dj{۶:6UML+qg F awmpI܈hO?L`kHDZӇ A'%y`8ǗĚKmT O~)'JtA2}$ɱDW??4vqcY]:KF"?WF`h v (P1f34Arel^*%IhD{~#3TJ'۷ί}3B0aiy~Tg9:\GMg?-nWπL)MN*~?o QP&6:u4? _8fA7i\TCNW͊@vĺ\`񛱋 s~n2/F!'"@Zߤi5 MRhurڇV*f(@GkkCDhMuE 9X13%F,}0nUF5;JtdꛆR#vyt_jIAַki"+pEj Ya~^\}x8/bgTʠ(~n}X71S+sj<`3ws+4$7UPyqIJ k~Ih4@G ?=* fBSEeqqlǦآ;hpE*2L9z\O.lԎ؁8 BUplD\k@Vj ;r@i)t6 WOXiMPckf D,`={t8== +3Atb9HVUPTtu9 | S6a/C:.JH)Ihqj ',$+ƛ4VW@`ɱ|'쟽*JT<۴>R;SESޭv֓ZF̡vtOX k(/^JC 3\%0ں [ךY{tThMcT =4S8-D;D P'vjgeʬ |zW^EiQ5TZ_Q'vcW8Azƙ:𦑿 }3q 絁,64,y{e,V;ˑzy9[jܯu^Te>+<^͑5 |+O 6mEaX@BHŀcc:II~̯mgOMҴ ` FB Z{w͕tu{g?|xvj r=_;17(|AuFPKX| of]ݒ~0om[/,w]wULQ|!L(rA]s=u *6mX.z_Nm+Nƫ&A]ovkVl>Goaqxs$`E2]k=> + ϟ={ǂ\E~_ ϝA+daMe]\EvJASPp#E^Bd(@!$b1wۇOZkڐa` aP,%t^ vx<+b狥Ѫ~YiJ ďxr,{=A91٘v02g->MЇ{:r`jpz$I|iXjŋb;6n/HgY2 "`\W o&zf<䷟#D@dgdiǥ|qsw`-4B ;$_/~ (vѽj4b=@7VeB x8#_=;:Kp(04T |Gc_;L̦,Ci/{_}yo+[xYrExJ9rݽdARO5a9n* 9 Zr,]R@ 7y Z7K3cM8Ey9~ϴjq ](,[Ğ}vg?kw-EY1ی $WR1U cN`qY,A *pf[%uU_}d!4^4 L1ÖyYOƱu;oHhv*L1䝣JB֭Cl:[%7(666(e5ן967/+ T? j=hVxFbNLͺlo0eY8۳+N>žou7BwAdp9p`0ww͚$ȔNIB]t)A`VadIОOP= .Ȫ^9$J9&V9%]<~z|5@*å,om5[ͳSQY c+W4iRk˥Qe8hy^6Q `4MhJԐjFGx<:"}1(\f|f>; %]B_gXq^(24E c]TbpmMr2ya^aVE ~y6:+S/ Nf(2XkN{h$&flM2)-#:qjowYmGQÓ ׺`rjQ!j;[o'y^sj-ֱNW ^$.@h;s\F8 ʢPΣ0Krhx;ZNӥ!lT*'2c EϸEb]UG2/;guNR(XbJEFPntۿW0dUm|Zza? Y9BK?>Z&p6pW$IWIcl/VE6XkDeh6ZIms2WPW/FeQSȇ9e˷<{Se߼{;~ؾFq*28R+{H؛:h=qJDQ4MUPr^6kJ Ekmb5Bċ;p,v/_]izKrpAP*YD^45R ׿8_9m+7f%1NiǶӗ4ܷ&qq'EzFsu9W"}ܵ# ]( a@Ŕ@ +0,CF*28Z)u/)ZK\y9p~*9RUMqZzAnHD$5-z8F~3jZ8f̲Y! a-K9RJoM9Ie!FK"m-Z-_,(EPdUe Bf$AP L^ٮotD9,)SnhfgLD\Y)"4蛋vY5j;n|:?@P\*8.!p)rN,dx F]74WÑIbk*KN#@ăt?^UOPS/,GCrC'qyA[Nח ]ܜ~lpjL&2`}1j t+? ZRpl ZVLŠA (]*UY0kҖ3[^]~7LMRXT4B1*K 'L |bonDJpܚBQ<];ȱYd rs@Sv$$p[TE].*UFXz.Zル!)Qz ,% Fg1R@ w!椭Bŝ{x:Řͮj@13LÀ`q.UՁa:D0}i{0 J[2pǶ5mwWTVR+sbɴ;ra-Cc`}CryFb  <ҥV!_Љ{wykc".RI D]#c^tM\0b\$fU)3 g䣞١X/GOGq6B .ޯTfr ESHʧy]x  aF L\3-R4E3LU￞6W8k7Ej`IEWg wn ?\Ћ+|TSU߼(:6( 7!@h%[nL&m:m؎L8^bYbYBB +}`>3#!.z^0(>AcO\ֺgqTwE i1I]NĦj 5M)DӔ4,\t:q` r4V%%'o?>ZES'Gǟϙ IRc.fF{ ~=/U,ڃ~eH'Qh8ܙ7AY ۱m(hY}sy>$>~,]7[;5U]wetJ\k\L݄(m P=1> joivcvBAa˙9ˏ] *"̤i7rP@SˣX0 ya<ά/Z/|y󩇣bV;o? ֠yuu5tV{>@Qs C;BG_H"*Ih(,uF9!yE EU )B?SPۀ)!C3vhzyмjY&G'SBHt[(Nec4ڪ6H=|p YZ[ͣ~Be%S?RP^j`NV/Q42G\TD% 8|s7 a\a ]gC4Al.ahW! j Oۏ}=]4eE<44ZCfXS79bjkÙoC#)Gusqvn԰.b:Z  *fpY2 z{}&V1"+_.\66vz~M +jzyFiAc䈘zP@iqbN[ ~2%cS-) E)O1@YN^vD 5>:dwEY+!q _^Yʾ.f!C&ΰYOweRc\/ͤIX!8$1c@Q \NqP81 oiP`WX"Γs(:oΤՉ'xkJN͗ԡޛyN8C\߭TI3 !xPsיxI@$̘mvo81XhE͚87 K ːFV,}to'JMpuW-/^<{ h~r|bZS=3oW=N8 sTmAUA g;vl޳7½sG:]yO粲*BԒ]ͮ6skZ?OE2VAM V*]iSOB5:sdLjBbTDbŒ<3B/:#籃~tg󧭩<=b߿ax̞q@4`6>`ҕY n~<!kŵ$9<02 PkQSj㚙j;Hx|'ɗWsק7bt~rcLƖqy`]b1Q~a]sl>X ­?욐;miýϮ  #ciz{ BjpB2zLlt&0~7NN-p5,#?aڃbP !maC-΍mRÐˊd2,X:A}.r$cjL Ε 5֪20aM;޼*u:~ &[S}Hs[%EDZ,F\ vf(﷪ do|'7H!-ꝆV]vC#&`(sU<3;aiR":L.!Y2B3N7UL%?jVjty$Z7Y&4 HkIef Iq+{SW Tifmס `8ME͉"&&Q q4=R$e0Bkٽ)tKMXI!2dQl߼0O]{׫Z=IkNLɌp #^ZqrPㄿPY'Rs'5l=gXCnG<ҧ<"3Mf~Tl* ?khAmn2Y$mCPTs0rnq6Yۻ̎% 8ts҆j}'qlҕK@+*2gE5O6&ix pav}r9t* ~Oֻ]hqST5I 1,Ǹ$/BHb5Y>]-Nd,*b0&%LX*t WGWÊbv#b6O?|7$͹碹-8!wjAA "6Fmƍ7hZN*D٦` b,ҌaNA O9 $Z'%mg[Z 8&}S~>pw,Ot6ۿ߀DQv'i9eB`ϭ|vZ-vs >36V$W%642\!WdYf"֏rUӌZȍ]V׏qO躥*JErx{'0pEd͍ Wr' al6TLAci.]$L5 \g3[mƃY~HѮ/i[n z~rKg f#N0RzKϺS[C'cټjJ'!q|fSLdYEDeBVr *Z+{{ |E^iWg3PduЍl°"Ւ`1)|I[VG(Ѯo8+gge" kĻ`m0E (g{.#f]9ꮃ0!2¤ Db IzSh 2-l}W3)zZy?l6xM~kMn+_rgC]hK,e~xx @ n?6 jy.VJh8MCi^5 *Hj;|33cB &`j/bp AJ_[0 $<.1(;hgڷ/?OFcy)-)|e֍q)Uh?OVƠ> (nbl>Н 7цAo Dzf?M[z$S]Z, tu,GC. :读7k g>6}h5%{詜UmoڦbH"Oz+, E5=pP.ʊURW_oM݁bĠwc_1cpTo_5٪JFDq V@mYhJ@ZhQi EBpMϊkQ0Y h;FSĉDVC?<<ۭnIl;2Zyd. +;NiO'( p6n cTc0GztarooS={Pf(%L#u5en(j (g@ѽmLV̕J@R@Ԃ 1')AB rؗofAj<{NH9`Q`*cf6I=s#=aU:IDha%7:(}z@2m,#O!Xnmzq9+'lmuˀlapyf[NBQ:3}n0@uڊdMOLwiN[_u!! Zv<;ؗ!SގAL(%l3 gs]B62aY3bAY1h\8Ujz+hޟF &q=f%:} ob؏ jzt S5EBբ^`Df5gZLXV>Ep% DD4O ZS`S-3'y1/7_'٭ =ĻeA*J%8=9kϽ&2$y̳4ZȢrܨ(e 0 _H9ygxi'Ax;f"$ifi+"Nu]j{CZLYLΜi_JC]FE<@ʦi^$4^vE"*.T(0bX,7_0ps+" Jz)U^c"0Zntvq%:x UUr -}{xB"` i2V>tq N(!sZ*q~kw޹G!n4'Rl5kkyYnܕ\U .0+k.¡<{2*fQ"!"b`zMel$8xLQ͓f!UEUU2Qln9hN)a22 #0;Ξ49[Mu7x9t(Quy9\@ 5zT'"ς/jV1"bq{MN٨iO;e8Vs|5NԽ`Gg4bsxe$rEK8GLJCYB4Kq4}84~dZͮQ1ݕLfh:'I^U?DMMm\.5{ -JR9mt pQ߆,WyS('3qm7@8Kb>.ܞN8&?L{ Eݡh5'7@OAqJlK=$BgqwIL= Փsah5m8.v2[lF|O;pIA+us8\^]ͳv[]&~@S G"x]bFL(g),Z8:޶( S$*SdŒ &)>wh@ %,Nq0#9/9E& 0D&f9IѢ*yݠ!a[JMrȆe1ꩪ*vzwxuGF:Wm.?]>2$FyIӳ Z..<ɐDeR`E Ė""*(MUvvFI['gq.;aQS?ZNv6wcm.O"A5W?LIh!c(e5j;63OhX': c41{ð* j/(۷mۑ0HFh?8,ݶtyZ<'rjEZnH:k.Hvi=jϻZͦ )6iCQ*Ab#nc0hՀAeeHEIax uНvJWġdTROf#$oW(ՓcgʢX,VC \ sH2O+B`Cષ.F?c׷ȣD(l˕Di4NWIԝ|e>%p0w3ߗAqVD 8 (+# Ek#{2 `X]⦾ܾ~gY[6TM͛i <0Iqw.DJnr'Gm/Qa]|2HSFJ*( 7g($L`)6EIxxcWp0iI@=nɛ 'p&](\廳vA50 %spR% I4MѸQk8 ?NWmMD KMpp,(&etBKs<,kUZ4dMqmm0x:X*4z{Z<"?D#>܀4!Qo J{Px +N4 `۬i^Oj8_Ϋm+轲ASr}c2yȿk&e$+'mR4E`EB,?pg oa(NC< C$͐%Q19"<;i74rEc0 -jJ *BZzKn([72 B{_9mYbOçh47@ m?p10%0]t.5YE8>}4B'[KRGuCiKZl<#&tzm<=4~H^I,l8]%R`Z՜W7}[9EdZ-?ERd "@Q0Q1Wβ*I>*kYX DdbNfQVݓßKF%0IP j[߬iA!lB[Gb:{q_v"b,:gTBV<ަnݸ7.nέ&CDz11FC˳NH\V5dۦH$'sW)βQ$U008j;Q/UGo؎<`&drsۻ @љ57maXKbyIJ1E{כ2tIINb؎v]9::ϙ#}x _۶ ^T&+ UbHw\݌(Fms/xtBA.O'yO_8crwr TM[ܞN 0`"`TxZKJ'L81]iTPyIFi{<I۠OG֣WTqω|ZLyyDRdBA*Z!+Vqܜ(Us7Hhde& A")V èȋ>Ս^W7lyxAݬ`q+dļ?YޝpHM1q,dH S Dm֯0mvdS/"-AJtuMnb%"z9]2 釓8Ѡkv" u0iw*S0pN6 MvgxUwe6Ptma㸷)ɲ$vghQӁMlˎkXDZS}x=3Ȼ#yӹTR;:BApJp&("STDB(pP,,)?XZEEn_b_1we/p$<>xh ۹eUAc&7坂AA!/+]iCK,9$>=9#* J>[LgM3qhEϞ3& Gޥ\jX`Ycg!y(h<)fh`f M+$%͓W%*Nwas擩*Hf72ϊ^ `)NertY[AJDEnQ[e^ YxNdW.憳yrYQ8oF%YJPhfNSηY^1",l[yMXHoQn=v3E,CHٹH(# fqި2&Nr_댂 bq4 [lSp$#e齿jZ.ĵ]UP%Vm|I@Lp0 k:9PWoUŊDHZYajG8ӕp6UN \-N'RA *f}P>MH?x/7~69>/oS"br䤹סD2P;Gt.NZNNImH#jmaep"'Ib&f Պ~Yz|x1$"*#) ժ^D?u\bw%YxZUN f?>-dEA%nsVg^_#;ͪZGQ$ύ^)H;]}wI=LzE^A ]og0z.o])F54EUb-"It! L&CqBzmnu, \y |)/geUA*R͹wuR,O G_|j|9uAHE1Z:E5׎*9`s>zX÷F(n\&oDZlZ0Iv iʙٵf}Zv{I c_Aw,21J~rHGG s&8sj ;Dު?"eƊDa ' sEzn+0xkoxA"%3Pm8$p#kv7ۭJ{6(塃"%R%l˱l'(EO-~&lɺo}, 7 ސҙbLKl>.p/K, 9&`,D{q>Ɖ,jHj4sM~&w9Bn2Pdi]`gG$]w+0_Y=*w;fȀGڗYY5.6F" H64yCp|s鱬$gE_15@ʗl$7u?}U{{~ݻ4)LM`_6㬍h6doVOtR?=w\ckC"`q£k f퇽bD3N[/Gg֜a 4'I4twi/:qbm -]h ;<|OM(ؑ0Dh~]iJx?` B9B`Hh'ݧ?̍j~{L7HzH\Rۃq'-$|s{svy^zPb.UvJlA@$0r8s&04aڲD -dcisC/)} pqө4,ǰB|ḽvb٤&ּo'A(HltŜ}W-3,N( zSf{DWm#x<|zv{z |8~{ONNVi\薘bE93XbI'TBt:C6b0xgOȎ}f;,_kUAMiFє!T6$ ),7R՛p{>Fp)I헵Ejzgʍ-< 9J 2f(Tj~qEG6BйcqLc>1%_`l|!4J *\U|{%4N &ӄThjbj_{@FOlZd!/V(4intXQ) kȃNhUEѦhΞo ݈X^ u_oJ. aM` pE=8N}o1̵UYL%ڽWwhdƨ,Yk(oi`9,Ftv+`Zӑ!8}RީUD:8f;r2 m-s]* jxum@ NLA ;B}4K q[sFǵAHc{~L'$Nڦ'1 F]@tjfu٣olNTɒͽ|UIJQUU-dQmUk C'xrAܸ1!`MS%d$Zq > (p מa͆OuO(L!t$,ϒAPE?܏ooGX6$6 ?iJ}/N ?<8zy?fPRI- OOޝ{J9 KI9$`mZ+l %Hhƣn~y IRZ 0؝>S1у¡zkTF,6NWy^&g6(p˞~ +!̿_^Gڶ"7B$2gfI)P:1,ܫ/I3{X@JB.n#;#JV{wK=Vv| ?x}*2+! f=kGZ$|v#īni˒4cJ"B pʺpj/l i7y6w/f%u r%af$O'ivk݊ڐ*Ɉc}l:܌P#M0C.VQ$!8Rꆼ M<pݝ4q{ ܾ}}$h^ ,K PibN5\$K'ZͳErT(b<reExgՓ/w;-(--IٳgQ0~͕? B7mM[H4JOFjN.-N堧Q5 hFV %(FkZ`(o̧s6uEYizMj^xs:=4qx` <˼ԫ5b0j}?*fSdacd< qNg$ڮKd]Z,%%bEبn%vV=A7H8%tT*U43Oz$ 9j'ײ*l䆔H/%Q~ji1+^j|q$W>d}ϡ€O{)3Хe#@7Ųe1ST ;i'3cM 88pKH<=hJKeme*I82 }wwJT} j(p|F~yL-6Tbω/$,߿t3 O[rVKWg)tPaJ%fI( ]h<.@Y .G,D[P*QL[nJ6HGln/ڨrFFמ; < "b: *8.5c8$>wLoӚL1tI*[f}m!X.>x\JȥX3ÈcOLSETH'5[4Fo[0>G pܞ(6ja8n"/8` ")ѵ 4\Gd H%a}̑y:Gϋg8^v,/)RIV*%C4z񍔫XnffL;Uyw}o p>IElF^=lU%Hxu%,GbD)[UE#cZ*V`8BV8e[c=~=9дRS@VI%Y4+P޽= J _9ӝ!it Nsja8Jc`F4""K/ll)NƝNq\*OXbN=Zsgl~׵/Zgx=^Վ=sdIQB}p?==kiX\jif޷upُVf3 6c;Q4VcZEmә:2Wl ͬ~ 8'}b8HCP}( %؅m'C=} XPpcc`N ?*IJ%F,k8 sʱ fv>9??vzgl-m $0FʉL؝X7afb fVƃ*X;a06 4!F)N,O2ëi⫋4Ԫg&RD(pX'~H@xX똞ٲ0ng!|b zͫ]tOh1܎؏e)I-B,Dְl_8irhXgy՟רt&~~nY E"Mdd$pdNzquZi-.]Csn KPM{0sEAhߨKe1pQbk5I/2Oq"'^()J@JA*ڠzKv|~LJy,z'} l`QYBPVm_ʳheIXDDrMJoDPm;,K}>X^*^^*~PR/WUU9XA7U|֟2 b??.Rd]UvcIPDYkqoH6VϴѼt#k߸ 0xk翘D_0>_DQlH{! jex^5 skM \L 0H/ rHS'p (s"Q[E`:K}BaMQSܚv~TBMcYTr88(M-׋}ՙ.EП-@bII Bf*"|,EGWV)ݾ ; \ (5/CeiVi3]FF#)7ZBTxޠY)tŇQa(SSZ؁@zxly M=&YDjy;6X ]|ĥIC1-DV ʡ=ITh#yBLF P~Bѹe_Au"+Kj7'hH C_jU V|a;[-+M;vT#26H/OCLA%tjCUX (r!d:))l;%a|^>uҡ̏]w1RXVE*_ ܿtf?N[QxLI`f!*_>>V 10$qvՒ%s]/84Jr$ O}? 7f TEwd>gQhɢ(0~x>-}۫A@qJqg)C]'3R~4L>3G0C2mἁTN NI?)Ϸhˮh0EfBjzI]OE ;n팧$UQ;C3}hD K=Ӭf(r2[:KCiJ-f7!Ԇ.@39AIAT8buU2*tAwY\oMvݖdf #0)ҍwusg^6hr==wHP =Pf꫿ =L3HWE,O?awm#gJ`LaE؟&iIVE#gȂjuB eH{ʺ p\~";$mu@$ηr~ fPzqkt4^kF}DԠcA'EebK|A]]\=\Ye&;'"OP$Ub!]fJ8|X(잶[cE uAkPAP2'ȏ)]:}|AoSl4t?u"ɥ- iwK (`$/gamLG LU2m'uTCz_v_o-noe*1Uc46d+Ѓ0])T8^{C(B˵kU 7LD'yUswbAh" qe|,ss{*\.\K|6/T^̷]^-N^IBMVur}'J@vSI?~ ʲl Iَ>ӥB &#au?Cx膾o( '9ս0&rz}by]lҸYi@BT)0O ԭ8CZE W3df"PT7.,޽,쵣I>$Ͻ=?//rEfK=3)&9׳ߜߜw6[.#HWIb᣿=׵Ff:}uþ|ķnJAs(ȱ2m*%"`7NXPz 18U$ެP~۶8.O۲|&i鑴]6`G=6`= Ӱ;4![u5OH//OӴcA~*ۏ/^իA  J35#=8ڧmIQ#A{zDDb'2 H xQJB8@kfIdijJ,dfq*B1˩"LNvGnyyeM.^w{av[ͳx9OV"ԥD:,ȼ\("ONj͊,N)qrgSEcC,Qy375J8lv;#ј:Ji3rԋ@Bj|ͷmvPW2˖d6)caUP6x.l*Q^EVbF!({yt@m3u כFigю%)fs$77!Y˄)%t `ndYwdz.W O3A~ek"f݇]cТuݞq`( @fM̡؜m3TJ)Pa 1 =sضkS:Bd0"-b}_'|:"ی'!"5vMd>G6'P䌽hR*n&xzttx8DPIc5K$F[aAu4$-{n{ Fi8sKWh"ͥ+5??)hƃ:bAQw''y],gt YHCf͖R;ԹG|ql24v pˮ72L͜xS!>}FPΠ{H%D%\E]QjiY]9+( Nq<]L7N%ZUMTUzvߠ𷩳6'jOU4=ȝ?d^9zW*`% Kl'bC{&JZ0 Dmgm=$@Æ ]U0YXA)4fYI]9 B%_mQ{}aVe5 888Q T^P;xze/l8nA2Pc?YAX^$aǺ!ڦv5o0#H,+D*W}bI֯?1w;yN>j\82V OxPț{4H`ta)X{xU]Q3mnӊ0}b˲K2̴ӏݙf:m⎝-bk&$E9.%sgA2tguLEwq{z8hn dY$YyKMSS uTEdU߅dUrAF[0̢$#LK78]5>AA2s@72| ?#Ҕ :#bTA:lbN0a7 SM`S*2F+%=7(P'5]3 ըniHA^䣊:;Td4 \wuku4[ -!r?0}z wCУRjRsdr@}w6GI"H5h~Փ8zLŠ EN`&ΓEFի}In łk*p4΍P S֎%"!DeHc'1 2[-v: 4MfI#K~2(2 A{L?{nlޱ߼xUwT|IREٴ2 +.7MH4{48~}U.Ypr˶@r$>OHb7L҉9E")Ee׿Ӈ4#RY"#XW!]`N8t7Pp\zN MYl+^GN16U'2*]MV+pMY*' ~EOQl$M,r44಴`{ m{{ywRW^qj)R&` a&HD/_$Fy: mn2H`s0_4b7{t2v"hTbLGczQ8g{KD0_~ׅӿVO^k uE&M.~ޫ⭀PϓbYL#~춰FkpIAV"׹9Q 4elW\RI &maB9ק<h^m0U"P ^OhzR/N~8ݛy\E7G[p,*6/?NPr4:^cK .^__1`@(64nJvgm N@x dHȉnh/Eg۶o%K 4K[tkO=(z(HR1j;%/)Y$ĝG}ߏ༡&CRBP6܉3O^HP"Y>Hvڪ*!u*+ءw1 Y|Y}3j+۶npmH eC W)ܑ8vaWJe]-G#R gJ[n椈29rWs9eWq!D4#듋)P)7+ϟjܺ7X՘h6)JeD׶ZB*V$HJ\DF~$hwPTK9ړfYR@*$ZwH#Wqd)B[-_v4)K Ö^vՠ4loճ@eA42pgg#!Kx 3;D.BD5ך^sgi.Hi)? LqXiͽvud-Ǝ6efCV4p6`_U8pvZ+ըHTmAfS*J'JuLAJҼZ:.I ?>X rʨL:+96*OW.IX%LZ͡h2kP0IϊX©\t͠H @N}|||-ns*颻ENeHXaui{thmD@W) u19_X U bƽ92rD8~$^Bх(ɣdBs^݀OżڪhzmޞO߾dn}LKm[ݨ}yly0woEzk;o8u'ŷ/% =\!ATպ7\ y_~'^fUtaS|XF!e`tA6$a(ʮqК-I6^1=9k(yNЃD^^sI, "ET,{s-l}N$ 6]k<Ѫe֥!h&ڰS6Bз{+q e~'-N!C7QaSiD"|1-8P )le{7ے$ƾ8,ByRU(nm+{<"8G'$֣&+Ut;϶G 'Hm eYA! '}REl*| `-B4q<4H2Wa""(2|X3mۈ(6۲Ď,h}jѦ(RH,keQ6{*3ssziQzڟT8ftWum4,=+3.x d Z A@amۈD0Z;C+. pfIQ9 Ұ«<;}~Mi˒dZ*9P a\64^D`CȘr[g㏓d/qJei(ʱ|yD1F i0a"T?}{c?|.w EMxFCw麊|/!rq^08^MT0ݴ=,ZnRWULf^М|R(ņw4Dvf K ~,JgPSh*OnZq-h \qpH ")x%e|efT E$liR.e` PVnZ=~ocoQŶx14> z~\}^z/N̼oj%nWC0Kq qLJⰬ1$P:2mR TJ@8Mgx9m94u.l7"dY0 Fx4Ń[ Ks,-/CFF05D-.Milu(MNfQ%1tOmCk~SWvVIh7(`U<"K0S'Q\^?^lܖxKp7sXNBIK h~f5@pax~!jпNnuas$)r}Կ" ${}.:q{/wo>h P)ebNW8n=k&r48>EE("ʺ$$JQTہznb`eW ضjƐX9l O'ʍvp'w]`zyL$zXEEPzߏ2Dqގ aR1$φx}yUfOI/.^]@z-7~ץ{8*FӖlf܅l11$}U:!1`1难-QEjfkwCS!Exg;N˽^<-%` >o|v]]5m훮$(#:U zM?8:E(s)(*::춛K/IM4M&쮻D`MH{sǿ(š% m}51@cJLV3B%RC!Tq|͚ u"RIJM$ T-J@Oq=$޼gUJ25-1 a:0Wc`?O[vgaq;˭է٭O {йd3Q@Ңbk:9Zjd 3xwNl=wG4%Zj3 Q. D`@x=; 6ړNCn viWf)$Bq$9f F'S3>"j}%ƃI4Qo8]8lspsZYVvʣPh ]AyYDlnxMmS( TMDy(:/4A'I/7[͐ y$VD<'FڨUS g#{e1~CNTf愌Vxbω*2Of,Ft6MP共ҭK({aLJ@x8-5h Ð2X~`z٘,3<+|ku ~ ȵD?RQWdƎ,ۀK8~F$RQUC-+##)EXr CP}Hn^88) #ofVskrRr .&ȶn}58]reYNE*~dyQ~.k iqX}hcE+.lH)ac2JcgAKTe\gRBIPgϿt\ZA| OrLOWvF~Z!?~& r9a8H-a8Юz1j./Oƀ*/~„ .ꡂd?O<cpľe񙻲r^=ClE]r^Iy``\8%|{tmo  >p%RpP5*/k o4ӯ{e܍2ćx0 mT+;_>ǚ0uQWwWe,ׄR8PJѴrW[mg!$f$̲ Hh cc$oQFb4s,~")d{]\~Hߊ5ݜn]UiXIسm%zJ JpKE <;]U={K϶-sePSVyT-&}H]}ZǓ `0I},| .gG$C|{E#iai3*mH*",B%d'Ծ瑽r5]u(n`m꺆uHCYxn7@tVACD=G{`<:)EX8婢 9yݹ$ۛۢȠu\|!VU!UȊnoNHsvk$Ci!(P4 $^Otw?._ﳬItt8iAW q@7^֓1`-mg6>|l>{5ћS;184H`'-5=lVO.&/QmdZ9v"(:OMob \_ sR;4l=ϿM@_WPpLEU<-4FQn\dǷ칃U>TC/WΨ& @љmQHr%H$EojߠE Iر+dm$EJ⾓qS1lo\`˪̱b[-&z:ne;É( .h*KbJ"%Ŵ^/t>Uð)͋B`5MKdvt ʁӈ7^?L>)hF0exۢD2N~sx 9@؀j4Wָ޺2uk$U50ˋca3/p4宂6Q9A$pR9\lwiGc4v}]YE,b6'3Ily0 r]:QToj;*YEhyH"ASLݡ0eT*:x"ImPIB %r%\DY:{}A\EQ"<:Pio49ϫ-6[>?}A"TGMgW>u PC^( ɇ|Ip Aq:GBBaP$hr ƱZ,oeI,BUA9ÚHF_AB@Ȁ]3aV/3(12\k}DUEnd}y9@WhЈV(eq\U>VaOL;f[ (E~cl08KmkkHZ ﺋكm U%8Bdz{s[UZ$I Őks5_1EM7so5X/7{lE7YQ +a͆i/R$4t2/'`(INjz Jjo}lpnq tpjnV8?sin 0 BH Ŗ9鴓v:Ett4N3mĎc+N+jnH@kf``~{89~^w{m6!$*koE!4d D<&d:\̙+X 'h< p!Y+cif1d=gxeB6fCj(c Xy$ ŴLө2Uf ET<9:QF񤇃b.b"JT@Xligރ ġG(<(SRfuixɜ+/]~zh(U@Ŗ;h%DrF e_Oxj>~<[͖\Ut%\`zYzTZ2 8BH$!(DpmtjfFa*K;Fl^Oe1୭no^UcޣPd!-ӀK ]b\c^MKÎrc=n(^ "U(նFfEGth!ɕ,KՆ(ٖ6Zx?/E€򽅱<:".&!Ժq)t@}r3*Ր]c %vO^$TUiK11D8s, SQF|ʻjya3Ы#:J(Ng=×)B$l k流%+VJtfó1pE)s(g7G"PhK$WVs I.;jӷ}';3mgSA!@~=ke嬽휜oS?8躑u$EաjDJUI}\Zc B0=3LQ=nJ/QHn4x(l ۿTdΨ?zLRժ @q !' / fͮ8Z+;'F`O_fgFVqu;pEIhhJ8 BVke=pk@D%X~'JY1X-n M}xq}e=ZO:Fp4 yB7,0e. Byc\Dcu|1T7+BZ)Cc"2"+RnAlggeߚ8_v|ӛ}ф$bNT9)u;+M:w/䰊3 #.K\_;X C'RȻ q3' 'f^QM(P дj3Y Uʥ{bY?<\K_~F:# `C 2ˏWoWW#ϲih$D(CI'iE(0R謮T1ryeP$ I2aţ$cެA=jNv)Ab۱Rꦶ7 r#N Z{- Hj:O s};ک5E|AwMHi[d0L0X5x 4Mf,7\IZa ^*) ҨlE锨\N(2b4!sE6<%hMP DFZ|[)Bl4΁-Ճa<Aݑ~I=h7aS g}m>ۯ2lxuāg=pղmP:$c !L_/֎kPѦ1=>1 ikA/KmogtX.y2MqQ˟0ȍ|:F1Ȇ]; (Sh@zɵ /r4OV`P9$goVKm#i4M?/8($qxIְ-QԠիp YuL%`S{Yl" /no'MZvXLE2vZaQz/ҳxzVa֦ qΒ PV M@$)SN` O\YUm/5r?D){/O*ມy^zJ*ƕi>)}+o]'2L 5FxH:r)"̍fQ '1 Hj7[)6ZD=U*4Ys"?d:Qf0IMwXQV Ue>5ɋnE_#b&ggnVMk}mUz7xq\+k(" HX=Py^#w *WH)Aw|Fd0XV$Iaۇ8KDO؇XϮ=Vb2k%a xfhp4ƆԛvЎdJWR oC1!~ܸP` M!sBό1aLEP}}mEtZ*xq~R[(!%EKP,HO##]M"XF;CRdkYb A=@'YT ,<^~<"DX8DABm=d˫"kmק ta \{&0N8m75l[ T>@ vݶt&b;{<6'B/eyJ3gvE0 4<(&#QbLn<(׫^7'cD S0ˀA?}w?{8P Ӝ7/qkH-eb:4Y-/yDĴB[/j9R,pk-Z^ m醠|ƵY1Lh!E i^쾛8swʱ[o`WVb()b8>,i0Kfɢ !h#Y fHQHb߻19ro2(tH^ƥ]cP|g6 cLYFؒˢyG^m#/POOW`\;K0>$@y:淀(ISĒP<-'VR6&0Oc6^Gt , DSU0{.[vV,OF`Da8߫6~*t hA˄q)Trj5qPK /r'r箿S2G+ ⯼jyx|ǒdĜ$mBR#,ϳD땴'JEqjM~ ҍRVz GP,ԕJnD]TU/{iVOmIM$rQP+8DL2leR}ߤ*[eFgt(mtshΥ4J {u0VMyrqu8@,NZl5Rw7&nʖ36u /P|FZ^j.u&Mp?NfV}9%IMrM~_4AE1RAJ@;A໿o.SE[zz<9ybu> b F7db.LŎ4CY^kܳΠ̾{/:'7oÈv빚 /s4Yz rMv4RQ]CD_IwGw#L.tK @lM]ؘY-A|;s^^o,cJYoo D͂ˊ}xiĎ8̍YbꄽJBoRFsCZ9-ǂ0h<G='/wdTl[)300: 8! 8At&Q}ao>VEz}UM2ucG&JfS:&ڐ\7@ss,Q<4P#\)`-J9[ e/_zeHN.l~Un82]`N@p*%Tf*CT bJv/5$Am{EYzLAr<ǔ,c T9Fw//$ζ"9捺@dN¨zp6=hY[PC)Z$nEY933𩼺_QUSï^^~40/e _S-UQQ@L\/5һKṕ%Gh|@cY:YoxNTPUS3?z3wV0q4F!QTigjXHtfVO-vEAz:yfptOO4m E5t$qhd(cD!sK-?u;@q lTln4L$Euat*b 8DsRdNcV8_Wϝ=B4f ,1~>uWl@`d`<KGbJUb8g!Pc V*1J 9#pA8nۥ6h^|IŜ\JU®]A/<0Q^NG2(u<ݛwT(k$Ŝk3iN܊IHHUBoC$n$^dء)FO@/12,V g۲AYrlJ){,ͳ ȩmf61&0!ה& gz)b96;')v rN.Nzuݜ=JM\]1NXQUIh-.. On 9<_'܅4TUq,Ȋ6j#"tOG{p6wOYuZ?FR'S{`~vxmCYЌ1>~>~1diF7mo<: T7m8Z"Ꮁd0u.c D6TD ܐ[m@r .R's"K$b5; ׸#&(JBʊ6MW4eK "U \Q^q;T,iMfɜޣLB<B fb$f#@d* 3Δp47[h1 Cv™״(}M]v_ AQ8Wsl%03S@1@Q\-i$84OiA.t$- IC YN"rj^YEyҗ: DzHH2ywGNED͎oy6z2˲lQB ʢg`n>tCWTb搄)m$:#Qh>._ H#H"'ISaZ*g箄 0l;ݓ#5X$Ffp˺TY#v&|/ҤJAٚ[XqXBֶ\,{;5^ 0LR4`E{h.cj_["vlp`0v_=P̋ :ͦOOBg)wm{cP>o ޸ f;]r*1ޒו2Ymml g[ӳik3o4\m7zdNM pDd%,C/ّ+:E Iɒlxf(Q%vW05 bl4;Ya|49~zuל,(F`Y%l ̞JP U<[73dL/.˼BsKqTV+7w#}zQ]~Qj`C{sϰ%$eH@/Fo@_tӃQo}x /0CA:+@1z ٥8#iw8&-f5MDQ"_"H@7SU;a)!` 8LfX&0Ͷw@[&,†yzW5.C$$Yl8uɚ:S<&nōdeyn?}?o-`T^ 65sLb;cm@Bh_i=AW?w}~:Qj4 DiFdCn:r\-UHyvjf9|pm4ۋN3z~YW\&; !. s مgB1*?4T g11J;;AcBrˬv#xf~8]f@!4&2 n"DirOhA{u6"J $omnP+UvS"qSYO)wnz3)Z_\T  t*Tj\/%NOPU% -y 8ۇEwTP'h i~΃ i$&)nv =FYtO ԊBZ1 MGF+y="G鰡YD;u[&+(ZBEscF2V¹HDaϽ[D)(RNj a=y(|| -oZY?9p9'W }JY0<FQ[+m " w4Yon '~A~Vy)a_ 0֪:(rS K2cĜUDb)Tq^EFT,ckgvyY3# dBh*y3%ɇ9QXĤ>@[k N `4$ImñaϨW UU˪*!>GL6#YB8vn?k7S?a{Φ UTle]Ex(^Fڙۭvåsbo kPɜs2LEV=F%VP ,Q4Z^j~;30SA<7 ˬ^Zy6*VF[7O}"˿iz}掮+*nꞺUQ0OYR*'BF+ iv[8vJMػ>V} 48y@\j, Ϗ24RB͊qbR/^nj=!BIS*~P# >vđ]ݬ=.gQיzD,BJ0$4RDϣf0"!xÒm'sM*R7ypi6e \Mde@M+qBYxp"V$ - ֗½[zA|kMʦBl ADr91:#/EU_->j_|Am.;f# (8q௿vvrHg19lI1PkwY= [#Ck4MDSN`)C^Be$\t˚Pl' "i7$j5:EZ2%9d Er hh>l#_R|A[dhby?>Z'^pʏBX.[ U?y4;G.?G} 'uv9n:KłY(Cgİd+ƝQwox{q뛎k˩=lo|ywf2r)C2tʺ{3upt-lVhIxL8[uD`,,z|ciږvձpj|̉RQQ9x`o8 PUU<+,,9QRi;:)VGj=! (JrKA6(?ں-4}MPG/Hcc,ugOeZv)dz_CFBH8./K27*+tro}Tϧo~~m^[75k?<ě^w ,b8sk\o7;jqP O򽦎6ݍ=FT^ 3( O7-hXs =;?0Ζd=ubR`Qt촚zkq7P&{hs۝&A2ݭ|aݗv3`Wx[o!ac]WkS'V&B,~60IDԱkТ-ܾHA8u%&>V$}. QeI& .?7Ri]Rh[/H_==vS,}Y"ڄVAWʨ˶#1Ne #=y|yzu{zZ؝kL08g1 <˧aehIB(rG-?6N*dIVTɴ;OwEA:ܝ_o&/N0r@VA a`k`%֨\XK41=VUWdU*Ao$ԊKUEf$X:)a,FI腛-z1?&99=G߾5vtqmY͜D ?m̪.c $HbN@I^ 9Yy7<>w¦G##Y@iMcpzzL $m %je]ǭrDT$$.-ç+s|va‹F}sH[ͽ,'=ch.SY^9ަި Ɋa ?2{(EʳxpbUݦ΅_~oY"k a:{:GPeV*bVţ-l׳*/q,PeqwT!t͝_.*]&f=omE2/\}V8xnzBu/p$Eywna D5`J=0%_A 0ǐNJ*|0|{>nu];A;%pugT~ j1dX+1NP' 5Wo^8嶍( B $⢨ZqB9>i}nvqs]~gʊ 6 4M6rM4swA(I*AĪÖQ2]v^` 1vuCgh8A=)z[`Y\H 0*)!˒z)/8=a>, uE !'`qGkIRѕ ol'S<|sSr ZEܣ5QwMʐҰ.#**$& ,YpC;'+$i\ηEP- A<܍#n$ J8e|="sRYڎ7zzzX6 zVa+ڀ,B٩oAp=^4``= blfDV*zC>`i~e`tDe^՝+DpI]6w-4I@e!"mD9Mֳڭ*wv[vU"2 l۲XzV O_^Hr-J#%SZ+ '*qf;Z6r./!%#wC+Yxd^\iIfҽ#Yi&qi:q"]5CiY[ma@Ȍnv&FW(Lb]o\V_t|i {[T%M4s'槿C>΢o66Z!SxsX)v<jbh љ&nEaF7l2dL2UI/J}h:RѬʄ,`0\qm!]}C_ \˽VWP@A<;?Jjˁ3 (e"!Sp:׃$z܌=̓sfțv֫ϦT +P E 2wlAi'} acT|s)-I`I/AJݘfh@+2l4E*gseG(F8?ɽ\@՚ 6FI 0a.\@Y#dE8pq4<~ 6Rb!:4Ǚqg-f•p !8f+Y񢪤ȴlAW '#YR9 D3m0==ѸpTn}D`S ~jh-c_X7FZD@ʖlXZ!De1(O" N{he؏L 0UOk|Q"ŜƉNj0=&;fYBB&,ެlr(8Xfe7Siߎ$_w7w0#Q݆٪6'ŐZ3eɩF$_iR9* lut7]ZM֬2qۅ PNI C~<'dpP)D )͓U5mXN׫YZYc'CMD^.WiTauR+ _};:;)tm@g{W_OOW7-CHW!es" %|\otuFjģ do>f;,I㵿& R ptb 6xoi/5\J 8&4&5̘ĉZmQvƋV0rV*Rf љmDQpjdٖl'4m E $v,;VJګ;s@!7h0J5m涊5em?1KՆ6{z2JG`h+m|c{_$Ktu߼0nnb*onv)OogcMH.}⨌j^N A8 {CY$u* /2#΃.UγhV6 CT C Nݙ{^x 4)tq{%ÃNl3*M)"F/>_ nvj@_UN>~|eӍ$?tM)}'P%5 $&tibt{}0+) dРw`-WS~ uDdЕs/̙nyk2'UnL ,/ݭ["o#85YE%ӔfK E;}`Y3U era:koy s-=:fk:Yi!C:[ODj[dhte]Zer ypƁVl g:59usgQ:Z}6m a-;F,ttT܍ F53o_? 3 }=1sXA!].NhJPj[PRa7aCLp<|zΨID\juюQƓR-$'$k`:zXxh'lP:L2PʀBmV6S+0JJ˷Bq e4v ))q 8VE%%TWO NNGgOg!?ng!uNە$YZvYWZIq4\kՋחOd%ضi-]sȽi y˻EaVcpGaI'.2^fk9JJP3Ƕ|w8gqEQ2'4I?^|~rK\3ف9YSȋ=}td!p>YT8Tnw8̞=;{ӏq_q[jG9A!it`ke:Y,h,|h^FevwF G+01qhI)[k:2sQETY g YC;)Lڑ%O'joX ͵~;|7{>B{gYWI2,'S<|\0 !E?PgCɧ+%ӢHK^s&9"rjW\hHY[KnJ@W"ƿ}VvS_5pbUboO8~m9%IүJ 1.@^'b9KjoEmpb JR`x|lHqA6x Ξ?ZǢݪzoX"d E.7+|c0Kh;DJ*gٞgYa{V` `xRЗz#9ȯ6A K+f+CoeƐaX c.N7^ܹ`t" jtHQ {Ջj_׳&:'ݳљVZN*ՋgA}WQN;ki,c/'-Ud3E0~!(*uPäjf{3JtQ¸ Owqr*qjWbȯF9`!qRRG4 gh. ˝ 95,U:UjX׆d<}0nkm Zh_f+p-dLHUkxArgi~|ƹ*IQ /0{ &qY_ͨ*g5g *yDe pVova h!|p&Mr01T/OĚƖW8%n@6Ѷz*uҠgOMȆG F:3V͠5 GpI8~M%A2p'0&)i[}4ۏ-̃y?&Iڷ|,G g$J< ZLļ EJ E6zo{q@m\S)޶+9\ķ$1tЬa< DioVݎ3I2ahEJTUb)&}{%[Wycr6dspOԎiv$d ?}~>}rnR`sjtq"<&ebʔ0.WN/O6mQ6)AZ r`rmbˌݻsRLbLd % J Dk#ChR*E&<-dcETp]y]ko)}n[2لlZEӅ ԕ|9}`MM eፇ$n=8k[{Lgworxg!?\9}<'+4MsOf֮-d6(Qxym-oh9g7ɲhUZ[~5:]I!9C|\i+4c%d0\O.a瘏|ӎDh7Ǐvc HT`M'< %[Fn#mCO2$+(pU]/J.-pȈ Akb<{O,0zLbFR"WkFCN ϰxFD'%ي42&`w"LK*UL0QՎ#̘-BWjj4v_͑v)yzux],IͤDCb-Ӵw!H[˔⛱_x/}t¨a"((˭Z׶f7/N{YnLeGQۊ-A΄f\gk!tSӲ M:x#-.3Z/{fV@8,`$҈=mӠݪyiؘe($b_[g QzT\ ܦQI S+qۆN-ygIMSOEѿ H43 ?;˛?/qr0U2O`_| E봐QUe6Uy&?1e[ Ijp~vg Hr^%Pf<ǻ_Fݧڨ7JcЂzdYDbWZX,iTSه^ɐ|ftrVJgAzBvn'k0 y%eH*PҏKk0#A~5$YR8Tč>[]GF>,@yY4$߿Xzz̵u C۱>y>{_7AMjj h|WŹ&ho=ZӧF&Ǒl]H?11 A+Ue`)e-,ȍ^qC.۪ށWM;K۷-ЯMQay4a1V$0$Ʋ6oGU=wt^ڣYR$ޔq;v -bWG&']~NF# e0F˫v/uz8^T7hDd04T'NmoYY)6ke!&RdK+_Lꯏ2A0lyU?)#ypr0gLmBQca1Z&wC Qu FX`Xr /_έ7q#_1l&l.$n/{ѧjJ]M 0clͲdif<sW ϏLYޝ\޺hCar؛Wo%>0bU6@$Z׌~ﮮ(UHsЧsQn F(C>Bv^E 0V[gcVr1,Qhmvfә񇹴W5^L ɢ7őܩabqGĊ%1QTs Rlð]T%{mr'`f'Q̀/`Dgx Mj/#દL@EV7s?YhG8^\rf1H7";cq'"jW}vsCڎ#4+h0'Sb$ʲM6/ ^D!Ê%.܉Bϑ$s_4,TA_Ӱ7mfuozae[;J]SS:6pp;<mE#SU )X4nW~RMA\/`+Eg۶`ޤ(^:IeDz$Ӧ?FI+CώGA0;;}v?뭮A-]$I^m[#11}HBO(s ʔnpsw}s=_-~צRVD^MG׎tǕ󘐥T/ú$%,2/VX4*^,.ܱWҀ> lf:B M ,lȉXlC%"`1ޭy@-YaJ_)lϱbIf4ACs;euщI29462.3Rj&zTolmͳ@O4:y#JჁ3_6R.LKy%,_Ӵ'͓:C&NwXcm!p‹}r"e4~$4Z1 j s4jFC)ijRKc2"cj("ypgJEmàPW?8^t K|*/dU?B7٦D+ .Yff2}-QX)]rx&aV6,y Jψ3<ųjI[UfmT(-$?] < w0(Ҍ:H*G&=8xNax`xDYvd<0E >I`W'pHWg\υ4 3 "s3IQ׋a/A9 vgx8h#p_*;`:KowO?t۟ sbWyI1E6*Ro0ƟgQk-Hn#suF(Aml͉iQNh3yvyʗ8H'O;v'f͵h$Yϯ ʆ]"o.b^SU 79TUbmB[f6. R(3&./hz;Iu773z 0݇ m>ޏ?|xT$¢,cE0T<z>,7RxvPtmQ^`,˶v\_Oz2Cgd&q[KXFB 諆8 5Jfe"ZrMWXENmԐdX:wOjJS݀P7h^/N?\_ԜRݡn,Xs}Z-%-*9Q#F_{/ #RaQLd@ۭ?mwEz.VE"ClK?qv[ 2,WCV;bcا̝WYY~IQ3dp%:סF(9!C+}Z]re~gno.]B1]QBYup,E=(ؼhnJ qJ3@b^ӻ<)/4N-Ӛmp?:݆cO73nQ$s!xn8N>@E Zd;/@k4"8T{PF+G3JuNrΞss<4D1Gy~KJ]Se QvHЋ}QRtK(Y>hýWcL#Xv./]]ElJ;Tt STa(s6` ﮹~;R iy1gf8VK>q+zN]~E8GT<"/`uֳ}=)Szkn C+&](u(uh[0Mb.c7=>;|u3 / eo}˷D"ݙG[X#"\@[w=,O߅i|}wo&c;| Mʪ$3ed"JNh믫L:Kwylr@c@ z::lo}8~ؚNkU8AP0SP!*+r4" 'ěL7oN{ < ,Lx9_E{Md0CH*+%&i՚>jMf,G/`uy2s18 >3UA%BYYJѵ&}lޯ;P}sG1LFV߽ɚqc||2A@ZI+Kw~ )z <:Pk.uNZa׏ES V'#Y\u|ku^RΏISY,IQ@-In*Hen?ېydI nv Tn3v͂pZ9hS|Q*j9@DFbGSdLE/T،Mjvtp 0wԖ|{^$6xc4hY?Ţ$)kݩwͪ2? B)$k8:0 k;:eɫdq&쓒m2."d&v2i6#/k9}H6:# \ߏiMD03;/wxyͲto?p8-v5I)CsmO޾=t@Xh4Y]_]y5޶^"IH jչS!  mF3RUI^*WKzZJd|5?&!-XN%,ޕOXKnC3|ifā6ggΛjӘ!Y{) Lg$@&>_,xlQdsMъrd篞WUzNBwgg4t~yB^1d'XPKȏC(\5t@K 14/<^,HB-@T,ر#?KeOg-kk"^kXsZ1O"oaydf[zyWT9kYByX (bQ`1QJ{[ۥq~BJBEyRgk05Ժ{#!xD2f(MOdӁc0~hU7"02rIe]2,T5^4bfYc{X_36vJ];j4W.J%OuF.V7 %$eΦ?gr::έ?^ӳ,.P>Oγm+ ×8$J%y#V4]EQ@~,(PHٵ۲IMRܛ <<%9Y\^u<Y=jeܞFWc^ {t;ft"qz޼Z+ǏϲIZ twg 7{inlGύx^qEU_nhbn#}Aq4 Hm>Ë ']%{08:=F@x>51,r[٫2)El<:E97@Y ǨW*kBo7tN Ln:![uOfCo#l!ђ1YļDRlHAUl{難WLlb$0aj9Dzxz8j1G 96sr"15ZgP,.a,ÌnhĜQy6Mw+BoH`0gz`V49EP X83iWQ\eFV}p߿w, 6<~)_~vgۏ|m>\XՑ+>r\*4E w@,='*]y%4 ".Ȅh8Fރ;$G`sK8fKs,~-BZL!% -Ƃ .NrHUEy0r.xgJO)pt1k%TTLZ q^V;p*Sq nw:6g,jfumo7N >$3) oKV~O$R'Yen6gr-+ 5EUxU܂z J\^-u?$^$d(Yr-' Tml>?h:zt, (ҖJwҎLpZp)gDre02Kt2ʳ_[N*S |"iQ0ْƭܘ3:M9`Mnkw,w>\]7{=e'oC7N^B,8Lԕ¼[ 2`d 8`rmEq/5?s@ J3YLg љ4nq}'\$ػeV~U7!IJ<3~ϣ)췧[C΃/7սLpk˗ͫJ_i?hmη];{;f5_;v  XZZwvio\PDU:1JLT[:(aAbjK0S۩H-%@"(yh)pм$ s]Ǎ-2,UhvxW6f ER݌c( 4mmW}x`v~Լߴ!`x,&+5 axNq bridvΪ4S-Z1/"Xp@X'vJA-,AWADt5̱Er IJIޑDW?mPz9XJkǽ}8 Hh 9#jAk;g t%K`q9μRV onuoӯ/[9 w@}C-zZ~Zo6eh "+[fBVHkV#,}d$eJZӗKcn^ԒTm 1jj5:/__Β040z 9^tsr*^mv 7bdQ$_qSA0dY=u?qCMsc:Xfe@3XVCãScl.p8n) *WfF5 (l`DĵJ5ZDӡ!H2bqh W2y[A8(@[Z$Q#A\,ɵ㏟Q8qX_{B@"A)<|+mۈ}Eq%kuHC(>4h_i1rISDq}鐯$3Cgdfj`pU N%dJFMhj,..d\a  ZYkcGy՛m"eX_Z]'-˂"E| lzϗ[hd''OO_~t?rliO!aU.XdŪJ3(;3نjKw,<;hMPĊuYQ, C{V%SU--N:i6hAh,.m\.L+Lj#LHBTG` 4Is܋ח Y^#6%QdjOrUoͫr>xrCL Muweu27$N%3ז 쉊`'t>RUĒ ƺM%R%H_$8z1*i @ )mӍ\@"+2H-h+, W7$ m;;x:ʠ@A}E*?k=?>=<y]! 1PA!}d6pco9ogl|o7wLʸ/Uf&`*h$2''|9֪+V<>j1-NY zl#{^mGW8B/Ά, o=;Jd`0 6sdY>\-"r CШג"X8f&݃cn=SJTQ)K[?, 'Qx38ñLnG#J{ EEG] C2eWkק_e=ˇnH ~ڄ_&3W& 2^k&B!BP*\] +b4 H4D3Hт2<:f(_άM+싍s$SiTR59և6Uըm&hf2ml3c :{9,?|K,ϑֱb8uɇWSS72 hz{gFG WJ3owH,&ߙXB6:lq{H:#S.AJZ5d_dy.W ѫ7Skv1/FiZ3xyIͅ1;r8nm<嚈Zi>WiII0]@N4rj8!0%FTZ$r2P*K]ޯS/O+drq'<ɐz'ǐq۳bi/㻭K4Kgm5ZzvmQRjh$Bd7$zហ(ĩMUCރ^.f|SU7+Jtfr;/N{_}59_<]lݝ"CsoVf,ȜU۳Y3hhe\̅ByejLICrkX&Sedb>}_Jl 8[<<[In_S%vfA~ac[QJrAhoP}XD |TI2IY.u j_4NQghD9F x\<=P(bI?HQk wAKoUyڽb (\5U/ Pռ֓QGkRg0Nɝ|X([ |륻_MU{Ơi8gc=z ҏ\V9;g R$)Irzk>Ft8_[=#Mԑq|&^$Ufw8OpɎ?R-xAߒ1Œ(ecBz  rz? 8ڥ|kRJ2GXV䛟'1 GqzŪ4uIp[CcB}sgnVZVo[rS @h0~ a5x{TN,J)T L<N'=EYIV\xB&$:b&wD٠i{X8U&:J?o&XcI$i*a9EQN`Ʃ-8gPeҙ֏[ŷy.+guwz뀡IA0>!9L,՘Pp-Ő@Llb6 ~{܂LCzsVٷ U,/'i3m&CCeI8kK" 30s/VZ4C,F) [G~."=^mBr%_y$`&?܍$&qJ̨0z%;byt{bdy6q)냫(%/Գ֩9\'vgn\{fxw@+P5K&aI'ݒ,66٤Cօ^bk EC$" l6 {T^[Q^}eiͳ{H# EumݦԎhV#Z}mAU%ѭS (O:3ݨ.+Q*m;s$ 2fC )-\ˊbĢ*UL(8RFhvC[_ (l\, ,jb-[`P-p[nؽq程(Q1ulM( .I vB\ɲUdF@ td5y]>2{zqA{/yIX6^%T@( 6d`8b!w4G?0NK F~6JbO]l4>r5/fH(f3M!]0ti~Z{=SBuIL'ʯ"ɣM=4Hu~%%r<7FT BQyʦaOε9m# ú_j68qw4_:LOq6`ХI=y.I?!{%Px$FmRS*HwurH6T} {R%f֪m~@. {Uf3-bl~~ُ~f+D]=,uR!@n uRlCOZΖ)g3rھ&+%0Nۿ7jzðL_y^=a˙e+ r}7g_pS EX.kۆc2 d8ߟ;$KJIK|Nc%ۤ(H3`8iFyXZXǰ|,RfI#I5)ň樣vDZϟ}qbm5߂d)H,$LZ\/'[\ G2au#2/\Aqh'le9A0㾻}T\hܜ,S֪jI6vk K;Ȅ` xsnkr"bfwredQL#]=\|X`â=xqBq U֠? x^ߪ.8fCi cb_bK6vJK dQMmpLNwV$^^j UY=xwPR׏X+ ʃ6yV2ek2Ab@Rii-#٭:#a; hl-A`YI2u؟#J!l((3ȋdI~ͷO:OU L=Z!;TPdPcjU+0X7v*:;K5 d[_)O5Ov;s#X!>GKJ^̳4K8ͧѳ(r\ b^5@ @EX8@kgRg)Fwso4Okq Le}]t $)n\J,ɩ_Z0?Xl֛N}>.O^|_?K[O>jGݓlç-Y~J%U=.ZRǔO'pc61ȏb0(/kցVܣ~)B\ |HĈ@E9 iWsFшLrENdԷ^i+$i&ȇȖܒRs,MsȈ˭W?^A/}tkZ EVWN/EGmE柿NW,[ Da6+s VR vU.>.\y~2=tT V= 0n?8^ÙQzD34F](qx rHn%t97QMq}~$I0* Sd/edU?8LH~<ԦC}ɜgIh:9;Snz;|ziE0 $JBY͓ 233XD@k>\5mNgۗW/ޗ?AUBL1Ht6Qul|;cYX,I2 j%,Na,>=>|#" FpE͗sV$ACG$G{-i2Y,$D,1>0ӪͮZjm |(ɩ\# RQ( 0xYjPdq)rgXέŘ%^YE/yM"QRrEҔ8?X9hzpͦV-]>7@x~in{kw3u$vdY˫N0[ Uk\kmu0#ZYTijLnk=nbk~` 㭉iWe"@ Ŵ_%`*ֈ(62_rWlvk~:yz~=NS7(:߶(S;%nE˲r:vݠ 4@SSբE$&[FJ")ېxoLKN@4Aeek?A9enձ(K UuC;_vONO4T%?yU1~0CdLll׾?.DOtU}˽vZ娀[ fQ?A"Kky~qHYQdB"qFf CgQSsߋK27Xʌ3kGϰ@ aΣn%+.V,qˑfzHGUwZ Is۲X$hI@8j~[ǶHTn$,1tT1r4ޕ%%G [V{*4>X^X@O:6.Mx:v9~gLlת KT;9M~MބJq+V1%OOO/^~#aʯ?66a0t۽Wg-)n"zT^W塘G7u'Q0pGX4 '^*TE7vQ'^V4Xz _Q8X^K jX&aTquy힇T=JK~ЍZm-9+ "E l',OҦi#oJ(KJڻ8C6p7*FDr.*&m_5l~q|&0% I+`Dy\df3"ኛGvTMc n$A)Fϟn5E7<"$f> u H2'΃(<'*fCCn=xf6, TJ-c`=d_x"' !ɚPjl CMFc"-RSsjWNsER(1r$F:f;EE<ϓ(+EQش 㛂)4N p4Ñ#yaKjxCby .AfGwě *rV9zM0!4Ѵf8Lu4 Qc :4`ίO бH-Ч#ftB#`TU kK*ωI٬RUQlwړpkݻY?dRqV+4F1Iޡk:f߱vM'+3]mX}mDQ9Gvg Pc ;Б(,;M3U`౟l}={۳ob-EZcm(:ݶ( s](Q{l9 E-) /7A=@iEnI.MϾc0u̝e줈I3n*]N ~<fPJ:qCn hڠ1PA= !Q%H"(%^p"2=A@ݭ ""QM9s>aߛNۡ(j0VJde#~p8Spn!B 'krLoM{@Š 2i 7/PeI."YWj%z[W9sk:$ȝ 0\YQ[.˦Q,@ԡ  ]ˏIND[?BK)=,!HªZ^mc3SY .sIXʫUpAxnY -<4Ղ A3j~[$s!CK}՞mI@5r-Si}1Cg/Ggq`aX؃^WlMkGR%TiՕ*RKI= ~ax;ߏcR*eO nwwSɱ{%gO_<(]:L̄ۨV/./NmǶ ibM:Un>xta17=x<'Coe4K q1o \1ҍq%`c+7<:8p-sz2YHngBzrp=ZtIu`pM-YV.B4Ŋ |co$yZ$cY )%K`7`d#HxͧeB'YQ_Ul9* `mz50>}:yD#Ǹ"&Y;!/R/SX,K;5D8 UIN4 MH3 WX.Vc{iN 9OE,|yw2Ƚzp",wސt{p5['a*ԛ5Ͻ F"۴rџm g+ TJF3Râj(N`]s7c [-Ԉ[}YD1LlYO/EW7f6ljCL%9Ppwr_J*vl06c{vYuRI7{[pqMV+R,P,QT0ww-w.2l2;sfh,F(,k`L!I>sB-]]8Ii.0jZ1&`gQinOj${˴"M5` Mv*vo.hi sT ԧ 3~j8.{BE/A:ÜH\Edƫm_fLF$din̒ڃ6>9Q7+9E@Ks'f62vɟɺC5٧UNih}XeפZ)# -IՂvMerM89<,@)GDJ>}X۶0 ^Tuꖪ:" 0I.Weq\JՍϵm'78ˆQ TI Afuwef\C9괚:$l.3)Y2q=e_̔yOc9̈Tq >9+9F X\Kd^iw a6#َD<XuЦL>`D&PHx%c -p2Ŵ Q(&@oAG.ԹbDϋ,hW[ۛ ;jК:rF=~ 0s}uvZzD8dkv?VXn%qdm4>#pnՋO|H) AB(@T?G nCHl%y$Ny0I#De-{ x#ĶA<0ߙZ]A0`Lk͖H#6aUR/!D +PseAn24Y"NNOzƏ? Hz}/q^Q:Q #ЭAcfJ ]~cQ,$ fehZSY*r0u/"%ㅱP RtĤ$)$B( 8Xjec')f2}&(8*U>_(]GgdS/`-<+1;gVYmO?gE拳k^jWsRe5^e.,z4S[mubdM-[7Q =-Rd+aWc[ƪ\=絪$l %E__}gpdo*&L fm:BQ*)eV28}*N/:?; \9Aji8&n˿6W(?{֭dR@(~*hP0PTc{z8{nDH(U EpŪHo_Eۂ`Z0Ni]g=]w.  [bSFh`eW83TU=뵵GHq~ Ri;+wb|^y.ӷ+d),Lc"ʉBQ`xQ!O䭆HAjĽ#J#%XT$Z"x&`j1z$Q"eCrkܹZ'7Iz˵;V+0sX^tɢvGG".Ơ.ϢMmUHLGW C*s`z(^,WاB5\\B^li*2o+-)?GA㳧E#beNWޥ*n/".41٤/VKk@$9 \M%Ĺ"AI}ǃÖ,ǁWQ*e\P K~" VQd)MǴ5R^h&wPR!tE2X74#̷iO$} og?N`Bu땀$A;{MGiڙ)Bh,}ٚv.KklJ;,Iy&hn`{q[4ۍme.z)>~CݩDCwHl beYHFqM~xWU5}p'kS/J@5ʟǛuB3t|hG<#hAPB$0*qL~DO_OXSClmVAxIlmmL+qQZ@AEc-7"ǀ|_zb!9dcy3dKH1Я/ꝿbx8Dam;{›m/ sa(tS+'BE@ L<9_-J&kMC?}=ƪQ)CXGrׁG4P`Fq *?%)`o4Lr!_?MԖʲ嫏yd%Ҟ;ȿiF_ގu:Lw"kesu۠HB)F|>>,[nhDaӻ/ՇG wZ=UR6*ujAsunCYqsTxGqW*= p{i JBIǚXEB'ڸS L@c8TkӴH:?/xQ o;iί8!Ou3ն{h&x]l@S\ysIka/]_M#,b @m3g5$NR?!Rdd{6Bb}CM(dS F6 0Y~c/UƖx9Z DiM8:NcXM$)ZM7 ~j5i&UAbpz$6>KW Q X!+>Wi^n *]ia5DȃhNZ41ls3C(Enf ǵ D9{vwfhըoC, c+U~N.$L%g./6L3J#3Iⶠ8IJ2e KQH\ǒg t< ffxl(t8`m4gtnMɝ8Y0TJ$'axe13 EGj}^=hj(a~AP8ċ( =X'Nђ֦Xf~>t5J=[i{ԓ9 WȲҘ}!Q!7ł5;깎=c2V.38ȋ FwwࠏbLM*9񷥎Zu͑7w V7]k,48&ڤvAIZD = /./GZ +ܪT8{9:ZXDJ)!8dl(<^۝#)rA\ˎ:lU `SSln=R:_}0JAc`l=sˉɢID܀},'3mnӊ0"HH ٖ,/cGqet&WKIؒlֆp=q4VjVǔ]bx|hjN ' \]*NXܓc 0%4'{4Xzټ\MF8֬ujjىYn 1塓M۫N?}F a>Ev*Y~YOˆW?JJ{MJ$PD mͶWpfvFqԭ3-:FUw>ֹ ?;!J(450|q&[+(g^lQisHJB)B(PƱ-.-q PlBs%TpjjR专% m*\&$gѲtKTHqhЏ`JXK7쬓k;GDhgwwO/BN^aJM`j۩hʌot+e$=y? R><}X4e(R3[׵*}|wW>]9l6 c,b<`hMBUâ.͑z+֬$ dfPTtXc0` h7$8UYe֓) p ~jL6~G ͓IqJl<M h*]=qhL'i (]k*'#~}ߧLJ :J lʖobnh5Oos`1R6-3w.w3#,2<[\PQF1׾hҲ޽eX R(rw^zCmuvg1N8ir{n#~'O8U G~R0<.kQm8YZAi藪o ,? 4MwQj&~ٺy !% H@ Ij*jJbIH (ϴ/܍'kT'ȠmnU9=+ȗD?,? XW\R=00\"*-I=C1}RPIezk)Y.p+z9qO>Xe/^~xwTkgs*VzlɠȈ%W<=|xk> ]0MTULAhtzԊ+^TΣ5& Xw>8RZ`6:"hgoN)U8 0 8,4dsxbt;)v6!=GӿY{X$ܐ`Br^ҍ~ۜ0fw+ 099=ǭ>#H.7Ҋhx^<=:?hum%Ukގf7TvlQ`Ðݏ}9P;<2 |x(B8(:tlW%F8Z).9!Ph./_,&ӉI+rF͠h vJHeHR${sli*-0j Lq ш@gؘ:o11-##kFɢEQR&9 ~lݽ3uL58pӁן]S$ȏWhчZni1<-iZ+x`@7v[ 6Y;D,O$iunh6NߒG! +=;[c3#3gGNȵg $HzSܼ{;=7R* -HVeHh.ǻ#t2/%\O)=u.e]UuaB_@;$[MXlE]u1{ {A}xYmu`2u"L1`ll'Y=IQ:}.0-nYح4攑NI#S.9uh]%_ݙVh?^ ]NeXǔJ*\ \#͋:9*Ǿ1S%nf긏lfh=]j Y ϶:ؕc*G˷t,ՒThRju@V٬K&;drR9s!4)[,iM*ҭOP2H҄bۓŅ" U]4yχ]-2mV*B ^b>`RwGEٮ!^^C;3u3IhT"&3r}fSG:g-G8i6_/ak,,0:j>./ ӳ.Dpt=nZQxn ؞%f&jZ?hiA?7Ej&d2K&/,f1k/Os9{orUPΕ|^{>Q@˕`&Cj:N@?G˰*2pzxȏ,S97/3! 닛`x{}"B=i?8z;A}lAm0UV]/%SX1d?gY9A\5_lUG hX&I8A D"8wG*eQxݺQF͆rMYϋYIRGR4geYvAƤu >9n1w KcuP0A'H 0Ww khj]T64!&&H$x~hykqijcxj.z[/|D&JOL٪ww>_n / @U^*lCu`ňCX$SQCnK@|UB$(=2-ٺ]՛ v!8KPB/^]%!@q$,yqc!Ja@'RD(g^)UZl?ke@ʽG4I0zFs:^%Q#VXaվZa8px0:ɏ -~I|:秿 ?gGC C4n;*n=P|6t}|0tb6hwŦQYW8XvWY*qlCsIp^g)(Y.k° J.*]rx]׋!Qiݰ|ݑhW ct (0}OAތ:dRA Gv@EdDUyw"( fWH"OJ^Ğ$@?b8YnEtjZ$$յ E!peKHqAgđF-DNl{ *d8unMtT׿;YW~44FB hz6DJ[-9FCQNч6@ $Dx//O|"H,gfKΒ/; 5ђ&1 Ǒrl3MY8XXFxS_NFk Qos viջ8}|7֛ AWߟS HtpO#jҠ}_RMkեe-ʲ xBs"g 'yj@h%[B*KOkL 6}l曪%r!?5Yzp{o8it}1SRoq5K D͊] &o!?i`&>l.w&\  CԻRgn HNjGx73{Pkh4gfEW+yϻ.Z"p 3jF\ &gvD e@% )ē /*JIxPz{XQG 8r3;Eg%~zi!dFlfBf=Q> =‚2!0rBKYS4Cۆ97b#=q)tjt0z. YR{6ʶ(,C%TTFbpE虎3&=z4ܫ7= A(,NUݵ]0v-l7^]mm8fJ-7妹}]ǯNl=,2O_Lf@csӱ\MN})1#-1Є>h&a׋x9 6vr7(0 5A_[o8]T"=G䲪v-]C/c*y+Asil6$;jTפ4B&0,CqGU`|<:E A|=NK&)_b $IsxYb$ "%t[Xe@i}[F'|Gͧ?z1 dFVSwawm0I␨vnKz( )Inl-:JE|}q|y @WFn hXQG i*qFCPEl(ȶc/~]o7@h>OYܮrHr!BU m*yz{<--Z,6IXxb BǍ@5ZëR";Sq1#%Rh"˺4_E?[(۩+'~8ە$ߝ40hoLy8lkZU(eQ7kz۴ki&wlGieYv$NeIM@,xI$)B@!09ORP77i٤Qq`SK `tdNWv=FwvL@綔,|h͓"=_tԶ~Ea-)ꢖվ0=}ynXTYꈤxY587{dۤnB>x* /%E^ֿoK>+J,IRM? ("{ % U'CeB&$!T]t B#9 ۯ3/ёsh9+)- {d:ۘ#8Ø 5sOٚ^PS A`iB~S5ʢXPu$ř4϶; |yaq6Qd2}$!1Ld"j:f"8ޭv(*w<܏SsI*Pjy^m|>2>|(lv-ٌƺ&ri󇄀eMf[C޵dm-B}G[v!Yr 'HEDZ꓉6nVN⸈q8`ʻ[]TײSAP =C(ڶ "it3zb}/ K-Љ߿tuꓟ?^89R}{ʼn:P­G',cpi'Flt</ެr/W - C~s~Χݥd ,K 'ܧM^+ō]Iwֵ~ !t^\$Inj&ۇJSE8eN&Q/+N~O-u(qPtfi[Q׆І186IdCЗq/M;GU:{uI HX}S4:;3Dur?v}ca XߧC!2UTЏʍTWOu@pdY+ Ȳt홺y`rޙO r:)5u+aqp ;0qnOS58 nn,i0HTYݺ9:-|, F`QRiY ,lM0!c5ȖvglEea{OP$8b&S vF"D2-%sΜ_^x:M92&/E]" lDH׳nEyyﻫĕ8ipvW$A~h)4(n짝~S 噲 RQ54+yՀOҡI(bTNGn $|b8/rtNrKfx&MU, 0"$HDh\ HT HTj`'/U'@|= HEYH$,crMb?I(M{اRj %ͣ$OL,kպ5`C&cV2s򥽈cXj/Z e̖IsTd8[wwM^Օ$Cϛmeb]?4NΝtޭ曅($8!"ihjZymwY@D30,0Va% Ow)zW UK/J>u=`ǻG5#hz+" kdinnCdʞ]\nVN2~Jѿ۝:,q|8"jmdҵ,juo)tW{3 `MW~:7ҕxS<}{o&6T%Mx^9| ^{eIe ixଷ^ @љma..QhdAKs@3 >8Nc{d3ڗ!E_bW?Ӱ?<9ϧkqtw\okݠ7  #I3u/[U 3w;Q07yEUU8LʬV ԸmiFXJ"] ǫ//_fz:LaE=/Mf?qQf_#HY@MFT[Nd* XH \[Ԏ'd3g?NdQ5tzTEw;aHBUHdń1D u 򀋢(j%M]ˋNm:D.$.?-dT\m)􋣘ghameUHioFc z`׽LSbq{n* h2U]aJ1J ˴NY)+'iǁ\".z^OA{8nUk(FcOtG=g;"1C .`Me ر,aѳMCpu9=Dt Ի@42(E{Ƞ~1,vzGlR(="?2wË+niuL=P#8qXl1Sr ͋Q=Rp(VztgAO}B%e2/97B`9")JVtŞFoXDCe)z-S6WJg<0&FO}T5F"iiv1M7isV H]!&'n4~nI$ؙ$ޱ ,BB}h<݋M\mO)6Z=+  |=PM֕p9zTc?'sPI w} iQz~ Xq[J׃\h,KV&b ӧg?Vl ݂b>H]5Imv1C4(H`i""p]0:S( F[>3, `AET9݈@d͎2@WYql39 U+JmY[ӯ<'$OB«zg?.",l+7}&xlV4x@k(>Z RiE8~4/;bboݔILyY*u@*J<3mqҮ:0!ۨ[v#&OQ{*VD@0f.P nPȸ9,8Xa[@$( 1o6M 1,G/7a(&Jv`d񷐟D;l p'pDJe'@c ty_ %ofwnHF3 4β h5Umy1hߘ QrMQ"\o3  ơE$h " K^I4E[++ >BxTxt !"nxKP Zm`8dˎF dobcE %cJ^V06p΃:4N>t~t(m/8%*by )SfDFs)H,(Q(4ݽ6'6L~9z[*wASoN _dN?6**-ESJ% 0a|[duA̹> nLJ m?pC ++7bA-Ը;:72 İ]̭+Y(_Ȣb ^~;\Ӡ4ǒn6 K)(<ɥQ㗓 [Rjm13˅r CyJH!Q9ޏz}%(JP1}>LrxPCow:VwnL&P$B8ve$bcj{$xRfqyaM^$^dqL8Hx?>riZfIYY"- Ӿ8:޶0 sEeN&N&hzh^c=4tnjq(w8 1|}!G4~y_8Jl;|:T`͖A#, U͑1p-u(xMk>\ PعucZ% =3MЛzKVffRQ pdvިDƋt[.' 率R+ x/i*C IbĎgrQ"["aj Bhs5r|Wn%E^^x5_]l753$ ҩ7rfVh-_MٔKFSDѬ~vTdMúksF^HYqX<́-~uiqS.t1%r猪'@XY.!ȱEKF$QV%eS25VfLܛODU䁌D Г}v-ײ˟1ϼ Z/r2YNrмC6fsUo,fQE"hI|vidȲrsr'|eЫʙ'׵>ns׋ЍhJ"pwNlR J>zj9O[ $]J <' J0ĤJl=3r:'h75v֟.S2oĢ\@$Z@wnƓ Q?4:'w~f ]a,HcکntvZ(jY.5 \쩱Ϣ0]~A,IB'; !_3g$/s<NJ*l[כ R}ʸS9tu7La (Of>S4+XtI;Y7AHfnQ*0Dmws3?R{T"Y %dMR&jmX 0l!5E ٔ6 F8plc޾c 5UE%O mFCH8IXY%ЉZ^bi ^ڲ?]d_8c~FqHp$%R,' 77ZDH\̍Bփ˾rX9==柿Bc:~A56.ʢ ɾӸU\%5o4V7e EoZU#R/i?9ʦPpw."mXӲ({} @љmDaxpHl'JuWE}(Ћi6Fؖl$%!/ fw3gW?Njɻ/#Tu?*fG~wp&5Q*Ó<nxޏA|n,9뵅 ǣeϢ$[ÞċA`+]wV5*[/_A; źw /_} ϳI[5[5]Y!IB'ޞ?<ތ"6% :\`D 0^$#~3zP:!'dC&(Y-f-RVyM$PUz,w{駙wKp?~(oelZܖmA] 6EA5VΚAam6X,CU]F`#Ueۭ\VfuT=EkV7L*ԛsUT9d DOgf++ɓHD7% T >"7뢤HtBq]/|Q!YUla[-.1țS=N`퓮lIokVKSfS2PM5JhU(-9P*e@J"->\MtO -::>2d$r ro41{IAR/W7 }oֳf6>$9 l14*,G~>e˲gMy(CP<ƹ>|Yޅ~0\6e!EsImfN^?:z Vlk<'2^ Ȑk]HPz 4+*TGFzZuBd+ Y[O7]3aJ~EBYn!EAWmϾ>Sx:.P6 [Gxj>W$ ñi{m'cACWI5["ͳ( }Db@0Zǣ'{?Cu*tj2Lii<99qnnw?_^IZgb qS ,b$ODq~~~voY7xI 8 otR 8z;Jw9HaٺBETVP&Ft!8Di. Z{[wx4@$-eˠ䅹_QYƿcL\/.\  ')A-AHF˚7D((I'|'в9J"_Ϋ# [؋(1rb%P$?9lm؊,QE,˾ur{gs8;~\X:lWٰNYi7ZQup<^Bx@vt[z|7p?ySȞmX0m[g2wN._?_-+z^85T Ę#\cDGݳx(>AQo>0K4|z"/8D7Z]oNNQ(JüOJipv, scDR#1?Ь>_u_x%rqo> [oPxv{wy\P9ps^:֬n̈ Vr2qZ כ] 'ITo6L8N˿6~ S 6őX U< NۍyY9Mt¼[ƛ}?T #"Ic kW(ΚHv +JsvM$M]76 ANĤK ͕DPDjOINe$02%* $Q/W$IA5TQydQV gp]43yMg3sI-+Zʤ N&˩&\ã&[yJ:4J1Ӡ>gk:nc E[ĕH9htLL *͚P l))*ł W<HI'|Y`Cs0NxF<+$nm`kw^J q6@ Ѹh}Hb G]D[~XD-wZxzt^d0 Ia E1l-xZ~zEk&n^F9'GW8[%NI3 '@7./fvZM&K4mR[x'?پoϽ_JMVe6 އ;"krZwth6rÌWY"H }EDžo:-w$$E~c=mGoܺ9^|֧  $uI*_ݣJqz**ՠWI3 H%e8G#nEF95$6l,q{$VFU%ɴ=[?ga <1/Ct$ΦE_ҚmV]+Ì I#Ňu}EkjHd4Eʊy@yH-M3ڋC+2fO'ӏdq0( 0{H0 O)H"(`|Q?vQđ͌#3q[Az?^Vr0S0ހa0 <>?}vqnϭW_}9Ӱ `zeARLdt:VW bhL0i]Nr%@p{s!޽REP9&.P=AxgUCN,hc CՉ'Yfqo%ԖȳVh(%vYȬf~8CC>rA]?x/H'tϲi+mdaInn@ѕ7Yْ.lL'_&6 M$Zݮ8hV\kK{)|hhR`\\agZѵ[0 12xCnx?b9Gsy)M0&AK sIUc„z)rAˁ< i54O <+z:ҠN}īGR2 &tiIَTPȟX8eY)&%òSHΠBN]4U|bb={ZA*_F z< ͜9vLgmǣ1rlI1hֶ=LI2 X5De61fsMӅQ 0+kZZ҇"iIFO )ʟDQq= cpoEv8:fWIZ7PeenqLՕ(˚F |$JQ-e0PE 'rh8 W<YIy4K)v/rC,blPeTWʇeNɃnbU('A+RzKTwAHY>O!]TȁE?w~JTĎ*99\rGBQ$^'7ۮѕzLdKj/KoM1X Wxϼ4EP|do,KJ~1-&B{E| r$E8<55&sx̗G64@Csb7&rf-{&ˊmoK }qw˗뛛z _DX^D(z;'|8>Ўzȉ᩻ݝ+5e";IP4?| 9E(DmM "hrct ]%RNZ#cj}#awaw"!׉( xmt~"PvW;IΈ|3 A=zt:6\S9S8Ϊ7gjoV/x@HH&"4>TU>gVi5U4 YX6 ޷ݒ3q7i͎ܝ=ܧe74KC^8@Տjݽ'Ӹ<"c$ثјS~fw70m_+Yҡ$vҺllIdza49XNoƓ֬" Jm2-K+{FQ( GU *ydZEan +l׉6T}6WCкtdUY%kP,(9w'hʉz(Z.[oP)tH .Md2>$,ς81v#0uRT€ojiI`jm]ٙ6H@U9F%| Q`3R9ǧX@]ZB u"s-tB 8ZX"ž;@^vl`XR* f5EǗF}[9"#8,Ȍ0taT!B@iˎץwnVB4| dJiyĒt^iN7ۛ*c\x4$HmGe8G)Y=ۚ\ebfDah!Gh $˲yAg5>8A8lp "%U쩽DC;\e|'p 8ڝz a$+j@`H\}{9<}GrX5 G&~!o{{u5-\яkoɊ!DG:m\OEFڮ$Fu9_8;w~EgUɣGHQzǰ_4 9-{']iM%QKc96|G%ʋO᫷Y Cv7k BӼp>6gSr vϿD!ݓD $KWf&)c>[^սkkNۈ’VWƀ'&q}KzyLkLɤi;͔$n;`BIegW|jOdecƠѾT\Ob [GA:~3tvσ޻_ 'L¨x8 >& [N-hP(!Db&,, 凣C#/^$j֪qh6 a6&vIc}}t<TJL8q=,hh2ͥY;YSƵ(G'϶IV7Q􏋢xKrm0_YёЦJɛ 1gQ'9H׀4Cz~gؒZ.s ޴ : yMSն;ܡUҍܢ -ϕȜ̭zY<^Y ޓG{K2F[fjfoAf80 Ð( 9s,C N 141u<@DH=׫Ԥrò0s>0 Ut|q&p39?b'RZ/jΊI2a.6/("}J1E9Pgp+ 22&yyHz0tkbە <^)܎ PaM EE -Je/ YX80m6Ђ6hfESH9\,C]pdox08A~83M[ sKh4s$QNc/Zj% &K[`|}Ndĩۘ-bc'0[J)[ҩ~N{4Qw=_nvݽ7۟]-GӘ)aJ(3g?U:@ ï}m%CJE1tҾT Bc.vT?'ܞYأKѬa˽w,`^FUW"(24!ijyk%D Isυ IYmvv4NFT$ OOb3YhVWo?'Sc1kq+8!+^OƟ|/$Hd(LT<~8L? sM"`vjTT/D^xnsn{_*ˋ)Iiz 7aUWl,[HgA4!C%W9qǶh̾ {o>BٿS$Flrc00S+9 כVVdV|} LA礡ULMN>eEk;7c#u2 *ܘ"X`DNPD x7rv^ @љmDaN)Z(˛ʼnA Ї--6(c[6k5)>i| /Tr2j!-M0j`6p,rwHvr_=PHZ#/DEp4óÂލ@S*Q%H0$9 ' tHU $'2hwFutד٭%dktP t^H5 nTIӻg%^A#W6pUSlmVݠMЋ`FADtN&xBt/t&uƶbO2ͺ6)=;J%dR&wc:{ 'C<'UʊlCol)\D}oT myN#)%TH{1tEX sy.źZŝq4njIRX>=Up{R,$CzM<ώzx"b}~% FFUЙ &wvw:t(|sK "k4 [L5'L{(ݎqÌ w~4@4@B6MK}7y\Yb.JL#fؼ# Ea$YQe[ xrEH +%.z: 0c)$@ IwRe$QD?~>n(3 SJ cw8߮ag5+:xZ*ƧL1h}`dd> w{+vO{׳ƘQ[$y/JTDǕt&V _ft"t,cu@ زM":$L#@0>')M 'LtkD9^6xxdr`vVf́nH ym,idu@QВ5۲7]AKSv:p3VF`Fe",eY0*#(aٻ3q)AY˦Ϯf"Ñ[H ԟs6CBPgx<u/O V4c?sˍE%&Һ"NDח {y>nxI;"iL.fA_FsevaxneUY.Dn-Yf?N0:DL2}ՠ Ec;J˘RWZOx dUSl p) >h %ya.*MBhRTzJ xWTJ'V8.٤#ozQ<#;*/wj~w|3LgH dTUir?JWiSR8 );z! | l}[L?~UDׯ&"0Efyňy{!F;.pDh CDNsHy90en5S//Y0H%Yχ&p"clWwoUj|Z.^LWuqa&6 ֗Aw_[&PHt T\9sXViC'υ=?-ڒ dmPQP4LYwYI@}X9 Ȓ'Sp 'UJi: {|٧_/ԝPYos\.Ou}5|QO1,CGhLG,Wihm20`z@Opt&ma}IQ-SNH6EI-mI%QLax Gx|gEx.)yGoL< "֦ fo%D|y<]f'YET pii_]R܁=rE]5'wS|*$. 1$yktͫC h2y]#M&tSG"t(8a EH"bmJHBBSN_ #˒TZPvm*)[M(jշ+jTj[k bE22 0" IIFRnGI8 k\q'pXrTiv;-+%7MzGSmpl֤AJTD, &i er^w%d?NPA iHwAqWDLm܁-PT~1lIMRSjrh|l[]Pi9[w9 Q.PL#gQ}[@ȎfCb m^JبxM P#k%@ br -t|9dP>f79R.ܨt*,Bbgnq6]=u&NmTy69͛AF9y ٘ZVeV~}7^Yye,=:oʘ]!zum<, 3}Jg.&3$6tZ˳p?&aciIʼn5SV'$z}bQS]g~|f N6g7ݣ?a͡i%yU]I]JVO52nFlMqվx,[3Y)HrK^!/r 9aÆ'7ɒ]L1 x UɮZ׭Kã=خM(3R26zYp5H7l o?ŝ=N&SA4(vzDN[Sdw-n,"nVQlƈJk!1fX-[!}E00d6{vLbUP azY+{S)iz8~`@BI\J-V)@?~Y{#N9v&/C *` fpZYqT&h #C,εb"b"d. tb͕Mc+Eaa~|`_nԶxgxN,8ls&.l@4P?(^ a1hjTSz]@pa9`lf R!س]F\sZ=*,veɣl(Dg 8&SwP! fe4Θ] >aky&Hbψ%~"JtML~j|pz*ԓ7bho,s 7ru|j탆IG*5^vž真] Ób3{-x,kFz(pt^ma7)N,YipE/ZE4 xS5$;?{y/y(FJ+=] O,ѻae^,7+N>ʨnRV^'o^cϧ :RyǞ)LK9l"Oy5\Se/Job}'Y.wIFjn$3=IG:E`NÓB ɋ7>i#M_? ·%CResߖEatGJ56# 5ո-Ib./WXNaIET- :Oh}c|sw( WcqŐ]WtQYMzS1_@kr,;Nx/#RI.. ԊB+$gp8ʠI#xN2m =!|ox_1:R?܌әU>\'Ȋ*#i٦SuEu-Q '㫏8*dmЅn)rJT y%0[n$XG94 _bZyU!̣;s/v&x*riN $n A4Mch.$AJ4N8wz8KWӜ$iլ {Σ* cGOxN "+ѳŬ,jِ"Hl%ӳL j *‡Է"*l*0% +4{0ZWlٳM~NčAVɓi 7: ܜ^\.Gh^^Б|PaV F W G"qRIV,($MQ4W?|WBرn,@@7ݝCvY٤7 =atr q2;<#єHSc]C 7 ,* :(h%^w`*(Moo9\ F0KSo@n+\?& ?ԯ/2;rhGU\lA+iIBZ2Fjb"B (~4-}wN_ukkuGP]{ F« *߽giқOKDz!d2Z$*a( \"FD '0ɞRR,c˱qrX~sv7BܫNUtH G5hFxKvgUMbP2{F}ˡ\)225N[O|86l'D HT囉‡@, ,k;c7m [s Y5X8 2DFo:9..Ƨgi[~<faEPUgI. K1M _e%ё Ȼ]3:dpϛvRMUI MeQ28Yk0|WT%QL ^x󊽗[F_k-ldqWW/rucnVi憈*}8NU(% ,#*/.U tI+ eZSuÀQ ܏$*nV܍$ x1V&ykx/a\ӣ -#i%U@ry5-m'r4HR;Ɲ͉v)nTF2NrgEEҢ)AѠ;ˉi^_$NkrqH{֩@] ɫyY/B)GC`m Qf3\X^%ˆL jn\ JuNۚ2x.RP#dN O9"# ?\spuBdUCLCB, sw(Sj (3˦r]gϧ_'W11YM[wCeY(v'I~'@ɅjSY(Ϊ!)8k'OFz1Pt&marSHdY$GIqS=$H$A;mE[EuJ`Hμ{ǶaEv#EP&LRw]EQ[fE鳹9d[zANeZK!9b^ `d!pF> H+*]^OSÓ`~nB+dמ.~ ˳[B Im.f,u$J"+}{yv(=en6Yгl:qpqxvfj!eh3w Qx2 B`؜@P ,f.U%$Oer|u^-ؼ:p5x _j;Y+KeiҮ UT8B"9/i 0྄ܼDXI e)-"W(GYȂP8k5zvH>ZdFa!AGދ]w6\-SJ'$e"dqVu!`nxC@IM "&Ihso[CD,FZI-VT{+HJG,wN[-8JQ ]HA!wqF`,HdGz.+:xtBhnK i|Z3[ʧg2,eV2luZ<>n#/ U B~՗uXrTn[ĎC6$ ^+ :34]"ٖE$ky9KgL[{EIay0#Exgq˸́T BB =oK `"Nϲnn8[:dT&WǵKVQ cdpEa , "lEy EHnnǯC^H&J8߭ WIS#Sf D{_ D~r=mu# x $28 -?IZ1T| Hf[zSjTDv!TQ-.Mp6N DYLq 90P4_݅Q:?Ǔk"ѪQ4ջyK&S2Y:3%]\"<|1 ,εI,^6$Up #/"s6TM]+|U:/XbZ.]*&fwY=0Uլۮѱ* 4UYNFmiv@ ŗ(M9dQztI85)IA#fF#H94ڤc%eX`ᜫЖ/o&8gͫw jizNȢԥnrcCds0U o6U{:9v[?f[<)ԙ:UJ)K~ViN`"ȺLR q" 4mga]kƣ|[d5oOi+]8@ t`}蔷})t%fdDz-˲ﺒf9wG3uIҚ^CFY ig#4z5/W렀9@ m/ 4 NJjH*Ꞁ4Y+^g~57}I!KNZ5G>Fù*D52D׫MM(/D 4R"@\nMR,INIZBRD,(P4x;"fP/dӪizVƣ e3NR^lI0tQzݒOOP{сOP$Mc\epJћӞ(xUsx_GwdM{zwbBV$'@(dko Š$)s8pr9/;×ǯ$Z(H,mFQ,b̦S߿ ]2V0ԛYEN\NLݪrJYCTUd<8ߜ"/:( oSmNA8_]DZov+"`U:ͦ΁DZ aH U"ΪhI ߒX]C*fnetm -TY댊qQzBq4Hh_EȺOt1y S3Q5x_gGx%GQQ[;!mR8[NG+/2c'כ(<f|V25- !)6gFq$D(p_;-g仠*`l]9HQ Atڃ~YwrЅVs+o9v pHɳEdL&~Y6"b!SqgUep6ǶX/UŋL#Wl+Ph)~/OEZőﯪ5 *BʟO=zN ג<^{"5ûoR_P󑝍*j ^#gimY%0)3H25r\!<HN>]9̙\ 0@-DϾn:=ͭM@~]d᦭2XȄeO'1z7(&vbm,x:y HldE] %!%üa3af%3#)*P%IEAs8y2Z.g9۲3 +dhzEdNADa/"19(wn0 R*gջ_y^8S/.2VR}縣w1SbHr`u@AYC хaF1:WRmeyq[nBy_ Ǜd eՌޙ;8kޥKR;~[:IH`$L3 -Hq w5m^ͪF=́K)gL'AX;Xh6F7Vs?2Z$;.\M2!(`r/ A-tgy/Dbq񌦫 JuDaTX2//N}/bI&i\J<777~#{n^>:+ǟlꎳݱܟy8Wr<(+9ʛ!`Ʈe8=gAر-.FbjUs[N.ٺwb?tKR8_Ob f߮{eXgyb zq >M\9<20  $ ME ju_2R68ܴ/_..w=׀ &둿/ ?ɂ`\o|yAr0<ˊ,`=D-ŖgyMEAhᬤq=$ qY+YL4x˔S&OaTl9ZcTPnX 9غ.`3([6BbɰQޞ]aǧG' KZVk]wFjeq_pu$E,<Y5kr 3w JD2y>^Ryɨbv-5Ҁwpp&4Nf(?=3mnfêz h|N"%"d}ZTKФgOrfYsGNʜiL"s<:; &?pPٚTCܔ׹$I Z-G09!.i&P FEYoFpIQ(YlَT7H,mhطEEvb'^dKv⾈:$0sywۺҬc[V YZf Y'?W87&JHCxHIJ4Jzy7TStQ(̼$LjZ~|ER`/ p9Q,X ShiVOd8VLpe'WS*3`7x]6uc0 I}nj#ԫ"w}봍Nb!NfqNS`<@*K d8pp>d"%x!`fCX4yz? _(ꜧYiŞˋeei-62_H|=h)H 6^EhGjyjpcvI+]/m8ubwg~NSy f\k["/iBSl5w;Vw_f]1tBw, `a>| ;ӗÇ_gr YFd/޼:yE$Ɩ75nR7<5^(I(m #Ҵ .Ud'ʺtXZ|\pe.℉6]ˀxVdEU+jkzK1He".Հ^1Fl ӳuI^ED!LH&8 vD7@Tz^0D*3h:Z9-!t&A/49.B XOtMN7>pHG/ZIWvd&X ¨m<ǿ׏/?3#gwUhܭtYdkx3\jW܇*XyA RRkCngЂCl>o]iEH5E ȋlEQ ncL R(ސQ Y Ioxcʀg"| > u3 +U rqa4~q*$MQ0$b]ljK8_?OҔ5Vۋ@W`g]"q1.ԡ ='v0P 13|,)uso[#p/2p N xJXVrï:vN{T Q"Y$H)PlsBk-' l%~Yw*Rqm~iwb8bcEA0 8QE_\_)'G1zpv hD){qZ_Yv1 ہqW$"eB,mWPNm'{}eXNpMNTrt)7qɸ<ђV QRuH'P&G+vbqvO7ҩ:ӬP4s~)>4[.j49i'bD[RxV4NS$ A0}|~1R4^w 2U ~~ۋ8Ȧ\3-0CK//Ue6ՠ\iR?}_(JmmCۮ$.R0h WZP (RmKATU1yHhQ~MeR((msFI鷄QDh(1wTVl ǜHWbNke6P0v68c"$$1wY=>i6OG5ړa-7jgnHPIdGQ. d[w|pd-1GOjQ5t!}Gm7a4C#s1'bQjv: q'IӵZ-"N~8l߼RsC %Y15ƫAy^y܂R*I*1Ǥr%vtTy/F`M:Cc [r3 ^.K0Nmc8BIګAaJ o;>$j]<$K2aeҤ3Igg @љma%RD,4} <(PghEӠ)ےMQ]W| oC7fu%ۗV<,Kk(*bmWkmnL#gEEPch>o *싹<dWu %Sff>X2:}umq7Qr"NjRlLg Ƨ?>my tV0i9K]Ҍ#0BO,,p՞B0Pt}N2O{pF7Tu~y )0zӛ")fe]݃Po6S:d=c0@dZޅޕAqa2lPdB{c6 ;U$ Q8}n5S"=N{=Vu6ڤAzvUEYX7e-wXQuj/kR( ggc)Y(+C}ъ#B6X.56r36*o!WԪ/j3& {7wE8nKo[ @iBP8͇%0Y=fyg =яN<L{ϰxxN+ƛ jg0jUpM cGlp[+p Iǯ%WBBUA | D\^r!a[:LeRGf٣7|T.dο6&!c`UROM Fs.o?x8gnAE)˓) NHyQX-"͊z,3b秳Jo2ĉ_^KrO0Ay3%ER\r˵#*"an[]&n{gYbMX2ZC5vŋls-@@~W&_vEcEhC߄Ta DXy`k0dT\3 =hrMQE~{e/إ|fYݭQ!XRdU# LQTK (j]6D`?^kʩ5ֵybF:`;'.Lq? tp[ɡ/Id, :pIr^xԻPB+`:akoxSҔ0BT P#U5M$QRQ9I+|H W;[-YGFر+ ÙtA )E_hlR>i7\yEp{^OmEg GfjK?$Nn "<8'iJדA&59™ %<pT8aj̀>$^VEm=aI@rv~ޠznGkf7w͎xjsL B$YX߮;c9X&VV)@SE,U l0 Vc Ro/}H8Y+X(]gkD^aw&sZ% ,-.kMM5d{y =PN v>~dq&..JM&%P1]׊\aX4yX;mvNni`lZvc60Vuu/Xɂ $e ^yajﯽ|H+ʋ(K4SP0&v Vvl6p0uw)XF((DC1fT2 W! pdr[#)dϬC s9QY#$ELlklzOz@a)ªw"(Ml2_Τm+$yDjf 4EEp@7"pĊ׶b[-8S|. $x;;eEV,|YzMЮNUQcD 9Y\~ m\r"Se5rt8Ʒ8#-y^; ~UV-A_6Wrb (MB ̰60~ 3 [/Oʐo@)V췴r}5C m(0s T%^kRKgi:-bgDM5AVl-NsOLd)2='J`r@rZDLچi.u;1A#Hqén'OWfRe ?h WKTi@܃?d4JPUݖ !i$J"S09n[{e>?^@Zb Ξ;*u?EtSJ*p( Ja$2p^׳YQ<'_^Lk.̂ѽTzCaĒ(" "[a%PJp, @Y֫UױŶo6FF닫9yfU2v[k~v\Yg9A8!˂JS܃udqF)jhZqIaIf(Ȍ`ް *l '̼) &FXH>Oj8[:=i=P"xI(})l $^ʕbApFi rfrڄ()B+cȹx w^g$#PxPEh}5MbvNQTq5}=J獳3x?91)IENDB`bzflag-2.4.2+ds1/data/steamroller.wav000066400000000000000000002136401200563112200174260ustar00rootroot00000000000000RIFFWAVEfmt "VDdatatW$xqZjBavQnL@y3 1 <>c :D%     Q!=sHw-\}qknP'{%#98sM*_S+J4VEp)ceAI17 Oe@1*oM {Ds99%&)73Hkt{v{i%Gg `K n4# T a@Y9?b:E0SV{<  d2 p * M 1  o{.__E$lha3>s{C2Hitre ] ; 98nW#yI yO83Dz 4Xzo yKCXm`#h { wo'` $W J\[5! NU 'r`XrCKbOO8*RsyuEZ-Mjw VL#i3\] 7Y H 5U M".yc / ) a rn 6-rqd<x+ ~ H`x>a}:!V+-3s9#>!{/6.eIV "@5 eh h;; b`,aKQ o6Wob(Boh/Q o{X_ZZU6" T4P [Eu@N S ; d: P i t fR  Od fh( 1 b  l"k7c3O8< `a6Q_M\LO ? e: RkL#  VKSq 6| 5Kc~B5=\=mnfSLk+0/hz7_3aslAh/aq-~k:}efpbmK?\g*.h$Y    1V  V  uF ` p E K'  J F;~8n/ OHFqv@4qP} Ry4;Y K  G&sB -~ axr  "E`6vR9#}a[_U%`5'%X6`+FT+"w!]A& )z$2 g=Wh2 #p&D=zO2M_xy[toKeQRpjy{;H+sp9U=lRG,]PyEt >7|merRw>U kWGY$D]1H69$f  p D(k41 TW$!v _ `_ A P  + }Op j # b PJO # # %! OT  ) ;i&JKoIP -~ @O6 *aq2R$LW#iT޽Q#=Gsw }L"'ik& J ^WHy =u*i $t z e -A ~ X"V$@0e# aB#[OU(IaHFAԯ̙HĖκo - KYj 4شg5c+Xm4=K 5[ M5 sk!uv_C *3g,# D#I4:24-#?K>>"%S&%C., z=}$C;V.B15Zp!l(C#&6 BYQu ! p  9 Ko D3U Uu  x >5@=m#U5rH8 {  yQ. J n  %vp'[$ qJ r ZSc]s N,58889I>qEKI? 3*'($Q+WLè3#UnC\ { _2B?,TDW%g!c7C"!!L(}qW jnد*ӿJ+ؽ@н% 6SL\iu}~|z{||wqmjaP>^> BA8+&,p2d)N ]d_Q˞ɺ19{?1G- آj̦gJ'ӂ|T5oޝܝ>v J&F)-3)63.+f-1'6;F:V]dfMZF]:=KVTI'@ ?Ah>1!%t%5gFH8"!Cii&mL"]!%%\ m2  KImg?ö BTNqr3ݺxŊϾ=޷T o ]i <@|Y; E [sʹbu_=v$]1( . 9g&'5 \%1<@7# `16-DUzps_?ڽkg.nߑ?ۚA8@3 #~J~v$<&$|9KB7a. -`8ݷܗզո `ͣ갵d,T,P7`&O(je} hyQ f8'  `H~ CA )s >uuU$k q"$+<܃Gr:W<` " - WJ ?!|Elc2Zg: I),%D 9D/ hL(( ]G"0%96y+/ C)/I . \{6^ '$'o'%##Q9k6?mp(8Xi^=$6.Wh L#Ne'L״a,&;38[@Qj72/#vO/=M /.*| j  0 +z )Os( !%%',/*"v&"O=ƙ,dʶ3[$4[CJ$L IC:2)#)?/< ԡD1Ÿ="UK`c`s A%({(K&$%%$ B w!E ]ے#ؠؤ:ܼyf5qfj rd ump- 1"#%?''% 6t  B ,*S#?ܢGz ݍ]أrڑ>.Uߥ-cI  3$k j}zU G  !  6 K/ | )E~!} gU /-H9P3eL3A?SXV[(C;ogB db5Kl rW1S?? D oB0 }`    55""hbfkYz ` 36b]D > * 7W% # [ cxWnx'/m]> F1lSfk}I k&VW\7 al3  cZ3:AQ OAh;9xcQd9B! K [2D lr  P.4hڨ x'+kvٴ)cH!!m.&@ s[` ` .- s$#x" / X V W<) 2-lqy8D ) N5k*=u &,-K,*l$ &% c yRyk*8u1 \y/cUޢW >LcOn%35_, }QlsC1!r/=$B(=.My94g۳eo 8+X ^uyH> ! = C5[ףN~4x&?FKlH'(  n9U٦،8L @7:NM]5> $}3E0'Fɷ"0ݖ<'tS2MM >*z,ؽ1Q9 .v 8iѕڝP*R*.5'Y$ bа@^8uQ|yď A"i:Z$ v [ 1w 7T"a ^7yKx# ~- ;pB?1$63T.&T ?j bD48/0b@F?4/g)|۳Ȭ~j6jT^s+Pdj.6jڣcSV]+Aټr:QP7 Iȩa!#?I<+cF,44461FQds̋ ]+KALG/ߒĠ˟3+0$ fLx?4Vݟg q4 #+ 9~ 2),%WtWv)f*d6hxxS"%(#ƥߢQf {ah2ޒn_: ZurwR^7}*ߧd4 [-mu ; / 9}Mwc"#NM g3$&-&%$ LfK!#[# =#} #B'.LYN^nRh3GA/6momms]S4Z(_9ե{_ؕ'Q\b- 4"&DL+qD KR1U9ږךe Ow"ߔݿ%?&F߮ߘ NY0HA.  hx#O@ [,i gm  *P# f } KhkýMi?_]5`cFu^`P2 ᢽswƏorBY]4MQ-'۳A_` ;Z 7,# M&`%h^?[j>"H.{ p #({}Zcw:L!X & e  svjrp<OCn "d x\IAs (g Q 9dhNoaX ]<}J  &_>} AO ad ;e%d < B:(Y  :! `eI(l49^swABcu$[ E ;$nٖ8U#8.6:91{(< E= $([(T#f DC"%gطGߕ 4Z r 1{" UBwM M X 8 ? %" hAԲJJD_y @c6l]z{f-}ߜU!=  Nky^ & 8^ Y66bqsB'l)%{y.l& +_+P p?gLKu"#% !F} `|&R+ |  "v- %J5JGJ;V Y]WvZ@v5\}1a 3Q? XlC w R W KR0E7X$hm $S^ % 56enF v q}(X4.Jh|luzRwf!oHI]\Ip W ./ h I c 3DnYmrzo WQ [ 8O"sA qky(7 [ `; P  .i5wa#T  37 ]i 3BJ|R0}sn>[T3uۻе6C]N!);3;@BXC@8'Bލݡծ켐- d+$3A4?/$D7 -wZA?3| \ aIn |%=b/aʤ¹I  )0585 - &O  rZL% Ao$ Hb#(%+01s,$H i"(,&W&\L18 xO387JE^č#-#(<+ .'148[<;2! ڛƓԹںxO +!*//h1t6=^CmB:.! u_a˚ȕФ%r@q!*7D[JLMTLWC.i_Pn~0F /=Lqo3ѹq`a"P !C %//&zc^*dnf?rm6Ӧ ~|r '%'$Y , C_̚ˠ*TL>|h rB7).Q($i (uCDo4 "ɭ޻ ƊFOfx$0_. & $ѴJ``ḱEO z$*r/46#3j&yy9:Ib #oڷOΝϺv "4=CHJJbHINRNA.3ǹڮ(bU%8Y( !!,11y.m*%F Hu'do8 :v^;){ ^!d0n6Y5223A2-+ \=ߜѻ8XF)3͘d(B s2< =?BB=t4&OD y H 3Y!D @d` pu=r"FHJn->Wʰb׌.1]= ^ !$Wo7 T%  ]p  ~,f2Dĉ@2 +#J8V>z:=572(/Y)  j!?^]Ù7`&/7<@<(Eуk_N'6$ V^]ZC{l  O b/(xnItYn޸@ cH5  P= M]0; Y 3c,p+o޿>Z/"fdBW b| {/"r D` eI`  k/d  H! fh4&8(/ rN0{\~f. c] ]oY [uR$T``s!yI! gH^:J^x&vma5acOv, w-El1 ~ *P2 t1= O+7>D{Y?C+M&3,-;3wӻնm#AMB#r-~ˎ_&Y33*Y vq: #$ T BGUs  5']b*c;F C" % K |<XP$9 ?6k% FΠWB=XXFܪw25 L  _Qk _PGܶI߁@F"DP 0b Rs&=\ 6Xud {UYlUAV!r%u$  /G{jlSDGA}g0 _ -; x Rs]  ^C$,/|(Ru W,_>@0z*%?H>;3|".ěO~ /u7!h.! +B>ẊW 0-Ojͧ 0;B- )>íNeu\;PP{9tS?^20Ol[HQ3-^lS`%<R]H\FQEC4"`Ȕyh˺U+9;3!洤BY"9߮Ɂ= "03}-05e 8" g  M!R1z>[C;&Di= '(z!8r i} ?JN qBHF,Bbݏ!@j3GT%uDEB4"nY"c W P X V  VD KZI <\; W%$% x `. NKF"c \,bRDh&b wspSeo2]=l T =-ݟL׻`J/ cF . (/L" |I @ . m  %G  X~= zDkg$Y}n , 9 y ^  Cn2dHj- '8 b0   c\g dC  =]OM/T&  H~U m @ ;$PCZ{ lfd * 5| em  j $A^E$Ym/' @ t |Vw8`ol ZYf.S 14@GP  @ <1 ' Gy  E 4؏  ##-# ? P @&9}` {/A 3~u \q=s J)j^֠ME ;QM a ’u1 qCnW!)4-_,&6Sm`  :տ̯q@U> w kQ ` $6%mbپ g "38/2 &eNub b\?bEY 1$C*_.-$>uT}Z-+fn+ߤ1[ +.o*#<HhSV  ,c%('(< y f/sQ.&ph ""Z( @$*$Ljw<w s<%dR;($(13*Xk c@&*LeCl yv?BTyo\g~  DZsglӈ|Uws^ )9"@# [ 8*ҡ-F[ e VV aM ' ? ^qx |f#"[t [K ]UHD*CVES Q %$ ,0 [7ECݹ7,n(*}("&%"~ dwڏ8$;>,Mmsd "$(*'! J1w܏$_EcN/!-B66B1*E&!& ~ AԾن7ju:,8AM?.y WrdZb?A91K  #fq)1DŸο5U V@~ҡH\H`3X`@~P yMȰ#˹F W*xAFP+UQL3A$N /JAUP?%t!FLsX#* "PǃC<Ԯ3+e*3v4+cݘ ,E93CF@~-Q-ůƖt )c::*9}ܖ?&$)x&%×Pt+ey(a<$HF8E Bƛ  .;B>.N_qͼ`n+i,:?=:U)Q2}36g g)9RCCA1xdEF61y->C7^b˂Ό\E! -0)Z<ѪђM@`#rP$>SHm<ߢ&ɸ0#31 zߓf,8a90 -&46,R6SLТ!&0(3R/"01" m9ڹ͉NO8(g@,NIL:b|Ҹ_͟"%6=Fo>?'ыőȭ, 4=@>-N̨ٛ#*)%mW\۷$C/S3/0& AlgޏW blx7t z%l*(!\ bmFy?1<rLM~{vbDJ&.S{>9& C va#iYL* vl s>25`+R!HbSu?ԓCW|Vtf^XI '< +wa;} <"{*-p)m3 gd tq" a xK2> #5<PvJ!~A6j kK^^Wm7" ^((M v& * (}^O$0 w   7 [=Fx9s{ kK IN 2\ _q *U >)*ܠܪ- > %h_). Yg Q&H  y>SM3:,, N;k܉}!z ~[L;G\m/ 8Lcq6@h eETpP~Jb# 35**K|\~Z>[ !~*C   R^hD[,d zNH O O={O^6 o*G lg #`/.Klz0 k- ; l  6ZdjW: CG P!cj;FmZ $ me#EC9(ESvTD> )#UikM+LS&;~Ic(+(Q * k ]EU"  Y; ?*'o@S"  Kk:\%1FY+oY/!!-UqoJɔח !}" =z*7.)7K#tWkxedY T ~ .=+a/S1WO%q73QQ)FnT Ppp\&fu!& !O{zv@|[j}) ZP#%Zx$dh ]J#^}N,; qUU,KMgCH d[ZobW _ \]Y&1 eX3}  hr%&U+)P!0G+QQ€U6 !2,.' iu9Q<ڤ1lBn  .%"G$ @.ٍԏשE)Li g4B  Y$.# УFʜ )0/MYO3 c:_Ř0{zD ' t1e{1 ;[VFG#*31e!H!UZ YC#N3N$fPH~WM/71:ԠϱBh!-/$>o 8VݓFϐJ _&_*%B W0ag( B@$ܝ͡͠Ԗݮ&n8>IxJ">'*B0Ot35'N<\ ( *m.) )٩sO R /!q./&"' +ҰS~ֻ!,+j![5:"f)U 7!nCW^`_8Q2BųVzr33EE8R&8˹6&ASRSD2" ߻^=0>;S+n JˇV*DJWs$/X.'0"v B  E(yۇLڸu`*[_ 1 MW# (Owz@  ` 0 +eH  ; Q =i|h%@ _a R!:ST %. w-D p+tBl h K bo U_  \BZbxnҹ׼.٫+$EIG;R3KCD .IWSqLg9 $sNjnkI2#B8F'>,Pñ&ϙ܅XN M$+-+tm ӧ2hS _IHv 7lvMk+IV 2  ;{J5 ! S^uE ,y y?*!!^B**Z \ e[[ n $ T/Sm_)v0 2 $el ED1K^Z=-^ e_s5 `   j D 8SC ,rT5 ^ K$^(l(|OA>2]qEqaTs*J QZZ(XItB_C54MxtL  =@j+rY #mLT` J ]qQ /[iAm #88|eF  %1vz2/Qq| W1p3!>?<~p  4X$e|H6/a_? X Y0 M|:+cV. O(r $; WCBt akh>)KEVoC r\o $ %Vs9 SU iA$ 7x{, ] u3 ":P ,; 3/U/)` {Y j ?  / l 74e< b *  !  M e\ΒΕL: *  S MxP50@CxO^v^4bP   b :Tiy nw 2G - *2%.ZHivd3 S#_!| ]Pe b0U:m:=Hb>- *,8( p3?ԓۓV{ L/;(4O?1 F#. Y I eP C 1O mI K$)r"4# qqGq؎վկ0{4&! zz7_55  A|2j%1%yWQe"! x? 2 j~2} #Q- p!% ? IBS*| Y$.0'+V/R̙5Q .+LD $4[ /!#=7k~=$1$1  9:0 =v|7x i9ZrBdxH( @J%%#@[-Vcb Hw 3E'zKu>IZs#$ Zw tv.+~0"w IN*y#+''rAOGA< wxl!Y : 5 V#~#W [-UxA O!>#9!Up#j޸S[~  {|  zLv-&ZBٓ HB !uW]K yR*P0-q#^e"! ) x93~!8I\>)S, N qxٚؼDA" fb^` fe\7 l [x! G@Pe8~ t 8:Q%N |9_QϠ{ Ak*..w+# @Qac*שToH x=ڡҔRpҀh*;FfI@n0c:Jy   $+,$sx3L,)$*Յ~הY9( K ;C] .7۞IH7tR]\3= bF,- / W|y}, &./+r&($?#k Qe?ۭ߼(~06Ns%E;&m = btCcSgq*fL$IbJJ(7^WKZD ds)tC.| bp .O5 ~^L  9?Sy-g6(1=-N7d;v} [qyu S]Q+S+Q<t~sq9?`>;?LJ\qy~I .- $ (A Y o o x   c 9 / &t A  \~w{Cim* n0 4hJnrb$X/g(±r8uFC0  Ou%6  x) 4 HLr2:qA ] qnp,%dV) ~+x $|  Q1%!>cT~?22F.SqNqi@BXA={;I!B .0x=]FNP ~L, =? *m}Jj " /\NH!)i Y  '6,:BLl7R~0LA@)mh)(i<NGD@~9t*1;!vAcXa_QC&| Jg9NUol0Q0# 7  s?"v 0VC-- I25'$d|C R 2tzrXlRV +ZA<'GnJ}Zi+q2e l6pY + 7#2ozMV-U r,|8ZSxjVo4 s7 IR/ P;2@^< e&JNlp1 G .WOln=2Z[_!n izs 6!SQY'B!;5n;:Cxcb-^& uY $Jz1 8/ w e \# xDa9\ =  f`j,u\l tsh(Z r  mv\  V&JCyb ) +z tZt{O(#= ""Xw D o XPCUIqVJ TC ;.> pi(kj"c):J:)nA 5  X Bb:n{O -1c|hI8_  D'RFp  %T A? q Z*P#  rPތڬj]%u' kRc06` SDx g 9[\n {Z `  `~)  6 CX I R  / { ]jSKl<!ihs z afo yI N^fjlhvr%8}~ Ly| 3 P=5F F '(% x #  4 xv m_eM^|`i<#}5L%ot `ci8 Ps  y No W g   .  / |>M H*ߌ۷0e=+06 \Z/ jUnl+  \q% D~ Wj  y kjLgQ$g# t:~ -`<q P$ LJBR+Pb`3|s9e2#$$"$M ,Lu@h V(Mr   hh 2 ,;tN%s u{<֒ dhy~ R$$97T %0&e/ z t[~ DTK 1  _=|^I}c(8C<IpL3:/q9( #  m?&-g)A9]S >+$VhD޾ d F5@6ڎ]BQA %f2v+Ob*#%)z mRoǃγ݊w8<6 /!ցCNY3<3r.1z.`Ke,+,)oW U $;)JTMF<3)0.)?l#~/McBa4<0D 3h4&oslBLn,YK[ { вdN}ICt",$!n$ao @n\>2${7!G?$*'^9 z ' p  ,Y+q!N Z$$EOnPEN/.&[Pbi'*AYS [ W%P ] T UjTE X#q S  2 r =q b{`#kO  Ci ;!,A @=MP14 GAk'koL 3*j o ilz^ZgfYafNZ =C#Z 5 Eu m| +&[֨؝~.+-K&Px8@U =!Uvu04h' t JB J=MN6 59F3"&/${Ib!" :T%  `j  < e c4Fo_}X..# e$,57o/X\+Ә׍L!7S_ CU1A_l~)%N l <W u:U ]2583:& ܳ߉FSDF t%>$>z} s\S_F>2iF I 8,,0U`2R 3 =Ϋ / 2 ' o` >'  = UZ۴ST ',+I!FpZQ؄Y,X R["{($(D.G\E|Eۜ)eѵd ^A 7)4I4-*.%2-!"   ] *83."68. 4-67_+j% [/׉iI tk | h]۪l$ܻZ֯?] 1 QU ip(R0-^"/,FnJf##)D#W Z^a f S'> ߔG3 B"6;A3Am:3W0-"%9<8 #4I7,c2iژ}FYO+0GKˠ~ȕФH՛ ()I;t$/rI"rM LW$$!B* .q;H  <d)cx ),:GWe[R> JXV aiX7= 6,( (]# ~C u v,Ύ(7ɵg3,6ޤ}  b#/I8s<;5)E Q$.47884+)?vt ^o;GPOΓ֬&=A?v  `-U ,k{_L!1<;s-Fqpf"sZ*,' վLOSʣ7jݪ@΀Ά҃=һL bTcNRXװ]hs8j j".8 :0"sI&T.0/-.K12|1.-.010,'$#j"QGk%!C}%)J3WBJAz'sHÖȓ*^*,z881/_! K(_]4/g֡!Ӭց!}chRXL^ѧҙcLI"W %('%',00.1#8>9n,[YJK5tA "A(9*)%&@  u? 0k.q1WN  {g'͔έݢC1/96p-$K"$(*m+k-1s41 *" )Dz@ڧWI@)󼑷±<5dzƉ g1.E$4Ϋ "%0 /! &׻vӎ߰x:% q')&$H$"L  OAq mas`R mfA Gg 2fL^n ! 7( V4v5eI,);EJFr"X]d  ubg'FRG3#:if\==+Uf)=e  6FqE] < ` nOҼNgjfL,CHr"19>:'0 %C$*))_"#+K10*QOlwŸ!Y)QdJZ L_Bh)* :!<\AΏ-lԖ+ f`w~ 3 l\+;MT ;= c-40n)"}+ ʼnֱٸ9.5,+!A(<9JC;9*"(,q#R"$x;g[P˧YίA" }ji BA ޡ_~Rىmc!,1*IWO^G@a#"5 / XH )cL 6   ~aD4~#r!a4(>s5e =)&W= ~:j~v 3HM Yg[X8 wPx!+&Yb6!%,U5J<>6"} * ~ q}`%  "%(G 0#|""qWVl ܣzvf' R ]#j ! o 'bQVU.T I ;1uF\Z9$13O*)~rDLv%h.,k&,T- zQtկ 8(;L)!NvU5݋@. ,/R*I%p&9-,$(L@Mc"*.,;#Z  $'O"T$  ?$0?  %@iѨJM 5 }S '_' ]mc ` EX 7Z> [ 8 %+.0W5M95(^:  4 CrH y  z]pX{1=G%"$VHEc/!ٿMׁɢŔӿ܂ 93 ( UX$yM ^/Qw&,&bOV{ ]@ !052,& g h"+,]& T3VP1?o7 / &0AFAs5 WޱV*ѻš3G)F8OrE3n%^: !KMڛ)hmulږw13rߐ0  hf6{4!'[2)3G+h!4(J%S- 2 1+#YD 6m3z?2bϰ&۞sׇ8އr\ 5%sr7'6 }l8 -S62&&%^'~&D#XOs"rȲ, `+ڿľ;y,  kA Yz&uYloNݟI  @m  5-F3E/&|%z+/.$TBR|$--'"!/$$UUJ( AbQ~;[Y n:M vRiBj?CY%e#,ljQ+@t ]( )/]YW"d`Ucwh_ 1@j3/AW [3(ܓظXľ| @ )S >C"./%6C 5SPB[dJu%t) (&CQjTRrK8?A.8yqw n#&@k<  k9ZÃđz4֨u&8C4hƼWO8S{*yO C  eXI|$%(BT t^b }w !2!$} ? : K 5 # $$ ~K`׹ &qX I[UDAzsO`%Mh V v"a'6[# E s&1+=)""j# n5|L}0A@/drEk. ],$8;T(+{.`-OT(۔Ѷ]++*\&zUPg;%Fn=Mi@"uEذ276 wHw$*'d \pQ 572}Ӻ׊);5jo."lz # 5:d< }f }E+2Q iXb_ 2"6$!jl(O iocHT|s- !l+:$9%]77 {L ;b8"3%  C!Π=D L@ Jq 9X/y  ?  2Ic $5);W WSyjVA@ &.1.L!Co2߳eýoUNK $)*(Q# An r' ^F ضV}L5-o$$("(|'Q:iZB2a*m ضoފQ?ۛ!.ڳݷ \p_ yH1)q1+1R + &1"e\9GE< <ȵ[s\)6зU1=0PL[_Z(J.-XER4J"R96EqJMLD*1΄ LNA TEU%I&6$ rF͵z%z I"#C@X h/JW ),\k*D;: h^=33I/4ܝ;RWm+ {;1 R |W a i 7 %tR D   D E f9y vq'G@K3$^h t2 ((l%B&*s|YJ  v.v-  +{ 9@x * l8vm{iF e@ roE7a   =-uJf^$c 6m:,l%;Tz}R(xk;O '75~sz' Qa v  SqyI ' '-? a N -5(rI 8Q F1   |u . A  dq!+Bp.f#M~O[@u*D|] ?z=Y+JzQ c;xk7kX?>I,N  vSa .Ey6 u n , ^,/  K  B&8N " vf L$9jP?N9R-vC[6331 3JK{1(>9A 2 %l l  P _09 m rxNMn d6  gZV3; > d)mx XAkN)/12@TA.DL^^Kp ~J? *%6Ch xxCK_ b  l6k/M lS}V@_/*dJ>IE u i T""<D0 \T j  I O * u_5WN&(l2^nR ?l#݌  d:Q3"$)"fZS5 i4~"V*tUbO-Va,n& Rk$Q^A u""")^ P ; t?X{'<9;S3|D)$<]D(VON9m "fN%?UZC 3r,3 % ^_4}#  ?  , U2Mq BW $"T%!wVVxr_w&H e=.zhB{ j @L !c}!%+# D5< (Eh %~  D>8 0 "9 OYҳZbUCݭc3i G X `x |1Y\ cnl f r MTX  &70\ T1ֿtDK}H܅޺IWQ \ M?3 +) VO /%,,*""DDI t|7 )m*_/ Wi՝$_Yt CT{"$l>}ܲ"P]o%p P  +@MqJs:-E/-7;3|S s B17'q#= udD Y8u: ~#[># 3 zv hK,i@3 E nyk%X9O\55R!O%u&ѿeJ"*&S{+d5M(O2[w='v#3ﺣأIo%NOߕJ׻֔ ,0 %T)x9E( e9O81"B=G)m|RV/9b0SzĜ—ф .$C-$h(81$@ ,{68] (*!|c6R J 'f--8zm?T  U{5r 'ļ~ e|'A% |\w  K &qf^z)<536%inӦ$/ ;dv%'-$nܨg.*:x@UAHO4X1f, >E4F%W##3v&2=^DF+ Xl˞/ VHA' mŖ|vX r-βr;8'jm ./''l/.HܞܨQ'<<#=*A+S]x B 'NX^FNA$R1g: 7 tpg FvqޅY,!08+l J?u %' 3kY7A ! D)V[ChH&; XL5ӵ79) rN'u nߙ3 WTS ),%!=|?e& mi j 6 A(@1 ^W-c H"y 4 u |T  |7No H") [L1Ww VQ2hF>@߅~9܇q<\zݠޡO#`UWH [si~&R! I?(8c>;7r:4>9'M* ( eޝrts> !joAqpԷ րC'ˈΛMj׹EϦ@M'P+ V( 4fT, rG& g.f Y!-v+7  w! C  2%} | !/w+  #c+0u& dT(hoJK(#H/))aEwy֮׾ 5Q\Ȣ\2ZZvy $ ,+L#HE nm4M R G'$yO 'e \T1?&h.q,;GRu %(31V#.A#T8<] dߧ3.D'(%GiyW8 ֖U{  CX̧ܬ v%YWP%l=_ISM.љ>)i)&Gp#Κ8  HNa b i24r[syW˧ - A~xza Xb Q-S 7V"3;,c7pԢЅ   -s>J<"&i}#d$.~ aS %X$p!FD -5=/8>)}Wh rO5B˧ޱ /#28mGI?1!VkZ[T߶_ 6 GA v!|oC 9D%Mj 4T29W "@  Ҭ@Z%*!b 4lȰT" I?md+0*5 pu_Z&?&_e,Dw P@Y`@R,5 &t8cKG5Z"Kxbo.S$ 0( Є4P#|#L wpm ҫtGN \1{M( hSl4f b: Q7 rpW`!߬~*hzi*q%!o-5#8b1#21 R *&'*)$e HdM1CcI81(D+A)=NI/64ˠxBk@;1%$1 <=\96795+3%l+a?Vc^M<3w44,x  ~ a \a[^t֝yqq1ܟm@|FܤtҲd6—V=4 K+6<:5.>,.4x9.@KYg mg[OIKR8Z\XxPISGF'D<2?+s(*/58O4&T-y|")݅"E̥IǫѼ ̶˵m zk)8?\-,7Wm-gc$7߼ 8Pmky$!] u* =GVJI%KJ?'j16OUKA>64/$ZZm)pr g\ŞcG 6丣ܭYŀ"&۰feIg>.9 be >|[ > $%(y V!(05)QqIg!<JC.  *cFjm~[jޤݷ|XMP^M>߳*xk(4ш /|  Y(!' v&,C.,)''''("**'3 1 L["J; 2 ! 9kssq b k VNZ߳VwS*c` (4X  [5T QXZ (21(FX8fJ } -814]' ^ # ` m w K a֏ܘQn9TlV)<:d s/71$&)Os,ؗm /;j-ɵOƥ؏q;Rb;6p-lg?LbpOTE Q$ eG u l(6ENZJx9-&6 %V N [sUZ U&p G%b,00/.%-)X$p'j&q,},%)Er>P pLLL~)+ "J8N!l3ۈ; OhG6-9ίd*w!E*p:9[h]A L ^ %*/27?EE<<2P-!3?GB51F) F~$ܘX*ϯc0 ҝ@C!+ vx|.~8!+% ,? CQ8jYٹB8 5X E7\G͛ġŌ` ,cO A  $]&&y$ p,p"WlT '{_ N;bha&R-<F}k6.81R0Ȍπd\ -*J4 me_ !G29"e ={ T8 /'H/l9C_GC;5v6k960'1s+I]^jGZeʒ9o-"4&J50?/l??OߺܾR;Ļ ,alTW&}!>C1C5? b&i>yHkA/q2 -DLC.,݇ J(' I_"&ޠӌC) Z !5 L Q# zu[@8k[|/.[z  { *bߥ,$ w] 3J  U# CPz )2++9X   &qtLy֟_ U cU0#("W ~,&r2s+j+ L(" 8CۆZ~3}N7ug{0@ ^f >.CNP   j0ki d? ~ ݹRXY!![V Su1 \jeF@| ]f  `k+* b-2=;y5s eޝ؊{ K1'];   n@ٰ $& xT4D͗''?!  \&$&[$'aw&"v Z5[pU '*KmmZz5B9(";:1 b+]h[C_y` *6* `#"v g2.1шWZǷоܽ$״K]1Ծ#!~gir:f64v" nB 2{MQq;fqڅ)b+CjDv_Jڨq Zm/~q; $r *qD}C#_>E cbG()@ 6>'@/*` =?Z&)> j P(:MQ!F  ~|DoQSі} N^E:VVA#B!v _|."+. &` 3 14'X.*!%^+-" 7ORDc1>* " uPήݕBq ;;֯| YӰAVs  Vpg pyT: KtdA\jWQۺԽ֊XC U'#95/{ V<R}/%lE"V@٘')1*Br1t;4&q80:, -_¡rj jf K A4CI] J)vK 505#R0&Z:%J: Xkךf,(P# -\r )-$A]fML]s LCQN? "(>^B]8$@JߑVШ@h$\ܼ5t7*4& lsVf7_G~L4D,徻?؉5R%n,e&B>U7۹J =#F56($g[Vڗp  Rj7h|gvr$ j\'iBOP2I;'(X8-$30AN[auYBP$ #TkM&O#:1>%v״F7L?4)JJȴʲ̹ϲrhJǺؼX,Y2f<+X 򰹹W ?^ _Hq( kY 0)~:4UK#$#j$$J)Vƃ%Tй#o@Ei6N&ǟ1 " a D$,W > D (͹ ^\ n ,Ė#5-G81P2.j')?EB77* .1#b&Nehwu&Hq "^I7JH25w 7`O = T  p,`W>V "A   N l&}μ:FS/? >* Wi{#yK['q0!1*!e!!C h|"02({ )(W[J:ܿf /CAW(_'GCy 2T-?݉6Jx`2cm76c~d%\@ dx5V{:IxF##-4/#c 9I$ME46& . @߄9l x } += .i~9}Bo ',[ 7  9̬͠aӍ؜`naZ! " & ),[1S62;?VCoFIKNVPQQPPO7PzOLGC@k@@}?Z<713/-*H%K^p&ڛɧ-gN`ѽͼ;Hyݿͽ;$z`X"Cp<)V& [=$+ 27:F=>k><=BG&JJI!KMPPR2SSTQRsNIEB>:7%77 741/f-(!e  BqޓܝԓϼUʨh˯%12ǶĮѺ Vd΂ԯ|,ڀ^LG*Lh7 9 :Cl$R0"&)**,.G284432233333s33334\79:86d544?31.,,,K,:,%,\,,+)'&&%#T SR a"I${ >߄^T4jYٷ{ڵף&q$ޱޜo'}irTv~6 j!R d W o_  f5sF##!IIxi !!!!"""A(wz#?V1 JY}.5 [k3={W#WI-t-hf<6"$ ^[6V@ACqd9nb )B2v<+"EB#\{QH!#<`Po)q%Y0q g(U l#xlEvC`n!z|q-?Dj^G}4`0MrT a l; G W.v l$t \ /p o5SN5 IV) (xx[J0&Jqfk %>RGU3xU /d U q< > $pn %D * &H AG1 P oGk.y$Uh~SpX H'H"s-7IJMFqRM)@M}-~AmZj%CoBWswa ތF q_ D/J;YOBAkiGmAJL1VgW . > ) w h M \ G z  }"7CI= ; )k%qm,.C':$]r!#$H$#! B ]!!;!eV=#  ^vb!""!2~\KB k Z;_ U/ 0>  m/ ? 1 S we*()Huc.*=pJmm߼ߒb܌Cn4)qe~|pݗN8I.[1! *u;:a9gdGZcf:JQ!!]-\ )Il jq9;S;v2}"p&0 0 D b apNu}#+60 _mp  $H`OK6oy;fNI,w.P v * U' v2;OWjVoamEqZ y q e o : 8aj4  ' 9R0 l+ w= m [ A;)=|[-OJ87 w k S ,a$L8r')J??KV-7 : RLWs5 XC YMN`s`9sh^Iqb/?)@U1 ~GW NX ICJ%_@DoI=0HA+C#qsS f # 1FL >Tb&{47 PBj7n N W  SV1    [>%.u g _E6T : L P (&'Nh ) ; </yh 1 I+~M0"Pk8VSkY2\o9<d}BK=Lbcbgu*z G YA{  S@ p ) i e  = k wl`do;K  W3W^ ? Y wwBiq cyIXXG_!\]?"-R}C7k4ME{,UMWtmD&CDE1g|[ @,o`:5ioTC  1 &kBLv@x+xF.Zw>k>n (   $ > %( l2< 3 L [#o> RkZ'K[0AUt.f E 7;$W!L4lSWXc3m T N IS3Bw4i#W 7<kS  bzflag-2.4.2+ds1/data/teamgrab.wav000066400000000000000000001432561200563112200166640ustar00rootroot00000000000000RIFFWAVEfmt "VDdata*Js<^mlnL2aGHY7[@ v@Q8!$5 9 &uDDAL (&;(bӦ#27;54 f5<0%UAF/ :12nɭ0q,nh;/&}R ->;N%eTDwr0CA,V f­:#=)ES7lzц\(s ;CP4 kB@ =dHC=r:4FgC:+Ytϼ ,K@]?*4tș&=A@2M~Zcf:yC7r_0r3A<#:m+йH/>;:R#aj ,>)?$, =aS#Z;XBy5h+"@6>53&ҟæ :C?75һ +xj9E=]!Bоjl 4sC=$!;0B A,+ oǝ<ޛ'=HA@1+Мr7!H8<.SQůt6?4s2|MA-2>39"r1m *z;:'6;B (::?) Iǜ!"6:-t`OF.81<ϰKl& 21.f3~eN >//!4 ( @?+ 0&F P S (H%Jnو^!"$ (rlEa[k  iEF( fN- h_FI  npIV 2FFmA & =9#pU!E!1 koۗg?#a'~ 9-3Y ()'bU܈''ݽ})-|#6rF9ި%^0j,rmK8-- u vڧ)M$,"1y'ߜKѵ&1- 9? !0i/6В![,0$ 3AV)(3+/rҬ $d1.\w |01 $ oUіc*/H&hB!rRs&O/)KbѱK "00a" dmd)30'dRDpkM #0-(D0m#.31#Q F;Hj +f2)y ѫ^ܞ^&53/oj/0" zS| 3'y," ߐ_#*#X% G p&#nE !f!)"f-D01x!=o'nZBeO2ccv&c X8 !+*! u+ * jql2w<fap51|D7DC 0 \ = ~7 tt-  0c 9 ]ut Sf;jb] ?_k} ` [aynX  C-F< bU0E eUG7 11)? {F.Y =J# S (e^Q ,!PQu/shQke!"  c b ^߽m#= z܆"% P 5 # |q^ڛ '$u~v@ݡ <((.!r$ &6"zA%z'H ~/AY%) #zK,07"4(!:gg (" ֆ*"o* %=e֢J/#-u)]XBϵH $1.w0L201&$ ʦ'-12&Ws͑K-4+)9jɸȇK5-82HR×T$ )d97,%ku){&"#57:) ]Ƃ˸L396.A}GǓȿo/9I2MݐH&" *W6 2T6Ϩhx &95*4 # ~?1"O34%H C8јc/2t&-L !p/4)/>+ 5.0sˍ)5;2q#[x=$ 5+6[' @l;;^<16r,Kˎ܄U/^8/z5ʲ{؜R-9t4,:˟7 )9Y8' Ōb!59U,@-3̈m18.r>˸h-k8O2wK(D63!9ʎfj" 3i4%  m 05 +5CG%E**A2+:"|ԃv#P,'dSK + *(ܫޞ%M&, M*D!0 '4}kS 5}{ ,Qs  !v@GeHB ." x f p8^ayN*r a  k8=d)h2@nO\ 71 @nVr`q^5]c@^N 1w [P_xlP4 ^ :~! b  *o>, bcHbQ (FHr[ Ek[  PE Rdj 2K'TO KEp - ay%%Bt%||  kc>u ( q*{ |  j56 b /Q7Jl"z$] (>ݍX #(o"pܵ6 *x&40w ͤq./!e ;؉ey-0$ Bڿ)RI-2(7ݧD5k+Q3+zѼ)M)2+?%'1q,$ۋ&e2/gآ #/2 2# k͋q03(Y kΞ3u,3i+4@8f(V(1+ ܚ D&1.t5^" "'0.|g։Ϣzi ./! m(ؒNJȌF"1:2 \ƪVo,^:5V 2ߠi n)[:9%qq̈́Ε%8 :( -˯]n&:q<* ˒dǙ%/kз<Ƹ 8d@4Eb8$u68@l6qh4B;K#KLćJD1_B.?(NTXL .BBn. $$@*ŝ.,C2G4g$h'ZBHL9U.hs֝#@I<>ֺЪ('@>߽ /@>O)ʐ>)z~( ;";J)b e6Ť̹E}#5]70(R m4%15)vVͦeh)1(G-EҔ:$,&Dԧ [ . *'v:)&&%l{%ۤ[)!S"oI*( @. AB ++jj3 i .bh+)ZgB"0 }^bGXv\ QVId}c +9MfE x M I  {%a-4 ~O `\? a} t 4 oECh r #ae<I AL%$l Z~~ yIq elLc  , i[]ae + o/5 X+ w 5 A_  .^P4A:  vE5 -\XA\j "2 :)M =[> 8 {'  D"T0 S+ W[YUl % X qz}h   (D>.Zu {0c)1xnKK+S)3sf,W$1X] COMqu   $t8' G< \n$WXup VvT _47 2mcl?a" pe% _F+= U'$A"2աF([(>7j*R((+!n ߼ְn7%I,n%TW;֔Qx#~-)Ө܄1 +*&ӰY]*,! QQӣ]1&(.' /{PjߋP "k,7)Tkݶk+d+X[1z).%OMY(h#-)#@ Kdܢ ? ,,u(|S',+/%!QWNh&).'+O !H, )CjӋS,,+Nt@E*-d# eMފһ9?i'<.r&-k t$-(FvV#q ".+^kزi-..F! ~6f-:1&&zN9XP-4+Mݖf*4J/ckջ a&53"<ȵ/$684) jQ4:/NfƖn&1;l4݉ Ęb$,<9t%e:h&:`=<-UW9b-4r=3WQ1.<8$&&:< ,6\HJ6=1 Y/:4ѬR (z86$|tЌƢͣ37[*!UOא<~%-5[-0ZC| %f2.O԰1GH.. )-v/).d% ԫfvk"*e%85{v i)&L[FWz'3)/ vsخ!W'o LjZڍ1>% V#[YV t'$Az$Z#lX%!Y#r qz݄eMk#  S<* "@T x-Q@]GF#5P E A.Guz C) +6nyz4m &$ JhlDB hkZ J 6ASg#M9  U%{ pH8]]3F?AwV`V! u?Y&M*!kq8Is ]! [Yݯt' "m WM |DibA[auh (7hIOt 3DA %Nl'< U8;nUriiX{ZuPo=8  nd")l  + U~?Ez } =" E' tH [h  ~b`L ^n E^U] zC %*"~  ` gPF tx:Z JI I dZa;ޏNp!)(eHF d%_(yy. "$ I ^s^?W`"!* Pt   y [R co2u)}PoVar*IfxU@ iQY H jm  M%= 4L e6 cA4C%7D,* *f4|]euk  Bzj`w5 s$ qo   s odCv5S.UiDcWDiz.oba35D[a`16b6Ak<869teRb5r[" Bn"g1޴l #!]^)c##!uIP!  %'a oH=%l*t"*Vs%g,%-^%/b+;V &2\0^̘#K4+5% 7Ӯ,^F 49,hE(}3< 3YfԮ2?8 ܉!/@E>(7t Ue++@[B/:Lۃ%=D5TCI:}D>:t:գͻ1^5lD>_&>O‰_n /B.B-' ?}ĵ(?B0>˟U";B5QL(}-O8CA9 >5_3,B-<#ܩsl .jA?*ܻċr'}>AH0s5Š!;A3]}7A47՞V3@9 {y>/B@<&x1JƵL +@KA- Qږ%?~D_4U _8:Cy7|uA8D;`;4'FeA/(khY6Q I//CAe+0[ûC*@A. nA=e$;@@0_ݿĪ#5;.,bZ"P19/4~)ȋ`!+)5.4M3Kٝ&1J.wPSsEZ x#/-Xؓ++, "۟ӌykg(*F Z 2,پ9$F)d! /3n% a6A "e s%zvM/ T(9 E Qm 0fr WpZX u . y    &I!V./ u R u  b^S  `  d m d g1\ J v 'Z])S BKne-  W&L9:3 {\YhM]IB f2 PHm` % $zy 2e 3@ fs  3 i  /F 9O M=s  3hW .xY1 + H߹. (|g2Qf!yN!xX8;#$kuֽK$h( Ԏhk%B-&`%8Л܎]%%1.?t/ "D2R2"n,*ԐkѸ 37)np }1::0w2-:5z 9ͱǾҪ1 '88' VNil 489?,ܚf 091EʗN)74 "m{L%&!K36}(Uգz̠(/7.n_jʴ- +73xR!bl $5{6& hɌp27,,\ˑa,[708{K$ׂ) %42!dˏ+/_0i4(.ͩίR)3~-?y؝f !/e/! Fٶ17 m*b/H&*ҵ ,&0*.y "\0/!ؽdw,0% wH*1)J+*3ަR<&00,L:Վ~۩ !.,4_jb )-.e! rоRU9v*.$SK&r-&<0} " ! +F(hԊ۹+{'( x"Ռم#(!Q4ׁ /'#O܀آg$$Bޚ/!$ $ہ.LY#b  i".5uKmuD])X ZuN ` /$Y[ 8i_)(s~QY^]k<jo ,D }pwlOP_vq\K 03$( b|`] XB(CU0E r5 9>H*SiDa6|CA` @eDve e , } 5%y ~a=HwAc|>jD=$"aO" ww 4o gMSW m  cy L }{^j|.KZAA;?M67Dovd K|c@S 'Wt!LKb\G\o]Zy@x[ (]!(* |5@5C ;~9]'Rq @ ;* "e 9 % ,Q;U  O D}XR / EI   AL# 0  wr S2Iv< Nwi JOehGA8:MMANGa181x~Ass|pb] X  y g4 s /_q V @ s X; 2* nL{W 1 ZF; #od k`7u~ WI  :'cU&1`2v @ yB<uAr<Dxe *{ *5"  xttjP| mNs[ I;t A ,jE& c:L F $=  Z~F <;s +NZ+.j\ Yr)k bV Z.wcNtp &IYh!"f@0ۖ?Q!$ J ܕݝ_#] - _"Fpt|h=9 !~&#U b+"?AgDݽvZs!L4a`\!!`Z ( ;!o >[! C e!N 7NSxx `@:w L_E i~ 'D# b ym,C'$3 FDE& K \ !6; X X I( l i F0)_,D4R]RP^<m0Z[Mv]v3\iIsd+Bxi/s P[y_ 1\!=GL! T ] ^h`i 3=] Zd_ o\Y`4|! Cu]!%OYi %T!#+Q%_%'ݷr$e'|Q Q9#f##!)~"Ep  ($~Fܒh~m& & ~2ܑ#& %~3$\^ K ="n 2 M"| &Y "&]){Y X J v F-M-G@/*( y;."rnT| `Cc]/ :)0  *0R~JL* <]R$ KDLz !nrcMbi5 g | 0?|f  j Zfs@ o X{7 S23' Y|" 6 L Q h7RS (7f -F  j ^ y5!/e 6NJJ:iqGNtzDz7 5/e%0Yr)Am_#'_@qn91_]&Wk7fpMVc B koBl&oB 9HA K \ F a E`{qkW t: $%A<{B[^ x ?b < 4pj -Qo(n ?{vXWeZ =}7Vi B OeFw: *gf.:b 5.>.  }oS0  rUEr 8oe>h=MPY0N&mt 8 RVi #w g8 '/, F< Sc2 & hF-A ^~T& c PQfI rpB2CnFcy<)h])83]0h Qn=E5}9Qe2 - bk"e,g `5mu>}TRT!";uIbKj0&6eB M&Z| r/?`<R5i% i l%N TA  i1YOa! DY l*]O` |& }WF\-YA & )R apxS>?imN*C,g7BB%$  t&2?& p{ @ jt v3:Y <>7V Nd <:7 X`(gD |&buW& $oHIz + Y^*( jL7e(I(eO77XB0 70)6 =x>z*bG odm M; uh} [ B~Go @ QDMAw1rb+ M ONv u6XW\M\9E@ QuSO/R~yl'cam]e,Ho|B!J$cx8X L 0Y? SJF`Jn ZV/NT e 19Ae>`p]|mWM Rpge'19JVB6 ekahalXsIo5TW{m>4GQl3;gRa8<r+~ M;,T( \ 4`>V z yk0 ` j@> C+#c>^ ^>%7iE 8?7 x} ,l q A Z  #0  L bsIg  e&As  pd  4U No eE 8V  uX  du``)i ! Vwq,g %%ZNIp ^wLo\ no w)Q l!He9  u B  )  &0W *]H0,^ S\ p2$ 5 9MK 3=  G H.PHZfa9g|KhG1  ^ 7i=fZGq>%DmXY5dG +H\*X$9@-xwxI.'tb  4u/m9u| u ~2.Ocr 8 FV E nc83  7 ZtN 7  z` } , b>: F ~,- m  W V ?bAY: <J Hpx/g  [>I0]  #AyB U P$:? t 6 Ekgn1 M ';J. n n I9`>  := H0 yA Tu|oxE MFnE8t~4fIl1>: G/T@ p, H# NO{\NF/~.: e~cw  rL N* [Js_ !ovjf]4/}&7\5& o dnE'Z(lc,ݒ,#V&1+ %KA $ ߤ}"5  3<9qc[ECg~73;_*GBq8G b!^ e|s  !mq)&mA|3=~10' o A n` WB*} %?  "s E 8g" zLZ iH hu t2ZnJh1' 6jN [ 6C,d q AL<F G -Jdst A A\6s A ak4 ( ZfG j0 !-M\E W )R`PM+I$) \X aA7G w "gmh   -fYU-QaM26Qr ^ a0"  Y]<G, e /UAJ g {1"*5V Yx= 2 X Hh4 wz cb nyU |X*WedlY hI  KL[.R`faQDFZyEJ>i[P?>?i U ;Qms.o K v !% G = Mz$t  O +3  , 3E N? a# Z~&8J  ._  K(p~!`!QLk4W *Ee VN hY% NDU[O ?\I }U\f  JD O   B2=wT  "  0 yH*4gs c |  xm ] {Bu' bW)q  (L  #D5C D||\V R \"xi  rIm_MzT (v zLx&b U ?+b  U M R QN _ 5VJ-s bIb@ 5 )yX }3 ^|t1% =~`<3 a jC+# +l-| s< ` w qxeF ! 9 s +u  mL M dMb  %0\I _0 plr  Rm Q '=OU z ko  Z. a w)B7 > ee! % dZ   5MN  6 W_SWI < Mcn k 4 + 7"B] N <g  +;dNS 0$=pR E 41lG hP" eaMaI0JO:dcyV<1n.c+e*Y|nG+%`:P3T^38R$0~4,~odo+;`)%_PoKlHQ]g* ;f</LfL;$+ 5N}[)R;\J M^uR<4cb)4AM{TU5d+~uK(m]k ~S=mheSM}7SaJ(htUl ~h3K^jv_A<+W>09VUl!.PWWxN -U+qM ! M&351%A]a'TwlP{^jUBLZcP^dG0sY,Y`]Gpui$[cM,{e;Jfgq |k][@vP0cVY4]= ?|YJH3 |TH\WIAvPm}`"\66#nEkU)(1Bh}*l% U0F p9_  $f M /B  R *_I / 3 #J O } & r|7@ q&h - Mby"   NPErUc9mz\|~WCeb|Gdko F;<A>BSG%%A^N!%[C C / [Ms & 9Z )v mtC-P ~@  h^ y4  %/>A Z}c id 's7 % HBQ[F txL h eeyt r6nCt o # oxQ 3}< (# zQPT\' =DRq]%s #Z?@ ;V #5/ h!#J; -{zm f c @: Up ,R l.tG5FC v D9 ua9 h#kuw1@4ypw  | H;r}Rv6 $Ncߢ5ߦ5d  W T '!X^`q!" 1P݀m !.W0@)1 L#k !7#Xer o#`qlC;5 #!bܤHP! Ej݄ !|6v!ue 2| tn"S~ {DvTA%x (nURD3]$Xq#%G ZZD  #XfK ?"pK&Yf5U,Un"A %eI`( J@ I2 @/1j] Y =< *hD   V? +b@Qr. p4S  a8IL { / (S ;    lJ%s $$(H6 `vtTu3wZAeGSwr~oH xqJ.YYUCO.m%Ek.{)og\). o``.9#?WN*vpl+;mtOEp"ej,a{ %b0ZL;;_/PiR9 ngxg[Hnlj,nCkrYtVPf`u*sIrg&ff&5{ie b~\; t >\zE\ {AyySZg5|xS^r\| 'un/XCc <m! a}rUS 5  5Ah < f_ b nLI Q ~X\] [ f> v x<  - } F9R _84| L Y6% K7 +)t ,8*7?ly.= Pk? LQ [P[\! 3( {Db[q kC.RKB  z$M HKu k)g 'Nun U223? #| T^ !H }L r +;~u x>2kh~` = w3 p +R(d1?:%L2 b B? R ?  QKBtFb sh8-2 1 /z [ [V q,Cqw ~  ^pEid ? _<tr2YE 5 BCH cL  #0|s Qa u8W o94)cP7^nQXTw#54MY{Ou 7 pK qT0 #\tL#6cSwiqG ^$ + 7L_*#s {\-  oLVJf zD.F=G+Wb5/g\n)oYjCrkIZ#Fy nZ1 Cf ?rJ  | s0d ; # :  +rb ` : C 3>; u t ]N#f 6 ,Il C PRIz `@ ' m&[ B vG} J Hzti9* ;'n&?d;'UVU}m0m2[q@04z[j8.P5y F[p/sLtkzjqm=f ecH l)lP)W KjS{B|v]bQd0l ^eG=t&#l BJBba3w{*L[x7YsQ|:lXpZ>nNFP_];lOK[Qij;NTU]YJm`6+DA/g]+%P_LD|d;W9"0Nqd3fW36k>>Le{,qKu67W@S^x6k$aP$$ou$^z)gH;s R'"w{?q{x)L7 =N-X-jlU6q oA*kM/\<-#u`SqnHV Od:V 6P_]UhZUV%"Kzx6ert3$WCiKy[C 0$JES  \PHJ  % jCh:$ ^S 8p 9M6\/38 myk#( Yk i"h$ m:; ||z [.0X ^ WT4rZ b 9^J r _5G k &CA '1 :d' V [1   & 0f '-WReJ yZxT\ya-6tZd1wcuVCuy|wv5)z1oLlv%14U_~qkzWjD6 ]{,<k0Cmx%8frC' & V =esBAlY pohS{[soUt$k1MG(ZO +6@'z|_7oiVNjl7-G|(fewMKyq)+yg8_U&dM3Z6an *a5dG*F5Oe$e XiY;fh:aogOSoux79M i}\M~sFB5l0fsuH)YS*Rm6m9a]Yah iYA)D]LQy^-Q *3\[YN^e Ja'=&4"Y'P--Q{0V(/2itS>5@'UlL&ao"$ xBy_P.x=zkczhe* iLvgnj}zi :#Hd"`psq;  Fv\c+ Z1bzZOq\4@5Az@:jmgd:<Om#jmQ0HvU,;,hq?24[+\@q+-`kzkjy"|`R676'6CfbQUi]$ aWA{ZUDvy2ud*kv$1G7vjS (pk?[q|mqg-rOar6&~ u+gSq @Q =C./=s ] }f8&+?k} S5.\B]rs|7.` z b24{ToS^M~Bt?znx|zm!j=j5|.!#d;)+nS+"NyGw|<4.57%hLtvt2A}[aWG{\S7_xSh'{nLLm,gW]f8EA'M'X8^l2jcU|)uleUh\c051o_$-+u`#. rDq(0Ck$-mq?R%b~nTu+N+/|i&~I-7klKNb&b ^HUMu ,ze0(z\X' cr"D ,#j2$)\321x ~-}[PD(AMZ7|+OpmA[q7 l\Ied]S45\ogA, ' *JRoGF>vz(Zo~2k1CMc'" 3w@Wc 0= 6,j8=xsO < jmG j _G7 i ]S n 2 QZY&& n o#%0 JI{ @  (9: > O )k0- 0 \ H3e ~X6L s` 59  |  [  bQ B .%=p,c* N {vpv i ` k o   .7 T b `E@y J IgQ @ 61 H ? o;  S  F  > 7u u{ , o8%> ty3  _ I $~ 7 ]Qf-ap N x6U> .Pa K}r Z7?-,;HJJn{~^*V:TWV:oaN@j-6JiJ"JnNGsA<'l";si\v]m Bw',X>k_^# p6NBJX@M'G.Wa7)vt7M 4pm2`l}A}$lKE`n/8/TADC+31 l3mf62;S ExLmn'(nfmO~@| Lo9fqHPWzeyUw3!,zT)aGnU*^7h `Dzm5I_hB$@5i1,=r~]W ssQ{ BklBr,Oufn 4TvZ1{ B% 00GME?uQ?D*KmmFL2QXEHy$>h}{=eVfl^zBau]:|iySNze0`1Xv1:BexQXE)jv,= uU hay:ba,tXOR<[O _X"WCMB",s { |cE\4 WFhsN {o|Lg/UJo(@cxlFy:xAf8%'J;~c|aJx'>//4>cOX)sx} AIC!Jh@ 4a K-HI</E4VwM9cl7i[^VrW_c'Fiwv5@VyJK*J72j #y\|/;UXc6[YBL6a@=0~ydKV|jSMvcwt04!.UL!\J { X L%)Zvre+{!vNMx(:h+;{ u:&6ZzTZ  !WbB`OE9xxAObS`0 Pr]iV4XXx#_Q}Y}:djct[~ix=w||k+%m&}<E,N^{++g{_l@]MNIM`Fj~_X b|=_[.t< K ^~H\I1ur~f lf^wEuvv+L0eh1,\[qER2WKS0% qtV24jwF9|\l~_c{0ALB^)rKvjsnuU]!l|g m0dt)Y|G[mJyvF.TI\T k/G=VzV&IwmI?R/vmJ@^ +h{D]+LHgGd POo`^`|;s[zG^ i_D3Eqm/5,ZVN)js}$W0J]AxTu&*.90- I; oDNd}7F<PG.?. AzsDhjPpEP@art)YMhMRhl2`s)_eQ: mbD_ {7xXx!{'rO|?:V=NYtHRy8[pGFav#6jwFU,zMjp4*::tW{^\GldG\AOdAWV&!Hi',tby_a_s 8YbN_x?4 oJd^)HcnH*YxR9F0oY~OQk?cCuLj T__Q. ^}DsjF7i:Yg3J4^FqSC|w*sBqs(}Fopx1O5[3) S|(aHXE;H+ a,3S#_+:mI(cd*f`AJcF^q0yCMsI6{b'RDoJ@Jx)5a;>b33X YjY`2@Y~Xo/{t74|jfz$9C?z]V}xZI*|\(H!G?[ G=t -`M#c9loz   !IwRqjXvc~NJ?["U?fib# j,!+gJkU)3'8< :jT>h0-`1>Qt2l%^u>5%IP"3)4 U|f3/`PPWyPzm&f7*3_ {{w[Z{n[aIRvf -0 ?q),|f9M~o5aZ+5( 9p4 Xe LjiZejco>}')kZm&)=sQqghgv ^p) #j9PYY<OYT[r's,hoQggz& kn" ,s+/kF/nJy@KHwl^F7Gqi=0HyoR]"!PsJ{S}O:v~K[|?9s"D4j"j8kR*:mM{Ph >hfQ%aM)iF.%nGv )#by ((#as/3%\j5;._]h5 (r!h$""e{ 6:r1UZS>p}R^ZFy n$C_kb\0Mr[sn~=v c^dcP3p/ =kI5s/'Z\mz8. f&AVGlJ@[z@"'$<&Z&I!6=t| J3 ,L?idm0sfW>eDi6]]+7ed%iMtuvWd 5AdvWu?nnOw!DnjF };3:-7Z/l>fsqZ/qBl5  >TqY>kVHodU;]Xag @J)H}nWn >rYUxO-3]2{M6.91$=u{<2-6<&1N ,\3.P?r M{!Y?A/=z/n^%fJLGIS] [:ZbX;bk=Wxpq}>cvy?XX]p-f@]ey :<w^0lR H:VT5fi)CpA_vwMo V:tcPteG6!-b'8-0:}EyK{dtQhve!|n\gV~|AsC&QjA5+.: @y?P~g4ysYLISTVINFOINAM teamgrabgISFT8Awave Studio v8.2, Copyright 1993, 2002 FMJ-Softwaresmpl<'<bbzflag-2.4.2+ds1/data/telelink.png000066400000000000000000000600501200563112200166660ustar00rootroot00000000000000PNG  IHDRL\ pHYs  ~tIME  wӡ IDATxLgs\וss#' H"Eɶj)[Wy]-Q#H 2:~xSL">^{}HpRZJey6t:Fc6f,nWR>8x< byN'IX\__WT$(R˥F+(dZ,nb_~ٳgȲzt:{{{~ Je0RښUTo޼Y.x'vwwwReVZT*Uh4NS/_v:o777pd2|>OM&Jb6**MSxJbt:BJhEFQ׏bK[[[VUb8T*o>˲,I|>7Ln{4 vm6t:Zd2P(,$ILn;FQVrT`0LrZFhtl6OSt:%I! tt:= <p8lx@ p}}rtX|~uut˥`fZv6Fϟ}zSv:VWWWVnG"kÑJ|>_VK&?`(buYCPVST.k8̊T*J"˲ZN|\.U*$IjZd4Gl6h4FNjZzjjN3Zv8NJ2vvv\.b1̓ Rvj咍Vu:bPٳgl6 dꓓnkZG~hd6ٕfy\f2p8\*A8盛jx<hTծK˫Zp\__O&~5Tv=Vk:~X,V%IeVx<&h4bf\ӱ5b0b?I˥t||^odi"^o6Ύ^jZv:eANvb8ŢV|>||'ϳ1|>T/d2L~_Q^g0vvvOOOu,jFjN&N[6`^o6v[$!Arl6TTVlB!t:u:fFv~?z^*T*vR-NzV EQzbjzdbX{ZRt:%5jimml6`0L& Z~t:X,gkkx<>L"HN$fpz=h0...DшFbQe8j5;bXh4^(" N[tv[_\\ R4 fәN:vw:D" Nh4zY>f|VylH$ b|>f^Ot:~x<$i8LןZ-Njq݋Ţu6d2h4(|,,jeHhTRZFn$`0 Y]..)۷PZ+,FZ\ÇlZnoo~_[[ zhL&JvzzzjX*߲~{{ p8, n^O&D"w|>jzxxP|{b(R6T*]jM&S<t: ^XVLPZVu6c^Op.JFbj5[(FQ^,Ēxl%Ifn'hәO>z:`0p\vvT*%IR2,;Nj^xj<x7np8@ FF^l6;BɔJ%EQjh4d2ux&`0XVh4C7<>>Z,F9vnX%lrYVk6vIZNpMeh曛 r ht\NȾf0r6Ue8dBlN!zVOn0fNhZ$R(\.]ݶlfSQlR `0n6BjiZ,;GǣVS,ˀl6vy,G"tZjX.6 x<(ljjz6RO>e~_,EfjRp8 FfqFc4vrJQsZ>FQVɓv=8e<b1_4mZ@\.GhRHNSrzXYFC7z>ɬV``2H  =< õ5V޴FY8{wwwvvJj^㯿QTVtz~>B!e0L&Sp-K,|XbT*^oERneYr9wgeXi0\.Je2xJ%&PjmmH5ͬV+P$I. * |`-.'Ze4*0-r\^VK(p8T*p8l N Zm~ZO&: zbX[.&X,sP< 9Sz51Wʲ 2L6vzIVEj5)j*.V,h`)u:]"( n; vd2Nx.T*QgV턋|n6OOOŢ$IwwwfYղfRmrZT*zٳ~GQtZWWWZ j\.AQh2{R:d2Br~=./_dMEl6M&lvݒ$L&x!>|TV^w}}T*IN].S(666 n݅ "{|}}-r2,9lcF`0jF=J+^-tppr*p@n7g2bC@vw\|68HT*px_TZnoZv8zH$rssU*(U* tm6`!u},Z`-6J 0:wl2z(\h4tJgacM1`qv^%kZh4h4|x\*lRSɄ$Z.Jr -VzV^ГT*ajvNvh4$Fx<^(| CZPQb0`(kvp8L$VKQT*E>F={(NZ`V9N)Y*h4-pZxs^3LL&Zv1Xt.zjÈTGHZhjzrrfۃ5"{>.<{p\j&$I\n{{;f3E#HF-t(&&Iل#UuEed2Q9FT*\7Pd2WZ"p2^ZI_-/V i4,) IDIޅvKpVe08^n' d| yFRfZ$,Jjv6.ˇb󑣈|E%(J(e@H$p8,2v{:~Fzdju(2VΙGϧnnnE!j`@)%IZ,:h4ZnV3 qRN䈛fZ/ ٳg^Je6?~8Ed2z|>'Ep8d2>a=)O0H$r{{l6AдV+`}FHZ(MP(~JDfhZ>EQNcxcIJ|>'ffI O wݓd2%o߂P ]f"k^G`fIz[.o߾"Bu^p8*0v`08<<} Hϓ!2fရ٬^fl&IJ;>|Ɗ@QF|fi7660$u]SVSbH`T9zh4:mx@(6 hOk4h4L&S!<iJln].h4p2Iov0.+ 脋 azvaOl6GdRV'If$Yٿ,7MRBZz?d2^jZpw}vWWW%jr?}2w<-^dc9˞zym~d2 CџB%+2Lz'Oz/JshccX.h<{hz=V ( -l6-z#=Тb1 !9G>}2*臨T*[[[Fcoot:Q$tFxf9v`k̫r8\fjFClZM!?L̓MX,l6&)…\m4)$miRh4z=>8h\B-R}(~W0dSrB VSTp)mZn}(xU*t^\\.P(v j }[af鼳؋p`0x~(Rp6 lvggBh$T*p8,JX,Y^fjh2Z>k*n߇mLznX1nIvv= ZV0D%:c\f~&M6F,w^h4ZVE7t G%FFZFBTTh4: vۥ\.ͦv x>ZR)8,xGa24fݥey{{{$Ib( Z-TvQcf3s$ ..&(n;uX"p84^1@R9::fBAьjzcbv8||>_*1@ӉFR2t:hB$ߏBs\4 CPh6Hd<jfRFc6 N=(l%G ٌڐ'qxDO#j4'Op$^a{{T*!MCjDDh|Pjϴxf%oS?N&(2"Ə?Cx\8gj4 ge$BD zS†tzzJo6q:( FçOvww[Ɔ刀E{S m6[*vb<f3ށF7$x<YR!C=O2tM& ]&m^2g][[VGGGfK$; =p Zm h4@@l,NXV8mr#A.dP|f3L^hnk4ժj RRY__RGCWκq @ 4t]]]=}T___VB@!X\zvpB8>>8V+ۭRh!@Zatpݠ`sݱXt Nj/hBPnjb1vn( א?`\ *xL?BHbtZZ__VR&6#/p\~U%EQh*2 rI q:/_fD"St:Ҍq8VdY.n7!T*Af6Fۭh`z>\nE0(4[:6m}}NZTE c,m8qbhiZj@,ҫW8TaPw:w:~NxNh4~D$T*\.a<%@PVqR޳o޼yjV 7ot]rfd⃳Ԙt8d8rdbmnnfzN&“鵂[P9iٹfl6omm V! "([__o4nwwwWכL&;ŒdDӊdټRisss4޶{(nh4e zB& Ksk Ahloo|>7ȡ)q6l>g={| 6jכfJDDtDK`t:Af/_D2ϖtBn inw:F Cr 9 IDATe<O&ٰ@[QNz Xlx< ߃DG/b2Z-ᐾKp8lti5hۿ[J&gZB*rz^e$g65L_Lnv@ɤR$WhP( ״Zm.fG^Ājb2IhZQ JR8X 2kMk'  6j|>KBCW@ 0L6^N-:N"BAK!FڠLX,bQ8}"pVlL&c0~ *`c~?én[[[fF!v~BքӨY,H$ 4L#bp\>}Z__d2x^GHNrzL&셄I&t YD, 0A"6F(pl6+JT/CkZ$ER*`JL&Sr">N~_.yvݮ 炀C{"PF^9WՙLFyxxbՊh4 , $xf᫫+(Frr 0 eq$* 'v\.rZb駟  KS[.Ϟ=m6jq(M 2RL&`bUf-Sf*[!(S,=g>::lZ1LbG@ }7l:4{ၸwwG\BTFA1͏X@K0Z HK 2 <2Ԉ< FCQov:n?꽽v xKٰh4X}) N >|XZV&v7Mbh4px<>>hh D$]~y@X,V.&=Vp4-KݾWՀITw|zwxM*ڙ&Ȏ6e9WHJrh~"\"պH$677a^srr@V#Ba Ppӊ^ɀσ_ ؟t`H)Oh6;}45AiccO?d69sbd>>>`ϟ1QTL&:N\eX,ȒeYzE #܅BT*Eu6}嗹\ T ' ,$C(>BѴmlbXɊhEIZ?oIhr?iwJ%O|\t=/x<fwwtATH|ttT۷o<<s nnnڣx~vXb#TnTɓ'0USJ7B$d)I>hZ؀ngl6fD>[8N>ӧOIT*F#B߿1&[0^7 oߞ rݗăP(4Nonn4 <@_|~^xss3Jl61P}NS48|j)O`K╀HY1ͦvBpxt<?{VĨ^HX,~ߟf8 +0)xr=>>2A~oX7oEQP(Dvɢ:P:v8hCb@QgmT&ikk+NKVG~B(h(Yz мai6돎!nD"Q`/I$Vnnn?C.H IbjW&Ah< s``0~$DQL?H\ W_}EmDf;`0X*^~ &mgE6fu9=dIDkZj$`FӑQa4M<o6/_DsכNOTr8ft: =;˅ϛv+ {6AAci8Øq"ƒ7H"E9::BGQ9"SXI ~94-XVl_ED"HVa_ b1&js6/Z(nE{LO݂>!$޼yz>pT*ul6NFbVg)0f2o*JNܩT\.֯zBxL'<Ȋ< HK!~DW Jb gIkkkfիWBE j޽{H$Ԥ,?-:b(w)2$!>&^b'GC| X,M8YQ32 dHZH䧟~o* g6vg$I B"Eff!)D":pLJ$`0Q"r?~ċIV^bA€ f?1...B~-Z-0^i^LFX, #Zva8²P\Lt:ϟ?߼ySׅ(VBdi˵o0ɤʱX,f1@v  KVs8WWWF9zn< }6V*<Jı\.766߄P(@aq\L?%:2i?b!ealk ᗗ FtpZW2LSJI[ͅP jvtJ8tts3) 1 F<^ZBLA?f?6`mmVAX&_4OOO߽{g0J.ИzJ4@blllD"|>Ocq8V T[T核_-1>Qdf39xV=_Fo<cisfn _~4{Rp8Av$dh,;bOK$(_\\@ 8C ;DlJ].ONNJR(bx2'M# b}G0<99T*[@fVb#۟@^S'Պ:}TU@:\,a=|>xx`* +E=<'p")Tpa_1jx<9L;YBH DX0Bgggv uMnG;:X6=t:R nll=vχ!P!aӌb^p(bv/p~EQ*A9-@ 5$@Օu e;Dy9 p\r>"XVF/|>J_fRja)b$@Q(i-|>: `h>' Jϟ?CaL&=Aj/泑>X(JϞ=SF51rH( p RzXx9.l7j*Ϋ+߿GJr\*h4\V,K$d`0mN}oo~`lYRILV"mB@6b8Ȗ'<  ^ ,1щD^,X|~pp\.1wHM * xn1H<1˦Hq9+|=4 V8fӭ8?Rg`믙B@5Ryuu X֫p@/dd?}ds3!Hgu~||dXLIRąDL 6p{HF$$,%GA Yy^?" {Az6jӧhoo 8"L1t4aw8<<|`aezx\HV$b4v, }419)1P@O GX&)1DFC1@L}|p$dơeRiͯ.˭VU&4M~"Z7o0Y.4}N6>N.%33aa{<\.7Qʲ,ABL8xO- X @ D0CPwI:h4ұc1XB PLA’<2dewwT*QPWC#:5F ‘+Gf%ᇵ]z=&CH$QK/"f@ V}ȏr ɴZX,&fрp(&:FQLE >m9@cv8+J@q aСv׷]tr9޴lHhI~ Rk 7v8pwwZ-8ׯ_aEq 8jlZtLfF#?@e.+LbldT>F `6Y^rx&) "t>o003@҄6K"}ٱ"eaۍ:I(`~h!d q2x)\&8pPL}z?H*3!/7fs"@'H sbf f3FD\c/I #(Pdt[[[2 .ױ2i4ZkWZש(!D>t.//9bh꭭-&8:<48:RbJ( ]0|Tx'''$FBz4#61~0rCB=ϾPD"Y\HִZ-z-%IqO?UL& *E5`62G!o}ZEQ>oiыQk~VdeSVKs\6 7ZEP(tœ(BzwwG H)뙝L.pMK,:3-nXK: CVK}M X,%Od%1Z#>I"h,4~9ݝp2pqWclll@}Et "&#tJ0$T4x#I%jZKE"Ƭa؂Eu b}S(pf咚\,7&z4!Tz||0i.C#H!Cv]?Zk?s~'Jqܫ- #N %ew`1ht~w66|fᛃ=>>Ɩ j0K ^\7bdVw0Me[PrO[%t}}-na]JނPXQF;'CB  fJ͌X,~|l8Rlvtt3=2ֻw*x(6yn`0`c&14^&%zAłNv^1eҸɍFcPH$bSRIEr hLHgggYc A̰QdY &Xn(ak#%}MBuQbt:(f1D\jEgV xx %E/#Sޢ(eKx<&j#bF;MTx<`oZ8mM0(9p`*th4k+B-g`DÒLtb:ał|,9CqI)XU +z>}@_'s5J" lll"pkγiOS!Vb5ĥ$r:~||DiX...J0qdժPqs'80=j`$dY/6b' 벻˧bJ$Db ``x$n  Vdl­hḸnZ].]ԢC*-bwwmAt`arV]++!0FjR\2ۊC?I! Ip7LfYB9UdbIMcO( $@ZCD@4ف2t:@S#H$JGkooO h>!zlI~6d&= *C H`>>>>}RD"wށ&%fq(SetK2`0@_*--mBNj\\\aoذ5d Z`eZ-tĴF D޼y#0.i=c^O$xEtHg&>{B˗~db0___S $}b7@%pi)l0"g!;IpvQR1jf_},(m6[RaoQ:dEQ^z$9VK0v>}BD`r AHG'MB @h w8kkk<17 9#Obmm۷@:F Om7|Kooo'B\ <O? TV#y^8R?N5̐Mƨ\.g &+ /y^ #;ᰖJ%nUvQBxT$0It.`h\T<3yF~cc@L+9K0=:@KR}EQ^xa0noo0<͛#%o^ARdH1FSaGuPTQ,onnC`z<j~?ooo7bH\z#"0. &MlkkkNGwIjpf'FC8E`!}"#n "1iJ7]7qYz^Ws_5֌|L,pP(t]l-\ u3v8h С4#j^#Q#P0XR&#;881&O>e|CaP:FBjz/:BFl6HNpBmLe1eNE$r~G͂10βjq 3l(0y",|m'!8p~ZlF?1Ea'))Q04oQLK|2HD>ZQrK[ `Phcc#ɼ~Z|Zf) KGy<erC^Aa kkkJ嫯F;;;fD"aggR-1EYV pN.cd<zNOܬf]]]ҷ`OGK6-;NP@pJ`6e⮵rqa5?x<>o6~J,c"c<_]]gl>>>sq5sY: Lj)Y `:"31>///Kj]0O@s>2@A""t$I2#T0H!v;@LK!3 fHMr-kooF! ,1ZQ!B->-m.!$?ic-^30.H$a4#EO3vi#O&۴Rd4`>P3E FF53LA0|>bc4KD?COs-\T&Dn6؁CXXa0#+H0 @D"!za-h ÃlCT, 3 $qu yz^nФ&+㭩'_wvvEyW_}EN4@Ҷ哋 I)Ffud}84fkccAH: RiAas/ p'1&Y~hmG|'{ EY3 csB^AEdd,Q23;^z O:~!8NfʈwtF k/apt:d2JĈU9MXit49sc?L8 K`0Pj5u:DmJ dx< ֘TYKf.cD9<s2RttNȭ)E`0P(\.bp;UI岨ɡ9Asy SI881 F^__3՗F'BFbDZ|lz*NgggRrh/X.+4N5dr0~Zp`B3V.V?p8hnkBJz/S N?S[V1"g 8>>~4d=Ё u`RP"qƥbdZy1.a ɅSg}}ppO^zExvLJ<Ǐh4gt:DP(믿敀NaϡSؘhķ'6B1f+ GMb%;88x<`m"&c"w Ftۨޙ g]~F"w /Ft>}%fONN2 38t:-$ыaYP0r2a2a&`܉^;jRIL}~) RzfOeür&h36a,w&b.ZJ"@n; k#Ku'O @PM/ @J1m[ndYh#֕ ~,XbDj,؞^@C2tOJ&www\Giᱻd*\.h]"ѹPѐ `08::|o>~hPf"ϗd`Gd>'0t:H$BlÌRMSZW5DTM@Z$Nևt'wiKl8HUpD8Ї_goik}]nvV,˔Zpv $þ[=hl6\0Kmd60"c.Ƭ pb---mmmcuqqA/vCdqxJd2 T#_0ZqerA3[)‹z-f"ruuAlEw:7oސF 4JzqW*ł8x< !u\T2͐8^zE # @@Ve2F@㱪Eё!&y󆏍ҏKdPSAok#j<SRurH$<R☏G+T|?,|_~eV#UE*i4@ dͦ`Vz˗/L"L:'ɦ4Of eYZ |Նh,p8@T Ub:^T@рȏB:RD}fǧLӰi7///_ UU酰1 TJ&j5Zχw5 FT*FX4@be8yv')Q)WU4SF"(qFtZQd2=˲l62(`´v}Dh[[[;:Ǒ*FIPx'Tg0 tbOklNUUoED"vah483n_YYAvh> #5d2IS٤Nz?d"W.K؉0[666EI$nnn2z=@XMטq￧R)UUJ[DFҘӪ@1 r .dtm@$ ©H$#rrV68iozh4]nGPl ^z2c (X7@z*f3Fb"0> F/t{{?:b+b=Ɖ]94p @}WVV` 8>r/_TU(i9Fi'j$Pk`j"=kF:::{ӄ5"hFmwwv$ܤ<F#tV8熼0iI.C iz8Ͻ^/fwqq }ֆal6À~Q<ƢLɄR (*%v xEq |x;;Ub%Ol0<&TJB@պA^DQLBقQa$ǙLX,j9B l6X,Ȳ P4?N}\\\|;L3N PF?ӹNJ 9`PnySMt"oQN- pᨲ}d&LD- @y\.=\,&Qp- 1[[[^ 0#T*^^^q6UUNf}J{<i(QެhOFBP:T*Zx:"#.U@i{2QIRBfv ///hG{]ιCR\cDl5ͻ^GSlBe@mɟTF s/f~4y޿;JJ%Rzsd7 ,ˌ@:nkk[e6W@V[fgt:xfm6[0\[[{%<I n ]^z^φj|\`P 9p8N,ё`P@W N.6$r9O>q@!Lm4gk8F#Mb/!r!k~^/@qV/^`,&Nl\W+D2V+j`޳3V@A=pDC!DjF766$'Zf5-lYfa*YOhabR4F w:`0xpp0LHF6Lقw%_N7nX0%D  5`0i4l6 GrJ?77X,z>+ºvHh4H$`!<==F( -Fӡ{///iTsEg.1ϧ( 5r)Z6,^}N &= 6;LOSⰶaV*Uhl=t{{ ^W>hBk5eAE`{:p p: 9)06QVKӧOtGlwQUUEP#eV fL&I6_ξhÖ" & R)KNj9PGJ!1zNj^AF`8 p:L FDP"k{OoZ''' J Jݾ ~7kvPnv٫J%LrʲX,υZ*>22NNAA}}eeooPP44 ' ' bb77ssuu88NN8 8 + +  JJZZMM ** }}   "" qq??gg``oo$$oo88 ^^..jjU U FFJJxxk k TT))77AAFFFF ? ?11 ϊۙۙ[[ss==WWkckcffVcVcUU@@''p p ˱˱ttCCFF44FFFFQQtStSLLM>M>~)~)eeJJ%%ܝ\\ qq##^^BB//``kkޤݤݼ߼77; ; $$''&&$$ JJd d $$ٺϤɤǃʃʎю$$[[:$:$h/h/6688=5=5,, vv((((OO77{{ކ--n n 00$$B+B+++&&||= = ll88ڄ  ,,77{={=>>=9=9 . .ɮFFVVkk##!1!1JJM[M[{b{b{^{^OOh8h8ߦ;;PP77]]((;=;=LLTTUU5N5N==&&  WWZZooqqپپaa˳ݳii""\.\.c:c:FFNNQQ|L|Lx?x?z,z,GG>> }}[[VV$$22););<<66>)>);;ڇ͇IIbbJ)J)-7-7>>==55A(A(   ֊ˊ˩ȩΰܰ  kkTTqq}} }} cc----55  ZZ__k k ]]&&QQ..11::   ++3377t7t7q3q3++Q!Q!##ޑމ҉aa..KKyy))8-8-l)l)bb??GGzz//==FFCGCGAA55##6 6 `` 22zzإإ׸0<0<$U$Uccff:a:aTTMAMA))  YYܮǮ𺫷??;;>>$$j1j199<<5:5:33~+~+L"L"55{{ jj܏؏أգՖՖٳXX} } %%007788227'7'%%ٝGGŨhh22JJΉzz88kNkN[[^^VV8F8F..xxXXѫѫ̟, , ''//44{5{5p2p2++!!aa# # jjMMUUdd {{ ))--|-|-((  33>>!!ە֕22GG33II^^ssn)n)00119,9,?!?!ccnn)1)1==@@};};..ppͶrrff}}PP!!;;qPqP[[p\p\SSAA)) WW]]˃NN%%??55.#.#x>x>yQyQZZd[d[SSfFfFG4G4 ї RR SS  u u **P/P/Z/Z/,,F&F&\\55;;ۣccYY55 ;;""K$K$##d!d!gg??44RRxxoo::..&#&#''((B#B#99>>%%ddmmuu``t.t.99AABBx>x>33"" KK$$ϚϚ&&rrzzU&U&..V0V0W+W+RRӎȎ~~XXǧϧωۉ;; 331 1 ց**̜МЩ٩&& <<%%!!@@vvccYYڶڶ&&^^;;QQ44TT  hhff@@c c F F ))o/o///++$$  $$FFً՟ٟ[[  %%A)A)'' OOՆކ  !!11==BB??55&&##ƏϏ))22# # 8!8!77XMXM]]ddHfHf``PP88hh޿ÿLL ÛÛff..NN""':':LLYY^^T\T\4S4SEE77))xxCC44''؟̟̏YY::†€؀//HH?[?[dd`f`feeccZZLL99vvpp99XX RR::ʝmm % %C4C4>> E EzFzFCC@=@=44++"">>W W YYUUPPQQ!!WWƉۉ11JJ[[cceeeecdcdaaXXmImI33  qq%%??XX**rrέΒUU;;$$//::EENNVV[[$\$\oWoWMM@@11!!GG))YYNNvv00EEUUw`w`TeTeeeGeGeaaWWII55\\݊bbϳϳ,,ЬЪ %%U2U2;>;>IISS{\{\0b0b c c]]QQ@@W+W+''܃ܠà``ҠҠ™™DDōřܙ܆ VV/2/2BBQQ\\cceecc\\5Q5QCACA--55  xxß --FFVV( ( ''55BBNNfYfYNaNaddaaXXJJ7777 " " KK޲ɲ66!!񚏠33NNӏS#S#00;;DDDKDKNNMMHHIBIBh9h9k.k.!!mmAAܚܻлȼȼOOTTll•UU((yy..!!..;;@H@HRRRZRZk]k]0[0[XSXSqFqFy5y5]!]!& & ܛ??jj]];;4%4%K2K2<<7D7DHHkJkJIIFFzAzA99//]$]$  \ \ MMԆttLj޴޴XXXX7 7 \-\-;;(H(HARARXXo[o[XXeQeQqEqE 6 6$$YYגƋ==˳˳>>^^&&111:1:c?c?kAkA@@>>J;J;66"0"0''^^ߥѥVV44%%FFDD//ɻɻ˨HHݎ''99cJcJWWJ`J`ccaaZZNN>>++ڈȈ{{KKҟҟ;;RRCCDD77## 0 0Q:Q:BB=I=IMMPPPPOOJJbCbC[9[9i,i, ((˃uu $$wwFFtt`` J$J$;;NN1[1[bbeeBeBe-d-d``YYLL;;''''UUʶ!!ߤߤ,,QQLLyy--X.X.v;v;EEMMZQZQ2S2SSSPP4K4KBB66w(w(  rr **xxLLWWSSA(A(-7-7CCLLQQQQLLCCL8L8**++ ߀Ҁuu66JJ$$MM##%0%0::BBvHvH0L0L N NMMJJDD ; ;..!!ޫޫ mmHHaa˛SS  /2/2|B|BOOYY``dd~e~egbgbZZ(L(L99$$##}};;쳡zz˧˧jjvv q"q"55WGWGUU0^0^bbddCdCdaa\\QQ9C9C11 Ԓppee==;;w/w/fBfBQQR[R[aa e eeeccu]u]RRRRBB / /]]TT99ͩͩřřʨʨXXːnn>>%%55CCLLIQIQPPKKBB77**YY򱸩ݤݤ OO__oo99 %%..77>>EEKKMM>>> ~/~/x?x?MMWW^^bb``[[QQDD44##MMKKޭiiͨͨxxAA!!MM$$33??:H:HLLMM|K|KFF??66,,ggTT 33))XXll F/F/A;A;CCHH J JHHDD#=#=E1E1!!ww33<<\\ll<>e,e,ooܡܚ˚ļļcc""ġġΛޛllFFA.A.&<&>00ʯʯ ĚĚ ŚŚzz''Ӻ??qq33FFUU``ffeei_i_RR@@++zz""99..\\ 44,','33<>DDGG?G?GCC==@4@4))HHvvbbՏɏQQJJ ƮƮȘȥڥaa + +>>NN[[bbcc \ \'O'O==%)%)88 rr""..wwnnPP̞UUn n ""66EGEG U U<_<_ieie,g,gAdAd[[MM::##j j kkccЛЛݢݢ uu@@؁ , ,\<\>++II  ؁āԲԲkkCCxx99;;Ȼ߻!! * *j?j?YQYQ^^ddffffdd^^PP??,,  99<<лĻSSMMff==̪ ++;;KKYYbb/f/feed^d^3Q3QM?M?**~~]]±uuSS$$ž< < f!f!R5R5FFhThT/]/]T_T_rZrZOOo@o@.. TTۼŷִִWWооTT33DDs$s$6464BBOO_Y_Y^^]]:W:W0K0K::''OOUU**``ŽŽ//dd++==LL-V-Vj[j[[[VVMM>ss@@T1T1DDSS]]``]]TTxFxF"5"5Y"Y"xx@@οʿɓɓɟ˟˸θΐҐOOH H  * *55HAHAJJ=Q=QRR6N6NCCU4U4n!n! nn77::jjɛɛϐϞ@@++==LL7W7W[[=Y=YOO A A..uu܎ӎ[[99UUmm%% wwO&O&A1A1;;DD`J`J+L+LAIAIAAk6k6''88޿ ;ttޣޣ33uuxx**::-I-IMUMU^^BdBdeenbnbYYKK99$$) ) ٫ppհհHH11ݙݙ99ə))r=r=MMZZbb]>]ccIfIfcc[[KK77 ֌ѮѮġġĚĚ혵rrwwϊ0099C%C%h5h5BBMM(T(TUU^R^RJJ7@7@33%%^^rr۩LLII77إإxx鿷зgg:#:#55GG1V1Vaaeedd]]OO<<''ddssff]]ffǞߞ+(+(<>aa mm%%++e/e/00I.I.](](rrFFkk//4499Ⱦپٴtt&&8888FFPPTTQQWIWIt?>?**pp99ѽѲ66UU55bbԢԿ55jHjHLWLWDaDa f fee^^QQq?q?Z(Z(WWffnn옚77xxiiҀ$$11 ; ;r@r@oBoBAA<<,5,5**dd͇Ň""ƦttҼ``>>!!9191>>HHPNPN0N0NGG;;))AA%%ү]],,kkLJrrڍ22,&,&A6A6EDEDOOUUGWGWTT,L,L7@7@00 ӫūkk 22rr!!11>>HHNNgOgO`K`K#C#C77**HH ==ׅǘ˜[[oo©yyǢϢ**}}##~7~75I5IWWbbff}d}d\\KK\5\5@@GGttĜĜcc""ررcc{{++F?F?MMUUYYXXRRII;;**XXȟ55̀vvYYJJ  s)s)q4q4<>AA@@;;J3J3M'M'UUccͯΠΠ66``͠NN$$88VKVKKZKZccff a aUUEE22VV  [[ݟɟɪzz[[99Ę99<<..g?g?kLkLTTeWeWSSII0;0;)),,AA٢LLWWTTûÕ͕00ڃ''%%!6!6EE"S"S \ \__K[K[5Q5QrArA2-2-HHccǒUU''ϚϚll>>Օ +#+#88IIUU4[4[YYQQ_D_D33!!!!FF!!KKϦҦҠ֠77RR>>a a RR""k.k.2929AAGGIIWGWG??33##ِXXddddVVgg33CC))<f>fccYYGG0000ffӣȳȳ: : %%33@@LLsSsSpUpUQQoFoF66 # # 22˽ !!ͩͩKK,,ŮԮHH88\ \ UU%"%"%%Z)Z)--Y2Y266::v>׾޾OO114455oo޳ճjjVV33AAKKOO))99CCEE@@44!! vv!!YYƞƞggcc6622^H^H}X}X__$]$]PP<h>**!!++ɒQQ::~~z0z0HH4[4[yeyehfhf\\II//Ң$$ߴߴΗ''8 8 77IISSLTLTJJ99,#,# ףģ [[ʐʪݪ00((x0x011[,[,p p }}hhNNxx||44MM__ffeebbYWYWBBD'D'SSRR˞˞MMWWjj''9 9 -'-'X>X>lQlQ^^eeeeS]S]pMpM77׭ss$$³³QQȔ..ddXX++ XXWW``--;;DD_H_HEE<<..EEʀ??MM'' ''??ySySN`N`zfzfff__QQ}>}>'' --؅~~ԢԢ}};;٭%%4'4'E2E2t8t88833**||T T ==m m ! ! NN00ʡ͵͵IIqq  *$*$::oNoN\\jdjdee``!V!VEE..RRPPzzǛǛʒʵ$$55QBQB]I]IpIpIBB66((IIh h mmOOpp&&22BBۄ܄33xx55//9@9@NNXX![![UUII66 .. ֠ddޭޭɠɠ22ܚܚzz[[iicc%%77.F.FOOlRlRMMBBM3M3!!ݎhhZZFF''88## //!!"""/"/;;oDoD`I`I]H]H@@}3}3!!  !!rrOOAAޤޤwwbb V!V!44 F F\S\S_Z_ZYYQQKCKC11^^**ϭʭʽʽʷηΖՖDDޢ;;%%uutt))NN:&:&%2%2;;AA@@::// MMQQ ddEEםם^^hh22fFfFUU____tXtXII3636k k g g wwPPۺۺII""DD CC ..__22$$&$&$W.W.559966//""~~կ((ΜΜ>>ά??@@>>-.-.9A9A6P6PYY\\WWLL < < ) )OO##ߪ٬׬ؿܿjj&&KKEEoo--::FFNNRRQQJJo>o>d,d,||wwww,,//πmm~*~*K;K;HHPPSS`N`NmCmC'4'4""88yyzzkk550044KKuuбѱѴ״eemmJJ%%g8g8:J:JPYPY'c'cee__RRh?h?a(a(  QQɯɯΚΚ66--{{++//~<~>WW__śśkk33OOڏ  --a:a:BBFF D D==22G&G&\\kkZZCCddxxaa]]<<zzێkkHHHH''L8L8cGcGSS3[3[ ] ]XXMM>>++XX%%))秡ѶѶ(())9393:: ? ?4@4@L>L>9933,,%%NN\\AA``UU''ۃՃGG55ɯȯʗϗ""X.X.m8m8@@)F)FHH]H]H'D'DS>440(0(>> ՜ppggÙbbJJ++``gg) ) ((66DDQQZZ``bb``YYgNgN??,,ݷͨǶǶPPqqÏÜќBB""@@((&&11;;CCIILLLL)K)KIHIHCC>>@6@6,,!!..סǢ==&&VV::44((77:C:CIIKKHHBB : :O/O/ # #L L ::JJݲղddŭŭխխss**gg''44??GGLLqMqMEJEJjCjC99--7 7 LLii""ssXXռռииȷȷ--ssÓϓww!!G G KKi"i"..{9{9$A$ADD(D(D@@}9}9.1.1''22hh..nnllll~~GG((޽ޱܱ܅݅==88GGff%%a6a6CCLLQQSS?S?SOOGG::))zz[[YYéé..|| & &::jLjLYYaaddee2e2eYcYcs^s^TTDEDEJ1J1ԱԱǜǜllͥͥqqrraaAA((N8N8EEQQ Z Zl^l^]]XXbMbM>>i.i.88  00ֻû@@ooEEwwMMѝѝťťoo & &44>>2E2E)F)FAA99//$$I I qqߚߕ||@@UUpp77??DDYY""OO++^"^"&&u'u'$$jj kkNNݟٟ((0033ДҔڐKKII@@KK%%?0?0I9I9@@CC\C\C>>66**  3 3 ))ܥ88||33ee޻޻NJ==''66CCNN(X(Xp_p_UcUcbb]]ySySDD22rr77將ll혀ȢȢ!!&& }'}'>> Q Q]]XdXd:f:fccI]I]RRBB--,,55ԗOO߲߲AA''ǪǬڬ8811**::HHTTO]O]aa a aeZeZYNYN==_*_*tt hh__||**ooll//BBRR3^3^ccebebQ[Q[POPO??,,vv LLBB::VVК""6688~(~(B8B8FFDRDRNZNZ]]]]ZZHRHRDD33) ) M M !!yywwVVUU--FFbb))b9b9GGWSWSFZFZ{[{[VVLLr>r>--L L SSדʊ@@ԼԼǿZZ77% % +)+)77wDwDNNFSFSiSiS4N4NCC55b$b$%%UU__4488AA??ȷ׷%%11::??@@==t7t7%/%/H%H%//66ڕ--yy<U>U)W)WRRHH::((uuRRcc߫߫ww--$$XXKK''77CCLL4Q4QPPJJG@G@22!!!!ַ֡ŷgg;;$$ -- ; ;0D0DHHGGQBQB88w+w+(( WW}} ::mmяُّPPSS$$//996B6B#G#GFF??I3I3V"V"VVΓppYYǮ߮z/z/EEUUaa2g2gff``SSH@H@a(a(CCۤۤ{{mm -- ##88KK[[ccffff__PP+=+=&&5 5 AAiiYY$$ ==ִִ,,nnkk%%;;NNM[M[icicafafccK[K[0L0L6622mm??$$dd˝˝JJ33!!::aNaN[[.c.cwfwf@f@faaVVTETE..EEϔ 88..77;;džnn//4E4EUUraraggff``TT??''@@MMiiȰppUU""??rr==2)2)O5O5==.B.BBBk?k?j9j911((AAK K IIvvHH00ŹŹqqBBKK//CC&T&T^^aa@\@\OO==((  33ΧΕ11}}]]ۃ77==(( 2 288C8>IIQQ+U+USS$M$MAA22 22ݲDz ⦟pp}}ړk k 44DDCPCPUU}T}TLL??//Q Q OOff٫ٍ΍==:: ˂҂LL@@DD ff!!ww33 8 8 Z Z WW__<<^ ^   RR  tthh..??T T YY~~$$)),,F-F-**%%BB##۱αΙęĖgg--ʺ88כ%%%)%)::JJVVF]F]\\TTFF11ZZ,,tṭ!!Z"Z"33BB6M6MQTQTVVTT|M|MRBRB33E"E"  сіrr44kkZZ!!ԷGG\\W*W*??9R9RE_E_ee!g!g`c`cXZXZ)L)Lh8h8vv$$\\ŝWWśśˤˤɎ++l@l@QQ]]ycycaaDXDX&I&I55 jj{{{{UU77 __CC''DD֧DDA-A-'A'AQQ,^,^zeze%g%gFbFbVV|E|E00::ZZkk}}ЙЙjj33 ҇..LALAPP\\``^^zSzSCC//44ߜ@@}}JJ &&55Οڟ!!DD 55 ##<$<$7$7$""22DD ll''ܹԹ\\77ww$$;);)T*T*((""55DDVV""^^ttB B NN88 TTUUyy## NN""SS! ! vv{{__::bb--jj!!   ]] 3 3 77  cc44''qqrr{{ UU==R R  ""ggff   \\33qq 66??CC ??55xxjjmm<<\\ vvggWWww]]''qq < <   DD44 ==88n n PP33}} 99&& eeQQmm//ww GGDD[[BB,,AAnn@@ ee))  qq99 AAeett ##a$a$z"z"@@rrA A 0066ddss  KK))WWkk--66ii77ff  hho&o&33R=R=+B+BzAzA_;_;00&#&#VV++ӲͲ͍ʍʍʍʤͤ__ێgg__ ;;qq!!>)>);/;/2233 2 2v-v-&&::\\88||ГJJ򮯰vvЗjj&&9494@@HHLLMMIIAA66k(k(PPmmʿʿccbbTTzziill00GGXXbbWfWfeeIbIbZZMM99U!U!iiSSjjә]]Ԟ77JJYYCcCc g gEfEfbbYYPHPH22mmϿϓgg0044\\]]  ""55GGVV3a3aee}c}cZZLLi:i:%%ў~~zz''--śśɤɤqq00tt&,&,mBmBTT``ffffcc*[*[KKl5l5||))ɪޚޚ>>""kk)) ; ;GGnPnPSSPPYHYH::**mmAAٶ̶ɻɻ ĮϮNN &&22<> , ,##EE~~00ۿʿ))]]سسѾѾ ``LL[[LL$$))s+s+**''##}}GGuus s ZZbb""WW __AAWWz z F(F(0055|8|8`7`711 ( (oo/ / zzGG̸̸^^ննÚ##IIFF@&@&Y7Y7DDcLcLLLEE88F%F%RRkkccrr'' XX33EE|R|RWWSSGGU4U4$$QQ__==ccaa``**oAoASS``ffeeA]A]LL44ggݓēƯƯ]]99멞ք־YYN2N2MDMD)R)ReZeZi\i\*W*W,K,K_:_:)&)&FFԥı~~mm ~~""))..00004.4.))""EE--##iiMM//((99@@bbEETT<< QQ $$^&^&;';'%%""__  <<AAԃɃɜjjbb d d O3O3DDQQXXrXrXOO^@^@++<<ȀXXܮܮĀII88>88 - -DDٵIIґΑ""Ԥܤ))^^v v --^!^!T$T$$$##RRjjڐܐܯbb66* * qqcc~~eekk\\00  ``22FFOO++[5[5HHKYKYpdpdffYeYe``!T!T@@1)1)ll֋SSייdd00ԡccww  44GGXX)d)dffccYYEE,,66ooaaё22~~֪֪TT5566ޛ%%1199==;;z5z5|+|+vv??ii 44]]GGmmީIISS??''c0c05566~2~2))II))&&jj44ծͮXX́ҁBB܍KKZZ  OOaass55 VV::vvFF..{{nn..~~ޕ۞ڞ{{SS""00W=W=qFqF.J.JGG,@,@*4*4C%C%  ӷȁSSņІЋދ66 ,!,!''++++Y(Y(N"N"jj WW~~!!}} X X # # 77hhYYeeƾ‚hhɮծooTT$+$+ = ='M'MXX\\XXLLg;g;&&||ܩܩQQ$$mmZZqqMMII t3t3CCPPYY[[WWKK_;_;((ѳųŮ** ,,dd"" %%**..112222r/r/L)L)& & %%77((NNþ¾ǁс[[ ''1313C:C:;;&7&7x-x-  4400``..22QQCC&&88ZFZFMMLLDDP4P4[ [ I I ۰uu22~~mm͎44KK~\~\tdtdCfCfSeSe\\KK6677::ppwwοΕ[[]]l%l%66EEQQXXZZVV> - -yyOOAAppȗȲȲ~~--ȗڗ""yy[([(88DD^L^LMNMNII??v1v1P P ''kk܈~~vvrr//vvffA)A)22}:}:??BBBB@@;;33(( ppQQ̖77 OO88KKggӳJJP+P+??yPyP\\ddYeYei`i`TTBBy+y+rr""ZZ՛՛SS!!..]]9 9 //::@@1A1A;;I2I2%%X X ==UURR]]WW L L KKSSrrookkYYxx]]"'"'..P2P2{3{3;1;1++"" ccMMӂ͂FFhhCCGGCCY Y OO{{zz } } RR8866EEPP[[!!''ؘژ**__9 9 dd0 0 o%o%R)R)]+]+H+H+9)9)%% ==m m  {{''&&ȟƟ%%eepp``||G G ``))55z?z?JFJFUJUJMKMKHH`A`A55M&M&UU''%%vvݯݯ||ooDž##ؘ d(d(55@@HHCLCL9K9KEED > PP((//n4n4d5d54242**ii~~ nnff rr== r+r+q>55--xxʻʲزذTT {{**::#I#I"T"TFZFZZZTTHHn8n8$$kkIIٱٱsskk\\ӳffYY5"5" 4 4CCOOKWKWYYVVNNBB33##܌EEҔʔ44}}[[@@tt66| | YY""O$O$$$""zz DD__11UUII22ZZ==>>llVV||HHgg ff9!9!,,55==1B1BBB>>66**\\ LLddLL^^||bbħՑ ##33AAKKRRUUSSLL??Z/Z/^^ҾľČAA00bb  (-(-77`>`>@@==66**CCBBee;;LLiioo:&:&%-%-11H1H1--&&jj))IIUUݣݣ  //yyR R ``uuhh&&   "%"%''))((&&!!::22kk VV^^??CC**@(@(?9?9IIpXpXbbdd*`*`TTCC..VV̞̼ ]]FF((}=}=OO\\ZdZdffcc Y YsHsH{4{4II[[ʺưư|| ʘۘ۳uu((gg_,_,55::::z5z5,,++BB޴ܴ!!##99uuee(($$??;;ZZTT  !!g&g&((-(-(%%xxrr''zz++ِ**ϫūYY__##uuhhqq!!Y3Y3DDSS^^ddccO\O\NNiN>N\\eeBgBgccFZFZpKpK5858]"]"  ddww%+%+??QQ^^ReReccZZKK66[[hh ::gg[[66KK^^dd..AAQQO^O^ZeZeee__SSBB5/5/!!vvBBggdd##**٣WW;;--@@/O/ODZDZ____WWJJ77;";"u u ܒǒ11zz pp!!: : Q2Q2BBOOEXEXZZVVKK;;((RR̰mmٜٜyy::KK99ww==g g 44uEuEQQjYjYJ[J[VV'K'K::&&zziiyyý**  e(e(33I;I;@@BBAA==66-- # #/ / ..ϊɊɝƝƕǕwwԯ߯wwx'x'00557766a0a0''{{}}++pp<>))PPwwȥȥۧۧɱɱoovv$$  CC|$|$<*<*,,x+x+''""**xxK K zz ssHHss**׈؈AA--bbhhX%X%k.k.66L=L=YAYABBR?R?595900J$J$&&HHff;;TT??ҴҴ33HHss55 I IPWPWa`a`ddffccg\g\yOyO<<%% qq11ddttģģ^^Ēْ//JBJBXRXR^^eeffd`d`GTGTCC//]]UUqq))ϸϸœ؜88  l/l/AAPPZZ^^[[RRDDDDf2f2X X VVyyǾAA99ss  L"L""":#:#""!!KK ##RR\\ 55rr AA[[==``  ee ooPP00LLnnӌόooRRςՂճ޳,,##H$H$101099@@CC"B"B;;1010!!QQ``ޱѱцdžrrDDȾȾUUVVMMoo j j K&K&((''I#I#rr 22CCxx44 eeK K xxݳݨۨی܌ܑ~~MMcc''X1X1889=9=Q>Q>;;55>+>+ll--NNdd,,44Œ՞ ~~""55FFTT__eeffWaWa!V!VFF11сccޙޙ{{nn[[ȣFFߠ+.+.ODODTTO_O_eeeeaaXXII66;;uuډƉ''//؛؛ԙԙrr뫟vv1%1%y6y6`D`DMMQQOOHH==|.|.  nn ff̼Ƽðư((QQݱWW qq44**ccd d LL~~22vvttTT$$ --zzGGW#W#1&1&I'I'G&G&##  {{22֭ϭ˯˯//KK44kkOOffJ,J,77IAIAGGIIGG8A8A663'3'll!!FF̹QQ88;;RRȢȣ٣ٶnn&&m6m6CCLLOOkMkM4E4Ek8k8((DDZZؖΖCCiiQQQQaaTT**3399<<::j5j5,, 2222((ttĐǐAAoopp4 4 ((33997<7<::44b+b+\\2277OOmm2 2 qq&&_$_$&&$$GGܕִӴjj]]kk77||))//8282//z(z(FF==gg֬ˬVVėę̙+ + `'`' 1 16767x9x9H7H7w0w0v%v%nnll̇‡žNN̶̛ڶllee ::8%8%909088m=m=s>s>W;W;A4A4))''SSױii##yyžƾnnԡߡߒII {*{*i2i277 : :8833=+=+K K ooݯEE DDv v }'}'r.r.22H3H3 0 0!)!)^^DDۙޙާVVU U 55%%(((($$rrxxBB؉؉ؕܕܼ&&&&I/I/5566n4n4j-j-""66ԗƗƋڵڵiiؗxx ~ ~ 33CC.Q.QYYZZTTII77;";" yy۞ƞNNӤӤ<<@@$$nn::9-9-BBSS,_,_eeee``WWHH33IIޱޱ<<aa}}ӑ44IIJXJXbbffccXXGG//88qqQQ__ZZrrLL66[[TTw w C!C!}4}4DDQQYY[[UUAIAI`7`7"" qqǶǶ``aaʳʳf f //>>tJtJQQfSfSNNCC44""iihhttˉ%% ׺׺vvBBלII |,|,::EEkJkJxIxI3B3B55t&t&++xx֎ʎʑll ,,<<]]=#=#a/a/77;;::44S*S*))__YY{{ۉ؉بܨzzj j NN;;&&,,//5050--&&55םӝ??CCnn]]--99@@UCUC<@<@77Z*Z*SSddҩ==zz RR**<<<E>E==n1n1!!TTjjBB҇ҤҤGGttd4d4HHYYbbdd ^ ^>EEGG C C99**kkΆ򲍭ff\\$$%%\\$$00@8@8::8822 ) )XXeeMMeeکVVmm~~ۨ99%%::LLZ[Z[ccddN^N^PPg>KK22i i  LLUUwwrrXX88ZZ&& , ,--;*;*!! <>55MM _ _eeaaQQ?:?:RR__Ѓ((TTְְaaYY}}//==vEvEDD < <,,''لʄʧ§„„¦ɦgg֑Q Q r%r%--m0m0s-s-%%ΊԿԿVV˽˽˶ZZ V#V#{9{9LLXX^^ZZOO>>))66%%TTȊ00ۢii++<>եե%%bb܇[[.*.*CC2X2Xbb6f6fee^^QQ@@)) ZZΞդդ𛾙]]33ggqq22HHYYRbRb``TT??%% ttּjjȩȩqqܡܡkkʶiiII/0/0CCPPSS/M/Mc>c>,*,*$$EEϚPP˹˹xx 33a0a08=8=^C^CAAM8M8))]]$$žJJ( ( ff((1155l5l500))S S  i i xxLL88bb;;((JJff6 6 JJ##_,_,@4@499::66R.R.""nnˍզզооҟ((88C2C2HH~X~X``__UUCCI-I-ޢCCƧgg<>OO&[&[^^YYMM<<<<''{{>>ǿǿ%%66Ȳ{/{/mAmAOO:X:XYYTTHH77## AAʑxxqqȘȘdd ,,mBmBSS__eeGfGflclc+\+\VNVN::6#6#U U ؄<[>[]]xYxYNN==m(m(߽<>Ԗԡ  - -::nEnEmLmLwNwN>K>KCC88,,oo[[""JJ޿ڿڢآeeVV\\GGVVCCt t OO!!&#&#"" FF''Ԛ͚XXʸʸΐ֐֚::[[ ))44R=R=AAAAH><'<'w7w7EEMMPPJJ@@d0d0vvgg󙲜FFff((>>OO\\dd6e6eZ^Z^PP?&>#9#9//""''00ԯȯȥrrFF!!,,557;7;<<77//""TT֠ɠccqqrr>>``))2288H9H9{5{5,,l l WWzzRRJJRR8 8 qqYY66##q*q*----))""  ߙ))SS ""vvll00&&,,5=5=JJ[S[SVV%T%TLL??..uuަަ >>**::輫ҫFF77KKYY'b'beeeeGaGaAWAWFF00ϱۭۭllܠܠݸݸ!!##44xBxBKKPPPP L L7B7B44g#g#44((%%CCqqֳѳ֔۔dd~~ww ==[[u u 44xxHHffyyҬάΝ̝dd ;;gg,,99?E?EMMQQ0P0PxIxI==7.7.$$++߻ߗ˗ииXXGGWW::Ӥ--V5V5JIJIYYddff1e1e__RR??%*%*;;\\ҜҜ22x x HH00gAgANNWW.[.[XXOOsBsB11ww++ϒϒ55ddĻĻɫ>>==z z :/:/;;BB\E\EiBiB::..P!P!ddssaaSSߡ88ii77BB++RRxxmm^^&&f1f199x>x>D>D>99;/;/X!X!llxx==99šš\\99##Ӗ  22GGVV``ee@c@czZzZKK66}}ТRR͙͙ Д''22//++Y?Y?'O'OZZ``b_b_VVdGdGC3C3jjss ;;ZZFFƕודAA_ _ KK$$,,C2C23311,,##ll""SSrryy{{NNbb##??//88``  NN,#,#''((7'7':#:#""a a ((ZZOOݣգ00С͡TTAA));;$!$!..=;=;7E7EKKMMJJoCoC77))((ߏ͏KKAA&&\\P(P( 8 8 E E5N5NrRrRPPII==W.W.?? OODDΙÙll55 ·ڇڍUUJJ5$5$,,4499;;\9\9L2L2'' 44$$!! ""mm??::ffԢll**} } '*'*1177::::994545g/g/''? ? ??\\ɱı}}ɵѵHHN(N(w7w7DDLLPP(N(NFF::**((aavv©©խխ$$ZZ}}-- ''224;4;@@@@AA??::/2/2((  ::bbqqпʿ88?? ii;; ='='44@@JJQQTT:S:SmLmL@@11 ҁff``џݟ[[a a __++'<'>EE+H+HpEpE>>55))ll  ''^^JJppOO!!ssĦ**أ  pp00MEMEUU``~e~eee``WWHH_2_2JJڥߠߠ__˜˜UUʅ##77HHUU^]^]^^YYNN>>*+*+HHٺὧƸƸ||66rr&&--q0q0//7*7*""ZZ bbGGAA66J J HHUUVVHHbb==II9955,,88>>@@^<^<22Y%Y%]]:: ĸ™$$ϰް  ##g0g099T=T= ; ;33~&~&%%IINNه·__ʝԝjj))c%c%++// . .((--!!ffٴSS$$zzٺmm))$$--22,2,2,,=#=#K K eellOOۜ՜Ԝԁׁ``--ZZ[[ uuGG99[[cc88 bb   aa{{&&ffړߓXX00>>))//00,,$$LLa a ""OOPP//))LL--CC'T'T]]l^l^VVOHOH%4%4JJ(( TT55˾˾""}}b b ^&^&>>;R;RN`N`MfMfcc8Y8YFF//qqֹbb䝋88ggʊyydd""@>@>UU\c\cee e eaaSS @ @5*5*tt ˷˷ ddIIc6c6JJUZUZccdd\\LL66  CCeePP˨˨HH՛4455eJeJYY0a0a]]PP;;""ոhh..ppףף}}ȳyy33 I IVVZZMTMTlElE00hhQQ//áá226262jIjIYYaa:`:`uSuS==""IIdzdz4499ĩ݃i(i(>>QQ ] ]^^WWFF@0@011vvݮîޭޭ,,BBOO˾55(.(.CCTT^^``XXGGY2Y25522ffwwII11Ϡjj110F0F6U6U9\9\YYNN==S(S(ssLLWWЩЩQQ 3 3 H HXX````WWGG{1{100DD``MMvvuu BByy\\''==NNNZNZ]]BVBVUGUG2222PP 88CC 77 J JWW]]&[&[BPBP>>((--ˣ==88VV##)3)3==BBAA99++ SSLLKKһϻffBB  NN%%q-q-//\,\,_#_#**88xx''--uukkҼټjjAAFF SS))p4p4::;;A5A5))NNҦĦ xxzzyy@@  z%z%33>>vDvDCC;;--}}PPܹʹýý44ppuu==ܥr!r!".".66:: 8 8//""11zzJJ՟ԟ؋== ))t.t.3.3.((UUOOɎĎoo[[ 11F?F?HHKKEE99''%%͘}}$$88VV&&0033JJ#]#]ddeeccWWlBlB)) PPҪߚߚHHYYάkk]]XXO2O2HH>Y>YccffaaZVZVDD--33{{{{٪٪mmCChh&&11AGAG Y YNdNdff6`6`PP;;## RRۮcc99IJIJ %%..22/2/2,,M$M$tt{{22KKwwtt@@݌݌ݎ!!--77==A?A?Z;Z;22<$<$׬~~٧٧**FF((??RR6_6_ddaa>W>WEE..XX׀LL99ddUUϚ[[) ) '8'8*L*LzZzZ"a"a__SS0A0A))HHƱƱ眏~~YYٛ y#y#N9N9KKIXIXd]d]YYMMn;n;$$T T RRaaʢʢ;; w w ##(<(B>BOOWWVVNONOCBCB11i i XX!!ɲϲ ^^{{   $$__ BB  RR+ + ccZZVV..**ÏΏrr..nBnBRR^^dd{d{d\\NN::"">>޽޽CC%%&&BBffRR   77?L?LZZCaCax^x^RRj@j@))44llCC''88$$A2A2+;+;l>l>R;R;22##WWʈ[[ <

,>,qq%%77%%Ȳòww >>ӛޛު __# # JJUUmm WWv"v"..88>>$@$@lT>T??m'm'zzppSSѭѭܺܺ:: >/>/< > II&&&&bb򥺺Ӄ>>u u [8[8OO^_^_eeIeIe|]|]JJ22``bbTTθHHCC//&&ѝNN((008E8EATAT[[nZnZPP>>l)l)  }}== b0b0<>M6M6 ) )OO66``ۖؖݬxx  tt!!DD}}hh##M(M())%%@@ ..~~PPTT ooii&&f-f-00@.@.S(S(,,00D D   9 9 QQ1155ii%% ..==cGcGBKBKGG==--ssDDĵ55ʙʙîî&&((??4U4Ubbeedd/]/]^K^K55vvŘŘ44oo$$y3y3kFkFSS>Z>Z?X?XNN??,,{{mm.. II$$++..++n%n%XXCC@@cc 33&&))((x#x#44HH""ڤ~~ΗЗee..cc <$<$Q,Q,//n.n.((yybbܦզӗחbb11%%r0r0u7u78833)) eeuuӳó xx = = 44QHQH X X}a}abbZZJJ55ff΢GG11@@~~yy{{dd++BBUUKbKb6f6f``URUR==%% ؈ˆ߱߱QQ__ӻӻdd϶MM%%55??CCR@R@66'' [[ ||ϭܭM"M"00 ; ;>>;;00 * * 88 ϶-- [[ܳ  WW55HHXXe`e```VVLFLF00 //CCޮޮ,,ƻػuucc))88}B}BEEBB[9[9G+G+::SSۃՃ??::CCii BBJ J *$*$s#s#++]]XXԳZ Z 5522]D]DGRGRYYUXUXkNkNF=F=''rrŔ<f>_#_#11..88߮߮ttvv''==PP__ee\d\d[[vJvJ 3 3TT::ӆӢООOO>>AAө >>,,{@{@PP\\aaR_R_UUEE11``[[ggƃ33kk22nn l l 4 4]E]ERRFYFYTXTXOOnAnA:/:/DD==͢ ~~RRVV, , k.k.;;CC+F+FBB}8}8**@@j j '' AA؛˛ ш߈++RRL"L"b1b1<>FFJJoGoG3?3?w2w2""gg kkֻλ˧˧LL\\ttLL((DDW!W! 44tt  [[77--vv   v v S S &&44ZZxx00<<44!!    VVgg::__11??rrkkmmm m ii::IIY Y zz..@@ggIIttLLQ Q ;;##%%B%B%"" yy>> ff rrEE>>$$((    77pp::z!z!!!xx [[,, }}vvŜΜuuIIY Y ii&&9494v?v?FF9I9IRERE;;+-+- հǰμμɵɵ__ſӿqq''Y3Y3;;p>p>9;9;A2A2$$||zzէɧɨbb G-G-==aKaKSSTTMM??,,  rrRR''!!66 ΫΫʳ\\߈ 33CC^P^P^X^X [ [XXCRCRFF44!!  bbWWʩWWϺϺrrŗї==))J0J0333300))p p LLmm%%77NN &&DD33iixx22   ^^{ { XXiiwwyyRRff..ooeekk ccjjEE``==44%$%$++00;2;27070**^"^"' ' FFڥԳ׳||__O O &&++,-,-**$$!!11 ::޾II77 aa;; $ $V,V,113311l+l+H"H"11 <>77++00 $$TTww22((çƧGG قHH77))EE2299    pp88ddZZݍ܍ܞޞ%%w)w)116688e5e5..3%3% <<**vvGG鼕Ɓԁ ))77 B BGGGG??T3T3""FFbb۶Ͷͳóqqʶ__ ++77C=C=%=%=667+7+DDw w qq߻߻ǁqq~~ ,,////==GGLL6J6J7A7A22 ^^66װׅɅɭccWW55 \+\+55<<>>:;:;22&&))X X ށrr߰pp //Z Z BBwwqqPP$$: :  77ff ؛55vvѸӸӢ٢TT77##))T+T+((!!## nnuuLL^^j"j"!!{{ZZ"";;BBَҎLL __aa$$22<<{A{A@?@?R6R6''11RR˷zz<<..^&^&w7w7CCkIkIHH@@22""MMݥݻлgg  ""B(B())W&W&5588LL[[ 88 66--/ / UU ccQQ""##J!J!;;nn==;;44]]77LL c&c&((H%H%kkjjmm٩22ppQQ ??%%((d(d(##HH11ڬѬ[[̽˽SSJJee##`0`0#:#:r?r?W?W?d9d9--{ { ΍$$2727=E=EKK1K1KGG>>//E E 00yyEEGGUU88DŽքmm$ $ mm''0066R7R744++( ( llggkkwwJJ44CC^ ^ xx<<nn݅օ&&SSh h ))V5V5G=G=5@5@U=U=44''ҁ6622ҹҹÄфKK]]Z Z aa++99[C[C"G"G D D3:3:-+-+''22jj^^uuPP99ĿҿҚaaAAO(O(,5,5$=$=>>::00##rrLL++``IIE$E$(())|&|&II {{  IIgg ppQQ'' !!**.."/"/**!!۶11CCHH o)o)(5(50<0<==77,,MM $$PP٘bb% % ++663<3<;;339(9(  ++%% ||11SS11ݐ !!v&v&0046466611'' uuddvv]]eeA'A'++++''33ߊ WW))zz{{ ##@,@,00t/t/")")AAkkևχϡ͡ww``** S$S$,,00-0-0**!! ==1133 ݎ  lldd ##..HH))!!vv !!cc [[//܄ք--ӈӈӺ׺LLZZ00 $$--v3v34411t*t*    UU--uuΖĖKK  ww((|4|4==/A/A@@99//>!>!]]AA^^44uu__pp}}gg$$),),009191Q.Q.g(g(^ ^ ..  >>IIrruuM M F F &&$$iiVVSSQQ;;11rr''ZZ= = ++1#1#)%)%$$!!> > \\PPֺҺҊ֊֒ݒ. . %#%#%.%.66;;S4>4..&&QQ88FF||mmυ΅uullaa """" __ JJnn__ww,,??  %%$$))--D.D.++t&t&w w ::׬;;QQGG `$`$((****K&K&H H   ggww??qq++PPۗAA,,   44QQII qqrr88 uu77""33 . .  # #"" DDPPڲ۲ߙ >>#$#$&&'' & &"". . $$HHFFrr//kk\\BB [[[ [ 88||QQ  rrddzzMM yy22QQSS  00QQttPP55ZZkk##    00$$jj@@XX**$$DDSS cc JJ88FF# # --FF AAVVqqWW..kk{{d d   CCKK "" vvxx||E E ||dd; ; ;;mm..  L L aaooSS44mm \\))<< ffII&&[[  QQCCUUpp] ] J J **;;&&vv==rr;;+ + kk ttIIbbIIޤܤPP݆uuWWCC""&&&&,%,% --bbމډ@@aa77DDvvii y"y"$$$$1#1#UUss  KK``oo{{55 , , ((&&SS@@  DD44}}((WWSS99  ee77@@++44v v I I ||;;jjFF&&==]]E E >>uuuu  55GGmmBB ((E E tt""$$,,  ''11ii    JJi i RRWW**uu__??KK //--66^^rrcchh ##FFWWSSCCEE::++11 >>AAJJ   XXgg==YY۲ NN,,/ / w w #### }}( ( {{zzjjMM & & VV>>55K K LLUU99ooppJJwwzziizz  ?#?#Q%Q%$$!!yydd''ؑבxx``88??##D'D'((:&:&5 5 jjl l UUuu܂cc::NNg"g"&&|'|'$$``~~ݽ< <  / / @@uu88==!!' ' ,,PPpp3 3 RRttww{{}},,( ( WW  %%((LL KKf f 33ZZ QQss!!__xx1 1 dd::!!DDWW//jjjj((~~xx     ~~|| JJBBgg,,B B ::``@@rrRRhh||NN""##4!4!  44((WWەܕ00XX!!nn[[!!####e!e!--nn&&66ܘۘ8 8 }!}!##""UU0 0 zzttff11KK  ^^zzf f {{ MMmm))00 ,,bbb b jjccCC--ss11  **nnxx  ``{ { UU99((\\ rrNNN N kkKKaa}}aa7722hhMM] ] - - 3 3   ##LL``UUyyvvxxCCgg88hhvvuubb<<gg{{::ii& & - - X X c c ; ;   ::MM~~**22~~jjD D ``  zz``cc  ss&& yyoo>>GGyyYY((* *   e e   llCCff i i l l xx{{##'' PPqq^^??YY}}ttqqtt88  ??eeZZWW **tt//77* * @@==jjrr.. 33==&&CC __ww? ? FF99]] CCWWnnNN ^^22E E $ $   ~~OOQQ<>__yy%% UUBB%%ggddll00$$WWUU44  7711 uuII%%SS99::((OOWW[[ss__  tt 22k k   XX __}}((dd[[{{ff   + + VV``:: llzz || cc**\\55ww55BB XX== cc.. "".. OO 11pp**y y --[[^^ aa//33nnII ((   88 33GG^ ^  ,,<>$$qqII##IIzzaaEE11nneeppNN ll<<kkNN!!@@((//cc88DDYYn n   L L //TTii tt    g g gg::RR;;zzww99[[..sshh--11EEzz@@BBxx % % hh##vv~~77//77yyS S k k }}  ## ))%%@@eeAA^ ^  nncc44}}{{z z rr  ~~SSkkAA  P P A A PP==NNww## zzc c @ @ UU CC//GG LL ` `   k k 11ooQQII//{{;;vvNN^^ooYYII99\\mm!!QQUUrr WWdd^^aayyddccRRpp66HH""PPWWIIKK""tt~~  <<YYFF**99((aa&&NNXXeeCC!!--^^00uuzz{{  XX7766??77WWTT..eebb``[[;;__==ZZHHhhff--&&PPIISSSS>>]]""pp^^LL\\88~~VV>><< 99   bzflag-2.4.2+ds1/data/tetrawall.png000066400000000000000000000322341200563112200170610ustar00rootroot00000000000000PNG  IHDRL\bKGD pHYs  ~tIMEcT IDATxmkorq$:bFZZl4#%b_Qlx5?|^VWWWt:xxr\.b8x<^]]f'b^p>7MkY,t:-vX,f9oooeZǛryyy[zɽbl6xl6n^VV+rZz~/n۠}l6jZ^__[b8uM}fY.b\ժ_9á[}:~'NlC?l/mI[x\._~np8tw!O2ɤz~:Zbh5M_VEv:^__~ޞ^__ڭx<)AnKWn_t:Z|~||LvFJNˋ~Cؖޢ-x{{#1='XVWWWjz~~kX\^^bfgZ@߻E3-mY^Rdj\&׹v"^Û/˔Cme}cǐedzvt:v;OXv]V޿^\\v)YR,IYStݾ%:iU///-ݘ_4hzjX, Htyyf"S^c^wlqX5ow]) } {҆秧{=eWu?YV3H.o/$-H֖ȋ|d!=jݟ!Áry?V¡`"[у|>???')r.//)pm$5eoq8d|^!h{^E̳6w\VRN{qf߾}UL*5\.3I,uKI;o]Kʛn[xҺﯮz>Ouuކ~rumz 'vC7jaIvvЮX'-l}Kn}t#vߚző777-79M?څ~rybdn3vߴ61 OOO)P'j[8:\kƐ&= V+///}5Us#H)3Ͽ///@^EUltWWWp;1i%b0J:Ё9~GƇJzg.fvp+/Ģ⺞0}fуX euXBuZ+[3כ?N{aYC Xq]Pv:9- (_}x휄5X|[T<٦|(RŽ)Qo$KG1AJ {'aGIbln|˳xxV^]]%@jl6Y4/-8C'j86pB?1S*GZT*+m)ky* IVp8"mGfvzss>f6jn=fOtz°p 2/3e@lR"xz>o?iRZ$AJj2 Wo~}}%h-C󯯯^3PWȫuJoiy۝ȯV}at!rZbI[ HV.//׭0>@\VB1S"(! Mdo*,Ay{pyy$"SpD-,<&L9nzbB0Q% 8@3-=e6v2)QjNq^gR 8Al HсGz_`!¡_[]~~:7r|@Qa]KmAh)y!YU"yeL*憤Z_]]>Re#;kBxKo4[nb,g\/þ13V|ޡPIltA/Yҩz>WtgF3<ַwf3K%YD F܉;ݐR[pHzD"\wY=*dXJ7 _|iڦfWpp.H ;Vl3ўn3ۯ#Z_%kz~}{{ ӭsaapF?Ͻ2-Il=KH,*=hfXv<sc_f1ҡ"^3{) ނ`sllvlMm{w=Ėef1Chg]$yД^Vn [N#*G*ܢDVᙠNB[0rv bd bCNl f,>O{f؞v孹0Az^|5!Mb;х⟄rȏ,cV)ef+|E}P." VsJﬢPt7M6 /*: =*G,Kǖ~_ eT9t[az:wVٯ@[CYn?iJ= oF5d(+kk777=UI턕VR+Q.6{BA'T~|뉤zVU>-`U/HUsa;7q^umGA K3fsO &/// U#dZ)&J_{~R;(1Eq]&e;1mHf $+!˧2V޹Tme8 Y2jmJCMIIuUrˉ﬏R#JV&i+%z9|Ba8:ow6CĀ8e(!s>1Q4@6}*P( ^װσϗWO2 ~J09^o1cEVUR$ӆ]6]L:wiz_bgg5Ït?bI6C@4d2<>>2rp8,9Ҏ(NwJWMD/qNk 4 `\ͫ0r1d ڶ+(tK;AM'D1n[[^Y4% jI R3v!YKVdUfW^OzQ *dʥZ=P6A>oV{bEB;%A1Mݵ5~4jRPɿs*DZQ9 1D͜ItMf/JR2q©&jmnTSF#(q>mhǰb-d[1?c R+m(; +p`Jrm/-|x4ys|Ӊ8">I1 d{'XhyRR[,5!{xxp){c#k!9 ~OJoKk9=!Ljg*I♕&kfo 8tyy%iFb̠-(!10N)vrdbW[f$JUgBx˧'n8P9e /Rؒ5Ӧ&>#TC?љ)c޳B "UO3*kp|/OHC3rըxVե7&s47.7GAAv-N($-jIF`Isv,3u#}v!°Z- 1&,W/J IGEӯHb.YG%im|on+|zzL*A\aO8\T-l[U$,wˌQ, :1o6g0HA]E!vtpLIlάM3<:1mZt# 1ζR_RUq>T^[u+@xSPI/4=Q,k;Ąp&_TE#Wn(mTW=$c5K%c;(Na ai{xU{_ ueID^1|x$|:FȐ-ړ$2)Wo ~=flԨh<%ośfd&McES 7Ŭ3}B))H]奘\<,Jgg!Dx4iv'W}ww`jogŐ/_8~wwSEۣSFJ'2:u_4]h%t׿?}"CL0@TϝY _Y?E,ܥ[7779A>$R9$%׏FO>Vj.a@-ǓnYB{=1kk߯'PzKV4{/􎗗 kCUnooӡIHTRAΌR7`'{"ҳX<4POX H{ڻ,͡*SYDAJ~p>Y!MIhL 4)oV E'n ؀Gԝ\|,iTlW|rcSK-1 lr $1 pб/ sĊ`+QK|+ XA _?~ ).u.rf͡NIn.$ #K@&Dx#nOv`^?'IPzX>_ӛzY}紡gag.//CũgL䔸i6'*h ,H*FEV9RAMRtmŵr’<4EƳk\_{w˗/3iMux^b Q uY(?rzZtJ#fGmtXdЗLuƩ|qpU,FI EՄo򈉎dBVB2*) %q bKTe}1gPe2nV0:bLMDNT$r`%y3,ېO MGliiOw'"Bw}H|CUDy$Ypnoo=?lz9Q2XH&™MIdys0!HW/9߅وRX{xxk6VlC$vVM3)uf[m\y:蹥f_UE;vF6%bqhN;][}j:Gsx(6f^ wf%eC߿D`d@eFRHtOf$$U bQ Tnzr;ZО8.Fcq'͔ \ c lw PGO:>/3Zl#`L'=_f\ϑ꩓vHJ`3; (qw!Y,7>=e<7i'3 ):K{<'bR?i~b|*:WYUut9OIb4zsxԞz ^kfaA{[3mc!"rC9$36FiΏ\&4 W2ΩhVZ.[AFmrcXT*Y3DIFb۪&>i-v8M:Sh7VI><җ^fؓ KZrKX4>@R!q).XLY㞽sœ ih8ILOӛG SAZX6Hk#gz p}R4l20Jfq ~QGgQ"ˠqJ1qFIzb 8?HB[c&Yfg2nN&suzH8<>LgD5sO&ظt}5)Ŏ9(W $iyYӖ%щ0&>U3.EDUKbfF t0+Jl,864K 2{ ӓ ckja|zۄlHlčY @*L:!'Lqmw\?DH 7L1+ ٟzD1<>>Eqq9P$}5&VE{ZC琍YUm &إ],Y+zTpl/..Z_i(q]ᨽ|BV$d/C7K(i+ 6 ]6p mL&noo!i΁ԧi]FE;GQBjmYIݠF?yOlL6-n$@0dasp>݅Znd!:ʼ mYGx2.c)O9Rg 3䘰OW͈gu7[6!]g!Esフ_  eZF`WԠ#TXpײT=MU&Z L aq`H֒ؿ /9Jڶ55 ^ݱøL`h9nNB.3EJ"^a% ]裗77$LCLXЦ`lq&NvJ?6>==gow"@#@͜06J KgϘLms@YY .iP:s6 V'MpVW}E{5BF$sôpt~^wPjwu?#"B9IDAT{̆MXv~w TzYcy.U9ط\ԇ,j[jH}_{VC_ Tg,I 's5 ^@(T{`nVUuB6 ה Zk! &{6f/cǚίqa)ԛ@['|t,իKҀ.Aޠ9gߤWWF_KS{G^~ =uKldu@T6lsIML#}//3Rf s}Ҷ\ŐZA\O#`Ubs4-љppc"hjYdඡWl21!t̹sd7:6XvN*B~?7UƑeR ]!n*bq'^93 q|ģ>O#>]UsA9~4JGu`v;|NiٲXgocd4 շ0A%fl4+8=oeWn:VSY~*/R)feo?͔@*Omk"َ1"xgs\K_*?WfW=ndlNRuA u=h0W_ҲAUHݚ>0|؊9 ǏMIIiO3,(XjOJ KV Vŗ9+>j]pU2,%[DhKW5k԰9֖ݺUF#|bak6cvS#5f"gLUf6IKDV44chn C3dt@OSг*Eg>&(|jt欘"7 ܎$(IOmyjäbfCӳ2kV!HR⹽.p&~s1G5jm=ApmgV܈&4)dI NtQl,{r{{Iv69~˗YMr\P'v?a8kl%r ut"]ЎCfDZܭ'(5а9n1s*zlY}*p zpnx2t">J/E8ODgW g:9ە i1s{:S*3.Sq#/]l#K.;^iW^wZLxmEfɻjЕi  o N5WW,ے&1)k1[ZbXj̊R=, tfc; o҈hN+g̀"Pi܉2dEu{"Kzogr^uP}wwqF 2o /TBe>Kw;W!D sfkSRW1d rNQ\@ zĶx ehzy-Pk/tsVؗ5Bx:3j2777}cEe4Ab9qޣTn̜91CMo1PUaHʹęʩAh" \Wde hޡyR8o:f k2̺`^T] W"[_dI]a= d\.mEަAU5g %?sZc OdbT\LT\RfNdI,g\6[Wfpp(<ɴ?ɭ;L 0O-ճ-% ]?ܹ.4[<:380gznap0ù܄ 7]A>~*>@$R$q$.J= -B4jGf,.psQ{_~uKLEE#\gZ V7-QqmؓLV͔@hHd8'`_łڣMJsgTL!ӌI\Ңma F+bFcY&&0@%tV@ȗ/_>ѶJq~Y5'<6263!̘ 7mʸyPd9)q$Q㛁==Ħ%>|^ru# Q|#4p8M WNfӿ|nGŗhGMctv9![ $LXd3`&0gh 'N1԰l;9VE04sUĀXz8.7I=ݙ:n2/L/_T>{m Ϧ^,JBko? sָٺ ;VԬeAhL$OȔ|$מ'sl6W΋A|__E;mx^}X|1{]f \ϊO M,=`\q5ٰVd|%6]1ɞym-¡[υֳZ~ W.oKqa(ls L)mF%o7X>$J|||!9!Lw*YjAqF*d[iإZzi eO>?uq,`u|zYd}~>G82:x0 n%U5_*Ɋ&:^WΑ IU4'cmbҁup솔zĜa9mAM&(Q_?;'ŎIMՉĚ>H[{r(alZDIap؅pԚKQqr c}qc&(+ O_+Dz0N "dھ57L[Q4əƂϮrnE.d@d+.ROs#8ےfCJ^>3$VK ˻a`(R6Դ>T,v\50 Zc??^>E[?2Un4h2gB%(C=a19*ɩVl"_-+8O` ȪuϋUNf%EpܛĄ]ޝ #g u<7吉x) LtZҼ9Kcj*F@-]+t[Qԁ l{̚S2 q8cfXt?h>Ο9ycZ-KU [dGmU)'H_5: 7kW}ʠ(HWAve;h.I,ERL N~2MBʊ}R RPz)2\S\D)KɈK89Hw vKJ?ŀ/܇&BFEM d"}wWü\nU y20a+ u &pf\z&t+7QO+D8E>&)QAJ1_5#:'yskvc)0\l.;懪(>фxǑlU^(.ҸK+$nixSYL*Fdd)ټEi%Y)ט&KJeml5qhCӚ|_7jF8l5FǼ*ÒIi}LIȑ'H OCܳ~ gNn ;] 9BWiV-*B kǐ`n9-2S1k{UBٙtU)۴ %ooooooj;i@nm[V>o`b%(E0s?ϦCKL~b_vL7 ><<|4~=a?ytOP/j?* zTս UmN7sbKnpP& RQo$s bN⨏^B@/U~%0 >a2(c[q_,a^gjy$!Tɛ3V>Mat߫-&1q9~fzJTwww|I:4iF)#Ⰲ babe׉IENDB`bzflag-2.4.2+ds1/data/thief.png000066400000000000000000000004011200563112200161500ustar00rootroot00000000000000PNG  IHDR@@iqIDATx @7JEmtlD <}0}ʲLUU{:ڶ]&5MGQ[nc<׈ss5ab~~1ny=~ |PIENDB`bzflag-2.4.2+ds1/data/thief.wav000066400000000000000000000631641200563112200162000ustar00rootroot00000000000000RIFFlfWAVEfmt "VDdataHf~}}}}~  {wsokhfffgimqw~ "%)))&$xqib\WTRRSX]enx  *079;860*"|qeYOF@:;=FO]k{ ,9GMSQOE<1'whZK=1% #+RfmtmfWI8(veP<) ';Tn 9Sg|}qcN:&nZF1-E^x*D\uzkX@)~iU?) ";Vr %?ZlhQ8 rZB'  0Kf:WuzukR:! qX: 'B]y/Ljtyt[B(tY8 2Lg% jG( +BYw7Zlwo[H0yY7 (=Rm(JaxusbQ:$kI' "5H`y7PjmpaS=( qQ1$(9Kc|6LbdfXK5 kP6,"*3DUn :J[YXJ<'zaM9524+ vcWKJJT_p%1>>>3(q]SJMP\i}#7?HB<+mZHD@IRbs1DHMC:&{cQ@@@LWj},1hNC8>EUf~-EMUJ@)vYG68;IXo Oa!6KIH/sOA4@No,ILO8!{UC1@Os1KGD$cA;6Ng 0CWLAzX753EXk8IZJ:lL,17[ڀ#HKO0jA6,Fa1EZK=nL+.2RsBP^K8 cC#,5[ځ'MQU6k?3'Edm<]RHuL#*1_ތ 4]XT,X,/3_ދ 4^XR*U(,0X׀+WZ^>k8+ChIR\=k7+EkNT[8c/)$Jp!T]fD#m7,!Ho!UZ`:_)*,]܍ 7bVKpD(8g=e]V,P&.[ڈ2]\\-Q"6Jɀ7FV>&p:+BhNW`C'r<. Jt#TUW-W+;Lˀ6H[>"o;2)Nt"RTV2^,.1\ۆ/XMCoI#9Pπ/CW; qB7,NqIMR1c68;b .SLEwR-@SҀ.?P7qD<5Y~#IFCxU3FY؂,:I.kAHOz%3B.qFB>e +L?3 dK3PnCEH) `6;@i1QJDuQ-D\ۇ4;C ~Z6QlGFED"T(5Bo9VKA\E/W+4=`@k1N4~aB#Mw#QH@#W(@Xׇ7AEnd[D.f;X8iCLz!I+]8k4JrmhS>u+@v,If:c7:>y3H^0X-=N͊ GFE`D)Mr%ZG5RC5j?`9g;BIȃ>GQ pP1On"XI;TC3a8aB#r@AC{3EW)}T,HePE;TA/a7\6d7DRы EA>S@-X׃/\D,xC?;s*>S#uL$CbME>T='Y؊ /U/ Z*>Rъ CEHaB#Q+X>%o9: XD0g9U.[.IeMC:QE9p'?W.\1Po!TE6LE?w/@Q#wR.Zم.X>%r>HRщ BBC[F1i =[5_.HcKE?RG=w1>LtM&Y؋ /S8i4Uv"P8 k68:y8DPnK)c7Q/[(Mr OA4z@GNͅ>>>fF&_ޘ.D.a)NtA8/yCHN},-/ hTA|6/( pI"W֋ 5.'p8Yz *4XVUz#(iDns "tFu# vnJg }ppq1}||eŃ5qKz(tQq|dmv ~~~rg -{ rXׂ.r~ pVՃ1"uPs gt  s & u}`߄)`߁#a0[{i .pv|un$ wxz  }mx~z. hk6 b}h8 _w|j:pxsg /}{tn &~hjm~,rrrvz.s{yp. kywh - n~ ye,bssa+dx xd, is}m^݀#lt}rg'{l]y~{yurvxz~{gw"jz uwUr2_qzp.\up5 ^w~l4Zvs?dvvd 8 cz}j8 ^syk;gz zh:k}ze 5 gy yh:mz|r8y}th +rx~|{6|xtp +|wrm (zup ~wrn|{z |ow ~ly zbs}arjw ~ft m{ } |bsy g|w }]q|r}^ww "_szm|_w} ctz~gz  ~gox |gu ivgxat!g|z }^x~&^vw #_{ }'^xv(]| y-Zxo -^ o ,Vwx0]{o (Y}! t (}Rrz.[xy'[uu "[y }$_u u|`|  z[v yau ycr yeu  ziv  wcr yk{  n\iv |oy o]m~{gt v`qwfu  tdo{ }ov} |p| wbs ~hw ~lu {q{ tuw}xux{  ~'|{zzz*~}|||/vm# q|x1qyvk + qw3oztd%gz y7mu~qe, jz wm / ixwg)cu|q3q|uc!bv s2 brtf / iy yi 0 kxr_}[mvm2w t^|z[p{q, lun^~mmamyuq )}p_zwqnz|r u~}r y ~ro} &xxxqk rv w ryzt "| ~s rw}vp ' }mmz{p *}k~h} 3psvqm -zvh .ue-q^݀# zcn} s* lyw9xsnf_ޅ,~m]܁'te,|eNs qiqyma# rv{tm2 yhWFj  zg }|oc~yuqcUp w zsmd\w zk wng`y oz~}um yp zsmz |uyqjz {qhy '{gmt~~  tjqx  |tsruy,!y rvz )xus~.tkbo}:" yglq3 vbbb-!wk`߀" vj^y |'|qfc`ywv- xe`[| xmc wmc"sd_Z#seWv q[WT{"*3mTh|t`\Xu,o\q rfZwpdYr %ld]s%B$nV[a#zzz " vpku,{qgko )~x) n\K^r=/! vng |unki , ~w-tafk *(&xn ~wy|$ubnz1+% pli}v[ix/6=qaRh# xog-=kS]h zto{7uhijxov~# vlcnz.zcfixoru |l\kz,${YXWv%5zbJRZr  !&k^Q^l! yga\r  ~l^Q^l"""xrvca`q {of]jx  {zz~zq|!&, n^NYe $) ugnuquy$ tnis~(%" ~zwi[k{ *ymakuoe[gs "#${vtlenw " ~r|xqsv~ ~tsry  xqsux| xquz|uts~ y|obip !wlor xpon~xmqu {tojrz!mbXUScs|"( sh^el| ~yqiou&/vcbary|" ~qeoy ~tz  }yvwy}    ~wso} {~ zmalw}u  {tnw%xur{up  vgnu xtqw}ystuzyrvzyotz~tj`q$jgertpmy  ugox }upkt}}~ytvx wtr{zvr~ rdnx~ v~  znrv vsqx ~z zvwy yr| ~qeoz(%" zrk{ xtp$y vnft ! |vvv  ~ r`kw||| u  |qgmsvy   zty z}{w  |qh_hrslev xmllv|wus| zplhwztnps {}sg[[\s ! wus{ynpsy {tntz} ~{uo| ux{ {xvtr {t nml{  ~vny-& xphr| }w  uy}~ %#!thqz  {nw  vlbku ~~~vnrw{  ~zw{ ujhgow  ~ytrqsuy}~}}wvuqntzyx uplkkx~yurpz~}} }spmqu|}www{ }vwx xvtss{ vpjmp| }~yopr $yxx {xv{   {nkiw   xyzxv  ~  zv}{~'" wlagm~ sba`s+xvt}pdcby! ~rz  ~rfc`u yz{zyvtrqtx  z}vmoromy  si`ejs|}|x|omkqw wpiov }nnnu|%zoenw|z~  yt~|z~  { |vz  rx  }    ~~wvv~" }{yyz  yz{{{|vq~  ~y} |yur ~wpy ~zw~{tmx{w~  ytmfv~x~ytjaku y~xmqux{ wrnsx~tx}yv  }ypgmt{  wtqlhy w{ }tl{ y{  uglr~  zsqp}  ~   }  |v  |ux|    ~v{ } wvusq  ~psw~ wpuz zhjlu wpz~{xyz} wxztnz~zvy} ~zqhr}|||~usqsu{wpiw ysss }~{v|xtq{ ytsr ~rw|}xs|    ~yrlt| ~|yv  |v |q~ ~~w  zyy yw} |ws{  ~z ~suxtqyvs|ujv vut zods wlos {pevwnu} ~ukbo}~wxz|rhr|vx{ xmcnzyvsvz~| uly ~svz { ~yuq||vq yqz  }s zqz wp |ov}z ~x  yxw |t~ zto| }v  utt ysn}  }qom} ujv vuu|sjv vqmxtir{ tpmw~rgs ~pnmw{s}~zpgms uhow}~|{ vjs} ~zv}  ylry ~xs} y {zy~}}}}~~|~~~  xnv zpy {|} yr|  xxx {slx  xur} wnsy|y|qgow |tmy  uefgv  {qxulpt {t} xopq| }uzxurz ~twz {x }umv }tlu~| zvsz } |sks|~{ {vq~ ttt }t|  }|{{v| {v |u{ ~ulv }vxzwmsy~ ~ysmrw vnx {sss~ ~wqlv {qqq| ztov} {trq| |uoru }wqx{vrvz ysny |uwy ~wqy }{~|{  zxv ~z~ ~yu ~z|~ } |z{}|zwt  {~  }yv} |zz{ {v||xwv ~yuwz zuqy zuvx}votz}yuts xrsu~zvsz {usq} ztou{ wrnv{xvx{ {zzxvux{ ~|||}|{~ ~ ~~ } }z|~ |vz~  ~{{| {yx~ ~{~ ~}}|zxz}~~}{{|}|}~|}~~{yz{}|~~{{|~~~}xwwz~~z{|{xy{~~~|z|~|zyy~~||}~}{ywz} }{{{|||~ }|{~  ~~ } ~~~  y{}    ~ ~wy{~ }~|||~}|zx{ ~zvsqw~~}zvvwz}}yvx{xusvy~|vwyyz|{zzz}}zyy{~~wxz{}}|||~      ~ ~||}||}}{yxx}|y{}{yz{}}|{}~{xz}}|{{{}zwvvz~}||}||}~~{yz|~|z}}|}  ~|~zzz~~{~}{z~~|zy|~||}||}}||}}yz|~~}}}{z|~~|zz{{|~|{zz||zy|}~ }}z|~|}~~||}}~~|z{|}~~~~}}}|{zzz{{|}~~~}}}~|{|}||}~}{zy{}~~{ywz~~|{~~}~}~{ ~|{  ~  }{~~||}~}{|}~~{|~|zxz}|{z{}}}~|yyy{~}yxx{~}yz|~~}zx{~~{y|}{}}{~}~~ ~ ~}y{~|}~~|{~|y{~~|{|~~~~}}~}|{{|~~~{yz{|~|zz{|}~}{zy{}~}|{|}||}~~~~~~}{|~~~~}|~~   ~}||~{zz~~}}~}}}~}}}~~~~}~~|{|}~}{yz{~~zwxz}|ywz}~zxvy|~~{zy{~~}}}~~~~}~|||~~}}    ~ }{y~~}|z}{{|~}z{}}{{|~~{yz|~|||~~}}zxz|~~{yxwy{|~~|zxy{~{wtvx}}z{|~~|z{}}}}}~} {|} ~~~    ~ ~~~}|||zyxz}}{~{yx|{xvy}~|zy|~}zxy{{|}~}}zxy{|~|yyz|~|yyy{~|yxwz~{xxx||ywz~|}}}~~ }~     ~ ~}||~~}~~zwz~|z|~{xxx{~|xxy|{wwwz}{xvwxz}}yvtvy~{wtuw||yvwy}|zzz}~{zy|}~}}~}}~ ||} ~~ |      ~ |} {|}~yyz~|zx{~{y{}~{y{}}yyz~~zyy{~|zxvx{~}yuvw{}xtuvz~}yvvvz~~zvuuy}~{xvy|}yz{~{|~}||~||~}    ~    } ~|{{~|z|}z|~}xxy}{yx{~{xvy}~}yvxz~~zwwwz~{xvux{~|zwtuw{ytssx~|wuty~~ywuy~~{y{~}y{}~|{~|}~ {{{ ~} }     ~~~~}||}||~~|}~~}|~~|{|}}{{{~}zyx{~~|zxyz}|yxxz}~~}{z{}~~}{y{}}zzz}~|{|~~|~}}~~~~~}} ~  ~   }~ ~|{}z}{{{~|{~{xz}}xxx|{yxz}|xxy}|ywvy}}xtuw|~zyxz}}|zxz|}zyx{}zwz~|xz}}|{~~{}|}~ }{}~}} ~     |} ~~|z||{z}~|}~|{z|~~{{||yyy{~|ywxz}|yxwy|~}{ywxz}|yyy{}~}|zxyz|~|{{}~}~}}~~~~      ||}}{|}~{{{}}{z{}|zzz|}zxyz}|yxxz}~|{yxy{~~{xwwz}}{xvwx{{xwwy{~~zwxz~~{{|~~|}~}~~       ~}{|~|{{}}{|}|{z{}}zyy{~}{yx|bzflag-2.4.2+ds1/data/title.png000066400000000000000000002626641200563112200162170ustar00rootroot00000000000000PNG  IHDR}W pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FZIDATxy%U{t;߾v%%Y-YmY g0` I186$CB<q0 mɃ$#kytkUsZ꧟{vZz׻R BqS&Kqz\cǎ193vgL+oOzHDzZz=f-:-_! _x8ܱcLl8$l8''ƍCbd_ç#[ssˊ~NN.s\PgLo/;÷6=_GCGo/_򒝒ޓ?#?4:]=rs `F_會qxGR#F[/mn{X.Gt_.GJQ Wٳ3}rUJh\U*9⯥ϥȿ/F[Kz/ףbzh?bt-tF[~a |=J;^"?~ɿoWu}: H~qu9=@`ppz\=}ضm[|㘢^oGjQ툿P(XBw@  ZQ__IG*@ϡϦfۖۑ@9 !ğy+ZUE麁8Xst=z}]s9O/yBeY'R5#[-72MCvl|[-7}e zH2!3w~Ft^{l(йyJ!&ΓNȟ_:|?G>حZg\=.O @ @3I@GVr f+wx  qz\=^:m+O&?0`@=qh@ @!7 Wqz\=^(MWJ_J ){=(E|=[ 4P 0~Gūz\=W7xx9R =Gw2|Af9:[X-pR4MضvP(`vrBxu!|G@2H9˲P(P*`Nv u{:B0`YLDP8z}GӁ?k!+][kNI? `"t Dׯ 8p_=Wd{miGGɀɉ7zoߙ{֩2NA>J sB?HuGݽnZBϋ?76i&P{jWpMDRQVQ,FQny,..jr)% ưyf4M]f.\ nW5RJض~`xxrY;/J)avFyϣh 2 OS/ XBL  18uz\= Wh`|r'}6AyFG>3(?-wȘC/N=NG;at87ƞ-(jsL &PTMpzmΝ;aXfl6qY\pz! n݊kRZx LNN"r7bX3 }3338}4s pǍ~'`T{<#N &x&Nb˯FW^7g ~ zts]>wbE8n6ah=I \1sCA"$#n0ҜJOpA$E:39$đ, ؿ?25 4Mw\FRJ\s ,‰'h4eD޽{_FFF077RT*aǎmۙ秧3k޼y3"9iR~ @';L>w=jz\=sğ ɿ08džIH aQ&7_Sc/]nTp ,q1^`YߓS_Sߝ218HIr<;iilG2r;w#GԩSh4]mŁ`6vءuלsibxx{E\,..yuQ.3iga׮]/..ȑ#8| bغu+k.4M,--]J'JA?;q9T`&Ouz\=3$42Hyi䟦8?WAlxç?eY,(GdCF9ܸq>'P4d q4 eY(( du=4 H)P*QVu h6]:4144Qy<'O׽J[liĞ={088?|RBT¦M8ɓw9,..qbddfssxN9PBIWrHwuz\=čeprCOC:BO#ӬMdOC:66:S#@D{VBHRЛ:]|_iid\H d%q[݀;wbpp0c"B4M#߼y33)(nq;wV]kSɓ#~wuP."c0 T*ܹSCD::th?r066 6`rryq2 W@V_Asz\=W6^U`Lts)@465"WI 3Ɨ# #X &r\R~#K-L4"F =! g=AGWwK4y Uٳ㬼2v'P,{bBQ t.Rם:u"i4 J%T*g5 lق-[wە_A ϟ?eq]w:'Of?<2|=>Vqd^ԃW/ ,ld=k{c'͇szs=/9JsB9Σ_NjhBS_"3=G2BHH5|3 8 Iƛ %BE1/ @B`qq R (KTdE188!hB֭[111 &MLLȑ#4MmW 6mڄ }'O2vo[a?p@bJL3w8EbEbvJ}Wz~Rz̓|0{ͽ羢+HW7QJ~xs9j)n(yh,"qCJ2c7u|Hם 9a338|p^ܹ7L7> @NEUm[nm(كBxyejZ* &&&uVm=<Νh\4t/9я~rK#^'JBd2MQ=%mZpb1S~#y?%9r.]dOp~ szEɯ`2:,Dǜ3M绢D:/~񋘘hrGk:N P(yLO9vûu(nFh@qH7MSwG٭V Adʍ ?J%?i=XʧykZ[Vfa|({1<#]:eYu]xb5xuضbF,,08|GX^^]Mc7ӑ-Z۶Eȍ":Ɛ m\bQzaϞ=t:zz)%*YDQuQ*1#X>"BBN^s9U4l6pp'^Ll4U?O)|b=\>r)_ul&6;+Ky @sɦHxσxlar AمPNSS@`˖-\}Gy^uVضE,..vW.]BD__*"g2y#o>@VC̥ TUڵ z?箻 T*N'#أB3g 2:rH9^pw۶m@GBjl63ڠLӄizmBQi#^(߯KTb&R2 Z Bt:t:\tioZp]˨!m[GTI wh#, J) ƛ&~_ƽދ{`FMƔ !_q 0 mh"X,bii .DYV}LKQ&7Mv;AmDQB4MmpQyCTۜ}ǎ"A;uח.rD9f~Bt:-X (4RB? ;er@ t2hjzY hg}/ 42pT7=r>H'2>NXT?'ꂬaډW'DባV}w| !nwqtژGB\5\E֛P(z߾}PJi1BAN ,122Yt"Q~i4g[M6aƴIw?x0}R={t@Rt:FՂiذa~/Uqm+ s4@OO񶷽 eih:Po6V B8Z꨼lP(Ecܩ,d .] R rY/r7iǒ1P8EQje0 h4nq7_|_Ƨ>)eٕ ҵ7u^C. 8_X1?```a^}s 5xʇ>&''1$f=gHO-J 1S*2s2$Pz_{Xi.bgt 7o-DcIjBhMٲ4ѥ "fzv2|2o9"`HH!~,6''rPLaiH("A9a.(Yq(%| JK)TҊ=IOZmsss(Z-cllg2Fz߾}]*w;ws"腅,//X,bȑ#=KpwTضm*l:qP8 k###"ԇ o߮11mZΝ;ׅ^<_祼(b~?Ar-8x ^WEG9&V*0>>eT%3 BFGKd`ГG~7|3:w2MSe|zW8+at: 5%ŏ؏G?Qlۆ8jxp|E~oٲ?S?۶jP*&lQ2EJ)Z-H)Q8NW*p2H\)#kX^^<2-(:?_z\wu8IG4[;SzV+-BOc3Nzi~,--a۶mϹy.71q5fY0DV֛ 3D½K&B8){8nB ct4goaHJ QWQ?4X-rzT! *H?7I 9 a 5:Bncff6meYصkWy]"[ZQ*aÆL^șt>ٶ;whΔ+N:i Vz?kp~~v7ns 9wqGFkϧ2;kS?#xGo{я~vv[Cض 8NPBSJ7moxO9EQjUܹs^>w}7~~ vΗ 9 C#tq]WX: C<ӸpBC+Ԕz=S-~B(`֐9]f<}AݠMcșϕ^so;>P(舙. TZV&NOp8zȎt+!J)֭[qwwܡSR sBw:ͻ!> )\7FT&ϧT^c8(f'D<)c(VFcһ(҆H'1-3Ơ}]1 ")WFHĨaĮAB{VBO:%,//ctt[nšC3FԩS֞S*sc?8NJ^Z{q3JbbBߏݻw# Ly xASY&0(>9t:zv2"K8i$6Mj@ o&xzJ<_:w@s͜ mMN ,:G"sDwz+رc:ձZ~p#D庮ΛZ- Ant2×+;=W:gBN}ih@sRtvrRJmX^\ /99As,H8J׷ pi^&m݆m뮻P.5$R ƐrRs~d@l N yI~,HrbN6d K$oO}as74K,Ny/9E!o#d7 1|hN1(y^]աC4IxkYK,M8Ov!k3FGG3OK_⦛nүN(?Lfz6Nimۺ1dl%>wo;(~7ou]W#QtD$lH٭4|Ob<%Lu z2Ik P4oFG@בW%>?ޙ/?~)1=/:i:|":*&&veF縰j===8w:q 7hH٪ȗ)O_̼6 C=(mA:|E@yKF4 UT]Kf8}mH躻aOS5;ʗbzz (J+:۶mR Ӱm{]<_{|%JBBGd\=W gqqQfyE)V(D|dHUb6SdN%d!^/G{QE r` ϗH6y5=R"mT5|?.hpGPАWYGNǏOOi"ZJq/=|mh6:J#0xJ%Cꩧ2 +̓-\i>b]OapT-)ʧy8γ RJ|>99/?c?7`:/J]59';O$#en#qdKwp̉r$;L5GK۟w C<"(%2GAܙ  !n%Wm,..\.cdxCCCР.q@Oe Gɓ'3i֭[sI? ._ KZGXĦM4DU&UzY}?~brr=nLm5q~ϣjs 7~TF~.]t2*O{|Dk4ԤcI5\W;Djqq1S2GeB ٍΛj9@{*O#/.c˲ FP󟿇;\ 8Ꮈ$jrN;'}#S4aȮy1 \O~ɒdGrRA/Σ\w,; O/D&mBL4/"9 iYaϿj"5N4GP*7 xbrrKV]?~߿ A̙38}tfO0 zeaƍ=_)^-#?#꜃ Tj狁}KVjpҥ肗=QDW\2 LPDEy0 C]t?s@0γT*eFPe+ G_9> g~g}(s'#5/|t.u?xn?# 7LOIt:ذa__kXẮV }r Һϗ`|RIDrQ*z> ~03p$j Q82J֘&+D˔![Q\ϟy/?} %y_?= k-PȻ&r!}o["4 lݺ-vBNpY43Kz@M{((ٓpBW8qA`ddDI{ŋhZXϧ-ǾJ|ꗫ3"҄mj:EDJ ]|sz%79 aQ,KK0 CohR/iYdm"bgy"͙mr|{7Ǣ?J gGV4XN]f855{|ahT.h?-sQ;(%/QŋⲓN 鴒NdM(JlہeiOd[!2h'ﷵ&u]]/%r,v hY$;{l0|zz_*3CS| Ȟ(͚C+(JQr@y U'e W$_ )$.JAHj2BnLh^,Qdy˿cS++HIF: Hcćϡ󼪂;Z|9æK #' A(CatB8j\.u?b=xӛެ4rQ4]ϿWi|9٦=٧q2N25a.."G%]S):!L R RQfH\@K9rxTL;#85 2FrE^Gɦ-+VAA%0Ak}^sU|ՠ]&E$B7mi1)ΉkSryT~޽XODYYRnZ}{eqk9<"ߍ~,--aii)p4P(tU*}%95(GHeL333?5Ztr%@cacyX☈2(CeNIB.R'd/|?J$_)fS^Ti'\)m$D%{9Чxj (ҸMfVY!c}9vE32-wyv},bJӹaG>HQ1O"%GR#~/jJv?밨)v>u1 kt h^p'RE܀;4yҒK˫^8!ydT6~[)9DIgY DSzNn!Y[TdOJ#Ianu,OӮ~NXi' + CSf "+#: %A/3H&= Rf)(mP,ڎnSLՀL*7g"GNAϷ^N pRZ IMh%n )C因j Gf@Ga TF*XIٶ*׺>5%2c!u#rv5_Orܸ3GF^a=) _C+:߯2@7mF)Up1'Q=5\RR'fffzFJ ( رc&1LF7xp5^FP+ i"^-oҹN0 A|P=p ;F6i#;CxN EeDO~\}|C,h=J~3, :ך'*$)OՄ|Q:Kv|.gNGN:eKHw{2 B]fӎ fa&ߜehD s`9i¶DPIN(dpE.-$A(퐘Fmҏ}+)Fz},έ~գc!CZ4d_5OQ! PZ(5Y eҪt)r!EeK<LR+5yK^!:9H۳g?]2 1XHbfB /EgϞm& pJRQ_ 9~E|:̙3:J_Oǡ^"Z-*_onnkkSI)կ~k^ 5>\''&}x-y?p ;Qy]j~Vf _c۶å@׼[ Az.Gyqr8vs=f$rU>p}GG3T͍2/S*nJIyhz;4saBHgC̍Hki$y`s婡WH@-6N>TBBhk,$Y$4bán{'yT뜘j: G[jo޽{uBΌ}`߾}< 0jOsR*׾sكN7M. i_:eaxx8-C>m|m?EZ qsu(2ekD#"Q]h6EmR.hq<3+"+yX羞z.-G}7WkHha o7ޘGp:WQP9ӜȴZD4JÐ?X3\Eciii(GB9+JjZq{Ke.D+=r5W祣(}}}=9}nDF8p|D;NJકTM)#H~r: q H7/8v2J+,y=/ MjJdL2P rDr).nwkQV+2D<*^(-)Ɏ@Ld|YbMq>dEM64^ !) bBwމWx_#{۶q70 wx'zu_ G8;ʊx;u#'+t4ujE<+EN+956Zw=orAC,] W+.C\}{]R:>cxի^}v|2D{;߉fϏ"yȝ5S6|qт1}r(} %Tǎ6B2fyr^7<"皐 O"6WB([-(iͶZM Ɏx4a[xvظDi\a'b/rnZդT@yf|OA%|qF#ݦiO"4!:xP ~Ԩ8x|$AdH0@sSBl:I4W`͠RG~pwkdX|}8;AlذA#ܱ. k111w}=^wW'`ƍ]|Y_%U+g$ʼnN9𲬥U zt8~VbR)G"gpW$uDEM~rڀwbΝ,'1 xѴ|N \tI_Dw}$wB#܀JesiT*.Dk~mWӫ oczFCy7=G`Bbh7Yܘ{K_2\õ֭} ZqLK׸%'Һ犢\nltpQ={ ȃ/ef=/M7݄WUؽ{w[x~,^ԋB:/J׼(m0 z m rh.'b$ Lm~kȋܡT*7 o|Y;m^DXt2)6=jI6}^@-Jy_>kP+qB7!NpEM%Wy4;k͋^Ikdd[Z43l6)i~_CÇƍ{ZƮlT*i6Ӽ4æiSw`7952Oe#RT@~AHA%l:&]7n;Li" Cn d[s|M$偄NFƁA`e/"~~@k>v(tOi=c=??7ވɟ 7ܠ.$Gkii~" iRϡa_6#!X/3^>͟w 0 ttO=:_.'#_OZ^x ;(V\(Hڜȝ>gPtw>El\It{ii)a &mt_;6ՐovZi\U`7;I1DT ^*2P*QZAӢ]crnEԭS?孇^ oRqw#}?ilu$BC^;߸=B|ŶmZ-eGO`MB輹Q'N=F?UAQ*X2FoY=كG}4S,oq+2$6.Ĺ@y|K_OtIcM"GRxҋgϞG>Fq]+]BZ4LjCoj7ס @FsV.=;;՘ n5uhV`Ld.x$sZm,--e$ izzEk9M-BWiȓXy*k<8jtDr[RP1::+[e2vxBj N赤'[R쩧t$mmnC0 J%<أɜ`[V,jە~O#)OwWL0n, ~xDNdlB8FC੧»39n3{/#NrXf2zrkFr`>Y&p>O 1K:|[nstR/"׾5@?cyޘɓ9|Ǝ;FD(39qw.?X mfy{z 5 V {G&fr}ضxɫ_M[V,K ~mehĖW MP,BX%׾x`UH{5JzcHUB__)t"S/ J)=$LJPJLMM"qa``@t麂 8EcwsHr"TBu]Ր1/<\\J^\W$o8h8uFh@3\Ke\|^D)'Q?Hu%#;Ž/IzR!"?į53 @+br Cbnn3ذaL;eZDCKi$kOI)s={VbflӺ}jB2}1Vrv:X |ΝmT* 0 MNq)*Ϧԗ%nWW;;ضm[3՜8 EyCC>MLbeqqg| ǾN2 !%gjwpߢppT/hٍ뮻N+qCƻN.L׾_Oޕizԝ{!爌<ƞ szЦCoC\ӟ4庈qWh4P2H"9U*Om@%6!`!^aĖ-NՐAܠwCHh1I(p]7SÝ~N%9Nu2ks8*I<('=yvލ ,=9,t="7 C _BޟGX) xp>u7pP@^|8ZygC9AG/?ׅ.yK#@/#s<'oOU5B`ΝDYyiR5 A*e}Km ?R)\>gayf@hȑ# x;qD69pY;v̙3PB)N\;LV#x{ރ]vuEbj~@H'?A U KBDuDQzQ#HG4&B`nj Gjv+1ܕB NB(폓S3ٟk^uRl6ѣEID%/--oop!}myÿQ;yCpQ{ksOƐrϣV$qSΓB'ėp]?.\j Ay^s-rP$C ߘ鵄pȩIB ڼiLWaz^G8l>JڲNe q^;mk۫N1;=[3Rܡtn `I-YMSѦtw3Or8^OTq"6oފ ΣvaVn$7"?&%sI(:e1 `I;g&ȧ}3uvNkp7hdR}i1rTc|ļ_Mc`5_<{/كeuDbqU.jH?JTʥ/Ikf'2.? \\FȌeA>K{|6l؀=3yzQ_oഐx #-&:R%^y Ɉdtyb,Enx 2TMJ|*!vq8NE`öcԩ㎗0L^ $jJ-/[q"B6rc(35̔4E l߾bQ_s.7pG8)[>gN:imyD#&[m(N<SJl+c޽Joȟ62Λ7o۱{np p6-E4)0q9rgϞسeuWҶ_iB= 3oKQZ~qxp(AS 3g#͌k}3e7Izq_I-9>$.jZO9r|y'(IQ>^,o&o5\4y7i+fڭGi0:E&Ҏ}y#)s + I{ĸf6E(/r9e¡;\lK>G4 MT!{Kn__&Zw8|0 BF CҮ^g:ܼq caa!6GHFoʏHK9o Rxk^)wT8CDKzx3|ƳM~IOR|Jcݻ}{"@rydyy NoGAyn:RG⼴+=k5dyC1q L''Hu"%$ u"᠄3@=yHR)az 2 Į]P,q p$ iL*xqLLONw")Zo\s><Ѓ!#'r4WğMW\ Q AG1z jiO)X7׾ؾ}JjqW roWrL|4نaV3gq+_AFR.yϹ(:6|χQ,^gE7T*Ԇ'p7W3$h'ӧ1??Wћ_/9բmH3hC*$#Eb-\벓zyHC8Pgg]ƞ+tjD-ӵ#ɫ#@杻ƃ8+S%ubѐ΁x-@fYfW^vCR7F@'EfIpCN 7j4TF8Ih!`$II-᧟i {_T  ). (f+_Wadd7tvb0 Ob-,|RU ->JʁC&OiZ: rB%y=;2z4iJ5+~pXk.ض!,..ٳpBFZ˺6_$ұuVԯ#M-|t~^&/E$AC|3YWZU~!Ȓ^s?z`vB U#O RjĊxU /!G#d'C ##uD'q}uaEg5%r\VBj^۷Ch4TSHwB$:u .]RcVQQ\KSIALS>r= B?-BȤRسg7> 9*T6i0 {E?SÅuxJ(:oWJ FW!կ{kv=+ ҍ qzU!N̑dDɖEhXbM74.?Ocddwƾ}2D-y?{?MsΌ/ĉ8q.^ (CJ=E`eUrBo:2hmD&b ;,..fkzV LJA+b:s#D(7K|_qԍ^7>?R!o].B95@AD:B{ HZUIƖ)[qQ* j=Wj_4L%V 8o66oJܯW:5T$IS'|Rx3꾏y.>LHf {ux5%7J);wΝ_װeȏvޭEyD_rRLqnj;:xGqh> ^I}o ެd)3DK7H6@wĥmwQ!wc4^Gp?enk^Z"=Ԗ07Rэh4O4\hcs0 𱼴NDžaKny\D@X,`߾z|ѣKƍbcxy G))$R=KB]R=C IUI> b^ϦM0???G(EkWU*]b܋37ګ^|U(ZZ$~T˥(*6 i\70nÖ17T @GE@ 6oي.oג.\/v?Tyy'!q"qF8Mhݻwc޽xހǏ_~+ ^T <7āXuyvR9JZ+ڸ]q&:<|*W>9MƅwyN/Ч`J5ϴ=zGEX^2Mo.gmL3xӟEnQ(FYrUO|Td'q!Wd{p;ޅn8ɏlǁ&=9\V7H@-Ai@m;o7_^wp⥤wr!~iF:yMe-5w=B<]+qȑ7ch?yRP di/ Q,gϞ>9Ih _˝jf\Z*%߽R}@ED\].j0ӈ<* },"X"T¡C8===B5:GGQEHlp%1mPU:u G=ZB&_0 Mf[.166WxGp}aqqQ!S%z{_ G5y&ƣTMϯAexz .ѣ\ZJ8qs;^xΧ򆟌E?yyp"?D|nwƾ} E(Ke\HZd#CiT^f?JI;gkH!]2t0F7UGV˜kd.v&nǟ9@E b҈ {لS(4LaNSvKS=LquP[^BRETmmݮz)%Q>%şs}0R~#]vѣ"AdCU3aٴicW1~|%|xTk|5%U~BaEzP4)>TM}g`CUߏb i"V>wYtE)$QP Ph?l7 h9' B<?Sϐtݑ7k -bBm݆n <^t: d|gK¡!Uڐf?oνi^}X/D>h`iiK5X4&wJ'xq=oΠyG-LΟb+G<1;\_Ο^9oD CXpv؁y4u,/.!Զc ciqa!#O]Ti5JҶhYغu;lDi4M  X,MO?8w3H8q!S.ǛI,!r܆X^{ތj<*ML8$I"^AO?חK^ᄚZ*pbܟ^p(Fi L[9,bqp`8n݃u4ssu<G0%XhD!jDBR Gutd$ʕт,p *hF#iNnÎ;~h6T*]uW:%%\ iC "{i%Bx$4gy9*O@d*. jEmi9臊ڭ*>-Ty aZ@B*JJT]1qtfFFBQØ]@Z]5bd&fggP-k_j$,˄zx׾NKLqo.U8)@+ 155 \DOg@P87}?i"mܠ/^E^{FHZZ?X@)>ǁv} P`|&4j54 t' OGABRb?W O ۶mî]-oD Kã,F{yM:&t_x>Q/!&'N|DO$cANzu&xLE cƍIH)1RȞU5!!54Mc¤q XHD̈+y7t)$P:g&󇮏8|ke%mLUW5phLxJn9Q8387.Z&(^ajanv='=P\={BA;)f'N4100ƩKE!vv 0y"ER&O*SGn2GUFHʸ|2 QF.P(!\S8Ώ^̝B4 ׾R ޷kzi; Cl݀!H DA^Cci ׅ8lׇa@eC$"3xha~AH@JDa#Rh"Nkl[&vsAD)@&ZfZ>Bl^90ųl8☙LD"G${V|www.\M<j8q]Ǐqh%E|#S{dÃ>ITDw~8z¡XfI|fMym^z+A3A p9xB+Ek)|&DlO6i=ІLS?7X\>25\ݻ _* qQ" BT*qk!NBm#H:~0<υ! TUX*v,Z@hZ^@fpp~`jq h48v8?jOE8}$0(*}:}&Ե+~ǎ"9לCG"^BٵVQ@?ǧMDR&2`^5;yg҆m}Dz]^q%B50 QpO7}X*-ĹE|mj0Dh\f-W) ^};L2aTK( jBʨ/.g[sz1 յZ4m~ Ob/Mh#ٹJoO}*iRX@GLf6ozӛPV3Di<'8Tٺ<0ԭ~W3+9H@c#Hu!EM1Z ܑuϫW#1Q;y7|semL9)1R: y9sFm/Zf,yρ>wh#u"q5X4J1A);wccc8Y| Nq`iHQR#7s͙< U'9B6kx٭^Kp-*D Rt.f|]`&LC"Pa&s|E A# X h4BBɩDQ;wRd]pjFFF.7lXZA@ 4ljkH9+^W鉉 <n[cf$9:QrUF@J•Qcccx[ߊM6eGcDsK(K,<xLSTKQ 10b,4,F@QCL(n4(% vF!|a5:6<O$ߋ0L _E$D\D"c)c|Uh(" $#KkěQs|CpܹɽH/M<}ol̇P.fICEj(ƍu͊=oϭ' z!v533Kr)Oδ/t.@SMM42(eǨ?Co$::|0*VIq'οv5uh}lħ&BId4\Et`&.^R 8^#/GF*RA<ؾe3\4¶>vmۡj9#-56myn 0{ӡѢa]zfFgw?ZG\s FFFC@{5P,|T*^AݰaC.G < RI2xKD4H! %$%܄$Ą{lOۘj!XRb*v"Qry{/~WJP<*pdAZxo&|_@CxM# OaCƂÅ-!=AMix9;+/ˋPS)2Լa-'"]ܰ@rP?~O֭[3%ɌAh@Z%  |.$klfHzU/;cXZZB0׏JR""HD߇Hk]JrfK$sI"ߋPoP(2R(}7ns4B8Μ92|>:UijiBeԔ5p>qz#q(s}AމB' !~"T YAEJ48#+3A (J`TNCӲMNS>ɍ/{8DKj^~qt8Ƿn݊Ǐg|WCxV+g뺁Ѷmz q$9ύokym2@ZŖq߳O>uK˫8䯷ngZM,oahhhu:1 R8hPN =F |ιb)3^+9}+97=>ϡ!HҥIFl0xʿa|F/\&FF6@(* 2\0Q,mFԏ45B8s4nݖ5ȫ(zuV iP qx#  xE9|>pr+x>.ժFhn\p?p;|^N/`rrR<-Fy <c0=5sgNA .Xt` )wݍg1Hwh7,/]w݅ -4??˿[&uK)izA4vkA|sw#WYu"Q~w4E֍d3Y彰Gm>|/)7x),}vضXAHӀL>"t~b8*Ju$ qǻ^z3ǩ' HIBJPJ&ǥ jzta`xd$Su0;R[1lH bц{LZ j4ZtR&y'|]R$SaAN@UIqNP>6rWH#/5 4M|_{ɝ 2RGԔiՐX EP|`p̸nl(IÍ"؆PW@ %DVǍk F@IsX6M=:262(oW((˂j&B7QʶL#HZBA6BDOh_+\*6krIrUD('=qpwg<^_ a狎GEgx8d*%""R;_h`qq ''q$LY/l뮿7|6c``]w~a4^ 9YR'YS)*%0(e5 RK^)"#=d3!T ȵϳIF)Nkš7]Wd$mGlfrф$[Ѩ @RBQG{(tDW$i& "a4bXrAѣ|?Vpl0Rb! ؎{A`|d6(NzK* *}ِTX#T!J۶3;1z /^HOUzO|ޥ s˲cΘ(rhķC$͏ڨk|OӋs^(j\:.˨jjАޗi?$15ɻeЕfϗeRT݆y0?s0`ae}c uD\N sN*JN(DƌE #&&B D T)NWSh% **|l+zoB5E y?'-ukb ud3x:qb w%bn (+(K(K}O; CrR8?jBpqLM "lټ jrj?,Aن?! N9Vф)N>`HF@eTˆP855Ljpk'>߮7>IEؼyA(⥡q G{ƹs3+9״XZZs.?/FULV#ث‧0:o;ؗC~R(H ')1a iPQ) Ձi?_ \7= Bt TbHTlteaB@* C^29ZPQa8ai3@4Z QB:|f`l|;e`U `D3˩K*  uL=07rNix.}/ǮUTeەRbii]7`IZׇ;#A3#4q :!s8tm;T`4Q-WPmwX6 @iEf2{ز~MW008J JlQ,ce\*ƹutʏ(a՜#`qMDfxi߰!jy| Pi~Y~Kz$LSj%8.T@7zxb$K'2T!c<6>/7 MpiicFQC*أOo> )`jzgϝ!$v ?‚LD;qilϝ4}}(^VB\{p5t-QaHa׏%NǏcR4O9>?1XI2oXM0B2WDnd& ann###^g$*Dܣ0]ͤ{#ϧ4{*=i|Ӷ҇ S(;.eÆk"!*-к0 @# 1q!Ǟ_ c/ؠ!(@@JA*@ESI. R<sYQ`(6v˱7Da C|ezoݴN@6;(94BQa7CTE(Eu:L&jN! i-JոN}O= 7aNCo Jl}}ݙEX,fPN$ D9+- h9\F':(:%XҀcYQ>%mX,0,8۲a9&0wY=ma}S:Q.Dؾ#C~4-4[\ũjoTD(3~?q8q6^ǹ4y)ƹR'WWgeRRYm"SHe_Hɡiz gyDN>kyK7n܄VDztUQ`Hm HDPA ; _zs> m;{gOƙ3Q)Tqb!! jQ#p 6o٪燔sh5,LMcqi B إhK)a02PT12N$9GcN*y$Xھ}NBB=c*'`' x7D|3̋< yrdiqgrF.gs._ F%Jpl;!Ri8RJ:h# ! i #~|GT;S""j0S9J$ @_«n} ؏sxQ\YQڈyZ4Vi L.4`|'7ash,tnF?%&>1fe`uUAR3k+Igs saاX( H@{.TPM#!a0r18Ôظy3*v|=Iii@6 C#[-<}jT>2n<3=( Q>Za\a9 wRM#qdp\J(plcʁ!B_߯:"_Hj^@^{5tk4ӻ嵑/XPǺR(xL{a䮻:{?)t=6F@mӋM 6l!Pbi_y6 c@ۇI-A *Bin)[1o"$χ[ "^s) <Us!8#|/@AJQ*j4 !$dhYh>.V*xջ߃ړOb_ ^ bQۃ,q4" Y,b䆛T[g=i8 ò`9%(%e5,-8`ƝitKZGEػw/RZo9\%|虨VtڨKTaUBBX@004LHaI{V#GO`znvm;u:m`J ā"eC>y(j5=gE*\o"=WbeA^B}Q|g=npoH=HJ)lݺ G|!n"EU =zn y.u"b sVӝCk(W8ZRn P%r0l *U&QY4Br!Xߐ~"B(ʥ D)t;kb#`vf@L+WލgPAА _]* KJIq*K!rr @рyNxG'v8 cJDeL /0TÉi41W g6x8/,' 4Pٴ ݸvig/^@Ԇ0}S0.\XFX!IP:KS8<86 p" +#7v+߯ 9g"6<϶R1$&"  oG=)bp۲alDPeZ0mD4P(JBDQ0z@7;xr;Ql%i$dU-Lw|/@7,IMiAH vow`O>z$;;ѦV,3ɂpȚ ˍzqS^bzIF d9dȧT4eQ$2DA`Ո\%O V( ChDm¶ /CBnJԙK0Ėm2·eY|/&F! %}4- ihbjf Rlaڱ9wz @* Âa3;+44:u:I!5av;2xJ)cy9M6ȑ#qIg36F\.u]>}/}]%5"+i7W":{/Y(G;uR*؃%횀3<фZZ0m yELͽh--p,S@Q/B Ԟ~ S'5j iF`di9(5/9?SG `)%$m|}f~tl.H Vm e0F )B5xmxsҖͨ^soz4\_q^o"t' pkp;]* v_?ʼn Eܰc'.0JC7=??jW 'PЮ;1.? Q^GEؿ^$r5snZ 勀w3MӓضLS"D!B)Ppl8 3!nN˒!$: 6nچ{eڂAi@aPA !0Dةò " ۆTB+Xm w >vk"bE9Nni|0W*c5xjȔ ٔ9gux 8yC>_)BRQ[mJضDu` BaH̓ ӊOavaNiXACYK!H4dzQ l†h6]9QG% R`:DZB&,)`Z>:B*AL6Vܾsi&H2O㊏ȉ"wb7EZ7 y_臠]HQ'B".|XneNVr83 A)w % i2m4l;0 ӳF6몛0 1y,&exn~-l: `[6D2{@`Ӊ5Q _q;fK\Gz'/m۶ɓ2qՄL; :O!|6ڞD'U0_zՍ㈂&h_HAoCE"׾"3BٰeK-}]_o~J8 yT&vx30BO{0t E؎]eu"R RN&BpuDNsX0 `LLOEP60:RũjyD^ e@Y͖18r&nM6b|3M:%pqC]Q(3B1S* ؋yLLWtf (586}xq2W[^̵^/@Z 2 .C^7!]O=2 8~a}v)!?FK=f P$6[0eHB„)5ODei[|aDžgbdb% <H\'QشV_$'j":f e(ˆ~[SO,ግAXVB p)<ՂcΣs Z:f\$-\g{RՖ @]Ҽg)|l+޶p,ot'GG К3cpތ݁a\r ~8vݨ38g/a17 D $y '+e1ZDk4[:f/!BTJZv\;PdSV!LÂKO)0f ˲y. o@݆阙E,ĨbJz,W QՁBy6i@0KDB E7!)KP(dyABT(/ꅢaKKIç蜄Z4-< O_- ;2Mf BHL01aۈ! H#0 D)i C%ӄRF;!>©1::эM.Gv`!hw 0'/ eNT*Y2W%y@O#}XǶ?1L >rZrre^p' $f||#hZ@A鹔:T$QVE1R裏UzUy'+<5yJ)HCBrM@țP|+iNk 0!yԏ>X-C$ {aZPaı2$@")Q΃Xd)$i;,>L{±! Q:ۿAc(l܄j0%b+ Q<)|0/w/ɋPR(Wzi4< D4a$JwZS7o(кpF(@D0ўFm A2B t,TJpf vvYQ&M<)֙ !bEAi؁1( 3Rd0n*%OCDTDbfpJf|߁SPX2C9m,.!}n E;mH H7~A&X #H;V"TBƚQ!cVxcBR&(ljk^Ad(ɕdW= ȗߤVf0i!"1пs^0J;_ZȥkZŝKWs$Gh#cD)T.8V10(j! mPGQ,W0g0D0(j1 q-arz.4 TFP} x. ClHuWP7Pe[0(R<mσBD"6nږՓOGQ9_E`6*e@Qku\k`~a9+T02.]o[xKoѫ?BcjFK@&K`IMJ<N(;9hYd:V6$*ZIP0 ,!X#DJZ7Qoa'Bz” f_ DPZDX~(j' ?̄-EDpbg~gS@jni@!\ԃhw 6 ´%dE4 DQ(!buBĤFt:AqdLJXXF X!cL{c>z XHJQ$m"u6!D+P(P*`~vwS"Y,N.$f^,ז1uhN6ЩFu<^kB8l&'#7/D9Ey5D@(TRFa(IL"nc*P(ʈTe,,.|p\108BxQH CiLLہt @v"`0B/*&9-./sR_X^?Lч?e$Ygibߥ+5$ƒ%.i ``,`9"#A@A{ʌ̈ Ĉr},Ed n9;ЯHSCBfnPڜFWa`_w C翏=~ xp |+;+ǜ%&5LFjv51h-GWC;w4M9|W<w^wY)QRn[ %DO5OVq ՗_XBMv;BOSkBpl5K\<cz)a4;`MNr͒dLL2|;I}qH>)4eZt]ExJ}"=p,WV,E 8_Lɒ7Da v|Ws>xIx\>ytb)x}LR|L| C,?7Z$2OXKΗy2T8~o?R2TXhzczr !U4!`D "`Il lJ-ВH}/^4s?tfQj)K@_"ķ)=JW}0 Fʑbܳ9 AJ*C%S M;vǖ{f.x(VvVRno~GTOW=*Vxbw 6҇@XyC9 &XvE7XwoG"ŇuÇ8:wQh__#$ 0$I@GűxhsFz_1B64]ǤTդjVBixB!Q=x?PdB*B tM!2m!`!K,>('ƀ ibQ"z k0Ƣ@JO_YDZPH70жw,~RJ%R|*OA%wK0 BV[S Y"x$-|qTO'?;еw,0l|.F./9;wéNY7xVZ!x0$UсQb|ڞcѶJẎ Uj~`^Sq)c'wGVJd6'Q7Ga-Apd±21T77V+O@Tӯ<9Q?Y ;¿-WEcܗ!I,*|9a68M(,5dL =~ZG*M1~_zϿo_}T1X.Gp'"FǏ^*Ha#@+ $Z@+E 9?w!M`TBdGMC7mK)lh<% T" {0۷OR [h?%{-x*T-w+:D&B1pU~_lNN~ʾ:U ÑoCvRkUnkvFI/Fb,ps@@jCv.)Fw!НĘV|dv,X88]е=wO1BVLgs/.8 ZgP!|+ RKGX-JkΗ,8;~駼|f dXeYϹ|fqX@V+[/gbݰ:5R*~-Y?]slc4rRkwnV-,HVD6 αjzߒJEZ]/#52BWDϪ=˛ݏAQ߿t,PUw9GKhn"Bh\㚙X9m?۾ ;Mu(3 i5OCr zpZq~~~ӓ^F6lW{V{<܉b:MpH(8n#FswmO M|x~L |k.({<:5͆3ʬ`lcAfmsxP&Ek%Miq{x, n7#+C#SeX|G}'Mݻ{p/OS /sI@ \=冞nh@+Ζ՛;泂lR:KhQ@ׂ \4J5tD5~p!^5툃=QbIz\?@#b ?~ׯؐC Hk?F}h}vW2}5 C3xOHp;Ga86+69 N;E0ڲ^57/YOgh8'Os\G۶89!"$D%&Hta8bQlw5 %L>r GҟT'G#CgRf TsjE]7cc ?̯;#!* "{7VcLB=8AFNr8 u0 K..p] "S#׹:PĉD|8eUFax7x\о!iww(SH2H% DJc&sl6kwZ)Uf!脝2W؏/M۾[3*B}Z #IP) Z3i` M9i} Ovאgϯ?&t Nyl{mQSx}뾳~ Ne>`>8]T-_nV7kEK|vȦ jxpCq:8Y5["Ɍ9&ݡe۲v . Φs>+v4͈} 5)@J1/!&׸cD=XCe( %as& M3'\T|yE2ˠljo'}3pa#{/~wZdxR87>17|5uR7gg("I^2ZTFQ>t"%' o^"֘/ɟ|q([7㜀h]>#~__~˛?]*Ȍw 5 eY"տW\__ӟ<Ͽ3 {ywR_sғݹPpvwܿT aA~?v C)C3dw6,1OwA` noBN9"V@/$RsJc2Q\[@b4ER/Uˋ9;ӵZ>p!B Db1!1"!Z)C`k,B;_B`Y|wi:){'w@Q uEh}קn4U)$~p$E;$A)mƠpMK (隆ooivE OBk;@h/#qT}c9?) xXe 6gݠ,/H%udXpC x1o(P0:whkFڟ8Qk|m 8|h$#=r'/gDDŻv{ӓǼK֫R ePQj{w/p횯_~۷wLOgL˒%M`"kݠ8-sڬ\OQ$gt=S04ncaq*zz݀h WSRQ%%;?;ZdDhJ"@iH;,M9tf@F#fkB㱹EDHm/~C=pz)C |pQV2W_S3^=e6Yb$ NFlC~g|%797 r`HJLf bs@J}",s.<P"B@E}lw.ӊ(<$DOm׼x~Mfg)EUnGF]ÃOѶ-}^~'a:x\H-ɟ o޾x<2NQ cd\lJA@8=  C_Mb$3f,E`T$I$6D`p20T<3WD |=ٜ7xhJ:G#no-|î; N 5-lpI% ?|{YHST) Mɉ6ZLخW%Rɔk3N7cW"6$ "^BRM<PiaSn31 T H׿"*|!ȈYJ_t˫O7orV!a`hVNMA 3E_Jh~o}'=DRIcp#FGT}<B/AC%=Dj_Rg,gDcѩ;{n8uP< yX<^z3 Z+$ >D0 *gLlNB|W Gn( q"=c~ IT*PTۇU"4B wz縫iT*HOıa G׀$C.w xRkϟ~-IEpBP0tW宭_gw0 %%S&5,Þs}vx`/¨4>L>[cP֌Q!;DHtv|qWc:o(d)w4'nc]ZkMk+?΋/Ȳ1"$Kя HQH)Y(ŇG?_#$%0 NZ}ucAm[S؄O^\2) y6! ҌۭǙzsr:z:?)dBhl n 2!DRz"0?80o67|39p?rz9^z36#BI̼[$o>0xO8 H((TN\.c\k㔨<SJ IV(bcD \D7_Ԏr#!_wkD$zt<$25 !'+":5PH;&vU-\f`)Gtpl#2?N *SԢ澾g[?gRM.>QږLJ)f*~<>AcD~5nR %lVm۰ݮ}tRRÀc{<_Z$UA^d[792$ HB%츏T"/Rɂ "$?U,ݎI5?]:aT56A DI (AHa\GtS j.4}O/<{DP!:djP3߾ɒ "Ahp-7#ؾZㆁg놫K m3NNS$f7_ܠ%_w c qI39oiPYs!gV5bKJH3RհYo,m |v=@OF*!+KLY5! wZk3 FK<4CxdYFYMjB^6G65i%I$sD*feI,]߱ڬk]O? iX,X.L&SI5Nh,oEpT"emG۶l[R 2*2>y,0Ț-oVPuD%P$3v΍+ɜ8tu+~(kIDHZd whcQl+W"ˆdD1yAY1HڞաE@aT7cUUil'{ZB>-C^q`B({ q*gK'+p?XhR#ټ=W);E+AQvf@l2ݚc1 +ʋ3I3,'_NuҖ爲"@acQN bWU$Jn]s R|:ܾ1OQ2KŌjZ~ 7ooo`?9}>mR?6ddanh['?zΟ,&B+Kܮ#~ya,ˏ/(ſӈ Yo.x]F@vx!I-'K O&Sq~>_1 =HbSU/p#"NCe3Ds$vO?DS,*CG׵ f &}ǖe9›8Ft]7 XkpÀN'oj6a 1Jҷ=>sg3v݈6*)? ~ug5N\ĻI#1H:}Rύ4 :Nie$$ASj6 Zg e7;53K&HE}DU1ZiM&$ّ(,in!-oW;vuD&i߾!tt>}FQ}={1ohGtj!zǡEyA[XTz±%VdH)YzBW]4 q`9㩞.X}qQ,j4: @'A z3Ntf8n~G~@OpeO$tMw۩k5Hhꖴ'a@Ea|&ځguW_#@6KILA>7y=i0[BĚ%$ia|A2 !!RC(M:}NF:(>gtҟ`\d&jIgm=c"/HopDI׏9!RV9]M92=ttiiD 5 <'>'6aL JLl]{#H=po$U&ZS9IbJAn_0-K6oLQvD>=#.w8;OX/oM;f 6\f}~d0u^Fr(Y$E9z?Ʒ{-mܱE C 9AhuĐA$!=0Z(siB#Mgp<щ! Fڛ#$ JiLaYJ̢kiI ڎݡE% #E A6(, !zYƱ@# W+ܰX"tV 1dDR5F&RXmOu5ܡ[AT Pӳ'0XjtPibRER=6v{rJ! ɱ&@R% G>]!8wݾA+C`ii:#2~@ ~&㞲(f! ݑ9%-,Ra ͡!JOSw$Cq> RJ)FQZT<9[p{A-"wVtuKpłɬDڄ1IND_^SV9 5dErw-,6rbSKa39qjKOF"Eu雎4S$EJ!'oI>vX@Uexw@bG} ǭq5"ӄ8^r8lktA{I2Y5A$uYEj #C)PLBrl@!@:dʤ,(:(T~wOhEE>˸z_}eqJgo"!)51o Cdr>IV'pR =jS&$y1'Gh7_m-1g90%jjz,f)]wzs[X'nKH+FᮡfOz,Ox~A}þ%,_\͚3j|p!Z>xw8($!NSCC586d8iEf ˀ),ֵq܍RJE5*ZI6ad۪@(Gvh5kic5)R-,lvL3YvԻlC_n蚞#Ci35Gyaٵ->q/QR wMxd3b=p`gfܭZipDYDPw& GZOɱ0j$#$8x!ISC/>xB{ZLvLTTGEbځaM:) I)XLǎfO%% x)Mϙ(KQDa9AʓT@̙%S!"MK㑲PZDs .tI%dEJJΖDqU==9g5O3~'0EƔTY`G[zȺ!_dª/w *1Н&xk)KKlz m#4HۆtN7oRQ8iI@2):#IGt#b'KSgO/PT&| Z<,6 %f*Da-RfZn.2> <'Q%Ie)\1}6GLT[Q}p dZ"GX¸sM,霢26c՞=ebAq$̘^Q~ïQgsŌ[R Ā$5'HwH? w t]OZ.KsդbMi3A3)"]vX ?g"DG7{CIs?_PN:՗47߰]˄=:毊O6c K[Ȯyo-x{T !C{P}fSHk Y=C!&E՘R[tyssL\X054,5qоXym3_N&1V.h,L9̟\Po6#M u` WQRzsT"Qt!#Ωk TńeM3Q)ww9ѧl}C c>(CG~V0ݮeuf>OO7\_N4G 3;6ç֤eBڡ`~97#rD_7XjÑuǠ"EYPcIKֻ5դ%w qM^-[BjH՜7,&%&]O#>ZVMK0 CrzM zXtm$=^TwIAcK=3=W ?ܮZ<OXK68eBrC2G هeZa'̮tw|𳧸c/8W53m ./Pʲ|PJČ3+CۻWV{&ϖV[\7دhcI3HrMpcjCS\}m?) .b <$ %A@ rT!\? Zf9RDm:Dk(яQHVyNt;h =jJ4p$YMS0=RF*%/,yQ`schbBD)in߬Q&zӞmC@L -ѐ'kԨz:7D ;nf'Tĩ_ D'~^fKgdiJ$[t;D[dHin2?$U FHo֤e-TẂ򒾯q~ ),6\qܴeEcu5K7+s18@%{#>3hHD[ŋz&l߾k}ryEd,TjHlGv㩲9F2'<|⌶H9-Kly;QFPVc(NbZHʄcR=M}`] 4; S2~uGvxo_<_ *e%eetR)Cԑ;,_t-x'S ͨ Ƴ nW~Mz67oIҌvn%xJsEczk@?#_ 7$uRR+nGn;{?7"aG[ *~DM>a eA뿿%HC?~}}O-=}]3˞LYL v_ # #WcTxs >͙m$yμB q0;EAU'-1t 2RcQ N9 ~Mb[}'?8-~jZѯWxO9|brw-msdvGi8{U0x;J#9_ZO9+~yz۲y_d BJr\ezpWsw\~RKZF&ag|9Z@`ObؼސSw[4像3HUNimCޜdJB1ڔ7*'AZ٬nIN}\s5g\REf5Q+CiCbQL$ 2 \ ;neuxЁqoUNQc "BpIщ!p4 ) -RIRipJ iHZP=CBp$yWcx ķX M5/06aZ6d9o@Db g\S%oVh8V;.Pzr)֊fwd,uaKM(jG4)Q mMz!/FchѲBL)~ȯr} sBok= )\㝣ٯ)KE7> MT/ґ'Yf٬d YQIAX|O IU1{o $*lj9{fX^_P]# ,Ë2_0@}2ŌO~y;"Bg' Ō_lIF}A\HYR*1bjR &FN&'T>ۓN5%RMRK Q8ǁ8HoּbBS>zQQKC ۷A$ZԔi Ǟ5h( #IIi v` %{D,9M5d=ږs#_aZز$Ud>1~b1FA+If ̉}O6Q*ߡ5FtV [j=.Hl0Fa-rvGF8Y莐$a_H@>54!Ŕ3vTW}Ow53&_ٓgwMQ)jçLf)ě[ 3/aS?[ྐྵKt_el]S)D!(ray^"W+FlJ&ń (ZvO6%aw@ *dݑr7JXGϨ>Fvt+þ&}~ aLRM3YL7(8lv%I * mCq6!;[5onOٿ};%3Yfx/F`Y v ^ݓWH/(qmMs~N*{h L;:"=bu.bbqfb+H3z5ms,  YlCq>G"8ZV'E`b<1HhP.i;Tg7 "Q, Zjz?xivdOv;C%i"6)Rh#E딦!I,hV MXnFyFX0ZY%/ +vHiVWo$g{8JFuamF7[ '&xS( k50(^ZHr "-_ Ngla on0tԳHf %C{DGlzҤ`j;B~wOcM+,IQm4UIvPkd:OSANFJ?b%Z"J5;J%)l'T]T)mkG:y7_[tb?{1/?V)յ(kYz [UE7ȫ MKPDRȞVI:H+0:f?[hSI-ԒϙD-/ }?cԤ41:ӏ)XPTYD &\@$"M{ ή'(mkVhc|o~B22IF3tY{{RSN b7HeQ+?br}>f@"4u4*H|&OlP "'I1[ȋ#ٙzZC4%ѫz)!1ɀӎ<%Cݡa =Y2*仁ab:Ŧ Ώ XƤYz"B` &/#"H&s0Ā4(a]#dGjeOkK?/2soO_ZoU` ͞K1W;Pi$Long91mbF>P10-JVt%dNzxudO/Pi!2<%$awq_Hqv\Nj ;\\оyK!='Kfa1i=%j܏ UBdr)[OmyOT1A'4g1oӂQ |s˖?Oo,#`CAyQ C2R)CX+\u %B L*j0P\/pliu*5/vjɰQFYe$R`3$D*{LM#qQDgv}ok }Ws)G!#R G&)QZ\G9Ȧm0_mX4ms|\D."[&$٬f69xJgԫ;WHQD.? ʑ)E:ځVTSFU%M Yqwgo`PГN'Yz-jFV{s3V[/fLjCpJ3LLŋkBPlV=D)-a"4pJ2ŒgZs6(1:TU($JEv()8/i8vpOR>!Mr,:&g)RY&k(/7+d?DF7TKAXZZA{XIl>0 $:]3JDS>_ 6o&c~:->Cٌ0RTeynräZE)$ # 1(#E3V#H. ʎMaP#5HJ86Gf˜ݶF&وn'c!:øKE6Z[uh\)sG{8Q)Ƈ1 :?QIF^l V dZaDj&D`ni -875"IB"g)C/1ekToIA94Ԓ|EF/riPZYof)D=$`f5qy %zj:WD#.'8UJ4Q UI<Bw|zWz3獁(Ȟ\@!llT9S4UTv^҅5o޶g<Ǧ)٤DͳO.oZ2TBfdٳ'%_O??2_8|28X2y~IfHy5-$UΓ]Ki(E2,e I$3M^Jf4:$b^ =RrO&L$YL#MtC:@.ȗP&U3!'GHǤ%D(O 8TX)$)6]yIV4%h%"HKl 5&d)&ː'N~̘]_:3;4UC,wG, yX7k<'#"3-n0 jm|a@ !brֱߐO2Kg9?CM+ 9]!Ruf7nd\IO];FО~Oߵ%gɋ eURL&=ve0 p8i^0;;Gڄж,=ȱOr$/ƀL5v-!dHF]ӐMy /~Nėw\))2Og% Wk7*UO1}q3Dע +rb^NН$ْa'a#$swl:jE"ReEDX:SYN(^mdzqČQZ.hwOX:TzCg%Di&:  J@jgS._""u JtJ__O w+^P_ҷ{\_#1i~[3|O5/iV Ҍ{m?B<&h]v%bb {jI `H&vRjA>MAEbD( fRrtt>[qL(1Ui,!v/_.lG19{6!`¡ێS#'yyjqN=E-#(麎INz4~W^aw5,4Oޑ-r00Ʀ`5-Z"@GDW= l;unIgD떛-wx#p.Kja-TU/[ o?Jh9 9|qo(3ajE hic - h[IPZYBAJٓkLY8t6(h}3"%*R_ҭ61tݖ&DȊ 1I} 9;cH&C4' YQPN O.pu"#i"TlaZW3?9*/s9=qutMF:+fyv}}o2Tw$4Ew8 [e4W_zl!q M:ܽYRaza-4~k꯿?)*I~`+ mwDmhzJ-i1b? G7Ú}?bO놡9I[F&vr;:2A*NE@:dӂ$Mi-9l0JaB]LiP$dyNGkVS2,L(O,s5wZᆎH9ƦnZl׮HiNl)l- snd4YN3\3,1Y RQ+U-s&ݡz/'Ifr ԠL3јD؂cem LF@PN 6`=dJ!E3$Ef{o;RLg錨-Ğa&%8HjY05̖8f2x"jU@%v=bL {3 ~d'ĀQڱx6G )d: 釗޲{{?BlFD3> w=ie8i fHd10LYaӂB o ZSC UF䈐a&(pC'5@*mbi[Ö]bϳ/8[^Ws\8t[-ibVL͔I2ezBfS"!-Zg$>xַ}R{E!I#ݶ.p߿waۿJnΏ~_=)*l$cr ?H#E %Oɳ#L3C#ߤdhO~WW 槯&+I2$Q~O #ѤJA(!SJ@뱵mrw4;+q ,|BxxO5ײ%e܉$#QDM9'F[A.T[gNZOjm "3>|K ۋ~TW讧VgJȦiy5GWWnӣe Jxqi-nG6cwO8ȇc(+[kԭ&\aVmQEc-qzQAw5YxRј҃iL/./:ͶD'nU͏O D_Jg8T$Urg/k0/9 |zM+gYMG ;OEq``;界{zcaV]33GwX=@ǷD0"yBhC 4ݫk#_|00FM߽<{Jr:-/B|9=ԖW|f`>'W7m'0fii.oUQ|?3SUn|m/ݓOٽ.ھD;n{wx ^R_]q5;/$YCwߐCBc1 ɔ:E.s8M$IY,~=Q[pgW4O,'O 2!U8ZZZ"+Վ@fXL/5xZK)We_}Ej-ld8OΈG E dC愪4U{rB@7~L l>CwnD" C cHmAX `E%3ǻ-tmW-ӗC B a#}c!2kIW!CBj ][sa5v{~@LqmEJLkpMKmVBPMr?QQ >ZTwAk] [I jTSchɋmj*H~&m_{F' O_}”>M#ɭcc,  u%[MID <} O^~^n/%Q ˄c4dRSIBT$a9g4m׈"6 ~;Ogl>' Вh ÇGjk6 2t +bTLX. 9ݳ")k5(C, LR*؏d9,f$8]kZ -W3oY~ ~ !_g8OO)鎟,}O~̮{W\o諗{wϸyug"¿/B'/oǖǿO<皦Ĕ I|4^l`ϑG^{wOS?.B|~{#'ϙoal=ΧO?|7N$lrOZqW0MpD/?O/;> +Rcys\+%.4nZ0=Ot^-5ӇG^|V?N\~?rÈ O~77;?} ȏ+biş4=šÐP' 9kF$q[BJtj嫌F+&PY+RĜj-v8g*S yn-{ƒ&vٳkWmMwv'|xHWTmE0 :^Txl^mŜ2:g.>yi5ww;:P6;d\GunDV2<7m?P5e$ECbv(QHBlID2l ZɬV-1f&G%+b,[3+}=Fα̂=<:n'jS3a^He9R#  I?wN<rYěƧfCw?hi=p+Z4I\Q?{y3gS@ 0ט.eOݠf:ݡ6WX _>cmZ\}S۳=waBēM}ƛ͓EU܋~vE-,[y{#/"*R@?B k>ϹP'DAkGVlZp< ݆JM})pN8{S;o9N #ЭeIkEvOw %8ں!1-A$T\&W%EE"o+LۯHS@^Ue~-zX\=Di#%DHz -}ķk:0 ormglkĔFͳRxyCL c-hgp>PVliѕ@=q:D@ x&݋gLU@7fͫHEbL$w}N%&44i (RШTgL a(,6 jG,`j"#n.Q" GK-`TMf7gFY[A)*Ň7;#U,flݠtM"[M22خ)H m5m^x8JO AΫA>0[G7=d[h1,)"RG80EuI.5s+Lâ-6 qJ۶a j *ȱ #2ENs峧O_#9i`*̲´0ӵ\eO8pSgk$m%w^?vt}', ~cNrFxOy5x3CV).w,o=]y)Ȧgeoi^mx','_?0Lwt$K, ]QL`Á˟o.gG^eDSŧW|O8WOxᑫϿ%Gϸ뫁ڑPpakZЕFIցJTTZC. {͇:m5y6-*%*c+$H/k(VO}D*nO,.H?fM9d1RʓD3:*DڀdU`&zO.k$ &:[\mj^ =B*aJKr=p62nVEL3w..u A)LuA٭@<.H\Փ_D NWx˗3,R3Qi*-LC۞ׯ_ [6$0Wu 68/g(]0M/9ƙGx ib93H\Ц myv9{B/o\<{~krV*IKƴg׼b(=o~5թjt&%֔=2揾k dG=K~F3㗏kt%cL4Y&rJg߳LG lv[~t˥f4`dI#Mu"x?Wo}s@7(Gb*$$Zc$)Sx$16o Ze*[1G.^h|p< 2a R Hq;(6ϟu5ip>@! %"2Z>_`ssA0% @^[瀽Hېc9s>zba+HɑEKU*Ybچ ؔ-H%P%&Niqy -kFtD0}ŴjWSZA'q OUX úK4vu1Bm;0P)1?\^Z+8F8RDDΎELS*1PJAVSɀYhiAd"sx?0.#9C<1DLlf>rĤK!يi0yF6Et>RjH',=6B@L 9"Ew,2bی%Dcx4qFB̙ yDHQRd5(ھ23E%V,!p+趂jY .*#2JI:apJP$eLH6 Hx ) ЅAZ$F LuR?d dق'fWL4^N{q:L3CITZDU v sOtmLmV qƶ-.:TH>wDEp (Fc )1DvC^R3fG( uj,o(H2H XR)xft0O!FGPpDteI)fFmMMeOͶox|<1z5!}ijfvQ'X*n;cx5EÀvxEH9r8 &d.rg0QL1 oZ(DHt*{\;Xv~Zr}Qqq:~h[ԥaȊǰppdYPDBD 3:eDOV,ˈ'zf "4!`*G7`Yό@zkibS Tд ' w|;30T[d`#u137s&y% [M)ΓDbH1%/t]p:G If 9$aRPရf\gb4=H? 9$y" %>יI,$2,٣IS$%4r!aeft@:o?γGH A8i&/HB0(h%'nb'VPb .ys)@tŐ+3EdqDt2CXǨ WQeZHʞfAFTU*"E&" 緎<.W$$dXl엑.%=5U9 68Lb\FXb3ӲPo7\T7,~ !NLGGC D*D%JcULх~"N)emQt%3GZ~|D/qH<~XSSw)%2)2!'*ll*\ȰL`%![TtY<VnzG@2]cc$V5F#(yHi!7C l9NgcސڊxE332%ƂpNn8Y4&9nPb8e"gO1-Kc ULS%7d 2ԚqHH6h$bh`SWd#KNJpK7dD&^#Zb"N,)"d[TD\DYT" y? Kn2 #ނO!)R@k/8<9_ikRN:J#u$.=?Qيx WQ4ɶ8+*4HNU_E (N8܌ <()A%2HZiv{<-9R ${vW*CoD>!bi(9gϜP JRCPx8ZrYOۖaIEp 0tc1 G сh LL~8adf|c>,{P/"p@ E.%l^U/~UQGHj %X3liXQǥB #r N,$v5!Is*5Ycd Bd&.উO[ωLXPK<db:O1Q *{%"D'XD$гcLc2jN\]Ea<3>/T\ k|yy!{<$ 9C _k,)R/Pi̦c9cjjL  T ^!REnIdu3\X\CBDԒk8,c,0.9;Y#J̲" 5rB2܎w["`dӲ|"N3&:5 Dj6aIx!U/ 2PKM(&E F|]_(1̃#W| ́$O,P,8bip8en!D*~|Dl X/3A,|0< 2p0q=g2PD|Gxs=":J6,)sGK^7+xF9c O(H]W@Y[oaaOIĐy8!Rdep_#=?V3DnTՎq3>:bJ~&ZGav#!e^|%|K,q$)Fr7?HdX-7|>c[l ʑ ;-ӁP2|b8 3INE$5}D: Tam)6 LH28EC(&rHX%9Y'V2yr. r1·KV/҈(Gm@o3Zx2.ӈ ML Q /߰w +&10m prD OL\GJ.)qa!3RI5Ġ1aVˊ@{q ܲR~Ƌ* UI  զbn8XQlx{xqϞ{g/Rr'?z/?oQ aOw,@Uvv\]`/~N9-DWjm,p?e:~=1펟n)︸"Ixpd{b|·7DmQ, bû WO6x{ŋ I+lAx-&qseX?UM[WjT`8"V٨Z9)tR` $ :E¬H&'}/IDV{|@5ii+d-l(A,niT͆c ܝF #fV~|.`DNl0BC&MQőZvnH"kRP$bt5KXLtѓ`IEDpp$hY(22L{ ZrC+EM7OOW[̄%sdOu-'Kp'N[ir }jI+ 4Z|ZYDg[F~Iͦq~˷L'fK!>Ӝ|/ OZˇb8<*6L@zCz!S , S"רPBLG Y,6=9pyr|o(j]Q@ QwX+,KB)3q9VL<±)aMfT7  !OaRAYO(әhNC+Etk0fGd$\Hضxj)q#b88L%7΢GXI^T3cl:r܍&%ZciэtŢQΫEBJfFǑ0](O+y@ojN@%ٝh&:65n?3IVe#s U5>W-VL\JU>-Yy'oŋ "wsKF_g<%P9QIHX(J]@o8?`PF\}}/ꑴLwKT4U os{0lՖ/9~%@EOKv7h""*ߝ!bu/Ds]=8PIʁy?)l 1%\^X6$#)jMSJ2Dzt7(#ѥ0OYS&&=J詪 c}w8B,&@#+|ׅI'7?G*˒E(ZJ'F@L.p<%Ri\"zi[yoPVcE MAt4'eF*1LJĨ *gx-FQq:8BQTF:3/%^90H=F8cF?䉥cc"BfhوK4ő#l (cr =[Iyx*$?$RPR(55Y(yfXBjF* aX﶐DКXTqf" 6pHmXAdyu贆UTBF®[ϵ :fGhУ"bCap֤٤EJ28Gyg̅1L KˊhQOk@$3Z23QJQ@L#TQ9@rFUԭw )!eb>e!'Pd/?^3^?벉}1>bWO1[o?~&4X ߟx{bpqpGC×wi4U0μ×= ^<77<|ȴsGbyxB*Kqlk~nrÞ_AͅZșp[ tvFa]d3?摇t^=qf2~/O}o?!o6i{8Ga>Y_w~$'ηm7'㉧Ix8ۑw[pd #qDtu-_1ޞx7<~uO#4S:fa`xYęJ.tO~{-L{ϓ|F{>2-"%LǁSUfS4F\ cX߰ɣB=vk Ys[HeJtJ31Lk49ы{ΘJ}AMs&iɅl>͖;D8c"Hn‘Sf $i'b'/aH ]*iu&Ljr g(PKj A@ P56{T6Bj Lj MRI!DEp ˜hDUи 6LnM U 0sJW,rY,FS$eIsZ  1&|3QG֒4nH 8*mEˌ +V hIJ9u¡DzsΎdR.F t(21늦,"}p:))1e6dJ .apB,"4~X/z%2SW p>]f)Xǧ%:]0b ַNw1V#LaD-*P/"2\RBAԆXAˌfVCd)n& ֬U DKH=T列&B#9k.yA:(a>`Q!82׸]%WR@IGr RVpG}rkvihXJkHёs`D,J[JkҒrrdFϑ\$KkhR@ 3F$B]c*3QH21O9 K|A mH}"I%1SiWkmh(8O$/i^@I|Ӡ,0QM>Mp.$q:RZX#n鯯q2DZNyD#S,tJfNwdR¢0D$OR:1M\MaeT$8lsd/xxD>v__ᄌ/ۯ8pAخ1N$*#8'm- jNc:ݱxikڲ@$>O3qb#S"{(%:g,4Q%E3CH)C+,B08!wHWtpLXVq jjt~Ve43amG4HkGNIu #=Ogϗw'Nnj{<=ar/ٟF hMs1[g9eAT$Dc) 0M>qcD_;7Jd0'7U 8Μ^xO8چH3%(\^lzA{"1GɌe $}DIc$xf E)2,%)DRʫmXx0#L1 jҀ,9R4*`Y"i!-!8 Jn[|8SD(ڠU%C8)1a؁xt( @\CP$%gd֠B^ӠSV Ufd¯q4`?&X(5>%e&lV#[:"c J ۩)b.R kj.#dK*DU' 9dx0f5-.,sLYkvz$NjD])z:N|$hÑΈ BYR bg dxFFhI֒aiū[le9s8>!bBdFWe=B,XbLހ_>rȑRk08uEQ?)æfHL9(23,a΁,?R܌lx(~Xno)e I 6[2,XgNDm))H̲"'TL"\ D.1Ij%4B?_>R1=pXF?V}kWY~2=\)xQ->G1PFn,\E.#$PjӁl12!&?@96D"*'RDqKd:dE,ĦEEmCk,! J)BIIB0IzGFB[Crd:PD<nV=1%Tsq3dWyfLd*Lib$yxim#QpÉ?}`aÛ[FJʄ ,l6>e|x'OX܀: +4R8"R-ӂՖជǙoqSOԢjTr34t0Dj55@4*]1L+HHy $ k*D`v˜ H}J t7$RZZc$*_%J)HD-1s䪧9%IV\ԎgO#3I*HaBA+!4NPU؏#in&HQx*sB7dU|5p/!2VB*b R0()RAD*RI Ą`)`I"n5d 1,JcZRE H`ۖOغşN V0j#h'T jwGSfvi8A=DUl]j4j֌r 8aU"E"gU):!S9=͟_?kų- p ܼO7+iv }߲.9#1pLq :jH)`ޣmz# .@!mΒBD*@ΫHeXlkTqYZjCkPBWLFERfdil5ζ̔cV-R$ѐ-,"'Kc*O) S"Й'1B }iؓDiYh*r+\llfd0/bD! 'OSKvd$wتn*DQk+Th*kX ~ UK XBkQxy&C)SDq"+AHIrۀU8!e=TAk%GyNB,dA*6TME W'J ( $%D뚧]TrHI$ %GH%i]ԯJ7D J D^aME#+C!?KFjυ3Fj]cVHR"$VH B]͎Y!]؀7я_Lv^VݠMSqߏ\MSq |%PɈbLVB8<\ĘLm+ յa -n_ԕ/8!`NnHrDDpiZnL@U{W U9ZɊוq ZMMi0+cDJN4 w.!DQ9& f!1* SɆ1S&hM]q?JD03 CкRR~gɺnPhۚ1Yx!_ uݨNlSü>41AW%m*/:0-0̍8)f[ ߐo %7?GՂ߭ϵi*>[}?ݻG=m6j`tTT fss]zK9?tC2*h *D`wN圣MpqL<vHQJf0bQ`;4 A-,RIS䙗lqoa 0Ʉ0Zx1^;3 hMReZ.ti2sSmSho }m6\WޥW@[g].gf_!a%/uDl׀ȍrhIom<߿/_[GK:\Tv۷߼{fX.:99岥m[ZYZM up-xՍ4v~yyD:VIQVWblD${"S8 EL6)UӨ\,ONI-L"oI a&2S2'B1ea:}J èkPv'(ms<UynիwZ`!] nϮr쯝ŷ߼UKugEORο|JYwVu:vQ|+mnw|#7r# }G-={n]C}g/ӃЋ'CunYѽ{y ~vg4;d8{[K>{~~, mֵ'ԁBtA]{*]7b4)4޳7H3T՘95dL&Ή3*mcJ"3ҠTr}1JRTlz觔?ƤaF,1Ss>} )S.y*ׯשGkӵACǷN}՟;+*wZ_|'83x>W E7>k}=zs'V_\rM0dIENDB`bzflag-2.4.2+ds1/data/treads.png000066400000000000000000000111371200563112200163430ustar00rootroot00000000000000PNG  IHDR>a OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs.#.#x?vtIME3 س 9IDATx]A:lɲ̤ V,pr\#pvU*e\"?<սHziIӓ>|r 59߿aEQo߾Ǐ޼y{(^9}_ׯ_7>~8J)v;}?|[Mx`}](M@k=[|;޽{ D֠(Ne9HH8JZ^Zv so *JhڟV10DwW1(B(`OcFHUGOY(YG:r⯏MZheYFcڟ4$E]ѣǫ~(B\GnCGi+uNekpN(}| @P@PD8Ob[2ce۱c627'gmuȏi{t]kmC9u6 AuQ,J)miphNJ'ufOo9k >؎;3b:O)ѶH5ۗ؟ 3@JpoT}).θpHP@P@P@PG|yɁ/rM*_P;પӰ"ߺ*Xk!/ȹ?)jv;zl'(PUѶmT91X.J|߉jĹY@ltg7\$1풔+DeHk_r(3gp@PGW ̜~Λ"?yr%KUt"ɖQHWpsY@("g*IENDB`bzflag-2.4.2+ds1/data/wall.png000066400000000000000000005102001200563112200160130ustar00rootroot00000000000000PNG  IHDR?1 pHYs  gAMA|Q cHRMz%u0`:o_FIDATx$|eT[53uJq !  E[(^(PPJeyf1{>{s ,MF C656'J]{A[K[MAm_%%%INfZ}--QWSK^VN^^icʦ:)ȋeS7(+ [ڊn)m]͋s#.>1:^nˎ* tlՔ䕕4ddd ee V,SW{!֒bkkO6Q'c'Ų2p14U7ŅuTf& tխM r.Nt2ɎLG1LS++rMT7Tj(u7-ub_//7W~y'ݹ63a1/zׯޚ̣cGw4]|~#Φj{j3yTk# =UuMeUEM2׮Ύ N{D7l.pg9ڙYLa 6Uדk%dƲqR]i|'*Q_GVz Ac_6PW{neQz-m,R܄h0[{dS,YT%kiT6Iˬۨi)CVV&--C#[*ʫi[YVqbkmfz6<8M2u p/Mn^{ן[?s]9Us-W>;s[u^\}^d?!8RP˕k/%0(6uf $c7'h27>0VUkc}[&c]m3#m;s"@Si dlXU.c.0˻_ޝ?Ƀ#Ó}R{z "ګġ~Fe9UuCM cFkS]\GġpY<;N`2O TpwozsdV2VnBT$͢[s$:IւhC33Pq$d4βCubwv:A*Ɉ[04ñuE“"SbzZKޥoέɌ[ =y;{˚ ck3L3G~fE[Uڞa~R^%%'IGGG pqfufOWeDH>L>KdI|BfG1S͑ȇxeemfmmgcPSeRMqaښ4s}K3aq9?CX媫GUQ[_sev,#*(79沉VWGV_}[+ Ӻ+fo{l*L  T#n210Dm^*ʊJWW[Q^U#&;{hsi~RОRWRgqǷ{7ͳ3ߞ]~tnwZ!g.Byx2= !:9BhkX] tQ`deضTjKM)q5륤euPuZbڵfB; X_jndN$(o\^M=m~ iT Нwyޜ?X_͝ɒd]n;08=P@GKyޯz*F[Z B8k6ڰAj͚ЅddЦ&D&لF"Fzn|&ˊheamE#i84 eGdžDx%Vq,CܢDڊFZ͊wp$=w ')ÝgnY|v~A"G҇GC[}|1$柜hJTeN_9Xcc}V[U^hZG&d])hb,;r{2޴a}l[`nwWE##-Qޏ.Ϝɥm>ȕa,d]Ⱥ kM6י"3G4QbQ-5T ZQ~nT3z,XfC1V͌l ;P5u5ܞ^]pz|b~"d~/-ӮgZ~IE}3!vztL2͈H vKnY~6/-&ϝgel0ڜYYdgaHMK8wja#x ]i~-|?K?,_ 33^Xcͳwo2ť)@m⤸o}jD PQANZZZdbAWظQGC]MIќsb[XT3 Ńjm%882Vf9(~qaKH$Jodhgmbhag $kϠdF7gn/bLPm/oQ_&wLo\3?w`ϣOvR2TW>?/1]ȓSQZNYICAy56:jLkcg5HnbOFso"O,'Ze4edT!u 5YdC=P]_S_Dpq Suo(>іs|9?Dyz8ϕK Al@=Cfz|;vnojɉ8Q[B !ą)Q}~Fh:5Iz}u /VijxwݓMKH2܂An4W{, ɮt ?ݔB$ 2kDDi'hjX7%qrŽNnɉ]8ߒܔxq;Б-YơW'Ë!S_~ҏI>_^\ ):?ōF>x`GXߍ{86d CEM$c1bi ss8"ѱ/~dߥû^;yG!\9(]~zXDWUO]nL(ċ-tpPwl~sș)UWfho #oO'ϕ5)[(-GWŕgǦGvWU6^<$wKknb@PWTTQW(C4 s.OZЅ_ooɏ{N{8!yw{Go{dcx[m]yz[e^{]QajmmfȐңTd7XdƄS5֓ؑ Z*n2Jc~VS0W5#YZt#Âd 2ÅWk2ׯl˝Z|tf##+922SCUa[}sk6,||{pS^3`dt`wv{yjc~&KK}u-C:8I E/_΍y9Z;:M]ٹ~@!m*#݁Fb&;9s)FNNL3&f< <utgDb^_9Psrw³'w,U$ppiVk֚뫏vcRqbw֚tqufM 5Y1I ݋_~ H Cݦ\\eun}ѹ@sNt~>t`O?JECrT&jw8) Ooڃ{RTpc vUeL4_;6ҬXq$&qɧ~:<|v+9[Ic^BAF tóʛW~efp+aTUΡ抴S{~>55xݕ_owGGoo۵&.Х8ij[mYj*r@_[ϦP huԴ8&FWzU֡tu4ԕP`ԕ7(nPilʡ;ژm4=uyUIdpoO՗?hxi$4GG:fs4sAUڗOIo1\OGR\o)Oؚ¯9U7mF޹ ɘȢV%-| NßKٙ$(t &:JlKDS"s#=#=%+Y5ꖗLcQѷ=0$(=گ0%ΎpogFbkMfTsqgc+Jd 3Qvh]M 7M5NtT\<8z.Ci'ljt]]jtpsyLOR0!x{z0OƷ5QB3QωghG _8ZQ' vЬIZj8|poϝˋ ͉jȽ>wۣsDWnP_Syx|[3?gfnlDo']>Cۧq*3lkC+Gnܞ(pbXLd#\];SkM_xz+NOaYx|n% ȴ_];R6=0RpvjչI= 7)+ qc&'+*\VQaպZ*)ERRA.i Vz:*$]mekgou}&BDYzr (_M~&p!ۖ g 4T `G[(wDL_@# m sG3 `PLMg@8dƇH?\/Ps7),#=ٞΤ/ՈmG27 ݌tUTS#$G9PVhP<cF R]i 0Ww`zyiz{]nn@}^sA|CyFTRIvd8@wm<f?W>L|֚H?'g.>qv(lx]W*ZFؗ3Ҝwmjpd_<ȿyw~yӝ#376PP\3#og`-bZqf۲itc.ս߿h[,K>xcʽ]?SS_Z|b߶;'FT_ط'&5_>럣=)^鑾 (4K.:o'n][`DA{_B671'Q2L|$]`;6ӱ$1*7|&;;@R#bMwWEF"6Y(QV\)(PGX @ݎl`m$Јq~ҙjdA21!i*y˒cx-yk$P4k]/leıڂrf[Z(JTlS(/F#nd=;;cv {@sQ\OZo^|l5V\X;R0\"9Zn&hl]|s#Ӌ?Э??ҏIUUENv' oP^lʱ w>+P_# nOy8MfAe}^\PwacAc5\y͕\A'x,PR􈿫'v:14 G[H+.ˎA`mH#$'gNu~3W޹/IW>`~չ9L:M^A̗Ίn-Nwg&y<ܗ/翼0ѯϡ.yvpBi}{apc[AߙZċ;2Όw*żhPQfzށi(K7n믿ƄBv=P󋭕* oow@9ؒ`bF.B2c]CK񥱪ݙ &gۉAjj&9V:V}s-,RRZW*8o‹9n{b\9zT$P+gJLdfm)O sqDorb5\WYbEzl5XHsN2 ĨGlml-"UեVjZsc#G<mg1Q d8-Ҽ 5%HzLdsT.ggDx}zx#1nN :dVQ#* qlm<)|[6 i-ź,#0b-¯@ sezI(Dv$='G1+h5rkX$$6^[u>L_yH{|T ,xlQb9Ni? c&id+ԇkVW\} =5?\0[\d¶4H{'w-Y\)?q>?Ke5m)j޿Gq°&@[3₌ $aG0@W1POf:Tpw'Dq@ V_`oQ{sMvSe ']fZ=mOSߖ:3EVG+ |?8 Z=͙с](MexvFƺ88mfFia>Q]wfJ;J EFMvt%/a'ɇh[x r 9I!w&{:gҠnµw./tnr<)&ʽ6;˳2׬Y[VUE%Tmu(vVh<)`">ᒅ6WAVWG-upɊeyL3,ζnIRQ(qˌ mMС̌u1!_ e;͚ϤI)ˣkڙ'z֗Ύ-Y4ȕI+) J>Ĩ Xf^\ `1LM&T C!~)qjGO4->7n+K3ܵ%GvLJNt} T # 9 *>@l~#69ĥ>?im1Χlo^R3Ȟ޹ů/kȋr&Y\sK3秺Jwnm.cNq1.V&nIt`& ГcA(qci!ڽ !@6LRЈ!!*+()5!Ya"7Qeaah!no|PqO'Ypũ=??׷jͭ+Xzs f#3 y>2S\>=q~w[s-e/¹E j,fD(b8T ??6`KKn~A#-Caz{EARj[Cf'@ Ѕ OZ:^ׯX^=>/̘bE2'IEYiPMee/0>(ƒ4ۗǦ"6ͅ0>1-|7hķ2Y ̗ð1q @z.,Љ+s+ _q>/HvhK7ruDW詘mȊ sKUZL @  A,MJ%O .,y{̘hOfX]LlmѻKϟ=\('ES} P5LsdpMq!p{pu4uhzjL<@#,z8Ix`~+-JHOj״ʅAn*12W$ȃ _ 3 xSL!QBb/-z+ˆ̧9M%>3hnh~WgFv 2T崴Uar ` 6䄴EW'̮ᆄ@(ЊKK/n৥EzHonsi՞] ⁝v>:3rjOd;+^-MAdExeGMlX~q24#8f's;X.VMr:t%9z}7o% lLEq$7'okCdI,+Ű4#d[m:;d t`8QR#dq$ Gw/W#y $_WCIUaPla.$p`y<\BݑuH/m9-uS=Pъ^V$`:0!,nN4@OO9ۑB\V9IBD8ȥ ~!lj\c[A}s&VC8%QKOuUG:3T M,qq?MXEzdrՉb.%ɉɋtޔV!b.h/;<΢gz c1۠$Y/.Nll*=@~Rdm~6U8O7ih(@PW23"±(-4WnDYy9eהq;1B+L/Nϋ ֞84ŕ#R pqD8t*(w~ij8 sKIJjr>fñFYoM.8w[ťʼn 󏂼 FxsSi8}=g'LNw6gTgxF\>m37ֹu_sΡVTylCήhɧ5yoodEv,k\yAgZ'ЯGgVe/]6WA+[q7Ȕٴ\*ʕC 6=(Ȟ!% -l[z၆l7>!a;kޜXWN )M?H=̕O}Υ[  I|z ?(#B/c}+rBAavKFd0liQIFF5VQTR- w AfXop$kq*mUG97:<>#zcsy|E~9$Bt\ H =/) IVY*@CV&fMpzrpqfy 9W(j̾NT,gNδv.\;YŚDL.&lS5T7Ǘ>;܃on??]c8j)K?}V¼a1vg[bS.MT'f^>DaNjۯ-֦bۻ˳+ey|ܾ]й\??>Ni'H'TbnF%UQ_4nXj5֬};4PqIrL͜IFVFau(.(((QA޵%eiRܾ1bֲ*7+,TKK< ͛kx8T1O= yѾeɡA| N\* h~vqz ICGcb!CT _k)Fu+r1{p}ʨW*sjy~jh h ˜HAb-Ѯ(c$G:6P@ޠ: o˯yUWh#`u3豾nN'6AAڸA |pgH qmuu 8wEvy(5(S Ĉ@ĈM9h%ۚR=N>ߏo޽鏷^~i [ڒ/pagT5ɬs`ZY!A[hjB…?bQI4YAARKl|D Fo7aRdhkkUNIrc<>ݘ8v~pvxƾ6or޺>W 4lHk)Ԧ8ao.N<%㋂,4{=EL:Ƌ&kA5bގêJ`-%.M )mm- *]M&fI;MK/.@_k+wc3,5d1TG7X$A@9+@{ loNM25s9{GUݳ VR@34*vN9Öwr17FhHLBsf  {kh6SXDtR݃p)w7Xthba Z.)A+pʼn .unvҡpDK~ʏp "hrR~d[#܁ۚJǷ|w4[/+^[jsSlR (MpA,ʔ!u[~S)VcAgoHK#_!~\67~^VD^KM% p{,Xþjif@$tw'V'JқeYQ> o/O/ oLZl66D `ӷl漾̱JɷJ[KW@Þ_~Kn\xx.0ia@ vRVoذQ[]5pDVKlX!׭Ufab߄:U E e*&z:B 7\^<ƵkD_ B'CJ иt⭓ÁΦ~8?{(5WWFma813vhװ,\k`3c=̣0GZA/F2^XS"Va5Z$dX]{}szpG;k1Hj**OmL +MS*Ң\Yt@ eUiy6hj:9.pbP{Z\=򱫧I>In>vd0LTnʚчE1[<25ޅi,bj lb5o%Xa53P]ʣ' l닓+)i)b6Zb .,`GUc ( a,u<l=5PC71r@!2?p*ʮ'7[LkHKvbq}mIZ*cG;׏k fw[)~}~vr6E7ñ*'oj8%4Ķ ߚi͊)1K':Pvg80q;L n+ Tg}]j~ÛK!&m̀+p,*Ji r>5pA )PEMGY[f1LsT cj:4 yqqgWVl iPUs"=:i{f h+gkyd}O'˟nC?\ϦCٵ(Xi "9@}TZgbj;8#Ա$^#Tk]Q ^Onc~K^ &2;5 }[JҀں@*!WT\7|O&۔ϴ06NБX {!gikUNO} V%h8u4߾G_ fhx qTDaPұCĒbXˈ 9bQ ^w`y m-[z~ !&BXNbt'lbʰ»fylmlX -lA`[i*mQR"7l6VYOgkdgT9bLJC*OL * Jr~vipIv0w+=6p7GWG & keEO_3)wPW䧅S̠l$O~rfof|Gc`v| QSPWGɲ1AsNJF/& <~LJW.E]ۼ ^cxo:R>?C&^jdgM6"ugĻ<]^և+η{} {|wu؎'56DZ%4ʂOlGǦ?/y173CfZ|~>;'oowc8tjkHK1ؔ,RϟG=pLϯGN4|rX4[>]x9Z )tK06_EwiӀQ7/-ZxqsK3ݐ|ͷ$&s[""|i Y(4KeuX27[QF |VTk0sX+%daJ y߾GYey{s݊twwwwwt#]J ")E݊5c&{}^~;vؽ{uNG80[SniCwطO/>ħwUe9a^vAwus%{E* emoH:|>gOrTpRd BМ8~-M;ʳMɀa9\G <&.N8B,!_]-M=Me[Vfo$`prȎ5 E]nf^Vf!.~jkJc{9xƜDnq5GBp֮^iUEfsU.6Fm[[pv:r0eff{`EjeHC0]a}Ww=}<%%< 9wKT 9`D٘ s}KL԰}4)׽|%,ZKuO߷JOwDV?EG_P"Z UiPnC8PW3Me gO231`Dߔk2д=[txK9h;S+_ @w1Df:[5_;i#9s}%i2%`FxC|o[G\Ll'[a1?ޔvww8Y]"}\Ve{pi*HcU vsVGI\B*JcS5DD{Tdok+u~;#b ^F||`pO+ -YQVHAݜ8dyl(n*Jx :Jk3KSH521yM<92;֙igws-oo~*29eOwa|ֲ2*#D6/=\Bsن)<=qwkvm"]Gzx&FחχHMRd1ej-t4es9,f#Q+-idE67>NdHnaaDEdOFJښԋ6#=f\\Tku pZ2Όl}}|?߿" OQJ'gɉ v"D8'f[d`8>tC$jA ӂtPl%*/63 ƆJۄ.t`>8YԔaZ f-ўަ1#ª,fGsFfi^UV~{V%:]^9%?E_&=`9QB%)˗NTNa).u4Eɞ)c__]=s=E+"xk H2cԔ\xpe2~EMxq٣ls{sp 5 YiyXB7;ks ԨwosO(x u+2Dwțm= mq9,9 ?,{n at@Ϫ;q|xPK: P==L>HV{k ,ilʍF2ҋv6Z`dcּ n;(,..YoS}.~htjf۾:٘>;LWNI+RHRԓ=Mňtu`gp20?SoJ! &,%ٱ^Y.J( nVz=80ť>O3y"Cyhߗ;' #zkbn!a<=>ؕ_8&kpcI7*$[u5mj2` *z%zM<պ< 1wû:YiȑX?xҘΥ-k(g u,su5Lpj]jb\m]zqKi֭>4Q0UW5Zd/gD0iIxVg %6nSaTh/~_ a-_^tW7~չwx=okmVt@se!!6fB:ih)#Fe"٦2+fKKH6mVW~zc]ф^\oPrh4Owf3P V*bwC=R[T"7y27{9g6VgdՕ${YI캕ixJ !7DO+_nUy7 mY۶h_E{E|X'sE[3=y~<;R;#ݫJbyZhDE:;r'ۂ@ix0KαP1֑P\BƄ62s6n+zg2v8?Y]bN84 EYN485G3o/bF']OKj> {זzb(0?h[yiorܖ[*߻Afk-ɺZňkjfa:I_a['vllYB0)O6^CVdlj̹<{䘯rxQC諩&8.`Iwd۸U)i*z'%D8kzB8zH;FEE{Hzګ;ySsnFzT(JC~(yp_Z#LPk;9y|zuhC]Ԕ9~lލh Pvg$_s7sETdvaNٍ-RHJqLϥg66Tꪭ. "pmI!D>睳G`#k a~`SQR~k{gWuiz(]ߟ iueWmFkeҾ @ndldbE"K= &>YYu= .[]T}fgս{zkJWKpdT΅A.ȍ9uo0X>$E%\# 9BNaTU1'7@1"͠"#8pes7[mI %وׂ@bNԓsw6|~eyHopHoN7֠Qʅa|&͍D5p0 I<'joFY"8+SB`ٱ*TvKVge*ē k3Ȫ.]yi1Yg1%W j!-dE$Zf>Vj~~6*)~1Iq1Z9Q6 Bnja*VvFvZYю; mfzۙ$ن)95̭2m@*j‹mb&҂Wibu_[\]Ա*kÚ;Yv׭*$(!0{3p?#:w'v=eȫ,:jsI&HQDS^ײ3$Cg钙K̜;ѓF *- Kw52-jdS]dnH 'VNp˚pP>bw[C#mEg Ĉ`oK ! egX_[&.rr*79@m?߼'`0/v Ord+gχ\xt_?T&=6a5W#J;vΦnh1fMF?t5^3mha>6Άzy7"O-6}ˌ0.77W|}4%:7*x[\m1 ~sɑ ,I^!6g۪XG3E[4ڴ?&:Ɖ(|zh=k ҹ)ȃ>DaC2<5B|I\d !ExByoSA [B GIāO*gk{Tom.>wdޥCV ԰8k6q-^9/5vg B'G 2M7)} 7aὍ&N?ٟ!VFkcq3w1ɮ$%B(t[ #91q f3mslxQB͈CyMGzVPH+Vʉ{raxRS~~|O*oJ߶.k* RHBU^!%cYHPA63s׍~Ʉ8ڡt5eobJ_1 64s."zr@ ԕ@![bgS~zdg,<>0#ÃI Qv2|=P1i1%YiTnh,i(ưJF QxJ3w,IC#w"H^Zt]mVˇvVzPSRn [;gCA6z+u{*`xEa,!B5OiB!XTeĴ籮BbC[YPx,([)HEe^mlv{騮&N&2[(ZkN RU[SGrLtF=$g y:Q h*aq͛c?;U?͚$p"ETTd1LLb64VMƮՈ0L&GmTRXhYS1 ?<Ѓ[[Oo$9*-㯗O q(,[p" )͚lj*dɬ?'᪦ld  lN j`wK.V^iXM2'xEݧI#G[vɓ0seƕ%srXSC_#O&:8Lu ǥpm#}DhAEGw~~ݽKo?gC7PĽ6w 4s+S/G5Yp^V`E1'ACn (pVgנ<l6ikk(-Cj Aط UIARN=~}l/}}lW]$3p_Kƈ ?zU8*`(Y]ϷWeE"w6uj׺d+ 6'$3>]徿aɍwOmF`~3>TN mhRU0Sa.+KEDǑǢO7 b?}L(I-tw4q6ݽ' RZv F-RRe#oR3Aǹ1p$2yosf$8_:ՑuKҁ$D~B}|0P/N2(#Ũ2KdcYAL07cf fr<#?KψjA٠5H@|Us` X|xgO3Ti3c,C"'@GBoX7p"%yNgڟ3,[$b?H/,>B@I&cA`h kKVpR#1{r˹&{4ڄF"%+b|qd|lzn4&TFh)/do>,>Ki2~wBymjؿqUW]VAZ, VX6JFN}pz | P/ 9ǬAx|ƚ0yZ\yk R (EӋ>/o%N4'gXn[j!() K&t 1~ɬӉ(B܄H@,+=9wk 2ϸ\B\O߹xxץ=tU'ed dϟijE$ΛSQN}g~ͼ싄%_L w#??D9|p^VĬ}B5/FsGNDWvh*jtzgN(. MkKTdlztNj.ZO`V$I%B.Ќ@WK$_+]memqhq3͈I %#^_gF>rmeCu%+8: |xE\HΣ(i]1>`MѾ1^6jrp|3r;̚9u_hWg(HՁPf5-eػ1rF{D+gF;݂S"o/;ϗW^c+9.Q@wӧE``S`j u%<\z*i)-4Sw3WӑTɏwM1{_ϮUCm+Æ=]7XLfzkzɩŎ&7ylH;ca!E!G:njKiRnmiX{el\FV:J5gcpWK]@k^fef}` q 9 TKGDGSGC]U^塞윹 ͘Iɀ FH?/"/lӐWbL \W'oOz[}lnv6" YF#by[I/䳥pl)u%0-Z,ǪVEJ$ @Cr@b 93r*%"6LuګL 2{$-\('wJm,k/h͓]ȫ[# }]F'ex' 3+di,( 5AdKO"v%Kˤ-,)AHHU"^|t(K)q>N%QLɵɘ^^=ض*54+1\ܾoꮈ{p|Co~`pիnxn!·g{r=͵A ǀ@IG| w)66eIQ\`Dآ7佅C%΀$0?-ўs`ڂX6Uu Bφpziǯ/vdԳ:5/#F)b9դ%8tI/Xc[Oj޵C~VJ?+K*J0$pR<ȞHm#ݍЦR%Q(E QzO/ hI\&/F[^PGCOOG[W:9VYCVVFz3xt55q" &W,ejT%-ggfL`qvlWGT?FlN0ܭ(p_7Kw;KBY@ui, [< d^ۛ|}]'FS?iH(^H 4HB,P "- ͳ}hj!vXJtPyA*5t29klu1/==TM>$cUw0 R%fGi[aCS)7Xq~|{ ӫ{x<;}!МMΟ{v䯟~[{zφ7=t{yWs1Q5=,Hn&Z&xYK`jll TLԡ \A8Cv#]4{tr̦gBw goc7ukv$xTƐ0ֱmVIATıU@n.ªL|hkpGue$;fE9qM "pV;zאGdOO.{sfrPw= U]%"ϝkab-m9GAn^Ԛԃ[=x46ܛro/a!ᣝ +eHUO3L'QJZdգN\Rt0YbsAEi~^"b.˔**+T ( eƏw{7JC-2d;ϏrS[4D[vb lѽ_=*-Q^P"އwFE#pnކDpo{NN%L rFZܙ)wX4 57jYX?ŝ$6hođPYE/J =74:Da1]ǝѿV(ᷓG ;_pkn||r[y' @.KΖZ04l(2?=ccCE}{J~\c)h?kNd| jt0.“[XpRGP(b2cF,hfD 8z(@TB}fX,#!kcajib%ӎHc"/ 61cck%$:?c \,`qffٽCdb}4:@VZOE 8JIu,Ak%8u%|7X*" #`҆W%"|7Y5@S\d:n8>xIE_GvR'*S-3! ck#>FTݽutt!ñDٔx]D@F.og3oeY\DLBS&M^-vth>syx2$-qTxTfb!^,T+jGK382JS.\L8RCq.i!sZ(IXOISM=ՙؼ@0OOg u!}ٹ&ӊ`_gG@!~B[Zv4T5hx*j|32ҹbEPH1G_jP 2~wEQH=_".|ܐ\?_ XSbWvզ%L;1H/ӋäO8K5閲gP`tBHj:Z8} РCj B'JIbš:eDRa¡ws+.U?]G#Cьݍ3؂ž^۳)nR I?Y!V >~ySgυ#;N?:eoO]JۨݴP“gY*KbJvÅc{o2*cܘ>EF/Uu@Mm!On͌pVIΩX8E\@iXѐEy] zj/@e%ik ,h0Q,P>{iIA@Eʨ).!!n֦eF&+ e-yH8)jrl+%- L4Y߉x"j|1؛*+{XY}Ƚ'J $-$Z[]PYAMF FM?`%r8'z|C;_" @ד C-pz"離$!'0 x?}y|Ԗ;]_[Zem, &—CゐSM9 Va#/>Z>Hv*s ׿#$Wє\ ΓDisITCAe؋ȱGGP֗'B~={IcPwwp+НܽYh[[=B}~'ID8oo~|j ev?_^LcEg{BL]{ s M]-0mA|}ގ4g3s )~j#97eaˁ #]@37!-U+6Q*mooq-}pX5D*K,p̌Y[VjyѹRh` E sK IQE-c…LL<ݭ\xO2cʋ[yS#q;Z lG:bKi(Qe$Ƒ)@/}$hQWCHউ=Zz ݛ|Bm*.Eq! bK5-Hd4P>C=YYFtgP5/T[ 1ワѧ()۷Qn<'/IM,*u?]:\ik{%1Ly=3ػ\*9#T2x~(;ۋɼ Ky~:x>0#XGQFtu}mͽZ8:`&;"-օLD]aCS\":=٥]`GMzvX(1)Q~9nFh6q0ٳ7t>76TdAW]ДȬnCb|lu}cW @6@èe\p1NL)Qs`@9DGCfoa`n`aF8P_/xW|y,;03m⋗y9ԯ{r膦r#@i_YHgb- D~.!ogo /r(#pHp lepdKKгd#4E45JfBμiىގQԈNWsݳk6(5@1#Uxc 1گ&DVe[IZ*Ѝ9~[w5d}2%ųyb_3ww1JdÇ oRJPVAֆ\@U;Rr,'Uwti&]k ^:$cGΉx3Wŋ2u5y$9 WK){q~Nh:>~#;;Hx޳a5/:bl>_݁(\Bc9gsc&ꃴpےq^$]XwԤtNcm)mE;PepT6[VۼBΚ|h4ϊA@R|Ij$Q((,|>:cMi;H5F|-xAqIC:sL΃y؉ueсq.ΦW 9;W#ʤzĨ5Q&\3g΄^X VLKF̓*!_yJa]:08;# MuvF8 !Ø"@ƾ;=2iRc5LTAJ关g+HH`_ !H$hseՕl9c oA,)>o"U$؎r {CƉa\lq%;G:[ztǞD 7>:JW{7SvcPHeO`ƁK:oWtcO~y]IEHn(H7.ʌpb`tOˍ}BξzhxqO; z 9wMa8!a^F&:b L֑p1O VH r4IW=_+RWS$V3N;'019"$8wqB,9s:Vx_GrQ ZB+Ij"Bb-N+e%J1|* 멵щ&EIQ6v \d\_Qj)]Itg&'san>=; E-ށ2 Nؙ,K ^WWBatFl3Ž~e'w`w^j0@˖XckPE uB?ql'ؒ /#pڼgw?%ġ0# :RXMu]LiɎvfy8 ǖԴ7|߭5 E˟c+EVNH!sR9QQ>~ H8q]R+ BАIL[ *@*wUT ;H wṱG7NmYM)@}G,?giS<"Ah^#>=}D׿/=`"A,d|w<3z7G&?S@PHe9aLԚcVN #^\-0&:'C-UQu TQo`Gh"{q!h.GWgQKE- }8@QH((/0)LLSzJTEfk,?,VNnVN@|(xX׷u1Ș"V]:n/o/R@D|RIC]=pFD;CmW+[O*_GE~;n_>Lk*h/7Wggḡ#HO&PwpXLI-c#I\Q1Ihdp̸"a#<6"7K /t1v 6'$dniWvXBL  Ҋ(7ozL:L+fE}( uj8?m(P]<'2f9 k3#T6(R.fǺK.$Pjιݔy6r=F)ݥ/Npu#,w{RχI)\xFL0)dx_?Lt~A֡N/L@Qs2n U]OϏ??GJo׆wI ܌™HV{hʈ9ȊLCAGBc]y 8s)ISgc࠯b}{X l%$QujjؠPϝ`[@ܿ Pݩm1'{9C 3VĄ"nysE<]#}(Kd$SRTLailER7Sc_(=wƌ@ GVr)`DF؅3SB%{2V 䲌|d5p`LcqFOQs9ꨚ\HH k~yv/VGO7K#{:J,M\WeMIzL@r'TQ]CUp|meK|R"=LDjOmsg2z-o3<UE7%ɨ25t9&;0ceF.w=w*1 ` `b#X` ųXcTE:*4WOT=K-9*!)a%#[4e0x?\{v6+ht;ыՠX2^Z_XF@/+yfMFK^V~9X_73e]Sj)2=P>`I$Rq{i;*2*SE9iee2 RTno qI`6؛ ׃/;j8\5vo gvCJ@amJqVo{/Sͧ>?Ю[,6@W>7t;W/~}|E+C4}=2PK!„D~c2 }&:*pttM@aYwGg9S'O"Kp_;*v3욗oߠ|1ݥS@"߾~n*X[X1Jwպ押 u^OZS )(ܴ={bkcY{;*ヌ"/ =q tll dBO Ӳ&C9JS`N֢ 6&L 9(wx0[ xOko[el ^c$0ҒTs5F_(o<8O(BHhKm1v[̴ QjsycfOú3EfW8=Np1-ZudZ86_9l55<:0P6H;ŗƅx7TH{;~cǞ=}>+&ל=|wf^%i>?=<˫sAƈ$8!:ZJ^Kq`cWmMN2Zฦ4<+!zvlPZS~jivMtߊ|X7ur0LDfaf]9N $'7׷wϟ}otc$_I15#^_Na>ppo3lSJG׭ھn4wGC_][AR4aζܡ1|?k3#s`An"WY!>cPチ¢ט3GmZ !{kuaB7Rʍ; f㧿}~m; SDQ|xrPmSPnMe6w_@b][58osxNܶwtmx 17 ^anGem,<|hj O9w`32OOz;)mn_:횼wX2]!$ 5r !)K!an^mBB#5jh|(?affF$<K`@1fe3d !2g|$Ʀx j3ۈgTο@H[ t5HrSB-;x+OG~uqUVDVO yrSH̸H2¨1+ʁXU{f0͙>1 ςD>?CӛkrB0ʉ =. [Kd+8l-l-I3WaΏb pC ̈ 3<"4>@;Jt|q%|y ;H\nJ뚲6Tpg vupW %?_ZTJ[VG\SI SYf#&%?kA!O#ǣl*r2G.;X(c1d opw|˭s/Gx;WdƋ-d9Mkp"% mUu)˅x9` Y.j4wRDq  F4Hu>dWՎNz>U7*]# ګ`1o 2XYjJ`w|)60943}lΏBm (;MI0WWSL"1 L 4%TsZe}[k~@n"T(tOky:7;"R\q [';f}h]D̞Τ`dx?PS9&OL_j}u,@oK&Z,A(~$ؼ,*`߿#sre7ɁZFoulP2KƜUVJRL #d?!a+D v]^sOB?!,4^j%t~ b_۶gl5.MM 5s)8צ7wnZ\E*)K[3O^1ǀu-I>1% mܬ(ٙ0Z˵FyF}NKg~bӻ;&v |N03Nj!ng'cB9;DBQA$ #-gCu)6 )}jsMvY^<+DZE9Y pb_Ńa^FLa)}sycE$7(wФ[$oa P::FLOwW`;A/Dȯצ PA56AnzQanv(ԭ 1O bmP_"ޥA670'¶88FvyGWqXCO59+lzV}}v27ͥѧW 廲oߟtQ?AbdOQXi]Neq q2c]DKIga A29/މYFi\\s3Tޜ '8pOK9` [O>>ӱ{6sH% '>64m@E(ޠmHJXzڮNUwB2f/X8\$=)Ϭ9πik,C Q켼''Zt ڇ'/O(.2mPi6Ws5Ean ކ>[L^D@H;:HKWc)YD;'$|~tl![+ CVżkj>>gT6 9?ymY~QvJڙ б"+GF{~wߙ5:SVzة >sMI R?O5ux{ӫS$P1D̤^*2A Ӣɲ Hh<"0̘nh)͊g{L@X 胃M{0haѢER+=96B.K Dm(@lX0 #'yJ<5=vm{VgyP[! nbmG֐쨶$X?KO@N/m2V<߸1幑mYTeIZ, >TA9wbYh΢&m*7=uy6;\P///lʈ0o( N1n/ɋsO tȊ!*<RIR$$C}0bO'{quƅX$];%mr G[ %r $S2;i,N4"Јi|r\Hs_j!PƪΆPNr=X]:Sx9% ӆ~ztG<:ö?1J$JA>O0MSs4OL \xbpV-u+1vW?2hE'woBcƀPܴ ."k㐄Z%qkK>JTqv"59G`GqԸM)1QnI[ʜ:p4Jv_/[o!shc:L urXSܷ*{Gq۪g;zZ9ǫҵ:4+$?&0BJCࢅkv}#8UlwI3>%\Nѹu$JM$ P[erL P &DKy)eXVeqUR|̌rΉΎIէ>n O 6-OuM+q3vRˏk_i3ooO>OX Mb uY"HǹhF,Ǫl p0s:nm%xaHǜз*yUAcaƻƫqDwyʔʌފ'7@daM Howѐ\:8"vDEx\"A8w6cť(%?,Â#*M+gXDTCQ@^{U.ن|[צrpCWߙ=Cgn{r̡m^/c ;>!7O-eO<Jj_/{ͮMxW5'z۳_zWR[gg_[WB^Vn#ہ֚Uirlӛ":wxO[1х(ATD9E.ǝҮuɉ :bDpL;4<}U ~Q^*n&U4% d5$tY+ʕ'89Z7D1CR_Wa Ƒc-I$>ގp#xŔlm bɪZwQbUvR =R"yn il3/*'܂Y Xg̈́@X;+SBHusR﬈l;.~+X*KrpgwZOImWkaiؼ`[鞹L|xOn6{ח%$mj-F)HVc5{J|[^9wtY2SX@L۹<>@J< he\*%d d8.GME\S ؗ!IŬ|ErtխDh )YKʌ.ˉ kbNHaarvLoţ~wߞ5^i<䤏<ڱY+X///cacwUӋ#)qA %Lla'1g) + y9oݽgC[-W&}Jm(6ZCZbX-I(Z~蘻FWilC[$\>+23:4Bdlw4n!"$N$LcE4pQD)@`m:)!I/5ܺݥgalhԔIt~)я5:g j+()Ɉ!qQ tc"j+JVTIgybVm@sJ0iU~Z97}-Qtk*c"]8y \WYDeYU$dxXgX{9dĺ32b^}P߾ MiZs2VخJqc_NL4jXO,Tܘ-Ŵ5 /ak.,8J@C*N`ތȮugP4!rBE8)`e[WQFl>"<'K-ryRyy͝voҷzPbK2{3->_\=B L `yuzpZh7!~vJŗ,YDY&LXUJ_i = 2gݤ0h'wkUAVEsn-'u%,과*= 8dZ0]*߯$"zBHc 6rRfMuӭkuSO ʌ5ȋ J7OpM\vW  9 &{owb٣YO0ɕ#r&\MUa0 X#=9{/ Ub!AnGFY2#m-tF=%M9#qsb_u6u9͝uD˕'Hm vk4O}G#a08‘m5~xO1ǧ}rZ`@}MQM6|z|۟bж`m}QT h[{Z؃LN_ 0ToTsq*b>ՙIY=Zn~Nqу`4 c{x};Bfrc=W e>n6ʔ=a-`nc(fʴp .%6_FB pc# MuuT ggg8.摑Ԝmیޱ̎4 |J;V H߰2bwoo?ZOA]NuyW BX_ߡ]B6^f7;ƻ.IIm-x))Ç^ _ 9΍Pk1'cʄWLԹj&xg_]>4Pj\ E0I;Nẅq(@+2 %"|G@cN`wMk}YVv䰕E^`al99X,>ߟ]NBtqjÆ\PNkk2p R"TMJ@Iͺt}Blu$Mg%Rw]چ\Zה ^/DTTެN@F}^V`dHH G=昙M|} zm;EF1he^3?겴AOBj H&8;W3eTn&AvֆH0zrr}.":{f&3mi"ɝۏĴ1VԴh0z Hq^ߘQ/ӎ UUZy .' 8. %)lP; Yio]]^64KC5rv򢙍r0%;(Og(9wlvW\|p`W5@K~R }p>,'Orwd6X`4{~S;󒂨Kx梽E?/Kt8\Zי} C+s}@i(x/Y$u'v9*ّ1,vV8Z:Cny#Akڛ9{}#mNf:0ܞܨ`yXR Ga*FõED'@w UEn PqtۋF;JpX) F:L+"$[.=Ԟ"Pj3Jo&f֝dW [)j؇~zHY/ A~1M fG_rjrgM`9suDŽw6VtV标]yD7p(J ˈ,Ht>c㫗^`tq@V!oD`v<UlHh0@2S_ZD m khmSc~GJ W1J\,H)d*L 0'V,|xJև!"ʉ*N @Yk,% :>s/nwO_}_4FsA#W \}z[`xpm0^TRZA],z*'{t|=X#dX|GA<1Y%%ܔ8/uձxyqWtģ}|k>=%U K0|g&˒LF\\⤮xsuץɞ} !|4| \0Fz@BwDV' AzOn?LTGHEkomj^ʢչ ]FC6.1>?9N%gt̖:8If;Fqvk/Y)?/F0Ha#z7SaZ? ҆P<C,x+~tږƷ/ l"8|bT7r>wnK{c_>ДM뎲UX#cH\_nh/E0ڻ eŽ`@'\SM *.6V` uAV@$D7Tu9Y\vUgPWUJe`G J%U( ,O@"[8H2~@[7,)oI>eR5y8i) Xd)tJ$-E$=umfYQU9CM9Z G r$ʼnZh ;|8V8⼌ "a5P(oD<)@߽]`ͿXyyue֖k?9ҔϨp릒(0,5vR?&'1$ ȘT儲"I߿>}~鿮w3W% b-SHhD~.POP/Vy3e83# fVct[nP8-<]-EK^e񃒆ϝ[BKL11"ĸK'x8}_8>DC~9C K-e}N>$;|xG1Ë qgy+ojrїCE~8{ I`ʆǫ(ZvS{7H6HZp9Q Ałzu~8p$_ʻg'^=խ?ı6'*I086NucsF!8HpdDPZ#J3T.'>p>Ac qf[m j)&scnËxܰ3A=6zCƋzBI }Ѣ̄m(3 4G G< /a*fYIfr29'G9D&@V@+KwWe$ZK(b&oLՖ" ҋ u" $#C b]-4Dmy:4Oo^Ay+HQAI35TcNDp,wC5qɁ,,lsb}ׁ"]=EN ֞`}{w# y=,Y5`\U 0m8J6,8AE@\}\A?"!'Ǘ?x~xHR  LV gGCc~M(q`o<4m$^wefCe " Ɣf)$z!Ʀa tĒ$93#5'l4 Yn9D#~Zh+i*KH ;}b?'XȩC[oDG.!y >{f4߿qǟbwġc[E5UՖV]*.D|Ȝ. yhDNj9JONI QP jfA~Xa,LlUhf fAXl[bBmPn{P5DDDyY (JH,I yZ8.yK r1ZUmh#h ӅbsMY܎U%_fA''(Hں&OZ<zANalMS7Q |mel* W0mu7cCqXYP($ ,K}e a,AGri W!d哂( RhO Y:<(,Iהf2@U}T^fkMA:=({"܀Dk.H* >Y?%p,@imnFN" O 'Ӑ_"#k2ӦIf%1}5zqa |M|} ARdK0WWUċ uHv6#L!MpGMy=}y ==EO\x%лCCBW "vyyyI:+PRz" JN[: Y:XzX$3 Y `1ȒQBбݛRV2#/7keGl>9޼nUFq<(0b=E?(Ĝl>0Sxg-LʯP;{l01PgtHGPW|MM)!LE&P- g4U uHO0iy36A+u(/@3T G-L@G&ME)O."t0CӐlL[\g9\€ 3>NI!V: 9d 709)0 (/y@A V갳ѢYm`nF6!4k BԤPI)B_XyT)LbR,&x4%I癦qӔ_ۘ8hA( K.Z2s0(uѩ`6;fcdfЄ*0,u9 rSxtX3ofdjjb ݑ(xL9F ev `/kRŕW)ɋRHm[ ϭyh_u$jkf}LO !=r) cDh9JFe]Cyj%xz߅YQf#\-ԓ1y> p"xIyq͑`8=zD' 8rƀh% + &L1FXZ$ik+Jbi + CckuAՅ{7A\^|i/!ã%*>+So ȵ0lӼrVLIl.<ԃѳ":+4$)Jˮ ANj4cu#]"k)*/¢*46],L{J||!"vnZ+[k2}]ؙJy)/`~j 5)ɡP`tYex]B #<Eq B6EյXx?TX.\ <>+@~"iIaqlH79~\*>\#!m!1ckv 5~~p ʙ@[P7u4Ha!OQ]QhE?"lֶ.e<Ϝ% 5;*P;3+@qUS yT21HOHKB_duu-@OT@cH1؄7DVWaJ0 ZZȣ0>t%K)ӳ;#1K6gosj𙁘nJW #=XGR'z&^o3Ң R$C r(tPkF;#?_5. V~Ӥ˾Zv)QʹfK.$+,PkeZKؘR_Lwwqu~LhpTmnȩLb7F_ $HZ P5dO8/6՗OZ[>sbJ xG@[?h"X8("<7BB^y|nS~[*r 'FPeמ t;S0I{tM@XQ$hGYb̗bpIa‹̎ n?+*r$!V@ 7{C5j?XQpN U N3ugȊ\OZT"H}Y65| A9A{͌s흣_>ufr-['v~D<_O>cSstήЛ Luvv-ty.['5%L'Xdo"ĕ'$D%yx: kiJmC`uaqcfʙL>;C8Hs/97\#?ӑ-bhݧD\=]T^NnPHOG@JOTjڈ Y%O$D ;t*؟w/.N!Aԍy!.ӣx B;K  8:zom=>\B£,DMD΢dg& %1=:2escZZb ˎ 0- 1NeQx!$LM\iGsu@yJRÂ=fC&{ am9Ķ1@GVaDWDʱ PB|9R!^IZlG ,4@L|^X,ť t5g6lE/2U_N$#Y,J\C۪"UT͈s,]=Ov쵣~xţX[98TKϭ}G[XrSbe@ vYK%HJ,^ 2(fN}0{|dsr}r7: ? cx?и:?^Sru-/,q)***Dg{3 Qd͵l{<3|@] ćg:*}4atYDՔe7E׻Xd0f҇AU^).w@1u9췏A]2S_OSL|Nᰱ9(!uSQTW^8^Rj)[Ni{xz۝#osyחG3w9{dN+C9ܞަHPdC%$ӴHwW4<߬QCgkgzm$ʘ5oG&5S5zDQ̙'5MEg4-P ή!֦>Nqp,&$xF+mdN {06~x~ V!8:[{VՕL 6XE75V_mXieF9@&.cclbhZ9x󚚽[3aUХ[ 1T^ /ǂFC&7Zhl*m-};!tqgzJc|L"cODlĂY l`/@K|;hx$Eلۙq vױLl`ò2 ! nJBp( z2Ƹ[+XQ|80넡6]'wU)bw/Lw3>wkD$~d1B!Բ,%,uUIҖ͍Sb\?jBQoS\^m m2PF l)PSyXhc% uaijv9qq&TOTǷOo\=!ןϮo;T ~,^YI3&Rr邔r:˩%`~kcbꊪX< 9$vD/鞟G5#+1>W!ar¦ݜP0|s cLC&~h|2` [c9}<U9)U"]A{XDe>MրbASEif'b[wB/N2(Z/h:dPyV07XlnF[&Ü?Zn%<8OGw`6L{T$^(] ~`idLt̎]Ulp}[QJlv4Ӓ}uGZWe:b"&N6Ra!9Al(WsF2 )S5_@̍ա rj|eyYy8\"^^f`|pKA/Ab蘡EDz TEEEn9 X">|('q1A?K|<%񹑎;qi{0LL>]M lw!Lʱ%{]E~hqBP jH9 @9"%^GvHjwL<9 x3;ąy"PwRrKD+9猸iQ#'t'(HruDAL{}-fLEZ\-S\G)I5Ō#Id[ؼ* o@PFS\ҎFwR^Be\ՔGԻBs 6{F{v4. 03ٳ泃c0޼Bd`pR_!$R- 2U^.fAnU$I}H¥ [HGEH)^&/5(ԕ_2Q0Ɠ-fgY_8mz}#pW qg͝? R4Tg^_ہD[٩&2Ӝ^ÓC\鿡71obU(#obxlHZl@clTd 4!IK kLr( @}YuTf1 MɊw4'ܖsg>EN(^A;QaVU[Ż7duzRy,aD m=g$)j*8fz3k  狉@N9˝-=.Bl)Lt(ѿ:ޡ橍 'ƻPؚ#.K꫁ oC-)hQSsv7|R)>\11>ƩV*"|L\W䧸ekO]ߵgW_V6{F02'*#p hUi*glS#mGv%'CkE ּd>/Qt]=G{P b#E~1'# .Y2kIJ-]:{Bs3©D TTg:҆,=ȪA̚t(% R.8 d&DbunBIb mEQQvv:bt,'6B;bM`*5:2e%e$yƫ1#H'8.axYk4d{-/rH (s pP*56;Tyח' U:4HdjaVJ gBT*8b0,uspծ͋S[qظb_G 0ގP<MtZ(.[Fs-D#YYG[8o;( 2$1.K+Q l9 1``|vp?1tjOq"9jND;-*&Ci{ݙ^щW&TF'~8-+# PA-9$:$`fQS`GN5LMlYhB]BrKL5iV&C+&`js w΍?Â<ᅽٖjMfL,8apj)XiIb3O`Y??} u`ZfUdq|v.we:RK̙;\" iمKeRѽ)) %ԏ"d>;2&[󷐕"};~Ά >&e;cxT%v%)ME! yl}K~RL'a(eq=rR TԐ%8vZ-t:|Z*YNpWkxC@Mq\_,_>M`akUmkZ/ ? ( @}}|v67/닪ÇZ˩s5FQ)x"!!ͻ}{eFBT5IsS3vf4y6̤lP++D҃^y!qR\gYa"j1Cw-)N2;TDNsOok&fۅ&,9̙*gCDsL!>(1ԣ`_.PhiKgٵ '2qwwwW! C"-HRZZh>VRfdsONTΐ ^-",9Xy@NXΈ>T<;Sn;Cbvuy\B/ceooI;V9Xɭ+;j6-@Y<CvoF;*j̅XAOj /1w+WTmI̕bP-A}Gݜ8M”o>| {QutPtAN?=~vqp]mlQ:a 0.6ԩp!q`c 1uN8Em3  (<6Tl1]L\0z91ф?*&3w6TOQ̫5Qr5d&Nd#rքn^}YKyF~ oa>O-:׍-YP#l]Lݳ:(~l\rN0{;H#vS?`vHK3cl tVx1gϙ#iH0vy5w\vB=SROO֢./Q:[PN82W7fmkz4;!C_mZ-y1C֚P7M43Hz:nNgJ㿇 = EXEڱD.hbÝ:+{u],4 0ExBt\HXdxn'`\GuQ? G wIz}veSSE+Ʃ 2__\G f>7hІAAA7"w EXo}FI7&Յ_*ǥWsm PkƼ4(I41PWT?G Lxj,n| cXrO;- "3bDzoMN 65'B"~ / L\־+;+2:*+a2`#&3~~x/נ컋fI`FR%.At)b8P$.0@WG2%;AIIIEEۃgami%# 1+҅9ؖV$nrQwTGB r7oHٲL;K"#-]Buv: 5 L4dHe%D.0e;ǺyYRxKxzGK> A.\6&sc2b Vӹmjp0k*?W? a!!܋*SuVÍ!7Ol,K5&0`:@]AJ_ +S#`u{PvoZ0|[;H=D2ʊ*z05{`t9Wb}T$k0>gDX^U83Q л驨"PE42·~ᖤC(JO[5w`ۚ5Rmc>WW 7@_\f͞ÅHHMU[(wsgɘØ D;8(!rǓ8ǡ1"pG dGyy^8XSU!<UOWb(yuoLJ~ l_y۽P ="~%2-'(Fk\ mfldlef Xstt4f5?<^L[l>ԕQy${ZYH@AHc렏LJ nΈ 0=0{l8i!U{Wv?m[3^p`SaxEZl ?{Lx1Xp||z~zBa3/ہ]D>\<&qtvF.鐇 |og.'*gh˙bݨw9#S#li- |U*jʍ0|\<\ܜyZo? y{{8CSԠtsvJmD#ΌlASqxkVR(Ȣ(62}mKi` ~*?s`g˜%S#]5C-yį RLHv&>xxTDQמ&W%!1οHވ$“ u 3Ce CFls6OlKoY_Nv^\O%EY !C EUwUG{3ڑW?˻KoL:5hL`X<<7`YX<f??Bד;j 5R@#bC *D܋t % "Oz\v+q&l-]LGZ'%mm;]L,K$PK]3iha48Gcml PZAtԥ˸; |:Ť-k"?3SC#pAf#Ð.0xS=wq [b5~-r&zJ ңO%I9iP M_SYr(6 ɍ8%c&d"CZx O)I?~Eg:h0L~Ig)z⎲,ƊhIEGU3WG˧wXSdej 9@@UWSU P ,>hą{;jtusrLcĆEhhLmmh&`\#Kh"e4` IϑC {OĐ=1~ M4?2`@vN.z`}í!T7^)L\|IJ$:|k8|@*NDZ`E&OIrH:set*+(RǤ lt+a\Pn(-ue9 D λ'ofdOc%;U8c'Spw[{yXƿuF~?{;kJ6 }jʠ%V c٩8!Z#TEfŭϾ?/S\r|RJ2Ɗeѳc#ExO@#߳q$Sd!E+AZi9L^E$k[#ix)>{ 2$ &U> 'D(eH~ĉ>e9"sA*-u婗-Q܊93Pl^upz݇? RU@,6 Z f]IE3xG+q3%T|TFOfD`IJ8겨 sC GN( |+ .4Ie XOhL{+TPL $gB57Y2 emM(`&b`,eeԵ~ %JsOkQQc-%K\^5RylZn!dPt!u#m9CDAf/3UV$?z X݉ӒxK0_nxbqƍGL Ҟk$|~ pALai#ۯ~<3ܴFkc gD pQhQSq_cur/ Jn @h 6a4Υ H)%891캞|{| %m=T܀/C vYL<`G=gqU9AZR<0NO?WW).D8VQ3!D|btӈ v4Fj^FY1[&aZ{%>ƒaaRݍC=*jQgv-^?܉P%[=k-!dYgw>{F{3P|"6#n38 #D(b"ځ]Q!5,$ݥ8#[¤e"Â;ːp C@7ng8K}]-hL!=͘qg%%dAmo Br7H0hZp$G*weBbs]@bȏSHΚ:k'P 4)f0Y0tڔKi\Ii\Lyͳg΂`M`Y`JRLǽ]0k9PKC>z3 (*{@Ku:wg $Y0o#z7Y$yƺڃ-/ Lb\ÝtE #7a<'^)b$| +5CLw pfK[1z Yj{8BGU*wXOu5Ukġf鬛>aRlߪ0:1D(Oؕ V.<{owkV$M2L1>$Zvyf[1AHsRrXi!"ؼbja!sB{')-Β.zU\/!_XO 嫭6/1elWՒ(_j0aeHL3&70F2Uv73˚{ÜF^?7s +cm8S uxD^.nf8O[M8%o߯_υ8ʰX,01wgg'x;;^|&]FݨU[B\JiCj2Όp !КQvm^df>1!ߟQsB`?l̓ >jIqi8v.b7uwo)#96#)XodgoEʌ\<f\ Өrgtl3c|!;()CA d2Erㅌ=YOX1{ vALX׆:zɪ Sbv&-XLXt؈r"A %i1TSб6A?hZfUFzBHoIɝ.N=k "C!2䎎AB'rE"!"CQK̔8DdlHK(4̏3yySNj=D>B/ |V;:iۀ2'DŽ102P6T'+8 QS4UV@\hIF'5MaaԮ"LLxX#]dhbE)L׌%+>~@r1Dҍ,-(E{wWD6deF;DzwrmWune_h*+H_ 4HR- X[$.pO>LP늘<7Eahc_<=,23*b3i#*у0uTW)I(2 d'nit {󔖖/cSH<͔5>QQZM#)6/#sDHpLZ!Csb#6Ӓ{!akkYd 6B=MiY Mb ;^KF_C΁1A!z `6b |zA֘^Ylk;|9Y}]yR(8 qkjۚ2:&ʰӂ񆄚vĝ.Į1qQKjzB$y$R],8S\eDGy$ E~U&iHx䪊J-uET{ EzNJ&V‚qtRSSSWSQV&)Qo gI `Ѱ!quIЁYȿ߉F N (H`·Quj*j%]U6Z vZl6_G8Ї`ȤB+16PDRi-g(2'%)ڗ D\'Palee?9ҔJ( 8b }I;gu쬳bL,H NP\4> AvT$HfK^nV$Ye^ӴC+o4.)!~T UYѸq9ZnE`OkϽUQ[W{6O~!cjKa"O\8|?ztiţO݄K=&GYMuTLd@ULiC¡\ּ9l,trbD^N&Z8kS "sXlCㄎsB}-h ZF ~DCA"̯f::A|x;&(?Vbnj`aJhn&sC ',xl9(f@g5*0W[kw3|_2ګH ̊2"dRV2veT 9.bKMěDݭ-^nds<8v!v=[F5MUˇvxzYQR7!sR jM+F1D ʡ 2MWU B\=@?݃ 7ly|cՃzj} Ci ߞIXǿ^?WaXezJ7[ Fb(4 F6 z1p0Ԣ71тƞQETC>J~F\QvzhQ Dv.l))* mت^NbZF܌A谅[Xq pVxPpOYsl0P p#C#y@ ZhjpsЕNhUhq@}aJkEFnJtT3iHAzX<}`toEv2uPT irq)ð";uϚ'N300@4!;SSm-[-k<]p@_K` vMEEWo^9QQbw8@FXoK׋Ĝhմ`90eYaJՎ<*ґ~6foS v#f,;ua}&p}a"gb;Awx;P27G'|-#j!Z}|~~}U5qܿ nj;i^/:= -#&bk%68iϗ%0O]E [ԎH3₩q$}OVfdm)]cczs>hv׌-78܇Ɓ`O_8a]״^ 2 IT4OÚ*LI,bL.9y-hE#kmXX39o89֭ /Ll\!?-ʡ )aۖxV $%BwH=7$6a<֔3֔|bkޚ=+ÿ.w*q.w"%],;ШBO+Ӭ0\i 2(j*14pCUPM(Irp3Y e\F醗 61O;#j颖oٽ-md[{zHS 2Q^~R +tVL"33Ltoyxv?qOLd|^<죍%7XxBUuaO2A/N6J&?lw A$~yӫrښ䤮gW洹B{” G[sK!QSO`*\Xg{޽q'}ȓjlIB_91%/yPV¼]`ْoEZkj11sLuI5D)Ђ1d?JGSpHtC 0#u%?8w4TZ]sRl]fss"07 MKCDdZÈbOL;j4+ts<]8 du 丈ͫ.7L5$3fzQĦ w +mYAo_7VWj iEC5BǓw/➺O CK^H<g@ %x%Ձa1]Z #&ݶ$1E(j=k9%F 8!;ͣ 59[Can\9˅fc,AJW45#a` ]Cy$fƍ4|e,3֪ў|+s q(.OM@Gz|G lMt-pvz~IP޼\5>㯏l t$@VsfϞ35SUQVFj)a Eɪ! rfeztn7(2s$)'ry¼Ou2+Ia1c04dh fMʰQ8 ߧ,yAiyHEZݎM J3 YirLn[;\v`pl8ZJ)L9PL0΍E(bu.h/q)K L3  !Qw{ys̫]MLx+Jӣ+GE{D43l0pwkn\D1–wv}G7AˏdܮM.CzA =uչI 'scpA pfMGoLp *%z7k3`f((̣Lc~ %8-^|tUf_}uauyE'aUgNOÒ@Cfjcl&X&`dK)`Txىt)0_dXr *9Ep))Ka^PA/bv, n݌_n΅P٠j9⃂/٪,L21ewհG^?CoQÉPJSs[1@uvquI G]LS|hBWMDKlOWAJ"NeVj v?U]§AIPWT"G8oa#Y IJa`Bm^q5 qs~㷥Iw]xzǚPq06̞+͕Rkz '[sP` Ȇi㒅{p|PR]^U4$${׎0bFVUZyFߦՐ1P%:,ȬPwg)h]^ %)PZB(MT u!!iE_ UA^}Ǎhێl=y$ B뇪ĐsA@ f \C\Em 1QR҆cRF9LGC.>j{[eƉ=%Ŗ'GšD3g8*s.ͫk/3Cx$Ýs6>uz@Ogg^<@  !o, Ia~0]Vsˠb艮BNj|N\L_{N4fPOڳ~1 i2r2al 'JȂ<ֱ tje߾'Leߟٵr&'^ya'aq%4ekm+%=d`.~ْ-{0w%ő?5`vٴìLDhDn˙   cpU此 .S|u A\A->R G !; dO/٘ΐ֦B NYr DFߴk0Kܾ~ .8F8.jϚ5 4`bx5^F+p (CEqA9 _]\[ȱ'3FSS׊沼/0P¡`LBzC-ȼ` F2;&7?][(Dr8K{1ra :;ޝĄt օ,D/(IJQQSF`KN<= @q~.%XeN`!u\(u19)iy4u*R|V\/xyҴ {Bo6)ʎZ7.-͌\_]NC+ ӇgwT\ӵ8,"";Rvl JSQoKH݂ʜB[U.3gG&QC7Oɧ=*\ zU0O8~Dz&RfG&mc uqG9Ceb{XH`#E@-%ポ|ʗ]9\c{wzt+{i"taZ}q]5`X`,r*J wG] uCeIGGKj26Ҍrة?$u6ӻ{qOZ[|_#*.z/fxon&I!0SU`l΁ %d.&BT\P͵ɴ AwVS$2+8RMOnX]]P,tdJCdǢG2cuҶ`y9g'F'EfW\hs(i|xs]n-NaTV j9Z#~=Z^CL 20dxz12t K3=c#Ė֕dwvT |"n/Z[biheG0po6k(K 7߿/o' }7!Nq_90cy#8\"ů)7dN&\Tfr4h3c3訫0d$s[CIkP] N> `f<ŇyPÃu։Ic) +I;s.8mLA D"wW߸]ٳޕm)I;9t13N77Ej01J Y&DbOR]9?)ҁ#Mtx=9|3*Ӎc'7O||  gJSülYOs#c$kJ0@@h ԩ.P$gL™XWA=*Ǥ(!) b {ve?i&peuD-炖Ђ?5&: uJ|:7a XZg>#AF|RSw@=Zsy:%1j`FH^ 3 yNJK s\,ܝDv w-Y ?Y_NfH[#]IYsuƩ"a@]$a m H$AVF Q{-}F4Wpq/5qo> &` {VHRb_FCLjy/`9X _[Ƽc 1$s[FgPsEL$E + LVFI]MŒP*h1Oqzӹ^$<[(NhD`#0'C:GMG? ,?W"5ҟ3B4F:A^1"G*b$繱t{n6hDܕL3RaQurh6=%LnBޚLPsƆy*Ұ؁gD0`ZcnSLc3^ښCl.K%KY\}i&ȒK ^$c ,~}/J|L B/`$Y~64 Ɂ tºj!L}]!rgb~S_Ǫrk]=*-uygF c}=kܽ}SXb;g3"H8w Em{[?ۧ?eHC>p?yV,nS~y4 +dNi8 &,.n߶@Bjz [W{|K{6&GRpmsRC $ׇ1BP#R^Dd$R\s[6NA1bsw%85ٸWsruzÑ >;%%p }ltpCp:X3muiFPs62$8H4.x0T4HRsC1k"Dٺ,>`<3p ɻcUÐM-7+"7c=$ZĿaq Bt*HSA&j@*2sN@WLgoba|D :Ź>Hl/1?31@<h Tv.Q4aa7M/qzTHMH0\j\<ÏLDϓ+ǼwuC#JȈ״~q ^`w~McM$NӢC}=ddiC4&;24TD&wy!)*-q I:i7Sh4͑uA:mYFlmNʛ[Om[SZSبP {W DR]4ˀۀ0M~L,v-H#,ӱ+NYup l9kKI:m*75+|i\)wN[y]GL^>t8Ꮧ4sgZDkqw}o79Rd30ߒg34 K=wjtgZRs*7&;%1X$vqR&Ur,:;n+!O5%y|XU9b.*내 ~-@ ։]Í%Y}<< {6}{7,)u􌏎 ]Aϝ 3y3g){R+Spxb{!SO`"fb' x~sQbpU勡,&2pi `Xa&_P΂c XBwC.W$8plsyQyq~E ל#y8UM\^#':*"gGD&:4(TdD3]Ѐ<92Ob67do-n4e):*9C>޻8%*kH#+n# )%e<0=)$mޕ[&G^5F(K^WA(~}~ 8#>@>~{ȟo\ѻk[8n lvÞSCNJN|AlK{ɷ6TQf>v/Y7=rbbxl2_q5$f%AMϭk+!q]:W-n-J>ulnD@-y9Uj,aPD͒= cy/UeÇ{?*+ŧku[fC$< 1g.Q\p 7@@2k&R pP0RPqx5Q~` yyZ*RJXYZiio1&|M-qhIi0ˣ)@aѧ@I ó҄m0 yUN6T|S#HUs3gS%s5th܅҄!ֱ, ] 3 -bpT[㫟~8JDpõy%1=չ 6(x_tsHA M IjWV"1#%25BT(~r8VpabR8zڼYNbFiIHX;:xtz )pcarpPqJaLF sgkSVZjMa~Uq + :2/#e`UI6?D|dڡo\ *2T^Ny2 _͙^Pg g+k:2"%D c5l8i%3KU#7 НMy2J32sSfyrJ{21Ao4!s:uf`{edFN!8PHQQD$C MLAd #`k'q=_KRB1l˹C1g9uILEtT~yꁵ[>꾁ʜT2,h4 0X +D")1Z%Bv].V_hJiv"BzHhQ3Z z}ڧj@d0!*`0ڼ?=3Q1ʚR$ϛ$.#qڌ% d|DGc RfhSHJ&idDDoP@3#WWke #V:{ߊ>2fP4tiEu?XWf@  Ҟ,n/k&epF@UH*W? /`Pq`hP0g\j2 *:]fb|Vbv򂌺Rڻ_/]PK2։f)gnaMKO<~(}{,+L tc.%?q p.߼aPq4fdNE, ʧ9w+N8 g+Gzrl.˦$7%*գ}=۔I}iq@^<_Fi)_:OظjhOK{WkiVw`oi]Wk`A0vSQmhLtڜ|ݍ%)ZGxZXs)x! 0H6ѱmYۺ: % 3u)0Z$).I&).C-ΰmZTP5| 7́6 А4*)q29fY7 C&;>o҃(:d${u+ylzp]+޸ra'u>"ahW{Ã1,OT?r`+`1SO4啥YbFLIpe<9#M٩^b73%qm*jɍm+r}Tebq=Љ6cBFy UJ/q'}]6498)H;6jM(!t֧]~x-gn֞> +"ڻyݣﯱ\{os "?y،ƞuiׂ! 62r0WurHb#)2,c%è:+yEfoJ7>܈l`O-j+cK(?p2b OMmvϟ7h9sf!_GQP@ x8(=! yeCEvSy*L/뭯,Lgޞpm.W6&dRWxwӇv {l zvpWYd,)Xx P^I [[TQ |PಯBL3LծTr-&a6(A\Yx3Ey%'Gw'T"u܊x'W2թ)β4d6 تq.FQ셂-( wx δ~9Boi`̒:KT/7` NK`!CKJIJ^?ڊ$iYw).ˊNJ$Ş-"iގI | tU _5=P}(4qifi @K f 9"80[FzG'GƇ̄]U/*Mm.$ٖҤ/GGȔh]:}a&$A8 &l8_ ֲÛF>?{S@Ң[+{g|0RNlo?5fl?'@8S7,͏1 ӗj'!:))a`A$jV?~ȗ} 2:/cK&A$@R2Qf -) rʜH{綑J9)qg;m.o=뜹lmW4eG$?]>1}h*^# )#/*n_i!A[ݓt#ՅřL3 -O+'5ΞFzeIw-B^B(z4Tx">/yq"XDڰ'޺ziX 0ThN]͵UrG)̟ZMI hC?hEX̃}8LM6vրmjXYD:7'K|j RriFP0ĥܰt(3Ʒ?_ ͌a+:Z%F=o&lNK SsqF7H(:gCa`KD; W@OZ)V[V^.&Ȉ)HI~&w E/w{zOV}Eᮃ-Դ~j: H? al43ˇæɑצ}-A΁S Fon^P`1EYi+ 0Pse^'h [0\Id՗sϲs^YQeiǖ%ܴ|)ۓGX9˳JpZSlagځ>0S˳iqd4ejƚ&8'KKJ̛?C8# %+^6$\p}vA:a։.K&v\AG}E/狶fNIiU, t<D")hQxq|rc9Z؅; \]aC ]z"pGkp_!jr%BJƼSVh21LvlCTfG^~/%{XP+w[,6 PEcڌcOCTWkQ6 PDľgɡ7uy甑עڿfhx`ugU:VXC6,pqͣ_ ! .:ӇSc:RGy;b9HS/8rp0Rɓ@Xv9123MH-L]UX{GNo;y|ת[&k|Cu/V'p B0,uXgY1QKP QTuvtM{>{vQ`-1 C9XM a$ Qra a{yaq$RS~ 0m &eSND-5-[/\QjQӉNn J/2M%._h1Fr8ҤҴq>#r F4UZDZ<Y78CB"#~KYLh"MAԕ} qA^({H_h9#b)&WE0tX~ Pdf ÂB-peDj!_J8sϭ4B=CK-2u3Qc(XڧN '%. s$bX<!{-@1~^.֔ur:Qfm`e L TťqulJ#}mXjQQQÒrΖʴ%yKbUgG+Z&~M1d "<7! a#)N7˷B>mۧNl Kz^ vu0TV$=C$)4%Kl(/ĚNxMw4vGCΉ靾|kG'1g/04,wmV4=Ơ{HPp4j @$IA)hp*J:═Z!@A)s3HL" }4&4,g KXHVD%7l ʟ_OJDP*Qܖ̜:Mn=ŵE`yƥ`BU o"Aɶ(Ł#܉o^&A} 'uylTHߦ8t*:jIʯ#Q$/ Lwa}\kC]MUnrrm|' pc20Z~l#G MLxr@U'[8]YImN1PaN(fmFHMMft 1FYp(e>ąTT([i|@3XTsS7PGVdLA6GN|<|fNYs&/ˆm5XgY"6zu86פ\?ј￸"|/k~$0bRbdc3N }]UUQ4&DxlE*m/da]s`M9)42Աؑݗ5EY(jkX-%D ^4oLr? H_`Z׮\BIP⃝ܬחwo}hΕm*K|yf*6.|N"Qu+~LGp\ho@sf@ H-Z>7$=8;1PLJ>pn'ϰsc 0I |J 7=Zb~v:2KV-\Lճ2P;:.`lVWS|t pّMp3ǽD&: .J꟯hvVeP}s&/o@խ䀳;DCm{xR1RH~=OFq=gv7\?/8^FG!#v <+ffF3̌n!"t>c{6o }\lMKZQ_ fMA)lq~`+@{ w,7{گZji젓sM0<ß$JOQ4´]@x93ffq͑[F$2Ul k$V'J}~rm a9h2cੴ 3m-{aP6P1EXɽ N8*+f6 `93& uz4̚2#O6>D 2posp!ctL 涻.?\{6 S\u\p`Wvo^)CԘ| 3X~82x __/7$hmzDo^=;6ue MJRB1m|m8=r=n!-)rT[|3s>ֆV,Rt!+OɍqP۫<ĿP %V-ͅ¼rm`A0~ /7T{;]+G<0pNJN)SN0g[W#md!Q c՝3 xJgk=)HEǡ;7yy#^B,1Z& .+MVhل{fo(I4Ӓ;E zRGWy)b*OME(r7doπ%71 (,P9L&Ûs;n3SN~ٌUbb2v"d`i*Yj n&|j 'Fրʬc ! ˞ ]0o N1ڥRb65S][8xGC%JUD`&\A,\b9F:B1@ݙZ1`'7G~kO˻g(&޾ĊޔG+²KR~'K f3~q6%㪧uI[I2x-'3S[}[~DT??7k:8®c5C- Dh7B@ *!WNkΈV[$*WX63?)H +sM`e~)mhAthg;n"965+>ԅv VGF:@h-%Y1~Ap, 6xM= ԓї[>m|[93ho?uV_CqJ??)@Cѫ"ȍ&n  MGRfϏst(Ǻ05 HEfAuG\|<ݰ33ɂ'>cKdsƬ՘XQ y$&伋-ď&:c?xd.@Bjx9#)k+O !ѹ0<[vJF-SAJ 9Bl>VQ x-UЂ 075 ?<'N %*b̃]E)̣Hfr3C=!gNU !7/H$&'؈,L\n"}u"e2zo/)H"$()OLkDLń[@ʇߏD{[!kJҽIg!yk}s{~QГ|voIQn6*"G!{n<))#?*_߿SU'o$7NZOI~46FDxQ~ ڽo}zc^ر7NhIM %6;v] A)v`o`kZ2m|x{wNZ$n N _Y-.2Z:S#p co+B\`;|5U3@ljbfjdߘY܎kV#'FaĢ*dBpjLIBCizң=#]#mya]͟"!Ћ g$2H6}F_F8?QP"+2nV&\vLw lYy3GyoyBH'gp;^"Y:[p|t ux5ɷ6VP}d.׌;5{;  q<P2W^lxqi{L9N]{;,5(37 8)̏HG@g'~IW']6ϙd91mlHU] ~zV @V:/e#dg{# I[uІx|`Ḱ,gaͤaL f76Nf$MH AY b 6ydՔ$B2"6Fج$g #RB0g4(jDژoj+;8TrgyR^՝X Jlۄ w%2FJ*b47J e2;v@zPZ+=:̈́|}Op^3wrn_yjNLKuBؖTN$`8)>c[%jxBVR*WKEke> -%T.=Iq !. u: nJbc$~-u9$8)~kbX}ܬ u0 APwoMWs~󱂒<+9!29o|tDX1h:W$ IBT &Qpa4υ{+j/R\F K΂8-~' _#UۺjY ^\9"< d"䮚1J#\={h'HD/Κ#ä@-It 'FrFXCOtP5kG76VǭHzt $`Ga*/8u pV]SN? /K7es,t5a3 x<&?׾03NF/w199=} MIILu/7R݀mV[E:8;DqDD#Uʤ$-ZC]e@Fb;LQp{5a.:+}8N$WtϣӀzls1JN]w̠ _ʕ%6g̊%J(j m RyuY`FxcT!4)?>,8 9*Fzil#h*`=7EB\tr3U]uO)y|r@HoUH ]dZ[S6J v'{3uW+ J)Q-A"--Ĺ0$%t(L,h<~9*#t1AC0a{urj\$sv];p@?S7N!mȁXD[AK.yssPBljNlS-qzxtqSfF%erPFPU}JZS}ncÂeqay0-, qjn@ v`%-VVb1_OKSt2١Rc<2>c]kc"v6ژAE y-h;8rOgs]qDKOm~j7 ".*xd@n#K]:ְ\S;pꇶ6D:ATfFs1ް0$˜'M~R$AjD8##jr+i(/O,2BhQ@2AB/{WKeASï/t.ZhϜO1y-HkP6ɯ_pJBdsCRI w EYr ! F09x)$͝215: :46„BOTS6D9LͪS'\}v~x_oEqN 1/G1ULR%CJS[qA}Zߣer3DG S L<^F7$=պhpq MC|(ZTZvjscHʓ :5ܜjkrbs=퉾6ђE^7314BAԔfm!f`)O8sr9#;jԧh-zf(#m-yw$a%Kj5+V-!h*d(SȜVJOn@mngCAyZ@4$fU"r ІhXk]UaE3s| maFL|Ւh}t*S^X t5ǣݎE[cM S`sbhe$K炋zZ$T.dڅ|{~-=hF1Vgٿ Ȃ/D$r#vPQ'lݪD -woՂF+ R>5uq#vjX[mNE??1P%C˚Pru]aPK#glIɨ̎ GHq4_\>jȭGX%W+vA~vV?/-'ޖOsHs!.틋_wЖbmT~i: ^@9#(sϠ"V,8FS')ه776Ր3οci"!:o938""QVPPwJh:3ܲ-{;k_Qﱷ^0gS20,rWˉ8"I?,+;6Ȋ$R:3DE<)VaʰC Wv<:6@YRCXOyYr(ݥ:R v=lkoFՅ>_5bt\ Ub -lk.%db ,!.(2)q> eJ2bXhp` fX+ .Tj<ZTr:{hrQa!eFZ\%(H0{G $,udZ+_D}i7ZwS-5]-=\`Mɓ]T[@UY~ Ws32 ? Hba_g6T?:2P^}Cli*#x3u):2u&#c$)іD3Qjʇ'1S6\/x*v<9?1Yaؾ0bEO=!' }%<:K!ȤW.D|W! ]*n_OƧeY(_;mʩfN.CBrP^a4 ' = C?dfD%bah(;>0s: &߾RxmFH[_qrN3{;m dSœy'r ^JOZSeVA Zzqhoڌ c?6K*ʏbgY+OI,@@vz 5r+EgLL2 ~9,E.@h8n/MbfP[l9>S,,,/FNwv _Z"A9KWA ClƆŒ\Ĝ,́GosFtnk= V S5YPY_VS b8b]߶'; [RM 2B4Ēf&V1%q2R3)@ߒ%]žp_>XbC!(mg hSe"R.KM?~*KQPĬř(Zf *Lz(+NGKuWuy`Vh y]gB5e';d`FJGNvo94$3;҃0tƀ d&:5yt3Ya0#"LEX Lte|i]nb/%tGw|%{)JLD=j65hcr%>Woh:S\}1#1bc} Jߤ > ѳXTXo9`" '%V/#BZTK opAMtRysO2K OsbWSezPB:]CIknߚQ7]5T|wV_rj1zPxɮCj+ g%7&#PG/Fğu)mU1H I4䥻IłjEҘ@9&fU<>q <=ѩ]8:=J xnmv*ND6 5Bt.C-}qA!  .lZh)_,<+Qz®/IXޢy| J͌@˜d.&6p`KsSE65(C9[xۑHתEsa@O&NyD,Dヶ&7a_7lK,9epdc>=D(GU> XT+&?;("\ե$1 9 YT1і v3JB_N,#\k̍zw㻋H6ŷ%#Ý5W!Qy ܜyX ((VZrCU:βd!m?O[ص>,,"aj8ED?>9WZOR36#{D=W9_Yk0}@ ؘؒHG[Dks+wDD-'x l$6iK#$, IJ /k!s_o%^VZhN7SRL K `8?hbZ|c"pecd[B#B"BY owسayADՋ0.lnȭL ,I`Sc8~ PXMf^VnKr𧻓(F/j|d|炼lƌn*,8GvL@ԓЄ1 VP]9-1|2GvYd6j;• Z5.Eaj#cB=\E獾i!o5'w̓Lh43o Y} >h pxɾ<=]Y֐^eŵK1z[8ib fw@L3iy=b:`瑨̗h|ZW,З%RYQ:09ą} T~L H9ZLjb( 7GKDZpEyqC9Pp e#%Jօz.rA 9O¨ GXfj kȓ"@3sxƚuh4\Cq}u_>Į(nm'{v68C]!l,acm'wx fSAݰtQ_I:M(cL%|9 6 <^cxK3===EՐ?molj,_gJ^X] N7HN_iE/ %9JDw}l^ok?߳6Qw q4Zg6RTYCA-$3-J6^-M3/?9h( KQzoVqR bvLUQ@;jܿ4C%SiDI_;ՍY3C$CSO ;ٵVȧDlnGgrw>>>g_Ski{a X"FcQubPg2[G;s$fN@H/:P`Bl(^rsC{} 8X[b{a;':hcu6Ǐدo/~<>wx"γP̝tT2bgBL"pǺ?TX[KKS*_g3*k7yAHań0P~xtӣaF[{ҡG|tl|wۡmQ‡qGۜnԹ}%aɇ@r(}?k&[*ƤѶ΁ʦ,\4H\MfFNh%^ bB21ܧ<\LDTp DVSEQ!Ͳs@qu3e̊ ݴ%G'`|qcbP<;ti^8\!+ ^Kqh[1YqOr@pϧzPQRS04F744O_:1̄&KY"`!f>Oq v4R`*bo(nPzzO';@E~BQ:Fa؜d\PK xFf>B5XɘIkng#z)cmvwϏ}{yHO{E\[gm>;7UYM6 N|ȉMR~x Jn̴"K# T?K^%"fE][Z)}tͦ{gGXRH֐F1DEYZR  ee]lM M-l[ߌp1[d9[[ ѧ r[b^0$ج(!o33M2\O/Q|;j ҹ .cIB,m}m)\k#m}XKu~2?e.f<Y@!w#2!p.F䇗BlnZiE1:X~;B7TLS~u8Y_N&,{qix$Fz'CNL v#_6c 27UǷ4gG{ι@:ח`ob+?;u wRH-_DkRB)8FX!CׁRrӖov}My di~@;"rKCLp}}zV>_*ɑx"h6ȣ Tr"[ _q6"z<=幓s|¾~.u닓"\Or6g q|jydo(#<7&іlsw&`PCD ro\5*&~b1;K@Oԥ=}`),I<V:{3 "-]Sqy;cWON>gJ\)#L :1֌ _k('|~[w]Ywu9q1ď tq҇H3!tes}Oo /9gj TS0 4ICB'2 ADmw\;" ۻ'W JO5e~9Ħ?ՙ:!*!NyiR_L|j<$٬ěΝ1lVXlUh v޶~UY~.Bu?+3y+߷?31e1#x[a^4]4BV7 Me֮c(2Ŕ|<@" j @0(E@2>~h+FfdXFΛF5.'/m !1ad# /M iRrÞk٨,;gA$m%Ɛ1^$Hy;CPbCnWcݓcĂÂDŽq)>GX=F: hҢ8I1ALWg'+*0w'@THIs!)arcZ i+Vf,^=56d"UzloYĹ+XO{pc+'م{j6]"KUdb@yyKcE5~HO-A N|s?R8rS׹?73IP#D{zʓ=m4}}!|i$E0Bu-`p{q?;ӻ HFDĄqT2PG;dbLFrHChxB%Z*`mJ),2D qRWZMTQB9k+A}pʾ֖u)D&:/H/ jT =*?JY_S(&O~QWW'y\@+饘8 !tXb7 5ގ~u>zM|oj(zs0o{|y{R?5*۷qõszi,H 7N{}_}rG~,ܺ-s(ᠫ^>̋X.| ~i^ NIYfQi-g7X O"ۇ`5ñWH_Ui)fBqq ?xX0Yˡ>y)S! 2u&މ\;މG^zz[=$t{h;hHU ަd=١o_'>6[ukHCLEcE~[4c\ fB?.̥2gݫG 3~B#d;>C#1؏[ǣ)f"̙X@{kOxc%#Dc10PnNhrs}>p"E8,?  rܴ5iÝ||j>v[ʷwȭp4PRIfTc˓8)|77TQ7k\>p,/^LyX0"*HJK;ZjJbR"bNDf\b vj eL#A~*n+azxf83c3BJ8 RfAӏI=u@a;`=ۺDqP 2% +[%Ƭ@b|\ad_?UzNH>z *nS´M :<>i$L2dsMЇՖb%ĸDiFlQvԛDzn(zpa@gwyEg "[7$3 t.Y[nlGvY~,w~̪[džن7 KR! 869ݳDMh-Tylu mE7S]m&)?Y8 "=ōn;_ev lzY*-#@8חw/ 4VN{ t[}$_ aa8uRrSr`c|S~%КYSgr~' XQdžk㨧[<8#_z >}jW/'^To=6|xZrE:"hЈiP013yؚtR)d%M<0진cQCG$ي4r}HP)MI$.҉uq5r 8k(PXk(;T!!|y@ v C=Y+i <$UJ}b{FgA?/yx"+]mPae'H8L,pz=U j̜gg mɫƌ4O'^= `7!}O83"B`{ gadYhWr82PJ4劤Ԗ;^>4 RB/QPqP÷Ծ>6%/\xt><NnOIIJ %ITY%CήH^7i%2#6T 7PO쑾7~{^%y>PaF!([??C;o#$ӻ̣(L('&'5DGǭK qGRq6jG͕auٱ g`]h ,MH&CD~b"/,ejD}&As/ q| k0g I@K3 (4ѵs@'{><!|gpw@\U-XO @ ucdOzlH*Z`Y"JLlTa NVG~flŠ2J=xpw-1Y)UA>^)d+ÿ7 K@ 1axO;#:3 ԗ/S^'`z!KK &?zrjxy>hP޹9$>ܹ3xPuqOOgy[M塮z-CC;{$!YA|[W,ŤTlMbxi8[Pӭ&$gv2{zah}V_eJsY `F7Vp?锗WmK-?Lпns ?6 4PfEIX)D{Ann/NGE_uMvtfGsaҧGn]LW}Y\Cޒ;U}9 Hb~Ìb}VZA,gYўBJN BpH*|x4Z~x-W=/˓%AVT嗱'%y:8Uze/,*!{"C`T>Ɂ Ln9HM5{7UX*FalJL>d"\&"?cLIN):q q1m`n,M!_KC_΢UsR"T8[Qq`}vKAˣ1!duf9Ut ho+''j ;r +Mĭ '~]oS5 VCRԥHކѭ TvF*ae2V꣹@lti PSgၖ'J$}+,1Ҕ2X3Q\eubF io: 9ogzdǺx;nĂ5{TRLh+mu@M 5cw6s ,n8++Mu~?ݻpyS[n ܳH/Dm7+>O?>W^pdp{1Ld:ƀLQHԤ6GfFZs_W-֝#NJa.::N抜E %\6 VXY &5%+ 0oI?>и.wƲLyG:ýǔ~h{0DϜA0քqu v*&=/@=p]Ʌ O4uRبp_K#"IYL|#Z oYFt=b)>)p,ӟ#GS%.=:Y׍}"ZJKc9&"WMuT P_`-$q3l& Cn̍/ 7#t _.L ? }>G΃^RO]{ceenRKmbhy۟Ͼ̿.ȌD6712e3Ւp547÷i.)ZWUn1. 9o7:vo&龾kSH`iB 06#y &ˎp5җRzh/?;39Ǹ;x멮"5(-莮op">48Z˟ݻes7cN 6l(\<̢LSz`CWJA$9˲w'\طXzWG=-zɅmmItrab|L Z)@@3M)"ݛwoj+3/u#1h{wc|B)8dE_1"*ԧ:c9I^uO :0`/WJs_߹Xȧ"/l:@\HDЊO 4mSZQ, J,OQGI=abkԑ3CގBC^Boe=rn~~jm\#Wz*= '$i#*u횕B#tCU 4Κp7~ (}Tމ XR1"5Ʀp::%H""~qN~H-p!ٗ@]`&V,CbΪǢƊ eOpSMx#+ :k99҈4^(XYn;[A+PU!V}!e$I-u0%q-7lʍt]_#nG7jْT7;`cM5vsIƿ{Ԡx>II2eő:WqTݾÓT]`e2yu*K-U Xfs~S+ڊ# mihu$>"7ז5Փ @&ٵ+QA͟ki^qɉSܖ(I<[;֓3[;c*b"}2iD#{ 4? N r,|ߟ=mn@=8 9ӂ?-X8)#{²%DOo-.v jrƇ'~{uƾv' 351~} Yj0-j|(HOPĜVR-@ESM=8 PL#XB4bQA|]p!팏tceDpaoB~D~G~<;~Du({CP˻X(ݑU9HF6?k-/ 'קr3L<;lkgjexp s^l>_?!`=س4]TJSyaGi$b(0$2,ɀ|p a \62jq)xiܻ" 3>{@0~vuWKgyV`#_/^ ȕ H zszj]f:@g͢׺6w۫t|$uTކ9sԱMMf *H(!(&6*=vw18w,Ys(ly~q 23œJ'#b3lpyym@s!Zk2\Q&ڞ=+:տK畣zhoD N d  A,Q^\[ݵ>zJqRkju S}x3b$21Hnq8)/mIan$of0;od[:jY`Ahr_5S;6 ]ܔX1 SgEVdplǹ&z;&[:h5˛d@4'G b ҵ2J?]h{Uat\ᾎN.i.;E[)0?|xb+sۖ< D; 6 9V /؊Y3[SG=3>QLX+BgTfKҲfa풖*U8o\2?-챁 ¹[Y#AόY }{Keeᶱ`Z<Uy3 5u;-+ysoǷnYVȼ*()P3pdW RGN#DK%d8M,5\)٭Ht.`7AbNuvFɑhq#UӣvhظHEF *K$`ő~ˑQI^-ő74#~'33<F| σ  x⠿At޷o5*AjଅxDyՉlӢ?8(b 6/*>؞V*ѩNw9#3'=78{ó1 +__=`2^3괈ʾ4IfUf"*Ø9Udcbn0Xhok/L}&D8 40WPI{g=4[`w.@0$lm_B!wt[{Y~f޹zp G˛Kq`_$GHnFɘY!4S5U#-3mi}%qdLFFpW 7^\םϏܹ)_N@9%Zj(7bG0Rx[HL6_f YB,Ez~[%_̝] #uRK0".w4/Nן $o*;ܹ:]gT懿-7U*ӥt󖘚O%PMW?O%2i#ZO2nrN?w؋;&ؙl[0q`G-&%٬&7,5@d}T*\ ۚ̂"&VƊp~?t6,G\2#SadfG5Ǭ +03)^ ]Yj(BȊv/GQ꬀H\\27X[DE #+3l1~$!ON%%w v5SpR5F+E,9,m$9@A k~熴8יQX0#=vf?]V360äpedaghzMkUPQ#0uVi2<"sTJ Rnd;oY{u˯DM+YT-ܷ:k|z)1!P+߆,Sd|_GҔ7臾?3$ &z+JZ`DycFSRL(%6H&NBHT"OЩj vH&|dɁ -<Ҧ CPqDĉ }'DܕHpQ<~hv8K^:h.0Õ#s/dă@M}G 3}ih?d#4*P8Y*GП03QQ T] vPF_""~z\PBɾdV3Poogm8 ONb:$ET2e/ F'Ipi&:8:W%DxDv 2̈'cf C3!؅ f 4Hn"<[${* <.gP|~Ohךd/JY1pѢhowXMrI+-ҋːT?@+05rThX@Y M9:*uCw=o,cGwd .܂>ȭ;i y=__c8>p[8o#~בy%IR&xp3/*cAb =x'V%A94W*jXj@cvm㤸uhnz_'ճsJ6w7CVŇ@=9K>CP $Mחw>>ɏ0|P)QPRcb-fHR}ih%){WHhwL8kpi,T?{ȳ?~p(,TRm^WV$5؞~4'51ІIf ՄFf2~DO:f??Zoř/Ἶg^qCest,An"WVExŹxe%[VD;I]@Rˎ' Iu? (e&%cfv)2 oDwNTe+Fz~sbÓSwNa+N F5zߐ2e>r~9OtdG"@džFSYƮٴp_+ %7/+ p2!&#NtqC t^zhb6έԤH fSF aА51QG40{s1nZ 6cikooaMB=Au,'DŽH}=x|Q$} P*N߂`*<>/ &8~RA*ba `ϴXٲm׻y觽DVq>9o1c|<(@qa,a' Δ[_0O ^\U1ʢEi91^!n R"< K${z[; \=ZfHt˛1w~})LmPU! h+*=];rF23?ڕ859"@D/0)Nsg/#6s1iI/OόrQV'8\_F 6t7E/7uf'Hu!uຶWwm;=Oz^Cf/97_h+iJ÷j]֡ R 4N~nb+=[Dt; :0`/_ .dz|PL4L(s沌f4;%" "u9n MLu}\u `syoG \,5ULĮot8)?`ԖT'G.j(cߜ!8D.} S&Ӧ3c~-^&`yrRxvض ZCTPe|tA>b4H b#߼~`Gw톅h%e !8@Р m-2P~mouqRfX?٩7}kC\tx: av呓4>bo=hڲ<>#1Əa5Y6)6^Fv%)HoXX7G`Qjcj}IYIH ,ۄFeϻ)RO'0ðcH`w6m-hH{W!,ܝy G۽j4j?Gͪpdh/pX_+ʰTY}^8VkJbBc.ېbمJ2cɞsģ8!/L" y8:jѪ@@s?_@Pʒ/>kKQ7maǜY]I߇DB~C -MU^&lSšfIIS' x1/5$l(@{G+-9l%ݻ?ۧwHS~~QWyykvb 9UOX+9ГK-I aƒbCCЅA EfZSuAr@ fMD*IXDG=DNrmY y`; ssI $R_=Xlfj᯻g@c.Yד߾ ~ k]?}n %FxpfDŽO2|gs7v.i`f /'n8T]nt=Օ|Lju$MJPHgu"r3VS[y3Hx()d`q<@qEbYƀ$ѵ AƂI!6l,J /I!2S0uofrEo{Ǔ0vPge mX֘nt`oHoV^R/+jlƔg'e_\43.&Њ?.#Vlg-qP5WhI+fXѰmyj,`()_8K7\QO:5!16׆34"ś9XtRz} c~ЖƪjP&rdvY(5ꂡ[ޭKfa]]?DlZ2]ߟy`}pbsO?B˔,GrhYʬ$ Sm1'e!T5-քQNfRgc(ZA訲N Rl;Z 44huPlx+Hʈ2`̜6Joz>H2 +}5bs$CNѓ^f+qa6QSf:m8 GЏ'7|҅oqC9}V4m_L8+'1f%sٹ-ku3,ap|Y)kA̮2;p鐜?8S&6ț(H &VTMVhԱ0>N_B1U;:x0]TƔ(^wsE 87u#dVVǛ~}n^;Dxp*jKڳ~:<=9I)<=ܑսDBubgG8ogH?+dn퇻J/_n9wEY?lY9QDa4=+W=2#xquG:U$xJM jTi׊}H͌U@qFڪ g*M֕+߶pUsQO[)ILrĂdۆ?tjP=t݇xaOa-!p=s1@ S0`p0FQ,?X22:gk3JCh*ҢxQ{SUKg\tdni QEˇ$=Vd{soneDZU(-Yz* GF̤ wS<g=bf榅XcmpfJXWd4s/'-޽(k>`Xozwf_Nj1#w5W}Nh9T8*t.8k` [JlK ()1D{?3wK&yD TX(%sy*O[3F:fzE&BF> L(؋HaH: ;k+!/PuW{ #Gۗƺp-F֚j~R./oΙaUkgfpgϜz^%SˈZVfgդq$/IhxPB#K^S[fɗN =re xx 6"ypr&Sk("`n\΃{ؖ;G{11~xt㫛K|/o&*K&S¥mlXP}i?o^֩WQv"o);/;t uE0|C2\b|M+rB,oM?}9ѯ.Fr "m|4R b@sO{)1^̸9ِ(!d2,ΙEeaL!/C` p c(ח^ 8bo}xi~3zҔB0*`H_ x,í͑=wi{< Ӏ$"'#wwȤ`oq.fS $2YHR@W 1,hz{ue . vd3L-M+J)raGG@Ud|eyC1r#]Kr&M Z4PDir+1ș2{ eSQDXi1 ryrg6|o'[gfn}wy;HOp֜Xpb܎ˆsW6 ?=zm"\翽6(\_>ˎ# 4 NNM&yLܵxK7D;;[h: ~JQPCEFeC3Rjy O,_> _Ȱ1_nâxh1Uhj$TZfTbdڏ_>'=1 &`819qg[xz =D^ֻV̹o=:9T7t4|lKga&ʆ )*R C[& 6vh*2QVT#WZWXM 8LG,1d^2)a2ZLC7U_{} ), FeOOyeM3*@S₉)fmOmGʋ-#,+ԅ4v$RaPWnL[c<,Ɗ ֐{ TL)ۥFAЮ̉| _֟]W_ڛK"?ZxF̩ڔч9>.@ޚ/>"!6ޙ//"DqƶE,"M9̓C"Ж"V9pٱj(̍ U@⍐ک0L08l%XvΏǧ5mơkpp۷`6P>T6H 0Z6%Pg~b7.P?ax )cO UT8,YdXM vpB pLǏuZ*`'EXH$"c2Z1$eԔ?<\6m\lb+v7_v `ypmmB n۸p}<춧w}w̶.F(AkUmV4z]FG{ir֥G6^\ztc+i/cHSaK1<1 7 B%g Pf;N(*<\JJ0!FAEj'v9[^&2W  -#=Xx͛D Ĥ练- kYQ3dF'1h+$F (I~0ޗg&d`DԖ3<~ 47UvÒZ__}D{Hg(E`\iaJ` ?ӦO ?nF  Tz:B u`2ae"ߓgVA,I5&vQÁn+C\LYQ0uǏO4-Xtu h*zIE~~hnrdpw!4q(#8 c;]9 ϏOx< &3KrIxN{RC7!^iM7E:X- b-s1nY}wK5T\z{$Eai35/3EFz̘T&O1T ιM^ (2?U7;A-s[1uF^R7r.qO]֞_$ 8*Ӄ'I"VLiTx}\-ɠ&%56HL4'_} 1.:o?2 #PsIa.)^QFZk#RkCB0!~!,FS 91Ze%G2=AP# TGY1WWe .+C 3ehPEi j{x,txМ$lD@BȠ$I`sEPtWh͈m^p1םVWmNq_a)-̝L-}ܝ7g1 fn*"gE)IS k_OO ҋ?G/ ܿo+OX뷫D-W7V,/ cSomg5e",)2G+#]r&GWJS [TA‡DFG ¢Y=84[ھ.v6fNvh1ˆ&/ݺ,9,5RW6Wiܳ//n{w{ qeA8]oɡ'֜Xxy9gw*[ouÖ՝8LU:`&)X/UbɌ._a0y, f4z3y8hNQQAÜq9iCc& F˜Bl7 bDmk瑎97#ż!bS'{]|'H.I s`%Lb?=) uiii~Hp-MHM% xRÉp&tGUPv[ S<4Gq&/b6i:tA}"cgQ%OrqNF(1b=,<`}ys-Ds~!g{9 dې$ #Ѯt`Qк1Db>dz@0~C#E5/}~r0¤ g b 4,Ed?WNM+99eEKB W좺ǾG~uh{tbkiPM3)2H=G/.DM0T$03Nca yd |db#o6TcrgM2@R9"<\W*9g{ڊY]Ddz j2?Gһ>,?A_RhjTdk!&* _&YPSȰؽU8nQ x[# at^]a>15ǁ.灆 <9*7M&M+ɉ+(Jloz쟢_bkcX(s0'5,Cdgɓo1:P+'T9ЂK"a_cQ0?tggOYtccCe@sf!ΖG%z23{`}vyziBHc^<;<.7>7#;o\zӻ2 z| )vvCOLtVd^?e'R1{z {`\  #K$dk lR\"RpDc̍ ZVf+gA禺oٕC+/t9] ߿oWMv S]{Com6MشoQl¯[ Ɋgv|I2,{ZH}XKDz%}H.1><&0*E:a6As"&O$b5Xj:hb Ms@>lOv-]ސwCKv79Nd_0Tk*}wҁeeiᕙQvڰY@S]38 efB&W+d1s!sP9tbk#X4m;6} ܺҹD#|X&hx"(/J?V5h(N.VjLX`k`beǪUGY wZC } toB̟W@0-pnM."+o,ĥ+vn"}//j1xvuOu|ڕC?eG&$SH8[ib.-ɍ/6(WOգhhH͓;cB5} Oz cΦ3P;ڙǗRM~Ejr.m9^L}pdüueEࢂ@|gyUsݢ-߲>kʺs{ ه~ v"$a\4-M(YZN./Q Amc߶ɜs4C طcM "m!s1x)3bP~ ƪ{5>՚]b/SK-)iD] %i&Dr DڤpN*ˏ_XRʌf>w7'f#XN,8o QWW;W@T~v%Ic_'3[9Vw4Z{4]GSIQ^X^>.ڄ](L4B ۚkVΫ(Xrtꬍ xr'1mHƓsk)lN<<˵}wf.t*o\KBG1N^a”%oGs+rdx|g}|rS=[@3~q.DT٬hqNШSI:[ҏb2SCdKPT#k6\UU oÓ?x `OF3o?9םC?{1,.^Z)cxBZvtjs B hX^X: ޮ +WH (re6Հt+L4eڄ9Yɱaak:g-{Ò_TxW=DzC4ڲn PT8*@X)Ni̜6m3tXM 5X$˨8 R7-ª;طHm~MɁ>V pn^lW7}ٺvѮv&% 8"y&!Z'Ss1T $@Rz^gzqVԛoFy<?,],/?gA3SdKhbv_-O plP&)/^–#;=DsMẲ,C 4Euf#EY[~ =uuo͒YЕ<ȒegY~5ˊSbqje1 ̏fL֊T f'GOiCEi'e&+HK3j^7p{] 2Ah`vޏ??<m%y-8-~6. ,=yſqdcu?pC+e S|D| gYS@x{qs$q纮&csY5vw֥DqR23=@Fw(1n˜i 7OոќTJ1`Ķ/~:b p&I-0~8Oh4+N|ΈH\'AO4FMe,EŔ*Lu]ݜN6f͛U{ r/h*Dh 2) L~?ڶmnVU2#CW[*?gsP7,[[Ϯ*T1Sa';8BH@ҹ2dP#~x9M|oM3b[=u8YIL0As{IA 07G{tsWUn&Ж:<{ qo~<9zj68 o|j2 I›6 !"~܉!0WL/Iw;uɧzW.tR8y}HvᝬK#EP"|'83C{:Ą253VfDTmAW#E y6RiMvGsWHsb$N.Mצŕ{yGӖ{5qٻqyСGsm-eM c|u Αm~>`kw${ uX k]#u^)aQ" no,N!snҴqxJ p:x^9فp3L2}!5zn =+qq: B]3m Ъ0+w!BED}֖`d,I3V$'yu?x $ ӊ8+9tꑃT9&\ȄQX&chCB#e\|%Ij\jKcEf`xU&6BU W[[^|yk5]o ?Z9{Qs% [r3 405QY 1U q3s#Y̦{8?x`Rf .?'Rl $w(TgmRSe΂2_d$CCkWW!Ψ,/oXNb`-Z^HE [[i=%N:,}]S%3ߺz7>_NA^6Z5Q^R5J0" ty7@kzeui,$1>!~ȟ#j73|8LBVm]?.n* ״mb׷iy}5n4 %]il38;f9f R:sn"Q*H5gf.$YA>trYY2O ܞpNuLxXiQ0=1ʇ-f4BAÚnK*$jƅZN>{CAr4fl$Yσ~MYXJ#uD3CĆL'; =ZPFsa:!5@da$ Nd.tT_]FOEiaLA;LX#DSSS㣢:_ v`-ppw8䁍m^մil@?1k/kMoh^ ̂Ƃ Zэ Z=#>|ƊI\''g,ZdFB7pYy,H'1\%[O 奊Ol*K @dP=s*i?"<_0%v&LaJ3y\VPzAE]C Z#x>e-yS=}Kg4U+:uDQ.YIH#Pjfb GX3W5I秗hi䀠a7rᏏ.r|Vj;us1| f:n8uӎ5b0Tt>ybKO{KybMV \6&L!HY IK\P?ܟN&Hlӆf6vsRO+OSS66e'$3Q~!;ך-ܔP#q3g`ʟ&#̐)~^vdBl dRt3csrpkmAČ I"j+mMjDH|-׶UPW_4W⊪b1|y c+U :7oh{|o|8P6VA9g}C_p₃E&9d?Ӓ[G}{}?Hq׿#}OލqYF@r Gi_lPD- {@c6c - OoI{9^Zuޟ5WlQ-/{ƾKx7ƃ3\c)*NvZ6f Sݎw\>J@cYVA D'ڬ؀P+#<`y騀3|=ǣOoxo^A _ &c1evs#yyr.vfl e:i/;VlIt|1Xђ0#'d89SYZ?! -kiX@5d!T QXˊ/Kڹډ`ف0W4q #Xhc\ +`ha@#C.=33*.F:䦎痟mU:mZdoF:!•"@1<#{>=ڇ;u956̧_6*G#DC߆ 5 - $e15&ƹ}zZ ̝Q`AJ4tbY$l[+Ag}L,-;SɩqREzso3~ ПoݼvaǼ}f'@"&r&JALNX`SI .8kdy- 5M,Օ4P2e`|VPr?|gtbjꇜX;3;{``oGN=č!/$.4ȡGy0b ҩL w5Wg~mh_|Ït$ʨ08e'qB(9% 0-W{Y'j>xo]2FFn;wؖHpJ]n.)p㦅0*.u ksCc*”hd_mK2bScC<43,Z Paf΅&﯃ c_ #˼BLQ`nz8`L 6PVщlu_z^1+5[ͩOq^0_~7|34򞰅<3_faqS2W%ʖS7" ˈQ("`0\)^6Yh*LD}Ngt',{zpqqR0Хۙpٰ&Ɨij?ިQ\IۘªI*c1Q{O]7Hۧo6zL$)L+ii d`J\^Ѓ,h[gS=7kx :J rcL؁~=jq IasVU[7ibΉojP.7$P n_fPGv!4'ԓ}rH HZAĢtAc':GJN#y%|6lُ2 N_8;9@sϺWxd(!h璡`jgcqx2gt)VPxȒ>8LsqZ_;K53OٕRؙ1UTTf3!yL)H#Hs d01;%\ពHp<15468sx=G~(LOy}'?)y~l Y X$e9Uuc~TBcǎ&i-ݻK1â.3K,F\p81D^G1+=\#x&@΢s 7:Y? Yij+h?N@fC]b9!zvq?!Ev |`h/]K6f0]JtI~$sc 0iQ^N"hV)K6/,qTgǓ/ҝL,n.Lh}0b\%Lylsp:gq֒O HEȇחއ?=3;}[B95/h(eE%0V7PGƞ!kBLx#UzoL1[}%D:qfîcd%6YJl蒃%¨s)qbu48;8&:4IHGDݗuO Q߼O/8:lT8x:Aq{&!LR3 = o`^B0I޼h:.8oǵniSG 13(ٷw0>k-W02Wm}l;!!y-,cBen[ֳ\CWF{zq2Bi"U\(. bɫ F&JHq o m, m\EGс3/%JKq!Ȱ pYq{sNDuFc+:MUD[HB0 Z2oYa\X|]n$Jnؿ{aV#1_t~1(]+L=n,wb, 6| 2X=h;Bm #$HS=1abt9;"M3ݬLz6"'p{B1nۃ6;"^T|,гI'6 OVDrgNˁ`J7ܔx:[WK_GGu߾*P |a''9**T ǧ<~F2xvn28!|I5c5ϖŒ•[]I="=mN6"k##OV%oHdcn 6cl)mz 0&,X9{a+NķF5Pvà _WІ+<~uh  1']nˉQ i7zSe MIn\L)옌@- ȊB&+u'hpyŠ"9SB makʹ` j 6Fwo\o/ntť#OlxWDHH5YHˌ Fhŧ` Y VkK?!*#Jg&.e3-S]Q =e< E(U'}Fa# OtLzzYNKvtODfR' Ao;7 ҏ}t\;/Jzƛxxtr TC7gC<%{]{_O@4l4J@&TszQ⹕2Ra4q1=-mxr} ?<\^\ēvZx@u^j17W/l[SVt*rZa8asyyQW4XޑmRifWEs)<츓Y(HRc5SbCC}% ^EQϠ)TꎽX'@/R""ըxaCA9m84X!R ďy J o\8\qV*ނ`wG$,7;eg/҅coK ؟{ʼ-54s$˱4;G$uTWy nn)P ;@Evgͺ sXQʮ{V0~[Fmч0o"u//}}uV6~ ։{57n `ԅ~I~`Y5(5bmo$g0D[CYMYcr7=liZ^ζLQ SwV@otGU2aYi- |0 k*H (+#If8IZ`rwop΂P7G[1N#j'πG:"O!YRm2c8mPP反TIQ%i)b*3 T6xw,1㜸nN$Yx8\ڼ-h03a&F`zj92E@g'PG1GU Z_NPs()I,$O05v8w`||<@{M"fyv΂ԀʤD`SȽ>Z =z`L"⮮YX8?>]^3n(dB(v,w/w y)m<ħJIR UUե%gI0 gVŭ]0?4#|]C6kّ{zlȽph`[n7Ovl߷w#0_/10 $ ʀ_$?EB3s#\Nhbġײ:!2^&gzB5[HK40º臩2`g?,TF0uC-zlڴha}cEkY$.*{gp[o.OL"")ܽ$gɁ>39q~膺{~~dF%vJskƭ &ĝ҈F{ʺ:__=IqY|Nt. xLox3M]M F<p|,OpPͼ%S~x?bD:!COG[α GR04q$qB-+/:e( XT*Zk)a@3wYy< L1amiQ8!;#uRCvQA:^KWp'9cʕdqzW//ǬOozítHn}yj+8:P/R#c]p ͩ1D!/%0Wa(*W%+k(&E\nl0D1@N#3+<:ޕSZ$B̂},Av]Ǘi2D }-CvvTs@.Ytql$z`GڰcqcMsrӡA*G#:va3q$Qɓ&M؜9/#@mƬ2r)Ϛ5%m6kX4.Ftk| 3ΞƢ.?W,+6}2:8PN)uKRK M,MO[=5uT '6c@KKGM bt_ӀƷiObDs # uqiy`?W8տ.&*zj܅ Kh6xzxY>kx|muq#zz|n߷ٹPJRNdi%&M&:kO[~0UOiAM:@Fpہ:e$6fO\ Yf%Q0'z55A'1fgܓ0PdWF(IM7ypwS>?/Pa}|ɉ+hBe!PB#K:t~ox;ZjNBÀD Gds@1g&?0A M5qW@Mq" 0B] Idk?< YІ7o8hnO;3)x=]UiUJgMb=l94 [gBnoloA9(:4s:2s9"<0ɛSNw((J0n\0 :5Ej^RNV[uӚO/۲%ip\z.ədF81E s5%N,U9t #:5֏zVi.y-EHuIFqVН*9Ip@ =ྂ3BG c2#|lm0C ??m吗2}KȦ֒޿rݥ 3)`C…j%P]Ϝ2a4+T:ښ۳$L=>@oP J|E$5(RTX}xCST,E_{5Me1!!!>VF2؟,ș9?#YGGKK@P#8y b%$L*%-+7eLn+܃2Hƞۻd1Lщ64 tV_޶ ioǢ[?ۄ0fGD$ Ў 槇v8mIA̅z#g1>Z?80 0i p*ΕʦD2- (5Vs|xT.[ dMEتtrMuÉu[ 2xR#1Q pF"VIf %[R `}{$tvRԌ NeҤR] NO$yqnxV.B3"b1XZSRVQH^j "JCAIn3G!uD+W,."0^SuuPMi.͌$(5>DZ0W 0!WgKJQ~B{yb>um:"|KGw DôɎaya:alS޵ѩwn_͏>MaܻOogPo쩇|6gCcѪ|2>0H :X>,!6Կ22#:ZPLÅ3;;QQwBSm(#|p o G*U 1p$T'W,%&N&n}afc!Owdwu oz8aAxcqC@ȟ?~^ݴna`Y~^60'>o"Gh#.~s߿ѥ[K,[\I{ᡭdž6}^^~y 5O˜5PWJx~L}yw.eԕyzzsWHkkkLLڕ[|8#c.L R41O{̍_A4p;/)!'P03k.Ef^N<3hтD^˜@D&9W.,9kPOҲ ٳܱv;o!9A U9je􃘝iTY1Erˣ;ZB)'R/eUQoVV| XHDSY 3` ŃH5=ƱdIUoefu1 >ws$pۖ"&?x-E )dгm-L54,+K3R,, 3`M"g͉'ve~k^!V?e^q/]YOʆ||,9t.Oou:1<0/v>{u q?>}\\+-*]ݾJKVlXKY}:'xHCٚkȓŤGGju^F$|*q{$kN/=®<=Ǽ?C'0lxsC„"f+$KWSHώ?A1AnyRCIް3zsh-ͫҡ:ٽrKW-+ڵqe5 7W0l/PUj4?D[KJEy&pQjL5 ?5>\8Hљ_}􎟯'bKu>65@oypba c[[ Y}KI9|C8gfx[+ʄڲpǪʒd]VsֈՙHc98A ts̍Z( 7XTWǼI9R $)$f`89[8875EU'h2[ qiZH@`4]iZEjqreś0AdW0`pD+:بPiIn{;kH H vi\]8GGRpeUX۲;,{}  (8l5gl3+[/V˅?]ōC(3H4:K#۱l(;kC8.NQNJWWqJxH5 3MEh0d}x`?te&G9D)STh1;GҘvA?J(3S }<:Fڮr8)[Vb&`kqi>-u3L&XShB' ( Ԏ'׈-sFz]V.̌dz^=+& LHn&E0 Z*ƞ^YZMac83|ybbLcm̋lbG|%@OyM✥*O{ 2QYӃ)ܫuG}@Šg`)#<}b>7,*[ddk${LA7!"8'%{c+a6~kg~F>4rh$(ɥcm.'Ԗԛjˋz.ݵbqwsi%n`vX;rlk*JXWvq&*2Wkގ{(@T&M >7W,{=+cg7ƞ]Oqߔ! YiHJe۱( }E#,N$m-6>\7k[J2r&xpCWVuTe)Wkd EI:6$!x)ÛUNJ1Plm_͌U455Z# @.a*)lqr3#3L1 2 A W1 q|з 3]3֎]~$|{Ӌ,Ʈyޕ9ř=ܳHnb$ͺ~^T󫨙1Qj[dXKHo~2˚?8ǃ_Tye%ْRY1E&m7joDBnBolrœI'S8qpxZS-Aa\=ՔHAMҢln` j_:2rW7O:9%NZ=A. 2(NXqjg]mRn3"`\1TN$r0li)11+@WE!HNEF NgN;$IgkU4#uc!̞l "Ɛ8/L{|ͿB<興t P&u m,Vdt a%v:/L>mk[UWs ~x)e6%RƉ 46// շ{)E4&hNKQBfxU0C;@RFϤ af scYS䁖XZc0*9YEEETE X$=H Capј-!b ʎhuUe\ 0*V|/O퓻W.čאM6aAh@,-%%@O\gCۆM?޿vaJk 1`f& m]BqdGkg8COعfȎ7dvs1:#>?U$ۜ@CTJv02ě]W+5I!1^,/K_k}ZB*b;Aer`ͳ202 F [2gG7 )8f_}WUE6 A )/,tO%'']ю7LSXSHԕ5i[JеԔr -U5fdndFeͪ "!%.0UtX>"t c)S@#)oc)&܌䙠Α޽dAO#֡Ҭ  7c&Cɋy0YПILe^<5\nk.bוgUλ{0 ?~fa٢}뱠|Y?[UK(6Dww3}UР;[AB.CfJ3Q41dpVr|Z3rUe%Z trnF•π}Q_xw{~OPFgv ogz~6Ҥf*G  `H;XcmlZƀl f:9;Yj@2 0T|I 2Ԇ>i명 YV7Zϝ#1F!a:AvLi-`UScϣ;ʰ$ê=wn4d~HeAx 6Qd̹Y%3wyt1`B Cih$;vTRg0EwKw}}7͜|H4.dXXˡEHQj_BKFFFn,1,qH80N9Ljjf3{⺢ʼhf[xoyۺW礮n2ə݌ޯoj)x ׯ<ϸpx4{^,rᄃbHX"4tM%(|SpR&c᫭e[0b j"]*2I ;q@x0b|@c^,0u.۾=jΟmG_䉻 ( ᮆ>͗lŸrC{Ikj%s`wg+>,1ƹ 9i`s'q-Ca Kc+%N4vwGq9]t*ic}l q5NCa%[=c.3W W! D.%yYK6>؄;QcN#(gp#2ؽuiOrIM9Yj: B̃wpف?138A(jL H]UU0 0I)KJ; 2!2cr9¾bm+U'D)Dc쑞XRx3Ϯd-5ơ1A~qNc`2 )"F-6j*YmgwQE7&_^wa_v|؉;@{F$'**EI0vzSH `+|UTrcǩIr"Ę?*Ȋ+R,2ˠ~e"7w:{|7x?3l,,ǧ/o?w|E^[okn:uǟ%\}t/]HeUQjM"E91С`D2E3."7G PY}pJˋXU4YqڏwX`AG?}Nk?}9<Õ=褩~~JOQEV4%!]Cyyi0X,*bPZWH0" *qbW;3''cw 6$VwQXwd3|0Ґu52+) - 2P)ɋC Nͯ^/^W~oYZ&N}|{G*mCo S 0ۇgRbF,LN 0ĽS\ٷmBak5X#!<G{NM<)UPf!BG \AnluWwYĖO]7u_~xn}ynyE\ƺ70T/6&ش&Yas|)`{P ٸ:Uՙzꗔy:{5ѶBBVWE14xp,%t X`g۽|Ql-`b yX6fls% SҐCM2St?M.UдQ۞_:˞{ő?߾\?sg ѻaIUδ#`ѺYk6Ƒ s*RkwmPP b<ݻ{viֵakg5C}YJ3aYjgJL'"?sAqɚƢ}-LDH}tOWW y!~lMI?PIr<%KSà 6tvsJ FDkaI T)Ufӆ `?6Lb#f 4R~-@Mb# TJDxq{u2u @¤k9;4^o X̔?>mkѾH9t!qF_!h` fdcP~O~`7N ۚ8XyD*:&0JS~[+c%5奨 %^R4M}k"|" ߽YUd?:o]M7t(ӻU90'.%("M1Webmpf-d zZ[@$A'UMN 6[m7s$F25#r.\w.c,&50->#eS57F\8-tlL쀿dEx99-.N)?(k?~|?:kš p̷5-BDڭ3#^?zp>C?y΄] %=[#\ ijKwt= D6^_^׆lѷ/m-[I_MWKqY~BײJ<9أĠ-@; DNz&\yqc5y,M]F0e'HСT\ =%eی΄'.Mބ=MPG TCAzhI "".6i515;ԣ ƽ0Λf?)km0]{`gԅ?tZΧ/oMҋ1Cp26Q&ζ- ТZ|ښ&>6#H>Ax-5edZdP HPUgĆd'c8dY A\ۉJ9Y|kr;xu762nCqQ\YD\6A6R z4S4㢦NѰ}XKb$jY pjk^^HQN"=&.$G4JSF{E7;{')NM]-P(V4@/-k/7bubP`moP~|~}Ê@ <{=8="|=Sà @82# }*4^ףžd h" huIͨ5(%1Pj+lchk -M eLؾGHpI%k/*LJ0ВGŨhŽoSrV()4*)>Ad6c` JYZ~xգKeN]|$(h*Pù[-@KSDg k!Ԅ+ȮCՅkZ=,ͫJF&؋|PpgsA<ʿ\R ~6֩e+*epZf*O P١KTyYj /߯Hs=Fu&x(6鱮^&(# ҥz&7VeGu+ۖd,=&?x[xOmf6Zx`GuL>{yZ砂YAR7Й7TM$e;;3 s],TD\3gg( M+B/18jfODv/]zoƲ\3uWwkdGUUe{I ܾo[O~Z1ogmh;s=snN-, ly;Yd';c$Z_-= A.՜h"RHD7Q(})D 2y x ZVRܢTÚڂG-*^8Ts$9\QDrTQ YhP *+^ 3s~bL-Xl? "*sâcE΢·@&4RRM!B5y1^sf_ Sy i!6xG{9igYoݾfnj?XCvKmq\)5@x!Q__ 5E!9g8аCe"QOdt<,H 譧JJ*qnI~idfćXGi/[qlK b::r3H<FAĜ WBQͣwdASO7ɂn- ^NiPiTf,  rҳ@-QC+@tF\CbmjU_V]mkd70*(ضv9! eL y[!M B;QJ5;WጲCwmh4QJyS.Ch2㼏oi=ǛTP@ԗ.-%pș H.oy0G **Ka+bEknaL9e&4:*Bm\+B\U8 pޱƤnYuK RGwcY6RdS,+^P_Z?FYavUiYauYm1y:o)J?{%d7VdC5vBNX'pe У4`Hu@/!.aE r:Tip Ji|p7pmҢlc :% mZwQJAGt>lH!DZsAj,v-}0F sIV|*g?2$>6*&Fj"FabG67;|'9Xd&3\VdrВUJO33F6yo^1CIXEg}¢𐤈0cĵV1T2.68"&~t1xC3yU]OSt27p5zxjo^\ȧG;Zj^2-V+*ё1qTt1-iۇ.e!.(91&XW.z7~0FQQAt$"/co^er\Xh8Qăˊe2H1Ɉ )gJRx:P%'3@JFF\F;#}< Q4+ٺb@"DPq zX1P rƌTF9@%aPI \l 3307}:<~61FIO"+M#(YYmEf:jf%^bUj.MZ>&D[j^6x.m!k0 G;Xߕ g sW4-`޴흑׷lh+ȱ7V53P$LRWb BjfrТw޴ؔ(&0E/%%MϨ 1xth kWIMo8f@pQA$ƈIYS Sh3{ )->$LvTgݵÃ"}%be"7\SBl3v{Z8hiO4|0W%Y||ݍ}?Knʌ,Ptsތ #/1@n6ҦV>͊$"qAd>eaHem K-@gHW@`>V b\e`"ERLVObg&x>y6Z2 '* ̶ؕX嫩ARg`'ƚ8sebm$1e@qxxWϋǹN> 5uz>\̀L R !4CdO) e>6"ڏ"{n#[=HdnLD|'SēxQiQq<//Ơe#<]p%'9C-) .Jc{BN/ L˲桫|{ukA oZ2,(c3~PcrE@ h*p`w}bqu$99[‚P>,ב pxQkLh0ll7LSYZ:> ZNqj0q wg$E#-Η_±#[!9l.y:8BofóhI^:;)ȃ뾦Ҳ̈p78x,S<\ !5xy&rfx!hՖf^(gl}4;,ZWSw`YbT FRjKR@a!+1yuCj#jjm% \X9 RB ټU}͐ML'ND#;D?QӃG㊅+0wWKL q&g 6dFi%M8sVLL)FTN + *DTlSǶ^wMWTXw0g{Ɖ`q|"05Ȗ"Pi  l $_{Bq 4bS- @`7l5XjN6JTе%@!')&asfr(8F!l[GA|zmï箩ʴed%bBY҂Cj+4D(]8 ?3t&B5ym&Z84TImћ ۇ. t^cx×XW=jBG UHF$o3;!JC9?! l6208&&0Wv9 l"\cCh8жoG#}k65a%g/;=e8F!b:Ht*CuUnaj,{g je |xvU d [*PPæteRE`CU~~~EkfD(E#LTPrҁó?_;>н}m3[ t\pҊHoKTtE0#+ PST1'+KsvbA.LfpEAUY!.Xt I…)H`ah7i3-- 'r/-Wip2 @hkBrŜZ usSivorҀ 7So)5wu֠GaRźolŝ \wlh7ÎN IML]gpIr ƈ mK(8 U 2ߎ zfSDJd?(LNLD7!Kk{CZz؋;:oSnҳ2Bx- $]Kj|$_)B.*}5-}~iy7ݹg`}6 >V𢱾3rgF}*KHIKB~S2`y*/?dq1Sk/M+Dz9 !גD'wsGHYᨇڪ es?KC:xɋ ̈\ۃk^]ytѿ`?<3x+uՅؚ ǓrzhTH15G w(w^NѬ[8ZҖDA_,JB &AlFa TgG+/9;UR@pq2loS  Y~.N ԍE ߉eKf>JS׷Ġ p%T#b9,8B$ p+-_  ڶ !u>}ro0v"Pnzͺʥ 3Vu'[co^}pLQfjBd 8, B}%ť44C `ZKϚnIP\V,MФCa> 3i~ b͌qPf?!.&D-F6_'HDVY)ɬ_U""|"]T! 7|+ D/^r~)H#n3[-`'w @n'Ӝ4P7( w|=ڀEV/"'4)"= 1#\n[n;- >v͌|P x$g DW5)1I `mڪIV<>{u2\Ǡ7.[|D C~̭.!NjL3C;~|CΖ&;~wLЬuc"A;B4dؽL@<c]rYӸ8"6Bo3BfJx%JM%/jm*vJ0XB0,5bN &!h4Ĺ jdU.ɈbvOQAL3Td-fN_MEI2yNVa*{Tf}j V5--DL˳3<ȑB6e3姄 "8 "ey)LݜYdZB􃜤$`ޓ'0 s&=O!fB'X 1T;oӘ3j)2fbJ5bL`pw 09j+O{qrmMm$ԟ\~!#]?EyIKO-&1YtG\.gK]DGyP3={;&';k86/+G&VPGY[jQN-YI1`>.yNw|Uǟ]''89YFf ^:48ǗouY-Q3`35BHGNM:ع#!5o@![`l}{n9Vu4xpѭ^Z}v^^v‡G@?v R 'K{r(Xjb:i2#aOXjC}PX~- H46<;!`q^"R ^h$\pN6z4&inh/JXma8Uyp@G57dKK4j(@ЪS䳤<iO \>Y ͝pKv}XOIB ֋̆KGzٔ8/Њ/&BDb{!dECu`fmCU#]KyVKYF ]\U 94'9嵪Qd9la\ᖏɊxϺX=u|[ "D$ qڪ`J9,v z)N/K!qgG#re׮ۃҬ.8N;_Y ڏ`i}ݝD %ńqhqj@bdjQS}?gGwF_S0+'@(-\UR5hUaRK5 W篣@? HE/$&XNMϡ8gDZ^l_T\O 8. ]$-s-v}x.s4Zf4"PvۿU !,;sICsIME5{a@iXV7_]a͞5c $Ӧ^=1@\eZV'D[I,kD1ΐp/'BJPq0UXt[{Р֗:Ws-nvݺuAb8$ EDy)i`]Fq}Ma.o_],ߝ=~iYL 98|QIJN?qwME>>\fiuAN} [ih l 煇^avZ3CXdkjܭ!AaneeŅc1"~G_[fD`ArRj~xDgL U鍽%tc?R&eU ퟷ/ > f~{z%XN!3X"9&)T1 ׆L Q&{cB9R1@a^=5|*޾Ta^ C)E?9W^ ۃ!"9ZWŘ(S̰NcgTW!%*GZ@f NxOLA``?2ks07Op=B] |F]5 -5#HȨNF=@YΦL9!(Q_Ӥ&LazU) L|츅M- D/<L]CF<*#&񧷶.-Ύ!¾<23t{kk?ٵX~:׎=:v-ޅ9v p1頓38Z;28gco=<_b١£N tEy#v q6KW$\ 2L[Օ*WE%Q2[*=9.PaVd R1a%bѭ[{Q>1F͞'vƱLׯZVK:밪YXtw9K)IQ[1g+mn:nxvzFs\?JtxIp'$0jjfA=ZC>`|GE/o!Z^X)m()ͳK,9 XkU$83qFY}tܶS{ #RCP+/@kn[Hn Hrr3Z (;g36@~`%ZS V@z_"7Ɉ`_8ho*jmRQVef`L}aВ=@쫽h =(ivP/Y })KC.&tz6@dEfǥ$в7HfeN*b6Cҳf͇ {3L U)i7TX8Ʉˏ@e5Kz-5  pOo~/׶TH,Jil9g.:'4֞OSwץ4ieaL z gBi<6FK?͵]$W.^XTO2←S!%kkwXLK+)6NXb ڴΚ|  ɧ[xwnᆜ=c:}ЍJ"y~|Cr΍Lll+h+LhNg/";( ,+|\! dLg?JGa2``uJSwLoK vʸjyxӛǶe͍5ϔ 4K(՝%{6ywQfwp=?~OﻷM5Um 0&l1ݲ?*H.Kj:Qr {tK 枒CWBakjX 9<\gUTXqM5/@ELSlBr@ 7+bH7(iӦ1𧟮6e 9սƚVv sT'a2L}]ܘf- Z{ uKB\9 )2"؟ihPuC8c1ނ' OBZ/}E ,>y:\M9)2~ ݑD\pIt pTx%ˁ(k cƚHCPAܱ*+<0dDl| epLaIB9ZVY >Ӂ@U"9>ĥ@8JJ,2 B,q˥p$P"0VDDWY:3)+ru0[C1uE2P*rgȳCK"?5[<o̢\MڊțomfVͣXU7}{k/Ot?cC Ec?_[pzK1v Ȁbɫ|9zH7%dEZ)34u<1E $λھZ/w%kmtV䦇WYI"(XZ0[*mfM"mln)^>+GR0'.R88lζk'\<Ŏ(,{ZY܍׶k˱db\ӕC~^%p}/o`O0ҙhplE%1h]lÝ>=(̞_=1a?6 Y У#TfĀ}dSëGhFBEmi"nxeG N[T5T̍)4Pc{{:тHH2D)ȫeCv0G]Vj72}/gOdk wO}|r(̝kmjX,xH/O^:Ğ"ц?/8jp8[Wuq+gZgŶTfR˽*\\So~pfsRuQ'>ˢ0+oǯ}~pމmMs$_o}) ۑYphRAXj̎ $jR8 @ݰeޫȍ6quj*Ld+QxCٷЂIZK3rbx_~A 魐|8c] -'g@!DeFSQZ-{jcp8q=ȣC۪zOop`unO*?؁F|νܿsd(ᴄ0vHA$U'4ܹeōh)XH@D5KҼy2lj^MmEEyߠ=&LC=?'; IvI41# #H3PJ$P*bP B,^߾ˋpy۝:"ahMUwelض8qEU`.|ܿퟟz뷟^>E{fgU$P kS^ $gEMHL5Ճ=]Q[y0w+"sjӢ >n胾4a*qEl9%bB*5wq^]v6Q%_bK3hM,=+QpGH&8/&'\hSP$@Ֆ*w75色"?#Q0y#ʌXAfVaV,hOGmAw5[LGUWw fH^S{;&`G[ K ~H6saNN+رٍB T¤"J!" <HE*bߕ,I?@/ 9Ab:bv$/BG`(,=2hpCEJpՖ "T3OC}0]c 9OB,pbs3# A ķA:@F18I!95  ”ڲ8ц{XGuvLZZKb||׺]ǺU bS-Eas Wr25UOX" "arJ^ c dpI 6,Xp@yF*rsAt5M98A]`T(op[S*ɢD5V쫤$&jZ~oHk({`jSM>?_n3M-l #@X"4/``2n 4d%=ti ʺ8@`X_{-/1Tu:#mErsgp8/e̐A)/'=\,nHyA 7} ̡ē)O))BdnbdX[Btѿ ¢Jz ~vy/)W쬩^ & 5C\1+<|Z+@g#2w)yp|93u+@% J3$V Wl멁O{z)dhl+>>wS$ S|#]6I u;FڨJ*йGZ';3oo0V-OZƌٳ"=eOȄ(xѮ-W@eM p shp,]LYT܇? uM*Eь⧯CYTD;ӊÞ 0<ۼyѺ RA*?=@6~m ƲԡZHlub WBp;w'\],>$mKBmY8_a]\?ݳ?'FE`K?7 b#5],_Ieط֚LƥrrwI;[F[[iW{Bxo'Y+eDsI ύ M$ 0۞6Xx$߯#,&dj'Ûߥts473FED{ ^ӜО Ntd:$: (7F`͖2KYE1@Bc-ŮialJI-~ rPk+ZWdĉlhZfCp]?_=D녦 uAtk?|tnEo}[ZuȦ8a{8'%@kf} !~ګ(%^( +0]-)gH5a}slIuDIڔ7u% hF"f:0nY]|v[O/nonNLXmFM+sl)wQpE,٘ʴ=C+ c}\sΉ!(z- &ђX_d0w(o, mw gF"MQ2ZHJ /S b=A4 !(i.%chZP]J`` p?陳(*J2asq9wdK/ƥ]59b{~rVH‚m[;X%[ˎY'Ua[)*?>֝' ;2J_]WWuῦj)6ť0L(_!%GBbB=,?̍ly;=0; ^1Rs^.ύ:FU}ri5C[[7u3fncB7 3ym$!NCʈI"t0jd\[>fْcf2^9qa!^˓N01n1TD={"rԋs'~zu~|Gab'&[F iIϙ7[cBaXK1͂V 3LCNu\(3(P!TkI\x@jd (umjp*κQt,;ԥl$I1A aF҃6{n7=IEj!r67~Ό2Mb&и< B|غuM_)4O .pHg[#ZdYM] ْP5&wMT܇ԯړ)@ۑWm@x_#HDC’g$M ?I|Q?۷I o䧘cX/8Wh!umHQА@d_:ܤ#55&V7;7-RT] EAk&HtoE-47J&fDq 'ɵcbPthS0B@Ĺ [(9/]nU;)H`G{[%t6'3;ڝč wn "$/·x'hrx Zַr-,),5a0+>l*Lxۛ:zadFq!JRܰf&40|GSMI~"R*4dE"؈3χB&scVzZ̧`ϴd%rWGS1l~lˑ6f&'QaQ0ئoܴ:^ ۊRKR#Y"Ҍ4n¸ўAuϐ uc)CqEBV??=?Hl=؜T9.!OuTd$)Ϛ1Xlyz<ڋO}D| 0&:B{cyķA'=ywd u[臷O_ /]uQ*("܇y+1ӧÑt6"l ORU EĦc%InNg-2zz8?ڭ02- NhNw^J V+, @IrfΝ.u`}@caOK),^]\MmKaq\XQvÐ rnWcG0&;SIKZs(.ȃsCȉ;/?!Tr&b8^.miJ v v5& 3;hW4BA˙3=!UxgRq{wlkhO>qDKv dGG[[s^s f+JJS"DfRģ-)# , pkk`Xzta#˦ʖ`2ǴvdEP| [5AdIVJ+"> V~"~+hRl fKHNyrd2ݿp@ xup]Gc&WeAVJ ml[Wܵ(jS*7ksTYBd_Iڀ 2u(_<4_~J*ԓry0\*8߉B Cl,5V_84jhY] K[3C]cC 6&q r?euHTz:k3݊/ b@DC'0 .'rzxZ'pm]n W$/^ػ"vElUqJuQ"2 ~ t`#vT= ڋ.Rz?@=' čăuMq5YϦ&~x}d^9:hE3ކJ+ksL5P]-'agO#] [tgNdz冘Kc)m*dM>/p3Fʪ>%BD5A8|zA_|79U[ Dj |"NaDY)irgm='K(#%7^h_ͻS}+%Yן}=m60=1dBsf|EM V2hEV8-6>Fug+C*̊ǘ4B},-Oelxl &xxY9[p2aey:tWbN _[*|'j>NX TZ,){b-sѵCZXPˢ՞Dܔ= 7 YG !3rI5 O{;5,WCccqfK]˧޽xNj/omM5&G -I9xϬZ&>x p\.(*Ι5pN CC]UkK <#蛋$,vtXYDXaSi@k.[:*3BU1ƃ?oY9. Qg[Y ۝o;"HeŰ. PCceP %&PA\sYU:`MoI nZ]>V:\m]m+Ȱ(D#?{ӔA/#=3#&a$I()3V r1֓)%z8ָZ0F sZ^VŹqKPeȖiL_`̓X @kdWC^J+Fa{EhD¡xuD@ R*;DQI7j/Zj7 !Ah`ѵ0آ#|3"AZO'76!ugkIrY,5:TSaX7&sFy:mi XfER0^ 2y "`xDGV2.Msn}h,R`$@PUBipC} e^8 -5xvM}}u^\\÷;!f9g-αPܠkq 9|6(H+cēˈtXYo`cUW"ނRq6d.CR40ߡ"/l&^k*`zؘ=7VR'~8ruilg&'tO< 7ְ@2j(HZ,>_\C=ymE䭓GF}xr{ 4?^}p󪦢ئB: b֜i&yٴ\ +h-KpaXt"(ĜK||DgO/ݜ+bdf}O@JD+LYXzQ.v!}DD*"J<)]fΔIJBd - R2#d%3#*˥^46o^l885G62? ;1ϯL';*W0בŕ;DB  ] e/gK!rI1;G@ I퓻Hȣ!Gec+`)o@tK|m~."u%0ə#zb[uw{u "'$-':l!a-Nj1st爽\rSCC)ޮ&ca0Ug N̸195KX+W@è e*X*#h- "B9?;xxMP\8o@sՕ:p[U Zޑ^FG'\]=ؖw{7@$O+?))t=mt:bb^xkWͫ͡!O`C ?ӄK4s}XZb(P80"nž$7LnF:\(T߂tw}P@T@>^M@@H6f#ɒh ),_/\a0oᤓ] 'D,K`&|+6$[Zd`oF.g ׿8m|w_oѻog|$c`3 %ZRX;j$IENDB`bzflag-2.4.2+ds1/data/water.png000066400000000000000000003413311200563112200162050ustar00rootroot00000000000000PNG  IHDR\rfbKGD pHYs  tIME ,5T'W IDATxT۲%[~9窪V7@ KqHj?A`juq%MGzr?|4?ޭ5|ޓRdq;h\ zO)~ǯl[&Fc ƁǑkQ2<DzPJvK^|0$1ضLa9VX]=gcI1QZ1Rѱ11hmeEiZxĕ>Vsx,!x|^Z6OC)@i/r.aaMK,1B'@k >Xh֐w_Qk!xl[fk;`}#1s8v=-DJƢx_zqT5|;ۖw^7cJk\+kJwtϷ9K_oxw6>'XCp}ZkX g5:jo|}q'б4`cYA7@i XܖD7^6~*[C{\x(I)| 8nq!z7?LiGi1:m4` wxku!x` RGޑ'ڀpb$"og-YSY€<%c 8Xoq`(` zwJ~'xGi\+G#o,w>XC. {Y\ G˃wcoX6:u~5ވ6, ck zYt6bp1aV2H1렍a爱,!2+vX9>5s)mI ct^ *u1 kh%$b8k..`{\gg?,5j,*og Q7Rz0`%yI=\)5`=[9s[}Y(z}NިY18jiSk:C(PZK{ۚ80jr(UZ*zk,mKL<0*SxWps|xbx1bbkycQC꼏%PK:UkﺬX>^+?'u\)sZgKJ)5R){ ZxG` Yuz55CG*f~aaue7,6~oNxx;1a4zW"8ZkڷY9tQ|5x,XTs uk6y9;L ȵ2Ƽ`:b:x!83gX|pY^p` R(:hQ{#H;T(uׁt@} Q.#ca+cx[u5ܸ ۑzFW0̠vu;o!8AZ5bc?Td٫Zͬ#J΅<zZ姷nrNGBp6Fs6*U1^VϞ3c vMx{좷c#kc;9Eh=XkxB*k9-/qLrT]R{#%C3m2+{J0gԪ=W.8Sk& uXs\;ooLs"gvG\g*M] Sb9Jiз}]4X8ð}N0ZIqآ{q#IYRL&M,6ܣ٬<9R?˿FJ]cdZ`*VX_ug˅ȔY@ǁ1g7c:cY S[gɥ^sz7c6aڻ68 Z<1yF*}tZ);sA{ r+910T5K+G.5W}Q2[ΔNx[V$:A#u#L@iUJntfF1Qk7Vx5Wd;J{;m}zuh_2 DK&]s=ˁ5?V30Gkh{0Tjo|y<0Xj~ oD.8h켦s} e`x;=SJaYB9XZXcI1<a897bxk\3c6;)Fs,S#Ji8o-9ZZ%yEK\2Oۿi ۺ0Uu:)$2kdSu֓Rg-wZ3ɗ;uX- <0[vQ`CKVD-c Zol%Sk# bHR.3xr-8k1 F?k 5>6|{Xy4r-c)P>P+sBHN)#YBڏu+;`Fs֊^q8oq–K4:4|Vgh5ZXR$L6!8]"yC{b`y6^u G} aM`Q2n)OR[vzG+b4B @+*ii_<>~cϙg~|U[F8gH!:ه6:{8PAx1uěxDKaӄ2:~MEj/R+}hJrNL1,`a90'g<èk0W>0}^>02J(UZB'_}/ N4z;psAХ꾦s%BʗN`ccM [R`Ʋ̘c"0ְƀw?;wwn͂s )u$}Y:h `0\sXbE'*ƣÀK K\ُ`eF.>:kL|({;)jkR !5Aygp4H.L07scE >ƨ=kb%8: Ӫo^XCUjQqmy^slD.`X>^J;ֳ~'ǾSka+篋@Gch JnxoIAZ(u&6Qk]S,g1^9R\9wHA 3AAS;{M\;_)c>R+1D,k`,` Kt5SB[*0hh9a }L>{b@.;jY"}o_;W%wbcN1AHnuVMե5w!LPg'xNL닝_G6X/gAg1h(4)Y 4s!xu֏m3*֪MsQ ^CQm~#x]/;GUsrK y\?f}`T,1le'JVVbX|dqvD5h2T :XrosD6yt[Mo0wg-3Ԛ%cwVl9BӲO7%PV&cU`U ӯi3Q#'Dy ﭰSq;us)IECձ텽ـWDQ2^f0GW%Ǖ-8s01x1ٝ4j[kEcmܖ8 }!x3A|].z?]q SGщkpƲZZhMvQ0u)0x'mI<]_gt#qV3bV}a(]%$ rg!#̑ Yi]G;h":Uٜe'J%E֨" 8k'鬴t0< pk G/pNtfB[w"L۲o쵒60c _0vɧGVk驻>pV6 ja 3,ۢunQ+VvFj𒁦uY(R[9ۺ,\499;m uQszK?u8}k 8' 4w->$`.˿N} VDZ3Gʬ.:Vݨ3o8{= ZcLD|~ߪMe+Z&!G.ǹe YtVRrลpSJgu s%x>MXb6kZZxڳ-!2m|.0%8QjbB]R䅠;p,k0huv[.Hksyg(UmI)iJhkܖ`>x,fHǘMAx0[ZmԌ 5FLSxT*c '3`\}̜ڂ^evYGΕW]5gQ! N@G|a:W>:u4nqO>LSi׾a9soS7q[pV+g HеH&NV\T̰,KŬ_eTR(.1bԜ;~%$ps7[Wk]|=`tBgRRq%% z!EaD;~ aejԦ*vH o7RQYBt٩8zM̹9}v8X|H!xn1^ӂyg 5 \+TNRJkI>;Ǘ}jU8]ͽ0WTM1vWLG7M4<_x[Ey˯kzsܜ/;كv>so'uw蔲ykk!{_/Jks,4:fVbF.|mY]:G;?RG` G.<cm}K q2Sj*{.[>OUpnX/=LM둩CLs,4U'&{ lw?YoUݻ Z*Gx1hvVk3L ±(|_lEc0 t5*#K[Ji*F]c L H/H <D>u2E?)j8vfTOdNاi#8;ި[?DzJR`mdc}tާ+g>bhnK"*6xR pZA,)I dF1-EKHX )[5bE0I>1 * CE]27 =731Ee7f;\7겙Y0ꀏ}d ,qksĹv $F6G #A5k{y&`1i?}ʕ<|p.:J*SR.Wj5<Q? aw-FJ)2*A|bM+kp|yUq+c}h?V0g>I?4 3lq[/ﲧ,\3[sw4l vxʅ1ټj Q)GƅH`p̜ 83JE8!sl,cB K!Y $>W{)j tgLkpeYTç<i*>h IDATߵ"o1`}VC[\(1&@!%DžFrXɋ fPUs-٫SczJ`C3mڍ7no;{x~B]hA/eԤ` CwL1}I/qIu"SEXe`@-l'|dkn&/}Fp:{>yKܣTC9)Dk&ZN(V^緕?Zۍےӊ퍧MIH'!MEqHuN/g]U_֛D⏞Y\\YBbIIS:YShCY3-cN%RW>ݗSsbkc}{$MJiLvXkiL.dYS?Y'ٲ~ s9AIlJdVex~Y;c]2oʗe!=紐Ke+YlȭHg3%Xogr ~W#?ݓRuN5)rޙvzϩ9{UR bڮJe~()h*¼k+McL&BEY(_Be"}{G ''Zy@vYWKGDZgQ VU)8*$˭Rf5C_3ъv'y”LNC%D)'c#07;CpeZXtL)M*̤C[e˙%)8Je`^PଟJq5jirY"݌I kP7t>B0FyvrѪ}hK[3uS)%Y_Br+GXWw)Mjb8`%?Fze^vud0VB'ߏZU{Ja+Yɂ0 F)xO6 {Q?0#K<)m1;Ne4hN}f5-ޗxС| T JFk<8YvJ^"Vg7,Q{ZmjS)*ҭ3zu $3ɉ2boǔi佨 :XB"rD(qFE ;N21T%r*ڴ2 9ޏʒJYj6iu޲9}, (;;ȹP.2~m 0p;.92^.9CB&&u|NΘF1FJ%%iX3pFzѥnussS6-s RR(]1$`JLk]JSVwGZ'FXKY/qkLבwC*?5֪<֪dy*+흜 O)8%{ZO[L=K0WUyQɑZkfΐڭ.pJ.B1MJ>#qQo},y#tΝD>= $=^> fjg͌o8*::a\ۑُL=|~'@tk7-%>?*zbߚk%Џ>G`<F[L$D^4RX| +pc|Jms7Lo5wEWwSuoKt>Wnc81aaˢnj*Ȯ^!+\4  5c w~ySk<9D"mmIW9ȒC6؏|\^Elk&-i9bGrB~M=ʲkU/>/o7]&a\P#%%9>g ״r:B|/7>?Nm ľ u4i!f U^/pLpᯯcta9߷с&Ɯs7k۔q)[:%3.88Bm3)xBdYoš\ V됦`a1;'8iw?)SNԣ~)0u'T93=)*}NR|^yJŠ? sⶓ8}ԡHGx<ºʔч$}]>y8L E _RԴp*b=vDZMbt×\$;ݓ逳ͦ M E&/{ipS.◒YL{(l)OSNfcd+sE _A O?VmcL}]^y/-8z_F+bm6ܒ"׸O?]cථʖYy'0΄+2ྫྷ.i+#*Dί|'%@}߱V8M:G-6ٮ5x@ߒFUZ~vh |70$vs}5NyyJ@}Zc!WeK6MS~c@Gh ly!8ޟUY;r-e/ev[>x>wNEe5]jֺ}8TH૝Q2ۍ2Lwm,oQC)阢vCr Iepf:cHF N3a9 t}xe!X^w49T嘪P?|ηyO_~+4%14(-]"v&^xǾ᭒xD{ȕشZ/R0Zdg"(]kؔc@6ewSOVt%#idf4W>Dَ랳c{%ٻ5mVShE"okp< %uvlA?9(Y1m<3ۤ>Fَ3˜Z1t>;Qx;Q3>d:}[LԺb:" m).߁qmҥ)ф'$mꢝOB tih91>Pg^@ई+c~v6!i G>.Ynby.Q[8Yc(d)76N6Eܫ 6Y3E\|{K3SzS5:F) "dUr)iˇVb+1VůkhMS[o/0Oaa Ksc6`F9cz5&Z1-XǗCy _&rϵb,Kfp0sfoUdk}K1"u=\&WV ZKj;yk K |b [oX ,eFS3nUɊjz PP06jakRk%1WL@tV>&8t1=uzо~žE)~M4Q1^B,d $Mg vN'N-.w2WMOM92oǡX2_sFL` Qkث13Rm\J\T5M'hiiV2F<6u }Yθ7+ qUFUO@&۳6[fuUa) Aي(IjxkίU 3шafࣹ^u:'Feר!:ߘ#1L1Kui/+ޚyeO9ߝXZ^Ԍ"NkpƕgmWXk6 m743Q}.Q-s/Yx+}C/F(Opk5BKϛ6,(oq32:"kh:?I?IAYgX+'7!uQWG*)^*GZۃOv<;ϥ(EwGpXQ8 j<,fb%wJ$mYܿ^V2ݚPM9&eiưCbåNl:|{>XŁ;-+T$3)p_o<3hڻTTe4F8eI6MnN7&se/[)L^\\aPv+w@1kp=[0f--S.ydAƀ#2^y(8vҍ5Fބ{IxBzBkeYkýT֨%U9Gg<^%&po/|y{PwD:ucrS>:kkdN{J-U{ɈĠuJ=s<՗8eR8xm;xWʺvW|0ݜ* R1qO)5r$3e4IG{62 [rA 3&^(k}*V\*`?ݞ9w2oƁܴ۟ zjdm(9Rc.CW?CV[8G2袝 ֗BK f7q5Mܩ0!KBxw|ktLJ2-%3;5dUaAgWSʼnmd@C9fkT[̜*z|UX>:p(sK\dG[2%(h`yZ<_tZxĞ`iNi%ӝXe׵|QE<:wR ҁZ9}(m7-`UwN6*==0r>nWh+ϼ]B3~* dQLB KYWXx?ޭI[U=34TЖv0`%RDQTȎ|U!93]߻Y<'~x^;Nq•#b/L1F Qk,ޑ;ba%8< ]p%_)gnb7n]D#N*9hb8?su2~|Zi[? oRA5%bV; B֘^(>8-Nh)Gds%HNmWF֜jRβ&jC=3r4 Z*yoĂ)!7o+gƶx<_6gQ+2Y#=Lup JQ]<ڹV2쭨*֢؊VS3m{0ߥ8SFbCmh{(iX!Y5Xgi) $Y)̝= <\:JKƒy 3 q + ͔JQuSlgQC$&2UP AfT*e` }$Clu䌗xG33NS xrZ\ -˻RR鬎BZkŶ-蕳#r3Ws^`:FajF_g=}`{k/9;b^ 7JO&1(ش#EiR$8i_FQ()͆6@לX͝mS3~{}77?JfM!-Pe_(+z\E֧e@xKp3HV: 5t-Po+b)𢣀"tYĄN]ht̵t6I4։Tb-yhu4p֨kO!#h(^?S4g]}N;[aM6S:sb=2ڡU"3ggO.\Y&;vx4D 9 IDAT*{g*=8s+*NBM0 M(6b .˂#QRġu>]qs=%T4|1&IJMXS9M[`Rxۏ%)zDJUp~y^wN[ `,Q#9nhh`5QzڀV)H%wSO|eՎ/VGV;Ɍ[Yo\KVv[8S"ItĚ`/s_N b.0VpFgϗ ۉsę2I_9c8`&@Q"EDijcN20MCfS_VM](c*@U<o{VQ%i؎90F<ΜZ4[Dg6utcxC-Ş"Μp GNx}<蘳g|l2+ b"Mx V`I]f'r neP9QN\ j0DZQwa؄y)v5VKC)WdJM۫4>9JCM+,=H}ܱ3xS*Hy1Wԭr&lCTQl Έ*re _n}b[ЋRhym #rhhU}ˈn H%jsh ̟V@F)yqgKz_|\C9&G֫ʩ[Ǒr$..!S]k.:"sjAEJC5N½8`p0 F%0'= ?pT",vF 9 G{;X[||A_n0x]&UƌN|0ŦMGcEU{u]BSaBQJv6#E\H%ݘ$w)猐읝^(Q!bk C+#YFSv#ZF5|{{}gơ|6c;F0U9#ZC-G 3 (PN\-}z^dv::Ը9gHK0MQwT %,*Ƞtq,vwgcM"d6Y) g3viٟ;?3u * ]k5,ٖ˺ȉ%m(皬8%C70NPB흫I `K?w2J&*  ^9Y !3Au27{ LzZy;FYZO>Btf:WmJhv#  3LMfFt 5hPLTZ:벡q9#=b$fvR5'u2n`xw*B" ^p$ckqViU,C)VYt4Bm8JXqnmO ++sPVXNw ~%}jdxGqF4t|47FMnG u1t\ء5#wO 8<龵5XepY=>Vvԓ<{-R]T+!Xp&ƪܯuZ齄xBɓ.UIWte\ ;3'(gG53&ZTlJbd[y8$ttѺkojIbe;*4>{dF( mǼxxJ¬.f%b5=%ȵn|9ڱ>+r.1(:gdj3;Pѱʶ, >j ,Y J8la^^kXVžb0)Y`"O˅s)g9K@(IAr˕A픳ӪSi@Pp;+S?~vΊwp2CΜ塛"lOYdfIn95VuY#MOZ%e7 ?Pz杍hS(-9knrGTPSNZ\MuW(W1^>l-QC_~¾ R8sMu%i_uU_{etʟH,Q"@PA8H:0;ʔ&&G|^XJh Q"ytc|byn7g,^)\:w 8K\_pV2%Br#Ӈ 5b~sx*k raR[urCXxĈf*aXրƣhH Ν5rOP(Wr; ^NǢspFAJu$QPfPk (F2g1&+'^/a Sϙ-4Kf-QTmG-$ .Ǟ T$U І&63TvthM{+( ,. q 1[zC'8RcvlD=qēUQZ-E3ގJW*mdi.߾|w4pJ1U #uEkE 8j,I ^+V Tϸ.یdzZ,>}ɰul; ӓT([~%ĚNYխЮ1$SV$9i,ơi΍^gw!v\R;RpwxA Xg"_ 㕡"md)%'u0wmxӍؓ_η6GBt w28'BeQ qzPU!Lud5R {n+G,NPDpֆV8?Co-TDW{WMf(u.s;L5 T`B8|nShT=ΟK\܂^}2tU= 1Xyf/x\%X{?b #x ^NN5TjΝT{\‚u{BiOUUXzYD~L Z\u:_C { 3!dڒuF㈅^ODk_>압7 ǂکzX)]wBYjlMB  9nO^|8eTjGh7SV[p1Q,Zcy7oτUi'D1 ("Hޮ韸2[ۆo WA$/׎^gj׎tXĚZa.>^X5ͻ߫b-*xyZ3/嬸 Lr]2o_ް;Ĺ_n .^Ak㕜P;);Ѿ>إ"\{Jo RJ]#s"{ȳ.F"F)58p>K&KXV8*KVˊ}_Epf cqǴSm[g?jgRҘ2riXö,#2j_gy=H$7%|M!1b|Uv;cRT澸TDp@_e ;^L2\{.No\M&QH( rwb`#ƔC{pxhg.$:q2],<ݰx#q%[%pA#8pӸہqL%4` | ˕~B=vΔ&gPr U{c#TQ?BVj+CkRa G ̣DRJQ0ZGb,wZQcJfBXAwYLjchxp%䔋|敉½!*9=&|GjϪ6r=bf -Wyh=o!& HKp4X,/8#W(8~wz9)OI,Tp rF3{_9W-Mf4.eɼ8)H)U 4bMX"Z*Duqk,'BN"bK;nr_Ve-'278dJ+3qpLWXe*M2{LDK/< )IAJLzRF"`yk:By@9TEY?kEeA`<Ù#18E7~PKBBq=lX\=&h簸wdmvI2خsZp@qvjm!JxAQsr v>DϩTjUruDRؑJe]`S`xix;W˲0H"ǎ= ~h{hOOW)O7H e_|=|hx#u<<3C _x*U|fą?7(q ΁dTJ7f!Ńi0{kHğ7E%(-2k۶W={~Y5S΃붮3,TiJwZwװHPr% Bc֐;}+ጙRZj-l&%FAGmՆ*H+ J,gL)nu#ކzր m=gFv{m9M60yF;ɰe;SBx85!uHU׷Pq $??RD|EIF?&(D zocKD"+*/,Td=_:aE~ڤ>_zVe0*dl( !,P]1@y9)_ZC?@CxXnG# X2Q4&Ԋ/ -TQϯcؤ@i6%WvLxDWZE2&Rpgo:%|ݰ9}:#^Y` UZ kpƓ9/ )j$>_I΢FXqHXw^#1h;mZco{~y 7nW]+sm*%H%L68ѨXI>%C_}-)+x4o ]zy<dM?A$mrP ym#;<Έ-x<l!`(Ȫh] 0xǷWZӳ) 'J4%_`%Z4  XosyhnIj[G$ꗿ?74Q't5PT%?wk:aF 2S.ؖu!~ EI)p[kӪ_=kXB`y9{.rJiVvԳR&Hĝ j)Y^Sj%Ԓ;rVy}o[|Z/ h]DI]P~{kX#> aXFʴRp#L3D)uWhɡ#TJO57HS8jk̗ Kt$pEDˢ,G@+az9rADy}=*E)YD@Aخgp]7 ;h/vBnԚ)FQwjr K\KB7{y&#}t]&Ez~'0$ӱ4v{Ts#Qu2pmsWEXyȡg=9??x7.xm8YE-oH)"",16Xn|piZSz#gu =n]j3_uweŷ5inˆkXq(6wD8x.?2auVD5o=<#&f]\|YdЈ.[ufp$Ԕ5LhǑ{L;N/:jASM:G%AK0G/o_#Vund8h3u?[e]z? 519$p,hYìSTyyG(|mL{rk6ꚙP[%N+ IDATEW;۫VŶۅ\_Pڒ+Lf9!qwī ͼV̓p.gXp iCS V+Uq79%'~tvSANGָAte[TGi4bF/h 93ҽg=rN UC(#+'^Ruq\/eRY gyuVZ6M/>_/t`IE]6~! (b*j {{C 5==2H8#V0í:*3?Z< K}LY~M @Va)tY^l<^[kymA["N>h R1ֵ—=T͵u,ju0;lj/,T3~|y~X;x 2R{S+8aHGμYҜ[ggp 1r:"%7XC0us *b&pm8sM">5ҏ8/hqh`7 ~== Uz!m ~xy`l9y gN;ǝy(% 6fclTkj|\ϬqdnUB]q#cgĕk萘$ }k{17I⭍}\͌@7ى) U#~|#v0 .GYۺ`[gIVqe4P&?RdXEder?N(jϔV31ɋ|@DS<;4|h ٣KQPmfE/ &W Ihxya]>.{q3 w*YSC{phXdey:44`ķSwq?9(lj{:xDPWwN%]&1qKK݋|#}ݩ-h{@뺲 {@g_d~TED5ޡŇmCw$م1. &,Qc>RT~x)X%kxKh"ʰ_|`FU$R-LOƝhpR-# |Y%V A+؈ʕom jh"ec.#mnR)h :D7PtߵWo)]-"}5ڑD|r$۰iB((sQYu&Tڙu'I̵pS+s<Պ)eZ.a8>ͥMňL^&1Tp+2cnjЩ7ݏ :dr `y Xre, +`gLRKeD9Nf4/(VϷ౟/ް)" \dm\JG0t Oed+B:Ħ_-3P jOQ+SGԮf9GJ1)eY/Eq3nLQXCY%'1N ,JgR mm v-u]Ѕ|3he{L)xۧKRb$?=f d{/9"4Y,JTG<dFIpьѸ?&*9LTXxcǎ~‰H,h2zY>p.h\+VຮR \I*{N.Ck,R yϓk,^&:t1Pvq(#2~[E#&z굕8&*R{3xnX~Jehd.tA+%kXÂu୓z{|\pVT &d5J >MZ\0$h~/o;Y f*,ˈn'r HbАqd~/5*塉7& 5%w"3Z0/*DXO\M 7 k,n6^s+gnYs&a%&Jh61MQ x__rkhS\e)V0kqm5%6e5L,pH'%EgSz@Wei$7rJ%.|VGtrݶוOJG;ގ%\րuYdH#!2JQjk&Tz @5%AYg*Pk-0hoJ՛ fśq*m@Q)y,ƋLJUuϿ{jcN<_o8e%xϙsex%,xl إVJ"brh.H5(L񡼷̖IԜ Zvi$&MjGXH4[Ⱛ3"'; (, X/)kmFU8ctkjÿ0@kBYB+{:'v/6V(ז\II]J.&&*5Hik4$?ȰJ#u|m%+'yDq>v-+. S+V77n>]ź8<]VNAYw-W'%`^{  j3;*9(#jZ~%xXܼLšl+5ӕKZ%#&U=[ūT^m]d.‡OO$+&nK„!N@bYQ\PQJ2匉1R)kYgX*3B[k#:Z\&8F{oM5"dgV܏Z|Λ :w|]qYl!0Cb<17, fJUL^;^;qB/^y9`zj~:bx g4'p͹t ^J/ܥk6%0wۘ?L.]CɴX:kp썭2zZy1q-ME0ɪYVUVĜtZKk\>ee8a RpVU 4<-8V6 -c=fC8-@;OA+Ѻ%E@x+.LϾ[M8e*3,kӰΉk|0#QAJ~E1x*Y6<{[Z=FуpkNr3?Xږ^;z~[Ds&%/ ( 1G\MLl xߑJ#@8R&Mk ~|Gyu >pĈA1ٱb$Bъ&ԊBT|s{B輀F"ЂW95%cua%;:yMf~sh!mTQrѫx/%ܤDʬ> 3֎Թ5{*AWSMe \:o,`0C+bʼ%ז,yU!n2;ѹNLOXq#Ɉ`2pv0F0V-FG=3QZ)ٷcVWY>S)tp 1uy#0tݤťQZ*Y&3՘~9X) RŻt Y*mOԴkv WH ׿J?Q9g*_fX LGK;6PgNT/h(9 ;˶c 3ք9K64흶IMu3Ǣ#2ϕ*R9^O͋7s@}HΥ8%PN\Š%8|s zZ\*:Ϻ`:Ƭ@PbTB,;#Q*_sh[eP^Ӷf?- @h=R5yR )㹺x+3Ӑ`s+uJLi`zVqfpe}oﭖNM*9͊idlp[6›H;mmִ5{dW&Ē ;]Y[8GFpl `XQK׈ѶJGS;||Re ,d^z{o)X8 gKr3KF6'Ɏ!YZi]ċ+.e$AjnJ8H:t V,PW/z$BTy=z]n zw1{h<O.4? ۅ*@DlWmiGdٕBi2P:raE*s=ІVr[C:kמux;O"ߦHXނَg%m]<Kyγ hJzd&Lp$lra'JBT7̖˕hG#78˲9G،ѵB='Fk<۽>8Zے߼|E+װbY1&:mp̝@V[ӢS\V%/`8\M6#YyI G@`P$\Yg}=kDxÞaLaB0N?ܮ8c}43@"sptYRdl6Bs-#FqZSeUS{EO6Gu%MHJIDYyg$=qLLAR>Vt ,~a϶"aٲ0*rdVV>y FB\hT0:o)-u[PK#Ej9xכTom*e|* ]1J!ndž)"E:VL7/_*A5H$up$ul²KyOQ"y)f'rHp}A2n:4%W]Ӫ4_베yb[ l9*9J9 =<4 d)Z4gRDb%N| wNp)Z ˉL. ޏ㠜ոۏ)# 2|`T[hyX)lD ,s\(J5.3{p{a%3rӵw.4AE[C}\ꔌdZK2sU1_ 5mRPVZ\ ~t~$8h L5``u絑vr{w+/y rz>$ڋȴz b IDATRzcڊ(E4Sq(MZP66Jf3 I5WilUrE/<)1%P~k~F\‚̌2gV#ZQp4ʬ×p Qghmv x2GZ8ًZgPsj)uRrvĀ;iy4*)D.\ {$m[?i]0bk`3߭3YWAyy}B{ߟe@ W~ ^~;J!2<#QvLG%Г2648 Ha t(rCۥ(ڥs(TSUp"-{Lx(8/B)m Zd8fڤşd$oCVPq[TUIk{wJ8\6!IYyJ+Ɩަ|GX CddsYdttL>Υ^ Dʋ x۶r kz?~' b"5d\<[IEᗹPQyF D"L%ji/<<þOLm4ut^KxY[EQO8s)`h2k]AJ'2d$QuX_,q#1y__(`0I+GL(霁V|5R9Xedhf&|GGH1$ QՕ xk/ب t F.@0UgdY5Z<U{u8Ĕu(˕:E9_i UI1b f魓!U%ɴV K7 U ł͠*b%Ȧ5Ia(0ZpiHu>[Y ];gޟ<۲?,!H<d_Y>/.DTKx{Y{]TlM! /)GK /F 8J$$?3&ev'VE z-8lÙ )M֪8a/(S=V*j08w3(֛dٱ WI<HR{'U5cwUb--]QKiLeC*QhFC@obC?^@"g#Tm*XǙ2|Vg?ք#8cvq>p֊߼o_pUu=spA0`?^R gnRIsN^3oPd j`o_KЖ %F $zLGifeˊQ)%SgeI9ɩKVzSekap ZYhix 5̙91WÖK۸Mwgj$ϙ&mv~~szZ`-t4Q1bGfF[fV_( d 8]J::$Rg)mnv;'[̚kT5-]FVlz[q[GDJq'nl -2&s)<A@R(('cR/89d4U"*Z,%1 T(C;+ -~9)1?#~ߩc2"Z 6wU0woae ƸS`Ryb{΍\׀=M`0 9 RH9 Ȃ7eO yЁ/W“L39oSM&sV%D+Ѓc V)/uA+(!Xm~Zx:.ZpO IO)Tqh[[!>A+'](HD)+gRgQ|]DօW68d((ܖ ޮMI-qK]fm[d½%-ҧ$|uWfކTqNwViJdw TO?rw/TPTGS>K")$l27! mi0`I¶,m Wy=€ 2"krB,W8[3ڬWEX~ԊV3x:]uƦ Nu װJ.'O@*VF`T˶ $—. }SvZ1 g~ xCc.+q DMJokL @BnI3vkŗ_u&f3ƒJmm [gVþ92Ci("ۣ*^|eL'o_zE0 eі9G09)ߋh]zE F0qFoܖ /ˆ۲$?w_*O=ң :ea`)s+N4\^7\ӄQkAo,ύfI$"+xbA}0)gBSqKE0S`%gE+ہRhS&̼νX`Ka@H ~z}!yG;*sߜsd$pܞ#~ByX+jbD]v X\&]?Hr(99lK#}Ƒ*-HVzz/;e%]Vqh^:se?kaU޶O3,(ou i8(/|6s( 8zV6^A"秷su]VRs!InWeu[d^H19*2XOFV\3'D Z첱.l3ȵ(DZSWc, ~z{32OoR=%_ (@a.]g x8Ό۲Biǎ5xg!Yڕ< F#  ??VZS.`;l']lSh|T\'NUY;l:Bx^3K_RZ9vLeFpgzϞ;"s}?+R֢!gPT5#3oR˾Zd1l1FdvnH"2^5rQ*m3R-+Vpi8!LL1BV!t'JuYƂ6DS҉a-flv\܂:ZpB"*:/s1j,Z0iq%}ot\aJko³'8"LG/0 -MJLJ J[0;/;F{KVZɀ˲GT㥹T(-Ɯ+-F;ǤKBkbH =M1:pU8׀A酰s`` ׂ@RJk[by" oZ;[ g!/cLa~^AFSv܁ Xky#$ iѸb5S "R.23j2`=}s/C8E^a:46ʮ#L{o]/Sal15vHBczbA|X+_<}f1ͅZzrUŲXZ{0n+& 燩vgifyPPu x,Ws h@Q6%&i^4IM^nEbP5P Qo<6b|"4; -D@ISM #yXZ9)V*R-yFB("lJƑ\h-=BdރÐKڹ1j.ʲO-)bδcJZMZj#eR M{y(.tBoݵd8d@.4o~x+J'mhтf) vqOZY=׊ Xǟp'd-}&_ԢS(%0gI/+`]H'љ0= (5J*L*YD1Z0Yq} XHM Y;Cz_v@@[%x,r"=I9Z|\͍%֌/ -VO;[`0홊^1xw㺲 IC,;V0 rLg&ZbLޫ % :vK`$ّȐkK27zPu|FzFw5/*pv xb;\W\Szע`Hq/?p/+Wb Qj 6;z!쑘+@ Y/;7Jc?RU\+PSW8wR0WE=#CÂ=Y "FF`qG:yp/u[pi P,>'De#%s6}u݄yI`͙#s:^`˲nQKXq8g:d-/QPV=cwMB2M"JhGen~$Rhku]X)/^9$b K+׊9ܮD0]^.J55[;?#FY,Mu2HHLBne[Md*7psЂ5"13 2$orx4!u[ˆobθ+~|yu[qĈ\2 spDxygq8mH"+IQQy40wPM@CCZ,|H&X]Keds`XPg-K ,w@Rd8$/·9'R RK νֹIY;I K?7^.mAPsa3duG6tW)TP]$`KMm]^BEhmޡPJ2Am~ 'qM\lEc ."ߍAp׊(' ,RKpʠU&<-aSfr1ˊà )8q^Ps-u|t֖j11eg+EW پA+)AKLWe&[8sO09It?-dؽ)s>ob c?ex8q;)G0bgRqm"LY $mX$u}&9LęFJVP\5YNyrFŒb #agDu&&F $[Xa[<7xS?Xୠ1]M Yď`)>11e4(@ 8=^9;33ஞrIEHX1"qOR}Xsjhw?"kgf#7*RUv uaY1LDWLVnTQS;?jI¨T( 6x*b,l2-lVBgikOܟܶm FcIZ)JӔH͂?)p0rJ %$6CH:abyWDPuxm A2XgP#ʫMTSQڈ}dXGafx6 H5}[|kd-S^=LWX8o#?mFk|gu 8ެ0q nF~ykx>88Q .ZoKMV!0bZiTU gnˆX(wbO^ J|#>.%82Y|J6Y!8Bc^1|32(w NȳLP5,b~?Uzk1-n3<΃"-#8Or8p 5f(mJQ !$5Zo~lȽ$5%\$k|n*y9hаy&F) QX 4:eJA|('ҷThkSzުqnQYpJRv`-]jߎ\Es+/8r{NE3I5XopO6VQ{OZHIQMkrs>b*iJ)Q{ ]1;Zλ J8&mANhXD{9|bˁRRtit mӉgGD^Z+#My,\++˔R'e/w&l[O*Qۧ 1%rb>- 'W-$Qf4[qԼ4\R!܁V8ÅN (rVf20`2߳~I<&@_~>R[>W'Δ;U/ !ʯ@<3j{v U:I"f Thȸ`f؏}I^Zcm+Z,)Z/ ,Bp!̴ GV Xu|>n$87u$rTeD>ȵq3<䍂$!g=!:u"HKd eNQe#?Ol}r!T,B91eZQc$0w&(Ύ&^X͞7.. ׂ~+~ሉl6 /ۊ>y40F|d"+) [-{˧ܞJ+!: \64 ~b&= F "Й,y6'0 S3 afApc\ `vhܑrP8ʉ22+r^ ,*R,Smq8mG'責︭+*FK aL4pn);\$5J{{Y\†=  h1;(PCZ@LyjmP߅[e]ZB%m\&Q';+Rp4Q}))6R9[GE9sZop 6֨ho/Ъ#zG#%Nq FgrT8&Kh+Ƚ4A\`T5y`%;>)s]mu٘+&L ?]ُdȉ:ŔPno}a@uUIPnv %j-kŏ<aNkӖy9#yKZ &@ijmtNIZ#2d}?_NqOY`//<Ƈyp8IYhq^VF>gg޵ˀNW v.LXqDv<'}>T$X$aLh T]`L@lVʪ‘2)JELj֊` TF%9Id傗wRP:E7B&#%Ћ k!gk'Tz/7h͘(-PWZ%'Nr(I~-}9E.Pm4f&[J)- O$L&D4A[G:.Wxri1lo48-9iQ}~%xS$ մTpqY U T! a1 eni_9%#"R"j-Œ$%Uh=uej#ru -+t!Zg苕f| h;':8ј\ )s蒴 Vo2!۶"%^,"1ph*O:JK!SvK  Vy8@,>ơB957*}vۍFj,Im3 Uߥ5s9y]68oEDDkz<NIyF17lMCU~hS$C=3D%q 2CJڮ\-݀c qö;IApOܮ+~| HXb[wֈXϪ!ˇ,HZo]DXÁ٦&l!LePH$ŠiB2W `2&axZ`yH נENP _Ty5x 5&3?1v X׀xu b] ʪ Z-`hq#e0GM"㤤WHsBOiy>sY(c_?IV/1Ԝ;y!6!We[͕iiU`k IDATtձ:RChץϘk6t~| Xl«g5*4T5ՑkfT"?axD?57W9r$eV@\'F}`•_*8o -FO #TAC.UӳgLdC ra~D1K&PjB:"w0B^9I,<gƒ,tM|kt ¤ZN|Y⻭QCoq+Zͼ5y4Vm<ئ(1L ZsCAB̸#9-xԂ(h,'@5 qBkCN<>+'S]ܧ@U`izLWjK2(hSn(Ǜh??޴Gm[{! w!ʔ`2d-D]Q4؀5 pz̈س?wG_/s2#~ߵg kSƞ6ErlaD(Agи<cƞxJ?}L O00a lZc`q$+>?ޤ+xlDaJ/WHT"7!qfW9-O̿d^.+>o 3"BNz)PNDf:HEqiގ[uS?-b:OƳ%q#r彾(G0x^D>ZW(ޑRF]?]Zp?N 3 p4IGro=Z)&L+Z“cmB]_رmt%ac;0f?"uV* ~z2{22`O B$1o4B7Xg(@l`jN:JH[:^ʢJpCOؠ 7#c/534auZ;ްňr>phA:aő#W,To"Ka ȭ 0 e;b[sO.V"X8r9F {9E#$cSClȕR䟭N[d=DqDtX+S,Skr-)_ p^6w}Tv9Ɠ܊0 Ng[̯ vj<F*0HH;ᠶuZx'0.y"uo+&T؄+2Μ$<۾u2-PJ6fgaQMCڱN3OEQ\;?c417Oo . Lg-3ID-Vxy) S A&`?|n癝&|/0/G'L6-׮pΝ*#:#2)?ڊxl:RBWD]3-'CJmAD .eEIU၎\y#ٜo"y v9 5@18jD39FY̌%tV!qP GM؏ȇAgZ[ #}8yWѥKyD^)Knk:4] ],O(e!a9HVDV+!L8N D|!ϪB4Lj{(X$.->9Fyb5Lx^#fAC+< 1A350.s[3=bC(k7RSw;G|U5VmY 87\oZÈY+Z휯ȩ&h`֤uơSg lp-+22MXp,Hi fblP[g~bܫ!wZ B<QRKĕ ލ.E~3֭ҡЖ O:%xұO7rԭ1L{jKk ȎH}`Oo(ϝ7 .Z!ur?R.sLzq]\ Zf%A ܳ!uJa $)1l2 h c#GԜЍ5̰ ;rFp&o\8KCjXP;Z v`ܝOkx^,KSzYqݱ:ԎQs۶aHk)Bx@U~d4<mM(Z8ɡ N~z/{G-RtYIԞ4ZA6BgsMo#PQ (H9㺐Ċ[U&S(o;~ `U['sﺰD>r#3o]:9'Se9%jߵ;\.HO"}%p-x+tcZwlbm݆M(-s<7eV+/|Ο2ST4hhy9wó%E({N}>nm)U\ o-ޭL&i[g-"O{z'N}v) ks +SNXs96JĔZCi8b&X/r B嶤!yeYQzźxM'ܶ(~kj> -8Mj( b =F2KqD,"lB9Ez,&ON|ČRӞOfy0cy1i)^xn%jmg3d8<2XBs.<)i:9[W󄯏;i cJhNJBK'bfy P1Yns^?=R8b&s*h/CHf\ tvE&OngJSUiXVLJ#K ?qD5ŶPш=S;y*)> ~ɇ3#So7Uer)(s`8ePZ̾p~ƻ+QhIN0|qHz F] 3Oᴞ!ގF+O?iE_dj$ WK"UuZk9?}vqw)ck c#1\іDsaj1XMCvDZx@|3Gvr^&S8q] ߔcYUi( eTVz yY73V0c4[Nndql ٤Dro#`zEA/$I:n9"5/=vRl^&IV"يJ#9'LfpkAk&$і;U+SrURڽv9c >ƘPF^2+U 1P@uϰ ΚօeApdmwʞw|$* mx X$m%۩| &<^&K|k97t{]+فJ|ӽ|| Ae&,;`dɒwW{A6$^$ݸyfcV>VS]E֪,m=]kkEgNA{Lܠ n(jCY@Rfztkez-bG+ʐ`UXiu2\MJi k; ډ鉧Y=<&w==j-x h\Oab؃iZd6d8Yc(kjRU|XjS>(!MVg-hYop/1RRǠ_%uj?ˏVo?8(Ccsܠ6yR)\Xm1Y6}{ogm4)‚nrPr "P}% B>Wċw3L7n:P+mѼ$J<ӌ}hidZЄ5zA ms; C2p1P'uVgcJ^i=3N8%HZlo uS0ޥpo0:*&20U1{ndž\m)/a+ ~xzw+Zgp G&ŗoGD$A;&B⑀=X"*gfh/lWFCwXuJ iPOW&N :b!;w%[nЉP|ӣ$b\ƞrqB_bǒi"M6ĜѩJ{ ݹN@Ҏ81}{Hb%T+'"ƌGb7KuȇLy J)VLN6 I*1c BgIiaB-t><؎RcC}?}[OJ hic3MANnU8+c+Yz Y1g@~}@\]1yKm, T #w C: zm޶; &p]fa)tqʴACҖơF͊+ )0^{E0:/UV!5g- ZkX-gm6H5(դT=-3i:_lNM1an0[4ИI^]M4 9M%Y/n"I)BM&HV||d_-l'e v[LN3&da:֘2I֍v؈iVRIܕ5Ayӝ({+ܮyG2Ř%MG@k[mHk97V`=>̖b:d%#YQGP’PZv&۞N!]ߨLs&>Դa3K*CMlТh嬀wԏ/#lUCk) $IK@[~Z$D/` `2B?0Svbl غUDDQ\xx:M5cKkڹ#{)L0sÂ=JA(ۥL:MJC&mѤ=&bh"IUTl&b- Fj>5Ok\g_18-V?G` bTIμ4 SLOCk,fGHAp9 ԉc[Qs#]yJ5YZ}C9 \ A5\4+,@L1n۩ ׄ\t,.`5h8є{NA&Eȉʣ}/ȢOHp;' k9O8|s#~#G]Z}R)t xm 0PM꫈N%({Vgtw?/)`f<3?{ӮO2W V;#w*{& RIș5iUfIQNx0aсVQQ61Q4;-#"rh KOv)P cOKaq*ޭCkll@moU֧1%tYX_̄`oai)82Z9A. H]Zˊ#'+\ANA쳗ָ. pM>n*=Oo*d(53(0O &@hcTT1g1}$T] ՓE[QZN+S?G?@o-2Hnl9,iqtr%+8+rju pgP%3\t}3Kx-%۶!~? aɪox'`Ly#MMe=N7h?h/:}Ltdj M Àb[ڮ BpԺѼm;,C=#P3uWȥ",2W4d 8|0Z~KopX#81Mxu UZ/SFNZ|XǔZe_@O/Wp^[)~pm[3UoT$ !;C,ǁy<-r%Jt;zǁ-'*J㗩Kw0c,ǟ`-_=˂<#x,=)Rq[g-r5ȒBͧ%9xJ-8=oV;f>ƜiO>|Ze7ʀ;+A0cE̙kj8;5hJ"8\K^.3f?avDpjOcaBL!<_VvS$XGj Xt5ZdyBcPfk biXM<~C|C s C{`zAIb*AJ!C#c'Vpzc),芟qg Ҹ_~=~=f^u]DϐטN^"|,2SRbu^@|" ;㰝h2?hgX_"y{?;!0cZG*\э In"IpKL,6-=1ElJ_{Ф!5e9ht7O/q-d-^5 aE2[nj?cd14s")L`42Ϸ[V* 5/b,ZZb!%UL.ZFAӦΓIx^qY9w .d ex9#]z4k j7C*9WVϯ3^.+^ 0 k=O1M(tM@(lyӎ8䬆{<-+° 4Ck&;l]$Ht)ZzA\T#fRT^H7W!w 5>톧eeDŽ98@' 9LAhYܻo<GA-|Zro갆I>ޱ 8\Hm?]1yOw h +QJ yL\I4b;2nR7SjuVkf/ˮ>8 ʦJL֋VB&?-&g\.XJ4q{C'Ԭ;:RY|~qPkr=&N N'(\*Nzi!UDc soǁϷ;.wZX@GSll^\8u H3i&3s'T x9Ȕ{]4'?X/z)U(F6\v59Uܶ Ow+ךyʑ<ȱp=V#]8|rej}$KBo_oXrbe:<3[2<]gϯW.R+(I۴J6@㎜ W"]47hو>@kqh}Z&KXΧT*b1R&]{ۀ׍O 3z"6\`!-0Irݕ]pq k}4:)*!Ңwb-POȟ+.8 F#ydw܎ Zi|I;/CkBAb`."g[R8*ӑZ)y꓂5ƚc0={iEp]g` ̼]kXFAᰑnpsF(e5J(Qbl.2Lfpie/]>L.dg>Qڧa|PR΂e]P8+·Ȋx/~O AiRM@`![<_fܥ-iWRvZaf@ΰ`'6d/-A҈' KHp8p 3^xP|l"5:&˹шwqG!g?\*gT\fKCk>]޿6KhEg.ӌ_hx=ȦӁ#)s=x ,<+̣hZ z╇bG{=ow* &(eȕ**x$IтBe1ruF}3`B<=M'Dԡd1kϟ0;ۃ ރʋC#6re2vͽ3J+ګ-X '>-Xyly.zpYY}fWoN4B.g+P T[!'qr.ree D~m5% L/Wrw_kҢ +yFTpŻF9k0;.e8j:)s&TZ?1_N4_*ƤezRB2]>(QZ7[#~ & h@qWcOx8be׻C^i2a9w=vl@n0S/+O%d)t1M'KnxX[^杓>P3{19u# m?Zh,)FWL,C:%Eo[v` X._d{4<3PySm?ݐkDSˁZ(t"TZc$ *Mn _-"G! uv Q 5g8$o'-o".ק;A\}Vq;ύA0[R<ͥZq{{* m[" cGO3l"FMĠ|}xeȀw g5pcp1i̿u09GʰIwFFCB7e۶Uu/VPhmxR k,@'}Iqu(aw/=?2?%\ր]ttRk=HHt5\bmsE-Q4c-Je 3Xz gl12PϷzcfjyvhYIbCLҭ3U50s)#戣ftس 'F*8߽B+/ JS:ӊ6 yvHAHYˀe+/{1ۆ-% )1 |mo= ok0卑_?w>`?X<0=o$! X+6&/HU=vCkc.K[bλe~dTY/r{`ݰ yӲ2: QƲ-_DbBLtyΰK(ѿn{g.G2c?;}_3!LgQvlp  I^t5#%_e*PRV-bHrD;p=Qӯx{lxCX~ze]9*P6~xZ#ՌkA$|nNaxou:^.+W_|A|zL뜅6 EUa*ɅgXw*S6 f8HxxI9%v\Ԗٰ;WyGᄐ먙Ԁ=# ؄DZ逧mOvј9sI ~AM"܎C\G,bqaqepeG( ?ZCcdDSZB@)3:+ NR*sA+VtU[L˼gr1pbe r|aw/lҋmHgtx]kIv #27[JxwooPc \1V"ʯI OC CI$0~ˏsRut6$]K2%q8$ SsӅiqSὬ%eSu3`J+Pk-d98:t/y~> L)-2uy ӹmqmH"%i/y(y㴰UI:b"YX !a1섌[)Lu65G*I܂%tsRY&ts[hc.$@#"Ax(y ƞ-"۝~|gLG5]/q D h,vtIq61i2 $DfQW,jlCO$"|Ek֧©Dledň=r=I$)AV`FL0#k W@]XGk8A۬RFSJI ;\H%h؆~0m*Z( P[\Ztư!R&k6Pbd 9R&Y{Zic?rE֜z2ng (=va za ekȍa| ڒ)C}fN; J!hhV lo2rI!%v6O ye)ѐpPra;vĜIqqw,Cck4!# *Jj-xX 5"n ̟|d[OwnZ;ZtaY.䯍{gh'ˊ.x+;, &Y7S!ۉ،GܐDXD7%;F+eZA9@ A`=RSl`l8Q]GcԊ|k7 2`Dʧ']GUF{b'%n> OHbلP9ʑJH&qB:RH >RP%Xb8o輆M:c @ԳUy‚GJ{Nh/ jg?a%.MY8-3eE^3CoS ʕS2Mc>gQQ#E1E3O"Yz%kر R ^;?K(PIqẉ%30ʢ)&a/~Q ye\Tzsg"O7ߎѤpn(9v9l(qI[졔Baa {h4*yrIF54 (H+#mVcqH O?aOnTZp'79H"Yh.)>E&jL=ҼV1YĠMg:fh0m4`V8Y#[0~ ꔕ&&?CFMm6~VR/~xS Y4cq.9{^JsрW7R>}%8FjM<'P=nX݄ ~ >!z2zp`|LgyxbCYX GL)UUUa D;'u'L}x6|x-{z8xv$~\qz|by&?8(YdJ>cK j^Aܔ2sqö\f:*WLbu3D%fX&ZZto'q I$-9{㕠4JC raT98〘n%Жׯ\;-w8h~'+޶ w/|؎e 銘Y-fpe@ʩ`ɫu=8n/7&c(̽MyȜd_}S7<"vN*-|s)o$:?8/W('^"iG+῿^$UGK@)P _nwF3yΉP\{Lx_>H {(#ј,htg,W+Z1=\PO}|٤Ab ~24X VZk1[v|+<'%&ւU.P[7[Lz8b,' 7r.K#37GθmbD GMc4pyw/\?ɉщMdUk籵6Ff`ҀVrr*Vk|9DC8 =Hƭ ~ueQ(+g4b*2)zw_b㺮0]/(ߝ dž۾a;"K|ZĚᵕu|a!GCh8,0ZAzUU$IWA0F+EBSމcgBmZ3sE@ K>FwA.LL4y{%dF^zOgtQw)Y3m?f4yG  {V(놔)J2L6wgVA0U05 Ԃ3"6Z {mVjb`8?[n f{DL/=_ox;1H('ĝ'?wj_BiCkQ*5^UDm5LƠAK xkaj,䯾<RQ NE$`=(s8$Qmu҈ 35w䛜||pdķΡ\!=Cxw%aV?m7qfi;U)W]^RS3Vk79|G2і{LxIn;Ĕa-OMZU$TTzV >ZkUW"Fʕ;Ry0 R.F~6H?XIc0J8҉3gBa˺.*CY\zN+qJ;}_w_u"Љ=? /{aG1Ԡ:r%;=Ga'FD[os~ƍ Ti-ruɀZ&1/]d3Z\4CUxV]ۯ97Y05mK7ZNioS)2zqąĜ87Y*2qPHhb)m+B/IݵǷ%htjS!n n2(زNm-獤b'I)A5 d4LRq Q*ZJKO( br21.wK #̀NqiB* /e&Ēp](2/Yi۲L㈕uY j>lɋe*.PtCrXpNe]8"! f]FtcnH kJP84`jޟ;rim+~FʒVPixKC)S g RXg<ҰZHxD Ǘ<*Lb"TZ3DUxmtp,>\ yXCJVyL߹tؗˆX2T|pCjĒs.AZ'v5@X3#Z|0*<1>eㄺU:e)*q N1bcj 4Ĭk@\kYvc+e O׫$VHW^GU(b}<$@+3 6{X8sDUֽx` Z0M\6VLrn,댅M6zDʓކ,Ht|:[Zʛ*:jiBa gTVq:483Gu쩈 1ЭQ"I|l{AfY95 %7{Ʊ3)ո31e9(~kV\E2",A҂0]hxfTͿe6`Us)3*iL 2X=/J[yрM`sҙIo* 4(S~~U2Ce(䜱m+uxD"!#x$`͑|Պ\qADM#Sch6cx?r;Zy!j JF߲k`V8Ar^:&z,1<ҴE% Gh1/x/ psGBXa,ˍUuY]kD {Yq`˭yWlF_^-B@1Q(wv"Tr&(1"uR-(xg: y A~L<8J_Wz]hm"9hL4sȉTU3@\{̾GC)#1ٴNxwyƜt]\}t4H9%(fpӗ -,G@aY, t5&QQq'G2"Kpxa7 `ۦ;%+]wF ^s2~#3.iy(ѝDD3@UmjXH}XhU8~~$&QW%uVhU(9l0g`QSbP2s d[|oF5zJ,q;i WY;M&rS3'DR2G‚TSnd!/8L TK Sv>QZ;_0ڄD G@j-/>KzYxnzʌ9jbE%fmjҊOi0yAJ9:Zl>V8i]ncnLf9+Bd#J,[_Bf$Iz_4OcgcjA2x,gy2>.}ve1@AB@U˺1~G*n/pb ضemۂ˺XgQJSvízt s:a3;fz7ĊIPh*7VqƌԒlxNd:yii*Y¶v4hpY!T[s@6HVm | N*Ҫhʵ [TcT .$w$JXlNJBG[a5X<7E\%[=z8aV$AnވUwSeع S溅4FcY^5e{mUPiRɰ27[<fY >@$0P0km N9hkYV>` Pv1 톃31L}CT43;_n:HbMk=} 5,^;d4u]eP4ԖvE m ` M=TI-{Ig nxEhEf !\Xޞ4aK(y 2jhҽL|Bed2& ! eGXE1'놘`[^_X\q< VV]wI*2߯ߔEz's#pГ]#-X;Zʏ(;S`{Ot1gZ"gPZiq[W7ga歽ex*JC"|{]WrC*XzGEa#b dD)'n*R>19W|$GkI*f<7 gFlJ7)Q`M5z2ćwms` X RxV2J#v 's=8$ F],Eञ*CEjN8#.s|y3O@T_Zt]g?8PlТ0{~/F^Zlcβ"UD0@Dӹ6B}3oCR)>M-"zܻ3Y,kS)5]`Zv`ŴbdL%CFw?Ν\>x~9'rxk]B P "[\s5T⻸P8c)Jԕi82b2~,\K?G˺в 'uYrYrwd׮>,ŖbZ_f @k ͦPuܟTVX~sE^3t2̙ @)t1FkɰNvmbn AjpR'gbe!.=GCXV-?_-&H/mu2l4Hk%b}0x95 gΨkXQ;Bkg#A3q'dWK5WƜm~QK89ha~節Raiae"\Z%@]Rk'Q* b *F)F31xMRQ m])$Yk|]/+ "R:[QrEA%zVKwi6=MPfRdb!ÀViYUT*D$i?<#iGdIsT&KB)y`3lLyo<] Ts~|  VvZBrOooN" Z: :ZVOtWk x]1|(q}5Qw2jM+&dH)red}!Gjo8 3 0gbATHψ rc{S&ڠFku W䥘EcVDSᅧ팢 ` yf1in T6$Ù8^Za@)3rq^Zj%ϷUvSAqV9NýLH9prveVq⯡FNI&zP͜a32yoę^/㉷f0˓웭hМQ:yFV]"a0 8Ynh>=jCJk3RSb=Z`-;댆UR0"Ϛ'LTK #WWΉk5;oOBBoF䪪S0]QJT:" XYY]m˼q౮zq4S#ycP `$yDqҤ6gnYUH^X"h6ZoZa(] Ňwkݷ7$9r/T}%*JLNR~EufڃEHnOFY7A 4=vPЪDaXqX.# k@RuY׍Z$zc@ zd! ,~(C6^5ڝCG#evmYHVNZ&ǁS6+EK]7fT A[(VS"0PY>+]V/;C+U4я3 o?~}Jn?]{嘡8չGWr](m.ZSGʆ6n9~SM"Ìp ٣$)Lr/WA[IC 23s ׆ >nx]'VcСQZѥdhV3IxOę kț%SR+<ޏ9:Ӯ;WOu%0W*͆cl캋 JcʓEԑ+Ղ 8Yiz&;WyS5p 7O*>:h9:u._fr/k,x&BB˯ 3"P4eѴPY/*7$m19bz[ܓlcg"<`0Mʏwح8z<ӁxŁ6<yAZlKLV3I)>Sܮ@Sx$yT*QPW_GO !v-ꥒgcH|6 1SD8cʫ61 3H c.W8c&, +!DƛRB*LOZwd4Y#'HYMc%:u!Brֽv"6Cx50>7]Q٫@IppN'j?|ސs_r}6gFLqsɸǝu,%eڛkVkN_{_ IDAT`6gSeL#XLH9nR_o U^,bMq=]4%-N(M887P|k>K8 9I#9H$tT_^‚Eulc[uRY*g1^o7($PB[XZ V]y+Qz0%YU7\:`|{ Ue |Bj.U"ۀ_ҏ% ‚4 L|˵Z'k7EgZ'_fE2T:ngxē,! 1ϘUj͑1V̀|B1ZQk9H(wiXt(/~*%k-RTfe,$d;v>4kSmFGahلLtc0`_X|{F~84(;"F(a54 pm]q[(mpēïDHp`v l$w-%H/[XmYNe%3UGJFX%|H]<ZJK/"熀1JTH 1rcz֒46FLCpH%hHx['ν>)Oh=,[gM2jr@J- ]"^ D%`?#c"œbC vh3?x7U|FNi9}-kxQ 43eD)=gr mc =à5320J_/LaFE)唅1< ߙG@PETˍ62qvml0E,]lU/ˆ౟sO<[}Jã03&TJB%]UUl;?Hgh1NӦ]t_z5O|^>*g(EiQXs! l#aSM pԂ 4./)5hML‘ ~x'~~C ??X!M?+`[KJs1$;1 Qs3~7[ 'e G BSii˶y~`ʶ"/cC:n5wt=' /gzG}s-p W/h㈑"Bؔ\e/5<(;xAY`׈$;@A5|Ќm߮rᇗ+Z&G+♢0!}xq}?Im`H୥b[6Z SkH @}5E 2ug,;eAbuRz{1eP{Cx\pšGgGɒmܱg`Ĥ h,%>(IqVADZJǓtű-1.ҽk4?J0ZeX=~16]tˊ =%$F9eeuI}7Ǿw`OHc9Rg]ZQ5cu,@D} ="@TkV#}l,b)z PZclTW2wгҰJdr/8yhe4A $j}7IJ=háepɱPm]棗B??~UނZAA=J빋uFSdmxLC3!^^)FNva2JOZ|/xR6Eݹ G(Y:+5jح#LYGgc9p;RBe&CYuk\%8crJr,-۫^s!W?ްoT92h1!8m = Q .P+(,[{%ՖF4Co׌1'8[%^-C\mTng8)>!lrٳ$ُRgzF2b;FTm'myӍؤn'xj0SW'eOSBTfn;Ѝ5N9f%X,g4y벙rܽ&=(p-5h2#׌X T>q5+H]pc 0β93SGK+xm$|{<`5ӇL8I=4@pcěi ڴ+y**͈U!v[kJkRYbі_8[@x0%zp&@ eN)Pc`B* 0 >+[Kl&ȟAș `eQW&(fDjvad*չgZiT,AW.V$.e# 8 ?VypC++ЅVI OTW%Τ t"Ƃ :\W:;6XLVXXmeRpYC{~P0+.~bS$XQMUR#sF9oS9ty\P{j=nƒXޡT 9U5  휃@C]@YDNkܳVfIGkSQvY(%o?V[RmM&2]B=o^N55+aߡd=G)[=ijpٖ9WXWC%3rK dx8MkHm JMǸG:Il2p]ot$iNݲx\31}@EC*DuTx| ĵ""]Qqf] <PQ ?MQZ!N19a4)?-zװr!r-IqL8{dwK1 Q-ˌm|#ENe]n56Y^q,OT\8(Ul@ zo- aR{G 6ADK# PY¯J}{Jm~H墸Yd~J t] 4'/ހE6I^Ғ72g@<ߞOfC3sǬĪ,a_6Vˋ!s&Wp񞇸2IăK,6@"T\VǞHi|񨃩r8ۂ"c H/ P4*$crD.:f<l+5H;~/Zn$g‘.Y*hln2(!ѨW\`G _SXd\fh.kZ{O2M'@uF=n9O Z xr3,♥72l &B00tH"͙ޏeДdYvHxCc)+bhlgT,"V~~#(HֲDMX1-@*I ŹF4 R! >~ؽho k6h?03H.X=ܜeC yHEn.;fSf!O3&kXj6ɧ6Te Y'$u@R Goct4<Ej?wf64`UʇjTâ`jE,y3p!dbk&|GUrǙQU|D NE+^gcc^+#G|Ǡ4FV#Hѵ¶ =3M ŶH^lu*Zc T:V]wb1 Yq2O_5 %b0MG S#B IRYvQgZmA0oX3sFpKTmVJsJf$NE lMZL49k ЛlT/袈x0b DAR!hЀ~2VD^\J62wεV@tU& VeāQuǾxNs%g$| ^dj%/2㇗Oܓ iY/;dhL_0;gYédk p}&,#[cuyYZ'y8ef :+PԔ<pbkE N7Z M[^.g O,q Q`jjBoR\ \܀WP.-rtLRhjoopj0U$}]eNb LFmaBbfiH6JN4S}hp?wff>ucmi[9w_:h#N1j2UTĜbxBuB6Zp`h$ٶkucn_1jANg'cqb: ue{Ig8/ Z*ZRp ;=N!"BiI61eї^gZ,HJbل8!8چa(`[H[in-Hh<"ZkTXX8ѡ'C^]<=c$\C+ٓw޸%_3!0s}&ŒgߞFPli^>:@ Vk2V'e,6,g5VQ2:rtmꑐZӦ4=;r {3&fG9 ~Gh$ A;!$&'*'̻ɭ͞ɉJX3'{FWutK683%ΔT`%,="2*eesJ#&~$ZlTA#1MM LIef&l:%^>%ý%2ʰ3Ǚ']pArx, @Q$^StGm]bε <')l~xX&4^ &vt eĔp$?_o2tuESj)sjCѣ7ՑJj]NOGǧ ohĘ[#l$lqʶc$Nljg>pTF{^ 9{ܞ1q!:Xװ(":E#ҊSJP1%Wxv#"]I?6BFf(SY).Z63l% y79 UVj1ĖD JmۘqK WT?^mC!72σ] j ~|Eh4'S} VBk`,qIˆ}s4oq] G|@CeREkīwgt ktƀTܽq Ӛa9R@0T hx+-fF!ȪI8e{C)1Gi0 Z1;r6T$) Ru3E1sL !OiKG8\bi=$SNԞR"UUJ ݤ+CI5GT*T"F;"2(D&c?YCVI^"AFzP)p FiZaumy8e[Ն˺Gs7ˠ4p[/!u]Q< "8tPu G㖤?%]*GbzkA 9Ӥhbzm2a:n' . L(x&&:7X췡Ϯrm̑w+b nR\Ğ:zj%R_|8d@q8 Y{*D8_ )(YEgu\>D@uĥe2 ;mޘN3.e2pXCD5q8NĘpw-$c3t!mދ| e#@r;E!{\sĈg<ʉ_ H.D/=NsfXBN,_pYH ?}{3hܿ7wlY jKxnj4,."2ܹ5'`hg{ɼD.S >qUmxY~j'3.O}  ĩ ǀu[qiw<"ucsȄ画>/7yж:(VAGEywihV-Ees P<kI܂!0O/g!WfO>?S>c"oevH/$J f-l!q&?B++&Z#Bnn қ஗qiԳ>oDE882xc5$Zo, G,ic4f(șl:p{$%m]Mu)w#4 COs9cmc R8k\ |‘ObGms^i>F7w\y8<:eF2 uJ9?`ʜ"*:=Fv<s%v m?7o=RJ 7ur|?q?8V o.nAQnt=ȑzXLs|,@ĵͣ. 9W.m`zYsU4UɘtJF+y`]|Sh^ 3e\y-ֳVn..5C?F~Ng@odRHU3YuZk*{/'~L3΢xx5Ĭ3ĥC+17$p0譅X'Q-x$BUٹ{楑RtぶfFjZ㜣qHk $򹷹ђee!9ɵ>䩘2rfpMpyj@&69R !8|Nw6WZu]3o@Ul ^2)䌦6+ty2_VAw~9x$3ZJE'tE<< )Sͪ8M=^/K!=5{6 X\lN7XF>skCHKWj-KsZ^8c]X@`f]yqp5l5 33b k %郵үu6Qe ar;t z-d kR[:W"D]BMx/yDAKe-TgBQ xMUJ; qj&&.ysd-? =V6f>7;˲pG,S/5\kq]kp/dt (vٰ_5>X YAk#n]yyx\(q ?UڰWQR'*\ pge j&fYo(uY"MnTidzxȩzI$l +ELLf0dS$*3#✳gX~s~՘j%GF"h:z\OnD:Y?NB7zlY @W*` %f23$$UŁiI9yRbXI"PU1aKD Eg߼6XjA;smyÌv`/p w9uuUW,{V$PTh9+l C^Et}g{""6ہ3. O3rv!W%\7%Z Χo;C-ƟjZrCVTdE8- ^8 q]p^.NlhX1J\P`vkT:ѓBvp:MEbs@z\VF N;iz֭|nm95rx9!ƌ۱ RA:u6B#_겎KĴKK%ړ*E~ ٘ʁou(3O G"Z{M/ ef#{ X#br|lKE"u$Jc[wh ݗ\!wЍc@;Pp70 ξW4JQ`E)1<*2dSV"͢#a V܏ $ሄK<=+>@A3*x=,8D>%у9PA&Imb,BD=?aya2LYq _ ibk c܂YƊB% әPK nyHI?v7W32ڄ"OH  kNP#p~-h7q'X_%;RamR'+9c$^&hυ5pK߿\fx>! k{uFELUdlAVcc‘i8͵`ut%Q-&[f.8B+y8@7c#{|w̞NvH-LXmʁ`u|Xg&T埥q_~Qq0kmr #(#9H=JBk7@? zi'hQG؏{QPq?6nDWEQjh'o`^4 hhʹbIm/+~;Gɱ,$VJC5(cX V0LA3`&\N+hx*s@{;{|~~"Dr4D9g/t)"$^#[ŸUm?bb\B CeV ߰HQ6&Lu?e5;g6$%4LRm1V@T!_& N J{Bn&PVh}41v ź7 dMBkhV֠58j G/q5~M)Y#k8n>ӹ̳A^Ͽpn)RڑTZy LcΓF)_@*\ @ئ@ OeHSdHF/)j|X.HVy}$ kɅ7orÍ&~m 9 8eXC'[ϐ/ۈW- Myo$)c%F(hs Y#4,4*f?&@*ɑXDG˼qY*m*,yr#Fmc8aG˜jA+B" E=v)i_S4eێ@wlw^"i/wxol*}paר"s3 +td MN"^TF=yd.t05FG)_wF@ʙ֐W8c /g,jUav !)q547v[sQzhYHŵBΪZb#54{ů\b64Pj5\"MvRΰnD䑁dY0oZ)'MrQJhN8޶4\jE#GMJ:Co>"jQ#!N@c'LZ(DpK!e졗iϝeSҌ*sNIdZ2Mxo &8h,#*TH)}۠Li–;Opg:IM%3AP5}?W Db4"*Y~ ŀ*$+̯P\M*Lt`%D%/ $V|o2W=gJm"Ȍ6hvC7`W7pnv N~i&%W, O\Bu-5 V;nm҈kFTnrm0T+*V?Rtz߯ 7 +zT߶qơgAU- 68B"淆.Eh'q`%qGk^J".{X|9c|gа)L UkWILLL"&b(QޚjXEdpyۿƲ|ua.!R.Lz#9 nUI8h+*?Or-Bivd1D.&ek8RFȉYuDijjǺ,|6̓:"PgLv~LIfɆ+i!D+2W 3n1༬j/wvE60qƊf'`E.9rՉb%& # gW$ mZ̑ ~zsx]j8-\3댷>r RaSv~!9a+"gMj;j_VLV"qlR>+:v|CLh$xWw?o/Mzo ?[452&9ڐRZR uM2Ϋt-w_e1M<Ӛ\ۈ W Lu%8$4$, h-)JtJv$)0;!*996  ҄ RAEXn@+WiEc[qA^ƆsSΨ9d zNOVR+tJ3ee}?cP~> a$)åG*8MARfIPaZX rn !qd_^୕^VGLxyX#lϗa@@ȵҌSj4Ҩ/EJsz 54ÝΔ#<HC!wh\LCF}+B԰:MuH 2a2Q{O3]oH#i[+@Vni"@)^=W< k786*2()9ٮ8ٯ 7&g"kd8o׫x &a~ OY:h,fDԦuoA1f1ಬv E(;NKxF)pb51cO !IeЪKbrtfSBjP/B4uPFz%OYBZ&Lv˵{&kir8Ϭ4DPZ=-i xO|鴂֜g+8 8ihzAQ∬/ m@d1buF*,y w}P~ZÁN+,-2FkqJq"8q_kK8,wOty +]+ų N$T>Vy[B LR-`KS 6n豛/ev^EdSF EQ/]:y 4DDlCg+=pGi G<`D%ڠjQ2nsBi̙eYe!" &O>OJ#m  t遲mkXCQ0i|`d̑Y,Xa;Ң<9bʵnv"'upZCQVhOk?Ǔ-ӨJc /'~ɷp#w/l71OkTIPgRZ[X {JYJ!F.%~=eҔ$iY$qIhNPrZY`iilCd@bƑ#_=Or$n) d3GS pC“99y}Z,ExAk vo.&5nn25f??-4"qA :X28b͈ (sٚnȉ,Ϋ?}˒}n( bSu%+<ɰC-വ`j:p_Lj=eL##2=ᰚvݹ3֊(On#$2`}[pZùHUkPR_x2q B50RNw2ӑJ% Պ=p .g p'erKAH4»W}(΀dy b+bJǑFqRZՆIS?Zl}ïRJ( ( #"$j;)&ﵴPc,|\G<J%cYbz2Q`\+Z,L]vg1ZLvDZC52&k-0g%B1pVh=-ID5I.J p'ĘE~V*,zI9gl)Z[5%[*h.M^{m6En˛Qk^gS(Q (TR-T/34.—5Ԓa,+VȹSor2O ۔2MP rθHtۯ02/$n- rbod5׌B6Gx`iUw,\!$d9Hpw .{s]`$ʈ5z;ҡ}]vMҬuGHd"_45QCTCT`T1ɳ%'%B Χdv\C7^r&I2yae$ @E9J~/&h 2 gP> dP'}9U|Zl{JJ/=@74$򲮢,HGH39DҼ0BR'n7ֲ:RFk\4iP?Lu';b5UȒ^3g >+)^BaO!3zoNkQoݐ>.7jA( )FM-Sscxٱ^J jn j#ϡfZ{6;q(t~;y'1lKD cϔc*S-02$ <# , %-hT؈; _Gf/Y 4c1J60 gٿE,dr;>$1~þsP b@yl'l)kw,B¤ i6p` U/g,ޏ6j>hC/JwNmtTzꪪ!aTq?v DmZpr#4`CJJN)pB)(9(8L l= IЉs{jQ.ФaUXzcq$& 90K)u=Oz:* TLR)8JAՎZ~1kj~lx:6[ᴂa]qZf*E2AlEd/@Io: Amrm6A'ZI]$'ZePTYhn4uڈRw媼yU|Ds6/%:nf牉}4Y Z/^j#RBm5+Xj*Ty*VomiZYLL==}z0,Tc0i+U@5<:x  0oKwx <9@kw%S_;RP N@j 򠭳&բvq.\ؗRqO&n wO뱖[.kEVf6&Ӱֈوe^Q,kʧ{7O>??1N@e^ "Ds@5ZC x@)f؅35g8Kmvrú t4EO3XAo<]a2 =~+h/V:-y$p>[O9l^PK)$"XG9/"ub&KV0y(eXf uL|s|&!GfL%"Ĉ-2Vb`fLֱj Ĵp4@-UniX=C[~kNI24Z]yhh#$QBk%nxI2Oe_N9Q|:/ZaYēOca+=k="~ɼ*Kl'3vE>>zĜU\^3 tFvܪ:pӂM& f-zq+!@)a=Z妉4<(8+ :Ȱp[PӍDU4khbQ 15ˉx68c+Y\VѦqzU.L #w gP Z+Y}/xߡ==3HC0_ЋEDJ 9I(*t>c;"n/PJ^AԤwΠ患5 bĖ3Le1g@K9r3ێD>@WIn+ !}qDJQ 0(9xg&dhY. G̢LB*x= q f2@%zAVg@;C"\0r L#iT2"UTLK湕ɹ`i:{!?Uzg'CN5i2eh5d2ؖ({"āЦzrb&9IH EH_e8M4ٗI*19'>M@ a:D[ka>_οㆶ#I=&?Rm{|Q)$&lǎD!'}A¡h㔱"^.xvTNu&8P2u(<. H)v߰  #zOWF9i;`rf`'[Ųx߰,?<< <҆TFmc\Kb855NYow(d]鹂p WZSvc1Oxg| 1F#- mC{hk88t5PE5뼌 wVx?sm`51v&G#QܟYTܝ+[ hKe;{&F;F?,Cmۘ+0 cCzFz;$N0h ?S`*e^^owӇ*[B7. s *UBel8jC-IYRJ:TF/[JX'Ni Ӹ rUs>; e ۝/yrlvvðAFa"-@ v*29}cnqs!XGr %;DjfYRKhHxS2cHdarGdܥ5Ӧ]btCh졌MKȕ!)ytoQhG.iUxJD^N L£>E H̶I#`40vHPL-wJ\H@ ! Wk*!(JX*L:MeBB'`Cn A1h̼ IDATw%̞pZG)\ĉ(vo&J|Zf|HTj$`Y`dF Z3zimº9 /S(R5{Q#[(]7! >,ع6x2}ɉ+PV7$JDL;r31[eS[kp,NKhIyhܷj$g)gY%l1S9ڍ܊Z r~ #m9k1YKuby9~J&`MacZٺJ짻f>}C,\>,+nwl)2d9L>#=f~~~{wbKOz~&w7g!QɰCk-߫PĶb<͋CT ‰˱cNۧzrfKO{-RXmvP?[hM?3o ^NxXfF:x8-8͞paJ&JyTy=~<ʡ,@5-5C9Uo^5Į__R!B+} 8"%`ucQiwx<Ϙ&3"?RnlB=q]SP*^,e&`-$JZk.?䙉%!%j$bD49=u)6JtVԇZ3CO?=w =*R.AcJC LFû^do/Gt'|zxz8 ȉ~|~| 7N@[ cE4Sjkx8XŤI< :euD~ax'Rs:s g(ÑK ɭVL(Ր}F\T;?*Z*[ç3>^.L+N3H~jmQs=_zc2#Q``$$"23g+Zd4tFJk,lHEL]a5\cd$!Вe/?wK+H8H_yMkn߾nNzE坅f`#&UQ}s.ty/PRGPCu2RG|i%dB:F2KZKTzma{z26*9Rk0ZZK7!sMdVbhH TR2 ?]|t:9vCJBON^8bq8mJV b)3؁/ )˭Ab4EI3R J-(V]or)7Nm6 !=CI\!>Ud5>њ9p.͕ېZoG`hG$ Re푆u!ɚkb ZCqb}g@ )jPMt`K?@OcFz=3]6P5x~x:{%l&*tu"鸷E8NY<@wk>Lzh%uRPHȌ&}81Qr 9lna4y)=$B}t\3"~|yeem۠&,IUKühxw#%Wy#hiC讋\0dN3wZ z}kI؁+rI)Zw=>Q0U& {PVKA2t>s [?S&q=IpAYXZfpG- nnBJ83T S+,hƷJ5VJC.d܎M`-jk q>ݩBx~<2spSF Кm~j| RL 8R@O[w7|%Ikwl,t QC!72_<[iFu~HFbUS o/|tƙ*ВZʺYk^!c0!\7%+ =AK2+ft>zb_E:~;pOۀTo*,}ᅖF>8er+Bx),4;3b΄bddnAL+0R"9B"Pr&_+~\4*VEֈhZSrmR#0pb,yiKg=j ! #r^K(4)Rf?cq^h }Y']Ty蛬”1Cxu$F 0yOebc߳X-E6KuK+ v.c` ^#9V[ŷOVB)%Âd'5p\EmIn -"_$Q7_B.)pW*UUTh4z2te _&JE1|@S^qߏqJRkJXe1#C e@EL\߱RPh o~lq~DdșV @[3en!(NqwV'b0Bi8 =!6@7(; q8 p밞އJ!Z#Ռ+2ig(#չe ?<>**2(`QwPFfЎe/8D 6/ӄ{$%21ڱ>cĉ3Z6ȭ ܽBMIg22Rgbo {(# bӍ1 H2*.%JY@#R|`4kJSyX::}!HL;aaϟPsA ZK> ZX)PX#m "쩁{7ڰLz(mH"'oi㽿v8DJ]=cm1s Zi;{෿oPP,“Rx B -4!zUjPj X)DJh-0eKהD&xju3 UY"@>Cc&jio ,*xw|Z,a%.GZ^k<_F÷w J)YC>jZ-0{/OϷ\txX\4yB_U2r8-b iuqWP~4 XrHo..OLjhxL8om2l;yzYo hgH޸|] sp| P]vӧ]]xMF+\j2a K)M1|+kƝЭp#2CiV{k'AZ!QiK1/kJȽ@}FY;˝ҌǰJH)dzeQ}Jfw|b9{_3,4l?R 0c@ =uTjE/wZdr̬X34Qm<C#zH62djZ"8)bhsVFI&Tsğg0 )go5cii\;^@x3>UyuE|{_?#??ew卝nk!Yާ!:wϗϗ ^;j*1mT]qveCIpK4;uE>DtDW @"C̣ ZHV%v ʿn k->f~!JgT?ÏO#Dmm^<a}9[Ψhȅ1 WHX8d)jׅ+-3&N7j-p6 Κrw[(hi|"!0$݄Q..Xj1I2OsAn-!ƖN={(Qf1tW Sm \mCʢ s&l;JJc/h(سè!9g0u-b2N5 qFE(T֣˛i+ʦe-oxi#mP"S+ CqYI{ޠF*T'0.X|w1og-[RIH#VdPh\3︊mH1ʹ` A P4j:ӌCJ>s@J9W\- D s|c zEYqul6Q˺]bµ$)K_rYT<ՙ_*V祒L[D]r%+![%Ǚ cOY5RX%$Ց[a40آc&t&\uN+!UZ}$j3CS%}D>VC>l8q]iA)G"hr0Z쉌rJ-,M-aciV">Pcjkڠ 4.i C3 %9~ShQWDV 'bZY93y9M P`ZLJ kgA^ɎrʼR_HAU>}{HG Fb-˵Km؛DRzgyS$Β]>ZQ*&f&@NFu($azD{vt{-]  @ivor? ӗȓf8K#|@p2~ RCSap*Ҩpꢕ+11%Lzۗzᮻ7ʫӎdZGLC)!-ޥI;FJRVO`3 =v芁\8=g$xGӆ'e +)ŭCRO>܄8tYbiAW1I͹JY%"CHa}MVD= /zktՅkϔ2L*6\'>ڙwX*[rrB8G}_ټ >h41B)@<k5e̎, .!2P-g"fX. W{k9A'c~:4&i/XJ;8r1/6w5Yʻ IDATƘ{@?1zvNEᴓiV8?ZlxC3 yL֟}kh9mm`A(=G^BV,y2Y66{ސ+9n:&l |r7&`Xyk c(9C*Rct! ,!Qo4,'&R֑y53Fe.0b ^"y0H,~Bu(\eq. <"}(H34K&^eAֲ؛ =H1 <V _==FkەJ㱯d#߼JP:Ck7i<!"//o3ΤPkAUfH>/| m;gFG,`ܙ0ʊݛ]/s|TeF)@ۿ/VPGL7iFWǎ%F<-$ĎS`eUv̀sN3] O{K!5Gmbuc}c;n)1_SP x+5F}S f%ViKC11M$VZ`Fi㷯9}+ (Hqqغ.@[rIeր%LpuW",!8aI'~K)pڟ\yPњ}$q•2gAav] Vyst!K(;@B TR*!ognGuaJ9 1E7 ^tsu0ԦRNb,;?sdȰlD |xSL(E ^ES|hϖ7D!u8VAސ:)8580UHAQdmaKܹ{ci Wqs@B9f'%74 hY+፟=gd˄e/ἄ旌r,R(b|KC>Z&l[Yчgĩmh…?wWxJ9+Zxjh U\iIe=_?~QZaPԠ̠Ϡu 9c2)8$ڪ~Nȏ3"=:k$`A'1e]d/;P_+{T[=u> yź<ʊ> =B[Qr:b1$C"[q&lm_gF)Dw8bRϸ%FDzF#e%X"Y ^|hߥ(u뎽PrlĹ=jۼ5X;z)tE : ŮTx렭:wo9dUE2l,9I,~)깗$<{%Md "֌˯¶VB72,OHJڎD-M'+L귷7kx~pb𳄀g ~<xheE̊Z kš2E 4oX!Xs3+HD2e*=Ҹ- Spx/< 3%zTXϔbrZ9:^,H/+A2( #Ӗה%F|y|{//g#n(>((5Y= .3#c}]7Jy Agym ]l%f\.t U"6WJ^&K3vPZMKlr} |{{(>zHQE@*])ϟ1dF'#Ԣp'\#"9JQ#dtx䪔,w!8ˋ(Gڑrƞ2&vh1F$ڭ`9GR;y`;B2J2W0 1CPk"Qv󣠡,㾭SnS[;q0$ucL7"_CD{kaKT"Mw!.x6R m(,T9•K$Ա2FL*@Vt \fyAM sBPg?\fW>N{ pXƠ {i]c h͍1t]~mPkÏߐ\VcxǯϬhN=IeJ'+"\3TIi^֊*ק:Rqgl)#h '^W59sИkh=(wJ>.6v\;#&7`o JYzOk0)t^)li?1d5~LǶZ#ڷS*ZfUx[WfL;E65*Lۙ|ta믔3=\vΐQ^N)ɫh`_02JDus&3RyfW#og:,{M3\A0$}6ҥZB<ɟOݶՖ$L3bhm-oOܧiqD;"{H2~ǾmËhGuQPnS6dp4mJs02 vTwp&S6Uk݊%&qY8>j(w>ɆlRJDw_$&<*X\_r/>4f2elcCab&" Y^9r:0OXzۜ1c,LCxx6`)#= BV;iFo|ii_keF6m<[M,g`, c+YK2 NQ͗3r`յXՕ9ɹ-k2z(ˋb+`H"n~(v %^KF^AGwrY!凃lʙAW3j=AG8 DPA7WwkITimy6ƜEg,ϨA?4,1r{i)qhNK jF'j#\Ix3DSIȹ~Н#W+[Td6'=YZ{D0YW?c 4a% e5L!`- ucY@JtuF8ZFb\I2k YαCR R/ˌAڔG'C D<9!YZ`/}S/qbR˧,E |zZA.Rް\m ,%gVHQ2klO¯j jCD)lR p=oF2X,c"+ş %VV U;fǷ=wМU{ 69C a̞K?9f%z4)Ч$eBZj;{ TD8('N ȵԃS`|cp 3@OLo&jc_m֜Hi; 4-x\Χ#%bd^Bt_HZD6(;5FAPPx,xZL1bOkI#X8>m bt(rj3:--8tU! ;]y ]j9ut612>Pq+ VSVnEQ F2g)mRUJ!W޻0Tq[fLckx3/baB)ezRېx㘻 fN>-4pa-FF+`25p.Km07KŘS>"6jbriv *`= <aAcEq_?_q2ȟ} ˄ْ2vikÉhɳ'64.Du Yl{A*+IƩ ƀ4yBR+MY+Kd']/YSU]104+Q۵7bb-Ce+~tE1ke,C2u ),of++gqbp]FSTcx}Ֆ/˟a)E+(9@`=m]*g]}p4uH=}'9BckNUrk`߾|wvqֿo Qec>"5 :&{ٝZiVaUT߂z.sO{#Θp,d"8'sV!hfćR(?$;o'){awh5cfbhyFy??#JB_GydD>Z̳<JjT;YbWm}t:qQ [a VyוƣJC=ZJilrcnt $bZnO o~2đ4J`LY6iD9W}_Jq_WtWFPk;#ܚ1x❜u+gFJ ʨC9zT2@&Rv.A,ܽ}E TYX^8l:G|| zPH`"isWwٽQނ_ˌ1z4<;pk;F"U{h\g xJiz[* F|?oA౔m7{"u(8b8b<\(;Sg8a{ Sf+bH`-+PUK+r-x\;곮0=ȿE5[:UJN}@Y5' ƯY÷^k_¨"GW#yBbN'SfZeg [vA8ۊHFbWsis- si`+-w8y(QN3៓ZU67FIjSyo0˺Jn~59ErWϙ3{N %IB^5(b7PFǡ mIm4,>%:1rbX qUa-E\p|L0")C-DW#QBmd(YϘcmO4O:Z6Y1̐l * Iְ!(Bu𸩬!(1 .{\+MW"Px^ܖ-1`,g ۾gͧ !kAZvĨU'kxu\gɽYw5e1%Kǹ}[a=) 4)a@I$鮙\eǷ79q <Ҏ34?/R֖\y?*<˶9 4*ƌxfHZw,a",̡9뮷L婵3E8} b.7n33vπܑԚ91k(}|=qa4O lٙqijnkwnĭ}tQJݤtJIDATM1)=0T vyӅֱ$fu ĩg/Ġz`ZV'7׊2ptba]^IuT\O׉10Ljh-bh;r=\u5skcŞ-2!* u\N.ڋ౵ &E~Jn0P@q`(94v]Ԗ5 ѣoPRa]inkW^g0'O T^ :2 ϒ=؄]\\|$H%"U͌gyggg/7c4:OWڻ ]u M$Ƒbjq9sX,j$s9P\1sC{fK \~J! 4`^?;5Kͭ1;u( lh;a 2%}rbYv/uC7}B"=[LL  MQ3Ϻ'BzVf6IJe4` Ɛm~!`e(|}wk/4a"Gm\(1 ;;9I(!|ai}դVKLi V{Xz{DJtZ% 4֏86rCN X !`{= ו8,]i O>tM p N-˪,ai Qݖ|tƣT)Iur Ly<2:LcIX<+C@m`z~-ASǓj鸮5.B#=0H!1%ĺd $+70[&+DH \5+8Pm r־B)=&1f;/7|0dcM x\rJ!^@ll2r$RY4;Se}' kL~帀{{(}];N&MRP+@▐Jmqg쵽Od~i(dH|dm؎-2q][ $iv*t7y"q}m)˷}04JHH]E=,xPR*+Q;׋pqHc8Zns2L KnuaWd^y^rBIt?gQΰTiC4M@,>8-s.+]4CD&ge{={ЀK;A26L 5Qu jsG ܯQR@ n(P Ihu_5u+Arm֥FnkAYR/Y@_6>h_s-eo]`$D&6>dwyFm" l4 X1QP/vOmLwwwI#{ 2Hu1) - 8=% Y̓*IGmTu%u̥qj@rBq\ov`D `:WuC4 zxg@^蔺HQdGR߃ e%Г2)9J885:UrtIʲ~$v切B|j`m] \ Q5@NM>QyuQv4C@t 0$Kr)C3%A*:**?pWS\A|SAe^+0Lc^qiLE>3M65YQ*H@,Nb8ni7̡o6p=g*GL+r9)/yhd.$$e 8 !ܣ$Jb4Y= 5Oc`>p__7}:W?D~٫iP1b7h|6PASmX-@Dz!Q 9=Y^ʇ rA!a!U_ڿ o(2B(0~UޜCqie3M&!_i9kj&,i]W1}n4J[ XT4ZCR^/.W ȟ'"ƥ US9:=R; Q`\x{dtGTԛ8zyzҙ{j)Z_zw8ONّ`| y83V!Gzb;//uCLB̳$im|nZX4`@CDM;|8p*`[iBܠ>NfC1,(x#P D:$v*clkY IGi%URμ0 c6fex*l>^,w :G"+ ɁY? d۟wCmx$ٶuj&S2t8⠩r<qw PE0MC k|~*W:2/:zjKR'UXIgepJh6|G.>_ʙWgU9,@1PA9CcXF-p*'"%M4IViIܢ.ۤ% Wȫ o`U)*Z{#3Yd3L흭J[ΰkxwCoHLj2gC[T ٹ|gGh 8QBs +j'23m⊢,Yla):*UjRP0$c{}<וɺ֌{#& RMRSf"*'v)(7,HמG Ö]PD]KC01 U{aD qgr5] 7ٷaUQ*Vo ,*"54@6^`}sse(H0DŢV-]Qq H)ȶyY_ƕaDZQ.!Njz?}a>9 h`/Gck6 i B e EZKUFR ZE,~^~W8@j o %n{| 2L_Gqx6zkjopf޽A\n:1TÑ6gR'pft1_j#e4N]{-P K5-]˔Іiwu/n )D"5?l3I`_'G+2u6*VĄbk? CΡsKE C۶>P &^NYr{/Rl ~xDF]TiZq_Y4Q%`i<˺Fafؘ(!lCp y{m@IK'[/BY!aUeSJ]EZNeA\\N{L_M)2=CO}/__lf@?wuhw-c AS'3 j>:9p~ա6hwFsA.(q:9|me L͚8cł,Álwy{+L#jK"`y,(Ds(yRe\'8zX564z,gCF@\+6 ݞ^~IgA+Wr^nhhn^"Ԕ}~poGʭW! !xꇖ8 ӠkyH98LQ ۤ۶"Kü9$((xr9N6aUUBڧ+C1Mo[0uUՇ'j.=O[ǴјeU:Kv7Ea}=bgY!](7 @mEQL(%[M" AT @[87%8=L➳Zħi,- r4ӆYýzȼ/shDYޔmWTԛZb{ϋ#HdZ_4JS(]˪́ATjorr  ͐dE>DԠ^A0 C`$l{'-yyYAy#[y^#dN(z9Po)"Ҋj/N 3<zcL%^o ZǪ8 Ƅuj2xky$xv?Nn}8θ('*y֒-AeQ$BYz "WA0Rz {B+|I7)볷4&4(#r9qh~}}]^ Rk<-ӗ4q~$eYAf&|G~>5|?Ή>1h$1?k Ceg! 6, xo#j$oP7{Z .0'Z55Us1cΒk+nA@y1&ۜu;NNDX\)΂u&b ɠzZ䯓q.!iwW}8n)i*!^-WUR貓cAWn9I#A ^7hV8 Oӛ7b(ISc?Իhh 5Cv܍Cg)-[p; ̻$IGX6p7R[ a >(jNųSPlôrdwl \ )r몂#U)Q[mN=l=+j`@)V:V'5qhM<'阒CS1Vq]?OƆby>_?4Ib/ۃc@>ئfBj{X7[Tcܠ9`(B$BU9^g7KUio"6sf%ޞ)4ٽVO3h]T xX5\* ~Vpf<! P16)Mf//J18J#P?ÝSSZldIMh-fmwPŊ%ö{JT,)p 2 *h`b4,D686I1z58;󏲨-r9?`lI3 yA{iRТow+pdQb=n* I#21cP ģS â?+\TClT$4H2U%K]\_ޞ Apvm(`_BQY :@0g&ǮwN䅺1"&S }ݰ:yi"ۖ9N#0רD`^_[H ed: bX˼,B%dLB&gj2$*8KFW EatH#ݯlbWC6VO̚&0bIfy;nҖa贝[2@f&Mlyds"#~Vy!(Ǽ0x+NH1FP_"/iV <=||htZh5xnp+ pLyG!7 \Q83/4I #K#:tC`R "b)ٺq:XN7uZ|?G'j=( yVj:R,Hzū_+`L-R 'Ud+&4 ht==, ]{t#2w|đ]: >al\CpC6ov2n "S^ f;$q~=ovX(LiMmr1hrU 92G 8UVn^ ">o6<T8i= %nDtC /YWO Xhf<~l3%1vƚ[䏻;vHӘx2dבBdsF@okggLgibx 3 A AHJ7"w<緷?~i1<=f(@$䀛mb̊ )v|ˋ碩5~~3r"X춎;m@Rd:N@3\MKqleX |9p`ERbs>*pjdpʫ5QGf[4RX̼=ϊ繝{m~3&XjN|yBq1|}HdۻrC5l(!1!]"It{(x*d^zz"uqBYM|1\]P57^" `U;91櫩ϷsuTA414T( n+!i|ڢ=z3-޾|ũmBEd(r,BE #qK0U&oJi_}=0mد:Cɒe W˅?Si^FV?x͏tL~tfAɓcn:Lǟú;k,Oizl&D!$1iHʗ|>Ḧ"Ń(Hm G]Sַ1H0υXId#2:;Ӫ(H$*֑X? P A-[n ? vyG:kg8ltU.nkC4/utO[F n*밨pYwKnmu>BQ$ C'BZțUIw^ `-f _c|Q1a.o]Mof: Q4y*޳()KLS约Y'޼Mx7#$jmj~ёŶ+P}^])nX# T8 {s:C#N514 d\hR7Gn2DjaꎭQl'mXO!deEܷ'#@ me]8ӗ{6aZaU v_ ՜ K\UUԠ5,ȻD%ExP79oC"SZeSӂdP0K"mr T #Ij}_F"M8Q/|\'vr aAAQu A+Hs5겡sӶ/*"_?~0*5s)CQ\m/o,P͔-?0pcMr0Q* 750MAbrdS!9P Wpfn(2YI/+8H Q_lדg`nBb3M w_`a $a4Fj_R+Ҩ3L$!/x'l]s;ȗL kKT Xi{Dp,7ese`U[BK]Ryi H3e =<-6+EZ`;i2D~V,å6y>\O a4&S"F yn͂(Z]<2rՐS:z۶XJ@“w$A-Q,ATo?כ'>Q}Sj_\ ^p4 ίEd8{XZ8XIY+H6B eAn 3+83 5ko6$Yz>阨H)[0.3!&Աh-~_&tBW&|q˴㥥o,JW@U:œ7ejZs*2?fm-H5`BofF@=. Z',C,Mlp!wd[WuAab wR "P9t/|n92JO޺뗯NPHPO3L' CCzy 7QI!ܐ4syuŰrxi{|ޛVm >.(zi>>x$/MkVMSTH v&Y`Y;Qu wn5P-T;MuEͶ,sFQ'QO/Ƃ([h D3G3GG'j",UQ8QSĹ8ii4O'8Ny^&`rv޺I 6 DӦcnv0λL,ĸ̨F ANSlq,ʄ"14{L_&髴t;W{:Otw[Yn^-}l|.@4?$jM4YQ5UˬDx8(R?PUMWYY&ɧ7il>K%`{,~z1=0"h0-8Xm|  Pe U$nkgB]4Φ ZS-G4lF?{e$FX86涩( k۲,ْ-Ka`L7 ahKZhƉ7Y]#ssג@p5y6xP~j,}u]QDMA=%-Ӟ =Y9jY3f)B Ȑtp W4,؆1A`0́1hQ BQ Ə|nu C$..v Om( Й6D<̒n>~y[ט$e !Ƴ)(yv .?aLOq'6+R͢+{!Z_^4y1Cq*iT4QSeQ4E9&fࣰKHؚU2y\p>8SU-8%ESNoڻ 8g3ꂵ]_,»͵_@DzH$$ap]R2jh8:#Rܰ c؇%Ip|Y'Yy;fz g[5MisG B&6No(rʊ׆&D)|TYPVKPt/fr|W??>Ў$).޿]U)`i:EdtWVy3kiw->Te.āQb^h(C2 YP (Mn0zrwjo!$-wBLvo|zv]Gh|y)>BDIh!Xm&#7+v4Rv%`r/yws{Cԋ٩JIwDU< E{X{R(B#BAW/i AWdimXFYs|V2fa@eMl'?|.tsuAEasO:\~htbD.ʒ,1T\:yH"/CkHzVToX˲]<-=kVdʑ5 :RY_Wˊ7)$ | mT\7>}fka۬'^ nu*]2#mҒa#%i*",&oZ #)c0c$Ω -÷:FGj)<dl2!(FcyH*LR>B|^_+0͋ba!,*]fuwUAh/g۶a*%ٱ-˶$ \u{롧,n hIRKox<~i8?NuQQ4&J,^dE'IjGe(6K{g=]ʨ F0 LV_W8 #<&`g=ҩD8V"6h|8tfgx{TE`PpnKz2|͗sG'V~vn+Y&IPy*!9 XxMIU<;Y=eWO,@!BMf{+\=V<*or,K ]EiAX HΏنC[@IkOC Յ(o-1If6I|zV/ao^Γl4mJHwOo'7Q+B]Jw?rc,v Mn͗Qi!GGƉsUZAXaH)+4Cϋ"/_lpѓzUS.yY;ۓ}š2k') & x~C"4X!YmK|$'"Z;eA*M4g)AHlM]9 } e >iD4t1ul *`fO`x AEK|(R5\/"b8[a4v75i3#2 |nP u#* hl:/a׊4/Aex~t`v8α:.sMۊ !I$}&Mç}4.]QI6~_;9s~?ދ G$'j%RhYТ0(g$g&d1<9PaY6ZYDiv4V#y -'i/E( |]4ͳ QH ̂iUG;?(Maz%!gQ xɚ'w]0hp _q~z[ O&?j4v@b9`]TaI x:gΓIx<2Y'^Aɀ8l*YK+jd~ypnOnhkH8EJ:VI,W'x\քtĒ)U"d#Y=0كͿΟȜ 5myVZttb~3":"#}Ҝ2u2%Av% u0|zѐ5h *U|\o>)b5&N*mjӻB_k )5!!iB+td R8ٕuV[euM^2!XNS4'BEBTeoa;+"";#=gyz04^m /.M1XY5jl&6Pٱj`8 W0Z @k״ E ];v23:xb;KL]#ͣMMPѻ|Z@iH5)̂b B(JbzkyJb(wkyxl `gQc@R풱# a3BA&jAO)4Ue $ +%/Z1ced188ݦ( {;q$P " 4 6dw6;wNxl9UM FʼgyLI,< F8BggOhj^xNC.ㄠt۹/Oxzy [մ>.sIlАQHӨ J=A({HxWt.Z/83kQU?]}` [{^-l֒_*px{D!emfYˋ~: Tф/wmwi"<1x: H_A"F`5}C:"`qЃ+~9fY:KR\-=^腯b ^Y2Vr1氒Xi'Q7M4MEPuܫioWw:\&8 Wx3{{2 {kgY.r,+2-2*8∉Șd.nSo_^x|x=xw!~`#(plA+n՚G=*e5N/?Lnhg 2~v+`| G, HDxU,{ nN7ڡ)v*+x؇ m]Zj6یeFsme_GN%inhwvm((.b n=m82d/0{p U8"-Jl͖1jjFͯe͜UhZS{^{Hr@$@ψ$!9UGz"O N -h|C3`gYM"I0K?82L ȣ&YPFhb$:wK~0)jm $FOLɝRT+͝ o^$Y&IsB`^5/rY47GgO;j>M 0h(YHg ,jrL EBx>}js<(Xӷz +nV 㔡<!zJ+vh*h>=?>?X9 `\>=iU`H w*P-U$NEKzjpEFj;vn6 +s钒P }ojs>tpJO t@\*;{)˗"c9d0{EG_p[luMT< ,v4efRңF7{uUeb& |#" £MPGO) *Nq6X$n[{QE%1(~ na.+qIhZ',4xT`tu"QF8aB.ggϏ/++G6'ko8}r'㓮<:ɠM`Җ5u$F@! Su&ڽMR(ZNYkcx6T,HyiDz!IVy!0? j =Sihnҹxz)?:=]= B :uRͺC|ѫ&iLc7&ʄi(m8Nݾut-0@H;P[= }-tn^=ԿaҧtxWMӠ#t7M3ʼJ"- 3oLJ4_~f&-S'H {*B?Z z[lOB7.̰ 5uYn[f )Bzj6jL}5NûPYq^)C$H' GQIF$+G+^X35*AwXEe,ۑY.wI]y>K {n^~`.rҠwl|v{yP+k8GһΓDyiGi{RFyaOC~ (F=735YutxϒԽ+ck<@`"k-W^PuefP+I# MeM;i<_+ g?{vv쐄"!U7HUB"і qoc=/ Gy5C<k8 ?'*\B@:A5 WK ,7?QUId?@d-7m|W"tJdsE}}b1t֙{19:9-"uɩ<+NY"5,9\lȔ)*,t,l|/W gPdǖuqTLσ#_NNJ,cxfy[eap.pb!PX]D,i"'2բ$=iwoS [*Uͫ<X+݂(g"$b1޲ېN.?w{_)CBHՆ,OgʜPYA1M"L#d=^i_Y~v9"B`r`b"eEMvŷ+SF_@kʛRa"XEkiUJW7إʚ=fWɌe6%j&_=t;{Ɍ+--4uMXi=5Lp|׳& xt.L_$8 Æm GWbXL{KӡCqu8Q*!e*wm-8m"B[O0uw%eU%XDI,eX@92+c0(/ e4_p$j) 2H#i9{ܮL?z5 ê+iMus{}}۳:0?g4 HYq=C5ƞ \UiP@ TF5ՆocXaV1) " o/%/LE^bUnK8MNc/ ᖾieΉE3o疩T^})*N[Ki |'Gg۶DKrEQVj-AiZh%hpS@ER7ؑ]'Hq'/a~31?RWp$pE#ԫi[*<]ot M-6p{ٟBT~͙0gTu.AMs62Im"Tp%\!$D*]{ezjȢ00AS$i P\Y"SVoZ|yku4YI3DX3BZ2NW/jfk;kNxlj=99>Ẹ́/B!9:4*h=9x$---E^fKTufY]_wVB"W*B_Ӷ;= ucjPϋ,fw 9=ւ[ڵJ|GVrnZt4Q,zgg=]zxh6MB& 35t]77&'~68$DQiIDm hM cvX$x/<: D.g7`g:,uČ 6 'X xk=^ yKdo_mk񓁪]]_{d4se]TW2g^]]tZ]s@&;QjrF ?<&W8VqN}݂)' FQ{ۀv2$M*\~ZWT 0McZm\5ʳ j bor`Qu%ѱLMjl $Eݮ JS$OEQ* ޷.;34:Z*" I'$(^J[[^{"9xWa.H+?~{8hU9+{0EY,^>}DVw[IjMƳ/Xsd͊.6A2_ݵ@ ZDDmIGӉCݢVb+#6MhogS;JL0x+9')qB|NAa``_m`z$${C\2 No~0=u~ǮRWK?|KXy19nܫ7kb[H؜v%rYQY;#028z 9pt!λ3U2>lEA" ]EPO@?{ӏYuZw62{q5Aӏê 1j^}Hxp5?\@@c:8'wToG(diy*VRAʑ_ 7c:)h#7ޚzb7':GS4;޹qA=^7`*Z'8(ǽ^_ )&f'Y 0D 6S~ዛ EYUF~` '.3:Ii(]*JX>ф,˜N%#OVO=UTUeA`E %hY`@n R扻 }DKBR)5EDggEN,ÔeFU".T;l 6xxi$gw7qUDa]O# }ў`r6A鰣QFSu%lF ̖6(:WXp'ER%y!/T~K*Jd.Y $.p# } iq8 `YݮWG):7TEjqp 6fw`E&4Ԋ9.CWF$r\(,/.ܸiA=c%b؝ٯwA0)|?C>Eqkvv'H J<'ja/KWcLg$(Zjw&aiJI9ӐHcrmx@~9%T`JFbt<MK!88HNv몦Jчz;%v&SJƫUoHGROo'QbGa#߿x)ĭhڀ+ j0'RSJJ4kow\r[ e4=:`P%VUT'ynhiVc2k$ 8vWOA^UP\+v"d^=y.Fn}%4ᅒDD&r"@ ȵPɡUWr<ۻXܞ7?n_:kmFfS u4iߔt*(pVF$A5V%E^y:kחM5 kEE+^Wi #̘A!$A I C1u6e k9vNRVEVOƈțZ/ڵi-ߟ?&1;:/ S9Tbi:4o`<2A֪fAWjKAw lxN c秿t%\ ZzNM}1E Vrg8F|~A9W/ĢW.{=?ϗUNo=Z)imoǎ}#r]dz^L A 33Whظ7B?7FDkۯ./e>63Npx)1){pq4Γy7Je}@r 7s@ӫJZ8`<;T v@Q9% H̐1<ҽ BɷE<AsE1zd9|Y6 p]Ǟ ѷAn`g|UeQOArO4rʱaX/vaxTS;mr>ϱH }r9x뵕$@z n6_z1T'p$Y=Yq[(F$Dv60JrIQŒNH!}jMP$i-ؖ-Uܗt'P;"-{,tI)# |RP!w$AUohw2$Eò"APYzYt˥1DW[ Y͓Ax(UźMIܬ4$Y>ޠC"X5{!߿a1Zkss4$x:=:vLùio:p4d(ZOMg3p_<Q`yy`Mnua,/o>.OK#jdp? eTE7:֠/gN&Q -Ln5;~53n_Kr̀d@el ߖ5Q;gA\U )'QKga[0e]A}Bʉ$Є98V j8-EF1V ]wR*Тe et\30xf 2rLQ% wm*,yMak~ӫ[h-8JQĐ-u+@UQ<MIv{:QũQVb5~6 {.xϻۇ2-Xo,ӭY!V(اA=w#CӡJBeq.$QMtt0,Z)D2t=Rv\4 dU" Ci-FO4x&Rx傦k9: PuNW$y3Qw@"jUJ_ڜPś7ygɘjȚJ~" J#IOxȻ^]:)MIcyGm&eBw[[#\Ċٴ]ڈf<0u+p[NzMzc{aB(Aۂկ>'Mywyqa'{0O# v Qu^WI,_J<|}Zɚ(6(,QPV''4ص^:k E>  l dXOHJPs^WEVaG>\|E"CG~HCUG5cڛLFOBrkdPFk p⊺qZ2ZDsZ2e=_&,|Ii ,` dK̲ HMrfjGps{3__y% 6ȗ* ^rb? "`e]ϯ?<֨4I׏0AYWY++GEaնY5# ȏdne-"!)̫ ̽|̥c{h3QgIr$P-|,Fɖ~wf M*#LRƭ|Pd9uoo  c An6dƔ,ȳ.TN^%Jh I1$.m穪g N T'^}yDVǰ@<@$Aw$ӏӗi)ma ۰1[6\Frs 2 ,:"D`sǟEYd L001곧?_?{~h{$%t[T&Nv[4Oӑ;r~#(zJqp] Y3V}4e!ۣ>}]7>bhiVA$ ϣ/wV[qd?9@[yu.c؎CB))n?SZړ-Ί,(|hhl&IF,jOHY4-Ml;WlfO@onW; FK</) *hqA`ݬªX*zV'A@ZP94\Qe8I4$)F;VF5-TXk}CED Ԑ;t c*UX#9XYRګ7`ŅyiF^v0̴Ġ~M?8:߶ ^^"MIEuM[NҴ<>=SA,۲$ۺ)JKo|1v[? h@IwiшTU/7[o7/>PwCACbqz8_էE+HDx/lu $RQ  fqvGm1P"I0iEXEV ZCK e-ߔc'ijWnQG"͒z Drv(J%Cb|310eAipot_TMY`EkNX֕ZIT^N;ڇY>EMvt= , ٧'=B.s]p2CC2'"4p¼8C;Ɔ›΄קF*)b,g+{1iS5=209CSD/N^vh8~4.Ԋ@r JF01dN? -DD@f3S5s,cVgS$ם73Iĩ}2-<&Lch(sl"9&k҉\\+6YKL!ϭ2/88Kb_!b B<ďo7<u䧢l(ȪZ1:㿡 ;;=J~Ȁa6NjPv xBN8m{o~#:P%-[;lianY8t].SD0lt"/ 6ز͵cw.s ׻m;/xYZr µv}96f+F(QzssȨϛ9{^YӀ:pO3ze:hD5(AScYn<7g<ͯN-c%{᜾5Ùf]=80)%}Һ GGV{x;0|"A(4mӋ] ?(* 'hw_SFh! RaYP 0`Q m? ,Z K|5f(a3LʤKL)IKbƯo̚/g7J&m0\T.`)Y;>`U*Uh'/~->O.瓩^ֻ;` ,rVHH3ূ,5}c=NZ/9YZS^}rE}ߐ_&%1u<_03BhV>qJȲ(+{yfViJ(> 4 |5zf$eD =;gLdl(%(L/TNQ1UǍ('h7x4,F$E_&%}5Hd4qDQj[/WmaI$,j~]Cv+g%8wpqPW c.<@Dd7+sZX ,AICHMYeF%rx LPe`[%| # K(z.臭Yy{>wQU% ("ouп%I7uBrOwNB}5ys""F?xa|1q\}o"o ”U/b#27`8T%񰾲 pO'ViY)O tUGo?i4*RD}]?!4}\jds蓗PJ4Vg_dLg'Փ9Qcj<-> ܬ3Nݪގ4a3 4 fo^)ѕw0lS+a @! 4@h[Gux2x3:_VUUsq0׉.xEjpE@k.r;l99׻UgeI!,ZJ^$hњ)!iQ9Ufj&hnXP y+9Rm&ۥVɤٌc x$,o,r:ܿVC v<)W+N?_EMAN夂x t}Tn CGsɬ #zI#U v2Ք&7Z]E0%RZnۈ0ʢ/,XdITǓȓL&O;'Iؾp8eQ{mёsv~5,0zUܭ^n(",BA;!ru0 w燣a i VrB΋L 0wܭnuqgg:\=6k\Oñu.-sz;ȍKo{nSJ $jͶ G^ l. `8 Yh7j]<0z~zwsgۇQ%%o9D<;"/R?8iI(282/ Jic-_ഇˢv@ x!kk __AMXu֖k<Ũ@6\=ƌLG /핷v],GHf_U\<;sf82a`l"zq*}nFhaJn<Ԭ)6A/GA\[&ci& c vOJET(`IDhg~a-o!$4AN uP>y|I˘% F*E5'7NC%LVu4,>^r}&˗/{F2iM|r L2n}NeSzFi'W6*0TLYm .!"~^6PtS[|\G%GsǺNDChL>9<̧s`[jDZ\03wAm OqaؔԜ*oW_2:Ǚ7FG](X?ǟJ/OGp@R$9<83T`8H8 d- ( U81nu< Q1};jo_{Í%䅵M (BYNě|!ɜn4@Eyzq2{wrXa눤JP%.& F(3?Bލ@ʠbZj)&ܯ1X: QJ{& 4be@/@5Lc 26=DX  )c"@- ew,JQ'|Q<{ЋTby"[vO))emGj8k08 >b}1 U,E֥ u0XoUPK ?[O.n/<ϊA(p4CPp5v`.V sc7,(=o7x.HOLIִ(/L~q2Az( |8)p}˴bٶlj !j]Gkg%Xl.iF qeKa(2/qT5 lSO.1&d[]h9JŢR1 fF5d\$Eo-( +$$DC&͠tY.?,I<}~6KxRjtuD:5QP"UZ{@4 hQZQ//t'R0XL>_k)/*UNQqNbm5[ʎt-H8#PQ*W~ʁJh:݆Fd,7ǏZrO^d/_qt8%YRfi *0$,8%jKw^!f''ŤQ_|/ bx5Y u_y7,j (n{}{g@V.Ȋ5XGi<iB8Upi nד(MbĐGqN³|!%jSc|p5{h%"EbkM`fRR+˥hm56.6Og(%`ꡫ=u88VgKNj:s˷>C4$0lL4b0@mY؞#/|%H|f軎Ayy2{$%:FtgXGc2a.3kN܈Z[kEBǓ<%JURyoNq*ˤR3`c0;hCZP. {wV0i X,H@P| :{=ub2 >>m#J^~s}q|,J}:g 8<zq*AT楤c7<#/Ԩ9oN8"I֝/C՚VwDQK3 gwee>ivN-÷oj_<wA*"\@ GBQpp byR|{N1RGf#څO#Zj|\,PiI_O$fL~2^e36-tTT3$K %J@NdV۹nۨd]UDpDJ"%viFg~5Qڑu8 *4FeY5R袂!`P` 'Ә*~K/G;Ki=>=ϗV`:F@%?d6n`JuA`oX!LH0*"FX ƒe7o/iX U?>WZŊ;*+Uޠe[}"ͷ(A 0K2@@avsl/W%3tvrU7 @ c(l_g×}^;]E6އaWW$C/(D߯N VyEXӢRFA k^?>-߾9]fRxGǟt;hCzsP Vvbb7X΍7k dAF{4|zY-==8-I7͋ e8թ:pGB&򹄀rW{8X+p}hD9V v?!KcL8M3m}pq&L2"+ aWUY0f(E"F%L ّ9<8٭7X֤t6cRYC% `}ֱZ-3> g)T^LKl>IJ!,x4A:%zӻ^],2 Bg⎟ ?G @F0s'745+)ɩѱ`$ale0JX]ӹo)-]00YwACQ Ȑtc=SLQxjYf~&_Oh~{}lvP=&<0Yqw|)6xE"hjlHyi2zK9mz?6k ئbeZK PD{6<M32,Ӓ;DM3R6EQ CTxg+*2)L4Ȑ( ;Ubmmq6&[Zꗫ}Q?mJMXh w*$ Yh/ uy;~yp(n`,y9_?]r*Ff9cu~z|km~)AХ9*v۝;q<e~ȊM__|s㯷:kK Yj5aEAou '6SEC@Jg$mYd,%@ #v(U@;)bZGךYM'UߌsH0w?<W~]txC*Jd:E[)7o~4U(G,cDG/ |7fdiSXQq#B}l`[Ė .'"+2-'a4qB UVu|MK[SP<η-C}~_ne18y[tzDdXZ{3:'.YpPl>7/tb@G Kgy0sEۊݱ k ]"GU Cg刴$Tl4=T2<4(xֱLbGqJS,EV=KTP>ƫTZ Q` /b#"E'ҽ@sӔ @y.ma7eO<~f׉[DuK QN ' 19w0O!3$o ~};,})FBS4b|7<e8 oP.]vV)}4Z=Hsz!{wjhjW{ VA88~fKM$g 9*iPN"I|P&@ sdfqOg AIݝc9>Gsyá+I 9!5eppBŐYVԖk~CqvSĊ'PŜWWK@i=;JbVԥ: :D˘9caA"rRj%F!/؜[;OӉ9ւYm5|#(RGbKm8h6N;OHt ~%9$Tnaz/%vH"X}I=?H %#?nJjlcZC/vmPDeyf|=s\΄ww7{VVIﴺh E@Й4VOo7lTӇN JOՑ(X @F?> CcCt6cRMw{/C'UeMmwNVШHYkg{$_ Pe}^ȡͷY8 ~/Hm -h p=ebOc{jMn&J`\Wc(hd'@T =EL,TB/G"PS%:_?fbj֢c̑mwy{[|w7e5Yzˇ8:6($KH’lV;itڇLiq;VkAH/z+O=f.?@zD])]B>5\;.fk=(9Ԅ>\&ɢ'rw06ޙ}1~LLy*|8~DTjݳE$ds0�#i<-ct{+ =l7[۲QlTcY~q+۶z//`uvXL@<s?q3"'T9E|ԆRtNg9ÍbL&t r6SpP'¶d5Kgq\JiscqWk&ac =,ɲT!*X+lbTr` }vFwwպ{QOpNh2wٶ m?$$ x*Ӡ SaZJ TCY^:~#h7?VKEE%M8 ?*p0ܵ2!IRH|Y/Mm`L)~?x {II9Js+'p< ^+|Gkl/N'4N ;5;u [:|ؘ[L8Qf,XH\>VHjq1rPFJ)V OtՑ!AAWI0WGWE{dC*Hu ǝι9uvmkUm4gIӦFcT&,BCo*jTZfۡa.WՖu{]^ei5[>g]MPlTk'IWU& >x׭v |y9n,v{r OeSY/@SX2<D$in7#Ȥ'YZs}!]E[ΰ$+9LPܒBt^N FĞ,Ek\eUG7#/oz!㸎е**ZjbBr\%+/^߾*joG-FґZd"[Q.&JӺ$QNj D>88bMY(274GA"KnkQhQRn!s%L d(蕓 ymEa{Ԣ-kqbiO h"$vlqI58!Ax{{!ľ _|1M>38a&4NB?ϳ[70(d3Cҩ(@̕vR6CfH M")R}LVGov[RT,Of h-h!Pr2G (BQo?~#@,w?K8Zr1 (f>2Ͳ6@'&q[@TwSq)'9%MQQ$C5MF?Ww0Z']eflG !`(KֱHW]׾*g %5u9DDM0ҞiNU&e7P-NDZa `^Qb K]\_ZYlpsDյ4yI_f&Nk/ƄI,Aba٪$5M"xhv/.!op-fQ]kh R` 4io-5og r>>2.OلJ&nzN$ (m=8FAjiV:w ǦtGݫF}f/˿}Kn_+)ghmo7_tbC4LuE V[7نaPvdq'^Jq8N%E As}ʚ~U1D&h$AZ*LIXuOѬZHHwEjDKp\Љ%poa[X:r="(@Ky4mOja :l!XYW %C{>XpgQv {J5*5؃#l9|9~-R+2/^lXY5FCL?꯺u!2Zr>(@h$\2pAWT[% S5Bҳұ~Xɏ2s(T4_^Ygy@sm!3@E؛\E^mD)5Jrc3ǵ}+(\MRw6<,[zJ*|ox,Szv?<:: dR kO;5,Pq{EoNqA pBN*$-Ac_^4(!`59XeIy˴na{(E^X@Iu1+sF`y[r^s&f\Ёq7B'FVjUQDؕg0GaP֞@ł(U2my໛ ZӺ6d!Pd >8nl7Lq3=rܓAk: -3T@aĂtͼ*^>ΐo{Gs^ٞKjz1x/۞S><<cc8ܨx{>/=*0- ȇ8̋b X +Zar ϊ ݤw>L=c8):ӫ˫ҧpĵ8Ea >8`Errt2vx~`keƶ\<}w˜T@O`fEL+.*k`M˪Hs(%WV!ȣ$Iɪ,BZAϛa #ޏ܅w_ ]bX$=Yf+w7KA Pma7'O^XEuC'Vg:9 ]OLv D؎w"R{uXAFcCI63+u`6t>DŽAOT亅"XIxѳɅZފX i=)b )su$u㝕XB(]\!;dv91i!Q.K )qo,|͍߶RH34!%~wWV0$g9srqDt ;b;{7ͯgO7vWEN±cK4,7 gO{P,Z5_XE] }K>!0h$J%#p$AΞ@E{II=Og9 =uad$]'H,i#*wZk^>diD([ (8y^MSWe_N: ⅳkW ~z%wgQe]yY?wٗͶ?95&SEBr#KQLhN~~x1{&qq %!.4tN:L{0(D :UìMroq$/N1zE%UVg&8"Y0N%5_~3V,)v;&o:jQSG "**wOxR@սx'a۴Fib]Eu2awP)'e^YT )4LvϫOc\Ƞ,ɲ *0ATQ7GEXuHc"Q$pʴ;:npt%mAtVξe-m9r  _%$Ȃ؎ؔ,)IHCξϤ\Wnyt1inFF9 ^Ls~_;ꖛFGlpΠ D[{NYq( M*f͸, :Ki&렀j"/(yOҘ"'dm0Kha? ӫ)aZ%hM/b/MRq +a"?U%P[iˬ4[U;LT$JX+2aӒ=A@Ϛ+oX,DTL"S[*`h4ַZD % -ua8MH OTLZGC<"/giZVDܛAppx|&=p77TIU͙H( |q1vz6^3uڐ;oI7"H" c'Y<_~|vd|"k<:UM3l>_D-bij>4ĥz͑-?zG6 IjgO6;МlQ +wRb[X3ԪՅjAjc5w+r48k :>RyY-UUt7_w+o/ihQI Aq^%I'2bz}w̠ ;oϠ?<8.bt3Tcsjj#tQVA h (DiA馡j]GNxmUS5%HK-qu5h;9JQ*%Pu/XI^rbk8.HT AtX1YN^7f<Hȏ([䅌_~4)4MZ,OFql{wfy^:2^M7‹$cEп+nǓO>v #a+%>z~m+HolbDLE9ѦJEma;PK-{R?Xٹm&j"iZa 56.>Y7\lKh > ҈.=aoSʤAt*('R竻[z!T_%ɠt0(^CV*񜝷 _P%AG?~8c t}wZՁŷ΃mx>EqUYZt;ݎkdjِ2V,Iu#'eQwDAъAY; ѹmaccQ&ԭIkLkQ&mp166y|{絏og4i ժ,XhmMAbҶi5:5T#/ۧO^BT|Ci85KV44#*EG}8sI%A+.~xLgV EI^T׊hb^ǙȳI,bJjn?OtYy1SeU?y]SGخ~vkJ(=.t:uI^1J%MGc^;#6e,e^,X*xA}^-P93Vz"(k@M ђy&}0u  [?3n!PS <ٓ mm7'Sy1,∄U_` tmuzGU2rGu>Y.x?Z\T(A虶JA'Eg֝Eab6v4Kӻؕ&M&&c $4{u['4 ÷`V$%#J`Q ђ[g|jD$"oYlͬZtN ˊ2EXThQtw#W HX[M f)Zi9Q&b]h[)]@iv],JTNq: ̙#Nuqo~Jb>K0,`|(n~l9M!euUuyojFqԪ5WT%RN'tG2kIUx-IvT!'kʫ 'd䞢()f氕R(\Q~zqыOyc@zpL1Tg8UǷaI@qq%)Gs;o EE_;KBʀɭF`ZUQ7]Q-aY-YRcϴI$ d:O0_q<xe{C ݠsU 8Esb?%IM ooگɻ:ӂ&x P5\v:}Q᭶揷{+sWCO|fjK klK% ~q*Y;f =7ޣ%Be:ejs /es$4h|JԚSH5R$ضnóLehv}R(1dy>-Π[J54E#.Sܢ$Ed>i)%[Aps.c^={nX+ 4G%Ylv[fSi4Uz\/o7*l lAi+u7M?|vCi%a<e2.Nc"'r<)&mȄnޚX_oOo^7?g$S@;^gz7-B*=5Z-Tmu##H Dp YnD Kd~Ѭ6'Ȱ$G1 ƦjݙΚQYŸ7}qp },'xZuy:$V)jJ$%"˃a ъGA VgyXɦm.3/I9KͶi{gOdn4{nFKIRn׀Q"w-N0?\^'YBpt^]j[QVu @`O}aZ~Gd{1cr;A11} k16ѻim Os_ikmJP4>7bH`m`/~zQ'_$WA,ͳ,n6eh6\.>{ l8A\$W-dY -NWe` TLDh[4r'o82yj>$aџj²\Mc率VZH "O*C,*uYFK?*5 Q.=';m4pZ<%z0Ki:A^fۧЕ6}2LBdK.YqB䗇/2)x(1C%Mfmv̵{EPex0bꊁb8ZlAZ~yK (,cB J) EP1,߇ҵ}I:ǒ RFelg7Yz5o5lo6D2:nSW(!E%cYC~{ywQkjp7zm7HlL4SDѬ5}C0$vӴ@ E[d bCp] \#q ( K3IM!5vc{Fk"Y(i5ZQ-wԑiUdpޫ/_s$h:jcu`棟"M^w3N4TvjL4/ cgIDo_~kq} /8 y?;r?HL#np٪ v8P-pDS8mM&42Z IQ.z>HJD1H< s-Hݩ]&}Y {޼~ ᇏ*`^]9p7FdAqgkCeG+LهCC+bRj(5&@p|o7 JϬ,\`@}4XA&?Z8II(j\aD0DZi$LtW˹hWo~IU< apj&q 7 &'Ej{>b8dcV6,/0,Ig[IAmA:VGC3 @6YgT6c 4IϬ짹0Fhowџph< P˨X(jMP{۶8,YuXoDZùֵ  XubŐvkvķ,˒luA^>@$=gRbt0"JjQj~|vΗ`*rjÝZYMЎ쐉\=>")> owo6dO8 :Ñ잾3.79^4]~L|竫!zR|C̴$gװ禠 l` 5\6&3)CJ$G %f1';G;0H) (,}W8Zuƥ~*]Y:@̷`ɎQv gV T{!*ȼGHH8!yAK"|lܒ@s|dW؋UQctLٝu#LEnۜJ $V qavK}dڸ4֣,Uج5Y8s.4ָYHF\`v3~lnt7̖2p2 bs _7HϤR}?!9 oI\T9(qȗ?{xuiWLG:5I5Ҭrp! bNb ˘N) xwsk z淼պ*ܖ(i =(x]x|5:G&Є@ꬲ߃w4nK#4xQx5~W9e)!ږZf`~vbU]-`z S= $V8YBL^4$UZrH;n(;/0iI){{\^斵PYGFJҷ q=>Xo1T|X$cRl?1{Kk|ҼEDXGgaCט>Rch1mc[wOݹ׻9]iꜴnynN^Q>p0G{G{G*)VR@~K^OzzGi~ĝ|`Xۻ^C)TAXvއIk] ="0RIdHyI 6@](6Z Gҏ ,8H0qV9 D$a}=9"*4O#JHqHK|T7i?%2tƆ+ڷ}GP5yA.h~8_f!Y/GM'sij|::X JQ[aVeQ?1q"&VKCѽag1SP;uԸ{8lYiML tY IoV9σDMY-7i4Na"")jIʖ-ْ5PHĹWqE]\XyzӮ:(W4A뺆Zu\Qlb=GʷGCVE]\YˠI axEgRvD\,,r/v_~Y`{7G!'%A.(14Y{Av+ Q:,KQr]oyi,Έ!8' F~G!hyk ;* TD?ҿ4:ݶvXˠ|q)?~US^OΖcp-bc`@MpjK ڜ=̋0%C8 /C';6xF\mʜ$ l>ESǧ(HJ~ MueYbY+{pFaچ#g'_"99)dT˂ 6O,E\9#!TY.j w{:|5&= ٛvFf"/X0AX')Y%V lxN`p&d~;>*^D(vp=Q\gG2CjMqzI\P:M6#,MgE|qq1uad(f`-YĬH]I\8QtbO$q'p a8_<VD8eN[GJCe(LKS i"h104Rstgy<ó'ߠE͘F(44IL Xed~.W$5溰fr= |7~%v䑤(7^$n]lJ"osͣse{ċ-o?LVUktIY[RddF rZ;zٿlV!*wy;׷x||-JIiflB@8lt1,yvhl1l4XhBe]Ԯ2$cab8qrAnoFkM t)+]Y6= !78+sk!rs,RkFTՄIq4lR k0?\:SdiQE^٫w/k m_%&^eaF<,rYVS" 3(b!5Ws͑5N~u'=fiŐ$u$.+̞60.IHHba^v.0\<}i֪&D`hQJ- Zg%qx8[DfuZCyqx:fIfKYК3f"Iy<1a "IqiqJKi+UmWu ^=}!?F,!@x3{u_ f,!ı@*cI7uP+B;ln#xr nG8>7n 3P*"@Te9~ݒT)#7@U \/Gv9OyLY0tP5:⾯>>dZmDU>>(BAT0.M4'K%f38o5S52泉|aȺ͝H$S@j;z| ު4Y]o76&qQe-Ù;q^pO,NH]ٞ[NPhp^&_\k:y+9F3٣G?;6j*aȋ, :Ep*W̛)W MIB@%FcF0-rBQq Q1? CEsAdOFn^'I0&utŲY Zfd0ߞV4UPr}o},k4Dq *ųVQ9oÇog"$ G^ u#[fd /1iYUHYVXPWY.meDo͓cG"2#?>8>  L љiac>6W+5j~irH(xO/k`/ }~bxv';%^lI@hZ|KiY-*P[`~()!Z9T('Olp$';>x)|w4Jh$2$\`Fc 2J|=ax0kh]oUs3"Jq"Yʣ؜M臯^^γ6y-gUw>mb'b[n$gC9T1A2@9 {K.7!zپn U-e57_ɸH6c~lջ>>g>!؃]Vrw&ЧH@VӧK[+\twC)HUY0Y!I5 b4KoPYw@8v8@B5qCӰ4ҫͥp-|\.J4~7)j+Z`qn͖4P"/ uJpq8tlGe%Ѷ\_QS˞ı .1)Oss> z w<Fp\ ?,Փ.KqVՋ{2)qHQoHRdq ef@` yXX8mdS6yjwW)@eZ'xAy$k<%ry -~p f ǭ?ԺRƆ!I.Zd55N\鍆̄pXwy?`zoL}2 ewCa CR`eY'?<Ӂݻ<Zɗ @1(C={,8f\lo1@@ ?\_np>ձa0\~\gȡʒ 6US!@y\/GgݦEa1#ɚ"Q<$iGۇHҴvl+l! =go.|ߞY&@$ݽگ)vO?ܯhhR=hެlpMxWɢzLB4Tm(v!,}@n }6PlDIq(,KB5UG?\F,1 Oi $RpUg h z&XH6 R"_ W˹yX^ҤpP8SC֣Kvp|2 'ߟ~ʓJWW[fkqb%jYV'GGM-܍O~??>$r"Ʋ6j(1)ٞd2lV%XiMڥG 뵺HAc[c^ }i-aJ [jxR`H|:LnEίva.Z.ϓp1~ߝCYIqHs; ) wcO+\~9̢? .RRda j<#eJm(t_^kr jzfMJzA:vo;vwqR?% rl)ЮO8J2j&+^G[_jih4'iTd&ݬ 0)޵硘lY(X?_)vn;byNHQprU7!J /x=u>=NuGqfeFm@Q \J=%O[z sT*+$0jѳzu۳S7b'з3W>3ٞ21n͵dT8Ncwg@NNOni&>A O0HcG*I)dES,ׯOANAH~2 _op|b1Mzpgs;{ڸίi}YIK1q^+r(* γaAXTYES,"~Y/7% ؎ǧۛbny>\-Id |ȣrQlFjSU)l5Zpl*IŊZyp^\BCN2}dvة%,f¬VY?#䀐)s ߒebt!!P!Tv]|HڮoZ- ET?kMEޒ5[ʿ}NRA'ੌ@C,/`. 3~I Laª)f ž0KJEuy0I+ϳ|a (>=?m8alccvW yW{v44 #_Τm#$nd[JUr)9嗧r#9rqѶ,}!`4;P Nnӗ|  %mSCE Hk/ t9陦YTvYmfDCV9.iXNi8Gއ]ś)%2bPx݃܎?q' w?L1;N~:Q"GtĔz~B֋Q^ESLBjY19ՁHkϋ^xK>SR4@ @Id>c7rF/qOw^),yT*[Ͳ&8%j,ӈֶ?^Ws?+:8}z~ 2D˳[C'kN.5D%ߤh4e%N#a-h.]H|r|a*Zt_to! c,!'N 4 &1 Yv>;w3Ԟ5"/W3ܬLҗTa3%%5ɀZ:4@(R8̣Ctx^-(H=S 7ۍ)|{s{sf=F~m=iDpN.zNXL [POgj ͐U+sOyQ}Jhw`Txjf"B$P8Ea6O @:l8F]eUEYֈ ʒ BIEYXMUyYgil2f X暦@nv(IL~Wߋ~C.\&sHQ "\.m=/#"&~YK2&YnS))Z1Jkt:ȗ- $]]kWf#4/GWɛe\A*s9^(Ŧ$d< ?/{Cx_ڿ8r2?YF.x*vwgcCh7&]3⠨ CعI5?HFw97=\Y--4Ԧ=`ȉBĘ >}x9w蝹*)>mnϛnnF$"'( ]E"̅ε{y?*4lv3<޷, :^U A tJ 1Bx,6ZD ei%ITj{3}XJ:~y*^0"V`צիD"SSu'6?/%TAGm n,  * 4TXJ0y(&,u>DʤajZKG7?~DIaEbN!Rk8cRqL&yZTbNOR.oWh. 2;im% 2I8$^b/*n7{-EQPmvvtc&LH*6rG#pSoYEiS;q0lwdVN!R$$H (,23T&b#egYDeE/$*_x NI0jj{z6]![I,a^֨dz<}8.Ru^_//iC"&fSW[Agg㯗JM1/C2%M2[OaQTo?FVe ȴ@$@ @2's ~@J EAB fY@ntƎo/V} 6(M?8:߶0ێ/%/IӤH0 4oHlb[i5,m綹N8N|=6'{9/=4rL''UMe-b8š9X߾u R$X,&֫ t ~ A!b!HgvD uu\\ns8˿*ilIΐl$]J㓰_TFkGW*bm32fls ŝ^QIWlG>!&S蔊rCԪJ8o4 3a;1΄3'I#~7s[(!2H])\F J8s;Y A1XE@'3g+fOK*i&;6PaeJR ^ֵKR3yƌ{w fφK+ֹPzv VsM X]m3O?Ms{v26,Lsmjymu91:v6Ok~85=ֱgZf9z  %"4L%\'2}H2O~Vλ__;oaG?*"xL0ץC)S}wYһ<:H-8>8jkJ,bUH9 w9=7[-F+qBF$䉄D\h-lmp<`}/hO[8{.|T5" Ǝc-P)}W>V"}C+$,,XL)nCp>/|7$K?IbtN? dS"٬CJ QJZOil_5Dt7Z<>ZlB YDn^yhΉRUNVF˒q2s^#׶=A8 iKXյٍpt7*_\+#fh{wH82X[ QRA?Dp{'+5:bMhTZ8$\EߩA<"'6ÐY+b N 48S ~Npd,T4oo8uShDAv"W,K#L>ya'laB@:VW/Fg_\wi- 0岷VR]ivSJ|;Ҕ#8~{fڳ#GV6R໛h:*BՋIŶ72voNsdH:bw60Λ)%Q$v EhH9lDZ!!Ҽu.;vg-y @ʚ餎O޾{zGnm#jDY:C ;ESe7I(1i.6,%h2'uο%Q8UYZĺcy7MSfg$;79HBG,GSU0u+$CVu%pAaTfI6=FzWY9]Z!X3X&%Q@LC`qo͢k&nƵ$BCVʑ; w{0>M5=n׋+J Do[TGA%|Lq |yM>  qnZE'U$)WF >nwysNTcor F;ӹsRKcT>Kwfhi9jX֍(AX׽/87HCIv4#}8:d+Pzu^nAgx!u vz6"r_<Ez|>KKZ{>ѴW?Ѣ8Y XU+"FrM)*O{ωl l0 ILJta-*8LP5"u]a귒ĺ>L_+Piozn8NGUot"ӹnz1>u,KSJ:Z(W۵?(Ͱ=Ѭ@B8;*G‰V\K'=@Ur#@_;/4.ܽdz(Zg!JjǔGL 2EV<45$E /g}u(2&K"$Zw#q .verYRÿX½ Ŝk[kv˴↌lLM=u#9^˅:qy~|aLtm XUN6e^ @ )n4a t$Zʣڵ6]. #5Xv^UeE5'\ۏ7pkSҲRDݢ21 E!+zlV%GϏ_tk9ͮ`&]44v]HMurB֠HgQ3R8enc2۶ME8n8G)|/YQ4~'4Ɛ4cg%V>S bUptmA7cy_dɲ$v-EQҿAѴFjNV,QK.m?,ݙy-fgo4GOy@2Ó"K7u?q-o,H@T[&ySšz]5lvQҪ`[F[.Y5qj[w2TޔWeXzZC{Bȴ8 aH%?|# [x@<Q\n` ;܋5Φ(VEK*?8{g6$4R I%na*EUl6$õ*0E\RyL (hb8A2@TNk]Nab>TOmV BQf8-v˗FK2>Tt PH3&^A OWMUuV5 a-?^O4oDy#<n=d$4 qܲHv\"$9}!dw yswUml)O؞Oh*C4cQ{~[U9#~e_>rnCS^#N#0x,,2gܒ-ђ$ :5^~g(=C_x}?uvC÷d8Vv<hUbT/*{[0\ƞU~)3 tb#^BAlY4PqM߅tm`(#M>eU̗vIKtq7w6/#Z8!oq,N($H4=㊮,j'[3Ycm#¹ZfBɂLQ{W0h*CX0ˋF#o>yLk@‰ox/?Tt~v!ѓ揇FQZؖi #z* <>?Bl;XQZ&zgPt5O3h;QU@RA4- Uà_QCBS vY r8Wf]f398zsx|L_Wpq%C]0N͂2.Sd#jNPxQo}kVWuվ)ZrӢkU [Zus&kZTASD[HU89>dy9#}ϧ/F{A$/޽;?yD3'W2#jaèͲlͳ'-ª #/I5CULMoąMY$g A-NJAδZH'0tJeӹ5BfA`T73Qۊ¸,D6ԪRm_EڧQldf ̆ xqlֽ~%bdGHÖM\YQf=Yde#9W@!@8\ H[h)96%-}<ۂ.B: `xR4_+r>=kPuvmM$ yniϱ ]F7x2}U*ZؼYQ3) -I`Iۈ> 4) NfUj1(4M"es}V'׋{PyrX`&B(!Jif#fxķr;! Ԍ*,RpLGt<#Lf YNMO/ۭTT9Zsp{7aj0C}gӱ\CtqP Y?`! X>IX+Y+Q=:~܇_jVdz;<";/ CRV"%wb4mw썱Yf_Qkn"HkHqi.0vu+"%a=qb^r>ag>okӳ̡?)ɻW:+EXkk؏]n ~1oFw?u$l?ӌH ^ƣsj5l}u68Z~x"rP8qɣ @ y9Qmvx6QVeGmKsF%Ih>"#VV dOY lQ8ܮūj #tC\35R 67$9\[krGߞ ^H=| $vr`i$WvYfxuh4Y>E8r zĎal7ѿZN>uo٨$lVj$K%^&rn4Ֆ+++e 8 &;DWQgeQ żRX7I6w:}S"#8?^ Ti8SE$bE晥|xuunV{& ΡfhPlv`"mPVzs'5a.Q@JI&Ƙ~u?b]M|i{=7$LJ_UhJ+ȧp8c5*2ū$MA{c*ֵeLnY tX*zmYx#RZ iz}>|=:*\1۩wZ\GɕlexoƙK$XbijƨW8h狵޸ZЉSDIJdҍd:ْrNC:EPRP hL;VwKyg?N73cK{{w{B+ gtOw'#ɗLp]IQH=ۜ4~q}%|:,T{o/ {~xxP!J3/,D`ցoLɑ1SLoTI˟ke\Y%>談?\+Dc$:l2ߜ'5aon2;P^qul(>,pܶPDrlp]vxoy%LufvVFKeA"^/lݚ|rݣG6f ~l^iV흖MORyoB[_U5헗?O.bVĶy\jnz. rb9_Ý|g|9$;0M+3m-9TJZ+VMKc,,3_nTL R7Ҏjr"IQ>_}=BvzM*jjw$$ ȤKHQP;=; zf[7 9jl|8n)LT Vrj`&׺lٔ ^B+A:.i"/YiҾ-+׋,Yо$I6:M'QXΟ-l!ur&I0]S(;v8KN{NI=zXfi=l ,]f)2ڭk~r2uȔ+*Hz%霙9Yi.d\\FLj:R WlBL=>i#(ml󅩫Q֏R|nUQr0:6>髽ޅsQ5*態(}Ly5(( Q s:۪m 2Ű\v; eqoC?(۞}Nle`VKh gq$Y0IL Zĝ#<10& 0_aZA`); TALd%'IƻitOϿ~VK1\⹫N,N:GC7[SU.0Z7p}w0;:a Y:w}z~L}w{7v؏rFXARSǵ׫U,],0T], ۙx HYA3,0 Ӌ:ISg%#2ZӠKJnDP,!YEªp.,˭6 MR۵S,U R/\"fhf{cAqY*Z-]  +s . Ed.ɔ%XA 9L+!^ ZP Ay N 4`8_v<Ƶ.Ib &xjHaY9s`P~0XmJĪkFqIdXu ăx4`/upv焆tiZYttۺ:ת&\iqÁ1J"Ր̺ɛ?۞x?(:%50 / n3mҴN[v&δ&I3~ "*}fޗ; ^{ߟi[j*/ X ?@12Ij~0&NNWDUpzR-T×+A(;n %n霞?=<\ïo*ף0x-@{g qnH% 5OwVWЏY ='(_w/2Sig8SեBqXD̬G~c*MS0M-L'@ɀV+UH{VN}s8KYj2uFac1<=|ndEV5Yc0~u??OVR*fɂ WӚiB6Lsjײ00ṔdeJ[yKj2kϲ1Lԛ4CP]BɞF+΂eT ..il2f4[ ^?my&.8W<9̀sU)S2!I[EZ0xj,܏E}yʓQDǩ^7o۶OLsמO3+_{cTZp(Y*j-BE}եQKGjMl芢AP٢]3, T <nIg Q"`tb Vl[Ѩyy픠oQY yh:.?:yKH &>N{OƀP !,Pi}hNPF4O\#PҒM\Ed^}M,^݌~KmuS>X8ek&?^K5dY!zYu 9Ejuv{Jv= CTNn=dQ%lMy IyjhVwE4׫'ϢOKb8N֩EǓn- "G[@+,\RA$4@! <:|]oTZJ \N@|fZIKhM,ۥp%5c +#6Nm>¡]fzz*]ɀދӨ_-$FF:ܖ(—˥_&Ȑ(O0tܴ [Y;1 BaLZ\|(S(B)u'ȟ#) EZ 5^ : (ZbyD&Tk;%R%j,u#+ R,az Tjzb61MO unCh)hpwRy\`+.^_㫉g7xp4A؝ϬunVw}l+-vM/^pe7͹7ݕ?=2|T<|-f "4;ZZY#fc˺R\&ƞ;8f=l`P4mV`1z b`8Aַ9L4Fa]S,$\Ɲ9hnx4qԭqqsq@1Lǿ23'T ʦ ]?TDh bPt:g#}xqs~}wjdzbZ}ad$ZTx1WHMm˝Hx> "C ~={0՛'e VNA=3,Ym]L-^`vױC/P5@9bXW"]n;p- IKt9󓿎_Ĵ E.ћ#a]eYJhV# Ci @љ>iaKt"[cDZizdr?o~跶Τ&N8dYeYaqu0;>c]TtF%wYPc &$qηJ\ջLY*u`p Z0 8׮U0򃔃vlNRDfRXY*iދYtuP#Px\dzD&Q nTO[VkTiIH}TUhV*9Hd)>zӪTE4<WҦTx2uIp5}XV#JE_:>[4nO>|g8\#( qss3I !y:I!6Ct-9ƵޛNQO: Ĝ PIA~p"sF`!^!TX?;>/#:]&v~4-Qpw DDT  TEHGZ<+Q-d<&ј(rXٽ㙕 RxC}ir)sp r\BB0+bp&cf>o?.F gqJCr@fiՒnFEO$ZE^̤[ßPohb7e8~ιO㾅e@d /_VJ hO(0](E 'w{ _U\lhx; hɔaroNP/c[Evt.P4vڵvbT.ev9M=pԜ[jDM][\-R1!UMÐy(wv$SSBỈr;aj\֚j]~ JED~キ_ɭӳ1קKo6+T( l9烬l"@͑hKEJ(]H VDJsQ?Oώʇ[ZFݓQ;!bH4")0,>s{daAM P16 l%Why/"sߕbY24ҠPKҔDIEt-C_m,h~wv?imYyF7(>+8/ `GLI* i'O.\^ߌǓc$ˮ?\P-L\ȕ*jj7zuHϡe&E  U""0ճd r@l g}˴*jQ.L ςg LiTfE{uweI!Q\yv`<ԖzOӡPNC̳( wh%!0<B(QK / /+՚9Y!s4cb#20 4Mk4ꎷyو}{}~q>N^&^Tq[ `a(a XJRT` #W/7_$I$OvkseF9(^d$FH|@Vh~iƒ JOц b^]wwT޲lvn6mP8?c@5qYN PiB5Jә?=|BHS25gݭj~|JNE8+Պ2s? 2*.$*'0iU\0% EBP0r׍vc97 vD ._|e]-?Y^kY l6Tz0lڷ7@8_8?18ba@&Ih(2? \Gcȼ<G':DF;15- FD IQdF 8bipGՂ'DcesaV;廋$$wOzoNڡa} .Bfa^]'MpN۸'z?$` J8.s@liu 1f}nI7=Ix1E(IŅcDVW$["ku$s(="K$3R w'K|{E^o)"| \PdFղ֨57cN*%amfW%ء:J]ZX*\dQv8NH9BMO?ET ~zdJ.AwQ0$(iP>ҴzzYYJɪg)l#2&Qm$K4 VI յ:|D t _{Gc$P`/߷t @E< U"wt; |E+iӍ!pq=׫uge$2bY^E)B˴VAt&4J#pg !s8 ! q.ͲB{]YsVu%$PfvҦӇt:i;M2v⤎`0  Y Q5Zѽ(eŘ3$m XJhH )-&8'r"f(o)_JT,@Ԭla-). 6KR,]R;N˚.o_rL:I(CwUEѪFޘ&{,(\&|z_R 7AkEE\ "i V;t@WEaԛ^-< [pԂcx#t9C!Yժ@-`%0o<'g~ tfiQGHv!bL2>NvLNƩ$¾Hhz5 !{BYK޺L V+G0fyaR Y !Y+0};ϹZBqT% Xu50"~]\n-Z.-ӆt)Y*+b.2C#4Z;?$R~ޟTJqWk[1h _O.Η?~S4Fg2w/oOM<,'@3{)=1e<ҧGq?{ eLV>Sl&1\(AohħGݖ{m 4U7V*B P 164N$OG\v8gf9_vTm<NqVJV耂7 W m L4JU $Tpsㅁw_]79?Wn.=3{Nۊ8ZЂ0ˆ$tIC;S?Oʹ3tIIq$lB+Gh@˹ĽOg9%ٴ %ʝز,`^և:8'pf0/v\]gFarEcզ6sgӺԪk=_vR,+HHxMlS.j2ٷG~i7bFikeQYYh9A''w= 5);k#lMjTj5#;ځuϛJs|7o_>%GR@mycݧIu]/6~*r80`siO;_zލ[-U ,jZHIbf?dqKdS+\ܾxarB@,VwߖvQ+& -VL"qЊ đ473Vx> ]EaT i&ɠ?]&~>1N/?aƋ(Ͽn;^el8ԥ"Bxya}M:4̡ZsGIy 2SgjNqHP8| sϥB U-SpJ69O7 %r]͉<ˉn&ո+ La9rCqv_") [s2|V"?$/qgI&Y"h" Ӯ*VQI(ăQswx7'Wj߼²@bxr7F9& =E.tנtƎUoup8DQ߉8NDI6_`7V˽ }Ӝh `U+ |.b/G `OB?~șXMҁ_]4XkTE5'&灺:R2ͰE XwX.> ."{4Լ@4&x@*`}WR++jl62 {Hc6Bqvw2RNNݫ8#o0l~ .,3^,؉ġ鬭%E@ѐY[ks9]15:b,X"5Mkq<"I3+3c~-+3k`m×-3i}_xH@F!!R?TjBƐ`k|Js=}6zE#Q9#,%z`̞ kiAU~8: TJLY"VL`8w~2j5 i'Eitk[Ldr9Mc?6"t/4SQh9G( T{L=Ƴ)7Hiڋ ˀyKO?,'??'wޜ*En.tA?zs\>]s~O{~bcR9ɕmu1'pv+HŐ $E~ߓqI I2p/qA1ݐ 僖H{|48-Y[ɢZ4b $] Υ0q ѺLS0!b5'i]oƃ/mzh&=i?Emt8^+/R|#3Y ^ h`nLAKX1FeA-XI/EgڜaЊƀ1'dkt:ө'mB'v؄}Ag͠ёyg)R?ƿ却隉[ͶW닕4%ң4e\0ƙ`i$zH<9|:NM1;C.W1=ff3o>^Ns[tn$*\m 0ܭu\kc X"9N|d3!Nd 9<ߌ?/8s$Uzzې8N_1Nj 8h(iO^rHv(=SֶW\ 0m nk9 Q\;ERzW"*ͦjNbX$%T+ ~GnGTpKr٤wI۵&kIfh:0Bv{}˃$GSwG8Hk6A쇢PCc\Z.!oUT4_ewţ\DR<m=h^7A ( <KW]6:,FttFR$t6c(TqU9,k*z-˚vMF ԛO&hOͽؗ,vZ]M 6IrHyqJV; @(e/hS\ EbNN[L=p,+DgKEC saDhw ^Y2&`,cY*dΆH걦Z:5bэM8c$ hH/G綛`0r"ٔmmVUս[oЫmڮvF͆B86>#iGj8ތ΅%>tJò$ ؃@i]D ]4kb)k\5/`;42&xvC 䧕R>; IVsfH+Gә ,aX=HOW4k~\ aH`l'40|R8T8(}轹S{Q8D*:>"@\8FOOPSor8 u0 Si}?\ :N/T ~2ׇ_jH6tcYN"tW_rv>`d*ѽ]Sn+Aa?:˳KP>:oG6Hq'#|~k7Vzapǻ&e7 ʼn=kpH601RFlX*]SZl6Oݐ[؜}C{۹Ûه;oʼ\b׏DJ{pǨ4K<۟55U c\QlY&DHwfq"S)!MΖAnOAxN ت9u1KVڠu)dpe Ҿ." Z4S<._B7'3P(q2LGKe1bpy/%EYm7j4OӥXpѵd_$s<P:Y~t{zry*vnGYct]/gr,*BOu{]x I}#4lrT"Muyuwqv٥saKbPiQ Maa@-ؐqۛv=y!(=O!@QAאAm$7ʶĨ*f_1~\& 6ͦa: > _!86P]r|nE+k-<",ۭ:mW/5[GbEC{5َ LٶNX'Գamt#Lٻ|=fϏ h~vf4rL']8͍p=j}|(a mZ҅\ɱȃi"W[ޠ# ̞ۦ0ݒedyqmheXex``ځMqҤI'Dm%YսW~gADӃT&Zە&'H&NB1L5I_\zw]jNihŲ|uS%Y>Dbi/mZǺա`#(9dzo32C.#t&GXy2KaO?86W@G_ DE*TXrиx۾F0w2gvɰ7PsbK=K+NOM ,x< G˕ã0S`N;p,1/ʞPY:0SThmX,)2LFWh9,rewݩ70k\>[QKE(4MC{O<z} C`9/^>^4C2ڞYkQ4lszLɐpl2ߟ|L;vƧo",0X< =/%Ǧ>'=/r JD2 X3z`io8.Tk5IA;I PMnk2[~#_٘3yDB=WYK<-.YB&Іθ{e;Q=qCfte&ʒPVmh ZbY8bMh` j[ڣj64d6~]&Xuf4@G;hsl-*e :/?fFptL; NeZN^sq7XIJ_$AgV7痧@$"&9FeZJC ߋlR)T1?:h!R,ʪ>1>ly^Md8X !tMt] !8/%i_/4F(8dmAXNMX|hǰ]*(<)q\Iϟg3X-u7}ȗ0Rm9ݻPps77U񐏢0M>ꔗM=k 1Ġ- "h뚾0&V`H%;^?{Yis kֽ}uvֽ%TBff^;T ӉaIR٪|rLgrpύ) ,"xۈ a 4Fc(z4ˊy' `"QSK4ʀMZ} yDe$t6'i&%e>_h64;F'G љma"E%AڴH_?K(mvغmY"%!R:p;wg1"E7-zggnX34o{qۊ]|]Ag#@a?r$d պz|n!Csq=wp?kwQ|aj:/t@&2шɡ𺯼o`rjZ4΍h~w7 PE?ӟ*9,z!)Sr$5UkQ*,'I3a<Т,@~F+K!lI"F3~?ةiq,8g\18J.KE{x>^&`jy(|Әɺ"*e%d^h:3X NFYy.fhZ2,bΕX^f)"ASA`/^<͓$ջְ5g.Fcx9|5xӬN7U  E_4iwg8#jYig@hgT\KqGqT$qNPL4ƞQ<->GH$H#s #cs}o>Sc4C͈By{.Ggn5 h|%l"4u==fPBƊLMS 0h4M/2CY1uTdR0j"&<ǃ}W 8qA)+HnԼHeɐY]AK\l4 u-5!s p02ر=R!zk&4LY;hy_Nb=nsFlw3JGe˛}79)P~YQ"?"S׬jW2$0o5`*ן-Ϫafͮ9B+kpF)p1( N2Y0?]m'A P%J 'X-TtQgp0B(M!p#`)ޞ(a`I<4Q4@I "+f0LI!gh]d(BV'mj"ǃaZKLÃt/ 6k&]! æZkoկWKrx<8B6Qֿ݁y蝚Fa,IRʼuNǿ]3`KUB#k枾~z1Ԯ;7 bakLD6xM{NkBQ2lia,~tq \[^neoæ'0Na'8M ɲ9vV3u8ؓcc U,GCDPiѷ"L8|tgJ!R蛉2(44qBz1ri } 0u17u֞RL}"KF;?XOM5\~X1Ee7٬4f9ӳxָ{z1-եG#SnzZ;PD*?ьxO-ʳ<, 87M3g!U tX6[iSu:MSEQf~Luc.nqK[W2["8xONqfPF!Lɹ,Τ5R``ڕbgO/!]Ad20k Hy z< xӿSUF8 BKa!>vƀ\l7|S^A=yckt.AKs.L_!}2Y^1i /\i{q}yWz3eLBW lbcPhᦡEro?_w|qDž\V8j?^ ֝m]tz`  9V+FF%D'*NVZk`vjMj0v O{O m-zP 2(2T`p7(Bq8M(;0XeIn@qm=D}`{{K_[>^bhp/םnoazЈb4wweV*Uc#_<՚G[Aͧr `Dgg?tZGQWaaϞZAzHUem04hmoQ1}%6"b-5E$ng x=dqYp8 }rTvtZk( uRDn0axs1 +BwOz/ߒQ\E4Bi UűRQhƨp{G|~9f*@DcePF,\^(sBbZYoVa(rGlFQg@eJFR'qhaJyqٶ7\k7SI++-ex8."]e\wn X 2A(XZT8_ϧInEj?q '5;n,M[ja$ dzZ,,][V:, 6ؿ:9}YsV.+ND83mEۻ^Miǎ3MHbHӣ3y~Sdjߥ&7}.k,"򌨃ORģGG}.wqYmVqʪ, Ya#tН@Oϼ|OϑY%o;b`[=?~1-g(Ntvq\65]`Au!U|VEc#XJE*8+|\:gd X!Gg^iå}^w|Uccg (j ZQeITv{w˻r+tv, IYKrT&yH1Wk:20͖my~V57z??kj)ߌƟ_q [oZo7+}N<2|' KWcûð Q$-±K=]{W 4)rU)Bs( cJ/~<흆YFoF7N|x2i*=24$>6w^RfۢU<&C8}7TJ"<OmEjev*ds^Vgj?Wo'@$\#9<9JD ~ft<*R۲0\\Iĭ ͖ЦXUoc,UjK+HeAY*pN&u&>&Y"q<AA *NaS7[Wd![eI OSt_Ͽqԛwp7zwtx,j6'GgtPE*jW(?SQ+ݖ$k==z&~=QHHEb v, iF"If(dhn?i(l׉XVT$<*bJ l&رc+*8h epDI`X`t  P9F%N M_hʎ֍Eb$V_[WU44iގc]U{hsX!(k{ !T  L60}'V. ٲ$;U!y98[ʖ"q)b_2H8a}-^\-.SB<܃Ʒ6D~]>|OJOvsX forb2\CWDM*Dvsk/9ڜ}G TId&D+~XZ'11b`AHv4\<ޘ;8>vT8z(n#̼}TyM PlgZR[ Dlk3~NgPkj]m2f˛*64M\h<1ѴL?P 7V ˹SH3%97H. d[.ԙ;K$7DYf<bh)Ǚ-|_R*!%dUEp2li}o ``#{J\Ww鏪NF灙cϧެoR2(I,7ժps“y]gim=՜]CS7t"/%q݊$6%ccGHxRE+֢xYe'cVb}w8.Eނ׫MQig4 Ig!%2zV>a0 Be U ,/sqڏ2+jCh6 Xk;p l٬(z2뺔TԒ`ԍK)IGخY!C+ ʬB3@ i 㧏^_Of!!b_R"uP{^4°%+"''Iހġ0Fmq\ŵ~]pU,U`$ k^::CD`q>Xeexn'FCmw 3[? јcygf)C/OXw^Lu}w ")v!!Y-GdH|z{Pl h[l,uYbɓE}J1 ӳ-y#4#k+z+T'bP%9H=Œ°7g }Ja!a$']}I[ $#0K­ VU4Je]8hP|AIu2u~GTx^[T\8'+ fwڷD%UGsF,*  vPBDZ%9&LnI~l2W[XU ;Y`y.6MnܻEJ7#"'A&T2\x'ZEȃaddSyE)+2z]@}= y|{he2ϸUJHW[?}A=&iwnkwݫ~< QELݤ\) jٗ}KSX> $tMBf )3y_=|o${o Y5!r91&l%&j,<]:-Ux|֖A]C{KdLKrFpgHcmkR)!8;FZl2@0(Ǔ( E;uIgOrѿ.?E[GhlLF+o+L+eA1́=hÒ9'%̗vu2uzWe\nw| _0JxB˫f˳k[</>aPg Cz|2QٙO܏e>հ6‹͹꣧ga͛~$"B bQblEM I5`d@Nt GsmT\̃ըUMGbDG hk5+˼;>L[)Ac<ΝJMtCVh2iI8N8_*gǧl{X̥M d*hVwgɅuGNuV'S{!W,GjܪU!sݾ+;Px6U$95;EzsVYĎ ,MY*-0DZH((UR07K&ixD,)0f[ URh ^jouO޻Gx'(*b/Zka?wWmwpf0 .W쯺L TQpmSkK)M\K]*q%b|pcSnkLCS4,c+R`ҩ9C[ep tPZRe1ݹiTwa@˶uI2+Wت"'QvMz!*"+ӵZQEWQX96 sm0!S+鈭:ϙ$4"iR%bO3 9 _Bq9+R;F'a}}s5أ:_eExF7 3898pvudɢ7r' PUPlK#i'Vh!2Џ4c\8qGffNAUq?Bê,KPOcΨ֤%!"Nd" xE8u *\#bhR#k]o߁hHl>??ͼaEo]ij8ŊۏOy(<7.I,G=_4s8|X ,#&"fUe-Ej()0,: Hl{Ğ´B RRn4JYCfz`z΅UဘY춮[m**PA6QB}*~8?j4m6 " D^Ս^իRa|vϻ?|o B&RR}Y~\4[1m8:( b1oqu5Ct27ccHB^f4|pu^lD4Yf RteE#^)⚁MPn &~x2.=\eWӰq['"^8_  i`$@s{mVd xuۋϻgbyIԈ.A(uiyD-.DF668C"(ƻW3Muـr刦:dRpDŹ"p1$sUoT[B"I\Ox)]2Gmw֪u+=bhZǷZss~P;-HZy1 ξ@P[E\ͧ\σgK3)}wZP w?lpvE"$An/-.g|sEh̲AM@ m0RͲ36ZΪJdpщv8c/͖΃?JYf$A(( <)8+riB֧<%nďΚʁҕ"lk+=1)r"H9aʈt_%;+r(QQ0_wo/~:}Z|&>^|Z}z4oŦ4 A0|XRŖ"+7ס~{?_|3Rt#Z y'K{s;VySx-Ze?{Wtԑ$I$hA ɿX#p(Ab5<}0u$Or癝ڬOT8毉Wu Y͍ I=m/!P#>-{_3-&E3In;ӳkhy>=\/ EZ˩{KLMZj-4džÑaՌ6x˲U" *. q?:H4=+d0f[Iok/$Ii%2ϱLZRo5qϽv7 /߾tcyU땛&Y^ަb) y N'h*ia/NS20,ɑZG77w89>Oδi+ Ò%kYc+q amgӝigZݱWkQ d{<`Bʁۙ Plzx "\dE@0]o5GԐ ]k>],6SR @u٣ŷIR ',zL2(aoGcݯ6\# C@=s,轅oo>>^-7v%e0Ï95%h0q  fT  F|;R^8N)YnyێmbiOqSkX} H`5_@yȤ6ֺ5 BWP(ӟ{~'DCs魿(e =7=( w(CrK(vEFe -.Lݎg@Ks 'H 'Jd&4^e&:BI|g<!@唬q\JX<=DnHj5!"7jmLdnao$" F_Ǘ:MѳGRAtן%VlǪXl06zg a{fdmW6?nsI1,$`: Mژ^x~]. L~͑w%œzPLYRBK4^}גC&>vv5vo# ˁa]]%*;TN ൖMYN mtʥI\ŅO uY\.u:]wx Q <]\`wd3"#$N3Ib99`cVD܂~7`~B''Ϲ FP@bb/ "HEi6wfjSF޺w^PLeGod9D7pP; AP\X`ǒƓܛ%30U/y*Sڝ:hTlȝxYid\l(jML쎺5Lp>o)M{y `.{IpmkR'o_=ӳ ~tsX%ԻAQ 8q>d'ٗݻ/ٙMLm\ⵍ)I PAWm2#3=}-DkE dgEFo=7S躕zM #?<7oԽп (R-(NF)U(loeRaӝY۩ke`X ,A$xjYk[_N>> o1u;Dĭ -DI!b?=qZ=y0(&g%n&B 9K~n鶕]vCdGv`5B5 g=EM\ЅKlLWjMq6Ž;`v9˷-䇷<`5"ȘRTR+Ǐ/37tܔvo*.d4fQhb |]4.)2Ŋ˸c d#D]%-yXJ9 2oDRH7YhP(! L..,)Xd+ʚuk͞DPOC cV:&!Qq$0B_<\A^$e"ޢpsGd\c]H J3(I)ī%>ِp:vNOG#C+ !/|6r?_D\/sU~8<_~.Y52FcRə$d` q`#`O{K (?=LY)+Z99BHlZiO|R ϰأY~VVj%H4wA?8QHx_<;>z׿p %VIq6(?kJҐ"yOMAE+F'"/:]e,kYk|b~޵BC4v}coۓiYbўvx;s~wx4k\T% JE:rhHf*6<;4%Lxի/O>~8_ s`u)]1Bs-nYUE3j~$mϿ$Hs%z4lupA(w.F6UV%eΊ YdfI0\^nq:{!Xo/M՛HH˔ChNOΰFo*9WS4G)*]HmJTK,ol8 N#8!Gk/{ :o,~XBUCsqפS\&nI*«KӴ\sSJSqm ~<<¡5l?%ݛ q@4JfD#/Y(˳*6W$0UP8+ف_3X-HAYسÛ(Jq^0o铧"-YNRdy41 56qg|fM^ TK tI;yNK`lw؊,ațĂ8ZuYe]٭k;2 SogUc(v4^+ mt X$ `oi]a] @ŤJ:umDok3A\-q>%B}<'t˜˛05QFmWFq~&s#P4}+",kV L\N l ڢ8M@&u/ p'5S5Q`CxӶ*qf x\)Qm<8m!"XD^GRVÑG:VH]!A;؃iwz^,%#ׅdJR0j3{Nۈ8:;tr53cۗN_:}LcI}'m2  zֵ}b~(КuFHf@ +;=1۲/G1D(x *Iey+rMSrbV*z]'pӕ+$']^J谪\h<6(* Б~\RMgB\w^%)46KG{NOͅJ%RZ{ Ab`{_jخ麤 tpP~B`{8NX TVSf0̩1D1AUu U'3s zG8`+jb[W_MhUnϧ:>{fZva"z1 ~"$ԣw=7OGG3폟PTD statӬr,ǥEyvdfz/Ս,^aXC]0*u!ZmU2<4HC= Wl``8%[!c<;ړ^<} Ӹ9]xw`<yY ?'wۇ}#gTbvd>|ZI6GM]K*NZg}A©tJ4m<96 R 8ol~vkY} FY M8 Ȇ \,WZIX cay^6 glrl>@RPذ L9"^V)H_rʅ8_+ # ;elztJsp p￶'O-Щ몚gPi\%[dBw}^LJ9B0?>O&}p)7ZG+f6CH~'.<лAڐe1ǎ'c <&&Ż^oίWcD93jsf:wmPrl# CRqCwI7m;7'Or:g`b/ݥX`'nY)^8Y(>11F8֫6HH#b=5 YON 7\ɯ!qD"R`a*0P,࿻a W|Ar)72G^BNId_ԌQFZ&pP"84 p+aU1?Xi ^9A^)t.g/^=}5t<ֻON b%uwo??ze<3 %Y)nsq0' l nv7ӴUJioڪTVQ4ml6{0Gc43߼3߇8@Qw3vj :oAWkh8 _#Sb)LFVh)s(\䡼as)UqCi˛Zcg>\ޜy] __< k w.WD OՆ-b|ȼܬkm@̻a։p$>K4q9@-c wv:pgK\#XoL `,SU=P/nΡB/z@$M:$`.첧1h 6琉HJc5{,&bwu3![Zgj}wzF{))>?' n|E*rxZ-r# ŋr3 3 f{_p%@ foUFy)pk,{.YH؛ߦ7*:1E2v 6{Z9ʅ2 XFؠ5MX`Ƥ9OB}/,f2TQܪD3o;rֳ827ґM|b*UU-2Y8+t{s.7*OO=9 W&OZ": N+RrC(:vlˎE Je~9G{.}FI)JUQՅXU%%*|г0F6lׇOPp5Əö.1@yZEu)-/VDFv'w4rE`(ZSLQ 5,]6a28{_-kNMFm'В*3&.ƞ(R,α`IE0E ŵ$W/;<ʽyޔbY^ `WhU 2a32L+ fH?E0 UHgwdY",KZҭjk+;Xg;^N?kS e<ߟ<$j48j}=\EpTn+ 5]>GXhnX<_LC^KyZjsBj:bRo|asKIXM-채49go[O $viB߿ozG_}H|\Q<dvO1fh`&p0 }q֋'ߝ寿fxj˝Њ`g]Zƾ@ !ĉc{yt\W !&vS{ X/sBPFZB NRH3jpf9J%y ^FBR $wE)y+EA k3(X/7b!c1~< 1A/P"tUus6[?{K3@[% , U2⮦%5' B7DR4ʀģ 57ᙋyR+ .\}zt |}KO'G_)ah3K~}[ri5"Q# ˕H)&Ϯx-69 hΚM pă4Jď#۵ra](k|3vv#EdʓPti[a־ L'diɤ?nvکil BHh+}IJs+| ADˁjklyS ),"@R( .0̌ ۬=?0- EF 1Z= B^C |Mܙc4ɫئY:}xM7'*&2o28$J^DV%ON&V䅞PWoJJ Ϡ_d=:`eTKĊK63gݫg(MoLڟ$E|?=O$HԪlIpIR!Ų`Y/2J$fдkAiݑ831̜:|"jk'yn0' r 5Q*MMj2l=y4Ӊ̫""GĨ~EL_O$Fh*5?prőbDP$LFK9K 1U* H0jYn,уFaN˾RRbNKJd(1ggӓEu/ndW< ZZQ8?:_MV`'d ko6@]Q57'`o4 <~>_άm#7qPN>yN_ {"CI$vXHfR(J^CrsD4GBQ^6,{dr#pdD')7J. fi4YLH B+Aཋ0HW ?9=ْK$OɌ$4)2b]96RJ8í pB6M{ n 9FbQ[ʞ;&jƀɥU$ nd"x\i'B^:`6 Rjy;ߓv€]`bM04Mwk>yfLӀd]+r4(Q'\/v@ӤĤO0O? g3O?_uE*C!ʰ"Pȏ,]etlc=. |%FmTmMŒ# q|NKp~Voa^D#eNlh\(]4h[hϾ{2bD[om&z_oU~ԵnU9kϰ oHZKcq@UQ W_>\F[%Q:V?uR{rf$FrK-vyP[l.+sču3;Ce WcmaC44=`B!`ERS0syfr^/'a JrP챭ن"hhҸ7ZF@1;ڽx頭wӪa(^;gCruAkF\(UG7>Zh!y6t\nvCPeN-?~h/vA,RS+ YV^$!}:S4ł(06+Ko;k2< 2C2šoC{Vt6d)t">=,4Fh!'r*ರCxw!Ztz+cԻ };]~[,rCTudHc 2DHh8!24CYXrxUUF n `wq~FzQQbٜKwi0*JѮ*UۘQ)B譾$_F_< (C*'FQN\L@@Z+ܹvx#rҤ A?EYlzj#MsN*tFC6*RF/\OȬVa'I R8:ߴ8ml9BhHDjzNӺI>MJҤi!@a.ۀ1QoF~4& ly <+rpũݮ "{Ot-6q\. hw)f-a:b^ 1d8?]~l5Wy E^JrW Kū޼ ċoVJ0Xlj?ٽE_z7uH象; tK˱UMfHPpdQiV e|~Q;<*qI;^G E*jߗК3\A h&d,ʥYqfH9z~tz7h\~gP,Q+WL"|q@`9 7 *5od2ЁL BOVHs>W+>PP7u y 23&CM;T#5zJIB ho9y^՚oDlQLCi!+~zId?Lϟri 1}A ݭGYZ?;i6i0#o2\@kŪa)B$VCA8p50Ee`蚖5LB!1,ʠqRq|f?RW^_Q-؋e臡hu@=T Ss`O|,@@ i.P"%2*APQdG-TՃY%QP 04}Xcv}A6NR*'DnxoP7ږd>9<%u䏟t 'IR="Q Y+*D]~] pUѴIgј FeMTؿ"s)Y;v^@altxJ9'EAjFS$43ivGx`NFc`0׳I:}Š\Uʂ]|=[cr)(GN1dÅw.Kc˴>O/ܷ>09YUoFI-Pn?"ryE9B. zŒjԈmXe.`8Pn! pOfItݞM +if%,V0[O6ku&w0}0p;kZdJK=!pL!|Q.m9hf. F^EB7&eT%qsG*üy:Cgm_άm#¤HDڼ[&i ?>N4qbǎ%$K,Q%[G}ˀ3s܋ɹdu`&/h}J*Q4V䥌8 2( ,,r1_EYz\ӛU֜S &Z8I5!Q ]ta=$A%Vd "̒Bzc։'r|2C\Rx~f xř$n|bdY'{X}?ɱTn;qZEKN:@i~߾D*iɍ G&HdvyIX9 :K"-l %_qlh:*vD Q7YfSMWgQ6F{Զl;G(Kica7ZhK)R1ĽxyX ţūv_GKz hE`x;(g(`q/wϪ(60!Evu}9F ؾ 5Xzx,AVTV!; pyB\E^%T LmU{fP i M +{@\fqy)5^kiH5. 8lI9~&^EpU(D@P nie#W%"H C? Jh6 VFnU3 JcҔ-ENjQ<3Fx]'Eg&qVcƉd6]4#Q՗JU+UvmIIIl`˾ρwW}=V$1AQ IaGla۾9%IS?/J,X<#ӓ/]O=7F,^ n: ' NnI p8U"l;&IRl)Rd!XPϩך1%Qo {[gKY֨s֔j޴6ƋaB@I`/$OWlk [+v]+M5A Y8@szMZJ,x*OE62md8wQrj}0. ^ﹹ71\( 0"9ˏ>n〨X@`N9!RI%y:9n! Ųp_AD*t[Mķ%2ǎQҖ PGg! (tbah:97ؐ?-/ny`NP4 yq86 ^ tSw~JqÓ]n)ȍݣ#wZ{rU NI4mt! Ȓ5% Jsy N{Ga^W_kM7kcohl0Lܘ5MQ9mw-^_'"P:rJ?)V{!$4k;$K;U) M{(q˫9ay_kw2 LDӶ( _} YXY"|ǵԛ"zރÈLO4*~d'%!bU1.|d]Pԏ@.WQsԫ^Six@y#dN N?٬tUU9G.ZxxS*ZLǵ`ˏ/~=<}X"Jy9][b K I4sǝ_x܂EdnYӑh B(v$}5bqOj6ZMe`D^.?2BIl(B{آ8W8封l(+DBd\-OcHgJKdvZALB?3b,!i<ǁeg:~ɤ36!N5M+sђݧz'~8_9ڐZrol̖KJ_/Eg68xw,6LTRHQ?y$U3,LM6/ͻ%s~wu=4̐͊ PEp)NhgW7oQj6PC}*J0̊ż˲vl5^|oR890N 7QNQ,>{92 ]W`8l50~B'ej li'2L(՟/7s}q ]77-9ځD@%EhʦHYb(gZ ZGt@eps5FMn&.@N8yWc~ra}W딺me7I&CEƮrd2M߻Ժ[=O)!P0S>y*u6S[aK#BÝ GrFR ȷEVĒfw= JA,x%~qR 2%9/2 e<ˆjz,ٺ)H $XZɹBUmZPk4h:Y~ @9 %cPlM#Y$ rWZj4~]7RbeAi*._ߜd!a7wr;U뽝c;4c޼bZ;%0C!1`sl`x0mXg^xgK(mߺjt1*f`2'ٰ^iM}al.*MIN3Q8 (c K+/S @׆܆ݙ>sR38rci"֙yYI)DfL_JPGݣN?F^J$֗EE+*H}g|[R8:߶8s8DjXDIְdy)җ O}[-A yqmԣؒ56ERܣ>刻#q9 DOAx^*+Bge޾zx)kƊ({n%vy?9Pm l;Cg3li/ /t)(hά"UXc+ej$*^vPjO!v \…6 &3tN|wz&ó|:jx{dExDGPF Ou{k6$<@Ȕ(^2cLfs&p"S3Q>]-(9$K-/?梜,[&&c;du]_/K)_n`xV◿ ڐ<և<ÒUh/@b p,GJn7r`6/Vg Ѽ#yե*Љ$ 4#$kzUkB,`OH6#N{9[ Tp|3谜jeXNZ)džB0pI9TH[uϮ<7.H\%h2H[^ەw4ƐYPG&2_8'(]Ri5۟ i(Y^4wx4vcl ea.2q Q8-0Gdb!B7,kh8ڟ:J V7RKՕ_D)wv~Jnl MgNJS{ NLآir/FgjuR=ε; Y`Qd& :7ȦKGjtAؑ%\[j<*m=r_S}ƇSnUo曪 {۽j$'׳<L͠<{\AfHj6nu5lJ^k`!BNbjej>GC@PbمWeZݘH’ k4ujΰ>ɲr]lg\'E۶a.&E shX^qR7m]_ѻuNZJIP$jJ{}ٿtɓ1P V)]׳ۘ{{<-~U,' A( r}lJ?l) Bpύ4(tnB8xwlfg?tY!(iAte*\Cm%n,JL$>T,6v0-t:hXuS<-x}l+o#~@eM+r?}A'h78Շݥ JT*ܥ.Zd-} fkk@P i2X1+ȋ E%kAw3Bw!u/?/6S[ZK`y{GGV2dS(7 S\Z9w$ä뾜DA?Qk7BVEUph ՉX"6A^Z (7iNM,sUJ2ͅ"ţb-YD,LENajZoѹ^nm͆Ƥ?ő"Q($@٠$L~60MwJK,/rm I{걽ҿh .6qc'vXVZ(R{%0`~1O;00)p$IOI%:qw;U0TR$IbXLq^u D[Rɣ%A&<" dUj}i,Kq*y0 7ܶE6^v>z}kjvnUk,&@-q/Z[KFKJjT:uQs`Mg\otX(cj|j|p)ZENNN 9>À } b̶Ԛn-Ɩ, 8f=_W*8+!:1BnY8! vk6Y%WO|+Y9Ǔ2nDdi#  yQj5g&32Al,b^sQ(Y4g}wտy&H_?e ',)R"r OPXyU9PHvN%fe^^mP|kz;$F=~Aˋp>F iu'6̨ foh_[ܼpN[[(cPx|Wp'Ys Y:mL>+[S(GVR)_<t;-; I?1?֏*j{@lI.@m,uR/x1/̟_kou\G$˳h 붑7慊@tfxVpi\"'P6?zK'>'\ҷ\}f4$$A66LK%9ø^Pi*3XZ!pDD ,.ɑ wܟ GH Fₘ!(?Ja-Uos*9^[M I<҂<:?;"(Vabʦ0@q% JcEQw<;91}/4 V,Wi~߆I.n%Ùn~<ɘؿ^B,(2YF`$N\_䄕c~~FQ̉b5UPEk-lb!oF[gEn5rQ0pBJ.m-\1iYL۾4fG/_l为='桋'fibsE|:Q{!Cs׷7-Ku'pҵڂf v4PL<- fha%rj љ=iEaľH@B=Iv߹ "HIB5Pv^Gnq|Ct]W n{7'Q׸UK*`oyn _\,Xu <h`֛Ē Gn?!8vZ;NZ0D&?PENeh2l}寗镊b",Ẽ%;b|zޛ8vJrCSl0M"C&f+|[߬v.Ns(HZڙM37"0d@}=IQ7xCDVg ofYcKtpP]y0ve 3 qsvg&pmZ䜚T+Z[iӅ\ &ӉTmYM)(UUЋgCrYsjy3.}׷+7n&o^YIrU]!!bP2#* K`Ͳ%9Lk$KA|(0r({g5UŁ`ؙq$j ²5X j{x7} e$^fe=k({FgRP @m\&U <<%^\([Co G.5xcthZSFWǯ.Ϟvtg.X 7x, wG~NJe^~ʊ\߫3,;NAV I@Eh:nw[LJqA "]J#M_='E;ARǧN1Y$(C.HB`ah(H\/|9?r,uި6n/Ό-pmR %|)KBr6^_3."re cx%_{>Xuk)/n9qF x``HZXZE^8)*2 2 ;a+An ArO`4wP2X"i,2G.FcO|s}>*yu[TE8yT)?9;:?::6&f wwz1ERd&p lŸVMhQOf'*~)Tvo7+jIoV9EI4Q%َ;"i "-*(E԰-'cǖ5O$8 $޻ /N`|*HDȖ 0Bc m*&Q7&+>ӹaj ,b=^(^e, \?X ʠ{,˃EJjX+'!OSHyQhq4D)kHm7"EPƃn6@7,wD}Ă08BE֫+%͖´KEz݌Q7pO!W7˕$KBuBy( N@JrW3heAt|?87e-CfOGe:{6$[jZ \M.[sfywֱmNA(X5U .%ݝ$Mӏ8/&T2iJ H킊M)WҥD `Խ@Moq.08Ktʕ OS8ѹ|~dh.M#WcC@P8z~1ң 65 =7]?\G:%fi|4e˹Jo4#jhg{q|ؕg`]_{ Q%*m[#2#jwD$ Pl42\n4y\. d[~Xgb")+0Mg b\&rENvZ:7+3ۊ>iC6Xjx~:KT F|ZXz0,W0aV(U zJBM*cƼBbW8R֊.k7:38Oro^mZ e לΦn'9z('yR5e2fojj7}{|mY|AcHjVחb utP Zvڡ)Cs@aTP4p+ N?Ds~o85'%*T+___δm2>;v67.PU%* P٣lޛl:}1ǫwf~5^zPkR'p ]4-A▵pf85u!]M/9zޜMCuXY+scfMTow c8둶6l~ K)kM(jE `f^ TTļ<]A qQ/񥪌 @B/fǧ͝IbjLN 6H F4ϗt4h4Uj-``hwJ{o7MvS y0W*<.mԟ݇7EOz|t6+`P~(5n:.#c}`GaOΣ@R]bB"ݺ f)!+6{bri  Pxb&Q,ǝW(mXi[.\(4f kG[L0E!%t Y{R"T.l4gF-fY`1l6l;^;jߖ%ީW,+ԬYI Q5 w86޹zF{LVi")g NP-#l4bOW5˳V*XGPOܖ-3^>6}}y?_i* )҅Zr쇻rXK6&쥫+0o~___]k}EQ16G80l&|6S΁@VB1 lɛ[V8,$bg/T3؍|-kJՕ2pݝMhOҘ{{AH%ޔBP62r =V.fjah-6C Cj;IKKAє0:EPh5Dd`yX W{Dvs'r9VH9:N^ep47p37B3|8n9]}قu&wb1)!79v;w4$(w2SZ* ex=4 ܡ)KmE'VڊזXyF8 ֬jIטYZ-Cil/|Z+t}jR[SS+aQ md;aq_d~MN̎پՏ sI.e'86v稷=Y-*ʋ=|[Ʋ:s S|S/cOqjɉ,Ruc;rx]J`'%Db35;І הXy3)O+zv@^. ^es}(q _K2{[w^ pgHX 8 ҅]],Uуlp !eV ALw5f0S ˍm2>-, aON`p4r!9vߚoE2Kű~z,\H Z^%sL{8B1L\@P2%h*%?wN+J$THB)zP&_=~ j$VVMdl|";<:ȶ4/J% |V( jU%x)PYYy+iZ6M Dռ)m W;_~mb48Wm~}{+4n6(`d E%QR(&zK tl ]nَ~7+b׸YI/Za( Uyw:8"$~\m{M pd<@*n<tRahwe ˛0IXPFߧ'e,iBPp!h9\QNl+ 0,(uuZ4;j] EQ\-(1 |;$̗=rb/tv{ʞ*tfa"F.r<Yvvlor;c F`AJ_bH U+ @ѹ5maXg! `'ʹI{N{;KM.!61 !!$!R?nt-}yg]T%dPs$!kJr"̷MN̽xܗ_wbC8$+ZOZ n^ctSAAO2_9'jR Q@F<=E@ähY\wlOEqz%/]' ZLV5 )0pHB-HfS݇OcbNd* $M#jc.\ÁW8dil M>/&kzSghdDinq; -)5ж iU,@IQN3;O躛)"TLs6$C m8ywY0sx~}me^*|XS[[dW",G4da(%5CM$tlGC{i{,L~Z.6v71kxNGtEo޿dL vxRZ?3BYBlJxճ/{6rnUA3:q~LIs^?[?0n\&}lMgc5yYS+S "0;B8P'\6Mo%b $2ͧƖ O tꜢËÉ3 ^4_ss i~4M7(5fھR;{9$]Yw ȢT j~e\moe-9 Ѯ=(+yO"55`طB,!u~yoEO(R핥kņZ/uQsBSd9w[?o U=CZXRsW=B[\W:p鿽?mI-özMmDc (NS*cNP`PDZNnk(׫ xFHQ4YoF/"ERKxĉ-ۇO}iӸAk;^.&)Qw8!.0m4eYa_oL7Mf({;t6Z(FJIga, JI(%ճw'Ja$8Q]28W^k7Ov[zpk+ #%UʂI@.ƽn8Z[u^d0(χA<6lUR̍/1Bl;TT, ];9 WXa2H„&hX/p K jsM apœ1@ˡ4e;<=(fx)B\=j pK2'"t|ğNiD9#gT8(18;偤I]Va0Zn*tW;W/?6^'slK%BCTo{0xr]8Cf2,aC J2dRVD iNy e|6'@k0n=s{j 2`}QJ\0U`nS9yE @]j+~! t&ʴ@[6j2t;@l\Lo念!mgO'i,ƋqgkBIy AR,㐹žNGo J˜ )mR0|~ Vurj!<F _?1HDhSKﴯ_&M {/urA# +] s&?^ؘd\G,WP)ڙOw [zAVתeJy-s %vyEɻ󽝽ȋ_q 8†˪z9^-‘h(M +'QWwA8QVڊ(uI4Z UP&QvfLī=4Q4Cz]%MX̘McBs oAYKR4& M͟LWʕǟpzfiهNsSUY_nO.~xOJ@WN,'=ȷ<8:綍( @MdNc.d28c-ldE&DYYÛśś3](AXQ cֺepd &hۤ!b,jUℕ|y/xBf(L$=-Ca`@e*BN/;(j$pEVI)hv1_*fT+ LG MU=ނ\d`9YDNBL$4`&HRd9YC~ps]hTSEciFO>~_SJBi{7'Y+RIXYջ=lT} @Z(4u Tkў^{_.O8s=ox7y18 y#; Vjx2Ϸ#Ab o'zJj:6F>jA0h&( cm ֞`9O7oNPN[>It[0x7/"fĠhD)IӂM 95I!!mC(xVe| ˋ鹁㩬IhG(D!O'z8|8P<,e&0@zve:kAa(MƂUԗq}.Q"[nu^}U~0o}c`s(",O-SXC& =3څ?utBJ$IУh0Uxz~F2t I a`q-4 Pj2m"' TLئPH *8N`.zY8c"er4~C g3ce8ò8J+GV_&xyzt}tbivӵ-VuUT+iCC[.\^]dWMóZϗa:?8納('`ln&4՝Ni&N`;`cN@!ttGi4;+!}>x7,( zxP8l525p va,-МV:#ٮ?TYpYna(Rm키 zݛQnwdŰ͋UHsӦHZܬ6_v/y\.A<拹wߏOPԮRjh[`.bĢty0#,6YFsB1SdU3~{af0Z&t);Ajk~|l`KHXzdeJ!s-B↻/%B YiK ѨLD$E 6ңX##ܳ97On7}ımV k̢i`y@W__Tu88&$ǵ0"+؎=G(#N61Zno O!r6 KE(O<"8˱X~zxbM]_ȲNJv`}2p&*l>QxzFkf4ghfjnk7KGeE0ӳ}es#ń#ʖ|AȲP*bFkă9q)MxR0"sVu>휓t7In0nllЅ~5}ӾpRNz=̯/TÃvƳ-Y%ӞմoCgOj{MYFfJZ/H $6G]HeݍLG3YsSB̙`)"!QdLCX!1PI(H͑! N~v(BVMg{mQ "IS pJH2i8nKۭʕA/gH\H8vN'ӥDY,TMUxؘP1ͪOET @aVZYv{/i8)q@<}yPmz.Fk 0fd@Um t6+jó޿]}3RHf@̻w>ᖄrv:k蘦  1XQ'g;JgsyvKo4T•ȳ~!<3rWy2| UԘY0ۭS0 (MI\y]- JiiQ GXW@wӿA*<+I KTYlKL b%J,IDXv!_LHbYsOYe+H~J6,!'_)'X|qyQWc4}U%UUA|)eK"Eѿ:I"0q,of9 ƀq ؉.*miڤ]$Sgl&{ n V~hnH G{o8KK#3*X]͂mQ#gl;Bo렛uv*/LIJj{S9gl6ERI4UetC?2(NzQlZ` -'9 VDiXQ<qgQ҄V`]ޮ 8h8S (.A-3NS!177?ݭ%Uz++㋢@KxnzZ?Qgٻ?%C׸gkB ٢<{s"H("qS{1k9^R%u窬 zHEE|;zKk6ᤦ(bV٦H1)$ďauF_qU4MXxe:nsvG-\k$,$o[{֍nv`ߟ<UFҕ.+0>9ۻ'c *CA +:2)UץoLFE9[A ? o冴y^- Gz:b}Xɺ5G eA摕h&~E6Kd: BXUޠ *KR 4ĩ F:+~vɫea ^c8:GeV/҂Hɛ׊"/fSS "`ߌ,{{uyaW˭% R:GqWuOcggGDNy|r ۾Ye(ӓ2|^aG$_|8 j~ߑɢ ec[!8K\Z!)]|u.48;;zUdxQ9I*) إ+Sy+i)hX!_=n:CZux)mMcNxb@oIQIP3"*}73eK64DQڡ.TޘMdā C[Lп ^^.~6cs!'dxz}~N%T<#g+l$EYRwO֡ZtG\#-EA6K[ [4ĉVk#e\+d)J^\K|^[YFarɋ%Yho5ܬsHt^Ϳri6^(;HRz1E>*Jk:?Kspn>7%nP۵&\4HscR%sǷS/UYTܱQў;b 尫*5W4֬6<]8p>M7Bi9,gxUVyVSEfg[l.ɐc˽.qnql9 M B:HUQD5 1$6vCiu;**^AoY 8Or ȋ$ {k =.b6I`VKmoovgk-8D183:ORPKS+`-~EŴi ҼW" @b&v3_,X*NLTYRQiόȽr]'yDW΋̨o>]}%q2KԲ*N~}KR,6+={j"}1WvBXb165^&%^X ՏL68}EH IƵ}v4Ni!v☀ FBHhw1#o!% 澍8$C.{JQ o.Fq$Z%' !0i\U?- ;;CC5\wQ 웎mKHJ)&%J⣇J6؟׊UAU]jwZZ)[4>} Qo;&'k ˚vz窤 )k2ف_Ę3*%ǵo[kcp\ӴpwN`LSXStMܡ3hv==7Fm]w9 rjGΕ{9,1elvW(r6#oܾ+8:3q5Wxܴǿ|q>CB䰍:!s,ŗKk`gmiC+<-' !8U՟b) ;Ds.:E9X.F.Sr3$*o]"?m8&P hӥ}p|]D\^W`,<€X,/prϮa!O"Y !'մ_0ݑ5FrG9A8UMIV_ȈHxМ ֶ.ħ)ÇιW)]-CĠDr[j뺡H}hd,@RW/ ]|^@aF>)sZ1q{~0N߾' ^d$2AÏGCNrj 2iZVd&^KR [^mq:+4gojyчn~PO^< ׋,.˵z&OX'sbĿ[ݩ`1 YmuO>9s'jfNZ'|Q8phz ,U!_ـLYzV7ofM܂C#޽}7wf[ ِ; EBSb4 dQ ?qe5Dfh bЇ$RTXDᑑ'Eg۶q!uP$KrI۴M-٦f؊ٲ,:EIx`> f~ G̜g``s}}#p).dR&`\3nHnC6QDlSw>Z#p8yEU(5 z@ RX6JRCD>"6Zl(w). ؝nYE2$n5T5`y"4N^xSwg:pm7P}ç[»h^ ZL,:Xk2}zwHN#=;m9lN+xa[ ʴ %QzeME3sB#xE,A L>W \XS "71'NPW}DP5f+|QCkQaj<ޞu~~ rAw>hAu0^,ƓyroM^B$Ϳg'sq}Zu#^y!`mXӤa3&C-QJ#Q}:+9ۇOrKF~O+H^_'3( 9ȁW7WE$ )1?7jS,ED5]?IgUY1aJ%ͭ Tb-U?KoJt^JZ!M'VZY ~\Q< ņa`_s.i O h0Yb( [o))‡#ѬcRBOMiV9F~`*8d//o_Aw QlYȮxݧHbO^] #]vlZ 8A.م`'FMvWC:j% "& 8o5]]@)Ϫ Cd=^upNL&H"&wŒi>P]N [$4}й߯ۉC}{ءZQݦQgOl\6{Y ڙaJ QQ"WN2W% ybE:zFuQ 8"`ڸ^Zp56[-eqRT]7ptfi[Q׊@ZY Hc&q_LәN[;H z7=I:WWw|P4 G푩nzC)Wk 0}}4Z h,6D,'RTN%xFAHƶt Ǣ䷯^Kn.8{4Ke;4 Yxݻ5񑹰!$+#SEoB[!Ag\MD8P$;nVKAm_w@U.ɹrmBE!7O--d C[k 9 d~\?ng3]96,,E($e8B`44Ї% ږ7ǟuFY""׳D'v|*ࢇGreU'D2.7\q?},$n"AT[v-vy+L%UuYY1W JWs|S<;Sc?{F$J@r:}_[+D+dJ\,C'D NE $a4R- <"S*vxٓj|!d$A]_\LR3ǫND*oxh]Z~yL3<<V`EmhXvÙknoj Ra \mt&a:)d~QoؖYQ8m9wo<}ݻ@|L(kj*U* sDRd@OE6+ T"%9 Ircl&vJMwq4a<$d(bmy1 !99pl~jyze-B/]ycrs]5m^o{z1Cn%r,8u76q]o4x $[5,pbE ]q|qig0Kϲ6(x0A"8ApRcU[uRq|8PcgƽHi(G+"E`8Y^:`p4K|Z\o:B+幬 UYV,w>50}9R9)dn'ڠtUk|E(RKK} *rѵ'?Xл6AO9m#K !&Q'әL2m}hҤ檏166` :HB^o?e9Ӛ$H\V.mo ߛ:[7] 'q{p7[,tmAYq$bx`4*"bI)"rA4Hџg;μԏW Y$mRt7~ϫq^V 25$rpHqQvp>o b) =I ـ<)bl5[x MDl:C'pv}qbC&ʪr_ ) `TZJD 8ςK^wq waM'ut9ؙXK囍] +fnt1e\Ex ;~XbbܭMj ~Vzڭa.ﭷ!dlKpu=>>L<%Y?3"-ltTIhј@>|e9XaY9x` g<eSR?ܯ V*JyzqUdTVj xDp b||ף/1y8- x^ @GO yq43t}R|:NĔ~g;vvBc$&( 'pf6j sMQ \%+ ȉe!2 9L( 34/AL-Z2:>=>D1D>/`Hog {ɹkzIfӴ0 +Y:;Gw"F-$mc9vQJ8< QnK*Pwwq55YA8h? .R[s4dVY 7Ni: (Ec 2֝!?#b#"0NєᏎ͚ љ6NqKYIY&iR1!qƁ@ @Pʔ̴4n?-'ǿ',G^k0;2VeMǻL&y"AƮ ?!#xnPGFژ_}MX86fu}[vGF? {^TE ;l"9[U<,׊iAbV:Dd -5^bގXoZofc"+J`p}|LC>2hg?&.x) PV_ӳڴTn`ΠޞoW4ʋx_#OSv[UXyysIvᛷcYVwf%?1q7ܔK2/  u64t؟,7ߘ[۶UMlLP1<㡡ou{kl d:@?\i0 tOjhjT?ve|_@vƸ1)F. j'(kGAmu6x2d8X'G1ҳՇd/fbE?`9v|??' /Y k\yȳzǥb9vsB6Ö9X8cf 8 央>[+TY Q85\#M!4|( YeJӾmI:$m'vql1`hAՌ{4Gej DZhVm-Kov FX. Q>) #Cf|S#ĂT^IR}1}d~[(1Z40Ad9gt%ݮJ 'k )vw>R ѝ*%~(} E`fxıh&A~mͲ6#$IX Ձ>F\I'2/?̋`O톺AxR.?^~io⟊g/ssU ]VoR ɑS{Pcs XƉT<]̽E)Lq͸{aylug=W)!+?Ȁ(`cͼV_ӋM1 GT"^j|#dNBx prv~.tx\vyA\1 #a>)r*̇L8(_P޴^=\'@=w`.6u\AgE2|D3g^T/^Np\thqbyVNODXvd\*O'#sefgZ%YP"~XerD@Ee IIlE1 F]So \F|u};b?Vv0YE 褘+=͖8\X 3X.9wC$l̗E&%HfId{X)7w1Ea Á׿u 2YM8}#.dqyyUoZzT"Z/(y%9ic0] lTrE)\9Ns8HlڹF.:ˇy)?4-}o);\/kvm9I Y0ɻnxB0<͚i!(n:ON~Irx|tX Fc?hKo 1<ͧi@ϫCurzHJh)Τ50-f\2SC \6V%eI1 $E(&L#ak<D lڰydsxpw(`Yvy[o׋"y2䣱ꍪ_l|y`2$Pro|ܫgY:'RPrP#U?ߊkZ|"8zoMqV%/p>uۛ C_,e969/ǧ[ {g<8&Y˰+JєjIh\Q,RԪ*q'hVHPTQh^(TbЍ82X00B70=M yQ.&J+k+˛̞Ӷ8}C 88qN}46i:I8c` - Dzhoq c"Y%ʺ#E`c[z%h,~R8Iݽ;v8^o*pFhj& eBk? xC|]߽=ӝulP}~zp Tf8oxۨ,S/h9a]_#EɚV`!P *W4ƛ.Ch.8=kͣ9R< 8tI9[DJS_#$L㽽 ި,nm%GxfS:@pL&-K]߃zsyӤI [H8HcĨ|)jUʜjuv3K@c@!-1|y\0jq;jt Ř^mP aȆ;~hDi1cǵ]Uab?:uy{%si,3~ {KyI}sŠi"7Yl^`%pq^J'iRTΉ`ao`2殶0a}oZ{d=0PxQlesjWhsza6ݴ=E޶n^+jn;oCiT9>oYCĥTFa܁wIhiXT=QgE2Rz:.W LnƷGΗ }W&Da|e^g]BٟEQ>MՊn_a*)Jdlj+A,`< iC()\: 2P-RIJ8B͛?%G'rBfHȃZCP{RJrBŗ_ەںMQc@łbwV[ ֫2)!Y䬿((VUmi;ӼDо-RQnS{ `_A궦[=_}驗x?#ΐD6>] q X@A32Uw|< % 'Srj]daK9f'qw!"OGYܻ0N2W$1l1ڸۢRAl8rO}. C/:(@ n,ׯ`(aFDwM"|})$b,8[5ޝm_n\7o1JANL̏C۰m.GN)Q>7Y*׻!ZǏ|QXih\ I6!Qq~ m!'^`Ͱ탾:D +dK |>P7fdCUL!ԏ?G|g%_ԛsgO6̛O@s 6Eq`kڻR x)1bB*lYkΝ{%f6aV"9_˲w.^^=*(*sk%Vbů}g A8EBMvZ=iݹ:7d!b<)V= Sc,=ވ|i߻ ZO1ͦO;rO$Z_ ۏq)ŝ 7ñu }zvGn?~CX*g6jװ>Uۻiz/GܽMbrH}B!}tu.F77KK+~s/ <,3d5Ғ66Cxh㼾e(H +M80vz~i*a oy#哥Y͆>U#~.BnYjl9n+%}"0IQG~(W (YCBYj}I@#CWoe󚬹sh<Ғ 5x Be㜈C$a : H'Ź\KC c=6:MG$G(oVyB|isV%YF4@H[B?3CC7f B@7-Xz=]P}0`pJ![h_tq?Rib0'C8+0DPhlu:0"ł$i OEǓN`kȨ} `jz&/ős(a<}sa!jymlX:/dz@-ar| 0Cxw>9<7(w&lJZR}/-8:<Ԫ:c2dMRfoX[*%ͱ\ǀ;~y ZnsXkbN:<&,Q2ir8DO1 3̚MV2E0 Ӣ c޵ӚFN.^00bմihQ,-iih-T%unh*Ohwr& 'qpD9!srzOTezcz'a;{`iﳴ[74 ؓVm⠼^hYW03eHd:ߨ*u媄z%.w>M kd.!&d-[bpr*R) 㳓Ex㘌yeWQoJA4P S(p9 [ve"x?~98A8D5>o]XB)s<7JGv2LY x뛟vy DH}{Fp4c$IW@Gatz)(, kBNg3o?Feԉ3TD5JN `\ZdEHrJAiFⳳ9iB)h0W}B4ƦJF9F=9$q"M,ź;ddսF1aA%2Q>5+jU#5WS8JТX2bknyo?>zP(EVe@ I)`!"V1E507Y5R`JUً/n=Un?}t$N֐b%SOjH=ܹY 젽/a<%(׳ VSpz,(bk5MgQ8HE?W6׊8f3《Ad8p0D$t6%S/N(!ͺ?5݁5*UVRR:tFeYpCKe}3"ZMOgfbldu].hm`XA@Aӳ[//Eٜaq%B`!cl\uK2i_$d&벦ئI~N{;:+>xG%R@g (=TajJyv=s8 x1/ӹkZVhzu"yÚvOYo귯/~Odci)?ѣMKNˁu:E9.d9WB eaf&aHƚ8 IrIO?>plkkղ\>~Xq ]b)P'RT3)i }IK6pjHIgb/B<#<>,EљyX%+0/z\WgR]PS ,I͟EbWrUGC%$Hx P@oU.JWw y'29uODQ̥$;v{v`41 G}ofkF|sdif2fqLKYuepn8\tϳ\ֵP/-gr3n00j3NHHΣGJl>3CS{:TI2e[gӏ 3@)[DrSWMp{{붚 "J̉pswrM })[^Xj]9 bpK!&V3Ŷ[Fs#\|*Spa(*f:IF(Iy 6n5 BCю#dqu$hTY]n6oo>ӆmRb)P]"%ZYQ,Փmwԑ/<MFa,nP9TmWv$V,bR^Q+Dضr nF\YXJk|70[*JUrǷKtMڤ 5hʥp*b-)t:%DN2eRmM2L=o'mX0G}zhumF`\}mY,]_|lW!>~^b+MB6Lӵe`0a*?yOb8F5EU;DVx|Zy!iuͩI@>$f~~Skb(泱:N9`)`$ē2hF8n -/g\:) g4Tсd ;F0S[ۉdbbhn9v=m@S`;B*PI-۠8rq 4fD\wՇ[H'_mT" &0ͽcDJUEJ= /mƪ ޼ Y)^f`e@cJm*ZN_*H,-C]?J/s,}q0b /T"\ڧ(5V|5RL0QE$/e&M5sYf&hՕ: aiXI`GDֵ5\I CFz1_:ni}ҙt@04s\,:ݱ4!QrEb(`CCP؜+T̰}g+; ;h\تc*Q吼wA:rt"1׮goޝBP\>U=X^k7H av w.&K3rk~ZMG2BTZS{.QkV\bQ/]5snTY&#08R( \JΧ %K4]#eUU~x [de T|'!%0ٔسα:!M\ I qYw8ˈOAuGǢx>k_,pFܡg鬣ۗR?vQRgx_%?`cbps*fAxP3eZ6k`ZtSD7w4u H2#O#e,ͦ9$9_{;QX@\)iO>s|RA"#H3 shړ,%`S m,p=ifܮG\X,<a"KIaVMl>9޺{5\#&[ꋫW _(xN)D,gKcLBZH֡XgImSLy㱇 {&i#`Ә\:7Z G=+2i&qouEK@߭aPGM[ﬢw߼+1esN˲\+$8aWo~~S P*DCm[ оX苉HT>S!)F3/ &p~"(v:SmaKhX.xdN O%ăh( 2 #6p Cqv E*{ghXZl{:RGQYRnv,cBP$)AL4v!"(+sW.َ.'6~(D1nFJpx$:e\mGDcV`<ϑ\=o_x3Zs<(kwo>G2F OSM7Ŗoqt?/eK̞0]fˎ%kBvBX>/!t*ɒo=Fwu87AfTBQhoT(J&: HgIvڭ 1<+=OeipJ4'渴_Q,R; з$Yx;jDZh*$I)_4<#嘄Lk<}R%aG eQknQIy.@b^fc``_:8:@yW.zX}>VUDM6;0mNAȳWj5{X#&.1`ܦ2/*; ꜾO\|!6]ɱnrI7@*C:?'G8Hl˩׫\\~8CȽXVmiLy[p!3Cspu0"?&JEsM鼱Pզf4vAU'sWs3Y؁; 7=9)efA(bEJv"0 O0<IYI5=9zy,2^~3~߿ܰ"5FO2*-\"v,Ivۻ ϊBR j. Qv ~0OOǽ}!\V,I)/}f䚴Ԗghf,}c̣?ey0Җ{'Hgȓb> iDKU7VSGč^wۀXVu [sLȶY,|{i+R(oh(QF\YU?o܅Q$]oʪ7pt]m[QK")Rڔd;CHhПۇKQ $n8v<`kXLQHQ߉ˋ|Qeb\]LxebaD%`J\mt yݜ9m_a`=A1]yzsq:CpBr8fBrkp4z2"p$ZKc{^ Q??9`S<'q5_Ȉ)9

w>fAb3g DL.Ʋ&~'Nn 1ȥF"?"8$PPG<sc94ݭaNk]sd0NZ}RVD0ke\cT۩+\)7AJzݶ,KJ'"x&|\c"$9 іq#f%P m/O^*ﮚ,ì|0&wnXm(D֧H2d]K(iWA M^ bDd[".–$d Jo^7{7U[A)LcXI4V-LR| YcJ^nnf7$`xj-ޞ~KK0Mu:%E?, Dj(ۨPYާE`V,(#'O;زr jk/V QcO?/FVuxzxC1LVSpp}~!AUs! {׹\2F±3|@v~ z18H3]k.Dk&hEL$ie; zUR !ѿ_?v?LGϿ˗P<ִ~u_SR5{e IvMq3}𡿓z4MSIH^6o̥N/ak<.d dX)ai.W˒\^~i|10Y^aYIz7#ˢ ofmclo  $YӦidTi`s֋SiK4Qs'!/l{G Cv0A A;WWhYTB6cX` IL1 fͦX; /F}r3oN3+$d&MFOb:ԛꘃFWJpMjC> raO(P FSN nS9qbq&O` @FZч<2B 7["K!gO|J+u"yQ݃( ]U$_UWw'Ӯ9f;!Hee 9)Q&c39~WX,N%P 2f)I<V} 6 nA Ս֖h\Ec59yq+Ǘ9Pd ^bKsywymlsiL=6$&Iƽ?ZH>-QjOe#ё:dT 'qcwCMF0yn{{>;=9}LoBZ{=h\W{h$I JGlh@,_]_v7KlJ0&Uh`mM}P@$B6 Y( STJ'W%!3=4 l'$5x&M=Q+#J4C7n]IiMO/womu:RF*fq2CYO* ,(of9B19`-ܼ3j\瓃w'Ӿ0ĹޫmDD_{G6әng纕t+{CM ;d dMGig_Ԅ"S;q [7V,+e2<.8XkȂ3m](rBIҙ8)q̅H$>CVrr`AǷ?Ĉ:GA{>aOG@ ZØS<8ƥl2k&7ۋ8'IIjG0k618_N$Ij;JRሔWr>:!r)WKG߷)MARKw_NCS0 c"VCHa'V[жwt@4FʣD?`mpz)s,Oc'[*F Ů8IDNb"tyH-^%wkjJg'h2H(5 aaTrxDӴZ\2P}Y;Z}:MeK^o~x|8ub U&֭Ϊ[.31۵j]5dFy%0|XQW56O (z?pb:aÍm9O9)D24:05(մo7˙B, Ō"|̷#ߓ(nӛZ-h*=\:65˳OZl @O1cb.-^;;5LA.UUk BsHv>D  +rZf( b$F5?&zXgmE6Zp2A#enSj.FNTTՍuNmc rѸPt+ӟ~SIwrbAq &`PP^˵JV[^[ߨm,UBƅG0 211HDi8 3@;柦=դV)UYJH7{m/JV`"hu~_?;>=vnߩ%1D]q;&1ɓ3;Ncl+d8?2H Qsi w;ŎB PZckM{5M ӾڤnN֕I-]r-wxGzs?tt"dsA y~*ލE]$XTl[]MA|Ϧ<@? 1ZPexpq7VD8eun -9 N3xSbEB7(cpQw3Npm I^PfstTV*|x|csgosǏ'wa a1P!aZuRy&n4)c%sfݛ|SXk.d^rk8}T^/,,lY q4 $),g,XN|s4WUx 穢W.>|^ q1%C#&_eS鰗L8Vmz}g)L,# ^"H(_)΂2hM[@8&4:7F{x{`*ECIl]aXo4ɱ7쿟NWzn8RUS9 ӯVFwx~X?YºV. Rt _6J7K!ޤKni8hlpAbC eÕ-B Ou,8.tP->X P7*ALdYRscq"G$e*f fd5ns:!~C+O0ӉFr]0| 8Ff{T@ްB8~kl0 HF8)S/$I4-mDBЫB(b.rwFjn"wXwN$Q~$Z2e9i_.)ZPԷF1G~ vx5$Gk\;Np4cJbW?܋Y&n/ YtYxhai"^]zԂ ؋Y"UIa1NkMUAa�Y-5U QcYw_$f^<9vARh _;>`JNT -NDUSLԅq0 ppF؏J `ea}k]W?ۦX ܲ"F g4EQYwVA%d;NJ:پ}鰲6c  {߾ -!eUf#]$ !9j0!k+$!b^˗mc4".Cbc<*3l4ӄdd%3aW;ݴS|<,;!KETAqz+gMͫOWC%"9@A'ŔFŒ\T:j7973j6-ˍ#+ӒN9Y`ddwwQ^~<P*XUex>>X)R![p/0ػ-)L*ܾq5mB6"EI ǵ-j#6o!0IaedaR4Pkoiiϯpy3}H`6VL'h`b_Uݛ"O|'^(lr;a138-55kD xa<,܏z'7:ZNn[E7d́=8O!&8<S7Xb%%/Ϋk71T"]C _hFeꍆZ|ZcLbȭv NJMoKDYe 3Yb1|a.*gLyߦWwҜ*s-W_zg_w7kv_?,<bFYAD)RxϝG18F%VhYIrd*yWБG'<}ڂ'z'R,H7ygUط߾f"Rm6poJ Z:&2{N_NϯήcG!7jኤ!̒("IGݩ)#d0MfMbXД;C3 "`& tyCa-A N3b. va ^t=L(>(7mks)VKmRi/smdx ʆ$Rbspnt 1"T{}(u4j aysDͷxѱ9zӴ>$̀h$\ڡh}O>,5ۯ^]9[*Lҷls:]We =E)*!|ev2v*X~'#0Pq*A'-Yu0^ eRR2(݊ Ňsd]pE2 1lyL9>:F' r0aTYoFSvY؍]Mݴ)> h6Afclj[j(-9\: .9`? n"6DB[T" gU:ؽ[*i[ha/r`Fx6 7R`E@s:Ƿae/%V8AM zB@CQᢐZZDz%}kLm{SrR.(2_LZ:s`.n" ~&=2 ,(8`(=kja >aU-H:4$)D HLc &ɩʴcۨUQ2ee{AO('+<=ٜ <b=/Lf>׫m)/>;y2f3Ʃ aL@u]غ]oБ9*ա[iX-FKr.@7b"&{&S4j Z_q$H)r ?-L  ҉/#p}}ǘؾc/7H׻L},w7zP  T\ΕrJVAhh 嶸mmmS \FaIbi'*)ZX8A~∬!E.JpZghv>otc$!H A3{Nۊ¸"!$j'f&M'y}Ht҉,vBB h!=}W:}`40fN-p wѹږ']Oo^\Z4BR!p0sd+E(e2ϛN@%5%r[d!.x6YIʼȁ٭#W[A dWPv*>d#(: 20o!.ܙ;UZQw݆/ӚE4!.66xx)Ϟ?[9kkjnHD`1N?nY-Urq9JR2g>?g8||VKjAa ^H~T>̥=%}cB`HvDxn01#+e_HAr(JZIVRd!}UEiuo4pj>hb0VEĩl4޿q់q?4al`NpZB&s@C]ڃf !{3gmn´|3̩l(J?E,rn仛Nj0>~HMe0ya$rq_*qK(1C(9vm=M"42" YPrSkbN@R`#%>Ix{u!~M=J=l{KO!5 Azm'Ctla.o|(ol6sŃru:2Vi_ 8 2tבu VSq2Խ}~fWq0wzIj{NKG_I6a>hOlց'# dCӊ{j^(GQ d[|#YQS` #vm5!L*ZXq[W0؄V+_bh>tb==y(r5qWӶL% V{\3C?97 BRLXI|mhPາ,-Wv2q==;kY۴FPG`pVui6LB1&&3H.OFcg& ~*4Gb4I>\Jtr |x7>5bd#T+8-t<%9lc5!k(T Oߝ͹cpL>-/i<DP$H =UsQ+JBۚl bHI^o0eHbӣldGʶm 0 ez۶0!nQ$EvlIVg4z\@HzIںnxȲ,Y5ER\ꎀ@Nmb}ߟzV8 Nƣw?ܮks |ĺ\Q -A0mHJ xq~uxP)`8qn2f! |xx{߅? #YzHDP`f.ϯ ttYs?%p|3{ctm[PѼ FAxA˲4J$~b$BT׽lk@˒" 2<\X xZ왦yNeyP~g<qiRP [dhxI}MkbpBI, h{6 ]{rs2 Fғd<vC$x.d$$]: љ6Namp'Iۤے]@  ! !!ħrfw[MIs78xw4}{ƃ6qİѲ4P4 (#ǹ"V|%f 2D峦t؛'m>OŲgggA_W8J2Fql4)yݚ+Pм (M^kxMx:AE>K~p479>ǐ  Hxg׺n" viY[3%m|{hXv6ԊB@1M{Xbmp -MU 84 JJa:0ܭ1ݛ7VSyᝅ 0ű(|}iۡd ֢n7RXCnFKEY>)u>\K[ g >|T v>/نϿjR۽ Y&S];4K8JзZFLB>Nī+fcr c E\扐@AmFx2IMQb> Ќtpۿ\8,8=oA a|IP,L+r)sDWR˲\0 ^UpTn$[?m?m+U xjM)jؓ,)D Z}F`v?''MAjirQqm/eRHug8J˥u䂼MP/D_GÕ_y `g_ > bQ\m 7qJJ(ym:91 0EX2)X@4NHM& _ϖrswf9 O(? ')JiP8 gu7g`j$Mwz@gzwoo:* F}o}H|]9t6Wǝg0-ˊTwt:ijeOwo'O|Q;~^Vjtۙ9bR-(lRP?:gXŋ*YѢbqx$N;{vdUY v+03T8LHc;`@s{-b$4dhɘ$Õp Mq&ד /WgWNjO㤠4̍7( 3 _KvFXgG,_ 71 P+}i!Ɖg^jT/Ecrg$`"fI6C M ![}i _mxkw粊W*d< `,}Cc])I5B<ñ%,PIBWQ c{Lϥi-$ēuN@MPsA` "(lt{]084LC= hϝ)OF`sln CBB[#{t|hk *uh%jE9 htA8M;Ȋjr۸EhI!g<xt@? foj<ԇJOISdνw bJtrvox\>髹jRKTEt8d@Lp{Ha_E0Ia8ۉkbټ%e*|x#0 z>F0O*9u v6Z R Յ?kML-'10?kM@l`ur5GѴ_L<,^/6zfh޵v~3#hNCr{?+l~t|P2/_sc'*XL|]F+B>CIn |{fvujW|:(\peS V͂q/dϿM0Rjy|0ĕX~ZkZ`(HbFI6,B|"?\xrkl#I+z䢬.n!RtҚ4H,F#\8/{ZߞY71Hrzd&G(X B-9fDR& p\v>^v/jOd9!sL_ vN3ً/~oW*uknz_~2TC](D!= p֪Ba."):c Lsu$^S$x_;'h6<} m;a(4ImfuM񯗈̟ͼa`5,&% %oTQ?vۗZwn]X$e.EG]I+g4 YYtmz6E Q@,1%2Fxs`3mUT#]8HC3F ,OEgQ>&HjRN%̳:<fΪYQ$Ir'l6+}ptfmQ"qBR$%Y; gkE}z7hhQMȞ&vvbk$j!ŝɎ{9wsq`λp8aSA`{ 8x#D]rC$Faُn3= R(6G6'b YgjvHF֛A;j!drAd(9uXb Z{~9TueG)9"wN➐H ^b#t,rS} L&i2[~aH滽&+k; RȚ$Qb<"RUV5Z1"S-T oϏ?84(rq W$vg\RԬ {7f~}M6ft4#(K 3Z}mh9D2W, bS6p8QL܍ LQhLX4J~F泲=hjFq姱[ õ:)x~lâSVSc48CW+y&W#/j9eM"|=Z:,DGO>qhۓ/Dk9{tZP$ǓI$ 7P-y9ahVN˜(pt%maH $!@e[c;It:-^i3ͱ]-Be} \7)1q"ر- p< rؘ# I:%(d2׏B+잶+h泓ϣ[0pmv$ch"e%YFᄩiP rXk :aaCJ\BKj\;,lg4h Tz0C|{2StE-w:/$^b RӲ<S*ā*;8bv\ 8_b[Ԙ,=BQjKSǰJ/wwԥnuh٩غk6VϜ%[vV4˰\PXJQtnjFزq(UkT:ArR(rrƒ8eza{wEQJįg[8t OVK$ܚw _/C &% RQ)^B;?w;WJե*~Fuf6G?1\iʻv@`/"-f$\(PmdqVIba c؏h ѽqo4' /KJ^D^04^@fg0GO0_t /~`rX"T/><~p/0oՙ,0b$p'32h($PDwg4F)LJArVE+ AQ)l*g2Ix8UL,bH5ż}=,9.yۻ tɨM!F@ C>fXrdYf ݇;8ʮ^эx M{uaъKAXpjMeP* /8 KSY4;`*L"$pmݝEI=7h2i:oBxΐa2hE08C,Ƴ 9h,޺nE<ۦ( ]N PG3{:BVҲ4w]>W:O7BcF)(L!(v{[2-o}h,Ɏ,#8;J)GĨێCRti脑0_+( !Gr96ϣOTNNꗍ~5"'?3d;w DSm^q4EFx2_O _[Bp#[sFI1>^6}T©c`}V*d>yRV_߼*g,U;1,Ƽ~) խyXD@ <(ɼ 3/΀d׷񷮐G1d%v/R\@N."ɳϟXSz(DƫbƉ~3_q6rH"VNCkkq{Xl_Yw_?uܐ*"d*%ΖX7Dôm? `ƙ,% O FsmלUƋr3FjZ֠1I1e:vZ/\dzb}O˰xY9NjSy n8$H.rVuSKP$S,fyg̯ 2K'z[Sjije]gz\[nw[+QR%#z߷o<~ndptse!T4V*(R7&p%`w"Q a\@Q$H-9\k~+EW E#1ώ 4jA1Tю{u]*5v]7@UKԸcEהbnB a^\?{N_ lNi ѩT$Om* Z-Z,/e˶qҦ /xiR2i(I$v$^cي}礏ܫst?m~N9wI x1m`^׊B0CXeǧ7f_2(ڰ2fzYZmQ }st# O%(5.<ϳMIIx#0(Erw&PbY:wwe .+9"W6Q([NsX7?.$Dp-G.Lx6͇[SUk* ^(H5k5 I59sE9Ⱥr"mBG:-EeG0!_1זuU=uu l6eQڊ َ3Ηٹ1滯/GQ*0$L+S V{{50΍vS/U-sūp}Ĩ80!\.ͱd |o@nk* Tt!H$3jYysP jEftÙgϞu6]_ōLBg{5-\ׅJbbtgHQ&ۥT8%EX qpkl6X^d<:FF` C_R IA.DJɄL$MwGvZ(1vO>bdLoWkMR1SQ06;mS8S'=6]D#{eRYڋd@yLX6S DQn6j2Nł \ximCUi26V :ڭ .3 ,hW,#4\ ͪv^5ֶZ 6Ҧio?U˵LK`|Pr۞ھYd|:g3d8oqwg8LB:Ͳ*"_or'~EX凣0JXF;H9+{Q&b'=wa:n!Viam%ʒD`/ 1ǃA/8\24ewzݾ6G,9=k3rn4j)%UojƳ0r1tRSݯVӨVe 앧` 6oyI[Fϯ^ 8D('P53|{ƷE+s  ӓb82,R^γd<[L3{Nۊ8V!j08Y&Mi/Sv&3N4SI`l,/Іwo{kg;1Y7Sutp~~u2lwI#g*0BF x'۪}QHQ+ NEvX"DnΗc'ݩ3NHu|6hm_ xxX6[whdB7@V @~EY a۵8痓+.%>b<_ LfbBQ `K(1V-]L_ojNOj ybLy :'ߎC^1#A$_En#WmsQ.2^ _,{9=ʕg/,>RϟV`dCŭ!dq~f-ˎFp `,&LQZ|JH Гiq.]$w`] _r/񢮚^’dLnX#I2&qBԍp\*g}ճT2\ljN3 eM~spQi(b[A9+e !'H )",擛 H0*1i-ָ0`:88x|udz9W!sP.u}ŗ0 "2ͣ.bcĂzlHw_5/4M*Jby҇B x0<%b4H!HsGunZG"x4il v _;0 RJd X#oUs"L uDB2L{`3&y60k8{9D\lTAW8۸L E'Fz>+ooxHXL?a y)h*T//%*1;Ù=l2c&~rf"43Mhꄗ(ItRu#Z7:]:^Eʕfy |uSy,zM!I1:Y4.y^95}?nvꦧV˕7|oNZۓuu~@If.!w4I |Jo.sr|H'2Z Qύt 0KH28\߿.Jxµ<˰GPA2Ptni[qm BHIee]lS5i&MSoôVik;FMP \|rGd0-_Nm%nihˎC9,n(Eeo3t,ƈCŅ D(L 0m'@ȭfjTq\?H(y)O ]㮐Q0'$X9c>Q@4K<.d{ߊ&h3AϋS̛糉iAx,Y6EF眺͛x.N*3SmEU!tP,t&]n7k)$1\s9w{uw`'#&*49s AlaZ)` RD(sar|9Vjn(#At0-T71'vIo7/_sp"LDHNIJ筳ZFh=bxDH0QA;[,l$! | nw'ŏA|M?]38 DgO?c? `HFɏڝ `2u |~w<#CS:\ͣtB#0 X&t]2@D0>yǂL؅EI^^|'y^R mԶ fpߞ""]*ېN ;;{dɚ(-8{Es4I.xװz:Q! +t6[L 7L4΢㻂1붊UI8^QHb"Dr 5Kꍮ`8p8}&d1&$Eg#hZ?<j DEdQcDk*Ì:Gӡ6ӣ#YԁZnӾTIq+l> EX0qrr^請[Oy3#hi!Ba`H3 MrթL]zqB:ef_nVjh vav7%o5ڨlriegp0@@?;m9 }z$`,+^1 fT`I !pÇ'N&BN_^'W*D<%0 g֒m5IH24 3y^Nų13kNۊm V coM6Ӈ3[3dƓNR;Mlc1`1B-IMhs=ft*%pGz*VRC>a>ZΕ41n >˩JmsٸpK u"AN#J1zmZżȲ u\ AH$3)$3\:Xtρ$2M.x / RΑul۴zvսXq%E8 (1Y߰M"öPm2皦TV*R%б 0cVܱ}7 Zwicl,gٺZ3؁#hB҈OJ)"vSyAp#Q2bKb~y$!pc5,- ш+Xs;[&+pE1IxňMPKKϭ/+˥BfUn Jqzm>.qttT,"#]}a W"t)'`?+J ᄢ́,H C"n☔{{QrZ?s:7t#:^ߩLusz3쌚׭;4}KHA8T:6W onb PoGjyEfnuuK07Vu0}jR]F=LLt~=;9=ڦcLtEe$"A(euʙ27(I/2#@զ1,xV ұ˳>{?3[ßԙRj,U k!a':eqat1Y[K<"_N.|ϯU7 |ӯ0}}QGSPff63uD2Aɑ~;P_M ,ag:R,&02IeJeywoW*4EJE'[zGW'3S)v٫?Uuy4842-S;A+EDxʗoL'EA , (&q4S(R(H顷`ZLg2vVd<pD'JuF b9v@ͼ9@l!k2FA˛IbA38^JUJe1mY!dH&H*u,Wx3P7rS~/ mfD(aToѼ;B غmϖW1΁-%rm(gYYERVv~FwAدs2]͉y62D8HH(T'yp|"D^RIfp>eJyȡމ3("8K|Y7n8x*=-]k';糁e& 0bY, Ϣl}{p$n6 p\];uKW61&%82j)VwO'1qX&'l`- W3 4"PPːV+wJ_d>A]l!DQIk[4w;FZM!x%qxzdy|Ḏ73H/GG-ڽj}ymL\1*׋.}x$ Z;<8P=70YĴyɪ)L/&pOσV9W^B`]|ӷ=wT2ekH' ?z%/A:zydoU*}hՠ97\Fdi*Iٙ;{pϏ/+z˱Zd]vbѾ9nwƝ!tݘ* ;3$~Y .$8 1}hHZ}:dH\pHBpTw J6J aړ㋣l,ɬ07'!]g9t1)>E꯴\+Fٵ~`37m>PcYDwL^p=xv$p 6פYGa~Cgh? "O m#0E[{ؒW]'NG(/ͷ&-РH/yְ$RDRdO ,8L8T -F|:Oe+JPH!zsnonojH"0נLIY/꯯QWJ^@dEvc2Xn1^>C(22Svx:k(DVNe+[kvZN`GE_Mf!(ԻMh%C<2]3( a>ul?> MT@4f.A*\Y"Qa<u9R8D0FiC,ˁ]fa"O{'J ~})l8r;fnЁ:Ou> Aj5"TWBl/P1ht46'IB +rI4qӿOM}CQ-IS߶٭ > CA9N$ 8IXlr:Tl~@"㍳˫ 9eZ ytg{yΛ:}l1;?EE.Bľ1*eA$F<\í\\99?9xVnvVkR Йvo.lKڇwD\pg{&"*tG(9/4R / ;nuX CQ@#چJ{xC*Q'VѢ*b?{wz&N䇹WᥕJ.w_kTQ|:v$M\>zzlnWֈH,BS'vYM9bj&Ubtt7#?[2P4yn[S5s( ;O?b9ǟXCzEQuY]Fh#kdC DO܈AȚZ_buε(/ %nomnl!8zz1Itgw #m[gC8EyX M"QAc8Ӣ@2Z, A 8MGb{ 4*hr2hf[m(T1g@,Jv.!V^׹RU(p,)Jdy|ϽjS`;JZ}=nV!7U9)"dFq(0!oP=6FkYBbU8E%kvJ`@NK4<<<;ųSxsOx]7`))Msgf .! g8v9],SSOud#o;G$em2f7eеuZnjT YsEp @01P4^';vh稓q2^3WHO[[ٯ IJ9HtknuAjs}˷ ˅%4 PtmTQ͞DZxM6mE O+*' ك8N4Y=?{>{/{8 K|(Cd\ Ir\D lTq5A#=HQHozZ`Ù IPb(wB8N\'"/A(8r4L~o[P|eD\i(cB'$n,ˁ6hn{vNe8"L>!̩(d']_n{[$n _Aaд>ȉ?hhOwQ(1@! ߟON7rz푺F!³˩7|(WՈzv`$KD2M P&3NĮZ]-QgUb2MʆV[rlE<3#d:mYyIn4kd<@4JcG C<"xIIZ+䋱'ӆeXlP"^F Q1rU^_=\qmVλ#o K v 2Y(s2&r _V"$x{Vi;'jDB6a؞ZiG6 j6yA9aS)W=Q 5YM{#P|_3* 7kL,LSli57W9!Z8Wzwt~-[7(a*UIX9xlg<# K0,Ńe,GP$Xi EĪۉߕeKJ#qi`O4O>ޓ)jg7JȢ\YJ!Z `P[N<+xt~r;uCu z۶(LI\DQ%"XfG6/-hSӢھHZI4˶lkv.W.9ə؏<6ɧL34bJ3)]'Őd)IV%0r B !Go zL&i*2GTm^!.AXG04I$w.M$W7판y˰F#Vh-K.z}ֱK]Z֛qYXrZۏŢ}ߋc! qLtMWVԏx,H]\kJd(_?:p L3 !+3E$4T(|g}{FF6ZJPhپ a""?CsLuWlTzLSs 2@"{=ĦxtI^+x@lDltV5v+Nj㗿:_)$pQOGŒ2MؚEa>}5na)۹y˸+:upKP#5c]9.FMMg2NGlЬ5L)2ӉJǧҴ?e=DIਗk`"6(p999tوHͱ˴  h:Eg-&L#҉ \HNV Z`5y:U$A*Yhh4u_;(Q8Lov($y=g>kn6gOKٰm QQ(=ܯ٬?MRR5_` rfYVo7T3uOMeď& s<En 9ZNXم%4A<LUptfmQIKl˖.m/7+@r@#'6X%J$Eq:3g~!'Kmnn/A 8Y \Yrz!xNU}"$ LɵKfBdj:0jzZfX0 *ҤTBQtYN( P4u\'H.K8rC#H@=–e)7\I8>>KSgVQ3 ]*P1\}9Ld9C4Li@|s~RY*56#mK hWnhvdAtY{<|FN1mvLUCӹ3Ļ#ow-  A[xֹ^}Rgs,V=5{^:wtwa2hmNjϾLC<'罩UGq2o9F$T4[z&K柢?= {ƦB*|;G/ʇcux7Tx"o\-350^9BS))Q޴.}m{^ CwүaQ55AxS6Y(H> `SgeEC bd SYhCVED{ӻq &@%ɋ\Fgu7 ڞTѲgZC.A6Am Pcƽ|:C#|+Sy ðG_kY4F ?||q]Xfux$yA<뻁>'S3iT==;5&^ŭ"!@ 80V~u0ޯP$`%h%hܨR( )x} ,ަT,IR&nj=Q4M "@=ro&!Ɠ\5_ݫ'G۶Ea-EjPÖ$4i(Z3:#7Y5MR wG/ޟ7^ew6 *,0GM[G/l!suQu7aM+<ߴn(f{6**d{Wit(j5cԇb F+bA#q d8bBU!0\j& dx?Os{:u>fði[8$6$FqYAbbDvA`7ӛ{PC8oW8Q4wuR\cwHH<|P&9kIi$)圖KHqkF`81/C}fDBWU$A'*XepGfhCe KVƝ!EvmnoBUk5-Bޠ<9}uvկR|B0'xDNGr%\e?*],V+g-@E1c,q٘ϨT9w3gr/2"O`(I6$ViIZq5]O r6'PzvOɨB&+ v˵4yؿy4tt0E1V "A&^=9xρ hyROsk%N[` r%X91{;DQ|o=+ZP0/1OQ"灲a^R BDhMݷO/v_FQܵLUzaVR)+R@dRaje#`s;Iwk6Rh}X5;ym''1p,-Kkڶ}i M/^龢Cx$#2Lva/&JnD>bP|ͳ~ռl/>6(,0}`,p1-\Iu1-7[IW=U֪Z-Mtp 5MC )("KY#{=[CqSIav]^2e< ᴏg?.GY\K&H1hjwwM6R9D%YEDR\DW`9!yD>ǶWH3Xu[x: fD [N`H0|d98L$SʜP"!hV̸|wKQI ?}:0Z00 ^ZSߝZ2g:x̉xIV667d F6Vd@) Q 6spOyK1gj8~,^;K RQwg}b&A v`s,O =l`F5:{PȖi.7֛ /yc/zfUc[[XCiI>gCnEHC)=WhI􆫱8JVe91V>l>[LFUAGG2<'BN땳9Z?uV`8RXjXVU礬:-ZX.~z68׸z|JAR]ч_a-uWe,|WGe촶/&&ov[\\]^?ψf [4u)ǝטOJ, EmAfP˷y(t<vVt yjiݱMȫ궪; `<0ъ PmTiL!1$06 b;\$Ζ"EXժ5rtƚZmz,}v)dIf{{(C$ٮeI#5"3Z!*x%3kKA)!M][OS#,pTpf2YKY߿. PiwSX(oxZUayk!BSTlo>uFWxJ=O7kB3]_\iG(@:K!Eb:v2_lm#.N-$E,يq$A4Kj{W@ Aқ)q8Vb˒%HkǏ0}7g{¾Cq`Yn4W3BsrN ADS2ѼOY!VՇ6HJo%g2I /|¨krB #M* [h'y< ){dr2W>܊mQ"!,D֐RKD[ B\k*RkTtugyB'!2Qm`>At.`ge)ti.%RܔLɪ߿9:9|鴂n'D;D#x~>KS K|nZ9xe t >fdQB&L3Ԁ2мa( j3|f\O>  `*KVeF*ÚsPb~)K WG =ӧXcB|a ]r>5<'jYN)"ǤɜޟNywlLp]G0[ܘ8!qO,3%6ݽcsd.T-$;?$ 1QA>~ؘ ?fM"u&QW?C~u*&̘|ȶu!CD|Hoߍ5c8`ŻlF|Y:D.wEJץLQ$c >{yġfv79<. V"v+hl2.G9ݬlXiB$Ksf12)#U5}K.AT"%%8r[Z2}yYB&rn6Ͱ4j7v0X9!"" ,3G3іS` ^&T6֮oք@!  JP\fw?|\=>*?bݸ9ZѨ? M. A]L[ 1[wԓ9v1ax(0$,M tU$mYx(d?DUĒ0$G،Y'/k_w{NvCc} "0ĢT].lSiEi6Pw ncS\,_Σm+ D#H X"e]c8l7qdǖjevB/@D=ܹ7EFC0 IQfzZK.WMR2IE)'W%"-MKh_n-li2:;si"%`|(. a&$e)RxH^!<02[j5%w!P_.V`9W-x} "ҩt QR{]twZ2m V-O&N<ې7tE5pPu|CH91S4%Xluw0ȋ#w|:?E^n$H|^B1-k0h4#KesZy̷w6BxjL dlSE3@Fwݦ_xlDi"a^H1*y݋uW6r"Ћyw`5](̱,NϞ?*?O$83LI.S/׷*P$‚U1i9"\myGQ߸!,qc =+utEeU0㛱q$phҷ\@ \(/OHtr4sutHl㭍 Pu\===ꯗ/O$C1 g ;`)|zv7o xגp ktן4_30:GO=Tg,`kB*s3+moVۀDžI|zNʙFG rv|"ENzlj`9Mb^px("{vP,2^SjJԇ*\y,A|IPrf t|/UJ _{krjl#t|KT-Na^B;-C&FUBўZ!#lxzo#ˮN"]xTl-ԣTg EhMWtNEI@d:}s[&ad7U| n~0ƫp4)LLA=ch-#Y8:F L }e1#"mfgb_.8:pg6sv8'i B{$/klk;]ڣ]<1(ϤiVkqC[t.Vf6q3Iiq֓T% #{;}q1L kvX7g'0Qlk0uRH^()K&i!Y8 0% nz_B*Kgθmzm 1DB"[,߲ >d٘t>tQpRYe h*nuo2霰\gl74\`G &|s4+=˜='o7J8+%m/VK.D|3_ke1dHR+lup|{) ! z2cfAEmAP tOmGX|i9K@$ }[@QY#cna{o/]8k_tc,@x$M\Y88> gÃL_816͂zXJ=9Tx q.[(&'$菺.KT) _ JͣV:OάM+ ìƬ0xǓi3U(*7Iu&i&Ş/xa~yt ɯ3q0Mvo0(e\a~ޤbt=;T+],UTΔ |6<#`A$x~f+9Ǜ&f3AmH* AKRlEC ֛uV)B@U};t7嚑iCwAR|Ջ?Ԝ5'g1sl*M뚺FYo&L 2$b!C1E4]L/u}jѹVK)h++1j=o١ hNtVj^ʣsL2RڅfMKl&Ɇi>aQ|\i*9]eܟ½:xp=p;Ƨ{& ж*X;ǣ wOVok&&s.U3,4i 3C2ȝx!Ls@kTzoVE7s(I޹z90woYOOz&2hꕬNbb:xEw%ÄJj!`9s9"Œ0`qI98yl> HӁ{19xoNѪZw4Fzѻ˓c/_tx+ow(#hU bhR.w^W5$ ( 7x()R`ˉ1x;jfL1TtiYTk5˭g?֑"U+)\̷=!%q 1ςZ2,T,gHvmL CR(k,%M6Kq"'`Nv=CL'%H% C|(8N_q7ZJ>g_f/Mx$yfQ̌%eA5CVH XPTR)%08(t)v=[54zsi-arg;vh?}8:??l.+2Ăj6P Iibbɩ)$9 ͇.goV48$n J"YdٱdqPh/? m8C˒-R?8y%.AVT808p ..XQ4En"GcHI,Oc˱jg\ewfw'9# a{2BEp;3,i.b  #<Q"zE=N8MSB WdO[-1eGAW /&0\@!mZAWzzN1U]Cy%/jNs/ ]ܟkP3V2 t !Z xR47K29A^«mH}'rms}Y K?''A?Y& T񱮼)1 UՋX ̃fT4&57餫|/%eS!}4 UȵNrAq`,5?XP Gқ_}{}P,+,qgGu ْ2ˋÝaUz3hTɭwNveu>ۡeZ􃘯*Fۛ[4VFY1%"`~31Zk^|G! YAZ^0:t`>ټ;# OT?wXLL@^۫W4jh>+} Oԑ B{l{6->ýa4ʛiZ2Ǘ i ~(喞Zb:/6wP䥊T=)Ie1WUЀ_(R̞]^]ϭYN-5O@>8s.04ZDiB,foB$%i_̑Q L; J^Ϲ<+HB9{p.(3&wpx^" *,)O2]L0Eu.Nr|"Bnap<}@*Lm`\/XS'y?ύ`˧>Ce2ƙ|`K˽G}>/fJifҧ;]5möl*mvF莺')'q7-#[D;ɱH$n\l$sg{ Jon轋2): ,oV9pR1CEԍ BLRUO xW%v;Er>;t. ^&!P@ScZ}]5T]$9hyY|>?Av=nGƻ@l`MMOsRRŊ?8@P7I?FûWNNy>;",(z8NkjTŇ/ǧuI˲ goVIqH(Y5l+v&nڢAТE_CH,GqekXZ(8y..HoQH AQ".V2eGB<#B&u} WIIVRehx>&XڦxZQr;mh[H8>O?`8sTQ͡Fi=;[ٜU2B{s(|i̍UxtD <,U9l+J˥msѰW J7_e n_Vfj#ml 8KF檵53 .0?G[/ :nka#!#},xRKq>_`Ҩ߿K+ݽWݷ&(Ny]{5P9$  TW( ɘ%^zNNך}X&DP mm|eq\Ei:N ^=T@>W0csJ΂k. "6La#6*CIrŜ"'{\*G 0P}Rslk8/3̣B*җU_[ [9?=SԻ7oƽIijnjkA郟Rŭ3>~$*-?:XӬ$X{}#m͌hc1ETwp_uY)"&93k}OMb WGMl6NP-vz2"'ͧF"(eXe]@}Qgi߶m(;N`@BtYJ\*;yiKޮͫ`g Ş ņjkCDV?ixóM{P``7[G錒s\R1^o0Q%őb_t}q6r9{Y_h љ=iQ#B@[qlg6K;m:I'ʹqO"aY!!W}s~!/^@ WdW?kUM(CaM xXBbD$-dAi CZ$'fDJ3ml0wh(zͱu>>eHvbL̠TC`e/-JH+)t`|>It)t}/| B1j~>CTkhdiQ{]iv #` Jm f93@ǘՇ0?5Fʱm''gh~YMJBh<ʭerYtIL#y Zv7wF}bEw4D&*6I0 s1G߾nTsr>s{F/&?:&88! [;b9Wld29 p蟣GAVqhs`X-@hн8Kaq8Y]s8)y} "ïNKݝ{͓_>/VO-cfe{5zUx1(K9ߦh.Ed%)Hv!`eEWJUAo*Uժ,,,&qv;Nrfw}ދou/كw(Ix-1˄Ci@`O(T,WŌt]% twiCsaJx-ۇ1Ib=v?4G0L⤮txዝ.;@Ljov!sΩ `0D4$!»"9t$ٛӃ!qy,h1KHDq\ߋ] MF9>\Vi[ͅ36C1(A_|:Ȍu<7PO~`ِCAzn!2_ KN4ڔbD8| T5+բk\sr̺U䖶ON`H٩I1Fp o<ߟlRw_z3sLZq!:ػ F#no~}KkD!0U~g%t`8湳mMۢC{W~hiZ* mA- qްUcfG部Sj-R x[<,$q!Q;A_BET$fD,\8@AH>FB~/D.B[lY0(g2ܸ/O l-5ܐ,7]shvcd>߿a|v`ѩt^$Rz[ʖgfF DgF!:N|s[,eI1ITeBdd/EqhRPMuiҤLI֋&mjnm.m҄p`OqO~_t3^5'0nbKx8QF]t˳)>Ipb,BԛU??:ݩ?} 5ӡy!fLt:,K. im5a@p:L}0iJVWq-q"b&[̦b:;{Ziq=,X<ڱ]MӤK9:L|rL"^ܹkkRbZqL05ݼSpQɄıy8H=aVH0z1]ʄ\6VOvl꛾)dzJFzu{37#`mhכh@e=,!}1g_ qe5 y?cc9*΂.v*@~7џ.FAdU6--aA<1'7$@IYAkFR5-2jF)IQF R4 !`|\`W"-ds9ǰrȁ~%`fE `79P(X&|j􋫫qXyxNqY,AXg4D U&{ۮpf}t| ,C",LPƣaR!?.49m+Jk Njd,C3oG۹w4=׽-kF c_+o̦q`;8SD(73 4hUt|e:f>Q(i7Q1T:KFK8Nz΄$0|7< Ϥ@GszNԍ-ӷ&n|;a#J*fWIȏ(?*@ˬδ%$sd Csō[4/Ȑa]'xw\M,~q-e˓4|Y.tM BvVPOg7<Z:1:44 f~NS`oN#YmScd{T0F X I)YO*V*á<#wòQV,_v4ujT^wע(NY~?ϟ ՋbBzooL`uk�.f {D}z쵭r4!F ,pi:)lʄo+Wait1)]y^8^O'N^s[Y>ةtgܶfJAa&)&O0FfVK ZaËνꏧo!Pu$?KNf6HJ9_fiz;NEVah6#_^A<>[se|A^[FC"dMȬ*vki^?3JF"*ȲO[@0~xTs-7KZ\VvY>r[#-JHN6g?`i;;[C/~~x;> K(u(a^-_<89q^vp"r#(&DGy*7̙;{7o>`HD5˅GU^F]o냇X<Zj~SubjN ֌~ma'P"'{}uWb_FGD.еG8SwO? fpv"JĨ|N؀4`DqF}8= 83Jtc2 7\POm#)(.Z-IhACr-PdoSMƉ8mf) @g~$go_Ԗ<v RYP(OYy/RR^#H2>1qdPB`p PP|4AFXJPț1hǛ{bIRļRP,PGRD>ض]+ Ob$&8}Nba &|sꌇnGGr)_g(H,=UD?)& OLt3ha"q,Fe6D1$WWWtzvƈ6C#+8G&8M.o[.(JeAjbNRLWGa_Hjd{l=z =(Nˁ\_Lܸ"Eߚ1(/x|:yZ,ɧgI9 oon3!VomdaWkܿǧwk bS)SV9̓˫z}k1[.[̮|-,4]=SO@8 ]ow_%? -e#$_Sl@DR꫽۾=99eh:eJeTGn-7rk]TX SBh~C J}s}5L^}a%n!_yϐt`jӞ{" (@r)~Q.Jl66xxi0i5Ϣ8J!=wӱ9DZ+X +A|rahϜuMxzOW(.>}n]ݪC{⷗ݟ?UـV?6b=j]Qd7jE_-A!wݩ "d^`h2'bQ:j\gXL_Pyt;A.0\ ǃIo:nOq(4) Ekjnwnog{|2Q{;)jui)}P8̱2,|$b2 ƞ>=Rrl6`,x;!Qy}֐f}k}u8AHx"da&w1us5(e:=n{g'PFX['SGgWX#q" Q حylWH._<#)W  #+YX}q"qaoT*)$M'MG,^kR@_$Aˊd96%p,ǡ j Gs\,g) !s5X,J\g>O @D"(ELH#}˙e]ΐt6!ܢ `8txB ^ʚ>L!Ja>cr1q;|1eõ]̍7s~kI^kw_oIPrA\ۇ,SM#uQ ',QfNe "xJ7/WǧW4DJsPk#U|l貙~udDxbDWsۇuL7u{A2 `(t.MuTX.R|oiCes$jm|[#1[=[^S ˪Lp0~F+ЗiqIU" |v?NY}.*}srro$ZŶ[A!xwڳc? _2T@׮+$\v/0)b= , n/ KZk5"i 48WcY,ER=|ý8;8Иr2MVxdz76KDn"{jPfjY](E#* uJ4"WK,5 zVŸUibN@1ȣ8[^\\2]2n'%jk䌦,ïb؋ LVbܙ]֠3JGaj2bI5nYSlPv[W7Qnto;o,Ԕ[M1_4'm&LCu` /b]am:~tdd& vc f(XqMt*!S0Sa6=\b^Cun?=y(?4Jl&>˙_FPBNhslrY%bkNL`>%Qs10̤'f/N3i!iUc^u{1V8RI>2c΅XYlӦv3* LR^9~r .Jj+9 5)ѴxQ-m;>o ̝>ݽ~sGDz<?:>xOΚsd|z#?< ~p6Ȓ;5#r%mwi:TaY-۱ gj( Cpr;BBIgG5JJYc2Sؖv ˒d7f.ҹ`@t45ƹT#}İDR= >oO]c{o{:`Lѥ¾9\kŝs8liC硪CTY04j6g->b93%Yީ(3GTx:ڭy#|^1TpNY(zlWf@uM sޅ?,?\@#<ex8u̙nKD'opt&Omabm%Y-24a4顷3mwm4!a$`lK6k־Egy[Fl٢i _8G,4<{|&a~}CDI"ix _B -Jc}aA*X+j[%26H.o=[,{jr ѲPFH%  G-\fXGh@/ք:א\Ah-F`HOe*(BdiZ!}8чTLFX~>cd;=wn^lvha)@d h4Dw{_i_ݜ{Q \[,WA>q SԫP O bN#Jڹ 7vM3EVp_!{VwidD{oO(4,CoΨB񛇏81.gCA!ʽ%_3`Fn XƐ UfP: cXMxdLU|"{xn0<9{M9o2$qn _ t7;hE`^+L>x2Thф ClIDs3‚7T c_Yc[+5q6Z8 DNX\]8~䪚TQҔxr SI~U[BQPO,&w߃돊9ZEx| 8g&en_զ!'WZhhac„ wVe&оdvRM9)0,Ũ/td7 ۃ`ǰI=?Or3 $ҙ SMh R!?kOǻ'qjzPB)mmZ'KJejv:vT_Z7[<`Y&]VI{;# xDpVvni/Q$lysP!I~VVH :!B J$Z!§mC(Dr`4oT$U:KbV̰5Q&E0?`2흪,I˛/7lP쫳 qez9V=hrŷb!el`0Mn+sux7Bb:~vt`矒駏::lB:=ҥXqXAr]<QuT׶>/Qvp_5DZD5l5WrmS^0D}#dw}ї'R#2 YsFEL!#뵞1g3c64МD^4g>C4)?y\.o@<ے=(x:ZiL9,@, 2h.U e^c쵳"Ia퇧O<)XI*| DRQ]V\$YplZF@->Լ:](bGL߮!tE*@BBuEd$ b9'!$NT.(% 8$SﭷMuOm C>l:i6hؖy& wv8&XLUтfteOvv ["W%O>.陸ٖҎQ< [>;![sw~EћjFg$V pw=%#VSTA^Kqza=ySP?XC `el2\G`^!Jzm.&=/T*ǿ~ńb`!L@YIs Yu:N8L'򐊄[sTca6&fWKjorT|;6kf&fp̹usN_ދ+Rl4`Xtp-GqB撓b ꇟ~T=뎚IjH ҧC0,ky ې > lc[|.#5ُϢ<{}~ݧ^q?U,˱؀N'`~FV'?)O) O p> ! gr@;d縼#r&qSsO8 {b:;oPk7R'H>_D!%$bB*޽m܏HN= |~XrTd2B4fplR`OR87ٍRu}gdNlxr.eRsbkXL'K^_6g a$P81҃n۽mB2Ꝝk;Š`B6{xk^[PU !EJQxvYV9Lį镀K"/ $(&x+/@#> DFTlomþ4! ֞Sf7w?(bvOʥɭ:զ=~|F3cNI;lzNX4ʸr]T2x<(@[\ uo DpxV$h\u,{yx8].>Tjwv򧓟^!"w~R]3)%nVy]rA*GTwI.R$@כV"KBQח=LMۚ;jm jpXS.;X,bͬ]G ,LwfE,|Xl6g'O3RF`4^Eݛڗwi>peJy׳fӽuw‡j6_bޯ67 )%i)2r)Rd-,Sjoh1p@ӥA@(f˜p٬ 2R$ͿbLd `2X~mXitR֯ގ#1Y.fl fEI)Z,LBktEKO3ڷ3((-HmcIgto%yhris;v Y HBEqf-9wП<_+c2骟al9p`gmx(0KES@')Hrؓ?^e7n>pP{St7 DtV`{XI53#Npi`=j >(*r6:p&d0۝BI$^lg[KB>[CF TRB&cĥzA+jT[ijfATˀ pLjQd2Na0 P.4mZSAO1C3gaRHExXĹg")[: ~ր"04::*c).10rURӅ3{Tr9wj@8TSՕ #)V*=wBeh+ק?>esȂX8}  j\(dOOtWjF'1O\/o/98QIWX@Ae4(_ʖ{ΝL`lt!Ѹ&PG VD;oȱã|NHAJ~uj>*DZn[߫Vlf IMo+nDa/O7Lon?a3 AӹEx|cFa)!meXbJb[T+rJ rP6yQn8z%Db(YjԭO9h%PLB`s,٢( 0r!Q(OTuqyqMRm#$|1-]1*g匐0T3%%fSnZMw+\Ncqtخla3EՕl1{tX,wkk5!0Itv7Vq~dx2֯?.@MHG B5EmPчǏ^u¡PB >y.BU# }m7<ՄI+q-? +Toko8 P5#"QWRb ;{MޠWSȒߐ {)&Ё=ܣ\Ni X8sR:luݕ6,W0XE$dD&Φ8'%(5T!/Gg|mE?e*EjV"6AkwޫC˃/L P,B '7DSX5[kB )QnYj0 -~xpa.~4B *q|y{m'\)GԨ3©{]m X PW3}=iu]Guer aaoPeONNڑ'QƔ IQ@t l;{RN[VhJ[,joF(A6ͱT:ɔ_=iN]u5iVY$Ld;fͭJ۷O|&QAt{r>'2B 趐,񚥍'It)v#B蹮Hel5ٿ}K"RӞeJܩn߾t9)f)=x:z+Zςr ٍLwM$ՒPST\Mm/m 9{Yb f[y #E (i:3@tKo+נ鉣:EHZSbO)&R ,ϡpRN!E1Q+EDIb!.gd2kH`f;@2;IKKlfg/OϏ? smN 0x *`c̡&Mim;/w?uli&Mb4FATT@ëy.Д̄$'3\>'RG#4%Hq$QCtjj$!Z>{eV+#H ٓg0Qw.C@AV!lQ*AݎnZ5YF1EpArf~SDo"7C'E Sݲ %ܙջ4x^J+N˥Un)M&4E2$p CRdeOjϾBdT!qD>B0A g|,)c.~V"1zӞ@jO?y8C{O`oMCPrh( )3BKenRT i};7A9ȗv |FUǚ{{:MP&$%SFbE+WAv{$[3g]7ge~lJǡi83}/|W!T.*lwyF6 EDlIP4- òL&AӠX|w]5tf8XrӒRXyIReb_Ze GGܩ<ן0"BVh*`F\rR.#{_Ti047oA8^xQ츎\r-¡7C3!9K* Rcd&EAMzf {vW,J2d =0fI2> Ϩw fgRQFto(y`q12cҞMҥvG n/|>v^ބ/jውpt&m[Q,fJdYY ǻ˦rlH`b*p3l$b්_mV "WgY>,+ ..S#0\qk_X'}xQ/6 PTR!6!7#N0>:+.<ۚ.}*i^?lIiq{գJ8묐.|dBs1|j?}5|,/(h* -оZnHy*Ns:C(J1T2>xms0s`2L[jU>0k{GcѤ;?_p~ӏOx:I? 'xKJ |cu^8,nxBd]}bܵo=A0VY5Rr`N^M#mpX?ڄϦ BqԳ܃!ՕF"yTV׵JSd$XP t̆iضi@@ (X{Ds7"˷Fu; IOm#EEQ%єp&vRI"@ZmW}{($iW؉o[EMmo~C Xq%D.%#O/79;P(.)BNpM7_IDٰt6愢h{VYn(^^>.We(~";E8P飯 liOiƢ4].9tꧯjuO.af-,<!- >kg/VﭬoWbÈ4w4}߷bQ<?xsʧr ,.WVfQ\{gA(}oaMb"Ju:B-\v/R)si7 Bq%@fj83&0\9Jtӷx :Az+eyqڼgi+4=ˁ r^&qJIhRYۛdOzWf2U}%_A(s2G&yfbXv}܃yb"oF糋&sTE j[i*wkL &l6չ9~U˚7RعFMԜ=MAgNqb%p {;WҰ7tpOU Nw!|:<(w`~ (,]uVNDof , CCd0!v\(l'T]x|dw G|7HqznG \KB}z}PQ#RW ˫<Ǖ"%Ab3>HRxEdP,#s@+RvgJB#7%ٓCcZOgHGw{[8MDTbv{{RZ^Ȭ "#օ?L&$ l8do,el#XZ[iLS,W0 O`M.9~ yRdp_/rn뙦3fԓn+ 6瞼D! %*^mD^(IHl5Kf>>Q_gUg A89U0xvr!46lPmc+nս8Zx (sPPscNjbw[_8SuQK+kY+TZՓd;c]u/G1QdȤ4]ӭ[L "2,ֲW_Ga;QDfNS\Sun~WFH)}xٶON 'dCPj!."DڲJ4O1Q^w52=۷WJehvD;oEGr>jB(<%n o)@4]u6S $(1(^@t.]Kd#˗+|$bCl:@їr!%m; 0t4Ek+ HiTwTl3l; UzeųTFL$ȯ:'3C3@c c3da @|8\ >hF(m-ppV}LeTg$@…H^n0,ni\A޻)Z͝g?x>A/Хp*C G:lčj PhwדӍ%IԜ4{tx溣6K@2x0,Eh-ejզon.OI֨Es:1L{0}wYIICAHp&`0ii;Ӧk4؎,_}stF`8uS ћvGf\G`e9P{c}!P`1YdD>D>d2eex SѓTik96P>%![GPsȇEhEJ9 iZ=DӲ?\ P oB|$O՛ϰ99qTl]+Ño{vRZ=Nͥ "@.2'3IAvMd$N\AbA23KXz^9uX֪T*$?zNax DF|whFM*ŝ5b5K?BzM8xo:K&q! G/ vU.EGu0+bI2>L:Z-/><覺Ɛlөmc2]|k`ӹF%I 4:TqHQ^S"yn<)Bau.Sk3F$-䭕=gbT*{F a`N$A qTcp43,-JR.[a=X&`͵X" 'rvDlSBSuRTu]$^ʴ񋧇'livk5]ΝJOӗg[6!)~_"WJoҷj`{LB2_["(M"B>6X G#Þʩ%GPL%h RRY[|fgr_o5͛/[rP8H@("7e8͍CqL l kg@p6!n-924Y|כ/'⯿yh[j훷!,/PNbn*r5,Mu4}7br0D'BwW@@Kߍx5~=kGXt;g6oM 8')**К kiZN{\;Iž6) 6׎c@S ׷W\pEZX]·W+gw_>]|~Z@ғ/(Vq$@ZagK'% ØT6Z8F\^^ Yg03`p5)뷎ߋluiTNO/ w{'4rqо>pq'AZ~X7% f+M,׬ߜҫ/l^1W,JvE6 ! 2]o$8 }>](*EcRJ4gdYAw͕y70'=|խi`u*R2x4Y%Y!z0R]o@Q8>{pc0捆Ơ?ڽh|NsRFSη?4-,)`"Pz@5l#E1o;HU2b@uPJ"Ҹ̻U G/|xs~}&qny]#0QSyu %Zo>${}umfNYv3\l.P\VbLx3QvZ9beScQ5\\l4B buSBQ-_ce)ʱ/v{ qgS}<eX&R'oxUgr6+D eB_g}}j-M%9QTuhi:Ŏ+Yи8l3E l$ @$^J%"}d8߽wy^P0oͅXk:۳q"-mF.y35.$wr˹=)VVB44kJ];'cgi'R*~mpjʣJbtߺmSAŭVchz;GbllLo2xy #1ׇ,(iD-m6nϋ t;0(1Q ' ofblh\|/~ /d[ f(FVab &EE:p3|,V ˌU{j;6Ttˀ#qP"rf-vEW5o0l[h l#~d> А&8FZ-ґ.B^r:ض.oo4^i`DRNJNQǝEgYJJBtTշw{y_`ruK9%p$9~3SZjQm<$c 0m m͊sy1N<%+geݨ~ IQ8|(j "BmX>q=ęn dQ ~A˅$drQ)C1~w~҈[mplj?__Q?=T69V`hfip \,kNYhvnyj|FRdi!|@JZ 3!rx=ATaLCOL" KVW7m+ml3 ZZf?N?Wi4M:jm,MW<  6`m ?p9\`e Β(ؚ'XjJ0p1(^y@K>| ݮ4 A$N-ӚȊ8&(CG-AOTfCd[aF6}֤EYG)$i)+s2Lfco %y1'4{Ca'~`j>+<}/~K9~AWZ!o ԬN1^_gƋW;bJfbZF̌GMmH>?pHaa۱q RN/_c\̳@KVRfs}fA%GڮMQ:mgȲTzT:;xro߷./ih6ʒ(v]2纾۷\LҵzV뵁bOuy r0z*IfSSx'@b\]9 If}sYH GW[W!?= B.% Rߛ}nAw  WE*[p. ,e90{uP 8|?CQPխpi#Y3*?i~vZKJ< ,dhh+m0x\0 5\~Xy?^$DNΩ@KR4ƕz 9.\6Ih~q#Za8BC۹|ţdLFI]Nc[ѻōϥ{JNS!nhww$A<|zS2 (Dl:XBam9LFjЖXAԃz2 Ciʅ ݿ^ ^Pdz /dBeCiZ. (g?z`U},ʹgrSmٖ;''%X$Օwsx,NdzRJ{l&fh2z&wtY bhy @ѹma'01`IתZ4vSslhm#IJN |g>=kBM&|LI^; [b3乽9׾C98{[LJ9lMai{fcJQ.łeڝ6XLl!B-P8QF"CES VjEHQIC`lV9* ͒ ™_|`f%]a+U# 0{i#xA5q-t:`FL.ĎxTƲ{clu]35kF!<=u;r8Baxr".Ŵ`TRvA:DIzQ.e G; rPN-ލal1MyvYj&F;"rRs_mޝ__ϒ sk9!UV5p9_l\Xg?2^;DCqf-Q\jDy \vw^Qԉ oC(:oK!N pt,/F9fs>EiHMJQ4w3n-?.+l=SsLӰ[I%IKbV"bDL}䩱Xn[a0w-JRr8<Vscr?{uyTm=h$o.%:}ūs` uYyo ?"Է`yÙ0u:NLG#Suj%UZ Afݪø(ekXo6XRPXtj,:,:]аe3 ༲4VE8QQT 䯷G?|:]!YQ PSrY?gxv5c2d. Ns@ww>89M:(9{ t3,e_y H-}uV |~vRؒpL|ƲLj _δ9m+ W0&13gt2O{N4Mیkg'cbV$]W?@_y#G9xq]&6XfNYNF(z c\OrxӴbX$z?Qh ḳǶ:ZU:AǛ3i P'03QRg,eɕ3eM Mx2u\j49AFa>8~E#FcPWt㑤h[(Y.dB e9/Bьg_y|Ef[*^Rϐ ptͮA2!5m1gF: y/ @`헅]_D"E`r)R_EXb &-!6;N<vthnus a "ֶ3wPa~yqn k?>dOw̦< 2/5 ãˑd*'ey2^^Q{.\Di Ze ,."*ĄL|Y齃}F[Zj%qmk؊|Ӌq8c*V}yyqez !N܇2t+T*B:}uVn۾q..! z궡B򔠛ۿd 5F֧TsiC4bqc(Rh Қsmս}ETQYZTq-b\S|*Ffx;T2x\h"{} h0^sf!boL3I&9t&^:642lM:v v" %W:Gۇ?|CbxƸDi=&BI_3NMD&JD6FR (#jQ:|jjMbJLC? &+b?@?lb}ܺMq^!r|ܵ]U@`T("Sd H6)zsrprVEp39PT9c'v2(Kp.ZMh!!o:O.jji bjYxN1 z1ϋJYS^|k&F^lt֞)8(|3yiVWGG?|bh[`ܟ#.R,D2-4)mWKҋl$V]qGp;p΍қCoJR8F?دw^n`J'ԆZ]W8N`̅L8&[wVdY=(riv"fk:] <;| 0ƓѨדi锃F>dK3뭎0ٵK 7t &)4z'sa<%[4W-… tFgh*zvzCXB"J#hƎP/\WW Ќ.jO{^AΆӄA1Y6*+ZM@M~yxG%"k0@ $G;UQQ$mo̦ä/p@1ͦYQm"#Y2`x7 fsYkegawp|PSMqBSD;_1\95/"|&{0/ߞ=7C*]_ޕLg5 q,WKē$MscNgc˱y "+|J^-]ۍR?0pf%Qٵe(ޏY,CSKyY-E3t`svorP }zxCޏb)pr쎴噳4aCAe`>VmB?ˎ.t$stŶ;Ӗn8"gw_Q r2Z#I:=44vϗg _xɾk}nFX?˽7)sPMW=^|~Z9[6a(Gv&bnrJ$LB}-( bYt 4VȂ 835g,z9Ri!CfCK!WMo*x{V}o>[h,i 4[Hgv S8<xj"-SERh{Gyp3r'7;wl67lFYJ(Ċb$kU0 Imܚi: 䌦-Pk-xD'2hW!9OpRIfTMmw;SV<6(f@LJ 4KCp^.h1E>h\SDjEM Dg_n(GkEU+UbT,@tš0ZsXϝJfa/0#!2^l8!!z,Ԟ<)ݶv$_˻G2TMYJda\!]J$S-|JwF! fqGPt$<Up0(p*^+BA0|`w?q̑x'Y(Ou,VͭlbY:U_Pt^h$֬;=z^Wjш4L;[qyL΢s4DsF$[e$O`2)"NA']0FBXe!ʪIa)w`p6ن0%pP+7yebEƹyG/s$a6&F@oKJ5Zq:)ƌgx Gwn> 1!S|g灤Thnن&7wzd_]nwmw6><-&JuGgbDE rM!#۵Vo6FY7S{Vi\dI)}$u{sG 8U*#Nr=&%R"7+u`+ݙۑ?9*jyk?~6w|=bhTJ}JrDP*4o^~]{X ɮ׎I.ۏ&mbpy9WTMRS}d3$l%ozvW38DG/>}u?WWZwoYe ,zw񖖘.Z?T+=q"^XI@Z Zʙj(%E2`A9xP"96 d3^KTY-rF[VIDҵaξ4웧SdRjV_[$&qOs|*z "A ;Mࠗ8@4FHr! Cߵ2=^NGc>3)m6VJ13twawuƗ!2R܉{~j8 A)>ԹkVLobd,YaM( .NbcչMA7fʅ㈢a(K 4#VlcYVG>ӂN W d:39Eu "r:~^<;n4jQb(:洭( - !hAll ƎnƓ4ɴ6:IǮl !! !={}=Mgb8 f.Djy(ݷj$#D(1+lR)I`(m[}ql"&:(O4VvW)_\$g"YQ|d`m`6@#$8o9MbjNYO3Z\Bjvzy+4 P Ahz9?[^Xصㄈԕ޾S3{|6s}i:k.Q砇aH^u'>aۺt蓕bq-?wIQH y߮Xϯ \~Jf%:SnWftoo742XB$`rgcX.lC`>t{g;!6ibAuכaBltlPu5 EPP =ՉQDSiYDiYBm_RH J8v؜ή0⟊Y>\}nuٌCC$\w,x,~9XB$koqϣlְ֬\N.4z-I}yg1NOlj]ߖ;\,ȅYBq1&Aݸ>2@I=sO,uRPȫT6R>xP!c'h^>+Çjզ-"謇lv3<4j8{x"q:P]ǒ|:=.#DLqAСiH A 6,8BG!qӉl2IɊ FB'j j$$Mt7by6߾U|rk}uvlTYZDx>*]KgjJ42\o5N,alΣ>҂4l|P ^q뙟_Buiq:uj7M5Eۮ3sg#_N2w'X"þgG G'3ntk˸S[|l kf6(!*l~.]}8HfL_|!t3]?>pt.i[a b. GMlҦn&mo:mҪIFI4%i!llﰿ}|ǓzӴAѝm#)+ZAp G2P4qf#s|wrQ:w'y`Z(+֫o;qwq`)3ERB*Q `4yQDUpY\\ㄗeY 5M!f o^m"$M P 8nRS->/ G:C`[Z]/oIA6y1vALR`3ɤqS(0!̟fr|ćnV曎-t$^?oh|i_W5h ~t1`ɨg8^2,@ҙImC /-Sҭ"AzMQ6X>zDhh1X/N'5IydQ)6 Xh8*<޺&|k nj2 NEu'mڕ< sᯅ۸{{ԙ_fZVF\d%/.)Գ3l{SxcEn(>?~%!kRqX؏  w OP zW 9$"$ϏڧqSԆM3f(kf.2i_Y%@Pf]q ;**<@#|BkRl* r$US ,Na/D DKbe9 Bg6(K T5xcˀKb B?Pj X|@'d61R2{(|zbvn3gYM:ŭ 'YMzmFah4Dq4rU5'ѭէͦ*֫|oz  46uQFpv-_CٳBdasu3 8:v18i*rkvn r c*v rJ!f">-{?c!~)'}&n&2Kēbm0q4xGao2Շ\,isFDž$.ts`;I鑾v iq'8BB]:b} Y8J{ZoEmYAaDѻGu*H@} V^d`b\~͛9u<6NOyL|ժR"~Z%tS1EӲL[w1Aʠ*c,M}m8 `n*I ,"zST:/|VzwQEKy^29{|=(><Р ;=Elk#r HD^ar&ie{x(θMlx7J3'X,07BPSաIlvlO;3E8³ '1QQn.@1T.%P kj FMM7'R\'LVd<l|.aګ,^2cG$O(sϏi蚮# ֦.`SQ7 |ilq.kjz]!$-A?O\K&h]Qre[ ڜor P^㒩XJY;d XRp<`1,#Aq@NTH! E`]@) v⼯,_P0ؠ>^Yl۵kXd\"mx{ >4r,9޼~wz`%X 2=a pd=„=!A"ft1@XR+~IT5s~ܡbCna)z\wğ_} B>M1WR1bZ^V. >}}KL^؃{0/vU*XY4 VJRPַCӉR3)ՐoeS}pKO qK`OƠxi?#&J<Y?x(ggŃG ɕj_x,E06v^{ ƴڬ8{SC0H  d|xMpD$v{{{p$"e['j>'lxAA6F5o[IdZM@6u\!H)U~{tc䲂(  vhJRCdLz*AZ"qDz7oZm |n|VfcP.ڑp8xOư~өIxeeQY8  _(8納0K tFi8nSҿN3I&v|6S ˢˌ>kOыfqg7wgd[w<@1fEYyσOH-Z/s@R 't;ztRuq!Κ6p7}]P KZk45G|ЎaXJI oެjcc  =7, Bp<]-$YJqږq\Z)܋:)NfĤkȜV5H|]]nN0iV&p J1K8Y 9fϧa[k꣙Y[bJdKrK8ɺn!+XLu'`⣏Ufi%#!+ap*8D 顋zvēbRb؏ ݞuZNdyd{ި93}bA=R@L I@qy۶;#A9RT"`i!E 4nyDZ69ϗ *$#8z_յ+˜,zwI<ŭ;rEvMoՎX[ 9Covz_*H M`y5M3{D\l`]̧"( {O()IPAEkfyjc3.g7s1cCsTÑ׫ +g;|o`0"~G0Xxqe f#SL&41烃^{&)旋 6e!%gwɌYʘ bk5@]>_"7 ˵$CR%RXYmY2 3/w*]LRz쇝 |]f r9td$#qK/SZc gc\e@鿜~Arl2Qi H B_*ztJa)\#4P\|;'ekHUg}_Nn߫49rñ,lH p"ne:tD`Lo6ҫٌk}iѼП+2= RF)!fQ3A`&HD(EFmGV\|ė'C`>Tnv!KX]l<++H*>-\ $CC0 ,|st:Xup: zIW5*Ac0q`;ff6cܫU~#*@&_Tίq~_O3Qh- xeOYăR~ O'N [UZmBTd}~k>MbY_:Gf|ÇsOxm7ǭ66WhTEm ?1P@;D.cQyI1<9xit!&*)QoN6k"-{+\|m=a WlcI:r>-R7w??)LFbǂ{(XQr:aYc|yD- \~r7Avk5Hٻxu)MZv_HQd*ʦs·Va7sgM\yw^D2MR((J45EWq&PX3Wk{\ƛt&ك;D"jZ0&Jz#=Ш&E踃v|,,!y t4|T=͇6V-y-ϭ 2H<>zSUkah*M498!HΨEۼapF:/uO pnݣsB1:^΋@混x_䧧?hw8=)-EQԩjE1q"@:Ԟ<_7@KGT.OaYmM<{(ry\>5t=D8qƶָ~rN !<4}Йu̸ΊکW-JY2',X[c?8:߶(s(.(Q-;cǎ4i^ PCE"IC8^dYIJ)\`潙|t`^oD1F C7` aR=<[lOLtl6EZlcmeٻwNNw Wk[I2WȲR+U3)&';]f^61IO$7qˇm&O˛&N&$+ "kh8̝{+7KYܚN` * ˜+ iX/V/Bzܠ;ujVߨ^t?] dn.rkx8c' uiw vH'?==4W)% (ar4 2Ɋ̛yBlݳ ]qTmTE|f dzgcvc^.Luttp4"C LElJi@>~jWzY sm_|tW疼z0ZModlZ c8t"l4sBI%%0*Σ9X+2xs1!H6XY@Jet$0PznXi+C}f&yQ6EW(1(TRN"wua+ W]BY*;tzUMK'o伄`軓|-nz(u\*o0rnB| & CE)jr3!sZ9h[B@~O%QKgO%qu2E\>HxvK B8| !S4U' u6 1Q&Bɻ'8P.%"ʰӫs*E,A1$`j&#M3n |ۤI~=kM"AgD&( шt!CRxmyB凟 BL]::3L*$I۰pZR}?f?EӒ #pP--(lÃ`hl wl:+`5p}ه1ڕ64M|')Z<FsV%! ڐ,kL$NӺ4iڍ:` ,Z@IH˻^~wF9IL3ǚ5NJI %mVDGD0t~&$F2$(afة"r0ΰ krV{/58  TB*(fJ'91=V3FvW[9[AiӪ_8sWV'1pTRϪx t3e'_c]ᢂnSҧfڴ߿?_ouت־MJWmNHxnlXH@?99,Y 0i);e˶+gau V $O,cD)h6JZjod:XHbBdH޷}Y3nf Vd)uE('2ʤ d@*b}M2;w1"iRLHX5hxJrzRj̴d2Ykz,L_!vGV9o6R*'smh bHym Yi(EFt:%ˊ l) Gp;L<ϙ, 0Q~m0L!lI8ʜp2w>OwAU8i6]o6ecphz9A@eD"8p3{n߻ 7_k'@[;"#_=?YU}>_`L&i>0z!_v| `:a< bgwej|);H<4n{m9EQgO1p+fr#S 4uAACtVfӚWOv%p"|{sg Fm헅,lU>o>A~'R2/$Tjb8H'u xG! {# Q`<$!x*7[5LxJdaR;Z6\!Ju:@st ו̣.MPXxko>Q! zvl6u^^)z#FW xqvٯb34@|]KhLq01mg$0@锚HKX=e7낮aҦ?L5{qQ&6v\rfC |/v Tk}(:洭( #! HEfC㤙~tҙ'iSo``0"ܫsy5Wz 3uggM !n-sgBnuQpT( #NbPsEPUM)s,zbP iz<{_n6'!flAypUAtt*!ӈ KW*jԽ<\~ҸmTGz>H&R0tқGf`X fbj 6ϲ /թ8nh~{\| [(S䟗W9JY#fXI9ĉ Y[Rh1]bOms@A9\y]U]mf:)NJPH|k_/G'Ӑu݀0!s:f${0|<#L,amvGz!8C[:@,;b0[}7lYU1LlWBX>a`oh۷}&f\T%ɆaYTx!O'Lܺӹ~s*$0Zlh_9da_o-(&60 m=Ƌ;Y7Iyt"Pex5?S[s;NXYNlqqce6vV@hb@BIm_ߚl0y,Tn'p2A1,GwûNCݹAŠh.?+ZCQ&k!;~~\7M g8E2g7}7DV{c[Gc1, /vz0}l@ޟ^DB&e$@wtif/Z(Cw>~pyC8I[g4J\YkyО& J鍺 -븞fc 75,h7m(gzޏ?H m+x d,5#1?_~c#'-F-s&K!GD$!jb\\rXړYMWo#35<G( ZW.k׃p|DH'2b:Q(ѽ^? Qͥ6L'R{ >ONgb^ȕ h6-E$Q4*D_!;D۪<_.FE5h/ LVŀ;TBkO> aȽc#2BL qj~v bijo~V;5O}Gay]\pޙ;S jƦ@oTW.?LK˾֮{l,mYLW k|h@E5E"1":U ElC D,ɪD[5)+m ;xL{ۍz{= j ?|+P9S @WdG$q>Or;_D\l" h<f*F/gQ=|s4+R!IpbĞ97y]x"P)#gmy՝*$!ԍ-@vK Se/j#&RT9S~c 9GFi6Q>F/߽`I5-0[dh=CSq!V,lDs-T'bda{|iJE݀#aecJkFq,[mQS`,0#\o<縎j3r @al*sm.$K{Et2ÏRDγ:[`! 'OSy@N7[L17&^B¾'vZ{w%7j [:K CxŭhgF71W 0.N}x<~zv^0 X1ν6]J%sU5 okC\[X$$>}2@uWAvWsmӊ1`\i6VRIS:iO}ʪSr~7m{G s~|AƣaNTJ{J; ln$ :d 6qw<M F;Q;ee1Wx۸;4sk\ { TmZ7`{ȕrTd!eoܩǖ4Rbq7x8 d"<`^!{( +gE8tLxZkV+S;5>\-lPRD䲕gWKhZpM7;T bkliQ$n$=JH V[k& R M\$L[)%Ȱl~ F}"Dy9[s}[b8Iehnz\%l١ikA Z t@vM}MD4**.y{4t] ‘Ԯ8::wEw7A,ԅ1]5iϥ.pH9F\X|:Ne t.&i!n@Y, Hn&7DdKDZ+T5„G&?%Dzz"jpPofKŌ f4 \2@Vs" Œ ݐ0x49џD46ף@ҧWK APƽI"/ "Fzkh0*bj~T=>AG' ~ߩ`X!6S l,ME1j6]_?g3p߼V C7MQ.ځP BI& ʊ&c%W;EЍhcA,a%Y6h3Ty8 dc6^?8:ﴍ8$$# $&dNl'iSOoML`  b mru7G#X]DPzmf?ON ]^Z.PNcY'E%nvH$U:CĨ Ң;vTZIvY: Q \^al\w -y vo63X럎Nzw&4_'amy1-giuw.8aJc$B@Ÿq ⎳KXe[p!v_z3_g玱"$ >bLQUw؊ eh (+(9@0T1v8 K+mIZ-<;^.9ݙw6nП蒜6E]~vr.V\0zYeFn>={83 yEbP~Yq/dƞo,{Έ Ǯ)epp>t<aL4NumQs-Q 0H SN@hXVZ^1=k`1/)8<Ԓ4+eVȫ]68|xt2I`2Lrn6Rei$*#d!S*|r>(>YJbRBT{Y + A!P(Ǵa翜ۃgO9J CQ"(C)X@<dE%`.๿=~38ADy&E[~6~~O(/O sO<}s֤8zj[LCd~K>sVQ.?.ƟXX 0#$8{Gpwܩhz'؛ jKkTi#"G,4(M޼ޙ3, Ks%1rzjTaZ,_.,s)%$4[NcL : #m\m|i^}Oth,yPP2LJa$/8 $ 4G%xi{W(ai{n'OdC1PT,?ݣ^ĬKДDFpg7`rVg_Τm+¤YIq)ɚص M&)h,. t٠iqıɖ,Jf "{p9wҏL `51I |=ȳjuE(T~ܟUD~ݳR'?A*rrݮ3*-.#{ r""+[sGȵakpC'쵥բXedWki7j1Y:+ )/$՝hS(z|;}mxv^tRUtVvc / IG- hL,H&I '#48z $WVDVy 5(sDlt4M"q)Ke#jO_+:@M8g xwstI#]ƞ *9_ukG\\mR>פ@XRQB!c G\ b@e8({DZƋ `դ$(Kq"flЛ\E$=f]$M}v[k/n^ ^eo|)/nT)0e>y.f痃K۰yyaen`+ZګacpI.!;]FZBRG̑Z{"5:?)<ُ߇!T!" 8G|bn =? )x|o.]g$H`h((˴h4!OrʾQ빲S{3M,+ly鴽j![*#ﵴ/3onø˲.˧$۱8 a L?|B) P:tڄ4!mNb;/ɖd[M?l :/Jš\m4U8 0,3,P H8ͭZR?\W]ofA˒aq>Ll6"6=#dѨX+B.OwɫkHIB4yj"6IHWXߏru|{=yv\_kb+1!{q==z~K,[]5t<+Kw笮 <}0"SN?t>6=4h خm7o0,.e0f*HNԂ0>臖%`%k2_;8z=>MLڋ\d2ٽGo/:6k$Gy>.!{75RRRHPS*G6tmVDI,tիWB'HcSbqOY)[+t/}QK ;*4 c.qoRlq_^A;Eܪ=aF` Ćg=CѼg7n8֞φ&isVu$$!Ђ@qv&3tƓNb'cdowYs)46 vGVїNcu?_8֬,h+(k7Z%%u'so|wvm-e{kg0>zPe\ْz@=8Opt:0|*\bPW:-Y$6&Υ>rۋ$_Dxam<.kAXfV!j[ 2an"./N'ˋۛ–*҃1LjKdnmb#X.¿ }ԁTcɃ>-`[Ζ#w1D"j*Q$iDT0c!Y# (REHg ίȬ\>9y>_|FN iƕY&͌$w#{X5TJ8L2 Eq2 |~fJ׫ՁrK^?|rڎbBʴyK#YI~J"tSc|jBB7c' H<黗"UY'bMIx=ϧ^>\gEEBJkeG}Y إeJ\]F\BT˵"cc=_%ȎKGRJ($nlw{/ hA9>?#1rdKEIzvwyh"jmK?xwC($PL,);]<*.F6mz3 ֛˚Bdʝz¶],akQDUͨ*Wŝ}D .ɳl'i~YRZ(ӗSYmolg A| oElIq?@~hTUcĺX8N؜shQ뎅 %Q((+GV+G߼)+]cN>9kr愙ILg* 1K"A X瞳crD)hj;sݨ|EINa(IUT7+@(EIIeFjP\;ېu, ! V{>OҴ-Ool;}~M ,PuW2Igo;%\^^y!8 aiC\^jlK2  to.A7BP@(AjZ651e"YDJS\q\)'qqDZ"i P,z^5z%agY|7UϿ9&OlM+ #.EcI-E7}ֶIgN'h$:E޵X $@ fxÿ|\$yFDF^ޮ<-(*%-{EL6˗)\'o[3€%u67o0"-EX.wN4,ۜ'81N'6lYEYŽr7^sߒy| &|{ۺyu\wxW} R-Q$WWy~,j1ÑMg޴^_Z&>ǡ()V?{y4AA{}{}vxw3P:=Jdh] 15g./nnoGA@9Q8ֺgovJ EAy㼪l8$JprvhEgs.t 2"!z  o(*LKSeeFJ[ő*tww8k0t"mk ΌLsHRiOjֽD }snZXz޷֧lf9aOro wnng4B>>' ?ͰMcaȕ0[iwyN0q(i}fm/dJ˰EMvnʛ.5]pyX(rNIBeBiX'A< \gf_]! ^eIR[UJ9 <x"Srڪmmm}x-`96G"\bQrY Yy o8mTvvky%p=zi N_dǚ:׬X K˟,8Fsq_m Tarˀ, h q8(Z9' zHQ\#;1/d.Y?ܬV~xoWdD/E&D@Fcfl;;>_{v4ݚMMbԶ"(p9~9COi!VʳV N`6]**Ä ˥/D1g*&J4fZsU!ʜ'k7pm?̘26ܢ9=CB]n $78W76nR`~߲]P.QqMHt-$LptuX΁VˌpÓnPkmqʜ^Aa2_bCj^zux@9+T*n DPT?xr]K waңdEtc:ݻCµ/? "7T&g) o-PK.֞2u v.C5ۍ@P)[mid1M]L'T8+u,Xb. m~DőMD NMEMz]{_&uESK?v;Ίi#1aeT{q<)cҎKfhV}'4ת,{ gI ␫(F[):6ċxUZ.ѥ~6x#(- l}:zӇlV!Q^l60;7 !/^*Og/c0ChJAJ$reYl7:ISY"ku-\fDZ0 i14  "HvLPLŝ G 37POJ`(,3h 拑e`B"tg3:x"0#8,Ð϶ cD\%pҲe_e{HU..5ZeyHBRP)7V㾧' l؟֤(Xq]K3"Aq AJ:7r*WpB&DB}џ!]QQVޛuriPRDGqxf9C4]bŌ LƧyǟ3JWz 0)K]N}ǟL@XO\br~}{r=mK=o)ytPީͻ= {4הt:i4.f-'&ŰL6LYjFC!_^}w8˗v;{#ݛ]CjOR0 sw{T*( F?qӠ->e`&h65ʪD\)WJKAHJ'Gg֛ax6ÖH2!Ni;UUOzJݮ^U3%jL !,x=Td};Ӵ9;?B~a,>+sX7_G7jXЗ֋7wy4ɤHYQrqɛl!<7}7.Lb5:K$PJ"CRaRS@_C׽ڱwcz<NJhgY{B=[ mcQW( ĥnfWjea1!Zi&g?yO~i\]t=gZ-5eZ b8gSYHQX3fFF,7=8$p -">NAxq_6M{`Y,D$쮜njJ5AX-l^8tڞxXu2 Byu7Ճl/ێSؒfj >\D~C q<OYh75p"`ܸR63Yṵ̈}ٕY^e@xX=biV'@r;- (2"dV-LbaSyqaTUv*F3p+/d4ْ䝅-HNfMi5FΞ3 hKykay Py)1h$q ׈.&*L&tWc},RyǫUY&}_uM:L!iM2(!)*Cz$CZoن߯`WEc1 rŌF1 O7h>lwhD|'u\-TaݾO3o,-l%EV]ox|zݔL xYK(pWG&Dm2\4/zf}ۉyJrZ̲ޝb 4zCaX#S┺%3l圲I)VZ /pd<J~^x&FV=럗 }{W-cjnV PX,Ry+m@);jZ/˹m(Jv4vע* \"Iwfaa{]u0ㄲ8J w'=7‘>*(׿SMMfh g#xHO/wwR^՞@Ĕb -{qsiG s|1Wdy ך5{Rav/h:Tca.a2D̛.t~ۺ{/&[9nf:֧\VEta,=AH (0h/%/}W?nV?L YOR9EVT yC7M $+DL JNeUoY8<,tߜy9XV?U\%>)$Q Cֈ#~*LDH0}¥;|>9na|,{/sI{,l:/R)(rfBA.iﶂ~Tu_`( Dp0̝j5Z0^a4bXas8iZ,@+[m0 s6Q$tJq]=Ms8ZB$k'IRmx]1!CJ%A Z\Uk_[/kfC'2 Vh1O$JJ)!?s1,I,GNX HUeQI8a/;;ɞro%ABKmU@=u@)C=aZ Sc! Մmˋ dZ1 Xˬ:۶N#QSp3Nb1cpaHly)@1c,<^/خ+fYI /0NY6ϰD42gT<~t LIID r _dY@5j(:ݶ8sCIIԲhIv:( 4 KcQ $u4iOɖ5M7{s~}}9b+xŒ"~##7az`p?w0? ݋tStr5R7yNÑ֑e-X?N}\P5&f6u`\T$F1&i,fPk 2O4P'i6^e&ӄOùwUǣuT՘2h?lcGi\e{#,:Q<2|mkB0xj ZV0W%c5  ڮ;wʱ30۹E AE0!x2Ts g$f24stpr4,=͇+XU}-*! 6:Ge$\G!6ʵYQ+o}=HVcZ_<'8ۮޛtaeU,#"Zj#,#;b2{ҋۭBCt2{ۧ_Ѽ]j_䲪|zoU \|/bc:V^ 0BKwa/F|(,LïyϮ):Yz{xKfme'Wؚ8Y/iew}̄W,WYJ Е1XO'g/?}-yYR5M+>70^gL*t|Qy90p #uc(V S W4"BYE}#B6a,%πr0G&41y(͊ףx9BFfkP( %o J^fr=H s#,XֶJu" h1GA58Qnzp9zThV2ݭ'p8 qqv&ImH@ FgՋ 4bjU^m`i:$xIdZ3r^dȁ.)σ: !?yk5u}kwJx~vޝuSòLP;e"Ԟ[ȟk"XA&D0x XߤYt.9]oa1C^M.ܼ^a^rAW3aBQp 3 7[RJDbc׷/+Y1خ"+\]0MHGM8:8mć"fvӡPtia7 0hr5ZiڴK&M6iI]׺5 r0·=xzWU$uĺ Ҝ-Ӆ4BG }Nd~e^^ȐV"lP,St^y^{k3_L08R c(ePT,g36lLpKrY\s<دvI߷,.z kpu&A=VBb8J|. A Gꋏ?}p"\zc$N#pu/勫lyD1 udZ)V%]Ted k5o0*br~|6? D\%hY#3sd\ΓX$BD-&Ƥ?Oٍ6Yr]MMr\!o1,ҡe8@F)?|T%wxj5s&JE1r# SRykh&%ǻ ~ߵ@Y< 1!4g%.eb9 nLAx1{HD/TcmŢ([E 'M, ,@!$Aħ/Y6aJ 3tpv!cU9"$Lci < Y˲sLq*Hn_N"1u@!5:?0x |?d)cB G$L:R9A,=|tΟy weH+$D9Ƹ;ڛI>S˭MћzzivL<ħL^R/޵NE).3޺- Cf)Z'  ,Ơt5Ii_v(} jГxHfJ |XXXS5ج,tݠi' `AD#Xҹ?y={ן}ip9x<:o{.tl{c&$RT4BFq`C(Kʋ6 AθӉ}w(v؀j[d犞whMDsi1z|;a:]mUS()S= Q[qWSPtfM[Q.kv1aiv:C;>-3 B!//t/z3w=|{Ƈbi!xPxg P͛X>#4P +{6Շ=55C766u0LU#%=([gJEhf?`ԈΫl6q, 552 J#\(핹Z eәtf#ʤzU-H3`n>| ZO\{r!R"y#vFCqg5&ŝY-džjtGv ;Lc>ʷ۝ߴdL_u/﮼H#2ƖrM$hZ6Xɲn0"\3jP@s AQ˷(~gP(flM%s`jrlA3Y*AXlWIδ1uv|a iꮉJxoڵ8wGb(:綉0ڲòS$s5u!m`+3|e(6@@Ҵ$vSeɒejv7Yk㷗˳OSwRoa S^~s7uaרxlikD0ے-eWDS_Zj&"$0HIR6P})TRt>,Jb9S_!z/1:VʗF988x nEm[Xsg<Ba$LYk|9E_86.t2HStl."Nޝv;=!+Kl ª ˱FQ9NV_%qRԹj}GoVe>LRlZWuEQQlO={w,w6|1uDxǡ/\\HT:]B8N& iA%yЛ'SuwXUoirv!k ϥ UvR\Y᫶Xa9EQrgv麩T2A hF(6a Ge&(26ETmàcL:4~"z(|ETM&cs]l6%qRCW7,0拇?4J+)2F{ӹ5 -LfQ ;d"SRڽf)o$y߾DeuǛXV!nOrB~ؗT9"%t0S3[8Z6ɧ>ߟ/y*J.nolB8ck!jؖmCqh*Nǘx 2dƯzwߗ _g\55wyBC(h)Z&i6/ejf>cixosl" 틃<!"Tv*[ki>i˥at*qHQ" dY(0:K>(J٨na7vѽSiBwr0 K) p(~0D0Qpvݕ\@3] nl\T SMHByuhsã'e_yq9@[IT|.t5GwVse@͚_M'CiQJ=,nlNfBBv{{Ȁz-`zM r{7:իd Bgl&X$Ld\1a>Dfb.@ UǴJ̒4\jBZ^~eHF. /assV H`,KܗN6}i}Ig:^2Ng8c&V$! %7it̽@O~Z]*5Y}qr@`b\6ݫ_y`I*kJkcsgki,.w`4mV4xIe"XeU4}`"ѵ}0ZT8ҭM38LȮhSNqkgR ÐGO>gK>>C断i|T4ǒGGGcu<ڲMӱAg,hrj $@qÏ? @0~)F[+ɲniu]LGvC0x[!fltnbmH̓b1ʰ{B&1'ԫs7gS˃J_*T&I>G8bXY\83iMqtd O?ۚWIṊM~{{s Ud. B8,jBbsba{ ';%Iꎻ7{{t/3D1ZRá5&V8NPs<%bEZ9|~~(f~y3ʠ/^}AY1\ Z.⃝,vpAi!r #:"'p6A$ rPU*)jeʳ=dLTtN&YR[-Wc_ I 9d2X{qUX bcihLr zB^&l>:+ˣ i Ih}! v'/PĠ?<;goNRL&RtP_a}:I&(Fi*ђTY 'S#P E `hnkA8l5WKE\eZvBiEtmkT*[loLaY[cMgʉr994T*mnHt} Nm^٫ Ӷo_ C $$v]V&/[[ZM=ԦI\@v/oxR$[__[N)%< 66ѧ#M2T,AH!ow<52cv?/$Xp;WXw<ϲmf XVr)x gh3qþ9(e~P{=]qbg/BSܛP\ن3ONj7uν]Qf:6]N`|K Ph1M'4 0\Uc6fJ+rxi ғ=4:K??[fso'\e!<-h|0; g,"c2q j2-` :hQh(B؎˻{k8G)lF>^hFMM/ E LT-55\]G G(k[ s_Zf36@3B%8$E!Ob66 %c,kcu۸DžlqMj0(%pj(׺^^"0zj0z}=@y7|@d?}Y~;GWI4`a@\Jhew4&4VeBς19+%i^ WouOU˷5wBlJ%,,ag8DN ZCДrs]uY!0LUxIE?~.5?hml-OIwzi@ `o,q\7LBs֪f~jWΕuO?r+ EAg{b(EMShA7'5S_@`P.OUޭܞqN\wu@/^!zPA Aia.LE>+2Nib߲|Y\^ڇ]jFH d YHYX6bsEa`AZEx#PqY6=qwK.9JR,.}z+B>~ʓp ѿpti[aւ60;xki'δӟ_:I3Mq6&8B%! !-{Є'"[RcttJLcMЭkprQH[iǣ ^>wOCH? xT ?^$*;/Sl"NÛct8<a!uXVa6\) yr5䥝b<s` I[@r|.&DL+)WKJ {At+^w?{>zaV^T9r X/߾{Zw3>\U\UkR2[LG1` usY-<W' mB M-8"T6tWXY Z_ܩR(T!qRX.{؟οFsfތ9>ʳx>(pA?Bsac ףb.M'm9SE_!x4-f Ź|K_#yIBl2L:ݼC~HAecF"Avo ~#E(zк2.Gkv hwp#Ykb-ӏjeBb$?lf%W'cb*6dO $T-m UUnERe8׭l,*'#eSsh 4 D0u˥0rmpLrX^mESܵ@°?ԱWReYV3]M`0,mFlz3e nCTBHZqѹ\NRP8 f2 &x"$(ʒH3 Oռ?&Bel"\ʙ/3qBmAڣж:-!.XyLCʤQkP&(dR}ȓn +0ǽAFe.4[i!5Gs%oSktjk?xtıNgy)Yصdw˲v3YI-B< Р;[v]'+\-ox6em826k%^ٽYY/(V jV, ro.RKN ̓vl썙bo4AFlN>Ogscf̒ .fJݽ?KoxqG8POJS1cUQ\C 05-@mEA*?ozΟ@- QEm2$Iv)¤*2pR'hۇmm}~9M)l[a.9GTFNv1> ~p#lEwr`+zF=Q*bgH%b1?nz˜B{VҾ̮\s}z'1Uj"%{PSjeimۉضlE W5xAVoJb(qIbY14+ltWمbHx0kcU*O.j== Wr"p8vp$aP~t֧*(;?aĶ\'Fʉ+'/A؛[^EUgF9̋=c1/=mGBZ-~6 ,&VIe?zQ$JB7vvrcX0Ӷyӿ ib{1;o ^S1c̄8ƽ%bivmqiegFNS. XZ4Z!ɹetn&a?Cp ]>┃%A"pLzQM#թH In+DKןvsNdi/&߷V&X HʬH1p2$PLV}|'jiB(6+,D׋"'<6ЀW9no!x <ĝ1(8-"IP0gv>[xWk-"+E4: N3_L}2i)kI" G֫5Dn;ҏtZ((,jxZXZZ.AbKR^~+e])-fKUg'_#_600-X$f E&r|&vAbT%L>#`0%V&4I0o<*(%\\yKHFسDpxs 䕣D.׫,QQ 7cw Har ή~AHMk7r'B ̞6@:,l!N"֋J)ҏBcYHR3Xxxhwoՠ*6hŘwd'c iXL0n=v|elOȞ$ r3+Lˆ!"#v;^ܑHi} %ᡩW)c❸ك_$IgSGRV i}>~RRX)iP5h_Կݷyy{Jr0 P ٮVRى@#0dr5qR- r5:o~~7%`i"]'4 3/%Aq:"3Y0 e0:y/Va9([(6MAD'N.9Fgo5Fƙu ;M2ytcjZ[vlAPX-:J9򥒪b0l<% h;BO9_ է&R<"lۼ~<=߇!yU\fTKB[eQsnμɌqﲷ΢|$,[=uuA 8NVKPx0Bh oC+%plM"%rTh4`:ߝTퟗW;]FpְM=} ʁdQOε7m+6o &K&!ifSiNmj,]҄4! |rrś [M,'qusq#,ңTB'}GcIqlF a~>Odd q"2SF 4F) ȡC @GqB^=k I~+1"8I)#%$YL!]jr߿*j!<\KgsYt-JH`|]C}goDBK?Ύ^ ȏG>q ҙB9E ŠTV}\?n[7i£D1qŜ34FԊN} B+Ac l.4(T{ ٖ}v}vx.)W.d)X "|9>fчt}aQ~+##Hg Ǭ`٣G(*a!̌ZhZ.Tr00l2Kv@~a'|| D򵑚SOUcD^%>Ralj1mKTܴʹpVQ ǎ~|o'# $xsRₒ]iGEo֣ U2\z\rŢx!!:9ﺭ44s[B+4XEg}{-!ӨhŬ9iß_sv-IVp 1CpWAQ]O꣯M!>XhP&8.2@snMo9[\X_.RS:Y & C]1Vzyϵ}Oь=}C) pKEtx֪R-/}'P5i* iJ'p9-L60.KnuXvb"vW~00Sf B %[%[[7z>Ӯt}M/񡢪؃=Ud9?P|($zi BAdpl$b ]`Q0%K2I8qr:6@Kt<` yغ-'a4~-N`/;mǷkXWN,^T͑h߿fs-V*UBssCq_i9z@AW.( ؉ί6P BQ1; .'}wz!ZZfm]4i|vx?f`Z}CST@~vJ/;?}3F0-$0Ȋ^ASpx Qlh[<{#wJbt!"I`*=Ndil `YxUú2*$@w^,GOU EU(3x8Z~!9o6c"%Mk} ,j]9&a ZXC3]aof8 -yC*q7˚z)BuǕ*a ϑ)Ke5aBQ,TYƺ蠦Nϖ `XTͻK^ I "=/FtN4 g-gгLAc3Eh}2ѠB),G,2 4aZ}*y}M%[QK;$oje7NZb]׽hziI^I>'wR*|nE76pz:f7MO+0ETxzH޼vOrN=h~kDQ\QjrqgQ]V$A2G1w85 eԊAߝZY2уL&8˺%˒,|hH`”0^JK IĖć.K%dß{gggSdUmz FP\4 |rEH0jzS4I=pt[8Q  8)77 s%ؑj2\ku IRjU\.% NIb\A"NTzvv"P"ac2"-qpeVK~Q\ӯnDxCS6+/ͳ@)RINqdq_-*(r _mM,"BP, 0;=HzWvWFԜh\W4˶ { \A/UE _Ms:(jgY{h8M?3s+hYAmSF>rC的9=xL`zm|;};+K>l) D[lUU(aǏtjg;HB@r SZ>Gَ.UBd-ZJ6;7MqYƥоZ??x1[vVՃm!'B&[h.MsP$1uh'S1u*Ac,Fآ92sh݉HD3%F L [Dw Jy0)=AȮ6˳' ft9_,4iMXa( 6 !  @Ş|D`E`eg-]*۽ X+S[;g嶵Vb,Mh Ƿmlm 8wScDP+2a[MAǧ ̹) '!z\M%j,__SUTKP-1`r1I`+ 01Z} )Pٳե۳Gn|GcAxx;β׿UPJ*jś;֛ Ɗ%Nsnƶ 2_Lj1k7HmГ| ݿP&PkP0ǭ.rPMxp-lx8(FQ: k$ CCU$?8:6 sK]mNl7Mδi/q;Iq\eG@ K a^vg箻L,B UD2Ys&pd? \UY,Z4,Uk(lyA $NZLQO7"FcoP8+ |\V o -X8y7`q©=L}31sd2%l Kh@O *l]w⪩g?Rڥou(gxh&SSF"P˖yt0v2hI~ 2 °(SDE$(fu"Vx /HSw |GdG|s\Tk<{|W?}AxKMUeF#(p{L)VrW 3vQD]PJj͗VV.#ɶ^"h;(UO>)1.6$M$idZ!F JqxQ9yͅ,ř$Ƶ;~8{p56DHt؃~,nm-߼\_5aR^>ZF!t hoB=Zfiӯ +2,zEV_]aMן5<ܧ u2^!Ztsr])w'?>VQgCMyjr8,d4hWM(>lnCARi$x4GoI2#$9-wz7}#Y˞qP\߾| W!)`3i\WpiTꕩ AgQq-2Q;&lZCe7oIVǰGO8 [w' /^M sv\R>!\YiG^ن"7n_:߿lT$GqfKR^B:-li!cAWQ- iAޔ{O'~{/6GcfY3'^fY$ߪp:}CA* k<D5)g% 03a% FB&'3{NیHB xmtv;ЙKI4qilp.Z^o9'6FqcprnkոY$AT;hXԡ./;j[#wrWĆ8A {7'\& d8ΚH`Ч|&xΈuc6yq@g8b(^;M5TnЍQMDv h;}ʕbtǧAukg[!Q"ijvz=_W5}O],Cߐ)AyP]U6ד?2d0YVF8+ o+JXj`m֋s0(+*ǟ_.wP޴,^^yb2[wl\0/ޭA)b Gs=XfA`2nBE|dM\Ď1Z)S/WEH;-Q>M;'L_u33}vbJ  qb,W6$Ѳ,V9xI.Y,Y!hH9V6k?˄xAw^r`0 틢[ˉP z e}_Ib&FHmR:^8u=jÂZ&PWh7 c>[1#4Ht:V5mҡ;IX!'b&7&m>#.g λ89 m\M!B#vFVW3;vPϵr]N3:m@L297jEȩGA+c:~[F*0BTQq,dgyO̷^<Τ8 4W_&b{1[?PLTj^ْᛏT3c}|}{bt4C`lmCNb[I%͗'Ay )2G;zwy +Ͼ~F nS*$B|s}G*IZihbxv***N'qz[YVjc<=}q˯?ROO8_\,ȎSH|q21} g[N[T*$iY-FXxr~r>'+Pn4@WպnnAaԘ}UJ*%Mi06h'> EexEjRqv46&(BqRn͍l`<{#Hڮ"vZPɷ0rڃZITf9~DP('Hh9.aW}q wkmKR^?6'?"svn[ZҰ=W%I?'NΊO۵9zk_9P?\.ZQ )WC&NvĖ,[ -, !ýs~* B^x xD5)IZVw0t;3gjEp\HJ}~uPL:—$HaylݷGMB3Q+eǙ- qd/TL >Ox]ahrf0O./0 Df %]==?|t{ M7PՂ::j*|a%U֏ߨ"XxmY6:=t. ?'O%>/~E}Sm쫝]J R2 =le5Wa#enR.Cuu Gjq緳;#g씕 \|*"]m^@GT`xmS)H Рx~ |'."ҡe#2$&4`dXUWr ODV q0=\^XCϞw:FŒhw !n @l$2d)&90 $VJl-'gŢ-\o"ZEsZӾYDz-J`Z@ %r4j ĖRo^q*P"f >5"87͕I>>:p.f""._݌+ڡך<0['[sU{XɁis 9+|̋#n>ЋoB!%{wvw}tȒ,~sVglV?* jlu91^0=;, X/9"v!Kܷ}ZN(JyP "«访KFb6*࿣O@_Y$e"a1V$C֓b6wk>YΖ5{uCO m.ou|9H(siny`"@n.,"q_yWTb @:G_]Յe ѹc9l2" p9ɅD) NOs !R$(0C¦*l=C0u]{r\4H=B R(F6R]6#Ssr|Tu ILL(0a!t|w{T۝R/B'}0kkOvh+ƵiLn~aQxE,毞?z;}O2Sir,B"}9]`y^نܢYͳKMSgʚۦ[/ e3:+L MI&Nc;^M$K4s%s}瞃䟶*c G8_28RBI,6ѲZr f\^9sO{yXx`>!D* )[ӫjcY 2/eJJdx7XSd;rBAn\}țQ+R۽!JN"ޤ `!edăM0LD{)7,nڍjUh9X-??CLL60o.s,G&DiZ)mUQVQ%ifd7,,, x}cwj[iF>?3 1'}YV l* z^)2If,??"RHjzک4 #@wx9o E !f48>!JbI>S4 , V% 7Ɲ} O4]dq!+JL!]$G[a:sGwNgҢq[x> N|m1`KES$yqԍ2Vg{]%/k[na*recI7,sDNv9HŻhcJ4! [~v\H_7OwG\ݱl`6˛|1Ӽݽ8(L\+g,!;JN(EP"q G1]q8 LQT][3MG[ W?UczkQ56URbl,#5(^{Q WF^9#(p [̈́N-M.ծ<&Sʁ~?= "K1GgSTZE.?j#?^PUr4|ߪ*I dЂZHب6{ /X(~\0)RVX0[Ln՛Τ !Lb$aJ+ԇJkMEۊVq(li/르UuC[j»%y8D4 ܄-$4!H*z0!A\/BE\GѻV< i%@01]Wm ʗm >m ˆW\{wZ踃)j6tL( EgY[g*TՏh ofLrrՍNƗJQ~Q$c>Y=OU{h:foGQx"%Kev-$I^Jbӛ~{o7vZ|t |e(T˱lS$}aW3lǶHպOg`^DI}6>8n;{[}?x|@Taqo8uV`<υ!@ÒTBR1#Ds\.`2k1(9uBpξk x =m)ySFP p&#DG.,M :y0S$*7f "F$( a 8 w@I ],8lҡԼhrelwJWwW%20Bf%ccy;vPWeuڗ껗<C7Y1Ťtd ZA铩6Gx^D:A΍C$]Sysvz+B>`f \Ód0}6nB2M}o51d JxA4g^n)I1$BF,g,{mW?\s3[xDh,&ԇ~y-wݖcI ᒜ\JW@wY9$:S p^7ljUk4=~,k)mC5 )8}bIbLdf~+ASs߼V՞W^\RE!bPh8ČIݕ TzM蠩Zu\,gyGܹ8`Z Vq2vpbuνy{P0(]otmE$O飩mest]慠[(9P M#"WŷA@\$M hԟA h^NFcxay`Mu\7t?O%2l9(ZbiREH\\@ D[V`p+ q/Z뫭 4߿@IZڱ$f̽ڞ=pAO6cDLfYvB5?ӌkĕ8l~#ɋl6-ycqgI@޼{}?`3{ꁯ ˵5~| }b2C=۵B,ԞfKyL̨fY)Y1s&qB> oo;x8CJݎr<)@DNC>.p{2<9d:3G-t[XE4MuՅ `m\`>xun:/EK3YbWIUV>[<㏾ߔdWޖ=,U]Y^A`J"i<Γ8c2p"qv|V2Ѡ' ~uo_|l5jG|r*|zhx4=x$1 fǝA{k"bߛ\&kL&@5u6vՅZnJHǶgrYZhC2ptk1)&R vUj)Mdx#`Nնkz,I\d0 Mɳ'tSmQ ixeCo%šP<g[dJ`b ̾Z)ʭ-׵ $@B(ѻ`t98yTq+ J'ImOkļI"BZm N;wgq!ˋB%E?jt)t1& |O@гF]27;~ he9Axbqe\Zy{p4Y@)&\/-}2`O)d:[cmʐǩDptiaB!!qbrn;f֙;Nq66u $!$B?Ѿh@IInۉa&dT 8˩"Ǻޒ  K8Lv1ؽ; $*'ˡaς( >`2D8a0q %H$<78tRd"0$ 4b$ (~QGD ht>MR 2@ѱd 9l2B(Dyp^I?䩄'SH%tظ]y\H󘏦y!$A=nD4)2t1y+ެofs/LU.(8dg4ᢜi,0x6< \4 *`qo[ۥ;DFէe샇\<{wBWm#p|ZF2y<76Z}hwޑ u9S' Duw]`0O6KypI%〦;GPXt5Yҹ0MBHZhұnNЗ֩zJ" ͱ7z2Z]XھS۩%q˙nMbѣO BW_Z/}/߃tXڝxJ#]LoڇTeiC10D]/ʹݽ]Vo#h`qG ׄf]rwRsSdt>㏷wu p}<^[opղVL3/2\RyIP8gw݀@r >_q U> aLPoSӊF4e)0 1C A~\[b}U_`H7+&=a< 4Meʙ0[ }GPT4[GQ ocK,aaPB>`$ضM\huD7b? bX (cCKI(r2IR)QhN jeíA{ ,ܚ6 H`-ėNi;m'[_ۗeڗδim's$$ @Y}ݳg E/jmb.0l!v4]`0d)] Xb$]冮` [}?Q/j?כ( ㍣F^ ᐡAGH^<` Cyp4q$G:r0%\{cz>[|Id,W d #2F_57.tx @7B Up9(1m/'i+ۯ5;Gգ8:` yKp_Vu`ϭd4ffkR!&Q 6%7/tY~KFr+M"glkޟ,X/GOf7h4^;;kC6`St0ͭ~d^\&#mJ?U-+E2UҬȁ3gyxt0 k+_8;̧NҲi1@Yv?~Fe BܵVcn3qIa]a&B"Xd^#Tߩ±T9*E>@bرl o'DTyim_usN@ gN  +p"J^nPib}l)ʴ=:>>?8Vjwl9G m9*r("@46@w1[߽ey˷Wd|tV1%}E l79G=T3ii"$J<fv5\tdf/o1PUkev+Q?}T.y28bdN+p& љ5mEX;$-mI3C?/3mN&qlc1 fHBZ^U3h{#{w_ 04VW^aB,|Y&}$'r/?Oa>eE@4xw`%BQ 8P bšKPJE~0MooB%CZh3J. o(, d:N>ďA~:8t:|>b;Eu ^=֓Msn8r\ReD*Qw{킘 XdJ\Z83iCDr{˯E {(?<(|Ȕ/ZgM,4j m* ,a*#ȣ檆 \gc3p՝ bv{lLl 8Qs,>חЪBk 蹼h><7MӞ S;:80Yt #^$X_C77\2(E 4CR0!f(bvfEc܈+J艪A`du|nmC@d-)`P B1mժuMS!n4vw^ L^od( A ,#21ᤀR48>&<\?x(\A/Hq<ԯv>|Y+tIr d Z/?~'pɭU{Ծrz73MC19\H*r5UĐվ6Iy15bKzԪA\d R >x$& /W;ˡtt UJ ƀKZBTq$ F*kk(3oUja8ɦ 5H*]i.O+D6Y`V SdB sUo#8²QoښΎ v80^,$ER겅8n gm.A؆aI$޹\n_ns?̙An}h<R= Bуn }'덖(fBa>7f=p*̚0$D&[ڃ]"N,b(m~Q*Sq~!+fv(Fp>rw [#4`JBۣ]BUJ YFdcc7V(gʦfb>4E<]F5/W Pxq+v0 atX" zQ Fqckt5M{$(I2B}@KHޭ$Ks/EvV%$ 38!N"{A8;@)n9]X/:mOu6ŵ~}l/mE+j'ܕ7͓ēgƒ@/m ոN3yly1H]E[Vms68r[*Ĥ㐄tU1nzZ 5!{ A쀨=lۺWok7:BuVh?Wgu*\ "ĸP1z^j/ fq4'?}|ߣѽ.e/+Q<F6bEŠdq֠;b}ǵa7_Ψk4n׊fNwoJJgQgqYA˵<\.'\:T fB)A"dgyLȪl;嶯o17dܡ0L  6dD8|bN=Bߩfb\kFJQƚ$᳙tz/FQ*y|]DF[~ lget(G HJeJ w4s%OqVD-DU֝ D>Ja'{Pٛ5 z~{8b8\g|#h.KC< 4{^ MZ^ FR<7>ƻXkZ&`ajp4ʕ?znMK.sU7ff^0ܶ3mg(]j㣥k(ӧ_[x"VM׽^MW9*nN,`ҐD]wmL"B V;. *6||>mpin׶AhȇcBV}Ps0/,T:V~Ө5䧏W|ךd&1.l2Cedmh=Lhb*:jOPt+u'<+*>rfm°t!B4 7&F8\\+0*Kk!=gl`<>ߧgi0¤l%9 dlx>IsoUFx6vj.<Ǽ(Ib3Ӷ, MjcS}<|J3z&ḑJ,#l/K @љ&nEa ^ 6`cN23VVHj>hh CBl6z>=#_ͽhrlLGÃ\.2dXC~96nb0LiG8mg/X3iVw]#&h߷?әU$ 0)kTk1n[$]H ˱CY3D2 WotTefSu@IY$" Q$bj{ٓ)"h2n^ǯOb 64yQQwOɀB'6n1YcaIawZ?4uklk>-:a#֞MZ*gW5m旷("x4մ]gy&Ŝ]~:}B pz2XXQJ2L^ny5<{IN^}3BX{'$-2%ɀ 3Mׯo+7vEI5g0  .E\);_%qlQ)M ,M- _OQ4ج+;{"n,Gفz% Bnp8CI> jځ "]^Xy#(٨mC^\ؤ$GhBa=hʉ |>Y_co¥aAu*g$W!tcJFv1 ю+;A`~LZ^@ȅ4]) 1)#'WDB=ц<eܚ60,J $G{['uny;qqp4H3\շ<&#H ڏ *RL |F0o?ëO1A&c1Tk*/EronK )ur B(+wBJ,?+ ȋap 'T JZav'd&+Â, i1f~ڞ}׹vuQUJ9*:`X2c֓aa}B|cǫ6%O9:ҏ7X_`ED"/730MI)4 m ;ih`ɛ,k,VT2*d8xy!J~h_;AG`V:އAx:-(*_3V aC;P؜`&%cbqW|0ȏmQ' covL9\8ϺZ mR)rЇ(>I{6 bgw@Uj<2^ / prUVpCzd6QgOZQrd^׈D-f^Qi>{"+("$Y 5W(j?Id0QJdwġr ;;&'\8Zٽ֟س%?m촪ְ >4Ix$Gx"YgrPB"R^ٺFG/eN:/ #mĉYYWU|+؂b46FWcDiDkв{s:Zj_&ny)',tvZoThmG,Ǹ `N.ŕT/Wdl`x&ŏyVhmy0Ob;Qe"sڦZd󵒂oUa@$;ysgl-Եkyg yߪN.@6E44ӻ;^F⏣YөƏ*° ˹+f8H j0,g&bYZ*0vX RY i&v4Qw)BZo<=>ks&*qh*Em$q` @љ07mEQXX-[-yI$gt0 ]1)!M!/dKWitڶ~QQ hF[ږÐ86MR:; ^2 8Ё;e:<=Ve, d&P>!ii)^/& HЫ*-%'l88vYxf(XaLƦkl*cq6S!* $tVRBX;r,/qs_SIr%R{jLF<,Bٻ?P2}5p';|G"d M "SHq܋͐8]έ!7R1U 4(GĢB"  vX.fM3tu]e֚ZNdեM"d.g1ͯ\Dhg6QT)漙G#܋'-&ˣZ#ϛe| ; ۜӜ5E5ƒ(Kf˲_hkJUhhά^TKdukFn7޼ @M鬼e6{x($!GCEh(!K$4-N^~o1]<`=b ;ABz%X{wv!Iϥho@0TKkfG2{p5|&b,*xg ӧ`dRrE9D[>NpI.\!F.0{IHْ$q"&RJ:0:J=pT9'3@Typ۱Jŵ'I5s4E&i&;v,BhwE\)PS,sU8; :G#+{. Mp7\)K2PtpZ8됈Tria.|zmh4"S/n䔌t]C=?Ir( CYʁx{a ځQj4 |Pp@B\ͪ,A'$ƞ; N22,}q=~pL_l8(PRwDHH9I*}}1>w]Ispre"p{[QKo'?>%<бxiD+CȽŪ}m"{z*(Ml 6F`b>G/BW.u5;}OCcfZ'0Sɴ9Es3R&eLfZ Ɛ") }h:1e2LIo/GݶQV*ʲ,$lS_r8eY.^$@ J9c0{yow^d:!(` m!m6k' }l|(pxP:[C>"؏^_{" ȒYNU XkEƳޒ8V(fAQFǥD rKo 1@ V~xlhtuHcr]t? KQtLCB٫l1|YR0L/ =jqɛVgŭgkga9ƪ2_OSt*DcqR ģ t*Y͗Zfc C]ۖ\sڻqdp#^ߡ͏JtZ6r]ÒzL):brU| RO}pi׾ _s8h.Wζ_[ܣK`^.9dlxp0ll8fV׋7[7d08{?";vba'0ͭcrן2hr0uO@h$tND*bZL ϴL#'m<"-2{{^Ga0 [ʖ ̕np<<dw'XAИ"IdZQ@ptR/h>8~ҁ?3OZ/N/s,Kt_n4)R{+"ߪ?J^K@9\&#ۿz9KGR^jJ(Z);_UH mѴ(9uAZN)zO#iQ^v~QWcD HGߎ#ڶɤCWe&wQqS_[ ?$Id0L(`Dzx"@Y)#{ Dd>%j[cǣLӶ(]H&@lqbm:n;NrK&MI__k M&S t]pgF㴋v-7&F~xK~o@Vԕg ƃ,YI&wih;G1p̧M";#~<2k8"<#wy8h>4[p0&ȖKrRoptma@ mB`8|\#~}S-3^o++A6ÎٽfHį-aHa{P)$Pjd$5ӧ88{I]V$]Ti-uT̺k;k͐d2E@h _ar:J_>)XO/~^-E#2d5OD 󣣣ܓL"ykfqM8)|m?/sPoL'J6 1 #m:|Wƞ響 q%B ˊv vcpK>w5 {EqYb{b\"2NÁ,ڤgԆB\78< 'c>l(`iBtݘNg$Ɛncj Goi㹢CY~2Pˤ2 jmrItًX@:p6,Owΰ{r~#6]{ ? %:UPI< ~ 5{XѰh.l=ԡ6(MD)P5u .eEe7o*tnLSn1E6ɛn+WQךsYĐh*pi6J)iֻxc}&zSymXkUC6)(TuxqpST<uz|WTi2MywꏳrQkߕjו⇻ӛUZX=u~~&^r}~WM1n~˱1_g~s`\ѥaDŽ(lQETCYdC9FUS77y8Z|\Ob5jcJ (PX' Fv+@妪Iz,1XS8b YN]n0 rGecb02ĘVljq&B[3pXiBZ j}QbC|i|὾x8m+L.eF \-ce8 ~hn[9KE‘xPIҞH(Btq0IKPti[a7 66.iҤ]]U0i?iT6Nu)YۄR ܱw} ؐ&<$%-V#.QAH:[X =׈"ud,}9}v8Ru5Sn BU߬_r1w[OAX@Zkxb "dkˁäuE0A(yj̻Q@Ne ^aI3iV/R;:r Sn( Sئ!kh.MH\=jAM8@ӏϞ@X\z(!;b//^lfy9Op{m8Cr>j*P8AV q|1o֚~r6FҭJ[ #n;ME{k떳%" ܬ%^ @0|6(F"aXaH \u6(D^I]epޔliȑLb?W G.BKQ:;BYsE8l4+dl8O2*Rpίݳ7A&G 2^vՏCy฾[T<ո ʌ (hpQwHci6tI/g;>j]u]&~=/35XȰe*\ͱ,L ͳ3Jp&q3C12H9wZV&:=9|z_hD&hq:u$IYk,p^W_K2&+pqj]zvMRwt砱 u*q5E gv*Ÿjsw (T:q7l AA cvn7=}||z[ 0dIj FCR|f>3D 8LH*BbDal@XKw8e^^W_EHo3['d(c=`BcX.^[fQőg}+Fc?K)>8,4d|4p080#4rLNWs~Thj8v)̛60.$0|b3_7L4Lg2Nfmcc@!B>}n%}כNgXM3'p8'tl+>Acg=MfADdJGڍlIpe|[0p*W?8HUB` sZ+l1aj*K|wK WqiYߍ:cPx( kΨ7('`Vǣ(Ѧ*_ΖX# c  MfDz#|+ZY/(|럍} |oZ8'g6U^^^2\W?b7o}k/vJheH1kx EeMJVCw[O6L+E% QsԹv}#v=R~V}iȎ!)(Fz޾|[χN3c;El6A:FYEW@'WF.ťHU^t;7X\]|۶Q*N{Tk<#f&qQ>Ucvs>EC(pt  pJ=o3{8JkNgrF kusǹ%jJT-8T4& H+ͧZo6 "fIBs.$CaX3Hn+pB'cǒ4ɤIӪ:˗;M:Nsb"ة]u6l?"6Ue,_:ݏkKl*)Fqf}](V'65WמL =&õ]9tBOd* 1/G'\+G7W*Jbzv|[$oQ"SxM&GT+A0Yj kÎ~=o&_S<~׍//[/ dx2z|Asd (\-V"ǶϚt l2® ^춍k "8c`/ GK,psuU)! ";;t Jϰ g p?$\VK%|i/}߅& ؆k R Ae@c(n7Atǧw_UB_9m# Ob8;δ3ߚNRM$61 !tUVz\;;¿A?9ߙ ! @K%YQ$%ŊQeI3*fisv3Rimҟp,rz|nvڝ@2"0`|TIv 1vcybQ>i>LQ$yer^̚ fnM>G q\YP\ nN%GT `|l(TJr,1a^TO9v[d2^_Ծں3hb?ܞezt &E3\[@2aE]k{x\w>W \s K=ӚwJkNw@,LW{4%tD4`Gţl*YQM]_K,N'1T͕,) Ap ]Yk;OH! %xL6aH`|E^L?!R*o rY歼vN$BY&<.  ,H,Ip(j=a}]VUo0 Bmwqa g-Gxe8Ѵx/&3NQ)ݍ:7絃õyvՌz|ZϛBJ3-uA?4Zku`IEMSH)`DϯFp/..G ;m{ eH2"Ƞ7]?؆ln1+%0/_gd2UdYU37*);bZ,ʊ(c(hGPɐI8$NQ C&r|X;< }ct)2ۭ6LNT4EH s>@J C aAA?t/ [n>#7짌i[6vgj}gE&L q[m^y+C߸bQTʪ$P";BK4J1ĊLТ7_0+|2LM4cY-:۰+"i%EP]˥tz^9Y*Cg 4k{6ȝXKr9CϪ<qpSg)Ta(0̤=;i 6d9^tp {Y@z-b?um'E֜a !!@ a&d$L47qR@6Fm$!$fgvvϻ.JL{#p Ewò-(=hJEݙKatR?oj1h#`9[X3(XHec_6dIQ81EkbeBl`!^wgi;ŐB##ȡI!UZÖaLl=EƷ;:2c(z$K4L`wcPʖ΂0~0)YR"TpЍAĥ edrDhI-m&rU~.nēIZ6wlj$IoJVfC3ih01QHd{rY fYMR%R2 =*8En]k]!™3+wwǏZf^,HtZ~},E߽s X Cpc?s`vӚtB5.?M9'Q,")$CθY;A{9lw a HdbQx Єx#\GȰt+%[%7d`f֌dɤ"Բnمx 2A C۶/P+?I`ś:BPNݽJlR-A :K|oGJ69Q6U pӜ.f Ai&Ec,(-jM% b}Bti39sjB"g"%zoC{fKW gC.XI)dR<~rP,KB BpOuPw.7a8AT M>WXba/f,e*EllFaAk8Mch6*%! 8r:S<vY|d/GgEq;U0`qIdv&mNIiƉ`!^чw=wD; 3caBXf׃mYP?`gZ<Ƿ%[aՔ$:zx6E粋p@,kIV&$DHHT |%W̡ MR0AxR4ᤪ΂{T4 ɇ9^3bL\ Ë@vRb>V ͐5MN$$>04ewk3p2 >C|ׂE".J BY!M/lTڽ~\)_U/ͅY٭ 6:}n;rȜgى1Vt4L@` .K]̗Y:) bY(EQeԛjG.Q ć*B0'$!TA~wrr,am6&Gr}|6ŊʟϔSnQw<#lp[a?w]l@5{.*Ş>h!ɚsz3g Wo4!LfZԑRiQVN;Wؕ w~=,<cCn=4bO(!$[κ[k̘껷o4׷=:>yًOOsBx8hYYWuexC5g-^evONOaV h7-mk u2N/`.6 z-d 2XU8Gߔx"ّ1P![֯)r)&ת-0ETǪw)I~p!/ƻ۠93U!q:\]ArQi[H֛JJR Jt[/ْb|зz;G@Np*g{PD(\("Km@ڬ9^6Á@_|`xbp HpXPPh[@򩤼A־Ny/g\nsH< 8'cs݅ Q Ye+Lۦ0l[q' MR`5ghf2M8MJَY,k%kwF#݋sH:v2@@$<~s:>Vd<ۻw?SUj_j.&1snU w,SCIbMuQM[9P af<y-1&MDs y&: $ vjx7cԸ$PSQ2 Z/D0,۞$Vk6 |Ng,VF5X_W6KB5^So wwߝ4OhF}"-eEv=Hjꅋӣf1^ѤH@ӂ(;Ogn)!Me3rїmz+QZr2~oq~)_~Pu EQ/^Mw6^3#?t%"*LVP:*( @,OV1HnWNiǸys5eRRfe -+co6&XVg~>L7P/d;FlXϰi,0O:eؾ|w=4MCWTg%z*Ĝ$"ì>'kT|a HْX|,%L'A"+!13 Bqdb<' Z0=iQEA<'EfD[pJc,7wg Z H< 'V# ENP =cxљaQQ8M}Yu-܃8&͇Dk{.a H e:pwe71"WR UR.cb\*D<%ٜ4sœ $AVeu!Q4;Jf1:CwlT*4-(1!i$J^c8+( EohGj[M--խdn)R,6xQ y9N^Ձ<&},N S4ς9-Pך:nM8V],|}k`KвRDQv3NNI4Zy*WKo>k67244e!hލyOQt&%sUH_gfR)Jr{g|I82F#K'ygGhƃXUij(8SÐ 36Q2ӫpt&mZQg !4dY#Ƕ4MOkh]t]OۧqqXDQ$A* l}<ӓLÐd")ㅊ@3TGRQY`{!EZ0|5?xkaepe`e?hd.n^g!* }|O|*_xUTFX1>"ԃT8JF|9AHQP_-p >-c,ZfsT0 o4<ׇF$)z0n{QCbZ&Iz-Wme58!ЍJtꯛ?7"n%H|CYCks )zߞOum۱rewL}"A@PA[=N^V:҇EmEIjn G1Ơ$m㹻5Զj{J ˦|$6Ņ^-Bd ;(>5@ e4S c2}*p0 m(N "P|p~yџkNh0|\//*drɸu{zGOJջkCX.;>ɦquKTQ_XFE1KvztM#YtuCmw웱J'%ؘ/.t]uOߜ\(P7= O{O:i4\_yN׈ B5lN`d*Z{ӿo! h| eǵr$""n?M *GlwlHQa$Hf"(A(Kn*C<&bS7 ɔiG g3LqP,;NrZ-[]̡(QMiiEj B5޼%p;A x:+w)K#SVDǾr.@rn2lnCk)|h~goi5q'\Q5IZDa aLu]9fJ&Md:5Se:+\>#n/qXXxֽ1T*XF($jW U4_ j<[tS=?(:D0&D3&i&3bhsoڧ$%1*b?m{9($wBцCT*Ќ3@b5]vIj4Q3e۱qԫ@cfhvkWE15o*dah6q=7?#>Q FC©XX6 /Y! ,N VÀ^d749\jlQ1#İ6]S^t{D:٠XS HØ%D&HY]H$I pϛ?V`Tb_2#iJ!2t.ySw-&X=}ld2 ٫˝r(}xŇ#އI1?\|) Ɠ1i1d2S%Hqݬ)rrrB 85V>^oC&8Vq>-bs|Y_f4R}3 V۹v1,A'PPJuWN#󰘧Yt5U g2i#*՗/Ϡ >U.]x"sOe|B\/VXc_g^`yDYccP/TKP ҃BRAPh j Lӵxfl4ZU)e-u ai4(0ТXe`lPǁ!kvP"_Dh I\>k}+:GF7o%gy㉾#Rbz{nu[Ӷ|/K ˓ӣw:ԇb{#MIvoWmߩA1r23{X EB.>\h y}ln:5Pߕ"B@R GRM, .qF0'FЛ-fK{b۟~q)X8)z~uەw-#"^^6o~~f{ kk0 T}2&T!EۥE!'OONL $t.)C1|ixW!9Z~*׬衐,>IS>ftad22riҕY7*cs$v8ħZ9Uu[vxh7V^zq9 QIqd"9EKi4mW7.;{vX '.ܡ CnEg (q.(aG35mR9YۛXTjjͻ FaX&LSgl. NcQ_{YE<ߞ43ܸ.;$[<80Ptiq9DT@1mvf'm_tvg:cMs[@G3`m!6|dHF+MbO4]`Gq6_"h3ۯtT:s0T{m\S t4AbD/%[y8(EFa|1+U%4*Vih*%#92k:]sЭuJ4gEEYuEh:I4À:,IMDzGCrXaC \)kI8 g6\1؛N ASD L1J!T@,h VDVj|%`ߢ>ĉAq4 wZ ku%rb\>Vjek? vν|gfqG0aӟ:go k$ 7Fu\C6MZuØMfxFuzvg8W鄎IB< <+ނ'kD.Uӄ {aыBP>Cwϼ †B?>]<{ΎĖ՘H0]ݩ~4O(,l77g%A K)P=vk)9;Ϻ%ꍊ+kgo-BB$$%Q81ccjF4H!NP ,V_ uk75η9U{Ҽ<{ p[>0Lfʋ%yս>`#";(fh M}Ÿ֑t^]NޥPӗGc@?^ WZU,dHPׂ($H"d|-ScpN2!ѝFW ?$:_μ){>M1n8q\*{#0 .&I,u.loۡIy8B\ߚbs!/C- (mDp>VDϗ %ᅲt$0oS;7Qgͣl?y~'/.^rtß}+8}3: b*boY_oACh`,B']{ ǐ.s_ Jc@'gm570ر<^Qz5%Ad 0`8;H(3%e˕cmȼP-D28CRqɚ_qG5qlsl8S#]Wa7+/bPaי*ϫ$3)pͩ;6]9|vra*PtniQ.;!sq[J[UU?BԪr(m06 첻콃4#Üs̺T˷|9Jw<$) >}6_l m 1E 706}2l;<Q-U=fObض[ࡔfkOUQv4P1^1l, mq@z^*SQ5]#([Hڼ!KrTOSU.ʥԖO' U.Pt,Ez5Їȯv"V AXd&fل odC̀<;y>O U=P5L A2XM:u+4w8"P ԋrpRRHre rV 'ȺT"Vi)vgDtH 0s)sCJv,A'u+\m7X?l#kV` v7Ưd/uH m8\ à/`9h<tzRRTq2YO|zLdɳi9Kl|LIR4mMb˟dsݳy2fc(t C0f3Mф` y5Ǵ# ,Hܽ{Pf4p9ڭ-T0dFRF3lԆ`2vE\$b,0X>z֫vlݡ#@TTNueDNg AjN~sN v?d_]$W^w>hj~'ONoO{HRsL>J)5ts&׼ST|[8r ]|zN8,h6DXu9g! skt:=Asif.N~tbao$_.9 | B@e8.e4 ྐ_&YNɪ1c'I{hWYB@V̜˲[C8d^63K񊚢(֚RAffl s440U 2DN۳Ne>;,zީ׾(f9g6= p>>FDQ@$@8 4708@Jh:avkݶZV`FS%U*߶ף;^y۞.0y?J`ѱ7l֘cODg36Fe@qq#o/ <|$8"kU.VX4gg? E_khCrJ*u;96E/LӞY]1Ĝ.wjh>Z3P!iFq,D Q(-~:YIiF#j!0jlw6|wyP*0mBۃƒ6q8=!.,w `A$) ' $JA(Fgy0#f%UÑ$A o̍㹶=.|%3͚FIϜ~9&pПk?4?06a̗/8FGJ ;ݹabw>H0ȅΎo%맦ϗ-y?T+(q.ɩm).%:AMNi7lD$5 5]O?||rBj*A"6(L[Ci+ddJvH<áAS4 ӫՊ߿udo{HF^Zd4 AîNΒ$fƴ~-Ҁ.pMK!ڭ6c(}mrQBōq~'YNȪ"{ߪ_+[&-hi?~2\6ťM'Yewo?S.pټypefz%[Q.y& zm ZlZAlreLD f"(&°Qa pJ}TIc3LtƝ4vٌ &Z}Ԝs~^xrqFQem9NBw)% CO2 |呼_Xf [> C `PBv^xΤVki3BKtR+_]d\zKJ* XE@)?zq}P<&Hjԟn.W(8e nn˚A$EMD yJ0,O$F[F"tHj!lɊKIUf W>Np+#b9(NLv[fqP%XtUJF/<ZV34ӧYC+kd GКM_~t/NOQt8"cv^_WCN'N]-Ϯ=<1k cb1\ @ݠSI˜^l{/nd;.C餦2葞4I**mmB& zC UaUYN#06JiJ0t>~v8BRO۞;AUe4YUŚLnG_'ne|>M3ы$)۩4 K6UoӵZ ÉRhJ^X`j|utP~,l C(Z+,Q |Xgk׭ޕ-gxir_cӋkÞ;Eσp:VIug-Fo6X^zn'sklU+9 V "e|8}anoe4LHp ȴAle #a]n"#8}x-"#ݘI#8 ,j1b3Hv11q'?nonȮt͘/Z<6cY/ź4@X-*^u[,= dBxv كxpwr~RS2^(o$?OZ&y΀vIwo߷[]ر|u+[si* "lީhsihϕb L*X<d7˙vk"(r.}#i꼑@Y!!IV@abO,ԌNДf1F&)Jؘ^:חGX,?7oa϶cXMN*i))5Ƶ߽)h ig8%wXoXAa 0#%-Xܯ-k8Yf4輚۶(Bt $QŒe)IY-َf74 Q ;{1{3s=_$(04ʄ#tgtbdb9{$!& MlB|p.*ˣo$XMEو]sbΞs?$KwLmJR]?#2 mbR (`$Py{ڜ\`Y[IJK)v.ۭN2"fjBpUSE/cP .gjz m,NSl2I #k6½yP|J]M p"&Gܚj(s<TaRh8,A51}1)d>/'x$GLDΰϷAe@뫟_<Db[uhθBަ[ZōòH\( h8)6tcm[WmQ,el %DsОJ":]9GR^*a簉Cٕzt>u2I 8P_XVw HOF:K0р]4b$vT!=߈}Tu[0i!‡/ҳp4r[)A;%R UVeyRezmDZ#Kbq{@h3mDE/ -deE)7nK|tIcڗjow{c~3%07@9G+st֒ $8cȀK$BkMw2B^; : *OZ*2\ !~$wq}wp2Na j'aSfiK{%`{CrǃjVQ4-b2'i :x72<nO,W.)r0QY=ґkҳKc–Dv49fz@0 Pq.Wv):'Gϐof-dRj{`ra[:."Aǵd4(@EhT;5nK%y&7mV7OWOq|ض^ ~:ׅ :VUB0G [kBit766([֫_24=@ނ(g/?_,̆փp[,w?#<;)4.EC3<}I /M'Iga LJ>TSKUUYڴhf Ż݃*wO|:y:,+ 8 46p4`r&qr!FM/ʃu3f%b}v9}|qAZJT[Sƍ tlRXO,]v,!2{ncSs@@Zy%h ??Ѭ;yFۻ12S\-) X4uS;hW+wH#m >-E2AOM}W}}^-1,Ҷa!0)Y)Ux*h>ay}anf-D/JRFoB+PhȮjJI҉|vtpGqϷ_ڟq@/7;bb4껡:c; 7Byv2s!M1\Z(=>="D4=Y"sB(r8 ~Fc@QRÐ1}X?tr*$< HyEXP qO%<֬f7 fh>@sUu gqAۏ}4EN)πV6hD=jwձ|0))>!ŅBT̹dpݝ)4**\,CAbB'ri1̔Hd㺮;}'|0{,kJ]ȡq㘢h};VbHrbc #1AP}ww3qG|3J_g/OIc>/*(y7.M[ Ǵ Jb;V̚۴8 ڜ^⩛L;NIv:/K&qbN-hB ^<{r9UU< A@q8 {f54Ċ"-s^K\qikD%^Hy~sۀ@e%BDnkq:NPZNfs30ayJ K_'d- '$-i BJφr>GllqX:)ΤxZ3x~gr_v˟.^,,hҦ(&8"`8w!o8+Mh}ׯWO'[ߣqj;ztKk$uǝ 8Yy?£4boFqg1QמO^&PXHI9,i|n1t6ˆe,J\;"` Tg6]`1 >ͱ"6zeGV{9+*bnM4Œ߷F"XB ,CѠ6#cd^ 6xZ2Aj}T|1/ Bsӯ.V;AI5nx B{`{nEأBRKjS bTVT:֧7:Z?{և hqM p (aF,+ f-?[=CC gw±g(~I[;Q\((QHi 'ϧ"'Axp}kvdrn 5oQm' 'KjXx57F.f$EWU͆iuM1  CDAw(Hua>0:wK4 ΀  1@.|pQ>}~V{B $"/ҧ( B^`I1EteWŽNPʗ'91֦E 99BN3dbJ097)Ԛ0DDZV6nmJ+ \Xi/sǾA]\<~}QаM$iaBW8ui\"& bVVYt|p -nTD_=ZDi&u 11\¹< R. 6|sSh1 -Ýb_IJd|{ѯ{D 8/%Cr\B#LloWy2BGfGMdu^Kqp8'DAr(˟^]V{7[ =psL2#dcB,`޴۪`($GLG٣$qUl[XVIVC8tqs,cj:(ݛ6EWm%r%ġ(BB4uy)9j8] @D˦ JRZSA #'ivtp. K7*(]AC TҀr!;>d.c'чBAtIKonmJ|8Kx7G-;WKn1.,kZ;P}pIqR[oΦxk`yZXA C>*4z8^gܿ윜N'qNP1kD.KRlNMXZ7f:rB?ʥ (wI~mbi`)"\0\3o6#JY&`ْz7{`O`rl> !;ЊKĉr'"628Js3T\VidMee]L:xoL|"s>VeESNaAP-]0*It!-YcRk͢Uڃa2fX 몲˛YH!WR}E\ZC>"H!A=,>9SyU8 ;_v[mWdkR?],<+ sXV@5雦;s\ `dARc_'9jL' Wj BJS^52X]˚3]$'mo< K#nno&^8 q8f.;X 1'eB &J Yc%m;-gRV%?㯲jcL^1G+v15l6j68Lr|dtxr>{XD|1*ғb>;ڭvtMvl0=(x^\}#ChobVْ$Q&Vf[/Wd 'c 50o`c45-Vϩkf{@x1kۨWV]swj C"C, 'EƘbH&^yC'`|5w {nk?8TkɨvrhI)"-k,aUX|_هٓIۜ7 ţ"P,V}΍gs)kjO C* 'Ѝ`Rdfk.0: FǬVv2pvQ? F'ro4WVP_o kh EgrGgYaXf@`,KĖRrUR\!Lʕk_Iɲlɒ,H1#Y}Ҽ]ݧWM >VίaD)w,p 0u#t"ax|ol$]ǟAu_>^?`'cjBYI6U <:;A:r/9gL2i%@M!bcKIDHK}jn[٣l ׀QH e|@zsIp8?pjF!2% ho48l۝_?>8 9+/;|řt-RxI(!/X:e#z7{@w(kTB;q?U ٘jG'-G|Drp.,&ϖfMѿʰֿ[BrGfaʼnHt bktݽxvjv%Y^K"hp'4jXmn*E!A)d L@5&G1UJ6\uLƹvA(V.3t>85h9I ,ߓ1 mn$섓$D3@,E2%f987 "׾8`PrkE8$Zhg˾۟BOi82@OِIS|zڛUE@3fAJsս@02r&ʪC4@PD"t.ccZD/j@a.(oãl1S_Y;ؕ/21^ow(Akg(zc0 ɻ{y 4 FDa9k&=b j i L}/ޏÃo6a6+OyBi;]fc)cXPx")`ϭD:u-+bh2R Z/$|=R׏cn"ҥ)tCQBm:}g۵-jU[w_sR QY/,rB`;ݗ5r}vPωEQ\\I~r&$I]ܝ!_ ~j"D -Kw^!hn]=]5n.5{dVRI"cti;l=Ԧ:8I´X~ Tc8H !TmT Th!Rdһ֡H]$7O ^ :_CO)("N4"L'TR߾&xβ5۠0]i|:,4OȌAMFh !dr D$KRmcXYY/:."0? Ănngv b&2xLL^o?gkzecl`$vx|G 7-#WJ&T v?ú"5ir[]/3 FmGaìUHx7x]Q 2KMOgDěm9Vjh0"XPYe>1GSٲD{%A]od]sH9&Zi 1H VʚmI83qx<~?yqnRa^*z|am)Qrmo)066]7:w3N & "0r#QSTF^Vۡ3VJ zn̗TZ[vӵ]{!rmKLp0"n-`$ IlC,3 u]]_阑a EȞEM-ᩅtxnif5Ȃ߿,W!a=usS*]aYEVrB?ӻߍۣPNP~GN:a}0FJ6 _/], 0phhr^">i~^7,}評|l4'/, 1xg=щ7Z#t"?GqB" NY]^4:wAۡ8vbԙ6+E]>xշ_k(S1 2PqRX;luj-ȞR9!h^>oۑb2Fi&7/[B,Z^_]@!t#Nyr  "f:0*q :ܘR[FMx}bI NAɐ,wBH3֫pTP20 e/...k$QJ P#iۿuc Faڊ|B2kt\P>$SqÞ).K))_u`[l>{t-Ϫ5*CԳN=nXi1QXE *Oc .? wi}'Pzg iYHJ./$PNɓlINǿ{*b<&Z)"QWN|R.1>Mo^7Jfzg rFe>p rfk*LM'o^1 ȥ-eq6Eq}u^Zo{t&D`3Y l~0nqƻ $0Aݥi[Q:Zj)Pa``& q ؉ݲ~}/;RAs$뵼ii/%rh2Ǫ"o DB 2(Zs&YwuYq.ç "9 b&Mhe!tB0TbuVl6s"g\wZG(^x+wX> ԬYX:퇾6 z |8]~U'qwzX8?=)zfwpxfx۽bP '$=Yҝ,aɈr2te 2'(3TBO#d=_+pv$r# ڗ<2YÍ$e%%$eƩ f C0!Rr|x?ɓNfn֊S<.Tc<# `BrB(`t7VAYsV;@`cvptL7L/zLYA#Տtϑ4cXkAy=9[, yzǫ Wp8QvXΕ2!ݴoeEneDUu?&\Y5u\kaYikZ(bzl;[L*lazkw+2z[D")Pk(.ADB#?v%!iUR. nD[?2]uQw<W}""M(alj$cI\\TQ%<מZ3 >^oiiIy~γ̄%t` rFGwU$B^obRpOhCJb(5j׫VHo^w{{X셞mkBdBͱ t[Jzvr|p:ӟd#ʁQf}/W$@sikp2{XxKRnऐ՜f#S9L*8jEE{}HeZ| Yb)s}{I.c&['^y$/o^mxޯif U 6>(J4v.B-BcDl:#r; 7^Z_o[,B[of<6 D9\n$b 9EexVfH,T 9B(pF#d2My˹sAt Ub x?tEDLr9iDOͰ?|yL9't7(G4 A/N*O~};"TNh4MM vXjT C3KL 4()*"M 'sPIerqa앳q?tzIfϱB'(hp.p ]b9Yd4-©J=`o_0r1lj~Z0L©ӑEqu|a[{bt^@|KKH ^bXB&h `$I [˧3)]EP/ F}_d^d(H n/l&$ ̮)--֧1p{Zzqv< dhryR`xBE?A} 9 [|leorpQvM%ՖeUQE-{ DHɋç9x87j0`4^s]{X]~jO:h|Laz6(}'%)QmIc9Eۇ}o,Ч[Q@Q 'qXe-.qDq';ss1)+ZY#\ C-ekt7ݳSQ,o57JAWKڳ6T֬p#;Z&Ae@s.5zNl혫) %9JɯvT;>~~2 #W˯/UGݫ NT#t/z7E1ŐBkłdڮ!T[vp5GSZxb-^j4֛4C'9] (0 8mvz&Ƈ&auYT)R u}Vkn+w)vXPi(sB~[ ڣ- Vf4x໋tAu*UBb+xd>tC@#yˁЊ;xYoɞ{tp,tbaCp 9n@>D8+咤g}{zff:rVKtZf4)/! [+z@ݦ҄` 9^~;l.ڷw0iF_^<7|MKY.E22I 1fؐMQyW}ybi-޼IBf3j7:J|4`!繎@)AHx(W V̻˩"DfǩT*OCc0`iQ#DU<%6W}{_H}vgx_S%I ̱ ÇAOͤQaP6բe FDH؋@dB/"%V}Nh232t:Krc2LxfD w <@aPTi󽬔me0HQe9KW ǭh0 ?# < thyǑ)$-Iv:mٲ,EIɤ$^ ۇ͏Ɖv6ۿVI0m(mlٺttx]ˮ&A^'kO;4+H @DI3Hw`ta&ŵlVӝ y*.T*As!cUJkZ{5ߜOXlddy4DȜj|cF$3 o.M ~8 Cū{VHhÐ$NjO/^5_x0B,nzmgRx٫C8夔e[)@\q*ȍMY5~q9XE\ ):;mhgmG< 9$DW_3ߴ5r Qy]L(@xGjaXcS}*q)1'8kSBd;i E~HqQZӀLꎻa(\7$ҜR,H(y~3?V~Jw걹6wAq쪮9. ¤{5#A=ף0q}4޽;&q|DpOvըW# <gzDS˾Yݩ_6Qlr<}Ƨh~2↚~pD"^GW81(QQFGCG"ֿDR@QՈ@F,p=M8vԻwJf2t',eQlGI.L[P~u}^37IY|Fv_.vJA%۵ҹ4ΙzeŤ=o*1Yg $ϦY"SUR·d2Tes:wO.>O[۰(Fغ`Ed Z,&$'p5R@SXM \&u>?Gg|X]H"wCr䋹d(bIwk}OnנCn4rOD!A"``[uKCʄp/p.`DB4~ٸD9!)f#lSΤZ#m+<5rW!MJhL;T‚RKgŌP "A[k7[܂a0l+J< ygL@X5VIS ޠ0$s<sEZ0~sEC4̪,d!>eH=[~z^q0((֨ {@=]V/+Ӧ^QrT> 1(m,$ SCa+.xz7$'$ É4nk-/DHvS߼}˗``Ysa/\ n"^BJ@,]ڷagT/%CoK%^D{ t@]ܜ\ILJs~byep_SYTňIHgăd4gʲ>AS,GG}jf@lgL (`Pk(IAX!.$O  vzL)3*\rv:/zOy2;VA]Nm !ȱr(:޶0 sOQ")Q{YVmGN$Nw P O~,iҢIfٱɊ5(ے(8EO=9.yM fpxGSdb 3 JBL៞,xe$Gv/תƩ r6Gη,P[i 40Έ08"bX6_cR8Q6ص/.ܻwi<#a|  p@995S$R8Vf@]4ǥi"M@4#D!1L}>TZmq<޿zeY&t•ـ ã|Lniixw{~Σ{SeSDVv&NML'c `=rl7 T5#s~t8#\rm:fWb4<6[W~1 ]So>:q7~h``V Ե m=كc,B ()L({]| OziJ|_8c<Qm훨% T\LBYeVǶ1`, ŕZbA&h1Uw2^==rJRIٳ;3[_*i"th4aG jƣq&"hgh=>p^ѡP FkҝN/Iݫ͵Mtف7r4%)j7r\-ǘ+w}4bL,f XL%ӡqīi!^v{2B{sOGz:WUݒ|ފs|Z͏ t8LJQcPӒA(o?]ZyTUkiO:?9Bߚ՗<ϑT$CT:ӷ16 OC:-Zzq4qB8agS#SJfVd3|I8DXG6E"$B9zo:xB=tYmF#0c!7]Sw&";r;ϻvۉr%.\FI(m-B "K(PnzuuM>BOxVRhMz(:߶ sE"EJn[hcAm?1K"5R{صRJREB|3= :}z Z&#ЮF V4ت}JCm$7&cMGZP{> F\Kb&;9u:MW=`X-O.DI)Rj3N֟o`"@ mujӰ&$Y8)~r (h[qRS&4j&3RBⒸ˥si&^\\q\1F083 m^߄ܪ+z`ȣ^.=w;ah [ %eCXl>1x4lVf4ll|nUUs D&o1?Pٻ4f3+ӷd" P{kt/vh^n~u )Y/7>ܞ8әմh ?.E \HNM#b\_^Fh&5jitEBjt4_ړcniOayHi3* Ϝ1qZ2e=ɧ)%_~ћߜߝrX.lCq?@DNXa:c%9l38Ğ.sXUmYo?vwWo/Ί*K0H(I4#8|ythB1.Fehg@|꓀E@8y^8P,46x-,o׳.$DvQ7 hj5)JkNoۦȆ%BfC)8쾞P_}wR.ɨ$'Ǚ9qep|8(O(=rF5j3t}oEK@ `&o!͂H^$@ggxΦr<{ww.y9!#+n赏Q0X]YkË>x}?c)+ Lul>'yv:Ǎ1@dJ\I_"j۠&aׯA_[2"GafqugKHTz2I;dzl)4 Ք$%/K~0;& \C%PK]sF \g8æ޲CJkʕk5-O,/fz W*PK6Gb^,dHW"[02GCeAǻTH9SqP(G(fB ((PKG`ǛZ{Qe|V*4hxpE$Ja,߷kA;|xϻWz`h_w~3;4Al1⨠(RXIUWrh!3gp2%x2鎺$wN4(yEiwqf13B#U+iڠ'r`}VأeyI:|QD…0PmB72RIQrq<Z!&*y,PYo;=CB.= Ȟic͂,(5\yA\A$&+jNf{;0o#%' +H:fX)kbm)qy e]+E˶rY1sĄptS>/cbBpg 4H/l'rK7ֆ~U+ zwvC蜴06LQt(QY۱jw.(UDk8 $EIv+C=$ "DxSךZ!BcEFCu4i8|>6 b##ݢdK1 }%OڭL~60n n  d&&DYK*IzXU!=Tzj&/JFd`¾l fb>-{&uC}H:۶Uh I& 8dw都sLɵ|)/4X4AP"M>N Dޤ7P)*Og R+AݥbD8lV?S0X q"ȴr$hk:m#@qf9|{&՝-Swzײ5gB;ߺ.`)I,X@䜌#e8(P D8Aଵ" ! "|l}Y}Y,lYk͂(#cmXԆn;pGY*İ{&dDe=۸e@|z7+$M*2ԅj6EbA3!dOճ9\Ѩ ԠhTZi@4Y,_O$ӲLm/Eg֜` -H b ILIyiSM'8@hz|9aj0YJJvG-!PK HOTVǓIP 1{w3(ADb6tn{z8SAObl4G5BqXAЀc8fՑ=VWJҽ`Ca1F]pC.`:GO덳7]۷"Pi>I~xQ??#ɐܑb2F˽,!,R7" y;! iCSѷ}C}-:ߧ t*'ߎ?_Ua:%J`Ʋ lvBotk1`|lRi)Di=kA#h$@g.E2%PBHW雎vnmʢ\JJ"h]軕,I:X$qR{eZE,,W$9<# @ @ZbY(@QJL#ʽ-zvQ2t"U:e&@[m@3O53{nڊՒ,۲,k  0aL7<ôC LPvp;ŲeɋdXs={->CqzMlZV}sVŜW2d~a0A+j1!DHDy=|"0#m` Қ.,NDQ,K 2$M@@`wv?/)+%2t9x2Q*Vg'xhY#sL,Ibr$LbRbSں^}`uoBFёzX+-X2nM)_OhaWF[R1F^KnoԳ?eP/UN}m?$#ssm J8dx$\l;ER o'ͮ7 k9Xi1Ts}[N}5˰H[͖? paoDP @D"3 gUhaF>$1T0܃1&lmoxzg-dV@nB s|^w6hbZT[?WeX3:Rcju5I\)3e)fwW ڽZE"V8QR&*3u)ZٌiJF\sP:Fx}ӿj]6hb8$"kZ2f-˚]-5fɂyGTR  )=x|w>odә\6<ՍJLY.#De t)15vwLCfw,("Qq$ *B$y2Z9-?'8.HdR=_RGAf_o7x˩wYStxZ}QY-#b63u/]`x#0V"7fh& Br R2:?:y[p;XTc8J4faO<3qo6]GMT#'z!19Ʊ<@mZi`u2xsQ\:* 07#M'QAh `%EB l#43yN $.l8;m:N2i;N=3tҴũ';B/;H~'ܳtFs518J朗MI'A1+z 5R}q.(W-6![1#rV7KPCpO3Z:m]YS-F\YonE8E]?z(2tG޼;L;xnK顠-I4@b$d$e0޼{8)O 4G<9T znj~-@Ihm'+BKEPqmZo@}Vm'h~N.ת4/1pƒ̓GV?yDPwRJÃFsPoBNzݓ1̻DL9P+~qHMƒ`0?@_72&fhm4G0aT&ߝDm/ q=blvHHARͦ]or Q`b E= H#FHG0"'Vǜj)^beUϗ"?KR$L{]Pv&P@Sg=jN5uQGrL*_+܍d9>KAVVB|UTU`cYSТZrZ{{x VGǽP壻]: ]2.'NX$?πLY)^W|u^:wjQ\xZwFoΖc'ĪacR|)VC2@HT!DJD[p4а&$o1V55ti7NtNN PRXLlT:]XaIƇ%U#c1s+*,*yq|Y,ϵ / ~K06MiRC *t\˗כY3Uz`82XAHx]K^@䱳j:`uBq6RS3T0})n>$Jh8Y1%m3L GRJ4l4v;A:-7FqH!7MH"WBf^:o>B^LD淿υ^'AgzX H^?ܫWa"mkf]m%wDQׇM~ TAcfr$IO`(T\Vj׃ƃLJY6-ؘ]$dHxqvD> \Ʉ8>x@4kܵMpǴWUag7(j^M:eZWn)!?/ T=Ш ݍz!8* !`5v(NKL,XѺ!6}ֺ?8(kUa'q ?0`n,nu~xEۻhm;AFmrի dW\Qn_fAWɪFϵFsXRC/_V3:JZwzs(LҜ [zAiFgyJץC$ bө4g Yvl!L@OO2PH6M7ퟹD6I D ״mA0t.Ϗ^WҺmf褘ÁKDpJWWkudRͯo4dGi&4ДLz۶08()Sة $E?,jEv" ҠHRg;f"E39xv?@<DlV: ?*0! #K,6'wݽhlv˼^Cp(^<.>D$0sbl/VʥxogoЀ8<593SYL@_0q7́aҪA7)fNH!ߕJ1"C۱lՙ(F +gƳo|֍1JD0QpU7Z/ oM]E$ ƙ91*Z<БYoԦi|nEe lmr ʢ-Yb _2[-7bvM熈PـH}_է!7 Eu:rQ tl?숥܉1N%6WMgvn+]ۦY/T/\L&ܷ;r!)dh0&+> c62b`9l,m)Sɹ`җNyL*|e{g Mw>).ao<'d|X6ϷN7 i!'}[y^ 4И<=]Ho@gPc#&PAq|=R sS'((6hVzFדy.*ϧL!_Q_^y^zO>[ZΞ?YQo]O%JD 6TyEcfT`%B8ܗ1%N4W ~itOv;PZ]8$.gXEښE:Ge~+_-c/ϟx6%Z#Hp̩XOSYWwMo&sکsu`mÙ\DrSO5d ? "wJDs\ (6d22bNFL~9K|n|un;omtNRtadDWW&i|WZ§nXm b(Ò8sXa/ԉ-"hln-M.J׮iʳM$f1RQXj N0^QR(ĤORWxr'ߞR1VYii2)QRLr#e>$.~  z7lU{Vɕ{YYy{%-#w*1ke% vQѠ:t9NS;D4">N!pti[al^rYRuISU/؇I맭4eVҤn1w 6wg[|{ysWz- 9Lm]LUU*m}T1&Ut5 |ilZ</B f7| m}F)ޠ-A ')TM{G@̓7s68CHg,; .|s!2Mј]J|X,/禮C.R. PnF]'D9㽠{3jg{uZ/E1E _oο|<h80zKB9駐(,8aڭ%ֱRk.Kp-FcwFp<"x;{0ՀʋE`\pq2p8/wzj0B<i3íIv܊EB>tpWq)apmWcP4i:V.VND}梌4fp.&IqZڇl>[,tR*'O Y g{i S]Z^\UB yIڟ[V,s\%.$*=dgq0&(22Zn[{4 3I(2-T[ ,&<'"Q]ӻ.1J,\Fd̵哣/_lJR(MM5T`f:v+ lgX p2NO*_<&9Eln-W"}utcM<1)!81ǰY̧G{Dm!Dӛt>?iڃAPɩ~|: EG2!* {4GE2d6&)AW aT{w/щ Ȝ\rF$)3NA"۞ } FJ- q aE-*p4ExRrO" E@ɳyg⹞Ost&#r*?Us_߼;'Oj< f{/c$h:]$8b\R`!Ϸjr>of>x^ڨ01.Jb0r;,_)>ٝ`6IU>Cg=Z<{V.ܱAkTLLƺ5ڄT,nD0yFphA>\\R/TXj9<8E,4b_ueB'qjBQ_^ Bb,̕Î 6ʓPteM\Qxճ{/IpԈJ@ڧVCKU8!Όg<#ս:|\}$x;L,e(P+ʓOq "T5VkG_Y|5f ȴzAb5B]yud~2s̆^h:4\K,@9ʢDK FWP!S{Ibl&DB&V(y^P" "mTUXoeLaP^[-sm& {[/VKB94w!k׵C Q#9Iㄙ7 ͽF#CXÉHD vÝ|{"<Ќew|7ʣRV+啶l_֛4O^̵ytx$IL+˳ ZZs}t6>9Q1.0|ωH&y߱&"Srlgޠ ;H|)f 8z6(̝(hlK%;rKbE ף~=VnD> 'Ÿ'W/" /P0S֏΀庭~= &Gc&wWX.WAkQADW7~x`+4>NK/w?H(te Oq®0.B۾d2i o>W%]->W) I8 M=>pN1PhӐQT_`0}M"{nHn`(ȣNcd1Z7j_vmg8^4UtLK߇YadsՊ$#F9H֕dN`g'_eێ܍ gae,tPrNI ѫGc)"MS07y/bhYfj8ڑL=l `<(֯vvsBh^.ŝ$ ڪ eq Qj/ۅpr2(\ sKPo.aÃaANmfϣ e"&`O!(T4xp(H8]YsVІJl/!鴓>}ۿʹL:iY`0^0BHQo=7CV XNd163pb hKfH(*L*&t2*Q0M[f ­vwZyR|͹i:Jp$JH# pxa(DDp$$9$Tx?-mgSYK J`J[h,"xd#i2j2F $\gxu1Ծxww{O{ܛ_^\vε;q߉PXO< NCuv{jM{͇60!P+8ct_+D^K)X^j "n/TvmTZZL4޶zM r qd)#Q?^0p͈Ix0%<|a9akn:j b.z@7>+TT bADsTIyT ,NsγiQz>|γA |Y Q'0pƚzmOY(y U)UJO^<%uۺh!d6+p~|M"t2eE;qnGXvT$&u:J"Uݞ'p@(0R\/r,{Cyo`P 7Rs fYU-!x<+K*.VJd0@L4 $d9"GsTH%:FXWVjm"X%_3<(. 3yz5x;^e߸,"gdH ,v-[]φŹ:f:vϯ׻|sێ'X>σOM}&$\ }_P,x8ẁOGb0ۭV˲߼ ݍrjS¢.(4 @s]Qqtc!S2i#/&_{ jUW_ݽmtG igHɽGc^>Oqv @86M1bV&v7Jf`!b*\O3{B rlemd  HiM9^KT且km?- f\)'ʆptMQVnI.`L16d[>$5l/aYLl0nWVJ^'k'5g6su%\&9miC[M$k wwJ P-[x6Ki# ‰653QGBbbaNKW/,LeK Gx: ?`!(vz5c%3p MB ?eq,\m PGD"A\к38D] LL˄9$fd7cay_ۆ[]@?-W!՘L[ &_= @iA\:4I'8tw3!JW[֟ M~Ώl*<~zɄ۠ỵՍZPNDwCm*эUQ3yk0O73iZYDl>Uc讬^h@&K Gs)5%diWUh"@Ň [o; [IH%^QXJrT0'_;0|`RcQ1LSG[M@,ƣ@hXa6ET>pCud00tWRy1n~G+`H$Ӫv~<$YFYh+`ÙlJԦjׅ=DXLb"I5YlM0d =;=esisT}*vQ]kk) NVjeM0Rm6 "ϗߟ':"/i:ó@,ƎO(6h7IaiXmjx_Www`onmٱ7u WnqachCkMQ6-<dEƠN+{Lj[a')?>P0Yr8i`S( R8 0foZ$FRrt]#"+r@A "z'I~E5FYKab4B(M|zsJD_o۝.{[gM߳ wr~S5GƇNhQ\dyTI|i$A*T XCzb}#9^\:Ѓ_SP׏:BѹݙzķN ß/~Z5o( ^4,f(+A0s} 2(G.wwB˵RuB,o}`XA{*h, ky9ob ymEaH#'LmZ(@_1@ߡEgb[q,koHU_$q{ yԮx` 1 6}PWK; N's!Q=圥}R?Ű, ֜Sxы۫ڇ|ܑ#xFH5S0yH+@;9;RJ!^, .-`ǽaWي7gwRYP@ )8ƍ<.>qO(ZT_A̱kLQ&d#e&lS_zwnesz='<aDK)znuݝ.5S̹(&#{Tsk׿h3=cZAd,t[dm*Û)"J>݌=B*G%e2"%QXKj{(# %!>?`lنfZ=-nertpǩcZV`FQEVCdw((]t80OG߬7#Ѩr3K~k?[_:U B]_={jT"Fz5[)d4c.1rC DMKU+r$f`BX"K"tu]Su=hY ~ߺDEw>s9j!Cza) :j|y@EEAզk\|PquKMSs2>0Zx!iś8)9FQH&jb=gt|U:v߮; ` 84$/j2p1lF!{u*.Krs ƂAo[-6w6U(P ިn4 B y?#I

*?k$!5|[JqݻLO٘RBp;{'<1[D!)x*--/E$*,Kb9!6oOǧZk'q㳞}/$_϶;4O3Ʋ99 9Hf.6l Оί/!FI"*v,\5FL R=򅌘xn[b! Z0I)&xg@'Ig֜a -MlxkdiLe/ڙ"8vv0b@m|}|c;{nWmN׭^ Ńŭ]cb)ܺ4F\"qȅ $]ֱ?&ֳP\DT>g ׷WgOB`o&Y!-hI\Uܔc0jޡKɭP9qPum*rpQst"E:J/`ymewۙ_6i&3sT$0t!+S~`a>+{BP8qf) `:id*EP$m#},k wGAıƒO>O_:{ eGPF;cENzo/ aD'ON8$B:]|z?a"LYk\\_zѱ+esٸ-s4IC yXZ=(<QGsGvv }o^{bJ!EY80Gi4PחOFz5\ c #QUw\g`vaYy -X `XO>7?z  XE}$I&SUi-pCQ"ť0V:-r1~F.C&t4`Vyr5B֘4ihMMFc*oျXz>FiE{̀LUC?J̥9jHDm?b?^\90qʟZdp+lLmjeLp6JRv/x"RܯqK8l X/gy(FT[i}RaвuuaKG)"43IE`L'ǩ,R6@kSOb3%$m I_Tmd"HĦcR7g:ϼPqU=mnDg3KT`s6)&1h{FH*W>o~$aC`9gpK]sjs,v="ӏ/6SM##jio|Tbp^k֫(O. E740#ݸow21nn-g/~@`x9&|9&^^gŕ߆ 1CX\_,4[@ ,Zʟ7 ٧L}+4o}wVnX跿~BO̟ ,R6cc Tܛ)2׿ B̳LfMd ]8D$EPc2 po*fFf *l *Z U]6H&auenUgxO8I@A DPJjYJ 8ueYE@ܲL '27 uhftEAHmBKeI"Hb vmJ?2&HXp5].")vMJ_S?K5;]{ \ }o{=L9!dZ pݣ.o~l/qaP zs`$2@n(Eip DQc8ǣNǟ`4MY;ɋ;E $ 8'H2Ȳ*7|79VJT, K^= p&ߦ܁#aEW/& /h(au~`u?8kyo fC"xaURBbR7Άz]c9SaqM%_~9/qϟ?gpJLi˴DUf؜K!6ϦZ9*π{cL`ՆQ#fpZasMBI0~"P08{dU7a:oWe Tj߀TpUA$SmYsY vU,EI?{SY9Dժ`oя릵]~ϷޤndY_uҢ,sIf6Gw<È,?;NSPM~Uoٰ agQrMЗt1W?jvt KVMEZH C~%<@0>{xɓǟ$A1MuSqeޱjwU.Vh0o ۼUW 97O,^>^Z{{5ɽ/2GXl0^ũeTN/&%T\TC7wPZ'| ETJ؁Ptmascsc|6NlvۓmҺUjVmuI*|`0ssů}ϗi-\K@;s#.ݛYWVY*p}$0G3onkD DrP=R{@d"P"V(5X6M̀h1%(bʠ>!d;ۜ$)0ݎiox0~{mgAR<:nY"DQBntT4noq)OQ PE4M T8I`2pJexZ< Fp[vo3EHSnj-P^v--mPa,?tYvwvû/NN^pBDtX,8urhMU`nkRڄAЉ-tnhX ?b72G 7 XDA,"]o c0q2HbMQ՚)^@釡X9? "^vb0*"b|ia;'W+J wտҬ)#$v::ST(x 'yڭ ]lyƿ}_s=A!E> XR+<#"N@Ј1izǧ'o޾E2[? p؏|g«eF7n2]%9ܓv3-R\Ηƭ"YiH{joW+x57 @ 5<v;7 wrܲ;I@WBkk - f4A_?o 8|) s(( EP@F f=;Qy5a}JL!+sĘ$a7}~_t?'P&Ղ֝u=h{|r8lgk1wه>==VXD www:$q _mfqY7hQn?]$[mvpEetx;XeoeoE^DQ|aKg_(mD`XpSY Bltz{hϛ"`ֱR'wwcubU$i6,BҲ,]/pb^tcClNG?;^nWn#{4~3Tk7!(rf06­kx^WjՒ{s8R8 {@ Ǫ-߯\S+dQv"WEpϿlc[KE1/ 'N ~`8;7 Dk F,UByZdX7)I8EOc\F8Vmr:j2HwY W$ADBXMfܣ56 "X.A*30,/1zOάq"-[mɒ;9HeY~6TPEQEذr_-[}Ri4}S=XXHBhi/[M2cসkFC e9bn& gss wgKoyt.[xQOhS4pQBlQsNYTʒ,_Wk),G5wFu^geqӼв#8W9,2p6q,W6TM DJ1$!`,楙ѣah^ "| Cg: \m$fyAmlgx~1^[jo#4fhApnc Ԫ50eqL{~qRTL{[ށVehv!^R,$=m ]y\~q,?Nq haL •|?UijRZ8cIItIb{;AЁ04çaWaX-sU*1]W0P")ϓ?.uuɌTeR:+ b)(^,w5U$`>ʍYUV%%ohƁ?IIہ2׋)xxY,^f"^kzs!A*eHw)C[d(xt=/1"+mҗPHUF,CJ_3HzʮpMtvF7mV1N@vx+%[0 z`nq˯?=w;J ۷k33Ӱw8+ w}=vJM/MXzG=XrT2FSTsra'o& /H͈s7z 5I2t3ݗZZ'/")P~w@0(EI,xV":*pOMZ[,+M 'E%tz8uVjΛWD]5Bk_GY?^TQ_άm# $2$%Zbٲfq&(Zh٢OEmꬍ8%K*Y(R"9\zgf|E<Vjv.+9 |̡:cuPaCg4=*!Q&G*M-F̢(S=Z hF+K[k!3bIGI'>̲8G|q}Y:z7D(,@0ō&$b> I&#/p| iȪdjh޹~)bҹ^^^85EⒶ$Y(e(7ՍUh:IRJOQ,%B1MTEujnA66wwwV ҙl2LUZ3TvKy w><+]Mo; d}Ju]z?YͲ|6yN^ұ߿!eAjoᇃ!/WրpyS޺괓y/eU׹ɏ;bћ?ABQݤ$fkdM53k+++ :ûQζYiUSb&8jm k/{PBdwT׻wy0R?8XRP~n[x{!7' $|`jvZnmJ{Ynǎ[ 1/~~!^ˋK%Z6,I@cxhvؙOwjikmd|3A2'T=d016M'ۇ0" Vbur S#&gng„?Z 3iyK(3eVKk+ *yv~pz~+ZZU`oyH4ps8TY$% 0%&8\=7I,. IRӧZʧÏPfeS5 l`ra4[D& G̚60mŽ$vL;EpWdډwa5جIHk;=##B,P}h%G"Cr,(r\kE[Dvu04/+50з>Y&vo&avS{ZMa ǩry^ݒ,ֵ m& z!wD@ܖJmjnh<~I 5m^۽fnz)pݶR4r?i߂m({B@#6M2Kb2p=a(mo,A#cGg|cgΠy[peY ~jb oVlxVhwZtзeA͊jqRZ3`Q)4$"?2s2tNLdJɊa<|_K/73udknE޾K2ܗ/0]޿Cnod*. pDU B>s)>\}P= j{D*x#SJHJSux<>}>-D X)u]ͥڗs8!$ǣq?_<@f*L Z|-)< iLc. )HCYQ;H\J /}Tg;` AӔlLG5(Oei1Fl͏<.L Qs\{qzxUŐk׹hE1*Tl;R Hb>.>\PoV7XCm<?yb[e<=Uf z c+TMkAV:0Fd^K N$VH#xwkl"N " pTCs<y%/J4g]ȁz:_h rh8̖rJNONjnJ!eYI&q8 <5\sLۦ0]vɲK8iЖeaHYKBR'm;"ɲźhyF#ݍmVDPTeG 'm>?,FI+.l`A*ñQW&,td6;9C/%PB:}sffug+9"i{8 C j"!`woZWbun 6jC0f=[.gJX{׻|u"chw|{:dYSgB~>;Oxb\l{NBT7r9"p7 M1ͣ i{/O7;[$IdFY՛r`Q-zzb9BCh.8SMHI%Q"".7!(3RA.ER7X 2Ls}(˶{4 (EETQk?PN|4 ʪ,w9{^we_ J) n~V-VF7'7p?f4zsT?-+,łey-D15 TՕ*E/w}?D0|]Bf"%MHJCXlN($]d @f;#ZWr|JIeEb/s@VEBp&623(dLѨ< L9_7m+þbsu MI%KNi/O&Ԯ{TUՔK&Kӄ%`l㻽gw~t1O}Ҹjh2h Ga;xw?)Ws ͝ D \ăISp_P\T HD)kt|x7 D(HuVSmN;+5HwI˨(f*ZH̘G?n_ˆRgq~-Q0UU[jR&`6!+|1CةXo|@n%4 ,_l`d9DŴ{k&!v7& cgwLͶ|anZ zp0vck{/w+ VqڗuJEhz4T`(;vfZFr8~nA(ק^ea؞ 9`z3Qk z^K)[7IYyVD ]7`upZE dQ9zsՆ)|rFxO]hzH\3~[FK|4D͘7[ C6k5ڤyspt6C?%g"ñr;xcPrb4 "`b\R&i]a}EέEJ\/`@a\חlmũ 05@2ؾ5uà::uDw:FⵍE2NGYPy~H\'b0!3tf]]K7cptZA9e涱dmMv{HmpnHjWp|`O+ 3o~x~K+EQ8 !AE}<&NYX0z|x6  lp 1+fX* vVvfO# f{j&AklC_ #hwۆUW\X;yuÃC2x,RAxJVVђ5oӟ7APd+:IHNbP Ev{vyToQtfs"҄y8gN*v'o*8 QEd4NzZjzL!hɉه5**YQii5 S`ahCv?C1dBV=w+Λ72Ox@NL%ti{V.)5Fye3`=AV AQ?=> m{ ~TTN rGF?$urm4dN~# Ua.˲"DS3+V^ӱ?4.M=;pXY4-f3hd YA GCS$ϰ,Â7Z&q\׌^pSX*hjDM'6iķHdWUyh/_TrQVLrQ55/ed7h wOwnF@ ]JV% 20&3H jdm2Sm7O8YƳ"WyMzÑ7J0H5JjH-&4 S{Ɍ.[`зrF'0B0LR I̕ iN:]rRNZ/`esVZ.@B8פM:'۷Nکm:Y+x`A F=J0Au*g#d2.V6JV4(Q\asdeD"& H8Vi+g8B͌N=X&(ep zv!'΃jYQXMTr%d] lNm^1mSRQՄ.L~d6]y+,Ƌyӆ/E93|Q3)#մ( )VjjsAR$HiN8 "r$~ҖNj$Nf LXnmE02` hewޜۙw;ܘuN.IA svXk<ܵre*[B̍J<ާ3y <,dJIzk:8ًq*{fbA&a(P)2A3Lm}~g@&XCky >"2h|%] Vs㍧m7/]BtUzio#fqjoZl*,@C\ $E˵*EQ Ͱ9 Q1,bh&IHg9.CG zin Zp]EWs>]n V U6ռ{׭g3 446ҷwD/Ɋ,@+Z-KYF&FAh-co4TQA:5!/ ct621Cf GݥGv{ջq~۹xy=+ߊ:ӛ @Q>[Ga^K2Z}7ۚEC!|l^C; )CA((7u U<,_ w\:"ɭг=Y(|2?ֶ֬7wTEg8V+y%"?x:]ۃ1`l1%@|,x@t3╿2-rdjJ]ebrn섌7ݳGOmmzɂG5N} "gu:w)?nWGe %qL9{a뺦:q GӾ11 lI@|rS2}wx>&);0Cu9BH,]Í#b|fnoifl6&pT<qVmxF(̨d0T~'R<]LQ$N2.Tjc9 s AR @y"{wvzr&Lj:tl{-P#h!Z楢)G@bB)q`_?Fdr< tRV%y"7|/:=,CkZS=O9myCq,"IgtplxBX3,3vW0J -b"&hRU.c9ǽ)lL^]9iX 9O ̏~f?}hlk7\7;sMͿ;WrY^bjk%bר'W;d>dz]Ks6 #rZG_k,/YfԐ Ƨbҭr5?WC_=}tp7405|t~v6Ԛ{=4 - ^OIU3(btcĎ{G8˜?^L]is`.mov_9@{f E\o3TYQ8M #@UUqC) ι|cZgl@NEkݼ_;6VkmV+t;Dh $;X'~P?PdYmtPS|ޢ`O",WwI X4HA| ǃ$aczׁ]*fGۋ?O#6r T+j#9T.K(U,N(Nȓ|(I 똤 ѧڲ \Ӷ8`s $iK6I݇~Uk$YB c1n=y86_ ]CO!+}[nV[$`: q!|QDߏBSݧ|K✡gl:@1HJtH7G`V9Q23MP4ʓ($0,=( p{)}续=M\Ϳ_}Y3[jr'=~20d/Ai2πYN".1EJ*(d{Gp<<(8Ki;67h4>:b>|~/H%Qz FVON덦mI!I8o~{[*GbA}r"ZAwSzhS`|A'#I*@c02EQ[ϻ|ֺ”'vCF0bG U,#wo~ LO6J`Uɖ`{ ,meYv.XᦓiϞ=X=}A x:TB6(N$Z]x+&8-% κDnq,[$LKjET{As( \8 Ff=CqئQہڻ=˱_QXXX,u}AcŃj$؄+q(Tk`NZ0ڜ:k߾nƃ/dž߉e&m[AR3v.Źeϗ_!?|xݿj+|1Yڼ[kdz{J4g[6Y 7ȴM]ERK`V (>ַ`zlG4D}DŽAWFXV9Oa-ͅFC3Yd 4q@@<-ͽV)/f Y]?g#А5f⹮eP-a#6IR @FN"ZWiTO:| uTU"f0LZ9W;U%T A6g; T#Fð́7>SdN $ac|ss}txWbK.JQ{~8y_2X Sh7+|% "U`w(Xx@0u78@ ojfy0yvUS")UHmL': 5!m:~\ ݮ(<Ɔñl\n$IB'E۶Eq))Q"5-+ݸh _[H7&cplY7)W_ ߻kͧ0yGj$3<\HAn_6#V`iln21FWճ;\ah7AcIUD5m]\~WJ%&1ue@C{?|_ۭ]]v<8I!ô.WTf㢑MDAH pp,6I H,xAgvlhu]Ft|NsY}x,ɄpcݕJz uѝTHQ;RcJK" |* g|^-W<Ӣ% C/H؜hP Hx%Z|_Gx3vֳSu H>qm!`Vv*)R5@$@Ӓ91?A x\Y)?)=2tuz b}9{5+$,ELψcd~z[=vS5mW֝A**_n^`hQ 2f9ȪVݫhfq椱rfk M`9<ŗB D|^ezZ`u`g+IO,K˷t%/Rݬ| a^'4ݛwjm/\^_?6̧q\5vԷ!A3c7&lVx1~,4 i<¶t>EX'$P{ty}qm"L %d~4z{5Mj z?^jM =PV4E7 &gs 9YA*p?`U%;J2''Ns$V ~ORU~G|1+V@XPr+$B6-NwŹ֦ulKp&9 a#__}鵏UwgN;!޼np8̶Â2, QHYG k(cڟ 2,]כ< G{f͵EA@횫YκQo撊[w1t=Eb,&NjiI1o1˫&,}t-iCT([/Jf檝I2?O £w zxem*FxG02w,TH4"h:|R}L)ZsH`qGwx!1>7++ [*FIIi5izF]߯vR͋X8in.4䳐4M3n2* `j_Y+J5!e@@fjvj-c>X9k)obx,Lj1Cq5йjO:ҽ\9RʀyJ>Í(cs2@Ar0DQy~ѵi!G_n3 (@ sC݈ͪT:#EAy̑^/Wi^<%e Aq0GTx&WAn}&ALZVĄ*?<`9)t}q~$ ]+ %1#Ӵ(zk%{:WS\:4'!jiZQ0 Ae&&jRLB|bM{6qPJX}3"Q3-k[LKe%%%"@6~߰ +ܬ=ZXJĐ'@qNC0|"=?(:洑0 HDǢb\bI,g(+'x[ߏBo{WZn9T=a%H썾]"Y"yw9LQSh.Z6r 2V BpҜJdnh5 ::=F@#$`v|-_\Adv3eG2]CPfLwzjͫ5Z+c\FI2"*hKnD !z"I˳wג\`{gNCHU#qF" ")Qqh _ף1FRg|Rst H2x0HIFZZDQt2v7AbwȄC[e"|+˟]k~hZ,bÒ=/~~pF`F r4upnN++Zu_jvt:=ߺ7kOs,EƄt鴙hpqѿX(۰9ӡ<EDbl(1sVR !^x]f(Fy[?'(}/aT2`AW@$u*#þdD>`NR DHa޵B!!)pe'%%!DA"p,͡Aa"R)U|М'd\Rm_.~G&W $+1zd{iW6~e1-b7 BЇ=:"wI.i6E 3?j[n+*åR"Gn>$&Ծo8 g|ڔ-՜'7ч?> "BJD> =u!aVsLu|ȭu۶ٌ&Vkiʞ Ɛ0Wn=d$eNTDP[x3ٻ^C7P/f;?|>T2UUJyFڔ9®4C8 \,]^ :q๱8^Olm#r)"EIՔ$Ŏ$mE=S6}%a;^dyFQJQ\Ľ~{=3^sȡDQ ^ɞթc4(y㍵q$_f>Q 1HчM()6w{+Ǔvp.J? բ'꾹+ %Ý\ܖ|ݓ5 #WeR7,SQ'$" p2R#C9mP!X,am > PGp ,OFԟG8- gS=LZȧ!L;.*D47OTe Ct}t#_!c^m=>:>vM+FrXer$M|; ᐊр#DF[eA6f3B^Y l%1Rzu57B#|.;}]A4 m8N:wy+Mj![$c$$=LLvВڝ)W!.|# H,孧[+_LsH/'E OWj\$흧{(;LJvͭ\6;zF;]۞|aWK \',CKbOΫ2«J%ɐ 7! n B؎K%Z֮V[%ߖ\(8Es 3̲L]3ٔoGQUBv`h9m4_{L>e2DE9CU؄R7.:s:וG޶"0e3Wrb6u]W %amuwʒx;s bIbh>,8H&`\c! rm׭m>Ui֨n1!3D&)7yV *Vr~BYH(ZkZVb! c1IW-L zm YViw(m⧿~ ݦrJϣ YUq~{sttd?cpc8뚞u%pAF+ۜPLIH=P>Zn>^ Exv' oGܚ8~1{|كmh7Swri*tR*$lxp(!vjHndxE o[(}Õtz! X}3pW1n-Pٶ"i+{#WE~hh'9z:7u׾nԕLS%_ǵ }47eg 0tgZqӽ#G@8xy:@;"wza1X&E0/^BKr '; "& d{h@=TaWw`Ѐ3 MQ1z lpcǕ"HBbO>>S%i;S܊R:no5V؝o6*ys CL!8 FևK)! k{Z"irDe 8XwqUa o8qZaspk%⊊\\9~u NFL鑭O'w DhW匌A2 Ν>/ $I"8R`!ُV 0 ̘dI&kQJ}ܷ>UI*UQ20,  ^zƓg{ R RL&zH gY#"'UY (d5 ͗FSW%X\Mkϊ6yw@|sт\yU}PfO"//'G_!`b$U^[o dEd=϶A7,\F:J81$܎uA>TJ3ۨvnGn֗&e ?vdݯ~|⧚A"˥[< DBOϷsL~N`DVWX1Pdy*Jl p63Pq7@J,Pʾu2Q|CSheHZ 1 , Iy'' Ly#OdtF/j٫8K9s}r5QA4A[7[rkaW2Dߵ1ԃ}FO_="T|OtF MJ@!wK([ ;W tEARf;&TE<`?%FI;̃A{v~,0B*-%pkҠ䝽$od}Jbv|ʹIӬKn頃(7-W\" &46ic[.]щᵰX=~KDsj탛 UZ8sԡheduZT4_pi>W=;(c#G!Dݱ:YwidkjPIBH&4m;^ 0[b֞U;2s:5kclF%Ҽa.FqZJ v zP9㹫Ǡ(Y_Vv|'*E/+/ @&.Lm p( $fST9"Bc!scZT(֯/^c8Ӊ}k/C$Iy+`91$ŨO߼PXIDYWNDMh6θ&zjF IS0Mk:t~@y@x~8 Gaa!IϴiZ ׈F Q8dM`1,(5=[7$ߪN߼(Jo7jw:Lgl7)-g^^bޠ1.',˲(CM{CHI +'_\zX̏3~SC0n81>O6JD˨)$N RG6t=DCGҽI+úrcX~_]Y+8rÓԍĂP.Gki$16][5y%H;|r7-ń}mh[(=iAi=g>,Vmqb[UW2Grڨh]T4:u wIzW5v9Cg>v'ZsݹPCf֨WT.:8|%0Ed'>OkG?e\M+ `L N^ZD\`Suh&4F-D 0v͙hZqmN8^|wij'O+wL Jաά_WFnPfh jo./Oۯ}r$_]))9g9N14 mSXWџ !PH>I.}YU '[s|O+̇#=Xo@U+Wx, r#eq4uo/($goV7)ly)rr@~ߛIMc{S% )nW .pyyAx!GZe ]=ʿ1/'o=%wqv(h~P<  bQqsI! zqQ)V+9uGm{A7WʍnG&yuޜZ8,[l.!aC/ ,rC< <'o؆EUuZGyV0V%\n,oF|I&u#1!8H4_"81XaBeҏ/u R'2'wI|ZR]p1fcR1A!@E%als$8L OiƤX|xJkAX{^Mp]yd//Q>ksch%wV@'(mNq)5_& Q|3"ed4"8BA h {; 傘jp'),yyuE>6(Jh1^ҵWWbނSdg{glE% zZ`ם_ wݦHˏÕrE>= 2`q ؂ȵ;m6Ai aa[B>_,+*вó5V'u~pVyV؁ґź"uWU+E]}>z=2JDiW9m# I !8סmm'Gӯ_NfNĎBpC }.Vծ~3zGl*OX4&ne0|阎ebb佀[ewjO:iԉl`c`q,n 0ޒ'82B!PН MϗooNGSn*oѿu'sBB ĬvH N'`i?W4uP}ͱ2Jd%4QBX  V"NG\f}V[t4%Q2 ߀DA%K(L^^5͐˄=2 S|,[!;<"h$t[ȳt*xV"NQx.,>pW w|WngWB;|6]ZJっL0(l`\OSnaNG8Ʊ v "_uA J%^?ml.%%K50ᵲ`9FQe0=د(>:=ZAJ9SKĘEƗo儘$B"qe8 ~6bI BQBlgy!!JH㜾x8o(_p{aqawx.(O 4 dShCpYlT 4&Et阥bŽGǗ"-i~Tl 6 ZF -{ =f4C[˞rr;2[?apmh5޾8.jf4bH@;AaX:AÇuqQQ&ŰYScxɦ˥aYtKp [5)@nJwO%˃.. qħbRw94[,_z};m&w8i-l]Y6fmp|vM劅~y[j D#i8 гޙYjca/t24bT@' Z GJ %sUS"`13QJ$ =+[nM)![/ gD(Ƶ=ْW" R굛"xN`&Hl"g}6;\5ɤ,OQ͞i;Zm\y0 >$^@d\ƌ,CnI\L4Id<o1_^;g$B?z$&[g1]t8Fӹlḱ92pmMFd2 j}MTU\_ tg_57oAXӇ1뗶b>1P/{7s|CNތ>Ւ8860 x{<8qZH $-墂ifqg9sq{sI;'ٞ^|S,\-w,J~+,ҿ }LJCm(\8G~Zw^z..u" E7$L{04{m&Ux^r KWpB/RYg*f7<áTi]Ms5{OS?CaI6!J[ꞪCủgsHtLpĊӱǭ0m]ђ97( Zz5*s-$¥ Aڍ8cANwrp4 +>mnZjɲqtE>trf̆DA1w-LTԩ3q 6cp4تwQ,( 2WȎgÁ` C\)דZuVNYB!RX V8NX"|iH#%+XmLc ?zX[\_h x<`l\rF".gձԛo'mL$KMMQs)N -iAAX$!f&sA>NQ&iLVuyLa Mߡ"FB w Ņij&*a)xaaP7GT"q<p Ś4bMj@.J^ūa2߮ߘ39M8E DP*@~>:bcaIp$NQ^. GPRnkwc}|#>{(FST.vxh|# #ddTz*SjݳOlZ2Uw+h9 %NT}BmFeE51G603x:ŹNZFcr|8Ϗ| y'?< zV[Wk}R%`N?vxu۹Kr2}S*b"z WᎪO{ow=cctT>ެjbs* EF8`q @U i~h"B)Nöq'Md[[VO*>}y<KO6W$H&l&| /,R_9V љ.maX# 1t%iN3wL6wڎq B+Іz w>:X,], 37%YJ4m/}w5K%uZ(M, :H$4 !5Xaj6C؆f:Y!1#юcYE1@`آ[l*h(h@m j,Ǯ"#@"2jOWve_q'aRT0ax4DQPh|oxk/ݎ& 9syp%V`bK`-1MsiZTTA\o`RX% Cl:]uhi,Quv0!t 4pr9J}h0ޕ4 MQ!9am\HdĶa860 Ms`'˲Yf<+Y Ӝ9Nd7 1$ I}[dScb[V_JBJwV'Z釟/KqxY 2MPA60YPSk{Ǯ WH }8'|?M֗ne+_:זT9 k~ `5v. "l]dI1h8 A(#* n̞ڶ0._-־ؖM1qHHHNNN_fm:m!/Ȳ%}8|9^P?4O,C(A.]V;!Av#!L%+g㇓v+zTԭ fMpjn[9OkjcPt}vv][[ puIC}E'gCYZ+= z:B+o⛺x b̗WĞ, t!׷'S5-̋dX5!E'|0_iYfhD"*9K˕g]1/bb,ʬl˜5-qݿc#uְW 3,X@20bH<|8la8#=?O!v,eܓzbBҟV>'~j,w=^inmWI@]6ne$dQ9FKMϝmb,K,+4\mw`Nw9-P"p@o*HB)%D3$%Qn<GQ1*g3$*HM'r hZl/&{؃Kj}1 h$ۡ&t< 0fVģI-+5r{l?m QEkn%b\$/?RX\ep0!{6h^a5dIcR; J&{ި9X_Yb 8 * Ϩda7ǵҨ~>V*f0}eU~c a!=zwre_wH(ms7'h !P]߯6aesP#Q*ݪaF(.OJ=]?j2Ezl5 L@n#I+,hښ梻Os:yYI5W<&FKq!u=*]Kϟa~}pW6؀ BPrܹd s / љ/iQ}b;v3vI2iow 2LNӤKf%Y A@w|Yk2-骮Z"wSȋn E̪)ɸ2Fp -1ax^p]/]oKD k䓹G1Y @Cˊ$R *[9/Vf@1 tL>Q9l>emNQĦ0@DYINJvC~ )h7n缽 W!`i+!N`@nSGPW;Pin,,i4*? oNjIVj[nGY !JVqVjovD ?#"xAqpQ!DGQCCyeG*ߝO|x>X߳OiE<JX+ LGپIb˲G_vD=e 8>(UwE&kWe- qyEp 'a88 p ERX1Rt(1fN{os1= wdq g=ߞ g;tHC0XYxNZP]te4AeR8I eL~ozcC4AI! ,Y d s -9GS$NxXΧkcNkfMl8T:8ཹ1q{yэD{gg?,ϓ{=<:S5Eєt5^=a?TY/Ι~mՐR?IMXUESmԕ:7+vyO'{yHk׮WSbE p%enUR\w2&c 9uMs]#FL`fK]G0ZBz za}A:Q? ̭ڵ1EP*LRK'1x$0l4qgsN*hB:/K,MfJPklkC΃Mxrt hmfV~k-h{6  iLTJzv-vƉ5:3aqAw>%F AiEä[Ҵ-ؼ}_~#n+ZC-V/U74AXs~qyxSb4Ev)Ţ \(cC?clC^Tk$٬. Y\h%Q1gٛishALjǍǽ?R0#X!YT;% dFb2辺[4Ax zcOߔM9GR"x=Ʌ2%ETܜffG E5W,H7B6q Xk`AY|Y<΂`Jr޳ Lhy ,^W!(yN.WtПY _kh{/(^e-vր2uߝqٜ$Ig<ϓ2d6$NA>ugk?S$]'n(۷"$R {۪VbEBY H!HDPS3`J)ysOZbf$dSp}텎ՄuhE+P,X5`>^~hfFBW+4.5C̓:ɐjCS R*4<[<') S"[͝]UZj%?*%8["\&W/7EntyveE io(aږR C30· [FNiO<,hZ|HL^u:K7yLdqV?~!eh1^^ZrG*W^OL X2 k͍n{rqtyۡEf7{3n-FɫOvmBVO;G<&(kK&K{M{zzrQzVo(_TttPjE+eQJ$`tu{QP.h;ԏ kVo?ލ<ogZة(٪:OG~J"cznNqiTWۇ$BAP?cK(fN[q FDN{7Yߌ $1$zkcNn fJ6]>k4ػ `Ѳ([hFB!BQH"+R( 6&J}P%xCb^)758 ٵ|PQ8۳ 6ȋRWkv= 8]TSĨ/'fv6i^bBl"hܫ{t\=|O~EMn^?_##6v+[VD$HsjFךXپhwtxP$mLHLؒS\[Whn,5Zn}M2Ǔb$KZnkRl`UIJXUI.0RJs߽]ʗX!W<0,Te4I,aW/6VF XYOj.{pas0[~:+$ÉF#8R[,"+$Н~[9ȑt+lq*=?Fl yv*u=u, '@ iM.K?l% . ΙSS-XSjv`ٯS'R1za٤v|H #$A%*F%bq?VSΗ۹<vfL6H>;h\3j̱ЎC4b9vs-p{rs!qc5.y]:;%N=o 6l5XԽthmvK}G/W:&hbqRnEIN!o QĤa,Bu~Cp'QT,!֩U'ǖ3ӄd=sdP(,zΛ7q + NyTɗݎ^*֮+m նMi13q;gdLgiԂ@B?x@}@T@0tK&63'qq 7ɲ;{o?nҙ΍%}6Va8$w+RRLlVTH*՚4^Q7! p"`ԡB(fe8@ƃѨ?#8 DIA2ٳ+]xf,7$$WtqB9q ^E#QKgUwB>9Nǖ#skh!R9@4s*'$ہ{XGpQaD! [Î5i:KcnDyRi*9qA"QП+[ni&3 ^{3-VR6'܉E<J l4.6sGx41frX(M'yrʴRЧ,jLjJrw7h%Aڒ+Y|l=E0R29ۑL$2 ,8Yf"uk ;DӅ U,$I65-շB֮kQD@PxS"Jpiͦ9}SGۡp[xiǸ%~- hRΥ 0l<q!)l^+p7ZژΦm覾_ً` ^Eި3xݿA$Œc,9ە)fp+CK"tX:ۇGd*o[xNw1KZ\jylfWa@v˻42a_U_5;7~hAXmfcu{-TFa=c-34vR:[un*x<'1m)"7Ȼ7> o 8KٽŎv\Ѝ/Y'_qC($Fȸ-L{6 bomI)`s+t>bqLJ\ʞ9 ?w'WbɂXVpQ޾">:%$ꕘ h4T74 8E8 8ݱX6='g4fئj*OKn)Y}4gRpuu٘;E2U|\udtd YDK؂'7>SXO(r+t!@Pv.cMk~' Tm -`v+l>RA] '$rkF@$2h lR 6:ôΏW7M*Izs?0ѽ"Db͞$= K {NLh#!LG\?f%)/鋴!ph4˭4{`ql ǡU{XqjdBH.diK*zpC2(u~,Ag07V__"_-ҰRԩ!R4-r>BxDK36 мYsL#im۽z+ۏZ u!Y!z@  ͤE7@LdHsV!V\ɖ"RBc0ӿ r3`wۄNH"ZRUr|v,@G(dGt;V9`N]Bqm蛮署yT }8kGx6ȋwmbCݜM.ŴM" Rh9{F^@_5cMeY1J' !eu`>qxFժE鋻z#1)`8td!XJSTR>Y@ \ɋ d* ӘGά# zu d\Q]sRPЍW㻢iXωZ2%5 CA c3N~gCk@CApLVd b!/DE9?tF#GuUͩ'jG¦Qُ?1ZJ1Ӹ=}fv56P{g`]DY=ysj]4G}x\qOQe4E^ g`iQ,eITXׇ2buQ]0n=]HN&/{7Wf~XΞ]<\$%T`8%p/y''oK0sojtv iromۜXn0 wWw^(K/woH=a8/Yhk=5ݭ֪Vxq`XZ"D6O@Cnn[d1>hH|^q٢V*X,Kye-*Zqe'Ϟ) cݣ'׏7|;f"7oWHMX湈"16z:sXM ~}C&)ٜ@0L }hW g!ܝwOcs7{*`:yEշ8yǥW5 J^;# %ݮ~qYOM#86w&DQTRRnJUUIw&{fw/lc|s _f_x1@d0Lq1&ɓ˿jXb<e}XkP6-r<^4JIAHOUy n(cFۃT-{ ĄJQ,[XjFM"`暖: Qk=;w` wMsAmұLT֧/ϥH>}gqaIR.uEM]}lharXq<ą1\|xMmsƣSR<`^}n&FDDDNNٍf4KL{YzFMA+~7&a9d4 R FۃFpFLe-<' #I̩J2m 'WWV>1t!W-r ~fBQ6ڹQ`??{P'tbSsM øo`lkHҐBU봋4}`S[[SZ@.IHs1Wl`͟l<;9m 6oǔ,}K5AJ`L=|q$GH[CC9dL:A`ò4dՁFrVf`*X$)Ri Fucc}QN䓱jACnAAQ`SdʵR<%ESqu※oy}-MeV zB6{w\||{N^*3UFv[}Cq1xZ#$}1:>`JeS(Rk_ N)ZUGx4#2DpQ2lDwuq~~!fD%d*rZӹ_~ZZSD, <'J ѩu!0,?B$aұ 5]Y8dԠYkf5P z穔?w^@E@R0%桟 pޝ}dJbq}ԙ96"ihzm0jhd#7%`]J%Jd{b:/"H! |i88t(8kڵR >РR Ӧ'摕jn)'RN(fy 6u??/Vzq9F:H9Gpty%c<&W2~Wn 9~}͒P .椌LqK 3N]iЭ[ b1R_CoU7KBES_B6_<>ٟG#4맚b~KJۃt%<`5c=IMKPm>5?ïK(N h1BCT=ܼ%߶t{ GeA)^mCg_=E'&#7}[sh;A((`hNZ֭Ga$~txد9aZptl E= bsp+@}}Ӹl^2'*$3Y>Cs<^> 7G( {bjw];ѧ߫D)4;;\1BE} s#4"NR!3t!N@GTI6:S4ࡍ*ke"B%̽y &ܹ%afys: ΁Gͦӑpu =*LdQ%#TX{ר]}vs݆SI/m$AU%%eLƹxè) y/g0,q5ƓqjFEQy)ovTIud8ՖlZt+Erd2Px[x ̕!#u1/5M1)U)Id6pO&nVI$iR̗lƱ|ZF]xZ' t!wWg0ّ>KNI}yI0f CҶ@#q#8Q!)= @yHp>nu}ms!x> ?C?= 9L‡ϧpc+d2\q,@&B=ֳh M`TǧoOOɤ9xS^UO;vM?QJ"HIk/nj>Caw<1ީX$RAA94H䄚6i1YL^[V˓qT=7@OA` DU*숱 _s%GaIVᛘ®/Ϯݮ[DhdT 'RB1ј0 !R$+%G0D}i{~|Vԙ>uV臠"JN4Is3+# 0 \˭ -|7evLptLFi6:WyHVr"ގs(eKy D;,8: nYw'&MҤӃP`hRRMJ( Q_eI-Ym=cg GI\*=U MyxuoۨoS$o7?c2R2'ˤ3Zj(C.+ZO7t(K<\GrKpA7w 8cH"f ;f{G;y?P܉p_u;}hHи9Cp8*$08 *JkkJ ɔJUMλ7읛 N '++,#!~^s"6OA97ڳHM'EKFX ¶H(atpgpfrtJQѝ1%$B.J۹Xc8ǚ1-2tSBuAyK, -.J"C0dO^}zj+,ƪX{i );ɳ'OLkzpJTYɎY Ki94z5}ުv] nm{[b?+ "3gҸ |eXZwՑg{.QkՅ/}mxppSr,$ˮ||)9"6V+ CsR^F7oS4 0ZEP7g2"'IvM.mrrvɱlYl $@Y=pwǻ80Pj O@s0NLe5K'$sI#VΔÁ5atLfnHP+ԭT! Qdq种nuz7M;yóCFF<I~M`pMfY.AsM8OhBVG-⠿虘YKI\4ZUjR' a;G 7}VUJF {ܮ ^&w|;L5ϛ Nt!ͥQ 7筥hĶ@EUBBa#nlkj*wnz]ǒ\Qc$p4M )l6ϲ9Oj :7|CbԘVR||9Jx&p0?ͿlZ.@@R2%Fi\ACɕ4թBrضXT)&@!k/4Uk5[Ȝf1]"lh{66XQ_߮LFoH_8&i܏ʹVI0T$ (E;X̣zΉ3 H#ehwob4]?|- $kZu='GmRhs08İ;DU )bt<ʄCkl4Rn0 Ha&Dձ@V5Łbj@m100l. Q{q::;T~qVKnřxʲ<0,k4v76 ۓ| }O3nlmY|v}\B(D2i7M LU۾0߾wwjuKw B٬.^AT`$eǿ㨶44Cl}jwNߝ`>f/_O<|sUhhAktyp?l!,X[-kiՋUɽ/rx;LK̏ds D^+VV9ƽv"'\*fe~ړzoxR0DB;NX"8d+05MV>{gL.Am^ 6RU?3 GJX9~ӪIY6ڤItI A 1\s?>+J''}f9 5!3ajhˆ1@\TRݓB]Ny2RUk8Ncp{ٗ'Qrm]RO"$BٵEc.lXH !Z! 3}'|ȔI *3Qq6ZHtoT.U*W[q3ᥕh\ n|Pb.gN+fF-'ɿ_olk{P00Y9=j\w޽prp¸wũY(w[VO,{Zj[Eq1BLؽyuoxPAX F(E! *_ؽG˙LؕY6@ FL5gֹqEݏjzo}}lt)+pifJ_] 8o놮TCF{CIH4P_8 ~])%fY4 @`x S/Q50Wd"N`<&V1r}xkݾ,d4Tu#B AG0]SLȳ9LmGdN[Bnƛ/E6aeIdYe)1v;iZ3 C \%O O=ЁRZN ii⤵dٲ_}u=ĉ|s)Y;^EfziYG YHjr݉u. qJyyC 949Rp> 5[u֐/x1?cm\ڰq)2Ft:U k5ݵmb`0yz]r2Q+d(>#<[HrFItPB²Et}k@șc0|(4߽~m{//k nӟ:k7> ͫGq$XyZG<QTL/ VQR0^7Z ;4!Q YYIU"L'`*hXX;XVJW,D۟>"e$g\jq$Asԡ9+R"^1R#0wb(Q${v|0/UK}=>'xH''P OL,E>:݌՗r" N9b4GٿO_<8>8(B&DZF8@Y*wv.%vD${ug0D,Ƽh< &1$rtӳ珁AQ #l{{&CշZ3X6ELyaO[ 3kIa: )8F't6)tɯF>QbNHvWh.V"!Gd1ԟ{T/%&(r/8-dPx7$}pxl_7ޮMdz4ČCz} W> V䃒~n*yy7B.5˙Ad5WPM!lMVS1%sRVAbWrC@(0qJ_͉I J&q^Krhbl F4I$)wI9]˳/7Oz.G?STYJ;;:PƓ ԃt:4?Yxͽ Vk r1cutnWFgA?XS}!Q9K F8whtk1[txgS%Sb9cfPfvpdMS9$ ̕q>'} Q@Odj*gJ GvMAړ<=WAeQ*YgnزmshWQۚ\鹡/bcHn0 :joX$ED-s.Rܬ߅}>o~䨜,/GgaYXmYǞ=LH!!i R -%Ф2%&x*[lkz:W:=ϣWȋ'/Z?[єX˅՝U'jJ 鐋yh2EGru.#s>=oRޏCq1fҩ9e응?42AWYsvU2IIRnz ~ڼ Vl"5XT 0™tv8>?z66`L'<`1'uitgI,Q,ॗE^~ NGFKJ"LB)6@(0xH _z'4.:MÀfUgñi\&kao A͕ lyoޜeF΍VɕtI8o?L6nZg{7 Ue1u&q*s+Rc^Jy9laszL0F[=z0i8VIT  fUZSA4U,#ʈ @ v2R>rLGh'YӶ2,˖r[AV Ճ/%!4RtrؿؗV"h-rzÏ?|8yezfܽ,SbVˑib>!I [l^%(DR|`IV1{>~cX\ I{>\X ITZ^RA"R( ,-ۿ><7n5 $+4Nj@nTyW6T&,ώ&bvhܝ|96 9$ 3Ι:\!pG/lo;f%H*_{۟ ݞàKb) Ed${i`6DFܫ&b6aiZɥsT0fwΝN`$^I:@ ʻNVʹIٲB53DFfqs3tvuP W@be1# aʒel?o{&6{v&m~~Do_A~ l3Aӱ]GIPAhE#DT4;Ji\ݛIo"cgc&l F$XAhFFPÉzbpl5+dzFQw|M/&sF Bi9aId{ :l%6_* 59!-Rp< #|JPΠGH@`xpd6DDkaVݫX!X :i"YmT9*[t4BF[5~Ѭ%X,B)5R+JhG,Ċ jvZh:6H~w;v>JfθI$HJSYFO>m5[(kߵ=iNh "A? qx8NI2EKIԁ4 0O|zsfy%|A;a( cATS0ƾsfryPK?>G"* H]Fi \pvTǏP6ȗ"gHԖKKJ@ hwۇCպw58e`˙WpU~zSSPe(*-$Ԫ?t5G99f%*į&x+pr5OF~y}IbXyq0[sZ‘rtRO3TYMow|Ho"$3M0D$סw{u(foZ7""Z^~Jδ 6-C3#gD´u = SPfʍ2 Fms 8-l1C 3aNۊЊYb8,Mә[O$3Mc1obBHe4{iÊR@bwxo6AxU_dGlt'ʥ2sg,1IOR!ǁkƣY;=++|7Z4L+ۤSG@׳oeL"z}i@^/G!; GSX1K 77ax@TYYaۮk9#)koZ;C J:,BYNL9AќKC`9uh]!̭ }굅]Xm$>ȇ+_=LFoj8F m6 Fgf%634# Ix "14( k9x)6Hqvrl1~ZΦc1xeuM߮ޟOnkb;1UmE1峇"(sXۇUay'!g$xCwE4RH3* ,}H<Lo/l~n<5ē$ Kţܓ̩TY <,"'[dͪd2+f 8jX0> (ΠӿތM b!UJ{ b$v{ ZR`3m/z橵+-us3ڠѯI|@v5i>L((: {8i]9ӛwQ12,@ٛ}4J* AQ 5Q!vCy- 4}f'`ai:= T_FH 0wMb:'C Kͧ7hup\a<1=w: Ŵ-eJ?ӥˊ6g3aNM*F$`]gqs R4z )ހQ,[MxS{So976*ȋr@&PRX=1][")ĒnOb,5vW/ Y1ͭZM3] q&h6\ҋn绡q9S#\$(6 ?H C:A66h2!DDE6#2^@\F}ӟ Rkjԏ/ޙ.# rWi{}p?> P$lEX)rjڭvl. d GRa[3?860 l\;8IjRLڤi>lrIKMVukfIߒ ;:9>`茰M{4r܃mA4*j},^c&GjJ~W!Kb)tB %tKPÝKRZ%RW "vF,)Ʀ析WR*DCYPCۿp;c6kr34A&ԹjEJYC:D_|(v{Sc_D'8:V9n18Ķ|@86&3 vaH5<¨$UPj!|6AL>`;.q~fQ6ZoM:Nbex\Ut+S#qprlE7uecP@,BYMFf&l\lĤ$$l4:!Go38o/OT왍Jsoߍѿv?Am_q,ݣ'|XlKOaSp=L9AdƱx6@:8O3}hw ˜I !,8TVGk|e&}hYL"Ȏ3WcXTgc#c˹(N< !EY*>ɥ nq T{4K'gkf ujT P'Žjw;ʣySB`h ǂ{=Eaa (On$8/*,Gp4=3 s̝n "$XEQ>s Aۖ9^[ŀ~E!A4Mm윞k0Ut-՚qq]CC!)bl^k4I  {[A@z͇4Kh7?lz5cAT<8:‘V;" <,rk^\"@XLktPc3-Q=o4 I'd>0ߵwۉ}#eFo^~S2 ]l bYQ7ȜL"Vzc)6rv Æ @bv6%Quinr񼥛>v!GL]8HW̏Q<yxKr)w {9BvwxMtz Mֶ-Z+c$Q|zXFLQGl23꫗oO} !NZ~? ᘰ|,:5|aShz~23O_cݜ@d`Q/O?L&Qoӽ35׿Zpo}ÄJaWCQ#DB$˖m31 DE 4әܜc 'S6l.K*=8#HlqTIlptmaim˲_uIK Nop ePHHӤ9;X,VB,veIpgxn0]ͧn]Wǃ-eDn"FDb̙yDU/,Y932篯px^QWI Ȃ3v"oa_>5>aXAu /3:3 "nS7xQ۽֍?óNzwo9|- C+*8wiUF4I J0;.85JҸ8=4?ڼ N{SNE:ZQ' .9=>:+Tl۞j8& a QT(˞4\D 7k(uraUngQnLo;r糿0|5ߟOM0x^n͞l&zrnK+BCd!)c437̩[mߊ()t,)>{/ BbL<b z^Tu<p|S8B~d Σ(5xAK4GgpSK˱(f#r*É$iI #) w[Uk_CB&yg*Zh{ϟ[wr2\ߴ{L<<`חr $|ҌV#+*%'p ;wb.,krÙ||y. !8L;: CXfgoXc9nS5x,)"؞CD[mo,n2\"HJINoC[{:̩u?}֛VC IeٕadIsO9m+ v -,18q4d/;IvҦI3Iv66`#[>sLmw;qLQ ,q Z1Hni" k&/D _~{}p|PDĤ EƁdP:w3M;Vz(sNF@y}>eCC2hQpD`dUmz{0LR|ܐZk06*xpuݿDPSVZݥ vG7oaQnߡ9TL v_ﱸh8ܳ4k2ϮNGnmiݒcÚˊr2X|,Z5i`79pW4D>lG%X, N϶Lߟɾ}g,˗Kpz{VIJqy N^], 29zi5`ʰ{c֬יURl)9 P|A8obiA-÷E̦V',Tfb"sc]Eae< i@L_DA¦ | O;3L(yI*x lKGE"<`ˋtt[T3x}Zpwg UNQck\᪠zK;&"d3 \&/;Dצ$ |y|`p.m C%jQ[yHZ H6h iwl{ӑ4-hܑ-'&%[)n<\=~3 ?8x( Fʺ领!Y@:B@ĽAJs#V8˚b,'P6wD0bݽb<*8A"af@ e)0$Iy'\sa2HW,ɡ‰Ԉbīx6+%`(qYsQ" i|`0SC_)vU5FL6a&Y&w<'F&Ȩikҩ\ |} 鐁JnX :f+ (Z/F3 }qbl7k[Ktw?rwBvǤw^I$B.\ 05PCy` 'z8$J%8Es&ܕϷ׶|Q,QHtl^<3wn-ŠG5]%8lvh87ޏq Z SucbrYmFVP"1@pR 5/'`X26G 5e e#) Qߧ_%_ʝSNbQRin^Ϧ aO|Z_ק<Y{ e_v|  Z=K6M4Kfѐ'F` &ݐD{rQjP}u}XSШUŠ<_u-˂WUR:(nFbfDd Z.P&1޽xH gI)(WRWR(isd cnHd6@I,fvz;K@⋥}=P.RyT{?^W"SHL9kU~ Kdr@B}`ˇpү+ɀCt3ǰ$D, g1PuQ~uu.DVnS BIh7"b$u]S̘/1nfkJiQ]YGI?sRj_3~pl* 0[@jBmfHjRn2s~g$S&G;G^:AFHU. /@ Y d\TQ~AϐSMNj%AܢKLy~a\!<3 DaAnU`&,c|u{uǣޚ>`}gb1 t4=/@[>j$I`OBni(@fOb! sa~xEPPY%פtma>7;IҪ*@|@ [!ć" MR9$v8>ֻރEڏfy~v^m T_f载!I: ^}uCw6??X5N,Hپe߁P"4Y"oÑYWUf^Z#Չ&bRd弔CB!E"#9-H"ArsE| !f`Ȩ.xaz'.GK˳]J+VUU!,jn>ȱ \tg?T눏tͯZvgxvX`kM/eV4:r9xy 9 (zx<)Ӈǯ6; WE]A2Q_bڹ׽}6m(78O hd՞Ԝ,ØXEQ20,' 7q;>DE8<+d j\omM.7|M08:jSC71Q6%0@tjN|~~ª3qMgfbJLwtO߹qb4/#lFr$NaӫZZ WXYTPrX>랼xb=JbIZ<414.b8ZQC f1qmUQ[)4QOwY}[J\c< 4px|(.64/qq'ӞEaب,@Mk6 XGR3^jdf> iKb7߆SGRpእ^,˜\磙?4?8vzR]3<+q\7,pP;o%p  ѽh*5o6%UbRR JwUl( 0\w:kFЈ(-#)Ks ~pzyaiՄ/ m&GRiOwommOЏgu'ZB|as2(g{ 0 V NF)q]g6?iElƞ0[-jDJa8O*8ۚY7GGeCj*m~vx 5ĪZZE-x4qr Voԫ7׬I`UwȾOV*϶E?(:޴8 w KpKӬSv]wS?>}I;Mmm*&m% +w 8Z&*@xK9vqsZ޲;fE\*Lb zI^n;6xxMoȃ MJ̅n;#aKT4 mbٱ2{ОM&Y]+&GH/LVn2(,h]bt4>S4ylVv96ߑ:aB:(f( 34Ah-&P3m:bAѼ۾(dlv*S?I*KP|ؗ5~0O^U" ̱qW[=@ #(z,fyS$C:A."(ĀQ݋k N`-y.(-Xo aYd 'Oʭjh8Znk8Ju2ߣ=`Hw`Lcde86R}w4 װ*pBo;?XoQ89hBSx҅/0ێpt(٤},R:~9 ܸ骑gA XXd,7[ň@@JBB(e0d_N&PnC) o1UUqCH™kw޽r<`)jSٓ4Xۛ\~}v8:({1`}f%I[%RJ}TU}hGCHU#URIQ3J ``<x}:W{\õܹ1 1>}ܾmMë́_O~vR,?A.YBQǒ؜^_tE8i۝ &h4OһwgEc?Fi @S!WY'`4@t| .]۲/s>}y#E8sl.׾oxPKԓG =h'"{4 Jd@H<VP~wu/ả^xS:<<|Ϲ!ylC ^&1,Pyݹ&QYo[eqVITJTQ[k-K^t<l(A&w//wr'_Lz۽-UK''',w0 <OȉR`BPKI.8M?La#lIZbhHFX!Q8!BtĂ,lrptmqg|G8GsM#=֝ I ^HmvʺM6glj#v옧|xѧpw 0`PZ P۬-0O$&9W9 sԧskuAZQMA0⎸Unbp[6\YP$PsB^Esty6: }5S1jڋa4P=PRYLI=EC$4 /_4ȥbt.SiA>T۪u}жk;$B:|)#*SCfq*B0 -' ZG>_-yóցw?i;uH-'Nt(\[u42Q6#mAna?Coq|YY]뚝C"~yJ'?/!k~V?[}sԚ$͸B\Y_^@e 2&,#Kh 1IM9)*";\.Qkw{eVxc؞@l ٴX7+qA(T@b* lL.~6fmT*ii?rϓB"_~BHS3驃Ƈlmo Lj8 eiLehzٟy$L&᱿R˛V}xÏV7S̀AaTC$Xne>W6oo2Dmk'<П]S6.@XX8&t61C,K z]w5KqDžtiFPC{GMJQʹL.y#ɍݵÃy/p~ejv1W4jpպ *2K+r0ϟZs}N2|8yT~'-Q$QMGA1h(#I0ΜQϦ# 9ZV7vb+HTW \ij(8LTutu՘' XRjndܿ[Z.HBCPfuUXG`44M,O8DoZYTEt1//PN&BqqD`L~\Y}%O΄9m+ тd$$ر/ivN'7ʹ&YcYѻ袔4wy?,2x/cyaUnU2H8ć( K~ )%[ׂH+z ib Epw;Z)@`MrֱJe\i<rE Ap:>:ٜC8ZZjBs;:VpB+FAi||a'''$] q&-F- `wk5csckǞ%tyS-BAEF ȸg~rTI8liӕ^2׿~y^dJa?_؝=CO4\6ĕ=wn۾H:!7&GѝQ7Hc<^w5I|~q'ށzރgg7T?z~ h׭W\aCQJ8omxX]mXe9Cm0(IIQtƳBF$A.OR(Z0 ePkux)`U/l&t?^VFP}|{25o>ݧIJ1*孲RqΗ_<(?<'T v~Cr BN]n7[sp²&I4^ ϱlMi8FiS4 2;ԛh*gAVZw&aR+$C""&#_0:\Vp|1ysɛ$#<.Kqq4xHAֳ$SXčz=Y.m8ʠ`"$V˲PF4 3(piG׃roKp׼EN$V} ɻ[TJŇ<r4Pr.bk(y%T9ne(W~B)ϰ$v;oz3hdI-ilBՅ/ACڐJ Ф';$]I(Xs`!pvP6St@VpXJ8&:SCi1m,WeP` \eͣy6cXeȯub޴XY g*j"@.֙7wmeiv(2@?fXQ%؜"I pTN;nlٻ{wf̽ 9.RȰΟ 9XK^vˮ {4Ϝ^Tts? M(!:CQ,q$A9z{w[*HHqdjx͸9tAϱ =ҍRUȢ2_MK\ڮQQxٱ^sa{FĨ=Yaǁ5̒JSibX#mG rv'K P8Wu.PV"Ei,!18%%A%IX&e1aƠw/#JN hr***>p؞npP@г4rbv nAWFInh+*gۛ(7,k޿ 8Oj- wKPI5aU}R3vF1An%=sbm_8s$ :{x,}Q|{{!Ӫs+ǿ [;4μp9IF.vJ{EI]oN:FJY:&j${,j~/%\[ED{Z햒R(4(^W|՟|chD ڏha.ܬyEoh+JI٬BiMw Q_ E'))IlZTJ-AE% )\RZ4A&vOnΠs|}Sv)9Db֟ !xb.pP Y9ohOgu PMfEC0T]&FČPČ9|xeB`l7 qPA|i @DT?Pl(i VkKTL뇫(>*MK"T 9rL>Nd"Q^<}jڿM2di?;6n~j\IML茚ݩNqxt4?reӓq:Tc\DIlxս58S}MGi$e3ɱ92Co3h8Bi4 co(n7@ 6w&R6p<-.04?? \-=UQVhAcTDp񕳲L0sVO ' n .uQ3yXY-~(8뽼;vI^ gJx(EB* Ujĉc;ǮwGrl.p<7@( 'Nq e ͻ6W˅¢HkXlZ= 0x5Ey-]G9Y"-ύ .hn{xiaBpg$(Ak<ظ_Cyz?s%qa7os85_xRݪuِW$uiw&OIj8bzz}i#Pӑ ̀O]'"$FPzut4:OrDd`Z}s}:_0\ZJv`1DXAQ)6(m;m/o*#T-f9d/l->< |kb/ONH wkYFDl2S+DL k fi$4WXojvnS2p꜊/}r>z˷G<&p$w`$"a%2L'13\ du{+Bذ Wd*rblsy^Κڗs07Y  Auzr.H/B뱋?WLx83TaQ£׊We-xz:4c!$_GG'XD3#T/YIք0WD]<,G?~˲tu<ɤxuufFJ5S1eaP 0єzgqt:WFY1K #H/{yǺٌh[vLУY}T h@`1P8=h4aX m֨܍t0MiۓTͽҪr"R̥ (>.8},kB$TV3P0 @f9 DRSJ܈e8w|au<՝!؇~$KfhGFD)(\+3aQ r9Hf3 ,ұ+U k-R*tYx2\2@S A%m b+VFGV|rmQOdE.L$4=|v]IoF"IQԾ{k KͮHMIVlQdK"Y"wTg{ 6T=UO;җ!(zlyO$JI ۷0|p'Guch\3@mh T- \uKcY!o&@HBTI畻:,ѥ,/-#X;õ'WPYe9l}6-47r&DRRͨyy{%齝}on{o6F3}ҳB4ݯ#zPz&}9dy~DG\-ɣƺ4٬oθC s!q4'07NTD~lڴB%Çf&,)$<[PԪGGzŲtUI?^꼮qZv.n/b<WIQׯtrrz׀J Ȭ"FrI e%JӒH˥$웳#V`Y~"rQDn;r/1ᡮPk̼9/uo8*7[^ױʹl16[tYUe^4NEpԱc$:\UN)qfZ>gt{e [;@{( #@.zj>3rZ<!Pi[ =}vDx+ @R{lf;vs<&2KtR}kCY%!Rv`%Ȉ3u;'=W`()*W1Ӹ"dE 6LKxa4|zb9!-Ǜh~j}G3uf )k@ѰyӬVah;>M i\h uWLΠD`ϗs.V=Y|b0e`E3J $JI-ykd̃q(An%`ѳ-UKZAElfϢMD4P}@]D™pG}"xLZl\n;2_ (2v0[WjϗFn MN/IJ;kG7 }"/j7w!091xOHʱh.ݥ!B4uE$@6puƓf+ < k$p2<ŐJ&]xlw;`7$T]tjՍclH{,޾M6Mg(!\(T6b1NhsZާ?_$^_9m+ -@ MBdMlLdڦN ;bHϺ3IՕ֍R Q}.ƽ2=ãxVؤ`F~c "̷t ]PQ9)S/_o^$qYm>6FRLB2_2}T^6luhӶHBCd.) s%ux o~cfyy3D !DwDPܼ\뎠dQ3<Ή0 4h/_+&sPwj6T^ 5#7 d&YДICةN>Jզev]յ5"c,:Qb1҅6k5s~7DPд@DX04+EƃqA2,A3焋n8xvtO.OSl6[E nϢg]h1_tǎANiG僽B>7[}Pp~8:6WezњdD~K+*qM0 HsY-l$&X\WOijE 1P&JEBa;cz+ALTxNLosߪ~{cR|Π ̜"#,ōo\Ĵ(Q^V.+Ǘ;{"q? %}6m$BhKF2ۊj%8% :kVEj)4L x(̃%j~]\l$"IHI&9@ڔ>082qJ>;E|pؼw NX "zUbly]܉5BT`0Kd'ELO@H8S(?]xOGb]!Ss-5LX 1aN>{+ ڟKg^p}1!*&-Fp8s"u+_= ]ӭr:4-0`@$CK`vD&$&u\Y^gS9P=ܧ2~SzVӓoBыHPtMa-:[")Є N)oڙ eH$$!o[,d֭J;nz\~WrLo?uӃ_cuSl`0/i$6{^xn}\ŔSW|̆@dO=C}0 N5WPcAҲ֠}?K zn#7ҧG HQE[Y&cWp_׎ۿݘ5-tgv /~}S @Iʙb ύikК$Mt& dRN'$̇d^:\O`D"8KL$͇a 1Yx'|Ȑdkl ݷnKr8+'سB7ֺK"F[û=|!I&F1&#:>Ȧ6˚saQ`bۺ V]b& A$rqg?ޫ7J̸3 Raݜ_[PР`$P9.W-!ik˰ԩꮜ4 ,s~aM̉a>)vL"NYk;_(}ę;MS=*,ۮ֤^ ?~63s=Ff?J" BWs\>%|ԕc>"UIcH(a&em" BbOz=U.9Ւ4 P4ly^NHl KIO(Q w*/4 u+*)Bvs<;JLb&Gwf)%#| )qC|CB^9fAR 0\YNyK8(m)O3Lk_tqnfLP˖H,뛯TU psS7s绯ێQ^i@%M};-k"WI5:m|$?`i<4WLőB|o',xwAZ;i#I:?6䵳<#}ļʰ-GRs9X{ @љ=7mEqX}z810-eJЗiot !P H8l /ZlY,Y/ѽ k߂N5.8я<]zw6H 3'f슰Y_ק҂&VO~QdmCUeDK,gx'kBú("פfC+7R9F*4tw1-HDgyD;%NƼ\%W8^OA%ݹd}`p$\^ q9-I7y/Xgt@*>t>\eN9BkhA0(!z;sQI'Mi"x}kl-庤}|!HRaĢaZ&Liqj,[?Mڛx&XEMxyVc#[W4AeNFk៟?r,6`yV2U_e+$Yo9l`&$uCH2^[wFE+ $/鲽 z(~0JBٟ ĥ[%"ˀ0p(A(Kd4vG 3t.!TJ߽`qowsұzn%i΄JPQؘoΝx̫ +A[/rUEx(lPmWGq\6]AĄmX(^uߟiYʗBnN G_ aB"srʕJ%#Ø6 C-n;/[5VƖH',db4Y:+ R4Oh.׵vC9''3St! XFVd{ZNHPF.C$Nwx"(Q 7-h{f4MqX ޵ML=_A֨/ypR;xRNb}&$R<*jz}} p'r=5_b1-?{ ƺq aX,]7!Ӳ%4a 3 lvaف1|ȓ|vҨ7:ZALj&l`Ph ;r#ER($1岮@)lBv?v14W>I283 `煽 Y nB]eanEyDHRZRJrF=qׁǮk(m'o34Y^N`GnZy ™Hi|y/!?٣\w<$f}H4=ZHQyٽz9z/'- ,@oċ/Z25&8LZLݹrJ4!U* lHL2G$YQyXnR[= )`wn&!Bۂa-L28Q*hXJF~=p٭5߷i3k#cjc.zT?lTOb/Ptm[a.˖dɖd:i4e01.t ]c4 M6۲-˖-Yq.y\ N OsÙ`gg,͂=qw`a}DZ|^To)g}2$$n]&Q Cd# 1@RљslQW `&\Qhh+D78pv"ylno) WvX;g(ꏟM chk-iG>5%֨d^Nd:at6"_MT{t|~~u9^BI1 JhsV%pfw7a5W<foWWJYi[ Vу5XR 75($1 hde-]WθmR8 i{u S)2 a:As/?_*q$J5 p ,Ė,f 6%>t[7^,M1  t3ʇku^OV![:: B:6B~ic-MVY5+ sG\(d!y6q),N\0xվ!XQe/`K /?1 i8c:\6PU%^wCŧPӀbEꞝ;kzQ7|CUaG3j[jRT%<]Xv>]i0 cY_C/a@qy G/}5i<pdm!ҞY(F!pciu0Rf NѻݥlP"OI; evIĀ2wGn˚M0ӢR7QSFd82|]Uts}$D љBHiHnɬ3Y_z]hłY)[5 EIP2 :g&/}һJ,.1vy)cѽDAI&!nQU w586!usi 1B2YV-`XL4P!^T;f+ IZwBX~>r{V8d<ާw)@^ʜ坯W/tw 7+R*=_[_8޽~fMo 3_J"Ydah?:M$6m5T L+*Բh.Ċolj7j K%X% U)GKb=~hIDxL\As+ BJJE|[l0zሮ7/zOi{{40>)RAuogoB)!$~r$΅ CGDW3n=,+լz6uJb 3O(_qUӴIT(,2"MEC/2.Lw}}$X!$Hh(EqaMl*i,&Q7[M-i84 y,:G]+_?y<[Ϟ?#I:wxz'U<YQO,Z!t:ӧO'ӑ;C%g1'Si 1n5=F[t2s73SӲt}3;%ίg/&P+/TcV40S. 6TUT˱]@,m;Fl.!Y#$Ofu㹲,ruXxxAœn$Aߩɰm@zjYQ{ẻq)IN#]+CٸVw۩2 ARXNk41}͚d81NH8cKR(*%12Ibr7W er|"3`WO'S+FBNr*Ӏ39v-:u`Q\V՚sI245qPS5WP^}/=nf5#(vF <&p,KA$IVZzP&Op4MSI y֚0#@Q 0uc8Sw2=8kZ7lޘM.i^'H5E^Ȇcs $rdnD`(gRRPdѨ(8B,kBmRn"\Epq3G_mhddv~zqyvqRB6UT #aF[Gb@gpDwz8:xFiꃿ^&$1tx(,٢)hX^"GL" EJ #'B)[+O'ʴ`O' VKUMp$Y̢ͯuELkl1:H+`UI$z&}^}ofvAɮ H (VwǧDN4(?@)$C4A`??PL0tz OWj6'B뭭ݣw uEc(nɳ' Ug[vK G3ϗXu׍Y8y٨,igW燍ڝupNwr )&H_Z >#t2b*)$ B`$CjZ$r,N&$6dY9!Fh}ÚjdQ`fח-qV55Uf,ތB}meSR(!; YN-r٢ cxZ7A%U4rK%P_X).g|셡36rh|{nꆒdh5fOqtjZuWQ%mlv/30@ {, _}/NG'hȧsbz˭(+&Q[?bq\H.X8-˵/i=pR+@|y'Q!;.%4t4}sB zf=j&#PjagrD >m\ 0V(F[{^sxWqH,`I$9H7(yӲfmr{ZKd<=6]4B`SGf(?]rG/_YL^x8MGO Bl`uǀ:c$FlƲNKQt@/O xbԼo>x9{TFbGqP\1,:t   ں N᳙l\(8S*'\&yLJHh`cLJGޙ/%x^㦎 4R8B!,A|a1B܋ڹl1.%utNbyK O~{LqR(eK>PL$+%)i6'#IO!y!!8mNR_T|8}KuRVf@zO rUߜƚ ެ'`.Fy3s~{;#C7BPPd( pcW2,s2(=dZʄr!]X9̿)U9Vչ8lK"B<ѓ沛 ⟈gݺx>0DSE2=&04t"/fKlFє}AFn3GPtwp_$GJxtn=9~K#:J- ׄhGlzuag<Ûo67Z2ƃD~WsE! av-_(g]6Q?^0k0(6G[6P[C<)<]5GO䯓aS(!JrIq9@ZBP9z#Iܰ ;u, #߿x7wI2,'\:DbX._"(K IP}?'GgqIH:@,npR;4}ɤ}jGO4M4v' F RaW~?ٟvmR߇"a"q__bDVrfH̍vKVKf-#dR+n3!l]DBt:w7h1$Cb$;w튍%#4y"a@A3ҫIN+ f_Pa^䯄@7ِGSmv~١6`M%BHQL.ʊ&T^{Pt{T8Zl.iLTI-NeMWvd6l ; QGxoea{!+/c:1yYf&Bɫ`$`lwE x^-ƘϝnHӁ=yYWX!ǟ~Ry[%iv%ju:pIfV3X g[49Ԇ8 h dTYqm ;.'hZQeQd#(&l}[fBLx:pa#EBq{<Vs߇Rs\t5Q쟼]f6V8^8&); 1箮.ee>es9;(VÚYg${ șa!a;R`BGҔxAke*!cBp0<6s7-+qk^ ˆ]=0vO t1e<>A-%c 0(퍝ͭ  J]'IA, }J=Yq >[~-*.] CQ.Z,4W_/_ ½jt@$1~X$1ꉵۚ^0Sf -aNslcyQb >14=B1 a7I⒫|ffѭ;0Wx925&F.ݔk@kS]}좰Z25Ci`oFnxy S֛t!$SXPNM` `:, Wms>+(  b\\WV1&ޓ,R|{K8W$Ȼ7ee6Tg*PM?-^_u+L&,BD/K2p9%8:0$8N  PFjݬדMm7;Mj7[WcB7N|}?`Kk>CU[IDV'C",Fg2˳8)ܚ/:PZ I!"v|1j#(궍8}1kN>CC-slNAfV_5 +Ȫޚ^G>a. e,eC_sp2JyNeh^\YٓaϠqF LI`3JiFt^k3xPY&(ҋD4DT>#-?E&h3=]+ώeyE*!{kk=~}~ȓ$~:=mNidzJ%Ie6 .$ҖeE_vs&esrf#&ן|'^4+,d+k[w.zNn*zͿټbh^ K. &WVH@Bm}'w{ nn7`k*.,Jم$K!>Lb'Ыz\XS/Tr(D4R'VM%/pxG!4f# `bvzqaG|Ȱ|ujmv/Y.k1@@R ;9|?y1E1+I\YT>ݍ"ck\}}XπclB1xe{WnOmm,/QExE_nV6Y\wzD'l8Ieq럳`Q#TĆc`IiF#4:?29ojbJ \pz0T6!P _yeM@ِM@(<&/f++|:,L5>&ٜ,I NPGrjům1k^DN|[2DCi !18ab:=70֧38S߿gCIDX 9=!HB*?ߩ`gc$D108Ea!0?,!ZGN'EРyy8QtXWOr&-c=wzcx4NW6k,m8~pPVo|tZj _t˺y^7 0!GM_raۭJ5\4`T5RIhPh6˳} hA._άM+  $ˊNIE6iNLӌc8cmֆ$b[ .=9j;-ET"#GTոW54v;]$ #$)+(y9gN'QVV0 ja߹yGU< tpqȉmG&oXj/^@T{n_oKd~M&0{z!*qypz-k.5v'vf93V\IQUt),@eR!d푓G_?=cW1[9c`yi߿{$_Z+uY,pfiK7X9{)kwgk7d[lۋ˩nO|i:}5].n+0|U~XeU;|^NL%SMP`yN5|ٮg?q[<}nd)"n-x. }x Inw7vmWyHLF󜨖 E7HeLMeSȊXͅ_Ym)TJ<ϣ())@Օb;k.RDي~LŹuuu1u2" ˤt5n W0ے뷷ˏv(7ms48}q a` uMy+lnnwY+u5ˮApKFcQkփ{UcoYϯl?nlFy}~Zgoo t޺w&ݷ(9`˴ͳYu3^ S ]תCk@) ŭU~YHTC`"qFd:uJRQ9Ϊ0쿿|WG/{wco-8iJN$76c1̑0-qWA?y@$ [ ?[ۗR >}p!g5[>J'c7 ;mA T~928_fO00];i\6 Z^z}<^5p]K x?^oҔm.zCO>v45:`Xx٫Φ!&Z6(K{o?}s;M]!tx9ك 4 0#4$Hss>,**~]/ʼ`X!-?Z>vXm!Q^q,0~yzQy%JI ?ͻ=M)Fr\8b!`D.#7GUJ/zcڐq8<9ϓ,.#w k`4-x\Rlmm==*JjO (Ҧo_ک̆q_ZU8x^%\dKhFGC ZKGf8g0 )Z `bZ'f(605ϳ{^"\ i'yaPl.DIӬy4/ן/=aAGd9|}6qiO2J2VJimEanRIX$ݷDTNbadhz[v? >jYH4ECD6SJ$0g- k}QݫkvBu[&Smn?t?O99Wɲ|B]^>݁>(j8=x F&XNRDvj &`U^0  _.fK̞ۦ0.km-yM'$mBP3'- дMSDZ8my7~Ռ4~ҽT,8E,YV&&oD"JJBMߎieY,@Pd2qC۝NNH䅨_W6Мi]lT<2[TGJC>̢l8?r$e`o]׀[pp:5oA 8m!IrL(7v+4Ac0@8rny&-:jވ_!d)}g4(rs y$v80\mJIU7d$CƎfu XxO`|@F·}&aS`( !TKN$J%fviLuP(޿w߃]۷"F"׍a`I@/8>γ$'hDQJR\Tt[6U]l ZU2[nbjZzkU՝;mVu!_C^,)4؅,Ņ"ūdې'z õFF+*]>3P` Lr^s| 34ArL"T0;Q_~>)6ـb7pp N瓉8L+&Hml7]=KO"H gh?ݸX,@ㅸ3z*pARaƇ;}i<|F/ Yw,f>#|mXFYeNRuQMWVՉpCGjm1]3$Abʤ+^zNb>ꚩڰo12\+D٪ZdU,|#%p0n.i׆>+SΖ@ B֫@=Q@$9FJQT*x} Tf`_礪Vi,P x#nbvD*ngո76Cs|O4)@?d. l&kzVj)ˁ(Zʪf\l" C6`ʹ-X8Gr|.O?q^85s!<8{ٹJ&>"WM{#^WҘЛA0"X C\,Ga%+{rReg}Wqg%mzJ(ãSfcdn5,l>k6@@9˒>gL"PdT+yR,s-PklsV%Bo bcDZ[iݤt&M&]o.:if:颋f8 66`=oVս;wfEmTugȴa;OK a4c;}<9 2U,0~orHxd l/|jQ;h>B|Z/'=Ċ%\W2QaqS|d|z+jʌš(g jHl|sg*VI돒lz4F\$;,H,˻uA~TPj ַ|Ah9$Mm:SI0T-E՚'ɖRkTܻ]qW9n_)U[?< c 1MDØ[Pr <Hxnwa&ML[VB{mWJmj= r[~bV:Da4$bE\:Mǝ#GhSid{)WqDK铧)2ig/O_ .ď`ɸg{}+r|NI4P.UH%te~~Y`\G!ۀHfogp; CL4 vWGS8 EH)Ux3 O!Ԭl:hߞ/Gg۶a;ER}e-E G $EEj$q,+V,[<f}^p~"?J< XpXlA(tX(P)U2T[oV4CS4y31{ ! {!Ѫc'O/d:')rܚyo.!xx9QTQ x?T0'- ZHD)c(BEnB$ƞR-X,qpZ,gJB=<F,EC\oS|~@UAvC3,wCt.JjR6cW0d I2w{yU,@sest n(DOȧe; mϰZi6'q%O3,pUU#iG0CMlLAo{An0A{ڿ F,ց=;kװ BRt4ڬTU#"n Ja, 0YǰtL*Ac[E @tL AͭF2؃EKg2onB>ñbJW|}>Wmuon8:SE>xIqot5QL{RUY%aBԳg< ȷ޻W)|]W`-;nv.8^C#ıɉYӴ5ːyOG_QbHEnARfƘWn_ݪݫ '?e-Ul[)퍮a&/?t \ȗͭa)]#++m\Gd14J qu[aѾ<hѳs\ŠYrբa ܳ{d:|^Ķȉ׳N|9SdpĔ9^k E]q(U˹;2 ~cg1 xp{=N~}Ó2 /j#繾rG,JMqS}A^VʂPDstijՇTgX<PO'7oԱ[9:"P_X,g/HD0BEjFap؉˲jWr0f[~ԋ}r5Rd<"x`0Z-U}$%j2y3c͔ͣFgd@4gʲ(:1iSUp7 U%AL޵w4<.Su%b4Я$ԏ`AX40 vie$tmq+I6i:66LLHLciCccЃڮiı'o+}_#r0anY923mat"jf4Iȥ\ SZ}!j g&!sLfS%H[^)Oz8+Cn+JN>p)N0<]cZ2/XZ-u>6fA4@(li0A X+aΛr4]YJdL]3 Ob%pOF88Hg}6:iv֯n|ũz\(˙e>S|m+K;`DP6~wT?;;98]߰c3,$5a.& Ugl)k:SqX$eF i.fl(,8'Dէ,#JGݞZ"p.wM |q\{9#1'4^Gdq q{;=$s=(ԙhSH&ڇC5:-'e*T(:AUCx,$n(4 pL@8IXPޟ~<*2TEph]4ڇOOus֗bϗ^Ã5bި}%:޼!.N;t45 &hȟj ~TaJ[[oa(n:kGTfߡPzAޓ8I>WWب1p"_Xʯ?H$_vhJl&;U5I@Yj ?p(VGqd†BADN$K{l38 sP*mvnugo p l&GY@wG'Y`Q8𛻆{- zGQgGgG"ˁ`zQ, dI Xtc'@DWH!&جm9 -O:v}2*ZO'H"f&vqJ!kټU?UWV(a)7tkIuAgqdYjcc|.k4q!g0ot ,NĜ]lsP/Ee M6n^:)XH1|j&^׋N[a{VCjZ:Sm(NX.ό(2zԙQ̈Qf.+`0'wG~ʵ|/drnw|?}3 >iõF;;y N Ճ/ΩU_V$A ߰m'>POݚB8rV dvv qxK&M& 63t&88;1ص@qWwh7eԝNq gږڶ{{Zl!Z 83&rl}y,"P(34EPjZKS]|7ni-fz`!bN3jT:?U7P1E1-P0MECPoObZl0IQ7p@U~x xGn,k+9uEmYy|tXAP\6q '}?vJƽqs|4Z1ͤ Ca(M_>6mLP Twz3Cl.bСwP]. =1:d9sgEq$j"` x@%ph?(:洭(K]Bb, `8qҤNv w:#6ˤigsؘ}@B[_w9;JRt_|T?b@WWـl8m.Ifwo hk{IAx,V dpR!5WZCDS0:?=)$wu.c$YKQA66k 8( >h:Od0 2VvOi8:. IX#b׫5P>#|,M6M|?Eǣ14{w0s8Ie_7^ΗCׇxѽ8-L[rU%eǂDq;τZjh$IT ޝ퍇gv~Qa"91!ut] ;pxqpg$E&T; 9۲UY1T# *m=1]7LtC7-AIړβj6"d<IMU5LE<h8pn{v¢Rn=*|ۭB\1W()HN]h`8m^S)8r֟,44X_Xv48OƳ㧤zu޻49Ր™tN|W'Ų?H3KK\IVRώy4.)NGx8dުnGggy+8M`8򇼫 ~p/Emv.eG!u{ P!;QAJe)aS?>@y?Sf43[kӕZ* @q` rxtŐB.cM[&B]n:JCŅhwLP6SduwJ AW_nMlݼGJWl(L0|ܕ cxj~r)ld٢6lgQjK*!98aN%6 "O[V()rgO޿ h0)vG8& ʐr$(j=x!^$F14tr>YJ̞Ӷ8,$ !!!Ov4d:}L>}jddq,Bw/|3 зcP|ZT]/=x˻y\7$Cn6Ng8'Apx*"LFH'HsmM(ScgEI)u9> [/}{j#/K 2ly% Bol5 ][YzfoPRM3]ħUhϽA[ uZdJs$|>鄈kWɤ7dҟ?8(c&˰wpBƿ>{~]clNfe!4O}`VWGoѨolpxSLE!p ]K=^[ WՇ0Սl,.uilwe9ÓeU5DTLBQ I c ]ؼ#u>)&dvA&^]\nPICЧ  C5?JP:߮ /~+0m1>tmAVa ^qXPSfזּV]Y+g$[Ua?EOWqBC"@pF"+R, g$99ʖ2"?ܭmj ;tbi{!x*_)չ1 &enq8=yϢ'a^sxaP߼A37/L2x܉spMb)/x y2W䖷mCf6攑 -e:P4\㩮O? ZY;>;/2 L5|khuZl6_/ϻd[ڶ bC` Nc$םAzЛ#FB+I:7rڹ-ǽLV@eN/WSH,*a@p-:[khPiZi\Ns1_֖ Z'NfgΉ % xh?"1f2[ Kᮣw'C"2𪾲*X6l(uvE陨kpP˗1 0IG}FbeIOA@6(ǧ]1;1Gxq##libZ ,_ZzFI(Z4OQH (E-T2;;7?J|{,,[4O5isFTJx3q&^4vR.Kم;ۅr!v*ڱJsa ŝ13߷ar$F6Ě XDD`l jl(Pti[Atl96iiCۙߚLLf4q;` qI t>~֌}U1uO!$Yy:<0˚^ን}ð㭕bM)ĉUG~sqtU%!qVVlmnSp<bNafI,r XTΒ8 pVZ]Arޫ{j6jJ:Am+X(HiP5k'u. AHLGDw!vz| նilm2!7jdy,+ʣ/Jې]^_iӎv?Cy7:!˿Ԙ:V 9{I4:h6dL&^< (vmԘ@\MXvV;;>oVԝD9-P)sN ϑ }7'M!'!1rk].9 po+Ţze0(.֟v$K*щN9Qs]SFe%o6 yh'ؒ8 O\)C1poG ` `9#{<-E`tTd4@{ݓ2${nZ}nK/ "_M\8`/@5{jU5kmޯBƩqwcXgâ)J^S*ZT]͖}h<=3³C[%͟{@J9k ); c$V>Qh:RˈRPf0-DN:QB5 8 C42 2@QRo^dAZ/mlU6/yCnihGqNN L؊5FlN;6\5s/(= ,1[V64iyݸ/~m $ZܢDMʚm9-PG}Hد[vzvwrۿ*bWWGqenX;wZ=U->n7kF:,p(mQ4 ʐp7-TĆ]M89/шppad *RɣsbV<]T6tqx DmӸ>F%ST:so&@NƏP)SgB @ !͛=yyczG>( +Arz[$&! q|[̐w1:}uw_ʩd4jjWGͪGڨ4Essχ9dGhS &Mqڝi)Q7L ܮ,ʦn(Cuǒ2}.\%9h2CcRZ` F|"X˶>~xZ;qP}}F[pʌ(k:x踐DmB&)O˳L1&]TKT2kʂfϷo+Pb\4fc/Kk%9-ۀCGT0)KGMQW14sz~~^6:ARBbcCr2? rOҽj (#ΝZ,˜]λfVʲ[l4[wwwv@Mf.b@s@lCEGCݸATUcQ!F1i/NZKaV#XcsY$D:YX%8Q_< Wf F~$)Gc?bzGW?<C %.ScE-ʷj ǣRcgD"Q,o3|1Wi~S%S)˯_][2. Z1Ɋɛwpk>C:}S7ƫ+j#w1_H 1v '>d˶[Gvɬ48biD N Л<QI\&;=@r!Sẅ́r 'H[O䓣l6&ظ3 &ͪ  xMfvr;GNjTbZZ@RϓHǒ~^vEa1(ɄhND0ޠ72 A] Y땽ZڕH6#X̆7W8$bנw3n]9ryUf1lXqY`6D`9yB>H4.Z=\y;p)3gzK_;{3 (N03Lt>-I"O= ׵7I5ȔO[7㙙I=9`qiOF8J$ZZjꎵމ~fsJJ|{jz)łmE8I/M[JU5Jp^0,Ua4>:>j]_O&d>ẮOd&hcƶzlfe{փToᨬEIhfl) Pw-D G4!˭+s9%w*"%ǣ(Ip2 7,EJ{!z3.ȥә'ǗsI?(plze5;5A?\.=biV7ؘu'$MVUT&UTE٪vt:aY 00ލ{+K#^c1p-oN%h?hTq@2@wbj1H$ĈxcXc,&y|&(IqMsIkΤQQEIEH dF)ܴH (1rReYt:{RR.-HٞWhԡ ~XxzVH{ BDZ1$ڃnp *be뢼Qu D&Hs=TMW Y?mńq~-ar"d9h?Hv-b,꼘n'fVXʼna"v'I)h{&P7MJj T D"-Y;߿{db.f|ׂ`KžvNkI'TCJmU9kvZW둛U0R7(:&i"#y^:׃?Os\>4di"fQ`[et:#uofX)J7~%S#bryN1_Qo'[F_@ٖ('BQpi4vlMǏ.ItVWx/ggg'a("rQJ%K@*ًo>|vdN'2yo0.y^ BkwSUB_2*l^rs3} gcI [;vG@);Zw~BolmsvIj;dM3ROkE!2 V 򅼑y"&rr|f9V)r^1Q g8VG~ґKZ$' 'jwpIh5hY4329MOmY!yސ&}0^5Ӆi("*W'EOR`y8!c^k+[ޫ8]֚\G?|K'Zyw3" SJmpXlY?ö8TV֫s7O/.$.sR܆GmqX7:@2ܝS_wOM3i216˱1 .]hwW{] El2MgX4ڡzouϊ'<"QC.I齗lx:pb>XV` EYpb,jL>' cu 8KdwsX􍅧ˍk"a?}}4|wɳJ5}+=bHT&n#q R]m4SZ]j#aGfɜ,6| ueFo5L@Maj!6B'vlUbeq?a:k- ӗWVLk; Me5Ԁ@Per,Eb8Q?gFlˤtBlca㸎h2"Lb8,LC\Ѡ?|>A07w7^.F?^9Q*/͏㗍W fPsޤf\þimM}K3Rݟn]0In'\G+S3QFc 0ՕDJ !/衳ODEqqv'x"͋)rb5G~~ثԳ\)rq1'ԹvӾ>ܭe@xsgsw$b}gQji$Bqz½n[<P/Z/ s_]L{|^a83sgcEWu0-͛H.(~_ 4}L!i2FF q _u`?E eInsc*yf&AFl-ŜZJ8GpaR"'U05`M4][z-YM(2Dd#gW_n]8B0i% :n99}\\4+$I0 QLݘ>OycЌ-\kYJa5p8\)j]n w֜ @H  F'WM=G{rq?3+,KDmzw (Fs[q>XE"}|׷AM&S 80;: ,܏_Drq& ͛ yYGυ!\NB\"Qqt*dx*Cga=OմzlZX8\oI"m6Z'h.1cw_۶Pj_ONasF޻۫hn%.J6.rf.qD"j\eX鿝z!hEXYn1nn0 ,@!ʩ9,=M^g/[ډlStrD$1w3j''ᑼ]M.3#Qp/on睳 &I_a"s  )D3b0@m!tA@0km6!EM|5lsLMB(J\JHAIFpWie鴇.3,S) )ǀd0%`,?V.6w74btt#&6nIۦYYkFL^e^8ҷA$Az<$WeXˇ7ZTW_.Xbi3[/A|Hs6*A'I/;UVBPzj WyؠDX%tuqF^?oT*d:kW@- d*w^2UI'N mM?Fɥ۝B"L_j c e12m J!KӸ8όBJĴlg|ӕ(Yf2J@r0&q0LIA~j}3L̉oa|"@˅tc/I/z0FČŋ; I0!#r1Pkp[]GA"R{|u7oKe^w8O& [10FF/h:K"~5CPdOd|N.z;?)l) ]ek&7J eX \N :y\I|.,oꖘ@3' Uk꣊Zɪ wj+;^g7'e@d\xN|E[,|aER_koi؆aHX(%YҴoގ;a޺FvEWܱ0uhȹXa']+s2D<#EG )wZW_脩vނĭvZx{k/ga!Ztp3MLԓ~hnO3NgrBZj>_'n6P=IEe+Z>)zK@´BJP 2~~za"U!I;7g.=aB+L:(̛~`h$طI, >{3OiF4׍TQ%WzVMU`wo|{oٗy/ CQ芮kU`s$^E'ίχ]J:lIZ e~/d?3OG)yNNT]ؤwkx~< qjuB "<σ|&T@Q(.;GGG>t"=?U4vL.5Ke>} P}9.˹<iB 7 عkHH14+2<,r$H@@5NzIaG x$}2 ^=sj23"Gnc7}SXu2E PJ\zq\^Co>lMWPNB9`bϝmj.JB[lZmtw,E2hrђdƱP~ЄohZU!XkӓOQ3j&A- EQP`K#ˬwC5~9X Y6jJG_o?ÅM&xV`sJ x !A҅HR8rkaubx OL9 a =8zyϏ=e8j9E_2FmJ1) W%Nn5THSY@f^:O(Y"loUbb% {A,Rez *F;)D) ZffŬX2GOw8rp0Su_ݯ5[Tk3y0cVm/p|wsdKE,Cbin=51EQ֊s=ja,!*RWI`3H"Cb\YD]ܾ<\l2 6$S%~h,F `q^}N9j6c" s9zpb E)ڜ-Hb-YV1gN;KJoinu:kݴTgI i@OTN˾P)U;Wl#NϢY5WYT^lqa`\0 ڀ45S3ݷ=tߋcϫ&Hqڥ(^$Qaba !2_m Ce"$h9ttMח2ԃa8LyzFSlwNƏwa)~1PPu~%Ћk*d  @b *m=+$O'6WC(Oeu$'پ%>/U(nZj2E'2CXՌ+?~T5Z0@i'v R>MPA:e!ycJ#qT)lUGnϝj+|06sv{(rR5cXE qYOHP$֨jr`x>l4p#etpvwYu{@`ōBY#]z) E+!1rww ij>WC%P|4$pAۂ;=T?-V,픋^z/0xdzW.{q"S i(*~i:ͳ'qnTQ$@ Z֎ke:0Mf 6lTgW`,C v"?п ̀$M0<}qBfToz,Ѝ~A^lކ[qٞ{3*B Gm!Lǵf2F(jApDWo7N8Z^15$#xtX<>^)ڮrLLQv8qj1eT^40|xbd?"0ųr1&14Ad*Aܩm\[=%y3Z+$/9CT-7uRl2ߍ,ċ|fz ~a GA7z,Y;q (: eE BL6?|>x)yQ{#BAߘiCZ)%p]!12ϰ `gٔ|pg kJjb*fjx"}y|}̵4A}>cv ;@]z(,VE;,DUS7o_q[HߚQjwh𬀊S0+Jpt?wc0%n˩\ ҴmP>yv{WJW{}2՝'Aol@Uxy:HJ-3\.|=_erEM v4z27Te*#p"J&HN[W+hio,R4}J#cۉD I(֍M$ݦ؀:917&i_XZ+c$hQ+ḺAAY@'#/ȃT:q ąxLPK%( )7>mgۚYl\%F/Ҍ:,2AH~;03D2[FTݮm giv[W=M\M}oC}%IxV?\',E^_4:?6/~K?73EFe*p4Mf0?[̬`IPȞ`w87lJV?o_Qyɹh/*t|2:32S!x  Yn1V(+ǭ3 A vNkZV,8j[K*T11A.+V V}}s^.i 0U<#(39#IPbȝmCsDOEh"/iX0{jF,Ƞv/QE%>D,M3 tG&Gb8[C~}oM<_(:Qjn%E4zԭD8!Amvnݭn|Ԩkeghr QP/E՞a 7{ x]M}^4i$um !$ٿ=RI)x /Kz׷m"q +N:*16cx4%1 OF(CN`*f ᱙P2ꎵBQA^\MFYe6"Z6pf$9ĮO3d,@7VQR0y\w)\Qf]4_NEOxUiy2~ͮ̎*lvټ泎U!vjbl^{^)Tm"|/X^|<,,γu9+3ZR2v >+  :bZ?6GOR4_L'L+J6&ĘڦCb,0A%NT rRj669sd2a*$^a}o"H^w~/dVzejsAVg22e~4%.RJ\JT*Cї,tWYڶkN䗫69scZ-h2Gj7c B\2sGlZj>Q\=Z-|̝deқZsYRh9i:,OnP%}|ogwX=* g &{|4cF@zXu'8֎,:z&]'ʥJ"q23Q1S0?pG=ȆMp0juRJ=wp;1З gH"psꇋVqؽ֯՝]g˵ ݤ&Uw7FO⛯]BMrbF5:}"K?uP &sZdE^CI9!s7FCbM:S<-*l,mLbY9H%! W;_vr\u lוdA؎em.[:Fum1*4cb?,Ui^`;Spԧ`Tǥ 1[dVQs[&{\_D 8"ROptfi[awU [6t^tziI'mvoX,$!y^]|9_$Ay#9> EQY;ȋ$Nma]e@4<ߛ,`c Z4 *᫣'p^ʯ_RNVT6!Kr)EXr*A7hH.L"X{%8Uk*$EV$gm!`g뛙hյ"2i-GGGN"/j痗^WmR %O孽SErv EnH"AȩBA4G|2Av׫ kaW]$BAVp1WnmKhEXk&@'j4%)8'$9Yk?"Zn+b'f`!mMJH34_~,Ŷ볃f6Gn1iQM'3(a`QY>ŪEi 5B)%q</o-Ͱ`::Ij:R**t< \I|}Ҍ̙Ʋ7I#, c8N*a>{uEvfgs<2h E`wj|Dֱ3L8*DW1NV*}fmz^J0b!8WTIL&s@B:** G{m]_c$&-ҬxJ'›H "P UXI%'b '\H? lEF1"pl0,Jy߽m_{2| Hsh6HL&0׌QoE`{ٶ@؊Ct86RPNnnnO{ ב"j>77eF} fZ;۱J|VU-8sUa9y#䅈&x'j"LV'Gm~oK90Z͕l&Z2&Alm-ma>ڞsUjO_&~%R֛ Zz8ܫ՛u,cێ>4#/me! ͲL4L ͙i`3 4==Vw+Ǐ&FrZË$A oR jOSA۬jCp Q?_Dދq! +* z,6C&`{C̨#PpQ_'4>MImy9S$ AK "EIq@Hb*lRTܵSc}E 7A>ES@ܣHD$\Ea$(rM(*IG4.pqq8|= NaEL<g"/TD %tC+*J7 ous3ɑ{vq>I&~qP'GrR>}} M2c?Anq)4Qi"nq񢜸MN;<)`17 *[-rxdjr5x& Mc}4-CsԘxwP< Ѹmٕ>U/xJpAߌdЧB3Γt18SQrɜ54XK˘LM3<^,TiJEOi)r|gIDˡzj$^*~փLlX,Q|cxl 8]|ߕiqG0GR`xFhN-g=&C=#UYmuo88g߇`kK #]^`b44h'Aq09PC+>lXwY2[MWX(oyfyhS2%9̋sQ6F;lS> ZSFu߲lqU$vh'Mi?3d: 0%BƷ%,[J_hw<# _&Y#`o?P[X,~|r8-.""(N|Kj*$L$0dXIӋg4ߙ/ [o_^k&pxrfr2lЗ2YnJˍ4;{Ņyz'ϿT$y?1R\3I$NuzOd*ƓZ\X䦼Qfm]UQU] VV$l}8c Dz$""S`T?8PA?GWooέ/U궹.AJx6} CR0"* SoÌ9i ֽzwԎΒOne4/,ȴcuVM4f݃ǽr« ֬J  ua@ J,ec2?H$p;2.BJа^/AF# y<[ BXD6!&۳D0\((hH.--KĐ"lKrYTD4'RAwzh4hl΍#i"1b4ZЊBl6xxد\Y043PL+$hGG),ouO2 Qh!(p <2WTHĒ$8 #, bRF{8BH,CqpF$Ta*ϓ4}ss{eP̫z>̿ n+._5jT̽}m.?zamgwyu_oCj޷iRxkVeb[3L2+-J/_އҖ@ %&d qbǓN/eZ-YK};Pl+ű\`dVms3Srɨb1hO?sn~o 丹(ͦ\r|}^SB.gm2{XC bI0دk3ADX O2 KBSL]Ʃ^/gﴓ&+. x+j۾ hZ慡+R^pe +#{ʩNu)DQ77Mz7],bj|MOfs6)WNѨt΋ []?]^ u-Kp-rbyEqk,x]-&0w&JY8'K)"E,ey =ǵ{ Arb~`Ӹ?^Zå[Ivl4jZ͙۶cՔ2P4Κt5cZwmu5OKWPwY.5x7[<6qMXf a.G  IpXRC+К[%dsP@hc2t! DIT+B 1Yll8$Y·ӯ,Y9BE[G֍̡D%Ҷoe ^†2@eDH硝fABЪgcm_JCElrݕQ843`.3B_$@ ~\ޗBP<@k (Vh8 kǾ=~lbؠ%٭yWtfڽɭ;?H?fLz3sn2CYՍۆZHLubM2B*V#&. rˣg,N+u`IjX DAY{Oɘںb^Mo"6اI:6M>#} Hk}Ӵ0JR49t<QY;m'CVcodRW͵ KNI!$@3]CnF0Vll2|Mx*fҌ̧1ѶQoɲSi.MY'p})A3B `B(V}׀! .L`ebQD"SbW@]}EDm °8ũAJԠhyılH Z(Z@qD[EQHH}pH,2J7A`Fe .5Z@$e>Ogw4u<J\B$0JA'IƲ0|lwD.WBTI[AXR~!6jVU֊5CS2es,e.gQLf #ixٵzѫtDq\Ė$ )AZ}dm[J08zP ߬5ׁXŶSZf  /E|3e!g=9>uY'G=qе\Z)OJJ'{Ou ]J$J`FJ\\oV7j"0gڙnjC3vf.M0ٯ,FYfgpEUDQ4I)E4 fߢtJ,4WB˖YT ͉֝ɱioߜr?7cS8peBݶĴR&h`J+KM# #c!"FQڴlF1\lU#8-G~"X_WA6FQfOM8n5S2CEyB @1w]mGi.~;f#,Nsx\ oy|&XC:/zy48wboj+ͳu ËҥX'l-3-Y O=;g;2,y#1B&DV2c,^G:ONPqb'B / \ۉD5>V(a ÄdwM-UʝGK7Gs{qX)4AU[{kaepR<m=2P xa>W{*?_g_y^!3(0 4m[A;y>|0J"HJմ,|tC돏GP Uv2 *ȇUT&}EX,u嚡QPf \nOÌxP*p:\.Vq-Yʇpb݉1΄Zk3͍œWϿK9&CrG{h.w(7oϯ-%aۣ%Px{;/Eܶa DD5K_Ld&-N4͎Ȋ$RQKx;;`wO/Djә)nN>\H]>:/knÔ(H0o48ü\ `A`A%8r9e8ݐKr~Ἇ\r@fć;]SoK@4݊^" S"Ԍj],/_}GT~l̚;*S hO$ ?)K%Mh,c~"T@ YB4¡:;hU&!8kԆ"Zg F̕[6_`3&B.O~Od/^Zŷ_W MҼ$q yWJN|W+@Da0U AsysIkZ۩g2NOg 6+pY}gX)j7_0r kkabȋzdf Ƕ ^ޙOB0 lG 0q^$t:QmW7thi53Lxx:gD 7 <9Ѡכ:vX]lb 'CN=Gq4hXD[73\JP4 `a0J\n5C#zMLQ, ûG ·`{m}80/A8<ޒc၊++m-%AaYe`,{7^nFQAH"!{7\h8L{DSZ6C{p TQK"u5 kۓ lUlܙdL $1xh>YBr@xqQEՅ@̀ 9w~Ru锗JQ*\ZD( 8\}t$˒yNS]>:G)pe4@S+T\`|^+ { nrMt!{!U28 zVelhi~{5GռjK)yX7,&0 S!e&8 MDz؞jIӴݽnςyg0qG&??n(Vwk`>z]T@6ma*|$/tUNH>Fdyh]>hm%JYNSݽ@\ W RvLJ~$jʎTlXV4xsa-@P!ՠ@of){iPְb+IӌH ?[h>Mv,Y^eID S"EW+A}_)m uq[AYs"+wYUj}h&kZl<7WFJ.ƈ!Vkb.4Y!ad213|9R'Auc8Xo{v4eOpF)j=#X;P0EZ䩌Or([Q,ID:N!׳s`-I@^i׹RQ$fsc56mCY> * ㋓{- !%zk>ItgJBTF8.Xѭs?K%ϣ?B?TU qb}b.߼#czW;}`,0$ (3wu([Ō;;˙NYQyX(z=h\`$>flѧ:D4*{ԎO;k~m]n6v󙴋.ۃK=@XLJeD# p7|2{%A bJ^f ۣs4ʙR$uK AP@{EA;{/v9`[_PĚn5po Dso*) NHCc% mQH$/|sdkjz>+`r=oO"MRueBHTW,`ս~\VfAKt28U(AT~klom2r/Wҽ4p5o~QP0pumI ԌZu߄ZÓ,gI3hmiϦ a *Mk^ATUnw=~?7h-Y~@+S|PDw}!A۽UhS;f,H^^G˰VGq\@՜D64ǓӹavK`hgc׷AmЈt5AW! 'p22biΚflCkڂ,Vx2Lj"v Es!M[`rY7սf HKL*Ko 2ۛtެt&S~+DBY}EӷhF*3D`ak}t\FuC$]:f>C?^ϰ`Hh<֫RQƶTkjKZabu,c]Hs4,cB etn/ ZɉzU rq.1qrLeid1瘷e` ""o!Է;Aؿ/ -{~'+~;K+ipW(Q~3^aJI` ~pI(xHXQE1&΢1t0 Jp|kDt6U(4ig?,=fRiIBz6r%>ޘ#%" ɤ8F!45A 6MA x U&`מ"kO;.랉ə2c lm]ϲ@4Dpݴ{>zru&.JVB+涄d.U($\EM 6B "&> m8D[n}7˥( @LjdRF{pmTP llh?`ѠzIl ȴ- aCB4C+V3A9wiT0L54ksGag I(Mչ4TBH0 sR$b(Nf>BgsBAzhݤ$&3a!+Tjpma\BIFwLҺufz}LNۙ~hL>]o!qH?ay7.'ȋn5ۏш㘃tVH -Zy:e{_4+@樑 T<鹾i!E($dHK9IZyxEԖ]ZЄuMPq&i$F~SDUN%,H1.9&xto0w/Pw݊x6AtoP( UÚ."2_vFgs Z0bF߄=xz8]~vWxIvV,Ѭ!y5AWDATh8Q[J{}̯N rE8tFLYdJ b,ȪRa@u1  q<۷ܵ.W3>yp| b9}x~vyHתջwI,NJ -&<==_"oRST4Uf䆎I.\MR`8` #+0c"_R(dIΙE`.יe[\8%͡35IZ!>]G1Î)pbXB)k'x]rVQoX)]vf1w=e 'l6q&@AOs,Wd1a+(R a{4UAnYR`qjGC),(XvȤ1WάQ!E4l?vnjasn\"x|J~<yY#fzz;+tiXNJ"! xA<8wV^X-:6DP[o.M=p$H,Ye{4vEr(ӂP. Q[bz٥ɀ{WG' t#ntH| S3WP fb`$%Wmaiq MƊT Pg zj~J|yRA;&(![wWU˷UX0 1ǦIrcǪ[ J КmXqb'çT>H=G@̭+u{nM4-|IqD,^.O ۻ])+zsy5a8"\paAj+8BEڱf'no (\IEy<CX)?- @љ5m`jX1;v6;qԝId}mߒN63IjvoFhB4{mdc0 " m!6մ!?Qu6ԮF*gg4G$]B\rxkn ^}Z%!*̻bLGsgaʏe288pضFkմ;l{"ɦ25%"[d tf# ޒ:B_k0e@' x7O*[y\xfz;R< 2Y)Ԥ˹|1(H|zĦƴP,$1,"bg||zf]{~ 3qEw-4$ji7pPMc(EdM<# "ϲ[Yhin8hZʋ!9hOJV*RW䂌<ϋ5*UnlӍ\Za|zg60_v_%ov<͕9ƽע@5cJ=OIUT˵JR3''T`~|~Y" .v.%($8la!D]cU&Ѳkͺ-1s= ;d%GV>\U,C$4KoM܎~j]Ai#B$ŋ:數KnD7_>M߻54b"1,<#W?"vKQ!͸K3̊,֣ڮ8s9:0LK1R3lDB> ‡̽}55d+0uQOɰ(Wwqpl5Ԍjٴ3ciw_>XpݽM|;0%9T|JRa&{Ms<=Ё7|Q,{s':uyFu EQ()!F5(}f^Z$NU4i"( )2 b9g3"m6nkkV%J,149wQ[.žQ(y="Q1&0H:u 㠶aA,jFN"/vZ^Fś*3^bc`UI9*K(0LqZU}&p:!Iuݕ;X­!J@U*i5]gc`~kV$%܄^mKǨ&$8#{:z0qЈ4ES.֕FI;wGL^܃ۛ?tr7%j4edf؋GچMRέ0J)AUY`;1g=%Rm8HQWewLO.`\EdkJYEpΏ@3~x;Ԏ_\Nj{޲ViTikmܼgÇ;Б,ı'T2tZN'ԧeN텷LT3':췗헓,CIM{՟A |~ M0R*垃AgʲZT肊OZ/=| c7סkƎP^D`oi* $Gse{Hi-V@ &ެOM*)nHv (gC?7bɈQZw:.1*8_d8B]Loo[qPpkXl(jd5=S.,2KO)JډͽFTp:d' j x9:/۞ v|5#!j9GeY~7Q͑!1$&teE۵!dX0Jm:i(r1ԱȘު5"~fw?pW\X F99L̜Y#!r -TEdlOgTf0 }6oRIs7}s@w_?lCHe( M(>( O ,OApYۓ;{wwn{V@>o;!Uau]hhZES{a]hPzG\E۫?,kt}G~IK\qdχy&F\S*!!Ng}c>Zj Ʀ]YIi/z4@՛ߵ';6ҞmntuDluѝથLO30D0q#l(3YZMAc jMloQd,{' I@A4~AdαZ%ee٧gxkn4nq"7eYDV2:mCS#KŒthPu#R$͈(0wvc,*PCM+ E" K'Zo7_~Af {~ pHc3.W'~|JWm椮3oUQ9@,KL.'~JOVR ^"Yr&It+U黇ؽQ*h@.A{z-pJ,,=ld 8 0gJ~Wi'(:KNl!ua@Y\I3K2MBuR+1(jJOC{x_Bt{B^`;^];8;je3kH>]d<i"XIw8OlI%$bcnv5}\%)ݭvYT|8x0P7 f?8:洭( k_т!';NMu:Lq?4v$"6h^t9}{AVD AV8#jUpgǹU(kRUT7pܨJ[һ\$ѩ. BQRqxVp57"eo1;/柦H+k=t9է/{Uk咚gqWr$OOOnn`Nepye/lexB@օČ*[:4OOރV e/,Oa q}E`$:/2?,%Sg$Y\/|9Y8fʕ-LkF`vo)7zB@.WyBD5Q$K$I;պ+ٶ 0 ,Ɣ@(B{b0Kó|"Hfٟ[-Y\U r14~6f8$&I)εHJ" n2.ƭg=xy:󧁿(AW^nkJyWy㥛g#43ed  A'OJZe ö #@Et}"U;yraY%i<䚞 0OS,&m[S@t,;ws40>VEMK9Л{\fB8z2r9sO c+NZ Tg(IJ)S(p@4a(?}zl\r={O/oP ZB>n+21 D:]wv;aGΐ(.èaA|\9UA\#9!>'ȭBeM4h2$^# Cgpho/N0,Lsh>[+};vCHO̶Zy"(^*oqr+S,׽bIjZ,hFnV0Ib@Af8gfͻ7LR"e rQ'wTG=$BToit6FCS9hό>zǣɈN0Y:t=wݍ*{+ VbE;!&a XLOWUUՎ( 4&WN8$/5zgv$ogUiE)hbRf͐ ~WX(eڷjgM᭼ۻ DIhZP ]U nK{4,)C?Z]Ez4=,e\h:[ ]\v/7-"Eb痗U[w{sY*q,ܥƞb* ۥ-;IҊ+`0:yq/n.7ls(vXz7dr2 n>˲L,.B̓dZȒʦ4a^!t 4, թ|a,'n%t P[v;.1EQ; D `K񣇏*n&Í5G}/_z9` `ew/ ^Z%KOεM3 l'16qUNNMMꔮZJ&rNcƘ a_ ^^!L{OtIlqqUS(G)jSĚu`&pY"3M15* Q} GA&ly O{fԻvhGtNf24ξ-pYS%dĉJG߽|d> ylv3Oܦ%j؁Il׶q*^Nk"wNc#O_~1ob5ݨAv+䀬f,pN 6C_ ,B U^8)CÓ4Xs&J2w dwV pR1ě4B+iZ_zb`Sm]XR9Xy |PN$"RQ$]Z4PְKt!(dny gKTbYlWX!T=bo[/u8> U#0o چҥ.-oY:E\> G4t<5Oʓ+c-{x|G7Tz_`M1 %Ixs$pPh5gx'PMHCc(M`a΃/w*hd;Mhy-.OF )cb;h)2ҳӧ$I}~w3<\} .q|m[l[!ս־NAkכ=/p.ω)n{&yHƐt$$p\Jo9sSQ%Ct$uw#_m{FSЊ&$Λn[񖡊@55ՙ:8ѻI#Lel;<_/AhyAɊ8xɛrqΎ)ȝxӻu/n?w-H0Eǵ-\oIE8 Iͳ|Ee$"UBѷCsŒ ۩[džicɈ9j_{cA%K3vpDf֋0%";]gx$If/y[4S*T!`FREdvǢ Gs,/P@0ܵzWDB2l5O.sɒX NgANPO!JA.) v۹rT`Z٭jARSpWaVGҎ, 4CeH2Gsiz75rcdw@Y,71x1TNTA5M3Hƶ,+XCkyb*Lo['tl_+R*6ryD p8[$6(u7*$rjAr,;@R/-9;;[l2(K1*X7qq'2IH/@Ȧpy{YM$__IistA#ZQn(V@ց@֬cXNVOM3ÜOl$✓6m3k/z]nv1Uj3u6Icc1Ƙ!{@d`||$VP˪:x(<țJU]l_|-R!$`(ξLT$ja{5EHJ4N^t8mwykbP,aH؏@U첪 vT$I$ai1v\pl0sq~/nH rFiVV/o~=LEX|04zVجͭƎ*?].Ն*2O,`͓|7.g/:+q[-H8d ,4 Eg/fq`5F&Ger=k9:\X1;y3iLI\"q& r%$ԶJ>FGg 89BhJL! k鳑xH&wqL][#]ݑcɹX=aG-$0#zn8CHA׵(]N#E4y^\kla%sXMyێZ%Yb럞͏E"[)*A2%>^c$UIޝIjHP+. #%fXh,&k{M5~w8|{lndHon@q}s[XQU4,Yhq âBY(Ė7pbhr0T$'$9%|7:M–+Jɍ2BYQllXV2;vK;s:>OS*2 Ɓ}̈ qRiuRﴧl>C Țɴ FKE,H]}UK/^ZGN\þAS(t[7IXCksl./JrYq~̩|Ha:8_SIXY"Tj'I&|>}! g6OkZ̼HT#l׺;έ,,u5& )xrl7 CדXnxB)NAp>\~ BL|6;P x,N/>a<y\pɅr=SSzg0,K3LzP#enޙΧuְs3T(.ed6iq'cb`8 % be1f9,H,i1hbv1]{a8vjl1#'ޟV*L]M$cGy!p.WlY)ԙB|K!Pj^*g(hz|JR=Y gQPh@qyt$[ek:R䭂eGLYiztıOe#zmP%xOӍL̲XBZ$t8岳~s{!9D+$PDd @NH[yut y~hk1÷|4PDt޻~TdtI)8,n)[N~ޮ׼RoP VEO{%\˔Ca8>3a8nU`p Z@ziQA*k30 i`ਇ0FhNT )-'p#"xR;K3M܊°oxC vJ*U?[_ZMR͇V3 $$$79>}ũIJkRf)J"=@t8yot~8dJ̏ w^KSXކng{ʅ:=MXKXڬzw><[y686錺_yW/v`ReP k($0?p5\oTwvySk (qS@;GUMO <6 ϯʍRl@2QD#D=T-yeFqr|[,hr }a`T+eEs,[/7xR qRaռ 4!۟mr|c<7G0"ZEl;cTrgD!! &IDۜD3@ k s{wbeZ tbs[0 /'={˥LrX& {&"KŒi91g;6IІ=W+TYAH㔡rYLo-]x1wc9+7˭qwZ(j58/担b$~iy d7;sbg55!}E9]a.̙4Cx2/k.yN4XDH7_ʙ94-&)n8&&A fy3{k Ǟ>ʋ?ch|=5 ȼ`S텳ͧ_?7b%RUD:i7%NSY<-o'x񖟎?~7IFYNV'cZ8/t[L6fo[݊Z h,% :,kHûK}TcJ65F-~’(!Jځy@4aDY ̨x0([ȕ,|yb0&OJ5U k8a PP*jnggV/ŴĢp}5'{c H4q7+ Abݕe a&:k&^- DmheQ(,yӂʜ0vXTѱ79m??zEرu< #=R#@FtyZAuk.Kph L=F2}cRlN-*cwZh 7a0W^ ]ծjouךa;KFoxڿV_$) "d<HlQ ڟ]\3onni([}-D}lr^ZW6}US;'8I tLu˟?Uz ?3ǏIZ?-AԵR4d6/m.v 6?|񧍏 ƃ˛˗oUE# ;&8nB/4Hmag)d"AjRCĩ7X`bs>;-)FQݩ8O j<_ 2_ '..@UL.+rnH`$FUkihhPXW?4A$]DGfʰS-ޜ^]kE7]k3^Y9P=w3 (dX]30^'fUVu`ˉ|Rrio>Lfa(2p>2ʏP F( ,PbbF#fݨl<p^iq\8DtbJigg2)dE8!:YY(BʐaV&!ߏ@z Dp)~m{P,v)6uu^Չ<ȳ,o\Pֿ~< w.;j ITٮ DQ{XQ//4(FCdI^nwZvS@B\ `Xb&ȉ+J*ݦMfVX(ejLFAF/4Ucy?h>L^ (:7S9Yn rl6k∬ލR"!t AN PܞR,Aj4)ѵ֎]09>恱0YmHV+%N!ܿW* GQ_t;/^n[K lN̩sFA}e?ڬ乔-CI{s KJ(o5_=` Tx.m.M BPW]Ӊ!hIر-`T]jIxe96Δ3*!ʉ_^8U(]qTHq)iU[8V)~[aٷ_ ޸(b ԕ*Bo.>hٙ"uR>w42DJQ7+gO,ۺjYIG;0 >11t;=zm&Xp|i28:č8g J$6&v7CUUVCQr ;\ӟyh;o US ?齬G},[„*Q~VTDV=mWMsxyhJf;о6cXey&(<BQQ-ٞXY#cDcr6 } CSzoWJœWX IEl梱 \}d>y~thkH;uA>6VrtdrJ`޿/ϦcP'PE @'YתgiZy_t[{wpnb(6JtCqT,iAґX%u<> Yv\IZC*1`b/# )%;$S-k2!˪qsޯ4(!'_==~Fَ 2<@g lj$zCqbKS A+S,muiJ*ͻ͵iSXLa4=ZCˀ_j\ԧѤ?^5O CAEUPU1SZP5PK! ˲V=ج-gBL p [ƑL:%$3yN ¸}̾c8SIfr0a۹$$[  B hALSTOZ˨(|]AE<[۞JTd7o3jy{*_zNZ83)ɴ|Mat6:oQ ܄ʦ@Jr#8Eݝ•'B8)n,! =|"P53fmWxmQ5ɏ! &aݴyVE`Qbev9`(r ƣky,jAFPӞͼ.Bx#~Cmͷjը.M@bj`8[AA3lIRx܇yV&y`81% Nq4IӅtX=x2AxHsZkbH#+RKH@B(fH | 諘ZoCë~鮑QP8ѝqiLҾ|Q)^Z(27NkI%,]==;C:>id oxᨿyAU-DA.ˎF#C38^d[[8zoЙ/"ʜ*\.DLIMt>3sIY=ߏ*[ip8CH"Q!#H,lZ1duv#3@b~;oa3c0&$7暡+ vvǷ`3O.ꀂ7͋dZ_$ {buia>$S_8v'^Ch]*Ik::ոC~s(euI @ac{qz͋ݽQh~i5u@܄9uIt; D!j GrǫD$jέH f0>Q os9[w6b?_94^v兵 =/G۶qnQ\%jYN A&\}(ТIca+Sd|"s\[Q`|y!ˣMy7ȤKBDgL (Vo(P ?%!V/<ؖX8ə5}܁`0^bd JRS8鏞'M\}[7cp6Prڗ|J7M.!R.ɫ4t:w|W"4kŵJj?|:,<]I,K]rgi!zEax1'Pȋ{fgԌR9uQgW[K'糹=eȏU]ȷE F@aXbQP.V@i5a81${⻡9ɢH8hکuw65nvPMF l!ӉZvvmߺhW բeW0pHx{cUiK;n$\zWt]^7>=?UDSuFk04gCgUMTyiFQƽ8tM~cqպR)o'\]_Hqh߶R (e#^:8><>94١kZcY&&M@ W͹ ˜峑}ij<6jí=2uc$Vh::@Mb7fRgquq]_3&XX Ǜ! <91Y~jf ^(_/GҜaݐ]HBbn6Ɖt&L3Lf:EdW]tU6,N4qbv  H=}:7[ϗIXf":,oz%9/ƷE0To^|h < %~`Gd,b}4|T(7jpUrIAfAᩋa Q_b1j=_ju'i~ ǟO[ ! ",eK۹5]7qp dVJFYt22n*7/[ gnIT- w}f:ԗL  ywa07h oگ|[!0ߐ )Mq( >Bצ([Vvw///iP_3:٩>_ynԘ/`d9.oSk.P1@ۏ߿݌3D6H):YPJAhH 4[ ykЂQbwAw"qapw8?}8iBBUw* YL-spLIB`I UrG# %'TuApXO%Ap|й9?=BRD2q_òKv1$-J5l:sF52x>[Xki5pm!pLxRRx>1bai)rtW?C8Zg4I*RuʴKwulWpH@}DH\(^^4/;3z=ܧ&. Vr)N >rx+R2([jhT6od!TEY8?= v63(0}Sm^A-XqP ff.}pcӡcbjZD?(:߶ s7)jHyIĎ(^zߙ=$@kG-۲6REq'KRb6XƺG ^o˶xD(BNcy)/ب,@3e鹾D! .{PxU?6p JdL\ >|ʿJ\+;j;QjSȲo ?7Z"F1DOYdҘ*!^ qb^ڪuo^h} +],J1ZmnOOKQ"_hpC]iwe9YGaDXh[tW/UY6Ep(=r4}`A pxFtM٦Te ˣp5w 5!ETjIkb6D6 cc8@di8jŇ<04]H_ۤ7bȰ'w;O'f`ZzJ f}kZ.T%!>\=7E>KM\&b:Q^p&(}e)pt񃣗#OS? ]zb8j n2b*hy$<@Z5|>例"B:a>ǹyb(~=%r(b{7KMsoTV8UB&03.dlZ|)dG mA)XBHz/` (Ρ߫걛)A&1 > Kձ6^/B@%LD*W1<!GV;5r"!`&OQ7c'hzG]|i՛(icpj\N\VGvzx% x9)=q14Њĝ AcDn%6f4_XKeOSŊ,F1)}%?b  _=}LJ% !`^^{$ց@vܷjrUX/URԆzg%9)IΓ;a%Sh euRIѭ.p&ptfM[a־X%[/ 2 IW*-R !@ qlVŲlkǝB 9yͬt)=~,&$R./qG[zЮt(8ga,RUok;yoZ[7_e)?8 SI]!>|]pZ_7 m!jwڗ~W k:DNj$JON'6֋HĜ|r?0sgsK b+jߝ=/|{LU+%i8v $B2ەj JӇohGju 4&j MQIc>EENdA `qX\V8 3ʰ-xOԔPKRfFX} 6tj*cEqT[BA$㸾y`8Ċnir3)FW7㑵P+b%ک〡DZ$Q$22c[p8"sT!A(j&3D(]+ÁNe6+dId۶n7.5k,HiTþ9U$Ҙ  Ɋǯ.fw?^,H9)Js"@F g] Պ\R/[(!2_۬4b7w\Mܱ7Sg8J4:w?wK4&zf` 6ׇZaUǾ""[+D_ ^\#FFNq ߌ_6-ŲYKKbqP_w8Q5Dy$ʉjk@x]hXLHF5C$'@(o0+ܳ;w>USvitH1c@ e@ը7ɂŁ8|t&AnOZ_KZRYk ͐0 W :-C3|i57Oo9<8Trl'Vdk@NR& 28i ơMgINb597x1Y,eިn euNѕyl.m 㤸&),ɶl˖S =8C -#uԎ,Glm8 [$!5Vz7٣YQ.OzND3tρ-/UOn-Swy.] {G$ߍz/v]Ts.3d2Bs. jf)_SpӂaJAm0-U$*q\{w{z~:08A꦳l]_85`NC ˩R o.OռdXۯ4RT\g7W3C"/veƍ|ce|ssA_,(-04Ej\;d4Qy*h/  WR1UR# LKٮF7ۀ#"(Kwnh0`ƣ!(#@.~%!*|FP[S(K!$Z[;{, Ú2G\B p]NO>(hJ{Nn %SA4fm\L4KGHhX3}\+׷*koMݷ'}\E i{rfK}2b&CRKoTTSg:8 CwнWeӰIrlchn lA`fG)%t&$i!rr;Akg I γd2`ٗFX(EA*~&lK'5foGf%(jP % zx>TUX¤3%kdt2Jv㤿:E%&v;۩~_`96uj2 &3B^\U앝R+|f eߟ8Y hZ ?pYķK9} en@1`xWZ=۔MJ_XyHi$徢$T'x9TIJ~yeonxB nVdiG!ԮagFF },/r\4C^AKL.vC)-/rG]WcQC8(AU{<ZLh*H< Gkg+dfL1{WON>w:QmT]yG|öv%[2/fqw;KfwwKe2*'=:V V,ˢ(j%CjYoFE$EY"]*oԎMW-iZA&7ي Njl$Z(KG}p Kuש{OlN/?(̗ϚOa&ӸM$6MG{]Xb"I9nwPM`P*ur,8۷c/@0o+cr2Eq܄o>hI#- k&CpBzΛO3Dcty::Rd #yhDfl)%5xץ/v_zL,}7t1:%?M jIA~v Qr- P2"xY?:wvV!6a,ޥhPJM0\S2VV΅{@1$$Tٚ|kBl5P0 GHC@W %2XX(! \{>ҵr T75CZ-rA=z!"Wäj KҚ92y6'L$q)ʮ6`fTUwXR>PueBpdHNW o((ֱx@U֞7GVS/467{OWw@%YC_/y/ "11`t+rY[<#cb"B1 ԃ Oe3M m|m6 IAB4QMN&~j5j]ׄp\0>/>|,#~}csun/Wh܉x+K@oz׭IK3R9ǁ] g ΐHtԓXkSfk%|+>#1uP @(eL+Jd f8sUs)QHd@M粍F;lyV+T$ȇa j1G =uKEI*%q^^w`/wvдhAbhXm'RZ ?W6+s{n ")y:`2Xcnmd6j)b>1<.p0=ɥ%Ն/5|lb0tW#Qq=GkmSiN8T; ];_+XP+X0KŘ.M `O6$[eNi-4}K 9p|zT.cF#:E|PFYޫZ\N^ITj"5Cɖs}P RTFd} x$4X,tF-2QVko2e%x gUZ+GUn.ĕ{Guv|~40 (QRtvB7:0>=hɝo^W8t!8a4ߎvx$ `tHNFa,\{Л-jVv}b&Q7ϟwksGܡ*mWA;0'Y)GW@jf'_?6/Lר$J u.B`ϼT \9nֱQ||EnTsaH*FY^,e ɃɫW[8A/tddVk3No G|ʃv6})j,uzK,/ AQ$C~$?׷-R ]8NĶv[;IQ+%.aDΝ{ޙA_|%2a4NAA%hNJ"G0 զkq!\&,W˕ZYV0VF/ pjRyswТa7`XUOw hZcnȇ:#őSd=<(Vn. Y5^!#A8gT>4 ۆdm6u,k4~ bÑ9 )EzxX"yD_A"j6%zd[q.]Ћ Exr``2X hV^vC(I(`1i|f#Ot:T0 ?#+kڞ>g%w0 D%F[kUu 4럜p"c,{:AX~\ `{ģq& PS a2ċ`sL.ST65 &ƭ)I5M{..(Q-DfHcG^|y7o>r⫹5Q8em)H$5o =~rZmZהtԱr|{ZШ\T+zA&dU8qӕ332ƶͩpQ0Y[IZlZ^)+)s8!f3 v֨V*Ԟ50@&`\ gwiPU$.5!eW'SU ӲW~nʼnPq8 G1U?__.gSX cM qZcXݘ9R* 0,+#k"VNS"!>"[ײaq\7~ MP 0)UKŰ.ۺ9?ءP4Gdˀ@4ޑq0/߷`:cq(67VvrA\KҶ |/ S؇xqR}ؼ )gǂhh!wX"x`vbã~lYۆ;DW(Q()(GAlt13΋9H^`DrkDX[(Z|R8-~O9m3Z@,6$N:3OL>t:Nz'^X fhC !zы4o4w]Zbyt~4!ځU=+6F0I[ch_ݟ.sXB H_MgG^̚Xd#/A&D aLJGן`rC/>6l'q.0k.XBOH;x]JB9҈(~\Sl~_{l\(ߌDn[7_Ɨ_bΏl|]FQB:{Q0 Vǒ\4 gi=:̰| ="ۏ3^PUUfnoFOو'x*9 FUfpuS7H@m^r,*[/6ұ8_?~Yk>?} Rz$J|fd.IL?9>n}:N])YׇۋAߵcx{<eC\f2BX*$仝`zq1Y)oDI,j٪(GhN\eMfŸOD G@Ǿh> Z`@ R,O ` $Ib{~.E!ٖDӫmiR- B7' ݎ[/ej.-,\5q 'HIbZ!ݘ(.Ŋ0A>Ch Hhseoet 1ln7͇7 7RDLWc/!P2IfRNvh !ywI Vjڷz_i]ۆaN@}B $($`ҙLe&VZ)Pߟ9%Ͼ4/?x<\r?a"eeK^Ki!eRF XAnB deZu`#__m~kHb৷hpqukpZ6 x{w}y0\BO'֫hJliw{n}h*Ez׬>g hHd ,-`6,MW݀eÜ љ6mEaXB$! !`YL&dtI2i2Y:n'fm=\syj4лRq,& B|[uTlfwڷ籢YmVs8:7T,Chho34Aϕ0X92˰Xh}{ ûYkm ol%h9!4!G V6[M`fMUl 8ͥ$,IRy]@\L4 }73" ϐq Bb~`p~ d<(vbӌP.Pwll)dBVS/'GyZWk)u.]fc%/7c;' g..We0R Xexȏ 8͔0Lzx .#`L4̀>/~I!qhyViNd{u^HYk5@fH8q3T,ȋ幃(_$MEcÈNz!aFr̙IGQZ**/ )d,ӟhRNw疇;8WLns48~MURE88%(7,n:r+*AWSf/EdtOk1!|nSI<:?p7BMm!uN0bu1iT(JR R*/U󕙢dzZ X]Ã|ؠ :)+,A"'v./rp,G`ףo^:kHS.{ L ڼ~}ڡd8VR:,TdJ r30|{lksM;9iMƌNFls ߹p/j S| = \ƘybsT121)#f9&, 4Ϣ#SMr%׫PIi1;Qsbc;;dzy}$6VUmn߹zUX,ͦB1Ρ(2xPR>/Qr?LJG(nNx>FӘCqF;u7AQcY~0ڵ&  PJXQHrpbs\憝t\6J׾z?ߞxz]*_|\[?&Ws'Xn.8޻ QexFy &BhbYD+ur*A Uczvu>VuOdF0%sYYgzמsO[K;+rl)'EӸaoql؎b'@0ܦڑ7tU]TըVjaDgF%@` dB9H7~XVeNpAd"↖$HUU̓i/$o]4]Q9-H|™yɰ(|ݐ#qJ`y p?%b"O8"ROhs0y:ÐCt6~玼}oyp`,b* J qڝ ,zɆ*\4GsËU*q{ull+P9k/Ge0B$\Fdǐ24x2t@Esee⨃+ xiE U"ʎNo}!L&+ZYmOǟi$ i,T"7x,b(c!.8L#؍{k![Neݰ7Q}[J]\t/zrIՁ2b< (a@-atWOYG$p̽5T^퀡JBzEM$i,‚Nf0e`l.k^K;.q*V7{$˛?[t^Puɬ$A21DZJV/ 2LƋN =24;wa'NL,>{^[You>B!>ݵ`u1XMt''gӫO:k5+:Ŋ(V Y)Hdr5u"M`S3>d!=_^q3-^f:WPYھ^eN[=@IJu} o8T?^4D|?(0@ nB,S#pm>޴,}Hg%"[IH؃r$7ONTUQ ͘οiUU}n؇w,rt:9@CQ_jFѤJA<{x /@"yN B r׵|; sw! Ԫ [,7Fl2ctB ,q/pٜZ,$6M`N:i g>08 4ɝF;fK9)0cR7䠹65{'<I$갗gK{qO/$dLrP\B[d>?~FdQ"@خix֝ѹq|7@\]\P rqр'nWOW&V=W* @љ5maXhCBhGYoL⦶]ESMYf}BI~paFwgsEVWo"ښ[ [?l5p:L)I} 8$μK+dqKu}\ 0>tf m.BG#Pf ,rbB"ʣ'bgK YGwڝNJKa8bpkk(ɍ%{5ǓJ.GaM yѽNY!fZ2Z߬T IYί0semawbJiq^\j#]M j1Pm'SmڜΉtbh*A:RȻB}5ʝgPN%RmN4Ufx+tk5zt6QNl6Zՠ'dڎy|P35EoZ jO?0>Zӵ ^LI%Q 轻:_ ŗx${3Zox@b+$x`N^|T$LKזiəX9nUԭ-@8Eأ4`eLrm49"20#S%9"ןߚfu#٧+!v4]}M4 6?}@)gכ#c K6SMFG]$F_3jHgsܗb]9zs|ěӆV ࢫ҉!.'~ G5S=}RQqZƠRL%5k+=F5M攁ѿoyJR)Taw.m,EHD)'!)@;4ͧdFk)I(O'M#PcQS9/')1 K3BTL zj{n{bc}^` ñ%AyN D6Y,47]֘?m'p;jy>RzxV_jWmNM]-V]ϹMT~ QJ墲^Inr^K CeS*N0|H$BP8h$rmw H"ƈ,mt6|{wXesZgDY`B}A.ł値oomw[/_Kק'-O?||\XNڄ ?K9qR({s>*ȅ4@DAg;HD9wx:>) g2ٲTUǫkt_lm#R\M"Ej#-Z$i$ucEyjR qjؖ,[.(RNG_@ ܳ`.h)vޠSlX |Vx6G ruddp,B+. p8谄aZfYT&0`Rngg0Y'4P Ҷ Y*?>|2[EPSj.ct4BU-wLۥ) hf0_8griYTH FZժXl?\_`09 q*q< xsJcIT, njmB x5 `[M6(d2Y)]|6mM[uRf_ܫ&X"/"YbpqTQ<ܚa9H{ۏbZ> n_W5%H,tH&ERL?Τ;P"8 e \'][]^2,SUb/L QsktӐ)@$):ɕŬ,y\R7t#LBX'hzvyۻ|]in:=6㙌4N#(d 1ROo\wq!%rNAu|z 9ˋMx.^fjۃ4rJ@+Plpu5+M$WYWסq|||oߩ#45T.#(ֽF*J*@1 mT\oÉiU!P4QwzSw(6"2694b Ji+E|E}2}˴yf)pmyuU9:+Esm 8csئkuY4 +Kn @ZFOKCsĎ|Wol}~y~k}l1TEEJQ"NNOʥ~l`mfTn?OX@!鐢p.Nc/p^_;V e8JW3I 49oؑ5F`D:_ pؓ,x0"vmLJ P*8 c|*qUYYc'3Y8K<ΥKf[̴mL]XK gJ#lNgq$.LN^ AC]j*'IPSz%;PSL4 iD@LU5mmzw %ptfmQ2II-ɻci 毶}hQOA[։m8dKݤDҫ{98 YIз]+*?r#A)~p{~sљ|] ,̈t\ZO:4 ~j- !J)*֔msřDZ7_C+ }wqDDbF׫ 0 e/0{ba{o `Q$ \WSt:׉S$)}yLH8\F ów+knӊ¬ [d5^LIlNx.! @|\UT۫ ;O]KAj)럿X@n;AhV SG ֕dFƽ9H:Қo-(fM\N4SGxέcQ/QZOGՌ [<^_xQJH*OYOQy\čVhu'L}s|/Aso`w| 0h4?>_\|xPmZJ[hʕڧۋDl&):t [k^GX@zNF8j yK&&n>saɆٞԱFihRHlCI4okɌtVmt%okeN3Wg3|% TtAԨw~~DpD(?Ei H}8('[H AK@(O~*yly&FP(@P0tĢE~?;f-+l:чKO{$aKz^@">,B;0kߵ+Nbk(R jL`ڰEpFM3Tŭk = `Z0NS)p 3f }^" '̀ZTND!$KپgR|5q{X{oV}`s 4I&mji$]}sy=})|MWldfꛛsG ^>2 7su>{!\"1u38)X;hDNm %kl]띝U:e0{ Yr.C($J#:OH=81]dK)ivjןxME ɳ,n6h6`iݘHpC6 k$Hu[Ѐ;6!1^IO^KcbGڧrJK@&6%d??y~YNʼn@ݭ7%̶iP*JB)c,"VDKނ*ZV[D)E6 \7DP*N%9: 7Q-n8Ɠq,I>>T± NjĕdiwNQpDS6lCqDrY3iR憥 Œm6_{ ;/Kx)Oa6W@xj|^f, B-Wr^P"@%u遹3b2D$?vVI Vj Zj IM/'i dܙ Fh)9wʰ};͇m4B/"w\D%{ E-p@d!DPfkॺ8ett| ,E6Yi-C'F'Gg6q#Ye;'M@xrRۙS}=ΰQD-W j2Sg׹j7!,c!ٻempDD4 S?}aT P3H@7nߴV71F~JX}I2[ !"r=8f%%0}4UTVllh^LJuZ_ܜᠽjV$*k(ȟY3LzGfS3ic{'P7'(TG 3Zs@I+|3@UIP4JgP_.n#fxG2i+\GK'q6acآ ̚peAWf4:kM G &0_0  &s䃠3 6(,P@{! nĐ\]<4$-~ P< N Z'쥻D(Q)_a`(Ox@cSql:&3\8in]f:@rMP"?;G8LxĈ"eL $D:mjr $9s8K8f&.aq=?TȚLI1z("-)kzFi [)[|r);]B)JdHΚJsɴm@!zw[JYp<ߘ۵b'^/]/BɜDbfNhh |1BTSy?`:4ܘ}*&n?XVQaFvd7q1f\Y1DF<7Ăq8TsOLD:R\*+d&e$Z$b7Hd[xbO;6Kؿ 'p2Y .fcƃH 02 pOάm" K,zhE).BBK(RҞM=Nlj΄[_̅g}^gOӐJYj9\Er )h>A^]^a$Z-> {Þ7c:/?tEh[|tzh\/m؇*+BFi}kd3֏‡"7OI[bLIʤ` 1#9B4,B^ly4J>~0Q\>,iCtml-$^Fh*.{+_D,C wk(P/ m!MϻA:l&[ӴFQb4NRX M[cxs)hUZpy2*>D#"1pؖ$`9r(Msml/JHRtImV$/AR"B]i pw!iBL)wNpC91Hn'Il`D`Z˱sa05A0U5K҆Pzi^_CDqo jY~|sw'3bm&93@ʐ~̚LN:u:TcbE.`xk-*>SݹM\MˬO 7]4J[ S(r ٿkltP~;Ѹ[yz&?9}2d']$qm̐Î)?u4VۥPp: fƳ|ڇvI}(8ny~hnEm[Yݘw5[?QXVJŸn+Jw&h.K$!Rg2 CK"E N%fd<8Iǧ=tR@Lz h.(i ?ϧQL_άm#Iq)Q Eǎ Ҵ@Eq>E"Ip-ْ#K־p%;{Hg?}ao}ZK[jPx"zCVNn=~nsX*WRtz0|}5:?6i lru=Ja9G;%EfAc$JnY ;ҧ:$aIQ_9 +w?BcvS"سحiEisEo0h '۩Æf Xhf] w~GG)+Fݻ;w7ai4Es+o请߮v#*̔3|ou)P$ $_ʵBm1Ni<ztL Coh gR)hvϓ_84e_l&盦!2yEz vh0)(ֲL #YmERdx)+U°[;+FY>ς8Eک5 !# Ж㱹f^"j>Yu[LiNB&'|u K27\ O*eA .ع#" qln!lv>8I^<;֡3|"?[>&\3U)pnr`]Xܻcy>$p:J_UI{V çCwQ*_]rFL+'q:b1/N t)>9@i_pߟYclk+]>Dv*E!I# Qum<$h$kf["%P.؃׎oYJ[&IB7FS.dƴuMl[?_ԛvIm e[7F6\-} ٪'wuep"1ʲas2 m^,j[/ߞjŸlU ZӼ;MnB=E!](! Ysf eYv4&"J6q&"Y $!ka9=3/kb<5 urX,v;ݻP[|k.Q& ԬB"^wt^ug<e8E\P7TUϞ[* "BH¥\P8f-iV>Q&TBt"Eۛ[u,e/ת!Bf$,W+FIu1N"vHYF %Uma$_]ÝM/ 3r:Ջ|` 0oZM;e2HY0EQ|3 #o3Ƿ9b#uw;]~*EH^;IIjێ,$<`bVh詥 A6,wYAPIϖ4ϕH`VOSh6KQ,'$HqUIkuh r$fa(ZxDA _ۿC/h6[exLf8Ad.el%r8_N/EqHIccLt&y5L<4Ďcvl0`\uP=;=}+iίvqgM!QYU*43#E G-_q1Cc(맯JJeeiJԝ9M(H5g9*5Fdq{s;MA5aO[-U ϓ4ٳ,مQaK6 +"lj"RZH Rba\_ڐED *9ZZQUvI* 8T\E l!Yv{ yW!Xt|RL jFxc!B+HǛa}ӵFճ3 ;P %#`8>^~C \&?Fmk; vqVN )̘D:MDlJa~ҟz|keۻO'Qo4Q!Ap׹iT1&cgCa>BGD[ @ਠb! >tj z={!_*lvvoYEm[^H}|rqŀ@nYOu0PS9И0 >ͦKg1d?JYz D"?bl� YK9E~󠠔wIcO'V`2[cgڀ h}NQo;2[3d4K]f *%ݓSToN kasgOyZZv'ɰJ oppL mEJ~ ޟj.kO߯!W:V+GUnFW")(p`0߮5sN Z-j>R1͓\:CD?=9*| 1ESPʡ !^iP>}2Gtxe#0W_tca2qt3,]θoNZc zn̮F#]3 :6FH"^fsi"~}!('vμM!>#mdy@`BBamZuTҴ]L] --MӵMip`c|>&~_yh@ٴP@Ԛ;A1Ad†z(p*wԇӏ@9QX,xnң ?a(a1s#|3Sfs|' d0: T8+^vL4,p5[ #J@J{3&ҐsYO} VM׊|ܶ }!(dy{zQ~OzTA)c6_<1Ǔ|xwu]֪d_!-͙iI1iM.oAa£9<œn;~W+&RGn޺Lxn8&5l=XdNS۳ kũ;b>7XБxXu&T ' .R퇗?fhϳ#=y)W\jlt8]0  8z\vN}hNz1Shڊ%%I7t]{U4b27K* ,S\Z zUֶkOڳ ZhҢ@ U4gfwTih9Y%Wmڍ{?KɐcmNL,U*/7fnb2%b3 ",jzw{>He(b) ~o Ψ(9>48(\6fYkt`'pw_. -5q{ KTmvL }=3}KstH&Rh!W߮Z޾iF`6%o!:,KԠ~( 1 †0D!a,DY*Yݬ}-PDz uC)~Jl&$<UK%#0Cn;`=}"3^ΛoبfȖR3Եc9hUmN0UL7w= 7Ã8)!Pr=#(_K)C5 4³[`\]jqw|b=2|pa^kfI uI:U0BxFH $%x 1Bi0 +WE[w<8Ga8n5/.Ǫ*r {֘:6# bP~:~(%ܚfFaʃ{}ݛr\fٺd(V89"/rߌONR:3{j!ՅֈdZMKZהI)"&r82Sk9ZR'FSZt|#v\d.f}1kB*vs:utIP=܄i\_% `l,)D[ wfawr_ ["!jpIXՙoכ3o 4b"C1d0,UاII"p`isS($hG:Uhz7?VR,Qku3B-ߕ{:OBKB) 0r `8 "A\: .LK64D2k|*5 p\xyaw gYIMX,5㵵ݫO" C ~ܦ0=^DZgqIf: ,:PHsH*Bf63ǎ[lnċ_,Kwtgʗm4M15$4 zwU=tkJj\u/kƭ /q`K)q,!(|Tsg%G@ϟlmsl?F x4ӏ?{PK Y|u`2&Xl\1Pl.AS g,K7kW4EkT4iLO3 k 4 ȥ) %3|1v\؅&%"nYYQ%bf8FmИ4Ʒߜ~bZ.Jn&LJ' 0={hTCJoTZў6BqH|ZM`5gfqCCݨiCIt+n_at^Kem5K&75_b&Υ23Xp Mgb ϲ,⛙EiZD2'晀D xP}!Mhx\<킮O1CJF&24@; VdjÂ(1o‡-fDMV0r`F@P".Tub\`Q]ny&#2J+*,1Z o刂 , bB'q}cb季DY˱;Wۇۻ[QFfɐ/;;D@ø\Nm[z5# NFI&:w|mDrTg֨ d4ņwV5u1oZ(OI.Sǻ]UʄGDH.hy|xx|Z>;a8%IP[Ew龪R\_\>^g|EeJҙbRVֻ1{>6!gOQ3h ovBn8VKjvWM>+]426 {<98IM}}xS4'm簏<IO)uw馉"`9n/?(~[0]Rޗ?ZػJI9E,¤"1Ŝx(Fte;RXnHk5}b0zh0H4$9yNI]M_c Ib-aaK ,dB1u (%4}Dpx4kNdo|=L^5&ٹ>;[PԄ@=B[Wn5- o$뭺^nJӶv `8i_3IIqYlE+HBh%zms=a0d |!xDa$}73ӂPp}  㹺 wR[yc'x53UiʭaxެegU)98MFs ÝJ;H" i1v+4yXhN}2@oc*AQkX.,Wmֻ ]'މHbdaਮ/&JjYݭm[wu+KfrRm?>%"sSZ)~iK^G,<(I9izʳI>< A!YJ)+lȖ ǐȟsG;/'$Ci[Gg,%4A V!WONs:m?tmU)[)t_w_v38ʂkx4wBׇn仁Ka,m X\w=Ӧ YY74gk?MJRv IVK=kcAIZrVqlZ`K$JQ4_/hЬFdŀy UUjm'32''p$nm3| ]b'qDx-yyvA myZDs:fd5[cG6ɹRs]WژV!_~7ǁpVlgmtskaٓjFɰb !;!fbކ, ,3`494"a8Ǟ'(,"7P9;Qaɭ@]9r`ex^i8s'܍)Fc>X\zw['rTmYSs&JFub$~z\Q+6_&bW"Υ׿zi$cbVVjscNlM`'(89=Ӆvr7Sծ5I!}B,l@AxvRD;? 'cjq:|8!g9.9OaNGQd1zqĖ>cRQ)Տ7[DX|Molw[Ibx/分bA(}~?٦ Hj@A`vZqL{~JP1wXdn8㩜h>Ʀma/GgڝaBBccI:m|9=ޓ4$6^EHuO;};ǰuQU*y4lr(^N1\ҦUQGY䊭B"Տ&FUeJ$ 2=yG.W_L?=eml͗A "O!TF]J[g_y=x,?1vЌaBk?h(׻ן+8}w)a#1{:#i֮H0w gp0#,p%^L=ۓ(& aB KA+i) *+9PV!g Wkr"Sךܶ+ 8W%i n(J-7)~kn"Y6eY6yެ5_/>.ep^E۽*n"R)x_ߍۺܘ}&R# ίoF.@~ P͎CROi|@V`{j :>9:% rKnoC8!S(8cFY/fHH<-73@ fL+7&V`59)K9@8E^1m{,ժJ"H6T`g$jAy"ˋKryYQ9o x[nxzkcg!,$ٸsfӉV78?hx,o8IV%[,=B 9oׁ6(htM6A @љ|7jq}4,ےeKcds=/9ex<h ľp@zUߏ{/y3> ځxoM_09H@y(ڄgxfi2|gYS샍x-臾Pg'2"uxNBFgB]7ov%WE%-GYO)􉂼zo4g1GR]k C'0"Fx,pjH4D^=ׅ`IZU0JqeJ* 8Xkl+W˷Zj>Pa$A L&| 'u EGGIjYX}Q\ǐq"-5 WEb$G7*NRV w[EL8%ߚzp ڗj4b?"knwʠB S!&@A8\p"0,;Lo%cvC۬c"n9 M:x&ENzV& =&r*W; âk $IOO뷕nvYk,ԩqEkgnxu:C(Szz(Ur3Z'NKd<,2SZ5o @љmaNqX-).@{Y\hQ7Iֱ$R*-Y")J[@9a*93B#5nu ~'[*JP E~f,!LaŠ2Xr#χ5* Z'i]" KCU1(+Ib9j|yC Tv I q DY2]Y_\筂'^eG -i0U(m8@ԏ?!ElYgd4U_+]2%V@ą֛0SQi"oD?|:$D"MswG7KhM r(<^bŷx]zmeWMBq{=g N D -qͽEU ('*G B͈rU֛4iޒvV,r{>2:\z-@uXW$6t;!gPh:JnS7Fᰪw־y}YIG$,]L2Vs+)c(C0(%KSo$:\' ܡc ݚf)x9cߑ=-#?\(!U}e8F p.\>by(4A2pd\ tg2v%.kg_l}4=$DՒ_'@`.79/N9jaG'ؘN$O,BH@s4La 1b%A{mi}k?vHB۲P)b9FJ LٮX\rmLm,(1t>^uc`*T^pޜ2Ȉy,:Ϥ+2`I8B,Y֬g$1ͰuT̎Gc;q!w6nA–e4B7G Tqc{+EBeW{{ߞOJ !\_4=6/8?!%ajutxr|N@xG^-*oߝqTi8Na.TQ^ S>^~߈t 4nO/柬"IT nu Utĥw/@5溬L.m`ϟoS]-ѴodkF_M(Hx (C DGd$C+b(K'GPYIl͛˦vL*&>twx, acۏcfju"iC۫ix@jw|+}uKbw vGqSҪj^R Ƒ~ DG!tV+b od U&β<,%XCS`Iޟ>Y-]ꕹ\I} /+6Ϋn\JP"Јa̗|^Tl]ol1>9;AfYv χ`$ {$/LkiP` # pNq!) j%HtfeU(L" hsS[,S 얎"5 )C>Kb$9q<@Hm?U!$@am1\}cF,&FFpxbk&VhHXϺW[A a\}47X|$\h!'@D)Vn86>#~1K?c-x&)Sp9p-Ge< }+ь&5hwa \# f/!jRND)ST&j a'dzĚHdOT3uW>] sx5XY4 $Vj9Rh_SjPkO+/ . QB|*em6Z: Qw78GIpٸ`LJvzD*֧wDX:F8erZŽrN>.:5d>)-AgExH2a7mrRVc&8+ݹs{p(1)1}19CHWVٟ[ઠL>n%uSae6zh-Q \!>5k<7,",=Ńl9 턈aD]Ն8!E% 9m֞0,)h1[\9ϕ5l&ܤ|b в-aA#HwT)!(0SJHFzMw_ ϒĻ7g@(")}Hɨjc WUIR gMe_}¢hR {x8[Vt _={+}ze0+JU>,vT>YP㷟߼7l_7V7_ +t{?zAЉLǑӏj\]{#4tL78 _`a$InzZ/n?ڪRd@HH16}tf4}iKR&#GP֡DebW! ) bhN?]v83(2'L' <_-SxwWgW oCFF}[nYyGTvE3( 9GUxѴ/O\1ozm r)͂LrڀT׍˻- ao 4TEXv.$ 5Cgf+*l;<]*E{f˥|dPfrBeP<ӮB#o.'7.[fW+}ʫa#jr9&;U' /_LdᓁjQ^k Zy:IH㬆#CpG{R(\)LL5B,Z8f>_ /HQ$-4WRF@ڞGV:ukaH/RM[W`՟użƍu}8BZ6Go|)XX10"PF%p#e/bbݓJmt);^_7",`8pY)! TDZ{_:y=8TCCl8% q'35[{Bxy{C`*r]7l uٲl\n)$8}|# s-`;!8~4:\N3մt$:;#l5AO)s93y5#m1pxӷ6znԜ"W \)rKjN $2uĉPBȴ֚2ȫkcb(b ^|,x>>lcu|(H3mn 8 n@eَMڤuhg2zGbI;cˇÖ@3yvS~*~W?o8B,hB1',l‗8Q39P6cN `]-F 24I.jEUTc?[sB$ 3zaNHTD @4 EևWR,ɚT+&wO_9yK`U6RVVDٙڟU,}ؾj䥜9w8aCA$B(9e"K`s4p> #Arf{\*\89 5NB&c(|s"hNQ0͒{2 Ph>̆#a,ƚTQ) BclHYIH fO|n.ó4:2ZwKp:&z\_}+ @d/OzB1 <b{z-B"w` I5F(چ1"C% G웳d[ۊaolۍK} ITRCû+hsqxUʋEx'!cȺ J.aɤi0Eў(فj,(n*ZA,!ZIKo#}WApzW CD P:1TD& c7HtBkufY]KgGn-EIVu+i2=%cp*]ʖA/E,lȺLGdUp4tClT ɽ"Amkĵ-!uGGG@q x?7q[OwGy-mvL}b'Iv{yxylk?u!/-))kզY81o\v!ՂTt|մ7tcu)A9H#C_w>-:YMmz3I))1/TTTxQ/_LEC#8aj".[`ȍ4(A,/%)W_̰]_=HITdO,o,p50A' ٰiˊq= #m]#ܲ獬3+ui. űտtf:Y&m`ll0I]BK/ZF~93Ws/6Gg$&(l h LDQS JەsG'۵JV(pP[VJ"˰ qi:Q̲, 4 (f 8à7'~ym;*S˓c8 F`HD] h[o 'o>Cɐ,tH rp9RG>yz "<#UZ ;J9ptWA@ҶȒNu;\DsEOrɡ:MgBƲzǵ;$~9y@HM_l\TBڲuC;`P7~hx7 ߝ feI `u1WLEE'˻ۏAO=XsK!`Yis$ F,'?JW9H4ƎeoSOǣQ2rPWgIpvB(\ia@$F(JXE4_dsT&pJ8 RܝoXRÝGtBY KPfJ@^aءTZfdE4M$u@Ȼ_E?%8؁{1eh)n=Ebe"%`&[LN r,Vo}~y1eX^]"OYG|1`qC>Bf+ a2*]퍭8Ḻi&x@9/UeC">uAlc1K b˚ϮכͭzA%U a亾c{‚M ٥~H̅nXVIGb92 UAV7nn~C|xڞ8bYxCM5 hXؙe(e$PI,x{?BJx%MQa,nh^5[B*ǫ^;<rRS˰sCA@lhjo ϲL zi9+gD/xEA$c??^4׺>1 4D~vα=¡UaIasφI𷋗~.V"jp#tMz ${ԗ7;m=zvPB UH{~`p8Z+n<1~yHh7VSJ $TU9kWYvFtQ/x^\!#=4PT"=O]7޼""&_WOO]"MP59z0NPf崁zazF*a 7_yi%#.__MsTͽMv;Nw '3N;3[ ѹ6mEo؎8$M4iR h6iФmīH)-}WN|u}$7CdzW%8OOFX_Y|; RmZ Xs1Nq\`wp 0/t uŲ/`>$P'X"Ζ<~QHFasnE|=~쇉iG8,P$9CPN2 X]~@PVB6LC"q90zTeTt݅䐧~5ҲVF={}Bbnfk0Jʉ̓"Hl*]S8% _h+\UcvLlT\]x&PM䬾Ze9z fHjq,+) hQRMlp3)#ç.ωe`oVhS痓ٵoZAӅ$JDNxg%&٬(߬{/gW_O"n` >cw.ÜHM/|/6/9%S"VX%qBP/\(c}I\3&zZi桪9rr 2>D.IaGBCo^E.xIYOq<- S bBl6A ߧ7 L AoX P'=ӷfUѹZczLImFQT.ߍ¨Rr263)#i 5M74BPTQ(<%LrϦR@]De*$.3Mk>ig |K)7a#=+5@XId:qH3t/TUiy(LQЋ*SVIâp?˃g{^Y炨e!I@)Nݩm%hr5v|N. Iֻfd?4F+RA?k^^$#*2_X0.\Ղ%PFZJE(%sbP C, 2K `xAJ(sbH%6q4BP lS5mA]ϩVю}>~Ӎ}\7^6]ny"-u]!ԡ՟vqڪg k3k>b"6g ;F8ghj ׋qgB Y" xr~{8}]I˜H6j&є5g{m3̗ 8&~]U8Hz>2TKt(=ʫDV{' =EMO/^~0;Ơ;(^3w}%vjF.^aERh\8 u%Dict=cƻ+Exa9;YU"qeY?=:{7}S'гLmjԟD^i5͊@[2to6W~_ U!HGaBmxpjh 6u QO,$[Ѝ*)3{0i٫,Jij셡j2t@dQ(CyR\}5$K T$IԺ<8Y:ngi5o>߼T=2h4ZaB/vszآ:aph{N@q5z?֘ѝh8ؗ kH $wcᏣ~mn~JA7O#"J@soukoT}DZM[[[iB-B x146iغ%Mo۱8WN'8>yw|'OU^xЧOG[kmLbD Q Ay hSIF%@[T[{;+Uĺe^+j[7]UL$ `AϠ):݆\j*Csں8N܏4K?t|B>u0*=YatnY0~n6vhd=Gb$p4@|apD>xC?jÀ- * ӊ$ )?A΁TrdFl,clj3B%Ltگ<˝9遺r%xT9g4+Ua@8KSP%AQU`DN&:UpGSd[P/PyOqVgi 8je<=>;B1ܖZ]Ex3'v ̅ȵlؖjktukq\_nBʼnPZ|ռ JrC]Q*{_~u;?oW+PC*=,5OC!+o~2?>7 = r0!HFw걟$n /i-_nd2Cqś<>;9Y6Aa1 y {<;>|Zez.aF$i3Xdw;R %kZPtMRi[$g `nھ hHlPx.+vdZhj 57nL9/nטIۓՍ~hxg`FTLN|zzџzaaR)n؜&c!7FʿFQp-w]vo>EIII>Og!6JР/?wR.k88j.DBr$@"&~b),/"?bgAwjC͝E9T^o͍ f41Վih:,)\X)/HAoLn_CMRfXR3o> K ^+WqTN)B&"խFAPL`P51 2E$Y A o")SC#9V0Rr-9@A (&,M|[;5Dc0Zyerx]+hL06A.H{N/MIчG]_LudзmU*>хQy&/?<:rKPAd>=C"$v/H­J3ɤCk0^{tw6k2`h fHnYTo$MG(hnF$%dSV35l:$G 6ݓ]7c$z7kpnWͮ|ū탵N$+K?)p42zw5I,i5L-`{`H/I4iSngK7eNY^Ciʄvx|?Pҫ9M%.'N fVْ^ӱ;D>!+EU_ɗ v'$醨[Y:)Җusy ]`nrW\$7lNIM),HIkhFR`c{LdWFBomw@dMT5Ի⺂K(Jb\=Yqp~wn:u^;<4uq6- 9U\ {!ܥXK[h:gP4@ZlȀը9Iy˄.  vBH8o`YsWӀI *+ p`p0Dl RX7ZW2f7gtVzso/^(J/6F̟|> ~Y:f ˔[keo_^b)`\(LJIvv:Y^^\OoŘN) #o͹}qߎPt&mahXq6qP-KhO=آh dAf;ek(DaGwb~ ?x!fIQtqo2l c&9Z`Vjp.I5c\cwzv./Dv- 9E]Yrr$_ \^~8K|"U\"sDԔ(,Q|e#K1/S H38׭֍l X~/0EBBdqdEQ}삥8rOt]o kc1$>rWuV5,+4z 9Oy|Woo(t0|7-Ra}=qex^]D B;pVV0AnV Jd+"]4su QŔ׈%tPd4y{A{B8|'a;AUA<0R!׭5gMЀvT|#t:uiI2;p2߾%s{u]ool#qGwӖ=W5tMYy0vN a^r哢ZVy.63Y%> X4 Fq\L pPYrz'kL궬(<](^k?Sj1YHYpq0^!9x<3@suŒQpp׹9y|(PYleu7yf29zQL ڍ& ʡn7@%@ F kzFM+NE'жʍƝ`KO~Q g'T8E⮛3[*}dȆ묚)RyrVld7>??#Djr(2Jް{qs_GlS7ar{յHrjPCYֈ%\6. 6H&.]E*/Eg۶Ea7wIX&h_Ewݒ xؖlIEY r0`pP.Ȓ.7ɚ!ȊRY.~ZF4NipH 4b34'#Ks()?}yy}^o4Lt^kuHi*1[:Y`KjȆjiF"׋{?|~ڂ]*q01+Zu7Ja?sp(p)nrlZ2"&``X(M]!wיjw? شȏ%Xb@e.TˢÈ884&z}0糇ޕדy˯w6a!`d?;0WY\0krqK9|8ۯe4K>\|E5 B:gbٍvoy_D,"̃)Ku*B9ZYЙzf6L|Q, I%CgNko#v]ȔԛAݘrY$^ܰy΀ӕHOB{b3?ՂeAuIw7 O&aiRʤJIȿ/]8ieYd7Wf܈-2T۵d33&(ۨ'l4̂ CW`u:'^}Gg7\ɂo*P%/4gs;"AuEq30i%!£@ Bv gVŲlԙOrCJ 0gi |ɬ1˱ wUj}ߵhE1 ـ wMOC[C <:1pTuRl޾1Ax([Cyol ,y{'EwB>u77Kq*桛9)0aj6@!5K7^OV5bʬh]ڽX-,11C$G/9* k2UiWZ<-@$R pRV(c( ptfSQqbY,N%2 !_$!H3vʴi6x8 K+_}W14E "&,W[IrC*) rų}[[Kbh#mIrv]`1-XCCT(Qx._ ; @wDk J: t@lwah Bh8\X: \G7&x?.}3|zXBV=GHs0Tݱ^C>U`22vƫM#\ɘ7Un"flK[miׇ?!ʒ+>A}B'J%p31DL$k?L懛u'Ega# 3n;Ntl]w"MxHc` Bs/8zs.O 2ch;=M؈bY/) s)S@I j뇇.OK7?w>`P"n(\Wxf9Y C0$&iT qʅfeU}=T#VjqhN c|ac_E^J'6߫5svqtwQq+ɇo{a\6q`R D)Tzݽ/!g3l q t[I+“x'jh+17^yw)n q?$~Dfheju OñLW8?u=Xz<ƦV$cڦyWbk١RwTA gܿؔͅHfp!Ųl!,1rr/}b؝A6rxhcL9\9'R!]k?>{-ЙМr\դQ&]yܪ6jhԉdP|;P xҡ玖L4}8d+bJ[2$S/6L.O"dTEEns"#ri\<-sx&#oJ*J厛mC0qvrPwrYէlN ua88LyiVYwRֿh]9etH])*5AA݄M1p:bk/q֊GĄxH;8"i1{f Z.YxuA\d09d x}z\wi$7"dEHd\.uЏ@@ >]FRa%'ee(C R^",C9Yd/o |oX6 ?é1q]lWo<~e)#Oh> CpP yOV՗_}q3Z*Xhkڰ "֏s'lGrD,dḒwzu|iI^r1ȱ;ߝy7׻f t|ύ (zy'<4tA.'ӳS EéxR87rS$N`hm]QFu! GRaܟQ*k*'qMicz|?314o ҘFQPte=j[Qƻ16`f3 3 Iٔ/}i>ZUj5Q:  xz+K-GS>h ҨY>o˳zcZy^>JaF4ʲ<_K 1+-oWt|e}h ZQ檞E <Zb,|<'amC='HJ8nLhP`OAuU+0GfS89;9Boc$oY4IGbJ, c{˜nė*,QڪEݿ4KۍLIW8LP$(s_9õlʚc; Zl#0{@`wBAMTUb|bKGUZ'V:|xodGXc N带#'8gsl,lolW-%bR " eNx$hfDڐw$yɶ}蘎CԙƨZ52@{3IjQ~4~\HCqȿU7%&Ovן3u)խy 5run34]75z[uFPo۩w‡ۉGx"y…=;1fo:;Rz;N`%b+J±8`"1T>ʰK%'2{Y) QTvgXt`( 6%lUʵJdabܠbZ|u pd_a8ǕA5Ate/QGJ(0j/[oDUJ,*;efLh $Q+Qř2{?klȪ7(A~ bgXiջ(ﰐɝ="|×F_\SpPlfY_A?t'o Mu wc|WK}}aQFIR<|\ f$^{(iV[uZA+Ze,%Jձ 2R!.RJ3D4([`|`0zlǭ8+J9c‘Bi:xκTJ\;P`:=Y,x*>$ފ^ @K͇X>FY.9"WhzGmF>~}fB.cŸfo_O9`H. "_}I+J+x ~|loIzTW $mp^]&lz b%AtB|OD}嗋?7jo~{k<0tkwh{X/;H`1:a$is hlqLW>:hr0Cj⦩v=M}`h}7P-*o޼;^H4ACT973̥Dx~ɳӊRCpdp~@z/8eZg"DZV74D `tC7Ac j ! axxzy!J-7׋?==i4YKPV/Z$}q"WUd4fh(Փ3d8SB5VZ5YrlV,jr(%އfd29 Y<+ f ׊&'1K7X&rkE*TnhKX3eXkZI|ڏ[GË82_tzXa1zLE*EɺWO{Z/>[ D, #¥resFnB4NK|ѳh:$j'ZP$rRU,)V !E)s{BaLAaz|kyqfR!-T_ŧw#v7c<Ǘ 3cF 5Ja0 tZ;, *!HzNr\zP#~(ZbYǰZcXfJ7w"8n?LYlNR3ld`\ ^-,ATO$Vbxm:|vKq6PlEc^E-GMXG//o~经C/bmuF1|d8͆xЊ,OAhzs=MB( 92BFu~P%}sPpude0pmk="C *G]H|{"Oa 3F ؖɓ|ogi/_fUizܦ0=vvlgOFd)J)Bp@SeT4dʼn+_%-g;Ngq\ 0VGI-N8ޮ'RMYgܕyI!(,v֠^_~GO/=h$QXJ7P^+0Lqg%E1 㪅ۭt+=Зzͤp\.ֈn<ˋJ=#EpN^9S^8&*k3PS=}͋ {=g(>M3U*F=ZB@Ac$qLЏ4@f0F ՝\r?ڿb>94);ȂEIx?RCAB#{\&xMv'_/A$[}e>Ƙ 9:?PTh  Ek!C.vA?Ibjuq!'ǨmkknxJJ=on EfjV+zpI@'hevٲ>_tg΢!lM"M1DH̆\z+Dܵ9F3{^454 ba>]Ghj/VJ n'w[禤Tz9==y/H&#}1 ]H'@<_]O;;VEyTk:y ? ޝrCpI`$u$f$)#w֝^lI$Fٯ7 ]>(c,9>:*!o}x1LfV,*IZS;Sӻ7YP)O}$_˹wz tPs bUeY( GR("UOʹ`93Љ@=LG@&$ZIrt?s!~T}))?$/=ةrgbY 7uaރ 7if-}|RV3nӊ8H4%9-$msNk}]&='ck4 $1;\wrgYh̦B띜4Cip̰QIM48vβ( *JzY~~'QYݺJCx8&yz|HN6_Dέe$X+WAùDh ~AO A`zpԍcDWah%%mC(Q,_深I"bT}Axh(v;ܬt]>(YYת*ŕgE٘ SGTniivA(-LXfrt} O]~u^ȭZ3 8=2Bp7aerxB5lnDw=8ܝ Y{gdn̋yϜ\M>5.nDS,d̩8 01pE8&E#hdv Dr> looGh<5GݤZ[bL^exsw[S!`>@xqp=Du4!Q@p xEM˲uva96OS0f:/~>|.u8qww~I qtNVB )Krۧѭ}}.H(V A@!y\djʀʭ`}Vۋ_9ɲ̻MBOozcw9R<y?z@(uj+OUEPPo (Ta61d>&v_ Zt˅G`Z*+M?'u[8ƩJB%51M *sUE-Yp^C^z- /45'$].DVz!yJ47Y*\xPEQS}*R5g``| #ANAbpfCFwqY8fd:ɕN, r?]9-hb12=41f fEHoob+ #Kj5ʢG9w0 "WHx2tJT.Hj9b=[&K;u../>M҆!'0co58O,l\\1Cg"E&"{ 0f"5Z]oW7hH F_MDPWs{ysm;ΉP]3Zr J!/4YPEփ?{GL{0̾-6^xLR;OhJ*MtTLd8qĀ1f77t9}ˋג0~n|G,s)RV}E1.ѹd3S_Vi FW8bYWipF $jy~֫tZ.*tPd _@+T4r޿7ݕ,l`}6 =Ru&2zN$J- VHI spew E|}Nvr [U&E#beUU$K覦TڈWH?,OEז8̲٥^y91]L;m '`3mBA'c^ڮC"XLN@SROBZ@Q@SӛM1'>8 N5$Q5:JKyO0c ~vX˼a)1b"!^@ +mT ݄eE(.}.vۦ^N f8Z(U]ΩNu;nZR/G]Bhz ח^RZixtvχDxr}]y>~)YEzsN_{.#R>z73ESie!XFJTrO'\$Öf/g9[Mt}rM˹ `,3'$gwFWzw{JftSf? ǝ=_;J8F}^X|A8TiUKeQFuOԷJcx_ksHЮ,ٵY˰;vh=jo$NOr11ls)bמjnxS޾|o-nRih$jVya"b9GK|H{~0^ 9A!dxKjIF/ 1fLMNeteGi`X/ 4gEIsJ6\jh g[gpC GJVRKI@0EI^VR]FH$0"esoEm(0E' L/o Ag Vc |A(V,}|{G''e:I#)'6e1a!0H]šFbMx=2B_7h ZUh5&ro}wr|Xץ5x3dZ|Y?7ցjI?>0=w7gY4ՉBY}S3|NSt{{WT< wNRt *04Ci f1ij#! '+0B%toԙc%s* r,DOēdh ue}bl*bpг;vJC=8O D~W*"`={ LI(* ɫo_UQ.&hj죭\8sԽnjW>O1R] NՄB"8f&ϧra``0=].I2Rn`Nj)/] pH%R=z@>^چulYݏqAܑ;j7 |ص#'EL:Fab6PFV4y*^)2+|0׃qӐ2YNiX;s6nh2%*OO%W3kx^5w/ʍZǩq7&hJr,/+ О\U}a|]i8VF@y^9HJ\vs9ۏ=8^nkBWF̈\Ѷ>q5nwdGfzpEdq~ gw!r%N|b5/EgFzMꐫImiBP7B> UI$Mĉk{}`'̼ gƫ[1ݍC>_c)c?5z.gexպA*Q7xWJ;>N62Y-W6gg$/shmAyBr`8 z$qڛz8jPF? ]^xHX#[B@R؝mM*1Sk4YHe2$Ҧ5}%%;hB&d+۱ﷵC [[yTȔ^A`1l>64- !lfB3TЌQ0jN c7bWUޞ3XfXF5no7<fӏ/GF"NiIP"GH)",xpȍЌRJ!"wҴ8 1*( ͞VY'N3kB* X6wE1"fT'rW/=z2NtCO!frxwppqD-_7O׃\º|Vk2)Bu*|LuKUv=A,$vF& 1oFy(RDd;AMPo=r!i4vٲK6e&MvNp7ߏ؝/٥1 vXCj߇CDj@ =4A$vfSRy&'{ONxs'$U.%JXHp}Sw?BV5-kf# N.IqPAT(asR29b(($Qks b!d5:cU4CU|ߋX3fqIť;[O6X_.IxZ6Tڃ/DU0y,~ yB؀LfX$LV5;uSVM2, +Gm琮!o$Kε -YinDe0(U-@gӹKҴH ݚ[WuXc,`zFx1-ӌ SvYGn96i76ermO*ȖgOb'*}ionj =F193 Gm íϳc \sp[$I=ુqwpὝ-h MA( bHr,6Zpl}VA?~_a bZgNQE?O>cA¼3 @(tȏ,ȱ,EQ @MV0 !m^mВV] 覢;s7R;W* l |#k4x%*jlچ1z7K£ŧ)D}DvfUf5w=ͼԍ$*ĺ^baNԑTd}Qu*I[R3q<nt̂h0h%QXd FQDo,AWɓZD7/AkAeUg1vu4;5AC7Vg{PF?qAaT!_{2ZF{9Ǫ?܂D˽v)X³HP3j+]"rd+зl V!!DUǶkMƧ*ym_ƚGC;( Su>??Za%. u;k}&rll AX]=ŭ~TujNũP#}t}>ڐ6вTzz`9c%qZh]WoVH"!ɒ8vݤME-^s>}考6H=j;=(QܛT..^sA RW^vss(,\_>;|40b*"AE\ 鑮" ]O}c aKBǵbEO~'''3DJV9gHדU%PA]@" 025X= m1o2ۜo'1x+NRjje`8IEΝ2^t;!ʏ>{<6gg@7/A/d. Iӵv>2*#W׫?9+,eXJET sCK5JvׁH Pd]l)^/\ԛE5>X؏l(4#stPߎnە78U42E8ϱ @Rֿ+Q9hZ+',<^ޖB?کhNnk$sN]ńm>,?x5z*k< N szaRj ur\[d4D5K9h Ye2NsVpX I63q%Mɋ,Ÿ$͐@CKmuzz}x?~!uvYP$rKrR7K_ܒUˢ}_z(ښUe%3ZM-_ cIvNfR 6BUl.^_2Z"kZؓ;D>qWٝ}ƼM1Ͻ  4q(sδz?^4CwÉڻP14,Y0,HrEIxnTmz9 82͓w77WhR5}[ՍǝN1OR5(tZJKj)ص̧ RCdh: W֪[*hh@EER{??:φõ}%K}||?Ǔp\$Tr߾Jf]ɪ)3S*I+H^J,U+̺5gzY&|M }+:iE4P4/E<{pI/Xv=fd6DKN p%ģxӻ ׫]P|3_G;OkD]3gE6 TGt~V!_4_ ?r}|zt71 )oXs1؎8$mI5R#Uy?yR'M4q8mvlf109ܛ:BDKmn@$ggߘ,I Coq6˲\AnSχoM Έ\AQVh̬Nu4RiA@[,N$UAJv ""EB2T)1KIlbFBI'Y`9I GJLU LL#I^nB0l.g_$J xLz8:Ge). %%q|-T}lM=*EDi-<y yoGu1/`r,ݽu&%02N,HMYB)^\Owk'y MOK*6߽yۖ7jL,A}+žFDLH| !(![?<^mwʢ-TCKsb l߆WX)˚XglțS])BV$֟gcEqmH \f(TX8Q5#b]|^[*alņ, =u(6!&vz_G+hݾ98Cv= B* [vòtxEy ˆdfp, һu+VruC}D{=[1A1 2yo_?5O޳bA&(@,R0@Mh" r3<#2k.T/L830ׁ!]]|RCGFLT1g-1cͶEk*酡+T?\F Kzwjs@:8A'swM:rilq \\~}%efguz(q?=)N5OLI-\u>-FYn1_|r [VS#B AJ` L̝)+A O6&s*\^\`10I`R @+Fl:[crFȚV>!S1PH u^B=8mԥ hrC1焃ʋ2 G O }"6@S7??ߘY!*0k̟F[NkXw?h+ǩΧ,V3knڊ͖Œ/Yp L[KA_O}`v2B q%vlNj,/}qug=͹~ꮯכBmW'ng.Ȏt9hI`lԲ.jqzeswrӚwBʩSzAEQ(6A#2DN<H]0`8+Ib,#Po{Tؔ-kJ`yn~纞$J/h̅!D*=8{:NB @9SgmQ2GHGMal[1TgO6Y[ERY=TW2Aw}P.:Wcw4΄\g!%xG CLϾt y܁dF R^P w_zv 2a@<.33Ó;4Do>tcXLBd_4|>N}oP1]z+*!+b18@!E @C1a4;\ pE[V p ʨ^]Fz ߼x.^UGrȻ]wzh%B:B+L ptfM[Q.K.[vb;pJ}LaaLbI־ZkwCwEBwZr] \]9[MT\~k'Cb YhHfsR5lk@7NdFnxUjYIRdRQ%V @@!:YGKkw}g/1[]DI4pt}|o 6Z+S/UTZ~~M"v:pEy~y^E9 uw&!* $"'8sh"v6/n7/\zfq"^wnFulj(^<!ՔT'qFwvf$R4R{1/2$a4@ȈcU2/' MtoV%7"C8\cxaAء*׭HpU+A 1S.IUUQݳ^ uNZS{|239jh1}θYy|2 /7iռqtx๦ekTD r-$}:\tk$=vӬ} |)Iu-G< ސȒZ] t&xC 8Ȭz;9@~~oE#ȶG녽j^Lj*v- bo)Đ+rӬJF:0ΏMYT}Jb# wYmtJFlP1p8]\Kƹ7vvy"YAPa8ݰR -ifVhd(U=mdjmN?>KVn8xinLvmXs<~{>8NY)A;S.:ZHANxE©k{>|>,~'S>ZU~>-oaJSdXꊢԲswFzxW5۳?a}Lv֌~o+1V]J YLq biit뺎k߯l*g6 F ρ| )H ' UU4t;ӭM ZvΩ,`&OάM3 B6[XvL;ɤ83M㦉Qdɒ# BMEp9˃vvbd19;:P'c<$EkmkDsh |^`lYy jY<ɷ4'پ5RSbbc〆zV}4BpEAڿG/J__ghZF8'$\QR8jF*WΖV@ēFXwz-uiE( оzs驓U&)Bu8#}*}t,)Djl<1}&BI܅=M&`Nk~-[Nċp{PXMbT*t.E$Tq X~051Wf{W0MGjFt*-~3QZE[1%gf.R>#K8OY )^]ZP}ӀB`ϋZeK لw|:nPOua"HL-k{(DN6ͰsC]تA.e2M#˴ ݜ.'jk:{=r"#'s}q.Y{@ c$Z\jQP-t9G DJI26.Nkj;_&@l, l OD.ee. >[6>O7G/<#hefRY6 "cc7U%-[;dXo7UBP-ZTrg9]֯x`G6AXr(2U`RmZEȵkD n eMs LL$f祤KQP)+_PȱkR,3A9s| ,ęL8D'Eg۶NIqnYԻ'[$[CV EҦIڠmQȎeYE%q_;z'@`Cr°Do:8334 [j,P] B?._LS_FLVjU #d>]%tY5-&DgMYtyٷ;' lbYe w(Gc$.66 GztxtCH Yö7Pb@qDVNiKŻQ]I2C)4C-adQi7PzZGYesӵu#U:ּ#B)N"Yc[W4PpqM"K, )#E D`eZRN|]hNb'RL %bzc[Ra c%EDxTC*5W&ĤJ! 3KqftLy͉_\( 松y3<Fd9 &rtw0 d,'\_hIEF}K$N-=gj#I,H8gOEb9c Aiȶk(&U&J|n9WȜyo10;2-XupyEԨ[z}W>nvqzX8TmTsuY6BfY$ 2DLk;y1[2WK?<0W^cGCף&ea y~ jS <ևVz Bf RI?:l6p"$f5qRz 3`kPԅr.q6w>v=2P̮3$BX$d0tZW>ڤĔ}cy WY HBT=~{G\eo7:6\#R/m x g $1Pb2CC$`?:.*A`ϔ*tD( ">wEFP.NjFdh,綫|uw1Tbz~s2WӀDR S0?>79/ t3y7x +r"Y[҃ҵw~~L?loP1}qUˬ)vza7 ,b f~jÇ 5<8.p &?`w`.#? $;a+V͚ݾ#`@IkB¦ Ӭ)!XK*i6nPr}0]ͷ= dTZUb0BIiyA.t޾W UZp9MY$gOTB48^J ^?~ MJCbe׋Ovt'q h0&FRKp+X1].RS%Q=Ӵ )A)rlY'd@vlX0hX4=8zq~f70WTkD/j-dڵnG8dT2`SGqHLyYψmВñ8 0G¡2$s*'8H~|/w.^kJևAYC14pl HdD~ȑ|Ud,) AbK}Ż6vR۲',=' EݛKcu(pxFRyd&Iz\ƀ۷[)ЅWh0ɋbx:v+;Mlaσ<< 67Ug=[~0קDܬ+wCeE?Ӡ]z}EehL wPD}yF=x5,`7(pl¶92_>h="|oa1&,},#l ,GNja|䄄YSm}.vA,"}"RRDQ4HJ1iԴl /Ƅ EAo2AO*_u7ޯ?Nݷ蠌 6^tt+$Pkap˃]l귺k}C `3jtTV? d3Ա(A!|?+UA|GJ4*x@zI'ǩc $NB]oT攥j<^Yty~0L^1UQ$a0q`,>MgMJm-slD\MϽN6M>|kmß]$P'o6z`3mֽl2U x޼ĐL st۷ MORw8O+E-k5ԕ /{{+s%l op"WK[RXW]Bk咺Typ7~IHDD))fI"F&Pr]]^y,2Rc`4?)tX^rx]փl5~ %Ӻjq.2S9K(RvK\ɎǚDqp+]}/X4z.-pK`9 vg,bG:1mv] R9 N-+R態3tIi"W})(ɚ,"Gl3K$H'mpE—UYmWgױ;soʽn4WJ,TEW3%ߟܻ񗋫k =,-rv.%tz7ϔ8R$j\3bLiuTg~R(c||Ԓt vryQj]æQ#IQpo:!9Š0=nIv82;0 |IBqdmۊ0)NqjS&eYÎ1;i >5p8^IlmQg@>lTc91 (vS?O E8*%|"5FKl/Yh[)4BPlvҗƈDK"@ёڝwẢ-y㌎iEX0hl f 6%}8B-nVeF,VS.(eտLh,mq|xEa<,󦾝md U(ɚN7P̣(W^@xHZKl1OhP$ڟ͖|V \! !b0 &2wDnk.vXq`e0 뻢 Q$?LVز KW;I @w{qȲL[;怦A%@!3T٧7@\$bqj D`ő^NRS^0*`1(}=y=/"g.\ȻFyòl }$C^Y8\=r (A(/U$Kd?hYEtdh̕`ZaS1JM\Fy:砜@J#DN};;=i"r;y%ﳵ߬T۰IĀ$0絎暠W/IV,]TD 1ScpQ!PJK@J,ǃ8r"V%\2ó$FETaq2 QdiG(14Рl_<'Dv}{}׽ sBqn6l*Wʵ*+ 'a{u1ϖ'BIT+ yeqتxݷ_"h'Ǎ˱2SgN!Y!VHyۼxhOU_okhvT`͗o/xKӤ*JJ3ސ<#U+ŋ1 GkYr5 0AA( S'gR=q3_"Dj[xN2_&k8O Et&+뇫>~DaaE,3na E-` љ6'Ea"1&Y'ӓNwMejNqAEe/T].y u^N!2%UTP &=Nݠq.ȢFQ*fq *UK*,-m S 9y~}sE/e \Rzb(Չ=ݩKcHI<5DMp(r?^ l\p(MT:^X0PMN<,(ke cad\ى12W!2Mci9,$~;$UJI@0#סiͭ_(u毽}Z%~#Q:x_?nU*Dݧ: `S('jEV4t:m08cς 8&TԋE-EVA#S.!Ҁyu t&]w/ή G-3K%蹫Y' R4-I2nGqc>!V8|6=r :܊qcW-ll A,iSnV]ۉ|y\* )3TK5.V[QQ ! v=?i60kH$ {6 Eb$)z yuA|)֙;./0u'.ővXJR8.ju8CFLݏ;k14UWc0k0*[&NJGǫ_o߼@m^,ҩUzrq|7OP #fsJшx#pO>\&6=n3CIg`b?sZ'է?I?TDuէj* nXĮ7\C=iQ==o<o'q2fY? Pf|mq7N^\jۋk&hdˡ5֖9skVAkoĊ$Hmla`Y "´ 2tR} '|JXY F" Tr8ؾml 3jGKm1T&3LouU##ɸx^kp;6'1M8Ě\+ey5ȜyDo~zw_4M,ºy4Fa0o6(ûŌn\"d;I&,E 'nzmp;R^}WsVo]zR9R%2"I%]T9vPpŠQGv_[n?d3BĮxM̥$ H- ,Gjþ~Yn_u"Wت;-[)SFYu1q,Bi k}+ JVI\]qP*e |蘙كZQR5 |/_.- {xɹBEtLS4熎mFi7p8<>9m:u;@1<<\oo:FI x~ s\O)Nuz"ji?.=TU2" ](^ 6 EAbY~g8et!;hlR 9g W;OQ шJ>^?~jo5@IDH5p#tPVEٰU NWJlZ&?כ (2B9'1'C^^o^Y4r4"3KGZ)"gvfy|9Wl8&4Kq.: Ri⨵cjތv?ݙ75Ļ$$NGSD j&ϞWϋLp!-&a?]N̾%[d(r7,IYʥo(i{:8\DM8{e/aHE(Qʏ_RKMC;Ӄrl{|: F)\1p3gR߯հ7dv/Azc}qvxz6(}'lٖm9&A@4H@hZE$ [XlYe}rQ@s>KpoOLh_;sz`y}*m(Ęi >d×o_];{EW/j[raeeDuO%?.rh%hϗ( saϸ lTˊY6[Ukoo=Άڶyar@Aۇ`{*\nl{$`uCX}oHblZ 6h!\>h4.:|^Ȕ "HQ8۽.R|͂`0"9nbMǠO"rwbl,ScS:7 Vww#Q 1|v~y"ATYTc KyZ"y}s]`0fAn#u3m$˂(辎q^%hcMä!./DeH§9G; ).M +1MꟵN*Ͳ?s,h1eՙ7 $BH3 WCP`ї?04j[J%$tG'W2 T02(j!\eV˶hBM 5lD 1%4ȡ7c ~)b(.{zHT͹ՇWy'fCAO䇓3\<%sd0J9kz2G#%'#^;M|~9`8 z |Y4IgRRCyÜO yODŽ8>qHQ\/Kbҵ<cWeͶ?:4 M hCb<7I6̗o\'XGFMq㓏GD^8~p0.ni- Gm56^>o"AqV\yQйmq&S}uzAE<_Q:I#!op:!k7T&NKL.qz=o&JP.WhO=Np$rJ2f(ڻNҹRrp=}QIx YH=b\VpNpn V*5S-usk_lZԓ`Z2|\ %j㳳1rzoRrѽ$%.vXAJ53bfZ(Y0@d; fqgsA抒bqC rEΧe\HJ)4H:F&?[BTnQz(0<{>zڻI4iK҂B_" QmZ m؉k{]{dz;7{g. ^ } TTx.L/L={qw7dԠLå@UM\o޸o_M3.mۓ=3]RE4,ڀë׏Oc3ZQ~2O Te,,q`}'|1m7AW=<@lbr $zqbUZf?2 Ǩ/LS 7 #p$ ]Y_ULV/z !f!")$ok$ t.40 !8i D X5_~uomxdyknU*!KDbU ]nk0DU0܂xQxܘN`,_̭q(8BE*;~4zRAvaGN39Brc/AhJKgЌ*WVfj|W}wF6C ZRLHlB_=5jlg&9k6_8׽̅'%7JuM2:q&[E"- s-RϮΝ؉L *UmMYyxDiTSf!48` &8fϖh,0jDAO7`чw6 HR {yU.elUwy^U[R<nlN6kR\Vk[u&~I<-kSm==LS($NGAӃl 0q[Tʒ(Qt *c|[z|'6^׮tb')Ŧ- 5f\#B|[C+t:( @~jǺ?O" %ߙw@^dY$"X-$)"('Y͊X0LHٽ{{|θ$ZZI"X_<{aww f6}hBPRݜB rt sLǛ:b a5P.* gE2) %iWڅbV5^\Oȉ8&C˵A?6(Ñz "1[Q_1)ep$I9+tAq'V@1J7  ?˒흭ÜP8ZIjsRJ۝>! ϭ|)/tЙ^Yi}0mo0yҝ'?p*\3Ma1G}5^%Y*Q<`VdLqU%P*{$bj\,Ѣ2qxXr0k6\Tie!ѪOXLE>r %*cH_x`#Q\굷baF_f ^x0k(`wL#/11-)XraRQ o6qﭕ6,#1&FsbYXX93^(d T#-UA] ׽)Kv~KE;ok18ep0 'i0;vl=k7{T̠4S͠ӫ_>9<-`k7h_}LEvlBo`{k_~Bbܵ/W:k 7N[LH_^# @ý1;_UTԌ 8{q FQNRDP%P:\痋s$6 Q,wnO4Fnb*˖9i[#6ͨi34B[׿_=W +Fި? I4Xv6K9R z$YnjH",Kr$x6jY9(4"5JۻfϹ,O;yΚR+~DT؈j\(m7\eHժsJdYoc[^/Hx"W%ɎwЩRMNado㰡]8$W2ʓ k ;ZX%D$)@J /J_yJNlꚥ.&r\Ft:$fgһ^IdIK,)cԀm8E8u5d|TA9/ܬ|R ]nBelj^dqb!\4Ȑ?Zy4 ˲D7)a~QШUA+ ud\ `yY5<; >sM#?{n꾽赾99:H7,`t85)ӵ:/.ur?wV/O+7f` J!nb-f M P",VϏvwl3LBǸ)&Ȝ%yRFDtnAwm (Y1UK)V be ϯճ aȈ2B~,sl)D F$+Mȋ鲸u=" žn{`TNGq'gO:븻"|'\Zl0E%qĊ8e;;BjNt/q1YPiB QkηˤF)ra UX/ 4Mq`-Q^F3mԊ0c6x-$E;~h?tZU3IQI$ `8syWsџ%6nݭ~A 0嵽V+U*#9 "MltPS?=9֔+s=-_ Țq&7<)ꇉp;J/$i֌/f^ivH k@p1Uvi LJ=,竁ug./WŁu'Izz?Z~ |hUD^n Ժj[Pyea5 - 6Qz WW*iPt]\V+*h@9j隣o|C F@7fC֋) soSE*J23,Q$Z#L5"/sm^Z_ )ݷ9 V5*=de(uOAwgXĵc/)"*< 0w6T]?|;ڪigWjM97%aB!dWC}~PaC7vZ3eYćK;0b4zN!]Mz^p`)~@B;I#:Gs~xΣĿ{,O *\e9lw]7 U'qMqA?wมԎ-KrP哃 gn3yҪ-p;Da 2cn-Xs2pji[42SB NDFZmH%cBꇓI',Jer&jzx|2sM+#( `mK*b4m|ñlәfv[B胉Mu 3m8cxH"uؖ"74.мh49Y'EQ"-"E/@`i, -EC2Ip~zO{> +êB(A%i߽Y"/ގq!]4]lڵz:'Zƃd6v0îҸ^aXAvIG>e~-tVQ2#`az+3iE$AJe'1̯'7qsZbѧ0N$'2"b$a($JmW5?t(O5yA6 pbJJGٶ{V`49BfDs Qа֪ 'sU2<i7`}߃iau$ %(J⅑3O*]$>_>!P|z΢aY #"$PyiFnKQ33QjtqM4 "̿KdCN{fDļZ.|*6Rkxgx=)59gԱ{)UXMw\nnGָ6HG3"idȋ49F6yiv \th@T*ݤQjyBxJh 8xSC"-WKbp&>'͂N@MӉaA4YdJUuQ?j5u^+,ÙѬTP)!MTHITR[BfK`2s'@3y."PEr}#-SW8/^\&g,H?&d=W X.ʌ/'/njh*LǷ_P+%(nD'4pg:F[܎pP$bPTGq}n |`p&$Ej*y m.'89^*r038@8ٞ Ue`mg8[ڸ"TU#ȴ:j, :MJԊb@X.ǞM{Zb%Fle,AcoV4NֲZns(;ꏘh/>mpv;L5dc1^L$T >%Hq@+?pIP!,r|E(7%!?$mi<_.J j{X?)I)mO+"mjGw&A|YV ng S@+B2# , &KOׇtC8_N <[OdUp֐Tg 95)F7}y)=QFQH`a}Q]P1:Qrzped"("S5p!KRi(~Dg u6U37Q)ժzjx`ޖJ;/ADm(ȖkR" A%.I'ض-8r`^R^YvCzK3W?Ip ?BkUDbxV$P;C~h?k/7ꩊ-s{TV8_9NKr\&}e6(*K|z{azLMuazfA!qpLK_ jPtfmQ&I(D-e9v;\yC @E.Q,[JZ}O{3C{"𵵞VnB1EytaC|Jk[VG|$q00yC *CD/ԫZ&d^ ˘ 2ෟ=}}1'𣤷3n9 6RچR4elm^C)eΓkd7Yn 8{$J5fGeFxF\xbb^~ĸP$#9! p7Nt$.O)ӠBBD !B!_fĬ7ЉqDZ |@9^mAG.>nO\U~:=i> WIPp?HEz̺kwcOiݵÌ㒼٣,i^!!a>VVKů`*@,.Bm8˾g)~/Zq"~T( d؟U1&>yV =Sl :T3MOqj*(q!($tذY?|``Sh+1_K<Ö 9(b<n6$*20Bۍ9[*?ɟakqJz^IVd0ؙX&6 "raZ*Mu:[]Rrx5dd*-szo(lVQtM,+β m 9lbkc14ӾnTj> |dFN@8tA.짅7/2qcB|mg땱6B["rW~M sM n !BI4Ku7iҾo6Mj&U]תͭn_xy~ǯ΋]/(LG۟ 9;AC4d P;zmKyAY 7Sc+J/ )lJCD f'Ks;n?=9la M#54sXKAq-0#U"? B&7i;ښM0K<(t ;L|6W`Y;G_|\Jo2  <u8k.$IAq837rFa%_5ՃaXhHd2_8;8Hv4S1"ikh50|ߝA‘-#. %ijbHh3EU2[!Iz{) is4zw.2BZO];_$2Mm Stu۹Lv+ag+K@,HV ٮ E72-HDn^rusY+$):vs^<受l)vv  { @љ6n`-)JeIeh4@ߠXH&-mڒZEuQEξ1|a0$04A vodiBLRu+'r9#±z^/O8'[t(hOۅ1 yW@߿NIZc˿x=DXW'utF,!FjIy'l2n7GՊ*Ďsc961^NgěAx"GYE^뺷[X0KwVٹ2V Qck A!e(rȷ)iZSGPC~~wDﲴ6g 8<]>'B2(Vvjxg82y0'AnAtrqsI8OCrh53w{3Mi?K⵿[rd-$. @/)N981zZ)܍ `;g ;ch"$W&I VnñߏzB_oUNtl%~QWt"E^4ӠA?B-` $tg k hMl}]FT`fBVkv5-".XvCy(He2`1-!nݞyN}\޾;dvE(,t<qH;x8z?,҅*u{vf] *~G_|!b,MmۓN/Gg۶Ea.Qd-%۱N-<C> :M9bG %Q;E2:*09;w;80>L*ˆ,H7NCu7 )9hx4&7BMďvk٣N]Rb:Z)W)LZ|{dbs$!FĴl&(" /.h!Oǖ) X(drf9D]re1r4yJydpGg~_#,%Qi`C%JPq?8;IAj6SSbsd{!ei@*ʚmy.Y GAXUi;94/o+mR qQ#,Rule t:2rE$4!$ o/:|MX$>@ l`VQ!Z`P%g ZK0Il\$(" -ח~ޏzbe`0`HFC(WdGP)p#r aYCMQp pM&L]?Ӵ̚^CnMhVT*Lb7ari>sapsaw?(F0`dV)6k3\~Vm[]>[/ϟ<{xjOȇ"*dQa,( YftV1 }^R`jbZvgqwY"%˼z?8HAD`paz]R%QHL/UZߒE ¦ihE Lz۶(Q-RIIdYEMn]uH[i\϶lId΃8ʒ;{9Ż[ԖEg h#Hh2,H zûueH},F#<n{lIfZX0{u{_|3flWoA?10dLU-z2wTGD(Tk/8^+2SP {"pogh7ڀn 1X$ Dkר؉ʫr}]Z.AΆX e3ݛΖU+^Rp8LT7hsF@]ǑA(E3 N*J%P)8!mA Bx9|&y=2p1&hኴڑ&Ad>%gN}I7X2cDd<<:xrS K"Hvi4o0r{P]i31!i>&6XrUm1T$_} xϞml"-.79ufL^^XT 0)B/"HF[ gcgBGu5HoABʦ'GG vxq! ;Zl·o)]" jU*mʗ5 j$ 4BE@;YV4[ͭmS7+]_ HڣUbK~b~RP!^?ۊvGs=9x[*+<ZD(eQNd|zKQjUH0V׷WCNu;5d\M4G3/\5@<jZ;/?'?|l=p^cSǟ~O/9ZpuOvuG c& {>g`+D^fW7u͝T2UWyum'&$Ɍzmn-Nw߆v:gPR Sm/Eg֝a-h@K0ll5dO/GoIۤI8Y h^}/Q0E6^nT!/1e <i ЧJl<^Dc];@6e|ezu~`Gfܰ %PHMoƵJeos{3R%p ,&|/S~{>˃Xg75D<$v hge4ņk)B´\ MU2q P N 쓧KDvT$~a6vfͣ;=@42-3 0RI[s%YS4hGYiiaLJ2?Y}'ߤ"]a ViЫ= qb͵n$I ɇ4sCwP؋gjNQ|ŤX1Se\'Y 8Jb4(%1|@^|ǛAg2LXz0BR˲R6cIH % ԃp5@Pw 6dpS(nr]ɐbM(xǘC5u+ t25}QuXHeF )zT@(Z h)k:H۟I$wX킠SA*"~? <ƂMIUFtY%Xl-uwHB0÷@)'酱@ц'9&xOѐV8‹^d(fk"'2hrw 0s:aU ?JR;S_Sd/Wk|q s֔v[{){ SŬ湒΁eZOz}T=?axڈ E_6+MTM}Fp=QX,Shh8GmBUuS%ĮFbeVaGoLHˡT_o^3}X^~;Ixm` ]992*T˖x6ɸ3MΛ.A4#;Rp`2O ˅ٵ:N`9oZQ~ꙊӇW ]aUrY ¡"HYnA/h 55e+#%PX-.bA0?K.RD% 3œ9/`BY݌)w|6%1]1Nvq^vT5+9aT‚ے,T|q,w?>;;QV54I'ԟo>ף{U(1\xY nd+hM_$ɿ=|c[xdHjQ޵}KrOR;S䩲Qx;P℅cB,PuIEfǧ ,Yn,x/jACq050B~1Z*ऐcL׶*zUKI2CIO|%I&Gq&Ov2Ylw;zE+w32s}$)qzps{m<\tneR1yk8:ƭ( IJe5rdZl.f @0 :6.))$.y*E|hg1 ʨ<" >~vk˫[cB({D=# a0.=P4ԬEG ૥qaB5ءЁe&*X<'/|r^9rG%ࢄBA.5 ZB+Шi$]뚩.9J,4LXZY4 !4Fsmni.uwwx3ә6ІLe H5J6 sʳ@sYFhT~ CϧBh?U]-=d ,FeieBJsG++†^2y^ow)YQ$7VNY,vC gR:Y5-w\b HdI.*;UI\-|CQ3/ Y {s}6K(MuA;l>kxeh ,oVHn&xy p>JQD>YYk2V+3X/r1XV1=.7VCP [n ͈Hamhj)4CkB@j>q'88+\9C-'.M$*I`Eo? j4Va>M4:wΘwl̇Ǿtv;޼ޙmaI1% Qh;~rYeBa1*t&[;@ oUv\/"?Z+3(YéM[ I΀!G ǩmq24{ Itkt~ٜS͠ϯ~blݧ. Ap2D܆"N,WT?8yt8ʺ.[ܗhA}K+*muoc1$ 'iz"~b:c5&yeizxMCt$eʹݟ@oYy2?CPA)+Nj?8:0 ccxa؆@ft4JZ5RԪUۋ&Q& ̰lcc /?X"mh,x$S:B`0/g<$j,4IM>N(aZo 4y& ȇ@/L'O[o߂#yP! > __BvIs4qw|8@RDqfg.Njcn{~y~\^B00]zN--eJcu%E` %CKVQ4a4\] D"ERn53SERI@(Tit$Yh\+9z|`}N!4͊ A%^#/ =JD%GTY!ϱ3 1eA;C`嚈Hpn⍵i<7\Rx5$Bgϋ(бMq&+MKt)Z\-sl *Χؿ2+{(ېf{r r޹@yUy׶/o8x;_,vN-twV=QZEDm+ژҝ kӴirXFg@KI` ^ɒH+EY:ZL$Y³,aJ65՗ݾL"H` ۉ;Bun'Tr}7Aۓ76J0B3f&O4V$r8< Z* m4mƠ(dJSl$8{֟vJ8U%4,j)!]fwn|wlp5Z4E y<mt\v@\_xt^>򹧇'2n޿e+whw*œ )]mcnR`QԔG~qdaxy{w_(q|;x*#h~@/ !c|J߇77 KK 4tSV>,:tĠ.U8?]{U vϋ!; OP$2'DVgcGǕ0~>zѿLm8y0c6޾={J YBtP bo8*Fc{F-!I$cAs20|s{!bۢ4`МZriZy0!=-e' |, iTc!õ$cRC!̚XM:#0pO_S")j8 fyE!9 ?wj)RzZNJ l%8k,+_=}O9hf6jU( MWJQdL3Lw'xG>}_AI=ͺ Lr1  6erZҹ lf'/]0]ٛ"4繖qB h'x(wN߮ctKt 9V, T/ I.rzyTlsP,J0ۦ;uF 1bSۗY9Њ mUX:/ݾ9eycfFq6ZC =Dq~J(bG،EA5]>!ӛfh \'"*$(< kh9 i;&X`xqQ d<~S]uEqZ)-$/ww͉z po.Htu#Wm\4TڠՌF"BZ׌uVy`>%~q? 젙oH>B {ggg˕E_c+.O yg/ZeUY)",ktϛvR 5 Y^[)Ԇj*b7_֣SI΋^9DR[1YLjG,lk1 'EWܦǁ径ٲ1M;i2ˉ;-KB.<10Y}n=V&9PgYX2+xYRWmR8k.=>iJ)XP~xlGci@exa,TK ?#iJ՛frWAM?K` 95ijOS3@/zaoot^jO:oCPtyI mM퍪?= 7\!z[DADWmʱy`Yի;1wƹX`p U^[l<CWB`$2Ix\(-2V[K.ɓ<.t.#N!WGQUa q7bcE(Y=#jf!p,r9fnvEQ%fl#YMmPyd^F]ȶHuwlsظ68<9xZ^{BaɤHREoЫv E@bE$+.{~P×Nj9`a ñ[|1Y YߺS7dYZ~fU,ø $g \`IL0ಪaXA8t*5‡r$ ENh ep Iwr*o( @JI`a:LL8Qorh{Cm]Y] | N3$Y[j"hmZo*3|X @~Z12SA1 8gc{7-+-ki0@up3LK9p~7R7Hl%DsheZ-lthff2]io@n}wo>b6" Eq ,͵mэkuaEqk:쌦j~cԗۓba>?kjA:/e1OZ`,ىM!,`uHq㠻>oL..'k}tnoAfQk ZgHժo:*Dnz$IUeP0*!y(q( aseP,*WuU HDcyzꋿ*%\faG &2t+*BˊCԴTJu؈MS{^uF́\?zHS^x`8hgwI%/Gga1`؞%iL4ҟ]_*E*v:Y:,^0xl6\]y\KW ar4+#MRa20t(/ f47Ap8 A؉z%r~e:5 QEjٿvcg@kmqbXϠh2o9GѓC4 VeEG~}3?Dj4$"ѼHfS֙@Ë"(~;l~tx jh m6#4]Er gbuXoBFUb 6 4I}ד%21o{5]c((P,@K8L: ^fWA;oҜȰ4B ;]zue[l&h{A:%q',|GXw؎*0u}h~ۅ0zJJxe*\7Ƣ":%'#,nlKFh9. zSo5,Er6D0/Eccʼ cIЎ܉{ -Tr1~ձ6`IbOP']-hx* ʸHkiZ*G+Z8͔I@weO W=9-s@2;6Pḇl~U+n/IU;9M+<& 1J G?需ɻvuxJR% E_jY.N8Aui5w HYL`s뷟/>dz!4(^Z&h )Ek!50<Thw`3{;RWx 'kiJOB;"]YW3e_߹q 1P-țэ0/Ƌl5|xyG-Y-{kV7_qū ZNvr7' O:gPJբV+:,?Ȇ>yq0N ,ètLDXQ"y7&i&h? ~TupkX19laPWX"E*DP+uiEQ.Oq@hfS,q`8ˆ/UysQ,:z %֐DzB\FX)Us9r^q"/J \7Hzϗ>'ûѥqv|u[^QA Z +/Gg6q{ۙ8$)E |$>'HH( 3@'Iɾ'G?{!v# rw g~[vޟ_όW_l=mˎl2 -̢Io~A8yZ0mz8l= 7+:À8B H @7ŦTe9@])3M]%fCh>l]lEĚ]g ,:5'w+[vf^4Zv#DeDK$2qcE8?}iv<*\"'I'L<Ƈl"Y/":BFg(ҔȋlƒldXq3Rr8zܻ/R *]!r" ic8RY΋\,Y+(ENͺp~ESS|>Y-fX}.t YHRJS֪z8ĵ,h&I8"vٸtnũ$u\$Qݩ"2;ժbU ݖxlf̝͆iyQyOHY]kVʲn2&vGdf.&SՆ41۵s4"Oﯺ^vP)t2ONZ`*:Z)zbƊL/R~oL"!L48D)O?~k>'j a@YAl]@f* $F{h\V#AIЫKZT EٳOgEŮj^c=N y ^( -KmĢlwcn~sb0V- ޸l%R8Ia 8Gx6N{c]S'_"=oJ*?^!q+$mA_mp E2X8Fb0}DisVA6,!KdN.L_dM캉X"Yd ws80Ǔk -$˭:W۟=VsZr_+2&D';XP$zc8QT2p춢$,BuoSUXl Gr?^ߙ Fg g<ij~ -؄lFv pWB#!7L^M5!!TU$T,F~MU,h6p%(`ԮuAj|(˥Mo]ؒb.eMU"4G 0vT:qHUz2\%Ipʖ{{RbD4li2AQXi|(A\zcتAR1-hʕU%|`RjX;ؔlf%38P7 _Ƨ $vT6y"URla.]!HEA'n6<@|ӝWw^m pEP$-x}jm`[0R7,>>}?K]^(E|U:xwʬopah:8 8|rݰL{XC0H"1%aYd""к熓O H{/0Fx>ǎ*ENyp  U\s1O X H^Ċ[8A H}xQb RAX_hO>/VOw|*\acIċ%Ry1^H$n$Dtz"G4vw "MzE$ F1NIZP@zO\ [o7|VSpx/D.o6wW>V8T,X 2fV"I5>=ݘ1ͷf3cNNB܇^sôta7Ng޾noIlH#[쵿L?gLog=6Kjfw7Ka; L˗r8Kqxjd ĹX)Of؎' gd=.{wO;˳ܪ4I&ݟa |P> oے#֗"$J8"3w?<Գ[#y1Qc )D)IERhQ2Pq<5*|O4PSP666ƺ ~L_cЖ @r:Y8C1?3mes^eXQi0]$$B;-p+.*B W͗sklkVj)>͜WogGi+_σ 'Uyl$>@|HѰ"(V%Ppz]wN%>J%ƋIi%S\Fu%m7I] k=SN±3F`|U__Nsf/RZ} Jq /Co_F'"IOUo3b>'0 Bhlߌ}KSjIܫmN3o.ߟ:F'Lk# t%QA⧆γ< aK;i}ӆ tS 4.CEJE'prQ 3B"+Gyt8AI 6skA">kSp&Y]T{;^GIqƿ|(VE.mqh>7q'O}oSja΂,,< C M^lEVjUmQ 8`:rf}s7Aܬ3cV2_VKs]wڿa=_:Vs=u$:#S)x%Z>xI]0wֿEZt,7Ǘ)(dq7s&maCawz|1u?=L!5::vŮ㤥C +O {2MZzd /骮0Z-T"Tr,G8a@pg)hYM-gŊMÓcƝ;,w1FP.4! 0"aXK05LZzFF)$&{g T-ji$AFW2 5%N^9K8PfܝsX^[vtc}RFH8(oʹ+u&?@Ч`q":AqRf7t JФЏr5Mck3sBxP- 9Dhp:hlYr;ǔ6-%UX6D޳~`[R?A&hLRd5cAd*Vn(q%V(HL I%jn "al--~@6b$֤*@)sfx{خ+8! >v# :- a޹$D_?+Ŀ$dzճ ,|ƶUHqZ{L`TE0 (/2,&7မ=YLD%82/o (pΟO{߁1't={:0[Cbs/uw !G89xuYTf {EA_w_YH۝쏣 v`BLېh(pP^D1x6Bh;׻&W/^zNpwm "+Bqz_swIJ\GjKw$,ji* =ci18OLV' to `ܜ'H9+fnC4EkI_/d)"1|qEq'MA0ӿ{7\T}vwmQ]0,;}Jj@ZM\ (DXK;Z`O4zu&$pZ$@{ HmAD3_ɴJ;IRV (9dLEVx}F#8.2ral1n ,Jkwe/''*ѡ06b'Xm!-mQ0~oO~1R/O3*hT% f 4EQ%%5ʪTPXU4 ]Ɋ*U/GW֝v!$,'NӞ&'y[ۿܧ>di8ccL0 +zЙ}w4s/L=dQ뉙tDzUikuY)a4l'u1PGѧgכҏyw"mW7W@ԚO,Ӳ~{/Oo狹j?9?30pH'|[zG dF1s3SA]NԢhmA0. AYx10u,504R%7#,O=$\|||:!R2_\E)TFˌJE:ި6uz C;tUQ䂄$cDt ΅5(x,8$PؾS߭E~2<p< Vc1Lm=YU;X3$zpV&] q*y^5‚NVT*DDWFP6zIKvm߱MS6<+cV`C9 mn̖kPI"#k}sBեT.V)J^mMiDi^x6F{6t=Yfk#ԙ%ro^|j$K(R_'xV%t^f<\%ʁ$ˤye2*'PȘaq9gy Y@Jc3#ò@q3c ٥`R5eeokOD|o<" Q[**ŶROBΑ%ʻHEɢn.<8rPS$2GHRdVD7,txx?Ͳ4KScAjZMO/͕yuﶻf q(r6C7xƥ b9<&ʅJ8FU) eİdႽ1aI@bݍQKj 3EWd61SV6C4HzTF y(6g#vdBrlIAAmHopE.JڀUe&cb M{ᮠCc S1"(zq;z9Zp|y:<&*ȘfqO$ ou TWwQ_ `[ I9C v֍ڰPe.E`@~7 АW<$z6(})HmeVb)"CQEѷ4QS;v"k$˒)$"?!0w9ߐsYvfnqq eCb{]VfP 9ii}q|;nW J NB{Wq>だ{Q㈡ixcZMTKWOVs6)ҷcGkMf|.+2ʠovoLـI$ W,D^A0t@wO^N _tc6QU,ւ 9ǣYHz ""DFnڍFh<7XU, d9hv&u׬еؠRεvC\VawlUܒnN.L@t\X} >(1CwrIU)It\@1[](gpd<:Xae[ʭqɽ׷y2+tG >o+ ]C sxvAt(b^e\5C—'qy݋.JOb[ž WP]`C%F !h mFp8D34{sD'DXHۍVgy~T% zo-R}rzN:X$YNt. ܾ~fVd7O&Y'6TX<Ψӣ.CE)Hla~JD*P-vd*A&ti˲x}+"qpX@Yj:ۛ.?ü2Z(*:U,))%?~؄q qd븶f¸;;A {@OԼ+8Xʂ\*@wmحߝ/gk_7:'K[}&>fl- M\kᅮT&b|:w]{|~9je|=M{WNʷ=$ib0xf)YϠa3$쀣 N/Gg֤Q]mUIvٕIwJ@hO?ֽD_K[ЏW&AJ d nhal upIÅO|=zJ|y.ɩ?-ȉXI6ߠP6 3DUru6[M4إ'OD#%Aٙ{[X#<'b{@45Y} @,P#@PS#( ϳ|2.Mm2)3fۖ^GgL^}1Xꖺ[:OWa Hr97NXUQRiAk+pG^8|tc_tG{^óĿ?*xп\ngNTSdyGVcZ@^ҕxmD4Մ’["\sյIJEVIs\O`dgM,!p)6*1>@ 0 :4S+Z* ӧ"ՐzTˉ|/~oZ jÓ?x=ccOW8 A+0XNك(!bpSX<; Nw p**LCd'W >6H\ C0E 6r&so~=m E3w%M=Oti@Chh7*| sUQ C~Uʼn, @K% :Vh3`J=$)0H Mc}tST!^BC̡Ӑ+09WU|$dFw ɟ"KQzy3,˵2=իUL{ ;fcL@dV 57k%r%OJ[/u+6R\HR EufBW `~1.@!'( (XXYiAa)%aχ_֩ \ PZo2˃A}N|\ 0Tz#VT(۷I $4QnنEt̝swggzjza$x]BY -Yb`ԳiJ)]h~L{@͝;۩%kp~.ݙQ!# a R,1,n!q4۸ʰ ,p{:וO]St _p֨*'wjEBR Spq_QBax/i~z:~͛q5P̞Ӷ8}ABbX;)>d&Cп:L;t,HI}]z9}wJx=1ȕrظ)WJ*߼{-j߹ߍ7 yN)L7T*niq E6CsXbRBÑcZ |X\]zOn Tnud2T԰ ,U)㱦+glSl2OwOD$2gjB=ڰyQc:JΙHdBNV.$J&Ysc:=G%=0 wfTr }!jW$y{~DBs:5-Dj adog ho(y=Ȭ0݃8K|&%x{o( ~Y$M{g4ao4*:8^>O[4L}+eEbI2_WfdZ%c7 J7vx C!6h %-xmi•z>nwuQ1.e?qVJ0upN vH#hM9 ˜H2!4&fgI""`g8NPS8i 1 gO?؉}-@r(\[R$Øt36t#"%t:]cDFbRo>ooX"*IRBϣ #4Ci|zY+&c\^2:ty">DJ(Dw:jq,OUEeqVߘL5Fx×<_fAҨ6qOX<.re6Ob(]/]BDnH\yG4 )kmHS#"TMURlߞۋ=pCRBg,n~{g#34/v >=܀>xb4z 8hf{c&Rd*-jhG=Ĭ6Kjb:]}S(gH7;eEVQBg050= 8y @0KFff=p.Q+* yJS'0&\U^MLRy>}A"97RM,lMgӝn88 7|2;ۿS8YsT/fq&q[()傁 `~m)J;4dq;*YX:-i9yHaE n+CH:m'0,}F6XyggqD|E_^*718zzT:._NC0)f$+stAҐ'i2u}fL p+!x6+ ƺ {jbUaaGf29&# (R#mjBP.€N1]Dس'(ԋg@aq/co3<@ "k,a/x|7wKGhtv{RC:a$ - ZZe(\]vL,5ߪ4ȂLAL)+{i48IQcAX =K';iw^Wa xݘiى@TU҂̲8cw8+dZ:Ըj `#"k(+dt 5pCp8Ӫ6i6Eo-dr_ݠ?_0)oܕߣ lES'qM+M+{g>0J-00$!\/E%X-7p#bMB_b*^ Y;|4%)n @CENAcv)"Bb9f 8?;ĂܓՖuw> `K|Sn:k]^:NOvᯖ C?殡uH F~Ey\uuvRҹk}K6*OCݪ5Ӡ~szZofp-AHc>NH ·?|0wHѭ-$ϥ2SbY/N/.ճŝ2/ޠrrȇNRD|V*M.w 0KOsL&5ﭞyӷz$C]Жm_cei4[wbgN]R^$5)j!7WږT]N"'|cV ԉz>H#Jx 2eF慬biptfmQ}FFeKK(xRIHQ$$kdeVڌ]}nu߃`"1Ge@}( 3!Tvc2k2gptn(aKͪٵڒ a*PخM-@81OW;1[EoLnaw\fJ|!O*Y^},~g~L%(,ASJԔma33Ԩ^lصuv &6@_= '޵`R*G_I &^n+D `8",;"(2 EdӼS rrNFk.kVGHa( ]3#NK&FcϿVdrLDsznf0ۀCp Ig NbMT5< d+CyA >{ElqR;nu[گ9U1LԹ7*2 LIuERz`mawDdrޝj.Vbe{Pb9!O38xV U!U(.!Nhm;7$^ XP +ȓrXg&B 『Z5q<#$n`ԫڑ=v|PJ/)d%p$7|8AJ;Di,lb\Ȏ 4)鹍'OFk];ۆsj0+e$W-aOZ~ep b;uEVԜ>uR8*Cގ\Wm Sz}3ZTMgh1, @9;*1LaZnzG~rw׷7]| WRWHX`Rz2wn N %\<[0嫷0(@|\tȴT>ih'r-}`iRS #[7_xywk+ѫЎ v9ԂgPCUL%'\`zDlSc vg$>Sq %2b`zZLDNvo<S7^0F22I8$VTQ@` !HԥWl#N(#<=kUuJՁ!411#{hn oٗz͟o_KLv'v|ʠ"*W )A#FSjR! @љmDQ}DJD풵؉~C>-mS4vb'XIIwdG߇wKiI*"G*! _LNfrF _?^OϯF&֎0*|5BRԩW!o,W9IYn '- F͐BdoT#Z9@ty$I+0Fmxr1OD|f9/Kcp-JxLJi sRUhlTfg? zaY$qO"ų%UquPFYSi,%I K=5F7=~i_εm" þv|رǛdiKKTP+A%Ŀ>PK-R[޺\6=fLfWT\.귚}70R54L$ p=}؇SɅq ]S5ysՐ5YMنԩ ,֞ig֜zpp8;ZmVETKʉEX #׫qMb&b$aXCjTc:m7[tZD6' 05˫fʑiGn0tu>]\ U]&ʹc:?{9^G%d.JKV$%U,KJp / -1=uQGҠPTŇ"AzUeBu:J+J&mCgiVv)5'.@y!4TYPz]/HT&L2t#tTQe%[6 ܺd0 I3&Q98a4>rZG]/7*+7EKխ<lP:{^@.#׋c˴ڒD$ 22,/ZLfHB6rc.x1,MROyJEC{4{mC^8®-2^q9A1s%5d|zܬf&]Eh⮶;t 9XN5\f<Q!09A@v`""?Bh 28==)q.H8 *PN(@}(gѤ)ب{)ˆ̖Jc2/A!K:uS5`55ȕtZ%h|ɏLz׋xUjz$HtQNfS\ UZ0hnś?38@D? ZZ6ȒlnRh&ýipż[~Reee/d;aIMLn!w9"2Vr,V5AGԠ~]Z2= z,i u!V$/ ӧF|GUܭy}8!䇟o4MJF0o#}(zoھϻT$T$Ri2YLXhnB*? =<,i .)|ՋJҮ k5tsgӓjѹt eoqo؆c:/91%V`4fH5Ko~Ț:\^O./]֏D,TDz2_Y e=n9%(mQw9AځE&fqBYL;\f`+rbwƊ M#Xp, 0mUkp]֦UnP,Ѓp<́P6YLOםUgjY| ٍ r"i@yU+˥jX.e- @Acڏly$sQjFܜ4$?H)'>:R@A-Z2 [r;xOpሕhAf)(*tC=]c>pݎ/::Ev` 5YF̭%t,'i8]ls .JM|$exN! :W]o^q &G'*JC|`Aړ"Y=1\8 b qhYE nNMYS"8%d,Gl\;L1ybwGiQ5WcȬr\=+1|u D%rEdʗ#CmzYB Wg{#77 9.d(E݆nT)%0|z9R%}ކ櫛Mˢ(bgI10qD.i*4jk?a5V(sbkmI El[櫕m7kkfS63$< WN%PA8K'p(,_<~:__^*` /}glJRaמY:[|YzlHG{GNdPȁT+UӴvL{cH?Ru7F~PYTĻ%Nbɤ43i  zW qюJKjf:dLxW[{^&rЁ34wuPu}V Y|/th& 6CEZ .y ~{c;;aZt0+])eRi`+ek|Oc@BRqw"*^ڴFW{>vhgO6X/%BooYɐljVl_KRk^nm7FKjJ$ʏR;qꄉB΢0NbU~ />^ Imfy4禮C?HUBnZ8xzm$Dz5Yֳd8I3-Bl^2N6ލ"&J 3)ݐ)$\IѹQ#Hl +%QKs mbEQm5`W5! \eKUm"wאuL'(3>CcNn'U 6 KP'm1 \)k|=6b2\ޏ_[H*$]d|5SY>dHY (H- hjR6r"&2 ,[[ kc!5HlOU`P^p_ێ ̛ZxJmiG2EoGA dE 1A{&Q~dYtN @-]%%4p4c]5<axAtQB F]X_Yh_//P)['A 0Fl>;FH~e$haU,Fp`PG#1N`~В!ԫ|mg+M|68~{|ܪZ>:%2D.;>hB"?IeprR^i:gKk1<~iz՚ӳɂwz:dL .)JPn?(HUEiYAXFiԆ1@Ih0 >yiXǟ~z3fEQw0e3(١04isa3SfFwY%I_^{5'I]T: 3M ! %jvK[ujj4i뤭Z6k*G `OjY|?y9dq2ًejjC|0dQ*N#Uʃg؜Eإep$Vi~3Mi\w%vڠ4BZ|+K+53^xCrDH@ci4'On肗QS]7BmV_ߟ2U̴lP3^%Rxmȏc&f,g7l LJŖa-M.~Y&K" vciQ9u{`L»t蟿^6Pf8栄9JHl*|{؏Atp ;F#Nh͂[% {Edz`*\($Ȓ"e'xqT.UdIc1Q+!fwΒghHX~^8m4ˠ2&ؤ\d'R(0 {.,edv|d<IPFRb4-hVY,1Bn4H`39˖)t EXjm^h˙7Od1ΩmTd(\I=ݍ5fR] & VI`52yOp8Q#i,R|CB4K۩%J9مiX4Dxc@Q^"*fy"IۭUAbl"Xb6x,ߘ'o_9#pً_/?ޜx4P;CiΈNg,Ic}?=yVkaY;")r[`W~vqkhm܈0aHuY%w lx@'"]xK.qS(Qd.·sp eX^+}S(8b&]hwKDj)-">nn0(S82deRZFd߳LEx^ysqk8qh1A\jy\xYS!ҋshaO}1+#o{܁4)WT `ӝaqy+o0! qqPyuC_4q Uxu{G0XŌ'$wǶpp;|P^#ˋ 7'x*I6 LI詔Q fr)rf΄^cW*8$ۥc8wRT_|}Ds -\qR:^s D`ZK Z5 (,dij<jb@)3m7_]w!'y!!1·Q>Cj:Gŋl2 Xd2/A/ `>_|~7ק@Jl6:rhxX[#ȧtn%-˩Ber\VtD&Ea" "6!@)%޷+u^ At5w`Lâ2ٸ!-0|& ]eYDyf. :.VajrL]˩kkkmV/ԸK/Svf3ܭ5ᮣt)@w(tgqbQ}y<(9g'^imU_?'XY;*P=yKf6",ӕI𷷯t{NE\=V&-*B|[j"{٦l􍘈=?)WVgcoH 6&ˊlԷ2E0X_i>L0ct4G};hV xfoˏ 1!H<_HO/xy)^}2f'Jb*"iFH ^w26M(jZ1W<=<Sŏ$y`փl%rس:,Vj^Q.r#] 99m<  dx):^\<ĸ/׿{˵FKgTfع1mOiHG">4uy~vJ"k(NDbxi\wqy& BFLğ5w|{+_dm 8E-˫k;EhРm[ 4pXEQC8 ={P39 M-WAl%8bGF%jpGsyXd BN%ŌMXQb~KzXorL!\.e/w.A`?00&0{AtV  Кq\Suc7W[]y{ٮd`(o @1 EyFTJLެo^zoWlAO7?qN"ilΐt)$.4FZVʺdf[h‰|鬨eBu) +7RU6 Grr]ҟ^zx{nzO$*-k_lb$O/>yl~ u$I8edY#d6#t`.J8hBe8Q KkEB)&Ys!%+(^DWKՠjG0ndFqFdC+IYU&͐ڞA.fM1X,t']@[ dgS r6rq[IܒJ c]AؓG[~UGBL']qWLEPQ@6r}azݘ7X=N/Vga0nCV( Uev^H?|t%ԌUcqW\Kմ.QM}Q~O]QB ag5 2 YzR;;8t>wqC.dl>{G;- 0 0-@59|dy7t\ݫZcVdEEPp O(\V, EG6"`2 30x ݻ̚8(i޾|/tA|4 ,r,t>w8 po*]q~V©5'J* IGuػEG+4cgx|A P-Y :pTvb`L ƾӐ@ U@DȲFƉm`hrn^Di"Ao(/<(j*5- Ȭάة5kQ?j $.< 2 G==$ C6;΋}Q,B+" ˃(p|Xza;IS L2YD'x/K6&ÃoC;[F.\ ӹ7itUN1e9UJ%>Gw3cn+5cHI }m_I5'z)8p}_j>?aw{YVu9I%floBE2$R/)Ȉ,#TYM 0($Sxm(j|37[MNCӷprPkL#EF),REYDw.$~>/R>Tjh] Tv.fLZךC޽Q7+VQ1xieQbMcȜ&3r!EK 6y&Ax DnH(HYK@huxYqyR0I$N(ngqЯR]K$qO> u1ϱWBk|eyL0hSp{́g h`sxh1A#shr-.phj: J74=*ƹT~Ə,&h7о5=U˂fz5Cel{3"脸1NξR/qw4? K Q{Db8J0-FDMu tw39[|tx51ֹ ڭjǗ(|@jUDvkfl"H]('at=أhVܔڔ4Mx~'9@]䍵FKh7UIY@0iEhHLnNiVo$WNp>^/WC(wcH 'pfEsgqhL!z6(]DqZrDv6;FSI5kmJᅬzc'8S*Q@U* /j)"ܚ(#P 04+ΝN^w ǹAʳݭHNz-[Nq1)aі\IUY=P[t(ԆDX`JWㅦ,"ɕeEUe.5 aހ=|yn-ؽ<;;JE&_$JR.^Vqv4ew\Wqt[EQ)-u66{2rӭfֱ eŘ֗_q('N ?( C0\4)Oܐoq 7O|>WX^ب,AnCkL5gbWY{|֍hZZH1 l1Fa\ TEwgOL.XkHD,aB%Ky&kz7kdz(WUA,_9巯$6g[qmgcT[d4L!A:!1-^'BUA!e1d^a2V.WQ/WkbKťGb:M!#?"V$U[JITv֮7EKABq a&%Hqѳ ԩ"`Zo/.+R&iZd2hxul6aALeK[" Ѐ$ ˸1tUᏎ;0Zf+Ku^S3ڈ@u$M%QP|˵M篁Ierm\J@y߫P,ڬp5˓n rF jCv-s([_͛A[P-W_G QU r66Z]ՆO=4YʨTy8ELgQ}]4sa[@mG0m"̑qyO~x {~ueATf%58En;*8,?/mEX he 꽗|UgO2@p%GQHDё%e]LAR AG{.)NMFS Zj tb __˳|i;Fy+cwwQfy$YoFHDb[ NE⇢}CnhӢԛI$k(QsC'M |ԭbM3dI(5mWO!jMxb0ri ƓePgADVa ?rQ*LAy?%_kID27c /0 *L"mۥgѴ?j@vrkێ@HT]f2J\FTn-HbO~6GajA)@Z_eچ`HRPƫ{\Q,Ygx $Ȃq1Rv FsS?TLyhB4lIR 8Dfd7g\w.5CfX| #aF_`ݭ}- )Z",że0lpnQU6fL& ^8 E$ј`jo;OfEpwדɄYOE 3uzdr5DNlQpW\Vfbqb4Ӗe C6G^$/ "O ~׋\B$hpHao(P 0$,+nh.YLF8KHqV)CFks51AIck;=8s=ۉ8q#p#Bav;.l/ap[@la{~N)Uq: (ߗwZeVn5JX.x5Sotn͖;fJ,ӳc}<穘(#oHS$Sjۥ]@ahZ0@IDb$A`B߃NX8L*erX_Ѯ/䬌{$yy4& cN3$wQYu.Ƴ81t?%ngCb"噲X+w)P,%DHIqqWsI}_H-Š7 11  E!pIPǏ$I l# YVhK;l(7RE/J,m{.Ok[1(eXp]̡I@˵c-%GmDP2M&ToE%B4 3sR0f(fjR&8<+<NG փng RY RjQK .?)M=X2oi,}yv!U h?^9>Gv)Pf 2c\}\ Xafk9O 3ՊehogA$/PdxpXkz~GoSFp/˻@lYّDaZ)ۏvû|2MI+]CTc8Z7>(b'b0>|8Fn6t)G$^sQEZɦl*WgçOZ8(\:hT/:g'GϚ,WÛi\'|AT`k(4AMB[x _gZIq[5Z/`>Dlԁ# Zo$YoU[_ws򰇢XHm^݌?o{È2"ЪyԀ 5Oǥo{b(;_6.jl}>[~Դc_^4Ej^fm2<)71׫GHm6F``Y|ߨdp.!UF ]TiOjuMYlbuf!/+fԩz׹erRSP,&%AƞXAFXؑ;/gx}CԣQ`QIXx V}J:npFJ,I H0&7HG Y`8[oP4}qnQc{s:I;yaݹ\~?_u@ nIg4Ç~l'&D<z^m4i`oA\]_{/p TgR)8$Vy'P 3pzjl>ニ멭^ (jsEE^$+`Wתb_[+52@ ^RB$B̯!.Op$(,@Q4>piBkZ7h|7~@ 鈁ܢ'ǖ_H^ A!kU4{ͦ)ï}r|P AVH|GT]=~R;m~ȪsDbK圄4KVK9E9,}gRIQpWk2V Lna9\0`X.Ȅ79#>hD-@H~Dh4'x"ݝ=W#B](Q'e67\3M&DR&/< jj.Wݬ VB *ڐ,FzE8Ufk70lD<'T _\CqL$EtVkei Hu>9e6%+Kvoyy+"< `*"csZ'!SB 比F`fi )ToeHZÛ߾޵?zPٿV.T&3յ8# σNp\ ?&rg.ϋg"C0X|upxоV 刺k]V³Y[7cͷ<Ƃ:3g/?9 O{?~w|?}r65ޮmNoZ\fj Zfcc}T>yAb"Ji6Jb(jS)NdkxBy`40)J34('SYYi&z. 晦E' ǍN4y1hxoSiėW t̤47)'lqlAD)tL^Rv!룧T_m#IúҢ@Aȟ]J9Z'>%˶$[7!qRz &Kbj(XMѝzLb|}n9aV)HԳ(Yu~[|+s{EhGȉƎ=K> EFb*sTȈ,Rad# 8/7_yLG3Up%0 d̔T5Z>,@NkEܺg1NKTB,ת=l V V/ׁ81YE ̷JO7WQ{ogcJͺϧ>m"~PmVݦ*Vw,$> 0=0$%B]GOz{ pDDbctzh{Y;xAp>^}X-tE3Bdu1_MӕHmԵH eX65q֑>+兺h*0zKt/[ip6vߔbo8*)E\ּN&Iqb7īҿ!%Na}`H2\&4K=+CtRӋ]X*v.G&dffY,X{.|υ$iu\"D1޹&%QiyHp_QϜGed 8k ڧ<ˇ5d {I:51-h1NOE!}p^'LB&԰:u9qlwkmPVȩH޶0=8q.M&Mm ďD@|Ah+hllm4m67'c;6}.U+*@mbAEfKT80vs 1H(LJOs&)/=q2<  0YWޟ砘NA._ ooGiq?6/7$Aq ^oR-!<= "#ryP$'hQ%(.:'k5Mc= (e(r!h$AiZ]gϨa.)8xyG$KOFSݘPTJP z$4mܙ[g{c8:4DZ)P Qb[;Ϟ|#5fgbC\~?jx $~(e[; t󒬩ݕ'˹J 0y#XsrWD\n^߼Y3hӏ Z^*lfrOUI?~/3 `Y4I'|qP`1|7[b2WAo7vleek(Ҥ =VȔREC]_>LûFw9>7ra{g,H\1c~n5{z%@~ǚiY>ln1h! ](1.4C AR8!"YN .p/fk˲۳7*vKhN[Eh jn/0pr@1/;!J|mdX1+96TQQ*"+ikvzpWc7ק#4Y[9hxe.zŢ2SОxTY&r,aLr34b_3M؅5^e)6 {~"$"ٓ'rBpP$QVmr:w~{DUTh=\< L0 ,DP!da^Y%Ct7DBIb/Xx}|&P)ӭwTE]"Xޔ<$. j5 MmWw6wܝ7MxQ/G͕Um\ MV  +&"ZPef{o{.+*0$NAs] a1$i0 /S=Cs܌Y<$ᏹh6FҪ7wC99A9gB[B|sٹw,fC qCU(2 -7UҖ&煻Rn(Û;{Y.ZQ!q DTdD֡o5ِuqfҩuB|R߳? I:Mvt>95VV$9Gq^d*r<=p(y%M4 U2mb(TP(p):|nmkt1]vk4uݞ{głMnuR:"*@#)#>L 1mp$pv0@v/^|UmD$Mw'oNQd"ź`Jwzx@ȶ"EWUM0,n nfو$ X ;Ƿ}#1<-yrpSIENDB`bzflag-2.4.2+ds1/include/000077500000000000000000000000001200563112200150625ustar00rootroot00000000000000bzflag-2.4.2+ds1/include/AccessList.h000066400000000000000000000027531200563112200172770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef ACCESS_LIST_H #define ACCESS_LIST_H #include #include #include class AccessList { public: AccessList(const std::string& filename, const char* content); ~AccessList(); bool reload(); bool alwaysAuthorized() const; bool authorized(const std::vector& strings) const; const std::string& getFileName() const; private: bool computeAlwaysAuth() const; void makeContent(const char* content) const; private: std::string filename; bool alwaysAuth; enum AccessType { invalid, allow, // simple globbing deny, allow_regex, // regular expressions deny_regex }; typedef struct { AccessType type; std::string pattern; } AccessPattern; std::vector patterns; }; inline bool AccessList::alwaysAuthorized() const { return alwaysAuth; } #endif /* * Local Variables: *** * mode:C *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/Address.h000066400000000000000000000050541200563112200166240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Address: * Encapsulates an Internet address * * PlayerId: * Unique network id for a player. Can be sent * across the net. */ #ifndef BZF_INET_ADDR_H #define BZF_INET_ADDR_H // system headers #include #include #include // local headers #include "common.h" #include "global.h" #include "network.h" #include "Pack.h" typedef struct in_addr InAddr; // shorthand class Address { public: Address(); Address(const std::string&); Address(const Address&); Address(const InAddr&); // input in nbo Address(const struct sockaddr_in&); // input in nbo ~Address(); Address& operator=(const Address&); operator InAddr() const; bool operator==(const Address&) const; bool operator!=(const Address&) const; bool isAny() const; bool isPrivate() const; std::string getDotNotation() const; uint8_t getIPVersion() const; void* pack(void*) const; void* unpack(void*); static Address getHostAddress(const std::string &hostname = std::string("")); static std::string getHostByAddress(InAddr); static const std::string getHostName(const std::string &hostname = std::string("")); private: std::vector addr; }; typedef uint8_t PlayerId; const int PlayerIdPLen = sizeof(PlayerId); const int ServerIdPLen = 8; // FIXME - enum maybe? put into namespace or class cage? const PlayerId NoPlayer = 255; const PlayerId AllPlayers = 254; const PlayerId ServerPlayer = 253; const PlayerId AdminPlayers = 252; const PlayerId FirstTeam = 251; const PlayerId LastRealPlayer = FirstTeam - NumTeams; class ServerId { public: void* pack(void*) const; void* unpack(void*); bool operator==(const ServerId&) const; bool operator!=(const ServerId&) const; public: // host and port in network byte order InAddr serverHost; // server host int16_t port; // server port int16_t number; // local player number }; #endif // BZF_INET_ADDR_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/AnsiCodes.h000066400000000000000000000071301200563112200171040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _ANSI_CODES_H_ #define _ANSI_CODES_H_ #include // Escape character to begin ANSI codes #define ESC_CHAR ((char) 0x1B) // ANSI (ISO 6429) colors codes #define ANSI_STR_RESET "\033[0;1m" // reset & bright #define ANSI_STR_RESET_FINAL "\033[0m" // only reset #define ANSI_STR_BRIGHT "\033[1m" #define ANSI_STR_DIM "\033[2m" #define ANSI_STR_UNDERLINE "\033[4m" #define ANSI_STR_NO_UNDERLINE "\033[24m" #define ANSI_STR_PULSATING "\033[5m" #define ANSI_STR_NO_PULSATE "\033[25m" #define ANSI_STR_REVERSE "\033[7m" // unimplemented #define ANSI_STR_NO_REVERSE "\033[27m" // unimplemented #define ANSI_STR_FG_BLACK "\033[30m" // grey #define ANSI_STR_FG_RED "\033[31m" #define ANSI_STR_FG_GREEN "\033[32m" #define ANSI_STR_FG_YELLOW "\033[33m" #define ANSI_STR_FG_BLUE "\033[34m" #define ANSI_STR_FG_MAGENTA "\033[35m" // purple #define ANSI_STR_FG_CYAN "\033[36m" #define ANSI_STR_FG_WHITE "\033[37m" #define ANSI_STR_FG_ORANGE "\033[130m" // orange (custom; not defined in ISO 6429) // Color definitions typedef enum { // the first 8 codes line up with the TeamColor enum from global.h RogueColor = 0, // team (yellow) RedColor = 1, // team GreenColor = 2, // team BlueColor = 3, // team PurpleColor = 4, // team WhiteColor = 5, // observer GreyColor = 6, // rabbit OrangeColor = 7, // hunter CyanColor = 8, LastColor = 8, // last of the actual colors, the rest are modifiers ResetColor = 9, FinalResetColor = 12, BrightColor = 13, DimColor = 14, PulsatingColor = 10, NonPulsatingColor = 15, UnderlineColor = 11, NonUnderlineColor = 16, LastCode = 16, // last of the codes // aliases YellowColor = 0, // aka RogueColor DefaultColor = 6 // default to grey } ColorCodes; // These enum values have to line up with those above static const std::string ColorStrings[17] = { ANSI_STR_FG_YELLOW, // 0 Rogue (yellow) ANSI_STR_FG_RED, // 1 Red ANSI_STR_FG_GREEN, // 2 Green ANSI_STR_FG_BLUE, // 3 Blue ANSI_STR_FG_MAGENTA, // 4 Purple ANSI_STR_FG_WHITE, // 5 White ANSI_STR_FG_BLACK, // 6 Grey (bright black is grey) ANSI_STR_FG_ORANGE, // 7 Orange (nonstandard) ANSI_STR_FG_CYAN, // 8 Cyan ANSI_STR_RESET, // 9 Reset ANSI_STR_PULSATING, // 10 Pulsating ANSI_STR_UNDERLINE, // 11 Underline ANSI_STR_RESET_FINAL, // 12 Really reset (no brightness added) ANSI_STR_BRIGHT, // 13 Bright mode ANSI_STR_DIM, // 14 Dim mode ANSI_STR_NO_PULSATE, // 15 No Pulsating ANSI_STR_NO_UNDERLINE // 16 No Underlining }; // strip ANSI codes from a string inline std::string stripAnsiCodes(const std::string &text) { std::string str = ""; int length = (int)text.size(); for (int i = 0; i < length; i++) { if (text[i] == ESC_CHAR) { i++; if ((i < length) && (text[i] == '[')) { i++; while ((i < length) && ((text[i] == ';') || ((text[i] >= '0') && (text[i] <= '9')))) { i++; } } } else { str += text[i]; } } return str; } #endif //_ANSI_CODES_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ArcObstacle.h000066400000000000000000000061261200563112200174220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ArcObstacle: * Encapsulates an arc in the game environment. */ #ifndef BZF_ARC_OBSTACLE_H #define BZF_ARC_OBSTACLE_H #include "common.h" #include #include "Obstacle.h" #include "MeshObstacle.h" #include "MeshTransform.h" #include "BzMaterial.h" class ArcObstacle : public Obstacle { public: enum { Top, Bottom, Inside, Outside, StartFace, EndFace, MaterialCount }; ArcObstacle(); ArcObstacle(const MeshTransform& transform, const float* _pos, const float* _size, float _rotation, float _angle, float _ratio, const float _texsize[4], bool _useNormals, int _divisions, const BzMaterial* mats[MaterialCount], int physics, bool bounce, bool drive, bool shoot, bool ricochet); ~ArcObstacle(); Obstacle* copyWithTransform(const MeshTransform&) const; MeshObstacle* makeMesh(); const char* getType() const; static const char* getClassName(); // const bool isValid() const; bool isFlatTop() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void finalize(); MeshObstacle* makePie(bool isCircle, float a, float r, float h, float radius, float squish, float texsz[4]); MeshObstacle* makeRing(bool isCircle, float a, float r, float h, float inrad, float outrad, float squish, float texsz[4]); private: static const char* typeName; MeshTransform transform; int divisions; float sweepAngle; float ratio; int phydrv; bool smoothBounce; bool useNormals; float texsize[4]; const BzMaterial* materials[MaterialCount]; }; #endif // BZF_ARC_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/AresHandler.h000066400000000000000000000040131200563112200174210ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __ARES_HANDLER_H__ #define __ARES_HANDLER_H__ // bzflag global header #include "global.h" /* common implementation headers */ #include "network.h" #if defined(BUILD_ARES) #include "../src/other/ares/ares.h" #else #include #endif class AresHandler { public: AresHandler(int index); ~AresHandler(); static bool globalInit(); static void globalShutdown(); enum ResolutionStatus { None = 0, Failed, HbAPending, HbASucceeded, HbNPending, HbNSucceeded }; void setIndex ( int i ) {index = i;} void queryHostname(struct sockaddr *clientAddr); void queryHost(char *hostName); const char *getHostname(); ResolutionStatus getHostAddress(struct in_addr *clientAddr); void setFd(fd_set *read_set, fd_set *write_set, int &maxFile); void process(fd_set *read_set, fd_set *write_set); ResolutionStatus getStatus() {return status;}; private: #if ARES_VERSION_MAJOR >= 1 && ARES_VERSION_MINOR >= 5 static void staticCallback(void *arg, int statusCallback, int timeouts, struct hostent *hostent); #else static void staticCallback(void *arg, int statusCallback, struct hostent *hostent); #endif void callback(int status, struct hostent *hostent); int index; // peer's network hostname (malloc/free'd) char *hostname; in_addr hostAddress; ares_channel aresChannel; ResolutionStatus status; bool aresFailed; static bool globallyInited; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/AutoCompleter.h000066400000000000000000000043031200563112200200160ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef AUTOCOMPLETER_H #define AUTOCOMPLETER_H #include #include /** This class will try to complete strings to registered words. */ class AutoCompleter { public: /** Use this function to register a new word that strings should be checked against and possibly completed to. Empty strings will not be registered. */ void registerWord(const std::string& str, bool quoteString = false); /** Use this function to unregister a word. If the word hasn't been registered previously nothing will happen. */ void unregisterWord(const std::string& str); /** This function will search the list of registered words and see if the given string can be completed to any of those words. If the string can be completed to several words, their largest common prefix will be returned. */ std::string complete(const std::string& str, std::string* matches = NULL); protected: class WordRecord { public: WordRecord(const std::string& str, bool quoteString); bool operator<(const WordRecord&) const; bool operator==(const WordRecord&) const; bool operator!=(const WordRecord&) const; public: std::string word; bool quoteString; }; std::vector words; }; /** This class will try to complete strings to registered words. It starts with a bunch of common /-commands */ class DefaultCompleter : public AutoCompleter { public: /** ctor sets default words */ DefaultCompleter(); /** This function sets the list of registered words to a default which consists of some /-commands; possible other words are removed */ void setDefaults(); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BSPSceneDatabase.h000066400000000000000000000047551200563112200202750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BSPSceneDatabase: * BSP tree database of geometry to render */ #ifndef BZF_BSP_SCENE_DATABASE_H #define BZF_BSP_SCENE_DATABASE_H // common goes first #include "common.h" // system headers #include // common implementation headers #include "bzfgl.h" #include "SceneDatabase.h" class BSPSceneDatabase : public SceneDatabase { public: BSPSceneDatabase(); ~BSPSceneDatabase(); // returns true if the node would have been deleted bool addStaticNode(SceneNode*, bool dontFree); void addDynamicNode(SceneNode*); void addDynamicSphere(SphereSceneNode*); void finalizeStatics(); void removeDynamicNodes(); void removeAllNodes(); bool isOrdered(); void updateNodeStyles(); void addLights(SceneRenderer& renderer); void addShadowNodes(SceneRenderer &renderer); void addRenderNodes(SceneRenderer& renderer); void renderRadarNodes(const ViewFrustum&); void drawCuller(); private: class Node { public: Node(bool dynamic, SceneNode* node); public: bool dynamic; int count; SceneNode* node; Node* front; Node* back; }; void setNodeStyle(Node*); void nodeAddLights(Node*); void nodeAddShadowNodes(Node*); void nodeAddRenderNodes(Node*); // returns true if the node would have been deleted bool insertStatic(int, Node*, SceneNode*, bool dontFree); void insertDynamic(int, Node*, SceneNode*); void insertNoPlane(int, Node*, SceneNode*); void insertNoPlaneNodes(); void removeDynamic(Node*); void free(Node*); void release(Node*); void setDepth(int newDepth); private: Node* root; int depth; // the following members avoid passing parameters around GLfloat eye[3]; SceneRenderer* renderer; const ViewFrustum* frustum; bool needNoPlaneNodes; std::vector noPlaneNodes; }; #endif // BZF_BSP_SCENE_DATABASE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BZDBCache.h000066400000000000000000000055171200563112200167100ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZDBCACHE_H #define BZDBCACHE_H // implementation headers #include "StateDatabase.h" class BZDBCache { public: static void init(); // prohibit external write access template class ReadOnly { friend class BZDBCache; public: inline operator T() const { return data; } private: ReadOnly() {} ReadOnly& operator=(const T& value) { data = value; return *this; } private: ReadOnly(const ReadOnly&); ReadOnly& operator=(const ReadOnly&); private: T data; }; // our basics types typedef ReadOnly Int; typedef ReadOnly Bool; typedef ReadOnly Float; static Bool displayMainFlags; static Bool blend; static Bool texture; static Bool shadows; static Bool stencilShadows; static Bool zbuffer; static Bool tesselation; static Bool lighting; static Bool smooth; static Bool colorful; static Int flagChunks; static Bool animatedTreads; static Int radarStyle; static Float radarTankPixels; static Int leadingShotLine; static Float linedRadarShots; static Float sizedRadarShots; static Int radarPosition; static Float shotLength; static Float pulseRate; static Float pulseDepth; static Bool showCollisionGrid; static Bool showCullingGrid; static Bool useMeshForRadar; static Bool drawCelestial; static Bool drawClouds; static Bool drawGround; static Bool drawGroundLights; static Bool drawMountains; static Bool drawSky; static Float maxLOD; static Float worldSize; static Float radarLimit; static Float gravity; static Float tankWidth; static Float tankLength; static Float tankHeight; static Float tankSpeed; static Float tankRadius; static Float flagRadius; static Float flagPoleSize; static Float flagPoleWidth; static Float gmSize; static Float hudGUIBorderOpacityFactor; public: /** public method to update cached variable has to be called at best opportunity (e.g. at beginnig of main loop) */ static void update(); private: static void clientCallback(const std::string &name, void *); static void serverCallback(const std::string &name, void *); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BZDBLocal.h000066400000000000000000000140101200563112200167230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZDBLOCAL_H #define BZDBLOCAL_H #include "common.h" // system headers #include // implementation headers #include "StateDatabase.h" class BZDBint; class BZDBbool; class BZDBfloat; class BZDBcolor; class BZDBstring; // Utility Macros (... requires at least the default parameter) /*#define BZDB_INT(name, ...) BZDBint name(#name, __VA_ARGS__) #define BZDB_BOOL(name, ...) BZDBbool name(#name, __VA_ARGS__) #define BZDB_FLOAT(name, ...) BZDBfloat name(#name, __VA_ARGS__) #define BZDB_COLOR(name, ...) BZDBcolor name(#name, __VA_ARGS__) #define BZDB_STRING(name, ...) BZDBstring name(#name, __VA_ARGS__) */ /******************************************************************************/ // // Defaults to "saving-on-exit" // class BZDBLocal { friend class BZDBLocalManager; public: inline const std::string& getName() const { return name; } protected: BZDBLocal(const std::string& _name, bool save) : name(_name), saveOnExit(save) {} virtual ~BZDBLocal() { return; } virtual void addCallbacks() = 0; virtual void removeCallbacks() = 0; protected: std::string name; bool saveOnExit; }; /******************************************************************************/ class BZDBbool : public BZDBLocal { public: BZDBbool(const std::string& name, bool defVal, bool saveOnExit = true); ~BZDBbool(); void addCallbacks(); void removeCallbacks(); inline operator bool() const { return data; }; private: BZDBbool(const BZDBbool&); BZDBbool& operator=(const BZDBbool&); void callback(); static void staticCallback(const std::string& name, void* data); private: bool data; }; /******************************************************************************/ class BZDBint : public BZDBLocal { public: BZDBint(const std::string& name, int defVal, int min = INT_MIN, int max = INT_MAX, bool neverZero = false, bool saveOnExit = true); ~BZDBint(); void addCallbacks(); void removeCallbacks(); inline operator int() const { return data; }; inline int getMin() const { return min; } inline int getMax() const { return max; } inline bool getNeverZero() const { return neverZero; } private: BZDBint(const BZDBint&); BZDBint& operator=(const BZDBint&); void callback(); static void staticCallback(const std::string& name, void* data); private: int data; int min; int max; bool neverZero; }; /******************************************************************************/ class BZDBfloat : public BZDBLocal { public: BZDBfloat(const std::string& name, float defVal, float min = -MAXFLOAT, float max = +MAXFLOAT, bool neverZero = false, bool saveOnExit = true); ~BZDBfloat(); void addCallbacks(); void removeCallbacks(); inline operator float() const { return data; }; inline float getMin() const { return min; } inline float getMax() const { return max; } inline bool getNeverZero() const { return neverZero; } private: BZDBfloat(const BZDBfloat&); BZDBfloat& operator=(const BZDBfloat&); void callback(); static void staticCallback(const std::string& name, void* data); private: float data; float min; float max; bool neverZero; }; /******************************************************************************/ class BZDBcolor : public BZDBLocal { public: BZDBcolor(const std::string& name, float r, float g, float b, float a, bool neverAlpha = false, bool saveOnExit = true); ~BZDBcolor(); void addCallbacks(); void removeCallbacks(); inline operator const float*() const { return data; }; inline bool getNeverAlpha() const { return neverAlpha; } private: BZDBcolor(const BZDBcolor&); BZDBcolor& operator=(const BZDBcolor&); void callback(); static void staticCallback(const std::string& name, void* data); private: float data[4]; bool neverAlpha; }; /******************************************************************************/ class BZDBstring : public BZDBLocal { public: BZDBstring(const std::string& name, const std::string& defVal, bool neverEmpty = false, bool saveOnExit = true); ~BZDBstring(); void addCallbacks(); void removeCallbacks(); inline operator const std::string&() const { return data; }; inline bool getNeverEmpty() const { return neverEmpty; } private: BZDBstring(const BZDBstring&); BZDBstring& operator=(const BZDBstring&); void callback(); static void staticCallback(const std::string& name, void* data); private: std::string data; bool neverEmpty; }; /******************************************************************************/ class BZDBLocalManager { public: void init(); void kill(); // no real reason to use this... bool addEntry(BZDBLocal* entry); // add a callback for all variables (that doesn't use the callback data) void addNameCallback(StateDatabase::Callback callback); public: static BZDBLocalManager manager; private: BZDBLocalManager(); ~BZDBLocalManager(); BZDBLocalManager(const BZDBLocalManager&); BZDBLocalManager& operator=(const BZDBLocalManager&); private: std::vector& getEntries(); }; #define BZDBLOCAL (BZDBLocalManager::manager) /******************************************************************************/ #endif // BZDBLOCAL_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BaseBuilding.h000066400000000000000000000046131200563112200175670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BaseBuilding: * Encapsulates a base in the game environment */ #ifndef BZF_BASE_BUILDING_H #define BZF_BASE_BUILDING_H #include "common.h" #include #include "Obstacle.h" class BaseBuilding : public Obstacle { friend class ObstacleModifier; public: BaseBuilding(); BaseBuilding(const float *pos, float rotation, const float *size, int _team, bool ricochet); ~BaseBuilding(); Obstacle* copyWithTransform(const MeshTransform&) const; const char* getType() const; static const char* getClassName(); // const bool isFlatTop() const; float intersect(const Ray &) const; void getNormal(const float *p, float *n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float *pos1, float azimuth1, const float *pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float *normal) const; void getCorner(int index, float *pos) const; int getTeam() const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printOBJ(std::ostream& out, const std::string& indent) const; std::string userTextures[2]; private: void finalize(); private: static const char* typeName; int team; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BaseResources.h000066400000000000000000000032271200563112200200040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BaseResources: * Interface for resource classes */ #ifndef BZF_BASE_RESOURCES_H #define BZF_BASE_RESOURCES_H #include "common.h" #include #include class std::ostream; class BaseResources { public: BaseResources(); BaseResources(const BaseResources&); ~BaseResources(); BaseResources& operator=(const BaseResources&); bool hasName(const std::string&) const; const std::vector& getNames() const; void addName(const std::string&); protected: static std::ostream& print(std::ostream&, const std::string& name, const char* format, ...); // const static bool match(const std::string& wildName, const std::string& name); // const private: static int doMatch(const char* pattern, const char* string); // const static int matchStar(const char* pattern, const char* string); // const private: std::vector names; }; // // BaseResources // inline const std::vector& BaseResources::getNames() const { return names; } #endif // BZF_BASE_RESOURCES_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BaseSceneNodeGenerator.h000066400000000000000000000020341200563112200215370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BASESCENENODEGENERATOR_H__ #define __BASESCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" #include "BaseBuilding.h" class BaseSceneNodeGenerator : public ObstacleSceneNodeGenerator { friend class SceneDatabaseBuilder; ~BaseSceneNodeGenerator(); public: WallSceneNode* getNextNode(float, float, bool); protected: BaseSceneNodeGenerator(const BaseBuilding *); private: const BaseBuilding *base; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BillboardSceneNode.h000066400000000000000000000055741200563112200207240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BillboardSceneNode: * Encapsulates information for rendering a textured billboard. */ #ifndef BZF_BILLBOARD_SCENE_NODE_H #define BZF_BILLBOARD_SCENE_NODE_H #include "common.h" #include "SceneNode.h" #include "OpenGLLight.h" class BillboardSceneNode : public SceneNode { public: BillboardSceneNode(const GLfloat pos[3]); ~BillboardSceneNode(); virtual BillboardSceneNode* copy() const; void setLoop(bool = true); void setDuration(float); void resetTime(); void updateTime(float dt); bool isAtEnd() const; bool isLight() const; void setLight(bool = true); void setLightColor(GLfloat r, GLfloat g, GLfloat b); void setLightAttenuation(GLfloat c, GLfloat l, GLfloat q); void setLightScaling(GLfloat intensityScaleFactor); void setLightFadeStartTime(float t); void setGroundLight(bool value); void setSize(float side); void setSize(float width, float height); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void setTexture(const int); void setTextureAnimation(int cu, int cv); void move(const GLfloat pos[3]); void setAngle(GLfloat); void addLight(SceneRenderer&); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class BillboardRenderNode : public RenderNode { public: BillboardRenderNode(const BillboardSceneNode*); ~BillboardRenderNode(); void setColor(const GLfloat* rgba); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } void setFrame(float u, float v); void setFrameSize(float du, float dv); private: const BillboardSceneNode* sceneNode; float u, v; GLfloat du, dv; }; friend class BillboardRenderNode; void setFrame(); void prepLight(); private: bool show; bool hasAlpha; bool hasTexture; bool hasTextureAlpha; bool looping; bool lightSource; bool groundLight; float width, height; GLfloat color[4]; GLfloat angle; GLfloat lightColor[3]; GLfloat lightScale; float lightCutoffTime; int cu, cv; float t, duration; OpenGLLight light; OpenGLGState gstate; BillboardRenderNode renderNode; }; #endif // BZF_BILLBOARD_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BoltSceneNode.h000066400000000000000000000061021200563112200177160ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BoltSceneNode: * Encapsulates information for rendering a ball lighting bolt. */ #ifndef BZF_BOLT_SCENE_NODE_H #define BZF_BOLT_SCENE_NODE_H #include "common.h" #include "ShotSceneNode.h" #include "OpenGLLight.h" class BoltSceneNode : public ShotSceneNode { public: BoltSceneNode(const GLfloat pos[3], const GLfloat vel[3], bool super); ~BoltSceneNode(); void setFlares(bool); void setSize(float radius); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setTextureColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgb); void setTeamColor(const GLfloat* rgb); void setTexture(const int); void setTextureAnimation(int cu, int cv); bool getColorblind() const; void setColorblind(bool); bool getInvisible() const {return invisible;} void setInvisible(bool _invisible) {invisible = _invisible;} void move(const GLfloat pos[3], const GLfloat forward[3]); void addLight(SceneRenderer&); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: bool isSuper; class BoltRenderNode : public RenderNode { public: BoltRenderNode(const BoltSceneNode*); ~BoltRenderNode(); void setColor(const GLfloat* rgba); void setTextureColor(const GLfloat* rgba); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } void setAnimation(int cu, int cv); void renderGeoBolt(); void renderGeoGMBolt(); void renderGeoPill( float radius, float length, int segments, float endRad = -1); private: const BoltSceneNode* sceneNode; int u, v, cu, cv; GLfloat du, dv; GLfloat mainColor[4]; GLfloat innerColor[4]; GLfloat outerColor[4]; GLfloat coronaColor[4]; GLfloat flareColor[4]; GLfloat textureColor[4]; int numFlares; float theta[6]; float phi[6]; static GLfloat core[9][2]; static GLfloat corona[8][2]; static const GLfloat ring[8][2]; static const GLfloat CoreFraction; static const GLfloat FlareSize; static const GLfloat FlareSpread; }; friend class BoltRenderNode; private: bool invisible; bool drawFlares; bool texturing; bool colorblind; float size; float velocity[3]; GLfloat color[4]; fvec4 teamColor; OpenGLLight light; OpenGLGState gstate; OpenGLGState colorblindGState; BoltRenderNode renderNode; float azimuth, elevation, length; }; #endif // BZF_BOLT_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BoxBuilding.h000066400000000000000000000050671200563112200174510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BoxBuilding: * Encapsulates a box in the game environment. */ #ifndef BZF_BOX_BUILDING_H #define BZF_BOX_BUILDING_H #include "common.h" #include #include "Obstacle.h" class BoxBuilding : public Obstacle { public: BoxBuilding(); BoxBuilding(const float* pos, float rotation, float width, float breadth, float height, bool drive = false, bool shoot = false, bool ricochet = false, bool invisible = false); ~BoxBuilding(); Obstacle* copyWithTransform(const MeshTransform&) const; const char* getType() const; static const char* getClassName(); // const bool isFlatTop() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; inline bool isInvisible() const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal( const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; void getCorner(int index, float* pos) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printOBJ(std::ostream& out, const std::string& indent) const; std::string userTextures[2]; private: void finalize(); private: static const char* typeName; bool noNodes; }; // // BoxBuilding // bool BoxBuilding::isInvisible() const { return noNodes; } #endif // BZF_BOX_BUILDING_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BoxSceneNodeGenerator.h000066400000000000000000000020261200563112200214160ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BOXSCENENODEGENERATOR_H__ #define __BOXSCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" #include "BoxBuilding.h" class BoxSceneNodeGenerator : public ObstacleSceneNodeGenerator { friend class SceneDatabaseBuilder; public: ~BoxSceneNodeGenerator(); WallSceneNode* getNextNode(float, float, bool); protected: BoxSceneNodeGenerator(const BoxBuilding*); private: const BoxBuilding* box; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Bundle.h000066400000000000000000000026411200563112200164470ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_BUNDLE_H #define BZF_BUNDLE_H // common header first #include "common.h" // system headers #include #include #include typedef std::map BundleStringMap; class Bundle { public: /** Localize a string */ std::string getLocalString(const std::string &key) const; std::string formatMessage(const std::string &key, const std::vector *parms) const; private: typedef enum { tERROR, tCOMMENT, tMSGID, tMSGSTR, tAPPEND } TLineType; Bundle(const Bundle *pBundle); Bundle(const Bundle &xBundle); Bundle& operator=(const Bundle &xBundle); void load(const std::string &path); TLineType parseLine(const std::string &line, std::string &data) const; void ensureNormalText(std::string &msg); BundleStringMap mappings; friend class BundleMgr; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BundleMgr.h000066400000000000000000000025531200563112200171170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_BUNDLEMGR_H #define BZF_BUNDLEMGR_H #include "common.h" /* system interface headers */ #include #include #include #ifdef __APPLE__ # include #endif class Bundle; typedef std::map BundleMap; class BundleMgr { public: BundleMgr(const std::string &path, const std::string &bundleName); ~BundleMgr(); Bundle *getBundle(const std::string &locale, bool setcur = true); static Bundle *getCurrentBundle(); static bool getLocaleList(std::vector *list); private: BundleMgr(const BundleMgr &xBundleMgr); BundleMgr& operator=(const BundleMgr &xBundleMgr); static std::string bundlePath; std::string bundleName; BundleMap bundles; static Bundle *currentBundle; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzMaterial.h000066400000000000000000000134051200563112200172700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TetraBuilding: * Encapsulates a tetrahederon in the game environment. */ #ifndef BZ_MATERIAL_H #define BZ_MATERIAL_H #include "common.h" #include #include #include #include #include class BzMaterial; typedef std::set MaterialSet; typedef std::map MaterialMap; class BzMaterial { public: BzMaterial(); BzMaterial(const BzMaterial& material); ~BzMaterial(); bool operator==(const BzMaterial& material) const; BzMaterial& operator=(const BzMaterial& material); void reset(); void setReference(); bool getReference() const; // // Parameter setting // bool setName(const std::string&); bool addAlias(const std::string&); void setDynamicColor(int); void setAmbient(const float[4]); void setDiffuse(const float[4]); void setSpecular(const float[4]); void setEmission(const float[4]); void setShininess(const float); void setOccluder(bool); void setGroupAlpha(bool); void setNoLighting(bool); void setNoRadar(bool); void setNoShadow(bool); void setNoCulling(bool); void setNoSorting(bool); void setAlphaThreshold(const float); // the following set()'s operate on the last added texture void addTexture(const std::string&); void setTexture(const std::string&); void setTextureLocal(int texid, const std::string& localname); void setTextureMatrix(int); void setCombineMode(int); void setUseTextureAlpha(bool); void setUseColorOnTexture(bool); void setUseSphereMap(bool); void clearTextures(); // remove all textures void addShader(const std::string&); void setShader(const std::string&); void clearShaders(); // remove all shaders // // Parameter getting // const std::string& getName() const; const std::vector& getAliases() const; int getDynamicColor() const; const float* getAmbient() const; const float* getDiffuse() const; const float* getSpecular() const; const float* getEmission() const; float getShininess() const; bool getOccluder() const; bool getGroupAlpha() const; bool getNoRadar() const; bool getNoShadow() const; bool getNoCulling() const; bool getNoSorting() const; bool getNoLighting() const; float getAlphaThreshold() const; int getTextureCount() const; const std::string& getTexture(int) const; const std::string& getTextureLocal(int) const; int getTextureMatrix(int) const; int getCombineMode(int) const; bool getUseTextureAlpha(int) const; bool getUseColorOnTexture(int) const; bool getUseSphereMap(int) const; int getShaderCount() const; const std::string& getShader(int) const; // // Utilities // bool isInvisible() const; int packSize() const; void *pack(void *) const; void *unpack(void *); void print(std::ostream& out, const std::string& indent) const; void printMTL(std::ostream& out, const std::string& indent) const; static const BzMaterial* getDefault(); // data private: std::string name; std::vector aliases; bool referenced; int dynamicColor; float ambient[4]; float diffuse[4]; float specular[4]; float emission[4]; float shininess; bool occluder; bool groupAlpha; bool noRadar; bool noShadow; bool noCulling; bool noSorting; bool noLighting; float alphaThreshold; enum CombineModes { replace = 0, modulate, decal, blend, add, combine }; int textureCount; typedef struct { std::string name; std::string localname; int matrix; int combineMode; bool useAlpha; bool useColor; bool useSphereMap; } TextureInfo; TextureInfo* textures; int shaderCount; typedef struct { std::string name; } ShaderInfo; ShaderInfo* shaders; private: static std::string nullString; static BzMaterial defaultMaterial; }; inline const BzMaterial* BzMaterial::getDefault() { return &defaultMaterial; } inline void BzMaterial::setReference() { referenced = true; return; } inline bool BzMaterial::getReference() const { return referenced; } class BzMaterialManager { public: BzMaterialManager(); ~BzMaterialManager(); void update(); void clear(); const BzMaterial* addMaterial(const BzMaterial* material); const BzMaterial* findMaterial(const std::string& name) const; const BzMaterial* getMaterial(int id) const; int getIndex(const BzMaterial* material) const; typedef std::set TextureSet; void makeTextureList(TextureSet& set, bool referenced) const; void setTextureLocal(const std::string& url, const std::string& local); void* pack(void*); void* unpack(void*); int packSize(); void print(std::ostream& out, const std::string& indent) const; void printMTL(std::ostream& out, const std::string& indent) const; void printReference(std::ostream& out, const BzMaterial* mat) const; private: std::vector materials; }; extern BzMaterialManager MATERIALMGR; #endif // BZ_MATERIAL_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzPNG.h000066400000000000000000000027141200563112200161570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CREATE_PNG_H #define CREATE_PNG_H #include "common.h" // system interface #include #include namespace BzPNG { struct Chunk { Chunk() {} Chunk(const std::string& t, const std::string& d) : type(t), data(d) {} Chunk(const std::string& t, // for tEXt chunks const std::string& keyword, const std::string& text) : type(t) , data(keyword + std::string(1, 0) + text) {} std::string type; // must be 4 bytes std::string data; }; /** Create a PNG image, string starts with "ERROR" if there's an error */ std::string create(const std::vector& extraChunks, size_t sx, size_t sy, size_t channels, const void* pixels); /** Save a PNG image */ bool save(const std::string& filename, const std::vector& extraChunks, size_t sx, size_t sy, size_t channels, const void* pixels); } #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfDisplay.h000066400000000000000000000045331200563112200173070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BzfDisplay: * Encapsulates a display -- input and output devices. */ #ifndef BZF_DISPLAY_H #define BZF_DISPLAY_H #include "common.h" class BzfEvent; class BzfDisplay { public: BzfDisplay(); virtual ~BzfDisplay(); virtual bool isValid() const = 0; virtual bool isEventPending() const = 0; virtual bool getEvent(BzfEvent&) const = 0; virtual bool peekEvent(BzfEvent&) const = 0; virtual bool hasGetKeyMode() {return false;}; virtual void getModState(bool &shift, bool &control, bool &alt) { shift = false; control = false; alt = false;}; int getWidth() const; int getHeight() const; void setFullScreenFormat(int); void setPassthroughSize(int w, int h); int getPassthroughWidth() const; int getPassthroughHeight() const; public: class ResInfo { public: ResInfo(const char* name, int w, int h, int r); ~ResInfo(); public: char* name; int width; int height; int refresh; }; int getNumResolutions() const; const ResInfo* getResolution(int index) const; int getResolution() const; int getDefaultResolution() const; bool setResolution(int index); bool setDefaultResolution(); int findResolution(const char* name) const; bool isValidResolution(int index) const; protected: void initResolutions(ResInfo**, int num, int current); private: BzfDisplay(const BzfDisplay&); BzfDisplay& operator=(const BzfDisplay&); virtual bool doSetResolution(int) = 0; virtual bool doSetDefaultResolution(); private: int passWidth, passHeight; int numResolutions; int defaultResolution; int currentResolution; ResInfo** resolutions; protected: int modeIndex; }; #endif // BZF_DISPLAY_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfEvent.h000066400000000000000000000105731200563112200167640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BzfEvent: * Abstract, platform independent base for OpenGL windows. */ #ifndef BZF_EVENT_H #define BZF_EVENT_H #include "common.h" class BzfWindow; class BzfQuitEvent { public: }; class BzfMotionEvent { public: int x; int y; }; class BzfResizeEvent { public: int width; int height; }; class BzfMapEvent { public: }; class BzfUnmapEvent { public: }; class BzfKeyEvent { public: enum Button { NoButton = 0, Pause, /* Arrows + Home/End pad */ Home, End, Left, Right, Up, Down, PageUp, PageDown, Insert, /* Ascii character */ Backspace, Delete, /* Numeric keypad */ Kp0, Kp1, Kp2, Kp3, Kp4, Kp5, Kp6, Kp7, Kp8, Kp9, Kp_Period, Kp_Divide, Kp_Multiply, Kp_Minus, Kp_Plus, Kp_Enter, Kp_Equals, /* Function keys */ F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, /* Miscellaneous function keys */ Help, Print, Sysreq, Break, Menu, Power, Euro, Undo, /* Mouse buttons */ LeftMouse, MiddleMouse, RightMouse, WheelUp, WheelDown, MouseButton6, MouseButton7, MouseButton8, MouseButton9, MouseButton10, /* Joystick buttons */ BZ_Button_1, BZ_Button_2, BZ_Button_3, BZ_Button_4, BZ_Button_5, BZ_Button_6, BZ_Button_7, BZ_Button_8, BZ_Button_9, BZ_Button_10, BZ_Button_11, BZ_Button_12, BZ_Button_13, BZ_Button_14, BZ_Button_15, BZ_Button_16, BZ_Button_17, BZ_Button_18, BZ_Button_19, BZ_Button_20, BZ_Button_21, BZ_Button_22, BZ_Button_23, BZ_Button_24, BZ_Button_25, BZ_Button_26, BZ_Button_27, BZ_Button_28, BZ_Button_29, BZ_Button_30, BZ_Button_31, BZ_Button_32, BZ_Hatswitch_1_upleft, BZ_Hatswitch_1_up, BZ_Hatswitch_1_upright, BZ_Hatswitch_1_right, BZ_Hatswitch_1_downright, BZ_Hatswitch_1_down, BZ_Hatswitch_1_downleft, BZ_Hatswitch_1_left, BZ_Hatswitch_2_upleft, BZ_Hatswitch_2_up, BZ_Hatswitch_2_upright, BZ_Hatswitch_2_right, BZ_Hatswitch_2_downright, BZ_Hatswitch_2_down, BZ_Hatswitch_2_downleft, BZ_Hatswitch_2_left, BZ_Hatswitch_3_upleft, BZ_Hatswitch_3_up, BZ_Hatswitch_3_upright, BZ_Hatswitch_3_right, BZ_Hatswitch_3_downright, BZ_Hatswitch_3_down, BZ_Hatswitch_3_downleft, BZ_Hatswitch_3_left, BZ_Hatswitch_4_upleft, BZ_Hatswitch_4_up, BZ_Hatswitch_4_upright, BZ_Hatswitch_4_right, BZ_Hatswitch_4_downright, BZ_Hatswitch_4_down, BZ_Hatswitch_4_downleft, BZ_Hatswitch_4_left, LastButton // special marker that must be last }; enum { ShiftKey = 1, ControlKey = 2, AltKey = 4 }; char ascii; int button; int shift; }; class BzfEvent { public: enum Type { Unset, Quit, Redraw, Resize, Map, Unmap, MouseMove, KeyUp, KeyDown }; Type type; BzfWindow* window; union { public: BzfQuitEvent quit; BzfResizeEvent resize; BzfMotionEvent mouseMove; BzfMapEvent map; BzfUnmapEvent unmap; BzfKeyEvent keyUp; BzfKeyEvent keyDown; }; BzfEvent() : type(Unset), window((BzfWindow*)NULL) { mouseMove.x=mouseMove.y=resize.width=resize.height=keyUp.ascii=keyUp.button=keyUp.shift=0; } }; #endif /* BZF_EVENT_H */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfJoystick.h000066400000000000000000000077061200563112200175060ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BzfJoystick: * Abstract, platform independent base for Joysticks. */ #ifndef BZF_JOYSTICK_H #define BZF_JOYSTICK_H #if defined(_MSC_VER) #pragma warning(disable: 4786) #endif #include "common.h" #include #include class BzfJoystick { public: BzfJoystick(); virtual ~BzfJoystick(); virtual void initJoystick(const char* joystickName); virtual bool joystick() const; virtual void getJoy(int& x, int& y); virtual int getNumHats(); virtual void getJoyHat(int hat, float &hatX, float &hatY); virtual unsigned long getJoyButtons(); virtual void getJoyDevices(std::vector &list) const; /** Return a list of axes belonging to the joystick. The first and second ** are assumed to be default X and Y axes, respectively. **/ virtual void getJoyDeviceAxes(std::vector &list) const; virtual void setXAxis(const std::string &axis); virtual void setYAxis(const std::string &axis); /* Rumble force feedback support - a motor in the controller vibrates it, * as tactile feedback for explosions, collisions, engines starting, death, * that sort of thing. * * A device that supports rumble will return true from ffHasRumble(), * and ffRumble() will start playing a force feedback effect. For devices * lacking rumble, ffRumble() is a no-op. * * Our rumble interface follows the precedent set by Linux's FF_RUMBLE. * The joypad can have up to two motors, named the 'weak' motor and the * 'strong' motor. The 'strong' motor is typical of what's found in console * gaming systems, while the 'weak' motor is for more subtle vibration * effects. The strength of each motor is specified as a value in the * range [0,1]. * * The effect starts after the given delay in seconds, runs for a duration * also in seconds, and repeats a total of 'count' times. Currently only * one effect is supported at a time, so using a count of zero will cancel * any rumble that may be in progress. */ virtual bool ffHasRumble() const; virtual void ffRumble(int count, float delay, float duration, float strong_motor, float weak_motor=0.0f); /* Directional force feedback support - the controller pulls or pushes in * a certain direction with a certain amount of force. * * Currently this is fairly complete, basically we support most types of * periodic effects, resistance forces, and constant forces. Compound effects, * ramped forces, and enveloped effects are not supported at this time. */ enum PeriodicType { FF_Sine = 0, FF_Square, FF_Triangle, FF_SawtoothUp, FF_SawtoothDown }; enum ResistanceType { FF_Position = 0, FF_Velocity, FF_Acceleration }; virtual bool ffHasDirectional() const; virtual void ffDirectionalConstant(int count, float delay, float duration, float x_direction, float y_direction, float strength); virtual void ffDirectionalPeriodic(int count, float delay, float duration, float x_direction, float y_direction, float amplitude, float period, PeriodicType type); virtual void ffDirectionalResistance(float time, float coefficient, float saturation, ResistanceType type); }; #endif // BZF_JOYSTICK_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfMedia.h000066400000000000000000000137141200563112200167220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZFMEDIA_H__ #define __BZFMEDIA_H__ #include "common.h" #include #include static const std::string DEFAULT_MEDIA_DIR = "data"; /** BzfMedia is a helper class that will read in audio and image * data files. It's an abstract, platform independant base for * media I/O. * * if HALF_RATE_AUDIO defined then use half the normal audio sample * rate (and downsample the audio files to match). this reduces the * demands on the system. * #define HALF_RATE_AUDIO * * if NO_AUDIO_THREAD defined then play audio in the same thread as * the main playing loop. note that not all platforms support this; * those platforms will use a separate thread regardless. * * some platforms don't context switch well enough for the real * time demands of audio. but be aware that running audio in the * main thread is fraught with peril. * #define NO_AUDIO_THREAD */ class BzfMedia { public: BzfMedia(); virtual ~BzfMedia(); // get and set default directory to look for media files in std::string getMediaDirectory() const; virtual void setMediaDirectory(const std::string&); // images are stored RGBARGBA..., left to right, bottom to top. // depth indicates how many channels were in the stored image. // use delete[] to release the returned memory. unsigned char* readImage(const std::string& filename, int& width, int& height, int& depth) const; // sounds are stored as left, right, left, right ..., values are // in the range -1 to 1. numFrames returns the number of left,right // pairs. rate is in frames per second. use delete[] to release // the returned memory. float* readSound(const std::string& filename, int& numFrames, int& rate) const; // sleep for given number of seconds virtual double stopwatch(bool start); // initialize the audio subsystem. return true iff successful. virtual bool openAudio() = 0; // close the audio subsystem virtual void closeAudio() = 0; // start a thread for audio processing and call proc in that thread. // data is passed to the proc function. return true iff the thread // was started successfully. virtual bool startAudioThread(void (*proc)(void*), void* data) = 0; // stop the audio thread virtual void stopAudioThread() = 0; // returns true if audio is running in a separate thread virtual bool hasAudioThread() const = 0; // register a callback for audio processing. The passed procedure will be // called whenever audio needs to be filled virtual void startAudioCallback(bool (*)(void)) {}; // returns true if audio is running via callback virtual bool hasAudioCallback() const {return false;}; // append a command to the sound effect command queue virtual void writeSoundCommand(const void*, int length) = 0; // read the next command from the sound effect command queue. // return immediately with false if no command is ready. // otherwise read the command and return true if successful. virtual bool readSoundCommand(void*, int length) = 0; // returns the output rate (in frames per second); virtual int getAudioOutputRate() const = 0; // returns the number of frames in the whole audio buffer virtual int getAudioBufferSize() const = 0; // returns the number of frames in each chunk of the audio buffer virtual int getAudioBufferChunkSize() const = 0; // return true iff the audio buffer is getting too low virtual bool isAudioTooEmpty() const = 0; // append sound samples to end of audio output buffer. this // method should return immediately, if possible. virtual void writeAudioFrames(const float* samples, int numFrames) = 0; // wait for the sound buffer to empty to the low water mark or // until a sound effect command is pending or until maxTime // seconds have passed. if maxTime < 0, then do not timeout. // if !checkLowWater then don't check the low water mark. virtual void audioSleep(bool checkLowWater, double maxTime = -1.0) = 0; virtual void setDriver(std::string driverName); virtual void setDevice(std::string deviceName); virtual void audioDriver(std::string& driverName); protected: // return default extensions for image and sound files virtual std::string getImageExtension() const; virtual std::string getSoundExtension() const; // return NULL on failure virtual unsigned char* doReadImage(const std::string& filename, int& width, int& height, int& depth) const; // return NULL on failure virtual float* doReadSound(const std::string& filename, int& numFrames, int& rate) const; // concatenate directory to filename virtual std::string makePath(const std::string& dir, const std::string& filename) const; // replace (or add) extension to pathname std::string replaceExtension(const std::string& pathname, const std::string& extension) const; // return the position of the extension separator, or zero if // it cannot be found. virtual int findExtension(const std::string& pathname) const; std::string mediaDir; private: static int16_t getShort(const void*); static uint16_t getUShort(const void*); static int32_t getLong(const void*); static bool doReadVerbatim(FILE*, int, int, int, unsigned char*); static bool doReadRLE(FILE*, int, int, int, unsigned char*); }; #endif // __BZFMEDIA_H__ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfVisual.h000066400000000000000000000027111200563112200171410ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BzfVisual: * Abstract base for visuals (pixel format) suitable * for OpenGL contexts and windows. */ #ifndef BZF_VISUAL_H #define BZF_VISUAL_H #include "common.h" class BzfVisual { public: BzfVisual(); virtual ~BzfVisual(); virtual void setLevel(int level) = 0; virtual void setDoubleBuffer(bool) = 0; virtual void setIndex(int minDepth) = 0; virtual void setRGBA(int minRed, int minGreen, int minBlue, int minAlpha) = 0; virtual void setDepth(int minDepth) = 0; virtual void setStencil(int minDepth) = 0; virtual void setAccum(int minRed, int minGreen, int minBlue, int minAlpha) = 0; virtual void setStereo(bool) = 0; virtual void setMultisample(int minSamples) = 0; virtual bool build() = 0; private: BzfVisual(const BzfVisual&); BzfVisual& operator=(const BzfVisual&); }; #endif // BZF_VISUAL_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/BzfWindow.h000066400000000000000000000051521200563112200171470ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZFWINDOW_H__ #define __BZFWINDOW_H__ #include "common.h" /* system headers */ #include class BzfDisplay; class BzfWindowCB { public: void (*cb)(void*); void* data; }; /** BzfWindow: * Abstract, platform independent base for OpenGL windows. */ class BzfWindow { public: BzfWindow(const BzfDisplay*); virtual ~BzfWindow(); const BzfDisplay* getDisplay() const { return display; } virtual bool isValid() const = 0; virtual void showWindow(bool) = 0; virtual void getPosition(int& x, int& y) = 0; virtual void getSize(int& width, int& height) const = 0; virtual void setTitle(const char*) = 0; virtual void setPosition(int x, int y) = 0; virtual void setSize(int width, int height) = 0; virtual void setMinSize(int width, int height) = 0; virtual void setFullscreen(bool) = 0; virtual void iconify(void) {;}; virtual bool create(void) {return true;}; virtual void warpMouse(int x, int y) = 0; virtual void getMouse(int& x, int& y) const = 0; virtual void grabMouse() = 0; virtual void ungrabMouse() = 0; virtual void enableGrabMouse(bool) {;}; virtual void showMouse() = 0; virtual void hideMouse() = 0; virtual void setGamma(float) = 0; virtual float getGamma() const = 0; virtual bool hasGammaControl() const = 0; virtual void makeCurrent() = 0; virtual void yieldCurrent(); virtual void releaseCurrent(); virtual void swapBuffers() = 0; virtual void makeContext() = 0; virtual void freeContext() = 0; void callExposeCallbacks() const; void addExposeCallback(void (*cb)(void*), void* data); void removeExposeCallback(void (*cb)(void*), void* data); void callResizeCallbacks() const; void addResizeCallback(void (*cb)(void*), void* data); void removeResizeCallback(void (*cb)(void*), void* data); private: const BzfDisplay* display; std::vector exposeCallbacks; std::vector resizeCallbacks; }; #endif /* __BZFWINDOW_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/CacheManager.h000066400000000000000000000027171200563112200175400ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CACHE_MANAGER_H #define CACHE_MANAGER_H #include #include #include class CacheManager { public: CacheManager(); ~CacheManager(); typedef struct { std::string url; time_t usedDate; std::string name; int size; time_t date; std::string key; } CacheRecord; bool isCacheFileType(const std::string &name) const; std::string getLocalName(const std::string &name) const; bool loadIndex(); bool saveIndex(); bool findURL(const std::string& url, CacheRecord& record); bool addFile(CacheRecord& rec, const void* data); std::vector getCacheList() const; void limitCacheSize(); private: int findRecord(const std::string& url); private: std::string indexName; std::vector records; }; extern CacheManager CACHEMGR; #endif /* * Local Variables: *** * mode:C *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/CallbackList.h000066400000000000000000000070011200563112200175610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_CALLBACK_LIST_H #define BZF_CALLBACK_LIST_H // system headers #include #include #include // local implementation headers #include "common.h" template class CallbackList { public: typedef bool (*Callback)(F, void* userData, void* iterateUserData); CallbackList(); ~CallbackList(); // add/remove callback. adding an existing callback has no effect. void add(F func, void* userData); void remove(F func, void* userData); // iterate over callbacks. this is done by invoking the given // callback function for each stored callback. it is safe to // add and remove callbacks during iteration. stops iterating // if the callback returns false. void iterate(Callback, void* userData) const; private: void doIterate(Callback, void* userData); private: typedef std::pair Item; typedef std::list ItemList; typedef std::map ItemMap; ItemList items; ItemMap itemMap; }; // // CallbackList // template CallbackList::CallbackList() { // do nothing } template CallbackList::~CallbackList() { // do nothing } template void CallbackList::add(F callback, void* userData) { Item item = std::make_pair(callback, userData); if (itemMap.find(item) == itemMap.end()) { typename ItemList::iterator index = items.insert(items.end(), item); itemMap.insert(std::make_pair(item, index)); } } template void CallbackList::remove(F callback, void* userData) { Item item = std::make_pair(callback, userData); typename ItemMap::iterator index = itemMap.find(item); if (index != itemMap.end()) { items.erase(index->second); itemMap.erase(index); } } template void CallbackList::iterate(Callback callback, void* userData) const { const_cast*>(this)->doIterate(callback, userData); } template void CallbackList::doIterate(Callback callback, void* userData) { // insert a dummy item into the list. this is our safe harbor // in case the list is modified while we're iterating over it. // the dummy item will remain no matter what other changes // occur to the list. as we invoke each callback we move the // dummy item forward. Item dummyItem = std::make_pair((F)NULL, (void*)NULL); typename ItemList::iterator dummyIndex = items.insert(items.begin(), dummyItem); // now invoke each callback typename ItemList::iterator index = dummyIndex; for (; ++index != items.end(); index = dummyIndex) { // move dummy past the item we're about to invoke items.splice(dummyIndex, items, index); // invoke callback. skip dummy items (any item with a NULL function). // stop if a callback returns false. if (index->first != NULL) if (!callback(index->first, index->second, userData)) break; } // now remove the dummy item items.erase(dummyIndex); } #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/CollisionManager.h000066400000000000000000000110701200563112200204600ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COLLISION_GRID__ #define __COLLISION_GRID__ #include "common.h" // system headers #include // common headers #include "Extents.h" class Ray; class Obstacle; class MeshObstacle; class BoxBuilding; class PyramidBuilding; class BaseBuilding; class Teleporter; typedef struct { int count; Obstacle** list; } ObsList; typedef union { ObsList array[6]; struct { ObsList boxes; ObsList bases; ObsList pyrs; ObsList teles; ObsList faces; ObsList meshes; } named; } SplitObsList; typedef struct { int count; class ColDetNode** list; } ColDetNodeList; // well you know my name is Simon, and I like to do drawings typedef void (*DrawLinesFunc) (int pointCount, float (*points)[3], int color); class CollisionManager { public: CollisionManager(); ~CollisionManager(); void load (); void clear (); // some basics bool needReload() const; // octree parameter has changed int getObstacleCount() const; // total number of obstacles const Extents& getWorldExtents() const; // test against an axis aligned bounding box const ObsList* axisBoxTest (const Extents& extents); // test against a cylinder const ObsList* cylinderTest (const float *pos, float radius, float height) const; // test against a box const ObsList* boxTest (const float* pos, float angle, float dx, float dy, float dz) const; // test against a moving box const ObsList* movingBoxTest (const float* oldPos, float oldAngle, const float* pos, float angle, float dx, float dy, float dz) const; // test against a Ray const ObsList* rayTest (const Ray* ray, float timeLeft) const; // test against a Ray (and return a list of ColDetNodes) const ColDetNodeList* rayTestNodes (const Ray* ray, float timeLeft) const; // test against a box and return a split list //const SplitObsList *boxTestSplit (const float* pos, float angle, // float dx, float dy, float dz) const; // drawing function void draw (DrawLinesFunc drawLinesFunc); private: void setExtents(ObsList* list); // gather the extents class ColDetNode* root; // the root of the octree float worldSize; Extents gridExtents; Extents worldExtents; }; extern CollisionManager COLLISIONMGR; class ColDetNode { public: ColDetNode(unsigned char depth, const Extents& exts, ObsList *fullList); ~ColDetNode(); int getCount() const; const ObsList* getList() const; const Extents& getExtents() const; float getInTime() const; float getOutTime() const; // these fill in the FullList return list void axisBoxTest (const Extents& extents) const; void boxTest (const float* pos, float angle, float dx, float dy, float dz) const; void rayTest (const Ray* ray, float timeLeft) const; void rayTestNodes (const Ray* ray, float timeLeft) const; // this fills in the SplitList return list // (FIXME: not yet implemented, boxTestSplit might be useful for radar) //void boxTestSplit (const float* pos, float angle, float dx, float dy, float dz) const; void tallyStats(); void draw(DrawLinesFunc drawLinesFunc); private: void makeChildren (); void resizeCell (); unsigned char depth; int count; Extents extents; unsigned char childCount; ColDetNode* children[8]; ObsList fullList; mutable float inTime, outTime; }; inline int ColDetNode::getCount() const { return count; } inline const ObsList* ColDetNode::getList() const { return &fullList; } inline const Extents& ColDetNode::getExtents() const { return extents; } inline float ColDetNode::getInTime() const { return inTime; } inline float ColDetNode::getOutTime() const { return outTime; } inline int CollisionManager::getObstacleCount() const { if (root == NULL) { return 0; } else { return root->getCount(); } } inline const Extents& CollisionManager::getWorldExtents() const { return worldExtents; } #endif /* __COLLISION_GRID__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/CommandManager.h000066400000000000000000000046531200563112200201140ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COMMANDMANAGER_H__ #define __COMMANDMANAGER_H__ #include "common.h" /* system interface headers */ #include #include #include /* common interface headers */ #include "common.h" #include "Singleton.h" #define CMDMGR (CommandManager::instance()) class CommandManager : public Singleton { public: CommandManager(); ~CommandManager(); // type of function that implements command. function should return // a string with the output of the command (or the empty string if // there's no output). typedef std::vector ArgList; typedef std::string (*CommandFunction)(const std::string& name, const ArgList&, bool* error); typedef void (*Callback)(const std::string& name, void* userData); // add/replace a command handler void add(const std::string& name, CommandFunction, const std::string& help); // remove a command handler void remove(const std::string& name); // get the help string for a command std::string getHelp(const std::string& name) const; // execute a command std::string run(const std::string& name, const ArgList& args, bool *ret = NULL) const; // parse and execute a command std::string run(const std::string& cmd, bool *ret = NULL) const; // invoke the callback for each registered command void iterate(Callback, void* userData) const; private: static const char* readValue(const char* string, std::string* value); static const char* readUnquoted(const char* string, std::string* value); static const char* readQuoted(const char* string, std::string* value); static const char* skipWhitespace(const char* string); struct CmdInfo { public: CommandFunction func; std::string help; }; typedef std::map Commands; Commands commands; }; #endif /* __COMMANDMANAGER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/CommandsStandard.h000066400000000000000000000020701200563112200204540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COMMANDSSTANDARD_H__ #define __COMMANDSSTANDARD_H__ /* common interface headers */ #include "CommandManager.h" struct CommandsItem { public: const char* name; CommandManager::CommandFunction func; const char* help; }; extern const struct CommandsItem commands[]; /** standard commands */ class CommandsStandard { public: static void add(); static void remove(); static void quit(); static bool isQuit(); }; #endif /* __COMMANDSSTANDARD_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ConeObstacle.h000066400000000000000000000054141200563112200176000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ConeObstacle: * Encapsulates a cone in the game environment. */ #ifndef BZF_CONE_OBSTACLE_H #define BZF_CONE_OBSTACLE_H #include "common.h" #include #include "Obstacle.h" #include "MeshObstacle.h" #include "MeshTransform.h" #include "BzMaterial.h" class ConeObstacle : public Obstacle { public: enum { Edge, Bottom, StartFace, EndFace, MaterialCount }; ConeObstacle(); ConeObstacle(const MeshTransform& transform, const float* _pos, const float* _size, float _rotation, float _angle, const float _texsize[2], bool _useNormals, int _divisions, const BzMaterial* mats[MaterialCount], int physics, bool bounce, bool drive, bool shoot, bool ricochet); ~ConeObstacle(); Obstacle* copyWithTransform(const MeshTransform&) const; MeshObstacle* makeMesh(); const char* getType() const; static const char* getClassName(); // const bool isValid() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void finalize(); private: static const char* typeName; MeshTransform transform; int divisions; float sweepAngle; int phydrv; bool smoothBounce; bool useNormals; float texsize[2]; const BzMaterial* materials[MaterialCount]; }; #endif // BZF_CONE_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ConfigFileManager.h000066400000000000000000000035241200563112200205370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_CONFIG_FILE_MANAGER_H #define BZF_CONFIG_FILE_MANAGER_H #include #include "Singleton.h" #define CFGMGR (ConfigFileManager::instance()) void writeBZDB(const std::string& name, void *stream); void writeKEYMGR(const std::string& name, bool press, const std::string& command, void* stream); /** Reads in the config file. Opens up the file via FileManager, ships lines off to the CommandManager and handles default values in BZDB, */ class ConfigFileManager : public Singleton { public: /** Read a configuration file. read(filename) uses FileManager to open the stream and returns false if the file cannot be opened. they all call parse(). */ bool read(const std::string& filename); /** Read a configuration file. read(filename) uses FileManager to open the stream and returns false if the file cannot be opened. they all call parse(). */ void read(std::istream&); /** Write out a configuration file. Writes to a format that the CommandManager can understand */ bool write(const std::string& filename); protected: friend class Singleton; ConfigFileManager(); ~ConfigFileManager(); private: // parse a config file bool parse(std::istream&); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Country.h000066400000000000000000000051321200563112200166770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COUNTRY_H__ #define __COUNTRY_H__ #include "common.h" // system interface headers #include /** Representation of countries, including those described by ISO 3166 */ class Country { private: protected: static bool isValid(int country); static bool isValid(const std::string& country); public: Country(std::string); ~Country(); /** returns the ISO 3166 country code */ int number() const; /** returns the ISO 3166 country 2-char abbreviation */ std::string iso2() const; /** returns the ISO 3166 country 3-char abbreviation */ std::string iso3() const; /** returns the ISO 3166 country english name for display */ std::string englishName() const; /** returns the ISO 3166 country french name for display */ std::string frenchName() const; /** returns the ISO 3166 country code */ static int number(int country); static int number(const std::string& country); /** returns the ISO 3166 country 2-char abbreviation */ static std::string iso2(int country); static std::string iso2(const std::string& country); /** returns the ISO 3166 country 3-char abbreviation */ static std::string iso3(int country); static std::string iso3(const std::string& country); /** returns the ISO 3166 country english name for display */ static std::string englishName(int country); static std::string englishName(const std::string& country); /** returns the ISO 3166 country french name for display */ static std::string frenchName(int country); static std::string frenchName(const std::string& country); /* static const Country CANADA = Country("CA"); static const Country CHINA = Country("ZH"); static const Country FRANCE = Country("FR"); static const Country GERMANY = Country("DE"); static const Country ITALY = Country("IT"); static const Country JAPAN = Country("JP"); static const Country KOREA = Country("KO"); static const Country UK = Country("UK"); static const Country US = Country("US"); */ }; /* class Country */ #else class Country; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/DirectoryNames.h000066400000000000000000000022551200563112200201670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __DIRECTORY_NAMES_H__ #define __DIRECTORY_NAMES_H__ #include "common.h" /* interface system headers */ #include #ifndef _WIN32 const char DirectorySeparator = '/'; #else const char DirectorySeparator = '\\'; #endif extern std::string getConfigDirName( const char* versionName = NULL ); extern std::string getCacheDirName(); extern std::string getRecordDirName(); extern std::string getScreenShotDirName(); extern std::string getTempDirName(); extern std::string getWorldDirName(); extern void setCustomConfigDir ( const char *dir ); #endif // __DIRECTORY_NAMES_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/DynamicColor.h000066400000000000000000000057201200563112200176220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _DYNAMIC_COLOR_H_ #define _DYNAMIC_COLOR_H_ #include "common.h" /* system interface headers */ #include #include #include typedef struct sequenceList { float period; float offset; char* list; unsigned int count; } sequenceParams; typedef struct { float period; float offset; float weight; } sinusoidParams; typedef struct { float period; float offset; float width; } clampParams; class DynamicColor { public: DynamicColor(); ~DynamicColor(); enum SequenceState { colorMin = 0, colorMid = 1, colorMax = 2 }; bool setName(const std::string& name); void setLimits(int channel, float min, float max); void setSequence(int channel, float period, float offset, std::vector& list); void addSinusoid(int channel, const float sinusoid[3]); void addClampUp(int channel, const float clampUp[3]); void addClampDown(int channel, const float clampDown[3]); void finalize(); void update(double time); bool canHaveAlpha() const; const float* getColor() const; const std::string& getName() const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: static const float minPeriod; std::string name; float color[4]; typedef struct { float minValue, maxValue; float totalWeight; // tally of sinusoid weights sequenceParams sequence; std::vector sinusoids; std::vector clampUps; std::vector clampDowns; } ChannelParams; ChannelParams channels[4]; bool possibleAlpha; }; inline bool DynamicColor::canHaveAlpha() const { return possibleAlpha; } inline const float* DynamicColor::getColor() const { return color; } class DynamicColorManager { public: DynamicColorManager(); ~DynamicColorManager(); void update(); void clear(); int addColor(DynamicColor* dyncolor); int findColor(const std::string& name) const; const DynamicColor* getColor(int id) const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: std::vector colors; }; extern DynamicColorManager DYNCOLORMGR; #endif //_DYNAMIC_COLOR_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EighthDBaseSceneNode.h000066400000000000000000000031331200563112200211260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* EighthDBaseSceneNode: * Encapsulates information for rendering the eighth dimension * of a base building. */ #ifndef BZF_EIGHTHD_BASE_SCENE_NODE_H #define BZF_EIGHTHD_BASE_SCENE_NODE_H #include "common.h" #include "EighthDimSceneNode.h" class EighthDBaseSceneNode : public EighthDimSceneNode { public: EighthDBaseSceneNode(const float pos[3], const float size[3], float rotation); ~EighthDBaseSceneNode(); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class EighthDBaseRenderNode : public RenderNode { public: EighthDBaseRenderNode(const EighthDBaseSceneNode *, const float pos[3], const float size[3], float rotation); ~EighthDBaseRenderNode(); void render(); const GLfloat * getPosition() const { return sceneNode->getSphere(); } private: const EighthDBaseSceneNode *sceneNode; GLfloat corner[8][3]; }; private: OpenGLGState gstate; EighthDBaseRenderNode renderNode; }; #endif // BZF_EIGHTHD_BASE_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EighthDBoxSceneNode.h000066400000000000000000000031161200563112200210050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* EighthDBoxSceneNode: * Encapsulates information for rendering the eighth dimension * of a box building. */ #ifndef BZF_EIGHTHD_BOX_SCENE_NODE_H #define BZF_EIGHTHD_BOX_SCENE_NODE_H #include "common.h" #include "EighthDimSceneNode.h" class EighthDBoxSceneNode : public EighthDimSceneNode { public: EighthDBoxSceneNode(const float pos[3], const float size[3], float rotation); ~EighthDBoxSceneNode(); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class EighthDBoxRenderNode : public RenderNode { public: EighthDBoxRenderNode(const EighthDBoxSceneNode*, const float pos[3], const float size[3], float rotation); ~EighthDBoxRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const EighthDBoxSceneNode* sceneNode; GLfloat corner[8][3]; }; private: OpenGLGState gstate; EighthDBoxRenderNode renderNode; }; #endif // BZF_EIGHTHD_BOX_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EighthDPyrSceneNode.h000066400000000000000000000031221200563112200210240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* EighthDBoxSceneNode: * Encapsulates information for rendering the eighth dimension * of a pyramid building. */ #ifndef BZF_EIGHTHD_PYR_SCENE_NODE_H #define BZF_EIGHTHD_PYR_SCENE_NODE_H #include "common.h" #include "EighthDimSceneNode.h" class EighthDPyrSceneNode : public EighthDimSceneNode { public: EighthDPyrSceneNode(const float pos[3], const float size[3], float rotation); ~EighthDPyrSceneNode(); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class EighthDPyrRenderNode : public RenderNode { public: EighthDPyrRenderNode(const EighthDPyrSceneNode*, const float pos[3], const float size[3], float rotation); ~EighthDPyrRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const EighthDPyrSceneNode* sceneNode; GLfloat corner[5][3]; }; private: OpenGLGState gstate; EighthDPyrRenderNode renderNode; }; #endif // BZF_EIGHTHD_PYR_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EighthDimSceneNode.h000066400000000000000000000032161200563112200206630ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* EighthDimSceneNode: * Encapsulates information for rendering the eighth dimension */ #ifndef BZF_EIGHTH_DIM_SCENE_NODE_H #define BZF_EIGHTH_DIM_SCENE_NODE_H #include "common.h" #include "SceneNode.h" class EighthDimSceneNode : public SceneNode { public: ~EighthDimSceneNode(); bool cull(const ViewFrustum&) const; void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: EighthDimSceneNode(int numPolys); void setPolygon(int index, const GLfloat[3][3]); protected: class EighthDimRenderNode : public RenderNode { public: EighthDimRenderNode( const EighthDimSceneNode*, int numPolygons); ~EighthDimRenderNode(); void render(); void setPolygon(int index, const GLfloat[3][3]); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const EighthDimSceneNode* sceneNode; int numPolygons; GLfloat (*color)[4]; GLfloat (*poly)[3][3]; }; private: OpenGLGState gstate; EighthDimRenderNode renderNode; }; #endif // BZF_EIGHTH_DIM_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EighthDimShellNode.h000066400000000000000000000033011200563112200206700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* EighthDimShellNode: * Wraps a normal SceneNode within an inverted-view environment. */ #ifndef BZF_EIGHTH_DIM_SHELL_NODE_H #define BZF_EIGHTH_DIM_SHELL_NODE_H #include "common.h" #include "SceneNode.h" #include "OpenGLGState.h" class EighthDimShellNode : public SceneNode { public: EighthDimShellNode(SceneNode *sceneNode, bool ownTheNode); ~EighthDimShellNode(); bool cull(const ViewFrustum&) const; void addRenderNodes(SceneRenderer&); void notifyStyleChange(); protected: class ShellRenderNode : public RenderNode { public: ShellRenderNode(RenderNode *renderNode, const OpenGLGState* gstate); ~ShellRenderNode(); void render(); void renderShadow() { return; } const GLfloat* getPosition() const { return renderNode->getPosition(); } public: const OpenGLGState* getGState() const; private: OpenGLGState gstate; RenderNode* renderNode; }; private: void makeNodes(); void killNodes(); private: bool ownTheNode; SceneNode* sceneNode; int shellNodeCount; ShellRenderNode** shellNodes; }; #endif // BZF_EIGHTH_DIM_SHELL_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/EmptySceneNodeGenerator.h000066400000000000000000000016561200563112200217740ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __EMPTYSCENENODEGENERATOR_H__ #define __EMPTYSCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" class EmptySceneNodeGenerator : public ObstacleSceneNodeGenerator { public: virtual ~EmptySceneNodeGenerator(); virtual WallSceneNode* getNextNode(float uRepeats, float vRepeats, bool lod); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ErrorHandler.h000066400000000000000000000021461200563112200176250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * error handling functions */ #ifndef BZF_ERROR_HANDLER_H #define BZF_ERROR_HANDLER_H // common header first #include "common.h" // system headers #include #include // local implementation headers #include "common.h" #include "Bundle.h" typedef void (*ErrorCallback)(const char*); ErrorCallback setErrorCallback(ErrorCallback); void printError(const std::string &fmt, const std::vector *parms = NULL); void printFatalError(const char* fmt, ...); #endif // BZF_ERROR_HANDLER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Extents.h000066400000000000000000000077561200563112200167040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Extents * Encapsulates the data to record the minimum and maximum * values along each axis of an axis-aligned bounding box. */ #ifndef BZF_EXTENTS_H #define BZF_EXTENTS_H #include "common.h" class Extents { public: Extents(); Extents(const float mins[3], const float maxs[3]); void reset(); Extents& operator=(const Extents&); void set(const float mins[3], const float maxs[3]); void expandToBox(const Extents& box); // expand to contain the box void expandToPoint(const float[3]); // expand to contain the point void addMargin(float margin); // widen the extents by "margin" float getWidth(int axis) const; bool touches(const Extents& orig) const; bool contains(const Extents& orig) const; private: // force passing by reference Extents(const Extents& orig); public: float mins[3]; float maxs[3]; }; inline void Extents::reset() { mins[0] = mins[1] = mins[2] = +MAXFLOAT; maxs[0] = maxs[1] = maxs[2] = -MAXFLOAT; return; } inline void Extents::set(const float _mins[3], const float _maxs[3]) { mins[0] = _mins[0]; mins[1] = _mins[1]; mins[2] = _mins[2]; maxs[0] = _maxs[0]; maxs[1] = _maxs[1]; maxs[2] = _maxs[2]; return; } inline Extents::Extents() { reset(); return; } inline Extents::Extents(const float _mins[3], const float _maxs[3]) { set(_mins, _maxs); return; } inline Extents& Extents::operator=(const Extents& orig) { mins[0] = orig.mins[0]; mins[1] = orig.mins[1]; mins[2] = orig.mins[2]; maxs[0] = orig.maxs[0]; maxs[1] = orig.maxs[1]; maxs[2] = orig.maxs[2]; return *this; } inline void Extents::expandToBox(const Extents& test) { // test mins if (test.mins[0] < mins[0]) { mins[0] = test.mins[0]; } if (test.mins[1] < mins[1]) { mins[1] = test.mins[1]; } if (test.mins[2] < mins[2]) { mins[2] = test.mins[2]; } // test maxs if (test.maxs[0] > maxs[0]) { maxs[0] = test.maxs[0]; } if (test.maxs[1] > maxs[1]) { maxs[1] = test.maxs[1]; } if (test.maxs[2] > maxs[2]) { maxs[2] = test.maxs[2]; } return; } inline void Extents::expandToPoint(const float point[3]) { // test mins if (point[0] < mins[0]) { mins[0] = point[0]; } if (point[1] < mins[1]) { mins[1] = point[1]; } if (point[2] < mins[2]) { mins[2] = point[2]; } // test maxs if (point[0] > maxs[0]) { maxs[0] = point[0]; } if (point[1] > maxs[1]) { maxs[1] = point[1]; } if (point[2] > maxs[2]) { maxs[2] = point[2]; } return; } inline bool Extents::touches(const Extents& test) const { if ((mins[0] > test.maxs[0]) || (maxs[0] < test.mins[0]) || (mins[1] > test.maxs[1]) || (maxs[1] < test.mins[1]) || (mins[2] > test.maxs[2]) || (maxs[2] < test.mins[2])) { return false; } return true; } inline bool Extents::contains(const Extents& test) const { if ((mins[0] < test.mins[0]) && (maxs[0] > test.maxs[0]) && (mins[1] < test.mins[1]) && (maxs[1] > test.maxs[1]) && (mins[2] < test.mins[2]) && (maxs[2] > test.maxs[2])) { return true; } return false; } inline void Extents::addMargin(float margin) { // subtract from the mins mins[0] -= margin; mins[1] -= margin; mins[2] -= margin; // add to the maxs maxs[0] += margin; maxs[1] += margin; maxs[2] += margin; return; } inline float Extents::getWidth(int axis) const { return (maxs[axis] - mins[axis]); } #endif // BZF_EXTENTS_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/FileManager.h000066400000000000000000000043471200563112200174150ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_FILE_MANAGER_H #define BZF_FILE_MANAGER_H #include "common.h" #include #include "bzfio.h" #include "Singleton.h" #define FILEMGR (FileManager::instance()) /** Simple file management. This class provides functions to create stream objects, and provides some platform independence for files requiring directory names. */ class FileManager : public Singleton { public: /** Open an input stream. create an input stream for a file in the data directory. this will look in several places until it finds the file. if filename is an absolute path then only that place is checked. if the file cannot be found or isn't readable then NULL is returned. */ std::istream* createDataInStream(const std::string& filename, bool binary = false) const; /** Open an output stream. create an output stream in the data directory (or wherever indicated if filename is an absolute path). if the file can be opened for writing then NULL is returned. */ std::ostream* createDataOutStream(const std::string& filename, bool binary = false, bool truncate = true) const; /** Check for absolute path. returns true if the path is absolute, false if relative */ bool isAbsolute(const std::string& path) const; /** Concatenate directory names. concatenate two pathname components with a directory separator between them. */ std::string catPath(const std::string& a, const std::string& b) const; void setDataPath ( const std::string &s ) {dataPath = s;} protected: friend class Singleton; FileManager(); ~FileManager(); std::string dataPath; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Flag.h000066400000000000000000000205031200563112200161040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /** @file * Flags add some spice to the game. There are two kinds of flags: * team flags and super flags. Super flags come in two types: good * and bad. * * When playing a "capture the flag" style game, each team with at * least one player has a team flag which has the same color as the * team. A team flag will remain in the game as long as there is a * player on that team. A team flag may be picked up and freely * dropped at any time. It may be captured, which causes it to go * back to it's home position (centered in the team base). If a * flag is dropped by a hostile player in a third team's base, the * flag will go to the third team's flag safety position. For example, * if a Green Team player dropped the Red Flag on Blue's Base, the * Red Flag would go to the Blue Team's safety position. This is * because if it stayed in the Blue Base, any Red Team member who * picked it up would instantly have brought his team flag into * enemy territory and so blow up his whole team. * * A super flag causes the characteristics of the tank that possesses * it to change. A good super flag generally makes the tank more * powerful or deadly. A bad super flag generally does the opposite. * A good super flag may always be dropped. A bad super flag is * "sticky" which means that it can't be freely dropped. The server * may have some means of getting rid of a bad super flag (perhaps * by destroying an enemy or two or after waiting 20 seconds). * The creation and destruction of super flags is under the server's * control so super flags may appear and disappear seemingly at * random. */ #ifndef BZF_FLAG_H #define BZF_FLAG_H #include "common.h" /* system interface headers */ #include #include #include /* common interface headers */ #include "global.h" #include "Address.h" /** This enum says where a flag is. */ enum FlagStatus { /// the flag is not present in the world FlagNoExist = 0, /// the flag is sitting on the ground and can be picked up FlagOnGround, /// the flag is being carried by a tank FlagOnTank, /// the flag is falling through the air FlagInAir, /// the flag is entering the world FlagComing, /// the flag is leaving the world FlagGoing }; /** This enum tells us if the flag type is droppable, and what happens to it when it's droppped. */ enum FlagEndurance { /// permanent flag FlagNormal = 0, /// disappears after use FlagUnstable = 1, /// can't be dropped normally FlagSticky = 2 }; /** This enum tells the "quality" of the flag type, i.e. whether it's good or bad */ enum FlagQuality { FlagGood = 0, FlagBad = 1, NumQualities }; /** This enum says if the flag type gives the carrier a special shooting ability. */ enum ShotType { NormalShot = 0, SpecialShot = 1 }; const int FlagPLen = 6 + PlayerIdPLen + 48; class FlagType; typedef std::map FlagTypeMap; typedef std::set FlagSet; #define FlagPackSize 2 /** This class represents a flagtype, like "GM" or "CL". */ class FlagType { public: FlagType( const std::string& name, const std::string& abbv, FlagEndurance _endurance, ShotType sType, FlagQuality quality, TeamColor team, const std::string& help, bool _custom = false ) : flagName(name), flagAbbv(abbv), flagHelp(help) { endurance = _endurance; flagShot = sType; flagQuality = quality; flagTeam = team; custom = _custom; /* allocate flagset array on first use to work around mipspro * std::set compiler bug of making flagSets a fixed array. */ if (flagSets == NULL) { flagSets = new FlagSet[NumQualities]; } if (custom) customFlags.insert(this); flagSets[flagQuality].insert(this); getFlagMap()[flagAbbv] = this; } /** returns a label of flag name and abbreviation with the flag name * excentuating the abbreviation if relevant. */ const std::string label() const; /** returns information about a flag including the name, abbreviation, and * description. format is "name ([+|-]abbrev): description" where +|- * indicates whether the flag is inherently good or bad by default. */ const std::string information() const; /** returns the color of the flag */ const float* getColor() const; /** network serialization */ void* pack(void* buf) const; void* fakePack(void* buf) const; void* packCustom(void* buf) const; /** network deserialization */ static void* unpack(void* buf, FlagType* &desc); static void* unpackCustom(void* buf, FlagType* &desc); /** Static wrapper function that makes sure that the flag map is * initialized before it's used. */ static FlagTypeMap& getFlagMap(); const std::string flagName; const std::string flagAbbv; const std::string flagHelp; FlagEndurance endurance; FlagQuality flagQuality; ShotType flagShot; TeamColor flagTeam; bool custom; static FlagSet *flagSets; static FlagSet customFlags; static const int packSize; }; /** This class represents an actual flag. It has functions for serialization and deserialization as well as static functions that returns sets of all good or bad flags, and maps flag abbreviations to FlagType objects. */ class Flag { public: /** This function serializes this object into a @c void* buffer for network transfer. */ void* pack(void*) const; /** This function serializes this object into a @c void* buffer for network transfer. */ void* fakePack(void*) const; /** This function uses the given serialization to set the member variables of this object. This really hide the type of flag */ void* unpack(void*); /** This function returns a set of all good flagtypes that are available in the game. @see FlagType @see FlagQuality */ static FlagSet& getGoodFlags(); /** This function returns a set of all bad flagtypes that are available in the game. @see FlagType @see FlagQuality */ static FlagSet& getBadFlags(); /** This function returns a pointer to the FlagType object that is associated with the given abbreviation. If there is no such FlagType object, NULL is returned. */ static FlagType* getDescFromAbbreviation(const char* abbreviation); FlagType* type; FlagStatus status; FlagEndurance endurance; PlayerId owner; // who has flag float position[3]; // position on ground float launchPosition[3]; // position flag launched from float landingPosition[3]; // position flag will land float flightTime; // flight time so far float flightEnd; // total duration of flight float initialVelocity; // initial launch velocity }; /** Flags no longer use enumerated IDs. Over the wire, flags are all represented by their abbreviation, null-padded to two bytes. Internally, flags are now represented by pointers to singleton FlagType classes. For more information about these flags, see Flag.cxx where these FlagType instances are created. */ namespace Flags { extern FlagType *Null, *RedTeam, *GreenTeam, *BlueTeam, *PurpleTeam, *Velocity, *QuickTurn, *OscillationOverthruster, *RapidFire, *MachineGun, *GuidedMissile, *Laser, *Ricochet, *SuperBullet, *InvisibleBullet, *Stealth, *Tiny, *Narrow, *Shield, *Steamroller, *ShockWave, *PhantomZone, *Genocide, *Jumping, *Identify, *Cloaking, *Useless, *Masquerade, *Seer, *Thief, *Burrow, *Wings, *ReverseControls, *Agility, *Colorblindness, *Obesity, *LeftTurnOnly, *RightTurnOnly, *Momentum, *Blindness, *Jamming, *WideAngle, *NoJumping, *TriggerHappy, *ReverseOnly, *ForwardOnly, *Bouncy; /** This function initializes all the FlagType objects in the Flags namespace. */ void init(); void kill(); /** Clear all the custom flags (i.e. when switching servers) */ void clearCustomFlags(); } #endif // BZF_FLAG_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/FlagSceneNode.h000066400000000000000000000041311200563112200176670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* FlagSceneNode: * Encapsulates information for rendering a flag. */ #ifndef BZF_FLAG_SCENE_NODE_H #define BZF_FLAG_SCENE_NODE_H #include "common.h" #include "SceneNode.h" const int maxChunks = 20; class FlagSceneNode : public SceneNode { public: FlagSceneNode(const GLfloat pos[3]); ~FlagSceneNode(); static void waveFlag(float dt); static void freeFlag(); void move(const GLfloat pos[3]); void setAngle(GLfloat angle); void setWind(const GLfloat wind[3], float dt); void setBillboard(bool billboard); const GLfloat* getColor() const { return color; } void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void setTexture(const int); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); bool cullShadow(int planeCount, const float (*planes)[4]) const; protected: class FlagRenderNode : public RenderNode { public: FlagRenderNode(const FlagSceneNode*); ~FlagRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const FlagSceneNode* sceneNode; int waveReference; }; friend class FlagRenderNode; private: bool billboard; GLfloat angle; GLfloat tilt; GLfloat hscl; GLfloat color[4]; bool transparent; bool texturing; OpenGLGState gstate; FlagRenderNode renderNode; }; #endif // BZF_FLAG_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/FlagWarpSceneNode.h000066400000000000000000000032201200563112200205170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* FlagWarpSceneNode: * Encapsulates information for rendering the little cloud * that appears when a flag is coming or going. */ #ifndef BZF_FLAG_WARP_SCENE_NODE_H #define BZF_FLAG_WARP_SCENE_NODE_H #include "common.h" #include "SceneNode.h" class FlagWarpSceneNode : public SceneNode { public: FlagWarpSceneNode(const GLfloat pos[3]); ~FlagWarpSceneNode(); void setSizeFraction(GLfloat); GLfloat getDistance(const GLfloat*) const; void move(const GLfloat pos[3]); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class FlagWarpRenderNode : public RenderNode { public: FlagWarpRenderNode(const FlagWarpSceneNode*); ~FlagWarpRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const FlagWarpSceneNode* sceneNode; }; friend class FlagWarpRenderNode; private: GLfloat size; OpenGLGState gstate; FlagWarpRenderNode renderNode; static const GLfloat color[7][3]; }; #endif // BZF_FLAG_WARP_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/FontManager.h000066400000000000000000000060161200563112200174370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _FONT_MANAGER_H_ #define _FONT_MANAGER_H_ #ifdef _MSC_VER #pragma warning(disable : 4786) // Disable warning message #endif #include #include #include #include "Singleton.h" #include "bzfgl.h" #include "AnsiCodes.h" class ImageFont; typedef std::map FontSizeMap; typedef std::vector FontFaceList; typedef std::map FontFaceMap; class FontManager : public Singleton { public: FontManager(); ~FontManager(); void loadAll(std::string dir); void clear(); void rebuild(void); int getFaceID(std::string faceName); int getNumFaces(void); const char* getFaceName(int faceID); void drawString(float x, float y, float z, int faceID, float size, const std::string &text, const float* resetColor = NULL); void drawString(float x, float y, float z, const std::string &face, float size, const std::string &text, const float* resetColor = NULL); float getStrLength(int faceID, float size, const std::string &text, bool alreadyStripped = false); float getStrLength(const std::string &face, float size, const std::string &text, bool alreadyStripped = false); float getStrHeight(int faceID, float size, const std::string &text); float getStrHeight(std::string face, float size, const std::string &text); void setDimFactor(float newDimFactor); void setOpacity(float newOpacity); void setDarkness(float newDimFactor); void unloadAll(void); protected: friend class Singleton; private: void getPulseColor(const GLfloat* color, GLfloat* pulseColor) const; ImageFont* getClosestSize(int faceID, float size, bool bigger); ImageFont* getClosestRealSize(int faceID, float desiredSize, float &actualSize); FontFaceMap faceNames; FontFaceList fontFaces; std::string fontDirectory; float opacity; float dimFactor; // ANSI code dimming float darkness; // darkening of all colors static void callback(const std::string& name, void *); static void freeContext(void *data); static void initContext(void *data); static GLfloat underlineColor[4]; bool canScale; }; inline void FontManager::setDimFactor(float newDimFactor) { dimFactor = newDimFactor; } inline void FontManager::setOpacity(float newOpacity) { opacity = newOpacity; underlineColor[3] = opacity; } inline void FontManager::setDarkness(float newDarkness) { darkness = newDarkness; } #endif //_FONT_MANAGER_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Frustum.h000066400000000000000000000070041200563112200167010ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Frustum * Encapsulates a camera. */ #ifndef BZF_FRUSTUM_H #define BZF_FRUSTUM_H #include "common.h" // FIXME -- will need a means for off center projections for // looking through teleporters class Frustum { public: Frustum(); ~Frustum(); const float* getEye() const; const float* getDirection() const; const float* getUp() const; const float* getRight() const; const float* getSide(int index) const; int getPlaneCount() const; const float* getFarCorner(int index) const; float getTilt() const; // degrees float getRotation() const; // degrees float getNear() const; float getFar() const; const float* getViewMatrix() const; float getFOVx() const; float getFOVy() const; const float* getProjectionMatrix() const; float getEyeDepth(const float*) const; float getAreaFactor() const; void setView(const float* eye, const float* target); void setProjection(float fov, float m_near, float m_far, float m_deep_far, int width, int height, int viewHeight); void setOffset(float eyeOffset, float focalPlane); void setFarPlaneCull(bool useCulling); void flipVertical(); void flipHorizontal(); // used for radar culling void setOrthoPlanes(const Frustum& view, float width, float breadth); protected: void makePlane(const float* v1, const float* v2, int); protected: float eye[3]; float target[3]; float right[3], up[3]; float plane[6][4]; // pointing in int planeCount; float farCorner[4][3]; float tilt; float rotation; float viewMatrix[16]; float billboardMatrix[16]; float m_near, m_far; float fovx, fovy; float areaFactor; float projectionMatrix[16]; float deepProjectionMatrix[16]; }; // // Frustum // inline const float* Frustum::getEye() const { return eye; } inline const float* Frustum::getDirection() const { return plane[0]; } inline const float* Frustum::getSide(int index) const { return plane[index]; } inline int Frustum::getPlaneCount() const { return planeCount; } inline const float* Frustum::getFarCorner(int index) const { return farCorner[index]; } inline float Frustum::getTilt() const { return tilt; } inline float Frustum::getRotation() const { return rotation; } inline const float* Frustum::getUp() const { return up; } inline const float* Frustum::getRight() const { return right; } inline float Frustum::getNear() const { return m_near; } inline float Frustum::getFar() const { return m_far; } inline float Frustum::getFOVx() const { return fovx; } inline float Frustum::getFOVy() const { return fovy; } inline const float* Frustum::getViewMatrix() const { return viewMatrix; } inline const float* Frustum::getProjectionMatrix() const { return projectionMatrix; } inline float Frustum::getAreaFactor() const { return areaFactor; } #endif // BZF_FRUSTUM_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/GLCollect.h000066400000000000000000000015241200563112200170450ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef GLCOLLECT_H #define GLCOLLECT_H #include "bzfgl.h" class GLCollect { public: GLCollect( GLenum en ); ~GLCollect(); private: GLCollect( const GLCollect &c ); GLCollect& operator=( const GLCollect &c ); static int count; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/GameTime.h000066400000000000000000000020341200563112200167220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /** * GameTime: * Manages the network time. * Time is stored as microseconds since the epoch. */ #ifndef BZF_GAME_TIME_H #define BZF_GAME_TIME_H #include "common.h" namespace GameTime { void reset(); void update(); void setStepTime(); double getStepTime(); int packSize(); void* pack(void *, float lag); void* unpack(void *); const float startRate = 1.0f; const float finalRate = 10.0f; } #endif // BZF_GAME_TIME_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Intersect.h000066400000000000000000000105231200563112200171740ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Utilities for doing intersection calculations. */ #ifndef BZF_INTERSECT_H #define BZF_INTERSECT_H #include "common.h" #include "Ray.h" #include "Frustum.h" class Extents; enum IntersectLevel { Outside, Partial, Contained }; // returns normal to 2d rect (size 2dx x 2dy) by point p void getNormalRect(const float* p, const float* boxPos, float boxAngle, float dx, float dy, float* n); // true iff 2d rect (size 2dx x 2dy) intersects circle (in z = const plane) bool testRectCircle(const float* boxPos, float boxAngle, float dx, float dy, const float* circPos, float circRadius); // ray r1 started at time t1 minus ray r2 started at time t2 Ray rayMinusRay(const Ray& r1, float t1, const Ray& r2, float t2); // return t at which ray passes through sphere at origin of given radius float rayAtDistanceFromOrigin(const Ray& r, float radius); // return t at which ray intersects box (size 2dx x 2dy x dz) // (-1 if never, 0 if starts inside). float timeRayHitsBlock(const Ray& r, const float* boxPos, float boxAngle, float dx, float dy, float dz); // return t at which ray intersects pyramid (size 2dx x 2dy x dz) // (-1 if never, 0 if starts inside). float timeRayHitsPyramids(const Ray& r, const float* pyrPos, float pyrAngle, float dx, float dy, float dz, bool flipZ); // return t at which ray intersects tetra (size 2dx x 2dy x dz) // (-1 if never, 0 if starts inside). float timeRayHitsTetra(const Ray& r, const float (*vertices)[4][3], const float (*planes)[4][4], const float* mins, const float *maxs); // true if rectangles intersect (in z = const plane) bool testRectRect(const float* p1, float angle1, float dx1, float dy1, const float* p2, float angle2, float dx2, float dy2); // true if first rectangle contains second intersect (in z = const plane) bool testRectInRect(const float* bigPos, float angle1, float dx1, float dy1, const float* smallPos, float angle2, float dx2, float dy2); // return t at which ray intersects 2d rect (size 2dx x 2dy) and side // of intersection. 0,1,2,3 for east, north, west, south; -1 if never; // -2 if starts inside. float timeAndSideRayHitsOrigRect( const float* rayOrigin, const float* rayDir, float dx, float dy, int& side); float timeAndSideRayHitsRect(const Ray& r, const float* boxPos, float boxAngle, float dx, float dy, int& side); // return true if polygon touches the axis aligned box bool testPolygonInAxisBox(int pointCount, const float (*points)[3], const float* plane, const Extents& extents); // return level of axis box intersection with Frumstum // possible values are Outside, Partial, and Contained. // the frustum plane normals point inwards IntersectLevel testAxisBoxInFrustum(const Extents& extents, const Frustum* frustum); // return true if the axis aligned bounding box // is contained within all of the planes. // the occluder plane normals point inwards IntersectLevel testAxisBoxOcclusion(const Extents& extents, const float (*planes)[4], int planeCount); // return true if the ray will intersect with the // axis aligned bounding box defined by the mins // and maxs. it will also fill in enterTime and // leaveTime if there is an intersection. bool textRayInAxisBox(const Ray& ray, const Extents& extents, float& enterTime, float& leaveTime); // return true if the ray hits the box // if it does hit, set the inTime value bool testRayHitsAxisBox(const Ray* ray, const Extents& extents, float* inTime); // return true if the ray hits the box // if it does hit, set the inTime and outTime values bool testRayHitsAxisBox(const Ray* ray, const Extents& extents, float* inTime, float* outTime); #endif // BZF_INTERSECT_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/KeyManager.h000066400000000000000000000063401200563112200172610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * keyboard mapping stuff */ #ifndef BZF_KEYMANAGER_H #define BZF_KEYMANAGER_H #include "common.h" // system headers #include #include #include // local implementation headers #include "BzfEvent.h" #include "CallbackList.h" #include "Singleton.h" #define KEYMGR (KeyManager::instance()) class KeyManager : public Singleton { public: typedef void (*IterateCallback)(const std::string& name, bool press, const std::string& cmd, void* userData); typedef IterateCallback ChangeCallback; // bind/unbind a command to/from a key event press or release void bind(const BzfKeyEvent&, bool press, const std::string& cmd); void unbind(const BzfKeyEvent&, bool press); // unbind all keys bound to a specific command void unbindCommand(const char* command); // get the command for a key event press or release std::string get(const BzfKeyEvent&, bool press) const; /** returns a set of keypress strings that correspond to keys bound * to a particular command */ std::vector getKeysFromCommand(std::string command, bool press) const; // convert a key event to/from a string std::string keyEventToString(const BzfKeyEvent&) const; bool stringToKeyEvent(const std::string&, BzfKeyEvent&) const; // invoke callback for each bound key void iterate(IterateCallback callback, void* userData); // add/remove a callback to invoke when a key binding is added, // removed, or changed. void addCallback(ChangeCallback, void* userData); void removeCallback(ChangeCallback, void* userData); protected: friend class Singleton; KeyManager(); ~KeyManager(); private: void notify(const BzfKeyEvent&, bool press, const std::string& cmd); struct CallbackInfo { public: std::string name; bool press; std::string cmd; }; static bool onCallback(ChangeCallback, void*, void*); private: class KeyEventLess { public: bool operator()(const BzfKeyEvent&, const BzfKeyEvent&) const; }; typedef std::map EventToCommandMap; typedef std::map StringToEventMap; EventToCommandMap pressEventToCommand; EventToCommandMap releaseEventToCommand; StringToEventMap stringToEvent; CallbackList callbacks; static const char* buttonNames[]; static const char* asciiNames[][2]; }; // this is to be implemented within the requisite source file for the application using it. // in BZFlag's case, it happens to be in bzflag.cxx extern const unsigned int numDefaultBindings; extern const char* defaultBindings[]; #endif // BZF_KEYMANAGER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/LagInfo.h000066400000000000000000000061661200563112200165630ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LAGINFO_H__ #define __LAGINFO_H__ #include "PlayerInfo.h" /** This class monitors the lag time for each client */ class LagInfo { public: /** A default constructor. It needs a pointer to the Player basic Info, */ LagInfo(PlayerInfo *_info); /** Resetting lag value */ void reset(); /** Getting lag value (in milliseconds) */ int getLag() const; /** Getting jitter value (in milliseconds) */ int getJitter() const; /** Getting packetloss value (in percent) */ int getLoss() const; /** Get the floating point value of the lag (in seconds) */ float getLagAvg() const; /** Get a printable version of lag statistics */ void getLagStats(char* msg, bool isAdmin) const; /** functions to be called whenever a playerUpdate or ping message arrives */ void updatePingLag(void *buf, bool &warn, bool &kick, bool &jittwarn, bool &jittkick, bool &plosswarn, bool &plosskick, bool &alagannouncewarn, bool &lagannouncewarn); void updateLag(float timestamp, bool ooo); /** get the ping seqno, if need to send one now! */ int getNextPingSeqno(bool &warn, bool &kick); /** update the latency */ void updateLatency(float &waitTime); /** set the threshold for warning/kicking */ static void setAdminLagAnnounceThreshold(float _adminlagannouncetresh); static void setLagAnnounceThreshold(float _lagannouncetresh); static void setThreshold(float _threshold, float _max); static void setJitterThreshold(float _jitterthreshold, float _jittermax); static void setPacketLossThreshold(float _packetlossthreshold, float _max); private: PlayerInfo *info; // lag measurement float lagavg; float jitteravg; float lostavg; float lagalpha; float jitteralpha; float lostalpha; int lagcount; int laglastwarn; int lagwarncount; int jittercount; int jitterlastwarn; int jitterwarncount; int losscount; int losslastwarn; int losswarncount; bool pingpending; TimeKeeper nextping; TimeKeeper lastping; TimeKeeper lastupdate; int pingseqno; int pingssent; // jitter measurement float lasttimestamp; // announcements static float adminlagannouncetresh; int alagcount; int alaglastannounce; int alagannouncecount; static float lagannouncetresh; int lagannouncecount; TimeKeeper laglastannounce; // kicks static float threshold; static float jitterthreshold; static float lossthreshold; static float max; static float jittermax; static float lossmax; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Language.h000066400000000000000000000055031200563112200167610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LANGUAGE_H__ #define __LANGUAGE_H__ #include "common.h" // system interface headers #include #include /** ISO 639 language representation */ class Language { private: int _number; std::string _iso2; std::string _iso3; std::string _english; std::string _french; static std::vector _language; protected: Language(int numberCode, std::string iso2Code, std::string iso3Code="", std::string english="", std::string french=""); ~Language(); static bool addLanguage(Language& language); public: /** loads entries from a file and return the count added */ static unsigned int loadFromFile(std::string filename, bool verbose=false); /** returns the language code */ int number() const; /** returns the 2-char language abbreviation */ std::string iso2() const; /** returns the 3-char language abbreviation */ std::string iso3() const; /** returns the english name for display */ std::string englishName() const; /** returns the french name for display */ std::string frenchName() const; /** returns the language code */ static int number(int code); static int number(std::string language); /** returns the 2-char language abbreviation */ static std::string iso2(int code); static std::string iso2(std::string language); /** returns the 3-char language abbreviation */ static std::string iso3(int code); static std::string iso3(std::string language); /** returns the english name for display */ static std::string englishName(int code); static std::string englishName(std::string language); /** returns the french name for display */ static std::string frenchName(int code); static std::string frenchName(std::string language); /* static const Language CHINESE = Language("zh"); static const Language ENGLISH = Language("en"); static const Language FRENCH = Language("fr"); static const Language GERMAN = Language("de"); static const Language ITALIAN = Language("it"); static const Language JAPANESE = Language("jp"); static const Language KOREAN = Language("ko"); static const Language SIMPLIFIED_CHINESE = Language("zh"); static const Language TRADITIONAL_CHINESE = Language("zh"); */ }; /* class Language */ #else class Language; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/LaserSceneNode.h000066400000000000000000000034741200563112200200750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* LaserSceneNode: * Encapsulates information for rendering a laser beam. */ #ifndef BZF_LASER_SCENE_NODE_H #define BZF_LASER_SCENE_NODE_H #include "common.h" #include "SceneNode.h" class LaserSceneNode : public SceneNode { public: LaserSceneNode(const GLfloat pos[3], const GLfloat forward[3]); ~LaserSceneNode(); void setTexture(const int); bool cull(const ViewFrustum&) const; void notifyStyleChange(); void addRenderNodes(SceneRenderer&); void setColor ( float r, float g, float b ); void setCenterColor ( float r, float g, float b ); void setFirst ( void ) {first = true;} protected: class LaserRenderNode : public RenderNode { public: LaserRenderNode(const LaserSceneNode*); ~LaserRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: void renderFlatLaser(); void renderGeoLaser(); const LaserSceneNode* sceneNode; static GLfloat geom[6][2]; }; fvec4 color; fvec4 centerColor; bool first; friend class LaserRenderNode; private: GLfloat azimuth, elevation; GLfloat length; bool texturing; OpenGLGState gstate; LaserRenderNode renderNode; }; #endif // BZF_LASER_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/LinkManager.h000066400000000000000000000033601200563112200174250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OpenGLLight: * Encapsulates an OpenGL (point or directional) light source. */ #ifndef BZF_LINK_MANAGER_H #define BZF_LINK_MANAGER_H // common goes first #include "common.h" // system headers #include #include #include class LinkManager { public: LinkManager(); ~LinkManager(); void clear(); void addLink(int src, int dst); void addLink(const std::string& src, const std::string& dst); void doLinking(); int getTeleportTarget(int source) const; int getTeleportTarget(int source, unsigned int seed) const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void makeLinkName(int number, std::string& name); void findTelesByName(const std::string& name, std::vector& list) const; private: typedef struct { std::string src; std::string dst; } LinkNameSet; typedef struct { std::vector dsts; } LinkNumberSet; std::vector linkNames; std::vector linkNumbers; }; #endif // BZF_LINK_MANAGER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ListServer.h000066400000000000000000000020711200563112200173350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LISTSERVER_H__ #define __LISTSERVER_H__ #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "Address.h" const int MaxListServers = 5; typedef struct _ListServer { Address address; int port; int socket; int phase; std::string hostname; std::string pathname; int failures; int bufferSize; char buffer[1024]; } ListServer; #endif /* __LISTSERVER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Makefile.am000066400000000000000000000061711200563112200171230ustar00rootroot00000000000000 noinst_HEADERS = \ AccessList.h \ Address.h \ AresHandler.h \ AnsiCodes.h \ ArcObstacle.h \ AutoCompleter.h \ BaseSceneNodeGenerator.h \ BoxSceneNodeGenerator.h \ BSPSceneDatabase.h \ BZDBCache.h \ BZDBLocal.h \ BaseBuilding.h \ BaseResources.h \ BillboardSceneNode.h \ BoltSceneNode.h \ BoxBuilding.h \ Bundle.h \ BundleMgr.h \ BzPNG.h \ BzMaterial.h \ BzfDisplay.h \ BzfEvent.h \ BzfJoystick.h \ BzfMedia.h \ BzfVisual.h \ BzfWindow.h \ bzfsAPI.h \ bzfsHTTPAPI.h \ CacheManager.h \ CallbackList.h \ CollisionManager.h \ CommandManager.h \ CommandsStandard.h \ ConeObstacle.h \ ConfigFileManager.h \ Country.h \ DirectoryNames.h \ DynamicColor.h \ EighthDBaseSceneNode.h \ EighthDBoxSceneNode.h \ EighthDPyrSceneNode.h \ EighthDimSceneNode.h \ EighthDimShellNode.h \ EmptySceneNodeGenerator.h \ ErrorHandler.h \ Extents.h \ FileManager.h \ FontManager.h \ Flag.h \ FlagSceneNode.h \ FlagWarpSceneNode.h \ Frustum.h \ GameTime.h \ GLCollect.h \ Intersect.h \ KeyManager.h \ LagInfo.h \ Language.h \ LaserSceneNode.h \ LinkManager.h \ ListServer.h \ MathUtils.h \ MediaFile.h \ MeshFace.h \ MeshFragSceneNode.h \ MeshDrawInfo.h \ MeshDrawMgr.h \ MeshObstacle.h \ MeshPolySceneNode.h \ MeshSceneNodeGenerator.h \ MeshSceneNode.h \ MeshTransform.h \ MsgStrings.h \ NetHandler.h \ Obstacle.h \ ObstacleList.h \ ObstacleMgr.h \ ObstacleModifier.h \ ObstacleSceneNodeGenerator.h \ OccluderSceneNode.h \ OpenGLGState.h \ OpenGLLight.h \ OpenGLMaterial.h \ OpenGLTexture.h \ OpenGLUtils.h \ OSFile.h \ PTSceneNode.h \ Pack.h \ ParseColor.h \ PhysicsDriver.h \ Ping.h \ PlatformFactory.h \ PlayerInfo.h \ PlayerState.h \ PolyWallSceneNode.h \ PositionTracker.h \ Protocol.h \ PyramidBuilding.h \ PyramidSceneNodeGenerator.h \ QuadWallSceneNode.h \ Ray.h \ RenderNode.h \ SceneDatabase.h \ SceneNode.h \ SceneRenderer.h \ ServerItem.h \ ServerList.h \ ServerListCache.h \ ShellSceneNode.h \ ShotSceneNode.h \ ShotUpdate.h \ Singleton.h \ SphereObstacle.h \ SphereSceneNode.h \ StartupInfo.h \ StateDatabase.h \ TankGeometryMgr.h \ TankSceneNode.h \ Team.h \ Teleporter.h \ TeleporterSceneNodeGenerator.h \ TetraBuilding.h \ TextChunkManager.h \ TextUtils.h \ TextureManager.h \ TextureMatrix.h \ TimeBomb.h \ TimeKeeper.h \ TracerSceneNode.h \ TriWallSceneNode.h \ ViewFrustum.h \ VotingArbiter.h \ VotingBooth.h \ WallObstacle.h \ WallSceneNode.h \ WallSceneNodeGenerator.h \ WordFilter.h \ WorldEventManager.h \ ZSceneDatabase.h \ bz_Locale.h \ bzfSDL.h \ bzfgl.h \ bzfio.h \ bzglob.h \ bzsignal.h \ common.h \ cURLManager.h \ global.h \ md5.h \ messages.h \ multicast.h \ network.h \ bzregex.h \ resource.h \ vectors.h \ vectors_old.h \ version.h \ win32.h MAINTAINERCLEANFILES = \ config.h.in \ config.h.in~ \ stamp-h.in \ Makefile.in EXTRA_DIST = \ README bzflag-2.4.2+ds1/include/Makefile.in000066400000000000000000000403021200563112200171260ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = include DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = \ AccessList.h \ Address.h \ AresHandler.h \ AnsiCodes.h \ ArcObstacle.h \ AutoCompleter.h \ BaseSceneNodeGenerator.h \ BoxSceneNodeGenerator.h \ BSPSceneDatabase.h \ BZDBCache.h \ BZDBLocal.h \ BaseBuilding.h \ BaseResources.h \ BillboardSceneNode.h \ BoltSceneNode.h \ BoxBuilding.h \ Bundle.h \ BundleMgr.h \ BzPNG.h \ BzMaterial.h \ BzfDisplay.h \ BzfEvent.h \ BzfJoystick.h \ BzfMedia.h \ BzfVisual.h \ BzfWindow.h \ bzfsAPI.h \ bzfsHTTPAPI.h \ CacheManager.h \ CallbackList.h \ CollisionManager.h \ CommandManager.h \ CommandsStandard.h \ ConeObstacle.h \ ConfigFileManager.h \ Country.h \ DirectoryNames.h \ DynamicColor.h \ EighthDBaseSceneNode.h \ EighthDBoxSceneNode.h \ EighthDPyrSceneNode.h \ EighthDimSceneNode.h \ EighthDimShellNode.h \ EmptySceneNodeGenerator.h \ ErrorHandler.h \ Extents.h \ FileManager.h \ FontManager.h \ Flag.h \ FlagSceneNode.h \ FlagWarpSceneNode.h \ Frustum.h \ GameTime.h \ GLCollect.h \ Intersect.h \ KeyManager.h \ LagInfo.h \ Language.h \ LaserSceneNode.h \ LinkManager.h \ ListServer.h \ MathUtils.h \ MediaFile.h \ MeshFace.h \ MeshFragSceneNode.h \ MeshDrawInfo.h \ MeshDrawMgr.h \ MeshObstacle.h \ MeshPolySceneNode.h \ MeshSceneNodeGenerator.h \ MeshSceneNode.h \ MeshTransform.h \ MsgStrings.h \ NetHandler.h \ Obstacle.h \ ObstacleList.h \ ObstacleMgr.h \ ObstacleModifier.h \ ObstacleSceneNodeGenerator.h \ OccluderSceneNode.h \ OpenGLGState.h \ OpenGLLight.h \ OpenGLMaterial.h \ OpenGLTexture.h \ OpenGLUtils.h \ OSFile.h \ PTSceneNode.h \ Pack.h \ ParseColor.h \ PhysicsDriver.h \ Ping.h \ PlatformFactory.h \ PlayerInfo.h \ PlayerState.h \ PolyWallSceneNode.h \ PositionTracker.h \ Protocol.h \ PyramidBuilding.h \ PyramidSceneNodeGenerator.h \ QuadWallSceneNode.h \ Ray.h \ RenderNode.h \ SceneDatabase.h \ SceneNode.h \ SceneRenderer.h \ ServerItem.h \ ServerList.h \ ServerListCache.h \ ShellSceneNode.h \ ShotSceneNode.h \ ShotUpdate.h \ Singleton.h \ SphereObstacle.h \ SphereSceneNode.h \ StartupInfo.h \ StateDatabase.h \ TankGeometryMgr.h \ TankSceneNode.h \ Team.h \ Teleporter.h \ TeleporterSceneNodeGenerator.h \ TetraBuilding.h \ TextChunkManager.h \ TextUtils.h \ TextureManager.h \ TextureMatrix.h \ TimeBomb.h \ TimeKeeper.h \ TracerSceneNode.h \ TriWallSceneNode.h \ ViewFrustum.h \ VotingArbiter.h \ VotingBooth.h \ WallObstacle.h \ WallSceneNode.h \ WallSceneNodeGenerator.h \ WordFilter.h \ WorldEventManager.h \ ZSceneDatabase.h \ bz_Locale.h \ bzfSDL.h \ bzfgl.h \ bzfio.h \ bzglob.h \ bzsignal.h \ common.h \ cURLManager.h \ global.h \ md5.h \ messages.h \ multicast.h \ network.h \ bzregex.h \ resource.h \ vectors.h \ vectors_old.h \ version.h \ win32.h MAINTAINERCLEANFILES = \ config.h.in \ config.h.in~ \ stamp-h.in \ Makefile.in EXTRA_DIST = \ README all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status include/config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) config.h installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: all install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/include/MathUtils.h000066400000000000000000000232221200563112200171460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * The fast sqrt() implementation contained herein was taken from the * public domained nVIDIA Fast Math Routines and adapted for BZFlag's * needs as well as wrapping table construction inside a class. */ #ifndef __MATHUTILS_H__ #define __MATHUTILS_H__ /* common header comes first */ #include "common.h" /* system headers */ #include #include /* common headers */ #include "TimeKeeper.h" #define FP_BITS(fp) (*(unsigned long *)&(fp)) #define FP_ABS_BITS(fp) (FP_BITS(fp)&0x7FFFFFFF) #define FP_SIGN_BIT(fp) (FP_BITS(fp)&0x80000000) #define FP_ONE_BITS 0x3F800000 // r = 1/p #define FP_INV(r,p) \ { \ int _i = 2 * FP_ONE_BITS - *(int *)&(p); \ r = *(float *)&_i; \ r = r * (2.0f - (p) * r); \ } ///////////////////////////////////////////////// // The following comes from Vincent Van Eeckhout // Thanks for sending us the code! // It's the same thing in assembly but without this C-needed line: // r = *(float *)&_i; float __two = 2.0f; #define FP_INV2(r,p) \ { \ __asm { mov eax,0x7F000000 }; \ __asm { sub eax,dword ptr [p] }; \ __asm { mov dword ptr [r],eax }; \ __asm { fld dword ptr [p] }; \ __asm { fmul dword ptr [r] }; \ __asm { fsubr [__two] }; \ __asm { fmul dword ptr [r] }; \ __asm { fstp dword ptr [r] }; \ } #define FP_EXP(e,p) \ { \ int _i; \ e = -1.44269504f * (float)0x00800000 * (p); \ _i = (int)e + 0x3F800000; \ e = *(float *)&_i; \ } #define FP_NORM_TO_BYTE(i,p) \ { \ float _n = (p) + 1.0f; \ i = *(int *)&_n; \ if (i >= 0x40000000) i = 0xFF; \ else if (i <=0x3F800000) i = 0; \ else i = ((i) >> 15) & 0xFF; \ } inline unsigned long FP_NORM_TO_BYTE2(float p) { float fpTmp = p + 1.0f; return ((*(unsigned *)&fpTmp) >> 15) & 0xFF; } inline unsigned long FP_NORM_TO_BYTE3(float p) { float ftmp = p + 12582912.0f; return ((*(unsigned long *)&ftmp) & 0xFF); } /** The math_util class contains general routines for common * mathematical functions that should be used with care. The * precision and/or accuracy of the routine below are not guaranteed, * though the implementation should useful for fast estimates where * accuracy is not a stringent concern. * * For the square root and inverse square root routines below, they * are */ class math_util { private: /** table of precomputed square root values */ static unsigned int _fast_sqrt_table[0x10000]; /** keep track of whether the table was precomputed yet */ static bool _built_fast_sqrt_table; /** table of random floats for performance testing */ static float _random_floats[0x10000]; /** keep tracke of whether the random floats are set yet */ static bool _built_random_floats; typedef union FastSqrtUnion { float f; unsigned int i; } FastSqrtUnion; protected: static void build_sqrt_table() { unsigned int i; FastSqrtUnion s; for (i = 0; i <= 0x7FFF; i++) { // Build a float with the bit pattern i as mantissa // and an exponent of 0, stored as 127 s.i = (i << 8) | (0x7F << 23); s.f = (float)sqrt(s.f); // Take the square root then strip the first 7 bits of // the mantissa into the table _fast_sqrt_table[i + 0x8000] = (s.i & 0x7FFFFF); // Repeat the process, this time with an exponent of 1, // stored as 128 s.i = (i << 8) | (0x80 << 23); s.f = (float)sqrt(s.f); _fast_sqrt_table[i] = (s.i & 0x7FFFFF); } } static void build_random_floats() { unsigned int i; bzfsrand(0); // ensure consistent seed and same rand value order for (i=0; i < 0x10000; i++) { _random_floats[i] = (float)bzfrand(); } } /* INVERSE SQUARE ROOT */ /** system implementation of floating point square root estimate */ static inline float fastinvsqrt0(float n) { float f; float p = sqrtf(n); FP_INV(f, p) return f; } /** software estimate of inverse square root */ static inline float fastinvsqrt1(float n) { float f; float p = fastsqrt1(n); FP_INV(f, p) return f; } /** hardware instruction based inverse square root estimate */ static inline float fastinvsqrt2 (float n) { #if defined(__APPLE__) float result; asm ( "frsqrte %0, %1" : /*OUT*/ "=f" (result) : /*IN*/ "f" (n) ); return result; #else float f; float p = sqrtf(n); FP_INV(f, p) return f; #endif } /* SQUARE ROOT */ /** system implementation of floating point square root */ static inline float fastsqrt0(float n) { return sqrtf(n); } /** software estimate replacement -- this is nvidias fast square * root routine is a table-based solution that trades off memory * utilization for performance. it's not necessarily a cache * friendly method, but gives impressive results for common use. */ static inline float fastsqrt1(float n) { // make sure the table is built if (!_built_fast_sqrt_table) { build_sqrt_table(); _built_fast_sqrt_table = true; } // check for square root of 0 if (FP_BITS(n) == 0) { return 0.0; } FP_BITS(n) = _fast_sqrt_table[(FP_BITS(n) >> 8) & 0xFFFF] | ((((FP_BITS(n) - 0x3F800000) >> 1) + 0x3F800000) & 0x7F800000); return n; } /** hardware instruction based square root estimate */ static inline float fastsqrt2(float n) { #if defined(__APPLE__) float f; float p = fastinvsqrt2(n); FP_INV(f, p) return f; #else return sqrtf(n); #endif } public: /** function pointer to the fastinvsqrt routine that performs best * on this system. */ static float (*fastinvsqrt)(float); /** function pointer to the fastsqrt routine that performs best on * this system. */ static float (*fastsqrt)(float); /** optimize usage of square root and inverse square root at runtime * to use the fastest available. A quick timed test is performed on * each of the routines and the function pointers are set to the * fastest. There is no consideration for tolerance being taken * into account -- they are all assumed to be insufficient if * accuracy is required. */ static void optimize() { /* array of function pointers for testing */ float (*mathTest[6])(float) = {fastsqrt0, fastsqrt1, fastsqrt0, fastinvsqrt0, fastinvsqrt1, fastinvsqrt0}; const char *label[6] = {"system square root", "nvidia square root estimate", "hardware-based square root", "system inverse square root", "nvidia inverse square root estimate", "harware-based inverse square root"}; std::cout << "Optimizing math routines..." << std::endl; if (!_built_random_floats) { std::cout << "...building random float table" << std::endl; build_random_floats(); _built_random_floats = true; } /* minimize cache effect by preloading */ double sum = 0.0; for (unsigned int fl = 0; fl < 0x10000; fl++) { sum += _random_floats[fl]; } // should always be false, but compiler shouldn't know that if (sum < -1.0f) { std::cerr << "ERROR: should not have reached here in MathUtils.h" << std::endl; exit(1); } /* test math routine candidates (reverse order) */ unsigned int mostIterations = 0; unsigned int bestIndex = 0; for (int i = 0; i < 6; i++) { unsigned int iterations = 0; // how many test iterations were performed sum = 0.0; // make sure optimizer doesn't optimize us away if (i == 0) { std::cout << "...testing square root" << std::flush; } else if (i == 3) { std::cout << "...testing inverse square root" << std::flush; } // test for half a second per function TimeKeeper t = TimeKeeper::getCurrent(); do { for (unsigned int f = 0; f < 0x10000; f++) { sum += mathTest[i](_random_floats[f]); } iterations++; } while (TimeKeeper::getCurrent() - t < 0.5f); std::cout << " ... " << iterations; // should always be false, but compiler shouldn't know that if (sum < -1.0f) { std::cerr << "ERROR: should not have reached here in MathUtils.h" << std::endl; exit(1); } if (iterations > mostIterations) { mostIterations = iterations; bestIndex = i; } if (i == 2) { fastsqrt = mathTest[bestIndex]; std::cout << std::endl << "...using " << label[bestIndex] << std::endl; mostIterations = 0; bestIndex = 0; } else if (i == 5) { fastinvsqrt = mathTest[bestIndex]; std::cout << std::endl << "...using " << label[bestIndex] << std::endl; mostIterations = 0; bestIndex = 0; } } std::cout << "...done optimizing math routines." << std::endl; return; } }; /* static initializers */ unsigned int math_util::_fast_sqrt_table[0x10000] = {0}; bool math_util::_built_fast_sqrt_table = false; float math_util::_random_floats[0x10000] = {0}; bool math_util::_built_random_floats = false; float (*math_util::fastinvsqrt)(float) = math_util::fastinvsqrt0; float (*math_util::fastsqrt)(float) = math_util::fastsqrt0; #endif /* __MATHUTILS_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MediaFile.h000066400000000000000000000062231200563112200170550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_MEDIA_FILE_H #define BZF_MEDIA_FILE_H #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "bzfio.h" // if HALF_RATE_AUDIO defined then use half the normal audio sample // rate (and downsample the audio files to match). this reduces the // demands on the system. // #define HALF_RATE_AUDIO /** This class is a base class for media files, which can be image files or audio files. */ class MediaFile { public: /** Close the media file. This does *not* destroy the stream. */ virtual ~MediaFile(); /** Read an image file. Use delete[] to release the returned image. Returns NULL on failure. Images are stored RGBA, left to right, bottom to top. */ static unsigned char* readImage(std::string filename, int* width, int* height); // read a sound file. use delete[] to release the returned // audio. returns NULL on failure. sounds are stored // left/right. // static float* readSound(const std::string& filename, // int* numFrames, int* rate); protected: MediaFile(std::istream*); /** Get the stream. */ std::istream* getStream() const { return stream; } /** Return true if the stream is in a readable state. */ bool isOkay() const; /** Utility method to read raw data. */ void readRaw(void* buffer, uint32_t bytes); /** Utility method to skip data. */ void skip(uint32_t bytes); /** Utility method to read a 2 byte little-endian number into host byte order. */ uint16_t read16LE(); /** Utility method to read a 2 byte big-endian number into host byte order. */ uint16_t read16BE(); /** Utility method to read a 4 byte little-endian number into host byte order. */ uint32_t read32LE(); /** Utility method to read a 4 byte big-endian number into host byte order. */ uint32_t read32BE(); /** Utility method to byte swap a little-endian 2 byte number in place into host byte order. Returns the byte swapped data. */ static uint16_t swap16LE(uint16_t*); /** Utility method to byte swap a big-endian 2 byte number in place into host byte order. Returns the byte swapped data. */ static uint16_t swap16BE(uint16_t*); /** Utility method to byte swap a little-endian 4 byte number in place into host byte order. Returns the byte swapped data. */ static uint32_t swap32LE(uint32_t*); /** Utility method to byte swap a big-endian 4 byte number in place into host byte order. Returns the byte swapped data. */ static uint32_t swap32BE(uint32_t*); private: std::istream* stream; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshDrawInfo.h000066400000000000000000000151441200563112200175660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _MESH_DRAW_INFO_H_ #define _MESH_DRAW_INFO_H_ #include #include #include #include #include "vectors.h" #include "Extents.h" #include "BzMaterial.h" #include "MeshTransform.h" class MeshObstacle; class MeshDrawMgr; class Corner; class DrawCmd; class DrawSet; class DrawLod; class AnimationInfo; typedef std::map UintMap; class MeshDrawInfo { public: // server side generation MeshDrawInfo(const std::vector& options); // client side unpacking MeshDrawInfo(); // client side copies // - the vertex data belongs to the source // - the BzMaterials are regenerated from the map MeshDrawInfo(const MeshDrawInfo* drawInfo, const MeshTransform& xform, const std::map&); ~MeshDrawInfo(); bool parse(std::istream& in); bool isValid() const; bool clientSetup(const MeshObstacle* mesh); bool serverSetup(const MeshObstacle* mesh); bool isServerSide() const; bool isCopy() const; const MeshDrawInfo* getSource() const; bool isInvisible() const; void getMaterials(MaterialSet& matSet) const; MeshDrawMgr* getDrawMgr() const; void setDrawMgr(MeshDrawMgr*); void setName(const std::string&); const std::string& getName() const; const float* getSphere() const; const Extents& getExtents() const; int getLodCount() const; const DrawLod* getDrawLods() const; const afvec3* getVertices() const; const afvec3* getNormals() const; const afvec2* getTexcoords() const; int getRadarCount() const; const DrawLod* getRadarLods() const; const MeshTransform::Tool* getTransformTool() const; const MaterialMap* getMaterialMap() const; void updateAnimation(double time); const AnimationInfo* getAnimationInfo() const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void init(); void clear(); bool validate(const MeshObstacle* mesh) const; private: const MeshDrawInfo* source; // copy source, or NULL bool valid; bool serverSide; std::string name; std::vector lodOptions; MeshDrawMgr* drawMgr; Extents extents; float sphere[4]; MaterialMap* matMap; MeshTransform::Tool* xformTool; // elements int cornerCount; Corner* corners; afvec3* vertices; afvec3* normals; afvec2* texcoords; int rawVertCount; afvec3* rawVerts; int rawNormCount; afvec3* rawNorms; int rawTxcdCount; afvec2* rawTxcds; int lodCount; DrawLod* lods; int radarCount; DrawLod* radarLods; AnimationInfo* animInfo; }; inline bool MeshDrawInfo::isValid() const { return valid; } inline bool MeshDrawInfo::isServerSide() const { return serverSide; } inline bool MeshDrawInfo::isCopy() const { return (source != NULL); } inline void MeshDrawInfo::setDrawMgr(MeshDrawMgr* mgr) { drawMgr = mgr; } inline const MeshDrawInfo* MeshDrawInfo::getSource() const { return source; } inline const std::string& MeshDrawInfo::getName() const { return name; } inline const float* MeshDrawInfo::getSphere() const { return sphere; } inline const Extents& MeshDrawInfo::getExtents() const { return extents; } inline int MeshDrawInfo::getLodCount() const { return lodCount; } inline const DrawLod* MeshDrawInfo::getDrawLods() const { return lods; } inline const afvec3* MeshDrawInfo::getVertices() const { return vertices; } inline const afvec3* MeshDrawInfo::getNormals() const { return normals; } inline const afvec2* MeshDrawInfo::getTexcoords() const { return texcoords; } inline int MeshDrawInfo::getRadarCount() const { return radarCount; } inline const DrawLod* MeshDrawInfo::getRadarLods() const { return radarLods; } inline const MeshTransform::Tool* MeshDrawInfo::getTransformTool() const { return xformTool; } inline const MaterialMap* MeshDrawInfo::getMaterialMap() const { return matMap; } inline const AnimationInfo* MeshDrawInfo::getAnimationInfo() const { return animInfo; } class Corner { public: Corner(); ~Corner(); int packSize() const; void *pack(void*) const; void *unpack(void*); public: int vertex; int normal; int texcoord; }; class DrawCmd { public: DrawCmd(); void clear(); void finalize(); int packSize() const; void *pack(void*) const; void *unpack(void*); public: enum DrawModes { // OpenGL DrawPoints = 0x0000, // 0x0000 DrawLines = 0x0001, // 0x0001 DrawLineLoop = 0x0002, // 0x0002 DrawLineStrip = 0x0003, // 0x0003 DrawTriangles = 0x0004, // 0x0004 DrawTriangleStrip = 0x0005, // 0x0005 DrawTriangleFan = 0x0006, // 0x0006 DrawQuads = 0x0007, // 0x0007 DrawQuadStrip = 0x0008, // 0x0008 DrawPolygon = 0x0009, // 0x0009 DrawModeCount }; enum DrawIndexType { DrawIndexUShort = 0x1403, // 0x1403 DrawIndexUInt = 0x1405, // 0x1405 DrawIndexTypeCount }; public: unsigned int drawMode; int count; void* indices; unsigned int indexType; unsigned int minIndex; unsigned int maxIndex; }; class DrawSet { public: DrawSet(); void clear(); int packSize() const; void *pack(void*) const; void *unpack(void*); public: int count; DrawCmd* cmds; const BzMaterial* material; bool wantList; float sphere[4]; int triangleCount; }; class DrawLod { public: DrawLod(); void clear(); int packSize() const; void *pack(void*) const; void *unpack(void*); public: int count; DrawSet* sets; float lengthPerPixel; int triangleCount; }; class AnimationInfo { public: AnimationInfo(); int packSize() const; void *pack(void*) const; void *unpack(void*); public: float angvel; std::string dummy; float angle; float cos_val; float sin_val; }; #endif // _MESH_DRAW_INFO_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshDrawMgr.h000066400000000000000000000030241200563112200174120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _MESH_DRAW_MGR_H_ #define _MESH_DRAW_MGR_H_ #include "bzfgl.h" #include "MeshDrawInfo.h" class MeshDrawMgr { public: MeshDrawMgr(const MeshDrawInfo* drawInfo); ~MeshDrawMgr(); void executeSet(int lod, int set, bool normals, bool texcoords); void executeSetGeometry(int lod, int set); static void disableArrays(); static void init(); static void kill(); private: void rawExecuteCommands(int lod, int set); static void rawDisableArrays(); void makeLists(); void freeLists(); static void initContext(void* data); static void freeContext(void* data); private: const MeshDrawInfo* drawInfo; const DrawLod* drawLods; const GLfloat* vertices; const GLfloat* normals; const GLfloat* texcoords; struct LodList { int count; GLuint* setLists; }; int lodCount; LodList* lodLists; static GLuint unloadList; }; #endif // _MESH_DRAW_MGR_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshFace.h000066400000000000000000000143351200563112200167140ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TetraBuilding: * Encapsulates a tetrahederon in the game environment. */ #ifndef BZF_MESH_FACE_OBSTACLE_H #define BZF_MESH_FACE_OBSTACLE_H #include "common.h" #include #include #include "vectors.h" #include "Ray.h" #include "Obstacle.h" #include "global.h" #include "BzMaterial.h" //#include "PhysicsDrive.h" class MeshFace : public Obstacle { friend class MeshObstacle; friend class ObstacleModifier; public: MeshFace(class MeshObstacle* mesh); MeshFace(MeshObstacle* mesh, int vertexCount, float** vertices, float** normals, float** texcoords, const BzMaterial* material, int physics, bool noclusters, bool smoothBounce, bool drive, bool shoot, bool ricochet); ~MeshFace(); const char* getType() const; static const char* getClassName(); // const bool isValid() const; bool isFlatTop() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; MeshObstacle* getMesh() const; int getVertexCount() const; bool useNormals() const; bool useTexcoords() const; const float* getVertex(int index) const; const float* getNormal(int index) const; const float* getTexcoord(int index) const; const float* getPlane() const; const BzMaterial* getMaterial() const; int getPhysicsDriver() const; bool noClusters() const; bool isSmoothBounce() const; bool isSpecial() const; bool isBaseFace() const; bool isLinkToFace() const; bool isLinkFromFace() const; bool isZPlane() const; bool isUpPlane() const; bool isDownPlane() const; void setLink(const MeshFace* link); const MeshFace* getLink() const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; public: mutable float scratchPad; private: void finalize(); private: static const char* typeName; class MeshObstacle* mesh; int vertexCount; float** vertices; float** normals; float** texcoords; const BzMaterial* bzMaterial; bool smoothBounce; bool noclusters; int phydrv; afvec4 plane; afvec4* edgePlanes; MeshFace* edges; // edge 0 is between vertex 0 and 1, etc... // not currently used for anything enum { XPlane = (1 << 0), YPlane = (1 << 1), ZPlane = (1 << 2), UpPlane = (1 << 3), DownPlane = (1 << 4), WallPlane = (1 << 5) } PlaneBits; char planeBits; enum { LinkToFace = (1 << 0), LinkFromFace = (1 << 1), BaseFace = (1 << 2), IcyFace = (1 << 3), StickyFace = (1 << 5), DeathFace = (1 << 6), PortalFace = (1 << 7) } SpecialBits; // combining all types into one struct, because I'm lazy typedef struct { // linking data const MeshFace* linkFace; bool linkFromFlat; float linkFromSide[3]; // sideways vector float linkFromDown[3]; // downwards vector float linkFromCenter[3]; bool linkToFlat; float linkToSide[3]; // sideways vector float linkToDown[3]; // downwards vector float linkToCenter[3]; // base data TeamColor teamColor; } SpecialData; uint16_t specialState; SpecialData* specialData; }; inline MeshObstacle* MeshFace::getMesh() const { return mesh; } inline const BzMaterial* MeshFace::getMaterial() const { return bzMaterial; } inline int MeshFace::getPhysicsDriver() const { return phydrv; } inline const float* MeshFace::getPlane() const { return plane; } inline int MeshFace::getVertexCount() const { return vertexCount; } inline const float* MeshFace::getVertex(int index) const { return (const float*)vertices[index]; } inline const float* MeshFace::getNormal(int index) const { return (const float*)normals[index]; } inline const float* MeshFace::getTexcoord(int index) const { return (const float*)texcoords[index]; } inline bool MeshFace::useNormals() const { return (normals != NULL); } inline bool MeshFace::useTexcoords() const { return (texcoords != NULL); } inline bool MeshFace::noClusters() const { return noclusters; } inline bool MeshFace::isSmoothBounce() const { return smoothBounce; } inline bool MeshFace::isSpecial() const { return (specialState != 0); } inline bool MeshFace::isBaseFace() const { return (specialState & BaseFace) != 0; } inline bool MeshFace::isLinkToFace() const { return (specialState & LinkToFace) != 0; } inline bool MeshFace::isLinkFromFace() const { return (specialState & LinkFromFace) != 0; } inline const MeshFace* MeshFace::getLink() const { return specialData->linkFace; } inline bool MeshFace::isZPlane() const { return ((planeBits & ZPlane) != 0); } inline bool MeshFace::isUpPlane() const { return ((planeBits & UpPlane) != 0); } inline bool MeshFace::isDownPlane() const { return ((planeBits & DownPlane) != 0); } #endif // BZF_MESH_FACE_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshFragSceneNode.h000066400000000000000000000051571200563112200205230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* MeshFragSceneNode: * Encapsulates information for rendering a mesh fragment * (a collection of faces with the same material properties). * Does not support level of detail. */ #ifndef BZF_MESH_FRAG_SCENE_NODE_H #define BZF_MESH_FRAG_SCENE_NODE_H #include "common.h" #include "WallSceneNode.h" #include "BzMaterial.h" // // NOTES: // // - Make sure that "noPlane" is set to true, for Mesh Fragments can not be // used as occluders, and can not be culled as a simple plane // // - The lists are all GL_TRIANGLE lists // class MeshFace; class MeshFragSceneNode : public WallSceneNode { public: MeshFragSceneNode(int faceCount, const MeshFace** faces); ~MeshFragSceneNode(); // virtual functions from SceneNode bool cull(const ViewFrustum&) const; void addShadowNodes(SceneRenderer&); void addRenderNodes(SceneRenderer&); void renderRadar(); // virtual functions from WallSceneNode bool inAxisBox(const Extents& exts) const; void getRenderNodes(std::vector& rnodes); protected: class Geometry : public RenderNode { public: Geometry(MeshFragSceneNode* node); ~Geometry(); void init(); void setStyle(int _style) { style = _style; } void render(); void renderRadar(); void renderShadow(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: void drawV() const; // draw with just vertices void drawVT() const; // draw with texcoords void drawVN() const; // draw with normals void drawVTN() const; // draw with texcoords and normals void initDisplayList(); void freeDisplayList(); static void initContext(void *data); static void freeContext(void *data); private: int style; GLuint list; MeshFragSceneNode* sceneNode; }; private: Geometry renderNode; GLint faceCount; const MeshFace** faces; bool noRadar; bool noShadow; GLint arrayCount; GLfloat* vertices; GLfloat* normals; GLfloat* texcoords; friend class MeshFragSceneNode::Geometry; }; #endif // BZF_MESH_FRAG_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshObstacle.h000066400000000000000000000137151200563112200176130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TetraBuilding: * Encapsulates a tetrahederon in the game environment. */ #ifndef BZF_MESH_OBSTACLE_H #define BZF_MESH_OBSTACLE_H #include "common.h" #include #include #include #include "vectors.h" #include "Ray.h" #include "Obstacle.h" #include "MeshFace.h" #include "MeshTransform.h" class MeshDrawInfo; class MeshObstacle : public Obstacle { public: MeshObstacle(); MeshObstacle(const MeshTransform& transform, const std::vector& checkTypes, const std::vector& checkPoints, const std::vector& vertices, const std::vector& normals, const std::vector& texcoords, int faceCount, bool noclusters, bool bounce, bool drive, bool shoot, bool ricochet); bool addFace (const std::vector& vertices, const std::vector& normals, const std::vector& texcoords, const BzMaterial* bzMaterial, int physics, bool noclusters, bool bounce, bool drive, bool shoot, bool triangulate, bool ricochet); ~MeshObstacle(); void finalize(); Obstacle* copyWithTransform(const MeshTransform&) const; void copyFace(int face, MeshObstacle* mesh) const; void setName(const std::string& name); const std::string& getName() const; enum CheckType { CheckInside = 0, CheckOutside = 1, InsideParity = 2, OutsidePartiy = 3 }; const char* getType() const; static const char* getClassName(); // const bool isValid() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; bool containsPoint(const float point[3]) const; bool containsPointNoOctree(const float point[3]) const; const char *getCheckTypes() const; const afvec3 *getCheckPoints() const; const afvec3 *getVertices() const; const afvec3 *getNormals() const; const afvec2 *getTexcoords() const; int getCheckCount() const; int getVertexCount() const; int getNormalCount() const; int getTexcoordCount() const; int getFaceCount() const; const MeshFace* getFace(int face) const; const float* getPosition() const; const float* getSize() const; bool useSmoothBounce() const; bool noClusters() const; const MeshDrawInfo* getDrawInfo() const; void setDrawInfo(MeshDrawInfo*); int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printOBJ(std::ostream& out, const std::string& indent) const; private: void makeFacePointers(const std::vector& _vertices, const std::vector& _normals, const std::vector& _texcoords, float**& v, float**& n, float**& t); private: static const char* typeName; std::string name; int checkCount; char* checkTypes; afvec3* checkPoints; int vertexCount; afvec3* vertices; int normalCount; afvec3* normals; int texcoordCount; afvec2* texcoords; int faceCount, faceSize; MeshFace** faces; bool smoothBounce; bool noclusters; bool inverted; // used during building. can be ditched if // edge tables are setup with bi-directional // ray-vs-face tests and parity counts. MeshDrawInfo* drawInfo; // hidden data stored in extra texcoords }; inline const char *MeshObstacle::getCheckTypes() const { return checkTypes; } inline const afvec3 *MeshObstacle::getCheckPoints() const { return checkPoints; } inline const afvec3 *MeshObstacle::getVertices() const { return vertices; } inline const afvec3 *MeshObstacle::getNormals() const { return normals; } inline const afvec2 *MeshObstacle::getTexcoords() const { return texcoords; } inline int MeshObstacle::getCheckCount() const { return checkCount; } inline int MeshObstacle::getVertexCount() const { return vertexCount; } inline int MeshObstacle::getNormalCount() const { return normalCount; } inline int MeshObstacle::getTexcoordCount() const { return texcoordCount; } inline int MeshObstacle::getFaceCount() const { return faceCount; } inline const MeshFace* MeshObstacle::getFace(int face) const { return faces[face]; } inline const float* MeshObstacle::getPosition() const { return pos; } inline const float* MeshObstacle::getSize() const { return size; } inline bool MeshObstacle::useSmoothBounce() const { return smoothBounce; } inline bool MeshObstacle::noClusters() const { return noclusters; } inline const MeshDrawInfo* MeshObstacle::getDrawInfo() const { return drawInfo; } inline const std::string& MeshObstacle::getName() const { return name; } inline void MeshObstacle::setName(const std::string& str) { name = str; return; } #endif // BZF_MESH_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshPolySceneNode.h000066400000000000000000000077571200563112200205770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* MeshPolySceneNode: * Encapsulates information for rendering a planar * polygonal wall. Does not support level of detail. */ #ifndef BZF_MESH_POLY_SCENE_NODE_H #define BZF_MESH_POLY_SCENE_NODE_H #include "common.h" #include "WallSceneNode.h" class MeshPolySceneNode : public WallSceneNode { public: MeshPolySceneNode(const float plane[4], bool noRadar, bool noShadow, const GLfloat3Array& vertices, const GLfloat3Array& normals, const GLfloat2Array& texcoords); ~MeshPolySceneNode(); bool cull(const ViewFrustum& frustum) const; bool inAxisBox (const Extents& exts) const; int getVertexCount () const; const GLfloat* getVertex (int vertex) const; const GLfloat (*getVertices() const)[3]; int split(const float* plane, SceneNode*&, SceneNode*&) const; void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); void renderRadar(); void getRenderNodes(std::vector& rnodes); protected: class Geometry : public RenderNode { public: Geometry(MeshPolySceneNode*, const GLfloat3Array& vertices, const GLfloat3Array& normals, const GLfloat2Array& texcoords, const GLfloat* normal); ~Geometry(); void setStyle(int _style) { style = _style; } bool getNoRadar() const; void setNoRadar(); void render(); void renderRadar(); void renderShadow(); const GLfloat* getVertex(int i) const; const GLfloat (*getVertices() const)[3]; int getVertexCount() const; const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: void drawV() const; // draw with just vertices void drawVT() const; // draw with texcoords void drawVN() const; // draw with normals void drawVTN() const; // draw with texcoords and normals private: MeshPolySceneNode* sceneNode; int style; bool drawRadar; bool draw; const GLfloat* normal; public: GLfloat3Array vertices; GLfloat3Array normals; GLfloat2Array texcoords; }; private: int splitWallVTN(const GLfloat* plane, const GLfloat3Array& vertices, const GLfloat3Array& normals, const GLfloat2Array& texcoords, SceneNode*& front, SceneNode*& back) const; void splitEdgeVTN(float d1, float d2, const GLfloat* p1, const GLfloat* p2, const GLfloat* n1, const GLfloat* n2, const GLfloat* uv1, const GLfloat* uv2, GLfloat* p, GLfloat* n, GLfloat* uv) const; int splitWallVT(const GLfloat* plane, const GLfloat3Array& vertices, const GLfloat2Array& texcoords, SceneNode*& front, SceneNode*& back) const; void splitEdgeVT(float d1, float d2, const GLfloat* p1, const GLfloat* p2, const GLfloat* uv1, const GLfloat* uv2, GLfloat* p, GLfloat* uv) const; Geometry node; bool noRadar; bool noShadow; }; inline int MeshPolySceneNode::Geometry::getVertexCount() const { return vertices.getSize(); } inline int MeshPolySceneNode::getVertexCount () const { return node.getVertexCount(); } inline const GLfloat* MeshPolySceneNode::Geometry::getVertex(int i) const { return vertices[i]; } inline const GLfloat (*MeshPolySceneNode::Geometry::getVertices() const)[3] { return vertices.getArray(); } inline const GLfloat* MeshPolySceneNode::getVertex(int i) const { return node.getVertex(i); } inline const GLfloat (*MeshPolySceneNode::getVertices() const)[3] { return node.getVertices(); } #endif // BZF_MESH_POLY_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshSceneNode.h000066400000000000000000000061441200563112200177200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* MeshSceneNode: * Encapsulates information for rendering a mesh fragment * (a collection of faces with the same material properties). * Does not support level of detail. */ #ifndef BZF_MESH_SCENE_NODE_H #define BZF_MESH_SCENE_NODE_H #include "common.h" #include "bzfgl.h" #include "SceneNode.h" // // NOTES: // // - Make sure that "noPlane" is set to true, for Mesh can not be // used as occluders, and can not be culled as a simple plane // // - All accesses are done through indices // class MeshObstacle; class MeshDrawInfo; class MeshDrawMgr; class BzMaterial; class OpenGLGState; class SceneRenderer; class ViewFrustum; class RenderNode; class MeshSceneNode : public SceneNode { public: MeshSceneNode(const MeshObstacle* mesh); ~MeshSceneNode(); // virtual functions from SceneNode void notifyStyleChange(); bool cull(const ViewFrustum&) const; bool inAxisBox(const Extents& exts) const; void addShadowNodes(SceneRenderer&); void addRenderNodes(SceneRenderer&); void renderRadar(); void getRenderNodes(std::vector& rnodes); void makeXFormList(); void freeXFormList(); static void initContext(void* data); static void freeContext(void* data); static void setLodScale(int pixelsX, float fovx, int pixelsY, float fovy); static void setRadarLodScale(float lengthPerPixel); private: const MeshObstacle* mesh; MeshDrawMgr* drawMgr; const MeshDrawInfo* drawInfo; bool animRepos; // transform display list GLuint xformList; struct MeshMaterial { const BzMaterial* bzmat; OpenGLGState gstate; GLfloat color[4]; const GLfloat* colorPtr; bool drawRadar; bool drawShadow; bool needsSorting; bool animRepos; }; struct SetNode { int set; MeshMaterial meshMat; // basic render nodes RenderNode* node; RenderNode* radarNode; }; struct LodNode { int count; SetNode* sets; }; // Level Of Detail (LOD) information int lodCount; LodNode* lods; float* lodLengths; // Radar LODs int radarCount; LodNode* radarLods; float* radarLengths; static float LodScale; static float RadarLodScale; private: void updateMaterial(MeshMaterial* mat); const BzMaterial* convertMaterial(const BzMaterial* bzmat); int calcNormalLod(const ViewFrustum&); int calcShadowLod(const ViewFrustum&); int calcRadarLod(); friend class MeshSceneNodeMgr; }; #endif // BZF_MESH_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshSceneNodeGenerator.h000066400000000000000000000032471200563112200215700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MESHSCENENODEGENERATOR_H__ #define __MESHSCENENODEGENERATOR_H__ #include "SceneNode.h" #include "MeshFace.h" #include "MeshObstacle.h" #include "BzMaterial.h" #include class WallSceneNode; class MeshPolySceneNode; class MeshSceneNodeGenerator { friend class SceneDatabaseBuilder; public: ~MeshSceneNodeGenerator(); WallSceneNode* getNextNode(bool lod); static void setupNodeMaterial(WallSceneNode* node, const BzMaterial* mat); static MeshPolySceneNode* getMeshPolySceneNode(const MeshFace* face); static bool makeTexcoords(const float* plane, const GLfloat3Array& vertices, GLfloat2Array& texcoords); protected: MeshSceneNodeGenerator(const MeshObstacle*); private: void setupOccluders(); void setupFacesAndFrags(); private: int currentNode; bool useDrawInfo; bool returnOccluders; const MeshObstacle* mesh; typedef struct { bool isFace; std::vector faces; } MeshNode; std::vector nodes; std::vector occluders; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MeshTransform.h000066400000000000000000000066661200563112200200410ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _TRANSFORM_H_ #define _TRANSFORM_H_ #include #include #include enum TransformType { ShiftTransform = 0, ScaleTransform = 1, ShearTransform = 2, SpinTransform = 3, IndexTransform = 4, LastTransform }; typedef struct { TransformType type; int index; float data[4]; } TransformData; class MeshTransform { public: MeshTransform(); ~MeshTransform(); MeshTransform& operator=(const MeshTransform& transform); void append(const MeshTransform& transform); void prepend(const MeshTransform& transform); bool setName(const std::string& name); void addShift(const float shift[3]); void addScale(const float scale[3]); void addShear(const float shear[3]); void addSpin(const float degrees, const float normal[3]); void addReference(int transform); bool isEmpty() const { return (transforms.size() <= 0); } bool isValid(); void finalize(); const std::string& getName() const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printTransforms(std::ostream& out, const std::string& indent) const; private: std::string name; std::vector transforms; public: class Tool { public: Tool(const MeshTransform& transform); ~Tool(); bool isInverted() const; bool isSkewed() const; // scaled or sheared void modifyVertex(float vertex[3]) const; void modifyNormal(float normal[3]) const; void modifyOldStyle(float pos[3], float size[3], float& angle, bool& flipz) const; const float* getMatrix() const; private: void processTransforms(const std::vector& transforms); bool empty; bool inverted; bool skewed; float vertexMatrix[4][4]; float normalMatrix[3][3]; }; friend class MeshTransform::Tool; }; inline bool MeshTransform::Tool::isInverted() const { return inverted; } inline bool MeshTransform::Tool::isSkewed() const { return skewed; } inline const float* MeshTransform::Tool::getMatrix() const { return (const float*)vertexMatrix; } class MeshTransformManager { public: MeshTransformManager(); ~MeshTransformManager(); void update(); void clear(); int addTransform(MeshTransform* driver); int findTransform(const std::string& name) const; const MeshTransform* getTransform(int id) const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: std::vector transforms; }; inline const MeshTransform* MeshTransformManager::getTransform(int id) const { if ((id >= 0) && (id < (int)transforms.size())) { return transforms[id]; } else { return NULL; } } extern MeshTransformManager TRANSFORMMGR; #endif //_TRANSFORM_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/MsgStrings.h000066400000000000000000000031331200563112200173330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MSG_STRINGS_H__ #define __MSG_STRINGS_H__ // common headers #include "common.h" // system headers #include #include #include typedef struct { int level; std::string text; std::string color; } MsgString; typedef std::vector MsgStringList; namespace MsgStrings { // returns the name of the code (doesn't need init()) const char *strMsgCode(uint16_t code); void init(); void reset(); // clean up all tracked state void useDNS(bool); // look up hostnames based on IPs? void showMotto(bool); // show player mottos next to names? void colorize(bool); // use ANSI color codes? void trackState(bool); // track game state? int knownPacketTypes(); // Messages from the server to the client MsgStringList msgFromServer(uint16_t len, uint16_t code, const void *data); // Messages from the client to the server (currently unimplemented) MsgStringList msgFromClient(uint16_t len, uint16_t code, const void *data); } #endif // __MSG_STRINGS_H__ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/NetHandler.h000066400000000000000000000152151200563112200172630ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __NETHANDLER_H__ #define __NETHANDLER_H__ /* common header */ #include "common.h" /* system headers */ #include #include /* common interface headers */ #include "PlayerInfo.h" #include "Address.h" #include "AresHandler.h" enum RxStatus { ReadAll, ReadPart, ReadHuge, ReadReset, ReadError, ReadDiscon }; class NetworkDataLogCallback { public: virtual ~NetworkDataLogCallback(){}; virtual void networkDataLog ( bool send, bool udp, const unsigned char *data, unsigned int size, void* param = NULL ) = 0; }; void addNetworkLogCallback(NetworkDataLogCallback * cb ); void removeNetworkLogCallback(NetworkDataLogCallback * cb ); const int maxHandlers = LastRealPlayer; #ifdef DEBUG #define NETWORK_STATS #endif #ifdef NETWORK_STATS struct MessageCount { uint32_t count; uint16_t maxSize; }; #endif /** This class is a client that connects to a BZFlag client and has functions for sending and receiving messages. */ class NetHandler { public: /** A default constructor. It needs a pointer to the Player basic Info, a socket address to address subsequent message at user, a player Index, a unique pointer to a player the file descriptor for the TCP connection with the user. */ NetHandler(PlayerInfo *_info, const struct sockaddr_in &_clientAddr, int _playerIndex, int _fd); NetHandler(const struct sockaddr_in &_clientAddr, int _fd); /** The default destructor free all internal resources, and close the tcp connection */ ~NetHandler(); /** Class-Wide initialization and destruction Should be called before any other operation on any clas instance InitHandlers needs the addr structure filled to point to the local port needed for udp communications */ static bool initHandlers(struct sockaddr_in addr); static void destroyHandlers(); /// General function to support the select statement static void setFd(fd_set *read_set, fd_set *write_set, int &maxFile); static bool isUdpFdSet(fd_set *read_set); bool isFdSet(fd_set *set); /// Supporting DNS Asynchronous resolver static void checkDNS(fd_set *read_set, fd_set *write_set); /// return the opened socket, usable from all other network internal client static int getUdpSocket(); /** udpReceive will try to get the next udp message received return the playerIndex if found, -1 when no player had an open udp connection or -2 when a Ping Code Request has been detected. buffer is the received message uaddr is the identifier of the remote address udpLinkRequest report if the received message is a valid udpLinkRequest */ static int udpReceive(char *buffer, struct sockaddr_in *uaddr, bool &udpLinkRequest); /** tcpReceive try to get a message from the tcp connection the message can be accessed by using the getTcpBuffer methods result value indicates: ReadAll : was successfully received a full message ReadPart : only part of a message has been retrieved ReadHuge : length of the message is too long ReadReset : a reset of the connection has been detected ReadError : Error detected on the tcp connection ReadDiscon : Peer has closed the connection */ RxStatus tcpReceive(); void *getTcpBuffer(); /// Request if there is any buffered udp messages waiting to be sent static bool anyUDPPending() {return pendingUDP;}; /// Send all buffered UDP messages, if any void flushUDP(); static void flushAllUDP(); int pwrite(const void *b, int l); int pflush(fd_set *set); std::string reasonToKick(); const std::string getPlayerHostInfo(); const char* getTargetIP(); int sizeOfIP(); void* packAdminInfo(void *buf); static int whoIsAtIP(const std::string& IP); in_addr getIPAddress(); const char* getHostname(); bool reverseDNSDone(); size_t getTcpReadSize (){ return tcplen;} bool hasTcpOutbound(){ return outmsgSize > 0;} void setPlayer ( PlayerInfo* p, int index ); int getPlayerID ( void ){ return playerIndex;} int getFD ( void ) { return fd;} struct sockaddr_in getUADDR ( void ) { return uaddr;} /// Notify that the channel is going to be close. /// In the meantime any pwrite call will do nothing. /// Cannot be undone. void closing(); RxStatus receive(size_t length, bool* retry = NULL); void flushData ( void ){tcplen = 0;} int bufferedSend(const void *buffer, size_t length); private: int send(const void *buffer, size_t length); void udpSend(const void *b, size_t l); bool isMyUdpAddrPort(struct sockaddr_in uaddr); #ifdef NETWORK_STATS void countMessage(uint16_t code, int len, int direction); void dumpMessageStats(); #endif AresHandler *ares; /// On win32, a socket is typedef UINT_PTR SOCKET; /// Hopefully int will be ok static int udpSocket; static NetHandler* netPlayer[maxHandlers]; PlayerInfo* info; struct sockaddr_in uaddr; int playerIndex; /// socket file descriptor int fd; /// peer's network address Address peer; /* peer->getDotNotation returns a temp variable that is not safe * to pass around. This variable lets us keep a copy in allocated * memory for as long as we need to */ std::string dotNotation; /// input buffers /// current TCP msg char tcpmsg[MaxPacketLen]; /// bytes read in current msg int tcplen; /// Closing flag bool closed; /// output buffer int outmsgOffset; int outmsgSize; int outmsgCapacity; char* outmsg; char udpOutputBuffer[MaxPacketLen]; int udpOutputLen; static bool pendingUDP; /// UDP connection bool udpin; // udp inbound up, player is sending us udp bool udpout; // udp outbound up, we can send udp bool toBeKicked; std::string toBeKickedReason; // time accepted TimeKeeper time; #ifdef NETWORK_STATS // message stats bloat TimeKeeper perSecondTime[2]; uint32_t perSecondCurrentBytes[2]; uint32_t perSecondMaxBytes[2]; uint32_t perSecondCurrentMsg[2]; uint32_t perSecondMaxMsg[2]; uint32_t msgBytes[2]; typedef std::map MessageCountMap; MessageCountMap msg[2]; #endif }; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OSFile.h000066400000000000000000000062471200563112200163650ustar00rootroot00000000000000/* 3dScreamers */ /* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _OSFILE_H_ #define _OSFILE_H_ /* common header */ #include "common.h" /* system headers */ #ifdef _WIN32 #ifdef _MSC_VER #pragma warning(disable : 4786) // Disable warning message #endif #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include #else #include #include #include #include #include #endif #include #include #include typedef enum { eFileStart, eCurentPos, eFileEnd }teFilePos; void setOSFileBaseDir(const std::string &dir); void OSFileOSToStdDir(std::string &dir); class OSFile { public: OSFile(); OSFile(const OSFile &r); OSFile& operator = (const OSFile &r); OSFile(const std::string &szName); OSFile(const char *szName); OSFile(const std::string &szName, const char *szMode); ~OSFile(); bool open(const std::string &szName, const char *szMode); bool open(const char *szMode); bool close(); void stdName(const std::string &szName); void osName(const std::string &szName); FILE* getFile(); std::string getStdName(); std::string getOSName(); std::string getFileName(); std::string getExtension(); std::string getFullOSPath(); std::string getOSFileDir(); bool isOpen(); int read(void* data, int size, int count = 1); unsigned char readChar(); int scanChar(unsigned char *pChar); const char* scanStr(); std::string readLine(); int write(const void* data, int size); void flush(); int seek(teFilePos ePos, int iOffset); unsigned int size(); unsigned int tell(); void setUseGlobalPath(bool use = false); protected: class OSFileInfo; OSFileInfo *info; }; class OSDir { public: OSDir(); OSDir(const OSDir &r); OSDir& operator = (const OSDir &r); OSDir(const std::string &DirName); ~OSDir(); void setStdDir(const std::string &DirName); void setOSDir(const std::string &DirName); void makeStdDir(const std::string &DirName); void makeOSDir(const std::string &DirName); bool getNextFile(OSFile &oFile, bool bRecursive); bool getNextFile(OSFile &oFile, const char* fileMask, bool bRecursive); int getFileScanCount(); std::string getStdName(); std::string getOSName(); std::string getFullOSPath(); std::string getOSFileDir(); protected: class OSDirInfo; OSDirInfo *info; bool windowsAddFileStack(std::string pathName, std::string fileMask, bool bRecursive); bool linuxAddFileStack(std::string pathName, std::string fileMask, bool bRecursive); }; #endif//_OSFILE_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Obstacle.h000066400000000000000000000274711200563112200170020ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Obstacle: * Interface for all obstacles in the game environment, * including boxes, pyramids, and teleporters. * * isInside(const float*, float) is a rough test that considers * the tank as a circle * isInside(const float*, float, float, float) is a careful test * that considers the tank as a rectangle */ #ifndef BZF_OBSTACLE_H #define BZF_OBSTACLE_H #include "common.h" // system headers #include #include // common headers #include "Extents.h" class Ray; class SceneNode; class MeshTransform; /** This ABC represents a (normally) solid object in a world. It has pure virtual functions for getting information about it's size, checking ray intersections, checking point intersections, computing normals etc. All these functions have to be implemented in concrete subclasses. */ class Obstacle { friend class ObstacleModifier; public: /** The default constructor. It sets all values to 0 and is not very useful. */ Obstacle(); /** This function initializes the Obstacle with the given parameters. @param pos The position of the obstacle in world coordinates @param rotation The rotation around the obstacle's Z axis @param hwidth Half the X size of the obstacle @param hbreadth Half the Y size of the obstacle @param height The Z size of the obstacle @param drive @c true if the obstacle is drivethtrough, i.e. tanks can pass through it @param shoot @c true if the obstacle is shootthrough, i.e. bullets can pass through it */ Obstacle(const float* pos, float rotation, float hwidth, float hbreadth, float height, bool drive = false, bool shoot = false, bool rico = false); /** This function makes a copy using the given transform */ virtual Obstacle* copyWithTransform(const MeshTransform&) const; /** A virtual destructor is needed to let subclasses do their cleanup. */ virtual ~Obstacle(); /** This function returns a string describing what kind of obstacle this is. */ virtual const char* getType() const = 0; /** This function calculates extents from pos, size, and rotation */ void setExtents(); /** This function returns true if the obstacle is valid */ virtual bool isValid() const; /** This function returns true if the obstacle has a flat top */ virtual bool isFlatTop() const; /** TThis function returns the network packed size in bytes */ virtual int packSize() const = 0; /** This function packs the obstacle into buf */ virtual void *pack(void* buf) const = 0; /** This function unpacks the obstacle from buf */ virtual void *unpack(void* buf) = 0; /** This function prints the obstacle to the stream */ virtual void print(std::ostream& out, const std::string& indent) const = 0; /** This function prints the obstacle in Alias Wavefront format to the stream */ virtual void printOBJ(std::ostream&, const std::string&) const { return; } /** This function returns the position of this obstacle. */ const Extents& getExtents() const; /** This function returns the position of this obstacle. */ const float* getPosition() const; /** This function returns the sizes of this obstacle. */ const float* getSize() const; /** This function returns the obstacle's rotation around its own Y axis. */ float getRotation() const; /** This function returns half the obstacle's X size. */ float getWidth() const; /** This function returns half the obstacle's Y size. */ float getBreadth() const; /** This function returns the obstacle's full height. */ float getHeight() const; /** This function returns the time of intersection between the obstacle and a Ray object. If the ray does not intersect this obstacle -1 is returned. */ virtual float intersect(const Ray&) const = 0; /** This function computes the two-dimensional surface normal of this obstacle at the point @c p. The normal is stored in @c n. */ virtual void getNormal(const float* p, float* n) const = 0; /** This function computes the three-dimensional surface normal of this obstacle at the point @c p. The normal is stored in @c n. */ virtual void get3DNormal(const float* p, float* n) const; /** This function checks if a tank, approximated as a cylinder with base centre in point @c p and radius @c radius, intersects this obstacle. */ virtual bool inCylinder(const float* p, float radius, float height) const = 0; /** This function checks if a tank, approximated as a box rotated around its Z axis, intersects this obstacle. */ virtual bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const = 0; /** This function checks if a tank, approximated as a box rotated around its Z axis, intersects this obstacle. It also factors in the difference between the old Z location and the new Z location */ virtual bool inMovingBox(const float* oldP, float oldAngle, const float* newP, float newAngle, float halfWidth, float halfBreadth, float height) const = 0; /** This function checks if a horizontal rectangle crosses the surface of this obstacle. @param p The position of the centre of the rectangle @param angle The rotation of the rectangle @param halfWidth Half the width of the rectangle @param halfBreadth Half the breadth of the rectangle @param plane The tangent plane of the obstacle where it's intersected by the rectangle will be stored here */ virtual bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; /** This function checks if a box moving from @c pos1 to @c pos2 will hit this obstacle, and if it does what the surface normal at the hitpoint is. @param pos1 The original position of the box @param azimuth1 The original rotation of the box @param pos2 The position of the box at the hit @param azimuth2 The rotation of the box at the hit @param halfWidth Half the width of the box @param halfBreadth Half the breadth of the box @param height The height of the box @param normal The surface normal of this obstacle at the hit point will be stored here @returns @c true if the box hits this obstacle, @c false otherwise */ virtual bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const = 0; /** This function returns @c true if tanks can pass through this object, @c false if they can't. */ bool isDriveThrough() const; /** This function returns @c true if bullets can pass through this object, @c false if they can't. */ bool isShootThrough() const; /** This function returns @c true if tanks and bullets can pass through this object, @c false if either can not */ bool isPassable() const; /** This function returns @c true if bullets will bounce off of this * object, @c false if they simply die of contact */ bool canRicochet() const; /** This function sets the "zFlip" flag of this obstacle, i.e. if it's upside down. */ void setZFlip(void); /** This function returns the "zFlip" flag of this obstacle. @see setZFlip() */ bool getZFlip(void) const; // where did the object come from? enum SourceBits { WorldSource = 0, GroupDefSource = (1 << 0), ContainerSource = (1 << 1) }; void setSource(char); char getSource() const; bool isFromWorldFile() const; bool isFromGroupDef() const; bool isFromContainer() const; /** This function resets the object ID counter for printing OBJ files */ static void resetObjCounter(); // inside sceneNodes void addInsideSceneNode(SceneNode* node); void freeInsideSceneNodeList(); int getInsideSceneNodeCount() const; SceneNode** getInsideSceneNodeList() const; /** This boolean is used by CollisionManager. Someone else can 'friend'ify it later. */ bool collisionState; /** The maximum extent of any object parameter */ static const float maxExtent; protected: /** This function checks if a moving horizontal rectangle will hit a box-shaped obstacle, and if it does, computes the obstacle's normal at the hitpoint. @param pos1 The original position of the rectangle @param azimuth1 The original rotation of the rectangle @param pos2 The final position of the rectangle @param azimuth2 The final rotation of the rectangle @param halfWidth Half the width of the rectangle @param halfBreadth Half the breadth of the rectangle @param oPos The position of the obstacle @param oAzimuth The rotation of the obstacle @param oWidth Half the width of the obstacle @param oBreadth Half the breadth of the obstacle @param oHeight The height of the obstacle @param normal The surface normal of the obstacle at the hitpoint will be stored here @returns The time of the hit, where 0 is the time when the rectangle is at @c pos1 and 1 is the time when it's at @c pos2, and -1 means "no hit" */ float getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, const float* oPos, float oAzimuth, float oWidth, float oBreadth, float oHeight, float* normal) const; protected: static int getObjCounter(); static void incObjCounter(); protected: Extents extents; float pos[3]; float size[3]; // width, breadth, height float angle; bool driveThrough; bool shootThrough; bool ricochet; bool ZFlip; char source; private: int insideNodeCount; SceneNode** insideNodes; private: static int objCounter; }; // // Obstacle // inline const Extents& Obstacle::getExtents() const { return extents; } inline const float* Obstacle::getPosition() const { return pos; } inline const float* Obstacle::getSize() const { return size; } inline float Obstacle::getRotation() const { return angle; } inline float Obstacle::getWidth() const { return size[0]; } inline float Obstacle::getBreadth() const { return size[1]; } inline float Obstacle::getHeight() const { return size[2]; } inline void Obstacle::get3DNormal(const float *p, float *n) const { getNormal(p, n); } inline bool Obstacle::isDriveThrough() const { return driveThrough; } inline bool Obstacle::isShootThrough() const { return shootThrough; } inline bool Obstacle::isPassable() const { return (driveThrough && shootThrough); } inline bool Obstacle::canRicochet() const { return ricochet; } inline void Obstacle::setSource(char _source) { source = _source; return; } inline char Obstacle::getSource() const { return source; } inline bool Obstacle::isFromWorldFile() const { return (source == WorldSource); } inline bool Obstacle::isFromGroupDef() const { return ((source & GroupDefSource) != 0); } inline bool Obstacle::isFromContainer() const { return ((source & ContainerSource) != 0); } inline int Obstacle::getObjCounter() { return objCounter; } inline void Obstacle::incObjCounter() { objCounter++; } inline void Obstacle::resetObjCounter() { objCounter = 0; } #endif // BZF_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ObstacleList.h000066400000000000000000000027251200563112200176310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_OBSTACLE_LIST_H #define BZF_OBSTACLE_LIST_H #include "common.h" class Obstacle; class ObstacleList { public: ObstacleList(); ~ObstacleList(); void clear(); void tighten(); void push_back(Obstacle* obs); void remove(unsigned int index); void sort(int (*compare)(const void* a, const void* b)); unsigned int size() const; Obstacle* operator[](int index) const; private: unsigned int listSize; unsigned int listCount; Obstacle** list; }; inline unsigned int ObstacleList::size() const { return listCount; } inline Obstacle* ObstacleList::operator[](int index) const { return list[index]; } inline void ObstacleList::remove(unsigned int index) { if ((index < listCount) && (listCount > 0)) { listCount--; list[index] = list[listCount]; // order is not preserved } return; } #endif // BZF_OBSTACLE_LIST_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ObstacleMgr.h000066400000000000000000000163241200563112200174430ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_OBSTACLE_MGR_H #define BZF_OBSTACLE_MGR_H #include "common.h" // system headers #include #include #include // common headers #include "ObstacleList.h" #include "MeshTransform.h" #include "BzMaterial.h" // avoid nasty dependencies class Obstacle; class BoxBuilding; class PyramidBuilding; class BaseBuilding; class Teleporter; class MeshObstacle; class ArcObstacle; class ConeObstacle; class SphereObstacle; class TetraBuilding; class ObstacleModifier; // // Group Instance // - uses a group definition and a transform to produce obstacles // class GroupInstance { friend class ObstacleModifier; public: GroupInstance(const std::string& groupdef); GroupInstance(); ~GroupInstance(); void init(); void setName(const std::string& name); void setTeam(int team); void setTint(const float tint[4]); void setPhysicsDriver(int phydrv); void setTransform(const MeshTransform&); void setMaterial(const BzMaterial*); void setDriveThrough(); void setShootThrough(); void setCanRicochet(); void addMaterialSwap(const BzMaterial* src, const BzMaterial* dst); const std::string& getName() const; const std::string& getGroupDef() const; const MeshTransform& getTransform() const; void *pack(void*); void *unpack(void*); int packSize(); void print(std::ostream& out, const std::string& indent) const; private: std::string groupdef; std::string name; MeshTransform transform; bool modifyTeam; int team; bool modifyColor; float tint[4]; bool modifyPhysicsDriver; int phydrv; bool modifyMaterial; const BzMaterial* material; bool driveThrough; bool shootThrough; bool ricochet; MaterialMap matMap; }; // // Group Definition // - defines an obstacle group // class GroupDefinition { public: GroupDefinition(const std::string& name); ~GroupDefinition(); enum ObstacleTypes { wallType = 0, boxType, pyrType, baseType, teleType, meshType, arcType, coneType, sphereType, tetraType, ObstacleTypeCount }; void addObstacle(Obstacle* obstacle); void addGroupInstance(GroupInstance* group); void clear(); // delete the list and the obstacles void tighten(); // reduce memory usage void sort(int (*compare)(const void* a, const void* b)); void makeGroups(const MeshTransform& xform, const ObstacleModifier& obsMod) const; void replaceBasesWithBoxes(); void deleteInvalidObstacles(); const std::string& getName() const; const ObstacleList& getList(int type) const; const std::vector& getGroups() const; // Get the list of meshes that came from the world file. // This includes the meshes in group definitions, even if // they have never been instantiated. void getSourceMeshes(std::vector& meshes) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void printGrouped(std::ostream& out, const std::string& indent) const; void printFlatFile(std::ostream& out, const std::string& indent) const; public: static void clearDepthName(); private: Obstacle* newObstacle(int type); void makeTeleName(Obstacle* obs, unsigned int pos) const; void appendGroupName(const GroupInstance* group) const; private: std::string name; ObstacleList lists[ObstacleTypeCount]; std::vector groups; mutable bool active; // for recursion checking private: static std::string depthName; }; inline const std::string& GroupDefinition::getName() const { return name; } inline const ObstacleList& GroupDefinition::getList(int type) const { return lists[type]; } inline const std::vector& GroupDefinition::getGroups() const { return groups; } // // Group Definition Manager // - utility class to keep track of group definitions // class GroupDefinitionMgr { public: GroupDefinitionMgr(); ~GroupDefinitionMgr(); void clear(); // delete the lists and the obstacles void tighten(); // reduce memory usage void makeWorld(); // make the local obstacles for the groups void replaceBasesWithBoxes(); void addWorldObstacle(Obstacle* obstacle); void addGroupDef(GroupDefinition* groupdef); GroupDefinition* findGroupDef(const std::string& name) const; // Get the list of meshes that came from the world file. // This includes the meshes in group definitions, even if // they have never been instantiated. void getSourceMeshes(std::vector& meshes) const; const GroupDefinition* getWorld() const; // convenience functions const ObstacleList& getWalls() const; const ObstacleList& getBoxes() const; const ObstacleList& getPyrs() const; const ObstacleList& getBases() const; const ObstacleList& getTeles() const; const ObstacleList& getMeshes() const; const ObstacleList& getArcs() const; const ObstacleList& getCones() const; const ObstacleList& getSpheres() const; const ObstacleList& getTetras() const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: GroupDefinition world; std::vector list; }; inline const GroupDefinition* GroupDefinitionMgr::getWorld() const { return &world; } inline const ObstacleList& GroupDefinitionMgr::getWalls() const { return world.getList(GroupDefinition::wallType); } inline const ObstacleList& GroupDefinitionMgr::getBoxes() const { return world.getList(GroupDefinition::boxType); } inline const ObstacleList& GroupDefinitionMgr::getPyrs() const { return world.getList(GroupDefinition::pyrType); } inline const ObstacleList& GroupDefinitionMgr::getBases() const { return world.getList(GroupDefinition::baseType); } inline const ObstacleList& GroupDefinitionMgr::getTeles() const { return world.getList(GroupDefinition::teleType); } inline const ObstacleList& GroupDefinitionMgr::getMeshes() const { return world.getList(GroupDefinition::meshType); } inline const ObstacleList& GroupDefinitionMgr::getArcs() const { return world.getList(GroupDefinition::arcType); } inline const ObstacleList& GroupDefinitionMgr::getCones() const { return world.getList(GroupDefinition::coneType); } inline const ObstacleList& GroupDefinitionMgr::getSpheres() const { return world.getList(GroupDefinition::sphereType); } inline const ObstacleList& GroupDefinitionMgr::getTetras() const { return world.getList(GroupDefinition::tetraType); } extern GroupDefinitionMgr OBSTACLEMGR; #endif // BZF_OBSTACLE_MGR_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ObstacleModifier.h000066400000000000000000000027201200563112200204470ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_OBSTACLE_MODIFIER_H #define BZF_OBSTACLE_MODIFIER_H // common headers #include "BzMaterial.h" class Obstacle; class GroupInstance; class ObstacleModifier { public: ObstacleModifier(); ObstacleModifier(const ObstacleModifier& obsMod, const GroupInstance& grpinst); ~ObstacleModifier(); void init(); void execute(Obstacle* obstacle) const; void getMaterialMap(const MaterialSet& matSet, MaterialMap& matMap) const; private: bool modifyTeam; // only for bases int team; bool modifyColor; // modify by tinting float tint[4]; bool modifyPhysicsDriver; // only replaces valid physics drivers int phydrv; bool modifyMaterial; // swaps the whole thing const BzMaterial* material; MaterialMap matMap; bool driveThrough; bool shootThrough; bool ricochet; }; #endif // BZF_OBSTACLE_MODIFIER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ObstacleSceneNodeGenerator.h000066400000000000000000000025421200563112200224250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __OBSTACLESCENENODEGENERATOR_H__ #define __OBSTACLESCENENODEGENERATOR_H__ class WallSceneNode; class ObstacleSceneNodeGenerator { public: virtual ~ObstacleSceneNodeGenerator(); virtual WallSceneNode* getNextNode(float uRepeats, float vRepeats, bool lod) = 0; protected: ObstacleSceneNodeGenerator(); int getNodeNumber() const; int incNodeNumber(); private: // no duplication ObstacleSceneNodeGenerator(const ObstacleSceneNodeGenerator&); ObstacleSceneNodeGenerator& operator=(const ObstacleSceneNodeGenerator&); private: int node; }; inline int ObstacleSceneNodeGenerator::getNodeNumber() const { return node; } inline int ObstacleSceneNodeGenerator::incNodeNumber() { return ++node; } #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OccluderSceneNode.h000066400000000000000000000027651200563112200205710ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OccluderSceneNode: * Encapsulates information for an occluder * plane. Occluders are never rendered. */ #ifndef BZF_OCCLUDER_SCENE_NODE_H #define BZF_OCCLUDER_SCENE_NODE_H #include "common.h" // common implementation headers #include "SceneNode.h" #include "MeshFace.h" class OccluderSceneNode : public SceneNode { public: OccluderSceneNode(const MeshFace* face); ~OccluderSceneNode(); // virtual functions from SceneNode bool cull(const ViewFrustum&) const; bool inAxisBox(const Extents& exts) const; void addShadowNodes(SceneRenderer&) { return; } void addRenderNodes(SceneRenderer&) { return; } void renderRadar() { return; } int getVertexCount () const { return vertexCount; } const GLfloat* getVertex (int vertex) const { return vertices[vertex]; } private: int vertexCount; GLfloat3* vertices; }; #endif // BZF_OCCLUDER_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OpenGLGState.h000066400000000000000000000131751200563112200174760ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OpenGLGState: * Encapsulates OpenGL rendering state information. */ #ifndef BZF_OPENGL_GSTATE_H #define BZF_OPENGL_GSTATE_H #include "common.h" #include "bzfgl.h" class OpenGLMaterial; class OpenGLGStateRep; class OpenGLGStateState; class RenderNode; typedef void (*OpenGLContextFunction)(void* userData); class OpenGLGState { friend class OpenGLGStateBuilder; friend class ContextInitializer; public: OpenGLGState(); OpenGLGState(const OpenGLGState&); OpenGLGState(const OpenGLGStateState&); ~OpenGLGState(); OpenGLGState& operator=(const OpenGLGState& state); void setState() const; bool getNeedsSorting() const; bool isBlended() const; bool isTextured() const; bool isTextureMatrix() const; bool isSphereMap() const; bool isLighted() const; void addRenderNode(RenderNode* node) const; static void resetState(); static void clearLists(); static void renderLists(); static void setStipple(GLfloat alpha); static void setStippleIndex(int index); static int getStippleIndex(float alpha); static int getOpaqueStippleIndex(); static void init(); static bool haveGLContext(); // these are in OpenGLGState for lack of a better place. register... // is for clients to add a function to call when the OpenGL context // has been destroyed and must be recreated. the function is called // by initContext() and initContext() will call all initializers in // the order they were registered, plus reset the OpenGLGState state. // // // The freeFunc()'s job is to make sure that all references that the // owning object might use are invalidated. It should also deallocate // any GL objects that it might have collected. If the references are // not invalidated, then the owner may end up deleting GL objects that // it does not own, because the references have been changed during the // context switch (ex: another routine might have received the same // references when making new objects.) // // The initFunc()'s job is to reallocate GL objects for its owner. // // Destroying and recreating the OpenGL context is only necessary on // platforms that cannot abstract the graphics system sufficiently. // for example, on win32, changing the display bit depth will cause // most OpenGL drivers to crash unless we destroy the context before // the switch and recreate it afterwards. // static void registerContextInitializer( OpenGLContextFunction freeFunc, OpenGLContextFunction initFunc, void* userData); static void unregisterContextInitializer( OpenGLContextFunction freeFunc, OpenGLContextFunction initFunc, void* userData); static void initContext(); static bool getExecutingFreeFuncs(); static bool getExecutingInitFuncs(); private: static void initGLState(); static void freeStipple(void*); static void initStipple(void*); class ContextInitializer { public: friend class OpenGLGState; ContextInitializer(OpenGLContextFunction freeFunc, OpenGLContextFunction initFunc, void* data); ~ContextInitializer(); static void executeFreeFuncs(); static void executeInitFuncs(); static ContextInitializer* find(OpenGLContextFunction freeFunc, OpenGLContextFunction initFunc, void* data); public: OpenGLContextFunction freeCallback; OpenGLContextFunction initCallback; void* userData; ContextInitializer* prev; ContextInitializer* next; static ContextInitializer* head; static ContextInitializer* tail; }; private: OpenGLGStateRep* rep; static GLuint stipples; public: static bool executingFreeFuncs; static bool executingInitFuncs; }; inline bool OpenGLGState::getExecutingFreeFuncs() { return executingFreeFuncs; } inline bool OpenGLGState::getExecutingInitFuncs() { return executingInitFuncs; } class OpenGLGStateBuilder { public: OpenGLGStateBuilder(); OpenGLGStateBuilder(const OpenGLGState&); ~OpenGLGStateBuilder(); OpenGLGStateBuilder &operator=(const OpenGLGState&); void reset(); void enableTexture(bool = true); void enableTextureMatrix(bool = true); void enableSphereMap(bool = true); void enableMaterial(bool = true); void resetBlending(); void resetSmoothing(); void resetAlphaFunc(); void setTexture(const int texture); void setTextureMatrix(const GLfloat* matrix); void setTextureEnvMode(GLenum mode = GL_MODULATE); void setMaterial(const OpenGLMaterial& material); void setBlending(GLenum sFactor = GL_SRC_ALPHA, GLenum dFactor = GL_ONE_MINUS_SRC_ALPHA); void setStipple(float alpha); void setSmoothing(bool smooth = true); void setCulling(GLenum culling); void setShading(GLenum shading = GL_SMOOTH); void setAlphaFunc(GLenum func = GL_GEQUAL, GLclampf ref = 0.1f); void setNeedsSorting(bool); OpenGLGState getState() const; private: void init(const OpenGLGState&); private: OpenGLGStateState* state; }; #endif // BZF_OPENGL_GSTATE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OpenGLLight.h000066400000000000000000000054071200563112200173550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OpenGLLight: * Encapsulates an OpenGL (point or directional) light source. */ #ifndef BZF_OPENGL_LIGHT_H #define BZF_OPENGL_LIGHT_H // common goes first #include "common.h" // system headers #include // common headers #include "bzfgl.h" #include "ViewFrustum.h" class OpenGLLight { public: OpenGLLight(); OpenGLLight(const OpenGLLight&); ~OpenGLLight(); OpenGLLight& operator=(const OpenGLLight&); const GLfloat* getPosition() const; const GLfloat* getColor() const; const GLfloat* getAttenuation() const; GLfloat getMaxDist() const; void setDirection(const GLfloat* xyz); void setPosition(const GLfloat* xyz); void setColor(GLfloat r, GLfloat g, GLfloat b); void setColor(const GLfloat* rgb); void setAttenuation(const GLfloat* clq); void setAttenuation(int index, GLfloat value); void calculateImportance(const ViewFrustum& frustum); GLfloat getImportance() const; void setOnlyReal(bool value); bool getOnlyReal() const; void setOnlyGround(bool value); bool getOnlyGround() const; void execute(int index, bool useList) const; static GLint getMaxLights(); static void enableLight(int index, bool on); // const protected: void makeLists(); void freeLists(); void genLight(GLenum light) const; private: static void freeContext(void*); static void initContext(void*); private: GLfloat pos[4]; GLfloat color[4]; GLfloat atten[3]; GLfloat maxDist; GLfloat importance; bool onlyReal; bool onlyGround; GLuint* lists; static GLint maxLights; }; // // OpenGLLight // inline const GLfloat* OpenGLLight::getPosition() const { return pos; } inline const GLfloat* OpenGLLight::getColor() const { return color; } inline const GLfloat* OpenGLLight::getAttenuation() const { return atten; } inline GLfloat OpenGLLight::getMaxDist() const { return maxDist; } inline GLfloat OpenGLLight::getImportance() const { return importance; } inline bool OpenGLLight::getOnlyReal() const { return onlyReal; } inline bool OpenGLLight::getOnlyGround() const { return onlyGround; } #endif // BZF_OPENGL_LIGHT_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OpenGLMaterial.h000066400000000000000000000053551200563112200200460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OpenGLMaterial: * Encapsulates an OpenGL material. * * All materials are for front and back faces. * OpenGLMaterial reference counts so copying or assigning a * material keeps the same display list until the object is * changed. * * operator==() returns true iff the two objects refer to the * same display list. operator!=() returns true iff the two * objects do not refer to the same display list. Materials * that don't refer to the same display list but have exactly * the same colors and shininess compare not-equal. * * <, <=, >, >= define an arbitrary ordering of materials. */ #ifndef BZF_OPENGL_MATERIAL_H #define BZF_OPENGL_MATERIAL_H #include "common.h" #include "bzfgl.h" class OpenGLMaterial { public: OpenGLMaterial(); OpenGLMaterial(const GLfloat* specularRGB, const GLfloat* emissiveRGB, GLfloat shininess = 0.0f); OpenGLMaterial(const OpenGLMaterial&); ~OpenGLMaterial(); OpenGLMaterial& operator=(const OpenGLMaterial&); bool operator==(const OpenGLMaterial&) const; bool operator!=(const OpenGLMaterial&) const; bool operator<(const OpenGLMaterial&) const; const GLfloat* getSpecularColor() const; const GLfloat* getEmissiveColor() const; GLfloat getShininess() const; bool isValid() const; void execute() const; private: class Rep { public: ~Rep(); void ref(); void unref(); void execute(); static Rep* getRep(const GLfloat* specular, const GLfloat* emissive, GLfloat shininess); private: Rep(const GLfloat* specular, const GLfloat* emissive, GLfloat shininess); static void freeContext(void*); static void initContext(void*); public: int refCount; Rep* prev; Rep* next; GLuint list; GLfloat specular[4]; GLfloat emissive[4]; GLfloat shininess; static Rep* head; }; Rep* rep; }; // // OpenGLMaterial // inline const GLfloat* OpenGLMaterial::getSpecularColor() const { return rep->specular; } inline const GLfloat* OpenGLMaterial::getEmissiveColor() const { return rep->emissive; } inline GLfloat OpenGLMaterial::getShininess() const { return rep->shininess; } #endif // BZF_OPENGL_MATERIAL_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OpenGLTexture.h000066400000000000000000000077351200563112200177540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* OpenGLTexture: * Encapsulates an OpenGL texture. * * Data must be in GL_RGBA format with type GL_UNSIGNED_BYTE. * If, for all pixels, the RGB components are equal, then * the data will be transformed to GL_LUMINANCE_ALPHA. If, * for all pixels, the alpha component is opaque, then the * data will be transformed to GL_LUMINANCE or GL_RGB. * hasAlpha() will return true iff the alpha component was * kept. * * OpenGLTexture reference counts so copying or assigning a * texture keeps the same display list until the object is * changed. * * A default constructed texture is invalid. The only way to * make such an object valid is to assign a valid texture to it. * Drawing an invalid texture has no effect. * * operator==() returns true iff the two objects refer to the * same display list. operator!=() returns true iff the two * objects do not refer to the same display list. Textures * that don't refer to the same display list but have exactly * the same texture map compare not-equal. * * <, <=, >, >= define an arbitrary ordering of textures. */ #ifndef BZF_OPENGL_TEXTURE_H #define BZF_OPENGL_TEXTURE_H #include "common.h" #include #include "bzfgl.h" class OpenGLTexture { public: enum Filter { Off, Nearest, Linear, NearestMipmapNearest, LinearMipmapNearest, NearestMipmapLinear, LinearMipmapLinear, Max = LinearMipmapLinear, Default = Max }; OpenGLTexture(int width, int height, const GLvoid* pixels, Filter maxFilter = Linear, bool repeat = true, int internalFormat = 0); ~OpenGLTexture(); bool hasAlpha() const; void execute(); float getAspectRatio() const; int getWidth() const; int getHeight() const; Filter getFilter(); void setFilter(Filter); bool getColorAverages(float rgbaRaw[4], bool factorAlpha) const; void freeContext(); void initContext(); static int getFilterCount(); static const char* getFilterName(Filter id); static const char** getFilterNames(); static Filter getMaxFilter(); static void setMaxFilter(Filter); private: OpenGLTexture(const OpenGLTexture&); OpenGLTexture& operator=(const OpenGLTexture&); bool operator==(const OpenGLTexture&) const; bool operator!=(const OpenGLTexture&) const; bool operator<(const OpenGLTexture&) const; int getBestFormat( int width, int height, const GLvoid* pixels); void bind(); bool setupImage(const GLubyte* pixels); void* operator new(size_t s) { return ::operator new(s);} void operator delete(void *p) {::operator delete(p);} bool alpha; const int width; const int height; GLint scaledWidth; GLint scaledHeight; GLubyte* image; GLubyte* imageMemory; bool repeat; int internalFormat; GLuint list; Filter filter; static Filter maxFilter; static const int filterCount; static const char* configFilterNames[]; static const GLenum minifyFilter[]; static const GLenum magnifyFilter[]; static void static_freeContext(void *that); static void static_initContext(void *that); friend class TextureManager; }; // // OpenGLTexture // inline bool OpenGLTexture::hasAlpha() const { return alpha; } inline int OpenGLTexture::getWidth() const { return width; } inline int OpenGLTexture::getHeight() const { return height; } #endif // BZF_OPENGL_TEXTURE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/OpenGLUtils.h000066400000000000000000000064411200563112200174050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * Writen By Jeffrey Myers * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __OPENGLUTILS_H__ #define __OPENGLUTILS_H__ #include "common.h" // system headers #include #include #include // common headers #include "bzfgl.h" #include "vectors.h" class BzMaterial; class OpenGLGState; #define INVALID_GL_ID 0xffffffff extern void bzMat2gstate(const BzMaterial* bzmat, OpenGLGState& gstate, fvec4& color, const fvec4*& colorPtr); extern bool parseBlendFactors(const std::string& s, GLenum& src, GLenum& dst); extern float getFloatColor(int val); extern void setColor(float dstColor[3], int r, int g, int b); extern void glSetColor(const float c[3], float alpha = 1.0f); extern void glTranslatefv(const float v[3]); typedef enum { eCenter, eLowerLeft, eLowerRight, eUpperLeft, eUpperRight, eCenterLeft, eCenterRight, eCenterTop, eCenterBottom } eAlignment; extern void glQuad(float x, float y, eAlignment align, float scale = 1.0f); extern void glLineRing(float radius, float width = 1.0f); // draw an outline box with the outside at the bounds, and inset by the thickness extern void glOutlineBoxCP(float thickness, float centerX, float centerY, float width, float height, float depth = 0.0f); inline void glOutlineBoxCP(float t, int x, int y, int w, int h, int d = 0) { glOutlineBoxCP(t, (float)x, (float)y, (float)w, (float)h, (float)d); } extern void glOutlineBoxHV(float thickness, float minX, float minY, float maxX, float maxY, float depth = 0.0f); inline void glOutlineBoxHV(float t, int minX, int minY, int maxX, int maxY, int d = 0) { glOutlineBoxHV(t, (float)minX, (float)minY, (float)maxX, (float)maxY, (float)d); } // draw an outline tabbed box extern void glOutlineTabbedBox(float thickness, float minX, float minY, float maxX, float maxY, float tabInset, float tabWidth, float tabHeight, float depth = 0); // display list system typedef unsigned int GLDisplayList; #define _INVALID_LIST INVALID_GL_ID class GLDisplayListCreator { public: virtual ~GLDisplayListCreator() {} virtual void buildGeometry(GLDisplayList displayList) = 0; }; class DisplayListSystem { public: static DisplayListSystem& Instance() { static DisplayListSystem dls; return dls; } ~DisplayListSystem(); GLDisplayList newList(GLDisplayListCreator *creator); void freeList(GLDisplayList displayList); void flushLists(); void callList(GLDisplayList displayList); void callListsV(std::vector &displayLists); protected: DisplayListSystem(); typedef struct _DisplayList { GLDisplayListCreator *creator; unsigned int list; } DisplayList; std::map lists; GLDisplayList lastList; }; #endif // __OPENGLUTILS_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PTSceneNode.h000066400000000000000000000036131200563112200173450ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* PhotonTorpedoSceneNode: * Encapsulates information for rendering a photon torpedo-ish * object. */ #ifndef BZF_PHOTON_TORPEDO_SCENE_NODE_H #define BZF_PHOTON_TORPEDO_SCENE_NODE_H #include "common.h" #include "ShotSceneNode.h" #include "OpenGLLight.h" class PhotonTorpedoSceneNode : public ShotSceneNode { public: PhotonTorpedoSceneNode(const GLfloat pos[3]); ~PhotonTorpedoSceneNode(); void move(const GLfloat pos[3], const GLfloat forward[3]); void addLight(SceneRenderer&); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class PTRenderNode : public RenderNode { public: PTRenderNode(const PhotonTorpedoSceneNode*); ~PTRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const PhotonTorpedoSceneNode* sceneNode; int numFlares; float theta[6]; float phi[6]; static GLfloat core[9][2]; static GLfloat corona[8][2]; static const GLfloat ring[8][2]; }; friend class PTRenderNode; private: OpenGLLight light; OpenGLGState gstate; PTRenderNode renderNode; static const GLfloat CoreSize; static const GLfloat CoronaSize; static const GLfloat FlareSize; static const GLfloat FlareSpread; }; #endif // BZF_PHOTON_TORPEDO_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Pack.h000066400000000000000000000042501200563112200161120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Functions to write various data types packed into a buffer * in network byte order, or to read various types out of a * buffer. * * floats may be converted to some platform independent form before * packing and converted from that form when unpacking; precision * may be lost. */ #ifndef BZF_PACK_H #define BZF_PACK_H #include "common.h" #include extern void* nboPackUByte(void*, uint8_t); extern void* nboPackShort(void*, int16_t); extern void* nboPackInt(void*, int32_t); extern void* nboPackUShort(void*, uint16_t); extern void* nboPackUInt(void*, uint32_t); extern void* nboPackFloat(void*, float); extern void* nboPackVector(void*, const float*); extern void* nboPackString(void*, const void*, int len); extern void* nboPackStdString(void*, const std::string& str); extern void* nboUnpackUByte(void*, uint8_t&); extern void* nboUnpackShort(void*, int16_t&); extern void* nboUnpackInt(void*, int32_t&); extern void* nboUnpackUShort(void*, uint16_t&); extern void* nboUnpackUInt(void*, uint32_t&); extern void* nboUnpackFloat(void*, float&); extern void* nboUnpackVector(void*, float*); extern void* nboUnpackString(void*, void*, int len); extern void* nboUnpackStdString(void*, std::string& str); extern void* nboUnpackStdStringRaw(void*, std::string& str); extern unsigned int nboStdStringPackSize(const std::string& str); // buffer overrun checking extern void nboUseErrorChecking(bool checking); extern bool nboGetBufferError(); extern void nboClearBufferError(); extern void nboSetBufferLength(unsigned int length); extern unsigned int nboGetBufferLength(); #endif // BZF_PACK_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ParseColor.h000066400000000000000000000016301200563112200173040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _PARSE_COLOR_H_ #define _PARSE_COLOR_H_ #include #include extern bool parseColorCString(const char* str, float color[4]); extern bool parseColorString(const std::string& str, float color[4]); extern bool parseColorStream(std::istream& input, float color[4]); #endif // _PARSE_COLOR_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PhysicsDriver.h000066400000000000000000000064501200563112200200360ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _PHYSICS_DRIVER_H_ #define _PHYSICS_DRIVER_H_ #include "common.h" /* system interface headers */ #include #include #include class PhysicsDriver { public: PhysicsDriver(); ~PhysicsDriver(); bool setName(const std::string& name); void setLinear(const float vel[3]); void setAngular(float angleVel, const float pos[2]); void setRadial(float radialVel, const float pos[2]); void setSlideTime(float slideTime); void setDeathMessage(const std::string& msg); void finalize(); void update(float time); const std::string& getName() const; const float* getLinearVel() const; float getAngularVel() const; const float* getAngularPos() const; float getRadialVel() const; const float* getRadialPos() const; bool getIsSlide() const; float getSlideTime() const; bool getIsDeath() const; const std::string& getDeathMsg() const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: static const float minPeriod; std::string name; float linear[3]; float angularVel; float angularPos[2]; float radialVel; float radialPos[2]; bool slide; float slideTime; bool death; std::string deathMsg; }; inline const float* PhysicsDriver::getLinearVel() const { return linear; } inline float PhysicsDriver::getAngularVel() const { return angularVel; } inline const float* PhysicsDriver::getAngularPos() const { return angularPos; } inline float PhysicsDriver::getRadialVel() const { return radialVel; } inline const float* PhysicsDriver::getRadialPos() const { return radialPos; } inline bool PhysicsDriver::getIsSlide() const { return slide; } inline float PhysicsDriver::getSlideTime() const { return slideTime; } inline bool PhysicsDriver::getIsDeath() const { return death; } inline const std::string& PhysicsDriver::getDeathMsg() const { return deathMsg; } class PhysicsDriverManager { public: PhysicsDriverManager(); ~PhysicsDriverManager(); void update(); void clear(); int addDriver(PhysicsDriver* driver); int findDriver(const std::string& name) const; const PhysicsDriver* getDriver(int id) const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: std::vector drivers; }; inline const PhysicsDriver* PhysicsDriverManager::getDriver(int id) const { if ((id >= 0) && (id < (int)drivers.size())) { return drivers[id]; } else { return NULL; } } extern PhysicsDriverManager PHYDRVMGR; #endif //_PHYSICS_DRIVER_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Ping.h000066400000000000000000000050701200563112200161320ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __PING_H__ #define __PING_H__ #include "common.h" /* system headers */ #include /* common interface headers */ #include "Address.h" #include "Pack.h" #include "multicast.h" // 8 uint16's and 13 uint8's hex encoded static const int PingPacketHexPackedSize = 4 * 8 + 2 * 13; /** PingPacket: * Encapsulates server `ping' info. */ class PingPacket { public: PingPacket(); ~PingPacket(); bool read(int fd, struct sockaddr_in*); bool write(int fd, const struct sockaddr_in*) const; bool waitForReply(int fd, const Address& from, int millisecondsToBlock = 0); void* pack(void*, const char* version) const; void* unpack(void*, char* version); void packHex(char*) const; void unpackHex(char*); void zeroPlayerCounts(); void writeToFile(std::ostream& out) const; bool readFromFile(std::istream& in); static void repackHexPlayerCounts(char*, int* counts); static bool isRequest(int fd, struct sockaddr_in*); static bool sendRequest(int fd, const struct sockaddr_in*); public: ServerId serverId; Address sourceAddr; uint16_t gameOptions; uint16_t gameType; uint16_t maxShots; uint16_t shakeWins; uint16_t shakeTimeout; // 1/10ths of second uint16_t maxPlayerScore; uint16_t maxTeamScore; uint16_t maxTime; // seconds uint8_t maxPlayers; uint8_t rogueCount; uint8_t rogueMax; uint8_t redCount; uint8_t redMax; uint8_t greenCount; uint8_t greenMax; uint8_t blueCount; uint8_t blueMax; uint8_t purpleCount; uint8_t purpleMax; uint8_t observerCount; uint8_t observerMax; private: static int hex2bin(char); static char bin2hex(int); static char* packHex16(char*, uint16_t); static char* unpackHex16(char*, uint16_t&); static char* packHex8(char*, uint8_t); static char* unpackHex8(char*, uint8_t&); private: static const int PacketSize; }; #endif /* __PING_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PlatformFactory.h000066400000000000000000000030221200563112200203440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* PlatformFactory: * Abstract builder for platform dependent stuff. */ #ifndef BZF_PLATFORM_FACTORY_H #define BZF_PLATFORM_FACTORY_H #include "common.h" class BzfDisplay; class BzfVisual; class BzfWindow; class BzfMedia; class BzfJoystick; class PlatformFactory { public: PlatformFactory(); virtual ~PlatformFactory(); virtual BzfDisplay* createDisplay(const char* name, const char* videoFormat) = 0; virtual BzfVisual* createVisual(const BzfDisplay*) = 0; virtual BzfWindow* createWindow(const BzfDisplay*, BzfVisual*) = 0; virtual BzfJoystick* createJoystick(); static PlatformFactory* getInstance(); static BzfMedia* getMedia(); private: PlatformFactory(const PlatformFactory&); PlatformFactory& operator=(const PlatformFactory&); virtual BzfMedia* createMedia() = 0; private: static PlatformFactory* instance; static BzfMedia* media; }; #endif // BZF_PLATFORM_FACTORY_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PlayerInfo.h000077500000000000000000000154001200563112200173060ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __PLAYERINFO_H__ #define __PLAYERINFO_H__ // bzflag global header #include "global.h" // system headers #include #ifndef _WIN32 #include #include #endif // common interface headers #include "TimeKeeper.h" #include "Team.h" #include "Protocol.h" #include "Flag.h" #include "WordFilter.h" #include "StateDatabase.h" enum ClientState { PlayerNoExist, PlayerInLimbo, PlayerDead, PlayerAlive }; enum PlayerReplayState { ReplayNone, ReplayReceiving, ReplayStateful }; #define SEND 1 #define RECEIVE 0 struct TeamInfo { public: Team team; TimeKeeper flagTimeout; }; class PlayerInfo { public: PlayerInfo(int _playerIndex); int getPlayerIndex( void ) const { return playerIndex; } void setLastMsg(std::string msg); const std::string& getLastMsg() const; TimeKeeper getLastMsgTime() const; void incSpamWarns(); int getSpamWarns() const; void resetPlayer(bool ctf); void setRestartOnBase(bool on); bool shouldRestartAtBase(); bool isPlaying() const; void signingOn(); bool isAlive() const; void setAlive(); void setDead(); bool isPaused() const; bool isAutoPilot() const; bool isBot() const; bool isHuman() const; void *packUpdate(void *buf); void *packId(void *buf); bool unpackEnter(void *buf, uint16_t &rejectCode, char *rejectMsg); bool processEnter ( uint16_t &rejectCode, char *rejectMsg ); const char *getCallSign() const; void setCallSign(const char * c); const char *getMotto() const; void setMotto(const char* _motto); const char *getToken() const; void setToken(const char * c); void clearToken(); void *packVirtualFlagCapture(void *buf); bool isTeam(TeamColor team) const; bool isObserver() const; TeamColor getTeam() const; void setTeam(TeamColor team); void wasARabbit(); void wasNotARabbit(); bool isARabbitKill(PlayerInfo &victim) const; void resetFlag(); bool haveFlag() const; int getFlag() const; void setFlag(int flag); bool isFlagTransitSafe(); const char *getClientVersion(); void setClientVersion(const char * c); void getClientVersionNumbers(int& major, int& minor, int& revision); std::string getIdleStat(); bool canBeRabbit(bool relaxing = false); void setPaused(bool paused); void setAutoPilot(bool autopilot); bool isTooMuchIdling(float kickThresh); bool hasStartedToNotRespond(); void hasSent(); bool hasPlayedEarly(); void setCompletelyAdded() {completelyAdded = true;} bool isCompletelyAdded() {return completelyAdded;} TimeKeeper getNextSpawnTime() const; void setSpawnDelay(double delay); bool waitingToSpawn() const; void queueSpawn(); void setPlayedEarly(bool early = true); void setReplayState(PlayerReplayState state); void updateIdleTime(); PlayerReplayState getReplayState(); static void setCurrentTime(TimeKeeper tm); static void setFilterParameters(bool callSignFiltering, WordFilter &filterData, bool simpleFiltering); void setTrackerID(unsigned short int t); unsigned short int trackerID(); static TimeKeeper now; int endShotCredit; int endShotShieldCredit; PlayerType getType( void ) {return type;} void setType( PlayerType t ) {type = t;} private: void cleanMotto(); bool isCallSignReadable(); bool isMottoReadable(); int playerIndex; bool restartOnBase; // current state of player ClientState state; // Need to know if entered is already done bool hasDoneEntering; // type of player PlayerType type; // player's pseudonym char callSign[CallSignLen]; // token from db server char token[TokenLen]; // player's motto char motto[MottoLen]; // version information from client char clientVersion[VersionLen]; int clientVersionMajor; int clientVersionMinor; int clientVersionRevision; // player's team TeamColor team; // true for dead rabbit until respawn bool wasRabbit; // flag index player has int flag; // addPlayer has completed for this player bool completelyAdded; TimeKeeper lastFlagDropTime; // time of player's next allowed spawn TimeKeeper nextSpawnTime; // Requested a spawn? bool wantsToSpawn; // spam prevention std::string lastMsgSent; int spamWarns; TimeKeeper lastMsgTime; bool paused; TimeKeeper pausedSince; bool autopilot; bool notResponding; // Has the player been sent any replay 'faked' state PlayerReplayState replayState; // idle kick TimeKeeper lastmsg; TimeKeeper lastupdate; // player played before countdown started bool playedEarly; // tracker id for position tracking unsigned short int tracker; // Error string std::string errorString; // just need one of these for static WordFilter serverSpoofingFilter; static bool callSignFiltering; static WordFilter *filterData; static bool simpleFiltering; }; inline bool PlayerInfo::isPlaying() const { return state > PlayerInLimbo; } inline bool PlayerInfo::isHuman() const { return (type == TankPlayer) && hasDoneEntering; } inline bool PlayerInfo::haveFlag() const { return flag >= 0; } inline int PlayerInfo::getFlag() const { return flag; } inline const std::string& PlayerInfo::getLastMsg() const { return lastMsgSent; } inline TimeKeeper PlayerInfo::getLastMsgTime() const { return lastMsgTime; } inline int PlayerInfo::getSpamWarns() const { return spamWarns; } inline void PlayerInfo::incSpamWarns() { ++spamWarns; } inline void PlayerInfo::setLastMsg(std::string msg) { lastMsgSent = msg; lastMsgTime = now; } inline bool PlayerInfo::isAlive() const { return state == PlayerAlive; } inline bool PlayerInfo::isPaused() const { return paused; } inline bool PlayerInfo::isAutoPilot() const { return autopilot; } inline bool PlayerInfo::isBot() const { return type == ComputerPlayer; } inline bool PlayerInfo::isARabbitKill(PlayerInfo &victim) const { return wasRabbit || victim.team == RabbitTeam; } inline TimeKeeper PlayerInfo::getNextSpawnTime() const { return nextSpawnTime; } inline void PlayerInfo::setSpawnDelay(double delay) { nextSpawnTime = TimeKeeper::getCurrent(); nextSpawnTime += delay; } inline bool PlayerInfo::waitingToSpawn() const { return wantsToSpawn; } inline void PlayerInfo::queueSpawn() { wantsToSpawn = true; } #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PlayerState.h000066400000000000000000000043261200563112200174750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_PLAYERSTATE_H #define BZF_PLAYERSTATE_H #include "common.h" class PlayerState { public: enum PStatus { // bit masks DeadStatus = 0, // not alive, not paused, etc. Alive = (1 << 0), // player is alive Paused = (1 << 1), // player is paused Exploding = (1 << 2), // currently blowing up Teleporting = (1 << 3), // teleported recently FlagActive = (1 << 4), // flag special powers active CrossingWall = (1 << 5), // tank crossing building wall Falling = (1 << 6), // tank accel'd by gravity OnDriver = (1 << 7), // tank is on a physics driver UserInputs = (1 << 8), // user speed and angvel are sent JumpJets = (1 << 9), // tank has jump jets on PlaySound = (1 << 10) // play one or more sounds }; enum PStatusSounds { NoSounds = 0, JumpSound = (1 << 0), WingsSound = (1 << 1), BounceSound = (1 << 2) }; PlayerState(); void* pack(void*, uint16_t& code); void* unpack(void*, uint16_t code); long order; // packet ordering short status; // see PStatus enum float pos[3]; // position of tank float velocity[3]; // velocity of tank float azimuth; // orientation of tank float angVel; // angular velocity of tank int phydrv; // physics driver // the following are to be used only for drawing float userSpeed; // user's desired angular velocity float userAngVel; // angular velocity of tank float jumpJetsScale; // angular velocity of tank // used to avoid awkward remote bouncy sounds uint8_t sounds; // for playing sounds }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PolyWallSceneNode.h000066400000000000000000000035501200563112200205650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* PolyWallSceneNode: * Encapsulates information for rendering a planar * polygonal wall. Does not support level of detail. */ #ifndef BZF_POLY_WALL_SCENE_NODE_H #define BZF_POLY_WALL_SCENE_NODE_H #include "common.h" #include "WallSceneNode.h" class PolyWallSceneNode : public WallSceneNode { public: PolyWallSceneNode(const GLfloat3Array& vertices, const GLfloat2Array& uvs); ~PolyWallSceneNode(); int split(const float*, SceneNode*&, SceneNode*&) const; void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); void renderRadar(); void getRenderNodes(std::vector& rnodes); protected: class Geometry : public RenderNode { public: Geometry(PolyWallSceneNode*, const GLfloat3Array& vertices, const GLfloat2Array& uvs, const GLfloat* normal); ~Geometry(); void setStyle(int _style) { style = _style; } void render(); const GLfloat* getPosition() const { return wall->getSphere(); } private: void drawV() const; void drawVT() const; private: PolyWallSceneNode* wall; int style; const GLfloat* normal; public: GLfloat3Array vertex; GLfloat2Array uv; }; private: Geometry* node; Geometry* shadowNode; }; #endif // BZF_POLY_WALL_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PositionTracker.h000066400000000000000000000113331200563112200203540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __POSITIONTRACKER_H__ #define __POSTIIONTRACKER_H__ // common header first #include "common.h" /* system interface headers */ #include #include #include #include /* common interface headers */ #include "TimeKeeper.h" /** PositionTracker keeps track of where things are in a 3D Cartesian * coordinate space. It can give introspective information like where * things are and how close other tracked objects are. Objects may be * grouped into separate categories for subsearching. All objects are * labeled with either a string or numeric identifier. */ class PositionTracker { public: typedef enum idtype { UNSET_ID, INT_ID, STR_ID } idtype_t; private: /** something that we are tracking (uniquely identified by either an * integer or a string) */ typedef struct item { idtype_t id; long int intID; std::string strID; TimeKeeper lastUpdate; double position[3]; // position in Cartesian 3-space coodinates bool forgotten; } item_t; typedef std::vector TrackedItemVector; /** the actual collection of things being tracked are categorized * into some provided group name. using that group name (which is * "" if not provided), we get back a set of tracked objects. */ std::map _trackedItem; /** waypoint distance matrix */ std::map, double> _waypointDistance; protected: public: PositionTracker(); PositionTracker(const PositionTracker& tracker); ~PositionTracker(); /** inform the tracker that there is intent to track something new. * tracking items may be categorized using a provided group name. a * token is returned that must be used for subsequent updates. */ unsigned short track(const std::string &id, std::string group = std::string("")); unsigned short track(long int id, std::string group = std::string("")); /** update the position of a tracked item. returns truthfully * whether the update could be performed (i.e. whether the id * existed). the token and string id are both required for * validation. */ bool update(unsigned short int token, const std::string &id, const double position[3], std::string group = std::string("")); bool update(unsigned short int token, const std::string &id, const float position[3], std::string group = std::string("")); bool update(unsigned short int token, long int id, const double position[3], std::string group = std::string("")); bool update(unsigned short int token, long int id, const float position[3], std::string group = std::string("")); /** add a waypoint to the tracker so that it can calculate shortest * paths better. A negative distance will cause the real distance * to be computed and stored, otherwise a non-negative distance will * indicate how "far" the two points are. Setting the distance to * zero or near zero is akin to a teleporter. */ bool addWaypoint(const double from[3], const double to[3], double distance=-1.0); bool addWaypoint(const float from[3], const float to[3], double distance=-1.0); /** stop tracking something if it was being tracked. the token and * string id are both required for validation. */ bool forget(unsigned short int token, const std::string &id, std::string group = std::string("")); bool forget(unsigned short int token, long int id, std::string group = std::string("")); /** compute the simple distance between two tracked items given their tokens. */ double distanceBetween(unsigned short int fromToken, unsigned short int toToken, std::string fromGroup=std::string(""), std::string toGroup=std::string("")) const; /** compute the shortest distance between two tracked items, * utilizing available waypoint shortcuts. */ double waypointDistance(unsigned short int fromToken, unsigned short int toToken, std::string fromGroup=std::string(""), std::string toGroup=std::string("")) const; /** returns a count of how many objects are being tracked in a * particular group. */ unsigned short int trackedCount(std::string group = std::string("")) const; }; #else class PositionTracker; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Protocol.h000066400000000000000000000270421200563112200170410ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Communication protocol constants */ #ifndef BZF_PROTOCOL_H #define BZF_PROTOCOL_H #include "common.h" // magic to identify a bzflag server. first four characters are the // bzflag magic. the last four give the version number. the first // digit is the major release, the second and third digits are the // minor release, and the last character is the revision. The major // number should increment when there've been sweeping changes in the // whole program. The minor release should increment for smaller // changes that make the new version incompatible with older servers // or clients. The revision should be incremented for minor changes // that don't cause incompatibility. // adding new flags or changing the communication protocol requires // minor release number changes. adding new graphics effects normally // only requires incrementing the revision number. // well known service port number for bzflag server const int ServerPort = 5154; // port for udp broadcasts used to find servers on local lan const int BroadcastPort = 5154; // URL for default list server const char* const DefaultListServerURL = "http://my.BZFlag.org/db/"; const char* const DefaultMasterBanURL = "http://bzflag.org/master-bans.txt"; const char* const DefaultMOTDServer = "http://bzflag.org/motd.php"; // maximum size of any message (including header and length fields) const int MaxPacketLen = 1024; // the banned tag const char* const BanRefusalString = "REFUSED:"; // player attributes for the MsgPlayerInfo message enum PlayerAttribute { IsRegistered = 1 << 0, IsVerified = 1 << 1, IsAdmin = 1 << 2 }; // null message code -- should never be sent const uint16_t MsgNull = 0x0000; // server message codes const uint16_t MsgAccept = 0x6163; // 'ac' const uint16_t MsgAdminInfo = 0x6169; // 'ai' const uint16_t MsgAlive = 0x616c; // 'al' const uint16_t MsgAddPlayer = 0x6170; // 'ap' const uint16_t MsgAutoPilot = 0x6175; // 'au' const uint16_t MsgCaptureFlag = 0x6366; // 'cf' const uint16_t MsgCustomSound = 0x6373; // 'cs' const uint16_t MsgCacheURL = 0x6375; // 'cu' const uint16_t MsgDropFlag = 0x6466; // 'df' const uint16_t MsgEnter = 0x656e; // 'en' const uint16_t MsgExit = 0x6578; // 'ex' const uint16_t MsgFlagType = 0x6674; // 'ft' const uint16_t MsgFlagUpdate = 0x6675; // 'fu' const uint16_t MsgFetchResources = 0x6672; // 'fr' const uint16_t MsgGrabFlag = 0x6766; // 'gf' const uint16_t MsgGMUpdate = 0x676d; // 'gm' const uint16_t MsgGetWorld = 0x6777; // 'gw' const uint16_t MsgGameSettings = 0x6773; // 'gs' const uint16_t MsgGameTime = 0x6774; // 'gt' const uint16_t MsgHandicap = 0x6863; // 'hc' const uint16_t MsgKilled = 0x6b6c; // 'kl' const uint16_t MsgLagState = 0x6c73; // 'ls' const uint16_t MsgMessage = 0x6d67; // 'mg' const uint16_t MsgNearFlag = 0x4e66; // 'Nf' const uint16_t MsgNewRabbit = 0x6e52; // 'nR' const uint16_t MsgNegotiateFlags = 0x6e66; // 'nf' const uint16_t MsgPause = 0x7061; // 'pa' const uint16_t MsgPlayerInfo = 0x7062; // 'pb' const uint16_t MsgPlayerUpdate = 0x7075; // 'pu' const uint16_t MsgPlayerUpdateSmall = 0x7073; // 'ps' const uint16_t MsgQueryGame = 0x7167; // 'qg' const uint16_t MsgQueryPlayers = 0x7170; // 'qp' const uint16_t MsgReject = 0x726a; // 'rj' const uint16_t MsgRemovePlayer = 0x7270; // 'rp' const uint16_t MsgReplayReset = 0x7272; // 'rr' const uint16_t MsgShotBegin = 0x7362; // 'sb' const uint16_t MsgScore = 0x7363; // 'sc' const uint16_t MsgScoreOver = 0x736f; // 'so' const uint16_t MsgShotEnd = 0x7365; // 'se' const uint16_t MsgSuperKill = 0x736b; // 'sk' const uint16_t MsgSetVar = 0x7376; // 'sv' const uint16_t MsgTimeUpdate = 0x746f; // 'to' const uint16_t MsgTeleport = 0x7470; // 'tp' const uint16_t MsgTransferFlag = 0x7466; // 'tf' const uint16_t MsgTeamUpdate = 0x7475; // 'tu' const uint16_t MsgWantWHash = 0x7768; // 'wh' const uint16_t MsgWantSettings = 0x7773; // 'ws' const uint16_t MsgPortalAdd = 0x5061; // 'Pa' const uint16_t MsgPortalRemove = 0x5072; // 'Pr' const uint16_t MsgPortalUpdate = 0x5075; // 'Pu' // world database codes const uint16_t WorldCodeHeader = 0x6865; // 'he' const uint16_t WorldCodeBase = 0x6261; // 'ba' const uint16_t WorldCodeBox = 0x6278; // 'bx' const uint16_t WorldCodeEnd = 0x6564; // 'ed' const uint16_t WorldCodeLink = 0x6c6e; // 'ln' const uint16_t WorldCodePyramid = 0x7079; // 'py' const uint16_t WorldCodeMesh = 0x6D65; // 'me' const uint16_t WorldCodeArc = 0x6172; // 'ar' const uint16_t WorldCodeCone = 0x636e; // 'cn' const uint16_t WorldCodeSphere = 0x7370; // 'sp' const uint16_t WorldCodeTetra = 0x7468; // 'th' const uint16_t WorldCodeTeleporter = 0x7465; // 'te' const uint16_t WorldCodeWall = 0x776c; // 'wl' const uint16_t WorldCodeWeapon = 0x7765; // 'we' const uint16_t WorldCodeZone = 0x7A6e; // 'zn' const uint16_t WorldCodeGroup = 0x6772; // 'gr' const uint16_t WorldCodeGroupDefStart = 0x6473; // 'ds' const uint16_t WorldCodeGroupDefEnd = 0x6465; // 'de' // world database sizes const uint16_t WorldSettingsSize = 30; const uint16_t WorldCodeHeaderSize = 10; const uint16_t WorldCodeBaseSize = 31; const uint16_t WorldCodeWallSize = 24; const uint16_t WorldCodeBoxSize = 29; const uint16_t WorldCodeEndSize = 0; const uint16_t WorldCodePyramidSize = 29; const uint16_t WorldCodeMeshSize = 0xA5; // dummy value, sizes are variable const uint16_t WorldCodeArcSize = 85; const uint16_t WorldCodeConeSize = 65; const uint16_t WorldCodeSphereSize = 53; const uint16_t WorldCodeTetraSize = 66; const uint16_t WorldCodeTeleporterSize = 34; const uint16_t WorldCodeLinkSize = 4; const uint16_t WorldCodeWeaponSize = 24; // basic size, not including lists const uint16_t WorldCodeZoneSize = 34; // basic size, not including lists // ping packet sizes, codes and structure const uint16_t MsgPingCodeReply = 0x0303; const uint16_t MsgPingCodeRequest = 0x0404; // rejection codes const uint16_t RejectBadRequest = 0x0000; const uint16_t RejectBadTeam = 0x0001; const uint16_t RejectBadType = 0x0002; const uint16_t RejectBadMotto = 0x0003; const uint16_t RejectTeamFull = 0x0004; const uint16_t RejectServerFull = 0x0005; const uint16_t RejectBadCallsign = 0x0006; const uint16_t RejectRepeatCallsign = 0x0007; const uint16_t RejectRejoinWaitTime = 0x0008; const uint16_t RejectIPBanned = 0x0009; const uint16_t RejectHostBanned = 0x000A; const uint16_t RejectIDBanned = 0x000B; // sound type codes const uint16_t LocalCustomSound = 0x0001; // death by obstacle // FIXME: really a killed reason, NOT a message type. // should not be here at all, should be in BlowedUpReason const uint16_t PhysicsDriverDeath = 0x7064; // 'pd' // request for additional UDP link const uint16_t MsgUDPLinkRequest = 0x6f66; // 'of' const uint16_t MsgUDPLinkEstablished = 0x6f67; // 'og' // server control message const uint16_t MsgServerControl = 0x6f69; // 'oi' // lag ping sent by server to client and reply from client const uint16_t MsgLagPing = 0x7069; // 'pi' /* server communication protocol: --> incoming messages (to server) <-- outgoing messages to single player <== outgoing messages to all players player to server messages: MsgEnter player is joining game --> id, type, team, name, motto <-- MsgReject (if rejected) <-- MsgAccept (if accepted) if accepted, new player is sent (following MsgAccept): <-- MsgTeamUpdate (one per team) <-- MsgFlagUpdate (one per existing flag) <-- MsgAddPlayer (one per already joined player) add, finally, sent to all: <== MsgAddPlayer (player being accepted) MsgExit player is signing off --> /id/ <== MsgRemovePlayer MsgGetWorld request for playing field database --> bytes read so far <-- MsgGetWorld MsgQueryGame request for game state <-- MsgQueryGame MsgQueryPlayers request for player list <-- MsgQueryPlayers MsgAlive player says he's coming alive --> /id, <== MsgAlive MsgKilled player says he's been killed --> /id,/ killer-id, reason, killer-shot-id <== MsgKilled MsgNewRabbit player is relinquishing rabbitship MsgGrabFlag player wants to grab flag --> /id,/ flag <== MsgGrabFlag MsgDropFlag player wants to drop flag --> /id,/ position <== MsgDropFlag <== MsgFlagUpdate MsgCaptureFlag player captured flag --> /id,/ team (team flag was taken to) <== MsgCaptureFlag <== MsgFlagUpdate MsgSetVar <== count/[name/value]* MsgShotBegin player has fired a shot --> FiringInfo <== MsgShotBegin MsgShotEnd shot has terminated --> shooter id, shot number, reason <== MsgShotEnd MsgTeleport player has teleported --> /id,/ from-teleporter, to-teleporter <== MsgTeleport MsgMessage player is sending a message --> /id,/ target-id/team-id, message string <== MsgMessage MsgWantWHash (player wants md5 of world file --> MsgNegotiateFlags -->flagCount/[flagabbv] MsgPause -->true or false server to player messages: MsgSuperKill player must disconnect from server <== MsgTimeUpdate game time left, if == 0 player is dead and can't restart <== time (left, in seconds) MsgScoreOver score limit reached, player is dead and can't restart <== id (winner), team (winner) MsgAccept player request is accepted <== MsgReject player request is rejected <== MsgAddPlayer notification of new tank in game <== id, type, team, name, motto MsgRemovePlayer player has exited the server <== id MsgAdminInfo update of players' IP addresses only sent to players with the PLAYERLIST permission. <-- count, [chunklen, id, bitfield, address]* MsgPlayerInfo update of players status <-- count, [id, bitfield]* MsgFlagUpdate update of flag info <== count, [flag, flag-info]* MsgTeamUpdate update of team info <== teamcount, [team, team-info] MsgGetWorld chunk of world database <-- bytes left, next 256 byte chunk of world database MsgAlive player is alive <== id, position, forward-vector MsgKilled player is dead <== id (victim id), killer-id, reason, killer-shot-id MsgGrabFlag notification that flag is grabbed <== id (grabber), flag, flag-info MsgDropFlag notification that flag is in air <== id (dropper), flag, flag-info MsgCaptureFlag notification that flag has been captured <== id (capturer), flag, team MsgShotBegin some player has fired a shot <== FiringInfo MsgShotEnd shot has expired <== id (shooter id), shot number, reason MsgScore player score has changed <== num-scores [id (player id), wins, losses, tks]*n MsgTeleport player has teleported <== id, from-teleporter, to-teleporter MsgMessage message to players <== from-id, to-id/team-id, message string MsgQueryGame game status MsgQueryPlayers list of players MsgWantWHash md5 digest of world file <== temp|perm, digest MsgNegotiateFlags <== flagCount/[flagabbv] MsgNewRabbit a new rabbit has been anointed <== id MsgPause <== id/true or false */ #endif // BZF_PROTOCOL_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PyramidBuilding.h000066400000000000000000000050701200563112200203200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* PyramidBuilding: * Encapsulates a pyramid in the game environment. */ #ifndef BZF_PYRAMID_BUILDING_H #define BZF_PYRAMID_BUILDING_H #include "common.h" #include #include "Obstacle.h" class PyramidBuilding : public Obstacle { public: PyramidBuilding(); PyramidBuilding(const float* pos, float rotation, float width, float breadth, float height, bool drive = false, bool shoot = false, bool ricochet = false); ~PyramidBuilding(); virtual Obstacle* copyWithTransform(const MeshTransform&) const; const char* getType() const; static const char* getClassName(); // const bool isFlatTop() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal( const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; void getCorner(int index, float* pos) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printOBJ(std::ostream& out, const std::string& indent) const; std::string userTextures[1]; private: void finalize(); // compute minimum shrinking for height between z and z + height float shrinkFactor(float z, float height = 0.0) const; private: static const char* typeName; }; #endif // BZF_PYRAMID_BUILDING_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/PyramidSceneNodeGenerator.h000066400000000000000000000020761200563112200223000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __PYRAMIDSCENENODEGENERATOR_H__ #define __PYRAMIDSCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" #include "PyramidBuilding.h" class PyramidSceneNodeGenerator : public ObstacleSceneNodeGenerator { friend class SceneDatabaseBuilder; public: ~PyramidSceneNodeGenerator(); WallSceneNode* getNextNode(float, float, bool); protected: PyramidSceneNodeGenerator(const PyramidBuilding*); private: const PyramidBuilding* pyramid; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/QuadWallSceneNode.h000066400000000000000000000053421200563112200205350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* QuadWallSceneNode: * Encapsulates information for rendering a quadrilateral wall. */ #ifndef BZF_QUAD_WALL_SCENE_NODE_H #define BZF_QUAD_WALL_SCENE_NODE_H #include "common.h" #include "WallSceneNode.h" class QuadWallSceneNode : public WallSceneNode { public: QuadWallSceneNode(const GLfloat base[3], const GLfloat sEdge[3], const GLfloat tEdge[3], float uRepeats = 1.0, float vRepeats = 1.0, bool makeLODs = true, bool fixedUVs = false); QuadWallSceneNode(const GLfloat base[3], const GLfloat sEdge[3], const GLfloat tEdge[3], float uOffset, float vOffset, float uRepeats, float vRepeats, bool makeLODs); ~QuadWallSceneNode(); int split(const float*, SceneNode*&, SceneNode*&) const; void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); void renderRadar(); bool inAxisBox (const Extents& exts) const; int getVertexCount () const; const GLfloat* getVertex (int vertex) const; virtual void getRenderNodes(std::vector& rnodes); private: void init(const GLfloat base[3], const GLfloat uEdge[3], const GLfloat vEdge[3], float uOffset, float vOffset, float uRepeats, float vRepeats, bool makeLODs, bool fixedUVs); protected: class Geometry : public RenderNode { public: Geometry(QuadWallSceneNode*, int uCount, int vCount, const GLfloat base[3], const GLfloat uEdge[3], const GLfloat vEdge[3], const GLfloat* normal, float uOffset, float vOffset, float uRepeats, float vRepeats, bool fixedUVs); ~Geometry(); void setStyle(int _style) { style = _style; } void render(); void renderShadow(); const GLfloat* getVertex(int i) const; const GLfloat* getPosition() const { return wall->getSphere(); } private: void drawV() const; void drawVT() const; private: WallSceneNode* wall; int style; int ds, dt; int dsq, dsr; const GLfloat* normal; public: GLfloat3Array vertex; GLfloat2Array uv; int triangles; }; private: Geometry** nodes; Geometry* shadowNode; }; #endif // BZF_QUAD_WALL_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/README000066400000000000000000000003171200563112200157430ustar00rootroot00000000000000This is the public header directory. Presently there is no organization or distinction between which header goes with which library. There should, however, be no public headers included in this directory. bzflag-2.4.2+ds1/include/Ray.h000066400000000000000000000024511200563112200157700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_RAY_H #define BZF_RAY_H #include "common.h" #include // for memset() /** Encapsulates a semi-infinite ray. */ class Ray { public: Ray(); Ray(const float* o, const float* d); Ray(const Ray&); ~Ray(); Ray& operator=(const Ray&); const float* getOrigin() const; const float* getDirection() const; void getPoint(float t, float p[3]) const; private: float o[3]; float d[3]; }; // // Ray // inline Ray::Ray(){memset(o,0,sizeof(float)*3); memset(d,0,sizeof(float)*3);} inline Ray::~Ray() { // do nothing } inline const float* Ray::getOrigin() const { return o; } inline const float* Ray::getDirection() const { return d; } #endif // BZF_RAY_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/RenderNode.h000066400000000000000000000057341200563112200172710ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* RenderNode: * Encapsulates information for rendering geometry with a * single gstate. * * RenderNodeList: * Keeps a list of RenderNode* and can render them in order. */ #ifndef BZF_RENDER_NODE_H #define BZF_RENDER_NODE_H #include "common.h" #include "OpenGLGState.h" class RenderNode { public: RenderNode() { } virtual ~RenderNode() { } virtual void render() = 0; virtual void renderShadow() { render(); } virtual void renderRadar() { renderShadow(); } virtual const GLfloat* getPosition() const = 0; static int getTriangleCount(); static void resetTriangleCount(); protected: static void addTriangleCount(int triCount); private: static int triangleCount; }; inline void RenderNode::addTriangleCount(int count) { triangleCount += count; return; } // do not tally unless debugging (for now) #ifndef DEBUG_RENDERING # define addTriangleCount(x) #endif class RenderNodeList { public: RenderNodeList(); ~RenderNodeList(); void clear(); void append(RenderNode*); void render() const; private: // no copying (cos that'd be slow) RenderNodeList(const RenderNodeList&); RenderNodeList& operator=(const RenderNodeList&); void grow(); private: int count; int size; RenderNode** list; }; inline void RenderNodeList::append(RenderNode* node) { if (count == size) { grow(); } list[count++] = node; } class RenderNodeGStateList { public: RenderNodeGStateList(); ~RenderNodeGStateList(); void clear(); void append(RenderNode*, const OpenGLGState*); void append(RenderNode*, const OpenGLGState*, float depth); void render() const; void sort(const GLfloat* eye); // public for the qsort() comparison function struct Item { public: typedef const OpenGLGState* GStatePtr; RenderNode* node; GStatePtr gstate; float depth; }; private: // no copying (cos that'd be slow) RenderNodeGStateList(const RenderNodeGStateList&); RenderNodeGStateList& operator=(const RenderNodeGStateList&); void grow(); private: int count; int size; Item* list; }; inline void RenderNodeGStateList::append(RenderNode* node, const OpenGLGState* gstate) { if (count == size) { grow(); } list[count].node = node; list[count].gstate = gstate; list[count].depth = 0.0f; count++; } #endif // BZF_RENDER_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/SceneDatabase.h000066400000000000000000000040041200563112200177130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* SceneDatabase: * Interface for database of geometry to render */ #ifndef BZF_SCENE_DATABASE_H #define BZF_SCENE_DATABASE_H #include "common.h" #ifndef BUILDING_BZADMIN #include "bzfgl.h" #endif class ViewFrustum; class SceneNode; class SphereSceneNode; class SceneRenderer; class Extents; // NOTE -- SceneDatabase owns all static nodes added to it, // dynamic nodes are the responsibility of the client. class SceneDatabase { public: SceneDatabase(); virtual ~SceneDatabase(); // returns true if the node would have been deleted virtual bool addStaticNode(SceneNode*, bool dontFree) = 0; virtual void addDynamicNode(SceneNode*) = 0; virtual void addDynamicSphere(SphereSceneNode*) = 0; virtual void finalizeStatics() = 0; virtual void removeDynamicNodes() = 0; virtual void removeAllNodes() = 0; virtual bool isOrdered() = 0; virtual void updateNodeStyles() = 0; virtual void addLights(SceneRenderer& renderer) = 0; virtual void addShadowNodes(SceneRenderer &renderer) = 0; virtual void addRenderNodes(SceneRenderer& renderer) = 0; virtual void renderRadarNodes(const ViewFrustum&) = 0; virtual void drawCuller() = 0; virtual void setOccluderManager(int); virtual const Extents* getVisualExtents() const { return NULL; } private: SceneDatabase(const SceneDatabase&); SceneDatabase& operator=(const SceneDatabase&); }; #endif // BZF_SCENE_DATABASE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/SceneNode.h000066400000000000000000000144101200563112200170760ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* SceneNode: * Encapsulates information for rendering an object in the scene. * * GLfloat2 * GLfloat3 * Arrays of two and three GLfloat's * * GLfloat2Array * GLfloat3Array * Arrays of GLfloat2's and GLfloat3's * * Probably shouldn't use names like this (GLfloat...). Oh well. */ #ifndef BZF_SCENE_NODE_H #define BZF_SCENE_NODE_H #include "common.h" #include "bzfgl.h" #include "bzfio.h" #include "OpenGLGState.h" #include "RenderNode.h" #include "Extents.h" #include "vectors.h" #include #if !defined(_WIN32) // bonehead win32 cruft. just make it go away on other platforms. #ifdef __stdcall #undef __stdcall #endif #define __stdcall #endif #define myColor3f(r, g, b) SceneNode::glColor3f(r, g, b) #define myColor4f(r, g, b, a) SceneNode::glColor4f(r, g, b, a) #define myColor3fv(rgb) SceneNode::glColor3fv(rgb) #define myColor4fv(rgba) SceneNode::glColor4fv(rgba) #define myStipple(alpha) SceneNode::setStipple(alpha) class ViewFrustum; class SceneRenderer; class SceneNode { public: SceneNode(); virtual ~SceneNode(); virtual void notifyStyleChange(); const GLfloat* getSphere() const; const Extents& getExtents() const; virtual int getVertexCount () const; virtual const GLfloat* getVertex (int vertex) const; const GLfloat* getPlane() const; const GLfloat* getPlaneRaw() const; virtual GLfloat getDistance(const GLfloat* eye) const; // for BSP virtual bool inAxisBox (const Extents& exts) const; virtual bool cull(const ViewFrustum&) const; virtual bool cullShadow(int pCount, const float (*planes)[4]) const; bool isOccluder() const; void setOccluder(bool value); virtual void addLight(SceneRenderer&); virtual int split(const float* plane, SceneNode*& front, SceneNode*& back) const; virtual void addShadowNodes(SceneRenderer&); virtual void addRenderNodes(SceneRenderer&); virtual void renderRadar(); struct RenderSet { RenderNode* node; const OpenGLGState* gstate; }; virtual void getRenderNodes(std::vector& rnodes); static void setColorOverride(bool = true); static void glColor3f(GLfloat r, GLfloat g, GLfloat b) #ifdef __MINGW32__ {if (!colorOverride) ::glColor3f(r, g, b); }; #else { (*color3f)(r, g, b); } #endif static void glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) #ifdef __MINGW32__ {if (!colorOverride) ::glColor4f(r, g, b, a); }; #else { (*color4f)(r, g, b, a); } #endif static void glColor3fv(const GLfloat* rgb) #ifdef __MINGW32__ {if (!colorOverride) ::glColor3fv(rgb); }; #else { (*color3fv)(rgb); } #endif static void glColor4fv(const GLfloat* rgba) #ifdef __MINGW32__ {if (!colorOverride) ::glColor4fv(rgba); }; #else { (*color4fv)(rgba); } #endif static void setStipple(GLfloat alpha) { (*stipple)(alpha); } enum CullState { OctreeCulled, OctreePartial, OctreeVisible }; /** This boolean is used by the Octree code. Someone else can 'friend'ify it later. */ CullState octreeState; protected: void setRadius(GLfloat radiusSquared); void setCenter(const GLfloat center[3]); void setCenter(GLfloat x, GLfloat y, GLfloat z); void setSphere(const GLfloat sphere[4]); private: SceneNode(const SceneNode&); SceneNode& operator=(const SceneNode&); #ifndef __MINGW32__ static void __stdcall noColor3f(GLfloat, GLfloat, GLfloat); static void __stdcall noColor4f(GLfloat, GLfloat, GLfloat, GLfloat); static void __stdcall noColor3fv(const GLfloat*); static void __stdcall noColor4fv(const GLfloat*); #endif static void noStipple(GLfloat); protected: GLfloat plane[4]; // unit normal, distance to origin bool noPlane; bool occluder; Extents extents; private: GLfloat sphere[4]; #ifdef __MINGW32__ static bool colorOverride; #else static void (__stdcall *color3f)(GLfloat, GLfloat, GLfloat); static void (__stdcall *color4f)(GLfloat, GLfloat, GLfloat, GLfloat); static void (__stdcall *color3fv)(const GLfloat*); static void (__stdcall *color4fv)(const GLfloat*); #endif static void (*stipple)(GLfloat); }; inline const GLfloat* SceneNode::getPlane() const { if (noPlane) return NULL; return plane; } inline const GLfloat* SceneNode::getPlaneRaw() const { return plane; } inline const GLfloat* SceneNode::getSphere() const { return sphere; } inline const Extents& SceneNode::getExtents() const { return extents; } inline bool SceneNode::isOccluder() const { return occluder; } inline void SceneNode::setOccluder(bool value) { occluder = value; } typedef GLfloat GLfloat2[2]; typedef GLfloat GLfloat3[3]; class GLfloat2Array { public: GLfloat2Array(int s) : size(s) { data = new GLfloat2[size]; } GLfloat2Array(const GLfloat2Array&); ~GLfloat2Array() { delete[] data; } GLfloat2Array& operator=(const GLfloat2Array&); GLfloat* operator[](int i) { return data[i]; } const GLfloat* operator[](int i) const { return data[i]; } int getSize() const { return size; } const GLfloat2* getArray() const { return data; } private: int size; GLfloat2* data; }; class GLfloat3Array { public: GLfloat3Array(int s) : size(s) { data = new GLfloat3[size]; } GLfloat3Array(const GLfloat3Array&); ~GLfloat3Array() { delete[] data; } GLfloat3Array& operator=(const GLfloat3Array&); GLfloat* operator[](int i) { return data[i]; } const GLfloat* operator[](int i) const { return data[i]; } int getSize() const { return size; } const GLfloat3* getArray() const { return data; } private: int size; GLfloat3* data; }; #endif // BZF_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/SceneRenderer.h000066400000000000000000000206641200563112200177670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* SceneRenderer: * Encapsulates information about rendering a scene. */ #ifndef BZF_SCENE_RENDERER_H #define BZF_SCENE_RENDERER_H #if defined(_MSC_VER) #pragma warning(disable: 4786) #endif /* the common header */ #include "common.h" /* interface headers */ #include "Singleton.h" /* system interface headers */ #include /* common interface headers */ #include "OpenGLLight.h" #include "ViewFrustum.h" #include "RenderNode.h" #include "vectors.h" #define RENDERER (SceneRenderer::instance()) class SceneDatabase; class SceneIterator; class SceneNode; class BackgroundRenderer; class HUDRenderer; class MainWindow; class Extents; class FlareLight { public: FlareLight(const float* pos, const float* color); ~FlareLight(); public: float pos[3]; float color[3]; }; class SceneRenderer : public Singleton { public: enum ViewType { Normal, // one view Stereo, // binocular stereo Stacked, // top-bottom stereo view ThreeChannel, // one wide view Anaglyph, // red-blue stereo Interlaced // right/left interlaced stereo }; void setWindow(MainWindow* _window); MainWindow& getWindow() const; bool useABGR() const; bool useStencil() const; int useQuality() const; bool useDepthComplexity() const; bool useWireframe() const; bool useHiddenLine() const; float getPanelOpacity() const; float getRadarOpacity() const; bool isPanelOpaque() const; int getRadarSize() const; int getMaxMotionFactor() const; bool isLastFrame() const; bool isSameFrame() const; ViewType getViewType() const; void setSmoothing(bool on); void setZBuffer(bool on); void setZBufferSplit(bool on); void setQuality(int value); void setDepthComplexity(bool on); void setWireframe(bool on); void setHiddenLine(bool on); void setPanelOpacity(float opacity); void setRadarOpacity(float opacity); void setRadarSize(int size); void setMaxMotionFactor(int size); void setDim(bool on); void setViewType(ViewType); void setRebuildTanks(); void setExposed(); void clearRadar(float opacity); void getGroundUV(const float p[2], float uv[2]) const; bool getBlank() const; bool getInvert() const; void setBlank(bool blank = true); void setInvert(bool invert = true); const ViewFrustum& getViewFrustum() const; ViewFrustum& getViewFrustum(); int getNumLights() const; int getNumAllLights() const; const OpenGLLight& getLight(int index) const; void enableLight(int index, bool = true); void clearLights(); void addLight(OpenGLLight&); void addFlareLight(const float* pos, const float* color); // temporarily turn off non-applicable lights for big meshes void disableLights(const float mins[3], const float maxs[3]); void reenableLights(); void setupSun(); // setup sun lighting params void enableSun(bool = true); // toggle light state void setTimeOfDay(double julianDay); const GLfloat* getSunColor() const; const GLfloat* getSunScaledColor() const; GLfloat getSunBrightness() const; const GLfloat* getSunDirection() const; const GLfloat* getAmbientColor() const; const GLfloat* getCelestialTransform() const; SceneDatabase* getSceneDatabase() const; void setSceneDatabase(SceneDatabase*); const Extents* getVisualExtents() const; float getLengthPerPixel() const; int getFrameTriangleCount() const; BackgroundRenderer* getBackground(); void setBackground(BackgroundRenderer*); const RenderNodeList& getShadowList() const; bool isFogActive() const { return fogActive; } void setFogActive(bool b) { fogActive = b; } const fvec4& getFogColor() const { return fogColor; } void setFogColor( float *color) { fogColor = color; } void render(bool lastFrame = true, bool sameFrame = false, bool fullWindow = false); void renderScene(bool lastFrame = true, bool sameFrame = false, bool fullWindow = false); void notifyStyleChange(); void addRenderNode(RenderNode* node, const OpenGLGState*); void addShadowNode(RenderNode* node); protected: friend class Singleton; private: // disallowed -- don't want to deal with potential state problems SceneRenderer(); ~SceneRenderer(); SceneRenderer(const SceneRenderer&); SceneRenderer& operator=(const SceneRenderer&); void setupBackgroundMaterials(); void getLights(); void getRenderNodes(); void doRender(); void renderDepthComplexity(); void renderDimming(); MainWindow* window; bool blank; bool invert; bool mirror; bool drawGround; bool clearZbuffer; ViewFrustum frustum; float lengthPerPixel; GLint maxLights; GLint reservedLights; GLint dynamicLights; int lightsSize; int lightsCount; OpenGLLight** lights; OpenGLLight theSun; bool sunOrMoonUp; GLfloat sunDirection[3]; // or moon GLfloat sunColor[4]; GLfloat sunScaledColor[4]; GLfloat celestialTransform[4][4]; GLfloat sunBrightness; GLfloat ambientColor[4]; SceneDatabase* scene; BackgroundRenderer* background; int triangleCount; static const GLint SunLight; static const float dimDensity; static const GLfloat dimnessColor[4]; static const GLfloat blindnessColor[4]; float teleporterProximity; bool abgr; int useQualityValue; bool useDepthComplexityOn; bool useWireframeOn; bool useHiddenLineOn; float panelOpacity; float radarOpacity; int radarSize; int maxMotionFactor; bool useStencilOn; ViewType viewType; bool inOrder; int depthRange; int numDepthRanges; double depthRangeSize; bool useDimming; bool canUseHiddenLine; bool exposed; bool lastFrame; bool sameFrame; bool needStyleUpdate; bool rebuildTanks; bool fogActive; fvec4 fogColor; std::vector flareLightList; RenderNodeList shadowList; RenderNodeGStateList orderedList; }; // // SceneRenderer // inline MainWindow& SceneRenderer::getWindow() const { return *window; } inline bool SceneRenderer::getBlank() const { return blank; } inline void SceneRenderer::setBlank(bool _blank) { blank = _blank; } inline bool SceneRenderer::getInvert() const { return invert; } inline void SceneRenderer::setInvert(bool _invert) { invert = _invert; } inline const ViewFrustum& SceneRenderer::getViewFrustum() const { return frustum; } inline ViewFrustum& SceneRenderer::getViewFrustum() { return frustum; } inline float SceneRenderer::getLengthPerPixel() const { return lengthPerPixel; } inline const OpenGLLight& SceneRenderer::getLight(int index) const { return *(lights[index]); } inline const GLfloat* SceneRenderer::getSunColor() const { return sunColor; } inline const GLfloat* SceneRenderer::getSunScaledColor() const { return sunScaledColor; } inline GLfloat SceneRenderer::getSunBrightness() const { return sunBrightness; } inline const GLfloat* SceneRenderer::getAmbientColor() const { return ambientColor; } inline const GLfloat* SceneRenderer::getCelestialTransform() const { return &celestialTransform[0][0]; } inline SceneDatabase* SceneRenderer::getSceneDatabase() const { return scene; } inline BackgroundRenderer* SceneRenderer::getBackground() { return background; } inline bool SceneRenderer::isLastFrame() const { return lastFrame; } inline bool SceneRenderer::isSameFrame() const { return sameFrame; } inline int SceneRenderer::useQuality() const { return useQualityValue; } inline void SceneRenderer::addRenderNode(RenderNode* node, const OpenGLGState* gstate) { if (inOrder || gstate->getNeedsSorting()) { // nodes will be drawn in the same order received orderedList.append(node, gstate); } else { // store node in gstate bucket gstate->addRenderNode(node); } } inline void SceneRenderer::addShadowNode(RenderNode* node) { shadowList.append(node); } #endif // BZF_SCENE_RENDERER_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ServerItem.h000066400000000000000000000032331200563112200173210ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERITEM_H__ #define __SERVERITEM_H__ #include "common.h" /* system interface headers */ #include #include #include /* common interface headers */ #include "Ping.h" class ServerItem { public: ServerItem(); void writeToFile(std::ostream& out) const; // serialize out bool readFromFile(std::istream& in, int subrevision); // serialize in void setUpdateTime(); // set last updated to now int getPlayerCount() const; void splitAddrTitle(std::string& addr, std::string& title) const; std::string getAddrName() const; time_t getAgeMinutes() const; time_t getAgeSeconds() const; std::string getAgeString() const; // nifty formated age string time_t getNow() const; // current time bool operator<(const ServerItem &right); private: unsigned int getSortFactor() const; public: std::string name; std::string description; PingPacket ping; time_t updateTime; // last time I was updated bool cached; // was I cached ? bool favorite; // favorite server, user selection }; #endif /* __SERVERITEM_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ServerList.h000066400000000000000000000037251200563112200173440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERLIST_H__ #define __SERVERLIST_H__ #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "ListServer.h" #include "StartupInfo.h" #include "ServerItem.h" #include "ServerListCache.h" #include "cURLManager.h" /** The ServerList class contains links to the list server as well as * any fetched list of servers. The list handles cacheing of those * server entries in case of list server unavailability. */ class ServerList : cURLManager { public: ServerList(); virtual ~ServerList(); void checkEchos(StartupInfo *_info); void startServerPings(StartupInfo *_info); bool searchActive() const; bool serverFound() const; const std::vector& getServers(); std::vector::size_type size(); int updateFromCache(); void collectData(char *ptr, int len); void finalization(char *data, unsigned int length, bool good); public: void addToList(ServerItem, bool doCache=false); void markFav(const std::string &, bool); void clear(); private: void readServerList(); void addToListWithLookup(ServerItem&); void addCacheToList(); void _shutDown(); private: bool addedCacheToList; int phase; std::vector servers; ServerListCache* serverCache; int pingBcastSocket; struct sockaddr_in pingBcastAddr; StartupInfo *startupInfo; }; #endif /* __SERVERLIST_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ServerListCache.h000066400000000000000000000054041200563112200202640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_SERVER_LIST_CACHE_H #define BZF_SERVER_LIST_CACHE_H #include "common.h" /* system interface headers */ #include #include /* local interface headers */ #include "ServerItem.h" /** The ServerListCache is a simple aging container of server entries. * The class can load from and safe to file. Entries are culled based * on a specified cache age. */ class ServerListCache { public: /** size of description/name */ static const size_t max_string = 200; /** convenience map type */ typedef std::map SRV_STR_MAP; ServerListCache(); ~ServerListCache(); /** returns a pointer to the global instance of the list cache */ static ServerListCache* get(); /** save the cache to file */ void saveCache(); /** read the cache from file */ void loadCache(); /** set the max age to # of minutes after which items in cache. are * this old they are no longer shown on the find menu-- 0 * disables */ void setMaxCacheAge(time_t time); /** get the set maximum cache age */ time_t getMaxCacheAge(); /** clear the server list cache */ bool clearCache(); /** first item in the cache. this is a wrapper that allows access * to the maps begin method */ SRV_STR_MAP::iterator begin(); /** last item in the cache. this is a wrapper that allows access to * the maps end method */ SRV_STR_MAP::iterator end(); /** search for some address in the cache. this is a wrapper that * allows access to the maps find method */ SRV_STR_MAP::iterator find(const std::string &ServerAddress); /** add an entry to the cache list */ void insert(const std::string &serverAddress, const ServerItem &info); /** is given server in cache and marked as favorite? */ bool isFavorite(const std::string &serverAddress) const; private: /** the full path of the file the cache is stored in **/ std::string getCacheFilename(int subrevision) const; /** the actual map container of entries */ SRV_STR_MAP serverCache; /** age after we don't show servers in cache */ time_t maxCacheAge; /** one cache to rule them all */ static ServerListCache globalCache; }; #endif // BZF_SERVER_LIST_CACHE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ShellSceneNode.h000066400000000000000000000034101200563112200200640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ShellSceneNode: * Encapsulates information for rendering a regular * looking shot (as opposed to a shock wave or laser). */ #ifndef BZF_SHELL_SCENE_NODE_H #define BZF_SHELL_SCENE_NODE_H #include "common.h" #include "ShotSceneNode.h" const GLfloat ShellRadius = 0.5f; class ShellSceneNode : public ShotSceneNode { public: ShellSceneNode(const GLfloat pos[3], const GLfloat forward[3]); ~ShellSceneNode(); void move(const GLfloat pos[3], const GLfloat forward[3]); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); protected: class ShellRenderNode : public RenderNode { public: ShellRenderNode(const ShellSceneNode*); ~ShellRenderNode(); void setLighting(bool); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const ShellSceneNode* sceneNode; bool lighted; }; friend class ShellRenderNode; private: GLfloat azimuth, elevation; OpenGLGState gstate; ShellRenderNode renderNode; static const GLfloat shellVertex[9][3]; static const GLfloat shellNormal[10][3]; }; #endif // BZF_SHELL_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ShotSceneNode.h000066400000000000000000000017141200563112200177370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ShotSceneNode: * Interface for shot scene nodes. */ #ifndef BZF_SHOT_SCENE_NODE_H #define BZF_SHOT_SCENE_NODE_H #include "common.h" #include "SceneNode.h" class ShotSceneNode : public SceneNode { public: ShotSceneNode() { } ~ShotSceneNode() { } virtual void move(const GLfloat pos[3], const GLfloat forward[3])=0; }; #endif // BZF_SHOT_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ShotUpdate.h000066400000000000000000000034261200563112200173200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * ShotUpdate: * Encapsulates info needed to update a shot on remote * hosts. Can be packed for transmission on the net. * * FiringInfo: * Encapsulates info needed to create RemoteShotPath. * Can be packed for transmission on the net. */ #ifndef BZF_SHOT_UPDATE_H #define BZF_SHOT_UPDATE_H // system headers #include // local implementation headers #include "common.h" #include "Address.h" #include "Flag.h" const int ShotUpdatePLen = PlayerIdPLen + 32; const int FiringInfoPLen = ShotUpdatePLen + 10; class BaseLocalPlayer; struct ShotUpdate { public: void* pack(void*) const; void* unpack(void*); public: PlayerId player; // who's shot uint16_t id; // shot id unique to player float pos[3]; // shot position float vel[3]; // shot velocity float dt; // time shot has existed TeamColor team; }; struct FiringInfo { public: FiringInfo(); FiringInfo(const BaseLocalPlayer&, int id); void* pack(void*) const; void* unpack(void*); public: float timeSent; ShotUpdate shot; FlagType* flagType; // flag when fired float lifetime; // lifetime of shot (s) }; #endif // BZF_SHOT_UPDATE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Singleton.h000066400000000000000000000056561200563112200172110ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SINGLETON_H__ #define __SINGLETON_H__ /* system headers */ #ifdef HAVE_ATEXIT # ifdef HAVE_CSTDLIB #include using std::atexit; # else #include # endif #endif /* Singleton template class * * This template class pattern provides a traditional Singleton pattern. * Allows you to designate a single-instance global class by inheriting * off of the template class. * * Example: * * class Whatever : public Singleton ... * * The class will need to provide either a public or a protected friend * constructor: * * friend class Singleton; * * The class will also need to initialize it's own instance in a single * compilation unit (a .cxx file): * * // statically initialize the instance to nothing * template <> * Whatever* Singleton::_instance = 0; * * The class can easily be extended to support different allocation * mechanisms or multithreading access. This implementation, however, * only uses new/delete and is not thread safe. * * The Singleton will automatically get destroyed when the application * terminates (via an atexit() hook) unless the inheriting class has an * accessible destructor. */ template < typename T > class Singleton { private: static T* _instance; protected: // protection from instantiating a non-singleton Singleton Singleton() { } Singleton(T* instancePointer) { _instance = instancePointer; } Singleton(const Singleton &) { } // do not use Singleton& operator=(const Singleton&) { return *this; } // do not use ~Singleton() { _instance = 0; } // do not delete static void destroy() { if ( _instance != 0 ) { delete(_instance); _instance = 0; } } public: /** returns a singleton */ inline static T& instance() { if ( _instance == 0 ) { _instance = new T; // destroy the singleton when the application terminates #ifdef HAVE_ATEXIT atexit(Singleton::destroy); #endif } return *Singleton::_instance; } /** returns a singleton pointer */ inline static T* pInstance() { if (_instance == 0) { _instance = new T; #ifdef HAVE_ATEXIT atexit(Singleton::destroy); #endif } return Singleton::_instance; } /** returns a const singleton reference */ inline static const T& constInstance() { return *instance(); } }; #endif /* __SINGLETON_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/SphereObstacle.h000066400000000000000000000054101200563112200201360ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* SphereObstacle: * Encapsulates a cone in the game environment. */ #ifndef BZF_SPHERE_OBSTACLE_H #define BZF_SPHERE_OBSTACLE_H #include "common.h" #include #include "Obstacle.h" #include "MeshObstacle.h" #include "MeshTransform.h" #include "BzMaterial.h" class SphereObstacle : public Obstacle { public: enum { Edge, Bottom, MaterialCount }; SphereObstacle(); SphereObstacle(const MeshTransform& transform, const float* _pos, const float* _size, float _rotation, const float _texsize[2], bool _useNormals, bool hemisphere, int _divisions, const BzMaterial* mats[MaterialCount], int physics, bool bounce, bool drive, bool shoot, bool ricochet); ~SphereObstacle(); Obstacle* copyWithTransform(const MeshTransform&) const; MeshObstacle* makeMesh(); const char* getType() const; static const char* getClassName(); // const bool isValid() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal(const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void finalize(); private: static const char* typeName; MeshTransform transform; int divisions; bool hemisphere; int phydrv; bool smoothBounce; bool useNormals; float texsize[2]; const BzMaterial* materials[MaterialCount]; }; #endif // BZF_SPHERE_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/SphereSceneNode.h000066400000000000000000000134231200563112200202500ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* SphereSceneNode: * Encapsulates information for rendering a sphere. */ #ifndef BZF_SPHERE_SCENE_NODE_H #define BZF_SPHERE_SCENE_NODE_H #include "common.h" #include "SceneNode.h" /******************************************************************************/ class SphereSceneNode : public SceneNode { public: SphereSceneNode(const GLfloat pos[3], GLfloat radius); virtual ~SphereSceneNode(); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void move(const GLfloat pos[3], GLfloat radius); void notifyStyleChange(); virtual void setShockWave(bool) { return; }; virtual SceneNode** getParts(int& numParts) = 0; virtual void addRenderNodes(SceneRenderer&) = 0; virtual void addShadowNodes(SceneRenderer&) = 0; protected: GLfloat radius; GLfloat color[4]; bool transparent; OpenGLGState gstate; }; /******************************************************************************/ const int sphereLods = 5; class SphereLodSceneNode : public SphereSceneNode { public: SphereLodSceneNode(const GLfloat pos[3], GLfloat radius); ~SphereLodSceneNode(); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void move(const GLfloat pos[3], GLfloat radius); void setShockWave(bool value); // this node just won't split SceneNode** getParts(int&) { return NULL; } void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); static void init(); static void kill(); static void initContext(void*); static void freeContext(void*); protected: class SphereLodRenderNode : public RenderNode { friend class SphereLodSceneNode; public: SphereLodRenderNode(const SphereLodSceneNode*); ~SphereLodRenderNode(); void setLod(int lod); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const SphereLodSceneNode* sceneNode; int lod; }; private: SphereLodRenderNode renderNode; bool shockWave; bool inside; static bool initialized; static GLuint lodLists[sphereLods]; static float lodPixelsSqr[sphereLods]; static int listTriangleCount[sphereLods]; friend class SphereLodSceneNode::SphereLodRenderNode; }; /******************************************************************************/ const int SphereRes = 8; const int SphereLowRes = 6; class SphereBspSceneNode; class SphereFragmentSceneNode : public SceneNode { public: SphereFragmentSceneNode(int theta, int phi, SphereBspSceneNode* sphere); ~SphereFragmentSceneNode(); void move(); void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); // Irix 7.2.1 and solaris compilers appear to have a bug. if the // following declaration isn't public it generates an error when trying // to declare SphereFragmentSceneNode::FragmentRenderNode a friend in // SphereBspSceneNode::SphereBspRenderNode. i think this is a bug in the // compiler because: // no other compiler complains // public/protected/private adjust access not visibility // SphereBspSceneNode isn't requesting access, it's granting it // protected: public: class FragmentRenderNode : public RenderNode { public: FragmentRenderNode(const SphereBspSceneNode*, int theta, int phi); ~FragmentRenderNode(); const GLfloat* getVertex() const; void render(); const GLfloat* getPosition() const; private: const SphereBspSceneNode* sceneNode; int theta, phi; int theta2, phi2; }; friend class FragmentRenderNode; private: SphereBspSceneNode* parentSphere; FragmentRenderNode renderNode; }; class SphereBspSceneNode : public SphereSceneNode { friend class SphereFragmentSceneNode; friend class SphereFragmentSceneNode::FragmentRenderNode; public: SphereBspSceneNode(const GLfloat pos[3], GLfloat radius); ~SphereBspSceneNode(); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void move(const GLfloat pos[3], GLfloat radius); void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); SceneNode** getParts(int& numParts); protected: GLfloat getRadius() const { return radius; } private: void freeParts(); protected: class SphereBspRenderNode : public RenderNode { friend class SphereBspSceneNode; friend class SphereFragmentSceneNode::FragmentRenderNode; public: SphereBspRenderNode(const SphereBspSceneNode*); ~SphereBspRenderNode(); void setHighResolution(bool); void setBaseIndex(int index); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const SphereBspSceneNode* sceneNode; bool highResolution; int baseIndex; static GLfloat geom[2 * SphereRes * (SphereRes + 1)][3]; static GLfloat lgeom[SphereLowRes * (SphereLowRes + 1)][3]; }; friend class SphereBspRenderNode; private: SphereBspRenderNode renderNode; SphereFragmentSceneNode** parts; }; /******************************************************************************/ #endif // BZF_FLAG_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/StartupInfo.h000066400000000000000000000022711200563112200175130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __STARTUPINFO_H__ #define __STARTUPINFO_H__ #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "Team.h" class StartupInfo { public: StartupInfo(); ~StartupInfo(); bool hasConfiguration; bool autoConnect; char serverName[80]; int serverPort; bool useUDPconnection; TeamColor team; char callsign[CallSignLen]; char password[PasswordLen]; char token[TokenLen]; char motto[MottoLen]; std::string listServerURL; int listServerPort; bool joystick; std::string joystickName; }; #endif /* __STARTUPINFO_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/StateDatabase.h000066400000000000000000000364341200563112200177520ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_STATE_DATABASE_H #define BZF_STATE_DATABASE_H // common header first #include "common.h" // system headers #include #include #include #include // implementation headers #include "CallbackList.h" #include "bzfio.h" #include "Singleton.h" #define BZDB (StateDatabase::instance()) /** BZDB is the generic name:value pair database within bzflag and bzfs. Its * useful for data that can be serialized to a string that needs to be * accessible to many areas of the code. It also provides facilities for * saving persistant pairs to the config file and downloading variables from * the server. * * BZDB is not an object broker, and isn't meant to be. If you have data * within an object that needs to be accessible from a number of places, but * don't want to pass the object around, you could store that data within BZDB * (if accessed often, such as game variables like gravity, you will need a * cached version anyway to avoid the overhead of lookup). Using BZDB adds * unnecessary overhead if objects generally keep their data hidden without * needing persistant state. * * Basically, if your data can be serialized to a string, and it makes sense * to do so (eg: config file option, game variable downloaded from server), use * BZDB. If you wanted an object broker, use a freakin' global. */ class StateDatabase : public Singleton { public: typedef void (*Callback)(const std::string& name, void* userData); enum Permission { // permission levels ReadWrite, Locked, ReadOnly, // access levels User = ReadWrite, Server = Locked, Client = ReadOnly }; /** set a name/value pair. if access is less than the permission *level of the name then this has no effect. */ void set(const std::string& name, const std::string& value, Permission access = Client); void setInt(const std::string& name, const int& value, Permission access = Client); void setBool(const std::string& name, const bool& value, Permission access = Client); void setFloat(const std::string& name, const float& value, Permission access = Client); /** allow setting name/pointer pairs. this allows simple object * pointer storage into the bzdb via pointer address serialization. */ void setPointer(const std::string& name, const void *value, Permission access = Client); /** unset a name if access is not less than the permission level * of the name. */ void unset(const std::string& name, Permission access = Client); /** simulate a change to a value (i.e. invoke the callbacks on it) */ void touch(const std::string& name, Permission access = Client); /** mark a value as persistent (i.e. to be saved) or volatile. * this state is stored independently of the existance of a value * with the given name. that is, adding or removing the name * will not affect persistence of the name. the default is * volatile. */ void setPersistent(const std::string& name, bool = true); /** set the default value for a name. if the default value is set * then the value will not be written by write() if the current * value is equal to the default value. */ void setDefault(const std::string& name, const std::string& value); /** set the permission level of a name. like persistence, this is * stored independently of a value with the name. the default * permission is ReadWrite (i.e. full access). */ void setPermission(const std::string& name, Permission); /** add/remove a callback to/from a name. all callbacks on a name are * invoked when the value changes (either by being set or unset). * each name can have any number of callbacks but any given callback * function/userData pair on a name can only be registered once (i.e. * multiple adds have the same effect as a single add). */ void addCallback(const std::string& name, Callback, void* userData); void removeCallback(const std::string& name, Callback, void* userData); /** add/remove a global callback for all values. invoked when any value * changes (either by being set or unset). each function/userData pair can * only be registered once (i.e. multiple adds have the same effect as a * single add). */ void addGlobalCallback(Callback, void* userData); void removeGlobalCallback(Callback, void* userData); /** test if a name is set or not */ bool isSet(const std::string& name) const; /** get the value associated with a name. returns the empty string * if the name isn't set. */ std::string get(const std::string& name) const; /** get the INT value associated with a name. Clamp value within range. * Returns 0 (or min) if value is not set. */ int getIntClamped(const std::string& name, const int min, const int max) const; /** returns the pointer stored with a name. returns NULL if the * name isn't set. */ void * getPointer(const std::string& name) const; /** get the value as a floating point number. this will evaluate * the string as an expression */ float eval(const std::string& name); int evalInt(const std::string& name); bool evalTriplet(const std::string& name, float data[3]); bool evalPair(const std::string& name, float data[2]); /** return true if the value associated with a name indicates * logical true, which is when the value is not empty and not * "0" and not "false" and not "no". */ bool isTrue(const std::string& name) const; /** test if a name is empty or not. a name is empty if it's * not set or it's set to the empty string. */ bool isEmpty(const std::string& name) const; /** get the persistence, permission, and default for an entry */ bool isPersistent(const std::string& name) const; std::string getDefault(const std::string& name) const; Permission getPermission(const std::string& name) const; /** invoke the callback for each entry */ void iterate(Callback, void* userData) const; /** invoke the callback for each entry that should be written (i.e. * is set, persistent, and not the default). */ void write(Callback, void* userData) const; /** tell the state database whether it should print debug info to stdout * now and then. */ void setDebug(bool print); /** do we want debug output? */ bool getDebug() const; // true if we are in a mode where we are seting values that are to be defaults ( config and world time ) void setSaveDefault(bool save); bool getSaveDefault() const; static const std::string BZDB_AGILITYADVEL; static const std::string BZDB_AGILITYTIMEWINDOW; static const std::string BZDB_AGILITYVELDELTA; static const std::string BZDB_AMBIENTLIGHT; static const std::string BZDB_ANGLETOLERANCE; static const std::string BZDB_ANGULARAD; static const std::string BZDB_AVENUESIZE; static const std::string BZDB_BASESIZE; static const std::string BZDB_BOXBASE; static const std::string BZDB_BOXHEIGHT; static const std::string BZDB_BURROWDEPTH; static const std::string BZDB_BURROWSPEEDAD; static const std::string BZDB_BURROWANGULARAD; static const std::string BZDB_COLDETDEPTH; static const std::string BZDB_COLDETELEMENTS; static const std::string BZDB_COUNTDOWNRESDELAY; static const std::string BZDB_CULLDEPTH; static const std::string BZDB_CULLELEMENTS; static const std::string BZDB_CULLOCCLUDERS; static const std::string BZDB_DISABLEBOTS; static const std::string BZDB_DRAWCELESTIAL; static const std::string BZDB_DRAWCLOUDS; static const std::string BZDB_DRAWGROUND; static const std::string BZDB_DRAWGROUNDLIGHTS; static const std::string BZDB_DRAWMOUNTAINS; static const std::string BZDB_DRAWSKY; static const std::string BZDB_ENDSHOTDETECTION; static const std::string BZDB_EXPLODETIME; static const std::string BZDB_FLAGALTITUDE; static const std::string BZDB_FLAGEFFECTTIME; static const std::string BZDB_FLAGHEIGHT; static const std::string BZDB_FLAGPOLEWIDTH; static const std::string BZDB_FLAGPOLESIZE; static const std::string BZDB_FLAGRADIUS; static const std::string BZDB_FOGMODE; static const std::string BZDB_FOGDENSITY; static const std::string BZDB_FOGSTART; static const std::string BZDB_FOGEND; static const std::string BZDB_FOGCOLOR; static const std::string BZDB_GMACTIVATIONTIME; static const std::string BZDB_GMADLIFE; static const std::string BZDB_GMSIZE; static const std::string BZDB_GMTURNANGLE; static const std::string BZDB_GRAVITY; static const std::string BZDB_FRICTION; static const std::string BZDB_HANDICAPSCOREDIFF; static const std::string BZDB_HANDICAPVELAD; static const std::string BZDB_HANDICAPANGAD; static const std::string BZDB_HANDICAPSHOTAD; static const std::string BZDB_HIDEFLAGSONRADAR; static const std::string BZDB_HIDETEAMFLAGSONRADAR; static const std::string BZDB_IDENTIFYRANGE; static const std::string BZDB_JUMPVELOCITY; static const std::string BZDB_LASERADVEL; static const std::string BZDB_LASERADRATE; static const std::string BZDB_LASERADLIFE; static const std::string BZDB_LATITUDE; static const std::string BZDB_LOCKONANGLE; static const std::string BZDB_TARGETINGANGLE; static const std::string BZDB_TARGETINGDISTANCE; static const std::string BZDB_LONGITUDE; static const std::string BZDB_LRADRATE; static const std::string BZDB_MAXBUMPHEIGHT; static const std::string BZDB_MAXFLAGGRABS; static const std::string BZDB_MAXLOD; static const std::string BZDB_MIRROR; static const std::string BZDB_MOMENTUMLINACC; static const std::string BZDB_MOMENTUMANGACC; static const std::string BZDB_MOMENTUMFRICTION; static const std::string BZDB_MGUNADVEL; static const std::string BZDB_MGUNADRATE; static const std::string BZDB_MGUNADLIFE; static const std::string BZDB_MUZZLEFRONT; static const std::string BZDB_MUZZLEHEIGHT; static const std::string BZDB_NOCLIMB; static const std::string BZDB_NOSHADOWS; static const std::string BZDB_NOSMALLPACKETS; static const std::string BZDB_NOTRESPONDINGTIME; static const std::string BZDB_OBESEFACTOR; static const std::string BZDB_PAUSEDROPTIME; static const std::string BZDB_POSITIONTOLERANCE; static const std::string BZDB_PYRBASE; static const std::string BZDB_PYRHEIGHT; static const std::string BZDB_RADARLIMIT; static const std::string BZDB_REJOINTIME; static const std::string BZDB_RELOADTIME; static const std::string BZDB_RFIREADVEL; static const std::string BZDB_RFIREADRATE; static const std::string BZDB_RFIREADLIFE; static const std::string BZDB_SHIELDFLIGHT; static const std::string BZDB_SHOCKADLIFE; static const std::string BZDB_SHOCKINRADIUS; static const std::string BZDB_SHOCKOUTRADIUS; static const std::string BZDB_SHOTSPEED; static const std::string BZDB_SHOTRADIUS; static const std::string BZDB_SHOTRANGE; static const std::string BZDB_SHOTTAILLENGTH; static const std::string BZDB_SHOTSKEEPVERTICALV; static const std::string BZDB_SQUISHFACTOR; static const std::string BZDB_SQUISHTIME; static const std::string BZDB_SPEEDCHECKSLOGONLY; static const std::string BZDB_SRRADIUSMULT; static const std::string BZDB_SYNCLOCATION; static const std::string BZDB_SYNCTIME; static const std::string BZDB_TANKANGVEL; static const std::string BZDB_TANKEXPLOSIONSIZE; static const std::string BZDB_TANKLENGTH; static const std::string BZDB_TANKWIDTH; static const std::string BZDB_TANKHEIGHT; static const std::string BZDB_TANKSPEED; static const std::string BZDB_TANKRADIUS; static const std::string BZDB_TELEBREADTH; static const std::string BZDB_TELEHEIGHT; static const std::string BZDB_TELEPORTTIME; static const std::string BZDB_TELEWIDTH; static const std::string BZDB_THIEFVELAD; static const std::string BZDB_THIEFTINYFACTOR; static const std::string BZDB_THIEFADSHOTVEL; static const std::string BZDB_THIEFADRATE; static const std::string BZDB_THIEFADLIFE; static const std::string BZDB_THIEFDROPTIME; static const std::string BZDB_TINYFACTOR; static const std::string BZDB_TRACKFADE; static const std::string BZDB_UPDATETHROTTLERATE; static const std::string BZDB_VELOCITYAD; static const std::string BZDB_WALLHEIGHT; static const std::string BZDB_WEAPONS; static const std::string BZDB_WIDEANGLEANG; static const std::string BZDB_WINGSGRAVITY; static const std::string BZDB_WINGSJUMPCOUNT; static const std::string BZDB_WINGSJUMPVELOCITY; static const std::string BZDB_WINGSSLIDETIME; static const std::string BZDB_WORLDSIZE; protected: friend class Singleton; private: StateDatabase(); ~StateDatabase(); static bool onCallback(Callback, void* userData, void* iterateData); struct Item { public: Item(); public: std::string value; std::string defValue; bool isSet; bool isTrue; bool save; Permission permission; CallbackList callbacks; }; typedef std::map Map; Map::iterator lookup(const std::string&); void notify(Map::iterator); private: Map items; public: class ExpressionToken { public: enum Type { Oper, Number, Variable }; enum Operator { add, subtract, multiply, divide, power, lparen, rparen, none }; struct Contents { public: double number; std::string variable; Operator oper; }; ExpressionToken(); ExpressionToken(Type _tokenType); ExpressionToken(Type _tokenType, Contents _tokenContents); void setType(Type _tokenType); void setContents(Contents _tokenContents); void setNumber(double number); void setVariable(std::string variable); void setOper(Operator oper); Type getTokenType() const; Contents getTokenContents() const; double getNumber() const; std::string getVariable() const; Operator getOperator() const; int getPrecedence() const; private: Type tokenType; Contents tokenContents; }; typedef std::vector Expression; private: static Expression infixToPrefix(const Expression &infix); float evaluate(Expression e) const; typedef std::map EvalMap; EvalMap evalCache; bool debug; bool saveDefault; CallbackList globalCallbacks; }; inline bool StateDatabase::getDebug() const { return debug; } inline bool StateDatabase::getSaveDefault() const { return saveDefault; } std::istream& operator >> (std::istream& src, StateDatabase::Expression& dst); std::string& operator >> (std::string& src, StateDatabase::Expression& dst); std::ostream& operator << (std::ostream& dst, const StateDatabase::Expression& src); #endif // BZF_STATE_DATABASE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TankGeometryMgr.h000066400000000000000000000065311200563112200203170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TankGeometryMgr: * Generates the display lists for TankSceneNodes */ #ifndef BZF_TANK_GEOMETRY_MGR_H #define BZF_TANK_GEOMETRY_MGR_H #include "common.h" #include "SceneNode.h" namespace TankGeometryEnums { enum TankShadow { ShadowOff = 0, ShadowOn, LastTankShadow }; enum TankLOD { LowTankLOD = 0, MedTankLOD, HighTankLOD, LastTankLOD }; enum TankSize { Normal = 0, Obese, Tiny, Narrow, Thief, LastTankSize }; enum TankPart { Body = 0, Barrel, Turret, LeftCasing, RightCasing, LeftTread, // animated parts RightTread, LeftWheel0, LeftWheel1, LeftWheel2, LeftWheel3, RightWheel0, RightWheel1, RightWheel2, RightWheel3, LastTankPart, BasicTankParts = LeftTread, LowTankParts = LeftTread, MedTankParts = LeftTread, HighTankParts = LastTankPart }; } namespace TankGeometryMgr { void init(); void kill(); void buildLists(); void deleteLists(); GLuint getPartList(TankGeometryEnums::TankShadow shadow, TankGeometryEnums::TankPart part, TankGeometryEnums::TankSize size, TankGeometryEnums::TankLOD lod); int getPartTriangleCount(TankGeometryEnums::TankShadow shadow, TankGeometryEnums::TankPart part, TankGeometryEnums::TankSize size, TankGeometryEnums::TankLOD lod); const float* getScaleFactor(TankGeometryEnums::TankSize size); } namespace TankGeometryUtils { enum TreadStyle { Covered = 0, Exposed = 1 }; void setTreadStyle(int style); // degrees / meter float getWheelScale(); // texcoords / meter float getTreadScale(); // texcoords float getTreadTexLen(); // help to scale vertices and normals void doVertex3f(GLfloat x, GLfloat y, GLfloat z); void doNormal3f(GLfloat x, GLfloat y, GLfloat z); void doTexCoord2f(GLfloat x, GLfloat y); // // NOTE: these all return their triangle count // // lowtank geometry builder int buildLowBody (void); int buildLowTurret (void); int buildLowLCasing (void); int buildLowRCasing (void); int buildLowBarrel (void); // medtank geometry builder int buildMedBody (void); int buildMedTurret (void); int buildMedLCasing (void); int buildMedRCasing (void); int buildMedBarrel (void); // hightank geometry builder int buildHighBody (void); int buildHighBarrel (void); int buildHighTurret (void); int buildHighLCasing (void); int buildHighRCasing (void); // animated geometry builder int buildHighLCasingAnim (void); int buildHighRCasingAnim (void); int buildHighLTread (int divs); int buildHighRTread (int divs); int buildHighLWheel (int wheel, float angle, int divs); int buildHighRWheel (int wheel, float angle, int divs); } #endif // BZF_TANK_GEOMETRY_MGR_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TankSceneNode.h000066400000000000000000000146451200563112200177260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TankSceneNode: * Encapsulates information for rendering a tank */ #ifndef BZF_TANK_SCENE_NODE_H #define BZF_TANK_SCENE_NODE_H #include "common.h" #include "SceneNode.h" #include "OpenGLLight.h" #include "TankGeometryMgr.h" class TankSceneNode; class TankDeathOverride { public: virtual ~TankDeathOverride(){}; class DeathParams { public: DeathParams( float param, fvec4 c): part() { scale = fvec3(1,1,1); explodeParam = param; color = c; draw = true; } TankGeometryEnums::TankPart part; fvec3 pos; fvec3 rot; fvec3 scale; float explodeParam; fvec4 color; bool draw; }; virtual bool SetDeathRenderParams ( DeathParams &/*params*/ ) = 0; virtual bool ShowExplosion ( void ) = 0; virtual bool GetDeathVector ( fvec3 &/*vel*/ ) = 0; }; class TankIDLSceneNode : public SceneNode { public: TankIDLSceneNode(const TankSceneNode*); ~TankIDLSceneNode(); void move(const GLfloat plane[4]); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); // Irix 7.2.1 and solaris compilers appear to have a bug. if the // following declaration isn't public it generates an error when trying // to declare SphereFragmentSceneNode::FragmentRenderNode a friend in // SphereSceneNode::SphereRenderNode. i think this is a bug in the // compiler because: // no other compiler complains // public/protected/private adjust access not visibility // SphereSceneNode isn't requesting access, it's granting it // protected: public: class IDLRenderNode : public RenderNode { public: IDLRenderNode(const TankIDLSceneNode*); ~IDLRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const TankIDLSceneNode* sceneNode; static const int idlFaces[][5]; static const GLfloat idlVertex[][3]; }; friend class IDLRenderNode; private: const TankSceneNode *tank; GLfloat plane[4]; OpenGLGState gstate; IDLRenderNode renderNode; }; class TankSceneNode : public SceneNode { friend class TankIDLSceneNode; friend class TankIDLSceneNode::IDLRenderNode; public: TankSceneNode(const GLfloat pos[3], const GLfloat forward[3]); ~TankSceneNode(); void move(const GLfloat pos[3], const GLfloat forward[3]); void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void setMaterial(const OpenGLMaterial&); void setTexture(const int); void setJumpJetsTexture(const int); void setNormal(); void setObese(); void setTiny(); void setNarrow(); void setThief(); void setDimensions(const float size[3]); void setClipPlane(const GLfloat* plane); void setExplodeFraction(float t); void setJumpJets(float scale); void setInTheCockpit(bool value); void setOnlyShadows(bool value); void rebuildExplosion(); void addTreadOffsets(float left, float right); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); bool cullShadow(int planeCount, const float (*planes)[4]) const; void addLight(SceneRenderer&); void renderRadar(); static void setMaxLOD(int maxLevel); void setDeathOverride( TankDeathOverride* o) {deathOverride = o;} TankDeathOverride *getDeathOverride( void ) {return deathOverride;} fvec3 explodePos; protected: TankDeathOverride *deathOverride; class TankRenderNode : public RenderNode { public: TankRenderNode(const TankSceneNode*); ~TankRenderNode(); void setShadow(); void setRadar(bool); void setTreads(bool); void setTankLOD(TankGeometryEnums::TankLOD); void setTankSize(TankGeometryEnums::TankSize); void sortOrder(bool above, bool towards, bool left); void setNarrowWithDepth(bool narrow); const GLfloat* getPosition() const { return sceneNode->getSphere(); } void render(); void renderPart(TankGeometryEnums::TankPart part); void renderParts(); void renderTopParts(); void renderLeftParts(); void renderRightParts(); void renderNarrowWithDepth(); void renderLights(); void renderJumpJets(); void setupPartColor(TankGeometryEnums::TankPart part); bool setupTextureMatrix(TankGeometryEnums::TankPart part); protected: const TankSceneNode* sceneNode; TankGeometryEnums::TankLOD drawLOD; TankGeometryEnums::TankSize drawSize; const GLfloat* color; GLfloat alpha; bool isRadar; bool isTreads; bool isShadow; bool left; bool above; bool towards; bool isExploding; bool narrowWithDepth; GLfloat explodeFraction; static const GLfloat centerOfGravity[TankGeometryEnums::LastTankPart][3]; }; friend class TankRenderNode; private: GLfloat azimuth, elevation; GLfloat baseRadius; float dimensions[3]; // tank dimensions float leftTreadOffset; float rightTreadOffset; float leftWheelOffset; float rightWheelOffset; bool useDimensions; bool useOverride; bool onlyShadows; bool transparent, sort; float spawnFraction; float explodeFraction; bool clip; bool inTheCockpit; GLfloat colorOverride[4]; GLfloat color[4]; GLdouble clipPlane[4]; OpenGLGState gstate; OpenGLGState treadState; OpenGLGState lightsGState; TankRenderNode tankRenderNode; TankRenderNode treadsRenderNode; TankRenderNode shadowRenderNode; TankGeometryEnums::TankSize tankSize; GLfloat vel[TankGeometryEnums::LastTankPart][3]; GLfloat spin[TankGeometryEnums::LastTankPart][4]; bool jumpJetsOn; GLfloat jumpJetsScale; GLfloat jumpJetsLengths[4]; GLfloat jumpJetsPositions[4][3]; OpenGLLight jumpJetsRealLight; OpenGLLight jumpJetsGroundLights[4]; OpenGLGState jumpJetsGState; static int maxLevel; static const int numLOD; static GLfloat jumpJetsModel[4][3]; }; #endif // BZF_TANK_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Team.h000066400000000000000000000033521200563112200161240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Team: * Encapsulates information about a team */ #ifndef BZF_TEAM_H #define BZF_TEAM_H #include "common.h" #include "global.h" #include const int TeamPLen = 10; struct Team { public: Team(); void* pack(void*) const; void* unpack(void*); static const std::string getImagePrefix(TeamColor); // const static const char* getName(TeamColor); // const static TeamColor getTeam(const std::string &name); // const static const float* getTankColor(TeamColor); // const static const float* getRadarColor(TeamColor team); // const static bool isColorTeam(TeamColor); // const static void setColors(TeamColor, const float* tank, const float* radar); public: unsigned short size; // num players on team short getWins() const { return won;} short getLosses() const { return lost;} void setWins(short v) { won = v;} void setLosses(short v) { lost = v;} static float tankColor[NumTeams][3]; static float radarColor[NumTeams][3]; private: unsigned short won; // wins by team members unsigned short lost; // losses by team members }; #endif // BZF_TEAM_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/Teleporter.h000066400000000000000000000073051200563112200173650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Teleporter: * Encapsulates a box in the game environment. */ #ifndef BZF_TELEPORTER_H #define BZF_TELEPORTER_H #include "common.h" #include #include "Obstacle.h" #include "MeshFace.h" class Teleporter : public Obstacle { public: Teleporter(); Teleporter(const float* pos, float rotation, float width, float breadth, float height, float borderSize = 1.0f, bool horizontal = false, bool drive = false, bool shoot = false, bool ricochet = false); ~Teleporter(); Obstacle* copyWithTransform(const MeshTransform&) const; void setName(const std::string& name); const std::string& getName() const; const char* getType() const; static const char* getClassName(); // const float getBorder() const; bool isHorizontal() const; bool isValid() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal( const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; float isTeleported(const Ray&, int& face) const; float getProximity(const float* p, float radius) const; bool hasCrossed(const float* p1, const float* p2, int& face) const; void getPointWRT(const Teleporter& t2, int face1, int face2, const float* pIn, const float* dIn, float aIn, float* pOut, float* dOut, float* aOut) const; void makeLinks(); const MeshFace* getBackLink() const; const MeshFace* getFrontLink() const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; void printOBJ(std::ostream& out, const std::string& indent) const; std::string userTextures[1]; private: void finalize(); private: static const char* typeName; std::string name; float border; bool horizontal; float origSize[3]; MeshFace* backLink; MeshFace* frontLink; float fvertices[4][3]; // front vertices float bvertices[4][3]; // back vertices float texcoords[4][2]; // shared texture coordinates }; // // Teleporter // inline float Teleporter::getBorder() const { return border; } inline bool Teleporter::isHorizontal() const { return horizontal; } inline const MeshFace* Teleporter::getBackLink() const { return backLink; } inline const MeshFace* Teleporter::getFrontLink() const { return frontLink; } inline const std::string& Teleporter::getName() const { return name; } inline void Teleporter::setName(const std::string& _name) { name = _name; return; } #endif // BZF_TELEPORTER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TeleporterSceneNodeGenerator.h000066400000000000000000000020751200563112200230170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __TELEPORTERSCENENODEGENERATOR_H__ #define __TELEPORTERSCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" #include "Teleporter.h" class TeleporterSceneNodeGenerator : public ObstacleSceneNodeGenerator { friend class SceneDatabaseBuilder; public: ~TeleporterSceneNodeGenerator(); WallSceneNode* getNextNode(float, float, bool); protected: TeleporterSceneNodeGenerator(const Teleporter*); private: const Teleporter* teleporter; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TetraBuilding.h000066400000000000000000000054361200563112200200000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TetraBuilding: * Encapsulates a tetrahederon in the game environment. */ #ifndef BZF_TETRA_BUILDING_H #define BZF_TETRA_BUILDING_H #include "common.h" #include #include "Obstacle.h" #include "MeshObstacle.h" #include "MeshTransform.h" #include "BzMaterial.h" class TetraBuilding : public Obstacle { public: TetraBuilding(); TetraBuilding(const MeshTransform& transform, const float vertices[4][3], const float normals[4][3][3], const float texCoords[4][3][2], const bool useNormals[4], const bool useTexCoords[4], const BzMaterial* materials[4], bool drive = false, bool shoot = false, bool ricochet = false); ~TetraBuilding(); Obstacle* copyWithTransform(const MeshTransform&) const; MeshObstacle* makeMesh(); void finalize(); const char* getType() const; static const char* getClassName(); // const bool isValid() const; float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; void get3DNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool isCrossing(const float* p, float angle, float halfWidth, float halfBreadth, float height, float* plane) const; bool getHitNormal( const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; void getCorner(int index, float* pos) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: void checkVertexOrder(); private: static const char* typeName; MeshTransform transform; float vertices[4][3]; float normals[4][3][3]; float texcoords[4][3][2]; bool useNormals[4]; bool useTexcoords[4]; const BzMaterial* materials[4]; }; #endif // BZF_TETRA_BUILDING_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TextChunkManager.h000066400000000000000000000046061200563112200204510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __TEXTCHUNKMANAGER_H__ #define __TEXTCHUNKMANAGER_H__ #include "common.h" /* system interface headers */ #include #include #include typedef std::vector StringVector; // holds a vector of strings loaded from a file class TextChunk { public: TextChunk(); TextChunk(const TextChunk& tc); TextChunk(const std::string& fileName, const int _maxLines = -1, const int _maxLineLength = -1); size_t size() const; const StringVector& getVector() const; bool reload(); private: StringVector parse(); private: std::string fileName; int maxLines; int maxLineLength; StringVector theVector; }; // maintains a list of lists of strings, more or less a bunch // of files that can be read into and managed by this class. // chunkname is the name that is used to index into this list. // note that there is no delete function as of yet. class TextChunkManager { public: // load the file fileName into the chunk specified by chunkname // if the chunkname is already taken it will *not* be replaced bool parseFile(const std::string &fileName, const std::string &chunkName, const int maxLines = -1, const int maxLineLength = -1); // get a chunk given a name of the chunk returns null if it can't find it const StringVector* getTextChunk(const std::string &chunkName) const; // get the list of current stored chunk names const StringVector& getChunkNames() const; // reload all of the text chunks from their source files // (if a file's reload fails, we keep the old data) void reload(); private: typedef std::map TextChunkMap; TextChunkMap theChunks; // a mapping of names of chunks to chunks StringVector chunkNames; // vector of all the names of the chunks }; #endif /* __TEXTCHUNKMANAGER_H__ */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TextUtils.h000066400000000000000000000240471200563112200172070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * common definitions */ #ifndef __TEXTUTILS_H__ #define __TEXTUTILS_H__ #include "common.h" /* system interface headers */ #include #include #ifdef HAVE_DEFINED_TOLOWER #undef tolower #undef toupper #endif #include #include #include /** This namespace provides basic functionality to parse and * format strings */ namespace TextUtils { std::string vformat(const char* fmt, va_list args); std::string format(const char* fmt, ...); /** returns a string converted to lowercase */ inline std::string tolower(const std::string& s) { std::string trans = s; for (std::string::iterator i=trans.begin(), end=trans.end(); i!=end; ++i) *i = ::tolower(*i); return trans; } /** returns a string converted to uppercase */ inline std::string toupper(const std::string& s) { std::string trans = s; for (std::string::iterator i=trans.begin(), end=trans.end(); i!=end; ++i) *i = ::toupper(*i); return trans; } /** replace all of in in replaceMe with withMe */ std::string replace_all(const std::string& in, const std::string& replaceMe, const std::string& withMe); /** return copy of string with all whitespace stripped */ std::string no_whitespace(const std::string &s); /** * Get a vector of strings from a string, using all of chars of thedelims * string as separators. If maxTokens > 0, then the last 'token' maycontain delimiters * as it just returns the rest of the line * if you specify use quotes then tokens can be grouped in quotes and delimeters * inside quotes are ignored. * Hence /ban "Mr Blahblah" isajerk parses to "/ban", "Mr Blahlah" and "isajerk" * but so does "Mr Blahblah" "isajerk", so if you want 3 tokens and a delimeter * is in one of the tokens, by puting quotes around it you can get the correct * parsing. When use quotes is enabled, \'s and "'s should\can be escaped with \ * escaping is not currently done for any other character. * Should not have " as a delimeter if you want to use quotes */ std::vector tokenize(const std::string& in, const std::string &delims, const int maxTokens = 0, const bool useQuotes = false); /** convert a string representation of some duration into minutes * example: "1d2h16m" -> 1500 * return true if the string can be parsed */ bool parseDuration(const char *duration, int &durationInt); // C h a r a c t e r c o m p a r i s o n /** compare_nocase is strait from Stroustrup. This implementation uses * strings instead of char arrays and includes a maxlength bounds check. * It compares two strings and returns 0 if equal, <0 if s1 is less than * s2, and >0 if s1 is greater than s2. */ inline int compare_nocase(const std::string& s1, const std::string &s2, int maxlength=4096) { std::string::const_iterator p1 = s1.begin(); std::string::const_iterator p2 = s2.begin(); int i=0; while (p1 != s1.end() && p2 != s2.end()) { if (i >= maxlength) { return 0; } if (::tolower(*p1) != ::tolower(*p2)) { return (::tolower(*p1) < ::tolower(*p2)) ? -1 : 1; } ++p1; ++p2; ++i; } return (s2.size() == s1.size()) ? 0 : (s1.size() < s2.size()) ? -1 : 1; // size is unsigned } /** utility function returns truthfully whether * given character is a letter. */ inline bool isAlphabetic(const char c) { if (( c > 64 && c < 91) || ( c > 96 && c < 123)) { return true; } return false; } /** utility function returns truthfully whether * given character is a number. */ inline bool isNumeric(const char c) { if (( c > 47 && c < 58)) { return true; } return false; } /** utility function returns truthfully whether * a given character is printable whitespace. * this includes newline, carriage returns, tabs * and spaces. */ inline bool isWhitespace(const char c) { if ((( c >= 9 ) && ( c <= 13 )) || (c == 32)) { return true; } return false; } /** utility function returns truthfully whether * a given character is punctuation. */ inline bool isPunctuation(const char c) { if (( c > 32 && c < 48) || ( c > 57 && c < 65) || ( c > 90 && c < 97) || ( c > 122 && c < 127)) { return true; } return false; } /** utility function returns truthfully whether * given character is an alphanumeric. this is * strictly letters and numbers. */ inline bool isAlphanumeric(const char c) { if (isAlphabetic(c) || isNumeric(c)) { return true; } return false; } /** utility function returns truthfully whether * given character is printable. this includes * letters, numbers, and punctuation. * (but NOT whitespace) */ inline bool isVisible(const char c) { if (isAlphanumeric(c) || isPunctuation(c)) { return true; } return false; } /** utility function returns truthfully whether * given character is printable. this includes * letters, numbers, punctuation, and whitespace */ inline bool isPrintable(const char c) { if (isVisible(c) || isWhitespace(c)) { return false; } return true; } // S t r i n g i t e r a t i o n /** utility method that returns the position of the * first alphanumeric character from a string */ inline int firstAlphanumeric(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (isAlphanumeric(input[i])) return i; return -1; } /** utility method that returns the position of the * first non-alphanumeric character from a string */ inline int firstNonalphanumeric(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (!isAlphanumeric(input[i])) return i; return -1; } /** utility method that returns the position of the * first printable character from a string */ inline int firstPrintable(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (isPrintable(input[i])) return i; return -1; } /** utility method that returns the position of the * first non-printable character from a string */ inline int firstNonprintable(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (!isPrintable(input[i])) return i; return -1; } /** utility method that returns the position of the * first visible character from a string */ inline int firstVisible(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (isVisible(input[i])) return i; return -1; } /** utility method that returns the position of the * first non visible character from a string (control * codes or whitespace */ inline int firstNonvisible(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (!isVisible(input[i])) return i; return -1; } /** utility method that returns the position of the * first alphabetic character from a string */ inline int firstAlphabetic(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (isAlphabetic(input[i])) return i; return -1; } /** utility method that returns the position of the * first printable character from a string */ inline int firstNonalphabetic(const std::string &input, unsigned short int max=4096) { if (max > input.length()) max = (unsigned short)input.length(); for (unsigned short i = 0; i < max; i++) if (!isAlphabetic(input[i])) return i; return -1; } /** integer to string */ inline std::string itoa(int value, const char* fmt = "%i") { char buf[64]; snprintf(buf, sizeof(buf), fmt, value); return std::string(buf); } /** url-encodes a string */ std::string url_encode(const std::string &text); /** url-decodes a string */ std::string url_decode(const std::string &text); /** octal-encode nonprintable characters in a string * the quotechar parameter will always be encoded; '"' is a sensible value */ std::string escape_nonprintable(const std::string &text, const char quotechar = '\\'); /** escape a string */ std::string escape(const std::string &text, char escaper); /** un-escape a string */ std::string unescape(const std::string &text, char escaper); /** lookup for an un-escaped separator */ int unescape_lookup(const std::string &text, char escaper, char sep); /** return a copy of a string, truncated to specified length, * make last char a '~' if truncation took place */ std::string str_trunc_continued (const std::string &text, int len); /** find the first instance of a substring, */ size_t find_first_substr(const std::string &findin, const std::string &findwhat, size_t offset = 0); } #endif // __TEXTUTILS_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TextureManager.h000066400000000000000000000053041200563112200201700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _TEXTURE_MANAGER_H #define _TEXTURE_MANAGER_H #include #include #include "OpenGLTexture.h" #include "Singleton.h" struct FileTextureInit { std::string name; OpenGLTexture::Filter filter; }; typedef struct { int id; int x; int y; bool alpha; OpenGLTexture *texture; std::string name; } ImageInfo; class TextureManager; struct ProcTextureInit { std::string name; TextureManager *manager; OpenGLTexture::Filter filter; int (*proc)(ProcTextureInit &init); }; class TextureManager : public Singleton { public: int getTextureID( const char* name, bool reportFail = true ); bool isLoaded(const std::string& name); bool removeTexture(const std::string& name); bool reloadTextures(); bool reloadTextureImage(const std::string& name); void updateTextureFilters(); void setTextureFilter(int texId, OpenGLTexture::Filter filter); OpenGLTexture::Filter getTextureFilter(int texId); bool bind ( int id ); bool bind ( const char* name ); const ImageInfo& getInfo ( int id ); const ImageInfo& getInfo ( const char* name ); bool getColorAverages(int texId, float rgba[4], bool factorAlpha) const; OpenGLTexture::Filter getMaxFilter ( void ); std::string getMaxFilterName ( void ); void setMaxFilter ( OpenGLTexture::Filter filter ); void setMaxFilter ( std::string filter ); float GetAspectRatio ( int id ); int newTexture (const char* name, int x, int y, unsigned char* data, OpenGLTexture::Filter filter, bool repeat = true, int format = 0); protected: friend class Singleton; private: TextureManager(); TextureManager(const TextureManager &tm); TextureManager& operator=(const TextureManager &tm); ~TextureManager(); int addTexture( const char*, OpenGLTexture *texture ); OpenGLTexture* loadTexture( FileTextureInit &init, bool reportFail = true ); typedef std::map TextureNameMap; typedef std::map TextureIDMap; int lastImageID; int lastBoundID; TextureIDMap textureIDs; TextureNameMap textureNames; }; #endif //_TEXTURE_MANAGER_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TextureMatrix.h000066400000000000000000000052621200563112200200650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _TEXTURE_MATRIX_H_ #define _TEXTURE_MATRIX_H_ #include "common.h" /* system interface headers */ #include #include #include class TextureMatrix { public: TextureMatrix(); ~TextureMatrix(); void finalize(); const float* getMatrix() const; bool setName (const std::string& name); // the static parameters void setStaticSpin (float rotation); void setStaticShift (float u, float v); void setStaticScale (float u, float v); void setStaticCenter (float u, float v); // the dynamic parameters void setDynamicSpin (float freq); void setDynamicShift (float uFreq, float vFreq); void setDynamicScale (float uFreq, float vFreq, float uSize, float vSize); void setDynamicCenter (float u, float v); void update(double time); const std::string& getName() const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: std::string name; // time invariant bool useStatic; float staticMatrix[3][2]; float rotation; float uFixedShift, vFixedShift; float uFixedScale, vFixedScale; float uFixedCenter, vFixedCenter; // time varying bool useDynamic; float spinFreq; float uShiftFreq, vShiftFreq; float uScaleFreq, vScaleFreq; float uScale, vScale; float uCenter, vCenter; // the final result float matrix[4][4]; }; inline const float* TextureMatrix::getMatrix() const { return (const float*) matrix; } class TextureMatrixManager { public: TextureMatrixManager(); ~TextureMatrixManager(); void update(); void clear(); int addMatrix(TextureMatrix* matrix); int findMatrix(const std::string& name) const; const TextureMatrix* getMatrix(int id) const; int packSize() const; void* pack(void*) const; void* unpack(void*); void print(std::ostream& out, const std::string& indent) const; private: std::vector matrices; }; extern TextureMatrixManager TEXMATRIXMGR; #endif //_TEXTURE_MATRIX_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TimeBomb.h000066400000000000000000000014271200563112200167350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Functions for time bomb. */ #ifndef BZF_TIME_BOMB_H #define BZF_TIME_BOMB_H #include "common.h" bool timeBombBoom(); const char* timeBombString(); #endif /* BZF_TIME_BOMB_H */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TimeKeeper.h000066400000000000000000000113771200563112200172760ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /** * TimeKeeper: * Standard way to keep track of time in game. * * Generally, only the difference between TimeKeeper's is useful. * operator-() computes the difference in seconds as a float and * correctly handles wraparound. * operator+=() allows a time in seconds to be added to a TimeKeeper. */ #ifndef BZF_TIME_KEEPER_H #define BZF_TIME_KEEPER_H #include "common.h" /* system interface headers */ #include /** TimeKeeper keeps time. It's useful to determine how much time has * elapsed from some other point in time. Use getCurrent() to return a * timekeeper object set to the current time. You can then use subsequent * calls to getCurrent and subtract the second from the first to get an * elapsed float time value. */ class TimeKeeper { public: TimeKeeper(); TimeKeeper(const TimeKeeper&); ~TimeKeeper(); TimeKeeper& operator=(const TimeKeeper&); double operator-(const TimeKeeper&) const; bool operator<=(const TimeKeeper&) const; TimeKeeper& operator+=(double); TimeKeeper& operator+=(const TimeKeeper&); // make a TimeKeeper with seconds = NULL act like unset // Fixme: must this be defined here? didn't work for me outside the class inline operator void*() { if (seconds > 0.0) return this; else return NULL; } /** returns how many seconds have elapsed since epoch, Jan 1, 1970 */ double getSeconds(void) const; /** returns a timekeeper representing the current time */ static const TimeKeeper& getCurrent(void); /** returns a timekeeper representing the time of program execution */ static const TimeKeeper& getStartTime(void); /** sets the time to the current time (recalculates) */ static void setTick(void); /** returns a timekeeper that is updated periodically via setTick */ static const TimeKeeper& getTick(void); // const /** returns a timekeeper representing +Inf */ static const TimeKeeper& getSunExplodeTime(void); /** returns a timekeeper representing -Inf */ static const TimeKeeper& getSunGenesisTime(void); /** returns a timekeeper representing an unset timekeeper */ static const TimeKeeper& getNullTime(void); /** returns the local time */ static void localTime(int *year = NULL, int *month = NULL, int* day = NULL, int* hour = NULL, int* min = NULL, int* sec = NULL, bool* dst = NULL); /** returns a string of the local time */ static const char *timestamp(void); static void localTime( int &day); /** returns the UTC time */ static void UTCTime(int *year = NULL, int *month = NULL, int* day = NULL, int* dayOfWeek = NULL, int* hour = NULL, int* min = NULL, int* sec = NULL, bool* dst = NULL); /** converts a time difference into an array of integers representing days, hours, minutes, seconds */ static void convertTime(double raw, long int convertedTimes[]); /** prints an integer-array time difference in human-readable form */ static const std::string printTime(long int timeValue[]); /** prints an float time difference in human-readable form */ static const std::string printTime(double diff); /** sleep for a given number of floating point seconds */ static void sleep(double secs); //const private: double seconds; static TimeKeeper currentTime; static TimeKeeper tickTime; static TimeKeeper sunExplodeTime; static TimeKeeper sunGenesisTime; static TimeKeeper nullTime; static TimeKeeper startTime; }; // // TimeKeeper // inline TimeKeeper::TimeKeeper() : seconds(0.0) { // do nothing } inline TimeKeeper::TimeKeeper(const TimeKeeper& t) : seconds(t.seconds) { // do nothing } inline TimeKeeper::~TimeKeeper() { // do nothing } inline TimeKeeper& TimeKeeper::operator=(const TimeKeeper& t) { seconds = t.seconds; return *this; } inline double TimeKeeper::operator-(const TimeKeeper& t) const { return seconds - t.seconds; } inline TimeKeeper& TimeKeeper::operator+=(double dt) { seconds += dt; return *this; } inline TimeKeeper& TimeKeeper::operator+=(const TimeKeeper& t) { seconds += t.seconds; return *this; } inline bool TimeKeeper::operator<=(const TimeKeeper& t) const { return seconds <= t.seconds; } inline double TimeKeeper::getSeconds(void) const { return seconds; } #endif // BZF_TIME_KEEPER_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TracerSceneNode.h000066400000000000000000000033261200563112200202430ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TracerSceneNode: * Encapsulates information for rendering a * ShellSceneNode's tail. */ #ifndef BZF_TRACER_SCENE_NODE_H #define BZF_TRACER_SCENE_NODE_H #include "common.h" #include "ShotSceneNode.h" #include "OpenGLLight.h" class TracerSceneNode : public ShotSceneNode { public: TracerSceneNode(const GLfloat pos[3], const GLfloat forward[3]); ~TracerSceneNode(); void addLight(SceneRenderer&); void move(const GLfloat pos[3], const GLfloat forward[3]); void notifyStyleChange(); void addRenderNodes(SceneRenderer&); protected: class TracerRenderNode : public RenderNode { public: TracerRenderNode(const TracerSceneNode*); ~TracerRenderNode(); void render(); const GLfloat* getPosition() const { return sceneNode->getSphere(); } private: const TracerSceneNode* sceneNode; }; friend class TracerRenderNode; private: GLfloat azimuth, elevation; OpenGLLight light; int style; OpenGLGState gstate; TracerRenderNode renderNode; static const GLfloat tailVertex[9][3]; static const GLfloat TailLength; }; #endif // BZF_TRACER_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/TriWallSceneNode.h000066400000000000000000000043511200563112200204000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* TriWallSceneNode: * Encapsulates information for rendering a triangular wall. */ #ifndef BZF_TRI_WALL_SCENE_NODE_H #define BZF_TRI_WALL_SCENE_NODE_H #include "common.h" #include "WallSceneNode.h" class TriWallSceneNode : public WallSceneNode { public: TriWallSceneNode(const GLfloat base[3], const GLfloat sEdge[3], const GLfloat tEdge[3], float uRepeats = 1.0, float vRepeats = 1.0, bool makeLODs = true); ~TriWallSceneNode(); int split(const float*, SceneNode*&, SceneNode*&) const; void addRenderNodes(SceneRenderer&); void addShadowNodes(SceneRenderer&); void renderRadar(); bool inAxisBox (const Extents& exts) const; int getVertexCount () const; const GLfloat* getVertex (int vertex) const; bool cull(const ViewFrustum&) const; void getRenderNodes(std::vector& rnodes); protected: class Geometry : public RenderNode { public: Geometry(TriWallSceneNode*, int eCount, const GLfloat base[3], const GLfloat uEdge[3], const GLfloat vEdge[3], const GLfloat* normal, float uRepeats, float vRepeats); ~Geometry(); void setStyle(int _style) { style = _style; } void render(); void renderShadow(); const GLfloat* getVertex(int i) const; const GLfloat* getPosition() const { return wall->getSphere(); } private: void drawV() const; void drawVT() const; private: WallSceneNode* wall; int style; int de; const GLfloat* normal; public: GLfloat3Array vertex; GLfloat2Array uv; int triangles; }; private: Geometry** nodes; Geometry* shadowNode; }; #endif // BZF_TRI_WALL_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ViewFrustum.h000066400000000000000000000022511200563112200175330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ViewFrustum * Encapsulates a camera. */ #ifndef BZF_VIEW_FRUSTUM_H #define BZF_VIEW_FRUSTUM_H #include "common.h" #include "bzfgl.h" #include "Frustum.h" // FIXME -- will need a means for off center projections for // looking through teleporters class ViewFrustum : public Frustum { public: ViewFrustum(); ~ViewFrustum(); void executeProjection() const; void executeDeepProjection() const; void executeView() const; void executeOrientation() const; void executePosition() const; void executeBillboard() const; }; #endif // BZF_VIEW_FRUSTUM_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/VotingArbiter.h000066400000000000000000000234141200563112200200160ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __VOTINGARBITER_H__ #define __VOTINGARBITER_H__ #include "common.h" #include #include #include #include "VotingBooth.h" #include "TimeKeeper.h" /** VotingArbiter is a means to manage and enforce a poll. The poll will * maintain a voting booth when a poll is started. As the poll is * updated, it verifies if a vote was succesfully passed. * * voteTime is how long a poll will allow players to vote * vetoTime is how long after a poll is successful that a veto is possible * votesRequired is a minimum number of votes required * votePercentage is a minimum percentage (0-100) required to succeed * voteRepeatTime is how frequently a player may request a poll */ class VotingArbiter { // book-keeping to minimize abuse typedef struct poller { std::string name; TimeKeeper lastRequest; } poller_t; private: VotingBooth *_votingBooth; TimeKeeper _startTime; // this is the number of players capable of participating in the poll. // it is a dynamic count of how many players are allowed to vote. unsigned short int _maxVotes; // server-configurable poll voting behavior variables unsigned short int _voteTime; unsigned short int _vetoTime; unsigned short int _votesRequired; float _votePercentage; unsigned short int _voteRepeatTime; /* queue of people who have recently successfully initiated a poll. * people on the poller list cannot initiate a poll. */ std::deque _pollers; /* who and what are being voted on, and who asked for the poll */ std::string _pollee; std::string _polleeIP; std::string _action; std::string _pollRequestor; /* names of players who are allowed to vote */ std::deque _suffraged; protected: /** remove people in the pollers vector that are able to poll again */ void updatePollers(void); /** see if a person is in the list of people waiting for a repoll * timeout. */ bool isPollerWaiting(const std::string &name) const; public: /* default constructor */ VotingArbiter(unsigned short int voteTime, unsigned short int vetoTime, unsigned short int votesRequired, float votePercentage, unsigned short int voteRepeatTime); /* default copy constructor */ VotingArbiter(const VotingArbiter& arbiter); ~VotingArbiter(void); /** is there a poll that this arbiter knows about? */ inline bool knowsPoll(void) const; /** reset/forget the poll if one is known */ bool forgetPoll(void); /** is there a poll that is accepting votes? */ inline bool isPollOpen(void) const; /** is there a poll that is not accepting votes? */ inline bool isPollClosed(void) const; /** is there a poll that has completed (poll time + veto time) */ inline bool isPollExpired(void) const; /** return a string representing the action that is presently set */ inline std::string getPollAction(void) const; /** return a string representing the target (player or setting) being voted upon */ inline std::string getPollTarget(void) const; /** return a string representing the IP of the player being voted * upon, this is mostly useful for placing a ban. */ inline std::string getPollTargetIP(void) const; /** return a string representing the player who requested the poll */ inline std::string getPollRequestor(void) const; /** attempt to activate/open a poll */ bool poll(const std::string &player, const std::string &playerRequesting, std::string action, std::string playerIP=""); /** convenience method to attempt to start a kick poll */ bool pollToKick(const std::string &player, const std::string &playerRequesting, const std::string &playerIP); /** convenience method to attempt to start a kill poll */ bool pollToKill(const std::string &player, const std::string &playerRequesting, const std::string &playerIP); /** convenience method to attempt to start a ban poll */ bool pollToBan(const std::string &player, const std::string &playerRequesting, const std::string &playerIP); /** convenience method to attempt to start a set poll */ bool pollToSet(const std::string &setting, const std::string &playerRequesting); /** convenience method to attempt to reset flags that, at the time, are unused */ bool pollToResetFlags(const std::string &playerRequesting); /** halt/close the poll if it is open */ bool closePoll(void); /** set the number of available voters */ bool setAvailableVoters(unsigned short int count); /** grant a player the right to vote */ bool grantSuffrage(const std::string &player); /** returns whether truthfully whether a certain player is permitted * to vote; a player should check their right to vote before voting. */ bool hasSuffrage(const std::string &player) const; /** * returns whether or not a user has voted */ bool hasVoted(const std::string &player) const; /** apply a yes vote; returns true if the vote could be made */ bool voteYes(const std::string &player); /** apply a no vote; returns true if the vote could be made */ bool voteNo(const std::string &player); /** returns the number of yes votes received */ unsigned long int getYesCount(void) const; /** returns the number of no votes received */ unsigned long int getNoCount(void) const; /** returns the number of abstentions */ unsigned long int getAbstentionCount(void) const; /** returns the vote duration length of the poll */ unsigned short int getVoteTime(void) const; /** returns the veto duration length of the poll */ unsigned short int getVetoTime(void) const; /** returns the time the poll was started */ TimeKeeper getStartTime(void) const; /** returns truthfully if the poll has reached a passable tally. * i.e. enough positive votes have been received that the vote is * successful. */ bool isPollSuccessful(void) const; /** returns truthfully if the poll is bound to fail given the * known votes and required vote percentage */ bool isPollSureToFail(void) const; /** returns how much time (in seconds) is remaining on a poll, if one is * active */ unsigned short int timeRemaining(void) const; /** allow a player vote to be retracted (perhaps if a player leaves */ bool retractVote(const std::string &player); }; inline VotingArbiter::VotingArbiter(unsigned short int voteTime=60, unsigned short int vetoTime=20, unsigned short int votesRequired=2, float votePercentage=50.1, unsigned short int voteRepeatTime=300) : _votingBooth(NULL), _maxVotes(votesRequired+1), _voteTime(voteTime), _vetoTime(vetoTime), _votesRequired(votesRequired), _votePercentage(votePercentage), _voteRepeatTime(voteRepeatTime) { _startTime = TimeKeeper::getNullTime(); _pollee = "nobody"; _polleeIP = ""; _action = ""; _pollRequestor = "nobody"; return; } inline VotingArbiter::VotingArbiter(const VotingArbiter& arbiter) : _votingBooth(arbiter._votingBooth), _startTime(arbiter._startTime), _maxVotes(arbiter._maxVotes), _voteTime(arbiter._voteTime), _vetoTime(arbiter._vetoTime), _votesRequired(arbiter._votesRequired), _votePercentage(arbiter._votePercentage), _voteRepeatTime(arbiter._voteRepeatTime), _pollers(arbiter._pollers), _pollee(arbiter._pollee), _polleeIP(arbiter._polleeIP), _action(arbiter._action), _pollRequestor(arbiter._pollRequestor), _suffraged(arbiter._suffraged) { return; } inline VotingArbiter::~VotingArbiter(void) { if (_votingBooth != NULL) { delete _votingBooth; _votingBooth = NULL; } return; } inline bool VotingArbiter::knowsPoll(void) const { return (_votingBooth != NULL); } inline bool VotingArbiter::isPollClosed(void) const { if (!this->knowsPoll()) { return false; } // check timer if ((TimeKeeper::getCurrent() - _startTime) >= _voteTime) { return true; } return false; } inline bool VotingArbiter::isPollOpen(void) const { if (!this->knowsPoll()) { return false; } if ((TimeKeeper::getCurrent() - _startTime) < _voteTime) { return true; } return false; } inline bool VotingArbiter::isPollExpired(void) const { // if the poll is not at least closed, then it's not expired if (!this->knowsPoll()) { return false; } // check timer if ((TimeKeeper::getCurrent() - _startTime) > _voteTime + _vetoTime) { return true; } return false; } inline std::string VotingArbiter::getPollAction(void) const { if (_action.size() <= 0) { return "do something unknown to"; } return _action; } inline std::string VotingArbiter::getPollTarget(void) const { return _pollee.size() == 0 ? "nobody" : _pollee; } inline std::string VotingArbiter::getPollTargetIP(void) const { return _polleeIP.size() == 0 ? "" : _polleeIP; } inline std::string VotingArbiter::getPollRequestor(void) const { return _pollRequestor.size() == 0 ? "nobody" : _pollRequestor; } inline unsigned short int VotingArbiter::getVoteTime(void) const { return _voteTime; } inline unsigned short int VotingArbiter::getVetoTime(void) const { return _vetoTime; } inline TimeKeeper VotingArbiter::getStartTime(void) const { if (!this->knowsPoll()) { return TimeKeeper::getNullTime(); } return _startTime; } #else class VotingArbiter; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/VotingBooth.h000066400000000000000000000061301200563112200174750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __VOTINGBOOTH_H__ #define __VOTINGBOOTH_H__ #include "common.h" /* system interface headers */ #include #include #include #include #include /** VotingBooth is a means to create and track a vote. A single booth * will track and allow voting on a poll. * * By default, false and true (i.e. no and yes) are the respective first * two default results of any poll if unspecified. */ class VotingBooth { private: static const short int RETRACTED_VOTE; typedef std::map VoterResponseMap; /** question that is voted upon (optionally provided) */ std::string _question; /** vector of potential poll response choices */ std::vector _choice; /** collection of the voters and their response responses (index into the * choice vector) */ VoterResponseMap _vote; protected: public: VotingBooth(std::string question = ""); VotingBooth(const VotingBooth& booth); ~VotingBooth(void); /** add a response to vote upon. vote responses are the choices that * may be voted upon (e.g. "yes", "no", "maybe", etc). */ bool addResponse(const std::string &response); /** return truthfully if a particular person has already voted */ bool hasVoted(const std::string &voterName) const; /** a given user id/name responds and votes to a particular poll * response. returns truthfully whether the vote was placed. */ bool vote(const std::string &voterName, const std::string &response); /** allow a vote to be retracted, returns truefully whether a retraction * was possible. */ bool retractVote(const std::string &voterName); /** return how many votes have been placed for a particular response. */ unsigned long int getVoteCount(const std::string &response) const; /** return total number of votes received */ unsigned long int getTotalVotes(void) const; /** returns the number of voters that have participated */ inline unsigned long int getVoterCount(void) const { return (unsigned long int)_vote.size(); } /** returns the number of responses available */ inline unsigned long int getResponseCount(void) const { return (unsigned long int)_choice.size(); } /** returns a string identifier for this poll */ inline const std::string getPollName(void) const { return _question; } }; /* convenience func that sets up and returns a default boolean poll */ VotingBooth *YesNoVotingBooth(std::string question = ""); #else class VotingBooth; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/WallObstacle.h000066400000000000000000000037461200563112200176210ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* WallObstacle: * Encapsulates an infinite wall in the game environment. */ #ifndef BZF_WALL_OBSTACLE_H #define BZF_WALL_OBSTACLE_H #include "common.h" #include #include "Obstacle.h" class WallObstacle : public Obstacle { public: WallObstacle(); WallObstacle(const float* pos, float rotation, float breadth, float height, bool ricochet); ~WallObstacle(); const char* getType() const; static const char* getClassName(); // const float intersect(const Ray&) const; void getNormal(const float* p, float* n) const; bool inCylinder(const float* p, float radius, float height) const; bool inBox(const float* p, float angle, float halfWidth, float halfBreadth, float height) const; bool inMovingBox(const float* oldP, float oldAngle, const float *newP, float newAngle, float halfWidth, float halfBreadth, float height) const; bool getHitNormal( const float* pos1, float azimuth1, const float* pos2, float azimuth2, float halfWidth, float halfBreadth, float height, float* normal) const; int packSize() const; void *pack(void*) const; void *unpack(void*); void print(std::ostream& out, const std::string& indent) const; std::string userTextures[1]; private: void finalize(); private: float plane[4]; static const char* typeName; }; #endif // BZF_WALL_OBSTACLE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/WallSceneNode.h000066400000000000000000000104161200563112200177200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* WallSceneNode: * Encapsulates information for rendering an wall. * * WallGeometry: * Encapsulates vertices and uv's for a wall * * Walls are flat and don't move. A wall also picks a level of * detail based on its projected area and on the presence of * light sources nearby (to capture light highlights). */ #ifndef BZF_WALL_SCENE_NODE_H #define BZF_WALL_SCENE_NODE_H #include "common.h" #include "SceneNode.h" class WallSceneNode : public SceneNode { public: WallSceneNode(); ~WallSceneNode(); const GLfloat* getColor() const; const GLfloat* getDynamicColor() const; const GLfloat* getModulateColor() const; const GLfloat* getLightedColor() const; const GLfloat* getLightedModulateColor() const; GLfloat getDistance(const GLfloat*) const; virtual bool inAxisBox (const Extents& exts) const; void setColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setColor(const GLfloat* rgba); void setModulateColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setModulateColor(const GLfloat* rgba); void setLightedColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setLightedColor(const GLfloat* rgba); void setLightedModulateColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a = 1.0f); void setLightedModulateColor(const GLfloat* rgba); void setMaterial(const OpenGLMaterial&); void setTexture(const int); void setTextureMatrix(const GLfloat* texmat); void setDynamicColor(const float* color); void setBlending(bool); void setSphereMap(bool); void setNoCulling(bool); void setNoSorting(bool); void setAlphaThreshold(float); void setRadarColor(const float color[4]); void setColor(); bool cull(const ViewFrustum&) const; void notifyStyleChange(); void copyStyle(WallSceneNode*); void setUseColorTexture(bool use){useColorTexture=use;} protected: int getNumLODs() const; void setNumLODs(int, float* elementAreas); void setPlane(const GLfloat[4]); int pickLevelOfDetail(const SceneRenderer&) const; int getStyle() const; const OpenGLGState* getGState() const { return &gstate; } const OpenGLGState* getWallGState() const; static int splitWall(const GLfloat* plane, const GLfloat3Array& vertices, const GLfloat2Array& uvs, SceneNode*& front, SceneNode*& back); // const private: static void splitEdge(float d1, float d2, const GLfloat* p1, const GLfloat* p2, const GLfloat* uv1, const GLfloat* uv2, GLfloat* p, GLfloat* uv); //const private: int numLODs; float* elementAreas; const GLfloat* dynamicColor; GLfloat color[4]; GLfloat modulateColor[4]; GLfloat lightedColor[4]; GLfloat lightedModulateColor[4]; float alphaThreshold; int style; bool noCulling; bool noSorting; bool isBlended; bool wantBlending; bool wantSphereMap; OpenGLGState gstate; bool useColorTexture; }; // // WallSceneNode // inline int WallSceneNode::getNumLODs() const { return numLODs; } inline const GLfloat* WallSceneNode::getColor() const { return color; } inline const GLfloat* WallSceneNode::getDynamicColor() const { return dynamicColor; } inline const GLfloat* WallSceneNode::getModulateColor() const { return modulateColor; } inline const GLfloat* WallSceneNode::getLightedColor() const { return lightedColor; } inline const GLfloat* WallSceneNode::getLightedModulateColor() const { return lightedModulateColor; } inline int WallSceneNode::getStyle() const { return style; } inline const OpenGLGState* WallSceneNode::getWallGState() const { return &gstate; } #endif // BZF_WALL_SCENE_NODE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/WallSceneNodeGenerator.h000066400000000000000000000020371200563112200215670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __WALLSCENENODEGENERATOR_H__ #define __WALLSCENENODEGENERATOR_H__ #include "ObstacleSceneNodeGenerator.h" #include "WallObstacle.h" class WallSceneNodeGenerator : public ObstacleSceneNodeGenerator { friend class SceneDatabaseBuilder; public: ~WallSceneNodeGenerator(); WallSceneNode* getNextNode(float, float, bool); protected: WallSceneNodeGenerator(const WallObstacle*); private: const WallObstacle* wall; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/WordFilter.h000066400000000000000000000227471200563112200173300ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __WORDFILTER_H__ #define __WORDFILTER_H__ #include "common.h" /* system interface headers */ #include #include #include #include #include #include #include #include /* common interface headers */ #include "TextUtils.h" /* words are stored by the index of their first letter of * UTF-8 format. it would be nice to eventually support * full indexing of */ #define MAX_FILTER_SETS 256 /** WordFilter will load a list of words and phrases from a file or one at * a time or manually. * * Loading from file assumes that words/phrases are listed one per line; * comments are possible using the shell-style "#" delimiter. Words are * matched case-insensitive; punctuation and non-newline white-space are * always ignored with the default filter. * * By default (aggressive filtering), the filter will match many * additional combinations to avoid the need to list all potential spelling * variations and hacks in the filter file. * * e.g. "dumb ass" should match "dumbass!", "DUMB a s s", "d_u_m_b! a_S_S", etc * * Strings should also match repetitive identical letter expansions. * * e.g. "dumb ass" should match "dumb asssss", "dumbaaaass", "dumb as s", etc * * Strings should also match l33t-speak. (l=1, o=0, e=3, a=@, s=z, i=l, f=ph) * * e.g. "ass whipe" should match "@sz wh1p3", etc * * Strings should also match common word suffixes (at least for English) * (dom|ity|memt|sion|tion|ness|ance|ence|er|or|ist) for nouns * (ive|en|ic|al|able|y|ous|ful|less) for adjectives * (en|ize|ate|ify|fy|ed) for verbs * (ly) for adverbs * (a|z|r|ah|io|rs|rz|in|n|ster|meister) for slang * (s|es) for plurality * (ing|let) for imperfect verb, and diminutive * * e.g. "dumb ass" should match "dumb assness", "dumb asses", "dumb assly", etc * * Strings should also match common word prefixes (at least for English) * (bz|beze) for bzflag-centric words * * e.g. "bitch" should also match "bzbitch", "beezzeebitch", etc * * Since all of the above matchings are done for free with aggressive matching, * only root words need to be provided. For foreign languages, it may be * necessary to list all tenses of certain verbs, unless the rules can be * strictly and simply quantified. * * There is also a simple filter mode which is not as resource intensive and * performs a literal match with the filter words (so you have to specify * absolutely everything you want to filter and all variations). It is still * case-insensitive and ignores punctuation. */ class WordFilter { public: /** structure for a single filter word, and a compiled regular expression */ typedef struct filterStruct { std::string word; regex_t *compiled; } filter_t; private: /** used by the simple filter */ std::string alphabet; /** set of characters used to replace filtered content */ std::string filterChars; /** word expressions to be filtered including compiled regexp versions */ struct expressionCompare { bool operator () (const filter_t& word1, const filter_t& word2) const { return (strncasecmp(word1.word.c_str(), word2.word.c_str(), 1024) < 0); } }; typedef std::set ExpCompareSet; /** main collection of what to filter. items are stored into * the array indexed by the first character of the filter word. * this means a sparse array, but it's a small price for * minimal hashing and rather fast lookups. */ // XXX consider making a numeric hash to avoid array overflows ExpCompareSet filters[MAX_FILTER_SETS]; /** used by the agressive filter */ ExpCompareSet suffixes; /** used by the agressive filter */ ExpCompareSet prefixes; /** utility method performs an actual replacement of * characters in an input character ray within a specified * range. */ inline int filterCharacters(char *input, unsigned int start, size_t length, bool filterSpaces) const; /** utility method adds a letter to a string if it is not * already in the string */ inline void appendUniqueChar(std::string& string, char c) const; /** utility method to add words to the prefix set */ inline void addPrefix(const char *word); /** utility method to add words to the suffix set */ inline void addSuffix(const char *word); protected: /** This filter does a simple case-insensitive * word comparison that compares all filter * words with all alphabetic string sets in the * input string. If test is a filter word, then * input strings "test", "testy", and "test;" * will get filtered to "****", "testy", and * "****;" respectively. */ bool simpleFilter(char *input) const; /** This filter will take a filter word and * create a rather complex regular expression * that catches a variety of variations on a * word. Variations include automatic internal * expansion, optional punctuation and * whitespace, suffix matching (including * plurality), leet-speak conversion and more. * See the header above for more details. This * filter should be the default. */ bool aggressiveFilter(char *input) const; /** provides a pointer to a fresh compiled * expression for some given expression */ regex_t *getCompiledExpression(const std::string &expression) const; /** returns a set of characters that represent the * given character in "l33t-speak" */ std::string l33tspeakSetFromCharacter(const char c) const; /** returns what alphabetic character a given char * corresponds to (e.g. 3 => e, | => il) */ std::string alphabeticSetFromCharacter(const char c) const; /** expands a word into an uncompiled regular * expression. */ std::string expressionFromString(const std::string &word) const; public: WordFilter(void); WordFilter(const WordFilter& filter); ~WordFilter(void); /** loads a set of bad words from a specified file */ unsigned int loadFromFile(const std::string &fileName, bool verbose=false); /** adds a new filter to the existing filter list */ bool addToFilter(const std::string &word, const std::string &expression); /** given an input string, filter the input * using either the simple or agressive filter */ bool filter(char *input, const bool simple=false) const; bool filter(std::string &input, const bool simple=false) const; /** dump a list of words in the filter to stdout */ void outputWords(void) const; /** dump the filter to stdout (including expressions) */ void outputFilter(void) const; /** retuns a count of how many words are in the filter */ unsigned long int wordCount(void) const; /** Clears the Filter */ void clear(void); }; /** utility method performs an actual replacement of * characters in an input character ray within a specified * range. */ inline int WordFilter::filterCharacters(char *input, unsigned int start, size_t length, bool filterSpaces=false) const { if (input == NULL) { return -1; } if (length <= 0){ return -1; } if (strlen(input) < start) { return 0; } int randomCharPos, previousCharPos = -1; int maxFilterChar = (int)filterChars.size(); int count=0; for (unsigned int j=0; j < (unsigned int)length; j++) { char c = input[start + j]; // don't repeat random chars do { randomCharPos = (int)((float)maxFilterChar * (float)bzfrand()); } while (randomCharPos == previousCharPos); previousCharPos = randomCharPos; /* when filterspaces is true, we filter everything. * otherise the ascii character code ranges for a-z, A-Z, and 0-9 * are filtered. */ if (filterSpaces) { input[start + j] = filterChars[randomCharPos]; count++; } else if (TextUtils::isAlphanumeric(c)) { input[start + j] = filterChars[randomCharPos]; count++; } /* else it is non-letters so we can ignore */ } return count; } inline void WordFilter::appendUniqueChar(std::string& string, char c) const { #ifdef HAVE_STD__COUNT // ISO standard std::count if (std::count(string.begin(), string.end(), c) == 0) { string += c; } #else // old HP-style std::count (SunPRO for instance) int n = 0; std::count(string.begin(), string.end(), c, n); if (n == 0) { string += c; } #endif } inline void WordFilter::addPrefix(const char *word) { filter_t fix; std::pair result; fix.word = std::string(word); fix.compiled = getCompiledExpression(expressionFromString(fix.word)); result = prefixes.insert(fix); if (!result.second && fix.compiled) { regfree(fix.compiled); free(fix.compiled); } } inline void WordFilter::addSuffix(const char *word) { filter_t fix; std::pair result; fix.word = std::string(word); fix.compiled = getCompiledExpression(expressionFromString(fix.word)); result = suffixes.insert(fix); if (!result.second && fix.compiled) { regfree(fix.compiled); free(fix.compiled); } } #else class WordFilter; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/WorldEventManager.h000066400000000000000000000050671200563112200206270ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * world event manager definitions ************************************ * right now this just does team flag capture events for world weps * but it should be able to be expandable to store any type of event * for anything that can be triggerd. */ #ifndef WORLD_EVENT_MANAGER_H #define WORLD_EVENT_MANAGER_H #include #include #include #include "bzfsAPI.h" // event handler callback class bz_EventHandler { public: bz_Plugin *plugin; virtual ~bz_EventHandler(){plugin = NULL;} virtual void process ( bz_EventData *eventData ) { if (plugin) plugin->Event(eventData); } std::vector HandledEvents; bool HasEvent( bz_eEventType evt) { return std::find(HandledEvents.begin(),HandledEvents.end(),evt) != HandledEvents.end(); } void AddEvent( bz_eEventType evt ) { if (std::find(HandledEvents.begin(),HandledEvents.end(),evt) == HandledEvents.end()) HandledEvents.push_back(evt); } void RemoveEvent( bz_eEventType evt ) { std::vector::iterator itr = std::find(HandledEvents.begin(),HandledEvents.end(),evt); if ( itr!= HandledEvents.end()) HandledEvents.erase(itr); } }; typedef std::vector tvEventList; class WorldEventManager { public: WorldEventManager(); ~WorldEventManager(); void addEvent ( bz_eEventType eventType, bz_EventHandler* theEvent ); void removeEvent ( bz_eEventType eventType, bz_EventHandler* theEvent ); bool removeHandler ( bz_EventHandler* theEvent ); void callEvents ( bz_eEventType eventType, bz_EventData *eventData ); void callEvents ( bz_EventData *eventData ); void callEvents ( const bz_EventData &eventData ){callEvents((bz_EventData*)&eventData);} tvEventList eventList; }; extern WorldEventManager worldEventManager; bool RegisterEvent ( bz_eEventType eventType, bz_Plugin* plugin ); bool RemoveEvent ( bz_eEventType eventType, bz_Plugin* plugin ); bool FlushEvents(bz_Plugin* plugin); #endif // WORLD_EVENT_MANAGER_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/ZSceneDatabase.h000066400000000000000000000036501200563112200200530ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* ZSceneDatabase: * Database of geometry to render using Z-buffer algorithm */ #ifndef BZF_Z_SCENE_DATABASE_H #define BZF_Z_SCENE_DATABASE_H #include "common.h" #include "SceneDatabase.h" class ZSceneDatabase : public SceneDatabase { friend class ZSceneIterator; public: ZSceneDatabase(); ~ZSceneDatabase(); // returns true if the node would have been deleted bool addStaticNode(SceneNode*, bool dontFree); void addDynamicNode(SceneNode*); void addDynamicSphere(SphereSceneNode*); void finalizeStatics(); void removeDynamicNodes(); void removeAllNodes(); bool isOrdered(); void updateNodeStyles(); void addLights(SceneRenderer& renderer); void addShadowNodes(SceneRenderer &renderer); void addRenderNodes(SceneRenderer& renderer); void renderRadarNodes(const ViewFrustum&); void drawCuller(); void setOccluderManager(int); const Extents* getVisualExtents() const; private: void setupCullList(); void makeCuller(); private: int staticCount; int staticSize; SceneNode** staticList; int dynamicCount; int dynamicSize; SceneNode** dynamicList; int culledCount; SceneNode** culledList; class Octree* octree; int cullDepth; int cullElements; }; #endif // BZF_Z_SCENE_DATABASE_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bz_Locale.h000066400000000000000000000031001200563112200171170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LOCALE_H__ #define __LOCALE_H__ #include "common.h" // system interface headers #include /** Locale will help control the output of strings so that they are * localized to the specified localization. ;) */ class Locale { private: int _language; int _country; protected: public: Locale(std::string language="en", std::string country="US"); ~Locale(); void setLanguage(std::string language); void setCountry(std::string country); /** returns a 2-char language code */ std::string language() const; /** returns a 3-char language code */ std::string language3() const; /** returns an English name for the locale language */ std::string languageName() const; /** returns a 2-char country code */ std::string country() const; /** returns a 3-char country code */ std::string country3() const; /** returns an English name for the locale country */ std::string countryName() const; }; /* class Locale */ #else class BZLocale; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bzfSDL.h000066400000000000000000000020051200563112200163540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZFSDL_H__ #define __BZFSDL_H__ /** this file contains headers necessary for SDL */ #ifdef HAVE_SDL # ifdef HAVE_SDL_SDL_H # include # include # include # else // autotools adds an SDL-specific include path # include "SDL.h" # include "SDL_thread.h" # include "SDL_getenv.h" # endif //HAVE_SDL_SDL_H #endif //HAVE_SDL #endif /* __BZFSDL_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bzfgl.h000066400000000000000000000061761200563112200163510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZFGL_H__ #define __BZFGL_H__ /** this file contains headers necessary for opengl */ // glew.h needs to come before gl.h, etc... #include "common.h" #ifdef HAVE_GLEW #include #endif #ifdef __APPLE__ # include # include # include #else # include # include #endif #ifndef GL_VERSION_1_1 # error OpenGL version 1.1 functionality is required #endif /* These will track glBegin/End pairs to make sure that they match */ #ifdef DEBUG #include extern int __beginendCount; #define glBegin(_value) {\ if (__beginendCount==0) { \ __beginendCount++;\ } else {\ std::cerr << "ERROR: glBegin called on " << __FILE__ << ':' << __LINE__ << " without calling glEnd before\n"; \ assert(__beginendCount==0 && "glBegin called without glEnd"); \ } \ glBegin(_value);\ } #define glEnd() {\ if (__beginendCount==0) { \ std::cerr << "ERROR: glEnd called on " << __FILE__ << ':' << __LINE__ << " without calling glBegin before\n"; \ assert(__beginendCount!=0 && "glEnd called without glBegin"); \ } else {\ __beginendCount--;\ } \ glEnd();\ } #endif // glGenTextures() should never return 0 #define INVALID_GL_TEXTURE_ID ((GLuint) 0) // glGenLists() will only return 0 for errors #define INVALID_GL_LIST_ID ((GLuint) 0) /* Protect us from ourselves. Warn when these * are called inside of the wrong context code * sections (freeing and initializing). */ //#define DEBUG_GL_MATRIX_STACKS #ifdef DEBUG # define glNewList(list,mode) bzNewList((list), (mode)) # define glGenLists(count) bzGenLists((count)) # define glGenTextures(count, textures) bzGenTextures((count), (textures)) # ifdef DEBUG_GL_MATRIX_STACKS # define glPushMatrix() bzPushMatrix() # define glPopMatrix() bzPopMatrix() # define glMatrixMode(mode) bzMatrixMode(mode) # endif // DEBUG_GL_MATRIX_STACKS #endif // always swap these calls (context protection) #define glDeleteLists(base, count) bzDeleteLists((base), (count)) #define glDeleteTextures(count, textures) bzDeleteTextures((count), (textures)) // these are housed at the end of OpenGLGState.cxx, for now extern void bzNewList(GLuint list, GLenum mode); extern GLuint bzGenLists(GLsizei count); extern void bzGenTextures(GLsizei count, GLuint *textures); extern void bzDeleteLists(GLuint base, GLsizei count); extern void bzDeleteTextures(GLsizei count, const GLuint *textures); extern void bzPushMatrix(); extern void bzPopMatrix(); extern void bzMatrixMode(GLenum mode); #endif /* __BZFGL_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bzfio.h000066400000000000000000000022551200563112200163500ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Include c++ iostream. */ #ifndef BZF_MYIO #define BZF_MYIO #include "common.h" void setDebugTimestamp (bool enable, bool doMicros, bool utc); void logDebugMessage(int level, const char* fmt, ...); class LoggingCallback { public: virtual ~LoggingCallback(){}; virtual void log ( int level, const char* message ) = 0; }; extern LoggingCallback *loggingCallback; /* egcs headers on linux define NULL as (void*)0. that's a no no in C++. */ #if defined(NULL) # undef NULL #endif #define NULL 0 /* insert any other broken OS conditionals here */ #include #endif /* * Local Variables: *** * mode:C++ *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/bzfsAPI.h000066400000000000000000001360651200563112200165440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // all the exported functions for bzfs plugins #ifndef _BZFS_API_H_ #define _BZFS_API_H_ /* system interface headers */ #include #include #include #include /* DO NOT INCLUDE ANY OTHER HEADERS IN THIS FILE */ /* PLUGINS NEED TO BE BUILT WITHOUT THE BZ SOURCE TREE */ /* JUST THIS ONE FILE */ #ifdef _WIN32 #pragma warning( disable : 4996 ) #ifdef INSIDE_BZ #define BZF_API __declspec( dllexport ) #else #define BZF_API __declspec( dllimport ) #endif #define BZF_PLUGIN_CALL #ifndef strcasecmp #define strcasecmp stricmp #endif #else #define BZF_API #define BZF_PLUGIN_CALL extern "C" #endif class bz_Plugin; #define BZ_API_VERSION 26 #define BZ_GET_PLUGIN_VERSION BZF_PLUGIN_CALL int bz_GetMinVersion ( void ) { return BZ_API_VERSION;} #define BZ_PLUGIN(n)\ BZF_PLUGIN_CALL bz_Plugin* bz_GetPlugin ( void ) { return new n;}\ BZF_PLUGIN_CALL void bz_FreePlugin ( bz_Plugin* plugin ) { delete(plugin);}\ BZF_PLUGIN_CALL int bz_GetMinVersion ( void ) { return BZ_API_VERSION;} /** This is so we can use gcc's "format string vs arguments"-check * for various printf-like functions, and still maintain compatability. * Not tested on other platforms yet, but should work. */ #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes * are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif /** shorthand defines to make the code cleaner. */ #define _ATTRIBUTE34 __attribute__ ((__format__ (__printf__, 3, 4))) #define _ATTRIBUTE23 __attribute__ ((__format__ (__printf__, 2, 3))) #define _ATTRIBUTE12 __attribute__ ((__format__ (__printf__, 1, 2))) #ifdef __cplusplus # ifndef DEFINED_FORCE_CAST # define DEFINED_FORCE_CAST template inline To force_cast(From const & f) { union { From f; To t; } fc; fc.f = f; return fc.t; } # endif #endif typedef enum { eGoodFlag = 0, eBadFlag, eLastFlagQuality } bz_eFlagQuality; //utility classes class BZF_API bz_ApiString { public: bz_ApiString(); bz_ApiString(const char* c); bz_ApiString(const std::string &s); bz_ApiString(const bz_ApiString &r); ~bz_ApiString(); bz_ApiString& operator = ( const bz_ApiString& r ); bz_ApiString& operator = ( const std::string& r ); bz_ApiString& operator = ( const char* r ); bool operator == ( const bz_ApiString&r ); bool operator == ( const std::string& r ); bool operator == ( const char* r ); bool operator != ( const bz_ApiString&r ); bool operator != ( const std::string& r ); bool operator != ( const char* r ); unsigned int size ( void ) const; const char* c_str(void) const; void format(const char* fmt, ...); void replaceAll ( const char* target, const char* with ); void tolower ( void ); void toupper ( void ); void urlEncode ( void ); protected: class dataBlob; dataBlob *data; }; class BZF_API bz_APIIntList { public: bz_APIIntList(); bz_APIIntList(const bz_APIIntList &r); bz_APIIntList(const std::vector &r); ~bz_APIIntList(); void push_back ( int value ); int get ( unsigned int i ); const int& operator[] (unsigned int i) const; bz_APIIntList& operator = ( const bz_APIIntList& r ); bz_APIIntList& operator = ( const std::vector& r ); unsigned int size ( void ); void clear ( void ); protected: class dataBlob; dataBlob *data; }; BZF_API bz_APIIntList* bz_newIntList ( void ); BZF_API void bz_deleteIntList( bz_APIIntList * l ); class BZF_API bz_APIFloatList { public: bz_APIFloatList(); bz_APIFloatList(const bz_APIFloatList &r); bz_APIFloatList(const std::vector &r); ~bz_APIFloatList(); void push_back ( float value ); float get ( unsigned int i ); const float& operator[] (unsigned int i) const; bz_APIFloatList& operator = ( const bz_APIFloatList& r ); bz_APIFloatList& operator = ( const std::vector& r ); unsigned int size ( void ); void clear ( void ); protected: class dataBlob; dataBlob *data; }; BZF_API bz_APIFloatList* bz_newFloatList ( void ); BZF_API void bz_deleteFloatList( bz_APIFloatList * l ); class BZF_API bz_APIStringList { public: bz_APIStringList(); bz_APIStringList(const bz_APIStringList &r); bz_APIStringList(const std::vector &r); ~bz_APIStringList(); void push_back ( const bz_ApiString &value ); void push_back ( const std::string &value ); bz_ApiString get ( unsigned int i ) const; const bz_ApiString& operator[] (unsigned int i) const; bz_APIStringList& operator = ( const bz_APIStringList& r ); bz_APIStringList& operator = ( const std::vector& r ); unsigned int size ( void ) const; void clear ( void ); void tokenize ( const char* in, const char* delims, int maxTokens = 0, bool useQuotes = false); protected: class dataBlob; dataBlob *data; }; BZF_API bz_APIStringList* bz_newStringList ( void ); BZF_API void bz_deleteStringList( bz_APIStringList * l ); // current time (leave method here, used in bz_EventData constructor) BZF_API double bz_getCurrentTime(void); // versioning BZF_API int bz_APIVersion ( void ); // event stuff typedef enum { bz_eNullEvent = 0, bz_eCaptureEvent, bz_ePlayerDieEvent, bz_ePlayerSpawnEvent, bz_eZoneEntryEvent, bz_eZoneExitEvent, bz_ePlayerJoinEvent, bz_ePlayerPartEvent, bz_eRawChatMessageEvent, // before filter bz_eFilteredChatMessageEvent, // after filter bz_eUnknownSlashCommand, bz_eGetPlayerSpawnPosEvent, bz_eGetAutoTeamEvent, bz_eAllowPlayer, bz_eTickEvent, bz_eGetWorldEvent, bz_eGetPlayerInfoEvent, bz_eAllowSpawn, bz_eListServerUpdateEvent, bz_eBanEvent, bz_eHostBanModifyEvent, bz_eKickEvent, bz_eKillEvent, bz_ePlayerPausedEvent, bz_eMessageFilteredEvent, bz_eGameStartEvent, bz_eGameEndEvent, bz_eSlashCommandEvent, bz_ePlayerAuthEvent, bz_eServerMsgEvent, bz_eShotFiredEvent, bz_ePlayerUpdateEvent, bz_eNetDataSendEvent, bz_eNetDataReceiveEvent, bz_eLoggingEvent, bz_eShotEndedEvent, bz_eFlagTransferredEvent, bz_eFlagGrabbedEvent, bz_eFlagDroppedEvent, bz_eAllowCTFCaptureEvent, bz_eMsgDebugEvent, bz_eNewNonPlayerConnection, bz_ePluginLoaded, bz_ePluginUnloaded, bz_ePlayerScoreChanged, bz_eTeamScoreChanged, bz_eWorldFinalized, bz_eReportFiledEvent, bz_eBZDBChange, bz_eGetPlayerMotto, bz_eAllowConnection, bz_eAllowFlagGrab, bz_eLastEvent //this is never used as an event, just show it's the last one }bz_eEventType; // permision #defines #define bz_perm_actionMessage "actionMessage" #define bz_perm_adminMessageReceive "adminMessageReceive" #define bz_perm_adminMessageSend "adminMessageSend" #define bz_perm_antiban "antiban" #define bz_perm_antikick "antikick" #define bz_perm_antikill "antikill" #define bz_perm_antipoll "antipoll" #define bz_perm_antipollban "antipollban" #define bz_perm_antipollkick "antipollkick" #define bz_perm_antipollkill "antipollkill" #define bz_perm_ban "ban" #define bz_perm_banlist "banlist" #define bz_perm_countdown "countdown" #define bz_perm_date "date" #define bz_perm_endGame "endGame" #define bz_perm_flagHistory "flagHistory" #define bz_perm_flagMod "flagMod" #define bz_perm_hideAdmin "hideAdmin" #define bz_perm_idleStats "idleStats" #define bz_perm_info "info" #define bz_perm_kick "kick" #define bz_perm_kill "kill" #define bz_perm_lagStats "lagStats" #define bz_perm_lagwarn "lagwarn" #define bz_perm_listPerms "listPerms" #define bz_perm_masterBan "masterban" #define bz_perm_mute "mute" #define bz_perm_playerList "playerList" #define bz_perm_poll "poll" #define bz_perm_pollBan "pollBan" #define bz_perm_pollKick "pollKick" #define bz_perm_pollKill "pollKill" #define bz_perm_pollSet "pollSet" #define bz_perm_pollFlagReset "pollFlagReset" #define bz_perm_privateMessage "privateMessage" #define bz_perm_record "record" #define bz_perm_rejoin "rejoin" #define bz_perm_removePerms "removePerms" #define bz_perm_replay "replay" #define bz_perm_say "say" #define bz_perm_sendHelp "sendHelp" #define bz_perm_setAll "setAll" #define bz_perm_setPassword "setPassword" #define bz_perm_setPerms "setPerms" #define bz_perm_setVar "setVar" #define bz_perm_showOthers "showOthers" #define bz_perm_shortBan "shortBan" #define bz_perm_shutdownServer "shutdownServer" #define bz_perm_spawn "spawn" #define bz_perm_superKill "superKill" #define bz_perm_talk "talk" #define bz_perm_unban "unban" #define bz_perm_unmute "unmute" #define bz_perm_veto "veto" #define bz_perm_viewReports "viewReports" #define bz_perm_vote "vote" // types of text messages typedef enum { eChatMessage, eActionMessage } bz_eMessageType; typedef enum { eNoTeam = -1, eRogueTeam = 0, eRedTeam, eGreenTeam, eBlueTeam, ePurpleTeam, eRabbitTeam, eHunterTeam, eObservers, eAdministrators }bz_eTeamType; #define BZ_SERVER -2 #define BZ_ALLUSERS -1 #define BZ_NULLUSER -3 #define BZ_BZDBPERM_NA 0 #define BZ_BZDBPERM_USER 1 #define BZ_BZDBPERM_SERVER 2 #define BZ_BZDBPERM_CLIENT 3 typedef enum { eFFAGame= 0, eOpenFFAGame, eCTFGame, eRabbitGame }bz_eGameType; typedef enum { eDead, // not alive, not paused, etc. eAlive, // player is alive ePaused, // player is paused eExploding, // currently blowing up eTeleporting // teleported recently } bz_ePlayerStatus; typedef struct bz_PlayerUpdateState { bz_ePlayerStatus status; // special states bool falling; // not driving on the ground or an obstacle bool crossingWall; // crossing an obstacle wall bool inPhantomZone; // zoned float pos[3]; // position of tank float velocity[3]; // velocity of tank float rotation; // orientation of tank float angVel; // angular velocity of tank int phydrv; // physics driver } bz_PlayerUpdateState; class bz_BasePlayerRecord; BZF_API bool bz_freePlayerRecord ( bz_BasePlayerRecord *playerRecord ); // event data types class BZF_API bz_EventData { public: bz_EventData(bz_eEventType type = bz_eNullEvent) : version(1), eventType(type), eventTime( bz_getCurrentTime() ) { } virtual ~bz_EventData() {} virtual void update() {} int version; bz_eEventType eventType; double eventTime; }; class BZF_API bz_CTFCaptureEventData_V1 : public bz_EventData { public: bz_CTFCaptureEventData_V1() : bz_EventData(bz_eCaptureEvent) , teamCapped(eNoTeam), teamCapping(eNoTeam), playerCapping(-1) , rot(0.0) { memset(pos,0,sizeof(float)*3); } bz_eTeamType teamCapped; bz_eTeamType teamCapping; int playerCapping; float pos[3]; float rot; }; class BZF_API bz_PlayerDieEventData_V1 : public bz_EventData { public: bz_PlayerDieEventData_V1() : bz_EventData(bz_ePlayerDieEvent) , playerID(-1), team(eNoTeam), killerID(-1), killerTeam(eNoTeam) , shotID(-1) , driverID(-1), state() { } int playerID; bz_eTeamType team; int killerID; bz_eTeamType killerTeam; bz_ApiString flagKilledWith; int shotID; int driverID; bz_PlayerUpdateState state; }; class BZF_API bz_PlayerSpawnEventData_V1 : public bz_EventData { public: bz_PlayerSpawnEventData_V1() : bz_EventData(bz_ePlayerSpawnEvent) , playerID(-1), team(eNoTeam), state() { } int playerID; bz_eTeamType team; bz_PlayerUpdateState state; }; class BZF_API bz_ChatEventData_V1 : public bz_EventData { public: bz_ChatEventData_V1() : bz_EventData(bz_eRawChatMessageEvent) , from(-1), to(-1), team(eNoTeam) { } int from; int to; bz_eTeamType team; bz_ApiString message; }; class BZF_API bz_PlayerJoinPartEventData_V1 : public bz_EventData { public: bz_PlayerJoinPartEventData_V1() : bz_EventData(bz_ePlayerJoinEvent) , playerID(-1), record(0) { } ~bz_PlayerJoinPartEventData_V1() { bz_freePlayerRecord(record); } int playerID; bz_BasePlayerRecord* record; bz_ApiString reason; }; class BZF_API bz_UnknownSlashCommandEventData_V1 : public bz_EventData { public: bz_UnknownSlashCommandEventData_V1() : bz_EventData(bz_eUnknownSlashCommand) , from(-1), handled(false) { } int from; bool handled; bz_ApiString message; }; class BZF_API bz_GetPlayerSpawnPosEventData_V1 : public bz_EventData { public: bz_GetPlayerSpawnPosEventData_V1() : bz_EventData(bz_eGetPlayerSpawnPosEvent) , playerID(-1), team(eNoTeam), handled(false) , rot(0.0) { pos[0] = pos[1] = pos[2] = 0.0f; } int playerID; bz_eTeamType team; bool handled; float pos[3]; float rot; }; class BZF_API bz_AllowPlayerEventData_V1 : public bz_EventData { public: bz_AllowPlayerEventData_V1() : bz_EventData(bz_eAllowPlayer) , playerID(-1) , allow(true) { } int playerID; bz_ApiString callsign; bz_ApiString ipAddress; bz_ApiString reason; bool allow; }; class BZF_API bz_TickEventData_V1 : public bz_EventData { public: bz_TickEventData_V1() : bz_EventData(bz_eTickEvent) { } }; class BZF_API bz_GetWorldEventData_V1 : public bz_EventData { public: bz_GetWorldEventData_V1() : bz_EventData(bz_eGetWorldEvent) , generated(false) , ctf(false) , rabbit(false) , openFFA(false) , worldBlob(NULL) { } bool generated; bool ctf; bool rabbit; bool openFFA; bz_ApiString worldFile; char* worldBlob; // if assigned, the world will be read from this NUL // terminated string. BZFS does not free this memory, // so the plugin must do so (this can be done in the // WorldFinalize event) }; class BZF_API bz_GetPlayerInfoEventData_V1 : public bz_EventData { public: bz_GetPlayerInfoEventData_V1() : bz_EventData(bz_eGetPlayerInfoEvent) , playerID(-1), team(eNoTeam) , admin(false), verified(false), registered(false) { } int playerID; bz_ApiString callsign; bz_ApiString ipAddress; bz_eTeamType team; bool admin; bool verified; bool registered; }; class BZF_API bz_GetAutoTeamEventData_V1 : public bz_EventData { public: bz_GetAutoTeamEventData_V1() : bz_EventData(bz_eGetAutoTeamEvent) , playerID(-1), team(eNoTeam) , handled(false) { } int playerID; bz_ApiString callsign; bz_eTeamType team; bool handled; }; class BZF_API bz_AllowSpawnData_V1 : public bz_EventData { public: bz_AllowSpawnData_V1() : bz_EventData(bz_eAllowSpawn) , playerID(-1), team(eNoTeam) , handled(false), allow(true) { } int playerID; bz_eTeamType team; bool handled; bool allow; }; class BZF_API bz_ListServerUpdateEvent_V1 : public bz_EventData { public: bz_ListServerUpdateEvent_V1() : bz_EventData(bz_eListServerUpdateEvent) , handled(false) { } bz_ApiString address; bz_ApiString description; bz_ApiString groups; bool handled; }; class BZF_API bz_BanEventData_V1 : public bz_EventData { public: bz_BanEventData_V1() : bz_EventData(bz_eBanEvent) , bannerID(-1), banneeID(-1), duration(-1) { } int bannerID; int banneeID; int duration; bz_ApiString ipAddress; bz_ApiString reason; }; class BZF_API bz_HostBanEventData_V1 : public bz_EventData { public: bz_HostBanEventData_V1() : bz_EventData(bz_eHostBanModifyEvent) , bannerID(-1), duration(-1) { } int bannerID; int duration; bz_ApiString hostPattern; bz_ApiString reason; }; class BZF_API bz_KickEventData_V1 : public bz_EventData { public: bz_KickEventData_V1() : bz_EventData(bz_eKickEvent) , kickerID(-1), kickedID(-1) { } int kickerID; int kickedID; bz_ApiString reason; }; class BZF_API bz_KillEventData_V1 : public bz_EventData { public: bz_KillEventData_V1() : bz_EventData(bz_eKillEvent) , killerID(-1), killedID(-1) { } int killerID; int killedID; bz_ApiString reason; }; class BZF_API bz_PlayerPausedEventData_V1 : public bz_EventData { public: bz_PlayerPausedEventData_V1() : bz_EventData(bz_ePlayerPausedEvent) , playerID(-1), pause(false) { } int playerID; bool pause; }; class BZF_API bz_MessageFilteredEventData_V1 : public bz_EventData { public: bz_MessageFilteredEventData_V1() : bz_EventData(bz_eMessageFilteredEvent) , playerID(-1) { } int playerID; bz_ApiString rawMessage; bz_ApiString filteredMessage; }; class BZF_API bz_GameStartEndEventData_V1 : public bz_EventData { public: bz_GameStartEndEventData_V1() : bz_EventData(bz_eGameStartEvent) , duration(0.0) { } double duration; }; class BZF_API bz_SlashCommandEventData_V1 : public bz_EventData { public: bz_SlashCommandEventData_V1() : bz_EventData(bz_eSlashCommandEvent) , from(-1) { } int from; bz_ApiString message; }; class BZF_API bz_PlayerAuthEventData_V1 : public bz_EventData { public: bz_PlayerAuthEventData_V1() : bz_EventData(bz_ePlayerAuthEvent) , playerID(-1), password(false), globalAuth(false) { } int playerID; bool password; bool globalAuth; }; class BZF_API bz_ServerMsgEventData_V1 : public bz_EventData { public: bz_ServerMsgEventData_V1() : bz_EventData(bz_eServerMsgEvent) , to(-1), team(eNoTeam) { } int to; bz_eTeamType team; bz_ApiString message; }; class BZF_API bz_ShotFiredEventData_V1 : public bz_EventData { public: bz_ShotFiredEventData_V1() : bz_EventData(bz_eShotFiredEvent) , changed(false) , playerID(-1) , shotID(-1) { pos[0] = pos[1] = pos[2] = 0.0f; vel[0] = vel[1] = vel[2] = 0.0f; } bool changed; float pos[3]; float vel[3]; bz_ApiString type; int playerID; int shotID; }; class BZF_API bz_PlayerUpdateEventData_V1 : public bz_EventData { public: bz_PlayerUpdateEventData_V1() : bz_EventData(bz_ePlayerUpdateEvent) , playerID(-1), state(), lastState(), stateTime(0.0) { } int playerID; bz_PlayerUpdateState state; bz_PlayerUpdateState lastState; double stateTime; }; class BZF_API bz_NetTransferEventData_V1 : public bz_EventData { public: bz_NetTransferEventData_V1() : bz_EventData(bz_eNetDataReceiveEvent) , send(false), udp(false), iSize(0), playerID(-1) , data(NULL) { } bool send; bool udp; unsigned int iSize; int playerID; // DON'T CHANGE THIS!!! unsigned char* data; }; class BZF_API bz_LoggingEventData_V1 : public bz_EventData { public: bz_LoggingEventData_V1() : bz_EventData(bz_eLoggingEvent) , level(0) { } int level; bz_ApiString message; }; class BZF_API bz_ShotEndedEventData_V1 : public bz_EventData { public: bz_ShotEndedEventData_V1() : bz_EventData(bz_eShotEndedEvent) , playerID(-1) , shotID(-1) , explode(false) { } int playerID; int shotID; bool explode; }; class BZF_API bz_FlagTransferredEventData_V1 : public bz_EventData { public: enum Action { ContinueSteal = 0, CancelSteal = 1, DropThief = 2 }; bz_FlagTransferredEventData_V1() : bz_EventData(bz_eFlagTransferredEvent) , fromPlayerID(0), toPlayerID(0), flagType(NULL), action(ContinueSteal) { } int fromPlayerID; int toPlayerID; const char* flagType; enum Action action; }; class BZF_API bz_FlagGrabbedEventData_V1 : public bz_EventData { public: bz_FlagGrabbedEventData_V1() : bz_EventData(bz_eFlagGrabbedEvent) , playerID(-1), flagID(-1) , flagType(NULL) { pos[0] = pos[1] = pos[2] = 0; } int playerID; int flagID; const char* flagType; float pos[3]; }; class BZF_API bz_FlagDroppedEventData_V1 : public bz_EventData { public: bz_FlagDroppedEventData_V1() : bz_EventData(bz_eFlagDroppedEvent) , playerID(-1), flagID(-1), flagType(NULL) { pos[0] = pos[1] = pos[2] = 0; } int playerID; int flagID; const char* flagType; float pos[3]; }; class BZF_API bz_AllowCTFCaptureEventData_V1 : public bz_EventData { public: bz_AllowCTFCaptureEventData_V1() : bz_EventData(bz_eAllowCTFCaptureEvent) , teamCapped(eNoTeam), teamCapping(eNoTeam), playerCapping(-1) , rot(0.0) , allow(false), killTeam(true) { memset (pos, 0, sizeof(float)*3); } bz_eTeamType teamCapped; bz_eTeamType teamCapping; int playerCapping; float pos[3]; float rot; bool allow; bool killTeam; }; class BZF_API bz_MsgDebugEventData_V1 : public bz_EventData { public: bz_MsgDebugEventData_V1(): bz_EventData(bz_eMsgDebugEvent) , len(), msg(), receive(true) , playerID(-1) { memset (code, 0, sizeof(char)*2); } char code[2]; size_t len; unsigned char* msg; bool receive; int playerID; }; class BZF_API bz_NewNonPlayerConnectionEventData_V1 : public bz_EventData { public: bz_NewNonPlayerConnectionEventData_V1() : bz_EventData(bz_eNewNonPlayerConnection) , connectionID(-1) , data(0), size(0) { } int connectionID; void* data; unsigned int size; }; class BZF_API bz_PluginLoadUnloadEventData_V1 : public bz_EventData { public: bz_PluginLoadUnloadEventData_V1() : bz_EventData(bz_ePluginLoaded) , plugin(NULL) { } bz_Plugin* plugin; }; typedef enum { bz_eWins, bz_eLosses, bz_eTKs }bz_eScoreElement; class BZF_API bz_PlayerScoreChangeEventData_V1 : public bz_EventData { public: bz_PlayerScoreChangeEventData_V1( int id, bz_eScoreElement e, int lastV, int thisv) : bz_EventData(bz_ePlayerScoreChanged) , playerID(id), element(e), thisValue(thisv), lastValue(lastV) { } int playerID; bz_eScoreElement element; int thisValue; int lastValue; }; class BZF_API bz_TeamScoreChangeEventData_V1 : public bz_EventData { public: bz_TeamScoreChangeEventData_V1(bz_eTeamType t, bz_eScoreElement e, int lastV, int thisv) : bz_EventData(bz_eTeamScoreChanged) , team(t), element(e), thisValue(thisv), lastValue(lastV) { } bz_eTeamType team; bz_eScoreElement element; int thisValue; int lastValue; }; class BZF_API bz_ReportFiledEventData_V1 : public bz_EventData { public: bz_ReportFiledEventData_V1() : bz_EventData(bz_eReportFiledEvent){} bz_ApiString from; bz_ApiString message; }; class BZF_API bz_BZDBChangeData_V1 : public bz_EventData { public: bz_BZDBChangeData_V1(const std::string& _key, const std::string& _value) : bz_EventData(bz_eBZDBChange), key(_key), value(_value) {} bz_ApiString key; bz_ApiString value; }; class BZF_API bz_GetPlayerMottoData_V1 : public bz_EventData { public: bz_GetPlayerMottoData_V1(const char* m) : bz_EventData(bz_eGetPlayerMotto) { if (m) motto = m; } bz_ApiString motto; }; class BZF_API bz_AllowConnectionData_V1 : public bz_EventData { public: bz_AllowConnectionData_V1(const char* i) : bz_EventData(bz_eAllowConnection) { if (i) ip = i; allow = true; } bz_ApiString ip; bool allow; }; class BZF_API bz_AllowFlagGrabData_V1 : public bz_EventData { public: bz_AllowFlagGrabData_V1() : bz_EventData(bz_eAllowFlagGrab) { allow = true; } int playerID; int flagID; const char* flagType; bool allow; }; // logging BZF_API void bz_debugMessage ( int debugLevel, const char* message ); BZF_API void bz_debugMessagef( int debugLevel, const char* fmt, ... ); BZF_API int bz_getDebugLevel ( void ); BZF_API int bz_setDebugLevel ( int debugLevel ); // plug-in registration class BZF_API bz_Plugin { public: bz_Plugin(); virtual ~bz_Plugin(); virtual const char* Name () = 0; virtual void Init(const char* config) = 0; virtual void Cleanup() {} virtual void Event(bz_EventData* /*eventData*/) { return; } // used for inter plugin communication virtual int GeneralCallback( const char* /*name*/, void* /*data*/) { return 0; } float MaxWaitTime; bool Unloadable; protected: bool Register (bz_eEventType eventType); bool Remove (bz_eEventType eventType); void Flush (); }; BZF_API bool bz_pluginExists(const char* name); BZF_API bz_Plugin* bz_getPlugin(const char* name); // non player data handlers class bz_NonPlayerConnectionHandler { public: virtual ~bz_NonPlayerConnectionHandler() {} virtual void pending(int connectionID, void *data, unsigned int size) = 0; virtual void disconnect(int connectionID) { if (connectionID) return; } }; BZF_API bool bz_registerNonPlayerConnectionHandler(int connectionID, bz_NonPlayerConnectionHandler* handler); BZF_API bool bz_removeNonPlayerConnectionHandler(int connectionID, bz_NonPlayerConnectionHandler* handler); BZF_API bool bz_setNonPlayerInactivityTimeout(int connectionID, double time); BZF_API bool bz_setNonPlayerDataThrottle(int connectionID, double time); BZF_API bool bz_setNonPlayerDisconnectOnSend(int connectionID, bool bSet); BZF_API bool bz_sendNonPlayerData(int connectionID, const void *data, unsigned int size); BZF_API bool bz_disconnectNonPlayerConnection(int connectionID); BZF_API unsigned int bz_getNonPlayerConnectionOutboundPacketCount(int connectionID); BZF_API const char* bz_getNonPlayerConnectionIP(int connectionID); BZF_API const char* bz_getNonPlayerConnectionHost(int connectionID); // player info class bz_BasePlayerRecord; // player listing BZF_API bz_APIIntList* bz_getPlayerIndexList(void); BZF_API bool bz_getPlayerIndexList ( bz_APIIntList *playerList ); BZF_API bz_BasePlayerRecord *bz_getPlayerByIndex ( int index ); BZF_API bool bz_updatePlayerData ( bz_BasePlayerRecord *playerRecord ); BZF_API bool bz_hasPerm ( int playerID, const char* perm ); BZF_API bool bz_grantPerm ( int playerID, const char* perm ); BZF_API bool bz_revokePerm ( int playerID, const char* perm ); BZF_API bool bz_getAdmin(int playerID); BZF_API bool bz_validAdminPassword(const char* passwd); BZF_API const char* bz_getPlayerFlag( int playerID ); BZF_API bool bz_isPlayerPaused( int playerID ); BZF_API bz_eTeamType bz_getPlayerTeam(int playerID); BZF_API const char* bz_getPlayerCallsign(int playerID); BZF_API const char* bz_getPlayerMotto(int playerID); BZF_API const char* bz_getPlayerIPAddress(int playerID); // player lag info BZF_API int bz_getPlayerLag( int playerId ); BZF_API int bz_getPlayerJitter( int playerId ); BZF_API float bz_getPlayerPacketloss( int playerId ); class BZF_API bz_BasePlayerRecord { public: bz_BasePlayerRecord() : version(1), playerID(-1), team(eNoTeam) , currentFlagID(-1) , lastUpdateTime(0.0) , lastKnownState() , spawned(false), verified(false), globalUser(false) , admin(false), op(false), canSpawn(false) , lag(0), jitter(0), packetLoss(0.0) , rank(0.0), wins(0), losses(0), teamKills(0) {} ~bz_BasePlayerRecord() {} void update(void) { bz_updatePlayerData(this); } // call to update with current data bool hasPerm(const char* perm) { return bz_hasPerm(playerID,perm); } bool grantPerm(const char* perm) { return bz_grantPerm(playerID,perm); } bool revokePerm(const char* perm) { return bz_revokePerm(playerID,perm); } const char *getCustomData ( const char* key); bool setCustomData ( const char* key, const char* data); int version; int playerID; bz_ApiString callsign; bz_eTeamType team; bz_ApiString ipAddress; int currentFlagID; bz_ApiString currentFlag; bz_APIStringList flagHistory; double lastUpdateTime; bz_PlayerUpdateState lastKnownState; bz_ApiString clientVersion; bool spawned; bool verified; bool globalUser; bz_ApiString bzID; bool admin; bool op; bool canSpawn; bz_APIStringList groups; int lag; int jitter; float packetLoss; float rank; int wins; int losses; int teamKills; }; class BZF_API bz_PlayerRecordV2 : public bz_BasePlayerRecord { public: bz_PlayerRecordV2(): bz_BasePlayerRecord() { version = 2; } bz_ApiString motto; }; // player info BZF_API bool bz_getPlayerHumanity( int playerId ); BZF_API bool bz_setPlayerOperator ( int playerId ); // team info BZF_API unsigned int bz_getTeamPlayerLimit ( bz_eTeamType team ); // player score BZF_API void bz_computePlayerScore( bool enabled ); BZF_API bool bz_computingPlayerScore( void ); BZF_API bool bz_setPlayerWins (int playerId, int wins); BZF_API bool bz_setPlayerLosses (int playerId, int losses); BZF_API bool bz_setPlayerTKs (int playerId, int tks); BZF_API float bz_getPlayerRank(int playerId); BZF_API int bz_getPlayerWins(int playerId); BZF_API int bz_getPlayerLosses(int playerId); BZF_API int bz_getPlayerTKs(int playerId); BZF_API bool bz_resetPlayerScore(int playerId); // groups API BZF_API bz_APIStringList* bz_getGroupList ( void ); BZF_API bz_APIStringList* bz_getGroupPerms ( const char* group ); BZF_API bool bz_groupAllowPerm ( const char* group, const char* perm ); // message API BZF_API bool bz_sendTextMessage (int from, int to, bz_eMessageType type, const char* message); BZF_API bool bz_sendTextMessage (int from, int to, const char* message); BZF_API bool bz_sendTextMessage (int from, bz_eTeamType to, bz_eMessageType type, const char* message); BZF_API bool bz_sendTextMessage (int from, bz_eTeamType to, const char* message); BZF_API bool bz_sendTextMessagef(int from, int to, bz_eMessageType type, const char* fmt, ...); BZF_API bool bz_sendTextMessagef(int from, int to, const char* fmt, ...); BZF_API bool bz_sendTextMessagef(int from, bz_eTeamType to, bz_eMessageType type, const char* fmt, ...); BZF_API bool bz_sendTextMessagef(int from, bz_eTeamType to, const char* fmt, ...); BZF_API bool bz_sentFetchResMessage ( int playerID, const char* URL ); // world weapons BZF_API bool bz_fireWorldWep ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt, bz_eTeamType shotTeam = eRogueTeam ); BZF_API int bz_fireWorldGM ( int targetPlayerID, float lifetime, float *pos, float tilt, float direction, float dt, bz_eTeamType shotTeam = eRogueTeam); typedef struct { int year; int month; int day; int hour; int minute; int second; int dayofweek; bool daylightSavings; } bz_Time; BZF_API void bz_getLocaltime(bz_Time *ts); BZF_API void bz_getUTCtime(bz_Time *ts); // BZDB API BZF_API double bz_getBZDBDouble ( const char* variable ); BZF_API bz_ApiString bz_getBZDBString( const char* variable ); BZF_API bool bz_getBZDBBool( const char* variable ); BZF_API int bz_getBZDBInt( const char* variable ); BZF_API int bz_getBZDBItemPerms( const char* variable ); BZF_API bool bz_getBZDBItemPesistent( const char* variable ); BZF_API bool bz_BZDBItemExists( const char* variable ); BZF_API bool bz_BZDBItemHasValue( const char* variable ); BZF_API bool bz_setBZDBDouble ( const char* variable, double val, int perms = 0, bool persistent = false ); BZF_API bool bz_setBZDBString( const char* variable, const char *val, int perms = 0, bool persistent = false ); BZF_API bool bz_setBZDBBool( const char* variable, bool val, int perms = 0, bool persistent = false ); BZF_API bool bz_setBZDBInt( const char* variable, int val, int perms = 0, bool persistent = false ); BZF_API bool bz_updateBZDBDouble(const char* variable, double val); BZF_API bool bz_updateBZDBString(const char* variable, const char *val); BZF_API bool bz_updateBZDBBool(const char* variable, bool val); BZF_API bool bz_updateBZDBInt(const char* variable, int val); BZF_API int bz_getBZDBVarList( bz_APIStringList *varList ); BZF_API void bz_resetBZDBVar( const char* variable ); BZF_API void bz_resetALLBZDBVars( void ); // admin BZF_API bool bz_kickUser ( int playerIndex, const char* reason, bool notify ); BZF_API bool bz_IPBanUser ( int playerIndex, const char* ip, int time, const char* reason ); BZF_API bool bz_IPUnbanUser ( const char* ip ); BZF_API bool bz_HostBanUser(const char* hostmask, const char* source, int duration, const char* reason); BZF_API bool bz_IPUnbanUser(const char* ip); BZF_API bool bz_IDUnbanUser(const char* bzID); BZF_API bool bz_HostUnbanUser(const char* hostmask); // ban lists typedef enum { eIPList, eIDList, eHostList }bz_eBanListType; BZF_API unsigned int bz_getBanListSize( bz_eBanListType listType ); BZF_API const char* bz_getBanItem ( bz_eBanListType listType, unsigned int item ); BZF_API const char* bz_getBanItemReason ( bz_eBanListType listType, unsigned int item ); BZF_API const char* bz_getBanItemSource ( bz_eBanListType listType, unsigned int item ); BZF_API double bz_getBanItemDuration ( bz_eBanListType listType, unsigned int item ); BZF_API bool bz_getBanItemIsFromMaster ( bz_eBanListType listType, unsigned int item ); BZF_API bz_APIStringList *bz_getReports( void ); // lagwarn BZF_API int bz_getLagWarn( void ); BZF_API bool bz_setLagWarn( int lagwarn ); // timelimit BZF_API bool bz_setTimeLimit( float timeLimit ); BZF_API float bz_getTimeLimit( void ); BZF_API bool bz_isTimeManualStart( void ); // countdown BZF_API bool bz_isCountDownActive( void ); BZF_API bool bz_isCountDownInProgress( void ); // polls BZF_API bool bz_pollVeto( void ); // help BZF_API bz_APIStringList *bz_getHelpTopics( void ); BZF_API bz_APIStringList *bz_getHelpTopic( std::string name ); // custom commands class bz_CustomSlashCommandHandler { public: virtual ~bz_CustomSlashCommandHandler(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *params ) = 0; }; BZF_API bool bz_registerCustomSlashCommand ( const char* command, bz_CustomSlashCommandHandler *handler ); BZF_API bool bz_removeCustomSlashCommand ( const char* command ); // spawning BZF_API bool bz_getStandardSpawn ( int playerID, float pos[3], float *rot ); // dying BZF_API bool bz_killPlayer ( int playerID, bool spawnOnBase, int killerID = -1, const char* flagID = NULL ); // flags BZF_API bool bz_givePlayerFlag ( int playerID, const char* flagType, bool force ); BZF_API bool bz_removePlayerFlag ( int playerID ); BZF_API void bz_resetFlags ( bool onlyUnused ); BZF_API unsigned int bz_getNumFlags( void ); BZF_API const bz_ApiString bz_getName( int flag ); BZF_API bool bz_resetFlag ( int flag ); BZF_API bool bz_moveFlag ( int flag, float pos[3] ); BZF_API int bz_flagPlayer ( int flag ); BZF_API bool bz_getFlagPosition ( int flag, float* pos ); // world typedef struct { bool driveThru; bool shootThru; }bz_WorldObjectOptions; typedef struct { bz_ApiString texture; bool useAlpha; bool useColorOnTexture; bool useSphereMap; int combineMode; }bz_MaterialTexture; class BZF_API bzAPITextureList { public: bzAPITextureList(); bzAPITextureList(const bzAPITextureList &r); ~bzAPITextureList(); void push_back ( bz_MaterialTexture &value ); bz_MaterialTexture get ( unsigned int i ); const bz_MaterialTexture& operator[] (unsigned int i) const; bzAPITextureList& operator = ( const bzAPITextureList& r ); unsigned int size ( void ); void clear ( void ); protected: class dataBlob; dataBlob *data; }; typedef struct bz_MaterialInfo { bz_ApiString name; bzAPITextureList textures; float ambient[4]; float diffuse[4]; float specular[4]; float emisive[4]; float shine; float alphaThresh; bool culling; bool sorting; }bz_MaterialInfo; // have bz make you a new material bz_MaterialInfo* bz_anewMaterial ( void ); // tell bz you are done with a material void bz_deleteMaterial ( bz_MaterialInfo *material ); BZF_API bool bz_addWorldBox ( float *pos, float rot, float* scale, bz_WorldObjectOptions options ); BZF_API bool bz_addWorldPyramid ( float *pos, float rot, float* scale, bool fliped, bz_WorldObjectOptions options ); BZF_API bool bz_addWorldBase( float *pos, float rot, float* scale, bz_eTeamType team, bz_WorldObjectOptions options ); BZF_API bool bz_addWorldTeleporter ( float *pos, float rot, float* scale, float border, bz_WorldObjectOptions options ); BZF_API bool bz_addWorldWaterLevel( float level, bz_MaterialInfo *material ); BZF_API bool bz_addWorldWeapon( const char* flagType, float *pos, float rot, float tilt, float initDelay, bz_APIFloatList &delays ); BZF_API bool bz_setWorldSize( float size, float wallHeight = -1.0 ); BZF_API void bz_setClientWorldDownloadURL( const char* URL ); BZF_API const bz_ApiString bz_getClientWorldDownloadURL( void ); BZF_API bool bz_saveWorldCacheFile( const char* file ); // world BZF_API unsigned int bz_getWorldCacheSize(void); BZF_API unsigned int bz_getWorldCacheData(unsigned char *data); // custom map objects typedef struct bz_CustomMapObjectInfo { bz_ApiString name; bz_APIStringList data; }bz_CustomMapObjectInfo; class bz_CustomMapObjectHandler { public: virtual ~bz_CustomMapObjectHandler(){}; virtual bool MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ) = 0; }; BZF_API bool bz_registerCustomMapObject ( const char* object, bz_CustomMapObjectHandler *handler ); BZF_API bool bz_removeCustomMapObject ( const char* object ); // public server info BZF_API bool bz_getPublic( void ); BZF_API bz_ApiString bz_getPublicAddr( void ); BZF_API bz_ApiString bz_getPublicDescription( void ); BZF_API int bz_getPublicPort(void); // plug-in management BZF_API int bz_getLoadedPlugins(bz_APIStringList *list); BZF_API bool bz_loadPlugin(const char* path, const char* params); BZF_API bool bz_unloadPlugin(const char* path); // bz_load path functions // only valid inside the load function for a plugin BZF_API const char* bz_pluginBinPath(void); // custom client sounds BZF_API bool bz_sendPlayCustomLocalSound ( int playerID, const char* soundName ); class bz_APIPluginHandler { public: virtual ~bz_APIPluginHandler(){}; virtual bool APIPlugin ( bz_ApiString plugin, bz_ApiString param ) = 0; }; // custom pluginHandler BZF_API bool bz_registerCustomPluginHandler ( const char* extension, bz_APIPluginHandler * handler ); BZF_API bool bz_removeCustomPluginHandler ( const char* extension, bz_APIPluginHandler * handler ); // team info BZF_API void bz_computeTeamScore( bool enabled ); BZF_API bool bz_computingTeamScore( void ); BZF_API int bz_getTeamCount (bz_eTeamType team ); BZF_API int bz_getTeamScore (bz_eTeamType team ); BZF_API int bz_getTeamWins (bz_eTeamType team ); BZF_API int bz_getTeamLosses (bz_eTeamType team ); BZF_API void bz_setTeamWins (bz_eTeamType team, int wins ); BZF_API void bz_setTeamLosses (bz_eTeamType team, int losses ); BZF_API void bz_resetTeamScore (bz_eTeamType team ); BZF_API void bz_resetTeamScores ( void ); // list server BZF_API void bz_updateListServer ( void ); // url API class bz_BaseURLHandler { public: bz_BaseURLHandler() { version = 1; } virtual ~bz_BaseURLHandler(){}; virtual void URLDone ( const char* URL, void * data, unsigned int size, bool complete ) = 0; virtual void URLTimeout ( const char* /*URL*/, int /*errorCode*/ ){}; virtual void URLError ( const char* /*URL*/, int /*errorCode*/, const char * /*errorString*/ ){}; int version; }; class bz_URLHandler_V2 : public bz_BaseURLHandler { public: bz_URLHandler_V2() : bz_BaseURLHandler() { version = 2; token = NULL;} void* token; }; BZF_API bool bz_addURLJob(const char* URL, bz_BaseURLHandler* handler = NULL, const char* postData = NULL); BZF_API bool bz_addURLJob(const char* URL, bz_URLHandler_V2* handler, void* token, const char* postData = NULL); BZF_API bool bz_removeURLJob(const char* URL); BZF_API size_t bz_addURLJobForID(const char* URL, bz_BaseURLHandler* handler = NULL, const char* postData = NULL); BZF_API bool bz_removeURLJobByID(size_t id); // inter plugin communication BZF_API bool bz_clipFieldExists ( const char *name ); BZF_API const char* bz_getclipFieldString ( const char *name ); BZF_API float bz_getclipFieldFloat ( const char *name ); BZF_API int bz_getclipFieldInt( const char *name ); BZF_API bool bz_setclipFieldString ( const char *name, const char* data ); BZF_API bool bz_setclipFieldFloat ( const char *name, float data ); BZF_API bool bz_setclipFieldInt( const char *name, int data ); class bz_ClipFieldNotifier { public: virtual ~bz_ClipFieldNotifier(){}; virtual void fieldChange ( const char* /*field*/) = 0; }; BZF_API bool bz_addClipFieldNotifier ( const char *name, bz_ClipFieldNotifier *cb ); BZF_API bool bz_removeClipFieldNotifier ( const char *name, bz_ClipFieldNotifier *cb ); // path checks BZF_API bz_ApiString bz_filterPath ( const char* path ); // Record-Replay BZF_API bool bz_saveRecBuf( const char * _filename, int seconds = 0); BZF_API bool bz_startRecBuf( void ); BZF_API bool bz_stopRecBuf( void ); // cheap Text Utils BZF_API const char *bz_format(const char* fmt, ...); BZF_API const char *bz_toupper(const char* val ); BZF_API const char *bz_tolower(const char* val ); BZF_API const char *bz_urlEncode(const char* val ); // game countdown BZF_API void bz_pauseCountdown ( const char *pausedBy ); BZF_API void bz_resumeCountdown ( const char *resumedBy ); BZF_API void bz_startCountdown ( int delay, float limit, const char *byWho ); // server control BZF_API void bz_shutdown(); BZF_API void bz_superkill(); BZF_API void bz_gameOver(int playerID, bz_eTeamType team = eNoTeam); BZF_API bool bz_restart ( void ); BZF_API void bz_reloadLocalBans(); BZF_API void bz_reloadMasterBans(); BZF_API void bz_reloadGroups(); BZF_API void bz_reloadUsers(); BZF_API void bz_reloadHelp(); // info about the world BZF_API bz_eTeamType bz_checkBaseAtPoint ( float pos[3] ); bz_eTeamType convertTeam ( int team ); int convertTeam( bz_eTeamType team ); // game type info BZF_API bz_eGameType bz_getGameType ( void ); typedef struct { int index; char type[2]; int status; int endurance; int owner; float position[3]; float launchPosition[3]; float landingPosition[3]; float flightTime; float flightEnd; float initialVelocity; } bz_FlagUpdateRecord; typedef struct { float rank; int wins; int losses; int tks; } bz_ScoreRecord; typedef struct { int id; int size; int wins; int losses; } bz_TeamInfoRecord; typedef enum { eRejectBadRequest, eRejectBadTeam, eRejectBadType, eRejectUNUSED, eRejectTeamFull, eRejectServerFull, eRejectBadCallsign, eRejectRepeatCallsign, eRejectRejoinWaitTime, eRejectIPBanned, eRejectHostBanned, eRejectIDBanned } bz_eRejectCodes; typedef struct { int player; int handicap; } bz_HandicapUpdateRecord; typedef enum { eGotKilled, eGotShot, eGotRunOver, eGotCaptured, eGenocideEffect, eSelfDestruct, eWaterDeath, ePhysicsDriverDeath } bz_ePlayerDeathReason; class BZF_API bz_ServerSidePlayerHandler { public: bz_ServerSidePlayerHandler(); virtual ~bz_ServerSidePlayerHandler() {} int getPlayerID ( void ){return playerID;} void update ( void ); // you must call setPlayerData when this is called. virtual void added(int player) = 0; // it is required that the bot provide this method // lower level events for various things that happen in the game virtual void removed(void) {} virtual void playerAdded(int player); virtual void playerRemoved(int player); virtual void playerSpawned(int player, const float pos[3], float rot); virtual void textMessage(int dest, int source, const char *text); virtual void playerKilled(int victimIndex, int killerIndex, bz_ePlayerDeathReason reason, int shotIndex, const char *flagType, int phydrv); virtual void scoreLimitReached(int player, bz_eTeamType team); virtual void flagCaptured(int player, bz_eTeamType team); virtual void playerStateUpdate(int player, bz_PlayerUpdateState *playerState, double timestamp); // implement when server side scoring is in // virtual void playerScoreUpdate(int player, float rank, int wins, int losses, int TKs); // implement when server side scoring is in virtual void shotFired(int player, unsigned short shotID); virtual void shotEnded(int player, unsigned short shotID, unsigned short reason); virtual void playerTeleported(int player, bz_PlayerUpdateState *currentState, bz_PlayerUpdateState *lastState); // higher level functions for events that happen to the bot typedef enum { eWorldDeath, eServerDeath, eCaptureDeath, eOtherDeath }SmiteReason; void rejected ( bz_eRejectCodes, const char* /*reason*/){}; // the bot was rejectd for some reason virtual void spawned(void); // the bot has spawned virtual void died ( int killer ); // the bot has died from gameplay virtual void smote ( SmiteReason reason = eOtherDeath ); // the bot has died from some other manner // virtual void collide ( bz_APISolidWorldObject_V1* /*object*/, float* /*pos*/ ){} // the bot ran into an object // give the bot time to do it's processing virtual bool think(void); // return true to kill and delete the bot; void setPlayerID ( int id ){playerID = id;} // actions to make void setPlayerData(const char *callsign, const char *token, const char *clientVersion, bz_eTeamType team); void joinGame(void); void respawn(void); void getCurrentState(bz_PlayerUpdateState *state); void sendChatMessage(const char* text, int targetPlayer = BZ_ALLUSERS, bz_eMessageType type = eChatMessage); void sendTeamChatMessage(const char *text, bz_eTeamType targetTeam, bz_eMessageType type = eChatMessage); void dropFlag( void ); void setMovement(float forward, float turn); bool fireShot(void); bool jump(void); // state info bool canJump(void); bool canShoot(void); bool canMove(void); bool falling (void); void getPosition ( float *p ); void getVelocity ( float *v ); float getFacing ( void ); float getMaxLinSpeed ( void ); float getMaxRotSpeed ( void ); // state actions void setAutoSpawn ( bool s = true ){autoSpawn = s;} int playerID; private: float input[2]; bool wantToJump; bool autoSpawn; public: class BZF_API UpdateInfo { public: float pos[3]; float vec[3]; // FIXME -- vel for velocity? float rot; // FIXME -- radians or degrees? float rotVel; double time; UpdateInfo() : rot(0), rotVel(0), time(0) { for (int i = 0; i < 3; i++) pos[i] = vec[0] =0; } UpdateInfo& operator = ( const UpdateInfo& u ) { memcpy(pos,u.pos,sizeof(float)*3); memcpy(vec,u.vec,sizeof(float)*3); rot = u.rot; rotVel = u.rotVel; time = u.time; return *this; } float getDelta( const UpdateInfo & state); }; private: UpdateInfo lastUpdate; UpdateInfo currentState; int flaps; bool alive; }; // *** NOTE *** support for server side players in incomplete. // there WILL be crashes if you add one. // this message will be removed when the code is complete. BZF_API int bz_addServerSidePlayer(bz_ServerSidePlayerHandler *handler); BZF_API bool bz_removeServerSidePlayer(int playerID, bz_ServerSidePlayerHandler *handler); // you have to pass in the handler to ensure you "own" the player // no ShotType support in 2.4 (yet?). still accept the ShotType parameter for compatibility. typedef int bz_eShotType; // Note: there is NO bz_UnregisterCustomFlag, 'cause that would jack up connected clients. // If you really need to unregister a flag, shut down the server. BZF_API bool bz_RegisterCustomFlag(const char* abbr, const char* name, const char* helpString, bz_eShotType shotType, bz_eFlagQuality quality); // utility BZF_API const char* bz_MD5(const char * str); BZF_API const char* bz_MD5(const void * data, size_t size); BZF_API const char* bz_getServerVersion(void); BZF_API const char* bz_getProtocolVersion(void); BZF_API bool bz_ChatFiltered(void); BZF_API bool bz_CallsignsFiltered(void); BZF_API void bz_SetFiltering(bool chat, bool callsigns); BZF_API void bz_LoadFilterDefFile(const char* fileName); BZF_API void bz_AddFilterItem(const char* word, const char* expression = NULL); BZF_API void bz_ClearFilter(void); #endif //_BZFS_API_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bzfsHTTPAPI.h000066400000000000000000000145371200563112200172430ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // a base class for plugins that want to do HTTP #ifndef _BZFS_HTTP_H_ #define _PLUGIN_HTTP_H_ #include "bzfsAPI.h" class BZF_API bzhttp_SessionData { public: public: bzhttp_SessionData(); ~bzhttp_SessionData(); unsigned int SessionID; const char* GetPrivateItem ( const char* name ); void SetPrivateItem ( const char * name, const char* value ); void ClearPrivateItem ( const char * name ); void FlushPrivateItems ( void ); const char* GetGlobalItem ( const char* name ); void SetGlobalItem ( const char * name, const char* value ); void ClearGlobalItem ( const char * name ); void *pimple; }; typedef enum { eHTTPUnknown = 0, eHTTPGet, eHTTPHead, eHTTPPost, eHTTPPut, eHTTPDelete, eHTTPTrace, eHTTPOptions, eHTTPConnect }bzhttp_eRequestType; class BZF_API bzhttp_Request { public: bzhttp_Request(); virtual ~bzhttp_Request(); bzhttp_eRequestType RequestType; bz_ApiString URL; bz_ApiString Resource; bz_ApiString RequesterIP; bz_ApiString RequesterHost; bz_ApiString BZID; bz_ApiString BZIDCallsign; bz_APIStringList BZIDGroups; virtual bool UserHasPerm ( const char* perm ) const; bz_ApiString Body; virtual void AddHeader ( const char* name, const char* value); virtual const char* GetHeader ( const char* name) const; virtual const char* GetHeader ( size_t index ) const; virtual size_t GetHeaderCount ()const; virtual void AddCookie ( const char* name, const char* value); virtual const char* GetCookie ( const char* name) const; virtual const char* GetCookie ( size_t index ) const; virtual size_t GetCookieCount () const; virtual void AddParamater ( const char* name, const char* value); virtual const char* GetParamater ( const char* name) const; virtual const char* GetParamater ( size_t index ) const; virtual size_t GetParamaterCount () const; virtual bool InBZIDGroup (const char *) const {return false;} bzhttp_SessionData *Session; int Version; protected: void *pimple; }; typedef enum { e200OK, e301Redirect, e302Found, e401Unauthorized, e403Forbiden, e404NotFound, e418IAmATeapot, e500ServerError } bzhttp_eReturnCode; typedef enum { eText, eOctetStream, eBinary, eHTML, eCSS, eXML, eJSON, eOther } bzhttp_eDocumentType; class BZF_API bzhttp_Responce { public: bzhttp_Responce(); virtual ~bzhttp_Responce(); bzhttp_eReturnCode ReturnCode; bzhttp_eDocumentType DocumentType; bool ForceNoCache; bz_ApiString RedirectLocation; bz_ApiString MimeType; bz_ApiString MD5Hash; bz_ApiString CookieDomain; bz_ApiString CookiePath; virtual void AddHeader ( const char* name, const char* value); virtual void AddCookies ( const char* name, const char* value); virtual void AddBodyData ( const char* value); virtual void AddBodyData ( const void* value, size_t size); int Version; void *pimple; }; typedef enum { eNoPage = 0, eWaitForIt, ePageDone }bzhttp_ePageGenStatus; typedef enum { eNoAuth = 0, eHTTPBasic, eHTTPOther, eBZID }bzhttp_eAuthenticationMethod; typedef enum { eAuthFail = 0, eAuthOK, eNotAuthedYet }bzhttp_eAuthenticationStatus; class BZF_API bzhttp_VDir { public: bzhttp_VDir(); virtual ~bzhttp_VDir(); virtual const char* VDirName() = 0; virtual const char* VDirDescription(){return NULL;} virtual bzhttp_ePageGenStatus GeneratePage ( const bzhttp_Request& request, bzhttp_Responce &responce ) = 0; virtual bool SupportPut ( void ){ return false;} virtual bool AllowResourceDownloads ( void ){ return false; } bz_ApiString BaseURL; bz_APIStringList ResourceDirs; bzhttp_eAuthenticationMethod RequiredAuthentiction; bz_ApiString OtherAuthenicationMethod; bz_ApiString HTTPAuthenicationRelalm; // server groups are automatically included bz_APIStringList BZIDAuthenicationGroups; bool CacheAuthentication; virtual bzhttp_eAuthenticationStatus AuthenticateHTTPUser ( const char* /*ipAddress*/, const char* /*user*/, const char* /*password*/, const bzhttp_Request& /*request*/ ){ return eAuthFail; } virtual bool GenerateNoAuthPage ( const bzhttp_Request& /*request*/, bzhttp_Responce &/*responce*/ ) {return false;} // data sizes int MaxRequestSize; int MaxRequestBody; void AddMimeType(const char* extension, const char* mime ); void AddStandardTypes (); void* pimple; }; BZF_API bool bzhttp_RegisterVDir (bz_Plugin* plugin, bzhttp_VDir *vdir ); BZF_API bool bzhttp_RemoveVDir (bz_Plugin* plugin, bzhttp_VDir *vdir ); BZF_API bool bzhttp_RemoveAllVdirs (bz_Plugin* plugin ); // templates class BZF_API bzhttp_TemplateMetaData { public: bzhttp_TemplateMetaData(); bzhttp_TemplateMetaData( const bzhttp_TemplateMetaData& /*r*/); virtual ~bzhttp_TemplateMetaData(); const char * Get ( const char* key, unsigned int index = 0 ); unsigned int Count ( const char* key ); void Add ( const char* key, const char* val ); protected: void *pimple; }; class BZF_API bzhttp_TemplateCallback { public: virtual ~bzhttp_TemplateCallback() {}; virtual const char* GetTemplateKey(const char* /* key */) {return "";} virtual bool GetTemplateLoop(const char* /* key */, const char* /*param*/) { return false; } virtual bool GetTemplateIF(const char* /* key */, const char* /*param*/) { return false; } bzhttp_TemplateMetaData* MetaData; }; BZF_API bz_ApiString bzhttp_RenderTemplate ( const char* file, bzhttp_TemplateCallback* callback, const char* pathSet = NULL ); BZF_API bz_ApiString bzhttp_RenderTemplateFromText ( const char* text, bzhttp_TemplateCallback* callback, const char* pathSet = NULL ); BZF_API bzhttp_TemplateMetaData bzhttp_GetTemplateMetaData( const char* file ); // path utilities BZF_API bool bzhttp_AddSearchPath ( const char* pathSet, const char* path ); BZF_API const char* bzhttp_FindFile ( const char* pathSet, const char* filename ); #endif //_BZFS_HTTP_H_ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/bzglob.h000066400000000000000000000014551200563112200165170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZ_GLOB_H #define BZ_GLOB_H #include extern bool glob_match(const char* pattern, const char* string); extern bool glob_match(const std::string& pattern, const std::string& string); #endif /* * Local Variables: *** * mode:C *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/bzregex.h000066400000000000000000000100761200563112200167050ustar00rootroot00000000000000/* $NetBSD: regex.h,v 1.4 1994/10/26 00:56:14 cgd Exp $ */ /*- * Copyright (c) 1992 Henry Spencer. * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer of the University of Toronto. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)regex.h 8.1 (Berkeley) 6/2/93 */ #ifndef _REGEX_H_ #define _REGEX_H_ /* From #include */ #ifndef __BEGIN_DECLS # ifdef __cplusplus # define __BEGIN_DECLS extern "C" { # define __END_DECLS } # else # define __BEGIN_DECLS # define __END_DECLS # endif #endif #include /* types */ /* ugly hack to make non-MS windows compilers work */ #if defined(_WIN32) && !defined(_MSC_VER) && !defined(_OFF_T_) #define _OFF_T_ typedef long off_t; #endif typedef off_t regoff_t; struct regex_t { int re_magic; size_t re_nsub; /* number of parenthesized subexpressions */ const char *re_endp; /* end pointer for REG_PEND */ struct re_guts *re_g; /* none of your business :-) */ }; typedef struct regex_t regex_t; struct regmatch_t { regoff_t rm_so; /* start of match */ regoff_t rm_eo; /* end of match */ }; typedef struct regmatch_t regmatch_t; /* regcomp() flags */ #define REG_BASIC 0000 #define REG_EXTENDED 0001 #define REG_ICASE 0002 #define REG_NOSUB 0004 #define REG_NEWLINE 0010 #define REG_NOSPEC 0020 #define REG_PEND 0040 #define REG_DUMP 0200 /* regerror() flags */ #define REG_NOMATCH 1 #define REG_BADPAT 2 #define REG_ECOLLATE 3 #define REG_ECTYPE 4 #define REG_EESCAPE 5 #define REG_ESUBREG 6 #define REG_EBRACK 7 #define REG_EPAREN 8 #define REG_EBRACE 9 #define REG_BADBR 10 #define REG_ERANGE 11 #define REG_ESPACE 12 #define REG_BADRPT 13 #define REG_EMPTY 14 #define REG_ASSERT 15 #define REG_INVARG 16 #define REG_ATOI 255 /* convert name to number (!) */ #define REG_ITOA 0400 /* convert number to name (!) */ /* regexec() flags */ #define REG_NOTBOL 00001 #define REG_NOTEOL 00002 #define REG_STARTEND 00004 #define REG_TRACE 00400 /* tracing of execution */ #define REG_LARGE 01000 /* force large representation */ #define REG_BACKR 02000 /* force use of backref code */ __BEGIN_DECLS int regcomp (regex_t *, const char *, int); size_t regerror (int, const regex_t *, char *, size_t); int regexec (const regex_t *, const char *, size_t, regmatch_t [], int); void regfree (regex_t *); __END_DECLS #endif /* !_REGEX_H_ */ bzflag-2.4.2+ds1/include/bzsignal.h000066400000000000000000000016451200563112200170520ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #if !defined(__sgi) /* some platforms don't have a SIG_PF type. */ #ifndef SIG_PF typedef void (*SIG_PF)(int); #endif #endif /* defined(__sgi) */ #ifdef __cplusplus extern "C" { #endif SIG_PF bzSignal(int signo, SIG_PF func); #ifdef __cplusplus } #endif /* * Local Variables: *** * mode:C++ *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/cURLManager.h000066400000000000000000000060351200563112200173370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CURL_MANAGER_H #define CURL_MANAGER_H // bzflag common header #include "common.h" #include "network.h" // system headers #include #include #include #include class cURLManager { public: cURLManager(); virtual ~cURLManager(); enum timeCondition { None, ModifiedSince }; void addHandle(); void removeHandle(); void setTimeout(long timeout); void setNoBody(); void setGetMode(); void setHTTPPostMode(); void setPostMode(std::string postData); void setRequestFileTime(bool request); void setURL(const std::string &url); void setURLwithNonce(const std::string &url); void setProgressFunction(curl_progress_callback func, void* data); void setTimeCondition(timeCondition condition, time_t &t); void setInterface(const std::string &interfaceIP); void setUserAgent(const std::string &userAgent); void setDNSCachingTime(long time); void addFormData(const char *key, const char *value); bool getFileTime(time_t &t); bool getFileSize(double &size); virtual void collectData(char *ptr, int len); virtual void finalization(char *data, unsigned int length, bool good); static int fdset(fd_set &read, fd_set &write); static bool perform(); void performWait(); protected: void *theData; unsigned int theLen; private: void infoComplete(CURLcode result); static bool inited; static bool justCalled; CURL *easyHandle; static CURLM *multiHandle; static char errorBuffer[CURL_ERROR_SIZE]; bool added; std::string usedUrl; std::string interfaceIP; std::string userAgent; std::string postData; struct curl_httppost* formPost; struct curl_httppost* formLast; static void setup(); static size_t writeFunction(void *ptr, size_t size, size_t nmemb, void *stream); static std::map cURLMap; }; typedef enum { eImage, eSound, eFont, eFile, eUnknown }teResourceType; typedef struct { teResourceType resType; std::string URL; std::string filePath; std::string fileName; }trResourceItem; class ResourceGetter : cURLManager { public: ResourceGetter(); virtual ~ResourceGetter(); void addResource ( trResourceItem &item ); void flush ( void ); virtual void finalization(char *data, unsigned int length, bool good); protected: bool itemExists ( trResourceItem &item ); void getResource ( void ); std::vector resources; bool doingStuff; }; #endif // CURL_MANAGER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/common.h000066400000000000000000000163221200563112200165270ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * common definitions */ #ifndef BZF_COMMON_H #define BZF_COMMON_H /* this should always be the very FIRST header */ #ifdef _DEVCPP /* the Dev-C++ build is acting very stubborn; this is (hopefully) -temporary- */ # include_next "config.h" #else # include "config.h" #endif #ifdef _WIN32 # undef NOMINMAX # define NOMINMAX 1 # include "win32.h" #endif #include #include /* needed for bzfrand */ #include #ifdef __cplusplus # include #endif extern int debugLevel; /* Provide a means to conveniently test the version of the GNU * compiler. Use it like this: * * #if GCC_PREREQ(2,8) * ... code requiring gcc 2.8 or later ... * #endif * * WARNING: THIS MACRO IS CONSIDERED PRIVATE AND SHOULD NOT BE USED * OUTSIDE OF THIS HEADER FILE. DO NOT RELY ON IT. */ #ifndef GCC_PREREQ # if defined __GNUC__ # define GCC_PREREQ(major, minor) __GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) # else # define GCC_PREREQ(major, minor) 0 # endif #else # warning "GCC_PREREQ is already defined. See the common.h header." #endif /** * UNUSED provides a common mechanism for declaring unused parameters. * Use it like this: * * int * my_function(int argc, char **UNUSED(argv)) * { * ... * } * */ #ifndef UNUSED # if GCC_PREREQ(2, 5) /* GCC-style */ # define UNUSED(parameter) (parameter) __attribute__((unused)) # else /* MSVC/C++ */ # ifdef __cplusplus # if defined(NDEBUG) # define UNUSED(parameter) /* parameter */ # else /* some of them are asserted */ # define UNUSED(parameter) (parameter) # endif # else # if defined(_MSC_VER) /* disable reporting an "unreferenced formal parameter" */ # pragma warning( disable : 4100 ) # endif # define UNUSED(parameter) (parameter) # endif # endif #else # undef UNUSED # define UNUSED(parameter) (parameter) # warning "UNUSED was previously defined. Parameter declaration behavior is unknown, see common.h" #endif /* near zero by some epsilon convenience define since relying on * the floating point unit for proper equivalence is not safe */ #define NEAR_ZERO(_value,_epsilon) ( ((_value) > -_epsilon) && ((_value) < _epsilon) ) /* (radians <--> degrees) conversion values */ #define DEG2RAD 0.0174532925199432957692369076848861271344287189 #define RAD2DEG 57.29577951308232087679815481410517033240547247 #define DEG2RADf ((float)DEG2RAD) #define RAD2DEGf ((float)RAD2DEG) /* seven places of precision is pretty safe, so something less precise */ #ifdef FLT_EPSILON # define ZERO_TOLERANCE FLT_EPSILON #else # define ZERO_TOLERANCE 1.0e-06f #endif /* Might we be BSDish? sys/param.h has BSD defined if so */ #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE__STRICMP # define strcasecmp _stricmp #endif #ifdef HAVE__STRNICMP # define strncasecmp _strnicmp #endif #ifndef HAVE_VSNPRINTF # ifdef HAVE__VSNPRINTF # define vsnprintf _vsnprintf # else # define vsnprintf(buf, size, fmt, list) vsprintf(buf, fmt, list) # endif #endif /* some platforms don't have float versions of the math library */ #ifndef HAVE_ASINF # define asinf (float)asin #endif #ifndef HAVE_ATAN2F # define atan2f (float)atan2 #endif #ifndef HAVE_ATANF # define atanf (float)atan #endif #ifndef HAVE_COSF # define cosf (float)cos #endif #ifndef HAVE_EXPF # define expf (float)exp #endif #ifndef HAVE_FABSF # define fabsf (float)fabs #endif #ifndef HAVE_FLOORF # define floorf (float)floor #endif #ifndef HAVE_FMODF # define fmodf (float)fmod #endif #ifndef HAVE_HYPOTF # define hypotf (float)hypot #endif #ifndef HAVE_LOGF # define logf (float)log #endif #ifndef HAVE_LOG10F # define log10f (float)log10 #endif #ifndef HAVE_POWF # define powf (float)pow #endif #ifndef HAVE_SINF # define sinf (float)sin #endif #ifndef HAVE_SQRTF # define sqrtf (float)sqrt #endif #ifndef HAVE_TANF # define tanf (float)tan #endif /* random number stuff */ #define bzfrand() ((double)rand() / ((double)RAND_MAX + 1.0)) #define bzfsrand(_s) srand(_s) #ifndef __BEOS__ # ifdef HAVE_VALUES_H # include # endif #else # include /* BeOS: FIXME */ # define MAXSHORT SHORT_MAX # define MAXINT INT_MAX # define MAXLONG LONG_MAX #endif /* __BEOS__ */ #ifdef HAVE_SYS_TYPES_H # include #endif /* need some integer types */ #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #else # if defined(__linux) || (defined(__sgi) && !defined(__INTTYPES_MAJOR)) typedef u_int16_t uint16_t; typedef u_int32_t uint32_t; # endif # if defined(sun) typedef signed short int16_t; typedef ushort_t uint16_t; typedef signed int int32_t; typedef uint_t uint32_t; # endif typedef unsigned char uint8_t; #endif /* missing constants */ #ifndef MAXFLOAT # define MAXFLOAT 3.402823466e+38f #endif #ifndef M_PI # define M_PI 3.14159265358979323846f #endif #ifndef M_SQRT1_2 # define M_SQRT1_2 0.70710678118654752440f #endif #ifdef __BEOS__ # ifndef setenv # define setenv(a,b,c) # endif # ifndef putenv # define putenv(a) # endif #endif /* __BEOS__ */ #ifdef countof # undef countof #endif #define countof(__x) (sizeof(__x) / sizeof(__x[0])) #ifdef HAVE_STD__ISNAN # ifdef isnan # undef isnan # endif # define isnan std::isnan #elif defined(HAVE__ISNAN) # ifdef isnan # undef isnan # endif # define isnan _isnan #else # ifndef HAVE_ISNAN # ifdef __cplusplus # ifdef isnan # undef isnan # endif template inline int isnan(Tp f) { return (f!=f); } # else # define isnan(f) ((f) != (f)) # endif /* __cplusplus */ # endif /* HAVE_ISNAN */ #endif /* HAVE_STD__ISNAN */ #ifndef HAVE_STD__MAX # ifdef __cplusplus # ifdef max # undef max # endif namespace std { template inline const comparable& max(const comparable& a, const comparable& b) { return a < b ? b : a; } } # else # ifdef max # undef max # endif # define max(a,b) a < b ? b : a # endif /* __cplusplus */ #endif /* HAVE_STD__MAX */ #ifndef HAVE_STD__MIN # ifdef __cpluscplus # ifdef min # undef min # endif namespace std { template inline const comparable& min(const comparable& a, const comparable& b) { return b < a ? b : a; } } # else # ifdef min # undef min # endif # define min(a,b) b < a ? b : a # endif /* __cplusplus */ #endif /* HAVE_STD_MIN */ #ifdef BUILD_REGEX # include "bzregex.h" #elif defined(HAVE_REGEX_H) # include #else # define regex_t void #endif /* BUILD_REGEX */ #endif /* BZF_COMMON_H */ /* Local Variables: *** * mode: C++ *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/config.h.in000066400000000000000000000241451200563112200171130ustar00rootroot00000000000000/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Use new GL Kit for BeOS */ #undef BEOS_USE_GL2 /* Define to 1 if your DirectInput headers and libraries are broken or mismatched. */ #undef BROKEN_DINPUT /* Build the included ares lookup library */ #undef BUILD_ARES /* Build the included curl library */ #undef BUILD_CURL /* Build the included regular expression library */ #undef BUILD_REGEX /* Build the included zlib compression library */ #undef BUILD_ZLIB /* Data file directory */ #undef BZFLAG_DATA /* BZFlag System Environment */ #undef BZ_BUILD_OS /* Enable plugins */ #undef BZ_PLUGINS /* Debugging enabled */ #undef DEBUG /* Debug Rendering */ #undef DEBUG_RENDERING /* hosts is in /etc/inet/ */ #undef ETC_INET /* Half rate Audio */ #undef HALF_RATE_AUDIO /* libm includes acosf */ #undef HAVE_ACOSF /* Define if libcares includes ares_library_init. */ #undef HAVE_ARES_LIBRARY_INIT /* libm includes asinf */ #undef HAVE_ASINF /* libm includes atan2f */ #undef HAVE_ATAN2F /* libm includes atanf */ #undef HAVE_ATANF /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file. */ #undef HAVE_BSTRING_H /* libm includes ceilf */ #undef HAVE_CEILF /* Define to 1 if you have the `CGLGetCurrentContext' function. */ #undef HAVE_CGLGETCURRENTCONTEXT /* Define to 1 if you have the header file. */ #undef HAVE_CMATH /* libm includes cosf */ #undef HAVE_COSF /* Define to 1 if you have the header file. */ #undef HAVE_CSTDIO /* Define to 1 if you have the header file. */ #undef HAVE_CSTDLIB /* Define to 1 if you have the header file. */ #undef HAVE_CSTRING /* Use the header file curses.h */ #undef HAVE_CURSES_H /* tolower and toupper are not functions */ #undef HAVE_DEFINED_TOLOWER /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_DSOUND_H /* libm includes expf */ #undef HAVE_EXPF /* libm includes fabsf */ #undef HAVE_FABSF /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* we appear to have working support for directional force feedback effects */ #undef HAVE_FF_EFFECT_DIRECTIONAL /* we appear to have working support for rumble force feedback effects */ #undef HAVE_FF_EFFECT_RUMBLE /* libm includes floorf */ #undef HAVE_FLOORF /* libm includes fmodf */ #undef HAVE_FMODF /* Using GLEW */ #undef HAVE_GLEW /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR /* libm includes hypotf */ #undef HAVE_HYPOTF /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if `isnan' is available */ #undef HAVE_ISNAN /* Define to 1 if you have the `bind' library (-lbind). */ #undef HAVE_LIBBIND /* Define to 1 if you have a functional curl library. */ #undef HAVE_LIBCURL /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define to 1 if you have the `winmm' library (-lwinmm). */ #undef HAVE_LIBWINMM /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ #undef HAVE_LIBWS2_32 /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_INPUT_H /* libm includes log10f */ #undef HAVE_LOG10F /* libm includes logf */ #undef HAVE_LOGF /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_MINIUPNPC_MINIUPNPC_H /* Use the header file ncurses.h */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* libm includes powf */ #undef HAVE_POWF /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H /* posix-compliant threading is available */ #undef HAVE_PTHREADS /* Define to 1 if you have the '' header file */ #undef HAVE_REGEX_H /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `sched_setaffinity' function. */ #undef HAVE_SCHED_SETAFFINITY /* Using SDL */ #undef HAVE_SDL /* Define to 1 if you have the header file. */ #undef HAVE_SDL_SDL_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* libm includes sinf */ #undef HAVE_SINF /* Define to 1 if you have the `Sleep' function. */ #undef HAVE_SLEEP /* Define to 1 if you have the `snooze' function. */ #undef HAVE_SNOOZE /* if socklen_t is defined, make note of it */ #undef HAVE_SOCKLEN_T /* libm includes sqrtf */ #undef HAVE_SQRTF /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have a conforming std::count, otherwise old version of count template is assumed */ #undef HAVE_STD__COUNT /* Define to 1 if `std::isnan' is available */ #undef HAVE_STD__ISNAN /* Define to 1 if you have a conforming std::max */ #undef HAVE_STD__MAX /* Define to 1 if you have a conforming std::min */ #undef HAVE_STD__MIN /* Define to 1 if the system has the type `std::wstring'. */ #undef HAVE_STD__WSTRING /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* libm includes tanf */ #undef HAVE_TANF /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `usleep' function. */ #undef HAVE_USLEEP /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the `WaitForSingleObject' function. */ #undef HAVE_WAITFORSINGLEOBJECT /* Define to 1 if you have the `wglGetCurrentContext' function. */ #undef HAVE_WGLGETCURRENTCONTEXT /* Define to 1 if you have the header file. */ #undef HAVE_X11_EXTENSIONS_XF86VMODE_H /* Use the header file xcurses.h */ #undef HAVE_XCURSES_H /* Define to 1 if you have the `_stricmp' function. */ #undef HAVE__STRICMP /* Define to 1 if you have the `_strnicmp' function. */ #undef HAVE__STRNICMP /* Define to 1 if you have the `_vsnprintf' function. */ #undef HAVE__VSNPRINTF /* Defined if libcurl supports AsynchDNS */ #undef LIBCURL_FEATURE_ASYNCHDNS /* Defined if libcurl supports IDN */ #undef LIBCURL_FEATURE_IDN /* Defined if libcurl supports IPv6 */ #undef LIBCURL_FEATURE_IPV6 /* Defined if libcurl supports KRB4 */ #undef LIBCURL_FEATURE_KRB4 /* Defined if libcurl supports libz */ #undef LIBCURL_FEATURE_LIBZ /* Defined if libcurl supports NTLM */ #undef LIBCURL_FEATURE_NTLM /* Defined if libcurl supports SSL */ #undef LIBCURL_FEATURE_SSL /* Defined if libcurl supports SSPI */ #undef LIBCURL_FEATURE_SSPI /* Defined if libcurl supports DICT */ #undef LIBCURL_PROTOCOL_DICT /* Defined if libcurl supports FILE */ #undef LIBCURL_PROTOCOL_FILE /* Defined if libcurl supports FTP */ #undef LIBCURL_PROTOCOL_FTP /* Defined if libcurl supports FTPS */ #undef LIBCURL_PROTOCOL_FTPS /* Defined if libcurl supports HTTP */ #undef LIBCURL_PROTOCOL_HTTP /* Defined if libcurl supports HTTPS */ #undef LIBCURL_PROTOCOL_HTTPS /* Defined if libcurl supports IMAP */ #undef LIBCURL_PROTOCOL_IMAP /* Defined if libcurl supports LDAP */ #undef LIBCURL_PROTOCOL_LDAP /* Defined if libcurl supports POP3 */ #undef LIBCURL_PROTOCOL_POP3 /* Defined if libcurl supports RTSP */ #undef LIBCURL_PROTOCOL_RTSP /* Defined if libcurl supports SMTP */ #undef LIBCURL_PROTOCOL_SMTP /* Defined if libcurl supports TELNET */ #undef LIBCURL_PROTOCOL_TELNET /* Defined if libcurl supports TFTP */ #undef LIBCURL_PROTOCOL_TFTP /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Debugging disabled */ #undef NDEBUG /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Enabling Robots */ #undef ROBOT /* sizeof double */ #undef SIZEOF_DOUBLE /* sizeof float */ #undef SIZEOF_FLOAT /* sizeof int */ #undef SIZEOF_INT /* sizeof long double */ #undef SIZEOF_LONG_DOUBLE /* sizeof long int */ #undef SIZEOF_LONG_INT /* sizeof long long int */ #undef SIZEOF_LONG_LONG_INT /* sizeof short int */ #undef SIZEOF_SHORT_INT /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Sun OpenGL No Macro Vertex */ #undef SUN_OGL_NO_VERTEX_MACROS /* Time Bomb expiration */ #undef TIME_BOMB /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* XFree86 Video Mode Extension */ #undef XF86VIDMODE_EXT /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Enable reentrant code */ #undef _REENTRANT /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define curl_free() as free() if our version of curl lacks curl_free. */ #undef curl_free /* type to use in place of socklen_t if not defined */ #undef socklen_t bzflag-2.4.2+ds1/include/global.h000066400000000000000000000062551200563112200165030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_GLOBAL_H #define BZF_GLOBAL_H /* * Global constants */ #include "common.h" /* system headers */ #include /* common headers */ #include "StateDatabase.h" // values affecting struct and class layout const int CallSignLen = 32; // including terminating NUL const int PasswordLen = 32; // including terminating NUL const int MottoLen = 128; // including terminating NUL const int TokenLen = 22; // opaque string (now int(10)) and terminating NUL const int VersionLen = 60; // including terminating NUL const int MessageLen = 128; // including terminating NUL // types of things we can be enum PlayerType { TankPlayer, ComputerPlayer }; // types of text messages enum MessageType { ChatMessage, ActionMessage }; // team info const int NumTeams = 8; const int CtfTeams = 5; enum TeamColor { AutomaticTeam = -2, NoTeam = -1, RogueTeam = 0, RedTeam = 1, GreenTeam = 2, BlueTeam = 3, PurpleTeam = 4, ObserverTeam = 5, RabbitTeam = 6, HunterTeam = 7 }; #ifdef ROBOT // robots #define MAX_ROBOTS 100 #else #define MAX_ROBOTS 0 #endif // epsilon and very far for ray intersections const float Epsilon = ZERO_TOLERANCE; // arbitrary const float Infinity = MAXFLOAT; // arbitrary #define DEFAULT_WORLD 800 // readout stuff const int MaxMessages = 20; // msg. history length const int MinX = 256; const int MinY = 192; const int NoMotionSize = 10; // no motion zone size const int MaxMotionSize = 37; // motion zone size // game types enum GameType { TeamFFA, // normal teamed FFA ClassicCTF, // your normal CTF OpenFFA, // teamless FFA RabbitChase // hunt the rabbit mode }; // game styles enum GameOptions { SuperFlagGameStyle = 0x0002, // superflags allowed JumpingGameStyle = 0x0008, // jumping allowed InertiaGameStyle = 0x0010, // momentum for all RicochetGameStyle = 0x0020, // all shots ricochet ShakableGameStyle = 0x0040, // can drop bad flags AntidoteGameStyle = 0x0080, // anti-bad flags HandicapGameStyle = 0x0100, // handicap players based on score (eek! was TimeSyncGameStyle) NoTeamKillsGameStyle = 0x0400 // add here before reusing old ones above }; // map object flags #define _DRIVE_THRU ( 1 << 0 ) #define _SHOOT_THRU ( 1 << 1 ) #define _FLIP_Z ( 1 << 2 ) #define _RICOCHET ( 1 << 3 ) const int mapVersion = 1; struct GlobalDBItem { public: const char* name; const char* value; bool persistent; StateDatabase::Permission permission; }; extern const unsigned int numGlobalDBItems; extern const struct GlobalDBItem globalDBItems[]; #endif // BZF_GLOBAL_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/md5.h000066400000000000000000000037451200563112200157310ustar00rootroot00000000000000/* MD5 * converted to C++ class by Frank Thilo (thilo@unix-ag.org) * for bzflag (http://www.bzflag.org) * * based on: * * This is the header file for the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. * * Changed so as no longer to depend on Colin Plumb's `usual.h' * header definitions; now uses stuff from dpkg's config.h * - Ian Jackson . * Still in the public domain. */ #ifndef BZF_MD5_H #define BZF_MD5_H #include "common.h" /* system interface headers */ #include #include // a small class for calculating MD5 hashes of strings or byte arrays // it is not meant to be fast or secure // // usage: 1) feed it blocks of uchars with update() // 2) finalize() // 3) get hexdigest() string // or // MD5(std::string).hexdigest() // // assumes that char is 8 bit and int is 32 bit class MD5 { public: uint8_t digest[16]; MD5(); MD5(const std::string& text); void update(const unsigned char *buf, uint32_t length); void finalize(); std::string hexdigest() const; friend std::ostream& operator<<(std::ostream&, MD5 md5); private: uint32_t buf[4]; uint32_t bytes[2]; uint32_t in[16]; bool finalized; void init(void); void transform(void); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/messages.h000066400000000000000000000025321200563112200170440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Communication protocol constants */ #ifndef BZF_MESSAGES_H #define BZF_MESSAGES_H #include "common.h" /* system interface headers */ #include #define _CallSignLen 32 // including terminating NUL #define _PasswordLen 32 // including terminating NUL #define _MottoLen 128 // including terminating NUL #define _TokenLen 22 // opaque string (now int(10)) and terminating NUL #define _VersionLen 60 // including terminating NUL #define _MessageLen 128 // including terminating NUL class PlayerAddMessage { public: PlayerAddMessage(); bool unpack ( void* buf ); void* pack ( void* buf ); int playerID; int team; int type; int wins; int losses; int tks; std::string callsign; std::string motto; }; #endif // BZF_MESSAGES_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/multicast.h000066400000000000000000000025301200563112200172400ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Broadcast socket utility functions */ #ifndef __MULTICAST_H__ #define __MULTICAST_H__ #include "common.h" /* system headers */ #include /* common headers */ #include "network.h" #include "Address.h" /** openBroadcast: * port: port number * service: name of service (overrides port if not NULL) * addr: resulting address of socket * return value: * file descriptor of socket if successful * -1 if failed */ int openBroadcast(int port, const char* service, struct sockaddr_in* addr); int closeBroadcast(int fd); int sendBroadcast(int fd, const void* buffer, int bufferLength, const struct sockaddr_in*); int recvBroadcast(int fd, void* buffer, int bufferLength, struct sockaddr_in*); #endif // __MULTICAST_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/network.h000066400000000000000000000073101200563112200167250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * includes platform specific network files and adds missing stuff * * unfortunately this can include far more than necessary */ #ifndef BZF_NETWORK_H #define BZF_NETWORK_H #include "common.h" #ifdef _WIN32 # if defined(_MSC_VER) # pragma warning(disable: 4786) # endif # include # include #endif /* system headers */ #include #include #if !defined(_WIN32) #include #include #include #include #ifndef GUSI_20 # include #endif #include #include #if defined(__linux__) /* these are defined in both socket.h and tcp.h without ifdef guards. */ # undef TCP_NODELAY # undef TCP_MAXSEG #endif #include #include #include #ifdef HAVE_BSTRING_H # include #endif #if defined(__linux__) && !defined(_old_linux_) # define AddrLen unsigned int /* setsockopt incorrectly prototypes the 4th arg without const. */ # define SSOType void* #elif defined(BSD) || defined(sun) || defined(__GLIBC__) # define AddrLen socklen_t #elif defined (__APPLE__) # include # if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 # define AddrLen socklen_t # endif #endif #if defined(sun) /* setsockopt prototypes the 4th arg as const char*. */ # define SSOType const char* /* connect prototypes the 2nd arg without const */ # define CNCTType struct sockaddr #endif extern "C" { #define herror(_x) bzfherror(_x) void nerror(const char* msg); void bzfherror(const char* msg); int getErrno(); } /* BeOS net_server has closesocket(), which _must_ be used in place of close() */ #if defined(__BEOS__) && (IPPROTO_TCP != 6) # define close(__x) closesocket(__x) #endif #else /* !defined(_WIN32) */ #define MAXHOSTNAMELEN 64 #ifndef EINPROGRESS #define EINPROGRESS WSAEWOULDBLOCK #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #endif #ifndef ECONNRESET #define ECONNRESET WSAECONNRESET #endif #ifndef EBADMSG #define EBADMSG WSAECONNRESET /* not defined by windows */ #endif /* setsockopt prototypes the 4th arg as const char*. */ #define SSOType const char* inline int close(SOCKET s) { return closesocket(s); } #define ioctl(__fd, __req, __arg) \ ioctlsocket(__fd, __req, (u_long*)__arg) #define gethostbyaddr(__addr, __len, __type) \ gethostbyaddr((const char*)__addr, __len, __type) extern "C" { int inet_aton(const char* cp, struct in_addr* pin); void nerror(const char* msg); void herror(const char* msg); int getErrno(); } #endif /* !defined(_WIN32) */ #if !defined(AddrLen) # define AddrLen int #endif #if !defined(SSOType) # define SSOType const void* #endif #if !defined(CNCTType) # define CNCTType const struct sockaddr #endif #if !defined(INADDR_NONE) # define INADDR_NONE ((in_addr_t)0xffffffff) #endif class BzfNetwork { public: static int setNonBlocking(int fd); static int setBlocking(int fd); static bool parseURL(const std::string& url, std::string& protocol, std::string& hostname, int& port, std::string& pathname); }; #endif // BZF_NETWORK_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/resource.h000066400000000000000000000011751200563112200170660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #define IDI_BZICON 101 /* * Local Variables: *** * mode:C++ *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/include/vectors.h000066400000000000000000000445331200563112200167310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef VECTORS_H #define VECTORS_H #include #include #include #include #include #include "vectors_old.h" // FIXME -- the crappy old-style vectors //============================================================================// template T typed_cos(T rads); template<> inline float typed_cos (float rads) { return cosf(rads); } template<> inline double typed_cos(double rads) { return cos(rads); } template T typed_sin(T rads); template<> inline float typed_sin (float rads) { return sinf(rads); } template<> inline double typed_sin(double rads) { return sin(rads); } template T typed_sqrt(T rads); template<> inline float typed_sqrt (float rads) { return sqrtf(rads); } template<> inline double typed_sqrt(double rads) { return sqrt(rads); } template inline std::string tostring(T value, const char* fmt) { char buf[256]; if (fmt == NULL) { fmt = "%.9g"; } snprintf(buf, sizeof(buf), fmt, (double)value); return std::string(buf); } //============================================================================// template class vec2; template class vec3; template class vec4; //============================================================================// // // vec2 // template class vec2 { friend class vec3; friend class vec4; public: union { T x; T r; T s; }; union { T y; T g; T t; }; private: vec2(bool) {} // does not touch the data public: vec2() : x((T)0), y((T)0) {} vec2(const vec2& v) : x(v.x), y(v.y) {} vec2(T _x, T _y): x(_x), y(_y) {} inline vec2& operator=(const vec2& v) { x = v.x; y = v.y; return *this; } inline T* data() { return &x; } inline const T* data() const { return &x; } inline operator T*() { return &x; } inline operator const T*() const { return &x; } inline T& operator[](int index) { return ((T*)&x)[index]; } inline const T& operator[](int index) const { return ((T*)&x)[index]; } inline vec2 operator-() const { return vec2(-x, -y); } vec2& operator+=(const vec2& v) { x += v.x; y += v.y; return *this; } vec2& operator-=(const vec2& v) { x -= v.x; y -= v.y; return *this; } vec2& operator*=(const vec2& v) { x *= v.x; y *= v.y; return *this; } vec2& operator/=(const vec2& v) { x /= v.x; y /= v.y; return *this; } vec2& operator+=(T d) { x += d; y += d; return *this; } vec2& operator-=(T d) { x -= d; y -= d; return *this; } vec2& operator*=(T d) { x *= d; y *= d; return *this; } vec2& operator/=(T d) { x /= d; y /= d; return *this; } vec2 operator+(const vec2& v) const { return vec2(x + v.x, y + v.y); } vec2 operator-(const vec2& v) const { return vec2(x - v.x, y - v.y); } vec2 operator*(const vec2& v) const { return vec2(x * v.x, y * v.y); } vec2 operator/(const vec2& v) const { return vec2(x / v.x, y / v.y); } vec2 operator+(T d) const { return vec2(x + d, y + d); } vec2 operator-(T d) const { return vec2(x - d, y - d); } vec2 operator*(T d) const { return vec2(x * d, y * d); } vec2 operator/(T d) const { return vec2(x / d, y / d); } bool operator<(const vec2& v) const { if (x < v.x) { return true; } if (x > v.x) { return false; } if (y < v.y) { return true; } if (y > v.y) { return false; } return false; } bool operator==(const vec2& v) const { return ((x == v.x) && (y == v.y)); } bool operator!=(const vec2& v) const { return ((x != v.x) || (y != v.y)); } static T dot(const vec2& a, const vec2& b) { return ((a.x * b.x) + (a.y * b.y)); } T dot(const vec2& v) const { return dot(*this, v); } T lengthSq() const { return dot(*this, *this); } T length() const { return typed_sqrt(lengthSq()); } static bool normalize(vec2& v) { const T len = v.length(); if (len == (T)0) { return false; } const T scale = ((T)1 / len); v *= scale; return true; } vec2 normalize() const { vec2 v(*this); normalize(v); return v; } vec2 rotate(T radians) const { const T cv = typed_cos(radians); const T sv = typed_sin(radians); const T nx = (cv * x) - (sv * y); const T ny = (cv * y) + (sv * x); return vec2(nx, ny); } static void rotate(vec2& v, T radians) { v = v.rotate(radians); } std::string tostring(const char* fmt = NULL, const char* sep = NULL) const { if (sep == NULL) { sep = " "; } return ::tostring(x, fmt) + sep + ::tostring(y, fmt); } }; template vec2 operator+(T d, const vec2& in) { vec2 v(in); v += d; return v; } template vec2 operator-(T d, const vec2& in) { vec2 v(d, d); v -= in; return v; } template vec2 operator*(T d, const vec2& in) { vec2 v(in); v *= d; return v; } template vec2 operator/(T d, const vec2& in) { vec2 v(d, d); v /= in; return v; } template std::ostream& operator<<(std::ostream& out, const vec2& v) { out << " " << v.tostring(); return out; } //============================================================================// // // vec3 // template class vec3 { friend class vec4; public: union { T x; T r; T s; }; union { T y; T g; T t; }; union { T z; T b; T p; }; private: vec3(bool) {} // does not touch the data public: vec3() : x((T)0), y((T)0), z((T)0) {} vec3(const vec3& v) : x(v.x), y(v.y), z(v.z) {} vec3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {} vec3(const vec2& v, T _z) : x(v.x), y(v.y), z(_z) {} inline vec3& operator=(const vec3& v) { x = v.x; y = v.y; z = v.z; return *this; } inline T* data() { return &x; } inline const T* data() const { return &x; } inline operator T*() { return &x; } inline operator const T*() const { return &x; } inline T& operator[](int index) { return ((T*)&x)[index]; } inline const T& operator[](int index) const { return ((T*)&x)[index]; } inline vec3 operator-() const { return vec3(-x, -y, -z); } inline vec2& xy() { return *(new((void*)&x) vec2(false)); } inline const vec2& xy() const { return *(new((void*)&x) vec2(false)); } inline vec2& yz() { return *(new((void*)&y) vec2(false)); } inline const vec2& yz() const { return *(new((void*)&y) vec2(false)); } vec3& operator+=(const vec3& v) { x += v.x; y += v.y; z += v.z; return *this; } vec3& operator-=(const vec3& v) { x -= v.x; y -= v.y; z -= v.z; return *this; } vec3& operator*=(const vec3& v) { x *= v.x; y *= v.y; z *= v.z; return *this; } vec3& operator/=(const vec3& v) { x /= v.x; y /= v.y; z /= v.z; return *this; } vec3& operator+=(T d) { x += d; y += d; z += d; return *this; } vec3& operator-=(T d) { x -= d; y -= d; z -= d; return *this; } vec3& operator*=(T d) { x *= d; y *= d; z *= d; return *this; } vec3& operator/=(T d) { x /= d; y /= d; z /= d; return *this; } vec3 operator+(const vec3& v) const { return vec3(x + v.x, y + v.y, z + v.z); } vec3 operator-(const vec3& v) const { return vec3(x - v.x, y - v.y, z - v.z); } vec3 operator*(const vec3& v) const { return vec3(x * v.x, y * v.y, z * v.z); } vec3 operator/(const vec3& v) const { return vec3(x / v.x, y / v.y, z / v.z); } vec3 operator+(T d) const { return vec3(x + d, y + d, z + d); } vec3 operator-(T d) const { return vec3(x - d, y - d, z - d); } vec3 operator*(T d) const { return vec3(x * d, y * d, z * d); } vec3 operator/(T d) const { return vec3(x / d, y / d, z / d); } bool operator<(const vec3& v) const { if (x < v.x) { return true; } if (x > v.x) { return false; } if (y < v.y) { return true; } if (y > v.y) { return false; } if (z < v.z) { return true; } if (z > v.z) { return false; } return false; } bool operator==(const vec3& v) const { return ((x == v.x) && (y == v.y) && (z == v.z)); } bool operator!=(const vec3& v) const { return ((x != v.x) || (y != v.y) || (z != v.z)); } static T dot(const vec3& a, const vec3& b) { return ((a.x * b.x) + (a.y * b.y) + (a.z * b.z)); } T dot(const vec3& v) const { return dot(*this, v); } static vec3 cross(const vec3& a, const vec3& b) { return vec3( ((a.y * b.z) - (a.z * b.y)), ((a.z * b.x) - (a.x * b.z)), ((a.x * b.y) - (a.y * b.x)) ); } vec3 cross(const vec3& v) const { return cross(*this, v); } T lengthSq() const { return dot(*this, *this); } T length() const { return typed_sqrt(lengthSq()); } static bool normalize(vec3& v) { const T len = v.length(); if (len == (T)0) { return false; } const T scale = ((T)1 / len); v *= scale; return true; } vec3 normalize() const { vec3 v(*this); normalize(v); return v; } vec3 rotateX(T radians) const { const T cv = typed_cos(radians); const T sv = typed_sin(radians); const T ny = (cv * y) - (sv * z); const T nz = (cv * z) + (sv * y); return vec3(x, ny, nz); } static void rotateX(vec3& v, T radians) { v = v.rotateX(radians); } vec3 rotateY(T radians) const { const T cv = typed_cos(radians); const T sv = typed_sin(radians); const T nz = (cv * z) - (sv * x); const T nx = (cv * x) + (sv * z); return vec3(nx, y, nz); } static void rotateY(vec3& v, T radians) { v = v.rotateY(radians); } vec3 rotateZ(T radians) const { const T cv = typed_cos(radians); const T sv = typed_sin(radians); const T nx = (cv * x) - (sv * y); const T ny = (cv * y) + (sv * x); return vec3(nx, ny, z); } static void rotateZ(vec3& v, T radians) { v = v.rotateZ(radians); } vec3 rotate(T radians, const vec3& n) const { const T cv = typed_cos(radians); const T sv = typed_sin(radians); const T ic = (T)1 - cv; const T fxx = ic * (n.x * n.x); const T fyy = ic * (n.y * n.y); const T fzz = ic * (n.z * n.z); const T fxy = ic * (n.x * n.y); const T fxz = ic * (n.x * n.z); const T fyz = ic * (n.y * n.z); const T xs = n.x * sv; const T ys = n.y * sv; const T zs = n.z * sv; return vec3(dot(vec3(fxx + cv, fxy - zs, fxz + ys)), dot(vec3(fxy + zs, fyy + cv, fyz - xs)), dot(vec3(fxz - ys, fyz + xs, fzz + cv))); } static void rotate(vec3& v, T radians, const vec3& n) { v = v.rotate(radians, n); } std::string tostring(const char* fmt = NULL, const char* sep = NULL) const { if (sep == NULL) { sep = " "; } return ::tostring(x, fmt) + sep + ::tostring(y, fmt) + sep + ::tostring(z, fmt); } }; template vec3 operator+(T d, const vec3& in) { vec3 v(in); v += d; return v; } template vec3 operator-(T d, const vec3& in) { vec3 v(d, d, d); v -= in; return v; } template vec3 operator*(T d, const vec3& in) { vec3 v(in); v *= d; return v; } template vec3 operator/(T d, const vec3& in) { vec3 v(d, d, d); v /= in; return v; } template std::ostream& operator<<(std::ostream& out, const vec3& v) { out << " " << v.tostring(); return out; } //============================================================================// // // vec4 // template class vec4 { public: union { T x; T r; T s; }; union { T y; T g; T t; }; union { T z; T b; T p; }; union { T w; T a; T q; }; public: vec4() : x((T)0), y((T)0), z((T)0), w((T)1) {} vec4(const vec4& v) : x(v.x), y(v.y), z(v.z), w(v.w) {} vec4(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w) {} vec4(const vec3& v, T _w) : x(v.x), y(v.y), z(v.z), w(_w) {} vec4(T v[4]) : x(v[0]), y(v[1]), z(v[2]), w(v[3]) {} inline vec4& operator=(const vec4& v) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; } inline vec4& operator=(const T v[4]) { x = v[0]; y = v[1]; z = v[2]; w = v[3]; return *this; } inline T* data() { return &x; } inline const T* data() const { return &x; } inline operator T*() { return &x; } inline operator const T*() const { return &x; } inline T& operator[](int index) { return ((T*)&x)[index]; } inline const T& operator[](int index) const { return ((T*)&x)[index]; } inline vec4 operator-() const { return vec4(-x, -y, -z, -w); } inline vec2& xy() { return *(new((void*)&x) vec2(false)); } inline const vec2& xy() const { return *(new((void*)&x) vec2(false)); } inline vec2& yz() { return *(new((void*)&y) vec2(false)); } inline const vec2& yz() const { return *(new((void*)&y) vec2(false)); } inline vec2& zw() { return *(new((void*)&z) vec2(false)); } inline const vec2& zw() const { return *(new((void*)&z) vec2(false)); } inline vec3& xyz() { return *(new((void*)&x) vec3(false)); } inline const vec3& xyz() const { return *(new((void*)&x) vec3(false)); } inline vec3& yzw() { return *(new((void*)&y) vec3(false)); } inline const vec3& yzw() const { return *(new((void*)&y) vec3(false)); } inline vec3& rgb() { return xyz(); } inline const vec3& rgb() const { return xyz(); } vec4& operator+=(const vec4& v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; } vec4& operator-=(const vec4& v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; } vec4& operator*=(const vec4& v) { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; } vec4& operator/=(const vec4& v) { x /= v.x; y /= v.y; z /= v.z; w /= v.w; return *this; } vec4& operator+=(T d) { x += d; y += d; z += d; w += d; return *this; } vec4& operator-=(T d) { x -= d; y -= d; z -= d; w -= d; return *this; } vec4& operator*=(T d) { x *= d; y *= d; z *= d; w *= d; return *this; } vec4& operator/=(T d) { x /= d; y /= d; z /= d; w /= d; return *this; } vec4 operator+(const vec4& v) const { return vec4(x + v.x, y + v.y, z + v.z, w + v.w); } vec4 operator-(const vec4& v) const { return vec4(x - v.x, y - v.y, z - v.z, w - v.w); } vec4 operator*(const vec4& v) const { return vec4(x * v.x, y * v.y, z * v.z, w * v.w); } vec4 operator/(const vec4& v) const { return vec4(x / v.x, y / v.y, z / v.z, w / v.w); } vec4 operator+(T d) const { return vec4(x + d, y + d, z + d, w + d); } vec4 operator-(T d) const { return vec4(x - d, y - d, z - d, w - d); } vec4 operator*(T d) const { return vec4(x * d, y * d, z * d, w * d); } vec4 operator/(T d) const { return vec4(x / d, y / d, z / d, w / d); } bool operator<(const vec4& v) const { if (x < v.x) { return true; } if (x > v.x) { return false; } if (y < v.y) { return true; } if (y > v.y) { return false; } if (z < v.z) { return true; } if (z > v.z) { return false; } if (w < v.w) { return true; } if (w > v.w) { return false; } return false; } bool operator==(const vec4& v) const { return ((x == v.x) && (y == v.y) && (z == v.z) && (w == v.w)); } bool operator!=(const vec4& v) const { return ((x != v.x) || (y != v.y) || (z != v.z) || (w != v.w)); } static T dot(const vec4& a, const vec4& b) { return ((a.x * b.x) + (a.y * b.y) + (a.z * b.z) + (a.w * b.w)); } T dot(const vec4& v) const { return dot(*this, v); } T lengthSq() const { return dot(*this, *this); } T length() const { return typed_sqrt(lengthSq()); } // for the plane equation, // (x * p.x) + (y * p.y) + (z * p.z) + w = 0 {for a point on the plane} T planeDist(const vec3& point) const { return vec3::dot(point, xyz()) + w; } std::string tostring(const char* fmt = NULL, const char* sep = NULL) const { if (sep == NULL) { sep = " "; } return ::tostring(x, fmt) + sep + ::tostring(y, fmt) + sep + ::tostring(z, fmt) + sep + ::tostring(w, fmt); } }; template vec4 operator+(T d, const vec4& in) { vec4 v(in); v += d; return v; } template vec4 operator-(T d, const vec4& in) { vec4 v(d, d, d, d); v -= in; return v; } template vec4 operator*(T d, const vec4& in) { vec4 v(in); v *= d; return v; } template vec4 operator/(T d, const vec4& in) { vec4 v(d, d, d, d); v /= in; return v; } template std::ostream& operator<<(std::ostream& out, const vec4& v) { out << " " << v.tostring(); return out; } //============================================================================// // // Easier to type // typedef vec2 fvec2; typedef vec3 fvec3; typedef vec4 fvec4; typedef vec2 dvec2; typedef vec3 dvec3; typedef vec4 dvec4; //============================================================================// // // Static assertions to check type sizes // #define VECTORS_STATIC_ASSERT(x) \ typedef char vectors_h_static_assert[(x) ? 1 : -1] VECTORS_STATIC_ASSERT(sizeof(fvec2) == (2 * sizeof(float))); VECTORS_STATIC_ASSERT(sizeof(fvec3) == (3 * sizeof(float))); VECTORS_STATIC_ASSERT(sizeof(fvec4) == (4 * sizeof(float))); VECTORS_STATIC_ASSERT(sizeof(dvec2) == (2 * sizeof(double))); VECTORS_STATIC_ASSERT(sizeof(dvec3) == (3 * sizeof(double))); VECTORS_STATIC_ASSERT(sizeof(dvec4) == (4 * sizeof(double))); #undef VECTORS_STATIC_ASSERT // utils inline fvec3 Float3ToVec3 ( const float * f) { return fvec3(f[0],f[1],f[2]); } inline fvec4 Float3ToVec4 ( const float * f) { return fvec4(f[0],f[1],f[2],1.0f); } inline fvec4 Float4ToVec4 ( const float * f) { return fvec4(f[0],f[1],f[2],f[3]); } //============================================================================// #endif // VECTORS_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/vectors_old.h000066400000000000000000000053041200563112200175600ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __VECTOR_MATH_H__ #define __VECTOR_MATH_H__ #include // vectors implemented as arrays typedef float afvec2[2]; typedef float afvec3[3]; typedef float afvec4[4]; // vectors implemented as simple classes class cfvec2 { public: cfvec2() {memset(data,0,sizeof(float)*2);} cfvec2(const float values[2]) { memcpy (data, values, sizeof(float[2])); } cfvec2& operator=(const float values[2]) { memcpy (data, values, sizeof(float[2])); return *this; } inline float& operator[](int pos) { return data[pos]; } float data[2]; }; class cfvec3 { public: cfvec3() {memset(data,0,sizeof(float)*3);} cfvec3(const float values[3]) { memcpy (data, values, sizeof(float[3])); } cfvec3& operator=(const float values[3]) { memcpy (data, values, sizeof(float[3])); return *this; } inline float& operator[](int pos) { return data[pos]; } float data[3]; }; class cfvec4 { public: cfvec4(){memset(data,0,sizeof(float)*4);} cfvec4(const float values[4]) { memcpy (data, values, sizeof(float[4])); } cfvec4& operator=(const float values[4]) { memcpy (data, values, sizeof(float[4])); return *this; } inline float& operator[](int pos) { return data[pos]; } float data[4]; }; // FIXME - some these should go into a common file // Some handy geometry functions static inline void vec3add (float *result, const float* v1, const float* v2) { result[0] = v1[0] + v2[0]; result[1] = v1[1] + v2[1]; result[2] = v1[2] + v2[2]; return; } static inline void vec3sub (float *result, const float* v1, const float* v2) { result[0] = v1[0] - v2[0]; result[1] = v1[1] - v2[1]; result[2] = v1[2] - v2[2]; return; } static inline float vec3dot (const float* v1, const float* v2) { return (v1[0] * v2[0]) + (v1[1] * v2[1]) + (v1[2] * v2[2]); } static inline void vec3cross (float* result, const float* v1, const float* v2) { result[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]); result[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]); result[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]); return; } #endif // __VECTOR_MATH_H__ // Local variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/version.h000066400000000000000000000024711200563112200167240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "config.h" #ifndef __VERSION_H__ #define __VERSION_H__ #ifndef BZ_BUILD_DATE extern int getBuildDate(); #define BZ_BUILD_DATE getBuildDate() #endif #ifndef BZ_CONFIG_DIR_VERSION #define BZ_CONFIG_DIR_VERSION "2.4" #endif #ifndef BZ_CONFIG_FILE_NAME #define BZ_CONFIG_FILE_NAME "config.cfg" #endif #ifndef BZ_CONFIG_FILE_VERSION #define BZ_CONFIG_FILE_VERSION 4 #endif #define BZ_CONNECT_HEADER "BZFLAG\r\n\r\n" extern const char *bzfcopyright; // various version functions in buildDate.cxx extern const char* getProtocolVersion(); extern const char* getServerVersion(); extern const char* getMajorMinorVersion(); extern const char* getMajorMinorRevVersion(); extern const char* getAppVersion(); #endif //__VERSION_H__ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/include/win32.h000066400000000000000000000034431200563112200162010ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * common definitions specific to the _WIN32 platform */ #ifndef __WIN32_H__ #define __WIN32_H__ #define _WINSOCKAPI_ #include #include // missing constants #ifndef MAXFLOAT #define MAXFLOAT FLT_MAX #endif #if (_MSC_VER > 1200) // VC7 or higher #define _USE_MATH_DEFINES #else // vc6 and lower needs em #ifndef M_PI #define M_PI 3.14159265358979323846f #endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440f #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880f #endif #endif // missing types #ifndef int16_t typedef signed short int16_t; #endif #ifndef uint16_t typedef unsigned short uint16_t; #endif #ifndef int32_t typedef signed int int32_t; #endif #ifndef uint32_t typedef unsigned int uint32_t; #endif /* stuff specific to visual studio */ #if (_MSC_VER) // turn off bogus `this used in base member initialization list' # pragma warning(disable: 4786) # pragma warning(disable: 4503) # pragma warning(disable: 4355) // missing functions # define snprintf _snprintf # define PATH_MAX MAX_PATH namespace std { template int isnan(_Tp __f) { return _isnan((double)__f); } } #endif // _MSC_VER #endif // __WIN32_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/m4/000077500000000000000000000000001200563112200137575ustar00rootroot00000000000000bzflag-2.4.2+ds1/m4/Makefile.am000066400000000000000000000002071200563112200160120ustar00rootroot00000000000000EXTRA_DIST = \ cache.m4 \ curses.m4 \ isnan.m4 \ libcurl.m4 \ mkdirp.m4 \ sdl.m4 \ stage.m4 MAINTAINERCLEANFILES = Makefile.in bzflag-2.4.2+ds1/m4/Makefile.in000066400000000000000000000255521200563112200160350ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = m4 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ cache.m4 \ curses.m4 \ isnan.m4 \ libcurl.m4 \ mkdirp.m4 \ sdl.m4 \ stage.m4 MAINTAINERCLEANFILES = Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/m4/cache.m4000066400000000000000000000073201200563112200152660ustar00rootroot00000000000000# C A C H E . M 4 # BRL-CAD # # Copyright (c) 2005-2010 United States Government as represented by # the U.S. Army Research Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # # 3. The name of the author may not be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ### # # Changes: # # 2007-05-04 imported into bzflag and macro renamed with BZ prefix # ### # # BZ_CONFIG_CACHE # # automatically enable and load the configure cache file if available # ### AC_DEFUN([BZ_CONFIG_CACHE], [ AC_MSG_CHECKING([whether a configure cache exists]) if test "x$cache_file" = "x/dev/null" ; then configure_cache=ifelse([$1], , [config.cache.${host_os}], [$1]) CONFIG_CACHE="" if test -f "$configure_cache"; then if test "x`cat $configure_cache | grep ac_cv_env_CC_value`" != "xac_cv_env_CC_value=$CC" ; then dnl if the compiler we're using now doesn't dnl match the compiler used in the previous dnl cached results, invalidate it. AC_MSG_RESULT([found but compiler differs]) rm -f "$configure_cache" elif test "x`cat $configure_cache | grep ac_cv_env_CPPFLAGS_value`" != "xac_cv_env_CPPFLAGS_value=$CPPFLAGS" ; then dnl if the preprocessor flags we're using now dnl doesn't match the flags used in the dnl previous cached results, invalidate it. AC_MSG_RESULT([found but preprocessor flags differ]) rm -f "$configure_cache" else dnl if the configure script has been modified dnl since the last caching, assume it to be dnl invalid. last_modified="`ls -Lt $configure_cache configure`" case "x$last_modified" in xconfigure*) AC_MSG_RESULT([found but out of date]) rm -f $configure_cache ;; esac fi dnl if the cache still exists, load it if test -f "$configure_cache" ; then dnl go ahead and load the cache AC_MSG_RESULT([found $configure_cache]) case $configure_cache in [\\/]* | ?:[\\/]* ) . $configure_cache ;; *) . ./$configure_cache ;; esac fi else AC_MSG_RESULT([not found]) fi dnl if we are on sgi, bash may choke on bad sed syntax in the cache if test "x$host_os" != "xirix6.5" ; then AC_MSG_NOTICE([*** Automatically caching to $configure_cache ***]) >$configure_cache cache_file="$configure_cache" CONFIG_CACHE="$cache_file" else AC_MSG_NOTICE([Automatic caching is unavailable on IRIX]) fi AC_SUBST(CONFIG_CACHE) else AC_MSG_RESULT($cache_file) fi ]) # Local Variables: # mode: m4 # tab-width: 8 # standard-indent: 4 # indent-tabs-mode: t # End: # ex: shiftwidth=4 tabstop=8 bzflag-2.4.2+ds1/m4/curses.m4000066400000000000000000000046301200563112200155300ustar00rootroot00000000000000# This macro tries to find curses, and defines HAVE_CURSES_H or HAVE_NCURSES_H # if any of those headers are found. It also defines CURSES_LIB. AC_DEFUN([MP_WITH_CURSES], [AC_ARG_WITH(xcurses, [ --with-xcurses Force the use of XCurses over ncurses],,) AC_ARG_WITH(curses, [ --with-curses Force the use of curses over ncurses],,) mp_save_LIBS="$LIBS" CURSES_LIB="" if test "$with_curses" != yes -a "$with_xcurses" != yes then AC_CACHE_CHECK([for working ncurses], mp_cv_ncurses, [LIBS="$LIBS -lncurses" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ]])], [mp_cv_ncurses=yes], [mp_cv_ncurses=no])]) if test "$mp_cv_ncurses" = yes then AC_DEFINE(HAVE_NCURSES_H, , [Use the header file ncurses.h]) CURSES_LIB="-lncurses" fi fi if test ! "$CURSES_LIB" -a "$with_xcurses" != yes then AC_CACHE_CHECK([for working curses], mp_cv_curses, [LIBS="$mp_save_LIBS -lcurses" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ]])], [mp_cv_curses=yes], [mp_cv_curses=no])]) if test "$mp_cv_curses" = yes then AC_DEFINE(HAVE_CURSES_H, , [Use the header file curses.h]) CURSES_LIB="-lcurses" fi fi if test ! "$CURSES_LIB" -a "$with_xcurses" != yes then AC_CACHE_CHECK([for working PDcurses], mp_cv_pdcurses, [LIBS="$mp_save_LIBS -lpdcurses" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ]])], [mp_cv_pdcurses=yes], [mp_cv_pdcurses=no])]) if test "$mp_cv_pdcurses" = yes then AC_DEFINE(HAVE_CURSES_H, , [Use the header file curses.h]) CURSES_LIB="-lpdcurses" fi fi if test ! "$CURSES_LIB" -a "$with_curses" != yes then xcurses_deplibs="-L$x_libraries -lXaw -lXmu -lXt -lX11 -lSM -lICE -lXext" AC_CACHE_CHECK([for working XCurses], mp_cv_xcurses, [LIBS="$mp_save_LIBS -lXCurses $xcurses_deplibs" AC_LINK_IFELSE([ AC_LANG_PROGRAM([[#include ]], [[chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); ]])], [mp_cv_xcurses=yes], [mp_cv_xcurses=no])]) if test "$mp_cv_xcurses" = yes then AC_DEFINE(HAVE_XCURSES_H, , [Use the header file xcurses.h]) CURSES_LIB="-lXCurses $xcurses_deplibs" fi fi LIBS="$mp_save_LIBS" ])dnl bzflag-2.4.2+ds1/m4/isnan.m4000066400000000000000000000026211200563112200153320ustar00rootroot00000000000000# I S N A N . M 4 # BZFlag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or modify # it under the terms of the license found in the file named COPYING # that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # ### # BZ_FUNC_ISNAN # checks whether the isnan() function can be found, takes no arguments AC_DEFUN([BZ_FUNC_ISNAN], [ AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for isnan]) dnl see if we have std::isnan bz_isnan_works=no AC_TRY_COMPILE([ #ifdef HAVE_CMATH # include #endif ], [ float f = 0.0f; std::isnan(f); ], [bz_isnan_works=yes]) if test "x$bz_isnan_works" = "xyes" ; then AC_DEFINE([HAVE_STD__ISNAN], [1], [Define to 1 if `std::isnan' is available]) else dnl try again using just math.h, but include cmath in case it clobbers AC_TRY_COMPILE([ #include #include ], [ float f = 0.0f; isnan(f); ], [bz_isnan_works=yes]) if test "x$bz_isnan_works" = "xyes" ; then AC_DEFINE([HAVE_ISNAN], [1], [Define to 1 if `isnan' is available]) fi fi AC_MSG_RESULT([$bz_isnan_works]) AC_LANG_POP([C++]) ]) # Local Variables: # mode: m4 # tab-width: 8 # standard-indent: 4 # indent-tabs-mode: t # End: # ex: shiftwidth=4 tabstop=8 bzflag-2.4.2+ds1/m4/libcurl.m4000066400000000000000000000236541200563112200156670ustar00rootroot00000000000000# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], # [ACTION-IF-YES], [ACTION-IF-NO]) # ---------------------------------------------------------- # David Shaw May-09-2006 # # Checks for libcurl. DEFAULT-ACTION is the string yes or no to # specify whether to default to --with-libcurl or --without-libcurl. # If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the # minimum version of libcurl to accept. Pass the version as a regular # version number like 7.10.1. If not supplied, any version is # accepted. ACTION-IF-YES is a list of shell commands to run if # libcurl was successfully found and passed the various tests. # ACTION-IF-NO is a list of shell commands that are run otherwise. # Note that using --without-libcurl does run ACTION-IF-NO. # # This macro #defines HAVE_LIBCURL if a working libcurl setup is # found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary # values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are # the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy # where yyy are the various protocols supported by libcurl. Both xxx # and yyy are capitalized. See the list of AH_TEMPLATEs at the top of # the macro for the complete list of possible defines. Shell # variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also # defined to 'yes' for those features and protocols that were found. # Note that xxx and yyy keep the same capitalization as in the # curl-config list (e.g. it's "HTTP" and not "http"). # # Users may override the detected values by doing something like: # LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure # # For the sake of sanity, this macro assumes that any libcurl that is # found is after version 7.7.2, the first version that included the # curl-config script. Note that it is very important for people # packaging binary versions of libcurl to include this script! # Without curl-config, we can only guess what protocols are available, # or use curl_version_info to figure it out at runtime. AC_DEFUN([LIBCURL_CHECK_CONFIG], [ AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL]) AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4]) AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6]) AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz]) AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS]) AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN]) AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI]) AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM]) AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS]) AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS]) AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE]) AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET]) AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP]) AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT]) AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_RTSP],[Defined if libcurl supports RTSP]) AH_TEMPLATE([LIBCURL_PROTOCOL_POP3],[Defined if libcurl supports POP3]) AH_TEMPLATE([LIBCURL_PROTOCOL_IMAP],[Defined if libcurl supports IMAP]) AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP]) AC_ARG_WITH(libcurl, AC_HELP_STRING([--with-libcurl=PREFIX],[look for the curl library in PREFIX/lib and headers in PREFIX/include]), [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])]) if test "$_libcurl_with" != "no" ; then AC_PROG_AWK _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'" _libcurl_try_link=yes if test -d "$_libcurl_with" ; then LIBCURL_CPPFLAGS="-I$withval/include" _libcurl_ldflags="-L$withval/lib" AC_PATH_PROG([_libcurl_config],[curl-config],[], ["$withval/bin"]) else AC_PATH_PROG([_libcurl_config],[curl-config],[],[$PATH]) fi if test x$_libcurl_config != "x" ; then AC_CACHE_CHECK([for the version of libcurl], [libcurl_cv_lib_curl_version], [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`]) _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse` _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse` if test $_libcurl_wanted -gt 0 ; then AC_CACHE_CHECK([for libcurl >= version $2], [libcurl_cv_lib_version_ok], [ if test $_libcurl_version -ge $_libcurl_wanted ; then libcurl_cv_lib_version_ok=yes else libcurl_cv_lib_version_ok=no fi ]) fi if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then if test x"$LIBCURL_CPPFLAGS" = "x" ; then LIBCURL_CPPFLAGS=`$_libcurl_config --cflags` fi if test x"$LIBCURL" = "x" ; then LIBCURL=`$_libcurl_config --libs` # This is so silly, but Apple actually has a bug in their # curl-config script. Fixed in Tiger, but there are still # lots of Panther installs around. case "${host}" in powerpc-apple-darwin7*) LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'` ;; esac fi # All curl-config scripts support --feature _libcurl_features=`$_libcurl_config --feature` # Is it modern enough to have --protocols? (7.12.4) if test $_libcurl_version -ge 461828 ; then _libcurl_protocols=`$_libcurl_config --protocols` fi else _libcurl_try_link=no fi unset _libcurl_wanted fi if test $_libcurl_try_link = yes ; then # we didn't find curl-config, so let's see if the user-supplied # link line (or failing that, "-lcurl") is enough. LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"} AC_CACHE_CHECK([whether libcurl is usable], [libcurl_cv_lib_curl_usable], [ _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBCURL $LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ],[ /* Try and use a few common options to force a failure if we are missing symbols or can't link. */ int x; curl_easy_setopt(NULL,CURLOPT_URL,NULL); x=CURL_ERROR_SIZE; x=CURLOPT_WRITEFUNCTION; x=CURLOPT_FILE; x=CURLOPT_ERRORBUFFER; x=CURLOPT_STDERR; x=CURLOPT_VERBOSE; ])],libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs ]) if test $libcurl_cv_lib_curl_usable = yes ; then # Does curl_free() exist in this version of libcurl? # If not, fake it with free() _libcurl_save_cppflags=$CPPFLAGS CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" _libcurl_save_libs=$LIBS LIBS="$LIBS $LIBCURL" AC_CHECK_FUNC(curl_free,, AC_DEFINE(curl_free,free, [Define curl_free() as free() if our version of curl lacks curl_free.])) CPPFLAGS=$_libcurl_save_cppflags LIBS=$_libcurl_save_libs unset _libcurl_save_cppflags unset _libcurl_save_libs AC_DEFINE(HAVE_LIBCURL,1, [Define to 1 if you have a functional curl library.]) AC_SUBST(LIBCURL_CPPFLAGS) AC_SUBST(LIBCURL) for _libcurl_feature in $_libcurl_features ; do AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1]) eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes done if test "x$_libcurl_protocols" = "x" ; then # We don't have --protocols, so just assume that all # protocols are available _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP" if test x$libcurl_feature_SSL = xyes ; then _libcurl_protocols="$_libcurl_protocols HTTPS" # FTPS wasn't standards-compliant until version # 7.11.0 (0x070b00 == 461568) if test $_libcurl_version -ge 461568; then _libcurl_protocols="$_libcurl_protocols FTPS" fi fi # RTSP, IMAP, POP3 and SMTP were added in # 7.20.0 (0x071400 == 463872) if test $_libcurl_version -ge 463872; then _libcurl_protocols="$_libcurl_protocols RTSP IMAP POP3 SMTP" fi fi for _libcurl_protocol in $_libcurl_protocols ; do AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1]) eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes done else unset LIBCURL unset LIBCURL_CPPFLAGS fi fi unset _libcurl_try_link unset _libcurl_version_parse unset _libcurl_config unset _libcurl_feature unset _libcurl_features unset _libcurl_protocol unset _libcurl_protocols unset _libcurl_version unset _libcurl_ldflags fi if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then # This is the IF-NO path ifelse([$4],,:,[$4]) else # This is the IF-YES path ifelse([$3],,:,[$3]) fi unset _libcurl_with ])dnl bzflag-2.4.2+ds1/m4/libtool.m4000066400000000000000000010451551200563112200157000ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010 Free Software Foundation, # Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2010 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; haiku*) version_type=linux need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], [[If ld is used when linking, flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS bzflag-2.4.2+ds1/m4/ltoptions.m4000066400000000000000000000272561200563112200162700ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) bzflag-2.4.2+ds1/m4/ltsugar.m4000066400000000000000000000104241200563112200157030ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) bzflag-2.4.2+ds1/m4/ltversion.m4000066400000000000000000000012561200563112200162520ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3293 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4]) m4_define([LT_PACKAGE_REVISION], [1.3293]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4' macro_revision='1.3293' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) bzflag-2.4.2+ds1/m4/lt~obsolete.m4000066400000000000000000000137561200563112200166070ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) bzflag-2.4.2+ds1/m4/mkdirp.m4000066400000000000000000000062171200563112200155150ustar00rootroot00000000000000###################################################################### # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p]) # automake 1.10+ seems to use uppercase instead MKDIR_P="$mkdir_p" AC_SUBST([MKDIR_P])]) bzflag-2.4.2+ds1/m4/sdl.m4000066400000000000000000000141501200563112200150040ustar00rootroot00000000000000# Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi AC_REQUIRE([AC_CANONICAL_TARGET]) PATH="$prefix/bin:$prefix/usr/bin:$PATH" AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ]])],[],[no_sdl=yes],[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ]], [[ return 0; ]])], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) bzflag-2.4.2+ds1/m4/stage.m4000066400000000000000000000050211200563112200153220ustar00rootroot00000000000000# S T A G E . M 4 # BRL-CAD # # Copyright (c) 2005-2010 United States Government as represented by # the U.S. Army Research Laboratory. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # # 3. The name of the author may not be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ### # # Changes: # # 2007-04-28 imported into bzflag and macros renamed with BZ prefix # ### # # BZ_BOLD # BZ_UNBOLD # # sets and unsets the output to bold for emphasis # # # BZ_CONFIGURE_STAGE # # outputs status on the the specified configure stage being started. # ### AC_DEFUN([BZ_BOLD], [ if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %B elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %B fi fi ]) AC_DEFUN([BZ_UNBOLD], [ if test -t 1 ; then if test -f "${srcdir}/sh/shtool" ; then ${srcdir}/sh/shtool echo -n -e %b elif test -f "${srcdir}/misc/shtool" ; then ${srcdir}/misc/shtool echo -n -e %b fi fi ]) AC_DEFUN([BZ_CONFIGURE_STAGE], [ _bc_stage="[$1]" _bc_status="[$2]" _bc_stage="`echo $_bc_stage | sed 's/\(.\)/\1 /g'`" BZ_BOLD AC_MSG_CHECKING([... $_bc_stage]) AC_MSG_RESULT([($_bc_status)]) BZ_UNBOLD ]) # Local Variables: # mode: m4 # tab-width: 8 # standard-indent: 4 # indent-tabs-mode: t # End: # ex: shiftwidth=4 tabstop=8 bzflag-2.4.2+ds1/man/000077500000000000000000000000001200563112200142125ustar00rootroot00000000000000bzflag-2.4.2+ds1/man/Makefile.am000066400000000000000000000012451200563112200162500ustar00rootroot00000000000000man_MANS = bzadmin.6 bzflag.6 bzfs.6 bzw.5 if HASPOD2MAN noinst_MANS = bzfquery.6 endif EXTRA_DIST = bzadmin.6.in bzflag.6.in bzfs.6.in bzw.5.in bzfquery.6: $(top_srcdir)/misc/bzfquery.pl pod2man $(top_srcdir)/misc/bzfquery.pl > $@ edit = sed \ -e 's|@BZFLAG_DATE[@]|$(BZFLAG_DATE)|g' \ -e 's|@BZFLAG_VERSION[@]|$(BZFLAG_VERSION)|g' \ -e 's|@INSTALL_DATA_DIR[@]|$(pkgdatadir)|g' bzflag.6 bzadmin.6 bzfs.6 bzw.5 : Makefile $(edit) '$(srcdir)/$@.in' >$@ bzflag.6: $(srcdir)/bzflag.6.in bzadmin.6: $(srcdir)/bzadmin.6.in bzfs.6: $(srcdir)/bzfs.6.in bzw.5: $(srcdir)/bzw.5.in CLEANFILES = bzadmin.6 bzflag.6 bzfquery.6 bzfs.6 bzw.5 MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/man/Makefile.in000066400000000000000000000410231200563112200162570ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = man DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man5dir = $(mandir)/man5 am__installdirs = "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man6dir)" man6dir = $(mandir)/man6 NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = bzadmin.6 bzflag.6 bzfs.6 bzw.5 @HASPOD2MAN_TRUE@noinst_MANS = bzfquery.6 EXTRA_DIST = bzadmin.6.in bzflag.6.in bzfs.6.in bzw.5.in edit = sed \ -e 's|@BZFLAG_DATE[@]|$(BZFLAG_DATE)|g' \ -e 's|@BZFLAG_VERSION[@]|$(BZFLAG_VERSION)|g' \ -e 's|@INSTALL_DATA_DIR[@]|$(pkgdatadir)|g' CLEANFILES = bzadmin.6 bzflag.6 bzfquery.6 bzfs.6 bzw.5 MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man5: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" @list=''; test -n "$(man5dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } install-man6: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man6dir)" || $(MKDIR_P) "$(DESTDIR)$(man6dir)" @list=''; test -n "$(man6dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.6[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man6dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man6dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man6dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man6dir)" || exit $$?; }; \ done; } uninstall-man6: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man6dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.6[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man6dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man6dir)" && rm -f $$files; } tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man6dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man5 install-man6 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man5 uninstall-man6 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man5 \ install-man6 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-man uninstall-man5 \ uninstall-man6 bzfquery.6: $(top_srcdir)/misc/bzfquery.pl pod2man $(top_srcdir)/misc/bzfquery.pl > $@ bzflag.6 bzadmin.6 bzfs.6 bzw.5 : Makefile $(edit) '$(srcdir)/$@.in' >$@ bzflag.6: $(srcdir)/bzflag.6.in bzadmin.6: $(srcdir)/bzadmin.6.in bzfs.6: $(srcdir)/bzfs.6.in bzw.5: $(srcdir)/bzw.5.in # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/man/bzadmin.6.in000066400000000000000000000120201200563112200163250ustar00rootroot00000000000000.\" bzflag .\" Copyright (c) 1993-2012 Tim Riker .\" .\" This package is free software; you can redistribute it and/or .\" modify it under the terms of the license found in the file .\" named COPYING that should have accompanied this file. .\" .\" THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .TH "bzadmin" "6" "@BZFLAG_DATE@" "bzadmin-@BZFLAG_VERSION@" "BZFlag" .SH "NAME" bzadmin \- a text based client for BZFlag .SH "SYNOPSIS" .B bzadmin [\fB\-help\fR] [\fB\-hide \fR\fImsgtype\fR[\fI,msgtype\fR]...\fR] [\fB\-show \fR\fImsgtype\fR[\fI,msgtype\fR]...\fR] [\fB\-ui \fR{\fIcurses\fR | \fIstdboth\fR | \fIstdin\fR | \fIstdout\fR}] \fIcallsign\fR[\fI:password\fR]\fI@hostname\fR[\fI:port\fR] [\fIcommand\fR] [\fIcommand\fR] ... .SH "DESCRIPTION" .B bzadmin is a textbased client for the game BZFlag. It can't be used for playing, but it can be used to see when players join and leave the game, to see the chat messages, and to send messages and commands to the server, as well as see several other vital game messages. .PP When you start bzadmin without any command line options other than callsign and hostname a simple curses\-based user interface will be started (unless you built bzadmin without curses support). This interface is divided into three rectangles; the output window (which covers almost all of the terminal), the target window, and the input window. .PP The output window is where messages from the server will be shown. .PP The target window shows the name of the player that will receive your next message, or 'all' if it will be a public message. You can change target by using the left and right arrow keys. .PP The input window is where you type your messages. It also supports tab completion of commands and callsigns. You can clear the input window with the key combination \fBCtrl\-U\fR, and you can generate a \fB/kick\fR command for the current target with the F5 key (if the current target is a player). You can also generate a ban command for the current target with the F6 key, but this only works if you are an admin and the server has sent you that players IP address (as a response to a \fB/playerlist\fR command). .PP The curses user interface also has a simple menu system where you can edit the server variables (if you are an admin) and see a player list. If you are an admin you can also see the IP addresses in the player list, if you have sent a \fB/playerlist\fR command. The menu shows up when you hit the F2 key. It only covers the upper half of the screen, so you can still see what's going on in the game. You can navigate through the menu with the up and down arrow keys, and use the enter key to select submenus and other menu items. If you hit F2 again the command prompt will regain keyboard focus, but the menu will still be visible. If you hit F2 a third time the menu will go away. .SS Options .RS .TP 15 .B \-help Show a simple help text. .TP \fB\-hide \fR\fImsgtype\fR[\fI,msgtype\fR]... Tell bzadmin not to show these message types. The available message types are chat, join, kill, leave, pause, ping, rabbit, spawn, time, and over. By default chat, join, kill, leave, pause, and rabbit are shown. You can also change this while bzadmin is running with the commands \fB/show \fR and \fB/hide \fR, and from the curses menu. .TP \fB\-show \fR\fImsgtype\fR[\fI,msgtype\fR]... Tell bzadmin to show these message types. See \fB\-hide\fR for a list of available message types. If a message type is listed both in \fB\-show\fR and \fB\-hide\fR it will not be shown. .TP \fB\-ui \fR{\fIcurses\fR | \fIstdboth\fR | \fIstdin\fR | \fIstdout\fR} Select the user interface that you want. The curses interface is the default, and it is described above. .br The stdin interface reads user commands from the standard in stream and sends them to the server. All server output is ignored. .br The stdout interface prints all server output to the standard out stream. All user input is ignored. .br The stdboth interface is a combination of stdin and stdout \- it prints server output to the standard out stream, and reads user commands from the standard in stream. .TP \fIcallsign\fR[\fI:password\fR]\fI@hostname\fR[\fI:port\fR] Specifies the callsign that you want your client to use, and the hostname where the BZFlag server is. The port number is optional, and the default value is 5154. .TP \fIcommand\fR You can specify messages and commands to send to the server on the command line. BZAdmin will continue running after sending the specified commands. .RE .SS Examples .RS .TP 15 \fBbzadmin admin@localhost:5154\fR .br Join the game on localhost, port 5154, using the callsign 'admin'. .TP \fBbzadmin admin@localhost '/passwd secretpass' '/ban 192.168.0.2' .br Connect to the server at localhost and ban the IP 192.168.0.2. .TP \fBbzadmin \-ui stdout spy@bzserver.xy | grep magicword\fR Connect to bzserver.xy and print all server messages that contain 'magicword'. .RE .SH "SEE ALSO" bzfs(6), bzflag(6), bzw(5) bzflag-2.4.2+ds1/man/bzflag.6.in000066400000000000000000000705301200563112200161600ustar00rootroot00000000000000.\" bzflag .\" Copyright (c) 1993-2012 Tim Riker .\" .\" This package is free software; you can redistribute it and/or .\" modify it under the terms of the license found in the file .\" named COPYING that should have accompanied this file. .\" .\" THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .TH "bzflag" "6" "@BZFLAG_DATE@" "bzflag-@BZFLAG_VERSION@" "BZFlag" .SH "NAME" BZFlag \- a tank battle game .SH "SYNOPSIS" .B bzflag [\fB\-badwords \fIfilterfile\fR] [\fB\-config \fIfilename\fR] [\fB\-configdir \fIdirectoryname\fR] [\fB\-d | \-debug\fR] [\fB\-date \fImm/dd/yyyy\fR] [\fB\-dir | \-directory \fIdirectory\fR] [\fB\-e | \-echo\fR] [\fB\-ea | \-echoAnsi\fR] [\fB\-h | \-help | \-\-help\fR] [\fB\-latitude \fIlatitude\fR] [\fB\-list \fIlist\-server\-url\fR] [\fB\-locale \fIlocale\fR] [\fB\-longitude \fIlongitude\fR] [\fB\-m | \-mute\fR] [\fB\-motd \fIURL\fR] [\fB\-multisample\fR] [\fB\-nolist\fR] [\fB\-nomotd\fR] [\fB\-notime\fR] [\fB\-solo \fInumber\-of\-robots\fR] [\fB\-team \fR{\fIautomatic\fR | \fIred\fR | \fIgreen\fR | \fIblue\fR | \fIpurple\fR | \fIrogue\fR}] [\fB\-time \fIhh:mm:ss\fR] [\fB\-v | \-version | \-\-version\fR] [\fB\-view \fR{\fInormal\fR | \fIstereo\fR | \fIstacked\fR | \fIthree\fR | \fIanaglyph\fR}] [\fB\-window \fIwidth\fR\fBx\fR\fIheight\fR[{\fB+\fR|\fB\-\fR}x{\fB+\fR|\fB\-\fR}y]] [\fB\-zbuffer \fR{\fIon\fR | \fIoff\fR}] [[\fIcallsign\fR[\fI:password\fR]\fI@\fR]\fIserver\fR[\fI:port\fR]] .SH "DESCRIPTION" .B BZFlag is a 3D multi\-player tank battle game that allows users to play against each other in a networked environment. There are five teams: red, green, blue, purple and rogue (rogue tanks are black). Destroying a player on another team scores a win, while being destroyed or destroying a teammate scores a loss. Rogues have no teammates (not even other rogues), so they cannot shoot teammates and they do not have a team score. .PP There are three main styles of play: capture\-the\-flag, free\-for\-all, and rabbit\-hunt. In capture\-the\-flag, each team (except rogues) has a team base and each team with at least one player has a team flag. The object is to capture an enemy team's flag by bringing it to your team's base. This destroys every player on the captured team, subtracts one from that team's score, and adds one to your team's score. In free\-for\-all, there are no team flags or team bases. The object is simply to get as high a score as possible. In rabbit\-hunt, the lead player is chosen as the target for all other players. When the rabbit (target) is destroyed, the live player with the next highest score becomes the rabbit. The object is to remain the rabbit for as long as possible. The rabbit is marked as a white tank. .SS Joining a Game .PP To get quickly started, select the "Join Game" menu in the BZFlag client using the arrow keys on your keyboard. Choose the "Select a Server" link and pick one of the servers near the top of the menu. This should take you back to the "Join Game" menu where you should then provide a callsign. Select the "Connect". Within a few seconds you should be on that server ready to play. .PP BZFlag includes a global registration system that allows players to register a callsign that defines them uniquely on the BZFlag network. Some servers require registration for all users, some require it to obtain administrative abilities. If you attempt to use a callsign that is already registered, you may be denied access to a server. See http://my.B ZFlag.org/bb/ for details regarding callsign registration and to check on available names. Once registered, you will be able to provide your password in the "Join Game" menu and have it used for authentication. You are encouraged to register your callsign. .PP There are generally public BZFlag servers running around the clock all around the world, available over the Internet. Similarly, private servers can be set up for running local network games. See the bzfs manual page (bzfs.6) for details on starting a new server, public or private. .SS Options .TP 15 \fB\-badwords\fI filterFile\fR Specify a file containing bad words to be replaced with !@#$%^&* characters when they appear in chat. .TP \fB\-d or \-debug\fR Adds some diagnostic output. Can be specified multiple times to increase verbosity. .TP \fB\-dir or \-directory\fI directory\fR Looks for data files in \fIdirectory\fR first. This defaults to a directory named \fIdata\fR in the current directory. If not found there, the game looks for data files in the current directory, then in the default installation location \fI@INSTALL_DATA_DIR@\fR. .TP .B \-config Specify the configuration file to load. The name is relative to the default configuration directory. This is usually only used by developers. .TP .B \-configdir Specify the configuration directory to use. This will be the default config directory used by this instance of the game. This is really only needed if you can not use the default directory. .TP \fB\-date\fI mm/dd/yyyy\fR Specifies the date for positioning celestial objects. This option is available only when \fBbzflag\fR is compiled with debugging enabled. .TP .B \-e, \-echo Copies all message window output to the shell on *nux and OSX, to stdout.txt on windows .TP .B \-ea, \-echoAnsi Copies all message window output like \-echo preserving the ANSI color coding on *nix, same as \-echo on windows. .TP .B \-h, \-help, \-\-help Prints a concise list of the \fBbzflag\fR command line options. .TP \fB\-latitude\fI latitude\fR Uses \fIlatitude\fR when computing celestial object positions. .TP \fB\-list\fI url\fR Look for list servers using \fIurl\fR. A built\-in url is used by default (the same url is the default for \fBbzfs\fR). If \fIurl\fR is \fIdefault\fR then the url is reset to the built\-in url (the url is remembered across invocations of \fBbzflag\fR). list servers keep a list of \fBbzfs\fR servers accessible from the internet and are queried when using the Find Server menu. .TP \fB\-locale\fI locale\fR Set the locale used to display messages, menus, hud alerts, etc. .TP \fB\-longitude \fIlongitude\fR Uses \fIlongitude\fR when computing celestial object positions. .TP .B \-m, \-mute Disables sound. .TP \fB\-motd \fIURL\fR Specify an alternate URL for the message of the day displayed when \fBbzflag\fR starts. http://bzflag.org/motd.php is the default. See \fB\-nomotd\fR. .TP .B \-multisample Uses a multisample buffer for rendering. If multisampling isn't available then the application will terminate. .TP .B \-nolist Disables list server querying. See \fB\-list\fR. .TP .B \-nomotd Disables queries for the message of the day when \fBbzflag\fR starts. .TP .B \-notime Removes a previously set fixed time for celestial object positions. See \fB\-time\fR. .TP \fB\-solo\fI number\-of\-robots\fR When you join a game, you'll also cause \fInumber\-of\-robots\fR robots to join too. This is an experimental option and the robots are extremely stupid players. Robots are added to teams at random. .TP \fB\-team\fI team\-name\fR Chooses the player's team. If there are no team positions available and the team\-name is set to be automatic, the player will try to join as an observer. .TP \fB\-time \fIhh:mm:ss\fR Specifies the local time used for positioning celestial objects, which will remain fixed rather than move through the sky as the day advances. Use \fB\-notime\fR to undo this setting. .TP .B \-v, \-version, \-\-version Prints the version number of the executable. .TP \fB\-view \fR{\fInormal\fR | \fIstereo\fR | \fIstacked\fR | \fIthree\fR | \fIanaglyph\fR} Chooses one of the possible display options. \fINormal\fR will render a single view to the entire screen. \fIStereo\fR will try to allocate a stereo (in\-a\-window) capable buffer and then draw a single view in stereo. Your system must support stereo\-in\-a\-window buffers. \fIThree\fR will render the front view to the upper right quadrant of the display, a left view to the lower left quadrant, and a right view to the lower right quadrant. This is intended for systems capable of driving multiple monitors from various areas of the display surface, yielding a wrap around view. \fIstacked\fR will render the two right eye view on the upper half of the display and the left eye on the lower half. \fIanaglyph\fR supports red\-cyan stereo viewing glasses. Note that setting an unsupported view option will often lead to BZFlag not running successfully. To correct this, run with \-view normal. .TP .B \-window\fI width\fBx\fIheight\fR Runs the application in a window instead of full screen. Specify the width and height of the window after the option. .TP \fB\-zbuffer\fR {\fIon\fR | \fIoff\fR} When \fIoff\fR is chosen the game will not attempt to allocate a depth (z) buffer and will use a different rendering technique for hidden surface removal. Some systems may be capable of using a higher screen resolution if a depth buffer isn't allocated. .TP [\fIcallsign\fR[\fI:password\fR]\fI@\fR]\fIserver\fR[\fI:port\fR] Specifies the callsign you want, and the host running the \fBbzfs\fR server. Multiple independent games can be run on a single network, or even on different ports on a single computer. Which server and port you choose decides which game you enter. The callsign and the port are optional. If you don't specify a port the standard server port will be used, and if you don't specify a callsign the callsign used for the previous game is used. If that cannot be found then the callsign is the value of the \fBBZFLAGID\fR environment variable. If \fBBZFLAGID\fR is empty or undefined then \fBbzflag\fR will prompt for a callsign when joining a game. .SS Controls Tanks are controlled by moving the mouse within the large yellow box in the main view. When the mouse is inside the small yellow box, the tank is motionless. The large box is the limit of the tank's speed. .PP Shots are fired by pressing the .I R "left mouse button". The type of shot fired depends on what flag the tank has. Normal shots last about 3.5 seconds. Reloading also takes 3.5 seconds for normal shots. .PP Pressing the .I R "middle mouse button" drops a flag. Nothing will happen if the tank has no flag or is not allowed to drop the flag for some reason (e.g. it's a bad flag). Flags are picked up by driving over them. A dropped flag gets tossed straight up; it falls to the ground in about 3 seconds. .PP Pressing the .I R "right mouse button" identifies the closest player centered in the view. If your tank has the guided missile super\-flag, this will also lock the missile on target. However, the target must be carefully centered for the missile to lock. .PP When the server allows jumping or if the tank has the jumping flag, the .I R Tab key jumps. Tanks can jump onto buildings, however there is no way to shoot downward (or upward) with a regular shot. The guided missile and the shock wave are two ways of destroying a tank on or from a building. .PP The current radar range can be changed by pressing the .I R 1, .I R 2, or .I R 3 keys above the alphabetic keys for low, medium, and long range, respectively. The .I R f key toggles the flag help display, which describes the flag in the tank's possession. Displaying help does .B not pause the game. .PP The .I R Pause key pauses and resumes play. When paused, the tank cannot be destroyed nor can its shots destroy other players. The reload countdown is suspended and the radar and view are blanked when paused. A paused tank has a transparent black sphere surrounding it. Since a paused tank is invulnerable a player could cheat by pausing just before being destroyed, so there's a brief delay before the pause takes effect. This delay is long enough to make pausing effectively useless for cheating. Pressing .I R Pause before the pause takes effect cancels the pause request. .PP The .I R Delete key initiates a self destruct sequence. You will see a countdown that can be stopped by pressing .I R Delete once more. Otherwise, you tank will self destruct. This can be useful if your tank gets stuck and there is no other tank around to shoot you. .PP The list of players and scores is displayed when your tank is paused or dead. Pressing the .I R s key toggles the score display when alive and not paused. .PP The .I R b key toggles binoculars, which gives a close up view of distant objects. The .I R 9 key toggles Otto, the automatic pilot, on and off. .I R t key toggles the frame rate display and the .I R y key toggle the frame time display. The time of day can be changed with the .I R plus and .I R minus keys, which advance and reverse the time by 5 minutes, respectively. The time of day in the game is initialized to the system's clock. In addition, the latitude and longitude are used to calculate the positions of celestial objects. .PP The .I R Esc key shows the game menu. Use the .I R Enter and arrow keys to navigate the menu and the .I R Esc key to return to the previous menu or hide the main menu. The menus allow you to start a new server, join a game, leave a game and enter another, change the rendering options, change the display resolution, change the sound volume, remap the meanings of keys, browse online help, and quit the game. .PP The display resolution is not always available for changing. If it is, use the .I R t key to test a selected resolution; it will be loaded for a few seconds and then the previous resolution restored. Press the .I R Enter key to permanently select a new resolution. When you quit the game, the resolution is restored to what it was before the game started. .PP Options are recorded between game sessions in the .bzf//config.cfg file (or config.cfg.${HOST} if the \fIHOST\fR environment variable is defined) in the user's home directory. This file has a simple name/value pair format. This file is completely rewritten by the game after each session. .PP You can send typed messages to other players by pressing the .I R m or .I R n keys. The .I R m key will send a message to your teammates only. Rogue players cannot send these messages. The .I R n key will send a message to all the other players. After pressing the key, just type your message and press enter or Control\-D. To cancel a message, you can enter a blank message or press Delete, Escape, or Control\-C. Be careful with the Escape key; pressing Escape once will cancel the message, pressing it again will show the main menu. Backspace will delete the most recently typed character. The Tab key doesn't add a tab to the message but instead causes the tank to jump (as usual). You can also send a direct message to a single player by pressing the .I R , or .I R . keys. The .I R , key will send your message to your 'nemesis', i.e. the last player who killed you or was killed by you. The .I R . key will send a private message to another player. You can choose the recipient by using the left and right arrow keys. .I R o toggles the quick\-admin interface. Use the arrow keys to select a command, and then fill in the necessary parameters .SS Scoring An individual's score is the difference between that player's wins and losses. A win is scored for each enemy tank destroyed. A loss is scored for each teammate destroyed and for each time the player is destroyed. The score sheet displays each player's score and the number of wins and losses. .PP A team's score is calculated differently depending on the game style. In the capture\-the\-flag style, the team score is the number of enemy flags captured minus the number of times the team's flag was captured. Capturing your own flag (by taking it onto an enemy base) counts as a loss. In the free\-for\-all style, the team score is sum of the wins of all the players on the team minus the sum of the losses of all the players on the team. In the rabbit\-hunt style, scoring is similar to free\-for\-all. .PP The score sheet also lists the number times you have destroyed or been destroyed by each other player under the \fIKills\fR heading. This lets you compare your one\-on\-one performance against other players. .SS Teleporters The server can be configured to place teleporters in the game. A teleporter is a tall black transparent object that instantaneously moves any object (tanks and shots) passing through it to some other teleporter. The teleporter connections are fixed for the entire game. In the capture\-the\-flag style the connections are always the same. In the free\-for\-all style the connections are random and reversible (going back through where you come out puts you back where you started). .PP Each side of a teleporter teleports independently of the other side. However, it's possible for each side to go to the other. This is a through\-teleporter and it's almost as if it weren't there. It's also possible for a side to teleport to itself. This is a reverse\-teleporter. Shooting at a reverse teleporter is likely to be self\-destructive. Shooting a laser at a reverse teleporter is invariably fatal. .SS Radar The radar is displayed on the left side of the control panel. It provides a satellite view of the game. Buildings and the outer wall are light blue. Team bases are outlined squares in the team colors. Teleporters are short yellow lines. Tanks are dots the in the tank's team color, except for rogues which are yellow. The size of a tank's dot is a rough indication of the tank's altitude: higher tanks have larger dots. Flags are small crosses. Team flags have the team color while super\-flags are white. Shots are small white dots (except laser beams which are line segments and shock waves which are circles). .PP The tank always appears in the center of the radar and the radar display rotates with the tank so that forward is always up. There's a small tick mark indicating forward. The left and right extremes of the current view are represented by a yellow V whose tip is at the center of the radar. North is indicated by the letter N. .SS Heads Up Display The heads\-up\-display, or HUD, has several displays. First, there are two boxes in the center of the view. As explained above, these delimit the ranges for the mouse. These boxes are yellow when you have no flag. Otherwise they take the color of the flag you're holding (white for superflags). .PP Above the larger box is a heading tape showing your current heading. North is 0, east is 90, etc. If jumping is allowed, an altitude tape appears to the right of the larger box. .PP Small colored diamonds or arrows may appear on the heading tape. An arrow pointing left means that a particular flag is to your left, an arrow pointing right means that the flag is to your right, and a diamond indicates the heading to the flag by its position on the heading tape. In capture\-the\-flag mode a marker in your team's color is always present, showing you the direction to your team's flag. A yellow marker shows the way to the antidote flag (when you have a bad flag and antidote flags are enabled). .PP At the top of the HUD are several text readouts. At the very top on the left is your callsign and score, in your team's color. At the very top on the right is the name of the flag you're holding (or nothing if you have no flag). In the center at the top is your current status: ready, dead, sealed, zoned, or reloading. If you have a bad flag and shaking time is enabled and your status is ready, the status displays how much time is left before the bad flag is shaken. When reloading, the time until you're reloaded is displayed. A tank is sealed when it has the oscillation overthruster flag and any part of the tank is inside a building. A tank is zoned when it has the phantom zone flag and has passed through a teleporter. When there's a time limit on the game, the time left in the game is displayed to the left of the status. .SS Flags Team flags are supplied by the server in the capture\-the\-flag style game. While at least one player is on a team, that team's flag is in the game. When captured, the flag is returned to the team's base. If the flag is dropped in a Bad Place, it is moved to a safety position. Bad Places are: on top of a building or on an enemy team base. The flag can be dropped on a team base only by a player from a third team; for example, when a blue player drops the red flag on the green base. .PP A team flag is captured when a tank takes an enemy flag onto its base or when a tank takes its flag onto an enemy base (even if there's no one playing on that team). You must be on the ground to capture a flag. .PP The server can be configured to supply a fixed or random set of super\-flags. These flags are white and come in many flavors. However, you cannot tell what a super\-flag is until it's picked up. There are two broad categories of super\-flags: good and bad. Good super\-flags may be dropped and will remain for up to 4 possessions. Bad super\-flags are sticky \-\- in general, they cannot be dropped. The server may provide a yellow antidote flag. Driving over it will release the bad flag. The server may also allow a timeout and/or a number of wins to shake the flag. Scoring the required number of wins, surviving the required amount of time or being destroyed will automatically drop the flag. Bad flags disappear after the first possession. .PP Here is a brief description of each good superflag with the flag's code in parentheses: .TP 15 .B High Speed (V) Boosts top speed by 50%. .TP .B Quick Turn (QT) Boosts turn rate by 50%. .TP .B Agility (A) Improves a tank's dodging capabilities. .TP .B Oscillation Overthruster (OO) Let's the tank go through buildings. You cannot back up in or into a building, nor can you shoot while inside. .TP .B Rapid Fire (F) Increases shot speed and decreases range and reload delay. .TP .B Machine Gun (MG) Increases shot speed and dramatically decreases range and reload delay. .TP .B Guided Missile (GM) Shots guide themselves when locked on. The missile can be retargeted at any time during its flight (with the right mouse button). This allows the player some control over the missile's steering. .TP .B Laser (L) Shoots a laser, with effectively infinite speed and range. Just point and shoot. The binoculars are handy for lining up distant targets. The downside (you knew it was coming) is that the reload time is doubled. .TP .B Ricochet (R) Shots reflect off walls. It is exceptionally easy to kill yourself with this flag. .TP .B Super Bullet (SB) Shots can go through buildings (possibly destroying a tank with the oscillation overthruster flag) and can also destroy (phantom) zoned tanks. .TP .B Stealth (ST) Tank becomes invisible on radar but is still visible out\-the\-window. .TP .B Cloaking (CL) Tank becomes invisible out\-the\-window but is still visible on radar. .TP .B Invisible Bullet (IB) Shots are invisible on radar (except your own). They are visible out\-the\-window. Sort of stealth for shots. .TP .B Tiny (T) Tank becomes much smaller and harder to hit. .TP .B Narrow (N) Tank becomes paper thin. It's very hard (but not impossible) to hit a narrow tank from the front or back. However, the tank is as long as usual so hitting it from the side has normal difficulty. .TP .B Shield (SH) Getting shot while in possession of this flag simply drops the flag (instead of destroying the tank). Since the flag may not disappear you may want to wait around for it to fall to the ground so you can grab it again, but, be warned, the shield flag flies for an extra long time (longer than the normal reload time). .TP .B Steamroller (SR) Tank can destroy other tanks by driving over them (but you must get quite close). .TP .B Shock Wave (SW) Tank doesn't fire shells. Instead it sends out a shock wave in all directions. Any tank caught in the wave is destroyed (including tanks on or in buildings). .TP .B Phantom Zone (PZ) Driving through a teleporter phantom zones the tank. A zoned tank cannot shoot, but can drive through buildings and cannot be destroyed except by a Super Bullet or a Shock Wave (or if the team's flag is captured). .TP .B Genocide (G) Destroying any tank on a team destroys every player on that team. .TP .B Jumping (JP) Allows the tank to jump. You cannot steer while in the air. .TP .B Identify (ID) Displays the identity of the closest flag in the vicinity. .TP .B Masquerade (MQ) You tank looks like a teammate when viewed out of the window. Bullets, radar and targeting reveal your true identity. .TP .B Burrow {BU} You tank burrows into the ground up to your muzzle, making you impervious to normal shots, as they sail above you. However your tank controls are sluggish, and anyone, no matter what flag they have, can crush you like. .TP .B Seer (SE) See Stealthed, Cloaked and Masqueraded tanks as normal, as well as Invisible Bullets. .TP .B Thief (TH) Tank is small and fast, when you shoot an opponent, he is not killed, but instead, you steal his flag. .TP .B Useless (US) It's useless! .TP .B Wings (WG) Tank can drive around in the air, and may be able to jump multiple times. This can be useful when jumping or falling. .PP A brief description of each bad superflag with the flag's code in parentheses: .TP 15 .B Colorblindness (CB) Prevents tank from seeing any team information about other tanks. You have to be careful to avoid shooting teammates. .TP .B Obesity (O) The tank becomes very large and easy to hit. It's so big that it can't fit through teleporters. .TP .B Left Turn Only (<\-) Prevents the tank from turning right. .TP .B Right Turn Only (\->) Prevents the tank from turning left. .TP .B Forward Only (FO) Prevents the tank from going backwards. .TP .B Reverse Only (RO) Prevents the tank from going forward. .TP .B Momentum (M) Gives the tank a lot of inertia. .TP .B Blindness (B) Blanks the out\-the\-window view. The radar still works. It is effectively impossible to detect any tank with Stealth; shooting a Stealth with Blindness is the stuff legends are made of. .TP .B Jamming (JM) Disables the radar but you can still see. .TP .B Wide Angle (WA) Gives the tank a fish eye lens that's rather disorienting. .TP .B No Jumping (NJ) Tank is not allowed to jump. .TP .B Trigger Happy (TR) Tank can't stop shooting. Watch out for that ricochet. .TP .B Reverse Controls (RC) Tank driving controls are reversed from their usual behavior. .SS Observing If a server is full or if you just want to watch a battle without interfering in it, you can use the observer mode. To join a server as an observer, select .I R Observer as your tank's team. The maximum number of observers can be restricted by the server admin, so you might still not be able to join a full server. .PP When in observer mode, you can freely roam the world. Using the arrow keys you can rotate the camera in every direction. Holding shift and using the arrow keys moves the camera left, right, forward or back. Pressing the up or down arrow while holding the .I R ALT key will change the camera's altitude. The .I R F9 and .I R F10 keys change the camera's focal lengths, giving a zoom effect. The .I R F11 key will reset the zoom. Pressing .I R l lets you toggle the display of tank labels. .PP Repeatedly pressing .I R F8 cycles through different roaming modes: \fIfree\fR, \fItracking\fR, \fIfollowing\fR, \fIfirst person (driving with)\fR and \fItracking team flag\fR. In \fItracking\fR mode, the camera will automatically look at a tank. You can cycle through available tanks with the .I R F6 and .I R F7 keys. In \fIfollow\fR mode, the camera is positioned right behind the targeted tank, whereas you actually look from within the tank when using \fIfirst person\fR mode. The last mode, \fItrack team flag\fR is only available in capture\-the\-flag games and will track the team flags. Again, use .I R F6 and .I R F7 to choose which flag to track. One special option that can be used with \fIfollow\fR, \fItracking\fR, and \fIfirst person\fR modes is that you can choose to do it with the winning tank. This is selected by cycling through the tanks until you see the \fRwinner\fR option. In this mode, you will always be engaged with whoever has the best score (and is alive). The default is \fIdrive with winner\fR mode. .SH "User Commands" The following commands can be executed by sending a message to all and using these strings as the message .TP 15 SILENCE \fIplayerName\fR Does not display any message coming from player with \fIplayerName\fR name .TP 15 UNSILENCE \fIplayerName\fR Reshow messages coming from player with \fIplayerName\fR name .TP 15 SAVEWORLD \fIfilename\fR Save the current world to \fIfilename\fR. .SH "FILES" .TP 15 ~/.bzf//config.cfg Stores options between game sessions. Used when HOST is not defined. .TP 15 ~/.bzf//config.cfg.${HOST} Stores options between game sessions. Used when HOST is defined. .SH "SEE ALSO" bzadmin(6), bzfs(6), bzw(5) bzflag-2.4.2+ds1/man/bzfs.6.in000066400000000000000000001151621200563112200156600ustar00rootroot00000000000000.\" bzflag .\" Copyright (c) 1993-2012 Tim Riker .\" .\" This package is free software; you can redistribute it and/or .\" modify it under the terms of the license found in the file .\" named COPYING that should have accompanied this file. .\" .\" THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .TH "bzfs" "6" "@BZFLAG_DATE@" "bzfs-@BZFLAG_VERSION@" "BZFlag" .SH "NAME" bzfs \- BZFlag game server .SH "SYNOPSIS" .B bzfs [\fB\-a \fIlinear\fR \fIangular\fR] [\fB\-adminlagannounce \fR\fImilliseconds\fR] [\fB\-admsg \fImessage\fR] [\fB\-advertise \fIgroupname\fR[\fI,groupname\fR]...] [\fB\-autoTeam\fR] [\fB\-b\fR] [\fB\-badwords \fIbadwordfile\fR] [\fB\-ban \fIip\fR[\fI,ip\fR]...] [\fB\-banfile \fIfilename\fR] [\fB\-c\fR] [\fB\-cache \fIworldCacheURL\fR] [\fB\-cacheout \fIfilename\fR] [\fB\-conf \fIconfigfile\fR] [\fB\-cr] [\fB\-d\fR] [\fB\-density \fR\fInum\fR] [\fB\-disableBots\fR] [\fB\+f \fR{\fIgood\fR|\fIbad\fR|\fIteam|\fR|\fIflag\-id\fR}[\fI{count}\fR]] [\fB\-f \fR{\fIgood\fR|\fIbad\fR|\fIflag\-id\fR}] [\fB\-fb\fR] [\fB\-filterCallsigns\fR] [\fB\-filterChat\fR] [\fB\-filterSimple\fR] [\fB\-g\fR] [\fB\-groupdb \fIfile\fR] [\fB\-h\fR] [\fB\-handicap\fR] [\fB\-help\fR] [\fB\-helpmsg \fIfile\fR \fIname\fR] [\fB\-i \fIinterface\fR] [\fB\-j\fR] [\fB\-jitterdrop \fIwarn\-count\fR] [\fB\-jitterwarn \fR\fImilliseconds\fR] [\fB\-lagannounce \fR\fImilliseconds\fR] [\fB\-lagdrop \fIwarn\-count\fR] [\fB\-lagwarn \fR\fImilliseconds\fR] [\fB\-masterBanURL \fIURL\fR] [\fB\-maxidle \fR\fIseconds\fR] [\fB\-mp \fR{\fIcount\fR\~|\~[\fIrogue-count\fR]\fB,\~\fR[\fIred-count\fR]\fB,\~\fR[\fIgreen-count\fR]\fB,\~\fR[\fIblue-count\fR]\fB,\~\fR[\fIpurple-count\fR]\fB,\~\fR[\fIobserver-count\fR]}] [\fB\-mps \fR\fImax\-score\fR] [\fB\-ms \fIshots\fR] [\fB\-mts \fR\fImax\-score\fR] [\fB\-noMasterBanlist\fR] [\fB\-offa\fR] [\fB\-noTeamKills\fR] [\fB\-p \fIport\fR] [\fB\-packetlossdrop \fIwarn\-count\fR] [\fB\-packetlosswarn \fR\fIpercent\fR] [\fB\-passdb \fIfile\fR] [\fB\-passwd \fIpassword\fR] [\fB\-pidfile \fIfilename\fR] [\fB\-poll \fIvariable=value\fR] [\fB\-printscore\fR] [\fB\-publictitle \fIdescription\fR] [\fB\-publicaddr \fIaddress\fR[\fI:port\fR]] [\fB\-publiclist \fIurl\fR] [\fB\-publickey \fIkey\fR] [\fB\-q\fR] [\fB\+r\fR] [\fB\-rabbit \fR[\fBscore\fR|\fBkiller\fR|\fBrandom\fR]] [\fB\-recbuf \fIsize\fR] [\fB\-recbufonly\fR] [\fB\-recdir \fIdirectory\fR] [\fB\-replay\fR] [\fB\-reportfile \fIfilename\fR] [\fB\-reportpipe \fIcommand\fR] [\fB\+s \fIflag\-count\fR] [\fB\-s \fIflag\-count\fR] [\fB\-sa\fR] [\fB\-sb\fR] [\fB\-set \fIname value\fR] [\fB\-sl \fIid num\fR] [\fB\-spamtime \fItime\fR] [\fB\-spamwarn \fIwarnLimit\fR] [\fB\-speedtol \fIfactor\fR] [\fB\-srvmsg \fImessage\fR] [\fB\-st \fItime\fR] [\fB\-sw \fIcount\fR] [\fB\-synctime\fR] [\fB\-t\fR] [\fB\-tftimeout \fItime\-limit\fR] [\fB\-time \fR{\fItime\-limit\fR|\fIending-time\fR}] [\fB\-timemanual\fR] [\fB\-tk\fR] [\fB\-tkkr \fIpercent\fR] [\fB\-trackplayhistory\fR] [\fB\-ts \fR[\fImicros\fR]] [\fB\-UPnP\fR] [\fB\-userdb \fIfile\fR] [\fB\-vars \fIfile\fR] [\fB\-version\fR] [\fB\-world \fIworld\-file\fR] [\fB\-worldsize \fIworld size\fR] .SH "DESCRIPTION" \fBBzfs\fR is the server for \fBBZFlag\fR, and it must be running to play. It can be run on any system on the network (including a player's system or one without graphics). Terminating the server terminates the game in progress. .SH "OPTIONS" .TP 15 \fB\-a \fIlinear angular\fR Sets the maximum linear and angular accelerations. The units are somewhat arbitrary so you'll have to experiment to find suitable values. Positive values will set limits to the acceleration and lower they are, greater is the inertia. Zero or negative values disable acceleration limits. .TP 15 \fB\-adminlagannounce \fImilliseconds\fR Announce players that lag more than \fImilliseconds\fR to admins. .TP \fB\-admsg \fImessage\fR Define a message which will be broadcast to all players every 15 minutes. This option can be used multiple times to define a multiline message. .TP .B \-advertise \fIgroupname,groupname,...\fR Allows control of who can see this server on the server list. Use: \fB\-advertise NONE\fR to make a private server (no one will see the server, but global logins can be used). The default, if \-advertise is not specified, is to allow everyone to see the server. Otherwise, your server will only be listed to members of the groups which you specify, eg: \fB\-advertise JOE,BOB\fR. .TP .B \-autoTeam Automatically assign players to teams when they connect so that there are an equal number of players on all available teams. Players are placed on teams that have the fewest players; otherwise they will be placed on the weakest team. Weakest team is the team with the lowest combined kill ratio. .TP .B \-b When \fB\-c\fR is supplied, this option randomly rotates the buildings. .TP \fB\-badwords \fIbadwordfile\fR Specify a file that contains bad words that will be used when either \fB\-filterCallsigns\fR or \fB\-filterChat\fR is enabled. .TP .B \-ban \fIip\fR[,\fIip\fR]... Prohibits connections from the listed IP addresses. Trailing 255 bytes are treated as mask bytes. .TP \fB\-banfile \fIfilename\fR Specifies the name of a file where bzfs will store the banlist. It will load the banlist from this file when it starts (if the file exists), and write the banlist back to the file when someone gets banned or unbanned. If this option isn't given the banlist will not be saved. .TP .B \-c Enables the capture\-the\-flag style game. By default this allocates one team flag per team. This can be modified see +f team. By default, the free\-for\-all style is used. .TP \fB\-cache \fIworldCacheURL\fR Specifies the URL for the world cache file. This is a binary file that clients will attempt to download before getting the world from the bzfs server. .TP \fB\-cacheout \fIfilename\fR Save the currently specified world into a binary cache file and exit. .TP \fB\-conf \fIconfigfilename\fR Specifies the name of a configuration file to be used to set all of the bzfs options, rather than setting them on the command line. .TP .B \-cr\fR Enables the capture\-the\-flag style game with random map. You can optionally specify a building density by providing a number (default is 5). One team flag per team is provided, but more can be added thru +f team. By default, the free\-for\-all style is used. .TP .B \-d Increase debugging level. If more \-d is given, more debugging info is obtained. .TP \fB\-density \fR\fInum\fR Specify density for buildings, i.e. the higher the integer number, the more buildings you will get. This applies to automatically generated maps only. .TP .B \-disableBots Disallow clients from using the ROGER autopilot or from using robots. .TP \fB+f\fR {\fIgood\fR|\fIbad\fR|\fIteam\fR\fIflag\-id\fR}[\fI{count}\fR] Forces the existence of the given flag. If specified multiple times for the same \fIflag\-id\fR, then that many flags will appear. The \fIgood\fR argument is equivalent to specifying \fB+f\fR once for each kind of good flag. Same goes for the \fIbad\fR argument. The \fIteam\fR argument adds a team flag to each team, assuming that the game style is capture the flag. The optional \fI{count}\fR parameter allows the specification of multiple flags of the same type. Note that the curly braces are required. .TP \fB\-f\fR {\fIgood\fR|\fIbad\fR|\fIflag\-id\fR} Disallows random flags of the given type. Required flags given by the \fB+f\fR option are still provided. The \fIbad\fR argument is equivalent to specifying \fB\-f\fR once for each kind of bad flag. Same goes for \fBgood\fR, but you probably do not want to do that. .br An example of running a server with 40 to 50 flags except genocide would be "+s 40 \-s 50 \-f G". Similarly, "+f good{40} +f bad{10} \-f G{40}" would give you exactly 40 good flags except genocide and 10 of each bad flag. .TP .B \-fb Allow flags on box buildings. .TP .B \-filterCallsigns Turn on the filtering of callsigns and mottos. Callsigns and mottos are compared against bad words provided via \fB\-badwords\fR. .TP .B \-filterChat Turn on the filtering of chat messages. Messages that contain words listed via a \fB\-badwords\fR file are replaced with !@#$%^&* characters. .TP .B \-filterSimple By default, all filtering is aggressive, matching much more than what is strictly listed in a \fB\-badwords\fR file for convenience. Providing this option will make the \fB\-filterCallsigns\fR and \fB\-filterChat\fR comparisons exact match only. .TP .B \-g Quit after serving one game. .TP \fB\-groupdb \fIfile\fR Load groups from file .TP .B \-h Buildings are given random heights. .TP .B \-handicap Players are given a handicap advantage based on their ability in relation to the other players. Handicapped players will have faster tanks and shots. The handicap is determined by the player's score in relation to other players. .TP .B \-help Shows a help page and lists all the valid flag id's. .TP \fB\-helpmsg \fIfile\fR \fIname\fR Create a help message accessible by /help \fIname\fR, which prints the contents of \fIfile\fR. Restricted to 10 lines per help message. .TP \fB\-i \fIinterface\fR Server will listen for and respond to ``pings'' (sent via broadcast) on the given interface. Clients use this to find active servers on the network. This is the TCP/UDP/IP address the server will listen on. .TP .B \-j Allows jumping. .TP \fB\-jitterdrop \fIwarn\-count\fR Kicks players after \fIwarn\-count\fR jitter warnings. .TP \fB\-jitterwarn \fImilliseconds\fR Send warnings to players that jitter more than \fImilliseconds\fR. .TP \fB\-lagannounce \fImilliseconds\fR Announce players that lag more than \fImilliseconds\fR in public. .TP \fB\-lagdrop \fIwarn\-count\fR Kicks players after \fIwarn\-count\fR lag warnings. .TP \fB\-lagwarn \fImilliseconds\fR Send warnings to players that lag more than \fImilliseconds\fR. .TP \fB\-masterBanURL \fIURL\fR Specify alternate URLs for the master ban file to be pulled from. This argument may be provided multiple times. .TP \fB\-maxidle \fIseconds\fR Kick players that did not play longer than \fIseconds\fR. Pausing players are not kicked. If a player uttered a word recently, he will be kicked after thrice the given time. .TP \fB\-mp\fR {\fIcount\fR|[\fIrogue\fR]\fB,\fR[\fIred\fR]\fB,\fR[\fIgreen\fR]\fB,\fR[\fIblue\fR]\fB,\fR[\fIpurple\fR]\fB,\fR[\fIobserver\fR]} Sets the maximum number of players, total or per team. A single value sets the total number of players allowed. Five comma separated values set the maximum for each team. If a count is left blank then no limit is set for that team, except for the limit on the total number of players. Both forms may be provided. For rabbit hunt, the "rogue" value sets the total number of non-observer player, and all other values must be zero. .TP \fB\-mps \fImax\-score\fR Sets a maximum score for individual players. The first player to reach this score is declared the winner and the game is over. .TP \fB\-ms \fIshots\fR Allows up to \fIshots\fR simultaneous shots for each player. This is 1 by default. .TP \fB\-mts \fImax\-score\fR Sets a maximum score for teams. The first team to reach this score is declared the winner and the game is over. .TP .B \-noMasterBanlist Server will not attempt to load the master ban list from the internet. .TP .B \-offa Enables the Open\-Free\-for\-All style game. This is a teamless mode, similar to the classic deathmatch in other games. .TP .B \-noTeamKills Players on the same team are immune to each other's shots. Rogue is excepted. .TP \fB\-p \fIport\fR Listen for game connections on \fIport\fR instead of the default port. Use \fB\-help\fR to print the default port, or use \fB\-d\fR debug printing. .TP \fB\-packetlossdrop \fIwarn\-count\fR Kicks players after \fIwarn\-count\fR packetloss warnings. .TP \fB\-packetlosswarn \fIpercent\fR Send warnings to players that have more more than \fIpercent\fR loss. .TP \fB\-passdb \fIfile\fR Load passwords from file .TP \fB\-passwd \fIpassword\fR Specify a server administrator password for use in remote administration such as /kick, /ban, /mute, etc messages. .TP \fB\-pidfile \fIfilename\fR Specify a file where the server will write its process ID so it may be used for remote administration. .TP \fB\-poll \fIvariable=value\fR Configure several aspects of the in\-game polling system .RS .TP \fBbanTime\fR default number of minutes player should be banned (unspecified, the default is 300) .TP \fBvetoTime\fR max seconds authorized user has to abort poll (default is 20) .TP \fBvotePercentage\fR percentage of players required to affirm a poll (unspecified, the default is 50.1%) .TP \fBvoteRepeatTime\fR minimum seconds required before a player may request another vote (default is 300) .TP \fBvotesRequired\fR minimum number of additional votes required to make a vote valid (default is 2) .TP \fBvoteTime\fR maximum amount of time player has to vote, in seconds (default is 60) .RE .TP .B \-printscore Write score to stdout whenever it changes .TP \fB\-publictitle \fIdescription\fR Advertise this server on the internet with the given \fIdescription\fR. By default, a server will respond to broadcast queries, allowing clients to find servers running on the standard port on the local subnet. The \fB\-publictitle\fR option causes the server to register itself with a list server, which clients can query to get a list of \fBbzfs\fR servers. .TP \fB\-publicaddr \fIaddress\fR[:\fIport\fR] Advertise this server with the given \fIaddress\fR and \fIport\fR. Normally a server advertises itself at the local address and port. Some servers are not accessible from the internet at this address (for example servers behind a firewall using Network Address Translation). Use this option to specify the address and/or port that internet users should use to access this server. .TP \fB\-publiclist \fIurl\fR Advertise this server on the list servers listed at \fIurl\fR. Only has an effect when used with \fB\-publictitle\fR and/or \fB\-publicaddr\fR. A built\-in url is used by default. The \fBBZFlag\fR clients use the same built\-in url so, by default, clients will see public servers automatically. This argument may be provided multiple times to publicize a server to multiple list servers. .TP \fB\-publickey \fIkey\fR Advertise this server on the list server(s) using the specified key. Only has an effect when used with \fB\-publictitle\fR and/or \fB\-publicaddr\fR. .TP .B \-q If specified, the server will not listen for nor respond to ``pings''. \fBBZFlag\fR sends out these pings to give the user a list of available servers. This effectively makes the server private, especially if the \fB\-p\fR option is also used. .TP .B +r Makes most shots ricochet. Super bullets, shock waves, and guided missiles do not. .TP \fB\-rabbit\fR [\fIscore\fR|\fIkiller\fR|\fIrandom\fR] Enables the rabbit\-hunt style game. By default, the free\-for\-all style is used. You must specify the algorithm used to pick a new rabbit when the old one dies. The \fIscore\fR algorithm uses a modified wins/(wins+losses) score and picks the top scoring player to be the new rabbit. The \fIkiller\fR algorithm specifies a reverse tag game where whomever kills the rabbit becomes the new rabbit. The \fIrandom\fR algorithm randomly picks a new rabbit without regard to score. (The \fIscore\fR algorithm is the original behavior.) .TP .B \-recbuf \fIsize\fR Start with the recording buffer active, with the specified size (in megabytes). .TP .B \-recbufonly Disable recording straight to files .TP .B \-recdir \fIdirectory\fR Specify the directory for record and replay files. .TP .B \-replay Start the server in replay mode. .TP .B \-reportfile \fIfilename\fR Write messages to the server admin written using the \fB/report\fR command to this file. If neither \fB\-reportfile\fR or \fB\-reportpipe\fR is used the \fB/report\fR command will be disabled. .TP .B \-reportpipe \fIcommand\fR Pipe messages to the server admin written using the \fB/report\fR command to this program or shell command. See \fB\-reportfile\fR. .TP \fB+s \fInum\-flags\fR The server will have an extra \fInum\-flags\fR random super flags available at all times. The \fB\-f\fR option can be used to restrict which types of flags will be added. Required flags given by the \fB+f\fR option are not included in the \fInum\-flags\fR total. .TP \fB\-s \fInum\-flags\fR The server will have up to \fInum\-flags\fR random super flags available at any time. The \fB\-f\fR option can be used to restrict which types of flags will be added. Required flags given by the \fB+f\fR option are not included in the \fInum\-flags\fR total. .TP .B \-sa Antidote flags are provided for players with bad flags. .TP .B \-sb Allow spawns on box buildings. .TP .B \-set \fIname value\fR Set BZDB variable \fIname\fR to \fIvalue\fR .TP \fB\-sl \fIid num\fR Restrict flag \fIid\fR to \fInum\fR shots. .TP \fB\-spamtime \fItime\fR Minimum time between player chat messages that are alike. .TP \fB\-spamwarn \fIwarnLimit\fR Number of warnings a player/spammer gets, who violates \-spamtime. .TP \fB\-speedtol \fIfactor\fR Override the default speed auto kick factor. The factor should not be less then 1.0. The factor is a multiplier. .TP \fB\-srvmsg \fImessage\fR Define a server welcome message. This option can be used multiple times to define a multiline message. .TP \fB\-st \fItime\fR Bad flags are automatically dropped after \fItime\fR seconds. .TP \fB\-sw \fIcount\fR Bad flags are automatically dropped after \fIcount\fR wins. Capturing a team flag does not count as a win. .TP .B \-synctime Forces all clients to use the same time of day. The current time is determined by the server's clock. This disables the + and \- keys on the clients. .TP .B \-t Adds teleporters to the game. .TP \fB\-tftimeout \fItime\-limit\fR If the last player in a team leaves while someone else is carrying the team flag, the team flag will not reset until it is captured, or until the player drops it and it is left alone for some time. This option specifies the number of seconds that the flag should be left alone before it is reset. The default value is 30. .TP \fB\-time \fR{\fItime\-limit\fR|\fIending-time\fR} Sets a time limit on the game to \fItime\-limit\fR or \fIending-time\fR. The game will be stopped \fItime\-limit\fR seconds after the first player connects, or at \fIending-time\fR, whichever is given. The \fIending-time\fR should be given in hh:mm:ss format, but does not need minute and second arguments. If only hour is given, it must end in ':'. Each unspecified argument is set to 0. .TP \fB\-timemanual\fR When using \fB\-time\fR, the countdown will start when the first player joins. With \fB\-timemanual\fR, the countdown has to be started manually using the \fI/countdown\fR command. This is useful for matches. .TP .B \-tk Changes the default behavior where a player dies when he kills a teammate. When using this option, he will just get a \-1 score penalty for the kill but not be killed in game. .TP \fB\-tkkr \fIpercent\fR Kicks players whose team killing to normal kill ratio is greater than \fIpercent\fR [1\-100]. A start up grace period is given to players. .TP .B \-trackplayhistory Has the server track players with good runs of kills and anounces them. Also anounces those players that stop the runs of good players. .TP \fB\-ts \fR[\fImicros\fR] Include timestamp information in DEBUG output \(em useful for logging. If \fImicros\fR is specified, microseconds will be added to the timestamp. .TP \fB\-UPnP\fR If enabled during build, bzfs try to communicate with the Gateway to set Port Forwarding and to supply information not specified with \-i (local interface) and \-publicaddr .TP \fB\-userdb \fIfile\fR Load group associations from file .TP \fB\-vars \fIfile\fR Loads values for game configurable variables from \fIfile\fR. Entries are one per line in the form: \fBset variable value\fR. For a list of variables that are configurable, in the BZFlag client, send a message with \fI/set\fR as the text. .TP .B \-version Prints the version number of the executable. .TP \fB\-world \fIworld\-file\fR Reads a specific BZFlag \fB.bzw\fR world layout file for the game map. .TP \fB\-worldsize \fIworld\-size\fR Changes the size for random maps .RE .SS Notes The server uses nearly zero CPU time when nobody is playing, and even during a game the server uses very little CPU, so it's not a burden on the system to leave one running and it won't interfere with a player using the same system (except on Windows 95, which \fIreally\fR sucks at multitasking). The server will continue to run until terminated. If a game is in progress when the server goes down, all players will be kicked off and the game will be aborted without warning. The server resets itself when all players have quit. All players must quit to reset the server when a game is over (because of a score or time limit). .PP The following game styles are recommended starting points. .RS .TP 15 \fB\-c\fR [\fB\-b\fR] Basic capture\-the\-flag game. It teaches teamwork and dogfighting skills. .TP \fB\-s \-t\fR Free\-for\-all with superflags and teleporters. Teaches players how to use superflags and teleporters for maximum effect. You may want to allow players to drop bad flags with any of \-sa, \-st, and \-sw. .RE .PP Notice that the maximum number of shots for these styles is one. Having low shot counts can greatly increase general playability and learning speed. However, this is not always true of every game style or game world, and a skilled player will learn to deal with a variety of shot counts. Single shot games have additional disadvantage in WAN games where lag/jitter can cause unfair advantage. Single shot, non-Jump games will teach valuable lessons in dodging, however, and are excellent starting points for the beginner. .SS Networking Communication between the server and clients (i.e. between \fBbzfs\fR and \fBbzflag\fR) during a game is via TCP and UDP. Use the \fB\-help\fR option to get the server's default port. If there's a firewall between the server and client, the firewall must accept connections from the client to this port and forward them to the server. .PP Clients can search for servers by sending broadcast UDP packets. But they must be on the same local area network for this to work. Clients can also find servers advertised using \fI\-publictitle\fR by querying list servers. .PP Game information is relayed through the server. Some communication between clients, such as position and orientation information, is normally sent via UDP packets. Other data, like flag grab and kill messages, are sent to the server via TCP. The server then turns around and broadcasts these packets to all players. Since being in a game implies connection to the server, all players are guaranteed to get all messages sent via TCP. But the UDP packets may be discarded. If other players can see your tank in the game but it never appears to move and shots go through it, chances are high that your UDP connection is not working. .SS "Worlds" BZFlag worlds come in two varieties, randomly generated ones, and human designed ones. By default, bzfs uses randomly generated world unless you specify the \-world command line or configuration file option. The world file specified by the \-world option is a text based file that contains a list of world objects. This file can be created using programs found on sourceforge.net through cvs, or can be hand edited. See the bzw(5) manual page for more details. .SH "GENERAL SERVER COMMANDS" .TP .B /clientquery \fR[\fIcallsign\fR] Retrieve client version info from all users, or just CALLSIGN if given. Example: .ft CW .nf .ne 2 /clientquery MrApathyCream MrApathyCream: Version: BZFlag 1.11.6\-20040729\-gnu\-linux\-SDL .ft R .TP .B /date, /time Responds with the current server local time. /date and /time are exactly the same. Example: .ft CW .nf .ne 1 Tuesday September 08 06:45:54 2004 .ft R .TP .B /flaghistory Lists what flags players have grabbed in the past. Example: .ft CW .nf .ne 3 MrApathyCream: (<\-) (\->) (O) (CB) (M) (B) (JM) (WA) Gerbol: (L) (GM) (L) (GM) (CL) (ST) (GM) (L) captain_macgyver: (SB) (SW) .ft R .TP .B /idlestats Displays the idle time in seconds for each player. A player is idle when he is dead and has not respawned yet. Example: .ft CW .nf .ne 3 MrApathyCream: 0s Gerbol: 80s captain_macgyver: 13s .ft R .TP .B /lagstats Lists network delays, jitter and number of lost resp. out of order packets by player. Example: .ft CW .nf .ne 3 MrApathyCream 335 +\- 10ms Gerbol 210 +\- 3ms captain_macgyver 155 +\- 0ms 12% lost/ooo .ft R .TP .B /me \fIaction\fR This command displays an "action" that is conveyed to another player. It allows for a little more expressivity in the game. For example: "/me is hunting wabbits" turns into a message like "TimRiker is hunting wabbits" that gets displayed differently to other players. .TP .B /msg \fI"callsign"\fR \fImessage\fR This command allows a player to send a message to another player. Similar to using the "," and "." message keys in the game and then selecting your recipient, this will send some message to particular player. The quotes are optional. .TP .B /part \fR[\fImessage\fR] Leave the server with a goodbye message (similar to IRC's /part) .ft CW .nf .ne 2 /part Gotta go! bye everyone! .ft R .TP .B /password \fIpassword\fR Attempt to gain administrator status Example: .ft CW .nf .ne 2 /password supersecretpassword You are now an administrator! .ft R .TP .B /poll \fR{{\fIban\fR|\fIkick\fR} \fIcallsign\fR|vote {\fIyes\fR|\fIno\fR}|veto} Interact and make requests of the bzflag voting system via the /poll command. The ban and kick subcommands request a vote to respectively ban or kick some player. The playername is expected as the next argument. The vote and veto commands behave identical to the /vote and /veto command counterparts, expecting the same arguments in following. By default, you must be registered to request or vote on a poll, and an admin to veto. .TP .B /quit \fR[\fImessage\fR] Quit the game with a goodbye message (similar to IRC's /quit) .ft CW .nf .ne 2 /quit Gotta go! bye everyone! .ft R .TP .B /report \fImessage\fR Write a message to the server administrator. Example: .ft CW .nf .ne 2 /report I like this map! .ft R .TP .B /uptime Prints server's current running time in days, hours, mins and secs. .TP .B /vote \fR{\fIyes\fR|\fIno\fR} If there is a poll active, this command will place a vote in favor or in opposition to the poll. Multiple languages are supported as a vote argument in addition to "yes" and "no". By default, you must be registered to vote on a poll. .SH "SERVER ADMINISTRATIVE COMMANDS" .BR .TP .B /ban \fR{\fIip\fR|\fIipList\fR|\fI#slot\fR|\fI"Player Name"\fR|\fIplayerName\fR} \fIduration\fR \fIreason\fR Ban players using the specified IPs for certain length of time from using this server. can be: 'short' or 'default' for the default ban time 'forever' or 'max' for infinite bans a time in the format WDHM just a number of minutes Examples: .ft CW .nf .ne 4 /ban 35.23.43.66 2 cheating bans player with specific ip for 2 minutes /ban 35.23.*.*,47.23.17.* 0 Cheaters bans all ips in this range forever /ban 36.37.2.8 2h30m "ShootMe" was abusing players bans specific ip for 2.5 hours with given reason /ban #5 60m Rejoining bans player using slot 5 for 60 minutes with given reason /ban "Tanker" max cheating bans the player Tanker forever because cheating Note: Slots numbers are only displayed in admins clients. Duration and reason are required. .ft R .TP .B /banlist List all of the IPs currently banned from this server. Example: .ft CW .nf .ne 5 /banlist IP Ban List \-\-\-\-\-\-\-\-\-\-\-\- 35.23.43.66 (2 minutes) banned by Tankmaster reason: Cheaters 47.23.17.* banned by Tankslave .ft R .TP .B /checkip \fIip\fR Check whether the IP is banned and print the corresponding rule. This does not cover hostbans. Example: .ft CW .nf .ne 5 /checkip 35.23.43.66 35.23.43.66 is banned: 35.23.43.66 banned by Tankmaster reason: Cheaters .ft R .TP .B /countdown \fR[\fIseconds\fR] Starts the countdown sequence for a timed game. The countdown sequence length can optionally be specified in seconds. Examples: .ft CW .nf .ne 2 /countdown /countdown 3 .ft R .TP .B /flag reset \fR[\fIunused\fR] Repositions flags. If \fIunused\fR is specified, flags carried by tanks are not affected. .TP .B /flag show Shows all flags with information. Example: .ft CW .nf .ne 2 0: p:\-1 r:1 g:1 1:V s:1 p:159.1x43.2x0.0 1: p:2 r:1 g:1 1:SW s:1 p:209.1x143.2x10.0 2: p:\-1 r:1 g:3 1:L s:1 p:\-29.1x301.2x0.0 .ft R .TP .B /flag up Removes all flags from the game .TP .B /gameover Ends the current game .TP .B /hostban \fIhostpattern\fR \fIduration\fR \fIreason\fR Ban players using the specified hostnames for a certain length of time from using this server. Example: .ft CW .nf .ne 4 /hostban *.foo.com 2 cheating bans all players from foo.com for 2 minutes .ft R .TP .B /hostbanlist List all of the host patterns currently banned from this server. .TP .B /jitterwarn \fR[\fItime\fR] Change the maximum allowed jitter time. Example: .ft CW .nf .ne 2 /jitterwarn 50 .ft R .TP .B /jitterdrop \fR[\fIcount\fR] Change the number of jitter warnings given before a player is kicked. Example: .ft CW .nf .ne 2 /jitterdrop 3 .ft R .TP .B /kick \fR{\fI"Player Name"\fR|\fIplayerName\fR|\fI#slot\fR} \fIreason\fR Kick a player off the server. Example: .ft CW .nf .ne 2 /kick Gerbol You were kicked off the server by MrApathyCream /kick #1 Team killing Kick the player using slot 1 because Team Killing Note: Slots numbers are only displayed in admins clients. A reason is required .ft R .TP .B /kill \fR{\fI"Player Name"\fR|\fIplayerName\fR|\fI#slot\fR} [\fIreason\fR] Kill a player just like when shooting. Example: .ft CW .nf .ne 2 /kill Gerbol kill the player named Gerbol /kill #4 teamkilling Kill the player using slot 4 because teamkilling .ft R .TP .B /lagwarn \fR[\fItime\fR] Change the maximum allowed lag time. Example: .ft CW .nf .ne 2 /lagwarn 300 .ft R .TP .B /lagdrop \fR[\fIcount\fR] Change the number of lag warnings given before a player is kicked. Example: .ft CW .nf .ne 2 /lagdrop 3 .ft R .TP .B /modcount \fR[\fIseconds\fR] Change the time on the clock by the specified number of seconds. Example: .ft CW .nf .ne 2 /modcount +320 .ft R .TP .B /mute \fR{\fI#slot\fR|\fIcallsign\fR} Allows a server admin to remove the ability for a player to communicate with other players. Once muted the player may only talk to admins on the server. This command removes the TALK permission that is enabled by default for all players. (disabling TALK by default would let you run a "silent" server) .TP .B /packetlosswarn \fR[\fItime\fR] Change the maximum allowed packetloss. Example: .ft CW .nf .ne 2 /packetloss 1 .ft R .TP .B /packetlossdrop \fR[\fIcount\fR] Change the number of packetloss warnings given before a player is kicked. Example: .ft CW .nf .ne 2 /packetloss 3 .ft R .TP .B /playerlist List player names and IP addresses. Example: .ft CW .nf .ne 4 /playerlist [0]MrApathyCream: 35.23.65.44:4808 udp id [1]Gerbol: 130.123.1.55:4909 udp id [2]captain_macgyver: 15.32.122.51:3201 udp id .ft R .TP .B /record file \fIfilename\fR Start recording directly to a file .TP .B /record list List all files in the recordings directory .TP .B /record rate \fIseconds\fR Set the time between game state updates stored in the recording. This will affect the granularity of the 'skips' you can do while replaying a file. It will also make the recording files bigger if it is set to a faster update rate. .TP .B /record save \fIfilename\fR [\fIseconds\fR] Save the recording buffer into a file. If seconds is specified, then only save that many previous seconds into the file. .TP .B /record size \fImegabytes\fR Set the size of the recording memory buffer .TP .B /record start Start recording into the memory buffer .TP .B /record stats Display the statistics for the current recording (file or buffered) .TP .B /record stop Stop recording into the memory buffer .TP .B /replay list List all files in the recordings directory .TP .B /replay load \fR{\fIfilename\fR|\fI#index\fR} Load the specified recording file by name, or by index (same indices as produced by the 'replay list' command) .TP .B /replay loop Start looping the recording. This will oftentimes require that all players connected to the server rejoin (to reload the map, etc...) .TP .B /replay play Start playing the recording. This will oftentimes require that all players connected to the server rejoin (to reload the map, etc...) .TP .B /replay skip \fR[{\fI+\fR|\fI\-\fR} \fIseconds\fR] If seconds is specified, then skip that amount of time in the recording. Otherwise, skip forwards until there is activity. .TP .B /replay stats Show the current replay status (filename, position, etc...) .BR .TP .B /say \fImessage\fR Generate a public message sent by the server. Example: .ft CW .nf .ne 4 /say This is a servermessage .ft R .TP .B /sendhelp \fR{\fI"Player name"\fR|\fIplayerName\fR|\fI#slot\fR} \fIhelp page\fR Send the specified help page to a user .ft CW .nf .ne 4 /sendhelp register "Foo" Send the the help page 'register' to the player Foo .ft R .TP .B /shutdownserver Stop serving BZFlag on this server .TP .B /superkill Kick all players off the server .TP .B /unmute \fR{\fI#slot\fR|\fIcallsign\fR} Allows a server admin to restore the TALK permission to a previously muted player. .TP .B /veto If there is a poll active, this will cancel the poll. By default, you must be an admin to veto a poll. .TP .B /viewreports View the server's report file. .BR .SH "USER MANAGEMENT" Generally, you start with empty files for the user and password databases. These are maintained by the server, and modifiable through server commands. Users in turn belong to groups. Groups are generally customized to perhaps allow administrative control to trusted users. There are both local and global groups, i.e. groups that are available across the entire BZFlag network. In setting up a server, you may want to specify global groups that will allow already well known and trusted users to police your server and help maintain control against cheaters and abuse. The server will automatically create three groups: EVERYONE, VERIFIED, and LOCAL.ADMIN. EVERYONE has ACTIONMESSAGE, ADMINMESSAGESEND, DATE, FLAGHISTORY, IDLESTATS, LAGSTATS, PRIVATEMESSAGE and SPAWN by default. VERIFIED has POLL, POLLKICK, POLLBAN, POLLSET, POLLFLAGRESET, and VOTE. The LOCAL.ADMIN group has almost every permission possible (similar to granting admin powers via /password). Once the server is running, users can register their callsigns and admins can set their group memberships. Users can use any command that their permissions allow. Every user, registered or not, is part of the EVERYONE group. When a user identifies, they become part of the VERIFIED group. In addition, there are global groups available that persist network\-wide. Users that register their callsigns on the BZFlag website at http://my.BZFlag.org/bb/ have the ability to globally authenticate by providing a password from within the client. When they authenticate, bzfs will ask the list server if they belong to any of the groups listed in your group database file that are not prefixed with "LOCAL.". If they are a member of a group in question, then they are granted the permissions you specify for that group. A group database file is set up to contain the specific local and global groups you care to have on your server in addition to default groups and exactly which permissions are granted by each. These files are laid out with one line per group, using the following format: GROUP_NAME: [*Group] [+|\-|!]perm1 [+|\-|!]perm2 ... permN *Group: inhert permissions from existing group "Group" .br +perm: add perm to this group .br \-perm: remove perm from this group .br !perm: forbid perm for this group. makes perm inaccessable whether it's granted from another group or not If no operator is given with a permission it is handled like +perm. A group line for a previously existing group adds to already granted permissions. That way you can spread a group's definition over several lines: GROUP_NAME: +perm1 +perm2 .br GROUP_NAME: +perm3 +perm4 \-perm5 Group names cannot have spaces, quotes, or other special characters in them. This would be a sample line defining a "cop" group: COPS: +KICK +SHORTBAN +BANLIST Now a group USERADMIN with all permissions granted to COPS plus some additional could look like this: USERADMIN: *COPS +BAN +UNBAN Probably you want to define customized permissions for the default group "VERIFIED" instead of those automatically asigned by the server: VERIFIED: \-ALL +perm1 +perm2 ... Or you want to disable the /poll command entirely? EVERYONE: !POLL To distinguish between a group that is local and one that is global, use the "LOCAL." prefix as part of the group name, e.g.: LOCAL.OPERATOR: BANLIST The available permissions are as follows: .\" Use one tab between permission and description .ta 2i T .5i ACTIONMESSAGE /me .br ADMINMESSAGERECEIVE player receives messages sent to admin channel .br ADMINMESSAGESEND player may send messages on the admin channel .br ALL \fBall\fR permissions available .br BAN /ban /hostban .br BANLIST /banlist /hostbanlist .br COUNTDOWN /countdown .br ENDGAME /endgame .br FLAGHISTORY /flaghistory .br FLAGMOD /flag .br IDLESTATS /idlestats .br INFO not implemented .br KICK /kick .br LAGSTATS /lagstats .br LAGWARN /lagwarn .br LISTPERMS not implemented .br MUTE /mute .br PLAYERLIST /playerlist .br POLL /poll .br POLLBAN /poll ban .br POLLFLAGRESET /poll flagreset .br POLLKICK /poll kick .br POLLSET /poll set .br PRIVATEMESSAGE /msg .br REJOIN allows instant rejoin, regardless of _rejoinTime .br REMOVEPERMS /removegroup .br REQUIREIDENTIFY user must use global registration .br SAY /say .br SETALL use of all set/remove commands .br SETPERMS /setgroup .br SETPASSWORD not implemented .br SETVAR /set /reset .br SHOWOTHERS not implemented .br SHUTDOWNSERVER /shutdownserver .br SPAWN join game as a player. observers don't need this flag. .br SUPERKILL /superkill .br TALK allows all players to send messages .br UNBAN /unban /hostunban .br UNMUTE /unmute .br VETO /veto .br VOTE /vote .TP .B /ghost \fIcallsign\fR \fIpassword\fR Kicks off an impersonating player or ghost .TP .B /grouplist Lists the available user groups .TP .B /groupperms Lists the permissions for each group .TP .B /masterban \fR{\fIflush\fR|\fIreload\fR} Forces the server to flush any bans from the master server. If reload is specified instead of flush, also reloads bans from the the internet. Local bans are unaffected. This command requires the UNBAN permision. .TP .B /reload Reloads the user, group, and password files (for synchronization between multiple servers on the same machine) .TP .B /removegroup \fIcallsign\fR \fIgroup\fR Remove a user from a group .TP .B /setgroup \fIcallsign\fR \fIgroup\fR Add a user to a group .TP .B /setpass \fIpassword\fR Changes your password .TP .B /showgroup \fIcallsign\fR Lists the groups that a registered user is a member of .SH "SEE ALSO" bzflag(6), bzadmin(6), bzw(5) bzflag-2.4.2+ds1/man/bzw.5.in000066400000000000000000000701061200563112200155130ustar00rootroot00000000000000.\" bzflag .\" Copyright (c) 1993-2012 Tim Riker .\" .\" This package is free software; you can redistribute it and/or .\" modify it under the terms of the license found in the file .\" named COPYING that should have accompanied this file. .\" .\" THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .TH "bzw" "5" "@BZFLAG_DATE@" "bzw-@BZFLAG_VERSION@" "BZFlag" .SH "NAME" bzw \- BZFlag world file format .SH "DESCRIPTION" The BZFlag world file format describes a world environment that is used by the BZFlag game server, bzfs. .I X "BZW file format" .PP The BZFlag world file format describes and environment that includes the game map, physical world attributes, and automatic world weapons. The map may contain a variety of "obstacles" like buildings, pyramids, and meshes. These obstacles make up the world that the BZFlag tanks will drive around in. Map attributes may be set to create worlds of various sizes, the default size is 800x800. .TP Here is small example world: .PP # simple world containing a box, pyramid, and mesh .br .B world .br \fB name\fR Simple World .br \fB size\fR 100.0 .br .B end .br .B box .br \fB position\fR \-20 \-20 0 .br \fB size\fR 10 20 10 .br .B end .br .B pyramid .br \fB position\fR 20 20 0 .br \fB size\fR 10 10 20 .br .B end .br .B mesh .br \fB vertex\fR \-10 0 0 .br \fB vertex\fR 10 0 0 .br \fB vertex\fR 0 10 0 .br \fB face\fR .br \fB vertices\fR 0 1 2 .br \fB endface\fR .br .B end .br .PP The .bzw file is a plain text file with a relatively simple file format. The format of this text file consists of any number of objects listed in any order (except that physics, textureMatrix, dynamicColor, and material must come before they are referenced) separated by newlines and grouped into blocks of types. The list of world types consists of: .br .B world .br .B options .br .B waterLevel .br .B dynamicColor .br .B textureMatrix .br .B transform .br .B material .br .B physics .br .B define .br .B group .br .B mesh .br .B meshbox .br .B meshpyr .br .B arc .br .B cone .br .B sphere .br .B tetra .br .B box .br .B pyramid .br .B link .br .B teleporter .br .B base .br .B weapon .br .B zone .br Each object is described by placing the type on one line, the word \fIend\fR on a following line, and a list of attributes for that object, one per line, in between. The exceptions to the rule are \fIdefine\fR and \fIface\fR, which are concluded with \fIenddef\fR and \fIendface\fR. Attributes may be listed in any order. Attributes have default values, and if that is good enough, the attribute need not be listed. Words are always specified in lowercase. Line comments can be specified by placing a # sign at the start of the line. For documentation purposes, you can tag each object by adding a name attribute. There is no set limit to the number of times you may use any of the objects except for the world, options, and waterLevel objects, they can only be specified once. The options object contains command line arguments that are used to configure the server's game mode, but can not contain server specific options such as \-p, \-passwd, and \-conf. .br In the following examples, the values are the defaults. .B The World object .br Header for the world. \fBworld\fR .br \fB name\fR example_world .br \fB size\fR 400.0 .br \fB flagHeight\fR 10.0 .br \fBend\fR .br .B The Options object .br A world file interface for setting command line options for BZFS. \fBoptions\fR .br \-set _tankSpeed 36 .br \-j +r \-ms 3 .br +f GM{5} +f SW{5} .br \fBend\fR .br .B The Water Level object .br Sets how high the water is, in a matter of units. \fBwaterLevel\fR .br \fB name\fR example_waterlevel .br \fB height\fR \-1.0 # anything below 0 turns it off .br \fBend\fR .br .B The Group Definition object .br Defines a group, which may include other group instances .br This does not place any objects into the world, a group instance must be used to generate world objects from a group definition. \fBdefine\fR .br # You can add any object to a group definition, .br # except for the following types: .br # textureMatrix .br # dynamicColor .br # material .br # physics .br # links .br # weapon .br # zone .br \fBenddef\fR .br .B The Group Instantiation object .br Instantiates a group, and possibly modifies subobjects \fBgroup\fR # a valid group definition reference .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br # angle degrees about vector n .br \fB team\fR 0 # change all base colors within group .br \fB tint\fR 1 1 1 1 # hierarchically tints objects within this group .br \fB drivethrough\fR # make all subobjects drivethrough .br \fB shootthrough\fR # make all subobjects shootthrough .br \fB ricochet \fR # make all subobjects ricochet \fB phydrv\fR example_phydrv # reassign any valid physics drivers .br \fB matref\fR example_material # set material properties # (except for the color) .br \fB matswap\fR oldMat newMat #replace a given material in the instance .br \fBend\fR .br .B The Dynamic Color object \fBdynamicColor\fR .br \fB name\fR example_dyncol .br # there are 4 channels that can be modified: .br # \fBred\fR, \fBgreen\fR, \fBblue\fR, \fBalpha\fR .br # there are 5 types of commands per channel: .br # \fBlimits\fR, \fBsinusoid\fR, \fBclampUp\fR, \fBclampDown\fR, \fBsequence\fR .br # except for "limits" and "sequence", the commands are \fBrepeatable\fR .br # if a sequence is used, then clampUps and clampDowns have no effect .br # sequences can use three states (0, 1, 2). .br # 0 \- equivalent to an active clampDown .br # 1 \- equivalent to no clamps .br # 2 \- equivalent to an active clampUp .br # if both clampUp and clampDown are active, the value is (min+max)/2 .br # the sinusoid function starts at the max value .br # the sum of a channel's sinusoids is clamped between 0 and 1 .br \fB red limits\fR 0 1 # min/max limits .br \fB green sinusoid\fR 0.1 0 0.25 # period, offset, weight .br \fB blue clampUp\fR 0.1 0 0.75 # period, offset, width .br \fB alpha clampDown\fR 0.2 0.5 0.5 # period, offset, width .br \fB red sequence\fR 0.0 0.0 2 0 1 1 2 0 ... # period, offset, list of states .br \fBend\fR .br .B The Texture Matrix object \fBtextureMatrix\fR .br \fB name\fR example_texmat .br \fB scale\fR 0.0 0.0 1.0 1.0 # u/v freqs, u/v scales .br \fB spin\fR 0.0 # rotation freq .br \fB shift\fR 0.0 0.0 # u/v freqs .br \fB center\fR 0.5 0.5 # dynamic u/v center (for spin and scale) .br \fB fixedscale\fR 0.0 0.0 # time invariant u/v scale .br \fB fixedspin\fR 0.0 # time invariant rotation .br \fB fixedshift\fR 0.0 0.0 # time invariant u/v shift .br \fBend\fR .br .B Material Properties Material properties may be set on several types of objects, including meshes, mesh faces, arcs, cones, spheres, and tetras. Here are the properties: .br \fBmaterial\fR .br \fB name\fR example_material .br \fB resetmat\fR # restore default values .br \fB matref\fR material_name # copy another material's properties .br \fB ambient\fR 0.2 0.2 0.2 1.0 # ambient color .br \fB diffuse\fR 1.0 1.0 1.0 1.0 # diffuse color (\fBmain color\fR) .br \fB color\fR 1.0 1.0 1.0 1.0 # synonym for 'diffuse' .br \fB specular\fR 0.0 0.0 0.0 1.0 # specular color .br \fB emission\fR 0.0 0.0 0.0 1.0 # emission color .br \fB shininess\fR 0.0 # shininess (0.0 \(en 128.0) .br \fB texture\fR filename # set working texture .br # \- non-interlaced PNG .br # \- http:// or ftp:// hyperlinks can be used (no spaces) .br # \- BZFlag default texture names can be used (.png not required) .br \fB addtexture\fR filename # add texture .br \fB notextures\fR # specify that no textures are to be used .br \fB notexalpha\fR # don't use the texture's alpha channel .br \fB notexcolor\fR # the color is not applied to the texture .br # if a texture is specified, but not found, the default texture .br # will be used. if the default texture is also not available, then .br # the color will be used (untextured) .br \fB spheremap\fR # use spherical texture coordinate mapping .br \fB texmat\fR \-1 # texture matrix (\-1 for none) .br \fB dyncol\fR \-1 # dynamic color (\-1 for none) .br \fB noradar\fR # do not display on radar (except normal mode) .br \fB noshadow\fR # do not render shadows .br \fB noculling\fR # do not cull by face winding (double-sided) .br \fB nosorting\fR # do not do front-to-back alpha sorting .br \fB nolighting\fR # disable lighting .br \fB alphathresh 0.0\fR # alpha thresholding value .br \fB groupalpha\fR # sort translucent faces as a group .br \fB occluder\fR # faces with this material will occlude .br \fBend\fR .br .B The Physics Driver object \fBphysics\fR .br \fB name\fR example_phydrv .br \fB linear\fR 0.0 0.0 0.0 # x/y/z linear velocities .br \fB angular\fR 0.0 0.0 0.0 # rotation freq, x/y coordinates .br \fB slide\fR 0.0 # time until max velocity (> 0.0 enables) .br \fB death\fR Message goes here. .br # the 'death' property requires a non\-blank message .br \fBend\fR .br .B The Mesh object \fBmesh\fR .br \fB name\fR example_mesh .br # Material properties applied to a mesh apply to all faces .br # that follow the setting. Mesh faces will alter their own .br # properties without affecting the state of the mesh properties. .br # The same pattern is used to apply physics drivers. .br \fB vertex\fR 100 200 300 # add a vertex (\fBrepeatable\fR) .br \fB normal\fR 1.0 0 0 # add a normal (\fBrepeatable\fR) .br \fB texcoord\fR 0.1 0.75 # add a texture coordinate (\fBrepeatable\fR) .br \fB inside\fR 5.5 4.5 1.2 # add an inside point (\fBrepeatable\fR) .br \fB outside\fR 0 0 1000 # add an outside point (\fBrepeatable\fR) .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br \fB phydrv\fR example_phydrv # assign a physics driver .br \fB smoothbounce\fR # ricochets use normals .br \fB noclusters\fR # render each mesh face individually .br \fB face\fR # start a face (\fBrepeatable\fR) .br # the front-face winding is counter-clockwise .br \fB vertices\fR 1 4 0 3 5 # list of vertices (requires at least three) .br \fB normals\fR 2 6 0 4 7 # list of normals (optional) .br \fB texcoords\fR 0 3 2 4 9 # list of texture coordinates (optional) .br \fB phydrv\fR example_phydrv # assign a physics driver .br \fB endface\fR # end the face .br # .br # This next element can be added to increase the rendering speed .br # of the mesh object. If the client is capable of using this data, .br # then it is used to draw the mesh instead of the face information. .br # .br \fB drawInfo\fR .br \fB dlist\fR # display list for all material sets .br \fB decorative\fR # older clients with not see this mesh .br \fB angvel\fR # rotation about initial Z axis .br \fB extents\fR .br \fB sphere\fR .br \fB corner\fR (\fBrepeatable\fR) .br \fB vertex\fR 0.0 0.0 0.0 (\fBrepeatable\fR) .br \fB normal\fR 0.0 0.0 0.0 (\fBrepeatable\fR) .br \fB texcoord\fR 0.0 0.0 (\fBrepeatable\fR) .br \fB lod\fR (\fBrepeatable\fR) .br \fB lengthPerPixel\fR .br \fB matref\fR (\fBrepeatable\fR) .br \fB dlist\fR # display list for this material set .br \fB sphere\fR .br \fB points\fR 0 (\fBrepeatable\fR) .br \fB lines\fR 0 1 (\fBrepeatable\fR) .br \fB lineloop\fR 0 1 (\fBrepeatable\fR) .br \fB linestrip\fR 0 1 (\fBrepeatable\fR) .br \fB tris\fR 0 1 2 (\fBrepeatable\fR) .br \fB tristrip\fR 0 1 2 (\fBrepeatable\fR) .br \fB trifan\fR 0 1 2 (\fBrepeatable\fR) .br \fB quads\fR 0 1 2 3 (\fBrepeatable\fR) .br \fB quadstrip\fR 0 1 2 3 (\fBrepeatable\fR) .br \fB polygon\fR 0 1 2 (\fBrepeatable\fR) .br \fB end\fR # matref .br \fB end\fR # lod .br \fB end\fR # drawInfo .br \fBend\fR # mesh .br .B The Arc object \fBarc\fR .br \fB name\fR example_arc .br \fB divisions 16\fR # number of subdivisions .br \fB flatshading\fR # flat shading (smooth is default) .br \fB angle 360\fR # the sweep angle .br \fB ratio 1\fR # (outrad \- inrad) / outrad .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 10 10 10 .br \fB rotation\fR 0.0 .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br \fB phydrv\fR example_phydrv # assign a physics driver .br \fB smoothbounce\fR # ricochets use normals .br \fBend\fR .br .B The Cone object \fBcone\fR .br \fB name\fR example_cone .br \fB divisions 16\fR # number of subdivisions .br \fB flatshading\fR # flat shading (smooth is default) .br \fB angle 360\fR # the sweep angle .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 10 10 10 .br \fB rotation\fR 0.0 .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br \fB phydrv\fR example_phydrv # assign a physics driver .br \fB smoothbounce\fR # ricochets use normals .br \fBend\fR .br .B The Sphere object \fBsphere\fR .br \fB name\fR example_sphere .br \fB divisions 4\fR # number of subdivisions .br \fB flatshading\fR # flat shading (smooth is default) .br \fB position\fR 0.0 0.0 10.0 .br \fB size\fR 10 10 10 .br \fB radius 10\fR # sets all size values to this value .br \fB rotation\fR 0.0 .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br \fB phydrv\fR example_phydrv # assign a physics driver .br \fB smoothbounce\fR # ricochets use normals .br \fBend\fR .br .B The Tetrahedron object \fBtetra\fR .br \fB name\fR example_tetra .br # there must always be 4 vertices .br \fB vertex\fR \-10.0 \-5.0 0.0 .br \fB vertex\fR +10.0 \-5.0 0.0 .br \fB vertex\fR 0.0 10.0 0.0 .br \fB vertex\fR 0.0 5.0 10.0 .br \fB shift\fR 0 0 0 # (\fBrepeatable\fR) .br \fB scale\fR 1 1 1 # (\fBrepeatable\fR) .br \fB shear\fR 0 0 0 # (\fBrepeatable\fR) .br \fB spin\fR angle nx ny nz # (\fBrepeatable\fR) .br \fBend\fR .br .B The Box object .br Adds a simple block. \fBbox\fR .br \fB name\fR example_box .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 30.0 30.0 9.42 .br \fB rotation\fR 0.0 .br \fBend\fR .br .B The Pyramid object .br Adds a triangular shaped object. \fBpyramid\fR .br \fB name\fR example_pyramid .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 8.2 8.2 10.25 .br \fB rotation\fR 0.0 .br \fBend\fR .br .B The Teleporter object .br Adds an object that places a tank at another teleporter in a different area when ran through. \fBteleporter\fR [name] .br # the [name] tag is used for linkage .br \fB name\fR example_teleporter .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 5.06 4.48 20.16 .br \fB rotation\fR 0.0 .br \fB border\fR 1.12 .br \fBend\fR .br .B The Link object .br Adds a route to teleport a tank between two teleporters. # Teleporter names are terminated with either :f (forward) .br # or :b (backwards). The forwards link points to 0 degrees, .br # and the backwards link points to 180. Links are made by .br # pattern matching the teleporter names. The '*' and '?' .br # globbing characters can be used to make multiple matches. .br # If there are multiple matches for the "to" link, then the .br # destination will be selected randomly between the matches. .br # in\-game. .br # NOTE: bzfs \-d \-d \-d \-d will print the linkage table. \fBlink\fR .br \fB name\fR example_link .br # this will link all teleporters randomly to all other teleporters .br \fB from\fR * .br \fB to\fR * .br \fBend\fR .br # or, to link between known teleporters examp_tele1(front) and examp_tele2(back) \fBlink\fR .br \fB name\fR example_realLink .br \fB from\fR examp_tele1:f .br \fB to\fR examp_tele2:b .br \fBend\fR .br .B The Base object .br Creates a team base where the corresponding team's flag is stored. The oncap option will fire a world weapon of the specified type when the team flag for this base is captured. \fBbase\fR .br \fB name\fR example_base .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 60.0 60.0 0.0 .br \fB rotation\fR 0.0 .br \fB color\fR 0 .br \fB oncap\fR V .br \fBend\fR .br .B The Weapon object .br Creates a world weapon, or a weapon fired automatically by the world. The weapon can either be timed or be event driven. Timed weapons should use the initdelay and delay fields. Event driven weapons need to use the trigger option to define what the trigger event is. Valid trigger events are; OnCap, for flag capture events. OnSpawn, for player spawn events. OnDie, for player death events. If the weapon is to be triggered only for a specific team then the eventteam option should be used with a team number (1 to 4). An eventteam value of \-1 will trigger this weapon for any team. \-1 is the default eventteam value. \fBweapon\fR .br \fB name\fR example_weapon .br \fB position\fR 0.0 0.0 0.0 .br \fB rotation\fR 0.0 .br \fB tilt\fR 0.0 .br \fB initdelay\fR 10.0 .br \fB delay\fR 10.0 3.0 5.0 3.0 .br \fB type\fR V .br \fB trigger\fR flagcap .br \fB eventteam\fR V .br \fBend\fR .br .B The Zone object .br Specifies a certain range in the world, and what attributes that range has. \fBzone\fR .br \fB name\fR example_zone .br \fB position\fR 0.0 0.0 0.0 .br \fB size\fR 1.0 1.0 1.0 .br \fB rotation\fR 0.0 .br # where players may spawn .br \fB team\fR 0 1 2 3 4 .br # where flag may spawn .br \fB flag\fR GM SW good bad .br # dropped team flags will fly to the closest safety zone .br \fB safety\fR 1 2 3 4 .br # attach a flag to this zone (always spawn in this zone) .br \fB zoneflag\fR GM 3 # type, count (type can be a team flag, ex: R*) .br \fBend\fR .br .SH "FILE SYNTAX" .PP The symbol '?' means that the item is optional. .PP The notation {a..b} means that the number of times the item can be present must be between 'a' and 'b', where '*' mean infinity. ('?' is equivalent to {0..1}) .TP angle := .TP 2dpoint := .TP 3dpoint := .TP rgbColor := .TP alpha := .TP rgbaColor := rgbColor alpha? | alpha? .TP channel := "red" | "green" | "blue" | "alpha" .TP .B (BZWReader.cxx/parseNormalObject) .TP allObjects := .br "box" .br | "pyramid" .br | "base" .br | "link" .br | "teleporter" .br | "mesh" .br | "arc" .br | "meshbox" .br | "cone" .br | "meshpyr" .br | "sphere" .br | "tetra" .br | "weapon" .br | "zone" .br | "waterLevel" .br | "dynamicColor" .br | "textureMatrix" .br | "material" .br | "physics" .br | "transform" .br .TP .B (BZWReader.cxx/BZWReader::readWorldStream) .br Note: Blank lines and lines starting with # are discarded. .br .TP worldStream := .br "end" .br | allObjects .br | "define" .br | "enddef" .br | "group" .br | "teleporter" ? .br | "options" .br | "include" .br | "world" .br .TP .B (ParseMaterial.cxx/parseMaterials) .br .TP material := .br object .br | "matref" .br | "resetmat" .br | "dyncol" .br | "ambient" rgbaColor .br | ("diffuse" | "color") rgbaColor .br | "specular" rgbaColor .br | "emission" rgbaColor .br | "shininess" .br | "texture .br | "notextures" .br | "addtexture" .br | "texmat" .br | "notexalpha" .br | "notexcolor" .br | "spheremap" .br | "noradar" .br | "noshadow" .br | "noculling" .br | "nosorting" .br | "nolighting" .br | "alphathresh" .br | "groupalpha" .br | "occluder" .br | "shader" # NOT IMPLEMENTED .br | "addshader" # NOT IMPLEMENTED .br | "noshaders" # NOT IMPLEMENTED .br .TP .B (WorldFileObject:.cxx/WorldFileObject::read) .br .TP object := "name" .br .TP .B (WorldFileLocation.cxx/readWorldFileLocation::read) .br .TP location := .br ("pos" | "position") 3dpoint .br | "size" 3dpoint .br | ("rot" | "rotation") .br | "shift" 3dpoint .br | "scale" 3dpoint .br | "shear" 3dpoint .br | "spin" angle 3dpoint .br | "xform" .br | object .br .TP .B (WorldFileObstacle.cxx/WorldFileObstacle::read) .br .TP obstacle := .br "drivethrough" .br | "shootthrough" .br | "passable" .br | "ricochet" .br | location .br .TP .B (CustomArc.cxx/CustomArc::read) .br .TP meshbox := .br "divisions" .br | "angle" angle .br | "ratio" .br | "texsize" .br | "phydrv" .br | "smoothbounce" .br | "flatshading" .br | material .br | ("top" | "bottom" | "inside" | "outside" | "startside" | "endside") material .br | obstacle .br .TP arc := .br "divisions" .br | "angle" angle .br | "ratio" .br | "texsize" .br | "phydrv" .br | "smoothbounce" .br | "flatshading" .br | material .br | ("top" | "bottom" | "inside" | "outside" | "startside" | "endside") material .br | obstacle .br .TP .B (CustomBase.cxx/CustomBase::read) .br .TP base := .br "color" .br | obstacle .br .TP .B (CustomBox.cxx) .br .TP box := obstacle .br .TP .B (CustomCone.cxx/CustomCone::read) .br .TP meshpyr := .br "divisions" .br | "angle" .br | "texsize" .br | "phydrv" .br | "smoothbounce" .br | "flatshading" .br | material .br | ("edge" | "bottom" | "startside" | "endside") material .br | "flipz" .br | obstacle .br .TP cone := .br "divisions" .br | "angle" .br | "texsize" .br | "phydrv" .br | "smoothbounce" .br | "flatshading" .br | material .br | ("edge" | "bottom" | "startside" | "endside") material .br | obstacle .br .TP .B (CustomDynamicColor.cxx/CustomDynamicColor::read) .br .TP dynamicColor := .br object .br | channel "limits" .br | channel "sinusoid" .br | channel "clampup" .br | channel "clampdown" .br | channel "sequence" ("0" "1" "2"){1..*} .br .TP .B (CustomGate.cxx/CustomGate::read) .br .TP teleporter := .br "border" .br | "horizontal" # NOT IMPLEMENTED .br | obstacle .br .TP .B (CustomGroup.cxx/CustomGroup::read) .br .TP group := .br "team" .br | "tint" rgbaColor .br | "phydrv" .br | "matref" .br | obstacle .br .TP .B (CustomLink.cxx/CustomLink::read) .br .TP teleporter_spec := .br .br | (":f" | ":b")? .br .TP link := .br "from" .br | "to" .br | object .br .TP .B (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawCmd) .br .TP drawInfoCmd := .br "points" + .br | "lines" {2}* .br | "lineloop" + .br | "linestrip" {3}* .br | "tristrip" + .br | "trifan" + .br | "quads" {4}* .br | "quadstrip" {2}+ .br | "polygon" {3}* .br .TP .B (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawSet) .br .TP drawInfoSet := .br "matref" .br | "dlist" .br | "sphere" 3dpoint .br | drawInfoCmd .br .TP .B (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawLod) .br .TP drawInfoLod := .br "lod" .br | "lengthPerPixel" .br | drawInfoSet .br .TP .B (MeshDrawInfo.cxx/MeshDrawInfo::parse) .br .TP drawInfo := .br "drawInfo" .br | "dlist" .br | "decorative" .br | "angvel" .br | "extents" 3dpoint 3dpoint .br | "sphere" 3dpoint .br | "corner" .br | "vertex" 3dpoint .br | "normal" 3dpoint .br | "texcoord" .br | drawInfoLod .br .TP .B (CustomMesh.cxx/CustomMesh::read) .br .TP mesh := .br "face" .br | face .br | "endface" .br | "inside" 3dpoint .br | "outside" 3dpoint .br | "vertex" 3dpoint .br | "normal" 3dpoint .br | "texcoord" .br | "phydrv" .br | "smoothbounce" .br | "noclusters" .br | drawInfo .br | material .br | obstacle .br .TP .B (CustomMeshFace.cxx/CustomMeshFace::read) .br .TP face := .br "vertices" {3..*} .br | "normals" {3..*} .br | "texcoords" {3..*} .br | "phydrv" .br | "smoothbounce" .br | "noclusters" .br | "drivethrough" .br | "shootthrough" .br | "ricochet" .br | "passable" .br | material .br .TP .B (CustomMeshTransform.cxx/CustomMeshTransform::read) .br .TP transform := .br "shift" 3dpoint .br | "scale" 3dpoint .br | "shear" 3dpoint .br | "spin" angle 3dpoint .br | "xform" .br | object .br .TP .B (CustomPhysicsDriver.cxx/CustomPhysicsDriver::read) .br .TP physics := .br "linear" 3dpoint .br | "angular" 2dpoint .br | "radial" 2dpoint # NOT IMPLEMENTED .br | "slide" .br | "death" .br | object .br .TP .B (CustomPyramid.cxx/CustomPyramid::read) .br .TP pyramid := .br "flipz" .br | obstacle .br .TP .B (CustomSphere.cxx/CustomSphere::read) .br .TP sphere := .br "divisions" .br | "radius" .br | ("hemi" | "hemisphere") .br | "texsize" .br | "phydrv" .br | "smoothbounce" .br | "flatshading" .br | material .br | ("edge" | "bottom") material .br | obstacle .br .TP .B (CustomTetra.cxx/CustomTetra::read) .br Note: At most 4 vertices can be specified. .br Note2: material will apply to all vertices when specified first, otherwise like "normals" and "texcoords" they apply to the previous vertex. .br .TP tetra := .br "vertex" 3dpoint .br | "normals" 3dpoint .br | "texcoords" 2dpoint .br | material .br | obstacle .br .TP .B (CustomTextureMatrix.cxx/CustomTextureMatrix::read) .br .TP textureMatrix := .br "fixedshift" 2dpoint .br | "fixedscale" 2dpoint .br | "fixedspin" angle .br | "fixedcenter" 2dpoint .br | "shift" .br | "spin" .br | "scale" .br | "center" 2dpoint .br | object .br .TP .B (CustomWaterLevel.cxx/CustomWaterLevel::read) .br .TP waterLevel := .br "height" .br | material .br | object .br .TP .B (CustomWeapon.cxx/CustomWeapon::read) .br .TP weapon := .br "initdelay" .br | "delay" {1..*} .br | "type" .br | location .br .TP .B (CustomWorld.cxx/CustomWorld::read) .br .TP world := .br "size" .br | "flagHeight" .br | object .br .TP .B (CustomZone.cxx/CustomZone::read) .br .TP zone := .br "team" {1..*} .br "flag" ("good" | "bad" | ){1..*} .br | "safety" {1..*} .br | "zoneflag" ? .br | location .br .SH "SEE ALSO" bzflag(6), bzadmin(6), bzfs(6) bzflag-2.4.2+ds1/misc/000077500000000000000000000000001200563112200143725ustar00rootroot00000000000000bzflag-2.4.2+ds1/misc/3ds2bzw.c000066400000000000000000000133471200563112200160440ustar00rootroot00000000000000// // 3DS2BZW // // Author: Anonymous // Date: Aug 26, 2004 // // Utility program to convert 3DS model // files into BZFlag 1.12 meshy goodness. // // To use the program, you might type this: // // ./3ds2bzw model.3ds > model.bzw // // NOTE: this program requires lib3ds to // compile. to compile the program, // use something like this: // // gcc -O3 -W -Wall -o 3ds2bzw 3ds2bzw.c -l3ds -lm // #include #include #include #include #include #include #include #include #include #include #include #include #include static Lib3dsFile *File3DS = NULL; static int Invert = 0; static int ColorSwap = 0; static int Colors = 1; static int Ambient = 1; static int Diffuse = 1; static int Specular = 1; static int Shininess = 1; static int Normals = 1; static int Textures = 1; ////////////////////////////////////////////////////////////////////////////// int main (int argc, char **argv) { Lib3dsMesh *mesh; const char *execname = argv[0]; // collect the options while (argc > 1) { if (strcmp ("-i", argv[1]) == 0) { Invert = 1; } else if (strcmp ("-cs", argv[1]) == 0) { ColorSwap = 1; } else if (strcmp ("-t", argv[1]) == 0) { Textures = 0; } else if (strcmp ("-n", argv[1]) == 0) { Normals = 0; } else if (strcmp ("-c", argv[1]) == 0) { Colors = 0; } else if (strcmp ("-a", argv[1]) == 0) { Ambient = 0; } else if (strcmp ("-d", argv[1]) == 0) { Diffuse = 0; } else if (strcmp ("-s", argv[1]) == 0) { Specular = 0; } else if (strcmp ("-sh", argv[1]) == 0) { Shininess = 0; } else { break; } argc--; argv++; } // print the help message if (argc != 2) { printf ("\n"); printf ("usage: %s [opts] \n", execname); printf ("\n"); printf (" -t disable textures\n"); printf (" -n disable normals\n"); printf (" -c disable all colors\n"); printf (" -a disable ambient\n"); printf (" -d disable diffuse\n"); printf (" -s disable specular\n"); printf (" -sh disable shininess\n"); printf (" -i invert normals\n"); printf (" -cs swap ambient and diffuse\n"); printf ("\n"); return 1; } // load the file File3DS = lib3ds_file_load (argv[1]); if (File3DS == NULL) { printf ("Problems loading file\n"); return 1; } // evaluate the first frame lib3ds_file_eval (File3DS, 0.0f /* the frame time */ ); // dump all of the meshes for (mesh = File3DS->meshes; mesh != NULL; mesh = mesh->next) { // FIXME - Lib3dsMatrix* matrix = &mesh->matrix; // comments on statistics unsigned int i; printf ("mesh # %s\n", mesh->name); printf ("# vertices: %i\n", (int) mesh->points); if (Normals) { printf ("# normals: %i\n", (int) mesh->faces * 3); } if (Textures) { printf ("# texcoords: %i\n", (int) mesh->texels); } printf ("# faces: %i\n", (int) mesh->faces); // vertices for (i = 0; i < mesh->points; i++) { Lib3dsPoint *point = &(mesh->pointL[i]); printf (" vertex %f %f %f # %i\n", point->pos[0], point->pos[1], point->pos[2], i); } // normals if (Normals) { Lib3dsVector *normals = (Lib3dsVector *) malloc (3 * mesh->faces * sizeof (Lib3dsVector)); lib3ds_mesh_calculate_normals (mesh, normals); for (i = 0; i < (mesh->faces * 3); i++) { if (Invert) { printf (" normal %f %f %f # %i\n", -normals[i][0], -normals[i][1], -normals[i][2], i); } else { printf (" normal %f %f %f # %i\n", normals[i][0], normals[i][1], normals[i][2], i); } } free (normals); } // texcoords if (Textures) { for (i = 0; i < mesh->texels; i++) { Lib3dsTexel *texel = &(mesh->texelL[i]); printf (" texcoord %f %f # %i\n", (*texel)[0], (*texel)[1], i); } } // faces for (i = 0; i < mesh->faces; i++) { Lib3dsFace *face = &(mesh->faceL[i]); Lib3dsWord *points = face->points; printf (" face # material = %s\n", face->material); printf (" vertices %i %i %i\n", points[0], points[1], points[2]); if (Normals) { printf (" normals %i %i %i\n", (i * 3) + 0, (i * 3) + 1, (i * 3) + 2); } Lib3dsMaterial *mat = lib3ds_file_material_by_name (File3DS, face->material); if (mat) { if (Textures && (mesh->texels != 0)) { printf (" texture %s\n", mat->texture1_map.name); printf (" texcoords %i %i %i\n", points[0], points[1], points[2]); // BZ isn't ready for these, yet... // printf (" #texture %s\n", material->texture2_map.name); // printf (" #texture %s\n", material->texture1_mask.name); // printf (" #texture %s\n", material->texture2_mask.name); } if (Colors) { Lib3dsRgba *ambient = &mat->ambient; Lib3dsRgba *diffuse = &mat->diffuse; if (ColorSwap) { ambient = &mat->diffuse; diffuse = &mat->ambient; } if (Ambient) { printf (" ambient %f %f %f %f\n", (*ambient)[0], (*ambient)[1], (*ambient)[2], (*ambient)[3]); } if (Diffuse) { printf (" diffuse %f %f %f %f\n", (*diffuse)[0], (*diffuse)[1], (*diffuse)[2], (*diffuse)[3]); } if (Specular) { printf (" specular %f %f %f %f\n", mat->specular[0], mat->specular[1], mat->specular[2], mat->specular[3]); } if (Shininess) { printf (" shininess %f\n", mat->shininess); } } } printf (" endface\n"); } printf ("end # %s\n\n", mesh->name); } lib3ds_file_free (File3DS); return 0; } ////////////////////////////////////////////////////////////////////////////// bzflag-2.4.2+ds1/misc/Makefile.am000066400000000000000000000031541200563112200164310ustar00rootroot00000000000000EXTRA_DIST = \ 3ds2bzw.c \ art \ bzbz.pl \ bzflag.desktop.in \ bzfquery.php \ bzfquery.pl \ bzfquery.py \ bzfquery_example.php \ bzfs \ bzfs.conf \ bzfs_conf.html \ bzfsd \ bzirc.pl \ bzls.lua \ bzwcvt.pl \ checkam \ copyplugindocs \ doxyfile \ filter.txt \ fonts/DejaVuSansCondensed-Bold.ttf \ fonts/DejaVuSansMono-Bold.ttf \ fonts/DejaVuSerif-Bold.ttf \ fonts/LICENSE.DejaVu \ fonts/README \ groups.conf \ libtool.m4 \ man2html.c \ maps/flagbuffet.bzw \ maps/fountains.bzw \ maps/hix.bzw \ mrtg-bzflag.pl \ multilingualSwearList.txt \ pingtimes.sh \ rebuild-bzflag \ rrlog.cxx \ ServerListFilter.txt \ serverstats.sh \ shtool \ simpleSwearList.txt \ snap.sh \ stats/Changes \ stats/Info.pm \ stats/Makefile.PL \ stats/MANIFEST \ stats/README \ stats/t/1.t \ tar \ Template.cxx \ Template.h \ touchcopyright \ touchversion \ vars.txt \ ws.sh bzflag.desktop: bzflag.desktop.in sed 's|\@DATADIR\@|$(pkgdatadir)/|' $< > $@ desktopdir = $(datadir)/applications desktop_DATA = bzflag.desktop MAINTAINERCLEANFILES = \ Makefile.in \ aclocal.m4 \ compile \ config.guess \ config.guess.backup \ config.sub \ config.sub.backup \ depcomp \ install-sh \ ltmain.sh \ ltmain.sh.backup \ missing \ mkinstalldirs Rrlog: rrlog.cxx $(CXX) $(CXXFLAGS) \ -o rrlog rrlog.cxx \ -I../include -I../src/bzfs \ ../src/date/libDate.a \ ../src/game/libGame.a \ ../src/net/libNet.a \ ../src/common/libCommon.a 3ds2bzw: 3ds2bzw.c $(CC) $(CFLAGS) -o 3ds2bzw 3ds2bzw.c -l3ds -lm bzflag-2.4.2+ds1/misc/Makefile.in000066400000000000000000000345521200563112200164500ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = misc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in config.guess \ config.sub depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(desktopdir)" DATA = $(desktop_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ 3ds2bzw.c \ art \ bzbz.pl \ bzflag.desktop.in \ bzfquery.php \ bzfquery.pl \ bzfquery.py \ bzfquery_example.php \ bzfs \ bzfs.conf \ bzfs_conf.html \ bzfsd \ bzirc.pl \ bzls.lua \ bzwcvt.pl \ checkam \ copyplugindocs \ doxyfile \ filter.txt \ fonts/DejaVuSansCondensed-Bold.ttf \ fonts/DejaVuSansMono-Bold.ttf \ fonts/DejaVuSerif-Bold.ttf \ fonts/LICENSE.DejaVu \ fonts/README \ groups.conf \ libtool.m4 \ man2html.c \ maps/flagbuffet.bzw \ maps/fountains.bzw \ maps/hix.bzw \ mrtg-bzflag.pl \ multilingualSwearList.txt \ pingtimes.sh \ rebuild-bzflag \ rrlog.cxx \ ServerListFilter.txt \ serverstats.sh \ shtool \ simpleSwearList.txt \ snap.sh \ stats/Changes \ stats/Info.pm \ stats/Makefile.PL \ stats/MANIFEST \ stats/README \ stats/t/1.t \ tar \ Template.cxx \ Template.h \ touchcopyright \ touchversion \ vars.txt \ ws.sh desktopdir = $(datadir)/applications desktop_DATA = bzflag.desktop MAINTAINERCLEANFILES = \ Makefile.in \ aclocal.m4 \ compile \ config.guess \ config.guess.backup \ config.sub \ config.sub.backup \ depcomp \ install-sh \ ltmain.sh \ ltmain.sh.backup \ missing \ mkinstalldirs all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu misc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu misc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)" @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(desktopdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(desktopdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(desktopdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-desktopDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-desktopDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-desktopDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-desktopDATA bzflag.desktop: bzflag.desktop.in sed 's|\@DATADIR\@|$(pkgdatadir)/|' $< > $@ Rrlog: rrlog.cxx $(CXX) $(CXXFLAGS) \ -o rrlog rrlog.cxx \ -I../include -I../src/bzfs \ ../src/date/libDate.a \ ../src/game/libGame.a \ ../src/net/libNet.a \ ../src/common/libCommon.a 3ds2bzw: 3ds2bzw.c $(CC) $(CFLAGS) -o 3ds2bzw 3ds2bzw.c -l3ds -lm # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/misc/ServerListFilter.txt000066400000000000000000000042161200563112200204060ustar00rootroot00000000000000 Format: (addr_desc_glob_filter)?(/(filter)([,/]filter)*)? Notes: 1. ',' acts as an AND operator 2. '/' acts as an OR operator (after the first one) Examples: basic -- globbing case-insensitive match to addresses or descriptions including "basic" basic/s=2 -- globbing case-insensitive match to addresses or descriptions including "basic", that have 2 shots /d)test -- globbing case-insensitive match to descriptions including "test" /D)LouMan -- globbing case-sensitive match to descriptions including "LouMan" /p>1,+f -- 2 or more players, must have superflags /d]^$|s=8 -- empty description, or shots is 8 -------------------------------------------------------------------------------- BOOLEAN FILTERS --------------- filter := < '+' | '-' >

CTVRWQSRSSKIPUSKFLIRLMPNKKPXZRV\LJQK1IHQRSW]ZUT`ZRNGO^XRQMANLEFOIOSW68A9F>;6=?4:=PBKO DMQXUJANXPPFxHYE:DPB@J>=I:LFH-'2-GSQ\@BDNJQC;EMC;WZ\TN2,0IWRIDTTSAHVQRHKYX\KKVPMd]NKXTZPMBD>8DK?LLH:BYa@B]ZAOSZLFEV[]_PKTRRWaZ\UYegVPh{1e^adeYWbfli`kWB36JgVZY?eLN^_]TG\^VTYY\vp3Bdo`gJ[WTRJMUWUNNHTUPJuz`NQ~uKUMRFD802=6DGCFM)16OPPO=JLBMEBLOL?LQWQILLCFESH@EKJ;:LFSSO?@LKNPI@ONETMOLUXTNSTKQRJSMVUENOTOMOQNFV\WL`WQWQIIPHNU8XZY]`TSPT^Y[UBQFXUE\HDNTcE98?Z@=7HO:<>LCQNTPHLSLWUQN?LWQGxFYHDMRHLPABGDSCC3==C=M@S=DMKWTKCAJ8?IRcYBH@HSYMJRHUQGSTXWCHZP\STHQTZWYXS\ZLAJRGCLGFDRGCDK\FIhI>J][NDH[]OWOH]RN`ZY_WSTaPNZ{.jccmkulmjNs|nt^txvfWXq`T[p~p]Yk`nS|~nVP^xuxY~iK~gRY_pc]cSO1)BRmrog5HZSRQOEKNN[i~{n`Y=C:sek|ydLXs{jIGtpMGPJ6GN:@VOLSK@QNYUZMRH?J]WREWV?IM@H=C:=M44KEX]SQRPH]YVUPMSPTVYUR\ZYM\\A=?7BWFOTUWQWFD^\YWOS\\ZOKO_[YTTRd[K]AMGV78DNQUHF??MK:;3JK=NPKFSQIJXSU>DMVJWMIORFT;FSSRSIG>LKVT\VPDVFGRIS`]LW^Q^QNK]RMaYQNMMWS[JPWQPigrUXdVXYT[\ZLFRWTaafbIWa[wkVNWjWPYLQ\bOQMIOB:388MD5:DC87C=P\ZVFWQX^]O[D>QxX:ANE_ISOJ\KQY^]EOTHW]SXTXVCJY]U\UMR@S``E@@POSSJX\^aMLZdUSRGSN[WO@SP[ZIF`CN>DJJPSPLVH@X\bPUJ>NIYTYWaVYHBQU{._`dY~gdayvy|plfKDWjnRh{Wch_zPT\N[dneZo[UoTZFkg_RRcgZ[^wo_MPxdYRbRBFeS^x`9ZvnVJX`U|Y[YOTR^~rNZKW{OQly`FNDe{nQP\ax|GSXVRUTYOZ]bdaPQ?[`E^`P?TIGMQOKM;CZE<7=@8>@SNAORVRAB^ZS]QPTWMMZU\Y`SWWZaFTNEPSTKHE:ENNS^REIVDDPLQYfSHSO\FEG]IK]PNDRO]QMIWTTM`mmM_cVQQZ\TQQKLYP`^f^IT`cwaRX^iZHFM\cZK\INJ>A>15JJ0DE=577GW\_[FFOV[^OLMMJx];;RE[ISP;P9D@HRGJMCVXPID\UP]^OKHYOHUMUOZSKPFTSaSRKHE[cL??NOJSWUVc\RM[YNWOEGJ]^cNAEZSE@`MM<UOLG@;RE>97<6=HKNVHO_]F@\YV]LQTFI\[VYKS]^VQZQG\O>K?E:=CLS>>@AFD3CPG?BAHR?OGFG[X;@P@CIQWE>E9=JLKZV>PS:ALQWN\RP=IOGIBTGJZKQMMQTIHRSW\F^ldH__aORYRS;OJUOXciZIL]fcXR[a`Y>FLI?HGJ[IA:A@769E4CC?488:Q^XTI;EQXVIBU]BxBJ6HBJCVI=A:@FFLMMCBGTFH<[_O]ZDPMSRBJOMJFHV\C?I_UMIULL\UA7PJHMYXLeWT\PPNORPEFe_\R>BIQ:BRO?GC5GQRPUCDCJVNHQQDHCUNNYWWBHP=C{ /f_Samgc`|vituIOMe{so`l~{PWfZ^[NXSW[hpWVRxNO`upPSYRqi]txmH[[]ajPRO`|_Bn~t_IGSjQwxKLYY[LgYYUSHSfo{MWXNsyr\L~YUA6mZBN[afuKZNTW]KW\UFX\^KIPVK[HBJ9X\APPRYMLP@NVULOJPG_[KQSET]J7=E>:?L]>9GG>?@CIF595;@:?G4997:ERTJ@=CQRNEZ^Nz:J:<@EF>YfRVN@RR_JEKQRIGGMSAK:NWIQF[INWJ4KIQBU_OXV[TKOFRWSP:SUTTCHKI2HV?AQI78MRGRB:JHYILJK=G@IOQTTK:MP7;{&d\N^vu_cc|octuQMJZxwqbdxvePZqOLKVNLVh@GNrlONXe{jLeocn~srNHXRNgjuVMV\ie=f|h[@I[gZUnygFXYgT`X_OOPNOoiNSggfYPiTMG?LrhOB[sUg?LILKMCT`^J@[^IPF`JEYG9;PX<>JE=I9>;8@L589T?DNSJRO^I>QDL]QE=JPKVILFQE6BB4=?L=:@E;=?AFB8IBHFQGJICLA5A9FCOXWDDH>88EEK>=IC;@AVI>E;CDISeC?JXTFHZQCTe^DSXPLEW`SFMFZIJJ^nRILCLRHZgmVQB;C?M^WDU>@58;67:.H8>F1:81;>KUC>D>H59HFERFCFG=8OE=BFMPFNU\<8AN>H;BD89F=5>J99AC;7=>?5F?DDIGE@GH@1>>PA5?FON9zD9?P<67=PNJSH;NB:18M@7;AG8>K?FG??=9AHLYA8LQPdGPL>PWQFgQ@AKQ^IAWJXPDJYbMQJBIHKacT\H@@;?@^WB<]i6/758?43;:96::7;KGG:D@HGMFLSZEzFC;6;>>BB@1@EIEOB?F9:>=7FM96:69;A==67:?:9C>CEI@=IGA/>:C>9B=KO;>8<5=?6<48BM>=bX71<247894;0:S@5NLOBzIG>2:M<@P<2HGFFP=:KG=FEHJ?GBEARTVKIG87LXA9COP=A@>IN@LGFPcL@WYGNQ>HFQNQNJT\JGUbJPjGCKM;92D`SdQUMPH^HeGVJ;FTIDJU[C:27>HDHMA==77:H<9<9B74APRZLPD37?E@75=8D;9?9229=>:?47:>=@=BHG@CE=>18:@:B>@A}DA20=C5;>4:IC=>B=A>875:E<:8::C;>F=7:>6CCJ;<=DTXUL?;;JIF:[WFCBFGIMHKM\ED]GGUJ:KTZnVD@=A;BG;.87215<94/@>IVK9BHGB=?CUSSRC;5;EB?>J:=9@LU=IVSDSJL>LNAER_jZ@AJgTL@>F>NB=@L>=>>==;KKD`VCl]7RRP=5.Ahd^ji`HXR=CBTOJMT\MC??MC=ERNKrJ?]ITlX^jiKOFLEFBCB?UV`]F8-8@:BKH>7::8><3857FB:NPLD@4UKQQ58CMMI:9?QSYOK=;:=KNC::5C>6>>109:<7N6;::@C6CHE? 9=10>?>LFA5-6AB;:>85D@@A<>==770AN?;67>J99:;?783D@>D>=?MP`J;;>?J?9JcEG=AJFF?HFZI?UFDI??KYbPTG<<;AOPIG/B9::313352868207;PPC2DO8A;G@>68F:;y<>8=2E@@A09EHDC77@LC8C=ARILHI?>68<=;<:7<;CF;MIMI?CAHIMDB=?EL9EG8L?215BSL835A;8F@79D=DHL8A?:LDEF@?<7/y#:CCKOOB7=>@@D>@;==><<@B>?F[HKMKaO;G@ID=;FKH?8KMXNFA;C98GB?:/;B:>?627576>6=69@C49DE;5B??1.>;;N???D66164?EB768:556=9INW@:;9CEC2SR?:EMJAL9DI=98GCNRc528=6.09227@904303J99RDG7A8AD@4@49E=:7;4A9JC19ADF84=:OPCDAC>D@:2E8D@1296@F028>H6D>:5C@;CJ;7;8MBH@E2x@CCVKGNBPZD6@GJA=OEIFEV@JG@47<8>BB96;=<;CKA>@C57592949=76:BH5:26C/9?=>=;7-78B>;?=,?54;F?8>318>F;@=:4GB<6GI=;ERXG>:7;B@@FC?9@NEFFEITE;:A=JLR924?423=1-7:36322/47HdK<6?8>@?6A75DxL28=396G?2;D>4<@GE;B@8HHC6?=875=?75?66<:;AEMD<>;:PVC?<:>A@C277=C13C6=17:5@G>6:>2?F:@B@468MC@DH;% w'5((&+;1""*'&$((+,(+%'%%'+%&(!#"#"&("%#"*-%&#!#"!/1''%)(.%/'')20("+.)$!"6+'7)&)$+)&,"#+#"'%%#,;:1 &.$#39$"+,*)& %'&)$")## &%0,%"()&11/1%##%&$"#)!!$#$ '# #&%!'&46$"/.%()/)&#++"#(,,+&&+&'" %"#$$&!!"$ #( #"$)'+#!#&& "%&$%!&'(#s !#$)%(!!%#$!&!"! ",$ "#(#!)&$$ )+"!,##''40)"#&!%&((&$#&1)#%+/*)+$&%(.%"!" ! !25.& %#'" #)"w&!$%#"$% ##"#)'+& (% $&"%%"!#+,$$!%,&'!%%#"#'#!"#"#%)(&'&%#0,(%)$"&$&"#)'&% "$&," % !)%%$&&!'()  *I   &    !! )!%,%%),1-118 ;>>B9>BBFHBKBLHHFKLLROLKKRLRLKRRKOLHKOOHHLFKFBFB9>9;"811-1,4,-,%,)%)!!!    %"""))""3)33/3939939BBGGKGPGTWUTTU^^Wbbeb[ehleiheolhhihohlolhoohohleihhehbbe^ W[[^WT[TPPUTPBBKK>9>33/3//33""))5)))5)?H5H5QHHQ`Y`f`qqfllq|qww||wqwqwlf`qfQYQH??H?)5))) 2TT22l~?2T2l2l~~l~.ĽĴl~l~lTT2~2ll2l22ll2TT22rz *\a`kmmdeVSTidrqw  9 9M9MM 9 9 9MM 9M 9M9M9 9 9MMM 9 9 99 M M 99 9            !           $                        "            =        9        2   >                   2                                             2                               - r߲n^5t ڨ + >                    p ̜i7ymKӟ*:                   ľƾȝf Zz8              pч,tS ~Ż=  !            8lʜ^n< rܪ&П8l%8  "      #V"DlȒJW ڠ =w9     $   Neٷ*  jʂ7<SК;:     !    ި$HR  bv!ým  U;        u ¾ D J ub t¼֤^.;     (  zϘ jȼ5Tq“<      -   i ۡӇ r հʞ  tל z;   *  rؤ $ j̃ +6 oӤ  X/;  #   h ݣ jҁ n~    (hľ T 9  !   n٣ Q  _ C qӠ  ]:    hÿ  4ǿȿ: h˸  h  l ӟ  :     ) hƿýբ  ;^ i8  gɳ  o    9 !        ]֣  6k lѐ 0 ļǿA   mϟ 9 ; !" !"!"!"!""!"" !"      j 2 ¿c  j /ɿΝ  ( aǾÿü”   :    ! !!#"# ""#" "$# " "!!" !      i!Ν   :k  b  5   fϡ !  8     ! " !#$#!"%""##%$%"%%"$%"$""!"!""!"     34 +   _¿ ¿  3ĺȿ W  eC     Ŀr  lƿ ̕          :  !!""$"%#%#$$%$%%'$%'%'$&$&%#%##%%$%"$$"#    Gwmc4 T dƾ¾  11  9   Nľ½  c¾ ˜ J Ľ ;½½z !! $""%#%'$'(&'&%%('&&'(%%'&%'%$#!  FȾ½  P_( 6  h Ƙ  4    G  e»Ƙ  !    =  "##&''%(&'((&)'()')('(%'%%(&$##"}¿7»H  ~ wA4A8* c¾ 4Ŀž s     i ǿ¾ ( `ľž  !   7{¼¾¿l!!"%&''(()()#(*+*)+**(()()())'(('(('%%Ŀ 0 wž  9j ¿¿6* ]Ï  8º5   ļ4  f    "%!##&'&')!+)**-+,,**--*+*+*+*++*+))('(&%  ~ |  7 5 c’ 7Ș   ¾þt  ` ”  r;   ¼¾ "$$%&(#,)--,--*-,+.,-+.+*--**)+))+**('%@  >y  = 3  d¾  7  7½   ]º   `  Y "$''()+-,.-/0.--0.0-/-.//-/.-,-,)()&Pľy   t  +2  bbVk D G Žg   ^  A `   -+c"$&()(++.-.1010/10/011011//1.100-/-+)'#$  o  ú2 ^t;)"(@y   | x  G#  d Z  h "&%(*--/01213121312102210200/00..,**):,  )N  1  ak07k  J ¾A  X} " N]  "["%&&*,+./00121132424331412121210,,+)'on   5    3   `z.# X_   ƾ+  h   ]  %[   !\ !#%')*,.//2345533445533534324213323311/-'+*:4  4  *3  _*"; ;J  mD  )&  ^  *d  U ` "%&()+-1033245546556566566556445456454401+(ľ-  n 5  S/  Z>':   r3   5  U  1Y  (\ "$'**..114556767757577577676576 2h*J !!   2  0 1 [e2?J:  -Lp{R)   O  Wz   ; ^   $Y "$&(*.0134677687878678786886543'#  " !!% N/  G5 @ Ou/.#!1G@3 )]=   S  Z~  /0O ! ! !  `$&*+-.22466778878787876(7B!)~G ! !"!   /  /  Z(v/"%>99, (uE$   *. + W  4'T  ! # $ !#"! ^"%(*-0124668798989898998898 76ts'Ou" ##$!"#" E3   / /  T+9C978- +zN2    hu   Y }  / Y !! ! #$!""!a!$%),-114577889989:6680 ):Nr nJ&  7 uP  Py  2+] !!"##&&$&$%$#$";_#%(+/0346698;:@`ʼX:986qX&_i!""%"#$"$" c.      S2h:;734590  (yh:   9   M {  4oQ  !#"#'('&%.\$'*-.246789;@x̽~v|X?2 0"&@B!#$#%&&$#&!!}/     Y So++@64314:3  .]   4   Sy  LO !"&%$%(&%&%%$#'S$&)-0257899^ü"wnz}6H%%"68 ""#$#%&&%#!" 1     ! >Gmgedesxffpg9$?4/,-.392  $e  !!  On  !  Wn  wR #"%#$''&('('%% @R%(+-13688=̽ƽ{u:*P'%$mZ "##$%'&''#$ 0/  !   !" !,#"*11ERautV) 7320149>F> ( (^  !""! )  !!"!  Kp  dW !"%$%&()*)('&$=V%(+/2378@Ĺ|r/<%%'&$IC #$%&'(('&'$S0  !!"!   !!"# "!!'.0" +xB&, 16>D?   B ~&  !"##"7! d[  !""#"!  R p " `U  #$&&'')**+)*))( FT'(,0357Kƾ¸θ]<^v('&%# ) #$$&(()('&%Z0  !!""#"!   !""#$#)!"/0;- dwixd6 &0*.6?F=   sB  !""#$$#" +   !"#$#"!  Pm  rP $&'*+*,)*)*@S'*-035KŸĵķ¾J8O('&&$nR""$&%&())'(%j/  !!"#"!   !"##$$0&(185'?PFCF= !";'.4~}P'*-06··B.jq4 @} i !"#$%&&%". "##$%%&%$#"J q(#Q"$&%')**--,.-..,-*+4Q(+-2ǵû}61 V?PX>)()(( L"$&')(()&}x~~ , !"#$%&'*"%$)((  -*$!2(/433.'|||{3&()*,,+**Cvv{y||yyuuyvropuuww{+ !}}H !"$%&'()**+ ,.,--,,+**./..*,$ 00& ( 1!&+194  (,++*#*c ehoqsqrqrtvt rsqstrpsqrt _!#%&()**+*"|~ytsxyy|x}y~zzyyx@29AMV[fowfM3)*M+}V?=XN2p~~zV>Ukfhfdd]km943$Owuuyyx}z|x}z|yzy|zzxn%'**+,-**&||}|}~~||||xurqss( ! d~zyxux||xwxxy+!"$%'()*++, -,?&(*+,Dlomov^0 " S 6!%)/)   !,RrrmroB,,++*(7FVY_cedee_3 1QVWZWXY^`L!$&()*+,++}z{wwsswwvww{{|z}{{wsvuq)ouul85@KVd[ZcdszS5F~|zy{b1*())*+*)(Cuqosz}}|zwvsqp uv`"#%'()*))()&$#"" "$%&(,.-.02K35546654311yuvsossnknsquuy}}z{|zHCy@<9@A:p7@{ yH=`fIrH\y~74[ntU4bV?\x|~g@vx@(&**))*@OJMA()+)*)  ,),+)'3VOI5%!"$%( /=:\{L1211/(7FFMRYZZ. "=[JLQ2 "%')*#+,,&gvrqtusrrnkppurnnpqqruussuxurnj6@5>NPV\_fjlvZ8Arruurrstd9H|{rD,++)Ctqrnrpjf efggilhnnrqrnqns[!#%')*+-.+*)()()*+/0011345657788667554y||y|vrrnplpu8ytqC(er}~M8gzyud6Hj8Gsqsp:8ZY9&),.,.--,5mijllmnonprrwrnmo)!#$%$Xonmpuspsprstsr*!#%')+,-.//0T 11.3+18Fib`n@6:95++-0:TT@KngaW700/227/!+02217D_uY[f>../22$$cVq@14634!8Ry=6:@FIJH8!++,AX#  #&')*+"aghffefcfehhggkpkmiifcbfAeigi;4;HPW`djoqu<7Raaefkkmpna;GpvY @mnnrrsqtvrrnkmligllhjhhjmV "%')+,-//1/0/0-.-.--.0/14656676:79::87756qtxxtsqnmkih@(;Jlpttqrusqmjggb`ab]`aadgX(*,-./-,+'gsqpplqrprspr* "$%&''&%Tffknmlhhgc&!$&(*,-./001y 2182NalI01120,18Nw{Yc>022117^q_`<011/06?[F E|~XF80103Al]B?;AFHKE?3",-+&.E= "%' '(?de`dgijlnJlpqqsqpmmnlmmiieegklmT7:IMQXafqxz|{z{w77Qwqmminlkgg`>HmsyZ"Bpprvr sqtspnkklkkif ilnmnnV #%(*,-.0310/02 34366788:8:8:8987okmliigeeiki,fiiloD8Srx|j=EaddfaV=O}~t[4Gif:<[^X;6 7866451/20/1Kkkorqtsrqr$sqolpl%*,./--/.+.gkidffkilliieeifb&!#%&'($'Xkkmmoqqrromppqqrnp* #%')+-./012 201Rr{~|sppu{:(>/Uw~@0112ZZ'.( TN400/V|r$M|}E(@=9""( $!3H4,4;<88CFMG:ORUZY]^_`dejlmjmnnknlieiieeggjnk>9FPPTWV`h-lrxyb:5Iilmrrppmmjkc@HnrygARqtpnppmlgfeggjijjijmnomoopqqZ #%(*,-/0113020013435655798:;;:86gkkjgkomkggijljkoJN{}u{wF4]rpmR1>TPVXRWWY]^]ZZROKE708fgjiidgigkikggkjij29),+-0.-,,'M_cbaeiimmkkllollkgg(!#%'())((Tgefeedgjjmnnqqro)!#%(*,-.0012 301_gfpqpssTJD(&?%:B0219p)+-  a;100zA#&CxWKR1&#%8lmhieZU(05:>@B@>96 +793GmaG[bmQ,RYSSVY[adfgfiijkhffc!dcaa]aedfI68BD@HLHT^crt}}zQ8;Llpmk!lsmokk`?Mnxi@Uljkmkjkfegihfdghjiefh jlW!#&(+,.1.24224212343344554647879:8989<;:;9:97jmpkkjhhcb0][\Z[]Z[]aN?Pkry?4Qefeda_Y;Jtuv}m45gk=.BI@GIGRUZac]__]]XPJ7/_h lpollmmprrpplljT#"*,-.0-,+bjojjmmpmkjlpo+ "$&()*)Qjglkplhhggff(!$&)+-.01223 41.:`qWNUbZ7+&'(' /kjKL21V8|. \ZO?@200Np %"C^:-&'(''&1FjrUGHI$+0489>AB>:5, @Q=! GG$sfP^LLRVY_behjmnqspoj?mplljhjk`20:9;9CGOX\Zcfu}Z>49Xkmgnjjhkojhjj_AMnuyjAUkjknlljjnjjgdbacc`]]__^acgQ!$')+-/02354553535445545668569b;99;<<;;<<997qqljnnjfeecdegjhgkojjgR;Kjs|E"7fb__][^U'19<6@GGJW^ea[MA0,<]ecgcfgfflnh[GTqr{b@SecfjifcceehefjomjlhlfeV"$'),./22356565757667:9;:;=<>><;=::8ccace`cecfefccfe=M.9YnyX(-\\[_^]`e[;AhhdlicL.2`ceiV*7JF>AEA>LJOIW]^\VQRRA2AjjmmnjheceecaaciC3K\RD2/0/0.,&3ea^^`aeihie,!#&(*+,-,,Ujjecc`^__[_cacc(!#&)+-/12345678 520(,.1)2-).DXW?0*+,--../.%'8PM5102001/ /210@151-&3IOE0.-.,,*/&"310)+]ehjjmmollgiecgginjf?04BEGKF<7668857667:7977;9:<>?@BBHWYX\aeo11efehiiehgiFjkggjjlmmO07QiyY90`eijfhhgiZ2=YZUZXK*+JccdgI.>C@CKFHISQIEKHJVTPOOPM03cdc`ddedcdeecehedadea`]O19TSVK601..-+#Diifcac__^__`^`aa($!#&(*,,-,,Xfggij"geghd``]\'!$&)+-/123459@J[nwDM<&*,.27@LKH6.,.//001137AU]Q72 32""02 8524:GcXI310/.)1&4.06=JLJ9.-+)$"&+059>DI;. 53.1'"366$3/369?FLRVWZ_deeb_\`le\$&/5@EIH>:7.'&)/AWec dejegkgiojijiCBajpynQ;7Innjijgeddhhgcfige a]Z\ZX>6;GXf3v{|{xu~vx}~vtzxw}|~e-9][XWYY[\[_bcfefdd`\`J2;P]hit}2`@C9[__cc`_cchW*1GSNSD('>__^]]I)->DFCDNLT^MLK@:BORKGI2-R]_dehljmjjg$daa\^__.0IOOLD:10..+("2aa]aa]]``bffe2$ !$')+,-.--fdedadejjhddebcfc("%'*,4ATcs} @L!##"K#$++((&#"!"$$%&'(*1$"$&&$$ #& #'-38(, 8k<#'+>S%#),25;?CINQUBW[`[_ib``Y($0/;<3)'7CT`jjgfbbaaeddagccjijlgfell]2,;>BShtO$%&?EJUTQRUbWZeh[O*07;15=fgfgfgfhhfeba``dbbecaamlehokegW*4QMOOQi;9``dbb^a`a^` ^a``^`bcb``^abbc^^dbacbbaa\++ST`voq}piaieUQ]]_domhhffaXX^hdY4HIP^5ae_]ad`keggaade^ldcearP,6D?ABb`cckb[g][[^a^^adbT@&1IW][acfekcacb`aE/"/SZU_XTN^NK8(:Rfhihab^]aabbcdg c`b^[L>3-JRTPIF>9/*(%4Yba^ZWVSW^-)+((Ueccgk_`^a#^dX6.BS^ahd`qxzsux{{<@j+ ! ! $&'-(#"   1 *#: ';8 C=6)&'&'/##+& +  ! 2(3)! ' 7 Hm~{UB;0@GGOZUWY[i]^cn]%"/6<10+Yc`__^_\\_`^Z^^[_+]a_^gc]fec_fT/1ADEIZnC*PYZVTWVUX\\``^^__a__^Z]`a``c`cdjed`_\ZZ\XYXXRWT/+UW^ysupsqg`PNS[[YXWUbffid_[djjgb90a]\`c`_b]\_^V\dabYY]fahc\_pnB#+>I@NSMMRCFQA2''#2R[[^YYVVXgV46%;ccdfmqeefeec\D-%+9ENTY]aZY^ajji{|z~{{v0Jx !"#):-(("  7 ).< ) *""@-  F K9#&%-)&*#$?7+*( ,('!aoiD512O]\_\PAEWM;.($%$?R_aa^_qb07TL7(Bd_^gn\Y[[Q@+#4OILLR^_gmla^cep}x~x|z|{Y} !$!!@3'+1'  >" +"/63)# %6"F.05 !Q(!&'(()0., #6GRfx[M[hb&BPXi\yǡl(* ?.# &"<3""A*&/3D-/5+)* &%&%*/)-$%( 4,0#320=)/8<87?E[[YRD.#(%,7!!#),+(*('($3 ,.,-JMTPCOVVgwxgOKKP^aLP\PTRR`k]pc\ZaPAW@ #-6+;++&>4)';G>''+7&)I'J@5%)1OJ&+A'"A0M85-*)),EF&+3) '#&"+(>#%"#$';+%UjbVR]UKSXB1x%"*#(9$%"&$&$ %1=" "#&%&)% /-1/ONR[lmi\PGPB;79ELF6)"!3FTbreA7LKC4MXV^jF>6')4>JPXO=FESdirusa_a~~||ur}QE!2<,B:'#&/ -#>& +(D/6> . ,$#D"K& 1G-#"D]$&%(?-'#28 >@eWD\41mU̧Ϥqeš70 06%+$906D7!;IAKI+$!,)%*:#'*!!."-30,944=57=<5==>CMSMKK5-&$51"#(1:52/--3, 8!"/4#+@]B@98LVX[hr^SZRWbiUFQ\OJEONJSU]CETS}I!05,($";,"&7XK-/',5/P:V&4;.-NO+F& $F9M96)#%.Q=*.(->8# $" #)C%" (%%3G=8`RbgvOBQXJ?x/ %)D$, (B)! # " $""',#1,6NYQQT`^gfcFDG<8:9AGNPD=51127AZQ**((]^*"12+$28("-!*/% HWO:B5Q|L|Л^]_p1È)7M<:E]9::!><-8@&0[2+QUJNE99GIIJBZJ250=3*E56BGFM?LMODBODDBA?FTM@CA>;5>89,3*DIA87=9,2:;CF:.$#!!&!C,#%% "%%7K84YK6RdVS32NbFFJJFYcd\\c\YghdP[Xkuyycdhgrsmzxs xz|uiqx|utv{=tz/-8BkɿxURD515,E;/$D@*G3"-W1JOQEUNTHYPNMSL*(*5116D6()7/GMK;?OSNGQTAAIF93:?@<:D>E9718JGF4/<1/3<:=VYE329L98GaU8:EL=A?>JIB85A,*5B2O=:9&3>8IVVgodmogn`aO?RxPL@7MU3$')<1F/K3,0$$-,'25),.-C>.JJWb`VXYceY\UD>SZ\^YRB;AMQU[WQUlXZcogegly|uPTqonjmkb^W^p]S[e_]db_aitwwqnpvnkmtxrtyvz{8t%1L?2055HB9>48;633CCHEZ;J2=.63J\poZxrsn\g[DJ^]>6IVW6$+0>K>I;+3)$$,4',60/*3BA=E<7K`[f`e`aRDVSPX\_eYVPB:K_SQX`va`gqozrYl|ossrsu{POWYfWXa^[bdpxpnkvljxmnomqkszp{{2z@MH;58nN6=4^DD++ -KGRM?M]2.6_c2 "MKE:VL_b,'6I6%Z?@3BLH4VfL]J?$'M,/NGEO-23G+1TJXkdszjx^468tzQ~}vx\ATz{zdRD66:=2!=::QT4*C_hWNZP_Xc[G5Q?49328A:D58>RHIYYUY\GFTJNEONJPVVRA;<61LG=88;:115@JFSKK:6;K=))'$.6+#38%'=P7B?*&)>P:J`>.0DUbQ:1=[j<,ETEOcS_EU8KxQ?=J5`}Y07MoPTB>E7PJICRWBKYFMOL3M1(=@;G+"3@"!=BFMPO=>CGSTWRTRERFSUQBNKOWTQP>4>BDRA@(>7209LQKXIG?8EN@0(*(?E1#<6&2@O8*KF04IEGKO>?^>KmcBGSUn\QUUQCacUWZHETZrei`XY`ijX5HPQ_A?/RkiRC(@hr>>BRRpdYgdUQirQHIS^|}Q,FqRQM=A=DbB6>DRL8EW[IOLKPbOT]^RFWR>]]Ofprd\aG^\xh9H`[`@D@c9AdG=/-,,1)?8.$/9>UHa=8L9=>B=Aab>^XS_>AMUV^aVO\a_O]_otWaitwmyaZfc[a]ZVormiHUfVZmW]`rjdrnxxgfefrr}yiglmjnnw}{o{2zq^G2-f /WTBL?$*O*X;^#>9[kaCRLYAD)7jCiA4.JI:7\YUZ-.D1X92j)8,V\ZLFT23XK1TP*0M-I$""D )*2H3G[4I?)>:*'('D;!.$+=CJ9lXUI>C=-6O&=)>VL@8Xl`Qkm@WUVUMk\XcBWWEGHMMNC97>ATUTTPWBRTSYZGIGVQMR>/6:BQ_@GD<@9:59QTFBAF;:BA4F<)$TN3*;<'+EQ<1=GX6W>VG[?A^GTpfTLXjPFNUK[EhqKVcA?\YhxiecWlh{yj5-_OWNS]WTmd=)DowLF+Y]{y]XicZsvk{Q\^[znJ9kJR_:;JHQYGW\^ZRRaKSbZZcQOTRDAL:8E:GY_@BIFJ;?:FX_A7HSCLBL_VI^5bITgW`z][UicMOEPNUTloR^jKDUTj}rsqi_t}rfN=VV`[nl@XfiX8Vewe<=drpxnI\ri{ZeaO\nytZ_mL:QR;I_C@eVEHPGYihJXPKYEUgXJXnPAkjYinnyul]bkr[eZkmfMS^C_kS[UUW;>f7//CE317<:ZOhBD\SO=JkeNGGaoIKHQbRM^fdab`\QLKooaaot~c[j\`lh[c[i\gX^r^R]\xpdb_usj~ga[[\cz^quqmbmnbmrqu{9ewiAkM(d[Cgm;aHAmY(2rWEaekZYlqhlmPPU5xy>bhAFNpcbq[em?QcQb@oWRTOp`R!<`^)[fJH_C -HQSICJWPO!"+ PF\_cZ.iCL``Z:T@HBNZKQ?5@UKoZQgeU'@bXQCG:@NWdW^jp}lmcl^dkexshXLDZHFCZbZRDL`eg`cVMkYTee^aWY\JHHTCELE]igVQ-&To565VO19?`RYSO._c]UCe^eobiySP_jeWR^VROja]r[eTQRdltzv|idvnnVTVQP_gJGhbXhXbSzh<_fsqqdMkrv{ay^Ppmtriy`4A[IRkX>Tn[bZVUyweZ]U\aYUlCJjgIZ`iZltt|fhrhrjOgatvoAUaad]jaUVQNEKOG?3FM6>LIDXYjCKw[CBct[LKNujV^dxi\hdledkfk`\VtvXXaxf^ebiol]Zm^ciPrq`jf`qghbYi}sgdUSVphe|mouehkjt}z~{{>f}~pQp'^IZ_O{YpPeXU&DufQq={h8qzolpwgWiqGQ_cMelpi^^rsVffzNb^acmjf`W VWgLo]ZbbI&>YO]2=;T_bJ&G0bGv{}V=]VUqvvwY]OY-;oT^g=ZEnoMZe3\kcYTXAO[\gersx|ghpvqqprqoUNBdSIVkj]QVg^mfQdjWdcamkgghmZK_Y[>DTVfljSEKI_`O_`eaH3OcQR[GhZCJZhpRIeialgmuUZhhn_`k[[ctbTv`dZGFkUs}zdhnru_]gPOdouLRuednq]JxlUkwqx[dgxswftswkrr|wqMB^_]vzopv`V\bO`]cm_NZhZ]fBf_eqs]lapxrtckvznebcdxvpq`ehaAfqjmgXL@QMTMGP^VJMGX\TbBkkXL\tX[FKhpocYn|jesecjlh\tdYjtc\Lgrh_krns\Zsje{ggyf_nYYt\b_dvwhsiUV`bferoyjkvq|vz{?gzy`9h?*dqnmgbGB]S<;hne\yTtpL_~oqcoxW}hY7vgkvys`fnN^dskt^ppu@MyQ,o8]ut[\g\O7YZZR2MQ7]fG7AG.$=cQm~pxdD`q^s{x\E$0jXqjt`qT=WhUr_QbT\U\[usugw{w`sjk|jo[]^k\N[lm\^baedPJ`redjcnosuvnZIU_ZQPY\d]lKX]]Zki]^cZLIOpU6YAGMQUXjs_6?[O?HcUpTE^Wkrffd_cojrhnhnThtXeaikeh\sq[bNNkFdzfktvnchc?eqkhdlsjleukXtpdrxx\tutef~svppV~{qSjpYyvqohmZ`d^ksw[bqXFaaiOcbaTiqgisuwnjmovr_bprxoryqvoW6cnos^TQCIQdn]beUL]TN^Z_e`Vba}d8SC_mVra_u{fgkkckrbggXtne]fsynaojohs[stzi[wtX]idWsZXswnjvt`dzzWhdjtuwvzjxt{=tvPqC/[z}~cZl9XW^WJaj{Ri{TukMylwovtui|diBrjiy}ioh{t:cpitrivxd4DpGOXdss`]X_`Wh`:OId;.TeG-TL>4RR-erEWhcTrxN';i_jQ}j`HHLbtbkWKfNdda_vmpgq|uZvxao~}dofhm`OamukfU]gV@MdpplmkxyqwwgaTTc`aYgbd_hiihWHfiidNNkSCwK5aIVDW`Eod_>;aY>NkjhkN`_turxXXfwjrqijnfengjhtcethqvZgN]j[\~t~uzoT`jNtujcjuljjatphovw}~vxnrxx}r|yxyxtr~toUqt{s_shdoWb]yxkngimcVhgd^njMemzogj|uqmnwz}xa]wzxlrsn~gie^]jl]qdPPJSvodj\lvZYh]zlCTsrygONaj@Duffspgsll_kumt|j`ylh^vdtqmw`og{xytjuWcq`[ieg[zgkxy~ogmuouhbpvklyypzsx{?^b?Vyn|p]HigjS|{\h\iuh~xxguy~y~oxpjwv~|jwqraWNfTi4awfkgiT.bYS@5OYDGU[T\fQ6vrwv[qq_vnKDFkc}Z{fkNLZ^XpylmEAicgbcXcamptpou}u\t|yjn^Tljdde|iZIqO\NYenttngw|roumh_enmfkiYkklshhUW\MfkYRpYZvLGnIXRbTkg`D\Y_`^Ocqjo]fjvvmtfVnwivmjpqwglqqzdbhqgmqdtdOcd]zyy~uiogmsxxjfiopjiptrspt}vx{`lca|x~vy~}vwnuxwyylqs`nXVSc|kngdgfidel`do]bjpxpcnrvvllrn{|eTluxstgddacb`benYlbmU:C]xtkjkhYnXhodWVvetcbdxD>Ciwymi{wr_^vrmstzuuffylal_p{yxogp[QuWdblcgtobl{|hll|s}rrt{tsw{so!>zagb_soeaRXcyssynqv{u}nivmXg|ðr}xssfkbocjw_Fbj[LWiFDHM1L^\YMcOhad{{vvtwcvsi}^Llgcdboq`i[QZnzdgpAKjchhfcU^kmrju{rl\kvvz|rmdYtqvactcTZeTNeWtsx|ujx|ueuoumduuiir]rtpia^ndUUaqhYr[ir\YtG_`n]_d`Xbll\fSdrs_]nowvfve]iwmskirn`bhsyx]\oplli_sxhf\_v|ywsrskuxxb_hk{loxypqnr{pjfzGrl|~t|uw}opyyvq_idZbultmudmjholkjdh^mkztufqwsnjj}vhsrzxpnxmpggbheYoXlvambhCAW@[}zV]avptlU\r\T{kmuqMDJe{pbotp\kzkvhl~}fu|okeitqbfdPgtVfgjesaXvuyxykwyttoy~{{w{!A{x}g{pjl[>Uhxwdl|in~uqK[x~vzxicXpv}ZyciKaY]UZKEXOLgd]ag>WUx{}}YZwvuj{ywpiceW[ujmg^ext]P^omtgbeGVj]]niijWgpomxx`lt_l~r{xjmnpfckO^qMRkgpzu{ypzpzyumuuqfruxrxt\Zte\f\lmuhgpqk\q^_m_DSjleZuqemjlrtk_kuzstsmN`awrnstVUjfvyqbjtsqlfarlculm}v|lmwurxwmcqnyspvwnqr{pxyne}myv{{}x-{arjtp[|eoos~donpzgoqnnlqpwr}hp}|slktn{ntxuqxoxrkqilivalnjo\XQeY\YzntOafvws_dsO^lev[i^jszjctxrnax}s}diu{`nxryyz[hog^xoqlzmjnbhuk|pv{gyvr~|}}w}zz{'CšîwlūϻwàyǢâƪì~fhluysxP;\zQ{`m|s[bPjhhvpskMks^_tomtg]spyy~w{t_m|udkulpclTdpNLpm|ww~x}~{vv}yjfjhusuidq}vtuvqgkdo1DMnqkdat~sow~xoerxx|zzcm}ko}aezgzwlwx|plclnhk{~v~v{|wx{{mzs{wxyroys}|v}ukyuyr`mrf}}}rxojsspvuwwtyhrx~{wuvqw}ptxx|prroxpyemnorUVnUf}z~ipSxr{~mtrv|{fdsmsw\}up|q|qqmtnx~fgziXxoikopr}notexqgzvtiywp~wm|vvy{)HɱȯoĴŴɺʃ͚Ǽ˶ǢƬy`Lqċ´Mtszul{~sxuke~|z_wtdzup}vrkm[e^ge[}runzeyhrwufs}}vvvoi{\KHS~v}tduyu~xzjqzv|purp}wvtpsryojptwq}{y~}wz|yxwuzu}zvcrl~lrzvoltsw{t~}yt{}u~vyyz|~{qjxyolps~ymjnrxsighawy~ptzv~}ozvrvdzzjzcr{{|rsdnuhvyhsz[xx~ksqw}zjwzst{qr}{*HÍƺstn͓pƻЛÆɿȝɎyȮw~uxauưyrzn|z|}x}otixs`{}w`vqv{xoqceaZj}i~ysx|x{zrwtz{vvu`xesrxvtwuzq`_Po}wsuk~szytcnxqwov|p~~xumsi}~{htrtmz~vzzz{xvus}}yp|u~t|xvw||vsyytsnq{~tszuvquyytxolxxipmu|ujmnjxmnuqu}no{r|u~}zuss~~vpxlksxxwrweftivosumvv}wr|r~yt{+IþzhȎwþʱïî÷ŕɭ¨{}zff|[yuÒ~vÍ}qxg|v}y|z}v|ugpy{v~dtp}|xzyhnwopae]]g^~npxnr~u~~t}}szula|qpmol{pvvxdlW^~x}monwzn|r_o~mvrxhqsonoofz~x}~tfypiuourzzww}y}x|vuq{~zz}~|}}ss|tox{qwtqq~qq{uruv}}vq|sxxiq|gqx{oo|jklr{xnrexyy{}|xux|vxz|||x~lizuwszykswvyluzo{}m|omsy~xo~y}uv~w{+Jɕƴǒû{ƫŢÚǩɲ~xu}Šcrvwx}fa}~{z}y}~l~wjzf}v}}`ymrzx}zibvrtfdW^hjwixspqzy{}}}~y~tv~tpvttoseyrrh|lgemwwvjmyito~}uZm{pslthc}yqzu{pjlqkszsq~fl{fgpow}txl||~xu}zv{uwnw|{|y}ls}zqxwzutqvstrv|uwxlrtwx{io~xkz]s{mtids~opwgnonx{leiw{zqp~{zwvnolwhou~o}xrpwkml}p~~ovxsy}{gw{woz~y|~}|s}tur|tt{.HĜĻy½ǥƅ˷ğv}mrx|tyy{|rbxzw~y|{j}uo{xf}xxwZkixu|}dbggri`Vatfyj|jzx~m}x|yuzruu|zsnutlqivqrq{ohjut{snuo~tqs|zvsXiu~tom^y{ywttwyl_rsqyyw~wbnt_cposv~kohn}{{owxpyl|vn~v~||}}t}{qnqsnprxluttrqxx{ymlpsvvxxwkqvztq}zu{rljkklgrvdkmjtsfhnrxsm|rxzxyplwy{{lun}xvx}~zwqw|pjm}e|}~xhtx~wyy~l{kzzr|~~q|{|tfvv{|iqq{1<ŽÖº~yƏy}²~ʪĽmų{{hf~~vt|~|ư~ØywqnxqtvuqqputhywowlgfZ~jbsxkzahc]pu^Xndw}vw|go|{mg{yv~t|vuo~|sozusunprmniuotlpvqdp|voqutvwkuunnTmosoad~vvsxuv|q[wowntohkl`csnmhgomgvv~ywitqrmppzulo|x|{}{{~gzynckhx}ntxvuurtxuvowqirvyx}npqtxuzzsvvljhll`ophagf~gksynjxtlztsr{sywt}p}xovuunqu|vrqtyss|t~yjw||~qonyqr|}iyhu|po}~pwfmv~p|qnz~ng C/+Ͽƥ~Ϟdz}|ģz|řzĻ4̖ȱtuq}}nµzk{}p}xyunnkusrb{s~ox^~cYm~qrjhphdkmZor[^sldtx}{zlhwq`i~nxptx~rprpoqwjismpqqmn|kobmu{hg{tjkpqrmkoqklWhkoaaflorvook^ns~yqxckfc]e{m]ahyeixxzytilomygiqtsitv}zpp{xtdu~sohbgo|kmsswsu{vuvvwqtsvzxutnqorrrzszruujkjkqeajsajcsekulner|nr|ytpxwsqltzo{n}|zotvrs|xwusxvswuwhzxe{lwow{yu~mo|~ml~|eloq|x~xtzpx~ppvku{~}qioqzsX{~xȬɽÚ}wƘ|y|{~‡Ǭīm{ufrauvzt{~thzrqÓznz~zzonmeguqzqahWdkfwgfmYlpp_rnW_paisk{xn^i~ws~atx}fvrmvswqyslliusbhpmssfjutcnqsyjghpsfksqmmktqnlZ`jqebfexzlnwojooeogptwfxq`rda_gjg`cbs^rtpwnhktsmclouymzvp}swnvqtp}xrjw|trtief`o{liuqxpt{rpsxvwptrpzkktkkrxnzyxmtxwknsld{`kyfqaxcqvirvi|mgxttk}owtutstkuo{}wv}wsmywwqurmrwvrhq^~p{nwuurxomwvorydlp{~un}ov||zj~fn|{yu`yfpu0%z$5}nw}|yqyvnuƠuyu}v}qr||z}|n|u}}r|v}pqw~ypkcngsstru}m~twwk{x{s{ozykoxwhaYdr}rncdUfrnngpraomnigxS]majlivz|}z]a{}l^ezrwkksl|}mmqkefqtscoiqsihxwhsqpjpgguwr`urlknssoiZ[kn^ggi1qslsndyzfk{efqirtlgui\c^]lijbe_qqs}qjrtgqxviamozysJqlz|ovvsoyvtsxwmzqnoraspfbusihtqrhsypsvxvulwyoylhmijyxnysghzturpnrtetbeyckaiaqwlmsdvlhyrouwirtysmoeoru}w}olsvxvxungxxzqfgsy~ltqltlntivsu{ifwks~~~||{fzmn{yreoxikc#D&S|}}z}x|xuorn{ruyurvryyzsysxxs|yuv|zok2}ngxerohdl~n|vwq}ppn~njtz{tvyrqxsvmiUf{zmu~g]XcpxbjgqknikscsX\d\gwsow{xvjXtyv^^s~xnccj~ulbpplsx{xhfnogfsqnjtlf}botzubbzjcnppksZZqf`ugllmpddk}lmyiZvpvrimia]dZfwgnfa^nqsknwomcmrrtcek|qxnptvzdw|pqtnoz|ovpsypr~cilf{ump[mmkrmvlduxsxsuvtonmychgsvvjxwcfHilqtmttgmf[rlb`bgnvslhetpotrpzqfirtmklkllu|trstsrvxnxwxwggyusokjXtssqp-i{kpqmyxji|{}lqp~~z||jplmzyqpfvjd! y1awpyz}zv|}ozkzxkuojxxykzsopvylujzt~|zvqyjqvty~zxtazwgufzpjvclvpqwvpqaruvwgjvvpg{{uytn}rnwzuxzugSiompus_Shamejilhc_msdh^[Ygqkppovvsi_tswjo]e}~i[`hw{xpejxrnrwxnjjkbiuqrrokdq`rqzwkZnqcoivkq]aj_bpgi%fle_ir{rprlhWn}|pcqeX\e^juemda^l{mnmnkm@qmrdactsonjr~~|_}lw~kb~|xnymkzvhluzmcdnqtvbZgtmmpofuwzyw{xyltcjcmwsfuqgripgnknzsnhj]dpb`_jiqrkjnejvnztq}kqqkqpslhqity|vcsutpyquv}ssassqwptn[kixzyrol\}qcsjtrcgwy|fvwtp{~yyyl ~xnsfwi" x$0tyzxyr|}ovu}wj}|unyrslgsyvvhorvvlkqxlklz{xvul}zbo}qsvsrtnbl}{xlmtt`o{lenndq{v[hnsqv~sulvpntjpi^o{nwpytjnpepprkxvwzk`Yhdkos`Qo\flkmgh^`koi`g\Wasshghsz~b]tllkwhikve`dguwyyslpoqmlrxrlhg^lqsrxk_ea]vkl_qiqmgliZckblacjb]jniw~hkvrc\v}yifmaQhebipjjiZ\gkwlfhqokzqomgbcitoowko|jbzmouyxbrtvupskgxthmrqw~dfehpwwfa^wqmnqltsywjwwuvuzuadmcgspfictzxhthfsspdnh]kk``khkhtccgpnyyrupuuekptphnknx{n_qsrmtwwrpxtsjes|uzin^^fwnnlcZk||f{intdkmtpj{r|m}y}sulphw}wspe@!w,%3?JHFFKUQGCHED>DLMICFEE>>DFJFI><@BI@AFLK@@F@7>?GDAITRUGEBALRJGIKDOUQU>>;9B;BC<1@@5AACBA77AM7=379>CF;@DCGF@AA;BDFCFF8>9;DJEF>C=:CEG:C?7IFBDIB=:IF??F@72C@=A@A@B9979@;AA@@BKCD@@==@=GDFFDNN>:MD>GCVUGDNB8EIIAB>ADH>=@GJMJC==>@I?>:=BAAB=DFDHG>FCDGV F>9=<>;FC@BF8>>88F<<@JIA>;EFDGD@FDAA>DGH@?>AFFG;FFGCFEGDBFFGH:BHHC>A9:>JMF@FA=>EJ?D#F=ABFJ@LNGFAFRNGIRKLPKFAC>?JG2+# #& +..($""$$)&#C" ""#%$##" !"#"$%$ $"##$$! &!"#$&$##%##!#&#"&&%# "$$'% $& %"!$$%% $#%$!##"# !"$ #*(!$&($##&$&#$'""# #'&$!#$%&$$('%%&#%((! " "#!! !"""#'"!#$! # !$#%$"##$" "!! !!$ !$"!! #!"!#!!!!!"#$!"$%$! $#$!!#!! "!"!!# "!"%##$!!!#$$-($9!%%(#!$" #$"!$#" !$!!#!$%#% #$%$%%##"$&&%%'%!# ! ! $%%s#%'$#%#"#"'""!!$##!!##"!!##$ !%"%#$#$$#" %%$""#%$$#$%$#""#$#$&## &%$#$! !%#!#$"$$'"%(($!('&(&&'&"#$%%$((    !! )!%,%%),1-117;>>A8>ABFHAKBKHHFKQOKQKQKKQQKOKHKOOHHKFK FBFABBA88>8;"711-1,3,-,%,)%)!!!    %"""))""3)33.3838938BBGGKGOGSWTSST^^Wbbeb[ehlehheolh ohlolhoohohlehehbbe^ W[[^WS[SOOTSOBBKK>9>33.3..33""))5)))5)?H5H5PHHQ`X`f`qqfllq{qvv{ {vqvqvlf`qfQX PQQPQQH??H?)5))) 2TT22k~?2T2k2k~~k~.üók~k~kTT2~2kk2k22kk2TT22rz| *x{R[Zhfja\NKPddjtq))8)88)) )88)8)8)8)))888))))88 )))            !           $                                  <                    8                                                               - r߲n^5t ڨ + >              p ̜i7ymKӟ:                 ľƾȝf Zz8               pч,tS ~Ż <                8lʜ^n< rܪ&П8l 8                  #V"DlȒJW ڠ =w8                Neٷ*  jʂ7<SК;:          ި$HR  bv!ým  U;          u ¾ D J ub t¼֤^;         zϘ jȼ5Tq“<         i ۡӇ r հʞ  tל z:      rؤ $ j̃ +6 oӤ  X/;      h ݣ jҁ n~    (hľ T9       n٣ Q  _ C qӠ  ]:     hÿ  4ǿȿ: h˸  h  l ӟ  :      ) hƿýբ  ;^ i8  gɳ  o  9   ]֣  6k lѐ 0 ļǿA   mϟ 9:      j 2 ¿c  j /ɿΝ  ( aǾÿü”   :        i!Ν   :k  b  5   fϡ   8         34 +   _¿ ¿  3ĺȿ W  eC     Ŀr  lƿ ̕         !!!       Gwmc4 T dƾ¾  11  9   Nľ½  c¾ ˜ J Ľ  ;½½z !!! ! !! !!! !  EȾ½  P_( 6  h Ƙ  4    G  e»Ƙ      < ! " !"" ##"!"#!"#"!" ! "  }¿»H  ~ wA4A8* c¾ 4Ŀž s     i ǿ¾ ( `ľž  !   7{¼¾¿k !!"#"##"$%$#%$$""#"#"##!""!""!  Ŀ 0 wž  9j ¿¿6* ]Ï  8º5   ļ4  f       !$   !#$%$&%&&$$&&$%$%$%$%%$%$#"!"!   ~ |  7 5 c’ 7Ș   ¾þt  ` ”  r;   ¼¾  !"#&$& $&&%'&&%'%$&&$ %$$%$$""  ?  >y  = 3  d¾  7  7½   ]º  `  X !!"$$&%(&('&&('(&(&'((&('&$##! Oľx   t  +2  b\Pg D G Žg   ^  A _  ,b !"##%%'&()())())*)(*))') '('&%%$"#  o  ú2 ^q4#":y   | x  G#  d Z  &g! #$'&()())*+*,*+*,*+*)++*)+))())'(&%$#:*  )N  1  ah)2k  J ¾A  X}  N]   "Z!!$%%'(*)*+**,+,+,*,*+*+*+*)'&%#"o m   5    3   `y+ T_   ƾ+  h   ]  %Z  ["#%&(()++,--,-,-,+,++,,+,,**('"%$8  4  *3  _*"; :J  mD  )&  ^  *d / _ "$%'**+,+- .--.-..-..--.-.-,**%"ľ,  n 5  S/  Z;': :C  o@  `  Z  O\ 4 ]!#$%)*,,-,-/././././././--+"-#kU   1 4  x8  TK'!K>  r3   5  U  1Y  (Z"$$((**,.-././/././/.//././. +f$H'  2  0 1 [e-;J:  -Lp{R)   O  Wz   ;^   $W !#$()+,-.//.0/0/0/0/0/00.-#=   M/  G5 @ Ou +',F@3 )]=   S  Z~  0O   _!$%'(++..01/10101101/10011/1/00.#4?#}G     /  /  Z(w/#=99, (uE$   *. + W  4'S  !"  ] #%'*+,-//10212020202210210 sr"Nu !!" ! E3   / /  T+:C978- +zN2    hu   Y }  / Y    !"!   `!#''++-/012025:6680 ):Nr nJ&  7 uP  Py  2+\  !""$$#$"#"!! ;]!$%(+,./011338YŴP3210pW!^i "!""!"! c.      S2i 7;734590  (yh:   9   M {  4oQ  "!"%&%$#.Z "%'),./12239rŶunpQ8, -!>B!"!#$$#"$  }/     Y Sp+ )?64314:3  .]   4   Sy  LO  !$#$&$#$##"!'R !$'*,./122Xʿ"wndnx2G! 67 !#"#$$#" 1     ! CEmhfeetxgclg9!>4/,-.392  $e  !!  On  !  Wn  wR "!$"#%&%&%## @Q #&(+-/026Ƿ}xqi6%N" lY !!"#%$%%"# //  !   !" !-"(13HVexsR)6320149>F> ( (^  !""! )  !!"!  Kp  dW  !$#$%&'()'&%$#=U!$&),-019Ƽ{xri+8# "!H!"#$%&&%(# S0  !!"!   !!"# "!!(/2# -}E', 16>D?   B ~&  !"##"7! d[  !""#"!  R p 1 _U "#%%&&'(()'(''&&%FS"$&*,.0E¸ȲW8\u#"!! (!"##&%'&%%$Z0  !!""#"!   !""#$#)!"02=/ fyj{e6 &1*.6?F=   sB  !""#$$#" +   !"#$#"!  Pm  rP #%&() *'(''@R"%'+-/GþF5M#"!! n Q "$&('&&$j/  !!"#"!   !"##$$0&( 297(?PFCF= !#<'.43##"!S "#%%&%&&$%r1  !"#"!  !"##$%0'%&885'BLLNG'  C%)-?+07@JB J  !"##$$%%%$#;{ !"#$%$ #"!Mr)_O"$%''()*++*+**+)''>~}N#%(+0{w>+hp08D$#,  "#%'&k 0  !"#$$%&1'/.1#=KHJ6  >C))0$,2 @} i !"#$%&&%". "##$%%&%$#"J q'#Q!$%%&())++*,+,,*+((4P#&(.Įü{t|u3.RSvy{r18YZZXWT8)+*` }{||{{|["$&()(g .+n.!"#$%&'(() *)()+ ,!%)071  !#$#"!)z}yxwy|zyw{{vspA!#$&'(()*)($t}}wy{~{~}}N18BR]Y, "$%&'(()) () ('&%I~{  {yx` !"#$$#"" !#$&(),,-./01. +{}}y}}{{y~yD}{{~{K(~}XBi}~]8DdZ^c^YQ,,+!?*~~~{{y{x $%((*))((U~}}~~{{wwurqu(j{~}{u( !"#%&'(())* +*)(& ) #% M&+#&*184  "$$%$$#")sqsoopttwxxvxuzyz{tsnmllnnorovw`!#$&'()*);}}|}}yyuuw{|}|i,-;IT\hmI)$$%&'() %Psr"()*)('&J{{|{{yvy|}|b ! #$$%&%%$"  !%&'**-../01011//0--,yywuuy{yIvyy|{|||LG{}{?F}|HAcjgioic`9--)%|||{2$&'(*)Cvv{y||yyuuyvropuuww{+ !}}H !"$%&'()**+ , .,--,,++*,-)+& 01' '* 0!&+194  (('**)(!*c ehoqsqrqrtvt rsqstrpsqrt _!#%&()**+*"|~ytsxyy|x}y~zzyyx=-4K){wR<:T{M1p~~zU=TjdgfdcZgh4.- Mwuuyyx}z|x}z|yzy|zzxn#%'(*++))&||}|}~~||||xurqss( ! d~zyxux||xwxxy+!"$%'()*++, -,>&(*+,=X\Y\bQ0!"# M 7!%)/)   !,G^]Y^[;,,++*(7FVY_cedeecF#^k\WZWXY^`L!$&()*+,++}z{wwsswwvww{{|z}{{wsvuq)ouul32=HTaYXbbrxR5F}|zy{b0*())*+*)(Cuqosz}}|zwvsqp uv`"#%'()*))((&$#"" !"W$%&(*,,-.010133233231/.yuvsossnknsquuy}}z{|zGAu=96>?7}m6?{yH<^dH:0.0-'(nssnnswvuppoko&$')*+*)h|y|}{{7|zz}}- !!"!! \sqqoloosoqqu{{}||,!#%&()*+,,- .7)/../=aeafb<0  L)!%)+&    %1?]ibi_8/.1/-*/JPUX\`df`, LOieUUXX[_P!#&()++,*_}~~yy|ztsokkhfjiijoqurG[vz|{82ZntS2`U>\x|~f;>ZK8986764/*%) qnqquurprqrwzxwxxzO&'))*+)Dninqpsqssuxxyyzxtsu*!"!b|zyy}|yz}, !#%'(*+,--. //.;+-275211EjkhlhA4 ^) # "1:Zlhk`L87710-*6DIOS[^_;K:G[gUGKMP@!$&(*+,--,)osvxwwzwz|@K_lUE !$&()+,,8fcaaejfefilnnstsnoopts]vx}}|i./;DJNU_ilkuxzr88cmlmnmkom]5Bkqsw}uQ1*?kiheiloknoppsuzwvruttpmniikinoW"$&(*+,-.//-.,-+**)+ ,--.0012445]67643511iededdhfhkiimoprppsopoF3Ylrpud4:mmjkZ3Hz|L2VeilX5=RG0Alpnihifeggjlkmrttvtrturv{xw>%'*+,,++*4mijllmnonprrwrnmo)!#$%$Xonmpuspsprstsr*!#%')+,-.//0y 11/5,4;HkeXcA:=<8,+-0:VV>AZXUN82102270 ",24217EYhOKV=/0143%%gRd?1685667:T|=6:@FIJIB3-8>@GGLdh&  #&')*+"aghffefcfehhggkpkmiifcbfAeigi905AGNW\_dfiw}z}}u3/Oaaefjjmpn`6Agkw{}{U @mnnrrsqtvrrnkmligllhjhhjmV "%' )+,-//0/0//-.--..-//00135445657675422qtxxtsqnmkih@lmqF4Rlztz{J6\qssxe6Emrwpu~x|q42quxvH3JWK1@?A@>??><:;;<(7Ilpttqrusqmjggb`ab]`aadgX&(*+,.,+*%gsqpplqrprspr* "$%&''&%Tffknmlhhgc&!$&(*,-./001 2184QeoK04e2-3;Pz[[=144329@WF +47A_v^Y;133129A\I H[I:2325Ep`C?;AFHKEEA-/addfaT5>ailqhgh^J*Bif35OQM2..11211/0,*-,*-Ikkorqtsrqr$sqolpl$)*,-,,-,*.gkidffkilliieeifb&!#%&'($'Xkkmmoqqrromppqqrnp* #%')+-./012 203Tvyvv{<()e0X{C0234^\(0) WO322/Xv%PG()*)=~|qjeZT,29=A>@>@4*8>@@9<CFBHILPQQMQJGD>1)1fgjiidgigkikggkjij28'*+,.-,++'M_cbaeiimmkkllollkgg(!#%'())((Tgefeedgjjmnnqqro)!#%(*,-.0012 302ckkuwwyxULF)'?%@B@>AB>::6 .CK>4JuU1rcObWMRVY_behjmnqspojl;jhjk^)&-./,58@HKGNS_jN5,2Uklgkjjhkljhjj]7B`a`goy}zzxT4Okjknlljjnjjgdbacc`]]__^acgQ!$')+-/023453434565689889::9X764qqljnnjfeecdegjhgkojjgM1=T\agkr=3fb__][^S4@dfedaim@,Nsppa#$<<743.69?DJJGCDBEEE5'Ld`__][]``ddgjkklqttrpll4*:2,-.,+)/njlnpnnjjhjhk hkj- #%')*+ Xnqljgdgdggeghlnj) "%'*,./12334y 52+(9B301620,'(+783/4XYAAKM6.)+-3438XrO@JO$0Fl^CEQK4.+:411/9U_B?A'+50/''*5:4/0=D1,*)"(,38@DFEDC<6! )89.#/UmHVod/Y^GJLORQSV\^acdeijlm7',/(0778EPVPMA8+(8\ebfcceffjlhW;G`_dkqxV8NecfjifcceehefjomjlhlfeV"$'),./2235656565689;:<<:9:875ccace`cecfefccfe=H&0K`iu~Q"([\[_^]`eX3;]^Z_^YD*-`ceiT#0?80170.<:?8FKKJC?B@5*;jjmmnjheceecaaci?.DSK?0.-*&2ea^^`aeihie+!#&(*+,-,,Ujjecc`^__[_cacc(!#&)+-/1234567 520(,.1)2.*-?KJ;0*+,--..//&(5ED3102001/ /210@141.'2CE>/.-.,,*+#"211**9JK=1100/.*&"&)-48<@DE;  ')!2OIJN]]TAXW<=@DINTX[^cehieihgBijQ" ,19;=>IEFHF7'!%/Tggddgdacaadigkll^BCXanx|~s85\ehjjmmollgiecgginjf8(-:>AD?86557756 76679787798:<<=>>CNONRWYa+*efehehgijgj@lmmJ',CZhruzz~xR4+`eijfhhgiY,7NNKOKA%'HccdgG*9<8:A=>?HF>:@==IGDCOD?'*bdc`ddedcdeecehedadea`]N,4LKNG4.0.-+)#Ciifcac__^__`^`aa( !#&(*,,-,,Xfggij"geghd``]\'!$&)+-/123458=DP]epz|xx@E9&*,.149BA?4.,.//001136;IOG52 32"02 74247AVL@110/.%-%2.037AB@5.-+)$"&+059>DH9G52\U?NLGGUXYGF0369?FLRVWZ_deeb^\_cecZ!#+1<>?B831*&%'-AVec dehdffgiljijc98PW^cpukhedS<-+Bnnjijgeddhhgcfige a]Z\ZW8/3=LX3dmqnmkghjjenqoffktskb`eknhfmsrprw}~{peeaeM"0][XWYWZ\[H_bcecfdd`\`E&,=HROV^`bK7<2[__cc`_cchV'+>IDI=#":_^^]]I'+=>?<+&Q]_dehljmjjg$daa\^__()>DDEB;00--*(!1aa]aa]]``bffe2 !$')+,-.--fdedadejjhddebcfc("%'*,3=KTbint}6D "# "&'$$#""!#% &(()4::=3+*+/ (+* ,2**+89I7.&%$$"$5&&$"%&%&#"#"  &,2:AII#G*  *A[DCFUTRG=,036;AHLSX[^\[_`^]]a_^\^B'.283*$"->UmkkjjiegcdfdcfdfddjY.*;?Ui[5#%:`^accaeacceac`__aaed`cecdaef<,/,/10=Wtuo_UYS`WEXjmrroqie[]`deNLfkorqqnbD103=8* #9eefdadb/"*2;;7%&PZZYX[^_^][]aa^^]._ceeb@'.BMD?@=1/.-*( )`efkkjnnlligc`D !$')+-.&_abcghklhgga.!#&-AYow|AK !   3 ,  6*# "!  "# #'-38(D'  6kQEHGR]D3$),25;?CINQUBWYZ[_a^``X" ,+56,$"4AR_jjgfbbaaeddaeccgfiigddihX' % $:S`90@Scab`a`baa_adedaa`__bdde`_bbcbce\H7."#$(K_U>300816BOF[`P>115IjmI5!BB>1:V][]]_b`_cfbbP"#,#"$"Gbbffgcce`0"(3<@ELTQCLE:J=961' 3hbd`^bbdi eadY/+4EYWH5730.-+("Pigddc_[YWUQ"%#'*+-..Vaa`a`c`cbd`=#1;Oiqqzxki`PUb@I  "/    !   * 22 /#!#"#&! !!&& ##  Q9   JpX-TqME+(-494=CJPVVZWYX\[Z:V[,# +.3-)KVVZY\\[[WVZ\\YZZYc_aefjgjknpmZ"!*->7=U0?[b_[Y\_abadcabbcaba^[^^\[\Z[^^\WB$59#(.2H[I;Ve_PD81,?i]:4Ldd\YK90A''$V^\[]_[_\^aa^b^abb^a^\I))184.-5AYba,^bggdda_K$! 5SY[Z\XZZY\\YA$ $8?QLPFD=BG?8! #"4dfedgijjghfbabcd]1/.3TTK=@51.,('".Ycaca c\,$)+,'S^`^ab^aZ:!.ANVVdjnrv{}ypqneaI?KRRPO @Y% ! ! " "  $ :0 &01$&!""&%!"&( ) &%P* (>,#~}qmoC8:=>BB>EMWQL,6BN^ac^]`b`aa``aacb^cb!`bG&,4,/8b`cca^[\Z[[^a^^adaM6)DW][a`cedaacb^]A(%BLJROOHOCB/!4Pfhggab^]aabbccg c`b^[H5)$=FED@B=8.*(%3Yba^ZWVS UX-)+'(Uece_`^a#^aX6)9FMLPMFUZXe}z]J[UJG>?BGEGGA +rfP& ! !-"#&$ "   # ". #1 ; 31%!"("#'" . ,'1&  0 fuL/=ANX\WP.&O]\_``^`]\][VXYZZYY\`_a]\\_\=!-4.4cc`aa``^[[X)WVVWVF::[[\`cc_a`]^^ZVVUVYYV"%02ARVZM?6#Zbd][ZY[ZYZXVW\ac`_`a`_`[Z\X^:$9LE;>H;BOA/'&#2R[[^YYVVW_U35$;ccdfgidefeec\D* '05CJKLJ>;::D><_fc^RHXLENICFJICE>. 7uZ !! #.&##!   & #4  %7#  = =3!"%&%#%#%  97*&-#/!+&$'+0*4yL22:BOIKSWXZY]_fD'.>1!9^Z'Y[``\_]^\`^_\^c]^c_b_`cb`L&!01EN Q`^_a__^^a^^[YVVWWURRTTSVW[Z]_ba_]^^\\SA(-4KGBJIP[eYQ9+ '66'-041/JU^^S[[L-,A`_]a8[YY]^Y[`]\_a__[[]\]_[7$2*/__b_^[YVTRPSRRSY[\I.?addebb^_]\Z^^_[%38*/:M\KLC-,=URPS\UYY[^_a_df_b[WUSQQRRSSN7#4CPMRQF;ATJ9.'$$$?R_aa^_ha*.LB1#?d_^ac\Y[[Q@+ .@>:7DRRX\YB9:8FTyzqeHEJKLLTGCJEKGCR HxU "$! 2*#%("  + "&0&! "+?&+/  B&!#%$('+  CT^fsyrqy3),&XƫI/ 2%!,'1#$+)*")'&$"$&$!'*-! %(!& "(==7-  '  !   "%4?F>1?H>M]^O2$'.:?++3-1,(9C9SGFII5,9, &!./%$)$"3+("61'%/&$)) -$$$'1%GWWE<@7?OS:'x""2!"#"# ".9  !!#%&*(C@DMaa_VKCL?847BHA/%!3ETaha8-@>:,FXVX^E>6'&/6AFE6!&+;PU]^R935WhEKJRLFFAGGA=KGJ. .kq\!3>,4." !'  (* "$7.-5I# '"$=A! (? +##@O$"!!#$2'$2. .Y`wzsD>lsϵxsMC '-#+")6.$13:8$%&#&, " ! !&(##'#  #).(&& #!!,'"  %  %+>1-$"7CAFSZB32-2?M4#)50)'1+%07?"#36S0 # +#4, 6#5!%2/)) /$2%%" 0"#!"#,:0'JEMPZ5%9LG3x#$8#!' &=$$%#.ALBAFSS^a^CAA85?<>=>=62-))*-7LE6;B=A*:89G)#'))0:?CKQO6--.-+:YaaU102\cXpaGDJF:Na95]{^$}Шs\e6Í5=K@CF]@I1+.!(+(D$7C@;4-,7>AGAO;-4*'E'-*4'-.3)'.('%""/($$#$"+.$%!"#( +"4$+:&CJDPT;*440)>I1$!)47("(.A2(029F9GF? AEJE6:BF@T>9{ ";UN+,8?>EP<:"!&3&,23! %+%09F3-:P6!)*-E)2F56 %D* 9?7)-")4QNMJ: ,$)2=620*KLL9;AE=r*$dΣygdZIsɾmNMA/G-M,' /,/&"*C*@DGFLKSJSGIHDB" . !+0.!$/4/+40!# !%'#++#!*&-" -((#*/"),63..$%/159N9&(&%(!E>5'))$-)0, B56HE! "6<,!7$ (!35E*4$68=+(#,0MH129?9 !94'+#"!**#''1#!!)94ENL\[bc`dcZ[B8IxG9*"4A!!);-2*G1+,# "%%02!#&$53%:?JOLGIHSQCUS?4HMHJIH@=>GJJMIDGUFLS[\UW[hcf]4:[jrlj_HA@GP6+0:97<5138BHBC<:?F=PN69AC??CT@A{A[R .D>>@CTBBI*"+*"*276/?1 '0-0>><:I/CK>1*C1.V-5:9$&/L^YNF1,% FICE600=HIV[TdhgbA14MǷv=33%  8(*D7IEHBKITSSOA8*&*",((68-,./2(.*/%# ")+#!$4&$!$ %#''!)%&)/6$)' 2$;0";5$!0!".$'F;=/.#'(5.(5+30/85QH!;.!)!?1*0;>)&M6<4%.3KP?''#/GB$:-'#&$3-&/&,'2%2"&)AR^]Wd`cZX[F30xA%.8F$#.:<+@7*/("%(")3#%(.1-68+&1>IWII<HO;E{I[T4@?97:RD98D03'$62.D31""$38BC9=G3-,FT(;A;8L?MC$/=0%R7/,9?9-HZGM?9"=',D@?E..3'B9?TZbvfVXRuW7(0,%.*.<<"4JMJHJGPOUJ0#6'"#"&"8,-<;::7)&/(, *.&).1,%! -&!+)+')/% #1()(5##/89=0-+"17&-9-/C496((*839;9:8)8=O@. *?%'8K/ "7B$14$*Q94A'7$5OK-$!,8N5 ,B+0!%)%$"33#+4'/-*,$6 ,+#&;"$5MNWaedW]]CD?xK".B=M9**AI05D'0-(%"%/ 560;65"-+10BOIIA&(?78=EOI??GQIKFKN]^[WZRNVYVLF/8QY=c~t^aT;5;<7+,/A118:A:267?=0;<&'&CG>/$420(=BPF";7(CI$'+@3AAL2>, '<(&252<%"2:.+6HSdhjttziDGHXiztpt{|vxvni_`]hnmkpooj]VL:*%54=83D1>DKU?IKQN9C2/9+*#!%,01%)669284%/*32/#,..33/.#!$&/ ""!!+/-2%(#)0'!( ) #0+/!/0-..!":".PH!(//G9.//3#A61>6+(26=;L>419<8P.6N;4+-,,2*10'*38BBR,"0,.1PQ0=91; ,5;DIC6?BC8DOY]ENPOPIU8/@=5;76;[VFE&3A3:=.35F;5A>?E73BVCLB57:=;C=AJVH?vOLTF:5)$J%=:-60!8$=,;/+FNL7B6>48%+N7W4,&53-/E=>@'#1$K.+_"($?HJ>5C'*D3)B=$(<&9$3",0:1?Q8#)B>/>5"+,7$(!K^Z^[cdgcc]VRK=("2B<82GUMEQWHRFA:-D63;%67&'(),.% "685539"/576:**)5206#/9'$!#-.$!!+ &%-".0&)$1"#+>;)9,<#"9+5NH9.:A0$)1%<%IC(;8 759IH>:2B=GILD36/3=24M@ ,FI/447HJ73H?;KI@I,7:6NPC)A,:?!".'.7*"(- 7..1:'2 /B(&-JA+<;0CD?SPUBM^]TXLxZSJIFR??WE B@E3*--,0260-"$0JAY@*.#0(3?&)&8@:# 6&7:7/12/,)7XW@BIBJT<<4@C2;85,18A-,;+6*H@79;@;A8C63,/3NC6MC-5B64>BNGK7F{!HAZA@?-J& -2/E2)E>"C!17='NQPO@9,E8X/PB..3@6=EDA:.G5'S#KH(9,K_B+E9/@37:@3%4<(9&&.,5  !9::8ER819O2>BKQQSWJHA=DD=;M,"/>+"+;5# 9>C;/2B(.;86>1+-1&%2%$%6; '%' &08",7%. )/#>"+-:$-&(-9:,==-0=9@V??9L@+(!.+54KB,CA'#..>QHMJ?6DKHI+$7@C9GA)=OE6";CGI$;CDLI(>KEL6=M6-=>LK49A,&68!-4!"<4(*/$0D=#91(3'5E-'2L1#CJ6@IKVQF?CR[NUPx\RH;FG4LZIN83G5/1/(+.9910042CFT;>C31$'H9)"$9D()%-<,'5?94593*&-OO8/:FY<2?47EB5<4:3@3;J2/<4EH;50C>:G862106O+AID:1>=2=CKL:DP{'9@%%K=IOZO06\FFOUQAJ?HFEMGAC2G_e\eidmxrcPZY@519/2;?G?DNZ\PKDH>@D:MGB2*$6))#6B5.$-@DH@B1*L5.?B59340*46/&'&9GB.$*.!%(14; (<"*"5%02E<8&"=-8:0;@;7#<@A@@IX42ANA52?52.FC8G12B3.@9=51.IL>/<776;5?'EF)4JANK8RZxfZN4CIHSQ^L3<>65?AB:ENTCGUD0-NP9,&$I@04:M>1=:B<6==>2/0PO0-6YN;4:7?FE51;1:B*LI7F=6=:@7.;LHG;;,,-F>4KBCG59@9>LLXSKQ{ ,;ON@X=R%Q:GG;PBQ=F@@"1QI7L+OF/TRQPR[SAKMV7=QR:FGKJILLK@AFi?URQEYUNMBHCL8UD?GH7"0B>A/.2BFE<!4,OAW_fMDXQBWcheQOLO-6XKMHHe\d`ZlzzygR^ZC=;D3;DDJMVUYYFDIIGMC?W?F/&@,(5GF5.1G&'8JG2)<0I@>>NS/=CCN;@M=>DE>H7:C//HQJ.;RLI@*KF7@FGJ4@>ONUMBLEC5ENOJI+ :=;NOIEG979;*9M7@B<16<748!?;CHI;I@HLKI6BKJIABEN`vXUQKE:WaPKM8*/FIND?FKK@?;EEBJ@VRG@GU><)':GC7/@O?8E76?;;2F60DP?2%EXB?6@HFI33A;;T?@Q=6C0.?-76(,8[;:R:IAK=@E;.6<1CF:+24)$1L=Pek[_]?FNP_ng\P@$RJULbwchF0`v|xveJ\AJOSCALJF9HRNVKJ7GG?EOMJ7NJRRS@CMGKHIF2KNG*=F2ISLE>@6??>EHH4@F5*@6?*7?8-GQGBEJHGKICFQRK?AJLxL_^[eN=%SSMOH7.'?J[[JOICCI@7=9BHOKQQ[I*7#9H5C42GM89>C;>G49OPL@6EAFAI0BTJR3B.+JIR[A@FE37NR)>P:CFFKFF>ScaQ@A{*EbWRXT>_8*GUXSUI?L/JC?91?H^9BT=LI6VZIRMRV`IRKH,\RIKMHUNPG)CZXe]GccI+:W:BCMQTIH@FE>KE-:8G)!:B4%<=4&=@ DYeig9GPB;XbjeH &MCIBjz^L54?N]kxlNV:5J=GGJLPKIEELP7OM8ITXTP?MEAH<)9GG=A45A3 .@KQHLAUPCHH>9/8B:76D;:5@=>>2"99E='->3*N&A-9&74+K=B L:$-FKL?/;AVUKK2-:FP=PSB=GFJPCGDQDHS8BL7J)?C5GBWG8B;FcLIXRXWH>C>VP=HYS`XL;?G##F9;IE7D?C;?LABJ>7VFC4O9DCBM5EH<5)I+3+8CEQSMFB4F?-F@;*99JE=,8ZJJ:BLSQGG@7MR:NNCDPUCMTOX?>LN@DI=LE-<=@PMGQTMDHP>CUOOFKNOSUOROSDGLLOMKL:GT=DSKKFMPLLONMFIMKJNIFO=C-//=OEL=<7=>C?967H42AFJE=LILPMKHTCRV@1JQxPL@BFBAL?97G7RDV?#(AZSYWIHCG3DOLKERTbVUSR& "AOHLTF>ELDIZGNVUQUfqNBY{)[Yfk_JKYHCLQcEIA9DMNWS@UQTP]^SP\XYPTP^vt9PcqVngL[OXgkR\oCSHWSS^K;y[{jbfj^DI?@HJ4236-:BHACE?VVXfdclckjakiVg_[niWN\R}YOSgZNNF9EY\LOS06KJGCDB7BIIHGORLJ5DNKMSJG?1HIH9>F;-1B2+<4QHR]RBRVHCGBGIGPNE?E7HJG;A=E:*35G:7K7>F15P'9@L@1==;=NVBD)5ZQ97HPQLFJRLM;;SP[UVZWWHDHJMNP@=PM,OLNMLRPPKLNOLRHFO+GQA>96=HGOOJ>@>=HA><QAR>D%"2!>[\a86;GAKN9FQAAb^YXJ*$":RM;DSDE4RVA&?IGDPL1JPgfdlYObdb_ehc\X]XVSbUYZIPha^UTVZ]`PMN6BO>AKGAHAEFIJKN?HK:DSVSLTMAEDFA?E/8J+-K@GSOT`VK]cSPLJPGMSQF>IPLKPJ23M?5=0>KB',9KC8WZLG8@PTA/?;\N?GNP;6IJTYS89JRNKC=NUDADGB>FHSO;MVYRJEXNFPCESWMxKTTJMJB;S;HSIO55097<9QIO)7ALTPP=AM2AOWiV:E?:HXlo~g9fwljifSYf\q|vdYRS~l]RcwegXXQ8TQ;EMLKSK?IFMKRQTO=DVWQL]Q?CLAG;H7;J*)LKUXQ\__Vkm\[STVRY\UNMVRJCSW?4:NTN71=RQLLD9AIYSUWQMH>CiY=C`V>I[KS^[JR\PNBQLEUDGAE:;8=;5ZkgT\]_]wye][YaacfNHYRRJ?UWM;@R]WK/:PZMUI<9;a[;,)3DEaLGadK>UbMIBKTRVkVGG^hVERTRMQQRUZVTWVeKKMLSLXY`UMY`QW^R[XQIcNS`YQbhcij\WCSXVPYY`RaYf]ZQNWYWTWUZN]`]aY[VcTGQXY?UUFIR@QEJBCE;PH7MUQONRV\^NQYMQNX\XFMLxPGJLPZOP@?ALRI86<9Q^EKYECXQRY`SDQSWV^cWELMGARZK7SSLMWS@M9ISTVWLO^]Z?H]EVV_5IH:NQ1WHKM;HYYVHJNP:P^Z]X\RVN?AKUXYmIMX[CY^HI\{0kgda]cb`pvFVpC6{bgNYosQbZKXsgZ\V]duobk\{ïe_UWd}ymZppYR]sfk_^uaMVUmuhNht^Ydjpoael__NZ]Rji\n\xr\|Xb]_bdRSWZZX]KNDMUJSceXBSG\ML:MKGQLED9C92?I;WiWHZZLW|{_ZQTfbaTKQ]SGDSUTUKSAD>R23ASJXHA9G_H496MD:UNUWgJI[NdTIIXWgLIINuLTLQI^Q[`JEJNTVSX`ZKQ\QYZQRZSH\PRcdQRc`[eeVHXXWPYVTI\_`Y[PARXXTNTTD`][YXbH\^JGRMTQSMM@@M?BPC;JW>9SKQPQX`dXXLUOXT[[\DBZx\>NGK[IZ@?CBOB;AIMRKKVaCQYANY^\EEUMS_TTMKKJ@QRMTQMNGVXKGCEUNJTLNZc`:B`W[[UBV7HYTCZ@RO@@`XZYHPMF?]]\^\XUSBKIESdZL]YbJS[CHT{0mkd^fag~bbylbT>DmX\Y^xNPkblLN_Z\\c{qZ^k{ch\}cd]SSwszvauwVRV}iWTXUB?eallAlbTYbtiue^_TPcoW]CW[M_VJSLp_`myYdX_ceLOY\VW[RCHGNOK`_XCZ@CPORKO?DMGB6?83<3KbNEAX[GP|Z`ZMZ`QJZQV]QARTS^JLO58T?87B?NM9;@CA;*AIFDUG>PJ?:PJROR[dfYhNJOVZe]NRQUx`BIX:OGSF=H=B?>RNAE=URSOJWJLY[SO>SON\T[FJNNMNOGRLOACOUXMLGLK@LRM[\[QFNVWaQFKAPVXLL:[KxxXNZgm[mdgUKQk{ZYeNE}INSPFBp{gS`krXhWcc\JT]NNXWTCBJHRKLZS?]F?HQOPIC9MIC::32<:I\]>DRcGNuYaZYQILVZTXVHLQHOXOJTD8J@;;:E>>HNDSTPRda^`K?BWe`TF_fKxMW?B>@@RG><8LTDU_PHEL_VQ\YS^M>HBCNHBGTYERT>D{ *lfVns^n^h{WLmgQPHKacdgcbucXIMjTEAPONQzpNPLxY\dfm|a^gvlM_wlDWnyqMP[dvl@frZ`KPW[YSor^EWidom^UNPQGes[S_a}QFcxTV?BPibSASqd{BSRSXPBYXULCRQ>KAMFF[P>:VX?8II>L<963CF23;J;STJIODtX?0NH5<CBCAFRRLGSIFAEVUPM:?IFMZED@O[PGEJBL[ZNTOQLCYdXUSKXHQFP[KHG:ReOUO]Z?F>HGLVH;NKHF>@G5GAINFQNGKHKVTNEFOGJZMVeSYzLKEB?:7=7B@8775F9CCDCBK;?KVTMKIPSI;NMPD@RJBIGCGEOKC=ELJMMHD=LKNW`?M]R=DHWTMJ@@DAT^=:HOGF@>?A?;<4@F54==@ORHBYMSP?aTOcU:DdN7KTPZTD?6>A:@B::7:3?G46:365O<@A9;?8;87GE:3JC>EABFMD>95PTJ>6?B@UA0:A\ZWaG;==<@EKDCDHSGHDEFKUO;:KCBQ<@LCOU>JJAPVRMZYNDGQfQMZJVQDIK]KR>=GVGNJKWDE?MKESODFQUMBIMCCGIPJTVbV!MJD8==6>:59<580<B=DB=EMSFCRKQF?UKF=NHBDECJBIFII>KMIIGFABG@UlD8TFE9JWFJJH?>UIHMC<>=:KRAIH4 { \_KVu}`ETY{\IWJggY_TLZ]x]aKFs`{WOCAQj{DSdLFU~PIQ\tlzLN\gryrf^ZujQH]ifUZI[g^_E=fgD;MVr`Up^O_apqGBQZovgOB[DKaJLdTS^dJ\GDQNJPDLILFEDT[>AHCR?5C@9K=6BBB:6ZIZH=6C>;G=86=ZOJQCBD6;PF@;QPaMzMIE:=E95O68?9=-<9EA=FM=H9LKEGAD@IK;>CDDHJF@HDHIBPKICAFD>EEHdT3OGD;HRAADH9=KGCHKL7?DRLT\LMOCO`=SZR\@]G;MHD<::B4PO7HEz&XVQ7Q^EL]^IBWAP[LF@PEOE;FTVLCIPENQ`TPZLK^GBP]DSLERLcVYHDQVUHLSGVW@AOM3AEHQHTI\cLVoXFOBMP@HN\EUJDE:HHQ^TBDSR^oE=SMpTfGTI:BUC>KRRDC??CXC3=I;A>?G>>DCC]LH;>@58<8@8+53597=88;;5;?B9709<588<=1<=8DA=HD@>;5"CN;H4==?@>=49::LO;ETECzJBA;>C?1A88@44/87C@=FG9A9?OL?>=G@F?GA?L48AA>ERQ9>FGJGFOTKA>E@KH9VZ;CMG=ER@7CAC=8;AHLS=8KSOP\S=K\KYSUTL_TAA9?AB@78><=D@C@F@;C\S<9@`FJB=LOKE9>OVKC=COKOYMPXIFNBEGBNI@AXMRYeT>JR]H=YOLZN=RL9?<@HWURlvTiMCKBSCEPGZLB?=H?=I]]MEDTL[sxWggyXPHDDBCHA>VPUSBA=AK@8?NE:46FB5A?H<>=?I5G4-60@OK@ANGRB.]I>??AFVHB<;7WQFAC==49=AH9+25848929587:S883=949987/AD9;;BMD9D>3:@AKBEA>>FGE=IMFA4DB@A98HM9PDD@:ENQDHWQOHYSAFACH]D=O>AEHHUW<:D5@8BL:58IAE@BT>>8@A8015<>d:6GABFO=D<9<>A?@;H;8>E;AMH;AEDHIHBP?=>:VP6<>:AD=ASIKSSAGBT]FO[QJa[:>6SxB9;@L@K@7EKG;<M:H7AIGU=FaW?NIHO8HSKOV?C;D<6IBISIUlbHBELF]=>KDWX5>AEE=AQPJ;DHHR[l`OdlJ9>@=KJB=IQQMMNB@=GB>ABA;589A8>AD:;78C5<9/18DH?@>TR;7;@=DBAHD=>57=EH1-485<<315=98@;738:3:<94.:I>A8=?@9A=47:A<=;4@;57<:E9B@CF89;8A@FADE7@LJIECEE=8E<7E@2DF>JD=M;5:HB>148:;K?=RUMRUSTX>E<:8FDB>K;@Jy=5@<<@>E3738=/05<4=?7;B@AG?BAEB9@>D?>>A>:>E9G@69C;FKH@JISG=4AHFI@EK.>?<*TQ?7;7@94CCKDI<8BF39FAB=FI678AB>G=6=><>=<8PF;=7IZSAJHRPCGT>MA51@FDF<9YNCPX?E;7FPHNE:FG27BGAD83APQ5N@MB9;D=LENJPN;9?G@@B=92<2>?T:5696>=6;4.3DLA975>FB2NB:C?3=CH2:D=O8;AEDE@954;51397036?6/519:<2.7CH:855ED3984==9>180355<956IAID5838B>ECKB85DFDDEAJC6L;;@E79DA>=J;9FEGGPT@=H[_YNJ3@D><6A93F?9=ED@aV449>BB@AB6?B<4749EF>>TQKNSVNfG9=F5>BB?J=?HI4C65>;C4543652;;477J=_B>EGC>@:@@;>B<:6;@?E>15A>=BGFEHNF@68MS@J@F00:FP:;96/:NJ9E6=98;8HYG9NIJ:T`U>U]S`N49>=C=44:=A'w#4,%#(4'.'$ & ,'#$((" '%((%  "%"%"*,$ %.%/2.,/2))2&-+" +%/+&#,,)/0&(%#!,,+4#%$#&&-)'%%(( &%+,&(-.0&- .5$#&(([*)$",$*(%)#%+#(&)-0%%'%25+1#&&%%')#( ()("" !%%# ()+# "%% /+ +,"(!%,()+"%)-*%#%"#" #%!$#%)/"#&#' $ &&#%! " %%(/% "")&+*)(& %&%*'*(!+#)%*($"&()*"*/+*1/( &>61+2&"&%% %+"#%)/./! %)%'('$$# #%,!.&2,.25.66,%!% &%'%%+&w&#"# ##%" #& "(#$'$(('+&#,(%%(% !#"#)&%&(##*('(,('&,1'#'* !+-% #&%&, '(&"!&#(-&43+(&&=6&2?-.7+# "'%!  5 ;J   %9 %$!    $!$$(+--0)-013507175537<:7<7<77<<7:757::55737 3130110))-)+"($$!$ & !       % %%%"%)%)*%)00337393=?=E?HHIHBILNILLIQNL QLNQNLQQLQLNILILHHIE ?BBE?=B=99=90077,*,%%"%""%%     & &.4&4&;44;E@EJERRJNNRZRVV``Zc]]ehkemkhppomqqpopsqopqosspoqsopmpmmohheke``ee]`Z`VRVRVNJERJ;@;4..4.&      %==%%N\-%=%N%N\\N\nfftnnzznznz .ztnttffnzfftN\N\fN==%\%NN%N%%NN%==%% &5</./3/'88333"D""D"Dw3w3U"wfwwDfD"wf3D""D3"Dfw3wwDwD3D̈w3DDfw"""www3"w3www"wf"DfwwDwwww"fUfݻ33wD3ww3f3f"D3DwDwwDwU3D3DwwDwwDwwDw8BIMPatt8BIMTxt2W /DocumentResources << /FontSet << /Resources [ << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (TimesNewRomanPSMT) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (Arial-Black) /Type 1 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (MyriadPro-Regular) /Type 0 >> >> >> << /Resource << /StreamTag /CoolTypeFont /Identifier << /Name (AdobeInvisFont) /Type 0 >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /MojiKumiCodeToClassSet << /Resources [ << /Resource << /Name () >> >> ] /DisplayList [ << /Resource 0 >> ] >> /MojiKumiTableSet << /Resources [ << /Resource << /Name (Photoshop6MojiKumiSet4) /Members << /CodeToClass 0 /PredefinedTag 2 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet3) /Members << /CodeToClass 0 /PredefinedTag 4 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet2) /Members << /CodeToClass 0 /PredefinedTag 3 >> >> >> << /Resource << /Name (Photoshop6MojiKumiSet1) /Members << /CodeToClass 0 /PredefinedTag 1 >> >> >> << /Resource << /Name (YakumonoHankaku) /Members << /CodeToClass 0 /PredefinedTag 1 >> >> >> << /Resource << /Name (GyomatsuYakumonoHankaku) /Members << /CodeToClass 0 /PredefinedTag 3 >> >> >> << /Resource << /Name (GyomatsuYakumonoZenkaku) /Members << /CodeToClass 0 /PredefinedTag 4 >> >> >> << /Resource << /Name (YakumonoZenkaku) /Members << /CodeToClass 0 /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> << /Resource 5 >> << /Resource 6 >> << /Resource 7 >> ] >> /KinsokuSet << /Resources [ << /Resource << /Name (None) /Data << /NoStart () /NoEnd () /Keep () /Hanging () /PredefinedTag 0 >> >> >> << /Resource << /Name (PhotoshopKinsokuHard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (PhotoshopKinsokuSoft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> << /Resource << /Name (Hard) /Data << /NoStart (!\),.:;?]}    0!! 0000 0 0 0000A0C0E0G0I0c000000000000000000000000 =]) /NoEnd (\([{  00 0 0000 ;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 1 >> >> >> << /Resource << /Name (Soft) /Data << /NoStart (  0000 0 0 00000000 =]) /NoEnd (  00 0 000;[) /Keep (  % &) /Hanging (00 ) /PredefinedTag 2 >> >> >> ] /DisplayList [ << /Resource 0 >> << /Resource 1 >> << /Resource 2 >> << /Resource 3 >> << /Resource 4 >> ] >> /StyleSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 /SlashedZero false /StylisticSets 0 /CustomFeature << /StreamTag /SimpleCustomFeature >> >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /ParagraphSheetSet << /Resources [ << /Resource << /Name (Normal RGB) /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 /ListStyle /nil /ListTier 0 /ListSkip false /ListOffset 0 >> >> >> ] /DisplayList [ << /Resource 0 >> ] >> /TextFrameSet << /Resources [ << /Resource << /Bezier << /Points [ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] >> /Data << /Type 0 /LineOrientation 0 /TextOnPathTRange [ -1.0 -1.0 ] /RowGutter 0.0 /ColumnGutter 0.0 /FirstBaselineAlignment << /Flag 1 /Min 0.0 >> /PathData << /Spacing -1 >> >> >> >> ] >> /ListStyleSet << /Resources [ << /Resource << /Name (kPredefinedNumericListStyleTag) /PredefinedTag 1 >> >> << /Resource << /Name (kPredefinedUppercaseAlphaListStyleTag) /PredefinedTag 2 >> >> << /Resource << /Name (kPredefinedLowercaseAlphaListStyleTag) /PredefinedTag 3 >> >> << /Resource << /Name (kPredefinedUppercaseRomanNumListStyleTag) /PredefinedTag 4 >> >> << /Resource << /Name (kPredefinedLowercaseRomanNumListStyleTag) /PredefinedTag 5 >> >> << /Resource << /Name (kPredefinedBulletListStyleTag) /PredefinedTag 6 >> >> ] /DisplayList [ << /Resource 5 >> << /Resource 4 >> << /Resource 3 >> << /Resource 2 >> << /Resource 1 >> << /Resource 0 >> ] >> >> /DocumentObjects << /DocumentSettings << /HiddenGlyphFont << /AlternateGlyphFont 3 /WhitespaceCharacterMapping [ << /WhitespaceCharacter ( ) /AlternateCharacter (1) >> << /WhitespaceCharacter ( ) /AlternateCharacter (6) >> << /WhitespaceCharacter ( ) /AlternateCharacter (0) >> << /WhitespaceCharacter ( \)) /AlternateCharacter (5) >> << /WhitespaceCharacter () /AlternateCharacter (5) >> << /WhitespaceCharacter (0) /AlternateCharacter (1) >> << /WhitespaceCharacter () /AlternateCharacter (3) >> ] >> /NormalStyleSheet 0 /NormalParagraphSheet 0 /SuperscriptSize .583 /SuperscriptPosition .333 /SubscriptSize .583 /SubscriptPosition .333 /SmallCapSize .7 /UseSmartQuotes true /SmartQuoteSets [ << /Language 0 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 1 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 2 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 3 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 4 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 5 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 6 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 7 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 8 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 9 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 10 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 11 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 12 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 13 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 14 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 15 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 16 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 17 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 18 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 19 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 20 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 21 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 22 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 23 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 24 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 25 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 26 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 27 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 28 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 29 /OpenDoubleQuote (0) /CloseDoubleQuote (0) >> << /Language 30 /OpenDoubleQuote (0 ) /CloseDoubleQuote (0 ) >> << /Language 31 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 32 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 33 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 34 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 35 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 36 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 37 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 38 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 39 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote (<) /CloseSingleQuote (>) >> << /Language 40 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 41 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote (<) /CloseSingleQuote (>) >> << /Language 42 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 43 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> << /Language 44 /OpenDoubleQuote () /CloseDoubleQuote () /OpenSingleQuote ( 9) /CloseSingleQuote ( :) >> << /Language 45 /OpenDoubleQuote ( ) /CloseDoubleQuote ( ) /OpenSingleQuote ( ) /CloseSingleQuote ( ) >> ] >> /TextObjects [ << /Model << /Text (v.2.4.2 ) /ParagraphRun << /RunArray [ << /RunData << /ParagraphSheet << /Name () /Features << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 1 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 >> /Parent 0 >> >> /Length 8 >> ] >> /StyleRun << /RunArray [ << /RunData << /StyleSheet << /Name () /Parent 0 /Features << /Font 1 /FontSize 18.00225 /FauxBold false /FauxItalic false /AutoLeading true /Leading 13.20165 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 0 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures true /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms true /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 1 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 .0549 .0549 .0549 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 .31766 .30197 .28629 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst false /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 26.89709 /MiterLimit 107.58837 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true >> >> >> /Length 8 >> ] >> /KernRun << /RunArray [ << /RunData << >> /Length 8 >> ] >> /AlternateGlyphRun << /RunArray [ << /RunData << >> /Length 8 >> ] >> /StorySheet << /AntiAlias 1 /UseFractionalGlyphWidths true >> >> /View << /Frames [ << /Resource 0 >> ] /RenderedData << /RunArray [ << /RunData << /LineCount 1 >> /Length 8 >> ] >> /Strikes [ << /StreamTag /PathSelectGroupCharacter /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 0 /Children [ << /StreamTag /FrameStrike /Frame 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /RowColStrike /RowColIndex 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 2 /Children [ << /StreamTag /LineStrike /Baseline 0.0 /Leading 21.6027 /EMHeight 18.00225 /DHeight 12.8894 /SelectionAscent -15.44569 /SelectionDescent 5.52022 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -15.44569 0.0 5.52022 ] /ChildProcession 1 /Children [ << /StreamTag /Segment /Mapping << /CharacterCount 8 /GlyphCount 0 /WRValid false >> /FirstCharacterIndexInSegment 0 /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 0.0 0.0 0.0 ] /ChildProcession 1 /Children [ << /StreamTag /GlyphStrike /Transform << /Origin [ 0.0 0.0 ] >> /Bounds [ 0.0 -15.44569 65.00322 5.52022 ] /Glyphs [ 89 17 21 17 23 17 21 3 ] /GlyphAdjustments << /Data [ << >> ] /RunLengths [ 8 ] >> /VisualBounds [ 0.0 -15.44569 65.00322 5.52022 ] /RenderedBounds [ 0.0 -15.44569 65.00322 5.52022 ] /Invalidation [ 0.0 -15.44569 73.64423 5.52022 ] /ShadowStylesRun << /Data [ << /Index 0 /Font 1 /Scale [ 1.0 1.0 ] /Orientation 0 /BaselineDirection 2 /BaselineShift 0.0 /KernType 0 /EmbeddingLevel 0 /ComplementaryFontIndex 0 >> ] /RunLengths [ 8 ] >> /EndsInCR true /SelectionAscent -15.44569 /SelectionDescent 5.52022 /MainDir 0 >> ] >> ] >> ] >> ] >> ] >> ] >> ] >> /OpticalAlignment false >> ] /OriginalNormalStyleFeatures << /Font 2 /FontSize 12.0 /FauxBold false /FauxItalic false /AutoLeading true /Leading 0.0 /HorizontalScale 1.0 /VerticalScale 1.0 /Tracking 0 /BaselineShift 0.0 /CharacterRotation 0.0 /AutoKern 1 /FontCaps 0 /FontBaseline 0 /FontOTPosition 0 /StrikethroughPosition 0 /UnderlinePosition 0 /UnderlineOffset 0.0 /Ligatures true /DiscretionaryLigatures false /ContextualLigatures false /AlternateLigatures false /OldStyle false /Fractions false /Ordinals false /Swash false /Titling false /ConnectionForms false /StylisticAlternates false /Ornaments false /FigureStyle 0 /ProportionalMetrics false /Kana false /Italics false /Ruby false /BaselineDirection 2 /Tsume 0.0 /StyleRunAlignment 2 /Language 0 /JapaneseAlternateFeature 0 /EnableWariChu false /WariChuLineCount 2 /WariChuLineGap 0 /WariChuSubLineAmount << /WariChuSubLineScale .5 >> /WariChuWidowAmount 2 /WariChuOrphanAmount 2 /WariChuJustification 7 /TCYUpDownAdjustment 0 /TCYLeftRightAdjustment 0 /LeftAki -1.0 /RightAki -1.0 /JiDori 0 /NoBreak false /FillColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /StrokeColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 0.0 0.0 0.0 ] >> >> /Blend << /StreamTag /SimpleBlender >> /FillFlag true /StrokeFlag false /FillFirst true /FillOverPrint false /StrokeOverPrint false /LineCap 0 /LineJoin 0 /LineWidth 1.0 /MiterLimit 4.0 /LineDashOffset 0.0 /LineDashArray [ ] /Type1EncodingNames [ ] /Kashidas 0 /DirOverride 0 /DigitSet 0 /DiacVPos 4 /DiacXOffset 0.0 /DiacYOffset 0.0 /OverlapSwash false /JustificationAlternates false /StretchedAlternates false /FillVisibleFlag true /StrokeVisibleFlag true /FillBackgroundColor << /StreamTag /SimplePaint /Color << /Type 1 /Values [ 1.0 1.0 1.0 0.0 ] >> >> /FillBackgroundFlag false /UnderlineStyle 0 /DashedUnderlineGapLength 3.0 /DashedUnderlineDashLength 3.0 /SlashedZero false /StylisticSets 0 /CustomFeature << /StreamTag /SimpleCustomFeature >> >> /OriginalNormalParagraphFeatures << /Justification 0 /FirstLineIndent 0.0 /StartIndent 0.0 /EndIndent 0.0 /SpaceBefore 0.0 /SpaceAfter 0.0 /DropCaps 1 /AutoLeading 1.2 /LeadingType 0 /AutoHyphenate true /HyphenatedWordSize 6 /PreHyphen 2 /PostHyphen 2 /ConsecutiveHyphens 0 /Zone 36.0 /HyphenateCapitalized true /HyphenationPreference .5 /WordSpacing [ .8 1.0 1.33 ] /LetterSpacing [ 0.0 0.0 0.0 ] /GlyphSpacing [ 1.0 1.0 1.0 ] /SingleWordJustification 6 /Hanging false /AutoTCY 0 /KeepTogether true /BurasagariType 0 /KinsokuOrder 0 /Kinsoku /nil /KurikaeshiMojiShori false /MojiKumiTable /nil /EveryLineComposer false /TabStops << >> /DefaultTabWidth 36.0 /DefaultStyle << >> /ParagraphDirection 0 /JustificationMethod 0 /ComposerEngine 0 /ListStyle /nil /ListTier 0 /ListSkip false /ListOffset 0 >> >>8BIMFMsk 2#eu(@ }!K+#eu(@ {!K7cu&'(@~~!_e~$2  Ғсҗ ǿճ  „*  Q˚   ~y<     3͈  8 #)*'!  &*+(  ")*(#  #ָ  1DQZ]][UL<) /JY]][P4%9LW]^]ZQE2 K@2   )J`edY:4[e[+5Tde`J) ؽ=     *SeYNYea?.ZeeYNYe?<_eNeS* Hф          Ke<1_e_4(TeeT TeY+e7Ne93]eeB                  Tc\bde _a31WbeYe\( 'ReeYY<`ee_1NeL - pч,tS ~Ż=  S        Edd%%d1%ebG?EGF>,&Jdee< %_eM39EGFJ]ee7¾¿l!!"%&'()(*(*)**))(*+*)+**((*(*()*'(('(('%%ĿĿ + wž  9j ¿¿6-* ]Ï  8º5   ļ4  f    "%!##&'&')*+*-+,,**--*+*+*+*++*+*)('(&%  ~ |  7 5- c’ 7Ș   ¾þt  `”  r;   -¼¾ "$%%'(()),*--,--*-,+.,-+.+*--* +**+**((% @  >y  = 3 - d¾  7  7½   ]º   `  Y !"$''()+-,.-/0.--0.0-/-.//-/.-,-,) 'Pľy   t  +2 - bvmz D G Žg   ^  A `   -5c"$&()(++.-.1010/10/012011//211.100-/-+)'#$  o  ú2- ^ZE;AZy   | x  G#  d Z  "h "&%(*--/0//02213232112020200/00..,**):,  )N  1-  azS+  Pk  J ¾A  X} # N]  "["%&&*,+./01121232 424332422112120,,+)'on   5    3 -  `_; *f_   ƾ+  h   ]  %[   !\ !#%()+,./02345533445533534324223323311/-'+*:4  4  *3 - _dk%=VM  mD  )&  ^  *d T `!"%&(*,-1033245546556566566556445456454411+(ľ-  n 5  S/ - ZfVv&:RE  o@  `  Z  O\ 3 ^ "#%)*+/1335357576757576757541(."(lV    1 4  x8 - TsLNpB+S>  r3   5  U  1Y  (\ "$'**..114556767757577577676576 2h*J !!   2  0 -1 [SMPWc, MK:  -Lp{R)   O  Wz  ; ^   $Y "$&(*.0134677687878678786886543'#  " !!% N/  G5 -@ OXJRTRYZK;;FJ@3 )]=   S  Z~ 0 0O ! ! !  `$&*+-.2256789798989989798899797876)7B!)~G ! !"!   /  / - Z(dJOUW[A.725B99, (uE$   *. * W  4'T  ! # $ !#"!^"%)+.023567889898989898 76ts'O u" ##$!"#" E3   / / - T+jIKSUXK1,&)G978- +zN2    hu   Y }  / Y !! ! #$!""!a!$%),-1245778989 =EWam}xng\SJ@;98771&!, ""#"##!$"  2  2 -8 ZmKGOSSO7,)'H=;88. *`O0    (  Z  2)R  !##!""$##$#$#"["#'*-024578989:(BO}fL<:8977'IA"&,<!"#$$"$$%"# $0  O2 -  Z'yMENPQR=+( H>:6680 ):Nr nJ&  7 uP  Py  2+] !!"##&&$&$%$#$";_#&(+/0346799;:@aͿÿX;986qX&_i!""%"#$"$" c.   -   S2}S@JNOPB-)C;734590  (yh:   9   M{  4oQ  !#"#'('%.\$'*-.246789;@y»ƺ|[@2 0"&@B!#$#%&&$#&!!}/    - Y S{_=DEFF0'/A4/,-.392  $e  !!  On  !  Wn   wR #"%#$''&('('%% ?R%(+-13688=ÿÿy=*P'%$mZ "##$%'&''#$ 0/  !   !-"- %8E;Ic{sA6?@AB3'#E720149>F> ( (^  !""! )  !!"!  Kp  dW !"%$%&()*)('&$D?   B ~&  !"##"7! d[  !""#"!  R p " `U  #$&&'')**+)*))( ET'(,0357L¾¹ǽҽ`>_v('&%# ) #$$&(()('&%Z0  !!""#"!   !""#-$0#06/D[cbT>67,Mb**+%(*PS02EIE'.4~}P'*-16ĹǻF0kr6?K)'"- !"#$')(k 0  !"#$$%-&1)GU\Z\]H3871I-!!%i& @} i !"#$%&%". "##$%%&%$#"J q(#Q"$&%')**--,.-..,-*+4Q(+-2ƶȿ83 VASZ?)()(( L"$&')(()&}x~~ , !"#$%&-'0*HMU[Z]K6773=nyyxE  ]R-=RLA)/4ȥN5c||e8Ifd^X2,$9~ %%()**+)*)s.L c!"#$%%&''(- (2,LOSWZK3463=;     *69OJA"%*081  ! , !#$%&&'('&Yxz!}{xx|}}|H "#$%&&'('&%%#I|{}efu!$&'')+,/./0/.C{{vvuvwwz}xL).ɬA= H8Qfdc\M,--+}}{<#&((**++((n| --Yp|K "#$%%&''(- )(B+KMSVVR70642$   14:LFA%(.5;7 !""##""!*~z}||| 4 !#$%&'()(')ww|}x}|||yy|w|}}w{|u@01/.   ?112;@!%)071  !#$#"!)z}yxwy|zyw{{vspA!#$&'(())**))($t}}wy{~{~}}S:AMYc]. "$%&'(()) () ('&%I~{  {yx` !"#$$#""  !#%')*.-.012401010.{}}y}}{{y~y}{{~{L ,!^Ej}~`=Ikdgmhd]210&A~~~{{y{x"&'*)+*U~}}~~{{wwurqu(j{~}{u( !"#%&'(())*- +*)(&)B'-DONJ7.,/! L K2(%/?#&*184  "$$%$$#")sqsoopttwxxvxuzyz{tsnmllnnorovw`!#$&'()*);}}|}}yyuuw{|}|k57HV]eqwL*$$%&'() %Psr"()*)('&J{{|{{yvy|}|b 3!#$$%&%%$"  "&''++//012313412300/yywuuy{yHvyy|{|||M K DJ}|NGjrmmvsmkA33.'|||{3&()*,,+**Cvv{y||yyuuyvropuuww{+ !}}H !"$%&'()**+- ,2543210-7? -GTSJ8$$'  # F-$(.>"&+194  "/0//--,(2k moqqsqrqrtvt rsqstrpsqrt _!#%&()*+*"|~ytsxyy|x}y~zzyyxC5>GS\amw{jO4)*;H(())**++**)('J}||wwtwt[ "$%&&'&$"!  #%((*,/0/123435643 01}}|zz}}Jvrsrjgqv`743gz}yw sqqssuzS&'*+-,,**!6~~}}}|~, ! m}~z}~|}|~}}z}4 !#$&'()*++,- ,+;BCOTbjr{:>nlkkifh^8L}rgL1*+,,++*)Aljghiikptww|xz|~||wwuwuyuy_ " $&()+*+*+))&%$#$#%&&(**,/.0241454675765531stxxspswtuyw=rH\z=8]otV7h\C^x|~hAFeS>?>=>=:6.(" +qnqquurprqrwzxwxxzO'),+,+Dninqpsqssuxxyyzxtsu*!"!b|zyy}|yz}, !#%'(*+,--.- //.Cv ?    M   , # (j|eRIOS[^Y#  :IGKMP@!$&(*+,--,)osvxwwzwz|+wuroopmnmmlpssvww{{|p27NU\bcivv~R:Sop srf;Ma8,+)Cvrntvz{{zvxwsppm ljkkR!#;%')*,,-,-+**)(''&'&'))*,.//2246657689755654mjlruvwuvxvuvpor6tspnG hri:Nnnk]7LI>t{|}T>UeH>hvurosuu vzzwuux{vvussmlgefcegcd]&(*+,-8,#$plhlppoponkimrrmmlossv, "##$##"az{{||{|{vrrssrus* "$&()+,-../- /`P}ws}}}xxwxz{}zz}}D `|~{{ypi_^ZcfgjrxE # "~nKFMRYZO 0PHLQ2 "%')$*+,,&gvrqtusrrnkppurnnpqqruussuxurnj6C:CUW^dgnsva;Drruqrrste>NwF,++)Ctqrnrpjf efggilhnnrqrnqns[!#%')*+-.+*)()()*+/0011345657789677554y||y|vrrnplpu8ytqD)ftT=gzyue9Lp;Ksqsq>@sqsnstxyy}zyyxspkpnrqpqruyttr!")*+-..++*]ljjnpnknnqtpqssqqut* "#$# Ufbbcdeghknnlnnkk( "$&()+,-../- 00/Xù;##$##_ER (d^9ADIONI( (BED !$&()+,,8fcaaejfefilnnstsnooptsvx}}|k7:IRX^elwzz~?>emlm:kom`?N~Y2*?kiheiloknoppsuzwvruttpmniikinoW"$&(*+,-.//-.,-+**)+,-/2124557679Z876844iededdhfhkiimoprppsopoG6^rzzx=Cmmjk]=PX;Xeil[&),.,.--,5mijllmnonprrwrnmo)!#$%$Xonmpuspsprstsr*!#%')+,-.//0$- 110e¬wT7('$"c;T0;@*$/@Ĭ?6:@FIJG4! !.I  #&')*+"aghffefcfehhggkpkmiifcbfAeigi@9@OV^glpwz~?;Saaefhjmpnc@My[!@mnnrrsqtvrrnkmligllhjhhjmV "%')+,-//1/0/0-.-.--.0/14656676:79::87756qtxxtsqnmkihB2*(".l34p"nJC;AFHKE=0"! !12 "%' (?de`dgijln0lpqqsqpmmnlmmiieegklmV;?NSV^hmx;:SwqmmikgaAMu~_#Bpprvr sqtspnkklkkif ilnmnnV #%(*,-.0310/02 34366788:8:8:8987okmliigeeiki,fiiloD8Tv}qAGaddfaWAS~b8Jif>@ad_?::;;<;:98425415Nkkorqtsrqr$sqolpl%*,./--/.+.gkidffkilliieeifb&!#%&'($'Xkkmmoqqrromppqqrnp* #%')+-./012- 20U|}dùÌFQL3*'e2%?4>{}}|p,29=A>@=6%6-*263/5?CL;,KQUZY]^_`dejlmjmnnknliCeiieeggjnkA=JTVY]]gnqqu|i>9KilmrrpklmjkdDMx|lDTqtpnppmlgfeggjijjijmnomoopqqZ #%(*,-/0113020013435655798:;;:86gkkjgkomkggijljkoJ>Tqw~BCdo%mi`DRK8^rpmT5C[V[\W]^_cdca_WUQK;3:fgjiidgigkikggkjij29),+-0.-,,'M_cbaeiimmkkllollkgg(!#%'())((Tgefeedgjjmnnqqro)!#%(*,-.0012- 30Twv%sàIKO3),"Q<Ħſg=A7ovvws|(05:>@B@>83#$"3VOGT[WT0*EOPSVY[adfgfiijkhffc b`aa]aedfK:Mjpk!lnmokkaDPx|}lCXljkmkjkfegihfdghjiefhjlW!#&(+,.1.24224212343344554647879:8989<;:;9:97jmpkkjhhcb0][\Z[]Z[]aODWpw~F8Sefeda_[BP}~t99gk@3HOHNPO[\bijefihfbZT91`h lpollmmprrpplljT"!*,-.0-,+bjojjmmpmkjlpo* "$&()*)Qjglkplhhggff(!$&)+-.01223- 41Vwy{zyy´S<6,+,"?ý:3@>qvy{zzwx$+0489>AB>:4' &-#5{<>< 0@BLRVY_behjmnqspoj$iklljhjka53??A>GMUaccko}`B7]eaceffijh[EOqwfCTecfjifcceehefjomjlhlfeV"$'),./22356565757667:9;:;=<>><;=::8ccace`cecfefccfeEGJMXVWWR@.(,7Wggdccdacagkll_GNnvEA^ehjjmmollgiecgginjfA47FIKNJ=8779957667:7977;9:1`eijfhhgi[5Bbb_dbR./KcbdgK1BIFIPKMOVSOKQMR_\XPWXS55cdc`ddedcdeecehedadea`]Q4>[WZN601..-+#Diifcac__^__`^`aa(!#&(*,,-,,Xfggij(geghd``]\'!$&)+-/12345:AM`u-ERjvtuzyx jJ5/36/C?L8F=druzzv{m"&+059>DG8&  &$ %'()'-369?FLRVWZ_deeb^\_`ebZ()3:EIINC?<3+*,3CXecdfgiaAFgqxvV=:Jnnjijgeddhhgcfige a]Z\ZX@8=K\i+~~}k0=][XWYWZ\[/_bcecfdd`\`L4}we`fvvspmmgFA>@Wlp`DGHFC^ljgbXS &,2:AII#$  '/('&)036;AHLSX[^\[_`a]]^\]C%.5HIJPRTXVRWMFKLGLPD.-PZZYX[^_^][]aa^^]._ceebH5?W^QC<9100.*( )`efkkjnnlligc`D!$')+-.&_abcghkl$hgga.!#&/Jn¹9VtOW\_`maVC;=>=9L^&"$%!#-334846:+$#!%36432740) )#!9<7Ndb``]XOI#'-38(# ;'")2#),25;?CINQUWZ^[_^]``Y'&44>=0,*:EU`jjgfbbaada`bcgfgdeZ4.936QmzO9FUcab`a`baa_adedaa`__bdde`_bbcbce^M>;8./4bzWDA@LIQ`oduxm\LJJ_bOYnhmv`NHF;<1 '\b^^__accabdced`d?abbC".RTL=*>W][]]_b`_cfbbR,-7-+-+Jbbecgccea9+'1>JOTZ_XPZRGQKJG@0)9fbd`^bbdi ead[;8GZoeM9841/.,)#Pigddc_[YWUQ !#'*+-..Vaa`a`c`cbd#`=$7C\ýms49TsR]acddeeG;BBA@=Sb#  ##',%$2 %&&(&#$-!%,18>Ca`@>BBE=>Xgc`[QE# 0 B -@//A#%'%&/64=CJPVVYWYYa[ZXXV[1&%19<20MVVZY\\[[WVZ\\XYZY_^aeeffjkl\+,9@UMQl@&C\b^[Y\_abadcabbcaba^[^^\[\Z[^^+\XG.@M;@FH\o`WviYMIKKG\uNNk|r`QJ\6(0/(W^[\[`\ada^b^aab^a^]N58BI@<;@EZabca^bggdda_N,.**&;TY[ZZUZ\ZI-''-IRa\[RPJJPNG ,-*:dcddgijjghfbabcd^=>Abd& "#$)%/.*1<22:6(!H (3410148.(+$&"&/,8>FceI>AAD@Ogg`cd_ZO> "$4 +%6Oc^ZXQ64=:850PYUQKI?:0*(%4Yba^ZWVSUQ-)+'(Uecc``^`^a)^bX6 0DWbgniaqyul{ie[]_b`a[T09jOBC?Cgd# "(%%%.*2((A55;C%#$#".>2&2:771 ,()# 3-:1&"Xc`^^[[Y[]\\W[\[^]^[[^^_^]^]^]`T1.841=VrC&MWWTSVVUX\\``^^__a__^Z]`a``c`cd`_\ZZ[XYX,XWS'+X[f}w{mZ_I?GRNLJGAOSTXUTU_mwlf=2R]\`b`]#\ZWVX[^_YY\c_`]\]abC+1>A7>cc`aa`ac[[X(WVVWUI>>[[\`cc_a]Z^_ZVVUVZZV*"9>LV]_adZUQP\US}w`roeneYX\[UTR30Jk<06FVdegdD?GCA@ZU "+)' %2'*  758CD+%G+;$);6>7!1.5!/:=OfbB=BA?CYZD94:FD:BB?KRNGfs}zj]<7C`__da][YYXZY[abb_a^a]\[>e_:%'2?29__b_][^XTRPSRRS[YYK4Caddebb^\]_^]\\Z^^a].%IG:8>LYOQF1 .ATRPRWUYY[^_dffca_h[WUSQQRRSRP<,CVhhicTDI[Q=0(%%$?R_aa^^aa.6UL7%@d_^\\[Y[[Q@+$8NNON[ihntt\PRQ`rgV_mnks`Ye`a[_1_`/595FcbadTGDAC<;#+/0. %8'#""69>AF>&(''00%%.;7G9-"!6+)/ 087QcdQ?A$@GC<=>=VRJ#.8PX<6DHB,59Y_l}C>_Kk|vüO'.$!$"92" 1$%.06'')(&* %%&%&'%'!&$!#$$,"'(&)28RXOD5!".  $%+-2BXZL@Te^m{|fB6:FMOB@G@F>?T\Rg]a`UA:@3!+5/6,)"0,"+63#'9#32,##-B9$#-,&>2/$!.3  2"#""%'5*$RZYGCJDJRM9>)""+$(2%%"%## "&/4" !# $)(**&$-042TT_hutk^SKSF?9@PUN<.#!3FTa=A8RQH5JXVUVD>6'*7CPUTC+-:RhqyygNIMxcf^aebb]db^Y]^e2>a2597ObejcdO=>@C=:"%.966"!:,($!!=AKFHG'%',8(/ <=L;1(';) *6*:;>^db^A>?A@HB>?DKWN> -*-C^^9.<&Eh`lTRkcw}{kgcs#( #)!($6.'3027EJPQIB9546;DML?GX88CB@F1+.04?KRV`^YD<:;5;X{qFCJ{uz]_eaWh{SS[a__]\.#XaZ512<[dlngdP:GPF75:@C706:II>85/7>9,$)(7' +KF*)+&:.+C;#(!1("B;?8((3=>MA0',1D9,0:0-593+)(+-!"$9"*/,:?9HQMIOGHUiaU<6C2=2::=8>8SVNPY^c]hbG:IVQG=I;KZ^\RKGD@IF;Vg^[85FOFIKE:Zkka_ePNld_<:Ck{yrRHILQQK\\YWX]`e`PW__[^Z[.0XZW78OWhmmjjeM@FCC9"!'5@7AGJ9)!9;.3AMQ\PJNXJ1,8;,CGHPEFXOP8#6<1&8F9788:5/0==1,LB)');)'2,LC-'(0B<-.6=.1014.-*)1" ((&;*&-$':7HQR^^_]\`ZWZC7C?>2(=B&$#2,1(;,*,""''58+.0/>=1BNalma_^faTYTGC\_`c\VICIUX[_]WYZV_hqojpokxqGMmsunniZJH[eK;8CKMPLHJPQ]\\RSVXWkjSU\_YY[^[Z1,W\Y@SfilnnhlnpYHGFB?2,2;DHMHXI-(;B?Q`ZXdYXW^S1:;J>@;<5;EWiimq]>-.-,+7+$#$&;+./)0+/0DV[bX_\[]X[O>7B*"3CB&&)27+91(0&!%*'.9.+(.799825I[`leeXWLAVUMXadga`[MCTbZX^aeedjrsxv}sK\vwyusrogD?;?KCBFBDKLKOV]\WUPV\USaUUWTVRX[ZU\s.'X]ZM[^\abigcbeELEB;B2+=B6ATLJ5:28EL^\V^bXVQRO5B8Phc]ZHF> 9$!92:DANPFPZ;)KYO:WdQbSNR?/:mnTPXXPPD7/'&(0,2..=D+'>JNPHKKMLSN7+9+'+'(+1+2'*.955<<:=@45<6:38:;?EC?4,.'"770++/.&')/<;A<6*'(7*  &#'):)31!,9)*8+*@*?E2+6:4?B7AH=;EFA@7,99F@@CGHJ;LLO>0*07I."#469WNCH7A+8VO7-/;'=T=%*:L==502,?984>D23-0:?<-*.@04;/-(9*-;RTX`_f`^]GKCI)1KCI<2,7=-1<$0*&$"%1&$%430=<:'20% )BBU_U[X;8H>=MUb`XXclcaadbggmimlel^[ZUELdhRhyfh_IAB=M@@CMFGMSUcMNPQUU]S[\SNPQUXWUZ__,'Z^YPSB@9IOF:4D6H76*(#;@754PZH-DE65>JG@>! &6+259MFA;6#""8CGOM.05598<99<4:4;92771&.13<12331+'$-7@?G71/*14, -2!*&&,7+3.!%93127,/C.6ME049?TJA@;:0EH;?D61?CJCJHBBMOKU;'3=KWN;69>@QW7 5L==:11/4K2*05?:,0/A8>:-3M7LA8GEIMVONWVYRKOOPYZPX^RNTXTVWX[a`X,(WZYWJJBCTCJD?KIDD>4(0I46=;ZIP0<9K_^UYb_\[WHOBRCJ[^cWTZ_aV35A3EFAO9D6IHFA@GMIFG+4AE@BHEMB>4  (4$/8%2+)( 8*" *-4*N?<8/0,"'7(#6L?86JTPGQQ=FAA93HBBD5?A6::<794*)0178:=;A5A=9>B730>==>.!&)1NE<7AL>6>?4A1HR56K<=:2)9<*0I2;=JB9IE;MRLQQOANZUKRJSUULJYA;NF&8=H2(+,-**3.,#$.5H?OC54'1=8>A395EI>051B3/DJLCF>=?9QbcXVSZ^UMJIMJ@GIFCKNJ;LP84L1.:CN\HSPB1Nb]Y_e\ZaUJS=PIU]\l[W^f[Q9EG5PBKJDLFNKD4;OaQHCA@GHPOVSWM<&-8  %61&0>/#&6,+4,4:5-0"(80?Q<:F/9(#47,/(-4L@ACHTUXVTCFF=GICEP<3=C81/7B?0--.<=@=>>E:?E>BF=6461092&1*3AG/2858,.,2>H1+79-7))!/"%"L'" 1-%*?-2(.4B>3?'D5:IBGQCA;JE46/45;:KO9BT84A?JSOQPSGS]LE4,=CKCIG.7GLQ37*5;25E9:GB;4TLCJUVWSPAMVVKSTXLQFJR8HULI4<<214?7184FKKB,49;127>EJ0&1@-4)6-17O $%=8$(,?6=67!EC>=4IAHJHJO;8AJG<8?<86ICCN@M? MLOQXXNHUKQ:8U@HIR63EGFS8@=XQ*AKPVLE8OVOTDOYH=PJNVHLG&7@4:L:+8P=B@<>][K=@250&2 .P4=E-@0NX:=VYSC)>GDACA3@?GXUZe`ULTPMNJMQXOL=;0G89DKJ@:@F@HD:DICGACMIGFHL=9B>E01==KMN@467CA:GBJG9%5?7*1558 @Q8707<$*8;+K>.7CGK:5JKDHFIM:=GDL>@K@>CQB:OFIE33N>NR^YEILITG=B5>NMQ5>OKJQS=0SVKNPHOB2@PCJQJM=2'P8JGIRDND1?RZYQG:OD:H>F=9;@>87@;ECO9AEDAKFCAG?547I8)>,/517AKD<'-@7)/A6O;,G?HKIKKAEK?HDKGL8FI:GBIHDF;OS@I54M2EQ\[INNMLLK?+GTOLCLQQJFXM6O\FSV_SBSVQUQDKYN[QSK@YSK4HG;TOHHKXDGL=:FM=@N:-96@76@H8=VQILPOWXUPMNZVHCRSMVVY\R=*JTSRG><3BDLVFOLHGK@8HECIMFRNVQ9?1BIAU@CZXNMOUKQUDPaSESWICIOUQHTTNJPAS]SUOFWWC:HLCUEDG[_`NNVHFIWVBJ[GETPSUVP_e`]ZN-)Xd`W[]\amfgb`eUN]MDAMLFUabELhFRTJ]VWefb_WOQP\GQPVef^XTa\7RVOMR]VOO8>TADKPR\]QUU[kmkhWN0A*!BJ;09ELJIEHTRRQOE??;DBCALGE=LNMM>5GEIF48D9/O.&A7($A;)5ECKL1GBOMOY=8FO=GLBIKBCJHIGSGGM@OS;I3@MCDVVXQZPOJ?41JB1>AMGGJ\YX^SMJMZ_F?O2WKTQI\SQNAHHDCZP=>8D^KG[VYVIAQIPO:CVRWXPBCD,1WJAQSNSIFOXNU\PHXWIDSNSUVXFJGRXPNNYAHNHHFGMBVOSTI]QSKKFNV[MNNQLFVWXYRZceaTNR++_dd`}U^edcjk_fTWOKtYOf[KRhFOTT^]Zcc[XbZMg}U[Qfjt^YO_TUUSROQNFDOIMG\xpnhcbQQ251'<>/3C<7AB5%RINUTPN>JGFNYTB330IDF9M]FP97ADBJ[IEJ3/ICEIH9FIXWYPVMQPCMZTRXHK>5JK?E@YJ=3Q6B8DENKLFCMRROIFDAGLLIOM@MICRKN>=?5CD:>K6;Q-/L489H5@B9,7:@>>7;KMO=KIQSLQC:OP=FIFOJPIJNKSJHIHFPN=PD5HJFUUQVVZNGMFJLPTRHJIOJLNKMOJ]`YV\UKHP??STPMVYXWSZ]UKPOX[LMKGTBC9<86?@@64F?4?JJBCOQTTOJVXGQ^H5GPSXJ:HNFGAIIMM:GR[OHUOOQIMNKFTZUSQRVO[WX\VX`he]Kg-,c_ae_[\cglg\mPNC:M`WMTNbJNRZX]S^_QL`XQl{=LU}]}|gTTS\NQUQRKMSSKPSHfxj~a[UNUK.'17&5;?B7H59>CRPMHIWQONOFONHQNB4JGFADJVPAIA=?JT@CM04IACMOH6DUSUKZSJH@CRQRSKMD;FMPCBQE5?G83E>QXPRICQRTJLCKGCQTOLU@QTLDAFOD77BH@>N<>M8

CTVRWQSRSSKIPUSKFLIRLMPNKKPXZRV\LJQK1IHQRSW]ZUT`ZRNGO^XRQMANLEFOIOSW68A9F>;6=?4:=PBKO DMQXUJANXPPFHYE:DPB@J>=I:LFH-'2-GSQ\@BDNJQC;EMC;WZ\TN2,0IWRIDTTSAHVQRHKYX\KKVPMd]NKXTZPMBD>8DK?LLH:BYa@B]ZAOSZLFEV[]_PKTRRWaZ\UYegVPh.1e^adeYWbfli`kWB36JgVZY?eLN^_]TG\^VTYY\vp3Bdo`gJ[WTRJMUWUNNHTUPJuz`NQ~uKUMRFD802=6DGCFM)16OPPO=JLBMEBLOL?LQWQILDLFESH@EKJ;:LFSSO?@LKNPI@ONETMOLUXTNSTKQRJSMVUENOTOMOQNFV\WL`WQWQIIPHNU7XZY]`TSPT^Y[UBQFXUE\HDNTcE98?Z@=7HO:<>LCQNTPHLSLWUQN?LWQGFYHDMRHLPABGDSCC3==C=M@S=DMKWTKCAJ8?IRcYBH@HSYMJRHUQGSTXWCHZP\STHQTZWYXS\ZLAJRGCLGFDRGCDK\FIhI>J][NDH[]OWOH]RN`ZY_WSTaPNZ0.jccmkulmjNs|nt^txvfWXq`T[p~p]Yk`nS|~nVP^xuxY~iK~gRY_pc]cSO1)BRmrog5HZSRQOEKNN[i~{n`Y=C:sek|ydLXs{jIGtpMGPJ6GN:@VOLSK@QNYUZMRH?J]WREWV?IM@H=C:=M44KEX]SQRPH]YVUPMSPTVYUR\ZYM\\A=?7BWFOTUWQWFD^\YWOS\\ZOKO_[YTTRd[K]AMGV78DNQUHF??MK:;3JK=NPKFSQIJXSU>DMVJWMIORFT;FSSRSIG>LKVT\VPDVFGRIS`]LW^Q^QNK]RMaYQNMMWS[JPWQPigrUXdVXYT[\ZLFRWTaafbIWa[wkVNWjWPYLQ\bOQMIOB:388MD5:DC87C=P\ZVFWQX^]O[D>QX:ANE_ISOJ\KQY^]EOTHW]SXTXVCJY]U\UMR@S``E@@POSSJX\^aMLZdUSRGSN[WO@SP[ZIF`CN>DJJPSPLVH@X\bPUJ>NIYTYWaVYHBQU0._`dY~gdayvy|plfKDWjnRh{Wch_zPT\N[dneZo[UoTZFkg_RRcgZ[^wo_MPxdYRbRBFeS^x`9ZvnVJX`U|Y[YOTR^~rNZKW{OQly`FNDe{nQP\ax|GSXVRUTYOZ]bdaPQ?[`E^`P?TIGMQOKM;CZE<7=@8>@SNAORVRAB^ZS]QPTWMMZU\Y`SWWZaFTNEPSTKHE:ENNS^REIVDDPLQYfSHSO\FEG]IK]PNDRO]QMIWTTM`mmM_cVQQZ\TQQKLYP`^f^IT`cwaRX^iZHFM\cZK\INJ>A>15JJ0DE=577GW\_[FFOV[^OLMMJ];;RE[ISP;P9D@HRGJMCVXPID\UP]^OKHYOHUMUOZSKPFTSaSRKHE[cL??NOJSWUVc\RM[YNWOEGJ]^cNAEZSE@`MM<UOLG@;RE>97<6=HKNVHO_]F@\YV]LQTFI\[VYKS]^VQZQG\O>K?E:=CLS>>@AFD3CPG?BAHR?OGFG[X;@P@CIQWE>E9=JLKZV>PS:ALQWN\RP=IOGIBTGJZKQMMQTIHRSW\F^ldH__aORYRS:OJUOXciZIL]fcXR[a`Y>FLI?HGJ[IA:A@769E4CC?488:Q^XTI;EQXVIBU]B}J6HBJCVI=A:@FFLMMCBGTFH<[_O]ZDPMSRBJOMJFHV\C?I_UMIULL\UA7PJHMYXLeWT\PPNORPEFe_\R>BIQ:BRO?GC5GQRPUCDCJVNHQQDHCUNNYWWBHP=C1/f_Samgc`|vituIOMe{so`l~{PWfZ^[NXSW[hpWVRxNO`upPSYRqi]txmH[[]ajPRO`|_Bn~t_IGSjQwxKLYY[LgYYUSHSfo{MWXNsyr\L~YUA6mZBN[afuKZNTW]KW\UFX\^KIPVK[HBJ9X\APPRYMLP@NVULOJPG_[KQSET]J7=E>:?L]>9GG>?@CIF595;@:?G4997:ERTJ@=CQRNEZ^N:J:<@EF>YfRVN@RR_JEKQRIGGMSAK:NWIQF[INWJ4KIQBU_OXV[TKOFRWSP:SUTTCHKI2HV?AQI78MRGRB:JHYILJK=G@IOQTTK:MP7;:&d\N^vu_cc|octuQMJZxwqbdxvePZqOLKVNLVh@GNrlONXe{jLeocn~srNHXRNgjuVMV\ie=f|h[@I[gZUnygFXYgT`X_OOPNOoiNSggfYPiTMG?LrhOB[sUg?LILKMCT`^J@[^IPF`JEYG9;PX<>JE=I9>;8@L589T?DNSJRO^I>QDL]QE=JPKVILFQE6BB4=?L=:@E;=?AFB8IBHFQGJICLA5A9FCOXWDDH>88EEK>=IC;@AVI>E;CDISeC?JXTFHZQCTe^DSXPLEW`SFMFZIJJ^nRILCLRHZgmVQB;C?M^WDU>@58;67:.H8>F1:81;>KUC>D>H59HFERFCFG=8OE=BFMPFNU\<8AN>H;BD89F=5>J99AC;7=>?5F?DDIGE@GH@1>>PA5?FON9yD9?P<67=PNJSH;NB:18M@7;AG8>K?FG??=9AHLYA8LQPdGPL>PWQFgQ@AKQ^IAWJXPDJYbMQJBIHKacT\H@@;?@^WB<]i6/758?43;:96::7;KGG:D@HGMFLSZEFC;6;>>BB@1@EIEOB?F9:>=7FM96:69;A==67:?:9C>CEI@=IGA/>:C>9B=KO;>8<5=?6<48BM>=bX71<247894;0:S@5NLOBIG>2:M<@P<2HGFFP=:KG=FEHJ?GBEARTVKIG87LXA9COP=A@>IN@LGFPcL@WYGNQ>HFQNQNJT\JGUbJPjGCKM;92D`SdQUMPH^HeGVJ;FTIDJU[C:27>HDHMA==77:H<9<9B74APRZLPD37?E@75=8D;9?9229=>:?47:>=@=BHG@CE=>18:@:B>@AADA20=C5;>4:IC=>B=A>875:E<:8::C;>F=7:>6CCJ;<=DTXUL?;;JIF:[WFCBFGIMHKM\ED]GGUJ:KTZnVD@=A;BG;.87215<94/@>IVK9BHGB=?CUSSRC;5;EB?>J:=9@LU=IVSDSJL>LNAER_jZ@AJgTL@>F>NB=@L>=>>==;KKD`VCl]7RRP=5.Ahd^ji`HXR=CBTOJMT\MC??MC=ERNsKJ?]ITlX^jiKOFLEFBCB?UV`]F8-8@:BKH>7::8><3857FB:NPLD@4UKQQ58CMMI:9?QSYOK=;:=KNC::5C>6>>109:<7N6;::@C6CHE?9=10>?>L<F>FA5-6AB;:>85D@@A<>==770AN?;67>J99:;?783D@>D>=?MP`J;;>?J?9JcEG=AJFF?HFZI?UFDI??KYbPTG<<;AOPIG/B9::313352868207;PPC2DO8A;G@>68F:;<>8=2E@@A09EHDC77@LC8C=ARILHI?>68<=;<:7<;CF;MIMI?CAHIMDB=?EL9EG8L?215BSL835A;8F@79D=DHL8A?:LDEF@?<7/}.:CCKOOB7=>@@D>@;==><<@B>?F[HKMKaO;G@ID=;FKH?8KMXNFA;C98GB?:/;B:>?627576>6=69@C49DE;5B??1.>;;N??}D66164?EB768:556=9INW@:;9CEC2SR?:EMJAL9DI=98GCNRc528=6.09227@904303J99RDG7A8AD@4@49E=:7;4A9JC19ADF84=:OPCDAC>D@:2E8D@1296@F028>H6D>:5C@;CJ;7;8MB H@E2}վ@CCVKGNBPZD6@GJA=OEIFEV@JG@47<8>BB96;=<;CKA>@C57592949=76:BH5:26C/9?=>=;7-78B>;?=,?54;F?8>318>F;@=:4GB<6GI=;ERXG>:7;B@@FC?9@NEFFEITE;:A=JLR924?423=1-7:36322/47HdK<6?8>@?6A75DL28=396G?2;D>4<@GE;B@8HHC6?=875=?75?66<:;AEMD<>;:PVC?<:>A@C277=C13C6=17:5@G>6:>2?F:@B@468MC@DH;% c|Ӿ&'5((&+;1""*'&$((+,(+%'%%'+%&(!#"#"&("%#"*-%&#!#"!/1''%)(.%/'')20("+.)$!"6+'7)&)$+)&,"#+#"'%%#,;:1 &.$#39$"+,*)& %'&)$")## &%0,%"()&11/1%##%&$"#)!!$#$ '# #&%!'&46$"/.%()/)&#++"#(,,+&&+&'" %"#$$&!!"$ #( #"$)'+#!#&& "% &$%!&'(#r !#$)%(!!%#$!&!"! ",$ "#(#!)&$$ )+"!,##''40)"#&!%&((&$#&1)#%+/*)+$&%(.%"!" ! !25.& %#'" #)"&!$%#"$% ##"#)'+& (% $&"%%"!#+,$$!%,&'!%%#"#'#!"#"#%)(&'&%#0,(%)$"&$&"#)'&% "$&," % !)%%$&&!'() e m ,£B.%*H   &*-r ȿ ۔ٚ۷   Ғсҗ ǿճ  „*  Q˚   ~y<     3͈  8 #)*'!  &*+(  ")*(#  #ָ  1DQZ]][UL<) /JY]][P4%9LW]^]ZQE2 K@2   )J`edY:4[e[+5Tde`J) ؽ=     *SeYNYea?.ZeeYNYe?<_eNeS* Hф          Ke<1_e_4(TeeT TeY+e7Ne93]eeB                  Tc\bde _a31WbeYe\( 'ReeYY<`ee_1NeL - pч,tS ~Ż=  !         Edd%%d1%ebG?EGF>,&Jdee< %_eM39EGFJ]ee7y  = 3 - d¾  7  7½   ]º   `  Y "$''()+-,.-/0.--0.0-/-.//-/.-,-, )()&Pľy   t  +2 - bbVk D G Žg   ^  A `   -+c"$&()(++.-.1010/10/011011//1.100-/-+)'#$  o  ú2- ^t;)"(@y   | x  G#  d Z  h "&%(*--/01213121312102210200/00..,**):,  )N  1-  ak07k  J ¾A  X} # N]  "["%&&*,+./00121132424331412121210,,+)'on   5    3 -  `z.# X_   ƾ+  h   ]  %[   !\ !#%')*,.//2345533445533534324213323311/-'+*:4  4  *3 - _*"= ;J  mD  )&  ^  *d  T ` "%&()+-1033245546556566566556445456454401+(ľ-  n 5  S/ - Z>':   r3   5  U  1Y  (\ "$'**..114556767757577577676576 2h*J !!   2  0 -1 [e2?J:  -Lp{R)   O  Wz  ; ^   $Y "$&(*.0134677687878678786886543'#  " !!% N/  G5 -@ Ou/.#!1G@3 )]=   S  Z~ 0 0O ! ! !  `$&*+-.22466778878787876(7B!)~G ! !"!   /  / - Z(v/"%>99, (uE$   *. * W  4'T  ! # $ !#"! ^"%(*-0124668798989898998898 76ts'O u" ##$!"#" E3   / / - T+9C978- +zN2    hu   Y }  / Y !! ! #$!""!a!$%),-114577889989:6680 ):Nr nJ&  7 uP  Py  2+] !!"##&&$&$%$#$";_#%(+/0346698;:@`ʼX:986qX&_i!""%"#$"$" c.   -   S2h:;734590  (yh:   9   M{  4oQ  !#"#'('&%.\$'*-.246789;@x̽~v|X?2 0"&@B!#$#%&&$#&!!}/    - Y So++@64314:3  .]   4   Sy  LO !"&%$%(&%&%%$#'S$&)-0257899^ü!wnz}6H%%"98 ""#$#%&&%#!" 1     -! >Gmgedesxffpg9$?4/,-.392  $e  !!  On  !  Wn   wR #"%#$''&('('%% ?R%(+-13688=̽ƽ{u:*P'%$mZ "##$%'&''#$ 0/  !   !-" !,#"*11ERautV) 7320149>F> ( (^  !""! )  !!"!  Kp  dW !"%$%&()*)('&$D?   B ~&  !"##"7! d[  !""#"!  R p " `U  #$&&'')**+)*))( ET'(,0357Kƾ¸θ]<^v('&%# ) #$$&(()('&%Z0  !!""#"!   !""#-$#)!"/0;- dwixd6 &0*.6?F=   sB  !""#$$#" +   !"#$#"!  Pm  rP $&'*+*,)*)*?S'*-035KŸĵķ¾J8O('&&$nR""$&%&())'(%j/  !!"#"!   !"##$-$0&(185'?PFCF= !";'.4~}P'*-06··B.jq4 @} i !"#$%&%". "##$%%&%$#"J q(#Q"$&%')**--,.-..,-*+4Q(+-2ǵû}61 V?PX>)()(( L"$&')(()&}x~~ , !"#$%&-'*"%$)((  -*$!2(/433.'|||{3&()*,,+**Cvv{y||yyuuyvropuuww{+ !}}H !"$%&'()**+- ,.,--,,+**./..*,$ 00& ( 1!&+194  (,++*#*c ehoqsqrqrtvt rsqstrpsqrt _!#%&()*+*"|~ytsxyy|x}y~zzyyx@29AMV[fowfM3)*Ukfhfdd]km943$Owuuyyx}z|x}z|yzy|zzxn%'**+,-**&||}|}~~||||xurqss( ! d~zyxux||xwxxy+!"$%'()*++,- -,?&(*+,Dlomov^0 " R 6!%)/)   !,RrrmroB,,++*(7FVY_cedee_3 1QVWZWXY^`L!$&()*++,++}z{wwsswwvww{{|z}{{wsvuq)ouul85@KVd[ZcdszS5F~|zy{b1*())*+*)(Cuqosz}}|zwvsqpuv`"#%'()*))()&$#"" "$%&(,.-.02K35546654311yuvsossnknsquuy}}z{|zHCy@<9@A:p7@{ yH=`fI@vx@(&**))*@OJMA()+)*)  ,),+)'3VOI5%!"$%( /=:\{L1211/(7FFMRYZZ. "=[JLQ2 "%')$*+,,&gvrqtusrrnkppurnnpqqruussuxurnj6@5>NPV\_fjlvZ8Arruurrstd9H|{rD,++)Ctqrnrpjf efggilhnnrqrnqns[!#%')*+-.+*)()()*+/0011345657788667554y||y|vrrnplpu8ytqC(er}~M8gzyud6Hj8Gsqsp:8ZY9&),.,.--,5mijllmnonprrwrnmo)!#$%$Xonmpuspsprstsr*!#%')+,-.//0[- 11.3+18Fib`n@6:95++-0:TT@KngaW700/227/!+02217D_uY[f>../22$$cVq@14634 8Ry=6:@FIJH8!++,AX#  #&')*+"aghffefcfehhggkpkmiifcbfAeigi;4;HPW`djoqu<7Raaefkkmpna;GpvY @mnnrrsqtvrrnkmligllhjhhjmV "%')+,-//1/0/0-.-.--.0/14656676:79::87756qtxxtsqnmkih)@;Jlpttqrusqmjggb`ab]`aadgX(*,-./-,+'gsqpplqrprspr* "$%&''&%Tffknmlhhgc&!$&(*,-./001- 2182NalI01120,18Nw{Yc>022117^q_`<011/06?[F E|~XF80103Al]B?;AFHKE?3",-+&.E= "%' (?de`dgijlnJlpqqsqpmmnlmmiieegklmT7:IMQXafqxz|{z{w77Qwqmminlkgg`>HmsyZ"Bpprvr sqtspnkklkkif ilnmnnV #%(*,-.0310/02 34366788:8:8:8987okmliigeeiki,fiiloD8Srx|j=EaddfaV=O}~t[4Gif:<[^X;67866451/20/1Kkkorqtsrqr$sqolpl%*,./--/.+.gkidffkilliieeifb&!#%&'($'Xkkmmoqqrromppqqrnp* #%')+-./012- 201Rr{~|sppu{:(>/Uw~@0112ZZ'.( TN400/V|r$M|}E(@=9""( $!3H4,4;<88CFMG:ORUZY]^_`dejlmjmnnknlieiieeggjnk>9FPPTWV`h-lrxyb:5Iilmrrppmmjkc@HnrygARqtpnppmlgfeggjijjijmnomoopqqZ #%(*,-/0113020013435655798:;;:86gkkjgkomkggijljkoJN{}u{wF4]rpmR1>TPVXRWWY]^]ZZROKE708fgjiidgigkikggkjij29),+-0.-,,'M_cbaeiimmkkllollkgg(!#%'())((Tgefeedgjjmnnqqro)!#%(*,-.0012- 301_gfpqpssTJD(&?%:B0219p)+-  a;100zA#&CxWKR1&"%8lmhieZU(05:>@B@>96 +793GmaG[bmQ,RYSSVY[adfgfiijkhffc!dcaa]aedfI68BD@HLHT^crt}}zQ8;Llpmk!lsmokk`?Mnxi@UljkmkjkfegihfdghjiefhjlW!#&(+,.1.24224212343344554647879:8989<;:;9:97jmpkkjhhcb0][\Z[]Z[]aN?Pkry?4Qefeda_Y;Jtuv}m45gk=.BI@GIGRUZac]__]]XPJ7/_h lpollmmprrpplljT#"*,-.0-,+bjojjmmpmkjlpo+ "$&()*)Qjglkplhhggff(!$&)+-.01223- 41.:`qWNUbZ7+&'(' /kjKL21U8|. \ZO?@200Np %"C^:-&'(''&1FjrUGHI$+0489>AB>:5, @Q=! GG$sfP^LLRVY_behjmnqspoj?mplljhjk`20:9;9CGOX\Zcfu}Z>49Xkmgnjjhkojhjj_AMnuyjAUkjknlljjnjjgdbacc`]]__^acgQ!$')+-/02354553535445545668569a;99;<<;;<<997qqljnnjfeecdegjhgkojjgR;Kjs|E"7fb__][^U'19<6@GGJW^ea[MA0,<]ecgcfgfflnh[GTqr{b@SecfjifcceehefjomjlhlfeV"$'),./22356565757667:9;:;=<>><;=::8ccace`cecfefccfeAEA>LJOIW]^\VQRA2AjjmmnjheceecaaciC3K\RD2/0/0.,&3ea^^`aeihie,!#&(*+,-,,Ujjecc`^__[_cacc(!#&)+-/12345678 - 520(,.1)2-).DXW?0*+,--../.%'8PM5102001/ /210?151-&3IOE0.-.,,*/&"310)+]ehjjmmollgiecgginjf?04BEGKF<7668857667:7977;9:<>?@BBHWYX\aeo11efehiiehgiEjkggjjlmmO07QiyY90`eijfhhgiZ2=YZUZXK*+JccdgI.>C@CKFHISQIEKHJVTPPOPM03cdc`ddedcdeecehedadea`]O19TSVK601..-+#Diifcac__^__`^`aa($!#&(*,,-,,Xfggij(geghd``]\'!$&)+-/123459@J[nw -DM<&*,.27@LKH6.,.//001137AU]Q72 32""02 8524:GcXI310/.)1&4.06=JLJ9.-+)$"&+059>DI;. 53.1'"366$3/369?FLRVWZ_deeb_\`le\$&/5@EIH>:7.'&)/AWec dejegkgiojijiCBajpynQ;7Innjijgeddhhgcfige a]Z\ZX>6;GX4fv{|{xu~vx}~vtzxw}|~e-9][XWYY[\[_bcfefdd`\`J2;P]hit}1`@C9[__cc`_cchW*1GSNSD('>__^]]I)->DFCDNLT^MLK@:BORKGI2-R]_dehljmjjg$daa\^__.0IOOLD:10..+("2aa]aa]]``bffe2$ !$')+,-.--fdedadejjhddebcf c("%'*,4ATcs}/@L!##"K#$++((&#"!"$$%&'(*1$"$&&$$ #& #'-38(, 8k<#'+>S%#),25;?CINQUBW[`[_ib``Y($0/;<3)'7CT`jjgfbbaaeddagccjijlgfell]2,;>BShtO$%&?EJUTQRUbWZeh[O*07;15=fgfgfgfhhfeba``dbbecaamlehokegW*4QMOOQi;9``dbb^a`a^` ^a``^`bcb``^abbc^^dbacbba\++ST`voq}piaieUQ]]_domhhffaXX^hdY4HIP^5ae_]ad`keggaade^ldcearP,6D?ABb`cckb[g][[^a^^adbT@&1IW][acfekcacb`aE/"/SZU_XTN^NK8(:Rfhihab^]aabbcdg c`b^[L>3-JRTPIF>9/*(%4Yba^ZWVSW^-)+((Ueccgk_`^a)^dX6.BS^ahd`qxzsux{{A3@j+ ! ! $&'-(#"   1 *#: ':8 C=6)&'&'/##+& +  ! 2(3)! ' 6 Hm~{UB;0@GGOZUWY[i]^cn]%"/6<10+Yc`__^_\\_`^Z^^[_+]a_^gc]fec_fT/1ADEIZnC*PYZVTWVUX\\``^^__a__^Z]`a``c`cdjed`_\ZZ\XYXSXWT/+UW^ysupsqg`PNS[[YXWUbffid_[djjgb90a]\`c`_b]\_^V\dabYY]fahc\_pnB#+>I@NSMMRCFQA2''#2R[[^YYVVXgV46%;ccdfmqeefeec\D-%+9ENTY]aZY^ajji{|z~{{v53Jx !"#):-(("  7 ).< ) *""@-  F K9#&$-)&*#$?7+*( ,((!aoiD512O]\_\PAEWM;.($%$?R_aa^_qb07TL7(Bd_^gn\Y[[Q@+#4OILLR^_gmla^cep} x~x|z|3Y} !$!!@3'+1'  >" +"/63)# %6"F.05 !Q(!&'(()0., #6GRfx[M[hb&BPXi\yǡl(* ?.# &"<3""A*&/3D-/5+)* &%&%*/)-$%( 4,0#320=)/8<87?E[[YRD.#(%,7!!#),+(*('($3 ,.,-JMTPCOVVgwxgOKKP^aLP\PTRR`k]pc\ZaPAW@ #-6+;++&>4)';G>''+7&)I'J@5%)1OJ&+A'"A0M85-*)),EF&+3) '#&"+(>#%"#$';+%UjbVR]UKSXB1%"*#(9$%"&$&$ %1=" "#&%&)% /-1/ONR[lmi\PGPB;79ELF6)"!3FTbreA7LKC4MXV^jF>6')4>JPXO=FESdirusa_a~~||ur}V3E!2<,B:'#&/ -#>& +(D/6> . ,$#D"K& 1G-#"D]$&$(?-'#28 >@eWD\41mV̧Ϥqeš70 06%+$906D7!;IAKI+$!,)%*:#'*!!."-30,944=57=<5==>CMSMKK5-%$51"#(1:52/--3, 8!"/4#+@]B@98LVX[hr^SZRWbiUFQ\OJEONJSU]CETS}I!05,($";,"&7XK-/',5/P:V&4;.-NO+F& $F9M96)#%.Q=*.(->8# $" #)C%" (%%3G=8`RbgvOBQXJ?/ %)D$, (B)! # " $""',#1,6NYQQT`^gfcFDG<8:9AGNPD=51127AZQ**((]^*"12+$28("-!*/% HWO:B5Q|L|Л^]_2pÈ)7M<:E]9::!><-8@&0[2+QUJNE99GIIJBZJ250=3*D56BGFM?LMODBODDBA?FTM@CA>;5>89,3*DIA87=9,2:;CF:.$#!!&!C,#%% "%%7K84YK6RdVS32NbFFJJFYcd\\c\YghdP[Xkuyycdhgrsmzxsxz|uiqx|utv2=tz/-8BkɿxURD515,E;/$D@*G3"-W1JOQEUNTHYPNMSL*(*5116D6()7/GMK;?OSNGQTAAIF93:?@<:D>E9718JGF4/<1/3<:=VYE329L98GaU8:EL=A?>JIB85A,*5B2O=:9&3>8IVVgodmogn`aO?RPL@7MU3$')<1F/K3,0$$-,'25),.-C>.JJWb`VXYceY\UD>SZ\^YRB;AMQU[WQUlXZcogegly|uPTqonjmkb^W^p]S[e_]db_aitwwqnpvnkmtxrtyvz68t%1L?2055HB9>48;633CCHEZ;J2=.63J\poZxrsn\g[D_J]>6IVW6$+0>K>I;+3)$$,4',60/*3BA=E<7K`[f`e`aRDVSPX\_eYVPB:K_SQX`va`gqozrYl|ossrsu{POWYfWXa^[bdpxpnkvljxmnomqkszp{32z@MH;58nN6=4^DD++ -KGRM?M]2.6_c2 "MKE:VL_b,'6I6%Z?@3BLH4VfL]J?$'M,/NGEO-23G+1TJXkdszjx^468tzQ~}vx\ATz{zdRD66:=2!=::QT4*C_hWNZP_Xc[G5Q?49328A:D58>RHIYYUY\GFTJNEONJPVVRA;<61LG=88;:115@JFSKK:6;K=))'$.6+#38%'=P7B?*&)>P:<Q;:[:Y_N@MRJ\`LS]PPd`WVK=MNg_\Y]_cM`hx\B;>J`>.0DUbQ:1=[j<,ETEOcS_EU8KxQ?=J5`}Y07MoPTB>E7PJICRWBKYFMOL3M1(=@;G+"3@"!=BFMPO=>CGSTWRTRERFSUQBNKOWTQP>4>BDRA@'>7209LQKXIG?8EN@0(*(?E1#<6&2@O8*KF04IEGKO>?^>KmcBGSUn\QUUQCacUWZHETZrei`XY`ijX5HPQ_A?/RkiRC(@hr>>BRRpdYgdUQirQHIS^|}Q,FqRQM=A=DbB6>DRL8EW[IOLKPbOT]^RFWR>]]Ofprd\aG^\h9H`[`@D@c9AdG=/-,,1)?8.$/9>UHa=8L9=>B=Aab>^XS_>AMUV^aVO\a_O]_otWaitwmyaZfc[a]ZVormiHUfVZmW]`rjdrnxxgfefrr}yiglmjnnw}{o22zq^G2-f /WTBL?$*O*X;^#>9[kaCRLYAD)7jCiA4.JI:7\YUZ-.D1X92j)8,V\ZLFT23XK1TP*0M-I$""D )*2H3G[4I?)>:*'('D;!.$+=CJ9lXUI>C=-6O&=)>VL@8Xl`Qkm@WUVUMk\XcBWWEGHMMNC97>ATUTTPWBRTSYZGIGVQMR>/6:BQ_@GD<@9:59QTFBAF;:BA4F<)$TN3*;<'+EQ<1=GX6W>VG[?A^GTpfTLXjPFNUK[EhqKVcA?\YhxiecWlh{yj5-_OWNS]WTmd=)DowLF+Y]{y]XicZsvk{Q\^[znJ9kJR_:;JHQYGW\^ZRRaKSbZZcQOTRDAL:8E:GY_@BIFJ;?:FX_A7HSCLBL_VI^5bITgW`z][UicMOEPNUTloR^jKDUTj}rsqi_t}rfN=VV`[nl@XfiX8Vewe<=drpxnI\ri{ZeaO\nytZ_mL:QR;I_C@eVEHPGYihJXPKYEUgXJXnPAkjYinnyul]bkr[eZkmfMS^C_kS[UUW;>l7//CE317<:ZOhBD\SO=JkeNGGaoIKHQbRM^fdab`\QLKooaaot~c[j\`lh[c[i\gX^r^R]\xpdb_usj~ga[[\cz^quqmbmnbmrqu39ewiAkM(d[Cgm;aHAmY(2rWEaekZYlqhlmPPU5xy>bhAFNpcbq[em?QcQb@oWRTOp`R!<`^)[fJH_C -HQSICJWPO!"+ PF\_cZ.iCL``Z:T@HBNZKQ?5@UKoZQgeU'@bXQCG:@NWdW^jp}lmcl^dkexshXLDZHFCZbZRDL`eg`cVMkYTee^aWY\JHHTCELE]igVQ-&To565VO19?`RYSO._c]UCe^eobiySP_jeWR^VROja]r[eTQRdltzv|idvnnVTVQP_gJGhbXhXbSzh<_fsqqdMkrv{ay^Ppmtriy`4A[IRkX>Tn[bZVUyweZ]U\aYUlCJjgIZ`iZltt|fhrhrjOgattoAUaad]jaUVQNEKOG?3FM6>LIDXYjCKw[CBct[LKNujV^dxi\hdledkfk`\VtvXXaxf^ebiol]Zm^ciPrq`jf`qghbYi}sgdUSVphe|mouehkjt}z~{1>f}~pQp'^IZ_O{YpPeXU&DufQq={h8qzolpwgWiqGQ_cMelpi^^rsVffzNb^acmjf`W VWgLo]ZbbI&>YO]2=;T_bJ&G0bGv{}V=]VUqvvwY]OY-;oT^g=ZEnoMZe3\kcYTXAO[\gersx|ghpvqqprqoUNBdSIVkj]QVg^mfQdjWdcamkgghmZK_Y[>DTVfljSEKI_`O_`eaH3OcQR[GhZCJZhpRIeialgmuUZhhn_`k[[ctbTv`dZGFkUs}zdhnru_]gPOdouLRuednq]JxlUkwqx[dgxswftswkrr|wqMB^_]vzopv`V\bO`]cm_NZhZ]fBf_eqs]lapxrtckvznebcdvpq`ehaAfqjmgXL@QMTMGP^VJMGX\TbBkkXL\tX[FKhpocYn|jesecjlh\tdYjtc\Lgrh_krns\Zsje{ggyf_nYYt\b_dvwhsiUV`bferoyjkvq|vz/?gzy`9h?*dqnmgbGB]S<;hne\yTtpL_~oqcoxW}hY7vgkvys`fnN^dskt^ppu@MyQ,o8]ut[\g\O7YZZR2MQ7]fG7AG.$=cQm~pxdD`q^s{x\E$0jXqjt`qT=WhUr_QbT\U\[usugw{w`sjk|jo[]^k\N[lm\^baedPJ`redjcnosuvnZIU_ZQPY\d]lKX]]Zki]^cZLIOpU6YAGMQUXjs_6?[O?HcUpTE^Wkrffd_cojrhnhnThtXeaikeh\sq[bNNkFdzfktvnchc?eqkhdlsjleukXtpdrxx\tutef~svppV~{qSjpYyvqohmZ`d^ksw[bqXFaaiOcbaTiqgisuwnjmovr_bproryqvoW6cnos^TQCIQdn]beUL]TN^Z_e`Vba}d8SC_mVra_u{fgkkckrbggXtne]fsynaojohs[stzi[wtX]idWsZXswnjvt`dzzWhdjtuwvzjxt0=tvPqC/[z}~cZl9XW^WJaj{Ri{TukMylwovtui|diBrjiy}ioh{t:cpitrivxd4DpGOXdss`]X_`Wh`:OId;.TeG-TL>4RR-erEWhcTrxN';i_jQ}j`HHLbtbkWKfNdda_vmpgq|uZvxao~}dofhm`OamukfU]gV@MdpplmkxyqwwgaTTc`aYgbd_hiihWHfiidNNkSCwK5aIVDW`Eod_>;aY>NkjhkN`_turxX}fwjrqijnfengjhtcethqvZgN]j[\~t~uzoT`jNtujcjuljjatphovw}~vxnrxx}r|yxyxtr~toUqt{s_shdoWb]yxkngimcVhgd^njMemzogj|uqmnwz}xa]wzlrsn~gie^]jl]qdPPJSvodj\lvZYh]zlCTsrygONaj@Duffspgsll_kumt|j`ylh^vdtqmw`og{xytjuWcq`[ieg[zgkxy~ogmuouhbpvklyypzsx1?^b?Vyn|p]HigjS|{\h\iuh~xxguy~y~oxpjwv~|jwqraWNfTi4awfkgiT.bYS@5OYDGU[T\fQ6vrwv[qq_vnKDFkccZ{fkNLZ^XpylmEAicgbcXcamptpou}u\t|yjn^Tljdde|iZIqO\NYenttngw|roumh_enmfkiYkklshhUW\MfkYRpYZvLGnIXRbTkg`D\Y_`^Ocqjo]fjvvmtfVnwivmjpqwglqqzdbhqgmqdtdOcd]zyy~uiogmsxxjfiopjiptrspt}vx{`lca|x~vy~}vwnuxwyylqs`nXVSc|kngdgfidel`do]bjpxpcnrvvllrn{|eTlustgddacb`benYlbmU:C]xtkjkhYnXhodWVvetcbdxD>Ciwymi{wr_^vrmstzuuffylal_p{yxogp[QuWdblcgtobl{|hll|s}rrt{tsw{st7>zagb_soeaRXcyssynqv{u}nivmXg|ðr}xssfkbocjw_Fbj[LWiFDHM1L^\YMcOhad{{vvtwcvsi}^Llgcdboq`i[QZnzdgpAKjchhfcU^kmrju{rl\kvvz|rmdYtqvactcTZeTNeWtsx|ujx|ueuoumduuiir]rtpia^ndUUaqhYr[ir\YtG_`n]_d`Xbll\fSdrs_]nowvfve]iwmskirn`bhsyx]\oplli_sxhf\_v|ywsrskuxxb_hk{loxypqnr{pjfzGrl|~t|uw}opyyvq_idZbultmudmjholkjdh^mkztufqwsnjj}vhsrzxpnmpggbheYoXlvambhCAW@[}zV]avptlU\r\T{kmuqMDJe{pbotp\kzkvhl~}fu|okeitqbfdPgtVfgjesaXvuyxykwyttoy~{{w7A{x}g{pjl[>Uhxwdl|in~uqK[x~vzxicXpv}ZyciKaY]UZKEXOLgd]ag>WUx{}}YZwvuj{ywpiceW[ujmg^ext]P^omtgbeGVj]]niijWgpomxx`lt_l~r{xjmnpfckO^qMRkgpzu{ypzpzyumuuqfruxrxt\Zte\f\lmuhgpqk\q^_m_DSjleZuqemjlrtk_kuzstsOm`awrnstVUjfvyqbjtsqlfarlculm}v|lmwurxwmcqnyspvwnqr{pxyne}myv{{}x,{arjtp[|eoos~donpzgoqnnlqpwr}hp}|slktn{ntxuqoxrkqilivalnjo\XQeY\YzntOafvws_dsO^lev[i^jszjctxrnax}s}diu{`nxryyz[hog^xoqlzmjnbhuk|pv{gyvr~|}}w}zz:CšîwlūϻwàyǢâƪì~fhluysxP;\zQ{`m|s[bPjhhvpskMks^_tomtg]spyy~w{t_m|udkulpclTdpNLpm|ww~x}~{vv}yjfjhusuidq}vtuvqgkdo1DMnqkdat~sow~xoerxx|zzcm}ko}aezgzwlwx|plclnhk{~v~v{|wx{{mzs{wxyroys}|v}ukyuyr`mrf}}}rxojsspvuwwtyhrx~{wuvqw}ptx|prroxpyemnorUVnUf}z~ipSxr{~mtrv|{fdsmsw\}up|q|qqmtnx~fgziXxoikopr}notexqgzvtiywp~wm|vvy:HɱȯoĴŴɺʃ͚Ǽ˶ǢƬy`Lqċ´Mtszul{~sxuke~|z_wtdzup}vrkm[e^ge[}runzeyhrwufs}}vvvoi{\KHS~v}tduyu~xzjqzv|purp}wvtpsryojptwq}{y~}wz|yxwuzu}zvcrl~lrzvoltsw{t~}yt{}u~vyyz|~{qjyolps~ymjnrxsighawy~ptzv~}ozvrvdzzjzcr{{|rsdnuhvyhsz[xx~ksqw}zjwzst{qr}:HÍƺstn͓pƻЛÆɿȝɎyȮw~uxauưyrzn|z|}x}otixs`{}w`vqv{xoqceaZj}i~ysx|x{zrwtz{vvu`xesrxvtwuzq`_Po}wsuk~szytcnxqwov|p~~xumsi}~{htrtmz~vzzz{xvus}}yp|u~t|xvw||vsyytsnq{~tszuvquyytxolxipmu|ujmnjxmnuqu}no{r|u~}zuss~~vpxlksxxwrweftivosumvv}wr|r~yt;IþzhȎwþʱïî÷ŕɭ¨{}zff|[yuÒ~vÍ}qxg|v}y|z}v|ugpy{v~dtp}|xzyhnwopae]]g^~npxnr~u~~t}}szula|qpmol{pvvxdlW^~x}monwzn|r_o~mvrxhqsonoofz~x}~tfypiuourzzww}y}x|vuq{~zz}~|}}ss|tox{qwtqq~qq{uruv}}vq|sx}iq|gqx{oo|jklr{xnrexyy{}|xux|vxz|||x~lizuwszykswvyluzo{}m|omsy~xo~y}uv~w;Jɕƴǒû{ƫŢÚǩɲ~xu}Šcrvwxfa}~{z}y}~l~wjzf}v}}`ymrzx}zibvrtfdW^hjwixspqzy{}}}~y~tv~tpvttoseyrrh|lgemwwvjmyito~}uZm{pslthc}yqzu{pjlqkszsq~fl{fgpow}txl||~xu}zv{uwnw|{|y}ls}zqxwzutqvstrv|uwxlrtwx{io~xk^zs{mtids~opwgnonx{leiw{zqp~{zwvnolwhou~o}xrpwkml}p~~ovxsy}{gw{woz~y|~}|s}tur|tt>HĜĻy½ǥƅ˷ğv}mrx|tyy{|rbxzw~y|{j}uo{xf}xxwZkixu|}dbggri`Vatfyj|jzx~m}x|yuzruu|zsnutlqivqrq{ohjut{snuo~tqs|zvsXiu~tom^y{ywttwyl_rsqyyw~wbnt_cposv~kohn}{{owxpyl|vn~v~||}}t}{qnqsnprxluttrqxx{ymlpsvvxxwkqvztq}u{rljkklgrvdkmjtsfhnrxsm|rxzxyplwy{{lun}xvx}~zwqw|pjm}e|}~xhtx~wyy~l{kzzr|~~q|{|tfvv{|iqqJ<ŽÖº~yƏy}²~ʪĽmų{{hf~~vt|~|ư~ØywqnxqtvuqqputhywowlgfZ~jbsxkzahc]pu^Xndw}vw|go|{mg{yv~t|vuo~|sozusunprmniuotlpvqdp|voqutvwkuunnTmosoad~vvsxuv|q[wowntohkl`csnmhgomgvv~ywitqrmppzulo|x|{}{{~gzynckhx}ntxvuurtxuvowqirvyx}npqtxuzsvvljhll`ophagf~gksynjxtlztsr{sywt}p}xovuunqu|vrqtyss|t~yjw||~qonyqr|}iyhu|po}~pwfmv~p|qnz~ng H`+Ͽƥ~Ϟdz}|ģz|řzĻ3̖ȱtuq}}nµzk{}p}xyunnkusrb{s~ox^~cYm~qrjhphdkmZor[^sldtx}{zlhwq`i~nxptx~rprpoqwjismpqqmn|kobmu{hg{tjkpqrmkoqklWhkoaaflorvook^ns~yqxckfc]e{m]ahyeixxzytilomygiqtsitv}zpp{xtdu~sohbgo|kmsswsu{vuvvwqtsvzxutnqorrrzsruujkjkqeajsajcsekulner|nr|ytpxwsqltzo{n}|zotvrs|xwusxvswuwhzxe{lwow{yu~mo|~ml~|eloq|x~xtzpx~ppvku{~}qioqzsXԩ~xȬɽÚ}wƘ|y|{~‡Ǭīm{ufrauvzt{~thzrqÓznz~zzonmeguqzqahWdkfwgfmYlpp_rnW_paisk{xn^i~ws~atx}fvrmvswqyslliusbhpmssfjutcnqsyjghpsfksqmmktqnlZ`jqebfexzlnwojooeogptwfxq`rda_gjg`cbs^rtpwnhktsmclouymzvp}swnvqtp}xrjw|trtief`o{liuqxpt{rpsxvwptrpzkktkkrxnzyxmttwknsld{`kyfqaxcqvirvi|mgxttk}owtutstkuo{}wv}wsmywwqurmrwvrhq^~p{nwuurxomwvorydlp{~un}ov||zj~fn|{yu`yfpu00&5}nw}|yqyvnuƠuyu}v}qr||z}|n|u}}r|v}pqw~ypkcngsstru}m~twwk{x{s{ozykoxwhaYdr}rncdUfrnngpraomnigxS]majlivz|}z]a{}l^ezrwkksl|}mmqkefqtscoiqsihxwhsqpjpgguwr`urlknssoiZ[kn^gg2iqslsndyzfk{efqirtlgui\c^]lijbe_qqs}qjrtgqxviamozysIqlz|ovvsoyvtsxwmzqnoraspfbusihtqrhsypsvxvulwyoylhmijyxnysghturpnrtetbeyckaiaqwlmsdvlhyrouwirtysmoeoru}w}olsvxvxungxxzqfgsy~ltqltlntivsu{ifwks~~~||{fzmn{yreoxikcuHyS|}}z}x|xuorn{ruyurvryyzsysxxs|yuv|zok1}ngxerohdl~n|vwq}ppn~njtz{tvyrqxsvmiUf{zmu~g]XcpxbjgqknikscsX\d\gwsow{xvjXtyv^^s~xnccj~ulbpplsx{xhfnogfsqnjtlf}botzubbzjcnppksZZqf`ugl}mpddk}lmyiZvpvrimia]dZfwgnfa^nqsknwomcmrrtcek|qxnptvzdw|pqtnoz|ovpsypr~cilf{ump[mmkrmvlduxsxsuvtonmychgsvvjxwcIfilqtmttgmf[rlb`bgnvslhetpotrpzqfirtmklkllu|trstsrvxnxwxwggyusokjXtssqp2i{kpqmyxji|{}lqp~~z||jplmzyqpfvjd!#}<awpyz}zv|}ozkzxkuojxxykzsopvylujzt~|zvqyjqvty~zxtazwgufzpjvclvpqwvpqaruvwgjvvpg{{uytn}rnwzuxzugSiompus_Shamejilhc_msdh^[Ygqkppovvsi_tswjo]e}~i[`hw{xpejxrnrwxnjjkbiuqrrokdq`rqzwkZnqcoivkq]aj_bpg&ifle_ir{rprlhWn}|pcqeX\e^juemda^l{mnmnkm@qmrdactsonjr~~|_}lw~kb~|xnymkzvhluzmcdnqtvbZgtmmpofuwzyw{xyltcjcmwsfuqgjrpgnknzsnhj]dpb`_jiqrkjnejvnztq}kqqkqpslhqity|vcsutpyquv}ssassqwptn[kixzyrol\}qcsjtrcgwy|fvwtp{~yyyl~xnsfwi" }վ'0tyzxyr|}ovu}wj}|unyrslgsyvvhorvvlkqxlklz{xvul}zbo}qsvsrtnbl}{xlmtt`o{lenndq{v[hnsqv~sulvpntjjp^o{nwpytjnpepprkxvwzk`Yhdkos`Qo\flkmgh^`koi`g\Wasshghsz~b]tllkwhikve`dguwyyslpoqmlrxrlhg^lqsrxk_ea]vkl_qiqmgliZckblacjb]jniw~hkvrc\v}yifmaQhebipjjiZ\gkwlfhqokzqomgbcitoowko|jbzmouyxbrtvupskgxthmrqw~dfehpwwfa^wqmnqltsywjwwuvuzuadmcgspfictzhthfsspdnh]kk``khkhtccgpnyyrupuuekptphnknx{n_qsrmtwwrpxtsjes|uzin^^fwnnlcZk||f{intdkmtpj{r|m}y}sulphw}wspe@j|Ӿ5%3?JHFFKUQGCHED>DLMICFEE>>DFJFI><@BI@AFLK@@F@7>?GDAITRUGEBALRJGIKDOUQU>>;9B;BC<1@@5AACBA77AL7=379>CF;@DCGF@AA;BDFCFF8>9;DJEF>C=:CEG:C?7IFBDIB=:IF??F@72C@=A@A@B9979@;AA@@BKCD@@==@=GDFFDNN>:MD>GCVUGDNB8EIIAB>ADH>=@GJMJC==>@I?>:=BAAB=DFDHG>FCDGV F>9=<>;FC@BF8>>88F<<@JIA>;EFDGD@FDAA>DGH@?>AFFG;FFGCFEGDBFFGH:BHHC>A9:>JMF@FA=>EJ?D*F=ABFJ@LNGFAFRNGIRKLPKFAC>?JG2+p u% :¦O@6+'%%'',)&%#%%&('&&%#$%&%'('#.'%&&''$#)$%&')'&&(&&$&)&%))(&#%''*(#')#(&$''(($#'&('$&&%&!#$%'#&-+$')+'&&)')&' *"%%##&#&*)'$&'()''+*(()&(++$##%#["%&$!$##!"$#%!!#"% %&*##%!$###!&'$#&#$'&('%#&&'%#%$#$##$$'##$##'%$$#&$%$#&$$#"!"!$$$%&'$%'('$#'&'$#$###&$"#"#$" "%$%!"$$#&#!#%!$%(&&'$#$#$&''0+'8$((+&$'%#&'%$'&%##"$'$$&$'(&(#&'('((&&#%'))((*($#&#$#$#'(B(&(*'&(&%&%*%%$$'&&$$&&%$#$&&'#$(%(&'&''&%#(('%%&(''&'('&%%&'&#')& !)('&'$##$(&$#&'#%'#'*%(++'#$+*)+))*)%!&'(('8 TeY+e7Ne93]eeB         Rb[bde _a31WbeYe\( 'ReeYY<`ee_1NeL - pч,tS ~Ż <              Dcb$$c1%ebG?EGF>,&Jdee< %_eM39EGFJ]ee7y  = 3 - d¾  7  7½   ]º  `  X !!"$$&%(&('&&('(&(&'((&('& $##! Oľx   t  +2 - b\Pg D G Žg   ^  A _  ,b !"##%%'&()())())*)(*))') '('&%%$"#  o  ú2- ^q4#":y   | x  G#  d Z  &g! #$'&()())*+*,*+*,*+*)++*)+))())'(&%$#:*  )N  1-  ah)2k  J ¾A  X}  N]   "Z!!$%%'(*)*+**,+,+,*,*+*+*+*)'&%#"o m   5    3 -  `y+ T_   ƾ+  h   ]  %Z  ["#%&(()++,--,-,-,+,++,,+,,**('"%$8  4  *3 - _*"= :J  mD  )&  ^  *d / _ "$%'**+,+- .--.-..-..--.-.-,**%"ľ,  n 5  S/ - Z;': :C  o@  `  Z  O\ 4 ]!#$%)*,,-,-/././././././--+"-#kU   1 4  x8 - TK'!K>  r3   5  U  1Y  (Z"$$((**,.-././/././/.//././. +f$H'  2  0 -1 [e-;J:  -Lp{R)   O  Wz  ;^   $W !#$()+,-.//.0/0/0/0/0/00.-#=   M/  G5 -@ Ou +',F@3 )]=   S  Z~  0O   _!$%'(++..01/10101101/10011/1/00.#4?#}G     /  / - Z(w/#=99, (uE$   *. * W  4'S  !"  ] #%'*+,-//10212020202210210 sr"N u !!" ! E3   / / - T+:C978- +zN2    hu   Y }  / Y    !"!   `!#''++-/012025:6680 ):Nr nJ&  7 uP  Py  2+\  !""$$#$"#"!! ;]!$%(+,./011338YŴP3210pW!^i "!""!"! c.   -   S2i 7;734590  (yh:   9   M{  4oQ  "!"%&%$#.Z "%'),./12239rŶunpQ8, -!>B!"!#$$#"$  }/    - Y Sp+ )?64314:3  .]   4   Sy  LO  !$#$&$#$##"!'R !$'*,./122Xʿ!wndnx2G! 97 !#"#$$#" 1     -! CEmhfeetxgclg9!>4/,-.392  $e  !!  On  !  Wn   wR "!$"#%&%&%## ?Q #&(+-/026Ƿ}xqi6%N" lY !!"#%$%%"# //  !   !-" !-"(13HVexsR)6320149>F> ( (^  !""! )  !!"!  Kp  dW  !$#$%&'()'&%$#D?   B ~&  !"##"7! d[  !""#"!  R p 1 _U "#%%&&'(()'(''&&%ES"$&*,.0E¸ȲW8\u#"!! (!"##&%'&%%$Z0  !!""#"!   !""#-$#)!"02=/ fyj{e6 &1*.6?F=   sB  !""#$$#" +   !"#$#"!  Pm  rP #%&() *'(''?R"%'+-/GþF5M#"!! n Q "$&('&&$j/  !!"#"!   !"##$-$0&( 297(?PFCF= !#<'.43##"!S "#%%&%&&$%r1  !"#"!  !"##$-%0'%&885'BLLNG'  C%)-?+07@JB J  !"##$$%%$#;{ !"#$%$ #"!Mr)_O"$%''()*++*+**+)''>~}N#%(+0{w>+hp08D$#,  "#%'&k 0  !"#$$%-&1'/.1#=KHJ6  >C))0$,2 @} i !"#$%&%". "##$%%&%$#"J q'#Q!$%%&())++*,+,,*+((4P#&(.Įü{t|u3.RSvy{r18YZZXWT8)+*` }{||{{|["$&()(g .+n.!"#$%&'(()- *)()+ ,!%)071  !#$#"!)z}yxwy|zyw{{vspA!#$&'(())**))($t}}wy{~{~}}N18BR]Y, "$%&'(()) () ('&%I~{  {yx` !"#$$#"" !#$&(),,-./01. +{}}y}}{{y~yC}{{~{K(~}XBi}~]8DdZ^c^YQ,,+!+?~~~{{y{x $%((*))((U~}}~~{{wwurqu(j{~}{u( !"#%&'(())*- +*)(& ) #% L&+#&*184  "$$%$$#")sqsoopttwxxvxuzyz{tsnmllnnorovw`!#$&'()*);}}|}}yyuuw{|}|i,-;IT\hmI)$$%&'() %Psr"()*)('&J{{|{{yvy|}|b !#$$%&%%$"  !%&'**-../01011//0--,yywuuy{yHvyy|{|||LG{}{?F}|HAcjgioic`9--)%|||{2$&'(*)Cvv{y||yyuuyvropuuww{+ !}}H !"$%&'()**+- , .,--,,++*,-)+& 01' '* 0!&+194  (('**)(!*c ehoqsqrqrtvt rsqstrpsqrt _!#%&()*+*"|~ytsxyy|x}y~zzyyx=-4&(*+,=X\Y\bQ0!"# L 7!%)/)   !,G^]Y^[;,,++*(7FVY_cedeecF#^k\WZWXY^`L!$&()*++,++}z{wwsswwvww{{|z}{{wsvuq)ouul32=HTaYXbbrxR5F}|zy{b0*())*+*)(Cuqosz}}|zwvsqpuv`"#%'()*))((&$#"" !"W$%&(*,,-.010133233231/.yuvsossnknsquuy}}z{|zGAu=96>?7}m6?{yH<^dH:0.0-'(nssnnswvuppoko&$')*+*)h|y|}{{7|zz}}- !!"!! \sqqoloosoqqu{{}||,!#%&()*+,,-- .7)/../=aeafb<0  K)!%)+&    %1?]ibi_8/.1/-*/JPUX\`df`, LOieUUXX[_P!#&()+,*_}~~yy|ztsokkhfjiijoqu\x|~f;>ZK8986764/*% )qnqquurprqrwzxwxxzO&'))*+)Dninqpsqssuxxyyzxtsu*!"!b|zyy}|yz}, !#%'(*+,--.- //.;+-275211EjkhlhA4 ]) # "1:Zlhk`L87710-*6DIOS[^_;K:G[gUGKMP@!$&(*+,--,)osvxwwzwz|@K_lUE !$&()+,,8fcaaejfefilnnstsnoopts\vx}}|i./;DJNU_ilkuxzr88cmlmnmkom]5Bkqsw}uQ1*?kiheiloknoppsuzwvruttpmniikinoW"$&(*+,-.//-.,-+**)+ ,--.0012445\67643511iededdhfhkiimoprppsopoF3Ylrpud4:mmjkZ3Hz|L2VeilX5=RG0Alpnihifeggjlkmrttvtrturv{xw>%'*+,,++*4mijllmnonprrwrnmo)!#$%$Xonmpuspsprstsr*!#%')+,-.//0- 11/5,4;HkeXcA:=<8,+-0:VV>AZXUN82102270 ",24217EYhOKV=/0143%%gRd?1685667:T|=6:@FIJIB3-8>@GGLdh&  #&')*+"aghffefcfehhggkpkmiifcbfAeigi905AGNW\_dfiw}z}}u3/Oaaefjjmpn`6Agkw{}{U @mnnrrsqtvrrnkmligllhjhhjmV "% ')+,-//0/0//-.--..-//00135445657675422qtxxtsqnmkih?lmqF4Rlztz{J6\qssxe6Emrwpu~x|q42quxvH3JWK1@?A@>??><:;;)<7Ilpttqrusqmjggb`ab]`aadgX&(*+,.,+*%gsqpplqrprspr* "$%&''&%Tffknmlhhgc&!$&(*,-./001- 2184QeoK04d2-3;Pz[[=144329@WF +47A_v^Y;133129A\I H[I:2325Ep`C?;AFHKEEA-/addfaT5>ailqhgh^J*Bif35OQM2..11211/0,*-,*-Ikkorqtsrqr$sqolpl$)*,-,,-,*.gkidffkilliieeifb&!#%&'($'Xkkmmoqqrromppqqrnp* #%')+-./012- 203Tvyvv{<()d0X{C0234^\(0) WO322/Xv%PG()*)=~|qjeZT,29=A>@>@4*8>@@9<<DFMIGWSUZY]^_`dejlmjmnnknliCeiieeggjnj50;AACFCLUVUY^ccnrQ1-Filmrrpnlmjka9@cehtzZ9QqtpnppmlgfeggjijjijmnomoopqqZ #%(*,-/0112010101324544656778898776653gkkjgkomkggijljkoH:L_bhlu|t56ao%mi\3@hkqwkioc;+ZrpmN(3D>CFBHILPQQMQJGD>1)1fgjiidgigkikggkjij28'*+,.-,++'M_cbaeiimmkkllollkgg(!#%'())((Tgefeedgjjmnnqqro)!#%(*,-.0012- 302ckkuwwyxULF)'?%@B@>AB>::6 .CK>4JuU1rcObWMRVY_behjmnqspojl;jhjk^)&-./,58@HKGNS_jN5,2Uklgkjjhkljhjj]7B`a`goy}zzxT4Okjknlljjnjjgdbacc`]]__^acgQ!$')+-/023453434565689889::9W764qqljnnjfeecdegjhgkojjgM1=T\agkr=3fb__][^S4@dfedaim@,Nsppa#$<<743.69?DJJGCDBEE5'Ld`__][]``ddgjkklqttrpll4*:2,-.,+)/njlnpnnjjhjhk hkj- #%')*+ Xnqljgdgdggeghlnj) "%'*,./12334- 52+(9B301620,'(+783/4XYAAKM6.)+-3438XrO@JO$0Fl^CEQK4.+:411/9U_B?A'+50/''*5:4/0=D1,*)"(,38@DFEDC<6! )89.#/UmHVod/Y^GJLORQSV\^acdeijlm7',/(0778EPVPMA8+(8\ebfcceffjlhW;G`_dkqxV8NecfjifcceehefjomjlhlfeV"$'),./2235656565689;:<<:9:875ccace`cecfefccfe/.-.,,*+#"211**9JK=1100/.*&"&)-48<@DE;  ')!2OIJN]]TAXW<=@DINTX[^cehieihgBijQ" ,19;=>IEFHF7'!%/Tggddgdacaadigkll^BCXanx|~s85\ehjjmmollgiecgginjf8(-:>AD?86557756 76679787798:<<=>>CNONRWYa+*efehehgijgj?lmmJ',CZhruzz~xR4+`eijfhhgiY,7NNKOKA%'HccdgG*9<8:A=>?HF>:@==IGDPCD?'*bdc`ddedcdeecehedadea`]N,4LKNG4.0.-+)#Ciifcac__^__`^`aa( !#&(*,,-,,Xfggij(geghd``]\'!$&)+-/123458=DP]epz|xx -@E9&*,.149BA?4.,.//001136;IOG52 32"02 74247AVL@110/.%-%2.037AB@5.-+)$"&+059>DH9G52\U?NLGGUXYGF0369?FLRVWZ_deeb^\_cecZ!#+1<>?B831*&%'-AVec dehdffgiljijc98PW^cpukhedS<-+Bnnjijgeddhhgcfige a]Z\ZW8/3=L4Xdmqnmkghjjenqoffktskb`eknhfmsrprw}~{peeaeM"0][XWYWZ\[G_bcecfdd`\`E&,=HROV^`bK7<2[__cc`_cchV'+>IDI=#":_^^]]I'+=>?<+&Q]_dehljmjjg$daa\^__()>DDEB;00--*(!1aa]aa]]``bffe2 !$')+,-.--fdedadejjhddebcf c("%'*,3=KTbint} /6D "# "&'$$#""!#% &(()4::=3+*+/ (+* ,2**+89I7.&%$$"$5&&$"%&%&#"#"  &,2:AII#G*  + A[DCFUTRG=,036;AHLSX[^\[_`^]]a_^\^B'.283*$"->UmkkjjiegcdfdcfdfddjY.*;?Ui[5#%:`^accaeacceac`__aaed`cecdaef<,/,2/0=Wtuo_UYS`WEXjmrroqie[]`deNLfkorqqnbD103=8* #9eefdadb/"*2;;7%&PZZYX[^_^][]aa^^]._ceeb@'.BMD?@=1/.-*( )`efkkjnnlligc`D !$')+-.&_abcghkl$hgga.!#&-AYow| 4AK !   3 ,  6*# "!  "# #'-38(D'  6kQEHGR]D3$),25;?CINQUBWYZ[_a^``X" ,+56,$"4AR_jjgfbbaaeddaeccgfiigddihX' % $:S`90@Scab`a`baa_adedaa`__bdde`_bbcbce\H7#.#$(K_U>300816BOF[`P>115IjmI5!BB>1:V][]]_b`_cfbbP"#,#"$"Gbbffgcce`0"(3<@ELTQCLE:J=961' 3hbd`^bbdi eadY/+4EYWH5730.-+("Pigddc_[YWUQ"%#'*+-..Vaa`a`c`cbd#`=#1;Oiqqzxki`PUb 3@I  "/    !   * 12 /#!#"#&! !!&& ##  Q9   JpX-TqME+(-494=CJPVVZWYX\[Z:V[,# +.3-)KVVZY\\[[WVZ\\YZZYc_aefjgjknpmZ"!*->7=U0?[b_[Y\_abadcabbcaba^[^^\[\Z[^^\WB$59#(.2H[I;Ve_PD81,?i]:4Ldd\YK90A''$V^\[]_[_\^aa^b^abb^a^\I))184.-5AYba+^bggdda_K$! 5SY[Z\XZZY\\YA$ $8?QLPFD=BG?8 !#"4dfedgijjghfbabcd]1/.3TTK=@51.,('".Ycaca c\,$)+,'S^`^ab^a%Z:!.ANVVdjnrv{}ypqneaI?KRRPO0@Y% ! ! " "  $ 90 &01$&!""&%!"&( ) &%P* )>,#~}qmoC8:=>BB>EMWQL,6BN^ac^]`b`aa``aacb^cb!`bG&,4,/8b`cca^[\Z[[^a^^adaM6)DW][a`cedaacb^]A(%BLJROOHOCB/!4Pfhggab^]aabbccg c`b^[H5)$=FED@B=8.*(%3Yba^ZWVS UX-)+'(Uece_`^a)^aX6)9FMLPMFUZXe}z]J[UJG>?BGEGGA,+rfP& ! !-"#&$ "   # ". #1 ; 31%!"("#'" . ,'1&  1 fuL/=ANX\WP.&O]\_``^`]\][VXYZZYY\`_a]\\_\=!-4.4cc`aa``^[[X(WVVWVF::[[\`cc_a`]^^ZVVUVYYV"%02ARVZM?6#Zbd][ZY[ZYZXVW\ac`_`a`_`[Z\^^:$9LE;>H;BOA/'&#2R[[^YYVVW_U35$;ccdfgidefeec\D* '05CJKLJ>;::D><_fc^RHXLENICFJICE>3,7uZ !! #.&##!   & #4  %7#  = =3!"$&%#%#%  97*&-#/!+&($+0*4yL22:BOIKSWXZY]_fD'.>1!9^Z'Y[``\_]^\`^_\^c]^c_b_`cb`L&!01EN Q`^_a__^^a^^[YVVWWURRTTSVW[Z]_ba_]^^\\SA(-4KGBJIP[eYQ9+ '66'-041/JU^^S[[L-,A`_]a8[YY]^Y[`]\_a__[[]\]_[7$2*/__b_^[YVTRPSRRSY[\I.?addebb^_]\Z^^_[%38*/:M\KLC-,=URPS\UYY[^_a_df_h[WUSQQRRSSN7#4CPMRQF;ATJ9.'$$$?R_aa^_ha*.LB1#?d_^ac\Y[[Q@+ .@>:7DRRX\YB9:8FTyzqeHEJKLLTGCJEKGCW,HxU "$! 2*#%("  + "&0&! "+?&+/  B&!#$$('+  CT^fsyrqy3),&XƫI/ 2%!,'1#$+)*")'&$"$&$!'*-! %(!& "(==7-  '  !   "%4?F>1?H>M]^O2$'.:?++3-1,(9C9SGFII5,9, &!./%$)$"3+("61'%/&$)) -$$$'1%GWWE<@7?OS:'""2!"#"# ".9  !!#%&*(C@DMaa_VKCL?847BHA/%!3ETaha8-@>:,FXVX^E>6'&/6AFE6!&+;PU]^R935WhEKJRLFFAGGA=KGJ3,.kq\!3>,4." !'  (* "$7.-5H# '"$=A! (? +##@O$"!!#$2'$2. .Y`wzsD>lv̹ϵxsMC '-#+")6.$13:8$%&#&, " ! !&(##'#  #).(&& #!!,'"  %  %+>1-$"7CAFSZB32-2?M4#)50)'1+%07?"#36S0 # +#4, 6#5!%2/)) /$2%%" 0"#!"#,:0'JEMPZ5%9LG3#$8#!' &=$$%#.ALBAFSS^a^CAA85?<>=>=62-))*-7LE6;B=A*:89G)#'))0:?CKQO6--.-+:YaaU102\cXpaGDJF:Na95]{^$}Шs\e7Í5=K@CF]@I1+.!(+(D$7C@;4-,7>AGAO;-4*'D'-*4'-.3)'.('%""/($$#$"+.$%!"#( +"4$+:&CJDPT;*440)>I1$!)47("(.A2(029F9GF?AEJE6:BF@T>9,";UN+,8?>EP<:"!&3&,23! %+%09F3-:P6!)*-E)2F56 %D* 9?7)-")4QNMJ: ,$)2=620*KLL9;AE=r*$dΣygdZIsɾmNMA/G-M,' /,/&"*C*@DGFLKSJSGIHDB" . !+0.!$/4/+40!# !%'#++#!*&-" -((#*/"),73..$%/159N9&(&%(!E>5'))$-)0, B56HE! "6<,!7$ (!35D*4$68=+(#,0MH129?9 !94'+#"!**#''1#!!)94ENL\[bc`dcZ[B8IG9*"4A!!);-2*G1+,# "%%02!#&$53%:?JOLGIHSQCUS?4HMHJIH@=>GJJMIDGUFLS[\UW[hcf]4:[jrlj_HA@GP6+0:97<5138BHBC<:?F=PN69AC??CT@A,A[R .D>>@CTBBI*"+*"*276/?1 '0-0>><:I/CK>1*C1.V-5:9$&/L^YNF1,% FICE600=HIV[TdhgbA14MǷv=33%  8(*D7IEHBKITSSOA8*&*",((68-,./2(.*/%# ")+#!$4&$!$ %#''!)%&)/6$)' 2$;0";5$!0!".$'F;=/.#'(5.(5+30/85QH!;.!)!?1*0;>)&M6<4%.3KP?''#/GB$:-'#&$3-&/&,'2%2"&)AR^]Wd`cZX[F30A%.8F$#.:<+@7*/("%(")3#%(.1-68+&1>IWII<HO;E+I[T4@?97:RD98D03'$62.D31""$38BC9=G3-,FT(;A;8L?MC$/=0%R7/,9?9-HZGM?9"=',D@?E..3'B9?TZbvfVXRuW7(0,%.*.<<"4JMJHJGPOUJ0#6'"#"&"8,-<;::7)&/(, *.&).1,%! -&!+)+')/% #1()(5##/89=0-+"17&-9-/C496((*839;9:8)8=O@. *?%'8K/ "7B$14$*Q94A'7$5OK-$!,8N5 ,B+0!%)%$"33#+4'/-*,$6 ,+#&;"$5MNWaedW]]CD?K".B=M9**AI05D'0-(%"%/ 560;65"-+10BOIIA&(?78=EOI??GQIKFKN]^[WZRNVYVLF/8QY=c~t^aT;5;<7+,/A118:A:267?=0;<&'&CG>/$420(=BPF";7(CI$'+@3AAL2>, '<(&252<%"2:.+6HSdhjttziDGHXiztpt{|vxvni_`]hnmkpooj]VL:*%54=83D1>DKU?IKQN9C2/9+*#!%,01%)669284%/*32/#,..33/.#!$&/ ""!!+/-2%(#)0'!( ) #0+/!/0-..!":".PH!(//G9.//3#A61>6+(26=;L>419<8P.6N;4+-,,2*10'*38BBR,"0,.1PQ0=91; ,5;DIC6?BC8DOY]ENPOPIU8/@=5;76;[VFE&3A3:=.35F;5A>?E73BVCLB57:=;C=AJVH?{,OLTF:5)$J%=:-60!8$=,;/+FNL7B6>48%+N7W4,&53-/E=>@'#1$K.+_"($?HJ>5C'*D3)B=$(<&9$3",0:1?Q8#)B>/>5"+,77$(!K^Z^[cdgcc]VRK=("2B<82GUMEQWHRFA:-D63;%67&'(),.% "685539"/576:**)5206#/9'$!#-.$!!+ &%-".0&)$1"#+>;)9,<#"9+5NH9.:A0$)1%<%IC(;8 759IH>:2B=GILD36/3=24M@ ,FI/447HJ73H?;KI@I,7:6NPC)A,:?!".'.7*"(- 7..1:'2 /B(&-JA+<;0CD?SPUBM^]TXLZSJIFR??WE B@E3*--,0260-"$0JAY@*.#0(3?&)&8@:# 6&7:7/12/,)7XW@BIBJT<<4@C2;85,18A-,;+6*H@79;@;A8C63,/3NC6MC-5B64>BNGK7F,!HAZA@?-J& -2/E2)E>"C!17='NQPO@9,E8X/PB..3@6=EDA:.G5'S#KH(9,K_B+E9/@37:@3%4<(9&&.,5  !9::8ER819O2>BKQQSWJHA=DD=;M,"/>+"+;5# 9>C;/2B(.;86>1+-1&%2%$%6; '%' &08",7%. )/#>"+-:$-&(-9:,==-0=9@V??9L@+(!.+54KB,CA'#..>QHMJ?6DKHI+$7@C9GA)=OE6";CGI$;CDLI(>KEL6=M6-=>LK49A,&68!-4!"<4(*/$0D=#91(3'5E-'2L1#CJ6@IKVQF?CR[NUP\RH;FG4LZIN83G5/1/(+.9910042CFT;>C31$'H9)"$9D()%-<,'5?94593*&-OO8/:FY<2?47EB5<4:3@3;J2/<4EH;50C>:G862106O+AID:1>=2=CKL:DP+'9@%%K=IOZO06\FFOUQAJ?HFEHMAC2G_e\eidmxrcPZY@519/2;?G?DNZ\PKDH>@D:MGB2*$6))#6B5.$-@DH@B1*L5.?B59340*36/&'&9GB.$*.!%(14; (<"*"5%02E<8&"=-8:0;@;7#<@A@@IX42ANA52?52.FC8G12B3.@9=51.IL>/<776;5?'EF)4JANK8RZfZN4CIHSQ^L3<>65?AB:ENTCGUD0-NP9,&$I@04:M>1=:B<6==>2/0PO0-6YN;4:7?FE51;1:B*LI7F=6=:@7.;LHG;;,,-F>4KBCG59@9>LLXSKQ*,;ON@X=R%Q:GG;PBQ=F@@"1QI7L+OF/TRQPR[SAKMV7=QR:FGKJILLK@AFi?URQEYUNMBHCL8UD?GH7"0B>A/.2BFE<!4,OAW_fMDXQBWcheQOLO-6XKMHHe\d`ZlzzygR^ZC=;D3;DDJMVUYYFDIIGMC?W?F/&@,(5GF5.1G&'8JG2)1>NS/=CCN;@M=>DE>H7:C//HQJ.;RLI@*KF7@FGJ4@>ONUMBLEC4ENOJI+ :=;NOIEG979;*9M7@B<16<748!?;CHI;I@HLKI6BKJIABEN``XUQKE:WaPKM8*/FIND?FKK@?;EEBJ@VRG@GU><)':GC7/@O?8E76?;;2F60DP?2%EXB?6@HFI33A;;T?@Q=6C0.?-76(,8[;:R:IAK=@E;.6<1CF:+24)$1L=Pek[_]?FNP_ng\P@$RJULbwchF0`v|xveJ\AJOSCALJF9HRNVKI7GG?EOMJ7NJRRS@CMGKHIF2KNG*=F2ISLE>@6??>EHH4@F5*@6?*7?8-GQGBEJHGKICFQRK?AJL}_^[eN=%SSMOH7.'?J[[JOICCI@7=9BHOKQQ[I*7#9H5C42GM89>C;>G49OPL@6EAFAI0BTJR3B.+JIR[A@FE37NR)>P:CFFKFF>ScaQ@A**EbWRXT>_8*GUXSUI?L/JC?91?H^9BT=LI6VZIRMRV`IRKH,\RIKMHUNPG)CZXe]GccI+:W:BCMQTIH@FE>KE-:8G)!:B4%<=4&=@ DYeig9GPB;XbjeH &MCIBjz^L54?N]kxlNV:5J=GGJLPKIEELP7OM8ITXTP?MEAH<)9GG=A45A3 .@KQHLAUPCHH>9/8B:76D;:5@=>>2"99E='->3*N&A-9&74+K=B L:$-FKL?/;AVUKK.2:FP=PSB=GFJPCGDQDHS8BL7J)?C5GBWG8B;FcLIXRXWH>C>VP=HYS`XL;?G##F9;IE7D?C;?LABJ>7VFC4O9DCBM5EH<5)I+3+8CEQSMFB4F?-F@;*99JE=,8ZJJ:BLSQGG@7MR:NNCDPUCMTOX?>LN@DI=LE-<=@PMGQTMDHP>CUOOFKNOSUOROSDGLLOMKL:GT=DSKKFMPLLONMFIMKJNIFO=C-//=OEL=<7=>C?967H42AFJE=LILPMKHTCRV@1JQPL@BFBAL?97G7RDV?#(AZSYWIHCG3DOLKERTbVUSR& "AOHLTF>ELDIZGNVUQUfqNBY+)[Yfk_JKYHCLQcEIA9DMNWS@UQTP]^SP\XYPTP^vt9PcqVngL[OXgkR\oCSHWSS^K;y[{jbfj^DI?@HJ4236-:BHACE?VVXfdclckjakiVg_[niWN\RRYOSgZNNF9EY\LOS06KJGCDB7BIIHGORLJ5DNKMSJG?1HIH9>F;-1B2+<4QHR]RBRVHCGBGIGPNE?E7HJG;A=E:*35G:7K7>F15P'9@L@1==;=NVBD)5ZQ97HPQLFJQ<8ESBDCDRP@?IUXR84EOOBE=HR<:5DQMHMRLHPJQ>RLM;;SP[UVZWWHDHJMNP@=PM,OLNMLRPPKLNOLRHFO*GQA>96=HGOOJ>@>=HA><QAR>D%"2!>[\a86;GAKN9FQAAb^YXJ*$":RM;DSDE4RVA&?IGDPL1JPgfdlYObdb_ehc\X]XVSbUYZIPha^UTVZ]`PMN6BO>AKGAHAEFIJKN?HK:DSVSLTMAEDFA?E/8J+-K@GSOT`VK]cSPLJPGMSQF>IPLKPJ23M?5=0>KB',9KC8WZLG8@PTA?;\N?GNP;6IJTYS89JRNKC=NUDADGB>FHSO;MVYRJEXNFPCESWMKTTJMJB;S;HSIO55097<9QIO)7ALTPP=AM2AOWiV:E?:HXlo~g9fwljifSYf\q|vdYRS~l]RcwegXXQ8TQ;EMLKSK?IFMKRQTO=DVWQL]Q?CLAG;H7;J*)LKUXQ\__Vkm\[STVRY\UNMVRJCSW?4:NTN71=RQLLD9AIYSUWQIM>CiY=C`V>I[KS^[JR\PNBQLEUDGAE:;8=;5ZkgT\]_]wye][YaacfNHYRRJ?UWM;@R]WK/:PZMUI<9;a[;,)3DEaLGadK>UbMIBKTRVkVG}^hVERTRMQQRUZVTWVeKKMLSLXY`UMY`QW^R[XQIcNS`YQbhcij\WCSXVPYY`RaYf]ZQNWYWTWUZN]`]aY[VcTGQXY?UUFIR@QEJBCE;PH7MUQONRV\^NQYMQNX\XFMLPGJLPZOP@?ALRI86<9Q^EKYECXQRY`SDQSWV^cWELMGARZK7SSLMWS@M9ISTVWLO^]Z?H]EVV_5IH:NQ1WHKM;HYYVHJNP:P^Z]X\RVN?AKUXYmIMX[CY^HI\.0kgda]cb`pvFVpC6{bgNYosQbZKXsgZ\V]duobk\{ïe_UWd}ymZppYR]sfk_^uaMVUmuhNht^Ydjpoael__NZ]Rji\n\xr\|Xb]_bdRSWZZX]KNDMUJSceXBSG\ML:MKGQLED9C92?I;WiWHZZLW|{_ZQTfbaTKQ]SGDSUTUKSAD>R23ASJXHA9G_H496MD:UNUWgJI[NdTIXWgLIINtLTLQI^Q[`JEJNTVSX`ZKQ\QYZQRZSH\PRcdQRc`[eeVHXXWPYVTI\_`Y[PARXXTNTTD`][YXbH\^JGRMTQSMM@@M?BPC;JW>9SKQPQX`dXXLUOXT[[\DBZ\>NGK[IZ@?CBOB;AIMRKKVaCQYANY^\EEUMS_TTMKKJ@QRMTQMNGVXKGCEUNJTLNZc`:B`W[[UBV7HYTCZ@RO@@`XZYHPMF?]]\^\XUSBKIESdZL]YbJS[CHT00mkd^fag~bbylbT>DmX\Y^xNPkblLN_Z\\c{qZ^k{ch\}cd]SSwszvauwVRV}iWTXUB?eallAlbTYbtiue^_TPcoW]CW[M_VJSLp_`myYdX_ceLOY\VW[RCHGNOK`_XCZ@CPORKO?DMGB6?83<3KbNEAX[GP|Z`ZMZ`QJZQV]QARTS^JLO58T?87B?NM9;@CA;*AIFDUG>PJ?:PJROR[dfYhNJOVZe]NRQU`BIX:OGSF=H=B?>RNAE=URSOJWJLY[SO>SON\T[FJNNMNOGRLOACOUXMLGLK@LRM[\[QFNVWaQFKAPVXLL:[KxxXNZgm[mdgUKQk{ZYeNE}INSPFBp{gS`krXhWcc\JT]NNXWTCBJHRKLZS?]F?HQOPIC9MIC::32<:I\]>DRcGNuYaZYQILVZTXVHLQHOXOJTD8J@;;:E>>HNDSTPRda^`K?BWe`TF_fKMW?B>@@RG><8LTDU_PHEL_VQ\YS^M>HBCNHBGTYERT>D;*lfVns^n^h{WLmgQPHKacdgcbucXIMjTEAPONQzpNPLxY\dfm|a^gvlM_wlDWnyqMP[dvl@frZ`KPW[YSor^EWidom^UNPQGes[S_a}QFcxTV?BPibSASqd{BSRSXPBYXULCRQ>KAMFF[P>:VX?8II>L<963CF23;J;STJIODtX?0NH5<CBCAFRRLGSIFAEVUPM:?IFMZED@O[PGEJBL[ZNTOQLCYdXUSKXHQFP[KHG:ReOUO]Z?F>HGLVH;NKHF>@G5GAINFQNGKHKVTNEFOGJZMVeSYLKEB?:7=7B@8775F9CCDCBK;?KVTMKIPSI;NMPD@RJBIGCGEOKC=ELJMMHD=LKNW`?M]R=DHWTMJ@@DAT^=:HOGF@>?A?;<4@F54==@ORHBYMSP?aTOcU:DdN7KTPZTD?6>A:@B::7:3?G46:365O<@A9;?8;87GE:3JC>EABFMD>95PTJ>6?B@UA0:A\ZWaG;==<@EKDCDHSGHDEFKUO;:KCBQ<@LCOU>JJAPVRMZYNDGQfQMZJVQDIK]KR>=GVGNJKWDE?MKESODFQUMBIMCCGIPJTVb"VMJD8==6>:59<580<B=DB=EMSFCRKQF?YKF=NHBDECJBIFII>KMIIGFABG@UlD8TFE9JWFJJH?>UIHMC<>=:KRAIH4 ԧ\_KVu}`ETY{\IWJggY_TLZ]x]aKFs`{WOCAQj{DSdLFU~PIQ\tlzLN\gryrf^ZujQH]ifUZI[g^_E=fgD;MVr`Up^O_apqGBQZovgOB[DKaJLdTS^dJ\GDQNJPDLILFEDT[>AHCR?5C@9K=6BBB:[6IZH=6C>;G=86=ZOJQCBD6;PF@;QPaM}IE:=E95O68?9=-<9EA=FM=H9LKEGAD@IK;>CDDHJF@HDHIBPKICAFD>EEHdT3OGD;HRAADH9=KGCHKL7?DRLT\LMOCO`=SZR\@]G;MHD<::B4PO7HE&XVQ7Q^EL]^IBWAP[LF@PEOE;FTVLCIPENQ`TPZLK^GBP]DSLERLcVYHDQVUHLSGVW@AOM3AEHQHTI\cLVoXFOBMP@HN\EUJDE:HHQ^TBDSR^oE=SMpTfGTI:BUC>KRRDC??CXC3=I;A>?G>>DCC]LH;>@58<8@8+53597=88;;5;?B9709<588<=1<=8DA=HD@>;#5CN;H4==?@>=49::LO;ETECJBA;>C?1A88@44/87C@=FG9A9?OL?>=G@F?GA?L48AA>ERQ9>FGJGFOTKA>E@KH9VZ;CMG=ER@7CAC=8;AHLS=8KSOP\S=K\KYSUTL_TAA9?AB@78><=D@C@F@;C\S<9@`FJB=LOKE9>OVKC=COKOYMPXIFNBEGBNI@AXMRYeT>JR]H=YOLZN=RL9?<@HWURlvTiMCKBSCEPGZLB?=H?=I]]MEDTL[sxWggyXPHDDBCHA>VPUSBA=AK@8?NE:46FB5A?H<>=?I5G4-60@OK@ANGRB.]I>??AFVHB<;7WQFAC==49=AH9+25848929587:S883=949987/AD9;;BMD9D>3:@AKBEA>>FGE=IMFA4DB@A98HM9PDD@:ENQDHWQOHYSAFACH]D=O>AEHHUW<:D5@8BL:58IAE@BT>>88@A8015<>i:6GABFO=D<9<>A?@;H;8>E;AMH;AEDHIHBP?=>:VP6<>:AD=ASIKSSAGBT]FO[QJa[:>6SxB9;@L@K@7EKG;<M:H7AIGU=FaW?NIHO8HSKOV?C;D<6IBISIUlbHBELF]=>KDWX5>AEE=AQPJ;DHHR[l`OdlJ9>@=KJB=IQQMMNB@=GB>ABA;589A8>AD:;78C5<9/18DH?@>TR;7;@=DBAHD=>57=EH1-485<<315=98@;738:3:<94.:I>A8=?@9A=47:A<=;4@;57<:E9B@CF89;8A@FADE7@LJIECEE=8E<7E@2DF>JD=M;5:HB>148:;K?=RUMRUSTX>E<:8FDB>K;@J=5@<<@>E3738=/05<4=?7;B@AG?BAEB9@>D?>>A>:>E9G@69C;FKH@JISG=4AHFI@EK.>?<*TQ?7;7@94CCKDI<8BF39FAB=FI678AB>G=6=><>=<8PF;=7IZSAJHRPCGT>MA51@FDF<9YNCPX?E;7FPHNE:FG27BGAD83APQ5N@MB9;D=LENJPN;9?G@@B=92<2>?S:5696>=6;4.3DLA975>FB2NB:C?3=CH2:D=O8;AEDE@954;51397036?6/519:<2.7CH:855ED3984==9>180355<956IAID5838B>ECKB85DFDDEAJC6L;;@E79DA>=J;9FEGGPT@=H[_YNJ3@D><6A93F?9=ED@aV449>BB@AB6?B<4749EF>>TQKNSVNfG9=F5>BB?J=?HI4C65>;C4543652;;477J=eB>EGC>@:@@;>B<:6;@?E>15A>=BGFEHNF@68MS@J@F00:FP:;96/:NJ9E6=98;8HYG9NIJ:T`U>U]S`N49>=C=44:=A'_|Ӿ%#4,%#(4'.'$ & ,'#$((" '%((%  "%"%"*,$ %.%/2.,/2))2&-+" +%/+&#,,)/0&(%#!,,+4#%$#&&-)'%%(( &%+,&(-.0&- .5$#&(\(*)$",$*(%)#%+#(&)-0%%'%25+1#&&%%')#( ()("" !%%# ()+# "%% /+ +,"(!%,()+"%)-*%#%"#" #%!$#%)/"#&#' $ &&#%! " %%(/% "")&+*)(& %&%*'*(!+#)%*($"&()*"*/+*1/( &>61+2&"&%% %+"#%)/./! %)%'('$$# #%,!.&2,.25.66,%!% &%'%%+&}#"# ##%" #& "(#$'$(('+&#,(%%(% !#"#)&%&(##*('(,('&,1'#'* !+-% #&%&, '(&"!&#(-&43+(&&=6&2?-.7+# "'%! c l )=¢<,!:J%9! &$, $,r ο ۔ٚټ                                 $(+-.../././0.0..//0./././/0/0/0/0/0/0./0.0.//010 1/00.//00/0/0/ .0.0/.//0/0/00/.00/. /./.././.0./././. -,*&!  $.8@EIKLLLMLMLMLMLMLMLMLMLM LNLMNNLMMNLMNMMNMOM NMMNNOOMOMNMMNMOMOOMNMNNMNMNMNMLMLLMLML MLLMMLMMLML JGB;2(   .={ G4%  "4e <*"6@+ 2w=&  )G66M)'B4  .{=" 4C' 7̇G* :чJ,!;҇L-"<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<҇L."<ԇL."<܇L."<܇L."<܇L."<܇L."<܇L."<݇L."<އL."<܇L."<݇L."<L."<L."<߇L."<L."<L."<L."<L."<݇L."<܇L."<߇L."<L."<L."<L."<L."<L."<L.!;K- 9I+ 6E( 1Ç@%+\8 "=.  0=$#;}.  *A5 ,A7# *; L2"  #0=` C7*   #+27;=?@ABA@@ABCDDEDCBA@@A@@A@@A@ABAB@CCABDBDCDEDDEDEDDGGFGIGHJHHIJKJKKMNOOPMOPPQRPSPSRRQSUTSUSUSSUUSTSRSTTRRSQSQPQPMOMNMKKJKJLJHJIHIGFGGFDDFFDCEBCDBCDACABA@BA@A@ >=94.'  !"$$%%&'&%%&%%'%&&%&%(('(&&()**((*++**-+--,-.-..-.0011213145475889869:;9::9<;: <:;<;:<<:<:;9:9:889756675464334430022/./--,-,,--**)+)+)()(&(&(%&&'%&%&%&% $#"   !"#$"%$#&%''& ('&&'&((&&'(&%&%%&##"$" ""    ?   -   bzflag-2.4.2+ds1/misc/bzbz.pl000077500000000000000000000035351200563112200157070ustar00rootroot00000000000000#!/usr/bin/perl # This is a simple script that uses bzadmin to create a chat gateway between # two bzflag servers. # # Use it like this: # # bzbz.pl @: @: [OPTIONS] # # The options will be given to both bzadmin processes. # use IPC::Open2; # parse the command line $bz1 = $ARGV[0]; $bz2 = $ARGV[1]; $options = join(' ', @ARGV[2 .. $#ARGV]); $callsign1 = '@' . substr($bz1, 0, index($bz1, '@')); $callsign2 = '@' . substr($bz2, 0, index($bz2, '@')); print "Creating a gateway between $bz1 and $bz2...\n"; # start the two bzadmin processes $pid1 = open2(\*RDRFH1, \*WTRFH1, "bzadmin -ui stdboth $bz1 $options"); $pid2 = open2(\*RDRFH2, \*WTRFH2, "bzadmin -ui stdboth $bz2 $options"); while (true) { # check for new data from the servers $rin = $win = $ein = ''; vec($rin, fileno(RDRFH1), 1) = 1; vec($rin, fileno(RDRFH2), 1) = 1; select($rin, $win, $ein, 0.01); # new data from server 1, print it to server 2 if (vec($rin, fileno(RDRFH1), 1) == 1) { sysread RDRFH1, $c, 1; if ($c ne "\n") { $line1 = $line1 . $c; } elsif (substr($line1, 0, length(" $callsign1: ")) eq " $callsign1: ") { $line1 = ""; } else { $line1 = $line1 . $c; syswrite WTRFH2, $line1, length($line1); $line1 = ""; } } # new data from server 2, print it to server 1 if (vec($rin, fileno(RDRFH2), 1) == 1) { sysread RDRFH2, $c, 1; if ($c ne "\n") { $line2 = $line2 . $c; } elsif (substr($line2, 0, length(" $callsign2: ")) eq " $callsign2: ") { $line2 = ""; } else { $line2 = $line2 . $c; syswrite WTRFH1, $line2, length($line2); $line2 = ""; } } } # Local Variables: *** # mode:Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/bzflag.desktop.in000066400000000000000000000003161200563112200176370ustar00rootroot00000000000000[Desktop Entry] Version=0.9.4 Type=Application Encoding=UTF-8 Name=BZFlag TryExec=bzflag Exec=bzflag Categories=Game;ActionGame Icon=@DATADIR@bzflag-48x48.png Comment=A free multiplayer 3D tank battle game bzflag-2.4.2+ds1/misc/bzfquery.php000066400000000000000000000175161200563112200167640ustar00rootroot00000000000000 // php native code by Tim Riker // updated by blast007 // // Copyright (c) 1993-2012 Tim Riker // // This package is free software; you can redistribute it and/or // modify it under the terms of the license found in the file // named COPYING that should have accompanied this file. // // THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // This is a simple script that reports current public servers // and creates links to server stats. //////////////////////////////////// // THIS IS THE FUNCTION YOU RUN // ///////////////////////////////////////////////////////// // // Run this function like this: // $data = bzfquery("someserver.com:5154"); // where 'someserver.com' is the server address and 5154 is the server port. // This will return an array that contains a list of server settings, players, // player scores, and team scores. define("MsgQueryGame", 0x7167); // 'qg' define("MsgQueryPlayers", 0x7170); // 'qp' define("MsgTeamUpdate", 0x7475); // 'tu' define("MsgAddPlayer", 0x6170); // 'ap' $GLOBALS['debug'] = false; function readpacket(&$fp) { $loop = 0; $data = ''; while (strlen($data) < 4 && $loop < 8) { $data .= fread($fp, 4 - strlen($data)); $loop++; } if (strlen($data) != 4) return false; $return = unpack("nlen/ncode", $data); $loop = 0; $data = ''; while (strlen($data) < $return['len'] && $loop < 64) { $data .= fread($fp, $return['len'] - strlen($data)); $loop++; } $return['data'] = $data; return $return; } function bzfquery ($hostport) { list($server['host'], $server['port']) = split(":", $hostport, 2); $protocol = 'tcp'; $get_prot = getprotobyname($protocol); if ($get_prot == -1) { // if nothing found, returns -1 echo 'Invalid Protocol'; return $server; } if (!$server['port']) { $server['port'] = 5154; } elseif (!ctype_digit($server['port'])) { $server['port'] = getservbyname($server['port'], $protocol); } $server['ip'] = gethostbyname($server['host']); $fp = fsockopen($server['host'], $server['port'], $errno, $errstr, 5); if (!$fp) { echo "$errstr ($errno)\n"; return $server; } fwrite($fp, "BZFLAG\r\n\r\n"); $buffer=fread($fp, 9); //var_dump($buffer); if (strlen($buffer) != 9) { echo "not a bzflag server"; return $server; } # parse reply $server += unpack("a4magic/a4protocol/Cid", $buffer); //var_dump($server); if ($server['magic'] != "BZFS") { echo "not a bzflag server\n"; fclose($fp); return $server; } if ($server['protocol'] != '0221') { echo "incompatible version\n"; fclose($fp); return $server; } # MsgQueryGame + MsgQueryPlayers $request = pack("n2", 0, 0x7167); $request .= pack("n2", 0, 0x7170); //var_dump($request); fwrite($fp, $request); $loop = 0; $have = Array(); $have['QueryGame'] = false; $have['QueryPlayers'] = false; $have['TeamUpdate'] = false; $have['AllAddPlayer'] = false; while (in_array(false, $have) && $loop < 64) { $packet = readpacket($fp); if ($GLOBALS['debug']) { echo "Length: " . $packet['len'] . "\n"; echo "Code: " . $packet['code'] . " (" . dechex($packet['code']) . ") [" . chr(hexdec(substr(dechex($packet['code']), 0, 2))) . chr(hexdec(substr(dechex($packet['code']), 2, 2))) . "]\n"; echo "Data: " . $packet['data'] . "\n\n"; } switch($packet['code']) { case MsgQueryGame: $server += unpack("ngameStyle/ngameOptions/nmaxPlayers/nmaxShots/nrogueSize/nredSize/ngreenSize/nblueSize/npurpleSize/nobserverSize/nrogueMax/nredMax/ngreenMax/nblueMax/npurpleMax/nobserverMax/nshakeWins/nshakeTimeout/nmaxPlayerScore/nmaxTeamScore/nmaxTime/ntimeElapsed", $packet['data']); $have['QueryGame'] = true; break; case MsgQueryPlayers: $server += unpack("nnumTotalTeams/nnumPlayers", $packet['data']); unset($server['numTotalTeams']); $have['QueryPlayers'] = true; if ($server['numPlayers'] == 0) $have['AllAddPlayer'] = true; break; case MsgTeamUpdate: $server += unpack("CnumTeams", $packet['data']); $packet['data'] = substr($packet['data'], 1); for ( $team = 0; $team < $server['numTeams']; $team++ ) { $server['team'][$team] = unpack("nnum/nsize/nwon/nlost", $packet['data']); $packet['data'] = substr($packet['data'], 8); } $have['TeamUpdate'] = true; break; case MsgAddPlayer: $player = unpack("Cid/ntype/nteam/nwon/nlost/ntks/a32sign/a128motto", $packet['data']); $server['player'][ $player['id'] ] = $player; if (sizeof($server['player']) >= $server['numPlayers']) $have['AllAddPlayer'] = true; break; } } fclose($fp); return $server; } function bzfdump ($server) { if ($server['protocol'] != '0221') return; $styles = Array('TeamFFA', 'ClassicCTF', 'OpenFFA', 'RabbitChase'); echo $server['host'] . ":" . $server['port'] . " (" . $server['ip'] . ")\n"; echo "gameStyle: ".$styles[$server['gameStyle']]."\n"; echo "gameOptions:"; if ($server['gameOptions'] & 0x0002) echo " flags"; if ($server['gameOptions'] & 0x0008) echo " jumping"; if ($server['gameOptions'] & 0x0010) echo " inertia"; if ($server['gameOptions'] & 0x0020) echo " ricochet"; if ($server['gameOptions'] & 0x0040) echo " shaking"; if ($server['gameOptions'] & 0x0080) echo " antidote"; if ($server['gameOptions'] & 0x0100) echo " handicap"; if ($server['gameOptions'] & 0x0200) echo " no-team-kills"; echo "\n"; echo "maxPlayers: " . $server['maxPlayers'] . "\n"; echo "maxShots: " . $server['maxShots'] . "\n"; echo "team sizes: " . $server['rogueSize'] . " " . $server['redSize'] . " " . $server['greenSize'] . " " . $server['blueSize'] . " " . $server['purpleSize'] . " " . $server['observerSize'] . " (rogue red green blue purple observer)\n"; echo "max sizes: " . $server['rogueMax'] . " " . $server['redMax'] . " " . $server['greenMax'] . " " . $server['blueMax'] . " " . $server['purpleMax'] . " " . $server['observerMax'] . "\n"; if ($server['gameOptions'] & 0x0040) { echo "wins to shake bad flag: " . $server['shakeWins'] . "\n"; echo "time to shake bad flag: " . $server['shakeTimeout'] / 10 . "\n"; } echo "max player score: " . $server['maxPlayerScore'] . "\n"; echo "max team score: " . $server['maxTeamScore'] . "\n"; echo "max time: " . $server['maxTime'] . " seconds\n"; $teamName = array(0=>"Rogue", 1=>"Red", 2=>"Green", 3=>"Blue", 4=>"Purple", 5=>"Observer", 6=>"Rabbit"); for ( $team = 0; $team < $server['numTeams']; $team++ ) { echo $teamName[$team] . " team: " . $server['team'][$team]['size'] . " players, " . "score: " . ($server['team'][$team]['won'] - $server['team'][$team]['lost']) . " (" . $server['team'][$team]['won'] . " wins, " . $server['team'][$team]['lost'] . " losses)\n"; } echo "\n"; $playerType = array(0=>"tank", 1=>"observer", 2=>"robot tank"); for ( $player = 0; $player < $server['numPlayers']; $player++ ) { echo "player " . $server['player'][$player]['sign'] . " (" . $teamName[$server['player'][$player]['team']] . " team) is a " . $playerType[$server['player'][$player]['type']] . ":\n"; echo " score: " . ( $server['player'][$player]['won'] - $server['player'][$player]['lost'] ) . " (" . $server['player'][$player]['won'] . " wins, " . $server['player'][$player]['lost'] . " losses)\n"; echo " " . $server['player'][$player]['motto'] . "\n"; } } # Local Variables: *** # mode:php *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 ?> bzflag-2.4.2+ds1/misc/bzfquery.pl000077500000000000000000000121771200563112200166110ustar00rootroot00000000000000#!/usr/bin/perl # # bzflag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. =pod =head1 NAME bzfquery.pl - Contact a bzflag server and print the game status =head1 SYNOPSIS B I [I] =head1 DESCRIPTION Generate a report to standard output describing the status of a bzflag game. The report includes a player count, team listings, score, and the flags controlling game option and state. =head1 SEE ALSO L, L =cut use Socket; # get arguments: server [port] ($servername,$port) = @ARGV; # handle :port in first arg ($servername,$port) = split(":", $servername) if ($servername =~ /:/); $port = 5154 unless $port; # some socket defines $sockaddr = 'S n a4 x8'; # port to port number ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/; # get server address ($name,$aliases,$type,$len,$serveraddr) = gethostbyname($servername); $server = pack($sockaddr, AF_INET, $port, $serveraddr); # connect die $! unless socket(S, AF_INET, SOCK_STREAM, $proto); die $! unless connect(S, $server); # Send header print S "BZFLAG\r\n\r\n"; # don't buffer select(S); $| = 1; select(STDOUT); # get hello die $! unless sysread(S, $buffer, 9) == 9; # parse reply ($magic,$protocol,$id) = unpack("a4 a4 C", $buffer); # quit if version isn't valid die "not a bzflag server" if ($magic ne "BZFS"); die "incompatible version" if ($protocol ne "0221"); # quit if rejected die "rejected by server" if ($id == 255); # send game request print S pack("n2", 0, 0x7167); my $nbytes = sysread(S, $buffer, 46); if ($nbytes == 12) { # if MsgGameTime rxed ... ignore it my ($len, $code) = unpack("n2", $buffer); $nbytes = sysread(S, $buffer, 46); } if ($nbytes != 46) { die "Error: $nbytes bytes, expecting 46: $^E\n"; } ($len,$code,$style,$options,$maxPlayers,$maxShots, $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize,$obsSize, $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax,$obsMax, $shakeWins,$shakeTimeout, $maxPlayerScore,$maxTeamScore,$maxTime,$timeElapsed) = unpack("n24", $buffer); die $! unless $code == 0x7167; # print info print "style: "; @styles=("TeamFFA", "ClassicCTF", "OpenFFA", "RabbitChase"); print $styles[$style]; print "\n"; print "options:"; print " flags" if $options & 0x0002; print " jumping" if $options & 0x0008; print " inertia" if $options & 0x0010; print " ricochet" if $options & 0x0020; print " shaking" if $options & 0x0040; print " antidote" if $options & 0x0080; print " handicap" if $options & 0x0100; print " no-team-kills" if $options & 0x0200; print "\n"; print "maxPlayers: $maxPlayers\nmaxShots: $maxShots\n"; print "team sizes: $rogueSize $redSize $greenSize $blueSize $purpleSize $obsSize" . " (rogue red green blue purple observer)\n"; print "max sizes: $rogueMax $redMax $greenMax $blueMax $purpleMax $obsMax\n"; if ($options & 0x0040) { print "wins to shake bad flag: $shakeWins\n"; print "time to shake bad flag: " . $shakeTimeout / 10 . "\n"; } print "max player score: $maxPlayerScore\n"; print "max team score: $maxTeamScore\n"; print "max time: " . $maxTime / 10 . "\n"; print "time elapsed: " . $timeElapsed / 10 . "\n\n"; # send players request print S pack("n2", 0, 0x7170); # get number of teams and players we'll be receiving sysread(S, $buffer, 2); die $! unless sysread(S, $buffer, 8) == 8; ($len,$code,$numTotalTeams,$numPlayers) = unpack("n4", $buffer); die $! unless $code == 0x7170; # get the teams (for all except OpenFFA) # TimRiker: MsgTeamUpdate has numTotalTeams but this is how many we will get die $! unless sysread(S, $buffer, 5) == 5; ($len,$code,$numTeams) = unpack("n n C", $buffer); die $! unless $code == 0x7475; @teamName = ("Rogue", "Red", "Green", "Blue", "Purple", "Observer", "Rabbit"); for (1..$numTeams) { die $! unless sysread(S, $buffer, 8) == 8; ($team,$size,$won,$lost) = unpack("n4", $buffer); $score = $won - $lost; print "$teamName[$team] team: $size players, score: $score ($won wins, $lost losses)\n"; } print "\n"; # get the players @playerType = ("tank", "observer", "robot tank"); for (1..$numPlayers) { # one MsgAddPlayer per player $bytesRead = sysread(S, $buffer, 175); while ($bytesRead != 175 && $bytesRead != 0){ $bytesRead += sysread(S, $buffer, 175-$bytesRead) } if ($bytesRead == undef || $bytesRead < 175){ die $!; } ($len,$code,$pID,$type,$team,$won,$lost,$tks,$sign,$motto) = unpack("n2Cn5A32A128", $buffer); die $! unless $code == 0x6170; $score = $won - $lost; print "player $sign ($teamName[$team] team) is a $playerType[$type]:\n"; print " score: $score ($won wins, $lost losses)\n"; print " $motto\n"; } # close socket close(S); # done exit 0; # Local Variables: *** # mode:Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/bzfquery.py000077500000000000000000000224311200563112200166200ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # Inspired from misc/bzfquery.pl # # Author: Frédéric Jolliton [aka FredCods] # # # # This script can be used either as a module, # a CGI or directly from the command line. # # Example of use: # # s = Server( 'bzflag3.tuxee.net' , 45154 ) # game = s.queryGame() # print game[ 'style' ] # teams , players = s.queryPlayers() # print teams.get( 'rogue' ) # print players[ 0 ] # # output the following: # # ['flags', 'jumping', 'ricochet', 'shaking'] # {'score': 0, 'won': 0, 'lost': 0, 'size': 1} # {'lost': 0, 'pId': 0, 'sign': 'FredCods', 'won': 0, 'tks': 0, 'team': 'observer', 'type': 0, 'motto': ''} # # import sys import cgi import os import struct import socket import time import select # # If true, display detailled HTML output when exception occur # enableCgiTb = True # # If true, then allow ?host=&port= on URL # instead of using only defaultHostname and defaultPort. # allowCgiParameters = True # # IMPORTANT: Change value here for CGI # defaultHostname = 'localhost' defaultPort = 5154 # # Default timeout is seconds. # # Set to None for no timeout (not a good idea) # defaultTimeout = 10. # # Throw an exception if timeout occur. # hardTimeout = True class Error( Exception ) : pass def s2n( s ) : return reduce( lambda a , b : 256 * a + ord( b ) , s , 0 ) gameStyles = ['TeamFFA', 'ClassicCTF', 'OpenFFA', 'RabbitChase'] gameOptions = [ ( 'flags' , 0x0002 ) , ( 'jumping' , 0x0008 ) , ( 'inertia' , 0x0010 ) , ( 'ricochet' , 0x0020 ) , ( 'shaking' , 0x0040 ) , ( 'antidote' , 0x0080 ) , ( 'handicap' , 0x0100 ) , ( 'no-team-kills', 0x0200 ) ] teamsName = [ 'rogue' , 'red' , 'green' , 'blue' , 'purple' , 'observer' , 'rabbit' ] playerType = [ 'tank' , 'observer' , 'robot tank' ] def decodeOptions( n ) : flags = [] for option , bit in gameOptions : if n & bit : flags.append( option ) return flags def receive( sock , size , timeout = None ) : '''Receive up to 'size' byte from socket 'sock'. If timeout is not None, wait up to 'timeout' seconds for some answer, returning None if nothing was available in the meantime or throwing an exception according to hardTimeout global setting.''' if timeout is not None : # # First wait that something is available on socket 'sock' # timeLimit = time.time() + timeout while 1 : t = timeLimit - time.time() if t <= 0 : if hardTimeout : raise Error( 'Timeout' ) else : return r , w , x = select.select( [ sock ] , [] , [] , t ) if sock in r : break return sock.recv( size ) class Server : def __init__( self , host = '127.0.0.1' , port = 5154 ) : self.sock = socket.socket( socket.AF_INET , socket.SOCK_STREAM ) self.sock.connect( ( host , port ) ) self.sock.sendall( "BZFLAG\r\n\r\n" ) header = receive( self.sock , 9 , defaultTimeout ) magic , self.protocol , self.id = \ struct.unpack( '4s4sb' , header ) if magic != 'BZFS' : raise Error( 'Not a bzflag server.' ) if self.protocol not in [ '0221' ] : raise Error( 'Not compatible with server.' ) def cmd( self , command ) : if len( command ) != 2 : raise Error( 'Command must be 2 characters long.' ) self.sock.sendall( struct.pack( '>2H' , 0 , s2n( command ) ) ) return self.getResponse( command ) def _getPacket( self ) : pktData = receive( self.sock , 4 , defaultTimeout ) size , code = struct.unpack( '>H2s' , pktData ) data = receive( self.sock , size , defaultTimeout ) return code , data # # If expectedCode is none, we return the first packet that is # not a msgGameTime packet. # # If expectedCode is not none, we return the first packet that # match this code, discarding all other packets. # def getResponse( self , expectedCode ) : timeLimit = time.time() + defaultTimeout code = None while time.time() < timeLimit : code , data = self._getPacket() if code == expectedCode : break else : if code is not None : raise Error( 'Got wrong response code (got %r, expected %r)' \ % ( code , expectedCode ) ) else : raise Error( 'No answer' ) return data def queryGame( self ) : data = self.cmd( 'qg' ) data = struct.unpack( '>22H' , data ) style , options, maxPlayers , maxShots , rogueSize , \ redSize , greenSize , blueSize , purpleSize , obsSize, \ rogueMax , redMax , greenMax , blueMax , purpleMax , obsMax, \ shakeWins , shakeTimeout , maxPlayerScore , maxTeamScore , \ maxTime , elapsedTime \ = data print "Style is %d\n" % style style = gameStyles[style] options = decodeOptions( options ) teams = { 'rogue' : ( rogueSize , rogueMax ) , 'red' : ( redSize , redMax ) , 'green' : ( greenSize , greenMax ) , 'blue' : ( blueSize , blueMax ) , 'purple' : ( purpleSize , purpleMax ) , 'observer' : ( obsSize , obsMax ) , } infos = { 'style' : style , 'options' : options , 'teams' : teams , 'maxPlayerScore' : maxPlayerScore , 'maxTeamScore' : maxTeamScore , 'maxPlayers' : maxPlayers , 'maxShots' : maxShots , 'maxTime' : maxTime / 10 , 'elapsedTime' : elapsedTime / 10 , } if 'shaking' in options : infos[ 'shake' ] = { 'wins' : shakeWins , 'timeout' : shakeTimeout / 10. } return infos def queryPlayers( self ) : data = self.cmd( 'qp' ) data = struct.unpack( '>2H' , data ) numTeams_ , numPlayers = data data = self.getResponse( 'tu' ) numTeams , data = ord( data[ 0 ] ) , data[ 1 : ] #if numTeams != numTeams_ : # raise Error( 'Inconsistency in numTeams (got %d and %d)' \ # % ( numTeams_ , numTeams ) ) teamsInfo = {} for i in range( numTeams ) : teamInfo , data = data[ : 8 ] , data[ 8 : ] team , size , won , lost = struct.unpack( '>4H' , teamInfo ) score = won - lost teamsInfo[ teamsName[ team ] ] = { 'size' : size , 'score' : score , 'won' : won , 'lost' : lost } playersInfo = [] for i in range( numPlayers ) : data = self.getResponse( 'ap' ) pId , type , team , won , lost , tks , sign , motto = \ struct.unpack( '>b5H32s128s' , data ) playerInfo = { 'pId' : pId , 'type' : type , 'team' : teamsName[ team ] , 'score' : won - lost , 'won' : won , 'lost' : lost , 'tks' : tks , 'sign' : sign.rstrip( '\x00' ) , 'motto' : motto.rstrip( '\x00' ) } playersInfo.append( playerInfo ) return teamsInfo , playersInfo def getAndPrintStat( hostname , port ) : s = Server( hostname , port ) game = s.queryGame() if os.environ.has_key( 'QUERY_STRING' ) : print 'Content-Type: text/plain\n' print 'Statistics of the BZFlag server %s (port %s)' % ( hostname , port ) print print '--[ GAME ]' + '-' * 40 print print 'Type:' , game[ 'style' ] print 'Options:' , ' '.join( game[ 'options' ] ) print print 'Max players: %s Max shots: %s' % ( game[ 'maxPlayers' ] , game[ 'maxShots' ] ) print print 'Teams Size Max' print '-' * 20 for team in teamsName : t = game[ 'teams' ].get( team ) if t is not None : print '%-8s %5d %5d' % ( team , t[ 0 ] , t[ 1 ] ) shaking = game.get( 'shake' ) if shaking : print print 'Shaking bad flag: wins: %d, timeout: %g' % ( shaking[ 'wins' ] , shaking[ 'timeout' ] ) print print 'Max player score: %d' % game[ 'maxPlayerScore' ] print 'Max team score: %d' % game[ 'maxTeamScore' ] print 'Max time: %g' % game[ 'maxTime' ] print 'Time elapsed: %g' % game[ 'elapsedTime' ] teams , players = s.queryPlayers() print print '--[ TEAMS ]' + '-' * 39 print print 'Teams Size Score Won Lost' print '-' * 32 for team in teamsName : t = teams.get( team ) if t is not None : print '%-8s %5d %5d %5d %5d' \ % ( team , t[ 'size' ] , t[ 'score' ] , t[ 'won' ] , t[ 'lost' ] ) print print '--[ PLAYERS ]' + '-' * 37 print print 'Team Score Won Lost Type Sign' print '-' * 60 players.sort( lambda a , b : cmp( b[ 'score' ] , a[ 'score' ] ) ) for player in players : sign , team , score , won , lost , motto = \ player[ 'sign' ] , player[ 'team' ] , \ player[ 'score' ] , player[ 'won' ] , player[ 'lost' ] , \ player[ 'motto' ] try : type = playerType[ player[ 'type' ] ] except : type = 'Unknown player type %s' % player.get( 'tks' ) name = sign if motto : name = name + ' <%s>' % motto print '%-8s %5d %5d %5d %-10s %s' % ( team , score , won , lost , type , name ) def usage() : print '''Usage: bzfquery.py [OPTIONS] [hostname [port]] -h, --help Display this help. Report bugs to .''' def main() : hostname , port = defaultHostname , defaultPort if os.environ.has_key( 'QUERY_STRING' ) : if enableCgiTb : import cgitb; cgitb.enable() if allowCgiParameters : form = cgi.FormContentDict() hostname = form.get( 'host' , [ defaultHostname ] )[ 0 ] try : port = int( form.get( 'port' , [ defaultPort ] )[ 0 ] ) except : pass else : import getopt options , parameters = getopt.getopt( sys.argv[ 1 : ] , 'h' , ( 'help' , ) ) for option , argument in options : if option in [ '-h' , '--help' ] : usage() sys.exit( 0 ) if len( parameters ) > 2 : usage() sys.exit( 0 ) if 1 <= len( parameters ) <= 2 : hostname = parameters[ 0 ] if len( parameters ) == 2 : port = int( parameters[ 1 ] ) getAndPrintStat( hostname , port ) if __name__ == '__main__' : main() bzflag-2.4.2+ds1/misc/bzfquery_example.php000066400000000000000000000002631200563112200204660ustar00rootroot00000000000000'; bzfdump($data); echo ''; ?>bzflag-2.4.2+ds1/misc/bzfs000077500000000000000000000020101200563112200152550ustar00rootroot00000000000000#! /bin/bash # # bzfs Start/Stop a BZFlag server # # chkconfig: 2345 50 50 # description: bzfs is the server for the 3D multiplayer tank game BZFlag. # Source function library. . /etc/init.d/functions RETVAL=0 prog="bzfs" # Set this path to the place where you keep the bzfsd script bzfsd_path=/usr/local/bin/bzfsd # Set this to your bzfs options bzfsopts="-conf /etc/bzfs.conf" start() { gprintf "Starting %s: " "$prog" daemon $bzfsd_path $bzfsopts RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL } stop() { gprintf "Stopping %s: " "$prog" killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog return $RETVAL } rhstatus() { status $prog } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) rhstatus ;; condrestart) [ -f /var/lock/subsys/$prog ] && restart || : ;; *) gprintf "Usage: %s {start|stop|status|restart|condrestart}\n" "$0" exit 1 esac exit $? bzflag-2.4.2+ds1/misc/bzfs.conf000066400000000000000000000300671200563112200162130ustar00rootroot00000000000000# This is a BZFlag Server (bzfs) configuration file. To make the server # use this file, use the command "bzfs -conf /path/to/this/file.conf". # Please read through it carefully. Lines starting with a # are comments. # to enable an option, remove the # at the beginning of a line. To # disable that option, put the # back. There are some examples in this # file. Make sure you change the examples if you uncomment the line. If # you don't know what something does, you are probably okay to just leave # it commented out. Failure to read through this file (looking for # already uncommented lines) might be a little embarrassing. Have fun. # Enables inertia and sets the maximum linear and angular accelerations. # The units are somewhat arbitrary so you'll have to experiment to find # suitable values. The values must be non-negative and higher values # yield greater inertia. #-a # Define a lag threshold over which players with high lag will be # announced to the admin channel. #-adminlagannounce 300 # Define a message which will be broadcast to all players every 15 # minutes. #-admsg "This message gets sent to users every 15 minutes." # When -c is supplied, this option randomly rotates the buildings. # Automatically assigns players to teams when they join so that teams are # evenly matched in number of players. Players are placed on teams with # lowest number of players first, then those with the lowest scores or # kill ratios. #-autoteam # This option allows world objects to be randomly rotated. Only applies # if a randomly generated world is used. #-b # This option sets up your ban list. This is ip masks separated by # commas. #-ban "192.168.1.5,10.10.2.*,10.2.*.*" # This option tells the server where to store the banlist. The banlist will # be loaded from this file when the server starts (if the file exists) and # written back to the file when someone gets banned or unbanned. If this # option isn't used the banlist will not be saved. #-banfile mybanfile # Specify a file that contains bad words that will be used when either # -filterCallsigns or -filterChat is enabled. #-badwords /conf/multilingualSwearList.txt # Turn on the filtering of chat messages. Messages have words provided # via a -badwords file are replaced with !@#$%^&* characters. #-filterChat # Turn on the filtering of callsigns. Callsigns are compared against # bad words provided via -badwords. #-filterCallsigns # By default, all filtering is aggressive, matching much more than what # is strictly listed in a -badwords file for convenience. Providing this # option will make the -filterCallsigns and -filterChat comparisons # exact match only. #-filterSimple # This enables capture-the-flag style game. Default is free-for-all style # game. #-c # Enables capture-the-flag style game with a balanced random map. Default is # free-for-all style game. #-cr # This option is for debug. You can have as many as 4 of them. # simple debug #-d # and more complex debugging. #-dd #-ddd #-dddd # This option controls the building density on random worlds(1-10) default is 5 #-density 5 # It is possible to restrict bots and autopilot from being used on the server. # This is accomplished with the following. #-disableBots # There are two sets of flags. Flags that must be in the world at all times # and flags that may get generated randomly in addition. +f specifies flags that # must be there and -f specifies flags the should not be randomly generated. # The server will randomly generate flags from the following list. If you # want to be sure there is at least a certain amount of a flag on the map # at any given time, you can use the +f option to guarantee a certain # number of a flag by repeating the option that many times. So to insure # there are at least 4 Oscillation Overthrusters you would do the # following, minus the # signs. Using "+f good" is the equivalent of # doing +f for each of the good flags. You are allowed to specify more than # one team flag in CTF games. #+f OO #+f OO #+f OO #+f OO #+f GM{10} # Flag IDs: Good: A - Agility, B* - Blue Team, BU - Burrow, CL - Cloaking, # G - Genocide, G* - Green Team, GM - Guided Missile, ID - Identify, # IB - Invisible Bullet, JP - Jumping, L - Laser, MG - Machine Gun, # MQ - Masquerade, N - Narrow, OO - Oscillation Overthruster, PZ - Phantom # Zone, P* - Purple Team, QT - Quick Turn, F - Rapid Fire, R* - Red Team, # R - Ricochet, SE - Seer, SH - Shield, SW - Shockwave, ST - Stealth, # SR - Steamroller, SB - Super Bullet, T- Tiny, TH - Thief, US - Useless, # V - Velocity, WG - Wings # Bad: B - Blindness, BY - Bouncy, CB - Color Blindness, FO - Forward Only, # JM - Jamming, LT - Left Turn Only, M - Momentum, NJ - No Jumping, # O - Obesity, RC - Reverse Controls, RO - Reverse Only, RT - Right Turn # Only, TR - Trigger Happy, WA - Wide Angle # If you want to restrict a certain flag, you can use the -f option. # just like with the +f option. "-f bad" is the same as doing -f for # all of the bad flags. You might want to turn off jump and ricochet # flags if the server already has jump and ricochet turned on. #-f bad #-f JP #-f R # This option allows for flags on box buildings. #-fb # This option allows tanks to spawn on buildings. This is especially useful # as tank spawn locations are now are calculated on the server without the # advantage of knowing where shots are. #-sb # Registered player files which will be loaded on startup. #-passdb server.pass #-userdb server.users #-groupdb server.groups # server-specific variables can be modified in-game using /set varname value #-vars vars.txt # This option causes the server to quit after serving one game. This is # handy if you want to do a timed game, or script a rotating server. #-g # This option gives buildings random heights. This is used when # you are using random maps. #-h # This option specifies a help file that will be displayed when the player # types /help name. Files can be a max of 10 lines long each. #-helpfile jump.txt jump #-helpfile shockwave.txt shockwave # Server will listen for and respond to "pings" (sent via broadcast) on # the given interface. The server uses the first interface by default. # This is the TCP/UDP/IP address the server will listen on. # You probably don't need to use this unless your server has multiple # interfaces and doesn't show up on the server lists. #-i interface # This option allows jumping. -j # This option kicks players after they have been warned about high # jitter for a certain number of times. # -jitterdrop 3 # This option warns the user their jitter is too high when it crosses # the number of milliseconds set. # -jitterwarn 25 # Define a threshold over which players with high lag will be announced. #-lagannounce # This option kicks players after they have been warned about high lag for # a certain number of times. -lagdrop 3 # This option warns the user their lag is too high when it crosses the # number of milliseconds set. -lagwarn 600 # This option kicks the user off after they have been idle for the # specified number of seconds. -maxidle 300 # This sets the max number of players. It can be done in 2 ways. A flat # count of players, or by number of players on a given team. # This allows up to 50 players, no team limits. #-mp 50 # This allows for max player by team. # The order is rogue, red, green, blue, purple,observer #-mp 4,4,4,4,4,3 # This option sets the max score for players. The game ends when a person # reaches this score and is declared the winner. #-mps 100 # This sets the maximum number of shots before a reload. The default # is 1. -ms 2 # This sets the max team score. The first team to reach this score is # declared the winner and the game is ended. #-mts 250 # The server will listen on this port. Default port is 5154. #-p 5154 # Kick users after they have been warned about having too much packet # loss after this many warnings. #-packetlossdrop 3 # Warn users about having packet loss that is too high when it reaches # this percentage. #-packetlosswarn 5 # Sets the admin password for the server. CHANGE THIS! -password s33kritw3rd # This specifies the number of seconds in which a poll can be vetoed. #-poll vetoTime=60 # This specifies the percentage of people required for a successful vote. #-poll votePercentage=51 # This is the number of voters required to hold a poll. #-poll votesRequired=6 # This is the length of time that players have to vote. #-poll voteTime=60 # This dumps the score to console when it changes. #-printscore # This is the public message that the server advertises on the public # server list. This is required if you want to be shown on the list. # It often advertises the map you are using. Keep it short. #-publictitle "Some wizbang BZFlag server - I need to read instructions" # This is also needed to be listed on the public server list. The # address needs to be valid in DNS. -publicaddr example.com:5154 # You probably don't need to use this, but it is there if you do. This # specifies where the server advertises itself. The built-in default # should work just fine. You need to hunt down the proper address if # doesn't work. # #-publiclist # Tells server not to respond to "pings". This makes the server private. #-q # This makes most shots ricochet. #+r # Hunt the rabbit game is activated with this option. Use only one of these # options. # Choose rabbit based on score. #-rabbit score # Rabbit is chosen by whoever kills the rabbit. #-rabbit killer # Or you can choose the rabbit randomly. #-rabbit random # You can set up a server for replay mode by entering this option #-replay # This option sets the recording buffer to the specified amount of megabytes. #-recbuf 2 # This option sets the directory to look for and save recordings. #-recdir "C:\" # You can specify a file so that people can type /report to report problems # on the server. The reports are logged in this file. #-reportfile report.txt # You can also use this option to cause the /report to trigger a command # as well as, or instead of logging to a file. #-reportpipe command # Use +s to have the server generate a certain number of extra super flags # and have them available at all times. #+s 20 # The server will have up to this many super flags at any time. #-s 30 # This option allows for antidote flags to be available for players who # get bad flags. #-sa # This allows you to limit the number of shots from a particular flag. #-sl GM 20 #-sl L 20 # This sets the amount of time in seconds that is required to pass between # two identical messages sent. -spamtime 10 # This sets the amount of times to warn spammers (see -spamtime) before they # are kicked. -spamwarn 3 # This is the server welcome message. Please change it. You can use \n # to designate new lines. -srvmsg "I have a cool BZFlag server, and I can not read." # Bad flags are automatically dropped after this many seconds. -st 10 # Bad flags are automatically dropped after this many wins. -sw 1 # This forces all clients to use the same time of day. The time is # determined by the server's clock. This disables the + and - keys # on the clients. #-synctime # Adds teleporters to the game. #-t # This option allows you to tell the server how long a team flag remains # before it is reset after the last player on a team leaves. The default # is 30 seconds. #-tftimeout 60 # This sets time limit (in seconds) for the game. Time starts when first # client connects. #-time 3600 # This option requires a timed game to be started using the /countdown # command to start a timed game. Default is when first player joins. #-timemanual # By default if a player kills a teammate, he dies too, this option turns this # off. Used mostly for capture the flag style games. #-tk # Announce team kills to the admin channel. #-tkannounce # Kick a player if his ratio of teammate to non-teammate kills is this # percentage or greater. #-tkkr 30 # This option changes the size of random maps. #-worldsize 800 # This specifies the world filename. # Use this format for *nix and Mac #-world "/usr/games/bzflag/megadome.bzw" # Use this format for Windows #-world "c:\mymaps\megadome.bzw" bzflag-2.4.2+ds1/misc/bzfs_conf.html000066400000000000000000001501501200563112200172330ustar00rootroot00000000000000 BZFS Configuration Builder

BZFS Configuration Builder

Server information
Port
Listen On Interface
Public Description Public Address
Use Public List Server Server Message
Respond to Pings Synchronize Time
bzflag-2.4.2+ds1/misc/bzfsd000077500000000000000000000003501200563112200154260ustar00rootroot00000000000000#!/bin/bash # This is a simple script that starts bzfs in the background and redirects # the output to a file. It could be useful together with the initscript. BZLOGFILE=/tmp/bzfs.log nohup /usr/local/bin/bzfs $* > $BZLOGFILE & bzflag-2.4.2+ds1/misc/bzirc.pl000077500000000000000000000065601200563112200160520ustar00rootroot00000000000000#!/usr/bin/perl # # bzirc.pl - A script that echoes messages from a bzflag server to an IRC # channel and from the channel to the server. # # Use it like this: # bzirc.pl : @ # # Inspired by ircbot.pl by detour@metalshell.com (http://www.metalshell.com). # # This script uses the POE and POE::Component::IRC modules. # A simple way to get these is using the cpan module. # perl -MCPAN -eshell # cpan> install POE # cpan> install POE::Component::IRC #FIXME: Why not make this available as a bzfs command? something like /irc irc.freenode.net #bzflag Hello world! use strict; use IPC::Open2; use POE; use POE::Component::IRC; # some global variables my ($nick, $host, $port, $channel, $callsign, $bzopts, $bzadminpid, $bzin, $bzout, $c); $nick = @ARGV[0]; $host = @ARGV[1]; $c = index($host, ':'); if ($c != -1) { $port = substr($host, $c + 1, length($host)); $host = substr($host, 0, $c); } else { $port = 6667; } $channel = @ARGV[2]; $callsign = '@' . substr($ARGV[$#ARGV], 0, index($ARGV[$#ARGV], '@')); $bzopts = join ' ', @ARGV[3..$#ARGV]; $bzadminpid; $bzin; $bzout; # do some POE magic POE::Component::IRC->new("irc_client"); POE::Session->new(_start => \&irc_start, irc_join => \&irc_join, irc_quit => \&irc_quit, irc_376 => \&irc_connect, irc_public => \&irc_pub_msg, bzreadable => \&readfrombz); # a handler that is called once when this session is started sub irc_start { my $kernel = $_[KERNEL]; my $heap = $_[HEAP]; my $session = $_[SESSION]; $kernel->refcount_increment( $session->ID(), "bzirc"); $kernel->post(irc_client=>register=> "all"); $kernel->post(irc_client=>connect=>{ Nick => $nick, Username => $nick, Ircname => $nick, Server => $host, Port => $port, }); } # a handler that is called when we have connected to the IRC server and # received the MOTD sub irc_connect { my $kernel = $_[KERNEL]; $kernel->post(irc_client=>join=>$channel); } # a handler that is called when someone joins a channel sub irc_join { my $joiner = (split /!/, $_[ARG0])[0]; my $joinchannel = $_[ARG1]; my $kernel = $_[KERNEL]; if ($joiner eq $nick && $joinchannel eq $channel) { print "Joined $channel, starting bzadmin...\n"; $bzadminpid = open2($bzout, $bzin, "bzadmin -ui stdboth $bzopts"); $kernel->select_read($bzout, 'bzreadable'); } } # a handler that is called when someone quits IRC sub irc_quit { my $quitter = $_[ARG0]; my $reason = $_[ARG1]; if ($quitter eq $nick) { print "Disconnected.\n"; } } # a handler that is called when someone sends a message to the channel or to us sub irc_pub_msg{ my $talker = (split /!/, $_[ARG0])[0]; my $talkchannel = $_[ARG1]->[0]; my $msg = $_[ARG2]; if ($talker ne $nick && $talkchannel eq $channel) { print "->bz: $talker: $msg\n"; print $bzin "$talker: $msg\n"; } } # a handler that is called when the bzadmin pipe is readable sub readfrombz { my $msg = <$bzout>; my $kernel = $_[KERNEL]; if (substr($msg, 0, length(" $callsign: ")) ne " $callsign: ") { print "->irc: $msg"; $kernel->post('irc_client'=>privmsg=>$channel,$msg); } } # start the POE kernel $poe_kernel->run(); # Local Variables: *** # mode:Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/bzls.lua000077500000000000000000000305721200563112200160610ustar00rootroot00000000000000#!/usr/bin/env lua -------------------------------------------------------------------------------- -- -- author: trepan -- date: June 03, 2011 -- copyright: (c) 2011 trepan -- license: LGPL 2.1 -- -- brief: BZFlag server list console utililty -- -------------------------------------------------------------------------------- if (_VERSION ~= 'Lua 5.1') then print('ERROR: this program requires Lua 5.1') os.exit(1) end -------------------------------------------------------------------------------- require('socket') require('socket.http') print(os.date()) -------------------------------------------------------------------------------- local urlBase = 'http://my.bzflag.org/db/?action=LIST&listformat=lua' local protocol = 'BZFS0221' local svnProtoURL = 'http://bzflag.svn.sourceforge.net/viewvc/bzflag/trunk/bzflag/src/date/buildDate.cxx' -------------------------------------------------------------------------------- local ansicodes do local esc = '\027' ansicodes = { reset = esc .. '[0m', bright = esc .. '[1m', underline = esc .. '[4m', reverse = esc .. '[7m', fg_black = esc .. '[30m', fg_red = esc .. '[31m', fg_green = esc .. '[32m', fg_yellow = esc .. '[33m', fg_blue = esc .. '[34m', fg_purple = esc .. '[35m', fg_cyan = esc .. '[36m', fg_white = esc .. '[37m', fg_default = esc .. '[39m', } end -------------------------------------------------------------------------------- local protoAll = true local svnProto = false local passfile = tostring(os.getenv('HOME')) .. '/.bzf/passfile' local callsign = nil local password = nil local callpass = '' local limitCount = nil local minPlayers = nil local teamCounts = false local showOwners = false local gameInfo = false local debugging = false -------------------------------------------------------------------------------- local function PrintHelp() print('usage: checkbz [options]') print(' -h: print this help') print(' -c: check current protocol') print(' -s: check svn trunk protocol') print(' -i: list using identity / password') print(' -l <#>: maximum number of servers') print(' -p <#>: minimum number of players') print(' -t: team counts') print(' -o: show owners') --FIXME print(' -g: game info') print(' -d: enable debugging') end -------------------------------------------------------------------------------- do while (arg[1]) do local a = arg[1] if (a == '-h') then PrintHelp() os.exit(0) elseif (a == '-p') then minPlayers = tonumber(arg[2]) if (not minPlayers) then error('bad -p argument') end table.remove(arg, 1) elseif (a == '-l') then limitCount = tonumber(arg[2]) if (not limitCount) then error('bad -l argument') end table.remove(arg, 1) elseif (a == '-c') then protoAll = false svnProto = false elseif (a == '-s') then protoAll = false svnProto = true elseif (a == '-o') then showOwners = true elseif (a == '-t') then teamCounts = true elseif (a == '-d') then debugging = true elseif (a == '-i') then local cpchunk = loadfile(passfile) if (cpchunk) then callsign, password = cpchunk() end elseif (not arg[1]:match('^%-')) then break else PrintHelp() os.exit(1) end table.remove(arg, 1) end end if (not minPlayers) then minPlayers = limitCount and 0 or 1 end -------------------------------------------------------------------------------- local function UrlEncode(s) return (s:gsub('[%s%W]', function(c) if (c:match('%s')) then return '+' else return '%' .. string.format('%-2.2X', c:byte()) end end)) end if (callsign and password) then callpass = '&callsign=' .. UrlEncode(callsign) .. '&password=' .. UrlEncode(password) end -------------------------------------------------------------------------------- local function ParseProtocol(protoCode) for line in protoCode:gmatch('[^\n]+') do local proto = line:match('#%s*define%s*BZ_PROTO_VERSION%s*"(.-)"') if (proto) then return 'BZFS' .. proto end end error('could not find the protocol using:\n ' .. svnProtoURL) end if (svnProto) then local protoCode = assert(socket.http.request(svnProtoURL)) protocol = ParseProtocol(protoCode) end -------------------------------------------------------------------------------- local serverStr do local protoQuery = '' if (not protoAll) then protoQuery = '&version=' .. protocol end local queryURL = urlBase .. protoQuery .. callpass if (debugging) then print('queryURL = ' .. queryURL) end serverStr, err = socket.http.request(queryURL) if (not serverStr) then print('query failed: ' .. tostring(err)) print('(' .. queryURL .. ')') os.exit(1) end if (debugging) then print(serverStr) end end local function ParseGameInfo(hexstr) local packedString = hexstr local packedIndex = 1 if ((#hexstr ~= 54) and -- length for 2.0.x (#hexstr ~= 58)) then -- length for 3.0.x return nil -- unknown protocol end local function UnpackU8() local a = packedString:sub(packedIndex, packedIndex + 2 - 1) packedIndex = packedIndex + 2 return tonumber(a, 16) end local function UnpackU16() local a = packedString:sub(packedIndex, packedIndex + 4 - 1) packedIndex = packedIndex + 4 return tonumber(a, 16) end local t = {} if (#hexstr == 58) then -- protocol for 3.0 t.gameType = UnpackU16() end t.gameOptions = UnpackU16() t.maxShots = UnpackU16() t.shakeWins = UnpackU16() t.shakeTimeout = UnpackU16() * 0.1 t.maxPlayerScore = UnpackU16() t.maxTeamScore = UnpackU16() t.maxTime = UnpackU16() t.maxPlayers = UnpackU8() t.rogueCount = UnpackU8() t.rogueMax = UnpackU8() t.redCount = UnpackU8() t.redMax = UnpackU8() t.greenCount = UnpackU8() t.greenMax = UnpackU8() t.blueCount = UnpackU8() t.blueMax = UnpackU8() t.purpleCount = UnpackU8() t.purpleMax = UnpackU8() t.observerCount = UnpackU8() t.observerMax = UnpackU8() -- t.gameType = ParseGameType(t.gameType) -- t.gameOptions = ParseGameOptions(t.gameOptions) return t end local playerTeams = { rogueCount = true, redCount = true, greenCount = true, blueCount = true, purpleCount = true, } local function ParseServerLine(server) if (not server.version or not server.hexcode or not server.addr or not server.ipaddr or not server.title) then error('invalid server entry') end local gt = ParseGameInfo(server.hexcode) if (not gt) then error('invalid gameinfo hex string') end local count = 0 for k, v in pairs(gt) do if (playerTeams[k]) then count = count + v end end return { ipaddr = server.ipaddr, address = server.addr, protocol = server.version, gameinfo = server.hexcode, description = server.title, owner = server.owner, playerCount = count, rogueCount = gt.rogueCount, redCount = gt.redCount, greenCount = gt.greenCount, blueCount = gt.blueCount, purpleCount = gt.purpleCount, observerCount = gt.observerCount, } end -------------------------------------------------------------------------------- local servers = {} local serverCount = 0 local playerCount = 0 local observerCount = 0 local function MapServers(t) local fields = t.fields for s = 1, #t.servers do local server = {} local serverData = t.servers[s] for f = 1, #serverData do local fieldName = fields[f] if (fieldName) then server[fieldName] = serverData[f] end end servers[#servers + 1] = server end end local function GetSafeEnv() return { type = type, next = next, pairs = pairs, ipairs = ipairs, select = select, unpack = unpack, tonumber = tonumber, tostring = tostring, assert = assert, print = print, math = math, string = string, table = table, coroutine = coroutine, } end do local serverChunk = assert(loadstring(serverStr)) setfenv(serverChunk, GetSafeEnv()) local _, serverTable = assert(pcall(serverChunk)) MapServers(serverTable) local inServers = servers servers = {} for _, server in ipairs(inServers) do local server = ParseServerLine(server) if (server) then serverCount = serverCount + 1 playerCount = playerCount + server.playerCount observerCount = observerCount + server.observerCount servers[#servers + 1] = server end end table.sort(servers, function(a, b) if (a.protocol ~= b.protocol) then return a.protocol < b.protocol end local va = a.playerCount + (a.observerCount * 0.001) local vb = b.playerCount + (b.observerCount * 0.001) if (va ~= vb) then return va > vb end return a.address < b.address end) if (limitCount) then for i = (limitCount + 1), #servers do servers[i] = nil end end end -------------------------------------------------------------------------------- local function GetTermSize() local p = io.popen('stty size', 'r') -- "size" is not a POSIX argument if (not p) then return nil end local s = p:read('*a') p:close() if (not s) then return nil end local rows, cols = s:match('(%d+) (%d+)') rows, cols = tonumber(rows), tonumber(cols) if (rows and cols) then return rows, cols end return nil end -------------------------------------------------------------------------------- local function LimitLength(s, n) if (#s > n) then assert(n >= 3) s = s:sub(1, n - 3) .. '...' end return s end do local maxLineLen do local rows, cols = GetTermSize() maxLineLen = cols or 80 end local descLen = 0 for _, s in ipairs(servers) do if (descLen < #s.description) then descLen = #s.description end end local addrLen = 0 for _, s in ipairs(servers) do if (addrLen < #s.address) then addrLen = #s.address end end local maxAddrLen = addrLen local function fmtcount(count) return (count == 0) and ' _' or ('%2i'):format(count) end local tmpServers = {} for _, s in ipairs(servers) do local pc = s.playerCount + (s.observerCount * 0.001) if (pc >= minPlayers) then tmpServers[#tmpServers + 1] = s end end servers = tmpServers local protoCurr = '' for _, s in ipairs(servers) do local ac = ansicodes if (s.protocol ~= protoCurr) then print() print(ac.bright .. ac.fg_cyan .. ac.underline .. s.protocol .. ac.reset) protoCurr = s.protocol end local prefix = '' if (not teamCounts) then prefix = ('[%s%s%s,%s%s%s]') :format(ac.fg_yellow, fmtcount(s.playerCount), ac.reset, ac.fg_cyan, fmtcount(s.observerCount), ac.reset) else prefix = ('[%s%s%s,%s%s%s,%s%s%s,%s%s%s,%s%s%s,%s%s%s,%s%s%s]') :format(ac.bright, fmtcount(s.playerCount), ac.reset, ac.fg_yellow, fmtcount(s.rogueCount), ac.reset, ac.fg_red, fmtcount(s.redCount), ac.reset, ac.fg_green, fmtcount(s.greenCount), ac.reset, ac.fg_blue, fmtcount(s.blueCount), ac.reset, ac.fg_purple, fmtcount(s.purpleCount), ac.reset, ac.fg_cyan, fmtcount(s.observerCount), ac.reset) end local stripped = prefix:gsub('\027%[[%d;]+%l', '') local maxDescLen = maxLineLen - maxAddrLen - (#stripped + 2 + 2) if (maxDescLen > descLen) then maxDescLen = descLen end local desc = LimitLength(s.description, maxDescLen) local addr = LimitLength(s.address, maxAddrLen) print(('%s %s%-'..maxDescLen..'s%s %s%s%s') :format(prefix, ac.fg_green, desc, ac.reset, ac.fg_red, addr, ac.reset)) if (showOwners and s.owner and (#s.owner > 0)) then print('\\__ ' .. s.owner) end end print() print('servers = ' .. serverCount) print('observers = ' .. observerCount) print('players = ' .. playerCount) end -------------------------------------------------------------------------------- bzflag-2.4.2+ds1/misc/bzwcvt.pl000077500000000000000000000021061200563112200162500ustar00rootroot00000000000000#!/usr/bin/perl -w # # Quick hack to convert world rotation formats # by Tim@Rikers.org # 1.7e2 and earlier use radians # 1.7e3 and later use degrees # script converts either way by looking to see # if all values are < or > 2 * pi # usage: ./bzwcvt.pl < hix.bzw > hixr.bzw $pi = 3.14159265358979; @bzw = <> ; @rotations = grep( /^rotation/ , @bzw ) ; $max = 0 ; foreach ( @rotations ) { ( undef, $rotation ) = split / */ ; $max = $rotation if ( $max < $rotation ) ; } chomp( $max ); print STDERR "max rotation is $max, converting " ; if ( $max > 2 * $pi ) { print STDERR "degrees to radians\n" ; } else { print STDERR "radians to degrees\n" ; } foreach ( @bzw ) { if ( /^rotation/ ) { ( undef, $rotation ) = split / */ ; print "rotation " ; if ( $max > 2 * $pi ) { print $rotation / 180 * $pi; } else { print sprintf("%.1f", $rotation * 180 / $pi ); } print "\n"; } else { print "$_"; } } # Local Variables: *** # mode:Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/checkam000077500000000000000000000025051200563112200157150ustar00rootroot00000000000000#!/bin/sh # checkam # hack to get some feedback as to files that might be missing from Makefile.am # Copyright (c) 1993-2012 Tim Riker # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. echo "The following might need to be added to Makefile.am" pwd=`pwd` #CVS dirs=`find * -type f -name Entries | sed -e 's|/CVS/Entries||'` dirs=`find * -type f -name entries | sed -e 's|/\.svn/entries||'` for dir in $dirs ; do if [ -f $dir/Makefile.am ] ; then cd $dir files=`grep -B 1 ^file$ .svn/entries | grep -v ^file$ | grep -v -- -- | sort` # CVS files=`grep '^/' CVS/Entries | sed -e 's|/\([^/]*\)/.*|\1|' | sort` for file in $files ; do case $file in Makefile.am|.cvsignore) ;; *) grep -q "\<$file\>" Makefile.am || \ echo "$dir/$file" ;; esac done cd $pwd else echo "$dir/Makefile.am" fi done # Local Variables: *** # mode: sh *** # tab-width: 8 *** # sh-basic-offset: 2 *** # sh-indentation: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/config.guess000077500000000000000000001276151200563112200167260ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: bzflag-2.4.2+ds1/misc/config.sub000077500000000000000000001031671200563112200163650ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-11-20' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: bzflag-2.4.2+ds1/misc/copyplugindocs000077500000000000000000000014421200563112200173630ustar00rootroot00000000000000#!/bin/sh # BZFlag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # for any compiled plugin: # copy README.txt to plugin.txt # copy any other txt file too for doc in plugins/*/.libs/*.so ; do name=`echo $doc|cut -d / -f 2)` if [ -r plugins/$name/README.txt ]; then cp -p plugins/$name/README.txt $1/$name.txt for file in `ls plugins/$name/*txt|egrep -v '(README|CHANGELOG).txt'` ; do cp -p $file $1/ done fi done bzflag-2.4.2+ds1/misc/depcomp000077500000000000000000000442671200563112200157640ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bzflag-2.4.2+ds1/misc/doxyfile000066400000000000000000001105151200563112200161430ustar00rootroot00000000000000# Doxyfile 1.2.16 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # General configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = BZFlag # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc/doxygen # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, # Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, Slovene, # Spanish, Swedish and Ukrainian. OUTPUT_LANGUAGE = English # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these class will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = . # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower case letters. If set to YES upper case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are adviced to set this option to NO. CASE_SENSE_NAMES = YES # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consist of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl FILE_PATTERNS = *.h *.c *.cxx # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = acconfig.h include/config.h # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse. FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the Html help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript and frames is required (for instance Mozilla, Netscape 4.0+, # or Internet explorer 4.0+). Note that for large projects the tree generation # can take a very long time. In such cases it is better to disable this feature. # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_XML = NO #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line and do not end with a semicolon. Such function macros are typically # used for boiler-plate code, and will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES tag can be used to specify one or more tagfiles. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superceded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yield more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermedate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO # The CGI_NAME tag should be the name of the CGI script that # starts the search engine (doxysearch) with the correct parameters. # A script with this name will be generated by doxygen. CGI_NAME = search.cgi # The CGI_URL tag should be the absolute URL to the directory where the # cgi binaries are located. See the documentation of your http daemon for # details. CGI_URL = # The DOC_URL tag should be the absolute URL to the directory where the # documentation is located. If left blank the absolute path to the # documentation, with file:// prepended to it, will be used. DOC_URL = # The DOC_ABSPATH tag should be the absolute path to the directory where the # documentation is located. If left blank the directory on the local machine # will be used. DOC_ABSPATH = # The BIN_ABSPATH tag must point to the directory where the doxysearch binary # is installed. BIN_ABSPATH = /usr/local/bin/ # The EXT_DOC_PATHS tag can be used to specify one or more paths to # documentation generated for other projects. This allows doxysearch to search # the documentation for these projects as well. EXT_DOC_PATHS = bzflag-2.4.2+ds1/misc/filter.txt000066400000000000000000000002131200563112200164140ustar00rootroot000000000000000.0.0.0/0.0.0.0 c3po ACCEPT 127.0.0.1/255.255.255.255 _any_ ACCEPT 0.0.0.0/0.0.0.0 _registered_ ACCEPT 0.0.0.0/0.0.0.0 _unregistered_ DROP bzflag-2.4.2+ds1/misc/fonts/000077500000000000000000000000001200563112200155235ustar00rootroot00000000000000bzflag-2.4.2+ds1/misc/fonts/DejaVuSansCondensed-Bold.ttf000066400000000000000000017661501200563112200227660ustar00rootroot000000000000000FFTML <GDEF-1XGPOSMppGSUBgZtdOS/2JTVcmapUJ`cvt >1Tfpgm[kgasp glyf'yheadg=!T6hhea $hmtx pR4kern3Xi!0loca6*IR8maxp L nameuf l=postM4Ɋprep|aiV_V_ U          344578<=[\gh      % & & ' 3 4 : ; ; < ? @ A B Y Z [ \ t u u v-..//0013445?@&' \ DFLT8arabBarmnbcyrllgrekhebrlao latnnko KUR SND URD MKD SRB (ISM (KSM (LSM (NSM (SKS (SSM (kern,mark2mark@markFmkmkNmkmkVmkmk\    &.6>HPX`hpxzh(   *d> 013l6\67(E$Y0&:  ^af^af &,28>DJPV\bhntz::::r 4 4 `4\]_`bcdeg !"#$%&4\]_`bcdeg !"#$%&JPV\bhntz$ s N>X  &,iouu  &,28ss`su|s~sZ& #HNTZ`flrx~44444444444444t444444444444444444444  "  !" &,28>DJP44444444444444444444444444444444446 7pv| $*06<BHNTZ`flrx~4h4h2f2222>22222f2f222f22>424=42>2>22444jjj22222f2f44442242222222222   4 :&-./56  4 :%,678 $*06<BHNTZ`flrx~ &,4{4{2{2{222222{2{2{2{2{2{2{22424{4{44222{2{4{44{22222{2{44442242{2{2{2{2{2{2{2{2{2{2{2{ $6HZl~ ;j ;j ;j ;j ; ; ;j ;j ^af>DJPV\bhpx~||||||||||||x  "*2:BJRZbjrz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\dlrx&.6<DLRX^djpv|     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~_.;0 Y n8"|#vddd;;2;;mjmjmjjjvIIIIQjQj*8*8>>j2mjmjmjmmkmjmmjm*8*8*8*j*j>>2j@Yzz'z@8rzYICGYCCATkR$K##>>_. Y 8"|#v;_"!mmxxmmxxmmxxmjmjxxmjmjxxmjmjxx*8*8I*8*8Ivvvvvvvv*j*jhjhj*j*jhjhj>22xxx\x\;;;;;;;;;;;;;;;;;;22;;xx;;mmx\x\jjmjmjxxmjmjxxv\v\vvvvjjjjIIjjIIjjIIvjvjIIvjvjQjQjjjQjQjjjII*8*8II*8*8hjhj>>xxIjIj>xxjjIjv22x\x\mjxx*8IIxxmkxxmjxxJvvvvvvvv>xxx\x\j@@@YYYzzzzzz'''zzz@@@888rrrzzzYYYIIICCCGGGYYYCCCCCCAAA07PR[8vwByDc1s~ ' ^afBHNTZ`flt||||||||||||| 'PX`hpx $*08@HPX`fn[w00\0 0 0 0 000000A1 #H000 ~t0 5000000~t~t[[ w010 #[  !! #$ &')- " 0 $6HZl~ r: r: r r r r r r 4\]_`bcdeg !"#$%&V^djpv|-`|`|`H  nv~ $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~ %`;`Y` `L;;42F;r;rmmmvvvI I I I QrQr~LLR2RRmLmmmmmmmmvvJvvv@vvn LLLxx4v 2R@Yzz'z;zYIeJYeeAx`%`Y` `mmxxmmxxmmxxmmxxmmxxmmxxLL_LL_vvvvvvvvvvvvvvvvPPnnxx;;xx;;22xxRxx;;;:;;;;:;:;;;;;:;:L;;;4;42F2F;r;rxFxF;r;rmmxxttmmxBxBmmxFxFvvvvvvvvv v vv  I I I I I I v v I I vBvBQrQrrrQrQrrr~I~ILL_nnLR_nn;;xrxrRIRIRzxBxBRRILv22RRxxmxxL_LLR_LLxBxBmxBxBmxxxxvvJv@v vv4x4x4xxR@@@YYYzzzzzz'''zzz;;;zzzYYYIIIeeeJJJYYYeeeeeeAAA''7PR[vw(y*Ighijk15@ R['\ 4\]_`bcdeg !"#$%&v~ -`|`{{{{{{{{|` <BHNTZ`flrx~bdXZ@zaB<<;;z"l6U  0 >DJPV\bhntz`b`d``X`Z`z``a``B`<`<``;`;`z``"`l`6`J        28>DJPV\bhnt```````````` R $*06<BHNTZ`flrx~ &,28>DJPV\bhntz$=D]46}8<DM.0 D6L  $t;z- 4{4{XF^ "(.4;;;LX-*H r  V &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v | 2mVETTRVxtttbtRt;;Rt@dzRR;bYSQRRRzz;;tzTWtRRR@b;RmTR;RR;RRttRooo;RtRtRtQRQRttR; ;RRRRdRdRzyR;R;RmR?RdRhR;RRbRWYSRRRRttR9t|;RRtRR"R@@T;;ztzYNNN%tz```$|YSY3AR2[OR<Ri{\V5$R-VtbttRYSYRtRR$R%R N;^uTRwEcR8[xttRtddzWB{RRU;R@H$= D]$>@ABCDEFG--HJJILLJZZKaaLddMnpNvvQRST V m]BB**st!&))+189=?BB = = E H J L O O R W ^ ^ b b f g i k m m o s v y } } } /.134C77E9;F>?IAFKQ  STU  !" &,28>DJP444444444444=444444444444444444444FH  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      " ( . 4 : @ H N T Z b h n t z     " ( . 4 : @ F L R X ^ d j p v |  $*06<BHNTZ`flrx~ "(.42mmETTVxtt{@{{bt{@;/;/@@{d{z{{{{{b{Y{S{Q{R{{{{zz{t{;{t{{@ 2{x{mbETT[@Sx{bWTR{{v{z{@b;{m{T;/{R{{t{{@{{o{o{o{{{{{;{tt{t{Q{Q{{@@/;{{ @@{{{d{d{{z{{y{{{{{{{{{{;dh{;{bW{{{Y{S{R{{{{{tt{9{t|{;/{E{t{"{@@7{{z{d{y.{d{{Y{Uz{{z{z{E{_{{Q{{!{!{z{{{z{{;/{{z{3Tmg`t{J{ {{{{{{{{{z{z{z{{{#{R{{>{ {.{B{o{;/;/ z{q{{g{{{@{{z{{z{ {Q{{{z{Y{{N{{N{N{%{{t{{{z{{`{`{`{#{|{Y{S{{Y{{ut{{3A2[O{ <iD{\V15{${]@VSVt{b@@{Y{S{Y{z{{{&!{{@$%{{{{{VN{{;{^uTRwEc8[xt{t{td{d{z{Q{{*{{B{{{R{U{{;{y@;{;{;{t$= D]$>?ABCDFGHBCIHJKLLNOPORRQTURX]T__Zaa[ff\ij]mp_txc{{hijkl n mu>NPV\]abdeggoo} "#%'+!",%-.777RR8UU9YY:st;=>@ABC &D))K+1L89S=?UBBXFFYvzZ_` = =a E Hb J Lf O Oi R Wj ^ ^p b bq f gr i kt m mw o sx v y} } } _ _tw}.34779;>?AF   !#$ 4 :*1;<= &,28>DJPV\bhntz "(.4:@FLRX^4{4{2{2{1{1{2{2{2{2{2{2{2{2{2{2{2{2{rr4{r1{4{4{4{4r4{2{2{2{2{4{4{4{1{1{1{1{2{2{4{4{4{4{2{2{4{2{2{2{2{2{2{2{2{2{2{2{2{@%8kY&&&au<aa<DrDr/&&KK&kk}}&N}&&au)&D&9a&a&&&a/ \<,@a=akuDYYY&&N<DDDkDDDDDkDVV&YY}}aD&&&&au<aa<DrDr aua/ ADGJMPSVY\_behknqtwz} B%  %%89LM *_ { 4 5 6 7 h$=EEGGIIKKLMNOWW      ""$$&&((**,,..0022446688:;==??AAHHRRTTVV  **__ { { 4 7 &   &b4N`jt~",FP                              !! #$ &')-  DBDFHJNPTVZ^bfjlnprvz~    8PR[vw#y%l3LRX\`dhtx| <<>>@DIPRXZ[vwy)1l3KQW[_cgsw{   <<>>@DIPRXZ[vwy)12  !b$b $a!^^ab~&8Jlb b %e"b &e#b #`"_ ]\ &`%_\]_`be NN> $HDBHDBJ 8 "(IOILOLI OLIRl$*06<>c<b:a8`6_5^3]1\;f9e8d &,?c=b;a9`7_2\:e<e=QY[6 , WVWA(:FPZfr "   " u$; &V Z0 [(/ ;F AX @R")567DF    _^`\]ba28?EMS_^`\]ba28?EMS D  ,-DO   ,-O %   ! LM *_ { 33f . `)PfEd m`?,, X~OSXbu~#V_ :UZot?5JR>PjGv#.[jx{EMWY[]} ' d q ! !I!K!N!"""###!#(#,#u#z#}######$#$i&&'' '''K'M'R'V'^'''''()) )A))))***/***++#,o,w,y,}-e-o...MGMQU)3?KO6<>ADO#t QW\tz 1Ya !@Z`ty? 7LT@RtFn&0]w{ HPY[]_ * j t !! !K!N!S!"""###$#+#s#z#}######$"$`%&''' ')'M'O'V'X'a''''')) )@))))** */*}**++ ,`,q,y,{-0-o...MDLPT&08FN8>@CFR pvvtsrMKC>' XWUTRLKJIHFEDBA@>l@PRjtFGnv#3&.A0[J]jvwx{{ O   E HM PW YY [[ ]] _}   Q ` n t  ' * d j q t   4 6 8 :!! ;! !I E!K!K !N!N !S! !" "" "" "# ## 1##! 3#$#( 9#+#, >#s#u @#z#z C#}#} D## E## F## G## [## ]## ^$"$# _$`$i a%& k&&'''' ' ''')'K'M'M'O'R'V'V'X'^'a'''#'';''I''J'(P))`) ) b)@)Ad))f))h))p))q**s* *v*/*/*}*****+++ +#,`,o,q,w,y,y,{,}-0-e-o-o+..,....-MM.DGnLMrPQtTUvx&)}038?FKNO68<>>@ACDFOR #-pt1v6V89;>@D FF%JP&Rk-GV׏{   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a rdei xpk \vj Fs gw * 9 7M Sl|6cn BT p .m} b : *  y qzf3f=ffTbfTfmf3bq%fHZfm99Xm=fuff9{{X3fLfLJ#DDf?;Pw /X#/553X sf+j-j!f#^`3B3\fy```{j\{`bXP1L`%!JJ7{'}3Xy9bs&, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX (EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-[!%!!\4r)G !#!!D..D^###շ++}333!!!####5!#5!#34VWW>VVWV'?0V/?#*1#.''.546?3.'>54&̒qdgm׵ZZZZޒ@MGNNH-.);?7* "*/(BE5;CBBDC; '3"32654&'2#"&546#3!2#"&546"32654&@FF@AEF@nH@FF@AFGh{rs{{sr{ؽ۽ ٽڽ٨|rs}}sr|n&0 >7!!'#"5467.54632.#"3267p01dYX^u܀&$R`THFL,:FnkmFDےj5j:0.;6"W/wGs))#+ !&547! sts;: 654'!ssss ?C$9 %#'-73%)DԙD-D-,XXF !!#!5!o**  b!#DZuc!!d5!!D}B3#&mX &#"326! ! P_op__pn`Z   mstm !%!!!28J2T HH5c!!>54&#">32O0B?iQnun qB~DiMLH+-zӱ{p(!"&'32654&+532654&#">3 [gfa]|rTUga|%'%%)67jcfi[]V^*) R !!3#!!|:RJ!!>32!"&'32654&#"^'P+ronW~~Ja 12/FFuv+-r $"32654&.#">32# !2[[[[\[[PUH;QP$]Ⴣ-+11ir {p!!!{yp #/"32654&%.54632! $54632654&#"bhhb`gg{|}zYSQXXQSYvnnuunou)ž)*ސUY``YY_`_$73267#"543 !"&2654&#"SJ=Q _Y[\\[[\\!++22 "vY`!!!!EE`}}t` !#!!EZEu}=F 5Ec~'F!!!!~~=F55~e11J~!!546?>54&#">32!!~<_:30WMI\mTGT:=&E1Rb:4\.FOCB:*(ǿbY9>K-y M32654&#"#"&5463253>54&'&$#"3267#"$'&5476$32!#^QQ_`QP^qxPšPxp45UiP`[ZrP`qssxzqr-IoCF#{zyZGOPGKɝdIz=;bɵdbg^Pag}}IJ}|b~  !!!!!Vp+%R 2654&+2654&+)! RUURiiii pz[PNMQsbcaay$ռm[%# !2.#"3267`pxPp`agԺgaR78ef87IDDI32654&#! )|)n2+k_\\_lq#ateetae !!!!!!)`EQ !!!!!)[a%# !2.#"3267#!ax\mqp6]$oFFei87GF"^ !!!!!![Z9+y!![+f !!#3265[G6lo# !! !![xN!=Le!!![`EN ! !!#!24+D%^ !!!!H}+[ "3254 ! Dopddjk ! !#!32654&#?[enne_mddl[# ! !"32544pCGllkh\g2654&+!! !.#l__l Gq92fT?ZgfX֔-XspR'.#"!"$'32654&/.54$32Pn^|wPjpqyR{ɻo78LP3 _efRI[|EAtyhMhhLJDMm)f]ˢŸUO.. %2654&#">32#"&'!!hmmhgoooCiiCB稠b]]bO{.#"3267# !2AGL9KN4O=202177R!!5#"322654&#"IDCjihmmhfmmXc\II]ɨO{!3267# !24&#" ~fprr*kW]u3f~~CD015:“f}un#3#"!!!#354632D67DN`NRFy(%#"54325!!"&'3265"32654&ICjjCD^YURdolgeppb\CA\c !65!54&'.#"!!>32 A)esBIcVon#'b]!!!!BB`F !+53265!!B¹8[EB`\ !! !!Bsvyw-!!B{%>32!>54&#"!4&#"!!>32A=e?G[d:J\eD;]hhmVH wkHk`_`p{!54&'.#"!!>32 A)esBIcVon#'`b]O{ "32654& ! zkppkjooj$'{88V{%!!>32#"&"32654&BCiigooghmm b]]7RVy "32654&#"325!!tfmmfhmmmCjjCDw+c\IG\c{.#"!!>32+S+|B>q&$/`ne_{'.#"#"&'32654&/.54632gU\YCX8dp`h^`Bb9׭Y=0035+. ###44:90/ G!!;!"&5#3L7S쿠%N7>`!3265!!5#"&D @)esBIbp[.w#&)b]`!!!BCt`@g` !!!! !A9 9`` !! ! !UU~=#LbF`!!+5326?CBX@eRK `6:KR` !!!5!ipz`f:$#"&=4&+5326=46;#"3:Ĵa77a>MQcdPMmutWW#:$326=467.=4&+532;#"+?~MQddQM~?Ĵa77amWW͖tuFR#"'&'&'&#"5>32326E_W`  TPYaV`UMRPE:=MSPE:=KG !3!..D=^qd#.+>7+#&473xFFFFC; P3K4 @Z,lm*902i2/  (.##pj.#"!!!!3#535632_?EjfPͯS'&} FB=T#/'7.5467'7>327'#"&72654&#",a70b3)`84bRssRRsq Ϛ1k??l.͚Ϛ7n6?i/ϙ\\\]~!!!5!5'!5!! !!!!gg,hh,`BV3VB##   =3?.#"#"&'532654'&'.5467.54632>54&Y3DD ejFCڿM[g3;F!cfC;εL>54&'.'2#"&'&547>4c4frrf:g*;v8?smONNNNNmnNNOONOlbbaabb툉bbaabbf%#rs~$#WWWzyWVVUWWyzWXVnmmmmnnmmmmnu)!!"326=7#5#"&546;54&#"5>32$x^<4Pg1~U{PMNHSD=4>3:rWT@LHt8;##'  5 5JDkD'qsqF!#!Qc!!d55 4L"3267>54&'.#32654&'2#'.+#2#"&'&547>mONNNNNmnNNOONOFHF&_V%?c`"4 bbaabb툉bbaabb3WWWzyWVVUWWyzWXV5442wyVpP:NAD7nmmmmnnmmmmnX!!7d "32654&'2#"&546AZYBAZ[@;n++,,)+p=\dHHbcGHd3/0xDCy-03F !!#!5!!!o***~bbb!!5>54&#"5>32sM7/B58KND@[D 5P(2>-/oHyVQ(#"&'532654&+532654&#"5>32S[I=;t6U^afCLXQFH/o?;NQ`nQ$%@;@=/3--piE`HEf!#FfT` !3265!3267#"&'#"&'EZ[]ZD#0T(Pf+yPC^T utqqtG8 KSOO/0t; !###.546 ԫfN۲!!D}o!#"&/32654&'42os+[/-K4;'(>j/_[ .(R<n 35733!˸9 41Ziu 2#"&546!!"32654&߳sKRRKKRR޾ܾM~tt||tt~' 5-5-]EQF'Z' d' =:{Z' =:'t[d{]' d' =:u ~!!3267#"&546?>5%!!E:b:2/VNH[lSFU9=&EE1Q~d:3\/FPDB*(ǾcX:=L-d k&$u k&$u k&$u s&${ k&$u m! !!!.54632%32654&#"!TVjhE10FG/1ECpH"K+uu/L{6MM66MMRJ!!!!!!!!!"S)aECb^[o&&zNek&(<uek&(<uek&(<uek&(<uk&, umk&, uk&,#u:rk&,#u 3#32654&#! )#3{*m3*l^]]^l#ateetam^m&1u[k&2u[k&2u[k&2u[m&2u[k&2u)"  ' 7 "yyzy3NPPN( +3254&/.#".5!27!"&'' .vKE.uJ CBpC\eFD\fs>;Du1:9@q.dkKMscdOOq0k&8u0k&8u0k&8u0k&8uIk&<Ru !!3 !32654&#[enne]mcen04632#"&'532654&/.5467.#"!,T>ha;|C3g1AO2X?OL}VR[\ZG NJ%94%@uH9/D7'1Zt2UYnmOKf&DCOKf&DvOKf&DOK9&DOK1&DjOK&DO4{>4&#""326=>32>32!3267#"&'#"&546!354&#"kV]sefRI[|kW@Em fqsrA[}yhMf}unLJDMm)JMOMOf~~CD01kdkdŨŸUO..Oo{&FzOf&HCOf&HvOf&HO1&Hjf&Cf&vf&nW1&jnO(.#"32654&! 432''%'!%<2a/irufjo j_)F!!=dRy-\8 watr`9&QOf&RCOf&RvOf&RO9&RO1&RjVF !!!!!!zI~XˁF +.#"32654&'.5!27!"&''C+kp@G+jo=='`Cb?>aFeD)A+CN{8,,eP~--^f&XCf&Xvf&X1&XjFf&\vV%!!>32#"&"32654&BCiigooghmmb]]7F1&\j O'q;$OK&q{D z'4$OK='D o'$OoK{'sD[k&&uOf&Fv[k'u&Of'F[k'u&O1'F[k&&uOf&Fk&'uRF&GPR$!5!5!3#!5#"322654&#"I&DCjihmmhfmmrr+c\II]ɨeO'q;(O'qHek'<u(OF'Hek'<u(O1'Hoe'(Oo{'oHek&(NuOf&H[ak'u*RFf'J[ak&*uRFF&J[ak'u*RF1'J[6a'*RF'J^k'u+k'uKZ!!5!3#!!!#53!5'[Z~~~~[ջyX¼!54&'.#"!#535!!!>32 A)esCFHcVon#'kkb]m'#u,v9'o:rO'q;, X'qo'k'#u, kF'oo&,o|&Lk&,&u`!!B`f'-,FU'MxLfk'#u-Ff'oS'<.S'e<N` !! !!Bsvyw`e-el'_v/l'2vOSe'(</S'<Oe'lo/t'~Oe'yA/|'y|On !7!!'%[`E` j !7!'7Dtdpd XV^l'v1m&vpQS^'<1S{'7<Q^k&1uf&Q^k'Q~fC%!#3265'&#"!!>32BvF6ls-;OdЃՑx#~"6E\&wF{$+532654'&'&'&#"!!67632ca\D !)e9:BIRRc[Zjyv\77#WV`b./ww[O'qB;2O'qR[k'u2OL'R[k'u2Of'R[# !3!!!!!!"# !2&^^Q)a * rV +ihO{'34&#"!3267#"&'# !2>32%"32654&=kW]v ~epqqAJv'yIJz"kppkjoof}unwf~~CD01QWTT88RVWQ:gl'@v5m&vpUSg'<5S{'<Ugk&5Nuf&ULl'@v6_m&vpVk'Gu6_f&QVo&6z_o{&VzXk&6Nu_f&VX o'z7oG&zW q&7>{&W !!3#!#53! CBG!!3#;!"'&=#535#3LSOQNXYԍ>0m'u89'X0O'q ;8'qX0k'u8F'X0n&8$S &X0k'u8f'X_0&8o(`&Xr6r'|:@gf'ZIr'h|<Ff'\Ik&<huRl'@v=Rm&vp]Ro'Wy=R&H]Rk&=TuRf&]L#3)#3546;#"D`NC $%2654&#">32#"&'!#535!!!hmmhgoooCiiCB'稠b]]brrV,2654&+2654&+)#"#54763! RUURiiii pzG&YU[PNMQsbcaay$32#"&'!!!hmmhgoooCiiC稠b]]bHE 27654'&+!'3 m1440n-1][0-ujju. 67632#"'&'!'276'&" BQQjxwwxjQQBn6666688b.//.bTT@TTUTT[>3 !"&'3254#"\_qOwq_`hչh`78__875IDDI[d"%# !2676!3#".#"3267`pxP+*YG6loagԺgaR78efY݆IDDIO .#"3267# !676;#"AGL9KN Eb7\E202177Tv\#32654&#! )#"#5476^|)n2+k_\\_lG&YUq#ateeta3 ! '&!3276Ynpopm\õ4WW4=~FG578bdrMM{p(.54$!2.#";#"3267# $546y|afTTq}]afgΎ%" )*^V][ifcj76%%ޕfQ!!!!!#3265)G6lo#V3#"!!+53265#354632D6D68CN\8CN[Ad&%# !2676!3#".#"3267#!ax\QMZF6lnqp6]$oFFei [݆GF"P #%32654.! !#"&54>72!C--B!1 ar~a-WC*'OC47Y^&/55/&^Y\_PDI}X4254&'.#"!!>32;27654'&'52+"'&L A)esBIc2kID3&LjJ?5{cc:n#'b]ܔ4aXlrTH]Alvx !;# [nl6FV  !3#!#3Zm !!!632#54'&#"QN[UvyRS%L]]^q ! !!476;#"svywcaZH-Fyv\  !3#!#3B]m 3''%'!%! 7:E"CB"' eaeca-%#"'&5!32767!32765!!5#"&G=UTee[D F\31DI^13D32#"&"32654&D6CiigooghmmX7Db]]7y2654&+!!3 !.#l__l[ Gq92fT=ZgfX֔-/pR/T-6763232767# '&546?67654&#"}uuo]]ʆz))xroyx񃄽j((w|^o%߲ii0!&&FNT&'L56yx2!"!3232767#"&546?67654'&#"_tY۬8b!!__hef`qkjd9W#!,-\Uh=  09:4## +500e0D $323#;#"'&5# &'&+"30fq_D\\"\&T_xdDXW7@.AJFG!!;+532767&'&5#3LS\b7\" EQ%Nrv.+w MY> !!!#"#5476C+,VWN&&i1RQG!!;!"&5#3546;#"L7S쿠D6N%N7N7 f!!;# ! Col6GB߂!'68G' X1 47!!3254&'!!chfrrfhc6a#II8ad!# '&!;27654'&'53F숉[77l6[jCC[[32!'&#"!OdЃ-;w]6E\&Rf;%2'4#"%276'&#"632"''67&'#"'&7632!xC&!h7667hf6776D_U.9zGFEG{|+?#.,RQYah44aa3333iOo~VU))`^rqqrސ^_*)oOi/MY00`YM v:;;:no;:RF!+532767!5!!!Y[#Di/mA.+v#7RF`!+532767!5!!!Y\" pmA.+vf k&$:OK1&D}ve&(z{Oo{&Hz[R&2OO&q;[R&2O0&R[k'u2O1'R[U&2OP&q<IO'q;<F'q\f<%2'4#"632#"''67&!AyC&!LD`N.@;FR@ *eBY3/\0DXhJPH7qpif{,5632#"''67&6'&'&'&#"!!676326'&#&E_I-FBER@ *j !)e9:BIRRc[ZdyD&!\*BX\JPH7qw=B7#WV`b./ww<U5/da'%6'&#&!!632#"''67&'&5#3VyC&"CLJ`R.<8DR@ " QU5/`4EWlJPH>Z Y>F` !+53265B¹8[E`\R @%276'&#" 276'&"367632#"'&'#!5#"'&7632th7667hf677676677..8APQjxwwxjQPACjxwwxiPQCTT@TTTTTTTT@TTUEwnwE`-//-`c\/.bXRV{ ?"3276'& "276'#!#"'&76325!367632#"'&tf6776fh76677..7766CjxwwxjCBAPQjxwwxjQPwTTTTTT@TTUEwnwEUTT@T|Lc\\c`-//-!#'#5'7! !7'!'VCB"KbLfX@LBJJ&S[qs\!)'&576!27&'3267# /&#"(f`PphPLyf++jga`p JPJqf&sȘ!=%DI78 [DR"+'7&576!27&'32767#"'&#"XeWOL21^a,-` KLDD9KOMN=KK^^Ջ pe"W1zWXe !3#!!#3[`EmX#!'!!77#j1f5CBfˇ(vqt#Jsp_J{5.#";#"/&/32654'&/.54632gU\,-"!X8woҶQG7 `efh^`!d9׭Y=005+ #ZTGx4:90RJ`!;#"/&'5!ip[gQGʁ`':ZGxfHV&""#547676763! !#!!2764&#F'+D|.:xSe77ne%/!MA? ~~76lM!|2764&#"! !d77mew"`76l~X (2654&+2654&+3#)#53! RUURiiii pz[PNMQsbcaacb$hm+326=!!!3#! 5#53m{|m[[~~~~bb[b6=b )Be33#3!!!#7!!#!4AK\44]KݾNVyOB '+/!3267#"'#7&'&!2737&#"7#34'g9Nfprrt_Uo/'*WJSn2)b!]u9[RM3fCD01(:!. unK(C2f!3#!#3265#3[G6loj\# F!3#+53265#53!!B¹8[EB`^\Yf $%2654&#"#"325!;# XԊ32+S+ewB>q&$/lvJneI!!7!3#!#53#{ll|oefWջu—F`!3!3!+53276?!53#CՅB@TVeR&% T.`JJJJK€{ %2654&#"!>32!#3267# &|efRI[|EAtyhMhhfLJDMm)f]ˢŸUO..R{5!!5#"322654&#"IDCjihmmhfmmc\II]ɨ{ %2654&#">32#"&'!!hmmhgoooCiiCB稠b]]b` $%2654&#">32#"&'!46;#"hmmhgoooCiiC¹\D稠b]]bF\O{>3 !"&'326&#"OMO3OL:KGB=%12:02Os{&.#"63%"''47&'&!232'&#"AG.\@cH4O44vK=20{PrWD&I79KRFg$!;#"&=#"322654&#"IDD\9BjihmmhfmmX\c\II]ɨR$5463!#"!5#"322654&#"I¹\DCjihmmhfmm\c\II]ɨO{"763 !"'&'3267!%!&'&#"Orrsrpkke~ K::^V663 際0D"!~~n:;?>O{5!.#">3 !"%3267O ~eprr/KlV^t+f~~CD01>f}unl_{ 432767!"'&'&'&#"6763 ?;#"'&5= 6V^:::L$G~ekkprsrrƳ"#^'WG; ?;:n,Q`Vv)?!"D087o[c{Bc{1#"'&'5327654'&+5327654'&#"567632mqSSSQ@ULEi:<=7ujpi-322U56RQPNhi31\p$'(:<'%",*$#  HGa@?c{?#"'&'5327654'&+5327654'&#"567632?;#"'&75mqSSSQ@ULEi:<=7ujpi-322U56QRPNi@""_'WG;\p$'(:<'%",*$#  H+Iq87o[c{/%27654'&+5327654'&#& '&76!2i:<=8tjpi-322U{YJJOwhi31amq'(:<'%",*$#dR]`囜*HGa@?pF`53!3#+53265 Baa8[E^wv\RF$0%#"54325463!#"!"&'3265"32654&ICjjC¹\D^YURdolgeppb\CA\c\+ !65RF`)%#"'&54763)!"&'3265"3265ICjyxxyMD^YUQQRdo66gepb\⡠ !6OP:O_"%#"'&7632.#"32767'#5!]dek񎍐aOQQQP(!"H2((10YX -Pu` %32654&#"&5467!!PTXYSUU5&?)-**-)?UMM(-u`  47!!254':UU/./,H|(|HW;HJ9SJ`!3265!!#"&D @)esBIbp[.w#&)Xb]%!54'&'&'&#"!476;#"67632 !)e9:ca\DHQRc[ZVo77#WVFyv\a-/wwF167632+5326=4'&'&'&#"!476;#"HQRc[Z_a\D !)e9:ca\Da-/wwFtv\[77#WVFyv\S!!!3#!#53[CCܐJ` !;#"&5BE[}`n\S` %!53#5!#RIvk!676=3!#4767dB 54\ 55_ 9JH;JId!3#!# !2&#";&kB5_<0*Pm`X77"BKTF !;#"'&5D"!]ac/.vyH&!!!"'&'327654'&+5!!BmNpMGgigfa``]IJLJMLN !qfst%)655cf54^,%#"&5!32767!32765!!5#"&@>TTeD F\22DJ]23DTTeD F\22DJ]23D32 A)es¹8[EBIcVon#'\Lb]F{#&'&'&#"!!67632;#"'&5G "(]A:BKPQd\Z""\ah2"WK`d,/wxj/.v|` !!!!I|`uuO{  ! "!&'&!3276z$'j7! !8mR +7jk8+{88U2LL2UkmAUUAOa "#";!!!!!!"# !22(dMNd>] A*UV$"]$301265'"32'5 #"&'#"'&7-1ω(Y\NO*TliajDg*rnV@a`32765!!5#"'&'****|DBC>PQp$1 XYn2332765!!5#"'&'****|DBC>PQp$1 XXn23F`32765!;#"'&=#"'&'****|DBCE\ad>OQp$1 XY\vyߢl23V{&'&#"!!67632+*)+yFCB>PQq$/ XVR n23F{.#";#"&5!>32+S+|D\B>q&$/\Lne`%!53476;#"RIca]!"yv.1Y`%34'&+5323!" ^acI1.vyY_A` "27654'&+!!2!&'&#R#$$#RGcc33h9--.!')Cv IH g`JKoHG!0/aG_A` "#327654'&'32767!#!!GGR#$$#!C)'!G.--9h33ccBC HI Ga/0!GHoKJ`_F{7.#"#"';#"'&=32654'&/.54632gU\,-"!X813"\ac`efh^`!!b9׭Y=005+ #b&.vyI4:90 F%+53265463!#"¹8[E¹\D\2\F3"535#35476;#"3#+53265 \\D]a8\DNWXCJrv\F{32;#"'&54'&+\\D\8abD{XW\vwDD $ !3476;#"3##0#";276\\D_q4_T&\"D7WXDԜdxxJA.G`!!4'&+!23#dLSPP>NXY%FG!!;#"&5#3LD\8à\L>`53!!!3#!5#"&5)3276DpBIb@*d:Jb]Z!#&V.`"5467#5!32654&'!#{SFLwddwLFT{$`c{/%7654'&";#""&5467&'&54763 gyNKKYzU223-ipju7=<:Eqma13ihw`]Rd#$*,"%'<:('殭p?@aGH֜O-%#"'&76323676;#"3.#"32767'#5!]dek񎍐\b\EQQQP(!"e2rv\710YX _`Fu!!!3'+"!30#";276BB2h^q`T'[#ܐ0cv6K@.L` !! !!BLOe^-`!!!F`RV)%#"'&763253676;#"!"3276'&ICjxwwxjC]b\Ef6776fh7667c\\crv\!TTTTTT@TTB$327654'&#"676323#!5#53SM34YHGFFDIIټw\rLG`Br+*#҅^”B$3#!5#535&'&547632&'&#"3\vأIIEGFGHY43Mv”š^ׅ#+rB`GLrR '*%276'&#"!!!!#!5#"'&7632th7667hf6776;DmCjxwwxiPQTT@TTTTTTXLc\/.JRHg C%276'&#"!!!"'&'327654'&+5!!5#"'&7632th7667hf6776;DmMqMGhhhea_`]IJLKMCjxwwxiPQTT@TTTTTTXLN !qfst%)655cf54c\/.R 4;>%276'&#"!!367632+'47!#!5#"'&76323276'&th7667hf6776;Dka9>CjxwwxiPQ#!+~TT@TTTTTTXLu78878c\/.9GH-F.#"#"'&'!"'&5#3!!67632532654'&/.547!3ghV[--#!W9PUdkhoOQCL&nZ3adfh__ c9׭S=005+ (KP"(XY>‚)V94:90# %NF$,!5476;#"+532767!"'&5#3!3/\\Eaa8\"OQrSNWXDRwv.+vXY>b`%NsY2:E!676!2&'&#"63 !"'#65&'&'!"'&5#33254#"!;&54LOMMLACBGKK\^T@- OQ,»2WXcG99^H%@.9XY>_9K%N#F :#"!3!67632+532654'&'&'&#"!!!#3547632D?IRRc[Zcb\E! *d::\\DNb./wwjyv\77#WV``NWX\#4.#"#"'&'!!6763232654'&/&'&gVc$-"!W9PVdkhnB?nY8_bei^`!d9V-=000+ (KP"(P1V53:90Q*F !!!!#!BhBL`D) 333# #333# #)lmmmǩmllmmmǩmlsPTQ PTQ)} 7#!#!#!#!SS>)>)\J$4&+53232765!!#"'&5E[ac !)e9:BIRRc[ZF\vy77#WV'Xb./ww\F-%#"'&54&+53232765!;#"'&5E?\Rc[ZE[ac !)e9:BE[acY5/ww\vy77#WV'\vyc#=4'&'.#"#367632 )A%%/45?p9;>S01Ug7BCc%#=4'&'.#"#476;#"67632 )A%%??v`;/34@p9;>S01Ue}CBKL6BC2 3+5327653#c>>vg$;~BCK\cC&'&#"#3676322CO,+(43H d 12\sg>cC327653#5#"'&'cO++(fH G 12\!g>8c 327653;#"'&=#"'"'cP*,;`v>@(24H G 12\!LBD}[= !#32764'&'3276?3#!3--4a+T`$B! ??R|(6')>Z*)s) 333# #)lmmmǩmlPTQ33+53276?ή(76YxA4 WRi***tf t&f&  XJ tX ##5Jڬ@2764'4#2""#"1jLKKLjt'&l&'STTS0"'&4763"kKKKKk1"#""tSTTS'&l&'*l327654'&#"5>32#6|2!"8h..--,^hzKY:m8@+'6%@ vJyQ5*l#&'&547632.#"3l;ZMxh/.,-Z/f: !2}8d5QyJv @%6'+@"% %$G"5-5G%ʳ|f# #ۗfD|f33|ܗ|Fy!f3#'#`栳fy!f373`栳xp#o+XqHEf!#FfTRf#Sfx[p#o+Cq/TR#SkxHE!#FkS`!! q|S`! q|&`L&`L!533ky5!##y #5#53533!ǩlݼݼo#!5!koF 332673#"& YKKY FFJJFQ;I13#R1 32654&#"4632#"&WE11EF02Djjjj7LM66MM6vvv3o!33267#"&546-#5-#E$1U%hn0CI'1 \V5m9'&'&#"#4632326=3#"&2* "}\T B%7! !$}]S!<T%>;+@9sf3#3#\fx2%7;#"'&7""_&VF;s87o[f '#7'373JKKJWWVV 3 5473254'vlAmׁTWW*1')*&1c23#c=1&'&#"#"'&'5327654'&/&'&54632[C==7;+8$77KM@CEH=AAB>?$87:>? -,`d32  .-\d` 373#'#ڄڑ2*l#&'&547632.#"3l;ZMxh/.,-Z/f: !2}8d5QyJv @%6'+@!!5!is7мt!!5!3is4t!!5!3ishht!!5!3is4t%3!5iɼtp&qqf3#3#ݽ fx="oT$'&'&#"#476323276=3#"'&2* "}..T !!%7 !}/.S!2/l;< " .m;; fCefv_fef9_XMqefM  f kFo;1j;S1jjV"#5476?67674'&#"5>321(":!ONH\-u, 1%+&#t^Y.$'$ 02efjfe#D11'VIf###fxx k'jo kF #."#>  YZ FJJF X!3ǭX* 3525#mmz #3&5mlz\f3#[fBCeBv_9#5353#ޥ.#33+bCWn!5!#T4'532654&'3#"&  YZ FJJF!f?_MCefBff fRaTx5!ax5!iH'eb^^e'uf_fJqsPR12764'4#Q1#""#1jKKKKj&'l'&TSSTMS3353v04A!5#jп=n@67632632#&'"#&'"m+:`77`) FH F@@FF0:mD '7'771txttxtuxttx1!#532654'&/&'&5463#" {39 ' z58'RRz .!RSz#f: ' f ffCefvek9e ;'jfflV #"=3;wO.VhNI#5##!5xx,h2!5!5!5!kk2ZD"3#3#E tx[ !#![*>mf+#7&#"#4654763273327653#"'&;4~W$}00N"!;}^!}01N" J\ <2jAA h9j@A m#'+'&'&#"#465463232653#"&3#3#52)$}`N"B#5#!#}aN"?٢N#<2j'<9jCm#( 7!#'73!'3l|kkl(͌m#557'nuƋ#";#"&46;1EF0jjM67L  k&Db532+532654&#jj1ED2짚L76M#;1L_ kL P`5!!j5A!!je '#'&'&#"#67632327673#"'&T '!M0@eed8lT '!H5Aeed8@# $0)JI# $,-JI&5j (E5!'3#7kk͌tf3:ctVH%#:cHtVe #"=3;eO.VhO{O{&FylfO{&yft`85f!#6f;5'lj/f&+yf'#)f'%9=f''9f&-D$f'2>f&6Q*&Fy $%e )!!)NTe(R=^+[ "3254 ! !!Dop^5ddjk,. ! !!-w+0^1 !!!!!!^==\q[2^3e !! !!ES#A4l 7I<['!67654'&'&'&7675!!b) WW*[*WW+ʅ[ʄSO[W rr rq!#i;g!"!3!2765!#cY'J1Z1J(Y6eP9ǗP^g\1 !!67654#"!!&Cp""pd8#\6?vk&''uIk&2ouYf'>cf&BHVf&Df'VF&RYz$7!;#"'&''&7676'&'"7b =J\I,Vf v=dZCF+lT =O.'&xѣV00654&#"32654'&'567>3#"'8FSbFogsYk9|gFE hG1UsN)U+xwC X\Sf(TʲV`!!&'&+532Cd1!==;PVXJ P$)&!"! 4767&5!232654&'&m~ה.90&;vffwY)Fb]##p9С2 ODF8W c{1&'&547632.#";#"32767#"&546Aa13ihNPQR65U223-ipju7=<:iELU@QSSSq\?@aGH  #$*,"%'<:('$pPV#52654&# !!q?+46<u;&&B< V{!4&'.#"!!>32 A)esBIcn#'`b]O$767&'&#" ! 1QPOT0 ,E\^D, -TW^aLWoo`327#"'&'&5!,338<;] Bj@[+Xw` !!! !B?f}R`Au+6X'.+532! !8CTe=M8뚶<LT`w`676'&'3!!h%Sv3&zntB'7[D8rNįt`PV"6#52654&#$%&767!! %$mUO?+46gugAd];&&BeP+ȿO{RMF`!#327#"'&'&5!!#M,327=:^ ` ?[+Xw`V~ 67632#"&'!%"32654&!yoqm""xiCgooghmmĀ]bBOV{&#"#52654&# '&!2ɀ~}?+55}4b ;&&B~7>O<` "32654&#! 76)zkppkjooW;ٓz{8&h`!!327#"'&'&5'A,338<;] ` @[-Vw`4'&'3! '&5!376N.Jj?&^qBCViS(RG_^PaJB@vV8j2!$763676&~?@zL}q1y-j@V@}dxa.Vw`!;#"&/!.+532gUA0eD~B+evGwO6땻-R3wV7`65!!$!!w}C@AB}@d @V@ d`O`!!76'!%$!ru~gBg~urT(798#1'jrF1'jROf&Lpf'ROf'SVdY$ # 76'&! '&76! 03276Ckg1?Tcxo.n2Ly],?-m~`zUt]^i% #6'&#"'$%6!"'&3676F#SEJ_{st{/Cf3@R³#G BlO}վU%P!4'&'&6%6'&H7%&&hl3mv5,X"Q"&UU:?=A/P#$D7kf 9>_ff  :<o3 '&76'&# BC%J&#"327676#"'&'&'&547676763267!"'&#"'632327654[h- &#,)#RgT)P:B4, !2AYpb=%=Q~xŘkQ:FW[f`I]M?"e  D8( $O:HAAC4D&0M`ds.#AL.#YIX^NV!327! 654'&#"!676! ptRKDqlQ4S) eǾLlxVP|DnӻTVa{!327# 654'&#"!67632[xF@:`g9,G|ꈉpDznTQUQ:6F.SllaM/!'27&#"6763267632&'&#";!@/4F##'4PV|5&"$!F47%#1b0> N&K(N 0<1#Z{{/%3'27&#"567632767632&'&#";!5n ,);!-::- :),ɞ9Y%33%9[&"167632! '&7676!2767#"276'&#"/uanr¤&"7}$lyg\s=<<=ss=>>?D8/ߤ27x _VTTTTTUVTU"067632! '&7676!2767#"276'&"*jWcgxxxⓓ"piHnYfa\Th76677889D8/ߤ27x _TTTTTTUVTU3V#5#!##!![`[u1V#5#!##!!MB`p ppudc,#"5476764&#"63 732327# 47GZ6'(\4R8Yn Z6'(\4R8Yt `(oPDl$.8aPm(oPDl.z1F~76!2#"&'3!! "26%xiCl9Room! ]b1©@O{FFM[a|{!%# '&76!2&'&#"%32767TvoupT9paDG 0 ~ihF. !?@qr~! {!73267%5&'&#"56763 !"'Fhi~ 0 FDap9Tovov !~rq@?! ҚV[& ! !!#!24W+DQV` '!!!!J~,N =V~ "26%6!2#"&'!!!5#53oom)xiCQ^^w©@]bpp =73254#">3 !"&=agԺga`pPpR5IDDI5788[&y=&yYek'uek'6u f#%!#3276=4'&'&'&#!!!!!!2G6l87 !):B֭\[銊#CC77##wuel'@v[327# !2&#"!xP¶]Xxofeoˍx6,:rkf-T2654&+!!6!3 mednqZ^][]\8#/(A4&+326!!!3 #!!!Fcnrrmdc[Z[[]^q9y 2!=4'&'&'&#!!!!![\[ !):Bwu5o77##l&v^k&u5Wk&u^ !!!!!!)[ZAN+ $ 27654'&+!!!3 m1440nc-1][0-ujju%e3!!Nn!!>!3!!!lv]4ؾ#[ENAde(3 !!! !!'&kZl&~~VhhuNy(!"&'32654&+532654&#"6$3 aa|{>< T'+|%'&$)67jcfi[]V^1")^ !!!]}I+^k&u !! !![4lh|NTR 36!!!U\#K1+[0^+[2^!!!]+N3[& 75W%!#32767! !F$5l?_~j*"kU6m#EOX[ 4&'>!!5$%ŒZK=>KUr#i;@ )!!!3!9p[ZNN)!!"&5!3!!*[CTHZ:yx+; !!!!!![n[Z#+N 3!!!!!!!;[Z[#ANNZh2654&+!!3 #!` 2654&+2654&+!2#!u8998GHHGIFYb3222&??>>Rsj`3!!F`}gj`>5!3#!##!fVhK.&i`O{H`3 !!! !!'[aUBUa[QQqq9gWsW6Z{ 32654#"632!"'32654!#`Աnâwv@,gE03=᭮8^O2q` !!!qBE`T`Tq&` !! !!BgaR[`{9g`e`36765!!#f$g>~$uY`%IG` !!!#!stԫ`0{\_` !!!!!!B?C`V'O{R_`!!!_```V{SO{F%`!!!!`}F`\eV $/"327&!632#"'!#"32"32654&Z:mm:`777C_ﻂ__ﺃ_a66a:mmwJJII*IIIIJJ`[` !!!!3 {B?C``v!`!!"&5!;!B4ECPDzY` !!!!!!nOBBOB````)!!!!!3#BOBOB```$ `%2654&+!5!32#cGHGH??>>W`'=` 4'&+3276!32#!$#HG$$Bnnnn^? AWSTRR{{!. 63 !"'3267! 큙3t SKb$>>%cU{ !3676! ! '&'#!"32654&B$kppkjoo`?ȏ>{8`;#" .5463!!#GRttRGLrqH@>1jgOm&CO1&j$F53!!!6325>54&#"!$BAplTlJtLٿ#ֹ~m&vxO{!327# !2&#"!ST t4 Uc>77>bK_{VLW1FMQ`!32#!#!6762654&+/g4?~$HHHHv`W`%I$uY7??>>`%2654&+!!!!!!32GHKDv4B?C??>>'`VW$53!!!>32!54&#"!$BAIcLLfrLb]pm&vqm&CF&_` #!!!!!B?C``[23276=!32764''!#"&'#"'&467!3]^.1Ua[a/2.^:j;l)*mnꀅl@d :]/tmiqmw AFf^^ FO`VZ3 #!!!5!!2654&+[9mednu$^][]$32#!!!!!!2654&+6B;ţGHHGBI??>>'3267# '&#!!3676!2.#"!Olg``pť^[f'Pp``gj=XybDI78ѯ87IDLmz{*!!32767# '&'#!!3676!2.#"^f,KLDD9KOMNx)B+uOLNLAFK)L4W1yF`Mw20W1 )#!#!!   Lc-` )###!! 仃탻L dd` )#!#!!!!!!  &-[[  y9Lc`)###!!!!!! 廃턺B dd>`=[)4'&'!!767!!`8TM4`fu vfMAM& Hkr3 3rO`!!767!!4'&'#ޔId&dHC':8&DM'<'MU1:/U0!!!!!!!!4'&'!!76|A@[ vf`8UM4` 9 3rM& Hl#` !!!!!!!4'&'#!7kzB&dHD&;7&Eߓʋ>`='MU1:/UcVpM#"&#"32632&'&#"#"'&5476;27654'43 54#"673767632&#"p."IY1<*)pvZU)?#i?DT8?AQ~}L &X+$)Vw{nWG 4' 5LǐV].3Y% S(}d&y+1EPHt T#"&#"32632&'&#"##"'&54763272327654'43254'&#"5673767632'&#"n^$rG^%, \eLH(>,,X;>T @@"3,1/7G5=vXW}L &X, )W>UI \P '/E_OT$(7d n:; }d&y+-3='&#"!!!!3!3676324 QsCYA>KX1V6`E=JV'&#"!!!!3!3676325PsC@A>JX1zVV`G=J[aO{7 !632.#"! \eck5:f&c4 r{!>32'&#"!CHX15 Q`qV l'vf'VF$$;#"&7324'&#"32765 +5223276767!6Xz{{{#ff#f#/XTMNS?0"&0C]VJt6`『KEEKKK㠱dŸ~JR QJ~d$[ 0Luz[G&O',[V!!# '&76!2.#"Ph*Pp`ag#3[f87IDOV{%!! '&76!2&'&#" OLNLACBGKKBD\2WXRT1'''7'77'77RUlUl`_lUlV[~}}|}}~}c/"'&'&'&547676763!67676762# 8 ! 7 f    F #&#"56763 B\UJu5$[ 0L^VG 053#3&_ez^VG527#53UzMl #/;GS_#."#> #."#> #."#> #."#> #."#> #."#> #."#> %#."#>  YY  YY  YY  YY  YY L YY  YY ) YY FJJFIFJJFFJJFFJJFFJJFFJJFFJJFFJJF4- #)/#53 3#'7%'%'77#%53%JJn3xnxmdyldxܛ  A@¬@yoyo zV!zRRVk&uV&+3 #!#535!327654'&+~~[~Mm1440nXujjuX»-1][0-3#32#!#3!27654'&+㡡tjjs4BvG$$$#Hv`XOOX`>B ?;!  654&+327'7+!! neE1i_~?Vj_ dl_c~:L~vc~V{)654'&"37'7"'&'!!67632r677887g&!x>KiQQCBCQQixxxeHcTTUTTU}/.b b./}e3!!!2N3!3!5F`:}4 !!!!#3!on#D%` !!!!#53!F2?f=!!2!#3276=4'&'&'&#!!!!֬\[F6l86! *wu銊#CC77#FA`32+5326=4&+!!!aaaa8\DD\Fvwwv\\S`3 !!! 3!#!'&kZls$~~VhhAuN`3 !!! 3!#!'[aUBUa[1 QQqq9DWsW6yo'zZo{&z#!! 3!#![{$lhA|N`!! 3!#!BgaR6 [`{9D`!73! !#![n)4n~CQc}N`!7537! !#'!B\caRc[`a耲9g@~`+!3#! !!#53[~~4l~~Sh|N !!!! !!#53B%gaR[r{9g`-5!! !!!Z3lh|N#$`!5)! !!yBgaQ[{9g`!!!!!!!!\Y[Z#Ay9`%!!!!!!!!`DB?C'`V !!!!!!][Ny9` !!!!!!_B?}'`Vf#!2!#3276=4'&'&'&#!!!!!]֭\[F6l77 !)wu銊#CC77#NF`32+5326=4&+!!!!_baab7\EE\vwwv\\S}`[ B6767654&#"&5763232767# '&'$'&76!2&'&#"X51C?2EKD9KOMN!Pp`SkWnj*XR`PVOEK"#kr$1!(ef8704O.{@%6767654&#""'&76!2&'&#"4763232767#"'&;<%!-).OLNL@D9PIKK#/adRV,'-,;24,;vC`u??#i3!# ! ! !c@j&&k@#A%`%3!# ! !!~UUb=#L !!!!!!!!"[YKBC#NA#`%!!!!!!5!!BB}!!!!"'&5!3!!(Z*^[[ !)HZ#Aywsoe@7#9vd`%!!!!"'&5!;!!CLIB !C[V(TKh0+)#"'&5!;33!!##^[[ !)Zywsoe@7#E9+yv!`#"'&5!533!!##*LIB bRCRb[V(TKh0+ ټ)!2!=4'&'&'&#!!֫][! )ws5o@7#K $-676! !32767# '&"'&=!%!&'&#"(DCnqooppm{{ȱ||=.~4WW4@##G7϶.NWcS?rMM |{$-676!2!32767# '&'"'&=3!4'&#"Gr ~fjkprrsr}ikj*! 56W];:xf~~!"D0~ll0F]/&f>?;:n _'G o|{'H,k'<uF'f"32!#3276=4'&'&'&#!!!!Z\[F6l86! *[wu銊#CC77#!F`32+5326=4&+!!!aaaa8\DD\B?fvwwv\\S`A0V!#!!676!RYKCpk3 32765!!"'&JL@@|rTUga>>yHF7@V\;7[f45-.]V^*) `aTS"'`_B08PL ʛ{532765!#"'&54'&+5327654'&#"567632;,AJ%10qΊv=7ujpi-322U56RQPNhi31at19p5'=Pm̎wzh<'%",*$#  HGa@??HV')4'&+5327654&#">3 !!pJL@@|rTUga>>yHFYf45-.]V^*) `aTS"'`_3V{()4'&+5327654'&#"567632!!=7ujpi-322U56RQPNhi31amqCR<'%",*$#  HGa@?pay0H!676!32765!! pk~$uY.%L%I[4RVyT6:@g`ZTf)36!!2!#3276=4'&'&'&#!!!U\֬\[F6l86! *#K1wu銊#CC77#[eF`%36765!32+5326=4&+!#f$gaaaa8\DD\>~$uY8vwwv\\S`%If'!!!!2!#3276=4'&'&'&#!!!![Z֭\[F6l77 !)9wu銊#CC77#yF`!!!!32+5326=4&+!!!B?Cbaab7\EE\`V8vwwv\\S'#%! !32765!32#54'&#$$[76{|76[hV+,VB&6=OPPO&Jn[F1i&&0")! !54'&#"!2#54'&#!%#67|{67hW+,Vh=6POOPn[F1i&& *54'&#"3# '&54! 32#54'&+!67|{6776{х%$hV+,V POOPWTOP6n[F1i&&!32#54'&+!4'&#"!5! -hV+,V 67|{67%%R`n[F1i&&POOQ=6Y0"3276=!! !!2#54'&#!76{|76[[hW+,VhVOPPO*6=n[F1i&&lQ"067#"'&54763 6#54'&#!327654'&"`O NFP~ gW+3NYR788.\..XvLp^F1o &BAtPBAB0!2#54'&#!!!2#54'&#!IhW+,Vg[hW+,Vhn[F1i&&n[F1i&&0 3! !54'&#"!2#54'&#%#67|{67hW+,V=6POOPn[F1i&&*3&'&#"!76! 2#54'&#'&'&54763#"3276 7{|67$$^$hV+,TGkϹ@FlWeY]Q3>/ `OOP?en[F1i&&yf`iF8ADc*! 476!3!32#54'&#!#"327650⏅/[hV+,V{6776{|76`6!un[F1i&&POOPPO0!63 !54'&#"![us#67|{67 &&POOO!2#54'&#!IhW+,Vg+n[F1i&&72765!#"!!!l6#PH,7Z[`b?>N 6= -#/! '&7#"'&=33!2#54'&#%"3254L~.iV,,UhV+,Vdj n[F1i&&n[F1i&&0)# '&!3276=!0us؍[76|~46[ :OPPS 32#54'&#! !n!hW+,Vgaw}n[F1i&&of)1?67#"'&54763 327#"'#"'&54%2&#"3227654'&"\J NFP̀ SJ$!wgrT\E?j][04 !!R788.\..1Yvh3 pSI2 #"/&&hBAtPBAB!4'&#"!5! 32#54'&#67|~37%%hV+,VPOOT=6n[F1i&&?,3276=4'&#54763!!"!2!5# '&#z76}~46+2IzVVTzI1 VVA؍`OPPSCl*1[[1,[[%B: #! !32765!2#54'&; [76{|76qhV+,6=OPPOn[F1i&&nE346! ! '&'!327654'&#!!27654'&#"PN~?>zEFnU,2BEE&2===,!!576! !4'&!<&`}h_)gɛo$lQ,&'&4763 6#54'&#!3!6676'&'&"nƎ gW+3N,(".\y0mdvLp^F1o &2BKo!32#54'&+!4'&#"!! -hV+,V 67|{67%%R`n[F1i&&POOO=6Y08!32#54'&#!# '&5!32765!0hV+,VusՊ[76|z86[n[F1i&& 7OPPN603! !54'&#"%#67|{67=6POOPnE/?6767.546! ! '&'!327654'&#"327654'&#"#C{|PN~?>zEFnU,2BEE3E ?,===,TRfCT7#47! !"33254#"$b#˰:*-cNGNQz%03!Qi@4`,%#"&5!32767!32765!!5#"&@>TTeD F\22DJ]23DA}-B/x9$wh_Wy3{QV` 3!!"54764/&5!3#&4NNqI+7~[ Z/.zCV132:0e0pPuBV^,%#"&5!32767!32765!!#"&@>TTeD F\22DJ]23D32!L A)esBIcfon#'`b]V`XV !!#"'&5!3265!IRQb[\D!)esBLb./wwp[.;<#{7)5#"'&5!3265!67632!54'&'&'&#"]?2QbZ\D!);sB99Of[Z! *<:9u/wwp[.;<#)m#/wwVo77#WVV{!54'&'&'&#"!!67632 !)esBIRRc[ZVo77#/ b./wwRFyJ`!!!B`V7!#"'&5!3265!67632!54'&'&'&#"]?2QbZ\D!);sB:8Ng[Z! *<:9VLu/wwp[.;<#o!/wwVo77#WVVH{'!67632#"'&'!!!5!5"276'BCQQixxxxiQQCM7887766~ޤb.//.bddUTTUTT@TO{RV( 54#"67654'&'!&'&'&'&547632  ;<=**>?wF@^]86Y^\C'&+sY24 *Nz i 50L& 1ii}zD?o2`fxU !!5#"'&5!3265!hVIRQb[\D!)esBb./ww`[.;<#)!!!!EE}}Vz#327#"'&'@ ^+srdBU@D!"vO"*3#3#"2*'^* 5!73#3#C2*3#3#'#5#5!ִ2"j3#"^j'y*G 3#3#73#"pᴴAj!!Av;^WC#5#5!ִI3#-ZȠW'6&t+3#7+Zd"C3#"-pcNq!!d5qW!!XI$ȇ8(!!B(k 3#l3#`!!!!BB`Ta0!!76!#"=\Z&wy12^z|KJW*#5#5!ִI`!676=!!!767'UF 4B`Eb9 4`IY6`) MԛwS;$ M uT@`4'&#!!323)!21y?͸fJK0C`4'&+!2!'!21y~Ƹ6^mJK<"0@v` +!!Ǚ4```)!!4'&#!!2B21y)pηvJK.`!+;ݡ2`@I` !"+7AcP` K`)4'&+!!221ypηJK``!327654'&+32! '&B'4%ciizh`F[{rHzN^0`!! B2!@V` !4'&#!!221yCV͸.VJK0_`3!27654'&#!!32+=/;;;MlYYMz9H;9x_0@S476=!!!+ݐ2BЗC[Tuzl0`!2)!4'&+pηBq21y`JKoa !#!5#"!67!6C-CT?8?TB.yak4ATݏCDV`!!B2V @`4'&+!)!21yv%U\JKyz0@1`#3)2! '&327654'&#BzgB'4% b=`0/[{rHzN^=OS`%676765!67!&T5-B:=ޑjRB5NAuxL&V`!4'&+3#"'&5!221y7d:pη VJK6U' Yi`"#3!27654&+3#".5!32+n/;e*91MWK.AlYYA,9Hr6T<-Fga;-x_ NV `!!676=!B(4B`G4`;MԛsU%`!676=!)!UF 4B`Eb9 Uj`) MԛsS;0V`!+7>54&#!!2!Qvim9RO'BvVڿGi&4Z@` )4'&#!!221yCV͸q.JK.L`6765!%7676!)!ݠ6!DLu\TBwB]8k.%v8`@`#!2!4'&++2765η21yJI_"#N`JK6a`020.`'P.`'P,`'N`3#``3#3#`|R)3Z1u 327654+53362-$#,j6{C=<.m % T2K\4'S !3!!ZE1u~!54&/.54632.#"!&=9UFTm\HNV039`;--K>9Yb(*BCOF.\4:bR1d(&76767&'&767632&'&70/Cl!>ei];?I13jsoŜ(A}sOQ<,*.>\#EKO?'do='eo^= 'ef>Y 'fo=t$8'e">Z!!Bt'*vX'XtR'vtL'v /f'@#C /f$3 7!$'&54767&63 wӰ]Qw~\KyV=@yj\ƚ޳}N)?& /'2 CpJR%676'&'!'`A8LusGB.QWy3˽.7=pJ'~ E &!6'&'!! 76(A.B-OsegytbeDA 'Gu W?6'4/!765!325!#"'&'#"'#"'$47!327659B K@"B "&462-9)*88*)9ΐ-@?./?@栠l-72767"'&'m_+F6@5iG8jLM$!'!327653327653#"'" !,N- $$ *  #Q--a5WY9!nRe6L2o'*#6yCD**7"2767#"'&54767&'&'476[4{B0mxRe1[YPqMAp[eZ`;OA(1* @'"% 3@Q.$J!+%}p}L 0:?yEu$ $27654'&"  '&47i-/#Y#/.ׁQ^p!p^QBiixx2C"!'#"'3 !YH VY3\S22J677!!''!2-T3MrI55JrM3T-ze:^eJ!66!!&&2-T3rJ5C5Ir3T-ze^:e:A#"'&'&'&76!'&'&"8RYW(Rt !QS0L%!"G%MM \^Z[B/GXqg`H8654'&"3227$#"'&54767672!$'&547!|!-'*,.ÍCgXXb]H76^wEIBL O&;1(b2VT4,9*9-YΊnع2>]!7&'&767632&#"?eF10+v;8?4&9c !"(j+(} 04Mt'4vt'&vt '&vtR''vt'vt 'vt'vt 'v /'e8C /'.PC /f'2C /f'<C /'VC /f'C /f'C /'4>G r'g>G m&'gG ' Gu8654'&"32#&'&54767672!'$47!3276W -'* +/2A"9BB)yO&;1(RT4,9*9-Y}i&; Mpv1f/'uJ'\uJ'\t`-# '$&7!32767654'&54767:B.M\F- !XU=Ќ[+$?.\^Zc:#=$$d|?O#! 6. *Z2]t`G''g,Uq#"'$47!32767654'![pӟ~$C&1F373[B\8-",ckJ6_wޤ /'2 &C r'gf>Yt$8Zt$8r'g">ZXXhiOjMk 3'&547632&767#"'!'!aSKPQ?Q ,_J !,P!'fG=#" & QOG-!nHX87.$&327654'&"327 #"'#"'&57& 8888 & U/=&%<0U||R6JﲱJ6R|ڱee&* 36767"'&547676&#"767?y_1yXuR:);1/UY|Q~*rK,mXv!#AM311DvJoJp:AqX &"326! ! P___pn`Z   mstm~3 !!!%*U2I9  HH;p !!!!(HjG"3Mp )!!!!p#kHp !!!!p#HjCTp!!!!pjGap)!!!pkG)nP!!OHhP !!!{HS=qR)&'.4> 264&"%0-v쉉v-/ccc 7oo7 ٜnnn!!B+O264&"  4J44J|`Cꋋ*T !!6|Q 3!! bdB_)!!!_<B?Cd_!!!_<dT !2>4."!!&'.4>24?44?4"c-! gyywwh "ZK--KZK--( 6ظllظ6 _V !3!! ZU<` O!!#!#"&7676! 54&#"37ړJQ %/d5%3i:d)Ģyn~}w>Qc^ !!!!!d^ !!!!]+95#3264&2#!!C@r\a@CdpvY!!4'&'5X#( 8tC7a3!8+-TB"34632>324&#"!%4'&#"!\(.%sPI1=;x 0s-kx&"r¼v;_c~ !!!!!!tBDD!!!!!!!!!!B BDDoo_!!!?dd! !=tt-+B #2654&+!!2+Ldfq]@ ߭ޙdRNGRd9d !#!!3B+DO3#"!!#"&543!!hD@r\`­+9pv9d!!!+ !!b-O'!!&'.467675!2>4."ZX"i;<<6n#%gyyg&E4?44?4 7[\\S?t 6ظ6uBZK--KZK--!!#N + )#!!!B  !!!!# N 9+dO %2>4."7!&'.46767!4?44?4"i;<<9k#%gyyg&BZK--KZK-- 7[\\X:t 6ظ6uO)!&'.467675!!2>4.""i;<<6n#%gyyg&n4?44?4u 7[\\S?t 6ظ6uBZK--KZK--X!!6s'7326=3'&'&/#3"  $}.1Q  {l @9JO  fU;L13#U1wf3#'#^栳f<)l%'3!<^s'773#''&533276wYk{  Q1/}$! bf  OJ9@ <)l!3(̼_~QMIC3#R;13#%3#d1tX!#2Z`XJ!3ZX`_3#!!]<w_ 3#3#!!]<!$(1#!!53'#67654'&'#67654'&\jxXTk<:~{bA&33%b$((-" HS`! UU|^[XU +WV* #EC$O{ 475"73263 !4#"bՔI[KMMsf9O4|(%&#"# 4-654# #"7676 !26324/<`Tu E2%jFocxfnpAP\{z]A0"qO{$! 63247&'! ! Q(z~|ebt{ha-xYqy z%| !"'&'%325'Ki`VW ܲQ_H"% !! 47&5&3 7A 钌=y~]y{ !325!%&''$67&5! 2ds{gqwhrSfno(?Bkf?nBk %'$67&5! 25!325!!"qwhrds{#Bkf?tJkkfnV?-`325!!#&''.5432325A(utZ嫵#`6RV~uЕMH"% !! 47&5! ADq7_fDy~\xox;2  2AXG$$&%6&%$! '&77$54'&  ɖm=HRuhDU K">6R,2?9J,Ri`T c&K{%'$35&#"%7! # mT1cQtPC&7VM,2rwe!;GX<<|#3654%676%$'&7] ~呆 *+]|DbZ*KXR_T ^& 4'$6'7# ''$[ uLpy LUA@cNNVa %!ifƊX=,2r Q(67&5%$5'&546!4#"%$oa =Hv,SQ@D0Xj *MS PTta%$4! 5'$4aF NaAhs[; h^B^EX+&%$!632'&'&%$'&5 76a3: hyVNPđ Wb1S Ee<,QV0*"%Z<i7/ Ov/! 6'&! ! #"32?632.d.$kkfx~Ҫ43)'"ixFA'^L,"'&76'&'67pڽf NVa^H5)F2.eWsG!4#"! yF7p   > & J7$ 52'&+/#10~9e}J7$ 3!5254+/$G~9fP3}J7$ 52'&#'57+/#1""##0~9e}####J7$ 3!5254#'57+/$""##G~9fP3}####&7'6'&762'6---1&3oRav,.--Tbڂfw&7'5667&763253% %-:C; o f@TwdD:0;QFL, &'676'&76pVaVN ,sWf-2G)4G^254&'&''&7767qhY+XgrXT:",SVG=62%&'&=2/765&%&32?'&'&<~tkv|9=\2:4bnwTw> "NWO+Nߠ_a?)sP/k7hmu~Sq3| &5!2&'"66iR? 0#eoy^eD(<|'N}! 54'&547632&)Ցe4T_̒[[`Zjixz;kS+I4#"5! $! 4` C\?zN.i.8x&'7%!#$'#-!tXђt(bS.%! '&'%! 54'&'&'&#" ! 32327632Kg~P ''*A0%&&3=sY4a]kh]jHjiwE#|{Y!567&74$7673WJ1Em %.Z?^1H476763676'3!#5676'&'&'&3&76'$mGb*gW/A67 *ut7.,>U 3533##5#?ٷٷzۺPYZ +&54567'6&t7=;:566y4"327654'&' ! '&476ޙJ64FM,6FrYdec{X`Wp`~|Ĕ.1$!764'&#"676#"'&'&5476!  Eڽe@a?Y& ,ͨc;3<epyՇu8pH/CBe+V4yru 9\X$327"'&32# '&5?5.qU2u w|tNpeH@\`u)ͥ}Mp-Z7!#&''.5432325!3254%$476232?'&'&(utZ嫵#BUcg;@-cndCB $RV~uЕM đ"mysR0hmIRrY!$#$'&?5!32&532:pePaEP|Ym\HMY+32&532$#$'&4767&567!'ePaEP|YItj :RN\HMe:^~Tt\Vvp:0%&''$32=!3254%$47632?'&'&Seq,sofsUbg:A-bodDA $J 7#!!"32>54&'7:5ajha4:Z>']zFHcdI!*rѵi99irB3YjqœUTr2S:sk_c##".54>7!32>5!306u4gM'?R*2<_A"!;N.*Q>&K65Ro]n0F;6^E($AY6%c !4.#".54>2!&/3)0-IOFuo@T4'&5V%#".4>7!!!3HXgpeYH2>kSWk;g]{X17`O?Na6A|o]C&&C]o|A`zFDzbp3]̺00c8$4.#".54>32$ 8L,/P;#6:8X>!MheLKk7Z@")F_lE>z7oTMpc/$"5#!4.".54>32!J(1) ))PR%".5!!>32#;P,dp 8N\P;6MͲKq2n4jKn]E'y7_G((GpÑSSp4PH'7454&=45"##".546$;!]8tzys8~ӫW,d hÕY :EEAZu 9ir(~c]V!!!KK c-+4.#"32>#".5!>32 9M.0N9!:N-.M9 3h9E~lW>!2k9eK6_E(&D_96[C&$B\ T%D`vK-Tnc,4.#"32>%#".5##!>32 9O/1P: #;P-/P8 JhgM9i9jI6_F)%E`:8^C&&C^8qŽRRqJ.!Rc+"32>5##".54>;!!!U0Q;"";Q0.N9KehNMil'E_76^E((E^6oTTorP!u?$4."!4>3!!">32.!9NXM;"Kfv.N: 678K5^F)5U<ApĒT*Ha7%1 H\9D4."32>2>53#".'#"$&54>2 Lê~IG}dfH-3$>^wAAza@'h4`a5;8kOH qƒTTqɊHP*;#_j98`Fs-rҶj::jr^+oHF%-(ch#".5!!327>5!gIeEmX?"M!:P-Y8oT'GcxJ+7aH*K$_<=c&#".54>7!!32>5!59;j}F".;J)3L0,N;#K%Rq!CB@0F[96aI*%BY4#c###".546732>5!!LfhMZX90":O/.O; oTRq^vKo/6^E((E^6F5u?#".5!2>54&'7>KehJ :N\M9 >54R;oTRqF6^E((E^6.|E;{ysu? 4.+32>%#!!!2.#;O,,O;#JFGՎPeL7`F)%B[6lMNJ[THMD4.#"32>#52>54."#".54>32 IdaIHcj|D?oZ&D5 %&$GUe#";+!#".54>3!2 2TtBBtT2CtT11TtCnZ}|٠\\|5}֞ZLd:&9b9cb8jb]b釈bdc5#!!33!! K3 u?$4.#"!4>32.#;O,-L9IgeLKZ6]E((E]6Zn‘TTnc-#".5!32>5!2p6eJ 9M,,N:$K04Ro4]E)%AY3%c3-#".'!32>=#".5!32>5!3Lg_S%9J),O<"2l6hJ"9N-*M:#qR8v}FQ* )F]5;MPq6^D'";Q0 u?4.#"!!>32. 9L,&M>(0t5dKK5^F):\CZ[03RoiHM$5#"$&546$32.#"327!8ADF"hhk~w0^TK}s/!o..pOW2$^^c)"32>5##".54>;!!U0Q;##;Q0.N9KeiMMi'E_76^E((E^6FoTTorP35u? 4.#!!26%#!!#5!!!2.  q"4ZxCCxZ4!, 4D]e52n[6dQ%$B#".'!32>54&'.'.54>32#4.#" KeaR%=P+,M9<@OQ>]<Kg?zlZA%/IX*.P9"5Rf`Q/]L0~ƉH^߁HzZ2>bE(S/ HW`1~ƊI-QqSL|Y1>bE 90* G[hu?#"&'!!!32>5!>Ke9m0P!:N-,N9!nR.3[6S9'D\6c8 !!! #!m^dwe0c #".5##!32>5!JhgM#323J  , )8Pf<@S '5[i#BrXc$I2#".54>72>54.#".5467>32.#"p[:Zzy֟]!A9&+0UrpT//TpBDuT1+5,lF;s\A !m/RoD`b>][gG.://#M`65_NL{W/>eDGu0,)$O|W76 !,%c #".=#!32>5! $$Pl>.0.$K! CsX>jO-(6c-!.'.5!;26765!,<5YCz,8;69i51cO~%>W9O`0Y)M('JfcH"32>=4.#"32>%+!!#".54>;5!5!54>20<'#*)q*;hRq54[yGG{[44[{G8>jh;A3."".t6('5%3Zc4MLa88aLKzV/WrCDtZc! 47324'$5!Wb@MA'ms_/W>)Z#"36! %56'&5!`\CnB<>$a^"$d+hZi)%4'"32%! %674#"&5! ֭93>$hRB'OM , wfzUsZ(#"3256#! !263skbKR=`uT)Z)'6#"$! ?LHCoŽ ?i%! 4732=4+53654!5 Xc4BBYcrahB)&GkgZb)/7$!263263 654#"#'4#"#'4#"!&%,t_LOGRy y2 xe_糽{u7fq Z#"32! !54#"!! oLg{S"$SМgm#"7! )!"7 [`1[ 6A$Jy`Z~)56#"#'4#"$!263 ~%p q&ANJG 2溺NZ!! 47324#53274'$!'Ya>1AZ7sa>m!e>W0Vr-jO%! !3255 '4%5%*-wP}UZZB#56#"#'6#"$76$%263 ~ [?9u;U4*@:APX.zvl! !324&547cV^x5ۈo$>:ZkA ! ##%3! r  ?!/I1Zi) %! 47325&#"#'4+53263 ;\%Qk `4>Lfz2d~yǢ滻SZi)-#"2!!32=4+5356#"$!263 $ii*|^Lhp/7QZ%RmWZi%! 4732'#&!!!YaGt{fTv?P;"M&Z(%67$!263 66'"#'4##&'&-MHQpz~ vx*}O&w0Z 0 ֺ_ؓiZjJ! !32=%325!Xaa hmk2B܆Z"4#"32! 4#"#54#53263 oLMTdy{:N7 "$j#ţOPFl4#"?'6'!! yumnej,Yi-XZj3O ! 5325&+53'4&'3 DMxp?SEf[%mzxXZ#"32! !!Wb?7,P(l"32'!26;'"#5&#7! t6G<zeWUQh+ pFPOn Zh,3'6#! 473254'&5$%!3#FjxZ\^@he';3 4\bjxw%Hdt:TXMD"4+dvl&32! !7_Z5?%\Zh! 47754'7%3%WcJF$U"1lk_aT#}5y <~HZ'! 5!3254+5354+53254$53Z_$$$&v{pxך[PdN]3{F$7WZj8! 4!3654+53254+53254+53254'&!V#CO8.ó8zy85||57zz7_}}~~]e3tp[b\UFB$]#>tU>KHEeZ)6&7.5! &'q``dbnq5 Y#ݒX!RWZh+% 732=&+536!%Zb^^$c mUm%Zj"%! !32=4+532"32%\^ol\뭓d43 ҘVZ'#&3257354#! 35# ! 3#3烕.Yaeaaat5|`omvktvZj)##"32'!525#"3$!263 [!ːTC.HRHxӳ%. Zi9)%! %654#"'! 327&'79@J^ da2iP~gN{|g(5QYJ9CkljJ!32'4'7%'327!! m[h aaXܢ54#"! 6=!! 467$vY[Q]IlGGedst^.c{fAxxD^3qZ)%&#"'67.5! '74#".sTHH6OOL %r"N׎PWmf.=c !!!!!!s~cC$4.#"32>2"43!%  VAa@ . 0!$6#&71>gL?;܏  !  cT#+ r'Wo ! !!#T l'vo%@5l'vqk'uq'q  VZ?l'~vuL'm ' mL'o &o Ll'p l&p 'q'ql'rl&rl'r'u'ul'vl&vl'%v3#ni!!3V"NC9'ǔ97:3n#p"&5332653pԖE11E@vvp6MM6pnp]#4&#"#462pE11Eԗ@p6MM6pvn#p]!5!2#!5!264&ojj2DEÚ짚MlMn#p] 3264&#"462"F02DE11Eԗ@7LMlMM짧9''üOOOOn3#3#,CCnd3#dnp5!on#p] 53533##5oКn#p!###o1 h'm ' on'q 'Hu !!!-]c\e+ r'W ! !!-w+ l'v @pzsx5l'vk'u'@pl'~vL' & L' & Ll' l& '&l'l&'&l'l&k'un5Oxgn>3#o0!3265!! [m{|m[6=0r'$W03! !4&#"%%m|{m=60l'vx3!2654&#!! !)m2,k_\\_l##ateetaxl'vxk'ux'gX) $'&5476$)!"3!Xl_[[_k,2m)ate etagXl'v''Q'&Ql'l&Q:''\:l'l&\'g'Xl'gl&X&n#"&'.5467676;#";nD<99P\6GC?D@C@In4 #"&546323>54&#"4ȗ*e3\P>:T[>@I@C@D?CGKY'Y&KY&Y&K!!2!4&#"*=|UZszr' W4&#"!43 ZU|<*nzs l'vK3265!# ZU|[nzsKl'vK%k'u!!"5!326Z[|UZ szl' v'Kj&'j&l'jl&'Kj&l'Kjl&'j&l'jl&&n43#"&53326eϼ^19_6@JJn432653#"&5>_90_ȗ@JJ@6ʉ2!!!#+Qr'W Q)!!Ql'pv 2!!![XM+#2l'v2Ok'uQ!!LYNQl'$v& 2' ' ' l' l& '2&l'2l&'&l'l&&n!!>~ZCn#"&'.5467676;!"3!澿D<99?(%%*=_V4\ :8 8: uIBC3n,"&53>53Θ\33]6@II@6ʉnY"327654'&!5!&54632=*$$(?>'&&)<|4V^\ :8 8: u3CBI! !2654&# w\ne##WPdmKJ'/:K!"3 $54$)en\w mdPWKU'_:2i!2654&# )2em[w8#mdPW#2iU'$_<2iU'$_<K! $54$!"38w\ne#WPdmKU'`_?'8`&8': K=&:U'; K=U&;'<#2$&<U'=#2$U'='? K=&?U'@ K=U&@nY!"&5463"3X|M>IBnw0.7? %-  @ dd܃K !3!5! ZvpMr'WS 7!'!3 [ v_jl'vSK %!5!# Z__pKl'vUKk'uU %!#!6![_?jl' vX'QKL'Q'S'Sl'Tl&T'UKL&Ul'VKLl&V'X&Xl'Yl&Y&Xn% 4&+3#Pfг`n'.#"#"&'532654&/.54632A~8KF/@XqMLLCCH0IPyoCDZ+,"& si++/,'+ud}n% 0#5473#"Cgέ4`):K[3265!#"54&#"!632P*Y-ZP*Y-Nn Nn'K[432!4&#"#"&!326-Y*PZ-Y*P nN'nNK[l'?vmK-.#"3 &576!2327654&# !"&'&gEV8\wON _@\6[w8H3 !2654'&#"MH9w\7\@^ NNw[7WDh~WP}+FS~#WP}-DKU'_qi'lK 'lli'mK &mlil'nK l&nl 'o K 'o U'p K U&p 'q K &q U'r K U&rn-#"'&5463"326767>32#52654'&#" -+VaVG6 7&9N//vr_WH6!3*=OwMQPFz0-F(T.sGWNGz0-F'[!!!!\ Hr'W !!!W Hl'v!!!![ XHl'vfk'u)!!!X [l'"v''''l'l&'&l'l&'&l'l&l&n)#!3!y}םn#p]nE 33# #cڄۑEgV265!! $5nn,. dlld! $=!!265lZ/,mn # dlld2^!4&"!!54$ mn @ dlld # J'/)4$ !!4&" @ nndlldU'_3!264&#!! !#enne?mll'v!3 )!264&#![ennelmK)# $54$)!"3!?ennelmKl'vK!"3!! $54$!3ennemll'KMl'n)##"&63!!"3!(ϛjCIFFS:57< -5-   @#$]264&"&546 0!!dee eLbc]c(`DD`D!gI7\w+]r'W]264&"!! &54deebLe `DD`D7+w\7IВg!]l'vN#"&4632264&"eɍVGXeeeKВ5pz`DD`Dl'v(N632#"$4&"2HVɍl'gl&Xn *32"'&'3!#"&'.5467676"3264&3Y?. B1JJI(澿D<99P\LGC?D@C@I^+nEnr'n&nl&nA&nAl&n&nl&n'Ko!4&#"!!2#|UZ*=]szn43 !4&#"!7X=*ZU|#l nzsKo# !3265!ZZU|;Snzs'!3265!!"5X;|UZZSszn n )r'n )'n )l'n'nl'n )'n )l'n -"32654&5!"'&547672326=3#"'&@KHCDGG°_VVsdU-ExEPPPPV;75><75=^6IBc<75=;75><75=9ScRRySSi`}i`%!!63 #"2654&#"[\u'aUnhan|66yzsltmz32654&#! )|)n2+k_\\_lq#ateeta`Q#";! $'&5476$!||[l_\\_k+2+ate etan* !!!5!{RE^߁۝#n*#5!55!5!53!!!75p p'4fV찃5ܝqq__s 373#'#ڄڑA2nA'n 'n9' *n9l' *n ' n ll'n9' *n9l' *!!!!!!PPA !!!#!!QPAA !!!#!#!! +QPAAA R!!!#!#!#!! dQPAAAA !!!#!#!#!#!! QPAAAAA!!!!ZXA !!3!!!ZZ AA !!3!3!!!ZZZAAA L!!3!3!3!!!ZZZ[AAAA !!3!3!3!3!!!ZZZ[[cAAAAA+ !!!!!!=4~AAf!!3!!!!#!!Ƽ~5}ƼAAAA!!3!3!!!!#!#!!Ƽ~Ƽ5}ƽƼAAAAAA #!!3!3!3!!!!#!#!#!!Ƽ~ƼƼ4}ƽƽƼAAAAAAAA +!3!3!3!3!!!!#!#!#!#!!!=Ƽ~ƼƼƼ~5}ƽƽƽƼAAAAAAAAAASB !!!!!!ZPPmmSB!!3!!!!#!!ZZQPmmmmS B!!3!3!!!!#!#!!ZZZQPmmmmmmS RB#!!3!3!3!!!!#!#!#!!ZZZ[QPmmmmmmmmS B+!!3!3!3!3!!!!#!#!#!#!!ZZZ[[QPmmmmmmmmmm+!!!!!! !!5~114+*VAA@ !!!!!!!STsBAAjX! !!!5!!!!X6_v;#!# !!'!7'! )7'!77'7# @?@@h2@f@?@??@32@@@@@@@@@?@2  Lm+/37;?CGKO!5#535#535#535!35!35!35!3#3#3#!!#3%#3%#3#3%#3%#3#3%#3%#3ZZZ[Zqqը]g!!!!x1e!' 7j3! !j%=<%` )'!!!3BCar`J\q`#!5!#!!!!!P LF`V`O4{,3>%#"&'#"5!.#">32>32!#3267%3267%2654&#"kW@Fn eprq@[}ygMkW]seeRH[}MOMO> f~~CD01kdkdŨŸUO..f}unLJDMm)$` %24+3#24+2)#53Svffkrrk_ȏYbX3ww&:jO{Fga326&#%'%)jpQGEEGQrw{kB"%WK}LW$&$ga'%#53326&+3)MRwwBfaFRWJBv` !!!!!!Fa3`c{1#"'&'5327654'&+5327654'&#"567632a13ihNPQR65U223-ipju7=<:iELU@QSSSq?@aGH  #$*,"%'<:('$pL`!!!!BBB`L$Q`!#"&'3265DC~@1[/[T` !"!`` !7!!'7FdXd`iCG`q`O{RO{Or4&    ߚ!~~|DDFO@r%!>54& !.5 :-+-,@JPT@TV0VX +>54&#"3267>32'#"467'7]%:}'<Fo'([Hq()UK/w}HO0u|CDjKmFEE!lMpO{&/=5!.#"676326763 !"&'#"%32767276'&#"O ~ekkpqtsq``AJ_atxHJZYzK66V^::l7997li8778+f~~!"D0)(WT**؜RVW():f>?;:nUVBVUUVVUO/{ 4&#"!! Sojkp'$/8Q/ 3265!! oilpP/8]` !2+!32654&#^nARELLE`MFGL&` #03#"#"!6767&'&54763!!~GGR#$$#!D('!.--9h33bdv HI G>a/0!GHoKJ&` "";5!!"'&54767&'&'!3~R#$$#RGBCdb33h9--.F!'(D IH JKoHG!0/a>G%```!3265! &5BKTVJD``vddv`{%!323267>54&#!!#dR)zk "XThF.pfPl~,|!5353!323267>54&#!!#-eR)yl#XT|hH.pfRn#{$#!!2764'#!!2764'!!X,3!382k10,100t!&UgtY;(88]pf##3h 4h`Y@g`ZR`]h/`%2654&+57!!!"&'2ruxvpO1L3/onp,)*+SLi--:;`3!!H``N_`!!!!`}]`5`!!6765!!5&'&5B9 B 9Bbb`au2 X 2uavRRve`} !#!#3l6;9s4D3M3'!!!!!!5!#(\RQVj$ &27654'&+27654'&+#!!244yA"! "BKFNSSINP:,+76,lOy<;D54t=Vj 327654&#%32+ENGFD;;D=AB}|6A9JJ]_JJ9A6j !!!!!!jN\ࣜj !5!5!5!5!5]9d$#"'&54632&'&#"327675#5!dRXX]{|UMNDGEFGGFDC}#U'ut(HHHH ja 3!3#!#jB?bjE3#jE 3+532765jVV,!E#" MN&%Ij 33 !#j;h1tHIj3!!j_j !!###jËAd=ja 33##j4==ja ##3a4=D=9 "32654&'2#"&76dmmdennesttsttSstjsstsGe ?"27654'5#"'&54767&'&54767&327654'&21221100jX_/0\g54ceee45h`,/`B?//$`K7..-!!>=!!!!=?!a27kG/064Q|@??@|Q4604,=8'W !'!C<j$ !2+#32764'&#jky?####?pjh !27654'&+#!2#'&'&#DD\NMNQR-#$$wf 5m9:וD78xSj $#I>!!#! _jE3327653 '&5j""OM#"ZZZ[ h,--,h VWWV" 333# #"Ғђ``|b +"3276=7#5#"'&5476;54&#"5>32?A-9(')33Ic>=MMxLQA880AB**&)(=L]998[n440, b /27654'&#"367632+32767#"'&? .9'(*24Hc>>NLx'&PB790ABBBKM*&)(=Lf]998[n430 CCb 53#5#"&632264&"?)32CuuB24DDD\[8"3^^^b6>L#"'&'#"&=!&'&#"56763267632+32767%3267%27654'&#"D~8T=>(,sF,,OACCGHIHGfKK)9?@NnA@NLx'&PB790"!7;H 4>!.9'(,+,9F$#' 8<77^n430 K9##B=d*&)(=b  264&#">32#"&'#3AEEAA#""#E)gAvKKKKvAg)^^0//074\\\\47[gb 3#5#"&632264&"?)32CuuB24DDDP[8"3^^^b #!32767#"'&5476324'&#" &,,Q?CDGHHHH_`^^YZ""6;%$ 9F$#& VWXXYYR9##! >b  5!&'&#"567632#"&73267b,,OACCGHHHH__!"6b#+532654'&'&'&#"#3>32>=t];+ ?$$-g?n98}CC4KR 10Us\74BCb "32764'&'2#"&6C$##$CB#$$#B\\\\00000000WWWW6b67632#"'&'532764'&#"b1/12aaaa1200$++/V////V,*)* WWWW 1111 b4'&#"#4632I$#BC$#Ժ\\Z0000ZWWb327653#"'&506FBD#$ӹ]\Z`00ZWWb #3>32#"&"3264&.)gAvKKKKvAg]A#""#AAEEb\74\\\\40//0^^bd3#;#"'&5#5355hw32ee,21w b3327653#5#"'&b ?%$.g>n9:?2MMLB 00V5[74BCb!53233276767654&#!5!#|@3OMM"! aX|\7 ?H.23=mrb`(#"'&5332673327653#5#"&'55?n8:',:?$/: %a:Be:BC~C<^Y4hb533#b̝Oa 5654'&#"327654'&'5647>32#"'$3>#"BHB$d]O@~,,sB-&9T5QGGQ1#/! /0YY/0&'P0PB&H1e4.9/HqdJIk3#5&'&+532A\˧&\&W%S1 *2 +&#"#"'&54767&54!232764&'&E`Pa^]^^]$T+Q&%&@A$&Q8`'74?KXWWXuZ,Y' 1XW2122TJJ 2#5$47635676&GVP]\M_ OKHS$$WH/0F9v6KN73;#"&/#'&'&+532vY?^hl* uZ?uJ78,9H-Ti.'(mb.g dcCudbsrdb5suda wvdswda 67632#"&'#4%"32654&LFHDnSKuBf*SBEEB@FFH TN47%_^^YZ^JJyydszdFy(>32#"&'!32.#"2654&#"BiiB3ۧYTRdplheoob\\c !65jaNS`%!535#535#5!#3#RIF!!!+532765'!BCaa8[#"wv..tb #367632#"'&"2764'.*24AvKKKKvA33EE###\s[8\\\\^^///b&'&#"32767#"'&7632*)*,V////V/++$0111aaaa201 1111 WW6WW bM1;25&#"&'&#"63+0#0#"#"''45&'&7632 SJ/**),V0.:_ (r>-aaa201 * 11XE-c@0&)W6XV b/&'&#"327654'&7#"&547632''7'37:BHIAB#$]B\\VUlj?<JDS^00ZLHHSWWKJzBH6qA@H6ba1#"'&'5327654'&+532764&#"567632E#$MM4453)5/-A%&'#IBFB!?6"00"3421 ((?a10  "~0( PT7#$bP#"3###5354763Op+ee9;y&,,f11b33#+532767#53ee;=te#:xxv?CBb ,#"'&5476;#"'&'532765"3276=?)eCtLLLLt`a;8786233d/.?F"!B?##64Z[~ZZ̗PP ++\\TV-,.-Tb3327653##"'&b *?%$.44>n99~>R>01V4P7BCb3#33##5#53rrzzQmmb 3?'&5b6 Nr@>LDC~b !53#5!#Jzzq lb!535#535#5!#3#Jzzzzqqq qmmqb%3#33"+01"+5&7637&#"3276_B3>t@ wO$;5: QvX7Cw*!b 3;#"'&5b:_u=>KCCrb33+53265#b<>td#9,(sBC4AbD3!!c0bb067632+5327654&#"#4&#"#367632&55@m:9?=t^:'.9?$/; %10;Be:BC}CCAmB<^YGhb`(#"'&5332673327653##"&'55?n8:',:?$/: %a:Be:BC~C<^Y4hb'#=4'&'&'&#"+5326=3>32 @$$;=u_8-.f?n98>R 01U{ u@C4K{\74BCb"&'&'&#"#367632;#"'&5 :)$.32@m:8+;^t=B0 1*[s\9BCK4CGnb 33##blmb 2#"&6";&'&+3276\\\\C$#A+$CB#WWWW60$==$0*00b#+!535&'&7675#5!#'6764'&I{E]]E{rE\\E$##"##1`AW6WAghAWWAaZ 00M 00b=&'&#"#"';#"'&=327654'&/&'&54632xB<<6;6$66KJ!:^t=><@@B;>#769>=  -,`d327CC} o) .-\d`bs#"+532654763rp*==te#:+::z&asBC4Kf11bd3#;+532767&'&5#5355h:=ud#9b,2ee,v?CC,1w b*##5#&'&'&=#53333#3276r.f>T#9zz @$m[74 Cm?2M6m ! 0bb(%27654'&'5!##"'&54767#5!,'%~%'+12/%Ûbb$*57q+-AG%na332653 '&5a.56/LKKLB88BxBBBBb#'&53?27654'&/`,*!VWNr@> C.,!0x!J=XXXDC~q_71P<@/(fb5# #35̞Osb !!!5!p*NOXb_!!;#"'&'!5!p*OJ^u=<OF C@uXbM!3676#'5!5!25&#"p*[F^IrOSJ6mONX-b 7!5!#"&'532654'&+*\1G0-``A@==<:X\/0]j؏ ?:P|A@<79b !32767&'&#"2#"&76  $>;%  #=;&MNNMNMG?DD<8ivw^wwwvf!73!疠f3!!ff!#'!7栖ff!!#7fNf 373#'4栳硳xNf #'#373ڳڳx &$OK{&Dl'5v%k&E:M'N%M'E'%'E[ok'uOof&vl'}v'Rk&G:M''RM'#G''R'Gw'z'Ro&zG&'z&R&G&eu&(#Ok&H&Heu&(Ok&He'GM(O{'WMHpe'(Op{'Hoek'<u'z(OoF&z'HQl'^v)#3k'8:I[a6'H"*RF'J^l'v+k&K:M^'+M'aK^k'j":+*k&K:Ro^'zg+Fo'zZK^'+'XKp&,pu'nLIu&,V'k'u.&N uM'.M'iN'H.'NMe'9/M' O;Me&/'S&u MXO'qo;e'/$\'tOe&/&&On&k'au0f'vPl'_v01&P<M'a0M{'P^l&1v1&QM^&1M{'aQ^'61{'Q^'2&1{&Q&[u&2OS&R[Y&2O3&R[u&2Ok&R[u&2Ok&Rk'u3Vf'vSl'kv3V1&Sgl'v50&\UMg'N5M{' UMgO'q; M&qL g'%5={&Ul'qv6_1&VQM&6N_M{'Vl'u'v6_'v&VVm&6_c&#Z2Ml'pv _M0&W  k':7Gk':W M'A7MG'W '7G&W &7&G&W&M0'8M`'Xo0'8p`'X0'M8`'MX0u&8'SS&X'g1)]0Y&8&X'qj m'u9:'Y M'9M`'&Y6r&:|@gm&ZCZ6r&:|@gm&Zv6k&:j*:@g1&Zj6k''::@g0'zZ6M':@Mg`'-Z#il'v;0'[#ik'j:;1&jv[Il'uv<F1'\Rk'iu=Rc&j]RM'\=RM`']R'=R`&8]'KGk'j:W@g'ZF'\Ou'D#3k'D:AP$A M&$OMK{&D 4'u$OK'CD o&$VO&D o&$AOM&D &$YOK&D &$DOK&D Mk&OMKf& u&$aOK!&D u&$aOK&&D &$XOK&D &$aOK=&D Mz'OMK=&Me'<(OM{']He4'<u(O'_Hem':u(O:&Ho&('yKuO&Hxo&(O&H&(OK&He&(O&HMek'<OMf']yB4'#u,`)' M'#,M' L[M'2OM{'GR[4'u2O'IR[o&2O&R[o&2O&R[&2OK&R[&2O&R[Mk'OMf'Ga&k'ubUf'vca&k'ubUf'Cca&4'ubU'Ica&m'ubU:&caM&'bUM'GcM0'8M`'XX04'u8'ZXk'uqGf'vrk'uqGf'Cr4'uqG'Zrm'uqG:&rM'qMG'XrIr'h|<Fm&CZ\MI&<_F`&\I;'j|<F'"\Im'hu<F:&\YG&> ZYG&> pYf&> gYf&> tYf&> hYf&> uYm&> iYm&> vq G& Z! G& vf' g{f' tf') hf'\ um&q it'm' vscG&B ZTcG&B 8cf&B g6cf&B t cf&B hccf&B u2,G'# Z2G'# df'# g^f'# tf'#r h f'# uVG&D ZVG&D Vf&D gVf&D tVf&D hVf&D uVm&D iVm&D v&G'% Z0G'% Xf'% gWf'% tf'%x hf'% um'% itm'% vsG&F ZbG&F lf&F gf&F tL96f&F h(f&F um&F iim&F vcG'' ZG'' f'' gf'' twf''r hf'' um'' itm'' vsOG&L ZOG&L Of&L gOf&L tOf&L hOf&L uG&-L Z\G'- of'- gsf'- t8f'-v hnf'- uG&R ZG&R }f&R gf&R tf&R hf&R um&R im&R vG'2| f'2P tf'2k um'2V vsOG&V ZOOG&V JOf&V gFOf&V t=Of&V hnOf&V unOm&V i\Om&V vWYG&6l ZG'6 f'6 gf'6 tf'6 hf'6 u5m'6H itm'6 vsYf&> uYf9cf&B ?cf:Vf&D Vf;f&F {f<Of&L OfYf&R fZOf&V SOf[YVG& eYVG& eYVf& eYVf& eYVf& eYVf& eYVm& eYVm& e VG&  Y VG&  YVvf&  YV{f&  YVf&  Y%Vf&  YXVm&  YmV'm&  YVG& VG& Vf& Vf& Vf& Vf& Vm& Vm& V&G&  YV0G&  YVXf&  Y0VWf&  Y/Vf&  YVf&  YVm&  YVm&  YOVG& JOVG& JOVf& JOVf& JOVf& JOVf& JOVm& JOVm& JVYG&  YVG&  Y Vf&  YVf&  Y&Vf&  YVf&  YV5m&  YVm&  YYF&>Y&>qYVf& eYVz&>eYVf&9eY9&> [YV9& Qe k&u O&q;Gf' /f V& YQIG ZtVeQIG3527#RGez9;m'ujVf& V{&DVf&;V9&D [V9& `*f'# ff'% fV^&% Y6>`f' Z tqf' Z# +m'u ZF&Fg$&Fqt&F i*9&F [tm&F \b'k&'#u:rO&'q;f'' =fHjf'  Sf'  Am'u F&R&Rq&R =VG&N ZVG&N 9&R [m&R \Ik&2duIO&2q;kf'2! $fG'/ T;&j l;5TRfCOVf& JOV`&VJOVf&[JO9&V [ROV9& JOf'- ff'6 >f1V&6 YBHEfvQIG#3&5HGzec!!d5c c!!c=c7!!c,c!!cm4!!3&__)&BBXJ!3ZX`tX!#2Z`!#2Ͼ[`tX#Z`X !3!3ͿZ9ZXb`X !#!#2[2ο[`^ !#!#2Ͼ[2ο[`^X ###[͖[`^/;c !!!!!5!4)/-;c!!!!!!!5!!5!4)<} `467>32#"&'. /.0uBAv-/01..vBBu.-0J235624IJ336633 A AoH!!D}<!!!!DfD}} !!!!!!]D5DfD}}}y; 4 #/3?K"32654&'2#"&546"32654&'2#"&546#32#"&546"32654&AFFA@DD@~@FF@AFG@`H§@FF@AEFh{rs{{sr{ؽ۽8|rs}}sr|ٽڽ ؽ۽٨{rs{{sr{ ; l "-8@DMW"32654&'2#"&546"32654&'2#"&546"2654.  &#3  &54$"2654 AFFA@DD@qAFFA@DD@~@FFFGO HȷOFFEh{rs{{sr{۽٨{rs{{sr{۽8|rs}}sr|z ۽1{rs{{sr$`3$`u$` &  R$`]' R&  $`#3`u$`&  V$`]& ' V <#%#Ͷ#J' 5JD'qj'5-E'{'p'''{~'}~!5>32!3#~ T\mTGT:=&D1"B:*(ǿbY9>K-dM B00_  $'5 $0ovlSPPSEFE&0j &$ 56$ 0gri&FEFESPPS##3 #|||v#"$9' {' { !!7#3H  3!!#3/T"^} #5!!53#5z/^?,&""v~y&"2~y'}"ZX_ 327##"'ZߔZe_{C;+ 2###Ǹ農S3'#"&'.467>3M~Bu.-0/.0uBR2633235S'372+M~Bu/.01--vA532336$ _` #!ZEu1}0j&  a*a#'#'7'737'#'7'737*7{77{77{77{oqqp qqp6B''{FRa0X  #'7!5!'737!!^´1؎؎1َ׎") !!!<<<OJpJ J$`' ' R&  +} !!!!!oT,,*,,!B !!!!!}T,>,,,p,!!!!DD}1}Z0 !!!!!!!!ZELEEEtd %!!!!#!5!3!z34,,,p,\rsw !!!!!!DDD}}}}}w !!!!!!!!DDDDa6 4&"32767#"'&5476329DDYYXXXYYY@@@AAAAoppqpqqpb.3#3#bQ2 333##5!5||W$!!>32#"'&'5327654'&#"x1US[[GDDED<<6L.--,N-53<ߞMLKL ('&AB&& F-"327654'&&'&#">32#"&5476328884/.,_55 %T3VVgg9569$%IJ$%%$JI%$ 56i{PQuv K!#!Ln1sy6E ,:"32654&'&'&547632#"'&54673264'&#"< <;??K&&OMNM%)JV)+RQRRU32623!!>=!!B=>BF00Gi8777jL+/45P|@??@|Pj26d:)532767#"'&54632#"'&2764&#"q3]-_55 &*+2LNgh:558889756iJK|vv $%JJ%${Rk !!#!5!*(؇(kۅ%%{RF!!{)F{AR!!!!{))ń{c#&'&47673V*))*VH%$H}|}~\6764'&'3]I$$$$IV**)*W~}|}c#=4'&'.#"#367632 )A%%/45?p9;>R01Us\7BC6T dnC{dbTtdQTud2C dWC dFT dKC dET d:T d{R d{%R d{R) dcif d\if db]db cdbldsdb ddEl%!!!!!!#"32.#"3267Ga4HT&THHMMH`**9  9*)73Ʈ27[9)06&'#7&'&76%7373&'6767#"'#&'X;72-( 20 +65ZRYZYiKJ6c&f0;:= s$-ef JPj ,e "I78>!Fi+6,6767# !2.#"!>32.#"c,)X[Zir=iZ[ac-95` %F%iq "I77ef87ID: ̦c[!!!!3#!#5)םz[X"Xpj#67632.#"!!!!!!35#535#5=nrSP?Ej2/PPͯw|'&>:r B0#4'&#"!!676323632!754'&#"!ݚJ]22D 0035+. #UF2654&+!.+!! 32654&/.54632.#"#"'&l__lb2fTb Gq94[_eh__Bb9׬YthU\YCX8dj$?ZgfXspR֔-v/:90/  0035+. #"&)-1'#53'!!7!!7!3#3#!#!#5373'!37oP1L1m1N0n0J1Onpxp____*:vvVVBvvBvvvvG0 ! #4&+!% 3;!H dd>Y*5=Y7&1%#"'#73.5467#73632.#"!!!!3267UdDOXOtFAdUIYs(NEP-rYKR78 87NO{v$$ zzOO6!!!!!!#5)YV,5c`u!8LȘ !'75'7!!!77"Z'Z'BCY(Y(<^:MS:MS#9MR9M7(_t'6767632#"'&'327654'&#"67'6767632#"'&'&/#"'&5476323276767654&'&&#"32"51GD`C8G';,6FH`8.#"f'&K.27=u 936kTLJ< W7>DUD8),.18 I}GJC;uCˠ$I$.+V>@."1.l   7+Уc]97#9Xzav24?Le;&2ELyP)+'+>AHJB @@=kbq~Es/4 %UAB`_KBjoD7=AiK}f^[@ )5'32327&547632#527654'#"'&#"654'&#"ռkCk'HPXK`mB0>ioK:'.2 %DlX``S㫣lm@.jVBthP#lH+990C? *1!3276%!64'5#53!23#3#+!#5%!&'&+,]3qObbTreerTbJ3]_B7P*PPgX~Ug(gT_g6[[x$-#5!#5&'&76753&'&'6767qDnv[_ى؝ZUh]^Ndd!&K9Y323#xxro$1Ue w|^o}oDNTML56yx8)5'PL87<%% #L )%#&'$%6753&'&'6767U]34ǒ42]UIR=@@32#3.#"3267#"&632D=0-9R! ^xKYJY^P#^T[1[ee[4^NHy>>x..,-_K y EL61!657@!vv#B$1*EI%!"'5 54&/.5!2'&""326=%!5#"&546;54&#">32#30$H*`#A,†D=0-9R! ^xKYJY^P#^9 LD 3 G< }K..,-_K y EL61!65[!.#"3267# !2`u}}gb`pxPp-@C?k??D78ef84կC'&oru#5!&'67!!&'&76CKKZ*((*+'(*aEvvtXWe>W ! xw$'1.#"3267#"&632#3"32654&'2#"&6T\0[ee[4]OHz==y _DKKDAKKA@!vv#B5qtsrrstqT$ 15!3265!!5#"&.#"3267#"&632#3  %?LP T\0[ee[4]OHz==y _GhD"dUrmJI@!vv#B5{pRu8&r)An!7632#"'&'&'&#"32767#"'&'&'&!#"'&54763232767676"#"'&54767632>-˂E) .)%!#*"2*?'(NH[ұhB,$/'((:>_RJ*=%&1%3xM'De %%0!, !%LDt˃*>%+'&%G8@N/ϭ@)49$'H::9U*9<==#;#%3buL/, ^ &'&#"'6767632654'&5476767327#"'676"#"'?3276767654'&'&#"363" ('7E('A@'eY5y9ZZl5{D&%7{IF9Xau !X3!!5`_IH|je#O@Fe3!3%!!!!!!zz]x}+ 8!>54&#"!!>32xf @:daDiYbVH9O@Fa^ N#676'&'&#"!#737!!!67632! *dII`؋$B#1ZZZcFE(w77#WVrrb./wwVB7#"'&54763232765"#"'&54767632A%>OĂO?&A+. ";A889[%"+;)!-~Q8MYҞiOP>>9&+T2"86/Y&] /A"= + -]yM)(_2632327#"&#"7632327654'&54?#"'&#";jworulpq}dns(Sa+jq`O81??HH/+y{/U:11::b:~"FLxUBnb_Xċykb[OPDJ'&767672#"'&'&'&#"23276767657#"'&'.#"'676767676f!IwIF 0?#2K )'g cD98pb(T'!6P D$' oyV?=[4$ PA(Zkxv1/zgcD9;TXy$)D02.(^ B),\A%273#"'#67&5477632654#lz16?Dl4;`I g`<A5fT Uf59dNT1QGdX EU!/!35!!!>32#"&'!#!#53276'&#"BBAixwwxiA7667gf888rrra^^a+ETT@TTUTV^ 3%!3!#Xl={l]xK+C>P%)"264!46!"!!5265  &!!cg88g8N}N ?oqqȎ>;VȎ>;T^5 '9!2+#3264&#"32>54&'&$  .546TGMMG:ٻNNNNmnOONOPaaaaBx@9WzyWVVUyzWXnnnc;0<67632"'67327654'&#"#"'&57&547327654h-uw>AnZE#ZbL83m>Qs49*vb$$1UE?LPק=+<$~\oA7n=B Ũhb)<(,QB3%! !#!327&+67654'&_z7007?,bb,]x~#g)ZZ)['%!# ! % 7& 676'&KpCGlo ooop%lkh4334a9$ [27654'&'&'#"'&546323276765"#"'&5476!7232767#"'&kv^O#EES%nE/?'= .5-O++tRQ)4#.14@yAƺAIgaqSBE7"#>%L:^GE(-:pZϘM#B.97>#3*M*3D!!9!K.@_u20#"?Gc_3䂈/#>!8Z%,JJY&54'&#"#"'&5327654'&#"3"'&547632763227767654'&#"a@DT[QQ\\f3->=-22,NF-22/:;\\\\Sc*!q:;[Yj )%-13&'&7!.+!!2!27&#676'&%3JZK|{4R>v/f8b8li,$4HGm=s@1F~h|hb)tLtzП₰|`E R 3%!!!5!$+7@]x'x/)7# 7654&#!5!5!5!!2+"/_NAfՖP^H-u00rpL161sN'72767654'&#"'67632 !"'&'&'&#"'6763232767654'&'&'&' QE@EBI}cI $smcEm} wLO6+C gWT8P.!6[PT:1.ys*BZ@D^@ 7v_>ne} rwΪIF#2I'&*!DB>2Q5ecrRX.,4&"5632!,e7=:^ @[+X. mK%.<N]232#!727676765#"'&5476%27654'&'&32767654'&'&PߔD;]XVeYm%%-.B:?+khLK$+Y] >-$xw=A;J\L^-#"+y0uI7E4cc.7#!B:yZX$ ^]yk!!25>PHIX1%.!(Ivy0@7H] !7,2@FMVy32._T{w<Yp-)% 7673 $54$32!"53!25&'&#"hZ`'9QT(+" #)"H[|T$?9]pX`88$6}yoC2/S76?#"'&#!!#"'&547632327676=7!&#"#"'&5476!27`1 .H,D("$BLJ+-NUrQ3,:,$7bl1Ab'LZ +;1'E9R  cBb8WkLSF?Q.J;$!!J?f/hi v&LWSH 3+"P HQ )!!!!PYM*Z##yESm%&'&'#"'&5476363276765&'&#"'47632767632#"'&'&#"32767#"'&'&'u',3+,-PfrM/*'.* "1"6XY4%C/kOs]QMHH)SwsW+)%,8#/9##<^mc7'jn)2L1ǂde6Pb.,:-$ .48ny"!V"FrjNpZۙ-(".*87`aA?06 "C?Y6%nn5$\ 4&#"322#"&54PB=VtA@Wqסr|tx \{6 4'#!5654/&54?'&5477'&5474/Y-u_7;Z7N>ʰ*X0~Y-;Y-Y-Cc1NS2j?Bdjl,>8?]/c6gUc1NS2Bc1MS2c1MS2#(32#!"54?>3!4'&#!"&476323!2ka&[>  4:=&PRA''# I q#= X8**#"/#!"54?>3!!"&54623!2* ,7 ^! Y&=!7`?'$)_b' 2!Q<_c'oA<u#".5!"&54623!2N6 ?M[`?)%x %|2!Q'Ho{m<z\? 4632#"&3!53#5!eIGddGIe]TQooQOonuyy5yQ! !232654&#"oJHS.fgk-¾~ `  # # 33!#!#3!!!!!34l8HIyGa72!#Ie%?` 53&5!#3#32767#"'&'&'&5#!#"#463! )/L塡$,00BY951 1N$lQLW,3$p G x &#T+Ka~=2{ƜV }3>3 3!#"Ɨ?oͰ|c=??jM;c; 3!!]x3!3%!!!]x+]w # ! !!5 5eQQ/bExwcS.46$3 !"&'3254#"3!/Ppmqp6]%dFF_b875GF)!!#O !! Ea+#\) !!\[`u% +! )327&#!3676654'&+m2XM DFpZܬrVܒ5Y10tf:@S^et10]6z5x 3ZNq?k #'2%267654'&#"!!7#"'&5477632#3%(%<jxUj[<-hHI5,f(%[ZJoIx\aXc\mLV/.~ X2xZJoI2<{ 1!654'&#"32767# '&547!2!& FB>A[\Mfpyhzwwr|Z/asQ K}?8X<[s6z0oDO:qDM9 !!3'!!FD4$zpxF !!6767#!+73267HD3S8U!z'8\S"9UGs\K&0 !67!>32#"&'32654&>54&#"v/2 dY}X_u%&$R`UHEM,:4:on:3901teft0110tfet10#W:2TS2:V3:no:4[HO{ZQ 5!!Zb<Ƒd 3'#'~bزwxƑiQ '7!5!'7ȌwƑd #737D~زxƑZQ5!'7'7!Zba<ƑwwƑc3'7#7'~a~vƑw;Ɛ/3 7!##Yc̪4/3 #'#5Y3c̪4/3 %!5373/Y c4/3 %'33TYc,4ZQ5!!!'7!Zb㫼m6Mm<JxxƑiQ'7!'7!5!!'7mmfȌwxJxƑs/&'."#"'&/#7!#267676767632GQF=4RHUYEN8XYWFQF!:9MFXZCP6;W\)""!&OG='""'=`,c_""!&V@>&""(@V&!""_c`='""'=GO&!"")ZQ53!!#Zb5c˫<WƑWƑ\3''#'5'~b5ز5wƾXƑWƑiQ'7#'7!5!'73'7̃c4ȌwƑƑe#757377E~˃ز˲ƾWXƑƑZQ5! !Zbr5<W‘WƑRQ'7!' 7!'7˂5rȌw>>ƑZQ !5!3#Ųb; Ƒ6d %'3'!!5b~bƑwhiQ !'7'7!#3A;aƑww\d 7#7!5!q~hƑwd%7'3'7!!5b~bDDƑwƑwZ(5!276767654'&'&'4#b  >/5')+''50= Ƒ  +,x>@9>*+i(!"'&'&'&54676763"3!'7'| >/5('+)(5.?  a +*>9@>x,+  ƑwwZ;3276767654'&'&'&"#5!5!54676762#   ƑM>x,++*>9A=x,+i;54'&'&'&"3#"'&'.547676762!'7'7!#   EE?.5()+'(5/|/5')+زa(M   +,x=A9>*++,x>MƑwwZQM2676767676322676767'7'7"'&'&'&'&'&"#"'&'5}  "#(+!&  #ƒa#Q"$!    $"(,  b $ -#% $, ' בww"*&  *&"ZS%'#5!3'7'7!9b!B9a2'ƑY2Ƒww$ 7'7jf|ᗑ_mHu]W)97 !#!5!b?Ƒa !!'7'7!b>bƑww<7 !5!bgLƑa 3!'7'7!bfb<Ƒww !7#7!~+VƑwZ 5!3bt Ƒ z%#4'&'&'&"7#74767676286BAAC68~--TPnddnPU-,VJG@9!!9@GJVƑwƆvx]Y6006Y]xv)z%476767627#74'&'&'&")-,UPnddnPU-,~86C@AC68vx]Y6006Y]xvƑwVJG@9!!9@GJV 7!##7!Y;cc̪4'wwZ# '73#'7!5#3!ab;jƑwhhw0Ƒ\]4276767654'&'#7!#"'&'&'&547676682G=@E468YW+,,+WUiggiUW+,,+W;LJVS=7# :;LJSVJL;,cepvvpeZ5005Zepvvpe]j47"'&'&'&54767#5!#2767>54'&#X*,,*XUhgghVW*,,*WY764DA=G186epvvpeZ5005Zepvvpec;LJVSJL;: #7=SVJLZ Q5!Zb Z!!ZEƑ3'#bwxdr#'qزb$Ƒi Q!5!'7a Ƒwi'7!5w!37زxƑwdr!#73qZ}' , V'  Z}' , Z}'5!!!!5)bƑU73'#'#'3~bآزa~wxxƑi}'7!5!'7!5!'7awƑwU%#73737#~آز~xxƑwZ'  BZ'  BZQ%'7#5!7!!!!!!%9JbJg:MDDWoSSWo6KKZQ!7'!#5#53533'7'7#'5!CCJbJœKaKÜDD7KKSSSwwSKKiQ3'7'7!'7!5!7!5!!7'!:KaK(f9sN?CC93WoSwwSWoKKZQ!!5!!d;UJbJD7SSKc#'3'#'Jb~aKDLRvRKiQ7'!5!'7'7!5CCKaKT7KKSwwSc737#73CDK~J!KKRvRZQ7'!!5!'7'CCDDJbJ!Ka7KKKKSSSwwc7''3'7#7CDDCKa~bJJ~KKKK^SwSSwp #7!##ehYje_qu+cqS  '#5!#5'5ghZhepdvpTj!  753!5373feZ jhe`YRrtdp!p%3!'3 fhi ZdRpd,vpjZQ!!!5!!!j{^b^3j72viiviQ!'!5!7'!5!7!i7j3_a_{jviwwivQQ''#53773/˲bYY ƑcciQ#53773'7'7#'hYYaˋ ccƑwwƛd!##535#53'3'3#3#q것b~b,҂6Ƒw҂d33#3#7#7#535#53것~҂Ƒw6҂ZQ53353%5!!;b겂 2Ƒd3#3#3'#'-~bزw6ƑiQ#5##5'7!5!'7E2wƑd#535#3#737q-~ز-$6ƑZQ #3!db; Ƒ\iQ '73#'7!5aƑwhhw1^ 5!5! !!~T_i$$ '33 !!V5p$@^ 7'!! !!?~_% 7##% !!GUTe$!#3'33 !!5_CV5zzbJ$J #!5#3'3!3! !7Uʹpllx|`$ #!5#7'3!3! !7Uʹll|`$ 3!3# #%#3735#3͢x-|`$܌lzlx ! !!!!%'33'375VUUhi$@@$tt %3'3#!5'3!3!! !!'37lUV76ʹ)UhiTll|<$$tt@^ !5#35!7'!!! ?aa_]#_/%%m 7!##!#bYJ-kcc̪4wm !53735!3Y krc4bw^+ 3'3#?! !! !lUVV)e Ҍ$$iQ)5A '7#"'&'&'&'#53676767623'7$"!&'&'!2767698CCCC89po 98CCCC89ƲaS$$ X $\ $$S$$54&#"#"&54632#"&54324&#"325# K+:rס[}B=VtA@Wqq9WzC2EqG Ur|txe !!!!!dEaa+#6#6#e43!!#7#3#!!!3 !SGXAXgvXXW4_+__#6#6#6V$273#"'&'#7&'&$32 &#" 326767&'&lB|d?Y6]>$_R}yyHJJk"%vyyIKK3YZX|g IHveyKvGd !!!LSV? !!&kV??%&76763!!"!!3!!"١[\]ok=x@?=wBC3"*%&'&54$;73!!!!!!##!!XRCijeUz=FJx>@?=wB%v% '&76)! !!)}r:X2C C, vo{ o%2lc<'%#!5!276767!5!&'&'&#!5!2Lpk<yxAAdZx3"*+#7!5!!5!!5!733>767!7!&'&'&'WSKjKi<G@?=wB%v )5! 765!5!&'&)5k/~sX2C!C,Xo{o%2ld<'l3!-lw!!!!!)u!!!!6.5uJ)$w !! !!5 ;.G!t{N F!!~F !#!5!3!!5!o**TbbZ3#!!#!5!DDA#3H 0.3 &em.%73% %#'/jTUjTjjKJ6lrt!!D}D 3##'%Vl"DN7D& Bu=A& B # %.#"326"&'#"&54632>3"3'hDQe[F?n>[=W}~QY@Uk='j5CCdOMein~q~ezCDR /32654&#".#"326#"&54632>32#"&\'jBQf]DAk'hDQe[F?n=W}~QY@U~~R1CDeOMeeCCdOMeia~q~nF%!3!E~%!!& !!##4'!&'7!&'&6`_HR) 6F{$A9vq-..-xy)qF 5'7%%' 6876H ?KN.}d5 B<>b_kyPRP}XR/3#~/)XXy/ #'%37R4&5EdeeX/3#3#^/))XXy/3737##'ԊA5vՊC4\,Y{ *eLX+e!!! %a'^!!!BD^76!2#4'&#"#dnzd)2{7)+P+COO=3327653# '&)7{2)dzndw+=OOC+/#"'&'7327067632&#"0J b=sC16;Y b=rC16;W6N89\fW6N89\/& S S/ 8& S' S SF.9EP'&'7767'&'&'&54767676767676&67>54'&'&'5pC b=sC16;D8788C b=rD15;Hv  + J;PLKJ} ՜U5O9:[>?JKVXKK>? 'U5O9:["$S13(*# b11S$ F.Yeit%'&'776?!'&'7767'&'&'&54767676767676&!67676&67>54'&'&!', b=rD16;@ b=sD16;D8788C b=rD16; b=sD16;H55pC  ?+ ՜U5O9:[U5O9:[>?JKVXKK>? 'U5O9:[U5O9:[":;PLKJ} Tn$S13(*# `%/b11S$ +. Iy}%'&'7767'&'&'&54767676767676&!67676&!67676&'&'776?!'&'776?%!)!67>54'&'&m b=rD15;D8788C b=sC16; b=sC16; b=sC16;H55pC b=rD15;@ b=rD15;?]?+ Q vU5O9:[>?JKVXKK>? 'U5O9:[U5O9:[U5O9:[":;PLKJ} ՜U5O9:[U5O9:[%Tb11S$ rn$S13(*# .p?#4767676767676&7%7&'&'&''&'77673! ;7R  b=sC16; &$P;;!.{sT3l$(1 A b=rD15;;)!]XTF>&U5O9:[ %AAYw8'~2:)+U5O9:[01<.Q;CPY676?67676&7'&'7767&'.'&4767676776'&'&tO#' b=rD15; O:5) `L*9P&+ b=sC16;Ot#5! "5!%"" IC&L' ՜U5O9:['@;_CJy3/@' U5O9:[ 'XPP&K&+63{4;$7kB%9(.=<ERZ&'&67676?67676&''&'7767&'&'%6767677&'&'&>E8?K$& b=rD15; R7; p@!2GD(* b=sC16;S6 0(c",*%*(#)9`W=B# ֜U5O9:[&>FT<;Om3F  U5O9:[ &?ǐ,@FF-'q9:80/n2/m-' A#' A Am-' A' A A#l-' A Am-' A' A' A A F & : A] !!!!!!DDEQ}}F ' A' A' AE' AE :FH& d' A AFR#"'&'&'&#"5>32326E_W`  TPY_Wc UMRPE:=MSNE;=KFR3276767632.#"#"&']NT  cX^XOU `V`RUK=;ENSM=:EPx ).#"3".54>3232654H#"&Pv@6Z]XvTDjtAH~A6Z^XuUEjs_ZZRTFcQzpzZZRTFcQz}WF32323#"#"{OV9BNzOU;AM K/_/!#.5476767654&'3F=46EKF=46Bh`k ^Xbjbt ^VFi3267#"''&#"5>32K6M]_WMchiL6PY_WNcgKUPE&EYMSNE%UEF#"/&'&#"5>32326!!E_W` TPYaVaUM~PE: =LTPE: >K'F##"'&/&#"5>32326!!E_W` TPX_Wc  UM~#PE: =MSNE;=KFF%6767#"'!!'7#5!7&'&5>32Tep9^W;E_68vyPjITK[_Wc )9@;OEi0(#VNE;gKF##"'&/&#"5>32326!!!!E_W` TPX_Wc  UM~~PE: =MSNE;=KFF/#"'&/&#"5>32326#5!7!5!73!!!'E_W` TPX_Wc  UMWgWPE: =MSNE;=K튄튄PF3%#5!7!5!7/&#"5676326767!!!!'x'gr[ZPMMY_QPWc %9u!K]_PN[Afq{K ='&SN#";Qk&UP#!lF#;#"'&'&'&#"5>32326#"'&'&'&#"5>32326E_W`  TPY_Wc UM]_W`  TPYaV` UM#PE:=MSNE;=KPE:=LTPE:>KF3&#"5>323267#"'3267#"''&#"5>32sIPY_WcTR' M]_W5D.sIM]_WbUU( PYaV6D.MSNE;E KUPE/KUPE=E# LTPEKF7;#"'&/&#"5>32326#"'&/&#"5>32326!!E_W` TPX_Wc  UM]_W` TPX_Wc  UM~FPE: =MSNE;=KPE: =MSNE;=KF7S#"'&/&#"5>32326#"'&/&#"5>32326#"'&/&#"5>32326E_W` TPX_Wc  UM]_W` TPX_Wc  UM]_W` TPX_Wc  UMPE: =MSNE;=KPE: =MSNE;=KPE: =MSNE;=KKF#3276?632.#"#"&'!5!5]NT cX^XOU `V`~~UK=;ENSM= :EP@F  %5 % $%5$C 68D6F@976767!#"'&'&'#5!!536767623!&'&'&1*+ 1MPQM1 ,!::!,x 1MQPM1 z+*%'H:f<0[2332[39a?H'N'H?a93[2332[00773;0>>0'F#!!!!"32654&'2#"&6~~BAZYBAZ[@;n,*,,)+p=dbcGHd3/0xDCy-03'F!!!!2&#56~~Bz'F!!!!3# ~~xtcK'F!!!!33#~~txKc'F!!!!!!%~~BefAfe2TT'F !!!!!3!~~Bt+6Yz'F!6=Q!!!!53#5#"&4632264&#"%#3267#"&546324&#"#"3###535463~~Cii4"/4 kj6h66h6k!))Yd[Yeg/!(&#LSS;9'FJ-!!!!>32#4654&#"#4&#"#3>32~~~R1TX",1$-0K-2N35uo :5SN[5SM%Q//7'F:%)!!!!#546?>54&#"5>323#~~s0+&%U-6Z*ns#+*?1.#'!!d_1N, %`F !3!!!'7#5!7!ㆂ9㇄~1}MF !!!!!!~~~nsF!5!73!!!!!'7#5!7!5!1o8dgl!j3.flftgsiF !!!!!!!!~~~~F %!5 5E~'~PNF 7!!55%~~(&F!!5!5 5F~~'~6PN&F3!!!!55%~~~(F!!!!'7!5!7!5!7 5AaBrAr'~6\ڠ\ڟPNF!!!!'7!5!7!5!755%AaBrArs~(6\ڠ\ڟH 5 55K6N33QQ33QQH 5555635N#+#&'#67&'&'4767&'36736'& ==03]^50?= >32326 5F_W` UOX_Wc  UM\'~PE:=MSNE;=KPNSF$%#"'&'&'&#"5>3232655%F_W` UOX_Wc  UM~(PE:=MSNE;=KF(14%3267#"'&'&'&''75>32%5%%%  UM]_Wgz 5.IGNX_W Q4rT+/?aͮ=KUPE: E$&SNEEXbrf5-F(143267#"'&'&'&''75676?5%7%57'J39  UM]_Wgz S?>% NX_P,.4=;S܂=KUPE:$Ex&SN# ]euE2, Fl 55% 5~(Q'~PN Fl  5 55%='~~(PN<F<!%7'%%'75%7%57%5%9/5O6w-\sN̘94 Z_k󆑐3^am􇑓g3;5<F<!%7/%5%%'%5%75%U?8e93dTTa;#1SR# 13{f네􊇑3i놣Fs %5$ErYg===||Fs %$gYs=6||6==Fy%5%5$ElVY)Y0USx|Fy%%$kY)YV0B|SUFy(%#"'&'&'&#"5>32326%5$E_W`  TPY_Wc UM]VY)YPE:=MSNE;=K USx|Fy(%#"'&'&'&#"5>32326%$E_W`  TPY_Wc UMY)YVPE:=MSNE;=K |SUJF?67%'&%5$%abMƵߋ>KKAAynʳlqB[,=qB JF?67&''67&'bLƵ"{䴹KLB@n6m r6B \,moKM3R+#!5!!5!3 32654'&#Ÿp~depDbǡcEEbg le]moKMR7!!!!"3!!"'&76kcDEb~moKM᎐R%!52#!5!27654&#!5"~~bEEcClMKomR&%!!'7#5!7&'&76;7!!!!#";f]I68"nJ6* cDEbBw|BmoKMR &327654'&/!5!7+!!'7!5!7!5!MNbEEE*6J54&'&'$2"&'&'&547676!!#!5!\LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZX\##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcb88a$37"2767>54&'&'$2"&'&'&5476765!\LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZX!\##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcb^a$3?"2767>54&'&'$2"&'&'&547676''7'77\LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZX\##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcbݍݍݍa"=A32767>54'&'&'&#"'67632#"'&'&'&5476'>>?>JJYXKM=>= =?KJYXKLXlk}~jlYV-,,,WYlk}~jkWY,-,,> EacSSFC##"#DEacSSCF##"#Ib0111cawvxwbb0111acvwxwFa$7!!"2767>54&'&'$2"&'&'&547676bDLJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZXE}##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcba$ 5O"32654&'2#"&>"2767>54&'&'$2"&'&'&547676AZYBAZ[@;n,*,,)+p=֯LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZX.dbcGHd3/0xDCy-03##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcba$+E'#'7'737&"2767>54&'&'$2"&'&'&547676h6{77{֯LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZXqqp##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcba$!;!!!!"2767>54&'&'$2"&'&'&547676``LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZXfp##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcba$37"2767>54&'&'$2"&'&'&5476765!\LJ?>>>>?JLKK>?==?>KXY,,,,YXXZ,,,,ZX<,\##EFc`FE####EF`cFE#dbcwvwvcbddbcvwvwcb^|B !!#!5!%!%!!^88W|B 5!!%!!W|B    ' '!%!!,--,]NNNN|B !!!%!!bDE}3!!#i#!5!i\ff!5!!#Y4%3!!5K4K3!!#K !!!#3!J>rr !!!#3!ii>rr #!3!!#`\#!#!3!!#`Gs\\#!!!#3!`Y\rr3q!!'!#3!S$qY&Y3q!!!!'##3!7!SWm<WUqYYrrP3q !!'7#33##&Cg/pGqY&Ytf\+3q3!!!'7#3!##?!EW{/.n GkkWqYYtr\ F 5rp~F { ]F 7!! 5~p~G]F %!5 E~G{ n6'22#"'&'!#"&632!676"32654&U04)+p=;n++/W4HG54HI3/0xDCy-03`4B <-033/0<B6`PsOO9:Pn6 2"32654&'2#"'&'!#"&632!6764HH44HI3U04)+p=;n++/W PsOO9:P3/0xDCy-03`4B <-033/0<B6`m65!6767>32#"&'&/"3264&n*,m<~>o++3IH44HH <0/330/: P:9OOsPP 3!5#%5!I*sx  su!5!!#4 !!!!!BD^^ !!! !!%a'e^^ !!!!!BD^^F )3!!&'.'&E~FAHV 9 OJL $#?F !53m.Vw ! !!Jw ! !wJ!Yw"#! #4$ iGCliHRPYw2$53! 3 PRHi#u  Ad !!%BeeBeeTTpe   HX*)|6UUpf    (*)U::Upf   HT*))0U8Upf  ))Vpf  )(::'F#3276?632.#"#"&'!5]NT cX^XOU `V`~#UK=;ENSM= :EPZ~ !!!ZRpoQRZYC #Z~ 3!!ZYZop# C=F 5 !!Ec~U=F 55%!!~e11J H  5 5 5 6L6L6N33QQ33QQ33QQ H 55555562626NPF 5!-5  5~(~'~ :nPNPF !5!555%E~~~( LNPF !5!5E~~LNPF 5!-5~(~:Fy5$%5$E)YV?_:|xSUFy$%$YVY)?:BUS|mFw!&67&%%'&'57&%5$%7q>3w<8dz¦<0$RSAwY49^GY~ Y>-*HM.DXF!6%'6?$%7$%ZzOz|g[ʹ.,Y%7R/VY(`q:}݂\*[xF3!!!!!'#5!7!!!327 5K6M]_WNbGHM6OX_WNcG{'~kKUPE&EMSNE%E[PNF"%3267#"''7&#"5>32755%K6M]_WNbGHM6OX_WNcG~(kKUPE&EMSNE%E[FFy&%3267#"''7&#"5>327%5$K6M]_WMcGHL6PY_WNcG|VY)Y KUPE&EMSNE%EeUSx|FFy&%3267#"''7&#"5>327%$K6M]_WMcGHL6PY_WNcGY)YV KUPE&EMSNE%Ee|SUFw 7%'%57 QĆ_RYwZSZ=܀l<&Fw ''7-'"_R1MwZ(ZA _xh5F&7%!!'7#5!%57 xćx{-nL!E]4&ZBZN`<6F&!!'7#53777qyoMVJM@&ZsZq ZCyWc<' A<' A<X A<& A' A< A' A<' AX A' A<' AX A#%&'&'!5!676763!!"!!3!!"X==\]nl<y;kqL_dxzZdAAx>@?=wBC3#5!3!!"$$3!!"! i/qLQ]m2geCclAbv% $76)! !53#5!)r:X2CeC, v5o%2lc<'& 0 AVZ"%&76763!!"!!3!!"!5١[\]ok=x@?=wBC^v% '&76)! !!)!5}r:X2C C,  vo{ o%2lc<'xX"%&76763!!"!!3!!"!5١[\]ok=x@?=wBC!!!!3!!"'&'&76763!!";x9]qLXY[\]o^zb9CcdZdA9#!!#!5!276767!5!&'&'&#!5!2X==\Lnl<y;lp]udxzZdAAx>@?=wBC#3!&'&#!5!2#!5!2767!g0p]BLm3hmeCxAbv )5! 765!#3!&'&)5k/ sX2CfC,Xˇo%2ld<'Z"%#!5!276767!5!&'&'&#!5!2!5Lpk<yxAAdZxv )5! 765!5!&'&)5!5k/~sX2C!C,X o{o%2ld<'c !!!!!!  9&'27#"''7&5476&#"327654'*|kkk[Ǟ|kkk]uMRa`1kMQb`0hwwxݞfwwwߞ7kkkUw5kkkTf85h{zJBv 3 %! w(dTd'3'߃b~bwd37#7~߃~"wdb' "&rdk' "&'A{c%64'&764'&?w==ww==wI.-@tw=@twP@\I HUI^;9ONISN!#!/}!#5A!32"}!53!2Abx3#5!lZbK!53#v.x5!%#3\XZK!5%#3vXF!#ERn,$%%$JIvvv鮮뭭nn 8ʸ'+6@KV#"&6 3546 +32 &=# &6;5#'54&#"3!3264&#"32654&#!#"3265n[A@[[@nA[\@A[\@A[\@@[[@A[`ʏʭʏ˭GffGHefffGMGeeHGeeHGeeGF!3!E~ng!#!IUxg!#yIS!!3Ux3!3!y`S86532#"&54&#"_uJ:::[e5 jT@OMJ&e<\(( #"&546323267^vJ;9; [(]e54jT@OMJ&<  '3%!5)!m~muIvx@Q2 !!!!%!!u KvV . 3! 3 ) ! 3 Cl9UVU~bPXX&*VZ )!3 ) ! # 4ml9UVUmPXX&*&+l  #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4#"=43+"=4;2+"=4;2"=43!2#3DŽCAAC!B""B!!D D!)!C!!C!r!C!!C!!C!!C!!C!!C!!C!!C!!C!!C!"B!!B""B!!B"f!""! !C!!C!!C!!C!"B!!B""B!!B""B!!B""B""B"!B""B!!B""B! !C!!C!!C!!C!!C!!C!!C!!C!!C!!C!!B""B!!B""B!"B""B"!!C!!C!!C!!C!!C!!C!!C!!C!!C!!C!!C!!C!"B""B""B""B""B""B"!~!!~!!!!& !!!C!!C!!D D!H""!!JJJI%%I&%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%% %I%HJ%%J%%J%%J%%J%%J%  ) !# 3  # 3 Dll[VU}}  &P&XF    7'3#77gc#433R4Rgg5kk\SSAcc\cc`FV~NO`VYz>. !!#!#5!Q !!5!!'7'5!K obvVƑwo* ! ! ! !HHqC}vvs' !53y湂r0_Tsz*!!s*s'- #5yr斧-T_0s' 53 r畧 '*!0&*.s'- !# 繂r-s'!!!ySsz*!!s*s',!!yM, s'!! S# '*!0&*.s',!!! M,#4 #476;#"2opW+0*3,#4'&/327653}6$[c477:c[$!< |AEy <4> ;#"'&52+Wpo>ܜ*043>#32J3 4'&+324,Woo$*04,&'&3;#766$[c:774c[$!< yEA| <3> 3+327654ooW,>0*(!(1^% !!!%#!55O^$$T:__'! !!&$<F +   276764'&'&">2"&77gc01SSSS1001SSSS1|||5kk\SS]\6666\]]\6666\ k>32#"&'!'%5!726&"CiiC!/Bommob]]b`jRP[@v.!3!3Jdl &! 4$32"324$35733!vwCC^ߡ``!gL7h׬z@+/ l 4! 4$32"324$!!5>54&#"5>32vwCC^ߡ``gNJ*%G<1yi]KO{L7h׬z@'%D%7A,C Nll D! 4$32"324$#"&'532654&+532654&#"5>32vwCC^ߡ``ofFU`y:TRTZrvPEDB5lVUA[L7h׬z@_0 6135-.)/%|}Upl )! 4$32"324$ 3!3#!5!5vwCC^ߡ``୽"~~vL7h׬z@Y5Уl 9! 4$32"324$!!"632#"&'532654&#"vwCC^ߡ``7f~9ӶOYi}5JRRJ.k_L7h׬z@\$=(F>?F(l '@! 4$32"324$"32654&.#">32#"&5432vwCC^ߡ``1001111W_,\fc:ȧ?wL7h׬z@u@II@@II@*g;  l "! 4$32"324$!!!vwCC^ߡ``G`L7h׬z@l '?K! 4$32"324$"32654&%.54632#"&546732654&#"vwCC^ߡ``6987577[\ ef.-+..+-.L7h׬z@L:;;99;;:apS{{Sp |]]|-.-..--l 4@! 4$32"324$53267#"&54632#"&2654&#"vwCC^ߡ``BV^.\fc9Ʀ@w0220111L7h׬z@)f;!AHHBBHHAl &2>! 4$32"324$35733!4&#"3267#"&54632vwCC^ߡ``V#%&##&%#wwwwL7h׬z@&*jmmnn( o!! !!!!#!#(!((!(0(!B({(!((!((! (Y(!k((3(( w ( #'+/3!33!33!33!33!33!30stststmnmnm(%8K#!1!!!!!!!#!1!!!!!!!#!1!!!!!!!#!1!!!!!!llll޶llll޵kkkkߵkkkk(((((!%)-13#3#3!3!##!#3#3#3#3#3#3#!"޵׶׶m#( l#( z! ( (& &  (&  (& &  (& &  ( (&  (& &  '%! '%!!!Ng>9%-d) 327$%&#"%632#"'++Օl``````qq|qqf' '/7?G%&'&'6767&'&'7%'676727"'64'7&"'62&479'5)3,?4C0x2)/-Z5>3@'5)2+@3C03)5'Z,G4?DD#VVcDD#VV c<1& j(0=Ju &,A=N:0('<1& j(0=Ju &1<>EB0(n_II'[[JnII'[[d) %/36%632#"'327&#"6767&'&6e`` :;;:{m('((((';99̙Rqq|qq%%mܱ[0$ %@%|"d) )73276'&#"7632#"'327$%&#"%632#"'Vg4343gg3434՞OOOOOOOOH++Օl``B!!BB!!oe33eje33````qq|qqd $  $eGyFAk^d $  $27$%&#eGyF+ՕAk^a``d $  $"3eGyF+Ak^``d $  $327$eGyFS++Ak^>``d $  $%&#"eGyFYՕAk^>``d $  $"327$!eGyF++Ak^```d $  $"!eGyFVAk^`d$)6%63"'e`Rqqg)#2f|q*qf(32>54&'."!1,.uBCv[10..uu0-D3366fJI426532&<U( $%632#"'327$%&#"!(++Օl``````|qqqqH(U( !#%&#")%632T++qq>~``U 3327$3!#"'$``Ֆ>qq``) %63"`qv`) 2#%&#`iՕ)q>` 527$3+iv`>q "'$33įj+q`)%632#%&#"``iԕqq>``03327$3#"'$j+,i``>qq% % %! %!$ `)32>54&'."467>2#"&'&J'$%]55_I'&&$^i^&%f/.0uv-/01\vBBu.-5wh))++Rh<:g*(+*)(픂235624IJf6633'%!%!!@Z r<'%!%!!X r<'%!%! r<'%!%!N r<'% !%!!!!t&t% r<<% 4632"&! ?N97MMqM`KAj>VV>>VVJ %! &A %! %A d(  7& 6  'hi./*X֖'% !!!!!!tg%ۊ<)) Ie'% !!!!%!!&Ng%M)*<?v^]"3263#!5276;'4?'4?26vi#1z]H3y)/ #&<+*lV#m14He '1l1 Z+dZ?33 #&'&+"'&#"/573;2?"#'57#&'#"#5676!504& 3(d{_R!' 8 2M <=Y4}V .e3B=Se` e9*=9 3@=}k !=Z4^ 5_gow!M73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&327632#"/#"57#"54?'&5432'&27632#"/"57#"54?'&5432'4327632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&27632#"/#"57#"54?'&5432'&27632#"/#"57#"4?'&54327'4327632#"/#"57#"54?'&54327'&27632#"/"57#"54?'&5432&'67&'67&'67'&327632#"/#"57#"54?'&5432'&27632#"/"57#"54?'&5432'&27632#"/"57#"54?'&5432'&27632#"/"57#"54?'&5432'&327632#"/#"57#"54?'&5432Gsq%&&#%'$:"#!pޞp[}9*;qTR}<(2w,JDdNSjDD% $+*$ $ ),  !! (&    %& ! ! '%     %& \!" '% !   %& 7SdR!%"#!"%=    &%     &' |" ! '%   ! &&*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQGh!99!  !77!  4 4 22 K44 22 22  11                   7        %&%&%'%&%'%&22  //  g               44 22 u !2CTev+&'&54?6?6/&2#"/54762#"/54762#"/54762#"/54762#"'=4762#"/54762#"/547672#"/54762#"/54762#"/547672#"/5476%2#"/547672#"/5476 I7-Vo/"*6% \8^ :x.[>  !    !  |             b     !      !             aG<s-8PZy9} KW2{0R^j ,: . 4 . = ,  ,   -  -  -  -   .  .   ,   -  w !! xLJK9`8w !! 7 ! !xLJK=~PZgKI9`8N I 7%7&5476R3N"e;Q 6$ 8'^4? !2 7%7&547!&'6:P!`$/A?S"="l-2DC[9 &! 4$32 4$ #"&54>2vvDDbcݢbFEc-QTR,K7iwBNmmN1Z00Zp C"32654%"32654&%#"&54767654$ #"&767&54! ]]CA^ A^^AC]]RutQIdmPmqNQusRn!$gJIggIJggJIhhIJgU\\Q srW\\^p A4&#"26%4&#"326! 547&'&632 $54'&'&632|^AC]]]]CA^^AC]mmnRsuQNqm..mdIQtuRhIhhIJggJJggJIgg ][[Xrq Q\\pe "32654&7#"32EWK_ȐɎ;P12Yp1"264&"3264#"54327&5432#"'&'lؘTڗml#褣楦s奦祣t کZTdIU ~z)5AMYdp{3'%&76'!'47653!76=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.x"gO$hJ Ki$Pf#؂ԕҘ4vUTvvTUv)  ( )> &%'$'&%C$'F ) )Y( ) OyyO vKK9__9KKݧꧦ]]_""""s!!""W&. - . - a),**)))) / . - .%-5AMYdp|5#!4'&'5#2#"&546"264"264"2647>'.7>'.676&'&>&'&7>'.%7>'.676&'&676&'&53!76=3%'676%27'%&76'77&'$%'#7%6'&7, 3ϔttt)))) ( )7 ( (/$$ % %$$&%k) ( X( ( Myhy?k>Ys>  + =rY>k?LY77%SB T+1SBS%77YK@@1AeA1@@H磤椣筁 . . . .E - -- ,1))),(9)())u- , - - G77W6 W77Gl^ ee ^l(q,&$pp$&,q( !!'!cc8h "!!'!##+572367676!dczD%8i [A.8YW8hA:F;/Itx !!'!  ##' !dc^rnVoRQn8hi[ef[l[J@36273 ##'5 MON@ US VZCv#,5>~3+&=43+&=4%3+&=43+&=43+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#5676!5S4S3S4S5T5 T4RS44& 3(d{_R!' 8 2M <=Y4 #8d#7$6$8;$7i$7 #9pPL  )Z. ;6ZV Z3%Y63 .87p  />Eqw!674#!!6?676'&#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 8 A4N,315>(I-4"a1lxXzbf=NS!\q&,L01Ne0<  9 H3 ;;Q4XmM;YV /M(=H: ,qLUD)8Wqke-Pm{NW =$ U  /0c)H?2@[nDF8T$.L !' !ANKOUDu@wL5_K !'7?KNQ>wDB&547632632%6#"'&'# #"'&'&6&'&547676CO""ONP4S2 R$|m ?wE 39 _D%V$F^ 92 Ev? m|4hok@mmr*%te2' BB90tU%) "ft(f" )%Ut09CB '29>3#"'43727&'#"$4727%6725676&5&dB1)X6E v=y(;. eP 0 %SZ7AFF4ysW$,J ]T.MMm@ed: ,'Z M'cM&T)2_M2%!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2'71z*-=80O&8-&Q&7>+2  ,2 =,2  =,3>,2463!2!2#!!+32#3#!8%Q'-7'P17=-,y07&#,>3,=  2,= 2,  2+>!C%4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!&'63!67!2nA+1*KK KKKK8JJSSCTTTTDPSS;Q%8C%39KILKIOKHLKIhghghghgE?-!D72654'6#"'4#"'54#"'54#"'675674767#%!/5BBDEAGCAECB^\ ]]_\]]=8(sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K!C%254+'3254+'!254#!'!254!&#!"463!!2!!#!3#3aKK9JJJJ KK*0,C$D8&Q:TTPESSSSCSSIKLHKOIKLIK93%N-?Eghghghgi!C32=732=7325732'654&#'%2&'&5&'5&'BCEACGAEDBB5/!:(8=]]\_]] \^SS=SS SSb SS'6a!0J)K>*B \\]]:]]J]]pO!%)-15 3656;2#'7+"/#"'+"5&54775%"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5%75537'7'3533553535'32767&5%2?&#%55'575775775J5[( 9?8P7?VE:.>DA.( 3DPDa>@#+6x `]>  >[Pr @se"^L3 4UF "V;=\?/ /*U9[' ."n?$-)&!Dh2 ) ` ?hhE-g> ?. 8Ve lTErf^5.>=9|5"-l)d ,&>vv]cccWpC-+ d8 Bpp>W]oaxvuPp82,D ^8, ^B$K+ "1R[+e*;GW QU I&? gpo% w ^SA$ 2 9i-5n02D|&IY^Pw^%\??\OWC ,,1 /211/=;7777=321811{908hN%b\Dh,)h?17I21!122223 21&2%2#"'&=477654'#"'5473Ձe/o WF^a}/ X 3 X ؍MOb>YaYƮ58l7P P@ $0<FX + &=6&# 3 6=%&#"';27!5%67%!&'&'2+"'&=476.Yf㮿Y0薖q3P+2-)VEV'quI3=%)H3A#S]ٱZYHYoX(I_ ;.2lOP%.G6R%&I8Z 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'7&&=F! wM>7TBWR?^m &ab)-R7kSWos4K9>>4::T8S-\_l eu?>L=#mg'.2[E :jx(Nr%&&&+F 7!N &".\S$XE/KC\a*0/'rSCٟ C (RKpF|bphc'R"J$Zw1F[q7&&'7'6&'6#&7'&#"'5&567#&''5&'67'6'4'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>21167#&7 m *VBRa&G ?V M]; :)(6hCs/Ni,H HCfE_ 7^eAB4CCC <1bSBV* 9d i'Wh"&VqH,7u07#]69-/6,X(hR(&"hZ,HK80C:7%_6/-C  "H1 $ &b5 4CUE '(!`9 !,(MTE + }r}A" 7,)f[4f AD <@0&9c?"V+GoMK~aG g9s &0@k"?c*GEKX Gjt9hN&\6 '''' 6\%$&'6&'67327&#!65#&3 mmgrk zYYޱqZre[c7 7 c ,35'533#3!'#'5!5!5#5335#5##3qqlzyymj@@@<<3ffX苜qXGccG J 326&#!2+73 ### 3׼irriPוؐB(T33#!!#'!'57!5#'5735q~q+!#!573#'5!3!'573!#'73!#'5u__vhhwѡIjj8/w,32#' 37+ &5%6323'#57'53@ǽ˼U4{|I0w_?8:<ؒ6ʞG2k >Y3~||~Obs32732753"'#"'4323$4'5;+"'#"'53275'&'&5?5572'#&'&57634%476=%9*"'<>((I- cE*HiAt>=2{6mNPp ZiU;xT"m ;wuP1RK00D(;,,e"@  p$B(!cc*@rJ&*EcJkg Fp/ԶQRmT_g2#27654'73&#"#'&'#"56='"'46'4#"4735#5&547/63654'%65432#"&546324&"26%! ! : 7"&66&$55J44J5wvϚ{ɬ)::)*<<**<<*):<'L67I&u'uu &u'uv &u'vu &u'vv &v'uu &v'uv &v'vu &v'vv y <BHNTZ`fl3264'&#"&7367'67675673#''5&'&'7&'677&'67'%7&'&'%6767%&',*<&`7" bK*V&"g{ M M '/! !  54 &#%#7&'67&'67wv:4,<[-ch`ch_7IL6a] ]pu otpu ot '/! !  54 3$3&'67&'67wv::]ch`ch_7IL6a] Uypu otpu ot %! ! #$''&'6%&'6wvcGkvJVVr~w{t~w}7IL0c Z    "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"FF47H8(S A+[!?27@yf756FF u>p,y9#_>?@7`d@\hPPPPy?+<>w_VG{?,rCA+ +"'5676%&'547327676=&#%c_,*Iq{S$'NJǒxbO P >nS]] =f+! &56;2'5$%75#"3Q_d,)Hq-zT$d/'NK7ycOpO >S\^ f01>7#'#53'&'&54767&'&=33676=3#326'&$ xwatbww!$$!wRMi"iLRx "iMRurRLV$|ddb e|$% ZSSZ %_TYYT $4&#"326&54323###53&ёϔ1./|䤣L~|| $32654&#"%#"54767#5333#?БДϘҖ{7䤣L~|| $&$76+"'&5'476!7!iiggi$jg ՕeE~Z5s qttrtt<֤ꧦg\ul1B5264&#"#43233#!5nom覨b͈wy{(|#53533#632#4654&#"#``d~~dc}mZyH{zF 1"32654'#"&4767!!53#5!!3!!#3!!leGG22G47+Db`E*8쌌O79NN970LؙL1KӘJJ-<%#5#535&'&'5'73'3#'73'676=35'73'33n^F][E_nzTThOʍ7NjYYӖy! #!!!'!27674'&#pZ51;J&u@!IM_\ǃ$P<S  !#"#&5463 67!2#6#"t3`ySOuwNTx`3uX1((1E." 6&'67>3"#"54767&'&#529 vEMWov*&%+tm@ME\&ϖ=Bll)'ҕ*l8lB=&'5 %$ 56?6'ݗ85Tș4ZZ//[[5 @o$8"3264,'5'&54632264&" &$#"&547>vvVTx v]BUxxyxH v^A (+|T!%lgMLx)+{T!&lϔgMMs <>'.463227#"&5454&#"&'&5476766&:DC:ɢy@Z:rdYwr)! ".hi+.iwsSo:JKAKLݰ |XHwyo†<>bQs-.cx68<32>32#&'567''#&&#4'3>64&"d9k$D7J+v=6Z*Bo,4x9 %j }*ƀwϧ}wh^)etWW<aAktAO]Rk9#!!!5!&5432!!5#67654&"@ ><覧=]NܙMhh UyzzyU ><84353'5#"'&''#&&#4'3>32>32]PPP=(,4x9 %j >9k$D7Jo}vvxJv<aAktAO]ƀwϧ!5!3##'!5! ` @i8080k<'/27632#"'#576&#"4'5267>327&'"`Ibmn(q|n^,:4!~w$))%n4TuݾgvxaX[&ŝ9 A3276327632"'&#"'&#'327627632#"'&#"'&#'%g) ,N210&%pbUWMe0N22+0$h( ,Nc0'$qbUWN13/M31+0(GG$3LKGHb 'HH#2MLGHa S!5!37!!'  _76`S@ʬAR $Td67&'&"!3!67>54.#"!&'.54>325467675#53533#63232>54.#" .BKIC54CIKGFB/l &">ac^HD  aa_aa !EG]db=#% )(()+)QPQ((QPQ)+/ 6klj$?6FWWF6?$jlk6 }++--HNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32767>4.#"327732>4.#"327>54.#"732>54.#",V 014.K0/*'<00<")11 NR'00 YԣLE z  hV!  Z+"  ^  _33@]22-"40446/*33UJ"+33^1/K=0T* ####  #&$$&##&$$&#  B #### *"$$" 2A!'-23353#3!53573#'5#5335!75!!5'57!hSShgTTgUVJ+IAC֛E77__vtt4!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 6!%%'F(F&%F)F'&&!4 j6)EKF(8Iv0411/59<5&?HPPIK* ')+K**K+)' *KIPPH>&5<:6uN|l||l|-I+N))N+@6:55:5/F*3V6&7!&54''&''67.76;+"'5#"=6&'76767%25#6&' .Q$( kQ2*(}Q +A "^0!V'>A %E'75'Q]Wy_I1 #C$F)'`xo8:.@s.P mz "x?.#1p#41`&jD"acLHJ ~447| JlL"b P[32>4.#"32>54.#"!5&54767&'&546767&'&4>32'&'.#"y4[14[23\20[V  CJ "$&LF'F%$G(CN%"" S:>st=:pd88dpg669:%N&KRS* 'TM**MT' *SRK&N۠:9}qyyq} $Tdhy67&'&"!3!67>54.#"!&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632# .BKIC54CIKGFB/l &">ac^HD  aa_aa !EG]db=#% )(()z7<>k987%%77;k=;7+)QPQ((QPQ)+/ 6klj$?6FWWF6?$jlk6 }++-- !yCB{C!$$!C{BCy! HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!,V 014.K0/*'<00<")11 NR'00 Yrr_33@]22-"40446/*33UJ"+33^1/NNOO2A%)5!5!3353#3!53573#'5#5335!Z;hSShgTTgUV^^/oo#E774@4767&'&'5676767&'&54>32!&535#5##3h 6!%%'F(F&%F)F'&&!4 j<5&?HPPIK* ')+K**K+)' *KIPPH>&5<:6n5|l||l|*J".7=6&73#!&54'''7&''676&7;2547#";65'"37IML') x >oT`+`gZ +Y @#]3?&W!g A8/QE)',Qo8:$whPSmh**z1"0@)5"@YRb.&54767&'&546767&'&4>32 "$&LF'F%$G(CN%"" 9:%N&KRS* 'TM**MT' *SRK&N۠:9"Q##"'##56'##"/547? dsU 2`g26;2"##'65##"'&5476;2&'5476&+"326733276=4/#"567654'&#"35&5?^g7%SB\JLZޭ\<."7Y@ؘ aj7{6Gf!KQM 1k`t0%K6F98:d  mOE:R p&i  C]&'Ax.+0 nM,W`c,H3#&'&'&6%3#&'&'&63#&'&'&6 $&54673 $64'&'7  +  , 7  , (ӧvCM)NDv9?cyɦt3Z|`ŻN[O}БBr1a`bb`a1)EMUUME)r3#"/4?23*A+ ZP-@3#'654'&'#"54732Nn7S3ڿWP'6?F` 1TFG*֙-@R/"#"=4?2%#"=4?2n0#NI<Ù'PH*~: ۉ8z"C"'4723!#"5472!5bGZOO;Z$}@Ϝ 3363'$6'")2y k?WXc1  3%#'#3%#%,$//c}(,377#'#'547#5773%%F*kknm*&ttrt&<<7CA<<{8AMtE#&#"'5654'5673;54'56732733273+&##&"#&'565qI3 YY4Jv4(~)4vK2YY 2Iv4)~(4v[#;17F-:S8!cc!8S:-F71;#[RS9 cc 9Sv  ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5,+UU++(*((=((<(())ͼ mm r`^^]qͼ nn q]_]`rchh1hh-.,-C..C.,.-n//_R_//~ijhh~N yy ~hiii~ zz s.. #.6CMhw!2732!'5675'&=32#$'57637&/&+"+&532?4/%32#'#&&=4?#'57335'3!273+#='!"/547354;2?!&=3d4EXJ)fd2(Vfgؐ7FK(?H! 1x0!+V^i.Z LZshV>N%!Jh,OUU*^7QG8*F 1 . ъf)MC =g9EkO 9!(-);&  ]t!y" & 2| ba$ U+  2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676rK((#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*a\MOHK$k$823!a IF 7=c`O]BA6$k#- kNA! 1DW!!5>7>54&#"5>32&54?'7'7!!"'&%#'73676'77'7'&'6762&9,!C6*]PDe+s"+ }V(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*]U1)8(3&ncQ&D- mMOHK$k$823!a IF 7=c`O]BA6$k#- kNA! (=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676'77'7'&'676 V.a?A[/USNGdhA@CB%VNDb,tK(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*S<\el23-2['&')b YK4JMOHK$k$823!a IF 7=c`O]BA6$k#- kNA!  "5H333##5!5&54?'7'7!!"'&%#'73676'77'7'&'676Wmm(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*Rv_`MOHK$k$823!a IF 7=c`O]BA6$k#- kNA! 2EX!!632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676u,}-^?ET/JTTJ#H??(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*_ptcdrr@89@ SMOHK$k$823!a IF 7=c`O]BA6$k#- kNA!  "7J]"3264&.#"632#"&54632&54?'7'7!!"'&%#'73676'77'7'&'676,2==24;;7?NST2izix~"E(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*Av@@vAf`5(sa_t MOHK$k$823!a IF 7=c`O]BA6$k#- kNA! .A!#!&54?'7'7!!"'&%#'73676'77'7'&'676_U(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*2{MOHK$k$823!a IF 7=c`O]BA6$k#- kNA! ':7&54?'7'7!!"'&%#'73676'77'7'&'676(#K87Y $kmMD3)M4=z!5VL86Y"89/z#2*MOHK$k$823!a IF 7=c`O]BA6$k#- kNA!'9HR!273!567&#2&'76+&67'#'6765'533!273+#'!"/47_4BZW \_&,,X $q ӚeHZcTi*KT}75 b\V/V'f::p ?)\ ) 9s s%00%2<J\e3 + &=%62367#&'&#36&#&#"3274/"34?3'35732?5##!'53.cW{K|".m4 wJG<-V0F @jX[% 8HD }D}yt!7_ ;`OL5_k, ߋ~y}/M<4{1;C,[_ei' [)$ /:BR`j # &5%6; 65%&# !27#57&/#2#&'676+%3#'#&'47'3!27##'%!#"/6<n\Ua->+DSR04IbFER(k(_{aZ)F NF&y I#XYtTpXYSmEb,#4' FV ! Y1 1_ Ug,17H27&' # &5%6367&#'.7&67263'#%; 65%&# WNn\UaNWZn~rzrszr~o>+DSR&XYtTͿWzzWapXYSa.232#!7&!"4#".54767267Ws   y+S Leopq:*$J%>)َer(Y$h?}}|r<.32#"&:BAW6㖗866 65zchŮ;?B32#"&$2#".46:BAW6㖗866 65:666 zchŮ;?B4.#":BA6 665zch =B4.#"$32>4.":BA6 665666:5zch =B54.#"##"'5##"$'&'0!5!5&'.4>32!!676767'%'#A"$@$%@#"@$"#M ONAwbjR8=>p;;p@?6HZTwCNN Ng'H''H'(H''H`XAK|@X1(ԁ3"|}DD}|" 2/ "1X@|AX1#/673&/'67 &'"&'6?&'3' CQT76'@\R#\;;["S^9$C9TSDGI;322=  9%EEE >2dUDY,  E&%+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... l3% % 32+#".7!"&'&'#&=4;733783%++VTXV,*3/.tt/?GG~F6F~GG?>D9/Cp"632&'.'#!#!#0-D'qrJFloUrL|MsVT 'NQ9;:;PHi?CD|))Z h 132>4.#"367#&7&$735&'.4>2-R+-R-/Q,*R̛X#/&)@O߁;6FNOQOG3dY22Yd[00-&皗1 #+UU+ ?GO277''"/&'&'7&'&'7&47'6767'676?  "&462S)C?kI=;/!#pp#!/;>Hk?C)S*D?kH=:."#pp#".:323#67#&#"/&'&547&"'6%676c&Rc!#QlE+6o.5"Y67+-4*&bN%#!dW,DH5-?65$[4-*2DD2/FEQ#"/%H-HMI2/$/ .$.4OLH,J $"@Dv>0&8a>!U*~EmLK}`G f7r &0>j!>a)E~CKW Gis7g:M57LL75M-Z '*''*' Y (5[J5( \d (5J [4 '&.FR2#".54>&'767&%76'&''67&'&'&'6767654676'&7>326'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&:!!  G@s.0-[Y  Y[1/r@D3//b+,--,+-*).+.,,-*G?q02][l88jgh 2{|2 ̚45::64 0|z1 gg)+,.*)MMLS68!8`Z\21p?G3..3368  86!QKM)*/.*)M5$##$59gTVV9Z^^Z9++VTg9'(''&()I8:9889: Z_59eUV-, <8.>euvc>-7=bccb>7-?cwud?/8MWZZW **D@@D+8,-VTe95^&)(&''(DA:AD.*!Y[[Y! )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"%2#".4>m#1(.-!*+%(27%#+&'. )--#IQ[K(,##$*M\PQ33- ;-5?VO<8-= .34/^]]_aY[KRONNOQ#ejpMcNTvJKr?VlLWW7p jk%n^*V{ww[11[ ww{V)\#fd-#JM 7B/""0C7 NK",df#νhhοggQUXXUZ %3!'#!52#"62#".54>BOF/1-"#  5 O Dn; $$$$v33'554#$/V R\ FkGSGUW GJG .5CK&54326323##!##53&4&#"326!&&#"327&54654'6.׊pq.|Jё<5~w19O[[_5;ϔ81x hhgLFF~||ב-  䤣lrrqY-5DL&'&6767&'"'&'&'&5'476!7!! 76'&'&'6'&iigg)0 ֕a#y`eE~]Z7e=ES+h%igh(-phh5sqtt-ԛ1 k&iꧦ g\}ul  An?\27/rtts,͓}qt)8GO'"'3###53&'&54326!7!&'&36'&&5'47&#"327674'ӐsLW{.׋pndE~Zi81}5=v~5=Г8lhhK) ||LGD g\uls螝՞䤣hkrr .4&#"326&54762!7!3###53&ёϔ1ϮD~c}&䤣羚 o[tꝇ||</M#"'&'&'&54767676327'7'%'276767654'&'&'&"?-="! <4XNVQQU5=""!:HS]ZY^XAA&% iiD^29i..= >:Q(63,M=>! ?#,3LT~3L5|@/8'))*53<@08&***44 \2:a(EVUb_UVE@( %CEVU_bUTG(Hij:ο\ij+.<;BA;<./+.<;AB;<./Y/O3##"'&'&'&5476767675#53' 276767654'&'&'&#"H6(Q:> >=NJX\FQ9>!!>=M,3`>?`<44***&80@<35*))'8/疑 (@EVU_bUVEC%##(@EVUb_UVEC% kajP/.<;BA;<.+/.<;AB;<.+/O####"'&'&'&5476767632333'7 '%3276767654'&'&'&#"ƇL $9>NLVXLN>NLXVLN>5GC9:/..+>5Y;2"'&'&'&5476767"327>7654'&'&'&JM>@ @>MJJL>@@>L<35S)'80?<45S*&81#&BIRUb_URIB&##&BIRU_bURIB&s\<;BA;<.+\<;AB;<.+Y2"'&'&'&5476767JM>@ @>MJJL>@@>L#&BIRUb_URIB&##&BIRU_bURIB&?J;"276767654'&'&'&2"'&'&'&5476767)J!  !J   78....8777.//.7"$)($##$()$"06"@21.2@?FI?@21.5="$)($##$()$""$)($&#$()$'sR 5%%%Mi׊eMM^xxV)7654'&'575##&54767'5!UjI!F44F JjVnWL'OO(KXo4b\)1%==%1)\b4ߴ:`\KDDK\` 4&#"326&'&5432#ёϔS{./|䤣L~{Zy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&lg&  ' !   &"7WR!  FK8!  A@   %bJdG[r             $&$  ' D"&%  $ #  mR )Ky           M!r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&)"")".'bI_H  $G $#=M\" "XQ=#$ G$  H_KIb'i)"")"q    l?W,># "#" "  " "#" #>,W?~    OYx3!#!"'&'&'&547676?6767676'&'&'&#"#"'&'&'&547>763276;%326767654'&'&'&#"6767654'&'&'&#"32l[[GJZ-   @A   !8KF  &RW7"'  / ! '  $g  %    &    OK) Rd# !#& "*"D '  ""! 2   T   :      AZx-4H67&'&'&+"'&'&'&476767632%632 #"'%#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&476762  IS<)(!$$*&+)('$ *O:R{356xRO* %+&.#%% ",&+mwn<;;8rowp:;;BV0/+"8:D@*|sa  -F(7 "*=8&0!2   1-5$& 6:B4M,Ji&'&'%&'&"632%676767654&2"'&'&'&5476767"3276767654'&'&'&'2#"'&'&'&54767676~8  ,!('^&) ?.13-z  9 + 8 8 3xpkXZ+--,YV{{mlXZ+,,)\Vnl|xhe4330ic}yge444/ja~wIP"2-.$  "" PI $.-2!v   31cdvwzwcaf31cdvwwqi`43d;8rowp:;;8rown<;l,-57'36%33#3#32+3#3##$'#7!:Z0nhMZS?++?SZMhn0Z:( jPP,PP` v ")- !676762!"'&'&'&54!!J &+}r1r J!,~'h,  k-"s! K476?6763&'&'&547632676767654'&7632!54'&'&76'&&#"'&/&'&'&#"#"'&'&/&'&#"&'&'&?6'&'#"'&'&#"!'476/654'&76'327654'&'&327654'&/!/#$ +CD"   !%2   !,F#  1')D  VzVT+g/& ,$ )- 00 p*  $ ,  S  2 42  asJ#   l71]% /~[#<$  o_%?,: *(;Y)$X$+|=L!6CX&PY89Do6 b'n2  83eF] 4T&  &  /50$?- 1@& 3l K  C"P1 :07@D:5XI6.D3[+-1:   q/A8   g&l9Lp{7654'"'&#"+"'&54?67676763276323273#5%6767'&#"6"/67#"27632327654'73654'676547&*b+"CZJ"Pt >Tn:< /8)5" '$1P8b, P0*'$M/hK9O!Lt8gC9C%V)+.|&-C-)+8K Qe+',T' ;cs  /^"|Y/ 428ۇϕl%%ot5oA='Y$ aT* ''G+- %_kj~r}jL`І|\gK@/.85c($7")3SZ67654/##3276?7%54'654'36767632#"'&54767632'610B ډ v=;z1/f       (r 4@  H67; zh| 9 >6!q     B/> '-EL4'&'&/767675'7! !'!654'!4'!!$4767>2"&'&'!654' .. UTT(oR-fH ~!88!~ Uppph,p<((zd7")3SZ&'&#"227654'&'''%'654.#"65&'&'&547632#"'&'&6#" B016˄ <W ;!1 .fa      4  ;76H    |h> 96qm      BO{s[#C'%%.'&"27>7%$6%"'&'&'&47676762%'|- -      8 8@uID`qS   SqGYq > q|s)&%$64'%%&'&'&"27676--- &  & !q``q! 2327632#"'&'&5476#$ 8z@A )/?'@xH )0$'*'2 27277632#"'&'&5476#$ [Wr o&-23A?X@yJL 1 - A  ' 7 eee77ɍ8ɍ?k ONOOt7tt7u B2632#"'&'#"'&54767'&54763267632676y I  lsD!. m$   1O3  6*=P*> "#  nQ26#"'#"'&'#'&'#"'&547&'&54767&&5476326763276  Ӆ"   PmO!unY, ' _ :  (̢1#: _& #- Խ =1 '2ĺ d #!!!!!%!!!!!!!!#!5!3tnonoUHVPBXyBd !!!!!!hp"#d35#7!!#!5!343srsd!!%!!!!!!Qfgh#p"#0 !!#!5!3phhEU3!!'#'!!#!!3!5ӇM_ r,,_ #!#3!3'3#!#3!3###533D,Ԑm_|P_H_dQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5oZQPB;( -- &=>TN]o"#@>%!--!'32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&  J))II))J &$$S$$!  J))JJ))J   !$$S$$&*!""! ((\(( !""!#%    R.-R  R-.R "   %#!""! ((\(( !""!*  " R.-R  R-.R   J4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632!  $$#5)43+0!"" %='4  #--24+."  ".+42--#  %-*:  #"!0*g*1 #$  #9+.#  "Z34+-# #-+47(." $-+C,7"  &d8:02& $&20:=-2& (10?!  '&$6/r/6$&'  'D+:!  '228:/3&$$&3/:822'  )2/@' ((& :.:806$&& (K0267632#"'&'&'!&'&'&54676763267632#"'&'#"'&'&'&5476767!6767632#"'&'"'&'&'&54767#"'&'&'&5476767632!#"'&'&'&54767#"'&'&'&476767632&'&5476767632!#"'.'&5476767632&'&54767676   $             6   /           $      (   2     6           %    <    %  (   N276767653"4'&'&'&Nxhe4330ib~~bi0334ehx;8rown<;;==>--28;BA;82--28;AB;82-&lLl+ '1% %2"'&'&'&5476767! !+ ==!fx43+,,+34x34++++4o¬ì6a-28;BA;82--28;AB;82-&lLl+ !''!! !! !WUVV]RRSR^->==>-Iٶڶ&GGlLl+ 3'7'3! !7!%%!"pZ"ZZ"Zp"->==>-giiIvIvIIvIlLlc+ %5%7'%!! !RRS#^->==>-KKGTlLl-  '%'!!!!kkspy{;y<zffz> NrqN qrK% % -S{H{{G{SlyyK7% %' -i??4?ih@3@@GstGWcGtsGcd/3%!!%#'''%!5!%777ldLr*rp*LdldM*rq*pMdE.f:UūoxoU9g.Ff.U:oxo9U.s54'&5476276767632#"#"#"323232#"'&'&/"'&5476=&'&'#"'&'&547676323232?&547'&#"#"#"'&'&54767632676C(12l30'E f:#=6.@ N8E vZ  \u E8N @.6=#a  wFNd0110dNFy~ DzI'#4#,G2$:;$2G,#4#'I~? yFNd0110dNFy ?~I'#4#,G2$::$2G,#4#'I; s"276767654'&'&/54'&5476276767632+"#"32;2#"'&'&/"'&5476=&'&'#"'&'&547676;232?&547'&#"+"'&'&54767632676&  &  PC(12l30'E f:#=6.@ N8E vZ  \u E8N @.6=#a PL wFNd0110dNFy~ DzI'#4#,G2$:;$2G,#4#'I~? yFNd0110dNFy ?~I'#4#,G2$::$2G,#4#'I; wj'&'&'&767654'&54762767676'&76'&'&/#"'&5476='&'&76767*,dJS&&cASN'@2+_:1JJ09`++H,IRAc&&RO`4++,dKR&(aDOO&@3+`90JLOF1:_+.D+JSAc&&RN`1 05HoIH 53c!77\`j4OO4jfVA7g/5 HIoH53   05HoIL43c!77\`j4OO7gfVA7f05 HLlH53  w67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"3!,L,"20[!Q?R 'b3;K*9CN90JLOF1:M@;-H<2c& S?P!\/.["P?Q &c2:4/.&"./4;=16'+&1,"%&!6'+&./4:>1:#"$./4:>16'+,4:>16'+&./4;=1cn%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/7676767654'&'&'&#" ,!2+75.+(%),7+2!)%+(6,4."7("2*p*3!(8!3/11+)%(!3*8+($)+-58*3!+ F7 A = ;*] A &l    1A ]+;݂ !l&%",1&+'61=;4/."&./4:>16'.5 1=;4/.&&./4;=1 5+'61>:4/.&"./4;=16'+&1,"8_/$   $/_c.,b" $#  !I?30C !'#  x!  #$ "b,.$  #'! C03?I K-[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&547676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&547676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762  !/ !  /   @!$$)''%!$$S$$"#(&)%$#2#" '&-!$%))%% $$S$$$"%)(%$ -&""#      /     / ]~     _ /   ] /        JJ!  !J     2 6 Y2 6 1    8 < d8 < 6   %),++*) !$3R  R3&!-(-%2(&"#%(.2$( &',+,)) !$3R  R3'! )),,+)$"#%(.2$( "   i !xg   !      %     !  !   g    "$)($##$()$"$  % %% %  M<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-;n./''''/.n.0&''&0eN>E1354BAKN=F0353CAJxhe4330ic}yge444/ja~\[Z](.35<;53.((.35;<53.("68MITNLJ;9"68MILJ;9m;8rowp:;;8rown<;}}w"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"&,"20[!Q?R 'b3;K*9CN90JLOF1:M@;-H<2c& S?P!\/.["P?Q &c2;,,;>J=!6"=J>:,,:>J=",|XX|X.U|JU~-|U ~U.<%DREA 11 AERD%<%DREA 11 AERD%9r99r W +?Sg"&462    "'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767wvv M] LV M L#)c*##*c)##)c*##*c)#ce,2$$2,e,1 $$ 1e,2$$2,e,1 $$ 1K8)UL)U~U)^U)Ip17#((#71p17#((#7p17#((#71p17#((#7Y'.n.''.n.''.n.''.n.' K &3@MYam+%5%32476;#"'&'7632&54?#"632'&54#"/72#547"&462"'&=3$ v #$ v "@%%@(@%$&$@%%@(J-Z-OpOOpJ-Z-*2d2((2d2M*'FI*'FeF)*IF)* ( a 'U|XX|Xc( a 'Kl267632%632#"'%#"'&'"'&547#"'&54767#"'&47632&'&54763&5476'* F/-<.  E** C!Wc.<'5 F *M+F /-;/bX"C ))D  /; <F*/#J"5C7/ N".X.$M51C5 "J#//#J{ 5CLM$.X."N 51C!wJ#/[ #! 4$#"# 4$32632!"hgٜؤlLLkpGQ?rAm %!#!3!bVZ?ZS.Sd,m8 %!%!35!bVZ?S.dd,m %!!!bVJ?ZS.SԂJm8 %!!7!bVu$S.SdJ  1120`1111SSRU"SQ#Qk!7!6(!33tJ(n?l(!##lvtI?( !33!33tJtJ(n?n?l( !##!##lvtIvtI?n?BOS2#"327676765!"'&5463!57!##"'&'&'&54767676#  98A)1zj2~!'8::>00/1=;;>/2qKFD6454FCNNCF4546DFKo5?'#"'&'&'&547676763"'&'&'&5476767632?gC?=0/1.?BK9$&! hTj]-D$'FD,.6ME%)&2:'Vl:g0,?)!:"9JOCQ>^v:Mc*ZeC03N35%&-Kt\K%9S >BWN=!$?$8(F!5{^?ZxN676 547&'&327#"'#536767&'&'&5432&5476323254'&54329(<G8;k,0$#CV[<'$a #9 !7AX ;7%'27)b3[X H<ߞ>$3g:=TEB7WPfG+1KHP<Ff#&T'0P+A'<}DCh'"05276767654'&'4igY[FJ$$$$V^bw~9==?x}/CD}>C/GFCG# !&547"xuvw҇>2;#0!!676.BDx;:t<_! !_53} ! 55! !iR ! \R2! !E53Q ! R55}__֕jj.'7'7__j3jB$#"&=4&+5326=46;#"3a77`=MRcdQMtsݓXXw(326=467&'&=4&+532;#"+w=NQdc*(N=MK1077bKM࿾XGGXJI9:tJJl ! 4$32!5##7#vwCCL7h/+l &! 4$32>54&#">32!5!vwCC{OK]iy132+32#"&'32654&'>vwCCϼAUVl5BDEPvrZTRT:y`UFf[L7hA}|%/).-5316 0_pl ! 4$32#!!535#!vwCCJv~~L7hߣ5l *! 4$32>32#"&'32654&#"5!5!vwCC._k.JRRJ5}iYO«7L7h(F?>F(=$\l 2! 4$32#"&54632"32654&#">325.vwCC111001110ɷȴ:cf\,_WIwL7hI@@II@@= ;g*l ! 4$32%!!5!vwCCa7L7h*l 1=! 4$32#"&5463232654&'>54&#"2#"&546vwCC75789657e \[fu+..+-..L7h;99;;::G]| pS{{Sp |-..-.-.-l &2! 4$32254&#"3267#"&'4632#"&vwCC7ʸƴ9cf\.^VGw11022011L7h !;f)HBBHHAAl $0! 4$32!5##7#"&54632"32654&vwCC&##&%##%wwwL7h*& nmmn=(F  76767654'&'&'35%33!  '&'&'&5476767ywbd0220dbwyxwbd0220dbw9or6886roljpq6996qp96oooo6996oooo6}9:݈@>}~~}>@@>}~~}>=A_  76767654'&'&'!!5676767654'&#"5>32  '&'&'&5476767ywbd0220dbwyxwbd0220dbwYVS%F;=`HILVW?cdB`a9or6886roljpq6996qp96oooo6996oooo6_.X<<;_<<5'(]]IBBZooV@>}~~}>@@>}~~}>=Om  76767654'&'&'#"'&'5327654'&+5327654&#"567632  '&'&'&5476767ywbd0220dbwyxwbd0220dbwhh<:mmDGHM=NGHBCw}l89un;DESJRH@_`fj9or6886roljpq6996qp96oooo6996oooo6yNNtaa'(<}~~}>@@>}~~}>= +I  76767654'&'&'!33##!5  '&'&'&5476767ywbd0220dbwyxwbd0220dbwp&9or6886roljpq6996qp96oooo6996oooo6 @>}~~}>@@>}~~}>=?]  76767654'&'&'!!67632#"&'532654&#"  '&'&'&5476767ywbd0220dbwyxwbd0220dbw;J !iiCKE@EN||;9;<9or6886roljpq6996qp96oooo6996oooo6c nm)}|X@>}~~}>@@>}~~}>=,Jh  76767654'&'&'"327654'&.#"67632#"'&7632  '&'&'&5476767ywbd0220dbwyxwbd0220dbwa:9sab:99:7o6MK *@@M^^ģbcxz7p9or6886roljpq6996qp96oooo6996oooo6KJKKJKllE&%mnޟ-@>}~~}>@@>}~~}>=$B  76767654'&'&'!#!  '&'&'&5476767ywbd0220dbwyxwbd0220dbwzp9or6886roljpq6996qp96oooo6996oooo6`E#@>}~~}>@@>}~~}>=+BNl  76767654'&'&'"27654'&'.546  &54632654&#"  '&'&'&5476767ywbd0220dbwyxwbd0220dbwg<;;<<;;;^hAh^i;;w3i^^jj^^i,9or6886roljpq6996qp96oooo6996oooo6,=>=>>>kl>=EggOOss\hh\]hh@>}~~}>@@>}~~}>=<Lj  76767654'&'&'532767#"'&54632#"'&27654'&#"  '&'&'&5476767ywbd0220dbwyxwbd0220dbw7p6MK *?AN]^Ģbbyx788c9999ca9::9B9or6886roljpq6996qp96oooo6996oooo6lkD%%lmޟ橨 KJJKKJJK@>}~~}>@@>}~~}>=+8Ca  76767654'&'&'"32654'.  735733!  '&'&'&5476767ywbd0220dbwyxwbd0220dbwK('NLNM'&IHHIHatv9or6886roljpq6996qp96oooo6996oooo6{z~{ӟ>-,g%&݈@>}~~}>@@>}~~}>= (!5##%  '&'&'&5476767kn9or6886roljpq6996qp#:9q @>}~~}>@@>}~~}>=#A676767654'&#"67632!5  '&'&'&5476767`a`Bdc?WVLMD`=;F%S 9or6886roljpq6996qp ooZBBI]]('5<<_;<}~~}>@@>}~~}>=1O>54'&#"67632+32#"&'327654'&  '&'&'&5476767_f`a@HISSED;nu98l}wCBHGN=MHGDmm:}~~}>@@>}~~}>= +! !335#$  '&'&'&5476767@J@搚9or6886roljpq6996qp  @>}~~}>@@>}~~}>=!?67632#"'&'32654'&#"!5  '&'&'&5476767<;9;||NEDAKCii! F9or6886roljpq6996qp=|}'mn %@>}~~}>@@>}~~}>=,J2#"&5476.#"32654'&#"67632  '&'&'&5476767b:99:bas9:}~~}>@@>}~~}>=$!35$  '&'&'&54767679or6886roljpq6996qp@fE@>}~~}>@@>}~~}>= $0N2"'&476' 654'&'>54& 74632#"&  '&'&'&5476767i;;;<<;;<*iwe;;i^hh(i^^jj^^i,9or6886roljpq6996qp=>lk>>>=>=EssOOgg]hh]\hh@>}~~}>@@>}~~}>=.L%3276'&#"32767#"&'"'&547632  '&'&'&5476767=887xybb^^NA?* KM6p7!a9::9ac99999or6886roljpq6996qp /޸ml%%DklgKJJKKJJK@>}~~}>@@>}~~}>= %C2#"&547>  '!5##7  '&'&'&5476767#[--Z[ZZ--KMMK"LOt9or6886roljpq6996qp{zz{ӟ>-/g#&%q @>}~~}>@@>}~~}>ij !!5!!IKG ppp 7%Qp?4NGi85 b=<22pJJ '-m?GNi!!iu9.Ǘ>~~>iu2"&'&'&5476?!".'&47>3!'&'&54767>2 .(  '!  !'&  (.h2p "2" pi8!5! $EvZPJJi8!5! $EvHJJi8 #3#3#3!!5 sll66ivpppJJi8 55!#3#3#3$Hll66΄ΊXXXXi8!!5 $EvJJD! k>>D! k>>  vvib3!5 5!"'&'&'&i &&,v,&& 0+*%!JJ!%*+i847676763!5 5!"i &&,v,&& 0+*%!JJ!%*+0]!! MUVXeooi855!q΄Ξ0ij%5!!53  !Io>ij%5!!53  !Io>& !73#57!!'|Zoto|C} 2&& 5!'53#'!!!'Z| l }&2 !'!'!53 !yG!Z&cZIuoڞ  3#5!7!!! ycZIcZ5&o rd !53#'5!'! !c-Ic-&-fo%Jdc;dJrd 7!573#5!! !--c-Icfo%LJd;cdJ1!6767632#"'&'&'! $Iʞ uB "&*.37#37#37#37#5!!!!3'#3'#3'#3'#6666l`"66$66$66$66ZPhp> 7&#"7'7 #%+%;?2M3~{FC*9oX:Wib 55!5!!'!~䴴ddPR '327'' #!?;%2~4~*CF9XUp>2%&#"6767&'&"67632&'&547676767耕;>@Q#"F#!!%)*(+'~ !Ap*G&/$##*0,0.+"W!'&'&#'ZGGCia/4767!"!47676763"'&'&'&5!3!&'&5" %!*&,,&*!% "eeZ'&$(0+.!"-+0($&'Ze2&'&'&'&54767#"'&'2767&'&'32$A! '+(+('~!#F"#Q@>;CGGZ'!&'&'$W"+.0,0*##"/&GgX+B6%"'&'&'&547676$47676762"'&'&'&'&'&547676762$ n 8   I > I % O 8 lbQu R$'68"   vc.676767632#"'&'&'&%&'&54767&'&5476;#$&*0/6.i3b.-#4!!YY!&:?$ fLLf#&#/:&'+-23-+'rr'+-32-+Ve"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762Q gg'Q  c     c  g"'&'.54?654'&'&'&+"#!".4764'&4676763!2;276767654/&54676762NSl TuSNh    4  i^+#76767&'&/3#6767!5!!5!&'&'zK~BaJ"@@"JaAK^&'c5 5c~&OUä'66'U=;JHd)))dHJ;=#u ! !=?Fvu-1 3'!#3! g2xxx #3!53#5lx2x3 #pp # 3p&LLo&MML '#'#'##'BzJDCKz@R"~KKLRM#73373737D|KDDKRLKK~"R]z?3276767654'&'&'&#"7#7676767632#"'&'6BAMP@C6364DAMMCB74 ~ .STkkx`mQU-,+.SUkjx}dkR9! <:LHUYGK<9!>9MwWOw\^2106Y^wvow\^2104[)]z?#"'&'&'&54767676327#7&'&'&'&#"3276~Rld|yjkUS-,-,UQmayjkUR. ~ 38BCMLAE4636D@PLACƪ[4012^\wovw^Y6012^\wOWˑwM9>!92!'7$"!3!&'&'&'!#!2767676 ,YXXY, ,YXXY, %KK>? BA ?>K ?>KKKK>? ȌwGAvcbddbcvAGHBwcbddbcwBHƑ ##EFS $ SFE#$SFE####EFSZ Q 5!!Zb]<Ƒi Q '7!5!'7 ]ȌwƑZ Q5!'7'7!Zb:aƲ<ƑwwƑZ Q!!5!!d JbJ{D7SSKi Q7'!5!'7'7!5CCzKaK 7KKSwwSZ Q7'!!5!'7'CCuDDJbJkKa7KKKKSSSwwZ Q !5!3# {b Ƒ6i Q !'7'7!#3Aa{Ƒww\Z Q!!!5!53# SDDJbJKKSSi Q!7'#3!'7'7ACCRKaK͖KK\SwwSi Q#53777773'7'7#'''/Ym;YaˋmccƑwwƛv@v+v@'vv@'v+'v@''*@*@'*@'*@''*@'*@''*@''*@'''**+*@'*+'*@''*+'*@''*+''*@'''**@'**@''**@''**@'''**@''**@'''**@'''**@''''****@'*+'*@''*'*@''*+''*@'''**@'**@''**@''**@'''**@''**@'''**@'''**@''''***+'**@''**+''**@'''**+''**@'''**+'''**@''''***@'*'**@''*'**@''*'**@'''*'**@''*'**@'''*'**@'''*'**@''''*'**pvppv@'ppv+'ppv@''ppv'ppv@''ppv+''ppv@'''pp@'*pp@''*pp@''*pp@'''*pp@''*pp@'''*pp@'''*pp@''''*pp+'*pp@''*pp+''*pp@'''*pp+''*pp@'''*pp+'''*pp@''''*pp@'*'*pp@''*'*pp@''*'*pp@'''*'*pp@''*'*pp@'''*'*pp@'''*'*pp@''''*'*pp'*pp@''*pp+''*pp@'''*pp''*pp@'''*pp+'''*pp@''''*pp@'*'*pp@''*'*pp@''*'*pp@'''*'*pp@''*'*pp@'''*'*pp@'''*'*pp@''''*'*pp+'*'*pp@''*'*pp+''*'*pp@'''*'*pp+''*'*pp@'''*'*pp+'''*'*pp@''''*'*pp@'*'*'*pp@''*'*'*pp@''*'*'*pp@'''*'*'*pp@''*'*'*pp@'''*'*'*pp@'''*'*'*pp@''''*'*'*p*p*pp@'*pp+'*pp@''*pp'*pp@''*pp+''*pp@'''*p*p@'**pp@''**pp@''**pp@'''**pp@''**pp@'''**pp@'''**pp@''''**p*p+'**pp@''**pp+''**pp@'''**pp+''**pp@'''**pp+'''**pp@''''**p*p@'*'**pp@''*'**pp@''*'**pp@'''*'**pp@''*'**pp@'''*'**pp@'''*'**pp@''''*'**p*p'**pp@''**pp+''**pp@'''**pp''**pp@'''**pp+'''**pp@''''**p*p@'*'**pp@''*'**pp@''*'**pp@'''*'**pp@''*'**pp@'''*'**pp@'''*'**pp@''''*'**p*p+'*'**pp@''*'**pp+''*'**pp@'''*'**pp+''*'**pp@'''*'**pp+'''*'**pp@''''*'**p*p@'*'*'**pp@''*'*'**pp@''*'*'**pp@'''*'*'**pp@''*'*'**pp@'''*'*'**pp@'''*'*'**pp@''''*'*'**pp'p*pp@''p*pp+''p*pp@'''p*pp''p*pp@'''p*pp+'''p*pp@''''p*pp@'*'p*pp@''*'p*pp@''*'p*pp@'''*'p*pp@''*'p*pp@'''*'p*pp@'''*'p*pp@''''*'p*pp+'*'p*pp@''*'p*pp+''*'p*pp@'''*'p*pp+''*'p*pp@'''*'p*pp+'''*'p*pp@''''*'p*pp@'*'*'p*pp@''*'*'p*pp@''*'*'p*pp@'''*'*'p*pp@''*'*'p*pp@'''*'*'p*pp@'''*'*'p*pp@''''*'*'p*pp'*'p*pp@''*'p*pp+''*'p*pp@'''*'p*pp''*'p*pp@'''*'p*pp+'''*'p*pp@''''*'p*pp@'*'*'p*pp@''*'*'p*pp@''*'*'p*pp@'''*'*'p*pp@''*'*'p*pp@'''*'*'p*pp@'''*'*'p*pp@''''*'*'p*pp+'*'*'p*pp@''*'*'p*pp+''*'*'p*pp@'''*'*'p*pp+''*'*'p*pp@'''*'*'p*pp+'''*'*'p*pp@''''*'*'p*pp@'*'*'*'p*pp@''*'*'*'p*pp@''*'*'*'p*pp@'''*'*'*'p*pp@''*'*'*'p*pp@'''*'*'*'p*pp@'''*'*'*'p*pp@''''*'*'*'p*pZQ!!!5!53#DDc-JbJKKSSiQ!7'#3!'7'7AdCCKaK͖KK\SwwS '#'##'GЃJjjJRg9vQvR!#733737G0JjjJRvQv9gR]: A3276767654'&'&'&'476767#"'&'&'&w64E@MP@D5484E@33+.SUkbQEkST-,+0PUkjy|dkSU-,YGK<9! <:LHUVJI>9! 5 9:LHUow\^2 !3\^wvlyZ^2103\^wv]: A4'&'&''7327676767#"'&'&'&547676767'7a42@ꂦE4836D@PLAE46,-TSkd|yjkUP1+,-USkEQbkUR.+UHL:9 ˑ !9>IJVUHL:< !97!2;#"#!532654&+ dz +G a88a0~MM~0NI8:XD<stݔxXWFg % 5p~ 3 5p~  #3  { pe   HX*)6UUpe  p*)|cUUpe  p*)cUUpf   (*)U::Upf   *))U8U#u >>u-F3333#####5    F333333#######51֒֒nn֒֒n      4O :!!" 767>54'&'&'&$  $'&'&547676-nt[^]/.^^qr rt[_\./^anrg3@??@̀@??@.48fj~fh4666fj}fk34ūʪ4O6B" 767>54'&'&'&$  $'&'&547676!!#!5!nt[^]/.^^qr rt[_\./^anrg3@??@̀@??@R++48fj~fh4666fj}fk34ūʪ  4O6B" 767>54'&'&'&$  $'&'&547676   ' nt[^]/.^^qr rt[_\./^anrg3@??@̀@??@MLNL48fj~fh4666fj}fk34ūʪqrqs/ & S' S' SF S.#5!67676&3!'&'7767 b=rD15;- b=sC16;* U5O9:[I%'&'7767'&'&'&54767676767676&&'&'678C b=sC16;D8788C b=rD15;H55 + > ՜U5O9:[>?JKVXKK>? 'U5O9:[":;PG*# nb11S$ .&D65'67673''&'776?&'&'&'&5367676&S (4z[^T ;7R  b=sC16; &$P<8#!&(1 A b=rD05;5>\/h[aUTE>&U5O9:[ $A<]Y]7<7*,U5O9:[.'!!!!67676&!!'&'776 b=rD15; Jx a=sC16;*U5O9:[(؝T5O9:.;?%'&'7767367>54'.'&"67676&!!.* b=sC16;A=5&*F"G)+/): b=rD15;bK>" !A?TU5O9:[)N\59,/NԜU5O9:[$UD]YWWIF@.;!!&676$&632''&'7767327654'&W]FNK( b=D15; /1AN b=C16;(1W<9TaG $|kU5O9:[ e$GAU5O9:[o8(6N;,.SW67>54'.'&&767676&'&'776?&'&'&'&4767676!!1'*F"G)+/.+*F"F**% b=rD15;bK>" !A?Q.* b=sC16; LC@" #?CO4N\59,/NN/,95\NU5O9:[$UD]YWWIF&U5O9:[ !KH]XW^BH".#'+7!767676&!!'&'776?3!#3hK b=rD15; b=sC16; {{[NU5O9:[hU5O9:[.@'&'7767#5367676&32#5676'&'&#x. b=sC16;+֎ii! b=rD05;1&+"!+%2 6U5O9:[t:p:tU5O9:[$#!2-41`##.)'&'7767' 767676&7 i b=sC16;x y b=rD15;w x;U5O9:[')U5O9:[م.376?67676&#4'&''&'7767#MD b=rD15; b9M > b=sC16;=# ,k`ԜU5O9:[IbT3 32326#"'&'&'&#"5>32326 5F_W` UOX_Wc  UM]_W` UOX`V` UM\'~UPE:=MSNE;=KPE:=LTPE:>KPNCF ;B#"'&'&'&#"5>32326#"'&'&'&#"5>3232655%F_W` UOX_Wc  UM]_W` UOX`V` UM~(UPE:=MSNE;=KPE:=LTPE:>KF %!!'7!5!7%5E'GFwic u̵NF5!!'7!5!75%GFwy(juF 3:3267#"'3267#"''7&#"5>327&#"5>32 58<-#M]_W9E"nGM]_W`??,$OX`V9E"nGOX_W`I'~E KUPEq,KUPE:E LTPEs+MSNE8PNF 3:3267#"'3267#"''7&#"5>327&#"5>3255%8<-#M]_W9E"nGM]_W`??,$OX`V9E"nGOX_W`~(E KUPEq,KUPE:E LTPEs+MSNE8F5!5!-5 %%~~(~'~\riF!5!!5!%%55%E~~~~(\iwF:&#"'&/&#"5>32326!! 5F_V` UOX_Wc UM~'~PE: =MSNE;=KFPNF:&#"'&/&#"5>32326!!55%F_V` UOX_Wc UM~~(PE: =MSNE;=KF F")#"'&/&#"5>32326-5 %%E_W` TPX_Wc  UM(~'~PE: =MSNE;=Ko i F")#"'&/&#"5>32326%%55%E_W` TPX_Wc  UM]~~(PE: =MSNE;=KoiFB!!!!55% %%~~~(Z'~|3WiFB!5!5 %%55%F~~'~~~(EiF,55%-5 %%~~(~'~viF,5%%5%%55%E~~~~(QTi{F 55E~~1F 5 5~d~1LJ11F  55%3#E~~1F 5 53#~d~1LJ11Fm!5!!5!5F~~~`NPFm5!5!-5~~(~:[F 555E~~~PPNP[F55-5~~(~#;Fp$.#"#"&'532767676325F]MU  cW_XOU `W_~UK=;ENSM=:EPKNPFp$.#"#"&'53276767632-5F]MU  cW_XOU `W_}(~UK=;ENSM=:EPKF%,!!!!.#"#"&'532767676325~~]MU  cW_XOU `W_~|UK=;ENSM=:EP[NPF%,!!!!.#"#"&'53276767632-5~~]MU  cW_XOU `W_}(~|UK=;ENSM=:EP[-F@ $!!!536767623!&'&'&!!~B:!,x 1MQPM1 z+*~7'H?a93[2332[032326#"'&'&'&#"5>32326%5$E_W`  TPY_Wc UM]_Wgz  TPYaV` UM]\ C? PE:=MSNE;=KPE:=LTPE:>KR%$ffuWF;F#"'&'&'&#"5>32326#"'&'&'&#"5>32326%$E_W`  TPY_Wc UM]_Wgz  TPYaV` UM?C \ PE:=MSNE;=KPE:=LTPE:>KRuf$%yF3>3267#"'3267#"''7&#"5>327&#"5>32%5$7<-#M]_W9E"nGM]_W`?>,#PYaV9E"mGPY_W`J\ C?E KUPEq,KUPE:E LTPEs+MSNE8%$ffuWyF3>3267#"'3267#"''7&#"5>327&#"5>32%$7<-#M]_W9E"nGM]_W`?>,#PYaV9E"mGPY_W`?C \E KUPEq,KUPE:E LTPEs+MSNE8uf$%qF5%5 5E~~'~P#PPNqF55%~~~(PfP\ ! !' =zy)C?r@h& 777!% +<{<;zC@C?\ !7 7=z= ĺDzC?Ch@& !'' ! + <yG{DC@?1^ % ! !%7'!55!^ b^$$%%-___1^% !!^$$ !!5$ !!$\!' y@h& fz?\7 7Dz0h@&! fG{D0?1^ % ! !^^$$%% ! !! !$$i #75!5!7a~%4&Ƒi 8 '!5!5'abMa8w&ƑE 7!!7%4ƑwE 8 3'!!'~bM۲8wƑ'%!%!!N r'%!!!N '%!!Ng32326=8b>AtfN[eYEM]=hMhh{)H[|etf]+l^j^Ÿo'..[%m)BG133#;!"'#&5#3V7SeE:U63ÞN7:[>- )54'&'&'&#"!!67632!! !)e9:BIRRc[ZCo77#WVb./ww3!!#!!!X[x#AL!=!! 3!#!BsvQDw-R !!!!5!hi/%D7ARz` !!!!5!ip`fX5!!5#"3226&#"AIXӋ<靤+ނyzf%!#3265#!! !FIln24#%  !!!!!U]c\+{0!!32#54.#"tBS[[)#A` dfOQp$1 XP|\k23]` !!!!!!\Ba8`2gtd}33!ie !4676  '&%2>54."fUGÙGVVG?G5AJB00BJA0%6vv66ww6?.*9 9**9[l%6$  $!327676!&'&#"{{={{QCUMC %CVMC .;zzzz P'N"P'N[l #>7!!6$  $!.!hi {{={{2 $]$;zzzzgm[^ ) ! 5!7!~}{iĈ:kK^ !! !5!^qqÇ:kg %!5 5!7!!siˆ ,Y !!!)!`$>ZR}+ ) 9e(eP?"4EI4676  '.%2>4."4676  '.%2>4."!`QPaaP Q`fH!ZeZC''CZeZB'`QPaaP Q`fH!ZeZC''CZeZB':l'UU'l:[Sl )&""''7&6$327267654CM8znjg{{̑dz{M8z|'NC.Kۭh;zLgz 0&NC͍ !!!!]]]]$$$O$'/)!!3/~"YI^ !!!!!!V[dy!! ! ! ![xND?n6$=O !!!!\\[]]$O$$O$ !!!sC[j7g _ !!!!!! }}e0 33#!#3H/um)&#"327# /!"'32#"63 76!2lXbչbXfpogYaԺaYgoQQpf1!#35#3!3!3#3#!35`HH"#JJH ^e3!!!`q,!!!!!5!!!!PNMMhH"#J3!!!]]$N 4'! $5%!!m^"sik͊dU=#me 1A2>4."4676  '&2>4."4676  '&4AHB//BHA/UGÙGVVG?G4AHB//BHA/UGÙGVVG?G;+'5:4''4f0hh00ii0;*'5:5&&5f0hh00ii0[l#46$  $&%2>54."\{={{{fz8pBBppBzz❞zz͑CNNedNN[>l.327767654."46$ ' $&z8VTMݻ&!BppB{={=8Y{͑CN&^#([edNNczz❞b =z^ )!!!!!S[ZT9yd !!!]]]X$Y$O$\ !!!!!^^M]]N]mhhmhh6h[l#'46$  $&%2>54."!\{={{{fz8pBBppB]zz❞zzΑBNNedNN$[l.47>32".% $654'&'7'&'& z8VTMݻ&!BppB{={=8Y{͑CN&^#([edNNczzb =z[+(1 "&547"3&5462264&#3264&xoLՖ!Ե!ՖLoe.-A.. !-. ..fejvvO??OvvjMmMMlN5!#3E U\mTFU9=&E1^!B*(ǿbY9>K-%d~6'6'6'6'6'6&6'6&6'6&6&6'6&6'6&6&6'6'6'6&6'6&6&6'6'6&6&6&6&6&6&6&6'6&6'6&6&6&6&6'6&6&6&6&6&6&6'6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6'6/Ti{jX`+h <5"'0'&#"0#"'&54767!32767632324&'!W|㍂}W}mLIo FGKmg`^`_gmIFIoILl|@v@@v@܍U0,-00-,0YV`3#"'&'&"#"'&54767!32767632324'&'rN.-[dHjbbyzkHe[-/N1%#3~>TMNS?0"&0`『KEEKKK㠱dŸ~JR QJ~dZ:&5$`&e03!!#! ! %"3254ĬZoDCOn{Z+XjkcQf{!#! ! 3"326&e$Wiooilpp`8(8B!#!!7r!#3!!r̼!#3!!r!#3!!rd%!!3ɩf^!!!!#3265!![ZF6lo9#F 4'&'.#"!!>32+53265LA)esBIc_a\D 77#'b]Vtv\ F*!!!!"'&'327654'&+5!!! CwJqNFJIKL!BTN !pgts="J&&55cf45^H)1!!!"'&'327654'&+!"&5#;5CmNpNGnbhe_[IJLK&쿠7S#M`>N !qgst%)5855cf54%N7h` !!!!!F|`%_{V !!!! !!!!!pVDCTUq%R5+%RO{ 2=H"326=%!5#"'#5#"&546!354&#">326763 "326=6;54&#"_efRI[|AtTBAtyhMhhr_`hidfRI[|hPfyTLJDMm)f]f]ˢŸUO..5 lLJDMm)QnUO  !!! !!!Vj^\cp=+%RO{ ("326=5#"&546!354&#">3 !_efRI[|AtyhMhhCsLJDMm)f]ˢŸUO.. !!!!!!!3!p;i[cTV;]0\%RPO{"-0!5#"&546!354&#">3 3!3#"326=!#AtyhMhhxh{CڳdefRI[|x3f]ˢŸUO..wfmLJDMm) Fk!!!! !+3276?pVA6\@vR&!%R>#OOF{)4!5#"&546!354&#">3 !+5326?"326=AtyhMhhwyBXATUdRKefRI[|f]ˢŸUO..wz 6JJ:KJLJDMm)=O{ %!!!1ZaEx[l_^M!%!BofhJ !3#!!#3ZaE2lh !3#!#3HC' 3#! '&#376"!&'&!3276NDCX<e)m#'#"!5476;#"!!!!!#3547632Dp\\D\\DNNWXDN``NWX&!!#"!!!!#35463vEBD4$7DN``N#!!#"3#!#3546<D6)7DN`N#m*.#"!5476;#"!!!#!!!#354763)!2Dp\\C\\EDNNWXDN```NWX#o)#"!54763!!#"3#!!!#3547632Dp\\D\\DNNWX)DN``NWX#-#"!#35476;2!!;!"'&5#354'&D\\[\LSOP)DR`NWXXWN%NXYND_-U&547632!!;!"'&5#354'&#".#"#"'&'32654'&/.54632tqβzvMROP'$>5-)#gU\,-"!X8PVdkcw`efh^`!g9׭9u_]_\L%NXY?0&$)&80%005+ (KP%4:90 \U!"'&7676;#"3!'&763!#&!3265!!5#"'&5#!5#"'&5!32654C^^ag//vv I(16"V @*dtBIb[\IbZ[D@)es`^]RWS`8bz,!Jp[.w#&)b]wvТb]wy|*<#& ^D!&!5#"&5!32654/&763!!!3276=!!5#"&5f6 )*IbD @)esGI(1L@*d::BIb,"X\Тb]p[.w#&7bzL69#&VW0b]V \?!&!5#"&5!32654/&763!>32!54&'.#"!f6 )*IbD @)esGI(1Ic A)es,"X\Тb]p[.w#&7bzb]Von#'/V \@G!!#"'&5!3265#"'&76763!!3265!!5#"'&55#"3IbY[D@)es^^ag% @*dtBIb[\ݹvv`Lb]w{|*<#&)^]RWLp[.w#&)b]wvS`V V!&!5#"&5!32654/&763!676323265!!5#"&=4'&'.#"!f6 )*IbD @)esGI(1aRc@);sB?1Qb@*<:9,"X\Тb]p[.w#&7bzZ6/V*<#&)u/VH1 #'WX/`&O= 32673 &P YY =FJJF,`&0F`676765!#%29!uSPBmEjB 8Dc]-Bf`x{` !!47!>=!ɜhݗ|t_B;&!tv)[ `!!!^@``g`)!!4'&#!!2Bo21ym,͸vJK:`3!27654'&#!!2#/<<;lYY9H;9x_2476=!!!!Bo[Tuzlg`!2!!4'&#!,͸OB-21y`JKg` )4'&#!!2g21ym,͸JK<`#!2!4'&#!+2765-,͸22xQJI_"#`JK6a`02 F5!3!  L&,L&,L&L&`&C`&`& @`& C`& @v`& `& d`' 0I`& `& d`' @V`& _`& @S& oa&! @`&# @1`&$ V`&& `&' #`&) V`&* @`&+ L`&, @`&- &@& _& :&'  !3676=!!!767'#!F 4B`Eb9 4`F\RB6`) MԛsS;$ M rSvuگt &v&t '& X'0 X'0t &vt ' -X' X't &vt ' -X' X't&v&t'&'0'0t&vt'-''t&v4t'4fa'4pa'4puJ&\tJ'\%J'AJ'uJ&\tJ'\%J'AJ' /f&C< Cf&b ='.c C='.d /f&C2 Cf&b`='cC='d /f&C Cf&b7< ='c C='d /f&C Cf&bIi ='c C='d &G\ '\n /&G4> /'4>nt`tr2%# '$&7!32767654'&54767;#"":B.I\F- !XU=y ,2:K]$?.\^Zc:#=$$d|?O#! 6. )0$0Bt`G&trG' 0G&tBG&tqq L&;#&'#"'$47!32767654'!`$ v_+9'Trџ~$C&1F372[B a ;b-",ckJ8_w- r'gf>Y r'gf>X #!3276=!=:sX=(,Bsa\,1jX!#"'+3276=!;bFEcX=(,B,(=Xmm,1jj1,t$8Zt[S-X'X'  #4%63 >rIG?. 52#&$> r.?GIe '/&'&#"#67632T '!M0@eed8h?# $0)JI '327673#"'&'T '!H5Aeed8h# $,-JI4B\n'\nQ4B]n^k ;#"'&=!,%\CughCT(LL"4B^n4B_n'_nQ4B`n'`nQ4Ban'anQfbn'bnQB0cn'cnQ(&7&=do'doN&=eo^&Neo^ 'ef>Y 'ef> &=fo &Nfot$8&Ze">t['eD'ep'ep= !;!"'&B,(=Xs:=sj1,\at&v*t'*X'5X'5X&Xwp'htR&vtR'-'R'RtL&vtL'-'R'R /f&C@# Cf&b='2cC='2d /fC Cf/;#"'&'&'3 7!$'&54767&63 &#&CA8K;Mm@6-bK]Qw~\KyV= Bqj5/,Dc=rr,2ie5{i3c`[2/7O2+'4%!#"'&'+3276/!67632;#"'%327654'&#\VD,aZX=(-B=^k?)&;MO>qj5/,Dc=[[T;RaUL!\fr"-4LajM1, #!32765!=:sX=(,Bsa\,1jM#32765!;#"'#X=(,B,(=XbFEc,1jMj1,mm~ V~ |"4%#"'&!4767'47632;#"''654'&'&32hlI"lRFH|,+oCu!  $ 6#%UCD 9|EU ?$?ji#";) 4|,%654'&'&32%67632#"'&'+3276" $ 65#p aFHXlp:]i82))!(`X?$U50EUC0&|!3%#"'&'+3276767632;#"''654'&'&32lp:]i82) aFC~*+oDu!" $ 65#%UC0&?`X?$Dei#";)!(q&`q '`{&5C&5CXXwp %&'&'32&5!;#"'&''"'&5476y U&(=WB%> DS?<b24`=(3 #60!ȎR,"#A0D +9654'&#"&'#"'+327&'&5476327654'&Y #)yN5;Tnʄ^{`GG1 l)/&6n!J<-&!-#9Һ49Wqg$ >HEpb&>2=8C!$= $/67636!!'"'&'#!327654#"3254'&#zmNSNmzBLUZA(11(AZULBĢU@hxxh@UDM419GvG914MD Y !0!"'&'&547676763#!7676&'&;4YTXbUP09U ךN[7+#& nQT4,8*:79Q[eJS6@)'-'t$8Zt[S3#'$'&7!32765&'&'&54767632;#"'&#"JL:B?r.u1 ,B-E]M07cQ=(3;)i[eD*#("% %Tb/I#&,xt 8&ZI t [S'I -X'X''d",'d",='e"='e"K &fnK 'fnK!"'5767!6765!}4C_]`F>E!BB[A*%,yA+7K%!"'5767!6765!;!"'&_]`F>E!B,(=Yf1"*%,yA+7j1,?*-h!% 546?>54&#">32!++w&=:TFSm\IMV/3:`;EhB--K>9Yb(*BCOF.\4:bR1d !5!5!)5!1107'vFX: 'u:b= 'uC]; 'bv<= 'b]H'u'u&uuH&v'u'uuH'u'u'u H'v'u&uuH&v'u'uvH' 'u'uvH'u'u&uH'u'u&vH&'u'u H'u&u'uvH&v'u'uvH'v'u'u H'u'v'vuH'v'v'uvH'u'v'v H&u'v'uH'v'u&vH' 'v'uH'u&u'u H' 'u'uvH'u'u'  H' &u'uvH'v'u&v H'v'u'  H&u&'u H&v&'u H' 'u& H&u'u'uvH'u'u&vvH' 'u'uvH&u'u'vvH'v'u&vvH'v'u' vH&u&'uvH&v&'uvH' 'u&vH'v'u&uvH'v'u&vvH' 'u'vvH&u'v'vvH&v'v'vvH' 'v'vvH&'v&uvH&&v'vvH&'v' vH' 'u&uvH&v'u' vH' ' 'uvH'v&u' vH' &v'vvH' ' 'vvH' &&uvH' &&vvH' &' vH'u'u&uH&v'u'uH'u'u' H'v'u&uH&v'u'vH' 'u'vH'u&&uH'u&&vH&'u' H&u'u'vH&v'u'vH'v'u' H'v'v&uH'v'v&vH'v'v' H&u'v&H'v&v&H' 'v&H&u'u' H' 'u&vH'u' ' H' &u'vH'v&v' H'v' ' H&u&' H&v&' H' &' j#31!!!#Rކb[k]i+"+33%! )327&#'327&+67654'&676'&#[Xpzz?66??66?L,NN,D+WW+]xm%$\x$4~:"#F6F#! )327&#!36'n2+k_\\_lz{|Vateeta]6z5]Ze3%!!!!!!)`&]xxxxR 3%!!!!!)]xxx2[a'&#"32767!5!# !2&2p{_ZPx\mk^EiA ) x2FFei87Rέ~ !#3!53#!#3Rllllzxxxf$ 6765%!!#532765 B,ezf6l78]SC. -fxxCC#3!3 #zְv]xo@; %3#'!!!lza%xxx !#!! !3!3W@WY]>+][%% 7& 676'& ! o ooopxDop4334Ь01ddjk@654&/&'&54.#"!"$'532654&/.54$32XhED655#n^|wQipqyQ|̸o}Ux]\3(5TUQ:O舼3(1kH5DD]b{T(<65[\e]Z%(=%%  !!!)#3 BB̢x]P#%&5#676#!3265!! 1r(b9(rgzgruezُlx**x V޹"6= j %# ! 3!,^x]A+6%#!# !!3! !  | kox]==+o-%#! # ! 3Ԡ.rWXZdxxz[i! 3!3#zlG uO{#,4%34'&'!5#"&546!354&#"5>3 5#"676rZ'A AtyhMnn @5f4b<&KA+xT%32#"&36 zBhiF[Gb]\]$?hDGO{ .#"3267# !2TElTTlDSKN4OLyy%!!%7*7l zyQ #%267.#"%#"32!!#3 UCihCz[\Gc\II]bXcehO{ %# !2!327!&'&#"Yrr*KQfl>_q[D015:9|c|w|x97Fx$xZTVRFy (4<6765#'!!"'&'5326=#"54323276'&#"- <,ylzd]`\URCjjCX__Xk+#__#a'jwx!65b\CA\cvu3.b/c%)!4&'.#"!!>32%34'&'3L A)eszNjE;v nn#'ub]Vx2TH%!A1.$~ 3%!!!!zDpxF6765#!+73265!!Q/Elzù8[DD9UGs\<3!!3 #lz5$du(~%&5#3#"&5#F.D\T 2U9~\sFc{!M334'&'34'&'4&'.#"!!>3267>32!4&'.#"ϢGE;v E;v  A)eszNjb+ Nj @*esp2TH%!A1 2TH%!A1nn#'u`b]w5J b]Vnn#'uc{%)!4&'.#"!!>32%34'&'3L A)eszNjE;v nn#'u`b]Vx2TH%!A1zpO{ # ! 327&#"676'&z$' !rrJ\[II[\J"qq{8(8(x>xH|1xxQV{ #"327&>32#"&'!!3#6' BihBzGc\]bpeGDhRV{ %"32674&05!!#"32#0 xCijO\GLb]II\Xi{3.#"!!>32*T*|z>p%$p-p`ne_{B>54&/&'&5432654'&/&'&54632.#"#"&'Mw8r.`80r8o/X`h^`!!b9YWYsgU\YCX8TVdp2 &:/*[E% &Es%->?FD: "daƲ ::=@47 ,_`γ##1{ #&'4'!!;!"&5#539-_ lUChyy&K#D\OxsNxkxJZ`%)3265!!5#"&5#&'&'&'&5# A)eszNkEV0?V`@P$Ac{BPVCV{DO$E`F`G6XHT`I`JPVKO{LMF`MV~NOV{OO<`P&h`Q`RvV8jS.Vw`TwV7`UO`V5R *|{^i%]dc|nV@aF~})`bXc{pRr{pp_f!#fO3#%3#c`!#am#'&'&#"#465463232653#"&52)$}`N"B#5#!#}aN"?#<2j'<9j#!#'#Ƞ373ɠb 332673#"&WDEV=<<=3#!#3#mp#!#lP53#h73#'3#ᇇᇇh 3#3#'3#pqᇇdh 3#3#'3#pqᇇd3#3#dh 3#3#3#3#ᇇᇇddt"%'$&7!327676'!;#"'q:B.AK,:B0.`Cu4)MM \^Z[B/IVqgK-MEXXt,:;#"'&''$&7!3 7&'&54767632654'&#"{q*`95@Zt:B.A6: ~,h]N/ jC-*+= 8K \^ZFB gA@:B)uQ&_rJ<*)Ne?%.654'&"32!!2767'"'&54767676!-'* ,.Z6!JmIXb_H7f*ZO&;1( EGT4,8*:-YB3$A + ;#"'&'+327&54767654'&"e~O/ +a\[`* /N1|*w)B)uQ~22~Qu)4hN77Nh` :&'&;4%$'&767!32767"'&'&547676763*#&!m9?VtL#B0 6aYSXbUP/E)'-'nf>c{xx--@:b@RQT4,8*:79Q%A'5C'5C %4'&"27>"'&4762B--Bv8:8::8:$2%&2@@@@@??tR'&>''R''Rt'-'' C'e8bh'ecCh'ed C'.Pb'[cC'[d C'Vb'cC'd C'2 &b7< ='2'c C='2'd<G 5DYb #."#> VW =<<=FN!!+53265!8#8ca\D<?yv\<S` !3#!#53[C`JDu`!!3#+"'#5$%3"'"3276B2hPaf }9^U'[#`0cvL9.ZXR'q>CXZXY'CcqZXR'CXq>ZXu'jCXXu'CXZdu'q Zdu'q >AR'DSq>"Xv'CCX>AY'DSCc"bm'CwCt>Au'DS"co'Cuy"cho'Cuy"c'CuD>>'CPDG>u'CPj,>u'CP&G>'A<CP"c'Cu'Zh!!hp*53265!#"&BLYSZUJrX\t 4 m&'g  &%! 7676'&'!;#""seHA.B 4(ANQ9beDCmey" };,'g,'g'gt['gv@'g &@'g & r'g>n !;#"&5BD\n\wppcOo+o|`&Y`3'!!6zpxF[`6767#!+732670S8U!z'8\S"9UGs\pu`'nM`& G3#3#v; !#3!3wö=#q#%!5&b\X f&b]X&\b &b_X f&b`X &_b,&e_ &e`3!3B+#3!3B+#3!B+O264&"#" 34J44JFP`#Cꋋ2r\264&"!"'!3&54 34J44J/FF#`#Cꋋ2\rr\264&"3&54 #"'4J44J#`PFCꋋ2\rT !!!!S67fQ | #!!!!e67fQ | #!!!e67Q |! !!3SbBd ! !3!3SbBd#3!! bdB  3!!!3B?Cdd  #3!!!3B?Cdd_ #3!!!B?Cdd  3!!!3ĭd  #!!!3.ĭd_!!!_.daY 2>4."!&'.4>2!4?44?4*! gyywwh "ZK--KZK--( 6ظllظ6 Y !2>4."!!&'.4>24?44?4! gyywwh "ZK--KZK--( 6ظllظ6  2>4."!&'.4>24?44?4! gyywwh "ZK--KZK--( 6ظllظ6  V !3!! Zq`  V !3!! Z` _V !3!! ZUq` O !#!#"&7676! !354&#"3ړJQ %7/d5%3i)Ģydn~}w>Qc"#!#!#"&7676! !354&#"3ړJQ %7/d5%3i)Ģydn~}w>Qc #!#!#"&7676! !54&#"3ړJQ %7/d5%3i)Ģydn~}w>Qc  3!!!!!-d  #3!!!!!-d^ #3!!!!d  !!!!!3­9+  !!!!!3-­H9+^ )!!!!!]-9#3264&!323C@r\aC!dpvdq] #3!323#3264&C!C@r\aq]dpv5#3264&3!32#C@r\aiCdpvd!4'&'5!!!L 8#(7a3tC#!&'5!!!A0#(Wr3tCY#!&'5!!A0#(Wr3tCE!!3U8C-T+E #!!3g8C-T+#!!g8C-T+oB$34632>3234&#"!%4'&#"!\(.%sPI1=;x 0s-kx&"r¼v;_c~oB&#354632>3234&#"!%4'&#"!\(.%sPI1=;x 0s-kx&"r¼v;_c~B$#354632>324&#"!%4'&#"!\(.%sPI1=;x 0s-kx&"r¼v;_c~ !!!!!!!2BCDo#!!!!!!!DBCDo #!!!!!!DBDo)!!!!!!!)!-B BC{DooD#!!!!!!!!!!DB BC{DooD!!!!!!!!!!2B B,DooD  !!!3?ĭdd  !!!3!?/dd_ !!3!?dd!!!tzvX+ !!!!vzvX+!!!vztX+ #2654&+!!2+!Ldfq]@ ߭ޙdRNGRd9d #2654&+3!!2+!Ldfq]@  ߭ޙdRNGRd9dB #2654&+3!!2+Ldfq]@  ߭ޙdRNGRd9d !#!!3!3BBD+#!#!!3!3BBD+ #!#!!3!BBD+O*3#"#"&543!!!!hD@r\`­+@9pv9d*3#"!#"&543!!!!hD@r\`­+@9pv9d3#"!#"&543!!!hD@r\`­+9pv9d !!!!!2mC+ #!!!!!DmC+ #!!!!Dm+  !3bHr-+  3!3TqIbHr-+ 3!TqIb-+O5)!&'.467675!!!2>4."p%gyyg&X"i;<<6n#k4?44?4t 6ظ6u 7[\\S?tZK--KZK--5+#!5&'.467675!!!2>4."%gyyg&X"i;<<6n#k4?44?4t 6ظ6u 7[\\S?tZK--KZK--)#!5&'.467675!!2>4."%gyyg&X"i;<<6n#4?44?4t 6ظ6u 7[\\S?ZK--KZK-- !#!!3N + #!#!!3N + #!#!!N + !#!!!3B d #!#!!!3B d #!#!!!B d 3!!!3# N9+d #3!!!3# N9+d #3!!!# N9+dO5 '2>4."&'.46767!!4?44?4N%gyyg&B"i;<<9k#ZK--KZK--t 6ظ6u 7[\\X:t5 )2>4."!5&'.46767!!4?44?40%gyyg&B"i;<<9k#ZK--KZK--t 6ظ6u 7[\\X:t '2>4."!5&'.46767!4?44?40%gyyg&B"i;<<9k#ZK--KZK--t 6ظ6u 7[\\X:O5+!&'.467675!!!!2>4."p%gyyg&n"i;<<6n#k4?44?4t 6ظ6uu 7[\\S?tZK--KZK--5!-#!5&'.467675!!!!2>4."%gyyg&n"i;<<6n#k4?44?4t 6ظ6uu 7[\\S?tZK--KZK--+#!5&'.467675!!!2>4."%gyyg&n"i;<<6n#4?44?4t 6ظ6uu 7[\\S?ZK--KZK--02e'u'uu 'u'uv 'u'vu 'u'vv 'v'uu 'v'uv 'v'vu 'v'vv WG #'##'##'l6666666lGxxxxV)!!!!#]}IZKNVV`)!!!!#_B3OCmQ`T}V@n]_<VVM9 fmM9R[H}6;Gn4JJ$bcX{Rr{p_t-~3y |H[[*[F[/  6#68RJJ}TO'DO'RO!#'R www O''RI_q @0R  HpB 3c3'b'QHLt'nitZtZt]-~      H[:[[[[[(6O-OOOOOOODOOOOOO OOOOOF    ' O O OH[DOH[DOH[DOH[DO'R'ROOOOO['R['R['R['R : ' ww[wws   ^ [O[O[Og[O/I_/I_/I_/I_ q q q      6@668R0R8R0R8R0R!#'|'|H'.H[H[DOTs'RO]{!["  B [JaU[O'//Iqq  18R0RKD0iKDB'  2 * XRD~ Ow[O     mO O OO['R['R[O[O0Pw 2 * XR['R G  OO(F O OOOw*w [O[Ok  /I_ q{_Z 9RpO8R0R OO[O[O[O[O6=wRRHDI_0RHlM| + Ow1YR 6'R''DODO)RROONlcccDcwR'RO--   +w OO]nJJ__I_![qq@6vRRPiBBBB[DcOwERBBRRRPRc#A))]]GcGcEcEcEcA),tY*Y*yy4HT4THmSmSQ3c=Y*gW12 ]9c94441SggIQ0EgiE\nE$f,,tDOOOt-8/Cio* | 8R[ *[F 6[#g1?6YtcgY'PcAP O6LAPOM'DOO&v.wBO#OBOd^_%_%nB)Zd[OH[DOof([l['RZ%GNTaZj['3?1Zd'DOw[|O'H[*E'==H[=wwS H[/:OT"S +5 ||inyT*[FH[ 5#[# Zu|HusuOOgO*/Z  FeO'DO,$eVvi$D{8OO#$DOI_www#QI$ [BO ZL$I $- [O@cH[O  DVO[6O hqV[BOH[DO1__M|+fF'4%*y/Z+ O-$K +RL[OH[DO ,66# 4vv c  c  *0&vw O OOO]O]O*y/ZP  [O[O[OHuD{555vu4%##|`QXnQ0Q& GK [O {cTFe['R6@ Te +Rl--sO?n?l/np[?[/tllTTQ <R@ R R S'R  'R iwZ-l l7  'RO/5V""AWW+"cWkWh@C@ w@ 5w@@ ow@@=+Nh@@h@2-~wwywtw<t@X<t<t000pp%% u u u uzzv]uo`?F~%q@XyttleeeeeeueCeee:ewtN<to`]<t<t<t<t<t<t<t<t0000000%%%]u]u]u_t_t?%q0ytt@Xeeeeee7eeee:X~wOFTO2\O"O"O"OsUw<s<QtXObOdO%XMZHzHNNa$BC<E<Env;;-zHXK"<^lQ6aXOAMdGdKKKKMG1+v|2?y.9->Y>YvOvj Q Qc[cRcccc,cfHcc,c{cuHcjcBcuu`H`HGcuccuHcuuQuckcScXcnccXcZZJZZ Z ZZZZ?Z ZmZZA-Z lZ3ZZ ZZ Z ZlZ Z lZ l ZZYZZZZ[Z"ZZ lJZZicc 1   TC TC TC E4E4E9E9:n99nnnn9bn:nnn   W 1   aaaaaaTC TC TC E4E4E9E9a%nnggggzn<<^QgYKYYYKYKYKYYhKhKhKnnKKYKYYYKYKYKYYhKhhhKhKhhhnn2222X'27J7JXJ2XJ27J7J7#nn#nKKK222KKKKKnnnKKK222KK =K =K22 =K =KnaAKAAAKAKAKAA.K.K.KnOnnKKK-K-K-K-KKKK M 9K M 9K M 9K M 9K_n589J+J+8989J+J+Jnnnoo2FFFFKFKFK8Kna]1]]]p9UnccgggnKKKrnnnnnnnnnnKK tn tn tn Rn Rn tn tnn *nKK22KKn    Y`nnn tnnn bn nnn  @ x  9 xP  2 x 9TeOa$DO$cwQ ODOOOOOQ]&&,N~#@0Rh]Fetjjjj9jjjjjjj9GRj}jj"KbKbrb brbrbrbrbbbrbbbbGbbbbbrbbGbTbbb>a2JbEcGbb>a>aJ'jrbbbbbbbrbGbbbbbbXb_bbbb b b:bbb bbb2bba>bbbbabFbbOO O|'|'|'H[DO'R'R'R'R'ROOOOO!#['R   *R F wIww;w w$w***    [O[O[O[OF'F'=/I_/I_/I_/I_/I_ q q q q       6@6@6@6@6@##68R0R8R0R8R0R q@O!#P O O O O O O O O O O O OOOOOOOOOyw`w[O[O[O[O[O[O[OJaUJaUJaUJaUJaU       6666YYYYYYYY  ~/cccccc]          ~9{ PZZOOOOOOkBOBOBOBOBOBOBOBO fYYcc  OOBOBOYYYYYYYY  ~/          ~BOBOBOBOBOBOBOBO fYYYYYYY  O/ QtQ     C>t$*':xHS''66X TTBOBOBOBOBOio1HQ33_3pcccc3c3tt/-  e3p ^; ;$7$$$7$$F~-~^]$HJJ}k?~~Z$a6$FZd'6b'2'W'F'K'E':{{{c\Gc'6'n'b'Q'2'W'F'K'E':{{{c\KbrbbrbE[6pO G76 ?[ 0Okd$m$H[su$<$l{uA d 8 LB_*De>3cf[9JtDW 83 onR(/11}o Ku'p=@CEX5\D#8u?Q ~?N6 .Oy%'?<wwGKetZtbtZtbtQt2tZtWtZtQtWtKnZ  ## #H[*w_G wDO'R G` G`H[DOZdidZcZi Z\ieZRZdiddZiZiZZ7a7aZ)ZZZdiidZVZZUiUZZZZiZcicZcZiQiddZdidZi1@@mmiViZiZZiZ1i1 X5*Vttfttf+$Z30DDAtt}XXd R F s+   mmlmx  mm3n3nmPsYY33333ZZ = =3333UtfttfttUtftftU9Uf'vddddJJ}JJ}ZZ``x``xdd(LL .L dl .I'BOY6LIssss sssss sf4ff4f4ff4fd1I'l'vllllllllllHdHdHfHdHdHdHdHdHdHdHdHdd  dHdHdHdHdFFt3]tZttutwtwstepeppJp~ ttttZttttttttbtbtptttZZ_tttttt,,,,,,,,tyttttttkCCtt1tttttStttttbtt>tttt ttt2tt/tttt2tt*tt"tt5tt!tt5ttetRte{bvttttttttttttttBBBBBBttttttttttt5t5t_ttptltpt tttttZ9:}YYYCK CMAMMlv&/O|dddd0dKMJKNN+M+++++-vd9KKKKdccKMuWWKKt[tmtmtmtmtkl99lt,c5qhh2Q}.Bwlllllllllliiiiiiiiiiiiii&&rruiigiJJ00LM)Ui RZ Ri RZ RZ Ri RZ RZ Ri RZ Ri Ri***************Zill33333343434                 111iiEEB III  F ;q 8R0R1X* 6@Fve[[8^8^8gY  z|z[[T'NU{u8Ne[[[[H[O#H[ [['v-~-~tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt//I"+ hqVZe$seQ l ,I_ O O Ot O=OJl [O2wFK* 9O#V&V## ##W_ UwO.Fxh[hhh@C@ 'd05'd@@o@@+h@@h@w@h<tt<tt<tt<tt<tt<tt]ut.]ut.0000000000000000%z%z_t_t//_t_t//%qzqytHtfv4vv4}^v4v4vv4vv4vvvvBvwwywttw<tt@X]w<tt<tt000000000000p(pp(p%z%z u -uS u -uS u u u uzzii]ut.o`}`.//?mF~~u%qzq@X]wytHttHt\w\=w=\KwK\KwK-ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttty[O~[/  6-VO'QDO'QO*9R cw~ww~c cO'Q'RI_1 Z/@$SR |H[[*[F[/  6#68RO'DO'RO!#'R www O''RI_q @0R | 8R[ *[F[ 6[#g1Y'PcAP O6LAPOM'DOO&v.wBO5|^Zdn'B)X{Rr{p_nhhhhtt.}`.tt000000000000wZZZZZZ>">">""">G,G"hmHtzw]wpOwwwww:vwwwOFaFFO222\\\O"O"""O"""O""1tttttttt!, 79k:;Y<&:$&$&$&$&$7a$8$9u$:$<<$Y$\$$$$$<$$$$a$&a$*$,$.$0$2$6$8<$9$:<$a$<$$ 3$ 5$ 7$ <$ D$ r$ D$ r%9%:%<%%6%8%:%% 3% 5% 7% &/&6&&&&&& &&"&&&& K& K'&' >(>@>X>t>>>>>??,?D?`?x?????@(@A(A8AABlBC<CCD0DDEpEFFFG(GH HHIItIIJ<JKK KKKL@LMMMNtNO OxOP PxPPPQXQRRRS SSTdUUxUVTVWW0WHWWWWWXXX0XHX`XxXXXXXYY4YPYhYYYYYYZZ Z8ZPZhZZZ[8[[\ \$\<\T\l\\\\\]]]0]H]`]^^4^L^d^|^^^^^_ _$_<_T_l______``,`D`\`t`````aaa4aLada|bbbbc,cdePeefff0fHf`fxfffffgg g8ghLhhijjk|l lDlm4m|mnDno(o8opDppqPqrDrrsLst ttuHuv<vw(wx4xDxyzz\z{t{|D||}`}~,~X~~0dl\|LD@@P`LXxt Hl\`0T$pPDLD,<Tdt d8`4Hh8d\$XT(Lph|,Hx(Lp4X$8Th|(<P<\@t 4D`4l0DXl,Tp$<Td,<Lx(8dt,<L@(@XlD,0lxH T <Tl„œ´8ü$@XHT4Ǡǰ(Ȉȸ,Ʉ@,ˈTdϜ8tа<ѤѴDҴ$`(@XpԈpՀՐՠհր $XhDTذ,`xٴ DTdtڼ<Lۀۼ0܀ܘDݼ$޸ @ߌߜ\ \ 4hX t |$ TdDT tX\l|4hP0 $<H<dXpP@hl(P8T h@X4P D     , D   h   P   4   0Lh(@Xp <Xhx 8Ph $|$,l4$x,L`P(  !P!"p""#X#$8$|%<%&,&'4'((L())**$***++,,,-\-l-|---.0.T./@/0 001@120233$344x45$56,667L778,89,999::;;,;> >P>>>>??<?\?l????@@$@@@X@@@AXAAB(BxBBCC|CCD@DDE(ELEFF`FG(GtGH H`HI,IDI\ItIIIJ8JlJK@KXKpKKKKKLLL4LLLLMM0MtMNLNdO O8OOPDP\PxPPQhQRTRlRShTT,TXTUU8UUVhVVWWWDW`WWXhXYPYYZ<ZZ[8[H[|[\\\]],]L]d]|]]]]]^ ^$^<^T^l^^^_d_|_`(`@`X```aaa,a<aLa\alablbbbcchcccd(dPdxdde8eTeeeffDffgTgggh@hlhii\iijjLjjjk|kkllmm0mmmmn4nXnpnnnoo<oXopPpq8qqr|rs0sttttu$uxvvlvwHwxxxyxzz{{||0|||},}|}~H~ \l0x|\| X`4$08l@x4\4D$TtX@P@d4D,p<@Pp8D,Dp0H`x 8Ph@|(Ph0\t,Xp0H`xd|,D\t(@Xp0HTl4Ld4Ld| $<0H8Ph 8Ph(`˜¸,D\ÀØð(@XpĈĠĸ$|ŜTlƼ<TlDŽǜǴ`Ƞ@XɔɬTlʄʜʴ,D\tˌˤ˼8ť0Ḧ́͜ʹ,D\tΌΤμ8ϰ<Иа@X0H`xҐҨ 8PLdԔԬ 8PhՀ՘հ(@Xp֜֬(l׬`xؼ`xِlڄPh\<ݬ4Ld|ߔ߬0x(@X<0x$<$d|,h x8Ph<pLt0|$0h<p | P`p0D,<x8@`pPp@pPt(`           D   $\p8L`,l8\0pL$ (4,$x  H x !0!""("H"l"""###0#H#`#x#####$$ $8$P$h$$$$$%%%0%H%`%x%%%%&&&0&H&`&x&&&&&'' '8'P'h''''''((((@(`(x((((()) )8)P)h))))))**(*@*X*p*****+++0+H+`+x+++++,, ,8,P,h,,,,,-- -8-P-h------..(.@.X.x....///0/H/`/x/////00 080P0h00000011(1@1X1p11111122(2@2X2p2222233303H3`3x3333344 484P4h4444455505H5`5x5555566 686P6h66666677(7@7X7p7777788808H8`8x8888899 989P9h999999::(:@:X:p:::::;;;0;H;`;x;;;;;< <$<<>,>D>\>x>>>>>? ?$?<?T?p?????@@$@<@T@l@@@@@AAA0AHA`AxAAAAABB$B<BTBpBBBBBCCC0CHCdC|CCCCCDD$D<DLDdDtDDDDDDEEE,EDE\EtEEEEEFFF4FLFdF|FFFFFG G$G<GTGlGGGGGGHH,HDH\HtHHHHHIII4ILIdI|IIIIIJ J$J<JTJlJJJJJJKKK4KLKdK|KKKKKKLL0LHL`LxLLLLLMMM(MDM\MtMMMMMMNN,NDN\NtNNNNNNOO O8OPOhOxOOOOOOOOOOOOOOOOOOOOOP PP8PTPpPPPPQQ(QLQQRR8RlRSS$S@SlSSSSSSSSTUUUUVV,VLVpVVVWWpWWWX XDX`X|XXXY Y(Y\YYZZ$ZXZpZ[[ [4[[[\8\\] ]|]]]]]]]]]]]]]]^X^|^_$__`aa8aTa|aabLb`btbbbbbbccc(c<cPcdcxcccccdTeeefHfgPh@iij$j<jk$k|lmn0no4op`ppppq(qdqr`s<sstHtuuuuwx xpxyHyz{`{|p|}D}~ txtX$4LPLL\$h$Dh4 0Pp0Pp0h0Phx8HXhx  <lT\<d<8tLLDT44t(Lt8\x@lHH@DlLPPX$h PH @tp$<lœØXD`ňŰDƀƜƼ8lDŽǜȠPɴ,tʠd΀l@lӜ,DԀ԰0Ր Pְx`l \݀ސ<\|ߠX`,`8lTDDT4`TpTT T,P8 $DlXXH$ 0Tx L(H\`<t(X< <l  D      $ X   8  P  l0, d<`<\8h@\ @` t`X0#$ $$$$$%%T%%%&$&\&|&&&''<'\''( (@(\(())8))*X*h*++,H- -.|/P/012p2222233,3H3d333334 4(4<4566666677(7D7`7t77778D8\89:P:;`==8=d====>>D>`>>>>??0?\?x???@@4@P@|@@@A A,A`AB4BhBCD|E8EtEF$F|FG@GGGH8HIIXIIIJ JPJJJJJKKKLL(LdLLMMlMMN,NlNOlOPlPPPQQ,QXQtQRRS\_L__`8`a0abc,cfhhidij0km(mpmnxo<opdq(qrsxvwhxy}}|~~t~\0T8Xx8` d tdxT0|dPl,$h4<$0XxhP\@TpLXpX ¼|pČĴtŴ80ɘʸ˼͌$XҤӈԔՌ8, @TLl0H xHHt\H0p$T(d t88     |  8    LxxT!L"$%&'L(*P+-.\.//H/x/00080T0|001 223445677x7788H8p88899H9::|;;<<=H=>h? ?@ABCEF<GH`IJK\L(MMNlOPOPQRRRSS4SdTT0TXTUU(UXUUUVPV|VVW<WWX,X|XY$YZ<ZZ[4[\t]]^_`aabb8b`bbbccdd,deffLffgglggh0h|hhhi i(i<iXitiiiijj$jHjljjjjkk$kHklkkkkl(lLlxlllmm$mHmdmmmmnn<nhnnnoo4oXo|ooop$pXp|ppqq4qhqqqrr$rHrdrrrrss<shssstt4tXt|tttu$uXu|uuvv4vhvvvww<whwwwxx<xhxxxy(y\yyyzzHztzz{{D{x{{||X|||}}$}H}d}}}}~~<~h~~~4X|$X|4h<h<h(\HtDxX<h<h(\HtDxX(TX(\DxX HH$p0DTH t|\0Lh$\0t@ htTT d<8h0x<`h0xP4\0\8p¤(PÀðļ8`ŌxP<Lȸ@xɰ `ʜT˸ Hp@p̈́ͬά@τL\l|Ќt8xӔDԐL\Ռ|֌ִ<טhلٸP|L\\lݔTހ$L߬߼4Ld| $<Tl,D\t4Ld| $<Tl,D\t8PhHh@0l@`XPxh4P l\|p<(|DH $<Tl,D\t4Ld|@Xp0H`x 8Ph(@Xp0H`x 0 $<Td  D                       ( p     , @ T l         , D \ t        4 L \      $<Tl,DTT 8HD\tT|H,DT@ 0(,D\t8|, X p    !D!""#4#D##$$($@$X$p$$$$%(%%%%%%&&H&d&&&&&'$'P'x'''((D(l((())<)d)))**0*X****+$+L+t+++,,D,l,,,--8-`---..,.T..../$/L/t///00@0l0001 141`11122,2T2|2223 3L3t3344585x56@6x677@78089(99:H::;< <===>?,?d?@@LA<ABLBCTCDlDE\EEFDFFFGGG G0G@GPG`GpGGGGGGGGHHH H0H@HPH`HpHHHHHHHHIII I0I@IPI`IpIIIIIIIIJJJ J0J@JPJ`JpJJJJJJJJKKK K0K@KPK`KpKKKKKKKKLLL L0L@LPL`LpLLLLLLLLMMM M0M@MPM`MpMMMMMMMMNNN N0N@NPN`N|NNO0OPOtOOOPPHP`PPPQQ@QQQRS STdTtTTTUU$UDUdU|UUUUUV V$V<VTVlVVVVWW4W|WXX4XPXlXXXXXYY0YLYhYYYYYZZ,ZHZ`Z|ZZ[([@[X[p[[[[\ \\,\<\T\\\]]$]T]p]]]]]^^^0^P^t^^_@__``8`h```a(aTaaabDbc(c\ccd0de e@exeeffPffg0g|gh h8hlhi iij0jpjjkXkkllLlllmTmn$n\nno(oop p@plppqqr$rrss4sdssttHtuuvvw@wwxx(xLxpxxxyy0ypyN+x @>2R T  (4< ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02C9uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02ECuni02EDuni02EEuni02F3uni02F7 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0340uni0341uni0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0351uni0352uni0353uni0357uni0358uni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0374uni0375uni037Auni037Buni037Cuni037Duni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni051Auni051Buni051Cuni051Duni0520uni0521uni0522uni0523uni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni05B0uni05B1uni05B2uni05B3uni05B4uni05B5uni05B6uni05B7uni05B8uni05B9uni05BAuni05BBuni05BCuni05BDuni05BEuni05BFuni05C0uni05C1uni05C2uni05C3uni05C6uni05C7uni05D0uni05D1uni05D2uni05D3uni05D4uni05D5uni05D6uni05D7uni05D8uni05D9uni05DAuni05DBuni05DCuni05DDuni05DEuni05DFuni05E0uni05E1uni05E2uni05E3uni05E4uni05E5uni05E6uni05E7uni05E8uni05E9uni05EAuni05F0uni05F1uni05F2uni05F3uni05F4uni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni066Euni066Funi0674uni0679uni067Auni067Buni067Cuni067Duni067Euni067Funi0680uni0681uni0682uni0683uni0684uni0685uni0686uni0687uni0691uni0692uni0695uni0698uni06A1uni06A4uni06A6uni06A9uni06AFuni06B5uni06BAuni06BFuni06C6uni06CCuni06CEuni06D5uni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni07C0uni07C1uni07C2uni07C3uni07C4uni07C5uni07C6uni07C7uni07C8uni07C9uni07CAuni07CBuni07CCuni07CDuni07CEuni07CFuni07D0uni07D1uni07D2uni07D3uni07D4uni07D5uni07D6uni07D7uni07D8uni07D9uni07DAuni07DBuni07DCuni07DDuni07DEuni07DFuni07E0uni07E1uni07E2uni07E3uni07E4uni07E5uni07E6uni07E7uni07EBuni07ECuni07EDuni07EEuni07EFuni07F0uni07F1uni07F2uni07F3uni07F4uni07F5uni07F8uni07F9uni07FAuni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EBDuni0EC0uni0EC1uni0EC2uni0EC3uni0EC4uni0EC6uni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni0ED0uni0ED1uni0ED2uni0ED3uni0ED4uni0ED5uni0ED6uni0ED7uni0ED8uni0ED9uni0EDCuni0EDDuni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1401uni1402uni1403uni1404uni1405uni1406uni1407uni1409uni140Auni140Buni140Cuni140Duni140Euni140Funi1410uni1411uni1412uni1413uni1414uni1415uni1416uni1417uni1418uni1419uni141Auni141Buni141Duni141Euni141Funi1420uni1421uni1422uni1423uni1424uni1425uni1426uni1427uni1428uni1429uni142Auni142Buni142Cuni142Duni142Euni142Funi1430uni1431uni1432uni1433uni1434uni1435uni1437uni1438uni1439uni143Auni143Buni143Cuni143Duni143Euni143Funi1440uni1441uni1442uni1443uni1444uni1445uni1446uni1447uni1448uni1449uni144Auni144Cuni144Duni144Euni144Funi1450uni1451uni1452uni1454uni1455uni1456uni1457uni1458uni1459uni145Auni145Buni145Cuni145Duni145Euni145Funi1460uni1461uni1462uni1463uni1464uni1465uni1466uni1467uni1468uni1469uni146Auni146Buni146Cuni146Duni146Euni146Funi1470uni1471uni1472uni1473uni1474uni1475uni1476uni1477uni1478uni1479uni147Auni147Buni147Cuni147Duni147Euni147Funi1480uni1481uni1482uni1483uni1484uni1485uni1486uni1487uni1488uni1489uni148Auni148Buni148Cuni148Duni148Euni148Funi1490uni1491uni1492uni1493uni1494uni1495uni1496uni1497uni1498uni1499uni149Auni149Buni149Cuni149Duni149Euni149Funi14A0uni14A1uni14A2uni14A3uni14A4uni14A5uni14A6uni14A7uni14A8uni14A9uni14AAuni14ABuni14ACuni14ADuni14AEuni14AFuni14B0uni14B1uni14B2uni14B3uni14B4uni14B5uni14B6uni14B7uni14B8uni14B9uni14BAuni14BBuni14BCuni14BDuni14C0uni14C1uni14C2uni14C3uni14C4uni14C5uni14C6uni14C7uni14C8uni14C9uni14CAuni14CBuni14CCuni14CDuni14CEuni14CFuni14D0uni14D1uni14D2uni14D3uni14D4uni14D5uni14D6uni14D7uni14D8uni14D9uni14DAuni14DBuni14DCuni14DDuni14DEuni14DFuni14E0uni14E1uni14E2uni14E3uni14E4uni14E5uni14E6uni14E7uni14E8uni14E9uni14EAuni14ECuni14EDuni14EEuni14EFuni14F0uni14F1uni14F2uni14F3uni14F4uni14F5uni14F6uni14F7uni14F8uni14F9uni14FAuni14FBuni14FCuni14FDuni14FEuni14FFuni1500uni1501uni1502uni1503uni1504uni1505uni1506uni1507uni1510uni1511uni1512uni1513uni1514uni1515uni1516uni1517uni1518uni1519uni151Auni151Buni151Cuni151Duni151Euni151Funi1520uni1521uni1522uni1523uni1524uni1525uni1526uni1527uni1528uni1529uni152Auni152Buni152Cuni152Duni152Euni152Funi1530uni1531uni1532uni1533uni1534uni1535uni1536uni1537uni1538uni1539uni153Auni153Buni153Cuni153Duni153Euni1540uni1541uni1542uni1543uni1544uni1545uni1546uni1547uni1548uni1549uni154Auni154Buni154Cuni154Duni154Euni154Funi1550uni1552uni1553uni1554uni1555uni1556uni1557uni1558uni1559uni155Auni155Buni155Cuni155Duni155Euni155Funi1560uni1561uni1562uni1563uni1564uni1565uni1566uni1567uni1568uni1569uni156Auni1574uni1575uni1576uni1577uni1578uni1579uni157Auni157Buni157Cuni157Duni157Euni157Funi1580uni1581uni1582uni1583uni1584uni1585uni158Auni158Buni158Cuni158Duni158Euni158Funi1590uni1591uni1592uni1593uni1594uni1595uni1596uni15A0uni15A1uni15A2uni15A3uni15A4uni15A5uni15A6uni15A7uni15A8uni15A9uni15AAuni15ABuni15ACuni15ADuni15AEuni15AFuni15DEuni15E1uni1646uni1647uni166Euni166Funi1670uni1671uni1672uni1673uni1674uni1675uni1676uni1680uni1681uni1682uni1683uni1684uni1685uni1686uni1687uni1688uni1689uni168Auni168Buni168Cuni168Duni168Euni168Funi1690uni1691uni1692uni1693uni1694uni1695uni1696uni1697uni1698uni1699uni169Auni169Buni169Cuni1D00uni1D01uni1D02uni1D03uni1D04uni1D05uni1D06uni1D07uni1D08uni1D09uni1D0Auni1D0Buni1D0Cuni1D0Duni1D0Euni1D0Funi1D10uni1D11uni1D12uni1D13uni1D14uni1D16uni1D17uni1D18uni1D19uni1D1Auni1D1Buni1D1Cuni1D1Duni1D1Euni1D1Funi1D20uni1D21uni1D22uni1D23uni1D26uni1D27uni1D28uni1D29uni1D2Auni1D2Buni1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Duni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D5Duni1D5Euni1D5Funi1D60uni1D61uni1D62uni1D63uni1D64uni1D65uni1D66uni1D67uni1D68uni1D69uni1D6Auni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB8uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1DC4uni1DC5uni1DC6uni1DC7uni1DC8uni1DC9uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni202Auni202Buni202Cuni202Duni202Euni202Funi2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20D0uni20D1uni20D6uni20D7uni20DBuni20DCuni20E1uni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Buni210Cuni210Duni210Euni210Funi2110Ifrakturuni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211BRfrakturuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2126uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134alephuni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Buni214Eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2214uni2215uni2216 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2221uni2222uni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222Funi2230uni2231uni2232uni2233 thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni223Euni223Funi2240uni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22B2uni22B3uni22B4uni22B5uni22B6uni22B7uni22B8uni22B9uni22BAuni22BBuni22BCuni22BDuni22BEuni22BFuni22C0uni22C1uni22C2uni22C3uni22C4dotmathuni22C6uni22C8uni22C9uni22CAuni22CBuni22CCuni22CDuni22CEuni22CFuni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni22F2uni22F3uni22F4uni22F5uni22F6uni22F7uni22F8uni22F9uni22FAuni22FBuni22FCuni22FDuni22FEuni22FFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2307uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2324uni2325uni2326uni2327uni2328uni232Buni232Cuni2373uni2374uni2375uni237Auni237Duni2387uni2394uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni23E3uni23E5uni2422uni2423uni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni268Cuni268Duni268Euni268Funi2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26A2uni26A3uni26A4uni26A5uni26A6uni26A7uni26A8uni26A9uni26AAuni26ABuni26ACuni26ADuni26AEuni26AFuni26B0uni26B1uni26B2uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2780uni2781uni2782uni2783uni2784uni2785uni2786uni2787uni2788uni2789uni278Auni278Buni278Cuni278Duni278Euni278Funi2790uni2791uni2792uni2793uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F0uni27F1uni27F2uni27F3uni27F4uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni27FDuni27FEuni27FFuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2906uni2907uni290Auni290Buni2940uni2941uni2983uni2984uni29CEuni29CFuni29D0uni29D1uni29D2uni29D3uni29D4uni29D5uni29EBuni29FAuni29FBuni2A00uni2A01uni2A02uni2A0Cuni2A0Duni2A0Euni2A0Funi2A10uni2A11uni2A12uni2A13uni2A14uni2A15uni2A16uni2A17uni2A18uni2A19uni2A1Auni2A1Buni2A1Cuni2A2Funi2A7Duni2A7Euni2A7Funi2A80uni2A81uni2A82uni2A83uni2A84uni2A85uni2A86uni2A87uni2A88uni2A89uni2A8Auni2A8Buni2A8Cuni2A8Duni2A8Euni2A8Funi2A90uni2A91uni2A92uni2A93uni2A94uni2A95uni2A96uni2A97uni2A98uni2A99uni2A9Auni2A9Buni2A9Cuni2A9Duni2A9Euni2A9Funi2AA0uni2AAEuni2AAFuni2AB0uni2AB1uni2AB2uni2AB3uni2AB4uni2AB5uni2AB6uni2AB7uni2AB8uni2AB9uni2ABAuni2AF9uni2AFAuni2B00uni2B01uni2B02uni2B03uni2B04uni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B0Euni2B0Funi2B10uni2B11uni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2B20uni2B21uni2B22uni2B23uni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C71uni2C72uni2C73uni2C74uni2C75uni2C76uni2C77uni2C79uni2C7Buni2C7Cuni2C7Duni2D30uni2D31uni2D32uni2D33uni2D34uni2D35uni2D36uni2D37uni2D38uni2D39uni2D3Auni2D3Buni2D3Cuni2D3Duni2D3Euni2D3Funi2D40uni2D41uni2D42uni2D43uni2D44uni2D45uni2D46uni2D47uni2D48uni2D49uni2D4Auni2D4Buni2D4Cuni2D4Duni2D4Euni2D4Funi2D50uni2D51uni2D52uni2D53uni2D54uni2D55uni2D56uni2D57uni2D58uni2D59uni2D5Auni2D5Buni2D5Cuni2D5Duni2D5Euni2D5Funi2D60uni2D61uni2D62uni2D63uni2D64uni2D65uni2D6Funi2E18uni2E2Euni4DC0uni4DC1uni4DC2uni4DC3uni4DC4uni4DC5uni4DC6uni4DC7uni4DC8uni4DC9uni4DCAuni4DCBuni4DCCuni4DCDuni4DCEuni4DCFuni4DD0uni4DD1uni4DD2uni4DD3uni4DD4uni4DD5uni4DD6uni4DD7uni4DD8uni4DD9uni4DDAuni4DDBuni4DDCuni4DDDuni4DDEuni4DDFuni4DE0uni4DE1uni4DE2uni4DE3uni4DE4uni4DE5uni4DE6uni4DE7uni4DE8uni4DE9uni4DEAuni4DEBuni4DECuni4DEDuni4DEEuni4DEFuni4DF0uni4DF1uni4DF2uni4DF3uni4DF4uni4DF5uni4DF6uni4DF7uni4DF8uni4DF9uni4DFAuni4DFBuni4DFCuni4DFDuni4DFEuni4DFFuniA644uniA645uniA646uniA647uniA64CuniA64DuniA650uniA651uniA654uniA655uniA712uniA713uniA714uniA715uniA716uniA726uniA727uniA728uniA729uniA730uniA731uniA732uniA733uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA746uniA747uniA748uniA749uniA74AuniA74BuniA74EuniA74FuniA780uniA781uniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniF6C5uniFB00uniFB03uniFB04uniFB05uniFB06uniFB13uniFB14uniFB15uniFB16uniFB17uniFB1DuniFB1EuniFB1FuniFB20uniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29uniFB2AuniFB2BuniFB2CuniFB2DuniFB2EuniFB2FuniFB30uniFB31uniFB32uniFB33uniFB34uniFB35uniFB36uniFB38uniFB39uniFB3AuniFB3BuniFB3CuniFB3EuniFB40uniFB41uniFB43uniFB44uniFB46uniFB47uniFB48uniFB49uniFB4AuniFB4BuniFB4CuniFB4DuniFB4EuniFB4FuniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBD9uniFBDAuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE00uniFE01uniFE02uniFE03uniFE04uniFE05uniFE06uniFE07uniFE08uniFE09uniFE0AuniFE0BuniFE0CuniFE0DuniFE0EuniFE0FuniFE20uniFE21uniFE22uniFE23uniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D300u1D301u1D302u1D303u1D304u1D305u1D306u1D307u1D308u1D309u1D30Au1D30Bu1D30Cu1D30Du1D30Eu1D30Fu1D310u1D311u1D312u1D313u1D314u1D315u1D316u1D317u1D318u1D319u1D31Au1D31Bu1D31Cu1D31Du1D31Eu1D31Fu1D320u1D321u1D322u1D323u1D324u1D325u1D326u1D327u1D328u1D329u1D32Au1D32Bu1D32Cu1D32Du1D32Eu1D32Fu1D330u1D331u1D332u1D333u1D334u1D335u1D336u1D337u1D338u1D339u1D33Au1D33Bu1D33Cu1D33Du1D33Eu1D33Fu1D340u1D341u1D342u1D343u1D344u1D345u1D346u1D347u1D348u1D349u1D34Au1D34Bu1D34Cu1D34Du1D34Eu1D34Fu1D350u1D351u1D352u1D353u1D354u1D355u1D356u1D538u1D539u1D53Bu1D53Cu1D53Du1D53Eu1D540u1D541u1D542u1D543u1D544u1D546u1D54Au1D54Bu1D54Cu1D54Du1D54Eu1D54Fu1D550u1D552u1D553u1D554u1D555u1D556u1D557u1D558u1D559u1D55Au1D55Bu1D55Cu1D55Du1D55Eu1D55Fu1D560u1D561u1D562u1D563u1D564u1D565u1D566u1D567u1D568u1D569u1D56Au1D56Bu1D5D4u1D5D5u1D5D6u1D5D7u1D5D8u1D5D9u1D5DAu1D5DBu1D5DCu1D5DDu1D5DEu1D5DFu1D5E0u1D5E1u1D5E2u1D5E3u1D5E4u1D5E5u1D5E6u1D5E7u1D5E8u1D5E9u1D5EAu1D5EBu1D5ECu1D5EDu1D5EEu1D5EFu1D5F0u1D5F1u1D5F2u1D5F3u1D5F4u1D5F5u1D5F6u1D5F7u1D5F8u1D5F9u1D5FAu1D5FBu1D5FCu1D5FDu1D5FEu1D5FFu1D600u1D601u1D602u1D603u1D604u1D605u1D606u1D607u1D756u1D757u1D758u1D759u1D75Au1D75Bu1D75Cu1D75Du1D75Eu1D75Fu1D760u1D761u1D762u1D763u1D764u1D765u1D766u1D767u1D768u1D769u1D76Au1D76Bu1D76Cu1D76Du1D76Eu1D76Fu1D770u1D771u1D772u1D773u1D774u1D775u1D776u1D777u1D778u1D779u1D77Au1D77Bu1D77Cu1D77Du1D77Eu1D77Fu1D780u1D781u1D782u1D783u1D784u1D785u1D786u1D787u1D788u1D789u1D78Au1D78Bu1D78Cu1D78Du1D78Eu1D78Fu1D7ECu1D7EDu1D7EEu1D7EFu1D7F0u1D7F1u1D7F2u1D7F3u1D7F4u1D7F5 dlLtcaronDieresisAcuteTildeGrave CircumflexCaronBreve Dotaccent Hungarumlaut Doublegrave arabic_dot arabic_2dots arabic_3dotsarabic_3dots_aarabic_2dots_a arabic_4dots uni066E.fina uni066E.init uni066E.medi uni06A1.fina uni06A1.init uni06A1.medi uni066F.fina uni066F.init uni066F.medi uni06BA.init uni06BA.medi arabic_ring uni067C.fina uni067C.init uni067C.medi uni067D.fina uni067D.init uni067D.medi uni0681.fina uni0681.init uni0681.medi uni0682.fina uni0682.init uni0682.medi uni0685.fina uni0685.init uni0685.medi uni06BF.fina uni06BF.init uni06BF.mediarabic_gaf_bar uni0311.caseEng.altuni0268.dotlessuni029D.dotless uni03080304 uni03040308 uni03070304 uni03080301 uni03080300 uni03040301 uni03040300 uni03030304 uni0308030C uni03030308 uni030C0307 uni03030301 uni03020301 uni03020300 uni03020303 uni03060303 uni03060301 uni03060300 uni03060309 uni03020309 uni03010307 brailledotJ.alt uni0695.finauniFEAE.fina.longstart uni06B5.fina uni06B5.init uni06B5.medi uni06CE.fina uni06CE.init uni06CE.medi uni0692.final.alt uni06D5.finauni0478.monographuni0479.monographiogonek.dotlessuni2148.dotlessuni2149.dotlessuni1E2D.dotlessuni1ECB.dotlesscdoI.alt arrow.base uni0651064B uni0651064C uni064B0651 uni0651064E uni0651064F uni064E0651 uni0654064E uni0654064F uni07CA.fina uni07CA.medi uni07CA.init uni07CB.fina uni07CB.medi uni07CB.init uni07CC.fina uni07CC.medi uni07CC.init uni07CD.fina uni07CD.medi uni07CD.init uni07CE.fina uni07CE.medi uni07CE.init uni07CF.fina uni07CF.medi uni07CF.init uni07D0.fina uni07D0.medi uni07D0.init uni07D1.fina uni07D1.medi uni07D1.init uni07D2.fina uni07D2.medi uni07D2.init uni07D3.fina uni07D3.medi uni07D3.init uni07D4.fina uni07D4.medi uni07D4.init uni07D5.fina uni07D5.medi uni07D5.init uni07D6.fina uni07D6.medi uni07D6.init uni07D7.fina uni07D7.medi uni07D7.init uni07D8.fina uni07D8.medi uni07D8.init uni07D9.fina uni07D9.medi uni07D9.init uni07DA.fina uni07DA.medi uni07DA.init uni07DB.fina uni07DB.medi uni07DB.init uni07DC.fina uni07DC.medi uni07DC.init uni07DD.fina uni07DD.medi uni07DD.init uni07DE.fina uni07DE.medi uni07DE.init uni07DF.fina uni07DF.medi uni07DF.init uni07E0.fina uni07E0.medi uni07E0.init uni07E1.fina uni07E1.medi uni07E1.init uni07E2.fina uni07E2.medi uni07E2.init uni07E3.fina uni07E3.medi uni07E3.init uni07E4.fina uni07E4.medi uni07E4.init uni07E5.fina uni07E5.medi uni07E5.init uni07E6.fina uni07E6.medi uni07E6.init uni07E7.fina uni07E7.medi uni07E7.init Ringabove uni2630.alt uni2631.alt uni2632.alt uni2633.alt uni2634.alt uni2635.alt uni2636.alt uni2637.alt uni047E.diacuni048a.brevelessuni048B.brevelessA&%$!:$#"!:"!: d}}      Y    & Y @ &  .A@}>,,G}G  @ 2 d۠d%%%   %ё%Д #&̑ɻ]ɻɀ@%]@%dĐ::2  }& @ ]%]@..@   K%%%2 ~}|{zywvwvututsr}qpo,o,nmlkjihc h2gf2ed ed d@cb c b a`a``_ ^]\\[Z[ZZYXWV@VUTSRQRQQPOPONONMLKLKJKJIJIHGFGFEDCDCBA%BAA%@?@?>?>=< =< ;d:987656%54554 4432 33@2 10100/ .-,:-,%,:+d*d)(''& %$#@+$#" "!!@  %@ K}K%%dd   2     @   @d  d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++bzflag-2.4.2+ds1/misc/fonts/DejaVuSansMono-Bold.ttf000066400000000000000000010671041200563112200217650ustar00rootroot00000000000000 FFTML ,GDEFNXHrGPOS4!GSUBOS/2%ƐVcmap# cvt I*)fpgmq49j+(gasp+ glyf!+phead(<%x6hhea $hmtx/+2loca^ ,Xmaxp` names3j߀!BpostXhprepLQ3iLiV`V` j{|deefghuv        arab cyrl.grek@lao LlatnX SRB (ISM (KSM (LSM (NSM (SKS (SSM (markmark&mark.mkmk4 $,4<DLTHn z BR" j j&0  j:j   jQ]jjh $6HZl~ P< x P< < |@ 4X P< p  j~jj  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|l@Lh\hsPNp pm6O?6u\ PM.\:.PNjLj[Z[jIjWTLj4jK]L@jVj88jbjt@xvXT,d(hHh4    LB,j,j2),j,jTdTddTdLppO_ i9;]O]]keg5gIKjk!_9k!_!_!_!_!_!_ sY=gUw%k[[[[yk]kykAkaaaaAa=a1a%aaaa/KYM5aKKeo}QG/ {]oO G?ek]kis\T,i TY< !7"9<9  S= V Yy \ _} o o v  j~jj $6HZl~ hU hE hc hG h h h h       &,28>DJPVj hjQ]jj\jhj jJh  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~bzb2_bVS ;Ckkk2zo.2r brw>*{v&#_BC;'bO&cnkkkk}o<"?xx4%WiFWW@TT[:B`^L?c:Es[Tv;]48x, X&(oXoXloPXdToXOJB<ExKUTTTRlbOW&ZZs{;#7fkf**.z"/*3[c k:Bo:s62C2> ^n~*6.Zw.k~BVKO2 Gh8pBh<U=7~e<PL#j_ 38~~{)Kprf{+>V !7$9<;  S? V Y{ \ _ o o r u x       &,28>DJPVj hjQ]jj\jhj jJhr @ $*06<BHNTZ`flrx~hh6zhhhhhhhh6hhhhhhhh`h`hg`hh`h2h`h`h`h`h`h`h`hh`h`h`h`h`h`zh`h`hhh`hhh`-```h$=DKN]"234  56BB8HH9:;<=>  ?|V\bhntzh`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`/| ntz "(.4:@FLRX^djpv|  Hbeehu>DJPV\bhntz` arab cyrl6grekHlao Rlatn\ SRB (ISM 0KSM 0LSM 0NSM 0SKS 0SSM 0 dlig8fina>initDisolJligaPloclVlocl\medibrligh $,4<DLTHL V Z   6 T     J^2p5 q s u w y }  - %   ) ! = 9 A E K I 1 M Q U W ] !##&(&+,).0+22.46/892;;4R& { / '   + # ? ; C G 3 O S Y _&!"#&'(+,./4569;R& z . &   * " > : B F 2 N R X ^&!"#&'(+,./4569;   }  } > $  w  s  q  w  s  q  O LI33f  "(PfEd m`?p~!AE?CXauz~_ :UZot .<[ex{%-KcwEMWY[]}  # & 1 : > I _ q !!!!"!&!+!_!"" """"" "-"="i"""""""####!#(#+#5#>#D#I#M#P#T#\#`#e#i#p#z#}#####$#&/&&&&'' '''K'M'R'V'^'u'''''))*/+,w...t $EPCXatz~ !@Z`ty,0>bw{(0Vh~ HPY[]_   & / 9 < E _ p t !!!!"!&!*!S!""""""""'"8"A"m""""""#####%#+#5#7#A#G#K#P#R#W#^#c#h#k#s#}#####$#%&8&&&''' ')'M'O'V'X'a'''''))*/+,u...Rpv|ye]KGD?>=<;-~{tonhN~xge\GF}|{vuskdc]H865$SQONMLKIC9630. 6nmkjihedbDA@  ݛPr`    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvjgsgwS^]nl|cneT~Um}b:  y_nqjklzom`3#N\{#'##\ #\\w#3b##\b b b%%1/#/ 9bRsq#oVd\Hf```{\{`o7L'5%={D=!/s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-hh@ b/10!%!!hsr) @ d <2991/0!!!#  !#qe@ d1<20!!!++J@0g g    91/<<<<<<<2220333#3!####5!#5!#3_^aJ^^^^J^Jvuu%vD /P@+)%$(hh!/$, ( 0<21/<22290>54&#.'.546753.'?FE>??ˍWggU̹GP>[ٴ O=>O-C:9L-.+=BI' (0Ϭ ! '3V@-(  (kk kj.k%1"+1""499991/999904632#"&"32654& 4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q%*8@Z)(*()(-,.+23456718%8+(%#1) #1p#popnr)($ +.#  .8 )$. 9999999991/99990KSX999Y"%#"5467.54632.#">54&'3!32676767fKWꍋ20ID@APR=D9DI"BCr;H23ёXN<$%86$~f &b993V+wIz  d10!+ @ut  29910#&547䟚@=5R @ut  299103#6545䞛䄀=?y9TJ@(   n   <2<2991<22990 %#'-73%TJLLLLKLXXB\ #@ v    <<1<<0!!#!5!RPRPjo@ w 10!#9co-10!!-wow 1/0!!MoqB`@ d103#m{V #$@ x! xn!r$  $10@////////// / / ?????????? ? ? OOKKKKK K O TTTPPPTT T ddd```dd d    T////////// / /   $]]4632#"&"326&32#"H45HH54H|f^^fg^^5HH54HGB~{|~o $@xxdx  1/20!%!!!J5JML J/s'[@/% zy xnx    991/990KSX9Y"!!577>54&#">32uL=KByoOkk^;H5/FVAdm?<')ݿX^D}L(G@)p zy#p z y pnr) &  )9190#32654&#">32!"&'32654&%nyynTgg\qd^xxWOS]*( !εǢ&$/1o^s}fu B@   % xd   <291/<290KSXY" !!3#!!y5jBF<@!xzyx xd r  190!!>32!"&'32654&#"+$R.`fSXOQ  ))u''b $5@{{ z y{"nr%   %190"32654&.#">32# !2`ee``gg#OC/c..F싄--AAn75@%xd 991/0KSXY"!!!P #/D@% {'{-{nr'0 $*  ! 0991990"32654&%.54632#"&54632654&#"hczzcc{zqvto|eWXeeXVf}gg~eg}}'yغx(&ĉ׊TXggXWefoN$7@{ zy{ {nr% " %19073267#"543 !"&2654&#"OC/dF7_ee_`gg .,AAi}}'@ ww <21/0!!!!MM's' "@ww   <210!#!!MNMoXmy@29190 5y!X'y@vv<210!!!!X!!Xmy@<919055X!`a)$q@8   %$  fhn !  %<2999991/9990KSX99Y"!!!546?>54&#">32  >PZ?-\\T`beD^XD&cNY=P+CDGF 89L\VBT= s 4]@1(+$ 4| | }'$|+}|+15'(   ! .529919999904&#"326#5#"&5463254&#"3267# !2fYYeeYYf&gHȥGl"0PE\Qm`v4!qqrR511/)//77! @;      %h~d     KSK QZX @8Y91/<90KSXY"@,0000 5::5s|]]!!!!!hi\uZq+q} >@$h hdh   !2991/9032654&#32654&#%!2)čqvp_anF`wyjFP\\S뽼 İ9.@op op nr! 210%# !2.#"32679FU>.UDLLLL+$$xy$$FAAFu(@p dp !  "99991/0326&#! )P<nB? tsJ *@ppd p#  2<1/0)!!!!!J^?{yX %@ppd# 21/0!!!!!XBuujS@!ppopnr%! 1990@]]#5!# !2.#"326hUu?-ZL>`.DTIKsy30PQH &@pd  " 221/<20!!!!!!'q'9+h% #@pd p 221/220!!!!!y))3m.@ opp dr  199073265!!!"&mVctl_JVX\t 4u a@3  %d   291/<290KSXY"!! !!u'N)Nw@ pd1/03!!'w/V{ @  % % 91@ d /<290@  %KSXY" ]@R )=??   & )/708?    ]]K TX 88Y!!###V`bq+sTwX S@%d&& 991/<2990KSXY"]@  ]]!!!!w=^=+=\u #@ppnr !! '10"326&! ! hqhhqrhh    xx{,@pp d !  299991/032654&#%! !#!yuu`5nJbyyb\u<@ pp n ! !'9919990# ! "326&   ~xqhhqrhh~xL  f@6  %p pd   !  "29991/<9990KSX9Y"!&'&+!! 32654&#',A/ Ok^ yihz A^y暶 i_mm^V'p@>'' '%' o!p o pnr('$ ($"(9999190KSX99Y".54$32.#"!"&'32654&'ߞge_`krSohvlmxPLU/.CFVP>Q10Bڦ541TRcYCeZw@ pd1/20)!!!jf*@  pr d  1299990!3265!! j'reer''ppR9m@%%dKSK QZX@8Y91/290KSXY"@  ]]%!!!h)g)+ @@      % d   /91/<<90KSXY"]@6fe   )&ghj f g wzsx]]!3!! !kT;H+ @C    % d   KSK QZX@8Y91/<290KSXY"@  ]]) ! ! !V11X%!S@(%d 9991/290KSXY"! !!>"#>3XwLs 8@%pdp 991/0KSXY"!!!5!Lw#$@ut10!#3!ZoB`@ d9910 #Nm/+ @ut9910!53#5+޾9@ d91290 # #--/10!5/۾f"1K TKT[X@8Y0 #fx^T{ %@/   ggh g#r #  .)&22991/99990@-400 4!urr  ]"326=%!5#"&546!354&#"5>3 ZMt#5d gdikapTfLZq}JPʵĻ1GI5:(&w 6@  h hrt2 0221/9904&#"326>32#"&'!!Rl__nn__lh6Ze.$-6]]ba%}.@yh yh r 75210%# !2.#"3267%Jb&ZS@RUB9++89*,7;9:Z;6@hhrt2 )221/990!!5#"3232654&#"$/eZl__nn__lSab40]\}{L@#   hy h r .)190@ ]%# 32!3267.#"Nfv ekspex 7**->w:?itw{q;4@ t  <<2991/22990!!!!5!546;#"XB/bNʜ0bXH} (I@(  &' hyhh#')& 2 ))221999904&#"326!"&'326=#"325!#r]\qq\]r%\]S[|v+f`+%B .,u|yPN, 8ZR/.@ h t 7  521/<99990!4&#"!!>32/ENPZ#j)yh}]f *@  s  <<1/20!!!5!!!!Dlm%`XR 7@  s  <2991990%#!53265!5!5!!RbRN%+nTV @@! %t  .5 291/<90KSXY"!! !!%`cXd}^B `TZF %@t  991/990!5!;!"&NRbѶ`nR{"@'  h :=:=:#K TK T[X@8Y91/<<<299990@7      /////////?? ? ? ? ?????]>32#4&#"#4&#"#3>32!fJo&22((22&nDDpGD}TV{1{VT}1`tBMQ/{0@  h 7  521/<99990!4&#"!!>32/ENO[#j)zi~`]fbo{ #@hhr . )10"32654&32#"hixxijxx==Vw{9@hhr 20221990%!!>32#"&4&#"326$.eZbl__nn__l ab]񢸸ZV;{ 5@ h hr 2)22199032654&#"#"325!!l__nn__l6Ze/$1^]04ba#{)@ h  21/990.#"!!>320M]&%+w&ln``i+{'@=    %  yhyh%r( >7"5(99991990KSX99Y"(!]@+ $)) ) ) ) ) ),//,))))) (!$'].#"#"&'32654&/.54632QXbd Tema^gjKQ_=4598P2&##7:<98<"&o11@  <<2991/<2990!!;#"&5!5!IUKA>%`0@  hr   7521/299990!3265!!5#"&%DOOY%iTyh~]fP`i@%%1/91/290KSXY"X]@U  ZUUY]] !!)``j` @@      %    /91/<<90KSXY"h ]@@     )&') 96k c wxuy   ]]333! !ywꈇ`5ZF7` @B    %  1/ 91/<290KSXY" ]@    96]] ! ! !yV`yHN;X`w@A     %    1 /9129990KSX9Y"+5326?!!;vwZT+V44y=o<A)9` 8@%6/ 2991/0KSXY"!!!5!MiN``$^@0 %   !  t% $  %<<29999999199999990#"&=4&+5326=46;#"3k>>k{hFb~~bFhחsrݓTѥ͐Ut10#!$`@1%   #t%# %<2<9999999199999990326=467.=4&+532;#"+yhHb}~aGiym>>mVͤэVחstݔXy++@  19990#"'&'.#"5>32326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7= @ d <2991/0!!!3 !#+e !F@& yh yh r" -/"<<<2212<220.'>7#&573 8x?@w84xC=ur{~5*1L0+" :9!wb>@  zyhn x <<1/222990.#"!!!!3#535632N9EjcPS)+N^T /c@8  *( -'! ) -0)'!$ * ( $02299912299904&#"3267'#"&''7.5467'7>32;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&u@<%  d    229991/2<2<290KSXY"! !3!!!!!5!'!53>"#>VddVX𻗽J@ <210##  =% >y@C/0*1 06 'f&*f# f f54%.#"#"&'532654/$5467.5463271a71|U6LU v_fFAѺYUUIMR haG@ЬJX$E(6X`$E+Ql:4Ki neY/2{Q95Fs^!2xR-;1@ 1<203#%3#u1}N1ID@%  >2>&JDB C8B ,/210.#"3267#"&546322#"&'.5467>"3267>54&'.P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIG %)d@4 $#(&$& n*&(' #*229991999905#"326#"&546;54&#"5>32#!!fmd=6Vn2yN[[R@ILP4818g96u11!"@ww# -@   U U <2991<2990 5 5++#Xjy@ v 10!#!X!,-10!!-w}N 4L\@3-*+'0!52+A M*',$0-!1E3+E$CGB3C;B/29991<99902#"&'.5467>#32654&'2#'.'##%"3267>54&'.hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG-X10!!-wV@ n@@102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHdXy *@v  v   <2<21/<<0!!#!5!!!fff!bb2@ ^9190!!56754&#"5>32f3Z:WK8MKB6-+KO4<#"}o~*(D@& #  )^&^ )9190#532654&#"5>32#"&'532654&FooJUOFEDECibouKJCPU_b2,-3teI^p\y@8=D f"1K TKT[X@8Y0!#fT` G@'  hr !    75!29912<<990!3265!3267#"&'#"&'RRQP!+J#H[%nF;ST XrsrsG> KSNP/0F;) "@d 91290!###.54$!fN۲w 10!!Moo39 )@   ^ 12035733!9x-+)N0@ n  9910!!4632#"&"32654&%PŦçkIUUIIUUV޾~mm}}mm~\# -@   U U<<991<29905-5-++#wvwv/w{'V'{ /w{'{& tV/w'V'u %x@<   %%  fhrd&# !  &<<99999919990KSX99Y"!!!3267#"&546?>54765  >PZ=-\\SabeD^XB&ocMY;Q,CDGF89L\V@T?!k&$ u@ ]1!k&$ u@ ]1!k&$ u  +@ ]1!m&$ u$ +@O$@]1!k&$ u   +@  p? 0/   ]1!m!@M ! !%h  i ~!   "999991/<9990KSXY"]@\ !000 0!o  !!' )!;44 ;!t |! ! !]] !!!.54632%32654&#"!/\uZ,*uv*N57MN65Nsq%a=uu>_6MM66MMAc@3  %p hpdp~  % /<291/<20KSXY"!!!!!!#36Vfnj{o9&u&Jk&( uJk&( uJk&( uJk&( u%k&, u%k&, u%k&, u+1%k&, u+K SKQZX@88Y1u 9@hp dp  ! "/<29991/2203#326&#! )#53P<nBĉr tswXm&1 u#+@O#@]1\uk&2 u@]1\uk&2 u@]1\uk&2 u +@]1\um&2 u1" +@O1@"]1\uk&2 u +1wXs 0@   <291<290  ' 7 XJJGJHJHH )s@> )*  '$ ($p$ pn$r*(! '!)!!!'*.99999991999999903264&'.#".5!27!"&''U8rh9N4pi## g=q''j@xb9= >5 33X>=s^xCBrjfk&8 u@]1jfk&8 u@]1jfk&8 u +@]1jfk&8 u +1k&< u{0@hh d !  2299991/032654&#!3 !#!ytu`'n5nIbxyd2X@2)#,2&h&h/tr*  #A  ) .+/399991/990#"&'532654'&/.5467.#"!4632 }t aRP=|C:s6IUsV;< b\^`#[Q@Y J>^ C:HX D0M~JIebf^Tf&DC^Tf&Dv^Tf&D_ @?&/&]1^T9&Dn^T1&Dj^T&Dl{ A@K. 4, ;5#A  ggy 451g8g,>8& rB#;-, 4T)-RB<999912222999990@'33040536G3G4G5G6YYYYW3W6 A]5#"326554&#"!3267#"&'#"&546;54&#"5>32>32IWY@=?=2??2=d_A=Bo%}&HF\}f&HC'\}f&Hv'\}f&H_' @?/]1\}1&Hj'f&Cf&vf&_1&jbf(@N (((#$%$"!"%%$%('%"! #&#h hr#t)'& !#(%" .))999919990KSX9Y".#"32654&#"432''%'!%+1b0izwhms udV(?7%\)B}-b2 wumt{u/9&Qnboh&|Rbog&}Rbog&_R+@]1bo&nR1 ++1bo&jR +1BV $@v  <<10!!!!!!55uK +s@>+,  )*&h&h&r,+,* # )#.),99999999199999990 32654&.#".5327#"&''?B&hxJZ>'jy--UC./SCc:"4Im=+-yLk--w%f&XC%f&Xv%f&X_ +@]1%1&Xj +1;Xf&\vVw9@hhrt 20221990%!!>32#"&4&#"326$.eZbl__nn__lab]񢸸;X1&\j, +@!p_PO@?0/ ]1!N& $ +@ O@/ ]1@]0^T&D!k&$ ^TF&D!o'mc$^ol{'mDAk&& upf&Fvf}k' u&Jf&_iF9k&& d%1&FKjk&& uGf&F`fu}&' Zg cAnA1G@8@/]1uZ$F@&"   "hhrt   2)%<<1/<2990!5!5!3#!5#"3232654&#"2$/eZl__nn__l"ttab40]JN& (@]0\}&'HJk&( \}F&H'Jk&( \}1&H'oK'm(\o}{'mHJk&( 5u\}k&H` @?/]1ujk' yu*bXHf&_Jujk&* 2bXHF&Jujk&* 2bXH1&Juj' *bXH'dJ@?]0Hk' u+ +1/k' uK +1K QX@8Y@O]0>@   pd    "<22<221/<2<<220!!5!3#!!!#53!5'q&ن'qhQ /B@" ht 7  5<<<1/<<299990!4&#"!#535!23!>32/ENP--ݠ#jQQ)yhGF}zz]fij%m' u,$ #+19&n@]1%N& ,+@/ ]1@]0&%k&, F&o%&,mBo&Lmg%k&, ` @ 1/20!!!5!!Dlm`D@# op p dpr ! 221/2<22990%32765!!#"&!#3!3>?HU'(STEl9ǾMVX\:: uv43 N G@$   s   ! <<<21/22<220%#!53265!5!5!!!!!5!#3#ѵbRN%o6!nTVm!k' @u-+1Xf&_u0&r(.0'(N` ?@  %  .5 291/<290KSXY"!! !!%`cXd`}^B `Tl' v/ZFl' vOK QX@8Y@O]00'(/Z0F&(O' Do/Z' kO'y/Z'yO @/]1 7@  pd    <2.9991/903'%!%!q'p}wo™%\D@%  t  <<99991/99905'!5!%;!"&duK'grSbѶӦâѠnwXl' v1/m&vQw0X&:(10/{&@(QwXk&1 )u/f&Q`$'QYjVe2@ pndp 21/90+532654&#"!!>32e\\y%dR^jm;>'%~nlnˁoKN4X/{5@ hh 75 21/99990+532654'&#"!!>32/[Zy'dR"#NO.-#jQQTklnz45GG~`]fij\uN& 2+@ O@/ ]1@]0bo&R+@/ ]1\uk&2 boF&R\uk&2 bof&RD>@!p  pdp %  <99991/220! )!!!";C=.{\[|478nͲɮ{ )5o@1("!% !gy3g -%g r6*0T!*R(6<9912<22999990@ !"()]!3267#"&'#"32>32'54&#"4&#"326>c_>2:MN;;NM:ߐ;:,*JJMG8;;Bjfm' u8- #+@O@ ]1%9&nX* +1jfN& 8+@ O@/ ]1@]0%&X+@/ ]1jfk&8 %F&Xjfj&8lO @]0%&Xljfk&8 =f&Xj_f&8mo`&Xmbr' |:+1m&_Z+1r' |< +1;Xm&_\+@]1k&< u( +@ po `_ PO @? 0/  ]1sl' v=9m&v]sk&= 291&]sk&= u9f&]`;*@  t <991/90)!5!546;#"B/Nʜ0A w >32#"&'!#535!!!&"26Ze.܊$*lnn]]bazzD(?@$h hdh   !$'+9291/9032654&#3264&#%!2)"#546r-qv--p_anB1F`wyjFPS뽼 İ/B;ʜ{>w"'!!!632 &"2\llhQlnnæ~D+%3264&+'3 !yuuy٢n5bbR-&"2>32#"&'!'lnn6Ze.ܖD]]ba9/@! <1@ op opn r0>3 !"&'3254#"DU.>UFLLLL$$rr$$HFAAFk %27# %6326;#"&#"E0-Xa\1)!Hx#@7.8"#%27# !2676;#"&#"&HZy'_.#K33sV89Vl7+rU?u"0#547676; !#26& 0KnB'&4MFmts?}#";! $545676?6%3!jĈvqeH+ejyw`+ Q2[w"7632!5!!526&"*hlʳl\lnn4Da=n{%/%#"'&'&'532?654#"32%26&#"~}cTy `&ZQh:#?ixxijxx5?NM ",f==KJJ +@   21@ p pdp/0!!!!!J^{?+B\u=@ ! !'991@ p p nppr9905!54&#">3 ! %3267\nxLLFU 9 iad__AFH$$xxٯ}L(>@  !!&)1@ pn)p) p#r)90.54$32.#";#"3267# $546ō\ggTnyynxx^dq%!(*]SOW}s^o1/$&٢lXe!!!+5276=!eSZVh)%C}+dl72}-[Xv!!#!532765!5!546;#&XT\c()obcl78TNʜ&k(%27#5!# %632676;#"'&# ]*̬@<< Za\1)}."TsC  l7.R:dO  '! !%3254hrACr%v ]u~ *'&'&'&#"#3>32?67653hbYDG?@$$xUAA X+19y} V*4GF}]fij 4 T^xh;'&'&5!!!nmf&&))xv-.%!!3#!!!#53y)) !!!676&|'@MD6$wGq3= 476;#"3! !![Zy'b+)`cXdAml75}^B `TZF3+;!"&=#53!5! RbѶN^n^BP! !''7!gkd)NUTEWR%#"&326532653#5"&#!fJo&d((d&nppGD<}TV{D{VT}D+tBMQV!+532765!!! T0<;+<^Z4K=+=V/{!4&#"!!>32/ENO[#jTzi~`]f\u  &5%63 &'&#"!3276hn-]O` I|:3U- Q )4qr4(txxpOD2P_xx]'2 'R &5%6327!#327&#"d(ECOu]rxSU+Cg//g&q+pi5x yhV{327!##""327&훀꓌ixxi,<< =|erП]]3264&#"#5476763! !#!quu 0K/5Jbb'&4MFmVw$&"2"'!#776;#"3632Rlnn k QZy'_.#\QDal7+Wy*!&5&+!!3 3264&#',!0Ok^' yihz _y+暶 i_^V(03267# $546?>54&#">32ّLPxmlvhoSrk`_eg7eCYcRT45B01Q>PVFC ./˞+{'>323267#"&546?654&#"Y_ꚨQKjg^ame㕠T dbXQ=&"<89<:7##&2P8954bx:Xv&(;#"&5# %53232#%&'&'32'3@䨇.2\K t8G (`@iHs@ lY265LoX1 !!;#+532767&'&5!5!IUUZy'b+"PYKA+fl7,eHQ>w!!%#"!4767676O'{0i{Z!0,-LAM!H!o147676;#"!!;#"&5!5[Ry'b+)IU`mb 75gKAZVw!#!!!;#"'&)+b'yZSV57ld'8'XhZw##"47#5!32654&'!wxllxQNpgfqPRmn8mO֦M uR'53!"'&5!276%xliB'&&f-H9mȷn.-X!!776&S.a)=?51JL@\MXa +5326?!76&kwZT+u%p[RS4;^0"=o<A)_;;& #O9s!3!!!5#53!\Uw&4`!3!!!57#5!!Min`  "# '&5!327654'&+5!!>aEb)"'toNkIQm?tk9)qo dn  %2765!! &54767675!!# J1>6n GOoNot׊54&#">323+uLmT;KByoOkk^;H u5HtAVAdm?<')ݿX^H "#!!!2! '&5!32654'&+DtKQG>OJoKKfO@tfstt_95jcf54nHc` 2!"'&'32654'&+!!lxiGGghhf_[KKY0,fgst%)58jcf54v5?%#"'&'327654'&+#5;5!3[w٣IIDFFHHY43NTB61^ׅ#*+rB`GLr!¦!! +'I!!!!!!!5!5!5! ffff:!k&$ u^Tf&D`%k&, uf&`\uk&2 ubof&R`jfk&8 u%f&X`jf' &8b%O'q;jf&8'  %'}jf&8'  %'jf&8'  %'|\}{!' 'b$^TO'q;!& &$b^TO&D&q;N' &ujk' yu*bXHf&`Juk' u.k' uN\_u&m2b_o{&mR\_uN& b_o& k' uynHcf&`0Xk&`ujk' yu*bXHf&vJ333327653#"5##8EΝ9RJ%2:8}0qhwXk' u1/h&|Qk' uf&vk& ug&}!k&$ ^Tf&D!k&$ ^TF&DoJk&( \}f&H'Jk&( \}F&H'o%k&, f&%k&, F&\uk&2 bof&R\uk&2 boF&R=k&5 f&Udk&5 #F&Udjfk&8 %f&Xjfk&8 %F&XV&6+{&VZw&7o1&gWHk' u+/k' uKjVe!4&#"!!>32e^jm;>'%~oKN4t%-%724#"'632#"'#67&'#"32!26&"-h*4X|u+D=$>L׵<0$DxEEx yaGyl$>40/-DsX!!#+532767!5!LSZy'b+"w#dl7,dX9`!!#+532767!5!MSZy'b+"N``dl7,d!k&$ ^T1&DoJ&(2\o}{&H2\u' 'b2boO'q;\u&2' bboO'q;\uk&2 bo1&R\u& 'b2boO'q;N& <;X&\1t %724#"7632#"'#67&'&5!5!-h*4BX|u* J[N) y1BXl}7&%t{/%724#"7632#"'#67&'&=4'&#"!!67632$R!)$Fd{]!u ~;I?##0T`j y1BXl+5GQt`l3!3ߨot1$%724#"'7632#"'#67&'&5!5!!!!V$S!*2%Fc{^"t ~;I%^j y1BXl>XR` ,@    991990%#!53265!5!RbRN+nT-26&"&"2>32#"&'#5#"323KMMKMM%e?Gi !hG?d&DD]]baab40]]SJ{-&"226&"#"3253>32#"&'#KMMDKMM&d?Gi !hG?e%DD]]04baab]]! !!#'#7'7'3'i<ʢ\BC-Z!,UK2bs{s[q^??y?R( &#"# ''&5!27&'3267}jFUן:>.UN$!7RLL_$$r1y Ms~"&AF''7&5!27&'3267#"'&#"?&ZS j&*=MUBJbyB uw9 ~y!Z9:++~~ !3#!!#5(vb !'!!7#7#٢/`4TTb_rBsI1\w+{1.#"#"';# /&'32654&/.54632QXbd T}<肰 a^gjKQ_=4598P2&Pۭ s7:<98<"&9`!;# /!j3-<肰AiN`);PۭV$"#"#5476767637$!!!264'&#N+0!K0DVpz==p$0 "MB?~m669 !!!icc!+nd{ ,27654'&#"!67632!#32767# &@B.,Nt@@"6RTdր~44dhccj`pP**fL--XWq}J((ʵ^]1G%$:(&xY{5!!5#"763226&"5$/JKelkZHGlnna114/.DxY{%!!67632#"'&&"2$/KJeklZGHblnn_a11䘘/.ODw $9@h  hr!t2! 0%22991/04&#"326>32#"&'!463!#"Rl__nn__lh6Ze.ܵ3 !"&'32654&#"Jb$ZS@RUB'++*, 7;9:s0}-%32'&#"763!"'"''47&'&76!2&'&#"96SgfQ=ZSTS@MLR9Kr]G&A,7MM$26&"7!;#"'&=#"'&32nVXX"-5aHH%<;QdbɺG99D:Stnlka110/.FO#26&"%!5#"32776;#"mVXX%xQ˽H99+EHa4Dab40/.]gl75Xy{ 703267!57632!"&&'&#"ke vԒ <<;\}{?@ . )991@ yh hr9905!5.#">3 #"%3267\ekfv)'spex w x:? **'twzq{ 332767#"'&'&'&#"67632?;#"'&5_-HN10 w@A;hUYY^`___5!Hq; ?;:n,Q`ƟVv)?!"D07o[t(<@! h )#"h&r) "5)190467.54632.#";#"3267#"$jvyi;vvshydvn8yd"B6,@_B=T/$fk{(\@! yh#) y hr)& )190 KTX)@))848Y%%]!"&'532654&+532654&#"5>32)boXrq2uhzy]=p"#(YO56E1>W0{A#"&'5327654'&+5327654'&#"567632?;#"'&5'Cr?@wuJTCNOUH'NI/&XK1?@&[R>fZPOEi>  !HZ<0=JJp\["TO E.)  O.N7o[$ley. !27654'&+5327654'&%672'$*F(5:&J@*?;9Yon:8<:nmY%?H "J7#"-VWbLHIGgVV=LX`%#!53265!5!!5!3#RbRN+nV ;"32765#"'&54763!3676;#"#!"'&'32765Y1200\Z12;HG]lkkl'RW|*TONOKHHIABwRROPRR:Gb..⡠rv..!6MM|VU`*%#"'&54763)!"'&'3265"3265.=_mnnm.'VPQQMJJJ[f11_[fb\⡠!6OP:7_%%#"'&7632&'&#"32767'#5!7]edk򍍐`YXOQPQPQPMN'"!e2(1YXYY b`oo ' !!3254g> CCN}V#L~||bo`%254'!!! 54f-,,CCW;HJ9SLJ*^!32765!!#"'&#"#NP--#jQQVy44GF}\]fij*!4'&#"!476;#">32*#"NP--[Zy'dRjQQ)y44GF}@kln]fijV*(%4'&#"!476;#">32+5326#"NP--[Zy'dRjQQSZy'dR)y44GF}@kln]fij)blnjh!!!3#!!5!5!5!!fDllܐ@`!5!#"'&5D&&fmnl.-vxjh` !!5!!5!llbXz*#"';!"'&=&#"567632!5!3276xJHHN6>(*bZ\NJNHJRNG=FDF+<77llu:?= ke"&#";&;!"&=#&'&!5!!;2` 3RbѶ{@'N 028?pno)b̜rD^%!5!;!"'&N*(b\Z77llH. !;#"&5#5!!#"'&'32654'&+V$[=J휉l;S<5ssMNNMGEgm88n~Nn`L9 !qfst%)58jcf54P`"%#"'&326532653#5"'&!!fJ78&d((d&7788pGDdd<w1}TV{1{VT}tB&')(PV`"%#"'&326532653#"'&!!fJ78&d((d&7788pGDdd<w1}TV{1{VT}B&')(PV{367632+5327654'&#"#4'&#"#367632!32K77GJc R""133267DDpF#"dddl77~)*+-y1y-+*)~1`tD$'R@F{'!54'&'&'&#"+5326=!67632 &\55ZYzRB'CKK[Vo77#WVyv\pb./DF{"4&'&#"!!67632;#"'&5&'U<5'CKLZRSUuY_-HWK`b./wxj/.vxY` !!!!xI}`uubo{ !7632#"'"!3&'&!#3276bzi<. % .5!!5#"'&'0L^EE&$,XZv<::45,,! >&ln`45327676765!!5#"'&'0L^EE& $,XZv<::45,,! >#9/u`45MV`%327676765!;#"'&'#=#"'&'M0A@M]FE& %()d'yZS+YYw<:945,! >&66n\67lb)`45V{.#"!!676320N\FF&&*ZXx<994+,,! >&lnR `45V{!.#";#"'&5!676320N\FF&(*f&xZ`&*ZXx<994+,,! >&ln%77lp7`45J`35!476;#"!XZT%%QP! KJ`35!4'&+532!~$$VXZK !PQhh`+!&'&'&+!! 32?674'&'&'&#*9  4'$lwxHFX>W) 1 +B- m WF`MLtDC_(:% A` "#327654'&'32767!#!!OO['(('%K-+%k322?s99nnf HI Ga/0!GHoKJ`V({8&'&#"#"';#"'&532654'&/.54632QWXXb22 TKJrq?A)d'yZ[ade^gj&%Q_^_=48P2&TUVWS)7lk7<98"&[Xv!#!53276546;#"T\c()Ccl78ʜ@[Xv!##!53265!5!!5!546;#"3R[bR)B/JblnNʜ0A[Xv!&'&+532;!"'&B)(c[T@}87lc:Xv&(%;++5$!346;#""#"67638t K\24@5Hi@`(Yl ʜ@L56TJ`!5!4'&+532!!~$$VXZ>K !PQVJ!!;#"'&5!5!%%TZXDK !PQ>Xx`!5#"&=#53!!!3)32760hRR&:&HDNP,%J]f/yhF;U|`&327654'&'!##"54767#5!&@+99^_89+@LE86>OELQskXWWXksTH;l:pAT}`$#'&55#53!?27654'&/A;0}}o[Z%"%`D=/!D;lyx:yƩ 4aXksTHP`3!! Pdid`j` !# # #!!ӄ`:676;#"!! ;RSvwZ**+ٞIHo<)D`!!!DOQf`Yx(.V`!!;#"'&'!5!FN(*d&xZTN``77lbv\`%3276'&!367632+'47!5!R'& /62]N N9G`v[0@78nHc`! !5!!"'&'32654'&+7yNqMGghhfa``]KK9 !qfst%)6jcf54dHl` .&'&23676 !5!5#7#$!2&'&++ c4'xMqNFet ;K}A U4X9 !qfs.( #-[H*4+32765&'&#"67636!XTN33YHHFFDIIؽw[rLG`Br+*#Ӆ^+!&'&54762&'&#"3y[wأIIDFFHHY33N ^ׅ#+rB`GLr+!'"'&'327674'&#XB[wأIIDFFHHY33N3^ׅ#*+rB`GLrU+#%32767#'&54762&'&#"3YHHFFDIIؽwwأIIDFFHHY4`Br+#Ӆaׅ#+rC_7 *32654&#"47632 '&47632"'&EWUyxvyUW䦥.#"1<"Db"#6^^aa5'''/-6L&&wZ` ,@ hh  !21/9032654&#32654&#%!2#!^^^^HNLJSNdn33320203፛Rsjlez.% !";#""'&54767&'&547676H F(5:&J@*?;9?Yon:8<:nmY-kl%?H "J7#"-VWbLHIGgVV=t=+%#"'&7632676;#".#"32767'#5!^ddk򍎐VZy'dRQPQQ'!"e2eln10YX xY` !!!!!!xFUF`k1]Wt$!!3+5$)3!5!&#"?676%8tFZҽ4Ni]kb)+VSk ]L@6hVh` !! !7!h@D4d$V'``!!!D`FVM'%#"325#476;#"!26&"*;9HɶR<;&IHa6,+XX+[1/0411aml76e}\\D\?&327654'&#"67632;#!5+53lTN34YHHFFDIIټw[ rLG`Br+*#҅^p¾?&5&'&547632&'&#";3+!5#53#[w٣IIDFFHHY43NTp^ׅ#+rB`GLr¾3 %(26&"73!!!+5#"'&7632 !rBBr!կa,-=s?@A@w6++R\\D\SL`ۦa11/.~@ 4>!#5#"76323!#"'&'32654'&+26&"Z>?=;9:7SX--Xe! rBBr {ab4/.]SL9 !qfst%)6jcf54\\D\9<%3276'&26&"73!367632+'47!+5#"'&7632! rBBr ԯ 8/yz-,=s@?@Aw6++R9Gi\\D\SL`v[0@78a11/.~B/I&'&#"#"'&'#"'&5#533367632532654'&/&'&547#3b1455;2`-,DD<@?@56(G998U:=<8>@R0e/.3=48H:'SUVW"(PQ>½K3ZH7<98"%RQ0*K !XH&.35476;#"+532767#"'&5#53#323(17~;563NNN0Ab+bl7.bPQ>CK !Qs3<G367632&'&#"763#"'"''47&'&'#"'&5#5332'&#"#;&54Y6222'.-2U]>e=x1$65"!XN23-)#,7Gr]G&A#(PQ>J9K,K !JX3;>32+5327654'&"####535476;#"ϮZ?`0176~H<^ϰ32(b]fikTkl77z45GG~NNN04?&'&#"#"'&'#"&5#5!;5327654'&/&'&54632o0545;2`--DD=?@A}nb;:x9> Q1d/.999=48H:'SUVW#)`77H7:98"%RQ.#5!;!5!!!5#"&b:aaٯ~n`77`9 333# #333# #9xyyy޼yxxyyy޼yxsPTQ PTQ %#!#!#!#!>)>)8J"332765!!#"'&54'&+5328""NO/,$LJjPR**d&xZV^Vy44GG|\]33ij:7lcQV)3327653;#"'&=#"'&54'&+5328>@$$BPaJHxUA@#!PaHE^VyhGF}˄nlk}]fij:7leI#4&#"#367632,2300De443i~D:'(Fh5;<I#4&#"#476;#"67632,23;9M@400Deh3i~D:'(Fa<=~>JL4vjK+532765#5!5#53Ktʖ?zox~J~rU|&'&#"#367632|)*1>*/ 99L, $"b !<>tb6 U|32767>53#5#"'&'U)*1>*/ 99L, $"J !<>!b6 "32767>53#;#"'&'=#"&'))2;-, @N:5rM&J!I #<>!8~=7{J6: "#327654'&'3276?3#!322:l0]j! (I%$FG()|)7((?Y**t 333# #ޜUNLWWV=F+5326?33&45LL96ŤYY((}">!bitfLL2764'4#7&&'&6vTSSTvt'&l&'STTS0"'&4763"vTSSTv6&'&&tSTTS'&l&'H327654'&#"567632#6}1!!9g..--,/.iyLY;m8@+'6%@  vJyQ5H#&'&547632&'&#"3m;YLyi./,--..g9!!1}8d5QyJv  @%6'+@f5@ 91290K TKT[X@878Y3#'#Ʋff5@ 91<90K TKT[X@878Y 373Dzx @1@0#ǽ+-X [@1@0#ǽ+-j&6`!!he|6`!h|&`[L&`\L; #5#53533^ݼlݼݼF;1L R@ ] ]10K TK T[X@878YK TX@878Y4632#"&732654&#"LvwwvM67MN66Mvvvv7LM66MMoj@  ] 1/90!33267#"&546-5%=2&M(6_)r|7GF'1 \V5m 9@$    999919999990K TK T[X@878YK TK T[X@878Y@M           &]'&'&#"#4632326=3#"&j7 +$%g^$H)>%$'g^$BT%>;+?:)=f2%7;!"'&7r&&iNBs87o[ 5&73733254؜}~ztoق2SFEE['#5!;#"'&z4?ʆ:;~J>~=<J..#"#"'&'532654'&/&'&547632V4p8?@6d20IHADDE>.8(.Fhb[sTr..> Ll)=f4@@o]991<2055]3#3#Vfxf` #ȾD'f###£׮fxx 'kjF >32#." cd FJKE2@10!32!525#xxz#3$5zyz;f!#!fN'CN'vyo#5353#&M33##ٽSC~n!5!#+1532654&'3#"&CI'1 \V5mR2&;1'M(7^)s{6  "&463"3\\%22% 2%&2V53533W;fN#5!##+` #53533##SG~5!S+G/X/ %+53276=!/[Zy'b+)#+ml75}V 75!;#"'&#)+b'yZ[)}}57lm2(1000]!!-2(@ 1<203#%3#u D  1  0#"&546324&#"326D]\\]3%%22%%3\\\\$32%&23t:@10!#oo3!@   ]1/90!#"&'532654&'97{0e5-T$:A*.>j/_[ .(R<o?m j&#ǽD-&#5##v@#"'#"'&'3276732767y0@k>=k. MPMG@FF0:m@ 91<90 373Dzx@ 912903#'#Ʋm> @  ]]1<0332673#"& dSSc EKJF@ #."#>32 dc EKJF 7@$    999919999990@M           &]'&'&#"#4632326=3#"&j7 +$%g^$H)>%$'g^$BR%>;+?:-j&10!!-wڼBXy+ax5!x5!'uwy')?rs 0526544%22%\ 2&%2-n3353.vJ&!5#=n@67632632#&'"#&'"y0@k=>k. NONF@FF0:map '7'77h)!'&'&546;5"+2654'&$ >< ,@8 )#zSR!. zRR: &;1k  $#&'& #&%6iy z 3OG$%%$GN(tf3AntVH%#AnHV #"=3;X3Vhs' fv-; &jf'yJf'yHf'%f'Uuf'f';wf' &!$}%X@!)! qi0/=J(s=H+\u3"326&! ! qhhqrhh  \  xx%,u.!)!!Hi+V{0wX1H )!!!!!HAA!\u2HL{3bx !! !!o>nZw7<\u&.67654'&'3!35&'&547675#!QQ[\ww]\wb#QQ Uk?  HJllKFFKllJH=?kU;P3!35&'&!!6765!wwb'@'@'a+~[##[ą+ZwF@$    OON N 9991/<299073&5323!>54&#"!Zxllx)QNpgfqPR'm8nȿm O֦M%k' uk' u6f&f&V/f& f&L&6z(&767;5#"/! '&'&54763Af罐qpj4+0QfRDcEG6::;Ax윒+$= TᥙABMR[[Vo!%!! 5456'&E,rbbEI8    8V`!!&'&+532w)n*&*Pn]o(vVH JYbo!%/&547632&'&'&#"32#"76"326&G~}cTy `&ZQh:#?;ixxijxx)?NM ",f=KJtV##52764'&# !5!3T][TF!;)l MX[TL&DV/{!4&#"!!>32/ENO[#jTzi~`]fao(&'&"2767  G -<<- -99- $wppvvRQ`;#"'&5#5%%T:NZX` J!!PN`gP ! !'&'&+532)''^p_o<q-wJJXT`w/x`67676'&'!1!!@|8M6P3E.*{2'Z|u4@bY|rNįt`V#$! %$47#5! #52764'&sl3S][TF!0A*R LX[TL&bo{R`#3267#"&'.=!!#51F",c7Or`? " VX#sVw{  #"&'!&"2Z6lnn{]^SDV*}$%#52764'&# '&!2.#"R^\SF";w&ZS@RM?LX[TL&9*,7;WGb`#"476)327654'&z(C$=8\]^r'J`!!;#"'&5!%%T:NZX`K !PNL`!"'&5#5!327676'&'!1ZX%%9g>  L#7&$PN J!!7gLGةAVj!2!$76676'&&`rkjs+*Z6j{4V@BsSV}dxaM>HV`'!&'&+532!;#"'&Cz#%&OudgRPC)#%&PvgdSr6LJ<mLJ>EV`%6!!$!!n$nn$n$d 3V@ O@`3676!#"'#"'&7!2H WlrU11UslW H86*CqSSq61&jL1&jbof&Lf&@f&ow% # 76'&!"'&7607676"B ws6Fqn r96$(-k<`zt ~xhn$ $6'&'&'&%6#"'&3676g2DTGjЈ ۞Q;^{/G/z xGCcX}վUjNk"!4''&676'&\+**SJtxLGkeJZ vV "40z7/cT$f'O "k&  u:V'67!!&'&4%67654'&W$dTܢe)FF6$&EEj#U mi$a mE+_q!v+\u!`#5!#'$'%!76''iKJ#  9$G@F=#- t 3Zg/#"'&7676'&6'&'&632767%76y8\C2=0 ~R8\F56/!2뼟Blb|aPZP02"=BsZ{kF[R@02\Og\Vu "326&!&'&! hqhhqrhh!ܛ\  Y  `*~xƇbVo{ "326&!&'&32hixxijxx)܋^[Jha#j=i`9 %"54763!! 32#27654'&pSD~t>;!FT[]ckr%LS\bfZVt`""#52764'&# '&76)AMM=nR^\SF";wxM[\ILX[TL&X) V"%#"&'3267!5!5476325.#"yE5Q'P+7s>!E4^%R)7pW RS; 3g+6'&#"56776327'&'&7'&765F\8R~!0=2C\8R~!/6sB= 20BPZPa|blB= 20R[Fk{Kw{!3!! ! #"&'$&"2 "Z6lnn(S]^D%}FXRM\u!3276!&'&#"! ! @Q )4qr4(_ 4rq4  _xx]ΔKyyHxx}$%# '&76!2&'&#"!!32767FYPgZTSS?MOPL.7LXGIC9*,6[5XfAZ;%}%7032767!5!&'&#"6763 !"'&CIGXM7.LPOM?SSTZgPY9 ;ZAfX5[6 ,흜{Vw9&V{ !!###V`b'+%TVV{ !!!#!V{}'%.Vw{%!!!5#53! #"&&"2GhhZblnnppS]OD9703254#">3 !"&LLLLDU.>U+HFAAFH$$rr$9'y&9&*yEJk&B uJk&B uX,%+532654'&/"!#5!!6?67632ڈbR#`)GG" -ݾ+/5^)Q+nz3%  D1C0$ 5iXk&@ u9:@!pop op nr! 2210%# !2.#"!!32679AZ>.]?6`<IJ+"&xy'!2UCDV6%,%k&3 u+K SKQZX@88Y1m-%3264&+#+532>!32#6%tt%% rFhn laaZѰ+o'%3264&+!#3!332#6%tt%Bn laaZh9'!!670767632!4'&'0'"0!#"+/5^)Q#`)GG" -ݾ0$ 5iz3%  D1Cuk&G uwXk&E uk&P H 3!!!!!'q'/+B!${3@pp p d!   2<99991/0%32654&+!!3 )yuuyn5kbyyb'}%X@ pd1/0!!/(m@p dp  1/2<<0 KTX@8788Y@  ]!32645!3#!# 0d*P~ `3Uc5/BJ( u@   <<91@ Bd /<<2290KSX Y@ I:I:I:I:I:I: <<<<3! ##'# !MM dv_}LwX M@  %d && 991/<2990@  ]KSXY"!!!X^+==wXk&E u.H1@1@ ppd/<0@ ]+3267!! \ _c fѰ+ aoM+V{0H+\u2H@pd"1/<0!!!!+/{39&Zw78@ %p d 1/20KSX@  Y+326?!!>uP:a(71<1/jl#|@:  :: <<<<1@p dp/<2<20 KTKT[KT[KT[KT[X!  @878Y@ 00 0 ???]!5&5475!!>54&'sZUxsZVwssffpҏэ;P G@ pd " 1/220 KTKT[X @ 878Y3!!!3!P'q'//Beg"@p d  21/290!#"&5!3265g%¯#|GbVI3VN @ dp:= : =: 1/2<<0 KTX @ 848 @8Y KTKT[KT[KT[X @848Y@ ////])33333..Nw@ d p:=: : =:1/<<<<0 KTX@848 @8Y@   //// ])333333#zB000%32654&+#5!3 !5)tt)!5avaZ(%32654&+!3 )!'tt  yavaZ+|U,@p p d  !  299991/0%32654&+!3 !ytty'n5avaZ9!"63 !"'3 !(횒.>Ҩ(k|HHrqHH{&9@p"np r%pd:$ :$%:'<91/990"36766'&!367632#"'&#2:**),4"(,"'shdWgwoeloyxwx y"uSA@ ! 291@ B ppd /<90KSX  Y;#" .54$)!#tnntFK٢m_^#˱+N^T{DAoK ,5@* .$)-21@ 'h!h r-0632#"4/&4767676%6"32654&n&0u6$ZyU3ixxijxxK #of=4 JIX@ RwZ` ,@ hh  !21/9032654&#32654&#%!2#!}vv}NN@SNdn=FF;0119ۍSlj`@ 1/0!!{`?`l@     1/2<<0@  ]KTX@878Y!265!3#!#(5O{XF^VU{\}{H`u@   <<91@ B /<<2290KSX Y@ I:I:I:I:I:I: <<<<3!##'#!HH`WVJz1zU7{&>@ $ '1@yh!' y hr'90#"&'532654&+532654!"5>32YOsuc{rFTUs=w,1(TT56E|4}qC` ]@  74 221@% /<<990 KTXA @88YKSX@ Y!!!C#e`5`5CF&e`Ei`/@ 1@h/<0@ ]+532>5!!; _ dPQPIVz` @  !  91@  /<290@  %KSXY"K TX 88Y KTX @ 848Y!!# ##V```q7s/` %@  74 221/<20!!!!!/#=``}bo{R/`@741/<0!!!/`{`Vw{S%}F/`@ 1/20!!!5/`{;X`\OV>@ : :: <<<<1@t h hr <2<20&733>54&'  FjjFHjjHV..gs77`[a` %@    7 1/220%#!!!!#=#`{{$a!@  7 421/20;!!#"&5!\k"޾+[;3N` @ := : =: 1/2<<0 KTX @ 848 @8Y KTKT[KT[KT[X @848Y@ ////])33333`{{:`w@  :=: : =:1/<<<<0 KTX@848 @8Y@   //// ])333333#QV`{{{(`3264&#'32#!#5!FInjjnI^=;۬`3264&#32#!!B2jj2m%=;Z``$`$@h h 7 4291/032654&#32#!{njjn{,=FF;Z`%{"'3 7!5!&#"63 ő.#5駄$V ur T8| 2@hhr  ::: !291/0"32654&33676#"'&'# ,^c+8T\k"BnmVf½›t`Q[ڔu `T`@@  291@ B  /<90KSX  Y;#" .546)!#nPPn)+y F=<S\}f&bC'\}1&bj'Xw53!!!>325654&#"!#K~R[i\L]fn2Ƭg f&`v%}<@" yh yh r 752210%# !2.#"!!3267%Jb&ZS@R|_UB9++89*,7;Ug9:+{VL1&jXRM` 3264&##+532>5!32+.2jj2v , dPV =;PIZ#`3264&#!#3!332#.2jj2+ =;!`}ZB53!!!>32!4&"!#KjE\L]fJyhf&gvCf&eC';XF&p/` !!!!#!#>#`{X@pd1/0!!!/2@ 1/0!!3N{`:/X !#53!!!هhM\` !#53!!!݂h6X!2+532654'&+!!!5~d+QڈbR#X5inz31RX/`32+53276=4'&+!!!QQY[qb)("%LxihӶjl77|14k` 3 !3!3###' L MMv_  Bd`3!3!3###'S'HHWWV%z1zU}oL&Do7{&du3!#!!!=#'N)BN`%3!#!!!)#d%`cX `T`}^%!#!!!!!3!'q'h9/`)!!!!!!!#=#!`}qo9&uNo%}&HnZw )!!!!!%1/` )!5!!!!!B<9V`!!!944b`)7! !3#!#35>"#>3Xw@@9V`!!3#!5#535944b`)>۰>!# ! ! !  V11XB%!7`%3!# ! !!5VVyHNeg!3!670767072!4'&'&#"e#*/79^)Q#`GG.-f2$ 5i1z3% C/K%, k&C F&cuX !!!2+5327654'&#/'NOUW.QZ[ڈe&)#1FN5ool77~/1X`!!!32+53276=4'&#%`c QQY[qb)("%Lk`}%ihӶjl77|14XH%+53265!!!!!H\[ڈbR'q'+nlnmh9X/`%+53265!!!!!/Y[qbR#=#+jln`}eg#"'&'&5!3276765!!!D+/59^)Q##`GG.-#0$ 5i3z3% CF$a%5#"'&'&5!;!!!k+# 7sk"e[3=! '!!k&= ^TF&]!k&= u   +@  p? 0/   ]1^T1&j]{Jk&B \}F&b\uQ\}{\uk' u\}&j k' uC&jc}Lk' uD7&jd ynHc`0wXN& EC&ewXk' uEC&ej\uk&K u +1bo&jk +1\u!bo{\uk' ubo&j9k' uZ%&jzN& P;X&pk' uP;X&jpk&P ;Xf&pegk' uT$&jtX )!!!!%3` )!!!!!`B(k' (uX&jx2)53VIYf, 327654&#"+533632]8""E``8OS-&Q7` &.jdL.(4H0" !53!!⨹CI19$!!!54&/.54632.#"  >PZ?-\\T`beD^XD&cNY=P+CDGF 89L\VBT= -%57&'&54767632&767h8@}SnZdFG+9:H:Z?LWaKaKQ6&Xs%#4FD7CARXL%5,iGec50$ $*  ,$ QB]WEfnf`-Sm\daّ֔w<$6!`]]T'&   %327654'&#"!#53!632YM,>5M(N365%65!"'&'&7!3276M 20yl$.0`UZkFOIij﷯\HK\ssj1+-3<,276'&'&'&#"&!4763&547632p1& 04Y2xAw~M`b|_'7&':&4Of7*g?'H-8XD&8 %"327654'&'2'"'&5476).N(@A5/VǎQ%T=1V9>( <6-T|PQ#JQL  &"34'&!5 767"'&'&5476326LG($L:0 ,*F94D\0('3g'm8h"(uA~b7S:(05%5%0ppV05%0p*%654#"&'&547633"'&'5676 &$ 50?4M_/?%M(=tVF,*#$!4D\0(%3g1+k 05%0p(#'&54737676537654'3'&x=Es7" ,$ 4G +@&#^2$NQ2omb}8>#&!RY$6,It5\ ;! 4&"2>"&462FhEEhF2GF34FG732767#"'&'>|*631N:B6^f:lq=& )L0-Av  84373^^F!!Jldx )!d&..l> 1<>}x!'!767!!"* %IiB=t/)ut_ptmTTPf>x%!!7676537653#"' D7Cx<,2/< F(9y-8 {)[D >2%,*1lL6 x*32767#"'&54767&'&5476`iST0PQNB6fpkMH|eepdOFO=4x!6E'5 PN>Q!S#!'%}pmrh/>5lwUfly "27654'&' '&47hP5<<6RNLZtrZQ[[Q꿻܆&zBx!'# '53 JT[10xN|EeF22Zzx!!6767!Ym,fJ Nc/n?5&<eNRa{oZzx!&'&'!6ZlfKMcЯo>4xhfNSa{y|y&'&'&7676!&'&#"ЈZDgvi\6/1vIF1>3#""@:#GlocyG O%(H'%s'J 3#3#!!@V ^,,6767654'3is$Kpm\erPO``Nov_E9!# VI@L !!%goqgpoUU!"'&547!32764'pg3|nuZqX4;TfnLH0DI0("6654&#322765#"'&54767632!&'&47!i)@5,!,)'j$i+TcQ_V.Nݢ057D(K#N$.=*,̖"Fc8(R&HTsu~]zJ\ 57&'&54767632&#"7T "$C5H@>& |:654'&32#"'$&7!3276767#"'&54767632,,;!%&,?Mﲥ{# $xZ;re73 C\|-wqb`YM]#&-#*B|^6()[:\^-"')Hac)s52(#4|H&3   ]l-%2767654/&'&54767#"'$47!&xH^'45!"1K79 ~xhWohpl,&y1l".BX6]E+//193J<01)|n]30 b,@^n@ _' 5&#"'$47!3276765'!TP8C!N'-_"x>fy(&547632&'327#"'!! x\$Jk jܤy3767&'&547676&'&32704trzV`jXX>+a?,Vv)krm!RA@!JYZzxZzxy|y>s|%#"547"54263 !4#"游ʑ,Lۖf7pQQuYl)"2546632&# '%7654t$P{R~8:tqu;;=MkČG:.j)y}47&76$!4&$'632y*, N~j+8Hu]6OA$,Ll^ȨH 463 &'%327'&32'4:NJ*!y @?Aquxs  A@@?K &"32654& 76'#5432!"!54n$ % *+C{aKKF 5"32654&"76767$326765! 54%7654$ % #t}Q҆em0o %"%Ƀ@<@BDkQcC;;eo">!fkz 3265!$'&7&5!2#"'3jj~$,*Xf,_b2O6hKM{V|$"24#"54$76Ȭ)kyx5 *%"32654&"&#"2#"5!23263!4#" $ & *|H, <8@>"&Y %"%ӎPW0n|$"272#"5"547663 !4#"ՀӨ9y6ܸu3I jdmbJS~ +"32654&4323254#4%$7" $ % fz3%:?( %"%Hھ|XsEhf\[K24#"5765&5476325!!"'@>]J*uP]#8Zs@0[2JFfHMM|T}"247&76325!%$ԛ% &xLB|T"247&76325!%$ԛ% &xhBT0 A"32654&!"32654&"' &54323253325&74453$ % $ & TeTXXTМЀ %"% %"%JJbߩ44ˆ+,@T} +"32654&#"' &5432325332536$ & 'BCTeTXXT %"%3^^JJbߩ44ˆH~ ,"32654&2?33253%&'# 47&76D$ % LRZLĒ>%  %"%㩪,-=%ۂPH ,"32654&2?33253%&'# 47&76D$ % LRZLĒ>%  %"%㩪,-=%ۂP`!325!!"'#"543225""T)3Ƅu`,888fk  32765!$'&7&5!2#"'3jj??$,*Xf,_bZYO6hKMd )"32654&4%$5! &#%$&763232,$ $ /(8. <h $ $ ,^$RE?`{<= +%"32654&! '&'&7 3654#"%6#% $ 2,L/-(9X!$ $UzƜ1o5Ox{"326! %,'4323254#"0@@<) =;TYr=0!-553! '&'&7 365# "32654& 54!"CЀ,L/-(')% $ L@Uz!.!$ $6/'= 4"327$"327$7&76365&5632676#4#"%A?A?pƾ6\w5@W?:@@@L@@@E>/>icbX #+"32654&%$%&'&54327654=$ % 骅 AcS %"$36H9Gt6caf4 1"32654&$'&'$6!2327#"&#"%$&76$ %   ph@\†bjC %"%ŇD0tHG_)Rq}]  ''&'$! #"'"32?6+(xsx 8@7YCt N*(mEsJQ'e^eQ, '&76'&'07o V@P5)C21sjf!4#"! fܺN=  Au f&fu/ %$ 5 '& [_0~9e}%$ 3!5 54 [`f G~9fP3}%$ 5 '&#'57 [_&&&&0~9e}#### _%$ 3!5 54#'57 \`f &&&&G~9fP3}####h&7'6'&762'6C3217*9{[l僐,.--Tbڂfwm&7'5667&763253% 2AKA |ۺ f@TwdD:0;QF, &'676'&76Lk`W r,sWf-2G)4G^254&'&''&7767! xj0~m]HI:"qv,SW}E#|Y!567&74$7673 7iz%.Z?^2476763676'3!#5676'&'&'&3&76'$CM=!JXY[x5?Gb*gW/A67 *ut7.,U 3533##5#zۺoPhi%&767'6&j=DAA566bq ! $546732654&'3.'!'q-(xikvYK@,6\,"H%]x8ڡWedn'6.#32! 6756&'&5!94P54S;9R35C8,Tf[SZ00ZSPyP(@3i*3 !_#bsBPn*-%' 7! %>54.#".5! d}~'3B$8, /6O   /D2# "/--/"Kt/~m V4.+"32>5>7.54632632#".5.+"!4.%' a+%!4" 'AT3]KKcd30a`@eO8$C =cc="8HKI;&m8S89kS2"=U3_.,#CiEE3mxr4&@SZ[' )giI;6BY@-'+#anp+'%! 46732654&#".5 p UQ sghfdXf #fJG_*)*jd_`mjQW8F"Z"76;(Sbnp*:! $'4>7326=4&+532>54.#".5 p ! xgmvcX??)E16K.`q '_^d`r=A?S&P#llUX\XU/H23M5KN'4b09@ m``4#mbp 34&'&>4.#"326%! 467.7! |54&+"#"5!263  D) E2432R<6:!_ IwWPIpl0@$HHLBNy}IBfbmIS ~~? EELap*'#>54.#"#.5&!2p0UD;?7O18X= B732>=4&+532654.#5 o*/ ~q1N7IXUL=ri_onq$RK<|'su/H3/nwDK-E/n_|#*bnp*6"!.'.#"'>7&546! .5467>54.^֐KX;$ Ji$Q5qj ,#   #?WUdUgn3>~*?l- ! 7*&=0H'Q>DdA dp/4.#"326%# 4>3254&#!5463 J:T45S;qaq&?~}AFn*yoU` WtFEnOkl{Bw6*6^]46bbaq 4&#"76%! $5&63!!">3Jtmiwsjmw& ((0gF 4A37 6!>=4&+"#4&/"!.=432>32(C36A$ 3-?7*2 'G:3D(3a$#W2:uuu;:mhb/Y[lY[0ein:73326&+532674&'$5!#p&#  }rar}l{Nar%PUjk349 !524!vrML6B 55 54%5%q&rd<_C$?> 7C% BhZkj5P6I CRc9Q{R*]FA!>54.+"#4.+"!.=4%2>32 "B9=G"  @  E "HB9I*%^?m$(hL73! 717ds reGuwDL 12iDhqmp@D%# 4>73254.#"#'4.#"#".'32>32>32o*8 p "' $!#-#!$3+*< #'*"*5#5I#&rA/)WRGm3^5sp9T76T:$,% )0( ' C77Cn*S4&/"32>5+".5;2>=#57##54632632o #/&A}v"jH".")8")7"'5AiZ(.dp(;B!(:&lm7,$!E6`RD:AD"bno7%! 4>732>54.#".5!2<645!o 3%~v1R:!:aICN   KF9f#@?A#A3c1sp"GkIwx=8;,(&W"<:@'H 657!9m*F>7$5432>32>54.+"#4&+"%.'&#"5>d&'kF+C0%8% WB%*+4)"^?&2 L$##$B>me_13UKF%J(1^1(ߧGV؅%=/" 9<dnp ,! !>=#".54>7!3265!p 7dl"847!@8aJ7=T73L3qu%u]_' /k{Brjg6=_L?:9!GY3Z]w@4.#"326%! 4>34&#"#54.#"!!2>3 P V^'@Cl-17%*#%Z%#{RlSk?>iQPwN'y  r430RQ np 5Q6UOQSbp/4.#">3!654.#"!4632.B(BH18F-8Ĉ"A[9ch2)4]F*0;! US% pOqJ#z5f?Zu9oP4# 54>7!2>56+532'6&'&'!{PHY[;Ә2P:*8#Qh;sa97!+)]hFy1@X~?ca\NbyAC$O|X·+=8BR"vbq 4.#"32>%! !2J 54.#"4>32>3 !4.#"#54.#">72!".5 6I+>^>9Q46U< 2XzH)PG:&Z%#*%++xC@xy<NuO'!GqPQoF?kJqL')=)QSZ6Q5 pn 1)+8:zM{annG32>54.#"! 472>'4&'.'" !!3#},69.,59/  uh5V; `P4=   "1)UU&C11C&%@//@\l $$c]5O5Dn*0V*\bE# F4/T9ao 4&#"326%!".5!>3Jyhluxlgw%ÂA$0oGLц<5anp(%! 46772656&'.'7%!%p@Aqfm~`Nbcd xed`dQU2]3suioU'CH5e)OM>HbpA! 5!32654.#!5!2>54.#!5!2>54.'.53p%ofl      !.'!32'4'#53>54.+532654.+5325&'&'3p0%! F"$ "# F$8F##`/-$ >GbbEJp=@Nbp* #>'6&#"267.5% 7$'okk}mftHj }{ &mC[$#aXXQNv+anp*"% 7326=4&#5326'!%p+*/vgi|roz}|`{jdtjypû d=|anq8%! %32>=4.+53>7#.54$"32$7p&wg4U< !>V6.S@(9=<A!!kZ}}3O55.G/0QsH 4c]ʽdbkoB)sm'#"325;54#"! !35#$! 3#3ʽy&kkk4c{L~fLo* 34&+"265%!"'#52>'4&'#&3$5!2>3##P#3d!&<(+I4bz_[R(yQ\@<<5>:<~C%&z{7On8654#"!6=!! 47.x]~hq!":b}^ooNc5=T+(4&'.#"'67.5%'>54'"3SNIm2R:͡86okC/XC.L|n#,m|I'bzDwwLu*.T*kP1 3#3#3#<л~S4#"322"43!%"\PUX]' *Cw;l5{ @32654&#"26=%!4&#"5>32>32+3267#"&'#"&IWY@=?=&2~2=d_A=B/fk{2#"'&'5327654'&+5327654'&#"56763 )HI]hjyTlz2US>hu2@`g#qriiXohib'(@BW  &1E OY"[\pigd %!!5!!!!!%bV{ (3!4&#"5>32>32#"&'#"&26=7326&#"c_uAHv&DX&h+0)5!264&#!5!264&#!5!#GD}TV{1{VT}1`tBMQ!fJo&d((d&np 33#'##hX:8I#3#3!5##3и6p\Dc"3264&#32654&#%!2#!|XHLT||F<>D0\\ln6<F-43/jiQZ nbym,32654&#'32+2n\\nK{zDD !!!!!!JpjDD !!!!!!DJjpD*5#5!#"&54632.#"326~"6JȾ8n0(dJD<14AGș  33 ## "4RJx]D3!DDN 33###ppޠddonb0 33##0``0 ##33`` "265446  &BB@.H[232654&#%32+#LZJJZĪDU7DC7{{#'&'&+#!232654&#(r2D: `VLDBN'%4 ^DrVf$5>=4##5!#ĺ(32653#"&(FH?GG?9񫚚 333# #DP^4ljdsfI) %"326=7#5#"&546;54&#"5>32gR81IQ"h?yA?B}C=~G/:*3bX ?F)-qeni() |) ,27654'&#"367632+32767#"&*g))1J(("35?xQO! ?B>?B<~G9*20X @fF*qen54( |053#5#"&547632264&"鸸//@yDC~8.,DxEExY]6UUggg @32654&#"26=%!4&#"5>32>32+3267#"&'#"&5.78('(& O ?<&K& O4A^R>em010$U..Y(>NR:p\..+*(*01 F55F vPU! /-0,g_hg45"%"%04&"2>32#"&'#3DxEEx"Z8~y@^yggg4476]g03#5#"&54632264&"鸸^@y~8ZDxEExM]674ggg#"&54632!3267'.#"@J"a`@{DHG?LCJH #ABE?>32#"'&=!.#"327679@J^]WVa`@{D$$G?&&TTRSCJH #@"!#"?$2&'&54632&'&#";#"32767#"'&546X-.:BCLV5DM64'BJt)bek$%1aX &z ,2 33?HS$2#"'&'5327654'&+5327654'&#"567632X-.:BCLV5DM64'BJt)bek$%1aX &z ,2 33?HS. &4&"26#"&'5326=#"&5463253HtGGtH:r:4l:NJYAxw=^TeeTUeeAFC,,2.P'm !#5!#3#53y浵~~Q& 373##&?7w%5>32#4&"#4&"#3>2A.\E??FUG(&pF/0EmE0/FmsA%+-M+532654'&#"#3>32:8L?312_Be333<<~=JfD('Gs^49:<" "3264&632#"hBLLBCLLwhhhh0бO053264&#"567632#"'&O*./6ZaaZ41/)4558\]>65!ef WXʮ " 4632#4&#""LCBL՘\hh\" #"&533265LCBL՘\hh\0#3>32#"&64&"2踸^@y~8ZDxEExb^674ggg93#;#"&5#535.6p~*$~Zz!~M32653#5#"&M+d8^BefwD:OFh]49v!5!264&#!5!#5MAXOkh:@&Y2S;Y\"#"'&5326532653#5"'&;A.\"#??##U$#(&88anF/0EnE0/FA%#3໖s&dU|QdMsdsdbXH} (%32654&#"6!2.#">32#"&'!r]\qq\]r\]S[|v+f`+ۓW .,u|yPNZR:ih` !!5!!5!5!ll~b7ZXF!5!;#+532767#"&NRbSZy'b+"Ѷ`n9}+dl7,d0#367632#"&64&"2踸0.@yCD~8ZDxEExYs]6UU4gggO#"&632.#"3267/k>8j4)`4ZaaZ6]*6!fe !JM,;2'&#"763#*''47&'&7632&'&#"$"]R4AkA~3'\]]8554)004Z01 * e@4'$W6XW 33^V% (.#"32654&7#"&54632''7'37>BMKAEI J?6(e#c:*FQFXdea7MUzBA=qAHEB$(#"&'532654&+532654&#"5>32`kǺ>F8HGWetJB[UMyVL:[ SH?f2,z&"  Xa1IJ3###53546;#"ٸi*F7~ ~,qW~t]33#+532767#53 ppADp'@v?CB2(#"'&5476;#"'&'53265"326='[ v\/<~g+#, #5!;#"&t4=ǃs~J>~y,#5!;+53267#"&t4=57L>0s~J>~x;:~78yxY3!!y03>32+5327654'&#"#4'&#"#367632@/\#"-.n>3   "#+*$#(&87z8=~J|FDmDFmsA&"#"&533265332653##"&;A.\E  F+*G(&panF/0EnE0/F0%+- (#=4'&'.#"+53276=367632ż &:!"98kM4*0/9e45>R10U{ rCCK{\7BC"4&'&#"#367632;#"'&56&!*/09e445Jj8<0( 1*[s\7BD~KCGn0 33##0lm" !7632#"'"!3&'&+3276"XYXYYXYB&&E &BC&=0XYYXXYY4(??(4-44#+7675#5!#3!535&'76764'&fHm/mHffHmѻmH////=0X@q~~q@XX@h~~h@A^ 44R 44O:&'&#"#"';#"'&=327654&/&'&547632S3787> 5e/.GH()?L99=?@;A!"0Y3i10IJ;<;- /0Pa10.~=< " -.L[22 +532765476;#"5:Ȕ>55*y8<~ Iq,+~ $93#;+532767&'&5#535.659L>28~*$~x9<~8)-z!~"#5#"'&=#533333+32760/Ae4344ƹ-12]4;;ummD'!b$327654'&'5!##"&54767#5!?)H;<#$) /,#"'1%q+-AG%n$#'&=#5;?27654'&/L)%OO|Fh99ee <+&+l!J=XYXDC~D~¯_71P<@/(f3# ໖sG !!!5!V4st{y!!;#"'&'!5!4t?L95ttdJ~=7{y.]3276'&!367632+'47!5!?3;1t (B3_$y)7!5!#"&'532654&+4[1G^AA>x;W\_\jz yP|<79;" .#"3267"&54632BCBBADEAll~hh! &$^ T{&D}k&% w1&Ed}2&%2w&E}j&%jw&EoAk' u&u&opf&vf&HFuk&' Z;1&G2u&'Z2;&Gju&'Zj;&Gou'H'Zo;&Gu&'Z;&GJ&(\}{&H'J&(\}{&H'oJk&2&( \o}F&2&H'Xk&) ;k&I ujN&* 2bXH&JHk&+ /k&K 2H&+2/&K oH&+Co/&KH&+/&K%&,&Luk' u.k' uNu2&.2&N2uj&.j&N22&/2Z2F&O2N&4 Z2FN&5 j&/2ZjF&O&/2ZF&OV{k' u0Rf&vPV{k&0 R1&PV2{&0R2{&PwXk&1 /1&Qw2X&12/{&QwjX&1j/{&QwX&1/{&Q{k&3 Vw1&Sk&5 #1&U2&5#2{&U2N&N #2&Oj&5#j{&UVk&6 +1&V2V&62+{&V2Vk&&6 2+1&&VZwk&7 o1k&W Z2w&7o21&WZjw&7oj1&WZw&7o1&Wj2f&82%`&Xjf&8%`&Xjf&8%`&X92&9P2`&Yr' |:m&CZr' |:m&v1Z`'j/:&jZk&: 1&Z2&:2`&Zk&; 71&[k&< ;X1&\s2&=29`&]sj&=j9`&]j/&K;k&A !2&$^2T{&D!' &$ ^T&|<2J&(\2}{&H'Jm' 1u(\}&nH2%&,2&L\2u&2b2o{&Rj2f&82%`&Xr' |<;Xm&C\2&<;2`&\,m' u<;X&n\6r&B6r&z6r&O6r&\6r&P6r&]6&Q6&^r'BHr'zr'Or'\pr'P{4r']gT'QH"'^r&Br&z2r&O<r&\xr&Pr&]Jr'BIJr'zIJr'O;Jr'\;gJr'Pr5Jr']hV/r&BV/r&zV2r&OV<r&\Vxr&PVr&]V/&QV/&^Hr'BHr'zHr'OHr'\+Hr'P6Hr']6(H'Q(H'^r&Br&z2r&O<r&\xr&Pr&] &Q &^%r'BI%r'zI%r'OT%r'\@q%r'P|?%r']rU%'QIU%'^Ibor&Bbor&zbor&Obor&\bxr&Pbr&][ur'Bur'zIur'OOur'\O%ur'P0ur']&Lr&BLr&zLr&OLr&\Lr&PLr&]L&QL&^zr'zmr'\r']'^@r&B@r&z@r&O@r&\@r&P@r&]@&Q@&^owr'B)wr'zbwr'OOwr'\O>wr'PIwr']Iw'Q}w'^q6f&C6ff&CfV/f&CV/ff&C fbof&CbofLf&CLf @f&C@f 6Vr&6Vr&6Vr&6Vr&6Vr&6Vr&6V&6V&Vr&AVr&AVr&AVr&ApVr&A4Vr&ATV&A"V&AV/r'V/r'V2r'V<r'Vxr&Vr&V/'V/'VHr&AVHr&AVHr&AVHr&A+VHr&AVHr&A(VH&A(VH&A@Vr&@Vr&@Vr&@Vr&@Vr&@Vr&@V&@V&oVwr&A)Vwr&AVwr&AVwr&A>Vwr&AVwr&AVw&A}Vw&A6F&6&6Vf&6Vz&6Vf&69&C6V9&9!k& !N& f'n*f!V&A rBV r!55#5! Ax 9n ;'CTjV/f'V/{'V/f'V/9&CV/9'H Jf'nDJfHf'n&yHfVH&A2r'n6Bxr&ynB. 'CBF&&&l  9&C &D%k& %N& )%f'nb%f<r'n@zr'yz 'CzLF&L&L&lLVwr&BVwr&zL9&CL&Dk& N& f'nf{r'z5;'nrj-; fC@Vf&@V`&@Vf& @9&C@V9&r8uf'nqUufBwf'n{wfZVw&A fv r5!#7 @ïx-10!!-w-/10!!//10!!//10!!//10!!/&BBL@ tW10!3c~L@ tW10!#:bjo@ wW10!#9coL#b9 &@ t WW 1<20!3!3b`~~9 &@ t WW 1<20!#!#9b9b9o &@ w WW 1<20!#!#9b9bo9 #!#bAb;3 $@f d ?  <<1<20!!!!!5!LK}8;39@ff  d ?  <<2<<212<220!!!!!!!5!!5!LLKK}+}` 10467>32#"&'.736HI256743IH426I235624HI447743?!!?qH9o #@w VV V 1/<<220!!!!!!q'd'd'ooo $0<HLp@?J%K+I"L 71= +"%j4C: L(I1KJ\\F\7@\1.\1(\/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\  ".:EQ\`462#"&57"2654&462#"&57"2654'&4632#"&%"2654&4632#"&7"2654&%֓ӕjg,A@[AAlӕih-@?[A #mxvvw4GHfJKkihj-@@ZBC'!xwxwK24KK42I{xwxwK24KK42%&xwxG45LM41J+xwxH35LM41J^\Z/#@ U29190 5/+#y#@ U<9190 5-+#wv"'4)#'!6763267654'&![`bede""^XD#.  S#F 8LAB\VC)*= %(+C" M B0 !#3#3!/+ !53#53#5+޾tt&'  4&3' D' 4 '47632"'"2764632#"&$"H !! (TUUT <XFFHFFE4llll&@ !3!53#3#Xn|洴 ~~w E@    %   ^ <<91<290KSXY"333##5!5mmw)%#!!>32#"&'5327654'&#"G+y8 `_gfAF3B;=j8777\6677ߑON}LL &%GA('  ("264&'&#">32#"'&54632"##"F081.nr dDKLUTUT033?'&JI''Nݕ xv%$GHMMff !#!MUu2 )7"327654'%.5476  '&547672764'&#"**TDC**)NPRSRS('LT1/VWWW11k"#x"##"<;##"#tF$#9:#i^Cj;<<=hC/.86Mz@AABxK971b  .532767#"'&547632#"'&27654'&#"J081.m99!22DKKTTUTgh033A"##"ABF## <;w$HGLMffkl ''JI''N'(8 !!#5!5!58G!!LGA!!!!ffƅ #.67SQQSdabc~| 3#>54&dbbdSPP|~I#4'&#"#3676322300Df433i~D('Gs^4;;Td9C{dTtdTudCd%CdTdCdTd Td4d%d)difdifd)dd"dttdd#5#535#53!3!3#3#!#!3'"aMBBBnAAAARlbMxJJJJ51@9&(  ox#o xn#r/21('/),&, 0',2229999999999122<20@]]632.#"!!!#3267#"'#73.5467#7,$SDJMkT323#!xmlvho O9+ rk`_eg|P=5YcRT45 2 f@PVFC ./_T. )%#&'$%6753&'&'6767_h8:Ьݢ:8g_Q\DGHB[T%;/+R7r~or 7N'(OQ"z!1 %3267# !2."_|dT ȄE}=[~oi 7@,L]r4*:0N̾ ;`!>54&#"!!>32Nۅ:7Sty/#t0e (5:=\gL !  "2!!!463"!#5265eb<<b)W ٔW  þ>;N>;f A@$   d F F FFF/91<<2<<9073#######5dYЙkKuTKBCZwu.!m/{'{& uV't& uV/y{'{& Vy't& Vy'u& Vy{'& V/{'{& V#{'& V/~{'{& V~'u& V#~{'& V~{'& V/w{'{ B 5!!B#x4̂x#xxM '#'"xx$Mx4x#B '7!5!'7x4x#xxM !737"xx#x4̂xB5!'7'7[x#xx#xx##xxݎxM'3'7#7x$"xxގxx#xx#x- 7!##v<Ļ vĜ<7 #5'#5!7Ĝ< dĜ<6t %!537536vdĜ #!$5>+;6-0$(v# *%;(#8MX!GL!!+Im6#"'&'&'&'&'&#"'67676327676'#5!#O$0-6;+>4!# >&.&=A"?,.!" v([+!!O7!XM8#(H. % #vdB!!'#537xZx#xZxxx##xxM'75'3''#xx$"xxxZx#xZxB'73'7'7#'7!5,xZx#xZxxxݎxxM77#75'73؂xxގxxcxZx#xZxB'!5!7w>x#xx1xx##xxB'7!'7'7!'4x‚x#x>w1xxݎxxB 53#5!5x#x,x##xM %'3'3!5x$"x,rx#xB !'7'7!#3rx#xxݎxM 7#7#5!؂xގxx#xrM%7'3'7!!5"xx$"xx",#xYx#xxB(276767654'&'&'4#!5g    @16T)+51@x#x  Q87;=49(*x##xB(!'7'7!"'&'&'&547>763"j x#x@15+)T61@   xݎx*(94=;78Q  B$=+#5#53547>76"3276767654&'&'&g@16**)+50AGx#xT61@  G    ))87;=49(*x##xH;78R  H  B$=23'7'7##5#"'&'&'&54767676";54'&'&'&j@16Tx#xGA05+)**61@    G R87;Hxݎx*(94=;78))  H  BF26767676763226767'7'7#"'&'&'&'&'&"#"'5[ #$! x#x,"    "/x#x   %$   xݎx "  ! x##xB#'7#533'7'v81x#x81x#x'x##x'xݎx9~ 7'7ckn"[ kOcuP%8 5!#Ђx"xhx##xw !#!'7'zfx$xWxݎx8e !3!5x"xwx##xe '7'7!3x$xxݎxW5p !5!7#7[_xݎxwx#x?^ !3!5Xxx"xx##x2X '5476767632#4'&'&'&7#7,#!A=PNZ]KS;>#"!*#13#'Dxݎxq!TPA>! #;SK]ZNP=A!#qx#x%'C "()/ZOR?<# !>APT2V 5!7!##2lv<ĻʌvĜ<B  !!#33#'7!5!'7xpxxpx xx,xx746#"'&'.5476732767>54/#7!&>(()NGgZsn_aMOP(&Q--'<0CB47---0v\apn_cMG.(()LNkoaZU-8:>=96/(-,r=ZHv74#5!#53276767654'&'7#"'&'&'&5476v0---74BC0<'--Q&(POMa_nsZgGN)((>\vdHZ=r,-(/69=>:8-UZaokNL)((.GMc_npaB5!B#x4#xB!!BM̂xx#M3'#"xMxM#'x$M4x#B!5!'74x#xB'7!5xxM!37xM̂xM!#73ضx#x4B  '7!5!'7 5!!x4x##x4̂xxx#xx M  '#' #737"xx$rxxMx4x##x4̂xB 5!!'7!5!'7B#x4̂x*x4x##xxxxB'5!!!!5#x4̂4̂x>#xx# M73'#'#'3i"xx$x44x#B'7!5!'7!5!'7x44x#>xxݎ M%#73737#hxxގ#x4̂4̂xB '7!55!x#x4x#xB !! !5!'7BM̂xM4x#x#xB!73!!!'7#5!!{Va6PEV`6Dx#x\HHVߞ;cff:bDx##xHHB!7'#53533'7'7##5'35#HHDx#xDDx#xDHHHfDx##xDDxݎxDfHB!'7#5!7!5!73'7/!7'!8Va68PxV`6Dx#xHH;cff:bDxݎxHHB!!5!3HH\ Dx#xDyHHfDx##xDfM#'3'#' fDx$"xDfI\Dx#xD \HB!5!'7'7!5!7Dx#xD \HyfDxݎxDfHM%37#73fDxގxDfH\ Dx#xDHB5!'7'7%!7'!Dx#xDDx#xDkHHHDx##xDDxݎxDfHHHM'3'7#77'Dx$"xDDxގxHIIHWDx#xDaDx#xHHkHH}6##7!#V`JvnJVJpvJT '#5!#5'5CJnvJ`JvdpJ^VT%753!5373JvdpJ^V^JndvJ}6%33!'38V^JpdvJV`JvnJB!!!!5!!qYNx#xdfYfx##xfB'!5!7'!5!7!5Yx#xNYdYfxݎxfYfB3773#''#5[KLnDvvx#xPP~~x##xB'7'7#''#5377vx#xvvDnLKxݎx~~PPM%#5#535#535'3'3#3x$"xV¼x#xVM3#3#7#75#535#5353xގxV»x#xVŸB #553353!Ƃx#xC{x##xM 5'3'#7#7x$"xnƂx#x}ʻB 3'7'7+53#53Ƃx#x}ʻxݎxM 7#757'3'3؂xގxƂx#x}6B !!#3xpxxxB 3#'7!5!'7xpx,xx 5!5! !!5cm 깹] 333'#!#\^Z A !!75!!5 ]]YY ###3!3"^\ZX0 m 3'335%!!# #^\znnZgm %3'3#!5%# #3!^\^dddZm! #!5#7'# #3! ^^dd9cm! # #3!3#!!5#3f\ F ^m!וddkn'33%# ##!#'37"\`\\\~$ym?TT %3'3#!5'3!3#7# ##'37^\^p\\\@ddZm?TTB 5#35!7'!!!5 5ddm]]YY'd!#7!##gv<ĻdgdvĜ<,x!5!!53753dĜ<cg<Ļd 3'3#7## #3 3^\\^XZZ֤mmB676323'7'7##"'&'#58X)O$A?x#x:[V6NJ9\ 63SxݎxH9ZY8J M 3'#'737"xxxxMx4x#x4̂xB'7!5!'7!5!'7!5!'7x444x#?xxݎB#5!5!53!54&#"#"&54632#"&54324&#"32?3-,:*:}fMHeLJdcBds<+@lFWt|uy ?X!0?"'&''7&'&54767>2"&'2767>54'&ww&'''OO_:3www('''OO_;4AA565  AAA565 ww49_pm__ONP(&www4;_mp__OOP((D56MJ@  56JM@K@&%h91/90KSXY"% !!{!5q!!{qdmCq?3 3ް2ް22013!!"&63!!"!Q )SS) PH{__{HPd;w +mq?33%ް 222ް2222*+/"/01#"!#73#!!3!!"'&'7&'&63S) W J+!y 53W ^c>H{HPPHC4|Pu_`P`_cnB / 3 3ް2ް22fff01!!3!!".>3!!"U*^_*&,bމ`+dmCq?33ް2ް22 01&'.#!5!2#!5!26767!5 )SS) mPH{b{HPd;w +kq?33*3+3ް222 ް222%2/"/01%326767!73&'&''7#53!5!&#!5!2'#܃S) V SK,"xk 52X ^c>H{HPPHC4PuP`bcnB/33fffް2ް22 01!5!&'&#!5!2#!5!276|*]^+&,bމ`+L9@__120!!!9_^-LP *@     <91990 5!! !!5my=/9) ӇB v10!!BKXy !!5!3!!!5!ff!bbqB`@ d103#myTU etrX)1 ,@     9190'%3##q@`44{$  %.#"326"&'#"&54632>3"36J032#"&'#"&546320P2;JC88b6J0#@ a/<<1@h h//047632&#"#"'732UpsXlNGUnsXlNGD"McoHޕMcoH^#+4632&#"#"'732%4632&#"#"'732ronQ.A&ronQ.A&ronQ.A&ronQ.A&D"K&ޑK&"K&ޑK&^#+A4632&#"#"'732%4632&#"#"'732%4632&#"#"'732aroKnR&roKnR&rnLnR&rpKmR&roKnR&roKnR&D"KzޑKz"KzޑKz"KzޑKzB &_tJi !!!!!!PMM:>/6'n$'oT'$'T_Xy''~uXy0#"'&'.#"5>323326yKOZq Mg3NJNS`u_G0;73 ":?<776<Xy032?3632.#"#"&'XJG_u`SNJN3gM qZOK0A<677323267#"''43NJNSFXɉ;5GJKOK[C :?<7Dj323326!!yKOZq Mg3NJNS`t_F(!Z<73 ":?=676=X'y#"'&'.#"5>323326!!yKOZq Mg3NJNS`u_G)!;73 ":?<776323326!!!!yKOZq Mg3NJNS`u_G)!!;73 ":?<7763233263!!!'7#5!7!5!7yKOZq Mg3NJNS`u_G`aG#z`;73 ":?<7763236767!!!!'\UQ:43NJNS`jNDJKHEL=a?]R<# :?<77 Y A;XXy7Z@110+5.*'   '.5  810*8<29199999990#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GZ<73 ":?=67 6=;73 ":?<77 6<X=y4&'&#"5>3223267#"'3267#"'&''75>3243NJNS`f]GJKO)-D\NFIKOZq gZpNS#(  :?<76Z323326#"'&'.#"5>323326!!yKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_G)!;73 ":?<77 6<;73 ":?<776323326#"'&'.#"5>323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GJKOZq Mg3NJNS`u_Gu<73 ":?=67 6=};73 ":?<77 6<;73 ":?<776<X<y"32?3632.#"#"&'!5!5XJG_u`SNJN3gM qZOK!!A<67732#6454&#"#4&#"#3>32V""V!Z6^b"%25'26 R28W35uo :5SN[5SM%Q//7V'x:%)!!!!#546?>54&#"5>323#V""J 6 0*)^3@"   v v  <291<2<2.990!3!!!'7#5!7!NŮmA1}X<y !!!!!!X!!!Xy{!5!73#!!!!'7#537!5!~P$fZ=e(lN"ebSbKXy !!!!!!!!X!!!!Xy &@v  <2291/90 5!5y!PNFXy &@v  <<291/9055%!!X!! Xy 3!! 5!5X!!! PNFXy 3!!55%!5X!!> X}y#5!7!5!73!!!' 5ZYM{~ X!i i행PNX}y#5!7!5!73!!!'55%ZYM{~ X!i i행Wyq&%5767$'567Rȳ}v֜P ij~wԞP(Fd%EP7(Ge#Xy%5%7%'bk8jyx!:_|:XCXy'75%%57'xk8Zj<y:_|B:[XCX<yD7%!!'7!5!7%5%ykSnKAD*ZWOzd#@4=PhLx"LX<y@7'#5375%7%5!!' z0VFdjeG'C0'Pau6LvLXy!#"'&'.#"5>323326 5yKOZq Mg3NJNS`u_GJ!;73 ":?<776<PNXy!#"'&'.#"5>32332655%yKOZq Mg3NJNS`u_G)!;73 ":?<776<X<yD+.7%3267#"'&'&''75>327%5%RmKKt`GJKOZq G:GAFJNSMOyel!PNX yy  5 55%y!!PNXTy1!7%'757%57%5%77'4PGx0e4P0GkB$$1F4F\}F5F\|t?t?XTy15%%''5%75%7XZuu: &uvk;Z&vFIs}FyJs}Vwa%&'567$wSh"/_D$#Q_Vwa%$VhSbQ#$DbO/"X[y5%$X{qQ_#pOKI4 &X[y%%$ynq{_Q#yBpR&4 RIKX2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_GJQ_;73 ":?<776<TKI4 &X2y%%#"'&'.#"5>323326%$yKOZq Mg3NJNS`u_G)_Q;73 ":?<776<TR&4 RIKVw67&%'&'567677\RN@E߾\SiIRa_bIGE#"R!+Vw'76?&'67&qRN@E߾\SiIRab_bb*IE#"R!+DXyx!!"3!!"'&5476?:nLMm:׃x|~KM᎚ِXyx2#!5!27654&#!5̍:mMLnxϚMK~|Xyy %&'&5476;3!!!"''#"T=1̆cHcw.nL!5ِEFǚ|~K Xyy +'7#5!!5!232654'&'}=1̆cH>9c.nLA!5ِE,F9|~K Xy)%!5!!"3!!"'&5476y:nLMm:׃c|~KM᎚ِXy)7!!2#!5!27654&#!5X!:̍:mMLnQϚMK~|Xy(#"3!!!"#!!'7#537&'&5476;7OnL!-u/K.~=M=̦CH|~KuLx#BِEXy(!5!27+!!'7#537!5!327654/:*'EE/&`-u/K.~-/ mMLL ,E(ϚuLxuMK~|M Xy)!%!'7!5!7#"'&54763!!"3!!y(6^N׃:nLNl:=6ؔDuِ|~KM1DXy) 2!!'7!5!7!5!27654&#!5̍Kh]6(6^:lNLn)ϚR"KDؔDuMK~|XVy!!!!X!6XVy!5!!5y6Xy 5!!!!!X!!6*@Xy !5!!5!!5y!6?j33?2"&'&'&547676"2767>54&'&'3!!#!5!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933?2"&'&'&547676"2767>54&'&'77''7WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F8xxyxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9yxxx3372"&'&'&547676"2767>54&'&''WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FxxXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9_xx37!!2"&'&'&547676"2767>54&'&'M.WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F/XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;933BL2"&'&'&547676"2767>54&'&'2#"&546"32654WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F7b%&'qqX>=,-?XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;9d)'%`8nqq>Z<=,,3!)/7?E2"&'&'&547676&'&'&'75676767'%654'WV,+++WWWW+++,VW:F!#!E: ֈ :E!#!F: & XVWih{xihWVXXVWhix{hiWV9  9{18@9p 9 9 w:A92t3!;!!!!2"&'&'&547676"2767>54&'&'+{{WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:F@XVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;93372"&'&'&547676"2767>54&'&'!!WV,+++WWWW+++,VWGE:;99;:EGFF:;99;:FMXVWih{xihWVXXVWhix{hiWVj9;SP;99;PS;92K 3!!#!5!!!!o2K !!!!!Moת2K 77''7!!! yxxxoixxyxs2K !!!!!M3o/w 10!!Mv\ !!'*]])]\@寯X'y32?3632.#"#"&'!5XJG_u`SNJN3gM qZOK!A<677F =0|bF=&N@NU@Xy&3!!!'7#537!5!!5!3>F =0|bF=&NjN@Xy5!7!!!!!!!'7Xw!6_H4%H@CffXy!!!'7!5!7!5!!5y_H4%Hw6jCffXy" %3267#"''&#"5>327%5yL;5GJKOK[_b43NJNSFXH!e3275%X!V_;5GJKOK[_b43NJNSFXJ,323267#"''yQ_k43NJNSFX]_;5GJKOK[_KI4 & :?<7D323267#"''X_Q{43NJNSFX]_;5GJKOK[_R&4 RIK :?<7D # #hGf> 3 3h*f> # #!!h gGf> # #!!!!h ggGfj!#!/+!#5+d!3 "/+!53!+ dR!!3#CܐRL  R!!3# C RL ~3#!!C~ L ~!!3# C R Xjy!#yG,$%%$nn!"nn 8ʸ!%6 !&'&";112Q2qp`XXV@@VY  67"7,J5PP5JkX*77*I=P"2642#"''7&546xtyΞi56؝wYe:vuvo3N=eXt#O'+6@KV#"&46235462+32"&=#"&46;5#'54&#"3!3264&#"32654&#!#"3265k֘֗kk֗֗kL65LL56LM56LM56LM55LL56LJחkkחחkkט5LL56LLkLL55KK65LL65KK5Xjy!3!y3j !#! 5!# 5; p;!!3Xp;)3!X;5477632#"&'&'&#"jkbwL=.> ebP e(}bP]Y"\I\\\\I`LLMK\y>>(I !!3#!#%33'((d&sd4^7 h\\D?cc!!!OZW !!!!5!5!![[[ZWT !!!!!!!!!55[[˰f W5 ! 7 !!-.O|c;5[Z.Ґ|_W=& B #276'&"! '&'676 !%!pqqpB`Ϙ_BB_1`B[5;@@@@EI7XX7H"H7XX7IÐW3#3#&'$%67%676'&ff2ffff1ff=>>=E>>>3;@;$;;#p#3##tD& 4 !%!!,5m5A4 !!!!;rԵ5mY5A !! ![[#ZCoW^pK  !!! ;[5;Ő[#Z !%!!%!ex[xWx x !!'7!!'7!;Őxex[xÂx'3273632#'#"'$%65'&#"pp./NRR2]PQ pqp/@ XX`H>@!3 33!#!3!3POJ3+^/4 57!!#xr;rw/Krm-4 % !%!5 !53!]UPmrZ[z !! '!'!;xcx~Wxwzxw!3 3!###!##mPOmʀʀ3+^4!5 !! 3!xS;ZKmy4 !!!!5!#];r~U[ZZ, !%!!7!!7x&xWxpwx&  & >' &  D' &B Z^&&Bv7& -i&  8t' Xyi&a 8Xmyi&! 8!%!567!6!&'&'&'yKH FJ97;6L2J!/,3 4(`<?-joo   lXy(8#"'&56776326"&'&&'&'&'&'3276y m{{d m{{cf/ %#2J!UI*/YKX M3 +/fg/  Do}R ( p}I ( " q}}RXy3#"'#&'&#"5>323326yKO32 7 ]J3,AI^9lys:932Mc]J3,AI^9lys:932"326=7#5#"&546;54&#"5>320;0]J3,AI^9lys:932'''''n]J3,AI^9lys:92".33&'."#67>76#FVʓVVʓ= mm &#Km % mK$ʓVVʓVVj,(Km@@mK( mK,K/,Km F^%.!4>2".7!&'."67>54h4.#52".ut&F@mm@@mSoʓVVʓVnt]&sْFUSm@@mm@VʓVV!!![ZWm !5! ݠr0p !!#v !&5 ƠT_Cm 5!p g!0v  !!#ƚΐ,Um!!! # q !!#v!!  rm!!#N#!0v !!!##m !4763!!"{zf+!u0%y!4'&/32765!-9+en:==@ne( =F|AEuH<y 3!!"'&5!+f}{y%0Wy!! m 4'&#!!2!+fz{}%0y&'&!;!76<(en@==:ne+!< TuEA|R=y !#!!2765{}f+!y0%(!(% !!!#!55!mw ¤]]]! !!;bc;$<n$c 1/<03!3n$CV(^! ! !!!!#!#(!(F(!Z((!((!(h(!|((!(*(!>((3(i(f} F( #'+/3!33!33!33!33!33!3䟟䟟䟟mnmnm(%8K#!1!!!!!!!#!1!!!!!!!#!1!!!!!!!#!1!!!!!!F????">>>>#>>>>">>>>(((((!%)-13#3#3!3!##!#3#3#3#3#3#3#ޟޟ#|ŸŸ|Ÿm#([#E(iZh!|ip}h(p(&p&qr(&qr(&p&rw(&q&rwi(p}(&pw(&p&qww!N<w7!!!xr$<w 3!254#!") ) xrVVVw&{w !%!5!5!5!5!5!5!5!5!5!N54&'.#"!624HI347652IH637J347744IH426532<( 3276'&#"327$%&#"!zzzzzzzz12Ι.̌GG2GGF@XXXX(( !#%&#")7632ΙK/zzzz`XXGG 3327$3!#"'&12zzzzXX`GG7| %63"71{y`X{G7| 2#'&#82{{x|XG7 527638x{{ΚT{GZ7 "'$33{y{TX`G|%&#"37632Ιϡpppq`XX@@32763#"'$pppqΙ@@XX`wN<wN<w!Nw!v<`/3267>54&'.#"467>32#"&'.H+(*h9;i)*,++(i::f+),H736HI256743IH426?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) NjBZ7="-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8)kOkaKA-'= //G),Y=  !H$ /+HDH)+) $., fYYx !=Z Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO~ )*+')+(@&'$||e?/A}]\B-71SLoWj\vLLr%%,* #$ )*n$ % +) $ #*+    ? '+&()&(+&p   % % +) $ $*+*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQG4 4  22044 22 9       L%('*%)(*%)(*t     144 22 0r!2CTev+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.N 0d&K4i    }    g    s            &                            H5-V"*2-.T<:U'EGE'DN-ֈU]\`CDcbF]WWZA@ZZ@AZZA@[[@AZKPrqqrPGeޝdMP䠠P }2ٛk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqO.N97OO79N']EacDC_\n\U>DbcEXFDbbDEaaEEaaEDaa+G詄UUSj멏i LVV6 "32654&7#"32?ɏǾ/`TcȐɎ;P12Y.1"264&"3264#"54327&5432#"'&'@KjjjiOiiLKirqrtPssrqQܩZTdIU )5AMYdp{3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<;.=+,>/;Kyz~LZ|WX{{XX{IE11EE11ET    m       ;   R       s@dd@s}>}=/NnN/=}>@MllMNkk& % I% % "!$# "! "!! & % % & %-5AMYdp|5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7liilYz{XW|{bEEbEd      8    @     .HxttxH%?%5E$6  6$D5%?%-5!!1(~(1 5,4t4(4N4(4t4;hhh%%#%% $ %_ $ $!"!$!/!!!" $ $ $ %:-,GtG,-: XLRqqRLX ![$n[ii[n$[!ob !!'!tKZGkcn "!!'!##&+572367676hNn_5, S Grj3#-EmDJ~o.(*!4\tR~UL !!'!  ##' CI3Z  > << 5DCX << ; YD36273 ##'5&< +Z@\\DC ZY\5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)A({@(@){A)A(@A(^)4 'iOj_J@,&< //F(0'&&'ܐ'J&(lN5  >! )&V?<?$&$ '& ZN N />Eqw!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 *,  3)="(&)09$) L&TE` MPA[MH Y $ ;&&e=O%/ N ,8(.7L1Rf~H8SQ,zH%9D6 )jGP@4Rjd_*KfsDIR 9! O  -]&C+/3#"'43727&'#"$472776725676&5&U8)$ tJ .; d3f,"3' VD ( GL/7;;,g t^F$< LD&?>X4R !/# I ? P?D!)Mv>/z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2h!.)g$'30!/&j ! /:(/  )/ 9)/  9)0:*/z2!2654&'&'#'367654.+'32654&'&'!'!2654.#!&'&#!"i !.)g$'30G!/& ! /:(/  )/ 9)/  9)0:*!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'+pCCo CCCC2CCKK<LLKK%JJ60"2=2).=<==<@=:>=;TT USUT UT83$QE!D72654'6#"'4#"'54#"'54#"'675674767#%$4:JILLHOKHLKIhghgighgD>-sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K!!C463!2!6#!!2+32+32#67&'#'367&'#'!27&'!'!27&#!&'!"l;'+CC  CCCC2CCKK<LLKKmJJl6"2=2).=<==<@=:>=;TT USUT UT83$QE!C32=732=7325732'654&#'%2&'&5&'5&'IKLHKOHLLIJ:4$N->DghgighghSS=SS SSb SS'6a!0J)K>*B \\]]:]]J]] O!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uo,Mz"060D/5I:2'5:6&" *:D:S46$.e QN5  u4MDa 6bUP+ ,H;`I23N5( (#I0M '^5%#!:X+ "*  6W}W:uW4 5vT & /H3V XD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[O`_A[-)$t7 L-$ L6=" (CJ#R"0 :~GB{~Eoj<4S[Za LC5 ) .U%+Z&)͢ 7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3(-<((')))())( &2%2#"'&=477654'#"'5473t\*e O@UCXq P S. P ӍMOb>YaYƮ58l7P P@ $0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7\Pg㑵Hr'.)%sM M#fC-7!%A.; ӎw:kKqz +H*G;M tu/&((AA&:+C;."/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&07 ^< 1x,B5@2 JVMv!#uA+UBDX[f*;-10)..C,sB#HKU P]12<0VQ }%'H6-T}^$k7 R2'7f!A\;y?1!50BEt"!zkQ;0qu0\oi:5oPZjsXFaPJGl;4ejN^1F[q7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'H @XO`= ;*)8 kDv/Pk-J KDhGa D`gBD6DDD =3dTDW, :g j)Yi#'WtI-9w18$^8;./7-I)jS)'#i\-IM91D;8%a7/.D=uRNBR&'%QBNRq d2 D s98C ["|44&3, '2^3R T(B?#'9C- !y ~#Z10>N?$%Y4 )%FN? ({ usis< 3(&^T05<>7;,#4[:O(vAfGEtYB z^~4j #,;b:['~Av@~EQ Bak4~_H#T2 $$$$ 2T"`q$&'6&'67327&#!65#&3jjdnh wWVݱqZre[c7 7 cyX ,35'533#3!'#'5!5!5#53!5!5#!!ʶ~~ blvF F A<<3ffX苜qXGccGap 3264&#!2+73 #'#5# 3m`hh`2`Ĉѳh|;vvʷ}f33#!!#'!'57!5#'5735 64pzp7d+!#!573#'5!3!'573!#'73!#'5IxOOTxSVVdY\yvVPPvIyY',32#' 37+ &5%6323'#57'53mJl{~m@+ݼh4144'0>,_ vNknmmnObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='4&#68$$B )Z>&A_;i88u-o1bFGfQ_M5mwLbkjI,K=''8 0##Rm4 ڹ+ܴ5!PP"4\=ѻ"8Qý32#"&546324&"26%#"5432itvxsq1"00" 0/B//B/#a`ir|H!//!"00""00"!/0 _b 9>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y5+ +"'5$76%&'547327676=&#; hz0/O{[(*TQ~`NO =tR[\ 8d<+% &56;2'5$%75#"3vh0.P~N^(8P,VRZycOpO >S\^ f`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8! %#"#&5463 67!2#6#";z\)MaBuh __ itBaM(]y tt[+##+tt\5."264&'67>3"#"&54767&'&#52hq៝rd:BJ|^d#!p⡠q $c]7A;{26XY "zz" YX62 &'5 %$ 56?6'.j拈|*xIIz'&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMm} lyzU<Mnnnm+}7 lyzU<|||,&(uO#eaHG||||Q'(sO#e‹`IH=! <>'.463227#"&5454&#"&'&5476766&D9BB8Ğv?W:pbW~tp) "-ff)-gtpQ@3AA:ACj›GmN?ijbvr56WGe((Wi0154d)-?/6?2>32>32#&'567'6'#4&&#4'3>64&"-S5,9"\0+Fgv!4u|W")^,k ikdS!eb[_[H|NYC:RHB=G`SnU|#!!!53&54632!!5#67654&"U't00Z =yy= :]ZssZ JjkkjJ 2f4%353'5#"'&''#&&#4'3>32>32YE;<<-!&Y*dx cf_Oz.*O2)7Ze``b<`WuALh`8!5!1##'!5!_drrPk^K{U_W{'/27632#"'#576&#"4'5267>327&'"2XCZd}uud$gq~dV)40tlx!&%"dLk}:Uwma4 sOHK{wY@x A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YR #{=('%{XNCEz>O&z>'(#&R #{=O&{YNCEz>'(%{=('#&ee22ee$l66kd23dEPdd33dd$l76kd34eE^s#!5!37!!'  L34((C $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'D} 5RTP=: SSPSS ;r>>p  p>>r> !A% )RSQ1 )6BB6) 1QSR) p  ""V{zHNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"I )),(?)(#!3()3$))BG!(( K{mg,;h IXI L$  P   H''1|G''#s%'')7$ ''A  ''HTݬ9.%~~ rF)~ wpa!'-23353#3!53573#'5#5335!75!!5'57!ePPeeQQeDpH>H@A~}}~00mrTTreppe-!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 ܍a1%?E?%4,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB, n ?%#Naji-/4^t&AYcgb3%' + ((NV8OQĿ>:<uyg**5 k5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"+L)+L*+M)(LH     > |n @: !:;! 8An} E04`a30TL**LTM((     ++x: 8>>q ?9 9? q>>8 :x++c^UZbbZU^jg% $Tdhy47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5d4:;i865%1MNJ96 MMJMM 68JNM0v    +0 +/0U-,,+,.T1/, 9j9:h  h:9j9a &LMK- '2==2' -KML& 1  V//X//X//V6HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.*C,+%#7+,7%,+ FK#++ PDNAM**4d;K))$'**,dY&"**E #**L:ƥ??@@=%)5!5!3353#3!53573#'5#5335!mD^JJ^W^KK^׋LLZZ,}}uz%yuu{{u}--4@4767&'&'5676767&'&54>32!&7535#5##3 1!!#?%?#!?% >$""/ _1+ 4:AA<="  !#=""=#!  "=![1=%T e >6.HC'L"'G 12h[FH`[$%ok+*8d .Ncv[.7&546767&'&546767&'&4>32 w "E> #@!!?% =E!w ./@ =CDz" E>"">E "zDC= @/.QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 '4'&'~ v '  w (  w ' $k=F F>jG3~Pjb^*IerN{̑?qJAe}Ωv6\~x(ONPPNO(!8?|EE|?8!r!_3#"/4?23D-!]UF+}{<!/3#'654'&'#"547326Rs9W5[S%3;B[/OBC'*|<j_g#"=4?2%#"=4?23ɧ%QM?ˠ)TK7(w7џ5s ?|O"'4723!#"5472!5YA>RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_`qE#&#"'5654'5673;54'56732733273+&##&"#&'565*G1 VV2Is3'{'3sI1VV 0Gs3'{'3sP3+1='3sH1WW1Hs3'=1+3PH2WW2H. ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5*)SR))&*&';((:'&)'ȶkkn\\[[nȶ kk n[[\\n`ff/ee.((&(;((:(&((@))SS**n\][[o jj |o[\\\n jj e(P( /N#.6CMhw!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K> #WU* y "њHV ηz/;@"q=o )we)$IY'L ALaXwH >X%CII$PC/DN6g+  b% #  jnN :3 O+5{bQ< ,d-  X] f '^ JJA!< 8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676}]} =--HW(7*! >y*1c{F=.,H-.'d(#Y+GC8957jN})%%tGl5nm3(,H:0/(_kiN}!N920K 1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@.#5*"I?6O"[m" c<,+GU 5) <|w)/ayD<,+G,,&a(!>B<#q'%NG91 M7835hL{'$$qEh3kj2'+G8/.&HghL{ L8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676D|q%N24H'CB=9PS3464E>6O#]o 32EX!#"632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676H$evyn$L27C'y*1c{F=.,H-.&c)"ERUHHS S /(*. 8956jN~(%%tGk5nm3(,H:00'\jiN}!N91/K "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7<,+GU 5) <|w)/ayD<,+G,,&a(!.T--T.H D&RECSukf{7835hL{(#$qEi4lj2'+G8/.&HhgLz L8*.- X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676n!?/.JY08+"(@},2fH?/-J.0'f*#&K:;68nP*%'wIn7rp5).J<21(vmmQ"P;:1-K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/.JY08+"(@},2fH?/-J.0'f*#:<68mP*&&wHn7qp5 ).J;11)wnlP!P;;199'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv I MO $p%|I ^ [T<K"(~GW$?8?])( EAs#L, T 0 ` +WVۄ`$$a.|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-J|@h'\-e@<r2&H); uZJM =9jl:jgb.Qi2Q|酝:*}( dpR!h j `]_i$x:-(^%,3"ؿEa HMP E7g /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1M{ǮG&z v$ExݨE(+=R:n:D!s Y!gQKum;} uA;>e=g¯Cy??ԢB|*>w4I ' 5@` bC$ j$H?iM!%.|7H27&' # &5%6367&#'.7&67263'#%; 65%&# mJB|e6O}°I+o|BJn^jaygwaaygxaj^w$FyتFG퇢D{C?` B]ww]B JХC}.?yP%.232#!7&!"4#".54767267p   {u*_ Jcllm8*#I%<($|ʀX#{Nwt7mnld4)5:IIIB,<_4767632#"'&'&!%!!  >W$`4 Z|b<_/374767632#"'&'&4767632#"'&'&!%!!    UW$`H    Z|b<_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!      UW$`H      Z|b<[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!    /    UW$`  K     Z|b<_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!    /      >W$`  L      Z|b<V/G_w4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  0      /    UW$`+    .      @  Z|b.t )2 $$ >54.#"4>32#"&h..--t*Ƅ2..2/.y )62 $$ >54.#"4>32#"&$2#".46h..--1.-.y*Ƅ2..2//2..2/.t 2 $$2>4.#"h-..-t*f/2..2/.j '2 $$2>4.#"$32>4."h-..-q.-.1-j*f/2..2/y2..2/R7!!R-ӖR7!!%!!RMzM; 67'&/#'3#67$#%ׯP==Ͱ̼bN+#!f"K++!|o554.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7' :!9!"9 :! F GF;kY_1278e56d:81)RLk<GG E~^ : : ; ;NG 5 e4G( Li) enf77fne )i (G4e5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$%88EFu/- 6uNDL22LENu/80uFD8jU45B%y\A@Yy$F 0=/0 ,-X70 ;~*2 %% 2*~697X-,oo  +F9d1 ) ( 1d9C1*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32D$ "@F,NNNvF8p^Lb2  N**+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... w3% % 32+#".7!"&'&'#&=4;73737D*$#GFHH%#Ι+(&aa'm99m9 3.055_4i4_550.3k  #tttk"632&'.'#####֊v)%8 _^>:k{ZG_?g@`H,>|:=+,j,,<6O/233<bbJ 132>4.#"367#&7&$735&'.4>2,P*+P,.N+)PƗd"/%(MM~95DLMNMD2)WN,,NWP**g!ʇw֜s~  &JJ&?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:'NmNNm U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T '\nMMnM* ? !&+05:?DP3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761a$O` "NiB*4l,4"U47),3($aM#"aT*BF 4,=44#Y3,)0BB0/CBO"!-$F$FJF1.#- -#-2MJF$G# 8<g7*!2U6J%n=_CBnT> rYw0d "*7]6U$u=n;wBLz >\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$;QW$.AP-{ "R &.FR2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&h@9h),)RP|  |PR-*g:>/**Y&()((')&&)')(()% @9f+.TR"`33`\_ .np, 00441/ ,pn, ]]&&()&&EEEJ032WyQT.,d9@.**..1230IDE%&**%&F+.SEFE.IMMI."#FES. !  ";-0.--.0IM+.REF$$1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>GIIG"" 7447#.$$FER/+L"  !75/57%"IJJI* )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>"0'-, )*#'05%"*%%, ),,"GNYI'+""$(JYNO21, 9,4=SM:7,: -12-[[Z[]WXIOMKLMN2 Y{\ bCWDJgABcp7L^BML0b \u]! @R%KlhhO+ww+O hhlK$PZX'@D 0:)ww*;0 EA&XZw[[[[GJMMJ"( %3!'#!52#"62#".54>o:5(67%'$(n H0L*I"33'554#$/* PR 6h"&>I > >A>!!ua!&5476'#5!+{h_a66mHHm.rZy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M98G ):               r         0   L:5U        .\ r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&#  #  @!R763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ E79E"  21 +96  >B+  # zOo              49D   /    "    :           =JZx-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=?^'_)\?=a! !# "!.8?""  "  "  "   f  2 .?E S@6f G=. 2  ŕ6@  B   )_>9 9>_)  % I        ? *        ;d.      ?P   !-  @( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  Z0-  Yi D   cp-)L &gK1 [N3$ n/ "!0{I"H#fmt2>,7HBI.;/8[, Q[z)  .)S9L *E   '+(4%(4  *X >  7A) 0'-570+I;-% *#%(0  ]'5.  U-9Lp{7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547& t!M#l5G;@\ 2BX-0%-m * '?,N ?'!&R;-> <\-R5-6E!"$b$6$!q",; t@P"#C  *FS "DX@! %z$(`]jMP   &O/+@ p_u<  3  DMKZRdYL6D_YBI5.!!''kGWz")3SZ67654/##3276?7%754'654'36767632#"'&54767632'0,,; (| w| ki5.U,\\    %g .  ;,-0j{w {w3V. T, \[^     -5& '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'$$CCC||]V|V#u    9Z(f(Y7%$66%"'&'&'&47676762%'b&I    )^tN/  /dIW?    @ViDV /  V%&%$64'%%&'&'&"27676@))< "  " ]NO]    9|23277632#"'&'&5476"# 6v>? (-=%P8j?  #j<  y"$"JrB23277632#"'&'&5476"" YTo k%,02?=V8jiA{C {u+'qP?  ' 7 sssssstsXrsrtsssr@Q  ' 7 5NB2632#"'&'#"'&547677&'&54763267632676   Bt  ah>) c!  ,Hs *ܡ   },"2A "  {3+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  ΂    NjM  rkW* & \ *3 #ﳎ*3 Tv! ( 5+" , @V #!!!!!%!!!!!!!!#!5!3 ;E;JEJJJ<;E;EJK!IKV{ !!!!!!||uv9f35#7!!#!5!3*+մܳ*ִ0r!!%!!!!!!/0``1/`1) !!#!5!3^^^~S3!!'#'!!#!!3!5LDʃDMA #5!#3!3'3#!#35!3###5353;9nj#5AI##0vQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>SS>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% >#"? ?"#>    G   >#"? ?"#>  G     F  >##> >##>   F    ?#"> >"#?4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h             -  (                  '    *             .         +j276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%t?247676763"'&'&'&5!276767653"4'&'&'&LEA86:4DDMMDD4:68AEtjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(8 %%! !)ttJHcdecH]F]~]^C5 )!%%!2#"'&'&'&54767676hzt@z@Az@t{ne_RP)((&SNcdome_RP)((&SMdd0x}*(QObbrle]TP)**(QObbooe]TN+*(.'"276767654'&'&'! !_)(""""()_)(""""(Y$(*/.*(#  #(*./*($]^#< '1%%2"'&'&'&5476767! !#xxa)(#""#()a)(#""#(YDgghgD^I^W $(*0.+($  $(+.0*($ YZ(8 3'7'3!%%!! !hE۱CCDe g  g f ҁссi:]^= 3'7'3!%%!7!7'7!hTDEDDTNPPIQ2P11P2#mm(? -5%7'%!! !] P  gfeer­696ƌ]^^. /'%!!%!77!yrryyqm"_^^l%%tu%ߴ߳!63% %#'-7:|:||9|kֵֵkֶWz`37'%7% %#'ZZZZZ]^Z^ZZ˛ʜm˜˜mʜ0o #'!5!73!P6M6P$6PMP66R#6QLR6$Q6L$z     - h<_K <; L_zK <; J`;<_  '!'/7'?!7% % -[9^[[ZG^ZZz'}*}zy}*}'q^\\ZG^ZZ:\O}zy}*}'yz(}2 % %  h_y(_^(zFGs% % -hVHzVUzHrVU{HUVH% % -hhhႁhhhႂhhh$h7% %' 7-'hX5 5XV6 6g5VW6 6WV5 0t/37%!!%'#''7'%!5!%7'77;[TA:#T8#AT[TA#9T#8AT T8#AT[U@#7S#9@U[TA8#154'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X  ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W     > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW,f ',;[;;+*Q--}KOW*AA*WSGu5-U&+;;[;,)  '+;[<>**Q--}KNW+@@-USFu5-S(+;>Y;+* !67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+:6-21 4 $:<;$ 4 22-6 O;(A7##7A(; !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& n%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 !_  , 9 R%5s  _!#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#L% %L %#M L:2(&6  _ M#%   6&(2: -[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762    (  b  (       #!"G"!# * " ' ## G!""  '  Y m    ( y   ( O k  w  m Q (  O (     ? ?   + / L* / *   +. M+ .*   !!!! '? ?' "#& #'"!!  '? ?'  !"!  $&  m P    O        m     y    O k         b       %j<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuz"z!uv!z"z#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,zvvz"z vv!z29"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CC,4F:6(A6.Y# K9I R*"(-62 #9~3 #9; 01+56 00,5`%;G,A $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#~&41%%14>3t-3>41%%14>3f^CC^B%@#@@%@#-4>41%%14>4-3>41%%14>3+  V  ++  V  !r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeBABA#U##U##U##U#V%**%V&**KV&**&V%**~ffeAA$AAV%**%V&**V&**&V%**#U##U##U##U#  &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3?_?6 6  6] 6'?&M&C_CC_?&M&< 'L&&L'!6 6^6!6 >_CC_D<>"l267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;'&1'h 9##8)'1!, ;#A#; '&1')8##9 h'12;# 4%.&! 6 = 6%".% 3 3 G%.56 = 6 %".G 4 $8 ! 54."#"54$32632#"_ ɀ~~a>E  %!#!3!p EE?p9E=V %!%!35!cE:d FF8 %!!![:F:\;[0q %!!7!N]<N;)G+t  ,o9; #q !rQk!k`!733}b>v!#7#)iC~'  #'  #g]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#     42;%-n`Ԯrr#26A@:V7:$)&7.Yq   % $.277g[(dVDQ49%*,04?()-#52&'&547676762"'&'&'&5476767hc"$njln(Lfe*+$$$$+*e*+$%%$+! #'(*dRjjSc*('!"%*,20,+%""%+,02,*%"%C&'&547676762476767622"'&'&'&5476767hcn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,Dj*('(&,,&('(*kC"&*,11,*%##%*,11,*&".i%%&%&54767676247676762hhÔ*(42u24)(()42u24(*i\=97,*+*96@@69*+*,79=Zr_'#"'&'&'&547676763"'&'&'&5476767632_dA=;0-/.=:DD:=./-0;=Abx1.=8DC9() 1F="%".4"tNa5&$4! /.r<@6B2L_0>Q#kI|"rz7&)?),%=^K=.C26F@13.!9+cM313N676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26`', =NR6#!vWR>4 2:O t51"".1&X.RO A5ȏ )T/186,FAS :#(=:tA0 9SD 'A#5}11BO9 "'&'&'&547676763"3ᗊpm8884qlYTN! !C@RP]e:6pltm9:'62~~jf77"05276767654'.'4]PR@C! !NTYlq4888mpe'67fj~~27&:9mtlo7:fkR !&547jljjlyyxzQqpnc$0!!676n wu;;vi43f$lcC}U# 3tD}U 3 DutV.! !JV. ! JA! !m^\GHB ! ^^HHv!'7DWWWW|'7'7WWbW>W^$#"&=4&+5326=46;#"3xMe,,fLx1d=AOOA=dƂ׈ihDŽOߍOi(326=467&'&=4&+532;#"+5nCFVU$#Cn5BB*)p//oTBB¥P⎁AAPDBۇ45iDCS/~ #!5!3}t]} 7%d^=]d>S~5 /%0~##t] '-f\=]d]>-!'7!. (``I)=2"&'&'&5476?!".'&47>3!'&'&54767>2 '!  `!!  !' ,&   &   S~&!5! F78-x!5!5 V(Mr6u #3#3#3!!5 鴴ZZ---I(,,,,S~  55!#3#3#3F9UU**b]^bUUUS~!!5 F7.`tq!%  qR{V$%! S%@{V t%226=3!5 5!"'&'&'&6  $hI$  h$   6<47676763!5 5!"6  $hI$  $   $O!! e 6n55!lMlTwccwekl!5!!53 ' !_[y"kd""e/l5!!53 ' !_["/d""5 !73#57!%!6UcGjbzbdǩ""ap 5!'53#'!!!7%acߎA[؁(ZqZ{{{ĒҒ}TM %'!'!53 !;qKRnKa26wwIw22wT}> 3#5!7!!! ZQtZQ0L>ssjLK2Nu '!53#'5!'7! !pSn%R&%Ua2wKJ,Lw22w)1 '7!573#5!7! !r&j&St&SpWl6qM,LLyy77y@!6767632#"'&'&'!  6IYZgb^UMI%&&"LF\Zfc^UM3!t:6I&&&#LHZZhc\UMH'&&#L2<tt XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*rr+rr+rV{{*q+*r*+r++r+9Ɔ\]t] 7&#"7'7 #%5#t69.wZY96t".*X/S~k 55!5!!7'!nnUVGG8:ȏu\j '327'' #395t".Y/Y"u69.xXXN2%&#"6767&'&"67632&'&547676767}:"  s %*&*(&"!#!"O>>;*E/4767!"!47676763"'&'&'&5!3!&'&5v  5 $ %% $  H vgMME %!#"!% EMu\2&'&'&'&54767#"'&'276?&'&'32\":  #'$'$#Y@I:86s6::I  #&'#'" X  :5*+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$[ /  H =a=   / ZI=X  q> d(*c     XJn.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)F-Y)) .EOO/3S>>S&/ #$))%#]]#%))$#&e"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 I ]]I    Q      Q  %eg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 GKa u~iKG E     2 +#76767&'&/3#6767!5!!5!&'&'g?j7R=y66y=R6k?VO S+ +Sd _8=eyu'&utj#'!767#"&5476?67654747! [`bede""^XD#. D#F8LAB\VC)*= %(+C" bo#2#"67.5463%""326&rv.6 VHrPixxijxx|=k)m9%QJ JG@& t ZYX  X<2<<991/<2<2990!!!!!!#53546;#"%%\۽PDB/-cNʜ0 J?@" t ZYX X<2991/<229903#!#535463!!#"۽B/cNʜ30L' EL'  hX'  Z'  [L' aEL' D lX' @ Zl' 8 [0' SE`' . d]X'  Z`' D [' E'  ' 2 Z4' S [' GE&  5z<' ;[ Z_' @~ ['$E&  mD' Z?' [|!' 03N&  4q&  j&  V|1' 8P3N &  ,(q&  &  B"X ' 375353;#"'&'&5327'&54767&5$02a@M(1l\>mF|iɖ{1'OZ$^>B/7*_lH>^OpbĘDh '@5~\c&  d&   8X ' 373#%3#;#"'&'&5327'&54767&5$02a@M(1l\>mF|iɖ{1'OZ$>>B/7*_lH>^OpbĘDh '@5\c&  ld&  @X ' 38<5353&'&5327'&54767&5$';#"'&'!53JE>>mF|iɖ{1'OZ& 2a@M(1N.1]_lH>^OpbĘDh '@5>B/7 n\c&  d&  @X ' &39=5335353&'&5327'&54767&5$';'!53MZ >mF|iɖ{1'OZ& 2a@M(.#._lH>^OpbĘDh '@5>B/?\c&  d&  T' ` '  &U` &  ]l5nl1%!"'$47!32767654/&'&54767;#"' `pl,&y1[xH](45[ "G(79 -RTHLF0 b,@^n@",DX6,vB"C@,\ 04G?!+  c' 5n & M T+& N & O 8 &%#"'$47!3276765'!;#"E EzjF/?I,6gb`-d t8@9<"0@%3!"'&547!763&'&54767&'5%376'&'&'%67654'&#"kB)!F'-p 77/&9 A53 <$4#50!&'&54767&'53376'&'&'%67654'&#"&<*%D(E+k/61"  3]Q=ERH' >B*)!F'-p 77/&9 A5X %!#53276=!Hw,1VV,1j%#!53276=!3!!"^@,1"1,HH,1jj1,u+ rX' 3 Z' ? [0&k ;#"'&=!1,cK\W#u71,\W+00&*&0 &  & ;! !& -' & } Q' Q& } 'L ' `f &  b&& }V' ;w&  & Z p& [ p !;! '&1,PWxj0,\e' E&  X'  Zp' p [%i' V&  k' CEk&  Ls3& Z 4R3& [ >R' >E&  0q' 2R Zk' 7, [X ' X &  (\c&   d&   X X /65&%&676%675#"'&5767;5#"'&54)BZO'1̻i|I');l1(`an 5@' hDޘbpO^D`c}n}s-\c&'&'&5672+5327676G+9RHK07hdw}[;  #4f5uTD4FD7< 33M! '_%5,iGec50$ $*   CARX,$ QB  8-Sm\daّ֔w<$6!`]]T'3WEfnf' -%&'+53276=3676+"7327654'&#"V<%&:WE*((0HNRXLگ]>4FD7$(/`rNN`Jfnf`-,$ QB 9"327654'&#"'&'+53276=3676;#"/EC8\?hڢ8Q%VE*(FOQX $3H3 &_QB*,$ b$/drNN`Jfnf' 5-' O&  &  &    %%327654'&#"%;#"/#!#53!632M,>5M5M5M&'&54762!35#"'&'67654'&'&#"%675# '&54 "' -7aS;BQj2FeY^o:6'LzU/ 2 #Ժ6B3F0@&93,,4;9*7JEZ&n]bvyCMl]727&'&576%32?!#5=AQn qJX83N\YS JelLC-EKS5!Z{,!-3!"'#!5367&'&54767632%654'&#"Whhڋ]VE$*Ujfiga $SQ$(/HᄄCVZ'-H.6%--+-2G3!^?N  H ' 6S &  &  w&  | ' *3N&  qs&  w&  (' k&  q_' ~ ' F !D#"'5327654'&'&5476;#"''&547!327676P E*jXcB8D-E0 /Y#:^S1, ;rWML^FDRP4rx# q1) ""8Ef.&kA0,TT(57LK5>(N365,K+)5!27654'&54767Z)6r u^Jf>^\$$(B;G&m16%*%Xy}qe$%)5!27654'&54767;#"'0V>)6r u^J',8.RP"\$$(B;G&m16%*$YY#;#"''&'&7!3276765@390gL(5n$.0`UZkFOkK',7bCsL\ssj1+-3dij )5!2765!VP,0e\,1jl%#!532765!;!"^@,1"1,HH,2ilj1,<$5;#"''&!4763&547632276'&'&'&#"D5("V  ntY2xAw~M`bp1& 04!+ 3DP&4OKf7*g?'J 7&':'*%276'&'&'&#+53767632#"31?1& 04"J@ZZ-aA`b|a7&'9`@(H.8XD/%276'&'&'&##"'+532767632;#"1?1& 04ui"IAkZZ+SA`b ,Dd7&'9Pl}P@(JG7' 8& U O-3' R Z3' R [%V| %&'&'2&'!;#"'0'#"'$5476 f=ef^E=S*%"*% '   P8C!N'-_ ;49rFq#+CIQ=ERHf\DM`L(22(L`MD\Y>GE:8E&uHg>MOufU`p\`wxxw`\p`UfuOM>gHL   )"34'&!5 767"'&'&54763236Lu+8$4'&'&5476762;#"'&#"'&&7!2767#/1/N,`V@I #,+3 *L>Koz$m<49f,; 2$0bjCA2:Zᬪ *Ll,&  #,lpS& lU& lS#"'5327!65!S;QjK`UrH{/!B_M PSgl%"'5327!65!;#"hjK`UrH{/!a=Mi PSg..j (  !46?>54&#">32!5h: &DX^Deb`T\\-?ZP> j: =TBV\L98FGDC+P=YNc{;f@10!#!f-1@ 1<20KTX@878Y3#%3#u810K TX@878Y@ //]!# !@   " "999991<<99990K TX"""@878YK TX"""@878Y@]             ! !.]'&'&#"#5463232653#"&j6-(mX$K&<'$'kX%G"<2j'<9j810K TX@878Y@ //]#7b@ 91<90K TK T[X@878YK TX@878Y@/// ]!#'#5߲Ʋh@ 91290K TK T[X@878YK TX@878Y@//// ]373ݲDz/wqB@ 9910KTKT[KT[X@878Y78]'T%#%vwck 3>323.#"bLM`c<=<=ck @  ]]120332673#"&bLM`k<=<=uk10!!kcbk/@ @O?/]1_j2^k$l"$:?02\[3#*2-~^xf $!$#1/GB  iuw^h68@6`azRK@mzdQLF6f_fj.<UjVo+\7/2C!Fx)Ab"$ +*"N? 5353!532^5353^? 5335353!53}^ I-  5dl %4'&"27>"'&47623J22J?@?@@?@$2%&2@@@@@??lXd@@%d p & &91/2990KSXY!!+53265!l\\y'dR; gnln@4b_<VVmjmmh!%5yBj-q{s}fosXXX!}umuVw\\Zj9so/9^Z\bZRbZ#oP7;Xw-wX--XFo9///!!!!!!w\\\\\wjjjj^^^^^^\\\\bbbbbbB;;!^!^!^ZZ\\\\\ubububub muZZZZ%wwwj\b\b\bD##ZoZoZojjjjjj;sss +-}a\}l[& ZPR\ b:ooZZus ns nI!^\bjjjjj\!^!^ubu\b\b nubw!^!^o\\o\b\b=#jjZojs!^\\b\b\b\b;1%o 9nxxMFX\f0l|bbjjXkrPPP@DxbKQMhA[[[:XUTP:D.vnd7wl=x]hF3BQJ4.98QIIUUHH - -L )'JH --L) NNoSV;`S/-to - -X-Jas-yU!}!s\u!Vw\bZ\PZ6L68baP/bbLAHE@LbL@oh"$":3\b`Z cr-3\VV.muw!}( }wwuV\Z#PeNN(|S^Aw?\EVb;O7aN:(8`\\#;/\ }u%Z997e ue!^!^\\\\\ } nww\b\b\b;;;e(YLXXX<< HH<L000*0;8l}>fBZZyXXXXXXX Ll}>>LZZy>lyKFf{5SK||TTHHfd=O=X4QQj  h2hbdPabbabbdabaabdb9b^aaabcbaamMcO~5fiba)(+",DD*:PN D002())000$$.'&M"O""09M&UMb:iZ0OJ%$Jt2M'?'',,x 0"O9G.)"!^}}}ZZZZZ\\\ub CuuuZZZZVRVRVRwwww####ZoZoZoZojjj9P7;ss!^!^\\\bj;;;66666666q5T"h6,((  r@UUbbbbbb\&LLLLLLLL{n@@@@@@@@p*?}66bbLL@@66666666q5T",((@@@@@@@@p*?}6666666!!!  y   ) LLLLLL-@@@@@8UBZ--j9Z/&&&% I9% )"<.;Zu!///#/#/BBBBB;IBBBBBBBBBBBB9?222B77BBBBB BB B BBBBBBBB}}BBBBBBBBAB',B BBBBBBBB?ddcddcBXqy1 XXBJ/XXXXXXXXXXXXXXXWXXXXXXQQXXXXXXXXVVNXXXXXXXXXWXXXXXXXXXXXXVVXXXXVVXXXXXXXXXXXXXX2222XXXXXXXXXXXXXXXXX9?rn//  XG#X  C@_24!!-XX!XX@64HFFFniEiiDDu777777aa"5"Y::;+6.ocN8/&/// "N`ya7g!!!!GCL54=/U28Y^CVpj6gv2 1.rjD7`./<KD$>K--9.7.P<<<<<<....RRs'J*R*"..:=4%=?D-W&W;%J@3@V90~0G+%(C(#(=(.6W0$2$017+!$%2 02)!"$E=80+Qg.rA1fnCDStSt-IS-6SS`{{66O6ee5a}T2)XtSuN*u5&%2SuQQuBBwAb EEEEEEOOXXXX`` n n000*0;LEVEEXXXXXX``<< HSHSO<VLvlllll.- /oZ-P-EOlDDDDxXH0d  \  ` $p||,D d` x h !!P!!""H#@#$`$%& &'`'(@()**++,<,-.@./H0@112823(34t4t456778$9X9:;<<<P>?D@@@@AHAxAABlBBCC<D0DTDxDDE FG4GLGdG|GGGGHH8HHI IDIpIIJ4K8K\KKKKLhMXMpMMMMMOdO|OOOOPPP0PHQ`QxQQQQRRpSxSSSSTTTUU4ULUdU|UUUUUV V$V<VTVlVVWhWWWWWXXX0XHXlXXXXXXYY8Y\YZ(ZZ[[@[X[p[[[[\\]]]]]^h^^^^^__,_P_`\`t`````aab0bdbbbbbcdddddee,eDe\eteeeeefff@ftfgpggghh0hHhlhhhhhii(iLitiiijjj0jHjkkkl@llmxmnXnhno4op(pq,qr0rs spst@ttu8uuv,vxvw8wPwhwx4xyyyztz{{p{|$|d|||}}`}~~L~pP((@Xp @Xx0Ph(@Xp,D\t4Ld| $<Tl,D\tT 8Pp(@XT,XP X4\ TX@@d\TX4l0<XT$<4L(Hx,8XT|4xT@HX|d@x4p(„ P`ÈäøĸHXƔ Ǭ@`ȈȰ(8HtɄdtH`˔0DX|̜̼0Txͤ$XΘ0ϔϤ<|и<4`pҀҐҬ0T|pԈԘԬ,TdtՌդմ,D\l|֌ָXhxפ״ ,hx؈,٘H`xڐڨx0@݈ 0xވL\ߴ|$p0H`x04LHT lp`ppPPh8PHX 0@,<L\Hhd0DL@PXp`pLP  D \ t        D    $ < p   0 d  |H 8l \`p,h 8Ph$DTd| $<Tl ,0,D\t(|  !!!""#4#L#x#$($D$$%\%%%&&0&L&|&'\'(H(()0))*$*H*|*+x+++,,4,L,d,|,,,,,- -$-<-T-l-.8.P..//t0L0d0t0000001`12H2X2h2x23T34045T56667t78889P9:`:;<;<4<=,=>??@0@L@@@A@AAB\BC CpCCD@DEE0EtEFhFGHdI IJ\JKdL LMMN0NOlOPTQQRShSTU<UV@WWXTXYZ[[|\ \]4]^,^_ _P_`X`a(aab4bxbc8clcddTddee@epeeff@fpffg,gggh(hiitj,jjk,kl(lm0mhmnn`noo<opopp@ppqq(q<qPqdqqr4rrs0st4ttu(uuv(v\vvw8wlwwxtxyPyyzXz{{|4|} }|}}~ ~~<Tl8Ph(@Xp 8Ph(@Xp0H`x 8Ph(@Xp8Ph(@Xp0H`x 8Ph0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph 0HXp(@Xp0H`x 8Ph(@Xp0H`x 8Phx0H`x,D\t (D\t,D\l4L\t8`@|`P8T$dL`H4\ @t(<Pdx,@Txtt$Dd$<lL$T<\T,Œ,dÜ D|ń(hnjǴ,TxȜDɘ(pʸ4˘ p̰0p(hΨ$dϤ<Ќ$pѴ8tҴ,hd Ռ dִl PبHٴl$hܘ44d`<<PdtL0T|( Pp PHll $p,\p<DP |\ 0t(l4,dTP0X@,`( `     X  8t<PlhXt$L @hTd@$Hl$|t! !!!""t""#h#$$@$t$% %\%&8&&''p'((T(((()))4)L)d)|))))*l+,++,<,T,d,t,,,,,,-D-.p/X01,12t23 3\3x3344@4d44445 5D5556(6667 7L777778808L8h8888899,9H9\:;;;;;<<<00?d?@tBB0B\BxBBBC C<CXCCCCDD,DXDtDDDEE(EDEpEEEEFFLFGGpGHIJ4JlJKKlKL(LxLLM,MMNDNtNNNO<OOOOOP|PPPQ$Q`QQRRdRRS S`STHTU8U`UUUUV$V@VhWXWXx\_D_x_`$`a abccehthi$iikHlm(m\n(noppqrhs,vwx0y|}(}~ ~ 8H`HD04D@XH00T,0L\D\,@$LŒ¨0p  D˰Dt0ԐL۬Pހ$|D<xL4p8 Dl <08 plTP8Hx$Hl !H""#$8%%%&0&p&&&''8'`''(((() )8)h* *4*\**+$+T+++,P,|,,-0--..d./ /00t0112T234p567h7778$8D88899D9l999:$:T:; ;H;>(>@>X>p>>>>>???0?H?`?x?????@@ @8@P@h@@@@@@AAAABBBBBCCCCDDDDEE,EDETEFFF(F@FXFpFFG GGHHIII(I@IXIhIIIIIIJ J$J4JLJ\JtJJJJJJK K$K<KTKlKKKKKLL,LDL\LtLLLLLMMM4MLMdM|MMMMNhNOTOlOOOOP4PLPdPtPPPQ QRhS S$S<STSlS|TTTUUUUUUVlVW@WXWpWWWXpXY`YxYYYYYZZ Z8ZPZhZZ[\[\@\P\\]@]P]^x__ _8_P_h_x_`aPa`aabbbbccc4cLcdc|ccd<d<d<d<d<d<ddePefg8ghPhhi4i`iijljjjjk4k\ktkkl<lmxn@no$oHooopp  +e@_B] 5m  4     S *b *  &  "I : & hCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBoldBoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldDejaVu Sans Mono BoldVersion 2.25Version 2.25DejaVuSansMono-BoldDejaVuSansMono-BoldDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                    sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BBuni01BCuni01BDuni01BEuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0245uni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02D0uni02D1uni02D2uni02D3uni02D6uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni066Euni066Funi0674uni0679uni067Auni067Buni067Cuni067Duni067Euni067Funi0680uni0681uni0682uni0683uni0684uni0685uni0686uni0687uni0691uni0692uni0698uni06A1uni06A4uni06A9uni06AFuni06B5uni06BAuni06BEuni06C6uni06CCuni06CEuni06D5uni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Euni1E8Funi1E92uni1E93uni1E94uni1E95uni1E96uni1E9Buni1EA0uni1EA1uni1EB0uni1EB1uni1EB8uni1EB9uni1EBCuni1EBDuni1ECAuni1ECBuni1ECCuni1ECDuni1EE4uni1EE5Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015 underscoredbl quotereverseduni201Funi2023uni202Funi2031 exclamdbluni203Duni203Euni2045uni2046uni2047uni2048uni2049uni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A6Eurouni20B1uni20B4uni20B5uni2102uni210Euni2116uni2126uni212Auni212Bonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215F arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FFemptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni2213uni2215 asteriskmathuni2218uni2219 proportional orthogonalangle logicaland logicalor intersectionunionuni222Cuni222Duni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Funi2290uni2291uni2292 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1dotmathuni22C6uni22CDuni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni2341uni2342uni2343uni2344uni2347uni2348uni2349uni234Buni234Cuni234Duni2350uni2352uni2353uni2354uni2357uni2358uni2359uni235Auni235Buni235Cuni235Euni235Funi2360uni2363uni2364uni2365uni2368uni2369uni236Buni236Cuni236Duni236Euni236Funi2370uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27BFuni27E0uni27E8uni27E9uni29EBuni29FAuni29FBuni2A2Funi2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C75uni2C76uni2C77uni2E18uni2E2EuniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFD dlLtcaronDieresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.alt@tGG22dk  Y&Y@&2G@AGA2k2%e}f2 ]%]@%e2d~}d|S{f{2zez2yxfxdwvts s rq.rq.pfp}onmnml]mmli%l]l@kkji%ji@%hfhdgfgdfefedcba}`^d\[\[Z2Y-YXWWV2UTS TS RQRQPQPONMdNMdLKJIJIHGF}EDE}DCA?2>=<=<; <; :9:98 998 8@76776-6545K4343212d1-10/@0D/.-.-,--@@ ,+,,@ +*++@ * **@W)K('K&$&$%$%K$$#""2! 4!>  42@ @@ @WK77222X}X       @   @   @ @  d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++bzflag-2.4.2+ds1/misc/fonts/DejaVuSerif-Bold.ttf000066400000000000000000010431401200563112200212720ustar00rootroot000000000000000FFTML <GDEF`5j9XGPOSu)-GSUB .OS/2b2T4Vcmap|4hcvt 먏CfpgmE$gaspE glyfE 6Ehead=@<6hhea4@t$hmtx=@+kerntɥllocaHh+maxpzv\ name䣗9|!{postS*fprepV:@iVaVa  O P P Q Q R X Y    DFLTcyrl*grekFlatnVMKD SRB R AZE RCRT RGAG RISM RKAZ RKRK RKSM RLSM RNSM RSKS RSSM RTAT RTRK Rkernmarkmkmk  . 6<BHNTZ`flrx~f<<<<fff8< P P    P P   $*06<D< JPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv|     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z  "(.4:@FLRX^djpv| $*aayyaa//%9R%<<}}a}}aaXDXDDDC}DRD}1}s1RDD}GDGDDD}RD RD}BDB|-D^D^}D}^D^^D^RFDFm2m}m}}mDDDDDRJJ=D=DyDa}  /D}BD^DFD}//RDRD?DDXDXpDpCHDHDRDDDD<D<<D<.D.?DRRDRDDRDDRCCR}1}}D}Dj?xD}RDGDGGDGRGDGRDRDRDDDDRDDRD}RD}RD}`D{D00'BDBRxRCRBDBRxRDrP|-RDDDDDDFDFRFDFRFDFRKNNNR}}DDDs1RDtRD RKDDRDRDRDR"D"DDy+(/@ }a XDbDD DD DDDDwDDaDDDDaDD@ D<D@D D  bD    <<cc--6-BB]]22 -  RRa[kDDFDFDDD}}1lDDDF$=D]456789:;<>  ?@BBBHJCLLFPRGUVJXYL`aNijPnnRppSuxTXYZ\]?^AVXZBBDENNQQSTVVXX\\^^aahiknqqstvvxx||~~`t D K  "+ P P3 4? "(.4:@FLRX^djpv| $*06<BHNTZ`flrDDDDDDDDDDDDDDDDDD,mmDmDmDDDDDDDDDDDD8)2kkk &&&&&&22&akY u}}}KkK///&K<kDDkaQeabakDDk2aDD}DDDDD}D&&u}NYNuYYYY&&2}aNNaaNNNNNAkDKKKKY2KKKK<KKKKkK&Y u}<kDDk I d q !! !!!"!'!+!D!K!""" " "" "-"="C"H"U"a"e"""## ###!#%#(#}##$#&&<&G&g&o'''))**/+,l,w... $EPCOXatz~bjr,0>bw{0Ph HPY[]_  * 9 < G _ j t !! !!!"!&!*!A!K!S!""" """#"8"B"H"P"`"d"""##### #%#(#}##$#%&8&?&`&i'''')* */+,g,u...~vn\XUPONML><82 dZUPFE@432,zxvtrqponlkjhgedcb_XWO:532!}|{zxwukgc\RP40qA!r;9! 9)5 }R Y p  ~b|!$BEEPiptuyz?CCOOXXaatuzz~~_.bejkru*W XZ[],.`0<c>[pbewx{{-0KPchLPblnrz EHMPWYY[[]]_}!0>DWZ c  &y * 1 9 : < > G I _ d j q t       !!! ! !!!!!"!"!&!'!*!+!A!D!K!K!S!!" ""~"" " " """" "#"-"8"="B"C"H"H"P"U"`"a"d"e""""""#### ##### #!#%#%#(#(#}#}####$#$#%&&8&<s&?&Gx&`&g&i&o'''''''))) $* * %*/*/ (++ ),g,l D,u,w J.. M.... N O P Q R Y i3 n֨      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ardeixpkvjsgw~ l|cnTm}bvw~z{<: S Ty|p~qz{|z}q{`jyV\byb`{{N\=VTq\f{fb--){bb??)fD)y V%hNf s{juy jdy{Hy`yqq 33Nyj``'''Dbjyyb3'b=D)fRR5fVVVJ!/TfDs, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-ff@ m/10!%!!fsr) 6@r p s  9910@ ````]%4632#"&!#5oNNppNNowwNppNOpph@ s1<20#!#++)T@3        991/<22<2222220!! !3!!!!#!#!5!!5!F+`aaE````HFR`hh$+2h@;+2ww,v %u "p3(  /,  (%!  32<912<229073;.54673#.'#.>54&'xypay| ynPUcUcyehal;#7 +'t;Ǵ, T=FV WJJ`1h '3W@,*(}}} .}"p {4+%1 412<0KSXY""32654&'2#"&546!3#2#"&546"32654&@88@A88A˿NZ;ʿ˾A89@A88e-dR.8@e,-,--,2130 ! 78/!! */,!60$ ($v&6~{-vp&03 !%$') 3/,$.)$)3 99999999991/2999990KSX999Y"0]@0 / 07 8/0178 / 07 8/0178OOf0v/u0]])'# 5467.54$32#.#">7#5!#3%326!d33J|tket =!hbTЊVmo10!!ot#` 8  KQX <<<+*>XHIuwwpq :@*v{  1/2990KSXY"!5!5%!!w;yyX@+   *  u{    9991/990KSX9Y"#>3 !53!57$54&#"xzz?`ÉvdB%%ДJ*U@- vu)&u{p+ # ) #  +999190>3 !"&'332654&+532654&#"#v!vy B4vy##̱((Hx{T=L@%* v v{ <<91/<<290KSXY")53!5!!!3qxCys+G@&uu s p     91990!>3 !"&'332654&#"#BZ@zxLw3d34(*F?B#%6@ uu u{ p& # &190>32! !2#.#"2654&#"A_^XZvyngXXggWWu44qffiѯدد7@*s 91/0KSXY" #!#!XE)j##/C@% 'u!-uu{p0$ *$* 0991990! $5467.54$! 4&#"3264&#"326ȺL\]KK]]K']rs\]rq^̥Υ$Ⱦ'wwuuշo %@@# #u#uu{p&   &190"32654&#"54! !"&'3326gWWggXXxB^$2=!oNNpoOOnib-OpqNNnneSϊXmB@29190 5--@<210!!!!B@<91905510PT "9@r ! { p#! #10%4632#"&>32#>54&#"#VpNOppONp|izwnw yNppNOppY""++o Nj@84O151 t tM18%8DO45M J+J>O229991<9999054&#"326#"&5463253>54&'.#"3267#"$'&5476$32!#|ecyyce|,ZڿZ,ۏnq\^aYkzg9~~GͲ$sLHLLG}'갏`NTFEjśewzDC^TT~~|KJ}~|aboL@Q     * v vs  91/<290KSX22Y"#5333!53!3!z23E{}y\yy1y#;`R$R@( v#vsv ## %(#"%2299991/2290&P&p&]353#5! !32654&+32654&+`uyyƤf}vV?@~ ~ {p % 10@ 0ou{{]! !2#.#"3267;Iz 'Ωܕ+ef@A`8@ vs v % (# "299991/220]%32+53#5! !Uoy,GE+yy`W@.  v vsv )( #"2221/0Po]353#5!#5!!53#5!!53`>yyy!`O@)  vsv )* #("2<21/20]353#5!#5!!53#5!3`3{yy!yV3D@!  v ~~{p(  % 190 P ].#"3267#5!# !2-ҿT;I6Ʊ&&xNLhi@A`3^@-  v sv - -( #(#"2222221/<2<20@ P]353#5!#!#5!#3!53!3`Ryyy yyyydy`` 9@vs v (#(" 221/220@ 0 @ P ` p ]353#5!#3`yyyyjV{@ ~ v s (# *.12990@ ///0@P]KTKT[KT[KT[X@878Y@____Y_p]533265#5!#!"&MLaMS^X+yy"`3@>   *  v sv (#("2<291/<22<290KSX2Y" ]@         , & & * *))'9H E @ E @ C CCHA@@@W S S S SSZy   =  ! &5 6B GQ Vv ]]353#5!##5!# 3!3`y-ٓgyyy!yy3yy`s =@ vs v(  (#"21/20@ 0 0 0 0 ]353#5!#!53`Lyyy-V{@D* vs v(( (# ("22991/<2<290KSXY"]@> (Sp  &&&:VPf`uwvvp]]353#5! !#3!53#3Vhg13yyByyysyZ~@-* v sv (( ( ("21/<2<22990KSXY"]@@Php&77h]]353#5!#5!#!3Z myyyy7ByV /@~ ~{ p% % 10@ o]%2#" ! {TxyS\BKLByjjdd`J@"v vsv  / * # ("2<99991/220Pp]353#5!2#!332654&+`R&ppyyy㭑V E@ ~~{p! % % !99999190@ o""""]$! ;#"&2#"u[xy5y3Lhjdt/92)BKLB`$@H  *v #vs v  # ( $( #"%22999991/<2229990KSX9Y"] ]3!.+3!53#5! %32654&+?Yz-ڙEaV=T \W`yÌMyyy!L)@?#"$!   * !~'~{'p* !1$0*9999190KSX99Y"+]@"( ( ( ( ((( (!("(#: : : : ::: :!:":#X X X X XXX X!X"X#k k k k kkk k!k"k#  !"#  !"#?0+P+++]]7332654&/.54$!2#.#"!"$ؿn۲' ĵhлђHbvrZd+78Ǹ,,gf]a4742o@  s v ( #(1/22990K TKT[KT[X@878Y@@_` ]!53!#!#5!3sgȇdyu-yFN@$   vsp(( ((#.1<299990@ ?]#5!#326#5!#! έ\yyyy&UR@9        *  vs  91/<290KSX22Y" ]@     # # @P ]]###5!# #5R}͍y\yy#y @\          *  v s 91/<<<290KSX22Y" ]@D "CFSV   && '##EFFGH@TX WP]]) !#5!# ! #5!#VĠBH#Ι?\yykyy 3)@f   * v sv  91/<2<290KSX2222Y"]@4*%   &+++))+]]K TK T[K T[KT[X@878Y@8= = ;;44?O]] 3!53 #5!# #5!# 3!53ɸ-!?:yy;yy\yy5yy@A       *  v sv    #999991/2<290KSX22Y"K TK T[KT[KT[KT[X@878Y@P       JJ[[Y Y _nnh o o xxx z  z  ppp  &]]!53#5!# #5!#3`D̦PNbyyy9yyByL y@"  * s    991/0KSXY"K TK T[K T[K T[K T[X@878YO]35!#!!53L{5hA7@vv210!#3!7xxB@ s/910#m@vv210!53#5x2x@ s91290 # #JJ;-/10!5۾f-10K TKT[X@878Y #fxTD(@1&&&p #35# 2)22991/99990@,*:?????9O** +//   !" ]]3!5#"&546;54&#"#5>3 5#"326hFnzjsq_q cjMORdyTP?{Wc""leedl/F!G@$!p> <58"2221/99990?#]7#5!>32#"&'!532654&#"ǘ-pp-_jmYYmj_y#xSQQSyf實TD2@  p3 >210]# !2#.#"3267&4oup~r}zkL& (**هπxTh !L@%   p55 <>2"<<1/99990?###]54&#"3263!5#"32#5!o`inYZmi`b-pp-i尦ySQ,*QSxTDe@"  p>9 ?221990@"`  ]]4&#"!32673# ! 5N^[O%|s+. Xҩwηzt#(?e@&  3 + 5A<<1/222990K TX@878Y0 0 ]#.#"!!3!53#5354632pKEPH :UN NLsyyy5yT9hD,t@., #) #p- 35 <&>2-2219999990@  ( ?.     $ ]]!"&'53326=#"325!4&#"3265jsq-pp-`inYZmi``!!ifySQ,*QSy尦?x@,   JH5 F5CA21/<299990]K TX@878Y/]353#5!>323!534&#"3F@}EUkdy#x}_Tyy5i#yF ;@  K 5 5A21/20@ /`]4632#"&3!53#5!pQOooOQpoTQooQOonuyy5yh9= L@%   3K 5 A19990 / ]4632#"&#5!#"&'53265oRNpoOQp)323!534&#"3!534&#"3!53#5!>32Js=S^h>R_h>nyjayyhyyhyy5y]VcFDy@,  JH5 F5A221/<299990]K TX@878Y/]353#5!>323!534&#"3F@}EUkdy5y_Tyy5i#yTD -@  p>; >210@`]%26&#" ! p[Zqq\\q?>Tq+)/VFD #q@+  "  p$4>32#"&'3!53)_jmYYmj_-pp-bHi實ySQQSHyyTVhD#S@*#  p$45<> 2$2<<1299990o%%]3!53#"325!4&#"3265їc-pp-`inYZmi`!yySQ,*QSy尦;LDU@%   43C 5A21/29990@ /?O_]#.#"3!53#5!>32LqPLtF4|Y3US̵\yy5yok X-D)@C  Q!  Q ! * !''p* ! 33O$O2*9999190KSX99Y"@ ]@+++) ) ) , , )6#E#Y Y Y Y Y YYY Y!Y"Y#j j j j j jjj j!j"j#  !"#  !"#  !"#<]]7332654&/.54632#.#"!"&`qlsIi^Ձq lo@SѠc)w}KF@F%)!mnEB6>%51q^@  p 8<2122990K TK T[X@878YO_]#53!!!32673#"&5˚b',:@> ۜyJyuDVZ/'i@#  pH5F 5 8<1/<299990]K TK T[X@878Y]3!5#"&5#5!3265#5?}BXkc'Ry_T+yky'}@:    LL*     91/<290KSX92Y"(]@ ,+KK[[]!#5!# #5!#ub  {yy`yyR '@[   L  LL L *    91/<<<290KSX22Y" ]@: + 7    &##**(7669 GGCCFJ WW Y ]]#5!## ##5!#Pȋ}tZ}';LyyRfyy'3@e L  LLL*    /91/<2<290KSX2222Y"]@       %+ + + )"""99?9?9 85566LIILDDZ^^ZX Wxx8$*59]]#5!# 3!53 3!53 #5!#ϼ<\ɏJwyyFyyyyyy9'@\ LL*  39991<299990KSX222Y"]@B  %%55<<<<<<FFSSVV]]#"&'5326?#5!##5!#0s1xGqCCAP(1seubMJGc%5yyuyyHF' @$ LL *   33 2991/0KSXY"K TK T[K T[K T[K T[X@878Y@ ' `]]35!#!!53Hb5wwy9+wm*\@/ + #&'  +# *& +<<29999999199999990#"&'.=4&+5326=467>;#"3m2k==k2gpRcaRpy1>$npsyspm%=1x^"^10#y*^@0"+  #)+)" +<2<99999991999999903265467.54&+532;#"+eoSbdSoe2k>>k2^"^x1=%mpsyspn$>1?-@  99199990#"'&'&'&#"5>32326]e_ aM``d_eM?VR:BHIWQ9DH &@r {  991/0#"&54632!53pNOnoNNpu1NnnNOpqJL"S@+ u u p#   ">#<<22199990%%#$%3#.'>7cWVR y.y;vqnd[h ^kӝ%#&%~ zjL@(  vu{v    <2291/22990#.#"!!!53!53#534$!2xcTuf` Axalyy=yL= /u@> )0- *( -!'-0  )'!$* $ ( $ 02299999919999999902654&#"'7.5467'7>327'#"&[\[~|їљ0l=7m9͘ќ.j?:l\\\]~Ϛ.k@?l.͞Ӛ8o6?i/Ӛ'R$@\  *v v vs"v#  #!  %<2<29999991/2<2<2<290KSX22Y"]@HD, ,##3 553;??<LLEGX o o ]]!53!5!5'!5!#5!# #5!#!!!!3Fm=߉$5myZu;uyy'yy#utNuy@ <210##  ?=5C@l)(*'W<=<$%#&W==<  WC6C  W66C*C=<6'  &- 3{D=@#69&  @#-'9C<#Y#WYW0@WV09WV*D99999999991990KSX9999Y"#.#"#"&'5332654&/.5467.54632>54&'whaQ[6ZrrSMSfvhjW]5[ssSOJr,.[n-/]pVVJC/B/Hbsh+/ZZRJE/B/Hcrg,.Y!N-=f:X#O*54&'.#"&54632#.#"3267mmllmmmmllmmyWVVVVVy{WVVVVXOWi iQhwviIbnmmmmnnmmmmnWWV{zVVVUWVz{VXV%'^j\Y=!,k@7"*# #*  {-$''"f'f-229999199990!!3!5#"&546;54&#"#5>325#"326qs3U{^_LX `ITeHS=9?K^\96zr~ZYA>KA>CJ?- -@   h h <2991<299055?+ +-@ 190!#!o10!!ot$<T@S  11*  I#=%I1O #] ^ ^][OZ+[CZ+\7U229999991/2<229990KSX9Y"3#'.+3!53#5!2%32654&+2#"$'&5476$"3267>54&'.'<d32!53!57>54&#"^HPmdHdSI?WrRZ`T{]T_SZ/*N@) )&{+ # )#kk +999190>32#"&'5332654&+532654&#"oX@ifx|PP`VOX]b[)QWNHBP`idH^o]z{POVRPWTD@?FI@Zsf-10K TKT[X@878Y!#\f9V'@1  p 5 H5F5 A 22<1/<2299990!]K TK T[X @ 878Y@!]3!5#"&'3!53#5!3265#57mJ;!nDXjc'Ry}SGyyyny;-@ s  912290!####.54$o+q}Nݸ #    104632#"&pNOppONpNppNNooo@  91/0!#"&/32654&'R>;y0f4-U$6.&7&>.+03 p&A8&;?'.3/6'?;/#2A22999912<<9999990@@:,?-?.?/?0?1PBB+-/.//$%&'789:]]4&#">3 !32673#"&'#"&54$!354&#"#5>325#"326N^[OMo %|r+NY|{grq_qmjOYV^XҩPNNηyuMONN?tWa""MSnqq`pToD&FzTf&HCTf&HvTf&HpTN&Hjf&CFf&v f&pN&jT-j@7" " (p .+% +% +>;%> 2.9999999199990@/`/]! 5432.''%.'7%.#"32654&?*V,A/24d[J//K o^^oo\9m%. ?n4d&>nI7g꾼kFV&Q~Tf&RCTf&RvTf&RpTV&R~TN&Rj{ '@   <<104632#"&4632#"&!!X=>XX>=XX=>XX>=X=XX=>XXZ>XX>=XX!3#'|@>('%" &" "p((&%'?;?2(999999999199999990@)`)] .#"326=!"&''7.5!27ZMn]\Mm\ BCoPTAB?tHVZXYYHv12VKu)21V/f&XC/f&Xv/f&Xp/N&Xj9f&\vT/VF #q@+ " p $4>32#"&'3!53)_jmYYmj_-pp-bHi實xSQQSHyy9N&\jTLP'qD$T&qBDL}'zH$T5&zwDoL'}$ToD'}PDVk&& yuTf&FvVk' yu&Tf'pFV' yu&TN'{FVk&& yuTf&Fq`k&' auT&G XT} )a@1 & ( "$ p#l!5'% <>2*<<91/<299990?+++]54&#"3263!5#"32!5!5#5!3#o`inYZmi`b-pp-Di尦ySQ,*QS'x]xx`P'qD(T'qH`k' /u(T5'zH`' /u(TN'{H`o'}(ToD'}HH`q&( +{Tf&HqV3k' u*T9hf'pJV3k&* juT9h5&JzV3' u*T9hN'{JV3'*T9h'J`3k' u+k' DuK`3#'353#535#5!#!5#5!#3#3!53!3!5!`RRyyyyy\yydyf?%353#535#5!!!>323!534&#"3Fg@}EUkdy3gx߉_Tyy5i#y``o' u,V&~``P'qD,'qB``k' u,/5&z`o`&,}gFo&L}``&, uF' 1@55A 21/20@  / ` ]%3!53#5!?oyyy5y`V;&,-@""1F9Y&LM@6%1jV{k' u-h9f'p?`23' .F2' NF$)53#5!#5!#3!533s}cy2yyyyyzX`sl' 6v/Fl' vO`2s' /F2' O`s' o/F!' kO`'yi/F'yOO@,  v sv  ( ( #"<2299991/290353'%#5!#%!53mFTFfLyuyyNu`@# 5  5 A<2<9991/290@  /Z`]]%3!53'7#5!7Do>ٗ@yyy`ixaiZl' v1F6'vQZ2'\ 1F2D' QZk&1 uFf&Qq^&jQFV(M@#(%#.)221@%&!~vs!~ {&v/290353#5!67632!"&'5332654&#"3FPheSWSLaMczJHyya+*d""^Xnz0yF9 D&353#5!>32#"&'5332654&#"3F@}9 ?/2529912<2<99990@6   ]]%26&#"4&#">3 32673#"&'# !2p[Zqq\\O]ZNKv %zs'фHFԇ?TҩPPL϶ztMOMO.)M`l' vv5;L6'vU`2' 5;2LD' U`k&5 au;Lf&UqLl' vv6X-6'vVLk' u6X-f&pBVoL&6zXo-D&VzBLk&6 uX-f&VqBo'z71oq&zWk&7 u1>&W A!53#53!#!#5!3#3sgȇdyuy1q!#53!!!3#32673#"'&=#53˚b'ٸ,:@> ONNNyJyDVZ@AEDFo' u8/V'~XFP'qD8/'qXFk' u8/5'zXFt&8|Y/&X|Fk' u8/f'XF_&8}/o'&X} r' |: f'p}Zr' |<9f&p^\&< uLl' vv=HF6'v]L' =HF&{L]Lk&= uHFf&]qF?%3!53#5354632#.#"?:UNpKEP$$yyy5yNL:>|)F'7#535#5!!!>32#"&'!5326&#"Ǟg-pp-_jmYYmj_y3gx߉SQQSyfʯ R)2! 2)53"#676327654'&+32654&+^_xx¿EFS_SSQP\_NNxciiyY[fE+>?;;`eO/F+3276'&#"#5!67632#"'&'!53#5)/0jm-,,-mj0/Wy"-LLpヂpLL-ߺSSXXWXSSS)()(Sy#xe$32)53!532767654'&'"+̍ őx]\]Yf"ucyyHLOKF 326&#"5>32#"&'!53)_jmYYmj_)-pp-ߺʯxSQQSywV;@ ~ ~{ p % 10@{uu]6$! !"$'332#"V;2zI'Ωܕ+)__@AoAMM@V@/! '&76!267632#4'&#"#&'&#"32767;z:=TUf?==k@ALZY& (4TSP#$^{sهBAddgh@@xX  ! )53"#6763276'&+?oEFS_mlllyY[fE+GE`e'!#!#3! '&5476767676;+"3%x ̄Y]\]Luyyiiޤcu"uOOLH/F+54'&#"3276#3!5#"'&7632!#!L0/jm,--,mj/0-LLpゃpLL-"yPiSSXW6XXSSwyS() ()S TD'3%#"'&'5332?6'4# '&76 "276& d{xtp -Bkx@!'垟2_p.---..\)^E? $!.0#X Y``_``a`)3!!#3!!#!#3y>`\`yV"'&#"#676! ! 5!3276hjܕ_^+;zT]d]\> SSqpjU熢`V)G@ !%$% *91@!~ ~ ~'{p*90#.#"!3# 32673# $5467.54$!2y 4B魙.˸!Z{x9oѫ#PV "'533276'#5!#5!!53#5!d!a&(3{|VD KK+y!Dn^={1#&'&'&#"!!#"'&'5332765#53547632p &EP$$ qqUQQNp &EP$$qqUQQN  9&:9y5\[  9&9:y[\ Vs467632#4'&#"#&'&#"3267#5!# '&76!2FMUfEP#$^{XY&&xN&&hi  D) #5!# #5!#! '&%$'& 8 72l5iGAD! kk\kkȵu?5727654'&'53# 4'&#"3!53#5!>32 e?>*5gh21\Slmz"#Uk22@}[\Zpp`y,@lccIC#$_R54NO#yy#x}_Tji``#5!#3#"'&'(_%yQ yy<=cN&3#3!53#53#5!#Syy yy`=! 3!3!53#5!#672#4'&ٓgy4LDIq @h4[yyyyy!w P$&F'47632#4'&#"#5!#3!533!53stFB,XA#"qJ9E(@yyyCyyi}%%M ~iFH0%#"&5#5!#3265#5!#3265#5!#3!5#"&Jsy=S^h`>R_hx>njayy\hyy\hyyy]VcJV5332765#5!#5!#!#"&d!a&' mnQ KJ+yyy7hN"FVD 353#5!>323!534'&#"3F@}[\"#Uk22y5y_Tjj+yy߇54NO#yV  ! %276!!'&#"{TxyS]R  S] Q]]Qddy U&2XUc&RVU : , !26763 3!534&#"%2#"zTxVRTS MaL&S^!yy͕, dyBKLBUV\D(4'&#" !2676323!526&"UI:?D?D54'&#"#67632327673%|c񁀠ёS@78lDE qjk^xxJJi%$:9lKKqUV5%>6B"#77m !TULM)%##@F%&>?wS|7(332673#"'&7#"'&54%6676776'&'&72/$`6+IEKpNU}%&?0\qJ W0YQ?7tG9LN[f %T7E,O|.X19q$#53!!!3!#"&'533276="#"&5˚b',:XNNNySTP$#/*yuDVZ@AEDV%!#!#5!327673# '&9gȇd&'aL&'WSz{)#uJK,,^""ppL&83qc&X\(!#! 76'&'5!#5! '&476>ݜdddcQQވzzzz8}5 ٚ) }\<ܡ%2'5!#"'&5#5!#QF=632#.#"3!53#5!#H1&DIq;BJxD̦P\{ PG/gyyyy9E# #"&'5326?#5!#62#.#&V)0s1xGqCCAP(1se=Iq;BQlubMJGc%5yyuPGL35#5!!#!3!!53L|kr5h HF'#!53!5#53!#!w 5wXyyfyZ+wG!"&'332654&+5!#!ovy B RGTy((H~hG 5!#5!#"32673# $54763ӉR B yvoGఢ((yTG`'05!#5!#"32673# $54763w5 B yvowնᰢ((yT '#6763 3!!53!5767!5!654'&#"xzxwz?uJe`ÉiD3 GHvGGdB%tu}g9CJq[kZ[GH`!"&'332654&#!#5!#5!vy }3H((HnyE`' !"&'332654&#!#5!#5!Evy Py"q54y((HCyߨ5.q#!3#!"&/3327676'&+5#53bYbH>qZf.ItqyMU "R"#/0+y#+.&!5!3!!!!#!5!jXXXXS Ѣ %#5#%` }k'?'` 6f'@'T f'@G`V '-/`9'M/F9G'M OZV '-P1Z9 'MP1F9'MQLk&$ uTf&DqZ``k&, u f&qVk&2 ~uTf&RqFk&8 u/f&XqF'~/P'qDF' /'~F' /'~F' /'~TDL'TP'qXDL''u$TO'YC'YDP'qDTn'qV&.#"32675!5!5#5!3## !2-ҿT;qǨI6Ʊ&&xxxNLhi@AT9hD3#53&'&#"3276%!"&'53326=#"325!#3o.0inYZmi0/cjsq-pp-yPS6SR3!!ifySQ,*QSyyV3k' u*T9hf'J`3k' u.k' HuNV_'}2T_D'}RV_P'q{DT_'qGk' uyG`f'GAh9f&q` }'='` 6']'T ']GV3l' v*T9hf'J` *326#5!! '&5!3!53#5!#!#5!#s2ZI˃nRq>o>x5{kyyyy yyZk' u1Ff'QLl .!3264&#"!3!53!3!53&'&54767N57MN65)$SΎE{}Dz TCY#;nlMMlMS#TuJ;yy1yyf3 5#"326!"&47673264&#"hFnzjsq_q cjMORdX)$SSDZWM67LM67LyTP?{Wc""ldlw#T짧TC 7LMlMMl' vTnf'Dl' vv3#f'Lp' @z$Tf'YDL'u$T5'YD`p' pz(Tf'H`'0u(T5'H`p' $z,i&~``'u,'#&~Vp' z2Tf'RV'~u2T5'R`p' z5;Lf'U`'bu5;L5'UFp' z8/f'XF'u8/5'X)L&6X)-D&V)'71)q'W`3k' u+k' JuKFV353#5!676323!534&#"3FQgfczJHyya+* yyz0yT0#.:%#"32#5!72'&7#454"%54&#"326%)Mpp-Y.@f n(`inYZmi`* ),*QSxu S,OND|.Xi6L35!#!)'6767L{5^no*+hAmZbdmHF'35!#!)'6767Hb5wFnh1+y9+wmTh[vL' u$TN'YD`o'$(ToD'HV'~TP'qDV'~TP'qDV' {u2TN'{RV'~'~u2TP'qDP'q&D<9&q^\Fr!%754'632'#767&1&#5!]Zj ޙk}^rJI UeOxF=D5%754'632'#767&1&54&#"3!53#5!>32J]Zj EUkd@}ޙk}^rJI UeOi#yy5y_T1`q'%754%#53!!!632'#767&1&m]Z4b' ޙk}yJyZZrJI UeOh9='#5!#"&'53265ۗ32#"&'!54&#"326_jmYYmj_-pp--pp-`inYZmi`ߺʯ1SQ,*QSxSQQSyi6RVD".:>32#"&'353#"32=!4&#"3265%326&#"-pp-n-pp-b`inYZmi`b_jmYYmj_SQQSHxySQ+ ,QSy!6iiʯR!!'75373 3!53!3! ;'7#>Z `, Z `E{ϨyR:3 NZ `+1~Z yy1y3+ŏf! *'7&!27#&'32673! '&'&#"RZzjtZ(jܕ+;gNZ'f )ZJ<T<]m (# ''7&5!27#&'3267&#"&Tf4oqKMVp=k@>o}LyVŠ(V5*P1hxI>&s353#53#5!#3#!53`Ly yy3!)53'!#!7#53!ZudvLZTgƁyTZuuLZTg(XC-DH#"'&/&'&'&'327654'&/&'&547632#&!"326?n#F_e%R !q/8?%NIJeq ?5QRt,')(B Cqn&;>^ ), qQ%%*LLD@{I"%5MOR6 nb$$JMH9'!#5!#!6326?#"'&/&b5w<6&*(B CqGx_d&Oy9+wa%$JM;>^,`"#5>3!2+3!53!2654&#mgq>E&'Ͽ\!R" ryyk`.D2654&#"#5>;23!53mgq>E&UvS"R" rwEvyyLTD'#5!>32+32673# $3264&#"Fnzjsq_qbcjMORdyTP?{Wc"""ldlThD !54&#"326!#3!5#"325o`inYZmi`-pp-i6yySQ,*QSThD !326&#"!53#5!>32#"&'M`inYZmi`-pp-Hiʰy6ySQQS/F -326&#"354632#.#"67632#"&'!5)_jmYYmj_PG^{Q)(QSyTD.@ >3 1@   p0>3 !"&'332654&#"T&8oup~r}zk۶**'πxLz8.%54'67 !"'#767&'&576!2#&'&#"\O A  XXY_>>sLNޗutHG UeO 0@@sx^T9C .54&#"326#"32#5!#32673#"&5o`inYZmi`-KMpp-:IB;qI<i6Q(),*QSx}{^GPTE#/%3!5#"325354632#.#"#54&#"326ї-pp-s+ͯ/1;cvM/_t]Q 3M&^ŧJTSR%_7[ztv+^*, 0]Qxft؛VgcoE1L@+#3%>>+22<<91@/'#%' 'p29/90476%6#&'&'";#"7673#"'&'4767.m}p JG]{A<9EB=ZD>MT(oXg:sEP3E)'1-?E.8F5XO6CQ&<9=KDQT`71#"%53767676'&+5327654'&##56(gXo(TM>DZ=BE9DZ=BE9x@>L_34 %{ fGHGGg/P4"h9'#5!3##"&'53265#53ۗ:L5byyyyT+&643232#54#"!"&54767&'&#"#327654'&'T&Z8it=Gj6~F2]r!e> "+BPZv`IrEe:PdnB'#Kk#)%6'0 ;F/V'3!#"&5#5!#3265#5@}{EUkd'x@_T+yyˇiyF+353354632#.#"676323!534&#"3FR_hx>nja+yy hyy hyyy]Vc/V1'0%#"&5#5!#3265#5!#3265#5!#3!#"&Jsy=S^h`>R_hx>nja+yy hyy hyy!y@]VcF9D=>32#"&'53326=4&#"3!534&#"3!53#5!>32JsR_h>nyjay}PG^{}Rhyyhyy5y]Vci9D)#5!>323!534&#"##"&'533265ݗ@}EUkd32#32673#"&5674&#"3F@}:IB;qI<EUkdy5y_T\}{^GPhi#y@'353#5!#5!##3Ncgvgz0}}}V{zTD  ! 2767!!&'&"?>p.(j).['-.(+)`VWaS_aR , )%#"3!"$'.54676$3!#5!353#5#!53TSDoed W~99W%)=?)%PT=232&'&'&3276=#"'&54767! #"'&v'H[7\`7YI'zUU|]\%ru&\]{VU(xjlͩjx(POpoOQj=f=jQOopOPL^%-!#3!53&'&767#676'&_ꑷo⏷-==73=<yuvyy%ts^E,`a,2/``/;L'33265#5!#3!5#"&;qPLt4|Y =US̵yyyok ;L332765#5!#3!5#"&;qPLtCC4|Y =USfhyyyok ;9'+33265#5!#327673#"'&=#5#"'&;q.(LtIBqI32LqPLtCCF4|Y3USfhyyyok ;9LD##.#"32673#"&=#5!>32LqPLt:IB;qI<4|Y3US̵}{^GP}yok FD%3!534632#.#"?F323!5IB;qIyA[yy5y5 Ko@7J3<>H*  '&3#!53#5!#32767>7!#32767654'&#)!\O]r)8" :š*87]y30'5@7f 7AnK 5y5yy[Ay>!!W  *H><3X9-D<7=332654&/&'&54632#.#"!"'32673#"&5`qlsIiIJ^Ձq lo SPP,/:IB;qI<+w}KF@F%*LL!mnEB6%5NNc{^GPh7!&7632#.#"#"&'53276'qUNpKER"7t32V2IB;qI32#',:@> ۜyyJyDVZ19q#53!!!32673#"&5˚b':IB;qI<yJy{^GP/'%#5!3#3!5#"&=#53#5!!3265䌌?}hBXkcXVy1yy_T\yVy1y%kTH,!#"&'&'&54767!5!27654'&'5!ghc\Slmz{T^11hg5*>?>?*5@lIC#$FDKaan@ybpppp`yF<'$#5!727654'&'53e?>*5gh21\Slm\Ry3pp`y,@lccIC#$FD' 3!53 3!53Vyuq{y'Ryy`yyFd'! 3!53333!53 ȋs}ABt}yyfRyy?HF8>32'.#"3!533!530s1xGqCCAP(squbMJGc%yyuyy])!53#5!##5!#3șϕyyydyyyH9'35!#!!332673#"'&=Hb5wc:IB;qI3 3!5tI.fZq>HbYoy)0/#"R" UMyy%3!53&'&546!2#&'&#";5oYbH>qZf.ItyyylMU "R"#/0)#5!#!"&/3327676'&+YbH>qZf.ItyyMU "R"#/0)8!7327673# &546!2#&'&#"/fZq>HH>qZf\/#"R"  "R"#/8V $47632"'&2#" ! '&65'&Ll&'TxyS5''''56L&&BKLByddF='pTfD8%276765'&'&#";#"2# $54767&'&54$8"?&@%Jl:9FG&&EF99QoTgEpq;eggeF {% 43_L>@x>@I`32"/gGGHGf3&'&#"327#5!# '&5476!254632#.#"dHMtKLHIl1:utty ((3 tI.fZq>HbYXyyyfy)0/#"R" UM)%3#!#53#535&'&546!2#&'&#";3#5YbH>qZf.ItyyyfyMU "R"#/0)yT %*54&#"326#!5#"32#5!!!!o`inYZmi`-pp-c'=5i6ۇSQ,*QSxwwT` *3?3!5#"32#5!!!"&'332654&+5!54&#"326ї-pp-ovy B 5,`inYZmi`}ySQ,*QSxwTy((Hfi6TI <A54&#"326 76!367676#767#!5#"32#5!!o`inYZmi``)<9XpK-pp-=5i6UF%rw 8\*"SQ,*QSx1qE#53!!!3267;32654'&/&'&54632#.#"!"'&'#"&5˚b',:@>$qWKls$$jIJ^Ձq lo SPPcohtPۜyJyuDVZ)I>KF@#"%*LL!mnEB6%5NN817&9#53!!'&7632#.#"#"&'53276'!32673#"&5˚b qUNpKER"7t ۜyJ]\NL:;ђeSPG/Ia-uDVZ1q>F#53!!!32767&576!2#&'&#"67 !"'#767'#"&554˚b',:@?XXY^>>sLN A !Nۜ\yJyuD+(Qv0@@sx^nHG UeO +AEk~?9 C#.#"!3!>32#"&'5332654&#"3!53+!3!53#5354632pKEPH@}KF@#"%*L4F!#!53#5!!!!׽,c'=5y#xwwZ)#5!## ##5!##5!## ##5!#3[QўKQ[QўKQSsJCCuCCsJCCuCCZ6#5!##5!#6zܫzS^^SV03!73#"'&5#4&#"#5>32332765#5]@}Z[:IBqI32332765#5!32673#"&=#@}Z[:I@qIDg\./ ~-(EZ#.#"3!53#5!67632J41L+,~:biO"87Q0.99eCCDj>Z533276=#5!#3!5#"'&ZI42K,+}cj"78P0.99eCC4Dj>Z*533276=#5!#32673#"&=#5#"'&ZI42K,+}b/+&I/,-'"78P0.99eCCE(-~ ^[Fj>Z'50#!53#5!#32767676?!#32767654/&#;4M* 000 30#98Zj#5!## ##5!#3[QўKQsIDDuDDZk#"&'5326?#5!##5!# ,-J N.I,+*4 KR[TB }+*(8[DD`DDtfR@ { i 9190!67R`XhC7`R>=!`X .C7`R 0&'0!Ri X.`7 2764'4#7&&'&6vTSSTvt'&l&'STTS "'&4763" vTSSTv6&'&&tSTTS'&l&'Z1"3276'&'&#"#7>323+5K0B;I(V/@??:ccbw.o44~/+CCZ1"3+53&'&547632#&'&#";bbcc9@@?/V(I;B/KCC[+/~44o.wyf<@ 91290K TKT[X@878YXW]3#'#դfyf4@ 91<90K TKT[X@878Y 373դx3üP; qH@3üx)3!#wI6wI llx!#6wIx& `lL& `mLoRgJ 533##5#5 V5 6@  120K TK T[X@878Y332673#"&}pccp}5INNIm)N A  _ 10K TX @ 878YK TX  @878Y462"&mWxWWxWAJ)- \T4mfVr@      9999199990@,               ]]5463232653#"&/&#"jf%G.G,$)1njf%G.H-$)1/F=/F=f:@ 91<20KTK T[X@878Y3#3# פfxeX327#"'&'-/1:c vM/_t]Q +^*, 0]QxZY3'&'#5!#7#5!#76ЪMT{zU \M.XHGD-DDDD_wZ 3!53#5!cUbbHCCCZ!253327654'&/&'&54632#&'&#"#"&_J 01TF&%E_k00>EETJ-,TFH7^44TS@ϧC##'$*+Ia^ =&% +,Ne/0Z}7#5!#3!53'3!537'#5!#-{V\\HY]cNT'DDCCCCDDZ1"3+53&'&547632#&'&#";bbcc9@@?/V(I;B/KCC[+/~44o.w0\#!50F\0\#!5!0F\x(0\#!5!0F\PP0\!#!5!30F(x0\)5!30>=!%>=!1`X `X .C7`C7`fCYrfvxfpeV~P: qM U5zl)N{)rNj;2#5676'&'&#"76,XPA1 $7I]h47Q%nn&1&8"#|fxfq\3m'D!8f#!# ZfxxU9'{zU5 #."#4632}pp}INNI #54767NJFE*hE+oOP7m'&547632'6>*++'AD1-+db@ ')>61+8B8Y(Bw/.m&'&547632(@bd+-1DA&,,)x./wB(Y8B8+16>)'Rf!#ifrC Zsvvb%#5353#üD%33##D㞼gy_q!5!#]c532654&'3#"&AJ)- \T4m2~2&84(P&6`*r|>r"3"'&47637&&'&6vTSSTv&'l'&TSST53533ü#5!##a% #53533##üa5!ae9:#"&'533265)r >=3>NJFEp*hE+oOP7oz=o}fr3m;r#!#5vx;jr#"'#"&'327654532747$]87]en} KF JM 3 HHs zyvqyrp ;Vrz==!oponib-OpqnneSϊXmZsf-10K TKT[X@878Y!#\f)'jLf&  #y$f'tf'zf'zf& f'f&0&ՄL$`R%` %3!53#5!#5!ӿ3yyyy<)3!N`o)n`(L=`3+V "!#3!53#2#" !   TxyS5BKLBydd``,`3.L73!5333!53Dz23Enyyy\yyV{0Z1q#53!3!#!##3!53#5{N{D{{7{{{{ZZV2`2]`3S 3 !#5! !53Sh{{*Z7<V&/67654'&'3!535&'&57675#5!#%;2)]])2֜֝2(^^(N2rr1yyYne$\yy\$en|61rr2 3;A113!#"3!535$'&6+5!21#5!#676]$f[un[f$^,kr&]1ywiyyi~%y_.eyy7\#K@( ~{g g %!% $991/<22990%!53!56#"!3!&5! N#Ǣ"Orr} 0 '5 5}\A<}``& u& uTf'cof'FV f'Ff&ԝF<'TA,6737'&'# 76 &'&7676]T_w<,7$WVQ$$$P[>]2j0--.lj/ Q3,_c"wBmy$:"),+ `W6XYRV(-%3276'&'&+5327654'&!!"1>PS^ /;IB4'+8:$5vSR`da Ta^yxDYK0m)\oTS"f2S ''&7#5!76'&'53cĚA6\k36|u, >Kh̸Gwgnk!4fMJ,:T'0&54767632#&'&'&#"3  7626&"dd{xtp -Bkx@!'_Yp[Z\\^E? $!.0#X+XLcoE FU[!#!3 #5276# 47D{y?w?zG-jȚ!yo]Ll& FV D3#5!>32!4&#"ݗ@}[\EUkdy_TjgXiT,!'&"!276 ! *11*h)..)Q?>AQ6sy{TF' %'&5#5!7ų{zY!p|qRy3GF')53#5!##5!#3!533s}cy6xx~yyyy{XIG%3!533!53&'&'&5676{q΁uc\-WA#"qJ9E(yyyCyy+'%M  9V'!#5!3265#5!3!5#"&'3DXjc7mJ;!VXynyRy}SGF<')#5!6767654'&'53?IZp)>**4hh2JCSlm\Ry3upc~,AX6C#$`VD 8%676764'&#"!&'&'&'&547673%6O c7>*2Bl:|CCJ2hh4*>:Y+ϞOh2JC;>k-HQ]oY066XA,~fpgnG99NvX6/79D5%3!53&'&#"#567632#5!#327673#"'&'®ws(*<^212/Jh4 2JCIv;7|CCJ2 4TJ>9('J ep]A,)n+X6;+Y066X~,H|mng QI'6%&'&54767332!327654'&'53''&CJ2hh4*>BQwbwQB>*4hh2JC;Pgd`6XA,~fpu \upf~,AX6/7!'7N&jF<N'jTf&o F<f'QIf'T, (676'&#"'&! #327654'ix)4jm1* 줠?4?f).qi6-+_Axy{^z~s=Fx,%'&#"!3#! '&#5!3276 *[0柙Q6iq.)r?yA:ny(yݔ]dի=%6#6'&3!53SyAH=N-.)hɷ|B|>,Wx`T/pyyFyuf'=' uTV0' !! '&476!27654'&#"tdPY^]vv]^YP-qLq~a^f^a~qFb'8!32!327654'&%''&'&'&54767#5!{*>BQwbwQB>*,h2JC;Pgd`;CJ2h%" @fpu \upf= &%X6/7!'7/6X/yyT96B!'&'&7'&76?6'&'&#676?7673#"&'5376*0w34%#[Y B/?p|j*R dQ4%#[S+6+?p n\(dTiO"0B'/ 0yuh1D(dTlG /C}KP#%VY %2#"!&'&! {qxy֝\BKLBkh(dИTYD%26&"!&'&! p[Z\\$j?>kT_d!b)bVU% #5254# '&!2#.#"@T0lz 'Ω\q[Llkf@AfTU`!7653#"3 #5276# 'OptrDvc??zG-j4D3g< edo]Ll& (`)BP%47632#4&#"!!#"&'533276ԋtCYy4\(dTiO"0B'/ /zuh1A(dTlG /C0 7rrRE 032654&#"762#&'&#'&5%6#"&'_jmYYmj_4<`2q 2kTx^V}p-HiOJXO<,:)L-^JHJQSTD# !2#.#"3267&4oup~r}zkL& (**هπxh9=MV!32&'&#" ! ]\I[\IsTxySB逡vddTD # !2#.#"!6!3267&4oup~r>9l 3=kL& (**هdZyWhxTD 332767!&!&'&#"#>3 !"&Tk=3 l8?r~puo4LxhWyZd'**ڳ`353#5!#!2#!332654&+`/&ppyyyry/VF 326&#"!#5!>32#"&')_jmYYmj_-pp-HiʯTFxSQQSV! !2#.#"3267;Iz 'Ωܕ+ef@AfV{353#5! !#3!53#3Vhg13yy9yyysyV' !#3!53#!Zo҇' yyy_LUV8E%53%6#"&'!!!532654&#"UdV}p-nb_jmYYmj_yeHJQSyppiV332#"#6$3 ! $V+ک' zI@AoA@__V #4632#"! !2#.#"3267 pNOppON|;Iz 'Ωܕ+yppo`ef@AfV ##"&4632332#"#6$3 ! $BpNOppON+ک' zIoop%@AoA@__`k&S /u`&S /uJ-!"&'5332?654&#!3!53!#!#5!!2 WzSWMLa'!lj 'C@Op""^XK W_yyu`kk&Q uVH@   % 21@~ ~ {p0@o0]! ! #! !!! ;Iz@Njg'VfewǡNL6``,``&D ujV{-- <&/75326#5!#32#!53!#"%32654&+-MR1ULxܡOi6R7nXX0^X>$yy  xc޷ yƖ` &/)53!3!53#5!#!#5!#3 %32654&+:RLЬx|OXXydyyyy yy ciN yF!23!534&#!3!53!#!#5'lj Lyy;yyu`3k&X u`3k&V u2g' Pra`3!"#4'&#!53#5!#!#5!#3ddgRyyy-yyyp$$`eF@  % (#"2291@ vv sv/20%32654&+!#5!3 )53#Ѹϐ`yy`R%`k 6@   ( #"21@ vsv/20]%3!53#5!#5!ӿ yyyy`A@ (# ( 99991@ v sv/222203!%#5!#3#4#!"#32GZJgy$dd$ylSMyyF?`( k+353 #5!##5!##5!# 3!533!53'3n+-yy-+nk~~ky#yyZyyZyy@yyAy8yyyy`T'l@  & %% (91@ ~~&#~{p(90 KTX)(((@878Y]>3 ! $'332654&!#53 654&#"#:!.ǼB4 y##>߽ix{`3~@ - -( #(#"2222221@*   v sv/<2<290KSX Y@ P]353#5!#5#5!#3!533`RyyykyyyyCDy`3' PuV3KTKT[X6@66848YKTX666@848Y`3@  (,"2<29991@* vs v/<2<290KSX@#         <<<<<$yyyyV{0`3+V2`2M@ - - #(( #"221@ vs v/<220@ P]#3!53!3!53#52yyy-yyy`3V&72gx@    91@* ~p vs<2990KSX@    9Y]"'5332?#5!# #5!# Mj3̨|D^Xb,ryy"yyb:V? '`@%% ( !#%((<<2<<21@ s"  v/<<2KSX!<<2!v<<2Y0!# !3!535 54!5#"32654&KaadddyPeyyePɤ<Ĥ 3;`[F@- - ( #( "291@ vsv /2<20)53#5!#!#5!#3#4ZRy$yyy0yyF??K@-(#((# 2<21@ vsv/2<20]#3!53!"$5#5!#3!#5俿Q}dDyyyΣyyuwyV r@--# (-#- (# "221@vs v /22<<20@O ]@  //q%!#5!#3!53#5!#!#5!#yyyyyy0yyV z@ --#(-#- (# " 291@vs v /22<<20@O! ]@  //q!#3#4#!53#5!#!#5!#!#y$d_yF?yyy0yy0 G%32654&+!#3 )53!ww_`cQڿiyruy @y` ?',j`:;@(% (#"221@ vvsv/220]353#5!#3 !'3265!#`wwyyy My>V3! !5!! #$! ! $VV'glNAyA9o5` (Q@ %&%  - #(")2<2991@#p{~p vs v/22990%3!53#5!#376! ! '&#2#"xyS־yyyyy/ddη3BKLB. g@(#(/ !2<1@* vvsv/<222290KSX@-(   <736  '&326&"ELgAY |CxD`1 T> \qp[ZTJ> :\zB%(n8tX F='#%32654&+532654&+53#5! !?ZvZOowOڭyYb]bJHDJRy5y_p tFd' 353#5!#5!3FyTy5yߨyF'325#5!#3#'&#!"3!!FBkUPwd-d!kNg!yyl5TDH'+353%#5!##5!##5!#3!533!53'3s`s}CB}y?yyxx~yyyyjGyy#GyFD(3327654!#5327>54!"#5$3 ! FQM=0D1֓pora&A1Q݉1#9]#$@a~ |F'353#5!#5#5!#3!533F{q}y5yykwyyyyqyF' QvF'353#5!##5!#3!533F{s}cy6xx~yyyy{Xy$^'"/327>=#5!#3!53!?ZK?> I-dp(F}%Vڤyyyy5F'353#5!!#3!53!3F73py5y|yuu:yF'353#5!#!#5!#3!53!3F{]}y5yy?yyyy}yTDRF'353#5!#3!53!3FPy5yyyy5y/VFDSTDFB'!#5!3!53!BTy!ߨyy59 '\4SV =32?'&#"326&#"32#5!7632#"/3!53#"U3R%%R3Uo%R3UU3R%:--:Ɠ-n-7777*GxGGyyqG*'[F'353#5!#!#5!#3#'&#F{]|wdy5yy5yylF'5!#;#5!#3!53!"&5F{;Gۃ|zyyD2yyyykFT'353#5!#!#5!#!#5!#3F{]g]|y5yy5yy5yyyFb'353#5!#!#5!#!#5!#3#'&#F{]g]|wey5yy5yy5yyl'!#3 )53!3264&+~jnNN+yĕy5}``U'#353#5!#3 !'3264&+53#5!#3U睄NNؗy5yyĕy``y5yyyU'353#5!#3 !'3264&+U睄NNy5yyĕy``WD332767!5!.#"#6! ! W k?2 lv~qp4q?jhSw¾v'HlD353#5!#36  '#326&"l 03>Ǘ\[Zy5yyy2';#"53.4$3!#3!53#wfb_#JoYRyoyyyc$Tf&sCTN&sj9n$53#5!!!>32'64&#"3!53P@}Lw|`łyuxy_Tgy yy5Fdf&qvYTD! #.#"!!32673! T4pq~vl 2?k Iq (HوvwShj&X-DVFLN&jh9=M$'#+"/32767676=#5!#3 )53!%3264&+?ZK?> Idj(F"NN}%VmmRRyyĕy5``F''%3264&+53#5!#!#5!#3 )53!3NNH{]|~y``y5yy?yyĕy}y($53#5!!!>323!534&#"3!53(P@}E`Ăyuxy_Tyy-iyy5Ff&xvFf&vC9 ' QF'353#5!#!#5!#3!"#'&#F{]}drdy5yy'yyy(%32654&+%!5#5!#!#'&+3 )53#"ww rryZcQڿZy!YyyY@yN#5!#5!!#&+3 )53#"3264&+  lb.j.bNN5uxzĕy6zD``` ))! '&#3!53#5!#376! #! !!!  );z@Njg'Vѹ0yyyy+ЁwǡNlVD-676! #.#"!!32673! '&'#3!53#5!#,pq~vl 2?k Iq䜌ƗoS܁HوvwShjyy5yy k( 53>35!23!53&+3!53#"3*_kck~,B##B,~LRyf⍍fyy&>yyd>y') 0 53>35!23!53&+3!53#"3V--is7}}7s}##}RymFCAwwCFyyX%yy}%yVTD   %267%!."?>WVxT.(+ )ӸyɲaR?5!# 632#4&#"#KwqECB!\yy#Ǫ&cJP\D5!# 632#4&#"!b  A]q8IHyy`'BA*Wd %32654&+5!5#5!#!!3 )53wwT,,cQڿyYyyY@y53#5!3#3 )533264&+ȞȝjbNNuxxĕy.``` 5@   ( #"21@ vsv/20]%3!53#5!3!ӿ#yyyy%RFnX 353#5!3!3Fyтy5y1VyVk53#5!#5!!!3!53Vɿ Wӿy'yyq<d'353#53#5!#5!!!3FyT@ysyIyߨyy`JB+3!53#5!#5!!2!"&'5332?654&#ӿ3' V{SWMLa&!yyyC@Op""^XK W_F9 ''3!53#5!#5!!2#"&'532654&#APy"aY\323!354.#!53#5!#!23!}&6<0u|)/37Xp@v8uu ([uuT/uu)$9^w=p tcc =Z9on0%754.#!53!".5#*&"#5!#3!#5!#323!h,4uee3,&54.#!53!3!57#5!#2!ey4N5utssu;\E1+2\LN[/ uzyvv*G^jp5n+C4.+";2>5!#!".=4>7##53!#'5#'T[fS`4)XbdZT(H\y{֠\0SpBI)K?qU14cIBzgGtv5%#!".5#".=#5!#3!!2)9!7D-P0_[Xj;3!!23!">WkzCl~E "A6s~޹e5;lu_sQk>y4B}_8fw8^C%ms6a`b]4t5aTtPl%3#".='#5%#3!#3!>q;[> o9t !kk!&?Q,uwm.'rrn (4.#!3737!5!".5#5!#!2%;)2J0TvvSrH t;sRzP(C5F)8J,css'0Rk;/uu$P~[nc.4&#%;265%+".5%!53#5!#292,29QGuOWwFNrnx eH6?:-UL?[Q&0YP~uuGqRI";2654.#'+".54$!35#".=#5!#3!#!2!9I)/!oEGs 2%*Zccq=2XA%p:v /$w-QsH"yJ5+F3<8*SGz4T; [Q%)TVO,='vuuJ !q&Q}W2un*23!54&+!23!534.#!3!53'5IpJ&v7-#^k^+vu2+tuu7bOu#'8_Grr6,[I/rrsl@W4.+";2>5##".'+".=4>;232>5!O+@VkA~9fVE0.CWi5#5%v.eswj2}?Y9r7u (qt *!"u;w:JvR,w7+"^_09eQx.\e\err+Y]xn##+".5#5!#;2>5#5!zFx\P|Mu52>54.'+"$&=4>;2!J-AUg;@kXC-3J\l=W3!2UfgW2E**E2F}vrAÁnĆDFxu{?ڔLrr(#%XWP3354.#'3!5%".5/5!';#5!#!23!q)uuCuX3s:r 0#u=x]?qV3v*L:#rrN%GeArrH>)qq,Jb6vn%34.+"3!5346;23!rs '% ttv!@\{JI|]rr rn%3!".5#5!#3!#5!#3!vtij5ufK)qqr7##!".=4>73!2>5!".5#5!#3!#'!vHuJHzM;_u:,$ fv@s:t->t=?9nV4/Qo?%_^P%E5 6G&_ PessD;(sn!23!534.#3!53#5%4Og=#5!#7!"WqW9qkR6|a:w/3Sf3R@o^J3/DYl>V:j[J4uus+H5[ү_9SmPuu*'i`C6^|H<~d@!6CA9{{!r;";2>54.#'+".54$3!#5!#!23!6O2%:'. q !:phcyDu?x04kW7wJD2D(5]E'$B]:&2)^[,5`SPss%TeIwn` 74.#!!2>5354.#%3!53#5!2#!!23!)3.8*s urr]HlB=iOi"Zk:v=#K *Ҥ)$qqt'>M%,R?';X9v?+".=4>3;2>=4.#!#5!#3!!325ZyFrpרfGuM+)(KlDF%JD<,2Tp>rxw4q`EuaJ22\NYEa=L dK):^C%3CHJ!G?lDssrGC}pn%%754.#!53#5!#!#5!#3!!23!Lu"3"6uu>us<wxw  7)vqqqqt}yrn G4.+32>5!+3!5!"3!54>7!!".5'#5!#3!2*?*0@'R=wpvx/: st7onOlbZ*s=t #?2Mg{D+H4+A*MmE qr3]LrrJSj> &C8qq  ErRn '#+".5!!53#5!#;2>5#5! w>nXixB6vvuFH)v?'OlC&MvPurrin{!8K+7un354.#!7!5#5!#!23!av &vuu>up2v:H)rrrr+Z`unNG+".55!#;2>=4.'.=4>3!!5#N/TsNMvW1pe.?HM'`PwN'3`Vgb0@lO2E(ExZ4y@ufS< "ww!,>pZyy]nrrsn7%3!5!57#5!#!#5!#3!rstt;s7t>vv!rr {qqqq| K4.#!!2>5";2>5!+".=4$!3#5!2#'!'3!g%:*)/! 5( (' TCyhb|H  pz͋G>xtyw\7+)4(;%%B18N/fM_6*WZms>mW0PkAw9u:Z4#".546732>54.'.=3R^XyHvwm7+)AP&0H2(2 :,%9A/`M0jf16f`rD%5&Le=2Uo=>kZG>FV9YW3H3%B`dZ2G4.#"32>5%#".54>7'4.'.=3 $8)?E! $F;:@ C@{t}}?+EeY"*&K<% $";,!OPK9#Y[: 9ol\f6-XW(xDMl8tndP9 _"2# <5{{ 3P:V (=UnPM'K%4.#"32>%#".54>7>54.#".54>32F3J1?bC#}7M1/SrBUSuORrNxo{AAvd[xe/E<5.'.'>7.'4>32>32#".54>7.#" 7-/=$$=.-7 "5Ripo/J- >#1BRi=8st5SB36ThxABweAxfT<  ]20A'DqgsP*NoG"MphQ!%Q\ *E5( Z\=P3}ˀ\wD$->@Lh]Q,J`hh,2PGB$/*'Wf]k)3AZwOZL'=#".54>732>54.#".54>32qD'?QTR )D202:mams;?oZ<^G3"Q .BR/NrI$"HoNMi?5N3'@732>54.+532>54.#".54>322D|mqJ=fE! 1I0*9$#5$/75+)>)'QA)7+I;Z<@saUR.JZ+8aH)\tC,\e4.#"32>%#".54>7.54>323>3&" 2&%/ $3 #+Q+D/*?(SDhL*7_|E@fO8% H:QjF+8 DpN+F[34YCL\24ZY#c"[̇CE{>cRG" C`w@L|W/"8HJG #.73dQ2!-SyZc'O4.#"32>%4>32>32+532>54.#"#".);&+D/'@0(A-lOb-WRJ CDAgJ2Qjom,!"F9#5H++*& !GpnFX Y[YƁ>%13#?ņJxcF's1gnX(FOT)ȊHLZ',#5>54.#"#.54>32%Ec=# "A62?$ "8aH)Flm|CSu*k ,[u|c*1it@QxS1 k,vQpQOFM"F%#".54>732>574&#!52>5.#">32"KjdO3FF -E/:D# .$QPI8!"Q0Y">4& ^c3*H_5 lr:,bp-M9#-4A)AkK)-SvJA8}!<^DA8%Xh (MnE;^H5Z`6#'2>54.#"!5>=4&#"!5>=4&#"#.'&'>7.54>32>2>320Pkuz83Q:%29, NECU [O*:"-QrV<{^8:_|l$G_F9!dDD?Ol@M~V$GD;=CE@DA:1 xW|9%37,-73'2lZ2F4."32>5#".54>324.#".54>32-IhC'&?-EP) 3NY~…DS\1c+-Q?ET.%@U`e0ǁ="U*`sZ"Zy~|>OuoR.*L#2! 'H; #4+)3VD5"5iinF7K4.#"32>5%#".54>3232>7#".#">32 ,<%8N2.C-)E3/(DZm'R.#5>=4.#"!5>=4.#"#.54>32>32/Oh: ;98}+QOP)+A,5.$<+%0@$,2*5ZKi??ugb''m`q>(Bw' '#L7<q $K{`I^5:]Do&C#DC#D&oD]:9dQV{O%q&crlLRPLVNZ0L#".54>732>54.+532>54.'.=3/?yrxDHwXRkX6=1J32%-ER$8mU5m:S\#.c_U@&4P`,54.'5>73#".54>732>5'#".'Z1_6$ %@`D,~0=yxZX4[|J&3N50I1$hst.)XH/*SzQ=5* \mu /7632>32#52>54.#"!5>=4.#"3#.54>7>73)ntqY7FQM.L?69BM*d{E.]];L-2/*@+ #8()>)6W>Se9-S†%X]^UGQ*Ch4ELO$4)+;!!:+LmYu%s&]ugo:8ZA{*' DC '*{BZ7-cpse.s!zQCq!  8=;._8#".5##54>3232>54.54>7_O`eyDk;\BYP4E)*1*.O>%'5Q]P5fs?6h` *I7 üMoMrT>50DDAX "# /D=AY{FL$4.#"32>4.#"2>#".54>7'>7332>'4.'#".54>7.54>32 0  ! &VZ;[?IG?5AHMNJ"9 &We]wD "S2 #>1NQ5T>@V5QF<:4ZW*;+  +54&#"5>5'4&#"#".=32>7>32>32'iO5mf[D'270>!C:N.>9#, %-%9/2W?$     "0>'3M0;C#Le;cɃ>(?WrFVqiKg@$QbIU#(&DB&(14&6V= CkL.-0+#.5*E2@3*KiZM's4.#"32>#".54>732>=4.#52>54.#"#".54>32632 )/;! :.+6 Da|E$Sa .QoASoB'F6:L-%;),*( IyUiwAB{mIKGfexB/Nc45dM._PqK,Gqf|C@}b[+2Tl9@7) ),-$M?)(Hb;N6L0_Mc^r>#7BK&re/DsW[~J ,xArXMuW=8TrZL0@%#".54>732>5.#".54>32'%30;vtcVHwO5F1C'4H,!=== $=,",K/T@&4\~HU/6d'h~F,\c]}P) PwhUoB!Oc4A%*>'/*$ 7D\C?mQ.1>ZLK$a'>54.#"!5>=4.#"'.'&'>7.54>32>32K/hv+8 4),J7('0F.)7!D?IKG8\yn& 4( 033@hJ)E|f[1JY`-cs?cO~t8D'YhyGW\/6YA%?DC?&AY61\T2|{l"(99Egm>=<7/&"@3|%.Dsu732>5#".54>7332>5!3cP?p\ $9)1K3%#".54>324.#"#54.#".54>32>32W"9L)/B(&A2-M9!Jqvx=Le?=8/&/ +)!* &6Q68Wl3Oe 7FN#J{X0X X~ze+XQn|C`cgU 4(5 .MG\5QK':'*asnFD>54.#">32+532>574&#"!4>32M  *73%6BM'\}J*H^gj/3.IF)YJ/8iaUsE%?S/(/2( ,T&7'2>732>54.#'532>54&'.53,MizCߣ\ %2?%KX[%AMSL@#+KcrY<2@"m('*3(,?F*@,%GhD0jX:HxaJ2UՀ(hsxpb#3?D  CAft)ׅb% K{[EqQ-j1I07e/%#".54>324.#'27U:$2!'C2'D2+Gm||>BxcD-3K/4rmbJ,_!X{a& VupHK̓`W*&?O-s(;M_7FL`}4.#"3>7>'>54.#"#54.#">32#6.'.'.54>32>32+:"?O, 2 #"j0B(';( * 4(&  0\TpA&:HNHOC.  $+/  $R_A;/ #0>'SpEOe:-HX+)HM:ISWN@%]dg';1. _3-%'8$__'9%6[ECDA1C6cVCSd=!bpvlpcP)KE@nĵV+{Hlm6%0/&:VZL<.#"32>7'".54>732>54.'.'467#".54>32>'4.''>737}34- +!!)041e'69-$C~ฃH@gB! &8#6F) ')S3>^@ @cD866.9:4?>8L_ps^;#)#5'#'8$#7')0ں;0TH9?IU0u`('WdFpW?=7GY6Mb8=kT0XNB1^/((%+6O\',_O3"-5\("KKKE<K^i4?;UvQ/A64C[C-./39 FWA4.#"32>5%#".5#54>327>73@"9*-P<$.>$FO( GUlhv@vu&IjD_?JnJ$!PbUρ9FieIb:8cPLPxT3 &0!S2M1.54>3232654.'7#".'#".5332>54.'&'>7>3.'".54>32>7>'4.#"6(+ET);aF&i^ %-256,6*SQI$B]9;xyx<#A6* .n`@*X_9gN- $&0  *p ):*-D/Eg1%. &2^0D+$GgB^eL#-c_W!  * !.Y/H0!Ab@L6Vip\;2A&!0a:]B#,i+/1;Vj6>gJ)>Z<.$3F*$B3  %GGI'*7 &00'!!KMM#4`I+/`a$"%!+1 *Z23\#".54>732>54.#5>54.#52>54&'.532Hj:woaH*'F_8%@V1P+.VC(id1$;WuL2VG79gN.-Ng:EX3K7 !9.2:II 9.=C.WJ)#9U:60( .<$&B6( 9CIn2 f4.#">5>54.'#".54>3232>54.#5>54.#K2$WI@FH %NY0.HU'*WF,3JR&TF.H~pÐS0`bNc8&OzT6M25ZA%&""&&"3= KZBk!KbkW~dV1'Lb^5ZE/ *A/-;&2%>7".''7.54>32"//' %4D,F@gC$V]b1G}sp;7#".54>732>73#".546732>54.+5=6[G3 -a]UUpA ,""(@R*9q`G2Qi6>{{fM" &>//$ (;'GuR5L1;eN$<50f !$&5!4Qe1ݞf8y10emR 4@D_vA 9_^YsBoZL2Z%#".54>732>=4.#>54.'.54>2.#"2B|o~?J}_ XY4=1* 3$+DT)lSiZ}N$Pd'50E5(C\|WOrJ" J{Z%D\93A#)[TC+A]E^~SgwZ%5E#7'#".54>35".54>327"32>5"34.縸vJIJHo|x:]~M!-D.+7!,C.Jd ;Y4_PXT'#O]Q`6"KxV4P63YB&)3&D[5#F9$71(ZM6^.#"32>".54>32>3">32#".'#532>54.#"37 !?5)>)2? /: +W2R>k-N9!Y6|ʓ˂='8T_3G4)3%?Ň̀:*S~T*r2L\)GV.7^a[[9 ZL$W#".54>7>54.#".54>3232>=4.'-Njx?>ykQ.N{J-`O4 2@$H:$  W7*2caMoC%=OVW%4K13Q:+XG-uU!Hu[C+3KbxGbwV=IM!=M+ "C9 y '19 2jW8%P{U1L;-%Ce]lB54.'73#".'32674.'#"&5Z$%;IJ9'?8x_zFI~^85- 4M1RQ LqDPc&):&AhMIeJ9(#SfxHSg: $+0Q; cRGHA"A^=AoP-ZM$N32>54.#"4>3232>56&'#".54675.6M1@W33S?6Q5ZcvɓS177IU-IxU.)A/4K1!#d\A@s`Uf9UsDDn_+&bcL#Tdoz@@ue_A',."HFC<9,%.$e6%@57]C&+Ib7Q8PzZSV:4."32>7#"&54>322>7#".#"72+/ (""(1'%KoJ**( $.-V* "$rsCP+ /N;8I-*K<4W?$   y'+6Z \#364>32#".4>32#".4>2".^*9 !9++9! 9*+9! 9**9 !9+*9@9++9@9*r80$$080##80##080$$w80$$080##Z[2';>5.#".#"'>7.54>322!Na!lQ&5(r'*2#;fK,HmbP6ogX6j`OTpE@w`vb99RnJ-=#j&%fwD^tA9f0D5?326=# !54&#"#6$32>32!#32673#"&3264&#"N^[OMo |r+NY|{grq_qmjOYV^ҩNN6-ηyuMONN?tWa""Mn`pD2 !"'&'53327654'&+5327654'&'&#676x0eggeWcdmt >>ul:9FG&&EF99ms|_^DgGGHGf%]-.43_L>@x>@I`32\|a_d- #"&54632#5!#3!pQOooOQp}QooQOonyyy D1"26&326=# %54&#"#>32>3 !"&=p[Z\\O]ZNKv zs'фHFԇ:ҩPL:(϶ztMOMOMTD ! !&"T?>sZ\)T ! !265Z\)+*!53##!#!2654&#!#y_Tymk%y@|BXjdp+ -%"&462"&4632!53##!#!2654&#!#~BXlbrt0%#!#3!2654&#!#3!2654&#!#3!53#+jayyhyyhyy5y]VcJsy=S^h`>R_hx>n5333!53'!3! MbcZG\MNp$CCCC-:#!#535!3!53#5!#5!353#5#!53%0HxZgHuWUUU CCCBviiw<#53#5!2#32654&+3264&+27nezUN8836yj}53!#5!#5!3|WU~C͂YC,I#5!#3265#5!##"&5xxmmxHyڼBBez{BBYVG'3!5#"&546;54&#"#5>325#"326_,mEgnuMQCHGC024?CJ.,`Zbb#GD07~uu32+32673#"&32654&#"`?,lFfnuMPCIGC123?$CK/,aYcb"GD06~u,u;877;V 54&#"326!#3!5#"&6325K=BE89DB=>__`FF`:g[`a[B32>32+32673#"&3264&#"K1;:2{0uFOWHX jT28NvYNAGH32#"&'!5%3264&#"`?`FF`?32#"&K1;:23OWHY it]\k ArdC?c^V."&5467.54632#.#";#"2673ss7?>EINJD%$,-WX,,HEHN k=:UM9N N8NU v324*"#B"#)483DG64V.2#"'&'53327654'&+5327654&#&#676dss6??EINID%$,-WX,,HEHN k<;UN8N N9MU v324)##B"#(583DG55V*#"&'53326=#"&6325!4&#"3265*ɷCHG WQhU`FF`>=BE89DB=|:8VnB-- -.KCg[`a[fV #"&54632#5!#3!G32FF23G`__ -==-+=<CC=CV!53#5!%#5!#3!53'3m__>P2|IN?UCBCCCC0Vb0>323!534&#"3!534&#"3!53#5!>329/lHtr`qP'4;BPP'3'eERf:6rsCCm9OJCCm9OJCCCS307VW&53#5!>32#"&'5332654&#"3V__>(hOpt%V.G%*.%,5D?RCCS4/tqGY\ |,'4CK9V^CVJ26&" &5463299:2ɱjij驤V>32#"&'5332654&#"V­FJG OH]OMWCR>dcJHnqFBVJ 4632#4&"Vɱ9:ѐijVJ #"&53265Jɱ9:БijV "3264&#"'#5!>32#"&'3!5332#"&'!5326&#"x?#jsq-pp-`inYZmi`!!ifySQQSyfʰ<gF'!#3#3!53#53#Fo'yyyyfyV9%3#"&'53326=!53#5!?32#"&'=BE89DB=__>aFFa:f[`a[WCCK.--- V#"&54632#.#"3267­FJG OH]OMWCQ cebJHnrGBV--3254#'676!"'#767&'&7632#&'&#"t;bW91[tQVkkje788; ''I]02&T;D 'n'/OO8+TTT M#$@B|4VJ ,#"&54632.''7.'77.#"2654&UvȲɚ6 )!a?X9/F;;:R~"=R7H" = (U9 i~ih;iV0"'&'33>54'&+5327654'&#"#567632d;<k NHEH,,XW-,$%DINIE??6ZZssZZ46GD384)#"B#"*423v +*N8N N9M*+V#.#"3#3!53#5354632G/,2-@`dd5g1r**?GKC=CCCIae V#5!3##"'&'53276=#53@_>jj%++.G).^^CCEY\ },CECV'!##"&'53326=#"&54765#"3265_ɷCHG WQhU`FSRPE89DB=C|:8VnB--~TR`a[fV3!#"&5#5!#3265#5Wd(gOqs`Q+6C?RB<4.tq1CCJ:W^CV!3!535#535#5!3#47632#"'&`b____>``$#32####23#$CCCCC--+V#5!3#"'&]<9mu/=eMCxH!"6#V '!#3!53#__`b__CC=CCV!#3#3!535#535#V__``b____CCCCCV+647632#"'&#&547232#5!#&'&'&#&76765##41#$##23#$+HP۠_>=F tS-,+*/zlCr#-1,PE1OV#5!327673#"'&5_?$.*H.++&HIBcC4,| ..YV3#"'&'533276=#53#5!`%++.G).__>Y\ |,CECBV 53#5!#353VxxyUCBBAVB>32#"'&'53327654'&#"3!534'&#"3!53#5!676329/lHtr%++.G).4;!!PP3'32ER33:6rsGY\ |,Cm('JCCm('JCCCS3Vb0#"&5#5!#3265#5!#3265#5!#3!#"&/lIsr`P&5;APP'4)34Oq9:`pQ5D %++.G).CS4::qCC6K++^rY\ |,CV?,53#5!67632327673#"&54'&#"3V__>(44Opt.)G.++%5D RCCS4tqGC,| \YK++^CVT53#53#53##3VVVAVvxACEEE_CVJ  '&5476322767!'!&'&"eddedRRRRR5/ut/o-45-V&/!#3!535&'&547675#67654'&7{[ss\|b{YttY{{&& &&C ARRA CC@RR?) 55/ 55VC3327654'&/&'&547632#&'&#"#"'327673#"&5[G /0QD$$B\h./LK;CCQG,+PDF4\22.)G.++&`A"#'#**G`./ <&$ +*Mc^7C,| \YV!&7632#.#"#"&'533276'XG6f1F0+4# WI%V.G&). >`33 }**!F&P7. |,'(5V"#53533#;#"&'533276="&5aaߺ$&V.G%)-dCCL&sY\ |,'E5KeV)5#5!3#3!5#"'&=#535#5!#32765xR1XX_(43Oq:9RR`?8C CCCR4::q2CCCm,+_VZ)#"&'&'&5467#5!27654'&'5!o:4DE5;pB"N'(!#O;67(%'%)65>eY5B[Vv$5#5!727654'&'53_>`@''"Qo:5DDGCu|=>fX5B#N<67(%V{3!53 3#53DJQWMCCqCCV 5!#5!!53VKp6KCdB:jV 5!#5!!3327673#"'&=VKp.)G.++&KICdB:uC,| .,[EVG"#767!5!#5!367676%376WKp&$7ZYGa'= PP CdB:K2Sk>;'V+#"&'5332654&+57!#5!FeKVLbW`imd*Ko .C{NR\VYa{dBVJ!&'&"!276 '&54632O3edɱdvIVVIHRRHvww7L&$T7D&DX`R' au%/F&EE5`KR&%a/KF&E`R&%a/F&EVok& yuTof&v`' au'Th&G5`K''TKh'G`&'aTh&G`o&'8Toh&G`&'p&Th&Gp&`&('0u /T&H'U`&('0u 1T&H'U`&(/TD&H`9&(/T9D&H`ok' /uTo5'z`' %u)?&ID5V3&*uT9h &J`3' u+?&KE5`K3'+?K'K`3' u+&KE5`o3&+?o&K`;3&+?;&K`9`&,9&L}`3r&.  |Fr&N N|`K3&.FK&N`3&.F&N`Ks'/FK'O`KsP'qDFKP'qD`s&/%B&O}`s'p&/&Op&V{r&0 I|FHf&PHV{~' <p0FHN&P{jVK{'<0FKHD'GPZ' u1FN&Q{ZK'1FKD'QZ&1FD&QZ&1pU&FD&Qp&V&2'~u |T&R'UV&2'~u wT&R'U`k' au3/VFf&S`' au3/VFN&S{`' au5;LN&U`K'a5;KLD'U`KP'qaD;KL 'q`&5a;LD&U}L' u6X-N&V{BKL'6XK-D'BVKL' uXK-N&V'BC' u71&W}5K'71Kq'5W&71q&W-&7p&1q&Wp5&FK&8/K'&XF9&8/9'&XF&8/'&XF&8'  u/&X'F&8'u/f&X'Ro&9 uV&Y_KR''9K''TY k' u: f'~Z k' u: f'~Z ' u: &Zj} ' u: N&Z~P ':K '&Z} 3' u;N&[_ 3' u;N&[_' u<9N&\_Lk&= uHFf&]GLK&=HKF'&]FL&=HF'&]F?&K &W}5 &Z~9&\_T:&Dl/X-N&VCKL&$TKD&DXLb&$uT&DYKLk&$' uTKf&D'XYL&$'u T&D'YXL&$'u T&D'YXL &$'uTl&D'YYL&$'u T&D'YYCKL&$'uTK5&D'XY`K&(/TKD&H`b&(0uT&H`&( 1TV&H`Kk&('/ 2uTKf&H'``b&,uF'~`K`&,FK&LVK&2}TKD&RVb&2~uT&RVK&2'}~uTKf&R'FK&8/K''XFb&8u/&Xr&< |96&\C K&<9'&\i&<|9&\_o&< u9V&\_T'*T'bT'7T'DT'8T'E$T'9T'FL&*L'bp&7&D&8r&EL&9L'Fvco&*tco'bco&7gco&Drco'8co'E'*>'b,&7B&DBV&8&EFV '*FV 'bFV '7FV 'DFV '8FV 'EFV '9FV 'Fq'*>e'b2 &7N &DT &8 &E 7'9l 1'FmF&*F&b&7&D&8&E:&91&F'*J'b2&7H&DN&8H&Ej'9l X'FmT'* T'b T'7 T'D T'8 T'E '*<"'b &7 &D&8O0&EF<'*F<'bF<'7F<'DF<'8F<'EF<'9F<'Fs'b &D #&EZ9'FmpQI'*QI'bQI'7QI'DQI'8QI'EQI'9QI'F'*TY'b &7 &D&8PY&E'9l'Fm\Tf'VTfcof'VcofFV f'VFV ff&VFfTf'V TfF<f'VF<fQIf'VQIfTM'zTM'{TM'|TM'}TM'~TM'TM'TM'ML')ML')M')BM')BM')M'):ML')ML')FM &ҜFM &ҜFM &ҜFM &ҜFM &ҜFM &ҜFM &ҜFM &ҜMq')Me')M ')M ')M ')sM ')M 7')M 1')QMI'QMI'QMI'QMI'QMI'QMI'QMI'QMI'M')MY')$M ')M ')M')MY')$M')M')T5'zT 'qTMf&TMA&TMf&TV'+TMV&!L}'zHLP'qDf'VvHLfML')W*MW'&547632'6>*++'AD1-+db@ ')>61+8B8Y(Bw/.fV~)s'+VjFM f&ҜFM D&ҜFM f&ҜFV V'+FM V&0Ҝf'Vv$f +f'Vvf`M3')Y'V *u&a*f&*+@5&zF &q&T&V&+&,``k' u``P'qDXf'VvfW'bV T'ba.f&b+F<5'zF< 'qF<'TF<V'*V'bF<V'+F<',k' DuP'q&D9f'Vvpf'bDx)s&jV)fCQMIf&QMI'&QMIf&QI&+QMI&Z5f'Vvfsf'Vvf\M')ZsfvZ&'&547632(@cd*-0EA&,,)x./wB(Y8B8+16>)'o10!!otosn#/10!!nKn/10!!n$n/10!!n$/10!!&BBR@ { i 9190!67R`XhC7`b'@s i 9190>=!b`WC7a=?@  i 9190>=!=`WC7`b'&'!'iWa7#2@   { i i991<22990!67!67#`Y`XhC7aC7`b4@   s ii 991<<2990>=!%>=!3`V`WC7aC7a=?3@    ii 991<<2990>=!%>=! `Y`WC7`C7`b&'!&'!'iV1iWa7Ca79; 8@   s TRT  <2<21<2<203%%#5)j))jJ##R##9;a@5  s T R T <222<2221222<22<203%%%%#55)j))j))j))jJ####I####'` 10467>32#"&'.'535II245633JI326J235624IJ336633'AF'AoH#` 74632#"&pNOppONpNppNOpp` %462"&%4632#"&BppppdpNOppONpNppNOppONppNOppZ` #&@r! p$ $1<<220%4632#"&%4632#"&%4632#"&pONppNOpepNNppNNpdpNOppONpNppNOppONppNOppONppNOpp1  #/3?Kk@723030121*@ }}*}$F}4:2p0${L C= I17!'73-L12<<2220KSXY"2#"&546"32654&"32654&'2#"&546!3#2#"&546"32654& Z˾˾@77@A88@88@A88A˿NZ;ʿ˾A89@A88dߋe-d 1^ !-9CGS^2 &546"32654&%2 &546"32654&"32654&'2#"&6!3#2#"&546"32654 տ˾@77@A88D˾@77@A88@88@A88A˿NZ;ʿ89@A8dddߋev-ds-@ h291905s+--@ h<91905+-AB&T%>32#'#4632#"&67654|id; ypNOppONp_DA""B)NppNOpp\tM B0Bf&""T&"T&"=H27654'&#""'&7632KKLLeddedeed<<==<<<<@nnnnnndnn, 4632#"&3!53#5!vG32FF23G`b__>-==-+=32#"&'53327654'&#"#*f9yffeMSL,-W]--,,Y0&%!?[MKKP((76om67$R?,67632#"'&547632#&'&#"27654&">*2354&'5BcXXcB4н5BI_!53#5!676323!534'&#"3_bbH)65Qu;Cķw,16wܭ(u "/;37367'"76!3 !73 4&+3 #"'3254#"(/k$@zciE"wv3KMiF323!654'&#"F}S}G-l Uk!tx}_TjCl=JyF0,4OR 02"&6&"26!!463"!#7265#5!'y[WUZ[ZYZ8XCCjQvupwRxxVWuw 9PQ3ӊ9PSy(@G$  & "s)! ]!]]'#]% ] ])22991<<22<229990!#5#3!53##%3#3!53#3!53#55LVVKVVVqVTTմb`PPb%R`PPgPPR\\!!#! '5!#5! 4>ݜǢވ?>8}5 5)3 }\}<A`3.Lm46$3 !"$'3254#"3!46uD~y}|3 #"&'332654'&'3!53>7'#>54&#" d,S33J|tket 4\yy,GE+\if3gd.` /;676'&'32+%5#";5&'&76 ) !/=?/닪ml/>=0ꋩlmpUUp83gd.;@,+\if`F.dg3\t@fi,V332#"#6$3 ! $V+ک' zI@AoA@__TD332654&#"#>3 !"&Tkz}r~puo4Lxȃ'**ڳL?8 !#53?`4_4  !#53% 4_4uh8 5!3#u4_4(4c c4 3%#54c c4`4_4Lh83#!#534_44_44c c4 %#553%4c c4 *4_4v4_4.< %'7~%J%؜E%J%~< %'%7%E%J%~<E~%%5j 7%'%E~%%5T5%%~.j '75%%~~%J%L?w!!'!#53!l̇l~4_4wKK( uhw!3#!'!5!0l4_4.l4wK4c c4K(n]#67>3'.'"'"&/'7"Y,-X"AWVBll"Y,-Y!BWVBl~%K%"$#"ACFBml"$#!BCGCl%K%~WF#7%7%#&'.#'7>727>l%K%~lBVWB!Y-,Y"llBVWA"X-,Yl~%%6lCGCB!#$"lmBFCA"#$L?8!###5333?Z44_4744 4!#5553%%4 4474_44uh85!333###u474_44(44c c443%%#55544c c44Z44_474LP;!#53!4_4:( 7 dh; '57!3#+ƍ:4_4(ɍ 4c c4L?8 3#!#53c<4_4  %!!5!53% Ă4_4uh8 #3!3#QĂ4_4(4c c4 !5!!%#54c c4<4_4%!!5!5553%%4 474؂4_4(4L?52#!#53!264& 4_4k%44ܵ 4J4uh"3!3#!"&63%44%k4_44J44c c4L?!546 +#5!#5 3264&"!6Yʂ4_Y%44J48Y 4J44%uh3#!#5#"&6 )54&"34_4Y64J44%8c c4YY%44J4Lh8-2327623276;3##"#"'&"#"&+#53'$'3;;3'$''4_4:=QFGZGFQ=:4_4&44&4c c4ZZ Lhw3#!'!#53!4_4l4_4nl4c c4K( sK_ %'7ԃF ! M^K43dF' !#!#534_4A   3#!#4_44c c4 #53!34_4  A  !3!3#4_4 4c c  %#5!5!4c c4I 4_4-m^4 #53!34_4 m!4."7#5676$ aĨ1 ?N < FbaaT8>p4_4u}l!#4$ 7#5&'."ܜ < N? 1ĨaF l}u4_4p>8Taa<5!!1'7j~%J%ќE%J%~u?'a^bc#"547327654''7kkkkkB?%J%Vijllkt[$J%c'7%'327654'7#"'&54%J%?BkkkkkB%J$[tklljiF(?853!F 4<( F?!!#FĂ43%# 4#5<4 u(n8!5!3n<4 (4un#!5n4 43%4/Ă4#53 4/ 4<Lh'^ ZZ'^Lh' ^L2?'  >'>u2h'>'>F,n'9>8F,n':8=L?w!!!!'7##53!7!,B-G,84_48ȉB-&&wKyôKy ZZLhw!3'3#7!'7##53!!!%!7',84_48G,84_48dG&&-,Bo&&wKyc cKy ZZZZuhw3'3#7!'7!5!7!5!!7'0,84_488G,\BtB&&wKyc cKyôôZZL?8#53!!!84_48VX&&y ZZ53'#'#= ZZV84_48&&Xuh8'3#7!5!7'!584_48&&Xc cZZ7#5373wc cZZt84_48VX&&Lh8'3#7!#53!7'!84_4884_48R&&z&c c ZZZ7#553'%7'wc c ZZZt84_4884_48Rz&&&./'77%J%[%Kх%J%7K%['7%''/'%J%7K%[d7%%K[%jk7%'77?7(7%%K[%[%%7%[K.j/k%'7%%7%[K7%J%[%KL?%#53!!!!!!!4_4)Gw$S$ yjjuh%7!5!7!5!'!5!'3)$S$wG)4_yjjy L?83#' !#533JK4_4*Y+Y uh833#!' #5374_4KJ4c c4Y+Y!#!5!5!5!53%!!!! P44_4P3!!!!%#5!5!5!5!4c c4jP̂4_44PL?8#5!#5!##53!#5wt4_4< #53#53#553%#53 VJt4_4uh853!53!533#!53=VJt4_4(4c c43#3#3%#53#4c c4t4_4<u?8!###333!?474(44u?8!333###!u47444L?8!55!!#53d=_=;EE %3'3!#53#EE dd=_=uh8!7'!!53#5d=_=EERc c#7#%!3#53EERc cfd=_=%5!!!'3'3!#53#dEE dd^SdS=_=+ %3!53#53#'3'3#!5#c^ș dEE=_=d22+ 3'!3#!5#73!53#53#3'E77Ed^ș Py7722d=_=Q+3'!5#73!53#53#3#E;d^ș ŸEy12d=_=OϺ2)#57#53##3'373!3'3c cDD JEE>==_==;H>+%%3!53#57#53##3'3733'3#!5c^ș cDD EED==_==;z 22uhg #3!53#577'!5#35o=_=d22șc cdEE&"3!!%'7ٜ~%J%x؜E%J%~!5!7%'%{ 'E~%%5sx؜5%%~3#53#53#7#3'3cc c EEEE=_=`=_=<(uh8!)5!6762!3#!"'&')276%!&'&"ug/XX/4_4/XX/3333(9.XX.94c c49.XX.93333ZZ'^uhJ 5!'3#75!'3#75!'3#7u<4[4<`<4[4<`<4[4<ܼ ۼܼ ۼܼ ۼL?8!#!#53!3?O4_4 uh83!3#!#!5!4_4O4c c4Lh83#!#!#53!34_44_4M4c c4 L?8!###!#53!333?jP̂4_44P uh83!3#!###!5!3344_4PjP4c c4Lh83#######5333334_4PЂ4_4P4c c4 L?8 %!#53<=_=Pn uh8 75!3#=_=>n4c c4Lh87%!3#!#53'`=_==_=>Pn4c c4   3#3pT+LF)=@'! '!* $$*991990>54&#"#"&54632#"&54324&#"324,,:*:|fMHeMIecBds<+@lFWt|uy A !5!!5!!5AO55+ A!'7#53#5!!5!73 !A|A2?}l&lnB2=ll`+<3"3.zN]vlQK~F\E`]XD_#|F-{=LJqXUqtq}밸urKL /=@-$ '! !0 $`*`09999122999032654&#".#"326#"&54632>32#"&-{N^ulQJ|.zN]vlQK~E`]XD_]1KLoYVqr$LJqXUqtE}밸u찷qr%!3!0r%!3!048#e8+ '37#J樢֨Jc|8c###cee8#'3737#w怢"怢O#T65J!!! 5EGT5J!!!5fgwT!#4."#4$ o޾o(\(oooo~(خ32>53 $5o޾oج~oooo~ج(1q)*@$ *'! de!d*91026732#"&'&'&'" #"&54632VfbwL>.> c ('8z`yNB2F KbPfbN>J?(:1' 1 '@'  4632#"&!!X=>XX>=X=XX=>XX{ 4632#"&4632#"&!!X=>XX>=XX=>XX>=X)r=XX=>XXZ>XX>=XX!{ #/34632#"&4632#"&4632#"&4632#"&!!X=>XX>=XX=>XX>=XX=>XX>=XX=>XX>=X)=XX=>XXZ>XX>=XX!=XX=>XXZ>XX>=XX!{+#"/&#"5632327%4632#"&4632#"&ۿe)__)eX=>XX>=XX=>XX>=XrD9Ψ9D=XX=>XXZ>XX>=XX@#"/&#"5632327ۿe)__)erD9Ψ9D@532?632&#"#"ٿe)__)erΑD9Ψ9D!!#"/&'&#"5>32326]e_ aM``d_eMUS: BGJVQ9 DH-!!#"'&'&'&#"5>32326]e_  aM``d_eMVR9BHIVR9 DH9\@/5470-7),! 0 )077!:54,:<29199999999990#"'&'&'&#"5>32326#"'&'&'&#"5>32326]e_  aM``d_eM`]e_  aM``d_eMoUS:BGJVQ9DHVR9BHIVR9DH- 4632#"!!!!pNOppONppoH 4632#"4632#"!!!!pNOppONppNOppONIppohppoH 4632#"4632#"!!!!^pNOppON pNOppONpIppohppoH 4632#"4632#"!!!!pNOppONpNOppON Ippohppo$ 4632#"4632#"!!!!pNOppONppNOppONppoppo.$ 4632#"4632#"!!!!RpNOppONppNOppONppoppo. >@"      <291<2<2.990!3!!!'7#5!7!Vb5}I !!!!!!r $@   <2291/90%!5 5yPP $@  <<291/9055%!!y!"3!!"$$3ooooج(o޾o(\(35!2>4.#!5!2#oooo(خo޾oج !!!#'7&'&$; #"-gY.-(gJ!ooo_OV(\(Oo޾7 35!!5!3+'7 32>4&'&+gY.-خgJj߉ooo_8OVجOo޾7Q7!!!"3!!"$$3ooooج(7bo޾o(\(Q7!!5!2>4.#!5!2#oooo(خ7^o޾oج !#5332>53 $5b<4=453 $54632#"o޾oجpNOppON~oooo~ج(5ppo 3##5#53532>53 $5o޾oج~oooo~ج(%!!!!!!5!!6Q 7!!!!!!7`Q 7!!!!5!!7b63!#!!3!6 #+$  $!676767!%&'&'&'ج(\(c/,_77_,//,_77_,/\(جb7_+/0,_77_,0/+_7 $  $!2676!&'."ج(\(b7޾77޾7\(جb/+_oo_+0,_oo_, !$  $7'2%654'7&"ج(\(m33i\33\\(ج\jk\3\kj\j3 $  $ 32>54&#"ج(\(?\joo\koo3\(ج3ooj3ook\ !4632#"2>4."$  $pNOppONo޾oo޾(\(4ppo,޾oo޾oo%\(ج*&"265$632".2>4."$  $7O66P6lgՏo޾oo޾(\(86Q56'jgi޾oo޾oo%\(ج)'#'7'7372>4."$  $bbbTo޾oo޾(\(XZZX梇޾oo޾oo%\(ج!!!!&2>4."$  $Po޾oo޾(\(B/޾oo޾oo%\(ج!!&2>4."$  $x`o޾oo޾(\(޾oo޾oo%\(ج !)!!!!!!((( ((( !!!!6(( %!! !  !g~cg 4632#"!!!!pNOppON64ppo6:3!!#:#!5!:+{z!!#!||^35!3!^3!!#[ 3!!!!#[[NM: 3!!!!#NM: !#;!!#:!#3#;!!#a+ 3!!!!+3iNM:3!!!'!#coubb:3!!!!!'##7!?p(R*n9RUNbRbLM:!#;3!!#''˼luubmb!#;!!!!!'7#7#?#L?8`RG>))RNbRb[Xర V    104632#"&pNOppONpNppNNoo 3 %! \ !C|7!#!7xV!#5x7!3b"Vx!53!bx!#{hI,$%%$nn!"nn 8ʸ'+6@KV#"&6 3546 +32 &=# &6;5#'54&#"3!3264&#"32654&#!#"3265˭ʏʭʏeHGeeGHefGHefGHefGMGeeGHe`ʏʭʏ˭GffGHefffGMGeeHGeeHGeeG!3!h{q4732#"&'&'&'"bwL>.> abP-( #"&54632267bwL>.> a(}@bPqT !!!!%!!Pr6L+x  #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4#"=43+"=4;2+"=4;2"=43!2#UݓJIIJ%J%%J%%K$$K%J%J%%J%F%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%%%C%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%$%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%$%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%%%%%%*$%%%J%%J%%K$$K%%%%%JJJI%%I&%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%J%%%% %I%HJ%%J%%J%%J%%J%%J%. !5!!!!D.bb(!(! !! $<.3!3.b;(;!O;!O ;!O;!O;!O;!O;#!O#;(!O(q(!((!((!((!'(I(!]((!((3(:(' q( #'+/3!33!33!33!33!33!3mnmnm;(%8K#!1!!!!!!!#!1!!!!!!!#!1!!!!!!!#!1!!!!!!qlllllllllmmm((((;(!%)-13#3#3!3!##!#3#3#3#3#3#3#^^(ll(lm#;(#q:(!&9'(9(&&  9(&  9(&& 9(& & 9('9(&9(&& %! %!!!,7r+uv ))xxp) )$7632#"'327$%&#"%632#"'~~~~eMM>yJJJJJ6````qq|qq#u"@91990  9%-p) 327$%&#"%632#"'MM>y````qq|qqr' '/7?G%&'&'6767&'&'7%'676727"'64'7&"'62&47\+;.81F9K58.42d;E9G,:.80G9J6&8.;+d1O9FLL&_`JnLL'`_n<1& j(0=Ju &,A=N:0('<1& j(0=Ju &1<>EB0(n_II'[[JnII'[[p) %/36%632#"'327&#"6767&'&6py AAAA,+-,,-+A@@Rqq|qq%%mܱ[0$ %@%|"p) )73276'&#"7632#"'327$%&#"%632#"'r99:9rr9:99XWXXXXWXMM>yB!!BB!!oe33eje33````qq|qqp $  $pkk]Ak^p $  $27$%&#pkk]<MAk^a``p $  $"3pkk]<MAk^``p $  $327$pkk]\MMAk^>``p $  $%&#"pkk]Ak^>``p $  $"327$!pkk]<MMgAk^```p $  $"!pkk]<Ak^`p})6%63"'pRqq)#2y|q*q( 2654&#"!|~}}|v< ( $%632#"'327$%&#"!IMM>y_O````|qqqqH( ( !#%&#")%632OyyMMqq>~``  3327$3!#"'$@1>qq``) %63"æqv`) 2#%&#u)q>` 527$3Muyv`>q "'$33yuMq`p)%632#%&#"puqq>``p03327$3#"'$puMMuyy``>qq!% !% !%! !%!$3! 2654&#"4632"&nȊce;~|ddcc||}%!%!!d r<%!%!!We r<%!%!W7 r<%!%!W7 r<% !%!!!!+c,b r<<!% 4632"&! W>>VV}V2 j>VV>>VVJ !%! c  !%! b  p(  7& $  %;<*X֖% !!!!!!,7,rWb<)) Ie% !!!!%!!,crWbM)MM^??@7`d?\gOOOOy>*<?v^  <BHNTZ`fl3264'&#"&7367'67675673#''5&'&'7&'677&'67'%%&'&'%6767%&'0/CB^0/AC/88pkTcR|NOOfUip88pqUfONNQaQh!$ b)dLQk KRt!% c'd&//^000NN|P_Pfp88poQ`QyNNP\ Qgp88pmQ \Py,  M N>&`7" bK*V&"g{ M M !)1a + 0,+0$++A & 6 F V f v ]A ]A]A)9IYiy ],и(и(/A0&060F0V0f0v0000000 ]A00]3 +++&"+&"*и&.01! ! 3254#"&#%#7&'67&'6767KJ]_VNEWMCe2ntjnti7IL6a] ]pu otpu ot !)1a + 0,+0$++A & 6 F V f v ]A ]A]A)9IYiy ],и(и(/A0&060F0V0f0v0000000 ]A00]3 +++&"+&"*и&.01! ! 3254#"3$3&'67&'6767KJ]_TNEAgntjnti7IL6a] Uypu otpu ot %ͺ + ++и/A]A)9IYiy ] "и"/' + ++ и / и$01! ! #$''&'6%&'667KJOR`7IL0c Z    "*2:AIXY/Z/ܸܸи/и/Yи/и/BиB/CиC/EиGиG/LAL&L6LFLVLfLvLLLLLLL ]ALL]F/H///W+$'+$+и'/013#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"sNN99=>-1\ H0e%FKSwZGr=;=NN$E| 1 ?'_>?@7`d@\hPPPPy?+<>w_VG{?,rCA0:1@!7+7 + .++..9и  и /к.9A7&767F7V7f7v7777777 ]A77]7!и+=и.B /"/+/-/ / + '2+':+:2'9и и и/2'9017#'#53'&'&54767&'&=33676=3#32654'&i($lm$(($[Uu&tU[$&uU[[UV$|ddb e|$% ZSSZ %_TYYT* $+++A]A)9IYiy ]A&6FVfv ]A]и/"и&/++ #+ #ии!и!/014&#"326&5432%##5!&w衤礡PP䤣L~~| * $!+ + +A&6FVfv ]A]A ]A ) 9 I Y i y ] и/и/&/+ + + и/ и/ 01"32654&'#5!3%#"5476礡𳉧פ㤤ף |~~L #+%+01&$76+"'&5'476%7!ttsstEus pid5s qttrtt<֤ꧦg\ul9S//и/A&6FVfv ]A]9ܸܸ//++0152654&#"#43233#!5 z{ym㗗yyy{(|jǸ /!/ и/и ܸи!ܸA]A)9IYiy ]и/ ///+ + ик  901#53533#632#4654&#"#*jjoon}mZyH{zF2 4˺+ + .++. ܸ"и$и&и (и+-ܸ0и+2и.6/$!+$ + &+&$'и&)и$+и!-и /и1и301"32654&7#"&54767!!53#5!!3!!#3!!8OO87ON=0LmkL/>Λ2  1O79NN97Os0LllllL1KӘJJ-'< ++4)+4к 49ик 49 49" 49#A))]A)))9)I)Y)i)y))))))) ])+и+/, 4942и2/9и4>//:+:и:к 9 99999"9#9+9,9192901%#5#535&'&'5'73'3#'73'676=35'73'33◰zhNgeMjzzTThOʍ7NjYYӖy?//и/и/ܸ ܸиA]A)9IYiy ] + + +01! #!!!'!27674'&#.d ;6zFH%QM_\ǃ$P<C#+///"/01#"'##56'##"/547?^'5@_*SU&/UL ;Yԧ9UP(` XI.s2Q3/4/ ܸ!ܸ и /3и/ܺ+ 9/&+и&/0122732#&547636=4'&# #4'&#"*t pz&=<xQ>hG:V Hek%PF5NP B|-&pA&NFX // 901 &&5 <F:^;" V gdG7C+///99 9/901236;2"##'65##"'&5476;235&'&=476e x<JT`(GeRUdfB3 VNT9D///4 +4 к#94+к=9>901+"'##56#+"'&575477;2732;276=4'3&'"~V"0b*SV*8UiQ"_|Q )w`SgA ? 6N #euB? gIo5 F(pZRw// /9012367632#&5476(t*#\l~ ΨT]1klSI|-X //01 &47E osU H2`g+Z+N+99V9AZZ]AZ)Z9ZIZYZiZyZZZZZZZ ]i//^+J+J):+)и/) и!и),и,/:7и7/JAи:QиQ/:Sи:UиU/V:790126;2"##'65##"'&5476;2&'5476&+"326733276=4/#"567654'&#"35&5hr=)\"IfRUdgC3&=cG kv ==Nr%SZU 6vk 6)S<F98:d  mOE:R p&i  C]&'Ax.+0 nM,W`c%+///9013#"/4?23hH0#!cZ-@o3+///99013#'654'&'#"54732XWz=\9`Y'6?F` 1TFG*֙-@x/e/ /и/и/ ܸи/ܸ//99901#"=4?2%#"=4?26ձ'VQܖCت+YP*~: ۉ8z"Co//ܸи/ ܸи/ܸи ++ +и/и/ 9901"'4723!# 5472!5kmOdXX[;Z$}@Ϝ"  ++к 9A]A)9IYiy ]// /+ 9013363'$6'"-8 w?WXc1 0 // и /и/ ܸи/иܸи/ ܸи и//// /99 9 999013%#'#3%#)N(4/c}4(,=++и ܺ 9ик  9ܺ9к9и!и%и&и'и+и(и)и*к, 9////99 9 999999&9*9,901377#'#'547#5773%%.wwzy.**  <<7CA<<{8AMtuh8 !53#5u=_=c c#u ! ! j.u-1! !pp ! !p(53'#'#'## ɩj55j4_4)wo ?G(#5337373(7 7j55j4_4)G? owc#5676$  '&'72>4."7# ?N < ć-'TĨaaĨ1 &4u}lN!1aĨaaT8>p4_c# #5&'."2767 $$ 7 1ĨaaT'- < N? &_4p>8TaaĨa1!N < l}uuO%-5=53676$ 33## $'&'!#676765#35%3&'&'&u2N < N2܂4_42NN2%#T0C 0T#%#T0 0T#(`VV`4c c4`VV` 0T#%#T0 0T#%#T0L 8 !#53 4_4 u ,8 5!3#u d4_4(4c c4L ,83#!#53 ق4_4Ƃ4_44c c4 L 8#53!!!84_48 && ly ZZu ,8'3#7!5!7'!5 84_48 l&&c cZZL ,8#53!'3#7!!784_4884_48R&&J&y c cwZZZL 8 3#!#53 'x4_4 u ,8 #3!3#Q4_4(4c c4L 8 #53!53#=!84_48>p&&y llôZZu ,8 '3#7!#3!7' 84_48&&c cllôZZu ,8!3#!' !5!794_4KJ{**4c c4Y+++Y,@ ,,+ ,,@' , ,, ,,@' , ,,+' , ,,@' ,' , ,@ ,@' , ,@' , ,@' ,' , ,@' , ,@' ,' , ,@' ,' , ,@' ,' ,' , + ,@' , ,+' , ,@' ,' , ,+' , ,@' ,' , ,+' ,' , ,@' ,' ,' , @'  ,@' ,'  ,@' ,'  ,@' ,' ,'  ,@' ,'  ,@' ,' ,'  ,@' ,' ,'  ,@' ,' ,' ,'   ,@' , ,+' , ,@' ,' , ,' , ,@' ,' , ,+' ,' , ,@' ,' ,' , @'  ,@' ,'  ,@' ,'  ,@' ,' ,'  ,@' ,'  ,@' ,' ,'  ,@' ,' ,'  ,@' ,' ,' ,'  +'  ,@' ,'  ,+' ,'  ,@' ,' ,'  ,+' ,'  ,@' ,' ,'  ,+' ,' ,'  ,@' ,' ,' ,'  @' '  ,@' ,' '  ,@' ,' '  ,@' ,' ,' '  ,@' ,' '  ,@' ,' ,' '  ,@' ,' ,' '  ,@' ,' ,' ,' '  ,p ,p,p@' , ,p,p+' , ,p,p@' ,' , ,p,p' , ,p,p@' ,' , ,p,p+' ,' , ,p,p@' ,' ,' , ,p,p@'  ,p,p@' ,'  ,p,p@' ,'  ,p,p@' ,' ,'  ,p,p@' ,'  ,p,p@' ,' ,'  ,p,p@' ,' ,'  ,p,p@' ,' ,' ,'  ,p,p+'  ,p,p@' ,'  ,p,p+' ,'  ,p,p@' ,' ,'  ,p,p+' ,'  ,p,p@' ,' ,'  ,p,p+' ,' ,'  ,p,p@' ,' ,' ,'  ,p,p@' '  ,p,p@' ,' '  ,p,p@' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' ,' ,' '  ,p,p'  ,p,p@' ,'  ,p,p+' ,'  ,p,p@' ,' ,'  ,p,p' ,'  ,p,p@' ,' ,'  ,p,p+' ,' ,'  ,p,p@' ,' ,' ,'  ,p,p@' '  ,p,p@' ,' '  ,p,p@' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' ,' '  ,p,p@' ,' ,' ,' '  ,p,p+' '  ,p,p@' ,' '  ,p,p+' ,' '  ,p,p@' ,' ,' '  ,p,p+' ,' '  ,p,p@' ,' ,' '  ,p,p+' ,' ,' '  ,p,p@' ,' ,' ,' '  ,p,p@' ' '  ,p,p@' ,' ' '  ,p,p@' ,' ' '  ,p,p@' ,' ,' ' '  ,p,p@' ,' ' '  ,p,p@' ,' ,' ' '  ,p,p@' ,' ,' ' '  ,p,p@' ,' ,' ,' ' '  ,pp p,p@' , p,p+' , p,p@' ,' , p,p' , p,p@' ,' , p,p+' ,' , p,p@' ,' ,' , pp@'  p,p@' ,'  p,p@' ,'  p,p@' ,' ,'  p,p@' ,'  p,p@' ,' ,'  p,p@' ,' ,'  p,p@' ,' ,' ,'  pp+'  p,p@' ,'  p,p+' ,'  p,p@' ,' ,'  p,p+' ,'  p,p@' ,' ,'  p,p+' ,' ,'  p,p@' ,' ,' ,'  pp@' '  p,p@' ,' '  p,p@' ,' '  p,p@' ,' ,' '  p,p@' ,' '  p,p@' ,' ,' '  p,p@' ,' ,' '  p,p@' ,' ,' ,' '  pp'  p,p@' ,'  p,p+' ,'  p,p@' ,' ,'  p,p' ,'  p,p@' ,' ,'  p,p+' ,' ,'  p,p@' ,' ,' ,'  pp@' '  p,p@' ,' '  p,p@' ,' '  p,p@' ,' ,' '  p,p@' ,' '  p,p@' ,' ,' '  p,p@' ,' ,' '  p,p@' ,' ,' ,' '  pp+' '  p,p@' ,' '  p,p+' ,' '  p,p@' ,' ,' '  p,p+' ,' '  p,p@' ,' ,' '  p,p+' ,' ,' '  p,p@' ,' ,' ,' '  pp@' ' '  p,p@' ,' ' '  p,p@' ,' ' '  p,p@' ,' ,' ' '  p,p@' ,' ' '  p,p@' ,' ,' ' '  p,p@' ,' ,' ' '  p,p@' ,' ,' ,' ' '  p,p' ,p p,p@' ,' ,p p,p+' ,' ,p p,p@' ,' ,' ,p p,p' ,' ,p p,p@' ,' ,' ,p p,p+' ,' ,' ,p p,p@' ,' ,' ,' ,p p,p@' ' ,p p,p@' ,' ' ,p p,p@' ,' ' ,p p,p@' ,' ,' ' ,p p,p@' ,' ' ,p p,p@' ,' ,' ' ,p p,p@' ,' ,' ' ,p p,p@' ,' ,' ,' ' ,p p,p+' ' ,p p,p@' ,' ' ,p p,p+' ,' ' ,p p,p@' ,' ,' ' ,p p,p+' ,' ' ,p p,p@' ,' ,' ' ,p p,p+' ,' ,' ' ,p p,p@' ,' ,' ,' ' ,p p,p@' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ,' ,' ' ' ,p p,p' ' ,p p,p@' ,' ' ,p p,p+' ,' ' ,p p,p@' ,' ,' ' ,p p,p' ,' ' ,p p,p@' ,' ,' ' ,p p,p+' ,' ,' ' ,p p,p@' ,' ,' ,' ' ,p p,p@' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p@' ,' ,' ,' ' ' ,p p,p+' ' ' ,p p,p@' ,' ' ' ,p p,p+' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p+' ,' ' ' ,p p,p@' ,' ,' ' ' ,p p,p+' ,' ,' ' ' ,p p,p@' ,' ,' ,' ' ' ,p p,p@' ' ' ' ,p p,p@' ,' ' ' ' ,p p,p@' ,' ' ' ' ,p p,p@' ,' ,' ' ' ' ,p p,p@' ,' ' ' ' ,p p,p@' ,' ,' ' ' ' ,p p,p@' ,' ,' ' ' ' ,p p,p@' ,' ,' ,' ' ' ' ,p puh83!333###!#!5!M474_44}44c c44uh8!33333#######!5!33Ђ474_44PP44c c44L?8#53!53!!!!#=!84_48gG&&y llôllôZZuh83!'3#7!#5!5!5!5!!7'g84_48&&lc cllôôZZLh8!'3#7!#5!#53!53!!7!7'84_4884_48&&UU&&c cll llZZZZuh8#3!333###Qʂ474_44(44c c44L?8 #53!53#=!84_48z4&&y llôZZuh8 '3#7!#3!7'84_48&&c cllôZZ3!!%#5!5!4c c4O4_4!#!5!53%!! 4_4OT`'#'##53`yjjy )$S$wG)4_T`#53373` yjj4_4)Gw$S$L?8 !5#!#53?ٴ;4_4 uh8 5!35!3#u'ł4_4(4c c4L?8 !#53!!5#!54_4 uh8 5!3#!5!35!4_4`(4c c4dh;53333###!53!'573>474_44ƍ:+(44c c44ɍ nh8  +24632#"$4632#"$4632#"$4632#"3#B2/EE/2B2/EE/2B2/EE/2B2/EE/24_4ebDD10DCbDD10DCbDD10DCbDD10Dc c!55!5!!%44474%!!5!5544474dh;3!3#!##'573M4_4ƍ:4c c4ɍ dh;333######'57333Ђ4_4PDƍ:DP4c c4ɍ dh; '57!333###+ƍ:474_44(ɍ 44c c44dh;33333######'573V474_44+ƍ:+44c c44ɍ dh;%33333#######5'57533Þ474_44PöꍶP44c c44嘴 uP; !!u:7 7d?; !'57!?ƍ:(ɍ uP;!5!3#|:u:u(77 7d?;!!'7#'573'7|ƍuƍ:uɍɍ ɪL?8 !#53?T4k4uh8 5!37'#u4k4(4nn4L?83#!#53!c04k4uh8#3!37'#!QЂ4k40 4nn4.j%'%'7~%%5~%J%5%%~r%J%~.j %7%'7r%J%~5%%r~%%5~%J%.4%264''7 'J4~%J%j[[4Jj%J%~ZZ% &7%7%2[[j%J%~4JZZk~%%5J4j&"%'%&6 J4k~%%5[[4J5%%~kZZ.j4'6 '764&"[[5%%~k4JZZ~%J%jJ4<% '''77'7%'BB~%%%%~؜B%%~~%%<%' 77'7%'7%'7'B%%~~%%<B~%%%%~j7 7%'7''77B~%%%%~TBB%%~~%%.< '77''7BB%%~~%%BB~%%%%~< 7'%7QǜǜQT蜵< '! 'QQTQ9Q< '7'7%'%77%'7'c~%%~E~%%WQ~~%%Ӝ%%~ӜQ< 7%'7''7%'c~~%%~9E%%~Q)~%%~~E~%%Q< %7'7'7%''ǜ~%%~Q؜~~%%Q<  '7%'7' ~~%%~QT9~%%~~cQ< 7!''7%'!'7ǜQE%%~~%%~E~%%%%~~<  ' '7'7'7%Q~%%E~~%%QE%%~~~~%%Wh8!3#!&'&'&'767672%4_4WB!,/+,Y"llAXVVWA"V4c c4CB!$"lmB##CA"%+53%#!5!26 <FdGa4_4d+4&#!5!2%#5dF<ġ4c c4WFd4_4-g2653#!#53Fd4_4dF< M!3#!"&53a4_4d4c c44.'75%%~E`66`EY}EE}~%J%E£EYo%.>7%'.Y}EE}YE`66`E~%%YYE£E5%%ie> ."'7XZF¤D4$&X~DD~XD`66`D~&J$O6K .'72>7%7%XZF¤D$J&jX~DD~XD`66`D~&$OK%5!%'%."'> ~&$4D¢FZԟ#4$&~D`66`DX~DD~ie !533##5#5> ."'7eIXZF¤D4$&IyX~DD~XD`66`D~&J$w ''7327676'ܬ?C%I%]s*4[Hkk%I%@B Hk,k,w327'7%' ؛kkH[4*s]%I%C?kkH B@%I%Wc#767%3 $2>4&'&'#'-1B4u}l@aĨaaT8>p4T < N ?N ĨaaĨ0! ˺ 0c#767'3 $2>4&'&'#7l}u4B1-@aĨaaT4p>8T < N? N ĨaaĨ0 !0Lh 5!3#!#53u4_4EE4_44c c4  Lh !#535!3#?`4_44_4b h4c c4Lh !#535!3#?`4_44_4 4c c4uh8 533##5#5'5!3#xd4_4I4c c4L?8 533##5#5!#53L`4_4I uh85!'77!3#!''7ulmyymh4_4myym(lyyl4c c4lyylLh8'/3##"'&'##5336762)&'&"!2764_4/XX/4_4/XX/_33334c c49.XX.9 9.XX.93333%47675553%%"&6264&"-X.94 49.Xfff~X.x474_44.X~}ŐfffFn8 #!53n4 4 4 Fn8 #5!34k4 ( 4  #53% 4 / 4k4 53%# 4 <4 4F(n8 53!3F 44 ( 4  3%%# 4 4R4Fn #!#5n4R4 4  #553 4 / 44 u ?8 #333!Q74(4u ?8 !5!333#c47(4 !5!!%#44 %3%!!544u? !!###3Q44u? 3###!5c44 #55!5!447 %!!5!553474F ?8 3#!53!c 4` u n8 3!3!#u`4 4  3%!!5! 4 5!!%#4 4F? 3#!#5!c4 un 3!#!#u4 4 !5!53! `4  5!!#5 4 4`F,?'9:8';<8u,n'=>8'@8?F`n 53!!5!'3F 4bakTFbakTF323#'&#!534&#"3F@}wdEUkdy#x}_Tly5i#y`3353#5!##5!# 3#4'&+3`y-ٓydgyyy!yy3FyF)53#5!#5!#3#'&#!533swd}cy#xyyly{XL35!#!!#4'&#!L{5{ydhA6HF'35!#!!#'&#Hb5wcwdy9+wn`3#!35!3#!5#VJݽyyyydF'!3!53#5!#!53#?{yy5yy`D 6%676764'&#"!&'&'&'&547673%6O c7>*2Bl:|CCJ2hh4*>:Y+ϞOh2JC;>k-HQ]o066XA,~fpgnG99NvX6/7\+%%#"$54$75367673#"&54632+|id; ypNOppONpDA'""-BNppNOpp<\tT "%4&#"326.#"3.546323pNOppONp|izwnw yNppNOppY""++T "*'"3  767&'&54763276726&"=}% LY>\[Z\2>;+ 8#_+3G.tO 99 KTX@88Y1 <990 KT KT[X@878Y4632327&54632#"&tW<OlLj[OlL=8)|MM6bR6MM}((?5l@3+5 A6<<@%3$1+-,/45$<<1@/ $(# 04, 3/<222<2<2220!3!53#5354632#.#"!54632#.#"!!3!53B:TNpJFPHTNpJFPH :yy5yNLsNLsyyy?"l@4"  JH3 5 F5A#<21/<2229990@ $$/$$$]#.#"!3!53!3!53#5354$!2p xi˘avVZVRyy5yy5yL?a@/    J H5 F5A<29991/<222990@ /]4$)3!53#"3#3!53#53$2ӘXseyy+Vyyy5y@;|@3+5 A<<<@ %3$7+,5:5$<<05-25351@5 $(# 6:.2, 19/<<222<2<2220!3!53#5354632#.#"!54$!2#.#"!3!53!3!53C:UNpKEPHavp xi˘yy5yNLsLVZVRyy5yy?6u@/3.+6!5.%&"A7<<@ +5<<Ķ5 5 1@  #6.2+* !%6  /<<22222054$)3!53#"3#3!53!3!53#5354632#.#"$2ӘXD:UNpKEPH'Leyy+Vyyy5yy5yNLsA23!53#535476!!32673#"&5#535&'&#"B:p~Lp&,:@>ڜ "%Xo1P'Ryy5y[g 3myuDVZyQ"&:\^XV7332654'&/&'&54632&74$32!!32673#"&5#5354&#"#.#"!"&`qls%#jIJ.1FGC(,:@> ܜPQ:g.q lo@SѠc)w}KF@#"%*LL`))+`pyuDVZy]ewX- mnEB6>%52"& 32654&#"3>32356$54$#"tBpNOppONpy wnwziB>OppONpp͂+"L$`R%V&`'`(`)V3*`3+``,jV{-`3.`s/V{0Z1V2`3V4`5L67F8R9 : 3;<L=TDD/FETDFThGTDH?IT9hDJ?KFLh9=MFNFOFHDPFDQTDR/VFDSTVhDT;LDUX-DV1qW/'X'Y 'Z'[9'\HF']L`R`<`L`3V```3LV{Zq#V`2`V2SV 3A\)TAV(2S 'TcoEFU[FV DT,F'F'IG9V' F<' FU[ TD F' VETU`DT|'F'F<'`VD9DVV.'QI'LF~TD3Fx,T5.TV0!RE/Fb'"`(BP)`1T=#j#oZf!#fs |@  _ _1<20K TKT[X@878YK TK T[KT[X@878YKTKT[KT[X@878Y4632#"&%4632#"&X<;VU<32{oq{7:;6T @@ 1<0K TK T[K T[K T[X@878Y332673#"&{oTTq{7:;6m w  _ 10K TKT[X @ 878YK TK T[KT[X  @878YKTKT[KT[KT[X @ 878Y4632#"&mW<"wwvuuvu@E_<VVP^ Pp^ f+19Rsh/-Ro`Tjo55`^V```V``j``VPZV`V`F55 L/T/TTTq?T? FhF FwFFVT/T7;X1/H%%L'/?=RoVZZ9=XXXZ\555555F^V````````XPZVVVVVDFFFF`F/T/T/T/T/T/TTTTTTT  F  VTFVTVTVTVTVTV3/////5/T5/T5/T^VT^VT^VT^VT`TXT`T`T`T`T`TVTVTVTVT``?` ` ` /` F` F`Fjh`FF` F` F`F`tFPZFPZFPZF^FFVVTVVTVVT qV9T`7;`7;`7;XXXX111F/F/F/F/F/F/LHLHLHq?) `/^V^VTX `/VT`V`Pq=V* X?`&`F FIwFPJFVUVU UU /\XS|1$1L3\LHGGG`EJ.\\ ` {` #T i``F Z 5ZF5/T` VVTF/F/F/F/F/T5/T5/TFT*VTVT`VVTVVTGG h ` {` #TVT `PZF5/TFTDV35/T5/T`T`T ` 'VVTVVT`7;`7;F/F/X1`FSTLH5/T`TVVTVVTVVTVVTFaF1h@T@R5^&XHH`a`5/TTT/TLTTTTBnc~TBTThTT~T/FF F J FEBB F]Fw/w/wFiFVT}TV;;;7;7;FFhhXhqhRT|F1/oTF!FAFFHHGhJJJ\VFTFT*TJJT oTTI11E1P?RF]FLZZSS,Z&ZZOZOZZ7ZKZZjZZBB#om=WZVZ(ZZZmYl;!mmRZbDgrem>=@rPjmpjj5Z5KJ5``5<`L`V``5VPZqV``SV5 N\`(TcFFF(TPH2VTcFFVTFFI9FFVTFRTTbFF=`CVQFVTFQVTF==TF=TVVT^VT`8BkG^{V\=TRThVTT`/^VVU^V^V^V``6`]V``j - `G``~2`````` ```G`-V`V``^V~2V5 `N? %V XV ``]V L`./TVEFFUFTFFFF$FFVTF/TB7SFFFF#UnUW4l2TTFTX F h$F(FFF  `l V8TSc`FV<`F `F`FGJ?T `F W`F `xF^VTB 1 Bm?FH??` `F`FN?F F/T/TFT`TVTVT `FGG`F`FVVTVVTVVT]VW~2~2~2N?F`F `Unnnnn"nP 'P,nnnPPP_nnn^n PnIn3Jn n4"nbnyn nnnnTZZPy[ZZZuZ|F,ZZnhZZZeZFn^ZZZZ(nmZFZY2ZnZZZBZZZZZZZZ VTVTp6B<^<<<M6<[<ba<<699c6<0<Ue,VVVBVVVVVKVKVVfV0VVVVkVVVVV)VxVVV,OZ)VV< F VkVjVVKVVVV-VfVtVfVfVVVVpVtVVVVVV.V3VVV)VVVVLV7VLVVV5/T`/`/`/^VT`T`T`T`T`T`T`T`T`T`T`q?VT`?`?``?`?` `F`F`F` F` F` B` VwFVwFVwFPZFPZFPZFPZFVVTVVT`/`/`7;`7;`7;`7;XXX1111F/F/F/F/F/555 5 LHLHLH? TX5/T5/T5/T5/T5/T5/T5/T5/T`T`T`T`T` F` FVVTVVTVVTF/F/(T(T(T(T(T(T(T(T5555ccccccWE [ [FFFFFFFF   ; w  FF:1 dVTVTVTVTVTVT4z  GFFFFFFFF` | &QQQQQQQQs % 1o/{(T(TccFFFVTVTFFQQ(T(T(T(T(T(T(T(T5555FFFFFFFF   ; w  QQQQQQQQs % 1o/{(T(T(T(T(T(T(T55}55WWFFFFF `Yu@F&``KWTFFFFRRFF&HxQQQQQJ\ZZVRoRonnnb=bb=b/9/9''d 1133B=,1jRfCF999bzbB'_=VZ1jRfCF999bzbBVVVZV+ =(Q`+ NNEO\\`534uX9 HxHVHxHVHZH1HxHjHxHZHjHfx`` ``5  * P`5  `^V`V FF FF F  FTTwF `` %`^VTLuL..LunWLuLdLuLuLuLL_ -uFFuuLZLLuFFLLuLuL..LuLuLuuuLuuuZuLuLLuLLuL! FL))//V&&BHBHBB`<05511 !1/Ol- x''''''''''''''''''''''q''''''''''llgg'''''''''''''''''pprppppppppp7p7Tpp''''3'''ppppp'''',,,,,,,,S,,,,,C,,X,,B,,X,,x,uDu xL xu xL xL xu xL xL xu xL xu xu@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,@,uuLuLuLuTTLuLudndddddududLuLu.....W++-MEiOOi,LLLuLuLFFFFuuuuFuFuFuFFFFFFuuuuuLuuLBLuuLLP6A133//LL//LuuLL''''`?`FLH;`F=`\VTt???@?AX25`^V```V``j``VPZV`V`F55 L/T/TTTq?T? FhF FwFFVT/T7;X1/H5``5<`L`V``5VPZqV``VSV5 N\)(TPH2VTcFFVTFFI9FFVTFRTTbFF=`CVQFLTF=TTRF`8B`TjoZZm F F   FPZM 79k:;k<&:$7$9k$:$<$I$W$Y$Z$\$$$$$$%$&$'$6$7$8$9$:$$$$$0$1$2$3$4$5$r${ $ $ S$ T%&%&&%*&%2&%<%&%&%&%&%&%&%&%%&%&%&%&%&%&%&%&%&%&%&%&%8%:%&%&%&%%r&&''&''9(&)2))2)))$)D)H)R)U)X)))))))))))))))))))))))))))))))))))))))))))))+)-)/)1)3)5))))**&*--a--.k.$.&.2.8.:.<.H.R.X.\.......................................0.1.:/7Y/8/9 /:u/<}/\/////}///&Y/0/:}/z/{/~/1}1}1122K2292;333333$k3D3H3R3k3k3k3k3k33333333333333333333|344K457595:5<5D/5\55/5/5/5/5/5/5/5&555&5:5{566K6666 6"777777$777D<7F7H7R7Uk7VD7XD7Z7\7mk7}k7777777<77777a77Q77Q7Q7e77e7e7e7a7b7D7b7b777777a7k7k7!D7#D7&71D7|k7k7k7k8D88D888$8888899k992929$a929DD9HD9L9RD9X}9\9a9a9a9a9a9999999D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9}9}9}9}999D99D91}9{&9|9&9::::u:u:$}:DN:HY:L:RY:U:X:\:}:}:}:}:}:N:N:N:N:N:N:u:Y:Y:Y:Y:Y:Y:Y:Y:Y:Y:::::::Y:Y:::1:{&:|:&:;;$;&;2;;;;;;;;;;;;;;;<<2<<<<$}<&<Da<HN<L<RN<XN<}<}<}<}<}<<a<a<a<a<a<a<a<N<N<N<N<N<N<N<N<N<N<N<N<N<N<<<N<N<1N==IIII{I~AINRUkUDUzKU{KU~KUKYYY2YzKY{KY~KYKZYZ2ZzKZ{KZ~KZK[\<\\zK\{K\~K\Km-m7km&k}-}7k}&k79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T&&&&&K$9<:}}K9;K9;K9;K9;K9;K9;DD$DD$DD$DD$2$}&DaHNLRNXN}}}}}aaaaaaaNNNNNNNNNNNNNNNN1N&<zK{K~KK<zK{K~KK79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T79k:<IWYZ\$%&'6789:012345r{  S T&9&9&&7Y89 :u<}\}&Y0:}z{~7Y89 :u<}\}&Y0:}z{~O7Y89 :u<}\}&Y0:}{ } }  &79:<D/\///////&&:{kDzK{K~KK79:<D/\///////&&:{kDzK{K~KK  K  6   """K""6" ""&&&&&&$&7&D<&F&H&R&Uk&VD&XD&Z&\&mk&}k&&&&&&<&<&<&<&<&<&a&&&&&&&&&&&a&D&D&D&D&&&&&&a&k&k&!D&#D&&&1D&|k&k&k&k0D00D000$00000::2::::$}:&:Da:HN:L:RN:XN:}:}:}:}:}::a:a:a:a:a:a:a:N:N:N:N:N:N:N:N:N:N:N:N:N:N:::N:N:1N??i$iiiiiis7s9ks:s;ks<ss&s:z$zzzzzz~$~99~:9~;9~<9~~~~~~~9~:979:;?@@ABBBCPCEFtFHDHJJKdKKM`MN NO OP4QQ|QRRSS|SSSTTTTTTV8WlWWWWWWXX,XDXYY(Y@YXYpYY[[,[D[\[t[\<]L]d]|]]]]_`_x_____`` `8a@aXapaaaabTc\ctccccdddeee0eHe`exeeeeeff f8fPf`g@gXgpggggghhh0hHh`hxhhhhhii iijj(j@jXjpjjjjk(kLkpkkkkl(l@lXlplllllmn$n<nTnlnnnnoopp,pDp\ptpqprrrrrss,sDs\stsssssttt4tLttuu(u@uXupuuuuuvvv0vHv`vxvvvvvww wpwxxy yzz{<{{|P|}T}~D~|,hL<(@d4DTp$dh4|d4Ld| $<Tl $Dd|(@Xp0x8Ph(@Xp0H`x 8Ph0H`x(@Xpx48| h@X| xt |px(`X(Hx4L T<xŒ(Ø$ĈxƐǀHȬɠɰ`tˤ4̰(͸|PјPLԠLհ8֨Tp$4|٨ HڰxHdx܌ܸ ݌,ތX߼l(|,Tx0DXl <XD0t$@| 4Hd Pdx <Xx$,<<P<4Ph 0(L,D\t\Ph XtTdTTl`xlXth@P(T0  h  ,   D      X p,<Td,8HXhdthHXP,(d4D H x  !x!"H"`"##h##$ $$,$d$t%8%H%%&8&&'\'(((()))*** *8*H*+L+++,,T,-@-.X./p//0$0p0181122\23X34445556X67 778489999::\:l:;;p;>(>8>P>h>??@h@A,AXApAAAAAABBB(B@BXBpBBBBBBCC C8CPChCxCCCCCDDD0DHD`DxDDDE E8EPEFFGGH`IIIJxKKLLM0MN@NO8OPQDQR<RS<STdUUV`VWX XlY(YYZ[H\ \]^_p`taLabcdef\g(giikl,m\noopqxrpstXuvxxxz z{|}\~X@hlP,h@|0x t8hLX \H`(hp HdL  4H\4<X<h8t`(0tp0pP(`x 8Ph(@` 8Ph(@Xp0H`x 8Ph(@Xp 8Ph(@Xp 8Ph8Xx 8Ph(@Xp0H`x8Xx8Xp(@Xp(@Xp0H`x 8Ph(@Xt 8Ph0Hd(@\x(@Xp4Ld|(@\tŒ¤¼4PhÀØð(8P`xĈĠİ0H`xŐŨ 8PhƀƘư(@XpLjǠǸ0H`xȐȨ 8Phɀɘɰ(@Xpʀʘʨʸ $<Tl˄˜˸ (@Xp̠̰̈,<Xp͈͠͸(@XpΌΜθ 8Phτϔϰ,,,,,,,,,,,,,,,,,XhАи hѰ$ҠӘP pՌո֔֔֔֔֔֔֔0pو0H````````````` ۠ܜl(Dlޤ<Pdxߌߠߴ,@Th|Xp8(@X\Tdd(Hh 0h \ 0@Xx 0@8h$TH|0||\<x,x$\<t,t`$Lt$@\xtP xPlp` 0 t   @   X     0 x h@@ Hpp\pHtHh <t@Pp \ !""t"#4##$|$% %h%%&t&'D'((h(() )T)))*|*+|+,l--...//t//0000T0x0011D112$2p233L3l33334@5,5P5668:;$;@;l;;;;;<<4?????@@@4@L@h@@@@@AAhAAB8CtCDFDF`FFFFGG<GpGGGGHH@H\HHHHII4I`I|IIIJ J8JXJJK`KLMMNNOOpOP$PPQQ,QhQR4RRRS S<SSSSTT,TtTTTUUXUUUVdVVW$WdWXdXYdYYYZZ$ZPZlZ[]4_TaxbdfhLijk|lnp8qDqrs(t uuv(xhxy\z${{|~~0X($$Tl,t$8Tp Dh Dh$Ht D`8d0Tx Tx0d D`8d0Tx Tx0d8d8d$XDp@tT D`8d0Tx Tx0d8d8d$XDp@tT8d8d$XDp@tT$PT$X@tTDD4\,tHLX4tD  X$pTPl4x(@„TÜDĘLżddǸ `ȬXʀʰ@pˠ4h̜8l͠0`ΐ <Xtϐ LЌ(\xє҄T@Ԍ8ոdְHhא(@ِ8ژ$Xی4tܬT݀ݬ0`ސl04pP@@@@@@@@@@@@@@@@@@@@@ 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`|HD,`x(T\  +@+>_ :Qz  @  4 ! 8    G "V "    " :R & hh    .Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu SerifDejaVu SerifBoldBoldDejaVu Serif BoldDejaVu Serif BoldDejaVu Serif BoldDejaVu Serif BoldVersion 2.25Version 2.25DejaVuSerif-BoldDejaVuSerif-BoldDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/LicenseDejaVu SerifDejaVu SerifBoldBold~Z   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BBuni01BCuni01BDuni01BEuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0245uni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02D0uni02D1uni02D2uni02D3uni02D6uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EE gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni034Funi0358uni0361uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0464uni0465uni046Auni046Buni0472uni0473uni0474uni0475uni048Cuni048Duni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED8uni1ED9uni1EE4uni1EE5uni1EE6uni1EE7Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni200Cuni200Duni200Euni200Funi2010uni2011 figuredashuni2015 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni202Auni202Buni202Cuni202Duni202Euni202Funi2031 exclamdbluni203Duni203Euni2047uni2048uni2049uni205Funi2060uni2061uni2062uni2063uni2064uni206Auni206Buni206Cuni206Duni206Euni206Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni20A6Eurouni20AFuni20B1uni20B4uni20B5uni2103uni2109uni210Euni2116uni2126uni2127uni212Auni212Buni2141uni2142uni2143uni2144uni214Bonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universal existentialuni2204gradientelement notelementsuchthatuni220Cuni2210uni2213uni2214uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni2238uni2239uni223Auni223Bsimilaruni223Duni2242uni2243uni2250uni2251uni2252uni2253uni2254uni2255 equivalence propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFdotmathhouseuni2308uni2309uni230Auni230B revlogicalnotuni2311uni2318uni2319 integraltp integralbtuni2325uni2328uni237Duni23AEuni23CFuni2423upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2638uni2639 smileface invsmilefacesununi263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647spadeuni2661uni2662clubuni2664heartdiamonduni2667uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi27A1uni27E0uni27E8uni27E9uni27F0uni27F1uni27F2uni27F3uni27F4uni27F5uni27F6uni27F7uni27F8uni27F9uni27FAuni27FBuni27FCuni27FDuni27FEuni27FFuni2800uni2801uni2802uni2803uni2804uni2805uni2806uni2807uni2808uni2809uni280Auni280Buni280Cuni280Duni280Euni280Funi2810uni2811uni2812uni2813uni2814uni2815uni2816uni2817uni2818uni2819uni281Auni281Buni281Cuni281Duni281Euni281Funi2820uni2821uni2822uni2823uni2824uni2825uni2826uni2827uni2828uni2829uni282Auni282Buni282Cuni282Duni282Euni282Funi2830uni2831uni2832uni2833uni2834uni2835uni2836uni2837uni2838uni2839uni283Auni283Buni283Cuni283Duni283Euni283Funi2840uni2841uni2842uni2843uni2844uni2845uni2846uni2847uni2848uni2849uni284Auni284Buni284Cuni284Duni284Euni284Funi2850uni2851uni2852uni2853uni2854uni2855uni2856uni2857uni2858uni2859uni285Auni285Buni285Cuni285Duni285Euni285Funi2860uni2861uni2862uni2863uni2864uni2865uni2866uni2867uni2868uni2869uni286Auni286Buni286Cuni286Duni286Euni286Funi2870uni2871uni2872uni2873uni2874uni2875uni2876uni2877uni2878uni2879uni287Auni287Buni287Cuni287Duni287Euni287Funi2880uni2881uni2882uni2883uni2884uni2885uni2886uni2887uni2888uni2889uni288Auni288Buni288Cuni288Duni288Euni288Funi2890uni2891uni2892uni2893uni2894uni2895uni2896uni2897uni2898uni2899uni289Auni289Buni289Cuni289Duni289Euni289Funi28A0uni28A1uni28A2uni28A3uni28A4uni28A5uni28A6uni28A7uni28A8uni28A9uni28AAuni28ABuni28ACuni28ADuni28AEuni28AFuni28B0uni28B1uni28B2uni28B3uni28B4uni28B5uni28B6uni28B7uni28B8uni28B9uni28BAuni28BBuni28BCuni28BDuni28BEuni28BFuni28C0uni28C1uni28C2uni28C3uni28C4uni28C5uni28C6uni28C7uni28C8uni28C9uni28CAuni28CBuni28CCuni28CDuni28CEuni28CFuni28D0uni28D1uni28D2uni28D3uni28D4uni28D5uni28D6uni28D7uni28D8uni28D9uni28DAuni28DBuni28DCuni28DDuni28DEuni28DFuni28E0uni28E1uni28E2uni28E3uni28E4uni28E5uni28E6uni28E7uni28E8uni28E9uni28EAuni28EBuni28ECuni28EDuni28EEuni28EFuni28F0uni28F1uni28F2uni28F3uni28F4uni28F5uni28F6uni28F7uni28F8uni28F9uni28FAuni28FBuni28FCuni28FDuni28FEuni28FFuni2900uni2901uni2902uni2903uni2904uni2905uni2906uni2907uni2908uni2909uni290Auni290Buni290Cuni290Duni290Euni290Funi2910uni2911uni2912uni2913uni2914uni2915uni2916uni2917uni2918uni2919uni291Auni291Buni291Cuni291Duni291Euni291Funi2920uni2921uni2922uni2923uni2924uni2925uni2926uni2927uni2928uni2929uni292Auni292Buni292Cuni292Duni292Euni292Funi2930uni2931uni2932uni2933uni2934uni2935uni2936uni2937uni2938uni2939uni293Auni293Buni293Cuni293Duni293Euni293Funi2940uni2941uni2942uni2943uni2944uni2945uni2946uni2947uni2948uni2949uni294Auni294Buni294Cuni294Duni294Euni294Funi2950uni2951uni2952uni2953uni2954uni2955uni2956uni2957uni2958uni2959uni295Auni295Buni295Cuni295Duni295Euni295Funi2960uni2961uni2962uni2963uni2964uni2965uni2966uni2967uni2968uni2969uni296Auni296Buni296Cuni296Duni296Euni296Funi2970uni2971uni2972uni2973uni2974uni2975uni2976uni2977uni2978uni2979uni297Auni297Buni297Cuni297Duni297Euni297Funi29EBuni2A0Cuni2A0Duni2A0Euni2A2Funi2B00uni2B01uni2B02uni2B03uni2B04uni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B0Euni2B0Funi2B10uni2B11uni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C67uni2C68uni2C69uni2C6Auni2C6Buni2C6Cuni2C75uni2C76uni2C77uni2E18uni2E2EuniF6C5cyrBrevecyrbreveuniFB00uniFB03uniFB04uniFB05uniFB06uniFE00uniFE01uniFE02uniFE03uniFE04uniFE05uniFE06uniFE07uniFE08uniFE09uniFE0AuniFE0BuniFE0CuniFE0DuniFE0EuniFE0FuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D400u1D401u1D402u1D403u1D404u1D405u1D406u1D407u1D408u1D409u1D40Au1D40Bu1D40Cu1D40Du1D40Eu1D40Fu1D410u1D411u1D412u1D413u1D414u1D415u1D416u1D417u1D418u1D419u1D41Au1D41Bu1D41Cu1D41Du1D41Eu1D41Fu1D420u1D421u1D422u1D423u1D424u1D425u1D426u1D427u1D428u1D429u1D42Au1D42Bu1D42Cu1D42Du1D42Eu1D42Fu1D430u1D431u1D432u1D433u1D6A8u1D6A9u1D6AAu1D6ABu1D6ACu1D6ADu1D6AEu1D6AFu1D6B0u1D6B1u1D6B2u1D6B3u1D6B4u1D6B5u1D6B6u1D6B7u1D6B8u1D6B9u1D6BAu1D6BBu1D6BCu1D6BDu1D6BEu1D6BFu1D6C0u1D6C1u1D6C2u1D6C3u1D6C4u1D6C5u1D6C6u1D6C7u1D6C8u1D6C9u1D6CAu1D6CBu1D6CCu1D6CDu1D6CEu1D6CFu1D6D0u1D6D1u1D6D2u1D6D3u1D6D4u1D6D5u1D6D6u1D6D7u1D6D8u1D6D9u1D6DAu1D6DBu1D6DCu1D6DDu1D6DEu1D6DFu1D6E0u1D6E1u1D7CAu1D7CBu1D7CEu1D7CFu1D7D0u1D7D1u1D7D2u1D7D3u1D7D4u1D7D5u1D7D6u1D7D7 dlLtcaronDieresisAcuteTildeGrave CircumflexCaron uni0311.caseBreve Dotaccent Hungarumlaut Doublegraveiogonek.dotlessuni0268.dotless dotaccent.iuni029D.dotlessuni1E2D.dotlessuni1ECB.dotlessEng.alt brailledot@K 2ǻƻĖG}G0}  & @ 7 !7 2.+t+t ]%]@%@ @  dtd  @   2 }t} t2q  @~t~}|}|{z{zy]zzyx%y]y@x%w7vtvkututsrqrqqpo.po.nmlkKj hg g@f!e}d@ckba}`^] ][YXY-XW2V TSTSRQPQ%PPOONMN}MI MM@LL1KK2JI J}I HG H}G FE F2ED E E@D CBCBA@A}@6 @@?=)?>=)>]==)<;<;:;:9 :9 878}76 776 6@5454+ 43 32) 210 0/$)/7.! .-,-,+ ,,@+ *&*) )@('('&''@&%$)%$!$)#!#"! "! ! !  @!*@-:!}22!)k!) !-} -    @      @@d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++bzflag-2.4.2+ds1/misc/fonts/LICENSE.DejaVu000066400000000000000000000113201200563112200177020ustar00rootroot00000000000000Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. $Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ bzflag-2.4.2+ds1/misc/fonts/README000066400000000000000000000006341200563112200164060ustar00rootroot00000000000000Please contact the BZFlag developers if there are any questions or concerns regarding existing fonts, the addition of new fonts, or modifications. All fonts included in BZFlag must be freely modifiable and freely redistributable. http://sourceforge.net/projects/dejavu/files/dejavu/2.25/dejavu-fonts-ttf-2.25.tar.bz2 is the source for the Deja Vu font files here, which were extracted from that upstream file. bzflag-2.4.2+ds1/misc/groups.conf000066400000000000000000000015501200563112200165610ustar00rootroot00000000000000# # This is an example of a bzfs groupdb file # # 1. Comment lines start with a '#' character. # # 2. The group name must be followed by the ':' character. # # 3. Permissions from previously defined groups can be # referenced by using *GROUPNAME, where GROUPNAME is # the name group to be referenced. # # Please see the bzfs.6 man page for further information. # # # A very simple group # SIMPLEKICKERS: KICK # # Define some groups to be referenced later # ANTI: ANTIBAN ANTIKICK ANTIPOLL ANTIPOLLBAN ANTIPOLLKICK ANTIDEREGISTER DISPLAY: PLAYERLIST SHOWOTHERS BANLIST ADMINMESSAGERECEIVE BOOT: KICK BAN SHORTBAN UNBAN SET: SETVAR LAGWARN FLAGMOD # # Use the '*' character to reference previous groups # OPS: *ANTI *DISPLAY *SET *BOOT SUBOPS: *ANTI *DISPLAY KICK SHORTBAN bzflag-2.4.2+ds1/misc/install-sh000077500000000000000000000325371200563112200164100ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bzflag-2.4.2+ds1/misc/libtool.m4000066400000000000000000006373131200563112200163150ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- ## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 ## Free Software Foundation, Inc. ## Originally by Gordon Matzigkeit , 1996 ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## As a special exception to the GNU General Public License, if you ## distribute this file as part of a program that contains a ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string="`eval $cmd`") 2>/dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* ) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for *BSD fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_unknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # --------------- AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER # # Check for any special shared library compilation flags. # _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= if test "$GCC" = no; then case $host_os in sco3.2v5*) _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ;; esac fi if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : else AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no fi fi # # Check to make sure the static flag actually works. # AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) # Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sco*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris* | sysv5*) symcode='[[BDRT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux*) case $CC in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; sco3.2v5*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; sco3.2v5*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4.2uw2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv5*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) bzflag-2.4.2+ds1/misc/ltmain.sh000077500000000000000000010502161200563112200162220ustar00rootroot00000000000000 # libtool (GNU libtool) 2.4 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4 TIMESTAMP="" package_revision=1.3293 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 bzflag-2.4.2+ds1/misc/man2html.c000066400000000000000000000244501200563112200162650ustar00rootroot00000000000000/* Copyright (c) 1995 DJ Delorie, 334 North Road, Deerfield NH USA Distributed under the terms of the GNU GPL, version 2 or later. Note: The HTML output of this program is NOT considered a derived work of this program. */ /* Original work by dj@delorie.com Usage: man2html < program.man > program.html */ #include #include #include int in_tt = 0; int next_line_dd = 0; int need_undl = 0; int got_regular_line = 0; int need_re = 0; int fill_mode = 1; int current_BI = 0; int skip_nl = 0; int process_line(); char * get_token(char *inp, char *buf) { int quoted = 0; /* skip whitespace */ while (*inp && isspace(*inp)) inp++; if (*inp == 0) return 0; while (*inp) { switch (*inp) { case '"': quoted = 1-quoted; break; case '\\': *buf++ = *inp; *buf++ = *++inp; break; default: if (isspace(*inp) && !quoted) { *buf = 0; return inp; } *buf++ = *inp; break; } inp++; } *buf = 0; return inp; } void clean(char *cp) { char foo[1000]; char *rp = foo; char *ocp = cp; if (strncmp(cp, ".if t ", 6) == 0) cp += 6; while (*cp) { switch (*cp) { case '\\': cp++; switch (*cp) { case 'E': case 'F': case 'g': case 'b': case 'r': case 'B': *rp++ = '\\'; *rp++ = *cp++; break; case '/': case '-': case '\\': case '+': case '.': case 10: case 0: case ' ': case '=': case '\'': case '`': case '[': case ']': case ':': case '}': case '{': *rp++ = *cp++; break; case '|': case '^': case '"': case 'd': case 'u': case 'n': case '&': case 'w': case '%': case 'v': case 'k': cp++; break; case 't': *rp++ = ' '; cp++; break; case '0': *rp++ = ' '; cp++; break; case 'c': if (cp[1] == '\n') { skip_nl = 1; cp++; } cp++; break; case 'e': *rp++ = '\\'; cp++; break; case 's': cp++; cp++; while (isdigit(*cp)) cp++; break; case 'f': if (current_BI) { *rp++ = '<'; *rp++ = '/'; *rp++ = current_BI; *rp++ = '>'; current_BI = 0; } if (in_tt) { strcpy(rp, ""); rp += 5; in_tt = 0; } switch (*++cp) { case '(': if (cp[1] == 'C' && cp[2] == 'W') { strcpy(rp, ""); rp += 4; in_tt = 1; cp += 2; } else fprintf(stderr, "unknown font %.3s\n", cp); break; case 'B': current_BI = 'b'; *rp++ = '<'; *rp++ = 'b'; *rp++ = '>'; break; case 'R': case 'P': break; case 'I': current_BI = 'i'; *rp++ = '<'; *rp++ = 'i'; *rp++ = '>'; break; } cp++; break; case '*': cp++; if (cp[0] == '(') { cp++; if (cp[0] == 'l' && cp[1] == 'q') *rp++ = '`'; else if (cp[0] == 'r' && cp[1] == 'q') *rp++ = '\''; else { sprintf(rp, "[%.2s]", cp); rp += 4; } cp += 2; } else if (cp[0] == 'r') { cp++; strcpy(rp, "RCS"); rp += 3; } else { sprintf(rp, "[%c]", *cp); rp += 3; } break; case '(': if (cp[1] == 'c' && cp[2] == 'o') *rp++ = (char)0xa9; else if (cp[1] == 'b' && cp[2] == 'v') *rp++ = '|'; else if (cp[1] == 'e' && cp[2] == 'm') *rp++ = ' '; else if (cp[1] == '+' && cp[2] == '-') *rp++ = (char)0xb1; else if (cp[1] == 't' && cp[2] == 'i') *rp++ = '~'; else if (cp[1] == 't' && cp[2] == 's') *rp++ = '"'; else if (cp[1] == 'p' && cp[2] == 'l') *rp++ = '+'; else if (cp[1] == 'm' && cp[2] == 'i') *rp++ = '-'; else if (cp[1] == 'f' && cp[2] == 'm') *rp++ = '\''; else if (cp[1] == 'm' && cp[2] == 'u') *rp++ = 'x'; else if (cp[1] == 'b' && cp[2] == 'u') { strcpy(rp, "
  • "); rp += 4; } else if (cp[1] == '>' && cp[2] == '=') { *rp++ = '>'; *rp++ = '='; } else if (cp[1] == '*' && cp[2] == '*') { *rp++ = '*'; *rp++ = '*'; } else fprintf(stderr, "unknown meta-character (%c%c\n", cp[1], cp[2]); cp += 3; break; default: fprintf(stderr, "unknown escape \\%c (%d)\n", *cp, *cp); break; } break; case '&': *rp++ = '&'; *rp++ = 'a'; *rp++ = 'm'; *rp++ = 'p'; *rp++ = ';'; cp++; break; case '<': *rp++ = '&'; *rp++ = 'l'; *rp++ = 't'; *rp++ = ';'; cp++; break; case '>': *rp++ = '&'; *rp++ = 'g'; *rp++ = 't'; *rp++ = ';'; cp++; break; default: *rp++ = *cp++; break; } } *rp = 0; strcpy(ocp, foo); } int un_bi() { if (current_BI) { printf("", current_BI); current_BI = 0; } return 0; } int process_line_til_regular() { got_regular_line = 0; while (!got_regular_line) process_line(); return 0; } void bol() { got_regular_line = 1; if (next_line_dd) printf("
    "); next_line_dd = 0; } void eol() { if (!fill_mode) printf("
    "); } void twoggle(char *a, char *b, char *l) { int first = 1; char *c; char buf[1000]; bol(); while ((l = get_token(l, buf))) { clean(buf); c = first ? a : b; if (c) printf("<%s>%s", c, buf, c); else printf("%s", buf); if (a && b && strcmp(a, b) == 0) putchar(' '); first = 1-first; } un_bi(); if (!skip_nl) printf("\n"); eol(); got_regular_line = 1; } int process_line() { char buf[1000], cmd[10]; char token[1000]; if (fgets(buf, 1000, stdin) == 0) return 0; skip_nl = 0; if (buf[0] != '.') { if (strncmp(buf, "'\\\"", 3) == 0) return 1; clean(buf); bol(); fputs(buf, stdout); if (buf[0] == 0 || buf[0] == '\n') printf("

    "); eol(); return 1; } if (sscanf(buf, "%s %[^\n]", cmd, buf) == 1) buf[0] = 0; if (strcmp(cmd, "..") == 0) { } else if (strcmp(cmd, ".B") == 0) { if (buf[0]) { twoggle("b", "b", buf); } else { printf(""); process_line_til_regular(); printf(""); } } else if (strcmp(cmd, ".I") == 0) { if (buf[0]) { twoggle("i", "i", buf); } else { printf(""); process_line_til_regular(); printf(""); } } else if (strcmp(cmd, ".BI") == 0) { twoggle("b", "i", buf); } else if (strcmp(cmd, ".IB") == 0) { twoggle("i", "b", buf); } else if (strcmp(cmd, ".BR") == 0) { twoggle("b", 0, buf); } else if (strcmp(cmd, ".RB") == 0) { twoggle(0, "b", buf); } else if (strcmp(cmd, ".IR") == 0) { twoggle("i", 0, buf); } else if (strcmp(cmd, ".RI") == 0) { twoggle(0, "i", buf); } else if (strcmp(cmd, ".nf") == 0) { if (fill_mode) printf("

    \n");
        fill_mode = 0;
      }
      else if (strcmp(cmd, ".fi") == 0)
      {
        if (!fill_mode)
          printf("
    \n"); fill_mode = 1; } else if (strcmp(cmd, ".br") == 0 || strcmp(cmd, ".Sp") == 0 || strcmp(cmd, ".ti") == 0) { if (need_undl) { need_undl = 0; printf(""); } printf("
    \n"); } else if (strcmp(cmd, ".LP") == 0 || strcmp(cmd, ".PP") == 0 || strcmp(cmd, ".sp") == 0 || strcmp(cmd, ".P") == 0) { if (need_undl) { need_undl = 0; printf(""); } printf("\n

    \n"); } else if (strcmp(cmd, ".RS") == 0) { printf("

      "); need_re ++; } else if (strcmp(cmd, ".RE") == 0) { if (need_re) { printf("
    "); need_re --; } } else if (strcmp(cmd, ".SH") == 0 || strcmp(cmd, ".SS") == 0) { char *cp = buf; int got_token = 0; while (need_re) { printf(""); need_re--; } if (need_undl) { printf(""); need_undl = 0; } printf("\n

    "); while ((cp = get_token(cp, token))) { got_token = 1; clean(token); printf("%s ", token); } if (!got_token) { if (fgets(buf, 1000, stdin) == 0) return 0; printf("%s", buf); } printf("

      \n\n"); un_bi(); got_regular_line = 1; if (!fill_mode) printf(""); fill_mode = 1; } else if (strcmp(cmd, ".SM") == 0) { if (buf[0]) { bol(); clean(buf); printf("%s\n", buf); eol(); } else { printf(""); process_line_til_regular(); printf(""); } } else if (strcmp(cmd, ".TH") == 0) { int all_upper = 1, i; get_token(buf, buf); for (i=0; buf[i]; i++) if (islower(buf[i])) all_upper = 0; if (all_upper) for (i=0; buf[i]; i++) if (isupper(buf[i])) buf[i] = tolower(buf[i]); printf("\n", buf); printf("
        "); } else if (strcmp(cmd, ".TP") == 0 || strcmp(cmd, ".Tp") == 0) { if (!need_undl) { printf("

        "); need_undl = 1; } printf("
        "); next_line_dd = 0; process_line_til_regular(); next_line_dd = 1; } else if (strcmp(cmd, ".IP") == 0) { if (!need_undl) { printf("

        "); need_undl = 1; } get_token(buf, buf); clean(buf); printf("
        %s", buf); next_line_dd = 1; } else if (strcmp(cmd, ".TQ") == 0) { printf("
        "); next_line_dd = 0; process_line_til_regular(); next_line_dd = 1; } else if (strcmp(cmd, ".FN") == 0) { bol(); get_token(buf, buf); printf("%s\n", buf); got_regular_line = 1; eol(); } /* Tcl macros */ else if (strcmp(cmd, ".AP") == 0) { char *cp = buf; cp = get_token(cp, token); printf("

        %s", token); cp = get_token(cp, token); printf(" %s", token); cp = get_token(cp, token); printf(" (%s) -\n", token); } else if (strcmp(cmd, ".DS") == 0) { printf("

        \n");
          }
          else if (strcmp(cmd, ".DE") == 0)
          {
            printf("
        \n"); } /* end of Tcl macros */ else if (strcmp(cmd, ".\"") == 0) { } else if (strcmp(cmd, ".de") == 0) { do { if (fgets(buf, 1000, stdin) == 0) return 0; } while (buf[0] != '.' || buf[1] != '.'); } return 1; } int main() { while (process_line()); printf("
      \n\n"); return 0; } /* * Local Variables: *** * mode:C++ *** * tab-width: 8 *** * c-basic-offset: 2 *** * indent-tabs-mode: t *** * End: *** * ex: shiftwidth=2 tabstop=8 */ bzflag-2.4.2+ds1/misc/maps/000077500000000000000000000000001200563112200153325ustar00rootroot00000000000000bzflag-2.4.2+ds1/misc/maps/flagbuffet.bzw000066400000000000000000000076361200563112200201770ustar00rootroot00000000000000# bzflag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # This map puts three of each type of flag in its own zone, # making them easy to find for testing purposes. options -ms 3 -sa -set _maxFlagGrabs 1 -srvmsg "Flag names progress alphabetically clockwise from the north." -srvmsg "Good flags are on the inner loop. Bad flags are on the outer loop." -srvmsg "Self-destruct may be the easiest way to drop a Bouncy flag." end world size 120 end box position 80 -80 0 size 10 10 10 end teleporter portal position 35 -80 0 rotation 90 end link from portal:f to portal:b end link from portal:b to portal:f end zone position 0 0 0 size 1 1 0 zoneflag ID 3 team 0 team 1 team 2 team 3 team 4 end zone position -35 40 0 size 1 1 0 zoneflag A 3 end zone position -25 40 0 size 1 1 0 zoneflag BU 3 end zone position -15 40 0 size 1 1 0 zoneflag CL 3 end #zone # position -5 40 0 # size 1 1 0 # zoneflag CS 3 #end zone position 5 40 0 size 1 1 0 zoneflag F 3 end zone position 15 40 0 size 1 1 0 zoneflag G 3 end zone position 25 40 0 size 1 1 0 zoneflag GM 3 end zone position 35 40 0 size 1 1 0 zoneflag IB 3 end zone position 40 35 0 size 1 1 0 zoneflag JP 3 end zone position 40 25 0 size 1 1 0 zoneflag L 3 end #zone # position 40 15 0 # size 1 1 0 # zoneflag LG 3 #end zone position 40 5 0 size 1 1 0 zoneflag MG 3 end zone position 40 -5 0 size 1 1 0 zoneflag MQ 3 end zone position 40 -15 0 size 1 1 0 zoneflag N 3 end zone position 40 -25 0 size 1 1 0 zoneflag OO 3 end #zone # position 40 35 0 # size 1 1 0 # zoneflag GOOD_FLAG 3 #end zone position 35 -40 0 size 1 1 0 zoneflag PZ 3 end zone position 25 -40 0 size 1 1 0 zoneflag QT 3 end zone position 15 -40 0 size 1 1 0 zoneflag R 3 end zone position 5 -40 0 size 1 1 0 zoneflag SB 3 end zone position -5 -40 0 size 1 1 0 zoneflag SE 3 end zone position -15 -40 0 size 1 1 0 zoneflag SH 3 end zone position -25 -40 0 size 1 1 0 zoneflag SR 3 end #zone # position -35 -40 0 # size 1 1 0 # zoneflag GOOD_FLAG 3 #end zone position -40 -35 0 size 1 1 0 zoneflag ST 3 end zone position -40 -25 0 size 1 1 0 zoneflag SW 3 end zone position -40 -15 0 size 1 1 0 zoneflag T 3 end zone position -40 -5 0 size 1 1 0 zoneflag TH 3 end zone position -40 5 0 size 1 1 0 zoneflag US 3 end zone position -40 15 0 size 1 1 0 zoneflag V 3 end zone position -40 25 0 size 1 1 0 zoneflag WG 3 end #zone # position -40 35 0 # size 1 1 0 # zoneflag GOOD_FLAG 3 #end zone position -35 80 0 size 1 1 0 zoneflag B 3 end zone position -25 80 0 size 1 1 0 zoneflag BY 3 end zone position -15 80 0 size 1 1 0 zoneflag CB 3 end zone position -5 80 0 size 1 1 0 zoneflag FO 3 end zone position 5 80 0 size 1 1 0 zoneflag JM 3 end zone position 15 80 0 size 1 1 0 zoneflag LT 3 end zone position 25 80 0 size 1 1 0 zoneflag M 3 end #zone # position 35 80 0 # size 1 1 0 # zoneflag BAD_FLAG 3 #end zone position 80 35 0 size 1 1 0 zoneflag NJ 3 end zone position 80 25 0 size 1 1 0 zoneflag O 3 end zone position 80 15 0 size 1 1 0 zoneflag RC 3 end zone position 80 5 0 size 1 1 0 zoneflag RO 3 end zone position 80 -5 0 size 1 1 0 zoneflag RT 3 end zone position 80 -15 0 size 1 1 0 zoneflag TR 3 end zone position 80 -25 0 size 1 1 0 zoneflag WA 3 end #zone # position 80 -35 0 # size 1 1 0 # zoneflag BAD_FLAG 3 #end bzflag-2.4.2+ds1/misc/maps/fountains.bzw000066400000000000000000000021261200563112200200650ustar00rootroot00000000000000# This world demonstrates world weapons box position 100 0 0 size 30 30 10 rotation 0 end box position 0 0 0 size 30 30 10 rotation 0 end box position -100 0 0 size 30 30 10 rotation 0 end weapon position 100 0 10 initdelay 10 delay 10 type SW end weapon position 0 0 10 initdelay 13.3 delay 10 type SW end weapon position -100 0 10 initdelay 16.6 delay 10 type SW end box position -155 -50 0 size 8 8 8 rotation 0 end box position 155 -50 0 size 8 8 8 rotation 0 end box position 155 50 0 size 8 8 8 rotation 0 end box position -155 50 0 size 8 8 8 rotation 0 end weapon position -150 -50 2 initdelay 10 rotation 0 delay 6 type F end weapon position 150 -50 2 initdelay 10 rotation 90 delay 6 type F end weapon position 150 50 2 initdelay 10 rotation 180 delay 6 type F end weapon position -150 50 2 initdelay 10 rotation 270 delay 6 type F end box position 0 -200 0 size 10 10 100 rotation 0 end box position 0 200 0 size 10 10 100 rotation 0 end weapon position 0 190 95 initdelay 10 rotation 270 delay 2 type L end weapon position 0 -190 90 initdelay 11 rotation 90 delay 2 type L end bzflag-2.4.2+ds1/misc/maps/hix.bzw000066400000000000000000000267341200563112200166620ustar00rootroot00000000000000# HiX2 experimental world # Copyright (c) 1993-2012 Tim Riker # by Tim Riker # # This is a team play world # Typical World definition # #world #name HiX 2.0 #size 400.0 #flagHeight 10.0 #end # Typical Teleporter # # TeleUnit 1.12 # TeleWidth 1.12 # TeleBreadth 4.48 # TeleHeight 10.08 # #teleporter #position x y 0.0 #rotation deg #size 0.56 4.48 20.16 #border 1.12 #end # Typical link # # link # from from # to to # end # Typical Box # # BoxBase 30.0 # BoxHeight 9.42 # #box #position x y 0.0 #rotation deg #size 30.0 30.0 9.42 #end # Typical pyramid # # PyrBase 8.20 # PyrHeight 10.25 # #pyramid #position x y 0.0 #rotation deg #size 8.20 8.20 10.25 #end # Typical base #base #position #rotation deg -- not yet supported #size 30.0 30.0 0.0 -- height not yet supported #color #end # Typical World definition # world name HiX 2.0 size 400.0 flagHeight 0.0 end # top of the world box position 0.0 0.0 29.0 rotation 0.0 size 9.6568542495 4.0 16.0 end box position 0.0 0.0 29.0 rotation 45.0 size 9.6568542495 4.0 16.0 end box position 0.0 0.0 29.0 rotation 90.0 size 9.6568542495 4.0 16.0 end box position 0.0 0.0 29.0 rotation 135.0 size 9.6568542495 4.0 16.0 end # roof pyramid position 0.0 0.0 52.0 rotation 0.0 size 9.6568542495 4.0 5.0 end pyramid position 0.0 0.0 52.0 rotation 45.0 size 9.6568542495 4.0 5.0 end pyramid position 0.0 0.0 52.0 rotation 90.0 size 9.6568542495 4.0 5.0 end pyramid position 0.0 0.0 52.0 rotation 135.0 size 9.6568542495 4.0 5.0 end # cross bars box position 0.0 0.0 29.0 rotation 45.0 size 4 550.0 1.0 end box position 0.0 0.0 29.0 rotation 135.0 size 4 550.0 1.0 end # walls under crossbars box position 180.0 180.0 14.0 rotation 135.0 size 0.5 150.0 16.0 end box position -180.0 -180.0 14.0 rotation 135.0 size 0.5 150.0 16.0 end box position 180.0 -180.0 14.0 rotation 45.0 size 0.5 150.0 16.0 end box position -180.0 180.0 14.0 rotation 45.0 size 0.5 150.0 16.0 end # first level platforms box position 180.0 180.0 14.0 rotation 135.0 size 8.0 107.0 1.0 end box position -180.0 -180.0 14.0 rotation 135.0 size 8.0 107.0 1.0 end box position 180.0 -180.0 14.0 rotation 45.0 size 8.0 107.0 1.0 end box position -180.0 180.0 14.0 rotation 45.0 size 8.0 107.0 1.0 end # boxes at wall ends for access box position 80.0 80.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position 280.0 280.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position -80.0 -80.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position -280.0 -280.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position -80.0 80.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position -280.0 280.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position 80.0 -80.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position 280.0 -280.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end # octagons midplatform box position 180.0 180.0 0.0 rotation 0.0 size 19.313708499 8.0 15.0 end box position 180.0 180.0 0.0 rotation 45.0 size 19.313708499 8.0 15.0 end box position 180.0 180.0 0.0 rotation 90.0 size 19.313708499 8.0 15.0 end box position 180.0 180.0 0.0 rotation 135.0 size 19.313708499 8.0 15.0 end box position -180.0 -180.0 0.0 rotation 0.0 size 19.313708499 8.0 15.0 end box position -180.0 -180.0 0.0 rotation 45.0 size 19.313708499 8.0 15.0 end box position -180.0 -180.0 0.0 rotation 90.0 size 19.313708499 8.0 15.0 end box position -180.0 -180.0 0.0 rotation 135.0 size 19.313708499 8.0 15.0 end box position -180.0 180.0 0.0 rotation 0.0 size 19.313708499 8.0 15.0 end box position -180.0 180.0 0.0 rotation 45.0 size 19.313708499 8.0 15.0 end box position -180.0 180.0 0.0 rotation 90.0 size 19.313708499 8.0 15.0 end box position -180.0 180.0 0.0 rotation 135.0 size 19.313708499 8.0 15.0 end box position 180.0 -180.0 0.0 rotation 0.0 size 19.313708499 8.0 15.0 end box position 180.0 -180.0 0.0 rotation 45.0 size 19.313708499 8.0 15.0 end box position 180.0 -180.0 0.0 rotation 90.0 size 19.313708499 8.0 15.0 end box position 180.0 -180.0 0.0 rotation 135.0 size 19.313708499 8.0 15.0 end # supports pyramid position 140.0 140.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position 140.0 140.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position 140.0 140.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position 140.0 140.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position 140.0 140.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position 220.0 220.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position 220.0 220.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position 220.0 220.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position 220.0 220.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position 220.0 220.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position -140.0 -140.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position -140.0 -140.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position -140.0 -140.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position -140.0 -140.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position -140.0 -140.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position -220.0 -220.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position -220.0 -220.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position -220.0 -220.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position -220.0 -220.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position -220.0 -220.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position -140.0 140.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position -140.0 140.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position -140.0 140.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position -140.0 140.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position -140.0 140.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position -220.0 220.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position -220.0 220.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position -220.0 220.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position -220.0 220.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position -220.0 220.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position 140.0 -140.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position 140.0 -140.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position 140.0 -140.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position 140.0 -140.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position 140.0 -140.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end pyramid position 220.0 -220.0 0.0 rotation 45.0 size 2.0 2.0 18.0 end pyramid position 220.0 -220.0 0.0 rotation 0.0 size 8.0 1.0 5.0 end pyramid position 220.0 -220.0 0.0 rotation 90.0 size 8.0 1.0 5.0 end pyramid position 220.0 -220.0 12.0 rotation 0.0 size 8.0 -0.5 -2.0 end pyramid position 220.0 -220.0 12.0 rotation 90.0 size 8.0 -0.5 -2.0 end # base guard posts box position 392.5 0.0 29.0 rotation 0.0 size 7.5 7.5 16.0 end box position -392.5 0.0 29.0 rotation 0.0 size 7.5 7.5 16.0 end box position 0.0 392.5 29.0 rotation 0.0 size 7.5 7.5 16.0 end box position 0.0 -392.5 29.0 rotation 0.0 size 7.5 7.5 16.0 end # walkways on edges #overlap platforms to prevent flag hiding box position 392.5 0.0 29.0 rotation 0.0 size 7.5 400.0 1.0 end box position -392.5 0.0 29.0 rotation 0.0 size 7.5 400.0 1.0 end box position 0.0 392.5 29.0 rotation 90.0 size 7.5 400.0 1.0 end box position 0.0 -392.5 29.0 rotation 90.0 size 7.5 400.0 1.0 end # boxes for access box position 400.0 180.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position 400.0 -180.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position -400.0 180.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position -400.0 -180.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position 180.0 400.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position -180.0 400.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position 180.0 -400.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end box position -180.0 -400.0 0.0 rotation 45.0 size 30.0 30.0 15.0 end # boxes in the middle in front of bases box position 200.0 0.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position -200.0 0.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position 0.0 200.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end box position 0.0 -200.0 0.0 rotation 0.0 size 30.0 30.0 15.0 end # teleporter elevators in the corners teleporter position 390.0 390.0 0.0 rotation 45.0 size 0.56 4.48 27.7 border 1.12 end teleporter position 390.0 390.0 30.0 rotation 45.0 size 0.56 4.48 15.0 border 1.12 end link from 0 to 2 end link from 1 to 3 end link from 2 to 0 end link from 3 to 1 end teleporter position -390.0 -390.0 0.0 rotation 45.0 size 0.56 4.48 27.7 border 1.12 end teleporter position -390.0 -390.0 30.0 rotation 45.0 size 0.56 4.48 15.0 border 1.12 end link from 4 to 6 end link from 5 to 7 end link from 6 to 4 end link from 7 to 5 end teleporter position 390.0 -390.0 0.0 rotation 135.0 size 0.56 4.48 27.7 border 1.12 end teleporter position 390.0 -390.0 30.0 rotation 135.0 size 0.56 4.48 15.0 border 1.12 end link from 8 to 10 end link from 9 to 11 end link from 10 to 8 end link from 11 to 9 end teleporter position -390.0 390.0 0.0 rotation 135.0 size 0.56 4.48 27.7 border 1.12 end teleporter position -390.0 390.0 30.0 rotation 135.0 size 0.56 4.48 15.0 border 1.12 end link from 12 to 14 end link from 13 to 15 end link from 14 to 12 end link from 15 to 13 end # red team base base position -340.0 0.0 26.0 rotation 45.0 size 35.0 35.0 4.0 color 1 end # green team base base position 340.0 0.0 26.0 rotation 45.0 size 35.0 35.0 4.0 color 2 end # blue team base base position 0.0 -340.0 26.0 rotation 45.0 size 35.0 35.0 4.0 color 3 end # purple team base base position 0.0 340.0 26.0 rotation 45.0 size 35.0 35.0 4.0 color 4 end # pyramids under red base pyramid position -340.0 -45.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position -340.0 45.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position -295.0 0.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position -385.0 0.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end # pyramids under green base pyramid position 340.0 -45.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 340.0 45.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 295.0 0.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 385.0 0.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end # pyramids under blue base pyramid position -45.0 -340.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 45.0 -340.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 0.0 -295.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 0.0 -385.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end # pyramids under purple base pyramid position -45.0 340.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 45.0 340.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 0.0 295.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end pyramid position 0.0 385.0 0.0 rotation 0.0 size 7.5 7.5 26.0 end bzflag-2.4.2+ds1/misc/missing000077500000000000000000000262331200563112200157770ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: bzflag-2.4.2+ds1/misc/mrtg-bzflag.pl000077500000000000000000000070571200563112200171570ustar00rootroot00000000000000#!/usr/bin/perl -w # # BZFlag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. use strict; # example mrtg.conf entries #Target[bzflag]: `/home/bzflag/bzflag/misc/mrtg-bzflag.pl` #Options[bzflag]: gauge,nopercent,noinfo,noborder,noarrow,transparent,growright #Title[bzflag]: BZFlag Players / Servers #MaxBytes[bzflag]: 100 #YLegend[bzflag]: count #ShortLegend[bzflag]:   #LegendI[bzflag]: Players #LegendO[bzflag]: Servers #Legend1[bzflag]: Current Players according to list server #Legend2[bzflag]: Current Servers according to list server #Legend3[bzflag]: Maximal 5 Minute Players #Legend4[bzflag]: Maximal 5 Minute Servers #PageTop[bzflag]:

      BZFlag Players / Servers

      #Target[xmission]: `/home/bzflag/bzflag/misc/mrtg-bzflag.pl xmission.bzflag.org:5154` #Options[xmission]: gauge,noinfo,noborder,noarrow,transparent,growright #Title[xmission]: Players on xmission.bzflag.org:5154 #MaxBytes[xmission]: 12 #YLegend[xmission]: players #ShortLegend[xmission]:   #LegendI[xmission]: Players: #LegendO[xmission]: MaxPlayers: #Legend1[xmission]: Current players according to list server #Legend2[xmission]: Current player limit according to list server #Legend3[xmission]: Maximal 5 Minute players #Legend4[xmission]: Maximal 5 Minute player limit #PageTop[xmission]:

      xmission.bzflag.org:5155

      use Socket; use LWP::UserAgent; use File::stat; my $cacheFile = '/tmp/mrtg-bzflagdb.tmp'; my @lines; if (-d $cacheFile && time() - stat($cacheFile)->mtime < 60) { open(CACHEFILE, "<$cacheFile"); chomp(@lines = ); close(CACHEFILE); } else { my $ua = new LWP::UserAgent; $ua->timeout(5); my $req = HTTP::Request->new('GET', 'http://my.BZFlag.org/db/?action=LIST'); my $res = $ua->request($req); @lines = split("\n",$res->content); open(CACHEFILE, ">$cacheFile") or die; print(CACHEFILE join("\n", @lines)); close(CACHEFILE); } my $totalServers = 0; my $totalPlayers = 0; for my $line (@lines) { my ($serverport, $version, $flags, $ip, $comments) = split(" ",$line,5); # not "(A4)18" to handle old dumb perl my ($style, $maxShots, $shakeWins, $shakeTimeout, $maxPlayerScore, $maxTeamScore, $maxTime, $maxPlayers, $rogueSize, $rogueMax, $redSize, $redMax, $greenSize, $greenMax, $blueSize, $blueMax, $purpleSize, $purpleMax, $observerSize, $observerMax) = unpack("A4A4A4A4A4A4A4A2A2A2A2A2A2A2A2A2A2A2A2A2", $flags); my $playerSize = hex($rogueSize) + hex($redSize) + hex($greenSize) + hex($blueSize) + hex($purpleSize) + hex($observerSize); if (($#ARGV == 0) && ($serverport eq $ARGV[0])) { my $playerMax = hex($rogueMax) + hex($redMax) + hex($greenMax) + hex($blueMax) + hex($purpleMax) + hex($observerMax); $playerMax = hex($maxPlayers) if (hex($maxPlayers) < $playerMax); print("$playerSize\n$playerMax\nunknown uptime\nplayers on $ARGV[0]\n"); exit(0); } $totalServers += 1; $totalPlayers += $playerSize; } if ($#ARGV == 0) { print("0\n0\nunknown uptime\n$ARGV[0] not found in server list\n"); } else { print("$totalPlayers\n$totalServers\nunknown uptime\nBZFlag players/servers\n"); } # Local Variables: *** # mode:Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/multilingualSwearList.txt000066400000000000000000001476001200563112200215070ustar00rootroot00000000000000# Multilingual Swear List # # Here is a list of bad words, sorted in alphabetical order. The words and # phrases have been compiled from a variety of sources over time. This list # is in the public domain. Corrections, additions, and deletions should be # referred to learner@brlcad.org # # Swear words are rather subjective. As such, only very obscene, vulgar, or # common highly offensive words (like racial slurs) should be added to the # list. Words that are simply "rude" should not be added. # # They are sorted in alphabetical order with one word/phrase per line. Words # are case insensitive; punctuation and white-space are irrelevant (it's okay # if punctuation is listed below, but it will be required during matching). # # e.g. "dumb ass" should match "dumbass!", "DUMB a s s", "d_u_m_b! a_S_S", etc # # Strings should also match repetitive identical letter expansions. # # e.g. "dumb ass" should match "dumb asssss", "dumbaaaass", "dumb as s", etc # # Strings should also match l33t-speak. (l=1, o=0, e=3, a=@, s=z, i=l, f=ph) # # e.g. "ass whipe" should match "@sz wh1p3", etc # # Strings should also match common word suffixes (at least for English) # (dom|ity|memt|sion|tion|ness|ance|ence|er|or|ist) for nouns # (ive|en|ic|al|able|y|ous|ful|less) for adjectives # (en|ize|ate|ify|fy|ed) for verbs # (ly) for adverbs # (a|z|r|ah|io|rs|rz|in|n|ster|meister) for slang # (s|es) for plurality # (ing|let) for imperfect verb, and diminutive # # e.g. "dumb ass" should match "dumb assness", "dumb asses", "dumb assly", etc # # Strings should also match common word prefixes (at least for English) # (bz|beze) for bzflag-centric words # # e.g. "bitch" should also match "bzbitch", "beezzeebitch", etc # ### # # Since all of the above matchings are done for free, they should NOT be # explicitly listed below. Only root words are necessary. For foreign # languages, it may be necessary to list all tenses of certain verbs, unless # the rules can be strictly and simply quantified. # # There are certain foreign words which are simply too common or likely to # include, and they are commented out below (e.g. "um" in Turkish). # # Strings will roughly be expanded to the following modifications and # regular expression expansion during compilation of this file: # # FooBAR : LOWER_CASE(FooBAR) => foobar # foobar : REGULAR_EXP(foobar) => # f+[o0]+[o0]+b+(a@)+r+\ # ((d+[o0]+m+)|([i1]+t+y+)|(m+e+m+t+)|(s+[i1]+[o0]+n+)|(t+[i1]+[o0]+n+)|\ # (n+[e3]+s+s+)|(a+n+c+[e3]+)|([e3]+n+c+[e3]+)|([e3]+r+)|([o0]+r+)|\ # ([i1]+s+t+)|([i1]+v+[e3]+)|([e3]+n+)|([i1]+c+)|([a@]+[l1]+)|\ # ([a@]+b+[l1]+[e3]+)|(y+)|([o0]+u+s+)| .... and so on # # Additionally, between every letter is the optional non-alphanumerics: # [^[:alnum:]]* # # This is done programmatically, and is way to much to expand manually here! # # Likewise, the users' string will be parsed and converted to a similar format # for matching. # # Comments may optionally follow any phrase to describe the meaning or language # of origin or relevance. If the language of origin is not English, the # language should be stated in the comment as the first word using the # respective two-letter ISO 639 language code included below. If a language is # not designated, English (en) is assumed. The code is presently unused. # # (see http://lcweb.loc.gov/standards/iso639-2/) # ### # # aa Afar # ab Abkhazian # ae Avestan # af Afrikaans # ak Akan # am Amharic # an Argonese # ar Arabic # as Assamese # av Avaric # ay Aymara # az Azerbaijani # ba Bashkir # be Byelorussian # bg Bulgarian # bh Bihari # bi Bislama # bm Bambara # bn Bengali, Bangla # bo Tibetan # br Breton # bs Bosnian # ca Catalan # ce Chechen # ch Chamorro # co Corsican # cr Cree # cs Czech # cu Church Slavic, Old Bulgarian # cv Chuvash # cy Welsh # da Danish # de German # dv Divehi # dz Bhutani # ee Ewe # el Greek # en English # eo Esperanto # es Spanish # et Estonian # eu Basque # fa Persian # ff Fulah # fi Finnish # fj Fiji # fo Faroese # fr French # fy Frisian # ga Irish # gd Scots Gaelic # gl Galician # gn Guarani # gu Gujarati # gv Manx # ha Hausa # he Hebrew (formerly iw) # hi Hindi # ho Hiri Motu # hr Croatian # ht Hatian Creole # hu Hungarian # hy Armenian # hz Herero # ia Interlingua # id Indonesian (formerly in) # ie Interlingue # ig Igbo # ii Sichuan Yi # ik Inupiak # io Ido # is Icelandic # it Italian # iu Inuktitut # ja Japanese # jv Javanese # ka Georgian # kg Kongo # ki Kikuyo, Gikuyu # kj Kuanyama, Kwanyama # kk Kazakh # kl Greenlandic # km Cambodian # kn Kannada # ko Korean # kr Kanuri # ks Kashmiri # ku Kurdish # kv Komi # kw Cornish # ky Kirghiz # la Latin # lb Luxembourgish, Letzeburgesch # lg Ganda # li Limburgish, Limburger, Limburgan # ln Lingala # lo Laothian # lt Lithuanian # lu Luba-Katanga # lv Latvian, Lettish # mg Malagasy # mh Marshallese # mi Maori # mk Macedonian # ml Malayalam # mn Mongolian # mo Moldavian # mr Marathi # ms Malay # mt Maltese # my Burmese # na Nauru # nb Norwegian Bokmal # nd North Ndebele # ne Nepali # ng Ndonga # nl Dutch # nn Norwegian Nynorsk # no Norwegian # nr South Ndebele # nv Navajo, Navaho # ny Chichewa, Chewa, Nyanja # oc Occitan # oc Occitan (post 1500), Provencal # oj Ojibwa # om (Afan) Oromo # or Oriya # os Ossetian, Ossetic # pa Punjabi # pi Pali # pl Polish # ps Pashto, Pushto # pt Portuguese # qu Quechua # rm Rhaeto-Romance # rn Kirundi # ro Romanian # ru Russian # rw Kinyarwanda # sa Sanskrit # sc Sardinian # sd Sindhi # se Northern Sami # sg Sangho # sh Serbo-Croatian # si Sinhalese # sk Slovak # sl Slovenian # sm Samoan # sn Shona # so Somali # sq Albanian # sr Serbian # ss Siswati # st Sesotho # su Sundanese # sv Swedish # sw Swahili # ta Tamil # te Telugu # tg Tajik # th Thai # ti Tigrinya # tk Turkmen # tl Tagalog # tn Setswana # to Tonga # tr Turkish # ts Tsonga # tt Tatar # tw Twi # ty Tahitian # ug Uighur # uk Ukrainian # ur Urdu # uz Uzbek # ve Venda # vi Vietnamese # vo Volapuk # wa Walloon # wo Wolof # xh Xhosa # yi Yiddish # yo Yoruba # za Zhuang # za Zhuang, Chuang # zh Chinese # zu Zulu # ### # English adolph hitler anal analbleed analcavity analcrevass analfuck analingus analintercourse analinvade analjuice analleakage anallovin anallyretentivepubiclouse analmunch analorafice analorgy analpirate analprobe analrape analretentivepubiclouse analsex analspew analspray analtail analtroop analungus analviolate analwart analwhore analzone animalsex anus arse arsebandit arsefuck arsephuck arsephuk arsepiece arsestab arsewipe ashole asphinct ass assbandit assbeat assbite assbiteme assblast assboy assbutt assbyte asscheek asscheese assclown asscock asscrack asscream assenlarge assenmunch assface assfish assfuck assfuk assfunk assgoblin assgrab asshair asshead assho asshoe asshol asshole asshorisin assinahole assjuice asskick asskickboy asskikr asslessone asslick asslip asslord assman assmast assmeat assmilk assmine assmite assmoankey assmong assmonk assmonkey assmunch assowipo assowippo assown asspack asspeddle assphinct assphuck asspiece asspirate assplug asspoop assram assrape assrapingyak assream assrip assrob asstab asstang asstheif asstink asstomp assuck asswack asswater assweed asswhipe asswhole asswhop asswhore asswipe asswoop assylip assynip assyniple asszila badass bastard basterd bastid biach biatch bicht bigass bigassball bigasslip bigbooty bigbutthole bigcock bigdick bigdik bigfatass bigfuk biggay biggaykill biggayman biggaypeck biggusdikus bigho bighoe bigjuicynut bignigger bignut bignutsack bigoldick bigschlong bigslut bigtits bigusdikkus bigusdikus bigwang bigwood biotch bitch bitchass bitchfuck bitchnig bitchqueen bitchslap bitchwhore bitemyass bitemyprick biyotch blowjob boner bulshit bumfuck bumhole bumholeengineer buttbandit buttbang buttblister buttboink buttboy buttbrain buttbreath buttburgelor buttburglar buttburglor buttbut buttcheek buttcheese buttcrack buttcrap buttcrust buttface buttfart buttfloss buttfuc buttfuck buttfugly buttfuk buttfuz buttgoblin buttgrease buttguy butthair butthead butthole butholenginer buttholesurfer buttholio butthymen buttitch buttjuice buttkice buttkick buttkik buttkiss buttknock buttlick buttliquor buttlord buttlove buttluv buttman buttmonkey buttmunch buttnaked buttnugget buttnut buttpick buttpirate buttplug buttpoop buttrape buttsex buttslam buttslut buttsmack buttsniff buttstain buttsuck buttwhore buttwipe cameljockey castrate charliesnif cherrypop chinesewhore chingachgook chink chinkill chinkslope chinksrgay chinkssuck chokingthechicken clit clitlick clitoral clitorious clitoris cock cockandball cockbite cockboy cockface cockhead cocklick cocknball cocksmoke cocksniff cocksuck cocktease coksuck condomeat condomlick condommunch condomsniff coochie coonfuck crackwhore crazychink crazyjap creamycunt creamyknick creamypant crotchsniff crotchwatch cuckmysock cum cumbubble cumbucket cumburp cumgargle cumguzzle cumindabum cumlick cummbubble cumofsomeguy cumonme cumonmytummy cumonu cumquat cumsalot cumshot cumslut cumstain cumswallow cunalingus cungalingus cunnilingus cunningilus cunny cunt cuntface cunthead cuntlick cuntlip cuntylip dasskick dicckweed dicface dichead dick dickbrain dickforabrain dickhead dicklick dickwad dickweed dicwad dik #dike # matches "I'd like" dildo dlldo doggystyle douchebag dumbass fag faggot fannybatter fannycream fannyfart fannyhair fannyjuice fatass fcuk fecalhead fellatio flameinghomo fock fothermuck fucayou fuccer fuccwitme fucd fucface fuchead fuck fuckboy fuckcoons fuckedsideway fuckedup fuckedupanddown fuckedupndown fuckface fuckgm fuckhead fuckhole fuckingyamom fuckinstoned fuckman fuckme fuckmehard fuckmyass fuckmonkey fuckpirate fucknut fuckoff fuckshit fucktard fucku fuckubitch fuckup fuckymamma fuckyou fuckyoucock fuckyoucunt fuckyougm fuckyouii fuckyu fucoff fucq fucqdat fucqu fuct fuctup fucxyou fucya fucyoo fucyou fucyoubich fucyu fudgehole fudgepack fudpuck fugm fugmpuke fuhk fuhku fuhkyoo fuhkyou fuhkyu fuhq fuk fukad fukaduck fukahire fukallyou fukayouho fukc fukchop fukdabitch fukdabtch fukdischit fukead fukedatbirth fukedup fukedyomom fukengruven fukengruvin fukface fukfest fukhole fukinbad fukingfisher fukinggayman fukinggook fukingjap fukingroovin fukingulg fukinlag fukiniger fukinpimp fukinrapist fukit fukjap fukhead fukknut fukkyou fukme fukmegood fukmerun fukmyass fuknclown fukndork fukngruv fukngrv fuknklown fuknmonke fukntheif fuknthief fuknurmom fuknut fukoff fukslut fuksuckblow fukter fuku fukuall fukualso fukuashole fukubiatch fukubizzach fukubyatch fukufuku fukuinyour fukumen fukuo fukuoka fukup fukuppl fukusima fukusuk fukuup fukuusuck fukyah fukyallmofo fukyermom fukyew fukyoass fukyoo fukyou fukyouanddie fukyouus fumonkey funkynegro fuq fuqbich fuqbiotch fuqew fuqfugu fuqnut fuqoff fuqu fuque futhermucker futtbuck fuvkmehard fuvku fuxjoo fuxkyou fuxyou fyuocuk gangbang gangrape gayrape gaywad goatfuck goddam gook hairyclamb hitler honkey hoochiemom hughboobs hugherection hughgass hughgdlck hughgkoch hughgrect hughgrekshon hughgrekshyn hughgshaft hughjardon hughjas hughjassole hughjaynus hughjaz hughjorgan hughjorgen iloveboobs japhate japkill japkillerusa jerkoff jewbag jewboy jewboynigger jewishnazi jewishwhore jigaboo jiz killaniga kunt lickalotpuss lickatit lickball lickemball lickitgood lickithard lickityoufuc lickmebalz lickmecock lickmyanus lickmyass lickmyball lickmycock lickmycrack lickmycrotch lickmynad lickmynut lickmyownpee lickmysack lickmywetbox likmekok likmiclit likmybut masturbate moelester motherfuck mutherfock mycock mydick nazijewraper naziskinhead niga nigaboo nigafag nigah nigaretto nigatrash nigazbiotch nigbeater nigerbeater nigerman nigge niggor niggr niggrian niggy nighaz nigher nigiro nigkilla niglet nigletbard nigletmaster nigofger nigore nigrkill nigromance niguh nigurs nigz nipalicious nipplelicker penis pinktaco poontang pootang prick punkass pussie pussy pussyhole pussylick pussylip pussypound pyropussy queer raghead rape rapeme rectalprobe rectum schit schithead schitngrin schitzngrin scrotum semen shiet shit shite shiteat shithead shitman shitstab sitonmyface slut slutass slutznwhore snatch sperm spermburp spermpants spick spooge spoogebob suckme suckmydick sucmybawl supabiatch twat vageyenuh vagina vaginal vaginallip vaginuh vagiskin wellhung whore # Afrikaans dom doos # af - dumb pussy fok jou # af - fuck you gaan fok jouself # af - go fuck yourself hoer # af - whore jy pis my af # af - you're pissing me off # kak # af - shit poephol # af - asshole poes # af - pussy doos # af - pussy slet # af - slut tief # af - bitch # Arabic # aha # ar - shit # kis # ar - vagina ebn el metanaka # ar - son of a bitch (lit. son of a dirty one) elif # ar - dick gaeheba # ar - bitch haygana # ar - horny kanith # ar - fucker kelbeh # ar - bitch (lit a female dog) khara # ar - shit khawal # ar - gay kisich # ar - pussy koos # ar - cunt. kwanii # ar - faggot maaras # ar - pimp mara # ar - bitch (egypt only) mos zibby! # ar - suck my dick! muti # ar - jackass nikomak # ar - fuck your mother sharmoota # ar - bitch sharmuta # ar - bitch sharmute # ar - bitch tizak # ar - ass tizi # ar - ass zarba # ar - shit zib # ar - penis zibik # ar - dick # Armenian aboosh # hy - stupid buhlo (bul-lo) # hy - dick dmbo # hy - idiot khmbo # hy - idiot eem juges bacheek doer # hy - kiss my penis eem voriga bacheek doer # hy - kiss my ass esh # hy - donkey juge # hy - penis jugik # hy - penis kuk oudelic shoon # hy - shit eating dog metz dzi-zik # hy - big breasts metz jugik # hy - big penis myruht kooneh # hy - fuck your mother peranuht shoonuh kukneh # hy - the dog should shit in your mouth toon esh es # hy - you are a jackass toon vor es # hy - you are an ass vorig # hy - ass vor # hy - ass # Bengali baing chood # bn - sister fucker chood # bn - fuck/fucker choodmarani # bn - mother fucker dhon # bn - dick # gud # bn - pussy haramjada # bn - bastard khanki # bn - whore # maggi # bn - whore laewra aga # bn - dickhead tor bapre choodi # bn - fuck your dad # Bulgarian coochka # bg - bitch # gus # bg - ass luyno # bg - shit luyno guava # bg - shit head pederas # bg - gay / fag peeshka guava # bg - penis head # Czech do prdele # cs - (literally, "in the ass"), "up yours" hovno # cs - "shit" hovnohlava # cs - shithead mrdat # cs - very dirty words for "fuck," used only by the lowest of the low (whores, thugs, etc.) prcat # cs - very dirty words for "fuck," used only by the lowest of the low (whores, thugs, etc.) peecha # cs - pussy/cunt pinjor # cs - cock prsa # cs - tits jebat # cs - fuck pojeb sa # cs - fuck off # Chinese (Cantonese, Mandarin, and Hokkien - phonetic, more or less) bawlanjiao # zh - no cock blowdz # zh - bitch chaocheebye # zh - smelly cunt chaoniniang # zh - fuck your mom chapjong # zh - bastard chewhai # zh - smelly cunt chowfahhai # zh - smelly cheap cunt diaoniameh # zh - fuck your mom diunelomo # zh - fuck your mom feihai # zh - fat cunt ganniniang # zh - fuck your mother gunnima # zh - fuck your mom haipaw # zh - cunty woman hamsap # zh - horny person (not a swear word actually, just an insult) humkahchan # zh - death to your family! ingdow # zh - vagina ingjing # zh - penis jhewlundou # zh - pig cock scrotum jiniu # zh - whore kanilaobeh # zh - fuck your father kanina # zh - fuck your mother kiumo # zh - pubic hair lanhoot # zh - balls lanjiao # zh - dick liumang # zh - standard swear for bastard/assmunch/etc lokchat # zh - dick lunyeung # zh - dick face luntao # zh - dick head nimalabi # zh - your mother contracts turtles. ninabu # zh - your fucking mother owlundunjhewhai # zh - ox cock double-boiled in a pig's cunt poqgai # zh - "go die in the street", general purpose swearword (ie can fit in any context, like "shit!" or "fuck you" or "you bastard" etc etc etc. add words before and after for effect saineniang # zh - shit on your mother (usually in her ear) saybahtpoh # zh - bitch seksi # zh - eat shit tamada # zh - fuck you tiuniamachowhai # zh - fuck your mom's smelly cunt tsaunima # zh - fuck your mother # Dutch (Holland-Belgium) dikzak # nl - fatty eikel # nl - dickhead godverdomme # nl - damn # hoer # nl - hooker/hoar hoerenzoon # nl - son of a prostitute hoerezoon # nl - son of a prostitute # kak # nl - shit klootzak # nl - dick kloten # nl - balls # kut # nl - cunt lomperik # nl - numskull # lul # nl - dick makak # nl - rascist word opdekontneuker # nl - up-the-ass-fucker rotzak # nl - bastard # sperma # nl - sperm stomme zak # nl - stupid asshole stommerik # nl - numskull stront # nl - shit # vagina # nl - pussy verkracht # nl - raping vetzak # nl - fatty # Estonian kuradi munn # et - (Lit. devil's penis) kuradi puts # et - (Lit. devil's cunt) [strong] kurat vo~tku # et - fuck you (Lit. let devil takes it) kusema # et - to piss mine persse! # et - (Lit. go into ass) mine vittu # et - fuck off (Lit. go into cunt) # munn # et - penis nikkuma # et - to fuck nussima # et - to fuck piss/kusi # et - piss pissima # et - to piss # sitt # et - shit sittuma # et - to shit vitt/puts # et - cunt # Finnish runkkari # fi - wanker kusi # fi - piss kusipaeae # fi - pisshead munaa # fi - cock paska # fi - shit paskiainen # fi - bastard suksi vittuun # fi - Ski into a cunt vedae vittu paeaehaen # fi - Draw a cunt over your head vittu # fi - fuck(Lit. cunt) vittupaeae # fi - (Lit. cunthead) # French baise moi # fr - fuck me # bite # fr - cock c'est rien que de la merde # fr - its just a bunch of shit c'est des conneries # fr - that's a load of shit chienne # fr - bitch (lit. female dog) conasse # fr - bitch cul # fr - ass embrasse mon derriere # fr - kiss my ass encule # fr - fuck you (anal style!?) fils de pute # fr - son of a bitch fils du chienne # fr - son of a bitch fous le camp # fr - il est becheur # fr - pompous ass la chatte # fr - cunt la conasse # fr - cunt le con # fr - cunt leche moi et saire me renier # fr - lick me and make me cum mange d'la marde # fr - eat some shit manges la merde # fr - eat shit maudit plotte # fr - filthy cunt (canadian) maudite vache # fr - asshole/bitch/etc - (lit: damned cow) merde # fr - shit mes couilles sur ton nez # fr - my balls on your nose ordure # fr - bitch pauvre con # fr - asshole (lit: you poor cunt) poufiasse # fr - bitch putain # fr - whore pute # fr - whore salope # fr - bitch ta mere est une chienne # fr - your mother is a bitch tapette # fr - faggot tete moi le dard # fr - suck my dick tu m'emmerdes # fr - you're pissing me off (lit. you're shitting on me) tu mangeras le tas # fr - you can eat the pile (usually an answer to "va chier"s) tu me fais chier # fr - you are pissing me off tu t`emmerdes # fr - fuck yourself! tu vache # fr - (lit. you cow) une vieille bique # fr - an old bitch va aux diable # fr - go to hell va briccole avec toi # fr - go tinker with yourself va chier calisse # fr - go shit (canadian) va chier # fr - go shit va jouer avec toi # fr - go play with yourself va te faire cuire un oeuf # fr - va te faire voir # fr - va te faire voir chez les grecs # fr - va faire foutre a la vache # fr - go fuck a cow. va pisser dans les fleurs # fr - fuck off (lit: go piss in the flowers) vas pisser dans les fleurs # fr - fuck off (lit: go piss in the flowers) va te faire enculer # fr - fuck you va te faire foutre # fr - go get fucked (lit: stuff you) zobi # fr - penis # Gaelic pogue mahone # gd - kiss my ass # German # arch # de - ass akrampe # de - asshole arsch # de - ass arschficker # de - assfucker arschgesicht # de - "assface" (butthead) arschkrampe # de - asshole arschloch # de - asshole asch # de - ass depp # de - idiot drecksau # de - dirty pig dummcopf # de - (lit. stupid head) dummkopf # de - (lit. stupid head) dummes huhn # de - stupid chicken feuchten # de - fucking (adjective) fick # de - fuck fickakopf # de - fuckhead ficken # de - fuck fotze # de - cunt himmeldonnerwetter # de - *no translation--very strong curse* (lit. heaven thunder weather) hosenschlange # de - lit. - lick my trouser snake hure # de - whore hurensohn # de - sonuvabitch ich moechte mit dir schlafen # de - i want to sleep with (fuck) you kacke # de - shit kanacke # de - ? (insinuating something bad about the roots of a person (lit. human)) kot # de - shit kotklumpen # de - piece of shit leck mich am arsch # de - lick my ass mach es dir selber # de - go fuck yourself mutterficker # de - motherfucker neger # de - nigger nutte # de - whore penner # de - homeless person (vulgar) pimmel # de - penis poppen # de - fuck rammel # de - fuck rammeln # de - fuck scheis # de - shit scheise # de - shit scheissdreck # de - fucking business (lit: shit) scheissekopf # de - shithead schiese # de - shit schlampe # de - tramp or slut schnoodle noodle # de - dick snot schweinhund # de - (dumb) pigdog (archaic) schwuchtel # de - faggot (noun) schwuchtl # de - faggot (noun) sheiss # de - shit shiess # de - shit shiesse # de - shit sheisse # de - shit wichser # de - motherfucker # Greek as to thialo # el - go to hell ay gamisou # el - go fuck off boostie mav-ro malaka skit-tah # el - nigger dick sucking faggot. fila mou to kolo # el - kiss my ass glikotsutsunos # el - a guy with sweet dick kane mou pipa # el - blow me / suck my dick kolobaras # el - assfucker kolos # el - ass malacca # el - masturbator, harshest swear for a male malaka wanker gamisou # el - fuck off min alazis kathe mera krajion giati mu xeis kani ton poutso uranio toxo # el - don't change your lipstick every day because my dick looks like a rainbow. mounee # el - pussy mouni # el - cunt paliarhido # el - old balls poustis # el - faggot poutsos # el - dick salta gamisou # el - go fuck yourself segrafa sta archidia-mu # el - bullshit. (lit. i write that on my balls.) skila # el - bitch su gamo to spiti, ti mana kai to theo # el - i'll fuck your family one by one,the god that you believe in and especially your mother(the absolute greek insult) tha sou skiso to mouni # el - i will rip your cunt apart to mounee tis manas sou # el - fuck your mother's pussy vlaca # el - stupid (noun), moron vromokola # el - dirty ass # Haitian Creole bobote # ht - pussy bwalong # ht - dick coco # ht - pussy coq # ht - dick dan bounda ou # ht - up your ass guete # ht - pussy kolan guete maman ou # ht - fuck you kreck # ht - pussy l'en mede # ht - piss off (lit. in the shit) ou senti caca # ht - you smell like shit zozo # ht - dick # Hebrew ben sharmuta # he - like son of a bitch ben zonah # he - son of a bitch (son of a whore, actually) benzona # he - son of a bitch coos ima selha # he - your mother's vagina hadagdegan # he - clit harah # he - shit. hutzpa # he - balls (as in he's got a lot of nerve) lakek et hatahat sheli # he - lick my ass lakeki li a hadagdegan # he - lick my clit lech lehizdayen # he - fuck off lech tiezdayen # he - fuck you lech timtzotz et hazayin hakatan shel aba shelcha me'onen ehad # he - go suck your dad's small dick you wanker lech zayen et ima shelcha # he - go fuck your mom lech zayen para # he - go fuck a cow manyak # he - just a cures mishugena # he - freak mitromem mizdayen batahat # he - gay assfucker tahat # he - ass timtzotz li et hazayin, hatichat hara masriach # he - suck my cock you smelly piece of shit zayin # he - penis zayin al hakuss hamasrihach shel haima hamechoeret shelcha # he - fuck your ugly mom's smelly cunt zonah # he - whore # Hungarian bazd meg a picsadat # hu - fuck your cunt fasz # hu - dick geci # hu - crap shit kid lofasz a segedben # hu - horsedick in your ass # Hindi bhai chod # hi - brother fucker bhen chod # hi - sister fucker cheenal # hi - bloody whore chod # hi - fucker chut # hi - pussy chutia # hi - pussy (in a "you are stupid" context) chutiya # hi - fucker gaand # hi - ass gaandu # hi - asshole kutte ki aulad # hi - son of a bitch lund # hi - cock maadarchod # hi - mother fucker mah-der chod # hi - mother fucker mammey # hi - breasts mera goo kha # hi - eat my shit tatti # hi - shit teri gaand mein haathi ka lund # hi - put an elephant dick in your ass teri maa ko mera baap choda # hi - my father fucked your mother # Indonesian isep kontol # id - blow job isep kontol gua # id - suck my dick jembut # id - pubic hair kontol # id - penis memek # id - vagina ngentot # id - fuck ngentot lu # id - fuck you ngewe # id - fucking palaji # id - ( slang ) foreskin pantat # id - ass peler # id - penis pentil # id - nipple perek # id - bitch tai # id - shit toket # id - women's breast # Italian belin # it - penis (dialect) bochino # it - blowjob butana # it - cunt cacata # it - shitting cacatura # it - shit cacca # it - shit cachiata # it - fuck-up/mistake cachio # it - fuck! # (already added by spanish) caga # it - he shit catza # it - fuck catzo # it - dick cazza # it - fuck cazzo # it - dick checca # it - faggot chiavare # it - to fuck with # (already added by spanish) culo # it - ass ditalino # it - masturbation fanculo # it - fuck off (slang) fica # it - cunt ficona # it - whore figa # it - cunt figona # it - whore figlio # it - you shit. finochio # it - gay, homosexual fottere # it - to fuck fottuto # it - fucked (i'm) fregare # it - to hump fregata # it - fucking (noun) fregna # it - cunt fregnaciaro # it - bullshitter, liar (from fregna) frigna # it - cunt froselo # it - fag, homosexual fungula # it - fuck grileto # it - clitoris loffa # it - fart merda # it - shit merdone # it - frequent shitter merdoso # it - covered in shit mierde # it - shit mignota # it - whore minchia # it - cock, penis # mona # it - pussy, vagina no skuche ala gats # it - what the fuck do you want from my balls? pataca # it - pussy, vagina piciu # it - penis pisciatela # it - pussy piscio # it - piss (usually followed by "in your head") pisela # it - pussy pompino # it - blowjob puchiaca # it - cunt # (already added by spanish) puta # it - whore putana # it - whore quaglia # it - pussy que catza # it - what the fuck sbatiare # it - to bang/screw/fuck sbatere # it - to bang/screw/fuck sbatare # it - to bang/screw/fuck sbato # it - fuck it (i don't give a shit) sborare # it - to cum sboro # it - cum sburo # it - cum scopa # it - fuck scopare # it - to fuck scopata # it - a fuck scoregia # it - fart scregia # it - fart # sega # it - beat/fuck off (noun) [common English gaming word] segata # it - fuck-up stronzeto # it - piece of shit stronzino # it - piece of shit stronzo # it - piece of shit stronzolo # it - piece of shit suchiamelo # it - blowjob (slang) ucelino # it - dick ucelo # it - dick vafanculo # it - fuck off venire # it - to cum # Jamaican bumboclot # ?? - cpe - you are full of shit teras # ?? - cpe - your ass # Japanese (phonetic, more or less) ahraywah ohmankogah skeeda # ja - i enjoy pussy very much ama # ja - bitch aho # ja - asshole anato wa onani o shimasuka is # ja - do you masterbate baita # ja - Female of ill repute S**t baka kuso atama # ja - stupid shit head baka yaroo # ja - stupid bastard baka tare # ja - stupid bitch chikushoo # ja - oh fuck! (literally: "animal") chikushou # ja - shit chiku sho # ja - shit chinchin # ja - penis ("thingie") chimpo # ja - penis ("thingie") chinko # ja - penis ("thingie") chinpo # ja - penis ("thingie") fukuro # ja - Male Scrotum Vulgar ketsunoana # ja - asshole kin tama # ja - golden balls kintama # ja - Testicles Vulgar tama # ja - Testicles Vulgar kisama # ja - lord of the donkeys (very rude word meaning "you") kuso # ja - shit kusu o taberu na! # ja - eat fucking shit kono yaroo # ja - This guy (usually how Japanese start fights with each other) It doesn't make sense in English much like the German insult "thick head" manko # ja - pussy manuke # ja - Out of place (Eng Equiv Dumb***) manju Bean Jam bun # ja - refers to female privates onani # ja - masterbate onara # ja - fart onara atama # ja - fart head pai pai # ja - breasts, nipples omanko # ja - Female Privates Extremely Vulgar C**t equivalent omanko suru to do # ja - Female privates...f*** Extroardinarily nasty phrase omanko suru to do suru # ja - Female privates...f*** Extroardinarily nasty phrase wakazo # ja - Young Punk yada # ja - female # Korean (phonetic more or less) dong-mogo # ko - eat shit eemee sheemee pek poejee dah # ko - your mother has a bald pussy geseki # ko - son of a bitch ja-shick # ko - you are a bastard. k-sa-key # ko - bitch ko-chu-pado # ko - suck my dick kochu # ko - dick she-pa-nom # ko - no exact translation but it is the worst word you could ever say in korean. shibseki # ko - all the bad stuff combined, bitch, whore etc. ssibal-seki # ko - son of shit yumago # ko - fuck you # Latin cunnus # la - cunt irrumator # la - bastard leno # la - pimp mentula # la - penis meretrix # la - prostitute pedicabo ego vos et irrumabo # la - i will fuck you in the ass and have you give me some good head spucatum tauri # la - bull shit stercum # la - shit tu es stultior quam asinus # la - you are dumber than an ass # Malaysian (phonetic, more or less) anak haram # ma - bastard bodoh # ma - dumb ass bohsia # ma - young horny bitch celaka # ma - idiot chin hooi # ma - asshole cibai # ma - pussy (?) cor-nek # ma - dick isap telur # ma - suck my balls # (covered by indonesian) pantat # ma - ass pookih lang chiau pakalau mah bong # ma - may your ass, boobs, and penis all fall off puki mak # ma - fuck your mother (also "mother's cunt") puki-thiam # ma - whore house puki # ma - pussy pepek # ma - pussy saya hendak pukimak # ma - i want to fuck your mom shuhana # ma - dick tah fei kei (tfk) # ma - masturbate tet tet # ma - breast tetel # ma - boobs # Maltese (phonetic, more or less) moohoodoo fsodomoc # mt - take it up your ass # Macedonian (phonetic, more or less) pitchga da mahla # mk - literally "return to your mother's cunt" # Norwegian din faens rompeslikker # no - you damn asslicker din mor suger pikk i helvete # no - your mother sucks cock in hell ditt lusne, skitne, stinkende, raatne grisetryne # no - you lousy, dirty stinking, rotten pigface dra meg hardt i rompehara # no - fuck me hard and fast (basically...) dritt # no - shit drittsekk # no - shitbag fitte # no - cunt fleskepanne # no - dickhead helvete # no - hell hore # no - slut knull meg hardt og fort # no - fuck me hard and fast (basically...) pikk # no - dick pule # no - fuck rompeslikker # no - asslicker un da sac # no - you sack of shit # Persian (phonetic, more or less) amale # fa - dirty piece of shit labor worker an damagh # fa - booger bee-sharaf # fa - [bad insult]. def. (?) beshoor # fa - no brained coony # fa - faggot gendeh # fa - bitch or whore kesafat # fa - you dirty piece of shit khar coste # fa - your sister is a bitch kos-khol # fa - person who is crazy and obessed for a girl's pussy kosefil # fa - elephant's cunt kosskesh # fa - pimp (literal: "one who stretches pussy") madar kharbeh # fa - mother fucker mardar sag # fa - (lit.) your mother is a dog. pedar sag # fa - (lit.) your father is a dog # Polish chuj # pl - dick coorva # pl - fuck dupek # pl - asshole dzifka # pl - whore (light) dzivka # pl - whore (light) dziwka # pl - whore (light) fiucie # pl - dick fiut # pl - dick gowno # pl - shit huj # pl - dick jeba # pl - fuck jebac # pl - to fuck jebak # pl - to fuck jeban # pl - to fuck jebniet # pl - fucked, fucked up jebniety # pl - fucked, fucked up kurva # pl - whore (hard) kurwa # pl - whore (hard), fig. "oh shit!" kurwiszon # pl - son of a bitch kutas # pl - dick ochujales # pl - fucking crazy peezda # pl - pussy pierdol # pl - fuck pierdolec # pl - fucker pizda # pl - pussy pizde # pl - pussy pizdo # pl - pussy pizdy # pl - pussy pojeb # pl - fucker pojeban # pl - fucked up pojebany # pl - fucked up qrva # pl - whore qrwa # pl - whore skurwysysn # pl - son of a bitch spieprzaj # pl - piss off spierdala # pl - fuck off spierdalaj # pl - fuck off ssij mi pale # pl - suck my dick swiniojebca # pl - pigfucker wpierdal # pl - kick their ass wpierdala # pl - eat something vulgar wpierdalac # pl - eat something vulgar wypierdala # pl - fuck off wypierdalaj # pl - fuck off zajebicie # pl - "fucking awesome" zajebiste # pl - "fucking awesome" zapierdol # pl - fuck zapierdole # pl - fuck (going to fuck something up) # Portuguese # broche # pt - cock sucking # chupame # pt - suck my cock corno # pt - faggot foda-se # pt - fuck (figurative) fodeis # pt - ye fuck, formal fodem # pt - they fuck fodemos # pt - we fuck foder # pt - to fuck; Present Indicative: eu fodes # pt - you fuck fodo # pt - I fuck fuda # pt - I will fuck fudai # pt - ye will fuck, formal # fudais # pt - ye fuck, formal fudam # pt - they fuck fudamos # pt - we fuck # fudas # pt - you fuck fude # pt - you will fuck fudem # pt - they will fuck fudemos # pt - we will fuck fudo # pt - I fuck pica # pt - cock piroca # pt - cock caralho # pt - cock # puta # pt - bitch cabra # pt - bitch voi te foder # pt - fuck you vai para o caralho # pt - go piss off (go to hell) # Russian baltattsya kak govno v prorubi # ru - to be flighty or indecisive (Lit. to bob like shit in a hole in the ice) bivneetca # ru - showing off asshole blednoye chudo # ru - flaming asshole (Lit. "pale wonder" - may not be valid) bliad' # ru - whore dermo # ru - shit govniuk # ru - shithead govno # ru - shit (literally) khui # ru - cock kooshi govno ee oomree # ru - eat shit and die manda # ru - cunt mudak # ru - an asshole (a person only) peesa # ru - polite penis per-ee-staan haameetca # ru - stop bitching # pizda # ru - cunt poshol na khui # ru - Fuck off (Lit. go onto a dick) poshol v zhopu # ru - Fuck off (Lit. go into an asshole) sooka # ru - Bitch/traitor/whore sraka # ru - an ass (extremely vulgar) tebya ne ebut, ti ne podmakhivai # ru - mind your own fucking business (Lit. you're not being fucked, so don't wiggle your ass) tva-ya mama sa-seet kor-rov-on-ni-ye hoy-ee # ru - You mother sucks cow dicks. yob # ru - Fuck (verb root)(ie "I Fuck"="Ya Yebur" yob tvoiu mat' # ru - "Fuck you!" or "Oh shit!" (literal: "Fuck your mother" or "I just fucked your mother") (perhaps the harshest insult in Russian) yob tvoyu mat # ru - fuck your mother zhopa # ru - an asshole or an ass # Serbian govedo # sr - jerk govno yedno # sr - you piece of shit. isisas mi kurcu seme # sr - you are sucking out my sperm readily. jebem # sr - fucking jebo # sr - fuck krasni # sr - dick krusnee # sr - dick peechka # sr - pussy peecko # sr - pussy peetchqu # sr - pussy seljacka # sr - redneck selyacka # sr - redneck sisadzijo # sr - cock sucker # some # sr - stupid ass sranje # sr - shit yebachu # sr - fuck yebem # sr - fuck (phonetic) yebo # sr - fuck (phonetic) # Slovenian drek # sl - shit kurac # sl - penis peder # sl - faggot pejt u pizdu # sl - your mothers vagina # pizda # sl - vagina # pizdu # sl - vagina preklet vosu # sl - cursed donkey (literally "bloody fool") # Spanish arrecho # es - horny arrima # es - fuck the hell out of (slang) arrimo # es - i fuck the hell out of (slang) avergallon # es - masturbation (mexican slang) bacalao # es - cunt (mexican slang) bajar al pozo # es - to eat pussy (cuban) cabron # es - dick head cachate # es - go fuck yourself (peruvian) cago # es - i shit cagada # es - a shit cagate # es - shit yourself cagaste # es - you shit yourself caga # es - he shit cagar # es - to shit (verb) cagaron # es - they shit cagais # es - yea shit capullo # es - asshole,idiot (lit. head of penis) carajo # es - penis (go to hell, wtf do you want) caray # es - explitive like fuck/shit (lit. damn) casquete # es - fuck (slang) chacon # es - cunt (argentinian slang) chardo # es - nigger (cuban slang) chichis # es - breasts/tits chilito # es - little dick (mexican insult) chimba # es - pussy (colombian) chinga # es - fuck chingar # es - to fuck chingada # es - fucking chingalo # es - fuck it chingate # es - fuck you (mexican) chingas tu madre # es - fuck your mom chocho # es - cunt (spanian and mexican) chorizo # es - dick (lit. sausage) chucha # es - fuck chupame # es - suck me/my chuperson # es - penis (mexican slang) cipote # es - penis cogete # es - go fuck yourself (lit. go catch yourself) cojoneando # es - fucking cojonear # es - to fuck around colgados # es - old/saggy withered tits (mexican slang) comemierda # es - eat shit (cuban), usually two words concha # es - cunt (uruguayan slang) cono # es - cunt (con~o) crica # es - pussy (puerto rican) culear # es - to fuck (lit. to move the ass) culo # es - ass cusca # es - slut (mexican) decojo # es - decojo (dialect) fachar # es - to fuck a woman (venezuelan) fache # es - fuck a woman (venezuelan) facho # es - fuck a woman (venezuelan) flete # es - pussy/ass (cuban slang) follado # es - fucked (male) follada # es - fucked (female) follar # es - to fuck foquin # es - fucking (puerto rican phonetic of english) guarra # es - bitch guebo # es - cock (santo domingan slang) gilipolla # es - asshole (slang) hacete cojer # es - go and get fucked joder # es - to fuck/bother jodete # es - go fuck yourself jodida # es - fucked (female) jodido # es - fucked (male) joto # es - faggot (mexican slang) maleton # es - son of a bitch (mexican and south american) mamey # es - cunt (mexican) mico # es - cunt (lit. monkey, costa rican) maricon # es - faggot mierda # es - shit morrongo # es - dick (mexican slang) murrda # es - shit (slang) nema # es - cock/penis (n~ema) nido # es - cunt (mexican slang) ojete # es - asshole # orto # es - ass (argentinian and uruguayan) panocha # es - pussy (extremely vulgar, mex) peha # es - dick pelotuda # es - dumbass pelotudo # es - dumbass pendejo # es - (m/f) asshole, dickhead, etc. pendeja # es - (m/f) asshole, dickhead, etc. pene # es - penis perra # es - bitch picha # es - prick pija # es - penis (slang) pijo # es - penis (slang) pinche # es - fucking (slang) pinga # es - dick pipote # es - clitoris (lit. big sunflower seed) polla # es - penis popa # es - arse puta # es - (feminine) whore, bitch # puto # es - (masculine) dickhead, asshole raja # es - cunt (lit. slit) reata # es - penis rejue # es - prostitute (mexican/guatemalan slang) rejuego # es - prostitute (mexican/guatemalan slang) remame # es - cunt (mexican slang) rene # es - nigger (mexican slang) riata # es - dick (mexican slang) # rul # es - asshole (mexican slang) sacale la leche # es - make her cum (lit. take the milk out of her) taconera # es - prostitute (lit. high-heeler) trastero # es - asshole (lit. anus) verga # es - dick (lit. broomstick) vergalito # es - masturbation of the penis vergalo # es - masturbation of penis by self violacion en groupo # es - gang-bang (rape) zorra # es - bitch zuramata # es - dumbass zuramato # es - dumbass zurar # es - to shit/defecate zurulo # es - shit (slang) # Swedish din morsa luktar friterad getrov i fittan # sv - your mother smells like fried goatass in her cunt # fan # sv - damn fitta # sv - cunt # (covered by norwegian) helvete # sv - hell knullare # sv - fucker # kuk # sv - cock kuksugare # sv - cocksucker mammaknullare # sv - motherfucker pattar # sv - tits sug min kuk # sv - suck my cock # Tagalog (Philippine) anak ka nang puta # tl - son of a bitch bi-ho kee kee # tl - stinky pussy. didilain ko ang tingil mo # tl - i'll lick your clit igao walang kang diti # tl - you are dickless igao walang kang puit # tl - you are buttless lunukin mo ang tamod ko # tl - swallow my cum magkantutan tayo # tl - let's fuck malaki ang susu mo # tl - you got big tits maliit ang titi mo # tl - you got a small dick naninigas ang titi ko # tl - i got a hard on puke nang ina mo # tl - your mom's pussy putang ina mo # tl - your mom is a bitch sipsipin mo ang titi ko # tl - suck my dick # tae # tl - shit tukmol # tl - ugly # Turkish anani sikerim # tr - i'll fuck your mum ananin yara var, ve baban jelos oldu # tr - your mums got a dick and your father jealous. chukumu yala # tr - suck my dick got veren # tr - ass giver ibne # tr - faggot siktir lan # tr - get fucked # um # tr - cunt # Vietnamese du-ma-nhieu # vi - go fuck yourself doom mare may # vi - fuck your mother dum mare may # vi - fuck your mother geeum # vi - pussy # goo # vi - dick lo-de # vi - asshole # Ukrainian hivno # uk - shit # (covered by russian) khui # uk - cock # (covered by russian) sraka # uk - ass # Yiddish # (covered by hebrew) mishugena # yi - freak # putz # yi - dickhead schlemeil # yi - asshole (the one that "screws") schlmazel # yi - asshole ("gets screwed" by the schlemeil) yutz # yi - asshole # Zulu bhebha # zu - fuck golo # zu - cunt malebeh # zu - cunt lips masendeh # zu - bolls masendeh kababu waku # zu - your father's bolls msuno kanyoku # zu - your mother's cunt msunu ka nyoko # zu - your mother's cunt ngquza # zu - asshole sifebe # zu - whore stabaneh # zu - faggot umgogo waku isfebe # zu - your grandmother is a bitch # UNKNOWN zabourah qahbeh mibun mamhoon chraa ayir atouche futkretzn # Local Variables: *** # mode:Text *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/pingtimes.sh000077500000000000000000000071571200563112200167420ustar00rootroot00000000000000#!/bin/sh # # p i n g t i m e s . s h # # Computes BZFlag server ping times from the caller's location. # Servers are then returned, sorted in order from high to low ping. # # Version 1.0.0 # Initially written by Sean Morrison aka brlcad aka learner in 2004 # this script is in the public domain ### echo "BZFlag Server Ping Times" echo "========================" echo echo "Processing BEGINS ..." echo -n "... testing tempfile usage ..." tempfile="/tmp/pingtimes.sh.$RANDOM.$$" touch "$tempfile" [ ! -f "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to create temp file ($tempfile)" && exit 1 [ ! -w "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to write to temp file ($tempfile)" && exit 1 [ ! -r "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to read temp file ($tempfile)" && exit 1 echo " okay" echo -n "... getting list of servers ..." servers=`curl "http://my.BZFlag.org/db/?action=LIST" 2>/dev/null` [ $? != 0 ] && echo " NOT okay" && echo "ERROR: unable to curl http://my.BZFlag.org/db" && exit 1 echo " okay" echo -n "... writing server list to temporary file ..." cat > "$tempfile" < $pid if CVSROOT=$cvsroot cvs -q up -PdA | grep ^[PU] ; then # we have new code, rebuild ./autogen.sh --quiet --enable-debug --enable-bzadmin \ | grep -v "^creating.*Makefile$" \ | grep -v "^make" # [s] keeps us from finding ourselves bzfspid=`ps xo pid,command | grep "$where/[s]rc/bzfs/bzfs" | awk '{ print $1 }'` if [ -n "$bzfspid" ] ; then kill $bzfspid fi fi rm $pid bzflag-2.4.2+ds1/misc/rrlog.cxx000066400000000000000000000236531200563112200162540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // RRLOG // // This program can be used by server admins to // examine their record/replay files in detail. // // system headers #include #include #include #include #include #ifndef _WIN32 # include # include typedef int64_t s64; #else typedef __int64 s64; #endif // common headers #include "common.h" #include "global.h" #include "Protocol.h" #include "Pack.h" #include "TextUtils.h" #include "version.h" // bzfs headers #include "RecordReplay.h" // local headers #include "MsgStrings.h" // Type Definitions // ---------------- typedef uint16_t u16; typedef uint32_t u32; typedef s64 RRtime; typedef struct RRpacket { struct RRpacket *next; struct RRpacket *prev; u16 mode; u16 code; u32 len; u32 nextFilePos; u32 prevFilePos; RRtime timestamp; char *data; } RRpacket; static const int RRpacketHdrSize = sizeof(RRpacket) - (2 * sizeof(RRpacket*) - sizeof(char*)); typedef struct { u32 magic; // record file type identifier u32 version; // record file version u32 offset; // length of the full header RRtime filetime; // amount of time in the file u32 player; // player that saved this record file u32 flagsSize; // size of the flags data u32 worldSize; // size of world database char callSign[CallSignLen]; // player's callsign char motto[MottoLen]; // player's motto char serverVersion[8]; // BZFS protocol version char appVersion[MessageLen]; // BZFS application version char realHash[64]; // hash of worldDatabase char worldSettings[4 + WorldSettingsSize]; // the game settings char *flags; // a list of the flags types char *world; // the world } ReplayHeader; static const int ReplayHeaderSize = sizeof(ReplayHeader) - (2 * sizeof(char*)); // Function Prototypes // ------------------- static void printHelp(const char* execName); static bool loadHeader(ReplayHeader *h, FILE *f); static RRpacket *loadPacket(FILE *f); static void *nboUnpackRRtime(void *buf, RRtime& value); static std::string strRRtime(RRtime timestamp); int debugLevel = 0; static int outputLevel = 0; /****************************************************************************/ int main(int argc, char** argv) { FILE *file = NULL; ReplayHeader header; RRpacket *p; const char* execName = argv[0]; bool useColor = true; bool useMotto = true; bool onlyMessages = false; printf("\nRRLOG-%s\nProtocol BZFS%s: %i known packet types\n\n", getAppVersion(), getProtocolVersion(), MsgStrings::knownPacketTypes()); if (argc < 2) { printHelp(execName); exit(1); } while (argc > 1) { if (strcmp("-h", argv[1]) == 0) { printHelp(execName); exit(0); } else if (strcmp("-o", argv[1]) == 0) { if (argc < 3) { printf("* Missing the -o parameter or the filename\n\n"); printHelp(execName); exit(1); } else { outputLevel = atoi(argv[2]); argc = argc - 2; argv = argv + 2; } } else if (strcmp("-c", argv[1]) == 0) { useColor = false; argc--; argv++; } else if (strcmp("-e", argv[1]) == 0) { useMotto = false; argc--; argv++; } else if (strcmp("-m", argv[1]) == 0) { onlyMessages = true; argc--; argv++; } else { argc++; break; } } if (argc < 2) { printf("* Missing filename\n\n"); printHelp(execName); exit(1); } file = fopen(argv[1], "rb"); if (file == NULL) { perror("fopen"); exit(1); } if (!loadHeader(&header, file)) { printf("Couldn't load file header\n"); fclose(file); exit(1); } unsigned int secs = header.filetime / 1000000; unsigned int days = secs / (24 * 60 * 60); secs = secs % (24 * 60 * 60); unsigned int hours = secs / (60 * 60); secs = secs % (60 * 60); unsigned int minutes = secs / 60; secs = secs % 60; unsigned int usecs = header.filetime % 1000000; // load the first packet for its timestamp p = loadPacket(file); time_t startTime, endTime; if (p != NULL) { startTime = (time_t)(p->timestamp / 1000000); endTime = (time_t)((header.filetime + p->timestamp) / 1000000); } else { startTime = endTime = 0; } printf("magic: 0x%04X\n", header.magic); printf("replay: version %i\n", header.version); printf("offset: %i\n", header.offset); printf("length: %-i days, %i hours, %i minutes, %i seconds, %i usecs\n", days, hours, minutes, secs, usecs); printf("start: %s", ctime(&startTime)); printf("end: %s", ctime(&endTime)); printf("author: %s (%s)\n", header.callSign, header.motto); printf("bzfs: bzfs-%s\n", header.appVersion); printf("protocol: %.8s\n", header.serverVersion); printf("flagSize: %i\n", header.flagsSize); printf("worldSize: %i\n", header.worldSize); printf("worldHash: %s\n", header.realHash); printf("\n"); MsgStrings::init(); MsgStrings::colorize(useColor); MsgStrings::showMotto(useMotto); // MsgStrings::colorize(false); bool needUpdate = true; do { if (needUpdate && (p->mode == RealPacket)) { needUpdate = false; } if ((p->mode == RealPacket) || (p->mode == HiddenPacket) || ((p->mode == StatePacket) && needUpdate)) { if (!onlyMessages || (p->code == MsgMessage)) { int i, j; MsgStringList list = MsgStrings::msgFromServer (p->len, p->code, p->data); for (i = 0; i < (int) list.size(); i++) { if (list[i].level > outputLevel) { break; } if (i == 0) { std::cout << strRRtime(p->timestamp) << ": "; } for (j = 0; j < list[i].level; j++) { std::cout << " "; } std::cout << list[i].color; std::cout << list[i].text; if (useColor) { std::cout << "\033[0m"; } std::cout << std::endl; } } } else if (p->mode == StatePacket) { MsgStrings::msgFromServer(p->len, p->code, p->data); } else if (p->mode == UpdatePacket) { std::cout << strRRtime(p->timestamp) << ": UPDATE PACKET" << std::endl; } delete[] p->data; delete p; } while ((p = loadPacket(file)) != NULL); delete[] header.world; delete[] header.flags; fclose(file); return 0; } /****************************************************************************/ static void printHelp(const char* execName) { printf("usage:\t%s [options] \n\n", execName); printf(" -h : print help\n"); printf(" -o : set output level\n"); printf(" -c : disable printing ANSI colors\n"); // printf(" -e : disable printing mottos\n"); // printf(" -m : only print message packets\n"); printf("\n"); return; } /****************************************************************************/ static bool loadHeader(ReplayHeader *h, FILE *f) { char buffer[ReplayHeaderSize]; void *buf; if (fread(buffer, ReplayHeaderSize, 1, f) <= 0) { return false; } buf = nboUnpackUInt(buffer, h->magic); buf = nboUnpackUInt(buf, h->version); buf = nboUnpackUInt(buf, h->offset); buf = nboUnpackRRtime(buf, h->filetime); buf = nboUnpackUInt(buf, h->player); buf = nboUnpackUInt(buf, h->flagsSize); buf = nboUnpackUInt(buf, h->worldSize); buf = nboUnpackString(buf, h->callSign, sizeof(h->callSign)); buf = nboUnpackString(buf, h->motto, sizeof(h->motto)); buf = nboUnpackString(buf, h->serverVersion, sizeof(h->serverVersion)); buf = nboUnpackString(buf, h->appVersion, sizeof(h->appVersion)); buf = nboUnpackString(buf, h->realHash, sizeof(h->realHash)); // load the flags, if there are any if (h->flagsSize > 0) { h->flags = new char [h->flagsSize]; if (fread(h->flags, h->flagsSize, 1, f) == 0) { return false; } } else { h->flags = NULL; } // load the world database h->world = new char [h->worldSize]; if (fread(h->world, h->worldSize, 1, f) == 0) { return false; } return true; } /****************************************************************************/ static RRpacket* loadPacket(FILE *f) { RRpacket *p; char bufStart[RRpacketHdrSize]; void *buf; if (f == NULL) { return false; } p = new RRpacket; if (fread(bufStart, RRpacketHdrSize, 1, f) <= 0) { delete p; return NULL; } buf = nboUnpackUShort(bufStart, p->mode); buf = nboUnpackUShort(buf, p->code); buf = nboUnpackUInt(buf, p->len); buf = nboUnpackUInt(buf, p->nextFilePos); buf = nboUnpackUInt(buf, p->prevFilePos); buf = nboUnpackRRtime(buf, p->timestamp); if (p->len > (MaxPacketLen - ((int)sizeof(u16) * 2))) { fprintf(stderr, "loadPacket: ERROR, packtlen = %i\n", p->len); delete p; return NULL; } if (p->len == 0) { p->data = NULL; } else { p->data = new char [p->len]; if (fread(p->data, p->len, 1, f) <= 0) { delete[] p->data; delete p; return NULL; } } return p; } /****************************************************************************/ static void* nboUnpackRRtime(void *buf, RRtime& value) { u32 msb, lsb; buf = nboUnpackUInt(buf, msb); buf = nboUnpackUInt(buf, lsb); value = ((RRtime)msb << 32) + (RRtime)lsb; return buf; } static std::string strRRtime(RRtime timestamp) { time_t date = (time_t)(timestamp / 1000000); char buffer[32]; strftime(buffer, 32, "%Y/%m/%d %T", gmtime(&date)); std::string str = buffer; unsigned int millisecs = (timestamp % 1000000) / 1000; str += TextUtils::format(" (%03i ms)", millisecs); return str; } /****************************************************************************/ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/serverstats.sh000077500000000000000000000147521200563112200173270ustar00rootroot00000000000000#!/bin/sh # # s e r v e r s t a t s . s h # # Computes BZFlag server statistics by querying all public servers # listed by the list server with bzadmin, and parsing the server # identification signature. # # Version 1.0.0 # Initially written by Sean Morrison aka brlcad aka learner in 2004 # this script is in the public domain ### echo "BZFlag Server Statistics" echo "========================" echo echo "Processing BEGINS ..." echo -n "... testing bzadmin ..." bzadmin="bzadmin" bzadmin_version="`$bzadmin -help 2>&1`" [ $? != 1 ] && echo " NOT okay" && echo "ERROR: bzadmin is expected to be in your path" && exit 1 [ ! "x`echo $bzadmin_version | awk '{print $1}'`" = "xbzadmin" ] && echo " NOT okay" && echo "ERROR: bzadmin is expected to be in your path" && exit 1 echo " okay" echo -n "... testing tempfile usage ..." tempfile="/tmp/servers.sh.$RANDOM.$$" touch "$tempfile" [ ! -f "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to create temp file ($tempfile)" && exit 1 [ ! -w "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to write to temp file ($tempfile)" && exit 1 [ ! -r "$tempfile" ] && echo " NOT okay" && echo "ERROR: unable to read temp file ($tempfile)" && exit 1 echo " okay" echo -n "... getting list of servers ..." servers=`curl http://my.BZFlag.org/db/?action=LIST 2>/dev/null` [ $? != 0 ] && echo " NOT okay" && echo "ERROR: unable to curl http://my.BZFlag.org/db/?action=LIST" && exit 1 echo " okay" echo -n "... writing server list to temporary file ..." cat > "$tempfile" <> $tempfile ( sleep $sleeptime ; echo "/quit" ) | $bzadmin -ui stdboth serverstats_sh_$RANDOM@$server 2>&1 | grep "BZFlag server" >> $tempfile & [ $? != 0 ] && echo ". NOT okay" && echo "WARNING: unable to use bzadmin on $server" && break sleep $sleeptime server_version="`tail -1 $tempfile | grep "BZFlag server" | awk '{print $4}'`" if [ ! "x$server_version" = "x" ] ; then break fi done if [ "x$server_version" = "x" ] ; then echo " NOT okay" echo "WARNING: $server seems to be unresponsive" else echo " okay" server_signatures="$server_signatures $server_version" reachcount="`expr $reachcount + 1`" fi count="`expr $count + 1`" done # !!! #fi echo -n "... sorting versions .." server_versions="" server_dates="" server_types="" server_ostypes="" server_signatures="`echo $server_signatures | sed 's/,//g'`" for server in $server_signatures ; do serverunder="`echo $server | sed 's/[-.]/_/g'`" server2="`echo $serverunder | sed 's/_/ /g'`" version="`echo $server2 | awk '{printf "%d.%d.%d", $1, $2, $3}'`" server_versions="$server_versions $version" builddate="`echo $server2 | awk '{print $4}'`" server_dates="$server_dates $builddate" buildtype="`echo $server2 | awk '{print $5}'`" server_types="$server_types $buildtype" ostype="`echo $server | sed 's/.*-[A-Z]*-\(.*\)/\1/'`" server_ostypes="$server_ostypes $ostype" echo -n "." done echo " okay" echo -n "... killing unterminated bzadmins ..." killall bzadmin [ $? = 0 ] && echo " NOT okay" && echo "WARNING: unable to killall bzadmin" echo " okay" echo -n "... deleting temporary file ..." rm -f "$tempfile" [ $? != 0 ] && echo " NOT okay" && echo "ERROR: unable to properly remove tempfile ($tempfile)" && exit 1 [ -f "$tempfile" ] && echo " NOT okay" && echo "ERROR: tempfile ($tempfile) deleted yet still exits?!" && exit 1 echo " okay" echo "... processing COMPLETE" echo echo "Server Summary" echo "--------------" echo "Servers Listed: $servercount " echo "Servers Reached: $reachcount " echo echo "Versions:" seen_versions="" for i in $server_versions ; do seen="no" for ver in $seen_versions ; do if [ "x$ver" = "x$i" ] ; then seen="yes" break fi done if [ "x$seen" = "xno" ] ; then count=0 for ver in $server_versions ; do if [ "x$ver" = "x$i" ] ; then count="`expr $count + 1`" fi done echo " $count of $i" seen_versions="$seen_versions $i" fi done echo echo "Build dates:" seen_dates="" for i in $server_dates ; do seen="no" for date in $seen_dates ; do if [ "x$date" = "x$i" ] ; then seen="yes" break fi done if [ "x$seen" = "xno" ] ; then count=0 for date in $server_dates ; do if [ "x$date" = "x$i" ] ; then count="`expr $count + 1`" fi done echo " $count of `echo $i | sed 's/\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)/\1.\2.\3/'`" seen_dates="$seen_dates $i" fi done echo echo "Build types:" seen_types="" for i in $server_types ; do seen="no" for type in $seen_types ; do if [ "x$type" = "x$i" ] ; then seen="yes" break fi done if [ "x$seen" = "xno" ] ; then count=0 for type in $server_types ; do if [ "x$type" = "x$i" ] ; then count="`expr $count + 1`" fi done echo " $count of $i" seen_types="$seen_types $i" fi done echo echo "Operating systems:" seen_os="" for i in $server_ostypes ; do seen="no" for os in $seen_os ; do if [ "x$os" = "x$i" ] ; then seen="yes" break fi done if [ "x$seen" = "xno" ] ; then count=0 for os in $server_ostypes ; do if [ "x$os" = "x$i" ] ; then count="`expr $count + 1`" fi done echo " $count of $i" seen_os="$seen_os $i" fi done echo echo "Done." # Local Variables: *** # mode: sh *** # tab-width: 8 *** # sh-basic-offset: 2 *** # sh-indentation: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/shtool000077500000000000000000001147441200563112200156430ustar00rootroot00000000000000#!/bin/sh ## ## GNU shtool -- The GNU Portable Shell Tool ## Copyright (c) 1994-2005 Ralf S. Engelschall ## ## See http://www.gnu.org/software/shtool/ for more information. ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. ## ## Version: 2.0.2 (15-Jun-2005) ## Contents: 4/19 available modules ## ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ## USA, or contact Ralf S. Engelschall . ## ## NOTICE: Given that you include this file verbatim into your own ## source tree, you are justified in saying that it remains separate ## from your package, and that this way you are simply just using GNU ## shtool. So, in this situation, there is no requirement that your ## package itself is licensed under the GNU General Public License in ## order to take advantage of GNU shtool. ## ## ## Usage: shtool [] [ [] []] ## ## Available commands: ## echo Print string with optional construct expansion ## install Install a program, script or datafile ## mkdir Make one or more directories ## path Deal with program paths ## ## Not available commands (because module was not built-in): ## mdate Pretty-print modification time of a file or dir ## table Pretty-print a field-separated list as a table ## prop Display progress with a running propeller ## move Move files with simultaneous substitution ## mkln Make link with calculation of relative paths ## mkshadow Make a shadow tree through symbolic links ## fixperm Fix file permissions inside a source tree ## rotate Logfile rotation ## tarball Roll distribution tarballs ## subst Apply sed(1) substitution operations ## platform Platform Identification Utility ## arx Extended archive command ## slo Separate linker options by library class ## scpp Sharing C Pre-Processor ## version Maintain a version information file ## if [ $# -eq 0 ]; then echo "$0:Error: invalid command line" 1>&2 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1 fi if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then echo "This is GNU shtool, version 2.0.2 (15-Jun-2005)" echo "Copyright (c) 1994-2005 Ralf S. Engelschall " echo "Report bugs to " echo '' echo "Usage: shtool [] [ [] []]" echo '' echo 'Available global :' echo ' -v, --version display shtool version information' echo ' -h, --help display shtool usage help page (this one)' echo ' -d, --debug display shell trace information' echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available [] []:' echo ' echo [-n|--newline] [-e|--expand] [ ...]' echo ' install [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]' echo ' [-C|--compare-copy] [-s|--strip] [-m|--mode ]' echo ' [-o|--owner ] [-g|--group ] [-e|--exec' echo ' ] [ ...] ' echo ' mkdir [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ]
      ' echo ' [ ...]' echo ' path [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]' echo ' [-m|--magic] [-p|--path ] [ ...]' echo '' echo 'Not available (because module was not built-in):' echo ' mdate [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]' echo ' [-f|--field-sep ] [-o|--order ] ' echo ' table [-F|--field-sep ] [-w|--width ] [-c|--columns' echo ' ] [-s|--strip ] ...' echo ' prop [-p|--prefix ]' echo ' move [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]' echo ' ' echo ' mkln [-t|--trace] [-f|--force] [-s|--symbolic] ' echo ' [ ...] ' echo ' mkshadow [-v|--verbose] [-t|--trace] [-a|--all] ' echo ' fixperm [-v|--verbose] [-t|--trace] [ ...]' echo ' rotate [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files' echo ' ] [-s|--size ] [-c|--copy] [-r|--remove]' echo ' [-a|--archive-dir ] [-z|--compress [:]]' echo ' [-b|--background] [-d|--delay] [-p|--pad ] [-m|--mode' echo ' ] [-o|--owner ] [-g|--group ] [-M|--migrate' echo ' ] [-P|--prolog ] [-E|--epilog ] [...]' echo ' tarball [-t|--trace] [-v|--verbose] [-o|--output ]' echo ' [-c|--compress ] [-d|--directory ] [-u|--user' echo ' ] [-g|--group ] [-e|--exclude ]' echo ' [ ...]' echo ' subst [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]' echo ' [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup' echo ' ] [-e|--exec ] [-f|--file ] []' echo ' [...]' echo ' platform [-F|--format ] [-S|--sep ] [-C|--conc' echo ' ] [-L|--lower] [-U|--upper] [-v|--verbose]' echo ' [-c|--concise] [-n|--no-newline] [-t|--type ]' echo ' [-V|--version] [-h|--help]' echo ' arx [-t|--trace] [-C|--command ] [' echo ' ...]' echo ' slo [-p|--prefix ] -- -L -l [-L -l' echo ' ...]' echo ' scpp [-v|--verbose] [-p|--preserve] [-f|--filter ]' echo ' [-o|--output ] [-t|--template ] [-M|--mark' echo ' ] [-D|--define ] [-C|--class ]' echo ' [ ...]' echo ' version [-l|--language ] [-n|--name ] [-p|--prefix' echo ' ] [-s|--set ] [-e|--edit] [-i|--increase' echo ' ] [-d|--display ] ' echo '' exit 0 fi if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then echo "GNU shtool 2.0.2 (15-Jun-2005)" exit 0 fi if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then shtoolize -oshtool echo install mkdir path exit 0 fi if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then shift set -x fi name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` case "$name" in echo|install|mkdir|path ) # implicit tool command selection tool="$name" ;; * ) # explicit tool command selection tool="$1" shift ;; esac arg_spec="" opt_spec="" gen_tmpfile=no ## ## DISPATCH INTO SCRIPT PROLOG ## case $tool in echo ) str_tool="echo" str_usage="[-n|--newline] [-e|--expand] [ ...]" arg_spec="0+" opt_spec="n.e." opt_alias="n:newline,e:expand" opt_n=no opt_e=no ;; install ) str_tool="install" str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode ] [-o|--owner ] [-g|--group ] [-e|--exec ] [ ...] " arg_spec="1+" opt_spec="v.t.d.c.C.s.m:o:g:e+" opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec" opt_v=no opt_t=no opt_d=no opt_c=no opt_C=no opt_s=no opt_m="0755" opt_o="" opt_g="" opt_e="" ;; mkdir ) str_tool="mkdir" str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode ] [-o|--owner ] [-g|--group ] [ ...]" arg_spec="1+" opt_spec="t.f.p.m:o:g:" opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group" opt_t=no opt_f=no opt_p=no opt_m="" opt_o="" opt_g="" ;; path ) str_tool="path" str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path ] [ ...]" gen_tmpfile=yes arg_spec="1+" opt_spec="s.r.d.b.m.p:" opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path" opt_s=no opt_r=no opt_d=no opt_b=no opt_m=no opt_p="$PATH" ;; -* ) echo "$0:Error: unknown option \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; * ) echo "$0:Error: unknown command \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; esac ## ## COMMON UTILITY CODE ## # commonly used ASCII values ASC_TAB=" " ASC_NL=" " # determine name of tool if [ ".$tool" != . ]; then # used inside shtool script toolcmd="$0 $tool" toolcmdhelp="shtool $tool" msgprefix="shtool:$tool" else # used as standalone script toolcmd="$0" toolcmdhelp="sh $0" msgprefix="$str_tool" fi # parse argument specification string eval `echo $arg_spec |\ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` # parse option specification string eval `echo h.$opt_spec |\ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` # parse option alias string eval `echo h:help,$opt_alias |\ sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'` # interate over argument line opt_PREV='' while [ $# -gt 0 ]; do # special option stops processing if [ ".$1" = ".--" ]; then shift break fi # determine option and argument opt_ARG_OK=no if [ ".$opt_PREV" != . ]; then # merge previous seen option with argument opt_OPT="$opt_PREV" opt_ARG="$1" opt_ARG_OK=yes opt_PREV='' else # split argument into option and argument case "$1" in --[a-zA-Z0-9]*=*) eval `echo "x$1" |\ sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" ;; --[a-zA-Z0-9]*) opt_OPT=`echo "x$1" | cut -c4-` opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'` eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}" opt_ARG='' ;; -[a-zA-Z0-9]*) eval `echo "x$1" |\ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ -e 's/";\(.*\)$/"; opt_ARG="\1"/'` ;; -[a-zA-Z0-9]) opt_OPT=`echo "x$1" | cut -c3-` opt_ARG='' ;; *) break ;; esac fi # eat up option shift # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi fi # process option case $opt_MODE in '.' ) # boolean option eval "opt_${opt_OPT}=yes" ;; ':' ) # option with argument (multiple occurances override) eval "opt_${opt_OPT}=\"\$opt_ARG\"" ;; '+' ) # option with argument (multiple occurances append) eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\"" ;; * ) echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 ;; esac done if [ ".$opt_PREV" != . ]; then echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 fi # process help option if [ ".$opt_h" = .yes ]; then echo "Usage: $toolcmdhelp $str_usage" exit 0 fi # complain about incorrect number of arguments case $arg_MODE in '=' ) if [ $# -ne $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; '+' ) if [ $# -lt $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; esac # establish a temporary file on request if [ ".$gen_tmpfile" = .yes ]; then # create (explicitly) secure temporary directory if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then tmpdir="$TEMPDIR" else tmpdir="/tmp" fi tmpdir="$tmpdir/.shtool.$$" ( umask 077 rm -rf "$tmpdir" >/dev/null 2>&1 || true mkdir "$tmpdir" >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2 exit 1 fi ) # create (implicitly) secure temporary file tmpfile="$tmpdir/shtool.tmp" touch "$tmpfile" fi # utility function: map string to lower case util_lower () { echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' } # utility function: map string to upper case util_upper () { echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' } # cleanup procedure shtool_exit () { rc="$1" if [ ".$gen_tmpfile" = .yes ]; then rm -rf "$tmpdir" >/dev/null 2>&1 || true fi exit $rc } ## ## DISPATCH INTO SCRIPT BODY ## case $tool in echo ) ## ## echo -- Print string with optional construct expansion ## Copyright (c) 1998-2005 Ralf S. Engelschall ## text="$*" # check for broken escape sequence expansion seo='' bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" != .3 ]; then bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then seo='-E' fi fi # check for existing -n option (to suppress newline) minusn='' bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` if [ ".$bytes" = .3 ]; then minusn='-n' fi # determine terminal bold sequence term_bold='' term_norm='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then case $TERM in # for the most important terminal types we directly know the sequences xterm|xterm*|vt220|vt220*) term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` ;; vt100|vt100*|cygwin|screen) term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` ;; # for all others, we try to use a possibly existing `tput' or `tcout' utility * ) paths=`echo $PATH | sed -e 's/:/ /g'` for tool in tput tcout; do for dir in $paths; do if [ -r "$dir/$tool" ]; then for seq in bold md smso; do # 'smso' is last bold="`$dir/$tool $seq 2>/dev/null`" if [ ".$bold" != . ]; then term_bold="$bold" break fi done if [ ".$term_bold" != . ]; then for seq in sgr0 me rmso init reset; do # 'reset' is last norm="`$dir/$tool $seq 2>/dev/null`" if [ ".$norm" != . ]; then term_norm="$norm" break fi done fi break fi done if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then break; fi done ;; esac if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then # echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 term_bold='' term_norm='' fi fi # determine user name username='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then username="`(id -un) 2>/dev/null`" if [ ".$username" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then username=`echo $str | sed -e 's/^uid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$username" = . ]; then username="$LOGNAME" if [ ".$username" = . ]; then username="$USER" if [ ".$username" = . ]; then username="`(whoami) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username="`(who am i) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$username" = . ]; then username='unknown' fi fi fi fi fi fi fi # determine user id userid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then userid="`(id -u) 2>/dev/null`" if [ ".$userid" = . ]; then userid="`(id -u ${username}) 2>/dev/null`" if [ ".$userid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$userid" = . ]; then userid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid=`(ypcat passwd) 2>/dev/null | grep "^${username}:" | \ sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$userid" = . ]; then userid='?' fi fi fi fi fi fi fi # determine (primary) group id groupid='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then groupid="`(id -g ${username}) 2>/dev/null`" if [ ".$groupid" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupid=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*//' -e 's/(.*$//'` fi if [ ".$groupid" = . ]; then groupid=`(getent passwd ${username}) 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid=`(ypcat passwd) 2>/dev/null | grep "^${username}:" | \ sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'` if [ ".$groupid" = . ]; then groupid='?' fi fi fi fi fi fi # determine (primary) group name groupname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then groupname="`(id -gn ${username}) 2>/dev/null`" if [ ".$groupname" = . ]; then str="`(id) 2>/dev/null`" if [ ".`echo $str | grep 'gid[ ]*=[ ]*[0-9]*('`" != . ]; then groupname=`echo $str | sed -e 's/^.*gid[ ]*=[ ]*[0-9]*(//' -e 's/).*$//'` fi if [ ".$groupname" = . ]; then groupname=`(getent group) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname=`(ypcat group) 2>/dev/null | \ grep "^[^:]*:[^:]*:${groupid}:" | \ sed -e 's/:.*$//'` if [ ".$groupname" = . ]; then groupname='?' fi fi fi fi fi fi # determine host and domain name hostname='' domainname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then hostname="`(uname -n) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname="`(hostname) 2>/dev/null |\ awk '{ printf("%s", $1); }'`" if [ ".$hostname" = . ]; then hostname='unknown' fi fi case $hostname in *.* ) domainname=".`echo $hostname | cut -d. -f2-`" hostname="`echo $hostname | cut -d. -f1`" ;; esac fi if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then if [ ".$domainname" = . ]; then if [ -f /etc/resolv.conf ]; then domainname="`grep '^[ ]*domain' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*domain//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" if [ ".$domainname" = . ]; then domainname="`grep '^[ ]*search' /etc/resolv.conf | sed -e 'q' |\ sed -e 's/.*search//' \ -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ -e 's/ .*//' -e 's/ .*//' \ -e 's/^\.//' -e 's/^/./' |\ awk '{ printf("%s", $1); }'`" fi fi fi fi # determine current time time_day='' time_month='' time_year='' time_monthname='' if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then time_day=`date '+%d'` time_month=`date '+%m'` time_year=`date '+%Y' 2>/dev/null` if [ ".$time_year" = . ]; then time_year=`date '+%y'` case $time_year in [5-9][0-9]) time_year="19$time_year" ;; [0-4][0-9]) time_year="20$time_year" ;; esac fi case $time_month in 1|01) time_monthname='Jan' ;; 2|02) time_monthname='Feb' ;; 3|03) time_monthname='Mar' ;; 4|04) time_monthname='Apr' ;; 5|05) time_monthname='May' ;; 6|06) time_monthname='Jun' ;; 7|07) time_monthname='Jul' ;; 8|08) time_monthname='Aug' ;; 9|09) time_monthname='Sep' ;; 10) time_monthname='Oct' ;; 11) time_monthname='Nov' ;; 12) time_monthname='Dec' ;; esac fi # expand special ``%x'' constructs if [ ".$opt_e" = .yes ]; then text=`echo $seo "$text" |\ sed -e "s/%B/${term_bold}/g" \ -e "s/%b/${term_norm}/g" \ -e "s/%u/${username}/g" \ -e "s/%U/${userid}/g" \ -e "s/%g/${groupname}/g" \ -e "s/%G/${groupid}/g" \ -e "s/%h/${hostname}/g" \ -e "s/%d/${domainname}/g" \ -e "s/%D/${time_day}/g" \ -e "s/%M/${time_month}/g" \ -e "s/%Y/${time_year}/g" \ -e "s/%m/${time_monthname}/g" 2>/dev/null` fi # create output if [ .$opt_n = .no ]; then echo $seo "$text" else # the harder part: echo -n is best, because # awk may complain about some \xx sequences. if [ ".$minusn" != . ]; then echo $seo $minusn "$text" else echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" fi fi shtool_exit 0 ;; install ) ## ## install -- Install a program, script or datafile ## Copyright (c) 1997-2005 Ralf S. Engelschall ## # special case: "shtool install -d [...]" internally # maps to "shtool mkdir -f -p -m 755 [...]" if [ "$opt_d" = yes ]; then cmd="$0 mkdir -f -p -m 755" if [ ".$opt_o" != . ]; then cmd="$cmd -o '$opt_o'" fi if [ ".$opt_g" != . ]; then cmd="$cmd -g '$opt_g'" fi if [ ".$opt_v" = .yes ]; then cmd="$cmd -v" fi if [ ".$opt_t" = .yes ]; then cmd="$cmd -t" fi for dir in "$@"; do eval "$cmd $dir" || shtool_exit $? done shtool_exit 0 fi # determine source(s) and destination argc=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dstpath="$1" # type check for destination dstisdir=0 if [ -d $dstpath ]; then dstpath=`echo "$dstpath" | sed -e 's:/$::'` dstisdir=1 fi # consistency check for destination if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 shtool_exit 1 fi # iterate over all source(s) for src in $srcs; do dst=$dstpath # if destination is a directory, append the input filename if [ $dstisdir = 1 ]; then dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` dst="$dst/$dstfile" fi # check for correct arguments if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 continue fi if [ -d "$src" ]; then echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 continue fi # make a temp file name in the destination directory dsttmp=`echo $dst |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ -e "s;\$;/#INST@$$#;"` # verbosity if [ ".$opt_v" = .yes ]; then echo "$src -> $dst" 1>&2 fi # copy or move the file name to the temp name # (because we might be not allowed to change the source) if [ ".$opt_C" = .yes ]; then opt_c=yes fi if [ ".$opt_c" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "cp $src $dsttmp" 1>&2 fi cp $src $dsttmp || shtool_exit $? else if [ ".$opt_t" = .yes ]; then echo "mv $src $dsttmp" 1>&2 fi mv $src $dsttmp || shtool_exit $? fi # adjust the target file if [ ".$opt_e" != . ]; then sed='sed' OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS" for e do sed="$sed -e '$e'" done cp $dsttmp $dsttmp.old chmod u+w $dsttmp eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $? rm -f $dsttmp.old fi if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "strip $dsttmp" 1>&2 fi strip $dsttmp || shtool_exit $? fi if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $dsttmp" 1>&2 fi chown $opt_o $dsttmp || shtool_exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $dsttmp" 1>&2 fi chgrp $opt_g $dsttmp || shtool_exit $? fi if [ ".$opt_m" != ".-" ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $dsttmp" 1>&2 fi chmod $opt_m $dsttmp || shtool_exit $? fi # determine whether to do a quick install # (has to be done _after_ the strip was already done) quick=no if [ ".$opt_C" = .yes ]; then if [ -r $dst ]; then if cmp -s $src $dst; then quick=yes fi fi fi # finally, install the file to the real destination if [ $quick = yes ]; then if [ ".$opt_t" = .yes ]; then echo "rm -f $dsttmp" 1>&2 fi rm -f $dsttmp else if [ ".$opt_t" = .yes ]; then echo "rm -f $dst && mv $dsttmp $dst" 1>&2 fi rm -f $dst && mv $dsttmp $dst fi done shtool_exit 0 ;; mkdir ) ## ## mkdir -- Make one or more directories ## Copyright (c) 1996-2005 Ralf S. Engelschall ## errstatus=0 for p in ${1+"$@"}; do # if the directory already exists... if [ -d "$p" ]; then if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then echo "$msgprefix:Error: directory already exists: $p" 1>&2 errstatus=1 break else continue fi fi # if the directory has to be created... if [ ".$opt_p" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $p" 1>&2 fi mkdir $p || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $p" 1>&2 fi chown $opt_o $p || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $p" 1>&2 fi chgrp $opt_g $p || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $p" 1>&2 fi chmod $opt_m $p || errstatus=$? fi else # the smart situation set fnord `echo ":$p" |\ sed -e 's/^:\//%/' \ -e 's/^://' \ -e 's/\// /g' \ -e 's/^%/\//'` shift pathcomp='' for d in ${1+"$@"}; do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp="./$pathcomp" ;; esac if [ ! -d "$pathcomp" ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi mkdir $pathcomp || errstatus=$? if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $pathcomp" 1>&2 fi chown $opt_o $pathcomp || errstatus=$? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $pathcomp" 1>&2 fi chgrp $opt_g $pathcomp || errstatus=$? fi if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $pathcomp" 1>&2 fi chmod $opt_m $pathcomp || errstatus=$? fi fi pathcomp="$pathcomp/" done fi done shtool_exit $errstatus ;; path ) ## ## path -- Deal with program paths ## Copyright (c) 1998-2005 Ralf S. Engelschall ## namelist="$*" # check whether the test command supports the -x option if [ -x /bin/sh ] 2>/dev/null; then minusx="-x" else minusx="-r" fi # split path string paths="`echo $opt_p |\ sed -e 's/^:/.:/' \ -e 's/::/:.:/g' \ -e 's/:$/:./' \ -e 's/:/ /g'`" # SPECIAL REQUEST # translate forward to reverse path if [ ".$opt_r" = .yes ]; then if [ "x$namelist" = "x." ]; then rp='.' else rp='' for pe in `IFS="$IFS/"; echo $namelist`; do rp="../$rp" done fi echo $rp | sed -e 's:/$::' shtool_exit 0 fi # SPECIAL REQUEST # strip out directory or base name if [ ".$opt_d" = .yes ]; then echo "$namelist" |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' shtool_exit 0 fi if [ ".$opt_b" = .yes ]; then echo "$namelist" |\ sed -e 's;.*/\([^/]*\)$;\1;' shtool_exit 0 fi # MAGIC SITUATION # Perl Interpreter (perl) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then rm -f $tmpfile >/dev/null 2>&1 touch $tmpfile found=0 pc=99 for dir in $paths; do dir=`echo $dir | sed -e 's;/*$;;'` nc=99 for name in perl perl5 miniperl; do if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then perl="$dir/$name" pv=`$perl -e 'printf("%.3f", $]);'` echo "$pv:$pc:$nc:$perl" >>$tmpfile found=1 fi nc=`expr $nc - 1` done pc=`expr $pc - 1` done if [ $found = 1 ]; then perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`" rm -f $tmpfile >/dev/null 2>&1 echo "$perl" shtool_exit 0 fi rm -f $tmpfile >/dev/null 2>&1 shtool_exit 1 fi # MAGIC SITUATION # C pre-processor (cpp) if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then echo >$tmpfile.c "#include " echo >>$tmpfile.c "Syntax Error" # 1. try the standard cc -E approach cpp="${CC-cc} -E" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 2. try the cc -E approach and GCC's -traditional-ccp option cpp="${CC-cc} -E -traditional-cpp" (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # 3. try a standalone cpp command in path and lib dirs for path in $paths /lib /usr/lib /usr/local/lib; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then cpp="$path/cpp" break fi done if [ ".$cpp" != . ]; then (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out my_error=`grep -v '^ *+' $tmpfile.out` if [ ".$my_error" != . ]; then # ok, we gave up... cpp='' fi fi fi fi rm -f $tmpfile >/dev/null 2>&1 rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1 if [ ".$cpp" != . ]; then echo "$cpp" shtool_exit 0 fi shtool_exit 1 fi # STANDARD SITUATION # iterate over names for name in $namelist; do # iterate over paths for path in $paths; do path=`echo $path | sed -e 's;/*$;;'` if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then if [ ".$opt_s" != .yes ]; then echo "$path/$name" fi shtool_exit 0 fi done done shtool_exit 1 ;; esac shtool_exit 0 bzflag-2.4.2+ds1/misc/simpleSwearList.txt000066400000000000000000000263531200563112200202730ustar00rootroot00000000000000# Simple Swear List # # Here is a simplified list of words that are obscene for the memory/cpu # conservative, or those who simply don't want to match against words that # are rude and obscene, yet not vulgar. This list should contain only the # worst of the worst. # # This list follows the same rules as the multilingual swear list. # # English analfuck arsefuck arsephuck arsephuk assfuck asshole bitch bitchfuck bltch bulshit butfuc butfuck butfuk cunt dick fuck fuckboy fuckcoons fuckedsideway fuckedup fuckedupanddown fuckedupndown fuckface fuckgm fuckhead fuckhole fuckingyamom fuckinstoned fuckman fuckme fuckmehard fuckmyass fuckmonkey fuckpirate fucknut fuckoff fuckshit fucku fuckubitch fuckup fuckymamma fuckyou fuckyoucock fuckyoucunt fuckyougm fuckyouii fukc motherfuck nigger shit # Afrikaans dom doos # af - dumb pussy poephol # af - asshole tief # af - bitch # Arabic gaeheba # ar - bitch kanith # ar - fucker koos # ar - cunt. mara # ar - bitch (egypt only) mos zibby! # ar - suck my dick! nikomak # ar - fuck your mother sharmoota # ar - bitch sharmuta # ar - bitch sharmute # ar - bitch tizak # ar - ass tizi # ar - ass zarba # ar - shit zibik # ar - dick # Armenian buhlo # hy - dick esh # hy - donkey juge # hy - penis jugik # hy - penis vorig # hy - ass vor # hy - ass # Bengali baing chood # bn - sister fucker chood # bn - fuck/fucker choodmarani # bn - mother fucker dhon # bn - dick # Bulgarian coochka # bg - bitch luyno # bg - shit luyno guava # bg - shit head # Czech hovno # cs - "shit" hovnohlava # cs - shithead mrdat # cs - very dirty words for "fuck," prcat # cs - very dirty words for "fuck," peecha # cs - pussy/cunt jebat # cs - fuck pojeb sa # cs - fuck off # Dutch (Holland-Belgium) eikel # nl - dickhead makak # nl - rascist word opdekontneuker # nl - up-the-ass-fucker stomme zak # nl - stupid asshole stront # nl - shit # Estonian mine persse # et - (Lit. go into ass) mine vittu # et - fuck off (Lit. go into cunt) nikkuma # et - to fuck nussima # et - to fuck sittuma # et - to shit vitt/puts # et - cunt # Finnish paska # fi - shit vittu # fi - fuck(Lit. cunt) vittupaeae # fi - (Lit. cunthead) # French bais moi # fr - fuck me conasse # fr - bitch cul # fr - ass encule # fr - fuck you (anal style!?) la chatte # fr - cunt la conasse # fr - cunt le con # fr - cunt merde # fr - shit ordure # fr - bitch poofias # fr - bitch putain # fr - whore pute # fr - whore salope # fr - bitch tapette # fr - faggot zobi # fr - penis # German arsch # de - ass asch # de - ass fick dich # de - fuck you fick mich # de - fuck me fotze # de - cunt himmeldonnerwetter # de - death/curse (lit. heaven thunder weather) mutterficker # de - motherfucker schies # de - shit scheis # de - shit schiese # de - shit scheise # de - shit scheissekopf # de - shithead # Greek kolobaras # el - assfucker kolos # el - ass malaka wanker gamisou # el - fuck off mouni # el - cunt poutsos # el - dick salta gamisou # el - go fuck yourself # Haitian Creole bobote # ht - pussy bwalong # ht - dick coco # ht - pussy coq # ht - dick guete # ht - pussy kreck # ht - pussy zozo # ht - dick # Hebrew hadagdegan # he - clit harah # he - shit. tahat # he - ass # Hungarian fasz # hu - dick geci # hu - crap shit kid # Hindi bhai chod # hi - brother fucker bhen chod # hi - sister fucker cheenal # hi - bloody whore chod # hi - fucker chut # hi - pussy chutiya # hi - fucker gaand # hi - ass gaandu # hi - asshole lund # hi - cock maadarchod # hi - mother fucker mah-der chod # hi - mother fucker tatti # hi - shit # Indonesian ngentot # id - fuck ngewe # id - fucking palaji # id - ( slang ) foreskin pantat # id - ass peler # id - penis pentil # id - nipple perek # id - bitch tai # id - shit toket # id - women's breast # Italian butana # it - cunt cacatura # it - shit cacca # it - shit cacchiata # it - fuck-up/mistake cacchio # it - fuck! chiavare # it - to fuck with fica # it - cunt figa # it - cunt fottere # it - to fuck fottuto # it - fucked (i'm) fregata # it - fucking (noun) fregna # it - cunt frigna # it - cunt fungula # it - fuck loffa # it - fart merda # it - shit mierde # it - shit minchia # it - cock, penis patacca # it - pussy, vagina pisciatella # it - pussy pisella # it - pussy puchiacca # it - cunt puttana # it - whore quaglia # it - pussy que catza # it - what the fuck sbatiare # it - to bang/screw/fuck sbatto # it - fuck it (i don't give a shit) scopa # it - fuck scopata # it - a fuck screggia # it - cheap whore, easy lay, promicuous woman segata # it - fuck-up stronzetto # it - piece of shit stronzino # it - piece of shit stronzo # it - piece of shit stronzolo # it - piece of shit uccellino # it - dick uccello # it - dick vaffanculo # it - fuck off # Jamaican bumboclot # ?? - cpe - you are full of shit teras # ?? - cpe - your ass # Latin cunnus # la - cunt stercum # la - shit # Norwegian dritt # no - shit drittsekk # no - shitbag fitte # no - cunt fleskepanne # no - dickhead hore # no - slut pikk # no - dick pule # no - fuck # Polish coorva # pl - fuck dupek # pl - asshole gowno # pl - shit huj # pl - dick pierdol # pl - fuck pierdolec # pl - fucker pojebany # pl - fucked up spierdalaj # pl - fuck off zajebiste # pl - "fucking awesome" zapierdol # pl - fuck zapierdole # pl - fuck # Portuguese foda-se # pt - fuck (figurative) fodeis # pt - ye fuck, formal fodem # pt - they fuck fodemos # pt - we fuck foder # pt - to fuck; Present Indicative: eu fodes # pt - you fuck fodo # pt - I fuck fuda # pt - I will fuck fudai # pt - ye will fuck, formal fudam # pt - they fuck fudamos # pt - we fuck fude # pt - you will fuck fudem # pt - they will fuck fudemos # pt - we will fuck fudo # pt - I fuck cabra # pt - bitch # Russian dermo # ru - shit govniuk # ru - shithead govno # ru - shit (literally) khui # ru - cock manda # ru - cunt mudak # ru - an asshole (a person only) sooka # ru - Bitch/traitor/whore sraka # ru - an ass (extremely vulgar) yob # ru - Fuck (verb root)(ie "I Fuck"="Ya Yebur" zhopa # ru - an asshole or an ass # Serbian peechka # sr - pussy. sisadzijo. # sr - cock sucker. sranje! # sr - ohhh, shit! # Slovenian drek # sl - shit kurac # sl - penis # Spanish cabron # es - dick head chimba # es - pussy (colombian spanish) chingar # es - to fuck chingada # es - fucking cogete # es - go fuck yourself (lit. go catch yourself) cono # es - cunt con~o # es - cunt co~no # es - cunt decojo # es - decojo (dialect) follado # es - fucked (male) follada # es - fucked (female) gilipolla # es - asshole (slang) joder # es - to fuck jodete # es - go fuck yourself jodida # es - fucked (female) jodido # es - fucked (male) mierda # es - shit pendejo # es - (m/f) asshole, dickhead, etc. pendeja # es - (m/f) asshole, dickhead, etc. puta # es - (feminine) whore, bitch puto # es - (masculine) dickhead, asshole # Swedish fitta # sv - cunt knullare # sv - fucker kuksugare # sv - cocksucker mammaknullare # sv - motherfucker # Turkish got veren # tr - ass giver ibne # tr - faggot siktir lan # tr - get fucked # Ukrainian hivno # uk - shit # Yiddish schlemeil # yi - asshole (the one that "screws") schlmazel # yi - asshole ("gets screwed" by the schlemeil) yutz # yi - asshole # Zulu bhebha # zu - fuck golo # zu - cunt malebeh # zu - cunt lips ngquza # zu - asshole sifebe # zu - whore stabaneh # zu - faggot # Local Variables: *** # mode:Text *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/snap.sh000077500000000000000000000066411200563112200157010ustar00rootroot00000000000000#!/bin/sh # # s n a p . s h # # Generates a snapshot and patch of a sourceforge cvs project # # Usage: ./snap.sh cvsmodule [checkoutdir] [snapshotdir] [checkout] # # Example crontab entry to build a snapshot at 4:01am every day: # 1 4 * * * ~bzflag/snap.sh bzflag ~bzflag/bzflag/cvs \ # ~bzflag/bzflag/htdocs/cvs >& ~bzflag/bzflag/htdocs/cvs/snap.log # # You might need to expand the ~'s depending on your setup. If you are not # sourceforge, you probably want to edit the configuration variables listed # below. Namely, you can configure what to checkout, where to checkout, how # to checkout, and where to post the snapshots. # # Version 1.0.3 + doxygen mods # Initially written by Sean Morrison aka brlcad aka learner in 2004 # this script is in the public domain ### usage ( ) { [ ! "x$1" = "x" ] && echo "ERROR: $1" echo "Usage: $0 cvsmodule [checkoutdir] [snapshotdir] [checkout]" echo " cvsmodule is the name of your cvs checkout module" echo " checkoutdir is the name of where to checkout/export (default=.)" echo " snapshotdir is where to post the snapshots (default=.)" echo " checkout is whether to checkout or export (default=checkout)" exit 1 } [ ! "x$1" = "x" ] && project="$1" || usage "Missing the name of the cvs module to get" [ ! "x$2" = "x" ] && cvsget="$2" || cvsget="." [ ! "x$3" = "x" ] && cvsweb="$3" || cvsweb="." [ ! "x$4" = "x" ] && cvsmeth="$4" || cvsmeth="checkout" # set umask umask 002 # make sure to set CVSROOT if unset CVSROOT="${CVSROOT:-$USER@cvs1:/cvsroot/$project}" # if method was export -- make sure to appease the need for a tag [ "x$cvsmeth" = "xexport" ] && cvsmeth="export -D tomorrow" # preferred app behavior settings CVS_RSH=${CVS_RSH:=ssh} GZIP=${GZIP:="--best"} export CVS_RSH GZIP echo "Running $0" echo "at `date`" echo "==========" cat "$0" echo "----------" echo "Getting latest CVS" mkdir -p "$cvsget" [ -d "$cvsget" ] && cd "$cvsget" || exit 2 echo "cvs -d$CVSROOT $cvsmeth $project" cvs -d$CVSROOT $cvsmeth $project [ -d $project ] && cd $project || exit 3 echo "Running autogen.sh" [ -f autogen.sh ] && sh autogen.sh || exit 4 if [ -f misc/doxyfile ] ; then echo "Updating Doxygen docs" ln -s $HOME/bzflag/htdocs/doxygen doc/doxygen/html rm -f doc/doxygen/html/* doxygen misc/doxyfile rm doc/doxygen/html fi cd .. echo "Cleaning out previous snapshot(s)" mkdir -p "$cvsweb" [ -d "$cvsweb" ] || exit 5 rm -f "$cvsweb/$project-*.tar.gz" rm -f "$cvsweb/$project-*.patch" echo "Generating source tarball and patch" stamp=`date +"%Y-%m-%d"` if [ -d $project ] ; then echo "tar zcvf \"$cvsweb/$project-$stamp.tar.gz\" $project" tar zcvf "$cvsweb/$project-$stamp.tar.gz" $project [ -d $project.old ] && diff --ignore CVS -duPNr $project.old $project > "$cvsweb/$project-$stamp.patch" [ -d $project.old ] && rm -rf $project.old mv $project $project.old else echo "ERROR: No checkout to make a snapshot off of" exit 6 fi echo "Linking to the latest" [ -h "$cvsweb/$project-latest.tar.gz" ] && rm "$cvsweb/$project-latest.tar.gz" ln -s "$cvsweb/$project-$stamp.tar.gz" "$cvsweb/$project-latest.tar.gz" [ -h "$cvsweb/$project-latest.patch" ] && rm "$cvsweb/$project-latest.patch" ln -s "$cvsweb/$project-$stamp.patch" "$cvsweb/$project-latest.patch" echo "Nothing left to do at `date`" echo "Done." # Local Variables: *** # mode: sh *** # tab-width: 8 *** # sh-basic-offset: 2 *** # sh-indentation: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/stats/000077500000000000000000000000001200563112200155305ustar00rootroot00000000000000bzflag-2.4.2+ds1/misc/stats/Changes000066400000000000000000000003131200563112200170200ustar00rootroot00000000000000Revision history for Perl extension BZFlag::Info 1.7.1 Sun Nov 16 13:52:50 2003 - fixed bugs in the package 1.7.0 Thu Nov 13 06:16:17 2003 - original version; created for servers in the 1.7 series bzflag-2.4.2+ds1/misc/stats/Info.pm000066400000000000000000000246371200563112200167750ustar00rootroot00000000000000# Info.pm # # Copyright (c) 2003-2012 Tucker McLean, Tim Riker. # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ### package BZFlag::Info; use 5.6.1; use strict; use warnings; use LWP::UserAgent; use Socket; our $VERSION = '1.7.1'; sub new { my $self = { }; bless $self, "BZFlag::Info"; return $self; } sub serverlist(%) { my $self = shift; my %options; while (my @option = splice(@_, 0, 2)) { $options{$option[0]} = $option[1]; } my $proxy = $options{Proxy}; my $response; my $ua = new LWP::UserAgent; $ua->proxy('http', $proxy) if defined($proxy); $ua->timeout(5); my $req = HTTP::Request->new('GET', $self->listserver); my $res = $ua->request($req); my %servers; my $totalServers = 0; my $totalPlayers = 0; for my $line (split("\n",$res->content)) { my ($serverport, $version, $flags, $ip, $comments) = split(" ",$line,5); # not "(A4)18" to handle old dumb perl my ($style,$maxPlayers,$maxShots, $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize, $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax, $shakeWins,$shakeTimeout, $maxPlayerScore,$maxTeamScore,$maxTime) = unpack("A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4", $flags); my $playerSize = hex($rogueSize) + hex($redSize) + hex($greenSize) + hex($blueSize) + hex($purpleSize); $servers{$serverport} = $playerSize; $totalServers += 1; $totalPlayers += $playerSize; } $response->{totalservers} = $totalServers; $response->{totalplayers} = $totalPlayers; foreach my $key (sort {$servers{$b} <=> $servers{$a}} (keys(%servers))) { # if ($servers{$key} > 0) { $response->{servers}->{$key}->{numplayers} = $servers{$key}; # } } return ($response); } sub queryserver(%) { my $self = shift; my %options; while (my @option = splice(@_, 0, 2)) { $options{$option[0]} = $option[1]; } my $hostandport = $options{Server}; my $timeout = $options{Timeout}; #my @teamName = ("Rogue", "Red", "Green", "Blue", "Purple"); my @teamName = ("X", "R", "G", "B", "P"); my ($message, $server); my $response; my ($servername, $port) = split(/:/, $hostandport); $port = 5155 unless $port; # socket define my $sockaddr = 'S n a4 x8'; # port to port number my ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/; # get server address my ($type,$len,$serveraddr); ($name,$aliases,$type,$len,$serveraddr) = gethostbyname($servername); $server = pack($sockaddr, AF_INET, $port, $serveraddr); # connect unless (socket(S1, AF_INET, SOCK_STREAM, $proto)) { $self->{error} = 'errSocketError'; return undef; } unless (connect(S1, $server)) { $self->{error} = "errCouldNotConnect: $servername:$port"; return undef; } # don't buffer select(S1); $| = 1; select(STDOUT); # get hello my $buffer; unless (read(S1, $buffer, 10) == 10) { $self->{error} = 'errReadError'; return undef; } # parse reply my ($magic,$major,$minor,$revision); ($magic,$major,$minor,$revision,$port) = unpack("a4 a1 a2 a1 n", $buffer); # quit if version isn't valid if ($magic ne "BZFS") { $self->{error} = 'errNotABzflagServer'; return undef; } # try incompatible for BZFlag:Zero etc. if (($major < 1) or ($major == 1 && $minor < 7) or ($major == 1 && $minor == 7 && $revision eq "b")) { $self->{error} = 'errIncompatibleVersion'; return undef; } # quit if rejected if ($port == 0) { $self->{error} = 'errRejectedByServer'; return undef; } # reconnect on new port $server = pack($sockaddr, AF_INET, $port, $serveraddr); unless (socket(S, AF_INET, SOCK_STREAM, $proto)) { $self->{error} = 'errSocketErrorOnReconnect'; return undef; } unless (connect(S, $server)) { $self->{error} = "errCouldNotReconnect: $servername:$port"; return undef; } select(S); $| = 1; select(STDOUT); # close first socket close(S1); # send game request print S pack("n2", 0, 0x7167); # get reply unless (read(S, $buffer, 40) == 40) { $self->{error} = 'errServerReadError'; return undef; } my ($infolen,$infocode,$style,$maxPlayers,$maxShots, $rogueSize,$redSize,$greenSize,$blueSize,$purpleSize, $rogueMax,$redMax,$greenMax,$blueMax,$purpleMax, $shakeWins,$shakeTimeout, $maxPlayerScore,$maxTeamScore,$maxTime) = unpack("n20", $buffer); unless ($infocode == 0x7167) { $self->{error} = 'errBadServerData'; return undef; } # send players request print S pack("n2", 0, 0x7170); # get number of teams and players we'll be receiving unless (read(S, $buffer, 8) == 8) { $self->{error} = 'errCountReadError'; return undef; } my ($countlen,$countcode,$numTeams,$numPlayers) = unpack("n4", $buffer); unless ($countcode == 0x7170) { $self->{error} = 'errBadCountData'; return undef; } # get the teams for (1..$numTeams) { unless (read(S, $buffer, 14) == 14) { $self->{error} = 'errTeamReadError'; return undef; } my ($teamlen,$teamcode,$team,$size,$aSize,$wins,$losses) = unpack("n7", $buffer); unless ($teamcode == 0x7475) { $self->{error} = 'errBadTeamData'; return undef; } my $score = $wins - $losses; $response->{teams}->{$teamName[$team]}->{size} = $size; $response->{teams}->{$teamName[$team]}->{score} = $score; $response->{teams}->{$teamName[$team]}->{wins} = $wins; $response->{teams}->{$teamName[$team]}->{losses} = $losses; } # get the players for (1..$numPlayers) { next if read(S, $buffer, 180) == 18; my ($playerlen,$playercode,$pAddr,$pPort,$pNum,$type,$team,$wins,$losses,$sign,$motto) = unpack("n2Nn2 n4A32A128", $buffer); unless ($playercode == 0x6170) { $self->{error} = 'errBadPlayerData'; return undef; } my $score = $wins - $losses; $response->{players}->{$sign}->{team} = $teamName[$team]; $response->{players}->{$sign}->{motto} = $motto; $response->{players}->{$sign}->{score} = $score; $response->{players}->{$sign}->{wins} = $wins; $response->{players}->{$sign}->{losses} = $losses; $response->{players}->{$sign}->{ip} = inet_ntoa(inet_aton($pAddr)); } if ($numPlayers <= 1) { $self->{error} = 'errNoPlayers'; return undef; } # close socket close(S); return $response; } sub geterror { my $self = shift; return $self->{error}; } sub listserver { my $self = shift; my %options; while (my @option = splice(@_, 0, 2)) { $options{$option[0]} = $option[1]; } my $ua = new LWP::UserAgent; $ua->proxy('http', $options{Proxy}) if defined($options{Proxy}); $ua->timeout(5); my $req = HTTP::Request->new('GET', 'http://BZFlag.SourceForge.net/list-server.txt'); my $res = $ua->request($req); my ($listserver) = split("\n",$res->content); $listserver =~ s/^bzflist/http/; return $listserver; } 1; __END__ =head1 NAME BZFlag::Info - Extracts infomation about BZFlag servers and players =head1 SYNOPSIS use BZFlag::Info; my $bzinfo = new BZFlag::Info; my $serverlist = $bzinfo->serverlist; my $serverlist = $bzinfo->serverlist(Proxy => 'host:port'); my $serverinfo = $bzinfo->queryserver(Server => 'host:port'); =head1 DESCRIPTION C is a class for extracting information about BZFlag clients and servers. Currently, 4 methods are implemented, C, C, C, and C. =head1 METHODS =over 4 =item my $bzinfo = new BZFlag::Info; C constructs a new C object. It takes no arguments. =item my $serverlist = $bzinfo->serverlist; C retrieves the current list of public servers. Then returns a data structure that would be displayed by C like this: $VAR1 = { 'totalservers' => 8, 'totalplayers' => 42, 'servers' => { 'ducati.bzflag.org:5155' => { 'numplayers' => 0 }, 'quol.bzflag.org:8085' => { 'numplayers' => 0 }, 'bzflag.secretplace.us:5155' => { 'numplayers' => 18 }, 'lbdpc15.epfl.ch:5155' => { 'numplayers' => 8 }, 'q2.bzflag.org:8083' => { 'numplayers' => 0 }, 'ducati.bzflag.org:5156' => { 'numplayers' => 7 }, 'bzflag.servegame.com:5155' => { 'numplayers' => 0 }, 'bzflag.freedomlives.net:5155' => { 'numplayers' => 9 }, } }; It can also take one option, Proxy, where you can specify a proxy server to handle the HTTP request. =item my $serverinfo = $bzinfo->queryserver(Server => 'host:port'); C extracts information about players and teams from the BZFlag server specified with the Server option. It returns a data structure that would be displayed by C like this: $VAR1 = { 'teams' => { 'X' => { 'losses' => 0, 'wins' => 0, 'score' => 0, 'size' => 0 }, 'P' => { 'losses' => 0, 'wins' => 7, 'score' => 7, 'size' => 1 }, 'R' => { 'losses' => 8, 'wins' => 0, 'score' => -8, 'size' => 1 }, 'G' => { 'losses' => 0, 'wins' => 0, 'score' => 0, 'size' => 0 }, 'B' => { 'losses' => 0, 'wins' => 0, 'score' => 0, 'size' => 0 } }, 'players' => { 'xabner' => { 'losses' => 8, 'wins' => 0, 'motto' => '', 'ip' => '123.123.123.123', 'score' => -8, 'team' => 'R' }, 'mackattack' => { 'losses' => 0, 'wins' => 7, 'motto' => 'attack at dawn', 'ip' => '123.123.123.123', 'score' => 7, 'team' => 'P' } } }; X, R, G, B, and P stand for Rogue, Red, Green, Blue, and Purple, respectively. If there was an error retrieving information on a BZFlag server, C will return undef, C will return the error. =back =head1 BUGS I have no idea, tell me if there are any. =head1 AUTHOR Tucker McLean, tuckerm@noodleroni.com =head1 COPYRIGHT Copyright (c) 2003-2012 Tucker McLean, Tim Riker. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. # Local Variables: *** # mode: Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/stats/MANIFEST000066400000000000000000000000621200563112200166570ustar00rootroot00000000000000Changes Info.pm Makefile.PL MANIFEST README t/1.t bzflag-2.4.2+ds1/misc/stats/Makefile.PL000066400000000000000000000021611200563112200175020ustar00rootroot00000000000000# Makefile.PL # # Copyright (c) 2003-2012 Tucker McLean, Tim Riker. # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ### use 5.006001; use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'BZFlag::Info', 'VERSION_FROM' => 'Info.pm', # finds $VERSION 'PREREQ_PM' => {LWP::UserAgent => 0, Socket => 0}, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'Info.pm', # retrieve abstract from module AUTHOR => 'Tucker McLean ') : ()), ); # Local Variables: *** # mode: Perl *** # tab-width: 8 *** # c-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/stats/README000066400000000000000000000010231200563112200164040ustar00rootroot00000000000000BZFlag::Info version 1.7.0 =================== The BZFlag::Info module provides a class for extracting information about BZFlag servers. INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES This module requires these other modules and libraries: LWP::UserAgent Socket COPYRIGHT AND LICENCE Copyright (c) 2003-2012 Tucker McLean, Tim Riker This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. bzflag-2.4.2+ds1/misc/stats/t/000077500000000000000000000000001200563112200157735ustar00rootroot00000000000000bzflag-2.4.2+ds1/misc/stats/t/1.t000066400000000000000000000007631200563112200163260ustar00rootroot00000000000000# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl 1.t' ######################### # change 'tests => 1' to 'tests => last_test_to_print'; use Test; BEGIN { plan tests => 1 }; use BZFlag::Info; ok(1); # If we made it this far, we're ok. ######################### # Insert your test code below, the Test::More module is use()ed here so read # its man page ( perldoc Test::More ) for help writing this test script. bzflag-2.4.2+ds1/misc/tar000077500000000000000000000002711200563112200151060ustar00rootroot00000000000000#!/bin/sh exec /bin/tar \ --dereference \ --exclude CVS \ --exclude .svn \ --exclude .cvsignore \ --exclude config.log \ --exclude config.cache\* \ --exclude config.status \ $* bzflag-2.4.2+ds1/misc/touchcopyright000077500000000000000000000032511200563112200173740ustar00rootroot00000000000000#!/bin/sh # BZFlag # Copyright (c) 1993-2012 Tim Riker # # This package is free software; you can redistribute it and/or # modify it under the terms of the license found in the file # named COPYING that should have accompanied this file. # # THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. # # NOTE: update just the next two lines and then run this script OLDCOPYRIGHTTEXT='Copyright (c) 1993-2011' NEWCOPYRIGHTTEXT='Copyright (c) 1993-2012' # # update copyright in all files # # bzflag top-level dir for root in . .. ; do if [ -r $root/bzflag.lsm.in ] ; then break fi done #if [ -r $root/include/config.h ] ; then # echo "$0 should be run only after a make maintainer-clean!" # exit 1 #fi myname=touchcopyright tmpfile=$root/$myname.tmp rm -f $tmpfile # FIXME: only touch files that have the Subversion svn:eol-style property set. # touch myself last files="`find $root -type f -not -regex '.*\.svn.*' -not -name \*.png -not -name \*.wav -not -name \*.icns -not -regex '.*src/other/.*' | grep -v misc/$myname` misc/$myname" # do replacement for file in $files; do echo -e -n "$file\r" if [ ! -w ${file} ]; then echo "${file} not found or not writable." continue fi # cat to the file, not move to preserve permissions if sed -e "s/${OLDCOPYRIGHTTEXT}/${NEWCOPYRIGHTTEXT}/" < ${file} > $tmpfile ; then cat $tmpfile > ${file} fi done rm -f $tmpfile # Local Variables: *** # mode:sh *** # tab-width: 8 *** # sh-indentation: 2 *** # sh-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/touchversion000077500000000000000000000044201200563112200170500ustar00rootroot00000000000000#!/bin/sh # # update the version numbers in the win32 projects echo this script is broken, needs updating exit tmp=tmp.$$ # bzflag top-level dir for root in . .. ../.. ; do if [ -r $root/configure.in ] ; then break fi done # get version number from config file BZVERSION=`grep ^AM_INIT_AUTOMAKE configure.in | sed -e 's/.* //g' -e 's/)//g'` eval `grep "^VERSIONNUM *= *" $root/configure.in | sed -e 's/ *//g'` # config.h files for file in \ $root/win32/config.h \ $root/src/platform/MacBZFlag-prefix.h \ $root/src/platform/MacOSX/MacBZFlag-prefix.h \ ; do if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/#define VERSION \".*/#define VERSION \"$BZVERSION\"/g" \ -e "s/#define BZVERSION [0-9]*/#define BZVERSION $VERSIONNUM/g"< $file > $tmp cat $tmp > $file fi done # dsp and vcproj # vcproj's are gone? for file in \ $root/win32/*.dsp \ $root/src/platform/MacBZFlag-prefix.h \ $root/src/platform/MacOSX/MacBZFlag-prefix.h \ ; do if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/VERSION=[0-9]*/VERSION=$VERSIONNUM/g" \ -e "s/VERSIONNUM=[0-9]*/VERSIONNUM=$BZVERSION/g"< $file > $tmp cat $tmp > $file fi done # update installer filename file=$root/win32/installer.dsp if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/BZFlag[0-9][^\"]*\"/BZFlag$BZVERSION.exe\"/g" < $file > $tmp cat $tmp > $file fi # update rpm spec file file=$root/package/rpm/spec if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/^%define version .*$/%define version $BZVERSION/g" < $file > $tmp cat $tmp > $file fi # update README file=$root/README if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/BZFlag [0-9]*\.[0-9]*[a-z]*[0-9]*$/BZFlag $BZVERSION/g" < $file > $tmp cat $tmp > $file fi # update lsm # FIXME something should add filesizes file=$root/bzflag.lsm if [ ! -w $file ]; then echo "$file not found or not writable." else sed -e "s/^Version:.*$/Version: $BZVERSION/g" < $file > $tmp cat $tmp > $file fi rm $tmp # Local Variables: *** # mode:sh *** # tab-width: 8 *** # sh-indentation: 2 *** # sh-basic-offset: 2 *** # indent-tabs-mode: t *** # End: *** # ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/misc/vars.txt000066400000000000000000000000261200563112200161040ustar00rootroot00000000000000set _wingsJumpCount 3 bzflag-2.4.2+ds1/misc/ws.sh000077500000000000000000000060041200563112200153620ustar00rootroot00000000000000#!/bin/sh # thanx! # # removed a trailing space from your post. ;-) # unexpand works for leading space but not later in the lines. # adding --all will convert 2 spaces to a tab inside a string # if they are aligned correctly. That's a Bad Thing. # GNU "indent" screws up all kinds of stuff including # *foo and &foo references. It has no knowledge of c++ # # other thoughts? # Welcome to the whitespace posting board. # # "man unexpand" # # unexpand -t 8 -a file > file2 (then do some moving) # # That program takes the tab positions into account. # I don't know how standard it is (it is in the debian # coreutils package if that's any indication), but I # would suggest having the script simply bail on that # conversion if it isn't present. # Note: this script will not alter any files that already # meet the BZFlag whitespace usage guidelines. # if your files are being messed up by this, then chances # are they are _already_ messed up when others look at them # ie: you are now seeing what others see when they look at your # messed up whitespace. If you find that this script can be # improved to help your files be more compliant with the # BZFlag whitespace guidelines, feel free to improve the script # it will soon be run automatically from time to time, so # if it messes up your code, then either fix it, or fix your code. # Feel free to send specific examples to Tim Riker and he'll try # to improve the script. # Thanx! Tim "ws king" Riker # hmm... the 8 spaces to tab rule is a likely candidate: # this foo # this foo # those two line up before the script and won't afterwards # timr will look into fixing that. # cleanup whitespace issues # could use new sed, but not everybody has that yet # sed -i -e 's/search/replace/g' filename1 ... # perl -pi -e 's/search/replace/g;' filename1 ... # grep them first to not touch the file date/time #temp=$$.tmp files=`find * -name \*.cxx -o -name \*.h -o -name \*.cpp -o -name \*.c -o -name Makefile.am | egrep -v '(\.svn|MSVC/build/|src/other/)' | sort` # convert 8 spaces to tab for file in $files ; do # don't actually include 8 spaces or they might get replaced. ;-) # that's a space in the [] if grep -q '[ ] ' $file ; then #sed -i -e 's/[ ] /\t/g' $file perl -pi -e 's/[ ] /\t/g' $file #unexpand --all --tabs=8 < $file > $tmp #cat $tmp > $file fi done files=`find * -name \*.cxx -o -name \*.h -o -name \*.cpp -o -name \*.c -o -name Makefile.am -o -name README\* -o -name \*.dsp -o -name \*.fmt | egrep -v '(\.svn|MSVC/build/|src/other/)' | sort` # remove trailing whitespace and convert spacetab to tab for file in $files ; do # that's a tab in the [] if grep -q ' [ ]' $file ; then #sed -i -e 's/ \t/\t/g' $file perl -pi -e 's/ *\t/\t/g' $file fi if grep -q '[[:space:]][[:space:]]*$' $file ; then #sed -i -e 's/[[:space:]]*$//' $file perl -pi -e 's/\s*$/\n/' $file fi done # show any that remain for potential hand edits echo files with trailing whitespace: grep -Irsl '[[:space:]][[:space:]]*$' * | grep -v '\.svn' | grep -v Makefile$ | sort bzflag-2.4.2+ds1/package/000077500000000000000000000000001200563112200150325ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/Makefile.am000066400000000000000000000073621200563112200170760ustar00rootroot00000000000000SUBDIRS = DIST_SUBDIRS = linux rpm irix win32 TARGETDIR = $(top_srcdir)/bin PACKAGEDIR = $(top_srcdir)/dist MAINTAINERCLEANFILES = \ Makefile.in # # tools # if WIN32 MKDIR = mkdir.exe RM = del.exe /F /Q RMR = del.exe /F /Q /S else if IRIX MKDIR = /usr/bin/mkdir RM = /usr/bin/rm -f CD = cd else if MACOS MKDIR = /bin/mkdir RM = /bin/rm else MKDIR = mkdir RM = rm -f endif endif RMR = $(RM) -r endif if LINUX if PC ARCH = i386 else if PPC ARCH = ppc else ARCH = `uname -m | sed -e 's/i.86/i386/'` endif endif RPM = rpm RPMBASEDIR = tmp RPMDIR = $(RPM)/$(RPMBASEDIR) RPMRC = rpmrc SPECFILE = spec RPMROOT = $(RPMDIR)/root TMPROOT = /var/tmp/bzflag-$(VERSIONID)-root LDIRT = $(RPM)/$(RPMRC) # # build RPM package # targets: binprep rpmprep rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ if [ $$rpmversion -ge 3 ]; then \ cd $(RPM); rpm -bb --target $(ARCH)-linux \ --rcfile $(RPMRC) $(RPMBASEDIR)/SPECS/$(SPECFILE); \ else \ cd $(RPM); rpm -bb --buildarch $(ARCH) \ --rcfile $(RPMRC) $(RPMBASEDIR)/SPECS/$(SPECFILE); \ fi mv $(RPMDIR)/RPMS/$(ARCH)/*.rpm $(PACKAGEDIR) # # prepare binaries # binprep: strip ../src/bzflag/bzflag strip ../src/bzfs/bzfs # # prepare RPM stuff # rpmprep: # clean up -$(RMR) $(RPMDIR) $(TMPROOT) # make RPM area $(MKDIR) $(RPMDIR) \ $(RPMDIR)/RPMS $(RPMDIR)/RPMS/$(ARCH) \ $(RPMDIR)/SOURCES $(RPMDIR)/SPECS $(RPMDIR)/SRPMS # build area just our top level directory ln -s `cd $(DEPTH); pwd` $(RPMDIR)/BUILD # adjust spec file. replace version number and don't do anything # in the prep stage. also tell rpm where the config file says the # data is supposed to go. # # also what version of rpm? rpm 2.5 appears to need topdir in # rpmrc instead of defined in the spec file but rpm 3.0 won't # use that. rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ ( if [ $$rpmversion -ge 3 ]; then \ echo "%define _topdir $(RPMBASEDIR)"; fi; \ cat $(RPM)/$(SPECFILE) ) | \ sed -e 's/%setup -q -c//' \ -e 's/%define version.*/%define version '$(VERSIONID)/ \ -e 's@%define bzdatadir.*@%define bzdatadir '$(pkgdatadir)@ > \ $(RPMDIR)/SPECS/$(SPECFILE) # make rpmrc file $(ECHO) "" > $(RPM)/$(RPMRC) rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ if [ $$rpmversion -lt 3 ]; then \ $(ECHO) "topdir: $(RPMBASEDIR)" >> $(RPM)/$(RPMRC); \ fi # make buildroot named in spec file point into our RPM root area ln -s `pwd`/$(RPMROOT) $(TMPROOT) # # easy way to make the spec file. note that this isn't used for the # build. it's just a handy way to get an up to date spec file for # use directly with rpm. # newspec: # adjust spec file. replace version number and tell rpm where # the config files say the data is supposed to go. cat $(RPM)/$(SPECFILE) | \ sed -e 's/%define version.*/%define version '$(VERSIONID).$(VERSIONBUILD)/ \ -e 's@%define bzdatadir.*@%define bzdatadir '$(pkgdatadir)@ > \ newspec clean: $(COMMONPREF)clean clobber: $(COMMONPREF)clobber $(RMR) $(RPMDIR) $(TMPROOT) newspec else if IRIX SPECFILE = irix/spec-$(CONFIG) IDBFILE = irix/idb TARDIST = bzflag.tardist GENDIST = $(TOOLROOT)/usr/sbin/gendist targets: tardist dist: $(_FORCE) @VERSION=$(VERSION); export VERSION; \ VERSIONID=$(VERSIONID); export VERSIONID; \ if test ! -d $(PACKAGEDIR); then $(MKDIR) $(PACKAGEDIR); fi; \ if test ! -d $(PACKAGEDIR)/irix; then $(MKDIR) $(PACKAGEDIR)/irix; fi; \ ($(CD) $(PACKAGEDIR)/irix; $(RM) *); \ USEALLIMAGES=`grep "^[ ]*product" < $(SPECFILE) | \ awk '{list=list $2 " "}END{print list}'`; \ $(GENDIST) -verbose -all -root / -source `\pwd`/$(DEPTH) \ -idb $(IDBFILE) -spec $(SPECFILE) \ -dist $(PACKAGEDIR)/irix $$USEALLIMAGES tardist: dist $(_FORCE) ($(CD) $(PACKAGEDIR)/irix; tar cf ../$(TARDIST) *) endif endif bzflag-2.4.2+ds1/package/Makefile.in000066400000000000000000000553511200563112200171100ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = DIST_SUBDIRS = linux rpm irix win32 TARGETDIR = $(top_srcdir)/bin PACKAGEDIR = $(top_srcdir)/dist MAINTAINERCLEANFILES = \ Makefile.in @IRIX_FALSE@@MACOS_FALSE@@WIN32_FALSE@MKDIR = mkdir @IRIX_FALSE@@MACOS_TRUE@@WIN32_FALSE@MKDIR = /bin/mkdir @IRIX_TRUE@@WIN32_FALSE@MKDIR = /usr/bin/mkdir # # tools # @WIN32_TRUE@MKDIR = mkdir.exe @IRIX_FALSE@@MACOS_FALSE@@WIN32_FALSE@RM = rm -f @IRIX_FALSE@@MACOS_TRUE@@WIN32_FALSE@RM = /bin/rm @IRIX_TRUE@@WIN32_FALSE@RM = /usr/bin/rm -f @WIN32_TRUE@RM = del.exe /F /Q @WIN32_FALSE@RMR = $(RM) -r @WIN32_TRUE@RMR = del.exe /F /Q /S @IRIX_TRUE@@WIN32_FALSE@CD = cd @LINUX_TRUE@@PC_FALSE@@PPC_FALSE@ARCH = `uname -m | sed -e 's/i.86/i386/'` @LINUX_TRUE@@PC_FALSE@@PPC_TRUE@ARCH = ppc @LINUX_TRUE@@PC_TRUE@ARCH = i386 @LINUX_TRUE@RPM = rpm @LINUX_TRUE@RPMBASEDIR = tmp @LINUX_TRUE@RPMDIR = $(RPM)/$(RPMBASEDIR) @LINUX_TRUE@RPMRC = rpmrc @IRIX_TRUE@@LINUX_FALSE@SPECFILE = irix/spec-$(CONFIG) @LINUX_TRUE@SPECFILE = spec @LINUX_TRUE@RPMROOT = $(RPMDIR)/root @LINUX_TRUE@TMPROOT = /var/tmp/bzflag-$(VERSIONID)-root @LINUX_TRUE@LDIRT = $(RPM)/$(RPMRC) @IRIX_TRUE@@LINUX_FALSE@IDBFILE = irix/idb @IRIX_TRUE@@LINUX_FALSE@TARDIST = bzflag.tardist @IRIX_TRUE@@LINUX_FALSE@GENDIST = $(TOOLROOT)/usr/sbin/gendist all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) @LINUX_FALSE@clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # # build RPM package # @LINUX_TRUE@targets: binprep rpmprep @LINUX_TRUE@ rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ @LINUX_TRUE@ if [ $$rpmversion -ge 3 ]; then \ @LINUX_TRUE@ cd $(RPM); rpm -bb --target $(ARCH)-linux \ @LINUX_TRUE@ --rcfile $(RPMRC) $(RPMBASEDIR)/SPECS/$(SPECFILE); \ @LINUX_TRUE@ else \ @LINUX_TRUE@ cd $(RPM); rpm -bb --buildarch $(ARCH) \ @LINUX_TRUE@ --rcfile $(RPMRC) $(RPMBASEDIR)/SPECS/$(SPECFILE); \ @LINUX_TRUE@ fi @LINUX_TRUE@ mv $(RPMDIR)/RPMS/$(ARCH)/*.rpm $(PACKAGEDIR) # # prepare binaries # @LINUX_TRUE@binprep: @LINUX_TRUE@ strip ../src/bzflag/bzflag @LINUX_TRUE@ strip ../src/bzfs/bzfs # # prepare RPM stuff # @LINUX_TRUE@rpmprep: # clean up @LINUX_TRUE@ -$(RMR) $(RPMDIR) $(TMPROOT) # make RPM area @LINUX_TRUE@ $(MKDIR) $(RPMDIR) \ @LINUX_TRUE@ $(RPMDIR)/RPMS $(RPMDIR)/RPMS/$(ARCH) \ @LINUX_TRUE@ $(RPMDIR)/SOURCES $(RPMDIR)/SPECS $(RPMDIR)/SRPMS # build area just our top level directory @LINUX_TRUE@ ln -s `cd $(DEPTH); pwd` $(RPMDIR)/BUILD # adjust spec file. replace version number and don't do anything # in the prep stage. also tell rpm where the config file says the # data is supposed to go. # # also what version of rpm? rpm 2.5 appears to need topdir in # rpmrc instead of defined in the spec file but rpm 3.0 won't # use that. @LINUX_TRUE@ rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ @LINUX_TRUE@ ( if [ $$rpmversion -ge 3 ]; then \ @LINUX_TRUE@ echo "%define _topdir $(RPMBASEDIR)"; fi; \ @LINUX_TRUE@ cat $(RPM)/$(SPECFILE) ) | \ @LINUX_TRUE@ sed -e 's/%setup -q -c//' \ @LINUX_TRUE@ -e 's/%define version.*/%define version '$(VERSIONID)/ \ @LINUX_TRUE@ -e 's@%define bzdatadir.*@%define bzdatadir '$(pkgdatadir)@ > \ @LINUX_TRUE@ $(RPMDIR)/SPECS/$(SPECFILE) # make rpmrc file @LINUX_TRUE@ $(ECHO) "" > $(RPM)/$(RPMRC) @LINUX_TRUE@ rpmversion=`rpm --version | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`; \ @LINUX_TRUE@ if [ $$rpmversion -lt 3 ]; then \ @LINUX_TRUE@ $(ECHO) "topdir: $(RPMBASEDIR)" >> $(RPM)/$(RPMRC); \ @LINUX_TRUE@ fi # make buildroot named in spec file point into our RPM root area @LINUX_TRUE@ ln -s `pwd`/$(RPMROOT) $(TMPROOT) # # easy way to make the spec file. note that this isn't used for the # build. it's just a handy way to get an up to date spec file for # use directly with rpm. # @LINUX_TRUE@newspec: # adjust spec file. replace version number and tell rpm where # the config files say the data is supposed to go. @LINUX_TRUE@ cat $(RPM)/$(SPECFILE) | \ @LINUX_TRUE@ sed -e 's/%define version.*/%define version '$(VERSIONID).$(VERSIONBUILD)/ \ @LINUX_TRUE@ -e 's@%define bzdatadir.*@%define bzdatadir '$(pkgdatadir)@ > \ @LINUX_TRUE@ newspec @LINUX_TRUE@clean: $(COMMONPREF)clean @LINUX_TRUE@clobber: $(COMMONPREF)clobber @LINUX_TRUE@ $(RMR) $(RPMDIR) $(TMPROOT) newspec @IRIX_TRUE@@LINUX_FALSE@targets: tardist @IRIX_TRUE@@LINUX_FALSE@dist: $(_FORCE) @IRIX_TRUE@@LINUX_FALSE@ @VERSION=$(VERSION); export VERSION; \ @IRIX_TRUE@@LINUX_FALSE@ VERSIONID=$(VERSIONID); export VERSIONID; \ @IRIX_TRUE@@LINUX_FALSE@ if test ! -d $(PACKAGEDIR); then $(MKDIR) $(PACKAGEDIR); fi; \ @IRIX_TRUE@@LINUX_FALSE@ if test ! -d $(PACKAGEDIR)/irix; then $(MKDIR) $(PACKAGEDIR)/irix; fi; \ @IRIX_TRUE@@LINUX_FALSE@ ($(CD) $(PACKAGEDIR)/irix; $(RM) *); \ @IRIX_TRUE@@LINUX_FALSE@ USEALLIMAGES=`grep "^[ ]*product" < $(SPECFILE) | \ @IRIX_TRUE@@LINUX_FALSE@ awk '{list=list $2 " "}END{print list}'`; \ @IRIX_TRUE@@LINUX_FALSE@ $(GENDIST) -verbose -all -root / -source `\pwd`/$(DEPTH) \ @IRIX_TRUE@@LINUX_FALSE@ -idb $(IDBFILE) -spec $(SPECFILE) \ @IRIX_TRUE@@LINUX_FALSE@ -dist $(PACKAGEDIR)/irix $$USEALLIMAGES @IRIX_TRUE@@LINUX_FALSE@tardist: dist $(_FORCE) @IRIX_TRUE@@LINUX_FALSE@ ($(CD) $(PACKAGEDIR)/irix; tar cf ../$(TARDIST) *) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/irix/000077500000000000000000000000001200563112200160055ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/irix/Makefile.am000066400000000000000000000002121200563112200200340ustar00rootroot00000000000000EXTRA_DIST = \ bzflag.fti \ bzflag.ftr \ bzfs.fti \ idb \ spec-irix-mips2 \ spec-irix-mips3 MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/package/irix/Makefile.in000066400000000000000000000256141200563112200200620ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package/irix DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ bzflag.fti \ bzflag.ftr \ bzfs.fti \ idb \ spec-irix-mips2 \ spec-irix-mips3 MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/irix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/irix/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/irix/bzflag.fti000066400000000000000000000046751200563112200177720ustar00rootroot00000000000000 # Path_0 color(-116); bgnoutlinepolygon(); vertex(80.00, 55.00); vertex(45.00, 92.50); vertex(45.00, 37.50); endoutlinepolygon(outlinecolor); # Path_1 color(-244); bgnoutlinepolygon(); vertex(15.00, 52.50); vertex(45.00, 92.50); vertex(45.00, 37.50); endoutlinepolygon(outlinecolor); # Path_2 color(-130); bgnoutlinepolygon(); vertex(28.00, 30.00); vertex(53.00, 17.40); vertex(55.00, 22.50); vertex(30.00, 35.00); endoutlinepolygon(outlinecolor); # Path_3 color(-162); bgnoutlinepolygon(); vertex(97.20, 41.00); vertex(95.00, 32.50); vertex(55.00, 12.50); vertex(53.00, 17.40); vertex(55.00, 22.50); vertex(95.00, 47.50); endoutlinepolygon(outlinecolor); # Path_4 color(-32); bgnoutlinepolygon(); vertex(30.00, 25.00); vertex(55.00, 12.50); vertex(53.00, 17.40); vertex(28.00, 30.00); endoutlinepolygon(outlinecolor); # Path_5 color(-114); bgnoutlinepolygon(); vertex(70.60, 58.80); vertex(30.00, 35.00); vertex(55.00, 22.50); vertex(95.00, 47.50); endoutlinepolygon(outlinecolor); # Path_6 color(-130); bgnoutlinepolygon(); vertex(62.36, 33.31); vertex(64.36, 42.11); vertex(49.96, 48.91); vertex(47.36, 40.81); endoutlinepolygon(outlinecolor); # Path_7 color(-162); bgnoutlinepolygon(); vertex(83.20, 46.80); vertex(79.80, 51.60); vertex(64.36, 42.11); vertex(62.36, 33.31); endoutlinepolygon(outlinecolor); # Path_8 color(-114); bgnoutlinepolygon(); vertex(65.20, 57.12); vertex(49.96, 48.91); vertex(64.36, 42.11); vertex(79.80, 51.60); endoutlinepolygon(outlinecolor); # Path_9 color(-162); bgnoutlinepolygon(); vertex(57.56, 42.31); vertex(27.60, 26.53); vertex(27.60, 23.20); vertex(56.56, 38.11); endoutlinepolygon(outlinecolor); # Path_10 color(0); bgnoutlinepolygon(); vertex(24.27, 24.87); vertex(27.60, 23.20); vertex(27.60, 26.53); vertex(24.27, 28.20); endoutlinepolygon(outlinecolor); # Path_11 color(-114); bgnoutlinepolygon(); vertex(54.22, 43.97); vertex(57.56, 42.31); vertex(27.60, 26.53); vertex(24.27, 28.20); endoutlinepolygon(outlinecolor); # Path_12 color(iconcolor); bgnoutlinepolygon(); vertex(64.04, 59.40); vertex(74.04, 64.40); vertex(74.04, 74.40); vertex(64.04, 69.40); endoutlinepolygon(outlinecolor); # Path_13 color(outlinecolor); bgnline(); vertex(64.04, 59.40); vertex(64.04, 49.40); endline(); bzflag-2.4.2+ds1/package/irix/bzflag.ftr000066400000000000000000000016011200563112200177650ustar00rootroot00000000000000TYPE Bzflag MATCH tag == 0x00fc8001; LEGEND bzflag - a tank game SUPERTYPE Executable CMD OPEN $LEADER CMD ALTOPEN launch -m "Please enter desired options for bzflag:" \ -c $LEADER $REST ICON { if (opened) { include("../iconlib/generic.exec.open.fti"); } else { include("../iconlib/generic.exec.closed.fti"); } include("iconlib/bzflag.fti"); } TYPE Bzfs MATCH tag == 0x00fc8002; LEGEND bzfs - server for bzflag SUPERTYPE Executable CMD OPEN launch -m "Please enter desired options for bzfs\nEx. `-c' or `-h -s -t'" \ -c $LEADER $REST CMD ALTOPEN launch -m "Please enter desired options for bzfs\nEx. `-c' or `-h -s -t'" \ -c $LEADER $REST ICON { if (opened) { include("../iconlib/generic.exec.open.fti"); } else { include("../iconlib/generic.exec.closed.fti"); } include("iconlib/bzfs.fti"); } bzflag-2.4.2+ds1/package/irix/bzfs.fti000066400000000000000000000065031200563112200174610ustar00rootroot00000000000000 # Path_2 color(-130); bgnoutlinepolygon(); vertex(42.58, 22.87); vertex(60.34, 13.92); vertex(61.76, 17.54); vertex(44.00, 26.42); endoutlinepolygon(outlinecolor); # Path_3 color(-162); bgnoutlinepolygon(); vertex(91.74, 30.68); vertex(90.18, 24.64); vertex(61.76, 10.44); vertex(60.34, 13.92); vertex(61.76, 17.54); vertex(90.18, 35.30); endoutlinepolygon(outlinecolor); # Path_4 color(-32); bgnoutlinepolygon(); vertex(44.00, 19.32); vertex(61.76, 10.44); vertex(60.34, 13.92); vertex(42.58, 22.87); endoutlinepolygon(outlinecolor); # Path_5 color(-114); bgnoutlinepolygon(); vertex(72.84, 43.33); vertex(44.00, 26.42); vertex(61.76, 17.54); vertex(90.18, 35.30); endoutlinepolygon(outlinecolor); # Path_6 color(-130); bgnoutlinepolygon(); vertex(66.99, 25.22); vertex(68.41, 31.47); vertex(58.18, 36.30); vertex(56.33, 30.55); endoutlinepolygon(outlinecolor); # Path_7 color(-162); bgnoutlinepolygon(); vertex(81.79, 34.80); vertex(79.38, 38.21); vertex(68.41, 31.47); vertex(66.99, 25.22); endoutlinepolygon(outlinecolor); # Path_8 color(-114); bgnoutlinepolygon(); vertex(69.01, 42.13); vertex(58.18, 36.30); vertex(68.41, 31.47); vertex(79.38, 38.21); endoutlinepolygon(outlinecolor); # Path_9 color(-162); bgnoutlinepolygon(); vertex(63.58, 31.61); vertex(42.30, 20.40); vertex(42.30, 18.04); vertex(62.87, 28.63); endoutlinepolygon(outlinecolor); # Path_10 color(0); bgnoutlinepolygon(); vertex(39.93, 19.22); vertex(42.30, 18.04); vertex(42.30, 20.40); vertex(39.93, 21.59); endoutlinepolygon(outlinecolor); # Path_11 color(-114); bgnoutlinepolygon(); vertex(61.21, 32.79); vertex(63.58, 31.61); vertex(42.30, 20.40); vertex(39.93, 21.59); endoutlinepolygon(outlinecolor); # Path_12 color(iconcolor); bgnoutlinepolygon(); vertex(68.18, 43.75); vertex(75.29, 47.31); vertex(75.29, 54.41); vertex(68.18, 50.86); endoutlinepolygon(outlinecolor); # Path_13 color(outlinecolor); bgnline(); vertex(68.18, 43.75); vertex(68.18, 36.65); endline(); # Path_12 color(-243); bgnoutlinepolygon(); vertex(50.00, 70.00); vertex(60.00, 75.00); vertex(60.00, 40.00); vertex(50.00, 35.00); endoutlinepolygon(outlinecolor); # Path_13 bgnoutlinepolygon(); vertex(40.00, 75.00); vertex(50.00, 70.00); vertex(50.00, 35.00); vertex(40.00, 40.00); endoutlinepolygon(outlinecolor); # Path_14 bgnoutlinepolygon(); vertex(50.00, 85.00); vertex(60.00, 90.00); vertex(65.00, 87.50); vertex(50.00, 80.00); endoutlinepolygon(outlinecolor); # Path_15 bgnoutlinepolygon(); vertex(40.00, 90.00); vertex(50.00, 85.00); vertex(50.00, 80.00); vertex(35.00, 87.50); endoutlinepolygon(outlinecolor); # Path_16 bgnoutlinepolygon(); vertex(40.00, 90.00); vertex(50.00, 95.00); vertex(60.00, 90.00); vertex(50.00, 85.00); endoutlinepolygon(outlinecolor); # Path_17 color(iconcolor); bgnoutlinepolygon(); vertex(60.00, 75.00); vertex(50.00, 70.00); vertex(50.00, 80.00); vertex(65.00, 87.50); endoutlinepolygon(outlinecolor); # Path_18 bgnoutlinepolygon(); vertex(40.00, 75.00); vertex(50.00, 70.00); vertex(50.00, 80.00); vertex(35.00, 87.50); endoutlinepolygon(outlinecolor); bzflag-2.4.2+ds1/package/irix/idb000066400000000000000000000240301200563112200164650ustar00rootroot00000000000000f 755 demos demos usr/freeware/bin/bzadmin ./src/bzadmin/bzadmin EOE f 755 demos demos usr/freeware/bin/bzflag ./src/bzflag/bzflag EOE exitop("tag 0x00fc8001 /usr/freeware/bin/bzflag; iconbookedit -add 'Category:File Name:/usr/freeware/bin/bzflag' -syspage Demos") f 755 demos demos usr/freeware/bin/bzfs ./src/bzfs/bzfs EOE exitop("tag 0x00fc8002 /usr/freeware/bin/bzfs; iconbookedit -add 'Category:File Name:/usr/freeware/bzfs' -syspage Demos") f 444 demos demos usr/freeware/share/bzflag/AUTHORS ./AUTHORS REQDATA f 444 demos demos usr/freeware/share/bzflag/BUGS ./BUGS REQDATA f 444 demos demos usr/freeware/share/bzflag/COPYING ./COPYING REQDATA f 444 demos demos usr/freeware/share/bzflag/ChangeLog ./ChangeLog REQDATA f 444 demos demos usr/freeware/share/bzflag/README ./README REQDATA f 444 demos demos usr/freeware/share/bzflag/TODO ./TODO REQDATA f 444 demos demos usr/freeware/share/bzflag/blue_basetop.png ./data/blue_basetop.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/blue_basewall.png ./data/blue_basewall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/blue_bolt.png ./data/blue_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/blue_laser.png ./data/blue_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/blue_super_bolt.png ./data/blue_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/blue_tank.png ./data/blue_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/boom.wav ./data/boom.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/boxwall.png ./data/boxwall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/burrow.wav ./data/burrow.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/bzfs_conf.html ./misc/bzfs_conf.html REQDATA f 444 demos demos usr/freeware/share/bzflag/caution.png ./data/caution.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/clouds.png ./data/clouds.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/explode1.png ./data/explode1.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/explosion.wav ./data/explosion.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/fire.wav ./data/fire.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/fixedbr.png ./data/fixedbr.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/fixedmr.png ./data/fixedmr.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/flag.png ./data/flag.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/flag_alert.wav ./data/flag_alert.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/flag_drop.wav ./data/flag_drop.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/flag_grab.wav ./data/flag_grab.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/flag_lost.wav ./data/flag_lost.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/flag_won.wav ./data/flag_won.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/green_basetop.png ./data/green_basetop.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/green_basewall.png ./data/green_basewall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/green_bolt.png ./data/green_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/green_laser.png ./data/green_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/green_super_bolt.png ./data/green_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/green_tank.png ./data/green_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/helvbi.png ./data/helvbi.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/helvbr.png ./data/helvbr.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/hunt.wav ./data/hunt.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/hunt_select.wav ./data/hunt_select.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/hunter_tank.png ./data/hunter_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/jump.wav ./data/jump.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/killteam.wav ./data/killteam.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_cs_CZ.po ./data/l10n/bzflag_cs_CZ.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_da.po ./data/l10n/bzflag_da.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_de.po ./data/l10n/bzflag_de.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_en_US_l33t.po ./data/l10n/bzflag_en_US_l33t.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_en_US_redneck.po ./data/l10n/bzflag_en_US_redneck.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_es.po ./data/l10n/bzflag_es.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_fr.po ./data/l10n/bzflag_fr.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_it.po ./data/l10n/bzflag_it.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_kg.po ./data/l10n/bzflag_kg.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_nl.po ./data/l10n/bzflag_nl.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_pt.po ./data/l10n/bzflag_pt.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_sv.po ./data/l10n/bzflag_sv.po REQDATA f 444 demos demos usr/freeware/share/bzflag/l10n/bzflag_xx.po ./data/l10n/bzflag_xx.po REQDATA f 444 demos demos usr/freeware/share/bzflag/land.wav ./data/land.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/laser.wav ./data/laser.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/lock.wav ./data/lock.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/menu_arrow.png ./data/menu_arrow.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/message_private.wav ./data/message_private.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/message_team.wav ./data/message_team.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/missile.png ./data/missile.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/missile.wav ./data/missile.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/mountain1.png ./data/mountain1.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/mountain2.png ./data/mountain2.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/mountain3.png ./data/mountain3.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/mountain4.png ./data/mountain4.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/mountain5.png ./data/mountain5.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/mountain6.png ./data/mountain6.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/phantom.wav ./data/phantom.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/pop.wav ./data/pop.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/purple_basetop.png ./data/purple_basetop.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/purple_basewall.png ./data/purple_basewall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/purple_bolt.png ./data/purple_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/purple_laser.png ./data/purple_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/purple_super_bolt.png ./data/purple_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/purple_tank.png ./data/purple_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/pyrwall.png ./data/pyrwall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rabbit_bolt.png ./data/rabbit_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rabbit_laser.png ./data/rabbit_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rabbit_super_bolt.png ./data/rabbit_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rabbit_tank.png ./data/rabbit_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_basetop.png ./data/red_basetop.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_basewall.png ./data/red_basewall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_bolt.png ./data/red_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_laser.png ./data/red_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_super_bolt.png ./data/red_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/red_tank.png ./data/red_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/ricochet.wav ./data/ricochet.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/rogue_bolt.png ./data/rogue_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rogue_laser.png ./data/rogue_laser.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rogue_super_bolt.png ./data/rogue_super_bolt.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/rogue_tank.png ./data/rogue_tank.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/roof.png ./data/roof.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/shock.wav ./data/shock.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/std_ground.png ./data/std_ground.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/steamroller.wav ./data/steamroller.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/teamgrab.wav ./data/teamgrab.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/teleport.wav ./data/teleport.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/thief.png ./data/thief.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/thief.wav ./data/thief.wav SOUNDS f 444 demos demos usr/freeware/share/bzflag/timesbi.png ./data/timesbi.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/timesbr.png ./data/timesbr.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/title.png ./data/title.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/wall.png ./data/wall.png TEXTURES f 444 demos demos usr/freeware/share/bzflag/zone_ground.png ./data/zone_ground.png TEXTURES f 444 root sys usr/lib/filetype/install/bzflag.ftr ./package/irix/bzflag.ftr DESKTOP exitop("cd /usr/lib/filetype; make") f 444 root sys usr/lib/filetype/install/iconlib/bzflag.fti ./package/irix/bzflag.fti DESKTOP f 444 root sys usr/lib/filetype/install/iconlib/bzfs.fti ./package/irix/bzfs.fti DESKTOP f 444 root sys usr/share/catman/local/cat6/bzadmin.6 ./man/bzadmin.6 MAN f 444 root sys usr/share/catman/local/cat6/bzflag.6 ./man/bzflag.6 MAN f 444 root sys usr/share/catman/local/cat6/bzfs.6 ./man/bzfs.6 MAN bzflag-2.4.2+ds1/package/irix/spec-irix-mips2000066400000000000000000000026071200563112200206700ustar00rootroot00000000000000product bzflag id "bzflag ${VERSIONID}" image sw id "Software" version ${VERSION} order 1000 subsys bzflag id "bzflag Software" exp EOE replaces self replaces bzflag.sw.* 0 oldvers incompat bzflag.sw.o32 0 maxint incompat bzflag.sw.n32 0 maxint prereq ( bzflag.data.req 0 maxint fw_gcc 0 maxint ) endsubsys endimage image man id "Man Pages" version ${VERSION} order 1000 subsys manpages default id "Man Pages" exp MAN replaces self endsubsys endimage image data id "Data Files" version ${VERSION} order 1000 subsys desktop default id "Desktop Icons" exp DESKTOP replaces self endsubsys subsys req default id "Required Data" exp REQDATA replaces self endsubsys subsys sounds default id "Sounds" exp SOUNDS replaces self endsubsys subsys textures default id "Textures" exp TEXTURES replaces self endsubsys endimage endproduct product bzflag_src id "bzflag source code ${VERSIONID}" image src id "Source Code" version ${VERSION} order 1000 subsys sw default id "software source code" exp SRC replaces self endsubsys subsys data default id "data files" exp DATASRC replaces self endsubsys subsys man default id "man page source" exp MANSRC replaces self endsubsys endimage endproduct bzflag-2.4.2+ds1/package/irix/spec-irix-mips3000066400000000000000000000031271200563112200206670ustar00rootroot00000000000000product bzflag id "bzflag ${VERSIONID}" image sw id "Software" version ${VERSION} order 1000 subsys bzflag id "bzflag Software" exp EOE replaces self replaces bzflag.sw.* 0 oldvers incompat bzflag.sw.o32 0 maxint incompat bzflag.sw.n32 0 maxint prereq ( bzflag.data.req 0 maxint c++_eoe.sw32.lib 0 maxint c_eoe.sw32.lib 0 maxint compiler_eoe.sw32.lib 0 maxint compiler_eoe.sw32.unix 0 maxint dmedia_eoe.sw32.lib 0 maxint eoe.sw32.gfx 0 maxint x_eoe.sw32.eoe 0 maxint fw_gcc.sw*.* 0 maxint ) endsubsys endimage image man id "Man Pages" version ${VERSION} order 1000 subsys manpages default id "Man Pages" exp MAN replaces self endsubsys endimage image data id "Data Files" version ${VERSION} order 1000 subsys desktop default id "Desktop Icons" exp DESKTOP replaces self endsubsys subsys req default id "Required Data" exp REQDATA replaces self endsubsys subsys sounds default id "Sounds" exp SOUNDS replaces self endsubsys subsys textures default id "Textures" exp TEXTURES replaces self endsubsys endimage endproduct product bzflag_src id "bzflag source code ${VERSIONID}" image src id "Source Code" version ${VERSION} order 1000 subsys sw default id "software source code" exp SRC replaces self endsubsys subsys data default id "data files" exp DATASRC replaces self endsubsys subsys man default id "man page source" exp MANSRC replaces self endsubsys endimage endproduct bzflag-2.4.2+ds1/package/linux/000077500000000000000000000000001200563112200161715ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/linux/Makefile.am000066400000000000000000000001241200563112200202220ustar00rootroot00000000000000EXTRA_DIST = bzflag.wrap.linux install.linux MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/package/linux/Makefile.in000066400000000000000000000255301200563112200202430ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package/linux DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = bzflag.wrap.linux install.linux MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/linux/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/linux/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/linux/bzflag.wrap.linux000066400000000000000000000001621200563112200214660ustar00rootroot00000000000000#!/bin/sh -f export MESA_GLX_FX=fullscreen /usr/local/bzflag/bin/bzflag.real -directory /usr/local/bzflag/data $* bzflag-2.4.2+ds1/package/linux/install.linux000066400000000000000000000105061200563112200207220ustar00rootroot00000000000000#!/bin/sh echo "Welcome to the Linux bzflag installation program." echo "No files will be installed until after a final warning." echo # # Check for root # if [ $EUID != 0 ]; then echo "You must run the bzflag install program as root." exit 1 fi # # Pick a destination # dest=/usr/local/bzflag echo -n "Where would you like bzflag installed? [$dest] " read ans if [ x$ans != "x" ]; then dest=$ans fi # # See if Mesa is installed # echo echo "bzflag uses the Mesa libraries. Versions of Mesa prior to" echo "2.6 Beta 3 will not work correctly with bzflag." installMesa=y ans=x while [ $ans != y -a $ans != n ]; do echo -n "Do you want to install the Mesa libraries packaged with bzflag? [y] " read ans ans=`echo ${ans}y | sed -e 'y/YN/yn/' -e 's/^\(.\).*/\1/'` done if [ $ans = n ]; then installMesa=n fi # # Where should Mesa go? # mesaDest=$dest/lib if [ $installMesa = y ]; then echo echo "Where would you like to install Mesa? The directory" echo -n "will be created if it doesn't exist. [$mesaDest] " read ans if [ x$ans != "x" ]; then mesaDest=$ans fi fi # # Check for 3Dfx board # use3Dfx=n if [ -f /usr/local/glide/lib/libglide2x.so ]; then echo echo "You appear to have the 3Dfx libraries installed." ans=x while [ $ans != y -a $ans != n ]; do echo -n "Should bzflag try to use an installed 3Dfx board? [y] " read ans ans=`echo ${ans}y | sed -e 'y/YN/yn/' -e 's/^\(.\).*/\1/'` done if [ $ans = y ]; then use3Dfx=y fi fi # # warn about requiring root access for 3Dfx board # nonRoot3Dfx=n if [ $use3Dfx = y ]; then echo echo "Using the 3Dfx board requires that bzflag be run as superuser" echo "(so the glide libraries can access the hardware). Since" echo "LD_LIBRARY_PATH is ignored for setuid programs, you must" echo "either run bzflag as superuser or add the paths to the" echo "Mesa and glide libraries to your ld.so.conf file. This" echo "installer can add those entries and make bzflag setuid root" echo "so that regular users can run bzflag using the 3Dfx card." ans=x while [ $ans != y -a $ans != n ]; do echo -n "Make bzflag with 3Dfx available to all users? [y] " read ans ans=`echo ${ans}y | sed -e 'y/YN/yn/' -e 's/^\(.\).*/\1/'` done if [ $ans = y ]; then nonRoot3Dfx=y fi fi # # about to install # echo echo -n "About to begin installation. Press enter to proceed." read ans # # make directories # if [ ! -d $dest ]; then mkdir -p $dest if [ ! -d $dest ]; then echo "Failed to make bzflag directory $dest" exit 1 fi fi if [ ! -d $dest/bin ]; then mkdir $dest/bin if [ ! -d $dest/bin ]; then echo "Failed to make bzflag bin directory $dest/bin" exit 1 fi fi if [ ! -d $dest/data ]; then mkdir $dest/data if [ ! -d $dest/data ]; then echo "Failed to make bzflag data directory $dest/data" exit 1 fi fi if [ $installMesa = y -a ! -d $mesaDest ]; then mkdir -p $mesaDest if [ ! -d $mesaDest ]; then echo "Failed to make Mesa directory $mesaDest" exit 1 fi fi # # Install the binaries # cp bin/* $dest/bin # # Install the data # cp data/* $dest/data # # Install Mesa libs # if [ $installMesa = y ]; then if [ $use3Dfx = y ]; then cp lib/lib3DfxMesaGL.so.2 $mesaDest/libMesaGL.so.2 else cp lib/libMesaGL.so.2 $mesaDest/libMesaGL.so.2 fi cp lib/libMesaGLU.so.2 $mesaDest fi # # Add Glide and Mesa to system library path. Just setting LD_LIBRARY_PATH # in the wrapper script won't work because that variable isn't used for # setuid executables. # ldConfig=n if [ $installMesa = y ]; then egrep "^$dest/lib$" /etc/ld.so.conf >/dev/null 2>&1 if [ $? -ne 0 ]; then echo $dest/lib >> /etc/ld.so.conf ldConfig=y fi fi if [ $nonRoot3Dfx = y ]; then egrep "^/usr/local/glide/lib$" /etc/ld.so.conf >/dev/null 2>&1 if [ $? -ne 0 ]; then echo /usr/local/glide/lib >> /etc/ld.so.conf ldConfig=y fi fi if [ $ldConfig = y ]; then /sbin/ldconfig fi # # Make the wrapper scripts # if [ $use3Dfx = y ]; then cat <<_EOS_ > $dest/bin/bzflag #!/bin/sh -f export LD_LIBRARY_PATH=${mesaDest}:/usr/local/glide/lib export MESA_GLX_FX=fullscreen $dest/bin/bzflag.real -directory $dest/data \$* _EOS_ if [ $nonRoot3Dfx = y ]; then chown root $dest/bin/bzflag.real chmod u+s $dest/bin/bzflag.real fi else cat <<_EOS_ > $dest/bin/bzflag #!/bin/sh -f export LD_LIBRARY_PATH=${mesaDest} $dest/bin/bzflag.real -directory $dest/data \$* _EOS_ fi chmod +x $dest/bin/bzflag echo "Installation complete" bzflag-2.4.2+ds1/package/rpm/000077500000000000000000000000001200563112200156305ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/rpm/Makefile.am000066400000000000000000000001441200563112200176630ustar00rootroot00000000000000EXTRA_DIST = \ bzflag-l.xpm \ bzflag-m.xpm \ bzflag-s.xpm MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/package/rpm/Makefile.in000066400000000000000000000255431200563112200177060ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package/rpm DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ bzflag-l.xpm \ bzflag-m.xpm \ bzflag-s.xpm MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/rpm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/rpm/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/rpm/bzflag-l.xpm000066400000000000000000000051011200563112200200510ustar00rootroot00000000000000/* XPM */ static char * bzflag_5_xpm[] = { "48 48 5 1", " c None", ". c #FFFFFF", "+ c #808080", "@ c #C0C0C0", "# c #000000", "................................................", ".+++++++++++++ ++++++++++++++++++ +", "@+++++++++++++++++ ++++++++++++++++++++ +", "@+++++++++++++++++++ ++++++++++++++++++++ +", "@++++++++++++++++++++ ++++++++++++++++++#+ +", "@+++++++++++++++++++++ ++++++++++++++++++#+ +", "@+++++++######+++++++# +########++++++++## +", "@+++++++# +++++++++ +++++++++++++++## +", "@+++++++# ++++++#+ ++++++++#+ +", "@+++++++# +++++++#+ ++++++++## +", "@+++++++# +++++++# ++++++++# +", "@+++++++++++++++++++#+ ++++++++#+ +", "@+++++++++++++++++##+ ++++++++## +", "@+++++++++++++++++#+ ++++++++#+ +", "@+++++++++++++++++++ ++++++++#+ +", "@++++++++++++++++++++ ++++++++## +", "@+++++++######++++++++ ++++++++#+ +", "@+++++++# ++++++++ ++++++++## +", "@+++++++# +++++++# ++++++++## +", "@+++++++# +++++++#+ ++++++++#+ +", "@+++++++# ++++++++#+ ++++++++++ + +", "@+++++++++++++++++++++# +++++++++++++++++++++ +", "@++++++++++++++++++++## +++++++++++++++++++++ +", "@++++++++++++++++++++#+ +++++++++++++++++++++ +", "@++++++++++++++++++##+ +++++++++++++++++++++ +", ".++++++++++++++++###+ +++++++++++++++++++#+ +", ". ##############+++ +###################+ +", ". +", ". +", ". +", ". +", ". +######### ###+ ####+ ++####+ +", ". +######### ###+ ####+ +#######+ +", ". +###++++++ ###+ +##### +####++###+ +", ". +### ###+ ######+ +###+ +### +", ". +### ###+ ##+###+ #### +++ +", ". +######+ ###+ +##++### #### +", ". +####### ###+ ### +###+ #### +##### +", ". +###++++ ###+ ##+++###+ #### +##### +", ". +### ###+ +######### #### ++### +", ". +### ###++++++ ##########+ +###+++#### +", ". +### #########+##+ ###+ +######### +", ". +### #########+##+ #### +#####++# +", ". +++ ++++++++++++ ++++ +++ + +", ". +", ". +", ". +", ".+++++++++++++++++++++++++++++++++++++++++++++++"}; bzflag-2.4.2+ds1/package/rpm/bzflag-m.xpm000066400000000000000000000024011200563112200200520ustar00rootroot00000000000000/* XPM */ static char * bzflag_3_xpm[] = { "32 32 5 1", " c None", ". c #FFFFFF", "+ c #C0C0C0", "@ c #808080", "# c #000000", "................................", "+@@@@@@@@@@@ @@@@@@@@@@@@@@", "+@@@@@@@@@@@@@ @@@@@@@@@@@@@@", "+@@@@@@@@@@@@@@ @@@@@@@@@@@@#@", "+@@@@#####@@@@# @#####@@@@@@#+", "+@@@@# @@@@#@ @@@@@@#++", "+@@@@# @@@@#@ @@@@@##++", "+@@@@@@@@@@@@@@ @@@@@#@+++", "+@@@@@@@@@@@## @@@@@@#++++", "+@@@@@@@@@@@@@ @@@@@#+++++", "+@@@@@@@@@@@@@ @@@@@##+++++", "+@@@@# @@@@@@ @@@@@@#++++++", "+@@@@# @@@@@# @@@@@#+++++++", "+@@@@# @@@@@# @@@@@@@+++++++", "+@@@@@@@@@@@@@@# @@@@@@@@@@@@@@@", "+@@@@@@@@@@@@@#@ @@@@@@@@@@@@@@@", "+@@@@@@@@@@@@#@ @@@@@@@@@@@@@@@", ".##########@@ @#############@", ". ", ". ", ". ", ".@###### ##@ ### #####@ ", ".@##@@@@ ##@ @### @##@@##@", ".@## ##@ ####@ ###+++@@", ".@####@ ##@ @##@## ###+++++", ".@##@@@ ##@ ##@@##@ ###@####", ".@## ##@ ####### ###+@@##", ".@## ######@#@ ## #######", ".@## ######@#@ ## @####@#", ". ", ". ", ".@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"}; bzflag-2.4.2+ds1/package/rpm/bzflag-s.xpm000066400000000000000000000006411200563112200200640ustar00rootroot00000000000000/* XPM */ static char * bzflag_xpm[] = { "16 16 3 1", " c None", ". c #808080", "+ c #000000", " ", " ", " ", " ..... .......", "+++++++. +++++++", "+++..+++ ....+++", "+++ .++ .++.", "+++..++. .+++ ", "+++++++. +++. ", "+++...++ .+++ ", "+++ .++..+++. ", "++++++++ +++++++", "+++++++. +++++++", " ", " ", " "}; bzflag-2.4.2+ds1/package/win32/000077500000000000000000000000001200563112200157745ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/win32/Makefile.am000066400000000000000000000001311200563112200200230ustar00rootroot00000000000000SUBDIRS = nsis EXTRA_DIST = \ README.win32.html MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/package/win32/Makefile.in000066400000000000000000000436531200563112200200540ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package/win32 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = nsis EXTRA_DIST = \ README.win32.html MAINTAINERCLEANFILES = \ Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/win32/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/win32/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/win32/README.win32.html000066400000000000000000000166601200563112200205710ustar00rootroot00000000000000 BZFlag Readme

      BZFlag Readme


      This is the README file for the Windows version of BZFlag.

      BZFlag is a network multiplayer 3D tank battle game. You can play against several other people anywhere on the Internet. BZFlag is freeware and Open Source; please read the file COPYING found where you installed BZFlag.


      Requirements

      BZFlag will run on Windows XP/Vista/7 systems, with limited support for Windows 2000. A hardware accelerated graphics card with current drivers is highly recommended for adequate performance. The game requires DirectX 8 or greater to be installed.


      Global Registration

      Many game servers require users to be globally registered to play. Global registration is free and handled by the official BZFlag forums. Please go to http://my.bzflag.org/bb/ to create a global account. A valid e-mail address is required.


      Uninstalling

      Navigate to the Start Menu and locate the BZFlag directory. Click on the Uninstall item and follow the onscreen directions. Note that your configuration will not be deleted. This is stored in your documents folder under "My BZFlag Files".


      Playing

      To begin playing BZFlag, launch the game using the start menu or quicklaunch shortcuts. The game will go fullscreen (unless you are starting in windowed mode), load its data files, and show the main menu.

      Use the arrow, enter, and escape keys to navigate the menus. You should first browse the `Help' menu. Use Page Up and Page Down to cycle through the help pages. These pages explain the game, how to play, and which keys are bound to which controls. You can change the key bindings from the `Change Key Mapping' menu under `Options' menu.

      To play you must join a game using the `Join Game' menu. Use `Find Server' to search for an existing server. Select a server from the list and press enter (press escape to cancel). This sets the server name and port number in the `Join Game' menu. You can enter a name manually if `Find Server' doesn't show the server you want. You may need to set the port too. The default port number is 5154 and most servers will use this.

      If you haven't entered a callsign before, you need to type one before connecting to a server. This is the name you'll be known by during the game. You should also choose a team before joining the server. Many servers may block specific teams, or the teams might be full. If so, try a different team or choose `Automatic'. You cannot change teams once you've joined a game, though you can reconnect later with a different team and/or callsign.

      Once you have your callsign, team, server, and port set up, use `Connect' to join the game. If anything goes wrong, the game will show an error message telling you how to correct the problem. Otherwise, you'll find yourself ready to play.

      Your name and score are shown in your team color in the upper left. The scoreboard lists all the players (in order by score), their scores, what flag they are carrying (if any), and the number of times you've killed and been killed by that player. Your current status is at the top center. Press the right mouse button or the `i' key to start playing!

      For additional information, check out the Getting Started page on our wiki.


      Trouble

      Typical problems with BZFlag involve either the graphics or the network. A list of some Common Support Issues is available on the BZFlag wiki.

      Graphics

      BZFlag uses OpenGL for rendering. As per the system requirements, it is recommended that you have hardware accelerated graphics with the latest video drivers. When you start the game, the `OpenGL Driver` will be displayed in the text console at the bottom of the screen. If this is shown as `GDI Generic', it means that you do not have functioning hardware accelerated graphics. You should install the latest driver for your graphics chipset and try the game again. Here are some of the common video chipsets:

      Even with hardware acceleration, some cards support OpenGL better than others. You may want to fiddle with the graphics options in the `Options' menu if your frame rate is low or the graphics look wrong. The `t' and `y' keys toggle frame rate and time-per-frame readouts. If you are having very low framerates, ensure that Lighting and Shadows are off. Some of the lowest graphics settings are actually optimized for very old graphics chipsets or for software rendering and may actually run slower than higher settings.

      If the game runs but the rendering is wrong, your OpenGL driver is broken. It is not a problem with BZFlag. Try installing the latest video driver from your graphics card manufacturer.

      The majority of graphics problems are caused by old or incompatible video drivers. The video drivers that come with Windows or are distributed through Windows Update are never current and do not provide the OpenGL functions BZFlag needs. Always get the current driver for your video card from the card manufacturer or chipset company. If you are using a laptop you may have to get the current driver from your laptop manufacturer.

      If the game looks too bright or too dark, you can adjust the `Brightness' setting in-game under the Options > Display Settings menu.

      Network

      Network problems can be more difficult to track down. If you have a firewall, make sure it is allowing BZFlag to communicate with the Internet. The client will talk on port 80 to various web services such as the list server and the message of the day. It will also communicate on whatever port a server is running on, such as 5154, using both TCP and UDP.

      Due to our initial communication on port 80, some anti-virus or firewalls may classify the client as a browser and then heavily restrict traffic. One such example is the anti-virus program Nod32. To fix this in Nod32, right click on Nod32 in the system tray, go to Advanced Setup. From there, go to Web access protection > HTTP, HTTPS > Web browsers, and uncheck BZFlag. These steps will of course be different for other anti-virus and firewalls.

      If you're using BZFlag over a dialup modem, you will need to connect to the Internet before starting BZFlag.

      Visit the BZFlag Home Page and the BZFlag Wiki for more information and online help.

      bzflag-2.4.2+ds1/package/win32/nsis/000077500000000000000000000000001200563112200167505ustar00rootroot00000000000000bzflag-2.4.2+ds1/package/win32/nsis/BZFlag.nsi000066400000000000000000000336741200563112200206050ustar00rootroot00000000000000;NSIS Modern User Interface version 1.69 ;Original templates by Joost Verburg ;Redesigned for BZFlag by blast007 ;-------------------------------- ;Includes ; Modern UI !include "MUI2.nsh" ; Windows Version Detection !include "WinVer.nsh" ;-------------------------------- ;BZFlag Version Variables !define VER_MAJOR 2.4 !define VER_MINOR .2 !ifdef BUILD_64 !define PLATFORM x64 !define RUNTIME_PLATFORM x64 !define BITNESS 64Bit !else !define PLATFORM Win32 !define RUNTIME_PLATFORM x86 !define BITNESS 32Bit !endif ;-------------------------------- ;Compression options ;If you want to comment these ;out while testing, it speeds ;up the installer compile time ;Uncomment to reduce installer ;size by ~35% SetCompress auto SetCompressor /SOLID lzma ;-------------------------------- ;Configuration ; Installer output file and default installation folder Name "BZFlag ${VER_MAJOR}${VER_MINOR} ${BITNESS}" !ifdef BUILD_64 OutFile "..\..\..\bin_x64\bzflag-${VER_MAJOR}${VER_MINOR}_${BITNESS}.exe" InstallDir "$PROGRAMFILES64\BZFlag${VER_MAJOR}${VER_MINOR}_${BITNESS}" !else OutFile "..\..\..\bin_Win32\bzflag-${VER_MAJOR}${VER_MINOR}_${BITNESS}.exe" InstallDir "$PROGRAMFILES32\BZFlag${VER_MAJOR}${VER_MINOR}_${BITNESS}" !endif ; Make it look pretty in XP XPStyle on ; The installer needs administrative rights RequestExecutionLevel admin ;-------------------------------- ;Variables Var MUI_TEMP Var STARTMENU_FOLDER ;-------------------------------- ;Interface Settings ;Icons !define MUI_ICON ..\..\..\MSVC\bzflag.ico !define MUI_UNICON uninstall.ico ;Bitmaps !define MUI_WELCOMEFINISHPAGE_BITMAP "side.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "side.bmp" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "header.bmp" !define MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\simple-round2.bmp" !define MUI_COMPONENTSPAGE_SMALLDESC ;Show a warning before aborting install !define MUI_ABORTWARNING ;-------------------------------- ;Pages ;Welcome page configuration !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of BZFlag ${VER_MAJOR}${VER_MINOR} ${__DATE__} ${BITNESS}.$\r$\n$\r$\nBZFlag is a free multiplayer multiplatform 3D tank battle game. The name stands for Battle Zone capture Flag. It runs on Irix, Linux, *BSD, Windows, Mac OS X and other platforms. It's one of the most popular games ever on Silicon Graphics machines.$\r$\n$\r$\nClick Next to continue." !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "copying.rtf" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY ;Start Menu Folder Page Configuration !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\BZFlag${VER_MAJOR}${VER_MINOR}${BITNESS}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_INSTFILES ;Finished page configuration !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\doc\ReadMe.win32.html" !define MUI_FINISHPAGE_SHOWREADME_TEXT "View Readme" !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_LINK "BZFlag Home Page" !define MUI_FINISHPAGE_LINK_LOCATION "http://www.bzflag.org" !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !define MUI_UNFINISHPAGE_NOAUTOCLOSE !insertmacro MUI_UNPAGE_FINISH ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "!BZFlag (Required)" BZFlag ;Make it required SectionIn RO ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File ..\..\..\bin_${PLATFORM}\bzflag.exe ; make the data dir SetOutPath $INSTDIR\data File ..\..\..\data\*.png ; make the fonts dir SetOutPath $INSTDIR\data\fonts File ..\..\..\data\fonts\*.png File ..\..\..\data\fonts\*.fmt File ..\..\..\data\fonts\*.License File ..\..\..\data\fonts\README ; make the l10n dir SetOutPath $INSTDIR\data\l10n File ..\..\..\data\l10n\*.po File ..\..\..\data\l10n\*.txt SetOutPath $INSTDIR\data File ..\..\..\data\*.png ; make the sounds dir SetOutPath $INSTDIR\data File ..\..\..\data\*.wav ; make the doc dir SetOutPath $INSTDIR\doc File ..\ReadMe.win32.html File ..\..\..\COPYING File ..\..\..\bin_${PLATFORM}\docs\bzflag.html ; Add some DLL files SetOutPath $INSTDIR File ..\..\..\bin_${PLATFORM}\libcurl.dll ; This requires the Visual C++ runtime file to be located in ; the same directory as the NSIS script ; http://www.microsoft.com/downloads/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C SetOutPath $TEMP DetailPrint "Installing Visual C++ ${BITNESS} runtime" File vcredist_${RUNTIME_PLATFORM}.exe ExecWait "$TEMP\vcredist_${RUNTIME_PLATFORM}.exe /q" DetailPrint "Cleaning up" Delete $TEMP\vcredist_${RUNTIME_PLATFORM}.exe ; Write the installation path into the registry WriteRegStr HKLM SOFTWARE\BZFlag${VER_MAJOR}${VER_MINOR} "Install_Dir" "$INSTDIR" ; Write the uninstall keys for Windows WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BZFlag${VER_MAJOR}${VER_MINOR}_${BITNESS}" "DisplayName" "BZFlag ${VER_MAJOR}${VER_MINOR} ${BITNESS} (remove only)" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BZFlag${VER_MAJOR}${VER_MINOR}_${BITNESS}" "UninstallString" '"$INSTDIR\uninstall.exe"' ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Main start menu shortcuts SetOutPath $INSTDIR CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\BZFlag ${VER_MAJOR}${VER_MINOR}.lnk" "$INSTDIR\bzflag.exe" "" "$INSTDIR\bzflag.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\BZFlag ${VER_MAJOR}${VER_MINOR} (Windowed).lnk" "$INSTDIR\bzflag.exe" "-window 800x600" "$INSTDIR\bzflag.exe" 0 ; Local User Data Var /GLOBAL UserData ${If} ${AtMostWinXP} StrCpy $UserData "%USERPROFILE%\Local Settings\Application Data\BZFlag" ${Else} StrCpy $UserData "%LOCALAPPDATA%\BZFlag" ${EndIf} CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Browse User Data.lnk" "$UserData" SetOutPath $INSTDIR\doc CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER\Doc" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Doc\BZFlag [game] Manual Pages (HTML).lnk" "$INSTDIR\doc\bzflag.html" "" "" 0 !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section "BZAdmin" BZAdmin ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File ..\..\..\bin_${PLATFORM}\bzadmin.exe ; Add to the doc dir SetOutPath $INSTDIR\doc File ..\..\..\bin_${PLATFORM}\docs\bzadmin.html !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Main start menu shortcuts SetOutPath $INSTDIR CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\BZAdmin ${VER_MAJOR}${VER_MINOR}.lnk" "$INSTDIR\bzadmin.exe" "" "$INSTDIR\bzadmin.exe" 0 SetOutPath $INSTDIR\doc CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER\Doc" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Doc\bzadmin [admin] Manual Pages (HTML).lnk" "$INSTDIR\doc\bzadmin.html" "" "" 0 !insertmacro MUI_STARTMENU_WRITE_END SectionEnd SectionGroup "BZFlag Server" BZFlagServer Section "Server Application" BZFlagServer_Application ; Set output path to the installation directory. SetOutPath $INSTDIR ; Put file there File ..\..\..\bin_${PLATFORM}\bzfs.exe ; add to the data dir SetOutPath $INSTDIR\misc File ..\..\..\misc\maps\hix.bzw File ..\..\..\misc\bzfs.conf File ..\..\..\misc\bzfs_conf.html File ..\..\..\misc\groups.conf File ..\..\..\misc\vars.txt ; Add to the doc dir SetOutPath $INSTDIR\doc File ..\..\..\bin_${PLATFORM}\docs\bzfs.html File ..\..\..\bin_${PLATFORM}\docs\bzw.html !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Main start menu shortcuts SetOutPath $INSTDIR CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER\Server" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Server\Start Server (Simple Jump Teleport 1 shot).lnk" "$INSTDIR\bzfs.exe" "-p 5154 -j -t -s 32 +s 16 -h" "$INSTDIR\bzflag.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Server\Start Server (Simple Jump Teleport 3 shots).lnk" "$INSTDIR\bzfs.exe" "-p 5154 -j -t -ms 3 -s 32 +s 16 -h" "$INSTDIR\bzflag.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Server\Start Server (HIX [Public] FFA).lnk" "$INSTDIR\bzfs.exe" '-p 5154 -j -tkkr 80 -fb -ms 3 -s 32 +s 16 -world misc\hix.bzw' "$INSTDIR\bzflag.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Server\Start Server (HIX [Public] CTF).lnk" "$INSTDIR\bzfs.exe" '-p 5154 -c -j -fb -world misc\hix.bzw' "$INSTDIR\bzflag.exe" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Server\BZFS Configuration Builder.lnk" "$INSTDIR\misc\bzfs_conf.html" "" "" 0 SetOutPath $INSTDIR\doc CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER\Doc" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Doc\bzfs [server] Manual Pages (HTML).lnk" "$INSTDIR\doc\bzfs.html" "" "" 0 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Doc\bzw [maps] Manual Pages (HTML).lnk" "$INSTDIR\doc\bzw.html" "" "" 0 !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section "Plugins" BZFlagServer_Plugins ; Include the plugins SetOutPath $INSTDIR File ..\..\..\bin_${PLATFORM}\plugins\*.dll SectionEnd Section "Plugin API" BZFlagServer_PluginAPI ; Add the API library and header SetOutPath $INSTDIR\API File ..\..\..\bin_${PLATFORM}\bzfs.lib File ..\..\..\bin_${PLATFORM}\plugin_utils.lib File ..\..\..\include\bzfsAPI.h File ..\..\..\plugins\plugin_utils\*.h SectionEnd SectionGroupEnd Section "Desktop Icon" Desktop ; Install for all users SetShellVarContext all ;shortcut on the "desktop" SetOutPath $INSTDIR CreateShortCut "$DESKTOP\BZFlag${VER_MAJOR}${VER_MINOR} ${BITNESS}.lnk" "$INSTDIR\bzflag.exe" "" "$INSTDIR\bzflag.exe" 0 SectionEnd ;-------------------------------- ;Descriptions ;Language strings LangString DESC_BZFlag ${LANG_ENGLISH} "Installs the main 3D application and the associated data files." LangString DESC_BZAdmin ${LANG_ENGLISH} "Installs the command line administration tool." LangString DESC_BZFlagServer ${LANG_ENGLISH} "Installs the server application, associated plugins, and/or the plugin API." LangString DESC_BZFlagServer_Application ${LANG_ENGLISH} "This can be used to run private and public servers, but is not required to play the game." LangString DESC_BZFlagServer_Plugins ${LANG_ENGLISH} "Plugins can be used to modify the way a bzflag server runs, and add functionality." LangString DESC_BZFlagServer_PluginAPI ${LANG_ENGLISH} "The plugin API is used to compile plugins, and is only need for plugin developers." LangString DESC_Desktop ${LANG_ENGLISH} "Adds a shortcut on the desktop." ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${BZFlag} $(DESC_BZFlag) !insertmacro MUI_DESCRIPTION_TEXT ${BZAdmin} $(DESC_BZAdmin) !insertmacro MUI_DESCRIPTION_TEXT ${BZFlagServer} $(DESC_BZFlagServer) !insertmacro MUI_DESCRIPTION_TEXT ${BZFlagServer_Application} $(DESC_BZFlagServer_Application) !insertmacro MUI_DESCRIPTION_TEXT ${BZFlagServer_Plugins} $(DESC_BZFlagServer_Plugins) !insertmacro MUI_DESCRIPTION_TEXT ${BZFlagServer_PluginAPI} $(DESC_BZFlagServer_PluginAPI) !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} $(DESC_Desktop) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;-------------------------------- ;Uninstaller Section Section "Uninstall" ; remove files Delete $INSTDIR\*.* Delete $INSTDIR\doc\*.* Delete $INSTDIR\misc\*.* Delete $INSTDIR\data\*.* Delete $INSTDIR\data\fonts\*.* Delete $INSTDIR\data\l10n\*.* Delete $INSTDIR\data\*.* Delete $INSTDIR\API\*.* ; MUST REMOVE UNINSTALLER, too Delete $INSTDIR\uninstall.exe ; remove directories used. RMDir "$INSTDIR\API" RMDir "$INSTDIR\data\l10n" RMDir "$INSTDIR\data\fonts" RMDir "$INSTDIR\data" RMDir "$INSTDIR\misc" RMDir "$INSTDIR\doc" RMDir "$INSTDIR" !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP ;remove shortcuts, if any. Delete "$SMPROGRAMS\$MUI_TEMP\*.*" Delete "$SMPROGRAMS\$MUI_TEMP\Server\*.*" Delete "$SMPROGRAMS\$MUI_TEMP\Doc\*.*" RMDir "$SMPROGRAMS\$MUI_TEMP\Server" RMDir "$SMPROGRAMS\$MUI_TEMP\Doc" RMDir "$SMPROGRAMS\$MUI_TEMP" ;Delete empty start menu parent diretories StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" startMenuDeleteLoop: RMDir $MUI_TEMP GetFullPathName $MUI_TEMP "$MUI_TEMP\.." IfErrors startMenuDeleteLoopDone StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop startMenuDeleteLoopDone: ; Remove desktop shortcut for all users SetShellVarContext all Delete "$DESKTOP\BZFlag${VER_MAJOR}${VER_MINOR} ${BITNESS}.lnk" ;remove registry keys DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BZFlag${VER_MAJOR}${VER_MINOR}${BITNESS}" DeleteRegKey HKLM "SOFTWARE\BZFlag${VER_MAJOR}${VER_MINOR}${BITNESS}" DeleteRegKey HKCU "Software\BZFlag" SectionEnd bzflag-2.4.2+ds1/package/win32/nsis/DisableCheck.bmp000066400000000000000000000005501200563112200217510ustar00rootroot00000000000000BMfv(  331333133333331133333133133333133313333311313311333133333313331131333333333311333333333113333331 bzflag-2.4.2+ds1/package/win32/nsis/EnableCheck.bmp000066400000000000000000000004721200563112200215770ustar00rootroot00000000000000BM8F(  ""!"""!""""""!!""""!""""!"""!!"""!""!!""!"""""!"""!"!"""""""""""!""""""""""!""""""! bzflag-2.4.2+ds1/package/win32/nsis/Makefile.am000066400000000000000000000002661200563112200210100ustar00rootroot00000000000000EXTRA_DIST = \ BZFlag.nsi \ DisableCheck.bmp \ EnableCheck.bmp \ copying.rtf \ header.bmp \ notes.txt \ side.bmp \ uninstall.ico MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/package/win32/nsis/Makefile.in000066400000000000000000000257121200563112200210240ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = package/win32/nsis DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ BZFlag.nsi \ DisableCheck.bmp \ EnableCheck.bmp \ copying.rtf \ header.bmp \ notes.txt \ side.bmp \ uninstall.ico MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu package/win32/nsis/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu package/win32/nsis/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/package/win32/nsis/copying.rtf000066400000000000000000000603341200563112200211430ustar00rootroot00000000000000{\rtf1\ansi\ansicpg10000\deff0{\fonttbl{\f0\fnil\fcharset0 Arial;}} {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\qc\lang9\fs32 GNU LESSER GENERAL PUBLIC LICENSE\par \fs28 Version 2.1, February 1999\fs20\par \pard Copyright (C) 1991, 1999 Free Software Foundation, Inc.\par 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \par \pard\qc\fs28 Preamble\par \pard\fs20\par The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.\par \par This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.\par \par When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. \par \par To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.\par \par For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.\par \par We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.\par \par To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.\par \par Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.\par \par Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.\par \par When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.\par \par We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.\par \par For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.\par \par In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.\par \par Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.\par \par The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. \par \par \pard\qc\fs28 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par \pard\fs20\par \b 0.\b0 This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". \par \par A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. \par \par The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) \par \par "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. \par \par Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. \par \par \b 1.\b0 You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. \par You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \par \par \b 2.\b0 You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \par \tab\b a)\b0 The modified work must itself be a software library. \par \tab\b b)\b0 You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. \par \tab\b c)\b0 You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. \par \tab\b d)\b0 If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. \par (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)\par \par These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \par Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. \par In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \par \par \b 3.\b0 You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. \par Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. \par \par This option is useful when you wish to copy part of the code of the Library into a program that is not a library. \par \par \b 4.\b0 You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. \par \par If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.\par \par \b 5.\b0 A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. \par \par However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. \par \par When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. \par \par If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) \par \par Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. \par \par \b 6.\b0 As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. \par \par You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: \par \tab\b a)\b0 Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) \par \tab\b b)\b0 Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. \par \tab\b c)\b0 Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. \par \tab\b d)\b0 If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. \par \tab\b e)\b0 Verify that the user has already received a copy of these materials or that you have already sent this user a copy. \par \par For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \par \par It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. \par \par \b 7.\b0 You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: \par \tab\b a)\b0 Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. \par \tab\b b)\b0 Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. \par \par \b 8.\b0 You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \par \par \b 9.\b0 You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. \par \par \b 10.\b0 Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. \par \par \b 11.\b0 If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. \par \par If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. \par \par It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \par \par This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par \par \b 12.\b0 If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \par \par \b 13.\b0 The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \par \par Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. \par \par \b 14.\b0 If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \par NO WARRANTY \par \par \b 15.\b0 BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \par \par \b 16.\b0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par \par \pard\sa200\sl276\slmult1\fs28 END OF TERMS AND CONDITIONS\fs22\par } bzflag-2.4.2+ds1/package/win32/nsis/header.bmp000066400000000000000000000623331200563112200207070ustar00rootroot00000000000000BMd6(9  ~~~~~~~~~~~~~~llo  ggj88frrvv||ȃɉˎ˕̜΢ϨЯҵӺӾddmzz{deh33f||턄aalyyzffj00essvvyy偁ꉉݍޔᣣ綶^^kzz|jim,,dkkmmoouu~~CCx    !)),ffp[[k((bddeeffkkvvKKش!WWiHHaa``bbeett88r ϰ裏 iix }}}CC\\[[^^bbmm88w qq kk| {{{??YYXXYY^^ii55v jjjjaaFFfffttxxff|ZZiii| zzz<>>>??BBJJ&&s ^^@@99o~~))):\\qq ZZy zzz**;;::;;>>GG$$s YY==77nyy)((:YYnn XXyﭭ zzz((886688::CC""s UU::55ntt)&&9WWkk VVx着響着 zzz&&55446677?? s QQ7722noo)%%9UUii TTx裏簾﨨 zzz$$1122334499q NN44//mii'##8RR~ff SSx襤 zzz!!....,,--??..{ ""'yyUU 33pff/&&=MMydd QQwퟟ zzz ++%%88__ჃYY##)))&&%--2nn%%" VVy??i>>hAAiaa PPw흝횚zzz''QQޅ菏디``(("...,,+449ss++(**(EER,,-mm/^^ MMw엗좢 zzzee癙엗땕띝hh00*666443;;?{{22.443220ss00-221***CCy]]\\ LLv륥 zzzZZ럟럟qq661<<<::9BBEꃃ886<<;997HHNпIIN<<<;;:110,,2MMggZZ FFt zzz쪪쪪yy==9DDDBBAJJM닋@@>CCCDDD??>9:::((( YY)))664 zzzMMJTTTRRQZZ\PPNSSSTTTTTTNNKyyUUUZZ\TTUzzMMKWWWXXXSSSLLJWWYRRQXXXMMJ zzzUUR\\\ZZYbbd񠠻WWU[[[\\\\\\VVT~~UURZZYTTR~~TTR\\\\\\\\\WWVddf[[Z\\\SSQzzz]][dddbbbjjmdde``_dddccc]][__]ddd__][[Zcccddd```bbbllmbbaddd[[Zzzzeeclllkkkllllllggfhhhbb_ggflllggfaa^hhgggfjjjmmmkkklllccbzzznnmuuuuuurrrxxy״÷Ƶppouuuppo޸ûƹyyyrrruuuuuummkzzzwwu}}}}}}}}}zzyxxx}}}xxwցyyy}}}}}}}}}uutzzz€~~~}zzzƈzzzʐ𚚚zzzϙ񢢢zzzӡ󩩪{{{רƫ~~~ñ˴ٳѻ339998886;;A~~55:665444>>C{{|228665443<4 0 / + ' $"!{ s% l*j,f,[)S$N#K"C 7 2 4 1 0 0 4 6 4 6 7 < B F! J#J%D#=!1  !!#$&&&'2%"F0&O2'K/%I/%G.&e:'I&M%Q"T!T S TTTTQQPONMMNNMKJHG?U'M$ F = 5 - )% u&1:=>=89::;<<=?C498 < 4 - ) %" ym]RE97 5,,& (" +& -)/+1/417598<;?>A?@>A>A>>;70]"Æ2̆1ԅ0{+bZ^`bceg!i#o'j%a!Q?3 - * '#!  ! v' p+m-g+^'X%R#N"E = 7 3 2 2 2 2 3 8 : = A E G L#J#A!7' !""#$%''(*:)&?*'?*(>*&>*&K.&|@'M'S&W#X"X"X"X!W WVTTSRQQQQPPMLJJg,R# K C : 1 ,(#ADC@><<:8:<<>>>@ABן=`$3 = 8 / ) ' $!~qcVI=66*/()# )$ +(.+0-316497;:><@>?=B?B>B=84hK}.ˀ/|,q'e e h"j#k#k$k$h#g#k%g$^ OC7, , ' "!" ' }( t(n*l,h+](U$P"J @ 9 3 4 4 2 1 1 5 ; 9 < ? D I!J#C!;* "#%&'('3$#:)';)'=*'@+'A+'X4'C'P(W$Z#Z#Z"Z!Y!Y!X WWVUTTSSQPONKL6S$N" G > 6 . *%!DBB@@>><:;==>@@?AABCa$1 < : 1 * ' $ !ufYL@77*1)(# ($ ,(.+0-205385:9=;:874?;>9D>94S:m(w+q(i$g#i#j$k$l%l%l&k%i$h%f$_!PG741' #!' .},u+p,k-g+\(V%P#I A 8 5 5 1 0 - 1 7 ; 9 < C G M#F"=0 !"$%&''-! :)(<)(=*(@+'@+'G.'d8(J)V&[$[#[#["Z"[!Z!Y WWVVTTTTSQOMNBY%Q" I A 9 1 +("GCCCBA@>=<>>???@ABAABy,8: =4 , (%"xk]PB87" 3,,$ (# *& -)/,1.31648541,*+(2-3.?8=8M7W n(j&h%h$i$l&n&o'p'o(m&i%h$f%_!TH@?9* % & ,01v.o-k-g,^(V$N"I ? 8 6 4 2 1 4 8 ; ; 9 ; A D F!?4   !#%&&'&8''<*)=*)?+(B,(E,(H.(l;(R(Z%\$]$]#]#]"\"[!Y Y X W VVVUTRPONMp.S$M! D < 3 -)$HFEDDCBA>>>??@AAABCDB>t$.2 A6 - ) &# }oaSF:7 6-,& (" *% ,(.+/.301/,*&$%!&"6.?78.Nj'g&g%j&m'n'n'o'p'o'k&h%g$f$`"TJGE;0.-/13y1p/k-d*Y'T$N" J @ : 7 6 3 2 2 5 8 9 9 < B DA ;% !"#&%'&/!!=+*=*)?+(A,(D,)D,)Q2(M)X(\&^$^$^"^"]"\![!Z Y X X WW VUTRQOO=V$Q# G ? 7 /*'>HFEEDCA?>=>?@ABCDDBCEHґIp6&@8 0 + '%!tgXL=86+0)(! '" *$,'-**'&" +%:3@3tB_$f&g%j&l'n'o'p'p'n'k&i%h$f$c"XPKG?:74355z2q0j,b)V%S#L! D < 7 6 3 2 4 4 5 8 9 ; ? A A=-  !"%''')9)(=+*?+*A,)C-)E-)G.)~B)U*[(^%_%_#_#_#^"]!\![ Z Y Y X XWVSSQOId*U$K B : 2 ,)0IFFDCC@?>=>?@@@AFR`py{yܰi^ B C 4 !"#&((&2#">+*>+*@,)C-*E-*E.)`7*P*Y*^'`$`$a$`#_"_"^!]!\![ Z Z X X WVTRPOu0V%P" E = 5 . +AXFEFCBCA>>>?ACMWft|zurmjb}X(l6 = 4 - ) & # }paSD:7" 2'' $ $ !          3*;4S6T f&f&j'k&m'o'o'o'o'l&j%h%e$^!XTQKFC?=;7{2s0o.j-a*X%R#N!H : 6 5 3 1 3 7 : ; 9 < A B =( !"$'(((+=++>,+@,*B-*D.*F.*M1*E+V+[*a&a%b$b$a#`"`"_!]!]!\![ [ Z X WUTRQ=Y%T$J A 8 1 ,65GECBDDB>:33<85w1q.j-b)W&O" L B < 7 6 3 3 6 7 7 8 9 A D C 9 !"$&')('7''?,,?,+A-+D.+F.*H/*]7*I+Y,`(b%b%c$b$b#b"_"_!^!]!]!\![![ Y WVTQLg+W%O! E < 6 / FP_!GFFڿ@=50(#{$}&*0AV^eg_TPUYTK@z+C%? 9 0 + ( %"xi\M?71!'          #>5;1zDd&g&h&j'm&n'o'p'o'l&k&j%f%`"X URNIE?><9|3r/m.h,]'S#P" D < 8 6 4 2 7 : : : 8 > B F!D!-!!"%&(()(- >,,?++A-+C-+E/+I0+N2+n>+P,^*b'd&d%d$c#c#b"a"`"_!^!^!]![ Y Y VTRQ8X%R# H ? 9 1 O6/0Ƅ#tj`g&*)~)}*}*,35 . * ' $ seUG:1) !           1(>5N3Y"g&g&i'k'm'o'o'm'k&k&i&e$^!X URPHB?<;7v2r/k-_(X%R#M!D @ 8 4 4 8 ; = = = > E H!G"7 ""#%'(*+)/!!@--@,,B.,D/,G0,J0+M1+Y5+Q+b*e'e&f&e%e$d$c#b"b"a"_!^!^!\!Z Y W URQy3X%Q# F @ 9 E= ;4Z9ZZVUUdy').////00168742232113h$@%?9 2 * ( %#zj]M>4+ #             (<0@.He&f%i&k&m&n'o'm'k&k&k&f%\!W URLFBA=86x2s0f,]'W&Q"D > : : 6 5 9 = = 9 > F J"L#E".!"##&)++++=++@-,A-,C/,F/,J0,L2,_8+K,^,e(f'f&f&f%f$d$d#c"b"a"_!_!]![ Z XVTS<Z%U$K C < E!G?JAH1 OXUQSl{(+/////////1121222104l%3{@; 2 , ) % # {m^OA4-$             '<,5(Dg'f&g&j'l'n'n'm'l'l&i%b#\!Y UPJDB@<7|4v1p.d*^(U$I @ ; : 7 7 ; @ @ < : D H!M#J"<" "#$&)+, +)4%%A.-A.-B.-E/,H0,J1,Z6,J-\-d*f'f'g&g%f%f$d#c#b"a"`"_!^!\![ Y W USIc)Y&N" F > >$M )P#&P&NJ-:=WTRXn {(-//./..////00/0100/1,j2J5 > 5 . ) ' $ seUE8.'             +9#9$]2]$g&g&k'm'o'm'm'm'j&c$^![ XSNGDA?:7{3s0g+^(Z&S$I A = : 8 ? C A > ? E I!K"L#H"6 !##$&)+, +++=,+@.-B.-E/,G0,K1,M2,I-[.a+f'f'h&g&g%f$e$c#b"b"a"_!^!]![ Z X USR5Z%U$K C HFE&K!DDL3Y0 RVQWm!}*./.-..-.-../../0/0//.q89 3 ?7 / * ' $!vhXI:0(             - 9 1 O*_%i(g&k&m'n'm&m'm'i&c$^![ W TMGC@=:7x2n.d*_(X&R#K C > < = B A @ ? B F K!O$N$E"-  "#$&'*+, ,*4&&A..B--D/-G/,J1,I0,s@,Z.a,e(h'h'g&g&g%f$d#c#a"a"a"_!^!\!Z Y W TSE]&X%O! F FE>9;>8<<@2CTPTf{(/00.--,----..//.//..0S;#>9 1 + ( %"{l_N@2*            * ; 6 E Ii(i'k(m'n'n'o'o'j&c#]!Y XQLGD?<95w2j,a)['T#H B ? > < < = A @ B F H M"P$L#A!$ !#%%&&(+, , , , ?-,A.-C.-E/,I1,K1,Y7,P.`,e*g'h'h&g&g%g$e#d#c"b"a"_!^!]![ Z X USOs/Z&T$K FC?AA:?;1 >-; URP_|(/0/.--,,,,-...../..-0d&@ c; ; 3 + ( &# }qaSC5)            ' 9 8 3Hj(i'l(m'l'n'o'k&c#_"\!Y SOIGD?;74t0g,b*\(P"G B ? ; < = @ @ @ C I N"Q$O$L$7  !!#%%'(*, , -!!+;))A..C.-E/,H0,L1,M2,{C,]-e)g(h'i'h&h%g$f$d#c#b"a"`!_!]!\ Z X W ST>[&Y%O! <99?868B:?"F0Z0 ITQ[s#/00/.-,,,,---.-...,-/h); M3 ; 4 - ( &# sfUF7*             # 7 ; 4 o9e&j(j'k&m'n'n(g%a#`"[!X RKIFB<96z3o.f+^(U$J E @ ; : @ D E B C I M"R%R%P$I$/""!"%$&(+- -! -!!, 0##A/.B.-D/-G/,K1,L2,`9,T.d*h(h'i'h&h&g%f$d$d#b"b"a"_!]!\![ YX UTFa']'T# 2 1 . 884<0;<@A4+* GVRXq!+01//.-,,,,-----./--2V%:4( : 6 / ) '$!yj[K>*              3 > 4 V+a%k(h'k'm'n'k&c#a#_"]!X PJIEA=85u1i,b*['Q#K B @ > B I G C A F K!R%S%R%R&G$2%!#%&&'),- , -!!*;*)B.-C.-F0-I0,N3,^8,M-a,h(i'i'h&h&h%g$e$d#c#b"`"_!^!\![ Y X VSR5\&Y%2 / . 0::3 + 77?!E D5$ }=V^jw%+010///-----.//01002|6{:@ 1~% 7 6 / * &$!zn^N@,               2 = 5 E! ["l)i'k(m(n'i%c$`#^"[ UNJHD?<7z3k-c*](V%N" F A > = B C B B D I O#R%S%S%O%G$6"#&&&(*,, - - , 1""B.-C.,E0-I0,K1,a9,K-].f)h'i'i&i&h%g%f$d$c#b"a!_!^!]!\ Z WVSRLs/[& . . 1036:;76773 6=4H+ Qey&܂+-12100/.-.00/1122236r3Q"E 7 C0 8 0 + ( %# rdTE5              ( < : 9 Gj'h'k(l(h&b$a"_"[!VPLIFB=86p/i+a)\'S#H B @ ? B E B @ C I N"S%U%U&X(U(L'7*&'&(),, - , -!!*<*)C/-E/,G0,K1,U5,K.Z.b+h(i'j'i&h%g%f$e#c#a"`!^!\![ Y XVTSPPHb( ) 1:6 05<:;95 , 5><B>20[q!)܌/1343211000111344336܃:H"=F 8 >, 6 2 , ( &#!ufWG8$              ' : : 1}Bi'i(h'i&c$a#_"\!WSMJFB=96y3n.f,a)Z'N" D ? ? @ F F C E G J O#T%U&X'Z)U)J%="*&'&((*++,+5&%B.-C.,G0,J1,M2,G-\.`-h(j'j'i&h%g%f$d#b"`!^!\![ Y XVUSQPNN;0 * -/34098::78527"IF- g!Ȅ*Ӈ,ݘ3556533322223445555ކ8r9f0?D < 1j6 3 - ) '$!yk\L>+               4 9 4 V,]$h(g&d%a#^"["Z!UQKHD@;85r0g+a)\'R#H @ A A D H F G I J P#U%T%W&]*]*V*Q)="'&&&&')*+++@,+C/,F/,I0,R4,zC-W.`,f)h'i'i&h%g%d#c#a"_!]!Z Y W VSRQPNLKM/ * ) ) 110660=;4468%G&MB59.ʌ.՗2ߡ6677755534345666668{:V2D B A ? .Z1 4 / ) ' $#}n_PA1              . 4 . K%Z#h'c%`$]"\"[!W RMKFB>;7z3l-c*^'V%N" E A > A G F D D J M"Q#U%V&Z(_+^+X*Q(9 $%&&''**+(2#!B/,D.+G/+J0+n>,T-],e)h'h&h&f%e$d#a"`"]![!Y X UTRQPNLLJJ0 ( . 2 - * .1; , 8;<<>6?B>8iZ4̘3פ7888886655545667778ڈ:m;_4 ?A > > 2:* 6 1 , ( &#!seVH6"              # ' * 6 Cg(_%["["Y!W RMJFE@;7~4o.e*_(Y&Q#D A @ D F C C A D J N"Q#T%U&X(]*]*[*W);!$%%%&'((*'4$"D/,F/*I/+_8+L,Z,b)f'f&g&f%d$c#`"_!\!Z WVTSQONMKKJI. & ( , 5 , - 04= --:940<CHE)}+¥8ϥ8ڬ:9:997765555676877ݏ;};O7E#?> = < 6 *v!5 1 , ( &$!wgZJ<&               $ + z@a%Y"W!X!W!SMJHEA=75s0i,c*^(X%M! D @ > D G H D B C G N"P#Q$P#O#T&Z)[)Q(7##%$$%&&'%8&#F.+F/*T4*H+W,_)e'e&f&e$c#b#`"^![!Z WUSQPOMKJJJJ- ) . .31. & 49 . . . 3' ,38GFA!03ũ:ҫ;ܭ;::::8866677779979׆;a:g@/C> < ; : 8 *W0 3 . ) ' $# |n^OA.                 Q*V"X"T T U OKGEB>95u2j-a)]'[(T$K @ < = @ B B ? > @ A C G H I L"Q$S&V(O'6! !!""$&&%9&#N1*\5)yA*S+\)a'd%d%d$c#a#_"]![!Z WVTRQOMLJJIJ- + ' , 3/ ) /355 +.18<@;<:<B__!<ɨ9լ:߯;;:::987788788:99ۓ;k:zN;U0 <= ; 9 8 9 *8- 4 / + ' %# obRD1                 ? NV!RR PKHFA=95x2o.b)Z'T#P"K E > ; 8 9 < = : : : < ? E F F J! N#Q%T'M&0!"$%''@*$n=*J+Q*[)`'b%c%c$c#b#`"^"\![ YXURPPOMKJIH* ) ( 178. * /00 , 076554/75:2x*<̬;ذ;<<;;:99888898999ߜ8ԃ A D E F G K#M#K"C!.!#%&%P/$K+T*Z'_'b%b$c$c#c#a#`"^"\![ Z WVSRPONLJI-,,3541 & /2 , - 6 0 + 4 , / / 05=F) 3ð<ϯ<۱<<=<<::9899998999ڗ:t ; 9 8 6 4 6 2! h 3 2 - * ' $"xj\OA$                 i1MJGD?<;86x2p0i,b*Z&R#M! I F ? : 7 6 8 : : 9 9 ; 9 : = A C C B B B <( #%$+~A'R*X'^%a%b$c$c$c#c#b#`#_"^!]![ Z WUTQOMLK/ ( %-1 /. ) ,115 , / - 02 + . 0 3 , 3* GN>Ǯ;Ӳ=ޱ<<=<<;:989999899ߜ9֐;`:hG:Q/:: 8 6 5 3 4 5( S. 3 / * ( % # |n`S E .                R&DFCA=975z3r0h,_(W&P"J B B @ ; 7 2 2 2 3 2 0 . 0 1 4 8 ; ; ; ; < ? 7  !#!7 I&W(\%_%a$c$c$d$e#e#c#c#a"a"^!]![!X VTRPML.34--0.34 ,4523853 ' # + 2337& rj$>ʯ;׳=<<=<;;:999999;:8ۚ8ς;8~6z3t1n/c*Z'U$Q#K! F B ? ; 5 1 . --/ 0 . , . 0 1 6 : < = = D 5  "9 S'Z%]$a%c$d$d$f$f$h%h%f$f$g$f%`#] Z!XUSQO.1- $ +15/51 )).147 . + ' - . / 2 89)2±<α<ٳ<<==<;;:99999:::8ה;n                 # w4:}6|6t2o/g,c*^(Y&T#Q"M!J E A > : 4 . - +- 1 2 . . 1 4 7 = ? B C I"3 !   "W-X%]$^$a%d$f%g%i%i%m'|.255x.c#^!\ YVSQ-..1/,0 + ( 11.*-4. ..-,332;6 33?;ŭ<Ҳ<ݴ=<==<;;:999999:9ݙ8Ԏ;`:eE8O-:9 6 4 2 2 1 04 >!/T#<3 . + ( & # zl]Q B ,                F y5r2m0h-b*a)_)\(X&S$M"J F A = 9 5 1 . ,-0 1 3 0 2 6 < = < B E L#/ !  L'\$_$_$c$f%g%i&k%m&1AFEB7s+b"] Z WU.0,-+-040- ( .- -52--/112749A , kg#=ɯ;յ=߳<===<;;:99999::9٘9~ : 6 4 1 1 0 1 0 1 3 0 3 4 9 > ? B E K"+ !   n5]$_$b%g&p)y+.05AHIHD=ۂ1d#^!\ Y0, ',134-+ ( , , + & *55,030 .015>> & x)<̰;ص=<===;;:999999:98ה:m:oH9W6'; : 7 5 3 2 1 0 .0:6.q3E5 - * ( & #" v! g Z L <                 Y(a+\)Z([(W&T%P#M!H D = : 6 4 2 2 1 / ,++. 0 1 6 = > > D H!(!!   Y,["_$f&ށ3>EGFJKKLJGE5b!a"^!.- ' & .11 $ )- .., ( -25,,. . /40-3; 4 "29í;ϱ=ڵ=<<<<;:999999999ݙ8ԉ;[9fE8K): 9 6 5 3 1 1 0/08 ;!(h3N;. * ) ' ' ) z*m']#P @                S&_*X(U&U&U%N"I E C ? ; 7 5 2 / 1 1 / )+- 0 4 5 9 < A H! J"%"!      !   };_#_#r,ߣ@KONMPNNMLJF/c!c"-05300-.0//0- * % /-+ ) ) * 032 , + / 6 . TS=Ƭ:Ҳ<ܴ=<<<<::999999988ە8};|M9cA3A : 9 7 5 3 2 0 0 003 :0@#HM<- + ) ) 00s-e)V%H -                AW'R%U&O$I H I F B = 9 7 4 3 3 0 , *- - . 2 5 : = B H F #"!     !"! z:]"d%Ո4FMPQRRQPNLJF0f"*%(./-*/, & $ ' ) % ' ' $  ' & )- ( - & ) - 4<~u(=Ȭ:ԯ<޲<<<<;:9988899987ڐ9j:sI8V5)? :: 7 5 3 1 0 00/0804HZ!G2 - . 032w0i-Z'K! 4                9 U'R%N#I! I I F B ? : 6 5 6 7 - + / 1 / . 1 5 < = D K"C ""!   !!#%$  Ag&z/ٮ?INPRRSRQOMKD݂.& # ) & ' & # ( $ ( # # ( # # % $ ' ) " ! ' ( * * ( 0 8:+ 3:ʬ:Ԯ;ޱ<;<:::9888887765ڋ5t6S7h@/G(: ; 7 6 3 2 0 0/./4 4.i7]#U @;;;97~3n0^(O#=                3 M#O$K"J"I!E @ ? : 7 7 8 4 , , / / - . 5 = A ? 8 0 &!!!!   !!"&(! ' N 3ϥ>EIMORSTRPOLKC " # " " # $ # & %   ' & # $ % & ( $ & - $ $ 09 4GJ;9ʪ:Ԭ;ܭ:;;:997665443332ۇ1{2h4R3W2#: 69 5 4 2 1 0///3 ;+L(Y"`$OGECA<8t2b+U%D '              - F!K#H"E!B? < 7 8 : 7 1 0 2 6 9 = @ A > 1 '!  !!    !"#%)&$f)ǭ?ADGJMPSSRPNLK   ! % ! " $ !  # "     # $ ) . ' $ & * ,030>& b^!::Ȧ9ҧ9ڧ899765422100////݀/|/s1d3F(U)7 8 7 4 3 1 0 00/18+ > = = ?A B C C C D A 6 +   !""!    !"#%(%7! 6ǸBCEGHJLOOPONM    ! " " "      & +  ,20;837? )OO59Š7Ϟ6ל5ߛ5553100.-----},|-|-{-y-q0h2{>568 5 3 2 100//2 /,r=e'b&Y"S!OJD=}6k/\)N":               % 9 A E!J%L&N&M%L$G! B B <,     ! !"$&(#8$ 5Ǽ?ACFGGIJLNNM            !  " $ "  ' ( +62154<73 0 7/ +&0r(7œ6˗5ӕ4ۓ2321/..-~,|+}+|,{,{,}-{-z,x+v,q0M$N$37 6 3 2 10///0 4*k:_%f'^$V"RMF@8o1^*P#<           ( H"K" G F H"L)O/Q6'R9,&       !"$%'#A05Ǿ;=ACDEFGIJK    !  ! % ! $ $ $ 06 +0921 / / :/53 " >;.4Ǒ2ϐ2׎1ދ/00..,,|+{+{+y*y+z+{,{-y,v+w+y-j-n656 7 4 2 2 00/ 0 14-<#Z$m+c'\$V!Q JC<u4e-U&H )             ! = L-[@2sZMrh2+)           !"$%'#I:47ý8=ABCDCCF    # % & ' * ) ,3 ) +,9., 88( ( f$1Ž2ˋ1Ӌ0ډ0//.--,z+y*z*x*x*x+z+z+y,x+u*v+s/K#? 37 5 3 2 1 0 0 1 13 18"T#p-k*b'Z$T!ME=z6h.X'I! 0         XFAd]|ñòVNJ                "$%' M?3469; 56 4 3 2 2 2 3 6 8 8.}As.w/p/d)]&T"LB:q1^*P$? !      2(&tpz¡̩вϵ̴Ǵ                      !#$&! \P0024568:          !  # ( ' & $+.*+)*+*,' -,)4-*-a#2ņ/̈́/Մ.܅...,~,},{+y*x)w)v*v*v)v)v*u+r*r)p-]+[+18 6 5 4 4 6 3.@^)`-q@$}@}1w2l-`(X$N F=w5e-T%H -     6*'zu~ŢϩʧŢţ>11                        !"$&"[O,,.1344                  ! " & % % % &&)'*,+)*&  &.-(62_J.0Ʉ.у/؁.߁.--~,},}+{+x)w)v)u)w*u)v*v*t*r*o-b.g36 8 7 7 6 5 A)jK9kWwεٻޕ_~/{3o.d)Z%P!G?z6g.X'K"6    6+(vo|v~WED                         !#%&$]R((,/12               "   #   !  #'(&(&'( %%)*((&'/-1& .*(-uV0Ć0̃.Ԃ-ہ----~,{+y+y*x*v)v*w*v*w*v*t+r)p+g0w@';9 ; 9 8ǯϸǴ˸θ̵䬃@4v2h+^'T"KB9p2]*Q%> "   7+'ritl{t~w{}xuywdNM                          !"%%$ZP|&|&(*,             $ $ " " " $ " ! # &()'(*',-,+*1, ! H:x+1DŽ.ς.ׁ-,--,|+z*y*y*u)u)u*t)t)s*s*r*r*k/J/F'8 > 2~nηȸտC/x2j,_'V#MD<s3b-T'I#'  6)&iamdsivm{sx~w~w}x{vsplilikSR                            "$$'`X{v${w%''            % % # ! ! $   $ # $ &$'()*(,.1,-.41 $"( rT-…/˂.Ӂ--,--}+z*x*x*v)t(t)t)s)r)s*q*t+p.]2^5%> 5kTCվǸɫf4}3n.b)Y%O G@z8i1\,P'8 E0'~]y^mapdqgsjsktlsmnihcc_b_tXV                                 "##(VNnk!sn"zv$            $% "  #   !  ! " # " %)'+0,'+10-('50q(0Ƃ.ρ.ր-~,,,}+z+y*x*u(s(s)u)t)t)t*s*u+x/m8N6B#E*һͽy4}3t0f)\%U"KE<r7e1].6eL+ϫ`ԙ\΋^Ћ`r_n`k`kbiae^^Yz[VyYVsWS<(#                                 "##) WQc_gc                $ $   ! "      ! " " ! " " (+/+-*( 06 ( " gOz+/ʀ-Ҁ--},},|+{+y*w*u)s(r(s(s)s)t*t,v.x1w:Z;V6)ɱD~0w1j+a(X%R!ID{=i0xL*f׵YܦSߨVZݗ\ڔ\{ZdW`W^VzYRvVPsTOnQMP81( !                                   !"!+ NHYV              "       !       #$ ! # ! &,)).,-- * * --b#.-},},},|+|,{*z*w*w)t(q(p'r(r)s*v,x.{3zmL@W8+5 3 1 . + * ) '%" !                                              ! !         ! "& # $ )'()(-),./" !(pMw+y+w+w*v*v*w*x*u*r(s)s)t+u-x/~3x+ϕk{[CCCBEF{DZAqM>lK>_>28 7 4 2 / , + ) '&%$#!                                                            %&&' "('*'(& ' ( *- % =1j&y+v*v*u*t)u*w*v*t)r)r*u+v-x0~0wA׸jABB@@BD؃Bc?_>Y8H'3 7 5 4 0 . + ) ( ' % $ # # "                                                       !$$$%#$'(# $ ' *( # )3," V<r)w+t*v*t)t)t)v*v*t*t+v,x.~1m-⻖ݺzFAA@>>>>ܛ<՘:͔83{P5 5 8! 8&6)3'0%-!* ( ' & & %$%! $"                                                     #$"%'(% $% % $ &$ ! % (% &  6*_#w*t)t)s*s)s(t*s)u+u,v-x/m'ܪڳaynaSC@@?==<::ޛ9ז7Б6ɑ6\#? 2 8%9+9/7/5.2+/(-'+&*%*')&($)'))''##                                                          # " Q8g%t*q(r)r)r)r)t*u+w,y.s*ٕR}nK'+wmfbZQIDA??@?>=;;;:866ڐ4Ӌ2̋3w,hB4"6(9-909372403/1./,-,-,,++*+)*))((''&&%$$                                  Qs*q)n(p(q*q)s*v+v,y/h"}z|4peYQJHGFEEECCBA?><<:98787653݌2և0υ0ǁ0Z$C27.<1<494725231100//..--,,,++**))(((('''' &&""                    # !  P9]"r*n(n(q)r)s*v+{.b%x!+27BLhv`VTRONNLKIGFFDCA@?><:997766555431߈0ك/.}1d*[?>6?7<6:4734120200//..---,,,+++**))(('''''&''#"                       " #$ ) wHm(n)m(n(p)s*y,i'Ę9TUWd}tWTSPNJHFECBAA?><;:987654344332110/~-z,u/[0Y>!@8>8<594634221100//./..---,,,+++**))((('''(''(&%                                          C-]#o(m(m(p)t*m(1NMQSrwVOLJHDBA?>=<;:9876544322111110//-}-z,u,h.uE.I7$C8=7:5846342211000//....--,,,,++*****)))((((((((&&                                            [6i(n(o)r*p)m(LSZ^ezYHFD@=<::987655432211000//...-,~,z+w+s*p+[-S7,M5*D6=694736331210000//....--,,,,++++++++***)))))))(((($#                                            :%X!n)p*t+a#ԹHcpyyzSBA?;:887554322110///..----,,|,{+z+u*r)o(h,~G+K4)K3*D3"<494634231101000//...-----,,,,,,,,,,,++++*++***)))*)%$                                                           S4h(w-_$;T|wG?>:864432100//..----,~+}+|*{+{+z+x+w*u*t)q(m(i(]+g=*H1)G0(B/%<0626231201000////.....---------------,,,,++,,+++***++))((&%                                           & Z#e'4տIgh@;9743110//..---,~,}+{+z+y*x)v)v)u)v)u)s)q(o(m(k(g'c(O)K1'F/'C/&@,':-5/3031100/0////....-.-.-.-----..--...---------,,+++++++*++                 +.-,*)'%$"                  =$r-ͯES{_986310/.--,~,~+|+{+z*y*x)w)v(t(s(s(q(p'p'p'p'n'l'k&i&f&b&Z(m='C-&C-&@,%<*%9)"3*2-10100//////./..-........////////////......-,-----,-,                5 4 =KJIFC@=:630-*% "               TEŪFҹMl{tH5530/.-,~+|+{*y*x*w)v)t(t(r(r'q'p'p'n'm&l&k&j&k&j&h&e%c%`%['M(T2%?+%?+$<*$9(#6'#2&.(/,0.0././././././///////0000000000//////../.......              HNI Xstromhc^[XTPLK4                     =4C̱Mh}ztiG520/-,},{+y*x)v)t(t(r(q'p'o'o&n&l&k&j%i%h%g$g%g$e%e%c$`#^$Y$R'z@&D+%=)#;)#8'#6&"4%-#-'/+/-/././///0000000011111111111100000000000000            $'p$)y#(y"&z"w   y mpfholije%! - + ) ' & $ # " !             '#BťHaz~xsoa@2//-~,|*y*v*u)t(q'p'o'm'm&l&j&i%h%g%g$f$e#d#c#c#a"_#`#]#["X"Q%A%L.#<(":'"7&!4%!3% 2$!0$ ,",%.*/-/./.0/0/10001011212211221111221122222222             )001/2031304241200..,*''#!!! LDJFDA?><:86531 0 . +&*('&%$#"!!  HXct{wsmhYB0.-},z*w)u(s(q(o'm'l&j&j&h%h%f%e$d#d#c#b#a"`"^"^"\![!Z!X!V!Q"F$M.#;&"9&"6%!4$ 2# 0#0#/# ,!+#.*0.0/0/0/0/101021213233223333333322333333                 @534253748484847462737373837362626152EOhbheda_]ZXWVRQNK DGJGFCA?=:8642/.+*((&%%&rS;bpx~~|yuplhcZ<,,}+z*w)u(q'o&n%l%j%i$g#e#d#c"c"b"a"_!^!]!\![![!Y!W V U S P K"h6"8% 8% 6$3#0"/!.!- , , +"-(0.0/0/00101121213243434444445544445544              U9775:7<8<9<8=8<8<7<7;6;6:595:5949483T} {~||{ |!}!~xu t u snrtrqomiedc^XQTVROMJHEC@A+6),sUºlvzz{yyxuqnjgb_U<1}+y*v(s(q'm&l%j%h$f#d#b#a"`"_!^!]!\ [ Y X X W UTSQONI @!R- 8$5#3"0!. - , ++**,#.)0.20202121323243545555665566666655           &'p<:<9=;?;@D?E@E@E?E@F?E@E@E?E@E?E>D?E?;6a72513/40514//,'&$"%$(*(*'+&*$)# 6TAA^NJbqqpoonljhea^[YTPH6~,p&n&l%j$g#d"b"a!^!\!Z X WUUSRQPONLKJIGDC?a17"1/.,+*))('''&'+%0-32534465878898:9::::;:;:               $!=9GAHCJDJDJDJDJDJCJEJDJCICKD:5c<68483847373731.2/5162739495;5;6:6;6:6957373836261502-VJ9;[.4+,,*)('&&&%%%$%)!1-86556598;:<<<<=<>=>=            %#>9GBNHMFLFLEMFNHNGMGOH83$!z>:;6<7;7;7;7;795 -)94:5;7=9>9@:@:@;A;AD>F@IBPI0+s?17M:?TCB}Wefdcba`_]ZXVSROLKIF<1l&` _ ^ \ XUTQOMLKJIHGGFEDCA?><;u6O)7!+(((('&&%%%$$$$'83 NL FD9987<<?>??@?@?          @E>FAG@HAHBHAICICIDKDKELFNGTL<73'3K9>H6:WIAS`a^\[ZYXWURPNKIGFDDA<ݙ4o&[ VUSPMKIHFEDDCBA@@?>><:99x6k2V+A#>".%%%%%$#$##$%'72!a](xv(a`DB<:=;?<A=        FAQKQJQJQKRLRKVP$".+EAD@>:<9B??= &"A;HBJCKDMFMFMGMFNGPIPIQJRJRKSLUMWNSK+%JD39F6:D46F66ncCSZYWVUTRQOMKJHEDB@?>>߷9ә2l%PPNKHFECBA@@??>==<;:987}6z5u5j1d0Y,B$0%#$$$$#$$$%)!ID$zw+-*jf!H@;29-      IGNJNJMHGBB=<:99ϭ6.W JHFDBA?>>>==<;;;:98766{5y5u3r3p2j1`.J&*"#$##$$%%&2,QM&~{*,-+}&^S  ebliqmuqwquoztjjgfdca_ecjgkhjfhefbCA@?GF..&&#"""<;:88к7̴5Ħ5}-PFEBA?>===<;;::9998776}5{4w4v4s3q2p1k1S*:!+!$##$%') /':4"ea(,+,,- &?;EAJFRN\X]X^ZhiYYXXZZ[Z][_]`_`_a^fd>>::XWQQVW]]z|qwhmcg\bSXMSIP;?     30KF`X_V[S[S]T\T\T\S71t6)1>/4<.1=//>/,=/*=.)\P2?GHEEDCA@>=;;:98ξ7ɸ5Dz5Ī31p*PCB??=<;;:::::98887666}6{5y4v4t3r2q1l2g0X+:!%$$$%'.&C< SM$hc')****  +!-).+3/&&,/%#'&**--104376:8<;CB,-$%::;;CC_eb`MEOGKCH@D;@7;26.2*-%'"! C?]U_W]UZQYPXPXOVM& F8*/:+19*.:,,;-*<-(:+&;-'jb5ADCBA@>=<;:977ȼ6ƶ5ð431/a%DA?>=<;;;:;:::::98876~6~6}5z4y4w3t3s2p2n2g0I%&$%%'+!JA!yo'})~()***  (,<,:0=.<&3#.%/$."*  /4;EUf^rg}ntux}}{y|}x]XKDKDKCJBIAIAH@F?E=D;A9<4:3MG32)()(DBxp{yuynqf`V&%<7)/7)/7),8**9+(;,&;,%9+$NC-;@@?>><;:987Ⱦ6ź5ô4311.g'JA?=<;;;;:;::::::9888766~6|5z5y4v4u3r3q3m7Q.7$-!/#3(:.I>k_$y'|''''( (8-?/A0C3F4H4G5G5H"'  RRZX^^acdffleodo^lJ[EXKaMdSjUoYt\u\uSfMXKQ@<+",#.$/&0(1(1)1)1)1)0(1)@:,,''&&,+B?_[zrv|rc]A=#!&06(.3',6'*7)(8*&9+%;,#:+"D9)}w6??==<:987ǿ6ú54320/,d&JB?=<<<<;;;;;;;;:99887776~6}5z5x4u3t2p2q<tP"nQ!eR"gU"l\#rc$xi%{n%u&x&x&z&|&|& $1+<,<->->-?->-=-=$)JFSL[Ua[g`mfohrkhc$$ #3DF]>R/<0?AN59),)+''&#$!"" %$'&&$ h3#*6'-0$*4&(6'%7)$9+#:,#<.#E:(wq5<=<;887Ⱦ6ĺ44310/-,e%I@?=<<<<===<=<;:::9877778:;;==??FT!Y!_"`!`_`ch!p#u%x%w%v%   $(*"/#1%2"* B?LGQKVQ\W_Za\c]\X** 5H@XF_IbJdHcE_CWDWG^H_F[BV>P8J0?+7+5)3"+"&!Gd8+M0,3%(2%&6'$7)#9+"<0$E:(TM.oj4:;:97ǽ6Ĺ43210.--+k'J@>=<<<<;7677:>BDCEILPSW Y"\"]#^#^#\#]#]#]#Z"W!SMD7'#~1x>oBlNoZth!y 41D?MHQLVQZT\V^WWQ00)9:O@V@V=MNTcc}uyrUXBO>R>R;O6H,;%2%2&3*6 >9HD<;T2;G'k<*@*'3$$3("9+"B6'g`079987ǽ6ź5³320/...-,}+X"B=??@ACKd&s-4Š7ʖ?ϞA՗=q,h'j'j(j(j(i'i'h'h'g'g&g'f&e%d$c%b$`#Z RJ;* %2{;k2Z)N$ C# kr2.HCKFOJRMTNUOSM<:$3FFAIDJELGNHNHC? 0@/CMPzq:C1B(6   <7F=F=G=0(ns:#H&X0f6xd3th2~r23478ø7ö5ó422.ʄ#XFC > = < ; Oj$n'n'o'o(q)t*t*v,6EI8}/}.}.}/|/|/|.{.z-y-x-w-u,s*s*q)o)m(m(i&[G;4 1 / *8?r7`.R(A T\" <7?:BD>D@E@=9(71=z~OM*9'    -)=6D:E;E=A-_B J(j7<::98765432π#OC E GGGFEE\o%w)y*|+},--/0/2212222100~/}/{/y-x-v,v,w+v+v+v*r)` N: 6 5 2 / *<Au8c/T)B 4   4 4083;6=8>9=8>994! ,AF{hb+2 2,<4=5D:82L*0D P+t9<:87655320WC JMLLLLMMYp$./000112333333332߅2߃1߂2ހ00}/|.y.w,q*l)h&d%e&g#a[VKD;1 ?Bv6b,S& B b!yz  j '$.*/,2/40526151622.   !!z}xphm0*8191<4>5-(vO*+<~D"g1:9764321ԁ+XNSUTUUTTSUx&/12233344ߍ4݋3ۈ2ׂ0}/x,p)i(a%Y!TRNKGCA>::;Lo(+++*)(&{&u$i!xP`9C  4sm ?A%"&#($*',).*/+/,0,/,0,/,+(+(%" nf~~wwHC@ +'0*1+2,5-91-%dh&x-r,zH#~7:6432/z+XRVTSSSRRRVh+1څ/}-w*q)h%b$]"UPKEA?=::;9::98433369>["z((((()))))*)u$ N o ,|!|# %"'#($)%*&*&)&*'*&*&*'*(%#SMpjx|}|xwmf1B )$*&+&,&,%y/(w0+}1=]o!p p/zL"v3742/u+RN[t| !܄"ۇ$؉&ς&h#RNLHDA@?>>>>>>:64302777872.& }! }$ +,~1Qy(''(())(()((::lr!s#v$!y%"{%"}&"&#&#&"%#%"&"%"'%?;FBf_mdohlf]W(&\>} pq}# $!{$!x&!v)$y+%z+&u.'v,&uH1&Mgop) yJ!u372n*X}%ŝ1ë5Ƭ5Ȯ4ɬ4ɬ3ƪ3ĥ2._#FGECBB@?>=<;:50* "~ }% ~( ) 00/~-z% vtuuus! }Ir''&'''()))((F]on o" r# u$!x$!y%!}%#%"%"%"$"$!%"($ d' $0ywuvvwxxwvuq djrr q n l!g!c#g&!k("m*$kgrQ07H]o) zI _(}2697443§2ç1001z+M?:758;:::953/+|% yxvvutt u" t! s r pnnoonns6b"y&{&}&'''''(x PNlij m!o" r# u$!w$!z$!|$!~#!# # #  uC&% ekkmnlmnjee]Wbc`]YW_b a!b"a aa}}d'.Ls0<;7764321101x+J/ ' &$~#) * -20~/{-y' u srqoonnllkkjihihhhggh$ tMq%x$y%{&}&~&&&i~ [ Ahdfh!k!m!o"s#!v$!x# z" |"" xyJ'#Xdcdgfecca`\W^]\[URSZ]a \Zjj r u|zeB}r5<:8653200/0y*A~&}$|#z"x wutu" t# r q omlkjjihhgffeedcccbbcccbj<y_ q#t#v$y$z${$Yz !a3c`acf i j!m!o!r!t!v!y!|{ ruvM)"Ha^`cc^[YZ[SQTQOPVXYYY\\b o$ m$ mjdtxusqPHC09974210..-,u(Eu% rrr pnnlkjhggfeddcccbbaa__^]]\\]]]]\^" lL{k"}n!{n!{p"|r#Nu{f,_]]_beg j km qr vtl omsN*!;ZY[ZYXXYYZPOTPMMPSXXUTQb!q$ t$ y#whpwtqkm\=:1}47621.-,+*)+d$vCl$ ijigfecbbbaaa__^^]\\[ZZZZYYXXXYXYXZ eFsb xhwi wj!Cqv~}i!MYXY]`cdgjoomfkv||~goP-!/[XXWVUUUUSGEILOOQQSUTVVd!q!r"v!vhmtrtwvwmHLJ,rn-31-+*)({'y&x&s&|b"mAcaa__^]\\[[ZYYXXXXWWVVUUUUUUUUUVWVV^4n\ sbsc5lox{{j2QQRTW[^add]bksvxxzdmP-%VQQSUUVTRQGEHJJMNNMLLORi#!v!s u vkputuwzwura-! NLmj'{w)|*y(|u%|t%|q$|o#|l"{k#yh#nQ]& XXXWWWVWWWVVVVUUUUUUUTTTTTTTTSTTST^;mZp_#gjszzvn"$EJKMPTWZZXmn h g i h _ aXx _ ; #NNPPRRQOLGD AHIIJJJKMMMQk!qlrpfx{xspn086a] to$wq%wn$si#pf!ob o_o_ kX^<SRSSSSSTUUUUUUUUTTSSRRQQPPPPSRTVWZ^" b6[fltzzso" 8GGJJNPTb}ojjidV `co!!u` F 7 '?DFHHJKJJGD >ECEEEDBDHIMj ooqq fu}zurpg 31GD[Vg^ k`!l`!l^ k[jYaGV*QNNOPPQQRSTRRSTUUVVXZ[[]]^_`ababba]dkqw{~~ykq.&@CEFJ Xj{!{ zusm`zum!xcL 9 )>HJMKLIBDEC?-:A?>>@AA>Iihmst n~~}|yrp[ &" -)D;K>D6<.:R![# ]'`2]$\\^abbabbcccccccbbabbbcaaaaa6aaglquvxyxwttlgM! 3@@ L\kw#! }ylu~"vbM 9 *>UVWYYYQSTRI .::87::5Nihioqp~{{zyytqQ ""!7 ^,h.h-e% deeedfgeddcdcccbbbbbbaabaaba LZ]cgjmnoonljib]/& BO\fq &#""!|t |"tbN : +?b\Y\ZZ\]\ZK" ,46 2**Ohjotiq{}}|zxtqqB  $!3H$])b#bdfghffgggedccbbaaa`````a```RUY]abefffdb`] VI"KXbmx  } !qcN : , 9dafhgghkh]D * +#+Rbhjk fqux|}yuml5"# "6F$R bdeghhhhhgdccca``a`aa``__^^'QPTW[\^_^][ZT MR'$O]hq~  obP : - 2fequtmkljfL 0T[_agmqruuwvsokd  #""#+P!f! e g! i" j# k! ihgghffeccbbab``____:LLORUVWWVVTKNU :&Ubmx nbQ ; .  1yutpj D6PV[_ec`fhpqplgfA$###,Y*l.l-m.n.n/n+k& j# iiihfeedbbaa_]]_^AGIKNPPRQRQMIOK.Zhs~ o`Q < /  /s)7KHCBGFDM`ihfdbX !#"#"0[.l3n3n3o3p3o1n0j)f" ecb`_^]\[[[\[[ZBAEGIKKLMMLKJ F Fbl q&$,)"l_Q > / "  +J4136:<>?BR`a`][2  $%&$,E(`2m6k5m6k5j5i4g2d.`% \[YYYZ$ Y$ WWVVWW/A@CEGGHIKJJKN[dg!}$!%#'$*&*',((% zZS @ 1 # ! (s$.+.24689<>ENWVQ(* (H(V-Z.^/_0`0`0`/]-Y$ VV V U V$ W(V& S QONM( ./7=BDB<@JOX_ at# %"&$)&*',(-)+'  rN@ 2 $" " ( |xH '&)+-/13445COQ4)-$       ( .258 ;!;#:$9%<%<$=%@%@%DA4!4 2 1000 ' & ' * - / . )6MSY Zm!{$!'$)%+',)-)-*,' m E 1+%# ;2/301-/,.**'(%&$ 7   "$&))*,29<?FD  "      "/<>EILOSSVY[]_ _!ce[IE$C#@!6) & % & ( ) * +2;G Vdt# '$)%+',(-).*/*,( v]G9(&!2/0,/,/+1.2.3/2.5   ""%,37=@??(                    &7 :AHJMQSTWWZ[]_ d h_?/( "    $ # % & '*17 F_iw# (%*&+',),)-).+,( ~tbO=* 2/,1-1-1,1-2-3/3//, 2   '2466797                       ! ( 9 >EIKNQRVWZ\`ae\J 8 0 / ) !    " # $ $)38Lcl!{$!(%*',)-).*.*+')%taQ=',|&#,(3/3/3/403/3//+ .    !$')()                         ! # & -.:JJQXZZZ\[LC; 0 -14 5 2 8KW   " "(39 H`p"&"(%#! qSOg !0-3/3.2.1--) +                                      " % '(+2 L Z4lVscxdsS Y*: / * * + . / 0 19W1L T   (3:BVhv{ zwz   /+1-0,1-)&"                                 " $ &'*, 8 ^Onif^UHI8 2 ' % ' ( * , / 23 P#u> dƴ    )2:BJT]dnty} ##" .*/+0-%#!!                             ! " # & (* ,O:ifXN )  ! " % ' +. 3(60:8?A@Dvrʼ  $+29AJR[dmrvz|    %"/+0,%"!                          ! # $ & (), F3@2 ! # # # $.$2333347979('t{ƿ '*19AIRZbjpswy}    )                     ! # $ &() , (     +$/1//0125++ x+')08?GOY`hlpsv t| zvuu                     " # # # !        #%    |&)07?FNV^filp qze`bdffmf$                           !                   ).6=DLS[bgkg_]VRTVWXZ^{|vf                                     !$&%%   " &+4;BJQXbf[OFDDFGGIJLN[ptvwxyyzz{|}}zxignW             "#               'Ͻ % $/8@GPW[MI A89:;<==?ABBRbbefghiijkklmnnoomcZa^_Q            !(#)#*#(#+%+&,&*%           1!}ƢҺ +9>;@@ > ><=@=20012345679:>FTVVWWXYZZ[[\\\]YOSTPMLA!          !#'!*#0*7"09#17"/8$1.$      5*{zs@6V˕4:?8, + / 0 2 / .*'&'&&())*)++/3>HIIJJJKLKLMMMNHEIHEC@?< %            ( 4,<$3>%4>%5<%4-!(     " ' @ `1j!x$*) 4#"!/8A 9 8 : AEEDD ENMPSRLEDCAA@>;;;;;<;:86 68:8543 ,               "2*6 -9"0=%4=$4=%49"17 -0))%   - BDMbv&)(  )gsvXVY'h%-s&.u'/w)2x#)||x |uojc_[TH9 . +$!                    ,$3,6-7 .:"16 -0'2)5,6!.5". ". ??K`r$&t.cklQPS%c#+l%,o%-q(0s$)y  }p D DB.                   (#3+4-5-7 .7!/1' ! # $   ! 1@=J[`_ UD ,cnpTS Y#+l)2w+5{.70919"% x [D JM9                          *"6 .1).%/'3)6!.1)!   !   % ?B 6 2,$"#%KJB 3 3 5<AHP U#Ucv|  `PM PO8                           "!  #,%+#(!(   0 B@ 5&()(+)*)+(*' !"##$#"$'*.131/36421, 2 4:@5  $#%#%#!                 /?<;0%*&+$,(*'+)"                        *)*(+'+&                      - &A08@07(  -=<8   *" ' & '( &(+*)&              !!" &                           ) %-$)1'-7,1I9AK;DJ9BG9?&  .< #            $)*+))'*((*'-0/.                          -$)3).6+18,2>17H9AG7?E7>F8?2$,  "                  !            $#5+05+06,29.3F8?F7>E7>A4;                     !#       %#0$+0!(.%:(1D7>?3:$                 !!" # # "    !!"#!    # !              !!!!""#"#"$"$"$!$!%"$ "     !"$""%"(#(#$         %& %!&"     !%#"                    $ % '       !            '  &!        " %"! '#                   " #!'#                                                     !   *&(&'%"                   $/(*-9+T9KcFZaCWT9KM3DD-<-"&$                      #0**)6+S8IaFY_BUW;LQ5HL3D6)-,+'') ' ' ( ( & & # &!          " # $ % # )1*            !!!!!!!!!!!!!!!!!!!!!""""""""""""""""""!!!!!!!!!!!!!!!  !!!!!!!!!!!!!!!!!!!!!""""""""""""""""""###########################$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&'''''''''''''''''''''((((((((((((((((((((()))))))))))))))))))))***************)))))))))))))))(((((('''''''''&&&&&&%%%%%%$$$$$$$$$######### !!!!!!!!!""""""""""""############$$$$$$$$$$$$$$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&''''''''''''''''''''''''(((((((((((((((((()))))))))))))))))))))******************++++++++++++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,------------------------------------.................................////////////////////////000000000000000000111111111111111111111222222222222111111111111000000000//////......------,,,,,,++++++*********)))$$$$$$$$$%%%%%%%%%&&&&&&&&&''''''((((((((())))))******)))************++++++++++++++++++------------------------------------......---------------.........///.....................//////////////////000111111111111111000111111111111111111222333333333333333333333333333333444444444444444444444444444444444555555555444444444555555555555555666555555555666666666666666777777777777777777666666777777888888888888888888999999888888888888888888888888888888777666666555555444444333333222111111111000000///***+++++++++,,,,,,------.........//////000000000000000////////////000000111111111111111222222333333444555555555555555555555444333333333333333444444444444444333444444444444333333333222222333444555666777777777888888777666555555666666777888888999:::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::999999::::::999999999999999;;;;;;;;;;;;;;;::::::::::::;;;<<<<<<======>>>===<<<<<<;;;;;;;;;<<<<<<===????????????>>>=========;;;;;;;;;;;;;;;<<<===<<<======<<<<<<;;;;;;:::999999888888777777666666555555111111111222222333333444444555555666666777666666444444222111222222222333444444333444555555777888999:::;;;<<<<<<<<<<<<<<<;;;;;;999777666666666777888888888777666666666555555555444444444444444555888:::<<<===>>>===<<<;;;999888777777777888:::<<<>>>@@@AAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBAAA@@@>>>===<<<<<<;;;<<<<<<;;;;;;::::::<<<<<<===>>>>>>===<<<<<<<<<<<<>>>@@@AAABBBBBBBBBAAA???>>>=========>>>???AAABBBCCCCCCCCCBBB@@@>>>===<<<;;;;;;;;;;;;<<<===>>>@@@@@@@@@AAA@@@??????>>>======<<<;;;;;;;;;::::::999666666777777888888999999::::::;;;<<<<<<<<<;;;:::(((  ///999;;;>>>???AAAAAABBBBBBAAA@@@>>>+++ $$$888999--- >>>AAABBBAAA666 222BBBDDDEEEFFFFFFFFFFFFFFFFFFFFFGGGGGGFFFDDDCCC777+++999!!!$$$222>>>999***@@@CCCEEEEEEDDDBBB333111DDDFFFFFFFFFDDDAAA>>>111000<<<>>>AAABBBCCCCCCCCCBBBAAAAAA@@@@@@???>>>>>>=========:::;;;;;;<<<<<<======>>>>>>???@@@@@@AAA@@@???111nnnyyy|||BBBnnnPPP...>>>AAADDDEEEFFFGGGEEECCC444qqq~~~:::---"""lllUUUTTTTTTTTT___&&&333CCCDDDCCC\\\yyy{{{~~~|||CCCGGGIIIJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIFFF:::TTTVVVXXXZZZ...LLLUUUVVVYYY\\\GGG$$$WWWVVVVVVYYY===!!!BBBEEEEEEDDD555RRRUUUZZZ___ccc222222FFFGGGEEEBBB)))RRR}}}\\\$$$ ###>>>AAADDDEEEEEEDDDDDDCCCBBBBBBAAAAAA@@@@@@??????>>>>>>??????@@@@@@AAAAAABBBCCCCCCDDDDDDDDDAAA===...zzz@@@DDDGGGJJJJJJIIIEEE000(((<<<OOOZZZ###DDDEEEDDDdddCCCHHHKKKMMMMMMMMMMMMMMMMMMMMMMMMMMMKKKGGG111)))^^^===AAABBB@@@PPP~~~EEEEEEBBBwww222:::CCCEEEFFFFFFEEEDDDDDDCCCCCCBBBBBBAAAAAAAAA@@@@@@AAAAAABBBCCCCCCDDDDDDEEEFFFFFFGGGEEECCC===HHHLLLBBBFFFJJJKKKJJJFFF000(((%%% ggg EEEFFFDDDOOOBBBHHHLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNKKKGGG111)))cccppp222000 @@@,,,CCCBBBfffBBBEEEFFFFFFFFFEEEDDDDDDCCCCCCBBBBBBBBBAAAAAABBBBBBCCCCCCDDDEEEEEEFFFGGGGGGHHHHHHGGGCCC>>>bbb@@@DDDJJJLLLKKKGGG000((( iiiEEEGGGDDDOOOAAAHHHMMMOOOOOOOOOOOOOOOOOOOOOOOOOOOLLLGGG000(((eee+++###dddaaa^^^""" >>>???!!!@@@DDDFFFFFFFFFEEEDDDDDDCCCCCCCCCBBBBBBBBBBBBBBBCCCDDDDDDEEEEEEFFFGGGGGGHHHHHHIIIGGGDDD>>>eee222GGGKKKJJJFFF///((( ===555///EEEGGGDDDPPP555000GGGLLLOOOOOOOOOOOOOOOOOOOOOOOONNNKKKFFF...)))ggg999 FFF777<<<777 >>>CCCFFFFFFEEEEEEDDDDDDCCCCCCBBBBBBBBBAAABBBCCCCCCDDDDDDEEEFFFFFFGGGGGGHHHHHHIIIGGGDDD>>>gggDDDIIIJJJFFF///)))ggg 666000FFFGGGDDDQQQ555///FFFKKKNNNOOOOOOOOOOOOOOOOOOOOONNNKKKEEE"""HHHiiiuuuvvv===$$$EEEqqq(((---;;;SSSgggfff===BBBEEEEEEEEEDDDCCCCCCBBBBBBBBBAAAAAAAAABBBBBBCCCCCCDDDEEEEEEFFFFFFGGGGGGHHHHHHGGGDDD>>>{{{hhh999GGGIIIGGG000***444 666222GGGHHHDDDQQQ666...DDDIIIKKKLLLKKKKKKKKKKKKLLLLLLLLLIIIDDDRRRjjj999BBB=== :::666 ''' &&&444555===AAADDDDDDDDDCCCCCCBBBBBBAAAAAA@@@@@@@@@AAABBBBBBCCCDDDDDDEEEEEEFFFFFFGGGGGGHHHFFFDDD>>>|||jjjQQQ'''EEEHHHFFF000+++ ((((((888HHHGGGCCCRRR666+++@@@DDDEEEEEEEEEEEEEEEFFFGGGHHHIIIGGGBBBSSSlll<<>> ~~~kkk(((MMMCCCGGGFFF>>>  )))GGGIIIGGGCCCSSS666(((+++---......---......///111@@@EEEEEEAAAUUUmmm???CCCFFFGGGGGGHHHIIIIIIGGGCCC333^^^XXX555:::uuuDDD :::???AAABBBAAAAAA@@@@@@?????????>>>>>>>>>@@@AAAAAABBBBBBCCCCCCDDDEEEEEEEEEFFFFFFFFFBBB=== lll###```BBBFFFGGGCCC EEEDDD666:::===>>>???@@@AAABBBEEEGGGIIIIIIGGGAAATTT666333111///...///000111333555 ///BBB???VVVnnn@@@EEEIIIJJJJJJJJJJJJJJJHHHEEE>>> ^^^999999/// 999===AAAAAA@@@@@@??????>>>>>>============???@@@@@@AAABBBBBBCCCCCCDDDDDDEEEEEEFFFEEEBBB<<< mmm+++___AAAFFFGGGEEE>>>...<<<@@@BBBDDDDDDEEEFFFGGGHHHIIIHHHEEE@@@TTT666jjj>>><<<WWWooo???EEEHHHIIIIIIIIIIIIIIIHHHDDD???"""GGG***,,,;;;:::000 999===?????????>>>>>>======<<<<<<<<<<<<;;;??????@@@@@@AAAAAABBBCCCCCCCCCDDDDDDEEEDDDAAA;;; mmm%%%@@@DDDFFFEEE@@@&&&$$$|||;;;AAADDDFFFGGGHHHHHHHHHHHHIIIHHHDDD???UUU777iii;;;:::XXXppp>>>DDDGGGHHHHHHHHHHHHHHHGGGEEEAAA555 ZZZ 999<<<:::/// 999===>>>>>>======<<<<<<;;;;;;;;;;;;::::::>>>>>>???@@@@@@AAAAAABBBBBBCCCCCCCCCDDDCCC@@@::: nnnQQQddd @@@DDDGGGFFFBBB===VVV888!!!>>>CCCEEEGGGGGGGGGGGGGGGGGGFFFCCC===VVV777jjj 888888YYYqqq===BBBEEEFFFFFFFFFFFFFFFFFFDDDAAA<<<QQQUUU ;;;===;;; FFF :::<<<======<<<;;;;;;:::::::::999999999888===>>>>>>??????@@@@@@AAAAAABBBBBBCCCCCCBBB???999 bbb222???CCCEEEEEECCC???777 777???CCCEEEFFFFFFFFFFFFFFFEEEBBB<<<WWW888mmm 666777ZZZrrr<<>>??????@@@@@@AAAAAAAAABBBBBBAAA>>>888 888 ;;;@@@CCCEEEEEECCCAAA===''' ddd:::???BBBCCCDDDDDDDDDDDDCCC???::: 999ppp 555555gggsss:::???BBBCCCCCCCCCCCCCCCCCCCCCAAA>>>::: ~~~888===???<<>>>>>??????@@@@@@AAAAAAAAA@@@===888 999,,,###;;;@@@BBBCCCCCCBBBAAA>>>:::'''***;;;@@@BBBCCCCCCCCCCCCBBB>>>999 999rrr 555444 ttt999>>>AAABBBBBBBBBBBBBBBBBBBBBAAA>>>;;;MMM333 III"""999===>>><<<888|||RRR555555:::&&&666:::;;;:::999999888777777666666555555555444;;;<<<<<<======>>>>>>?????????@@@@@@@@@@@@<<<777 999uuu777<<<@@@AAABBBBBBBBBAAA???<<<777NNN666;;;???@@@AAAAAAAAA@@@<<<777 ::: 666444 uuu888===@@@AAAAAAAAAAAAAAAAAAAAA???>>><<<888 bbb444:::===>>>===999))) :::%%%555999:::999888888777666666555555444444444333;;;;;;<<<<<<======>>>>>>>>>?????????@@@>>>;;;666 :::---888===@@@AAAAAAAAAAAAAAA@@@===:::555uuu:::!!!888<<<>>>@@@@@@@@@???;;;666 ;;;;;;tttttttttttttttuuuuuuuuuuuuIII$$$777444 vvv888<<>><<<999111 666;;;>>>>>>===;;;777(((;;;%%%555888999999888777666666555555444333333333222:::;;;;;;<<<<<<=========>>>>>>>>>??????>>>:::555 ;;;222888===???@@@@@@@@@@@@@@@???>>>;;;888+++ 444999===>>>??????>>>:::555 &&&999888555 www888<<<>>>???????????????????????????===:::$$$@@@KKK"""888<<<>>>???>>>===:::666SSS<<<%%%555888999888777777666555555444333333222222111::::::;;;;;;<<<<<<=========>>>>>>>>>>>>>>>:::555;;;<<<%%%888<<>>>>>======;;;999555 ZZZ666;;;===??????>>>:::555 ...222444555555555555555666888:::::::::777 www999===?????????????????????>>>>>>>>>===:::333 111999<<<>>>>>>>>>===;;;999555+++---)))666777888888777666555555444333333222111111000:::::::::;;;;;;<<<<<<=========>>>>>>>>><<<999444<<<xxx888<<>>>>>===;;;999999777666444000)))...777;;;===>>>===999444 ...222555555555555555555666777999:::999777jjj999<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>===;;;888eee[[[777;;;===>>>>>>>>>>>>===;;;999555ZZZ<<<444777888888777777666555444444333222222111000000999::::::;;;;;;<<<<<<<<<=========>>>>>><<<999333<<<qqqyyy666;;;======<<<;;;999777555444222%%%$$$"""&&&FFFyyy555999<<<>>>===999444 ---000222333222222222333444555777999999999((( 777;;;===>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<:::555 777:::<<<===>>>>>>>>>>>>>>>===<<<999777444 <<<<<<...%%%555666777999888777666666555444333222222111000000///999::::::;;;;;;;;;<<<<<<===============<<<999333=== zzz777;;;======;;;999555666888rrr'''777;;;===<<<999444 888999999888777666666777999;;;<<<===>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>===<<<:::999777777777999:::<<<===>>>>>>>>>>>>>>>>>>>>>===<<<;;;999777444000%%%%%%)))222333555666777888888888888777666555444444333222111111000//////999999::::::;;;;;;<<<<<<<<<============;;;777222===ggglll777;;;===<<<999%%%???--- 444999<<<<<<999444 666888:::::::::999999:::;;;<<<<<<=======================================<<<;;;;;;:::::::::;;;;;;<<<==============================<<<;;;:::999888777777666777888888999888888999888777666666555444333222222111000000///...999999:::::::::;;;;;;<<<<<<<<<<<<======;;;777222>>>vvv///)))777;;;<<<;;;777&&&111>>>555999:::777222>>>'''888;;;<<<<<<<<<<<<<<<<<<======================================================<<<<<<<<<=============================================<<<;;;::::::::::::999::::::::::::999888888777666555444444333222111000000//////...888999999:::::::::;;;;;;;;;<<<<<<<<<<<<:::666000mmmwww444888;;;<<<:::666aaa --- 222777999777222>>>%%%666:::mmm<<>>???%%%444444111~~~???$$$555888kkk::::::::::::FFF:::::::::kkk:::::::::xxxEEE999999999999999999999999999999999999www999888]]]888777777777666555555444333333222111000//////......------,,,,,,555555555666666666777777777888888888888666555$$$888 333666888:::::::::888555rrrppp444444222 @@@$$$444666jjj888]]]888888888DDD888888888888jjj888888888888888888888888888888888777777777777777777DDD777777777\\\666666555555444333333222111000000///......---,,,,,,,,,++++++333333333444444555555555666666666666777666444***000PPP```+++222444666777888888888666444"""LLL### 000(((333333222kkkPPP111444666]]]666666666666666\\\CCC666OOO666666uuu666666666666666666666666666666666666666hhh555555555555BBBMMM333222222111000//////...------,,,,,,++++++******)))111111222222222333333333444444444444555444333222  +++///111333555555666666666666555333222 +++/// 222333444333000 ''' """111333444555555444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444333333333333333333333333222222222111111000000///...------,,,,,,+++******)))))))))((((((//////000000000111111111111222222222333333222111000...---,,,,,,,,,---....../////////000111111222333444444444444444444333333222000...---,,,,,,,,,,,,,,,,,,,,,------...000000000///...---------...///000222333333111000///------,,,,,,,,,------------,,,++++++*********++++++---...000111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111111111111111111111111111111111111000000000000000//////......------,,,++++++***))))))(((((('''''''''&&&&&&---------.........////////////000000000111000000/////////............///000000///000000000111111222222222222222222222222111111000/////////................../////////000000/////////............//////000000000000000//////.........------......------,,,,,,,,,,,,,,,,,,,,,---...//////000000000000000000000000000000000000000000000000000000000000000000000000000000////////////////////////////////////////////////........................---------,,,,,,++++++***))))))(((''''''&&&&&&&&&%%%%%%%%%$$$$$$***++++++++++++,,,,,,,,,---------............///............/////////////////////000000000000000000000000000000000000000000000000///////////////////////////............//////...................../////////............---------------------------------------------------------...---------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++++******)))))))))(((''''''&&&&&&%%%%%%$$$$$$#########"""""""""((((((((()))))))))************+++++++++,,,,,,,,,,,,,,,------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************************************************************************************))))))))))))))))))))))))))))))))))))))))))))))))((((((((((((((((((((('''''''''&&&&&&%%%%%%$$$######"""""""""!!!!!! &&&&&&&&&&&&&&&''''''''''''((((((((())))))))))))*********************************************************************************************************************)))))))))))))))))))))))))))))))))))))))))))))((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$######"""!!!!!! ######$$$$$$$$$$$$$$$%%%%%%%%%%%%&&&&&&&&&&&&''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$###########################""""""""""""!!!!!!!!! !!!!!!""""""""""""""""""###############$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$########################################################################"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  !!!!!!!!!!!!!!!!!!"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!        bzflag-2.4.2+ds1/package/win32/nsis/uninstall.ico000066400000000000000000000111471200563112200214610ustar00rootroot00000000000000 F h (>( @ʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www         $G  #G&#  $$$$#%#  $$$$"G$#G $#$FG G" $#GGGGFFF t $GG$"D s G  sEs                ?( @xwxwwxwwwxwwwwxwwwwwxwwwwwwxwwwwwwxwxwwxwx x xwxwxwwxwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww?( @ʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www     #&  $$"G#G #GGF  G        ( wwwwwwqwwqqwwwwwwwwwwwwwwww bzflag-2.4.2+ds1/plugins/000077500000000000000000000000001200563112200151205ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/HoldTheFlag/000077500000000000000000000000001200563112200172415ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/HoldTheFlag/CHANGELOG.txt000066400000000000000000000005021200563112200212660ustar00rootroot000000000000001.00.02 (2006-03-13) *) Default CTF team to green if not specified on command-line *) Fix tie-break logic in scoring *) add configration and version display to /htf stats *) add flag reset on capture (for multiple team flags) 1.00.01 (2005-10-16): *) fix callsigns when plugin is loaded while players are on. bzflag-2.4.2+ds1/plugins/HoldTheFlag/HoldTheFlag.cpp000066400000000000000000000246001200563112200220700ustar00rootroot00000000000000// HoldTheFlag.cpp : bzfs plugin for Hold-The-flag game mode // // $Id: HoldTheFlag.cpp 22309 2011-12-22 21:10:39Z mudskipper $ #include "bzfsAPI.h" #include #include #include #define HOLDTHEFLAG_VER "1.00.02" #define DO_FLAG_RESET 1 #define DEFAULT_TEAM eGreenTeam #define MAX_PLAYERID 255 typedef struct { bool isValid; int score; char callsign[22]; double joinTime; int capNum; } HtfPlayer; HtfPlayer Players[MAX_PLAYERID+1]; std::map leftDuringMatch; bool matchActive = false; bool htfEnabled = true; bz_eTeamType htfTeam = eNoTeam; int nextCapNum = 0; int NumPlayers=0; int Leader; class HTFscore : public bz_Plugin, public bz_CustomSlashCommandHandler { public: virtual const char* Name() {return "Hold the Flag";} virtual void Init ( const char* config ); virtual void Cleanup ( void ); virtual void Event ( bz_EventData *eventData ); virtual bool SlashCommand ( int playerID, bz_ApiString, bz_ApiString, bz_APIStringList*); bz_eTeamType colorNameToDef (const char *color); const char *colorDefToName (bz_eTeamType team); protected: private: }; BZ_PLUGIN(HTFscore) HTFscore *htfScore = NULL; bz_eTeamType HTFscore::colorNameToDef (const char *color) { if (!strcasecmp (color, "green")) return eGreenTeam; if (!strcasecmp (color, "red")) return eRedTeam; if (!strcasecmp (color, "purple")) return ePurpleTeam; if (!strcasecmp (color, "blue")) return eBlueTeam; if (!strcasecmp (color, "rogue")) return eRogueTeam; if (!strcasecmp (color, "observer")) return eObservers; return eNoTeam; } const char *HTFscore::colorDefToName (bz_eTeamType team) { switch (team){ case eGreenTeam: return ("Green"); case eBlueTeam: return ("Blue"); case eRedTeam: return ("Red"); case ePurpleTeam: return ("Purple"); case eObservers: return ("Observer"); case eRogueTeam: return ("Rogue"); case eRabbitTeam: return ("Rabbit"); case eHunterTeam: return ("Hunters"); case eAdministrators: return ("Administrators"); default: return ("No Team"); } } bool listAdd (int playerID, const char *callsign) { if (playerID>MAX_PLAYERID || playerID<0) return false; Players[playerID].score = 0; Players[playerID].isValid = true; Players[playerID].capNum = -1; strncpy (Players[playerID].callsign, callsign, 20); ++NumPlayers; return true; } bool listDel (int playerID){ if (playerID>MAX_PLAYERID || playerID<0 || !Players[playerID].isValid) return false; Players[playerID].isValid = false; --NumPlayers; return true; } int sort_compare (const void *_p1, const void *_p2){ int p1 = *(int *)_p1; int p2 = *(int *)_p2; if (Players[p1].score != Players[p2].score) return Players[p2].score - Players[p1].score; return Players[p2].capNum - Players[p1].capNum; return 0; } void dispScores (int who) { int sortList[MAX_PLAYERID+1]; // do HtfPlayer * !! int playerLastCapped = -1; int lastCapnum = -1; int x = 0; if (!htfEnabled) return; bz_sendTextMessage(BZ_SERVER, who, "**** HTF Scoreboard ****"); Leader = -1; if (NumPlayers<1) return; for (int i=0; i lastCapnum){ playerLastCapped = i; lastCapnum = Players[i].capNum; } sortList[x++] = i; } } qsort (sortList, NumPlayers, sizeof(int), sort_compare); if (x != NumPlayers) bz_debugMessage(1, "++++++++++++++++++++++++ HTF INTERNAL ERROR: player count mismatch!"); for (int i=0; i= 0) bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "%s is the WINNER !", Players[Leader].callsign); } matchActive = false; // TODO: clear leftDuringMatch } void sendHelp (int who) { bz_sendTextMessage(BZ_SERVER, who, "HTF commands: reset, off, on, stats"); } /************************** (SUB)COMMAND Implementations ... **************************/ void htfStats (int who) { bz_sendTextMessagef(BZ_SERVER, who, "HTF plugin version %s", HOLDTHEFLAG_VER); bz_sendTextMessagef(BZ_SERVER, who, " Team: %s", htfScore->colorDefToName(htfTeam)); bz_sendTextMessagef(BZ_SERVER, who, " Flag Reset: %s" , DO_FLAG_RESET ? "ENabled":"DISabled"); } void htfReset (int who) { resetScores(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "*** HTF scores reset by %s", Players[who].callsign); } void htfEnable (bool onoff, int who) { char msg[255]; if (onoff == htfEnabled){ bz_sendTextMessage(BZ_SERVER, who, "HTF mode is already that way."); return; } htfEnabled = onoff; sprintf (msg, "*** HTF mode %s by %s", onoff?"ENabled":"DISabled", Players[who].callsign); bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, msg); } // handle events void HTFscore::Event ( bz_EventData *eventData ) { // player JOIN if (eventData->eventType == bz_ePlayerJoinEvent) { char msg[255]; bz_PlayerJoinPartEventData_V1 *joinData = (bz_PlayerJoinPartEventData_V1*)eventData; bz_debugMessagef(3, "++++++ HTFscore: Player JOINED (ID:%d, TEAM:%d, CALLSIGN:%s)", joinData->playerID, joinData->record->team, joinData->record->callsign.c_str()); fflush (stdout); if (htfTeam!=eNoTeam && joinData->record->team!=htfTeam && joinData->record->team != eObservers){ sprintf (msg, "HTF mode enabled, you must join the %s team to play", htfScore->colorDefToName(htfTeam)); bz_kickUser (joinData->playerID, msg, true); return; } if (joinData->record->team == htfTeam) listAdd (joinData->playerID, joinData->record->callsign.c_str()); // player PART } else if (eventData->eventType == bz_ePlayerPartEvent) { bz_PlayerJoinPartEventData_V1 *joinData = (bz_PlayerJoinPartEventData_V1*)eventData; bz_debugMessagef(3, "++++++ HTFscore: Player PARTED (ID:%d, TEAM:%d, CALLSIGN:%s)", joinData->playerID, joinData->record->team, joinData->record->callsign.c_str()); fflush (stdout); if (joinData->record->team== htfTeam) listDel (joinData->playerID); // flag CAPTURE } else if (eventData->eventType == bz_eCaptureEvent) { bz_CTFCaptureEventData_V1 *capData = (bz_CTFCaptureEventData_V1*)eventData; htfCapture (capData->playerCapping); // game START } else if (eventData->eventType == bz_eGameStartEvent) { bz_GameStartEndEventData_V1 *msgData = (bz_GameStartEndEventData_V1*)eventData; bz_debugMessagef(2, "++++++ HTFscore: Game START (%f, %f)", msgData->eventTime, msgData->duration); fflush (stdout); htfStartGame (); // game END } else if (eventData->eventType == bz_eGameEndEvent) { bz_GameStartEndEventData_V1 *msgData = (bz_GameStartEndEventData_V1*)eventData; bz_debugMessagef(2, "++++++ HTFscore: Game END (%f, %f)", msgData->eventTime, msgData->duration); fflush (stdout); htfEndGame (); } } bool checkPerms (int playerID, const char *htfCmd, const char *permName) { if (bz_hasPerm (playerID, permName)) return true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "you need \"%s\" permission to do /htf %s", permName, htfCmd); return false; } // handle /htf command bool HTFscore::SlashCommand ( int playerID, bz_ApiString cmd, bz_ApiString, bz_APIStringList* cmdParams ) { char subCmd[6]; if (strcasecmp (cmd.c_str(), "htf")) // is it for me ? return false; if (cmdParams->get(0).c_str()[0] == '\0'){ dispScores (playerID); return true; } strncpy (subCmd, cmdParams->get(0).c_str(), 5); subCmd[4] = '\0'; if (strcasecmp (subCmd, "rese") == 0){ if (checkPerms (playerID, "reset", "COUNTDOWN")) htfReset (playerID); } else if (strcasecmp (subCmd, "off") == 0){ if (checkPerms (playerID, "off", "HTFONOFF")) htfEnable (false, playerID); } else if (strcasecmp (subCmd, "on") == 0){ if (checkPerms (playerID, "off", "HTFONOFF")) htfEnable (true, playerID); } else if (strcasecmp (subCmd, "stat") == 0) htfStats (playerID); else sendHelp (playerID); return true; } bool commandLineHelp (void){ const char *help[] = { "Command line args: PLUGINNAME,team=color", NULL }; bz_debugMessage (0, "+++ HoldTheFlag plugin command-line error"); for (int x=0; help[x]!=NULL; x++) bz_debugMessage (0, help[x]); return true; } bool parseCommandLine (const char *cmdLine) { if (cmdLine==NULL || *cmdLine=='\0') return false; htfTeam = eGreenTeam; if (strcasecmp (cmdLine, "team=") == 0){ if ((htfTeam = htfScore->colorNameToDef(cmdLine+5)) == eNoTeam) { return commandLineHelp (); } } return false; } void HTFscore::Init(const char* cmdLine) { htfScore = this; bz_BasePlayerRecord *playerRecord; if (parseCommandLine (cmdLine)) return; // get current list of player indices ... bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList (playerList); for (unsigned int i = 0; i < playerList->size(); i++){ if ((playerRecord = bz_getPlayerByIndex (playerList->get(i))) != NULL){ listAdd (playerList->get(i), playerRecord->callsign.c_str()); bz_freePlayerRecord (playerRecord); } } bz_deleteIntList (playerList); bz_registerCustomSlashCommand ("htf", this); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerPartEvent); Register(bz_eCaptureEvent); Register(bz_eGameStartEvent); Register(bz_eGameEndEvent); } void HTFscore::Cleanup(void) { htfScore = NULL; Flush(); bz_removeCustomSlashCommand ("htf"); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/HoldTheFlag/HoldTheFlag.def000066400000000000000000000001551200563112200220430ustar00rootroot00000000000000LIBRARY HoldTheFlag EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/HoldTheFlag/HoldTheFlag.sln000066400000000000000000000023251200563112200221020ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HoldTheFlag", "HoldTheFlag.vcxproj", "{0D4F5307-9240-4880-A289-C30F112F99A1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|Win32.ActiveCfg = Debug|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|Win32.Build.0 = Debug|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|x64.ActiveCfg = Debug|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Debug|x64.Build.0 = Debug|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|Win32.ActiveCfg = Release|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|Win32.Build.0 = Release|Win32 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|x64.ActiveCfg = Release|x64 {0D4F5307-9240-4880-A289-C30F112F99A1}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/HoldTheFlag/HoldTheFlag.vcxproj000066400000000000000000000343671200563112200230140ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {0D4F5307-9240-4880-A289-C30F112F99A1} HoldTheFlag Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;HoldTheFlag_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)HoldTheFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) HoldTheFlag.def true $(OutDir)HoldTheFlag.pdb Windows false $(OutDir)HoldTheFlag.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;HoldTheFlag_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)HoldTheFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) HoldTheFlag.def true $(OutDir)HoldTheFlag.pdb Windows false $(OutDir)HoldTheFlag.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;HoldTheFlag_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)HoldTheFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) HoldTheFlag.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)HoldTheFlag.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;HoldTheFlag_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)HoldTheFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) HoldTheFlag.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)HoldTheFlag.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/HoldTheFlag/Makefile.am000066400000000000000000000006401200563112200212750ustar00rootroot00000000000000lib_LTLIBRARIES = HoldTheFlag.la HoldTheFlag_la_SOURCES = HoldTheFlag.cpp HoldTheFlag_la_CPPFLAGS = -I$(top_srcdir)/include HoldTheFlag_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ CHANGELOG.txt \ README.txt \ HoldTheFlag.def \ HoldTheFlag.sln \ HoldTheFlag.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/HoldTheFlag/Makefile.in000066400000000000000000000461371200563112200213210ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/HoldTheFlag DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) HoldTheFlag_la_LIBADD = am_HoldTheFlag_la_OBJECTS = HoldTheFlag_la-HoldTheFlag.lo HoldTheFlag_la_OBJECTS = $(am_HoldTheFlag_la_OBJECTS) HoldTheFlag_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(HoldTheFlag_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(HoldTheFlag_la_SOURCES) DIST_SOURCES = $(HoldTheFlag_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = HoldTheFlag.la HoldTheFlag_la_SOURCES = HoldTheFlag.cpp HoldTheFlag_la_CPPFLAGS = -I$(top_srcdir)/include HoldTheFlag_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ CHANGELOG.txt \ README.txt \ HoldTheFlag.def \ HoldTheFlag.sln \ HoldTheFlag.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/HoldTheFlag/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/HoldTheFlag/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done HoldTheFlag.la: $(HoldTheFlag_la_OBJECTS) $(HoldTheFlag_la_DEPENDENCIES) $(HoldTheFlag_la_LINK) -rpath $(libdir) $(HoldTheFlag_la_OBJECTS) $(HoldTheFlag_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HoldTheFlag_la-HoldTheFlag.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< HoldTheFlag_la-HoldTheFlag.lo: HoldTheFlag.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HoldTheFlag_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT HoldTheFlag_la-HoldTheFlag.lo -MD -MP -MF $(DEPDIR)/HoldTheFlag_la-HoldTheFlag.Tpo -c -o HoldTheFlag_la-HoldTheFlag.lo `test -f 'HoldTheFlag.cpp' || echo '$(srcdir)/'`HoldTheFlag.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/HoldTheFlag_la-HoldTheFlag.Tpo $(DEPDIR)/HoldTheFlag_la-HoldTheFlag.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='HoldTheFlag.cpp' object='HoldTheFlag_la-HoldTheFlag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HoldTheFlag_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o HoldTheFlag_la-HoldTheFlag.lo `test -f 'HoldTheFlag.cpp' || echo '$(srcdir)/'`HoldTheFlag.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/HoldTheFlag/README.txt000066400000000000000000000021271200563112200207410ustar00rootroot00000000000000HoldTheFlag plugin version 1.0.0 (Oct 10, 2005) ------------------------------------------------ HoldTheFlag plugin is a score-tracker for the Hold The Flag game mode. Plugin command Line: ==================== -loadplugin PLUGINNAME,[TEAM=teamcolor] If a team color is specified on the command-line, only players who join that team can play. Players who attempt to join another team color will be kicked. Example: -loadplugin HoldTheFlag,team=green In-game commands: ================= /htf: displays the current scores /htf on: enables htf mode (enabled by default, requires HTFONOFF permission) /htf off: disables htf mode (requires HTFONOFF permission) /htf reset: reset all htf scores (requires COUNTDOWN permission) Matches: ======== The HoldTheFlag plugin understands the normal (/countdown) timed match command. Scores will automatically be displayed whenever a player captures a flag, and a winner will be declared at the end of the match. An '*' after a player's score indicates the player who made the last capture. This is used to break a tie. bzflag-2.4.2+ds1/plugins/Makefile.am000066400000000000000000000011611200563112200171530ustar00rootroot00000000000000# plugin_utils is used by other plugins, build first SUBDIRS = \ plugin_utils \ airspawn \ autoFlagReset \ chathistory \ customflagsample \ fairCTF \ fastmap \ flagStay \ hiddenAdmin \ HoldTheFlag \ keepaway \ killall \ koth \ logDetail \ nagware \ Phoenix \ playHistoryTracker \ rabbitTimer \ rabidRabbit \ recordmatch \ regFlag \ RogueGenocide \ SAMPLE_PLUGIN \ serverControl \ shockwaveDeath \ teamflagreset \ thiefControl \ timedctf \ TimeLimit \ wwzones DIST_SUBDIRS = \ $(SUBDIRS) EXTRA_DIST = \ api_notes \ pushstats \ webReport \ newplug.sh MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/Makefile.in000066400000000000000000000446311200563112200171750ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # plugin_utils is used by other plugins, build first SUBDIRS = \ plugin_utils \ airspawn \ autoFlagReset \ chathistory \ customflagsample \ fairCTF \ fastmap \ flagStay \ hiddenAdmin \ HoldTheFlag \ keepaway \ killall \ koth \ logDetail \ nagware \ Phoenix \ playHistoryTracker \ rabbitTimer \ rabidRabbit \ recordmatch \ regFlag \ RogueGenocide \ SAMPLE_PLUGIN \ serverControl \ shockwaveDeath \ teamflagreset \ thiefControl \ timedctf \ TimeLimit \ wwzones DIST_SUBDIRS = \ $(SUBDIRS) EXTRA_DIST = \ api_notes \ pushstats \ webReport \ newplug.sh MAINTAINERCLEANFILES = \ Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/Phoenix/000077500000000000000000000000001200563112200165325ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/Phoenix/Makefile.am000066400000000000000000000005571200563112200205750ustar00rootroot00000000000000lib_LTLIBRARIES = Phoenix.la Phoenix_la_SOURCES = Phoenix.cpp Phoenix_la_CPPFLAGS = -I$(top_srcdir)/include Phoenix_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ Phoenix.def \ Phoenix.sln \ Phoenix.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/Phoenix/Makefile.in000066400000000000000000000455721200563112200206140ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/Phoenix DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) Phoenix_la_LIBADD = am_Phoenix_la_OBJECTS = Phoenix_la-Phoenix.lo Phoenix_la_OBJECTS = $(am_Phoenix_la_OBJECTS) Phoenix_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(Phoenix_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(Phoenix_la_SOURCES) DIST_SOURCES = $(Phoenix_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = Phoenix.la Phoenix_la_SOURCES = Phoenix.cpp Phoenix_la_CPPFLAGS = -I$(top_srcdir)/include Phoenix_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ Phoenix.def \ Phoenix.sln \ Phoenix.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/Phoenix/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/Phoenix/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done Phoenix.la: $(Phoenix_la_OBJECTS) $(Phoenix_la_DEPENDENCIES) $(Phoenix_la_LINK) -rpath $(libdir) $(Phoenix_la_OBJECTS) $(Phoenix_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Phoenix_la-Phoenix.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< Phoenix_la-Phoenix.lo: Phoenix.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Phoenix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Phoenix_la-Phoenix.lo -MD -MP -MF $(DEPDIR)/Phoenix_la-Phoenix.Tpo -c -o Phoenix_la-Phoenix.lo `test -f 'Phoenix.cpp' || echo '$(srcdir)/'`Phoenix.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/Phoenix_la-Phoenix.Tpo $(DEPDIR)/Phoenix_la-Phoenix.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Phoenix.cpp' object='Phoenix_la-Phoenix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Phoenix_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Phoenix_la-Phoenix.lo `test -f 'Phoenix.cpp' || echo '$(srcdir)/'`Phoenix.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/Phoenix/Phoenix.cpp000066400000000000000000000034531200563112200206550ustar00rootroot00000000000000// Phoenix.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include typedef struct { float x,y,z,a; }trDeathPos; class PhoenixEvents : public bz_Plugin { public: std::map lastDeaded; virtual const char* Name (){return "Phoenix";} virtual void Init ( const char* /*config*/ ) { lastDeaded.clear(); Register(bz_ePlayerDieEvent); Register(bz_eGetPlayerSpawnPosEvent); Register(bz_ePlayerPartEvent); Register(bz_eCaptureEvent); } virtual void Event ( bz_EventData *eventData ) { switch(eventData->eventType) { case bz_eCaptureEvent: lastDeaded.clear(); break; case bz_ePlayerDieEvent: { bz_PlayerDieEventData_V1* data = (bz_PlayerDieEventData_V1*)eventData; trDeathPos pos; pos.x = data->state.pos[0]; pos.y = data->state.pos[1]; pos.z = data->state.pos[2]; pos.a = data->state.rotation; lastDeaded[data->playerID] = pos; } break; case bz_eGetPlayerSpawnPosEvent: { bz_GetPlayerSpawnPosEventData_V1* data = (bz_GetPlayerSpawnPosEventData_V1*)eventData; if (lastDeaded.find(data->playerID) == lastDeaded.end()) break; trDeathPos &pos = lastDeaded[data->playerID]; data->handled = true; data->pos[0] = pos.x; data->pos[1] = pos.y; data->pos[2] = pos.z; data->rot = pos.a; } break; case bz_ePlayerPartEvent: { bz_PlayerJoinPartEventData_V1* data = (bz_PlayerJoinPartEventData_V1*)eventData; if (lastDeaded.find(data->playerID) != lastDeaded.end()) lastDeaded.erase(lastDeaded.find(data->playerID)); } break; default: break; } } }; BZ_PLUGIN(PhoenixEvents) // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/Phoenix/Phoenix.def000066400000000000000000000001521200563112200206220ustar00rootroot00000000000000LIBRARY Phoenix EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/Phoenix/Phoenix.sln000066400000000000000000000023151200563112200206630ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Phoenix", "Phoenix.vcxproj", "{16D3208C-0A75-4CC3-A7C2-6A266127BB90}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|Win32.ActiveCfg = Debug|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|Win32.Build.0 = Debug|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|x64.ActiveCfg = Debug|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Debug|x64.Build.0 = Debug|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|Win32.ActiveCfg = Release|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|Win32.Build.0 = Release|Win32 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|x64.ActiveCfg = Release|x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/Phoenix/Phoenix.vcxproj000066400000000000000000000336321200563112200215700ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {16D3208C-0A75-4CC3-A7C2-6A266127BB90} Phoenix Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;Phoenix_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)Phoenix.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) Phoenix.def true $(OutDir)Phoenix.pdb Windows false $(OutDir)Phoenix.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;Phoenix_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)Phoenix.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) Phoenix.def true $(OutDir)Phoenix.pdb Windows false $(OutDir)Phoenix.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;Phoenix_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)Phoenix.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) Phoenix.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)Phoenix.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;Phoenix_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)Phoenix.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) Phoenix.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)Phoenix.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/Phoenix/README.txt000066400000000000000000000005211200563112200202260ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : Phoenix Project Overview ======================================================================== This is the Phoenix plugin. It causes players to spawn exactly where they died, which may be troublesome if death physics was the cause. bzflag-2.4.2+ds1/plugins/RogueGenocide/000077500000000000000000000000001200563112200176375ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/RogueGenocide/Makefile.am000066400000000000000000000006371200563112200217010ustar00rootroot00000000000000lib_LTLIBRARIES = RogueGenocide.la RogueGenocide_la_SOURCES = RogueGenocide.cpp RogueGenocide_la_CPPFLAGS = -I$(top_srcdir)/include RogueGenocide_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ RogueGenocide.def \ RogueGenocide.sln \ RogueGenocide.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/RogueGenocide/Makefile.in000066400000000000000000000462701200563112200217150ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/RogueGenocide DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) RogueGenocide_la_LIBADD = am_RogueGenocide_la_OBJECTS = RogueGenocide_la-RogueGenocide.lo RogueGenocide_la_OBJECTS = $(am_RogueGenocide_la_OBJECTS) RogueGenocide_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(RogueGenocide_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(RogueGenocide_la_SOURCES) DIST_SOURCES = $(RogueGenocide_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = RogueGenocide.la RogueGenocide_la_SOURCES = RogueGenocide.cpp RogueGenocide_la_CPPFLAGS = -I$(top_srcdir)/include RogueGenocide_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ RogueGenocide.def \ RogueGenocide.sln \ RogueGenocide.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/RogueGenocide/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/RogueGenocide/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done RogueGenocide.la: $(RogueGenocide_la_OBJECTS) $(RogueGenocide_la_DEPENDENCIES) $(RogueGenocide_la_LINK) -rpath $(libdir) $(RogueGenocide_la_OBJECTS) $(RogueGenocide_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RogueGenocide_la-RogueGenocide.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< RogueGenocide_la-RogueGenocide.lo: RogueGenocide.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RogueGenocide_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RogueGenocide_la-RogueGenocide.lo -MD -MP -MF $(DEPDIR)/RogueGenocide_la-RogueGenocide.Tpo -c -o RogueGenocide_la-RogueGenocide.lo `test -f 'RogueGenocide.cpp' || echo '$(srcdir)/'`RogueGenocide.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/RogueGenocide_la-RogueGenocide.Tpo $(DEPDIR)/RogueGenocide_la-RogueGenocide.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='RogueGenocide.cpp' object='RogueGenocide_la-RogueGenocide.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RogueGenocide_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RogueGenocide_la-RogueGenocide.lo `test -f 'RogueGenocide.cpp' || echo '$(srcdir)/'`RogueGenocide.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/RogueGenocide/README.txt000066400000000000000000000006511200563112200213370ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : RogueGenocide Project Overview ======================================================================== This is the RogueGenocide plugin. It causes all of the spawned rogue players to die if one of them is hit by a Genocide shot, just as if they were all on the same team. A rogue player firing such a shot will die, too. bzflag-2.4.2+ds1/plugins/RogueGenocide/RogueGenocide.cpp000066400000000000000000000046771200563112200231000ustar00rootroot00000000000000// rogueGenocide.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include // event handler callback class RogueGenoHandler : public bz_Plugin { public: virtual const char* Name (){return "Rogue Genocide";} virtual void Init ( const char* config); virtual void Event ( bz_EventData *eventData ); bool noSuicide; }; BZ_PLUGIN(RogueGenoHandler) void RogueGenoHandler::Init( const char* commandLine ) { Register(bz_ePlayerDieEvent); std::string param = commandLine; noSuicide = (param == "nosuicide"); } void RogueGenoHandler::Event ( bz_EventData *eventData ) { switch (eventData->eventType) { default: // no clue break; // wait for a tank death and start checking for genocide and rogues case bz_ePlayerDieEvent: { bz_PlayerDieEventData_V1 *dieData = (bz_PlayerDieEventData_V1*)eventData; //if its not a genocide kill, dont care if (dieData->flagKilledWith != "G" ) break; // if the tank killed was not a rogue, let the server/client do the normal killing if (dieData->team != eRogueTeam ) break; // option to disallow rogues getting points for shooting themselves if ( noSuicide && dieData->killerID == dieData->playerID ) break; // if the tank killed was a rogue, kill all rogues. bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList(playerList); for ( unsigned int i = 0; i < playerList->size(); i++) { int targetID = (*playerList)[i]; bz_BasePlayerRecord *playRec = bz_getPlayerByIndex ( targetID ); if (!playRec) continue; // the sucker is a spawned rogue, kill him. This generates another death event, // so if you kill another rogue with geno while you are a rogue you end up dead too. // and you get both messages (victim and be careful) if ( playRec->spawned && playRec->team == eRogueTeam ) { bz_killPlayer( targetID, false, dieData->killerID, "G" ); bz_sendTextMessage(BZ_SERVER, targetID, "You were a victim of Rogue Genocide"); // oops, I ended up killing myself (directly or indirectly) with Genocide! if ( targetID == dieData->killerID ) bz_sendTextMessage(BZ_SERVER, targetID, "You should be more careful with Genocide!"); } bz_freePlayerRecord(playRec); } bz_deleteIntList(playerList); } break; } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/RogueGenocide/RogueGenocide.def000066400000000000000000000001571200563112200230410ustar00rootroot00000000000000LIBRARY RogueGenocide EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/RogueGenocide/RogueGenocide.sln000066400000000000000000000023311200563112200230730ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RogueGenocide", "RogueGenocide.vcxproj", "{AD6040FD-F813-4DA7-8058-32022A58F79E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|Win32.ActiveCfg = Debug|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|Win32.Build.0 = Debug|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|x64.ActiveCfg = Debug|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Debug|x64.Build.0 = Debug|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|Win32.ActiveCfg = Release|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|Win32.Build.0 = Release|Win32 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|x64.ActiveCfg = Release|x64 {AD6040FD-F813-4DA7-8058-32022A58F79E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/RogueGenocide/RogueGenocide.vcxproj000066400000000000000000000340171200563112200240000ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {AD6040FD-F813-4DA7-8058-32022A58F79E} RogueGenocide Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;RogueGenocide_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)RogueGenocide.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) RogueGenocide.def true $(OutDir)RogueGenocide.pdb Windows false $(OutDir)RogueGenocide.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;RogueGenocide_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)RogueGenocide.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) RogueGenocide.def true $(OutDir)RogueGenocide.pdb Windows false $(OutDir)RogueGenocide.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;RogueGenocide_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)RogueGenocide.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) RogueGenocide.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)RogueGenocide.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;RogueGenocide_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)RogueGenocide.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) RogueGenocide.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)RogueGenocide.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/000077500000000000000000000000001200563112200171575ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/Makefile.am000066400000000000000000000010251200563112200212110ustar00rootroot00000000000000lib_LTLIBRARIES = SAMPLE_PLUGIN.la SAMPLE_PLUGIN_la_SOURCES = SAMPLE_PLUGIN.cpp SAMPLE_PLUGIN_la_CXXFLAGS= -I$(top_srcdir)/include -I$(top_srcdir)/plugins/plugin_utils SAMPLE_PLUGIN_la_LDFLAGS = -module -avoid-version -shared SAMPLE_PLUGIN_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ SAMPLE_PLUGIN.def \ SAMPLE_PLUGIN.sln \ SAMPLE_PLUGIN.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/Makefile.in000066400000000000000000000466021200563112200212340ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/SAMPLE_PLUGIN DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) SAMPLE_PLUGIN_la_DEPENDENCIES = \ $(top_builddir)/plugins/plugin_utils/libplugin_utils.la am_SAMPLE_PLUGIN_la_OBJECTS = SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo SAMPLE_PLUGIN_la_OBJECTS = $(am_SAMPLE_PLUGIN_la_OBJECTS) SAMPLE_PLUGIN_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(SAMPLE_PLUGIN_la_CXXFLAGS) $(CXXFLAGS) \ $(SAMPLE_PLUGIN_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(SAMPLE_PLUGIN_la_SOURCES) DIST_SOURCES = $(SAMPLE_PLUGIN_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = SAMPLE_PLUGIN.la SAMPLE_PLUGIN_la_SOURCES = SAMPLE_PLUGIN.cpp SAMPLE_PLUGIN_la_CXXFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/plugins/plugin_utils SAMPLE_PLUGIN_la_LDFLAGS = -module -avoid-version -shared SAMPLE_PLUGIN_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ SAMPLE_PLUGIN.def \ SAMPLE_PLUGIN.sln \ SAMPLE_PLUGIN.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/SAMPLE_PLUGIN/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/SAMPLE_PLUGIN/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done SAMPLE_PLUGIN.la: $(SAMPLE_PLUGIN_la_OBJECTS) $(SAMPLE_PLUGIN_la_DEPENDENCIES) $(SAMPLE_PLUGIN_la_LINK) -rpath $(libdir) $(SAMPLE_PLUGIN_la_OBJECTS) $(SAMPLE_PLUGIN_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo: SAMPLE_PLUGIN.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SAMPLE_PLUGIN_la_CXXFLAGS) $(CXXFLAGS) -MT SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo -MD -MP -MF $(DEPDIR)/SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.Tpo -c -o SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo `test -f 'SAMPLE_PLUGIN.cpp' || echo '$(srcdir)/'`SAMPLE_PLUGIN.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.Tpo $(DEPDIR)/SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='SAMPLE_PLUGIN.cpp' object='SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(SAMPLE_PLUGIN_la_CXXFLAGS) $(CXXFLAGS) -c -o SAMPLE_PLUGIN_la-SAMPLE_PLUGIN.lo `test -f 'SAMPLE_PLUGIN.cpp' || echo '$(srcdir)/'`SAMPLE_PLUGIN.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/README.txt000066400000000000000000000007721200563112200206630ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : SAMPLE_PLUGIN Project Overview ======================================================================== This is the SAMPLE_PLUGIN plugin. Replace every occurrence of the term SAMPLE_PLUGIN in every file in here with the name of your project. Also open .sln and .vcproj files in a text editor and do a search and replace. Then write a short readme with usage instructions or other details in this file. bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/SAMPLE_PLUGIN.cpp000066400000000000000000000012331200563112200217210ustar00rootroot00000000000000// SAMPLE_PLUGIN.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include "plugin_utils.h" class SAMPLE_PLUGIN : public bz_Plugin { virtual const char* Name (){return "SAMPLE PLUGIN";} virtual void Init ( const char* config); virtual void Event ( bz_EventData * /* eventData */ ){return;} }; BZ_PLUGIN(SAMPLE_PLUGIN) void SAMPLE_PLUGIN::Init ( const char* /*commandLine*/ ) { bz_debugMessage(4,"SAMPLE_PLUGIN plugin loaded"); // init events here with Register(); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/SAMPLE_PLUGIN.def000066400000000000000000000002511200563112200216740ustar00rootroot00000000000000LIBRARY SAMPLE_PLUGIN DESCRIPTION 'SAMPLE_PLUGIN Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/SAMPLE_PLUGIN.sln000066400000000000000000000037431200563112200217430ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SAMPLE_PLUGIN", "SAMPLE_PLUGIN.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "..\plugin_utils\plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.Build.0 = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.Build.0 = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.Build.0 = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.ActiveCfg = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.Build.0 = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.ActiveCfg = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/SAMPLE_PLUGIN/SAMPLE_PLUGIN.vcxproj000066400000000000000000000340731200563112200226420ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141} SAMPLE_PLUGIN Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;SAMPLE_PLUGIN_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)SAMPLE_PLUGIN.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) SAMPLE_PLUGIN.def true $(OutDir)SAMPLE_PLUGIN.pdb Windows false $(OutDir)SAMPLE_PLUGIN.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;SAMPLE_PLUGIN_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)SAMPLE_PLUGIN.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) SAMPLE_PLUGIN.def true $(OutDir)SAMPLE_PLUGIN.pdb Windows false $(OutDir)SAMPLE_PLUGIN.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;SAMPLE_PLUGIN_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)SAMPLE_PLUGIN.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) SAMPLE_PLUGIN.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)SAMPLE_PLUGIN.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;SAMPLE_PLUGIN_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)SAMPLE_PLUGIN.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) SAMPLE_PLUGIN.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)SAMPLE_PLUGIN.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true {645768be-97c8-4de4-9100-111bd2808b35} false bzflag-2.4.2+ds1/plugins/TimeLimit/000077500000000000000000000000001200563112200170155ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/TimeLimit/Makefile.am000066400000000000000000000005771200563112200210620ustar00rootroot00000000000000lib_LTLIBRARIES = TimeLimit.la TimeLimit_la_SOURCES = TimeLimit.cpp TimeLimit_la_CPPFLAGS = -I$(top_srcdir)/include TimeLimit_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ TimeLimit.def \ TimeLimit.sln \ TimeLimit.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/TimeLimit/Makefile.in000066400000000000000000000457441200563112200211000ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/TimeLimit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) TimeLimit_la_LIBADD = am_TimeLimit_la_OBJECTS = TimeLimit_la-TimeLimit.lo TimeLimit_la_OBJECTS = $(am_TimeLimit_la_OBJECTS) TimeLimit_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(TimeLimit_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(TimeLimit_la_SOURCES) DIST_SOURCES = $(TimeLimit_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = TimeLimit.la TimeLimit_la_SOURCES = TimeLimit.cpp TimeLimit_la_CPPFLAGS = -I$(top_srcdir)/include TimeLimit_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ TimeLimit.def \ TimeLimit.sln \ TimeLimit.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/TimeLimit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/TimeLimit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done TimeLimit.la: $(TimeLimit_la_OBJECTS) $(TimeLimit_la_DEPENDENCIES) $(TimeLimit_la_LINK) -rpath $(libdir) $(TimeLimit_la_OBJECTS) $(TimeLimit_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeLimit_la-TimeLimit.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< TimeLimit_la-TimeLimit.lo: TimeLimit.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TimeLimit_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TimeLimit_la-TimeLimit.lo -MD -MP -MF $(DEPDIR)/TimeLimit_la-TimeLimit.Tpo -c -o TimeLimit_la-TimeLimit.lo `test -f 'TimeLimit.cpp' || echo '$(srcdir)/'`TimeLimit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/TimeLimit_la-TimeLimit.Tpo $(DEPDIR)/TimeLimit_la-TimeLimit.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='TimeLimit.cpp' object='TimeLimit_la-TimeLimit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TimeLimit_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TimeLimit_la-TimeLimit.lo `test -f 'TimeLimit.cpp' || echo '$(srcdir)/'`TimeLimit.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/TimeLimit/README.txt000066400000000000000000000041751200563112200205220ustar00rootroot00000000000000TimeLimit plugin version 1.0.4 (December 26, 2006) --------------------------------------------------- Author: Steven Mertens The TimeLimit plugin makes it possible to change live the match duration on a match server. Plugin command Line: ==================== -loadplugin PLUGINNAME[,,] | ,starttime-endtime The first example allows every match duration limit. Example: -loadplugin TimeLimit The second example allows only those match durations passed as arguments. A maximum of 20 different durations can be specified. Example : -loadplugin TimeLimit,5,15,30,60 The third example allows a specific range of match durations. Example : -loadplugin TimeLimit,5-15 When the wrong arguments get passed through, the plugin will fallback to the first example. In-game commands: ================= The timelimit in game command requires the TIMELIMIT permission. It is also required the bzfs server is started with -timemanual . /timelimit : displays the usage message /timelimit : sets the timelimit /timelimit show : shows the current set timelimit /timelimit reset : resets the timelimit back to default (-time setting) Example : /timelimit 15 Matches: ======== Before starting a match with the /countdown command you can set the match duration with the /timelimit command. It's not possible to set the match duration when a countdown is in progress or when a match is already started. The timelimit will reset itself to the -time value at the end of a match or when there are no players on the server. Changelog: ========== * TimeLimit 1.0.4 (26 December 2006) - Added a makefile so the plugin doesn't relay anymore on bzflag plugin build system. * TimeLimit 1.0.3 (26 July 2006) - Applied uso his changes (timelimit reset at end of game) - Add feature that allows a range of match durations * TimeLimit 1.0.2 (08 June 2006) - Add feature that only allows certain match durations * TimeLimit 1.0.1 (18 May 2006) - bugfix : don't allow negative match durations * TimeLimit 1.0.0 (17 May 2006) - Initial release bzflag-2.4.2+ds1/plugins/TimeLimit/TimeLimit.cpp000066400000000000000000000144631200563112200214260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // TimeLimit.cpp : bzfs plugin to change/set the match duration // #include "bzfsAPI.h" #include #include #include #define TIMELIMIT_VER "1.0.4" #define MAX_TIMES 20 class TimeLimit : public bz_Plugin, public bz_CustomSlashCommandHandler { public: virtual const char* Name (){return "Time Limit";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); virtual bool SlashCommand ( int playerID, bz_ApiString, bz_ApiString, bz_APIStringList*); protected: private: }; BZ_PLUGIN(TimeLimit) // variable to save the original -time value float saveTimeLimit = 0; // list to hold the available match durations bz_APIStringList* timeList = bz_newStringList(); // Displays the available match durations void showMatchDurations(int playerID) { bz_sendTextMessagef (BZ_SERVER, playerID, "Not a valid match duration, valid match durations are : "); for (unsigned i=0; i < timeList->size(); i++) bz_sendTextMessagef (BZ_SERVER, playerID, "* %s minute(s)",timeList->get(i).c_str()); } // Checks if it's a valid match duration or not bool isValidTime ( float timelimit ) { if ( timeList->size() == 0 ) return true; for (unsigned i=0; i < timeList->size(); i++) { if ( atof(timeList->get(i).c_str()) == timelimit ) { return true; } } return false; } void TimeLimit::Event ( bz_EventData *eventData ) { switch(eventData->eventType) { case bz_ePlayerJoinEvent: { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList (playerList); // if it's the first player that joins , then reset the time to default if ( playerList->size() == 1 && bz_isTimeManualStart() && !bz_isCountDownActive() && !bz_isCountDownInProgress()) { bz_setTimeLimit(saveTimeLimit); } } break; //reset the time to default at gameover case bz_eGameEndEvent: { bz_setTimeLimit(saveTimeLimit); } break; default: { // do nothing } } } std::string convertIntToString(const unsigned int integer) { std::ostringstream ostr; ostr << integer; return ostr.str(); } void parseCommand ( const char* commandLine ) { const size_t len = strlen(commandLine); if (len != 0) { unsigned int range_begin, range_end; char junk; if (sscanf(commandLine, "%u-%u%c", &range_begin, &range_end, &junk) == 2) { while (range_begin <= range_end) timeList->push_back(convertIntToString(range_begin++)); } else if (strspn(commandLine, ",0123456789") == len) timeList->tokenize(commandLine, ",", MAX_TIMES, false); } } bool TimeLimit::SlashCommand ( int playerID, bz_ApiString cmd, bz_ApiString, bz_APIStringList* cmdParams ) { if (strcasecmp (cmd.c_str(), "timelimit")) { return false; } // Check permissions if (! bz_hasPerm(playerID,"TIMELIMIT")) { bz_sendTextMessagef (BZ_SERVER, playerID, "You do not have permission to run the timelimit command"); return true; } // If the server is not configured for manual countdown the timelimit // command can't be used if (! bz_isTimeManualStart()) { bz_sendTextMessagef (BZ_SERVER, playerID, "This server was not configured for manual clock countdowns"); return true; } if (cmdParams->get(0).c_str()[0] == '\0') { bz_sendTextMessagef (BZ_SERVER, playerID, "Usage : /timelimit |show|reset"); return true; } // displaying the current timelimit if (strcasecmp(cmdParams->get(0).c_str(),"show") == 0 ) { bz_sendTextMessagef (BZ_SERVER, playerID,"Match duration is set to %.0f minute(s)",(bz_getTimeLimit() / 60)); return true; } // check if there is already a countdown in progress or if a match is // already in progress if ( bz_isCountDownInProgress() ) { bz_sendTextMessagef (BZ_SERVER, playerID, "There is a countdown already in progress, match duration can't be changed now"); return true; } else if ( bz_isCountDownActive() ) { bz_sendTextMessagef (BZ_SERVER, playerID, "A game is already in progress, match duration can't be changed now"); return true; } bz_BasePlayerRecord *playerRecord; playerRecord = bz_getPlayerByIndex(playerID); // resets the timer to the default if (strcasecmp(cmdParams->get(0).c_str(),"reset") == 0 ) { bz_setTimeLimit(saveTimeLimit); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Match duration reset to %.0f minute(s) by %s",(bz_getTimeLimit() / 60),playerRecord->callsign.c_str()); return true; } unsigned i, nonumber=0; for (i=0; i < strlen(cmdParams->get(0).c_str()); i++) { if (isdigit(cmdParams->get(0).c_str()[i]) == 0) nonumber=1; } if (nonumber == 0 ) { float limit = (float)atof(cmdParams->get(0).c_str()); // Don't allow timelimit being equal or lower then 0 if (limit > 0 ) { if (! isValidTime(limit)) { showMatchDurations(playerID); return true; } bz_setTimeLimit(limit * 60); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Match duration set to %.0f minute(s) by %s",(bz_getTimeLimit() / 60),playerRecord->callsign.c_str()); } else { bz_sendTextMessagef (BZ_SERVER, playerID, "Match duration can't be equal or lower then 0"); return true; } } else { bz_sendTextMessagef (BZ_SERVER, playerID, "Not a correct value"); return true; } return true; } void TimeLimit::Init ( const char* commandLine ) { parseCommand(commandLine); saveTimeLimit = bz_getTimeLimit(); bz_registerCustomSlashCommand ("timelimit",this); Register(bz_ePlayerJoinEvent); Register(bz_eGameEndEvent); } void TimeLimit::Cleanup ( void ) { // set default timelimit back before unloading //bz_setTimeLimit(saveTimeLimit); bz_removeCustomSlashCommand ("timelimit"); Flush(); // set default timelimit back before unloading bz_setTimeLimit(saveTimeLimit); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/TimeLimit/TimeLimit.def000066400000000000000000000001631200563112200213720ustar00rootroot00000000000000LIBRARY TimeLimit EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/TimeLimit/TimeLimit.sln000066400000000000000000000037161200563112200214370ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TimeLimit", "TimeLimit.vcxproj", "{F0524257-1263-4511-A1F9-CA18758F1065}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regex", "..\..\MSVC\build\regex.vcxproj", "{6DD493F8-31E1-4958-A240-D157AFFCB07E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|Win32.ActiveCfg = Debug|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|Win32.Build.0 = Debug|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|x64.ActiveCfg = Debug|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Debug|x64.Build.0 = Debug|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|Win32.ActiveCfg = Release|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|Win32.Build.0 = Release|Win32 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|x64.ActiveCfg = Release|x64 {F0524257-1263-4511-A1F9-CA18758F1065}.Release|x64.Build.0 = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.ActiveCfg = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|Win32.Build.0 = Debug|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.ActiveCfg = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Debug|x64.Build.0 = Debug|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.ActiveCfg = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|Win32.Build.0 = Release|Win32 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.ActiveCfg = Release|x64 {6DD493F8-31E1-4958-A240-D157AFFCB07E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/TimeLimit/TimeLimit.vcxproj000066400000000000000000000342341200563112200223350ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {F0524257-1263-4511-A1F9-CA18758F1065} TimeLimit Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;TimeLimit_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)TimeLimit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) TimeLimit.def true $(OutDir)TimeLimit.pdb Windows false $(OutDir)TimeLimit.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;TimeLimit_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)TimeLimit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) TimeLimit.def true $(OutDir)TimeLimit.pdb Windows false $(OutDir)TimeLimit.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;TimeLimit_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)TimeLimit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) TimeLimit.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)TimeLimit.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;TimeLimit_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)TimeLimit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) TimeLimit.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)TimeLimit.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {6dd493f8-31e1-4958-a240-d157affcb07e} false bzflag-2.4.2+ds1/plugins/airspawn/000077500000000000000000000000001200563112200167445ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/airspawn/Makefile.am000066400000000000000000000005511200563112200210010ustar00rootroot00000000000000lib_LTLIBRARIES = airspawn.la airspawn_la_SOURCES = airspawn.cpp airspawn_la_CPPFLAGS = -I$(top_srcdir)/include airspawn_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ airspawn.def \ airspawn.sln \ airspawn.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/airspawn/Makefile.in000066400000000000000000000456411200563112200210230ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/airspawn DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) airspawn_la_LIBADD = am_airspawn_la_OBJECTS = airspawn_la-airspawn.lo airspawn_la_OBJECTS = $(am_airspawn_la_OBJECTS) airspawn_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(airspawn_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(airspawn_la_SOURCES) DIST_SOURCES = $(airspawn_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = airspawn.la airspawn_la_SOURCES = airspawn.cpp airspawn_la_CPPFLAGS = -I$(top_srcdir)/include airspawn_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ airspawn.def \ airspawn.sln \ airspawn.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/airspawn/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/airspawn/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done airspawn.la: $(airspawn_la_OBJECTS) $(airspawn_la_DEPENDENCIES) $(airspawn_la_LINK) -rpath $(libdir) $(airspawn_la_OBJECTS) $(airspawn_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/airspawn_la-airspawn.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< airspawn_la-airspawn.lo: airspawn.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(airspawn_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT airspawn_la-airspawn.lo -MD -MP -MF $(DEPDIR)/airspawn_la-airspawn.Tpo -c -o airspawn_la-airspawn.lo `test -f 'airspawn.cpp' || echo '$(srcdir)/'`airspawn.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/airspawn_la-airspawn.Tpo $(DEPDIR)/airspawn_la-airspawn.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='airspawn.cpp' object='airspawn_la-airspawn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(airspawn_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o airspawn_la-airspawn.lo `test -f 'airspawn.cpp' || echo '$(srcdir)/'`airspawn.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/airspawn/airspawn.cpp000066400000000000000000000021601200563112200212730ustar00rootroot00000000000000// airspawn.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include // plugin definition class airspawn : public bz_Plugin { public: virtual const char* Name (){return "Airspawn";} virtual void Init ( const char* config); virtual void Event ( bz_EventData *eventData ); float spawnRange; }; BZ_PLUGIN(airspawn) void airspawn::Init ( const char* commandLine ) { spawnRange = 0; if ( commandLine ) spawnRange = (float)atof(commandLine); if ( spawnRange < 0.001f ) spawnRange = 10.0f; Register(bz_eGetPlayerSpawnPosEvent); } void airspawn::Event ( bz_EventData *eventData ) { switch (eventData->eventType) { case bz_eGetPlayerSpawnPosEvent: { bz_GetPlayerSpawnPosEventData_V1 *spawn = (bz_GetPlayerSpawnPosEventData_V1*)eventData; float randPos = rand()/(float)RAND_MAX; spawn->pos[2] += randPos * spawnRange; spawn->handled = true; } break; default: break; } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/airspawn/airspawn.def000066400000000000000000000001521200563112200212460ustar00rootroot00000000000000LIBRARY airspawn EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/airspawn/airspawn.sln000066400000000000000000000023171200563112200213110ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "airspawn", "airspawn.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.Build.0 = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/airspawn/airspawn.vcxproj000066400000000000000000000332551200563112200222150ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141} airspawn Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;airspawn_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)airspawn.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) airspawn.def true $(OutDir)airspawn.pdb Windows false $(OutDir)airspawn.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;airspawn_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)airspawn.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) airspawn.def true $(OutDir)airspawn.pdb Windows false $(OutDir)airspawn.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;airspawn_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)airspawn.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) airspawn.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)airspawn.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;airspawn_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)airspawn.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) airspawn.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)airspawn.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true bzflag-2.4.2+ds1/plugins/api_notes000066400000000000000000000013421200563112200170240ustar00rootroot00000000000000notes on yon API ============================================================================== * export directory stuff so plugins can make/open files * add new "2.0" map objects to api * add event callbacks for the anti-cheat code sections * expose API for superkill, start, end, reset commands. * check other /commands and see what else could be exported. * add setFlagList hook * add allow flag hook * add disallow flag hook * add allow team flag hook * add On Team Score Change hook * add on player score change hook * add api to add meshes * have maps be able to specifiy required plugins * add ability for a plugin to be unique ( load once ). * add hook for shot message, move message, teleport message, and "need TP destination" bzflag-2.4.2+ds1/plugins/autoFlagReset/000077500000000000000000000000001200563112200176655ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/autoFlagReset/Makefile.am000066400000000000000000000006371200563112200217270ustar00rootroot00000000000000lib_LTLIBRARIES = autoFlagReset.la autoFlagReset_la_SOURCES = autoFlagReset.cpp autoFlagReset_la_CPPFLAGS = -I$(top_srcdir)/include autoFlagReset_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ autoFlagReset.def \ autoFlagReset.sln \ autoFlagReset.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/autoFlagReset/Makefile.in000066400000000000000000000462701200563112200217430ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/autoFlagReset DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) autoFlagReset_la_LIBADD = am_autoFlagReset_la_OBJECTS = autoFlagReset_la-autoFlagReset.lo autoFlagReset_la_OBJECTS = $(am_autoFlagReset_la_OBJECTS) autoFlagReset_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(autoFlagReset_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(autoFlagReset_la_SOURCES) DIST_SOURCES = $(autoFlagReset_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = autoFlagReset.la autoFlagReset_la_SOURCES = autoFlagReset.cpp autoFlagReset_la_CPPFLAGS = -I$(top_srcdir)/include autoFlagReset_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ autoFlagReset.def \ autoFlagReset.sln \ autoFlagReset.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/autoFlagReset/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/autoFlagReset/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done autoFlagReset.la: $(autoFlagReset_la_OBJECTS) $(autoFlagReset_la_DEPENDENCIES) $(autoFlagReset_la_LINK) -rpath $(libdir) $(autoFlagReset_la_OBJECTS) $(autoFlagReset_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoFlagReset_la-autoFlagReset.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< autoFlagReset_la-autoFlagReset.lo: autoFlagReset.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autoFlagReset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT autoFlagReset_la-autoFlagReset.lo -MD -MP -MF $(DEPDIR)/autoFlagReset_la-autoFlagReset.Tpo -c -o autoFlagReset_la-autoFlagReset.lo `test -f 'autoFlagReset.cpp' || echo '$(srcdir)/'`autoFlagReset.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/autoFlagReset_la-autoFlagReset.Tpo $(DEPDIR)/autoFlagReset_la-autoFlagReset.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='autoFlagReset.cpp' object='autoFlagReset_la-autoFlagReset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(autoFlagReset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o autoFlagReset_la-autoFlagReset.lo `test -f 'autoFlagReset.cpp' || echo '$(srcdir)/'`autoFlagReset.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/autoFlagReset/README.txt000066400000000000000000000016551200563112200213720ustar00rootroot00000000000000=============================================================================== Automatic Flag Reset: BZFlag server plug-in Original author: L4m3r =============================================================================== Automatic Flag Reset will automatically reset unused superflags at a fixed interval. This can be useful on maps that tend to get all their superflags taken from certain areas and left to accumulate in others. Specify the interval in minutes by passing it as a parameter to the plugin: -loadplugin /pathtoplugin/autoFlagReset.so,15 The default frequency is once every 15 minutes. Optionally, the plugin can reset flags incrementally, spreading the resets over the time interval. This setting is recommended for servers with a lot of flags, because a large flag reset can hang clients. Enable this option by adding "i" to the end of the time parameter: -loadplugin /pathtoplugin/autoFlagReset.so,15i bzflag-2.4.2+ds1/plugins/autoFlagReset/autoFlagReset.cpp000066400000000000000000000065001200563112200231370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "bzfsAPI.h" class autoFlagReset : public bz_Plugin { virtual const char* Name (){return "Automatic Flag Reset";} virtual void Init ( const char* config); virtual void Event ( bz_EventData* eventData ); virtual bool ResetUnusedSuperflag(unsigned int flagID); bool incremental; double freq; double nextRunTime; unsigned int nextFlag; }; BZ_PLUGIN(autoFlagReset) void autoFlagReset::Init (const char* commandLine) { std::string cl = commandLine; incremental = false; freq = 900.0; nextFlag = 0; nextRunTime = bz_getCurrentTime(); if (nextRunTime < 0.0) { nextRunTime = 0.0; } if (cl.length() > 0) { if (cl.at(cl.length() - 1) == 'i' || cl.at(cl.length() - 1) == 'I') { // Incremental mode. incremental = true; cl = cl.substr(0, cl.length() - 1); } double newfreq = atof(cl.c_str()); if (newfreq > 0.0) { freq = newfreq * 60.0; } } Register(bz_eTickEvent); bz_debugMessage(4,"autoFlagReset plugin loaded"); } void autoFlagReset::Event(bz_EventData* eventData) { unsigned int nflags = bz_getNumFlags(); if (bz_getCurrentTime() < nextRunTime || nflags <= 0 || eventData->eventType != bz_eTickEvent) { // Nothing to see here. return; } if (incremental) { // Reset one flag. // Limit iteration to one "cycle" of all flags. // Otherwise, this is an infinite loop if all flags are in use. for (unsigned int i = 0; i < nflags; i++) { bool worked = ResetUnusedSuperflag(nextFlag); nextFlag++; if (nextFlag >= nflags) { nextFlag = 0; } if (worked) { break; } } nextRunTime += freq / (double)nflags; } else { // Reset all flags. for (unsigned int i = 0; i < nflags; i++) { // Don't care whether it works or not. ResetUnusedSuperflag(i); } nextRunTime += freq; } } bool autoFlagReset::ResetUnusedSuperflag(unsigned int flagID) { // Sanity check. if (flagID >= bz_getNumFlags()) { return false; } // Make sure the flag isn't held. if (bz_flagPlayer(flagID) != -1) { return false; } // Make sure it's not a teamflag. bz_ApiString flagType = bz_getName(flagID); if (flagType == "R*" || flagType == "G*" || flagType == "B*" || flagType == "P*" || flagType == "") { return false; } // Looks ok, reset it. return bz_resetFlag(flagID); } //BZF_API unsigned int bz_getNumFlags( void ); //BZF_API const bz_ApiString bz_getName( int flag ); //BZF_API bool bz_resetFlag ( int flag ); //BZF_API bool bz_moveFlag ( int flag, float pos[3] ); //BZF_API int bz_flagPlayer ( int flag ); //BZF_API bool bz_getFlagPosition ( int flag, float* pos ); // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/autoFlagReset/autoFlagReset.def000066400000000000000000000002511200563112200231100ustar00rootroot00000000000000LIBRARY autoFlagReset DESCRIPTION 'autoFlagReset Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/autoFlagReset/autoFlagReset.sln000066400000000000000000000023311200563112200231470ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "autoFlagReset", "autoFlagReset.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.Build.0 = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/autoFlagReset/autoFlagReset.vcxproj000066400000000000000000000334731200563112200240610ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {AD285E14-AAA4-4D71-962D-4E7EDE796B58} autoFlagReset Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;autoFlagReset_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)autoFlagReset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) autoFlagReset.def true $(OutDir)autoFlagReset.pdb Windows false $(OutDir)autoFlagReset.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;autoFlagReset_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)autoFlagReset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) autoFlagReset.def true $(OutDir)autoFlagReset.pdb Windows false $(OutDir)autoFlagReset.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;autoFlagReset_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)autoFlagReset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) autoFlagReset.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)autoFlagReset.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;autoFlagReset_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)autoFlagReset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) autoFlagReset.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)autoFlagReset.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true bzflag-2.4.2+ds1/plugins/chathistory/000077500000000000000000000000001200563112200174615ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/chathistory/Makefile.am000066400000000000000000000006011200563112200215120ustar00rootroot00000000000000lib_LTLIBRARIES = chathistory.la chathistory_la_SOURCES = chathistory.cpp chathistory_la_CPPFLAGS = -I$(top_srcdir)/include chathistory_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ chathistory.def \ chathistory.sln \ chathistory.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/chathistory/Makefile.in000066400000000000000000000461001200563112200215270ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/chathistory DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) chathistory_la_LIBADD = am_chathistory_la_OBJECTS = chathistory_la-chathistory.lo chathistory_la_OBJECTS = $(am_chathistory_la_OBJECTS) chathistory_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(chathistory_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(chathistory_la_SOURCES) DIST_SOURCES = $(chathistory_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = chathistory.la chathistory_la_SOURCES = chathistory.cpp chathistory_la_CPPFLAGS = -I$(top_srcdir)/include chathistory_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ chathistory.def \ chathistory.sln \ chathistory.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/chathistory/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/chathistory/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done chathistory.la: $(chathistory_la_OBJECTS) $(chathistory_la_DEPENDENCIES) $(chathistory_la_LINK) -rpath $(libdir) $(chathistory_la_OBJECTS) $(chathistory_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chathistory_la-chathistory.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< chathistory_la-chathistory.lo: chathistory.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chathistory_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT chathistory_la-chathistory.lo -MD -MP -MF $(DEPDIR)/chathistory_la-chathistory.Tpo -c -o chathistory_la-chathistory.lo `test -f 'chathistory.cpp' || echo '$(srcdir)/'`chathistory.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/chathistory_la-chathistory.Tpo $(DEPDIR)/chathistory_la-chathistory.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='chathistory.cpp' object='chathistory_la-chathistory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chathistory_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o chathistory_la-chathistory.lo `test -f 'chathistory.cpp' || echo '$(srcdir)/'`chathistory.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/chathistory/chathistory.cpp000066400000000000000000000161401200563112200225300ustar00rootroot00000000000000// chathistory.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include #include #include #include #include #include inline std::string tolower(const std::string& s) { std::string trans = s; for (std::string::iterator i=trans.begin(), end=trans.end(); i!=end; ++i) *i = ::tolower(*i); return trans; } std::string format(const char* fmt, ...) { va_list args; va_start(args, fmt); char temp[2048]; vsprintf(temp,fmt, args); std::string result = temp; va_end(args); return result; } std::vector tokenize(const std::string& in, const std::string &delims, const int maxTokens, const bool useQuotes){ std::vector tokens; int numTokens = 0; bool inQuote = false; std::ostringstream currentToken; std::string::size_type pos = in.find_first_not_of(delims); int currentChar = (pos == std::string::npos) ? -1 : in[pos]; bool enoughTokens = (maxTokens && (numTokens >= (maxTokens-1))); while (pos != std::string::npos && !enoughTokens) { // get next token bool tokenDone = false; bool foundSlash = false; currentChar = (pos < in.size()) ? in[pos] : -1; while ((currentChar != -1) && !tokenDone){ tokenDone = false; if (delims.find(currentChar) != std::string::npos && !inQuote) { // currentChar is a delim pos ++; break; // breaks out of while loop } if (!useQuotes){ currentToken << char(currentChar); } else { switch (currentChar){ case '\\' : // found a backslash if (foundSlash){ currentToken << char(currentChar); foundSlash = false; } else { foundSlash = true; } break; case '\"' : // found a quote if (foundSlash){ // found \" currentToken << char(currentChar); foundSlash = false; } else { // found unescaped " if (inQuote){ // exiting a quote // finish off current token tokenDone = true; inQuote = false; //slurp off one additional delimeter if possible if (pos+1 < in.size() && delims.find(in[pos+1]) != std::string::npos) { pos++; } } else { // entering a quote // finish off current token tokenDone = true; inQuote = true; } } break; default: if (foundSlash){ // don't care about slashes except for above cases currentToken << '\\'; foundSlash = false; } currentToken << char(currentChar); break; } } pos++; currentChar = (pos < in.size()) ? in[pos] : -1; } // end of getting a Token if (currentToken.str().size() > 0){ // if the token is something add to list tokens.push_back(currentToken.str()); currentToken.str(""); numTokens ++; } enoughTokens = (maxTokens && (numTokens >= (maxTokens-1))); if (enoughTokens){ break; } else{ pos = in.find_first_not_of(delims,pos); } } // end of getting all tokens -- either EOL or max tokens reached if (enoughTokens && pos != std::string::npos) { std::string lastToken = in.substr(pos); if (lastToken.size() > 0) tokens.push_back(lastToken); } return tokens; } class LastChatCommand : public bz_CustomSlashCommandHandler { public: virtual ~LastChatCommand(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *param ); }; LastChatCommand lastChatCommand; // event handler callback class ChatEvents : public bz_Plugin { public: virtual ~ChatEvents(){}; virtual const char* Name () {return "Chat History";} virtual void Init ( const char* c); virtual void Cleanup ( void ); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(ChatEvents) typedef std::vector tvChatHistory; std::map chatHistories; unsigned int maxChatLines; void ChatEvents::Init ( const char* commandLine ) { maxChatLines = 1000; if (commandLine) { int realLines = atoi(commandLine); maxChatLines = realLines; } bz_registerCustomSlashCommand("last",&lastChatCommand); bz_registerCustomSlashCommand("flushchat",&lastChatCommand); Register(bz_eRawChatMessageEvent); } void ChatEvents::Cleanup( void ) { bz_removeCustomSlashCommand("last"); bz_removeCustomSlashCommand("flushchat"); Flush(); } bool LastChatCommand::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (!fromPlayer) return false; if ( !fromPlayer->admin ) { bz_sendTextMessage(BZ_SERVER,playerID,"You must be admin to use the ChatHistory plugin"); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); if ( command == "last") { std::vector params = tokenize(message,std::string(" "),0,true); if ( params.size() <2) { bz_sendTextMessage(BZ_SERVER,playerID,"Usage: /last "); return true; } unsigned int numLines = (unsigned int)atoi(params[0].c_str()); if ( numLines == 0 ) numLines = 5; std::map::iterator itr = chatHistories.find(tolower(params[1])); if ( itr == chatHistories.end() || !itr->second.size()) { bz_sendTextMessage(BZ_SERVER,playerID,"That player has no chat history."); return true; } tvChatHistory &history = itr->second; if ( history.size() < numLines ) numLines = (unsigned int )history.size(); bz_sendTextMessage(BZ_SERVER,playerID,format("Last %d message for %s",numLines,params[1].c_str()).c_str()); for ( unsigned int i = 0; i < numLines-1; i++ ) { std::string chatItem = history[history.size()-i]; bz_sendTextMessage(BZ_SERVER,playerID,format("%d<%s> %s",i,params[1].c_str(),chatItem.c_str()).c_str()); } return true; } if ( command == "flushchat") { chatHistories.clear(); bz_sendTextMessage(BZ_SERVER,playerID,"Chat History has been flushed"); return true; } return false; } void ChatEvents::Event ( bz_EventData *eventData ) { bz_ChatEventData_V1 *chatEventData = (bz_ChatEventData_V1*)eventData; bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(chatEventData->from); std::string message = chatEventData->message.c_str(); std::string callsign = ""; if (fromPlayer) callsign = fromPlayer->callsign.c_str(); callsign = tolower(callsign); switch( eventData->eventType) { default: break; case bz_eRawChatMessageEvent: std::map::iterator itr = chatHistories.find(callsign); if (itr == chatHistories.end()) { tvChatHistory h; chatHistories[callsign] = h; } tvChatHistory &history = chatHistories[callsign]; history.push_back(message); if (history.size() > maxChatLines) history.erase(history.begin()); break; } bz_freePlayerRecord(fromPlayer); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/chathistory/chathistory.def000066400000000000000000000001561200563112200225040ustar00rootroot00000000000000LIBRARY chathistory EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/chathistory/chathistory.sln000066400000000000000000000036341200563112200225460ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "chathistory", "chathistory.vcxproj", "{B629554E-D0E9-4400-909B-7130F116E15D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 release_modern_p3|Win32 = release_modern_p3|Win32 release_modern_p3|x64 = release_modern_p3|x64 release_modern|Win32 = release_modern|Win32 release_modern|x64 = release_modern|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|Win32.ActiveCfg = Debug|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|Win32.Build.0 = Debug|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|x64.ActiveCfg = Debug|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Debug|x64.Build.0 = Debug|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern_p3|Win32.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern_p3|x64.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern_p3|x64.Build.0 = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern|Win32.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern|x64.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.release_modern|x64.Build.0 = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|Win32.ActiveCfg = Release|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|Win32.Build.0 = Release|Win32 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|x64.ActiveCfg = Release|x64 {B629554E-D0E9-4400-909B-7130F116E15D}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/chathistory/chathistory.vcxproj000066400000000000000000000321461200563112200234450ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {B629554E-D0E9-4400-909B-7130F116E15D} chathistory Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;chathistory_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)chathistory.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true $(OutDir)chathistory.pdb Windows false $(OutDir)chathistory.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;chathistory_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)chathistory.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true $(OutDir)chathistory.pdb Windows false $(OutDir)chathistory.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;chathistory_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)chathistory.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true Release/$(ProjectName).pdb Windows true true false $(OutDir)chathistory.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;chathistory_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)chathistory.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true Release/$(ProjectName).pdb Windows true true false $(OutDir)chathistory.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/customflagsample/000077500000000000000000000000001200563112200204665ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/customflagsample/Makefile.am000066400000000000000000000010611200563112200225200ustar00rootroot00000000000000lib_LTLIBRARIES = customflagsample.la customflagsample_la_SOURCES = customflagsample.cpp customflagsample_la_LDFLAGS = -module -avoid-version -shared customflagsample_la_CPPFLAGS= -I$(top_srcdir)/plugins/plugin_utils -I$(top_srcdir)/include customflagsample_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ customflagsample.def \ customflagsample.sln \ customflagsample.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/customflagsample/Makefile.in000066400000000000000000000470271200563112200225450ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/customflagsample DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) customflagsample_la_DEPENDENCIES = \ $(top_builddir)/plugins/plugin_utils/libplugin_utils.la am_customflagsample_la_OBJECTS = \ customflagsample_la-customflagsample.lo customflagsample_la_OBJECTS = $(am_customflagsample_la_OBJECTS) customflagsample_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(customflagsample_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(customflagsample_la_SOURCES) DIST_SOURCES = $(customflagsample_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = customflagsample.la customflagsample_la_SOURCES = customflagsample.cpp customflagsample_la_LDFLAGS = -module -avoid-version -shared customflagsample_la_CPPFLAGS = -I$(top_srcdir)/plugins/plugin_utils -I$(top_srcdir)/include customflagsample_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ customflagsample.def \ customflagsample.sln \ customflagsample.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/customflagsample/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/customflagsample/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done customflagsample.la: $(customflagsample_la_OBJECTS) $(customflagsample_la_DEPENDENCIES) $(customflagsample_la_LINK) -rpath $(libdir) $(customflagsample_la_OBJECTS) $(customflagsample_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/customflagsample_la-customflagsample.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< customflagsample_la-customflagsample.lo: customflagsample.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(customflagsample_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT customflagsample_la-customflagsample.lo -MD -MP -MF $(DEPDIR)/customflagsample_la-customflagsample.Tpo -c -o customflagsample_la-customflagsample.lo `test -f 'customflagsample.cpp' || echo '$(srcdir)/'`customflagsample.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/customflagsample_la-customflagsample.Tpo $(DEPDIR)/customflagsample_la-customflagsample.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='customflagsample.cpp' object='customflagsample_la-customflagsample.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(customflagsample_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o customflagsample_la-customflagsample.lo `test -f 'customflagsample.cpp' || echo '$(srcdir)/'`customflagsample.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/customflagsample/README.txt000066400000000000000000000000711200563112200221620ustar00rootroot00000000000000Simple sample plugin for showing how to use custom flags.bzflag-2.4.2+ds1/plugins/customflagsample/customflagsample.cpp000066400000000000000000000062331200563112200245440ustar00rootroot00000000000000// customflagsample.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" // event handler callback class CustomFlagSample : public bz_Plugin { public: virtual ~CustomFlagSample(){}; virtual const char* Name () {return "Custom Flag Sample";} virtual void Init ( const char* c); virtual void Cleanup ( void ); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(CustomFlagSample) void CustomFlagSample::Event(bz_EventData *eventData) { switch (eventData->eventType) { default: { // no, sir, we didn't ask for THIS!! bz_debugMessage(1, "customflagsample: received event with unrequested eventType!"); return; } case bz_eFlagTransferredEvent: { bz_FlagTransferredEventData_V1* fte = (bz_FlagTransferredEventData_V1*)eventData; if (strcmp(fte->flagType, "CF") == 0) bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Custom Flag transferred!"); break; } case bz_eFlagGrabbedEvent: { bz_FlagGrabbedEventData_V1* fge = (bz_FlagGrabbedEventData_V1*)eventData; if (strcmp(fge->flagType, "CF") == 0) bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Custom Flag grabbed!"); break; } case bz_eFlagDroppedEvent: { bz_FlagDroppedEventData_V1* fde = (bz_FlagDroppedEventData_V1*)eventData; if (strcmp(fde->flagType, "CF") == 0) bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Custom Flag dropped!"); break; } case bz_eShotFiredEvent: { bz_ShotFiredEventData_V1* sfed = (bz_ShotFiredEventData_V1*)eventData; int p = sfed->playerID; bz_BasePlayerRecord *playerRecord = bz_getPlayerByIndex(p); if (!playerRecord) break; if (playerRecord->currentFlag == "Custom Flag (+CF)") { bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "Shot fired by %s with Custom Flag!", playerRecord->callsign.c_str()); // this user must be cool, add 10 to their score bz_BasePlayerRecord* player = bz_getPlayerByIndex(p); bz_setPlayerWins(p, player->wins+10); } break; } case bz_ePlayerDieEvent: { bz_PlayerDieEventData_V1* deed = (bz_PlayerDieEventData_V1*)eventData; bz_ApiString flag = deed->flagKilledWith; int p = deed->playerID; bz_BasePlayerRecord *playerRecord = bz_getPlayerByIndex(p); if (flag == "CF") bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "Player %s killed by a player with Custom Flag!", playerRecord->callsign.c_str()); break; } } } void CustomFlagSample::Init ( const char* /*commandLine*/ ) { bz_debugMessage(4, "customflagsample plugin loaded"); // register our special custom flag bz_RegisterCustomFlag("CF", "Custom Flag", "A simple sample custom flag from the customflagsample plugin", /*eSuperShot*/0, eGoodFlag); // register events for pick up, drop, transfer, and fire Register(bz_eFlagTransferredEvent); Register(bz_eFlagGrabbedEvent); Register(bz_eFlagDroppedEvent); Register(bz_eShotFiredEvent); Register(bz_ePlayerDieEvent); } void CustomFlagSample::Cleanup ( void ) { // unregister our events Flush(); bz_debugMessage(4, "customflagsample plugin unloaded"); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/customflagsample/customflagsample.def000066400000000000000000000001721200563112200245140ustar00rootroot00000000000000LIBRARY customflagsample EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/customflagsample/customflagsample.sln000066400000000000000000000022771200563112200245620ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "customflagsample", "customflagsample.vcxproj", "{1F43077E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "..\plugin_utils\plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43077E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/customflagsample/customflagsample.vcxproj000066400000000000000000000344101200563112200254530ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1F43077E-8AF6-486F-AEDF-6B350A6CE141} customflagsample Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMFLAGSAMPLE_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)customflagsample.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) customflagsample.def true $(OutDir)customflagsample.pdb Windows false $(OutDir)customflagsample.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CUSTOMFLAGSAMPLE_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)customflagsample.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) customflagsample.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)customflagsample.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMFLAGSAMPLE_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)customflagsample.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) customflagsample.def true $(OutDir)customflagsample.pdb Windows false $(OutDir)customflagsample.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;CUSTOMFLAGSAMPLE_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)customflagsample.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) customflagsample.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)customflagsample.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {645768be-97c8-4de4-9100-111bd2808b35} false bzflag-2.4.2+ds1/plugins/fairCTF/000077500000000000000000000000001200563112200163765ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/fairCTF/Makefile.am000066400000000000000000000005571200563112200204410ustar00rootroot00000000000000lib_LTLIBRARIES = fairCTF.la fairCTF_la_SOURCES = fairCTF.cpp fairCTF_la_CPPFLAGS = -I$(top_srcdir)/include fairCTF_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ fairCTF.def \ fairCTF.sln \ fairCTF.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/fairCTF/Makefile.in000066400000000000000000000455721200563112200204600ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/fairCTF DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) fairCTF_la_LIBADD = am_fairCTF_la_OBJECTS = fairCTF_la-fairCTF.lo fairCTF_la_OBJECTS = $(am_fairCTF_la_OBJECTS) fairCTF_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(fairCTF_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(fairCTF_la_SOURCES) DIST_SOURCES = $(fairCTF_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = fairCTF.la fairCTF_la_SOURCES = fairCTF.cpp fairCTF_la_CPPFLAGS = -I$(top_srcdir)/include fairCTF_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ fairCTF.def \ fairCTF.sln \ fairCTF.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/fairCTF/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/fairCTF/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done fairCTF.la: $(fairCTF_la_OBJECTS) $(fairCTF_la_DEPENDENCIES) $(fairCTF_la_LINK) -rpath $(libdir) $(fairCTF_la_OBJECTS) $(fairCTF_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fairCTF_la-fairCTF.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< fairCTF_la-fairCTF.lo: fairCTF.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fairCTF_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fairCTF_la-fairCTF.lo -MD -MP -MF $(DEPDIR)/fairCTF_la-fairCTF.Tpo -c -o fairCTF_la-fairCTF.lo `test -f 'fairCTF.cpp' || echo '$(srcdir)/'`fairCTF.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/fairCTF_la-fairCTF.Tpo $(DEPDIR)/fairCTF_la-fairCTF.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='fairCTF.cpp' object='fairCTF_la-fairCTF.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fairCTF_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fairCTF_la-fairCTF.lo `test -f 'fairCTF.cpp' || echo '$(srcdir)/'`fairCTF.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/fairCTF/README.txt000066400000000000000000000067521200563112200201060ustar00rootroot00000000000000=============================================================================== Fair CTF: BZFlag server plug-in Original author: L4m3r =============================================================================== Fair CTF is a server plug-in that regulates CTF games for team evenness. If the team sizes become unfair, CTF is disabled and players are notified. Team flags then cannot be picked up, and previously-held team flags may be dropped. Once the teams even up again, CTF is re-enabled and the game can continue. This plug-in uses a state-based approach that was designed for 2-team CTF games. While it will still work with more teams, chances are that CTF play will be disabled most of the time. Fairness is determined by the sizes of the largest and smallest teams. For 3 or 4 team games, a more dynamic calculation of fairness would probably work better. Pacman87's "fair4CTF" is more suited to this approach. PARAMETERS: The behavior of the plug-in is configurable with four parameters: -loadplugin "/pathtoplugin/fairCTF.so,A:B:C:D" where A, B, C, and D are the following: A: The maximum difference in team size, by ratio. The ratio is determined by dividing the arithmetic difference by the size of the smallest team. Thus, if it were 10 vs. 8, the plugin would calculate the difference ratio at 2 / 8 = 0.25. Specify this as a decimal number. The default is 0.25. B: The maximum size at which a difference of one player is not fair. This compensates for the fact that a straight ratio can be a bit overzealous when there are only a few players. As before, this goes by the smaller team. If "2" was specified for this parameter, the plugin would consider 2 vs 3 unfair, but 3 vs. 4 would be acceptable. The default is 2. Note that this parameter takes precedence when the teams are off by one player- the ratio-based measurement will not even be tested. C: The absolute maximum arithmetic difference in players. Fairly straightforward. The default is 3. D: The delay, in seconds, between the time that teams become uneven and the time that all team flags get dropped. Players cannot grab team flags at all once the teams become uneven, but players who were already holding team flags may be given some time to reach their base before the flags are frozen. This helps mitigate abuse issues with players leaving the game to disrupt an impending capture. Set this to 0 to drop flags instantly. If -1 is given, flags will not force-drop at all; any team flags will be stuck wherever the players drop them (by capturing, dying, or regular dropping). Only integers are valid; The default is 5 seconds. If any of these parameters are omitted, the defaults will be used. COMMANDS: Users with adequate permissions can override the plugin to enable or disable CTF. This is done with the /ctf command. It will accept any of these arguments: /ctf on: Override the plugin and enable CTF until another user changes the setting. This basically turns off the plug-in. /ctf off: Disables CTF until the setting is changed. /ctf auto: Returns control of the game to the plugin; ends user override. The plugin will resume normal operation after this command is issued. Add the perm "FAIRCTF" to any groups who need to be able to use the command. These command will publicly announce changes (and who made them) only when they change the state of CTF. For example, if CTF is enabled, /ctf on will not create an announcement, but /ctf off will. The admin channel will always be notified of any change, however. bzflag-2.4.2+ds1/plugins/fairCTF/fairCTF.cpp000066400000000000000000000227551200563112200203730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "bzfsAPI.h" class fairCTF : public bz_Plugin, public bz_CustomSlashCommandHandler { public: virtual const char* Name (){return "Fair CTF";} virtual void Init (const char* config); virtual void Cleanup(void ); virtual void Event (bz_EventData *eventData); virtual bool SlashCommand (int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *params); virtual void DropTeamFlag(int playerID); virtual void SetDropTime(); virtual void UpdateState(bz_eTeamType teamLeaving); virtual bool isEven(bz_eTeamType teamLeaving); bool allowCTF; bool autoMode; float max_ratio; int max_gap_by_1; int max_gap; int drop_delay; double droptime; }; BZ_PLUGIN(fairCTF) void fairCTF::Init ( const char* config ) { // Initialize defaults allowCTF = true; autoMode = true; max_ratio = .25; max_gap_by_1 = 2; max_gap = 3; drop_delay = 5; // Parse out args std::string rawparams = config; std::string params[4]; params[0] = ""; params[1] = ""; params[2] = ""; params[3] = ""; unsigned int n = 0; for(unsigned int i = 0; i < rawparams.length(); i++) { if (rawparams.at(i) == ':') { n++; if (n > 3) { break; } } else { params[n] += rawparams.at(i); } } if(params[0].length() > 0) { float tempratio = atof(params[0].c_str()); if (tempratio > 0.0) { max_ratio = tempratio; } } if(params[1].length() > 0) { int tempmax1gap = atoi(params[1].c_str()); if (tempmax1gap > 0) { max_gap_by_1 = tempmax1gap; } } if(params[2].length() > 0) { int tempmaxgap = atoi(params[2].c_str()); if (tempmaxgap > 0) { max_gap = tempmaxgap; } } if(params[3].length() > 0) { int tempdelay = atoi(params[3].c_str()); if (tempdelay > 0) { drop_delay = tempdelay; } } Register(bz_eAllowFlagGrab); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerPartEvent); Register(bz_eTickEvent); bz_registerCustomSlashCommand ("ctf", this); bz_debugMessage(4,"fairCTF plugin loaded"); UpdateState(eNoTeam); } void fairCTF::Cleanup() { Flush(); bz_removeCustomSlashCommand ("ctf"); bz_debugMessage(4,"fairCTF plugin unloaded"); } void fairCTF::Event(bz_EventData *eventData) { if (eventData->eventType == bz_eAllowFlagGrab) { bz_AllowFlagGrabData_V1* grabData = (bz_AllowFlagGrabData_V1*)eventData; if (!allowCTF) { // Don't allow a team flag grab std::string flagtype = bz_getName(grabData->flagID).c_str(); if (flagtype == "R*" || flagtype == "G*" || flagtype == "B*" || flagtype == "P*") { grabData->allow = false; bz_sendTextMessage (BZ_SERVER, grabData->playerID, "CTF play is currently disabled."); } } } else if (eventData->eventType == bz_ePlayerJoinEvent) { UpdateState(eNoTeam); } else if (eventData->eventType == bz_ePlayerPartEvent) { bz_PlayerJoinPartEventData_V1* partData = (bz_PlayerJoinPartEventData_V1*)eventData; // Need to compensate for that leaving player. UpdateState(partData->record->team); } else if (eventData->eventType == bz_eTickEvent) { if (droptime != 0.0 && bz_getCurrentTime() >= droptime) { // Time to drop any team flags. bz_APIIntList* pl = bz_getPlayerIndexList(); for (unsigned int x = 0; x < pl->size(); x++) { DropTeamFlag(pl->get(x)); } droptime = 0.0; } } else { // Huh? return; } } bool fairCTF::SlashCommand (int playerID, bz_ApiString /*command*/, bz_ApiString message, bz_APIStringList * /*params*/) { std::string cs = "UNKNOWN"; bz_BasePlayerRecord* pr = bz_getPlayerByIndex(playerID); if (pr != NULL) { cs = pr->callsign.c_str(); bz_freePlayerRecord (pr); } if (!bz_hasPerm(playerID, "FAIRCTF")) { bz_sendTextMessage(BZ_SERVER, playerID, (cs + ", you do not have permission to use the /ctf command.").c_str()); } else { if (message == "on") { if (!autoMode && allowCTF) { bz_sendTextMessage(BZ_SERVER, playerID, "CTF is already set to \"on\"."); } else { autoMode = false; bz_sendTextMessage (BZ_SERVER, eAdministrators, ("CTF setting has been changed to \"on\" by " + cs + ".").c_str()); if (!allowCTF) { bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, ("CTF has been enabled by " + cs + ".").c_str()); allowCTF = true; droptime = 0.0; } } } else if (message == "off") { if (!autoMode && !allowCTF) { bz_sendTextMessage(BZ_SERVER, playerID, "CTF is already set to \"off\"."); } else { autoMode = false; bz_sendTextMessage (BZ_SERVER, eAdministrators, ("CTF setting has been changed to \"off\" by " + cs + ".").c_str()); if (allowCTF) { bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, ("CTF has been disabled by " + cs + ".").c_str()); allowCTF = false; SetDropTime(); } } } else if (message == "auto") { if (autoMode) { bz_sendTextMessage(BZ_SERVER, playerID, "CTF is already set to \"auto\"."); } else { autoMode = true; bz_sendTextMessage (BZ_SERVER, eAdministrators, ("CTF setting has been changed to \"auto\" by " + cs + ".").c_str()); UpdateState(eNoTeam); } } else { bz_sendTextMessage (BZ_SERVER, playerID, "Usage: /ctf on|off|auto"); } } return true; } void fairCTF::DropTeamFlag(int playerID) { bz_BasePlayerRecord* droppr = bz_getPlayerByIndex (playerID); if (droppr != NULL) { // Are they carrying a team flag? if (droppr->currentFlag == "Red team flag" || droppr->currentFlag == "Green team flag" || droppr->currentFlag == "Blue team flag" || droppr->currentFlag == "Purple team flag") { bz_removePlayerFlag(playerID); bz_sendTextMessage (BZ_SERVER, playerID, "CTF play is currently disabled."); } bz_freePlayerRecord(droppr); } } void fairCTF::UpdateState(bz_eTeamType teamLeaving) { if (autoMode) { bool fair = isEven(teamLeaving); if (fair && !allowCTF) { allowCTF = true; droptime = 0.0; bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "Team sizes are sufficiently even. CTF play is now enabled."); } else if (!fair && allowCTF) { allowCTF = false; bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Team sizes are uneven. CTF play is now disabled."); SetDropTime(); } } } void fairCTF::SetDropTime() { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList(playerList); bool TeamFlagIsCarried = false; // is any tank carrying a team flag? for (unsigned int i = 0; i < playerList->size(); i++) { const char *FlagHeld = bz_getPlayerFlag((*playerList)[i]); if (FlagHeld != NULL && (strcmp(FlagHeld, "R*") == 0 || strcmp(FlagHeld, "G*") == 0 || strcmp(FlagHeld, "B*") == 0 || strcmp(FlagHeld, "P*") == 0)) { TeamFlagIsCarried = true; break; } } bz_deleteIntList(playerList); // announce drop delay only if some tank is carrying a team flag if (TeamFlagIsCarried) { if (drop_delay >= 0) { droptime = bz_getCurrentTime() + (double)drop_delay; if (drop_delay > 1) { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, bz_format("Currently-held team flags will be dropped in %d seconds.", drop_delay)); } else { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Currently-held team flags will be dropped in 1 second."); } } else { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Currently-held team flags will not be dropped."); } } } bool fairCTF::isEven(bz_eTeamType teamLeaving) { int teamsizes[4]; teamsizes[0] = bz_getTeamCount (eRedTeam); teamsizes[1] = bz_getTeamCount (eGreenTeam); teamsizes[2] = bz_getTeamCount (eBlueTeam); teamsizes[3] = bz_getTeamCount (ePurpleTeam); int leavingTeamIndex = (int)teamLeaving; if (leavingTeamIndex >= 1 && leavingTeamIndex <= 4) { // Decrement the team count for the player that's leaving the game. teamsizes[leavingTeamIndex - 1]--; } //check fairness int smallestTeam = 10000; //impossibly high int largestTeam = 0; for (int x = 0; x < 4; x++) { if (teamsizes[x] > largestTeam) { largestTeam = teamsizes[x]; } if (teamsizes[x] != 0 && teamsizes[x] < smallestTeam) { smallestTeam = teamsizes[x]; } } //check differences and ratios if (smallestTeam == 10000 || largestTeam == smallestTeam) //equal, or server has no team tanks { return true; } if (smallestTeam <= max_gap_by_1) // user-defined cap on a difference of 1 { return false; } if (largestTeam - smallestTeam == 1) //after UD limit { return true; } if ((static_cast (largestTeam - smallestTeam)) / smallestTeam > max_ratio) //greater than specified gap { return false; } if (largestTeam - smallestTeam >= max_gap) { return false; } return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/fairCTF/fairCTF.def000066400000000000000000000002351200563112200203340ustar00rootroot00000000000000LIBRARY fairCTF DESCRIPTION 'fairCTF Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/fairCTF/fairCTF.sln000066400000000000000000000023151200563112200203730ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fairCTF", "fairCTF.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.ActiveCfg = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|x64.Build.0 = Debug|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.ActiveCfg = Release|x64 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/fairCTF/fairCTF.vcxproj000066400000000000000000000332751200563112200213030ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {A109E817-5A7C-4274-87A3-7281A8C20AE4} fairCTF Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;fairCTF_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)fairCTF.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fairCTF.def true $(OutDir)fairCTF.pdb Windows false $(OutDir)fairCTF.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;fairCTF_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fairCTF.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fairCTF.def true $(OutDir)fairCTF.pdb Windows false $(OutDir)fairCTF.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;fairCTF_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fairCTF.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fairCTF.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)fairCTF.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;fairCTF_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fairCTF.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fairCTF.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)fairCTF.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true bzflag-2.4.2+ds1/plugins/fastmap/000077500000000000000000000000001200563112200165535ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/fastmap/Makefile.am000066400000000000000000000005311200563112200206060ustar00rootroot00000000000000lib_LTLIBRARIES = fastmap.la fastmap_la_SOURCES = fastmap.cpp fastmap_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ fastmap.def \ fastmap.sln \ fastmap.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/fastmap/Makefile.in000066400000000000000000000435601200563112200206300ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/fastmap DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) fastmap_la_LIBADD = am_fastmap_la_OBJECTS = fastmap.lo fastmap_la_OBJECTS = $(am_fastmap_la_OBJECTS) fastmap_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(fastmap_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(fastmap_la_SOURCES) DIST_SOURCES = $(fastmap_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = fastmap.la fastmap_la_SOURCES = fastmap.cpp fastmap_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ fastmap.def \ fastmap.sln \ fastmap.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/fastmap/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/fastmap/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done fastmap.la: $(fastmap_la_OBJECTS) $(fastmap_la_DEPENDENCIES) $(fastmap_la_LINK) -rpath $(libdir) $(fastmap_la_OBJECTS) $(fastmap_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fastmap.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/fastmap/README.txt000066400000000000000000000005271200563112200202550ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : fastmap Project Overview ======================================================================== This is the fastmap plugin. It allows clients to download the server map via HTTP, which is much faster than the rate-limited standard method. bzflag-2.4.2+ds1/plugins/fastmap/fastmap.cpp000066400000000000000000000051611200563112200207150ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // httpTest.cpp : Defines the entry point for the DLL application. // #include #include #include "bzfsAPI.h" #include "bzfsHTTPAPI.h" class Fastmap : public bzhttp_VDir, public bz_Plugin { public: Fastmap(): bzhttp_VDir(),bz_Plugin(), mapData(NULL), mapDataSize(0) {} virtual ~Fastmap() { Unloadable = false; if (mapData) free(mapData); mapData = NULL; }; const char* Name () { return "Fast Map";} virtual const char* VDirName(){return "fastmap";} virtual const char* VDirDescription(){return "Deploys maps over HTTP";} void Init(const char* /*commandLine*/) { bz_debugMessage(4,"Fastmap plugin loaded"); Register(bz_eWorldFinalized); bzhttp_RegisterVDir(this,this); } void Cleanup(void) { Flush(); bzhttp_RemoveAllVdirs(this); } virtual bzhttp_ePageGenStatus GeneratePage (const bzhttp_Request &, bzhttp_Responce &responce) { responce.ReturnCode = e200OK; responce.DocumentType = eOctetStream; if (mapData && mapDataSize) { responce.MD5Hash = md5; responce.AddBodyData(mapData,mapDataSize); } else { responce.AddBodyData("404 Fastmap not Valid"); responce.ReturnCode = e404NotFound; } return ePageDone; } virtual void Event(bz_EventData * eventData) { if (eventData->eventType == bz_eWorldFinalized) { if (mapData) free(mapData); mapData = NULL; mapDataSize = 0; if (!bz_getPublic() || bz_getClientWorldDownloadURL().size()) return; mapDataSize = bz_getWorldCacheSize(); if (!mapDataSize) return; mapData = (char *) malloc(mapDataSize); if (!mapData) { mapDataSize = 0; return; } bz_getWorldCacheData((unsigned char*)mapData); md5 = bz_MD5(mapData,mapDataSize); const char *URL = BaseURL.c_str(); bz_debugMessagef(2, "FastMap: Running local HTTP server for maps using URL %s", URL); bz_setClientWorldDownloadURL(URL); } } char *mapData; size_t mapDataSize; std::string md5; }; BZ_PLUGIN(Fastmap) // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/fastmap/fastmap.def000066400000000000000000000001511200563112200206630ustar00rootroot00000000000000LIBRARY fastmap EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/fastmap/fastmap.sln000066400000000000000000000023151200563112200207250ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fastmap", "fastmap.vcxproj", "{F081A46D-3992-492A-BF68-05C18957A326}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F081A46D-3992-492A-BF68-05C18957A326}.Debug|Win32.ActiveCfg = Debug|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|Win32.Build.0 = Debug|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|x64.ActiveCfg = Debug|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Debug|x64.Build.0 = Debug|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Release|Win32.ActiveCfg = Release|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Release|Win32.Build.0 = Release|Win32 {F081A46D-3992-492A-BF68-05C18957A326}.Release|x64.ActiveCfg = Release|x64 {F081A46D-3992-492A-BF68-05C18957A326}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/fastmap/fastmap.vcxproj000066400000000000000000000336441200563112200216350ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {F081A46D-3992-492A-BF68-05C18957A326} Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;fastmap_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)fastmap.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fastmap.def true $(OutDir)fastmap.pdb Windows false $(OutDir)fastmap.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;fastmap_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fastmap.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fastmap.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)fastmap.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;fastmap_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fastmap.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fastmap.def true $(OutDir)fastmap.pdb Windows false $(OutDir)fastmap.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;fastmap_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)fastmap.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) fastmap.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)fastmap.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/flagStay/000077500000000000000000000000001200563112200166725ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/flagStay/Makefile.am000066400000000000000000000005671200563112200207360ustar00rootroot00000000000000lib_LTLIBRARIES = flagStay.la flagStay_la_SOURCES = flagStay.cpp flagStay_la_CPPFLAGS = -I$(top_srcdir)/include flagStay_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ flagStay.def \ flagStay.sln \ flagStay.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/flagStay/Makefile.in000066400000000000000000000456571200563112200207600ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/flagStay DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) flagStay_la_LIBADD = am_flagStay_la_OBJECTS = flagStay_la-flagStay.lo flagStay_la_OBJECTS = $(am_flagStay_la_OBJECTS) flagStay_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(flagStay_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(flagStay_la_SOURCES) DIST_SOURCES = $(flagStay_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = flagStay.la flagStay_la_SOURCES = flagStay.cpp flagStay_la_CPPFLAGS = -I$(top_srcdir)/include flagStay_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ flagStay.def \ flagStay.sln \ flagStay.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/flagStay/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/flagStay/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done flagStay.la: $(flagStay_la_OBJECTS) $(flagStay_la_DEPENDENCIES) $(flagStay_la_LINK) -rpath $(libdir) $(flagStay_la_OBJECTS) $(flagStay_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flagStay_la-flagStay.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< flagStay_la-flagStay.lo: flagStay.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flagStay_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT flagStay_la-flagStay.lo -MD -MP -MF $(DEPDIR)/flagStay_la-flagStay.Tpo -c -o flagStay_la-flagStay.lo `test -f 'flagStay.cpp' || echo '$(srcdir)/'`flagStay.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/flagStay_la-flagStay.Tpo $(DEPDIR)/flagStay_la-flagStay.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='flagStay.cpp' object='flagStay_la-flagStay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flagStay_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o flagStay_la-flagStay.lo `test -f 'flagStay.cpp' || echo '$(srcdir)/'`flagStay.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/flagStay/README.txt000066400000000000000000000005111200563112200203650ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : flagStay Project Overview ======================================================================== This is the flagStay plugin. It may be configured to prevent certain flags from being carried out of defined battlefield zones. bzflag-2.4.2+ds1/plugins/flagStay/flagStay.cpp000066400000000000000000000122261200563112200211530ustar00rootroot00000000000000// flagStay.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include #include class FlagStayZoneHandler : public bz_CustomMapObjectHandler { public: virtual bool MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ); }; FlagStayZoneHandler flagStayZoneHandler; class EventHandler : public bz_Plugin { public: virtual const char* Name (){return "Flag Stay Zones";} virtual void Init ( const char* cl ); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(EventHandler) void EventHandler::Init ( const char* /*commandLine*/ ) { bz_registerCustomMapObject("FLAGSTAYZONE",&flagStayZoneHandler); Register(bz_ePlayerUpdateEvent); } void EventHandler::Cleanup ( void ) { Flush(); bz_removeCustomMapObject("FLAGSTAYZONE"); } class FlagStayZone { public: FlagStayZone() { box = false; xMax = xMin = yMax = yMin = zMax = zMin = rad = 0; } bool box; float xMax,xMin,yMax,yMin,zMax,zMin; float rad; std::string message; bool pointIn ( float pos[3] ) { if ( box ) { if ( pos[0] > xMax || pos[0] < xMin ) return false; if ( pos[1] > yMax || pos[1] < yMin ) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } else { float vec[3]; vec[0] = pos[0]-xMax; vec[1] = pos[1]-yMax; vec[2] = pos[2]-zMax; float dist = sqrt(vec[0]*vec[0]+vec[1]*vec[1]); if ( dist > rad) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } return true; } bool checkFlag ( const char* flag ) { for ( unsigned int i = 0; i < flagList.size(); i++ ) { if ( flagList[i] == flag ) return true; } return false; } std::vector flagList; }; std::vector zoneList; bool FlagStayZoneHandler::MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ) { if (object != "FLAGSTAYZONE" || !data) return false; FlagStayZone newZone; // parse all the chunks for ( unsigned int i = 0; i < data->data.size(); i++ ) { std::string line = data->data.get(i).c_str(); bz_APIStringList *nubs = bz_newStringList(); nubs->tokenize(line.c_str()," ",0,true); if ( nubs->size() > 0) { std::string key = bz_toupper(nubs->get(0).c_str()); if ( key == "BBOX" && nubs->size() > 6) { newZone.box = true; newZone.xMin = (float)atof(nubs->get(1).c_str()); newZone.xMax = (float)atof(nubs->get(2).c_str()); newZone.yMin = (float)atof(nubs->get(3).c_str()); newZone.yMax = (float)atof(nubs->get(4).c_str()); newZone.zMin = (float)atof(nubs->get(5).c_str()); newZone.zMax = (float)atof(nubs->get(6).c_str()); } else if ( key == "CYLINDER" && nubs->size() > 5) { newZone.box = false; newZone.rad = (float)atof(nubs->get(5).c_str()); newZone.xMax =(float)atof(nubs->get(1).c_str()); newZone.yMax =(float)atof(nubs->get(2).c_str()); newZone.zMin =(float)atof(nubs->get(3).c_str()); newZone.zMax =(float)atof(nubs->get(4).c_str()); } else if ( key == "FLAG" && nubs->size() > 1) { std::string flag = nubs->get(1).c_str(); newZone.flagList.push_back(flag); } else if ( key == "MESSAGE" && nubs->size() > 1 ) { newZone.message = nubs->get(1).c_str(); } } bz_deleteStringList(nubs); } zoneList.push_back(newZone); return true; } std::map playerIDToZoneMap; void EventHandler::Event ( bz_EventData *eventData ) { float pos[3] = {0}; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: pos[0] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[0]; pos[1] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[1]; pos[2] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[2]; playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; case bz_eShotFiredEvent: pos[0] = ((bz_ShotFiredEventData_V1*)eventData)->pos[0]; pos[1] = ((bz_ShotFiredEventData_V1*)eventData)->pos[1]; pos[2] = ((bz_ShotFiredEventData_V1*)eventData)->pos[2]; playerID = ((bz_ShotFiredEventData_V1*)eventData)->playerID; break; default: return; } const char* flagAbrev = bz_getPlayerFlag(playerID); if (!flagAbrev) return; std::vector validZones; // check and see if a zone cares about the current flag for ( unsigned int i = 0; i < zoneList.size(); i++ ) { if ( zoneList[i].checkFlag(flagAbrev) ) validZones.push_back(&zoneList[i]); } // Check each zone for this flag to see if we are in one bool insideOne = false; for ( unsigned int i = 0; i < validZones.size(); i++ ) { if ( validZones[i]->pointIn(pos) ) { insideOne = true; playerIDToZoneMap[playerID] = i; } } // if they have taken the flag out of a zone, pop it. if (!insideOne && validZones.size() > 0) { int lastZone = -1; if ( playerIDToZoneMap.find(playerID) != playerIDToZoneMap.end() ) lastZone = playerIDToZoneMap[playerID]; bz_removePlayerFlag(playerID); if (lastZone != -1 && zoneList[lastZone].message.size()) bz_sendTextMessage(BZ_SERVER,playerID,zoneList[lastZone].message.c_str()); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/flagStay/flagStay.def000066400000000000000000000001511200563112200211210ustar00rootroot00000000000000LIBRARY flagStay EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersionbzflag-2.4.2+ds1/plugins/flagStay/flagStay.sln000066400000000000000000000020631200563112200211630ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flagStay", "flagStay.vcxproj", "{1FF80896-DD88-4992-8DB1-7070924091BF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|Win32.ActiveCfg = Debug|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|Win32.Build.0 = Debug|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|x64.ActiveCfg = Debug|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Debug|x64.Build.0 = Debug|x64 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|Win32.ActiveCfg = Release|Win32 {1FF80896-DD88-4992-8DB1-7070924091BF}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/flagStay/flagStay.vcxproj000066400000000000000000000326351200563112200220720ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1FF80896-DD88-4992-8DB1-7070924091BF} flagStay Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;flagStay_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)flagStay.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) flagStay.def true $(OutDir)flagStay.pdb Windows false $(OutDir)flagStay.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;flagStay_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)flagStay.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) flagStay.def true $(OutDir)flagStay.pdb Windows false $(OutDir)flagStay.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;flagStay_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)flagStay.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) flagStay.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)flagStay.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;flagStay_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)flagStay.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) flagStay.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)flagStay.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/hiddenAdmin/000077500000000000000000000000001200563112200173245ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/hiddenAdmin/Makefile.am000066400000000000000000000006011200563112200213550ustar00rootroot00000000000000lib_LTLIBRARIES = hiddenAdmin.la hiddenAdmin_la_SOURCES = hiddenAdmin.cpp hiddenAdmin_la_CPPFLAGS = -I$(top_srcdir)/include hiddenAdmin_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ hiddenAdmin.def \ hiddenAdmin.sln \ hiddenAdmin.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/hiddenAdmin/Makefile.in000066400000000000000000000461001200563112200213720ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/hiddenAdmin DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) hiddenAdmin_la_LIBADD = am_hiddenAdmin_la_OBJECTS = hiddenAdmin_la-hiddenAdmin.lo hiddenAdmin_la_OBJECTS = $(am_hiddenAdmin_la_OBJECTS) hiddenAdmin_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(hiddenAdmin_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(hiddenAdmin_la_SOURCES) DIST_SOURCES = $(hiddenAdmin_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = hiddenAdmin.la hiddenAdmin_la_SOURCES = hiddenAdmin.cpp hiddenAdmin_la_CPPFLAGS = -I$(top_srcdir)/include hiddenAdmin_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ hiddenAdmin.def \ hiddenAdmin.sln \ hiddenAdmin.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/hiddenAdmin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/hiddenAdmin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done hiddenAdmin.la: $(hiddenAdmin_la_OBJECTS) $(hiddenAdmin_la_DEPENDENCIES) $(hiddenAdmin_la_LINK) -rpath $(libdir) $(hiddenAdmin_la_OBJECTS) $(hiddenAdmin_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hiddenAdmin_la-hiddenAdmin.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< hiddenAdmin_la-hiddenAdmin.lo: hiddenAdmin.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hiddenAdmin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hiddenAdmin_la-hiddenAdmin.lo -MD -MP -MF $(DEPDIR)/hiddenAdmin_la-hiddenAdmin.Tpo -c -o hiddenAdmin_la-hiddenAdmin.lo `test -f 'hiddenAdmin.cpp' || echo '$(srcdir)/'`hiddenAdmin.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/hiddenAdmin_la-hiddenAdmin.Tpo $(DEPDIR)/hiddenAdmin_la-hiddenAdmin.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='hiddenAdmin.cpp' object='hiddenAdmin_la-hiddenAdmin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hiddenAdmin_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hiddenAdmin_la-hiddenAdmin.lo `test -f 'hiddenAdmin.cpp' || echo '$(srcdir)/'`hiddenAdmin.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/hiddenAdmin/hiddenAdmin.cpp000066400000000000000000000015311200563112200222340ustar00rootroot00000000000000// hiddenAdmin.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include // event handler callback class HiddenAdmin : public bz_Plugin { public: virtual const char* Name(){return "Hidden Admins";} virtual void Init(const char* config); virtual void Event ( bz_EventData *eventData ); protected: }; BZ_PLUGIN(HiddenAdmin) void HiddenAdmin::Init(const char* /*commandLine*/ ) { Register(bz_eGetPlayerInfoEvent); } void HiddenAdmin::Event ( bz_EventData *eventData ) { if (eventData->eventType != bz_eGetPlayerInfoEvent) return; bz_GetPlayerInfoEventData_V1 * infoData = (bz_GetPlayerInfoEventData_V1*)eventData; infoData->admin = false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/hiddenAdmin/hiddenAdmin.def000066400000000000000000000001641200563112200222110ustar00rootroot00000000000000LIBRARY playHistoryTracker EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/hiddenAdmin/hiddenAdmin.sln000066400000000000000000000023251200563112200222500ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hiddenAdmin", "hiddenAdmin.vcxproj", "{2EAF7655-AE86-4407-8262-43496581E5B2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|Win32.ActiveCfg = Debug|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|Win32.Build.0 = Debug|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|x64.ActiveCfg = Debug|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Debug|x64.Build.0 = Debug|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|Win32.ActiveCfg = Release|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|Win32.Build.0 = Release|Win32 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|x64.ActiveCfg = Release|x64 {2EAF7655-AE86-4407-8262-43496581E5B2}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/hiddenAdmin/hiddenAdmin.vcxproj000066400000000000000000000332751200563112200231570ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {2EAF7655-AE86-4407-8262-43496581E5B2} hiddenAdmin Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;hiddenAdmin_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)hiddenAdmin.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true $(OutDir)hiddenAdmin.pdb Windows false $(OutDir)hiddenAdmin.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;hiddenAdmin_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)hiddenAdmin.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true $(OutDir)hiddenAdmin.pdb Windows false $(OutDir)hiddenAdmin.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;hiddenAdmin_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)hiddenAdmin.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true Release/$(ProjectName).pdb Windows true true false $(OutDir)hiddenAdmin.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;hiddenAdmin_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)hiddenAdmin.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) true Release/$(ProjectName).pdb Windows true true false $(OutDir)hiddenAdmin.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/keepaway/000077500000000000000000000000001200563112200167265ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/keepaway/Makefile.am000066400000000000000000000006441200563112200207660ustar00rootroot00000000000000lib_LTLIBRARIES = keepaway.la keepaway_la_SOURCES = keepaway.cpp keepaway_la_CPPFLAGS = -I$(top_srcdir)/include keepaway_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ keepaway.def \ keepaway.sln \ keepaway.vcxproj \ keepaway_admin.txt \ keepaway_rules.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/keepaway/Makefile.in000066400000000000000000000457341200563112200210100ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/keepaway DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) keepaway_la_LIBADD = am_keepaway_la_OBJECTS = keepaway_la-keepaway.lo keepaway_la_OBJECTS = $(am_keepaway_la_OBJECTS) keepaway_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(keepaway_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(keepaway_la_SOURCES) DIST_SOURCES = $(keepaway_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = keepaway.la keepaway_la_SOURCES = keepaway.cpp keepaway_la_CPPFLAGS = -I$(top_srcdir)/include keepaway_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ keepaway.def \ keepaway.sln \ keepaway.vcxproj \ keepaway_admin.txt \ keepaway_rules.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/keepaway/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/keepaway/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done keepaway.la: $(keepaway_la_OBJECTS) $(keepaway_la_DEPENDENCIES) $(keepaway_la_LINK) -rpath $(libdir) $(keepaway_la_OBJECTS) $(keepaway_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keepaway_la-keepaway.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< keepaway_la-keepaway.lo: keepaway.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(keepaway_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT keepaway_la-keepaway.lo -MD -MP -MF $(DEPDIR)/keepaway_la-keepaway.Tpo -c -o keepaway_la-keepaway.lo `test -f 'keepaway.cpp' || echo '$(srcdir)/'`keepaway.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/keepaway_la-keepaway.Tpo $(DEPDIR)/keepaway_la-keepaway.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='keepaway.cpp' object='keepaway_la-keepaway.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(keepaway_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o keepaway_la-keepaway.lo `test -f 'keepaway.cpp' || echo '$(srcdir)/'`keepaway.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/keepaway/README.txt000066400000000000000000000206101200563112200204230ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : Keep Away Project Overview ======================================================================== keepaway plugin Author: LouMan Credit to JeffM2501 for custom map object code (from flagStay plugin), which I have modified to fit this application. Also, credit to Thumper for brilliant idea :) Description: The plugin will create a Keep Away game mode in which a player/team must hold a "Keep Away" flag (defined in map file) for a defined amount of time; if held long enough all other teams (or players) are killed. There are 2 modes of play available: 1) Teamplay: if a player from a team holds the Keep Away flag long enough, all other teams (except his/hers) are killed. Score credits are given to the team, but not given to player that kept the flag. If a rogue manages to hold the Keep Away flag long enough in this mode, all players (except him/her) are killed and he/she gets individual score credit for all of the kills. 2) No teamplay: for this mode it is recommended to set up a map with only rogue players allowed. If a player holds the Keep Away flag long enough, all other players are killed and score credit is given to the player who held the Keep Away flag for all of the kills. Obviously, if teams are allowed in this mode, it would result in repeated team kills - no fun. Basically this is a free-for-all mode for Keep Away. Plugin features/notes: * Server messaging for Keep Away flag is free (which one to hold), Keep Away flag held (by whom and how long they have to hold it), regular countdown warnings while someone is holding the Keep Away Flag (every minute and 30, 20 & 10 seconds until flag is held long enough), and successful Keep Away announcements. Long callsigns are truncated in server messages. * Players cannot pause while holding Keep Away flag - if they try the flag will be taken away with a warning message not to do so. * Keep Away will be disabled until there are 2 or more teams, 2 or more rogue players, or at least 1 rogue player and 1 or more team player(s). * It is highly recommended to add exactly 1 flag to the map file for each type of flag that might be considered the Keep Away flag. Duplicate Keep Away flags has not been tested. * There is an autotime function (optional) that will reduce the time to hold the Keep Away flag, based on the number of players in the game. With this option enabled, the time is reduced a certain percentage (default is 3%) with every additional player (after 2) to a certain minimum percentage (default is 50%) of the original specified time to hold. This means that (with default settings) the time to hold would not be affected for 2 players, but would be reduced by 3% for 3 players, 6% for 4 players and so on. The minimum 50% of the original time to hold would be reached at about 19 players and would remain at 50%, no matter how many additional players were to join after that. * Local sounds for dropped Keep Away flag, team grab, successful Keep Away, etc. are incorporated into plugin. In general, these sounds correspond to standard CTF sounds. * There is a "/kas " command available to all players to send a message to person holding the Keep Away flag. * There is a "/kaf" command available to all players that will return the current Keep Away flag to find. ------------------------------------------------------------------------------------- The parameters of the Keep Away (keepaway) map definition are follows: teamplay Optional. This will enable the teamplay mode of Keep Away (see above). If not included, teamplay is disabled and it becomes as basic free for all Keep Away mode. holdtime Optional. This defines the time (in seconds) required to hold the Keep Away flag before a player is declared winner and other teams/players are zapped. If not included, the default setting is 120 seconds (2 minutes). The limits of this setting are controlled to a minimum of 1 second and a maximum of 7200 seconds. autotime Optional. This will enable the automatic time reduction feature of the plugin that will reduce the time to hold the Keep Away flag, based on the number of players in the game (see description above). The multiplier field will set the hold time reduction percentage per new player. The minimum multiplier field will set the minimum hold time reduction percentage. If these fields are left blank, the default multiplier = 3% and the default minimum multiplier = 50%. The multiplier fields should be between 1 and 99 (percent). forcedflags Optional. This will force sequential Keep Away flag selection based on flags defined in flag parameter (below). If a player is holding the next flag to be used as Keep Away flag, it is taken away from him/her with a message apologizing for the take ("Sorry, server needs your flag for Keep Away :/"). If this parameter is not included, the plugin will take away the winner's flag and search for the next available Keep Away flag that is not held. If it cannot find one, it will repeat the Keep Away flag that was just used. keepawayflags ... Required. This will define which flags the plugin will cycle through as Keep Away flags. At least one is required. If no flags are defined, the plugin will be effectively disabled. Remember, the plugin has not been tested for duplicate flags on the map, so it is highly recommended to explicitly define only 1 flag per Keep Away flag type to be present on map. nosound Optional. This will disable sounds associated with Keep Away plugin (some clients seem to have issues with this feature). noflagreset Optional. This will disable automatic flag reset function of the Keep Away plugin (enabled as default). ------------------------------------------------------------------------------------- Examples of map (.bzw) entries: keepaway holdtime 90 autotime 2 40 keepawayflags SB G TH MG GM L forcedflags teamplay noflagreset end This would set up a Keep Away game using Super Bullet, Genocide, Thief, Machine Gun, Guided Missile and Laser flags for Keep Away flags. Teamplay would be enabled and the initial required time to hold the Keep Away flag would be 90 seconds (1.5 minutes). Time to hold would automatically adjust downward with new players; 2% per new player after 2, to a minimum of 40% of the original time to hold (36 seconds). The automatic flag reset function of the plugin would be disabled. keepaway holdtime 60 keepawayflags IB PZ US RO teamplay nosound end This would set up a Keep Away game using Invisible Bullet, Phantom Zone, Useless and Reverse Only flags for Keep Away flags. Teamplay would be enabled and the initial required time to hold the Keep Away flag would be 60 seconds (1 minute). Time to hold would not automatically adjust downward with new players - it would remain at 60 seconds. The sounds associated with Keep Away would be disabled. Obviously, the plugin must be loaded to the server at startup, or it will not recognize these map parameters. ------------------------------------------------------------------------------------- There are two commands available to all players with the plugin: "kas " - this will send message to the player holding the Keep Away flag. "kaf" - this will return the current Keep Away flag to be found & who holds it. There are several administrator commands available with the plugin: "kaon" - this will turn Keep Away mode on, if turned off previously. "kaoff" - this will turn Keep Away mode off for normal gameplay. "katimemult" - this will set auto time multiplier (per new player). "katimemultmin" - this will set minimum auto time multiplier. "kaautotimeon" - this will enable the autotime function. "kaautotimeoff" - this will disable the autotime function. "katime " - this will change Keep Away hold time 1 -> 7200 seconds. "kastatus" - this will return the status of the plugin modes, times, etc. "kaffon" - this will turn on forced flags. "kaffoff" - this will turn off forced flags. "kaf+" - advance to next Keep Away flag. "kasoundon" - enables Keep Away sounds. "kasoundoff" - disables Keep Away sounds. "kaflagreseton" - enables Keep Away sounds. "kaflagresetoff" - disables Keep Away sounds. ------------------------------------------------------------------------------------- Please report any bugs or issues with this plugin to LouMan, and good luck. bzflag-2.4.2+ds1/plugins/keepaway/keepaway.cpp000066400000000000000000000764031200563112200212520ustar00rootroot00000000000000// keepaway.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" #include #include class KeepAwayMapHandler : public bz_CustomMapObjectHandler { public: virtual bool MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ); }; KeepAwayMapHandler keepawaymaphandler; class KeepAwayEventHandler : public bz_Plugin { public: virtual const char* Name() { return "Keep Away"; } virtual void Init ( const char* config ); virtual void Cleanup ( void ); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(KeepAwayEventHandler) class KeepAwayCommands : public bz_CustomSlashCommandHandler { public: virtual ~KeepAwayCommands(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *param ); }; KeepAwayCommands keepawaycommands; void KeepAwayEventHandler::Init(const char* /*commandLine*/) { MaxWaitTime = 0.5f; bz_registerCustomMapObject("keepaway",&keepawaymaphandler); Register(bz_ePlayerUpdateEvent); Register(bz_ePlayerPausedEvent); Register(bz_ePlayerPartEvent); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerDieEvent); bz_registerCustomSlashCommand("kastatus",&keepawaycommands); bz_registerCustomSlashCommand("kaon",&keepawaycommands); bz_registerCustomSlashCommand("kaoff",&keepawaycommands); bz_registerCustomSlashCommand("katimemult",&keepawaycommands); bz_registerCustomSlashCommand("katimemultmin",&keepawaycommands); bz_registerCustomSlashCommand("katime",&keepawaycommands); bz_registerCustomSlashCommand("kaautotimeon",&keepawaycommands); bz_registerCustomSlashCommand("kaautotimeoff",&keepawaycommands); bz_registerCustomSlashCommand("kas",&keepawaycommands); bz_registerCustomSlashCommand("kaffon",&keepawaycommands); bz_registerCustomSlashCommand("kaffoff",&keepawaycommands); bz_registerCustomSlashCommand("kaf",&keepawaycommands); bz_registerCustomSlashCommand("kaf+",&keepawaycommands); bz_registerCustomSlashCommand("kasoundon",&keepawaycommands); bz_registerCustomSlashCommand("kasoundoff",&keepawaycommands); bz_registerCustomSlashCommand("kaflagreseton",&keepawaycommands); bz_registerCustomSlashCommand("kaflagresetoff",&keepawaycommands); } void KeepAwayEventHandler::Cleanup(void) { Flush(); bz_removeCustomMapObject("keepaway"); bz_removeCustomSlashCommand("kastatus"); bz_removeCustomSlashCommand("kaon"); bz_removeCustomSlashCommand("kaoff"); bz_removeCustomSlashCommand("katimemult"); bz_removeCustomSlashCommand("katimemultmin"); bz_removeCustomSlashCommand("katime"); bz_removeCustomSlashCommand("kaautotimeon"); bz_removeCustomSlashCommand("kaautotimeoff"); bz_removeCustomSlashCommand("kas"); bz_removeCustomSlashCommand("kaffon"); bz_removeCustomSlashCommand("kaffoff"); bz_removeCustomSlashCommand("kaf"); bz_removeCustomSlashCommand("kaf+"); bz_removeCustomSlashCommand("kasoundon"); bz_removeCustomSlashCommand("kasoundoff"); bz_removeCustomSlashCommand("kaflagreseton"); bz_removeCustomSlashCommand("kaflagresetoff"); } class KeepAway { public: KeepAway() { id = -1; startTime = 0; team = eNoTeam; callsign = ""; flagsList.clear(); TTH = 120; adjustedTime = 120; timeMult = 0.03; timeMultMin = 0.50; lastReminder = bz_getCurrentTime(); reminderPeriod = 60; enabled = true; toldFlagFree = false; oneTeamWarn = false; autoTimeOn = false; forcedFlags = false; notEnoughTeams = true; soundEnabled = true; teamPlay = false; flagResetEnabled = true; TTHminutes = 0; TTHseconds = 30; flagToKeepIndex = 0; flagToKeep = "Initiate"; } bz_eTeamType team; std::string callsign; std::string flagToKeep; std::vector flagsList; bool teamPlay; double TTH; double adjustedTime; double timeMult; double timeMultMin; double lastReminder; double reminderPeriod; double startTime; bool enabled; bool toldFlagFree; bool oneTeamWarn; bool autoTimeOn; bool forcedFlags; bool notEnoughTeams; bool soundEnabled; bool flagResetEnabled; int TTHminutes; int TTHseconds; int flagToKeepIndex; int id; }; KeepAway keepaway; std::string convertFlag(std::string flagAbbrev) { if (flagAbbrev == "V") return "High Speed (V)"; if (flagAbbrev == "QT") return "Quick Turn (QT)"; if (flagAbbrev == "A") return "Agility (A)"; if (flagAbbrev == "OO") return "Oscillation Overthruster (OO)"; if (flagAbbrev == "F") return "Rapid Fire (F)"; if (flagAbbrev == "MG") return "Machine Gun (MG)"; if (flagAbbrev == "GM") return "Guided Missile (GM)"; if (flagAbbrev == "L") return "Laser (L)"; if (flagAbbrev == "R") return "Ricochet (R)"; if (flagAbbrev == "SB") return "Super Bullet (SB)"; if (flagAbbrev == "ST") return "Stealth (ST)"; if (flagAbbrev == "CL") return "Cloaking (CL)"; if (flagAbbrev == "IB") return "Invisible Bullet (IB)"; if (flagAbbrev == "T") return "Tiny (T)"; if (flagAbbrev == "N") return "Narrow (N)"; if (flagAbbrev == "SH") return "Shield (SH)"; if (flagAbbrev == "SR") return "Steamroller (SR)"; if (flagAbbrev == "SW") return "ShockWave (SW)"; if (flagAbbrev == "PZ") return "Phantom Zone (PZ)"; if (flagAbbrev == "G") return "Genocide (G)"; if (flagAbbrev == "JP") return "Jumping (JP)"; if (flagAbbrev == "ID") return "Identify (ID)"; if (flagAbbrev == "MQ") return "Masquerade (MQ)"; if (flagAbbrev == "BU") return "Burrow (BU)"; if (flagAbbrev == "SE") return "Seer (SE)"; if (flagAbbrev == "TH") return "Thief (TH)"; if (flagAbbrev == "US") return "Useless (US)"; if (flagAbbrev == "WG") return "Wings (WG)"; if (flagAbbrev == "CB") return "Colorblindness (CB)"; if (flagAbbrev == "OB") return "Obesity (OB)"; if (flagAbbrev == "LT") return "Left Turn Only (LT)"; if (flagAbbrev == "RT") return "Right Turn Only (RT)"; if (flagAbbrev == "FO") return "Forward Only (FO)"; if (flagAbbrev == "RO") return "Reverse Only (RO)"; if (flagAbbrev == "M") return "Momentum (M)"; if (flagAbbrev == "B") return "Blindness (B)"; if (flagAbbrev == "JM") return "Jamming (JM)"; if (flagAbbrev == "WA") return "Wide Angle (WA)"; if (flagAbbrev == "NJ") return "No Jumping (NJ)"; if (flagAbbrev == "TR") return "Trigger Happy (TR)"; if (flagAbbrev == "RC") return "Reverse Controls (RC)"; if (flagAbbrev == "R*") return "Red Team (R*)"; if (flagAbbrev == "G*") return "Green Team (G*)"; if (flagAbbrev == "B*") return "Blue Team (B*)"; if (flagAbbrev == "P*") return "Purple Team (P*)"; return ""; } bool KeepAwayMapHandler::MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ) { if (object != "KEEPAWAY" || !data) return false; // parse all the chunks for ( unsigned int i = 0; i < data->data.size(); i++ ) { std::string line = data->data.get(i).c_str(); bz_APIStringList *nubs = bz_newStringList(); nubs->tokenize(line.c_str()," ",0,true); if ( nubs->size() > 0) { std::string key = bz_toupper(nubs->get(0).c_str()); if ( key == "TEAMPLAY" && nubs->size() > 0 ) keepaway.teamPlay = true; else if ( key == "AUTOTIME" && nubs->size() > 0 ) keepaway.autoTimeOn = true; else if ( key == "AUTOTIME" && nubs->size() > 2 ) { double temp1 = (double)atof(nubs->get(1).c_str()); double temp2 = (double)atof(nubs->get(2).c_str()); if (temp1 >= 1 && temp1 <= 99) // if parameter out of range, keeps default keepaway.timeMult = temp1 / 100; if (temp2 >= 1 && temp2 <= 99) // if parameter out of range, keeps default keepaway.timeMultMin = temp2 / 100; keepaway.autoTimeOn = true; } else if ( key == "NOSOUND" && nubs->size() > 0 ) keepaway.soundEnabled = false; else if ( key == "NOFLAGRESET" && nubs->size() > 0 ) keepaway.flagResetEnabled = false; else if ( key == "HOLDTIME" && nubs->size() > 1 ) { double temp = (double)atof(nubs->get(1).c_str()); if (temp >= 1 && temp <= 7200) // if parameter out of range, keeps default keepaway.TTH = temp; } else if ( key == "KEEPAWAYFLAGS" && nubs->size() > 1) { for (unsigned int j = 1; j < nubs->size(); j++) { std::string flag = nubs->get(j).c_str(); if (convertFlag(flag) != "") // must be valid flag type, reject nub otherwise keepaway.flagsList.push_back(flag); } } else if ( key == "FORCEDFLAGS" && nubs->size() > 0 ) keepaway.forcedFlags = true; } bz_deleteStringList(nubs); } if (keepaway.flagsList.size() > 0) keepaway.flagToKeepIndex = -1; // this will increment 1 when we get to getFlag() function; else { keepaway.flagToKeep = ""; // map file didn't give us any flags keepaway.flagToKeepIndex = 0; } return true; } std::string truncate(std::string cllsn, int maxStringLength) { std::string fixed = ""; for (int i = 0; i < maxStringLength; i++) { fixed.push_back(cllsn[i]); } fixed.append("~"); return fixed; } const char* getTeamColor(bz_eTeamType testteam) { if (testteam == eRedTeam) return "RED"; if (testteam == eGreenTeam) return "GREEN"; if (testteam == eBlueTeam) return "BLUE"; if (testteam == ePurpleTeam) return "PURPLE"; if (testteam == eRogueTeam) return "ROGUE"; return ""; } inline bool oneTeam(bz_eTeamType leavingPlayerTeam) { int RT = bz_getTeamCount(eRedTeam); int GT = bz_getTeamCount(eGreenTeam); int BT = bz_getTeamCount(eBlueTeam); int PT = bz_getTeamCount(ePurpleTeam); int RGT = bz_getTeamCount(eRogueTeam); if (leavingPlayerTeam == eRedTeam) RT--; if (leavingPlayerTeam == eGreenTeam) GT--; if (leavingPlayerTeam == eBlueTeam) BT--; if (leavingPlayerTeam == ePurpleTeam) PT--; if (leavingPlayerTeam == eRogueTeam) RGT--; int Test1 = (RT * GT) + (RT * BT) + (RT * PT) + (GT * BT) + (GT * PT) + (BT * PT); int Test2 = RT + GT + BT + PT + RGT; if (Test1 < 1 && Test2 < 2) { if (!keepaway.oneTeamWarn) bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "Keep Away disabled: less than 2 teams."); keepaway.oneTeamWarn = true; return true; } else { if (keepaway.oneTeamWarn) bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "Keep Away enabled: more than 1 team."); keepaway.oneTeamWarn = false; return false; } } void autoTime() { int numPlayers = bz_getTeamCount(eRedTeam) + bz_getTeamCount(eGreenTeam) + bz_getTeamCount(eBlueTeam) + bz_getTeamCount(ePurpleTeam) + bz_getTeamCount(eRogueTeam); if (!keepaway.autoTimeOn || numPlayers < 3) { keepaway.adjustedTime = keepaway.TTH; return; } double timeDown = ( 1 - ((double)numPlayers - 2) * keepaway.timeMult); if (timeDown < keepaway.timeMultMin) timeDown = keepaway.timeMultMin; keepaway.adjustedTime = (int)(keepaway.TTH * timeDown); return; } double ConvertToNum(std::string inmessage, double minNum, double maxNum){ int messagelength = (int)inmessage.length(); if (messagelength > 0 && messagelength < 5) { double messagevalue = 0; double tens = 1; for ( int i = (messagelength - 1); i >= 0; i-- ){ if (inmessage[i] < '0' || inmessage[i] > '9') // got something other than a number return 0; tens *= 10; messagevalue += (((double)inmessage[i] - '0') / 10) * tens; } if (messagevalue >= minNum && messagevalue <= maxNum) return messagevalue; } return 0; } void killTeams(bz_eTeamType safeteam, std::string keepawaycallsign) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player){ if (player->team != safeteam) { bz_killPlayer(player->playerID, true, BZ_SERVER); if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } else if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) Kept the Flag Away!", getTeamColor(safeteam), keepawaycallsign.c_str()); if (keepaway.flagResetEnabled) bz_resetFlags(true); return; } void killPlayers(int safeid, std::string keepawaycallsign) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player){ if (player->playerID != safeid) { bz_killPlayer(player->playerID, true, keepaway.id); if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } else if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s Kept the Flag Away!", keepawaycallsign.c_str()); if (keepaway.flagResetEnabled) bz_resetFlags(true); return; } void sendWarnings(const char* teamcolor, std::string playercallsign, double keepawaystartedtime) { double TimeElapsed = bz_getCurrentTime() - keepawaystartedtime; double TimeRemaining = keepaway.adjustedTime - TimeElapsed; int toTens = int((TimeRemaining + 5) / 10) * 10; if ((TimeRemaining/60) < keepaway.TTHminutes && keepaway.adjustedTime > 59 && TimeRemaining >= 1) { if (!keepaway.teamPlay || keepaway.team == eRogueTeam) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s has %s flag; %i secs left!", playercallsign.c_str(), keepaway.flagToKeep.c_str(), toTens); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) has %s flag; %i secs left!", teamcolor, playercallsign.c_str(), keepaway.flagToKeep.c_str(), toTens); keepaway.TTHminutes--; } if (keepaway.adjustedTime < keepaway.TTHseconds) { keepaway.TTHseconds = keepaway.TTHseconds - 10; return; } if (TimeRemaining < keepaway.TTHseconds && TimeRemaining >= 1) { if (!keepaway.teamPlay || keepaway.team == eRogueTeam) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s has %s flag; %i secs left!", playercallsign.c_str(), keepaway.flagToKeep.c_str(), keepaway.TTHseconds); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) has %s flag; %i secs left!", teamcolor, playercallsign.c_str(), keepaway.flagToKeep.c_str(), keepaway.TTHseconds); keepaway.TTHseconds = keepaway.TTHseconds - 10; } return; } std::string getFlag() { if (keepaway.flagToKeepIndex < -1) // this should never happen, but save a crash if something goes nuts return ""; // get next flag; if not free take it from player (if forced flags) for (unsigned int h = 0; h < keepaway.flagsList.size(); h++) // check all specified flags { keepaway.flagToKeepIndex++; // get next one in line if (keepaway.flagToKeepIndex > ((int)keepaway.flagsList.size() - 1)) // go back to start if at end keepaway.flagToKeepIndex = 0; std::string flagCandidate = keepaway.flagsList[keepaway.flagToKeepIndex]; bool flagNotHeld = true; bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { const char* playerFlag = bz_getPlayerFlag(player->playerID); if (playerFlag) { if (playerFlag == flagCandidate && keepaway.forcedFlags) // take it, if forced flags { bz_removePlayerFlag (player->playerID); bz_sendTextMessage (BZ_SERVER, player->playerID, "Sorry, server needs your flag for Keep Away :/"); } if (playerFlag == flagCandidate && !keepaway.forcedFlags) // look for next free flag in list flagNotHeld = false; } } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); if (flagNotHeld) return flagCandidate; } if (keepaway.flagsList.size() > 0) // we should never get here, but if we do keep going return keepaway.flagsList[0]; else return ""; } void initiatekeepaway(bz_eTeamType plyrteam, bz_ApiString plyrcallsign, int plyrID) { keepaway.team = plyrteam; keepaway.callsign = plyrcallsign.c_str(); if (keepaway.callsign.size() > 16) { std::string tofix = truncate(keepaway.callsign, 16); keepaway.callsign = tofix; } keepaway.id = plyrID; keepaway.startTime = bz_getCurrentTime(); keepaway.TTHminutes = (int)(keepaway.adjustedTime/60 + 0.5); keepaway.TTHseconds = 30; keepaway.toldFlagFree = false; bool multipleof30 = false; if ((int)((keepaway.adjustedTime / 30) + 0.5) != (double)(keepaway.adjustedTime / 30)) multipleof30 = false; else multipleof30 = true; if (!multipleof30) { if ((!keepaway.teamPlay || keepaway.team == eRogueTeam)) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s has %s flag; %i secs left!", keepaway.callsign.c_str(), keepaway.flagToKeep.c_str(), (int)keepaway.adjustedTime); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) has %s flag; %i secs left!", getTeamColor(keepaway.team), keepaway.callsign.c_str(), keepaway.flagToKeep.c_str(), (int)keepaway.adjustedTime); } if (keepaway.soundEnabled) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { if ((player->team != keepaway.team || player->team == eRogueTeam) && player->playerID != keepaway.id) bz_sendPlayCustomLocalSound(player->playerID,"flag_alert"); else bz_sendPlayCustomLocalSound(player->playerID,"teamgrab"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); } return; } void playAlert() { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) bz_sendPlayCustomLocalSound(player->playerID,"hunt_select"); bz_freePlayerRecord(player); } bz_deleteIntList(playerList); return; } inline bool timeForReminder() { double timeLeft = bz_getCurrentTime() - keepaway.lastReminder; if (timeLeft >= keepaway.reminderPeriod) { keepaway.lastReminder = bz_getCurrentTime(); return true; } return false; } void KeepAwayPlayerPaused( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerPausedEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; bz_PlayerPausedEventData_V1 *PauseData = (bz_PlayerPausedEventData_V1*)eventData; bz_BasePlayerRecord *player = bz_getPlayerByIndex(PauseData->playerID); if (player) { const char* flagHeld = bz_getPlayerFlag(player->playerID); if (flagHeld) { if (flagHeld == keepaway.flagToKeep) { bz_removePlayerFlag (player->playerID); bz_sendTextMessage (BZ_SERVER, PauseData->playerID, "Flag removed - cannot pause while holding flag."); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; } } } bz_freePlayerRecord(player); return; } void KeepAwayPlayerJoined ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerJoinEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; bz_PlayerJoinPartEventData_V1 *joinData = (bz_PlayerJoinPartEventData_V1*)eventData; if (keepaway.flagToKeep == "Initiate") //first time server starts, first player initiates it. { keepaway.flagToKeep = getFlag(); keepaway.lastReminder = bz_getCurrentTime(); } autoTime(); if (oneTeam(eNoTeam)) // don't send message if not enough teams { keepaway.notEnoughTeams = true; return; } else keepaway.notEnoughTeams = false; if (keepaway.id == -1 && keepaway.enabled && keepaway.flagToKeep != "") { bz_sendTextMessagef (BZ_SERVER, joinData->playerID, "Keep Away flag is %s: find it and keep it for %i seconds!", convertFlag(keepaway.flagToKeep).c_str(), (int)keepaway.adjustedTime); if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(joinData->playerID,"hunt_select"); } if (keepaway.id != -1 && keepaway.enabled && keepaway.flagToKeep != "" && (joinData->record->team != keepaway.team || joinData->record->team == eRogueTeam)) { bz_sendTextMessagef (BZ_SERVER, joinData->playerID, "%s has Keep Away flag %s - kill him/her before time's up!", keepaway.callsign.c_str(), convertFlag(keepaway.flagToKeep).c_str()); if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(joinData->playerID,"flag_alert"); } if (keepaway.id != -1 && keepaway.enabled && keepaway.flagToKeep != "" && (joinData->record->team == keepaway.team && joinData->record->team != eRogueTeam)) { bz_sendTextMessagef (BZ_SERVER, joinData->playerID, "%s has Keep Away flag %s - protect him/her until time's up!", keepaway.callsign.c_str(), convertFlag(keepaway.flagToKeep).c_str()); if (keepaway.soundEnabled) bz_sendPlayCustomLocalSound(joinData->playerID,"teamgrab"); } return; } void KeepAwayPlayerLeft( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerPartEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; autoTime(); bz_PlayerJoinPartEventData_V1 *partData = (bz_PlayerJoinPartEventData_V1*)eventData; if (partData->playerID == keepaway.id) { keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; } if (oneTeam(partData->record->team)) // team count check keepaway.notEnoughTeams = true; else keepaway.notEnoughTeams = false; return; } void KeepAwayPlayerDied ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerDieEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; bz_PlayerDieEventData_V1 *dieData = (bz_PlayerDieEventData_V1*)eventData; if (dieData->playerID == keepaway.id) { keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; } return; } inline void checkKeepAwayHolder() { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { const char* flagHeld = bz_getPlayerFlag(player->playerID); if (flagHeld) { if (flagHeld == keepaway.flagToKeep && keepaway.id == -1) // gotta a new one; initiate { initiatekeepaway(player->team, player->callsign, player->playerID); bz_freePlayerRecord(player); bz_deleteIntList(playerList); return; } if (flagHeld == keepaway.flagToKeep && keepaway.id == player->playerID) // someone still has it; leave { bz_freePlayerRecord(player); bz_deleteIntList(playerList); return; } if (flagHeld == keepaway.flagToKeep && keepaway.id != player->playerID) // must have stolen it { initiatekeepaway(player->team, player->callsign, player->playerID); bz_freePlayerRecord(player); bz_deleteIntList(playerList); return; } } } bz_freePlayerRecord(player); } keepaway.id = -1; // no one has flag keepaway.team = eNoTeam; bz_deleteIntList(playerList); return; } void KeepAwayEventHandler::Event ( bz_EventData *eventData ) { if (eventData->eventType == bz_ePlayerDieEvent) KeepAwayPlayerDied(eventData); else if (eventData->eventType == bz_ePlayerPartEvent) KeepAwayPlayerLeft(eventData); else if (eventData->eventType == bz_ePlayerJoinEvent) KeepAwayPlayerJoined(eventData); else if (eventData->eventType == bz_ePlayerPausedEvent) KeepAwayPlayerPaused(eventData); if (eventData->eventType != bz_ePlayerUpdateEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; if (keepaway.notEnoughTeams) // Not enough teams - we can leave return; checkKeepAwayHolder(); // check for someone holding flag if (!keepaway.toldFlagFree && keepaway.id == -1) // Flag is free - inform players { bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away flag: %s is free; find it and keep it!", convertFlag(keepaway.flagToKeep).c_str()); keepaway.toldFlagFree = true; if ((bz_getCurrentTime() - keepaway.lastReminder) > 2 && keepaway.soundEnabled) // do not play free flag sound alert if player just won/lost (overlapping sounds) playAlert(); } if (timeForReminder() && keepaway.id == -1) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away flag: %s is free; find it and keep it!", convertFlag(keepaway.flagToKeep).c_str()); if (keepaway.id == -1) // no one has it, we can leave return; sendWarnings(getTeamColor(keepaway.team), keepaway.callsign, keepaway.startTime); double timeStanding = bz_getCurrentTime() - keepaway.startTime; if (timeStanding >= keepaway.adjustedTime) // time's up - kill 'em { if (keepaway.teamPlay && keepaway.team != eRogueTeam) { killTeams(keepaway.team, keepaway.callsign); bz_sendTextMessage (BZ_SERVER, keepaway.team, "Your team did it! Go find the next Keep Away flag and keep it!"); } else { killPlayers(keepaway.id, keepaway.callsign); bz_sendTextMessage (BZ_SERVER, keepaway.id, "You did it! Go find the next Keep Away flag and keep it!"); } if (!keepaway.forcedFlags) // this will always create an open spot for getFlag(), if it's needed bz_removePlayerFlag (keepaway.id); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; keepaway.flagToKeep = getFlag(); keepaway.lastReminder = bz_getCurrentTime(); return; } } bool KeepAwayCommands::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); const char* keepermessage = _message.c_str(); if ( command == "kas" ) { if (keepaway.id != -1) bz_sendTextMessage (playerID, keepaway.id, keepermessage); else bz_sendTextMessage(BZ_SERVER, playerID, "There is no one keeping the flag right now."); return true; } if ( command == "kaf" ) { if (keepaway.id == -1) bz_sendTextMessagef (BZ_SERVER, playerID, "The Keep Away flag is: %s", convertFlag(keepaway.flagToKeep).c_str()); else bz_sendTextMessagef (BZ_SERVER, playerID, "%s has Keep Away flag: %s", keepaway.callsign.c_str(), convertFlag(keepaway.flagToKeep).c_str()); return true; } bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (fromPlayer) { if (!fromPlayer->admin) { bz_sendTextMessage(BZ_SERVER, playerID, "You must be admin to use the keepaway commands."); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); } if ( command == "kasoundoff" ) { keepaway.soundEnabled = false; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away sounds are disabled."); return true; } if ( command == "kasoundon" ) { keepaway.soundEnabled = true; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away sounds are enabled."); return true; } if ( command == "kaflagresetoff" ) { keepaway.flagResetEnabled = false; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away flag reset is disabled."); return true; } if ( command == "kaflagreseton" ) { keepaway.flagResetEnabled = true; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away flag reset is enabled."); return true; } if ( command == "kaf+" ) { if (!keepaway.forcedFlags) // this will always create an open spot for getFlag(), if it's needed bz_removePlayerFlag (keepaway.id); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; keepaway.flagToKeep = getFlag(); keepaway.lastReminder = bz_getCurrentTime(); bz_sendTextMessagef(BZ_SERVER, playerID, "Keep Away flag advanced to: %s", convertFlag(keepaway.flagToKeep).c_str()); return true; } if ( command == "kaon") { keepaway.enabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away is enabled."); return true; } if ( command == "kaoff") { keepaway.enabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away is disabled."); return true; } if ( command == "katimemult") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { keepaway.timeMult = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier set to %i percent.", (int)(keepaway.timeMult*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier must be between 1 and 99 percent.", (int)(keepaway.timeMult*100 + 0.5)); autoTime(); return true; } if ( command == "katimemultmin") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { keepaway.timeMultMin = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier minimum set to %i percent.", (int)(keepaway.timeMultMin*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier minimum must be between 1 and 99 percent."); autoTime(); return true; } if ( command == "kastatus") { if (keepaway.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away is currently enabled."); if (!keepaway.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away is currently disabled."); if (keepaway.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away automatic time adjustment is currently enabled."); if (!keepaway.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away automatic time adjustment is currently disabled."); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away time multiplier = %i percent.", (int)(keepaway.timeMult*100 + 0.5)); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away time multiplier minimum = %i percent.", (int)(keepaway.timeMultMin*100 + 0.5)); int AdjTime = (int)(keepaway.adjustedTime + 0.5); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away hold time is currently set to: %i seconds", AdjTime); if (keepaway.forcedFlags) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away forced flags is enabled."); if (!keepaway.forcedFlags) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away forced flags is disabled."); if (keepaway.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away sounds are enabled."); if (!keepaway.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away sounds are disabled."); if (keepaway.flagResetEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away flag reset is enabled."); if (!keepaway.flagResetEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away flag reset is disabled."); return true; } // explicit time command handler: if ( command == "katime" ) { double inputvalue = ConvertToNum(message, 1, 7200); if (inputvalue > 0 ) { keepaway.TTH = inputvalue; autoTime(); int AdjTime = (int)(inputvalue + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away hold time has been set to %i seconds.", AdjTime); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away hold time invalid: must be between 1 and 7200 seconds."); autoTime(); return true; } if ( command == "kaautotimeon") { keepaway.autoTimeOn = true; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away automatic time adjustment on."); return true; } if ( command == "kaautotimeoff") { keepaway.autoTimeOn = false; keepaway.adjustedTime = keepaway.TTH; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away automatic time adjustment off."); return true; } if ( command == "kaffon") { keepaway.forcedFlags = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Forced flags on."); return true; } if ( command == "kaffoff") { keepaway.forcedFlags = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Forced flags off."); return true; } return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/keepaway/keepaway.def000066400000000000000000000001521200563112200212120ustar00rootroot00000000000000LIBRARY keepaway EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/keepaway/keepaway.sln000066400000000000000000000023171200563112200212550ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keepaway", "keepaway.vcxproj", "{F493BA5D-252B-4825-8C15-36F75B4CE0AA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|Win32.ActiveCfg = Debug|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|Win32.Build.0 = Debug|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|x64.ActiveCfg = Debug|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Debug|x64.Build.0 = Debug|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|Win32.ActiveCfg = Release|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|Win32.Build.0 = Release|Win32 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|x64.ActiveCfg = Release|x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/keepaway/keepaway.vcxproj000066400000000000000000000336571200563112200221670ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {F493BA5D-252B-4825-8C15-36F75B4CE0AA} keepaway Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;keepaway_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)keepaway.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) keepaway.def true $(OutDir)keepaway.pdb Windows false $(OutDir)keepaway.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;keepaway_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)keepaway.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) keepaway.def true $(OutDir)keepaway.pdb Windows false $(OutDir)keepaway.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;keepaway_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)keepaway.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) keepaway.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)keepaway.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;keepaway_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)keepaway.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) keepaway.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)keepaway.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/keepaway/keepaway_admin.txt000066400000000000000000000020311200563112200224410ustar00rootroot00000000000000---------------------------------------------------------- Keep Away Commands Available: ---------------------------------------------------------- Admin only: "kaon" - enable Keep Away mode. "kaoff" - disable Keep Away mode. "katimemult <%>" - sets auto time multiplier per player. "katimemultmin <%>" - sets auto time minimum multiplier. "kaautotimeon" - enable the autotime function. "kaautotimeoff" - disable the autotime funtion. "kaffon" - enable forced flags. "kaffoff" - disable forced flags. "katime " - change hold time 1-7200 secs. "kastatus" - indicate the status of the plugin. "kaf+" - advance to next Keep Away flag. "kasoundon" - enable Keep Away sounds. "kasoundoff" - disable Keep Away sounds. "kaflagreseton" - enable auto Keep Away flag reset. "kaflagresetoff" - disable auto Keep Away flag reset. ---------------------------------------------------------- All Players: "kas " - message to player holding flag. "kaf" - indicate current Keep Away flag. ---------------------------------------------------------- bzflag-2.4.2+ds1/plugins/keepaway/keepaway_rules.txt000066400000000000000000000011501200563112200225040ustar00rootroot00000000000000---------------------------------------------------- Goal of game: find & hold the Keep Away flag for the indicated amount of time and server will kill all other teams/players. ---------------------------------------------------- Watch server messages for game updates - who holds the flag, how much time is left, etc. ---------------------------------------------------- You may send a message to player holding the flag with "/kas ". ---------------------------------------------------- You may check to see what current Keep Away flag is with "/kaf". ---------------------------------------------------- bzflag-2.4.2+ds1/plugins/killall/000077500000000000000000000000001200563112200165445ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/killall/Makefile.am000066400000000000000000000005571200563112200206070ustar00rootroot00000000000000lib_LTLIBRARIES = killall.la killall_la_SOURCES = killall.cpp killall_la_CPPFLAGS = -I$(top_srcdir)/include killall_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ killall.def \ killall.sln \ killall.vcxproj \ README.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/killall/Makefile.in000066400000000000000000000455721200563112200206260ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/killall DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) killall_la_LIBADD = am_killall_la_OBJECTS = killall_la-killall.lo killall_la_OBJECTS = $(am_killall_la_OBJECTS) killall_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(killall_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(killall_la_SOURCES) DIST_SOURCES = $(killall_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = killall.la killall_la_SOURCES = killall.cpp killall_la_CPPFLAGS = -I$(top_srcdir)/include killall_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ killall.def \ killall.sln \ killall.vcxproj \ README.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/killall/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/killall/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done killall.la: $(killall_la_OBJECTS) $(killall_la_DEPENDENCIES) $(killall_la_LINK) -rpath $(libdir) $(killall_la_OBJECTS) $(killall_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/killall_la-killall.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< killall_la-killall.lo: killall.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(killall_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT killall_la-killall.lo -MD -MP -MF $(DEPDIR)/killall_la-killall.Tpo -c -o killall_la-killall.lo `test -f 'killall.cpp' || echo '$(srcdir)/'`killall.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/killall_la-killall.Tpo $(DEPDIR)/killall_la-killall.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='killall.cpp' object='killall_la-killall.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(killall_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o killall_la-killall.lo `test -f 'killall.cpp' || echo '$(srcdir)/'`killall.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/killall/README.txt000066400000000000000000000004221200563112200202400ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : killall Project Overview ======================================================================== This is the killall plugin. It lets you kill everybody on the map at once. bzflag-2.4.2+ds1/plugins/killall/killall.cpp000066400000000000000000000026351200563112200207020ustar00rootroot00000000000000// killall.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" class KillAll : public bz_Plugin, bz_CustomSlashCommandHandler { public: virtual const char* Name(){return "Kill All";} virtual void Init ( const char* /* config */ ) { bz_registerCustomSlashCommand ( "killall", this ); } virtual void Cleanup ( void ) { bz_removeCustomSlashCommand ( "killall" ); } virtual bool SlashCommand ( int playerID, bz_ApiString /*command*/, bz_ApiString /*message*/, bz_APIStringList* /*params*/ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerID); if (!player) return true; if ( !player->admin ) { bz_sendTextMessage(BZ_SERVER,playerID,"You do not have permission to run /killall"); bz_freePlayerRecord(player); return true; } std::string msg = player->callsign.c_str(); msg += " has killed everyone"; bz_sendTextMessage(BZ_SERVER,BZ_ALLUSERS,msg.c_str()); bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) bz_killPlayer(playerList->get(i),false); bz_freePlayerRecord(player); bz_deleteIntList(playerList); return true; } }; BZ_PLUGIN(KillAll) // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/killall/killall.def000066400000000000000000000001511200563112200206450ustar00rootroot00000000000000LIBRARY killall EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/killall/killall.sln000066400000000000000000000023151200563112200207070ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "killall", "killall.vcxproj", "{A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|Win32.ActiveCfg = Debug|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|Win32.Build.0 = Debug|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|x64.ActiveCfg = Debug|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Debug|x64.Build.0 = Debug|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|Win32.ActiveCfg = Release|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|Win32.Build.0 = Release|Win32 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|x64.ActiveCfg = Release|x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/killall/killall.vcxproj000066400000000000000000000336211200563112200216120ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {A9898AEC-086B-4B9E-8978-C1BFE3EA56A6} killall Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;killall_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)killall.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) killall.def true $(OutDir)killall.pdb Windows false $(OutDir)killall.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;killall_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)killall.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) killall.def true $(OutDir)killall.pdb Windows false $(OutDir)killall.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;killall_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)killall.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) killall.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)killall.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;killall_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)killall.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) killall.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)killall.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/koth/000077500000000000000000000000001200563112200160655ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/koth/Makefile.am000066400000000000000000000005731200563112200201260ustar00rootroot00000000000000lib_LTLIBRARIES = koth.la koth_la_SOURCES = koth.cpp koth_la_CPPFLAGS = -I$(top_srcdir)/include koth_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ koth.def \ koth.sln \ koth.vcxproj \ koth_admin.txt \ koth_rules.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/koth/Makefile.in000066400000000000000000000453771200563112200201520ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/koth DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) koth_la_LIBADD = am_koth_la_OBJECTS = koth_la-koth.lo koth_la_OBJECTS = $(am_koth_la_OBJECTS) koth_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(koth_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(koth_la_SOURCES) DIST_SOURCES = $(koth_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = koth.la koth_la_SOURCES = koth.cpp koth_la_CPPFLAGS = -I$(top_srcdir)/include koth_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ koth.def \ koth.sln \ koth.vcxproj \ koth_admin.txt \ koth_rules.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/koth/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/koth/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done koth.la: $(koth_la_OBJECTS) $(koth_la_DEPENDENCIES) $(koth_la_LINK) -rpath $(libdir) $(koth_la_OBJECTS) $(koth_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/koth_la-koth.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< koth_la-koth.lo: koth.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(koth_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT koth_la-koth.lo -MD -MP -MF $(DEPDIR)/koth_la-koth.Tpo -c -o koth_la-koth.lo `test -f 'koth.cpp' || echo '$(srcdir)/'`koth.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/koth_la-koth.Tpo $(DEPDIR)/koth_la-koth.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='koth.cpp' object='koth_la-koth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(koth_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o koth_la-koth.lo `test -f 'koth.cpp' || echo '$(srcdir)/'`koth.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/koth/README.txt000066400000000000000000000162721200563112200175730ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : King of the Hill Project Overview ======================================================================== koth plugin Author: LouMan Credit to JeffM2501 for base zone and custom map object code (from flagStay plugin), which I have modified to fit this application. Description: The plugin will create a King of the Hill game mode in which a team (or player) can occupy a defined volume ("Hill") for a defined amount of time and kill all other teams (or players) if occupied long enough. There are 2 modes of play available: 1) Teamplay: if a player from a team occupies the Hill long enough, all other teams (except his/hers) are killed. Score credits are given to the team, but not given to player that was King of the Hill. If a rogue manages to become King of the Hill in this mode, all players (except him/her) are killed and he/she gets individual score credit for all of the kills. 2) No teamplay: for this mode it is recommended to set up a map with only rogue players allowed. If a player occupies the Hill long enough, all other players are killed and score credit is given to the player who became King of the Hill for all of the kills. Obviously, if teams are allowed in this mode, it would result in repeated team kills - no fun. Basically this is a free-for-all mode for King of the Hill. Plugin features/notes: * Server messaging for Hill unoccupied (can be taken), Hill occupied (by whom and how long they have to hold it), regular countdown warnings while someone is holding Hill (every minute and 30, 20 & 10 seconds until Hill is "captured"), and successful King of the Hill announcements. Long callsigns are truncated in server messages. * In teamplay mode, if any team player manages to lay claim to the Hill and kill all other team players, his/her entire team must exit the Hill volume and at least one would need to re-enter to try and hold the Hill again. If the player that captures the hill is a rogue in teamplay mode, only that player will need to exit and re-enter to try and take the Hill again. * In no teamplay mode, if a player manages to lay claim to the Hill and kill all other players, only he/she must exit the Hill volume and re-enter to try and hold the Hill again. * Players cannot pause on the Hill (everywhere else is ok) - if they try they will be killed with a warning message not to do so. * King of the Hill will be disabled until there are 2 or more teams present. * Explicit spawn zones are recommended in map files to prevent player spawns on the Hill. * There is an autotime function (optional) that will reduce the time to hold the hill, based on the number of players in the game. With this option enabled, the time is reduced a certain percentage (default is 3%) with every additional player (after 2) to a certain minimum percentage (default is 50%) of the original specified time to hold. This means that (with default settings) the time to hold would not be affected for 2 players, but would be reduced by 3% for 3 players, 6% for 4 players and so on. The minimum 50% of the original time to hold would be reached at about 19 players and would remain at 50%, no matter how many additional players were to join after that. * There is a "/kingsay " command available to all players to send a message to person holding the hill. * When Hill is initially occupied and when hill is taken, standard team audio alerts take place. ------------------------------------------------------------------------------------- The parameters of the King of the Hill (koth) map definition are follows: bbox or cylinder Required. These define the volume on the map to be occupied for the King of the Hill. teamplay Optional. This will enable the teamplay mode of King of the Hill (see above). If not included, teamplay is disabled and it becomes as basic free for all King of the Hill mode. holdtime Optional. This defines the time (in seconds) required to occupy the King of the Hill volume before a player is declared King of the Hill and other teams/players are zapped. If not included, the default setting is 60 seconds (1 minute). The limits of this setting are controlled to a minimum of 1 second and a maximum of 7200 seconds. autotime Optional. This will enable the automatic time reduction feature of the plugin that will reduce the time to hold the hill, based on the number of players in the game (see description above). The multiplier field will set the hold time reduction percentage per new player. The minimum multiplier field will set the minimum hold time reduction percentage. If these fields are left blank, the default multiplier = 3% and the default minimum multiplier = 50%. The multiplier fields should be between 1 and 99 (percent). nosound Optional. This will disable sounds associated with Keep Away plugin (some clients seem to have issues with this feature). ------------------------------------------------------------------------------------- Examples of map (.bzw) entries: koth bbox -30 30 -30 30 10 40 teamplay holdtime 60 end This would set up a King of the Hill volume 60 x 60 x 30, centered at 0 0 25. Teamplay would be enabled and the required time to occupy the "Hill" would be 60 seconds (1 minute). Time to hold would not automatically adjust downward with new players. koth cylinder 0 0 20 40 15 holdtime 100 teamplay autotime 5 25 nosound end This would set up a King of the Hill cylindrical volume 30 x 30 x 20, centered at 0 0 30. Teamplay would be enabled and the required time to occupy the "Hill" would be 100 seconds. The time to occupy the hill would adjust downward with an increasing number of players (see autotime description above). Each new player after 2 will reduce the hold time by 5% to a minimum of 25% of the hold time (25 seconds). The sounds associated with the plugin would be disabled. Obviously, the plugin must be loaded to the server at startup, or it will not recognize these map parameters. ------------------------------------------------------------------------------------- There is one command available to all players with the plugin: "kingsay " - this will send message to the player occupying the hill. There are several administrator commands available with the plugin: "kothon" - this will turn King of the Hill mode on, if turned off previously. "kothoff" - this will turn King of the Hill mode off for normal gameplay. "kothtimemult" - this will set auto time multiplier (per new player). "kothtimemultmin" - this will set minimum auto time multiplier. "kothautotimeon" - this will enable the autotime function. "kothsoundon" - this will enable the plugin's sounds. "kothsoundoff" - this will disable the plugin's sounds. "kothautotimeoff" - this will disable the autotime function. "kothtime " - this will change King of the Hill hold time 1 -> 7200 seconds. "kothstatus" - this will return the status of the plugin modes, times, etc. ------------------------------------------------------------------------------------- Please report any bugs or issues with this plugin to LouMan, and good luck. bzflag-2.4.2+ds1/plugins/koth/koth.cpp000066400000000000000000000522241200563112200175430ustar00rootroot00000000000000// koth.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" #include #include class KOTHMapHandler : public bz_CustomMapObjectHandler { public: virtual bool MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ); }; KOTHMapHandler kothmaphandler; class KOTHCommands : public bz_CustomSlashCommandHandler { public: virtual ~KOTHCommands(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *param ); }; KOTHCommands kothcommands; class KOTHHandler : public bz_Plugin { public: virtual const char* Name (){return "King Of The Hill";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(KOTHHandler) void KOTHHandler::Init(const char* /*commandLine*/){ MaxWaitTime = 0.5f; bz_registerCustomMapObject("KOTH",&kothmaphandler); Register(bz_ePlayerUpdateEvent); Register(bz_ePlayerPausedEvent); Register(bz_ePlayerPartEvent); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerDieEvent); bz_registerCustomSlashCommand("kothstatus",&kothcommands); bz_registerCustomSlashCommand("kothon",&kothcommands); bz_registerCustomSlashCommand("kothoff",&kothcommands); bz_registerCustomSlashCommand("kothsoundon",&kothcommands); bz_registerCustomSlashCommand("kothsoundoff",&kothcommands); bz_registerCustomSlashCommand("kothtimemult",&kothcommands); bz_registerCustomSlashCommand("kothtimemultmin",&kothcommands); bz_registerCustomSlashCommand("kothtime",&kothcommands); bz_registerCustomSlashCommand("kothautotimeon",&kothcommands); bz_registerCustomSlashCommand("kothautotimeoff",&kothcommands); bz_registerCustomSlashCommand("kingsay",&kothcommands); } void KOTHHandler::Cleanup(void){ Flush(); bz_removeCustomMapObject("KOTH"); bz_removeCustomSlashCommand("kothstatus"); bz_removeCustomSlashCommand("kothon"); bz_removeCustomSlashCommand("kothoff"); bz_removeCustomSlashCommand("kothsoundon"); bz_removeCustomSlashCommand("kothsoundoff"); bz_removeCustomSlashCommand("kothtimemult"); bz_removeCustomSlashCommand("kothtimemultmin"); bz_removeCustomSlashCommand("kothtime"); bz_removeCustomSlashCommand("kothautotimeon"); bz_removeCustomSlashCommand("kothautotimeoff"); bz_removeCustomSlashCommand("kingsay"); } class KOTH { public: KOTH() { id = -1; startTime = 0; team = eNoTeam; callsign = ""; teamPlay = false; TTH = 60; adjustedTime = 60; timeMult = 0.03; timeMultMin = 0.50; enabled = true; toldHillOpen = false; onePlayerWarn = false; autoTimeOn = false; TTHminutes = 0; TTHseconds = 30; playerJustWon = -1; soundEnabled = true; } bz_eTeamType team; std::string callsign; double TTH; double adjustedTime; double timeMult; double timeMultMin; double startTime; bool teamPlay; bool enabled; bool toldHillOpen; bool onePlayerWarn; bool autoTimeOn; bool soundEnabled; int TTHminutes; int TTHseconds; int playerJustWon; int id; }; KOTH koth; class KOTHZone { public: KOTHZone() { box = false; xMax = xMin = yMax = yMin = zMax = zMin = rad = 0; } bool box; float xMax,xMin,yMax,yMin,zMax,zMin; float rad; bool pointIn ( float pos[3] ) { if ( box ) { if ( pos[0] > xMax || pos[0] < xMin ) return false; if ( pos[1] > yMax || pos[1] < yMin ) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } else { float vec[3]; vec[0] = pos[0]-xMax; vec[1] = pos[1]-yMax; vec[2] = pos[2]-zMax; float dist = sqrt(vec[0]*vec[0]+vec[1]*vec[1]); if ( dist > rad) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } return true; } }; KOTHZone kothzone; bool KOTHMapHandler::MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ) { if (object != "KOTH" || !data) return false; // parse all the chunks for ( unsigned int i = 0; i < data->data.size(); i++ ) { std::string line = data->data.get(i).c_str(); bz_APIStringList *nubs = bz_newStringList(); nubs->tokenize(line.c_str()," ",0,true); if ( nubs->size() > 0) { std::string key = bz_toupper(nubs->get(0).c_str()); if ( key == "BBOX" && nubs->size() > 6) { kothzone.box = true; kothzone.xMin = (float)atof(nubs->get(1).c_str()); kothzone.xMax = (float)atof(nubs->get(2).c_str()); kothzone.yMin = (float)atof(nubs->get(3).c_str()); kothzone.yMax = (float)atof(nubs->get(4).c_str()); kothzone.zMin = (float)atof(nubs->get(5).c_str()); kothzone.zMax = (float)atof(nubs->get(6).c_str()); } else if ( key == "CYLINDER" && nubs->size() > 5) { kothzone.box = false; kothzone.rad = (float)atof(nubs->get(5).c_str()); kothzone.xMax =(float)atof(nubs->get(1).c_str()); kothzone.yMax =(float)atof(nubs->get(2).c_str()); kothzone.zMin =(float)atof(nubs->get(3).c_str()); kothzone.zMax =(float)atof(nubs->get(4).c_str()); } else if ( key == "TEAMPLAY") { koth.teamPlay = true; } else if ( key == "NOSOUND") { koth.soundEnabled = false; } else if ( key == "AUTOTIME" && nubs->size() == 1 ) { koth.autoTimeOn = true; } else if ( key == "AUTOTIME" && nubs->size() > 2 ) { double temp1 = (double)atof(nubs->get(1).c_str()); double temp2 = (double)atof(nubs->get(2).c_str()); if (temp1 >= 1 && temp1 <= 99) koth.timeMult = temp1 / 100; if (temp2 >= 1 && temp2 <= 99) koth.timeMultMin = temp2 / 100; koth.autoTimeOn = true; } else if ( key == "HOLDTIME" && nubs->size() > 1 ) { double temp = (double)atof(nubs->get(1).c_str()); if (temp >= 1 && temp <= 7200) koth.TTH = temp; } } bz_deleteStringList(nubs); } return true; } std::string truncate(std::string cllsn) { std::string fixed = ""; for (int i = 0; i < 16; i++) { fixed.push_back(cllsn[i]); } fixed.append("~"); return fixed; } const char* getTeamColor(bz_eTeamType testteam) { if (testteam == eRedTeam) return "RED"; if (testteam == eGreenTeam) return "GREEN"; if (testteam == eBlueTeam) return "BLUE"; if (testteam == ePurpleTeam) return "PURPLE"; if (testteam == eRogueTeam) return "ROGUE"; return " "; } bool onePlayer() { int numPlayers = bz_getTeamCount(eRedTeam) + bz_getTeamCount(eGreenTeam) + bz_getTeamCount(eBlueTeam) + bz_getTeamCount(ePurpleTeam) + bz_getTeamCount(eRogueTeam); if (numPlayers <= 1) { if (!koth.onePlayerWarn) bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "King of the Hill disabled: less than 2 players."); koth.onePlayerWarn = true; return true; } else { if (koth.onePlayerWarn) bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "King of the Hill enabled: more than 1 player."); koth.onePlayerWarn = false; return false; } } void autoTime() { int numPlayers = bz_getTeamCount(eRedTeam) + bz_getTeamCount(eGreenTeam) + bz_getTeamCount(eBlueTeam) + bz_getTeamCount(ePurpleTeam) + bz_getTeamCount(eRogueTeam); if (!koth.autoTimeOn || numPlayers < 3) { koth.adjustedTime = koth.TTH; return; } double timeDown = ( 1 - ((double)numPlayers - 2) * koth.timeMult); if (timeDown < koth.timeMultMin) timeDown = koth.timeMultMin; koth.adjustedTime = (int)(koth.TTH * timeDown); return; } double ConvertToNum(std::string inmessage, double minNum, double maxNum){ int messagelength = (int)inmessage.length(); if (messagelength > 0 && messagelength < 5) { double messagevalue = 0; double tens = 1; for ( int i = (messagelength - 1); i >= 0; i-- ){ if (inmessage[i] < '0' || inmessage[i] > '9') // got something other than a number return 0; tens *= 10; messagevalue += (((double)inmessage[i] - '0') / 10) * tens; } if (messagevalue >= minNum && messagevalue <= maxNum) return messagevalue; } return 0; } void killTeams(bz_eTeamType safeteam, std::string kothcallsign) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player){ if (player->team != safeteam) { bz_killPlayer(player->playerID, true, BZ_SERVER); if (koth.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } else if (koth.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) IS KING OF THE HILL!", getTeamColor(safeteam), kothcallsign.c_str()); return; } void killPlayers(int safeid, std::string kothcallsign) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player){ if (player->playerID != safeid) { bz_killPlayer(player->playerID, true, koth.id); if (koth.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } else if (koth.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s IS KING OF THE HILL!", kothcallsign.c_str()); return; } void sendWarnings(const char* teamcolor, std::string playercallsign, double kothstartedtime) { double TimeElapsed = bz_getCurrentTime() - kothstartedtime; double TimeRemaining = koth.adjustedTime - TimeElapsed; int toTens = int((TimeRemaining + 5) / 10) * 10; if ((TimeRemaining/60) < koth.TTHminutes && koth.adjustedTime > 59) { if (!koth.teamPlay || koth.team == eRogueTeam) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s will be King in %i secs!", playercallsign.c_str(), toTens); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) will be King in %i secs!", teamcolor, playercallsign.c_str(), toTens); koth.TTHminutes--; } if (koth.adjustedTime < koth.TTHseconds) { koth.TTHseconds = koth.TTHseconds - 10; return; } if (TimeRemaining < koth.TTHseconds) { if (!koth.teamPlay || koth.team == eRogueTeam) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s will be King in %i secs!", playercallsign.c_str(), koth.TTHseconds); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) will be King in %i secs!", teamcolor, playercallsign.c_str(), koth.TTHseconds); koth.TTHseconds = koth.TTHseconds - 10; } return; } void initiatekoth(bz_eTeamType plyrteam, bz_ApiString plyrcallsign, int plyrID) { koth.team = plyrteam; koth.callsign = plyrcallsign.c_str(); if (koth.callsign.size() > 16) { std::string tofix = truncate(koth.callsign); koth.callsign = tofix; } koth.id = plyrID; koth.startTime = bz_getCurrentTime(); koth.TTHminutes = (int)(koth.adjustedTime/60 + 0.5); koth.TTHseconds = 30; koth.toldHillOpen = false; bool multipleof30 = false; if ((int)((koth.adjustedTime / 30) + 0.5) != (double)(koth.adjustedTime / 30)) multipleof30 = false; else multipleof30 = true; if (!multipleof30) { if ((!koth.teamPlay || koth.team == eRogueTeam)) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s has Hill; will be King in %i secs!", koth.callsign.c_str(), (int)koth.adjustedTime); else bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s (%s) has Hill; will be King in %i secs!", getTeamColor(koth.team), koth.callsign.c_str(), (int)koth.adjustedTime); } if (koth.soundEnabled) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { if (player->team != koth.team) bz_sendPlayCustomLocalSound(player->playerID,"flag_alert"); else bz_sendPlayCustomLocalSound(player->playerID,"teamgrab"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); } return; } bool teamClear(bz_eTeamType teamToCheck) { if (teamToCheck == eRogueTeam || teamToCheck == eNoTeam || !koth.teamPlay) return true; bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); bool isOut = true; for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { if (player->team == teamToCheck && kothzone.pointIn(player->lastKnownState.pos) && player->spawned) isOut = false; } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); return isOut; } void KOTHPlayerPaused ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerPausedEvent || !koth.enabled) return; bz_PlayerPausedEventData_V1 *PauseData = (bz_PlayerPausedEventData_V1*)eventData; bz_BasePlayerRecord *player = bz_getPlayerByIndex(PauseData->playerID); if (player) { if(kothzone.pointIn(player->lastKnownState.pos)) { bz_killPlayer (PauseData->playerID, true, BZ_SERVER); bz_sendTextMessage (BZ_SERVER, PauseData->playerID, "Cannot pause while on the Hill."); } } bz_freePlayerRecord(player); return; } void KOTHPlayerJoined ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerJoinEvent || !koth.enabled) return; autoTime(); return; } void KOTHPlayerLeft ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerPartEvent || !koth.enabled) return; autoTime(); bz_PlayerJoinPartEventData_V1 *partData = (bz_PlayerJoinPartEventData_V1*)eventData; if (partData->playerID == koth.id) { koth.id = -1; koth.team = eNoTeam; } return; } void KOTHPlayerDied( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerDieEvent || !koth.enabled) return; bz_PlayerDieEventData_V1 *dieData = (bz_PlayerDieEventData_V1*)eventData; if (dieData->playerID == koth.id) { koth.id = -1; koth.team = eNoTeam; } return; } inline void KOTHEventHandler( bz_EventData *eventData ) { if (!koth.enabled) // King of the Hill disabled - we can leave return; if (onePlayer()) // Not enough players - we can leave return; float pos[3] = {0}; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: pos[0] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[0]; pos[1] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[1]; pos[2] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[2]; playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; case bz_eShotFiredEvent: pos[0] = ((bz_ShotFiredEventData_V1*)eventData)->pos[0]; pos[1] = ((bz_ShotFiredEventData_V1*)eventData)->pos[1]; pos[2] = ((bz_ShotFiredEventData_V1*)eventData)->pos[2]; playerID = ((bz_ShotFiredEventData_V1*)eventData)->playerID; break; default: return; } if (!koth.toldHillOpen && koth.id == -1) // Hill is open - inform players { bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "Hill is not controlled - take it!"); koth.toldHillOpen = true; } if (kothzone.pointIn(pos)) // player is on Hill { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerID); if (player) { if (player->playerID != koth.playerJustWon && player->spawned) { if ((koth.id == -1 && player->team != koth.team) || (koth.id == -1 && teamClear(koth.team))) initiatekoth(player->team, player->callsign, player->playerID); double timeStanding = bz_getCurrentTime() - koth.startTime; if (timeStanding >= koth.adjustedTime && koth.id != -1) // time's up - kill 'em { if (koth.teamPlay && koth.team != eRogueTeam) killTeams(koth.team, koth.callsign); else killPlayers(koth.id, koth.callsign); if (!koth.teamPlay || koth.team == eRogueTeam) bz_sendTextMessage (BZ_SERVER, koth.id, "You are King of the Hill! You must leave hill to retake it."); else bz_sendTextMessage (BZ_SERVER, koth.team, "Your team is King of the Hill! Entire team must leave hill to retake it."); koth.playerJustWon = koth.id; koth.id = -1; return; } if (koth.id != -1) sendWarnings(getTeamColor(koth.team), koth.callsign, koth.startTime); } } bz_freePlayerRecord(player); } else // player is off Hill { if (playerID == koth.playerJustWon) koth.playerJustWon = -1; if (playerID == koth.id) { koth.id = -1; koth.team = eNoTeam; } } } void KOTHHandler::Event( bz_EventData *eventData ) { if (eventData->eventType == bz_ePlayerUpdateEvent) KOTHEventHandler(eventData); else if (eventData->eventType == bz_eShotFiredEvent) KOTHEventHandler(eventData); else if (eventData->eventType == bz_ePlayerDieEvent) KOTHPlayerDied(eventData); else if (eventData->eventType == bz_ePlayerJoinEvent) KOTHPlayerJoined(eventData); else if (eventData->eventType == bz_ePlayerPartEvent) KOTHPlayerLeft(eventData); else if (eventData->eventType == bz_ePlayerPausedEvent) KOTHPlayerPaused(eventData); } bool KOTHCommands::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); const char* kingmessage = _message.c_str(); if ( command == "kingsay" ) { if (koth.id != -1) bz_sendTextMessage (playerID, koth.id, kingmessage); else bz_sendTextMessage(BZ_SERVER,playerID,"There is no one attempting to be king right now."); return true; } bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (fromPlayer) { if ( !fromPlayer->admin ) { bz_sendTextMessage(BZ_SERVER,playerID,"You must be admin to use the koth commands."); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); } if ( command == "kothon") { koth.enabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill is enabled."); return true; } if ( command == "kothoff") { koth.enabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill is disabled."); return true; } if ( command == "kothsoundon") { koth.soundEnabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill sounds are enabled."); return true; } if ( command == "kothsoundoff") { koth.soundEnabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill sounds are disabled."); return true; } if ( command == "kothtimemult") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { koth.timeMult = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Auto time multiplier set to %i percent.", (int)(koth.timeMult*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Auto time multiplier must be between 1 and 99 percent.", (int)(koth.timeMult*100 + 0.5)); autoTime(); return true; } if ( command == "kothtimemultmin") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { koth.timeMultMin = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Auto time multiplier minimum set to %i percent.", (int)(koth.timeMultMin*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Auto time multiplier minimum must be between 1 and 99 percent."); autoTime(); return true; } if ( command == "kothstatus") { if (koth.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill is currently enabled."); if (!koth.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill is currently disabled."); if (koth.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill sounds are currently enabled."); if (!koth.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill sounds are currently disabled."); if (koth.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Automatic time adjustment is currently enabled."); if (!koth.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Automatic time adjustment is currently disabled."); bz_sendTextMessagef (BZ_SERVER, playerID, "Time multiplier = %i percent.", (int)(koth.timeMult*100 + 0.5)); bz_sendTextMessagef (BZ_SERVER, playerID, "Time multiplier minimum = %i percent.", (int)(koth.timeMultMin*100 + 0.5)); int AdjTime = (int)(koth.adjustedTime + 0.5); bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill hold time is currently set to: %i seconds", AdjTime); return true; } // explicit time command handler: if ( command == "kothtime" ) { double inputvalue = ConvertToNum(message, 1, 7200); if (inputvalue > 0 ) { koth.TTH = inputvalue; autoTime(); int AdjTime = (int)(inputvalue + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill hold time has been set to %i seconds.", AdjTime); } else bz_sendTextMessagef (BZ_SERVER, playerID, "King of the Hill hold time invalid: must be between 1 and 7200 seconds."); autoTime(); return true; } if ( command == "kothautotimeon") { koth.autoTimeOn = true; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill automatic time adjustment on."); return true; } if ( command == "kothautotimeoff") { koth.autoTimeOn = false; koth.adjustedTime = koth.TTH; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "King of the Hill automatic time adjustment off."); return true; } return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/koth/koth.def000066400000000000000000000001461200563112200175130ustar00rootroot00000000000000LIBRARY koth EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/koth/koth.sln000066400000000000000000000023071200563112200175520ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "koth", "koth.vcxproj", "{3086EB1F-209A-43CF-91B7-0AECBA87B4D9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|Win32.ActiveCfg = Debug|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|Win32.Build.0 = Debug|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|x64.ActiveCfg = Debug|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Debug|x64.Build.0 = Debug|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|Win32.ActiveCfg = Release|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|Win32.Build.0 = Release|Win32 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|x64.ActiveCfg = Release|x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/koth/koth.vcxproj000066400000000000000000000330661200563112200204570ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {3086EB1F-209A-43CF-91B7-0AECBA87B4D9} koth Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;koth_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)koth.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) koth.def true $(OutDir)koth.pdb Windows false $(OutDir)koth.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;koth_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)koth.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) koth.def true $(OutDir)koth.pdb Windows false $(OutDir)koth.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;koth_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)koth.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) koth.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)koth.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;koth_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)koth.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) koth.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)koth.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true bzflag-2.4.2+ds1/plugins/koth/koth_admin.txt000066400000000000000000000015041200563112200207430ustar00rootroot00000000000000---------------------------------------------------------- King of the Hill Commands Available: ---------------------------------------------------------- Admin only: "kothon" - King of the Hill mode on. "kothoff" - King of the Hill mode off. "kothtimemult <%>" - sets auto time multiplier per player. "kothtimemultmin <%>" - sets auto time minimum multiplier. "kothautotimeon" - enable the autotime function. "kothautotimeoff" - disable the autotime funtion. "kothsoundon" - enable the plugin's sounds. "kothsoundoff" - disable the plugin's sounds. "kothtime " - change hold time 1-7200 secs. "kothstatus" - return the status of the plugin. ---------------------------------------------------------- All Players: "kingsay " - message to player holding hill. ---------------------------------------------------------- bzflag-2.4.2+ds1/plugins/koth/koth_rules.txt000066400000000000000000000011651200563112200210100ustar00rootroot00000000000000---------------------------------------------------- Goal of game: control center of map ("Hill") for the indicated amount of time and server will kill all other teams/players. ---------------------------------------------------- Look for yellow rings in center of map - this entire volume is the "Hill". ---------------------------------------------------- Watch server messages for game updates- who holds the hill, how much time is left, etc. ---------------------------------------------------- You may send a message to player holding the hill with "/kingsay ". ---------------------------------------------------- bzflag-2.4.2+ds1/plugins/logDetail/000077500000000000000000000000001200563112200170245ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/logDetail/Makefile.am000066400000000000000000000005771200563112200210710ustar00rootroot00000000000000lib_LTLIBRARIES = logDetail.la logDetail_la_SOURCES = logDetail.cpp logDetail_la_CPPFLAGS = -I$(top_srcdir)/include logDetail_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ logDetail.def \ logDetail.sln \ logDetail.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/logDetail/Makefile.in000066400000000000000000000457441200563112200211070ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/logDetail DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) logDetail_la_LIBADD = am_logDetail_la_OBJECTS = logDetail_la-logDetail.lo logDetail_la_OBJECTS = $(am_logDetail_la_OBJECTS) logDetail_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(logDetail_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(logDetail_la_SOURCES) DIST_SOURCES = $(logDetail_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = logDetail.la logDetail_la_SOURCES = logDetail.cpp logDetail_la_CPPFLAGS = -I$(top_srcdir)/include logDetail_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ logDetail.def \ logDetail.sln \ logDetail.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/logDetail/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/logDetail/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done logDetail.la: $(logDetail_la_OBJECTS) $(logDetail_la_DEPENDENCIES) $(logDetail_la_LINK) -rpath $(libdir) $(logDetail_la_OBJECTS) $(logDetail_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logDetail_la-logDetail.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< logDetail_la-logDetail.lo: logDetail.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(logDetail_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT logDetail_la-logDetail.lo -MD -MP -MF $(DEPDIR)/logDetail_la-logDetail.Tpo -c -o logDetail_la-logDetail.lo `test -f 'logDetail.cpp' || echo '$(srcdir)/'`logDetail.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/logDetail_la-logDetail.Tpo $(DEPDIR)/logDetail_la-logDetail.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='logDetail.cpp' object='logDetail_la-logDetail.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(logDetail_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o logDetail_la-logDetail.lo `test -f 'logDetail.cpp' || echo '$(srcdir)/'`logDetail.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/logDetail/README.txt000066400000000000000000000032001200563112200205150ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : logDetail Project Overview ======================================================================== This is the logDetail plugin. It displays information about server events and chat to the standard output server log. The log detail plugin displays: * unprocessed user commands (slash commands before they are processed - valid or not) * player reports * chat messages (broadcasts, team messages, admin channel messages, and private messages) * server messages * players joining (ip, auth status, team, etc) * player authentication changes (via /password or /identify) * players leaving The plugin currently takes no parameters. Sample output: PLAYER-JOIN 10:SomePlayer #0 OBSERVER IP:127.0.0.1 PLAYER-JOIN 15:SomeOtherPlayer #1 RED IP:127.0.0.1 MSG-BROADCAST 15:SomeOtherPlayer hi MSG-DIRECT 15:SomeOtherPlayer 10:SomePlayer what's up MSG-TEAM 15:SomeOtherPlayer RED hi team! MSG-ADMIN 15:SomeOtherPlayer hello admins! MSG-TEAM 10:SomePlayer OBSERVER hi teammates MSG-DIRECT 10:SomePlayer 15:SomeOtherPlayer what's up? MSG-COMMAND 10:SomePlayer password oopsIforgot MSG-ADMIN 6:SERVER SomePlayer has tried to become administrator with bad password MSG-COMMAND 10:SomePlayer password secret PLAYER-AUTH 10:SomePlayer IP:127.0.0.1 ADMIN OPERATOR MSG-COMMAND 10:SomePlayer say this is a server message MSG-BROADCAST 6:SERVER this is a server message (SomePlayer) MSG-COMMAND 10:SomePlayer lagstats MSG-REPORT 10:SomePlayer nothing to report MSG-COMMAND 15:SomeOtherPlayer quit PLAYER-PART 15:SomeOtherPlayer #1 MSG-COMMAND 10:SomePlayer shutdownserver bzflag-2.4.2+ds1/plugins/logDetail/logDetail.cpp000066400000000000000000000231031200563112200214330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // logDetail.cpp : Plugin module for logging server events to stdout // #include #include #include "bzfsAPI.h" enum action { join , auth , part }; class LogDetail : public bz_Plugin { public: virtual const char* Name (){return "Log Detail";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); private: std::string displayPlayerPrivs( int playerID ); std::string displayCallsign( bz_ApiString callsign ); std::string displayCallsign( int playerID ); std::string displayBZid( int playerID ); std::string displayTeam( bz_eTeamType team ); virtual void listPlayers( action act, bz_PlayerJoinPartEventData_V1 *data ); }; BZ_PLUGIN(LogDetail) void LogDetail::Init ( const char* /*commandLine*/ ) { Register(bz_eSlashCommandEvent); Register(bz_eRawChatMessageEvent); Register(bz_eServerMsgEvent); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerPartEvent); Register(bz_ePlayerAuthEvent); Register(bz_eMessageFilteredEvent); bz_debugMessage(0, "SERVER-STATUS Running"); bz_debugMessagef(0, "SERVER-MAPNAME %s", bz_getPublicDescription().c_str()); listPlayers( join , NULL ); } void LogDetail::Cleanup() { listPlayers( part , NULL ); bz_debugMessage(0, "SERVER-STATUS Stopped"); Flush(); } void LogDetail::Event( bz_EventData *eventData ) { bz_ChatEventData_V1 *chatData = (bz_ChatEventData_V1 *) eventData; bz_ServerMsgEventData_V1 *serverMsgData = (bz_ServerMsgEventData_V1 *) eventData; bz_SlashCommandEventData_V1 *cmdData = (bz_SlashCommandEventData_V1 *) eventData; bz_PlayerJoinPartEventData_V1 *joinPartData = (bz_PlayerJoinPartEventData_V1 *) eventData; bz_PlayerAuthEventData_V1 *authData = (bz_PlayerAuthEventData_V1 *) eventData; bz_MessageFilteredEventData_V1 *filteredData = (bz_MessageFilteredEventData_V1 *) eventData; char temp[9] = {0}; if (eventData) { switch (eventData->eventType) { case bz_eSlashCommandEvent: // Slash commands are case insensitive // Tokenize the stream and check the first word // /report -> MSG-REPORT // anything -> MSG-COMMAND strncpy(temp, cmdData->message.c_str(), 8); if (strcasecmp( temp, "/REPORT ") == 0) { bz_debugMessagef(0, "MSG-REPORT %s %s", displayCallsign( cmdData->from ).c_str(), cmdData->message.c_str()+8); } else { bz_debugMessagef(0, "MSG-COMMAND %s %s", displayCallsign( cmdData->from ).c_str(), cmdData->message.c_str()+1); } break; case bz_eRawChatMessageEvent: if ((chatData->to == BZ_ALLUSERS) && (chatData->team == eNoTeam)) { bz_debugMessagef(0, "MSG-BROADCAST %s %s", displayCallsign( chatData->from ).c_str(), chatData->message.c_str()); } else if (chatData->to == BZ_NULLUSER) { if (chatData->team == eAdministrators) { bz_debugMessagef(0, "MSG-ADMIN %s %s", displayCallsign( chatData->from ).c_str(), chatData->message.c_str()); } else { bz_debugMessagef(0, "MSG-TEAM %s %s %s", displayCallsign( chatData->from ).c_str(), displayTeam( chatData->team ).c_str(), chatData->message.c_str()); } } else { bz_debugMessagef(0, "MSG-DIRECT %s %s %s", displayCallsign( chatData->from ).c_str(), displayCallsign( chatData->to ).c_str(), chatData->message.c_str()); } break; case bz_eMessageFilteredEvent: bz_debugMessagef(0, "MSG-FILTERED %s %s", displayCallsign( filteredData->playerID ).c_str(), filteredData->filteredMessage.c_str()); break; case bz_eServerMsgEvent: if ((serverMsgData->to == BZ_ALLUSERS) && (serverMsgData->team == eNoTeam)) { bz_debugMessagef(0, "MSG-BROADCAST 6:SERVER %s", serverMsgData->message.c_str()); } else if (serverMsgData->to == BZ_NULLUSER) { if (serverMsgData->team == eAdministrators) { bz_debugMessagef(0, "MSG-ADMIN 6:SERVER %s", serverMsgData->message.c_str()); } else { bz_debugMessagef(0, "MSG-TEAM 6:SERVER %s %s", displayTeam( serverMsgData->team ).c_str(), serverMsgData->message.c_str()); } } else { bz_debugMessagef(0, "MSG-DIRECT 6:SERVER %s %s", displayCallsign( serverMsgData->to ).c_str(), serverMsgData->message.c_str()); } break; case bz_ePlayerJoinEvent: { if (joinPartData->record) { bz_debugMessagef(0, "PLAYER-JOIN %s #%d%s %s %s", displayCallsign( joinPartData->playerID).c_str(), joinPartData->playerID, displayBZid( joinPartData->playerID ).c_str(), displayTeam( joinPartData->record->team ).c_str(), displayPlayerPrivs( joinPartData->playerID ).c_str()); listPlayers( join, joinPartData); } } break; case bz_ePlayerPartEvent: bz_debugMessagef(0, "PLAYER-PART %s #%d%s %s", displayCallsign( joinPartData->playerID ).c_str(), joinPartData->playerID, displayBZid( joinPartData->playerID ).c_str(), joinPartData->reason.c_str()); listPlayers( part, joinPartData); break; case bz_ePlayerAuthEvent: bz_debugMessagef(0, "PLAYER-AUTH %s %s", displayCallsign( authData->playerID ).c_str(), displayPlayerPrivs( authData->playerID ).c_str()), listPlayers( join, joinPartData); break; default : break; } } } std::string LogDetail::displayBZid( int playerID ) { std::ostringstream bzid; bz_BasePlayerRecord *player = bz_getPlayerByIndex( playerID ); if (player) { if (player->globalUser) bzid << " BZid:" << player->bzID.c_str(); bz_freePlayerRecord( player ); } return bzid.str(); } std::string LogDetail::displayPlayerPrivs( int playerID ) { std::ostringstream playerPrivs; bz_BasePlayerRecord *player = bz_getPlayerByIndex( playerID ); if (player) { playerPrivs << "IP:" << player->ipAddress.c_str(); if (player->verified ) playerPrivs << " VERIFIED"; if (player->globalUser ) playerPrivs << " GLOBALUSER"; if (player->admin ) playerPrivs << " ADMIN"; if (player->op ) playerPrivs << " OPERATOR"; bz_freePlayerRecord( player ); } else { playerPrivs << "IP:0.0.0.0"; } return playerPrivs.str(); } std::string LogDetail::displayCallsign( bz_ApiString callsign ) { std::ostringstream result; result << strlen( callsign.c_str() ) << ":" << callsign.c_str(); return result.str(); } std::string LogDetail::displayCallsign( int playerID ) { std::ostringstream callsign; bz_BasePlayerRecord *player = bz_getPlayerByIndex( playerID ); if (player) { callsign << strlen( player->callsign.c_str() ) << ":"; callsign << player->callsign.c_str(); bz_freePlayerRecord( player ); } else { callsign << "7:UNKNOWN"; } return callsign.str(); } std::string LogDetail::displayTeam( bz_eTeamType team ) { // Display the player team switch ( team ) { case eRogueTeam: return std::string("ROGUE"); case eRedTeam: return std::string("RED"); case eGreenTeam: return std::string("GREEN"); case eBlueTeam: return std::string("BLUE"); case ePurpleTeam: return std::string("PURPLE"); case eRabbitTeam: return std::string("RABBIT"); case eHunterTeam: return std::string("HUNTER"); case eObservers: return std::string("OBSERVER"); default : return std::string("NOTEAM"); } } void LogDetail::listPlayers( action act , bz_PlayerJoinPartEventData_V1 *data ) { bz_APIIntList *playerList = bz_newIntList(); bz_BasePlayerRecord *player = NULL; std::ostringstream msg; char playerStatus; int numPlayers; bz_getPlayerIndexList( playerList ); bz_debugMessage( 4 , "Players:" ); // // Count number of players // numPlayers = 0; for ( unsigned int i = 0; i < playerList->size(); i++ ) { player = bz_getPlayerByIndex( playerList->get(i)); if (player) { if ((player->callsign != "") && (act == join || act == auth || (data && (player->playerID != data->playerID)))) numPlayers++; bz_freePlayerRecord( player ); } } // // Display number of players, callsign, and motto string in the following format: // // PLAYERS (nn) [G]cc:callsign(ee:mottostring) // nn - number of players // G - global auth identifier (+|-| |@) // cc - count of characters in player callsign // callsign - player callsign // ee - count of characters in motto string // mottostring - player motto string // // eg. // PLAYERS (2) [@]7:Thumper(16:me@somewhere.net) [ ]3:xxx() // msg.str(""); msg << "PLAYERS (" << numPlayers << ")"; for ( unsigned int i = 0; i < playerList->size(); i++ ) { player = bz_getPlayerByIndex( playerList->get(i)); if (player) { if ((player->callsign != "") && (act == join || act == auth || (data && (player->playerID != data->playerID)))) { playerStatus = ' '; if (player->globalUser) playerStatus = '+'; if (player->verified) playerStatus = '+'; if (player->admin && !bz_hasPerm(player->playerID, bz_perm_hideAdmin)) playerStatus = '@'; msg << " [" << playerStatus << "]"; msg << player->callsign.size() << ':'; msg << player->callsign.c_str() << "(" << bz_getPlayerMotto(player->playerID) << ")"; } } } bz_debugMessage(0, msg.str().c_str()); bz_deleteIntList(playerList); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/logDetail/logDetail.def000066400000000000000000000001531200563112200214070ustar00rootroot00000000000000LIBRARY logDetail EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/logDetail/logDetail.sln000066400000000000000000000023211200563112200214440ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logDetail", "logDetail.vcxproj", "{6B10F1DA-CD6A-4994-8C29-95DAE215D331}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|Win32.ActiveCfg = Debug|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|Win32.Build.0 = Debug|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|x64.ActiveCfg = Debug|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Debug|x64.Build.0 = Debug|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|Win32.ActiveCfg = Release|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|Win32.Build.0 = Release|Win32 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|x64.ActiveCfg = Release|x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/logDetail/logDetail.vcxproj000066400000000000000000000335751200563112200223620ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {6B10F1DA-CD6A-4994-8C29-95DAE215D331} logDetail Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;logDetail_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)logDetail.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) logDetail.def true $(OutDir)logDetail.pdb Windows false $(OutDir)logDetail.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;logDetail_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)logDetail.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) logDetail.def true $(OutDir)logDetail.pdb Windows false $(OutDir)logDetail.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;logDetail_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)logDetail.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) logDetail.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)logDetail.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;logDetail_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)logDetail.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) logDetail.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)logDetail.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/nagware/000077500000000000000000000000001200563112200165445ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/nagware/CHANGELOG.txt000066400000000000000000000004341200563112200205750ustar00rootroot00000000000000*) 1.00.03 (2006-03-04) Added option for including/excluding observers from player count trigger. *) 1.00.02 (2006-01-21): Send "You need X permission..." message only to the player that tried to do /nag command. *) 1.00.01 (2006-01-20): Only kick one player at a time. bzflag-2.4.2+ds1/plugins/nagware/Makefile.am000066400000000000000000000006211200563112200205770ustar00rootroot00000000000000lib_LTLIBRARIES = nagware.la nagware_la_SOURCES = nagware.cpp nagware_la_CPPFLAGS = -I$(top_srcdir)/include nagware_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ CHANGELOG.txt \ NAGSAMPLE.cfg \ README.txt \ nagware.def \ nagware.sln \ nagware.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/nagware/Makefile.in000066400000000000000000000456341200563112200206250ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/nagware DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) nagware_la_LIBADD = am_nagware_la_OBJECTS = nagware_la-nagware.lo nagware_la_OBJECTS = $(am_nagware_la_OBJECTS) nagware_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(nagware_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(nagware_la_SOURCES) DIST_SOURCES = $(nagware_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = nagware.la nagware_la_SOURCES = nagware.cpp nagware_la_CPPFLAGS = -I$(top_srcdir)/include nagware_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ CHANGELOG.txt \ NAGSAMPLE.cfg \ README.txt \ nagware.def \ nagware.sln \ nagware.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/nagware/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/nagware/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done nagware.la: $(nagware_la_OBJECTS) $(nagware_la_DEPENDENCIES) $(nagware_la_LINK) -rpath $(libdir) $(nagware_la_OBJECTS) $(nagware_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nagware_la-nagware.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< nagware_la-nagware.lo: nagware.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(nagware_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT nagware_la-nagware.lo -MD -MP -MF $(DEPDIR)/nagware_la-nagware.Tpo -c -o nagware_la-nagware.lo `test -f 'nagware.cpp' || echo '$(srcdir)/'`nagware.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/nagware_la-nagware.Tpo $(DEPDIR)/nagware_la-nagware.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='nagware.cpp' object='nagware_la-nagware.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(nagware_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o nagware_la-nagware.lo `test -f 'nagware.cpp' || echo '$(srcdir)/'`nagware.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/nagware/NAGSAMPLE.cfg000066400000000000000000000027431200563112200205420ustar00rootroot00000000000000# Sample configuration file for the nagware plugin. # # permission tag to use to grant "/nag" command permissions # defaults to "NAG" if not specified. permname = say # Apply logic to observers ? (yes/no) # default is no kickobs = yes # minplayers: There must be this many players before anybody is # kicked, but the warnings will still happen. # default is 1 minplayers = 2 # Include observers in minplayer count ? (yes/no) # default is yes countobs = yes # messagesuffix: Message to be added to the end of all other defined messages. messagesuffix = \nRegister at http://my.bzflag.org/bb/ and use your login in the bzflag connect screen. # Message: Messages to be sent to players at specified times. # Format is: TIME,[REPEAT] MESSAGE # *) Time and repeat are in minutes, whole numbers only (0 is allowed) # *) If repeat is specified, the message will be repeated every [REPEAT] minutes until the next # message is applied (if any), or the player is kicked. message = 1 This server requires global registration. message = 2 Dieser Server erfordert globale Registrierung.\nCe serveur exige l'enregistrement global\nEste camarero requiere matrcula global message = 3,1 You will be kicked from this server shortly, please register and come back! message = 6,2 You are now marked to be kicked randomly. # Same format as above, except 'repeat' is not used. # If not defined, no players will be kicked. kickmessage = 7 You have been kicked because you are not registered. bzflag-2.4.2+ds1/plugins/nagware/README.txt000066400000000000000000000031421200563112200202420ustar00rootroot00000000000000======================================================================== NAGWARE, a bzfs plugin v 1.00.00 (menotume) ======================================================================== The nagware plugin is designed to encourage players to register their callsigns at my.bzflag.org/bb. Nagware can send text messages to unverified players at defined intervals, as well as automatically kick unverified players. The plugin is customized using a plain-text configuration file. ------------------------------ See NAGSAMPLE.CFG for details. ------------------------------ Load the plugin in bzfs with the following configuration option: -loadplugin , For example (on linux): -loadplugin /home/bzfs/lib/nagware.so,/home/bzfs/configs/nagware.cfg If there is an error in the configuration file, the plugin will not load. See the output of bzfs (or log file) for details. The following commands are available to privileged players (see the sample config file for how to set the permission name): /nag on: Enables the plugin for sending messages and kicking players. The plugin is enabled by default. /nag off: Stops the plugin from sending messages and kicking players. Re-enable with '/nag on'. NOTE that the plugin is automatically disabled during a match. /nag config: Display the current configuration options. /nag reload: Reload the configuration file. Any config file errors will be shown. /nag list: Show all unverified players, and how long they have been connected. bzflag-2.4.2+ds1/plugins/nagware/nagware.cpp000066400000000000000000000404651200563112200207050ustar00rootroot00000000000000// nagware.cpp : 'Nagware' plugin to encourage player registration // // $Id: nagware.cpp 22360 2012-02-10 18:15:02Z bullet_catcher $ #include "bzfsAPI.h" #include #define NAGWAREPLUG_VER "1.00.03" #define MAX_PLAYERID 255 #define EVENT_FREQUENCY 15 // number of seconds between checks #define TIME_FACTOR 60 // number of seconds per minute (useful to decrease for testing) // TODO: check for msgs > 128 chars and warn ( readConfig() ) struct st_MsgEnt{ st_MsgEnt(int t, int r, std::string m): time(t), repeat(r), msg(m) {} st_MsgEnt() {} int time; int repeat; std::string msg; }; typedef struct st_MsgEnt MsgEnt; typedef struct { char permName[31]; bool enableObs; bool countObs; int minPlayers; MsgEnt *kickMsg; std::vector nagMsgs; std::string msgSuffix; } NagConfig; NagConfig Config; typedef struct { bool isValid; char callsign[22]; bz_eTeamType team; double joinTime; double nextEventTime; MsgEnt *nextEventMsg; bool isVerified; } NagPlayer; NagPlayer Players[MAX_PLAYERID+1]; int NumPlayers=0; int NumObservers=0; int MaxUsedID=0; bool NagEnabled = true; double MatchStartTime = 0; char ConfigFilename[256] = ""; float NextEventTime = 0.0f; class Nagware : public bz_Plugin, public bz_CustomSlashCommandHandler { public: virtual const char* Name (){return "NAGWARE";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); virtual bool SlashCommand ( int playerID, bz_ApiString, bz_ApiString, bz_APIStringList*); protected: private: }; BZ_PLUGIN(Nagware) bool readConfig (char *filename, NagConfig *cfg, int playerID); double nextRepeat (double playerTime, MsgEnt *m){ if (m->repeat == 0) return 0; int last = (int)((playerTime - m->time) / m->repeat); return (m->time + (m->repeat * (last+1))); } void updatePlayerNextEvent (int playerID, double now){ unsigned int idx; double playerTime = now - Players[playerID].joinTime; double repeat; if (!Players[playerID].isValid || Players[playerID].isVerified) return; Players[playerID].nextEventTime = -1; if (Config.nagMsgs.size() == 0) return; for (idx=0; idxtime > playerTime){ if (idx > 0 && (repeat = nextRepeat (playerTime, Config.nagMsgs[idx-1])) > 0 && repeat < Config.nagMsgs[idx]->time){ Players[playerID].nextEventTime = Players[playerID].joinTime + repeat; Players[playerID].nextEventMsg = Config.nagMsgs[idx-1]; } else { Players[playerID].nextEventTime = Players[playerID].joinTime + Config.nagMsgs[idx]->time; Players[playerID].nextEventMsg = Config.nagMsgs[idx]; } break; } } if (Players[playerID].nextEventTime < 0 && (repeat = nextRepeat (playerTime, Config.nagMsgs[Config.nagMsgs.size()-1])) > 0){ Players[playerID].nextEventTime = Players[playerID].joinTime + repeat; Players[playerID].nextEventMsg = Config.nagMsgs[Config.nagMsgs.size()-1]; } } void sendNagMessage (int who, std::string *msg ){ std::string fullMsg = *msg + Config.msgSuffix; unsigned int idx=0, x; while ((x = (unsigned int)fullMsg.find("\\n", idx)) != (unsigned int)std::string::npos){ bz_sendTextMessage(BZ_SERVER, who, fullMsg.substr(idx, x-idx).c_str()); idx = x+2; } bz_sendTextMessage(BZ_SERVER, who, fullMsg.substr(idx).c_str()); } void tickEvent (float time) { int x; if (time < NextEventTime || !NagEnabled || MatchStartTime!=0.0) return; for (x=0; x<=MaxUsedID; x++){ if (Players[x].isValid && !Players[x].isVerified && Players[x].nextEventTime>=0 && time>Players[x].nextEventTime){ sendNagMessage(x, &Players[x].nextEventMsg->msg); updatePlayerNextEvent (x, time); } } x = NumPlayers; if (Config.countObs) x += NumObservers; if (Config.kickMsg && Config.kickMsg->time>0 && x>=Config.minPlayers){ // kick someone ! double kicktime = Config.kickMsg->time; for (x=0; x<=MaxUsedID; x++) if (Players[x].isValid && !Players[x].isVerified && time>(Players[x].joinTime+kicktime) && (Config.enableObs || Players[x].team!=eObservers)){ bz_kickUser (x, Config.kickMsg->msg.c_str(), true); break; } } NextEventTime = time + (float)EVENT_FREQUENCY; } void dispNagMsg (int who, const char* label, MsgEnt *m){ char msg[140]; if (m->repeat) sprintf (msg, "%s msg: %d (%d): ", label, m->time, m->repeat); else sprintf (msg, "%s msg: %d: ", label, m->time); strncat (msg, m->msg.c_str(), 130); if (strlen (msg) > 124) // max line len is currently 125 (not 128!) strcpy (&msg[122], "..."); bz_sendTextMessage (BZ_SERVER, who, msg); } void nagShowConfig (int who) { unsigned int x; bz_sendTextMessage(BZ_SERVER, who, "nagware plugin configuration ........."); bz_sendTextMessagef(BZ_SERVER, who, "perm name: %s", Config.permName); bz_sendTextMessagef(BZ_SERVER, who, "min players: %d %s", Config.minPlayers, Config.countObs?"(including observers)":""); if (Config.enableObs) bz_sendTextMessage(BZ_SERVER, who, "Observer kick is ENABLED"); else bz_sendTextMessage(BZ_SERVER, who, "Observer kick is DISABLED"); if (Config.msgSuffix.size() > 0 ) bz_sendTextMessagef(BZ_SERVER, who, "message suffix: %s", Config.msgSuffix.c_str()); for (x=0; xMAX_PLAYERID || playerID<0) return false; Players[playerID].isValid = true; Players[playerID].team = team; Players[playerID].isVerified = verified; strncpy (Players[playerID].callsign, callsign, 20); Players[playerID].joinTime = time; if (Config.nagMsgs.size() == 0) Players[playerID].nextEventTime = -1; else { Players[playerID].nextEventTime = time + (Config.nagMsgs[0]->time); Players[playerID].nextEventMsg = Config.nagMsgs[0]; } if (team == eObservers) ++NumObservers; else ++NumPlayers; if (playerID > MaxUsedID) MaxUsedID = playerID; return true; } bool listDel (int playerID) { if (playerID>MAX_PLAYERID || playerID<0 || !Players[playerID].isValid) return false; Players[playerID].isValid = false; if (Players[playerID].team == eObservers) --NumObservers; else --NumPlayers; return true; } void sendHelp (int who) { bz_sendTextMessage(BZ_SERVER, who, "NAG commands: off, on, config, reload, list"); } bool checkPerms (int playerID, const char *nagCmd, const char *permName) { if (permName==NULL || *permName=='\0') permName = "NAG"; if (bz_hasPerm (playerID, permName)) return true; bz_sendTextMessagef (BZ_SERVER, playerID, "You need \"%s\" permission to do /nag %s", permName, nagCmd); return false; } /* * Event handlers .... */ // handle events void Nagware::Event ( bz_EventData *eventData ) { // player JOIN if (eventData->eventType == bz_ePlayerJoinEvent) { bz_PlayerJoinPartEventData_V1 *joinData = (bz_PlayerJoinPartEventData_V1*)eventData; bz_debugMessagef(4, "+++ nagware: Player JOINED (ID:%d, TEAM:%d, CALLSIGN:%s)", joinData->playerID, joinData->record->team, joinData->record->callsign.c_str()); fflush (stdout); listAdd (joinData->playerID, joinData->record->callsign.c_str(), joinData->record->team, joinData->record->verified, joinData->eventTime); // player PART } else if (eventData->eventType == bz_ePlayerPartEvent) { bz_PlayerJoinPartEventData_V1 *joinData = (bz_PlayerJoinPartEventData_V1*)eventData; bz_debugMessagef(4, "+++ nagware: Player PARTED (ID:%d, TEAM:%d, CALLSIGN:%s)", joinData->playerID, joinData->record->team, joinData->record->callsign.c_str()); fflush (stdout); listDel (joinData->playerID); // game START } else if (eventData->eventType == bz_eGameStartEvent) { bz_GameStartEndEventData_V1 *msgData = (bz_GameStartEndEventData_V1*)eventData; bz_debugMessagef(4, "+++ nagware: Game START (%f, %f)", msgData->eventTime, msgData->duration); fflush (stdout); MatchStartTime = msgData->eventTime; // game END } else if (eventData->eventType == bz_eGameEndEvent) { bz_GameStartEndEventData_V1 *msgData = (bz_GameStartEndEventData_V1*)eventData; bz_debugMessagef(4, "+++ nagware: Game END (%f, %f)", msgData->eventTime, msgData->duration); fflush (stdout); MatchStartTime = 0.0f; // can determine length of match, and adjust event times if needed. // tick } else if (eventData->eventType == bz_eTickEvent) { bz_TickEventData_V1 *msgData = (bz_TickEventData_V1*)eventData; tickEvent ((float)msgData->eventTime); } } // handle /nag command bool Nagware::SlashCommand ( int playerID, bz_ApiString cmd, bz_ApiString, bz_APIStringList* cmdParams ) { char subCmd[6]; if (strcasecmp (cmd.c_str(), "nag")) // is it for me ? return false; if (cmdParams->get(0).c_str()[0] == '\0'){ sendHelp (playerID); return true; } strncpy (subCmd, cmdParams->get(0).c_str(), 5); subCmd[4] = '\0'; if (strcasecmp (subCmd, "conf") == 0){ if (checkPerms (playerID, "config", Config.permName)) nagShowConfig (playerID); } else if (strcasecmp (subCmd, "off") == 0){ if (checkPerms (playerID, "off", Config.permName)) nagEnable (false, playerID); } else if (strcasecmp (subCmd, "on") == 0){ if (checkPerms (playerID, "on", Config.permName)) nagEnable (true, playerID); } else if (strcasecmp (subCmd, "relo") == 0){ if (checkPerms (playerID, "reload", Config.permName)) nagReload (playerID); } else if (strcasecmp (subCmd, "list") == 0){ if (checkPerms (playerID, "list", Config.permName)) nagList (playerID); } else sendHelp (playerID); return true; } /* * Plugin load and unload... */ bool commandLineHelp (void) { const char *help[] = { "Command line args: PLUGINNAME,configname", "nagware plugin NOT loaded!", NULL }; bz_debugMessage (0, "+++ nagware plugin command-line error."); for (int x=0; help[x]!=NULL; x++) bz_debugMessage (0, help[x]); return true; } bool parseCommandLine (const char *cmdLine) { if (cmdLine==NULL || *cmdLine=='\0') return commandLineHelp (); strncpy (ConfigFilename, cmdLine, 255); if (readConfig(ConfigFilename, &Config, -1)){ bz_debugMessage (0, "+++ nagware plugin config file error, plugin NOT loaded"); return true; } return false; } void Nagware::Init(const char* cmdLine) { MaxWaitTime = 1.0f; bz_BasePlayerRecord *playerRecord; double now = bz_getCurrentTime(); if (parseCommandLine (cmdLine)) return; // get current list of player indices ... bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList (playerList); for (unsigned int i = 0; i < playerList->size(); i++){ if ((playerRecord = bz_getPlayerByIndex (playerList->get(i))) != NULL){ listAdd (playerList->get(i), playerRecord->callsign.c_str(), playerRecord->team, playerRecord->verified, now); bz_freePlayerRecord (playerRecord); } } bz_deleteIntList (playerList); bz_registerCustomSlashCommand ("nag", this); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerPartEvent); Register(bz_eGameStartEvent); Register(bz_eGameEndEvent); Register(bz_eTickEvent); bz_debugMessagef(0, "+++ nagware plugin loaded - v%s", NAGWAREPLUG_VER); } void Nagware::Cleanup(void) { bz_removeCustomSlashCommand ("nag"); Flush(); bz_debugMessage(0, "+++ nagware plugin unloaded"); } /* * Read Configuration file... */ bool configError (const char *msg, int linenum, int playerID, FILE *fp){ char send[256]; fclose (fp); sprintf (send, "+++ nagware config file error (%s) at line #%d", msg, linenum); bz_debugMessagef(0, send); if (playerID >=0) bz_sendTextMessage(BZ_SERVER, playerID, send); return true; } char *strtrim (char *s){ char c; char *p; while (*s == ' ') ++s; p = strlen(s) + s -1; while ( ((c=*p)==' ' || c=='\n') && p>s) *p--='\0'; return s; } MsgEnt * parseCfgMessage(const char *m){ char *p; int time, repeat=0; if ((p = (char *)strchr (m, ' ')) == NULL) return NULL; *p = '\0'; if (strchr (m, ',') != NULL){ if (sscanf (m, "%d,%d", &time, &repeat) != 2) return NULL; } else { if (sscanf (m, "%d", &time) != 1) return NULL; } if (time<0 || time > 500 || repeat < 0 || repeat > 1000) return NULL; // TODO: check linelen < 128 return new MsgEnt (time*TIME_FACTOR, repeat*TIME_FACTOR, p+1); } int compareMsgEnt (const void *a, const void *b){ return (*(MsgEnt**)a)->time - (*(MsgEnt**)b)->time; } bool readConfig (char *filename, NagConfig *cfg, int playerID){ FILE *cfile = fopen (filename, "r"); MsgEnt *md; int lineNum=0; char line[1026]; char *p, *key, *val; if (cfile == NULL){ sprintf (line, "+++ Error opening nagware config file (%s)", filename); bz_debugMessagef(0, line); if (playerID >=0) bz_sendTextMessage(BZ_SERVER, playerID, line); return true; } // install defaults ... strcpy (cfg->permName, "NAG"); cfg->enableObs = false; cfg->countObs = true; cfg->minPlayers = 0; cfg->msgSuffix = ""; cfg->nagMsgs.clear(); while ( fgets (line, 1024, cfile) != NULL ){ ++lineNum; if (line[0]=='#' || strlen(line)<2) continue; if ((p = strchr (line, '=')) == NULL) return configError ("no '='", lineNum, playerID, cfile); *p = '\0'; key = strtrim (line); val = strtrim (++p); if (!strcasecmp (key, "permname")){ strncpy (cfg->permName, val, 30); } else if (!strcasecmp (key, "kickobs")){ if ( !strcasecmp(val, "yes") || !strcasecmp(val, "true") ) cfg->enableObs = true; else cfg->enableObs = false; } else if (!strcasecmp (key, "countobs")){ if ( !strcasecmp(val, "yes") || !strcasecmp(val, "true") ) cfg->countObs = true; else cfg->countObs = false; } else if (!strcasecmp (key, "minplayers")){ if (sscanf (val, "%d", &cfg->minPlayers)!=1 || cfg->minPlayers<1 || cfg->minPlayers>100) return configError ("Invalid minplayers value", lineNum, playerID, cfile); } else if (!strcasecmp (key, "messagesuffix")){ cfg->msgSuffix = std::string (val); } else if (!strcasecmp (key, "message")){ if ((md = parseCfgMessage (val)) == NULL) return configError ("Invalid message format", lineNum, playerID, cfile); cfg->nagMsgs.push_back (md); } else if (!strcasecmp (key, "kickmessage")){ if ((md = parseCfgMessage (val)) == NULL) return configError ("Invalid kick message format", lineNum, playerID, cfile); cfg->kickMsg = md; } else { return configError ("unknown tag", lineNum, playerID, cfile); } } // sort the nagmsgs vector by time qsort (&cfg->nagMsgs[0], cfg->nagMsgs.size(), sizeof(MsgEnt *), compareMsgEnt); fclose (cfile); return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/nagware/nagware.def000066400000000000000000000001521200563112200206460ustar00rootroot00000000000000LIBRARY nagware EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/nagware/nagware.sln000066400000000000000000000020611200563112200207050ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nagware", "nagware.vcxproj", "{2A9BC706-C839-4091-B3CE-36E6E324565F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|Win32.ActiveCfg = Debug|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|Win32.Build.0 = Debug|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|x64.ActiveCfg = Debug|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Debug|x64.Build.0 = Debug|x64 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|Win32.ActiveCfg = Release|Win32 {2A9BC706-C839-4091-B3CE-36E6E324565F}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/nagware/nagware.vcxproj000066400000000000000000000335771200563112200216240ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {2A9BC706-C839-4091-B3CE-36E6E324565F} nagware Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;nagware_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)nagware.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) nagware.def true $(OutDir)nagware.pdb Windows false $(OutDir)nagware.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;nagware_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)nagware.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) nagware.def true $(OutDir)nagware.pdb Windows false $(OutDir)nagware.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;nagware_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)nagware.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) nagware.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)nagware.lib MachineX86 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;nagware_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)nagware.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) nagware.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)nagware.lib MachineX64 mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.dll $(ProjectDir)\..\..\bin_$(Platform)\plugins\ Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/newplug.sh000077500000000000000000000047231200563112200171460ustar00rootroot00000000000000#!/bin/sh NARG="$#" ARGS="$*" ARG1="$1" PATH_TO_HERE="`dirname $0`" SAMPLE_PLUGIN=SAMPLE_PLUGIN # make sure user gives a plugin name if [ $NARG -lt 1 ] ;then echo "syntax: $0 " exit 1 elif [ $NARG -gt 1 ] ;then echo "syntax: $0 " exit 1 fi # make sure it doesn't already exist if [ -d "$PATH_TO_HERE/$ARG1" ] ; then echo "ERROR: $ARG1 already exists, remove it or use a different name" exit 1 fi # make sure the sample exists if [ ! -d "$PATH_TO_HERE/$SAMPLE_PLUGIN" ] ; then echo "ERROR: $SAMPLE_PLUGIN seems to be missing..." exit 1 fi # copy the template echo "cp -pR $PATH_TO_HERE/$SAMPLE_PLUGIN $PATH_TO_HERE/$1" cp -pR "$PATH_TO_HERE/$SAMPLE_PLUGIN" "$PATH_TO_HERE/$ARG1" if [ $? != 0 ] ; then echo "ERROR: copy of $SAMPLE_PLUGIN failed" exit 1 fi # Don't copy CVS dir if [ -d "$PATH_TO_HERE/$ARG1/CVS" ] ; then echo "rm -rf $PATH_TO_HERE/$ARG1/CVS" rm -rf $PATH_TO_HERE/$ARG1/CVS fi # Don't copy .svn dir if [ -d "$PATH_TO_HERE/$ARG1/.svn" ] ; then echo "rm -rf $PATH_TO_HERE/$ARG1/.svn" rm -rf $PATH_TO_HERE/$ARG1/.svn fi # replace $SAMPLE_PLUGIN within files echo "find $ARG1 -type f -exec perl -pi -e \"s/$SAMPLE_PLUGIN/$ARG1/g\" '{}' \;" find $PATH_TO_HERE/$ARG1 -type f -exec perl -pi -e "s/$SAMPLE_PLUGIN/$ARG1/g" '{}' \; if [ $? != 0 ] ; then echo "ERROR: find failed" exit 1 fi # rename files for file in $PATH_TO_HERE/$ARG1/*$SAMPLE_PLUGIN* ;do echo "mv $file `echo $file | sed \"s/$SAMPLE_PLUGIN/$ARG1/\"`" mv $file `echo $file | sed "s/$SAMPLE_PLUGIN/$ARG1/"` if [ $? != 0 ] ; then echo "mv $file `echo $file | sed s/$SAMPLE_PLUGIN/$ARG1/` failed" exit 1 fi done # update the Makefile.am expression="s/(.*SAMPLE_PLUGIN.*)/\1\n\t$ARG1 \\\\/" echo "perl -pi -e '$expression' $PATH_TO_HERE/Makefile.am" perl -pi -e "$expression" "$PATH_TO_HERE/Makefile.am" if [ $? != 0 ] ; then echo "ERROR: Update of Makefile.am failed" exit 1 fi echo "---" echo "New plug-in \"$ARG1\" is ready. A directory for your plug-in was created." echo "" echo "To add $1 to the build system, you need to edit two files:" echo " Edit plugins/Makefile.am and add a line for your plugin to the SUBDIRS list" echo " Edit configure.ac and add a line for the plugins/$1/Makefile near the end" echo "" echo "You then need to rerun autogen.sh and configure just once to enable your" echo "new plugin with the build system." echo "" echo "Get started coding here: $PATH_TO_HERE/$ARG1" echo "" bzflag-2.4.2+ds1/plugins/playHistoryTracker/000077500000000000000000000000001200563112200207635ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/playHistoryTracker/Makefile.am000066400000000000000000000006711200563112200230230ustar00rootroot00000000000000lib_LTLIBRARIES = playHistoryTracker.la playHistoryTracker_la_SOURCES = playHistoryTracker.cpp playHistoryTracker_la_CPPFLAGS = -I$(top_srcdir)/include playHistoryTracker_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ playHistoryTracker.def \ playHistoryTracker.sln \ playHistoryTracker.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/playHistoryTracker/Makefile.in000066400000000000000000000466671200563112200230530ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/playHistoryTracker DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) playHistoryTracker_la_LIBADD = am_playHistoryTracker_la_OBJECTS = \ playHistoryTracker_la-playHistoryTracker.lo playHistoryTracker_la_OBJECTS = $(am_playHistoryTracker_la_OBJECTS) playHistoryTracker_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(playHistoryTracker_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(playHistoryTracker_la_SOURCES) DIST_SOURCES = $(playHistoryTracker_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = playHistoryTracker.la playHistoryTracker_la_SOURCES = playHistoryTracker.cpp playHistoryTracker_la_CPPFLAGS = -I$(top_srcdir)/include playHistoryTracker_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ playHistoryTracker.def \ playHistoryTracker.sln \ playHistoryTracker.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/playHistoryTracker/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/playHistoryTracker/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done playHistoryTracker.la: $(playHistoryTracker_la_OBJECTS) $(playHistoryTracker_la_DEPENDENCIES) $(playHistoryTracker_la_LINK) -rpath $(libdir) $(playHistoryTracker_la_OBJECTS) $(playHistoryTracker_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playHistoryTracker_la-playHistoryTracker.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< playHistoryTracker_la-playHistoryTracker.lo: playHistoryTracker.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(playHistoryTracker_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT playHistoryTracker_la-playHistoryTracker.lo -MD -MP -MF $(DEPDIR)/playHistoryTracker_la-playHistoryTracker.Tpo -c -o playHistoryTracker_la-playHistoryTracker.lo `test -f 'playHistoryTracker.cpp' || echo '$(srcdir)/'`playHistoryTracker.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/playHistoryTracker_la-playHistoryTracker.Tpo $(DEPDIR)/playHistoryTracker_la-playHistoryTracker.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='playHistoryTracker.cpp' object='playHistoryTracker_la-playHistoryTracker.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(playHistoryTracker_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o playHistoryTracker_la-playHistoryTracker.lo `test -f 'playHistoryTracker.cpp' || echo '$(srcdir)/'`playHistoryTracker.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/playHistoryTracker/playHistoryTracker.cpp000066400000000000000000000114101200563112200253270ustar00rootroot00000000000000// playHistoryTracker.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include // event handler callback class PlayHistoryTracker : public bz_Plugin { public: virtual const char* Name (){return "Play History Tracker";} virtual void Init ( const char* /* config */) { Register(bz_ePlayerDieEvent); Register(bz_ePlayerPartEvent); Register(bz_ePlayerSpawnEvent); Register(bz_ePlayerJoinEvent); } virtual void Event ( bz_EventData *eventData ); protected: typedef struct { int playerID; std::string callsign; double startTime; double lastUpdateTime; int spreeTotal; } trPlayerHistoryRecord; std::map playerList; }; BZ_PLUGIN(PlayHistoryTracker) // ----------------- SpreeTracker----------------- /*typedef struct { int playerID; std::string callsign; double startTime; double lastUpdateTime; int spreeTotal; } trPlayerHistoryRecord; std::map playerList; */ void PlayHistoryTracker::Event( bz_EventData *eventData ) { switch (eventData->eventType) { default: // really WTF!!!! break; case bz_ePlayerDieEvent: { bz_PlayerDieEventData_V1 *deathRecord = ( bz_PlayerDieEventData_V1*)eventData; std::string killerCallSign = "UNKNOWN"; bz_BasePlayerRecord *killerData; killerData = bz_getPlayerByIndex(deathRecord->killerID); if (killerData) killerCallSign = killerData->callsign.c_str(); std::string soundToPlay; // clear out the dude who got shot, since he won't be having any SPREEs if (playerList.find(deathRecord->playerID) != playerList.end()) { trPlayerHistoryRecord &record = playerList.find(deathRecord->playerID)->second; std::string message; if ( record.spreeTotal >= 5 && record.spreeTotal < 10 ) message = record.callsign + std::string("'s rampage was stopped by ") + killerCallSign; if ( record.spreeTotal >= 10 && record.spreeTotal < 20 ) message = record.callsign + std::string("'s killing spree was halted by ") + killerCallSign; if ( record.spreeTotal >= 20 ) message = std::string("The unstoppable reign of ") + record.callsign + std::string(" was ended by ") + killerCallSign; if (message.size()) { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, message.c_str()); soundToPlay = "spree4"; } record.spreeTotal = 0; record.startTime = deathRecord->eventTime; record.lastUpdateTime = deathRecord->eventTime; } // chock up another win for our killer // if they weren't the same as the killer ( suicide ). if ( (deathRecord->playerID != deathRecord->killerID) && playerList.find(deathRecord->killerID) != playerList.end()) { trPlayerHistoryRecord &record = playerList.find(deathRecord->killerID)->second; record.spreeTotal++; record.lastUpdateTime = deathRecord->eventTime; std::string message; if ( record.spreeTotal == 5 ) { message = record.callsign + std::string(" is on a Rampage!"); if (!soundToPlay.size()) soundToPlay = "spree1"; } if ( record.spreeTotal == 10 ) { message = record.callsign + std::string(" is on a Killing Spree!"); if (!soundToPlay.size()) soundToPlay = "spree2"; } if ( record.spreeTotal == 20 ) { message = record.callsign + std::string(" is Unstoppable!!"); if (!soundToPlay.size()) soundToPlay = "spree3"; } if ( record.spreeTotal > 20 && record.spreeTotal%5 == 0 ) { message = record.callsign + std::string(" continues to rage on"); if (!soundToPlay.size()) soundToPlay = "spree4"; } if (message.size()) bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, message.c_str()); } bz_freePlayerRecord(killerData); //if (soundToPlay.size()) // bz_sendPlayCustomLocalSound(BZ_ALLUSERS,soundToPlay.c_str()); } break; case bz_ePlayerSpawnEvent: // really WTF!!!! break; case bz_ePlayerJoinEvent: { trPlayerHistoryRecord playerRecord; playerRecord.playerID = (( bz_PlayerJoinPartEventData_V1*)eventData)->playerID; playerRecord.callsign = (( bz_PlayerJoinPartEventData_V1*)eventData)->record->callsign.c_str(); playerRecord.spreeTotal = 0; playerRecord.lastUpdateTime = (( bz_PlayerJoinPartEventData_V1*)eventData)->eventTime; playerRecord.startTime = playerRecord.lastUpdateTime; playerList[(( bz_PlayerJoinPartEventData_V1*)eventData)->playerID] = playerRecord; } break; case bz_ePlayerPartEvent: { std::map::iterator itr = playerList.find( (( bz_PlayerJoinPartEventData_V1*)eventData)->playerID ); if (itr != playerList.end()) playerList.erase(itr); } break; } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/playHistoryTracker/playHistoryTracker.def000066400000000000000000000001641200563112200253070ustar00rootroot00000000000000LIBRARY playHistoryTracker EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/playHistoryTracker/playHistoryTracker.sln000066400000000000000000000023431200563112200253460ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playHistoryTracker", "playHistoryTracker.vcxproj", "{81495CFD-E8CC-4F99-B285-4CBAEDB6D808}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|Win32.ActiveCfg = Debug|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|Win32.Build.0 = Debug|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|x64.ActiveCfg = Debug|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Debug|x64.Build.0 = Debug|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|Win32.ActiveCfg = Release|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|Win32.Build.0 = Release|Win32 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|x64.ActiveCfg = Release|x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/playHistoryTracker/playHistoryTracker.vcxproj000066400000000000000000000340401200563112200262440ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {81495CFD-E8CC-4F99-B285-4CBAEDB6D808} playHistoryTracker Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;playHistoryTracker_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)playHistoryTracker.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) playHistoryTracker.def true $(OutDir)playHistoryTracker.pdb Windows false $(OutDir)playHistoryTracker.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;playHistoryTracker_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)playHistoryTracker.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) playHistoryTracker.def true $(OutDir)playHistoryTracker.pdb Windows false $(OutDir)playHistoryTracker.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;playHistoryTracker_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)playHistoryTracker.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) playHistoryTracker.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)playHistoryTracker.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;playHistoryTracker_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)playHistoryTracker.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) playHistoryTracker.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)playHistoryTracker.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/plugin_utils/000077500000000000000000000000001200563112200176365ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/plugin_utils/Makefile.am000066400000000000000000000007411200563112200216740ustar00rootroot00000000000000noinst_LTLIBRARIES = libplugin_utils.la AM_CPPFLAGS = -I$(top_srcdir)/include $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) libplugin_utils_la_SOURCES = \ plugin_utils.cpp \ plugin_utils.h \ plugin_files.cpp \ plugin_files.h \ plugin_groups.cpp \ plugin_groups.h \ plugin_config.cpp \ plugin_config.h libplugin_utils_la_LDFLAGS = -avoid-version MAINTAINERCLEANFILES = \ Makefile.in EXTRA_DIST = \ plugin_utils.sln \ plugin_utils.vcxproj bzflag-2.4.2+ds1/plugins/plugin_utils/Makefile.in000066400000000000000000000414031200563112200217050ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/plugin_utils DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libplugin_utils_la_LIBADD = am_libplugin_utils_la_OBJECTS = plugin_utils.lo plugin_files.lo \ plugin_groups.lo plugin_config.lo libplugin_utils_la_OBJECTS = $(am_libplugin_utils_la_OBJECTS) libplugin_utils_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libplugin_utils_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libplugin_utils_la_SOURCES) DIST_SOURCES = $(libplugin_utils_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libplugin_utils.la AM_CPPFLAGS = -I$(top_srcdir)/include $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) libplugin_utils_la_SOURCES = \ plugin_utils.cpp \ plugin_utils.h \ plugin_files.cpp \ plugin_files.h \ plugin_groups.cpp \ plugin_groups.h \ plugin_config.cpp \ plugin_config.h libplugin_utils_la_LDFLAGS = -avoid-version MAINTAINERCLEANFILES = \ Makefile.in EXTRA_DIST = \ plugin_utils.sln \ plugin_utils.vcxproj all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/plugin_utils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/plugin_utils/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libplugin_utils.la: $(libplugin_utils_la_OBJECTS) $(libplugin_utils_la_DEPENDENCIES) $(libplugin_utils_la_LINK) $(libplugin_utils_la_OBJECTS) $(libplugin_utils_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_files.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_groups.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_utils.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_config.cpp000066400000000000000000000076111200563112200231720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // PluginUtils.h - Collection of useful utility functions for plugins #include #include #include "bzfsAPI.h" #include "plugin_config.h" #include "plugin_utils.h" /* * INI style configuration file parser class * * Comments start with # or ; * Ignores whitespace around sections, keys, and values * Default section if none is specified is [global] */ PluginConfig::PluginConfig(const std::string &filename) { configFilename = filename; whitespace = " \t\r"; errors = 0; parse(); } std::string PluginConfig::item(const std::string §ion, const std::string &key) { std::string s = section,k = key; makelower(s); makelower(k); return sections[s][k]; } void PluginConfig::parse(void) { std::string line; std::string section; std::string key; std::string value; std::ifstream iniFile; size_t start, end; size_t equalPos; /* * Parse key,value pairs for sections out of the INI type * configuration file specified in 'filename' * */ iniFile.open(configFilename.c_str(), std::ios::in); if (!iniFile.is_open()) { bz_debugMessagef(1, "PluginConfig: Can't open configuration file: %s", configFilename.c_str()); errors++; return; } section = "global"; while (!iniFile.eof()) { getline(iniFile, line); start = line.find_first_not_of(whitespace); /* * Look for comments and skip */ if (line[start] == '#') { continue; } /* * Look for a section tag */ if (line[start] == '[') { start = line.find_first_not_of(whitespace, start + 1); /* Check if the last non whitespace character is a close bracket */ end = line.find_last_not_of(whitespace); if (line[end] == ']') { end = line.find_last_not_of(whitespace, end - 1); /* Got a section header - save it */ section = line.substr(start, end - start + 1); bz_debugMessagef(4, "PluginConfig: Found section [%s]", section.c_str()); continue; } /* * We either got a valid section or we have a * Malformed line - '[' but not matching close ']' which we ignore. */ bz_debugMessagef(1, "PluginConfig: Malformed line ignored: %s", line.c_str()); continue; } /* * No section tag, look for 'key = value' pairs * * Split the line into 'key = value' pairs */ equalPos = line.find("=", start); /* If there is no '=' sign then ignore the line - treated as a comment */ if (equalPos == std::string::npos) { if (line.find_first_not_of(whitespace) != std::string::npos) bz_debugMessagef(1, "PluginConfig: Malformed line ignored: %s", line.c_str()); continue; } /* Extract the key */ end = line.find_last_not_of(whitespace, equalPos - 1); key = line.substr(start, end - start + 1); /* Extract the value */ start = line.find_first_not_of(whitespace, equalPos + 1); end = line.find_last_not_of(whitespace); if (start == std::string::npos || end == std::string::npos) value = ""; else value = line.substr(start, end - start + 1); makelower(key); makelower(section); /* Save the section, key and value in the std::map for later retrieval */ sections[section][key] = value; bz_debugMessagef(4, "PluginConfig: Found key [%s].%s = %s", section.c_str(), key.c_str(), value.c_str()); } iniFile.close(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_config.h000066400000000000000000000037111200563112200226340ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // PluginUtils.h - Collection of useful utility functions for plugins #ifndef _PLUGING_CONFIG_H_ #define _PLUGING_CONFIG_H_ #include #include /* * PluginConfig - INI style configuration file parser class * * Reads a configuration file like this: * * -- myconfig.txt -- * [Section] * SomeKey = Some value goes here * key2 = Some other value * [ AnotherSection ] * Key3 = 4 * ------------------ * Then you parse it as follows: * config = PluginConfig("myconfig.txt"); * config.item("Section", "SomeKey") returns "Some value goes here" * config.item("Section", "key2") returns "Some other value" * config.item("anotherSection", "Key3") returns "4" * config.item("missingSection", "Anything") returns "" * * Section and Key strings are not case sensitive but value strings are. * Sections, keys, and values have leading and trailing whitespace stripped. * Nonexistent keys return the empty string * * Debug level 4 (-dddd) provides information about the parsing process */ class PluginConfig { public: PluginConfig(const std::string &filename); ~PluginConfig() {}; std::string item(const std::string §ion, const std::string &key); unsigned int errors; private: std::string whitespace; void parse(void); std::map > sections; std::string configFilename; }; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_files.cpp000066400000000000000000000213711200563112200230260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include #include #include #include "plugin_files.h" #include "plugin_utils.h" #ifdef _WIN32 #define _DirDelim '\\' #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include bool WindowsAddFileStack(const char *szPathName, const char* fileMask, bool bRecursive,std::vector &list, bool justDirs = false) { struct _finddata_t fileInfo; long hFile; std::string searchstr; std::string FilePath; bool bDone = false; searchstr = szPathName; searchstr += "\\"; if (bRecursive) searchstr += "*.*"; else if (fileMask) searchstr += fileMask; else searchstr += "*.*"; std::string extenstionSearch; if (fileMask && strchr(fileMask,'.')) extenstionSearch = strchr(fileMask,'.')+1; hFile = (long)_findfirst(searchstr.c_str(),&fileInfo); if (hFile != -1) { while (!bDone) { if ((strlen(fileInfo.name) >0) && (strcmp(fileInfo.name,".") != 0) && (strcmp(fileInfo.name,"..") != 0)) { FilePath = szPathName; //if (!(fileInfo.attrib & _A_SUBDIR)) FilePath += "\\"; FilePath += fileInfo.name; if (justDirs && (fileInfo.attrib & _A_SUBDIR)) { // we neever do just dirs recrusively list.push_back(FilePath); } else if (!justDirs) { if ((fileInfo.attrib & _A_SUBDIR) && bRecursive) { WindowsAddFileStack(FilePath.c_str(),fileMask,bRecursive,list); } else if (!(fileInfo.attrib & _A_SUBDIR)) { if (bRecursive && fileMask) { // if we are recusive we need to check extension manualy, // so we get dirs and stuff if (strrchr(FilePath.c_str(),'.')) { if (compare_nocase(std::string(strrchr(FilePath.c_str(),'.')+1), extenstionSearch) == 0) list.push_back(FilePath); } } else { list.push_back(FilePath); } } } } if (_findnext(hFile,&fileInfo) == -1) bDone = true; } } return true; } #else #include #include #include #include #include #define _DirDelim '/' static int match_multi(const char **mask, const char **string) { const char *msk; const char *str; const char *msktop; const char *strtop; msk = *mask; str = *string; while ((*msk != '\0') && (*msk == '*')) msk++; /* get rid of multiple '*'s */ if (*msk == '\0') /* '*' was last, auto-match */ return +1; msktop = msk; strtop = str; while (*msk != '\0') { if (*msk == '*') { *mask = msk; *string = str; return 0; /* matched this segment */ } else if (*str == '\0') { return -1; /* can't match */ } else { if ((*msk == '?') || (*msk == *str)) { msk++; str++; if ((*msk == '\0') && (*str != '\0')) { /* advanced check */ str++; strtop++; str = strtop; msk = msktop; } } else { str++; strtop++; str = strtop; msk = msktop; } } } *mask = msk; *string = str; return +1; /* full match */ } static int match_mask(const char *mask, const char *string) { if (mask == NULL) return 0; if (string == NULL) return 0; if ((mask[0] == '*') && (mask[1] == '\0')) return 1; /* instant match */ while (*mask != '\0') { if (*mask == '*') { mask++; switch (match_multi(&mask, &string)) { case +1: return 1; case -1: return 0; } } else if (*string == '\0') { return 0; } else if ((*mask == '?') || (*mask == *string)) { mask++; string++; } else { return 0; } } if (*string == '\0') return 1; else return 0; } bool LinuxAddFileStack(const char *szPathName, const char* fileMask, bool bRecursive, std::vector &list, bool justDirs = false) { DIR *directory; dirent *fileInfo; struct stat statbuf; char searchstr[1024]; std::string FilePath; strcpy(searchstr, szPathName); if (searchstr[strlen(searchstr) - 1] != '/') strcat(searchstr, "/"); directory = opendir(searchstr); if (!directory) return false; // TODO: make it use the filemask while ((fileInfo = readdir(directory))) { if (!((strcmp(fileInfo->d_name, ".") == 0) || (strcmp(fileInfo->d_name, "..") == 0))) { FilePath = searchstr; FilePath += fileInfo->d_name; stat(FilePath.c_str(), &statbuf); if (justDirs && S_ISDIR(statbuf.st_mode)) { // we never do just dirs recrusively list.push_back(FilePath); } else if (!justDirs) { if (S_ISDIR(statbuf.st_mode) && bRecursive) LinuxAddFileStack(FilePath.c_str(),fileMask,bRecursive, list); else if (match_mask (fileMask, fileInfo->d_name)) list.push_back(FilePath); } } } closedir(directory); return true; } #endif // ensures all the delims are constant std::string convertPathToDelims(const char* file) { if (!file) return std::string(); std::string delim; delim += _DirDelim; return replace_all(replace_all(file,"/",delim),"\\",delim); } std::vector getFilesInDir(const char* dir, const char* filter, bool recrusive) { std::vector list; if (!dir) return list; std::string realFilter = "*.*"; if (filter) realFilter = filter; std::string directory = convertPathToDelims(dir); if (directory.size() && *(directory.end()-1) == _DirDelim) directory.erase(directory.end()-1); #ifdef _WIN32 WindowsAddFileStack(directory.c_str(), realFilter.c_str(),recrusive,list); #else LinuxAddFileStack(directory.c_str(), realFilter.c_str(),recrusive,list); #endif return list; } std::vector getDirsInDir(const char* dir) { std::vector list; if (!dir) return list; std::string directory = convertPathToDelims(dir); #ifdef _WIN32 WindowsAddFileStack(directory.c_str(), "*.*",false,list,true); #else LinuxAddFileStack(directory.c_str(), "*.*",false,list,true); #endif return list; } std::string getPathForOS(const char* file) { return convertPathToDelims(file); } std::string concatPaths ( const char* path1, const char* path2 ) { std::string ret = getPathForOS(path1); ret += getPathForOS(path2); return ret; } std::string getFileDir(const char* file) { std::string f = convertPathToDelims(file); char *p = (char*)strrchr(f.c_str(),_DirDelim); if (p) // it's ok to go one past, cus even if it's the end, that's the // NUL char so we can set it to NUL again with out worry *(p+1) = 0; return std::string(f.c_str()); } std::string getFileExtension(const char* file) { std::string f = convertPathToDelims(file); char *p = (char*)strrchr(f.c_str(),'.'); if (!p) // it's ok to go one past, cus even if it's the end, that's the // NUL char so we can set it to NUL again with out worry return std::string(); return std::string(p+1); } std::string getFileTitle(const char* file) { std::string f = convertPathToDelims(file); std::string temp = f; const char *p = strrchr(f.c_str(),_DirDelim); if (p) // it's ok to go one past, cus even if it's the end, that's the // NUL char so we can set it to NUL again with out worry temp = p+1; char *p2 = (char*)strrchr(temp.c_str(),'.'); if (p2) *(p2) = 0; // kill the . too return std::string(temp.c_str()); } std::string getFileText(const char* file) { std::string text; if (!file) return text; FILE *fp = fopen(convertPathToDelims(file).c_str(),"rb"); if (!fp) return text; fseek(fp,0,SEEK_END); unsigned int i = (unsigned int)ftell(fp); fseek(fp,0,SEEK_SET); char *temp = (char*)malloc(i+1); temp[i] = 0; size_t items_read = fread(temp,i,1,fp); fclose(fp); if (items_read == 1) text = temp; free(temp); return replace_all(text,"\r",std::string()); } std::vector getFileTextLines(const char* file) { return tokenize(getFileText(file),"\n",0,false); } unsigned int getFileLen(const char* file) { if (!file) return 0; FILE *fp = fopen(convertPathToDelims(file).c_str(),"rb"); if (!fp) return 0; fseek(fp,0,SEEK_END); unsigned int i = (unsigned int)ftell(fp); fclose(fp); return i; } bool fileExists ( const char *path ) { if (!path) return false; FILE *fp = fopen(convertPathToDelims(path).c_str(),"rb"); if (!fp) return false; fclose(fp); return true; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_files.h000066400000000000000000000047751200563112200225040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // a series of utilitys for bzfs plugins to use. #ifndef _PLUGIN_FILES_H_ #define _PLUGIN_FILES_H_ #include "bzfsAPI.h" std::vector getFilesInDir ( const char* dir, const char* filter = "*.*", bool recursive = false ); inline std::vector getFilesInDir ( const std::string &dir, const char* filter = "*.*", bool recursive = false ){return getFilesInDir(dir.c_str(),filter,recursive);} std::vector getDirsInDir ( const char* dir); inline std::vector getDirsInDir ( const std::string &dir ){return getDirsInDir(dir.c_str());} std::string getFileDir ( const char* file ); inline std::string getFileDir ( const std::string &file ){return getFileDir(file.c_str());} std::string getPathForOS ( const char* file ); inline std::string getPathForOS ( const std::string &file ){return getPathForOS(file.c_str());} std::string getFileExtension ( const char* file ); inline std::string getFileExtension ( const std::string &file ){return getFileExtension(file.c_str());} std::string getFileTitle ( const char* file ); inline std::string getFileTitle ( const std::string &file ){return getFileTitle(file.c_str());} std::string getFileText ( const char* file ); inline std::string getFileText ( const std::string &file ){return getFileText(file.c_str());} std::vector getFileTextLines ( const char* file ); inline std::vector getFileTextLines ( const std::string &file ){return getFileTextLines(file.c_str());} unsigned int getFileLen ( const char* file ); inline unsigned int getFileLen ( std::string &file ){return getFileLen(file.c_str());} std::string concatPaths ( const char* path1, const char* path2 ); inline std::string concatPaths ( const std::string &p1, const std::string &p2 ){return concatPaths(p1.c_str(),p2.c_str());} bool fileExists ( const char *path ); inline bool fileExists ( const std::string &p1 ){ return fileExists(p1.c_str());} #endif //_PLUGIN_FILES_H_ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_groups.cpp000066400000000000000000000055421200563112200232450ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "plugin_groups.h" #include "plugin_utils.h" bool permInGroup ( const std::string &perm, bz_APIStringList* groupPerms ) { for (unsigned int i = 0; i < groupPerms->size(); i++) { if (strcasecmp(perm.c_str(),groupPerms->get(i).c_str()) == 0) return true; } return false; } std::vector findGroupsWithPerms( const std::vector &perms, bool skipLocal ) { std::vector groupsWithPerms; bz_APIStringList* groupList = bz_getGroupList(); if (groupList) { for ( unsigned int i = 0; i < groupList->size();i++) { std::string groupName = groupList->get(i).c_str(); if (skipLocal && compare_nocase(groupName,"LOCAL.ADMIN") == 0) continue; bz_APIStringList *groupPerms = bz_getGroupPerms(groupName.c_str()); if (groupPerms) { // see if any of the perms are NOT in this group. bool hasOneWithNoPerm = false; for (size_t p =0; p < perms.size(); p++) { if (!permInGroup(perms[p],groupPerms)) hasOneWithNoPerm = true; } bz_deleteStringList(groupPerms); if (!hasOneWithNoPerm) groupsWithPerms.push_back(groupName); } } bz_deleteStringList(groupList); } return groupsWithPerms; } std::vector findGroupsWithPerm( const char* perm, bool skipLocal ) { std::string name; if(perm) name = perm; return findGroupsWithPerm(name,skipLocal); } std::vector findGroupsWithPerm( const std::string &perm, bool skipLocal ) { std::vector groupsWithPerms; bz_APIStringList* groupList = bz_getGroupList(); if (groupList) { for ( unsigned int i = 0; i < groupList->size();i++) { std::string groupName = groupList->get(i).c_str(); if (skipLocal && compare_nocase(groupName,"LOCAL.ADMIN") == 0) continue; bz_APIStringList *groupPerms = bz_getGroupPerms(groupName.c_str()); if (groupPerms) { if (permInGroup(perm,groupPerms)) groupsWithPerms.push_back(groupName); bz_deleteStringList(groupPerms); } } bz_deleteStringList(groupList); } return groupsWithPerms; } std::vector findGroupsWithAdmin( bool skipLocal ) { std::vector perms; perms.push_back(bz_perm_kick); perms.push_back(bz_perm_ban); return findGroupsWithPerms(perms,skipLocal); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_groups.h000066400000000000000000000024471200563112200227130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // a series of utilitys for bzfs plugins to use with permision groups #ifndef _PLUGIN_GROUPS_H_ #define _PLUGIN_GROUPS_H_ #include "bzfsAPI.h" // return a list of groups that have ALL the perms in the list passed in std::vector findGroupsWithPerms( const std::vector &perms, bool skipLocal = true ); // return a list of groups that have the perm passed in std::vector findGroupsWithPerm( const std::string &perm, bool skipLocal = true ); std::vector findGroupsWithPerm( const char* perm, bool skipLocal = true ); // return a list of groups that have kick and ban std::vector findGroupsWithAdmin( bool skipLocal = true ); #endif //_PLUGIN_GROUPS_H_ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_utils.cpp000066400000000000000000000266511200563112200230720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include #include #include #include "plugin_utils.h" const char* bzu_GetTeamName(bz_eTeamType team) { switch (team) { case eRedTeam: return "Red"; case eGreenTeam: return "Green"; case eBlueTeam: return "Blue"; case ePurpleTeam: return "Purple"; case eRogueTeam: return "Rogue"; case eObservers: return "Observer"; case eRabbitTeam: return "Rabbit"; case eHunterTeam: return "Hunter"; default: break; } return "Unknown"; } std::string printTime(bz_Time *ts, const char* _timezone) { std::string time; appendTime(time,ts,_timezone); return time; } //Date: Mon, 23 Jun 2008 17:50:22 GMT void appendTime(std::string & text, bz_Time *ts, const char* _timezone) { switch(ts->dayofweek) { case 1: text += "Mon"; break; case 2: text += "Tue"; break; case 3: text += "Wed"; break; case 4: text += "Thu"; break; case 5: text += "Fri"; break; case 6: text += "Sat"; break; case 0: text += "Sun"; break; } text += format(", %d ",ts->day); switch(ts->month) { case 0: text += "Jan"; break; case 1: text += "Feb"; break; case 2: text += "Mar"; break; case 3: text += "Apr"; break; case 4: text += "May"; break; case 5: text += "Jun"; break; case 6: text += "Jul"; break; case 7: text += "Aug"; break; case 8: text += "Sep"; break; case 9: text += "Oct"; break; case 10: text += "Nov"; break; case 11: text += "Dec"; break; } text += format(" %d %d:%d:%d ",ts->year,ts->hour,ts->minute,ts->second); if (_timezone) text += _timezone; else text += "GMT"; } std::string no_whitespace(const std::string &s) { const int sourcesize = (int)s.size(); int count = 0, i = 0, j = 0; for (i = 0; i < sourcesize; i++) if (!isWhitespace(s[i])) count++; // create result string of correct size std::string result(count, ' '); for (i = 0, j = 0; i < sourcesize; i++) if (!isWhitespace(s[i])) result[j++] = s[i]; return result; } const std::string& tolower(const std::string& s, std::string& dest) { for (std::string::const_iterator i=s.begin(), end=s.end(); i!=end; ++i) dest += ::tolower(*i); return dest; } const std::string& toupper(const std::string& s, std::string& dest) { for (std::string::const_iterator i=s.begin(), end=s.end(); i!=end; ++i) dest += ::toupper(*i); return dest; } const std::string& tolower(const char* s, std::string& dest) { if (!s) return dest; for (size_t i =0,end = strlen(s); i < end; i++) dest += ::tolower(s[i]); return dest; } const std::string& toupper(const char* s, std::string& dest) { if (!s) return dest; for (size_t i =0,end = strlen(s); i < end; i++) dest += ::toupper(s[i]); return dest; } const std::string& makelower(std::string& s) { for (std::string::iterator i=s.begin(), end=s.end(); i!=end; ++i) *i = ::tolower(*i); return s; } const std::string& makeupper(std::string& s) { for (std::string::iterator i=s.begin(), end=s.end(); i!=end; ++i) *i = ::toupper(*i); return s; } std::string format(const char* fmt, ...) { va_list args; va_start(args, fmt); char temp[2048]; vsprintf(temp,fmt, args); std::string result = temp; va_end(args); return result; } std::vector tokenize(const std::string& in, const std::string &delims, const int maxTokens, const bool useQuotes, size_t offset) { std::vector tokens; int numTokens = 0; bool inQuote = false; std::ostringstream currentToken; std::string::size_type pos = in.find_first_not_of(delims,offset); int currentChar = (pos == std::string::npos) ? -1 : in[pos]; bool enoughTokens = (maxTokens && (numTokens >= (maxTokens-1))); while (pos != std::string::npos && !enoughTokens) { // get next token bool tokenDone = false; bool foundSlash = false; currentChar = (pos < in.size()) ? in[pos] : -1; while ((currentChar != -1) && !tokenDone) { tokenDone = false; if (delims.find(currentChar) != std::string::npos && !inQuote) { // currentChar is a delim pos ++; break; // breaks out of while loop } if (!useQuotes) { currentToken << char(currentChar); } else { switch (currentChar) { case '\\' : // found a backslash if (foundSlash) { currentToken << char(currentChar); foundSlash = false; } else { foundSlash = true; } break; case '\"' : // found a quote if (foundSlash) { // found \" currentToken << char(currentChar); foundSlash = false; } else { // found unescaped " if (inQuote) { // exiting a quote // finish off current token tokenDone = true; inQuote = false; //slurp off one additional delimeter if possible if (pos+1 < in.size() && delims.find(in[pos+1]) != std::string::npos) { pos++; } } else { // entering a quote // finish off current token tokenDone = true; inQuote = true; } } break; default: if (foundSlash) { // don't care about slashes except for above cases currentToken << '\\'; foundSlash = false; } currentToken << char(currentChar); break; } } pos++; currentChar = (pos < in.size()) ? in[pos] : -1; } // end of getting a Token if (currentToken.str().size() > 0) { // if the token is something add to list tokens.push_back(currentToken.str()); currentToken.str(""); numTokens ++; } enoughTokens = (maxTokens && (numTokens >= (maxTokens-1))); if (enoughTokens) break; else pos = in.find_first_not_of(delims,pos); } // end of getting all tokens -- either EOL or max tokens reached if (enoughTokens && pos != std::string::npos) { std::string lastToken = in.substr(pos); if (lastToken.size() > 0) tokens.push_back(lastToken); } return tokens; } std::string replace_all(const std::string& in, const std::string& replaceMe, const std::string& withMe) { std::string result; std::string::size_type beginPos = 0; std::string::size_type endPos = 0; std::ostringstream tempStream; endPos = in.find(replaceMe); if (endPos == std::string::npos) return in; // can't find anything to replace if (replaceMe.empty()) return in; // can't replace nothing with something -- can do reverse while (endPos != std::string::npos) { // push the part up to tempStream << in.substr(beginPos,endPos-beginPos); tempStream << withMe; beginPos = endPos + replaceMe.size(); endPos = in.find(replaceMe,beginPos); } tempStream << in.substr(beginPos); return tempStream.str(); } std::string url_encode(const std::string &text) { char hex[5]; std::string destination; for (int i=0; i < (int) text.size(); i++) { char c = text[i]; if (isAlphanumeric(c)) { destination+=c; } else if (isWhitespace(c)) { destination+='+'; } else { destination+='%'; sprintf(hex, "%-2.2X", c); destination.append(hex); } } return destination; } std::string url_decode(const std::string &text) { std::string destination; std::string::const_iterator itr = text.begin(); while (itr != text.end()) { if (*itr != '%' && *itr != '+') destination += *itr++; else if (*itr == '+') { destination += " "; itr++; } else { char hex[5] = "0x00"; itr++; if (itr == text.end()) return destination; hex[2] = *itr; itr++; if (itr == text.end()) return destination; hex[3] = *itr; unsigned int val = 0; sscanf(hex,"%x",&val); if (val != 0) destination += (char)val; itr++; } } return destination; } size_t find_first_substr(const std::string &findin, const std::string findwhat, size_t offset) { if (findwhat.size()) { for (size_t f = offset; f < findin.size(); f++) { if (findin[f] == findwhat[0]) { size_t start = f; for (size_t w = 1; w < findwhat.size(); w++) { if (f+w > findin.size()) return std::string::npos; if (findin[f+w] != findwhat[w]) { f+=w; w = findwhat.size(); } } if (start == f) return f; } } } return std::string::npos; } std::string getStringRange ( const std::string &find, size_t start, size_t end ) { std::string ret; if (end <= start || start > find.size() || end > find.size()) return ret; for ( size_t p = start; p <= end; p++) ret += find[p]; return ret; } void trimLeadingWhitespace(std::string &text) { for(size_t s = 0; s < text.size(); s++) { if (!isWhitespace(text[s])) { if (s) text.erase(text.begin()+s-1); return; } } } std::string trimLeadingWhitespace(const std::string &text) { std::string s = text; trimLeadingWhitespace(s); return s; } std::vector perms; const std::vector bzu_standardPerms (void) { if (perms.empty()){ perms.push_back("actionMessage"); perms.push_back("adminMessageReceive"); perms.push_back("adminMessageSend"); perms.push_back("antiban"); perms.push_back("antikick"); perms.push_back("antikill"); perms.push_back("antipoll"); perms.push_back("antipollban"); perms.push_back("antipollkick"); perms.push_back("antipollkill"); perms.push_back("ban"); perms.push_back("banlist"); perms.push_back("countdown"); perms.push_back("date"); perms.push_back("endGame"); perms.push_back("flagHistory"); perms.push_back("flagMaster"); perms.push_back("flagMod"); perms.push_back("hideAdmin"); perms.push_back("idleStats"); perms.push_back("info"); perms.push_back("jitter_warn"); perms.push_back("kick"); perms.push_back("kill"); perms.push_back("lagStats"); perms.push_back("lagwarn"); perms.push_back("listPlugins"); perms.push_back("listPerms"); perms.push_back("masterBan"); perms.push_back("modCount"); perms.push_back("mute"); perms.push_back("packetlosswarn"); perms.push_back("playerList"); perms.push_back("poll"); perms.push_back("pollBan"); perms.push_back("pollKick"); perms.push_back("pollKill"); perms.push_back("pollSet"); perms.push_back("pollFlagReset"); perms.push_back("privateMessage"); perms.push_back("record"); perms.push_back("rejoin"); perms.push_back("removePerms"); perms.push_back("replay"); perms.push_back("say"); perms.push_back("sendHelp"); perms.push_back("setAll"); perms.push_back("setPerms"); perms.push_back("setVar"); perms.push_back("showOthers"); perms.push_back("shortBan"); perms.push_back("shutdownServer"); perms.push_back("spawn"); perms.push_back("superKill"); perms.push_back("talk"); perms.push_back("unban"); perms.push_back("unmute"); perms.push_back("veto"); perms.push_back("viewReports"); perms.push_back("vote"); } return perms; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_utils.h000066400000000000000000000101131200563112200225210ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // a series of utilitys for bzfs plugins to use. #ifndef _PLUGIN_UTILS_H_ #define _PLUGIN_UTILS_H_ #include "bzfsAPI.h" //common utilities const char* bzu_GetTeamName ( bz_eTeamType team ); // text functions const std::string& tolower(const std::string& s, std::string& dest); const std::string& toupper(const std::string& s, std::string& dest); const std::string& tolower(const char* s, std::string& dest); const std::string& toupper(const char* s, std::string& dest); const std::string& makelower(std::string& s); const std::string& makeupper(std::string& s); inline std::string makelower(const char *s){ std::string t;if(s)tolower(s,t); return t;} inline std::string makeupper(const char *s){ std::string t;if(s)toupper(s,t); return t;} std::string format(const char* fmt, ...)_ATTRIBUTE12; std::vector tokenize(const std::string& in, const std::string &delims, const int maxTokens, const bool useQuotes, size_t offset = 0); std::string replace_all(const std::string& in, const std::string& replaceMe, const std::string& withMe); std::string url_encode(const std::string &text); std::string url_decode(const std::string &text); size_t find_first_substr(const std::string &findin, const std::string findwhat, size_t offset = 0); std::string getStringRange ( const std::string &find, size_t start, size_t end ); void trimLeadingWhitespace ( std::string &text ); std::string trimLeadingWhitespace ( const std::string &text ); std::string no_whitespace(const std::string &s); std::string printTime ( bz_Time *ts, const char* timezone = "UTC" ); void appendTime ( std::string & text, bz_Time *ts, const char* timezone = "UTC" ); inline int compare_nocase(const std::string& s1, const std::string& s2, size_t maxlength = 4096) { // length check if ((s1.size() < maxlength) || (s2.size() < maxlength)) { if (s1.size() != s2.size()) { return (s1.size() < s2.size()) ? -1 : +1; } maxlength = s1.size(); // clamp the maxlength } // check the characters for (size_t i = 0; i < maxlength; i++) { const std::string::value_type lower1 = ::tolower(s1[i]); const std::string::value_type lower2 = ::tolower(s2[i]); if (lower1 != lower2) { return (lower1 < lower2) ? -1 : +1; } } return 0; } inline int compare_nocase(const char* s1, const char* s2, size_t maxlength = 4096) { if (!s1 || !s2) { return -1; } return compare_nocase(std::string(s1), std::string(s2), maxlength); } inline bool isAlphabetic(const char c) { if (( c > 64 && c < 91) || ( c > 96 && c < 123)) { return true; } return false; } inline bool isNumeric(const char c) { if (( c > 47 && c < 58)) { return true; } return false; } inline bool isWhitespace(const char c) { if ((( c >= 9 ) && ( c <= 13 )) || (c == 32)) { return true; } return false; } inline bool isPunctuation(const char c) { if (( c > 32 && c < 48) || ( c > 57 && c < 65) || ( c > 90 && c < 97) || ( c > 122 && c < 127)) { return true; } return false; } inline bool isAlphanumeric(const char c) { if (isAlphabetic(c) || isNumeric(c)) { return true; } return false; } inline bool isVisible(const char c) { if (isAlphanumeric(c) || isPunctuation(c)) { return true; } return false; } inline bool isPrintable(const char c) { if (isVisible(c) || isWhitespace(c)) { return true; } return false; } const std::vector bzu_standardPerms (void); // Configuration file parsing functions #include "plugin_config.h" #endif //_PLUGIN_UTILS_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_utils.sln000066400000000000000000000023271200563112200230760ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.Build.0 = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.ActiveCfg = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.Build.0 = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.ActiveCfg = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/plugin_utils/plugin_utils.vcxproj000066400000000000000000000246431200563112200240020ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {645768BE-97C8-4DE4-9100-111BD2808B35} plugin_utils Win32Proj StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte StaticLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue $(OutDir)plugin_utils.lib mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.lib" "$(ProjectDir)\..\..\bin_$(Platform)" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase $(OutDir)plugin_utils.lib mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.lib $(ProjectDir)\..\..\bin_$(Platform)\ $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)plugin_utils.lib mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.lib $(ProjectDir)\..\..\bin_$(Platform)\ X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_LIB; _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase $(OutDir)plugin_utils.lib mkdir $(ProjectDir)..\..\bin_$(Platform) mkdir $(ProjectDir)..\..\bin_$(Platform)\plugins copy $(OutDir)*.lib $(ProjectDir)\..\..\bin_$(Platform)\ Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/pushstats/000077500000000000000000000000001200563112200171565ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/pushstats/Makefile.am000066400000000000000000000007611200563112200212160ustar00rootroot00000000000000lib_LTLIBRARIES = pushstats.la pushstats_la_SOURCES = pushstats.cpp pushstats_la_CXXFLAGS= -I$(top_srcdir)/include -I$(top_srcdir)/plugins/plugin_utils pushstats_la_LDFLAGS = -module -avoid-version -shared pushstats_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ pushstats.def \ pushstats.sln \ pushstats.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/pushstats/README.txt000066400000000000000000000005021200563112200206510ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : pushstats plugin for BZFlag ======================================================================== This plugin provides 2.0.x support for the "push" style statistics gathering system that is integrated into BZFlag 3.0. bzflag-2.4.2+ds1/plugins/pushstats/pushstats.cpp000066400000000000000000000153261200563112200217270ustar00rootroot00000000000000// pushstats.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include "plugin_utils.h" std::string url; class StatPush : public bz_Plugin { public: virtual const char* Name (){return "Stats Pusher";} virtual void Init ( const char* /* config */) { Register(bz_eListServerUpdateEvent); Register(bz_ePlayerPartEvent); Register(bz_eGetWorldEvent); if (bz_BZDBItemExists("_statURL")) url = bz_getBZDBString("_statURL").c_str(); if (!url.size()) url = "http://stattrack.bzflag.org/track/"; } const char* getTeamName ( bz_eTeamType team ) { switch(team) { default: break; case eRogueTeam: return "Rogue"; case eRedTeam: return "Red"; case eGreenTeam: return "Green"; case eBlueTeam: return "Blue"; case ePurpleTeam: return "Purple"; case eObservers: return "Observer"; case eRabbitTeam: return "Rabbit"; case eHunterTeam: return "Hunter"; } return "unknown"; } void buildHTMLPlayer ( std::string ¶ms, int playerID, int index ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerID); if (player) { params += format("&callsign%d=%s",index,bz_urlEncode(player->callsign.c_str())); params += format("&team%d=%s",index,bz_urlEncode(getTeamName(player->team))); std::string BZID = player->bzID.c_str(); if (!BZID.size()) BZID = "none"; params += format("&bzID%d=%s",index,bz_urlEncode(BZID.c_str())); params += format("&token%d=V2",index); if (player->team != eObservers) { params += format("&wins%d=%d",index,player->wins); params += format("&losses%d=%d",index,player->losses); params += format("&teamkills%d=%d",index,player->teamKills); } params += format("&version%d=2.0.x",index); bz_freePlayerRecord(player); } } void buildHTMLPlayerList ( std::string ¶ms, int skip = -1 ) { bz_APIIntList *players = bz_newIntList(); bz_getPlayerIndexList(players);; if (players && players->size()) { int count = (int)players->size(); if (skip > 0) count--; params += format("&playercount=%d", count); int index = 0; for( unsigned int i = 0; i < players->size(); i++ ) { int playerID = players->get(i); if (playerID != skip) { buildHTMLPlayer(params,playerID,index); index ++; } } } bz_deleteIntList(players); } bool getPushHeader(std::string &header) { bz_ApiString host = bz_getPublicAddr(); bz_ApiString desc = bz_getPublicDescription(); header += "&isgameserver=1"; header+= "&host="; if (host.size()) header += host.c_str(); else return false; header += format("&port=%s",port.c_str()); if (desc.size()) header += "&desc=" + std::string(desc.c_str()); if (mapFile.size()) header += "&map=" + mapFile; // game mode header += "&game="; switch(bz_getGameType()) { default: header +="TeamFFA"; break; case eCTFGame: header +="CTF"; break; case eRabbitGame: header +="Rabbit"; break; } // team scores header += format("&redteamscore=%d",bz_getTeamScore(eRedTeam)); header += format("&redteamwins=%d",bz_getTeamWins(eRedTeam)); header += format("&redteamlosses=%d",bz_getTeamLosses(eRedTeam)); header += format("&greenteamscore=%d",bz_getTeamScore(eGreenTeam)); header += format("&greenteamwins=%d",bz_getTeamWins(eGreenTeam)); header += format("&greenteamlosses=%d",bz_getTeamLosses(eGreenTeam)); header += format("&blueteamscore=%d",bz_getTeamScore(eBlueTeam)); header += format("&blueteamwins=%d",bz_getTeamWins(eBlueTeam)); header += format("&blueteamlosses=%d",bz_getTeamLosses(eBlueTeam)); header += format("&purpleteamscore=%d",bz_getTeamScore(ePurpleTeam)); header += format("&purpleteamwins=%d",bz_getTeamWins(ePurpleTeam)); header += format("&purpleteamlosses=%d",bz_getTeamLosses(ePurpleTeam)); return true; } int sumString( const std::string &str ) { int i = 0; std::string::const_iterator itr = str.begin(); while (itr != str.end()) i += *itr++; return i; } void buildStateHash(std::string ¶ms) { int hash = sumString(mapFile); int i = 0; i += bz_getTeamScore(eRedTeam); i += bz_getTeamScore(eGreenTeam); i += bz_getTeamScore(eBlueTeam); i += bz_getTeamScore(ePurpleTeam); i += bz_getTeamWins(eRedTeam); i += bz_getTeamWins(eGreenTeam); i += bz_getTeamWins(eBlueTeam); i += bz_getTeamWins(ePurpleTeam); i += bz_getTeamLosses(eRedTeam); i += bz_getTeamLosses(eGreenTeam); i += bz_getTeamLosses(eBlueTeam); i += bz_getTeamLosses(ePurpleTeam); hash += (i * 1000); i = 0; bz_APIIntList *players = bz_newIntList(); bz_getPlayerIndexList(players);; if (players && players->size()) { for (unsigned int p = 0; p < players->size(); p++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(players->get(p)); //int playerID = players->get(p); if (player) { std::string BZID = player->bzID.c_str(); if (BZID.size()) i += sumString(BZID); else i += sumString(std::string(player->callsign.c_str())); i += sumString("NONE"); i += player->wins; i += player->losses; i += player->teamKills; bz_freePlayerRecord(player); } } } bz_deleteIntList(players); hash += (i * 100000); params += format("&hash=%d",hash); } virtual void Event ( bz_EventData *eventData ) { { if (!eventData || !bz_getPublic()) return; if (eventData->eventType == bz_eGetWorldEvent) { bz_GetWorldEventData_V1 *data = (bz_GetWorldEventData_V1*)eventData; mapFile = data->worldFile.c_str(); if (!mapFile.size()) mapFile = "Random"; } else { if (eventData->eventType == bz_eListServerUpdateEvent) { bz_ListServerUpdateEvent_V1 *data = (bz_ListServerUpdateEvent_V1*)eventData; const char *c = strrchr(data->address.c_str(),':'); if (!c) port = "5154"; else port = c+1; std::string params = "action=add&"; getPushHeader(params); buildHTMLPlayerList(params); buildStateHash(params); bz_addURLJob(url.c_str(),NULL,params.c_str()); } else if (eventData->eventType == bz_ePlayerPartEvent) { bz_PlayerJoinPartEventData_V1 *data = (bz_PlayerJoinPartEventData_V1*)eventData; std::string params = "action=part"; getPushHeader(params); if (data->playerID) // we use -1 for the parted player, then skip them in the player list. this way we always get all player data on a part buildHTMLPlayer(params,data->playerID,-1); buildHTMLPlayerList(params, data->playerID); bz_addURLJob(url.c_str(),NULL,params.c_str()); } } } } std::string mapFile; std::string port; }; BZ_PLUGIN(StatPush) // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/pushstats/pushstats.def000066400000000000000000000001531200563112200216730ustar00rootroot00000000000000LIBRARY pushstats EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/pushstats/pushstats.sln000066400000000000000000000037331200563112200217400ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pushstats", "pushstats.vcxproj", "{EA71E096-B07B-4E02-855B-97870DA72EDD}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "..\plugin_utils\plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|Win32.ActiveCfg = Debug|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|Win32.Build.0 = Debug|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|x64.ActiveCfg = Debug|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Debug|x64.Build.0 = Debug|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|Win32.ActiveCfg = Release|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|Win32.Build.0 = Release|Win32 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|x64.ActiveCfg = Release|x64 {EA71E096-B07B-4E02-855B-97870DA72EDD}.Release|x64.Build.0 = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.Build.0 = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.ActiveCfg = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.Build.0 = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.ActiveCfg = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/pushstats/pushstats.vcxproj000066400000000000000000000342451200563112200226410ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {EA71E096-B07B-4E02-855B-97870DA72EDD} pushstats Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;pushstats_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)pushstats.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) pushstats.def true $(OutDir)pushstats.pdb Windows false $(OutDir)pushstats.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;pushstats_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)pushstats.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) pushstats.def true $(OutDir)pushstats.pdb Windows false $(OutDir)pushstats.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;pushstats_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)pushstats.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) pushstats.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)pushstats.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;pushstats_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)pushstats.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) pushstats.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)pushstats.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {645768be-97c8-4de4-9100-111bd2808b35} false bzflag-2.4.2+ds1/plugins/rabbitTimer/000077500000000000000000000000001200563112200173645ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/rabbitTimer/Makefile.am000066400000000000000000000006171200563112200214240ustar00rootroot00000000000000lib_LTLIBRARIES = rabbitTimer.la rabbitTimer_la_SOURCES = rabbitTimer.cpp rabbitTimer_la_CPPFLAGS = -I$(top_srcdir)/include rabbitTimer_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ rabbitTimer.def \ rabbitTimer.sln \ rabbitTimer.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/rabbitTimer/Makefile.in000066400000000000000000000461161200563112200214410ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/rabbitTimer DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) rabbitTimer_la_LIBADD = am_rabbitTimer_la_OBJECTS = rabbitTimer_la-rabbitTimer.lo rabbitTimer_la_OBJECTS = $(am_rabbitTimer_la_OBJECTS) rabbitTimer_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(rabbitTimer_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(rabbitTimer_la_SOURCES) DIST_SOURCES = $(rabbitTimer_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = rabbitTimer.la rabbitTimer_la_SOURCES = rabbitTimer.cpp rabbitTimer_la_CPPFLAGS = -I$(top_srcdir)/include rabbitTimer_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ rabbitTimer.def \ rabbitTimer.sln \ rabbitTimer.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/rabbitTimer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/rabbitTimer/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done rabbitTimer.la: $(rabbitTimer_la_OBJECTS) $(rabbitTimer_la_DEPENDENCIES) $(rabbitTimer_la_LINK) -rpath $(libdir) $(rabbitTimer_la_OBJECTS) $(rabbitTimer_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rabbitTimer_la-rabbitTimer.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< rabbitTimer_la-rabbitTimer.lo: rabbitTimer.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rabbitTimer_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT rabbitTimer_la-rabbitTimer.lo -MD -MP -MF $(DEPDIR)/rabbitTimer_la-rabbitTimer.Tpo -c -o rabbitTimer_la-rabbitTimer.lo `test -f 'rabbitTimer.cpp' || echo '$(srcdir)/'`rabbitTimer.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/rabbitTimer_la-rabbitTimer.Tpo $(DEPDIR)/rabbitTimer_la-rabbitTimer.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rabbitTimer.cpp' object='rabbitTimer_la-rabbitTimer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rabbitTimer_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o rabbitTimer_la-rabbitTimer.lo `test -f 'rabbitTimer.cpp' || echo '$(srcdir)/'`rabbitTimer.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/rabbitTimer/README.txt000066400000000000000000000021051200563112200210600ustar00rootroot00000000000000======================================================================== Rabbit Timer: BZFlag server plug-in Original author: L4m3r ======================================================================== The rabbitTimer plug-in helps solve that pesky rabbit cowardice problem. Rabbits don't get any points for hiding; they must kill hunters to increase their score. Hiding also slows down the game and frustrates the hunters, especially when flags like ST or WG are involved. This plug-in is used to set a maximum time between kills for the rabbit. In other words, the rabbit must kill a hunter every N seconds, or they are destroyed. There is also an optional rollover mode, in which extra time leftover from kills are added to the time allowance. Simply pass the desired time limit (in seconds) to the plug-in as a parameter, like this: -loadplugin /home/me/bzflag/plugins/rabbitTimer.so,30 To enable rollover mode, add a + to the beginning of the number: -loadplugin /home/me/bzflag/plugins/rabbitTimer.so,+30 By default, the time limit is 30 seconds, and rollover mode is disabled. bzflag-2.4.2+ds1/plugins/rabbitTimer/rabbitTimer.cpp000066400000000000000000000077271200563112200223510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "bzfsAPI.h" class rabbitTimer : public bz_Plugin { public: virtual const char* Name (){return "Rabit Timer";} virtual void Init ( const char* config); virtual void Event(bz_EventData *eventData); float rabbitKillTimeLimit; //the max time the rabbit has to kill someone bool rollOver; //whether or not to roll over leftover seconds float rabbitDeathTime; int currentRabbit; }; BZ_PLUGIN(rabbitTimer) void rabbitTimer::Event(bz_EventData *eventData) { if (eventData->eventType == bz_eTickEvent) { bz_TickEventData_V1* tickdata = (bz_TickEventData_V1*)eventData; if (currentRabbit != -1 && tickdata->eventTime >= rabbitDeathTime) { //kill the wabbit! bz_killPlayer(currentRabbit, false, BZ_SERVER); //stopgap. the kill event should do this, really... currentRabbit = -1; rabbitDeathTime = (float)tickdata->eventTime + rabbitKillTimeLimit; bz_sendTextMessage (BZ_SERVER, BZ_ALLUSERS, "Time's up! Selecting new rabbit."); } else if (currentRabbit == -1 && bz_getTeamCount(eHunterTeam) >= 3) //make sure we've got enough people before reactivating the timer { //find the new rabbit bz_APIIntList pl; bz_getPlayerIndexList(&pl); for (unsigned int i = 0; i < pl.size() && currentRabbit == -1; i++) { bz_BasePlayerRecord* pr = bz_getPlayerByIndex(pl.get(i)); if (pr != NULL) { if (pr->team == eRabbitTeam) { currentRabbit = pr->playerID; int limit = (int)rabbitKillTimeLimit; bz_sendTextMessage(BZ_SERVER, currentRabbit, bz_format("You have %d seconds to make a kill!", limit)); } bz_freePlayerRecord(pr); } } } } else if (eventData->eventType == bz_ePlayerDieEvent) { bz_PlayerDieEventData_V1* killdata = (bz_PlayerDieEventData_V1*)eventData; if (killdata->team == eRabbitTeam) { currentRabbit = -1; //we will sort this out on the next tick rabbitDeathTime = (float)killdata->eventTime + rabbitKillTimeLimit; } else if (killdata->killerTeam == eRabbitTeam && currentRabbit != -1) { if (rollOver) { rabbitDeathTime += rabbitKillTimeLimit; int limit = (int)rabbitKillTimeLimit; int timeremaining = (int)(rabbitDeathTime - killdata->eventTime); bz_sendTextMessage(BZ_SERVER, currentRabbit, bz_format("+%d seconds: %d seconds remaining.", limit, timeremaining)); } else { rabbitDeathTime = (float)killdata->eventTime + rabbitKillTimeLimit; int limit = (int)rabbitKillTimeLimit; bz_sendTextMessage(BZ_SERVER, currentRabbit, bz_format("%d seconds remaining.", limit)); } } } else if (eventData->eventType == bz_ePlayerDieEvent) { bz_PlayerJoinPartEventData_V1* partdata = (bz_PlayerJoinPartEventData_V1*)eventData; if (partdata->record->team == eRabbitTeam) //we need to select a new rabbit if the rabbit leaves. { currentRabbit = -1; //we will sort this out on the next tick rabbitDeathTime = (float)partdata->eventTime + rabbitKillTimeLimit; } } } void rabbitTimer::Init(const char* commandLine) { rabbitKillTimeLimit = 30.0; rollOver = false; currentRabbit = -1; rabbitDeathTime = 3600.0; //something large std::string param = commandLine; if (param.size() > 0 && param.at(0) == '+') { rollOver = true; param = param.erase(0,1); } int newtime = atoi(param.c_str()); if (newtime > 0) rabbitKillTimeLimit = (float)newtime; Register(bz_ePlayerDieEvent); Register(bz_ePlayerPartEvent); Register(bz_eTickEvent); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/rabbitTimer/rabbitTimer.def000066400000000000000000000001551200563112200223110ustar00rootroot00000000000000LIBRARY rabbitTimer EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/rabbitTimer/rabbitTimer.sln000066400000000000000000000023251200563112200223500ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rabbitTimer", "rabbitTimer.vcxproj", "{A4F41740-C547-4696-B2B4-9FDF66FD9112}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|Win32.ActiveCfg = Debug|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|Win32.Build.0 = Debug|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|x64.ActiveCfg = Debug|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Debug|x64.Build.0 = Debug|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|Win32.ActiveCfg = Release|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|Win32.Build.0 = Release|Win32 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|x64.ActiveCfg = Release|x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/rabbitTimer/rabbitTimer.vcxproj000066400000000000000000000337561200563112200232630ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {A4F41740-C547-4696-B2B4-9FDF66FD9112} rabbitTimer Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;rabbitTimer_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)rabbitTimer.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabbitTimer.def true $(OutDir)rabbitTimer.pdb Windows false $(OutDir)rabbitTimer.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;rabbitTimer_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabbitTimer.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabbitTimer.def true $(OutDir)rabbitTimer.pdb Windows false $(OutDir)rabbitTimer.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;rabbitTimer_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabbitTimer.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabbitTimer.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)rabbitTimer.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;rabbitTimer_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabbitTimer.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabbitTimer.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)rabbitTimer.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/rabidRabbit/000077500000000000000000000000001200563112200173255ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/rabidRabbit/Makefile.am000066400000000000000000000006421200563112200213630ustar00rootroot00000000000000lib_LTLIBRARIES = rabidRabbit.la rabidRabbit_la_SOURCES = rabidRabbit.cpp rabidRabbit_la_CPPFLAGS = -I$(top_srcdir)/include rabidRabbit_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ rabidRabbit.def \ rabidRabbit.sln \ rabidRabbit.txt \ rabidRabbit.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/rabidRabbit/Makefile.in000066400000000000000000000461411200563112200214000ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/rabidRabbit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) rabidRabbit_la_LIBADD = am_rabidRabbit_la_OBJECTS = rabidRabbit_la-rabidRabbit.lo rabidRabbit_la_OBJECTS = $(am_rabidRabbit_la_OBJECTS) rabidRabbit_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(rabidRabbit_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(rabidRabbit_la_SOURCES) DIST_SOURCES = $(rabidRabbit_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = rabidRabbit.la rabidRabbit_la_SOURCES = rabidRabbit.cpp rabidRabbit_la_CPPFLAGS = -I$(top_srcdir)/include rabidRabbit_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ rabidRabbit.def \ rabidRabbit.sln \ rabidRabbit.txt \ rabidRabbit.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/rabidRabbit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/rabidRabbit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done rabidRabbit.la: $(rabidRabbit_la_OBJECTS) $(rabidRabbit_la_DEPENDENCIES) $(rabidRabbit_la_LINK) -rpath $(libdir) $(rabidRabbit_la_OBJECTS) $(rabidRabbit_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rabidRabbit_la-rabidRabbit.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< rabidRabbit_la-rabidRabbit.lo: rabidRabbit.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rabidRabbit_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT rabidRabbit_la-rabidRabbit.lo -MD -MP -MF $(DEPDIR)/rabidRabbit_la-rabidRabbit.Tpo -c -o rabidRabbit_la-rabidRabbit.lo `test -f 'rabidRabbit.cpp' || echo '$(srcdir)/'`rabidRabbit.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/rabidRabbit_la-rabidRabbit.Tpo $(DEPDIR)/rabidRabbit_la-rabidRabbit.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='rabidRabbit.cpp' object='rabidRabbit_la-rabidRabbit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(rabidRabbit_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o rabidRabbit_la-rabidRabbit.lo `test -f 'rabidRabbit.cpp' || echo '$(srcdir)/'`rabidRabbit.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/rabidRabbit/README.txt000066400000000000000000000111321200563112200210210ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : rabidRabbit Project Overview ======================================================================== rabidRabbit plugin Author: LouMan Description: The rabidRabbit plugin will allow a rabbit player to enter a map defined volume (rabid rabbit 'zone') and kill all hunters at once. The plugin will accommodate as many rabidRabbit zones as are defined in the map file (minimum of 2) and will cycle through each rabidRabbit zones sequentially so that the rabbit cannot repeatedly use the same zone to kill the hunters. Map designers are highly advised to clearly indicate rabidRabbit zones in the map (texturing, world weapon option below, etc.), so that they are easily identified by all players. If a rabbit enters the incorrect rabidRabbit zone, a message will be sent to him/her that it isn't the correct rabidRabbit zone and to try the next zone. If the 'zonekillhunter' option is defined in the map file (see below), a hunter that enters the rabidRabbit zone will be killed. If the 'zonekillhunter' option is not defined, there will be no effect on a hunter entering the rabidRabbit zone. There is an option to fire a zone defined world weapon for indication to players which zone is active. There is also an option to cycle to the next rabid rabbit zone upon the rabbit's death. ------------------------------------------------------------------------------------- The parameters of the rabidRabbitzone map definition are follows: bbox or cylinder Required (at least 2 volumes). These define a volume on the map that the rabbit can enter to trigger death of all hunters. rrzoneww
      Optional. This defines the world weapon. is a valid type of flag to use for the world weapon (e.g. SW, GM, L, etc.) defines the life of the weapon's shots. defines the location of the world weapon. defined the tilt of the world weapon. defines the direction of the world weapon. ...not sure what this does ;) but it is an input to the API world weapon function.
      defines the delay time of the world weapon. defines the amount of time between the world weapon shots. Minimum = 0.1 seconds. servermessage "your message here" Optional. If used, sends custom message to all players when a rabbit kills all hunters by entering rabidRabbit zone. zonekillhunter "your message here" Optional. If used, a hunter that enters the rabidRabbit zone will be killed with a custom message. There is also a separate map parameter available related to rabid rabbit: rrsoundoff Optional. This will disable sounds associated with the rabid rabbit plugin. rrcycleondie Optional. This will cause the plugin to cycle to the next rabid rabbit zone upon the rabbit's death. ------------------------------------------------------------------------------------- Examples of map (.bzw) entries: rabidRabbitzone bbox -80 -30 -80 -30 0 2 rrzoneww SW 1 -50 -50 1000 90 0 0 0 .5 servermessage "You were killed by a rabid rabbit!" zonekillhunter "This area for rabbits only!" end rabidRabbitzone bbox 30 80 30 80 0 2 rrzoneww SW 1 50 50 25 1000 0 0 0 .5 servermessage "You were killed by a rabid rabbit!" zonekillhunter "This area for rabbits only!" end rrsoundoff end rrcycleondie end This defines the 2 zones that the rabbit can enter to kill all hunters. The plugin will use the first volume definition (bbox -80 -30 -80 -30 0 2) as the zone for the rabbit to enter to kill hunters. If the rabbit successfully enters this zone and kill the hunters, the plugin will use the next defined volume (bbox 30 80 30 80 0 2) as the zone for the rabbit to enter to kill hunters. And so on - the plugin will cycle through each zone sequentially. If a rabbit successfully enters the correct zone, all hunters will be killed with a message stating, "You were killed by a rabid rabbit!" If a hunter enters a rabidRabbit zone, he/she will be killed with message "This area for rabbits only!" A laser world weapon will repeatedly fire every 0.5 seconds (at the coordinates and with the tilt/direction indicated) when each zone is active for rabidRabbit. Rabid rabbit sounds will be disabled due to "rrsoundoff" map entry, and the plugin will cycle to the next rabid rabbit zone upon the rabbit's death. ------------------------------------------------------------------------------------- Please report any bugs or issues with this plugin to LouMan, and good luck. bzflag-2.4.2+ds1/plugins/rabidRabbit/rabidRabbit.cpp000066400000000000000000000220071200563112200222370ustar00rootroot00000000000000// rabidRabbit.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" #include #include class RabidRabbitHandler : public bz_CustomMapObjectHandler { public: virtual bool MapObject(bz_ApiString object, bz_CustomMapObjectInfo *data); }; RabidRabbitHandler rabidrabbithandler; class RabidRabbitEventHandler : public bz_Plugin { public: virtual const char* Name (){return "Rabid Rabbit";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event(bz_EventData *eventData); }; BZ_PLUGIN(RabidRabbitEventHandler) void RabidRabbitEventHandler::Init(const char* /*commandLineParameter*/) { MaxWaitTime = 1.0f; bz_registerCustomMapObject("RABIDRABBITZONE",&rabidrabbithandler); bz_registerCustomMapObject("RRSOUNDOFF",&rabidrabbithandler); bz_registerCustomMapObject("RRCYCLEONDIE",&rabidrabbithandler); Register(bz_eTickEvent); Register(bz_ePlayerDieEvent); } void RabidRabbitEventHandler::Cleanup(void) { Flush(); bz_removeCustomMapObject("RABIDRABBITZONE"); bz_removeCustomMapObject("RRSOUNDOFF"); bz_removeCustomMapObject("RRCYCLEONDIE"); } class RRZoneInfo { public: RRZoneInfo() { currentKillZone = 0; rabbitNotifiedWrongZone = false; rabbitNotifiedWrongZoneNum = 0; soundEnabled = true; cycleOnDie = false; } unsigned int currentKillZone; unsigned int rabbitNotifiedWrongZoneNum; bool rabbitNotifiedWrongZone; bool soundEnabled; bool cycleOnDie; }; RRZoneInfo rrzoneinfo; class RabidRabbitZone { public: RabidRabbitZone() { zonekillhunter = false; box = false; xMax = xMin = yMax = yMin = zMax = zMin = rad = 0; WW = ""; WWLifetime = 0; WWPosition[0] = 0; WWPosition[1] = 0; WWPosition[2] = 0; WWTilt = 0; WWDirection = 0; WWShotID = 0; WWDT = 0; WWRepeat = 0.5; WWFired = false; WWLastFired = 0; pi = 3.14159265358979323846; } bool zonekillhunter; bool box; float xMax,xMin,yMax,yMin,zMax,zMin; float rad; bz_ApiString WW; float WWLifetime, WWPosition[3], WWTilt, WWDirection, WWDT; double pi, WWLastFired, WWRepeat; bool WWFired; int WWShotID; std::string playermessage; std::string servermessage; bool pointIn(float pos[3]) { if (box) { if (pos[0] > xMax || pos[0] < xMin) return false; if (pos[1] > yMax || pos[1] < yMin) return false; if (pos[2] > zMax || pos[2] < zMin) return false; } else { float vec[3]; vec[0] = pos[0]-xMax; vec[1] = pos[1]-yMax; vec[2] = pos[2]-zMax; float dist = sqrt(vec[0]*vec[0]+vec[1]*vec[1]); if (dist > rad) return false; if (pos[2] > zMax || pos[2] < zMin) return false; } return true; } }; std::vector zoneList; bool RabidRabbitHandler::MapObject(bz_ApiString object, bz_CustomMapObjectInfo *data) { if (object == "RRSOUNDOFF") rrzoneinfo.soundEnabled = false; if (object == "RRCYCLEONDIE") rrzoneinfo.cycleOnDie = true; if (object != "RABIDRABBITZONE" || !data) return false; RabidRabbitZone newZone; // parse all the chunks for (unsigned int i = 0; i < data->data.size(); i++) { std::string line = data->data.get(i).c_str(); bz_APIStringList *nubs = bz_newStringList(); nubs->tokenize(line.c_str()," ",0,true); if (nubs->size() > 0) { std::string key = bz_toupper(nubs->get(0).c_str()); if (key == "BBOX" && nubs->size() > 6) { newZone.box = true; newZone.xMin = (float)atof(nubs->get(1).c_str()); newZone.xMax = (float)atof(nubs->get(2).c_str()); newZone.yMin = (float)atof(nubs->get(3).c_str()); newZone.yMax = (float)atof(nubs->get(4).c_str()); newZone.zMin = (float)atof(nubs->get(5).c_str()); newZone.zMax = (float)atof(nubs->get(6).c_str()); } else if (key == "CYLINDER" && nubs->size() > 5) { newZone.box = false; newZone.rad = (float)atof(nubs->get(5).c_str()); newZone.xMax =(float)atof(nubs->get(1).c_str()); newZone.yMax =(float)atof(nubs->get(2).c_str()); newZone.zMin =(float)atof(nubs->get(3).c_str()); newZone.zMax =(float)atof(nubs->get(4).c_str()); } else if (key == "RRZONEWW" && nubs->size() > 10) { newZone.WW = nubs->get(1); newZone.WWLifetime = (float)atof(nubs->get(2).c_str()); newZone.WWPosition[0] = (float)atof(nubs->get(3).c_str()); newZone.WWPosition[1] = (float)atof(nubs->get(4).c_str()); newZone.WWPosition[2] = (float)atof(nubs->get(5).c_str()); newZone.WWTilt = (float)atof(nubs->get(6).c_str()); newZone.WWTilt = (newZone.WWTilt / 360) * (2 * (float)newZone.pi); newZone.WWDirection = (float)atof(nubs->get(7).c_str()); newZone.WWDirection = (newZone.WWDirection / 360) * (2 * (float)newZone.pi); newZone.WWShotID = (int)atoi(nubs->get(8).c_str()); newZone.WWDT = (float)atof(nubs->get(9).c_str()); newZone.WWRepeat = (float)atof(nubs->get(10).c_str()); } else if (key == "SERVERMESSAGE" && nubs->size() > 1) { newZone.servermessage = nubs->get(1).c_str(); } else if (key == "ZONEKILLHUNTER") { if (nubs->size() > 1) newZone.playermessage = nubs->get(1).c_str(); newZone.zonekillhunter = true; } } bz_deleteStringList(nubs); } zoneList.push_back(newZone); return true; } void killAllHunters(std::string messagepass) { bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList(playerList); for (unsigned int i = 0; i < playerList->size(); i++){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { if (player->team != eRabbitTeam) { bz_killPlayer(player->playerID, true, BZ_SERVER); bz_sendTextMessage(BZ_SERVER, player->playerID, messagepass.c_str()); if (rrzoneinfo.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } if (player->team == eRabbitTeam && rrzoneinfo.soundEnabled && bz_getTeamCount(eHunterTeam) > 0) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); bz_freePlayerRecord(player); } } bz_deleteIntList(playerList); return; } void RabidRabbitEventHandler::Event(bz_EventData *eventData) { if (eventData->eventType == bz_ePlayerDieEvent) { bz_PlayerDieEventData_V1 *DieData = (bz_PlayerDieEventData_V1*)eventData; if (rrzoneinfo.cycleOnDie && DieData->team == eRabbitTeam) { unsigned int i = rrzoneinfo.currentKillZone; if (i == (zoneList.size() - 1)) rrzoneinfo.currentKillZone = 0; else rrzoneinfo.currentKillZone++; } return; } if ((eventData->eventType != bz_eTickEvent) || (zoneList.size() < 2)) return; for (unsigned int i = 0; i < zoneList.size(); i++) { if (!zoneList[i].WWFired && rrzoneinfo.currentKillZone == i) { bz_fireWorldWep(zoneList[i].WW.c_str(), zoneList[i].WWLifetime, BZ_SERVER,zoneList[i].WWPosition, zoneList[i].WWTilt, zoneList[i].WWDirection, zoneList[i].WWShotID, zoneList[i].WWDT); zoneList[i].WWFired = true; zoneList[i].WWLastFired = bz_getCurrentTime(); } else { if ((bz_getCurrentTime() - zoneList[i].WWLastFired) > zoneList[i].WWRepeat) zoneList[i].WWFired = false; } } bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList(playerList); for (unsigned int h = 0; h < playerList->size(); h++) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](h)); if (player) { for (unsigned int i = 0; i < zoneList.size(); i++) { if (zoneList[i].pointIn(player->lastKnownState.pos) && player->spawned && player->team == eRabbitTeam && rrzoneinfo.currentKillZone != i && !rrzoneinfo.rabbitNotifiedWrongZone) { bz_sendTextMessage(BZ_SERVER,player->playerID, "You are not in the current Rabid Rabbit zone - try another."); rrzoneinfo.rabbitNotifiedWrongZone = true; rrzoneinfo.rabbitNotifiedWrongZoneNum = i; } if (!zoneList[i].pointIn(player->lastKnownState.pos) && player->spawned && player->team == eRabbitTeam && rrzoneinfo.rabbitNotifiedWrongZone && rrzoneinfo.rabbitNotifiedWrongZoneNum == i) rrzoneinfo.rabbitNotifiedWrongZone = false; if (zoneList[i].pointIn(player->lastKnownState.pos) && player->spawned && player->team == eRabbitTeam && rrzoneinfo.currentKillZone == i && bz_getTeamCount(eHunterTeam) > 0) { killAllHunters(zoneList[i].servermessage); rrzoneinfo.rabbitNotifiedWrongZone = true; rrzoneinfo.rabbitNotifiedWrongZoneNum = i; if (i == (zoneList.size() - 1)) rrzoneinfo.currentKillZone = 0; else rrzoneinfo.currentKillZone++; rrzoneinfo.rabbitNotifiedWrongZone = true; rrzoneinfo.rabbitNotifiedWrongZoneNum = i; } if (zoneList[i].pointIn(player->lastKnownState.pos) && player->spawned && player->team != eRabbitTeam && zoneList[i].zonekillhunter) { bz_killPlayer(player->playerID, true, BZ_SERVER); bz_sendTextMessage (BZ_SERVER, player->playerID, zoneList[i].playermessage.c_str()); } } bz_freePlayerRecord(player); } } bz_deleteIntList(playerList); return; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/rabidRabbit/rabidRabbit.def000066400000000000000000000001551200563112200222130ustar00rootroot00000000000000LIBRARY rabidRabbit EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/rabidRabbit/rabidRabbit.sln000066400000000000000000000023251200563112200222520ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rabidRabbit", "rabidRabbit.vcxproj", "{F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|Win32.ActiveCfg = Debug|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|Win32.Build.0 = Debug|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|x64.ActiveCfg = Debug|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Debug|x64.Build.0 = Debug|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|Win32.ActiveCfg = Release|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|Win32.Build.0 = Release|Win32 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|x64.ActiveCfg = Release|x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/rabidRabbit/rabidRabbit.txt000066400000000000000000000006371200563112200223010ustar00rootroot00000000000000 ----------------------------------------------------------- Goal of game: Hunters: Kill the rabid rabbit before it enters its burrow! Rabbits: Run and hide in 'active' burrow and hunters die! ---------------------------------------------------------- Look for expanding rings in radar - this indicates the 'active' burrow for the rabid rabbit to run to. ---------------------------------------------------------- bzflag-2.4.2+ds1/plugins/rabidRabbit/rabidRabbit.vcxproj000066400000000000000000000337561200563112200231650ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {F3055CD9-357A-4136-B9D8-09D6E5F2B4A6} rabidRabbit Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;rabidRabbit_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)rabidRabbit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabidRabbit.def true $(OutDir)rabidRabbit.pdb Windows false $(OutDir)rabidRabbit.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;rabidRabbit_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabidRabbit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabidRabbit.def true $(OutDir)rabidRabbit.pdb Windows false $(OutDir)rabidRabbit.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;rabidRabbit_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabidRabbit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabidRabbit.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)rabidRabbit.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;rabidRabbit_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)rabidRabbit.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) rabidRabbit.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)rabidRabbit.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/recordmatch/000077500000000000000000000000001200563112200174135ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/recordmatch/Makefile.am000066400000000000000000000006171200563112200214530ustar00rootroot00000000000000lib_LTLIBRARIES = recordmatch.la recordmatch_la_SOURCES = recordmatch.cpp recordmatch_la_CPPFLAGS = -I$(top_srcdir)/include recordmatch_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ recordmatch.def \ recordmatch.sln \ recordmatch.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/recordmatch/Makefile.in000066400000000000000000000461161200563112200214700ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/recordmatch DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) recordmatch_la_LIBADD = am_recordmatch_la_OBJECTS = recordmatch_la-recordmatch.lo recordmatch_la_OBJECTS = $(am_recordmatch_la_OBJECTS) recordmatch_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(recordmatch_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(recordmatch_la_SOURCES) DIST_SOURCES = $(recordmatch_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = recordmatch.la recordmatch_la_SOURCES = recordmatch.cpp recordmatch_la_CPPFLAGS = -I$(top_srcdir)/include recordmatch_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ recordmatch.def \ recordmatch.sln \ recordmatch.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/recordmatch/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/recordmatch/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done recordmatch.la: $(recordmatch_la_OBJECTS) $(recordmatch_la_DEPENDENCIES) $(recordmatch_la_LINK) -rpath $(libdir) $(recordmatch_la_OBJECTS) $(recordmatch_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recordmatch_la-recordmatch.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< recordmatch_la-recordmatch.lo: recordmatch.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(recordmatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT recordmatch_la-recordmatch.lo -MD -MP -MF $(DEPDIR)/recordmatch_la-recordmatch.Tpo -c -o recordmatch_la-recordmatch.lo `test -f 'recordmatch.cpp' || echo '$(srcdir)/'`recordmatch.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/recordmatch_la-recordmatch.Tpo $(DEPDIR)/recordmatch_la-recordmatch.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='recordmatch.cpp' object='recordmatch_la-recordmatch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(recordmatch_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o recordmatch_la-recordmatch.lo `test -f 'recordmatch.cpp' || echo '$(srcdir)/'`recordmatch.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/recordmatch/README.txt000066400000000000000000000005531200563112200211140ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : recordmatch Project Overview ======================================================================== This is the recordmatch plugin. It automatically saves a recording of each timed match into its own file, from which it can be played back by a replay server. bzflag-2.4.2+ds1/plugins/recordmatch/recordmatch.cpp000066400000000000000000000026321200563112200224150ustar00rootroot00000000000000// recordmatch.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include class GameStartEndHandler : public bz_Plugin { public: virtual const char* Name (){return "Record Match";} virtual void Init ( const char* config); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(GameStartEndHandler) std::string path; bool started = false; std::string filename; void GameStartEndHandler::Init( const char* commandLine ) { Register(bz_eGameStartEvent); Register(bz_eGameEndEvent); filename = commandLine; } void GameStartEndHandler::Event( bz_EventData *eventData ) { switch(eventData->eventType) { case bz_eGameStartEvent: { started = bz_startRecBuf(); bz_Time time; bz_getLocaltime(&time); char temp[512]; sprintf(temp,"match-%d%02d%02d-%02d%02d%02d.rec", time.year,time.month,time.day, time.hour,time.minute,time.second); filename = temp; } break; case bz_eGameEndEvent: { if (!started) break; std::string recFile = path + filename; bz_saveRecBuf(recFile.c_str(),0); bz_stopRecBuf(); started = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Match saved in file %s", filename.c_str()); } break; default: { // do nothing } } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/recordmatch/recordmatch.def000066400000000000000000000001551200563112200223670ustar00rootroot00000000000000LIBRARY recordmatch EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/recordmatch/recordmatch.sln000066400000000000000000000023251200563112200224260ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recordmatch", "recordmatch.vcxproj", "{1BE08800-933A-49E2-9090-11139ECC5AC8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|Win32.ActiveCfg = Debug|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|Win32.Build.0 = Debug|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|x64.ActiveCfg = Debug|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Debug|x64.Build.0 = Debug|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|Win32.ActiveCfg = Release|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|Win32.Build.0 = Release|Win32 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|x64.ActiveCfg = Release|x64 {1BE08800-933A-49E2-9090-11139ECC5AC8}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/recordmatch/recordmatch.vcxproj000066400000000000000000000337531200563112200233360ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {1BE08800-933A-49E2-9090-11139ECC5AC8} recordmatch Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;recordmatch_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)recordmatch.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) recordmatch.def true $(OutDir)recordmatch.pdb Windows false $(OutDir)recordmatch.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;recordmatch_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)recordmatch.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) recordmatch.def true $(OutDir)recordmatch.pdb Windows false $(OutDir)recordmatch.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;recordmatch_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)recordmatch.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) recordmatch.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)recordmatch.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;recordmatch_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)recordmatch.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) recordmatch.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)recordmatch.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/regFlag/000077500000000000000000000000001200563112200164675ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/regFlag/Makefile.am000066400000000000000000000005571200563112200205320ustar00rootroot00000000000000lib_LTLIBRARIES = regFlag.la regFlag_la_SOURCES = regFlag.cpp regFlag_la_CPPFLAGS = -I$(top_srcdir)/include regFlag_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ regFlag.def \ regFlag.sln \ regFlag.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/regFlag/Makefile.in000066400000000000000000000455721200563112200205510ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/regFlag DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) regFlag_la_LIBADD = am_regFlag_la_OBJECTS = regFlag_la-regFlag.lo regFlag_la_OBJECTS = $(am_regFlag_la_OBJECTS) regFlag_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(regFlag_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(regFlag_la_SOURCES) DIST_SOURCES = $(regFlag_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = regFlag.la regFlag_la_SOURCES = regFlag.cpp regFlag_la_CPPFLAGS = -I$(top_srcdir)/include regFlag_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ regFlag.def \ regFlag.sln \ regFlag.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/regFlag/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/regFlag/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done regFlag.la: $(regFlag_la_OBJECTS) $(regFlag_la_DEPENDENCIES) $(regFlag_la_LINK) -rpath $(libdir) $(regFlag_la_OBJECTS) $(regFlag_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regFlag_la-regFlag.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< regFlag_la-regFlag.lo: regFlag.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(regFlag_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT regFlag_la-regFlag.lo -MD -MP -MF $(DEPDIR)/regFlag_la-regFlag.Tpo -c -o regFlag_la-regFlag.lo `test -f 'regFlag.cpp' || echo '$(srcdir)/'`regFlag.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/regFlag_la-regFlag.Tpo $(DEPDIR)/regFlag_la-regFlag.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='regFlag.cpp' object='regFlag_la-regFlag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(regFlag_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o regFlag_la-regFlag.lo `test -f 'regFlag.cpp' || echo '$(srcdir)/'`regFlag.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/regFlag/README.txt000066400000000000000000000011351200563112200201650ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : regFlag Project Overview ======================================================================== This is the regFlag BZFlag plugin This plugin only allows registered users to hold flags. A fixed messages is displayed to the user when their flag is dropped. TODO: - Add configuration file - Make the displayed message when a flag is dropped configurable - Add configuration to allow non-registered players to keep bad flags - Add configuration to allow non-registered players to keep team flags bzflag-2.4.2+ds1/plugins/regFlag/regFlag.cpp000066400000000000000000000024671200563112200205530ustar00rootroot00000000000000// regFlag.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" class RegFlag : public bz_Plugin { public: virtual const char* Name (){return "RegFlag";} virtual void Init ( const char* config); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(RegFlag) void RegFlag::Init( const char* /*commandLine*/ ) { Register(bz_ePlayerUpdateEvent); } void RegFlag::Event ( bz_EventData *eventData ) { bz_BasePlayerRecord *player = NULL; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; case bz_eShotFiredEvent: playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; default: return; } player = bz_getPlayerByIndex(playerID); if (!player) return; if (player->globalUser) { bz_freePlayerRecord(player); return; } bz_freePlayerRecord(player); const char* flagAbrev = bz_getPlayerFlag(playerID); if (!flagAbrev) return; bz_removePlayerFlag(playerID); bz_sendTextMessage(BZ_SERVER,playerID, "Flags are for registered players only"); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/regFlag/regFlag.def000066400000000000000000000001511200563112200205130ustar00rootroot00000000000000LIBRARY regFlag EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/regFlag/regFlag.sln000066400000000000000000000023151200563112200205550ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "regFlag", "regFlag.vcxproj", "{43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|Win32.ActiveCfg = Debug|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|Win32.Build.0 = Debug|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|x64.ActiveCfg = Debug|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Debug|x64.Build.0 = Debug|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|Win32.ActiveCfg = Release|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|Win32.Build.0 = Release|Win32 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|x64.ActiveCfg = Release|x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/regFlag/regFlag.vcxproj000066400000000000000000000341731200563112200214630ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {43A4F281-53E9-4E6D-ABC0-09BE6B592F0F} regFlag Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;regFlag_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)regFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) regFlag.def true $(OutDir)regFlag.pdb Windows false $(OutDir)regFlag.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;regFlag_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)regFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) regFlag.def true $(OutDir)regFlag.pdb Windows false $(OutDir)regFlag.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;regFlag_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)regFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) regFlag.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)regFlag.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;regFlag_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)regFlag.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) regFlag.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)regFlag.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {645768be-97c8-4de4-9100-111bd2808b35} false bzflag-2.4.2+ds1/plugins/serverControl/000077500000000000000000000000001200563112200177675ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/serverControl/Makefile.am000066400000000000000000000010641200563112200220240ustar00rootroot00000000000000lib_LTLIBRARIES = serverControl.la serverControl_la_SOURCES = serverControl.cpp serverControl_la_CXXFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/plugins/plugin_utils $(AM_CXXFLAGS) serverControl_la_LDFLAGS = -module -avoid-version -shared serverControl_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ plugins.cfg \ README.txt \ serverControl.def \ serverControl.sln \ serverControl.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/serverControl/Makefile.in000066400000000000000000000466401200563112200220460ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/serverControl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) serverControl_la_DEPENDENCIES = \ $(top_builddir)/plugins/plugin_utils/libplugin_utils.la am_serverControl_la_OBJECTS = serverControl_la-serverControl.lo serverControl_la_OBJECTS = $(am_serverControl_la_OBJECTS) serverControl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(serverControl_la_CXXFLAGS) $(CXXFLAGS) \ $(serverControl_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(serverControl_la_SOURCES) DIST_SOURCES = $(serverControl_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = serverControl.la serverControl_la_SOURCES = serverControl.cpp serverControl_la_CXXFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/plugins/plugin_utils $(AM_CXXFLAGS) serverControl_la_LDFLAGS = -module -avoid-version -shared serverControl_la_LIBADD = $(top_builddir)/plugins/plugin_utils/libplugin_utils.la AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ plugins.cfg \ README.txt \ serverControl.def \ serverControl.sln \ serverControl.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/serverControl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/serverControl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done serverControl.la: $(serverControl_la_OBJECTS) $(serverControl_la_DEPENDENCIES) $(serverControl_la_LINK) -rpath $(libdir) $(serverControl_la_OBJECTS) $(serverControl_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serverControl_la-serverControl.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< serverControl_la-serverControl.lo: serverControl.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(serverControl_la_CXXFLAGS) $(CXXFLAGS) -MT serverControl_la-serverControl.lo -MD -MP -MF $(DEPDIR)/serverControl_la-serverControl.Tpo -c -o serverControl_la-serverControl.lo `test -f 'serverControl.cpp' || echo '$(srcdir)/'`serverControl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/serverControl_la-serverControl.Tpo $(DEPDIR)/serverControl_la-serverControl.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='serverControl.cpp' object='serverControl_la-serverControl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(serverControl_la_CXXFLAGS) $(CXXFLAGS) -c -o serverControl_la-serverControl.lo `test -f 'serverControl.cpp' || echo '$(srcdir)/'`serverControl.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/serverControl/README.txt000066400000000000000000000023751200563112200214740ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : serverControl Project Overview ======================================================================== This is the serverControl plugin. This plugin takes a single command line argument that specifies the filename for the plugin configuration file. An example configuration file is provided in 'plugins.cfg' The purpose of this plugin is for ban file synchronization across multiple BZFlag servers running on the same host and for controlled server shutdown for queued server restarts. The plugin will reload the ban file or master ban file entries when it notices a modification to the local file. To use this effectively with the BZFlag masterban file you should copy the banfile from the official server to a local file and only modify the local master ban file the plugin looks at if the contents of the ban file changes. An example script (for Linux systems) to keep a local copy of the masterban file is provided in check_masterbans.sh. This plugin can shut down the BZFlag server on demand or every time a game ends. See the supplied plugin.cfg configuration file for details. Plugin loading format: -loadplugin /path/to/serverControl,/path/to/plugins.cfg bzflag-2.4.2+ds1/plugins/serverControl/plugins.cfg000066400000000000000000000051361200563112200221360ustar00rootroot00000000000000# Plugin Configuration File # # serverControl plugin options # # All values are optional. You can omit values by commenting them # out of leaving them with no value defined as in 'key =' [ServerControl] # # Ban File Section # ---------------- # Ban files can be shared between multiple servers. # Specify the location for the shared banfile. # The plugin checks the modification time for the file # every tick event (approximately every 3 seconds) and # reloads the banfile information on the server # Ban file location BanFile = db/banfile # Message to display when bans are reloaded. BanReloadMessage = Bans updated # Local file copy of the master ban MasterBanFile = db/master-bans.txt # Message to display when the master ban list is reloaded MasterBanReloadMessage = Master bans updated # # Server Restart Section # ---------------------- # # If you run your BZFlag server in a server loop from a shell script # you can force the server to exit so the server can be reloaded by # the controlling shell script. # # The plugin causes the server to shutdown if the server was active # and has zero players. A server is considered active if at least # one non-observer player has connected to the server. This can be # used to change maps, reset the server back to its default # settings, etc. # The ResetServerOnceFile normally does not exist. You create this # file when you want to force a server reset. You can do this on # busy maps to queue a server shutdown when the game ends without # interrupting play. If this file exists and the server is empty it # forces an immediate shutdown regardless of whether the server was # active or not. You would normally use this when you update to a # new version of the server or plugin code or change server # configuration options and want to restart the server without # interrupting any currently running games. The ResetServerOnceFile # is removed when the server is shutdown by the plugin. ResetServerOnceFile = reset-server-once # If the ResetServerAlwaysFile exists the server will exit each time # the last player leaves the server. The server requires a # non-observer to join to put it in an 'active' state before the # plugin will cause the server to exit (someone actually has to use # the map before the server exits). This can be used to control # rotation servers with no time limit. ResetServerAlwaysFile = reset-server-always # Ignore observers makes the server shutdown after a non-observer has # connected even if observers are still present #IgnoreObservers = true bzflag-2.4.2+ds1/plugins/serverControl/serverControl.cpp000066400000000000000000000210431200563112200233420ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // ServerControl.cpp : Server shutdown and ban file control // #include #include #include #include #include "bzfsAPI.h" #include "plugin_utils.h" using namespace std; enum action { join , part }; class ServerControl : public bz_Plugin { public: virtual const char* Name (){return "Server Control";} virtual void Init ( const char* config); virtual void Event( bz_EventData *eventData ); int loadConfig(const char *cmdLine); private: void countPlayers( action act, bz_PlayerJoinPartEventData_V1 *data ); void checkShutdown( void ); void checkBanChanges( void ); void checkMasterBanChanges( void ); void fileAccessTime(const std::string filename, time_t *mtime, bool *error); string banFilename; string masterBanFilename; string resetServerOnceFilename; string resetServerAlwaysFilename; string banReloadMessage; string masterBanReloadMessage; time_t banFileAccessTime; bool banFileErrorLogged; time_t masterBanFileAccessTime; bool masterBanErrorLogged; int numPlayers; int numObservers; bool serverActive; bool ignoreObservers; double lastTime; }; BZ_PLUGIN(ServerControl) void ServerControl::Init ( const char* cmdLine ) { if (loadConfig(cmdLine) < 0) return; Register(bz_ePlayerJoinEvent); Register(bz_ePlayerPartEvent); Register(bz_eTickEvent); } int ServerControl::loadConfig(const char *cmdLine) { PluginConfig config = PluginConfig(cmdLine); string section = "ServerControl"; if (config.errors) return -1; serverActive = false; countPlayers( join , NULL ); lastTime = 0.0f; /* * Set up options from the configuration file */ banFilename = config.item(section, "BanFile"); masterBanFilename = config.item(section, "MasterBanFile"); resetServerOnceFilename = config.item(section, "ResetServerOnceFile"); resetServerAlwaysFilename = config.item(section, "ResetServerAlwaysFile"); banReloadMessage = config.item(section, "BanReloadMessage"); masterBanReloadMessage = config.item(section, "MasterBanReloadMessage"); ignoreObservers = (config.item(section, "IgnoreObservers") != ""); /* * Report settings */ // Ban file if (banFilename == "") bz_debugMessagef(1, "ServerControl - No banfile checks - no BanFile specified"); else bz_debugMessagef(1, "ServerControl - Monitoring ban file: %s", banFilename.c_str()); // Ban reload message if (banReloadMessage == "") bz_debugMessagef(1, "ServerControl - No BanReloadMessage notification"); else bz_debugMessagef(1, "ServerControl - BanReloadMessage: %s", banReloadMessage.c_str()); // Masterban file if (masterBanFilename == "") bz_debugMessagef(1, "ServerControl - No masterban file checks - no MasterbanFile specified"); else bz_debugMessagef(1, "ServerControl - Monitoring master ban file: %s", masterBanFilename.c_str()); // Master Ban reload message if (masterBanReloadMessage == "") bz_debugMessagef(1, "ServerControl - No MasterBanReloadMessage notification"); else bz_debugMessagef(1, "ServerControl - MasterBanReloadMessage: %s", masterBanReloadMessage.c_str()); // Reset Server Once file if (resetServerOnceFilename == "") bz_debugMessagef(1, "ServerControl - No ResetServerOnceFile specified"); else bz_debugMessagef(1, "ServerControl - Using ResetServerOnceFile: %s", resetServerOnceFilename.c_str()); // Reset Server Always file if (resetServerAlwaysFilename == "") bz_debugMessagef(1, "ServerControl - No ResetServerAlwaysFile specified"); else bz_debugMessagef(1, "ServerControl - Using ResetServerAlwaysFile: %s", resetServerAlwaysFilename.c_str()); // Ignore Observers if (ignoreObservers) bz_debugMessage(1, "ServerControl - Ignoring Observers for server restarts"); else bz_debugMessage(1, "ServerControl - Server must be empty for server restarts"); /* Set the initial ban file access times */ masterBanErrorLogged = false; banFileErrorLogged = false; if (masterBanFilename != "") fileAccessTime(masterBanFilename, &masterBanFileAccessTime, &masterBanErrorLogged); if (banFilename != "") fileAccessTime(banFilename, &banFileAccessTime, &banFileErrorLogged); return 0; } void ServerControl::fileAccessTime(const std::string filename, time_t *mtime, bool *error) { struct stat buf; if (stat(filename.c_str(), &buf) == 0) { *mtime = buf.st_mtime; *error = false; } else { *mtime = 0; if (!*error) { bz_debugMessagef(0, "ServerControl - Can't stat the banfile %s", filename.c_str()); *error = true; } } } void ServerControl::checkShutdown( void ) { // Check for server shutdown // // We shutdown the server in the following cases: // The server has no players and // the reset server once file exists OR // the reset server always file exists and someone was on the server // if ((numPlayers <= 0) || (ignoreObservers && (numPlayers - numObservers) <= 0)) { // No players if (resetServerOnceFilename != "") { std::ifstream resetOnce( resetServerOnceFilename.c_str() ); if (resetOnce) { // Reset server once exists resetOnce.close(); remove( resetServerOnceFilename.c_str() ); bz_debugMessagef(2, "ServerControl - Reset Server Once - SHUTDOWN"); bz_shutdown(); } else if (resetServerAlwaysFilename != "" && serverActive) { // Server was active - some non-observer player connected std::ifstream resetAlways( resetServerAlwaysFilename.c_str() ); if (resetAlways) { // Reset server always exists resetAlways.close(); bz_debugMessagef(2, "ServerControl - Reset Server Always - SHUTDOWN"); bz_shutdown(); } } } } } void ServerControl::Event( bz_EventData *eventData ) { ostringstream msg; bz_PlayerJoinPartEventData_V1 *data = (bz_PlayerJoinPartEventData_V1 *) eventData; double now; if (eventData) { switch (eventData->eventType) { case bz_eTickEvent: now = bz_getCurrentTime(); if ((now - lastTime) < 3.0f) return; lastTime = now; checkShutdown(); if (banFilename != "" ) checkBanChanges(); if (masterBanFilename != "") checkMasterBanChanges(); break; case bz_ePlayerJoinEvent: if (data->record->team >= eRogueTeam && data->record->team <= eHunterTeam && data->record->callsign != "") { serverActive = true; } countPlayers( join , data ); break; case bz_ePlayerPartEvent: countPlayers( part , data ); checkShutdown(); break; default : break; } } } void ServerControl::countPlayers(action act , bz_PlayerJoinPartEventData_V1 *data) { bz_APIIntList *playerList = bz_newIntList(); bz_BasePlayerRecord *player; ostringstream msg; string str; int numLines = 0; int numObs = 0; bz_getPlayerIndexList( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { player = bz_getPlayerByIndex( playerList->get(i)); if (player) { if (act == join || (data && (player->playerID != data->playerID) && (player->callsign != ""))) { if (player->callsign != "") { if (player->team == eObservers) numObs++; numLines++; } } bz_freePlayerRecord( player ); } } numPlayers = numLines; numObservers = numObs; bz_debugMessagef(3, "serverControl - %d total players, %d observers", numPlayers, numObservers); bz_deleteIntList(playerList); } void ServerControl::checkBanChanges( void ) { time_t mtime; fileAccessTime(banFilename, &mtime, &banFileErrorLogged); if (mtime != banFileAccessTime) { banFileAccessTime = mtime; bz_debugMessagef(1, "serverControl - ban file changed - reloading..."); bz_reloadLocalBans(); bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, banReloadMessage.c_str()); } } void ServerControl::checkMasterBanChanges( void ) { time_t mtime; fileAccessTime(masterBanFilename, &mtime, &masterBanErrorLogged); if (mtime != masterBanFileAccessTime) { masterBanFileAccessTime = mtime; bz_debugMessagef(1, "serverControl: master ban file changed - reloading..."); bz_reloadMasterBans(); bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, masterBanReloadMessage.c_str()); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/serverControl/serverControl.def000066400000000000000000000001561200563112200233200ustar00rootroot00000000000000LIBRARY serverControl EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersionbzflag-2.4.2+ds1/plugins/serverControl/serverControl.sln000066400000000000000000000036311200563112200233570ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serverControl", "serverControl.vcxproj", "{C2021BB4-EB46-4855-B26F-DBBDB97EE43C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin_utils", "..\plugin_utils\plugin_utils.vcxproj", "{645768BE-97C8-4DE4-9100-111BD2808B35}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|Win32.ActiveCfg = Debug|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|Win32.Build.0 = Debug|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|x64.ActiveCfg = Debug|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Debug|x64.Build.0 = Debug|x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|Win32.ActiveCfg = Release|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|Win32.Build.0 = Release|Win32 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C}.Release|x64.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.ActiveCfg = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|Win32.Build.0 = Debug|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.ActiveCfg = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Debug|x64.Build.0 = Debug|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.ActiveCfg = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|Win32.Build.0 = Release|Win32 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.ActiveCfg = Release|x64 {645768BE-97C8-4DE4-9100-111BD2808B35}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/serverControl/serverControl.vcxproj000066400000000000000000000343661200563112200242670ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {C2021BB4-EB46-4855-B26F-DBBDB97EE43C} serverControl Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;serverControl_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)serverControl.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) serverControl.def true $(OutDir)serverControl.pdb Windows false $(OutDir)serverControl.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;serverControl_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)serverControl.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) serverControl.def true $(OutDir)serverControl.pdb Windows false $(OutDir)serverControl.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;serverControl_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)serverControl.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) serverControl.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)serverControl.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;serverControl_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)serverControl.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) serverControl.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)serverControl.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false {645768be-97c8-4de4-9100-111bd2808b35} false bzflag-2.4.2+ds1/plugins/shockwaveDeath/000077500000000000000000000000001200563112200200605ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/shockwaveDeath/Makefile.am000066400000000000000000000006521200563112200221170ustar00rootroot00000000000000lib_LTLIBRARIES = shockwaveDeath.la shockwaveDeath_la_SOURCES = shockwaveDeath.cpp shockwaveDeath_la_CPPFLAGS = -I$(top_srcdir)/include shockwaveDeath_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ shockwaveDeath.def \ shockwaveDeath.sln \ shockwaveDeath.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/shockwaveDeath/Makefile.in000066400000000000000000000463561200563112200221430ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/shockwaveDeath DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) shockwaveDeath_la_LIBADD = am_shockwaveDeath_la_OBJECTS = shockwaveDeath_la-shockwaveDeath.lo shockwaveDeath_la_OBJECTS = $(am_shockwaveDeath_la_OBJECTS) shockwaveDeath_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(shockwaveDeath_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(shockwaveDeath_la_SOURCES) DIST_SOURCES = $(shockwaveDeath_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = shockwaveDeath.la shockwaveDeath_la_SOURCES = shockwaveDeath.cpp shockwaveDeath_la_CPPFLAGS = -I$(top_srcdir)/include shockwaveDeath_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ shockwaveDeath.def \ shockwaveDeath.sln \ shockwaveDeath.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/shockwaveDeath/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/shockwaveDeath/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done shockwaveDeath.la: $(shockwaveDeath_la_OBJECTS) $(shockwaveDeath_la_DEPENDENCIES) $(shockwaveDeath_la_LINK) -rpath $(libdir) $(shockwaveDeath_la_OBJECTS) $(shockwaveDeath_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shockwaveDeath_la-shockwaveDeath.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< shockwaveDeath_la-shockwaveDeath.lo: shockwaveDeath.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shockwaveDeath_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT shockwaveDeath_la-shockwaveDeath.lo -MD -MP -MF $(DEPDIR)/shockwaveDeath_la-shockwaveDeath.Tpo -c -o shockwaveDeath_la-shockwaveDeath.lo `test -f 'shockwaveDeath.cpp' || echo '$(srcdir)/'`shockwaveDeath.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/shockwaveDeath_la-shockwaveDeath.Tpo $(DEPDIR)/shockwaveDeath_la-shockwaveDeath.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='shockwaveDeath.cpp' object='shockwaveDeath_la-shockwaveDeath.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shockwaveDeath_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o shockwaveDeath_la-shockwaveDeath.lo `test -f 'shockwaveDeath.cpp' || echo '$(srcdir)/'`shockwaveDeath.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/shockwaveDeath/README.txt000066400000000000000000000004321200563112200215550ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : schokwaveDeath Project Overview ======================================================================== This plugin makes a shockwave fire whenever someone dies. It can get messy. bzflag-2.4.2+ds1/plugins/shockwaveDeath/shockwaveDeath.cpp000066400000000000000000000024651200563112200235330ustar00rootroot00000000000000// shockwaveDeath.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" // event handler callback class SWDeathHandler : public bz_Plugin { public: virtual const char* Name (){return "Shockwave Death";} virtual void Init ( const char* config); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(SWDeathHandler) void SWDeathHandler::Init( const char* commandLine ) { bz_debugMessage(4,"shockwaveDeath plugin loaded"); Register(bz_ePlayerDieEvent); std::string param = commandLine; if (param == "usevictim") bz_debugMessage(0,"shockwaveDeath plugin no longer takes any parameters"); } void SWDeathHandler::Event ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerDieEvent) return; bz_PlayerDieEventData_V1 *dieData = (bz_PlayerDieEventData_V1*)eventData; int playerToUse = BZ_SERVER; float reloadTime = (float)bz_getBZDBDouble("_reloadTime"); if (bz_BZDBItemExists("_swDeathReloadFactor") && bz_getBZDBDouble("_swDeathReloadFactor") > 0) reloadTime *= (float)bz_getBZDBDouble("_swDeathReloadFactor"); bz_fireWorldWep("SW",reloadTime,playerToUse,dieData->state.pos,0,0,0,0.0f); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/shockwaveDeath/shockwaveDeath.def000066400000000000000000000001601200563112200234750ustar00rootroot00000000000000LIBRARY shockwaveDeath EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/shockwaveDeath/shockwaveDeath.sln000066400000000000000000000023331200563112200235370ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shockwaveDeath", "shockwaveDeath.vcxproj", "{71A8E9FF-58CE-459C-9BD7-9C5706DB6491}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|Win32.ActiveCfg = Debug|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|Win32.Build.0 = Debug|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|x64.ActiveCfg = Debug|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Debug|x64.Build.0 = Debug|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|Win32.ActiveCfg = Release|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|Win32.Build.0 = Release|Win32 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|x64.ActiveCfg = Release|x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/shockwaveDeath/shockwaveDeath.vcxproj000066400000000000000000000340441200563112200244420ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {71A8E9FF-58CE-459C-9BD7-9C5706DB6491} shockwaveDeath Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;shockwaveDeath_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)shockwaveDeath.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) shockwaveDeath.def true $(OutDir)shockwaveDeath.pdb Windows false $(OutDir)shockwaveDeath.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;shockwaveDeath_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)shockwaveDeath.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) shockwaveDeath.def true $(OutDir)shockwaveDeath.pdb Windows false $(OutDir)shockwaveDeath.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;shockwaveDeath_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)shockwaveDeath.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) shockwaveDeath.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)shockwaveDeath.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;shockwaveDeath_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)shockwaveDeath.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) shockwaveDeath.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)shockwaveDeath.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/teamflagreset/000077500000000000000000000000001200563112200177435ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/teamflagreset/Makefile.am000066400000000000000000000006601200563112200220010ustar00rootroot00000000000000lib_LTLIBRARIES = teamflagreset.la teamflagreset_la_SOURCES = teamflagreset.cpp teamflagreset_la_CPPFLAGS = -I$(top_srcdir)/include teamflagreset_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ teamflagreset.def \ teamflagreset.sln \ teamflagreset.vcxproj \ tfr_admin.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/teamflagreset/Makefile.in000066400000000000000000000463111200563112200220150ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/teamflagreset DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) teamflagreset_la_LIBADD = am_teamflagreset_la_OBJECTS = teamflagreset_la-teamflagreset.lo teamflagreset_la_OBJECTS = $(am_teamflagreset_la_OBJECTS) teamflagreset_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(teamflagreset_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(teamflagreset_la_SOURCES) DIST_SOURCES = $(teamflagreset_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = teamflagreset.la teamflagreset_la_SOURCES = teamflagreset.cpp teamflagreset_la_CPPFLAGS = -I$(top_srcdir)/include teamflagreset_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ teamflagreset.def \ teamflagreset.sln \ teamflagreset.vcxproj \ tfr_admin.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/teamflagreset/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/teamflagreset/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done teamflagreset.la: $(teamflagreset_la_OBJECTS) $(teamflagreset_la_DEPENDENCIES) $(teamflagreset_la_LINK) -rpath $(libdir) $(teamflagreset_la_OBJECTS) $(teamflagreset_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teamflagreset_la-teamflagreset.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< teamflagreset_la-teamflagreset.lo: teamflagreset.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(teamflagreset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT teamflagreset_la-teamflagreset.lo -MD -MP -MF $(DEPDIR)/teamflagreset_la-teamflagreset.Tpo -c -o teamflagreset_la-teamflagreset.lo `test -f 'teamflagreset.cpp' || echo '$(srcdir)/'`teamflagreset.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/teamflagreset_la-teamflagreset.Tpo $(DEPDIR)/teamflagreset_la-teamflagreset.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='teamflagreset.cpp' object='teamflagreset_la-teamflagreset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(teamflagreset_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o teamflagreset_la-teamflagreset.lo `test -f 'teamflagreset.cpp' || echo '$(srcdir)/'`teamflagreset.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/teamflagreset/README.txt000066400000000000000000000026241200563112200214450ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : teamflagreset Project Overview ======================================================================== This is the teamflagreset plugin. It will look at the team flags and see if they have been held by a player and dropped - if so, it will start timing to a limit. If the flag is not picked up again within that time limit the team flag will reset with a message saying which team flag sat idle too long. It will also automatically disable itself for teams with no players and for only 1 team in the match (no opposing teams). There are 5 administrator commands available with the plugin: "tfrtime " this will set timer interval for checking idle flags to minutes (1-120). "tfroff" this will disable the timer. "tfron" this will enable the timer. "tfrstatus" this will return the status of the timer (enabled or disabled and time interval). The plugin will also allow the time limit to be passed to it through the -loadplugin command line with bzfs. The format is as follows: "-loadplugin teamflagreset,m" where m is the timer value (in minutes) for timed ctf. For example, "-loadplugin plugins/teamflagreset,2" would start the plugin with the timer set for 2 minutes. Again, the minimum is 1 minute and the maximum is 120 minutes. If no time is specified, the plugin defaults to 5 minutes. bzflag-2.4.2+ds1/plugins/teamflagreset/teamflagreset.cpp000066400000000000000000000201731200563112200232750ustar00rootroot00000000000000// teamflagreset.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" // event handler callback class TFR { public: TFR() { idleTime = 300; redLastTouched = bz_getCurrentTime(); greenLastTouched = bz_getCurrentTime(); blueLastTouched = bz_getCurrentTime(); purpleLastTouched = bz_getCurrentTime(); redFlagWasHeld = false; greenFlagWasHeld = false; blueFlagWasHeld = false; purpleFlagWasHeld = false; OKToReset = false; timerOff = false; flagTouched =""; } double idleTime; double redLastTouched; double greenLastTouched; double blueLastTouched; double purpleLastTouched; bool redFlagWasHeld; bool greenFlagWasHeld; bool blueFlagWasHeld; bool purpleFlagWasHeld; bool OKToReset; bool timerOff; const char* flagTouched; }; TFR tfr; class TeamFlagResetHandler : public bz_Plugin { public: virtual const char* Name (){return "Team Flag Reset";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); }; class TeamFlagResetIOHandler : public bz_CustomSlashCommandHandler { public: virtual ~TeamFlagResetIOHandler(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *param ); }; BZ_PLUGIN(TeamFlagResetHandler) TeamFlagResetIOHandler teamflagresetiohandler; double ConvertToInteger(std::string msg){ int msglength = (int)msg.length(); if (msglength > 0 && msglength < 4){ double msgvalue = 0; double tens = 1; for ( int i = (msglength - 1); i >= 0; i-- ){ if (msg[i] < '0' || msg[i] > '9') // got something other than a number return 0; tens *= 10; msgvalue += (((double)msg[i] - '0') / 10) * tens; } // we're ok so far, check limits: if (msgvalue >= 1 && msgvalue <= 120) return msgvalue; } return 0; } void TeamFlagResetHandler::Init ( const char* commandLineParameter ) { std::string param = commandLineParameter; double timelimitparam = ConvertToInteger(param); if (timelimitparam > 0) tfr.idleTime = timelimitparam * 60; Register(bz_eTickEvent); bz_registerCustomSlashCommand("tfrtime",&teamflagresetiohandler); bz_registerCustomSlashCommand("tfroff",&teamflagresetiohandler); bz_registerCustomSlashCommand("tfron",&teamflagresetiohandler); bz_registerCustomSlashCommand("tfrstatus",&teamflagresetiohandler); } void TeamFlagResetHandler::Cleanup ( void ) { Flush(); bz_removeCustomSlashCommand("tfrtime"); bz_removeCustomSlashCommand("tfroff"); bz_removeCustomSlashCommand("tfron"); bz_removeCustomSlashCommand("tfrstatus"); } void ResetFlagData(){ tfr.redLastTouched = bz_getCurrentTime(); tfr.greenLastTouched = bz_getCurrentTime(); tfr.blueLastTouched = bz_getCurrentTime(); tfr.purpleLastTouched = bz_getCurrentTime(); tfr.redFlagWasHeld = false; tfr.greenFlagWasHeld = false; tfr.blueFlagWasHeld = false; tfr.purpleFlagWasHeld = false; } void resetTeamFlag (bz_ApiString flagSent) { for ( unsigned int i = 0; i < bz_getNumFlags(); i++ ) { if (flagSent == bz_getName(i)) bz_resetFlag (i); } } void TeamFlagResetHandler::Event ( bz_EventData *eventData ) { if (eventData->eventType != bz_eTickEvent) return; if (tfr.timerOff == true) return; bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); // check to see if anyone has picked up a team flag & count players per team for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { tfr.flagTouched = bz_getPlayerFlag(player->playerID); if (tfr.flagTouched){ if (strcmp(tfr.flagTouched, "R*") == 0){ tfr.redLastTouched = bz_getCurrentTime(); tfr.redFlagWasHeld = true; } if (strcmp(tfr.flagTouched, "G*") == 0){ tfr.greenLastTouched = bz_getCurrentTime(); tfr.greenFlagWasHeld = true; } if (strcmp(tfr.flagTouched, "B*") == 0){ tfr.blueLastTouched = bz_getCurrentTime(); tfr.blueFlagWasHeld = true; } if (strcmp(tfr.flagTouched, "P*") == 0){ tfr.purpleLastTouched = bz_getCurrentTime(); tfr.purpleFlagWasHeld = true; } } bz_freePlayerRecord(player); } } bz_deleteIntList(playerList); // if no teamplay, no need to reset flags tfr.OKToReset = false; if (bz_getTeamCount(eRedTeam) * bz_getTeamCount(eGreenTeam) > 0) tfr.OKToReset = true; if (bz_getTeamCount(eRedTeam) * bz_getTeamCount(eBlueTeam) > 0) tfr.OKToReset = true; if (bz_getTeamCount(eRedTeam) * bz_getTeamCount(ePurpleTeam) > 0) tfr.OKToReset = true; if (bz_getTeamCount(eGreenTeam) * bz_getTeamCount(eBlueTeam) > 0) tfr.OKToReset = true; if (bz_getTeamCount(eGreenTeam) * bz_getTeamCount(ePurpleTeam) > 0) tfr.OKToReset = true; if (bz_getTeamCount(eBlueTeam) * bz_getTeamCount(ePurpleTeam) > 0) tfr.OKToReset = true; if (tfr.OKToReset == false){ ResetFlagData(); return; } // check if time's up on flags and reset (if they were held at least once after last reset) if (bz_getCurrentTime() - tfr.redLastTouched > tfr.idleTime && tfr.redFlagWasHeld){ if (bz_getTeamCount(eRedTeam) > 0){ resetTeamFlag ("R*"); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Red flag sat idle too long - reset by server."); } tfr.redFlagWasHeld = false; tfr.redLastTouched = bz_getCurrentTime(); } if (bz_getCurrentTime() - tfr.greenLastTouched > tfr.idleTime && tfr.greenFlagWasHeld){ if (bz_getTeamCount(eGreenTeam) > 0){ resetTeamFlag ("G*"); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Green flag sat idle too long - reset by server."); } tfr.greenLastTouched = bz_getCurrentTime(); tfr.greenFlagWasHeld = false; } if (bz_getCurrentTime() - tfr.blueLastTouched > tfr.idleTime && tfr.blueFlagWasHeld){ if (bz_getTeamCount(eBlueTeam) > 0){ resetTeamFlag ("B*"); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Blue flag sat idle too long - reset by server."); } tfr.blueLastTouched = bz_getCurrentTime(); tfr.blueFlagWasHeld = false; } if (bz_getCurrentTime() - tfr.purpleLastTouched > tfr.idleTime && tfr.purpleFlagWasHeld){ if (bz_getTeamCount(ePurpleTeam) > 0){ resetTeamFlag ("P*"); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Purple flag sat idle too long - reset by server."); } tfr.purpleLastTouched = bz_getCurrentTime(); tfr.purpleFlagWasHeld = false; } return; } bool TeamFlagResetIOHandler::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (fromPlayer) { if (!fromPlayer->admin) { bz_sendTextMessage(BZ_SERVER,playerID,"You must be admin to use the teamflagreset commands."); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); } if ( command == "tfrtime") { double invalue = ConvertToInteger(message); if (invalue > 0){ tfr.timerOff = false; tfr.idleTime = invalue * 60; int AdjTime = (int)(tfr.idleTime / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Team flag idle time has been set to %i minutes.", AdjTime); ResetFlagData(); return true; } else{ bz_sendTextMessagef (BZ_SERVER, playerID, "Team flag idle time invalid: must be between 1 and 120 minutes."); return true; } return true; } if ( command == "tfroff") { tfr.timerOff = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Team flag reset is disabled."); return true; } if ( command == "tfron") { tfr.timerOff = false; ResetFlagData(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Team flag reset is enabled."); return true; } if ( command == "tfrstatus") { if (tfr.timerOff) bz_sendTextMessagef (BZ_SERVER, playerID, "Team flag reset is disabled."); else bz_sendTextMessagef (BZ_SERVER, playerID, "Team flag reset is enabled."); int AdjTime = (int)(tfr.idleTime / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, playerID, "Team flag idle time is: %i minutes.", AdjTime); return true; } return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/teamflagreset/teamflagreset.def000066400000000000000000000001571200563112200232510ustar00rootroot00000000000000LIBRARY teamflagreset EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/teamflagreset/teamflagreset.sln000066400000000000000000000023311200563112200233030ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "teamflagreset", "teamflagreset.vcxproj", "{A7AF7B05-55FA-4995-A50A-1C120AC61FF6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|Win32.ActiveCfg = Debug|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|Win32.Build.0 = Debug|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|x64.ActiveCfg = Debug|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Debug|x64.Build.0 = Debug|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|Win32.ActiveCfg = Release|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|Win32.Build.0 = Release|Win32 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|x64.ActiveCfg = Release|x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/teamflagreset/teamflagreset.vcxproj000066400000000000000000000340301200563112200242030ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {A7AF7B05-55FA-4995-A50A-1C120AC61FF6} teamflagreset Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;teamflagreset_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)teamflagreset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) teamflagreset.def true $(OutDir)teamflagreset.pdb Windows false $(OutDir)teamflagreset.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;teamflagreset_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)teamflagreset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) teamflagreset.def true $(OutDir)teamflagreset.pdb Windows false $(OutDir)teamflagreset.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;teamflagreset_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)teamflagreset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) teamflagreset.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)teamflagreset.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;teamflagreset_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)teamflagreset.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) teamflagreset.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)teamflagreset.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/teamflagreset/tfr_admin.txt000066400000000000000000000005751200563112200224560ustar00rootroot00000000000000------------------------------------------------------ Team Flag Reset Admin Commands Available: ------------------------------------------------------ "tfron" - enable Team Flag Reset. "tfroff" - disable Team Flag Reset. "tfrtime " - change reset time 1-120 minutes. "tfrstatus" - indicate the status of the plugin. ------------------------------------------------------ bzflag-2.4.2+ds1/plugins/thiefControl/000077500000000000000000000000001200563112200175605ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/thiefControl/Makefile.am000066400000000000000000000006271200563112200216210ustar00rootroot00000000000000lib_LTLIBRARIES = thiefControl.la thiefControl_la_SOURCES = thiefControl.cpp thiefControl_la_CPPFLAGS = -I$(top_srcdir)/include thiefControl_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ thiefControl.def \ thiefControl.sln \ thiefControl.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/thiefControl/Makefile.in000066400000000000000000000462031200563112200216320ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/thiefControl DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) thiefControl_la_LIBADD = am_thiefControl_la_OBJECTS = thiefControl_la-thiefControl.lo thiefControl_la_OBJECTS = $(am_thiefControl_la_OBJECTS) thiefControl_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(thiefControl_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(thiefControl_la_SOURCES) DIST_SOURCES = $(thiefControl_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = thiefControl.la thiefControl_la_SOURCES = thiefControl.cpp thiefControl_la_CPPFLAGS = -I$(top_srcdir)/include thiefControl_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ thiefControl.def \ thiefControl.sln \ thiefControl.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/thiefControl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/thiefControl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done thiefControl.la: $(thiefControl_la_OBJECTS) $(thiefControl_la_DEPENDENCIES) $(thiefControl_la_LINK) -rpath $(libdir) $(thiefControl_la_OBJECTS) $(thiefControl_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thiefControl_la-thiefControl.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< thiefControl_la-thiefControl.lo: thiefControl.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(thiefControl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT thiefControl_la-thiefControl.lo -MD -MP -MF $(DEPDIR)/thiefControl_la-thiefControl.Tpo -c -o thiefControl_la-thiefControl.lo `test -f 'thiefControl.cpp' || echo '$(srcdir)/'`thiefControl.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/thiefControl_la-thiefControl.Tpo $(DEPDIR)/thiefControl_la-thiefControl.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='thiefControl.cpp' object='thiefControl_la-thiefControl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(thiefControl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o thiefControl_la-thiefControl.lo `test -f 'thiefControl.cpp' || echo '$(srcdir)/'`thiefControl.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/thiefControl/README.txt000066400000000000000000000007661200563112200212670ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : thiefControl Project Overview ======================================================================== This is the thiefControl plugin, which causes players to drop their Thief flag if they attempt to steal a flag from a teammate. Exceptions: * rogue players may steal flags from each other as usual * non-rogue players may steal team flags from teammates for quick movement across the battlefield bzflag-2.4.2+ds1/plugins/thiefControl/thiefControl.cpp000066400000000000000000000053641200563112200227340ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // thiefControl.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" class ThiefControl : public bz_Plugin { public: virtual const char* Name() { return "Thief Control"; } virtual void Init(const char* config); virtual void Event(bz_EventData *eventData); }; BZ_PLUGIN(ThiefControl) void ThiefControl::Init(const char* /*config*/ ) { bz_debugMessage(4, "thiefControl plugin loaded"); Register(bz_eFlagTransferredEvent); } void ThiefControl::Event (bz_EventData * eventData) { bz_FlagTransferredEventData_V1 *data = (bz_FlagTransferredEventData_V1 *) eventData; const std::string noStealMsg = "Flag dropped. Don't steal from teammates!"; if (!data) return; if (data->eventType != bz_eFlagTransferredEvent) return; bz_BasePlayerRecord *playerFrom = bz_getPlayerByIndex(data->fromPlayerID); if (!playerFrom) return; bz_BasePlayerRecord *playerTo = bz_getPlayerByIndex(data->toPlayerID); if (!playerTo) { bz_freePlayerRecord(playerFrom); return; } switch (bz_getGameType()) { case eFFAGame: if (playerTo->team == playerFrom->team && playerTo->team != eRogueTeam) { data->action = data->DropThief; bz_sendTextMessage(BZ_SERVER, data->toPlayerID, noStealMsg.c_str()); } break; case eCTFGame: { // Allow teammates to steal team flags // This will allow someone to steal a team flag in order // to possibly capture it faster. bool allowTransfer = false; if (playerTo->team == playerFrom->team && playerTo->team != eRogueTeam) { bz_ApiString flagT = bz_ApiString(data->flagType); // Allow theft of team flags only allowTransfer = (flagT == "R*" || flagT == "G*" || flagT == "B*" || flagT == "P*"); if (!allowTransfer) { data->action = data->DropThief; bz_sendTextMessage(BZ_SERVER, data->toPlayerID, noStealMsg.c_str()); } } } break; case eRabbitGame: if (playerTo->team == playerFrom->team) { data->action = data->DropThief; bz_sendTextMessage(BZ_SERVER, data->toPlayerID, noStealMsg.c_str()); } break; default: break; } bz_freePlayerRecord(playerTo); bz_freePlayerRecord(playerFrom); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/thiefControl/thiefControl.def000066400000000000000000000002471200563112200227030ustar00rootroot00000000000000LIBRARY thiefControl DESCRIPTION 'thiefControl Windows Dynamic Link Library' EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/thiefControl/thiefControl.sln000066400000000000000000000015421200563112200227400ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "thiefControl", "thiefControl.vcxproj", "{1F43075E-8AF6-486F-AEDF-6B350A6CE141}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.ActiveCfg = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Debug|Win32.Build.0 = Debug|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.ActiveCfg = Release|Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/thiefControl/thiefControl.vcxproj000066400000000000000000000141751200563112200236450ustar00rootroot00000000000000 Debug Win32 Release Win32 {1F43075E-8AF6-486F-AEDF-6B350A6CE141} Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 Debug\ Debug\ true ../\ Release\ false Disabled ../../include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;thiefControl_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)thiefControl.dll ../../src/bzfs/debug/;%(AdditionalLibraryDirectories) thiefControl.def true $(OutDir)thiefControl.pdb Windows $(OutDir)thiefControl.lib MachineX86 copy debug\*.dll ..\ ../../include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;thiefControl_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)thiefControl.dll ../../src/bzfs/;%(AdditionalLibraryDirectories) thiefControl.def true Release/$(ProjectName).pdb Windows true true $(OutDir)thiefControl.lib MachineX86 Document true true bzflag-2.4.2+ds1/plugins/timedctf/000077500000000000000000000000001200563112200167175ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/timedctf/Makefile.am000066400000000000000000000006441200563112200207570ustar00rootroot00000000000000lib_LTLIBRARIES = timedctf.la timedctf_la_SOURCES = timedctf.cpp timedctf_la_CPPFLAGS = -I$(top_srcdir)/include timedctf_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ timedctf.def \ timedctf.sln \ timedctf.vcxproj \ timedctf_admin.txt \ timedctf_rules.txt MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/timedctf/Makefile.in000066400000000000000000000457341200563112200210010ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/timedctf DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) timedctf_la_LIBADD = am_timedctf_la_OBJECTS = timedctf_la-timedctf.lo timedctf_la_OBJECTS = $(am_timedctf_la_OBJECTS) timedctf_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(timedctf_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(timedctf_la_SOURCES) DIST_SOURCES = $(timedctf_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = timedctf.la timedctf_la_SOURCES = timedctf.cpp timedctf_la_CPPFLAGS = -I$(top_srcdir)/include timedctf_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ timedctf.def \ timedctf.sln \ timedctf.vcxproj \ timedctf_admin.txt \ timedctf_rules.txt MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/timedctf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/timedctf/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done timedctf.la: $(timedctf_la_OBJECTS) $(timedctf_la_DEPENDENCIES) $(timedctf_la_LINK) -rpath $(libdir) $(timedctf_la_OBJECTS) $(timedctf_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timedctf_la-timedctf.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< timedctf_la-timedctf.lo: timedctf.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(timedctf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT timedctf_la-timedctf.lo -MD -MP -MF $(DEPDIR)/timedctf_la-timedctf.Tpo -c -o timedctf_la-timedctf.lo `test -f 'timedctf.cpp' || echo '$(srcdir)/'`timedctf.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/timedctf_la-timedctf.Tpo $(DEPDIR)/timedctf_la-timedctf.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='timedctf.cpp' object='timedctf_la-timedctf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(timedctf_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o timedctf_la-timedctf.lo `test -f 'timedctf.cpp' || echo '$(srcdir)/'`timedctf.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/timedctf/README.txt000066400000000000000000000073031200563112200204200ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : timedctf Project Overview ======================================================================== timedctf plugin Author: LouMan Description: It will start a timed capture the flag game in which a team must capture another team's flag in a configurable amount of time. If the time expires before the team captures a flag, all members of the team will be destroyed and the timer will restart for that team. If the team captures another team's flag before their time expires, their timer is reset and starts counting down again. All 4 teams have individual timers. There are warning messages sent to individual teams as their time starts to expire: A warning every minute (with time remaining) until the last minute. A warning at 30 seconds before time expires. A warning at 20 seconds before time expires. A warning at 10 seconds before time expires. (boom) The plugin also monitors the balance of teams and will disable the timer if teams are uneven. To determine if teams are balanced or not, at least a 75% match is used. This means that even teams would be considered: 1 vs 1 (100%) 2 vs 2 (100%) 3 vs 3 (100%) 3 vs 4 (75%) 4 vs 4 (100%) 4 vs 5 (80%) 5 vs 5 (100%) 5 vs 6 (83%) and so on. If the teams are uneven, capture the flag is disabled; if a player tries to pick up a team flag, it will almost immediately be dropped. The plugin is set up for all 4 teams (red, green, blue and purple) and will monitor/time all 4 teams. However, it is best suited to 2 team capture the flag type maps in that it only looks for the 75% match between any 2 team sizes. This means that it is possible (on a 4 team ctf map) to have teams considered to be even if: 1 vs 1 vs 3 vs 1 2 vs 2 vs 8 vs 1 and so on. There are also informative messages when the status of the game changes, for example: If a new player joins/parts that causes team imbalance, a message is sent stating that teams are uneven and timed ctf is disabled. If a new player joins/parts that balances teams out, a message is sent that timed ctf is enabled and how much time there is to capture a flag. And so on... There are also standard CTF sounds used whenever significant events take place. The plugin has the following commands available to administrators: "tctftime " : this will change required capture time to (1-120 minutes). "tctfoff" : this will disable timed CTF. "tctfon" : this will enable timed CTF. "tctfsoundoff" : this will disable timed CTF sounds. "tctfsoundon" : this will enable timed CTF sounds. "tctfstatus" : this will return the current status of functions and the current time limit. "fairctfoff" : this will disable the fair ctf function. "fairctfon" : this will enable the fair ctf function. Note that the balance of teams will still be monitored when the ctf timer is off, and team flags will be dropped if teams are uneven (as described above). This allows this plugin to be utilized for fair, normal ctf play as well, if the ctf timer is turned off. If both functions (tctf and fairctf) are turned off, the plugin is effectively disabled. If the fair CTF function is disabled and the timed CTF function is enabled, the plugin will check for at least 2 teams present before allowing timed CTF to take place. It will also allow the time limit to be passed to the plugin through the -loadplugin command line with bzfs. The format is as follows: "-loadplugin timedctf,i" where i is the timer value (in minutes) for timed ctf. For example, "-loadplugin plugins/timedctf,7" would start the plugin with the timer set for 7 minutes. Again, the minimum is 1 minute and the maximum is 120 minutes. If no time is specified, the plugin defaults to 5 minutes. bzflag-2.4.2+ds1/plugins/timedctf/timedctf.cpp000066400000000000000000000507671200563112200212410ustar00rootroot00000000000000// timedctf.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" // event handler callback class TCTF { public: TCTF() { timeLimit = 300; timeElapsed = 0; timeRemaining = 0; redLastTime = bz_getCurrentTime (); greenLastTime = bz_getCurrentTime (); blueLastTime = bz_getCurrentTime (); purpleLastTime = bz_getCurrentTime (); redLastWarn = bz_getCurrentTime (); greenLastWarn = bz_getCurrentTime (); blueLastWarn = bz_getCurrentTime (); purpleLastWarn = bz_getCurrentTime (); adjTime = 0; timerRunning = false; enabled = true; fairCTFEnabled = true; notifiedCTFOK = false; fairCTF = false; soundEnabled = true; } double timeLimit; double timeElapsed; double timeRemaining; double redLastTime; double greenLastTime; double blueLastTime; double purpleLastTime; double redLastWarn; double greenLastWarn; double blueLastWarn; double purpleLastWarn; int adjTime; bool timerRunning; bool enabled; bool fairCTFEnabled; bool notifiedCTFOK; bool fairCTF; bool soundEnabled; }; TCTF tctf; class TCTFCommands : public bz_CustomSlashCommandHandler { public: virtual ~TCTFCommands(){}; virtual bool SlashCommand ( int playerID, bz_ApiString command, bz_ApiString message, bz_APIStringList *param ); }; class TCTFHandler : public bz_Plugin { public: virtual const char* Name (){return "Timed CTF";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); }; BZ_PLUGIN(TCTFHandler) TCTFCommands tctfcommands; double ConvertToInt(std::string inmessage){ int messagelength = (int)inmessage.length(); if (messagelength > 0 && messagelength < 4){ double messagevalue = 0; double tens = 1; for ( int i = (messagelength - 1); i >= 0; i-- ){ if (inmessage[i] < '0' || inmessage[i] > '9') // got something other than a number return 0; tens *= 10; messagevalue += (((double)inmessage[i] - '0') / 10) * tens; } // we're ok so far, check limits: if (messagevalue >= 1 && messagevalue <= 120) return messagevalue; } return 0; } void TCTFHandler::Init( const char* commandLine ) { std::string parameter = commandLine; double timelimitparameter = ConvertToInt(parameter); if (timelimitparameter > 0) tctf.timeLimit = timelimitparameter * 60; Register(bz_eCaptureEvent); Register(bz_ePlayerJoinEvent); Register(bz_ePlayerUpdateEvent); Register(bz_eTickEvent); bz_registerCustomSlashCommand("tctfstatus",&tctfcommands); bz_registerCustomSlashCommand("tctftime",&tctfcommands); bz_registerCustomSlashCommand("tctfon",&tctfcommands); bz_registerCustomSlashCommand("tctfoff",&tctfcommands); bz_registerCustomSlashCommand("fairctfon",&tctfcommands); bz_registerCustomSlashCommand("fairctfoff",&tctfcommands); bz_registerCustomSlashCommand("tctfsoundon",&tctfcommands); bz_registerCustomSlashCommand("tctfsoundoff",&tctfcommands); } void TCTFHandler::Cleanup ( void ) { Flush(); bz_removeCustomSlashCommand("tctfstatus"); bz_removeCustomSlashCommand("tctftime"); bz_removeCustomSlashCommand("tctfon"); bz_removeCustomSlashCommand("tctfoff"); bz_removeCustomSlashCommand("fairctfon"); bz_removeCustomSlashCommand("fairctfoff"); bz_removeCustomSlashCommand("tctfsoundon"); bz_removeCustomSlashCommand("tctfsoundoff"); } void ResetTeamData(){ tctf.redLastTime = bz_getCurrentTime (); tctf.greenLastTime = bz_getCurrentTime (); tctf.blueLastTime = bz_getCurrentTime (); tctf.purpleLastTime = bz_getCurrentTime (); tctf.redLastWarn = bz_getCurrentTime (); tctf.greenLastWarn = bz_getCurrentTime (); tctf.blueLastWarn = bz_getCurrentTime (); tctf.purpleLastWarn = bz_getCurrentTime (); return; } // are we ok to run this thing fairly?: bool TeamsBalanced(){ // if not enough team players - no need to check any further: if (bz_getTeamCount(eRedTeam) + bz_getTeamCount(eGreenTeam) + bz_getTeamCount(eBlueTeam) + bz_getTeamCount(ePurpleTeam) <= 1) return false; // check for fair ctf - only need 2 teams close (TeamRatioTolerance or better) // this is crude - can be done better I'm sure: float TeamRatioTolerance = 0.75; // if not same size, at least 3 versus 4 or better float RatioRG = 0; float RatioRB = 0; float RatioRP = 0; float RatioGB = 0; float RatioBP = 0; float RatioGP = 0; float RS = (float)bz_getTeamCount(eRedTeam); // "GS" is a macro defined in /usr/include/sys/regset.h on Solaris x86 float _GS = (float)bz_getTeamCount(eGreenTeam); float BS = (float)bz_getTeamCount(eBlueTeam); float PS = (float)bz_getTeamCount(ePurpleTeam); if (RS >= _GS && RS !=0) RatioRG = (_GS / RS); if (_GS > RS && _GS !=0) RatioRG = (RS / _GS); if (RS >= BS && RS !=0) RatioRB = (BS / RS); if (BS > RS && BS !=0) RatioRB = (RS / BS); if (RS >= PS && RS !=0) RatioRP = (PS / RS); if (PS > RS && PS !=0) RatioRP = (RS / PS); if (_GS >= BS && _GS !=0) RatioGB = (BS / _GS); if (BS > _GS && BS !=0) RatioGB = (_GS / BS); if (PS >= _GS && PS !=0) RatioGP = (_GS / PS); if (_GS > PS && _GS !=0) RatioGP = (PS / _GS); if (BS >= PS && BS !=0) RatioBP = (PS / BS); if (PS > BS && PS !=0) RatioBP = (BS / PS); if (RatioRG >= TeamRatioTolerance || RatioRB >= TeamRatioTolerance || RatioRP >= TeamRatioTolerance || RatioGB >= TeamRatioTolerance || RatioGP >= TeamRatioTolerance || RatioBP >= TeamRatioTolerance){ return true; } else { return false; } } void KillTeam(bz_eTeamType TeamToKill){ bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ){ bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player){ if (player->team == TeamToKill) { bz_killPlayer(player->playerID, true, BZ_SERVER); if (tctf.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_lost"); } else if (tctf.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID,"flag_won"); bz_freePlayerRecord(player); } } bz_deleteIntList(playerList); return; } // team warn and kill function int TeamCheck(bz_eTeamType Team, const char* Color, double LastWarn, double LastTime){ if (bz_getTeamCount(Team) != 0 && tctf.timerRunning){ tctf.timeElapsed = bz_getCurrentTime() - LastTime; tctf.timeRemaining = tctf.timeLimit - tctf.timeElapsed; if (bz_getCurrentTime() - LastWarn > 60){ tctf.adjTime = (int)(tctf.timeRemaining / 60); bz_sendTextMessagef (BZ_SERVER, Team, "%s Team: less than %i minute(s) left to capture a flag!", Color, tctf.adjTime + 1); return 1; // 1 = reset team's LastWarn } if (bz_getCurrentTime() - LastWarn > 30 && tctf.timeRemaining < 30){ bz_sendTextMessagef (BZ_SERVER, Team, "%s Team: less than 30 seconds left to capture a flag!", Color); return 1; // 1 = reset team's LastWarn } if (bz_getCurrentTime() - LastWarn > 10 && tctf.timeRemaining < 20 && tctf.timeRemaining > 10){ bz_sendTextMessagef (BZ_SERVER, Team, "%s Team: less than 20 seconds left to capture a flag!", Color); return 1; // 1 = reset team's LastWarn } if (bz_getCurrentTime() - LastWarn > 10 && tctf.timeRemaining < 10 && tctf.timeRemaining > 1){ bz_sendTextMessagef (BZ_SERVER, Team, "%s Team: less than 10 seconds left to capture a flag!", Color); return 1; // 1 = reset team's LastWarn } if (tctf.timeElapsed >= tctf.timeLimit){ KillTeam(Team); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "%s team did not capture any other team flags in time.", Color); tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, Team, "CTF timer is reset to %i minutes for the %s team.", tctf.adjTime, Color); return 2; // 2 = reset team's LastWarn and LastTime } } return 0; // 0 = no need to reset teams LastWarn or LastTime } // reset time values if zero size team function void ResetZeroTeams(){ if (bz_getTeamCount(eRedTeam) == 0){ tctf.redLastTime = bz_getCurrentTime (); tctf.redLastWarn = bz_getCurrentTime (); } if (bz_getTeamCount(eGreenTeam) == 0){ tctf.greenLastTime = bz_getCurrentTime (); tctf.greenLastWarn = bz_getCurrentTime (); } if (bz_getTeamCount(eBlueTeam) == 0){ tctf.blueLastTime = bz_getCurrentTime (); tctf.blueLastWarn = bz_getCurrentTime (); } if (bz_getTeamCount(ePurpleTeam) == 0){ tctf.purpleLastTime = bz_getCurrentTime (); tctf.purpleLastWarn = bz_getCurrentTime (); } return; } bool OnlyOneTeamPlaying(){ int R = bz_getTeamCount(eRedTeam); int G = bz_getTeamCount(eGreenTeam); int B = bz_getTeamCount(eBlueTeam); int P = bz_getTeamCount(ePurpleTeam); if ( R == 0 && G == 0 && B == 0 && P > 0) return true; if ( R == 0 && G == 0 && P == 0 && B > 0) return true; if ( R == 0 && B == 0 && P == 0 && G > 0) return true; if ( G == 0 && B == 0 && P == 0 && R > 0) return true; return false; } void TCTFPlayerJoined ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerJoinEvent) return; bz_PlayerJoinPartEventData_V1 *JoinData = (bz_PlayerJoinPartEventData_V1*)eventData; // if teams are not even, notify joiner no CTF. // this should never be true if fair ctf is disabled (see definition of tctf.fairCTF): if (!tctf.fairCTF){ bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Capture The Flag disabled - teams are not evenly balanced."); return; } // if timed CTF turned off, but teams now even, let everyone know it's ok to cap. // if fair CTF is disabled, no need to notify: if (tctf.fairCTF && !tctf.enabled && tctf.fairCTFEnabled){ bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Capture The Flag enabled - teams are evenly balanced."); return; } // if timed CTF turned off, get outta here: if (!tctf.enabled) return; // if teams even, notify joiner how much time is left to CTF for their team: if (JoinData->record->team == eRedTeam && tctf.timerRunning){ tctf.timeElapsed = bz_getCurrentTime () - tctf.redLastTime; tctf.timeRemaining = tctf.timeLimit - tctf.timeElapsed; tctf.adjTime = (int)(tctf.timeRemaining / 60); bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Timed CTF now in progress - capture a flag in less than %i minute(s)!", tctf.adjTime + 1); return; } if (JoinData->record->team == eGreenTeam && tctf.timerRunning){ tctf.timeElapsed = bz_getCurrentTime () - tctf.greenLastTime; tctf.timeRemaining = tctf.timeLimit - tctf.timeElapsed; tctf.adjTime = (int)(tctf.timeRemaining / 60); bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Timed CTF now in progress - capture a flag in less than %i minute(s)!", tctf.adjTime + 1); return; } if (JoinData->record->team == eBlueTeam && tctf.timerRunning){ tctf.timeElapsed = bz_getCurrentTime () - tctf.blueLastTime; tctf.timeRemaining = tctf.timeLimit - tctf.timeElapsed; tctf.adjTime = (int)(tctf.timeRemaining / 60); bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Timed CTF now in progress - capture a flag in less than %i minute(s)!", tctf.adjTime + 1); return; } if (JoinData->record->team == ePurpleTeam && tctf.timerRunning){ tctf.timeElapsed = bz_getCurrentTime () - tctf.purpleLastTime; tctf.timeRemaining = tctf.timeLimit - tctf.timeElapsed; tctf.adjTime = (int)(tctf.timeRemaining / 60); bz_sendTextMessagef (BZ_SERVER, JoinData->playerID, "Timed CTF now in progress - capture a flag in less than %i minute(s)!", tctf.adjTime + 1); return; } return; } void TCTFFlagCapped ( bz_EventData *eventData ) { if (eventData->eventType != bz_eCaptureEvent) return; // if timed CTF turned off, get outta here: if (!tctf.enabled || !tctf.timerRunning) return; bz_CTFCaptureEventData_V1 *CapData = (bz_CTFCaptureEventData_V1*)eventData; // if team caps, reset their timer and notify their team if (CapData->teamCapping == eRedTeam){ tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, eRedTeam, "CTF timer is reset to %i minutes for the red team.", tctf.adjTime); tctf.redLastTime = bz_getCurrentTime (); tctf.redLastWarn = bz_getCurrentTime (); return; } if (CapData->teamCapping == eGreenTeam){ tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, eGreenTeam, "CTF timer is reset to %i minutes for the green team.", tctf.adjTime); tctf.greenLastTime = bz_getCurrentTime (); tctf.greenLastWarn = bz_getCurrentTime (); return; } if (CapData->teamCapping == eBlueTeam){ tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, eBlueTeam, "CTF timer is reset to %i minutes for the blue team.", tctf.adjTime); tctf.blueLastTime = bz_getCurrentTime (); tctf.blueLastWarn = bz_getCurrentTime (); return; } if (CapData->teamCapping == ePurpleTeam){ tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, ePurpleTeam, "CTF timer is reset to %i minutes for the purple team.", tctf.adjTime); tctf.purpleLastTime = bz_getCurrentTime (); tctf.purpleLastWarn = bz_getCurrentTime (); return; } return; } // this is where most of the decisions are made - a little clunky, but seems to work: void TCTFTickEvents ( bz_EventData *eventData ) { if (eventData->eventType != bz_eTickEvent) return; // read this function once per tick event. If fair CTF disabled, make it look fair to rest // of code - need to do this to be able to have timed ctf without fair ctf. tctf.fairCTF = (TeamsBalanced() || !tctf.fairCTFEnabled); // check/notify team balance changes while timed CTF is disabled. // if fair ctf is disabled, no need to check/notify about team balance changes: if (tctf.fairCTF && !tctf.notifiedCTFOK && !tctf.enabled && tctf.fairCTFEnabled){ bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Capture The Flag enabled - teams are evenly balanced."); tctf.notifiedCTFOK = true; return; } if (!tctf.fairCTF && tctf.notifiedCTFOK && !tctf.enabled && tctf.fairCTFEnabled){ bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Capture The Flag disabled - teams are not evenly balanced."); tctf.notifiedCTFOK = false; return; } // if no timed CTF, we can leave: if (!tctf.enabled) return; // if this is true, we can leave too: if (!tctf.fairCTF && !tctf.timerRunning) return; // check/notify team balance changes while timed CTF and fair CTF are enabled: if(!tctf.fairCTF && tctf.timerRunning && tctf.fairCTFEnabled){ bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Capture The Flag disabled - teams are not evenly balanced."); tctf.timerRunning = false; ResetTeamData(); return; } // no timed ctf with fair CTF disabled and only one team present: if (tctf.fairCTF && !tctf.fairCTFEnabled){ if (OnlyOneTeamPlaying()){ if (tctf.timerRunning) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF disabled - not enough teams."); tctf.timerRunning = false; ResetTeamData(); return; } } // start timing if we have made it this far: if (tctf.fairCTF && !tctf.timerRunning && !OnlyOneTeamPlaying()){ tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF now in progress - capture a flag in less than %i minute(s)!", tctf.adjTime); tctf.timerRunning = true; ResetTeamData(); return; } // everything is a go for timed ctf checks now. // check each team's time left, warn and kill if necessary: int RedReturn = TeamCheck(eRedTeam, "RED", tctf.redLastWarn, tctf.redLastTime); int GreenReturn = TeamCheck(eGreenTeam, "GREEN", tctf.greenLastWarn, tctf.greenLastTime); int BlueReturn = TeamCheck(eBlueTeam, "BLUE", tctf.blueLastWarn, tctf.blueLastTime); int PurpleReturn = TeamCheck(ePurpleTeam, "PURPLE", tctf.purpleLastWarn, tctf.purpleLastTime); if (RedReturn == 1) tctf.redLastWarn = bz_getCurrentTime(); if (RedReturn == 2){ tctf.redLastWarn = bz_getCurrentTime(); tctf.redLastTime = bz_getCurrentTime(); } if (GreenReturn == 1) tctf.greenLastWarn = bz_getCurrentTime(); if (GreenReturn == 2){ tctf.greenLastWarn = bz_getCurrentTime(); tctf.greenLastTime = bz_getCurrentTime(); } if (BlueReturn == 1) tctf.blueLastWarn = bz_getCurrentTime(); if (BlueReturn == 2){ tctf.blueLastWarn = bz_getCurrentTime(); tctf.blueLastTime = bz_getCurrentTime(); } if (PurpleReturn == 1) tctf.purpleLastWarn = bz_getCurrentTime(); if (PurpleReturn == 2){ tctf.purpleLastWarn = bz_getCurrentTime(); tctf.purpleLastTime = bz_getCurrentTime(); } ResetZeroTeams(); // reset team data for teams with no players. return; } void TCTFPlayerUpdates ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerUpdateEvent) return; // no CTF if teams not balanced, drop team flags asap: if (!tctf.fairCTF){ int playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; const char* FlagHeld = bz_getPlayerFlag(playerID); if (FlagHeld != NULL){ if (strcmp(FlagHeld, "R*") == 0 || strcmp(FlagHeld, "G*") == 0 || strcmp(FlagHeld, "B*") == 0 || strcmp(FlagHeld, "P*") == 0 ){ bz_removePlayerFlag ( playerID ); bz_sendTextMessagef (BZ_SERVER, playerID, "Capture The Flag disabled - teams are not evenly balanced."); } } } return; } bool TCTFCommands::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (fromPlayer) { if (!fromPlayer->admin) { bz_sendTextMessage(BZ_SERVER,playerID,"You must be admin to use the ctfcaptime commands."); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); } if ( command == "tctfon"){ tctf.enabled = true; if (!tctf.timerRunning) ResetTeamData(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF is enabled."); return true; } if ( command == "tctfoff"){ tctf.enabled = false; tctf.timerRunning = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF is disabled."); return true; } if ( command == "fairctfon"){ tctf.fairCTFEnabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Fair CTF is enabled."); return true; } if ( command == "fairctfoff"){ tctf.fairCTFEnabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Fair CTF is disabled."); if (!tctf.timerRunning) ResetTeamData(); return true; } if ( command == "tctfsoundon"){ tctf.soundEnabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF sound is enabled."); return true; } if ( command == "tctfsoundoff"){ tctf.soundEnabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Timed CTF sound is disabled."); return true; } if ( command == "tctfstatus"){ if (tctf.enabled && !tctf.timerRunning) bz_sendTextMessagef (BZ_SERVER, playerID, "Timed CTF is currently enabled, but not running."); if (tctf.enabled && tctf.timerRunning) bz_sendTextMessagef (BZ_SERVER, playerID, "Timed CTF is currently enabled, and running"); if (!tctf.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Timed CTF is currently disabled."); if (!tctf.fairCTFEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Fair CTF is currently disabled"); if (tctf.fairCTFEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Fair CTF is currently enabled"); if (!tctf.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Timed CTF sounds are currently disabled"); if (tctf.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Timed CTF sounds are currently enabled"); tctf.adjTime = (int)(tctf.timeLimit/60 + 0.5); bz_sendTextMessagef (BZ_SERVER, playerID, "CTF capture time is currently set to: %i minutes", tctf.adjTime); return true; } // explicit time command handler: if ( command == "tctftime" ){ double inputvalue = ConvertToInt(message); if (inputvalue > 0){ tctf.timeLimit = inputvalue * 60; tctf.adjTime = (int)(tctf.timeLimit / 60 + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "CTF capture time has been set to %i minutes.", tctf.adjTime); if (!tctf.enabled) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "(Timed CTF is still disabled)"); ResetTeamData(); return true; } else{ bz_sendTextMessagef (BZ_SERVER, playerID, "CTF capture time invalid: must be between 1 and 120 minutes."); return true; } return true; } return false; } void TCTFHandler::Event( bz_EventData *eventData ) { if (eventData->eventType == bz_ePlayerUpdateEvent) TCTFPlayerUpdates(eventData); else if (eventData->eventType == bz_eTickEvent) TCTFTickEvents(eventData); else if (eventData->eventType == bz_eCaptureEvent) TCTFFlagCapped(eventData); else if (eventData->eventType == bz_ePlayerJoinEvent) TCTFPlayerJoined(eventData); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/timedctf/timedctf.def000066400000000000000000000001511200563112200211730ustar00rootroot00000000000000LIBRARY timedctf EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersionbzflag-2.4.2+ds1/plugins/timedctf/timedctf.sln000066400000000000000000000023171200563112200212370ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timedctf", "timedctf.vcxproj", "{F82FE1A4-06D6-4358-8CD5-11E88922736F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|Win32.ActiveCfg = Debug|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|Win32.Build.0 = Debug|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|x64.ActiveCfg = Debug|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Debug|x64.Build.0 = Debug|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|Win32.ActiveCfg = Release|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|Win32.Build.0 = Release|Win32 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|x64.ActiveCfg = Release|x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/timedctf/timedctf.vcxproj000066400000000000000000000336571200563112200221510ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {F82FE1A4-06D6-4358-8CD5-11E88922736F} timedctf Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;timedctf_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)timedctf.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) timedctf.def true $(OutDir)timedctf.pdb Windows false $(OutDir)timedctf.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;timedctf_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)timedctf.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) timedctf.def true $(OutDir)timedctf.pdb Windows false $(OutDir)timedctf.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;timedctf_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)timedctf.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) timedctf.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)timedctf.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;timedctf_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)timedctf.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) timedctf.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)timedctf.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/plugins/timedctf/timedctf_admin.txt000066400000000000000000000010341200563112200224250ustar00rootroot00000000000000----------------------------------------------------- Timed CTF Admin Commands Available: ----------------------------------------------------- "tctfon" - enable Timed CTF mode. "tctfoff" - disable Timed CTF mode. "tctfsoundon" - enable Timed CTF sounds. "tctfsoundoff" - disable Timed CTF sounds. "tctftime " - change CTF time 1-120 minutes. "tctfstatus" - indicate the status of the plugin. "fairctfon" - enables fair ctf function. "fairctfoff" - disables fair ctf function. ----------------------------------------------------- bzflag-2.4.2+ds1/plugins/timedctf/timedctf_rules.txt000066400000000000000000000005111200563112200224660ustar00rootroot00000000000000---------------------------------------------------- Goal of game: Capture opponent's flag before time runs out. If you don't, your team will be killed. ---------------------------------------------------- Watch server messages for game updates - how much time is left, etc. ---------------------------------------------------- bzflag-2.4.2+ds1/plugins/webReport/000077500000000000000000000000001200563112200170715ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/webReport/Makefile.am000066400000000000000000000005401200563112200211240ustar00rootroot00000000000000lib_LTLIBRARIES = webReport.la webReport_la_SOURCES = \ webReport.cpp webReport_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ templates \ webReport.def \ webReport.sln \ webReport.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/webReport/README.txt000066400000000000000000000004451200563112200205720ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : webReportProject Overview ======================================================================== This is the webReport plugin. It makes a webReport plugin that exports the reports via HTTP. bzflag-2.4.2+ds1/plugins/webReport/templates/000077500000000000000000000000001200563112200210675ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/webReport/templates/report.tmpl000066400000000000000000000013371200563112200233040ustar00rootroot00000000000000 Reports for [$HostName]

      Reports for [$HostName]

      [-- end header --] [-- report section --] [?IF Valid] [*START Reports] [$Report] [*END Reports] [*EMPTY Reports]

      There are no reports, sorry

      [?ELSE Valid]

      Invalid Login, sorry

      [?END Valid] [-- footer --]

      Page generated by webReport in [$PageTime] seconds

      bzflag-2.4.2+ds1/plugins/webReport/webReport.cpp000066400000000000000000000115631200563112200215540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // webReport.cpp : Defines the entry point for the DLL application. // #include "bzfsAPI.h" #include "bzfsHTTPAPI.h" std::string templatesDir; class WebReport : public bz_Plugin, public bzhttp_VDir, public bzhttp_TemplateCallback { public: WebReport(); virtual const char* Name (){return "Web Reports";} virtual void Init(const char* config); virtual void Cleanup(); void loadDefaultTemplates(void); virtual const char* GetTemplateKey(const char* /* key */); virtual bool GetTemplateLoop(const char* /* key */, const char* /*param*/); virtual bool GetTemplateIF(const char* /* key */, const char* /*param*/); std::string noAuthDefaultTeplate,reportDefaultTemplate; bool evenLine; bool valid; bz_APIStringList *reports; int report; virtual const char* VDirName(){return "WebReport";} virtual const char* VDirDescription(){return "View Reports On-line";} virtual bzhttp_ePageGenStatus GeneratePage ( const bzhttp_Request& request, bzhttp_Responce &responce ); virtual bool GenerateNoAuthPage ( const bzhttp_Request& request, bzhttp_Responce &responce); virtual bool AllowResourceDownloads ( void ); protected: std::string resourceDir; }; BZ_PLUGIN(WebReport) WebReport::WebReport() :bz_Plugin(), bzhttp_VDir(),bzhttp_TemplateCallback() { evenLine = false; valid = false; } void WebReport::Init(const char *commandLine) { bzhttp_RegisterVDir(this,this); this->RequiredAuthentiction = eBZID; this->CacheAuthentication = true; loadDefaultTemplates(); if (commandLine) resourceDir = commandLine; if (resourceDir.size()) { bzhttp_AddSearchPath("ReportTemplates",commandLine); this->ResourceDirs.push_back(std::string(commandLine)); } } bool WebReport::AllowResourceDownloads ( void ) { return resourceDir.size() > 0; } void WebReport::Cleanup() { bzhttp_RemoveAllVdirs(this); Flush(); } const char* WebReport::GetTemplateKey(const char* _key) { std::string key = _key; if (key == "evenodd") return evenLine ? "even" : "odd"; else if (key =="report") { if (reports && report > 0 && report < (int)reports->size()) return reports->get(report).c_str(); } return ""; } bool WebReport::GetTemplateLoop(const char* _key, const char* /*_param*/) { std::string key = _key; if (key != "report") return false; if (!reports || !reports->size()) return false; report++; if (report >= (int)reports->size()) return false; evenLine = !evenLine; return true; } bool WebReport::GetTemplateIF(const char* _key, const char* /*_param*/) { std::string key = _key; if (key == "valid") return valid; return false; } bzhttp_ePageGenStatus WebReport::GeneratePage ( const bzhttp_Request& request, bzhttp_Responce &responce ) { evenLine = false; reports = NULL; if (!request.UserHasPerm(bz_perm_viewReports)) return GenerateNoAuthPage(request,responce) ? ePageDone : eNoPage; responce.ReturnCode = e200OK; responce.DocumentType = eHTML; // unsigned int sessionID = request.Session->SessionID; std::string action = request.GetParamater("action"); reports = bz_getReports(); report = -1; // find the report file const char* file = bzhttp_FindFile("ReportTemplates","reports.tmpl"); if (file) responce.AddBodyData(bzhttp_RenderTemplate(file,this).c_str()); else responce.AddBodyData(bzhttp_RenderTemplateFromText(reportDefaultTemplate.c_str(),this).c_str()); if (reports) bz_deleteStringList(reports); return ePageDone; } bool WebReport::GenerateNoAuthPage ( const bzhttp_Request& /*request*/, bzhttp_Responce &responce) { const char* file = bzhttp_FindFile("ReportTemplates","report_noAuth.tmpl"); if (file) responce.AddBodyData(bzhttp_RenderTemplate(file,this).c_str()); else { file = bzhttp_FindFile("ReportTemplates","unauthorized.tmpl"); if (file) responce.AddBodyData(bzhttp_RenderTemplate(file,this).c_str()); else responce.AddBodyData(bzhttp_RenderTemplateFromText(noAuthDefaultTeplate.c_str(),this).c_str()); } return true; } void WebReport::loadDefaultTemplates(void) { reportDefaultTemplate = "[?IF Valid][*START Reports][$Report]
      [*END Reports]There are no reports, sorry[*EMPTY Reports][?ELSE Valid]Invalid Login, sorry[?END Valid]"; noAuthDefaultTeplate = "Unauthorized User"; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/webReport/webReport.def000066400000000000000000000001521200563112200215200ustar00rootroot00000000000000LIBRARY webReport EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersionbzflag-2.4.2+ds1/plugins/webReport/webReport.sln000066400000000000000000000023211200563112200215560ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webReport", "webReport.vcxproj", "{5C46119A-FC94-4DFB-9F75-154DC96FFAB1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Debug|Win32.ActiveCfg = Debug|Win32 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Debug|Win32.Build.0 = Debug|Win32 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Debug|x64.ActiveCfg = Debug|x64 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Debug|x64.Build.0 = Debug|x64 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Release|Win32.ActiveCfg = Release|Win32 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Release|Win32.Build.0 = Release|Win32 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Release|x64.ActiveCfg = Release|x64 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/webReport/webReport.vcxproj000066400000000000000000000327051200563112200224660ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {5C46119A-FC94-4DFB-9F75-154DC96FFAB1} webReport Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;webReport_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)webReport.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) webReport.def true $(OutDir)webReport.pdb Windows false $(OutDir)webReport.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;webReport_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)webReport.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) webReport.def true $(OutDir)webReport.pdb Windows false $(OutDir)webReport.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;webReport_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)webReport.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) webReport.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)webReport.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;webReport_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)webReport.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) webReport.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)webReport.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" bzflag-2.4.2+ds1/plugins/wwzones/000077500000000000000000000000001200563112200166345ustar00rootroot00000000000000bzflag-2.4.2+ds1/plugins/wwzones/Makefile.am000066400000000000000000000005571200563112200206770ustar00rootroot00000000000000lib_LTLIBRARIES = wwzones.la wwzones_la_SOURCES = wwzones.cpp wwzones_la_CPPFLAGS = -I$(top_srcdir)/include wwzones_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ wwzones.def \ wwzones.sln \ wwzones.vcxproj MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/plugins/wwzones/Makefile.in000066400000000000000000000455721200563112200207160ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = plugins/wwzones DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) wwzones_la_LIBADD = am_wwzones_la_OBJECTS = wwzones_la-wwzones.lo wwzones_la_OBJECTS = $(am_wwzones_la_OBJECTS) wwzones_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(wwzones_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(wwzones_la_SOURCES) DIST_SOURCES = $(wwzones_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = wwzones.la wwzones_la_SOURCES = wwzones.cpp wwzones_la_CPPFLAGS = -I$(top_srcdir)/include wwzones_la_LDFLAGS = -module -avoid-version -shared AM_CPPFLAGS = $(CONF_CPPFLAGS) AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) EXTRA_DIST = \ README.txt \ wwzones.def \ wwzones.sln \ wwzones.vcxproj MAINTAINERCLEANFILES = \ Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/wwzones/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/wwzones/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done wwzones.la: $(wwzones_la_OBJECTS) $(wwzones_la_DEPENDENCIES) $(wwzones_la_LINK) -rpath $(libdir) $(wwzones_la_OBJECTS) $(wwzones_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wwzones_la-wwzones.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< wwzones_la-wwzones.lo: wwzones.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wwzones_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT wwzones_la-wwzones.lo -MD -MP -MF $(DEPDIR)/wwzones_la-wwzones.Tpo -c -o wwzones_la-wwzones.lo `test -f 'wwzones.cpp' || echo '$(srcdir)/'`wwzones.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/wwzones_la-wwzones.Tpo $(DEPDIR)/wwzones_la-wwzones.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='wwzones.cpp' object='wwzones_la-wwzones.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(wwzones_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o wwzones_la-wwzones.lo `test -f 'wwzones.cpp' || echo '$(srcdir)/'`wwzones.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/plugins/wwzones/README.txt000066400000000000000000000100511200563112200203270ustar00rootroot00000000000000======================================================================== DYNAMIC LINK LIBRARY : wwzones Project Overview ======================================================================== wwzones plugin Author: LouMan Credit to JeffM2501 for base zone and custom map object code (from flagStay plugin), which I have modified to fit this application. Description: The plugin will fire a map defined world weapon whenever a player is in a map defined volume. It could be used for landmines, booby traps, clearing campers in difficult locations, general amusement, etc. Multiple zones with different weapons, etc. may be used in same map file. ------------------------------------------------------------------------------------- The parameters of the wwzone map definition are follows: bbox or cylinder These define the volume on the map that will trigger a world weapon whenever players enter it. zoneweapon
      This defines the world weapon. is a valid type of flag to use for the world weapon (e.g. SW, GM, L, etc.) defines the life of the weapon's shots. defines the location of the world weapon. defined the tilt of the world weapon. defines the direction of the world weapon. ...not sure what this does ;) but it is an input to the API world weapon function.
      defines the delay time of the world weapon. playermessage "your message here" If used (optional), sends custom message to player when he/she triggers world weapon. servermessage "your message here" If used (optional), sends custom message to all players when a world weapon is triggered. infomessage If used (optional), this will issue standard message to all players stating which type of world weapon was triggered by whom. This message cannot be customized. repeat If used (optional), will repeat weapon fire while player is in defined volume. defines the repeat time of the weapon (minimum 0.1 seconds). If not specified, default is 0.5 seconds. If repeat is not included in definition, weapon will only fire once when player enters zone. timedelay If used (optional), will delay initial fire of world weapon by specified number of seconds. ------------------------------------------------------------------------------------- Examples of map (.bzw) entries: wwzone bbox -80 -30 -80 -30 0 2 zoneweapon SW 1 0 0 1 0 0 0 0 playermessage "You triggered Shockwave!" repeat .25 timedelay 2 end This will fire a shockwave every 0.25 seconds (approximately) after a player is in the volume defined by the bbox for more than 2 seconds. In this case, a square volume 50 x 50 x 1 centered at coordinates -50 50 1. The shockwaves will occur at coordinates 0 0 1 and will send message "You triggered Shockwave!" to player that triggered it, when initially fired. wwzone bbox 30 80 30 80 0 2 zoneweapon L 1 5 5 1 45 25 0 0 servermessage "Laserz rule!" repeat end This will fire a laser, every 0.5 seconds (approximately) while a player is in the volume defined by the bbox. In this case, a square volume 50 x 50 x 1 centered at coordinates 50 50 1. The laser will occur at coordinates 5 5 1 and be tilted at 45 degrees with a heading of 25 degrees. When initially fired, there is a message sent to all players "Laserz rule!" wwzone cylinder 50 -50 0 6 20 zoneweapon GM 1 0 0 1 0 0 0 0 infomessage timedelay 1 end This will fire a GM one time after a player has been in the volume defined by the cylinder for more than 1 second. In this case, a cylindrical volume with a radius of 20, centered at coordinates 50 -50 3. The GM will shoot from coordinates 0 0 1 with 0 tilt and a heading of 0 degrees. When initially fired, there is a message sent to all players "GM triggered by ." ------------------------------------------------------------------------------------- Please report any bugs or issues with this plugin to LouMan, and good luck. bzflag-2.4.2+ds1/plugins/wwzones/wwzones.cpp000066400000000000000000000217441200563112200210640ustar00rootroot00000000000000// wwzones.cpp : Defines the entry point for the DLL application. #include "bzfsAPI.h" #include #include class WWINFO { public: WWINFO() { pi = 3.14159265358979323846; tickTime = 0.5; } double pi; double tickTime; }; WWINFO wwinfo; class WWZEventHandler : public bz_Plugin, bz_CustomMapObjectHandler { public: virtual const char* Name (){return "World Weapon Zones";} virtual void Init ( const char* config); virtual void Cleanup (); virtual void Event ( bz_EventData *eventData ); virtual bool MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ); }; BZ_PLUGIN(WWZEventHandler) void WWZEventHandler::Init (const char* /*commandLineParameter*/){ bz_registerCustomMapObject("WWZONE",this); Register(bz_eTickEvent); MaxWaitTime = (float)wwinfo.tickTime; } void WWZEventHandler::Cleanup (void){ Flush(); bz_removeCustomMapObject("WWZONE"); } class WWZPlyrInfo { public: WWZPlyrInfo() { wwzplyrID = -1; wwzPlyrInTime = 0; } int wwzplyrID; double wwzPlyrInTime; }; WWZPlyrInfo wwzNewPlyr; class WWZone { public: WWZone() { box = false; xMax = xMin = yMax = yMin = zMax = zMin = rad = 0; zoneWeapon = ""; zoneWeaponLifetime = 0; zoneWeaponPosition[0] = 0; zoneWeaponPosition[1] = 0; zoneWeaponPosition[2] = 0; zoneWeaponTilt = 0; zoneWeaponDirection = 0; zoneWeaponShotID = 0; zoneWeaponDT = 0; zoneWeaponRepeat = false; zoneWeaponFired = false; zoneWeaponLastFired = 0; zoneWeaponMinFireTime = 0.5; zoneWeaponTimeDelay = 0; zoneWeaponInfoMessage = false; zoneWeaponSentMessage = false; wwzPlyrList.clear(); } std::vector wwzPlyrList; bool box; float xMax,xMin,yMax,yMin,zMax,zMin; float rad; bz_ApiString zoneWeapon; float zoneWeaponLifetime, zoneWeaponPosition[3], zoneWeaponTilt, zoneWeaponDirection, zoneWeaponDT; double zoneWeaponMinFireTime, zoneWeaponTimeDelay, zoneWeaponLastFired; bool zoneWeaponRepeat, zoneWeaponInfoMessage, zoneWeaponFired, zoneWeaponSentMessage; int zoneWeaponShotID; std::string playermessage; std::string servermessage; bool pointIn ( float pos[3] ) { if ( box ) { if ( pos[0] > xMax || pos[0] < xMin ) return false; if ( pos[1] > yMax || pos[1] < yMin ) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } else { float vec[3]; vec[0] = pos[0]-xMax; vec[1] = pos[1]-yMax; vec[2] = pos[2]-zMax; float dist = sqrt(vec[0]*vec[0]+vec[1]*vec[1]); if ( dist > rad) return false; if ( pos[2] > zMax || pos[2] < zMin ) return false; } return true; } }; std::vector zoneList; bool WWZEventHandler::MapObject ( bz_ApiString object, bz_CustomMapObjectInfo *data ) { if (object != "WWZONE" || !data) return false; WWZone newZone; // parse all the chunks for ( unsigned int i = 0; i < data->data.size(); i++ ) { std::string line = data->data.get(i).c_str(); bz_APIStringList *nubs = bz_newStringList(); nubs->tokenize(line.c_str()," ",0,true); if ( nubs->size() > 0) { std::string key = bz_toupper(nubs->get(0).c_str()); if ( key == "BBOX" && nubs->size() > 6) { newZone.box = true; newZone.xMin = (float)atof(nubs->get(1).c_str()); newZone.xMax = (float)atof(nubs->get(2).c_str()); newZone.yMin = (float)atof(nubs->get(3).c_str()); newZone.yMax = (float)atof(nubs->get(4).c_str()); newZone.zMin = (float)atof(nubs->get(5).c_str()); newZone.zMax = (float)atof(nubs->get(6).c_str()); } else if ( key == "CYLINDER" && nubs->size() > 5) { newZone.box = false; newZone.rad = (float)atof(nubs->get(5).c_str()); newZone.xMax =(float)atof(nubs->get(1).c_str()); newZone.yMax =(float)atof(nubs->get(2).c_str()); newZone.zMin =(float)atof(nubs->get(3).c_str()); newZone.zMax =(float)atof(nubs->get(4).c_str()); } else if ( key == "ZONEWEAPON" && nubs->size() > 9) { newZone.zoneWeapon = nubs->get(1); newZone.zoneWeaponLifetime = (float)atof(nubs->get(2).c_str()); newZone.zoneWeaponPosition[0] = (float)atof(nubs->get(3).c_str()); newZone.zoneWeaponPosition[1] = (float)atof(nubs->get(4).c_str()); newZone.zoneWeaponPosition[2] = (float)atof(nubs->get(5).c_str()); newZone.zoneWeaponTilt = (float)atof(nubs->get(6).c_str()); newZone.zoneWeaponTilt = (newZone.zoneWeaponTilt / 360) * (2 * (float)wwinfo.pi); newZone.zoneWeaponDirection = (float)atof(nubs->get(7).c_str()); newZone.zoneWeaponDirection = (newZone.zoneWeaponDirection / 360) * (2 * (float)wwinfo.pi); newZone.zoneWeaponShotID = (int)atoi(nubs->get(8).c_str()); newZone.zoneWeaponDT = (float)atof(nubs->get(9).c_str()); } else if ( key == "REPEAT" && nubs->size() == 1 ) { newZone.zoneWeaponRepeat = true; } else if ( key == "REPEAT" && nubs->size() > 1 ) { newZone.zoneWeaponRepeat = true; newZone.zoneWeaponMinFireTime = (double)atof(nubs->get(1).c_str()); if (newZone.zoneWeaponMinFireTime < wwinfo.tickTime && newZone.zoneWeaponMinFireTime >= 0.1) wwinfo.tickTime = newZone.zoneWeaponMinFireTime - .05; //tick faster than ww calls } else if ( key == "TIMEDELAY" && nubs->size() > 1 ) { newZone.zoneWeaponTimeDelay = (double)atof(nubs->get(1).c_str()); if (newZone.zoneWeaponTimeDelay < 0) newZone.zoneWeaponTimeDelay = 0; } else if ( key == "PLAYERMESSAGE" && nubs->size() > 1 ) { newZone.playermessage = nubs->get(1).c_str(); } else if ( key == "SERVERMESSAGE" && nubs->size() > 1 ) { newZone.servermessage = nubs->get(1).c_str(); } else if ( key == "INFOMESSAGE" ) { newZone.zoneWeaponInfoMessage = true; } } bz_deleteStringList(nubs); } zoneList.push_back(newZone); MaxWaitTime = (float)wwinfo.tickTime; return true; } inline bool wasHere(int zoneNum, int plyrNum) { for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++) { if (plyrNum == zoneList[zoneNum].wwzPlyrList[j].wwzplyrID) return true; } wwzNewPlyr.wwzplyrID = plyrNum; wwzNewPlyr.wwzPlyrInTime = bz_getCurrentTime(); zoneList[zoneNum].wwzPlyrList.push_back(wwzNewPlyr); zoneList[zoneNum].zoneWeaponSentMessage = false; zoneList[zoneNum].zoneWeaponFired = false; return false; } inline void notHere(int zoneNum, int plyrNum) { for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++) { if (plyrNum == zoneList[zoneNum].wwzPlyrList[j].wwzplyrID) { zoneList[zoneNum].wwzPlyrList.erase(zoneList[zoneNum].wwzPlyrList.begin() + j); zoneList[zoneNum].zoneWeaponFired = false; zoneList[zoneNum].zoneWeaponSentMessage = false; return; } } return; } inline bool OKToFire(int zoneNum, int plyrNum) { for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++) { if (zoneList[zoneNum].wwzPlyrList[j].wwzplyrID == plyrNum) { if ((bz_getCurrentTime() - zoneList[zoneNum].wwzPlyrList[j].wwzPlyrInTime) > zoneList[zoneNum].zoneWeaponTimeDelay && !zoneList[zoneNum].zoneWeaponFired) { zoneList[zoneNum].wwzPlyrList[j].wwzPlyrInTime = bz_getCurrentTime(); return true; } } } return false; } void WWZEventHandler::Event ( bz_EventData *eventData ) { if (eventData->eventType != bz_eTickEvent) return; bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int h = 0; h < playerList->size(); h++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](h)); if (player){ for ( unsigned int i = 0; i < zoneList.size(); i++ ) { if (zoneList[i].pointIn(player->lastKnownState.pos) && player->spawned) { if (wasHere(i, player->playerID) && OKToFire(i, player->playerID) && !zoneList[i].zoneWeaponFired) { bz_fireWorldWep (zoneList[i].zoneWeapon.c_str(),zoneList[i].zoneWeaponLifetime,BZ_SERVER,zoneList[i].zoneWeaponPosition,zoneList[i].zoneWeaponTilt,zoneList[i].zoneWeaponDirection,zoneList[i].zoneWeaponShotID,zoneList[i].zoneWeaponDT); zoneList[i].zoneWeaponFired = true; zoneList[i].zoneWeaponLastFired = bz_getCurrentTime(); } else { if ((bz_getCurrentTime() - zoneList[i].zoneWeaponLastFired) > zoneList[i].zoneWeaponMinFireTime && zoneList[i].zoneWeaponRepeat) zoneList[i].zoneWeaponFired = false; } if (!zoneList[i].zoneWeaponSentMessage && zoneList[i].zoneWeaponFired) { if (!zoneList[i].playermessage.empty()) bz_sendTextMessage(BZ_SERVER,player->playerID,zoneList[i].playermessage.c_str()); if (!zoneList[i].servermessage.empty()) bz_sendTextMessage(BZ_SERVER,BZ_ALLUSERS,zoneList[i].servermessage.c_str()); if (zoneList[i].zoneWeaponInfoMessage) bz_sendTextMessagef(BZ_SERVER,BZ_ALLUSERS,"%s triggered by %s.", zoneList[i].zoneWeapon.c_str(), player->callsign.c_str()); zoneList[i].zoneWeaponSentMessage = true; } } else notHere(i, player->playerID); } bz_freePlayerRecord(player); } } bz_deleteIntList(playerList); return; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/plugins/wwzones/wwzones.def000066400000000000000000000001511200563112200210250ustar00rootroot00000000000000LIBRARY wwzones EXPORTS ; Explicit exports can go here bz_GetPlugin bz_FreePlugin bz_GetMinVersion bzflag-2.4.2+ds1/plugins/wwzones/wwzones.sln000066400000000000000000000023151200563112200210670ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wwzones", "wwzones.vcxproj", "{453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|Win32.ActiveCfg = Debug|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|Win32.Build.0 = Debug|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|x64.ActiveCfg = Debug|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Debug|x64.Build.0 = Debug|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|Win32.ActiveCfg = Release|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|Win32.Build.0 = Release|Win32 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|x64.ActiveCfg = Release|x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal bzflag-2.4.2+ds1/plugins/wwzones/wwzones.vcxproj000066400000000000000000000336321200563112200217740ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {453C1FF9-45D3-4C3A-8A51-5E1FBE65EF7E} wwzones Win32Proj DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte DynamicLibrary MultiByte <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ true $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ $(SolutionDir)$(ProjectName)_$(Platform)_$(Configuration)\ false Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;wwzones_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue bzfs.lib;%(AdditionalDependencies) $(OutDir)wwzones.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) wwzones.def true $(OutDir)wwzones.pdb Windows false $(OutDir)wwzones.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 Disabled $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;wwzones_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)wwzones.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) wwzones.def true $(OutDir)wwzones.pdb Windows false $(OutDir)wwzones.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;wwzones_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)wwzones.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) wwzones.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)wwzones.lib MachineX86 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" X64 $(ProjectDir)\..\..\include\;$(ProjectDir)\..\plugin_utils\;$(BZAPI_INC_DIR)\;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;wwzones_EXPORTS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 ProgramDatabase bzfs.lib;%(AdditionalDependencies) $(OutDir)wwzones.dll $(SolutionDir)\BZFS_$(Platform)_$(Configuration)\;$(ProjectDir)\..\..\bin_$(Platform)\;$(BZAPI_LIB_DIR)\;%(AdditionalLibraryDirectories) wwzones.def true Release/$(ProjectName).pdb Windows true true false $(OutDir)wwzones.lib MachineX64 mkdir "$(ProjectDir)..\..\bin_$(Platform)" mkdir "$(ProjectDir)..\..\bin_$(Platform)\plugins" copy "$(OutDir)*.dll" "$(ProjectDir)\..\..\bin_$(Platform)\plugins\" Document true true true true {7fa170ac-5a33-41fc-9b3d-02f9e5173b0e} false bzflag-2.4.2+ds1/src/000077500000000000000000000000001200563112200142265ustar00rootroot00000000000000bzflag-2.4.2+ds1/src/3D/000077500000000000000000000000001200563112200144745ustar00rootroot00000000000000bzflag-2.4.2+ds1/src/3D/BitmapFont.cxx000066400000000000000000000105571200563112200172730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // Interface header #include "BitmapFont.h" // System headers #include #include #include // Common implementation headers #include "bzfgl.h" #include "bzfio.h" #include "MediaFile.h" #include "OpenGLGState.h" BitmapFont::BitmapFont() { loaded = false; for (int i = 0; i < MAX_TEXTURE_FONT_CHARS; i++) { bitmaps[i] = 0; fontMetrics[i].charWidth = -1; } } BitmapFont::~BitmapFont() { for (int i = 0; i < MAX_TEXTURE_FONT_CHARS; i++) { if (bitmaps[i]) delete[] bitmaps[i]; } } void BitmapFont::build(void) { if (texture.size() < 1) { logDebugMessage(2,"Font %s does not have an associated texture name, not loading\n", texture.c_str()); return; } int width, height; std::string textureAndDir = "fonts/" + texture; unsigned char* image = MediaFile::readImage(textureAndDir, &width, &height); for (int i = 0; i < numberOfCharacters; i++) { delete[] bitmaps[i]; const int h = fontMetrics[i].endY - fontMetrics[i].startY; const int w = fontMetrics[i].endX - fontMetrics[i].startX; const int sx = fontMetrics[i].startX; const int ey = fontMetrics[i].endY; const int bytesPerRow = ((w + 31) / 8) & ~3; bitmaps[i] = new unsigned char[h * bytesPerRow + 4]; const int IT = 80; // intensity threshold for (int j = 0; j < h; j++) { const unsigned char* srcRow = &image[4*((height-ey+j)*width+sx)]; unsigned char* dstData = bitmaps[i] + j * bytesPerRow; int b; for (b = 0; b < w - 7; b += 8) { unsigned char data = 0; if (srcRow[4*(b+0)] >= IT) data |= 0x80u; if (srcRow[4*(b+1)] >= IT) data |= 0x40u; if (srcRow[4*(b+2)] >= IT) data |= 0x20u; if (srcRow[4*(b+3)] >= IT) data |= 0x10u; if (srcRow[4*(b+4)] >= IT) data |= 0x08u; if (srcRow[4*(b+5)] >= IT) data |= 0x04u; if (srcRow[4*(b+6)] >= IT) data |= 0x02u; if (srcRow[4*(b+7)] >= IT) data |= 0x01u; *dstData++ = data; } unsigned char data = 0; switch (w - b) { case 7: if (srcRow[4*(b+6)] >= IT) data |= 0x02u; case 6: if (srcRow[4*(b+5)] >= IT) data |= 0x04u; case 5: if (srcRow[4*(b+4)] >= IT) data |= 0x08u; case 4: if (srcRow[4*(b+3)] >= IT) data |= 0x10u; case 3: if (srcRow[4*(b+2)] >= IT) data |= 0x20u; case 2: if (srcRow[4*(b+1)] >= IT) data |= 0x40u; case 1: if (srcRow[4*(b+0)] >= IT) data |= 0x80u; *dstData++ = data; } } } delete[] image; loaded = true; // create GState OpenGLGStateBuilder builder(gstate); builder.enableTexture(false); builder.setBlending(); builder.setAlphaFunc(); gstate = builder.getState(); } void BitmapFont::free(void) { loaded = false; } void BitmapFont::filter(bool UNUSED(dofilter)) { } void BitmapFont::drawString(float scale, GLfloat color[4], const char *str, int len) { // BitmapFont cannot scale, should never be asked to if (scale != 1.0f) { logDebugMessage(1,"ERROR: BitmapFont should not be asked to scale!\n"); assert(scale == 1.0f); } if (!str) return; if (!loaded) build(); if (!loaded) return; if (color[0] >= 0) glColor4fv(color); glRasterPos3f(0, 0, 0); gstate.setState(); int charToUse = 0; for (int i = 0; i < len; i++) { const char space = ' '; // decimal 32 if (str[i] < space) charToUse = space; else if (str[i] > (numberOfCharacters + space)) charToUse = space; else charToUse = str[i]; charToUse -= space; const float dx = float(fontMetrics[charToUse].fullWidth); if (charToUse == 0) { glBitmap(0, 0, 0, 0, dx, 0, 0); } else { const int h = fontMetrics[charToUse].endY - fontMetrics[charToUse].startY; const int w = fontMetrics[charToUse].endX - fontMetrics[charToUse].startX; glBitmap(w, h, float(-fontMetrics[charToUse].initialDist), 0, dx, 0, bitmaps[charToUse]); } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/BitmapFont.h000066400000000000000000000023021200563112200167050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _BITMAP_FONT_H_ #define _BITMAP_FONT_H_ /* common header */ #include "common.h" /* interface headers */ #include "ImageFont.h" #include "bzfgl.h" #include "OpenGLGState.h" class BitmapFont : public ImageFont { public: BitmapFont(); virtual ~BitmapFont(); virtual void build(); virtual bool isBuilt() const {return loaded;} virtual void filter(bool dofilter); virtual void drawString(float scale, GLfloat color[4], const char *str, int len); virtual void free(); private: OpenGLGState gstate; unsigned char *bitmaps[MAX_TEXTURE_FONT_CHARS]; bool loaded; }; #endif //_BITMAP_FONT_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/FontManager.cxx000066400000000000000000000370101200563112200174220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // BZFlag common header #include "common.h" // Interface header #include "FontManager.h" // System headers #include #include #include // Global implementation headers #include "bzfgl.h" #include "bzfio.h" #include "AnsiCodes.h" #include "StateDatabase.h" #include "BZDBCache.h" #include "OpenGLGState.h" #include "TimeKeeper.h" #include "TextUtils.h" // Local implementation headers #include "ImageFont.h" #include "BitmapFont.h" #include "TextureFont.h" // initialize the singleton template <> FontManager* Singleton::_instance = (FontManager*)0; // ANSI code GLFloat equivalents - these should line up with the enums in AnsiCodes.h static GLfloat BrightColors[9][3] = { {1.0f,1.0f,0.0f}, // yellow {1.0f,0.0f,0.0f}, // red {0.0f,1.0f,0.0f}, // green {0.1f,0.2f,1.0f}, // blue {1.0f,0.0f,1.0f}, // purple {1.0f,1.0f,1.0f}, // white {0.5f,0.5f,0.5f}, // grey {1.0f,0.5f,0.0f}, // orange (nonstandard) {0.0f,1.0f,1.0f} // cyan }; GLfloat FontManager::underlineColor[4]; void FontManager::callback(const std::string &, void *) { // set underline color const std::string uColor = BZDB.get("underlineColor"); if (strcasecmp(uColor.c_str(), "text") == 0) { underlineColor[0] = -1.0f; underlineColor[1] = -1.0f; underlineColor[2] = -1.0f; } else if (strcasecmp(uColor.c_str(), "cyan") == 0) { underlineColor[0] = BrightColors[CyanColor][0]; underlineColor[1] = BrightColors[CyanColor][1]; underlineColor[2] = BrightColors[CyanColor][2]; } else if (strcasecmp(uColor.c_str(), "grey") == 0) { underlineColor[0] = BrightColors[GreyColor][0]; underlineColor[1] = BrightColors[GreyColor][1]; underlineColor[2] = BrightColors[GreyColor][2]; } } FontManager::FontManager() : Singleton(), opacity(1.0f), dimFactor(0.2f), darkness(1.0f) { faceNames.clear(); fontFaces.clear(); BZDB.addCallback(std::string("underlineColor"), callback, NULL); BZDB.touch("underlineColor"); OpenGLGState::registerContextInitializer(freeContext, initContext, (void*)this); } FontManager::~FontManager() { clear(); OpenGLGState::unregisterContextInitializer(freeContext, initContext, (void*)this); return; } void FontManager::freeContext(void* data) { ((FontManager*)data)->clear(); return; } void FontManager::initContext(void* data) { ((FontManager*)data)->rebuild(); return; } void FontManager::clear(void) // clear all the lists { // destroy all the fonts faceNames.clear(); FontFaceList::iterator faceItr = fontFaces.begin(); while (faceItr != fontFaces.end()) { FontSizeMap::iterator itr = faceItr->begin(); while (itr != faceItr->end()) { delete(itr->second); ++itr; } ++faceItr; } fontFaces.clear(); return; } void FontManager::rebuild(void) // rebuild all the lists { clear(); loadAll(fontDirectory); } void FontManager::loadAll(std::string directory) { if (directory.size() == 0) return; const bool bitmapRenderer = BZDB.isTrue("useBitmapFontRenderer"); canScale = !bitmapRenderer; // save this in case we have to rebuild fontDirectory = directory; OSFile file; OSDir dir(directory); while (dir.getNextFile(file, true)) { std::string ext = file.getExtension(); if (TextUtils::compare_nocase(ext, "fmt") == 0) { ImageFont *pFont; if (bitmapRenderer) pFont = new BitmapFont; else pFont = new TextureFont; if (pFont) { if (pFont->load(file)) { std::string str = TextUtils::toupper(pFont->getFaceName()); FontFaceMap::iterator faceItr = faceNames.find(str); int faceID = 0; if (faceItr == faceNames.end()) { // it's new FontSizeMap faceList; fontFaces.push_back(faceList); faceID = (int)fontFaces.size() - 1; faceNames[str] = faceID; } else { faceID = faceItr->second; } fontFaces[faceID][pFont->getSize()] = pFont; } else { logDebugMessage(4,"Font Texture load failed: %s\n", file.getOSName().c_str()); delete(pFont); } } } } } int FontManager::getFaceID(std::string faceName) { if (faceName.size() == 0) return -1; faceName = TextUtils::toupper(faceName); FontFaceMap::iterator faceItr = faceNames.find(faceName); int faceID = 0; if (faceItr == faceNames.end()) { // see if there is a default logDebugMessage(4,"Requested font %s not found, trying Default\n", faceName.c_str()); faceName = "DEFAULT"; faceItr = faceNames.find(faceName); if (faceItr == faceNames.end()) { // see if we have arial logDebugMessage(4,"Requested font %s not found, trying Arial\n", faceName.c_str()); faceName = "ARIAL"; faceItr = faceNames.find(faceName); if (faceItr == faceNames.end()) { // hell we are outta luck, you just get the first one logDebugMessage(4,"Requested font %s not found, trying first-loaded\n", faceName.c_str()); faceItr = faceNames.begin(); if (faceItr == faceNames.end()) { logDebugMessage(2,"No fonts loaded\n"); return -1; // we must have NO fonts, so you are screwed no matter what } } } } return faceID = faceItr->second; } int FontManager::getNumFaces(void) { return (int)fontFaces.size(); } const char* FontManager::getFaceName(int faceID) { if ((faceID < 0) || (faceID > getNumFaces())) { logDebugMessage(2,"Trying to fetch name for invalid Font Face ID %d\n", faceID); return NULL; } return fontFaces[faceID].begin()->second->getFaceName(); } void FontManager::drawString(float x, float y, float z, int faceID, float size, const std::string &text, const float* resetColor) { if (text.size() == 0) return; if ((faceID < 0) || (faceID > getNumFaces())) { logDebugMessage(2,"Trying to draw with invalid Font Face ID %d\n", faceID); return; } ImageFont* pFont = getClosestRealSize(faceID, size, size); if (!pFont) { logDebugMessage(2,"Could not find applicable font size for rendering; font face ID %d, " "requested size %f\n", faceID, size); return; } float scale = size / (float)pFont->getSize(); // filtering is off by default for fonts. // if the font is large enough, and the scaling factor // is not an integer, then request filtering bool filtering = false; if ((size > 12.0f) && (fabsf(scale - floorf(scale + 0.5f)) > 0.001f)) { pFont->filter(true); filtering = true; } else { // no filtering - clamp to aligned coordinates x = floorf(x); y = floorf(y); z = floorf(z); } /* * Colorize text based on ANSI codes embedded in it * Break the text every time an ANSI code * is encountered and do a separate pFont->drawString code for * each segment, with the appropriate color parameter */ // sane defaults bool bright = true; bool pulsating = false; bool underline = false; // negatives are invalid, we use them to signal "no change" GLfloat color[4] = {-1.0f, -1.0f, -1.0f, opacity}; if (resetColor != NULL) { color[0] = resetColor[0] * darkness; color[1] = resetColor[1] * darkness; color[2] = resetColor[2] * darkness; } else { resetColor = BrightColors[WhiteColor]; } const float darkDim = dimFactor * darkness; // underline color changes for bright == false GLfloat dimUnderlineColor[4] = { underlineColor[0] * darkDim, underlineColor[1] * darkDim, underlineColor[2] * darkDim, opacity }; underlineColor[3] = opacity; // FIXME - this should not be necessary, but the bitmap font renderer needs it // OpenGLGState::resetState(); /* * ANSI code interpretation is somewhat limited, we only accept values * which have been defined in AnsiCodes.h */ bool doneLastSection = false; int startSend = 0; int endSend = (int)text.find("\033[", startSend); bool tookCareOfANSICode = false; float width = 0; // run at least once if (endSend == -1) { endSend = (int)text.size(); doneLastSection = true; } // split string into parts based on the embedded ANSI codes, render each separately // there has got to be a faster way to do this while (endSend >= 0) { // pulsate the text, if desired if (pulsating) getPulseColor(color, color); // render text int len = endSend - startSend; if (len > 0) { const char* tmpText = text.c_str(); // get substr width, we may need it a couple times width = pFont->getStrLength(scale, &tmpText[startSend], len); glPushMatrix(); glTranslatef(x, y, z); GLboolean depthMask; glGetBooleanv(GL_DEPTH_WRITEMASK, &depthMask); glDepthMask(0); pFont->drawString(scale, color, &tmpText[startSend], len); if (underline) { if (canScale) { glDisable(GL_TEXTURE_2D); } glEnable(GL_BLEND); if (bright && underlineColor[0] >= 0) { glColor4fv(underlineColor); } else if (underlineColor[0] >= 0) { glColor4fv(dimUnderlineColor); } else if (color[0] >= 0) { glColor4fv(color); } // still have a translated matrix, these coordinates are // with respect to the string just drawn glBegin(GL_LINES); glVertex2f(0.0f, 0.0f); glVertex2f(width, 0.0f); glEnd(); if (canScale) { glEnable(GL_TEXTURE_2D); } } glDepthMask(depthMask); glPopMatrix(); // x transform for next substr x += width; } if (!doneLastSection) { startSend = (int)text.find('m', endSend) + 1; } // we stopped sending text at an ANSI code, find out what it is // and do something about it if (endSend != (int)text.size()) { tookCareOfANSICode = false; std::string tmpText = text.substr(endSend, (text.find('m', endSend) - endSend) + 1); // colors for (int i = 0; i <= LastColor; i++) { if (tmpText == ColorStrings[i]) { if (bright) { color[0] = BrightColors[i][0] * darkness; color[1] = BrightColors[i][1] * darkness; color[2] = BrightColors[i][2] * darkness; } else { color[0] = BrightColors[i][0] * darkDim; color[1] = BrightColors[i][1] * darkDim; color[2] = BrightColors[i][2] * darkDim; } tookCareOfANSICode = true; break; } } // didn't find a matching color if (!tookCareOfANSICode) { // settings other than color if (tmpText == ANSI_STR_RESET) { bright = true; pulsating = false; underline = false; color[0] = resetColor[0] * darkness; color[1] = resetColor[1] * darkness; color[2] = resetColor[2] * darkness; } else if (tmpText == ANSI_STR_RESET_FINAL) { bright = false; pulsating = false; underline = false; color[0] = resetColor[0] * darkDim; color[1] = resetColor[1] * darkDim; color[2] = resetColor[2] * darkDim; } else if (tmpText == ANSI_STR_BRIGHT) { bright = true; } else if (tmpText == ANSI_STR_DIM) { bright = false; } else if (tmpText == ANSI_STR_UNDERLINE) { underline = true; } else if (tmpText == ANSI_STR_PULSATING) { pulsating = true; } else if (tmpText == ANSI_STR_NO_UNDERLINE) { underline = false; } else if (tmpText == ANSI_STR_NO_PULSATE) { pulsating = false; } else { logDebugMessage(2,"ANSI Code %s not supported\n", tmpText.c_str()); } } } endSend = (int)text.find("\033[", startSend); if ((endSend == -1) && !doneLastSection) { endSend = (int)text.size(); doneLastSection = true; } } // revert the filtering state if (filtering) { pFont->filter(false); } return; } void FontManager::drawString(float x, float y, float z, const std::string &face, float size, const std::string &text, const float* resetColor) { drawString(x, y, z, getFaceID(face), size, text, resetColor); } float FontManager::getStrLength(int faceID, float size, const std::string &text, bool alreadyStripped) { if (text.size() == 0) return 0.0f; if ((faceID < 0) || (faceID > getNumFaces())) { logDebugMessage(2,"Trying to find length of string for invalid Font Face ID %d\n", faceID); return 0.0f; } ImageFont* pFont = getClosestRealSize(faceID, size, size); if (!pFont) { logDebugMessage(2,"Could not find applicable font size for sizing; font face ID %d, " "requested size %f\n", faceID, size); return 0.0f; } float scale = size / (float)pFont->getSize(); // don't include ansi codes in the length, but allow outside funcs to skip this step float strippedLength; if (alreadyStripped) { strippedLength = pFont->getStrLength(scale, text); } else { strippedLength = pFont->getStrLength(scale, stripAnsiCodes(text)); } return strippedLength; } float FontManager::getStrLength(const std::string &face, float size, const std::string &text, bool alreadyStripped) { return getStrLength(getFaceID(face), size, text, alreadyStripped); } float FontManager::getStrHeight(int faceID, float size, const std::string & UNUSED(text)) { // don't scale tiny fonts getClosestRealSize(faceID, size, size); return (size * 1.5f); } float FontManager::getStrHeight(std::string face, float size, const std::string &text) { return getStrHeight(getFaceID(face), size, text); } void FontManager::unloadAll(void) { FontFaceList::iterator faceItr = fontFaces.begin(); while (faceItr != fontFaces.end()) { FontSizeMap::iterator itr = faceItr->begin(); while (itr != faceItr->end()) { itr->second->free(); ++itr; } ++faceItr; } } ImageFont* FontManager::getClosestSize(int faceID, float size, bool bigger) { if (fontFaces[faceID].size() == 0) return NULL; const int rsize = int(size + 0.5f); const FontSizeMap &sizes = fontFaces[faceID]; FontSizeMap::const_iterator itr = sizes.lower_bound(rsize); if (bigger) { if (itr == sizes.end()) --itr; } else { if (itr != sizes.begin() && itr->first != rsize) --itr; } return itr->second; } ImageFont* FontManager::getClosestRealSize(int faceID, float desiredSize, float &actualSize) { /* * tiny fonts scale poorly, this function will return the nearest unscaled size of a font * if the font is too tiny to scale, and a scaled size if it's big enough. */ ImageFont* font = getClosestSize(faceID, desiredSize, canScale ? true : false); if (!canScale || desiredSize < 14.0f) { // get the next biggest font size from requested if (!font) { logDebugMessage(2,"Could not find applicable font size for sizing; font face ID %d, " "requested size %f\n", faceID, desiredSize); return NULL; } actualSize = (float)font->getSize(); } else { actualSize = desiredSize; } return font; } void FontManager::getPulseColor(const GLfloat *color, GLfloat *pulseColor) const { float pulseTime = (float)TimeKeeper::getCurrent().getSeconds(); // depth is how dark it should get (1.0 is to black) float pulseDepth = BZDBCache::pulseDepth; // rate is how fast it should pulsate (smaller is faster) float pulseRate = BZDBCache::pulseRate; float pulseFactor = fmodf(pulseTime, pulseRate) - pulseRate /2.0f; pulseFactor = fabsf(pulseFactor) / (pulseRate/2.0f); pulseFactor = pulseDepth * pulseFactor + (1.0f - pulseDepth); pulseColor[0] = color[0] * pulseFactor; pulseColor[1] = color[1] * pulseFactor; pulseColor[2] = color[2] * pulseFactor; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/ImageFont.cxx000066400000000000000000000131061200563112200170720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // Interface header #include "ImageFont.h" // System headers #include #include // Common implementation headers #include "bzfgl.h" #include "bzfio.h" #include "MediaFile.h" ImageFont::ImageFont() { for (int i = 0; i < MAX_TEXTURE_FONT_CHARS; i++) { fontMetrics[i].charWidth = -1; } size = -1; textureXSize = -1; textureYSize = -1; textureZStep = -1; numberOfCharacters = -1; } ImageFont::~ImageFont() { } int ImageFont::getSize() const { return size; } const char* ImageFont::getFaceName() const { return faceName.c_str(); } // keep a line counter for debugging static int line; /* read values in Key: Value form from font metrics (.fmt) files */ bool readKeyInt(OSFile &file, std::string expectedLeft, int &retval, bool newfile=false) { if (newfile) line = 0; const int expsize = int(expectedLeft.size()); std::string tmpBuf; // allow for blank lines with native or foreign linebreaks, comment lines while (tmpBuf.size() == 0 || tmpBuf[0] == '#' || tmpBuf[0] == 10 || tmpBuf[0] == 13) { tmpBuf = file.readLine(); line++; } if (tmpBuf.substr(0, expsize) == expectedLeft && tmpBuf[expsize]==':') { long int retvalue = strtol(tmpBuf.c_str() + expsize + 1, (char **) NULL, 10); if (retvalue < INT_MIN || retvalue > INT_MAX) return false; retval = (int) retvalue; return true; } else { logDebugMessage(2,"Unexpected line in font metrics file %s, line %d (expected %s)\n", file.getFileName().c_str(), line, expectedLeft.c_str()); return false; } } // read Char: "x" entry bool readLetter(OSFile &file, char expected) { const std::string expectedLeft = "Char:"; const int expsize = int(expectedLeft.size()); std::string tmpBuf; // allow for blank lines with native or foreign linebreaks, comment lines while (tmpBuf.size() == 0 || tmpBuf[0] == '#' || tmpBuf[0] == 10 || tmpBuf[0] == 13) { tmpBuf = file.readLine(); // keep a line counter line++; } if (tmpBuf.substr(0, expsize) == expectedLeft) { if (int(tmpBuf.size()) >= expsize+4 && tmpBuf[expsize+1]=='"' && tmpBuf[expsize+3]=='"' && tmpBuf[expsize+2]==expected) { return true; } else { logDebugMessage(2,"Unexpected character: %s, in font metrics file %s, line %d (expected \"%c\").\n", tmpBuf.c_str()+expsize, file.getFileName().c_str(), line, expected); return false; } } else { logDebugMessage(2,"Unexpected line in font metrics file %s, line %d (expected %s)\n", file.getFileName().c_str(), line, expectedLeft.c_str()); return false; } } bool ImageFont::load(OSFile &file) { std::string extension = file.getExtension(); if (extension=="") return false; texture = file.getFileName(); std::string::size_type underscore = texture.rfind('_'); if (underscore == std::string::npos) { logDebugMessage(1,"Unexpected font file name: %s, no _size found\n", file.getStdName().c_str()); return false; } faceName = texture.substr(0, underscore); size = strtol(texture.c_str() + underscore + 1, (char **)NULL, 10); if (!file.open("rb")) return false; if (!readKeyInt(file, "NumChars", numberOfCharacters, true)) return false; if (!readKeyInt(file, "TextureWidth", textureXSize)) return false; if (!readKeyInt(file, "TextureHeight", textureYSize)) return false; if (!readKeyInt(file, "TextZStep", textureZStep)) return false; // clamp the maximum char count if (numberOfCharacters > MAX_TEXTURE_FONT_CHARS) { logDebugMessage(1,"Too many characters (%i) in %s.\n", numberOfCharacters, file.getFileName().c_str()); numberOfCharacters = MAX_TEXTURE_FONT_CHARS; } int i; for (i = 0; i < numberOfCharacters; i++) { // check character if (!readLetter(file, i + 32)) return false; // read metrics if (!readKeyInt(file, "InitialDist", fontMetrics[i].initialDist)) return false; if (!readKeyInt(file, "Width", fontMetrics[i].charWidth)) return false; if (!readKeyInt(file, "Whitespace", fontMetrics[i].whiteSpaceDist)) return false; if (!readKeyInt(file, "StartX", fontMetrics[i].startX)) return false; if (!readKeyInt(file, "EndX", fontMetrics[i].endX)) return false; if (!readKeyInt(file, "StartY", fontMetrics[i].startY)) return false; if (!readKeyInt(file, "EndY", fontMetrics[i].endY)) return false; fontMetrics[i].fullWidth = fontMetrics[i].initialDist + fontMetrics[i].charWidth + fontMetrics[i].whiteSpaceDist; } file.close(); return (numberOfCharacters > 0); } float ImageFont::getStrLength(float scale, const char *str, int len) const { int charToUse = 0; float totalLen = 0; for (int i = 0; i < len; i++) { if (str[i] < 32) charToUse = 32; else if (str[i] > numberOfCharacters + 32) charToUse = 32; else charToUse = str[i]; charToUse -= 32; totalLen += (float)(fontMetrics[charToUse].fullWidth); } return totalLen * scale; } float ImageFont::getStrLength(float scale, const std::string &str) const { return getStrLength(scale, str.c_str(), str.size()); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/ImageFont.h000066400000000000000000000036061200563112200165230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _IMAGE_FONT_H_ #define _IMAGE_FONT_H_ /* common header */ #include "common.h" /* system headers */ #include /* interface headers */ #include "bzfgl.h" #include "OSFile.h" #define MAX_TEXTURE_FONT_CHARS (128) class ImageFont { public: ImageFont(); virtual ~ImageFont(); int getSize() const; const char* getFaceName() const; bool load(OSFile &file); virtual void build() = 0; virtual bool isBuilt() const = 0; virtual void filter(bool dofilter) = 0; virtual void drawString(float scale, GLfloat color[3], const char *str, int len) = 0; float getStrLength(float scale, const char *str, int len) const; float getStrLength(float scale, const std::string &str) const; virtual void free() = 0; protected: struct FontMetrics { int initialDist; int charWidth; int whiteSpaceDist; int fullWidth; // initialDist + charWidth + whiteSpaceDist int startX; int endX; int startY; int endY; }; FontMetrics fontMetrics[MAX_TEXTURE_FONT_CHARS]; std::string faceName; std::string texture; long int size; int textureXSize; int textureYSize; int textureZStep; int numberOfCharacters; private: // don't copy me ImageFont(const ImageFont&); ImageFont &operator=(const ImageFont&); }; #endif //_IMAGE_FONT_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/Makefile.am000066400000000000000000000006551200563112200165360ustar00rootroot00000000000000if CLIENT_INCLUDED noinst_LTLIBRARIES = lib3D.la endif AM_CPPFLAGS = $(CONF_CPPFLAGS) -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) MAINTAINERCLEANFILES = \ Makefile.in lib3D_la_LDFLAGS = -static lib3D_la_SOURCES = \ BitmapFont.cxx \ FontManager.cxx \ ImageFont.cxx \ TextureFont.cxx \ TextureManager.cxx \ BitmapFont.h \ ImageFont.h \ TextureFont.h EXTRA_DIST = \ README bzflag-2.4.2+ds1/src/3D/Makefile.in000066400000000000000000000412511200563112200165440ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/3D DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) lib3D_la_LIBADD = am_lib3D_la_OBJECTS = BitmapFont.lo FontManager.lo ImageFont.lo \ TextureFont.lo TextureManager.lo lib3D_la_OBJECTS = $(am_lib3D_la_OBJECTS) lib3D_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(lib3D_la_LDFLAGS) $(LDFLAGS) -o $@ @CLIENT_INCLUDED_TRUE@am_lib3D_la_rpath = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(lib3D_la_SOURCES) DIST_SOURCES = $(lib3D_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @CLIENT_INCLUDED_TRUE@noinst_LTLIBRARIES = lib3D.la AM_CPPFLAGS = $(CONF_CPPFLAGS) -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) MAINTAINERCLEANFILES = \ Makefile.in lib3D_la_LDFLAGS = -static lib3D_la_SOURCES = \ BitmapFont.cxx \ FontManager.cxx \ ImageFont.cxx \ TextureFont.cxx \ TextureManager.cxx \ BitmapFont.h \ ImageFont.h \ TextureFont.h EXTRA_DIST = \ README all: all-am .SUFFIXES: .SUFFIXES: .cxx .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/3D/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/3D/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done lib3D.la: $(lib3D_la_OBJECTS) $(lib3D_la_DEPENDENCIES) $(lib3D_la_LINK) $(am_lib3D_la_rpath) $(lib3D_la_OBJECTS) $(lib3D_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitmapFont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontManager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImageFont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextureFont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextureManager.Plo@am__quote@ .cxx.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/src/3D/README000066400000000000000000000001211200563112200153460ustar00rootroot00000000000000This directory contains generic 3D object, texture, and font management routines.bzflag-2.4.2+ds1/src/3D/TextureFont.cxx000066400000000000000000000114711200563112200175130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // BZFlag common header #include "common.h" // Interface headers #include "ImageFont.h" #include "TextureFont.h" // System headers #include #include // Common implementation headers #include "bzfgl.h" #include "bzfio.h" #include "OpenGLGState.h" // Local implementation headers #include "TextureManager.h" TextureFont::TextureFont() { for (int i = 0; i < MAX_TEXTURE_FONT_CHARS; i++) { listIDs[i] = INVALID_GL_LIST_ID; } textureID = -1; } TextureFont::~TextureFont() { for (int i = 0; i < MAX_TEXTURE_FONT_CHARS; i++) { if (listIDs[i] != INVALID_GL_LIST_ID) { glDeleteLists(listIDs[i], 1); listIDs[i] = INVALID_GL_LIST_ID; } } } void TextureFont::build(void) { preLoadLists(); } void TextureFont::preLoadLists() { if (texture.size() < 1) { logDebugMessage(2,"Font %s does not have an associated texture name, not loading\n", texture.c_str()); return; } // load up the texture TextureManager &tm = TextureManager::instance(); std::string textureAndDir = "fonts/" + texture; textureID = tm.getTextureID(textureAndDir.c_str()); if (textureID == -1) { logDebugMessage(2,"Font texture %s has invalid ID\n", texture.c_str()); return; } logDebugMessage(4,"Font %s (face %s) has texture ID %d\n", texture.c_str(), faceName.c_str(), textureID); // fonts are usually pixel aligned tm.setTextureFilter(textureID, OpenGLTexture::Nearest); for (int i = 0; i < numberOfCharacters; i++) { if (listIDs[i] != INVALID_GL_LIST_ID) { glDeleteLists(listIDs[i], 1); listIDs[i] = INVALID_GL_LIST_ID; // make it a habit } listIDs[i] = glGenLists(1); glNewList(listIDs[i], GL_COMPILE); { glTranslatef((float)fontMetrics[i].initialDist, 0, 0); float fFontY = (float)(fontMetrics[i].endY - fontMetrics[i].startY); float fFontX = (float)(fontMetrics[i].endX - fontMetrics[i].startX); glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, 1.0f); glTexCoord2f((float)fontMetrics[i].startX / (float)textureXSize, 1.0f - (float)fontMetrics[i].startY / (float)textureYSize); glVertex3f(0.0f, fFontY, 0.0f); glTexCoord2f((float)fontMetrics[i].startX / (float)textureXSize, 1.0f - (float)fontMetrics[i].endY / (float)textureYSize); glVertex3f(0.0f, 0.0f, 0.0f); glTexCoord2f((float)fontMetrics[i].endX / (float)textureXSize, 1.0f - (float)fontMetrics[i].endY / (float)textureYSize); glVertex3f(fFontX, 0.0f, 0.0f); glTexCoord2f((float)fontMetrics[i].endX / (float)textureXSize, 1.0f - (float)fontMetrics[i].startY / (float)textureYSize); glVertex3f(fFontX, fFontY, 0.0f); glEnd(); // this plus the initial 'initialDist' equal 'fullWidth' float fFontPostX = (float)(fontMetrics[i].charWidth + fontMetrics[i].whiteSpaceDist); glTranslatef(fFontPostX, 0.0f, 0.0f); } glEndList(); } // create GState OpenGLGStateBuilder builder(gstate); builder.setTexture(textureID); builder.setBlending(); builder.setAlphaFunc(); gstate = builder.getState(); } void TextureFont::free(void) { textureID = -1; } void TextureFont::filter(bool dofilter) { TextureManager &tm = TextureManager::instance(); if (textureID >= 0) { const OpenGLTexture::Filter type = dofilter ? OpenGLTexture::Max : OpenGLTexture::Nearest; tm.setTextureFilter(textureID, type); } } void TextureFont::drawString(float scale, GLfloat color[4], const char *str, int len) { if (!str) return; if (textureID == -1) preLoadLists(); if (textureID == -1) return; gstate.setState(); TextureManager &tm = TextureManager::instance(); if (!tm.bind(textureID)) return; if (color[0] >= 0) glColor4fv(color); glPushMatrix(); glScalef(scale, scale, 1); glPushMatrix(); int charToUse = 0; for (int i = 0; i < len; i++) { const char space = ' '; // decimal 32 if (str[i] < space) charToUse = space; else if (str[i] > (numberOfCharacters + space)) charToUse = space; else charToUse = str[i]; charToUse -= space; if (charToUse == 0) glTranslatef((float)(fontMetrics[charToUse].fullWidth), 0.0f, 0.0f); else glCallList(listIDs[charToUse]); } glPopMatrix(); if (color[0] >= 0) glColor4f(1, 1, 1, 1); glPopMatrix(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/TextureFont.h000066400000000000000000000024051200563112200171350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _TEXTURE_FONT_H_ #define _TEXTURE_FONT_H_ #ifdef _MSC_VER #pragma warning(disable : 4786) // Disable warning message #endif #include "bzfgl.h" #include "ImageFont.h" #include "OpenGLGState.h" class TextureFont : public ImageFont { public: TextureFont(); virtual ~TextureFont(); virtual void build(); virtual bool isBuilt() const {return textureID != -1;} virtual void filter(bool dofilter); virtual void drawString(float scale, GLfloat color[4], const char *str, int len); virtual void free(); private: void preLoadLists(); unsigned int listIDs[MAX_TEXTURE_FONT_CHARS]; int textureID; OpenGLGState gstate; }; #endif //_TEXTURE_FONT_H_ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/3D/TextureManager.cxx000066400000000000000000000243431200563112200201610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786 ) #endif // BZFlag common header #include "common.h" // interface headers #include "TextureManager.h" // system headers #include #include // common implementation headers #include "bzfgl.h" #include "TextUtils.h" #include "global.h" #include "MediaFile.h" #include "ErrorHandler.h" #include "OpenGLTexture.h" #include "OSFile.h" /*const int NO_VARIANT = (-1); */ // initialize the singleton template <> TextureManager* Singleton::_instance = (TextureManager*)0; static int noiseProc(ProcTextureInit &init); ProcTextureInit procLoader[1]; TextureManager::TextureManager() { // fill out the standard proc textures procLoader[0].name = "noise"; procLoader[0].filter = OpenGLTexture::Nearest; procLoader[0].proc = noiseProc; lastImageID = -1; lastBoundID = -1; int i, numTextures; numTextures = countof(procLoader); for (i = 0; i < numTextures; i++) { procLoader[i].manager = this; procLoader[i].proc(procLoader[i]); } } TextureManager::~TextureManager() { // we are done remove all textures for (TextureNameMap::iterator it = textureNames.begin(); it != textureNames.end(); ++it) { ImageInfo &tex = it->second; if (tex.texture != NULL) { delete tex.texture; } } textureNames.clear(); textureIDs.clear(); } int TextureManager::getTextureID( const char* name, bool reportFail ) { if (!name) { logDebugMessage(2,"Could not get texture ID; no provided name\n"); return -1; } // see if we have the texture TextureNameMap::iterator it = textureNames.find(name); if (it != textureNames.end()) { return it->second.id; } else { // we don't have it so try and load it OSFile osFilename(name); // convert to native format const std::string filename = osFilename.getOSName(); FileTextureInit texInfo; texInfo.name = filename; texInfo.filter = OpenGLTexture::LinearMipmapLinear; OpenGLTexture *image = loadTexture(texInfo, reportFail); if (!image) { logDebugMessage(2,"Image not found or unloadable: %s\n", name); return -1; } return addTexture(name, image); } return -1; } bool TextureManager::isLoaded(const std::string& name) { TextureNameMap::iterator it = textureNames.find(name); if (it == textureNames.end()) { return false; } return true; } bool TextureManager::removeTexture(const std::string& name) { TextureNameMap::iterator it = textureNames.find(name); if (it == textureNames.end()) { return false; } // delete the OpenGLTexture ImageInfo& info = it->second; delete info.texture; info.texture = NULL; // clear the maps textureIDs.erase(info.id); textureNames.erase(name); logDebugMessage(2,"TextureManager::removed: %s\n", name.c_str()); return true; } bool TextureManager::reloadTextures() { TextureNameMap::iterator it = textureNames.begin(); while (it != textureNames.end()) { reloadTextureImage(it->first); ++it; } return true; } bool TextureManager::reloadTextureImage(const std::string& name) { TextureNameMap::iterator it = textureNames.find(name); if (it == textureNames.end()) { return false; } ImageInfo& info = it->second; OpenGLTexture* oldTex = info.texture; OpenGLTexture::Filter filter = oldTex->getFilter(); // make the new texture object FileTextureInit fileInit; fileInit.filter = OpenGLTexture::LinearMipmapLinear; fileInit.name = name; OpenGLTexture* newTex = loadTexture(fileInit, false); if (newTex == NULL) { // couldn't reload, leave it alone return false; } // name and id fields are not changed newTex->setFilter(filter); info.texture = newTex; info.alpha = newTex->hasAlpha(); info.x = newTex->getWidth(); info.y = newTex->getHeight(); delete oldTex; return true; } bool TextureManager::bind ( int id ) { TextureIDMap::iterator it = textureIDs.find(id); if (it == textureIDs.end()) { logDebugMessage(1,"Unable to bind texture (by id): %d\n", id); return false; } if (id != lastBoundID) { it->second->texture->execute(); lastBoundID = id; } return true; } bool TextureManager::bind ( const char* name ) { std::string nameStr = name; TextureNameMap::iterator it = textureNames.find(nameStr); if (it == textureNames.end()) { logDebugMessage(1,"Unable to bind texture (by name): %s\n", name); return false; } int id = it->second.id; if (id != lastBoundID) { it->second.texture->execute(); lastBoundID = id; } return true; } OpenGLTexture::Filter TextureManager::getMaxFilter ( void ) { return OpenGLTexture::getMaxFilter(); } std::string TextureManager::getMaxFilterName ( void ) { OpenGLTexture::Filter maxFilter = OpenGLTexture::getMaxFilter(); std::string name = OpenGLTexture::getFilterName(maxFilter); return name; } void TextureManager::setMaxFilter(std::string filter) { const char** names = OpenGLTexture::getFilterNames(); for (int i = 0; i < OpenGLTexture::getFilterCount(); i++) { if (filter == names[i]) { setMaxFilter((OpenGLTexture::Filter) i); return; } } logDebugMessage(1,"setMaxFilter(): bad filter = %s\n", filter.c_str()); } void TextureManager::setMaxFilter (OpenGLTexture::Filter filter ) { OpenGLTexture::setMaxFilter(filter); updateTextureFilters(); return; } void TextureManager::updateTextureFilters() { // reset all texture filters to the current maxFilter TextureNameMap::iterator itr = textureNames.begin(); while (itr != textureNames.end()) { OpenGLTexture* texture = itr->second.texture; // getting, then setting re-clamps the filter level OpenGLTexture::Filter current = texture->getFilter(); texture->setFilter(current); ++itr; } // rebuild proc textures for (int i = 0; i < (int)countof(procLoader); i++) { procLoader[i].manager = this; procLoader[i].proc(procLoader[i]); } } float TextureManager::GetAspectRatio ( int id ) { TextureIDMap::iterator it = textureIDs.find(id); if (it == textureIDs.end()) return 0.0; return (float)it->second->y/(float)it->second->x; } const ImageInfo& TextureManager::getInfo ( int id ) { static ImageInfo crapInfo; crapInfo.id = -1; TextureIDMap::iterator it = textureIDs.find(id); if (it == textureIDs.end()) return crapInfo; return *(it->second); } const ImageInfo& TextureManager::getInfo ( const char* name ) { static ImageInfo crapInfo; crapInfo.id = -1; std::string nameStr = name; TextureNameMap::iterator it = textureNames.find(nameStr); if (it == textureNames.end()) return crapInfo; return it->second; } bool TextureManager::getColorAverages(int texId, float rgba[4], bool factorAlpha) const { TextureIDMap::const_iterator it = textureIDs.find(texId); if (it == textureIDs.end()) { logDebugMessage(1,"getColorAverages: Unable to find texture (by id): %d\n", texId); return false; } return it->second->texture->getColorAverages(rgba, factorAlpha); } int TextureManager::addTexture( const char* name, OpenGLTexture *texture ) { if (!name || !texture) return -1; // if the texture already exists kill it // this is why IDs are way better than objects for this stuff TextureNameMap::iterator it = textureNames.find(name); if (it != textureNames.end()) { logDebugMessage(3,"Texture %s already exists, overwriting\n", name); textureIDs.erase(it->second.id); delete it->second.texture; } ImageInfo info; info.name = name; info.texture = texture; info.id = ++lastImageID; info.alpha = texture->hasAlpha(); info.x = texture->getWidth(); info.y = texture->getHeight(); textureNames[name] = info; textureIDs[info.id] = &textureNames[name]; logDebugMessage(4,"Added texture %s: id %d\n", name, info.id); return info.id; } OpenGLTexture* TextureManager::loadTexture(FileTextureInit &init, bool reportFail) { int width, height; unsigned char* image = MediaFile::readImage(init.name, &width, &height); if (!image) { if (reportFail) { std::vector args; args.push_back(init.name); printError("cannot load texture: {1}", &args); } return NULL; } OpenGLTexture *texture = new OpenGLTexture(width, height, image, init.filter, true); delete[] image; return texture; } int TextureManager::newTexture(const char* name, int x, int y, unsigned char* data, OpenGLTexture::Filter filter, bool repeat, int format) { return addTexture(name, new OpenGLTexture(x, y, data, filter, repeat, format)); } void TextureManager::setTextureFilter(int texId, OpenGLTexture::Filter filter) { TextureIDMap::iterator it = textureIDs.find(texId); if (it == textureIDs.end()) { logDebugMessage(1,"setTextureFilter() Couldn't find texid: %i\n", texId); return; } ImageInfo& image = *(it->second); OpenGLTexture* texture = image.texture; texture->setFilter(filter); return; } OpenGLTexture::Filter TextureManager::getTextureFilter(int texId) { TextureIDMap::iterator it = textureIDs.find(texId); if (it == textureIDs.end()) { logDebugMessage(1,"getTextureFilter() Couldn't find texid: %i\n", texId); return OpenGLTexture::Max; } ImageInfo& image = *(it->second); OpenGLTexture* texture = image.texture; return texture->getFilter(); } /* --- Procs --- */ int noiseProc(ProcTextureInit &init) { int noizeSize = 128; const int size = 4 * noizeSize * noizeSize; unsigned char* noise = new unsigned char[size]; for (int i = 0; i < size; i += 4 ) { unsigned char n = (unsigned char)floor(256.0 * bzfrand()); noise[i+0] = n; noise[i+1] = n; noise[i+2] = n; noise[i+3] = n; } int texture = init.manager->newTexture(init.name.c_str(), noizeSize, noizeSize, noise, init.filter); delete[] noise; return texture; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/Makefile.am000066400000000000000000000007351200563112200162670ustar00rootroot00000000000000if CLIENT_INCLUDED BZFLAG_DIR = bzflag else BZFLAG_DIR = endif if SERVER_INCLUDED BZFS_DIR = bzfs else BZFS_DIR = endif if BZADMIN_INCLUDED BZADMIN_DIR = bzadmin else BZADMIN_DIR = endif # "other" must be near the top, if not first, for maintainer-clean to work SUBDIRS = \ other \ 3D \ common \ net \ game \ geometry \ obstacle \ ogl \ scene \ platform \ mediafile \ date \ ${BZFS_DIR} \ ${BZFLAG_DIR} \ ${BZADMIN_DIR} MAINTAINERCLEANFILES = \ Makefile.in bzflag-2.4.2+ds1/src/Makefile.in000066400000000000000000000446321200563112200163040ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = other 3D common net game geometry obstacle ogl scene \ platform mediafile date bzfs bzflag bzadmin DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @CLIENT_INCLUDED_FALSE@BZFLAG_DIR = @CLIENT_INCLUDED_TRUE@BZFLAG_DIR = bzflag @SERVER_INCLUDED_FALSE@BZFS_DIR = @SERVER_INCLUDED_TRUE@BZFS_DIR = bzfs @BZADMIN_INCLUDED_FALSE@BZADMIN_DIR = @BZADMIN_INCLUDED_TRUE@BZADMIN_DIR = bzadmin # "other" must be near the top, if not first, for maintainer-clean to work SUBDIRS = \ other \ 3D \ common \ net \ game \ geometry \ obstacle \ ogl \ scene \ platform \ mediafile \ date \ ${BZFS_DIR} \ ${BZFLAG_DIR} \ ${BZADMIN_DIR} MAINTAINERCLEANFILES = \ Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/src/bzadmin/000077500000000000000000000000001200563112200156525ustar00rootroot00000000000000bzflag-2.4.2+ds1/src/bzadmin/BZAdminClient.cxx000066400000000000000000000461741200563112200210350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "BZAdminClient.h" /* system implementation headers */ #ifdef HAVE_CMATH # include #else # include #endif #include #include /* common implementation headers */ #include "BZAdminUI.h" #include "StateDatabase.h" #include "TextUtils.h" #include "version.h" #include "Team.h" #include "ServerList.h" #include "ErrorHandler.h" #include "cURLManager.h" StartupInfo startupInfo; BZAdminClient::BZAdminClient(BZAdminUI* bzInterface) : myTeam(ObserverTeam), sLink(Address(startupInfo.serverName), startupInfo.serverPort), valid(false), ui(bzInterface) { if (sLink.getState() != ServerLink::Okay) { switch (sLink.getState()) { case ServerLink::BadVersion: { static char versionError[] = "Incompatible server version XXXXXXXX"; // Flawfinder: ignore strncpy(versionError + sizeof(versionError) - 8 - 1, sLink.getVersion(), 8); std::cout << versionError; break; } case ServerLink::Refused: { std::string banMessage = "Server Refused connection due to ban: "; banMessage += sLink.getRejectionMessage(); std::cout << banMessage; break; } case ServerLink::Rejected: std::cout << "Game is full or over. Try again later."; break; case ServerLink::SocketError: std::cout << "Error connecting to server."; break; case ServerLink::CrippledVersion: std::cout << "Cannot connect to full version server."; break; default: std::cout << "Internal error connecting to server."; break; } std::cout << std::endl; return; } if ((startupInfo.token[0] == '\0') && (startupInfo.password[0] != '\0')) { // won't really output anything, just gets token outputServerList(); } sLink.sendEnter(TankPlayer, myTeam, startupInfo.callsign, "bzadmin", startupInfo.token); if (sLink.getState() != ServerLink::Okay) { std::cerr << "Rejected." << std::endl; return; } std::string reason; uint16_t code, rejcode; if (sLink.readEnter (reason, code, rejcode)) { valid = true; } else { std::cerr << reason << std::endl; } // tell BZDB to shut up, we can't have debug data printed to stdout BZDB.setDebug(false); // set a default message mask showMessageType(MsgAddPlayer); showMessageType(MsgAdminInfo); showMessageType(MsgKilled); showMessageType(MsgMessage); showMessageType(MsgNewRabbit); showMessageType(MsgPause); showMessageType(MsgRemovePlayer); showMessageType(MsgSuperKill); // initialise the colormap colorMap[NoTeam] = Yellow; colorMap[RogueTeam] = Yellow; colorMap[RedTeam] = Red; colorMap[GreenTeam] = Green; colorMap[BlueTeam] = Blue; colorMap[PurpleTeam] = Purple; colorMap[ObserverTeam] = Cyan; // initialise the msg type map // FIXME MsgPlayerInfo msgTypeMap["bzdb"] = MsgSetVar; msgTypeMap["chat"] = MsgMessage; msgTypeMap["admin"] = MsgAdminInfo; msgTypeMap["join"] = MsgAddPlayer; msgTypeMap["kill"] = MsgKilled; msgTypeMap["leave"] = MsgRemovePlayer; msgTypeMap["pause"] = MsgPause; msgTypeMap["ping"] = MsgLagPing; msgTypeMap["rabbit"] = MsgNewRabbit; msgTypeMap["score"] = MsgScore; msgTypeMap["spawn"] = MsgAlive; msgTypeMap["time"] = MsgTimeUpdate; msgTypeMap["over"] = MsgScoreOver; } PlayerId BZAdminClient::getMyId() { return sLink.getId(); } BZAdminClient::ServerCode BZAdminClient::checkMessage() { uint16_t code, len; char inbuf[MaxPacketLen]; PlayerIdMap::iterator iter; // read until we have a package, or until we have waited 100 ms if (sLink.read(code, len, inbuf, 100) == 1) { lastMessage.first = ""; lastMessage.second = Default; void* vbuf = inbuf; PlayerId p; PlayerIdMap::const_iterator it; std::string victimName, killerName; Address a; switch (code) { case MsgNewRabbit: if (messageMask[MsgNewRabbit]) { vbuf = nboUnpackUByte(vbuf, p); if (p != NoPlayer) lastMessage.first = std::string("*** '") + players[p].name + "' is now the rabbit."; } break; case MsgPause: if (messageMask[MsgPause]) { uint8_t paused; vbuf = nboUnpackUByte(vbuf, p); vbuf = nboUnpackUByte(vbuf, paused); lastMessage.first = std::string("*** '") + players[p].name + "': " + (paused ? "paused" : "resumed") + "."; } break; case MsgAlive: if (messageMask[MsgAlive]) { vbuf = nboUnpackUByte(vbuf, p); lastMessage.first = std::string("*** '") + players[p].name + "' has respawned."; } break; case MsgLagPing: if (messageMask[MsgLagPing]) lastMessage.first = "*** Received lag ping from server."; break; case MsgSetVar: // code stolen from playing.cxx uint16_t numVars; uint8_t nameLen, valueLen; // Flawfinder: ignore char name[MaxPacketLen]; // Flawfinder: ignore char value[MaxPacketLen]; int i; vbuf = nboUnpackUShort(vbuf, numVars); for (i = 0; i < numVars; i++) { vbuf = nboUnpackUByte(vbuf, nameLen); vbuf = nboUnpackString(vbuf, name, nameLen); name[nameLen] = '\0'; vbuf = nboUnpackUByte(vbuf, valueLen); vbuf = nboUnpackString(vbuf, value, valueLen); value[valueLen] = '\0'; BZDB.set(name, value); BZDB.setPersistent(name, false); BZDB.setPermission(name, StateDatabase::Locked); } if (messageMask[MsgSetVar]) { lastMessage.first = std::string("*** Received BZDB update, ") + TextUtils::format("%d", numVars) + " variable" + (numVars == 1 ? "" : "s") + " updated."; } break; case MsgAddPlayer: uint16_t team, type, wins, losses, tks; // Flawfinder: ignore char callsign[CallSignLen]; // Flawfinder: ignore char motto[MottoLen]; vbuf = nboUnpackUByte(vbuf, p); vbuf = nboUnpackUShort(vbuf, type); vbuf = nboUnpackUShort(vbuf, team); vbuf = nboUnpackUShort(vbuf, wins); vbuf = nboUnpackUShort(vbuf, losses); vbuf = nboUnpackUShort(vbuf, tks); vbuf = nboUnpackString(vbuf, callsign, CallSignLen); vbuf = nboUnpackString(vbuf, motto, MottoLen); players[p].name = callsign; players[p].team = TeamColor(team); players[p].wins = wins; players[p].losses = losses; players[p].tks = tks; players[p].isRegistered = false; players[p].isVerified = false; players[p].isAdmin = false; if (ui != NULL) ui->addedPlayer(p); // If you are an admin, then MsgAdminInfo will output the message if (messageMask[MsgAddPlayer] && !players[getMyId()].isAdmin) { Team temp; std::string joinMsg = std::string("*** \'") + callsign + "\' joined the game as " + temp.getName(players[p].team) + "."; lastMessage.first = joinMsg; } break; case MsgRemovePlayer: vbuf = nboUnpackUByte(vbuf, p); if (ui != NULL) ui->removingPlayer(p); if (messageMask[MsgRemovePlayer]) { lastMessage.first = std::string("*** '") + players[p].name + "' left the game."; } players.erase(p); break; case MsgPlayerInfo: uint8_t numPlayers; vbuf = nboUnpackUByte(vbuf, numPlayers); for (i = 0; i < numPlayers; ++i) { vbuf = nboUnpackUByte(vbuf, p); uint8_t info; // parse player info bitfield vbuf = nboUnpackUByte(vbuf, info); players[p].isAdmin = ((info & IsAdmin) != 0); players[p].isRegistered = ((info & IsRegistered) != 0); players[p].isVerified = ((info & IsVerified) != 0); } break; case MsgAdminInfo: uint8_t numIPs; uint8_t tmp; vbuf = nboUnpackUByte(vbuf, numIPs); if(numIPs > 1){ for (i = 0; i < numIPs; ++i) { vbuf = nboUnpackUByte(vbuf, tmp); vbuf = nboUnpackUByte(vbuf, p); vbuf = a.unpack(vbuf); players[p].ip = a.getDotNotation(); if ((ui != NULL) && messageMask[MsgAdminInfo]){ ui->outputMessage("*** IPINFO: " + players[p].name + " from " + players[p].ip, Default); } } } //Alternative to the MsgAddPlayer message else if(numIPs == 1){ vbuf = nboUnpackUByte(vbuf, tmp); vbuf = nboUnpackUByte(vbuf, p); vbuf = a.unpack(vbuf); players[p].ip = a.getDotNotation(); Team temp; if (messageMask[MsgAdminInfo]){ std::string joinMsg = std::string("*** \'") + players[p].name + "\' joined the game as " + temp.getName(players[p].team) + " from " + players[p].ip + "."; lastMessage.first = joinMsg; } } break; case MsgScoreOver: if (messageMask[MsgScoreOver]) { PlayerId id; uint16_t _team; vbuf = nboUnpackUByte(vbuf, id); vbuf = nboUnpackUShort(vbuf, _team); it = players.find(id); victimName = (it != players.end() ? it->second.name : ""); if (_team != (uint16_t)NoTeam) { Team temp; victimName = temp.getName((TeamColor)_team); } lastMessage.first = std::string("*** \'") + victimName + "\' won the game."; } break; case MsgTimeUpdate: if (messageMask[MsgTimeUpdate]) { uint32_t timeLeft; vbuf = nboUnpackUInt(vbuf, timeLeft); if (timeLeft == 0) lastMessage.first = "*** Time Expired."; else if (timeLeft == ~0u) lastMessage.first = "*** Paused."; else lastMessage.first = std::string("*** ") + TextUtils::format("%u", timeLeft) + " seconds remaining."; } break; case MsgKilled: if (messageMask[MsgKilled]) { PlayerId victim, killer; FlagType* flagType; int16_t shotId, reason; vbuf = nboUnpackUByte(vbuf, victim); vbuf = nboUnpackUByte(vbuf, killer); vbuf = nboUnpackShort(vbuf, reason); vbuf = nboUnpackShort(vbuf, shotId); vbuf = FlagType::unpack(vbuf, flagType); if (reason == PhysicsDriverDeath) { int32_t inPhyDrv; vbuf = nboUnpackInt(vbuf, inPhyDrv); } // find the player names and build a kill message string it = players.find(victim); victimName = (it != players.end() ? it->second.name : ""); it = players.find(killer); killerName = (it != players.end() ? it->second.name : ""); lastMessage.first = std::string("*** ") + "'" + victimName + "' "; if (killer == victim) { lastMessage.first = lastMessage.first + "blew myself up."; } else { lastMessage.first = lastMessage.first + "destroyed by '" + killerName + "'."; } } break; case MsgSuperKill: return Superkilled; case MsgScore: uint8_t numScores; vbuf = nboUnpackUByte(vbuf, numScores); for (i = 0; i < numScores; i++) { uint16_t winners, loosers, teamkillers; vbuf = nboUnpackUByte(vbuf, p); vbuf = nboUnpackUShort(vbuf, winners); vbuf = nboUnpackUShort(vbuf, loosers); vbuf = nboUnpackUShort(vbuf, teamkillers); if ((iter = players.find(p)) != players.end()) { iter->second.wins = winners; iter->second.losses = loosers; iter->second.tks = teamkillers; } } if (messageMask[MsgScore]) { lastMessage.first = std::string("*** Received score update, score for ")+ TextUtils::format("%d", numScores) + " player" + (numScores == 1 ? "s" : "") + " updated."; } break; case MsgMessage: // unpack the message header PlayerId src; PlayerId dst; uint8_t mtype; PlayerId me = sLink.getId(); vbuf = nboUnpackUByte(vbuf, src); vbuf = nboUnpackUByte(vbuf, dst); vbuf = nboUnpackUByte(vbuf, mtype); // Only bother processing the message if we know how to handle it if (MessageType(mtype) != ChatMessage && MessageType(mtype) != ActionMessage) break; // format the message depending on src and dst TeamColor dstTeam = (LastRealPlayer < dst && dst <= FirstTeam ? TeamColor(FirstTeam - dst) : NoTeam); if (messageMask[MsgMessage]) { lastMessage.first = formatMessage((char*)vbuf, MessageType(mtype), src, dst, dstTeam, me); PlayerIdMap::const_iterator iterator = players.find(src); lastMessage.second = (iterator == players.end() ? colorMap[NoTeam] : colorMap[iterator->second.team]); } break; } if (ui != NULL) ui->handleNewPacket(code); return GotMessage; } if (sLink.getState() != ServerLink::Okay) { if (ui != NULL) ui->outputMessage("--- ERROR: Communication error", Red); return CommError; } return NoMessage; } std::pair BZAdminClient::getLastMessage() const { return lastMessage; } PlayerIdMap& BZAdminClient::getPlayers() { return players; } bool BZAdminClient::isValid() const { return valid; } void BZAdminClient::outputServerList() const { if (ui) ui->outputMessage(std::string("Server List:"), Yellow); ServerList serverList; serverList.startServerPings(&startupInfo); // wait no more than 20 seconds for the list server for (int i = 0; i < 20; i++) { if (!serverList.searchActive() && serverList.serverFound()) { break; } if (ui) { if (!serverList.serverFound()) { ui->outputMessage(std::string("...waiting on the list server..."), Yellow); } else { ui->outputMessage(TextUtils::format("...retrieving list of servers... (found %d)", serverList.size()), Yellow); } } serverList.checkEchos(&startupInfo); cURLManager::perform(); TimeKeeper::sleep(1.0); } // what is your final answer? serverList.checkEchos(&startupInfo); if (ui) { std::vector servers = serverList.getServers(); for (std::vector::const_iterator server = servers.begin(); server != servers.end(); ++server) { ui->outputMessage(std::string(" ") + server->description, Yellow); } ui->outputMessage(std::string("End Server List."), Yellow); } return; } void BZAdminClient::runLoop() { std::string cmd; std::map::iterator iter; ServerCode what(NoMessage); while (true) { what = checkMessage(); if (what == Superkilled || what == CommError) break; if (ui != NULL && ui->checkCommand(cmd)) { if (cmd == "/quit") break; else if (cmd.substr(0, 6) == "/show ") { if ((iter = msgTypeMap.find(cmd.substr(6))) == msgTypeMap.end()) { ui->outputMessage(std::string("--- ERROR: ") + cmd.substr(6) + " is an unknown message type", Red); } else { showMessageType(cmd.substr(6)); ui->outputMessage(std::string("--- Will now show messages of the ") + "type " + cmd.substr(6), Yellow); } } else if (cmd.substr(0, 6) == "/hide ") { if ((iter = msgTypeMap.find(cmd.substr(6))) == msgTypeMap.end()) { ui->outputMessage(std::string("--- ERROR: ") + cmd.substr(6) + " is an unknown message type", Red); } else { ignoreMessageType(cmd.substr(6)); ui->outputMessage(std::string("--- Will now hide messages of the ") + "type " + cmd.substr(6), Yellow); } } else if (cmd == "/list") { outputServerList(); } else if (cmd != "") sendMessage(cmd, ui->getTarget()); } } // why did we leave the loop? switch (what) { case Superkilled: lastMessage.first = "--- ERROR: Server forced disconnect"; lastMessage.second = Red; break; case CommError: lastMessage.first = "--- ERROR: Connection to server lost"; lastMessage.second = Red; break; default: waitForServer(); } } void BZAdminClient::sendMessage(const std::string& msg, PlayerId target) { // local commands: // /set lists all BZDB variables if (msg == "/set") { if (ui != NULL) BZDB.iterate(listSetVars, this); return; } // Flawfinder: ignore char buffer[MessageLen]; // Flawfinder: ignore char buffer2[1 + MessageLen]; void* buf = buffer2; buf = nboPackUByte(buf, target); // Flawfinder: ignore strncpy(buffer, msg.c_str(), MessageLen - 1); buffer[MessageLen - 1] = '\0'; nboPackString(buffer2 + 1, buffer, MessageLen); sLink.send(MsgMessage, sizeof(buffer2), buffer2); } std::string BZAdminClient::formatMessage(const std::string& msg, const MessageType type, PlayerId src, PlayerId dst, TeamColor dstTeam, PlayerId me) { std::string formatted = " "; // get sender and receiver const std::string srcName = (src == ServerPlayer ? "SERVER" : (players.count(src) ? players[src].name : "(UNKNOWN)")); const std::string dstName = (players.count(dst) ? players[dst].name : "(UNKNOWN)"); // direct message to or from me if (dst == me || players.count(dst)) { if (!(src == me && dst == me)) { if (src == me) { if (type == ActionMessage) { formatted += "[->" + msg + "]"; } else { formatted += "[->" + dstName + "] " + msg; } } else { if (type == ActionMessage) { formatted += "[" + msg + "->]"; } else { formatted += "[" + srcName + "->] " + msg; } } } else { formatted += msg; } } // public or admin or team message else { if (dst == AdminPlayers) formatted += "[Admin] "; else if (dstTeam != NoTeam) formatted += "[Team] "; formatted += srcName; if (type != ActionMessage) formatted += ":"; formatted += " "; formatted += msg; } return formatted; } void BZAdminClient::setUI(BZAdminUI* bzInterface) { ui = bzInterface; } void BZAdminClient::waitForServer() { // we need to know that the server has processed all our messages // send a private message to ourself and wait for it to come back // this assumes that the order of messages isn't changed along the way bool tmp = messageMask[MsgMessage]; messageMask[MsgMessage] = true; PlayerId me = sLink.getId(); if (sLink.getState() == ServerLink::Okay) { sendMessage("bzadminping", me); std::string expected = formatMessage("bzadminping", ChatMessage, me, me, NoTeam, me); std::string noTalk = formatMessage("We're sorry, you are not allowed to talk!", ChatMessage, ServerPlayer, me, NoTeam, me); BZAdminUI* tmpUI = ui; ui = NULL; do { checkMessage(); } while (lastMessage.first != expected && lastMessage.first != noTalk); ui = tmpUI; } messageMask[MsgMessage] = tmp; } void BZAdminClient::ignoreMessageType(uint16_t type) { messageMask[type] = false; } void BZAdminClient::showMessageType(uint16_t type) { messageMask[type] = true; } void BZAdminClient::ignoreMessageType(std::string type) { ignoreMessageType(msgTypeMap[type]); } void BZAdminClient::showMessageType(std::string type) { showMessageType(msgTypeMap[type]); } void BZAdminClient::listSetVars(const std::string& name, void* thisObject) { //Flawfinder: ignore char message[MessageLen]; if (BZDB.getPermission(name) == StateDatabase::Locked) { // Flawfinder: ignore snprintf(message, sizeof(message), "/set %s %f", name.c_str(), BZDB.eval(name)); ((BZAdminClient*)thisObject)->ui->outputMessage(message, Default); } } const std::map& BZAdminClient::getMessageTypeMap() const { return msgTypeMap; } bool BZAdminClient::getFilterStatus(uint16_t msgType) const { std::map::const_iterator iter = messageMask.find(msgType); if (iter == messageMask.end()) return false; else return iter->second; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/BZAdminClient.h000066400000000000000000000141671200563112200204570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZADMINCLIENT_H #define BZADMINCLIENT_H /* global interface headers */ #include "common.h" /* system interface headers */ #include #include #include "PlayerInfo.h" #include "colors.h" #include "ServerLink.h" #include "UIMap.h" #include "StartupInfo.h" class BZAdminUI; extern StartupInfo startupInfo; /** This class is a client that connects to a BZFlag server and has functions for sending and receiving messages. If you give it a pointer to a BZAdminUI in the constructor it will use that UI for communication with the user. */ class BZAdminClient { public: /** These values may be returned by getServerString(). */ enum ServerCode { GotMessage, NoMessage, Superkilled, CommError }; /** A default constructor. It tries to connect to the server at host:port. If it doesn't succeed, calls to isValid() will return false. */ BZAdminClient(BZAdminUI* bzInterface = NULL); /** Formats an incoming message. */ std::string formatMessage(const std::string& msg, const MessageType type, PlayerId src, PlayerId dst, TeamColor dstTeam, PlayerId me); /** Return the PlayerId that this client has been assigned by the server. */ PlayerId getMyId(); /** Returns a reference to a @c PlayerIdMap containing the players in the game. */ PlayerIdMap& getPlayers(); /** Checks for new packets from the server, ignores them or stores a text message in @c str. Tells @c ui about new or removed players. Returns 0 if no interesting packets have arrived, 1 if a message has been stored in @c str, negative numbers for errors. A color suggestion will be stored in @c colorCode. */ ServerCode checkMessage(); /** Returns the std::string that the client built from the last received message. */ std::pair getLastMessage() const; /** This function returns @c true if this object has a valid connection to a server, @c false if it doesn't. */ bool isValid() const; /** This functions runs a loop that for each iteration checks if the server has sent anything, and if the user has typed anything. It sends the servers output to the user interface, and the users commands to the server. */ void runLoop(); /** Sends the message @c msg to the server with the player or team @c target as receiver. */ void sendMessage(const std::string& msg, PlayerId target); /** This function changes the BZAdminUI used by the client to communicate with the user. The object pointed to by @c interface will not be deallocated when BZAdminClient is done with it, you will have to do that yourself. */ void setUI(BZAdminUI* bzInterface); /** Waits until we think the server has processed all our input so far. This is done by sending a private message to ourself and waiting until we receive it from the server. */ void waitForServer(); /** This function tells the client to ignore messages of this type. If getServerString() is called and a message of this type is received, the function will just ignore that message and wait for the next one. Warning: Ignoring some types of messages may cause unexpected behaviour! For example, if you ignore MsgSuperKill bzadmin won't know when it has been kicked off the server. */ void ignoreMessageType(uint16_t type); /** This function tells the client to show messages of this type (return them as strings from getServerString()). Note that the message still won't be shown if bzadmin does not know how to handle it - for example, player position updates won't be shown. */ void showMessageType(uint16_t type); /** This function tells the client to ignore messages of this type. If getServerString() is called and a message of this type is received, the function will just ignore that message and wait for the next one. Warning: Ignoring some types of messages may cause unexpected behaviour! For example, if you ignore MsgSuperKill bzadmin won't know when it has been kicked off the server. */ void ignoreMessageType(std::string type); /** This function tells the client to show messages of this type (return them as strings from getServerString()). Note that the message still won't be shown if bzadmin does not know how to handle it - for example, player position updates won't be shown. */ void showMessageType(std::string type); /** This function returns a const reference to the mapping from message type names to message type codes. */ const std::map& getMessageTypeMap() const; /** This function returns the filter status of the message type @c msgType, @c true means "show" and @c false means "hide". */ bool getFilterStatus(uint16_t msgType) const; protected: /** This function prints a /set command for the BZDB variable with name @c name to the current UI. It assumes that there actually is an UI, if @c ui is NULL this function could crash the program. It has to be static because it is used as a callback for StateDatabase::iterate(). */ static void listSetVars(const std::string& name, void* thisObject); /** Connects to the list server and gets a list of available servers */ void outputServerList() const; PlayerIdMap players; TeamColor myTeam; ServerLink sLink; std::pair lastMessage; bool valid; std::map messageMask; std::map colorMap; std::map msgTypeMap; BZAdminUI* ui; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/BZAdminUI.cxx000066400000000000000000000015601200563112200201220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning(4:4786) #endif #include "BZAdminClient.h" #include "BZAdminUI.h" void BZAdminUI::handleNewPacket(uint16_t) { if (client.getLastMessage().first.size() > 0) outputMessage(client.getLastMessage().first, client.getLastMessage().second); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/BZAdminUI.h000066400000000000000000000043401200563112200175460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZADMINUI_H #define BZADMINUI_H #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "Address.h" #include "colors.h" #include "global.h" //#include "BZAdminClient.h" class BZAdminClient; /** This class is an abstract base class for all bzadmin interfaces. All subclasses should register themselves in the UIMap. This should be done in the same files as the subclass is defined in, and it should be done before the main() function is called (i.e. when global variables and static member variables are initialized). This can be done using UIAdder. */ class BZAdminUI { public: /** This constructor just sets the BZAdminClient reference. */ BZAdminUI(BZAdminClient& c) : client(c) { } /** Need a virtual destructor so subclasses get to do their cleanups. */ virtual ~BZAdminUI() { } /** This function prints the message. */ virtual void outputMessage(const std::string&, ColorCode) { } /** This function is called by the client when a new packet has arrived. */ virtual void handleNewPacket(uint16_t); /** See if the user has entered a command, if it has, store it in str and return true. */ virtual bool checkCommand(std::string&) { return false; } /** Tell the UI that a player has been added. */ virtual void addedPlayer(PlayerId) { } /** Warn the UI that a player will be removed. */ virtual void removingPlayer(PlayerId) { } /** Get the current target (the player that messages should be sent to, or 0 for public messages). */ virtual PlayerId getTarget() const { return AllPlayers; } protected: BZAdminClient& client; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/CursesMenu.cxx000066400000000000000000000264551200563112200205030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* Dev-C++ builds successfully if sstream is included before CursesMenu.h */ #ifdef _DEVCPP # include #endif /* interface header */ #include "CursesMenu.h" /* system implementation headers */ #include /* common implementation headers */ #include "BZAdminClient.h" #include "StateDatabase.h" #include "TextUtils.h" CursesMenuItem::CursesMenuItem(const std::string& str) : text(str) { } CursesMenuItem::~CursesMenuItem() { } void CursesMenuItem::showItem(WINDOW* menuWin, int line, int col, int width, bool selected) { /* just print the text of the item centered between col and col+width if this item is selected, use reverse video */ wmove(menuWin, line, col); if (selected) wattron(menuWin, A_REVERSE); for (unsigned int i = 0; i < (width - text.size()) / 2; ++i) waddstr(menuWin, " "); waddstr(menuWin, text.c_str()); for (int i = (width - text.size()) /2 + text.size(); i < width; ++i) waddstr(menuWin, " "); if (selected) wattroff(menuWin, A_REVERSE); } bool CursesMenuItem::handleKey(int, std::string&, CursesMenu&) { return false; } void CursesMenuItem::deselect() { } SubmenuCMItem::SubmenuCMItem(const std::string& str, MenuCallback callback) : CursesMenuItem(str), cb(callback) { } bool SubmenuCMItem::handleKey(int c, std::string&, CursesMenu& menu) { // different key codes for the enter key if (c == '\n' || c == 13) { menu.setUpdateCallback(cb); menu.forceUpdate(); } return false; } CallbackCMItem::CallbackCMItem(const std::string& str, MenuCallback callback) : CursesMenuItem(str), cb(callback) { } bool CallbackCMItem::handleKey(int c, std::string&, CursesMenu& menu) { // different key codes for the enter key if (c == '\n' || c == 13) { cb(menu); } return false; } CommandCMItem::CommandCMItem(const std::string& str, const std::string& cmd, bool update) : CursesMenuItem(str), command(cmd), forceUpdate(update) { } bool CommandCMItem::handleKey(int c, std::string& str, CursesMenu& menu) { // different key codes for the enter key if (c == '\n' || c == 13) { str = command; if (forceUpdate) menu.forceUpdate(); return true; } return false; } BoolCMItem::BoolCMItem(std::string name, bool& variable, std::string trueText, std::string falseText) : CursesMenuItem(name), varRef(variable), trueTxt(trueText), falseTxt(falseText) { } void BoolCMItem::showItem(WINDOW* menuWin, int line, int col, int width, bool selected) { /* print the name of the variable to the left of the center and the value to the right, use reverse video if it is selected */ wmove(menuWin, line, col); if (selected) wattron(menuWin, A_REVERSE); for (unsigned int i = 0; i < width / 2 - text.size() - 1; ++i) waddstr(menuWin, " "); waddstr(menuWin, text.c_str()); wmove(menuWin, line, col + width / 2 + 1); std::string& value = (varRef ? trueTxt : falseTxt); waddstr(menuWin, value.c_str()); for (int i = width / 2 + 1 + value.size(); i < width; ++i) waddstr(menuWin, " "); if (selected) wattroff(menuWin, A_REVERSE); } bool BoolCMItem::handleKey(int c, std::string&, CursesMenu&) { if (c == ' ') varRef = !varRef; return false; } FilterCMItem::FilterCMItem(const std::string& msgType, BZAdminClient& c) : messageType(msgType), client(c), numMsgType(c.getMessageTypeMap().find(msgType)->second) { } void FilterCMItem::showItem(WINDOW* menuWin, int line, int col, int width, bool selected) { /* print the name of the message type to the left of the center and the status to the right, use reverse video if it is selected */ std::string txt = "Show message type '"; txt += messageType; txt += "':"; wmove(menuWin, line, col); if (selected) wattron(menuWin, A_REVERSE); for (unsigned int i = 0; i < width / 2 - txt.size() - 1; ++i) waddstr(menuWin, " "); waddstr(menuWin, txt.c_str()); wmove(menuWin, line, col + width / 2 + 1); std::string value = (client.getFilterStatus(numMsgType) ? "yes" : "no"); waddstr(menuWin, value.c_str()); for (int i = width / 2 + 1 + value.size(); i < width; ++i) waddstr(menuWin, " "); if (selected) wattroff(menuWin, A_REVERSE); } bool FilterCMItem::handleKey(int c, std::string&, CursesMenu&) { if (c == ' ') { if (client.getFilterStatus(numMsgType)) client.ignoreMessageType(numMsgType); else client.showMessageType(messageType); return true; } return false; } BZDBCMItem::BZDBCMItem(const std::string& variable) : CursesMenuItem(variable), editing(false) { } void BZDBCMItem::showItem(WINDOW* menuWin, int line, int col, int width, bool selected) { /* print the name of the variable to the left of the center and the value to the right, use reverse video if it is selected, but don't use reverse video for the value if we're editing it */ wmove(menuWin, line, col); if (selected) wattron(menuWin, A_REVERSE); for (unsigned int i = 0; i < width / 2 - text.size() - 1; ++i) waddstr(menuWin, " "); waddstr(menuWin, text.c_str()); wmove(menuWin, line, col + width / 2 + 1); std::string value = BZDB.get(text); if (editing) { wattroff(menuWin, A_REVERSE); waddstr(menuWin, editString.c_str()); waddstr(menuWin, "_"); } else waddstr(menuWin, value.c_str()); for (int i = width / 2 + 1 + value.size(); i < width; ++i) waddstr(menuWin, " "); if (selected && !editing) wattroff(menuWin, A_REVERSE); } bool BZDBCMItem::handleKey(int c, std::string& str, CursesMenu&) { // if we're not editing, start if we get a return key if (!editing && (c == '\n' || c == 13)) { editing = true; editString = BZDB.get(text); return false; } // OK, we're editing switch (c) { // different codes for the return key - stop and send a /set command case '\n': case 13: editing = false; str = "/set "; str += text + " \"" + editString + "\""; return true; // ESC - stop editing, don't touch the BZDB value case 27: editing = false; break; // backspace/delete - delete the last character case KEY_BACKSPACE: case KEY_DC: case 127: editString = (editString.size() > 0 ? editString.substr(0, editString.size() - 1) : editString); break; // valid characters - edit the string default: if (c < 32 || c > 127 || editString.size() > 30) return false; editString += char(c); break; } return false; } void BZDBCMItem::deselect() { editing = false; } PlayerCMItem::PlayerCMItem(const PlayerIdMap& players, PlayerId playerId) : CursesMenuItem(), playerMap(players), id(playerId) { } void PlayerCMItem::showItem(WINDOW* menuWin, int line, int col, int width, bool selected) { // score (wins-losses)[tks] callsign IP, reverse video if selected std::string name, ip; int callsignPad = CallSignLen; int attrPad = std::string("(Reg/Ident/Admin)").length(); PlayerIdMap::const_iterator iter = playerMap.find(id); if (iter != playerMap.end()) { int wins, losses, tks; const int scorePad = 17; name = iter->second.name; ip = iter->second.ip; wins = iter->second.wins; losses = iter->second.losses; tks = iter->second.tks; std::string attrstr = "("; if (iter->second.isRegistered) attrstr += "Reg/"; if (iter->second.isVerified) attrstr += "Ver/"; if (iter->second.isAdmin) attrstr += "Adm/"; if (attrstr == "(") attrstr += "Anon)"; else attrstr[attrstr.length()-1] = ')'; std::ostringstream oss; oss<<(wins - losses)<<" ("< (signed)items.size() ? int(items.size() - (h - 3)) : start); start = (start < 0 ? 0 : start); int end = start + (h - 3); end = ((unsigned)end > items.size() ? int(items.size()) : end); // show the menu items for (int i = start; i < end; ++i) items[i]->showItem(window, 2 + (i - start), 10, w - 20, i == selection); // draw a line at the bottom of the menu window wmove(window, h - 1, 0); wattron(window, A_UNDERLINE); for (int i = 0; i < COLS; ++i) waddstr(window, " "); wattroff(window, A_UNDERLINE); wrefresh(window); } bool CursesMenu::handleKey(int c, std::string& str) { bool result = false; str = ""; switch (c) { case KEY_UP: items[selection]->deselect(); selection = (selection == 0 ? int(items.size() - 1) : selection - 1); break; case KEY_DOWN: items[selection]->deselect(); selection = ((unsigned)selection == (items.size() - 1) ? 0 : selection + 1); break; default: result = items[selection]->handleKey(c, str, *this); } showMenu(); return result; } void CursesMenu::setWindow(WINDOW* win) { window = win; } void CursesMenu::setUpdateCallback(MenuCallback cb) { rebuilder = cb; } void CursesMenu::forceUpdate() { dirty = true; } void CursesMenu::rebuild() { if (dirty) { dirty = false; rebuilder(*this); } } std::map& CursesMenu::getUpdateTypes() { return updateOnMsg; } void CursesMenu::handleNewPacket(uint16_t msgType) { std::map::const_iterator iter = updateOnMsg.find(msgType); if (iter != updateOnMsg.end()) { if (iter->second) forceUpdate(); showMenu(); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/CursesMenu.h000066400000000000000000000261101200563112200201140ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CURSESMENU_H #define CURSESMENU_H /* bzflag special common - 1st one */ #include "common.h" #include #include #include #include "BZAdminClient.h" #include "curses_wrapper.h" #include "PlayerInfo.h" class CursesMenu; class BZAdminClient; /** Callbacks of this type are used by CursesMenu when it needs to be updated. */ typedef void (*MenuCallback)(CursesMenu&); /** This class is a very primitive widget base class for the menu in the curses interface for bzadmin. It has a virtual function showItem() that prints this widget at a given position in a curses window and another virtual function handleKey() that handles a keypress when this item is selected. This base class just prints the text content when showItem() is called and does nothing when handleKey() is called - it works like a label or menu header. @see CursesMenu */ class CursesMenuItem { public: /** @c str is the text content of this item. It will be displayed in the menu. */ CursesMenuItem(const std::string& str = ""); /** This destructor does nothing, but we need a virtual destructor since we have virtual member functions. */ virtual ~CursesMenuItem(); /** This is the function that displays the menu item in the terminal. @param menuWin the curses window to display the item in @param line the line in the window that the item should be displayed on @param col the column in the window where the left edge of the item should be @param width the width of the item (in characters) @param selected true if this item is selected, false if it is not */ virtual void showItem(WINDOW* menuWin, int line, int col, int width, bool selected); /** This function handles a key press. It is called when the menu is active, this item is the selected item, and the user presses a key on the keyboard. If the menu item wants to send a command to the server it should put the command in @c str and return @c true, otherwise it should return @c false. @param c the key code @param str if the menu item wants to send a command to the server it should be stored here @param menu this is the menu that the item lives in, the menu item is allowed to modify it (e.g. to clear it and add new menu items if we want to go to a submenu) @return true if a command should be sent to the server, false if not */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); /** This function is called when the menu item is deselected. */ virtual void deselect(); protected: std::string text; }; /** This menu item type looks like a normal CursesMenuItem, but when it receives an "enter" key press it goes to a submenu. */ class SubmenuCMItem : public CursesMenuItem { public: /** @c str is the text of this menu item, @c callback is the callback that will be used as the new rebuilder function by the menu when this item receives an "enter" key press. */ SubmenuCMItem(const std::string& str, MenuCallback callback); /** If @c c is a key code for the enter key, this function will change the rebuilder function of @c menu to @c cb. Other keys are ignored. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); protected: MenuCallback cb; }; /** This menu item type looks like a normal CursesMenuItem, but when it receives an "enter" key press it runs a callback function. The callback function is given the parent CursesMenu as an argument. The callback can for example be used to change the contents of the menu. @see MenuCallback */ class CallbackCMItem : public CursesMenuItem { public: /** @c str is the text of this menu item, @c callback is the callback that will be called when the user presses enter and this item is selected. */ CallbackCMItem(const std::string& str, MenuCallback callback); /** If @c c is a key code for the enter key, this function will call the callback. If it's something else it will be ignored. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); protected: MenuCallback cb; }; /** This menu item type just sends a command to the server when it received an enter key press. */ class CommandCMItem : public CursesMenuItem { public: /** @c str is the text that will be shown on the menu item, @c cmd is the command that will be sent to the server. If @c update is true the menu will be updated immediately after the user presses enter. */ CommandCMItem(const std::string& str, const std::string& cmd, bool update = false); /** If @c c is a key code for the enter key, this function will put the @c command in @c str and return @c false. If it's something else it will be ignored. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); protected: std::string command; bool forceUpdate; }; /** This menu item type displays the value of a boolean variable and lets the user toggle it. */ class BoolCMItem : public CursesMenuItem { public: /** This creates a BoolCMItem which displays and edits the value of the bool variable @c variable. @c trueText and @c falseText are the values that are displayed when the variable is true or false. */ BoolCMItem(std::string name, bool& variable, std::string trueText = "true", std::string falseText = "false"); /** This function displays the name of the variable and it's value. */ virtual void showItem(WINDOW* menuWin, int line, int col, int width, bool selected); /** This function handles key presses from the user. Space toggles the variable value, any other key is ignored. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); protected: bool& varRef; std::string trueTxt, falseTxt; }; /** This menu item type displays the filter status of a message type and lets the user toggle it. */ class FilterCMItem : public CursesMenuItem { public: /** This creates a FilterCMItem which displays and edits the filter status of the message type @c msgType in the client @c client. */ FilterCMItem(const std::string& msgType, BZAdminClient& c); /** This function displays the name of the message type and it's status. */ virtual void showItem(WINDOW* menuWin, int line, int col, int width, bool selected); /** This function handles key presses from the user. Space toggles the variable value, any other key is ignored. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); protected: std::string messageType; BZAdminClient& client; uint16_t numMsgType; }; /** This menu item type displays the value of a BZDB variable and lets the user edit it. It doesn't know if the player has permission to edit the values, but if not the server will complain. */ class BZDBCMItem : public CursesMenuItem { public: /** This creates a BZDBCMItem which displays the variable with the name @c variable. */ BZDBCMItem(const std::string& variable); /** This function displays the name and the value of this item's BZDB variable. */ virtual void showItem(WINDOW* menuWin, int line, int col, int width, bool selected); /** This function handles key presses when this item is selected. It has code that allows the user to edit the value of this items BZDB variable. When the user has edited the value and hits the enter key, a @c /set command will be placed in @c str and @c true will be returned. */ virtual bool handleKey(int c, std::string& str, CursesMenu& menu); /** This stops editing the variable value without touching BZDB (same effect as when the user hits the escape key). */ virtual void deselect(); protected: bool editing; std::string editString; }; /** This menu item type displays information about a player. In the future it might also allow the user to ban and kick the player. */ class PlayerCMItem : public CursesMenuItem { public: PlayerCMItem(const PlayerIdMap& players, PlayerId playerId); virtual void showItem(WINDOW* menuWin, int line, int col, int width, bool selected); protected: const PlayerIdMap& playerMap; PlayerId id; }; /** This class prints and handles key presses for a text-based curses menu. The menu is simply a list of menu items, which are printed in a single column. This class handles selection of menu items, scrolls the menu to keep the selected item visible, and it also has functions for clearing the menu (deleting all menu items) and adding new items. @see CursesMenuItem */ class CursesMenu { public: /** CursesUI is our friend. (ugly, should be done differently) */ friend class CursesUI; CursesMenu(BZAdminClient& c); /** This is needed to delete the dynamically allocated CursesMenuItem objects. */ ~CursesMenu(); /** This function changes the menu header. */ void setHeader(const std::string& newHeader); /** This function adds an item to the menu. The item has to be dynamically allocated, and this CursesMenu object will delete the item when it's no longer used. */ void addItem(CursesMenuItem* item); /** This function clears the menu (removes and deletes all items). */ void clear(); /** This function shows the menu. */ void showMenu(); /** This function handles a key. If the key generates a command that should be sent to the server that command will be places in @c str and @c true will be returned. */ bool handleKey(int c, std::string& str); /** Set the curses window that this menu will be displayed in. */ void setWindow(WINDOW* win); /** Sets the callback function that is used to update this menu. */ void setUpdateCallback(MenuCallback cb); /** Force the menu to update itself using the current rebuilder function next time it gets the chance. */ void forceUpdate(); /** This function updates the menu if neccessary. */ void rebuild(); /** Return a reference to the map of message types that will cause the menu to redraw itself. If the associated @c bool is true, the menu will also be completely rebuilt (menu items can be removed or added). */ std::map& getUpdateTypes(); /** This function updates the menu if @c msgType is in the set of message types that will cause the menu to update. */ void handleNewPacket(uint16_t msgType); protected: std::string header; std::vector items; int selection; WINDOW* window; MenuCallback rebuilder; BZAdminClient& client; const PlayerIdMap& players; bool dirty; std::map updateOnMsg; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/CursesUI.cxx000066400000000000000000000303531200563112200201040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif #include "CursesUI.h" // add this UI to the map UIAdder CursesUI::uiAdder("curses", &CursesUI::creator); CursesUI::CursesUI(BZAdminClient& c) : BZAdminUI(c), menuWin(NULL), menuState(NoMenu), menu(c), client(c), players(c.getPlayers()), me(c.getMyId()), maxHistory(20), currentHistory(0), maxBufferSize(300), scrollOffset(0) { // initialize ncurses initscr(); start_color(); use_default_colors(); init_pair(Default, COLOR_FGDEFAULT, COLOR_BGDEFAULT); init_pair(White, COLOR_WHITE, COLOR_BGDEFAULT); init_pair(Red, COLOR_RED, COLOR_BGDEFAULT); init_pair(Green, COLOR_GREEN, COLOR_BGDEFAULT); init_pair(Blue, COLOR_BLUE, COLOR_BGDEFAULT); init_pair(Purple, COLOR_MAGENTA, COLOR_BGDEFAULT); init_pair(Yellow, COLOR_YELLOW, COLOR_BGDEFAULT); init_pair(Cyan, COLOR_CYAN, COLOR_BGDEFAULT); nonl(); cbreak(); noecho(); // create main output window mainWin = newwin(LINES - 5, 0, 0, 0); wsetscrreg(mainWin, 0, LINES - 2); scrollok(mainWin, TRUE); wrefresh(mainWin); // create target window targetWin = newwin(1, 0, LINES - 2, 0); wattron(targetWin, A_UNDERLINE); targetIter = players.begin(); updateTargetWin(); // create command window cmdWin = newwin(0, 0, LINES - 1, 0); keypad(cmdWin, TRUE); nodelay(cmdWin, TRUE); updateCmdWin(); // initialize the menu menu.setUpdateCallback(initMainMenu); // add additional chat targets additionalTargets[PlayerId(FirstTeam - ObserverTeam)] = PlayerInfo("teammates"); additionalTargets[AdminPlayers] = PlayerInfo("admins"); } CursesUI::~CursesUI() { endwin(); } void CursesUI::outputMessage(const std::string& msg, ColorCode color) { // add message to the message buffer, remove the oldest message if it's full if (msgBuffer.size() == maxBufferSize) msgBuffer.erase(msgBuffer.begin()); std::pair p(msg, color); msgBuffer.push_back(p); // if we have scrolled away from the bottom, don't show the new message if (scrollOffset == 0) { wattron(mainWin, COLOR_PAIR(color)); waddstr(mainWin, (msg + "\n").c_str()); wattroff(mainWin, COLOR_PAIR(color)); wrefresh(mainWin); } } void CursesUI::handleNewPacket(uint16_t code) { BZAdminUI::handleNewPacket(code); menu.handleNewPacket(code); } bool CursesUI::checkCommand(std::string& str) { wrefresh(cmdWin); str = ""; // get a character and do checks that are always needed int c = wgetch(cmdWin); switch (c) { case KEY_RESIZE: handleResize(LINES, COLS); return false; case KEY_F(2): toggleMenu(); return false; case ERR: return false; } // if the menu is active, use the keystrokes for that if (menuState == 1) return menu.handleKey(c, str); // if not, go ahead and parse commands switch (c) { // clear command (21 is Ctrl-U) case 21: cmd = ""; updateCmdWin(); currentHistory = history.size(); return false; // delete last character case KEY_BACKSPACE: case KEY_DC: case 8: case 127: cmd = cmd.substr(0, cmd.size() - 1); updateCmdWin(); return false; // redraw command (12 is ctrl-l) case 12: wclear(cmdWin); wclear(targetWin); updateCmdWin(); updateTargetWin(); return false; // send command case '\n': // works with PDCurses case 13: // works with ncurses if (history.size() == maxHistory) history.erase(history.begin()); history.push_back(cmd); str = cmd; cmd = ""; currentHistory = history.size(); updateCmdWin(); return true; // scroll main window case KEY_NPAGE: scrollOffset = (scrollOffset < (unsigned(LINES - 2) / 2) ? 0 : scrollOffset - (LINES - 2) / 2); updateMainWinFromBuffer(LINES - 2); return false; case KEY_PPAGE: if (msgBuffer.size() < unsigned(LINES - 2)) scrollOffset = 0; else if (scrollOffset > msgBuffer.size() - (LINES - 2) - (LINES - 2) / 2) scrollOffset = msgBuffer.size() - (LINES - 2); else scrollOffset += (LINES - 2) / 2; updateMainWinFromBuffer(LINES - 2); return false; // change target - we have two maps to iterate over, so if we get to // the end/beginning of the first one we go to the beginning/end of the // second one and vice versa, also the maps should never be empty case KEY_LEFT: if (targetIter == additionalTargets.begin()) { targetIter = players.begin(); for (unsigned int j = 0; j < players.size() - 1; j++) ++targetIter; } else if (targetIter == players.begin()) { targetIter = additionalTargets.begin(); for (unsigned int j = 0; j < additionalTargets.size() - 1; j++) ++targetIter; } else --targetIter; updateTargetWin(); return false; case KEY_RIGHT: ++targetIter; if (targetIter == players.end()) targetIter = additionalTargets.begin(); else if (targetIter == additionalTargets.end()) targetIter = players.begin(); updateTargetWin(); return false; // command history case KEY_UP: if (currentHistory == 0 || history.empty()) return false; --currentHistory; cmd = history[currentHistory]; updateCmdWin(); return false; case KEY_DOWN: if (currentHistory < history.size()) ++currentHistory; if (currentHistory == history.size()) cmd = ""; else cmd = history[currentHistory]; updateCmdWin(); return false; // kick target case KEY_F(5): if (targetIter != players.end() && targetIter->first != me && targetIter->first <= LastRealPlayer) { if (targetIter->second.isAdmin) { outputMessage("Warning: Kicking Administrator (" + targetIter->second.name + ")!", Red); } cmd = "/kick \""; cmd += targetIter->second.name; cmd += "\""; targetIter = players.find(me); updateCmdWin(); updateTargetWin(); } return false; // ban target case KEY_F(6): if (targetIter != players.end() && targetIter->first != me && targetIter->first <= LastRealPlayer) { if (targetIter->second.ip != "") { if (targetIter->second.isAdmin) { outputMessage("Warning: Banning Administrator (" + targetIter->second.name + ")!", Red); } cmd = "/ban "; cmd += targetIter->second.ip; targetIter = players.find(me); updateCmdWin(); updateTargetWin(); } else { std::string msg = "--- Can't ban "; msg += targetIter->second.name + ", you don't have the IP address"; outputMessage(msg, White); } } return false; // tab - autocomplete case '\t': { std::string matches; cmd = comp.complete(cmd, &matches); updateCmdWin(); if (matches.size() > 0) { outputMessage(matches, White); updateTargetWin(); } return false; } default: if (c < 32 || c > 127 || cmd.size() >= CMDLENGTH) return false; cmd += char(c); updateCmdWin(); return false; } } void CursesUI::addedPlayer(PlayerId p) { PlayerIdMap::const_iterator iter = players.find(p); comp.registerWord(iter->second.name, true /* quote spaces */); if (p == me) targetIter = iter; } void CursesUI::removingPlayer(PlayerId p) { if (targetIter->first == p) { targetIter = players.find(me); updateTargetWin(); } comp.unregisterWord(players.find(p)->second.name); } PlayerId CursesUI::getTarget() const { if (targetIter->first == me) return AllPlayers; return targetIter->first; } void CursesUI::handleResize(int lines, int cols) { resizeterm(lines, cols); wresize(mainWin, lines - 2, cols); updateMainWinFromBuffer(lines - 2); mvwin(targetWin, lines - 2, 0); wresize(targetWin, 1, cols); mvwin(cmdWin, lines - 1, 0); wresize(cmdWin, 1, cols); updateTargetWin(); updateCmdWin(); wrefresh(mainWin); } void CursesUI::updateMainWinFromBuffer(unsigned int numberOfMessages) { wclear(mainWin); int start = msgBuffer.size() - numberOfMessages - scrollOffset; start = (start < 0 ? 0 : start); unsigned int end = start + numberOfMessages; end = (end >= msgBuffer.size() ? msgBuffer.size() : end); for (unsigned int i = start ; i < end; ++i) { wattron(mainWin, COLOR_PAIR(msgBuffer[i].second)); waddstr(mainWin, (msgBuffer[i].first + "\n").c_str()); wattroff(mainWin, COLOR_PAIR(msgBuffer[i].second)); } wrefresh(mainWin); } void CursesUI::updateTargetWin() { werase(targetWin); wmove(targetWin, 0, 0); wmove(targetWin, 1, 1); std::string tmp = "Send to "; tmp = tmp + (targetIter == players.end() || targetIter->first == me ? "all" : targetIter->second.name) + ":"; waddstr(targetWin, tmp.c_str()); wrefresh(targetWin); } void CursesUI::updateCmdWin() { werase(cmdWin); wmove(cmdWin, 1, 1); waddstr(cmdWin, cmd.c_str()); wmove(cmdWin, 1, 1 + cmd.size()); wrefresh(cmdWin); } void CursesUI::toggleMenu() { if (menuState == NoMenu) { menuState = VisibleActive; curs_set(0); const int menuWinSize = (LINES - 2) / 2; wresize(mainWin, LINES - 2 - menuWinSize, COLS); mvwin(mainWin, menuWinSize, 0); updateMainWinFromBuffer(LINES - 2 - menuWinSize); menuWin = newwin(menuWinSize, 0, 0, 0); menu.setWindow(menuWin); menu.showMenu(); } else if (menuState == VisibleActive) { menuState = VisibleInactive; curs_set(1); } else { menuState = NoMenu; menu.setWindow(NULL); delwin(menuWin); wresize(mainWin, LINES - 2, COLS); mvwin(mainWin, 0, 0); updateMainWinFromBuffer(LINES - 2); } wrefresh(targetWin); wrefresh(cmdWin); } void CursesUI::initMainMenu(CursesMenu& menu) { menu.setHeader("MAIN MENU"); menu.clear(); menu.addItem(new SubmenuCMItem("Show players", &CursesUI::initPlayerMenu)); //menu.addItem(new SubmenuCMItem("Edit banlist", // &CursesUI::initBanMenu)); menu.addItem(new SubmenuCMItem("Edit server variables", &CursesUI::initServerVarMenu)); menu.addItem(new SubmenuCMItem("Edit message filter", &CursesUI::initFilterMenu)); } void CursesUI::initPlayerMenu(CursesMenu& menu) { menu.setHeader("PLAYERLIST"); menu.clear(); PlayerIdMap::const_iterator it; for (it = menu.players.begin(); it != menu.players.end(); ++it) menu.addItem(new PlayerCMItem(menu.players, it->first)); menu.addItem(new SubmenuCMItem("Back to main menu", &CursesUI::initMainMenu)); std::map& updateTypes(menu.getUpdateTypes()); updateTypes.clear(); updateTypes[MsgAddPlayer] = true; updateTypes[MsgRemovePlayer] = true; updateTypes[MsgScore] = false; updateTypes[MsgKilled] = false; updateTypes[MsgAdminInfo] = false; } void CursesUI::initBanMenu(CursesMenu& menu) { menu.setHeader("BANLIST"); menu.clear(); menu.addItem(new SubmenuCMItem("Not implemented - go back", &CursesUI::initMainMenu)); menu.getUpdateTypes().clear(); } void CursesUI::initServerVarMenu(CursesMenu& menu) { menu.setHeader("SERVER VARIABLE EDITOR"); menu.clear(); BZDB.iterate(&CursesUI::addBZDBCMItem, &menu); menu.addItem(new SubmenuCMItem("Back to main menu", &CursesUI::initMainMenu)); std::map& updateTypes(menu.getUpdateTypes()); updateTypes.clear(); updateTypes[MsgSetVar] = false; } void CursesUI::addBZDBCMItem(const std::string& name, void* menu) { ((CursesMenu*)menu)->addItem(new BZDBCMItem(name)); } void CursesUI::initFilterMenu(CursesMenu& menu) { menu.setHeader("MESSAGE FILTER EDITOR"); menu.clear(); std::map::const_iterator iter; for (iter = menu.client.getMessageTypeMap().begin(); iter != menu.client.getMessageTypeMap().end(); ++iter) menu.addItem(new FilterCMItem(iter->first, menu.client)); menu.addItem(new SubmenuCMItem("Back to main menu", &CursesUI::initMainMenu)); menu.getUpdateTypes().clear(); } BZAdminUI* CursesUI::creator(BZAdminClient& client) { return new CursesUI(client); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/CursesUI.h000066400000000000000000000104441200563112200175300ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef CURSESUI_H #define CURSESUI_H /* bzflag special common - 1st one */ #include "common.h" #include #include #include #include #include "Address.h" #include "AutoCompleter.h" #include "BZAdminUI.h" #include "curses_wrapper.h" #include "CursesMenu.h" #include "global.h" #include "UIMap.h" #define CMDLENGTH (MessageLen - 3) /** This class is an interface for bzadmin that uses ncurses. */ class CursesUI : public BZAdminUI { protected: /** The parameters to this constructor are a map of all players and the local player's PlayerId. */ CursesUI(BZAdminClient& c); public: ~CursesUI(); /** This function prints a message in the main window. */ virtual void outputMessage(const std::string& msg, ColorCode color); /** This function is called by the client when a new packet has arrived. */ virtual void handleNewPacket(uint16_t msgType); /** See if the user has entered a command, if it has, store it in str and return true. */ virtual bool checkCommand(std::string& str); /** Tell the UI that a player has been added. */ virtual void addedPlayer(PlayerId p); /** Warn the UI that a player will be removed. */ virtual void removingPlayer(PlayerId p); /** Get the current target (the player that messages should be sent to, or 0 for public messages). */ virtual PlayerId getTarget() const; /** This function returns a pointer to a dynamically allocated CursesUI object. */ static BZAdminUI* creator(BZAdminClient& client); protected: /** This function moves and resizes the windows when the terminal has been resized. */ void handleResize(int lines, int cols); /** All messages that are written in the main window are saved in a buffer. This function updates the main window with the contents of that buffer. It is useful to do this when the window has been resized (because the terminal has been resized, or because the menu has been toggled). @param numberOfMessages The last @c numberOfMessages messages from the buffer will be written to the window. */ void updateMainWinFromBuffer(unsigned int numberOfMessages); /** This function redraws the target window (the line that says who you are talking to). */ void updateTargetWin(); /** This function redraws the command window (the line where you type your messages). */ void updateCmdWin(); /** This function toggles the visibility of the menu window. */ void toggleMenu(); /** This function sets the menu to the main menu. */ static void initMainMenu(CursesMenu& menu); /** This function sets the menu to the player menu. */ static void initPlayerMenu(CursesMenu& menu); /** This function sets the menu to the ban menu. */ static void initBanMenu(CursesMenu& menu); /** This function sets the menu to the "Set server variables" submenu. */ static void initServerVarMenu(CursesMenu& menu); /** Add a single BZDBCMItem to the menu. */ static void addBZDBCMItem(const std::string& name, void* menu); /** This function sets the menu to the filter menu. */ static void initFilterMenu(CursesMenu& menu); WINDOW* mainWin; WINDOW* targetWin; WINDOW* cmdWin; WINDOW* menuWin; enum { NoMenu, VisibleActive, VisibleInactive } menuState; CursesMenu menu; BZAdminClient& client; std::string cmd; const PlayerIdMap& players; PlayerIdMap additionalTargets; PlayerIdMap::const_iterator targetIter; PlayerId me; DefaultCompleter comp; std::vector history; unsigned int maxHistory; unsigned int currentHistory; std::vector > msgBuffer; unsigned int maxBufferSize; unsigned int scrollOffset; static UIAdder uiAdder; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/Makefile.am000066400000000000000000000017551200563112200177160ustar00rootroot00000000000000MAINTAINERCLEANFILES = \ Makefile.in bin_PROGRAMS = bzadmin if HAVE_CURSES CURSES_SRC = CursesUI.h CursesUI.cxx CursesMenu.h CursesMenu.cxx else CURSES_SRC = EXTRA_bzadmin_SOURCES = \ CursesMenu.h \ CursesMenu.cxx \ CursesUI.h \ CursesUI.cxx endif AM_CPPFLAGS = \ -DBUILDING_BZADMIN \ -I$(top_srcdir)/src/bzflag \ $(LIBCURL_CPPFLAGS) \ $(CONF_CPPFLAGS) \ -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) bzadmin_LDFLAGS = -static bzadmin_SOURCES = \ BZAdminClient.h \ BZAdminClient.cxx \ BZAdminUI.h \ BZAdminUI.cxx \ colors.h \ $(CURSES_SRC) \ OptionParser.h \ OptionParser.cxx \ PlayerInfo.h \ $(top_srcdir)/src/bzflag/ServerLink.cxx \ StdBothUI.h \ StdBothUI.cxx \ StdInUI.h \ StdInUI.cxx \ StdOutUI.h \ StdOutUI.cxx \ UIMap.h \ UIMap.cxx \ bzadmin.cxx \ curses_wrapper.h LDADD = \ ../date/libDate.la \ @CURSES_LIB@ \ ../game/libGame.la \ ../net/libNet.la \ ../common/libCommon.la \ $(LIBCURL) \ $(LIBCARES) \ $(LIBREGEX) bzflag-2.4.2+ds1/src/bzadmin/Makefile.in000066400000000000000000000545111200563112200177250ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = bzadmin$(EXEEXT) subdir = src/bzadmin DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__bzadmin_SOURCES_DIST = BZAdminClient.h BZAdminClient.cxx \ BZAdminUI.h BZAdminUI.cxx colors.h CursesUI.h CursesUI.cxx \ CursesMenu.h CursesMenu.cxx OptionParser.h OptionParser.cxx \ PlayerInfo.h $(top_srcdir)/src/bzflag/ServerLink.cxx \ StdBothUI.h StdBothUI.cxx StdInUI.h StdInUI.cxx StdOutUI.h \ StdOutUI.cxx UIMap.h UIMap.cxx bzadmin.cxx curses_wrapper.h @HAVE_CURSES_TRUE@am__objects_1 = CursesUI.$(OBJEXT) \ @HAVE_CURSES_TRUE@ CursesMenu.$(OBJEXT) am_bzadmin_OBJECTS = BZAdminClient.$(OBJEXT) BZAdminUI.$(OBJEXT) \ $(am__objects_1) OptionParser.$(OBJEXT) ServerLink.$(OBJEXT) \ StdBothUI.$(OBJEXT) StdInUI.$(OBJEXT) StdOutUI.$(OBJEXT) \ UIMap.$(OBJEXT) bzadmin.$(OBJEXT) am__EXTRA_bzadmin_SOURCES_DIST = CursesMenu.h CursesMenu.cxx \ CursesUI.h CursesUI.cxx bzadmin_OBJECTS = $(am_bzadmin_OBJECTS) bzadmin_LDADD = $(LDADD) am__DEPENDENCIES_1 = bzadmin_DEPENDENCIES = ../date/libDate.la ../game/libGame.la \ ../net/libNet.la ../common/libCommon.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) bzadmin_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(bzadmin_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(bzadmin_SOURCES) $(EXTRA_bzadmin_SOURCES) DIST_SOURCES = $(am__bzadmin_SOURCES_DIST) \ $(am__EXTRA_bzadmin_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = \ Makefile.in @HAVE_CURSES_FALSE@CURSES_SRC = @HAVE_CURSES_TRUE@CURSES_SRC = CursesUI.h CursesUI.cxx CursesMenu.h CursesMenu.cxx @HAVE_CURSES_FALSE@EXTRA_bzadmin_SOURCES = \ @HAVE_CURSES_FALSE@ CursesMenu.h \ @HAVE_CURSES_FALSE@ CursesMenu.cxx \ @HAVE_CURSES_FALSE@ CursesUI.h \ @HAVE_CURSES_FALSE@ CursesUI.cxx AM_CPPFLAGS = \ -DBUILDING_BZADMIN \ -I$(top_srcdir)/src/bzflag \ $(LIBCURL_CPPFLAGS) \ $(CONF_CPPFLAGS) \ -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) bzadmin_LDFLAGS = -static bzadmin_SOURCES = \ BZAdminClient.h \ BZAdminClient.cxx \ BZAdminUI.h \ BZAdminUI.cxx \ colors.h \ $(CURSES_SRC) \ OptionParser.h \ OptionParser.cxx \ PlayerInfo.h \ $(top_srcdir)/src/bzflag/ServerLink.cxx \ StdBothUI.h \ StdBothUI.cxx \ StdInUI.h \ StdInUI.cxx \ StdOutUI.h \ StdOutUI.cxx \ UIMap.h \ UIMap.cxx \ bzadmin.cxx \ curses_wrapper.h LDADD = \ ../date/libDate.la \ @CURSES_LIB@ \ ../game/libGame.la \ ../net/libNet.la \ ../common/libCommon.la \ $(LIBCURL) \ $(LIBCARES) \ $(LIBREGEX) all: all-am .SUFFIXES: .SUFFIXES: .cxx .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bzadmin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bzadmin/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list bzadmin$(EXEEXT): $(bzadmin_OBJECTS) $(bzadmin_DEPENDENCIES) @rm -f bzadmin$(EXEEXT) $(bzadmin_LINK) $(bzadmin_OBJECTS) $(bzadmin_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BZAdminClient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BZAdminUI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CursesMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CursesUI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerLink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdBothUI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdInUI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdOutUI.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UIMap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bzadmin.Po@am__quote@ .cxx.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< ServerLink.o: $(top_srcdir)/src/bzflag/ServerLink.cxx @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ServerLink.o -MD -MP -MF $(DEPDIR)/ServerLink.Tpo -c -o ServerLink.o `test -f '$(top_srcdir)/src/bzflag/ServerLink.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/bzflag/ServerLink.cxx @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ServerLink.Tpo $(DEPDIR)/ServerLink.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/bzflag/ServerLink.cxx' object='ServerLink.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ServerLink.o `test -f '$(top_srcdir)/src/bzflag/ServerLink.cxx' || echo '$(srcdir)/'`$(top_srcdir)/src/bzflag/ServerLink.cxx ServerLink.obj: $(top_srcdir)/src/bzflag/ServerLink.cxx @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ServerLink.obj -MD -MP -MF $(DEPDIR)/ServerLink.Tpo -c -o ServerLink.obj `if test -f '$(top_srcdir)/src/bzflag/ServerLink.cxx'; then $(CYGPATH_W) '$(top_srcdir)/src/bzflag/ServerLink.cxx'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/bzflag/ServerLink.cxx'; fi` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/ServerLink.Tpo $(DEPDIR)/ServerLink.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(top_srcdir)/src/bzflag/ServerLink.cxx' object='ServerLink.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ServerLink.obj `if test -f '$(top_srcdir)/src/bzflag/ServerLink.cxx'; then $(CYGPATH_W) '$(top_srcdir)/src/bzflag/ServerLink.cxx'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/bzflag/ServerLink.cxx'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/src/bzadmin/OptionParser.cxx000066400000000000000000000053501200563112200210260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif /* interface header */ #include "OptionParser.h" // system header #include OptionParser::OptionParser(const std::string& helpPrefix, const std::string& usageSuffix) : helpPre(helpPrefix), usageSuf(usageSuffix) { } OptionParser::~OptionParser() { ParserMap::iterator iter; for (iter = parsers.begin(); iter != parsers.end(); ++iter) delete iter->second; } const std::string& OptionParser::getError() const { return error; } const std::vector& OptionParser::getParameters() const { return parameters; } bool OptionParser::parse(int argc, char** argv) { parameters.clear(); error = ""; ParserMap::iterator iter; for (int i = 1; i < argc; ++i) { if (!strcmp(argv[i], "-help")) { printHelp(std::cout, argv[0]); return false; } if (argv[i][0] != '-') { parameters.push_back(argv[i]); // should just blank out the password, but we don't really parse it here memset(argv[i], ' ', strlen(argv[i])); } else { iter = parsers.find(&argv[i][1]); if (iter == parsers.end()) { error = error + "Unknown option \"" + argv[i] + "\""; break; } if (i + 1 >= argc) { error = error + "Missing argument to \"" + argv[i] + "\""; break; } i += iter->second->parse(&argv[i+1]); } } if (error.size() > 0) { std::cerr<first<<": "<second->help<second->usage<<" "; os< #include #include #include #include /* common interface headers */ #include "TextUtils.h" /** This is an abstract base class for all different option parsers. The idea is that you register a Parser object for each command line option, and the subclass of the object depends on what the program should do when it sees that option. If it should change a variable you could use a VariableParser. Right now VariableParser is the only subclass. This class and its subclasses should only be used by OptionParser. @see VariableParser @see OptionParser */ class Parser { public: /** This constructor should be called by all subclasses. @param usageText A text string that describes how this command line option should be used, e.g. "[-ui curses|stdout]". @param helpText A short description of what this option does. */ Parser(const std::string& usageText, const std::string& helpText) : usage(usageText), help(helpText) { } virtual ~Parser() { } /** This function is called by OptionParser when the option that this parser is mapped to is given on the command line. It will return the number of parameters that this option takes, so that the OptionParser knows where to look for next option. */ virtual int parse(char** argv) = 0; const std::string usage; const std::string help; }; /** This is a template class for the variable parser. It should be used when you want a command line option to change the value of a variable. The template parameter T must be such that there is a function istream& operator>>(istream&, T&). */ template class VariableParser : public Parser { public: /** This constructor stores a reference to @c variable, and when parse() is called it will read the value of the next parameter on the command line into @c variable. This should only be used by OptionParser, see OptionParser::registerVariable() for more info. */ VariableParser(T& variable, const std::string& usageText, const std::string& helpText) : Parser(usageText, helpText), var(variable) { } virtual int parse(char** argv) { std::istringstream iss(argv[0]); iss>>var; return 1; } protected: T& var; }; // true ugliness to fool VC5 typedef std::string STRING; /** This is a specialization for @c string variables. It copies the entire parameter instead of just the first word (which the stream operator would have done). */ template<> class VariableParser : public Parser { public: VariableParser(std::string& variable, const std::string& usageText, const std::string& helpText) : Parser(usageText, helpText), var(variable) { } virtual int parse(char** argv) { var = argv[0]; return 1; } protected: std::string& var; }; /** This is a specialization for @c bool variables. It does not take a parameter, but just sets the variable to @c true. */ template<> class VariableParser : public Parser { public: VariableParser(bool& variable, const std::string& usageText, const std::string& helpText) : Parser(usageText, helpText), var(variable) { } virtual int parse(char**) { var = true; return 0; } protected: bool& var; }; /** This is a parser for @c std::vector variables. It splits the parameter at ',' characters and puts the tokens in the vector. The type @c T must have a stream operator. */ template class VectorParser : public Parser { public: VectorParser(std::vector& variable, const std::string& usageText, const std::string& helpText) : Parser(usageText, helpText), var(variable) { } virtual int parse(char** argv) { std::vector tmpVector = TextUtils::tokenize(argv[0], ","); T t; for (unsigned i = 0; i < tmpVector.size(); ++i) { std::istringstream iss(tmpVector[i]); iss>>t; var.push_back(t); } return 1; } protected: std::vector& var; }; /** This class handles all the command line parsing for bzadmin. */ class OptionParser { public: /** @c helpPrefix is a line (or several lines) of text that is written before the usage description in the help message. It could for example be the program name and version. @c usageSuffix is a line (no linebreaks) of text that will be added to the short usage description, and it could describe command parameters that aren't registered with this parser. */ OptionParser(const std::string& helpPrefix, const std::string& usageSuffix); /** Since the individual parsers are allocated dynamically we need a destructor that deletes them. */ ~OptionParser(); /** This function returns the latest error message. */ const std::string& getError() const; /** This function returns a vector of unknown parameters in the parsed command line. */ const std::vector& getParameters() const; /** This function parses the given command line. */ bool parse(int argc, char** argv); /** This function prints the help text to the stream @c out. */ void printHelp(std::ostream& os, const std::string& progname) const; /** This function prints the usage text to the stream @c out. */ void printUsage(std::ostream& os, const std::string& progName) const; /** This template function connects the variable @c variable to the command line option @c option. This means that if you have a @c std::string variable called @c myName and call this function like this: registerVariable("name", myName), and then give the parameters -name "Lars Luthman" on the command line, the variable @c myName will get the value "Lars Luthman" when the command line is parsed. This is a template function, so it will work for variables of other types too, such as @c float or @c int. The only condition on the variable type is that it can be read from an @c istream. */ template bool registerVariable(const std::string& option, T& variable, const std::string& usage = "", const std::string& help = "") { //VC doesn't support out of class definition of template functions VariableParser* parser = new VariableParser(variable, usage, help); parsers[option] = parser; return true; } /** Same as registerVariable(), but for @c vector variables instead. The parameter will be tokenized with ',' as delimiter and the tokens will be parsed and placed in the vector. */ template bool registerVector(const std::string& option, std::vector& variable, const std::string& usage = "", const std::string& help = "") { //VC doesn't support out of class definition of template functions VectorParser* parser = new VectorParser(variable, usage, help); parsers[option] = parser; return true; } protected: typedef std::map ParserMap; ParserMap parsers; std::vector parameters; std::string error; std::string helpPre; std::string usageSuf; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/PlayerInfo.h000066400000000000000000000023221200563112200200720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef PLAYERINFO_H #define PLAYERINFO_H #include #include "Address.h" #include "global.h" /** This struct stores information about a player that is relevant to bzadmin. */ struct PlayerInfo { PlayerInfo(): wins(), losses(), tks(), isRegistered(), isVerified(), isAdmin() {} PlayerInfo(const std::string& n) : name(n), wins(), losses(), tks(), isRegistered(), isVerified(), isAdmin() {} std::string name; std::string ip; TeamColor team; int wins; int losses; int tks; bool isRegistered; bool isVerified; bool isAdmin; }; typedef std::map PlayerIdMap; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/StdBothUI.cxx000066400000000000000000000060011200563112200202000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "StdBothUI.h" /* system implementation headers */ #include #ifdef _WIN32 # include # include #else # include # include #endif /* implementation headers */ #include "global.h" #ifdef _WIN32 unsigned long __stdcall winInput(void *that) { StdBothUI *input = (StdBothUI*)that; unsigned long numRead; while (WaitForSingleObject(input->processedEvent, INFINITE) == WAIT_OBJECT_0) { numRead = 0; ReadFile(input->console, &input->buffer[input->pos], MessageLen-input->pos, &numRead, NULL); if (numRead > 0) { input->pos += numRead; SetEvent(input->readEvent); } } return 0; } #endif // add this UI to the map UIAdder StdBothUI::uiAdder("stdboth", &StdBothUI::creator); StdBothUI::StdBothUI(BZAdminClient& c) : BZAdminUI(c), atEOF(false) { #ifdef _WIN32 unsigned long tid; console = GetStdHandle(STD_INPUT_HANDLE); readEvent = CreateEvent(NULL,FALSE,FALSE,NULL); processedEvent = CreateEvent(NULL,FALSE,TRUE,NULL); thread = CreateThread(NULL,0,winInput,this,0,&tid); pos = 0; #endif } void StdBothUI::outputMessage(const std::string& msg, ColorCode) { std::cout< 2) { if ((buffer[pos-1] == '\n') || (buffer[pos-1] == '\r') || (pos == MessageLen)) { buffer[pos-2] = '\0'; str = buffer; pos = 0; SetEvent(processedEvent); return true; } } SetEvent(processedEvent); } return false; } #else bool StdBothUI::checkCommand(std::string& str) { // if we read EOF last time, quit now if (atEOF) { str = "/quit"; return true; } static char buffer[MessageLen + 1]; static int pos = 0; fd_set rfds; timeval tv; FD_ZERO(&rfds); FD_SET((unsigned int)0, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; if (select(1, &rfds, NULL, NULL, &tv) > 0) { if (read(0, &buffer[pos], 1) == 0) { // select says we have data, but there's nothing to read - assume EOF buffer[pos] = '\n'; atEOF = true; } if (buffer[pos] == '\n' || pos == MessageLen - 1) { buffer[pos] = '\0'; str = buffer; if (pos != 0) { pos = 0; return true; } pos = 0; } pos++; } return false; } #endif BZAdminUI* StdBothUI::creator(BZAdminClient& client) { return new StdBothUI(client); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/StdBothUI.h000066400000000000000000000031411200563112200176270ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef STDBOTHUI_H #define STDBOTHUI_H /* interface headers */ #include "BZAdminUI.h" #include "UIMap.h" class BZAdminClient; /** This interface is a combination of StdInUI and StdOutUI. It reads commands from stdin and prints the output from the server to stdout. This requires polling of the stdin file descriptor, which isn't defined in standard C or C++, which means that this might not work well on all systems. It should work on most UNIX-like systems though. */ class StdBothUI : public BZAdminUI { public: StdBothUI(BZAdminClient& c); virtual void outputMessage(const std::string& msg, ColorCode color); virtual bool checkCommand(std::string& str); /** This function returns a pointer to a dynamically allocated StdBothUI object. */ static BZAdminUI* creator(BZAdminClient&); protected: static UIAdder uiAdder; bool atEOF; #ifdef _WIN32 public: HANDLE console; HANDLE readEvent, processedEvent; HANDLE thread; char buffer[MessageLen + 1]; int pos; #endif }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/StdInUI.cxx000066400000000000000000000022251200563112200176560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif /* interface header */ #include "StdInUI.h" /* system implementation headers */ #include // add this UI to the map UIAdder StdInUI::uiAdder("stdin", &StdInUI::creator); StdInUI::StdInUI(BZAdminClient& c) : BZAdminUI(c) { } bool StdInUI::checkCommand(std::string& str) { if (std::cin.eof()) { str = "/quit"; return true; } std::getline(std::cin, str); if (str == "") return false; return true; } BZAdminUI* StdInUI::creator(BZAdminClient& client) { return new StdInUI(client); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/StdInUI.h000066400000000000000000000022611200563112200173030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef STDINUI_H #define STDINUI_H #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "Address.h" #include "BZAdminUI.h" #include "global.h" #include "UIMap.h" /** This class is an interface for bzadmin that reads commands from stdin. */ class StdInUI : public BZAdminUI { public: StdInUI(BZAdminClient& c); bool checkCommand(std::string& str); /** This function returns a pointer to a dynamically allocated StdInUI object. */ static BZAdminUI* creator(BZAdminClient&); protected: static UIAdder uiAdder; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/StdOutUI.cxx000066400000000000000000000020741200563112200200610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif /* interface header */ #include "StdOutUI.h" /* system implementation headers */ #include // add this UI to the map UIAdder StdOutUI::uiAdder("stdout", &StdOutUI::creator); StdOutUI::StdOutUI(BZAdminClient& c) : BZAdminUI(c) { } void StdOutUI::outputMessage(const std::string& msg, ColorCode) { std::cout< /* common interface headers */ #include "Address.h" #include "BZAdminUI.h" #include "global.h" #include "UIMap.h" /** This class is an interface for bzadmin that reads commands from stdin. */ class StdOutUI : public BZAdminUI { public: StdOutUI(BZAdminClient& c); virtual void outputMessage(const std::string& msg, ColorCode color); /** This function returns a pointer to a dynamically allocated StdOutUI object. */ static BZAdminUI* creator(BZAdminClient&); protected: static UIAdder uiAdder; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/UIMap.cxx000066400000000000000000000015631200563112200173560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif #include "UIMap.h" // initialize the singleton template <> UIMap* Singleton::_instance = (UIMap*)0; UIMap::UIMap() { } UIAdder::UIAdder(const std::string& name, UICreator creator) { UIMap::instance()[name] = creator; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/UIMap.h000066400000000000000000000036151200563112200170030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef UIMAP_H #define UIMAP_H /* global interface headers */ #include "common.h" /* system interface headers */ #include #include #include "BZAdminUI.h" #include "PlayerInfo.h" #include "Singleton.h" class BZAdminClient; /** The function type that creates interface objects. */ typedef BZAdminUI* (*UICreator)(BZAdminClient&); /** This class maps strings to BZAdmin interfaces (subclasses of BZAdminUI). New interface classes should register using the UIAdder class. */ class UIMap : public std::map, public Singleton { protected: friend class Singleton; /** The constructor is hidden, this is a singleton. */ UIMap(); }; /** A helper class that can be used to add interfaces when the program loads. To register the UI class @c MyBZAdminUI, you need a UICreator that returns a pointer to a @c MyBZAdminUI (casted to a BZAdminUI *). Then you include a static member variable of the type @c UIAdder in @c MyBZAdminUI, and initialize it with the constructor call UIAdder MyBZAdminUI::myUIAdder("my_ui", &MyBZAdminUI::myCreator) . The constructor will then register @c myCreator in the UIMap with the name "my_ui". */ class UIAdder { public: UIAdder(const std::string& name, UICreator creator); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/bzadmin.cxx000066400000000000000000000153021200563112200200230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif #include "common.h" /* system headers */ #include #include #include #include #include #include /* common headers */ #include "TimeKeeper.h" /* local headers */ #include "BZAdminClient.h" #include "BZAdminUI.h" #include "OptionParser.h" #include "UIMap.h" // causes persistent rebuilding to obtain build versioning #include "version.h" int debugLevel = 0; #ifdef _WIN32 void Player::setDeadReckoning() { } #endif /** @file This is the main file for bzadmin, the bzflag text client. */ int main(int argc, char** argv) { #ifdef _WIN32 // startup winsock { static const int major = 2, minor = 2; WSADATA wsaData; if (WSAStartup(MAKEWORD(major, minor), &wsaData)) { std::cerr << "Could not initialise WinSock."; return 1; } if (LOBYTE(wsaData.wVersion) != major || HIBYTE(wsaData.wVersion) != minor) { std::cerr << "Invalid WinSock version (got " << (int) LOBYTE(wsaData.wVersion) << '.' << (int) HIBYTE(wsaData.wVersion) << ", expected" << major << '.' << minor << ')'; WSACleanup(); return 1; } } #endif // command line options std::string uiName("curses"); std::vector visibleMsgs; std::vector invisibleMsgs; // no curses, use stdboth as default instead const UIMap& interfaces = UIMap::instance(); if (interfaces.find("curses") == interfaces.end()) uiName = "stdboth"; // build a usage string with all interfaces UIMap::const_iterator uiIter; std::string uiUsage; for (uiIter = interfaces.begin(); uiIter != interfaces.end(); ++uiIter) uiUsage += uiIter->first + '|'; uiUsage = std::string("[-ui ") + uiUsage.substr(0, uiUsage.size() - 1) + ']'; // register and parse command line arguments OptionParser op(std::string("bzadmin ") + getAppVersion(), "CALLSIGN[:password]@HOST[:PORT] [COMMAND] [COMMAND] ..."); const std::string uiOption("ui"); const std::string uiMsg = "choose a user interface"; op.registerVariable(uiOption, uiName, uiUsage, uiMsg); op.registerVariable("list", startupInfo.listServerURL, "[-list ]", "specify a list server to use"); op.registerVector("show", visibleMsgs, "[-show msgtype{,msgtype}*]", "tell bzadmin to show these message types"); op.registerVector("hide", invisibleMsgs, "[-hide msgtype{,msgtype}*]", "tell bzadmin not to show these message types"); if (!op.parse(argc, argv)) return 1; // check that the ui is valid uiIter = UIMap::instance().find(uiName); if (uiIter == UIMap::instance().end()) { std::cerr<<"There is no interface called \""< 0 && (atPos = op.getParameters()[0].find('@')) > 0)) { // input callsign and host interactively std::cout << "No callsign@host specified. Please input them" << std::endl; std::cout << "Callsign: "; std::getline(std::cin, callsign); if (callsign.size() <= 1) { std::cerr << "You must specify a callsign. Exiting." << std::endl; return 1; } std::cout << "Password (optional): "; std::getline(std::cin, password); if (password.size() <= 1) { std::cerr << "Not using central login" << std::endl; } std::cout << "Server[:port] to connect to: "; std::getline(std::cin, serverName); if (serverName.size() <= 1) { std::cerr << "You must specify a host name to connect to. Exiting." << std::endl; return 1; } } else { // callsign:password@host:port on command line callsign = op.getParameters()[0].substr(0, atPos); int pPos = callsign.find(':'); if (pPos != -1) { password = callsign.substr(pPos + 1).c_str(); callsign = callsign.substr(0, pPos); } serverName = op.getParameters()[0].substr(atPos + 1); } startupInfo.serverPort = ServerPort; int cPos = serverName.find(':'); if (cPos != -1) { long int serverPort = strtol(serverName.substr(cPos + 1).c_str(), (char **)NULL, 10); if (serverPort > 0 && serverPort < 65536) startupInfo.serverPort = (int) serverPort; serverName = serverName.substr(0, cPos); } // Flawfinder: ignore strncpy(startupInfo.callsign, callsign.c_str(), sizeof(startupInfo.callsign) - 1); // Flawfinder: ignore strncpy(startupInfo.password, password.c_str(), sizeof(startupInfo.password) - 1); // Flawfinder: ignore strncpy(startupInfo.serverName, serverName.c_str(), sizeof(startupInfo.serverName) - 1); } std::cerr << "Connecting to " << startupInfo.callsign << "@" << startupInfo.serverName << ":" << startupInfo.serverPort; // Check if password is not empty if (startupInfo.password[0]) { std::cerr << " using central login"; } std::cerr << std::endl; // try to connect BZAdminClient client; if (!client.isValid()) return 1; unsigned int i; for (i = 0; i < visibleMsgs.size(); ++i) client.showMessageType(visibleMsgs[i]); for (i = 0; i < invisibleMsgs.size(); ++i) client.ignoreMessageType(invisibleMsgs[i]); // if we got commands as arguments, send them if (op.getParameters().size() > 1) { // if we have a token wait a bit for global login // FIXME: should "know" when we are logged in (or fail) and only wait that long. if (startupInfo.token[0] != 0) TimeKeeper::sleep(5.0); for (unsigned int j = 1; j < op.getParameters().size(); ++j) { const std::string& cmd = op.getParameters()[j]; if (cmd == "/quit") { client.waitForServer(); return 0; } else if (strncasecmp(cmd.c_str(), "/sleep", 6) == 0) { const char* start = cmd.c_str() + 6; char* endptr; double sleepTime = strtod(start, &endptr); if (endptr != start) { TimeKeeper::sleep(sleepTime); } } else { client.sendMessage(cmd, AllPlayers); } } } // create UI and run the main loop BZAdminUI* ui = uiIter->second(client); client.setUI(ui); client.runLoop(); delete ui; return 0; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/colors.h000066400000000000000000000013431200563112200173250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef COLORS_H #define COLORS_H enum ColorCode { Default = 0, White, Red, Green, Blue, Purple, Yellow, Cyan }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzadmin/curses_wrapper.h000066400000000000000000000076401200563112200210760ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /** @file bzadmin is written to work with ncurses, and in most of the code it is assumed that the curses library that is used is ncurses. However, we want to be able to use other curses libraries too (pdcurses, curses on Solaris, on IRIX etc). This header should contain wrapper functions and macros for other curses libraries to make them compatible with ncurses, or at least the parts of ncurses that bzadmin is using. */ #ifndef CURSES_WRAPPER_H #define CURSES_WRAPPER_H /* bzflag special common - 1st one */ #include "common.h" // if we have ncurses.h, just include it #ifdef HAVE_NCURSES_H #include #define COLOR_BGDEFAULT -1 #define COLOR_FGDEFAULT -1 #endif // ncurses // curses on Solaris #if (defined(HAVE_CURSES_H) && !defined(WIN32)) #define NOMACROS #include #ifndef KEY_RESIZE #define KEY_RESIZE (KEY_MAX + 1) #endif #define COLOR_BGDEFAULT COLOR_BLACK #define COLOR_FGDEFAULT COLOR_WHITE inline void use_default_colors() { return; } inline int resizeterm(int, int) { return ERR; } inline int wresize(WINDOW*, int, int) { return ERR; } inline int cr_waddstr(WINDOW* w, const char* str) { size_t len = strlen(str) + 1; char* newStr = new char[len]; // Flawfinder: ignore memcpy(newStr, str, len); return waddstr(w, newStr); } #undef waddstr #define waddstr(W, C) cr_waddstr(W, C) #endif // curses // assume pdcurses on Windows without ncurses, or if we have xcurses.h #if (defined(WIN32) && !defined(HAVE_NCURSES_H)) || defined(HAVE_XCURSES_H) #ifndef HAVE_PROTO # define HAVE_PROTO #endif // a complete and total hack, but its needed since windows.h ALSO has this #ifdef MOUSE_MOVED #undef MOUSE_MOVED #endif // protect from curses.h defining a min/max macro #ifndef min # define no_min_def #endif #ifndef max # define no_max_def #endif #ifdef HAVE_XCURSES_H # define XCURSES # include #else # define NOMACROS 1 # include #endif // protect from curses.h defining a min/max macro #ifdef no_min_def # ifdef min # undef min # endif #endif #ifdef no_max_def # ifdef max # undef max # endif #endif #define COLOR_BGDEFAULT COLOR_BLACK #define COLOR_FGDEFAULT COLOR_WHITE // old pdcurses requires some workarounds #if (!defined(PDC_BUILD) || PDC_BUILD < 2800) // stop ugly macros from polluting our namespace (pdcurses doesn't use // the NOMACROS preprocessor variable) #undef erase inline int erase() { return werase(stdscr); } #undef clear inline int clear() { return wclear(stdscr); } #undef move inline int move(int y, int x) { return wmove(stdscr, y, x); } #undef nonl inline int nonl() { return OK; } // wrap some functions to make it compatible with ncurses inline int pd_waddstr(WINDOW* w, const char* str) { size_t len = strlen(str) + 1; char* newStr = new char[len]; // Flawfinder: ignore memcpy(newStr, str, len); return waddstr(w, newStr); } #define waddstr(W, C) pd_waddstr(W, C) // wresize needs to preserve the pointer to the window #define wresize(w, l, c) ((w = resize_window(w, l, c)) ? OK : ERR) #endif // old pdcurses #ifdef XCURSES inline int pd_endwin() { int i = endwin(); XCursesExit(); return i; } #define endwin pd_endwin #endif // XCURSES inline int resizeterm(int lines, int cols) { return resize_term(lines, cols); } #endif // pdcurses #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/000077500000000000000000000000001200563112200154735ustar00rootroot00000000000000bzflag-2.4.2+ds1/src/bzflag/ActionBinding.cxx000066400000000000000000000322501200563112200207310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* bzflag special common - 1st one */ #include "common.h" #include #include #include "ActionBinding.h" #include "CommandManager.h" #include "KeyManager.h" // initialize the singleton template <> ActionBinding* Singleton::_instance = (ActionBinding*)0; ActionBinding::ActionBinding() { wayToBindActions.insert(std::make_pair(std::string("quit"), press)); wayToBindActions.insert(std::make_pair(std::string("fire"), both)); wayToBindActions.insert(std::make_pair(std::string("drop"), press)); wayToBindActions.insert(std::make_pair(std::string("identify"), press)); wayToBindActions.insert(std::make_pair(std::string("jump"), both)); wayToBindActions.insert(std::make_pair(std::string("send all"), press)); wayToBindActions.insert(std::make_pair(std::string("send team"), press)); wayToBindActions.insert(std::make_pair(std::string("send nemesis"), press)); wayToBindActions.insert(std::make_pair(std::string("send recipient"), press)); wayToBindActions.insert(std::make_pair(std::string("send admin"), press)); wayToBindActions.insert(std::make_pair(std::string("toggle displayScore"), press)); wayToBindActions.insert(std::make_pair(std::string("viewZoom toggle"), press)); wayToBindActions.insert(std::make_pair(std::string("viewZoom in"), press)); wayToBindActions.insert(std::make_pair(std::string("viewZoom out"), press)); wayToBindActions.insert(std::make_pair(std::string("pause"), press)); wayToBindActions.insert(std::make_pair(std::string("fullscreen"), press)); wayToBindActions.insert(std::make_pair(std::string("mousegrab"), press)); wayToBindActions.insert(std::make_pair(std::string("iconify"), press)); wayToBindActions.insert(std::make_pair(std::string("screenshot"), press)); wayToBindActions.insert(std::make_pair(std::string("time backward"), press)); wayToBindActions.insert(std::make_pair(std::string("time forward"), press)); wayToBindActions.insert(std::make_pair(std::string("toggleRadar"), press)); wayToBindActions.insert(std::make_pair(std::string("toggleConsole"), press)); wayToBindActions.insert(std::make_pair(std::string("toggleFlags radar"), press)); wayToBindActions.insert(std::make_pair(std::string("toggleFlags main"), press)); wayToBindActions.insert(std::make_pair(std::string("silence"), press)); wayToBindActions.insert(std::make_pair(std::string("toggle displayLabels"), press)); wayToBindActions.insert(std::make_pair(std::string("destruct"), press)); // Movement keys wayToBindActions.insert(std::make_pair(std::string("turn left"), both)); wayToBindActions.insert(std::make_pair(std::string("turn right"), both)); wayToBindActions.insert(std::make_pair(std::string("drive forward"), both)); wayToBindActions.insert(std::make_pair(std::string("drive reverse"), both)); // End movement keys wayToBindActions.insert(std::make_pair(std::string("roam cycle subject backward"), press)); wayToBindActions.insert(std::make_pair(std::string("roam cycle subject forward"), press)); wayToBindActions.insert(std::make_pair(std::string("roam cycle type forward"), press)); wayToBindActions.insert(std::make_pair(std::string("roam zoom in"), both)); wayToBindActions.insert(std::make_pair(std::string("roam zoom out"), both)); wayToBindActions.insert(std::make_pair(std::string("roam zoom normal"), both)); wayToBindActions.insert(std::make_pair(std::string("servercommand"), press)); wayToBindActions.insert(std::make_pair(std::string("toggle displayFlagHelp"), press)); wayToBindActions.insert(std::make_pair(std::string("scrollpanel up"), press)); wayToBindActions.insert(std::make_pair(std::string("scrollpanel up_page"), press)); wayToBindActions.insert(std::make_pair(std::string("scrollpanel down"), press)); wayToBindActions.insert(std::make_pair(std::string("scrollpanel down_page"), press)); wayToBindActions.insert(std::make_pair(std::string("scrollpanel bottom"), press)); wayToBindActions.insert(std::make_pair(std::string("radarZoom in"), press)); wayToBindActions.insert(std::make_pair(std::string("radarZoom out"), press)); wayToBindActions.insert(std::make_pair(std::string("set displayRadarRange 0.25"), press)); wayToBindActions.insert(std::make_pair(std::string("set displayRadarRange 0.5"), press)); wayToBindActions.insert(std::make_pair(std::string("set displayRadarRange 1.0"), press)); wayToBindActions.insert(std::make_pair(std::string("toggle slowKeyboard"), press)); wayToBindActions.insert(std::make_pair(std::string("hunt"), press)); wayToBindActions.insert(std::make_pair(std::string("addhunt"), press)); wayToBindActions.insert(std::make_pair(std::string("restart"), release)); wayToBindActions.insert(std::make_pair(std::string("autopilot"), press)); wayToBindActions.insert(std::make_pair(std::string("messagepanel all"), press)); wayToBindActions.insert(std::make_pair(std::string("messagepanel chat"), press)); wayToBindActions.insert(std::make_pair(std::string("messagepanel server"), press)); wayToBindActions.insert(std::make_pair(std::string("messagepanel misc"), press)); defaultBinding.insert(BindingTable::value_type("F12", "quit")); defaultBinding.insert(BindingTable::value_type("Left Mouse", "fire")); defaultBinding.insert(BindingTable::value_type("Enter", "fire")); defaultBinding.insert(BindingTable::value_type("Middle Mouse", "drop")); defaultBinding.insert(BindingTable::value_type("Space", "drop")); defaultBinding.insert(BindingTable::value_type("Right Mouse", "identify")); defaultBinding.insert(BindingTable::value_type("I", "identify")); defaultBinding.insert(BindingTable::value_type("Tab", "jump")); defaultBinding.insert(BindingTable::value_type("N", "send all")); defaultBinding.insert(BindingTable::value_type("M", "send team")); defaultBinding.insert(BindingTable::value_type(",", "send nemesis")); defaultBinding.insert(BindingTable::value_type(".", "send recipient")); defaultBinding.insert(BindingTable::value_type("Z", "send admin")); defaultBinding.insert(BindingTable::value_type("S", "toggle displayScore")); defaultBinding.insert(BindingTable::value_type("B", "viewZoom toggle")); defaultBinding.insert(BindingTable::value_type("Ctrl+Wheel Up", "viewZoom in")); defaultBinding.insert(BindingTable::value_type("Ctrl+Wheel Down", "viewZoom out")); defaultBinding.insert(BindingTable::value_type("Pause", "pause")); defaultBinding.insert(BindingTable::value_type("P", "pause")); defaultBinding.insert(BindingTable::value_type("F1", "fullscreen")); defaultBinding.insert(BindingTable::value_type("Q", "toggleRadar")); defaultBinding.insert(BindingTable::value_type("W", "toggleConsole")); defaultBinding.insert(BindingTable::value_type("F4", "iconify")); defaultBinding.insert(BindingTable::value_type("F5", "screenshot")); defaultBinding.insert(BindingTable::value_type("-", "time backward")); defaultBinding.insert(BindingTable::value_type("=", "time forward")); defaultBinding.insert(BindingTable::value_type("H", "toggleFlags radar")); defaultBinding.insert(BindingTable::value_type("J", "toggleFlags main")); defaultBinding.insert(BindingTable::value_type("K", "silence")); defaultBinding.insert(BindingTable::value_type("L", "toggle displayLabels")); defaultBinding.insert(BindingTable::value_type("Delete", "destruct")); // Default movement keys defaultBinding.insert(BindingTable::value_type("Left Arrow", "turn left")); defaultBinding.insert(BindingTable::value_type("Right Arrow", "turn right")); defaultBinding.insert(BindingTable::value_type("Up Arrow", "drive forward")); defaultBinding.insert(BindingTable::value_type("Down Arrow", "drive reverse")); // End default movement keys defaultBinding.insert(BindingTable::value_type("Shift+Wheel Up", "radarZoom in")); defaultBinding.insert(BindingTable::value_type("Shift+Wheel Down", "radarZoom out")); defaultBinding.insert(BindingTable::value_type("F6", "roam cycle subject backward")); defaultBinding.insert(BindingTable::value_type("F7", "roam cycle subject forward")); defaultBinding.insert(BindingTable::value_type("F8", "roam cycle type forward")); defaultBinding.insert(BindingTable::value_type("F9", "roam zoom in")); defaultBinding.insert(BindingTable::value_type("F10", "roam zoom out")); defaultBinding.insert(BindingTable::value_type("F11", "roam zoom normal")); defaultBinding.insert(BindingTable::value_type("O", "servercommand")); defaultBinding.insert(BindingTable::value_type("F", "toggle displayFlagHelp")); defaultBinding.insert(BindingTable::value_type("Page Up", "scrollpanel up_page")); defaultBinding.insert(BindingTable::value_type("Wheel Up", "scrollpanel up 3")); defaultBinding.insert(BindingTable::value_type("Page Down", "scrollpanel down_page")); defaultBinding.insert(BindingTable::value_type("Wheel Down", "scrollpanel down 3")); defaultBinding.insert(BindingTable::value_type("End", "scrollpanel bottom")); defaultBinding.insert(BindingTable::value_type("1", "set displayRadarRange 0.25")); defaultBinding.insert(BindingTable::value_type("2", "set displayRadarRange 0.5")); defaultBinding.insert(BindingTable::value_type("3", "set displayRadarRange 1.0")); defaultBinding.insert(BindingTable::value_type("4", "radarZoom in")); defaultBinding.insert(BindingTable::value_type("5", "radarZoom out")); defaultBinding.insert(BindingTable::value_type("A", "toggle slowKeyboard")); defaultBinding.insert(BindingTable::value_type("U", "hunt")); defaultBinding.insert(BindingTable::value_type("7", "addhunt")); defaultBinding.insert(BindingTable::value_type("Right Mouse", "restart")); defaultBinding.insert(BindingTable::value_type("I", "restart")); defaultBinding.insert(BindingTable::value_type("9", "autopilot")); defaultBinding.insert(BindingTable::value_type("Shift+F1", "messagepanel all")); defaultBinding.insert(BindingTable::value_type("Shift+F2", "messagepanel chat")); defaultBinding.insert(BindingTable::value_type("Shift+F3", "messagepanel server")); defaultBinding.insert(BindingTable::value_type("Shift+F4", "messagepanel misc")); } void ActionBinding::resetBindings() { BindingTable::const_iterator index; for (index = bindingTable.begin(); index != bindingTable.end(); ++index) unbind(index->second, index->first); bindingTable = defaultBinding; for (index = bindingTable.begin(); index != bindingTable.end(); ++index) bind(index->second, index->first); } void ActionBinding::getFromBindings() { bindingTable.clear(); KEYMGR.iterate(&onScanCB, this); } void ActionBinding::onScanCB(const std::string& name, bool, const std::string& cmd, void*) { ActionBinding::instance().associate(name, cmd, false); } void ActionBinding::associate(std::string key, std::string action, bool keyBind) { BindingTable::iterator index, next; if (!wayToBindActions.count(action)) return; PressStatusBind newStatusBind = wayToBindActions[action]; for (index = bindingTable.lower_bound( key ); index != bindingTable.upper_bound( key ); index = next) { next = index; ++next; if (newStatusBind == both) { if (keyBind) unbind(index->second, key); bindingTable.erase(index); } else if (newStatusBind == press) { if (wayToBindActions[index->second] != release) { if (keyBind) unbind(index->second, key); bindingTable.erase(index); } } else { if (wayToBindActions[index->second] != press) { if (keyBind) unbind(index->second, key); bindingTable.erase(index); } } } bindingTable.insert(BindingTable::value_type(key, action)); if (keyBind) bind(action, key); } void ActionBinding::deassociate(std::string action) { BindingTable::iterator index, next; for (index = bindingTable.begin(); index != bindingTable.end(); index = next) { next = index; ++next; if (index->second == action) { unbind(action, index->first); bindingTable.erase(index); } } } void ActionBinding::bind(std::string action, std::string key) { PressStatusBind statusBind = wayToBindActions[action]; std::string command; if (statusBind == press || statusBind == both) { command = "bind \"" + key + "\" down \"" + action + "\""; CMDMGR.run(command); }; if (statusBind == release || statusBind == both) { command = "bind \"" + key + "\" up \"" + action + "\""; CMDMGR.run(command); }; } void ActionBinding::unbind(std::string action, std::string key) { PressStatusBind statusBind = wayToBindActions[action]; std::string command; if (statusBind == press || statusBind == both) { command = "unbind \"" + key + "\" down"; CMDMGR.run(command); }; if (statusBind == release || statusBind == both) { command = "unbind \"" + key + "\" up"; CMDMGR.run(command); }; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ActionBinding.h000066400000000000000000000040471200563112200203610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_ACTION_BINDING_H #define BZF_ACTION_BINDING_H // system includes #include #include // bzflag interface includes #include "Singleton.h" class ActionBinding : public Singleton { public: /** Reset the Action Bindings to default values */ void resetBindings(); /** Get the whole Action Bindings from the KeyManager Binding */ void getFromBindings(); /** Associate a key to an action, and eventually bind */ void associate(std::string key, std::string action, bool keyBind = true); /** Deassociate an action to any key */ void deassociate(std::string action); protected: friend class Singleton; private: /** WayToBindAction is a map from an action to the key pressure bindings */ enum PressStatusBind {press, release, both}; typedef std::map WayToBindActions; /** BindingTable is a multimap between key and action */ typedef std::multimap BindingTable; /** They are to constant association */ WayToBindActions wayToBindActions; BindingTable defaultBinding; /** Current value for binding key to action */ BindingTable bindingTable; private: ActionBinding(); //~ActionBinding(); void bind(std::string action, std::string key); void unbind(std::string action, std::string key); static void onScanCB(const std::string& name, bool, const std::string& cmd, void*); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/AudioMenu.cxx000066400000000000000000000117121200563112200201070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "AudioMenu.h" /* system implementation headers */ #include #include /* common implementation headers */ #include "TextUtils.h" #include "FontManager.h" /* local implementation headers */ #include "StateDatabase.h" #include "MainMenu.h" #include "sound.h" #include "HUDuiControl.h" #include "HUDuiLabel.h" #include "HUDuiList.h" #include "HUDui.h" AudioMenu::AudioMenu() { // add controls std::vector& listHUD = getControls(); std::string currentDriver = BZDB.get("audioDriver"); std::string currentDevice = BZDB.get("audioDevice"); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString("Audio Settings"); listHUD.push_back(label); HUDuiList* option = new HUDuiList; option = new HUDuiList; std::vector* options; // Sound Volume option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Sound Volume:"); option->setCallback(callback, (void*)"s"); options = &option->getList(); if (isSoundOpen()) { options->push_back(std::string("Off")); option->createSlider(10); } else { options->push_back(std::string("Unavailable")); } option->update(); listHUD.push_back(option); /* Right now only SDL_Media has a setDriver function. Disable driver selection for others as it gets saved in config and can screw things up if you switch from non-SDL to SDL build. If more platforms get setDriver functions, they can be added. */ // Driver #ifdef HAVE_SDL driver = new HUDuiTypeIn; driver->setFontFace(MainMenu::getFontFace()); driver->setLabel("Driver:"); driver->setMaxLength(10); driver->setString(currentDriver); listHUD.push_back(driver); #else driver = NULL; #endif // HAVE_SDL // Device #ifdef HAVE_SDL device = new HUDuiTypeIn; device->setFontFace(MainMenu::getFontFace()); device->setLabel("Device:"); device->setMaxLength(10); device->setString(currentDevice); listHUD.push_back(device); #else device = NULL; #endif // HAVE_SDL // Remotes Sounds option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Remote Sounds:"); option->setCallback(callback, (void*)"r"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); initNavigation(listHUD, 1, listHUD.size() - 1); } AudioMenu::~AudioMenu() { } void AudioMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == driver) { BZDB.set("audioDriver", driver->getString().c_str()); } else if (_focus == device) { BZDB.set("audioDevice", device->getString().c_str()); } } void AudioMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); int i; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); int fontFace = MainMenu::getFontFace(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(fontFace, titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(fontFace, titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * ((float)_width); y -= 0.6f * titleHeight; const float h = fm.getStrHeight(fontFace, fontSize, " "); const int count = listHUD.size(); for (i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } i = 1; // sound ((HUDuiList*)listHUD[i++])->setIndex(getSoundVolume()); #ifdef HAVE_SDL i++; // driver i++; // device #endif // HAVE_SDL ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("remoteSounds") ? 1 : 0); } void AudioMenu::callback(HUDuiControl* w, void* data) { HUDuiList* list = (HUDuiList*)w; switch (((const char*)data)[0]) { case 's': BZDB.set("volume", TextUtils::format("%d", list->getIndex())); setSoundVolume(list->getIndex()); break; case 'r': BZDB.setBool("remoteSounds", (list->getIndex() == 0) ? false : true); break; } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/AudioMenu.h000066400000000000000000000023171200563112200175350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __AUDIOMENU_H__ #define __AUDIOMENU_H__ /* common interface headers */ #include "HUDDialog.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDuiControl.h" #include "HUDuiTypeIn.h" /** this class provides options for setting the gui */ class AudioMenu : public HUDDialog { public: AudioMenu(); ~AudioMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); private: HUDuiTypeIn* driver; HUDuiTypeIn* device; }; #endif /* __AUDIOMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/AutoPilot.cxx000066400000000000000000000545571200563112200201570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // get our interface #include "AutoPilot.h" /* common headers */ #include "BZDBCache.h" #include "BoxBuilding.h" /* local headers */ #include "Roster.h" #include "TargetingUtils.h" #include "World.h" #include "WorldPlayer.h" #include "playing.h" #include "Plan.h" typedef std::map > FlagSuccessMap; static FlagSuccessMap flagSuccess; static int totalSum = 0; static int totalCnt = 0; static bool wantJump = false; static PlanStack planStack; void teachAutoPilot(FlagType *type, int adjust) { if (type == Flags::Null) return; FlagSuccessMap::iterator it = flagSuccess.find(type); if (it != flagSuccess.end()) { std::pair &pr = it->second; pr.first += adjust; pr.second++; } else { flagSuccess[type] = std::pair(adjust,1); } totalSum += adjust; totalCnt++; } static bool isFlagUseful(FlagType *type) { if (type == Flags::Null) return false; FlagSuccessMap::iterator it = flagSuccess.find(type); float flagValue; if (it != flagSuccess.end()) { std::pair &pr = it->second; if (pr.second == 0) flagValue = 0.0f; else flagValue = (float)pr.first / (float)pr.second; } else { return true; } float avg; if (totalCnt == 0) avg = 0.0f; else avg = (float)totalSum / (float)totalCnt; return ((float)flagValue) >= avg; } static ShotPath *findWorstBullet(float &minDistance) { LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); ShotPath *minPath = NULL; minDistance = Infinity; for (int t = 0; t < curMaxPlayers; t++) { if (t == myTank->getId() || !remotePlayers[t]) continue; const int maxShots = remotePlayers[t]->getMaxShots(); for (int s = 0; s < maxShots; s++) { ShotPath* shot = remotePlayers[t]->getShot(s); if (!shot || shot->isExpired()) continue; if ((shot->getFlag() == Flags::InvisibleBullet) && (myTank->getFlag() != Flags::Seer)) continue; //Theoretically Roger could triangulate the sound if (remotePlayers[t]->isPhantomZoned() && !myTank->isPhantomZoned()) continue; if ((shot->getFlag() == Flags::Laser) && (myTank->getFlag() == Flags::Cloaking)) continue; //cloaked tanks can't die from lasers const float* shotPos = shot->getPosition(); if ((fabs(shotPos[2] - pos[2]) > BZDBCache::tankHeight) && (shot->getFlag() != Flags::GuidedMissile)) continue; const float dist = TargetingUtils::getTargetDistance(pos, shotPos); if (dist < minDistance) { const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1], shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = { (pos[0] - shotPos[0]) / dist, (pos[1] - shotPos[1]) / dist }; float dotProd = trueVec[0] * shotUnitVec[0] + trueVec[1] * shotUnitVec[1]; if (dotProd <= 0.1f) //pretty wide angle, evasive actions prolly aren't gonna work continue; minDistance = dist; minPath = shot; } } } float oldDistance = minDistance; WorldPlayer *wp = World::getWorld()->getWorldWeapons(); for (int w = 0; w < wp->getMaxShots(); w++) { ShotPath* shot = wp->getShot(w); if (!shot || shot->isExpired()) continue; if (shot->getFlag() == Flags::InvisibleBullet && myTank->getFlag() != Flags::Seer) continue; //Theoretically Roger could triangulate the sound if (shot->getFlag() == Flags::Laser && myTank->getFlag() == Flags::Cloaking) continue; //cloaked tanks can't die from lasers const float* shotPos = shot->getPosition(); if ((fabs(shotPos[2] - pos[2]) > BZDBCache::tankHeight) && (shot->getFlag() != Flags::GuidedMissile)) continue; const float dist = TargetingUtils::getTargetDistance( pos, shotPos ); if (dist < minDistance) { const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1], shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = { (pos[0] - shotPos[0]) / dist, (pos[1] - shotPos[1]) / dist }; float dotProd = trueVec[0] * shotUnitVec[0] + trueVec[1] * shotUnitVec[1]; if (dotProd <= 0.1f) //pretty wide angle, evasive actions prolly aren't gonna work continue; minDistance = dist; minPath = shot; } } if (oldDistance < minDistance) minDistance = oldDistance; //pick the closer bullet return minPath; } static bool avoidDeathFall(float & UNUSED(rotation), float &speed) { LocalPlayer *myTank = LocalPlayer::getMyTank(); float pos1[3], pos2[3]; memcpy(pos1, myTank->getPosition(), sizeof(pos1)); memcpy(pos2, pos1, sizeof(pos1)); pos1[2] += 10.0f * BZDBCache::tankHeight; float azimuth = myTank->getAngle(); if (speed < 0.0f) azimuth = fmodf(float(azimuth + M_PI), float(2.0 * M_PI)); else azimuth = fmodf(float(azimuth), float(2.0 * M_PI)); pos2[0] += 8.0f * BZDBCache::tankHeight * cosf(azimuth); pos2[1] += 8.0f * BZDBCache::tankHeight * sinf(azimuth); pos2[2] += 0.01f; float collisionPt[3]; if (TargetingUtils::getFirstCollisionPoint( pos1, pos2, collisionPt )) { if (collisionPt[2] < 0.0f) collisionPt[2] = 0.0f; if (collisionPt[2] < World::getWorld()->getWaterLevel()) { speed = 0.0f; return true; } } else if (collisionPt[2] < (pos2[2] - 1.0f)) { speed *= 0.5f; } return false; } static bool avoidBullet(float &rotation, float &speed) { LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); if ((myTank->getFlag() == Flags::Narrow) || (myTank->getFlag() == Flags::Burrow)) return false; // take our chances float minDistance; ShotPath *shot = findWorstBullet(minDistance); if ((shot == NULL) || (minDistance > 100.0f)) return false; const float *shotPos = shot->getPosition(); const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1],shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = {(pos[0]-shotPos[0])/minDistance,(pos[1]-shotPos[1])/minDistance}; float dotProd = trueVec[0]*shotUnitVec[0]+trueVec[1]*shotUnitVec[1]; if (((World::getWorld()->allowJumping() || (myTank->getFlag()) == Flags::Jumping || (myTank->getFlag()) == Flags::Wings)) && (minDistance < ( std::max(dotProd, 0.5f) * BZDBCache::tankLength * 2.25f)) && (myTank->getFlag() != Flags::NoJumping)) { wantJump = true; return (myTank->getFlag() != Flags::Wings); } else if (dotProd > 0.96f) { speed = 1.0; float myAzimuth = myTank->getAngle(); float rotation1 = TargetingUtils::normalizeAngle((float)((shotAngle + M_PI/2.0) - myAzimuth)); float rotation2 = TargetingUtils::normalizeAngle((float)((shotAngle - M_PI/2.0) - myAzimuth)); float zCross = shotUnitVec[0]*trueVec[1] - shotUnitVec[1]*trueVec[0]; if (zCross > 0.0f) { //if i am to the left of the shot from shooter pov rotation = rotation1; if (fabs(rotation1) < fabs(rotation2)) speed = 1.0f; else if (dotProd > 0.98f) speed = -0.5f; else speed = 0.5f; } else { rotation = rotation2; if (fabs(rotation2) < fabs(rotation1)) speed = 1.0f; else if (dotProd > 0.98f) speed = -0.5f; else speed = 0.5f; } return true; } return false; } static bool stuckOnWall(float &rotation, float &speed) { static TimeKeeper lastStuckTime; static float stuckRot = 0.0f, stuckSpeed = 0.0f; float stuckPeriod = float(TimeKeeper::getTick() - lastStuckTime); if (stuckPeriod < 0.5f) { rotation = stuckRot; speed = stuckSpeed; return true; } else if (stuckPeriod < 1.0f) { rotation = stuckRot; speed = 1.0; return true; } LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); float myAzimuth = myTank->getAngle(); const bool phased = (myTank->getFlag() == Flags::OscillationOverthruster) || myTank->isPhantomZoned(); if (!phased && (TargetingUtils::getOpenDistance(pos, myAzimuth) < 5.0f)) { lastStuckTime = TimeKeeper::getTick(); if (bzfrand() > 0.8f) { // Every once in a while, do something nuts speed = (float)(bzfrand() * 1.5f - 0.5f); rotation = (float)(bzfrand() * 2.0f - 1.0f); } else { float leftDistance = TargetingUtils::getOpenDistance( pos, (float)(myAzimuth + (M_PI/4.0))); float rightDistance = TargetingUtils::getOpenDistance( pos, (float)(myAzimuth - (M_PI/4.0))); if (leftDistance > rightDistance) rotation = 1.0f; else rotation = -1.0f; speed = -0.5f; } stuckRot = rotation; stuckSpeed = speed; return true; } return false; } static RemotePlayer *findBestTarget() { RemotePlayer *target = NULL; LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); float myAzimuth = myTank->getAngle(); float distance = Infinity; for (int t = 0; t < curMaxPlayers; t++) { if ((t != myTank->getId()) && (remotePlayers[t]) && (remotePlayers[t]->isAlive()) && (!remotePlayers[t]->isPaused()) && (!remotePlayers[t]->isNotResponding()) && (myTank->validTeamTarget(remotePlayers[t]))) { if (remotePlayers[t]->isPhantomZoned() && !myTank->isPhantomZoned() && (myTank->getFlag() != Flags::ShockWave) && (myTank->getFlag() != Flags::SuperBullet)) continue; if ((remotePlayers[t]->getFlag() == Flags::Cloaking) && (myTank->getFlag() == Flags::Laser)) continue; //perform a draft that has us chase the proposed opponent if they have our flag if (World::getWorld()->allowTeamFlags() && (((myTank->getTeam() == RedTeam) && (remotePlayers[t]->getFlag() == Flags::RedTeam)) || ((myTank->getTeam() == GreenTeam) && (remotePlayers[t]->getFlag() == Flags::GreenTeam)) || ((myTank->getTeam() == BlueTeam) && (remotePlayers[t]->getFlag() == Flags::BlueTeam)) || ((myTank->getTeam() == PurpleTeam) && (remotePlayers[t]->getFlag() == Flags::PurpleTeam)))) { target = remotePlayers[t]; break; } float d = TargetingUtils::getTargetDistance(pos, remotePlayers[t]->getPosition()); bool isObscured = TargetingUtils::isLocationObscured( pos, remotePlayers[t]->getPosition()); if (isObscured) //demote the priority of obscured enemies d *= 1.25f; if (d < distance) { if ((remotePlayers[t]->getFlag() != Flags::Stealth) || (myTank->getFlag() == Flags::Seer) || ((!isObscured) && (TargetingUtils::getTargetAngleDifference(pos, myAzimuth, remotePlayers[t]->getPosition()) <= 30.0f))) { target = remotePlayers[t]; distance = d; } } } } return target; } static bool chasePlayer(float &rotation, float &speed) { LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); RemotePlayer *rPlayer = findBestTarget(); if (rPlayer == NULL) return false; myTank->setTarget(rPlayer); const float *targetPos = rPlayer->getPosition(); float distance = TargetingUtils::getTargetDistance(pos, targetPos); if (distance > 250.0f) return false; const float *tp = rPlayer->getPosition(); float enemyPos[3]; //toss in some lag adjustment/future prediction - 300 millis memcpy(enemyPos,tp,sizeof(enemyPos)); const float *tv = rPlayer->getVelocity(); enemyPos[0] += 0.3f * tv[0]; enemyPos[1] += 0.3f * tv[1]; enemyPos[2] += 0.3f * tv[2]; if (enemyPos[2] < 0.0f) //Roger doesn't worry about burrow enemyPos[2] = 0.0; float myAzimuth = myTank->getAngle(); float enemyAzimuth = TargetingUtils::getTargetAzimuth( pos, tp ); rotation = TargetingUtils::getTargetRotation( myAzimuth, enemyAzimuth ); //If we are driving relatively towards our target and a building pops up jump over it if (fabs(rotation) < BZDB.eval(StateDatabase::BZDB_LOCKONANGLE)) { const Obstacle *building = NULL; float d = distance - 5.0f; //Make sure building is REALLY in front of player (-5) float dir[3] = {cosf(myAzimuth), sinf(myAzimuth), 0.0f}; Ray tankRay(pos, dir); building = ShotStrategy::getFirstBuilding(tankRay, -0.5f, d); if (building && !myTank->isPhantomZoned() && (myTank->getFlag() != Flags::OscillationOverthruster)) { //If roger can drive around it, just do that float leftDistance = TargetingUtils::getOpenDistance( pos, (float)(myAzimuth + (M_PI/6.0))); if (leftDistance > (2.0f * d)) { speed = 0.5f; rotation = -0.5f; return true; } float rightDistance = TargetingUtils::getOpenDistance( pos, (float)(myAzimuth - (M_PI/6.0))); if (rightDistance > (2.0f * d)) { speed = 0.5f; rotation = 0.5f; return true; } //Never did good in math, he should really see if he can reach the building //based on jumpvel and gravity, but settles for assuming 20-50 is a good range if ((d > 20.0f) && (d < 50.0f) && (building->getType() == BoxBuilding::getClassName())) { float jumpVel = BZDB.eval(StateDatabase::BZDB_JUMPVELOCITY); float maxJump = (jumpVel * jumpVel) / (2 * -BZDBCache::gravity); if (((building->getPosition()[2] - pos[2] + building->getHeight())) < maxJump) { speed = d / 50.0f; wantJump = true; return true; } } } } // weave towards the player const Player *target = myTank->getTarget(); if ((distance > (BZDB.eval(StateDatabase::BZDB_SHOTSPEED) /2.0f)) || (myTank->getFiringStatus() != LocalPlayer::Ready)) { float enemyUnitVec[2] = { cosf(enemyAzimuth), sinf(enemyAzimuth) }; float myUnitVec[2] = { cosf(myAzimuth), sinf(myAzimuth) }; float dotProd = (myUnitVec[0] * enemyUnitVec[0] + myUnitVec[1] * enemyUnitVec[1]); if (dotProd < 0.866f) { //if target is more than 30 degrees away, turn as fast as you can rotation *= (float)M_PI / (2.0f * fabs(rotation)); speed = dotProd; //go forward inverse rel to how much you need to turn } else { int period = int(TimeKeeper::getTick().getSeconds()); float absBias = (float)(M_PI/20.0 * (distance / 100.0)); float bias = ((period % 4) < 2) ? absBias : -absBias; rotation += bias; rotation = TargetingUtils::normalizeAngle(rotation); speed = 1.0; } } else if (target->getFlag() != Flags::Burrow) { speed = -0.5f; rotation *= (float)(M_PI / (2.0 * fabs(rotation))); } return true; } static bool lookForFlag(float &rotation, float &speed) { LocalPlayer *myTank = LocalPlayer::getMyTank(); float pos[3]; memcpy( pos, myTank->getPosition(), sizeof( pos )); if (pos[2] < 0.0f) pos[2] = 0.0f; World *world = World::getWorld(); int closestFlag = -1; if ((myTank->getFlag() != Flags::Null) && (isFlagUseful(myTank->getFlag()))) return false; float minDist = Infinity; int teamFlag = -1; for (int i = 0; i < numFlags; i++) { if ((world->getFlag(i).type == Flags::Null) || (world->getFlag(i).status != FlagOnGround)) continue; if (world->getFlag(i).type->flagTeam != NoTeam) teamFlag = i; const float* fpos = world->getFlag(i).position; if (fpos[2] == pos[2]) { float dist = TargetingUtils::getTargetDistance(pos, fpos); bool isTargetObscured = TargetingUtils::isLocationObscured(pos, fpos); if (isTargetObscured) dist *= 1.25f; if ((dist < 200.0f) && (dist < minDist)) { minDist = dist; closestFlag = i; } } } if (teamFlag != -1 && (minDist < 10.0f || closestFlag == -1)) closestFlag = teamFlag; //FIXME: should a team flag be more significant than a closer flag? if (closestFlag != -1) { if (minDist < 10.0f) { if (myTank->getFlag() != Flags::Null) { serverLink->sendDropFlag(myTank->getPosition()); handleFlagDropped(myTank); } } const float *fpos = world->getFlag(closestFlag).position; float myAzimuth = myTank->getAngle(); float flagAzimuth = TargetingUtils::getTargetAzimuth(pos, fpos); rotation = TargetingUtils::getTargetRotation(myAzimuth, flagAzimuth); speed = (float)(M_PI/2.0 - fabs(rotation)); return true; } return false; } static bool navigate(float &rotation, float &speed) { static TimeKeeper lastNavChange; static float navRot = 0.0f, navSpeed = 0.0f; if ((TimeKeeper::getTick() - lastNavChange) < 1.0f) { rotation = navRot; speed = navSpeed; return true; } LocalPlayer *myTank = LocalPlayer::getMyTank(); float pos[3]; memcpy(pos, myTank->getPosition(), sizeof(pos)); if (pos[2] < 0.0f) pos[2] = 0.01f; float myAzimuth = myTank->getAngle(); float leftDistance = TargetingUtils::getOpenDistance(pos, (float)(myAzimuth + (M_PI/4.0))); float centerDistance = TargetingUtils::getOpenDistance(pos, myAzimuth); float rightDistance = TargetingUtils::getOpenDistance(pos, (float)(myAzimuth - (M_PI/4.0))); if (leftDistance > rightDistance) { if (leftDistance > centerDistance) rotation = 0.75f; else rotation = 0.0f; } else { if (rightDistance > centerDistance) rotation = -0.75f; else rotation = 0.0f; } if (myTank->getFlag()->flagTeam != NoTeam) { World *world = World::getWorld(); const float *temp = world->getBase(myTank->getTeam()); if (temp == NULL) { serverLink->sendDropFlag(myTank->getPosition()); handleFlagDropped(myTank); } else { if ((((int) *(world->getBase(myTank->getTeam())) + 2 >= (int) *(myTank->getPosition())) || (temp[0] == pos[0] && temp[1] == pos[1])) && myTank->getFlag()->flagTeam == myTank->getTeam()) { serverLink->sendDropFlag(myTank->getPosition()); handleFlagDropped(myTank); } else { float baseAzimuth = TargetingUtils::getTargetAzimuth(pos, temp); rotation = TargetingUtils::getTargetRotation(myAzimuth, baseAzimuth); speed = (float)(M_PI/2.0 - fabs(rotation)); } } } else { speed = 1.0f; } if (myTank->getLocation() == LocalPlayer::InAir && myTank->getFlag() == Flags::Wings) wantJump = true; navRot = rotation; navSpeed = speed; lastNavChange = TimeKeeper::getTick(); return true; } static bool fireAtTank() { static TimeKeeper lastShot; float pos[3]; LocalPlayer *myTank = LocalPlayer::getMyTank(); memcpy(pos, myTank->getPosition(), sizeof(pos)); if (pos[2] < 0.0f) pos[2] = 0.01f; float myAzimuth = myTank->getAngle(); float dir[3] = {cosf(myAzimuth), sinf(myAzimuth), 0.0f}; pos[2] += myTank->getMuzzleHeight(); Ray tankRay(pos, dir); pos[2] -= myTank->getMuzzleHeight(); if (myTank->getFlag() == Flags::ShockWave) { TimeKeeper now = TimeKeeper::getTick(); if (now - lastShot >= (1.0f / World::getWorld()->getMaxShots())) { bool hasSWTarget = false; for (int t = 0; t < curMaxPlayers; t++) { if (t != myTank->getId() && remotePlayers[t] && remotePlayers[t]->isAlive() && !remotePlayers[t]->isPaused() && !remotePlayers[t]->isNotResponding()) { const float *tp = remotePlayers[t]->getPosition(); float enemyPos[3]; //toss in some lag adjustment/future prediction - 300 millis memcpy(enemyPos,tp,sizeof(enemyPos)); const float *tv = remotePlayers[t]->getVelocity(); enemyPos[0] += 0.3f * tv[0]; enemyPos[1] += 0.3f * tv[1]; enemyPos[2] += 0.3f * tv[2]; if (enemyPos[2] < 0.0f) enemyPos[2] = 0.0f; float dist = TargetingUtils::getTargetDistance( pos, enemyPos ); if (dist <= BZDB.eval(StateDatabase::BZDB_SHOCKOUTRADIUS)) { if (!myTank->validTeamTarget(remotePlayers[t])) { hasSWTarget = false; t = curMaxPlayers; } else { hasSWTarget = true; } } } } if (hasSWTarget) { myTank->fireShot(); lastShot = TimeKeeper::getTick(); return true; } } } else { TimeKeeper now = TimeKeeper::getTick(); if (now - lastShot >= (1.0f / World::getWorld()->getMaxShots())) { float errorLimit = World::getWorld()->getMaxShots() * BZDB.eval(StateDatabase::BZDB_LOCKONANGLE) / 8.0f; float closeErrorLimit = errorLimit * 2.0f; for (int t = 0; t < curMaxPlayers; t++) { if (t != myTank->getId() && remotePlayers[t] && remotePlayers[t]->isAlive() && !remotePlayers[t]->isPaused() && !remotePlayers[t]->isNotResponding() && myTank->validTeamTarget(remotePlayers[t])) { if (remotePlayers[t]->isPhantomZoned() && !myTank->isPhantomZoned() && (myTank->getFlag() != Flags::SuperBullet) && (myTank->getFlag() != Flags::ShockWave)) continue; const float *tp = remotePlayers[t]->getPosition(); float enemyPos[3]; //toss in some lag adjustment/future prediction - 300 millis memcpy(enemyPos,tp,sizeof(enemyPos)); const float *tv = remotePlayers[t]->getVelocity(); enemyPos[0] += 0.3f * tv[0]; enemyPos[1] += 0.3f * tv[1]; enemyPos[2] += 0.3f * tv[2]; if (enemyPos[2] < 0.0f) enemyPos[2] = 0.0f; float dist = TargetingUtils::getTargetDistance( pos, enemyPos ); if ((myTank->getFlag() == Flags::GuidedMissile) || (fabs(pos[2] - enemyPos[2]) < 2.0f * BZDBCache::tankHeight)) { float targetDiff = TargetingUtils::getTargetAngleDifference(pos, myAzimuth, enemyPos ); if ((targetDiff < errorLimit) || ((dist < (2.0f * BZDB.eval(StateDatabase::BZDB_SHOTSPEED))) && (targetDiff < closeErrorLimit))) { bool isTargetObscured; if (myTank->getFlag() != Flags::SuperBullet) isTargetObscured = TargetingUtils::isLocationObscured( pos, enemyPos ); else isTargetObscured = false; if (!isTargetObscured) { myTank->fireShot(); lastShot = now; t = curMaxPlayers; return true; } } } } } } } return false; } static void dropHardFlags() { LocalPlayer *myTank = LocalPlayer::getMyTank(); FlagType *type = myTank->getFlag(); if ((type == Flags::Useless) || (type == Flags::MachineGun) || (type == Flags::Identify) || ((type == Flags::PhantomZone) && !myTank->isFlagActive())) { serverLink->sendDropFlag(myTank->getPosition()); handleFlagDropped(myTank); } } void doAutoPilot(float &rotation, float &speed) { wantJump = false; dropHardFlags(); //Perhaps we should remove this and let learning do it's work if (!avoidBullet(rotation, speed)) { if (!stuckOnWall(rotation, speed)) { if (!chasePlayer(rotation, speed)) { if (!lookForFlag(rotation, speed)) { navigate(rotation, speed); } } } } avoidDeathFall(rotation, speed); LocalPlayer *myTank = LocalPlayer::getMyTank(); myTank->setJumpPressed(wantJump); myTank->setJump(); fireAtTank(); } bzflag-2.4.2+ds1/src/bzflag/AutoPilot.h000066400000000000000000000014651200563112200175720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_AUTOPILOT_H #define BZF_AUTOPILOT_H #include "common.h" // common headers #include "Flag.h" void doAutoPilot(float &rotation, float &speed); void teachAutoPilot(FlagType *, int); #endif // BZF_AUTOPILOT_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/BackgroundRenderer.cxx000066400000000000000000001543301200563112200217730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "BackgroundRenderer.h" // system headers #include // common headers #include "OpenGLMaterial.h" #include "TextureManager.h" #include "BZDBCache.h" #include "BzMaterial.h" #include "TextureMatrix.h" #include "ParseColor.h" #include "BZDBCache.h" // local headers #include "daylight.h" #include "stars.h" #include "MainWindow.h" #include "SceneNode.h" #include "effectsRenderer.h" static const GLfloat squareShape[4][2] = { { 1.0f, 1.0f }, { -1.0f, 1.0f }, { -1.0f, -1.0f }, { 1.0f, -1.0f } }; GLfloat BackgroundRenderer::skyPyramid[5][3]; const GLfloat BackgroundRenderer::cloudRepeats = 3.0f; static const int NumMountainFaces = 16; GLfloat BackgroundRenderer::groundColor[4][4]; GLfloat BackgroundRenderer::groundColorInv[4][4]; const GLfloat BackgroundRenderer::defaultGroundColor[4][4] = { { 0.0f, 0.35f, 0.0f, 1.0f }, { 0.0f, 0.20f, 0.0f, 1.0f }, { 1.0f, 1.00f, 1.0f, 1.0f }, { 1.0f, 1.00f, 1.0f, 1.0f } }; const GLfloat BackgroundRenderer::defaultGroundColorInv[4][4] = { { 0.35f, 0.00f, 0.35f, 1.0f }, { 0.20f, 0.00f, 0.20f, 1.0f }, { 1.00f, 1.00f, 1.00f, 1.0f }, { 1.00f, 1.00f, 1.00f, 1.0f } }; const GLfloat BackgroundRenderer::receiverColor[3] = { 0.3f, 0.55f, 0.3f }; const GLfloat BackgroundRenderer::receiverColorInv[3] = { 0.55f, 0.3f, 0.55f }; BackgroundRenderer::BackgroundRenderer(const SceneRenderer&) : blank(false), invert(false), style(0), gridSpacing(60.0f), // meters gridCount(4.0f), mountainsAvailable(false), numMountainTextures(0), mountainsGState(NULL), mountainsList(NULL), cloudDriftU(0.0f), cloudDriftV(0.0f) { static bool init = false; OpenGLGStateBuilder gstate; static const GLfloat black[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; static const GLfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; OpenGLMaterial defaultMaterial(black, black, 0.0f); OpenGLMaterial rainMaterial(white, white, 0.0f); sunList = INVALID_GL_LIST_ID; moonList = INVALID_GL_LIST_ID; starList = INVALID_GL_LIST_ID; cloudsList = INVALID_GL_LIST_ID; sunXFormList = INVALID_GL_LIST_ID; starXFormList = INVALID_GL_LIST_ID; simpleGroundList[0] = INVALID_GL_LIST_ID; simpleGroundList[1] = INVALID_GL_LIST_ID; simpleGroundList[2] = INVALID_GL_LIST_ID; simpleGroundList[3] = INVALID_GL_LIST_ID; // initialize global to class stuff if (!init) { init = true; resizeSky(); } // initialize the celestial vectors static const float up[3] = { 0.0f, 0.0f, 1.0f }; memcpy(sunDirection, up, sizeof(float[3])); memcpy(moonDirection, up, sizeof(float[3])); // make ground materials setupSkybox(); setupGroundMaterials(); TextureManager &tm = TextureManager::instance(); // make grid stuff gstate.reset(); gstate.setBlending(); gstate.setSmoothing(); gridGState = gstate.getState(); // make receiver stuff gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum)GL_SRC_ALPHA, (GLenum)GL_ONE); receiverGState = gstate.getState(); // sun shadow stuff gstate.reset(); gstate.setStipple(0.5f); gstate.setCulling((GLenum)GL_NONE); sunShadowsGState = gstate.getState(); /* useMoonTexture = BZDBCache::texture && (BZDB.eval("useQuality")>2); int moonTexture = -1; if (useMoonTexture){ moonTexture = tm.getTextureID( "moon" ); useMoonTexture = moonTexture>= 0; }*/ // sky stuff gstate.reset(); gstate.setShading(); skyGState = gstate.getState(); gstate.reset(); sunGState = gstate.getState(); gstate.reset(); gstate.setBlending((GLenum)GL_ONE, (GLenum)GL_ONE); // if (useMoonTexture) // gstate.setTexture(*moonTexture); moonGState[0] = gstate.getState(); gstate.reset(); // if (useMoonTexture) // gstate.setTexture(*moonTexture); moonGState[1] = gstate.getState(); gstate.reset(); starGState[0] = gstate.getState(); gstate.reset(); gstate.setBlending(); gstate.setSmoothing(); starGState[1] = gstate.getState(); // make cloud stuff cloudsAvailable = false; int cloudsTexture = tm.getTextureID( "clouds" ); if (cloudsTexture >= 0) { cloudsAvailable = true; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum)GL_SRC_ALPHA, (GLenum)GL_ONE_MINUS_SRC_ALPHA); gstate.setMaterial(defaultMaterial); gstate.setTexture(cloudsTexture); gstate.setAlphaFunc(); cloudsGState = gstate.getState(); } // rain stuff weather.init(); // effects EFFECTS.init(); // make mountain stuff mountainsAvailable = false; { int mountainTexture; int height = 0; int i; numMountainTextures = 0; while (1) { char text[256]; sprintf (text, "mountain%d", numMountainTextures + 1); mountainTexture = tm.getTextureID (text, false); if (mountainTexture < 0) break; const ImageInfo & info = tm.getInfo (mountainTexture); height = info.y; numMountainTextures++; } if (numMountainTextures > 0) { mountainsAvailable = true; // prepare common gstate gstate.reset (); gstate.setShading (); gstate.setBlending (); gstate.setMaterial (defaultMaterial); gstate.setAlphaFunc (); // find power of two at least as large as height int scaledHeight = 1; while (scaledHeight < height) { scaledHeight <<= 1; } // choose minimum width int minWidth = scaledHeight; if (minWidth > scaledHeight) { minWidth = scaledHeight; } mountainsMinWidth = minWidth; // prepare each texture mountainsGState = new OpenGLGState[numMountainTextures]; mountainsList = new GLuint[numMountainTextures]; for (i = 0; i < numMountainTextures; i++) { char text[256]; sprintf (text, "mountain%d", i + 1); gstate.setTexture (tm.getTextureID (text)); mountainsGState[i] = gstate.getState (); mountainsList[i] = INVALID_GL_LIST_ID; } } } // create display lists doInitDisplayLists(); // reset the sky color when it changes BZDB.addCallback("_skyColor", bzdbCallback, this); // recreate display lists when context is recreated OpenGLGState::registerContextInitializer(freeContext, initContext, (void*)this); notifyStyleChange(); } BackgroundRenderer::~BackgroundRenderer() { BZDB.removeCallback("_skyColor", bzdbCallback, this); OpenGLGState::unregisterContextInitializer(freeContext, initContext, (void*)this); delete[] mountainsGState; delete[] mountainsList; } void BackgroundRenderer::bzdbCallback(const std::string& name, void* data) { BackgroundRenderer* br = (BackgroundRenderer*) data; if (name == "_skyColor") { br->setSkyColors(); } return; } void BackgroundRenderer::setupGroundMaterials() { TextureManager &tm = TextureManager::instance(); // see if we have a map specified material const BzMaterial* bzmat = MATERIALMGR.findMaterial("GroundMaterial"); groundTextureID = -1; groundTextureMatrix = NULL; if (bzmat == NULL) { // default ground material memcpy (groundColor, defaultGroundColor, sizeof(GLfloat[4][4])); groundTextureID = tm.getTextureID(BZDB.get("stdGroundTexture").c_str(), true); } else { // map specified material ((BzMaterial*)bzmat)->setReference(); for (int i = 0; i < 4; i++) { memcpy (groundColor[i], bzmat->getDiffuse(), sizeof(GLfloat[4])); } if (bzmat->getTextureCount() > 0) { groundTextureID = tm.getTextureID(bzmat->getTextureLocal(0).c_str(), false); if (groundTextureID < 0) { // use the default as a backup (default color too) memcpy (groundColor, defaultGroundColor, sizeof(GLfloat[4][4])); groundTextureID = tm.getTextureID(BZDB.get("stdGroundTexture").c_str(), true); } else { // only apply the texture matrix if the texture is valid const int texMatId = bzmat->getTextureMatrix(0); const TextureMatrix* texmat = TEXMATRIXMGR.getMatrix(texMatId); if (texmat != NULL) { groundTextureMatrix = texmat->getMatrix(); } } } } static const GLfloat black[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; OpenGLMaterial defaultMaterial(black, black, 0.0f); OpenGLGStateBuilder gb; // ground gstates gb.reset(); groundGState[0] = gb.getState(); gb.reset(); gb.setMaterial(defaultMaterial); groundGState[1] = gb.getState(); gb.reset(); gb.setTexture(groundTextureID); gb.setTextureMatrix(groundTextureMatrix); groundGState[2] = gb.getState(); gb.reset(); gb.setMaterial(defaultMaterial); gb.setTexture(groundTextureID); gb.setTextureMatrix(groundTextureMatrix); groundGState[3] = gb.getState(); // default inverted ground material int groundInvTextureID = -1; memcpy (groundColorInv, defaultGroundColorInv, sizeof(GLfloat[4][4])); if (groundInvTextureID < 0) { groundInvTextureID = tm.getTextureID(BZDB.get("zoneGroundTexture").c_str(), false); } // inverted ground gstates gb.reset(); invGroundGState[0] = gb.getState(); gb.reset(); gb.setMaterial(defaultMaterial); invGroundGState[1] = gb.getState(); gb.reset(); gb.setTexture(groundInvTextureID); invGroundGState[2] = gb.getState(); gb.reset(); gb.setMaterial(defaultMaterial); gb.setTexture(groundInvTextureID); invGroundGState[3] = gb.getState(); return; } void BackgroundRenderer::notifyStyleChange() { if (BZDBCache::texture) { if (BZDBCache::lighting) styleIndex = 3; else styleIndex = 2; } else { if (BZDBCache::lighting) styleIndex = 1; else styleIndex = 0; } // some stuff is drawn only for certain states cloudsVisible = (styleIndex >= 2 && cloudsAvailable && BZDBCache::blend); mountainsVisible = (styleIndex >= 2 && mountainsAvailable); shadowsVisible = BZDB.isTrue("shadows"); starGStateIndex = BZDB.isTrue("smooth"); // fixup gstates OpenGLGStateBuilder gstate; gstate.reset(); if (BZDB.isTrue("smooth")) { gstate.setBlending(); gstate.setSmoothing(); } gridGState = gstate.getState(); } void BackgroundRenderer::resize() { resizeSky(); doFreeDisplayLists(); doInitDisplayLists(); } void BackgroundRenderer::setCelestial(const SceneRenderer& renderer, const float sunDir[3], const float moonDir[3]) { // set sun and moon positions sunDirection[0] = sunDir[0]; sunDirection[1] = sunDir[1]; sunDirection[2] = sunDir[2]; moonDirection[0] = moonDir[0]; moonDirection[1] = moonDir[1]; moonDirection[2] = moonDir[2]; if (sunXFormList != INVALID_GL_LIST_ID) { glDeleteLists(sunXFormList, 1); sunXFormList = INVALID_GL_LIST_ID; } if (moonList != INVALID_GL_LIST_ID) { glDeleteLists(moonList, 1); moonList = INVALID_GL_LIST_ID; } if (starXFormList != INVALID_GL_LIST_ID) { glDeleteLists(starXFormList, 1); starXFormList = INVALID_GL_LIST_ID; } makeCelestialLists(renderer); return; } void BackgroundRenderer::setSkyColors() { // change sky colors according to the sun position GLfloat colors[4][3]; getSkyColor(sunDirection, colors); skyZenithColor[0] = colors[0][0]; skyZenithColor[1] = colors[0][1]; skyZenithColor[2] = colors[0][2]; skySunDirColor[0] = colors[1][0]; skySunDirColor[1] = colors[1][1]; skySunDirColor[2] = colors[1][2]; skyAntiSunDirColor[0] = colors[2][0]; skyAntiSunDirColor[1] = colors[2][1]; skyAntiSunDirColor[2] = colors[2][2]; skyCrossSunDirColor[0] = colors[3][0]; skyCrossSunDirColor[1] = colors[3][1]; skyCrossSunDirColor[2] = colors[3][2]; return; } void BackgroundRenderer::makeCelestialLists(const SceneRenderer& renderer) { setSkyColors(); // get a few other things concerning the sky doShadows = areShadowsCast(sunDirection); doStars = areStarsVisible(sunDirection); doSunset = getSunsetTop(sunDirection, sunsetTop); // make pretransformed display list for sun sunXFormList = glGenLists(1); glNewList(sunXFormList, GL_COMPILE); { glPushMatrix(); glRotatef((GLfloat)(atan2f(sunDirection[1], (sunDirection[0])) * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); glRotatef((GLfloat)(asinf(sunDirection[2]) * 180.0 / M_PI), 0.0f, -1.0f, 0.0f); glCallList(sunList); glPopMatrix(); } glEndList(); // compute display list for moon float coverage = (moonDirection[0] * sunDirection[0]) + (moonDirection[1] * sunDirection[1]) + (moonDirection[2] * sunDirection[2]); // hack coverage to lean towards full coverage = (coverage < 0.0f) ? -sqrtf(-coverage) : coverage * coverage; float worldSize = BZDBCache::worldSize; const float moonRadius = 2.0f * worldSize * atanf((float)((60.0 * M_PI / 180.0) / 60.0)); // limbAngle is dependent on moon position but sun is so much farther // away that the moon's position is negligible. rotate sun and moon // so that moon is on the horizon in the +x direction, then compute // the angle to the sun position in the yz plane. float sun2[3]; const float moonAzimuth = atan2f(moonDirection[1], moonDirection[0]); const float moonAltitude = asinf(moonDirection[2]); sun2[0] = sunDirection[0] * cosf(moonAzimuth) + sunDirection[1] * sinf(moonAzimuth); sun2[1] = sunDirection[1] * cosf(moonAzimuth) - sunDirection[0] * sinf(moonAzimuth); sun2[2] = sunDirection[2] * cosf(moonAltitude) - sun2[0] * sinf(moonAltitude); const float limbAngle = atan2f(sun2[2], sun2[1]); int moonSegements = (int)BZDB.eval("moonSegments"); moonList = glGenLists(1); glNewList(moonList, GL_COMPILE); { glPushMatrix(); glRotatef((GLfloat)(atan2f(moonDirection[1], moonDirection[0]) * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); glRotatef((GLfloat)(asinf(moonDirection[2]) * 180.0 / M_PI), 0.0f, -1.0f, 0.0f); glRotatef((float)(limbAngle * 180.0 / M_PI), 1.0f, 0.0f, 0.0f); glBegin(GL_TRIANGLE_STRIP); // glTexCoord2f(0,-1); glVertex3f(2.0f * worldSize, 0.0f, -moonRadius); for (int i = 0; i < moonSegements-1; i++) { const float angle = (float)(0.5 * M_PI * double(i-(moonSegements/2)-1) / (moonSegements/2.0)); float sinAngle = sinf(angle); float cosAngle = cosf(angle); // glTexCoord2f(coverage*cosAngle,sinAngle); glVertex3f(2.0f * worldSize, coverage * moonRadius * cosAngle,moonRadius * sinAngle); // glTexCoord2f(cosAngle,sinAngle); glVertex3f(2.0f * worldSize, moonRadius * cosAngle,moonRadius * sinAngle); } // glTexCoord2f(0,1); glVertex3f(2.0f * worldSize, 0.0f, moonRadius); glEnd(); glPopMatrix(); } glEndList(); // make pretransformed display list for stars starXFormList = glGenLists(1); glNewList(starXFormList, GL_COMPILE); { glPushMatrix(); glMultMatrixf(renderer.getCelestialTransform()); glScalef(worldSize, worldSize, worldSize); glCallList(starList); glPopMatrix(); } glEndList(); return; } void BackgroundRenderer::addCloudDrift(GLfloat uDrift, GLfloat vDrift) { cloudDriftU += 0.01f * uDrift / cloudRepeats; cloudDriftV += 0.01f * vDrift / cloudRepeats; if (cloudDriftU > 1.0f) cloudDriftU -= 1.0f; else if (cloudDriftU < 0.0f) cloudDriftU += 1.0f; if (cloudDriftV > 1.0f) cloudDriftV -= 1.0f; else if (cloudDriftV < 0.0f) cloudDriftV += 1.0f; } void BackgroundRenderer::renderSky(SceneRenderer& renderer, bool fullWindow, bool mirror) { if (!BZDBCache::drawSky) { return; } if (renderer.useQuality() > 0) { drawSky(renderer, mirror); } else { // low detail -- draw as damn fast as ya can, ie cheat. use glClear() // to draw solid color sky and ground. MainWindow& window = renderer.getWindow(); const int x = window.getOriginX(); const int y = window.getOriginY(); const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const SceneRenderer::ViewType viewType = renderer.getViewType(); // draw sky glDisable(GL_DITHER); glPushAttrib(GL_SCISSOR_BIT); glScissor(x, y + height - (viewHeight >> 1), width, (viewHeight >> 1)); glClearColor(skyZenithColor[0], skyZenithColor[1], skyZenithColor[2], 1.0f); glClear(GL_COLOR_BUFFER_BIT); // draw ground -- first get the color (assume it's all green) GLfloat _groundColor = 0.1f + 0.15f * renderer.getSunColor()[1]; if (fullWindow && viewType == SceneRenderer::ThreeChannel) glScissor(x, y, width, height >> 1); else if (fullWindow && viewType == SceneRenderer::Stacked) glScissor(x, y, width, height >> 1); #ifndef USE_GL_STEREO else if (fullWindow && viewType == SceneRenderer::Stereo) glScissor(x, y, width, height >> 1); #endif else glScissor(x, y + height - viewHeight, width, (viewHeight + 1) >> 1); if (invert) glClearColor(_groundColor, 0.0f, _groundColor, 0.0f); else glClearColor(0.0f, _groundColor, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); // back to normal glPopAttrib(); if (BZDB.isTrue("dither")) glEnable(GL_DITHER); } } void BackgroundRenderer::renderGround(SceneRenderer& renderer, bool fullWindow) { if (renderer.useQuality() > 0) { drawGround(); } else { // low detail -- draw as damn fast as ya can, ie cheat. use glClear() // to draw solid color sky and ground. MainWindow& window = renderer.getWindow(); const int x = window.getOriginX(); const int y = window.getOriginY(); const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const SceneRenderer::ViewType viewType = renderer.getViewType(); // draw sky glDisable(GL_DITHER); glPushAttrib(GL_SCISSOR_BIT); glScissor(x, y + height - (viewHeight >> 1), width, (viewHeight >> 1)); glClearColor(skyZenithColor[0], skyZenithColor[1], skyZenithColor[2], 1.0f); glClear(GL_COLOR_BUFFER_BIT); // draw ground -- first get the color (assume it's all green) GLfloat _groundColor = 0.1f + 0.15f * renderer.getSunColor()[1]; if (fullWindow && viewType == SceneRenderer::ThreeChannel) glScissor(x, y, width, height >> 1); else if (fullWindow && viewType == SceneRenderer::Stacked) glScissor(x, y, width, height >> 1); #ifndef USE_GL_STEREO else if (fullWindow && viewType == SceneRenderer::Stereo) glScissor(x, y, width, height >> 1); #endif else glScissor(x, y + height - viewHeight, width, (viewHeight + 1) >> 1); if (invert) glClearColor(_groundColor, 0.0f, _groundColor, 0.0f); else glClearColor(0.0f, _groundColor, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); // back to normal glPopAttrib(); if (BZDB.isTrue("dither")) glEnable(GL_DITHER); } } void BackgroundRenderer::renderGroundEffects(SceneRenderer& renderer, bool drawingMirror) { // zbuffer should be disabled. either everything is coplanar with // the ground or is drawn back to front and is occluded by everything // drawn after it. also use projection with very far clipping plane. // only draw the grid lines if texturing is disabled if (!BZDBCache::texture || (renderer.useQuality() <= 0)) { drawGroundGrid(renderer); } if (!blank) { if (doShadows && shadowsVisible && !drawingMirror) { drawGroundShadows(renderer); } // draw light receivers on ground (little meshes under light sources so // the ground gets illuminated). this is necessary because lighting is // performed only at a vertex, and the ground's vertices are a few // kilometers away. if (BZDBCache::blend && BZDBCache::lighting && !drawingMirror && BZDBCache::drawGroundLights) { if (BZDBCache::tesselation && (renderer.useQuality() >= 3)) { // (BZDB.get(StateDatabase::BZDB_FOGMODE) == "none")) { // not really tesselation, but it is tied to the "Best" lighting, // avoid on foggy maps, because the blending function accumulates // too much brightness. drawAdvancedGroundReceivers(renderer); } else { drawGroundReceivers(renderer); } } if (renderer.useQuality() > 1) { // light the mountains (so that they get dark when the sun goes down). // don't do zbuffer test since they occlude all drawn before them and // are occluded by all drawn after. if (mountainsVisible && BZDBCache::drawMountains) { drawMountains(); } // draw clouds if (cloudsVisible && BZDBCache::drawClouds) { cloudsGState.setState(); glMatrixMode(GL_TEXTURE); glPushMatrix(); glTranslatef(cloudDriftU, cloudDriftV, 0.0f); glCallList(cloudsList); glLoadIdentity(); // maybe works around bug in some systems glPopMatrix(); glMatrixMode(GL_MODELVIEW); } } } } void BackgroundRenderer::renderEnvironment(SceneRenderer& renderer, bool update) { if (blank) { return; } if (update) { weather.update(); } weather.draw(renderer); if (update) { EFFECTS.update(); } EFFECTS.draw(renderer); } void BackgroundRenderer::resizeSky() { // sky pyramid must fit inside far clipping plane // (adjusted for the deepProjection matrix) const GLfloat skySize = 3.0f * BZDBCache::worldSize; for (int i = 0; i < 4; i++) { skyPyramid[i][0] = skySize * squareShape[i][0]; skyPyramid[i][1] = skySize * squareShape[i][1]; skyPyramid[i][2] = 0.0f; } skyPyramid[4][0] = 0.0f; skyPyramid[4][1] = 0.0f; skyPyramid[4][2] = skySize; } void BackgroundRenderer::setupSkybox() { haveSkybox = false; int i; const char *(skyboxNames[6]) = { "LeftSkyboxMaterial", "FrontSkyboxMaterial", "RightSkyboxMaterial", "BackSkyboxMaterial", "TopSkyboxMaterial", "BottomSkyboxMaterial" }; TextureManager& tm = TextureManager::instance(); const BzMaterial* bzmats[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; // try to load the textures for (i = 0; i < 6; i++) { bzmats[i] = MATERIALMGR.findMaterial(skyboxNames[i]); if ((bzmats[i] == NULL) || (bzmats[i]->getTextureCount() <= 0)) { break; } skyboxTexID[i] = tm.getTextureID(bzmats[i]->getTextureLocal(0).c_str()); if (skyboxTexID[i] < 0) { break; } } // unload textures if they were not all successful if (i != 6) { while (i >= 0) { if ((bzmats[i] != NULL) && (bzmats[i]->getTextureCount() > 0)) { // NOTE: this could delete textures the might be used elsewhere tm.removeTexture(bzmats[i]->getTextureLocal(0).c_str()); } i--; } return; } // reference map specified materials for (i = 0; i < 6; i++) { ((BzMaterial*)bzmats[i])->setReference(); } // setup the wrap mode skyboxWrapMode = GL_CLAMP; #ifdef GL_VERSION_1_2 const char* extStr = (const char*) glGetString(GL_EXTENSIONS); if (strstr(extStr, "GL_EXT_texture_edge_clamp") != NULL) { skyboxWrapMode = GL_CLAMP_TO_EDGE; } #endif // setup the corner colors const int cornerFaces[8][3] = { {5, 0, 1}, {5, 1, 2}, {5, 2, 3}, {5, 3, 0}, {4, 0, 1}, {4, 1, 2}, {4, 2, 3}, {4, 3, 0} }; for (i = 0; i < 8; i++) { for (int c = 0; c < 4; c++) { skyboxColor[i][c] = 0.0f; for (int f = 0; f < 3; f++) { skyboxColor[i][c] += bzmats[cornerFaces[i][f]]->getDiffuse()[c]; } skyboxColor[i][c] /= 3.0f; } } haveSkybox = true; return; } void BackgroundRenderer::drawSkybox() { // sky box must fit inside far clipping plane // (adjusted for the deepProjection matrix) const float d = 3.0f * BZDBCache::worldSize; const GLfloat verts[8][3] = { {-d, -d, -d}, {+d, -d, -d}, {+d, +d, -d}, {-d, +d, -d}, {-d, -d, +d}, {+d, -d, +d}, {+d, +d, +d}, {-d, +d, +d} }; const GLfloat txcds[4][2] = { {1.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f} }; TextureManager& tm = TextureManager::instance(); OpenGLGState::resetState(); const GLfloat (*color)[4] = skyboxColor; glEnable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); glShadeModel(GL_SMOOTH); if (!BZDBCache::drawGround) { tm.bind(skyboxTexID[5]); // bottom glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[2]); glVertex3fv(verts[2]); glTexCoord2fv(txcds[1]); glColor3fv(color[3]); glVertex3fv(verts[3]); glTexCoord2fv(txcds[2]); glColor3fv(color[0]); glVertex3fv(verts[0]); glTexCoord2fv(txcds[3]); glColor3fv(color[1]); glVertex3fv(verts[1]); } glEnd(); } tm.bind(skyboxTexID[4]); // top glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[5]); glVertex3fv(verts[5]); glTexCoord2fv(txcds[1]); glColor3fv(color[4]); glVertex3fv(verts[4]); glTexCoord2fv(txcds[2]); glColor3fv(color[7]); glVertex3fv(verts[7]); glTexCoord2fv(txcds[3]); glColor3fv(color[6]); glVertex3fv(verts[6]); } glEnd(); tm.bind(skyboxTexID[0]); // left glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[0]); glVertex3fv(verts[0]); glTexCoord2fv(txcds[1]); glColor3fv(color[3]); glVertex3fv(verts[3]); glTexCoord2fv(txcds[2]); glColor3fv(color[7]); glVertex3fv(verts[7]); glTexCoord2fv(txcds[3]); glColor3fv(color[4]); glVertex3fv(verts[4]); } glEnd(); tm.bind(skyboxTexID[1]); // front glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[1]); glVertex3fv(verts[1]); glTexCoord2fv(txcds[1]); glColor3fv(color[0]); glVertex3fv(verts[0]); glTexCoord2fv(txcds[2]); glColor3fv(color[4]); glVertex3fv(verts[4]); glTexCoord2fv(txcds[3]); glColor3fv(color[5]); glVertex3fv(verts[5]); } glEnd(); tm.bind(skyboxTexID[2]); // right glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[2]); glVertex3fv(verts[2]); glTexCoord2fv(txcds[1]); glColor3fv(color[1]); glVertex3fv(verts[1]); glTexCoord2fv(txcds[2]); glColor3fv(color[5]); glVertex3fv(verts[5]); glTexCoord2fv(txcds[3]); glColor3fv(color[6]); glVertex3fv(verts[6]); } glEnd(); tm.bind(skyboxTexID[3]); // back glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, skyboxWrapMode); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, skyboxWrapMode); glBegin(GL_QUADS); { glTexCoord2fv(txcds[0]); glColor3fv(color[3]); glVertex3fv(verts[3]); glTexCoord2fv(txcds[1]); glColor3fv(color[2]); glVertex3fv(verts[2]); glTexCoord2fv(txcds[2]); glColor3fv(color[6]); glVertex3fv(verts[6]); glTexCoord2fv(txcds[3]); glColor3fv(color[7]); glVertex3fv(verts[7]); } glEnd(); glShadeModel(GL_FLAT); glEnable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); } void BackgroundRenderer::drawSky(SceneRenderer& renderer, bool mirror) { glPushMatrix(); const bool doSkybox = haveSkybox && (renderer.useQuality() >= 2); if (!doSkybox) { // rotate sky so that horizon-point-toward-sun-color is actually // toward the sun glRotatef((GLfloat)((atan2f(sunDirection[1], sunDirection[0]) * 180.0 + 135.0) / M_PI), 0.0f, 0.0f, 1.0f); // draw sky skyGState.setState(); if (!doSunset) { // just a pyramid glBegin(GL_TRIANGLE_FAN); glColor3fv(skyZenithColor); glVertex3fv(skyPyramid[4]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[0]); glColor3fv(skySunDirColor); glVertex3fv(skyPyramid[3]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[2]); glColor3fv(skyAntiSunDirColor); glVertex3fv(skyPyramid[1]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[0]); glEnd(); } else { // overall shape is a pyramid, but the solar sides are two // triangles each. the top triangle is all zenith color, // the bottom goes from zenith to sun-dir color. glBegin(GL_TRIANGLE_FAN); glColor3fv(skyZenithColor); glVertex3fv(skyPyramid[4]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[2]); glColor3fv(skyAntiSunDirColor); glVertex3fv(skyPyramid[1]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[0]); glEnd(); GLfloat sunsetTopPoint[3]; sunsetTopPoint[0] = skyPyramid[3][0] * (1.0f - sunsetTop); sunsetTopPoint[1] = skyPyramid[3][1] * (1.0f - sunsetTop); sunsetTopPoint[2] = skyPyramid[4][2] * sunsetTop; glBegin(GL_TRIANGLES); glColor3fv(skyZenithColor); glVertex3fv(skyPyramid[4]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[0]); glColor3fv(skyZenithColor); glVertex3fv(sunsetTopPoint); glVertex3fv(skyPyramid[4]); glVertex3fv(sunsetTopPoint); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[2]); glColor3fv(skyZenithColor); glVertex3fv(sunsetTopPoint); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[0]); glColor3fv(skySunDirColor); glVertex3fv(skyPyramid[3]); glColor3fv(skyCrossSunDirColor); glVertex3fv(skyPyramid[2]); glColor3fv(skyZenithColor); glVertex3fv(sunsetTopPoint); glColor3fv(skySunDirColor); glVertex3fv(skyPyramid[3]); glEnd(); } } glLoadIdentity(); renderer.getViewFrustum().executeOrientation(); const bool useClipPlane = (mirror && (doSkybox || BZDBCache::drawCelestial)); if (useClipPlane) { glEnable(GL_CLIP_PLANE0); const GLdouble plane[4] = {0.0, 0.0, +1.0, 0.0}; glClipPlane(GL_CLIP_PLANE0, plane); } if (doSkybox) { drawSkybox(); } if (BZDBCache::drawCelestial) { if (sunDirection[2] > -0.009f) { sunGState.setState(); glColor3fv(renderer.getSunScaledColor()); glCallList(sunXFormList); } if (doStars) { starGState[starGStateIndex].setState(); glCallList(starXFormList); } if (moonDirection[2] > -0.009f) { moonGState[doStars ? 1 : 0].setState(); glColor3f(1.0f, 1.0f, 1.0f); // if (useMoonTexture) // glEnable(GL_TEXTURE_2D); glCallList(moonList); } } if (useClipPlane) { glDisable(GL_CLIP_PLANE0); } glPopMatrix(); } void BackgroundRenderer::drawGround() { if (!BZDBCache::drawGround) return; { // draw ground glNormal3f(0.0f, 0.0f, 1.0f); if (invert) { glColor4fv(groundColorInv[styleIndex]); invGroundGState[styleIndex].setState(); } else { float color[4]; if (BZDB.isSet("GroundOverideColor") && parseColorString(BZDB.get("GroundOverideColor"), color)) { glColor4fv(color); } else { glColor4fv(groundColor[styleIndex]); } groundGState[styleIndex].setState(); } if (RENDERER.useQuality() >= 2) { drawGroundCentered(); } else { glCallList(simpleGroundList[styleIndex]); } } } void BackgroundRenderer::drawGroundCentered() { const float groundSize = 10.0f * BZDBCache::worldSize; const float centerSize = 128.0f; const ViewFrustum& frustum = RENDERER.getViewFrustum(); float center[2] = { frustum.getEye()[0], frustum.getEye()[1] }; const float minDist = -groundSize + centerSize; const float maxDist = +groundSize - centerSize; if (center[0] < minDist) { center[0] = minDist; } if (center[0] > maxDist) { center[0] = maxDist; } if (center[1] < minDist) { center[1] = minDist; } if (center[1] > maxDist) { center[1] = maxDist; } const float vertices[8][2] = { { -groundSize, -groundSize }, { +groundSize, -groundSize }, { +groundSize, +groundSize }, { -groundSize, +groundSize }, { center[0] - centerSize, center[1] - centerSize }, { center[0] + centerSize, center[1] - centerSize }, { center[0] + centerSize, center[1] + centerSize }, { center[0] - centerSize, center[1] + centerSize } }; const float repeat = BZDB.eval("groundHighResTexRepeat"); const int indices[5][4] = { { 4, 5, 6, 7 }, { 0, 1, 5, 4 }, { 1, 2, 6, 5 }, { 2, 3, 7, 6 }, { 3, 0, 4, 7 }, }; glNormal3f(0.0f, 0.0f, 1.0f); glBegin(GL_QUADS); { for (int q = 0; q < 5; q++) { for (int c = 0; c < 4; c++) { const int index = indices[q][c]; glTexCoord2f(vertices[index][0] * repeat, vertices[index][1] * repeat); glVertex2fv(vertices[index]); } } } glEnd(); return; } void BackgroundRenderer::drawGroundGrid( SceneRenderer& renderer) { const GLfloat* pos = renderer.getViewFrustum().getEye(); const GLfloat xhalf = gridSpacing * (gridCount + floorf(pos[2] / 4.0f)); const GLfloat yhalf = gridSpacing * (gridCount + floorf(pos[2] / 4.0f)); const GLfloat x0 = floorf(pos[0] / gridSpacing) * gridSpacing; const GLfloat y0 = floorf(pos[1] / gridSpacing) * gridSpacing; GLfloat i; gridGState.setState(); // x lines if (doShadows) glColor3f(0.0f, 0.75f, 0.5f); else glColor3f(0.0f, 0.4f, 0.3f); glBegin(GL_LINES); for (i = -xhalf; i <= xhalf; i += gridSpacing) { glVertex2f(x0 + i, y0 - yhalf); glVertex2f(x0 + i, y0 + yhalf); } glEnd(); /* z lines */ if (doShadows) glColor3f(0.5f, 0.75f, 0.0f); else glColor3f(0.3f, 0.4f, 0.0f); glBegin(GL_LINES); for (i = -yhalf; i <= yhalf; i += gridSpacing) { glVertex2f(x0 - xhalf, y0 + i); glVertex2f(x0 + xhalf, y0 + i); } glEnd(); } void BackgroundRenderer::drawGroundShadows( SceneRenderer& renderer) { // draw sun shadows -- always stippled so overlapping shadows don't // accumulate darkness. make and multiply by shadow projection matrix. GLfloat shadowProjection[16]; shadowProjection[0] = shadowProjection[5] = shadowProjection[15] = 1.0f; shadowProjection[8] = -sunDirection[0] / sunDirection[2]; shadowProjection[9] = -sunDirection[1] / sunDirection[2]; shadowProjection[1] = shadowProjection[2] = shadowProjection[3] = shadowProjection[4] = shadowProjection[6] = shadowProjection[7] = shadowProjection[10] = shadowProjection[11] = shadowProjection[12] = shadowProjection[13] = shadowProjection[14] = 0.0f; glPushMatrix(); glMultMatrixf(shadowProjection); // disable color updates SceneNode::setColorOverride(true); // disable the unused arrays glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); if (BZDBCache::stencilShadows) { OpenGLGState::resetState(); const float shadowAlpha = BZDB.eval("shadowAlpha"); glColor4f(0.0f, 0.0f, 0.0f, shadowAlpha); if (shadowAlpha < 1.0f) { // use the stencil to avoid overlapping shadows glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); glStencilFunc(GL_NOTEQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glEnable(GL_STENCIL_TEST); // turn on blending, and kill culling glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glDisable(GL_CULL_FACE); } } else { // use stippling to avoid overlapping shadows sunShadowsGState.setState(); glColor3f(0.0f, 0.0f, 0.0f); } // render those nodes renderer.getShadowList().render(); // revert to OpenGLGState defaults if (BZDBCache::stencilShadows) { glEnable(GL_CULL_FACE); glDisable(GL_BLEND); glDisable(GL_STENCIL_TEST); glBlendFunc(GL_ONE, GL_ZERO); } // enable color updates SceneNode::setColorOverride(false); OpenGLGState::resetState(); // re-enable the arrays glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glPopMatrix(); } static void setupBlackFog(float fogColor[4]) { static const float black[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; glGetFloatv(GL_FOG_COLOR, fogColor); glFogfv(GL_FOG_COLOR, black); } void BackgroundRenderer::drawGroundReceivers(SceneRenderer& renderer) { static const int receiverRings = 4; static const int receiverSlices = 8; static const float receiverRingSize = 1.2f; // meters static float angle[receiverSlices + 1][2]; static bool init = false; if (!init) { init = true; const float receiverSliceAngle = (float)(2.0 * M_PI / double(receiverSlices)); for (int i = 0; i <= receiverSlices; i++) { angle[i][0] = cosf((float)i * receiverSliceAngle); angle[i][1] = sinf((float)i * receiverSliceAngle); } } const int count = renderer.getNumAllLights(); if (count == 0) { return; } // bright sun dims intensity of ground receivers const float B = 1.0f - (0.6f * renderer.getSunBrightness()); receiverGState.setState(); // setup black fog float fogColor[4]; setupBlackFog(fogColor); glPushMatrix(); int i, j; for (int k = 0; k < count; k++) { const OpenGLLight& light = renderer.getLight(k); if (light.getOnlyReal()) { continue; } const GLfloat* pos = light.getPosition(); const GLfloat* lightColor = light.getColor(); const GLfloat* atten = light.getAttenuation(); // point under light float d = pos[2]; float I = B / (atten[0] + d * (atten[1] + d * atten[2])); // maximum value const float maxVal = (lightColor[0] > lightColor[1]) ? ((lightColor[0] > lightColor[2]) ? lightColor[0] : lightColor[2]) : ((lightColor[1] > lightColor[2]) ? lightColor[1] : lightColor[2]); // if I is too attenuated, don't bother drawing anything if ((I * maxVal) < 0.02f) { continue; } // move to the light's position glTranslatef(pos[0], pos[1], 0.0f); // set the main lighting color float color[4]; color[0] = lightColor[0]; color[1] = lightColor[1]; color[2] = lightColor[2]; color[3] = I; // draw ground receiver, computing lighting at each vertex ourselves glBegin(GL_TRIANGLE_FAN); { glColor4fv(color); glVertex2f(0.0f, 0.0f); // inner ring d = hypotf(receiverRingSize, pos[2]); I = B / (atten[0] + d * (atten[1] + d * atten[2])); I *= pos[2] / d; color[3] = I; glColor4fv(color); for (j = 0; j <= receiverSlices; j++) { glVertex2f(receiverRingSize * angle[j][0], receiverRingSize * angle[j][1]); } } glEnd(); triangleCount += receiverSlices; for (i = 1; i < receiverRings; i++) { const GLfloat innerSize = receiverRingSize * GLfloat(i * i); const GLfloat outerSize = receiverRingSize * GLfloat((i + 1) * (i + 1)); // compute inner and outer lit colors d = hypotf(innerSize, pos[2]); I = B / (atten[0] + d * (atten[1] + d * atten[2])); I *= pos[2] / d; float innerAlpha = I; if (i + 1 == receiverRings) { I = 0.0f; } else { d = hypotf(outerSize, pos[2]); I = B / (atten[0] + d * (atten[1] + d * atten[2])); I *= pos[2] / d; } float outerAlpha = I; glBegin(GL_QUAD_STRIP); { for (j = 0; j <= receiverSlices; j++) { color[3] = innerAlpha; glColor4fv(color); glVertex2f(angle[j][0] * innerSize, angle[j][1] * innerSize); color[3] = outerAlpha; glColor4fv(color); glVertex2f(angle[j][0] * outerSize, angle[j][1] * outerSize); } } glEnd(); } triangleCount += (receiverSlices * receiverRings * 2); glTranslatef(-pos[0], -pos[1], 0.0f); } glPopMatrix(); glFogfv(GL_FOG_COLOR, fogColor); } void BackgroundRenderer::drawAdvancedGroundReceivers(SceneRenderer& renderer) { const float minLuminance = 0.02f; static const int receiverSlices = 32; static const float receiverRingSize = 0.5f; // meters static float angle[receiverSlices + 1][2]; static bool init = false; if (!init) { init = true; const float receiverSliceAngle = (float)(2.0 * M_PI / double(receiverSlices)); for (int i = 0; i <= receiverSlices; i++) { angle[i][0] = cosf((float)i * receiverSliceAngle); angle[i][1] = sinf((float)i * receiverSliceAngle); } } const int count = renderer.getNumAllLights(); if (count == 0) { return; } // setup the ground tint const GLfloat* gndColor = groundColor[styleIndex]; GLfloat overrideColor[4]; if (BZDB.isSet("GroundOverideColor") && parseColorString(BZDB.get("GroundOverideColor"), overrideColor)) { gndColor = overrideColor; } const bool useTexture = BZDBCache::texture && (groundTextureID >= 0); OpenGLGState advGState; OpenGLGStateBuilder builder; builder.setShading(GL_SMOOTH); builder.setBlending((GLenum)GL_ONE, (GLenum)GL_ONE); if (useTexture) { builder.setTexture(groundTextureID); builder.setTextureMatrix(groundTextureMatrix); } advGState = builder.getState(); advGState.setState(); // setup black fog float fogColor[4]; setupBlackFog(fogColor); // lazy way to get texcoords if (useTexture) { const float repeat = BZDB.eval("groundHighResTexRepeat"); const float sPlane[4] = { repeat, 0.0f, 0.0f, 0.0f }; const float tPlane[4] = { 0.0f, repeat, 0.0f, 0.0f }; glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, sPlane); glTexGenfv(GL_T, GL_EYE_PLANE, tPlane); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); } glPushMatrix(); int i, j; for (int k = 0; k < count; k++) { const OpenGLLight& light = renderer.getLight(k); if (light.getOnlyReal()) { continue; } // get the light parameters const GLfloat* pos = light.getPosition(); const GLfloat* lightColor = light.getColor(); const GLfloat* atten = light.getAttenuation(); // point under light float d = pos[2]; float I = 1.0f / (atten[0] + d * (atten[1] + d * atten[2])); // set the main lighting color float baseColor[3]; baseColor[0] = gndColor[0] * lightColor[0]; baseColor[1] = gndColor[1] * lightColor[1]; baseColor[2] = gndColor[2] * lightColor[2]; if (invert) { // beats me, should just color logic op the static nodes baseColor[0] = 1.0f - baseColor[0]; baseColor[1] = 1.0f - baseColor[1]; baseColor[2] = 1.0f - baseColor[2]; } // maximum value const float maxVal = (baseColor[0] > baseColor[1]) ? ((baseColor[0] > baseColor[2]) ? baseColor[0] : baseColor[2]) : ((baseColor[1] > baseColor[2]) ? baseColor[1] : baseColor[2]); // if I is too attenuated, don't bother drawing anything if ((I * maxVal) < minLuminance) { continue; } // move to the light's position glTranslatef(pos[0], pos[1], 0.0f); float innerSize; float innerColor[3]; float outerSize; float outerColor[3]; // draw ground receiver, computing lighting at each vertex ourselves glBegin(GL_TRIANGLE_FAN); { // center point innerColor[0] = I * baseColor[0]; innerColor[1] = I * baseColor[1]; innerColor[2] = I * baseColor[2]; glColor3fv(innerColor); glVertex2f(0.0f, 0.0f); // inner ring d = hypotf(receiverRingSize, pos[2]); I = 1.0f / (atten[0] + d * (atten[1] + d * atten[2])); I *= pos[2] / d; // diffuse angle factor outerColor[0] = I * baseColor[0]; outerColor[1] = I * baseColor[1]; outerColor[2] = I * baseColor[2]; glColor3fv(outerColor); outerSize = receiverRingSize; for (j = 0; j <= receiverSlices; j++) { glVertex2f(outerSize * angle[j][0], outerSize * angle[j][1]); } } glEnd(); triangleCount += receiverSlices; bool moreRings = true; for (i = 2; moreRings; i++) { // inner ring innerSize = outerSize; memcpy(innerColor, outerColor, sizeof(float[3])); // outer ring outerSize = receiverRingSize * GLfloat(i * i); d = hypotf(outerSize, pos[2]); I = 1.0f / (atten[0] + d * (atten[1] + d * atten[2])); I *= pos[2] / d; // diffuse angle factor if ((I * maxVal) < minLuminance) { I = 0.0f; moreRings = false; // bail after this ring } outerColor[0] = I * baseColor[0]; outerColor[1] = I * baseColor[1]; outerColor[2] = I * baseColor[2]; glBegin(GL_QUAD_STRIP); { for (j = 0; j <= receiverSlices; j++) { glColor3fv(innerColor); glVertex2f(angle[j][0] * innerSize, angle[j][1] * innerSize); glColor3fv(outerColor); glVertex2f(angle[j][0] * outerSize, angle[j][1] * outerSize); } } glEnd(); } triangleCount += (receiverSlices * 2 * (i - 2)); glTranslatef(-pos[0], -pos[1], 0.0f); } glPopMatrix(); if (useTexture) { glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); } glFogfv(GL_FOG_COLOR, fogColor); } void BackgroundRenderer::drawMountains(void) { glColor3f(1.0f, 1.0f, 1.0f); for (int i = 0; i < numMountainTextures; i++) { mountainsGState[i].setState(); glCallList(mountainsList[i]); } } void BackgroundRenderer::doFreeDisplayLists() { int i; // don't forget the tag-along weather.freeContext(); EFFECTS.freeContext(); // simpleGroundList[1] && simpleGroundList[3] are copies of [0] & [2] simpleGroundList[1] = INVALID_GL_LIST_ID; simpleGroundList[3] = INVALID_GL_LIST_ID; // delete the single lists GLuint* const lists[] = { &simpleGroundList[0], &simpleGroundList[2], &cloudsList, &sunList, &sunXFormList, &moonList, &starList, &starXFormList }; const int count = countof(lists); for (i = 0; i < count; i++) { if (*lists[i] != INVALID_GL_LIST_ID) { glDeleteLists(*lists[i], 1); *lists[i] = INVALID_GL_LIST_ID; } } // delete the array of lists if (mountainsList != NULL) { for (i = 0; i < numMountainTextures; i++) { if (mountainsList[i] != INVALID_GL_LIST_ID) { glDeleteLists(mountainsList[i], 1); mountainsList[i] = INVALID_GL_LIST_ID; } } } return; } void BackgroundRenderer::doInitDisplayLists() { int i, j; SceneRenderer& renderer = RENDERER; // don't forget the tag-along weather.rebuildContext(); EFFECTS.rebuildContext(); // // sky stuff // // sun first. sun is a disk that should be about a half a degree wide // with a normal (60 degree) perspective. const float worldSize = BZDBCache::worldSize; const float sunRadius = (float)(2.0 * worldSize * atanf((float)(60.0*M_PI/180.0)) / 60.0); sunList = glGenLists(1); glNewList(sunList, GL_COMPILE); { glBegin(GL_TRIANGLE_FAN); { glVertex3f(2.0f * worldSize, 0.0f, 0.0f); for (i = 0; i < 20; i++) { const float angle = (float)(2.0 * M_PI * double(i) / 19.0); glVertex3f(2.0f * worldSize, sunRadius * sinf(angle), sunRadius * cosf(angle)); } } glEnd(); } glEndList(); // make stars list starList = glGenLists(1); glNewList(starList, GL_COMPILE); { glBegin(GL_POINTS); for (i = 0; i < (int)NumStars; i++) { glColor3fv(stars[i]); glVertex3fv(stars[i] + 3); } glEnd(); } glEndList(); // // ground // const GLfloat groundSize = 10.0f * worldSize; GLfloat groundPlane[4][3]; for (i = 0; i < 4; i++) { groundPlane[i][0] = groundSize * squareShape[i][0]; groundPlane[i][1] = groundSize * squareShape[i][1]; groundPlane[i][2] = 0.0f; } { GLfloat xmin, xmax; GLfloat ymin, ymax; GLfloat xdist, ydist; GLfloat xtexmin, xtexmax; GLfloat ytexmin, ytexmax; GLfloat xtexdist, ytexdist; float vec[2]; #define GROUND_DIVS (4) //FIXME -- seems to be enough xmax = groundPlane[0][0]; ymax = groundPlane[0][1]; xmin = groundPlane[2][0]; ymin = groundPlane[2][1]; xdist = (xmax - xmin) / (float)GROUND_DIVS; ydist = (ymax - ymin) / (float)GROUND_DIVS; renderer.getGroundUV (groundPlane[0], vec); xtexmax = vec[0]; ytexmax = vec[1]; renderer.getGroundUV (groundPlane[2], vec); xtexmin = vec[0]; ytexmin = vec[1]; xtexdist = (xtexmax - xtexmin) / (float)GROUND_DIVS; ytexdist = (ytexmax - ytexmin) / (float)GROUND_DIVS; simpleGroundList[2] = glGenLists(1); glNewList(simpleGroundList[2], GL_COMPILE); { for (i = 0; i < GROUND_DIVS; i++) { GLfloat yoff, ytexoff; yoff = ymin + ydist * (GLfloat)i; ytexoff = ytexmin + ytexdist * (GLfloat)i; glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(xtexmin, ytexoff + ytexdist); glVertex2f(xmin, yoff + ydist); glTexCoord2f(xtexmin, ytexoff); glVertex2f(xmin, yoff); for (j = 0; j < GROUND_DIVS; j++) { GLfloat xoff, xtexoff; xoff = xmin + xdist * (GLfloat)(j + 1); xtexoff = xtexmin + xtexdist * (GLfloat)(j + 1); glTexCoord2f(xtexoff, ytexoff + ytexdist); glVertex2f(xoff, yoff + ydist); glTexCoord2f(xtexoff, ytexoff); glVertex2f(xoff, yoff); } glEnd(); } } glEndList(); } simpleGroundList[0] = glGenLists(1); glNewList(simpleGroundList[0], GL_COMPILE); { glBegin(GL_TRIANGLE_STRIP); glVertex2fv(groundPlane[0]); glVertex2fv(groundPlane[1]); glVertex2fv(groundPlane[3]); glVertex2fv(groundPlane[2]); glEnd(); } glEndList(); simpleGroundList[1] = simpleGroundList[0]; simpleGroundList[3] = simpleGroundList[2]; // // clouds // if (cloudsAvailable) { // make vertices for cloud polygons GLfloat cloudsOuter[4][3], cloudsInner[4][3]; const GLfloat uvScale = 0.25f; for (i = 0; i < 4; i++) { cloudsOuter[i][0] = groundPlane[i][0]; cloudsOuter[i][1] = groundPlane[i][1]; cloudsOuter[i][2] = groundPlane[i][2] + 120.0f * BZDBCache::tankHeight; cloudsInner[i][0] = uvScale * cloudsOuter[i][0]; cloudsInner[i][1] = uvScale * cloudsOuter[i][1]; cloudsInner[i][2] = cloudsOuter[i][2]; } cloudsList = glGenLists(1); glNewList(cloudsList, GL_COMPILE); { glNormal3f(0.0f, 0.0f, 1.0f); // inner clouds -- full opacity glBegin(GL_QUADS); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[3][0], uvScale * cloudRepeats * squareShape[3][1]); glVertex3fv(cloudsInner[3]); glTexCoord2f(uvScale * cloudRepeats * squareShape[2][0], uvScale * cloudRepeats * squareShape[2][1]); glVertex3fv(cloudsInner[2]); glTexCoord2f(uvScale * cloudRepeats * squareShape[1][0], uvScale * cloudRepeats * squareShape[1][1]); glVertex3fv(cloudsInner[1]); glTexCoord2f(uvScale * cloudRepeats * squareShape[0][0], uvScale * cloudRepeats * squareShape[0][1]); glVertex3fv(cloudsInner[0]); glEnd(); // outer clouds -- fade to zero opacity at outer edge glBegin(GL_TRIANGLE_STRIP); glColor4f(1.0f, 1.0f, 1.0f, 0.0f); glTexCoord2f(cloudRepeats * squareShape[1][0], cloudRepeats * squareShape[1][1]); glVertex3fv(cloudsOuter[1]); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[1][0], uvScale * cloudRepeats * squareShape[1][1]); glVertex3fv(cloudsInner[1]); glColor4f(1.0f, 1.0f, 1.0f, 0.0f); glTexCoord2f(cloudRepeats * squareShape[2][0], cloudRepeats * squareShape[2][1]); glVertex3fv(cloudsOuter[2]); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[2][0], uvScale * cloudRepeats * squareShape[2][1]); glVertex3fv(cloudsInner[2]); glColor4f(1.0f, 1.0f, 1.0f, 0.0f); glTexCoord2f(cloudRepeats * squareShape[3][0], cloudRepeats * squareShape[3][1]); glVertex3fv(cloudsOuter[3]); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[3][0], uvScale * cloudRepeats * squareShape[3][1]); glVertex3fv(cloudsInner[3]); glColor4f(1.0f, 1.0f, 1.0f, 0.0f); glTexCoord2f(cloudRepeats * squareShape[0][0], cloudRepeats * squareShape[0][1]); glVertex3fv(cloudsOuter[0]); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[0][0], uvScale * cloudRepeats * squareShape[0][1]); glVertex3fv(cloudsInner[0]); glColor4f(1.0f, 1.0f, 1.0f, 0.0f); glTexCoord2f(cloudRepeats * squareShape[1][0], cloudRepeats * squareShape[1][1]); glVertex3fv(cloudsOuter[1]); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glTexCoord2f(uvScale * cloudRepeats * squareShape[1][0], uvScale * cloudRepeats * squareShape[1][1]); glVertex3fv(cloudsInner[1]); glEnd(); } glEndList(); } // // mountains // if (numMountainTextures > 0) { // prepare display lists. need at least NumMountainFaces, but // we also need a multiple of the number of subtextures. put // all the faces using a given texture into the same list. const int numFacesPerTexture = (NumMountainFaces + numMountainTextures - 1) / numMountainTextures; const float angleScale = (float)(M_PI / (numMountainTextures * numFacesPerTexture)); int n = numFacesPerTexture / 2; float hightScale = mountainsMinWidth / 256.0f; for (j = 0; j < numMountainTextures; n += numFacesPerTexture, j++) { mountainsList[j] = glGenLists(1); glNewList(mountainsList[j], GL_COMPILE); { glBegin(GL_TRIANGLE_STRIP); for (i = 0; i <= numFacesPerTexture; i++) { const float angle = angleScale * (float)(i + n); float frac = (float)i / (float)numFacesPerTexture; if (numMountainTextures != 1) frac = (frac * (float)(mountainsMinWidth - 2) + 1.0f) / (float)mountainsMinWidth; glNormal3f((float)(-M_SQRT1_2 * cosf(angle)), (float)(-M_SQRT1_2 * sinf(angle)), (float)M_SQRT1_2); glTexCoord2f(frac, 0.02f); glVertex3f(2.25f * worldSize * cosf(angle), 2.25f * worldSize * sinf(angle), 0.0f); glTexCoord2f(frac, 0.99f); glVertex3f(2.25f * worldSize * cosf(angle), 2.25f * worldSize * sinf(angle), 0.45f * worldSize * hightScale); } glEnd(); glBegin(GL_TRIANGLE_STRIP); for (i = 0; i <= numFacesPerTexture; i++) { const float angle = (float)(M_PI + angleScale * (double)(i + n)); float frac = (float)i / (float)numFacesPerTexture; if (numMountainTextures != 1) frac = (frac * (float)(mountainsMinWidth - 2) + 1.0f) / (float)mountainsMinWidth; glNormal3f((float)(-M_SQRT1_2 * cosf(angle)), (float)(-M_SQRT1_2 * sinf(angle)), (float)M_SQRT1_2); glTexCoord2f(frac, 0.02f); glVertex3f(2.25f * worldSize * cosf(angle), 2.25f * worldSize * sinf(angle), 0.0f); glTexCoord2f(frac, 0.99f); glVertex3f(2.25f * worldSize * cosf(angle), 2.25f * worldSize * sinf(angle), 0.45f * worldSize*hightScale); } glEnd(); } glEndList(); } } // // update objects in sky. the appearance of these objects will // be wrong until setCelestial is called with the appropriate // arguments. // makeCelestialLists(renderer); } void BackgroundRenderer::freeContext(void* self) { ((BackgroundRenderer*)self)->doFreeDisplayLists(); } void BackgroundRenderer::initContext(void* self) { ((BackgroundRenderer*)self)->doInitDisplayLists(); } const GLfloat* BackgroundRenderer::getSunDirection() const { if (areShadowsCast(sunDirection)) { return sunDirection; } else { return NULL; } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/BackgroundRenderer.h000066400000000000000000000131201200563112200214070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * BackgroundRenderer: * Encapsulates rendering background stuff * * FIXME -- should be abstract base for background rendering */ #ifndef BZF_BACKGROUND_RENDERER_H #define BZF_BACKGROUND_RENDERER_H #include "common.h" /* system headers */ #include /* common interface headers */ #include "bzfgl.h" #include "OpenGLGState.h" #include "SceneRenderer.h" #include "WeatherRenderer.h" class BackgroundRenderer { public: BackgroundRenderer(const SceneRenderer&); ~BackgroundRenderer(); void setupGroundMaterials(); void setupSkybox(); void renderSky(SceneRenderer&, bool fullWindow, bool mirror); void renderGround(SceneRenderer&, bool fullWindow); void renderGroundEffects(SceneRenderer&, bool drawingMirror); void renderEnvironment(SceneRenderer&, bool update); void resize(); bool getBlank() const; bool getInvert() const; bool getSimpleGround() const; const GLfloat* getSunDirection() const; void setBlank(bool blank = true); void setInvert(bool invert = true); void setSimpleGround(bool simple = true); void setCelestial(const SceneRenderer&, const float sunDirection[3], const float moonDirection[3]); void addCloudDrift(GLfloat uDrift, GLfloat vDrift); void notifyStyleChange(); int getTriangleCount() const; void resetTriangleCount(); std::string userTextures[2]; protected: void drawSky(SceneRenderer&, bool mirror); void drawSkybox(); void drawGround(void); void drawGroundCentered(void); void drawGroundGrid(SceneRenderer&); void drawGroundShadows(SceneRenderer&); void drawGroundReceivers(SceneRenderer&); void drawAdvancedGroundReceivers(SceneRenderer&); void drawMountains(void); private: BackgroundRenderer(const BackgroundRenderer&); BackgroundRenderer& operator=(const BackgroundRenderer&); void resizeSky(); void doFreeDisplayLists(); void doInitDisplayLists(); void setSkyColors(); void makeCelestialLists(const SceneRenderer&); static void freeContext(void*); static void initContext(void*); static void bzdbCallback(const std::string&, void*); private: // rendering state bool blank; bool invert; bool simpleGround; int style; int styleIndex; // stuff for ground OpenGLGState groundGState[4]; OpenGLGState invGroundGState[4]; GLuint simpleGroundList[4]; int groundTextureID; const GLfloat* groundTextureMatrix; // stuff for grid GLfloat gridSpacing; GLfloat gridCount; OpenGLGState gridGState; // stuff for ground receivers OpenGLGState receiverGState; // stuff for mountains bool mountainsAvailable; bool mountainsVisible; int numMountainTextures; int mountainsMinWidth; OpenGLGState* mountainsGState; GLuint* mountainsList; // stuff for clouds GLfloat cloudDriftU, cloudDriftV; bool cloudsAvailable; bool cloudsVisible; OpenGLGState cloudsGState; GLuint cloudsList; // weather WeatherRenderer weather; // stuff for sun shadows bool doShadows; bool shadowsVisible; OpenGLGState sunShadowsGState; // celestial stuff bool haveSkybox; GLenum skyboxWrapMode; int skyboxTexID[6]; GLfloat skyboxColor[8][4]; bool doStars; bool doSunset; GLfloat skyZenithColor[3]; GLfloat skySunDirColor[3]; GLfloat skyAntiSunDirColor[3]; GLfloat skyCrossSunDirColor[3]; float sunDirection[3]; float moonDirection[3]; float sunAzimuth; float sunsetTop; int starGStateIndex; OpenGLGState skyGState; OpenGLGState sunGState; OpenGLGState moonGState[2]; OpenGLGState starGState[2]; GLuint sunList; GLuint sunXFormList; GLuint moonList; GLuint starList; GLuint starXFormList; static GLfloat skyPyramid[5][3]; static const GLfloat cloudRepeats; static GLfloat rcvrGroundColor[4][4]; static GLfloat rcvrGroundInvColor[4][4]; static GLfloat groundColor[4][4]; static GLfloat groundColorInv[4][4]; static const GLfloat defaultGroundColor[4][4]; static const GLfloat defaultGroundColorInv[4][4]; static const GLfloat receiverColor[3]; static const GLfloat receiverColorInv[3]; int triangleCount; }; // // BackgroundRenderer // inline bool BackgroundRenderer::getBlank() const { return blank; } inline void BackgroundRenderer::setBlank(bool _blank) { blank = _blank; } inline bool BackgroundRenderer::getInvert() const { return invert; } inline void BackgroundRenderer::setInvert(bool _invert) { invert = _invert; } inline bool BackgroundRenderer::getSimpleGround() const { return simpleGround; } inline void BackgroundRenderer::setSimpleGround(bool _simple) { simpleGround = _simple; } inline int BackgroundRenderer::getTriangleCount() const { return triangleCount; } inline void BackgroundRenderer::resetTriangleCount() { triangleCount = 0; } #endif // BZF_BACKGROUND_RENDERER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/BaseLocalPlayer.cxx000066400000000000000000000064661200563112200212350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "BaseLocalPlayer.h" /* common implementation headers */ #include "BZDBCache.h" #include "playing.h" BaseLocalPlayer::BaseLocalPlayer(const PlayerId& _id, const char* name, const char* _motto) : Player(_id, RogueTeam, name, _motto, TankPlayer), lastTime(TimeKeeper::getTick()), salt(0) { lastPosition[0] = 0.0f; lastPosition[1] = 0.0f; lastPosition[2] = 0.0f; bbox[0][0] = bbox[1][0] = 0.0f; bbox[0][1] = bbox[1][1] = 0.0f; bbox[0][2] = bbox[1][2] = 0.0f; } BaseLocalPlayer::~BaseLocalPlayer() { // do nothing } int BaseLocalPlayer::getSalt() { salt = (salt + 1) & 127; return salt << 8; } void BaseLocalPlayer::update(float inputDT) { // save last position const float* oldPosition = getPosition(); // update by time step float dt = float(TimeKeeper::getTick() - lastTime); if (dt < MIN_DT_LIMIT) return; lastPosition[0] = oldPosition[0]; lastPosition[1] = oldPosition[1]; lastPosition[2] = oldPosition[2]; lastTime = TimeKeeper::getTick(); if (inputDT > 0) dt = inputDT; if (dt < MIN_DT_LIMIT) dt = MIN_DT_LIMIT; float dtLimit = MAX_DT_LIMIT; float doneDT = dt; if (dt > dtLimit) { dt = dtLimit; doneDT -= dtLimit; } while (doneDT > 0) { // update by time step lastTime = TimeKeeper::getTick(); doUpdateMotion(dt); // compute motion's bounding box around center of tank const float* newVelocity = getVelocity(); bbox[0][0] = bbox[1][0] = oldPosition[0]; bbox[0][1] = bbox[1][1] = oldPosition[1]; bbox[0][2] = bbox[1][2] = oldPosition[2]; if (newVelocity[0] > 0.0f) bbox[1][0] += dt * newVelocity[0]; else bbox[0][0] += dt * newVelocity[0]; if (newVelocity[1] > 0.0f) bbox[1][1] += dt * newVelocity[1]; else bbox[0][1] += dt * newVelocity[1]; if (newVelocity[2] > 0.0f) bbox[1][2] += dt * newVelocity[2]; else bbox[0][2] += dt * newVelocity[2]; // expand bounding box to include entire tank float size = BZDBCache::tankRadius; if (getFlag() == Flags::Obesity) size *= BZDB.eval(StateDatabase::BZDB_OBESEFACTOR); else if (getFlag() == Flags::Tiny) size *= BZDB.eval(StateDatabase::BZDB_TINYFACTOR); else if (getFlag() == Flags::Thief) size *= BZDB.eval(StateDatabase::BZDB_THIEFTINYFACTOR); bbox[0][0] -= size; bbox[1][0] += size; bbox[0][1] -= size; bbox[1][1] += size; bbox[1][2] += BZDBCache::tankHeight; // do remaining update stuff doUpdate(dt); // subtract another chunk doneDT -= dtLimit; // if we only have a nubby left, don't do a full dt. if (doneDT < dtLimit) dt = doneDT; } } Ray BaseLocalPlayer::getLastMotion() const { return Ray(lastPosition, getVelocity()); } const float (*BaseLocalPlayer::getLastMotionBBox() const)[3] { return bbox; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/BaseLocalPlayer.h000066400000000000000000000027641200563112200206570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BASELOCALPLAYER_H__ #define __BASELOCALPLAYER_H__ // common - 1st one #include "common.h" /* common interface headers */ #include "Ray.h" #include "TimeKeeper.h" /* local interface headers */ #include "Player.h" #include "ShotPath.h" class BaseLocalPlayer : public Player { public: BaseLocalPlayer(const PlayerId&, const char* name, const char* motto); ~BaseLocalPlayer(); void update(float inputDT = -1.0f); Ray getLastMotion() const; const float (*getLastMotionBBox() const)[3]; virtual void explodeTank() = 0; virtual bool checkHit(const Player* source, const ShotPath*& hit, float& minTime) const = 0; protected: int getSalt(); virtual void doUpdate(float dt) = 0; virtual void doUpdateMotion(float dt) = 0; protected: TimeKeeper lastTime; float lastPosition[3]; // bbox of last motion float bbox[2][3]; private: int salt; }; #endif /* __BASELOCALPLAYER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/CacheMenu.cxx000066400000000000000000000177161200563112200200630ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "CacheMenu.h" /* common implementation headers */ #include "FontManager.h" /* local implementation headers */ #include "MainMenu.h" #include "Downloads.h" #include "CacheManager.h" #include "ServerListCache.h" #include "HUDuiList.h" #include "playing.h" #include "HUDui.h" CacheMenu::CacheMenu(): center() { // cache font face ID int fontFace = MainMenu::getFontFace(); // add controls std::vector& listHUD = getControls(); // the menu label HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Cache Settings"); listHUD.push_back(label); // the menu options HUDuiList* option; std::vector* options; // Server List Cache Time option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Server List Cache:"); option->setCallback(callback, (void*)"s"); options = &option->getList(); options->push_back(std::string("Off / Backup Mode")); options->push_back(std::string("5 Minutes")); options->push_back(std::string("15 Minutes")); options->push_back(std::string("30 Minutes")); options->push_back(std::string("1 Hour")); options->push_back(std::string("5 Hours")); options->push_back(std::string("15 Hours")); options->push_back(std::string("1 day")); options->push_back(std::string("15 days")); options->push_back(std::string("30 days")); option->update(); listHUD.push_back(option); // Server List Cache Clear clearServerListCache = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Clear Server List Cache"); listHUD.push_back(label); // Cache Size (MegaBytes) cacheSize = new HUDuiTypeIn; cacheSize->setFontFace(MainMenu::getFontFace()); cacheSize->setLabel("Cache Size (MB):"); cacheSize->setMaxLength(4); cacheSize->setString(BZDB.get("maxCacheMB")); listHUD.push_back(cacheSize); // Clear Download Cache clearDownloadCache = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Clear Download Cache"); listHUD.push_back(label); // Automatic Downloads option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Automatic Downloads:"); option->setCallback(callback, (void*)"d"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Connection Updates option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Connection Updates:"); option->setCallback(callback, (void*)"u"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Update Download Cache updateDownloadCache = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Update Downloads"); listHUD.push_back(label); // Failed Message (download status) failedMessage = new HUDuiLabel; failedMessage->setFontFace(fontFace); failedMessage->setString(""); listHUD.push_back(failedMessage); initNavigation(listHUD, 1, listHUD.size() - 2); return; } CacheMenu::~CacheMenu() { return; } void CacheMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == cacheSize) { BZDB.set("maxCacheMB", cacheSize->getString().c_str()); int maxCacheMB = BZDB.evalInt("maxCacheMB"); if (maxCacheMB < 0) { BZDB.set("maxCacheMB", "0"); HUDuiTypeIn* inputField = (HUDuiTypeIn*) _focus; inputField->setString("0"); } } else if (_focus == updateDownloadCache) { controlPanel->addMessage("Updating Downloads"); Downloads::startDownloads(true, true, true); } else if (_focus == clearDownloadCache) { const std::string oldSize = BZDB.get("maxCacheMB"); BZDB.set("maxCacheMB", "0"); CACHEMGR.loadIndex(); CACHEMGR.limitCacheSize(); CACHEMGR.saveIndex(); BZDB.set("maxCacheMB", oldSize); controlPanel->addMessage("Download Cache Cleared"); } else if (_focus == clearServerListCache) { if ((ServerListCache::get())->clearCache()){ controlPanel->addMessage("Server List Cache Cleared"); } else { // already cleared -- do nothing } } } void CacheMenu::setFailedMessage(const char* msg) { failedMessage->setString(msg); FontManager &fm = FontManager::instance(); const float _width = fm.getStrLength(MainMenu::getFontFace(), failedMessage->getFontSize(), failedMessage->getString()); failedMessage->setPosition(center - 0.5f * _width, failedMessage->getY()); } void CacheMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); center = 0.5f * (float)_width; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * (float)_width; y -= 0.6f * titleHeight; const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); const int count = listHUD.size(); int i; for (i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); if ((i == 2) || (i == 4) || (i == 7)) { y -= 1.75f * h; } else { y -= 1.0f * h; } } // load current settings i = 1; // server cache age int index = 0; switch ((ServerListCache::get())->getMaxCacheAge()){ case 0: index = 0; break; case 5: index = 1; break; case 15: index = 2; break; case 30: index = 3; break; case 60: index = 4; break; case 60*5: index = 5; break; case 60*15: index = 6; break; case 60*24: index = 7; break; case 60*24*15: index = 8; break; case 60*24*30: index = 9; break; default: index = 4; } ((HUDuiList*)listHUD[i++])->setIndex(index); i++; // clear cache label i++; // cache size i++; // clear downloads cache ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("doDownloads") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("updateDownloads") ? 1 : 0); i++; // update downloads now return; } void CacheMenu::callback(HUDuiControl* w, void* data) { HUDuiList* list = (HUDuiList*)w; switch (((const char*)data)[0]) { case 'd': { BZDB.set("doDownloads", list->getIndex() ? "1" : "0"); break; } case 'u': { BZDB.set("updateDownloads", list->getIndex() ? "1" : "0"); break; } case 's': { // server cache time_t minutes = 0; int index = list->getIndex(); switch (index){ case 0: minutes = 0; break; case 1: minutes = 5; break; case 2: minutes = 15; break; case 3: minutes = 30; break; case 4: minutes = 60; break; case 5: minutes = 60*5; break; case 6: minutes = 60*15; break; case 7: minutes = 60*24; break; case 8: minutes = 60*24*15; break; case 9: minutes = 60*24*30; break; } (ServerListCache::get())->setMaxCacheAge(minutes); break; } } return; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/CacheMenu.h000066400000000000000000000026701200563112200175010ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __CACHEMENU_H__ #define __CACHEMENU_H__ #include "common.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDDialog.h" #include "HUDuiLabel.h" #include "HUDuiTypeIn.h" #include "HUDuiDefaultKey.h" /** this class provides options for setting the gui */ class CacheMenu : public HUDDialog { public: CacheMenu(); ~CacheMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); void setFailedMessage(const char* msg); static void callback(HUDuiControl* w, void* data); private: float center; HUDuiLabel* failedMessage; HUDuiTypeIn* cacheSize; HUDuiControl* updateDownloadCache; HUDuiControl* clearDownloadCache; HUDuiControl* clearServerListCache; }; #endif /* __CACHEMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/CommandsImplementation.cxx000066400000000000000000000520571200563112200226770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // BZFlag common header #include "common.h" // system implementation headers #include #include // common implementation headers #include "BZDBCache.h" #include "AnsiCodes.h" #include "TextUtils.h" #include "CommandsStandard.h" #include "TextureManager.h" #include "DirectoryNames.h" #include "KeyManager.h" // local implementation headers #include "LocalCommand.h" #include "Roster.h" #include "playing.h" #include "bzglob.h" #include "Roaming.h" #include "ServerLink.h" #include "LocalPlayer.h" // class definitions class CommandList : LocalCommand { public: CommandList(); bool operator() (const char *commandLine); }; class BindCommand : LocalCommand { public: BindCommand(); bool operator() (const char *commandLine); }; class SilenceCommand : LocalCommand { public: SilenceCommand(); bool operator() (const char *commandLine); }; class UnsilenceCommand : LocalCommand { public: UnsilenceCommand(); bool operator() (const char *commandLine); }; class DumpCommand : LocalCommand { public: DumpCommand(); bool operator() (const char *commandLine); }; class ClientQueryCommand : LocalCommand { public: ClientQueryCommand(); bool operator() (const char *commandLine); }; class HighlightCommand : LocalCommand { public: HighlightCommand(); bool operator() (const char *commandLine); }; class SetCommand : LocalCommand { public: SetCommand(); bool operator() (const char *commandLine); }; class DiffCommand : LocalCommand { public: DiffCommand(); bool operator() (const char *commandLine); }; class LocalSetCommand : LocalCommand { public: LocalSetCommand(); bool operator() (const char *commandLine); }; class QuitCommand : LocalCommand { public: QuitCommand(); bool operator() (const char *commandLine); }; class RoamPosCommand : LocalCommand { public: RoamPosCommand(); bool operator() (const char *commandLine); }; class ReTextureCommand : LocalCommand { public: ReTextureCommand(); bool operator() (const char *commandLine); }; class SaveMsgsCommand : LocalCommand { public: SaveMsgsCommand(); bool operator() (const char *commandLine); }; class SaveWorldCommand : LocalCommand { public: SaveWorldCommand(); bool operator() (const char *commandLine); }; class ForceRadarCommand : LocalCommand { public: ForceRadarCommand(); bool operator() (const char *commandLine); }; class DebugLevelCommand : LocalCommand { public: DebugLevelCommand(); bool operator() (const char *commandLine); }; // class instantiations static CommandList commandList; static BindCommand bindCommand; static SilenceCommand silenceCommand; static UnsilenceCommand unsilenceCommand; static DumpCommand dumpCommand; static ClientQueryCommand clientQueryCommand; static HighlightCommand highlightCommand; static SetCommand setCommand; static DiffCommand diffCommand; static LocalSetCommand localSetCommand; static QuitCommand quitCommand; static RoamPosCommand RoamPosCommand; static ReTextureCommand reTextureCommand; static SaveMsgsCommand saveMsgsCommand; static SaveWorldCommand saveWorldCommand; static ForceRadarCommand forceRadarCommand; static DebugLevelCommand DebugLevelCommand; // class constructors BindCommand::BindCommand() : LocalCommand("/bind") {} CommandList::CommandList() : LocalCommand("/cmds") {} DiffCommand::DiffCommand() : LocalCommand("/diff") {} DumpCommand::DumpCommand() : LocalCommand("/dumpvars") {} HighlightCommand::HighlightCommand() : LocalCommand("/highlight") {} LocalSetCommand::LocalSetCommand() : LocalCommand("/localset") {} QuitCommand::QuitCommand() : LocalCommand("/quit") {} ReTextureCommand::ReTextureCommand() : LocalCommand("/retexture") {} RoamPosCommand::RoamPosCommand() : LocalCommand("/roampos") {} SaveMsgsCommand::SaveMsgsCommand() : LocalCommand("/savemsgs") {} SaveWorldCommand::SaveWorldCommand() : LocalCommand("/saveworld") {} ForceRadarCommand::ForceRadarCommand() : LocalCommand("/forceradar") {} DebugLevelCommand::DebugLevelCommand() : LocalCommand("/debug") {} SetCommand::SetCommand() : LocalCommand("/set") {} SilenceCommand::SilenceCommand() : LocalCommand("/silence") {} UnsilenceCommand::UnsilenceCommand() : LocalCommand("/unsilence") {} ClientQueryCommand::ClientQueryCommand() : LocalCommand("CLIENTQUERY") {} // the meat of the matter bool CommandList::operator() (const char * UNUSED(cmdLine)) { int i; const int maxLineLen = 64; // build a std::vector<> from the std::map<> of command names std::vector cmds; MapOfCommands::iterator it; MapOfCommands& commandMap = *mapOfCommands; for (it = commandMap.begin(); it != commandMap.end(); ++it) { const std::string& cmd = it->first; cmds.push_back(&cmd); } const int cmdCount = (int)cmds.size(); // get the maximum length unsigned int maxCmdLen = 0; for (i = 0; i < cmdCount; i++) { if (cmds[i]->size() > maxCmdLen) { maxCmdLen = cmds[i]->size(); } } maxCmdLen += 2; // add some padding // message generation variables char buffer[MessageLen]; char* cptr = buffer; char format[8]; snprintf(format, 8, "%%-%is", maxCmdLen); // formatting parameters const int cols = (maxLineLen / maxCmdLen); const int rows = ((cmdCount + (cols - 1)) / cols); addMessage(NULL, ANSI_STR_UNDERLINE ANSI_STR_FG_BLACK "Client-side Commands"); const char* prefix = ANSI_STR_FG_YELLOW ANSI_STR_PULSATING "[CLIENT->] " ANSI_STR_RESET; const int prefixLen = strlen(prefix); for (int row = 0; row < rows; row++) { cptr = buffer; strncpy(buffer, prefix, MessageLen); cptr += prefixLen; for (int col = 0; col < cols; col++) { const int index = (col * rows) + row; if (index >= cmdCount) { break; } sprintf(cptr, format, cmds[index]->c_str()); cptr += maxCmdLen; } addMessage(NULL, buffer); } addMessage(NULL, ANSI_STR_UNDERLINE ANSI_STR_FG_BLACK "Server-side Commands"); const char* msg = "/?"; const int msgLen = strlen(msg) + 1; cptr = (char*) nboPackUByte(buffer, ServerPlayer); nboPackString(cptr, msg, msgLen); serverLink->send(MsgMessage, PlayerIdPLen + msgLen, buffer); return true; } static void printBindHelp() { addMessage(NULL, "usage: /bind "); addMessage(NULL, " event: ex: \"Shift+Page Up\""); addMessage(NULL, " press: up, down, or both"); addMessage(NULL, " action: ex: \"scrollpanel up 3\""); } bool BindCommand::operator() (const char *commandLine) { std::string params = commandLine + commandName.size(); std::vector tokens = TextUtils::tokenize(params, " ", 3, true); if (tokens.size() != 3) { printBindHelp(); return true; } BzfKeyEvent ev; if (!KEYMGR.stringToKeyEvent(tokens[0], ev)) { printBindHelp(); addMessage(NULL, "could not find the key"); return true; } bool press, both = false; if (tokens[1] == "up") { press = true; } else if (tokens[1] == "down") { press = false; } else if (tokens[1] == "both") { both = true; } else { printBindHelp(); addMessage(NULL, "bad type"); return true; } if (both) { KEYMGR.unbind(ev, true); KEYMGR.bind(ev, true, tokens[2]); KEYMGR.unbind(ev, false); KEYMGR.bind(ev, false, tokens[2]); } else { KEYMGR.unbind(ev, press); KEYMGR.bind(ev, press, tokens[2]); } return true; } bool SilenceCommand::operator() (const char *commandLine) { Player *loudmouth = getPlayerByName(commandLine + 9); if (loudmouth) { silencePlayers.push_back(commandLine + 9); std::string silenceMessage = "Silenced"; silenceMessage += (commandLine + 8); addMessage(NULL, silenceMessage); } else { std::string silenceMessage = "no such callsign:"; silenceMessage += (commandLine + 8); addMessage(NULL, silenceMessage); } return true; } bool UnsilenceCommand::operator() (const char *commandLine) { Player *loudmouth = getPlayerByName(commandLine + 11); if (loudmouth) { std::vector::iterator it = silencePlayers.begin(); for (; it != silencePlayers.end(); ++it) { if (*it == commandLine + 10) { silencePlayers.erase(it); std::string unsilenceMessage = "Unsilenced "; unsilenceMessage += (commandLine + 10); addMessage(NULL, unsilenceMessage); break; } } } return true; } static void printout(const std::string& name, void*) { std::cout << name << " = " << BZDB.get(name) << std::endl; } bool DumpCommand::operator() (const char *) { BZDB.iterate(printout, NULL); addMessage(NULL, "Dumped all BZDB values to stdout"); return true; } bool ClientQueryCommand::operator() (const char *commandLine) { if (strlen(commandLine) != 11) return false; char messageBuffer[MessageLen]; strncpy(messageBuffer, "/clientquery", MessageLen); nboPackString(messageMessage + PlayerIdPLen, messageBuffer, MessageLen); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); return true; } bool HighlightCommand::operator() (const char *commandLine) { const char* c = commandLine + 10; while ((*c != '\0') && isspace(*c)) c++; // skip leading white BZDB.set("highlightPattern", std::string(c)); return true; } static bool foundVar = false; class VarDispInfo { public: VarDispInfo(const std::string& _prefix) { prefix = _prefix; pattern = ""; diff = client = server = false; } std::string prefix; std::string pattern; bool diff; bool client; bool server; }; static float parseFloatExpr(const std::string& str, bool zeroNan) { // BZDB.eval() can't take expressions directly BZDB.set("tmp", str); BZDB.setPersistent("tmp", false); float value = BZDB.eval("tmp"); if (!zeroNan) { return value; } else { if (!isnan(value)) { return value; } else { return 0.0f; } } } static bool varIsEqual(const std::string& name) { // avoid "poll" if (name[0] != '_') { return true; } // get the parameters const std::string exp = BZDB.get(name); const std::string defexp = BZDB.getDefault(name); const float val = BZDB.eval(name); const float defval = parseFloatExpr(defexp, false); const bool valNaN = (isnan(val) != 0); const bool defNaN = (isnan(defval) != 0); if (valNaN != defNaN) { return false; } if (valNaN) { return (exp == defexp); } else { return (val == defval); } } static void listSetVars(const std::string& name, void* varDispPtr) { const VarDispInfo* varDisp = (VarDispInfo*)varDispPtr; const bool diff = varDisp->diff; if (!glob_match(varDisp->pattern.c_str(), name)) { return; } if (diff && varIsEqual(name)) { return; } foundVar = true; const bool serverVar = (BZDB.getPermission(name) == StateDatabase::Locked); char message[MessageLen]; if ((serverVar && varDisp->server) || (!serverVar && varDisp->client)) { if (BZDBCache::colorful) { sprintf(message, "%s %s%s %s%g %s%s %s%s", varDisp->prefix.c_str(), ColorStrings[RedColor].c_str(), name.c_str(), ColorStrings[GreenColor].c_str(), BZDB.eval(name), ColorStrings[BlueColor].c_str(), BZDB.get(name).c_str(), ColorStrings[CyanColor].c_str(), BZDB.getDefault(name).c_str()); } else { sprintf(message, "%s %s <%g> %s %s", name.c_str(), varDisp->prefix.c_str(), BZDB.eval(name), BZDB.get(name).c_str(), BZDB.getDefault(name).c_str()); } addMessage(LocalPlayer::getMyTank(), message, 2); } } bool SetCommand::operator() (const char *commandLine) { std::string params = commandLine + 4; std::vector tokens = TextUtils::tokenize(params, " ", 2); if (tokens.size() > 1) { return false; } std::string pattern = (tokens.size() == 1) ? tokens[0] : "_*"; if (pattern[0] != '_') { pattern = '_' + pattern; } const std::string header = "/set " + pattern; addMessage(LocalPlayer::getMyTank(), header, 2); VarDispInfo varDisp(commandName); varDisp.server = true; varDisp.pattern = pattern; foundVar = false; BZDB.iterate(listSetVars, &varDisp); if (!foundVar) { addMessage(LocalPlayer::getMyTank(), "no matching variables", 2); } return true; } bool DiffCommand::operator() (const char *commandLine) { std::string params = commandLine + 5; std::vector tokens = TextUtils::tokenize(params, " ", 2); std::string pattern = (tokens.size() == 1) ? tokens[0] : "_*"; if (pattern[0] != '_') { pattern = '_' + pattern; } const std::string header = "/diff " + pattern; addMessage(LocalPlayer::getMyTank(), header, 2); VarDispInfo varDisp(commandName); varDisp.diff = true; varDisp.server = true; varDisp.pattern = pattern; foundVar = false; BZDB.iterate(listSetVars, &varDisp); if (!foundVar) { if (pattern == "_*") { addMessage(LocalPlayer::getMyTank(), "all variables are at defaults", 2); } else { addMessage(LocalPlayer::getMyTank(), "no differing variables with that pattern", 2); } } return true; } bool LocalSetCommand::operator() (const char *commandLine) { std::string params = commandLine + 9; std::vector tokens = TextUtils::tokenize(params, " ", 0, true); #ifdef DEBUG const bool debug = true; #else const bool debug = false; #endif if (tokens.size() == 1) { const std::string header = "/localset " + tokens[0]; addMessage(LocalPlayer::getMyTank(), header, 2); if (!debug && ((strstr(tokens[0].c_str(), "*") != NULL) || (strstr(tokens[0].c_str(), "?") != NULL))) { addMessage(LocalPlayer::getMyTank(), "undefined client variable", 2); return true; } VarDispInfo varDisp(commandName); varDisp.client = true; varDisp.pattern = tokens[0]; foundVar = false; BZDB.iterate(listSetVars, &varDisp); if (!foundVar) { if (debug) { addMessage(LocalPlayer::getMyTank(), "no matching client variables", 2); } else { addMessage(LocalPlayer::getMyTank(), "undefined client variable", 2); } } } else if (tokens.size() == 2) { if (!(BZDB.getPermission(tokens[0]) == StateDatabase::Server)) { BZDB.setPersistent(tokens[0], BZDB.isPersistent(tokens[0])); BZDB.set(tokens[0], tokens[1]); std::string msg = "/localset " + tokens[0] + " " + tokens[1]; addMessage(NULL, msg); } else { addMessage (NULL, "This is a server-defined variable. " "Use /set instead of /localset."); } } else { if (debug) { addMessage(NULL, "usage: /localset [value]"); } else { addMessage(NULL, "usage: /localset [value]"); } } return true; } bool QuitCommand::operator() (const char *commandLine) { char messageBuffer[MessageLen]; // send message strncpy(messageBuffer, commandLine, MessageLen); nboPackString(messageMessage + PlayerIdPLen, messageBuffer, MessageLen); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); CommandsStandard::quit(); // kill client return true; } bool RoamPosCommand::operator() (const char *commandLine) { // change the observer position and orientation std::string params = commandLine + 8; std::vector tokens = TextUtils::tokenize(params, " "); if (tokens.size() == 1) { Roaming::RoamingCamera cam; if (TextUtils::tolower(tokens[0]) == "reset") { ROAM.resetCamera(); } else if (TextUtils::tolower(tokens[0]) == "send") { LocalPlayer* myTank = LocalPlayer::getMyTank(); if ((myTank != NULL) && (myTank->getTeam() == ObserverTeam)) { const Roaming::RoamingCamera* camPtr = ROAM.getCamera(); float fakeVel[3] = { camPtr->theta, camPtr->phi, camPtr->zoom }; myTank->move(camPtr->pos, camPtr->theta); myTank->setVelocity(fakeVel); serverLink->sendPlayerUpdate(myTank); } } else { const float degrees = parseFloatExpr(tokens[0], true); const float ws = BZDB.eval(StateDatabase::BZDB_WORLDSIZE); const float radians = degrees * ((float)M_PI/180.0f); cam.pos[0] = cosf(radians)* 0.5f * ws * (float)M_SQRT2; cam.pos[1] = sinf(radians)* 0.5f * ws * (float)M_SQRT2; cam.pos[2] = +0.25f * ws; cam.theta = degrees + 180.0f; cam.phi = -30.0f; cam.zoom = 60.0f; ROAM.setCamera(&cam); } } else if (tokens.size() >= 3) { Roaming::RoamingCamera cam; cam.pos[0] = parseFloatExpr(tokens[0], true); cam.pos[1] = parseFloatExpr(tokens[1], true); cam.pos[2] = parseFloatExpr(tokens[2], true); if (tokens.size() >= 4) { cam.theta = parseFloatExpr(tokens[3], true); } else { cam.theta = ROAM.getCamera()->theta; } if (tokens.size() >= 5) { cam.phi = parseFloatExpr(tokens[4], true); } else { cam.phi = ROAM.getCamera()->phi; } if (tokens.size() == 6) { cam.zoom = parseFloatExpr(tokens[5], true); } else { cam.zoom = ROAM.getCamera()->zoom; } ROAM.setCamera(&cam); } else { addMessage(NULL, "/roampos " "[ \"reset\" | degrees | {x y z [theta [phi [ zoom ]]] } | \"send\" ]"); const Roaming::RoamingCamera* cam = ROAM.getCamera(); char buffer[MessageLen]; snprintf(buffer, MessageLen, " <%.3f, %.3f, %.3f> theta = %.3f, phi = %.3f, zoom = %.3f", cam->pos[0], cam->pos[1], cam->pos[2], cam->theta, cam->phi, cam->zoom); addMessage(NULL, buffer); } return true; } bool ReTextureCommand::operator() (const char *) { TextureManager& tm = TextureManager::instance(); tm.reloadTextures(); return true; } bool SaveMsgsCommand::operator() (const char *commandLine) { if (controlPanel == NULL) { return true; } std::vector args; args = TextUtils::tokenize(commandLine, " "); const int argCount = (int)args.size(); bool stripAnsi = false; if ((argCount > 1) && (args[1] == "-s")) { stripAnsi = true; } std::string filename = getConfigDirName() + "msglog.txt"; controlPanel->saveMessages(filename, stripAnsi); std::string msg = "Saved messages to: " + filename; addMessage(NULL, msg); return true; } static void sendSaveWorldHelp() { addMessage(NULL, "/saveworld [-g] [-m] [-o] "); addMessage(NULL, " -g : save ungrouped"); addMessage(NULL, " -m : save some primitives as meshes"); addMessage(NULL, " -o : save meshes into WaveFront OBJ files"); return; } bool SaveWorldCommand::operator() (const char *commandLine) { bool meshprims = false; bool ungrouped = false; bool wavefront = false; std::vector args; args = TextUtils::tokenize(commandLine, " "); const int argCount = (int)args.size(); if (argCount <= 1) { sendSaveWorldHelp(); return true; } int pos = 1; while (pos < (argCount - 1)) { const std::string& arg = args[pos]; if (arg == "-m") { meshprims = true; } else if (arg == "-g") { ungrouped = true; } else if (arg == "-o") { wavefront = true; meshprims = true; ungrouped = true; } else { break; } pos++; } if (pos != (argCount - 1)) { sendSaveWorldHelp(); return true; } const std::string& filename = args[pos]; BZDB.set("saveAsMeshes", meshprims ? "1" : "0"); BZDB.set("saveFlatFile", ungrouped ? "1" : "0"); BZDB.set("saveAsOBJ", wavefront ? "1" : "0"); World* world = World::getWorld(); if (!world) { return true; } char buffer[256]; std::string fullname; if (World::getWorld()->writeWorld(filename, fullname)) { snprintf(buffer, 256, "World saved: %s %s%s%s", fullname.c_str(), meshprims ? " [meshprims]" : "", ungrouped ? " [ungrouped]" : "", wavefront ? " [wavefront]" : ""); } else { snprintf(buffer, 256, "Error saving: %s", fullname.c_str()); } addMessage(NULL, buffer); return true; } bool ForceRadarCommand::operator() (const char*) { LocalPlayer* myTank = LocalPlayer::getMyTank(); if (myTank == NULL) { return true; } if (myTank->getTeam() != ObserverTeam) { addMessage(NULL, "the /forceradar command only works for observers"); return true; } float value; if (BZDBCache::radarLimit == 0.0f) { value = +BZDBCache::worldSize; } else { value = -BZDBCache::radarLimit; } BZDB.setFloat(StateDatabase::BZDB_RADARLIMIT, value, StateDatabase::Server); return true; } bool DebugLevelCommand::operator() (const char* cmdLine) { const std::vector args = TextUtils::tokenize(cmdLine, " "); if (args.size() < 2) { std::string msg = "debug level is "; msg += TextUtils::itoa(debugLevel); addMessage(NULL, msg); return true; } debugLevel = atoi(args[1].c_str()); char buf[128]; snprintf(buf, sizeof(buf), "debug level set to %i", debugLevel); addMessage(NULL, buf); return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ComposeDefaultKey.cxx000066400000000000000000000113201200563112200215770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ComposeDefaultKey.h" /* common implementation headers */ #include "BzfEvent.h" #include "KeyManager.h" /* local implementation headers */ #include "LocalPlayer.h" #include "HUDRenderer.h" #include "LocalCommand.h" #include "playing.h" #include "HUDui.h" #define MAX_MESSAGE_HISTORY (20) MessageQueue messageHistory; unsigned int messageHistoryIndex = 0; static bool isWordCompletion(const BzfKeyEvent& key) { if ((key.ascii == 6) || // ^F (key.ascii == 9) || // ((key.shift == 0) && (key.button == BzfKeyEvent::F2))) { return true; } else { return false; } } bool ComposeDefaultKey::keyPress(const BzfKeyEvent& key) { bool sendIt; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank && KEYMGR.get(key, true) == "jump" && BZDB.isTrue("jumpTyping")) { // jump while typing myTank->setJump(); return false; } if (!myTank || (myTank->getInputMethod() != LocalPlayer::Keyboard)) { if ((key.button == BzfKeyEvent::Up) || (key.button == BzfKeyEvent::Down)) return true; } if (isWordCompletion(key)) { std::string matches; hud->setComposeString(completer.complete(hud->getComposeString(), &matches)); if (matches.size() > 0) { controlPanel->addMessage(matches, -1); } return true; } switch (key.ascii) { case 3: // ^C case 27: { // escape sendIt = false; // finished composing -- don't send break; } case 4: // ^D case 13: { // return sendIt = true; break; } default: { return false; } } if (sendIt) { std::string message = hud->getComposeString(); if (message.length() > 0) { const char* cmd = message.c_str(); if (LocalCommand::execute(cmd)) { ; } else if (serverLink) { char messageBuffer[MessageLen]; strncpy(messageBuffer, message.c_str(), MessageLen - 1); messageBuffer[MessageLen - 1] = '\0'; nboPackString(messageMessage + PlayerIdPLen, messageBuffer, MessageLen); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); } // record message in history int i, mhLen = messageHistory.size(); for (i = 0; i < mhLen; i++) { if (messageHistory[i] == message) { messageHistory.erase(messageHistory.begin() + i); messageHistory.push_front(message); break; } } if (i == mhLen) { if (mhLen >= MAX_MESSAGE_HISTORY) { messageHistory.pop_back(); } messageHistory.push_front(message); } } } messageHistoryIndex = 0; hud->setComposing(std::string()); HUDui::setDefaultKey(NULL); return true; } bool ComposeDefaultKey::keyRelease(const BzfKeyEvent& key) { LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!myTank || myTank->getInputMethod() != LocalPlayer::Keyboard) { if (key.button == BzfKeyEvent::Up) { if (messageHistoryIndex < messageHistory.size()) { hud->setComposeString(messageHistory[messageHistoryIndex]); messageHistoryIndex++; } else hud->setComposeString(std::string()); return true; } else if (key.button == BzfKeyEvent::Down) { if (messageHistoryIndex > 0){ messageHistoryIndex--; hud->setComposeString(messageHistory[messageHistoryIndex]); } else hud->setComposeString(std::string()); return true; } else if (myTank && ((key.shift == BzfKeyEvent::ShiftKey || (hud->getComposeString().length() == 0)) && (key.button == BzfKeyEvent::Left || key.button == BzfKeyEvent::Right))) { // exclude robot from private message recipient. // No point sending messages to robot (now) selectNextRecipient(key.button != BzfKeyEvent::Left, false); const Player *recipient = myTank->getRecipient(); if (recipient) { void* buf = messageMessage; buf = nboPackUByte(buf, recipient->getId()); std::string composePrompt = "Send to "; composePrompt += recipient->getCallSign(); composePrompt += ": "; hud->setComposing(composePrompt); } return false; } } if ((key.ascii == 4) || // ^D (key.ascii == 6) || // ^F (key.ascii == 13) || // return isWordCompletion(key)) { return true; } return keyPress(key); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ComposeDefaultKey.h000066400000000000000000000021301200563112200212230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COMPOSEDEFAULTKEY_H__ #define __COMPOSEDEFAULTKEY_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "BzfEvent.h" #include "HUDuiDefaultKey.h" typedef std::deque MessageQueue; extern MessageQueue messageHistory; extern unsigned int messageHistoryIndex; class ComposeDefaultKey : public HUDuiDefaultKey { public: bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); }; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ControlPanel.cxx000066400000000000000000000640071200563112200206260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* BZFlag common header */ #include "common.h" /* interface header */ #include "ControlPanel.h" /* system headers */ #include #include #include #ifdef HAVE_PTHREADS # include #endif /* common implementation headers */ #include "BZDBCache.h" #include "FontManager.h" #include "TextUtils.h" #include "ErrorHandler.h" #include "global.h" /* local implementation headers */ #include "SceneRenderer.h" #include "RadarRenderer.h" #include "bzflag.h" // // ControlPanelMessage // ControlPanelMessage::ControlPanelMessage(const std::string& _string) : string(_string), numlines(0) { } void ControlPanelMessage::breakLines(float maxLength, int fontFace, float fontSize) { FontManager &fm = FontManager::instance(); // get message and its length const char* msg = string.c_str(); int lineLen = (int)string.length(); // if there are tabs in the message, find the last one int lastTab = (int)string.rfind('\t'); lines.clear(); numlines=0; // in order for the new font engine to draw successive lines in the right // color, it needs to be fed the right ansi codes at the beginning of each // line. std::string cumulativeANSICodes = ""; // break lines while (lineLen > 0) { int lastWhitespace = 0; int n; // how many characters will fit? // the unprinted ANSI codes don't count if ((fm.getStrLength(fontFace, fontSize, msg) <= maxLength) && (lastTab <= 0)) { n = lineLen; } else { n = 0; while ((n < lineLen) && (fm.getStrLength(fontFace, fontSize, std::string(msg, n+1)) < maxLength)) { if (msg[n] == ESC_CHAR) { // clear the cumulative codes when we hit a reset // the reset itself will start the new cumulative string. if ((strncmp(msg + n, ANSI_STR_RESET, strlen(ANSI_STR_RESET)) == 0) || (strncmp(msg + n, ANSI_STR_RESET_FINAL, strlen(ANSI_STR_RESET_FINAL)) == 0)) cumulativeANSICodes = ""; // add this code to our cumulative string cumulativeANSICodes += msg[n]; n++; if ((n < lineLen) && (msg[n] == '[')) { cumulativeANSICodes += msg[n]; n++; while ((n < lineLen) && ((msg[n] == ';') || ((msg[n] >= '0') && (msg[n] <= '9')))) { cumulativeANSICodes += msg[n]; n++; } // ditch the terminating character too if (n < lineLen) { cumulativeANSICodes += msg[n]; n++; } } } else { n++; } if (TextUtils::isWhitespace(msg[n])) { lastWhitespace = n; // Tabs break out into their own message. These get dealt with // in ControlPanel::render, which will increment x instead of y. if (msg[n] == '\t') break; } } } if (lastWhitespace > 0) n = lastWhitespace; // message lines.push_back(cumulativeANSICodes + std::string(msg,n)); if (msg[n] != '\t') numlines++; // account for portion broken msg += n; lineLen -= n; lastTab -= n; } } static std::deque mutexMsgs; #if defined(HAVE_PTHREADS) static pthread_mutex_t controlpanel_mutex = PTHREAD_MUTEX_INITIALIZER; #elif defined(_WIN32) static CRITICAL_SECTION controlpanel_critical; #endif #if defined(HAVE_PTHREADS) # define LOCK_CONTROLPANEL_MUTEX pthread_mutex_lock(&controlpanel_mutex); # define UNLOCK_CONTROLPANEL_MUTEX pthread_mutex_unlock(&controlpanel_mutex); #elif defined(_WIN32) # define LOCK_CONTROLPANEL_MUTEX EnterCriticalSection(&controlpanel_critical); # define UNLOCK_CONTROLPANEL_MUTEX LeaveCriticalSection(&controlpanel_critical); #else # define LOCK_CONTROLPANEL_MUTEX # define UNLOCK_CONTROLPANEL_MUTEX #endif // // ControlPanel // int ControlPanel::messagesOffset = 0; ControlPanel::ControlPanel(MainWindow& _mainWindow, SceneRenderer& _renderer) : tabsOnRight(true), tabs(NULL), totalTabWidth(0), window(_mainWindow), resized(false), numBuffers(2), changedMessage(0), radarRenderer(NULL), renderer(&_renderer), fontFace(0), dimming(1.0f), du(0), dv(0), messageMode(MessageAll) { setControlColor(); // make sure we're notified when MainWindow resizes or is exposed window.getWindow()->addResizeCallback(resizeCallback, this); window.getWindow()->addExposeCallback(exposeCallback, this); BZDB.addCallback("displayRadar", bzdbCallback, this); BZDB.addCallback(StateDatabase::BZDB_RADARLIMIT, bzdbCallback, this); // other initialization radarAreaPixels[0] = 0; radarAreaPixels[1] = 0; radarAreaPixels[2] = 0; radarAreaPixels[3] = 0; messageAreaPixels[0] = 0; messageAreaPixels[1] = 0; messageAreaPixels[2] = 0; messageAreaPixels[3] = 0; for (int i = 0; i < MessageModeCount; i++) { messages[i].clear(); unRead[i] = false; } teamColor[0] = teamColor[1] = teamColor[2] = (GLfloat)0.0f; maxLines = 30; /* use pointer initialization to perform precomputation and * prestorage. eventually should move this data into constructor. */ if (tabs == NULL) { tabs = new std::vector; tabs->push_back("All"); tabs->push_back("Chat"); tabs->push_back("Server"); tabs->push_back("Misc"); } // construct critical section for threadsafe messages #if defined(HAVE_PTHREADS) #elif defined(_WIN32) InitializeCriticalSection(&controlpanel_critical); #endif resize(); // need resize to set up font and window dimensions } ControlPanel::~ControlPanel() { // don't notify me anymore (cos you can't wake the dead!) window.getWindow()->removeResizeCallback(resizeCallback, this); window.getWindow()->removeExposeCallback(exposeCallback, this); BZDB.removeCallback("displayRadar", bzdbCallback, this); BZDB.removeCallback(StateDatabase::BZDB_RADARLIMIT, bzdbCallback, this); // destroy critical section for threadsafe messages #if defined(HAVE_PTHREADS) #elif defined(_WIN32) DeleteCriticalSection(&controlpanel_critical); #endif if (echoToConsole && echoAnsi) { std::cout << ColorStrings[FinalResetColor] << std::flush; } if (tabs != NULL) { tabs->clear(); delete tabs; tabTextWidth.clear(); totalTabWidth=0; } } void ControlPanel::bzdbCallback(const std::string& UNUSED(name), void* data) { ((ControlPanel*)data)->resize(); return; } void ControlPanel::setControlColor(const GLfloat *color) { if (color) memcpy(teamColor, color, 3 * sizeof(float)); else memset(teamColor, 0, 3 * sizeof(float)); } void ControlPanel::render(SceneRenderer& _renderer) { while (!mutexMsgs.empty()) { addMessage(mutexMsgs.front()); mutexMsgs.pop_front(); } if (!BZDB.isTrue("displayConsole")) { // always draw the console if its fully opaque const float opacity = RENDERER.getPanelOpacity(); if (opacity != 1.0f) { return; } } if (!resized) resize(); // optimization for software rendering folks if (!changedMessage && _renderer.getPanelOpacity() == 1.0f) { return; } int i, j; const int x = window.getOriginX(); const int y = window.getOriginY(); const int w = window.getWidth(); const int tabStyle = (int)BZDB.eval("showtabs"); const bool showTabs = (tabStyle > 0); tabsOnRight = (tabStyle == 2); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, (double)w, 0.0, window.getHeight(), -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); OpenGLGState::resetState(); FontManager &fm = FontManager::instance(); fm.setOpacity(dimming); if (changedMessage > 0) { changedMessage--; } float fx = messageAreaPixels[0] + margin; float fy = messageAreaPixels[1] + margin + 1.0f; int ay = (_renderer.getPanelOpacity() == 1.0f || !showTabs) ? 0 : int(lineHeight + 4); glScissor(x + messageAreaPixels[0] - 1, y + messageAreaPixels[1], messageAreaPixels[2] + 1, messageAreaPixels[3] + ay); OpenGLGState::resetState(); if (_renderer.getPanelOpacity() > 0.0f) { // nice blended messages background if (BZDBCache::blend && _renderer.getPanelOpacity() < 1.0f) glEnable(GL_BLEND); // clear the background glColor4f(0.0f, 0.0f, 0.0f, _renderer.getPanelOpacity()); glRecti(messageAreaPixels[0] - 1, // clear an extra pixel column to simplify fuzzy float stuff later messageAreaPixels[1], messageAreaPixels[0] + messageAreaPixels[2], messageAreaPixels[1] + messageAreaPixels[3]); // display tabs for chat sections if (showTabs) { long int drawnTabWidth = 0; for (unsigned int tab = 0; tab < tabs->size(); tab++) { // current mode is given a dark background to match the control panel if (messageMode == MessageModes(tab)) { glColor4f(0.0f, 0.0f, 0.0f, _renderer.getPanelOpacity()); } else { glColor4f(0.10f, 0.10f, 0.10f, _renderer.getPanelOpacity()); } if (tabsOnRight) { // draw the tabs on the right side glRecti(messageAreaPixels[0] + messageAreaPixels[2] - totalTabWidth + drawnTabWidth, messageAreaPixels[1] + messageAreaPixels[3] - int(lineHeight + 4) + ay, messageAreaPixels[0] + messageAreaPixels[2] - totalTabWidth + drawnTabWidth + int(tabTextWidth[tab]), //+ drawnTabWidth + int(tabTextWidth[tab]), messageAreaPixels[1] + messageAreaPixels[3] + ay); } else { // draw the tabs on the left side glRecti(messageAreaPixels[0] + drawnTabWidth, messageAreaPixels[1] + messageAreaPixels[3] - int(lineHeight + 4) + ay, messageAreaPixels[0] + drawnTabWidth + int(tabTextWidth[tab]), messageAreaPixels[1] + messageAreaPixels[3] + ay); } drawnTabWidth += long(tabTextWidth[tab]); } // end iteration over tabs } if (BZDBCache::blend && _renderer.getPanelOpacity() < 1.0f) glDisable(GL_BLEND); } // show scroll indicator if not at end if (messagesOffset > 0 && messageMode >= 0) { int lines = int(messages[messageMode].size()); if (lines > 0) { const float size = std::max(float(maxLines) / lines, 0.02f); const float offset = float(messagesOffset) / lines; const int maxTop = messageAreaPixels[1] + messageAreaPixels[3]; int top = messageAreaPixels[1] + int((offset + size) * (float)messageAreaPixels[3]); if (top > maxTop) { top = maxTop; } glColor3f(0.7f, 0.7f, 0.7f); glRecti(messageAreaPixels[0], messageAreaPixels[1] + int(offset * (float)messageAreaPixels[3]), messageAreaPixels[0] + 2, top); } } // Draw tab labels if (showTabs) { long int drawnTabWidth = 0; for (unsigned int tab = 0; tab < tabs->size(); tab++) { // current mode is bright, others are not so bright if (messageMode == MessageModes(tab)) { glColor4f(1.0f, 1.0f, 1.0f, dimming); } else if (unRead[MessageModes(tab)]) { glColor4f(0.5f, 0.0f, 0.0f, dimming); } else { glColor4f(0.5f, 0.5f, 0.5f, dimming); } if (tabsOnRight) { // draw the tabs on the right side (with one letter padding) fm.drawString(messageAreaPixels[0] + messageAreaPixels[2] - totalTabWidth + drawnTabWidth + floorf(fontSize), messageAreaPixels[1] + messageAreaPixels[3] - floorf(lineHeight + 2.0f) + ay, 0.0f, fontFace, (float)fontSize, (*tabs)[tab]); } else { // draw the tabs on the left side (with one letter padding) fm.drawString(messageAreaPixels[0] + drawnTabWidth + floorf(fontSize), messageAreaPixels[1] + messageAreaPixels[3] - floorf(lineHeight + 2.0f) + ay, 0.0f, fontFace, (float)fontSize, (*tabs)[tab]); } drawnTabWidth += long(tabTextWidth[tab]); } } /* draw messages * * It works by first breaking the string into a vector of strings * (done elsewhere), each of which will fit the control panel, and * tallying the number of lines, then moving up the proper number of * lines and displaying downward -- that is, it kinda backtracks for * each line that will wrap. * * messageAreaPixels[2] = Width of Message Window in Pixels. * * maxLines = Max messages lines that can be displayed at once per * page. This COULD be a BZDB parameter (but isn't). * * maxScrollPages = This number * maxLines is the total maximum * lines of messages (and scrollback). It is stored as a BZDB * parameter. */ glScissor(x + messageAreaPixels[0], y + messageAreaPixels[1], messageAreaPixels[2], messageAreaPixels[3] - (showTabs ? int(lineHeight + 4) : 0) + ay); if (messageMode >= 0) { i = (int)messages[messageMode].size() - 1; } else { i = -1; } if (i >= 0 && messagesOffset > 0) { i -= messagesOffset; if (i < 0) i = 0; } const std::string highlightPattern = BZDB.get("highlightPattern"); bool useHighlight = (highlightPattern.size() > 0); regex_t re; if (useHighlight) { if (regcomp(&re, highlightPattern.c_str(), REG_EXTENDED | REG_ICASE) != 0) { useHighlight = false; // bad regex } } for (j = 0; i >= 0 && j < maxLines; i--) { // draw each line of text int numLines = messages[messageMode][i].numlines; int numStrings = (int)messages[messageMode][i].lines.size(); int msgy = numLines - 1; int msgx = 0; // see if this message need to be highlighted (check each line) bool highlight = false; if (useHighlight) { for (int l = 0; l < numStrings; l++) { const std::string &msg = messages[messageMode][i].lines[l]; std::string raw = stripAnsiCodes(msg); if (regexec(&re, raw.c_str(), 0, NULL, 0) == 0) { highlight = true; } } } // default to drawing text in white GLfloat whiteColor[4] = {1.0f, 1.0f, 1.0f, dimming}; glColor4fv(whiteColor); bool isTab = false; for (int l = 0; l < numStrings; l++) { const std::string &msg = messages[messageMode][i].lines[l]; // Tab chars move horizontally instead of vertically // It doesn't matter where in the string the tab char is // Usually it will be like \ttext // We use 1 tabstop spaced 1/3 of the way across the controlpanel isTab = (msg.find('\t') != std::string::npos); if (isTab) { msgx += messageAreaPixels[2] / 3; msgy++; } else { msgx = 0; } assert(msgy >= 0); // only draw message if inside message area if (j + msgy < maxLines) { if (!highlight) { fm.drawString(fx + msgx, fy + msgy * lineHeight, 0, fontFace, fontSize, msg); } else { // highlight this line std::string newMsg = ANSI_STR_PULSATING; newMsg += ANSI_STR_UNDERLINE; newMsg += ANSI_STR_FG_CYAN; newMsg += stripAnsiCodes(msg); fm.drawString(fx + msgx, fy + msgy * lineHeight, 0, fontFace, fontSize, newMsg); } } // next line msgy--; } j += numLines; fy += int(lineHeight * numLines); } // free the regex memory if (useHighlight) { regfree(&re); } glScissor(x + messageAreaPixels[0] - 2, y + messageAreaPixels[1] - 2, messageAreaPixels[2] + 3, messageAreaPixels[3] + 33); OpenGLGState::resetState(); // draw the lines around the console panel float outlineOpacity = RENDERER.getPanelOpacity(); float fudgeFactor = BZDBCache::hudGUIBorderOpacityFactor; // bzdb cache this maybe? if ( outlineOpacity < 1.0f ) outlineOpacity = (outlineOpacity*fudgeFactor) + (1.0f - fudgeFactor); if (BZDBCache::blend) glEnable(GL_BLEND); // nice border glColor4f(teamColor[0], teamColor[1], teamColor[2],outlineOpacity ); glBegin(GL_LINE_LOOP); { long xpos; long ypos; // bottom left xpos = x + messageAreaPixels[0] - 1; ypos = y + messageAreaPixels[1] - 1; glVertex2f((float) xpos, (float) ypos); // bottom right xpos += messageAreaPixels[2] + 1; glVertex2f((float) xpos, (float) ypos); // top right ypos += messageAreaPixels[3] + 1; glVertex2f((float) xpos, (float) ypos); // over to panel on left if (!tabsOnRight) { xpos = x + messageAreaPixels[0] + totalTabWidth; glVertex2f((float) xpos, (float) ypos); } // across the top from right to left for (int tab = (int)tabs->size() - 1; tab >= 0; tab--) { if (messageMode == MessageModes(tab)) { ypos += ay; glVertex2f((float) xpos, (float) ypos); xpos -= long(tabTextWidth[tab]) + 1; glVertex2f((float) xpos, (float) ypos); ypos -= ay; glVertex2f((float) xpos, (float) ypos); } else { xpos -= long(tabTextWidth[tab]); glVertex2f((float) xpos, (float) ypos); } } // over from panel on right // if (tabsOnRight) { xpos = x + messageAreaPixels[0] - 1; glVertex2f((float) xpos, (float) ypos); // } } glEnd(); if (0){ // some engines miss the corners glBegin(GL_POINTS); { glVertex2f((float) (x + messageAreaPixels[0] - 1), (float) (y + messageAreaPixels[1] - 1)); glVertex2f((float) (x + messageAreaPixels[0] + messageAreaPixels[2]), (float) (y + messageAreaPixels[1] - 1)); glVertex2f((float) (x + messageAreaPixels[0] + messageAreaPixels[2]), (float) (y + messageAreaPixels[1] + messageAreaPixels[3])); glVertex2f((float) (x + messageAreaPixels[0] - 1), (float) (y + messageAreaPixels[1] + messageAreaPixels[3])); long int tabPosition = 0; for (int tab = 0; tab < (int)tabs->size(); tab++) { if (messageMode == MessageModes(tab)) { if (tabsOnRight) { glVertex2f((float) (x + messageAreaPixels[0] + messageAreaPixels[2] - totalTabWidth + tabPosition), (float) (y + messageAreaPixels[1] + messageAreaPixels[3] + ay)); glVertex2f((float) (x + messageAreaPixels[0] + messageAreaPixels[2] - totalTabWidth + tabPosition + long(tabTextWidth[tab])), (float) (y + messageAreaPixels[1] + messageAreaPixels[3] + ay)); } else { glVertex2f((float) (x + messageAreaPixels[0] + tabPosition), (float) (y + messageAreaPixels[1] + messageAreaPixels[3] + ay)); glVertex2f((float) (x + messageAreaPixels[0] + tabPosition + long(tabTextWidth[tab])), (float) (y + messageAreaPixels[1] + messageAreaPixels[3] + ay)); } } tabPosition += long(tabTextWidth[tab]); } } glEnd(); } if (BZDBCache::blend) glDisable(GL_BLEND); glColor4f(teamColor[0], teamColor[1], teamColor[2],1.0f ); glPopMatrix(); fm.setOpacity(1.0f); } void ControlPanel::resize() { float radarSpace, radarSize; // get important metrics const float w = (float)window.getWidth(); const float h = (float)window.getHeight(); const float opacity = RENDERER.getPanelOpacity(); radarSize = float(window.getHeight() - window.getViewHeight()); if (opacity == 1.0f) { radarSize = float(window.getHeight() - window.getViewHeight()); radarSpace = 0.0f; } else { radarSize = h * (14 + RENDERER.getRadarSize()) / 60.0f; radarSpace = 3.0f * w / MinY; } // compute areas in pixels x,y,w,h // leave off 1 pixel for the border radarAreaPixels[1] = (int)radarSpace + 1; radarAreaPixels[2] = radarAreaPixels[3] = (int)(radarSize - (radarSpace * 2.0f)) - 2; if (BZDB.get("radarPosition") == "1") { //radar on right radarAreaPixels[0] = (int)(w - radarSize + radarSpace); // radar X coord messageAreaPixels[0] = (int)radarSpace + 1; // message box X coord } else { //radar on left radarAreaPixels[0] = radarAreaPixels[1]; // radar X coord messageAreaPixels[0] = (int)radarSize + 1; // message box X coord } messageAreaPixels[1] = radarAreaPixels[1]; // Y coord messageAreaPixels[2] = (int)(w - radarSize - radarSpace) - 2; // Width messageAreaPixels[3] = radarAreaPixels[3]; // Height if (!BZDB.isTrue("displayRadar") || (BZDBCache::radarLimit <= 0.0f)) { messageAreaPixels[0] = (int)radarSpace + 1; messageAreaPixels[2] = (int)(w - (radarSpace * 2.0f)) - 2; } // if radar connected then resize it if (radarRenderer) radarRenderer->setShape(radarAreaPixels[0], radarAreaPixels[1], radarAreaPixels[2], radarAreaPixels[3]); switch (static_cast(BZDB.eval("cpanelfontsize"))) { case 0: { // auto const bool useBigFont = (messageAreaPixels[2] / 100.0f) > 10.0f; fontSize = useBigFont ? 12.0f : 8.0f; break; } case 1: // tiny fontSize = 6; break; case 2: // small fontSize = 8; break; case 3: // medium fontSize = 12; break; case 4: // big fontSize = 16; break; } FontManager &fm = FontManager::instance(); fontFace = fm.getFaceID(BZDB.get("consoleFont")); // tab widths may have changed if (tabs) { tabTextWidth.clear(); totalTabWidth = 0; const float charWidth = fm.getStrLength(fontFace, fontSize, "-"); for (unsigned int tab = 0; tab < tabs->size(); tab++) { // add space for about 2-chars on each side for padding tabTextWidth.push_back(fm.getStrLength(fontFace, fontSize, (*tabs)[tab]) + (4.0f * charWidth)); totalTabWidth += long(tabTextWidth[tab]); } } lineHeight = fm.getStrHeight(fontFace, fontSize, " "); maxLines = int(messageAreaPixels[3] / lineHeight); margin = lineHeight / 4.0f; // rewrap all the lines for (int i = 0; i < MessageModeCount; i++) { for (int j = 0; j < (int)messages[i].size(); j++) { messages[i][j].breakLines(messageAreaPixels[2] - 2 * margin, fontFace, fontSize); } } // note that we've been resized at least once resized = true; invalidate(); } void ControlPanel::resizeCallback(void* self) { ((ControlPanel*)self)->resize(); } void ControlPanel::setNumberOfFrameBuffers(int n) { numBuffers = n; } void ControlPanel::invalidate() { if (numBuffers) { changedMessage = numBuffers; } else { changedMessage++; } } void ControlPanel::exposeCallback(void* self) { ((ControlPanel*)self)->invalidate(); } void ControlPanel::setMessagesOffset(int offset, int whence, bool paged) { if (paged) { if (abs(offset) <= 1) { offset = offset * (maxLines - 1); } else { offset = offset * maxLines; } } // offset = offset from whence (offset of 0 is the bottom/most recent) // whence = 0, 1, or 2 (akin to SEEK_SET, SEEK_CUR, SEEK_END) switch (whence) { case 0: if (offset < (int)messages[messageMode].size()) messagesOffset = offset; else messagesOffset = (int)messages[messageMode].size() - 1; break; case 1: if (offset > 0) { if (messagesOffset + offset < (int)messages[messageMode].size()) messagesOffset += offset; else messagesOffset = (int)messages[messageMode].size() - 1; } else if (offset < 0) { if (messagesOffset + offset >= 0) messagesOffset += offset; else messagesOffset = 0; } break; case 2: if (offset < 0) { if ((int)messages[messageMode].size() >= offset) messagesOffset += offset; else messagesOffset = 0; } break; } invalidate(); } void ControlPanel::setMessagesMode(int _messageMode) { messageMode = _messageMode; if (messageMode == MessageAll) for (int i = 0; i < MessageModeCount; i++) unRead[i] = false; else if (messageMode >= MessageChat) unRead[messageMode] = false; invalidate(); } void ControlPanel::addMutexMessage(const std::string& msg) { LOCK_CONTROLPANEL_MUTEX mutexMsgs.push_back(msg); UNLOCK_CONTROLPANEL_MUTEX } void ControlPanel::addMessage(const std::string& line, const int realmode) { ControlPanelMessage item(line); item.breakLines(messageAreaPixels[2] - 2 * margin, fontFace, fontSize); int _maxScrollPages = BZDB.evalInt("scrollPages"); if (_maxScrollPages <= 0) { _maxScrollPages = atoi(BZDB.getDefault("scrollPages").c_str()); BZDB.setInt("scrollPages", _maxScrollPages); } // the effective tab const int tabmode = (realmode == MessageCurrent) ? messageMode : realmode; // add to the appropriate tabs for (int tab = MessageAll; tab < MessageModeCount; tab++) { if ((tab == tabmode) // add to its own mode // add to the All tab, unless using Current mode || ((tab == MessageAll) && (realmode != MessageCurrent)) // always add to all tabs || (realmode == MessageAllTabs)) { // insert the message into the tab if ((int)messages[tab].size() < maxLines * _maxScrollPages) { // not full yet so just append it messages[tab].push_back(item); } else { // rotate list and replace oldest (in newest position after rotate) messages[tab].pop_front(); messages[tab].push_back(item); } // visible changes, force a console refresh if (messageMode == tab) { invalidate(); } // mark the tab as unread (if viewing tabs) const bool showTabs = (BZDB.evalInt("showtabs") > 0); if (showTabs && (messageMode != tab) && (messageMode != MessageAll)) { unRead[tab] = true; } } } if (echoToConsole){ #ifdef _WIN32 // this is cheap but it will work on windows FILE *fp = fopen ("stdout.txt","a+"); if (fp){ fprintf(fp,"%s\n", stripAnsiCodes(line).c_str()); fclose(fp); } #else if (echoAnsi) { std::cout << line << ColorStrings[ResetColor] << std::endl; } else { std::cout << stripAnsiCodes(line) << std::endl; } fflush(stdout); #endif } } void ControlPanel::saveMessages(const std::string& filename, bool stripAnsi) const { FILE* file = fopen(filename.c_str(), "a+"); if (!file) { return; } const time_t nowTime = time (NULL); fprintf(file, "\n----------------------------------------\n"); fprintf(file, "Messages saved: %s", ctime(&nowTime)); fprintf(file, "----------------------------------------\n\n"); // add to the appropriate tabs std::deque::const_iterator msg = messages[MessageAll].begin()++; for (; msg != messages[MessageAll].end(); ++msg) { const std::string& line = msg->string; if (stripAnsi) { fprintf(file, "%s\n", stripAnsiCodes(line).c_str()); } else { fprintf(file, "%s%s\n", line.c_str(), ColorStrings[ResetColor].c_str()); } } fclose(file); return; } void ControlPanel::setRadarRenderer(RadarRenderer* rr) { radarRenderer = rr; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ControlPanel.h000066400000000000000000000064051200563112200202510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_CONTROL_PANEL_H #define BZF_CONTROL_PANEL_H #if defined(_MSC_VER) #pragma warning(disable: 4786) #endif // common - 1st #include "common.h" // system headers #include #include #include //common headers #include "bzfgl.h" // local headers #include "MainWindow.h" class RadarRenderer; class SceneRenderer; struct ControlPanelMessage { ControlPanelMessage(const std::string&); void breakLines(float maxLength, int fontFace, float fontSize); std::string string; std::vector lines; int numlines; }; class ControlPanel { public: ControlPanel(MainWindow&, SceneRenderer&); ~ControlPanel(); void setControlColor(const GLfloat *color = NULL); void render(SceneRenderer&); void resize(); void invalidate(); void setNumberOfFrameBuffers(int); void addMessage(const std::string&, const int mode = 3); static void addMutexMessage(const std::string&); void setMessagesOffset(int offset, int whence, bool paged); void setMessagesMode(int _messageMode); int getMessagesMode() {return messageMode;}; void setStatus(const char*); void setRadarRenderer(RadarRenderer*); void setDimming(float dimming); void saveMessages(const std::string& filename, bool stripAnsi) const; private: // no copying! ControlPanel(const ControlPanel&); ControlPanel& operator=(const ControlPanel&); static void resizeCallback(void*); static void exposeCallback(void*); static void bzdbCallback(const std::string& name, void* data); enum MessageModes { MessageAllTabs = -2, MessageCurrent = -1, MessageAll = 0, MessageChat = 1, MessageServer = 2, MessageMisc = 3, MessageModeCount }; bool tabsOnRight; std::vector *tabs; std::vector tabTextWidth; long totalTabWidth; MainWindow& window; bool resized; int numBuffers; int exposed; int changedMessage; RadarRenderer* radarRenderer; SceneRenderer* renderer; int fontFace; float fontSize; float dimming; float du, dv; int radarAreaPixels[4]; int messageAreaPixels[4]; std::deque messages[MessageModeCount]; int messageMode; GLfloat teamColor[3]; static int messagesOffset; static const int maxScrollPages; int maxLines; float margin; float lineHeight; bool unRead[MessageModeCount]; }; inline void ControlPanel::setDimming(float newDimming) { const float newDim = 1.0f - newDimming; dimming = (newDim > 1.0f) ? 1.0f : (newDim < 0.0f) ? 0.0f : newDim; } #endif // BZF_CONTROL_PANEL_H // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/DisplayMenu.cxx000066400000000000000000000336451200563112200204640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "common.h" /* interface header */ #include "DisplayMenu.h" /* common implementation headers */ #include "FontManager.h" #include "BZDBCache.h" #include "TextureManager.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDDialogStack.h" #include "HUDuiList.h" #include "playing.h" #include "HUDui.h" DisplayMenu::DisplayMenu() : formatMenu(NULL) { // add controls std::vector* options; std::vector& listHUD = getControls(); HUDuiList* option; // cache font face id int fontFace = MainMenu::getFontFace(); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Display Settings"); listHUD.push_back(label); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Dithering:"); option->setCallback(callback, (void*)"1"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Blending:"); option->setCallback(callback, (void*)"2"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Smoothing:"); option->setCallback(callback, (void*)"3"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Lighting:"); option->setCallback(callback, (void*)"4"); options = &option->getList(); options->push_back(std::string("None")); options->push_back(std::string("Fast")); options->push_back(std::string("Best")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Texturing:"); option->setCallback(callback, (void*)"5"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Nearest")); options->push_back(std::string("Linear")); options->push_back(std::string("Nearest Mipmap Nearest")); options->push_back(std::string("Linear Mipmap Nearest")); options->push_back(std::string("Nearest Mipmap Linear")); options->push_back(std::string("Linear Mipmap Linear")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("AntiFlicker:"); option->setCallback(callback, (void*)"R"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Anisotropic:"); option->setCallback(callback, (void*)"A"); options = &option->getList(); #ifdef HAVE_GLEW if (GLEW_EXT_texture_filter_anisotropic) { static GLint maxAnisotropy = 1; glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy); if (maxAnisotropy > 1) { options->push_back(std::string("Off")); for (int i = 1; i < maxAnisotropy; i++) { char buffer[16]; snprintf(buffer, 16, "%i/%i", i + 1, maxAnisotropy); options->push_back(std::string(buffer)); } } else { options->push_back(std::string("Unavailable")); } } else { options->push_back(std::string("Unavailable")); } #else options->push_back(std::string("Unavailable")); #endif option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Quality:"); option->setCallback(callback, (void*)"6"); options = &option->getList(); options->push_back(std::string("Low")); options->push_back(std::string("Medium")); options->push_back(std::string("High")); options->push_back(std::string("Experimental")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Shadows:"); option->setCallback(callback, (void*)"7"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Stipple")); options->push_back(std::string("Stencil")); option->update(); listHUD.push_back(option); #if !defined(DEBUG_RENDERING) if (debugLevel > 0) { #endif option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Hidden Line:"); option->setCallback(callback, (void*)"a"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Wireframe:"); option->setCallback(callback, (void*)"b"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Depth Complexity:"); option->setCallback(callback, (void*)"c"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Culling Tree:"); option->setCallback(callback, (void*)"d"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Collision Tree:"); option->setCallback(callback, (void*)"e"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); #if !defined(DEBUG_RENDERING) } #endif BzfWindow* window = getMainWindow()->getWindow(); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Brightness:"); option->setCallback(callback, (void*)"g"); if (window->hasGammaControl()) { option->createSlider(15); } else { options = &option->getList(); options->push_back(std::string("Unavailable")); } option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Energy Saver:"); option->setCallback(callback, (void*)"s"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); BzfDisplay* display = getDisplay(); int numFormats = display->getNumResolutions(); if (numFormats < 2) { videoFormat = NULL; } else { videoFormat = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Change Video Format"); listHUD.push_back(label); } initNavigation(listHUD, 1,listHUD.size()-1); } DisplayMenu::~DisplayMenu() { delete formatMenu; } void DisplayMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == videoFormat) { if (!formatMenu) formatMenu = new FormatMenu; HUDDialogStack::get()->push(formatMenu); } } void DisplayMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); int i; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); int fontFace = MainMenu::getFontFace(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(fontFace, titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(fontFace, titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * ((float)_width); y -= 0.6f * titleHeight; const float h = fm.getStrHeight(fontFace, fontSize, " "); const int count = listHUD.size(); for (i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } i = 1; // load current settings SceneRenderer* renderer = getSceneRenderer(); if (renderer) { TextureManager& tm = TextureManager::instance(); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("dither")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("blend")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("smooth")); if (BZDBCache::lighting) { if (BZDB.isTrue("tesselation")) { ((HUDuiList*)listHUD[i++])->setIndex(2); } else { ((HUDuiList*)listHUD[i++])->setIndex(1); } } else { ((HUDuiList*)listHUD[i++])->setIndex(0); } ((HUDuiList*)listHUD[i++])->setIndex(tm.getMaxFilter()); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("remapTexCoords") ? 1 : 0); int aniso = BZDB.evalInt("aniso"); aniso = (aniso < 1) ? 1 : aniso; ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("aniso") - 1); ((HUDuiList*)listHUD[i++])->setIndex(renderer->useQuality()); int shadowVal = 0; if (BZDBCache::shadows) { shadowVal++; if (BZDBCache::stencilShadows) { shadowVal++; } } ((HUDuiList*)listHUD[i++])->setIndex(shadowVal); #if !defined(DEBUG_RENDERING) if (debugLevel > 0) { #endif ((HUDuiList*)listHUD[i++])->setIndex(renderer->useHiddenLine() ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("wireframe") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(renderer->useDepthComplexity() ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDBCache::showCullingGrid ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDBCache::showCollisionGrid ? 1 : 0); #if !defined(DEBUG_RENDERING) } #endif } // brightness BzfWindow* window = getMainWindow()->getWindow(); if (window->hasGammaControl()) ((HUDuiList*)listHUD[i])->setIndex(gammaToIndex(window->getGamma())); i++; // energy saver ((HUDuiList*)listHUD[i])->setIndex((int)BZDB.eval("saveEnergy")); } int DisplayMenu::gammaToIndex(float gamma) { return (int)(0.5f + 5.0f * (1.0f + logf(gamma) / logf(2.0))); } float DisplayMenu::indexToGamma(int index) { // map index 5 to gamma 1.0 and index 0 to gamma 0.5 return powf(2.0f, (float)index / 5.0f - 1.0f); } void DisplayMenu::callback(HUDuiControl* w, void* data) { HUDuiList* list = (HUDuiList*)w; SceneRenderer* sceneRenderer = getSceneRenderer(); switch (((const char*)data)[0]) { case '1': BZDB.set("dither", list->getIndex() ? "1" : "0"); sceneRenderer->notifyStyleChange(); break; case '2': BZDB.set("blend", list->getIndex() ? "1" : "0"); sceneRenderer->notifyStyleChange(); break; case '3': BZDB.set("smooth", list->getIndex() ? "1" : "0"); sceneRenderer->notifyStyleChange(); break; case '4': { bool oldLighting = BZDBCache::lighting; BZDB.set("lighting", list->getIndex() == 0 ? "0" : "1"); BZDB.set("tesselation", list->getIndex() == 2 ? "1" : "0"); if (oldLighting != BZDBCache::lighting) { BZDB.set("texturereplace", (!BZDBCache::lighting && sceneRenderer->useQuality() < 2) ? "1" : "0"); BZDB.setPersistent("texturereplace", false); sceneRenderer->notifyStyleChange(); } break; } case '5': { TextureManager& tm = TextureManager::instance(); tm.setMaxFilter((OpenGLTexture::Filter)list->getIndex()); BZDB.set("texture", tm.getMaxFilterName()); sceneRenderer->notifyStyleChange(); break; } case 'R': { BZDB.setBool("remapTexCoords", list->getIndex() == 1); setSceneDatabase(); break; } case 'A': { int aniso = list->getIndex() + 1; BZDB.setInt("aniso", aniso); TextureManager& tm = TextureManager::instance(); tm.setMaxFilter(tm.getMaxFilter()); sceneRenderer->notifyStyleChange(); break; } case '6': sceneRenderer->setQuality(list->getIndex()); if (list->getIndex() > 3) { BZDB.set("zbuffer","1"); setSceneDatabase(); } BZDB.set("texturereplace", (!BZDBCache::lighting && sceneRenderer->useQuality() < 2) ? "1" : "0"); BZDB.setPersistent("texturereplace", false); sceneRenderer->notifyStyleChange(); break; case '7': { const int shadowVal = list->getIndex(); BZDB.set("shadows", shadowVal > 0 ? "1" : "0"); BZDB.set("stencilShadows", shadowVal > 1 ? "1" : "0"); sceneRenderer->notifyStyleChange(); break; } case 'a': sceneRenderer->setHiddenLine(list->getIndex() != 0); break; case 'b': BZDB.setBool("wireframe", (list->getIndex() != 0)); break; case 'c': sceneRenderer->setDepthComplexity(list->getIndex() != 0); break; case 'd': BZDB.setBool("showCullingGrid", list->getIndex() != 0); break; case 'e': BZDB.setBool("showCollisionGrid", list->getIndex() != 0); break; case 's': BZDB.setBool("saveEnergy", list->getIndex() != 0); break; case 'g': BzfWindow* window = getMainWindow()->getWindow(); if (window->hasGammaControl()) window->setGamma(indexToGamma(list->getIndex())); break; } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/DisplayMenu.h000066400000000000000000000025021200563112200200750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __DISPLAYMENU_H__ #define __DISPLAYMENU_H__ #include "common.h" /* common interface headers */ #include "HUDDialog.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "FormatMenu.h" /** this class provides options for setting the gui */ class DisplayMenu : public HUDDialog { public: DisplayMenu(); ~DisplayMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); private: FormatMenu* formatMenu; HUDuiControl* videoFormat; static int gammaToIndex(float); static float indexToGamma(int); }; extern void setSceneDatabase(); #endif /* __DISPLAYMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Downloads.cxx000066400000000000000000000237761200563112200201700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Downloads.h" /* common implementation headers */ #include "AccessList.h" #include "CacheManager.h" #include "BzMaterial.h" #include "AnsiCodes.h" #include "TextureManager.h" #include "cURLManager.h" /* local implementation headers */ #include "playing.h" #include "HUDDialogStack.h" // local variables for file tracker static int totalTex = 0; static int currentTex = 0; static int runs = 0; // FIXME - someone write a better explanation static const char DownloadContent[] = "#\n" "# This file controls the access to servers for downloads.\n" "# Patterns are attempted in order against both the hostname\n" "# and ip. The first matching pattern sets the state. If no\n" "# patterns are matched, then the server is authorized. There\n" "# are four types of matches:\n" "#\n" "# simple globbing (* and ?)\n" "# allow\n" "# deny\n" "#\n" "# regular expressions\n" "# allow_regex\n" "# deny_regex\n" "#\n" "\n" "#\n" "# To authorize all servers, remove the last 2 lines.\n" "#\n" "\n" "allow *images.bzflag.org\n" "deny *\n"; static AccessList DownloadAccessList("DownloadAccess.txt", DownloadContent); static bool textureDownloading = false; // Function Prototypes static void printAuthNotice(); static bool checkAuthorizations(BzMaterialManager::TextureSet& set); class CachedTexture : cURLManager { public: CachedTexture(const std::string &texUrl); virtual void finalization(char *data, unsigned int length, bool good); static void setParams(bool check, long timeout); static int activeTransfer(); private: virtual void collectData(char* ptr, int len); std::string url; static bool checkForCache; static long httpTimeout; static int textureCounter; static int byteTransferred; bool timeRequest; }; bool CachedTexture::checkForCache = false; long CachedTexture::httpTimeout = 0; int CachedTexture::textureCounter = 0; int CachedTexture::byteTransferred = 0; CachedTexture::CachedTexture(const std::string &texUrl) : cURLManager() { CacheManager::CacheRecord oldrec; setURL(texUrl); url = texUrl; // use the cache? bool cached = CACHEMGR.findURL(texUrl, oldrec); if (cached && !checkForCache) { // use the cached file MATERIALMGR.setTextureLocal(texUrl, oldrec.name); } else { textureCounter++; if (httpTimeout > 0.0) setTimeout(httpTimeout); setRequestFileTime(true); timeRequest = cached; std::string msg = ColorStrings[GreyColor]; msg += "downloading: " + url; addMessage(NULL, msg); if (cached) { // use the cached file -- just in case MATERIALMGR.setTextureLocal(url, oldrec.name); setTimeCondition(ModifiedSince, oldrec.date); } addHandle(); } } void CachedTexture::setParams(bool check, long timeout) { checkForCache = check; httpTimeout = timeout; textureCounter = 0; byteTransferred = 0; } void CachedTexture::finalization(char *data, unsigned int length, bool good) { time_t filetime; textureCounter--; if (good) { if (length) { getFileTime(filetime); // CACHEMGR generates name, usedDate, and key CacheManager::CacheRecord rec; rec.url = url; rec.size = length; rec.date = filetime; CACHEMGR.addFile(rec, data); const std::string localname = CACHEMGR.getLocalName(url); TextureManager& TEXMGR = TextureManager::instance(); if (TEXMGR.isLoaded(localname)) { TEXMGR.reloadTextureImage(localname); // reload with the new image } MATERIALMGR.setTextureLocal(url, localname); } } else { CacheManager::CacheRecord rec; if (CACHEMGR.findURL(url, rec)) { MATERIALMGR.setTextureLocal(url, rec.name); } else { MATERIALMGR.setTextureLocal(url, ""); } } } int CachedTexture::activeTransfer() { return textureCounter; } void CachedTexture::collectData(char* ptr, int len) { char buffer[128]; if(runs == 0) totalTex = textureCounter; cURLManager::collectData(ptr, len); byteTransferred += len; //Make it so it counts textures in reverse order (0 to max instead of max to 0) currentTex = totalTex - textureCounter + 1; //Turn bytes into kilobytes sprintf (buffer, "Downloading texture (%d of %d): %d KB", currentTex, totalTex, byteTransferred/1024); runs++; HUDDialogStack::get()->setFailedMessage(buffer); } static std::vector cachedTexVector; void Downloads::startDownloads(bool doDownloads, bool updateDownloads, bool referencing) { totalTex = 0; currentTex = 0; runs = 0; CACHEMGR.loadIndex(); CACHEMGR.limitCacheSize(); DownloadAccessList.reload(); BzMaterialManager::TextureSet set; BzMaterialManager::TextureSet::iterator set_it; MATERIALMGR.makeTextureList(set, referencing); float timeout = 15; if (BZDB.isSet("httpTimeout")) { timeout = BZDB.eval("httpTimeout"); } CachedTexture::setParams(updateDownloads, (long)timeout); // check hosts' access permissions bool authNotice = checkAuthorizations(set); if (!referencing) { // Clear old cached texture // This is the first time is called after joining int texNo = cachedTexVector.size(); for (int i = 0; i < texNo; i++) delete cachedTexVector[i]; cachedTexVector.clear(); } if (doDownloads) for (set_it = set.begin(); set_it != set.end(); ++set_it) { const std::string& texUrl = set_it->c_str(); if (CACHEMGR.isCacheFileType(texUrl)) { if (!referencing) MATERIALMGR.setTextureLocal(texUrl, ""); cachedTexVector.push_back(new CachedTexture(texUrl)); } } else for (set_it = set.begin(); set_it != set.end(); ++set_it) { const std::string& texUrl = set_it->c_str(); if (CACHEMGR.isCacheFileType(texUrl)) { // use the cache? CacheManager::CacheRecord oldrec; if (CACHEMGR.findURL(texUrl, oldrec)) { // use the cached file MATERIALMGR.setTextureLocal(texUrl, oldrec.name); } else { // bail here if we can't download MATERIALMGR.setTextureLocal(texUrl, ""); std::string msg = ColorStrings[GreyColor]; msg += "not downloading: " + texUrl; addMessage(NULL, msg); } } } if (authNotice) { printAuthNotice(); } textureDownloading = true; } void Downloads::finalizeDownloads() { textureDownloading = false; int texNo = cachedTexVector.size(); for (int i = 0; i < texNo; i++) delete cachedTexVector[i]; cachedTexVector.clear(); CACHEMGR.saveIndex(); } bool Downloads::requestFinalized() { return textureDownloading && (CachedTexture::activeTransfer() == 0); } void Downloads::removeTextures() { BzMaterialManager::TextureSet set; BzMaterialManager::TextureSet::iterator set_it; MATERIALMGR.makeTextureList(set, false /* ignore referencing */); TextureManager& TEXMGR = TextureManager::instance(); for (set_it = set.begin(); set_it != set.end(); ++set_it) { const std::string& texUrl = set_it->c_str(); if (CACHEMGR.isCacheFileType(texUrl)) { const std::string& localname = CACHEMGR.getLocalName(texUrl); if (TEXMGR.isLoaded(localname)) { TEXMGR.removeTexture(localname); } } } return; } static void printAuthNotice() { std::string msg = ColorStrings[WhiteColor]; msg += "NOTE: "; msg += ColorStrings[GreyColor]; msg += "download access is controlled by "; msg += ColorStrings[YellowColor]; msg += DownloadAccessList.getFileName(); addMessage(NULL, msg); return; } bool authorizedServer(const std::string& hostname) { // Don't do here a DNS lookup, it can block the client // DNS is temporary removed until someone code it unblocking // make the list of strings to check std::vector nameAndIp; if (hostname.size() > 0) { nameAndIp.push_back(hostname); } return DownloadAccessList.authorized(nameAndIp); } bool parseHostname(const std::string& url, std::string& hostname) { std::string protocol, path; int port; if (BzfNetwork::parseURL(url, protocol, hostname, port, path)) { if ((protocol == "http") || (protocol == "ftp")) { return true; } } return false; } static bool checkAuthorizations(BzMaterialManager::TextureSet& set) { // avoid the DNS lookup if (DownloadAccessList.alwaysAuthorized()) { return false; } bool hostFailed = false; BzMaterialManager::TextureSet::iterator set_it; std::map hostAccess; std::map::iterator host_it; // get the list of hosts to check for (set_it = set.begin(); set_it != set.end(); ++set_it) { const std::string& url = *set_it; std::string hostname; if (parseHostname(url, hostname)) { hostAccess[hostname] = true; } } // check the hosts for (host_it = hostAccess.begin(); host_it != hostAccess.end(); ++host_it) { const std::string& host = host_it->first; host_it->second = authorizedServer(host); } // clear any unauthorized urls set_it = set.begin(); while (set_it != set.end()) { BzMaterialManager::TextureSet::iterator next_it = set_it; ++next_it; const std::string& url = *set_it; std::string hostname; if (parseHostname(url, hostname) && !hostAccess[hostname]) { hostFailed = true; // send a message std::string msg = ColorStrings[RedColor]; msg += "local denial: "; msg += ColorStrings[GreyColor]; msg += url; addMessage(NULL, msg); // remove the url MATERIALMGR.setTextureLocal(url, ""); set.erase(set_it); } set_it = next_it; } return hostFailed; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Downloads.h000066400000000000000000000020671200563112200176030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef DOWNLOADS_H #define DOWNLOADS_H #include "common.h" /* system interface headers */ #include namespace Downloads { void startDownloads(bool doDownloads, bool updateDownloads, bool referencing); void finalizeDownloads(); void removeTextures(); // free the downloaded GL textures bool requestFinalized(); } bool authorizedServer(const std::string& hostname); bool parseHostname(const std::string& url, std::string& hostname); #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/EffectsMenu.cxx000066400000000000000000000342541200563112200204330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "EffectsMenu.h" /* common implementation headers */ #include "TextUtils.h" #include "FontManager.h" #include "StateDatabase.h" /* local implementation headers */ #include "MainMenu.h" #include "TrackMarks.h" #include "HUDuiList.h" #include "HUDuiLabel.h" #include "effectsRenderer.h" EffectsMenu::EffectsMenu() { // add controls std::vector& listHUD = getControls(); // cache font face ID int fontFace = MainMenu::getFontFace(); // the menu label HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Effects Settings"); listHUD.push_back(label); // the menu options HUDuiList* option; std::vector* options; // Rain Scale option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Rain:"); option->setCallback(callback, (void*)"r"); options = &option->getList(); options->push_back(std::string("Off")); option->createSlider(10); option->update(); listHUD.push_back(option); // The Mirror option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Mirror:"); option->setCallback(callback, (void*)"m"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Fog Effect option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Fog:"); option->setCallback(callback, (void*)"F"); options = &option->getList(); options->push_back(std::string("Fast")); options->push_back(std::string("Nice")); option->update(); listHUD.push_back(option); // Shot Length (Viewport) option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Shot Length:"); option->setCallback(callback, (void*)"x"); options = &option->getList(); options->push_back(std::string("Off")); option->createSlider(10); option->update(); listHUD.push_back(option); // Display Treads option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Display Treads:"); option->setCallback(callback, (void*)"T"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Animated Treads option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Animated Treads:"); option->setCallback(callback, (void*)"a"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Covered")); options->push_back(std::string("Exposed")); option->update(); listHUD.push_back(option); // Track Mark Fading Scale option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Track Marks:"); option->setCallback(callback, (void*)"t"); options = &option->getList(); options->push_back(std::string("Off")); option->createSlider(10); option->update(); listHUD.push_back(option); // Track Mark Culling Type option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Track Mark Culling:"); option->setCallback(callback, (void*)"c"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Fast")); options->push_back(std::string("Best")); option->update(); listHUD.push_back(option); // Fancy effects from effectsRenderer option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Fancy Effects:"); option->setCallback(callback, (void*)"f"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); std::vector optbuf; // Fancy effects I: Spawn option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Spawn Effect:"); option->setCallback(callback, (void*)"s"); options = &option->getList(); optbuf = EFFECTS.getSpawnEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects Ia: Local spawn option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Local Spawn Effect:"); option->setCallback(callback, (void*)"L"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Same as spawns")); option->update(); listHUD.push_back(option); // Fancy effects II: Death option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Death Effect:"); option->setCallback(callback, (void*)"d"); options = &option->getList(); optbuf = EFFECTS.getDeathEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects III: Shots option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Shot Fired Effect:"); option->setCallback(callback, (void*)"S"); options = &option->getList(); optbuf = EFFECTS.getShotEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects IV: Local shots option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Local Shot Effect:"); option->setCallback(callback, (void*)"l"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Same as shots")); option->update(); listHUD.push_back(option); // Fancy effects V: Velocity for shot effects option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Use Velocity on Shot Effects:"); option->setCallback(callback, (void*)"V"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Fancy effects VI: Landing effects option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("Landing Effect:"); option->setCallback(callback, (void*)"b"); options = &option->getList(); optbuf = EFFECTS.getLandEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects VII: GM Smoke Trail effects option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("GM Smoke Effect:"); option->setCallback(callback, (void*)"G"); options = &option->getList(); optbuf = EFFECTS.getGMPuffEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects VIIa: GM puff timing option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel("GM Effect Timing:"); option->setCallback(callback, (void*)"g"); option->createSlider(11); option->update(); listHUD.push_back(option); // Fancy effects VIII: rico effects option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel(" Ricocet Effect:"); option->setCallback(callback, (void*)"R"); options = &option->getList(); optbuf = EFFECTS.getRicoEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); // Fancy effects IX: shot Teleporter effects option = new HUDuiList; option->setFontFace(MainMenu::getFontFace()); option->setLabel(" Teleport Shot Effect:"); option->setCallback(callback, (void*)"7"); options = &option->getList(); optbuf = EFFECTS.getShotTeleportEffectTypes(); options->assign(optbuf.begin(), optbuf.end()); option->update(); listHUD.push_back(option); initNavigation(listHUD, 1, listHUD.size() - 1); } EffectsMenu::~EffectsMenu() { } void EffectsMenu::execute() { } void EffectsMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * (float)_width; y -= 0.6f * titleHeight; const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); const int count = listHUD.size(); int i; for (i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); if ((i == 3) || (i == 4) || (i == 6) || (i == 8)) { y -= 1.75f * h; } else { y -= 1.0f * h; } } // load current settings i = 1; ((HUDuiList*)listHUD[i++])->setIndex(int((BZDB.eval("userRainScale") * 10.0f) + 0.5f)); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("userMirror") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("fogEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("shotLength")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("showTreads") ? 1 : 0); int treadIndex = 0; if (BZDB.isTrue("animatedTreads")) { treadIndex++; if (BZDB.isTrue("treadStyle")) { treadIndex++; } } ((HUDuiList*)listHUD[i++])->setIndex(treadIndex); ((HUDuiList*)listHUD[i++])->setIndex(int((TrackMarks::getUserFade() * 10.0f) + 0.5f)); TrackMarks::AirCullStyle style = TrackMarks::getAirCulling(); if (style == TrackMarks::NoAirCull) { ((HUDuiList*)listHUD[i++])->setIndex(0); } else if (style != TrackMarks::FullAirCull) { ((HUDuiList*)listHUD[i++])->setIndex(1); } else { ((HUDuiList*)listHUD[i++])->setIndex(2); } ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("useFancyEffects") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("spawnEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("enableLocalSpawnEffect") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("deathEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("shotEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("enableLocalShotEffect") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("useVelOnShotEffects") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("landEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("gmPuffEffect")); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(1 / BZDB.eval("gmPuffTime") - 3)); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("ricoEffect")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("tpEffect")); } void EffectsMenu::callback(HUDuiControl* w, void* data) { HUDuiList* list = (HUDuiList*)w; switch (((const char*)data)[0]) { case 'r': { int scale = list->getIndex(); BZDB.setFloat("userRainScale", float(scale) / 10.0f); break; } case 'm': { BZDB.set("userMirror", list->getIndex() ? "1" : "0"); break; } case 'F': { BZDB.setInt("fogEffect", list->getIndex()); break; } case 'T': { BZDB.set("showTreads", list->getIndex() ? "1" : "0"); break; } case 'a': { switch (list->getIndex()) { case 1: BZDB.set("animatedTreads", "1"); BZDB.set("treadStyle", "0"); break; case 2: BZDB.set("animatedTreads", "1"); BZDB.set("treadStyle", "1"); break; default: BZDB.set("animatedTreads", "0"); BZDB.set("treadStyle", "0"); break; } RENDERER.setRebuildTanks(); break; } case 't': { int fade = list->getIndex(); TrackMarks::setUserFade(float(fade) / 10.0f); break; } case 'c': { int culling = list->getIndex(); if (culling <= 0) { TrackMarks::setAirCulling(TrackMarks::NoAirCull); } else if (culling == 1) { TrackMarks::setAirCulling(TrackMarks::InitAirCull); } else { TrackMarks::setAirCulling(TrackMarks::FullAirCull); } break; } case 'x': { BZDB.setInt("shotLength", list->getIndex()); RENDERER.notifyStyleChange(); // bolt glBlendFunc() may change break; } case 'f': { BZDB.set("useFancyEffects", list->getIndex() ? "1" : "0"); break; } case 's': { BZDB.set("spawnEffect", TextUtils::format("%d", list->getIndex())); break; } case 'L': { BZDB.set("enableLocalSpawnEffect", list->getIndex() ? "1" : "0"); break; } case 'd': { BZDB.set("deathEffect", TextUtils::format("%d", list->getIndex())); break; } case 'S': { BZDB.set("shotEffect", TextUtils::format("%d", list->getIndex())); break; } case 'l': { BZDB.set("enableLocalShotEffect", list->getIndex() ? "1" : "0"); break; } case 'V': { BZDB.set("useVelOnShotEffects", list->getIndex() ? "1" : "0"); break; } case 'b': { BZDB.set("landEffect", TextUtils::format("%d", list->getIndex())); break; } case 'G': { BZDB.set("gmPuffEffect", TextUtils::format("%d", list->getIndex())); break; } case 'g': { BZDB.set("gmPuffTime", TextUtils::format("1/(%d+3)", list->getIndex())); break; } case 'R': { BZDB.set("ricoEffect", TextUtils::format("%d", list->getIndex())); break; } case '7': { BZDB.set("tpEffect", TextUtils::format("%d", list->getIndex())); break; } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/EffectsMenu.h000066400000000000000000000022561200563112200200550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __EFFECTSMENU_H__ #define __EFFECTSMENU_H__ #include "common.h" /* common interface headers */ #include "HUDDialog.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDuiDefaultKey.h" /** this class provides options for setting the gui */ class EffectsMenu : public HUDDialog { public: EffectsMenu(); ~EffectsMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); private: }; #endif /* __EFFECTSMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/EntryZone.cxx000066400000000000000000000030641200563112200201570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // implementation header #include "EntryZone.h" EntryZone::EntryZone() { pos[0] = pos[1] = pos[2] = 0.0f; size[0] = size[1] = size[2] = 1.0f; rot = 0.0f; flags.clear(); teams.clear(); safety.clear(); return; } void* EntryZone::unpack(void* buf) { uint16_t flagCount, teamCount, safetyCount; buf = nboUnpackVector(buf, pos); buf = nboUnpackVector(buf, size); buf = nboUnpackFloat(buf, rot); buf = nboUnpackUShort(buf, flagCount); buf = nboUnpackUShort(buf, teamCount); buf = nboUnpackUShort(buf, safetyCount); int i; for (i = 0; i < flagCount; i++) { FlagType *type; buf = FlagType::unpack (buf, type); flags.push_back(type); } for (i = 0; i < teamCount; i++) { uint16_t team; buf = nboUnpackUShort(buf, team); teams.push_back((TeamColor)team); } for (i = 0; i < safetyCount; i++) { uint16_t safetyTeam; buf = nboUnpackUShort(buf, safetyTeam); safety.push_back((TeamColor)safetyTeam); } return buf; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/EntryZone.h000066400000000000000000000020531200563112200176010ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __ENTRYZONE_H__ #define __ENTRYZONE_H__ // common should be the 1st one #include "common.h" // system headers #include // common headers #include "Flag.h" #include "global.h" class EntryZone { public: EntryZone(); void* unpack(void*); public: float pos[3]; float size[3]; float rot; std::vector flags; std::vector teams; std::vector safety; }; #endif /* __ENTRYZONE_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/FlashClock.cxx000066400000000000000000000030171200563112200202310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "FlashClock.h" /* system implementation headers */ #include FlashClock::FlashClock() : duration(0.0f), onDuration(0.0f), flashDuration(0.0f) { // do nothing } FlashClock::~FlashClock() { // do nothing } void FlashClock::setClock(float _duration) { setClock(_duration, 0.0f, 0.0f); } void FlashClock::setClock(float _duration, float onTime, float offTime) { startTime = TimeKeeper::getTick(); duration = _duration; if (onTime <= 0.0f || offTime <= 0.0f) { onDuration = 0.0f; flashDuration = 0.0f; } else { onDuration = onTime; flashDuration = onTime + offTime; } } bool FlashClock::isOn() { if (duration == 0.0f) return false; const float dt = float(TimeKeeper::getTick() - startTime); if (duration > 0.0f && dt >= duration) { duration = 0.0f; return false; } if (flashDuration == 0.0f) return true; return (fmodf(dt, flashDuration) < onDuration); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/FlashClock.h000066400000000000000000000021151200563112200176540ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __FLASHCLOCK_H__ #define __FLASHCLOCK_H__ /* common interface headers */ #include "TimeKeeper.h" /** * FlashClock * keeps track of time for something that flashes */ class FlashClock { public: FlashClock(); ~FlashClock(); void setClock(float time); void setClock(float time, float onTime, float offTime); bool isOn(); private: TimeKeeper startTime; float duration; float onDuration; float flashDuration; }; #endif /* _FLASHCLOCK_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ForceFeedback.cxx000066400000000000000000000070561200563112200206720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ForceFeedback.h" /* common interface headers */ #include "BzfJoystick.h" /* local implementation headers */ #include "LocalPlayer.h" #include "playing.h" static BzfJoystick* getJoystick(); static bool useForceFeedback(const char *type = "Rumble"); static BzfJoystick* getJoystick() { MainWindow *win = getMainWindow(); if (win) return win->getJoystick(); else return NULL; } static bool useForceFeedback(const char *type) { BzfJoystick* js = getJoystick(); /* There must be a joystick class, and we need an opened joystick device */ if (!js) return false; if (!js->joystick()) return false; /* Joystick must be the current input method */ if (LocalPlayer::getMyTank()->getInputMethod() != LocalPlayer::Joystick) return false; /* Did the user enable force feedback of this type? */ if (BZDB.get("forceFeedback") != type) return false; return true; } namespace ForceFeedback { void death() { /* Nice long hard rumble for death */ if (useForceFeedback("Rumble")) getJoystick()->ffRumble(1, 0.0f, 1.5f, 1.0f, 0.0f); else if (useForceFeedback("Directional")) getJoystick()->ffDirectionalPeriodic(1, 0.0f, 1.5f, 1.0f, 0.0f, 1.0f, 0.15f, BzfJoystick::FF_SawtoothDown); } void shotFired() { /* Tiny little kick for a normal shot being fired */ if (useForceFeedback("Rumble")) getJoystick()->ffRumble(1, 0.0f, 0.1f, 0.0f, 1.0f); else if (useForceFeedback("Directional")) getJoystick()->ffDirectionalConstant(1, 0.0f, 0.1f, 0.0f, -1.0f, 0.5f); } void laserFired() { /* Funky pulsating rumble for the laser. * (Only tested so far with the Logitech Wingman Cordless Rumblepad, * some quirks in its driver may mean it's feeling a little different * than it should) */ if (useForceFeedback("Rumble")) getJoystick()->ffRumble(4, 0.01f, 0.02f, 1.0f, 1.0f); else if (useForceFeedback("Directional")) getJoystick()->ffDirectionalPeriodic(4, 0.1f, 0.1f, 0.0f, -1.0f, 0.5f, 0.05f, BzfJoystick::FF_Sine); } void shockwaveFired() { /* try to 'match' the shockwave sound */ if (useForceFeedback("Rumble")) getJoystick()->ffRumble(1, 0.0f, 0.5f, 0.0f, 1.0f); else if (useForceFeedback("Directional")) getJoystick()->ffDirectionalPeriodic(1, 0.0f, 1.0f, 0.0f, -1.0f, 0.5f, 0.1f, BzfJoystick::FF_Sine); } /* Burrowed, oscillating, etc, tanks get a special resistance force * when moving through solid matter. We use half-second increments * of force-on time. */ static TimeKeeper friction_timer = TimeKeeper::getSunGenesisTime(); void solidMatterFriction() { /* There is no way to simulate this with a rumble effect */ if (useForceFeedback("Directional")) { if ((TimeKeeper::getCurrent() - friction_timer) >= 0.5f) { getJoystick()->ffDirectionalResistance(0.5f, 1.0f, 0.5f, BzfJoystick::FF_Position); friction_timer = TimeKeeper::getCurrent(); } } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ForceFeedback.h000066400000000000000000000017541200563112200203160ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __FORCE_FEEDBACK_H__ #define __FORCE_FEEDBACK_H__ /* All functions in this namespace start playing a force feedback * effect if we have a FF-enabled joystick connected and the user * has enabled force feedback. */ namespace ForceFeedback { void death(); void shotFired(); void laserFired(); void shockwaveFired(); void solidMatterFriction(); } #endif /* __FORCE_FEEDBACK_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/FormatMenu.cxx000066400000000000000000000200311200563112200202700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "FormatMenu.h" /* common implementation headers */ #include "BzfDisplay.h" #include "ErrorHandler.h" #include "FontManager.h" /* local implementation headers */ #include "MainMenu.h" #include "playing.h" #include "HUDui.h" const int FormatMenu::NumReadouts = 4; const int FormatMenu::NumItems = 30; const int FormatMenu::NumColumns = 3; bool FormatMenuDefaultKey::keyPress(const BzfKeyEvent& key) { if (key.ascii == 0) switch (key.button) { case BzfKeyEvent::Up: if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() - 1); } return true; case BzfKeyEvent::Down: if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() + 1); } return true; case BzfKeyEvent::PageUp: if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() - FormatMenu::NumItems); } return true; case BzfKeyEvent::PageDown: if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() + FormatMenu::NumItems); } return true; } else if (key.ascii == '\t') { if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() + 1); } return true; } else if (key.ascii == 'T' || key.ascii == 't') { menu->setFormat(true); return true; } return MenuDefaultKey::keyPress(key); } bool FormatMenuDefaultKey::keyRelease(const BzfKeyEvent& key) { switch (key.button) { case BzfKeyEvent::Up: case BzfKeyEvent::Down: case BzfKeyEvent::PageUp: case BzfKeyEvent::PageDown: return true; } switch (key.ascii) { case 27: // escape case 13: // return case 'T': case 't': return true; } return MenuDefaultKey::keyRelease(key); } FormatMenu::FormatMenu() : defaultKey(this), badFormats(NULL) { int i; BzfDisplay* display = getDisplay(); numFormats = display->getNumResolutions(); badFormats = new bool[numFormats]; for (i = 0; i < numFormats; i++) badFormats[i] = false; // add controls addLabel("Video Format", ""); addLabel("", ""); // instructions addLabel("", "Current Format:"); // current format readout addLabel("", ""); // page readout currentLabel = (HUDuiLabel*)(getControls()[NumReadouts - 2]); pageLabel = (HUDuiLabel*)(getControls()[NumReadouts - 1]); // add resolution list items for (i = 0; i < NumItems; ++i) addLabel("", ""); // fill in static labels if (numFormats < 2) { currentLabel->setString(""); setFocus(NULL); } else { HUDuiLabel* label = (HUDuiLabel*)(getControls()[NumReadouts - 3]); label->setString("Press Enter to select and T to test a format. Esc to exit."); setFocus(pageLabel); } } FormatMenu::~FormatMenu() { delete[] badFormats; } void FormatMenu::addLabel(const char* msg, const char* _label) { HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString(msg); label->setLabel(_label); getControls().push_back(label); } int FormatMenu::getSelected() const { return selectedIndex; } void FormatMenu::setSelected(int index) { BzfDisplay* display = getDisplay(); std::vector& listHUD = getControls(); // clamp index if (index < 0) index = numFormats - 1; else if (index != 0 && index >= numFormats) index = 0; // ignore if no change if (selectedIndex == index) return; // update current format currentLabel->setString(display->getResolution(display->getResolution())->name); // update selected index and get old and new page numbers const int oldPage = (selectedIndex < 0) ? -1 : (selectedIndex / NumItems); selectedIndex = index; const int newPage = (selectedIndex / NumItems); // if page changed then load items for this page if (oldPage != newPage) { // fill items const int base = newPage * NumItems; for (int i = 0; i < NumItems; ++i) { HUDuiLabel* label = (HUDuiLabel*)listHUD[i + NumReadouts]; if (base + i < numFormats) if (badFormats[base + i]) label->setString(""); else label->setString(display->getResolution(base + i)->name); else label->setString(""); } // change page label if (numFormats > NumItems) { char msg[50]; std::vector args; sprintf(msg, "%d", newPage + 1); args.push_back(msg); sprintf(msg, "%d", (numFormats + NumItems - 1) / NumItems); args.push_back(msg); pageLabel->setString("Page {1} of {2}", &args); } } // set focus to selected item if (numFormats > 0) { const int indexOnPage = selectedIndex % NumItems; getControls()[NumReadouts + indexOnPage]->setFocus(); } else { setFocus(NULL); } } void FormatMenu::show() { pageLabel->setString(""); selectedIndex = -1; setSelected(getDisplay()->getResolution()); } void FormatMenu::execute() { setFormat(false); } void FormatMenu::setFormat(bool test) { if (selectedIndex >= numFormats || badFormats[selectedIndex]) return; if (!setVideoFormat(selectedIndex, test)) { // can't load format badFormats[selectedIndex] = true; } else if (!test) { // print OpenGL renderer, which might have changed printError((const char*)glGetString(GL_RENDERER)); } // update readouts const int oldSelectedIndex = selectedIndex; selectedIndex = -1; setSelected(oldSelectedIndex); } void FormatMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; FontManager &fm = FontManager::instance(); int fontFace = MainMenu::getFontFace(); // reposition title float x, y; std::vector& listHUD = getControls(); { HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(fontFace, titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(fontFace, titleFontSize, " "); x = 0.5f * ((float)_width - titleWidth); y = (float)_height - titleHeight; title->setPosition(x, y); } // reposition test and current format messages float fontSize = (float)_height / 54.0f; { HUDuiLabel* label = (HUDuiLabel*)listHUD[1]; label->setFontSize(fontSize); const float stringWidth = fm.getStrLength(fontFace, fontSize, label->getString()); x = 0.5f * ((float)_width - stringWidth); y -= 1.5f * fm.getStrHeight(fontFace, fontSize, " "); label->setPosition(x, y); } { HUDuiLabel* label = currentLabel; label->setFontSize(fontSize); y -= 1.0f * fm.getStrHeight(fontFace, fontSize, " "); label->setPosition(0.5f * (float)_width, y); } // position page readout fontSize = (float)_height / 54.0f; { HUDuiLabel* label = pageLabel; label->setFontSize(fontSize); const float stringWidth = fm.getStrLength(fontFace, fontSize, label->getString()); x = 0.5f * ((float)_width - stringWidth); y -= 2.0f * fm.getStrHeight(fontFace, fontSize, " "); label->setPosition(x, y); } // position format item list const float yBase = y; int lastColumn = -1; for (int i = 0; i < NumItems; ++i) { const int column = i * NumColumns / NumItems; if (column != lastColumn) { lastColumn = column; x = (float)_width * ((0.5f + (float)column) / (float)(NumColumns + 1)); y = yBase; } HUDuiLabel* label = (HUDuiLabel*)listHUD[i + NumReadouts]; label->setFontSize(fontSize); y -= 1.0f * fm.getStrHeight(fontFace, fontSize, " "); label->setPosition(x, y); } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/FormatMenu.h000066400000000000000000000034321200563112200177230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __FORMATMENU_H__ #define __FORMATMENU_H__ /* common interface headers */ #include "BzfEvent.h" /* local interface headers */ #include "HUDDialog.h" #include "HUDuiLabel.h" #include "HUDuiDefaultKey.h" #include "MenuDefaultKey.h" class FormatMenu; class FormatMenuDefaultKey : public MenuDefaultKey { public: FormatMenuDefaultKey(FormatMenu* _menu) : menu(_menu) { } ~FormatMenuDefaultKey() { } bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); private: FormatMenu* menu; }; class FormatMenu : public HUDDialog { public: FormatMenu(); ~FormatMenu(); HUDuiDefaultKey* getDefaultKey() { return &defaultKey; } int getSelected() const; void setSelected(int); void show(); void execute(); void resize(int width, int height); void setFormat(bool test); public: static const int NumItems; private: void addLabel(const char* msg, const char* _label); private: FormatMenuDefaultKey defaultKey; int numFormats; float center; HUDuiLabel* currentLabel; HUDuiLabel* pageLabel; int selectedIndex; bool* badFormats; static const int NumColumns; static const int NumReadouts; }; #endif /* __FORMATMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/GUIOptionsMenu.cxx000066400000000000000000000416231200563112200210520ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "GUIOptionsMenu.h" /* common implementation headers */ #include "BundleMgr.h" #include "BZDBCache.h" #include "TextUtils.h" #include "FontManager.h" /* local implementation headers */ #include "MainMenu.h" #include "World.h" #include "HUDDialogStack.h" #include "HUDuiList.h" #include "HUDuiLabel.h" #include "ScoreboardRenderer.h" #include "playing.h" GUIOptionsMenu::GUIOptionsMenu() { // add controls std::vector& listHUD = getControls(); // cache font face ID int fontFace = MainMenu::getFontFace(); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("GUI Settings"); listHUD.push_back(label); HUDuiList* option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Style:"); option->setCallback(callback, (void*)"e"); std::vector* options = &option->getList(); options->push_back(std::string("Normal")); options->push_back(std::string("Fast")); options->push_back(std::string("Fast Sorted")); options->push_back(std::string("Enhanced")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Scoreboard Sort:"); option->setCallback(callback, (void*)"p"); options = &option->getList(); const char **sortLabels = ScoreboardRenderer::getSortLabels(); while ( *sortLabels != NULL) options->push_back(std::string(*sortLabels++)); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Always Show Team Scores:"); option->setCallback(callback, (void*)"q"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Scoreboard Font Size:"); option->setCallback(callback, (void*)"S"); options = &option->getList(); options->push_back(std::string("Auto")); option->createSlider(4); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("ControlPanel Font Size:"); option->setCallback(callback, (void*)"C"); options = &option->getList(); options->push_back(std::string("Auto")); option->createSlider(4); option->update(); listHUD.push_back(option); // set observer info option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Extended Observer Info:"); option->setCallback(callback, (void*)"O"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); options->push_back(std::string("On With Apparent Speeds")); options->push_back(std::string("Full")); option->update(); listHUD.push_back(option); // set Panel Translucency option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Panel Opacity:"); option->setCallback(callback, (void*)"y"); option->createSlider(11); option->update(); listHUD.push_back(option); // set Radar Translucency option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Opacity:"); option->setCallback(callback, (void*)"Y"); option->createSlider(11); option->update(); listHUD.push_back(option); // toggle coloring of shots on radar option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Colored shots on radar:"); option->setCallback(callback, (void*)"z"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // set radar shot length option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Shot Length:"); option->setCallback(callback, (void*)"l"); option->createSlider(11); option->update(); listHUD.push_back(option); // set radar shot size option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Shot Size:"); option->setCallback(callback, (void*)"s"); option->createSlider(11); option->update(); listHUD.push_back(option); // radar shot leading line option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Shot Line:"); option->setCallback(callback, (void*)"F"); options = &option->getList(); options->push_back(std::string("Lagging")); options->push_back(std::string("Leading")); options->push_back(std::string("Leading & Lagging")); option->update(); listHUD.push_back(option); // set radar position option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar Position:"); option->setCallback(callback, (void*)"P"); options = &option->getList(); options->push_back(std::string("Left")); options->push_back(std::string("Right")); option->update(); listHUD.push_back(option); // set radar size option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Radar & Panel Size:"); option->setCallback(callback, (void*)"R"); option->createSlider(maxRadarSize+1); option->update(); listHUD.push_back(option); // set maxmotion size option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Mouse Box Size:"); option->setCallback(callback, (void*)"M"); option->createSlider(22); option->update(); listHUD.push_back(option); // set locale option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Locale:"); option->setCallback(callback, (void*)"L"); options = &option->getList(); std::vector locales; if (BundleMgr::getLocaleList(&locales) == true) { options->push_back(std::string("Default")); for (int i = 0; i < (int)locales.size(); i++) { options->push_back(locales[i]); } locales.erase(locales.begin(), locales.end()); } else { // Something failed when trying to compile a list // of all the locales. options->push_back(std::string("Default")); } for (int i = 0; i < (int)options->size(); i++) { if ((*options)[i].compare(World::getLocale()) == 0) { option->setIndex(i); break; } } option->update(); listHUD.push_back(option); // Tabs option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Control panel tabs:"); option->setCallback(callback, (void*)"t"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("Left")); options->push_back(std::string("Right")); option->update(); listHUD.push_back(option); // GUI coloring option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Control panel coloring:"); option->setCallback(callback, (void*)"c"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // Underline color option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Underline color:"); option->setCallback(callback, (void*)"u"); options = &option->getList(); options->push_back(std::string("Cyan")); options->push_back(std::string("Grey")); options->push_back(std::string("Text")); option->update(); listHUD.push_back(option); // Killer Highlight option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Killer Highlight:"); option->setCallback(callback, (void*)"k"); options = &option->getList(); options->push_back(std::string("None")); options->push_back(std::string("Pulsating")); options->push_back(std::string("Underline")); option->update(); listHUD.push_back(option); // Pulsate Rate option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Pulsation Rate:"); option->setCallback(callback, (void*)"r"); option->createSlider(9); option->update(); listHUD.push_back(option); // Pulsate Depth option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Pulsation Depth:"); option->setCallback(callback, (void*)"d"); option->createSlider(9); option->update(); listHUD.push_back(option); // Time/date display settings option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Time / Date Display:"); option->setCallback(callback, (void*)"h"); options = &option->getList(); options->push_back(std::string("time")); options->push_back(std::string("date")); options->push_back(std::string("both")); option->update(); listHUD.push_back(option); // HUD Reload timer option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Reload timer on HUD:"); option->setCallback(callback, (void*)"T"); options = &option->getList(); options->push_back(std::string("Off")); options->push_back(std::string("On")); option->update(); listHUD.push_back(option); // set motto display length option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Motto Display Length:"); option->setCallback(callback, (void*)"E"); option->createSlider(32+1); option->update(); listHUD.push_back(option); initNavigation(listHUD, 1, listHUD.size()-1); } GUIOptionsMenu::~GUIOptionsMenu() { } void GUIOptionsMenu::execute() { } void GUIOptionsMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 65.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.54f * (float)_width; y -= 0.6f * titleHeight; const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); const int count = listHUD.size(); for (int i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } // load current settings SceneRenderer* renderer = getSceneRenderer(); if (renderer) { int i = 1; ((HUDuiList*)listHUD[i++])->setIndex(BZDBCache::radarStyle); ((HUDuiList*)listHUD[i++])->setIndex(ScoreboardRenderer::getSort()); ((HUDuiList*)listHUD[i++])->setIndex(ScoreboardRenderer::getAlwaysTeamScore()); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval ("scorefontsize"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval ("cpanelfontsize"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval ("showVelocities"))); ((HUDuiList*)listHUD[i++])->setIndex((int)(10.0f * renderer ->getPanelOpacity() + 0.5)); ((HUDuiList*)listHUD[i++])->setIndex((int)(10.0f * renderer ->getRadarOpacity() + 0.5)); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("coloredradarshots") ? 1 : 0); ((HUDuiList*)listHUD[i++])->setIndex(static_cast (BZDB.eval("linedradarshots"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast (BZDB.eval("sizedradarshots"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval("leadingShotLine"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval("radarPosition"))); ((HUDuiList*)listHUD[i++])->setIndex(renderer->getRadarSize()); ((HUDuiList*)listHUD[i++])->setIndex(renderer->getMaxMotionFactor() + 11); i++; // locale ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval ("showtabs"))); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("colorful") ? 1 : 0); // underline color - find index of mode string in options const std::vector &opts = ((HUDuiList*)listHUD[i])->getList(); std::string uColor = BZDB.get("underlineColor"); ((HUDuiList*)listHUD[i++])->setIndex(std::find(opts.begin(), opts.end(), uColor) - opts.begin()); ((HUDuiList*)listHUD[i++])->setIndex(static_cast (BZDB.eval("killerhighlight"))); ((HUDuiList*)listHUD[i++])->setIndex(static_cast (BZDB.eval("pulseRate") * 5) - 1); ((HUDuiList*)listHUD[i++])->setIndex(static_cast (BZDB.eval("pulseDepth") * 10) - 1); ((HUDuiList*)listHUD[i++])->setIndex(static_cast(BZDB.eval ("timedate"))); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.isTrue("displayReloadTimer") ? 1 : 0); if (BZDB.isTrue("hideMottos")) ((HUDuiList*)listHUD[i++])->setIndex(0); else ((HUDuiList*)listHUD[i++])->setIndex((int)BZDB.eval("mottoDispLen") / 4); } } void GUIOptionsMenu::callback(HUDuiControl* w, void* data) { HUDuiList* list = (HUDuiList*)w; SceneRenderer* sceneRenderer = getSceneRenderer(); switch (((const char*)data)[0]) { case 'e': BZDB.setInt("radarStyle", list->getIndex()); break; case 'C': { BZDB.setInt("cpanelfontsize", list->getIndex()); getMainWindow()->getWindow()->callResizeCallbacks(); break; } case 'h': { BZDB.setInt("timedate", list->getIndex()); break; } case 'S': { BZDB.setInt("scorefontsize", list->getIndex()); getMainWindow()->getWindow()->callResizeCallbacks(); break; } case 'O': { BZDB.setInt("showVelocities", list->getIndex()); getMainWindow()->getWindow()->callResizeCallbacks(); break; } case 'y': { const float newOpacity = (float)list->getIndex() / 10.0f; if (newOpacity == 1.0f || sceneRenderer->getRadarOpacity() == 1.0f) sceneRenderer->setRadarOpacity(newOpacity); sceneRenderer->setPanelOpacity(newOpacity); break; } case 'Y': { const float newOpacity = (float)list->getIndex() / 10.0f; sceneRenderer->setRadarOpacity(newOpacity); if (newOpacity == 1.0f || sceneRenderer->getPanelOpacity() == 1.0f) sceneRenderer->setPanelOpacity(newOpacity); break; } case 'z': BZDB.set("coloredradarshots", list->getIndex() ? "1" : "0"); break; case 'l': BZDB.set("linedradarshots", TextUtils::format("%d", list->getIndex())); break; case 's': BZDB.set("sizedradarshots", TextUtils::format("%d", list->getIndex())); break; case 'F': BZDB.setInt("leadingShotLine", list->getIndex()); break; case 'P': BZDB.setInt("radarPosition", list->getIndex()); controlPanel->resize(); break; case 'R': { sceneRenderer->setRadarSize(list->getIndex()); break; } case 'M': { sceneRenderer->setMaxMotionFactor(list->getIndex() - 11); break; } case 'c': { BZDB.set("colorful", list->getIndex() ? "1" : "0"); break; } case 't': { BZDB.set("showtabs", TextUtils::format("%d", list->getIndex())); break; } case 'u': { std::vector* options = &list->getList(); std::string color = (*options)[list->getIndex()]; BZDB.set("underlineColor", color); break; } case 'k': { BZDB.set("killerhighlight", TextUtils::format("%d", list->getIndex())); break; } case 'L': { std::vector* options = &list->getList(); std::string locale = (*options)[list->getIndex()]; World::setLocale(locale); BZDB.set("locale", locale); World::getBundleMgr()->getBundle(locale, true); GUIOptionsMenu *menu = (GUIOptionsMenu *) HUDDialogStack::get()->top(); if (menu) menu->resize(menu->getWidth(), menu->getHeight()); break; } case 'r': { BZDB.set("pulseRate", TextUtils::format("%f", (float)(list->getIndex() + 1) / 5.0f)); break; } case 'd': { BZDB.set("pulseDepth", TextUtils::format("%f", (float)(list->getIndex() + 1) / 10.0f)); break; } case 'T': { BZDB.set("displayReloadTimer", list->getIndex() ? "1" : "0"); break; } case 'p': ScoreboardRenderer::setSort(list->getIndex()); break; case 'q': ScoreboardRenderer::setAlwaysTeamScore(list->getIndex() ? true : false); break; case 'E': BZDB.set("mottoDispLen", TextUtils::format("%d", list->getIndex() * 4)); BZDB.set("hideMottos", list->getIndex() ? "0" : "1"); break; } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/GUIOptionsMenu.h000066400000000000000000000023471200563112200204770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __GUIOPTIONSMENU_H__ #define __GUIOPTIONSMENU_H__ #include "common.h" /* common interface headers */ #include "HUDDialog.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDuiDefaultKey.h" /** this class provides options for setting the gui */ class GUIOptionsMenu : public HUDDialog { public: GUIOptionsMenu(); ~GUIOptionsMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); static const int maxRadarSize = 30; private: }; #endif /* __GUIOPTIONSMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/GuidedMissleStrategy.cxx000066400000000000000000000373001200563112200223230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "GuidedMissleStrategy.h" /* common implementation headers */ #include "BZDBCache.h" #include "TextureManager.h" #include "Intersect.h" /* local implementation headers */ #include "LocalPlayer.h" #include "World.h" #include "playing.h" static float limitAngle(float a) { if (a < -M_PI) a += (float)(2.0 * M_PI); else if (a >= M_PI) a -= (float)(2.0 * M_PI); return a; } GuidedMissileStrategy::GuidedMissileStrategy(ShotPath* _path) : ShotStrategy(_path), renderTimes(0), needUpdate(true) { ptSceneNode = new BoltSceneNode(_path->getPosition(),_path->getVelocity(),false); TextureManager &tm = TextureManager::instance(); int texture = tm.getTextureID("missile"); if (texture >= 0) { ptSceneNode->setTexture(texture); ptSceneNode->setTextureAnimation(4, 4); ptSceneNode->setColor(1.0f, 0.2f, 0.0f); ptSceneNode->setTeamColor(Team::getRadarColor(_path->getTeam())); ptSceneNode->setFlares(true); } // get initial shot info FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_GMADLIFE); const float* vel = getPath().getVelocity(); const float d = 1.0f / hypotf(vel[0], hypotf(vel[1], vel[2])); float dir[3]; dir[0] = vel[0] * d; dir[1] = vel[1] * d; dir[2] = vel[2] * d; azimuth = limitAngle(atan2f(dir[1], dir[0])); elevation = limitAngle(atan2f(dir[2], hypotf(dir[1], dir[0]))); // initialize segments currentTime = getPath().getStartTime(); Ray ray = Ray(f.shot.pos, dir); ShotPathSegment segment(currentTime, currentTime, ray); segments.push_back(segment); segments.push_back(segment); segments.push_back(segment); segments.push_back(segment); // setup shot float shotSpeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED); f.shot.vel[0] = shotSpeed * dir[0]; f.shot.vel[1] = shotSpeed * dir[1]; f.shot.vel[2] = shotSpeed * dir[2]; // set next position to starting position nextPos[0] = f.shot.pos[0]; nextPos[1] = f.shot.pos[1]; nextPos[2] = f.shot.pos[2]; // check that first segment doesn't start inside a building float startPos[3]; float muzzleFront = BZDB.eval(StateDatabase::BZDB_MUZZLEFRONT); startPos[0] = f.shot.pos[0] - muzzleFront * dir[0]; startPos[1] = f.shot.pos[1] - muzzleFront * dir[1]; startPos[2] = f.shot.pos[2] - muzzleFront * dir[2]; Ray firstRay = Ray(startPos, dir); prevTime = currentTime; prevTime += -muzzleFront / BZDB.eval(StateDatabase::BZDB_SHOTSPEED); checkBuildings(firstRay); prevTime = currentTime; // no last target lastTarget = NoPlayer; lastPuff = currentTime; rootPuff = BZDB.eval("gmPuffTime"); puffTime = -1; if (RENDERER.useQuality() >= 3) rootPuff /= (10.0f + ((float)bzfrand()* 5.0f)); } GuidedMissileStrategy::~GuidedMissileStrategy() { delete ptSceneNode; } // NOTE -- ray is base of shot segment and normalized direction of flight. // distance traveled is ShotSpeed * dt. void GuidedMissileStrategy::update(float dt) { const bool isRemote = (getPath().getPlayer() != LocalPlayer::getMyTank()->getId()); // ignore packets that arrive out of order if (isRemote && dt < 0.0f) return; // update time prevTime = currentTime; currentTime += dt; // if shot life ran out then send notification and expire shot. // only local shots are expired. if (!isRemote && currentTime - getPath().getStartTime() >= getPath().getLifetime()) { /* NOTE -- comment out to not explode when shot expires */ addShotExplosion(nextPos); setExpiring(); return; } // get target const Player* target = NULL; if (isRemote) { if (lastTarget != NoPlayer) target = lookupPlayer(lastTarget); } else { LocalPlayer* myTank = LocalPlayer::getMyTank(); if (myTank) target = myTank->getTarget(); // see if the target changed if (target) { if (lastTarget != target->getId()) { needUpdate = true; lastTarget = target->getId(); } } else { if (lastTarget != NoPlayer) { needUpdate = true; lastTarget = NoPlayer; } } } if ((target != NULL) && ((target->getFlag() == Flags::Stealth) || ((target->getStatus() & short(PlayerState::Alive)) == 0))) { target = NULL; lastTarget = NoPlayer; needUpdate = true; } // compute next segment's ray if (target) { // turn towards target // find desired direction const float* targetPos = target->getPosition(); float desiredDir[3]; desiredDir[0] = targetPos[0] - nextPos[0]; desiredDir[1] = targetPos[1] - nextPos[1]; desiredDir[2] = targetPos[2] - nextPos[2]; desiredDir[2] += target->getMuzzleHeight(); // right between the eyes // compute desired angles float newAzimuth = atan2f(desiredDir[1], desiredDir[0]); float newElevation = atan2f(desiredDir[2], hypotf(desiredDir[1], desiredDir[0])); float gmissileAng = BZDB.eval(StateDatabase::BZDB_GMTURNANGLE); // compute new azimuth float deltaAzimuth = limitAngle(newAzimuth - azimuth); if (fabsf(deltaAzimuth) <= dt * gmissileAng) azimuth = limitAngle(newAzimuth); else if (deltaAzimuth > 0.0f) azimuth = limitAngle(azimuth + dt * gmissileAng); else azimuth = limitAngle(azimuth - dt * gmissileAng); // compute new elevation float deltaElevation = limitAngle(newElevation - elevation); if (fabsf(deltaElevation) <= dt * gmissileAng) elevation = limitAngle(newElevation); else if (deltaElevation > 0.0f) elevation = limitAngle(elevation + dt * gmissileAng); else elevation = limitAngle(elevation - dt * gmissileAng); } float newDirection[3]; newDirection[0] = cosf(azimuth) * cosf(elevation); newDirection[1] = sinf(azimuth) * cosf(elevation); newDirection[2] = sinf(elevation); Ray ray = Ray(nextPos, newDirection); renderTimes++; if (puffTime < 0 ) puffTime = (float)bzfrand()*rootPuff; // Changed: GM smoke trail, leave it every seconds, none of this per frame crap if (currentTime.getSeconds() - lastPuff.getSeconds() > puffTime ) { lastPuff = currentTime; addShotPuff(nextPos,azimuth,elevation); // pick a new time for the next puff so it's not so orderd. puffTime = (float)bzfrand()*rootPuff; } // get next position float shotSpeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED); ray.getPoint(dt * shotSpeed, nextPos); // see if we hit something TimeKeeper segmentEndTime(currentTime); /* if (!isRemote) */ { if (nextPos[2] <= 0.0f) { // hit ground -- expire it and shorten life of segment to time of impact setExpiring(); float t = ray.getOrigin()[2] / (ray.getOrigin()[2] - nextPos[2]); segmentEndTime = prevTime; segmentEndTime += t * (currentTime - prevTime); ray.getPoint(t / shotSpeed, nextPos); addShotExplosion(nextPos); } else { // see if we hit a building const float t = checkBuildings(ray); if (t >= 0.0f) { segmentEndTime = prevTime; segmentEndTime += t; } } } // throw out old segment and add new one ShotPathSegment nextSegment(prevTime, segmentEndTime, ray); segments.insert(segments.begin(), nextSegment); segments.pop_back(); // update shot newDirection[0] *= shotSpeed; newDirection[1] *= shotSpeed; newDirection[2] *= shotSpeed; setPosition(nextPos); setVelocity(newDirection); } float GuidedMissileStrategy::checkBuildings(const Ray& ray) { float shotSpeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED); float t = float((currentTime - prevTime) * shotSpeed); int face; const Obstacle* building = getFirstBuilding(ray, Epsilon, t); const Teleporter* teleporter = getFirstTeleporter(ray, Epsilon, t, face); // check in reverse order to see what we hit first if (teleporter) { // entered teleporter -- teleport it unsigned int seed = getPath().getShotId(); int source = World::getWorld()->getTeleporter(teleporter, face); int target = World::getWorld()->getTeleportTarget(source, seed); int outFace; const Teleporter* outTeleporter = World::getWorld()->getTeleporter(target, outFace); teleporter->getPointWRT(*outTeleporter, face, outFace, nextPos, NULL, azimuth, nextPos, NULL, &azimuth); return t / shotSpeed; } else if (building) { // expire on next update setExpiring(); float pos[3]; ray.getPoint(t / shotSpeed, pos); addShotExplosion(pos); return t / shotSpeed; } return -1.0f; } float GuidedMissileStrategy::checkHit(const BaseLocalPlayer* tank, float position[3]) const { float minTime = Infinity; if (getPath().isExpired()) return minTime; // GM is not active until activation time passes (for any tank) const float activationTime = BZDB.eval(StateDatabase::BZDB_GMACTIVATIONTIME); if ((TimeKeeper::getTick() - getPath().getStartTime()) < activationTime) { return minTime; } // get tank radius float radius = tank->getRadius(); const float radius2 = radius * radius; float shotRadius = BZDB.eval(StateDatabase::BZDB_SHOTRADIUS); // tank is positioned from it's bottom so shift position up by // half a tank height. const float tankHeight = tank->getDimensions()[2]; Ray tankLastMotionRaw = tank->getLastMotion(); float lastTankPositionRaw[3]; lastTankPositionRaw[0] = tankLastMotionRaw.getOrigin()[0]; lastTankPositionRaw[1] = tankLastMotionRaw.getOrigin()[1]; lastTankPositionRaw[2] = tankLastMotionRaw.getOrigin()[2] + 0.5f * tankHeight; Ray tankLastMotion(lastTankPositionRaw, tankLastMotionRaw.getDirection()); // check each segment const int numSegments = segments.size(); int i = 0; // only test most recent segment if shot is from my tank if (numSegments > 1 && tank->getId() == getPath().getPlayer()) i = numSegments - 1; for (; i < numSegments; i++) { const Ray& ray = segments[i].ray; // construct ray with correct velocity float speed[3]; const float* dir = ray.getDirection(); float shotSpeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED); speed[0] = shotSpeed * dir[0]; speed[1] = shotSpeed * dir[1]; speed[2] = shotSpeed * dir[2]; Ray speedRay(ray.getOrigin(), speed); // construct relative shot ray: origin and velocity relative to // my tank as a function of time (t=0 is start of the interval). Ray relativeRay(rayMinusRay(speedRay, 0.0, tankLastMotion, 0.0)); // get closest approach time float t; if (tank->getFlag() == Flags::Narrow) { // find closest approach to narrow box around tank. width of box // is shell radius so you can actually hit narrow tank head on. static float tankBase[3] = { 0.0f, 0.0f, -0.5f * tankHeight }; t = timeRayHitsBlock(relativeRay, tankBase, tank->getAngle(), 0.5f * BZDBCache::tankLength, shotRadius, tankHeight); } else { // find time when shot hits sphere around tank t = rayAtDistanceFromOrigin(relativeRay, 0.99f * radius); } if (t > minTime) continue; // if not in shot segment times then no hit if (t < 0.0f || t > segments[i].end - segments[i].start) continue; // check if shot hits tank -- get position at time t, see if in radius float closestPos[3]; relativeRay.getPoint(t, closestPos); if (closestPos[0] * closestPos[0] + closestPos[1] * closestPos[1] + closestPos[2] * closestPos[2] < radius2) { // save best time so far minTime = t; // compute location of tank at time of hit float tankPos[3]; tank->getLastMotion().getPoint(t, tankPos); // compute position of intersection position[0] = tankPos[0] + closestPos[0]; position[1] = tankPos[1] + closestPos[1]; position[2] = tankPos[2] + closestPos[2]; } } return minTime; } void GuidedMissileStrategy::sendUpdate(const FiringInfo& firingInfo) const { // only send an update when needed if (!needUpdate) return; ((GuidedMissileStrategy*)this)->needUpdate = false; // construct and send packet char packet[ShotUpdatePLen + PlayerIdPLen]; void *buf = (void*)packet; buf = firingInfo.shot.pack(buf); buf = nboPackUByte(buf, lastTarget); ServerLink::getServer()->send(MsgGMUpdate, sizeof(packet), packet); } void GuidedMissileStrategy::readUpdate(uint16_t code, void* msg) { // ignore non-guided missile messages (we shouldn't get them) if (code != MsgGMUpdate) return; // position and velocity have been replaced by the remote system's // concept of the position and velocity. this may cause a discontinuity // in the shot's position but it's probably better to have the shot in // the right place than to maintain smooth motion. these updates ought // to be rare anyway. // read the lastTarget nboUnpackUByte(msg, lastTarget); // fix up dependent variables const float* vel = getPath().getVelocity(); const float d = 1.0f / hypotf(vel[0], hypotf(vel[1], vel[2])); float dir[3]; dir[0] = vel[0] * d; dir[1] = vel[1] * d; dir[2] = vel[2] * d; azimuth = limitAngle(atan2f(dir[1], dir[0])); elevation = limitAngle(atan2f(dir[2], hypotf(dir[1], dir[0]))); const float* pos = getPath().getPosition(); nextPos[0] = pos[0]; nextPos[1] = pos[1]; nextPos[2] = pos[2]; // note that we do not call update(float). let that happen on the // next time step. } void GuidedMissileStrategy::addShot(SceneDatabase* scene, bool) { ptSceneNode->move(getPath().getPosition(), getPath().getVelocity()); scene->addDynamicNode(ptSceneNode); } void GuidedMissileStrategy::expire() { if (getPath().getPlayer() == LocalPlayer::getMyTank()->getId()) { const ShotPath& shot = getPath(); /* NOTE -- change 0 to 1 to not explode when shot expires (I think) */ ServerLink::getServer()->sendEndShot(shot.getPlayer(), shot.getShotId(), 0); } } void GuidedMissileStrategy::radarRender() const { const float *orig = getPath().getPosition(); const int length = (int)BZDBCache::linedRadarShots; const int size = (int)BZDBCache::sizedRadarShots; float shotTailLength = BZDB.eval(StateDatabase::BZDB_SHOTTAILLENGTH); // Display leading lines if (length > 0) { const float* vel = getPath().getVelocity(); const float d = 1.0f / hypotf(vel[0], hypotf(vel[1], vel[2])); float dir[3]; dir[0] = vel[0] * d * shotTailLength * length; dir[1] = vel[1] * d * shotTailLength * length; dir[2] = vel[2] * d * shotTailLength * length; glBegin(GL_LINES); glVertex2fv(orig); if (BZDB.eval("leadingShotLine") == 1) { //leading glVertex2f(orig[0] + dir[0], orig[1] + dir[1]); glEnd(); } else if (BZDB.eval("leadingShotLine") == 0) { //lagging glVertex2f(orig[0] - dir[0], orig[1] - dir[1]); glEnd(); } else if (BZDB.eval("leadingShotLine") == 2) { //both glVertex2f(orig[0] + dir[0], orig[1] + dir[1]); glEnd(); glBegin(GL_LINES); glVertex2fv(orig); glVertex2f(orig[0] - dir[0], orig[1] - dir[1]); glEnd(); } // draw a "bright reddish" missle tip if (size > 0) { glColor3f(1.0f, 0.75f, 0.75f); glPointSize((float)size); glBegin(GL_POINTS); glVertex2f(orig[0], orig[1]); glEnd(); glPointSize(1.0f); } } else { if (size > 0) { // draw a sized missle glPointSize((float)size); glBegin(GL_POINTS); glVertex2fv(orig); glEnd(); glPointSize(1.0f); } else { // draw the tiny missle glBegin(GL_POINTS); glVertex2fv(orig); glEnd(); } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/GuidedMissleStrategy.h000066400000000000000000000034201200563112200217440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __GUIDEDMISSLESTRATEGY_H__ #define __GUIDEDMISSLESTRATEGY_H__ /* interface header */ #include "ShotStrategy.h" /* system interface headers */ #include /* common interface headers */ #include "SceneDatabase.h" #include "TimeKeeper.h" #include "BoltSceneNode.h" /* local interface headers */ #include "BaseLocalPlayer.h" #include "ShotPathSegment.h" class GuidedMissileStrategy : public ShotStrategy { public: GuidedMissileStrategy(ShotPath*); ~GuidedMissileStrategy(); void update(float dt); float checkHit(const BaseLocalPlayer*, float[3]) const; void sendUpdate(const FiringInfo&) const; void readUpdate(uint16_t, void*); void addShot(SceneDatabase*, bool colorblind); void expire(); void radarRender() const; private: float checkBuildings(const Ray& ray); private: TimeKeeper prevTime; TimeKeeper currentTime; std::vector segments; int renderTimes; float azimuth; float elevation; float nextPos[3]; BoltSceneNode* ptSceneNode; float puffTime,rootPuff; TimeKeeper lastPuff; bool needUpdate; PlayerId lastTarget; }; #endif /* __GUIDEDMISSLESTRATEGY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDDialog.cxx000066400000000000000000000037111200563112200177610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "HUDDialog.h" // local interface headers #include "HUDuiControl.h" HUDDialog::HUDDialog() : focus(NULL) { height = width = 0; } HUDDialog::~HUDDialog() { // delete all controls left on list const int count = list.size(); for (int i = 0; i < count; i++) delete list[i]; } void HUDDialog::render() { const int count = list.size(); for (int i = 0; i < count; i++) list[i]->render(); } void HUDDialog::resize(int _width, int _height) { width = _width; height = _height; } HUDuiControl* HUDDialog::getFocus() const { return focus; } void HUDDialog::setFocus(HUDuiControl* _focus) { focus = _focus; } void HUDDialog::initNavigation(std::vector &listHUD, int start, int end) { int i; const int count = listHUD.size(); for (i = 0; i < start; i++) { listHUD[i]->setNext(listHUD[i]); listHUD[i]->setPrev(listHUD[i]); } if (start < end) { listHUD[start]->setNext(listHUD[start+1]); listHUD[start]->setPrev(listHUD[end]); for (i = start+1; i < end; i++) { listHUD[i]->setNext(listHUD[i+1]); listHUD[i]->setPrev(listHUD[i-1]); } listHUD[end]->setNext(listHUD[start]); listHUD[end]->setPrev(listHUD[end-1]); } for (i = end+1; i < count; i++) { listHUD[i]->setNext(listHUD[i]); listHUD[i]->setPrev(listHUD[i]); } setFocus(listHUD[start]); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDDialog.h000066400000000000000000000034221200563112200174050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __HUDDIALOG_H__ #define __HUDDIALOG_H__ /* common */ #include "common.h" #if defined(_MSC_VER) #pragma warning(disable: 4786) #endif /* system headers */ #include /* local interface headers */ class HUDuiControl; class HUDuiDefaultKey; /** * HUDDialog: * A dialog of HUDuiControls. */ class HUDDialog { public: HUDDialog(); virtual ~HUDDialog(); void render(); virtual HUDuiDefaultKey* getDefaultKey() = 0; virtual void show() { } virtual void execute() = 0; virtual void dismiss() { } virtual void resize(int _width, int _height); virtual void setFailedMessage(const char *) {;}; HUDuiControl* getFocus() const; void setFocus(HUDuiControl*); void initNavigation(std::vector &list, int start, int end); protected: const std::vector& getControls() const { return list; } std::vector& getControls() { return list; } int getHeight() const { return height; } int getWidth() const { return width; } protected: int height, width; private: std::vector list; HUDuiControl* focus; }; #endif /* __HUDDIALOG_H__ */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDDialogStack.cxx000066400000000000000000000055371200563112200207570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "HUDDialogStack.h" /* local implementation headers */ #include "playing.h" #include "HUDui.h" #include "HUDDialog.h" HUDDialogStack HUDDialogStack::globalStack; HUDDialogStack::HUDDialogStack() { // do nothing } HUDDialogStack::~HUDDialogStack() { if (getMainWindow()) getMainWindow()->getWindow()->removeResizeCallback(resize, this); } HUDDialogStack* HUDDialogStack::get() { return &globalStack; } bool HUDDialogStack::isActive() const { return !stack.empty(); } HUDDialog* HUDDialogStack::top() const { const int index = stack.size(); if (index == 0) return NULL; return stack[index - 1]; } void HUDDialogStack::push(HUDDialog* dialog) { if (!dialog) return; if (isActive()) { const int index = stack.size() - 1; stack[index]->setFocus(HUDui::getFocus()); stack[index]->dismiss(); } else { getMainWindow()->getWindow()->addResizeCallback(resize, this); } stack.push_back(dialog); HUDui::setDefaultKey(dialog->getDefaultKey()); HUDui::setFocus(dialog->getFocus()); dialog->resize(getMainWindow()->getWidth(), getMainWindow()->getHeight()); dialog->show(); } void HUDDialogStack::pop() { if (isActive()) { const int index = stack.size() - 1; stack[index]->setFocus(HUDui::getFocus()); stack[index]->dismiss(); std::vector::iterator it = stack.begin(); for (int i = 0; i < index; i++) ++it; stack.erase(it); if (index > 0) { HUDDialog* dialog = stack[index - 1]; HUDui::setDefaultKey(dialog->getDefaultKey()); HUDui::setFocus(dialog->getFocus()); dialog->resize(getMainWindow()->getWidth(), getMainWindow()->getHeight()); dialog->show(); } else { HUDui::setDefaultKey(NULL); HUDui::setFocus(NULL); getMainWindow()->getWindow()->removeResizeCallback(resize, this); } } } void HUDDialogStack::render() { if (isActive()) stack[stack.size() - 1]->render(); } void HUDDialogStack::resize(void* _self) { HUDDialogStack* self = (HUDDialogStack*)_self; if (self->isActive()) self->top()->resize(getMainWindow()->getWidth(), getMainWindow()->getHeight()); } void HUDDialogStack::setFailedMessage(const char *msg) { if (isActive()) stack[stack.size() - 1]->setFailedMessage(msg); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDDialogStack.h000066400000000000000000000023551200563112200203770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __HUDDIALOGSTACK_H__ #define __HUDDIALOGSTACK_H__ /* common header */ #include "common.h" /* system interface headers */ #include /* local interface headers */ class HUDDialog; /** general utility class for the HUDDialog */ class HUDDialogStack { public: static HUDDialogStack* get(); bool isActive() const; HUDDialog* top() const; void push(HUDDialog*); void pop(); void render(); void setFailedMessage(const char *msg); HUDDialogStack(); ~HUDDialogStack(); private: static void resize(void*); private: std::vector stack; static HUDDialogStack globalStack; }; #endif /* __HUDDIALOGSTACK_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDRenderer.cxx000066400000000000000000001640411200563112200203340ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "HUDRenderer.h" // system headers #include /* common implementation headers */ #include "BundleMgr.h" #include "Bundle.h" #include "FontManager.h" #include "BZDBCache.h" /* local implementation headers */ #include "LocalPlayer.h" #include "World.h" #include "HUDui.h" #include "Roaming.h" #include "playing.h" #include "TextUtils.h" // // HUDRenderer // // headingOffset: the number of degrees from the center of the heading // strip display to either side. altitudeOffset is similar. const float HUDRenderer::altitudeOffset = 20.0f; const GLfloat HUDRenderer::black[3] = { 0.0f, 0.0f, 0.0f }; std::string HUDRenderer::headingLabel[36]; std::string HUDRenderer::restartLabelFormat("Press %s to start"); std::string HUDRenderer::resumeLabel("Press Pause to resume"); std::string HUDRenderer::autoPilotLabel("AutoPilot on"); std::string HUDRenderer::cancelDestructLabel("Press Destruct to cancel"); std::string HUDRenderer::gameOverLabel("GAME OVER"); HUDRenderer::HUDRenderer(const BzfDisplay* _display, const SceneRenderer& renderer) : display(_display), window(renderer.getWindow()), firstRender(true), playing(false), roaming(false), dim(false), numPlayers(0), timeLeft(~0u), playerHasHighScore(false), teamHasHighScore(false), heading(0.0), altitude(0.0), altitudeTape(false), fps(-1.0), drawTime(-1.0), restartLabel(restartLabelFormat), showCompose(false), showCracks(true), dater(false), lastTimeChange((unsigned long)time(NULL)), triangleCount(0), radarTriangleCount(0) { if (BZDB.eval("timedate") == 0) //we just want the time dater = false; else if (BZDB.eval("timedate") == 1) //just the date dater = true; // initialize colors hudColor[0] = 1.0f; hudColor[1] = 0.625f; hudColor[2] = 0.125f; messageColor[0] = 1.0f; messageColor[1] = 1.0f; messageColor[2] = 1.0f; warningColor[0] = 1.0f; warningColor[1] = 0.0f; warningColor[2] = 0.0f; // make sure we're notified when MainWindow resizes window.getWindow()->addResizeCallback(resizeCallback, this); // initialize heading and altitude labels if (headingLabel[0].length() == 0) { char buf[10]; int i; for (i = 0; i < 36; i++) { sprintf(buf, "%d", i * 10); headingLabel[i] = std::string(buf); } } // initialize clocks globalClock.setClock(-1.0f, 0.8f, 0.4f); scoreClock.setClock(-1.0f, 0.5f, 0.2f); // create compose dialog composeTypeIn = new HUDuiTypeIn(); composeTypeIn->setLabel("Send:"); composeTypeIn->setMaxLength(MessageLen - 1); composeTypeIn->showFocus(false); // create scoreboard renderer scoreboard = new ScoreboardRenderer(); friendlyMarkerList = DisplayListSystem::Instance().newList(this); // initialize fonts resize(true); } HUDRenderer::~HUDRenderer() { // don't notify me anymore (cos you can't wake the dead!) window.getWindow()->removeResizeCallback(resizeCallback, this); // release ui controls delete composeTypeIn; } ScoreboardRenderer *HUDRenderer::getScoreboard () { return scoreboard; } void HUDRenderer::resizeCallback(void* self) { ((HUDRenderer*)self)->resize(false); } void HUDRenderer::resize(bool firstTime) { // get important metrics const int w = firstTime ? MinX : window.getWidth(); const int vh = firstTime ? MinY : window.getViewHeight(); // compute good targeting box sizes { const float xScale = (float)w / (float) MinX; const float yScale = (float)vh / (float) MinY; const float scale = (xScale < yScale) ? xScale : yScale; const float effScale = scale * ( 0.7f + RENDERER.getMaxMotionFactor() / 16.667f); maxMotionSize = (int)((float)MaxMotionSize * effScale); noMotionSize = (int)((float)NoMotionSize * effScale / 2.0f); headingOffset = 22.0f * (effScale > 1.0f ? 1.0f : effScale); } // initialize readout spacings headingMarkSpacing = 5.0f * float(maxMotionSize) / headingOffset; altitudeMarkSpacing = floorf(5.0f * float(maxMotionSize) / altitudeOffset); setBigFontSize(w, vh); setAlertFontSize(w, vh); setMajorFontSize(w, vh); setMinorFontSize(w, vh); setHeadingFontSize(w, vh); setComposeFontSize(w, vh); setLabelsFontSize(w, vh); // set scoreboard window size & location const float sby = window.getViewHeight() - majorFontHeight - alertFontHeight * 2.0f; scoreboard->setWindowSize (0.01f * window.getWidth(), sby, 0.98f * window.getWidth(), sby); } int HUDRenderer::getNoMotionSize() const { return noMotionSize; } int HUDRenderer::getMaxMotionSize() const { return maxMotionSize; } void HUDRenderer::setBigFontSize(int, int height) { const float s = (float)height / 22.0f; FontManager &fm = FontManager::instance(); bigFontFace = fm.getFaceID(BZDB.get("sansSerifFont")); bigFontSize = floorf(s); restartLabelWidth = fm.getStrLength(bigFontFace, bigFontSize, restartLabel); resumeLabelWidth = fm.getStrLength(bigFontFace, bigFontSize, resumeLabel); cancelDestructLabelWidth = fm.getStrLength(bigFontFace, bigFontSize, cancelDestructLabel); gameOverLabelWidth = fm.getStrLength(bigFontFace, bigFontSize, gameOverLabel); autoPilotWidth = fm.getStrLength(bigFontFace, bigFontSize, autoPilotLabel); } void HUDRenderer::setAlertFontSize(int, int height) { const float s = (float)height / 36.0f; FontManager &fm = FontManager::instance(); alertFontFace = fm.getFaceID(BZDB.get("sansSerifFont")); alertFontSize = floorf(s); alertFontHeight = fm.getStrHeight(alertFontFace, alertFontSize, " "); for (int i = 0; i < MaxAlerts; i++) if (alertClock[i].isOn()) alertLabelWidth[i] = fm.getStrLength(alertFontFace, alertFontSize, alertLabel[i]); } void HUDRenderer::setMajorFontSize(int, int height) { const float s = (float)height / 36.0f; FontManager &fm = FontManager::instance(); majorFontFace = fm.getFaceID(BZDB.get("serifFont")); majorFontSize = floorf(s); majorFontHeight = fm.getStrHeight(majorFontFace, majorFontSize, " "); } void HUDRenderer::setMinorFontSize(int, int height) { FontManager &fm = FontManager::instance(); minorFontFace = fm.getFaceID(BZDB.get("consoleFont")); switch (static_cast(BZDB.eval("scorefontsize"))) { case 0: { // auto const float s = (float)height / 72.0f; minorFontSize = floorf(s); break; } case 1: // tiny minorFontSize = 6; break; case 2: // small minorFontSize = 8; break; case 3: // medium minorFontSize = 12; break; case 4: // big minorFontSize = 16; break; } } void HUDRenderer::setHeadingFontSize(int, int height) { const float s = (float)height / 144.0f; FontManager &fm = FontManager::instance(); headingFontFace = fm.getFaceID(BZDB.get("sansSerifFont")); headingFontSize = floorf(s); // compute heading labels and (half) widths int i; for (i = 0; i < 36; i++) headingLabelWidth[i] = 0.5f * fm.getStrLength(headingFontFace, headingFontSize, headingLabel[i]); // compute maximum width over all altitude labels altitudeLabelMaxWidth = fm.getStrLength(headingFontFace, headingFontSize, "9999"); } void HUDRenderer::setComposeFontSize(int, int height) { const float s = (float)height / 72.0f; FontManager &fm = FontManager::instance(); composeFontFace = fm.getFaceID(BZDB.get("consoleFont")); composeTypeIn->setFontFace(composeFontFace); composeTypeIn->setFontSize(floorf(s)); } void HUDRenderer::setLabelsFontSize(int, int height) { const float s = (float)height / 96.0f; FontManager &fm = FontManager::instance(); labelsFontFace = fm.getFaceID(BZDB.get("consoleFont")); labelsFontSize = floorf(s); } void HUDRenderer::setColor(float r, float g, float b) { hudColor[0] = r; hudColor[1] = g; hudColor[2] = b; } void HUDRenderer::setPlaying(bool _playing) { playing = _playing; } void HUDRenderer::setRoaming(bool _roaming) { roaming = _roaming; } void HUDRenderer::setDim(bool _dim) { dim = _dim; scoreboard->setDim (_dim); } void HUDRenderer::setPlayerHasHighScore(bool hasHigh) { playerHasHighScore = hasHigh; } void HUDRenderer::setTeamHasHighScore(bool hasHigh) { teamHasHighScore = hasHigh; } void HUDRenderer::setHeading(float angle) { heading = (float)(90.0 - 180.0 * angle / M_PI); while (heading < 0.0f) heading += 360.0f; while (heading >= 360.0f) heading -= 360.0f; } void HUDRenderer::setAltitude(float _altitude) { altitude = _altitude; } void HUDRenderer::setAltitudeTape(bool on) { altitudeTape = on; } void HUDRenderer::setFPS(float _fps) { fps = _fps; } void HUDRenderer::setDrawTime(float drawTimeInseconds) { drawTime = drawTimeInseconds; } void HUDRenderer::setFrameTriangleCount(int tpf) { triangleCount = tpf; } void HUDRenderer::setFrameRadarTriangleCount(int rtpf) { radarTriangleCount = rtpf; } void HUDRenderer::setAlert(int index, const char* string, float duration, bool warning) { if (index < 0) index = 0; else if (index >= MaxAlerts) index = MaxAlerts - 1; if (!string) { alertClock[index].setClock(0.0f); } else { FontManager &fm = FontManager::instance(); alertLabel[index] = BundleMgr::getCurrentBundle()->getLocalString(string); alertLabelWidth[index] = fm.getStrLength(alertFontFace, alertFontSize, alertLabel[index]); alertColor[index] = warning ? warningColor : messageColor; alertClock[index].setClock(duration); } } bool HUDRenderer::getComposing() const { return showCompose; } std::string HUDRenderer::getComposeString() const { return composeTypeIn->getString(); } // Sets the string and allows editing by default void HUDRenderer::setComposeString(const std::string &message) const { composeTypeIn->setEditing(true); composeTypeIn->setString(message); } // Sets the string and allows you to edit if _allowEdit is true void HUDRenderer::setComposeString(const std::string &message, bool _allowEdit) const { composeTypeIn->setEditing(_allowEdit); composeTypeIn->setString(message); } // Set the prompt and allow editing by default void HUDRenderer::setComposing(const std::string &prompt) { this->setComposing(prompt, true); } // Set the prompt and allow editing or not depending on _allowEdit void HUDRenderer::setComposing(const std::string &prompt, bool _allowEdit) { showCompose = (prompt.length() != 0); if (showCompose) { composeTypeIn->setEditing(_allowEdit); composeTypeIn->setLabel(prompt); composeTypeIn->setString(""); composeTypeIn->setFocus(); int cFontFace = composeTypeIn->getFontFace(); float cFontSize = composeTypeIn->getFontSize(); if (cFontFace >= 0) { FontManager &fm = FontManager::instance(); const float x = fm.getStrLength(cFontFace, cFontSize, composeTypeIn->getLabel()) + fm.getStrLength(cFontFace, cFontSize, "99"); const float y = 1.0f; composeTypeIn->setLabelWidth(x); composeTypeIn->setPosition(x, y); // FIXME what is this supposed to do? composeTypeIn->setSize(window.getWidth() - x, fm.getStrHeight(cFontFace, cFontSize, " ") * 0); } } else { HUDui::setFocus(NULL); } } void HUDRenderer::setFlagHelp(FlagType* desc, float duration) { flagHelpClock.setClock(duration); // Generate the formatted help for this flag flagHelpText = makeHelpString(desc->flagHelp.c_str()); // count the number of lines in the help message flagHelpLines = 0; const int helpLength = flagHelpText.size(); const char* helpMsg = flagHelpText.c_str(); for (int i = 0; i < helpLength; i++) if (helpMsg[i] == '\0') flagHelpLines++; } void HUDRenderer::initCracks() { for (int i = 0; i < HUDNumCracks; i++) { const float d = 0.90f * float(maxMotionSize) * ((float)bzfrand() + 0.90f); const float a = (float)(2.0 * M_PI * (double(i) + bzfrand()) / double(HUDNumCracks)); cracks[i][0][0] = 0.0f; cracks[i][0][1] = 0.0f; cracks[i][1][0] = d * cosf(a); cracks[i][1][1] = d * sinf(a); makeCrack(cracks, i, 1, a); } } void HUDRenderer::setCracks(bool _showCracks) { if ((showCracks != _showCracks) && _showCracks) { initCracks(); crackStartTime = TimeKeeper::getTick(); } showCracks = _showCracks; } void HUDRenderer::addMarker(float _heading, const float *_color ) { markers.resize(markers.size() + 1); HUDMarker &m = markers[markers.size() - 1]; _heading = (float)(90.0 - 180.0 * _heading / M_PI); while (_heading < 0.0f) _heading += 360.0f; while (_heading >= 360.0f) _heading -= 360.0f; m.heading = _heading; memcpy(m.color, _color, sizeof(m.color)); } void HUDRenderer::AddEnhancedNamedMarker(const fvec3& pos, const fvec4& color, std::string name, bool friendly, float zShift) { return; EnhancedHUDMarker newMarker(pos, color); newMarker.pos.z += zShift; newMarker.name = name; newMarker.friendly = friendly; enhancedMarkers.push_back(newMarker); } void HUDRenderer::AddEnhancedMarker(const fvec3& pos, const fvec4& color, bool friendly, float zShift ) { EnhancedHUDMarker newMarker(pos, color); newMarker.pos.z += zShift; newMarker.friendly = friendly; enhancedMarkers.push_back(newMarker); } void HUDRenderer::AddLockOnMarker(const fvec3& pos, std::string name, bool friendly, float zShift ) { const fvec4 color(0.75f, 0.125f, 0.125f, 1.0f); EnhancedHUDMarker newMarker(pos, color); newMarker.pos.z += zShift; newMarker.name = name; newMarker.friendly = friendly; lockOnMarkers.push_back(newMarker); } void HUDRenderer::setRestartKeyLabel(const std::string& label) { char buffer[250]; sprintf(buffer, BundleMgr::getCurrentBundle()->getLocalString(restartLabelFormat).c_str(), label.c_str()); restartLabel = buffer; FontManager &fm = FontManager::instance(); restartLabelWidth = fm.getStrLength(bigFontFace, bigFontSize, restartLabel); } void HUDRenderer::setTimeLeft(uint32_t _timeLeft) { timeLeft = _timeLeft; timeSet = TimeKeeper::getTick(); } /* FIXME - makeHelpString should return an array of strings instead of * using implicit null chars. */ std::string HUDRenderer::makeHelpString(const char* help) const { if (!help) return std::string(); FontManager &fm = FontManager::instance(); static const float spaceWidth = fm.getStrLength(minorFontFace, minorFontSize, " "); // find sections of string not more than maxWidth pixels wide // and put them into a std::string separated by \0's. const float maxWidth = (float)window.getWidth() * 0.75f; std::string msg; std::string text = BundleMgr::getCurrentBundle()->getLocalString(help); char c; float wordWidth; std::string word = ""; float currentLineWidth = 0.0f; unsigned int position = 0; while (position < text.size()) { c = text[position]; // when we hit a space, append the previous word if (c == ' ') { if (word.size() == 0) { position++; continue; } wordWidth = fm.getStrLength(minorFontFace, minorFontSize, word); msg += c; if (wordWidth + currentLineWidth + spaceWidth < maxWidth) { currentLineWidth += wordWidth; } else { msg += '\0'; currentLineWidth = 0.0f; } msg.append(word); word.resize(0); } else { word += c; } position++; } if (word.size() > 0) { wordWidth = fm.getStrLength(minorFontFace, minorFontSize, word); if (wordWidth + currentLineWidth + spaceWidth >= maxWidth) { msg += '\0'; } msg += ' '; msg.append(word); } // append terminating null so line counts are correct msg += '\0'; return msg; } void HUDRenderer::makeCrack(float crackpattern[HUDNumCracks][(1 << HUDCrackLevels) + 1][2], int n, int l, float a) { if (l >= (1 << (HUDCrackLevels - 1))) return; float d = 0.5f * float(maxMotionSize) * ((float)bzfrand() + 0.5f) * powf(0.5f, 0.69f * logf(float(l))); float newAngle = (float)(a + M_PI * bzfrand() / double(HUDNumCracks)); crackpattern[n][2*l][0] = crackpattern[n][l][0] + d * cosf(newAngle); crackpattern[n][2*l][1] = crackpattern[n][l][1] + d * sinf(newAngle); makeCrack(crackpattern, n, 2*l, newAngle); d = 0.5f * float(maxMotionSize) * ((float)bzfrand() + 0.5f) * powf(0.5f, 0.69f * logf(float(l))); newAngle = (float)(a - M_PI * bzfrand() / double(HUDNumCracks)); crackpattern[n][2*l+1][0] = crackpattern[n][l][0] + d * cosf(newAngle); crackpattern[n][2*l+1][1] = crackpattern[n][l][1] + d * sinf(newAngle); makeCrack(crackpattern, n, 2*l+1, newAngle); } static const float dimFactor = 0.2f; void HUDRenderer::hudColor3f(GLfloat r, GLfloat g, GLfloat b) { if (dim) glColor3f(dimFactor * r, dimFactor * g, dimFactor * b); else glColor3f(r, g, b); } void HUDRenderer::hudColor4f( GLfloat r, GLfloat g, GLfloat b, GLfloat a) { if (dim) glColor4f(dimFactor * r, dimFactor * g, dimFactor * b, a); else glColor4f(r, g, b, a); } void HUDRenderer::hudColor3fv(const GLfloat* c) { if (dim) glColor3f(dimFactor * c[0], dimFactor * c[1], dimFactor * c[2]); else glColor3fv(c); } void HUDRenderer::hudColor3Afv(const float * c, const float a) { if( dim ) glColor4f( dimFactor *c[0], dimFactor *c[1], dimFactor *c[2], a ); else glColor4f( c[0],c[1],c[2],a ); } void HUDRenderer::hudSColor3fv(const GLfloat* c) { if (dim) glColor3f(dimFactor * c[0], dimFactor * c[1], dimFactor * c[2]); else glColor3fv(c); } void HUDRenderer::hudColor4fv(const GLfloat* c) { if (dim) glColor4f(dimFactor * c[0], dimFactor * c[1], dimFactor * c[2], c[3]); else glColor4fv(c); } void HUDRenderer::buildGeometry ( GLDisplayList displayList ) { if (displayList == friendlyMarkerList) { float lockonSize = 40; float segmentation = 32.0f/360.0f; float rad = lockonSize * 0.125f; // white outline hudColor4f( 1,1,1, 0.85f ); glLineWidth(4.0f); glBegin(GL_LINES); glVertex3f(-rad,rad+rad,0.03f); glVertex3f(rad,-rad+rad,0.02f); // glVertex3f(-lockonSize*xFactor,lockonSize,0.02f); // glVertex3f(lockonSize*xFactor,0,0.02f); glEnd(); glBegin(GL_LINE_LOOP); for (float t = 0; t < 360; t += segmentation) { if (t != 0) { const float s = (t - segmentation); const float tRads = t * DEG2RADf; const float sRads = s * DEG2RADf; glVertex3f(sinf(sRads) * rad, (cosf(sRads) * rad) + rad, 0.02f); glVertex3f(sinf(tRads) * rad, (cosf(tRads) * rad) + rad, 0.02f); } } glEnd(); // red X hudColor4f( 1,0,0, 0.85f ); glLineWidth(2.0f); glBegin(GL_LINES); glVertex3f(-rad,rad+rad,0.03f); glVertex3f(rad,-rad+rad,0.02f); // glVertex3f(-lockonSize*xFactor,lockonSize,0.03f); // glVertex3f(lockonSize*xFactor,0,0.02f); glEnd(); glBegin(GL_LINE_LOOP); for (float t = 0; t < 360; t += segmentation) { if (t != 0) { const float s = (t - segmentation); const float tRads = t * DEG2RADf; const float sRads = s * DEG2RADf; glVertex3f(sinf(sRads) * rad, (cosf(sRads) * rad) + rad, 0.02f); glVertex3f(sinf(tRads) * rad, (cosf(tRads) * rad) + rad, 0.02f); } } glEnd(); glLineWidth(2.0f); } } void HUDRenderer::render(SceneRenderer& renderer) { if (firstRender) { firstRender = false; resize(false); } OpenGLGState::resetState(); if (!BZDB.isTrue("noGUI")) { if (playing) { renderPlaying(renderer); } else if (roaming) { renderRoaming(renderer); } else { renderNotPlaying(renderer); } } else { const bool showTimes = (fps > 0.0f) || (drawTime > 0.0f) || (triangleCount > 0) || (radarTriangleCount > 0); const bool showTankLabels = roaming && BZDB.isTrue("displayLabels"); if (showCompose || showTimes || showTankLabels) { // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); // use one-to-one pixel projection glScissor(ox, oy + height - viewHeight, width, viewHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, viewHeight - height, viewHeight, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if (showCompose) { renderCompose(renderer); } if (showTimes) { renderTimes(); } if (showTankLabels) { renderTankLabels(renderer); } glPopMatrix(); } } } void HUDRenderer::renderAlerts(void) { const float centerx = 0.5f * (float)window.getWidth(); FontManager &fm = FontManager::instance(); float y = (float)window.getViewHeight() + -fm.getStrHeight(majorFontFace, majorFontSize, " ") + -fm.getStrHeight(alertFontFace, alertFontSize, " "); for (int i = 0; i < MaxAlerts; i++) { if (alertClock[i].isOn()) { hudColor3fv(alertColor[i]); std::string newAlertLabel = (dim ? ColorStrings[DimColor] : "") + alertLabel[i]; // FIXME: this assumes that there's not more than one reset in the string. if (dim) { newAlertLabel.insert(newAlertLabel.find(ColorStrings[ResetColor], 0) - 1 + ColorStrings[ResetColor].size(), ColorStrings[DimColor]); } fm.drawString(centerx - 0.5f * alertLabelWidth[i], y, 0, alertFontFace, alertFontSize, newAlertLabel); y -= fm.getStrHeight(alertFontFace, alertFontSize, " "); } } } void HUDRenderer::renderStatus(void) { LocalPlayer* myTank = LocalPlayer::getMyTank(); if (!myTank || !World::getWorld()) return; Bundle *bdl = BundleMgr::getCurrentBundle(); FontManager &fm = FontManager::instance(); char buffer[80]; const float h = fm.getStrHeight(majorFontFace, majorFontSize, " "); float x = 0.25f * h; float y = (float)window.getViewHeight() - h; TeamColor teamIndex = myTank->getTeam(); FlagType* flag = myTank->getFlag(); // print player name and score in upper left corner in team (radar) color if (!roaming && (!playerHasHighScore || scoreClock.isOn())) { sprintf(buffer, "%s: %d", myTank->getCallSign(), myTank->getScore()); hudColor3fv(Team::getRadarColor(teamIndex)); fm.drawString(x, y, 0, majorFontFace, majorFontSize, buffer); } // print flag if player has one in upper right if (flag != Flags::Null) { sprintf(buffer, "%s", BundleMgr::getCurrentBundle()->getLocalString(flag->flagName).c_str()); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(majorFontFace, majorFontSize, buffer); if (flag->endurance == FlagSticky) hudColor3fv(warningColor); else hudColor3fv(messageColor); fm.drawString(x, y, 0, majorFontFace, majorFontSize, buffer); } else { time_t timeNow; struct tm userTime; time(&timeNow); userTime = *localtime(&timeNow); // switch date and time if necessary if (BZDB.eval("timedate") == 2) { if (time(NULL) - lastTimeChange >= 2) { dater = !dater; lastTimeChange = (unsigned int)time(NULL); } } else { dater = (BZDB.eval("timedate") == 1); } // print time or date if (dater) sprintf(buffer, "%4d.%02d.%02d", 1900 + userTime.tm_year, userTime.tm_mon + 1, userTime.tm_mday); else sprintf(buffer, "%2d:%2.2d", userTime.tm_hour, userTime.tm_min); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(majorFontFace, majorFontSize, buffer); hudColor3fv(messageColor); fm.drawString(x, y, 0, majorFontFace, majorFontSize, buffer); } // print current position of tank if (BZDB.isTrue("showCoordinates")) { Player *target = ROAM.getTargetTank(); if(!target){ sprintf(buffer, "[%d %d %d]", (int)myTank->getPosition()[0], (int)myTank->getPosition()[1], (int)myTank->getPosition()[2]); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(majorFontFace, majorFontSize, buffer); fm.drawString(x, (y - h), 0, majorFontFace, majorFontSize, buffer); } } if (roaming && BZDB.isTrue("showVelocities")) { Player *target = ROAM.getTargetTank(); if (target) { float vel[3] = {0}; memcpy(vel,target->getVelocity(),sizeof(float)*3); float apparentVel[3] = {0}; memcpy(apparentVel,target->getApparentVelocity(),sizeof(float)*3); float linSpeed = sqrt(vel[0]*vel[0]+vel[1]*vel[1]); float vertSpeed = vel[2]; float rotSpeed = fabs(target->getAngularVelocity()); float apparentLinSpeed = sqrt(apparentVel[0]*apparentVel[0]+apparentVel[1]*apparentVel[1]); // calc maximum apparent velocity value for each 0.5s interval static float maxApparentLinSpeed = 0.0f; static TimeKeeper maxApparentLinTime = TimeKeeper::getStartTime(); if (maxApparentLinSpeed > apparentLinSpeed && TimeKeeper::getTick() - maxApparentLinTime < 0.5f) { apparentLinSpeed = maxApparentLinSpeed; } else { maxApparentLinSpeed = apparentLinSpeed; maxApparentLinTime = TimeKeeper::getTick(); } float smallZHeight = fm.getStrHeight(minorFontFace,minorFontSize,std::string("X"))*1.125f; float drawY = y - smallZHeight; // draw header x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize, "Target Info"); fm.drawString(x, drawY, 0, minorFontFace, minorFontSize, "Target Info"); // draw the postion sprintf(buffer, "Position [%d %d %d]", (int)myTank->getPosition()[0], (int)myTank->getPosition()[1], (int)myTank->getPosition()[2]); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x,drawY-smallZHeight, 0, minorFontFace, minorFontSize, buffer); std::string label = "Linear Speed:"; if ( linSpeed > target->getMaxSpeed() ) label += "!"; sprintf(buffer,"%s%5.2f",label.c_str(),linSpeed); if (BZDB.evalInt("showVelocities") > 1) sprintf(buffer,"%s%5.2f(%5.2f)",label.c_str(),linSpeed,apparentLinSpeed); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x,drawY-smallZHeight*2.0f, 0, minorFontFace, minorFontSize, buffer); sprintf(buffer,"Vertical Speed:%5.2f",vertSpeed); if (BZDB.evalInt("showVelocities") > 1) sprintf(buffer,"Vertical Speed:%5.2f(%5.2f)",vertSpeed,apparentVel[2]); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x, drawY-smallZHeight*3.0f, 0, minorFontFace, minorFontSize, buffer); label = "Angular Speed:"; if (rotSpeed > BZDB.eval(StateDatabase::BZDB_TANKANGVEL)) label += "!"; sprintf(buffer,"%s%5.2f",label.c_str(),rotSpeed); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x,drawY-smallZHeight*4.0f, 0, minorFontFace, minorFontSize, buffer); float shotTime = (float)target->getShotStatistics()->getLastShotTimeDelta(); float shotDeviation = (float)target->getShotStatistics()->getLastShotDeviation(); sprintf(buffer,"Last Shot Info Time:%6.4f Deviation:%6.3f", shotTime, shotDeviation); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x,drawY-smallZHeight*5.0f, 0, minorFontFace, minorFontSize, buffer); float offset = 6.0f; if (BZDB.evalInt("showVelocities") > 2) { offset += 1.0f; sprintf(buffer,"ReportedHits %d ComputedHits %d ratio %f", target->reportedHits, target->computedHits,(float)target->reportedHits/(float)target->computedHits); x = (float)window.getWidth() - 0.25f * h - fm.getStrLength(minorFontFace, minorFontSize,buffer); fm.drawString(x,drawY-smallZHeight*offset, 0, minorFontFace, minorFontSize, buffer); } offset += 1.5f; scoreboard->setTeamScoreY(drawY - smallZHeight*offset); } else scoreboard->setTeamScoreY(0); } else scoreboard->setTeamScoreY(0); // print status top-center static const GLfloat redColor[3] = { 1.0f, 0.0f, 0.0f }; static const GLfloat yellowColor[3] = { 1.0f, 1.0f, 0.0f }; static const GLfloat greenColor[3] = { 0.0f, 1.0f, 0.0f }; const GLfloat* statusColor = warningColor; // TODO: the upper 4 values of timeLeft (~0u-3 to ~0u) // are reserved for future use as timer flags (e.g. paused) if ((timeLeft == 0) || (timeLeft >= (~0u - 3))) { strcpy(buffer, ""); } else { int t = timeLeft - (int)(TimeKeeper::getTick() - timeSet); if (t < 0) t = 0; if (t >= 3600) sprintf(buffer, "%d:%02d:%02d ", t / 3600, (t / 60) % 60, t % 60); else if (t >= 60) sprintf(buffer, "%d:%02d ", t / 60, t % 60); else sprintf(buffer, "0:%02d ", t); } if (!roaming) { switch (myTank->getFiringStatus()) { case LocalPlayer::Deceased: strcat(buffer, bdl->getLocalString("Dead").c_str()); break; case LocalPlayer::Ready: if (flag != Flags::Null && flag->endurance == FlagSticky && World::getWorld()->allowShakeTimeout()) { /* have a bad flag -- show time left 'til we shake it */ statusColor = yellowColor; sprintf(buffer, bdl->getLocalString("%.1f").c_str(), myTank->getFlagShakingTime()); } else { statusColor = greenColor; strcat(buffer, bdl->getLocalString("Ready").c_str()); } break; case LocalPlayer::Loading: if (World::getWorld()->getMaxShots() != 0) { statusColor = redColor; sprintf(buffer, bdl->getLocalString("Reloaded in %.1f").c_str(), myTank->getReloadTime()); } break; case LocalPlayer::Sealed: strcat(buffer, bdl->getLocalString("Sealed").c_str()); break; case LocalPlayer::Zoned: strcat(buffer, bdl->getLocalString("Zoned").c_str()); break; } } if (roaming) { statusColor = messageColor; if (dim) strcat(buffer, ColorStrings[DimColor].c_str()); strcat(buffer, ROAM.getRoamingLabel().c_str()); } x = 0.5f * ((float)window.getWidth() - fm.getStrLength(majorFontFace, majorFontSize, buffer)); hudColor3fv(statusColor); fm.drawString(x, y, 0, majorFontFace, majorFontSize, buffer); } void HUDRenderer::renderTankLabels(SceneRenderer& renderer) { if (!World::getWorld()) return; int offset = window.getViewHeight() - window.getHeight(); GLint view[] = {window.getOriginX(), window.getOriginY(), window.getWidth(), window.getHeight()}; const GLfloat *projf = renderer.getViewFrustum().getProjectionMatrix(); const GLfloat *modelf = renderer.getViewFrustum().getViewMatrix(); // convert to doubles GLdouble proj[16], model[16]; for (int j = 0; j < 16; j++) { proj[j] = projf[j]; model[j] = modelf[j]; } for (int i = 0; i < curMaxPlayers; i++) { RemotePlayer *pl = World::getWorld()->getPlayer(i); if (pl && pl->isAlive()) { const char *name = pl->getCallSign(); double x, y, z; hudSColor3fv(Team::getRadarColor(pl->getTeam())); gluProject(pl->getPosition()[0], pl->getPosition()[1], pl->getPosition()[2]/*+BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT)*3.0f*/, model, proj, view, &x, &y, &z); if (z >= 0.0 && z <= 1.0) { FontManager &fm = FontManager::instance(); fm.drawString(float(x) - fm.getStrLength(labelsFontFace, labelsFontSize, name) / 2.0f, float(y) + offset - fm.getStrHeight(labelsFontFace, labelsFontSize, name), 0, labelsFontFace, labelsFontSize, name); FlagType* flag = pl->getFlag(); if (flag != Flags::Null) { std::string flagStr = "("; flagStr += flag->endurance == FlagNormal ? flag->flagName : flag->flagAbbv; flagStr += ")"; const char *fname = flagStr.c_str(); fm.drawString(float(x) - fm.getStrLength(labelsFontFace, labelsFontSize, fname) / 2.0f, float(y) + offset - (2.0f * fm.getStrHeight(labelsFontFace, labelsFontSize, fname)), 0, labelsFontFace, labelsFontSize, fname); } if (roaming && BZDB.isTrue("showVelocities")) { float vel[3] = {0}; memcpy(vel,pl->getVelocity(),sizeof(float)*3); std::string speedStr = TextUtils::format("[%5.2f]",sqrt(vel[0]*vel[0]+vel[1]*vel[1])); fm.drawString(float(x) - fm.getStrLength(labelsFontFace, labelsFontSize, speedStr.c_str()) / 2.0f, float(y) + offset - (3.0f * fm.getStrHeight(labelsFontFace, labelsFontSize, speedStr.c_str())), 0, labelsFontFace, labelsFontSize, speedStr.c_str()); } } } } } void HUDRenderer::renderCracks() { double delta = (TimeKeeper::getTick() - crackStartTime) * 5.0; if (delta > 1.0) delta = 1.0; int maxLevels = (int) (HUDCrackLevels * delta); glPushMatrix(); glTranslatef(GLfloat(window.getWidth() >> 1), GLfloat(window.getViewHeight() >> 1), 0.0f); glLineWidth(3.0); hudColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_LINES); for (int i = 0; i < HUDNumCracks; i++) { glVertex2fv(cracks[i][0]); glVertex2fv(cracks[i][1]); for (int j = 0; j < maxLevels-1; j++) { const int num = 1 << j; for (int k = 0; k < num; k++) { glVertex2fv(cracks[i][num + k]); glVertex2fv(cracks[i][2 * (num + k)]); glVertex2fv(cracks[i][num + k]); glVertex2fv(cracks[i][2 * (num + k) + 1]); } } } glEnd(); glLineWidth(1.0); glPopMatrix(); } void HUDRenderer::renderCompose(SceneRenderer&) { composeTypeIn->render(); OpenGLGState::resetState(); } void HUDRenderer::renderTimes(void) { const int centerx = window.getWidth() >> 1; const int centery = window.getViewHeight() >> 1; FontManager &fm = FontManager::instance(); // draw frames per second if (fps > 0.0f) { char buf[20]; sprintf(buf, "FPS: %d", int(fps)); hudColor3f(1.0f, 1.0f, 1.0f); fm.drawString((float)(centerx - maxMotionSize), (float)centery + (float)maxMotionSize + 3.0f * fm.getStrHeight(headingFontFace, headingFontSize, "0"), 0, headingFontFace, headingFontSize, buf); } float triCountYOffset = 4.5f; if (radarTriangleCount > 0) { char buf[20]; sprintf(buf, "rtris: %i", radarTriangleCount); hudColor3f(1.0f, 1.0f, 1.0f); fm.drawString((float)(centerx - maxMotionSize), (float)centery + (float)maxMotionSize + triCountYOffset * fm.getStrHeight(headingFontFace, headingFontSize, "0"), 0, headingFontFace, headingFontSize, buf); triCountYOffset += 1.5f; } if (triangleCount > 0) { char buf[20]; sprintf(buf, "tris: %i", triangleCount); hudColor3f(1.0f, 1.0f, 1.0f); fm.drawString((float)(centerx - maxMotionSize), (float)centery + (float)maxMotionSize + triCountYOffset * fm.getStrHeight(headingFontFace, headingFontSize, "0"), 0, headingFontFace, headingFontSize, buf); } if (drawTime > 0.0f) { char buf[20]; sprintf(buf, "time: %dms", (int)(drawTime * 1000.0f)); hudColor3f(1.0f, 1.0f, 1.0f); fm.drawString((float)(centerx + maxMotionSize) - fm.getStrLength(headingFontFace, headingFontSize, buf), (float)centery + (float)maxMotionSize + 3.0f * fm.getStrHeight(headingFontFace, headingFontSize, "0"), 0, headingFontFace, headingFontSize, buf); } } void HUDRenderer::saveMatrixes(const float *mm, const float *pm ) { // ssave off the stuff before we reset it for(int i = 0; i < 16; i++) { modelMatrix[i] = mm[i]; projMatrix[i] = pm[i]; } glGetIntegerv(GL_VIEWPORT,(GLint*)viewport); } void HUDRenderer::drawWaypointMarker(float* color, float alpha, float* object, const float* viewPos, std::string name, bool friendly) { double map[3] = {0,0,0}; double o[3]; o[0] = object[0]; o[1] = object[1]; o[2] = object[2]; hudColor3Afv( color, alpha ); glPushMatrix(); gluProject(o[0], o[1], o[2], modelMatrix, projMatrix, (GLint*)viewport, &map[0], &map[1], &map[2]); glPopMatrix(); float halfWidth = window.getWidth( )* 0.5f; float halfHeight = window.getHeight() * 0.5f; // comp us back to the view map[0] -= halfWidth; map[1] -= halfHeight; const fvec2 headingVec(sinf(heading * DEG2RADf), cosf(heading * DEG2RADf)); const fvec2 toPosVec((float)object[0] - viewPos[0], (float)object[1] - viewPos[1]); if (fvec2::dot(toPosVec, headingVec) <= 1.0f /*0.866f*/) { if (NEAR_ZERO(map[0], ZERO_TOLERANCE)) { map[0] = -halfWidth; map[1] = 0; } else { map[0] = -halfWidth * (fabs(map[0])/map[0]); map[1] = 0; } } else { if (map[0] < -halfWidth) map[0] = -halfWidth; if (map[0] > halfWidth) map[0] = halfWidth; if (map[1] < -halfHeight) map[1] = -halfHeight; if (map[1] > halfHeight) map[1] = halfHeight; } glPushMatrix(); glTranslatef((float)map[0],(float)map[1],0); glPushMatrix(); float triangleSize = BZDB.eval("hudWayPMarkerSize"); if (name.size()) triangleSize *= 0.75f; if (map[0] == halfWidth && map[1] != -halfHeight && map[1] != halfHeight) // right side glRotatef(90,0,0,1); if (map[0] == -halfWidth && map[1] != -halfHeight && map[1] != halfHeight) // Left side glRotatef(-90,0,0,1); if (map[1] == halfHeight && map[0] != -halfWidth && map[0] != halfWidth) // Top side glRotatef(180,0,0,1); if (map[0] == halfWidth && map[1] == -halfHeight) // Lower right glRotatef(45,0,0,1); if (map[0] == -halfWidth && map[1] == -halfHeight) // Lower left glRotatef(-45,0,0,1); if (map[0] == halfWidth && map[1] == halfHeight) // upper right glRotatef(180-45,0,0,1); if (map[0] == -halfWidth && map[1] == halfHeight) // upper left glRotatef(180+45,0,0,1); glBegin(GL_TRIANGLES); glVertex2f(0,0); glVertex2f(triangleSize,triangleSize); glVertex2f(-triangleSize,triangleSize); glEnd(); glBegin(GL_LINE_STRIP); glVertex3f(0,0,0.01f); glVertex3f(triangleSize,triangleSize,0.01f); glVertex3f(-triangleSize,triangleSize,0.01f); glEnd(); if (friendly) DisplayListSystem::Instance().callList(friendlyMarkerList); glPopMatrix(); if (name.size()) { hudColor3Afv( color, alpha ); float textOffset = 5.0f; float width = FontManager::instance().getStrLength(headingFontFace, headingFontSize, name); glEnable(GL_TEXTURE_2D); FontManager::instance().drawString(-width * 0.5f , textOffset + triangleSize, 0, headingFontFace, headingFontSize, name); glDisable(GL_TEXTURE_2D); } glPopMatrix(); } //------------------------------------------------------------------------- // HUDRenderer::drawLockonMarker //------------------------------------------------------------------------- void HUDRenderer::drawLockonMarker(float* color ,float alpha, float* object, const float *viewPos, std::string name, bool friendly ) { double map[3] = {0,0,0}; double o[3]; o[0] = object[0]; o[1] = object[1]; o[2] = object[2]; hudColor3Afv( color, alpha ); glPushMatrix(); gluProject(o[0], o[1], o[2], modelMatrix,projMatrix, (GLint*)viewport, &map[0], &map[1], &map[2]); glPopMatrix(); float halfWidth = window.getWidth( )* 0.5f; float halfHeight = window.getHeight() * 0.5f; // comp us back to the view map[0] -= halfWidth; map[1] -= halfHeight; const fvec2 headingVec(sinf(heading * DEG2RADf), cosf(heading * DEG2RADf)); const fvec2 toPosVec((float)object[0] - viewPos[0], (float)object[1] - viewPos[1]); if (fvec2::dot(toPosVec, headingVec) <= 1.0f) { if (NEAR_ZERO(map[0], ZERO_TOLERANCE)) { map[0] = -halfWidth; map[1] = 0; } else { map[0] = -halfWidth * (fabs(map[0])/map[0]); map[1] = 0; } } else { if ( map[0] < -halfWidth ) map[0] = -halfWidth; if ( map[0] > halfWidth ) map[0] = halfWidth; if ( map[1] < -halfHeight ) map[1] = -halfHeight; if ( map[1] > halfHeight ) map[1] = halfHeight; } glPushMatrix(); glTranslatef((float)map[0],(float)map[1],0); glPushMatrix(); float lockonSize = 40; float lockonInset = 15; float lockonDeclination = 15; glLineWidth(3.0f); glBegin(GL_LINE_STRIP); glVertex2f(-lockonInset,lockonSize-lockonDeclination); glVertex2f(-lockonSize,lockonSize); glVertex2f(-lockonSize,-lockonSize); glVertex2f(-lockonInset,-lockonSize+lockonDeclination); glEnd(); glBegin(GL_LINE_STRIP); glVertex2f(lockonInset,lockonSize-lockonDeclination); glVertex2f(lockonSize,lockonSize); glVertex2f(lockonSize,-lockonSize); glVertex2f(lockonInset,-lockonSize+lockonDeclination); glEnd(); if (friendly) DisplayListSystem::Instance().callList(friendlyMarkerList); glLineWidth(1.0f); glPopMatrix(); if (name.size()) { hudColor3Afv( color, alpha ); float textOffset = 5.0f; float width = FontManager::instance().getStrLength(headingFontFace, headingFontSize, name); glEnable(GL_TEXTURE_2D); FontManager::instance().drawString(-width * 0.5f, textOffset + lockonSize, 0, headingFontFace, headingFontSize, name); glDisable(GL_TEXTURE_2D); } glPopMatrix(); } void HUDRenderer::renderBox(SceneRenderer&) { // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); const int centerx = width >> 1; const int centery = viewHeight >> 1; int i; float x, y; FontManager &fm = FontManager::instance(); OpenGLGState::resetState(); const bool smooth = BZDBCache::smooth; // draw targeting box hudColor3fv(hudColor); glBegin(GL_LINE_LOOP); { glVertex2i(centerx - noMotionSize, centery - noMotionSize); glVertex2i(centerx + noMotionSize, centery - noMotionSize); glVertex2i(centerx + noMotionSize, centery + noMotionSize); glVertex2i(centerx - noMotionSize, centery + noMotionSize); } glEnd(); if (0){ glBegin(GL_POINTS); { glVertex2i(centerx - noMotionSize, centery - noMotionSize); glVertex2i(centerx + noMotionSize, centery - noMotionSize); glVertex2i(centerx + noMotionSize, centery + noMotionSize); glVertex2i(centerx - noMotionSize, centery + noMotionSize); } glEnd(); } glBegin(GL_LINE_LOOP); { glVertex2i(centerx - maxMotionSize, centery - maxMotionSize); glVertex2i(centerx + maxMotionSize, centery - maxMotionSize); glVertex2i(centerx + maxMotionSize, centery + maxMotionSize); glVertex2i(centerx - maxMotionSize, centery + maxMotionSize); } glEnd(); if (0){ glBegin(GL_POINTS); { glVertex2i(centerx - maxMotionSize, centery - maxMotionSize); glVertex2i(centerx + maxMotionSize, centery - maxMotionSize); glVertex2i(centerx + maxMotionSize, centery + maxMotionSize); glVertex2i(centerx - maxMotionSize, centery + maxMotionSize); } glEnd(); } // draw heading strip if (true /* always draw heading strip */) { // first clip to area glScissor(ox + centerx - maxMotionSize, oy + height - viewHeight + centery + maxMotionSize - 5, 2 * maxMotionSize, 25 + (int)(headingFontSize + 0.5f)); // draw heading mark glBegin(GL_LINES); glVertex2i(centerx, centery + maxMotionSize); glVertex2i(centerx, centery + maxMotionSize - 5); glEnd(); // figure out which marker is closest to center int baseMark = int(heading) / 10; // get minimum and maximum visible marks (leave some leeway) int minMark = baseMark - int(headingOffset / 10.0f) - 1; int maxMark = baseMark + int(headingOffset / 10.0f) + 1; // draw tick marks glPushMatrix(); if (smooth) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); } GLfloat basex = maxMotionSize * (heading - 10.0f * float(minMark)) / headingOffset; if (!smooth) basex = floorf(basex); glTranslatef((float)centerx - basex, (float)(centery + maxMotionSize), 0.0f); x = smooth ? 0.0f : -0.5f; glBegin(GL_LINES); for (i = minMark; i <= maxMark; i++) { glVertex2i((int)x, 0); glVertex2i((int)x, 8); x += headingMarkSpacing; glVertex2i((int)x, 0); glVertex2i((int)x, 4); x += headingMarkSpacing; } glEnd(); // back to our regular rendering mode if (smooth) { glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } glPopMatrix(); bool smoothLabel = smooth; x = (float)centerx - basex; y = 7.0f + (float)(centery + maxMotionSize); if (smoothLabel) { x -= 0.5f; hudColor4f(hudColor[0], hudColor[1], hudColor[2], basex - floorf(basex)); } for (i = minMark; i <= maxMark; i++) { fm.drawString(x - headingLabelWidth[(i + 36) % 36], y, 0, headingFontFace, headingFontSize, headingLabel[(i + 36) % 36]); x += 2.0f * headingMarkSpacing; } if (smoothLabel) { x = (float)centerx - basex + 0.5f; basex -= floorf(basex); hudColor4f(hudColor[0], hudColor[1], hudColor[2], 1.0f - basex); for (i = minMark; i <= maxMark; i++) { fm.drawString(x - headingLabelWidth[(i + 36) % 36], y, 0, headingFontFace, headingFontSize, headingLabel[(i + 36) % 36]); x += 2.0f * headingMarkSpacing; } } OpenGLGState::resetState(); // draw markers (give 'em a little more space on the sides) glScissor(ox + centerx - maxMotionSize - 8, oy + height - viewHeight + centery + maxMotionSize, 2 * maxMotionSize + 16, 10); glPushMatrix(); glTranslatef((float)centerx, (float)(centery + maxMotionSize), 0.0f); for (MarkerList::const_iterator it = markers.begin(); it != markers.end(); ++it) { const HUDMarker &m = *it; const float relAngle = fmodf(360.0f + m.heading - heading, 360.0f); hudColor3fv(m.color); if (relAngle <= headingOffset || relAngle >= 360.0f - headingOffset) { // on the visible part of tape GLfloat mx = maxMotionSize / headingOffset * ((relAngle < 180.0f) ? relAngle : relAngle - 360.0f); glBegin(GL_QUADS); glVertex2f(mx, 0.0f); glVertex2f(mx + 4.0f, 4.0f); glVertex2f(mx, 8.0f); glVertex2f(mx - 4.0f, 4.0f); glEnd(); } else if (relAngle <= 180.0) { // off to the right glBegin(GL_TRIANGLES); glVertex2f((float)maxMotionSize, 0.0f); glVertex2f((float)maxMotionSize + 4.0f, 4.0f); glVertex2f((float)maxMotionSize, 8.0f); glEnd(); } else { // off to the left glBegin(GL_TRIANGLES); glVertex2f(-(float)maxMotionSize, 0.0f); glVertex2f(-(float)maxMotionSize, 8.0f); glVertex2f(-(float)maxMotionSize - 4.0f, 4.0f); glEnd(); } } markers.clear(); glPopMatrix(); } // draw altitude strip if (altitudeTape) { // clip to area glScissor(ox + centerx + maxMotionSize - 5, oy + height - viewHeight + centery - maxMotionSize, (int)altitudeLabelMaxWidth + 15, 2 * maxMotionSize); // draw altitude mark hudColor3fv(hudColor); glBegin(GL_LINES); glVertex2i(centerx + maxMotionSize, centery); glVertex2i(centerx + maxMotionSize - 5, centery); glEnd(); // figure out which marker is closest to center int baseMark = int(altitude) / 5; // get minimum and maximum visible marks (leave some leeway) int minMark = baseMark - int(altitudeOffset / 5.0f) - 1; if (minMark < 0) minMark = 0; int maxMark = baseMark + int(altitudeOffset / 5.0f) + 1; // draw tick marks glPushMatrix(); if (smooth) { glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); } // NOTE: before I (Steve Krenzel) made changes, minMark was always 0, which appears // to have made basey always equal 0, maybe I overlooked something GLfloat basey = maxMotionSize * (altitude - 5.0f * float(minMark)) / altitudeOffset; if (!smooth) basey = floorf(basey); glTranslatef((float)(centerx + maxMotionSize), (float)centery - basey, 0.0f); y = smooth ? 0.0f : -0.5f; glBegin(GL_LINES); for (i = minMark; i <= maxMark; i++) { glVertex2i(0, (int)y); glVertex2i(8, (int)y); y += altitudeMarkSpacing; } glEnd(); // back to our regular rendering mode if (smooth) { glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } glPopMatrix(); bool smoothLabel = smooth; x = (float)(10 + centerx + maxMotionSize); y = (float)centery - basey + floorf(fm.getStrHeight(headingFontFace, headingFontSize, "0") / 2); if (smoothLabel) { y -= 0.5f; hudColor4f(hudColor[0], hudColor[1], hudColor[2], basey - floorf(basey)); } char buf[10]; for (i = minMark; i <= maxMark; i++) { sprintf(buf, "%d", i * 5); fm.drawString(x, y, 0, headingFontFace, headingFontSize, std::string(buf)); y += altitudeMarkSpacing; } if (smoothLabel) { y = (float)centery - basey + floorf(fm.getStrHeight(headingFontFace, headingFontSize, "0") / 2); y += 0.5f; basey -= floorf(basey); hudColor4f(hudColor[0], hudColor[1], hudColor[2], 1.0f - basey); for (i = minMark; i <= maxMark; i++) { sprintf(buf, "%d", i * 5); fm.drawString(x, y, 0, headingFontFace, headingFontSize, std::string(buf)); y += altitudeMarkSpacing; } } } } void HUDRenderer::drawMarkersInView( int centerx, int centery, const LocalPlayer* myTank ) { if (myTank) { glPushMatrix(); hudColor3Afv( hudColor, 0.5f ); glTranslatef((float)centerx,(float)centery,0); glLineWidth(2.0f); // draw any waypoint markers for (int i = 0; i < (int)enhancedMarkers.size(); i++) { drawWaypointMarker(enhancedMarkers[i].color, 0.45f, enhancedMarkers[i].pos, myTank->getPosition(), enhancedMarkers[i].name, enhancedMarkers[i].friendly); } enhancedMarkers.clear(); // draw any lockon markers for (int i = 0; i < (int)lockOnMarkers.size(); i++) { drawLockonMarker(lockOnMarkers[i].color, 0.45f, lockOnMarkers[i]. pos,myTank->getPosition(), lockOnMarkers[i].name, lockOnMarkers[i].friendly); } lockOnMarkers.clear(); glLineWidth(1.0f); glPopMatrix(); hudColor3Afv( hudColor, 0.5f ); } } void HUDRenderer::renderPlaying(SceneRenderer& renderer) { // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); const int centerx = width >> 1; const int centery = viewHeight >> 1; FontManager &fm = FontManager::instance(); // use one-to-one pixel projection glScissor(ox, oy + height - viewHeight, width, viewHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, viewHeight - height, viewHeight, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); // cover the lower portion of the screen when burrowed const LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank && myTank->getPosition()[2] < 0.0f) { glColor4f(0.02f, 0.01f, 0.01f, 1.0); glRectf(0, 0, (float)width, (myTank->getPosition()[2]/(BZDB.eval(StateDatabase::BZDB_BURROWDEPTH)-0.1f)) * ((float)viewHeight/2.0f)); } // draw shot reload status if (BZDB.isTrue("displayReloadTimer")) { renderShots(myTank); } // draw cracks if (showCracks) renderCracks(); // draw the markers, if we should const bool experimental = (RENDERER.useQuality() >= 3); if (!BZDB.isTrue("_forbidMarkers") && experimental) { glDisable(GL_TEXTURE_2D); drawMarkersInView(centerx,centery,myTank); glEnable(GL_TEXTURE_2D); } // draw status line renderStatus(); // draw alert messages renderAlerts(); // show player scoreboard scoreboard->setRoaming(roaming); scoreboard->render(false); // draw flag help if (flagHelpClock.isOn()) { int i; float y; hudColor3fv(messageColor); flagHelpY = (float) ((window.getViewHeight() >> 1) - maxMotionSize); y = flagHelpY; const char* flagHelpBase = flagHelpText.c_str(); for (i = 0; i < flagHelpLines; i++) { y -= fm.getStrHeight(minorFontFace, minorFontSize, "0"); fm.drawString((float)(centerx - fm.getStrLength(minorFontFace, minorFontSize, flagHelpBase)/2.0), y, 0, minorFontFace, minorFontSize, flagHelpBase); while (*flagHelpBase) flagHelpBase++; flagHelpBase++; } } if (myTank && globalClock.isOn()) { float yy = 0.5f * (float)height + fm.getStrHeight(bigFontFace, bigFontSize, "0"); if (myTank->isAutoPilot()) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - autoPilotWidth), yy, 0, bigFontFace, bigFontSize, autoPilotLabel); } } // draw times renderTimes(); // draw message composition if (showCompose) renderCompose(renderer); // draw targeting box renderBox(renderer); // restore graphics state glPopMatrix(); } void HUDRenderer::renderNotPlaying(SceneRenderer& renderer) { // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); FontManager &fm = FontManager::instance(); // use one-to-one pixel projection glScissor(ox, oy + height - viewHeight, width, viewHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, viewHeight - height, viewHeight, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); // draw cracks if (showCracks) renderCracks(); // draw status line renderStatus(); // draw alert messages renderAlerts(); // show player scoreboard scoreboard->setRoaming(roaming); scoreboard->render(true); // draw times renderTimes(); // draw message composition if (showCompose) renderCompose(renderer); // tell player what to do to start/resume playing LocalPlayer* myTank = LocalPlayer::getMyTank(); if (myTank && globalClock.isOn()) { float y = 0.5f * (float)viewHeight + fm.getStrHeight(bigFontFace, bigFontSize, "0"); if (gameOver) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - gameOverLabelWidth), y, 0, bigFontFace, bigFontSize, gameOverLabel); } else if (!myTank->isAlive() && !myTank->isExploding()) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - restartLabelWidth), y, 0, bigFontFace, bigFontSize, restartLabel); } else if (myTank->isPaused()) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - resumeLabelWidth), y, 0, bigFontFace, bigFontSize, resumeLabel); } else if (myTank->isAutoPilot()) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - autoPilotWidth), y, 0, bigFontFace, bigFontSize, autoPilotLabel); } } // restore graphics state glPopMatrix(); } void HUDRenderer::renderRoaming(SceneRenderer& renderer) { // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); FontManager &fm = FontManager::instance(); // use one-to-one pixel projection glScissor(ox, oy + height - viewHeight, width, viewHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, viewHeight - height, viewHeight, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); // black out the underground if we're driving with a tank with BU LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank && myTank->getPosition()[2] < 0.0f) { glColor4f(0.02f, 0.01f, 0.01f, 1.0); glRectf(0, 0, (float)width, (myTank->getPosition()[2]/(BZDB.eval(StateDatabase::BZDB_BURROWDEPTH)-0.1f)) * ((float)viewHeight/2.0f)); } // draw shot reload status if ((ROAM.getMode() == Roaming::roamViewFP) && BZDB.isTrue("displayReloadTimer")) { renderShots(ROAM.getTargetTank()); } // draw alert messages renderAlerts(); // show player scoreboard scoreboard->setRoaming(roaming); scoreboard->render(false); // show tank labels if (BZDB.isTrue("displayLabels")) renderTankLabels(renderer); // draw times renderTimes(); // draw message composition if (showCompose) renderCompose(renderer); // display game over if (myTank && globalClock.isOn()) { float y = 0.5f * (float)height + fm.getStrHeight(bigFontFace, bigFontSize, "0"); if (gameOver) { hudColor3fv(messageColor); fm.drawString(0.5f * ((float)width - gameOverLabelWidth), y, 0, bigFontFace, bigFontSize, gameOverLabel); } } renderStatus(); // draw targeting box if (altitude != -1.0f) renderBox(renderer); // restore graphics state glPopMatrix(); } static int compare_float (const void* a, const void* b) { const float fa = *((const float*)a); const float fb = *((const float*)b); if (fa > fb) { return 1; } else { return -1; } } void HUDRenderer::renderShots(const Player* target) { // get the target tank if (!target) return; // get view metrics const int width = window.getWidth(); const int height = window.getHeight(); const int viewHeight = window.getViewHeight(); const int centerx = width >> 1; const int centery = viewHeight >> 1; const int indicatorWidth = width / 50; const int indicatorHeight = height / 80; const int indicatorSpace = indicatorHeight / 10 + 2; const int indicatorLeft = centerx + maxMotionSize + indicatorWidth + 16; const int indicatorTop = centery - (int)(0.5f * (indicatorHeight + indicatorSpace) * target->getMaxShots()); const int maxShots = target->getMaxShots(); float* factors = new float[maxShots]; // tally the reload values for (int i = 0; i < maxShots; ++i) { const ShotPath* shot = target->getShot(i); factors[i] = 1.0f; if (shot) { const TimeKeeper currentTime = shot->getCurrentTime(); const TimeKeeper startTime = shot->getStartTime(); const float reloadTime = shot->getReloadTime(); factors[i] = float(1 - ((reloadTime - (currentTime - startTime)) / reloadTime)); if (factors[i] > 1.0f) factors[i] = 1.0f; } } // sort the reload values qsort(factors, maxShots, sizeof(float), compare_float); // draw the reload values glEnable(GL_BLEND); for (int i = 0; i < maxShots; ++i) { const int myWidth = int(indicatorWidth * factors[i]); const int myTop = indicatorTop + i * (indicatorHeight + indicatorSpace); if (factors[i] < 1.0f) { hudColor4f(0.0f, 1.0f, 0.0f, 0.5f); // green glRecti(indicatorLeft, myTop, indicatorLeft + myWidth, myTop + indicatorHeight); hudColor4f(1.0f, 0.0f, 0.0f, 0.5f); // red glRecti(indicatorLeft + myWidth + 1, myTop, indicatorLeft + indicatorWidth, myTop + indicatorHeight); } else { hudColor4f(1.0f, 1.0f, 1.0f, 0.5f); // white glRecti(indicatorLeft, myTop, indicatorLeft + myWidth, myTop + indicatorHeight); } } glDisable(GL_BLEND); delete[] factors; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDRenderer.h000066400000000000000000000170111200563112200177530ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __HUDRENDERER_H__ #define __HUDRENDERER_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "TimeKeeper.h" #include "HUDuiTypeIn.h" #include "Flag.h" /* local interface headers */ #include "FlashClock.h" #include "MainWindow.h" #include "BzfDisplay.h" #include "SceneRenderer.h" #include "Player.h" #include "ScoreboardRenderer.h" #include "LocalPlayer.h" #include "OpenGLUtils.h" const int MaxAlerts = 3; const int HUDNumCracks = 8; const int HUDCrackLevels = 4; class HUDMarker { public: float heading; GLfloat color[3]; }; typedef std::vector MarkerList; class EnhancedHUDMarker { public: EnhancedHUDMarker() : pos(0.0f, 0.0f, 0.0f) , color(0.0f, 0.0f, 0.0f, 1.0f) , friendly(false) {} EnhancedHUDMarker(const fvec3& p, const fvec4& c) : pos(p) , color(c) , friendly(false) {} fvec3 pos; fvec4 color; std::string name; bool friendly; }; typedef std::vector EnhancedMarkerList; /** * HUDRenderer: * Encapsulates information about rendering the heads-up display. */ class HUDRenderer : public GLDisplayListCreator { public: HUDRenderer(const BzfDisplay*, const SceneRenderer&); ~HUDRenderer(); virtual void buildGeometry(GLDisplayList displayList); int getNoMotionSize() const; int getMaxMotionSize() const; void setColor(float r, float g, float b); void setPlaying(bool playing); void setRoaming(bool roaming); void setPlayerHasHighScore(bool = true); void setTeamHasHighScore(bool = true); void setHeading(float angle); void setAltitude(float altitude); void setAltitudeTape(bool = true); void setFPS(float fps); void setDrawTime(float drawTimeInseconds); void setFrameTriangleCount(int tpf); void setFrameRadarTriangleCount(int rtpf); void setAlert(int num, const char* string, float duration, bool warning = false); void setFlagHelp(FlagType* desc, float duration); void initCracks(); void setCracks(bool showCracks); void addMarker(float heading, const float *color); void setRestartKeyLabel(const std::string&); void setTimeLeft(uint32_t timeLeftInSeconds); void AddEnhancedMarker(const fvec3& pos, const fvec4& color, bool friendly = false, float zShift = 0.0f); void AddEnhancedNamedMarker(const fvec3& pos, const fvec4& color, std::string name, bool friendly = false, float zShift = 0.0f); void AddLockOnMarker(const fvec3& pos, std::string name, bool friendly = false, float zShift = 0.0f); void saveMatrixes(const float* mm, const float* pm); void setDim(bool); bool getComposing() const; std::string getComposeString() const; void setComposeString(const std::string &message) const; void setComposeString(const std::string &message, bool _allowEdit) const; void setComposing(const std::string &prompt); void setComposing(const std::string &prompt, bool _allowEdit); void render(SceneRenderer&); ScoreboardRenderer *getScoreboard(); protected: void hudColor3f(GLfloat, GLfloat, GLfloat); void hudColor4f(GLfloat, GLfloat, GLfloat, GLfloat); void hudColor3fv(const GLfloat*); void hudColor4fv(const GLfloat*); void hudColor3Afv(const float*, const float); void hudSColor3fv(const GLfloat*); void renderAlerts(void); void renderStatus(void); void renderCracks(); void renderOptions(SceneRenderer&); void renderCompose(SceneRenderer&); void renderBox(SceneRenderer&); void renderTankLabels(SceneRenderer&); void renderPlaying(SceneRenderer&); void renderNotPlaying(SceneRenderer&); void renderRoaming(SceneRenderer&); void renderTimes(void); void renderShots(const Player*); void drawLockonMarker(float* color, float alpha, float* object, const float* viewPos, std::string name, bool friendly); void drawWaypointMarker(float* color, float alpha, float* object, const float* viewPos, std::string name, bool friendly); void drawMarkersInView(int centerX, int centerY, const LocalPlayer* myTank); void makeCrack(float crackpattern[HUDNumCracks][(1 << HUDCrackLevels) + 1][2], int n, int l, float a); std::string makeHelpString(const char* help) const; private: void setBigFontSize(int width, int height); void setAlertFontSize(int width, int height); void setMajorFontSize(int width, int height); void setMinorFontSize(int width, int height); void setHeadingFontSize(int width, int height); void setComposeFontSize(int width, int height); void setLabelsFontSize(int width, int height); void resize(bool firstTime); static void resizeCallback(void*); GLDisplayList friendlyMarkerList; private: const BzfDisplay* display; ScoreboardRenderer* scoreboard; MainWindow& window; bool firstRender; int noMotionSize; int maxMotionSize; float headingOffset; GLfloat hudColor[3]; GLfloat messageColor[3]; GLfloat warningColor[3]; int bigFontFace; float bigFontSize; int alertFontFace; float alertFontSize; int majorFontFace; float majorFontSize; int minorFontFace; float minorFontSize; int headingFontFace; float headingFontSize; int composeFontFace; float composeFontSize; int labelsFontFace; float labelsFontSize; float majorFontHeight; float alertFontHeight; bool playing; bool roaming; bool dim; int numPlayers; uint32_t timeLeft; TimeKeeper timeSet; bool playerHasHighScore; bool teamHasHighScore; float heading; float altitude; bool altitudeTape; float fps; float drawTime; float headingMarkSpacing; float headingLabelWidth[36]; float altitudeMarkSpacing; float altitudeLabelMaxWidth; float restartLabelWidth; float resumeLabelWidth; float autoPilotWidth; float cancelDestructLabelWidth; float gameOverLabelWidth; float huntArrowWidth; float huntedArrowWidth; float tkWarnRatio; std::string restartLabel; FlashClock globalClock; FlashClock scoreClock; FlashClock alertClock[MaxAlerts]; std::string alertLabel[MaxAlerts]; float alertLabelWidth[MaxAlerts]; const GLfloat* alertColor[MaxAlerts]; float flagHelpY; FlashClock flagHelpClock; int flagHelpLines; std::string flagHelpText; bool showOptions; bool showCompose; GLfloat cracks[HUDNumCracks][(1 << HUDCrackLevels) + 1][2]; TimeKeeper crackStartTime; bool showCracks; HUDuiTypeIn* composeTypeIn; double modelMatrix[16]; double projMatrix[16]; int viewport[4]; MarkerList markers; EnhancedMarkerList enhancedMarkers; EnhancedMarkerList lockOnMarkers; static const float altitudeOffset; static const GLfloat black[3]; static std::string headingLabel[36]; static std::string restartLabelFormat; static std::string resumeLabel; static std::string cancelDestructLabel; static std::string gameOverLabel; static std::string autoPilotLabel; bool dater; unsigned int lastTimeChange; int triangleCount; int radarTriangleCount; }; #endif /* __HUDRENDERER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDui.cxx000066400000000000000000000025461200563112200172040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "HUDui.h" // // HUDui // HUDuiControl* HUDui::focus = NULL; HUDuiDefaultKey* HUDui::defaultKey = NULL; HUDuiControl* HUDui::getFocus() { return focus; } void HUDui::setFocus(HUDuiControl* _focus) { focus = _focus; } HUDuiDefaultKey* HUDui::getDefaultKey() { return defaultKey; } void HUDui::setDefaultKey(HUDuiDefaultKey* _defaultKey) { defaultKey = _defaultKey; } bool HUDui::keyPress(const BzfKeyEvent& key) { if (defaultKey && defaultKey->keyPress(key)) return true; if (focus && focus->doKeyPress(key)) return true; return false; } bool HUDui::keyRelease(const BzfKeyEvent& key) { if (defaultKey && defaultKey->keyRelease(key)) return true; if (focus && focus->doKeyRelease(key)) return true; return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDui.h000066400000000000000000000022701200563112200166230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDui: * User interface class for the heads-up display and menu system. */ #ifndef __HUDUI_H__ #define __HUDUI_H__ #include "BzfEvent.h" #include "HUDuiControl.h" #include "HUDuiDefaultKey.h" class HUDui { public: static HUDuiControl* getFocus(); static void setFocus(HUDuiControl*); static HUDuiDefaultKey* getDefaultKey(); static void setDefaultKey(HUDuiDefaultKey*); static bool keyPress(const BzfKeyEvent&); static bool keyRelease(const BzfKeyEvent&); private: static HUDuiControl *focus; static HUDuiDefaultKey* defaultKey; }; #endif // __HUDUI_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiControl.cxx000066400000000000000000000155341200563112200205460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "HUDuiControl.h" // system headers #include // common implementation headers #include "BundleMgr.h" #include "Bundle.h" #include "TextureManager.h" #include "FontManager.h" // local implementation headers #include "HUDui.h" // // HUDuiControl // // init static members const GLfloat HUDuiControl::dimTextColor[3] = { 0.7f, 0.7f, 0.7f }; const GLfloat HUDuiControl::moreDimTextColor[3] = { 0.4f, 0.4f, 0.4f }; const GLfloat HUDuiControl::textColor[3] = { 1.0f, 1.0f, 1.0f }; OpenGLGState* HUDuiControl::gstate = NULL; int HUDuiControl::arrow = -1; int HUDuiControl::arrowFrame = 0; TimeKeeper HUDuiControl::lastTime; int HUDuiControl::totalCount = 0; HUDuiControl::HUDuiControl() : showingFocus(true), fontFace(-1), fontSize(11), x(0.0f), y(0.0f), width(1.0f), height(1.0f), fontHeight(11.0f), desiredLabelWidth(0.0f), trueLabelWidth(0.0f), prev(this), next(this), cb(NULL), userData(NULL) { if (totalCount == 0) { // load arrow texture TextureManager &tm = TextureManager::instance(); arrow = tm.getTextureID( "menu_arrow" ); // make gstate for focus arrow gstate = new OpenGLGState; OpenGLGStateBuilder builder(*gstate); builder.setTexture(arrow); builder.setBlending(); // builder.setSmoothing(); //builder.setTextureEnvMode(GL_REPLACE); *gstate = builder.getState(); // get start time for animation lastTime = TimeKeeper::getCurrent(); } totalCount++; } HUDuiControl::~HUDuiControl() { if (--totalCount == 0) { delete gstate; arrow = -1; gstate = NULL; } } float HUDuiControl::getLabelWidth() const { return desiredLabelWidth; } std::string HUDuiControl::getLabel() const { return BundleMgr::getCurrentBundle()->getLocalString(label); } int HUDuiControl::getFontFace() const { return fontFace; } float HUDuiControl::getFontSize() const { return fontSize; } HUDuiControl* HUDuiControl::getPrev() const { return prev; } HUDuiControl* HUDuiControl::getNext() const { return next; } HUDuiCallback HUDuiControl::getCallback() const { return cb; } void* HUDuiControl::getUserData() const { return userData; } void HUDuiControl::setPosition(float _x, float _y) { x = _x; y = _y; } void HUDuiControl::setSize(float _width, float _height) { width = _width; height = _height; } void HUDuiControl::setLabelWidth(float labelWidth) { desiredLabelWidth = labelWidth; } void HUDuiControl::setLabel(const std::string& _label) { label = _label; if (fontFace >= 0) { FontManager &fm = FontManager::instance(); trueLabelWidth = fm.getStrLength(fontFace, fontSize, getLabel() + "99"); } } void HUDuiControl::setFontFace(int _fontFace) { fontFace = _fontFace; onSetFont(); } void HUDuiControl::setFontSize(float size) { fontSize = size; onSetFont(); } void HUDuiControl::setPrev(HUDuiControl* _prev) { if (!_prev) prev = this; else prev = _prev; } void HUDuiControl::setNext(HUDuiControl* _next) { if (!_next) next = this; else next = _next; } void HUDuiControl::setCallback(HUDuiCallback _cb, void* _ud) { cb = _cb; userData = _ud; } void HUDuiControl::onSetFont() { if (fontFace >= 0) { FontManager &fm = FontManager::instance(); fontHeight = fm.getStrHeight(fontFace, fontSize, getLabel()); trueLabelWidth = fm.getStrLength(fontFace, fontSize, getLabel() + "99"); } else { fontHeight = 11.0f; trueLabelWidth = 0.0f; } } bool HUDuiControl::hasFocus() const { return this == HUDui::getFocus(); } void HUDuiControl::setFocus() { HUDui::setFocus(this); } void HUDuiControl::showFocus(bool _showingFocus) { showingFocus = _showingFocus; } void HUDuiControl::doCallback() { if (cb) (*cb)(this, userData); } void HUDuiControl::renderFocus() { float fh2; TextureManager &tm = TextureManager::instance(); const ImageInfo &info = tm.getInfo(arrow); if (gstate->isTextured()) { // assumes there are w/h frames of animation h x h in each image float imageSize = (float)info.y; int uFrames = 1; if (imageSize != 0) uFrames = int(info.x/imageSize); // 4; int vFrames = 1; // 4; float du = 1.0f / (float)uFrames; float dv = 1.0f / (float)vFrames; float u = (float)(arrowFrame % uFrames) / (float)uFrames; float v = (float)(arrowFrame / uFrames) / (float)vFrames; fh2 = floorf(1.5f * fontHeight) - 1.0f; // this really should not scale the image based on the font, gstate->setState(); // best would be to load an image for each size glColor3f(1.0f, 1.0f, 1.0f); float imageXShift = 0.5f; float imageYShift = -fh2 * 0.2f; float outputSize = fh2; glBegin(GL_QUADS); glTexCoord2f(u, v); glVertex2f(x + imageXShift - outputSize, y + imageYShift); glTexCoord2f(u + du, v); glVertex2f(x + imageXShift , y + imageYShift); glTexCoord2f(u + du, v + dv); glVertex2f(x + imageXShift , y + outputSize + imageYShift); glTexCoord2f(u, v + dv); glVertex2f(x + imageXShift - outputSize, y + outputSize + imageYShift); glEnd(); TimeKeeper nowTime = TimeKeeper::getCurrent(); if (nowTime - lastTime > 0.07f) { lastTime = nowTime; if (++arrowFrame == uFrames * vFrames) arrowFrame = 0; } } else { fh2 = floorf(0.5f * fontHeight); gstate->setState(); glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLES); glVertex2f(x - fh2 - fontHeight, y + fontHeight - 1.0f); glVertex2f(x - fh2 - fontHeight, y); glVertex2f(x - fh2 - 1.0f, y + 0.5f * (fontHeight - 1.0f)); glEnd(); glColor3f(0.0f, 0.0f, 0.0f); glBegin(GL_LINE_LOOP); glVertex2f(x - fh2 - fontHeight, y + fontHeight - 1.0f); glVertex2f(x - fh2 - fontHeight, y); glVertex2f(x - fh2 - 1.0f, y + 0.5f * (fontHeight - 1.0f)); glEnd(); } } void HUDuiControl::renderLabel() { std::string theLabel = getLabel(); if (theLabel.length() > 0 && fontFace >= 0) { FontManager &fm = FontManager::instance(); const float dx = (desiredLabelWidth > trueLabelWidth) ? desiredLabelWidth : trueLabelWidth; fm.drawString(x - dx, y, 0, fontFace, fontSize, theLabel); } } void HUDuiControl::render() { if (hasFocus() && showingFocus) renderFocus(); glColor3fv(hasFocus() ? textColor : dimTextColor); renderLabel(); doRender(); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiControl.h000066400000000000000000000060651200563112200201720ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiControl: * User interface class and functions for the basic HUD UI control. */ #ifndef __HUDUICONTROL_H__ #define __HUDUICONTROL_H__ /* common header */ #include "common.h" /* system headers */ #include // common interface headers #include "BzfEvent.h" #include "OpenGLGState.h" #include "TimeKeeper.h" class HUDuiControl; typedef void (*HUDuiCallback)(HUDuiControl*, void*); class HUDuiControl { friend class HUDui; public: HUDuiControl(); virtual ~HUDuiControl(); float getX() const; float getY() const; float getWidth() const; float getHeight() const; float getLabelWidth() const; std::string getLabel() const; int getFontFace() const; float getFontSize() const; HUDuiControl* getPrev() const; HUDuiControl* getNext() const; HUDuiCallback getCallback() const; void* getUserData() const; void setPosition(float x, float y); void setSize(float width, float height); void setLabelWidth(float width); void setLabel(const std::string& label); void setFontFace(int face); void setFontSize(float size); void setPrev(HUDuiControl*); void setNext(HUDuiControl*); void setCallback(HUDuiCallback, void*); bool hasFocus() const; void setFocus(); void showFocus(bool); void render(); static int getArrow() { return arrow; } protected: virtual void onSetFont(); virtual bool doKeyPress(const BzfKeyEvent&) = 0; virtual bool doKeyRelease(const BzfKeyEvent&) = 0; virtual void doRender() = 0; void renderFocus(); void renderLabel(); void doCallback(); static const GLfloat dimTextColor[3]; static const GLfloat moreDimTextColor[3]; static const GLfloat textColor[3]; private: bool showingFocus; int fontFace; float fontSize; float x, y; float width, height; float fontHeight; float desiredLabelWidth, trueLabelWidth; std::string label; HUDuiControl* prev, *next; HUDuiCallback cb; void* userData; static OpenGLGState* gstate; static int arrow; static int arrowFrame; static TimeKeeper lastTime; static int totalCount; }; // // inline functions // inline float HUDuiControl::getX() const { return x; } inline float HUDuiControl::getY() const { return y; } inline float HUDuiControl::getWidth() const { return width; } inline float HUDuiControl::getHeight() const { return height; } #endif // __HUDUICONTROL_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiDefaultKey.cxx000066400000000000000000000016531200563112200211600ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "HUDuiDefaultKey.h" // // HUDuiDefaultKey // HUDuiDefaultKey::HUDuiDefaultKey() { // do nothing } HUDuiDefaultKey::~HUDuiDefaultKey() { // do nothing } bool HUDuiDefaultKey::keyPress(const BzfKeyEvent&) { return false; } bool HUDuiDefaultKey::keyRelease(const BzfKeyEvent&) { return false; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiDefaultKey.h000066400000000000000000000017311200563112200206020ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiDefaultKey: * User interface class for the heads-up display. */ #ifndef __HUDUIDEFAULTKEY_H__ #define __HUDUIDEFAULTKEY_H__ #include "BzfEvent.h" class HUDuiDefaultKey { public: HUDuiDefaultKey(); virtual ~HUDuiDefaultKey(); virtual bool keyPress(const BzfKeyEvent&); virtual bool keyRelease(const BzfKeyEvent&); }; #endif // __HUDUIDEFAULTKEY_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiLabel.cxx000066400000000000000000000053051200563112200201400ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface headers #include "HUDuiLabel.h" // common implementation headers #include "BundleMgr.h" #include "Bundle.h" #include "FontManager.h" // local implementation headers #include "HUDui.h" // // HUDuiLabel // HUDuiLabel::HUDuiLabel() : HUDuiControl() { darker = false; params = NULL; color[0] = textColor[0]; color[1] = textColor[1]; color[2] = textColor[2]; } HUDuiLabel::~HUDuiLabel() { if (params) delete params; } std::string HUDuiLabel::getString() const { std::string theString; Bundle *bdl = BundleMgr::getCurrentBundle(); if (params) theString = bdl->formatMessage(string, params); else theString = bdl->getLocalString(string); return theString; } void HUDuiLabel::setString(const std::string& _string, const std::vector *_params) { string = _string; if (_params) { if (params != NULL) delete params; params = new std::vector(*_params); } onSetFont(); } void HUDuiLabel::onSetFont() { HUDuiControl::onSetFont(); } bool HUDuiLabel::doKeyPress(const BzfKeyEvent& key) { if (key.ascii == 0) switch (key.button) { case BzfKeyEvent::Up: HUDui::setFocus(getPrev()); break; case BzfKeyEvent::Down: HUDui::setFocus(getNext()); break; default: return false; } if (key.ascii == '\t') { HUDui::setFocus(getNext()); return true; } switch (key.ascii) { case 13: case 27: return false; } return true; } bool HUDuiLabel::doKeyRelease(const BzfKeyEvent&) { return false; } void HUDuiLabel::setDarker(bool d) { darker = d; } void HUDuiLabel::setColor(GLfloat r, GLfloat g, GLfloat b) { color[0] = r; color[1] = g; color[2] = b; } void HUDuiLabel::doRender() { if (getFontFace() < 0) { return; } // render string FontManager &fm = FontManager::instance(); float darkness; if (hasFocus()) { darkness = 1.0f; } else if (!darker) { darkness = 0.7f; } else { darkness = 0.4f; } fm.setDarkness(darkness); fm.drawString(getX(), getY(), 0, getFontFace(), getFontSize(), getString(), color); fm.setDarkness(1.0f); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiLabel.h000066400000000000000000000027241200563112200175670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiLabel: * User interface class for the heads-up display's label (text display) control */ #ifndef __HUDUILABEL_H__ #define __HUDUILABEL_H__ // ancestor class #include "HUDuiControl.h" #include #include #include "BzfEvent.h" class HUDuiLabel : public HUDuiControl { public: HUDuiLabel(); ~HUDuiLabel(); std::string getString() const; void setString(const std::string&, const std::vector *_params = NULL); void setDarker(bool d); // render darker than usual when not in focus void setColor(GLfloat r, GLfloat g, GLfloat b); protected: void onSetFont(); bool doKeyPress(const BzfKeyEvent&); bool doKeyRelease(const BzfKeyEvent&); void doRender(); private: std::string string; std::vector *params; bool darker; GLfloat color[3]; }; #endif // __HUDUILABEL_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiList.cxx000066400000000000000000000062011200563112200200300ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface headers #include "HUDuiList.h" // common implementation headers #include "BundleMgr.h" #include "Bundle.h" #include "FontManager.h" // local implementation headers #include "HUDui.h" // // HUDuiList // HUDuiList::HUDuiList() : HUDuiControl(), index(-1) { // do nothing } HUDuiList::~HUDuiList() { // do nothing } int HUDuiList::getIndex() const { return index; } void HUDuiList::setIndex(int _index) { if (_index < 0) index = 0; else if (_index >= (int)list.size()) index = list.size() - 1; else index = _index; } std::vector& HUDuiList::getList() { return list; } void HUDuiList::update() { setIndex(index); } void HUDuiList::createSlider(const int numValues) { // create a slider with numValues options /* createSlider(4) does the equivalent of options->push_back(std::string("[O---]")); options->push_back(std::string("[-O--]")); options->push_back(std::string("[--O-]")); options->push_back(std::string("[---O]")); */ std::vector &options = getList(); std::string line(numValues + 2, '-'); line[0] = '['; line[numValues + 1] = ']'; for (int i = 0; i < numValues; i++) { if (i > 0) line[i] = '-'; line[i + 1] = 'O'; options.push_back(line); } } bool HUDuiList::doKeyPress(const BzfKeyEvent& key) { if (key.ascii == '\t') { HUDui::setFocus(getNext()); return true; } if (key.ascii == 0) switch (key.button) { case BzfKeyEvent::Up: HUDui::setFocus(getPrev()); break; case BzfKeyEvent::Down: HUDui::setFocus(getNext()); break; case BzfKeyEvent::Left: if (index != -1) { if (--index < 0) index = list.size() - 1; doCallback(); } break; case BzfKeyEvent::Right: if (index != -1) { if (++index >= (int)list.size()) index = 0; doCallback(); } break; case BzfKeyEvent::Home: if (index != -1) { index = 0; doCallback(); } break; case BzfKeyEvent::End: if (index != -1) { index = list.size() - 1; doCallback(); } break; default: return false; } switch (key.ascii) { case 13: case 27: return false; } return true; } bool HUDuiList::doKeyRelease(const BzfKeyEvent&) { // ignore key releases return false; } void HUDuiList::doRender() { Bundle *bdl = BundleMgr::getCurrentBundle(); if (index != -1 && getFontFace() >= 0) { glColor3fv(hasFocus() ? textColor : dimTextColor); FontManager &fm = FontManager::instance(); fm.drawString(getX(), getY(), 0, getFontFace(), getFontSize(), bdl->getLocalString(list[index])); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiList.h000066400000000000000000000024561200563112200174650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiList: * User interface class for the heads-up display's list (value selection from * a set) control. */ #ifndef __HUDUILIST_H__ #define __HUDUILIST_H__ // ancestor class #include "HUDuiControl.h" #include #include #include "BzfEvent.h" class HUDuiList : public HUDuiControl { public: HUDuiList(); ~HUDuiList(); int getIndex() const; void setIndex(int); void createSlider(const int); std::vector& getList(); void update(); protected: bool doKeyPress(const BzfKeyEvent&); bool doKeyRelease(const BzfKeyEvent&); void doRender(); private: int index; std::vector list; }; #endif // __HUDUILIST_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiTextureLabel.cxx000066400000000000000000000043411200563112200215200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface headers #include "HUDuiTextureLabel.h" // system headers #include // common implementation headers #include "TextureManager.h" #include "OpenGLTexture.h" // // HUDuiTextureLabel // HUDuiTextureLabel::HUDuiTextureLabel() : HUDuiLabel(), texture() { } HUDuiTextureLabel::~HUDuiTextureLabel() { } void HUDuiTextureLabel::setTexture(const int t) { OpenGLGStateBuilder builder(gstate); builder.setTexture(t); builder.setBlending(); gstate = builder.getState(); texture = t; } void HUDuiTextureLabel::doRender() { if (getFontFace() < 0) return; // render string if texture filter is Off, otherwise draw the texture // about the same size and position as the string would be. if (OpenGLTexture::getMaxFilter() == OpenGLTexture::Off || !gstate.isTextured() || texture < 0) { HUDuiLabel::doRender(); } else { // why use a font? it's an image, use the image size, let every pixel be seen!!! :) const float _height = getFontSize(); //texture.getHeight();// TextureManager &tm = TextureManager::instance(); const float _width = _height * (1.0f / tm.GetAspectRatio(texture)); //const float descent = font.getDescent(); const float descent = 0; const float xx = getX(); const float yy = getY(); gstate.setState(); glColor3fv(textColor); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(xx, yy - descent); glTexCoord2f(1.0f, 0.0f); glVertex2f(xx + _width, yy - descent); glTexCoord2f(1.0f, 1.0f); glVertex2f(xx + _width, yy - descent + _height); glTexCoord2f(0.0f, 1.0f); glVertex2f(xx, yy - descent + _height); glEnd(); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiTextureLabel.h000066400000000000000000000022751200563112200211510ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiTextureLabel: * User interface classes and functions for the heads-up display's textured * label controls. */ #ifndef __HUDUITEXTURELABEL_H__ #define __HUDUITEXTURELABEL_H__ #include "HUDuiLabel.h" #include "OpenGLGState.h" class HUDuiTextureLabel : public HUDuiLabel { public: HUDuiTextureLabel(); ~HUDuiTextureLabel(); void setTexture(const int); int getTexture() const; protected: void doRender(); private: OpenGLGState gstate; int texture; }; inline int HUDuiTextureLabel::getTexture() const { return texture; } #endif // __HUDUITEXTURELABEL_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiTypeIn.cxx000066400000000000000000000101711200563112200203260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface headers #include "HUDuiTypeIn.h" // system implementation headers #include // common implementation headers #include "FontManager.h" // local implementation headers #include "HUDui.h" // // HUDuiTypeIn // HUDuiTypeIn::HUDuiTypeIn() : HUDuiControl() , maxLength(0) , cursorPos(0) , allowEdit(true) , obfuscate(false) , colorFunc(NULL) { } HUDuiTypeIn::~HUDuiTypeIn() { } void HUDuiTypeIn::setObfuscation(bool on) { obfuscate = on; } int HUDuiTypeIn::getMaxLength() const { return maxLength; } std::string HUDuiTypeIn::getString() const { return string; } void HUDuiTypeIn::setMaxLength(int _maxLength) { maxLength = _maxLength; string = string.substr(0, maxLength); if (cursorPos > maxLength) cursorPos = maxLength; onSetFont(); } void HUDuiTypeIn::setString(const std::string& _string) { string = _string; cursorPos = string.length(); onSetFont(); } // allows composing, otherwise not void HUDuiTypeIn::setEditing(bool _allowEdit) { allowEdit = _allowEdit; } bool HUDuiTypeIn::doKeyPress(const BzfKeyEvent& key) { static const char backspace = '\b'; // ^H static const char whitespace = ' '; if (!allowEdit) return false; //or return true ?? char c = key.ascii; if (c == 0){ switch (key.button) { case BzfKeyEvent::Up: HUDui::setFocus(getPrev()); return true; case BzfKeyEvent::Down: HUDui::setFocus(getNext()); return true; case BzfKeyEvent::Left: if (cursorPos > 0) cursorPos--; return true; case BzfKeyEvent::Right: if (cursorPos < (int)string.length()) cursorPos++; return true; case BzfKeyEvent::Home: cursorPos = 0; return true; case BzfKeyEvent::End: cursorPos = string.length(); return true; case BzfKeyEvent::Backspace: c = backspace; break; case BzfKeyEvent::Delete: if (cursorPos < (int)string.length()) { cursorPos++; c = backspace; } else { return true; } break; default: return false; } } if (c == '\t') { HUDui::setFocus(getNext()); return true; } if (c >0 && (!isprint(c) && c != backspace)) return false; if (c == backspace) { if (cursorPos == 0) return true; cursorPos--; string = string.substr(0, cursorPos) + string.substr(cursorPos + 1, string.length() - cursorPos + 1); onSetFont(); } else if (c > 0) { if (isspace(c)) c = whitespace; if ((int)string.length() == maxLength) return true; string = string.substr(0, cursorPos) + c + string.substr( cursorPos, string.length() - cursorPos); cursorPos++; onSetFont(); } return true; } bool HUDuiTypeIn::doKeyRelease(const BzfKeyEvent& key) { if (key.ascii == '\t' || !isprint(key.ascii)) // ignore non-printing and tab return false; // slurp up releases return true; } void HUDuiTypeIn::doRender() { if (getFontFace() < 0) return; // render string glColor3fv(hasFocus() ? textColor : dimTextColor); FontManager &fm = FontManager::instance(); std::string renderStr; if (obfuscate) { renderStr.append(string.size(), '*'); } else { renderStr = string; } if (colorFunc) { renderStr = colorFunc(renderStr); } fm.drawString(getX(), getY(), 0, getFontFace(), getFontSize(), renderStr); // find the position of where to draw the input cursor const std::string noAnsi = stripAnsiCodes(renderStr); float start = fm.getStrLength(getFontFace(), getFontSize(), noAnsi.substr(0, cursorPos)); if (HUDui::getFocus() == this && allowEdit) { fm.drawString(getX() + start, getY(), 0, getFontFace(), getFontSize(), "_"); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HUDuiTypeIn.h000066400000000000000000000031531200563112200177550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * HUDuiTypeIn: * User interface class for the heads-up display's editable input control. */ #ifndef __HUDUITYPEIN_H__ #define __HUDUITYPEIN_H__ #include "common.h" /* system interface headers */ #include /* common interface headers */ #include "BzfEvent.h" #include "HUDuiControl.h" typedef std::string (*TypeInColorFunc)(const std::string&); class HUDuiTypeIn : public HUDuiControl { public: HUDuiTypeIn(); ~HUDuiTypeIn(); void setObfuscation(bool on); int getMaxLength() const; std::string getString() const; void setMaxLength(int); void setString(const std::string&); void setEditing(bool _allowEdit); void setColorFunc(TypeInColorFunc func) { colorFunc = func; } protected: bool doKeyPress(const BzfKeyEvent&); bool doKeyRelease(const BzfKeyEvent&); void doRender(); private: int maxLength; std::string string; int cursorPos; bool allowEdit; bool obfuscate; TypeInColorFunc colorFunc; }; #endif // __HUDUITYPEIN_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HelpMenu.cxx000066400000000000000000000571021200563112200177410ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "HelpMenu.h" // system headers #include /* common implementation headers */ #include "KeyManager.h" #include "Flag.h" #include "FontManager.h" /* local implementation headers */ #include "HUDDialogStack.h" #include "HUDuiLabel.h" #include "MainMenu.h" bool HelpMenuDefaultKey::keyPress(const BzfKeyEvent& key) { if (key.button == BzfKeyEvent::PageUp) { HUDDialog* oldMenu = HUDDialogStack::get()->top(); HUDDialogStack::get()->pop(); HUDDialogStack::get()->push(HelpMenu::getHelpMenu(oldMenu, false)); return true; } if (key.button == BzfKeyEvent::PageDown || key.ascii == 13) { HUDDialog* oldMenu = HUDDialogStack::get()->top(); HUDDialogStack::get()->pop(); HUDDialogStack::get()->push(HelpMenu::getHelpMenu(oldMenu, true)); return true; } return MenuDefaultKey::keyPress(key); } bool HelpMenuDefaultKey::keyRelease(const BzfKeyEvent& key) { if (key.button == BzfKeyEvent::PageUp || key.button == BzfKeyEvent::PageDown || key.ascii == 13) return true; return MenuDefaultKey::keyRelease(key); } HelpMenu::HelpMenu(const char* title) : HUDDialog() { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel(title)); listHUD.push_back(createLabel("Page Down for next page", "Page Up for previous page")); initNavigation(listHUD, 1, 1); } HUDuiControl* HelpMenu::createLabel(const char* string, const char* label) { HUDuiLabel* control = new HUDuiLabel; control->setFontFace(MainMenu::getFontFace()); if (string) control->setString(string); if (label) control->setLabel(label); return control; } float HelpMenu::getLeftSide(int, int _height) { return (float)_height / 6.0f; } void HelpMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 23.0f; const float fontSize = (float)_height / 100.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // position focus holder off screen listHUD[1]->setFontSize(fontSize); const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); y -= 1.25f * h; listHUD[1]->setPosition(0.5f * ((float)_width + h), y); // reposition options x = getLeftSide(_width, _height); y -= 1.5f * h; const int count = listHUD.size(); for (int i = 2; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } } // // Help1Menu // class Help1Menu : public HelpMenu { public: Help1Menu(); ~Help1Menu() { } void resize(int width, int height); void onScan(const std::string& name, bool, const std::string&); static void onScanCB(const std::string& name, bool press, const std::string& cmd, void* userData); protected: float getLeftSide(int width, int height); private: void initKeymap(const std::string& name, int index); struct keymap { int index; // ui label index std::string key1; std::string key2; }; typedef std::map KeyKeyMap; KeyKeyMap mappable; }; Help1Menu::Help1Menu() : HelpMenu("Controls") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("Mouse Position", "Controls Tank Position:")); listHUD.push_back(createLabel(NULL, "Fires Shot:")); listHUD.push_back(createLabel(NULL, "Drops Flag (if not bad):")); listHUD.push_back(createLabel(NULL, "Identifies Player (locks on GM):")); listHUD.push_back(createLabel(NULL, "Short Radar Range:")); listHUD.push_back(createLabel(NULL, "Medium Radar Range:")); listHUD.push_back(createLabel(NULL, "Long Radar Range:")); listHUD.push_back(createLabel(NULL, "Zoom Radar In:")); listHUD.push_back(createLabel(NULL, "Zoom Radar Out:")); listHUD.push_back(createLabel(NULL, "Send Message to Everybody:")); listHUD.push_back(createLabel(NULL, "Send Message to Teammates:")); listHUD.push_back(createLabel(NULL, "Send Message to Nemesis:")); listHUD.push_back(createLabel(NULL, "Send Message to Recipient:")); listHUD.push_back(createLabel(NULL, "Jump (if allowed):")); listHUD.push_back(createLabel(NULL, "Toggle Binoculars:")); listHUD.push_back(createLabel(NULL, "Toggle Score Sheet:")); listHUD.push_back(createLabel(NULL, "Toggle Tank Labels:")); listHUD.push_back(createLabel(NULL, "Toggle Heads-up Flag Help:")); listHUD.push_back(createLabel(NULL, "Set Time of Day Backward:")); listHUD.push_back(createLabel(NULL, "Set Time of Day Forward:")); listHUD.push_back(createLabel(NULL, "Pause/Resume:")); listHUD.push_back(createLabel(NULL, "Self destruct/Cancel:")); listHUD.push_back(createLabel(NULL, "Quit:")); listHUD.push_back(createLabel(NULL, "Scroll Message Log Backward:")); listHUD.push_back(createLabel(NULL, "Scroll Message Log Forward:")); listHUD.push_back(createLabel(NULL, "Slow Keyboard Motion:")); listHUD.push_back(createLabel(NULL, "Toggle Radar Flags:")); listHUD.push_back(createLabel(NULL, "Toggle Main Flags:")); listHUD.push_back(createLabel(NULL, "Silence/UnSilence:")); listHUD.push_back(createLabel(NULL, "Server Admin:")); listHUD.push_back(createLabel(NULL, "Hunt:")); listHUD.push_back(createLabel(NULL, "Auto Pilot:")); listHUD.push_back(createLabel(NULL, "Main Message Tab:")); listHUD.push_back(createLabel(NULL, "Chat Message Tab:")); listHUD.push_back(createLabel(NULL, "Server Message Tab:")); listHUD.push_back(createLabel(NULL, "Misc Message Tab:")); listHUD.push_back(createLabel("Esc", "Show/Dismiss menu:")); initKeymap("fire", 3); initKeymap("drop", 4); initKeymap("identify", 5); initKeymap("set displayRadarRange 0.25", 6); initKeymap("set displayRadarRange 0.5", 7); initKeymap("set displayRadarRange 1.0", 8); initKeymap("radarZoom in", 9); initKeymap("radarZoom out", 10); initKeymap("send all", 11); initKeymap("send team", 12); initKeymap("send nemesis", 13); initKeymap("send recipient", 14); initKeymap("jump", 15); initKeymap("viewZoom toggle", 16); initKeymap("toggle displayScore", 17); initKeymap("toggle displayLabels", 18); initKeymap("toggle displayFlagHelp", 19); initKeymap("time backward", 20); initKeymap("time forward", 21); initKeymap("pause", 22); initKeymap("destruct", 23); initKeymap("quit", 24); initKeymap("scrollpanel up_page", 25); initKeymap("scrollpanel down_page", 26); initKeymap("toggle slowKeyboard", 27); initKeymap("toggleFlags radar", 28); initKeymap("toggleFlags main", 29); initKeymap("silence", 30); initKeymap("servercommand", 31); initKeymap("hunt", 32); initKeymap("autopilot", 33); initKeymap("messagepanel all", 34); initKeymap("messagepanel chat", 35); initKeymap("messagepanel server", 36); initKeymap("messagepanel misc", 37); } void Help1Menu::onScan(const std::string& name, bool press, const std::string& cmd) { if (!press) return; KeyKeyMap::iterator it = mappable.find(cmd); if (it == mappable.end()) return; if (it->second.key1.empty()) it->second.key1 = name; else if (it->second.key2.empty()) it->second.key2 = name; } void Help1Menu::onScanCB(const std::string& name, bool press, const std::string& cmd, void* userData) { static_cast(userData)->onScan(name, press, cmd); } void Help1Menu::initKeymap(const std::string& name, int index) { mappable[name].key1 = ""; mappable[name].key2 = ""; mappable[name].index = index; } float Help1Menu::getLeftSide(int _width, int _height) { return 0.5f * _width - _height / 20.0f; } void Help1Menu::resize(int _width, int _height) { // get current key mapping and set strings appropriately KeyKeyMap::iterator it; // clear for (it = mappable.begin(); it != mappable.end(); ++it) { it->second.key1 = ""; it->second.key2 = ""; } // load current settings KEYMGR.iterate(&onScanCB, this); std::vector& listHUD = getControls(); for (it = mappable.begin(); it != mappable.end(); ++it) { std::string value = ""; if (it->second.key1.empty()) { value = ""; } else { value += it->second.key1; if (!it->second.key2.empty()) value += " or " + it->second.key2; } ((HUDuiLabel*)listHUD[it->second.index])->setString(value); } // now do regular resizing HelpMenu::resize(_width, _height); } // // Help2Menu // class Help2Menu : public HelpMenu { public: Help2Menu(); ~Help2Menu() { } }; Help2Menu::Help2Menu() : HelpMenu("General") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("BZFlag is a multi-player networked tank battle game. There are five teams:")); listHUD.push_back(createLabel("red, green, blue, purple, and rogues (rogue tanks are black). Destroying a")); listHUD.push_back(createLabel("player on another team scores a win, while being destroyed or destroying a")); listHUD.push_back(createLabel("teammate scores a loss. Individual and aggregate team scores are tallied.")); listHUD.push_back(createLabel("Rogues have no teammates (not even other rogues),so they cannot shoot")); listHUD.push_back(createLabel("teammates and they don't have a team score.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("There are four styles of play, determined by the server configuration: capture-")); listHUD.push_back(createLabel("the-flag, rabbit-chase, free-for-all and open-free-for-all. In free-for-all the")); listHUD.push_back(createLabel("object is simply to get the highest score by shooting opponents. In open-free-")); listHUD.push_back(createLabel("for-all highest score is still the goal but there are no teams. In rabbit chase,")); listHUD.push_back(createLabel("the white tank tries to stay alive while all other tanks try to hunt and kill it.")); listHUD.push_back(createLabel("The object in capture-the-flag is to capture enemy flags while preventing opponents")); listHUD.push_back(createLabel(" from capturing yours. In this style, each team (but not rogues) has a team base")); listHUD.push_back(createLabel("and each team with at least one player has a team flag which has the color of the team.")); listHUD.push_back(createLabel("To capture a flag, you must grab it and bring it back to your team base (you must be")); listHUD.push_back(createLabel("on the ground in your base to register the capture). Capturing a flag destroys")); listHUD.push_back(createLabel("all the players on that team and gives your team score a bonus; the players will")); listHUD.push_back(createLabel("restart on their team base. Taking your flag onto an enemy base counts as a capture")); listHUD.push_back(createLabel("against your team but not for the enemy team.")); } // // Help3Menu // class Help3Menu : public HelpMenu { public: Help3Menu(); ~Help3Menu() { } }; Help3Menu::Help3Menu() : HelpMenu("Environment") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("The world environment contains an outer wall and several buildings.")); listHUD.push_back(createLabel("You cannot go outside the outer wall (you can't even jump over it).")); listHUD.push_back(createLabel("You cannot normally drive or shoot through buildings.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("The server may be configured to include teleporters: large transparent")); listHUD.push_back(createLabel("black slabs. Objects entering one side of a teleporter are instantly")); listHUD.push_back(createLabel("moved to one side of another (or possibly the same) teleporter. The")); listHUD.push_back(createLabel("teleport is reversible; reentering the same side of the destination")); listHUD.push_back(createLabel("teleporter brings you back to where you started. Teleport connections")); listHUD.push_back(createLabel("are fixed at the start of the game and don't change during the game.")); listHUD.push_back(createLabel("The connections are always the same in the capture-the-flag style.")); listHUD.push_back(createLabel("Each side of a teleporter teleports independently of the other side.")); listHUD.push_back(createLabel("It's possible for a teleporter to teleport to the opposite side of")); listHUD.push_back(createLabel("itself. Such a thru-teleporter acts almost as if it wasn't there.")); listHUD.push_back(createLabel("A teleporter can also teleport to the same side of itself. This is a")); listHUD.push_back(createLabel("reverse teleporter. Shooting at a reverse teleporter is likely to be")); listHUD.push_back(createLabel("self destructive; shooting a laser at one is invariably fatal.")); } // // Help4Menu // class Help4Menu : public HelpMenu { public: Help4Menu(); ~Help4Menu() { } }; Help4Menu::Help4Menu() : HelpMenu("Flags") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("Flags come in two varieties: team flags and super flags. Team flags")); listHUD.push_back(createLabel("are used only in the capture-the-flag style. The server may also be")); listHUD.push_back(createLabel("configured to supply super flags, which give your tank some advantage")); listHUD.push_back(createLabel("or disadvantage. You normally can't tell which until you pick one up,")); listHUD.push_back(createLabel("but good flags generally outnumber bad flags two to one.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("Team flags are not allowed to be in Bad Places. Bad Places are: on")); listHUD.push_back(createLabel("a building or on an enemy base. Team flags dropped in a Bad Place are")); listHUD.push_back(createLabel("moved to a safety position. Captured flags are placed back on their")); listHUD.push_back(createLabel("team base. Super flags dropped above a building always disappear.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("A random good super flag will remain for up to 4 possessions. After")); listHUD.push_back(createLabel("that it'll disappear and will eventually be replaced by a new random")); listHUD.push_back(createLabel("flag. Bad random super flags disappear after the first possession.")); listHUD.push_back(createLabel("Bad super flags can't normally be dropped. The server can be set to")); listHUD.push_back(createLabel("automatically drop the flag for you after some time, after you destroy")); listHUD.push_back(createLabel("a certain number of enemies, and/or when you grab an antidote flag.")); listHUD.push_back(createLabel("Antidote flags are yellow and only appear when you have a bad flag.")); } // // Help5Menu // class Help5Menu : public HelpMenu { public: Help5Menu(); ~Help5Menu() { } protected: float getLeftSide(int width, int height); }; Help5Menu::Help5Menu() : HelpMenu("Good Flags") { std::vector& listHUD = getControls(); listHUD.push_back(createLabel("", "Good Flags:")); FlagSet fs = Flag::getGoodFlags(); for (FlagSet::iterator it = fs.begin(); it != fs.end(); ++it) { if (((*it)->flagQuality != FlagGood) || ((*it)->flagTeam != NoTeam) || (strcmp((*it)->flagName.c_str(),"") == 0)) { continue; } listHUD.push_back(createLabel((*it)->flagHelp.c_str(), (*it)->label().c_str())); } } float Help5Menu::getLeftSide(int _width, int) { return 0.35f * _width; } // // Help6Menu // class Help6Menu : public HelpMenu { public: Help6Menu(); ~Help6Menu() { } protected: float getLeftSide(int width, int height); }; Help6Menu::Help6Menu() : HelpMenu("Bad Flags") { std::vector& listHUD = getControls(); listHUD.push_back(createLabel("", "Bad Flags:")); FlagSet fs = Flag::getBadFlags(); for (FlagSet::iterator it = fs.begin(); it != fs.end(); ++it) { if (((*it)->flagQuality != FlagBad) || ((*it)->flagTeam != NoTeam) || (strcmp((*it)->flagName.c_str(),"") == 0)) { continue; } listHUD.push_back(createLabel((*it)->flagHelp.c_str(), (*it)->label().c_str())); } } float Help6Menu::getLeftSide(int _width, int) { return 0.35f * _width; } // // Help7Menu // class Help7Menu : public HelpMenu { public: Help7Menu(); ~Help7Menu() { } }; Help7Menu::Help7Menu() : HelpMenu("Readouts I") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("The radar is on the left side of the control panel. It shows an overhead")); listHUD.push_back(createLabel("x-ray view of the game. Buildings and the outer wall are shown in light")); listHUD.push_back(createLabel("blue. Team bases are outlined in the team color. Teleporters are short")); listHUD.push_back(createLabel("yellow lines. Tanks are dots in the tank's team color, except rogues are")); listHUD.push_back(createLabel("yellow. The size of the tank's dot is a rough indication of the tank's")); listHUD.push_back(createLabel("altitude: higher tanks have larger dots. Flags are small crosses. Team")); listHUD.push_back(createLabel("flags are in the team color, superflags are white, and the antidote flag")); listHUD.push_back(createLabel("is yellow. Shots are small dots (or lines or circles, for lasers and")); listHUD.push_back(createLabel("shock waves, respectively). Your tank is always dead center and forward")); listHUD.push_back(createLabel("is always up on the radar. The yellow V is your field of view. North")); listHUD.push_back(createLabel("is indicated by the letter N.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("The heads-up-display (HUD) has several displays. The two boxes in the")); listHUD.push_back(createLabel("center of the view are the motion control boxes; within the small box")); listHUD.push_back(createLabel("your tank won't move, outside the large box you don't move any faster than")); listHUD.push_back(createLabel("at the edge of the large box. Moving the mouse above or below the small")); listHUD.push_back(createLabel("box moves forward or backward, respectively. Similarly for left and right.")); listHUD.push_back(createLabel("The distance away from the small box determines the speed.")); } // // Help8Menu // class Help8Menu : public HelpMenu { public: Help8Menu(); ~Help8Menu() { } }; Help8Menu::Help8Menu() : HelpMenu("Readouts II") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("Above the larger box is a tape showing your current heading. North is")); listHUD.push_back(createLabel("0, east is 90, etc. If jumping is allowed or you have the jumping flag,")); listHUD.push_back(createLabel("an altitude tape appears to the right of the larger box.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("Small colored diamonds or arrows may appear on the heading tape. An")); listHUD.push_back(createLabel("arrow pointing left means that a particular flag is to your left, an")); listHUD.push_back(createLabel("arrow pointing right means that the flag is to your right, and a diamond")); listHUD.push_back(createLabel("indicates the heading to the flag by its position on the heading tape.")); listHUD.push_back(createLabel("In capture-the-flag mode a marker always shows where your team flag is.")); listHUD.push_back(createLabel("A yellow marker shows the way to the antidote flag.")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("At the top of the display are, from left to right, your callsign and")); listHUD.push_back(createLabel("score, your status, and the flag you have. Your callsign is in the")); listHUD.push_back(createLabel("color of your team. Your status is one of: ready, dead, sealed, zoned")); listHUD.push_back(createLabel("or reloading (showing the time until reloaded). It can also show the")); listHUD.push_back(createLabel("time until a bad flag is dropped (if there's a time limit).")); listHUD.push_back(createLabel("")); listHUD.push_back(createLabel("Other informational messages may occasionally flash on the HUD.")); } // // Help9Menu // class Help9Menu : public HelpMenu { public: Help9Menu(); ~Help9Menu() { } protected: float getLeftSide(int width, int height); }; Help9Menu::Help9Menu() : HelpMenu("Credits") { // add controls std::vector& listHUD = getControls(); listHUD.push_back(createLabel("Tim Riker", "Maintainer:")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("Chris Schoeneman", "Original Author:")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("David Hoeferlin, Tom Hubina", "Code Contributors:")); listHUD.push_back(createLabel("Dan Kartch, Jed Lengyel", "")); listHUD.push_back(createLabel("Jeff Myers, Tim Olson", "")); listHUD.push_back(createLabel("Brian Smits, Greg Spencer", "")); listHUD.push_back(createLabel("Daryll Strauss, Frank Thilo", "")); listHUD.push_back(createLabel("Dave Brosius, David Trowbridge", "")); listHUD.push_back(createLabel("Sean Morrison, Tupone Alfredo", "")); listHUD.push_back(createLabel("Lars Luthman, Nils McCarthy", "")); listHUD.push_back(createLabel("Daniel Remenak", "")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("Tamar Cohen", "Tank Models:")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("Kevin Novins, Rick Pasetto", "Special Thanks:")); listHUD.push_back(createLabel("Adam Rosen, Erin Shaw", "")); listHUD.push_back(createLabel("Ben Trumbore, Don Greenberg", "")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("http://BZFlag.org/", "BZFlag Home Page:")); listHUD.push_back(createLabel("", "")); listHUD.push_back(createLabel("Tim Riker", "Copyright (c) 1993-2012")); } float Help9Menu::getLeftSide(int _width, int _height) { return 0.5f * _width - _height / 20.0f; } // // help menu getter // static const int numHelpMenus = 9; HelpMenu** HelpMenu::helpMenus = NULL; HelpMenu* HelpMenu::getHelpMenu(HUDDialog* dialog, bool next) { if (!helpMenus) { helpMenus = new HelpMenu*[numHelpMenus]; helpMenus[0] = new Help1Menu; helpMenus[1] = new Help2Menu; helpMenus[2] = new Help3Menu; helpMenus[3] = new Help4Menu; helpMenus[4] = new Help5Menu; helpMenus[5] = new Help6Menu; helpMenus[6] = new Help7Menu; helpMenus[7] = new Help8Menu; helpMenus[8] = new Help9Menu; } for (int i = 0; i < numHelpMenus; i++) { if (dialog == helpMenus[i]) { if (next) { return helpMenus[(i + 1) % numHelpMenus]; } else { return helpMenus[(i - 1 + numHelpMenus) % numHelpMenus]; } } } return next ? helpMenus[0] : helpMenus[numHelpMenus - 1]; } void HelpMenu::done() { if (helpMenus) { for (int i = 0; i < numHelpMenus; i++) { delete helpMenus[i]; } delete[] helpMenus; helpMenus = NULL; } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/HelpMenu.h000066400000000000000000000031511200563112200173610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __HELPMENU_H__ #define __HELPMENU_H__ /* common interface headers */ #include "BzfEvent.h" /* local interface headers */ #include "HUDDialog.h" #include "HUDuiDefaultKey.h" #include "HUDuiControl.h" #include "MenuDefaultKey.h" class MenuDefaultKey; class HelpMenuDefaultKey : public MenuDefaultKey { public: HelpMenuDefaultKey() { } ~HelpMenuDefaultKey() { } bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); }; class HelpMenu : public HUDDialog { public: HelpMenu(const char* title = "Help"); ~HelpMenu() { } HUDuiDefaultKey* getDefaultKey() { return &defaultKey; } void execute() { } void resize(int width, int height); static HelpMenu* getHelpMenu(HUDDialog* = NULL, bool next = true); static void done(); protected: HUDuiControl* createLabel(const char* string, const char* label = NULL); virtual float getLeftSide(int width, int height); private: HelpMenuDefaultKey defaultKey; static HelpMenu** helpMenus; }; #endif /* __HELPMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/InputMenu.cxx000066400000000000000000000223771200563112200201560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "InputMenu.h" /* common implementation headers */ #include "StateDatabase.h" #include "FontManager.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDDialogStack.h" #include "LocalPlayer.h" #include "playing.h" #include "HUDui.h" InputMenu::InputMenu() : keyboardMapMenu(NULL) { std::string currentJoystickDevice = BZDB.get("joystickname"); // cache font face ID int fontFace = MainMenu::getFontFace(); // add controls std::vector& listHUD = getControls(); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Input Settings"); listHUD.push_back(label); keyMapping = new HUDuiLabel; keyMapping->setFontFace(fontFace); keyMapping->setLabel("Change Key Mapping"); listHUD.push_back(keyMapping); HUDuiList* option = new HUDuiList; option = new HUDuiList; std::vector* options = &option->getList(); // set joystick Device option->setFontFace(fontFace); option->setLabel("Joystick device:"); option->setCallback(callback, (void*)"J"); options = &option->getList(); options->push_back(std::string("Off")); std::vector joystickDevices; getMainWindow()->getJoyDevices(joystickDevices); int i; for (i = 0; i < (int)joystickDevices.size(); i++) { options->push_back(joystickDevices[i]); } joystickDevices.erase(joystickDevices.begin(), joystickDevices.end()); for (i = 0; i < (int)options->size(); i++) { if ((*options)[i].compare(currentJoystickDevice) == 0) { option->setIndex(i); break; } } option->update(); listHUD.push_back(option); activeInput = new HUDuiList; activeInput->setFontFace(fontFace); activeInput->setLabel("Active input device:"); activeInput->setCallback(callback, (void*)"A"); options = &activeInput->getList(); options->push_back("Auto"); options->push_back(LocalPlayer::getInputMethodName(LocalPlayer::Keyboard)); options->push_back(LocalPlayer::getInputMethodName(LocalPlayer::Mouse)); options->push_back(LocalPlayer::getInputMethodName(LocalPlayer::Joystick)); activeInput->update(); listHUD.push_back(activeInput); option = new HUDuiList; // force feedback option->setFontFace(fontFace); option->setLabel("Force feedback:"); option->setCallback(callback, (void*)"F"); options = &option->getList(); options->push_back(std::string("None")); options->push_back(std::string("Rumble")); options->push_back(std::string("Directional")); for (i = 0; i < (int)options->size(); i++) { std::string currentOption = (*options)[i]; if (BZDB.get("forceFeedback") == currentOption) option->setIndex(i); } option->update(); listHUD.push_back(option); option = new HUDuiList; // axis settings jsx = option; option->setFontFace(fontFace); option->setLabel("Joystick X Axis:"); option->setCallback(callback, (void*)"X"); listHUD.push_back(option); option = new HUDuiList; jsy = option; option->setFontFace(fontFace); option->setLabel("Joystick Y Axis:"); option->setCallback(callback, (void*)"Y"); listHUD.push_back(option); fillJSOptions(); option = new HUDuiList; // confine mouse option->setFontFace(fontFace); option->setLabel("Confine mouse:"); option->setCallback(callback, (void*)"G"); options = &option->getList(); options->push_back(std::string("No")); options->push_back(std::string("Window")); options->push_back(std::string("MotionBox")); if (getMainWindow()->isGrabEnabled()) { option->setIndex(1); } else if (BZDB.isTrue("mouseClamp")) { option->setIndex(2); } else { option->setIndex(0); } option->update(); listHUD.push_back(option); option = new HUDuiList; // jump while typing on/off option->setFontFace(fontFace); option->setLabel("Jump while typing:"); option->setCallback(callback, (void*)"H"); options = &option->getList(); options->push_back(std::string("No")); options->push_back(std::string("Yes")); option->setIndex(BZDB.isTrue("jumpTyping") ? 1 : 0); option->update(); listHUD.push_back(option); initNavigation(listHUD, 1,listHUD.size()-1); } InputMenu::~InputMenu() { delete keyboardMapMenu; } void InputMenu::fillJSOptions() { std::vector* xoptions = &jsx->getList(); std::vector* yoptions = &jsy->getList(); std::vector joystickAxes; getMainWindow()->getJoyDeviceAxes(joystickAxes); if (joystickAxes.empty()) joystickAxes.push_back("N/A"); int i; for (i = 0; i < (int)joystickAxes.size(); i++) { xoptions->push_back(joystickAxes[i]); yoptions->push_back(joystickAxes[i]); } bool found = false; for (i = 0; i < (int)xoptions->size(); i++) { std::string currentOption = (*xoptions)[i]; if (BZDB.get("jsXAxis") == currentOption) { jsx->setIndex(i); found = true; } } if (!found) jsx->setIndex(0); jsx->update(); found = false; for (i = 0; i < (int)yoptions->size(); i++) { std::string currentOption = (*yoptions)[i]; if (BZDB.get("jsYAxis") == currentOption) { jsy->setIndex(i); found = true; } } if (!found) { if (yoptions->size() > 1) jsy->setIndex(1); else jsy->setIndex(0); } jsy->update(); } void InputMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == keyMapping) { if (!keyboardMapMenu) keyboardMapMenu = new KeyboardMapMenu; HUDDialogStack::get()->push(keyboardMapMenu); } } void InputMenu::callback(HUDuiControl* w, void* data) { HUDuiList* listHUD = (HUDuiList*)w; std::vector *options = &listHUD->getList(); std::string selectedOption = (*options)[listHUD->getIndex()]; switch (((const char*)data)[0]) { /* Joystick name */ case 'J': BZDB.set("joystickname", selectedOption); getMainWindow()->initJoystick(selectedOption); // re-fill all of the joystick-specific options lists // fillJSOptions(); break; /* Joystick x-axis */ case 'X': BZDB.set("jsXAxis", selectedOption); getMainWindow()->setJoyXAxis(selectedOption); break; /* Joystick y-axis */ case 'Y': BZDB.set("jsYAxis", selectedOption); getMainWindow()->setJoyYAxis(selectedOption); break; /* Active input device */ case 'A': { LocalPlayer* myTank = LocalPlayer::getMyTank(); // Are we forced to use one input device, or do we allow it to change automatically? if (selectedOption == "Auto") { BZDB.set("allowInputChange", "1"); } else { BZDB.set("allowInputChange", "0"); BZDB.set("activeInputDevice", selectedOption); // Set the current input device to whatever we're forced to if (myTank) { myTank->setInputMethod(BZDB.get("activeInputDevice")); } } } break; /* Grab mouse */ case 'G': { const bool grabbing = (selectedOption == "Window"); BZDB.set("mousegrab", grabbing ? "1" : "0"); getMainWindow()->enableGrabMouse(grabbing); const bool clamped = (selectedOption == "MotionBox"); BZDB.set("mouseClamp", clamped ? "1" : "0"); } break; /* Jump while typing */ case 'H': { bool jump = (selectedOption == "Yes"); BZDB.setBool("jumpTyping", jump ? true : false); } break; /* Force feedback */ case 'F': BZDB.set("forceFeedback", selectedOption); break; } } void InputMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); int i; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * ((float)_width + 0.5f * titleWidth); y -= 0.6f * titleHeight; const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); const int count = listHUD.size(); for (i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } // load current settings std::vector *options = &activeInput->getList(); for (i = 0; i < (int)options->size(); i++) { std::string currentOption = (*options)[i]; if (BZDB.get("activeInputDevice") == currentOption) activeInput->setIndex(i); } if (BZDB.isTrue("allowInputChange")) activeInput->setIndex(0); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/InputMenu.h000066400000000000000000000026231200563112200175730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __INPUTMENU_H__ #define __INPUTMENU_H__ #include "common.h" /* common interface headers */ #include "HUDDialog.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "KeyboardMapMenu.h" #include "HUDuiControl.h" #include "HUDuiList.h" #include "HUDuiDefaultKey.h" /** this class provides options for setting the gui */ class InputMenu : public HUDDialog { public: InputMenu(); ~InputMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); void fillJSOptions(); private: HUDuiControl* keyMapping; HUDuiList* activeInput; HUDuiList* jsx; HUDuiList* jsy; KeyboardMapMenu* keyboardMapMenu; }; #endif /* __INPUTMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/JoinMenu.cxx000066400000000000000000000227211200563112200177470ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "JoinMenu.h" // system headers #include // common implementation headers #include "FontManager.h" #include "Protocol.h" #include "BundleMgr.h" #include "Bundle.h" // local implementation headers #include "HUDDialogStack.h" #include "MainMenu.h" #include "ServerMenu.h" #include "ServerStartMenu.h" #include "TextureManager.h" #include "playing.h" #include "HUDui.h" JoinMenu* JoinMenu::activeMenu = NULL; JoinMenu::JoinMenu() : serverStartMenu(NULL), serverMenu(NULL) { // cache font face ID int fontFace = MainMenu::getFontFace(); // add controls std::vector& listHUD = getControls(); StartupInfo* info = getStartupInfo(); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Join Game"); listHUD.push_back(label); findServer = new HUDuiLabel; findServer->setFontFace(fontFace); findServer->setString("Find Server"); listHUD.push_back(findServer); connectLabel = new HUDuiLabel; connectLabel->setFontFace(fontFace); connectLabel->setString("Connect"); listHUD.push_back(connectLabel); callsign = new HUDuiTypeIn; callsign->setFontFace(fontFace); callsign->setLabel("Callsign:"); callsign->setMaxLength(CallSignLen - 1); callsign->setString(info->callsign); listHUD.push_back(callsign); password = new HUDuiTypeIn; password->setObfuscation(true); password->setFontFace(fontFace); password->setLabel("Password:"); password->setMaxLength(CallSignLen - 1); password->setString(info->password); listHUD.push_back(password); team = new HUDuiList; team->setFontFace(fontFace); team->setLabel("Team:"); team->setCallback(teamCallback, this); std::vector& teams = team->getList(); // these do not need to be in enum order, but must match getTeam() & setTeam() teams.push_back(std::string(Team::getName(AutomaticTeam))); teams.push_back(std::string(Team::getName(RogueTeam))); teams.push_back(std::string(Team::getName(RedTeam))); teams.push_back(std::string(Team::getName(GreenTeam))); teams.push_back(std::string(Team::getName(BlueTeam))); teams.push_back(std::string(Team::getName(PurpleTeam))); teams.push_back(std::string(Team::getName(ObserverTeam))); team->update(); setTeam(info->team); listHUD.push_back(team); teamIcon = new HUDuiTextureLabel; teamIcon->setFontFace(fontFace); teamIcon->setString(" "); updateTeamTexture(); listHUD.push_back(teamIcon); server = new HUDuiTypeIn; server->setFontFace(fontFace); server->setLabel("Server:"); server->setMaxLength(64); server->setString(info->serverName); listHUD.push_back(server); char buffer[10]; sprintf(buffer, "%d", info->serverPort); port = new HUDuiTypeIn; port->setFontFace(fontFace); port->setLabel("Port:"); port->setMaxLength(5); port->setString(buffer); listHUD.push_back(port); motto = new HUDuiTypeIn; motto->setFontFace(fontFace); motto->setLabel("Motto:"); motto->setMaxLength(MottoLen - 1); motto->setString(info->motto); listHUD.push_back(motto); startServer = new HUDuiLabel; startServer->setFontFace(fontFace); startServer->setString("Start Server"); listHUD.push_back(startServer); status = new HUDuiLabel; status->setFontFace(fontFace); status->setString(""); listHUD.push_back(status); failedMessage = new HUDuiLabel; failedMessage->setFontFace(fontFace); failedMessage->setString(""); listHUD.push_back(failedMessage); initNavigation(listHUD, 1, listHUD.size() - 3); // cut teamIcon out of the nav loop team->setNext(server); server->setPrev(team); } JoinMenu::~JoinMenu() { delete serverStartMenu; delete serverMenu; } HUDuiDefaultKey* JoinMenu::getDefaultKey() { return MenuDefaultKey::getInstance(); } void JoinMenu::show() { activeMenu = this; StartupInfo* info = getStartupInfo(); // set fields callsign->setString(info->callsign); password->setString(info->password); setTeam(info->team); server->setString(info->serverName); char buffer[10]; sprintf(buffer, "%d", info->serverPort); port->setString(buffer); // clear status setStatus(""); setFailedMessage(""); } void JoinMenu::dismiss() { loadInfo(); activeMenu = NULL; } void JoinMenu::loadInfo() { // load startup info with current settings StartupInfo* info = getStartupInfo(); if (strcmp(info->callsign, callsign->getString().c_str())) { strcpy(info->callsign, callsign->getString().c_str()); info->token[0] = '\0'; } if (strcmp(info->password, password->getString().c_str())) { strcpy(info->password, password->getString().c_str()); info->token[0] = '\0'; } info->team = getTeam(); strcpy(info->serverName, server->getString().c_str()); info->serverPort = atoi(port->getString().c_str()); strcpy(info->motto, motto->getString().c_str()); } void JoinMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == startServer) { if (!serverStartMenu) serverStartMenu = new ServerStartMenu; HUDDialogStack::get()->push(serverStartMenu); } else if (_focus == findServer) { if (!serverMenu) serverMenu = new ServerMenu; HUDDialogStack::get()->push(serverMenu); } else if (_focus == connectLabel) { // load startup info loadInfo(); // make sure we've got what we need StartupInfo* info = getStartupInfo(); if (info->callsign[0] == '\0') { setStatus("You must enter a callsign."); return; } if (info->serverName[0] == '\0') { setStatus("You must enter a server."); return; } if (info->serverPort <= 0 || info->serverPort > 65535) { char buffer[60]; sprintf(buffer, "Port is invalid. Try %d.", ServerPort); setStatus(buffer); return; } // let user know we're trying if (startupInfo.autoConnect) { setStatus("Trying Automatic Connection..."); startupInfo.autoConnect = false; } else { setStatus("Trying..."); } // schedule attempt to join game joinGame(); } } void JoinMenu::setFailedMessage(const char* msg) { failedMessage->setString(msg); FontManager &fm = FontManager::instance(); const float _width = fm.getStrLength(MainMenu::getFontFace(), failedMessage->getFontSize(), failedMessage->getString()); failedMessage->setPosition(center - 0.5f * _width, failedMessage->getY()); } TeamColor JoinMenu::getTeam() const { return team->getIndex() == 0 ? AutomaticTeam : TeamColor(team->getIndex() - 1); } void JoinMenu::setTeam(TeamColor teamcol) { team->setIndex(teamcol == AutomaticTeam ? 0 : int(teamcol) + 1); } void JoinMenu::setStatus(const char* msg, const std::vector *) { status->setString(msg); FontManager &fm = FontManager::instance(); const float _width = fm.getStrLength(status->getFontFace(), status->getFontSize(), status->getString()); status->setPosition(center - 0.5f * _width, status->getY()); } void JoinMenu::teamCallback(HUDuiControl*, void* source) { ((JoinMenu*)source)->updateTeamTexture(); } void JoinMenu::updateTeamTexture() { TextureManager &tm = TextureManager::instance(); FontManager &fm = FontManager::instance(); // load the appropriate texture std::string texture; if (getTeam() == AutomaticTeam) texture = "automatic_"; else texture = Team::getImagePrefix(getTeam()); texture += "icon"; int id = tm.getTextureID(texture.c_str()); teamIcon->setTexture(id); // make it big enough teamIcon->setFontSize(team->getFontSize() * 1.5f); // put it at the end of the text Bundle *bdl = BundleMgr::getCurrentBundle(); const float x = team->getX() + fm.getStrLength(team->getFontFace(), team->getFontSize(), bdl->getLocalString(team->getList()[team->getIndex()]) + "x"); teamIcon->setPosition(x, team->getY()); } void JoinMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 36.0f; center = 0.5f * (float)_width; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, ""); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * ((float)_width - 0.5f * titleWidth); y -= 0.6f * titleHeight; listHUD[1]->setFontSize(fontSize); const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, ""); const int count = listHUD.size(); for (int i = 1; i < count; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); if (i != 5) y -= 1.0f * h; if (i <= 2 || i == 9) y -= 0.5f * h; } updateTeamTexture(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/JoinMenu.h000066400000000000000000000040131200563112200173660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __JOINMENU_H__ #define __JOINMENU_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "global.h" /* local interface headers */ #include "HUDDialog.h" #include "HUDuiDefaultKey.h" #include "HUDuiControl.h" #include "HUDuiLabel.h" #include "HUDuiList.h" #include "HUDuiTypeIn.h" #include "HUDuiTextureLabel.h" class ServerStartMenu; class ServerMenu; class JoinMenu : public HUDDialog { public: JoinMenu(); ~JoinMenu(); HUDuiDefaultKey* getDefaultKey(); void show(); void execute(); void dismiss(); void resize(int width, int height); void updateTeamTexture(); private: static void teamCallback(HUDuiControl*, void*); TeamColor getTeam() const; void setTeam(TeamColor); void setStatus(const char*, const std::vector *parms = NULL); void setFailedMessage(const char* msg); void loadInfo(); private: float center; HUDuiTypeIn* callsign; HUDuiTypeIn* password; HUDuiTypeIn* motto; HUDuiList* team; HUDuiTextureLabel* teamIcon; HUDuiTypeIn* server; HUDuiTypeIn* port; HUDuiLabel* status; HUDuiLabel* startServer; HUDuiLabel* findServer; HUDuiLabel* connectLabel; HUDuiLabel* failedMessage; ServerStartMenu* serverStartMenu; ServerMenu* serverMenu; static JoinMenu* activeMenu; }; #endif /* __JOINMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/KeyboardMapMenu.cxx000066400000000000000000000267261200563112200212570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "KeyboardMapMenu.h" // System headers #include /* common implementation headers */ #include "KeyManager.h" #include "FontManager.h" /* local implementation headers */ #include "ActionBinding.h" #include "HUDDialogStack.h" #include "MainMenu.h" #include "playing.h" #include "HUDui.h" KeyboardMapMenuDefaultKey::KeyboardMapMenuDefaultKey(KeyboardMapMenu* _menu) : menu(_menu) { // do nothing } bool KeyboardMapMenuDefaultKey::keyPress(const BzfKeyEvent& key) { // escape key has usual effect if (key.ascii == 27) return MenuDefaultKey::keyPress(key); // keys have normal effect if not editing if (!menu->isEditing()) return MenuDefaultKey::keyPress(key); // ignore keys we don't know if (key.ascii != 0 && isspace(key.ascii)) { if (key.ascii != ' ' && key.ascii != '\t' && key.ascii != '\r') return true; } // all other keys modify mapping menu->setKey(key); return true; } bool KeyboardMapMenuDefaultKey::keyRelease(const BzfKeyEvent&) { // ignore key releases return true; } KeyboardMapMenu::KeyboardMapMenu() : defaultKey(this), editing(-1), quickKeysMenu(NULL) { // add controls std::vector& controls = getControls(); controls.push_back(createLabel("Key Mapping")); controls.push_back(createLabel("Use up/down arrows to navigate, enter key to enter edit mode")); controls.push_back(reset = createLabel(NULL, "Reset Defaults")); controls.push_back(createLabel("fire", "Fire shot:")); controls.push_back(createLabel(NULL, "Drop flag:")); controls.push_back(createLabel(NULL, "Identify/Lock On:")); controls.push_back(createLabel(NULL, "Radar Short:")); controls.push_back(createLabel(NULL, "Radar Medium:")); controls.push_back(createLabel(NULL, "Radar Long:")); controls.push_back(createLabel(NULL, "Radar Zoom In:")); controls.push_back(createLabel(NULL, "Radar Zoom Out:")); controls.push_back(createLabel(NULL, "Send to All:")); controls.push_back(createLabel(NULL, "Send to Teammates:")); controls.push_back(createLabel(NULL, "Send to Nemesis:")); controls.push_back(createLabel(NULL, "Send to Recipient:")); controls.push_back(createLabel(NULL, "Send to Admin:")); controls.push_back(createLabel(NULL, "Jump:")); controls.push_back(createLabel(NULL, "Binoculars:")); controls.push_back(createLabel(NULL, "Toggle Score:")); controls.push_back(createLabel(NULL, "Toggle Radar:")); controls.push_back(createLabel(NULL, "Toggle Console:")); controls.push_back(createLabel(NULL, "Tank Labels:")); controls.push_back(createLabel(NULL, "Flag Help:")); controls.push_back(createLabel(NULL, "Time Forward:")); controls.push_back(createLabel(NULL, "Time Backward:")); controls.push_back(createLabel(NULL, "Pause/Resume:")); controls.push_back(createLabel(NULL, "Self Destruct/Cancel:")); controls.push_back(createLabel(NULL, "Fast Quit:")); controls.push_back(createLabel(NULL, "Scroll Backward:")); controls.push_back(createLabel(NULL, "Scroll Forward:")); controls.push_back(createLabel(NULL, "Scroll Bottom:")); controls.push_back(createLabel(NULL, "Slow Keyboard Motion:")); controls.push_back(createLabel(NULL, "Toggle Flags On Radar:")); controls.push_back(createLabel(NULL, "Toggle Flags On Field:")); controls.push_back(createLabel(NULL, "Silence/UnSilence Key:")); controls.push_back(createLabel(NULL, "Server Command Key:")); controls.push_back(createLabel(NULL, "Hunt Key:")); controls.push_back(createLabel(NULL, "Add/Modify Hunt Key:")); controls.push_back(createLabel(NULL, "AutoPilot Key: ")); controls.push_back(createLabel(NULL, "Main Message Tab: ")); controls.push_back(createLabel(NULL, "Chat Message Tab: ")); controls.push_back(createLabel(NULL, "Server Message Tab: ")); controls.push_back(createLabel(NULL, "Misc Message Tab: ")); controls.push_back(createLabel(NULL, "Forward Key: ")); controls.push_back(createLabel(NULL, "Reverse Key: ")); controls.push_back(createLabel(NULL, "Left Key: ")); controls.push_back(createLabel(NULL, "Right Key: ")); controls.push_back(createLabel(NULL, "Restart:")); controls.push_back(createLabel(NULL, "Iconify:")); controls.push_back(createLabel(NULL, "Fullscreen:")); controls.push_back(createLabel(NULL, "Screenshot:")); controls.push_back(quickKeys = createLabel(NULL, "Define Quick Keys")); initNavigation(controls, 2, controls.size()-1); int i = 3; initkeymap("fire", i); initkeymap("drop", ++i); initkeymap("identify", ++i); initkeymap("set displayRadarRange 0.25", ++i); initkeymap("set displayRadarRange 0.5", ++i); initkeymap("set displayRadarRange 1.0", ++i); initkeymap("radarZoom in", ++i); initkeymap("radarZoom out", ++i); initkeymap("send all", ++i); initkeymap("send team", ++i); initkeymap("send nemesis", ++i); initkeymap("send recipient", ++i); initkeymap("send admin",++i); initkeymap("jump", ++i); initkeymap("viewZoom toggle", ++i); initkeymap("toggle displayScore", ++i); initkeymap("toggleRadar", ++i); initkeymap("toggleConsole", ++i); initkeymap("toggle displayLabels", ++i); initkeymap("toggle displayFlagHelp", ++i); initkeymap("time forward", ++i); initkeymap("time backward", ++i); initkeymap("pause", ++i); initkeymap("destruct", ++i); initkeymap("quit", ++i); initkeymap("scrollpanel up_page", ++i); initkeymap("scrollpanel down_page", ++i); initkeymap("scrollpanel bottom", ++i); initkeymap("toggle slowKeyboard", ++i); initkeymap("toggleFlags radar", ++i); initkeymap("toggleFlags main", ++i); initkeymap("silence", ++i); initkeymap("servercommand", ++i); initkeymap("hunt", ++i); initkeymap("addhunt", ++i); initkeymap("autopilot", ++i); initkeymap("messagepanel all", ++i); initkeymap("messagepanel chat", ++i); initkeymap("messagepanel server", ++i); initkeymap("messagepanel misc", ++i); initkeymap("drive forward", ++i); initkeymap("drive reverse", ++i); initkeymap("turn left", ++i); initkeymap("turn right", ++i); initkeymap("restart", ++i); initkeymap("iconify", ++i); initkeymap("fullscreen", ++i); initkeymap("screenshot", ++i); } void KeyboardMapMenu::initkeymap(const std::string& name, int index) { mappable[name].key1 = ""; mappable[name].key2 = ""; mappable[name].index = index; } bool KeyboardMapMenu::isEditing() const { return editing != -1; } void KeyboardMapMenu::setKey(const BzfKeyEvent& event) { if (editing == -1) return; KeyKeyMap::iterator it; for (it = mappable.begin(); it != mappable.end(); ++it) if (it->second.index == editing) break; if ((KEYMGR.keyEventToString(event) == it->second.key1 && it->second.key2.empty()) || (KEYMGR.keyEventToString(event) == it->second.key2)) return; ActionBinding::instance().associate(KEYMGR.keyEventToString(event), it->first); editing = -1; update(); } void KeyboardMapMenu::execute() { const HUDuiControl* const _focus = HUDui::getFocus(); if (_focus == reset) { ActionBinding::instance().resetBindings(); update(); } else if (_focus == quickKeys) { if (!quickKeysMenu) quickKeysMenu = new QuickKeysMenu; HUDDialogStack::get()->push(quickKeysMenu); } else { // start editing std::vector& listHUD = getControls(); KeyKeyMap::iterator it; for (it = mappable.begin(); it != mappable.end(); ++it) if (listHUD[it->second.index] == _focus) { editing = it->second.index; if (!it->second.key1.empty() && !it->second.key2.empty()) { ActionBinding::instance().deassociate(it->first); } } } update(); } void KeyboardMapMenu::dismiss() { editing = -1; notifyBzfKeyMapChanged(); } void KeyboardMapMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); int i; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float bigFontSize = (float)_height / 42.0f; const float fontSize = (float)_height / 100.0f; FontManager &fm = FontManager::instance(); const int fontFace = MainMenu::getFontFace(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(fontFace, titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(fontFace, titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition help HUDuiLabel* help = (HUDuiLabel*)listHUD[1]; help->setFontSize(bigFontSize); const float helpWidth = fm.getStrLength(fontFace, bigFontSize, help->getString()); x = 0.5f * ((float)_width - helpWidth); y -= 1.1f * fm.getStrHeight(fontFace, bigFontSize, " "); help->setPosition(x, y); // reposition options in two columns x = 0.30f * (float)_width; const float topY = y - (0.6f * titleHeight); y = topY; listHUD[2]->setFontSize(fontSize); const float h = fm.getStrHeight(fontFace, fontSize, " "); const int count = listHUD.size() - 2; const int mid = (count / 2); for (i = 2; i <= mid+1; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } x = 0.80f * (float)_width; y = topY; for (i = mid+2; i < count+2; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } update(); } void KeyboardMapMenu::update() { KeyKeyMap::iterator it; // clear for (it = mappable.begin(); it != mappable.end(); ++it) { it->second.key1 = ""; it->second.key2 = ""; } // load current settings KEYMGR.iterate(&onScanCB, this); std::vector& listHUD = getControls(); for (it = mappable.begin(); it != mappable.end(); ++it) { std::string value = ""; if (it->second.key1.empty()) { if (isEditing() && (it->second.index == editing)) value = "???"; else value = ""; } else { value += it->second.key1; if (!it->second.key2.empty()) { value += " or " + it->second.key2; } else if (isEditing() && (it->second.index == editing)) { value += " or ???"; } } ((HUDuiLabel*)listHUD[it->second.index])->setString(value); } } void KeyboardMapMenu::onScan(const std::string& name, bool press, const std::string& cmd) { if (!press && cmd == "fire") return; KeyKeyMap::iterator it = mappable.find(cmd); if (it == mappable.end()) return; if (it->second.key1.empty()) it->second.key1 = name; else if (it->second.key2.empty() && it->second.key1 != name) it->second.key2 = name; } void KeyboardMapMenu::onScanCB(const std::string& name, bool press, const std::string& cmd, void* userData) { static_cast(userData)->onScan(name, press, cmd); } HUDuiLabel* KeyboardMapMenu::createLabel(const char* str, const char* _label) { HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); if (str) label->setString(str); if (_label) label->setLabel(_label); return label; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/KeyboardMapMenu.h000066400000000000000000000045071200563112200206750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __KEYBOARDMAPMENU_H__ #define __KEYBOARDMAPMENU_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "BzfEvent.h" /* local interface headers */ #include "HUDuiDefaultKey.h" #include "HUDuiLabel.h" #include "HUDuiControl.h" #include "HUDDialog.h" #include "QuickKeysMenu.h" #include "MenuDefaultKey.h" class KeyboardMapMenu; class KeyboardMapMenuDefaultKey : public MenuDefaultKey { public: KeyboardMapMenuDefaultKey(KeyboardMapMenu*); ~KeyboardMapMenuDefaultKey() { } bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); public: KeyboardMapMenu* menu; }; class KeyboardMapMenu : public HUDDialog { public: KeyboardMapMenu(); ~KeyboardMapMenu() { delete quickKeysMenu; } HUDuiDefaultKey* getDefaultKey() { return &defaultKey; } void execute(); void dismiss(); void resize(int width, int height); bool isEditing() const; void setKey(const BzfKeyEvent&); void onScan(const std::string& name, bool press, const std::string& cmd); static void onScanCB(const std::string& name, bool press, const std::string& cmd, void* userData); private: void update(); HUDuiLabel* createLabel(const char*, const char* = NULL); void initkeymap(const std::string& name, int index); private: struct keymap { int index; // ui label index std::string key1; std::string key2; }; typedef std::map KeyKeyMap; KeyKeyMap mappable; KeyboardMapMenuDefaultKey defaultKey; HUDuiControl* reset; HUDuiControl* quickKeys; int editing; QuickKeysMenu* quickKeysMenu; }; #endif /* __KEYBOARDMAPMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/LocalCommand.cxx000066400000000000000000000027251200563112200205560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "LocalCommand.h" // system headers #include LocalCommand::MapOfCommands *LocalCommand::mapOfCommands = NULL; LocalCommand::LocalCommand(std::string _commandName) : commandName(_commandName) { if (!mapOfCommands) mapOfCommands = new MapOfCommands; (*mapOfCommands)[commandName] = this; } LocalCommand::~LocalCommand() { (*mapOfCommands).erase(commandName); } bool LocalCommand::execute(const char *commandLine) { if (!mapOfCommands) return false; int i; for (i = 0; commandLine[i] && !isspace(commandLine[i]); i++) ; std::string commandToken(commandLine, i); std::map::iterator it = (*mapOfCommands).find(commandToken); if (it == (*mapOfCommands).end()) return false; return (*(it->second))(commandLine); } bool LocalCommand::operator() (const char *) { return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/LocalCommand.h000066400000000000000000000021361200563112200201770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LOCALCOMMAND_H__ #define __LOCALCOMMAND_H__ // bzflag global header #include "common.h" /* system headers */ #include #include class LocalCommand { public: static bool execute(const char *commandToken); protected: LocalCommand(std::string _commandName); virtual ~LocalCommand(); virtual bool operator () (const char *commandToken); std::string commandName; typedef std::map MapOfCommands; static MapOfCommands *mapOfCommands; }; #endif // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/LocalPlayer.cxx000066400000000000000000001434501200563112200204350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "LocalPlayer.h" /* common implementation headers */ #include "CommandManager.h" #include "BZDBCache.h" #include "FlagSceneNode.h" #include "CollisionManager.h" #include "PhysicsDriver.h" #include "BzfEvent.h" #include "WallObstacle.h" #include "MeshObstacle.h" /* local implementation headers */ #include "World.h" #include "sound.h" #include "ForceFeedback.h" #include "effectsRenderer.h" LocalPlayer* LocalPlayer::mainPlayer = NULL; LocalPlayer::LocalPlayer(const PlayerId& _id, const char* name, const char* _motto) : BaseLocalPlayer(_id, name, _motto), gettingSound(true), server(ServerLink::getServer()), location(Dead), firingStatus(Deceased), flagShakingTime(0.0f), flagShakingWins(0), antidoteFlag(NULL), desiredSpeed(0.0f), desiredAngVel(0.0f), lastSpeed(0.0f), anyShotActive(false), target(NULL), nemesis(NULL), recipient(NULL), inputChanged(false), stuckFrameCount(0), spawning(false), wingsFlapCount(0), left(false), right(false), up(false), down(false), entryDrop(true), wantJump(false), jumpPressed(false), deathPhyDrv(-1) { // initialize shots array to no shots fired const int numShots = World::getWorld()->getMaxShots(); shots = new LocalShotPath*[numShots]; for (int i = 0; i < numShots; i++) shots[i] = NULL; // set input method if (BZDB.isTrue("allowInputChange")) { inputMethod = Mouse; } else { setInputMethod(BZDB.get("activeInputDevice")); } } LocalPlayer::~LocalPlayer() { // free shots const int numShots = World::getWorld()->getMaxShots(); for (int i = 0; i < numShots; i++) if (shots[i]) delete shots[i]; delete[] shots; // free antidote flag delete antidoteFlag; } void LocalPlayer::setMyTank(LocalPlayer* player) { mainPlayer = player; } void LocalPlayer::doUpdate(float dt) { const bool hadShotActive = anyShotActive; const int numShots = World::getWorld()->getMaxShots(); static TimeKeeper pauseTime = TimeKeeper::getNullTime(); static bool wasPaused = false; // if paused then boost the reload times by dt (so that, effectively, // reloading isn't performed) int i; if (isPaused()) { for (i = 0; i < numShots; i++) { if (shots[i]) { shots[i]->boostReloadTime(dt); } } // if we've been paused for a long time, drop our flag if (!wasPaused) { pauseTime = TimeKeeper::getTick(); wasPaused = true; } if (TimeKeeper::getTick() - pauseTime > BZDB.eval(StateDatabase::BZDB_PAUSEDROPTIME)) { server->sendDropFlag(getPosition()); setStatus(getStatus() & ~PlayerState::FlagActive); pauseTime = TimeKeeper::getSunExplodeTime(); } } else { pauseTime = TimeKeeper::getNullTime(); wasPaused = false; } // reap dead (reloaded) shots for (i = 0; i < numShots; i++) if (shots[i] && shots[i]->isReloaded()) { if (!shots[i]->isExpired()) shots[i]->setExpired(); delete shots[i]; shots[i] = NULL; } // update shots anyShotActive = false; for (i = 0; i < numShots; i++) if (shots[i]) { shots[i]->update(dt); if (!shots[i]->isExpired()) anyShotActive = true; } // if no shots now out (but there had been) then reset target if (!anyShotActive && hadShotActive) target = NULL; // drop bad flag if timeout has expired if (!isPaused() && dt > 0.0f && World::getWorld()->allowShakeTimeout() && getFlag() != Flags::Null && getFlag()->endurance == FlagSticky && flagShakingTime > 0.0f) { flagShakingTime -= dt; if (flagShakingTime <= 0.0f) { flagShakingTime = 0.0f; server->sendDropFlag(getPosition()); } } } void LocalPlayer::doSlideMotion(float dt, float slideTime, float newAngVel, float* newVelocity) { const float oldAzimuth = getAngle(); const float* oldVelocity = getVelocity(); const float angle = oldAzimuth + (0.5f * dt * newAngVel); const float cos_val = cosf(angle); const float sin_val = sinf(angle); const float scale = (dt / slideTime); const float speedAdj = desiredSpeed * scale; const float* ov = oldVelocity; const float oldSpeed = sqrtf((ov[0] * ov[0]) + (ov[1] * ov[1])); float* nv = newVelocity; nv[0] = ov[0] + (cos_val * speedAdj); nv[1] = ov[1] + (sin_val * speedAdj); const float newSpeed = sqrtf((nv[0] * nv[0]) + (nv[1] * nv[1])); float maxSpeed = getMaxSpeed(); if (newSpeed > maxSpeed) { float adjSpeed; if (oldSpeed > maxSpeed) { adjSpeed = oldSpeed - (dt * (maxSpeed / slideTime)); if (adjSpeed < 0.0f) { adjSpeed = 0.0f; } } else { adjSpeed = maxSpeed; } const float speedScale = adjSpeed / newSpeed; nv[0] *= speedScale; nv[1] *= speedScale; } return; } float LocalPlayer::getNewAngVel(float old, float desired) { float newAngVel; if ((inputMethod != Keyboard) || (getPhysicsDriver() >= 0)) { // mouse and joystick users newAngVel = desired; } else { /* keybaord users * the larger the oldAngVel contribution, the more slowly an * angular velocity converges to the desired "max" velocity; the * contribution of the desired and old velocity should add up to * one for a linear convergence rate. */ newAngVel = (old * 0.8f) + (desired * 0.2f); // instant stop if ((old * desired < 0.0f) || (NEAR_ZERO(desired, ZERO_TOLERANCE))) { newAngVel = desired; } } return newAngVel; } void LocalPlayer::doUpdateMotion(float dt) { static const float MinSearchStep = 0.0001f; static const int MaxSearchSteps = 7; static const int MaxSteps = 4; static const float TinyDistance = 0.001f; // save old state const Location oldLocation = location; const float* oldPosition = getPosition(); const float oldAzimuth = getAngle(); const float oldAngVel = getAngularVelocity(); const float* oldVelocity = getVelocity(); // prepare new state float newVelocity[3]; newVelocity[0] = oldVelocity[0]; newVelocity[1] = oldVelocity[1]; newVelocity[2] = oldVelocity[2]; float newAngVel = 0.0f; clearRemoteSounds(); // if was teleporting and exceeded teleport time then not teleporting anymore if (isTeleporting() && ((lastTime - getTeleportTime()) >= BZDB.eval(StateDatabase::BZDB_TELEPORTTIME))) setStatus(getStatus() & ~short(PlayerState::Teleporting)); // phased means we can pass through buildings const bool phased = ((location == Dead) || (location == Exploding) || (getFlag() == Flags::OscillationOverthruster) || isPhantomZoned()); float groundLimit = 0.0f; if (getFlag() == Flags::Burrow) groundLimit = BZDB.eval(StateDatabase::BZDB_BURROWDEPTH); // get linear and angular speed at start of time step if (!NEAR_ZERO(dt,ZERO_TOLERANCE)) { if (location == Dead || isPaused()) { // can't move if paused or dead -- set dt to zero instead of // clearing velocity and newAngVel for when we resume (if paused) dt = 0.0f; newAngVel = oldAngVel; } else if (location == Exploding) { // see if explosing time has expired if (lastTime - getExplodeTime() >= BZDB.eval(StateDatabase::BZDB_EXPLODETIME)) { dt -= float((lastTime - getExplodeTime()) - BZDB.eval(StateDatabase::BZDB_EXPLODETIME)); if (dt < 0.0f) { dt = 0.0f; } setStatus(PlayerState::DeadStatus); location = Dead; if (isAutoPilot()) { CMDMGR.run("restart"); } } // can't control explosion motion newVelocity[2] += BZDBCache::gravity * dt; newAngVel = 0.0f; // or oldAngVel to spin while exploding } else if ((location == OnGround) || (location == OnBuilding) || (location == InBuilding && oldPosition[2] == groundLimit)) { // full control float speed = desiredSpeed; // angular velocity newAngVel = getNewAngVel(oldAngVel, desiredAngVel); // limit acceleration doMomentum(dt, speed, newAngVel); // compute velocity so far const float angle = oldAzimuth + 0.5f * dt * newAngVel; newVelocity[0] = speed * cosf(angle); newVelocity[1] = speed * sinf(angle); newVelocity[2] = 0.0f; // now friction, if any doFriction(dt, oldVelocity, newVelocity); // reset our flap count if we have wings if (getFlag() == Flags::Wings) wingsFlapCount = (int) BZDB.eval(StateDatabase::BZDB_WINGSJUMPCOUNT); if ((oldPosition[2] < 0.0f) && (getFlag() == Flags::Burrow)) newVelocity[2] += 4 * BZDBCache::gravity * dt; else if (oldPosition[2] > groundLimit) newVelocity[2] += BZDBCache::gravity * dt; // save speed for next update lastSpeed = speed; } else { // can't control motion in air unless have wings if (getFlag() == Flags::Wings) { float speed = desiredSpeed; // angular velocity newAngVel = getNewAngVel(oldAngVel, desiredAngVel); // compute horizontal velocity so far const float slideTime = BZDB.eval(StateDatabase::BZDB_WINGSSLIDETIME); if (slideTime > 0.0) { doSlideMotion(dt, slideTime, newAngVel, newVelocity); } else { const float angle = oldAzimuth + 0.5f * dt * newAngVel; newVelocity[0] = speed * cosf(angle); newVelocity[1] = speed * sinf(angle); } newVelocity[2] += BZDB.eval(StateDatabase::BZDB_WINGSGRAVITY) * dt; lastSpeed = speed; } else { newVelocity[2] += BZDBCache::gravity * dt; newAngVel = oldAngVel; } } // now apply outside forces doForces(dt, newVelocity, newAngVel); // below the ground: however I got there, creep up if (oldPosition[2] < groundLimit) { newVelocity[2] = std::max(newVelocity[2], -oldPosition[2] / 2.0f + 0.5f); } } // jump here, we allow a little change in horizontal motion if (wantJump) { doJump(); if (!wantJump) { newVelocity[2] = oldVelocity[2]; if ((lastObstacle != NULL) && !lastObstacle->isFlatTop() && BZDB.isTrue(StateDatabase::BZDB_NOCLIMB)) { newVelocity[0] = 0.0f; newVelocity[1] = 0.0f; } } } // do the physics driver stuff const int driverId = getPhysicsDriver(); const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(driverId); if (phydrv != NULL) { const float* v = phydrv->getLinearVel(); newVelocity[2] += v[2]; if (phydrv->getIsSlide()) { const float slideTime = phydrv->getSlideTime(); doSlideMotion(dt, slideTime, newAngVel, newVelocity); } else { // adjust the horizontal velocity newVelocity[0] += v[0]; newVelocity[1] += v[1]; const float av = phydrv->getAngularVel(); const float* ap = phydrv->getAngularPos(); if (av != 0.0f) { // the angular velocity is in radians/sec newAngVel += av; const float dx = oldPosition[0] - ap[0]; const float dy = oldPosition[1] - ap[1]; newVelocity[0] -= av * dy; newVelocity[1] += av * dx; } } } lastObstacle = NULL; // get new position so far (which is just the current position) float newPos[3]; newPos[0] = oldPosition[0]; newPos[1] = oldPosition[1]; newPos[2] = oldPosition[2]; float newAzimuth = oldAzimuth; // move tank through the time step. if there's a collision then // move the tank up to the collision, adjust the velocity to // prevent interpenetration, and repeat. avoid infinite loops // by only allowing a maximum number of repeats. bool expelled; const Obstacle* obstacle; float timeStep = dt; int stuck = false; if (location != Dead && location != Exploding) { location = OnGround; // anti-stuck code is useful only when alive // then only any 100 frames while stuck, take an action // try to see if we are stuck on a building obstacle = getHitBuilding(newPos, newAzimuth, newPos, newAzimuth, phased, expelled); if (obstacle && expelled) { stuckFrameCount++; stuck = true; } else { stuckFrameCount = 0; } if (stuckFrameCount > 100) { stuckFrameCount = 0; // we are using a maximum value on time for frame to avoid lagging problem setDesiredSpeed(0.25f); float delta = dt > 0.1f ? 0.1f : dt; float normalStuck[3]; obstacle->getNormal(newPos, normalStuck); // use all the given speed to exit float movementMax = desiredSpeed * delta; newVelocity[0] = movementMax * normalStuck[0]; newVelocity[1] = movementMax * normalStuck[1]; if ((World::getWorld()->allowJumping() || (getFlag() == Flags::Jumping) || (getFlag() == Flags::Wings)) && (getFlag() != Flags::NoJumping)) newVelocity[2] = movementMax * normalStuck[2]; else newVelocity[2] = 0.0f; // exit will be in the normal direction newPos[0] += newVelocity[0]; newPos[1] += newVelocity[1]; newPos[2] += newVelocity[2]; // compute time for all other kind of movements timeStep -= delta; } } float nominalPlanarSpeed2 = newVelocity[0] * newVelocity[0] + newVelocity[1] * newVelocity[1]; for (int numSteps = 0; numSteps < MaxSteps; numSteps++) { // record position at beginning of time step float tmpPos[3], tmpAzimuth; tmpAzimuth = newAzimuth; tmpPos[0] = newPos[0]; tmpPos[1] = newPos[1]; tmpPos[2] = newPos[2]; // get position at end of time step newAzimuth = tmpAzimuth + timeStep * newAngVel; newPos[0] = tmpPos[0] + timeStep * newVelocity[0]; newPos[1] = tmpPos[1] + timeStep * newVelocity[1]; newPos[2] = tmpPos[2] + timeStep * newVelocity[2]; if ((newPos[2] < groundLimit) && (newVelocity[2] < 0)) { // Hit lower limit, stop falling newPos[2] = groundLimit; if (location == Exploding) { // tank pieces reach the ground, friction // stop them, & mainly player view newPos[0] = tmpPos[0]; newPos[1] = tmpPos[1]; } } // see if we hit anything. if not then we're done. obstacle = getHitBuilding(tmpPos, tmpAzimuth, newPos, newAzimuth, phased, expelled); if (!obstacle || !expelled) break; float obstacleTop = obstacle->getPosition()[2] + obstacle->getHeight(); if ((oldLocation != InAir) && obstacle->isFlatTop() && (obstacleTop != tmpPos[2]) && (obstacleTop < (tmpPos[2] + BZDB.eval(StateDatabase::BZDB_MAXBUMPHEIGHT)))) { newPos[0] = oldPosition[0]; newPos[1] = oldPosition[1]; newPos[2] = obstacleTop; // drive over bumps const Obstacle* bumpObstacle = getHitBuilding(newPos, tmpAzimuth, newPos, newAzimuth, phased, expelled); if (bumpObstacle == NULL) { move(newPos, getAngle()); newPos[0] += newVelocity[0] * (dt * 0.5f); newPos[1] += newVelocity[1] * (dt * 0.5f); break; } } // record position when hitting float hitPos[3], hitAzimuth; hitAzimuth = newAzimuth; hitPos[0] = newPos[0]; hitPos[1] = newPos[1]; hitPos[2] = newPos[2]; // find the latest time before the collision float searchTime = 0.0f, searchStep = 0.5f * timeStep; for (int i = 0; searchStep > MinSearchStep && i < MaxSearchSteps; searchStep *= 0.5f, i++) { // get intermediate position const float t = searchTime + searchStep; newAzimuth = tmpAzimuth + (t * newAngVel); newPos[0] = tmpPos[0] + (t * newVelocity[0]); newPos[1] = tmpPos[1] + (t * newVelocity[1]); newPos[2] = tmpPos[2] + (t * newVelocity[2]); if ((newPos[2] < groundLimit) && (newVelocity[2] < 0)) { newPos[2] = groundLimit; } // see if we hit anything bool searchExpelled; const Obstacle* searchObstacle = getHitBuilding(tmpPos, tmpAzimuth, newPos, newAzimuth, phased, searchExpelled); if (!searchObstacle || !searchExpelled) { // if no hit then search latter half of time step searchTime = t; } else if (searchObstacle) { // if we hit a building then record which one and where obstacle = searchObstacle; expelled = searchExpelled; hitAzimuth = newAzimuth; hitPos[0] = newPos[0]; hitPos[1] = newPos[1]; hitPos[2] = newPos[2]; } } // get position just before impact newAzimuth = tmpAzimuth + (searchTime * newAngVel); newPos[0] = tmpPos[0] + (searchTime * newVelocity[0]); newPos[1] = tmpPos[1] + (searchTime * newVelocity[1]); newPos[2] = tmpPos[2] + (searchTime * newVelocity[2]); if (oldPosition[2] < groundLimit) { newVelocity[2] = std::max(newVelocity[2], -oldPosition[2] / 2.0f + 0.5f); } // record how much time is left in time step timeStep -= searchTime; // get normal at intersection. sometimes fancy test says there's // no intersection but we're expecting one so, in that case, fall // back to simple normal calculation. float normal[3]; if (!getHitNormal(obstacle, newPos, newAzimuth, hitPos, hitAzimuth, normal)) { obstacle->getNormal(newPos, normal); } // check for being on a building if ((newPos[2] > 0.0f) && (normal[2] > 0.001f)) { if (location != Dead && location != Exploding && expelled) { location = OnBuilding; lastObstacle = obstacle; } newVelocity[2] = 0.0f; } else { // get component of velocity in normal direction (in horizontal plane) float mag = (normal[0] * newVelocity[0]) + (normal[1] * newVelocity[1]); // handle upward normal component to prevent an upward force if (!NEAR_ZERO(normal[2], ZERO_TOLERANCE)) { // if going down then stop falling if (newVelocity[2] < 0.0f && newVelocity[2] - (mag + normal[2] * newVelocity[2]) * normal[2] > 0.0f) { newVelocity[2] = 0.0f; } // normalize force magnitude in horizontal plane float horNormal = normal[0] * normal[0] + normal[1] * normal[1]; if (!NEAR_ZERO(horNormal, ZERO_TOLERANCE)) { mag /= horNormal; } } // cancel out component in normal direction (if velocity and // normal point in opposite directions). also back off a tiny // amount to prevent a spurious collision against the same // obstacle. if (mag < 0.0f) { newVelocity[0] -= mag * normal[0]; newVelocity[1] -= mag * normal[1]; newPos[0] -= TinyDistance * mag * normal[0]; newPos[1] -= TinyDistance * mag * normal[1]; } if (mag > -0.01f) { // assume we're not allowed to turn anymore if there's no // significant velocity component to cancel out. newAngVel = 0.0f; } } } // pick new location if we haven't already done so if (location == OnGround) { if (obstacle && (!expelled || stuck)) { location = InBuilding; } else if (newPos[2] > 0.0f) { location = InAir; } } // see if we're crossing a wall if (location == InBuilding && getFlag() == Flags::OscillationOverthruster) { if (obstacle->isCrossing(newPos, newAzimuth, 0.5f * BZDBCache::tankLength, 0.5f * BZDBCache::tankWidth, BZDBCache::tankHeight, NULL)) { setStatus(getStatus() | int(PlayerState::CrossingWall)); } else { setStatus(getStatus() & ~int(PlayerState::CrossingWall)); } } else if (World::getWorld()->crossingTeleporter( newPos, newAzimuth, 0.5f * BZDBCache::tankLength, 0.5f * BZDBCache::tankWidth, BZDBCache::tankHeight, crossingPlane)) { setStatus(getStatus() | int(PlayerState::CrossingWall)); } else { setStatus(getStatus() & ~int(PlayerState::CrossingWall)); } // compute actual velocities. do this before teleportation. if (!NEAR_ZERO(dt, ZERO_TOLERANCE)) { const float oodt = 1.0f / dt; newAngVel = (newAzimuth - oldAzimuth) * oodt; newVelocity[0] = (newPos[0] - oldPosition[0]) * oodt; newVelocity[1] = (newPos[1] - oldPosition[1]) * oodt; newVelocity[2] = (newPos[2] - oldPosition[2]) * oodt; float newPlanarSpeed2 = newVelocity[0] * newVelocity[0] + newVelocity[1] * newVelocity[1]; float scaling = newPlanarSpeed2 / nominalPlanarSpeed2; if (scaling > 1.0f) { scaling = sqrtf(scaling); newVelocity[0] /= scaling; newVelocity[1] /= scaling; } } // see if we teleported int face; const Teleporter* teleporter; if (!isAlive()) { teleporter = NULL; } else { teleporter = World::getWorld()->crossesTeleporter(oldPosition, newPos, face); } if (teleporter) { if (getFlag() == Flags::PhantomZone) { // change zoned state setStatus(getStatus() ^ PlayerState::FlagActive); if (gettingSound) { playLocalSound(SFX_PHANTOM); } } else { // teleport const int source = World::getWorld()->getTeleporter(teleporter, face); int targetTele = World::getWorld()->getTeleportTarget(source); int outFace; const Teleporter* outPort = World::getWorld()->getTeleporter(targetTele, outFace); teleporter->getPointWRT(*outPort, face, outFace, newPos, newVelocity, newAzimuth, newPos, newVelocity, &newAzimuth); // check for a hit on the other side const Obstacle* teleObs = getHitBuilding(newPos, newAzimuth, newPos, newAzimuth, phased, expelled); if (teleObs != NULL) { // revert memcpy (newPos, oldPosition, sizeof(float[3])); newVelocity[0] = newVelocity[1] = 0.0f; newVelocity[2] = oldVelocity[2]; newAzimuth = oldAzimuth; } else { // save teleport info setTeleport(lastTime, source, targetTele); server->sendTeleport(source, targetTele); if (gettingSound) { playLocalSound(SFX_TELEPORT); } } } } // setup the physics driver setPhysicsDriver(-1); if ((lastObstacle != NULL) && (lastObstacle->getType() == MeshFace::getClassName())) { const MeshFace* meshFace = (const MeshFace*) lastObstacle; int driverIdent = meshFace->getPhysicsDriver(); const PhysicsDriver* phydriver = PHYDRVMGR.getDriver(driverIdent); if (phydriver != NULL) { setPhysicsDriver(driverIdent); } } // deal with drop sounds and effects if (entryDrop) { // because the starting position that the server sends can result // in an initial InAir condition, we use this bool to avoid having // a false jump mess with the spawnEffect() // FIXME: this isn't a clean way to do it if ((oldLocation == InAir) == (location == InAir)) { entryDrop = false; } } const bool justLanded = (oldLocation == InAir) && ((location == OnGround) || (location == OnBuilding)); if (justLanded) { setLandingSpeed(oldVelocity[2]); EFFECTS.addLandEffect(getColor(),newPos,getAngle()); } if (gettingSound) { const PhysicsDriver* phydriver = PHYDRVMGR.getDriver(getPhysicsDriver()); if ((phydriver != NULL) && (phydriver->getLinearVel()[2] > 0.0f)) { playLocalSound(SFX_BOUNCE); addRemoteSound(PlayerState::BounceSound); } else if (justLanded && !entryDrop) { playLocalSound(SFX_LAND); } else if ((location == OnGround) && (oldPosition[2] == 0.0f) && (newPos[2] < 0.f)) { playLocalSound(SFX_BURROW); } } // set falling status if (location == OnGround || location == OnBuilding || (location == InBuilding && newPos[2] == 0.0f)) { setStatus(getStatus() & ~short(PlayerState::Falling)); } else if (location == InAir || location == InBuilding) { setStatus(getStatus() | short(PlayerState::Falling)); } // set UserInput status (determines how animated treads are drawn) const PhysicsDriver* phydrv2 = PHYDRVMGR.getDriver(getPhysicsDriver()); if (((phydrv2 != NULL) && phydrv2->getIsSlide()) || ((getFlag() == Flags::Wings) && (location == InAir) && (BZDB.eval(StateDatabase::BZDB_WINGSSLIDETIME) > 0.0f))) { setStatus(getStatus() | short(PlayerState::UserInputs)); } else { setStatus(getStatus() & ~short(PlayerState::UserInputs)); } // compute firing status switch (location) { case Dead: case Exploding: firingStatus = Deceased; break; case InBuilding: firingStatus = (getFlag() == Flags::PhantomZone) ? Zoned : Sealed; break; default: if (isPhantomZoned()) firingStatus = Zoned; else if ((getReloadTime() > 0.0f) && (getFlag() != Flags::TriggerHappy)) firingStatus = Loading; else firingStatus = Ready; break; } // burrowed and oscillating tanks get some resistance in their joystick // if they have ff on if ((location == InBuilding) || (newPos[2] < -0.5f)) ForceFeedback::solidMatterFriction(); // calculate the list of inside buildings insideBuildings.clear(); if (location == InBuilding) { collectInsideBuildings(); } // move tank move(newPos, newAzimuth); setVelocity(newVelocity); setAngularVelocity(newAngVel); setRelativeMotion(); newAzimuth = getAngle(); // pickup the limited angle range from move() // see if I'm over my antidote if (antidoteFlag && location == OnGround) { float dist = ((flagAntidotePos[0] - newPos[0]) * (flagAntidotePos[0] - newPos[0])) + ((flagAntidotePos[1] - newPos[1]) * (flagAntidotePos[1] - newPos[1])); const float twoRads = getRadius() + BZDBCache::flagRadius; if (dist < (twoRads * twoRads)) { server->sendDropFlag(getPosition()); } } if ((getFlag() == Flags::Bouncy) && ((location == OnGround) || (location == OnBuilding))) { if (oldLocation != InAir) { if ((TimeKeeper::getTick() - bounceTime) > 0) { doJump(); } } else { bounceTime = TimeKeeper::getTick(); bounceTime += 0.2f; } } if (gettingSound) { if (oldPosition[0] != newPos[0] || oldPosition[1] != newPos[1] || oldPosition[2] != newPos[2] || oldAzimuth != newAzimuth) { moveSoundReceiver(newPos[0], newPos[1], newPos[2], newAzimuth, NEAR_ZERO(dt, ZERO_TOLERANCE) || ((teleporter != NULL) && (getFlag() != Flags::PhantomZone))); } if (NEAR_ZERO(dt, ZERO_TOLERANCE)) { speedSoundReceiver(newVelocity[0], newVelocity[1], newVelocity[2]); } else { speedSoundReceiver((newPos[0] - oldPosition[0]) / dt, (newPos[1] - oldPosition[1]) / dt, (newPos[2] - oldPosition[2]) / dt); } } } const Obstacle* LocalPlayer::getHitBuilding(const float* p, float a, bool phased, bool& expelled) const { const float* dims = getDimensions(); const Obstacle* obstacle = World::getWorld()->hitBuilding(p, a, dims[0], dims[1], dims[2]); expelled = (obstacle != NULL); if (expelled && phased) expelled = (obstacle->getType() == WallObstacle::getClassName() || obstacle->getType() == Teleporter::getClassName() || (getFlag() == Flags::OscillationOverthruster && desiredSpeed < 0.0f && p[2] == 0.0f)); return obstacle; } const Obstacle* LocalPlayer::getHitBuilding(const float* oldP, float oldA, const float* p, float a, bool phased, bool& expelled) { const bool hasOOflag = getFlag() == Flags::OscillationOverthruster; const float* dims = getDimensions(); const Obstacle* obstacle = World::getWorld()-> hitBuilding(oldP, oldA, p, a, dims[0], dims[1], dims[2], !hasOOflag); expelled = (obstacle != NULL); if (expelled && phased) expelled = (obstacle->getType() == WallObstacle::getClassName() || obstacle->getType() == Teleporter::getClassName() || (hasOOflag && desiredSpeed < 0.0f && p[2] == 0.0f)); if (obstacle != NULL) { if (obstacle->getType() == MeshFace::getClassName()) { const MeshFace* face = (const MeshFace*) obstacle; const int driver = face->getPhysicsDriver(); const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(driver); if ((phydrv != NULL) && phydrv->getIsDeath()) { deathPhyDrv = driver; } } } return obstacle; } bool LocalPlayer::getHitNormal(const Obstacle* o, const float* pos1, float azimuth1, const float* pos2, float azimuth2, float* normal) const { const float* dims = getDimensions(); return o->getHitNormal(pos1, azimuth1, pos2, azimuth2, dims[0], dims[1], dims[2], normal); } static bool notInObstacleList(const Obstacle* obs, const std::vector& list) { for (unsigned int i = 0; i < list.size(); i++) { if (obs == list[i]) { return false; } } return true; } void LocalPlayer::collectInsideBuildings() { const float* pos = getPosition(); const float angle = getAngle(); const float* dims = getDimensions(); // get the list of possible inside buildings const ObsList* olist = COLLISIONMGR.boxTest (pos, angle, dims[0], dims[1], dims[2]); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (obs->inBox(pos, angle, dims[0], dims[1], dims[2])) { if (obs->getType() == MeshFace::getClassName()) { const MeshFace* face = (const MeshFace*) obs; const MeshObstacle* mesh = (const MeshObstacle*) face->getMesh(); // check it for the death touch if (deathPhyDrv < 0) { const int driver = face->getPhysicsDriver(); const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(driver); if ((phydrv != NULL) && (phydrv->getIsDeath())) { deathPhyDrv = driver; } } // add the mesh if not already present if (!obs->isDriveThrough() && notInObstacleList(mesh, insideBuildings)) { insideBuildings.push_back(mesh); } } else if (!obs->isDriveThrough()) { if (obs->getType() == MeshObstacle::getClassName()) { // add the mesh if not already present if (notInObstacleList(obs, insideBuildings)) { insideBuildings.push_back(obs); } } else { insideBuildings.push_back(obs); } } } } return; } float LocalPlayer::getFlagShakingTime() const { return flagShakingTime; } int LocalPlayer::getFlagShakingWins() const { return flagShakingWins; } const GLfloat* LocalPlayer::getAntidoteLocation() const { return (const GLfloat*)(antidoteFlag ? antidoteFlag->getSphere() : NULL); } ShotPath* LocalPlayer::getShot(int index) const { index &= 0x00FF; if ((index < 0) || (index >= World::getWorld()->getMaxShots())) return NULL; return shots[index]; } void LocalPlayer::restart(const float* pos, float _azimuth) { // put me in limbo setStatus(short(PlayerState::DeadStatus)); // can't have a flag setFlag(Flags::Null); // get rid of existing shots const int numShots = World::getWorld()->getMaxShots(); // get rid of existing shots for (int i = 0; i < numShots; i++) if (shots[i]) { delete shots[i]; shots[i] = NULL; } anyShotActive = false; // no target target = NULL; // no death deathPhyDrv = -1; // initialize position/speed state static const float zero[3] = { 0.0f, 0.0f, 0.0f }; location = (pos[2] > 0.0f) ? OnBuilding : OnGround; lastObstacle = NULL; lastSpeed = 0.0f; desiredSpeed = 0.0f; desiredAngVel = 0.0f; move(pos, _azimuth); setVelocity(zero); setAngularVelocity(0.0f); left = false; right = false; up = false; down = false; wantJump = false; doUpdateMotion(0.0f); entryDrop = true; // make me alive now setStatus(getStatus() | short(PlayerState::Alive)); } void LocalPlayer::setTeam(TeamColor _team) { changeTeam(_team); } void LocalPlayer::setDesiredSpeed(float fracOfMaxSpeed) { FlagType* flag = getFlag(); // can't go faster forward than at top speed, and backward at half speed if (fracOfMaxSpeed > 1.0f) fracOfMaxSpeed = 1.0f; else if (fracOfMaxSpeed < -0.5f) fracOfMaxSpeed = -0.5f; // oscillation overthruster tank in building can't back up if (fracOfMaxSpeed < 0.0f && getLocation() == InBuilding && flag == Flags::OscillationOverthruster) { fracOfMaxSpeed = 0.0f; } // boost speed for certain flags if (flag == Flags::Velocity) { fracOfMaxSpeed *= BZDB.eval(StateDatabase::BZDB_VELOCITYAD); } else if (flag == Flags::Thief) { fracOfMaxSpeed *= BZDB.eval(StateDatabase::BZDB_THIEFVELAD); } else if ((flag == Flags::Burrow) && (getPosition()[2] < 0.0f)) { fracOfMaxSpeed *= BZDB.eval(StateDatabase::BZDB_BURROWSPEEDAD); } else if ((flag == Flags::ForwardOnly) && (fracOfMaxSpeed < 0.0)) { fracOfMaxSpeed = 0.0f; } else if ((flag == Flags::ReverseOnly) && (fracOfMaxSpeed > 0.0)) { fracOfMaxSpeed = 0.0f; } else if (flag == Flags::Agility) { if ((TimeKeeper::getTick() - agilityTime) < BZDB.eval(StateDatabase::BZDB_AGILITYTIMEWINDOW)) { fracOfMaxSpeed *= BZDB.eval(StateDatabase::BZDB_AGILITYADVEL); } else { float oldFrac = desiredSpeed / BZDBCache::tankSpeed; if (oldFrac > 1.0f) oldFrac = 1.0f; else if (oldFrac < -0.5f) oldFrac = -0.5f; float limit = BZDB.eval(StateDatabase::BZDB_AGILITYVELDELTA); if (fracOfMaxSpeed < 0.0f) limit /= 2.0f; if (fabs(fracOfMaxSpeed - oldFrac) > limit) { fracOfMaxSpeed *= BZDB.eval(StateDatabase::BZDB_AGILITYADVEL); agilityTime = TimeKeeper::getTick(); } } } // apply handicap advantage to tank speed fracOfMaxSpeed *= (1.0f + (handicap * (BZDB.eval(StateDatabase::BZDB_HANDICAPVELAD) - 1.0f))); // set desired speed desiredSpeed = BZDBCache::tankSpeed * fracOfMaxSpeed; Player::setUserSpeed(desiredSpeed); return; } void LocalPlayer::setDesiredAngVel(float fracOfMaxAngVel) { FlagType* flag = getFlag(); // limit turn speed to maximum if (fracOfMaxAngVel > 1.0f) fracOfMaxAngVel = 1.0f; else if (fracOfMaxAngVel < -1.0f) fracOfMaxAngVel = -1.0f; // further limit turn speed for certain flags if (fracOfMaxAngVel < 0.0f && getFlag() == Flags::LeftTurnOnly) fracOfMaxAngVel = 0.0f; else if (fracOfMaxAngVel > 0.0f && getFlag() == Flags::RightTurnOnly) fracOfMaxAngVel = 0.0f; // boost turn speed for other flags if (flag == Flags::QuickTurn) { fracOfMaxAngVel *= BZDB.eval(StateDatabase::BZDB_ANGULARAD); } else if ((flag == Flags::Burrow) && (getPosition()[2] < 0.0f)) { fracOfMaxAngVel *= BZDB.eval(StateDatabase::BZDB_BURROWANGULARAD); } // apply handicap advantage to tank speed fracOfMaxAngVel *= (1.0f + (handicap * (BZDB.eval(StateDatabase::BZDB_HANDICAPANGAD) - 1.0f))); // set desired turn speed desiredAngVel = fracOfMaxAngVel * BZDB.eval(StateDatabase::BZDB_TANKANGVEL); Player::setUserAngVel(desiredAngVel); return; } void LocalPlayer::setPause(bool pause) { if (isAlive()) { if (pause && !isPaused()) { setStatus(getStatus() | short(PlayerState::Paused)); server->sendPaused(true); } else if (!pause && isPaused()) { setStatus(getStatus() & ~short(PlayerState::Paused)); server->sendPaused(false); } } } void LocalPlayer::activateAutoPilot(bool autopilot) { // If desired and actual state is the same, ignore the request if (autopilot == isAutoPilot()) return; setAutoPilot(autopilot); server->sendAutoPilot(autopilot); if (!autopilot) setTarget(NULL); } bool LocalPlayer::fireShot() { if (! (firingStatus == Ready || firingStatus == Zoned)) return false; // find an empty slot const int numShots = World::getWorld()->getMaxShots(); int i; for (i = 0; i < numShots; i++) if (!shots[i]) break; if (i == numShots) return false; // make sure we're allowed to shoot if (!isAlive() || isPaused() || ((location == InBuilding) && !isPhantomZoned())) { return false; } // prepare shot FiringInfo firingInfo(*this, i + getSalt()); // FIXME team coloring of shot is never used; it was meant to be used // for rabbit mode to correctly calculate team kills when rabbit changes firingInfo.shot.team = getTeam(); if (firingInfo.flagType == Flags::ShockWave) { // move shot origin under tank and make it stationary const float* pos = getPosition(); firingInfo.shot.pos[0] = pos[0]; firingInfo.shot.pos[1] = pos[1]; firingInfo.shot.pos[2] = pos[2]; firingInfo.shot.vel[0] = 0.0f; firingInfo.shot.vel[1] = 0.0f; firingInfo.shot.vel[2] = 0.0f; } else { // apply any handicap advantage to shot speed if (handicap > 0.0f) { const float speedAd = 1.0f + (handicap * (BZDB.eval(StateDatabase::BZDB_HANDICAPSHOTAD) - 1.0f)); const float* dir = getForward(); const float* tankVel = getVelocity(); const float shotSpeed = speedAd * BZDB.eval(StateDatabase::BZDB_SHOTSPEED); firingInfo.shot.vel[0] = tankVel[0] + shotSpeed * dir[0]; firingInfo.shot.vel[1] = tankVel[1] + shotSpeed * dir[1]; firingInfo.shot.vel[2] = tankVel[2] + shotSpeed * dir[2]; } // Set _shotsKeepVerticalVelocity on the server if you want shots // to have the same vertical velocity as the tank when fired. // keeping shots moving horizontally makes the game more playable. if (!BZDB.isTrue(StateDatabase::BZDB_SHOTSKEEPVERTICALV)) firingInfo.shot.vel[2] = 0.0f; } // make shot and put it in the table shots[i] = new LocalShotPath(firingInfo); // Insert timestamp, useful for dead reckoning jitter fixing // TODO should maybe use getTick() instead? must double check const float timeStamp = float(TimeKeeper::getCurrent() - TimeKeeper::getNullTime()); firingInfo.timeSent = timeStamp; // always send a player-update message. To synchronize movement and // shot start. They should generally travel on the same frame, when // flushing the output queues. server->sendPlayerUpdate(this); server->sendBeginShot(firingInfo); if (BZDB.isTrue("enableLocalShotEffect") && SceneRenderer::instance().useQuality() >= 2) EFFECTS.addShotEffect(getColor(), firingInfo.shot.pos, getAngle(), getVelocity()); if (gettingSound) { if (firingInfo.flagType == Flags::ShockWave) { playLocalSound(SFX_SHOCK); ForceFeedback::shockwaveFired(); } else if (firingInfo.flagType == Flags::Laser) { playLocalSound(SFX_LASER); ForceFeedback::laserFired(); } else if (firingInfo.flagType == Flags::GuidedMissile) { playLocalSound(SFX_MISSILE); ForceFeedback::shotFired(); } else if (firingInfo.flagType == Flags::Thief) { playLocalSound(SFX_THIEF); ForceFeedback::shotFired(); } else { playLocalSound(SFX_FIRE); ForceFeedback::shotFired(); } } shotStatistics.recordFire(firingInfo.flagType,getForward(),firingInfo.shot.vel); if (getFlag() == Flags::TriggerHappy) { // make sure all the shots don't go off at once forceReload(BZDB.eval(StateDatabase::BZDB_RELOADTIME) / numShots); } return true; } float LocalPlayer::getReloadTime() const { const int numShots = World::getWorld()->getMaxShots(); if (numShots <= 0) { return 0.0f; } float time = float(jamTime - TimeKeeper::getTick()); if (time > 0.0f) { return time; } // look for an empty slot int i; for (i = 0; i < numShots; i++) { if (!shots[i]) { return 0.0f; } } // look for the shot fired least recently float minTime = float(shots[0]->getReloadTime() - (shots[0]->getCurrentTime() - shots[0]->getStartTime())); for (i = 1; i < numShots; i++) { const float t = float(shots[i]->getReloadTime() - (shots[i]->getCurrentTime() - shots[i]->getStartTime())); if (t < minTime) { minTime = t; } } if (minTime < 0.0f) { minTime = 0.0f; } return minTime; } bool LocalPlayer::doEndShot(int ident, bool isHit, float* pos) { const int index = ident & 255; const int slt = (ident >> 8) & 127; // special id used in some messages (and really shouldn't be sent here) if (ident == -1) return false; // ignore bogus shots (those with a bad index or for shots that don't exist) if (index < 0 || index >= World::getWorld()->getMaxShots() || !shots[index]) return false; // ignore shots that already ending if (shots[index]->isExpired() || shots[index]->isExpiring()) return false; // ignore shots that have the wrong salt. since we reuse shot indices // it's possible for an old MsgShotEnd to arrive after we've started a // new shot. that's where the salt comes in. it changes for each shot // so we can identify an old shot from a new one. if (slt != ((shots[index]->getShotId() >> 8) & 127)) return false; // keep shot statistics shotStatistics.recordHit(shots[index]->getFlag()); // don't stop if it's because were hitting something and we don't stop // when we hit something. if (isHit && !shots[index]->isStoppedByHit()) return false; // end it const float* shotPos = shots[index]->getPosition(); pos[0] = shotPos[0]; pos[1] = shotPos[1]; pos[2] = shotPos[2]; shots[index]->setExpired(); return true; } void LocalPlayer::setJump() { wantJump = jumpPressed; } void LocalPlayer::setJumpPressed(bool value) { jumpPressed = value; } void LocalPlayer::doJump() { FlagType* flag = getFlag(); // can't jump while burrowed if (getPosition()[2] < 0.0f) { return; } if (flag == Flags::Wings) { if (wingsFlapCount <= 0) { return; } wingsFlapCount--; } else if ((location != OnGround) && (location != OnBuilding)) { // can't jump unless on the ground or a building if (flag != Flags::Wings) return; if (wingsFlapCount <= 0) return; wingsFlapCount--; } else if ((flag != Flags::Bouncy) && ((flag != Flags::Jumping && !World::getWorld()->allowJumping()) || (flag == Flags::NoJumping))) { return; } // jump velocity const float* oldVelocity = getVelocity(); float newVelocity[3]; newVelocity[0] = oldVelocity[0]; newVelocity[1] = oldVelocity[1]; if (flag == Flags::Wings) { newVelocity[2] = BZDB.eval(StateDatabase::BZDB_WINGSJUMPVELOCITY); // if you're falling, wings will just slow you down if (oldVelocity[2] < 0) { newVelocity[2] += oldVelocity[2]; // if you're already going up faster, just keep doing that } else if (oldVelocity[2] > newVelocity[2]) { newVelocity[2] = oldVelocity[2]; } } else if (flag == Flags::Bouncy) { const float factor = 0.25f + ((float)bzfrand() * 0.75f); newVelocity[2] = factor * BZDB.eval(StateDatabase::BZDB_JUMPVELOCITY); } else { newVelocity[2] = BZDB.eval(StateDatabase::BZDB_JUMPVELOCITY); } setVelocity(newVelocity); location = InAir; // setup the graphics fireJumpJets(); // setup the sound if (gettingSound) { if (flag == Flags::Wings) { playLocalSound(SFX_FLAP); addRemoteSound(PlayerState::WingsSound); } else { playLocalSound(SFX_JUMP); addRemoteSound(PlayerState::JumpSound); } } wantJump = false; } void LocalPlayer::setTarget(const Player* _target) { target = _target; } void LocalPlayer::setNemesis(const Player* _nemesis) { if ((_nemesis == NULL) || _nemesis->getPlayerType() == TankPlayer) nemesis = _nemesis; } void LocalPlayer::setRecipient(const Player* _recipient) { if ((_recipient == NULL) || (_recipient->getId() <= LastRealPlayer)) recipient = _recipient; } void LocalPlayer::explodeTank() { if (location == Dead || location == Exploding) return; float gravity = BZDBCache::gravity; float explodeTim = BZDB.eval(StateDatabase::BZDB_EXPLODETIME); setExplodePos(getPosition()); // Limiting max height increment to this value (the old default value) const float zMax = 49.0f; setExplode(TimeKeeper::getTick()); const float* oldVelocity = getVelocity(); float newVelocity[3]; newVelocity[0] = oldVelocity[0]; newVelocity[1] = oldVelocity[1]; if (gravity < 0) { // comparing 2 speed: // to have a symmetric path (ending at same height as starting) // to reach the apex of parabola, under the max height established // take the less newVelocity[2] = - 0.5f * gravity * explodeTim; float maxSpeed = sqrtf(- 2.0f * zMax * gravity); if (newVelocity[2] > maxSpeed) newVelocity[2] = maxSpeed; } else { newVelocity[2] = oldVelocity[2]; } TankDeathOverride* death = getDeathEffect(); if (death) { fvec3 v(newVelocity[0],newVelocity[1],newVelocity[2]); if(death->GetDeathVector(v)) { newVelocity[0] = v.x; newVelocity[1] = v.y; newVelocity[2] = v.z; } } setVelocity(newVelocity); location = Exploding; target = NULL; // lose lock when dead } void LocalPlayer::doMomentum(float dt, float& speed, float& angVel) { // get maximum linear and angular accelerations float linearAcc = (getFlag() == Flags::Momentum) ? BZDB.eval(StateDatabase::BZDB_MOMENTUMLINACC) : World::getWorld()->getLinearAcceleration(); float angularAcc = (getFlag() == Flags::Momentum) ? BZDB.eval(StateDatabase::BZDB_MOMENTUMANGACC) : World::getWorld()->getAngularAcceleration(); // limit linear acceleration if (linearAcc > 0.0f) { const float acc = (speed - lastSpeed) / dt; if (acc > 20.0f * linearAcc) speed = lastSpeed + dt * 20.0f*linearAcc; else if (acc < -20.0f * linearAcc) speed = lastSpeed - dt * 20.0f*linearAcc; } // limit angular acceleration if (angularAcc > 0.0f) { const float oldAngVel = getAngularVelocity(); const float angAcc = (angVel - oldAngVel) / dt; if (angAcc > angularAcc) angVel = oldAngVel + dt * angularAcc; else if (angAcc < -angularAcc) angVel = oldAngVel - dt * angularAcc; } } void LocalPlayer::doFriction(float dt, const float *oldVelocity, float *newVelocity) { const float friction = (getFlag() == Flags::Momentum) ? BZDB.eval(StateDatabase::BZDB_MOMENTUMFRICTION) : BZDB.eval(StateDatabase::BZDB_FRICTION); if (friction > 0.0f) { // limit vector acceleration float delta[2] = {newVelocity[0] - oldVelocity[0], newVelocity[1] - oldVelocity[1]}; float acc2 = (delta[0] * delta[0] + delta[1] * delta[1]) / (dt*dt); float accLimit = 20.0f * friction; if (acc2 > accLimit*accLimit) { float ratio = accLimit / sqrtf(acc2); newVelocity[0] = oldVelocity[0] + delta[0]*ratio; newVelocity[1] = oldVelocity[1] + delta[1]*ratio; } } } void LocalPlayer::doForces(float UNUSED(dt), float* UNUSED(velocity), float& UNUSED(angVel)) { // apply external forces // do nothing -- no external forces right now } // NOTE -- minTime should be initialized to Infinity by the caller bool LocalPlayer::checkHit(const Player* source, const ShotPath*& hit, float& minTime) const { bool goodHit = false; // if firing tank is paused then it doesn't count if (source->isPaused()) return goodHit; const int maxShots = source->getMaxShots(); for (int i = 0; i < maxShots; i++) { // get shot const ShotPath* shot = source->getShot(i); if (!shot || shot->isExpired()) continue; // my own shock wave cannot kill me if (source == this && ((shot->getFlag() == Flags::ShockWave) || (shot->getFlag() == Flags::Thief))) continue; // if no team kills, shots of my team cannot kill me. Thief can still take // a teammate's flag. if (getTeam() != RogueTeam && !World::getWorld()->allowTeamKills() && shot->getFlag() != Flags::Thief && shot->getTeam() == getTeam() && source != this) continue; // short circuit test if shot can't possibly hit. // only superbullet or shockwave can kill zoned dude const FlagType* shotFlag = shot->getFlag(); if (isPhantomZoned() && (shotFlag != Flags::ShockWave) && (shotFlag != Flags::SuperBullet) && (shotFlag != Flags::PhantomZone)) continue; // laser can't hit a cloaked tank if ((getFlag() == Flags::Cloaking) && (shotFlag == Flags::Laser)) continue; // zoned shots only kill zoned tanks if ((shotFlag == Flags::PhantomZone) && !isPhantomZoned()) { continue; } // test myself against shot float position[3]; const float t = shot->checkHit(this, position); if (t >= minTime) continue; // test if shot hit a part of my tank that's through a teleporter. // hit is no good if hit point is behind crossing plane. if (isCrossingWall() && position[0] * crossingPlane[0] + position[1] * crossingPlane[1] + position[2] * crossingPlane[2] + crossingPlane[3] < 0.0) continue; // okay, shot hit goodHit = true; hit = shot; minTime = t; } return goodHit; } void LocalPlayer::setFlag(FlagType* flag) { Player::setFlag(flag); float worldSize = BZDBCache::worldSize; // if it's bad then reset countdowns and set antidote flag if (getFlag() != Flags::Null && getFlag()->endurance == FlagSticky) { if (World::getWorld()->allowShakeTimeout()) flagShakingTime = World::getWorld()->getFlagShakeTimeout(); if (World::getWorld()->allowShakeWins()) flagShakingWins = World::getWorld()->getFlagShakeWins(); if (World::getWorld()->allowAntidote()) { float tankRadius = BZDBCache::tankRadius; float baseSize = BZDB.eval(StateDatabase::BZDB_BASESIZE); do { if (World::getWorld()->allowTeamFlags()) { flagAntidotePos[0] = 0.5f * worldSize * ((float)bzfrand() - 0.5f); flagAntidotePos[1] = 0.5f * worldSize * ((float)bzfrand() - 0.5f); flagAntidotePos[2] = 0.0f; } else { flagAntidotePos[0] = (worldSize - baseSize) * ((float)bzfrand() - 0.5f); flagAntidotePos[1] = (worldSize - baseSize) * ((float)bzfrand() - 0.5f); flagAntidotePos[2] = 0.0f; } } while (World::getWorld()->inBuilding(flagAntidotePos, tankRadius, BZDBCache::tankHeight)); antidoteFlag = new FlagSceneNode(flagAntidotePos); antidoteFlag->setColor(1.0f, 1.0f, 0.0f); World::setFlagTexture(antidoteFlag); } } else { delete antidoteFlag; antidoteFlag = NULL; flagShakingTime = 0.0f; flagShakingWins = 0; } } void LocalPlayer::changeScore(short deltaWins, short deltaLosses, short deltaTks) { Player::changeScore(deltaWins, deltaLosses, deltaTks); if (deltaWins > 0 && World::getWorld()->allowShakeWins() && flagShakingWins > 0) { flagShakingWins -= deltaWins; if (flagShakingWins <= 0) { flagShakingWins = 0; server->sendDropFlag(getPosition()); } } } void LocalPlayer::addAntidote(SceneDatabase* scene) { if (antidoteFlag) scene->addDynamicNode(antidoteFlag); } std::string LocalPlayer::getInputMethodName(InputMethod whatInput) { switch (whatInput) { case Keyboard: return std::string("Keyboard"); break; case Mouse: return std::string("Mouse"); break; case Joystick: return std::string("Joystick"); break; default: return std::string("Unnamed Device"); } } void LocalPlayer::setKey(int button, bool pressed) { switch (button) { case BzfKeyEvent::Left: left = pressed; break; case BzfKeyEvent::Right: right = pressed; break; case BzfKeyEvent::Up: up = pressed; break; case BzfKeyEvent::Down: down = pressed; break; } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/LocalPlayer.h000066400000000000000000000152261200563112200200610ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __LOCALPLAYER_H__ #define __LOCALPLAYER_H__ /* interface header */ #include "BaseLocalPlayer.h" /* system interface headers */ #include #include /* common interface headers */ #include "Obstacle.h" #include "TimeKeeper.h" /* local interface headers */ #include "Player.h" #include "ServerLink.h" class FlagSceneNode; class LocalPlayer : public BaseLocalPlayer { public: enum FiringStatus { Deceased, // can't shoot cos I'm dead Ready, // ready to shoot Loading, // reloading Sealed, // I'm inside a building Zoned // I'm zoned }; enum Location { Dead, // dead, explosion over Exploding, // dead and exploding OnGround, // playing on ground InBuilding, // playing in building OnBuilding, // playing on building InAir // playing in air }; enum InputMethod { // what device am I using to move around Keyboard = 0, Mouse, Joystick }; LocalPlayer(const PlayerId&, const char* name, const char* motto); ~LocalPlayer(); Location getLocation() const; FiringStatus getFiringStatus() const; float getFlagShakingTime() const; int getFlagShakingWins() const; const float* getAntidoteLocation() const; ShotPath* getShot(int index) const; const Player* getTarget() const; int getDeathPhysicsDriver() const; const std::vector& getInsideBuildings() const; void setTeam(TeamColor); void setDesiredSpeed(float fracOfMaxSpeed); void setDesiredAngVel(float fracOfMaxAngVel); void setPause(bool = true); void activateAutoPilot(bool = true); bool fireShot(); void explodeTank(); void doJump(); void setJump(); void setJumpPressed(bool value); void setTarget(const Player*); float getReloadTime() const; void setNemesis(const Player*); const Player* getNemesis() const; void setRecipient(const Player*); const Player* getRecipient() const; void restart(const float* pos, float azimuth); bool checkHit(const Player* source, const ShotPath*& hit, float& minTime) const; void setFlag(FlagType*); void changeScore(short deltaWins, short deltaLosses, short deltaTeamKills); void addAntidote(SceneDatabase*); InputMethod getInputMethod() const; void setInputMethod(InputMethod newInput); void setInputMethod(std::string newInput); static std::string getInputMethodName(InputMethod whatInput); bool queryInputChange(); void setKey(int button, bool pressed); int getRotation(); int getSpeed(); bool isSpawning(); void setSpawning( bool spawn ); static LocalPlayer* getMyTank(); static void setMyTank(LocalPlayer*); const Obstacle* getHitBuilding(const float* pos, float angle, bool phased, bool& expel) const; const Obstacle* getHitBuilding(const float* oldPos, float oldAngle, const float* pos, float angle, bool phased, bool& expel); bool getHitNormal(const Obstacle* o, const float* pos1, float azimuth1, const float* pos2, float azimuth2, float* normal) const; protected: bool doEndShot(int index, bool isHit, float* pos); void doUpdate(float dt); void doUpdateMotion(float dt); void doMomentum(float dt, float& speed, float& angVel); void doFriction(float dt, const float *oldVelocity, float *newVelocity); void doForces(float dt, float* velocity, float& angVel); float updateHandicap(); LocalShotPath** shots; bool gettingSound; ServerLink* server; private: void doSlideMotion(float dt, float slideTime, float newAngVel, float* newVelocity); float getNewAngVel(float old, float desired); void collectInsideBuildings(); private: Location location; FiringStatus firingStatus; TimeKeeper bounceTime; TimeKeeper agilityTime; float flagShakingTime; int flagShakingWins; float flagAntidotePos[3]; FlagSceneNode* antidoteFlag; float desiredSpeed; float desiredAngVel; float lastSpeed; float crossingPlane[4]; bool anyShotActive; const Player* target; const Player* nemesis; const Player* recipient; static LocalPlayer* mainPlayer; InputMethod inputMethod; bool inputChanged; int stuckFrameCount; bool spawning; int wingsFlapCount; bool left; bool right; bool up; bool down; bool entryDrop; // first drop since entering bool wantJump; bool jumpPressed; int deathPhyDrv; // physics driver that caused death std::vector insideBuildings; }; inline LocalPlayer::Location LocalPlayer::getLocation() const { return location; } inline LocalPlayer::FiringStatus LocalPlayer::getFiringStatus() const { return firingStatus; } inline const Player* LocalPlayer::getTarget() const { return target; } inline const Player* LocalPlayer::getNemesis() const { return nemesis; } inline const Player* LocalPlayer::getRecipient() const { return recipient; } inline int LocalPlayer::getDeathPhysicsDriver() const { return deathPhyDrv; } inline const std::vector& LocalPlayer::getInsideBuildings() const { return insideBuildings; } inline LocalPlayer::InputMethod LocalPlayer::getInputMethod() const { return inputMethod; } inline void LocalPlayer::setInputMethod(InputMethod newInput) { inputMethod = newInput; inputChanged = true; } inline void LocalPlayer::setInputMethod(std::string newInput) { // FIXME - using hardcoded upper bound is ugly for (int i = 0; i < 3; i++) { if (newInput == getInputMethodName((InputMethod)i)) setInputMethod((InputMethod)i); } } inline bool LocalPlayer::queryInputChange() { const bool returnVal = inputChanged; inputChanged = false; return returnVal; } inline bool LocalPlayer::isSpawning() { return spawning; } inline void LocalPlayer::setSpawning( bool spawn ) { spawning = spawn; } inline int LocalPlayer::getRotation() { if (left && !right) return 1; else if (right && !left) return -1; else return 0; } inline int LocalPlayer::getSpeed() { if (up && !down) return 1; else if (down && !up) return -1; else return 0; } inline LocalPlayer* LocalPlayer::getMyTank() { return mainPlayer; } #endif /* __LOCALPLAYER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/MainMenu.cxx000066400000000000000000000137361200563112200177420ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "MainMenu.h" /* common implementation headers */ #include "TextureManager.h" #include "FontManager.h" /* local implementation headers */ #include "HelpMenu.h" #include "HUDDialogStack.h" #include "LocalPlayer.h" #include "JoinMenu.h" #include "OptionsMenu.h" #include "QuitMenu.h" #include "HUDuiTextureLabel.h" #include "ConfigFileManager.h" #include "clientConfig.h" #include "bzflag.h" #include "playing.h" #include "HUDui.h" MainMenu::MainMenu() : HUDDialog(), join(), login(), options(), help(), leave(), save(), quit(), joinMenu(NULL), optionsMenu(NULL), quitMenu(NULL) { } void MainMenu::createControls() { TextureManager &tm = TextureManager::instance(); std::vector& listHUD = getControls(); HUDuiControl* label; HUDuiTextureLabel* textureLabel; // clear controls for (unsigned int i = 0; i < listHUD.size(); i++) delete listHUD[i]; listHUD.erase(listHUD.begin(), listHUD.end()); // load title int title = tm.getTextureID("title"); // add controls textureLabel = new HUDuiTextureLabel; textureLabel->setFontFace(getFontFace()); textureLabel->setTexture(title); textureLabel->setString("BZFlag"); listHUD.push_back(textureLabel); label = createLabel("Up/Down arrows to move, Enter to select, Esc to dismiss"); listHUD.push_back(label); join = createLabel("Join Game"); listHUD.push_back(join); options = createLabel("Options"); listHUD.push_back(options); save = createLabel("Save Settings"); listHUD.push_back(save); help = createLabel("Help"); listHUD.push_back(help); LocalPlayer* myTank = LocalPlayer::getMyTank(); if (!(myTank == NULL)) { leave = createLabel("Leave Game"); listHUD.push_back(leave); } else { leave = NULL; } quit = createLabel("Quit"); listHUD.push_back(quit); resize(HUDDialog::getWidth(), HUDDialog::getHeight()); initNavigation(listHUD, 2, listHUD.size() - 1); // set focus back at the top in case the item we had selected does not exist anymore listHUD[2]->setFocus(); } HUDuiControl* MainMenu::createLabel(const char* string) { HUDuiLabel* control = new HUDuiLabel; control->setFontFace(getFontFace()); control->setString(string); return control; } MainMenu::~MainMenu() { // clear controls std::vector& listHUD = getControls(); for (unsigned int i = 0; i < listHUD.size(); i++) delete listHUD[i]; listHUD.erase(listHUD.begin(), listHUD.end()); // destroy submenus delete joinMenu; delete optionsMenu; delete quitMenu; HelpMenu::done(); } int MainMenu::getFontFace() { // create font return FontManager::instance().getFaceID(BZDB.get("sansSerifFont")); } HUDuiDefaultKey* MainMenu::getDefaultKey() { return MenuDefaultKey::getInstance(); } void MainMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == join) { if (!joinMenu) joinMenu = new JoinMenu; HUDDialogStack::get()->push(joinMenu); } else if (_focus == options) { if (!optionsMenu) optionsMenu = new OptionsMenu; HUDDialogStack::get()->push(optionsMenu); } else if (_focus == help) { HUDDialogStack::get()->push(HelpMenu::getHelpMenu()); } else if (_focus == leave) { leaveGame(); // myTank should be NULL now, recreate menu createControls(); } else if (_focus == save) { // save resources dumpResources(); if (alternateConfig == "") CFGMGR.write(getCurrentConfigFileName()); else CFGMGR.write(alternateConfig); } else if (_focus == quit) { if (!quitMenu) quitMenu = new QuitMenu; HUDDialogStack::get()->push(quitMenu); } } void MainMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font const float titleFontSize = (float)_height / 8.0f; const float tinyFontSize = (float)_height / 54.0f; const float fontSize = (float)_height / 22.0f; FontManager &fm = FontManager::instance(); int fontFace = getFontFace(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); // scale appropriately to center properly TextureManager &tm = TextureManager::instance(); float texHeight = (float)tm.getInfo(((HUDuiTextureLabel*)title)->getTexture()).y; float texWidth = (float)tm.getInfo(((HUDuiTextureLabel*)title)->getTexture()).x; float titleWidth = (texWidth / texHeight) * titleFontSize; float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleFontSize * 1.25f; title->setPosition(x, y); // reposition instructions HUDuiLabel* hint = (HUDuiLabel*)listHUD[1]; hint->setFontSize(tinyFontSize); const float hintWidth = fm.getStrLength(fontFace, tinyFontSize, hint->getString()); y -= 1.25f * fm.getStrHeight(fontFace, tinyFontSize, hint->getString()); hint->setPosition(0.5f * ((float)_width - hintWidth), y); y -= 1.5f * fm.getStrHeight(fontFace, fontSize, hint->getString()); // reposition menu items (first is centered, rest aligned to the first) const float firstWidth = fm.getStrLength(fontFace, fontSize, ((HUDuiLabel*)listHUD[2])->getString()); x = 0.5f * ((float)_width - firstWidth); const int count = listHUD.size(); for (int i = 2; i < count; i++) { HUDuiLabel* label = (HUDuiLabel*)listHUD[i]; label->setFontSize(fontSize); label->setPosition(x, y); y -= 1.2f * fm.getStrHeight(fontFace, fontSize, label->getString()); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/MainMenu.h000066400000000000000000000025441200563112200173620ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MAINMENU_H__ #define __MAINMENU_H__ #include "common.h" #include "HUDDialog.h" #include "HUDuiControl.h" #include "HUDuiDefaultKey.h" class JoinMenu; class OptionsMenu; class QuitMenu; /** MainMenu is the main menu */ class MainMenu : public HUDDialog { public: MainMenu(); ~MainMenu(); HUDuiDefaultKey* getDefaultKey(); void execute(); void resize(int width, int height); void createControls(); static int getFontFace(); private: HUDuiControl* createLabel(const char* string); HUDuiControl* join; HUDuiControl* login; HUDuiControl* options; HUDuiControl* help; HUDuiControl* leave; HUDuiControl* save; HUDuiControl* quit; JoinMenu* joinMenu; OptionsMenu* optionsMenu; QuitMenu* quitMenu; }; #endif /* __MAINMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/MainWindow.cxx000066400000000000000000000146561200563112200203070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface headers */ #include "MainWindow.h" /* common implementation headers */ #include "global.h" #include "SceneRenderer.h" // // MainWindow // MainWindow::MainWindow(BzfWindow* _window, BzfJoystick* _joystick) : window(_window), joystick(_joystick), quit(false), quadrant(FullWindow), isFullscreen(false), isFullView(true), allowMouseGrab(true), grabEnabled(true), width(0), minWidth(MinX), minHeight(MinY), faulting(false) { window->addResizeCallback(resizeCB, this); resize(); } MainWindow::~MainWindow() { window->removeResizeCallback(resizeCB, this); } void MainWindow::setMinSize(int _minWidth, int _minHeight) { minWidth = _minWidth; minHeight = _minHeight; window->setMinSize(minWidth, minHeight); resize(); } void MainWindow::setPosition(int x, int y) { window->setPosition(x, y); } void MainWindow::setSize(int _width, int _height) { window->setSize(_width, _height); resize(); } void MainWindow::showWindow(bool on) { window->showWindow(on); if (on) resize(); } inline int MainWindow::getYOffset() const { if (quadrant == FullWindow) { return 0; } return ((trueHeight + 1) >> 1) - yOrigin; } void MainWindow::warpMouse() { // move mouse to center of view window (zero motion box) window->warpMouse((width >> 1) + xOrigin, (viewHeight >> 1) + getYOffset()); } void MainWindow::warpMouse(int mx, int my) { window->warpMouse(mx, my); } void MainWindow::warpMouseCenterX() { int mx, my; getMousePosition(mx, my); window->warpMouse((width >> 1) + xOrigin, my + (viewHeight >> 1) + getYOffset()); } void MainWindow::warpMouseCenterY() { int mx, my; getMousePosition(mx, my); const int y = (viewHeight >> 1) + getYOffset(); window->warpMouse(mx + (width >> 1) + xOrigin, y); } void MainWindow::getMousePosition(int& mx, int& my) const { window->getMouse(mx, my); mx -= (width >> 1) + xOrigin; my -= (viewHeight >> 1) + getYOffset(); } void MainWindow::grabMouse() { if (allowMouseGrab) window->grabMouse(); } void MainWindow::ungrabMouse() { if (allowMouseGrab) window->ungrabMouse(); } void MainWindow::enableGrabMouse(bool on) { window->enableGrabMouse(on); grabEnabled = on; } bool MainWindow::isGrabEnabled(void) const { return grabEnabled; } bool MainWindow::getFullscreen() const { return isFullscreen; } void MainWindow::setFullscreen() { isFullscreen = false; toggleFullscreen(); } void MainWindow::toggleFullscreen() { isFullscreen = !isFullscreen; window->setFullscreen(isFullscreen); resize(); } void MainWindow::setFullView(bool _isFullView) { isFullView = _isFullView; } void MainWindow::setNoMouseGrab() { allowMouseGrab = false; } void MainWindow::setQuadrant(Quadrant _quadrant) { int inWidth = trueWidth; if (inWidth < MinX) inWidth = MinX; int inHeight = trueHeight; if (inHeight < MinY) inHeight = MinY; quadrant = _quadrant; switch (quadrant) { default: case FullWindow: width = inWidth; height = inHeight; if (isFullView) { viewHeight = height; } else { viewHeight = inHeight * (46 - RENDERER.getRadarSize()) / 60; } xOrigin = 0; yOrigin = 0; break; case UpperLeft: width = inWidth >> 1; height = inHeight >> 1; viewHeight = height; xOrigin = 0; yOrigin = (inHeight+1) >> 1; break; case UpperRight: width = (inWidth+1) >> 1; height = inHeight >> 1; viewHeight = height; xOrigin = inWidth >> 1; yOrigin = (inHeight+1) >> 1; break; case LowerLeft: width = inWidth >> 1; height = (inHeight+1) >> 1; viewHeight = height; xOrigin = 0; yOrigin = 0; break; case LowerRight: width = (inWidth+1) >> 1; height = (inHeight+1) >> 1; viewHeight = height; xOrigin = inWidth >> 1; yOrigin = 0; break; case UpperHalf: width = inWidth; height = inHeight >> 1; viewHeight = height; xOrigin = 0; yOrigin = (inHeight+1) >> 1; break; case LowerHalf: width = inWidth; height = inHeight >> 1; viewHeight = height; xOrigin = 0; yOrigin = 0; break; case ZoomRegion: width = inWidth; height = inHeight; viewHeight = height; xOrigin = 0; yOrigin = 0; break; } if (quadrant == ZoomRegion) { width = inWidth + 1; height = inHeight + 1; } glViewport(xOrigin, yOrigin, width, height); } void MainWindow::resize() { window->getSize(trueWidth, trueHeight); window->makeCurrent(); if (!window->create()) faulting = true; setQuadrant(quadrant); } void MainWindow::resizeCB(void* _self) { MainWindow* self = (MainWindow*)_self; self->resize(); } void MainWindow::iconify() { window->iconify(); } bool MainWindow::haveJoystick() const { return joystick->joystick(); } void MainWindow::getJoyPosition(int& mx, int& my) const { joystick->getJoy(mx, my); mx = ((width >> 1) * mx) / (900); my = ((height >> 1) * my) / (900); } int MainWindow::getNumHats() const { return joystick->getNumHats(); } void MainWindow::getJoyHat(int hat, float &hatX, float &hatY) const { joystick->getJoyHat(hat, hatX, hatY); } unsigned long MainWindow::getJoyButtonSet() const { return joystick->getJoyButtons(); } void MainWindow::getJoyDevices(std::vector &list) const { joystick->getJoyDevices(list); } void MainWindow::getJoyDeviceAxes(std::vector &list) const { joystick->getJoyDeviceAxes(list); } void MainWindow::setJoyXAxis(const std::string &axis) { joystick->setXAxis(axis); } void MainWindow::setJoyYAxis(const std::string &axis) { joystick->setYAxis(axis); } void MainWindow::initJoystick(std::string &joystickName) { joystick->initJoystick(joystickName.c_str()); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/MainWindow.h000066400000000000000000000075271200563112200177330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MAINWINDOW_H__ #define __MAINWINDOW_H__ /* BZFlag common header */ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "BzfWindow.h" #include "BzfJoystick.h" #define USE_GL_STEREO class MainWindow { public: enum Quadrant { FullWindow, UpperLeft, UpperRight, LowerLeft, LowerRight, ZoomRegion, UpperHalf, LowerHalf }; MainWindow(BzfWindow*, BzfJoystick*); ~MainWindow(); BzfWindow* getWindow() const { return window; } BzfJoystick* getJoystick() const { return joystick; } int getOriginX() const; int getOriginY() const; int getWidth() const; int getHeight() const; int getViewHeight() const; bool getFullscreen() const; bool getFullView() const; void setPosition(int x, int y); void setSize(int width, int height); void setMinSize(int width, int height); void setFullView(bool); void setFullscreen(); void toggleFullscreen(); void iconify(void); void setNoMouseGrab(); void setQuadrant(Quadrant); void showWindow(bool = true); void warpMouse(); void warpMouse(int mx, int my); void warpMouseCenterX(); void warpMouseCenterY(); void grabMouse(); void enableGrabMouse(bool on); bool isGrabEnabled(void) const; void ungrabMouse(); void resize(); // return true iff there's a joystick available (and it's been initialized) bool haveJoystick() const; // FIXME -- try to get rid of these. we'd like to receive // events instead because it means no round trip to the server // for these values that we need every frame. void getMousePosition(int& mx, int& my) const; void getJoyPosition(int& mx, int& my) const; int getNumHats() const; void getJoyHat(int hat, float &hatX, float &hatY) const; unsigned long getJoyButtonSet() const; void getJoyDevices(std::vector &list) const; void getJoyDeviceAxes(std::vector &list) const; void setJoyXAxis(const std::string &axis); void setJoyYAxis(const std::string &axis); void initJoystick(std::string &joystickName); bool isInFault() const { return faulting; }; private: // no copying MainWindow(const MainWindow&); MainWindow& operator=(const MainWindow&); static void resizeCB(void*); inline int getYOffset() const; private: BzfWindow* window; BzfJoystick* joystick; bool quit; Quadrant quadrant; bool isFullscreen; bool isFullView; bool allowMouseGrab; bool grabEnabled; int trueWidth, trueHeight; int xOrigin, yOrigin; int width; int height; int viewHeight; int minWidth; int minHeight; bool faulting; }; // // MainWindow // inline int MainWindow::getOriginX() const { return xOrigin; } inline int MainWindow::getOriginY() const { return yOrigin; } inline int MainWindow::getWidth() const { return width; } inline int MainWindow::getHeight() const { return height; } inline int MainWindow::getViewHeight() const { return viewHeight; } inline bool MainWindow::getFullView() const { return isFullView; } #endif /* __MAINWINDOW_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Makefile.am000066400000000000000000000107611200563112200175340ustar00rootroot00000000000000bin_PROGRAMS = bzflag AM_CPPFLAGS = -DINSTALL_DATA_DIR=\"$(pkgdatadir)\" \ $(SDL_CFLAGS) \ $(CONF_CPPFLAGS) \ -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) MAINTAINERCLEANFILES = \ Makefile.in bzflag_SOURCES = \ ActionBinding.cxx \ ActionBinding.h \ AudioMenu.cxx \ AudioMenu.h \ AutoPilot.cxx \ AutoPilot.h \ BackgroundRenderer.cxx \ BackgroundRenderer.h \ BaseLocalPlayer.cxx \ BaseLocalPlayer.h \ CacheMenu.cxx \ CacheMenu.h \ clientConfig.cxx \ clientConfig.h \ CommandsImplementation.cxx \ ComposeDefaultKey.cxx \ ComposeDefaultKey.h \ ControlPanel.cxx \ ControlPanel.h \ defaultBZDB.h \ defaultBZDB.cxx \ DisplayMenu.cxx \ DisplayMenu.h \ Downloads.cxx \ Downloads.h \ EffectsMenu.cxx \ EffectsMenu.h \ effectsRenderer.cxx \ effectsRenderer.h \ EntryZone.cxx \ EntryZone.h \ FlashClock.cxx \ FlashClock.h \ ForceFeedback.cxx \ ForceFeedback.h \ FormatMenu.cxx \ FormatMenu.h \ GuidedMissleStrategy.cxx \ GuidedMissleStrategy.h \ GUIOptionsMenu.cxx \ GUIOptionsMenu.h \ HelpMenu.cxx \ HelpMenu.h \ HUDDialog.cxx \ HUDDialog.h \ HUDDialogStack.cxx \ HUDDialogStack.h \ HUDRenderer.cxx \ HUDRenderer.h \ HUDui.cxx \ HUDui.h \ HUDuiControl.cxx \ HUDuiControl.h \ HUDuiDefaultKey.cxx \ HUDuiDefaultKey.h \ HUDuiLabel.cxx \ HUDuiLabel.h \ HUDuiList.cxx \ HUDuiList.h \ HUDuiTextureLabel.cxx \ HUDuiTextureLabel.h \ HUDuiTypeIn.cxx \ HUDuiTypeIn.h \ JoinMenu.cxx \ JoinMenu.h \ InputMenu.cxx \ InputMenu.h \ KeyboardMapMenu.cxx \ KeyboardMapMenu.h \ LocalCommand.cxx \ LocalCommand.h \ LocalPlayer.cxx \ LocalPlayer.h \ MainMenu.cxx \ MainMenu.h \ MainWindow.cxx \ MainWindow.h \ MenuDefaultKey.h \ MenuDefaultKey.cxx \ motd.h \ motd.cxx \ NewVersionMenu.cxx \ NewVersionMenu.h \ OptionsMenu.cxx \ OptionsMenu.h \ Player.cxx \ Player.h \ Plan.cxx \ Plan.h \ QuickKeysMenu.cxx \ QuickKeysMenu.h \ QuitMenu.cxx \ QuitMenu.h \ RadarRenderer.cxx \ RadarRenderer.h \ Region.cxx \ Region.h \ RegionPriorityQueue.cxx \ RegionPriorityQueue.h \ RemotePlayer.cxx \ RemotePlayer.h \ Roaming.cxx \ Roaming.h \ RobotPlayer.cxx \ RobotPlayer.h \ RoofTops.cxx \ RoofTops.h \ Roster.cxx \ Roster.h \ SaveWorldMenu.cxx \ SaveWorldMenu.h \ SceneBuilder.cxx \ SceneBuilder.h \ SceneRenderer.cxx \ ScoreboardRenderer.cxx \ ScoreboardRenderer.h \ SegmentedShotStrategy.cxx \ SegmentedShotStrategy.h \ ServerCommandKey.cxx \ ServerCommandKey.h \ ServerLink.cxx \ ServerLink.h \ ServerListFilter.cxx \ ServerListFilter.h \ ServerMenu.cxx \ ServerMenu.h \ ServerStartMenu.cxx \ ServerStartMenu.h \ ShockWaveStrategy.cxx \ ShockWaveStrategy.h \ ShotPath.cxx \ ShotPath.h \ ShotPathSegment.cxx \ ShotPathSegment.h \ ShotStats.cxx \ ShotStats.h \ ShotStatsDefaultKey.cxx \ ShotStatsDefaultKey.h \ ShotStatistics.h \ ShotStatistics.cxx \ ShotStrategy.cxx \ ShotStrategy.h \ SilenceDefaultKey.cxx \ SilenceDefaultKey.h \ TargetingUtils.cxx \ TargetingUtils.h \ TrackMarks.cxx \ TrackMarks.h \ Weapon.cxx \ Weapon.h \ WeatherRenderer.h \ WeatherRenderer.cxx \ World.cxx \ World.h \ WorldBuilder.cxx \ WorldBuilder.h \ WorldPlayer.cxx \ WorldPlayer.h \ bzflag.cxx \ bzflag.h \ callbacks.cxx \ callbacks.h \ clientCommands.cxx \ commands.h \ daylight.cxx \ daylight.h \ playing.cxx \ playing.h \ sound.cxx \ sound.h \ stars.cxx \ stars.h if BUILD_GLEW bzflag_SOURCES += $(top_srcdir)/src/other/glew/src/glew.c endif if WIN32 RESOURCE = bzflag.res else RESOURCE = endif if MACOS NACLIB = \ ../platform/MacOSX/libMac.la endif LDADD = \ ../3D/lib3D.la \ ../game/libGame.la \ ../net/libNet.la \ ../obstacle/libObstacle.la \ $(NACLIB) \ ../platform/libPlatform.la \ ../ogl/libGLKit.la \ ../scene/libSceneDB.la \ ../geometry/libGeometry.la \ ../mediafile/libMediaFile.la \ ../common/libCommon.la \ $(LIBCARES) \ $(LIBREGEX) \ $(LIBZ) \ $(RESOURCE) \ $(SDL_LIBS) \ $(SDL_IMAGE_LIBS) \ $(GLIBS) \ $(GLEW_LIBS) \ $(LIBCURL) \ ../date/libDate.la # This is required to hook in ogg/vorbis libraries # $(ALIBS) bzflag.res: $(top_srcdir)/win32/bzflag.rc $(top_srcdir)/win32/bzflag.ico $(WINDRES) --include-dir=$(top_srcdir)/win32/ -i $(top_srcdir)/win32/bzflag.rc -o bzflag.res \ -O coff bzflag-2.4.2+ds1/src/bzflag/Makefile.in000066400000000000000000001101031200563112200175340ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = bzflag$(EXEEXT) @BUILD_GLEW_TRUE@am__append_1 = $(top_srcdir)/src/other/glew/src/glew.c subdir = src/bzflag DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/cache.m4 \ $(top_srcdir)/m4/curses.m4 $(top_srcdir)/m4/isnan.m4 \ $(top_srcdir)/m4/libcurl.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/mkdirp.m4 $(top_srcdir)/m4/sdl.m4 \ $(top_srcdir)/m4/stage.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__bzflag_SOURCES_DIST = ActionBinding.cxx ActionBinding.h \ AudioMenu.cxx AudioMenu.h AutoPilot.cxx AutoPilot.h \ BackgroundRenderer.cxx BackgroundRenderer.h \ BaseLocalPlayer.cxx BaseLocalPlayer.h CacheMenu.cxx \ CacheMenu.h clientConfig.cxx clientConfig.h \ CommandsImplementation.cxx ComposeDefaultKey.cxx \ ComposeDefaultKey.h ControlPanel.cxx ControlPanel.h \ defaultBZDB.h defaultBZDB.cxx DisplayMenu.cxx DisplayMenu.h \ Downloads.cxx Downloads.h EffectsMenu.cxx EffectsMenu.h \ effectsRenderer.cxx effectsRenderer.h EntryZone.cxx \ EntryZone.h FlashClock.cxx FlashClock.h ForceFeedback.cxx \ ForceFeedback.h FormatMenu.cxx FormatMenu.h \ GuidedMissleStrategy.cxx GuidedMissleStrategy.h \ GUIOptionsMenu.cxx GUIOptionsMenu.h HelpMenu.cxx HelpMenu.h \ HUDDialog.cxx HUDDialog.h HUDDialogStack.cxx HUDDialogStack.h \ HUDRenderer.cxx HUDRenderer.h HUDui.cxx HUDui.h \ HUDuiControl.cxx HUDuiControl.h HUDuiDefaultKey.cxx \ HUDuiDefaultKey.h HUDuiLabel.cxx HUDuiLabel.h HUDuiList.cxx \ HUDuiList.h HUDuiTextureLabel.cxx HUDuiTextureLabel.h \ HUDuiTypeIn.cxx HUDuiTypeIn.h JoinMenu.cxx JoinMenu.h \ InputMenu.cxx InputMenu.h KeyboardMapMenu.cxx \ KeyboardMapMenu.h LocalCommand.cxx LocalCommand.h \ LocalPlayer.cxx LocalPlayer.h MainMenu.cxx MainMenu.h \ MainWindow.cxx MainWindow.h MenuDefaultKey.h \ MenuDefaultKey.cxx motd.h motd.cxx NewVersionMenu.cxx \ NewVersionMenu.h OptionsMenu.cxx OptionsMenu.h Player.cxx \ Player.h Plan.cxx Plan.h QuickKeysMenu.cxx QuickKeysMenu.h \ QuitMenu.cxx QuitMenu.h RadarRenderer.cxx RadarRenderer.h \ Region.cxx Region.h RegionPriorityQueue.cxx \ RegionPriorityQueue.h RemotePlayer.cxx RemotePlayer.h \ Roaming.cxx Roaming.h RobotPlayer.cxx RobotPlayer.h \ RoofTops.cxx RoofTops.h Roster.cxx Roster.h SaveWorldMenu.cxx \ SaveWorldMenu.h SceneBuilder.cxx SceneBuilder.h \ SceneRenderer.cxx ScoreboardRenderer.cxx ScoreboardRenderer.h \ SegmentedShotStrategy.cxx SegmentedShotStrategy.h \ ServerCommandKey.cxx ServerCommandKey.h ServerLink.cxx \ ServerLink.h ServerListFilter.cxx ServerListFilter.h \ ServerMenu.cxx ServerMenu.h ServerStartMenu.cxx \ ServerStartMenu.h ShockWaveStrategy.cxx ShockWaveStrategy.h \ ShotPath.cxx ShotPath.h ShotPathSegment.cxx ShotPathSegment.h \ ShotStats.cxx ShotStats.h ShotStatsDefaultKey.cxx \ ShotStatsDefaultKey.h ShotStatistics.h ShotStatistics.cxx \ ShotStrategy.cxx ShotStrategy.h SilenceDefaultKey.cxx \ SilenceDefaultKey.h TargetingUtils.cxx TargetingUtils.h \ TrackMarks.cxx TrackMarks.h Weapon.cxx Weapon.h \ WeatherRenderer.h WeatherRenderer.cxx World.cxx World.h \ WorldBuilder.cxx WorldBuilder.h WorldPlayer.cxx WorldPlayer.h \ bzflag.cxx bzflag.h callbacks.cxx callbacks.h \ clientCommands.cxx commands.h daylight.cxx daylight.h \ playing.cxx playing.h sound.cxx sound.h stars.cxx stars.h \ $(top_srcdir)/src/other/glew/src/glew.c @BUILD_GLEW_TRUE@am__objects_1 = glew.$(OBJEXT) am_bzflag_OBJECTS = ActionBinding.$(OBJEXT) AudioMenu.$(OBJEXT) \ AutoPilot.$(OBJEXT) BackgroundRenderer.$(OBJEXT) \ BaseLocalPlayer.$(OBJEXT) CacheMenu.$(OBJEXT) \ clientConfig.$(OBJEXT) CommandsImplementation.$(OBJEXT) \ ComposeDefaultKey.$(OBJEXT) ControlPanel.$(OBJEXT) \ defaultBZDB.$(OBJEXT) DisplayMenu.$(OBJEXT) \ Downloads.$(OBJEXT) EffectsMenu.$(OBJEXT) \ effectsRenderer.$(OBJEXT) EntryZone.$(OBJEXT) \ FlashClock.$(OBJEXT) ForceFeedback.$(OBJEXT) \ FormatMenu.$(OBJEXT) GuidedMissleStrategy.$(OBJEXT) \ GUIOptionsMenu.$(OBJEXT) HelpMenu.$(OBJEXT) \ HUDDialog.$(OBJEXT) HUDDialogStack.$(OBJEXT) \ HUDRenderer.$(OBJEXT) HUDui.$(OBJEXT) HUDuiControl.$(OBJEXT) \ HUDuiDefaultKey.$(OBJEXT) HUDuiLabel.$(OBJEXT) \ HUDuiList.$(OBJEXT) HUDuiTextureLabel.$(OBJEXT) \ HUDuiTypeIn.$(OBJEXT) JoinMenu.$(OBJEXT) InputMenu.$(OBJEXT) \ KeyboardMapMenu.$(OBJEXT) LocalCommand.$(OBJEXT) \ LocalPlayer.$(OBJEXT) MainMenu.$(OBJEXT) MainWindow.$(OBJEXT) \ MenuDefaultKey.$(OBJEXT) motd.$(OBJEXT) \ NewVersionMenu.$(OBJEXT) OptionsMenu.$(OBJEXT) \ Player.$(OBJEXT) Plan.$(OBJEXT) QuickKeysMenu.$(OBJEXT) \ QuitMenu.$(OBJEXT) RadarRenderer.$(OBJEXT) Region.$(OBJEXT) \ RegionPriorityQueue.$(OBJEXT) RemotePlayer.$(OBJEXT) \ Roaming.$(OBJEXT) RobotPlayer.$(OBJEXT) RoofTops.$(OBJEXT) \ Roster.$(OBJEXT) SaveWorldMenu.$(OBJEXT) \ SceneBuilder.$(OBJEXT) SceneRenderer.$(OBJEXT) \ ScoreboardRenderer.$(OBJEXT) SegmentedShotStrategy.$(OBJEXT) \ ServerCommandKey.$(OBJEXT) ServerLink.$(OBJEXT) \ ServerListFilter.$(OBJEXT) ServerMenu.$(OBJEXT) \ ServerStartMenu.$(OBJEXT) ShockWaveStrategy.$(OBJEXT) \ ShotPath.$(OBJEXT) ShotPathSegment.$(OBJEXT) \ ShotStats.$(OBJEXT) ShotStatsDefaultKey.$(OBJEXT) \ ShotStatistics.$(OBJEXT) ShotStrategy.$(OBJEXT) \ SilenceDefaultKey.$(OBJEXT) TargetingUtils.$(OBJEXT) \ TrackMarks.$(OBJEXT) Weapon.$(OBJEXT) \ WeatherRenderer.$(OBJEXT) World.$(OBJEXT) \ WorldBuilder.$(OBJEXT) WorldPlayer.$(OBJEXT) bzflag.$(OBJEXT) \ callbacks.$(OBJEXT) clientCommands.$(OBJEXT) \ daylight.$(OBJEXT) playing.$(OBJEXT) sound.$(OBJEXT) \ stars.$(OBJEXT) $(am__objects_1) bzflag_OBJECTS = $(am_bzflag_OBJECTS) bzflag_LDADD = $(LDADD) am__DEPENDENCIES_1 = @WIN32_TRUE@am__DEPENDENCIES_2 = bzflag.res bzflag_DEPENDENCIES = ../3D/lib3D.la ../game/libGame.la \ ../net/libNet.la ../obstacle/libObstacle.la $(NACLIB) \ ../platform/libPlatform.la ../ogl/libGLKit.la \ ../scene/libSceneDB.la ../geometry/libGeometry.la \ ../mediafile/libMediaFile.la ../common/libCommon.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ../date/libDate.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/misc/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(bzflag_SOURCES) DIST_SOURCES = $(am__bzflag_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BZFLAG_DATA = @BZFLAG_DATA@ BZFLAG_DATE = @BZFLAG_DATE@ BZFLAG_VERSION = @BZFLAG_VERSION@ CC = @CC@ CCACHE = @CCACHE@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFIG = @CONFIG@ CONFIG_CACHE = @CONFIG_CACHE@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_CPPFLAGS = @CONF_CPPFLAGS@ CONF_CXXFLAGS = @CONF_CXXFLAGS@ CONF_TIME = @CONF_TIME@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURSES_LIB = @CURSES_LIB@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FRAMEWORK_OPENGL = @FRAMEWORK_OPENGL@ GLEW_LIBS = @GLEW_LIBS@ GLIBS = @GLIBS@ GREP = @GREP@ HASPOD2MAN = @HASPOD2MAN@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCARES = @LIBCARES@ LIBCURL = @LIBCURL@ LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@ LIBDIR = @LIBDIR@ LIBDL = @LIBDL@ LIBMINIUPNPC = @LIBMINIUPNPC@ LIBOBJS = @LIBOBJS@ LIBREGEX = @LIBREGEX@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOLFLAGS = @LIBTOOLFLAGS@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBZ = @LIBZ@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WINDRES = @WINDRES@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ _libcurl_config = @_libcurl_config@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -DINSTALL_DATA_DIR=\"$(pkgdatadir)\" \ $(SDL_CFLAGS) \ $(CONF_CPPFLAGS) \ -I$(top_srcdir)/include AM_CFLAGS = $(CONF_CFLAGS) AM_CXXFLAGS = $(CONF_CXXFLAGS) MAINTAINERCLEANFILES = \ Makefile.in bzflag_SOURCES = ActionBinding.cxx ActionBinding.h AudioMenu.cxx \ AudioMenu.h AutoPilot.cxx AutoPilot.h BackgroundRenderer.cxx \ BackgroundRenderer.h BaseLocalPlayer.cxx BaseLocalPlayer.h \ CacheMenu.cxx CacheMenu.h clientConfig.cxx clientConfig.h \ CommandsImplementation.cxx ComposeDefaultKey.cxx \ ComposeDefaultKey.h ControlPanel.cxx ControlPanel.h \ defaultBZDB.h defaultBZDB.cxx DisplayMenu.cxx DisplayMenu.h \ Downloads.cxx Downloads.h EffectsMenu.cxx EffectsMenu.h \ effectsRenderer.cxx effectsRenderer.h EntryZone.cxx \ EntryZone.h FlashClock.cxx FlashClock.h ForceFeedback.cxx \ ForceFeedback.h FormatMenu.cxx FormatMenu.h \ GuidedMissleStrategy.cxx GuidedMissleStrategy.h \ GUIOptionsMenu.cxx GUIOptionsMenu.h HelpMenu.cxx HelpMenu.h \ HUDDialog.cxx HUDDialog.h HUDDialogStack.cxx HUDDialogStack.h \ HUDRenderer.cxx HUDRenderer.h HUDui.cxx HUDui.h \ HUDuiControl.cxx HUDuiControl.h HUDuiDefaultKey.cxx \ HUDuiDefaultKey.h HUDuiLabel.cxx HUDuiLabel.h HUDuiList.cxx \ HUDuiList.h HUDuiTextureLabel.cxx HUDuiTextureLabel.h \ HUDuiTypeIn.cxx HUDuiTypeIn.h JoinMenu.cxx JoinMenu.h \ InputMenu.cxx InputMenu.h KeyboardMapMenu.cxx \ KeyboardMapMenu.h LocalCommand.cxx LocalCommand.h \ LocalPlayer.cxx LocalPlayer.h MainMenu.cxx MainMenu.h \ MainWindow.cxx MainWindow.h MenuDefaultKey.h \ MenuDefaultKey.cxx motd.h motd.cxx NewVersionMenu.cxx \ NewVersionMenu.h OptionsMenu.cxx OptionsMenu.h Player.cxx \ Player.h Plan.cxx Plan.h QuickKeysMenu.cxx QuickKeysMenu.h \ QuitMenu.cxx QuitMenu.h RadarRenderer.cxx RadarRenderer.h \ Region.cxx Region.h RegionPriorityQueue.cxx \ RegionPriorityQueue.h RemotePlayer.cxx RemotePlayer.h \ Roaming.cxx Roaming.h RobotPlayer.cxx RobotPlayer.h \ RoofTops.cxx RoofTops.h Roster.cxx Roster.h SaveWorldMenu.cxx \ SaveWorldMenu.h SceneBuilder.cxx SceneBuilder.h \ SceneRenderer.cxx ScoreboardRenderer.cxx ScoreboardRenderer.h \ SegmentedShotStrategy.cxx SegmentedShotStrategy.h \ ServerCommandKey.cxx ServerCommandKey.h ServerLink.cxx \ ServerLink.h ServerListFilter.cxx ServerListFilter.h \ ServerMenu.cxx ServerMenu.h ServerStartMenu.cxx \ ServerStartMenu.h ShockWaveStrategy.cxx ShockWaveStrategy.h \ ShotPath.cxx ShotPath.h ShotPathSegment.cxx ShotPathSegment.h \ ShotStats.cxx ShotStats.h ShotStatsDefaultKey.cxx \ ShotStatsDefaultKey.h ShotStatistics.h ShotStatistics.cxx \ ShotStrategy.cxx ShotStrategy.h SilenceDefaultKey.cxx \ SilenceDefaultKey.h TargetingUtils.cxx TargetingUtils.h \ TrackMarks.cxx TrackMarks.h Weapon.cxx Weapon.h \ WeatherRenderer.h WeatherRenderer.cxx World.cxx World.h \ WorldBuilder.cxx WorldBuilder.h WorldPlayer.cxx WorldPlayer.h \ bzflag.cxx bzflag.h callbacks.cxx callbacks.h \ clientCommands.cxx commands.h daylight.cxx daylight.h \ playing.cxx playing.h sound.cxx sound.h stars.cxx stars.h \ $(am__append_1) @WIN32_FALSE@RESOURCE = @WIN32_TRUE@RESOURCE = bzflag.res @MACOS_TRUE@NACLIB = \ @MACOS_TRUE@ ../platform/MacOSX/libMac.la LDADD = \ ../3D/lib3D.la \ ../game/libGame.la \ ../net/libNet.la \ ../obstacle/libObstacle.la \ $(NACLIB) \ ../platform/libPlatform.la \ ../ogl/libGLKit.la \ ../scene/libSceneDB.la \ ../geometry/libGeometry.la \ ../mediafile/libMediaFile.la \ ../common/libCommon.la \ $(LIBCARES) \ $(LIBREGEX) \ $(LIBZ) \ $(RESOURCE) \ $(SDL_LIBS) \ $(SDL_IMAGE_LIBS) \ $(GLIBS) \ $(GLEW_LIBS) \ $(LIBCURL) \ ../date/libDate.la all: all-am .SUFFIXES: .SUFFIXES: .c .cxx .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/bzflag/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/bzflag/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list bzflag$(EXEEXT): $(bzflag_OBJECTS) $(bzflag_DEPENDENCIES) @rm -f bzflag$(EXEEXT) $(CXXLINK) $(bzflag_OBJECTS) $(bzflag_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ActionBinding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AudioMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AutoPilot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BackgroundRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BaseLocalPlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CacheMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandsImplementation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ComposeDefaultKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ControlPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DisplayMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Downloads.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EffectsMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EntryZone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FlashClock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ForceFeedback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FormatMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GUIOptionsMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GuidedMissleStrategy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDDialogStack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiControl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiDefaultKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiLabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiTextureLabel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HUDuiTypeIn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HelpMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InputMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JoinMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/KeyboardMapMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LocalCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LocalPlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MainMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MainWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MenuDefaultKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NewVersionMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionsMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Plan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Player.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuickKeysMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/QuitMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RadarRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Region.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RegionPriorityQueue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RemotePlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Roaming.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RobotPlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RoofTops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Roster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SaveWorldMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SceneBuilder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SceneRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ScoreboardRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SegmentedShotStrategy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerCommandKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerLink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerListFilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ServerStartMenu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShockWaveStrategy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotPath.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotPathSegment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotStatistics.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotStats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotStatsDefaultKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShotStrategy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SilenceDefaultKey.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TargetingUtils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackMarks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Weapon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WeatherRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/World.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WorldBuilder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WorldPlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bzflag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clientCommands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clientConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/daylight.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultBZDB.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectsRenderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glew.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/motd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stars.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< glew.o: $(top_srcdir)/src/other/glew/src/glew.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT glew.o -MD -MP -MF $(DEPDIR)/glew.Tpo -c -o glew.o `test -f '$(top_srcdir)/src/other/glew/src/glew.c' || echo '$(srcdir)/'`$(top_srcdir)/src/other/glew/src/glew.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/glew.Tpo $(DEPDIR)/glew.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/other/glew/src/glew.c' object='glew.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o glew.o `test -f '$(top_srcdir)/src/other/glew/src/glew.c' || echo '$(srcdir)/'`$(top_srcdir)/src/other/glew/src/glew.c glew.obj: $(top_srcdir)/src/other/glew/src/glew.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT glew.obj -MD -MP -MF $(DEPDIR)/glew.Tpo -c -o glew.obj `if test -f '$(top_srcdir)/src/other/glew/src/glew.c'; then $(CYGPATH_W) '$(top_srcdir)/src/other/glew/src/glew.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/other/glew/src/glew.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/glew.Tpo $(DEPDIR)/glew.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/other/glew/src/glew.c' object='glew.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o glew.obj `if test -f '$(top_srcdir)/src/other/glew/src/glew.c'; then $(CYGPATH_W) '$(top_srcdir)/src/other/glew/src/glew.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/other/glew/src/glew.c'; fi` .cxx.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS # This is required to hook in ogg/vorbis libraries # $(ALIBS) bzflag.res: $(top_srcdir)/win32/bzflag.rc $(top_srcdir)/win32/bzflag.ico $(WINDRES) --include-dir=$(top_srcdir)/win32/ -i $(top_srcdir)/win32/bzflag.rc -o bzflag.res \ -O coff # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bzflag-2.4.2+ds1/src/bzflag/MenuDefaultKey.cxx000066400000000000000000000031571200563112200211070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "MenuDefaultKey.h" /* common implementation headers */ #include "KeyManager.h" #include "CommandsStandard.h" /* local implementation headers */ #include "sound.h" #include "HUDDialogStack.h" #include "HUDDialog.h" MenuDefaultKey MenuDefaultKey::instance; MenuDefaultKey::MenuDefaultKey() { } MenuDefaultKey::~MenuDefaultKey() { } MenuDefaultKey* MenuDefaultKey::getInstance() { return &instance; } bool MenuDefaultKey::keyPress(const BzfKeyEvent& key) { switch (key.ascii) { case 27: // escape playLocalSound(SFX_DROP_FLAG); HUDDialogStack::get()->pop(); return true; case 13: // return playLocalSound(SFX_GRAB_FLAG); HUDDialogStack::get()->top()->execute(); return true; } if (KEYMGR.get(key, true) == "quit") { CommandsStandard::quit(); return true; } return false; } bool MenuDefaultKey::keyRelease(const BzfKeyEvent& key) { switch (key.ascii) { case 27: // escape case 13: // return return true; } return false; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/MenuDefaultKey.h000066400000000000000000000020601200563112200205240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MENUDEFAULTKEY_H__ #define __MENUDEFAULTKEY_H__ /* common interface headers */ #include "BzfEvent.h" /* local interface headers */ #include "HUDuiDefaultKey.h" class MenuDefaultKey : public HUDuiDefaultKey { public: MenuDefaultKey(); ~MenuDefaultKey(); bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); static MenuDefaultKey* getInstance(); private: static MenuDefaultKey instance; }; #endif /* __MENUDEFAULTKEY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/NewVersionMenu.cxx000066400000000000000000000173401200563112200211500ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "NewVersionMenu.h" /* system headers */ #include #ifdef WIN32 #include #include #include #endif /* common implementation headers */ #include "FontManager.h" #include "StateDatabase.h" #include "DirectoryNames.h" #include "TextUtils.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDDialogStack.h" #include "HUDui.h" #include "HUDuiLabel.h" #include "CommandsStandard.h" /* as platforms get added to the automatic upgrade system, update this */ #if defined(WIN32) #define AUTOUPGRADE 1 #else #undef AUTOUPGRADE #endif NewVersionMenu::NewVersionMenu(std::string announce, std::string url, std::string date) : cURLManager(), byteTransferred(0) { // prep for possible download setURL(url); #ifdef AUTOUPGRADE long timeout = 15; if (BZDB.isSet("httpTimeout")) { timeout = (long)BZDB.eval("httpTimeout"); } setTimeout(timeout); #endif // add controls std::vector& listHUD = getControls(); HUDuiLabel* label; int fontFace = MainMenu::getFontFace(); status = label = new HUDuiLabel; label->setFontFace(fontFace); label->setString(""); listHUD.push_back(status); label = new HUDuiLabel; label->setFontFace(fontFace); label->setString(announce); listHUD.push_back(label); label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("A new version of BZFlag has been released!"); listHUD.push_back(label); label = new HUDuiLabel; label->setFontFace(fontFace); label->setString(date); listHUD.push_back(label); #ifdef AUTOUPGRADE label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Would you like to upgrade now?"); listHUD.push_back(label); label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("(Download and install: " + url + ")"); listHUD.push_back(label); yes = label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Yes!"); listHUD.push_back(label); no = label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Not yet"); listHUD.push_back(label); initNavigation(listHUD, 6, 7); #else label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Please upgrade as soon as possible."); listHUD.push_back(label); yes = NULL; no = label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("OK"); listHUD.push_back(label); initNavigation(listHUD, 5, 5); #endif } NewVersionMenu::~NewVersionMenu() { } void NewVersionMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (!_focus) { return; #ifdef AUTOUPGRADE } else if (_focus == yes) { addHandle(); #endif } else if (_focus == no) { HUDDialogStack::get()->pop(); } } void NewVersionMenu::collectData(char* ptr, int len) { char buffer[128]; double size = 0; getFileSize(size); cURLManager::collectData(ptr, len); byteTransferred += len; snprintf(buffer, 128, "Downloading update: %d/%d KB", byteTransferred/1024, (int)size/1024); ((HUDuiLabel*)status)->setString(buffer); } void NewVersionMenu::finalization(char *data, unsigned int length, bool good) { if (good && data) { if (length) { // received update. Now what to do with it? #ifdef WIN32 // make sure the directory exists mkdir(getTempDirName().c_str()); // write data to temporary file const std::string tempfile = getTempDirName() + "\\temp-upgrade.exe"; FILE* temp = fopen(tempfile.c_str(), "wb"); if (temp) { fwrite(data, 1, length, temp); fclose(temp); } // start the program char* args [2]; args[0] = "temp-upgrade.exe"; args[1] = NULL; int result = _spawnvp(_P_DETACH, tempfile.c_str(), args); if (result < 0) { if (errno == ENOENT) ((HUDuiLabel*)status)->setString("Failed... can't find upgrade installer."); else if (errno == ENOMEM) ((HUDuiLabel*)status)->setString("Failed... not enough memory."); else if (errno == ENOEXEC) ((HUDuiLabel*)status)->setString("Failed... installer is not executable."); else ((HUDuiLabel*)status)->setString(TextUtils::format("Failed... unknown error (%d).", errno).c_str()); logDebugMessage(1,"Failed to start upgrade installer (%s) - error %d.\n", tempfile, errno); } else { ((HUDuiLabel*)status)->setString("Installer started."); CommandsStandard::quit(); } #endif } } else { status->setLabel("Download Failed!"); } } void NewVersionMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font float fontSize = (float)_height / 15.0f; float smallFontSize = (float)_height / 45.0f; float x, y; FontManager &fm = FontManager::instance(); const int fontFace = MainMenu::getFontFace(); // heights const float fontHeight = fm.getStrHeight(fontFace, fontSize, " "); const float smallFontHeight = fm.getStrHeight(fontFace, smallFontSize, " "); // get stuff std::vector& listHUD = getControls(); int i = 0; // status HUDuiLabel* label = (HUDuiLabel*)listHUD[i]; label->setFontSize(smallFontSize); float labelWidth = fm.getStrLength(fontFace, smallFontSize, "Downloading update: 8888/8888 KB"); x = 0.5f * ((float)_width - labelWidth); y = 2.0f * fontHeight; label->setPosition(x, y); // announcement label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(fontSize); labelWidth = fm.getStrLength(fontFace, fontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y = (float)_height - fontHeight - 1.5f * smallFontHeight; label->setPosition(x, y); // release-notice label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y -= 3.0f * smallFontHeight; label->setPosition(x, y); // release-date label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y -= 1.5f * smallFontHeight; label->setPosition(x, y); // user request label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y -= 4.5f * smallFontHeight; label->setPosition(x, y); #ifdef AUTOUPGRADE // download details label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y -= 1.5f * smallFontHeight; label->setPosition(x, y); #endif // first user option label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y -= 1.0f * fontHeight; label->setPosition(x, y); #ifdef AUTOUPGRADE // second user option label = (HUDuiLabel*)listHUD[++i]; label->setFontSize(smallFontSize); labelWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); y -= 1.5f * smallFontHeight; label->setPosition(x, y); #endif } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/NewVersionMenu.h000066400000000000000000000025311200563112200205710ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __NEWVERSIONMENU_H__ #define __NEWVERSIONMENU_H__ /* common interface headers */ #include "HUDDialog.h" #include "cURLManager.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDuiControl.h" #include "HUDuiTypeIn.h" /** this class provides options for setting the gui */ class NewVersionMenu : public HUDDialog, cURLManager { public: NewVersionMenu(std::string announce, std::string url, std::string date); ~NewVersionMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); // cURL download void finalization(char *data, unsigned int length, bool good); private: // no default constructor NewVersionMenu(); // cURL status void collectData(char* ptr, int len); int byteTransferred; // menu items HUDuiControl* yes; HUDuiControl* no; HUDuiControl* status; }; #endif bzflag-2.4.2+ds1/src/bzflag/OptionsMenu.cxx000066400000000000000000000136011200563112200205000ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "OptionsMenu.h" /* common implementation headers */ #include "FontManager.h" #include "StateDatabase.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDDialogStack.h" #include "HUDui.h" OptionsMenu::OptionsMenu() : guiOptionsMenu(NULL), effectsMenu(NULL), cacheMenu(NULL), saveWorldMenu(NULL), inputMenu(NULL), audioMenu(NULL), displayMenu(NULL) { // cache font face ID int fontFace = MainMenu::getFontFace(); // add controls std::vector& listHUD = getControls(); HUDuiList* option; std::vector* options; HUDuiLabel* label = new HUDuiLabel; label->setFontFace(fontFace); label->setString("Options"); listHUD.push_back(label); inputSetting = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Input Settings"); listHUD.push_back(label); audioSetting = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Audio Settings"); listHUD.push_back(label); displaySetting = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Display Settings"); listHUD.push_back(label); guiOptions = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("GUI Settings"); listHUD.push_back(label); effectsOptions = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Effects Settings"); listHUD.push_back(label); cacheOptions = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Cache Settings"); listHUD.push_back(label); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Save Settings:"); option->setCallback(callback, (void*)"s"); options = &option->getList(); options->push_back(std::string("No")); options->push_back(std::string("On Exit")); option->update(); listHUD.push_back(option); option = new HUDuiList; option->setFontFace(fontFace); option->setLabel("Save identity:"); option->setCallback(callback, (void*)"i"); options = &option->getList(); options->push_back(std::string("No")); options->push_back(std::string("Username only")); options->push_back(std::string("Username and password")); option->update(); listHUD.push_back(option); saveWorld = label = new HUDuiLabel; label->setFontFace(fontFace); label->setLabel("Save World"); listHUD.push_back(label); initNavigation(listHUD, 1, listHUD.size()-1); } OptionsMenu::~OptionsMenu() { delete guiOptionsMenu; delete effectsMenu; delete cacheMenu; delete saveWorldMenu; delete inputMenu; delete audioMenu; delete displayMenu; } void OptionsMenu::execute() { HUDuiControl* _focus = HUDui::getFocus(); if (_focus == guiOptions) { if (!guiOptionsMenu) guiOptionsMenu = new GUIOptionsMenu; HUDDialogStack::get()->push(guiOptionsMenu); } else if (_focus == effectsOptions) { if (!effectsMenu) effectsMenu = new EffectsMenu; HUDDialogStack::get()->push(effectsMenu); } else if (_focus == cacheOptions) { if (!cacheMenu) cacheMenu = new CacheMenu; HUDDialogStack::get()->push(cacheMenu); } else if (_focus == saveWorld) { if (!saveWorldMenu) saveWorldMenu = new SaveWorldMenu; HUDDialogStack::get()->push(saveWorldMenu); } else if (_focus == inputSetting) { if (!inputMenu) inputMenu = new InputMenu; HUDDialogStack::get()->push(inputMenu); } else if (_focus == audioSetting) { if (!audioMenu) audioMenu = new AudioMenu; HUDDialogStack::get()->push(audioMenu); } else if (_focus == displaySetting) { if (!displayMenu) displayMenu = new DisplayMenu; HUDDialogStack::get()->push(displayMenu); } } void OptionsMenu::resize(int _width, int _height) { int i; HUDDialog::resize(_width, _height); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 45.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(MainMenu::getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(MainMenu::getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options in two columns x = 0.5f * (float)_width; y -= 0.6f * titleHeight; const int count = listHUD.size(); const float h = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); for (i = 1; i < count; i++) { HUDuiControl *ctl = listHUD[i]; ctl->setFontSize(fontSize); ctl->setPosition(x, y); if ((i == 6) || (i == 8)) { y -= 1.75f * h; } else { y -= 1.0f * h; } } // load current settings i = 7; ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("saveSettings")); ((HUDuiList*)listHUD[i++])->setIndex(BZDB.evalInt("saveIdentity")); } void OptionsMenu::callback(HUDuiControl* w, void* data) { HUDuiList* listHUD = (HUDuiList*)w; switch (((const char*)data)[0]) { case 's': { // save settings BZDB.setInt("saveSettings", listHUD->getIndex()); break; } case 'i': { // save identity BZDB.setInt("saveIdentity", listHUD->getIndex()); break; } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/OptionsMenu.h000066400000000000000000000032701200563112200201260ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __OPTIONSMENU_H__ #define __OPTIONSMENU_H__ #include "common.h" /* local interface headers */ #include "HUDDialog.h" #include "MenuDefaultKey.h" #include "HUDuiDefaultKey.h" #include "HUDuiControl.h" #include "GUIOptionsMenu.h" #include "EffectsMenu.h" #include "CacheMenu.h" #include "SaveWorldMenu.h" #include "InputMenu.h" #include "AudioMenu.h" #include "DisplayMenu.h" class OptionsMenu : public HUDDialog { public: OptionsMenu(); ~OptionsMenu(); HUDuiDefaultKey* getDefaultKey() { return MenuDefaultKey::getInstance(); } void execute(); void resize(int width, int height); static void callback(HUDuiControl* w, void* data); private: HUDuiControl* guiOptions; HUDuiControl* effectsOptions; HUDuiControl* cacheOptions; HUDuiControl* saveWorld; HUDuiControl* inputSetting; HUDuiControl* audioSetting; HUDuiControl* displaySetting; GUIOptionsMenu* guiOptionsMenu; EffectsMenu* effectsMenu; CacheMenu* cacheMenu; SaveWorldMenu* saveWorldMenu; InputMenu* inputMenu; AudioMenu* audioMenu; DisplayMenu* displayMenu; }; #endif /* __OPTIONSMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Plan.cxx000066400000000000000000000304221200563112200171120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "Plan.h" #include "BZDBCache.h" #include "playing.h" #include "LocalPlayer.h" #include "Roster.h" #include "TargetingUtils.h" #include "World.h" /** * Plan */ Plan::Plan(float planDuration) { planExpiration = TimeKeeper::getCurrent(); planExpiration += planDuration; } Plan::~Plan() { } bool Plan::isValid() { TimeKeeper now = TimeKeeper(); float delta = float(now - planExpiration); return (delta < 0.0f); } void Plan::execute(float &, float &) { float pos[3]; LocalPlayer *myTank = LocalPlayer::getMyTank(); memcpy(pos, myTank->getPosition(), sizeof(pos)); if (pos[2] < 0.0f) pos[2] = 0.01f; float myAzimuth = myTank->getAngle(); float dir[3] = {cosf(myAzimuth), sinf(myAzimuth), 0.0f}; pos[2] += myTank->getMuzzleHeight(); Ray tankRay(pos, dir); pos[2] -= myTank->getMuzzleHeight(); if (myTank->getFlag() == Flags::ShockWave) { TimeKeeper now = TimeKeeper::getTick(); if (now - lastShot >= (1.0f / World::getWorld()->getMaxShots())) { bool hasSWTarget = false; for (int t = 0; t < curMaxPlayers; t++) { if (t != myTank->getId() && remotePlayers[t] && remotePlayers[t]->isAlive() && !remotePlayers[t]->isPaused() && !remotePlayers[t]->isNotResponding()) { const float *tp = remotePlayers[t]->getPosition(); float enemyPos[3]; //toss in some lag adjustment/future prediction - 300 millis memcpy(enemyPos,tp,sizeof(enemyPos)); const float *tv = remotePlayers[t]->getVelocity(); enemyPos[0] += 0.3f * tv[0]; enemyPos[1] += 0.3f * tv[1]; enemyPos[2] += 0.3f * tv[2]; if (enemyPos[2] < 0.0f) enemyPos[2] = 0.0f; float dist = TargetingUtils::getTargetDistance( pos, enemyPos ); if (dist <= BZDB.eval(StateDatabase::BZDB_SHOCKOUTRADIUS)) { if (!myTank->validTeamTarget(remotePlayers[t])) { hasSWTarget = false; t = curMaxPlayers; } else { hasSWTarget = true; } } } } if (hasSWTarget) { myTank->fireShot(); lastShot = TimeKeeper::getTick(); } } } else { TimeKeeper now = TimeKeeper::getTick(); if (now - lastShot >= (1.0f / World::getWorld()->getMaxShots())) { float errorLimit = World::getWorld()->getMaxShots() * BZDB.eval(StateDatabase::BZDB_LOCKONANGLE) / 8.0f; float closeErrorLimit = errorLimit * 2.0f; for (int t = 0; t < curMaxPlayers; t++) { if (t != myTank->getId() && remotePlayers[t] && remotePlayers[t]->isAlive() && !remotePlayers[t]->isPaused() && !remotePlayers[t]->isNotResponding() && myTank->validTeamTarget(remotePlayers[t])) { if (remotePlayers[t]->isPhantomZoned() && !myTank->isPhantomZoned() && (myTank->getFlag() != Flags::SuperBullet)) continue; const float *tp = remotePlayers[t]->getPosition(); float enemyPos[3]; //toss in some lag adjustment/future prediction - 300 millis memcpy(enemyPos,tp,sizeof(enemyPos)); const float *tv = remotePlayers[t]->getVelocity(); enemyPos[0] += 0.3f * tv[0]; enemyPos[1] += 0.3f * tv[1]; enemyPos[2] += 0.3f * tv[2]; if (enemyPos[2] < 0.0f) enemyPos[2] = 0.0f; float dist = TargetingUtils::getTargetDistance( pos, enemyPos ); if ((myTank->getFlag() == Flags::GuidedMissile) || (fabs(pos[2] - enemyPos[2]) < 2.0f * BZDBCache::tankHeight)) { float targetDiff = TargetingUtils::getTargetAngleDifference(pos, myAzimuth, enemyPos ); if ((targetDiff < errorLimit) || ((dist < (2.0f * BZDB.eval(StateDatabase::BZDB_SHOTSPEED))) && (targetDiff < closeErrorLimit))) { bool isTargetObscured; if (myTank->getFlag() != Flags::SuperBullet) isTargetObscured = TargetingUtils::isLocationObscured( pos, enemyPos ); else isTargetObscured = false; if (!isTargetObscured) { myTank->fireShot(); lastShot = now; t = curMaxPlayers; } } } } } } } } bool Plan::avoidBullet(float &rotation, float &speed) { LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); if ((myTank->getFlag() == Flags::Narrow) || (myTank->getFlag() == Flags::Burrow)) return false; // take our chances float minDistance; ShotPath *shot = findWorstBullet(minDistance); if ((shot == NULL) || (minDistance > 100.0f)) return false; const float *shotPos = shot->getPosition(); const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1],shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = {(pos[0]-shotPos[0])/minDistance,(pos[1]-shotPos[1])/minDistance}; float dotProd = trueVec[0]*shotUnitVec[0]+trueVec[1]*shotUnitVec[1]; if (((World::getWorld()->allowJumping() || (myTank->getFlag()) == Flags::Jumping || (myTank->getFlag()) == Flags::Wings)) && (minDistance < (std::max(dotProd,0.5f) * BZDBCache::tankLength * 2.25f)) && (myTank->getFlag() != Flags::NoJumping)) { myTank->setJump(); return (myTank->getFlag() != Flags::Wings); } else if (dotProd > 0.96f) { speed = 1.0; float myAzimuth = myTank->getAngle(); float rotation1 = TargetingUtils::normalizeAngle((float)((shotAngle + M_PI/2.0) - myAzimuth)); float rotation2 = TargetingUtils::normalizeAngle((float)((shotAngle - M_PI/2.0) - myAzimuth)); float zCross = shotUnitVec[0]*trueVec[1] - shotUnitVec[1]*trueVec[0]; if (zCross > 0.0f) { //if i am to the left of the shot from shooter pov rotation = rotation1; if (fabs(rotation1) < fabs(rotation2)) speed = 1.0f; else if (dotProd > 0.98f) speed = -0.5f; else speed = 0.5f; } else { rotation = rotation2; if (fabs(rotation2) < fabs(rotation1)) speed = 1.0f; else if (dotProd > 0.98f) speed = -0.5f; else speed = 0.5f; } return true; } return false; } ShotPath *Plan::findWorstBullet(float &minDistance) { LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pos = myTank->getPosition(); ShotPath *minPath = NULL; minDistance = Infinity; for (int t = 0; t < curMaxPlayers; t++) { if (t == myTank->getId() || !remotePlayers[t]) continue; const int maxShots = remotePlayers[t]->getMaxShots(); for (int s = 0; s < maxShots; s++) { ShotPath* shot = remotePlayers[t]->getShot(s); if (!shot || shot->isExpired()) continue; if ((shot->getFlag() == Flags::InvisibleBullet) && (myTank->getFlag() != Flags::Seer)) continue; //Theoretically Roger could triangulate the sound if (remotePlayers[t]->isPhantomZoned() && !myTank->isPhantomZoned()) continue; if ((shot->getFlag() == Flags::Laser) && (myTank->getFlag() == Flags::Cloaking)) continue; //cloaked tanks can't die from lasers const float* shotPos = shot->getPosition(); if ((fabs(shotPos[2] - pos[2]) > BZDBCache::tankHeight) && (shot->getFlag() != Flags::GuidedMissile)) continue; const float dist = TargetingUtils::getTargetDistance(pos, shotPos); if (dist < minDistance) { const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1], shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = { (pos[0] - shotPos[0]) / dist, (pos[1] - shotPos[1]) / dist }; float dotProd = trueVec[0] * shotUnitVec[0] + trueVec[1] * shotUnitVec[1]; if (dotProd <= 0.1f) //pretty wide angle, evasive actions prolly aren't gonna work continue; minDistance = dist; minPath = shot; } } } float oldDistance = minDistance; WorldPlayer *wp = World::getWorld()->getWorldWeapons(); for (int w = 0; w < wp->getMaxShots(); w++) { ShotPath* shot = wp->getShot(w); if (!shot || shot->isExpired()) continue; if (shot->getFlag() == Flags::InvisibleBullet && myTank->getFlag() != Flags::Seer) continue; //Theoretically Roger could triangulate the sound if (shot->getFlag() == Flags::Laser && myTank->getFlag() == Flags::Cloaking) continue; //cloaked tanks can't die from lasers const float* shotPos = shot->getPosition(); if ((fabs(shotPos[2] - pos[2]) > BZDBCache::tankHeight) && (shot->getFlag() != Flags::GuidedMissile)) continue; const float dist = TargetingUtils::getTargetDistance( pos, shotPos ); if (dist < minDistance) { const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1], shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = { (pos[0] - shotPos[0]) / dist, (pos[1] - shotPos[1]) / dist }; float dotProd = trueVec[0] * shotUnitVec[0] + trueVec[1] * shotUnitVec[1]; if (dotProd <= 0.1f) //pretty wide angle, evasive actions prolly aren't gonna work continue; minDistance = dist; minPath = shot; } } if (oldDistance < minDistance) minDistance = oldDistance; //pick the closer bullet return minPath; } /** * PlanStack */ PlanStack::PlanStack() { Plan *pPlan = new TopLevelPlan(); plans.push(pPlan); } PlanStack::~PlanStack() { while (plans.size() > 0) { Plan* pPlan = plans.top(); delete pPlan; plans.pop(); } } void PlanStack::execute(float &rotation, float &speed) { if (Plan::avoidBullet(rotation, speed)) return; Plan *pPlan = NULL; while (!plans.empty()) { pPlan = plans.top(); if (!pPlan->isValid()) { delete pPlan; plans.pop(); } } while (pPlan->usesSubPlan()) { pPlan = pPlan->createSubPlan(); plans.push(pPlan); } pPlan->execute(rotation, speed); } /** * TopLevelPlan */ TopLevelPlan::TopLevelPlan() : Plan(0) { } bool TopLevelPlan::isValid() { //always valid return true; } bool TopLevelPlan::usesSubPlan() { return true; } Plan *TopLevelPlan::createSubPlan() { //TODO: Pick a plan return NULL; } /** * GotoPointPlan */ GotoPointPlan::GotoPointPlan(float *pt) : Plan(20.0f) { memcpy( gotoPt, pt, sizeof( gotoPt )); } bool GotoPointPlan::usesSubPlan() { return false; } Plan *GotoPointPlan::createSubPlan() { return NULL; } void GotoPointPlan::execute(float &rotation, float &speed) { //TODO: goto point, then Plan::execute(rotation, speed); } /** * WeavePlan */ WeavePlan::WeavePlan(int pID, bool right ) : Plan(10.0) { playerID = pID; weaveRight = right; } bool WeavePlan::isValid() { Player *pPlayer = lookupPlayer(playerID); if (pPlayer == NULL) return false; if (!pPlayer->isAlive()) return false; LocalPlayer *myTank = LocalPlayer::getMyTank(); const float *pVel = myTank->getVelocity(); if ((pVel[0] == 0.0f) && (pVel[1] == 0.0f) && (pVel[2] == 0.0f)) return false; return true; } bool WeavePlan::usesSubPlan() { return false; } Plan* WeavePlan::createSubPlan() { return NULL; } void WeavePlan::execute(float &rotation, float &speed) { //TODO: weave, then Plan::execute(rotation, speed); } /** * HuntPlayerPlan */ HuntPlayerPlan::HuntPlayerPlan() :Plan(300.0f) { //Pick a player ID to hunt playerID = 0; } bool HuntPlayerPlan::isValid() { if (!Plan::isValid()) return false; Player *pPlayer = lookupPlayer(playerID); if (pPlayer == NULL) return false; if (!pPlayer->isAlive()) return false; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (pPlayer->getTeam() == myTank->getTeam()) return false; return true; } bool HuntPlayerPlan::usesSubPlan() { return true; } Plan *HuntPlayerPlan::createSubPlan() { Player *pPlayer = lookupPlayer(playerID); LocalPlayer *myTank = LocalPlayer::getMyTank(); bool isObscured = TargetingUtils::isLocationObscured( myTank->getPosition(), pPlayer->getPosition()); if (isObscured) { float pt[3]; // fill in pt with a open spot to go to return new GotoPointPlan(pt); } else { return new WeavePlan(playerID, bzfrand() > 0.5f); } } /** * HuntTeamFlagPlan */ HuntTeamFlagPlan::HuntTeamFlagPlan() : Plan(300.0f), flagID() { } bool HuntTeamFlagPlan::isValid() { return false; } bool HuntTeamFlagPlan::usesSubPlan() { return true; } Plan *HuntTeamFlagPlan::createSubPlan() { return NULL; } /** * CaptureFlagPlan */ CaptureFlagPlan::CaptureFlagPlan() :Plan(1200.0f) { } bool CaptureFlagPlan::isValid() { return false; } bool CaptureFlagPlan::usesSubPlan() { return true; } Plan *CaptureFlagPlan::createSubPlan() { return NULL; } bzflag-2.4.2+ds1/src/bzflag/Plan.h000066400000000000000000000100631200563112200165360ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef PLAN_H #define PLAN_H // bzflag global header #include "common.h" #include #include "TimeKeeper.h" class ShotPath; /** * Roger will follow a plan. These plans are stored on a plan stack * allowing for short medium and long range plans to cooperate to * produce a better playing bot. */ class Plan { public: Plan( float planDuration ); virtual ~Plan(); /** * checks to make sure this plan is still valid. The default * implementation just checks for an expiration time, to keep * roger from bullheadedly trying something that just aint * gonna work. You can override this method for specific plans * * @returns whether this plan is still valid */ virtual bool isValid(); /** * determines if this plan is a longer range plan that can * only be accomplished with smaller steps. Hunting a player * might consist of avoiding a building, or weaving, for instance. * if this method returns true, than this plan is just a coordinator * of sub plans. * * @returns whether this plan uses sub plans */ virtual bool usesSubPlan() = 0; /** * creates a sub plan to be placed on the stack to accomplish * this plan's goals. This method only gets called if usesSubPlan * return true. * * @returns a plan that can be used to accomplish part of this task */ virtual Plan *createSubPlan() = 0; /** * execute the plan. The default implementation just attempts * to shoot at enemies. Overridden methods should call this base * implementation. This method only gets called if usesSubPlan * return false. * * @param rotation an output reference to the desired rotation * @param speed an output reference to the desired speed */ virtual void execute(float &rotation, float &speed); /** * checks to see if i am in imminent danger. If so move so * that my danger level goes down. Avoiding bullets * is not a plan, it operates a more subconscious level. * * returns whether or not we avoided a bullet */ static bool avoidBullet(float &rotation, float &speed); private: static ShotPath *findWorstBullet(float &minDistance); TimeKeeper planExpiration; TimeKeeper lastShot; }; class PlanStack { public: PlanStack(); ~PlanStack(); void execute(float &rotation, float &speed); private: std::stack plans; }; class TopLevelPlan : public Plan { public: TopLevelPlan(); virtual bool isValid(); virtual bool usesSubPlan(); virtual Plan *createSubPlan() ; }; class GotoPointPlan : public Plan { public: GotoPointPlan(float *pt); virtual bool usesSubPlan(); virtual Plan *createSubPlan() ; virtual void execute(float &rotation, float &speed); private: float gotoPt[3]; }; class WeavePlan : public Plan { public: WeavePlan(int pID, bool right ); virtual bool isValid(); virtual bool usesSubPlan(); virtual Plan* createSubPlan(); virtual void execute(float &rotation, float &speed); private: int playerID; bool weaveRight; }; class HuntPlayerPlan : public Plan { public: HuntPlayerPlan(); virtual bool isValid(); virtual bool usesSubPlan(); virtual Plan *createSubPlan(); private: int playerID; }; class HuntTeamFlagPlan : public Plan { public: HuntTeamFlagPlan(); virtual bool isValid(); virtual bool usesSubPlan(); virtual Plan *createSubPlan(); private: int flagID; }; class CaptureFlagPlan : public Plan { public: CaptureFlagPlan(); virtual bool isValid(); virtual bool usesSubPlan(); virtual Plan *createSubPlan(); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Player.cxx000066400000000000000000001122271200563112200174600ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Player.h" // common interface headers #include "TankSceneNode.h" #include "SceneRenderer.h" #include "SphereSceneNode.h" #include "OpenGLMaterial.h" #include "BZDBCache.h" #include "TextureManager.h" #include "CollisionManager.h" #include "ObstacleMgr.h" #include "PhysicsDriver.h" #include "ObstacleList.h" #include "WallObstacle.h" // local implementation headers #include "playing.h" #include "World.h" #include "TrackMarks.h" #include "sound.h" #include "effectsRenderer.h" #include "Roaming.h" // for dead reckoning static const float MaxUpdateTime = 1.0f; // seconds // // Player // int Player::tankTexture = -1; Player::Player(const PlayerId& _id, TeamColor _team, const char* name, const char* _motto, const PlayerType _type) : lastObstacle(NULL), pauseMessageState(false), handicap(0.0f), notResponding(false), hunted(false), id(_id), admin(false), registered(false), verified(false), playerList(false), lastVisualTeam(NoTeam), team(_team), type(_type), flagType(Flags::Null), fromTeleporter(0), toTeleporter(0), teleporterProximity(0.0f), wins(0), losses(0), tks(0), localWins(0), localLosses(0), localTks(0), autoPilot(false), relativeSpeed(), relativeAngVel(), inputRelVel(), inputRelSpeed(), deltaTime(0.0), offset(0.0), deadReckoningState(0), oldStatus(0), oldZSpeed(0.0f) { static const float zero[3] = { 0.0f, 0.0f, 0.0f }; move(zero, 0.0f); setVelocity(zero); setAngularVelocity(0.0f); setPhysicsDriver(-1); setDeadReckoning(); setRelativeMotion(); setUserSpeed(0.0f); setUserAngVel(0.0f); apparentVelocity[0] = apparentVelocity[1] = apparentVelocity[2] = 0.0f; inputTimestamp = 0.0f; reportedHits = 0; computedHits = 0; // set call sign ::strncpy(callSign, name, CallSignLen); callSign[CallSignLen-1] = '\0'; setMotto(_motto); // will be superseded by the server if (id != ServerPlayer) { // make scene nodes tankNode = new TankSceneNode(state.pos, forward); tankIDLNode = new TankIDLSceneNode(tankNode); changeTeam(team); const float sphereRad = (1.5f * BZDBCache::tankRadius); if (RENDERER.useQuality() >= 2) { pausedSphere = new SphereLodSceneNode(state.pos, sphereRad); } else { pausedSphere = new SphereBspSceneNode(state.pos, sphereRad); } pausedSphere->setColor(0.0f, 0.0f, 0.0f, 0.5f); } // setup the dimension properties dimensions[0] = 0.5f * BZDBCache::tankLength; dimensions[1] = 0.5f * BZDBCache::tankWidth; dimensions[2] = BZDBCache::tankHeight; for (int i = 0; i < 3; i++) { dimensionsRate[i] = 0.0f; dimensionsScale[i] = 1.0f; dimensionsTarget[i] = 1.0f; } useDimensions = false; // setup alpha properties alpha = 1.0f; alphaRate = 0.0f; alphaTarget = 1.0f; teleAlpha = 1.0f; haveIpAddr = false; // no IP address yet lastTrackDraw = TimeKeeper::getTick(); spawnTime = TimeKeeper::getTick(); return; } Player::~Player() { if (id != ServerPlayer) { delete tankIDLNode; delete tankNode; delete pausedSphere; } } // Take into account the quality of player wins/(wins+loss) // Try to penalize winning casuality static float rabbitRank (int wins, int losses) { // otherwise do score-based ranking int sum = wins + losses; if (sum == 0) return 0.5; float average = (float)wins/(float)sum; // IIRC that is how wide is the gaussian float penalty = (1.0f - 0.5f / sqrt((float)sum)); return average * penalty; } void Player::setMotto(const char* _motto) { strncpy(motto, _motto, MottoLen); motto[MottoLen - 1] = '\0'; // ensure null termination } float Player::getTKRatio() const { if (wins == 0) { // well, we have to return *something* if they have no wins return (float)tks/1.0f; } else { return (float)tks/(float)wins; } } // returns a value between 1.0 and -1.0 float Player::getNormalizedScore() const { return ((float)wins - losses) / ((wins+losses>20) ? wins+losses : 20); } float Player::getLocalNormalizedScore() const { return ((float)localWins - localLosses) / ((localWins+localLosses>5) ? localWins+localLosses : 5); } short Player::getRabbitScore() const { return (int)(rabbitRank(wins, losses) * 100.0); } float Player::getRadius() const { // NOTE: this encompasses everything but Narrow // the Obese, Tiny, and Thief flags adjust // the radius, but Narrow does not. return (dimensionsScale[0] * BZDBCache::tankRadius); } float Player::getMaxSpeed ( void ) const { // BURROW and AGILITY will not be taken into account const FlagType* flag = getFlag(); float maxSpeed = BZDBCache::tankSpeed; if (flag == Flags::Velocity) { maxSpeed *= BZDB.eval(StateDatabase::BZDB_VELOCITYAD); } else if (flag == Flags::Thief) { maxSpeed *= BZDB.eval(StateDatabase::BZDB_THIEFVELAD); } return maxSpeed; } void Player::getMuzzle(float* m) const { // NOTE: like getRadius(), we only use dimensionsScale[0]. // as well, we do not use BZDB_MUZZLEFRONT, but the // 0.1f value listed in global.cxx is added on to the // scaled version of tankRadius. float front = (dimensionsScale[0] * BZDBCache::tankRadius); if (dimensionsRate[0] > 0.0f) { front = front + (dimensionsRate[0] * 0.1f); } front = front + 0.1f; m[0] = state.pos[0] + (front * forward[0]); m[1] = state.pos[1] + (front * forward[1]); const float height = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); m[2] = state.pos[2] + (height * dimensionsScale[2]); return; } float Player::getMuzzleHeight() const { return (dimensionsScale[2] * BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT)); } void Player::forceReload(float time) { jamTime = TimeKeeper::getTick(); jamTime += time; } void Player::move(const float* _pos, float _azimuth) { // assumes _forward is normalized state.pos[0] = _pos[0]; state.pos[1] = _pos[1]; state.pos[2] = _pos[2]; state.azimuth = _azimuth; // limit angle if (state.azimuth < 0.0f) { state.azimuth = (float)((2.0 * M_PI) - fmodf(-state.azimuth, (float)(2.0 * M_PI))); } else if (state.azimuth >= (2.0f * M_PI)) { state.azimuth = fmodf(state.azimuth, (float)(2.0 * M_PI)); } // update forward vector (always in horizontal plane) forward[0] = cosf(state.azimuth); forward[1] = sinf(state.azimuth); forward[2] = 0.0f; // compute teleporter proximity if (World::getWorld()) { teleporterProximity = World::getWorld()->getProximity(state.pos, BZDBCache::tankRadius); } } void Player::setVelocity(const float* _velocity) { state.velocity[0] = _velocity[0]; state.velocity[1] = _velocity[1]; state.velocity[2] = _velocity[2]; } void Player::setAngularVelocity(float _angVel) { state.angVel = _angVel; } void Player::setPhysicsDriver(int driver) { state.phydrv = driver; const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(driver); if (phydrv != NULL) { state.status |= PlayerState::OnDriver; } else { state.status &= ~PlayerState::OnDriver; } return; } void Player::setRelativeMotion() { bool falling = (state.status & short(PlayerState::Falling)) != 0; if (falling && (getFlag() != Flags::Wings)) { // no adjustments while falling return; } // set 'relativeSpeed' and 'relativeAngVel' float relativeVel[2]; Player::calcRelativeMotion(relativeVel, relativeSpeed, relativeAngVel); return; } void Player::setUserSpeed(float speed) { state.userSpeed = speed; return; } void Player::setUserAngVel(float angVel) { state.userAngVel = angVel; return; } void Player::calcRelativeMotion(float vel[2], float& speed, float& angVel) { vel[0] = state.velocity[0]; vel[1] = state.velocity[1]; angVel = state.angVel; const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(state.phydrv); if (phydrv != NULL) { const float* v = phydrv->getLinearVel(); const float av = phydrv->getAngularVel(); const float* ap = phydrv->getAngularPos(); // adjust for driver velocity vel[0] -= v[0]; vel[1] -= v[1]; // adjust for driver angular velocity if (av != 0.0f) { const float dx = state.pos[0] - ap[0]; const float dy = state.pos[1] - ap[1]; vel[0] += av * dy; vel[1] -= av * dx; angVel = state.angVel - av; } } // speed relative to the tank's direction // (could use forward[] instead of re-doing the trig, but this is // used in the setDeadReckoning(), when forward[] is not yet set) speed = (vel[0] * cosf(state.azimuth)) + (vel[1] * sinf(state.azimuth)); return; } void Player::changeTeam(TeamColor _team) { // set team team = _team; // set the scene node setVisualTeam(team); } void Player::setStatus(short _status) { state.status = _status; } void Player::setExplode(const TimeKeeper& t) { if (!isAlive()) return; explodeTime = t; setStatus((getStatus() | short(PlayerState::Exploding) | short(PlayerState::Falling)) & ~(short(PlayerState::Alive) | short(PlayerState::Paused))); tankNode->rebuildExplosion(); // setup the flag effect to revert to normal updateFlagEffect(Flags::Null); } void Player::setDeathEffect ( TankDeathOverride *e ) { if (tankNode) tankNode->setDeathOverride(e); } TankDeathOverride* Player::getDeathEffect ( void ) { if (tankNode) return tankNode->getDeathOverride(); return NULL; } void Player::setTeleport(const TimeKeeper& t, short from, short to) { if (!isAlive()) return; teleportTime = t; fromTeleporter = from; toTeleporter = to; setStatus(getStatus() | short(PlayerState::Teleporting)); } void Player::updateTank(float dt, bool local) { updateDimensions(dt, local); updateTranslucency(dt); updateTreads(dt); updateJumpJets(dt); updateTrackMarks(); return; } void Player::updateJumpJets(float dt) { float jumpVel; if (getFlag() == Flags::Wings) { jumpVel = BZDB.eval(StateDatabase::BZDB_WINGSJUMPVELOCITY); } else { jumpVel = BZDB.eval(StateDatabase::BZDB_JUMPVELOCITY); } const float jetTime = 0.5f * (jumpVel / -BZDBCache::gravity); state.jumpJetsScale -= (dt / jetTime); if (state.jumpJetsScale < 0.0f) { state.jumpJetsScale = 0.0f; state.status &= ~PlayerState::JumpJets; } return; } void Player::updateTrackMarks() { const float minSpeed = 0.1f; // relative speed slop if (isAlive() && !isFalling() && !isPhantomZoned()) { const float lifeTime = float(TimeKeeper::getTick() - lastTrackDraw); if (lifeTime > TrackMarks::updateTime) { bool drawMark = true; float markPos[3]; markPos[2] = state.pos[2]; // FIXME - again, this should be pulled for TankGeometryMgr const float fullLength = 6.0f; const float treadHeight = 1.2f; const float dist = dimensions[0] * ((fullLength - treadHeight) / fullLength); if (relativeSpeed > +minSpeed) { // draw the mark at the back of the treads markPos[0] = state.pos[0] - (forward[0] * dist); markPos[1] = state.pos[1] - (forward[1] * dist); } else if (relativeSpeed < -minSpeed) { // draw the mark at the front of the treads markPos[0] = state.pos[0] + (forward[0] * dist); markPos[1] = state.pos[1] + (forward[1] * dist); } else { drawMark = false; } if (drawMark) { TrackMarks::addMark(markPos, dimensionsScale[1], state.azimuth, state.phydrv); lastTrackDraw = TimeKeeper::getTick(); } } } return; } void Player::updateDimensions(float dt, bool local) { // copy the current information float oldRates[3]; float oldScales[3]; float oldDimensions[3]; memcpy (oldRates, dimensionsRate, sizeof(float[3])); memcpy (oldScales, dimensionsScale, sizeof(float[3])); memcpy (oldDimensions, dimensions, sizeof(float[3])); // update the dimensions bool resizing = false; for (int i = 0; i < 3; i++) { if (dimensionsRate[i] != 0.0f) { resizing = true; dimensionsScale[i] += (dt * dimensionsRate[i]); if (dimensionsRate[i] < 0.0f) { if (dimensionsScale[i] < dimensionsTarget[i]) { dimensionsScale[i] = dimensionsTarget[i]; dimensionsRate[i] = 0.0f; } } else { if (dimensionsScale[i] > dimensionsTarget[i]) { dimensionsScale[i] = dimensionsTarget[i]; dimensionsRate[i] = 0.0f; } } } else { // safety play, should not be required dimensionsScale[i] = dimensionsTarget[i]; } } // set the actual dimensions based on the scale dimensions[0] = dimensionsScale[0] * (0.5f * BZDBCache::tankLength); dimensions[1] = dimensionsScale[1] * (0.5f * BZDBCache::tankWidth); dimensions[2] = dimensionsScale[2] * BZDBCache::tankHeight; // do not resize if it will cause a collision // only checked for the local player, remote is computationally expensive if (local) { // also do not bother with collision checking if we are not resizing if (resizing && hitObstacleResizing()) { // copy the old information memcpy (dimensions, oldDimensions, sizeof(float[3])); memcpy (dimensionsScale, oldScales, sizeof(float[3])); memcpy (dimensionsRate, oldRates, sizeof(float[3])); } } // check if the dimensions are at a steady state if ((dimensionsScale[0] == dimensionsTarget[0]) && (dimensionsScale[1] == dimensionsTarget[1]) && (dimensionsScale[2] == dimensionsTarget[2])) { useDimensions = false; } else { useDimensions = true; } return; } bool Player::hitObstacleResizing() { const float* dims = dimensions; // check walls const World* world = World::getWorld(); if (world) { const ObstacleList& walls = OBSTACLEMGR.getWalls(); for (unsigned int i = 0; i < walls.size(); i++) { const WallObstacle* wall = (const WallObstacle*) walls[i]; if (wall->inBox(getPosition(), getAngle(), dims[0], dims[1], dims[2])) { return true; } } } // check everything else const ObsList* olist = COLLISIONMGR.boxTest(getPosition(), getAngle(), dims[0], dims[1], dims[2]); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; const bool onTop = obs->isFlatTop() && ((obs->getPosition()[2] + obs->getHeight()) <= getPosition()[2]); if (!obs->isDriveThrough() && !onTop && obs->inBox(getPosition(), getAngle(), dims[0], dims[1], dims[2])) { return true; } } return false; } void Player::updateTranslucency(float dt) { // update the alpha value if (alphaRate != 0.0f) { alpha += dt * alphaRate; if (alphaRate < 0.0f) { if (alpha < alphaTarget) { alpha = alphaTarget; alphaRate = 0.0f; } } else { if (alpha > alphaTarget) { alpha = alphaTarget; alphaRate = 0.0f; } } } // set the tankNode color if (isPhantomZoned()) { teleAlpha = 1.0f; color[3] = 0.25f; // barely visible, regardless of teleporter proximity } else { teleporterProximity = World::getWorld()->getProximity(state.pos, BZDBCache::tankRadius); teleAlpha = (1.0f - (0.75f * teleporterProximity)); if (alpha == 0.0f) { color[3] = 0.0f; // not trusting FP accuracy } else { color[3] = teleAlpha * alpha; } } return; } void Player::updateTreads(float dt) { float speedFactor; float angularFactor; if ((state.status & PlayerState::UserInputs) != 0) { speedFactor = state.userSpeed; angularFactor = state.userAngVel; } else { speedFactor = relativeSpeed; angularFactor = relativeAngVel; } // setup the linear component if (dimensionsScale[0] > 1.0e-6f) { speedFactor = speedFactor / dimensionsScale[0]; } else { speedFactor = speedFactor * 1.0e6f; } // setup the angular component const float angularScale = 4.0f; // spin factor (at 1.0, the edges line up) angularFactor *= angularScale; const float halfWidth = 0.5f * BZDBCache::tankWidth; // not using dimensions[1], because it may be set to 0.001 by a Narrow flag angularFactor *= dimensionsScale[0] * halfWidth; const float leftOff = dt * (speedFactor - angularFactor); const float rightOff = dt * (speedFactor + angularFactor); tankNode->addTreadOffsets(leftOff, rightOff); return; } void Player::changeScore(short deltaWins, short deltaLosses, short deltaTeamKills) { wins += deltaWins; losses += deltaLosses; tks += deltaTeamKills; } void Player::changeLocalScore(short dWins, short dLosses, short dTeamKills) { localWins += dWins; localLosses += dLosses; localTks += dTeamKills; } void Player::setFlag(FlagType* _flag) { // set the type flagType = _flag; updateFlagEffect(flagType); return; } void Player::updateFlagEffect(FlagType* effectFlag) { float FlagEffectTime = BZDB.eval(StateDatabase::BZDB_FLAGEFFECTTIME); if (FlagEffectTime <= 0.0f) { FlagEffectTime = 0.001f; // safety } // set the dimension targets dimensionsTarget[0] = 1.0f; dimensionsTarget[1] = 1.0f; dimensionsTarget[2] = 1.0f; if (effectFlag == Flags::Obesity) { const float factor = BZDB.eval(StateDatabase::BZDB_OBESEFACTOR); dimensionsTarget[0] = factor; dimensionsTarget[1] = factor; } else if (effectFlag == Flags::Tiny) { const float factor = BZDB.eval(StateDatabase::BZDB_TINYFACTOR); dimensionsTarget[0] = factor; dimensionsTarget[1] = factor; } else if (effectFlag == Flags::Thief) { const float factor = BZDB.eval(StateDatabase::BZDB_THIEFTINYFACTOR); dimensionsTarget[0] = factor; dimensionsTarget[1] = factor; } else if (effectFlag == Flags::Narrow) { dimensionsTarget[1] = 0.001f; } // set the dimension rates for (int i = 0; i < 3; i++) { if (dimensionsTarget[i] != dimensionsScale[i]) { dimensionsRate[i] = dimensionsTarget[i] - dimensionsScale[i]; dimensionsRate[i] = dimensionsRate[i] / FlagEffectTime; } } // set the alpha target if (effectFlag == Flags::Cloaking) { alphaTarget = 0.0f; } else { alphaTarget = 1.0f; } // set the alpha rate if (alphaTarget != alpha) { alphaRate = (alphaTarget - alpha) / FlagEffectTime; } return; } void Player::endShot(int index, bool isHit, bool showExplosion) { float pos[3]; if (doEndShot(index, isHit, pos) && showExplosion) { addShotExplosion(pos); } return; } void Player::setVisualTeam (TeamColor visualTeam) { // only do all this junk when the effective team color actually changes if (visualTeam == lastVisualTeam) return; lastVisualTeam = visualTeam; static const GLfloat tankSpecular[3] = { 0.1f, 0.1f, 0.1f }; static GLfloat tankEmissive[3] = { 0.0f, 0.0f, 0.0f }; static float tankShininess = 20.0f; static GLfloat rabbitEmissive[3] = { 0.0f, 0.0f, 0.0f }; static float rabbitShininess = 100.0f; GLfloat *emissive; GLfloat shininess; if (visualTeam == RabbitTeam) { emissive = rabbitEmissive; shininess = rabbitShininess; } else { emissive = tankEmissive; shininess = tankShininess; } TextureManager &tm = TextureManager::instance(); std::string texName; texName = Team::getImagePrefix(visualTeam); texName += BZDB.get("tankTexture"); // now after we did all that, see if they have a user texture tankTexture = -1; if (userTexture.size()) tankTexture = tm.getTextureID(userTexture.c_str(),false); // if the user load failed try our calculated texture if (tankTexture < 0) tankTexture = tm.getTextureID(texName.c_str(),false); const float* _color = Team::getTankColor(visualTeam); color[0] = _color[0]; color[1] = _color[1]; color[2] = _color[2]; tankNode->setMaterial(OpenGLMaterial(tankSpecular, emissive, shininess)); tankNode->setTexture(tankTexture); int jumpJetsTexture = tm.getTextureID("jumpjets", false); tankNode->setJumpJetsTexture(jumpJetsTexture); } void Player::fireJumpJets() { state.jumpJetsScale = 1.0f; state.status |= PlayerState::JumpJets; return; } void Player::clearRemoteSounds() { state.sounds = PlayerState::NoSounds; state.status &= ~PlayerState::PlaySound; return; } void Player::addRemoteSound(int sound) { state.sounds |= sound; if (state.sounds != PlayerState::NoSounds) { state.status |= PlayerState::PlaySound; } return; } void Player::addToScene(SceneDatabase* scene, TeamColor effectiveTeam, bool inCockpit, bool seerView, bool showTreads, bool showIDL) { const GLfloat groundPlane[4] = {0.0f, 0.0f, 1.0f, 0.0f}; if (!isAlive() && !isExploding()) { return; // don't draw anything } // place the tank tankNode->move(state.pos, forward); // only use dimensions if we aren't at steady state. // this is done because it's more expensive to use // GL_NORMALIZE then to use precalculated normals. if (useDimensions) { tankNode->setDimensions(dimensionsScale); } else { if (flagType == Flags::Obesity) tankNode->setObese(); else if (flagType == Flags::Tiny) tankNode->setTiny(); else if (flagType == Flags::Narrow) tankNode->setNarrow(); else if (flagType == Flags::Thief) tankNode->setThief(); else tankNode->setNormal(); } // is this tank fully cloaked? const bool cloaked = (flagType == Flags::Cloaking) && (color[3] == 0.0f); if (cloaked && !seerView) { return; // don't draw anything } // setup the visibility properties if (inCockpit && !showTreads) { tankNode->setOnlyShadows(true); } else { tankNode->setOnlyShadows(false); } // adjust alpha for seerView if (seerView) { if (isPhantomZoned()) { color[3] = 0.25f; } else { color[3] = teleAlpha; } } // setup the color and material setVisualTeam(effectiveTeam); tankNode->setColor(color); tankNode->setInTheCockpit(inCockpit); // reset the clipping plane tankNode->setClipPlane(NULL); tankNode->setJumpJets(0.0f); if (isAlive()) { tankNode->setExplodeFraction(0.0f); tankNode->setJumpJets(state.jumpJetsScale); scene->addDynamicNode(tankNode); if (isCrossingWall()) { // get which plane to compute IDL against GLfloat plane[4]; const GLfloat a = atan2f(forward[1], forward[0]); const Obstacle* obstacle = World::getWorld()->hitBuilding(state.pos, a, dimensions[0], dimensions[1], dimensions[2]); if ((obstacle && obstacle->isCrossing(state.pos, a, dimensions[0], dimensions[1], dimensions[2], plane)) || World::getWorld()->crossingTeleporter(state.pos, a, dimensions[0], dimensions[1], dimensions[2], plane)) { // stick in interdimensional lights node if (showIDL) { tankIDLNode->move(plane); scene->addDynamicNode(tankIDLNode); } // add clipping plane to tank node if (!inCockpit) { tankNode->setClipPlane(plane); } } } else if (getPosition()[2] < 0.0f) { // this should only happen with Burrow flags tankNode->setClipPlane(groundPlane); } // isCrossingWall() } // isAlive() else if (isExploding() && (state.pos[2] > ZERO_TOLERANCE)) { float t = float((TimeKeeper::getTick() - explodeTime) / BZDB.eval(StateDatabase::BZDB_EXPLODETIME)); if (t > 1.0f) { // FIXME - setStatus(DeadStatus); t = 1.0f; } else if (t < 0.0f) { // shouldn't happen but why take chances t = 0.0f; } // fade at the end of the explosion const float fadeRatio = 0.8f; if (t > fadeRatio) { GLfloat newColor[4]; memcpy(newColor, color, sizeof(float[3])); const float fadeFactor = (1.0f - t) / (1.0f - fadeRatio); newColor[3] = color[3] * fadeFactor; tankNode->setColor(newColor); } tankNode->setExplodeFraction(t); tankNode->setClipPlane(groundPlane); // shadows are not clipped scene->addDynamicNode(tankNode); } if (isAlive() && (isPaused() || isNotResponding())) { pausedSphere->move(state.pos, 1.5f * BZDBCache::tankRadius * dimensionsScale[0]); scene->addDynamicSphere(pausedSphere); } } void Player::setLandingSpeed(float velocity) { float squishiness = BZDB.eval(StateDatabase::BZDB_SQUISHFACTOR); if (squishiness < 0.001f) { return; } float squishTime = BZDB.eval(StateDatabase::BZDB_SQUISHTIME); if (squishTime < 0.001) { return; } const float gravity = BZDBCache::gravity; if (velocity > 0.0f) { velocity = 0.0f; } // Setup so that a drop height of BZDB_GRAVITY squishes // by a factor of 1/11, when BZDB_SQUISHFACTOR is set to 1 // // G = gravity; V = velocity; D = fall distance; K = factor // // V = sqrt (2 * D * G) // V = sqrt(2) * G { @ D = G) // scale = 1 / (1 + (K * V^2)) // scale = 1 / (1 + (K * 2 * G^2)) // set: (K * 2 * G^2) = 0.1 // K = 0.1 / (2 * G^2) // float k = 0.1f / (2.0f * gravity * gravity); k = k * squishiness; if (flagType == Flags::Bouncy) { k = k * 4.0f; } const float newZscale = 1.0f / (1.0f + (k * (velocity * velocity))); // don't update if the tank is still recovering // from a spawn effect or a larger fall. if (newZscale < dimensionsScale[2]) { dimensionsScale[2] = newZscale; // use a fixed decompression rate dimensionsRate[2] = 1.0f / squishTime; } return; } void Player::spawnEffect() { const float squishiness = BZDB.eval(StateDatabase::BZDB_SQUISHFACTOR); if (squishiness > 0.0f) { const float effectTime = BZDB.eval(StateDatabase::BZDB_FLAGEFFECTTIME); const float factor = 1.0f / effectTime; for (int i = 0; i < 3; i++) { dimensionsRate[i] = factor; dimensionsScale[i] = 0.01f; } } spawnTime = TimeKeeper::getTick(); return; } int Player::getMaxShots() const { return World::getWorld()->getMaxShots(); } void Player::addShots(SceneDatabase* scene, bool colorblind) const { const int count = getMaxShots(); for (int i = 0; i < count; i++) { ShotPath* shot = getShot(i); if (shot && !shot->isExpiring() && !shot->isExpired()) shot->addShot(scene, colorblind); } } void* Player::unpack(void* buf, uint16_t code) { float timestamp; PlayerId ident; buf = nboUnpackFloat(buf, timestamp); buf = nboUnpackUByte(buf, ident); buf = state.unpack(buf, code); setDeadReckoning(timestamp); setRelativeMotion(); return buf; } bool Player::validTeamTarget(const Player *possibleTarget) const { TeamColor myTeam = getTeam(); TeamColor targetTeam = possibleTarget->getTeam(); if (myTeam != targetTeam || !World::getWorld()->allowTeams()) { return true; } if (myTeam != RogueTeam) { return false; } return !World::getWorld()->allowRabbit(); } void Player::getDeadReckoning(float* predictedPos, float* predictedAzimuth, float* predictedVel, float dt) const { *predictedAzimuth = inputAzimuth; if (inputStatus & PlayerState::Paused) { // don't move when paused predictedPos[0] = inputPos[0]; predictedPos[1] = inputPos[1]; predictedPos[2] = inputPos[2]; predictedVel[0] = 0.0f; predictedVel[1] = 0.0f; predictedVel[2] = 0.0f; } else if (inputStatus & PlayerState::Falling) { // no control when falling predictedVel[0] = inputVel[0]; predictedVel[1] = inputVel[1]; predictedPos[0] = inputPos[0] + (dt * inputVel[0]); predictedPos[1] = inputPos[1] + (dt * inputVel[1]); // only turn if alive if (inputStatus & PlayerState::Alive) { *predictedAzimuth += (dt * inputAngVel); } // following the parabola predictedVel[2] = inputVel[2] + (BZDBCache::gravity * dt); predictedPos[2] = inputPos[2] + (inputVel[2] * dt) + (0.5f * BZDBCache::gravity * dt * dt); } else { // velocity[2] is zero when not falling, except for Burrow flag predictedVel[2] = inputVel[2]; predictedPos[2] = inputPos[2] + (inputVel[2] * dt); // different algorithms for tanks moving in // a straight line vs. turning in a circle if (!inputTurning) { // move straight predictedVel[0] = inputRelVel[0]; predictedVel[1] = inputRelVel[1]; predictedPos[0] = inputPos[0] + (dt * inputRelVel[0]); predictedPos[1] = inputPos[1] + (dt * inputRelVel[1]); } else { // make a sweeping arc const float angle = (dt * inputRelAngVel); *predictedAzimuth += angle; const float cos_val = cosf(angle); const float sin_val = sinf(angle); const float* tc = inputTurnCenter; const float* tv = inputTurnVector; predictedPos[0] = tc[0] + ((tv[0] * cos_val) - (tv[1] * sin_val)); predictedPos[1] = tc[1] + ((tv[1] * cos_val) + (tv[0] * sin_val)); const float* rv = inputRelVel; predictedVel[0] = (rv[0] * cos_val) - (rv[1] * sin_val); predictedVel[1] = (rv[1] * cos_val) + (rv[0] * sin_val); } // make the physics driver adjustments const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(inputPhyDrv); if (phydrv != NULL) { if (phydrv->getIsSlide()) { predictedVel[0] = inputRelVel[0]; predictedVel[1] = inputRelVel[1]; predictedPos[0] = inputPos[0] + (dt * inputRelVel[0]); predictedPos[1] = inputPos[1] + (dt * inputRelVel[1]); } else { // angular velocity adjustment const float pdAngVel = phydrv->getAngularVel(); if (pdAngVel != 0.0f) { const float angle = (dt * pdAngVel); *predictedAzimuth += angle; const float* pdAngPos = phydrv->getAngularPos(); const float dx = predictedPos[0] - pdAngPos[0]; const float dy = predictedPos[1] - pdAngPos[1]; const float cos_val = cosf(angle); const float sin_val = sinf(angle); predictedPos[0] = pdAngPos[0] + ((dx * cos_val) - (dy * sin_val)); predictedPos[1] = pdAngPos[1] + ((dy * cos_val) + (dx * sin_val)); predictedVel[0] += (-dy * pdAngVel); predictedVel[1] += (+dx * pdAngVel); } // linear velocity adjustment const float* pdVel = phydrv->getLinearVel(); predictedPos[0] += (dt * pdVel[0]); predictedPos[1] += (dt * pdVel[1]); predictedVel[0] += pdVel[0]; predictedVel[1] += pdVel[1]; } } } return; } bool Player::isDeadReckoningWrong() const { const uint16_t checkStates = (PlayerState::Alive | PlayerState::Paused | PlayerState::Falling); // always send a new packet when some kinds of status change if ((state.status & checkStates) != (inputStatus & checkStates)) { return true; } // never send a packet when dead if ((state.status & PlayerState::Alive) == 0) { return false; } // send a packet if we've made some noise if (state.sounds != PlayerState::NoSounds) { return true; } // send a packet if we've crossed a physics driver boundary if (state.phydrv != inputPhyDrv) { return true; } // time since setdeadreckoning const float dt = float(TimeKeeper::getTick() - inputTime); // otherwise always send at least one packet per second if (dt >= MaxUpdateTime) { return true; } // get predicted state float predictedPos[3]; float predictedVel[3]; float predictedAzimuth; getDeadReckoning(predictedPos, &predictedAzimuth, predictedVel, dt); // always send a new packet on reckoned touchdown float groundLimit = 0.0f; if (getFlag() == Flags::Burrow) { groundLimit = BZDB.eval(StateDatabase::BZDB_BURROWDEPTH); } if (predictedPos[2] < groundLimit) { return true; } // client side throttling const int throttleRate = int(BZDB.eval(StateDatabase::BZDB_UPDATETHROTTLERATE)); const float minUpdateTime = (throttleRate > 0) ? (1.0f / throttleRate) : 0.0f; if (dt < minUpdateTime) { return false; } // see if position and azimuth are close enough float positionTolerance = BZDB.eval(StateDatabase::BZDB_POSITIONTOLERANCE); if ((fabsf(state.pos[0] - predictedPos[0]) > positionTolerance) || (fabsf(state.pos[1] - predictedPos[1]) > positionTolerance) || (fabsf(state.pos[2] - predictedPos[2]) > positionTolerance)) { if (debugLevel >= 4) { if (fabsf(state.pos[0] - predictedPos[0]) > positionTolerance) { printf ("state.pos[0] = %f, predictedPos[0] = %f\n", state.pos[0], predictedPos[0]); } if (fabsf(state.pos[1] - predictedPos[1]) > positionTolerance) { printf ("state.pos[1] = %f, predictedPos[1] = %f\n", state.pos[1], predictedPos[1]); } if (fabsf(state.pos[2] - predictedPos[2]) > positionTolerance) { printf ("state.pos[2] = %f, predictedPos[2] = %f\n", state.pos[2], predictedPos[2]); } } return true; } float angleTolerance = BZDB.eval(StateDatabase::BZDB_ANGLETOLERANCE); if (fabsf(state.azimuth - predictedAzimuth) > angleTolerance) { logDebugMessage(4,"state.azimuth = %f, predictedAzimuth = %f\n", state.azimuth, predictedAzimuth); return true; } // prediction is good enough return false; } void Player::doDeadReckoning() { if (!isAlive() && !isExploding()) { return; } // get predicted state float predictedPos[3]; float predictedVel[3]; float predictedAzimuth; float dt = float(TimeKeeper::getTick() - inputTime); getDeadReckoning(predictedPos, &predictedAzimuth, predictedVel, dt); // setup notResponding if (!isAlive()) { notResponding = false; } else { notResponding = (dt > BZDB.eval(StateDatabase::BZDB_NOTRESPONDINGTIME)); } // if hit ground then update input state (we don't want to fall anymore) float groundLimit = 0.0f; if (getFlag() == Flags::Burrow) { groundLimit = BZDB.eval(StateDatabase::BZDB_BURROWDEPTH); } // the velocity check is for when a Burrow flag is dropped if ((predictedPos[2] < groundLimit) && (predictedVel[2] <= 0.0f)) { predictedPos[2] = groundLimit; predictedVel[2] = 0.0f; inputStatus &= ~PlayerState::Falling; inputVel[2] = 0.0f; } // setup remote players' landing sounds and graphics, and jumping sounds if (isAlive()) { // the importance level of the remote sounds const bool soundImportance = false; const bool localSound = (ROAM.isRoaming() && (ROAM.getMode() == Roaming::roamViewFP) && (ROAM.getTargetTank() == this)); // check for a landing if (((oldStatus & PlayerState::Falling) != 0) && ((inputStatus & PlayerState::Falling) == 0)) { // setup the squish effect setLandingSpeed(oldZSpeed); // make it "land" EFFECTS.addLandEffect(getColor(),state.pos,state.azimuth); // setup the sound if (BZDB.isTrue("remoteSounds")) { if ((getFlag() != Flags::Burrow) || (predictedPos[2] > 0.0f)) { playSound(SFX_LAND, state.pos, soundImportance, localSound); } else { // probably never gets played playSound(SFX_BURROW, state.pos, soundImportance, localSound); } } } // play jumping type sounds, and then clear them if (state.sounds != PlayerState::NoSounds) { if (BZDB.isTrue("remoteSounds")) { if ((state.sounds & PlayerState::JumpSound) != 0) { playSound(SFX_JUMP, state.pos, soundImportance, localSound); } if ((state.sounds & PlayerState::WingsSound) != 0) { playSound(SFX_FLAP, state.pos, soundImportance, localSound); } if ((state.sounds & PlayerState::BounceSound) != 0) { playSound(SFX_BOUNCE, state.pos, soundImportance, localSound); } } state.sounds = PlayerState::NoSounds; } } // copy some old state oldZSpeed = state.velocity[2]; oldStatus = inputStatus; move(predictedPos, predictedAzimuth); setVelocity(predictedVel); setRelativeMotion(); return; } // How long does the filter takes to be considered "initialized" const int DRStateStable = 100; const float maxToleratedJitter = 1.0f; void Player::setDeadReckoning(float timestamp) { // calculate apparent speed // const float timeelapsed = TimeKeeper::getTick() - inputTime; const float dt = timestamp - inputTimestamp; inputTimestamp = timestamp; if (dt > 0.0f && dt < MaxUpdateTime * 1.5f) { apparentVelocity[0] = (inputPos[0] - state.pos[0]) / dt; apparentVelocity[1] = (inputPos[1] - state.pos[1]) / dt; apparentVelocity[2] = (inputPos[2] - state.pos[2]) / dt; } // set the current state setDeadReckoning(); setRelativeMotion(); } void Player::setDeadReckoning() { inputTime = TimeKeeper::getTick(); // copy stuff for dead reckoning inputStatus = state.status; inputAzimuth = state.azimuth; inputAngVel = state.angVel; memcpy(inputPos, state.pos, sizeof(float[3])); memcpy(inputVel, state.velocity, sizeof(float[3])); inputPhyDrv = state.phydrv; // // pre-calculate some stuff for dead reckoning // // the relative motion information (with respect to the physics drivers) calcRelativeMotion(inputRelVel, inputRelSpeed, inputRelAngVel); // setup the turning parameters inputTurning = false; if (fabsf(inputRelAngVel) > 0.001f) { inputTurning = true; const float radius = (inputRelSpeed / inputRelAngVel); inputTurnVector[0] = +sinf(inputAzimuth) * radius; inputTurnVector[1] = -cosf(inputAzimuth) * radius; inputTurnCenter[0] = inputPos[0] - inputTurnVector[0]; inputTurnCenter[1] = inputPos[1] - inputTurnVector[1]; } return; } void Player::setExplodePos( const float * p) { if (tankNode) tankNode->explodePos = fvec3(p[0],p[1],p[2]); } void Player::renderRadar() const { if (!isAlive() && !isExploding()) { return; // don't draw anything } if (tankNode) { ((TankSceneNode*)tankNode)->renderRadar(); } return; } bool Player::getIpAddress(Address& addr) { if (!haveIpAddr) { return false; } addr = ipAddr; return true; } void Player::setIpAddress(const Address& addr) { ipAddr = addr; haveIpAddr = true; } void Player::setHandicap(float _handicap) { handicap = _handicap; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Player.h000066400000000000000000000353121200563112200171040ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __PLAYER_H__ #define __PLAYER_H__ #include "common.h" /* system headers */ #include /* common interface headers */ #include "global.h" #ifndef BUILDING_BZADMIN #include "bzfgl.h" #endif #include "TimeKeeper.h" #include "Address.h" #include "Flag.h" #include "PlayerState.h" #include "ShotStatistics.h" /* local interface headers */ class ShotPath; class SceneDatabase; class TankSceneNode; class TankIDLSceneNode; class SphereSceneNode; class Obstacle; class TankDeathOverride; // 54 bytes const int PlayerUpdatePLenMax = sizeof(float) + // timestamp PlayerIdPLen + // player id sizeof(int32_t) + // order sizeof(int16_t) + // status sizeof(float) * 3 + // position (or int16_t * 3) sizeof(float) * 3 + // velocity (or int16_t * 3) sizeof(float) + // angle (or int16_t) sizeof(float) + // angular velocity (or int16_t) sizeof(int16_t) + // jump jets (conditional) sizeof(int32_t) + // physics driver (conditional) sizeof(int16_t) + // user speed (conditional) sizeof(int16_t) + // user angular velocity (conditional) sizeof(uint8_t); // sounds (conditional) class Player { public: Player(const PlayerId&, TeamColor, const char* callsign, const char* motto, const PlayerType); virtual ~Player(); PlayerId getId() const; TeamColor getTeam() const; void setTeam(TeamColor); void updateTank(float dt, bool local); const char* getCallSign() const; const char* getMotto() const; void setMotto(const char* _motto); PlayerType getPlayerType() const; FlagType* getFlag() const; long getOrder() const; short getStatus() const; const float* getPosition() const; float getAngle() const; const float* getForward() const; const float* getVelocity() const; float getAngularVelocity() const; int getPhysicsDriver() const; int getDeathPhysicsDriver() const; float getRadius() const; void getMuzzle(float*) const; float getMuzzleHeight() const; short getWins() const; short getLosses() const; short getTeamKills() const; float getTKRatio() const; float getNormalizedScore() const; float getLocalNormalizedScore() const; short getScore() const; const float* getDimensions() const; const float* getApparentVelocity() const; #ifndef BUILDING_BZADMIN inline const float* getColor() const { return color; } #endif short getRabbitScore() const; short getLocalWins() const; short getLocalLosses() const; short getLocalTeamKills() const; const TimeKeeper& getExplodeTime() const; const TimeKeeper& getTeleportTime() const; short getFromTeleporter() const; short getToTeleporter() const; float getTeleporterProximity() const; virtual int getMaxShots() const; virtual ShotPath* getShot(int index) const = 0; const ShotStatistics* getShotStatistics() const; void addToScene(SceneDatabase*, TeamColor effectiveTeam, bool inCockpit, bool seerView, bool showTreads, bool showIDL); bool getIpAddress(Address&); void setIpAddress(const Address& addr); virtual void addShots(SceneDatabase*, bool colorblind) const; void setLandingSpeed(float velocity); void spawnEffect(); void fireJumpJets(); bool isAlive() const; bool isPaused() const; bool isFalling() const; bool isFlagActive() const; bool isTeleporting() const; bool isExploding() const; bool isPhantomZoned() const; bool isCrossingWall() const; bool isNotResponding() const; void resetNotResponding(); bool isHunted() const; void setHunted(bool _hunted); bool isAutoPilot() const; void setAutoPilot(bool = true); bool isAdmin() const; void setAdmin(bool = true); bool isRegistered() const; void setRegistered(bool = true); bool isVerified() const; void setVerified(bool = true); bool hasPlayerList() const; void setPlayerList(bool = true); bool getPausedMessageState ( void ) const; void setPausedMessageState ( bool set ) { pauseMessageState = set;} bool validTeamTarget(const Player *possibleTarget) const; // returns true iff dead reckoning is too different from the // current tank state. bool isDeadReckoningWrong() const; // update state based on dead reckoning void doDeadReckoning(); // called to update state according to incoming packets void move(const float* pos, float azimuth); void setVelocity(const float* velocity); void setAngularVelocity(float); void setPhysicsDriver(int); void setRelativeMotion(); void setUserSpeed(float speed); void setUserAngVel(float angvel); void changeTeam(TeamColor); virtual void setFlag(FlagType*); virtual void changeScore(short deltaWins, short deltaLosses, short deltaTeamKills); void changeLocalScore(short deltaWins, short deltaLosses, short deltaTeamKills); void setHandicap(float handicap); void setStatus(short); void setExplode(const TimeKeeper&); void setTeleport(const TimeKeeper&, short from, short to); void endShot(int index, bool isHit = false, bool showExplosion = false); void* pack(void*, uint16_t& code); void* unpack(void*, uint16_t code); void setDeadReckoning(); void setDeadReckoning(float timestamp); void setUserTexture ( const char *tex ) { if(tex) userTexture = tex;} void renderRadar() const; void setExplodePos( const float * p); void setZpos (float z); float getMaxSpeed ( void ) const; void forceReload(float time); void setDeathEffect ( TankDeathOverride *e ); TankDeathOverride* getDeathEffect ( void ); int reportedHits; int computedHits; std::map hitMap; protected: void clearRemoteSounds(); void addRemoteSound(int sound); protected: // shot statistics ShotStatistics shotStatistics; const Obstacle* lastObstacle; // last obstacle touched TimeKeeper jamTime; // pause message bool pauseMessageState; std::vector shots; float handicap; private: // return true if the shot had to be terminated or false if it // was already terminated. position must be set to the shot's // position if you return true (it's okay to return false if // there's no meaningful shot position). virtual bool doEndShot(int index, bool isHit, float* position) = 0; void getDeadReckoning(float* predictedPos, float* predictedAzimuth, float* predictedVel, float time) const; void calcRelativeMotion(float vel[2], float& speed, float& angvel); void setVisualTeam (TeamColor team ); void updateFlagEffect(FlagType* flag); void updateTranslucency(float dt); void updateDimensions(float dt, bool local); void updateTreads(float dt); void updateJumpJets(float dt); void updateTrackMarks(); bool hitObstacleResizing(); private: // data not communicated with other players bool notResponding; bool hunted; // credentials PlayerId id; bool admin; bool registered; bool verified; bool playerList; Address ipAddr; bool haveIpAddr; // data use for drawing TankSceneNode* tankNode; TankIDLSceneNode* tankIDLNode; SphereSceneNode* pausedSphere; #ifndef BUILDING_BZADMIN GLfloat color[4]; GLfloat teleAlpha; #endif std::string userTexture; static int tankTexture; static int tankOverideTexture; TeamColor lastVisualTeam; TimeKeeper lastTrackDraw; // permanent data TeamColor team; // my team char callSign[CallSignLen]; // my pseudonym char motto[MottoLen]; // my motto PlayerType type; // Human/Computer // relatively stable data FlagType* flagType; // flag type I'm holding float dimensions[3]; // current tank dimensions float dimensionsScale[3]; // use to scale the dimensions float dimensionsRate[3]; // relative to scale float dimensionsTarget[3]; // relative to scale bool useDimensions; // use the varying dimensions for gfx float alpha; // current tank translucency float alphaRate; // current tank translucency float alphaTarget; // current tank translucency TimeKeeper spawnTime; // time I started spawning TimeKeeper explodeTime; // time I started exploding TimeKeeper teleportTime; // time I started teleporting short fromTeleporter; // teleporter I entered short toTeleporter; // teleporter I exited float teleporterProximity; // how close to a teleporter short wins; // number of kills short losses; // number of deaths short tks; // number of teamkills // score of local player against this player short localWins; // local player won this many short localLosses; // local player lost this many short localTks; // local player team killed this many // highly dynamic data PlayerState state; // additional state bool autoPilot; // computable highly dynamic data float forward[3]; // forward unit vector // relative motion information float relativeSpeed; // relative speed float relativeAngVel; // relative angular velocity float apparentVelocity[3]; // velocity of tank as derived from it's last positional update // dead reckoning stuff TimeKeeper inputTime; // time of input float inputTimestamp; // input timestamp of sender int inputStatus; // tank status float inputPos[3]; // tank position float inputVel[3]; // tank velocity float inputAzimuth; // direction tank is pointing float inputAngVel; // tank turn rate bool inputTurning; // tank is turning float inputRelVel[2]; // relative velocity float inputRelSpeed; // relative speed float inputRelAngVel; // relative angular velocity float inputTurnCenter[2]; // tank turn center float inputTurnVector[2]; // tank turn vector int inputPhyDrv; // physics driver // average difference between time source and time destination float deltaTime; // time offset on last measurement float offset; // 0 -> not received any sample // 1 -> 1 sample rx // 2 -> 2 or more sample rx int deadReckoningState; int oldStatus; // old tank status bits float oldZSpeed; // old tank vertical speed }; // shot data goes in LocalPlayer or RemotePlayer so shot type isn't lost. // // Player // inline PlayerId Player::getId() const { return id; } inline TeamColor Player::getTeam() const { return team; } inline void Player::setTeam(TeamColor _team) { team = _team; } inline const char* Player::getCallSign() const { return callSign; } inline const char* Player::getMotto() const { return motto; } inline PlayerType Player::getPlayerType() const { return type; } inline FlagType* Player::getFlag() const { return flagType; } inline long Player::getOrder() const { return state.order; } inline short Player::getStatus() const { return state.status; } inline const float* Player::getPosition() const { return state.pos; } inline float Player::getAngle() const { return state.azimuth; } inline const float* Player::getDimensions() const { return dimensions; } inline const float* Player::getForward() const { return forward; } inline const float* Player::getVelocity() const { return state.velocity; } inline const float* Player::getApparentVelocity() const { return apparentVelocity; } inline float Player::getAngularVelocity() const { return state.angVel; } inline int Player::getPhysicsDriver() const { return state.phydrv; } inline short Player::getWins() const { return wins; } inline short Player::getLosses() const { return losses; } inline short Player::getTeamKills() const { return tks; } inline short Player::getLocalWins() const { return localWins; } inline short Player::getLocalLosses() const { return localLosses; } inline short Player::getLocalTeamKills() const { return localTks; } inline short Player::getScore() const { return wins - losses; } inline const TimeKeeper &Player::getExplodeTime() const { return explodeTime; } inline const TimeKeeper &Player::getTeleportTime() const { return teleportTime; } inline short Player::getFromTeleporter() const { return fromTeleporter; } inline short Player::getToTeleporter() const { return toTeleporter; } inline float Player::getTeleporterProximity() const { return teleporterProximity; } inline const ShotStatistics* Player::getShotStatistics() const { return &shotStatistics; } inline bool Player::isAlive() const { return (state.status & short(PlayerState::Alive)) != 0; } inline bool Player::isPaused() const { return (state.status & short(PlayerState::Paused)) != 0; } inline bool Player::getPausedMessageState ( void ) const { return pauseMessageState; } inline bool Player::isAutoPilot() const { return autoPilot; } inline void Player::setAutoPilot(bool autopilot) { autoPilot = autopilot; } inline bool Player::isFalling() const { return (state.status & short(PlayerState::Falling)) != 0; } inline bool Player::isFlagActive() const { return (state.status & short(PlayerState::FlagActive)) != 0; } inline bool Player::isTeleporting() const { return (state.status & short(PlayerState::Teleporting)) != 0; } inline bool Player::isExploding() const { return (state.status & short(PlayerState::Exploding)) != 0; } inline bool Player::isPhantomZoned() const { return (isFlagActive() && (getFlag() == Flags::PhantomZone)); } inline bool Player::isCrossingWall() const { return (state.status & short(PlayerState::CrossingWall)) != 0; } inline bool Player::isNotResponding() const { return notResponding; } inline void Player::resetNotResponding() { notResponding = false; } inline bool Player::isHunted() const { return hunted; } inline void Player::setHunted(bool _hunted) { hunted = _hunted; } inline bool Player::isAdmin() const { return admin; } inline void Player::setAdmin(bool _admin) { admin = _admin; } inline bool Player::isRegistered() const { return registered; } inline void Player::setRegistered(bool _registered) { registered = _registered; } inline bool Player::isVerified() const { return verified; } inline void Player::setVerified(bool _verified) { verified = _verified; } inline bool Player::hasPlayerList() const { return playerList; } inline void Player::setPlayerList(bool _playerList) { playerList = _playerList; } inline void* Player::pack(void* buf, uint16_t& code) { setDeadReckoning(); return state.pack(buf, code); } inline void Player::setZpos (float z) { state.pos[2] = z; } #endif /* __PLAYER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/QuickKeysMenu.cxx000066400000000000000000000133361200563112200207620ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "QuickKeysMenu.h" /* common implementation headers */ #include "TextUtils.h" #include "StateDatabase.h" #include "FontManager.h" /* local implementation headers */ #include "MenuDefaultKey.h" #include "MainMenu.h" QuickKeysMenu::QuickKeysMenu() { // add controls std::vector& controls = getControls(); controls.push_back(createLabel("Define Quick Keys")); controls.push_back(createLabel("Notice: depending on platform not all keys might work")); controls.push_back(createLabel("Send to All")); controls.push_back(createLabel("Send to Team")); firstKeyControl = controls.size(); int i; for (i=1; i < 11; i++) { std::string keyLabel = TextUtils::format("Alt-F%d", i); controls.push_back(createInput(keyLabel)); } for (i=1; i < 11; i++) { std::string keyLabel = TextUtils::format("Ctrl-F%d", i); controls.push_back(createInput(keyLabel)); } initNavigation(controls, firstKeyControl, controls.size()-1); } QuickKeysMenu::~QuickKeysMenu() { } HUDuiDefaultKey* QuickKeysMenu::getDefaultKey() { return MenuDefaultKey::getInstance(); } void QuickKeysMenu::show() { std::vector& controls = getControls(); int i; for (i=1; i < 11; i++) { HUDuiTypeIn *entry = static_cast(controls[firstKeyControl + i - 1]); std::string keyName = TextUtils::format("quickMessage%d", i); std::string keyValue = BZDB.get(keyName); entry->setString(keyValue); } for (i=1; i < 11; i++) { HUDuiTypeIn *entry = static_cast(controls[firstKeyControl + i + 9]); std::string keyName = TextUtils::format("quickTeamMessage%d", i); std::string keyValue = BZDB.get(keyName); entry->setString(keyValue); } } void QuickKeysMenu::dismiss() { std::vector& controls = getControls(); int i; for (i=1; i < 11; i++) { HUDuiTypeIn *entry = static_cast(controls[firstKeyControl + i - 1]); std::string keyValue = entry->getString(); std::string keyName = TextUtils::format("quickMessage%d", i); if (keyValue.empty() && BZDB.isSet(keyName)) BZDB.unset(keyName); else if (!keyValue.empty()) BZDB.set(keyName, keyValue); } for (i=1; i < 11; i++) { HUDuiTypeIn *entry = static_cast(controls[firstKeyControl + i + 9]); std::string keyValue = entry->getString(); std::string keyName = TextUtils::format("quickTeamMessage%d", i); if (keyValue.empty() && BZDB.isSet(keyName)) BZDB.unset(keyName); else if (!keyValue.empty()) BZDB.set(keyName, keyValue); } } void QuickKeysMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); int i; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float bigFontSize = (float)_height / 42.0f; const float fontSize = (float)_height / 48.0f; FontManager &fm = FontManager::instance(); const int fontFace = MainMenu::getFontFace(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(fontFace, titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(fontFace, titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition help HUDuiLabel*help = (HUDuiLabel*)listHUD[1]; help->setFontSize(bigFontSize); const float helpWidth = fm.getStrLength(fontFace, bigFontSize, help->getString()); const float bigHeight = fm.getStrHeight(fontFace, bigFontSize, " "); x = 0.5f * ((float)_width - helpWidth); y -= 1.1f * bigHeight; help->setPosition(x, y); // reposition column titles HUDuiLabel *all = (HUDuiLabel*)listHUD[2]; all->setFontSize(bigFontSize); x = 0.1f * _width; y -= 1.5f * bigHeight; all->setPosition(x, y); HUDuiLabel *team = (HUDuiLabel*)listHUD[3]; team->setFontSize(bigFontSize); x = 0.6f * _width; team->setPosition(x, y); // reposition options in two columns x = 0.10f * (float)_width; const float topY = y - (0.6f * titleHeight); y = topY; listHUD[4]->setFontSize(fontSize); const float h = fm.getStrHeight(fontFace, fontSize, " "); const int count = listHUD.size() - firstKeyControl; const int mid = (count / 2) + firstKeyControl; for (i = firstKeyControl; i < mid; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } x = 0.60f * (float)_width; y = topY; for (;i < count + firstKeyControl; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } } HUDuiLabel* QuickKeysMenu::createLabel(const std::string &str) { HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString(str); return label; } HUDuiTypeIn* QuickKeysMenu::createInput(const std::string &label) { HUDuiTypeIn* entry = new HUDuiTypeIn; entry->setFontFace(MainMenu::getFontFace()); entry->setLabel(label); entry->setMaxLength(40); // some strings >20 won't already fit into column return entry; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/QuickKeysMenu.h000066400000000000000000000023731200563112200204060ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __QUICKKEYSMENU_H__ #define __QUICKKEYSMENU_H__ // common - 1st one #include "common.h" /* system interface headers */ #include /* local interface headers */ #include "HUDDialog.h" #include "HUDuiDefaultKey.h" #include "HUDuiLabel.h" #include "HUDuiTypeIn.h" class QuickKeysMenu : public HUDDialog { public: QuickKeysMenu(); ~QuickKeysMenu(); HUDuiDefaultKey* getDefaultKey(); void show(); void dismiss(); void execute() {} void resize(int width, int height); private: HUDuiLabel* createLabel(const std::string &); HUDuiTypeIn* createInput(const std::string &); private: int firstKeyControl; }; #endif /* __QUICKKEYSMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/QuitMenu.cxx000066400000000000000000000053401200563112200177700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "QuitMenu.h" /* common implementation headers */ #include "FontManager.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDuiLabel.h" bool QuitMenuDefaultKey::keyPress(const BzfKeyEvent& key) { if (key.ascii == 'Y' || key.ascii == 'y') { CommandsStandard::quit(); return true; } return MenuDefaultKey::keyPress(key); } bool QuitMenuDefaultKey::keyRelease(const BzfKeyEvent& key) { if (key.ascii == 'Y' || key.ascii == 'y') return true; return MenuDefaultKey::keyRelease(key); } QuitMenu::QuitMenu() { // add controls std::vector& listHUD = getControls(); HUDuiLabel* label; label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString("Enter to quit, Esc to resume"); listHUD.push_back(label); label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString("Really quit?"); listHUD.push_back(label); initNavigation(listHUD, 1, 1); } QuitMenu::~QuitMenu() { } void QuitMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font float fontSize = (float)_height / 15.0f; float smallFontSize = (float)_height / 54.0f; float x, y; FontManager &fm = FontManager::instance(); const int fontFace = MainMenu::getFontFace(); // heights const float fontHeight = fm.getStrHeight(fontFace, fontSize, " "); const float smallFontHeight = fm.getStrHeight(fontFace, smallFontSize, " "); // get stuff std::vector& listHUD = getControls(); HUDuiLabel* label = (HUDuiLabel*)listHUD[0]; // help message label->setFontSize(smallFontSize); const float stringWidth = fm.getStrLength(fontFace, smallFontSize, label->getString()); x = 0.5f * ((float)_width - stringWidth); y = (float)_height - fontHeight - 1.5f * smallFontHeight; label->setPosition(x, y); // quit message label = (HUDuiLabel*)listHUD[1]; label->setFontSize(fontSize); const float labelWidth = fm.getStrLength(fontFace, fontSize, label->getString()); x = 0.5f * ((float)_width - labelWidth); y = (float)_height - 3.5f * fontHeight; label->setPosition(x, y); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/QuitMenu.h000066400000000000000000000025301200563112200174130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __QUITMENU_H__ #define __QUITMENU_H__ /* system interface headers */ /* common interface headers */ #include "BzfEvent.h" #include "CommandsStandard.h" /* local interface headers */ #include "MenuDefaultKey.h" #include "HUDDialog.h" #include "HUDuiDefaultKey.h" class QuitMenuDefaultKey : public MenuDefaultKey { public: QuitMenuDefaultKey() { } ~QuitMenuDefaultKey() { } bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); }; class QuitMenu : public HUDDialog { public: QuitMenu(); ~QuitMenu(); HUDuiDefaultKey* getDefaultKey() { return &defaultKey; } void execute() { CommandsStandard::quit(); } void resize(int width, int height); private: QuitMenuDefaultKey defaultKey; }; #endif /* __QUITMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RadarRenderer.cxx000066400000000000000000001044331200563112200207440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "RadarRenderer.h" // common implementation headers #include "SceneRenderer.h" #include "MainWindow.h" #include "OpenGLGState.h" #include "BZDBCache.h" #include "TextureManager.h" #include "PhysicsDriver.h" #include "ObstacleMgr.h" #include "MeshSceneNode.h" #include "ObstacleList.h" #include "WallObstacle.h" #include "BoxBuilding.h" #include "PyramidBuilding.h" #include "MeshObstacle.h" // local implementation headers #include "LocalPlayer.h" #include "World.h" #include "FlashClock.h" #include "ShotPath.h" static FlashClock flashTank; static bool toggleTank = false; const float RadarRenderer::colorFactor = 40.0f; RadarRenderer::RadarRenderer(const SceneRenderer&, World* _world) : world(_world), x(0), y(0), w(0), h(0), dimming(0.0f), ps(), range(), decay(0.01f), smooth(false), jammed(false), multiSampled(false), useTankModels(false), useTankDimensions(false), triangleCount() { setControlColor(); #if defined(GLX_SAMPLES_SGIS) && defined(GLX_SGIS_multisample) GLint bits; glGetIntergerv(GL_SAMPLES_SGIS, &bits); if (bits > 0) multiSampled = true; #endif } void RadarRenderer::setWorld(World* _world) { world = _world; } void RadarRenderer::setControlColor(const GLfloat *color) { if (color) memcpy(teamColor, color, 3 * sizeof(float)); else memset(teamColor, 0, 3 * sizeof(float)); } void RadarRenderer::setShape(int _x, int _y, int _w, int _h) { x = _x; y = _y; w = _w; h = _h; } void RadarRenderer::setJammed(bool _jammed) { jammed = _jammed; decay = 0.01; } void RadarRenderer::setDimming(float newDimming) { dimming = (1.0f - newDimming > 1.0f) ? 1.0f : (1.0f - newDimming < 0.0f) ? 0.0f : 1.0f - newDimming; } void RadarRenderer::drawShot(const ShotPath* shot) { glBegin(GL_POINTS); glVertex2fv(shot->getPosition()); glEnd(); } void RadarRenderer::drawTank(const float pos[3], const Player* player) { glPushMatrix(); // 'ps' is pixel scale, setup in render() const float tankRadius = BZDBCache::tankRadius; float minSize = 1.5f + (ps * BZDBCache::radarTankPixels); GLfloat size; if (tankRadius < minSize) { size = minSize; } else { size = tankRadius; } if (pos[2] < 0.0f) { size = 0.5f; } // NOTE: myTank was checked in render() const float myAngle = LocalPlayer::getMyTank()->getAngle(); // transform to the tanks location glTranslatef(pos[0], pos[1], 0.0f); // draw the tank if ((player == NULL) || !useTankDimensions) { // align to the screen axes glRotatef(float(myAngle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); glRectf(-size, -size, +size, +size); } else { const float tankAngle = player->getAngle(); glPushMatrix(); glRotatef(float(tankAngle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); if (0/*useTankModels*/) { // TODO fix the fancy drawing drawFancyTank(player); } else { const float* dims = player->getDimensions(); glRectf(-dims[0], -dims[1], +dims[0], +dims[1]); } glPopMatrix(); // align to the screen axes glRotatef(float(myAngle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); } // adjust with height box size const float boxHeight = BZDB.eval(StateDatabase::BZDB_BOXHEIGHT); size = size * (1.0f + (0.5f * (pos[2] / boxHeight))); // draw the height box glBegin(GL_LINE_STRIP); glVertex2f(-size, 0.0f); glVertex2f(0.0f, -size); glVertex2f(+size, 0.0f); glVertex2f(0.0f, +size); glVertex2f(-size, 0.0f); glEnd(); glPopMatrix(); } void RadarRenderer::drawFancyTank(const Player* player) { if (smooth) { glDisable(GL_BLEND); } // we use the depth buffer so that the treads look ok if (BZDBCache::zbuffer) { glClearDepth(1.0); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); } OpenGLGState::resetState(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); RENDERER.enableSun(true); player->renderRadar(); // draws at (0,0,0) RENDERER.enableSun(false); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // FIXME - height box color OpenGLGState::resetState(); if (BZDBCache::zbuffer) { glDisable(GL_DEPTH_TEST); } if (smooth) { glEnable(GL_BLEND); } return; } void RadarRenderer::drawFlag(const float pos[3]) { GLfloat s = BZDBCache::flagRadius > 3.0f * ps ? BZDBCache::flagRadius : 3.0f * ps; glBegin(GL_LINES); glVertex2f(pos[0] - s, pos[1]); glVertex2f(pos[0] + s, pos[1]); glVertex2f(pos[0] + s, pos[1]); glVertex2f(pos[0] - s, pos[1]); glVertex2f(pos[0], pos[1] - s); glVertex2f(pos[0], pos[1] + s); glVertex2f(pos[0], pos[1] + s); glVertex2f(pos[0], pos[1] - s); glEnd(); } void RadarRenderer::drawFlagOnTank(const float pos[3]) { glPushMatrix(); // align it to the screen axes const float angle = LocalPlayer::getMyTank()->getAngle(); glTranslatef(pos[0], pos[1], 0.0f); glRotatef(float(angle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); float tankRadius = BZDBCache::tankRadius; GLfloat s = 2.5f * tankRadius > 4.0f * ps ? 2.5f * tankRadius : 4.0f * ps; glBegin(GL_LINES); glVertex2f(-s, 0.0f); glVertex2f(+s, 0.0f); glVertex2f(+s, 0.0f); glVertex2f(-s, 0.0f); glVertex2f(0.0f, -s); glVertex2f(0.0f, +s); glVertex2f(0.0f, +s); glVertex2f(0.0f, -s); glEnd(); glPopMatrix(); } void RadarRenderer::renderFrame(SceneRenderer& renderer) { const MainWindow& window = renderer.getWindow(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, window.getWidth(), 0.0, window.getHeight(), -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); OpenGLGState::resetState(); const int ox = window.getOriginX(); const int oy = window.getOriginY(); glScissor(ox + x - 1, oy + y - 1, w + 2, h + 2); const float left = float(ox + x) - 0.5f; const float right = float(ox + x + w) + 0.5f; const float top = float(oy + y) - 0.5f; const float bottom = float(oy + y + h) + 0.5f; float outlineOpacity = RENDERER.getRadarOpacity(); float fudgeFactor = BZDBCache::hudGUIBorderOpacityFactor; // bzdb cache this maybe? if ( outlineOpacity < 1.0f ) outlineOpacity = (outlineOpacity*fudgeFactor) + (1.0f - fudgeFactor); if (BZDBCache::blend) glEnable(GL_BLEND); glColor4f(teamColor[0],teamColor[1],teamColor[2],outlineOpacity); glBegin(GL_LINE_LOOP); { glVertex2f(left, top); glVertex2f(right, top); glVertex2f(right, bottom); glVertex2f(left, bottom); } glEnd(); if (0){ glBegin(GL_POINTS); { glVertex2f(left, top); glVertex2f(right, top); glVertex2f(right, bottom); glVertex2f(left, bottom); } glEnd(); } if (BZDBCache::blend) glDisable(GL_BLEND); glColor4f(teamColor[0],teamColor[1],teamColor[2],1.0f); const float opacity = renderer.getRadarOpacity(); if ((opacity < 1.0f) && (opacity > 0.0f)) { glScissor(ox + x - 2, oy + y - 2, w + 4, h + 4); // draw nice blended background if (BZDBCache::blend && opacity < 1.0f) glEnable(GL_BLEND); glColor4f(0.0f, 0.0f, 0.0f, opacity); glRectf((float) x, (float) y, (float)(x + w), (float)(y + h)); if (BZDBCache::blend && opacity < 1.0f) glDisable(GL_BLEND); } // note that this scissor setup is used for the reset of the rendering glScissor(ox + x, oy + y, w, h); if (opacity == 1.0f) { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); } glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); return; } void RadarRenderer::render(SceneRenderer& renderer, bool blank, bool observer) { RenderNode::resetTriangleCount(); const float radarLimit = BZDBCache::radarLimit; if (!BZDB.isTrue("displayRadar") || (radarLimit <= 0.0f)) { triangleCount = 0; return; } // render the frame renderFrame(renderer); if (blank) { return; } if (!world) { return; } smooth = !multiSampled && BZDBCache::smooth; const bool fastRadar = ((BZDBCache::radarStyle == 1) || (BZDBCache::radarStyle == 2)) && BZDBCache::zbuffer; const LocalPlayer *myTank = LocalPlayer::getMyTank(); // setup the radar range float radarRange = BZDB.eval("displayRadarRange") * radarLimit; float maxRange = radarLimit; // when burrowed, limit radar range if (myTank && (myTank->getFlag() == Flags::Burrow) && (myTank->getPosition()[2] < 0.0f)) { maxRange = radarLimit / 4.0f; } if (radarRange > maxRange) { radarRange = maxRange; // only clamp the user's desired range if it's actually // greater then 1. otherwise, we may be resetting it due // to burrow radar limiting. if (BZDB.eval("displayRadarRange") > 1.0f) { BZDB.set("displayRadarRange", "1.0"); } } // prepare projection matrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); const MainWindow& window = renderer.getWindow(); const int xSize = window.getWidth(); const int ySize = window.getHeight(); const double xCenter = double(x) + 0.5 * double(w); const double yCenter = double(y) + 0.5 * double(h); const double xUnit = 2.0 * radarRange / double(w); const double yUnit = 2.0 * radarRange / double(h); // NOTE: the visual extents include passable objects double maxHeight = 0.0; const Extents* visExts = renderer.getVisualExtents(); if (visExts) { maxHeight = (double)visExts->maxs[2]; } glOrtho(-xCenter * xUnit, (xSize - xCenter) * xUnit, -yCenter * yUnit, (ySize - yCenter) * yUnit, -(maxHeight + 10.0), (maxHeight + 10.0)); // prepare modelview matrix glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); OpenGLGState::resetState(); // if jammed then draw white noise. occasionally draw a good frame. if (jammed && (bzfrand() > decay)) { TextureManager &tm = TextureManager::instance(); int noiseTexture = tm.getTextureID( "noise" ); glColor3f(1.0f, 1.0f, 1.0f); if ((noiseTexture >= 0) && (renderer.useQuality() > 0)) { const int sequences = 10; static float np[] = { 0, 0, 1, 1, 1, 1, 0, 0, 0.5f, 0.5f, 1.5f, 1.5f, 1.5f, 1.5f, 0.5f, 0.5f, 0.25f, 0.25f, 1.25f, 1.25f, 1.25f, 1.25f, 0.25f, 0.25f, 0, 0.5f, 1, 1.5f, 1, 1.5f, 0, 0.5f, 0.5f, 0, 1.5f, 1, 1.4f, 1, 0.5f, 0, 0.75f, 0.75f, 1.75f, 1.75f, 1.75f, 1.75f, 0.75f, 0.75f, }; int noisePattern = 4 * int(floor(sequences * bzfrand())); glEnable(GL_TEXTURE_2D); tm.bind(noiseTexture); glBegin(GL_QUADS); { glTexCoord2f(np[noisePattern+0],np[noisePattern+1]); glVertex2f(-radarRange,-radarRange); glTexCoord2f(np[noisePattern+2],np[noisePattern+1]); glVertex2f( radarRange,-radarRange); glTexCoord2f(np[noisePattern+2],np[noisePattern+3]); glVertex2f( radarRange, radarRange); glTexCoord2f(np[noisePattern+0],np[noisePattern+3]); glVertex2f(-radarRange, radarRange); } glEnd(); glDisable(GL_TEXTURE_2D); } else if ((noiseTexture >= 0) && BZDBCache::texture && (renderer.useQuality() == 0)) { glEnable(GL_TEXTURE_2D); tm.bind(noiseTexture); glBegin(GL_QUADS); { glTexCoord2f(0,0); glVertex2f(-radarRange,-radarRange); glTexCoord2f(1,0); glVertex2f( radarRange,-radarRange); glTexCoord2f(1,1); glVertex2f( radarRange, radarRange); glTexCoord2f(0,1); glVertex2f(-radarRange, radarRange); } glEnd(); glDisable(GL_TEXTURE_2D); } if (decay > 0.015f) decay *= 0.5f; } // only draw if there's a local player and a world else if (myTank) { // if decay is sufficiently small then boost it so it's more // likely a jammed radar will get a few good frames closely // spaced in time. value of 1 guarantees at least two good // frames in a row. if (decay <= 0.015f) decay = 1.0f; else decay *= 0.5f; // get size of pixel in model space (assumes radar is square) ps = 2.0f * (radarRange / GLfloat(w)); MeshSceneNode::setRadarLodScale(ps); float tankWidth = BZDBCache::tankWidth; float tankLength = BZDBCache::tankLength; const float testMin = 8.0f * ps; // maintain the aspect ratio if it isn't square if ((tankWidth > testMin) && (tankLength > testMin)) { useTankDimensions = true; } else { useTankDimensions = false; } if (useTankDimensions && (renderer.useQuality() >= 2)) { useTankModels = true; } else { useTankModels = false; } // relative to my tank const float* myPos = myTank->getPosition(); const float myAngle = myTank->getAngle(); // draw the view angle below stuff // view frustum edges if (!BZDB.isTrue("hideRadarViewLines")) { glColor3f(1.0f, 0.625f, 0.125f); const float fovx = renderer.getViewFrustum().getFOVx(); const float viewWidth = radarRange * tanf(0.5f * fovx); glBegin(GL_LINE_STRIP); glVertex2f(-viewWidth, radarRange); glVertex2f(0.0f, 0.0f); glVertex2f(viewWidth, radarRange); glEnd(); } // transform to the observer's viewpoint glPushMatrix(); glRotatef((float)(90.0 - myAngle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(-myPos[0], -myPos[1], 0.0f); if (useTankModels) { // new modelview transform requires repositioning renderer.setupSun(); } // setup the blending function glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // draw the buildings renderObstacles(fastRadar, radarRange); // antialiasing on for lines and points unless we're multisampling, // in which case it's automatic and smoothing makes them look worse. if (smooth) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); } // draw my shots int maxShots = world->getMaxShots(); int i; float muzzleHeight = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); for (i = 0; i < maxShots; i++) { const ShotPath* shot = myTank->getShot(i); if (shot) { const float cs = colorScale(shot->getPosition()[2], muzzleHeight); glColor3f(1.0f * cs, 1.0f * cs, 1.0f * cs); shot->radarRender(); } } //draw world weapon shots WorldPlayer *worldWeapons = World::getWorld()->getWorldWeapons(); maxShots = worldWeapons->getMaxShots(); for (i = 0; i < maxShots; i++) { const ShotPath* shot = worldWeapons->getShot(i); if (shot) { const float cs = colorScale(shot->getPosition()[2], muzzleHeight); glColor3f(1.0f * cs, 1.0f * cs, 1.0f * cs); shot->radarRender(); } } // draw other tanks (and any flags on them) // note about flag drawing. each line segment is drawn twice // (once in each direction); this degrades the antialiasing // but on systems that don't do correct filtering of endpoints // not doing it makes (half) the endpoints jump wildly. const int curMaxPlayers = world->getCurMaxPlayers(); for (i = 0; i < curMaxPlayers; i++) { RemotePlayer* player = world->getPlayer(i); if (!player) { continue; } if (!player->isAlive() && (!useTankModels || !observer || !player->isExploding())) { continue; } if ((player->getFlag() == Flags::Stealth) && (myTank->getFlag() != Flags::Seer)) { continue; } const float* position = player->getPosition(); if (player->getFlag() != Flags::Null) { glColor3fv(player->getFlag()->getColor()); drawFlagOnTank(position); } if (player->isPaused() || player->isNotResponding()) { const float dimfactor = 0.4f; const float *color; if (myTank->getFlag() == Flags::Colorblindness) { color = Team::getRadarColor(RogueTeam); } else { color = Team::getRadarColor(player->getTeam()); } float dimmedcolor[3]; dimmedcolor[0] = color[0] * dimfactor; dimmedcolor[1] = color[1] * dimfactor; dimmedcolor[2] = color[2] * dimfactor; glColor3fv(dimmedcolor); } else { glColor3fv(Team::getRadarColor(myTank->getFlag() == Flags::Colorblindness ? RogueTeam : player->getTeam())); } // If this tank is hunted flash it on the radar if (player->isHunted() && myTank->getFlag() != Flags::Colorblindness) { if (flashTank.isOn()) { if (!toggleTank) { float flashcolor[3]; flashcolor[0] = 0.0f; flashcolor[1] = 0.8f; flashcolor[2] = 0.9f; glColor3fv(flashcolor); } } else { toggleTank = !toggleTank; flashTank.setClock(0.2f); } } if (!observer) { drawTank(position, NULL); } else { drawTank(position, player); } } bool coloredShot = BZDB.isTrue("coloredradarshots"); // draw other tanks' shells bool iSeeAll = myTank && (myTank->getFlag() == Flags::Seer); maxShots = World::getWorld()->getMaxShots(); for (i = 0; i < curMaxPlayers; i++) { RemotePlayer* player = world->getPlayer(i); if (!player) continue; for (int j = 0; j < maxShots; j++) { const ShotPath* shot = player->getShot(j); if (shot && (shot->getFlag() != Flags::InvisibleBullet || iSeeAll)) { const float *shotcolor; if (coloredShot) { if (myTank->getFlag() == Flags::Colorblindness) shotcolor = Team::getRadarColor(RogueTeam); else shotcolor = Team::getRadarColor(player->getTeam()); const float cs = colorScale(shot->getPosition()[2], muzzleHeight); glColor3f(shotcolor[0] * cs, shotcolor[1] * cs, shotcolor[2] * cs); } else { glColor3f(1.0f, 1.0f, 1.0f); } shot->radarRender(); } } } // draw flags not on tanks. // draw them in reverse order so that the team flags // (which come first), are drawn on top of the normal flags. const int maxFlags = world->getMaxFlags(); const bool drawNormalFlags = BZDB.isTrue("displayRadarFlags"); for (i = (maxFlags - 1); i >= 0; i--) { const Flag& flag = world->getFlag(i); // don't draw flags that don't exist or are on a tank if (flag.status == FlagNoExist || flag.status == FlagOnTank) continue; // don't draw normal flags if we aren't supposed to if (flag.type->flagTeam == NoTeam && !drawNormalFlags) continue; if (BZDB.isTrue(StateDatabase::BZDB_HIDETEAMFLAGSONRADAR)) { if (flag.type->flagTeam != ::NoTeam) { continue; } } if (BZDB.isTrue(StateDatabase::BZDB_HIDEFLAGSONRADAR)) { if (flag.type) { continue; } } // Flags change color by height const float cs = colorScale(flag.position[2], muzzleHeight); const float *flagcolor = flag.type->getColor(); glColor3f(flagcolor[0] * cs, flagcolor[1] * cs, flagcolor[2] * cs); drawFlag(flag.position); } // draw antidote flag const float* antidotePos = LocalPlayer::getMyTank()->getAntidoteLocation(); if (antidotePos) { glColor3f(1.0f, 1.0f, 0.0f); drawFlag(antidotePos); } // draw these markers above all others always centered glPopMatrix(); // north marker GLfloat ns = 0.05f * radarRange, ny = 0.9f * radarRange; glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_LINE_STRIP); glVertex2f(-ns, ny - ns); glVertex2f(-ns, ny + ns); glVertex2f(ns, ny - ns); glVertex2f(ns, ny + ns); glEnd(); // always up glPopMatrix(); // forward tick glBegin(GL_LINES); glVertex2f(0.0f, radarRange - ps); glVertex2f(0.0f, radarRange - 4.0f * ps); glEnd(); if (!observer) { // revert to the centered transformation glRotatef((float)(90.0 - myAngle * 180.0 / M_PI), 0.0f, 0.0f, 1.0f); glTranslatef(-myPos[0], -myPos[1], 0.0f); // my flag if (myTank->getFlag() != Flags::Null) { glColor3fv(myTank->getFlag()->getColor()); drawFlagOnTank(myPos); } // my tank glColor3f(1.0f, 1.0f, 1.0f); drawTank(myPos, myTank); } if (dimming > 0.0f) { if (!smooth) { glEnable(GL_BLEND); } // darken the entire radar if we're dimmed // we're drawing positively, so dimming is actually an opacity glColor4f(0.0f, 0.0f, 0.0f, 1.0f - dimming); glRectf(-radarRange, -radarRange, +radarRange, +radarRange); } glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); } // restore GL state glPopMatrix(); triangleCount = RenderNode::getTriangleCount(); } float RadarRenderer::colorScale(const float z, const float h) { float scaleColor; if (BZDBCache::radarStyle > 0) { const LocalPlayer* myTank = LocalPlayer::getMyTank(); // Scale color so that objects that are close to tank's level are opaque const float zTank = myTank->getPosition()[2]; if (zTank > (z + h)) scaleColor = 1.0f - (zTank - (z + h)) / colorFactor; else if (zTank < z) scaleColor = 1.0f - (z - zTank) / colorFactor; else scaleColor = 1.0f; // Don't fade all the way if (scaleColor < 0.35f) scaleColor = 0.35f; } else { scaleColor = 1.0f; } return scaleColor; } float RadarRenderer::transScale(const float z, const float h) { float scaleColor; const LocalPlayer* myTank = LocalPlayer::getMyTank(); // Scale color so that objects that are close to tank's level are opaque const float zTank = myTank->getPosition()[2]; if (zTank > (z + h)) scaleColor = 1.0f - (zTank - (z + h)) / colorFactor; else if (zTank < z) scaleColor = 1.0f - (z - zTank) / colorFactor; else scaleColor = 1.0f; if (scaleColor < 0.5f) scaleColor = 0.5f; return scaleColor; } void RadarRenderer::renderObstacles(bool fastRadar, float _range) { if (smooth) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); } // draw the walls renderWalls(); // draw the boxes, pyramids, and meshes if (!fastRadar) { renderBoxPyrMesh(); } else { renderBoxPyrMeshFast(_range); } // draw the team bases and teleporters renderBasesAndTeles(); if (smooth) { glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); } return; } void RadarRenderer::renderWalls() { const ObstacleList& walls = OBSTACLEMGR.getWalls(); int count = walls.size(); glColor3f(0.25f, 0.5f, 0.5f); glBegin(GL_LINES); for (int i = 0; i < count; i++) { const WallObstacle& wall = *((const WallObstacle*) walls[i]); const float wid = wall.getBreadth(); const float c = wid * cosf(wall.getRotation()); const float s = wid * sinf(wall.getRotation()); const float* pos = wall.getPosition(); glVertex2f(pos[0] - s, pos[1] + c); glVertex2f(pos[0] + s, pos[1] - c); } glEnd(); return; } void RadarRenderer::renderBoxPyrMeshFast(float _range) { // FIXME - This is hack code at the moment, but even when // rendering the full world, it draws the aztec map // 3X faster (the culling algo is actually slows us // down in that case) // - need a better default gradient texture // (better colors, and tied in to show max jump height?) // - build a procedural texture if default is missing // - use a GL_TEXTURE_1D // - setup the octree to return Z sorted elements (partially done) // - add a renderClass() member to SceneNode (also for coloring) // - also add a renderShadow() member (they don't need sorting, // and if you don't have double-buffering, you shouldn't be // using shadows) // - vertex shaders would be faster // - it would probably be a better approach to attach a radar // rendering object to each obstacle... no time // get the texture int gradientTexId = -1; TextureManager &tm = TextureManager::instance(); gradientTexId = tm.getTextureID("radar", false); // safety: no texture, no service if (gradientTexId < 0) { renderBoxPyrMesh(); return; } // GL state OpenGLGStateBuilder gb; gb.setTexture(gradientTexId); gb.setShading(GL_FLAT); gb.setCulling(GL_BACK); gb.setBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); OpenGLGState gs = gb.getState(); gs.setState(); // disable the unused arrays glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); // now that the texture is bound, setup the clamp mode glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // do this after the GState setting if (smooth) { glEnable(GL_POLYGON_SMOOTH); } // setup the texturing mapping const float hf = 128.0f; // height factor, goes from 0.0 to 1.0 in texcoords const float vfz = RENDERER.getViewFrustum().getEye()[2]; const GLfloat plane[4] = { 0.0f, 0.0f, (1.0f / hf), (((hf * 0.5f) - vfz) / hf) }; glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, plane); // setup texture generation glEnable(GL_TEXTURE_GEN_S); // set the color glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // if (!BZDB.isTrue("visualRadar")) { ViewFrustum radarClipper; radarClipper.setOrthoPlanes(RENDERER.getViewFrustum(), _range, _range); RENDERER.getSceneDatabase()->renderRadarNodes(radarClipper); // } else { // RENDERER.getSceneDatabase()->renderRadarNodes(RENDERER.getViewFrustum()); // } // restore texture generation glDisable(GL_TEXTURE_GEN_S); OpenGLGState::resetState(); // re-enable the arrays glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); // do this after the GState setting if (smooth) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glDisable(GL_POLYGON_SMOOTH); } return; } void RadarRenderer::renderBoxPyrMesh() { int i; const bool enhanced = (BZDBCache::radarStyle > 0); if (!smooth) { // smoothing has blending disabled if (enhanced) { glEnable(GL_BLEND); // always blend the polygons if we're enhanced } } else { // smoothing has blending enabled if (!enhanced) { glDisable(GL_BLEND); // don't blend the polygons if we're not enhanced } } // draw box buildings. const ObstacleList& boxes = OBSTACLEMGR.getBoxes(); int count = boxes.size(); glBegin(GL_QUADS); for (i = 0; i < count; i++) { const BoxBuilding& box = *((const BoxBuilding*) boxes[i]); if (box.isInvisible()) continue; const float z = box.getPosition()[2]; const float bh = box.getHeight(); const float cs = colorScale(z, bh); glColor4f(0.25f * cs, 0.5f * cs, 0.5f * cs, transScale(z, bh)); const float c = cosf(box.getRotation()); const float s = sinf(box.getRotation()); const float wx = c * box.getWidth(), wy = s * box.getWidth(); const float hx = -s * box.getBreadth(), hy = c * box.getBreadth(); const float* pos = box.getPosition(); glVertex2f(pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f(pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f(pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f(pos[0] - wx + hx, pos[1] - wy + hy); } glEnd(); // draw pyramid buildings const ObstacleList& pyramids = OBSTACLEMGR.getPyrs(); count = pyramids.size(); glBegin(GL_QUADS); for (i = 0; i < count; i++) { const PyramidBuilding& pyr = *((const PyramidBuilding*) pyramids[i]); const float z = pyr.getPosition()[2]; const float bh = pyr.getHeight(); const float cs = colorScale(z, bh); glColor4f(0.25f * cs, 0.5f * cs, 0.5f * cs, transScale(z, bh)); const float c = cosf(pyr.getRotation()); const float s = sinf(pyr.getRotation()); const float wx = c * pyr.getWidth(), wy = s * pyr.getWidth(); const float hx = -s * pyr.getBreadth(), hy = c * pyr.getBreadth(); const float* pos = pyr.getPosition(); glVertex2f(pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f(pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f(pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f(pos[0] - wx + hx, pos[1] - wy + hy); } glEnd(); // draw mesh obstacles if (smooth) { glEnable(GL_POLYGON_SMOOTH); } if (!enhanced) { glDisable(GL_CULL_FACE); } const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); count = meshes.size(); for (i = 0; i < count; i++) { const MeshObstacle* mesh = (const MeshObstacle*) meshes[i]; int faces = mesh->getFaceCount(); for (int f = 0; f < faces; f++) { const MeshFace* face = mesh->getFace(f); if (enhanced) { if (face->getPlane()[2] <= 0.0f) { continue; } const BzMaterial* bzmat = face->getMaterial(); if ((bzmat != NULL) && bzmat->getNoRadar()) { continue; } } float z = face->getPosition()[2]; float bh = face->getSize()[2]; if (BZDBCache::useMeshForRadar) { z = mesh->getPosition()[2]; bh = mesh->getSize()[2]; } const float cs = colorScale(z, bh); // draw death faces with a soupcon of red const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(face->getPhysicsDriver()); if ((phydrv != NULL) && phydrv->getIsDeath()) { glColor4f(0.75f * cs, 0.25f * cs, 0.25f * cs, transScale(z, bh)); } else { glColor4f(0.25f * cs, 0.5f * cs, 0.5f * cs, transScale(z, bh)); } // draw the face as a triangle fan int vertexCount = face->getVertexCount(); glBegin(GL_TRIANGLE_FAN); for (int v = 0; v < vertexCount; v++) { const float* pos = face->getVertex(v); glVertex2f(pos[0], pos[1]); } glEnd(); } } if (!enhanced) { glEnable(GL_CULL_FACE); } if (smooth) { glDisable(GL_POLYGON_SMOOTH); } // NOTE: revert from the enhanced setting if (enhanced && !smooth) { glDisable(GL_BLEND); } // now draw antialiased outlines around the polygons if (smooth) { glEnable(GL_BLEND); // NOTE: revert from the enhanced setting count = boxes.size(); for (i = 0; i < count; i++) { const BoxBuilding& box = *((const BoxBuilding*) boxes[i]); if (box.isInvisible()) continue; const float z = box.getPosition()[2]; const float bh = box.getHeight(); const float cs = colorScale(z, bh); glColor4f(0.25f * cs, 0.5f * cs, 0.5f * cs, transScale(z, bh)); const float c = cosf(box.getRotation()); const float s = sinf(box.getRotation()); const float wx = c * box.getWidth(), wy = s * box.getWidth(); const float hx = -s * box.getBreadth(), hy = c * box.getBreadth(); const float* pos = box.getPosition(); glBegin(GL_LINE_LOOP); glVertex2f(pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f(pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f(pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f(pos[0] - wx + hx, pos[1] - wy + hy); glEnd(); } count = pyramids.size(); for (i = 0; i < count; i++) { const PyramidBuilding& pyr = *((const PyramidBuilding*) pyramids[i]); const float z = pyr.getPosition()[2]; const float bh = pyr.getHeight(); const float cs = colorScale(z, bh); glColor4f(0.25f * cs, 0.5f * cs, 0.5f * cs, transScale(z, bh)); const float c = cosf(pyr.getRotation()); const float s = sinf(pyr.getRotation()); const float wx = c * pyr.getWidth(), wy = s * pyr.getWidth(); const float hx = -s * pyr.getBreadth(), hy = c * pyr.getBreadth(); const float* pos = pyr.getPosition(); glBegin(GL_LINE_LOOP); glVertex2f(pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f(pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f(pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f(pos[0] - wx + hx, pos[1] - wy + hy); glEnd(); } } return; } void RadarRenderer::renderBasesAndTeles() { int i; // draw team bases if(world->allowTeamFlags()) { for(i = 1; i < NumTeams; i++) { for (int j = 0;;j++) { const float *base = world->getBase(i, j); if (base == NULL) break; glColor3fv(Team::getRadarColor(TeamColor(i))); glBegin(GL_LINE_LOOP); const float beta = atan2f(base[5], base[4]); const float r = hypotf(base[4], base[5]); glVertex2f(base[0] + r * cosf(base[3] + beta), base[1] + r * sinf(base[3] + beta)); glVertex2f(base[0] + r * cosf((float)(base[3] - beta + M_PI)), base[1] + r * sinf((float)(base[3] - beta + M_PI))); glVertex2f(base[0] + r * cosf((float)(base[3] + beta + M_PI)), base[1] + r * sinf((float)(base[3] + beta + M_PI))); glVertex2f(base[0] + r * cosf(base[3] - beta), base[1] + r * sinf(base[3] - beta)); glEnd(); } } } // draw teleporters. teleporters are pretty thin so use lines // (which, if longer than a pixel, are guaranteed to draw something; // not so for a polygon). just in case the system doesn't correctly // filter the ends of line segments, we'll draw the line in each // direction (which degrades the antialiasing). Newport graphics // is one system that doesn't do correct filtering. const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); int count = teleporters.size(); glColor3f(1.0f, 1.0f, 0.25f); glBegin(GL_LINES); for (i = 0; i < count; i++) { const Teleporter & tele = *((const Teleporter *) teleporters[i]); if (tele.isHorizontal ()) { const float z = tele.getPosition ()[2]; const float bh = tele.getHeight (); const float cs = colorScale (z, bh); glColor4f (1.0f * cs, 1.0f * cs, 0.25f * cs, transScale (z, bh)); const float c = cosf (tele.getRotation ()); const float s = sinf (tele.getRotation ()); const float wx = c * tele.getWidth (), wy = s * tele.getWidth (); const float hx = -s * tele.getBreadth (), hy = c * tele.getBreadth (); const float *pos = tele.getPosition (); glVertex2f (pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f (pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f (pos[0] + wx - hx, pos[1] + wy - hy); glVertex2f (pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f (pos[0] + wx + hx, pos[1] + wy + hy); glVertex2f (pos[0] - wx + hx, pos[1] - wy + hy); glVertex2f (pos[0] - wx + hx, pos[1] - wy + hy); glVertex2f (pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f (pos[0] - wx - hx, pos[1] - wy - hy); glVertex2f (pos[0] - wx - hx, pos[1] - wy - hy); } else { const float z = tele.getPosition ()[2]; const float bh = tele.getHeight (); const float cs = colorScale (z, bh); glColor4f (1.0f * cs, 1.0f * cs, 0.25f * cs, transScale (z, bh)); const float tw = tele.getBreadth (); const float c = tw * cosf (tele.getRotation ()); const float s = tw * sinf (tele.getRotation ()); const float *pos = tele.getPosition (); glVertex2f (pos[0] - s, pos[1] + c); glVertex2f (pos[0] + s, pos[1] - c); glVertex2f (pos[0] + s, pos[1] - c); glVertex2f (pos[0] - s, pos[1] + c); } } glEnd(); return; } int RadarRenderer::getFrameTriangleCount() const { return triangleCount; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RadarRenderer.h000066400000000000000000000052141200563112200203660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * RadarRenderer: * Encapsulates drawing a radar */ #ifndef BZF_RADAR_RENDERER_H #define BZF_RADAR_RENDERER_H #include "common.h" #include "bzfgl.h" #include "Obstacle.h" class SceneRenderer; class World; class ShotPath; class RadarRenderer { public: RadarRenderer(const SceneRenderer&, World* _world); void setWorld(World* _world); void setControlColor(const GLfloat *color = NULL); int getX() const; int getY() const; int getWidth() const; int getHeight() const; void setShape(int x, int y, int w, int h); void setJammed(bool = true); void setDimming(float newDimming); void render(SceneRenderer&, bool blank, bool observer); void renderFrame(SceneRenderer&); void renderObstacles(bool fastRadar, float range); void renderWalls(); void renderBoxPyrMesh(); void renderBoxPyrMeshFast(float range); void renderBasesAndTeles(); int getFrameTriangleCount() const; private: // no copying RadarRenderer(const RadarRenderer&); RadarRenderer& operator=(const RadarRenderer&); void drawShot(const ShotPath*); void drawTank(const float pos[3], const class Player* player); void drawFancyTank(const class Player* player); void drawFlag(const float pos[3]); void drawFlagOnTank(const float pos[3]); static float colorScale(const float z, const float h); static float transScale(const float z, const float h); private: World* world; int x, y; int w, h; float dimming; float ps; float range; double decay; GLfloat teamColor[3]; bool smooth; bool jammed; bool multiSampled; bool useTankModels; bool useTankDimensions; int triangleCount; static const float colorFactor; }; // // RadarRenderer // inline int RadarRenderer::getX() const { return x; } inline int RadarRenderer::getY() const { return y; } inline int RadarRenderer::getWidth() const { return w; } inline int RadarRenderer::getHeight() const { return h; } #endif // BZF_RADAR_RENDERER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Region.cxx000066400000000000000000000252121200563112200174440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Region.h" /* system implementation headers */ #include #include RegionPoint::RegionPoint(float x, float y) { p[0] = x; p[1] = y; } RegionPoint::RegionPoint(const float v[2]) { p[0] = v[0]; p[1] = v[1]; } RegionPoint::~RegionPoint() { // do nothing } const float* RegionPoint::get() const { return p; } // // BzfRegion // // Note: edge from corners[0] to corners[1] has neighbor stored in // neighbors[0]. all regions should have corners ordered counter- // clockwise. // BzfRegion::BzfRegion() : mailbox(0), target(0), A(0.0, 0.0) { } BzfRegion::BzfRegion(int sides, const float p[][2]) : mailbox(0), target(0), distance(), A(0.0, 0.0) { for (int i = 0; i < sides; i++) { corners.push_back(RegionPoint(p[i])); neighbors.push_back((BzfRegion*)0); } } BzfRegion::~BzfRegion() { // tell neighbors I'm going away const int count = corners.size(); for (int i = 0; i < count; i++) if (neighbors[i]) neighbors[i]->setNeighbor(this, 0); } bool BzfRegion::isInside(const float p[2]) const { // see if testPoint is inside my edges const int count = corners.size(); if (count < 3) return false; bool inside = false; const float* p1 = corners[count - 1].get(); const float* p2 = NULL; for (int i = 0; i < count; p1 = p2, i++) { p2 = corners[i].get(); if ((p1[1] >= p[1] && p2[1] >= p[1]) || (p1[1] < p[1] && p2[1] < p[1])) continue; if (p1[0] < p[0] && p2[0] < p[0]) continue; if (p1[0] >= p[0] && p2[0] >= p[0]) inside = !inside; else { float tolerance = (p1[1] < p2[1]) ? -0.001f : 0.001f; if ((p[1] - p1[1]) * (p2[0] - p1[0]) / (p2[1] - p1[1]) >= p[0] - p1[0] + tolerance) inside = !inside; } } return inside; } float BzfRegion::getDistance(const float p[2], float nearest[2]) const { const int count = corners.size(); float currentDistance = maxDistance; float pointDistance; //compute distance from any edge const float* p1 = corners[count - 1].get(); const float* p2 = NULL; float d[2]; float m[2]; float t; float edgeSquareDist; float x, y; for (int c = 0; c < count; c++) { p2 = corners[c].get(); d[0] = p2[0] - p1[0]; d[1] = p2[1] - p1[1]; m[0] = p[0] - p1[0]; m[1] = p[1] - p1[1]; edgeSquareDist = d[0] * d[0] + d[1] * d[1]; t = (m[0] * d[0] + m[1] * d[1]) / edgeSquareDist; if (t <= 0) { pointDistance = hypotf(m[0], m[1]); x = p1[0]; y = p1[1]; } else if (t >= 1) { pointDistance = hypotf(m[0] - d[0], m[1] - d[1]); x = p2[0]; y = p2[1]; } else { pointDistance = hypotf(m[0] - t * d[0], m[1] - t * d[1]); x = p1[0] + t * d[0]; y = p1[1] + t * d[1]; } if (pointDistance < currentDistance) { currentDistance = pointDistance; nearest[0] = x; nearest[1] = y; } p1 = p2; } return currentDistance; } int BzfRegion::classify(const float e1[2], const float e2[2]) const { // return true if all points lie to right side of edge const float dx = e2[0] - e1[0]; const float dy = e2[1] - e1[1]; const float d = dy * e1[0] - dx * e1[1]; int toRight = 0, onEdge = 0; const int count = corners.size(); for (int i = 0; i < count; i++) { const float* p = corners[i].get(); const float e = -dy * p[0] + dx * p[1] + d; if (e < -0.00001) toRight++; else if (e <= 0.00001) onEdge++; } if (toRight + onEdge == count) return 1; // all to right if (toRight != 0) return 0; // not all to left -- split return -1; // all to left } int BzfRegion::getNumSides() const { return neighbors.size(); } const RegionPoint& BzfRegion::getCorner(int index) const { return corners[index]; } BzfRegion* BzfRegion::getNeighbor(int index) const { return neighbors[index]; } BzfRegion* BzfRegion::orphanSplitRegion(const float e1[2], const float e2[2]) { // if edge p1,p2 intersects me then split myself along that edge. // return new region (the other half of the split), or NULL if no // split occured. the new region (if it exists) will be to the // right of the cutting edge (when moving from e1 to e2). const int count = corners.size(); if (count == 0) return NULL; int i, split = 0, edge[2]; float tsplit[2], etsplit[2]; const float dx = e2[0] - e1[0]; const float dy = e2[1] - e1[1]; const float d = dy * e1[0] - dx * e1[1]; const float* p1 = corners[0].get(); // Vector Product between splitter and corner : to know if right or left float lastPVect = d - dy * p1[0] + dx * p1[1]; // keep sign of PVector, too risky to recompute bool lastSign = (lastPVect >= 0); // Sign (Left or Right) of first corner and hence first transition bool fistCornerRight = lastSign; for (i = 0; split < 2 && i < count; i++) { const float* p2 = corners[(i + 1) % count].get(); const float pVect = d - dy * p2[0] + dx * p2[1]; const bool newSign = (pVect >= 0); // if both ends of region edge are on same side of cutting edge then // can't intersect the edge. if (lastSign != newSign) { const float delta = lastPVect - pVect; // compute distance along region edge where intersection occurs tsplit[split] = lastPVect / delta; edge[split] = i; etsplit[split] = ((p1[1] - p2[1]) * (p1[0] - e1[0]) + (p2[0] - p1[0]) * (p1[1] - e1[1])) / delta; split++; } lastPVect = pVect; lastSign = newSign; p1 = p2; } // done if no intersections if (split != 2 || (etsplit[0] <= 0.0 && etsplit[1] <= 0.0) || (etsplit[0] >= 1.0 && etsplit[1] >= 1.0)) return 0; // corner is t the left of cutting edge -- new region between edge 1 and 0 if (!fistCornerRight) { i = edge[0]; edge[0] = edge[1]; edge[1] = i; float tsplitTemp = tsplit[0]; tsplit[0] = tsplit[1]; tsplit[1] = tsplitTemp; } // make new corners and region p1 = corners[edge[1]].get(); const float* p2 = corners[(edge[1]+1) % count].get(); RegionPoint n2(p1[0] + tsplit[1] * (p2[0] - p1[0]), p1[1] + tsplit[1] * (p2[1] - p1[1])); p1 = corners[edge[0]].get(); p2 = corners[(edge[0]+1) % count].get(); RegionPoint n1(p1[0] + tsplit[0] * (p2[0] - p1[0]), p1[1] + tsplit[0] * (p2[1] - p1[1])); BzfRegion* newRegion = new BzfRegion; // add sides to new region and remove them from me. the new region // must be to the right of the edge. see if the corner after the // split on the first split edge is to the right or left of the // cutting edge. { // add sides to new region newRegion->addSide(n1, neighbors[edge[0]]); i = edge[0]; while (true) { i++; if (i == count) i = 0; newRegion->addSide(corners[i], neighbors[i]); if (i == edge[1]) break; if (neighbors[i]) neighbors[i]->setNeighbor(this, newRegion); } newRegion->addSide(n2, this); // tell neighbors on split edges to split the shared edge at the // same place and to point to their new neighbor // tell them about their new neighbor. if (neighbors[edge[0]]) neighbors[edge[0]]->splitEdge(this, newRegion, n1, true); if (neighbors[edge[1]]) neighbors[edge[1]]->splitEdge(this, newRegion, n2, false); // remove old edges from myself and add new ones std::vector newCorners; std::vector newNeighbors; newCorners.push_back(n2); newNeighbors.push_back(neighbors[edge[1]]); i = edge[1]; while (true) { i++; if (i == count) i = 0; newCorners.push_back(corners[i]); newNeighbors.push_back(neighbors[i]); if (i == edge[0]) break; } newCorners.push_back(n1); newNeighbors.push_back(newRegion); corners = newCorners; neighbors = newNeighbors; } // throw out degenerate edges in myself and newRegion tidy(); newRegion->tidy(); // all done return newRegion; } void BzfRegion::splitEdge(const BzfRegion* oldNeighbor, BzfRegion* newNeighbor, const RegionPoint& p, bool onRight) { // split my edge which has neighbor oldNeighbor at point p. // set the neighbor for the edge on the right if onRight is true // or on the left if onRight is false to newNeighbor. const int count = corners.size(); for (int i = 0; i < count; i++) if (neighbors[i] == oldNeighbor) { std::vector::iterator it1 = corners.begin(); for(int j = 0; j < i + 1; j++) ++it1; corners.insert(it1, p); if (onRight) { std::vector::iterator it2 = neighbors.begin(); for(int j = 0; j < i; j++) ++it2; neighbors.insert(it2, newNeighbor); } else { std::vector::iterator it2 = neighbors.begin(); for(int j = 0; j < i + 1; j++) ++it2; neighbors.insert(it2, newNeighbor); } tidy(); break; } } void BzfRegion::addSide(const RegionPoint& p, BzfRegion* neighbor) { corners.push_back(p); neighbors.push_back(neighbor); } void BzfRegion::setNeighbor(const BzfRegion* oldNeighbor, BzfRegion* newNeighbor) { const int count = corners.size(); for (int i = 0; i < count; i++) if (neighbors[i] == oldNeighbor) { neighbors[i] = newNeighbor; break; } } void BzfRegion::tidy() { // throw out degenerate edges int count = corners.size(); for (int i = 0; i < count; i++) { const float* p1 = corners[i].get(); const float* p2 = corners[(i+1)%count].get(); if (fabs(p1[0] - p2[0]) < ZERO_TOLERANCE && fabs(p1[1] - p2[1]) < ZERO_TOLERANCE) { std::vector::iterator it1 = corners.begin(); for(int j = 0; j < i; j++) ++it1; corners.erase(it1); std::vector::iterator it2 = neighbors.begin(); for(int k = 0; k < i; k++) ++it2; neighbors.erase(it2); i--; count--; } } } bool BzfRegion::test(int mailboxIndex) const { return (mailbox != mailboxIndex); } void BzfRegion::setPathStuff(float _distance, BzfRegion* _target, const float _a[2], int mailboxIndex) { distance = _distance; target = _target; A = RegionPoint(_a); mailbox = mailboxIndex; } float BzfRegion::getDistance() const { return distance; } BzfRegion* BzfRegion::getTarget() const { return target; } const float* BzfRegion::getA() const { return A.get(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Region.h000066400000000000000000000042741200563112200170760ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __REGION_H__ #define __REGION_H__ #include "common.h" /* system interface headers */ #include const float maxDistance = 1.0e6; class RegionPoint { public: RegionPoint(float x, float y); RegionPoint(const float v[2]); ~RegionPoint(); const float* get() const; private: float p[2]; }; class BzfRegion { public: BzfRegion(int sides, const float p[][2]); ~BzfRegion(); bool isInside(const float p[2]) const; // get point distance from Region. Point should be outside Region! float getDistance(const float p[2], float nearest[2]) const; int classify(const float p1[2], const float p2[2]) const; BzfRegion* orphanSplitRegion(const float p1[2], const float p2[2]); int getNumSides() const; const RegionPoint& getCorner(int index) const; BzfRegion* getNeighbor(int index) const; bool test(int mailboxIndex) const; void setPathStuff(float distance, BzfRegion* target, const float p[2], int mailboxIndex); float getDistance() const; BzfRegion* getTarget() const; const float* getA() const; protected: BzfRegion(); void splitEdge(const BzfRegion* oldNeighbor, BzfRegion* newNeighbor, const RegionPoint& p, bool onRight); void addSide(const RegionPoint&, BzfRegion* neighbor); void setNeighbor(const BzfRegion* oldNeighbor, BzfRegion* newNeighbor); void tidy(); private: std::vector corners; std::vector neighbors; int mailbox; BzfRegion* target; float distance; RegionPoint A; }; #endif /* __REGION_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RegionPriorityQueue.cxx000066400000000000000000000032101200563112200222050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "RegionPriorityQueue.h" // FIXME -- should use a heap RegionPriorityQueue::Node::Node(BzfRegion* _region, float _priority) : next(0), region(_region), priority(_priority) { } RegionPriorityQueue::RegionPriorityQueue() : head(0) { } RegionPriorityQueue::~RegionPriorityQueue() { removeAll(); } void RegionPriorityQueue::insert(BzfRegion* region, float priority) { Node* node = new Node(region, priority); if (!head || priority < head->priority) { node->next = head; head = node; } else { Node* scan = head; while (scan->next && priority >= scan->next->priority) scan = scan->next; node->next = scan->next; scan->next = node; } } BzfRegion* RegionPriorityQueue::remove() { Node* tmp = head; head = head->next; BzfRegion* region = tmp->region; delete tmp; return region; } void RegionPriorityQueue::removeAll() { while (head) { Node* next = head->next; delete head; head = next; } head = 0; } bool RegionPriorityQueue::isEmpty() const { return (head == 0); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RegionPriorityQueue.h000066400000000000000000000022111200563112200216320ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __REGIONPRIORITYQUEUE_H__ #define __REGIONPRIORITYQUEUE_H__ /* local interface headers */ #include "Region.h" class RegionPriorityQueue { public: RegionPriorityQueue(); ~RegionPriorityQueue(); void insert(BzfRegion* region, float priority); BzfRegion* remove(); void removeAll(); bool isEmpty() const; private: struct Node { public: Node(BzfRegion* region, float priority); public: Node* next; BzfRegion* region; float priority; }; private: Node* head; }; #endif /* __REGIONPRIORITYQUEUE_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RemotePlayer.cxx000066400000000000000000000105041200563112200206270ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "RemotePlayer.h" /* common implementation headers */ #include "World.h" RemotePlayer::RemotePlayer(const PlayerId& _id, TeamColor _team, const char* _name, const char* _motto, const PlayerType _type) : Player(_id, _team, _name, _motto, _type) { numShots = World::getWorld()->getMaxShots(); shots = new RemoteShotPath*[numShots]; for (int i = 0; i < numShots; i++) shots[i] = NULL; } RemotePlayer::~RemotePlayer() { for (int i = 0; i < numShots; i++) delete shots[i]; delete[] shots; } void RemotePlayer::addShot(const FiringInfo& info) { float newpos[3]; const float *f = getForward(); RemoteShotPath* newShot = new RemoteShotPath(info); int shotNum = int(newShot->getShotId() & 255); if (shots[shotNum]) delete shots[shotNum]; shots[shotNum] = newShot; // Update tanks position and set dead reckoning for better lag handling // shot origin is center of tank for shockwave if (info.flagType == Flags::ShockWave) { newpos[0] = info.shot.pos[0]; newpos[1] = info.shot.pos[1]; newpos[2] = info.shot.pos[2]; } // shot origin is muzzle for other shots else { float front = BZDB.eval(StateDatabase::BZDB_MUZZLEFRONT); if (info.flagType == Flags::Obesity) front *= BZDB.eval(StateDatabase::BZDB_OBESEFACTOR); else if (info.flagType == Flags::Tiny) front *= BZDB.eval(StateDatabase::BZDB_TINYFACTOR); else if (info.flagType == Flags::Thief) front *= BZDB.eval(StateDatabase::BZDB_THIEFTINYFACTOR); newpos[0] = info.shot.pos[0] - (front * f[0]); newpos[1] = info.shot.pos[1] - (front * f[1]); newpos[2] = info.shot.pos[2] - BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); } shotStatistics.recordFire(info.flagType,f,info.shot.vel); // FIXME - with dynamic dimensions, this may not be a good idea // (flag each shot with a 'default dimensions' state?) move(newpos, getAngle()); // FIXME - timestamp of shots are handled slightly different than for // tank position updates, better so ignore them for now // detail: settick | shot: current() | move | draw | tankpos: tick() //setDeadReckoning(info.timeSent); setDeadReckoning(-1.0f); } ShotPath* RemotePlayer::getShot(int index) const { index &= 0x00FF; if ((index < 0) || (index >= World::getWorld()->getMaxShots())) return NULL; return shots[index]; } bool RemotePlayer::doEndShot( int ident, bool isHit, float* pos) { const int index = ident & 255; const int salt = (ident >> 8) & 127; // special id used in some messages (and really shouldn't be sent here) if (ident == -1) return false; // ignore bogus shots (those with a bad index or for shots that don't exist) if (index < 0 || index >= World::getWorld()->getMaxShots() || !shots[index]) return false; // ignore shots that already ending if (shots[index]->isExpired() || shots[index]->isExpiring()) return false; // ignore shots that have the wrong salt. since we reuse shot indices // it's possible for an old MsgShotEnd to arrive after we've started a // new shot. that's where the salt comes in. it changes for each shot // so we can identify an old shot from a new one. if (salt != ((shots[index]->getShotId() >> 8) & 127)) return false; // keep statistics shotStatistics.recordHit(shots[index]->getFlag()); // don't stop if it's because were hitting something and we don't stop // when we hit something. if (isHit && !shots[index]->isStoppedByHit()) return false; // end it const float* shotPos = shots[index]->getPosition(); pos[0] = shotPos[0]; pos[1] = shotPos[1]; pos[2] = shotPos[2]; shots[index]->setExpired(); return true; } void RemotePlayer::updateShots(float dt) { for (int i = 0; i < numShots; i++) if (shots[i]) shots[i]->update(dt); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RemotePlayer.h000066400000000000000000000024141200563112200202550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __REMOTEPLAYER_H__ #define __REMOTEPLAYER_H__ #include "common.h" /* interface header */ #include "Player.h" /* common interface headers */ #include "global.h" #include "ShotUpdate.h" /* local interface headers */ #include "ShotPath.h" class RemotePlayer : public Player { public: RemotePlayer(const PlayerId&, TeamColor team, const char* name, const char* motto, const PlayerType); ~RemotePlayer(); void addShot(const FiringInfo&); ShotPath* getShot(int index) const; void updateShots(float dt); private: bool doEndShot(int index, bool isHit, float* pos); private: int numShots; RemoteShotPath** shots; }; #endif /* __REMOTE_PLAYER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Roaming.cxx000066400000000000000000000260611200563112200176200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Roaming.h" /* common headers */ #include "BZDBCache.h" #include "AnsiCodes.h" /* local headers */ #include "ScoreboardRenderer.h" // initialize the singleton template <> Roaming* Singleton::_instance = (Roaming*)0; Roaming::Roaming() : view(roamViewDisabled), targetManual(-1), targetWinner(-1), targetFlag(-1) { resetCamera(); } Player* getRoamTargetTank() { return ROAM.getTargetTank(); } void Roaming::resetCamera(void) { camera.pos[0] = 0.0f; camera.pos[1] = 0.0f; camera.pos[2] = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); camera.theta = 0.0f; camera.zoom = 60.0f; camera.phi = -0.0f; } void Roaming::setCamera(RoamingCamera* newCam) { memcpy(&camera, newCam, sizeof(RoamingCamera)); } void Roaming::setMode(RoamingView newView) { if (!(LocalPlayer::getMyTank() || devDriving)) { view = newView; } else if (LocalPlayer::getMyTank()->getTeam() == ObserverTeam) { // disallow disabling roaming in observer mode if ((newView == roamViewDisabled) && !devDriving) view = (RoamingView)(roamViewDisabled + 1); else view = newView; } else { // don't allow roaming for non-observers if (newView != roamViewDisabled) view = roamViewDisabled; else view = newView; } // make sure we have a valid target changeTarget(next); changeTarget(previous); } static int findPlayerInVector(const std::vector& vec, Player* p) { for (size_t i = 0; i < vec.size(); i++) { if (p == vec[i]) { return int(i); } } return -1; } static int findPlayerIndex(PlayerId pid) { World* world = World::getWorld(); for (int i = 0; i < world->getCurMaxPlayers(); i++) { Player* p = world->getPlayer(i); if (p && (p->getId() == pid)) { return i; } } return -1; } bool Roaming::changePlayer(RoamingTarget target) { World* world = World::getWorld(); std::vector players; ScoreboardRenderer::getPlayerList(players); const int pCount = int(players.size()); if (!world || (pCount <= 0)) { targetManual = targetWinner = -1; return false; } Player* current = NULL; if ((targetManual >= 0) && (targetManual < world->getCurMaxPlayers())) { current = getPlayerByIndex(targetManual); } const bool nextTarget = (target == next); if (!current) { Player* p = nextTarget ? players.back() : players.front(); targetManual = targetWinner = findPlayerIndex(p->getId()); return (targetManual >= 0); } int pIndex = findPlayerInVector(players, current); if (pIndex < 0) { targetManual = targetWinner = -1; } else { pIndex += (nextTarget ? -1 : +1); if (pIndex >= pCount) { pIndex = -1; } if ((pIndex >= 0) && (pIndex < pCount)) { Player* p = players[pIndex]; targetManual = targetWinner = findPlayerIndex(p->getId()); } else { targetManual = targetWinner = -1; } } return true; } void Roaming::changeTarget(Roaming::RoamingTarget target, int explicitIndex) { bool found = false; World* world = World::getWorld(); if (!world) { logDebugMessage(4,"Roaming::changeTarget() no world, switching to free roaming\n"); view = roamViewFree; buildRoamingLabel(); return; } if (view == roamViewFree || view == roamViewDisabled) { // do nothing found = true; } else if (view == roamViewFlag) { if (target == explicitSet) { targetFlag = explicitIndex; found = true; } else { int i, j; const int maxFlags = world->getMaxFlags(); for (i = 1; i <= maxFlags; ++i) { if (target == next) { j = (targetFlag + i) % maxFlags; } else { j = (targetFlag - i + maxFlags) % maxFlags; } const Flag& flag = world->getFlag(j); if (flag.type->flagTeam != NoTeam) { targetFlag = j; found = true; break; } } } } else { if (target == explicitSet) { targetManual = targetWinner = explicitIndex; found = true; } else { found = changePlayer(target); } } if (!found) { view = roamViewFree; } buildRoamingLabel(); Player* tracked = NULL; if (!devDriving) { if (world) { tracked = world->getPlayer(targetWinner); } } else { tracked = LocalPlayer::getMyTank(); } if (tracked) { tracked->reportedHits = tracked->computedHits = 0; } } void Roaming::buildRoamingLabel(void) { std::string playerString = ""; World* world = World::getWorld(); // follow the important tank if (targetManual == -1) { Player* top = NULL; if (world && world->allowRabbit()) { // follow the white rabbit top = world->getCurrentRabbit(); if (top != NULL) { playerString = "Rabbit "; targetWinner = top->getId(); } } if (top == NULL) { // find the leader top = ScoreboardRenderer::getLeader(&playerString); if (top == NULL) { targetWinner = 0; } else { targetWinner = top->getId(); } } } Player* tracked = NULL; if (!devDriving) { if (world) { tracked = world->getPlayer(targetWinner); } } else { tracked = LocalPlayer::getMyTank(); } if (world && tracked) { if (BZDBCache::colorful) { int color = tracked->getTeam(); if (color == RabbitTeam || color < 0 || color > LastColor) { // non-teamed, rabbit are white (same as observer) color = WhiteColor; } playerString += ColorStrings[color]; } playerString += tracked->getCallSign(); const FlagType* flag = tracked->getFlag(); if (flag != Flags::Null) { if (BZDBCache::colorful) { playerString += ColorStrings[CyanColor] + " / "; if (flag->flagTeam != NoTeam) { playerString += ColorStrings[flag->flagTeam]; } else { playerString += ColorStrings[WhiteColor]; } } else { playerString += " / "; } if (flag->endurance == FlagNormal) { playerString += flag->flagName; } else { playerString += flag->flagAbbv; } } switch (view) { case roamViewTrack: { roamingLabel = "Tracking " + playerString; break; } case roamViewFollow: { roamingLabel = "Following " + playerString; break; } case roamViewFP: { roamingLabel = "Driving with " + playerString; break; } case roamViewFlag: { roamingLabel = std::string("Tracking ") + world->getFlag(targetFlag).type->flagName + " Flag"; break; } default: { roamingLabel = "Roaming"; break; } } } else { roamingLabel = "Roaming"; } } void Roaming::updatePosition(RoamingCamera* dc, float dt) { World* world = World::getWorld(); // are we tracking? bool tracking = false; const float* trackPos; if (view == roamViewTrack) { Player *target; if (!devDriving) { if (world && (targetWinner < world->getCurMaxPlayers())) { target = world->getPlayer(targetWinner); } else { target = NULL; } } else { target = LocalPlayer::getMyTank(); } if (target != NULL) { trackPos = target->getPosition(); tracking = true; } } else if (view == roamViewFlag) { if ((world != NULL) && (targetFlag < world->getMaxFlags())) { Flag &flag = world->getFlag(targetFlag); trackPos = flag.position; tracking = true; } } // modify X and Y coords if (!tracking) { const float c = cosf(camera.theta * (float)(M_PI / 180.0f)); const float s = sinf(camera.theta * (float)(M_PI / 180.0f)); camera.pos[0] += dt * (c * dc->pos[0] - s * dc->pos[1]); camera.pos[1] += dt * (c * dc->pos[1] + s * dc->pos[0]); camera.theta += dt * dc->theta; camera.phi += dt * dc->phi; } else { float dx = camera.pos[0] - trackPos[0]; float dy = camera.pos[1] - trackPos[1]; float dist = sqrtf((dx * dx) + (dy * dy)); float nomDist = 4.0f * BZDBCache::tankSpeed; if (nomDist == 0.0f) { nomDist = 100.0f; } float distFactor = (dist / nomDist); if (distFactor < 0.25f) { distFactor = 0.25f; } float newDist = dist - (dt * distFactor * dc->pos[0]); const float minDist = BZDBCache::tankLength * 0.5f; if (newDist < minDist) { if (dist >= minDist) { newDist = minDist; } else { newDist = dist; } } float scale = 0.0f; if (dist > 0.0f) { scale = newDist / dist; } dx = dx * scale; dy = dy * scale; if (fabsf(dx) < 0.001f) dx = 0.001f; if (fabsf(dy) < 0.001f) dy = 0.001f; const float dtheta = -(dt * dc->theta * (float)(M_PI / 180.0f)); const float c = cosf(dtheta); const float s = sinf(dtheta); camera.pos[0] = trackPos[0] + ((c * dx) - (s * dy)); camera.pos[1] = trackPos[1] + ((c * dy) + (s * dx)); // setup so that free roam stays in the last state camera.theta = atan2f(trackPos[1] - camera.pos[1], trackPos[0] - camera.pos[0]); camera.theta *= (float)(180.0f / M_PI); camera.phi = atan2f(trackPos[2] - camera.pos[2], newDist); camera.phi *= (float)(180.0f / M_PI); } // clamp phi const float phiLimit = 90.0f - 1.0e-3f; if (camera.phi > phiLimit) { camera.phi = phiLimit; } else if (camera.phi < -phiLimit) { camera.phi = -phiLimit; } // modify Z coordinate camera.pos[2] += dt * dc->pos[2]; float muzzleHeight = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); if (camera.pos[2] < muzzleHeight) { camera.pos[2] = muzzleHeight; dc->pos[2] = 0.0f; } // adjust zoom camera.zoom += dt * dc->zoom; if (camera.zoom < BZDB.eval("roamZoomMin")) { camera.zoom = BZDB.eval("roamZoomMin"); } else if (camera.zoom > BZDB.eval("roamZoomMax")) { camera.zoom = BZDB.eval("roamZoomMax"); } } Roaming::RoamingView Roaming::parseView(const std::string& str) const { const char* s = str.c_str(); if (strcasecmp(s, "disabled") == 0) { return roamViewDisabled; } else if (strcasecmp(s, "free") == 0) { return roamViewFree; } else if (strcasecmp(s, "track") == 0) { return roamViewTrack; } else if (strcasecmp(s, "follow") == 0) { return roamViewFollow; } else if (strcasecmp(s, "fps") == 0) { return roamViewFP; } else if (strcasecmp(s, "flag") == 0) { return roamViewFlag; } else { return roamViewDisabled; } } const char* Roaming::getViewName(RoamingView roamView) const { switch (roamView) { case roamViewDisabled: { return "disabled"; } case roamViewFree: { return "free"; } case roamViewTrack: { return "track"; } case roamViewFollow: { return "follow"; } case roamViewFP: { return "fps"; } case roamViewFlag: { return "flag"; } default: { return "unknown"; } } } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Roaming.h000066400000000000000000000064551200563112200172520ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* bzflag common header */ #include "common.h" /* system headers */ #include /* common headers */ #include "Singleton.h" #include "Player.h" #include "Flag.h" /* local headers */ #include "World.h" #include "Roster.h" #define ROAM (Roaming::instance()) class Roaming : public Singleton { public: Roaming(); // c'tor enum RoamingView { roamViewDisabled = 0, roamViewFree, roamViewTrack, roamViewFollow, roamViewFP, roamViewFlag, roamViewCount }; bool isRoaming(void) const; RoamingView getMode(void) const; void setMode(RoamingView newView); RoamingView parseView(const std::string& view) const; const char* getViewName(RoamingView) const; enum RoamingTarget { next = 0, previous, explicitSet }; void changeTarget(RoamingTarget target, int explicitIndex = 0); /* if view is in any mode in which they are not valid, getTargetTank and getTargetFlag will return NULL. Otherwise they return the index of the object that you're tracking/following/driving with */ Player* getTargetTank(void) const; Flag* getTargetFlag(void) const; void buildRoamingLabel(void); std::string getRoamingLabel(void) const; struct RoamingCamera { float pos[3]; float theta; float phi; float zoom; }; void setCamera(RoamingCamera* newCam); void resetCamera(void); /* note that dc is a camera structure of *changes* (thus dc) not new values */ void updatePosition(RoamingCamera* dc, float dt); const RoamingCamera* getCamera(void) const; void setZoom(float newZoom); float getZoom(void) const; protected: friend class Singleton; private: bool changePlayer(RoamingTarget targetType); // for changeTarget() private: RoamingView view; RoamingCamera camera; int targetManual; int targetWinner; int targetFlag; std::string roamingLabel; }; inline bool Roaming::isRoaming(void) const { return (view > roamViewDisabled); } inline Roaming::RoamingView Roaming::getMode(void) const { return view; } inline float Roaming::getZoom() const { return camera.zoom; } inline void Roaming::setZoom(float newZoom) { camera.zoom = newZoom; } inline std::string Roaming::getRoamingLabel(void) const { return roamingLabel; } inline Player* Roaming::getTargetTank() const { if ((getMode() == roamViewFollow) || (getMode() == roamViewFP) || (getMode() == roamViewTrack)) return getPlayerByIndex(targetWinner); else return NULL; } inline Flag* Roaming::getTargetFlag() const { World* world = World::getWorld(); if (!world) return NULL; else return &(world->getFlag(targetFlag)); } inline const Roaming::RoamingCamera* Roaming::getCamera() const { return &camera; } const bool devDriving = false; // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RobotPlayer.cxx000066400000000000000000000367771200563112200205050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * */ // interface header #include "RobotPlayer.h" // common implementation headers #include "BZDBCache.h" // local implementation headers #include "World.h" #include "Intersect.h" #include "TargetingUtils.h" std::vector* RobotPlayer::obstacleList = NULL; RobotPlayer::RobotPlayer(const PlayerId& _id, const char* _name, ServerLink* _server, const char* _motto = "") : LocalPlayer(_id, _name, _motto), target(NULL), pathIndex(0), timerForShot(0.0f), drivingForward(true) { gettingSound = false; server = _server; } // estimate a player's position at now+t, similar to dead reckoning void RobotPlayer::projectPosition(const Player *targ,const float t,float &x,float &y,float &z) const { double hisx=targ->getPosition()[0]; double hisy=targ->getPosition()[1]; double hisz=targ->getPosition()[2]; double hisvx=targ->getVelocity()[0]; double hisvy=targ->getVelocity()[1]; double hisvz=targ->getVelocity()[2]; double omega=fabs(targ->getAngularVelocity()); double sx,sy; if ((targ->getStatus() & PlayerState::Falling) || fabs(omega) < 2*M_PI / 360 * 0.5) { sx=t*hisvx; sy=t*hisvy; } else { double hisspeed = hypotf(hisvx, hisvy); double alfa = omega * t; double r = hisspeed / fabs(omega); double dx = r * sin(alfa); double dy2 = r * (1 - cos(alfa)); double beta = atan2(dy2, dx) * (targ->getAngularVelocity() > 0 ? 1 : -1); double gamma = atan2(hisvy, hisvx); double rho = gamma+beta; sx = hisspeed * t * cos(rho); sy = hisspeed * t * sin(rho); } x=(float)hisx+(float)sx; y=(float)hisy+(float)sy; z=(float)hisz+(float)hisvz*t; if (targ->getStatus() & PlayerState::Falling) z += 0.5f * BZDBCache::gravity * t * t; if (z < 0) z = 0; } // get coordinates to aim at when shooting a player; steps: // 1. estimate how long it will take shot to hit target // 2. calc position of target at that point of time // 3. jump to 1., using projected position, loop until result is stable void RobotPlayer::getProjectedPosition(const Player *targ, float *projpos) const { double myx = getPosition()[0]; double myy = getPosition()[1]; double hisx = targ->getPosition()[0]; double hisy = targ->getPosition()[1]; double deltax = hisx - myx; double deltay = hisy - myy; double distance = hypotf(deltax,deltay) - BZDB.eval(StateDatabase::BZDB_MUZZLEFRONT) - BZDBCache::tankRadius; if (distance <= 0) distance = 0; double shotspeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED)* (getFlag() == Flags::Laser ? BZDB.eval(StateDatabase::BZDB_LASERADVEL) : getFlag() == Flags::RapidFire ? BZDB.eval(StateDatabase::BZDB_RFIREADVEL) : getFlag() == Flags::MachineGun ? BZDB.eval(StateDatabase::BZDB_MGUNADVEL) : 1) + hypotf(getVelocity()[0], getVelocity()[1]); double errdistance = 1.0; float tx, ty, tz; for (int tries=0 ; errdistance > 0.05 && tries < 4 ; tries++) { float t = (float)distance / (float)shotspeed; projectPosition(targ, t + 0.05f, tx, ty, tz); // add 50ms for lag double distance2 = hypotf(tx - myx, ty - myy); errdistance = fabs(distance2-distance) / (distance + ZERO_TOLERANCE); distance = distance2; } projpos[0] = tx; projpos[1] = ty; projpos[2] = tz; // projected pos in building -> use current pos if (World::getWorld()->inBuilding(projpos, 0.0f, BZDBCache::tankHeight)) { projpos[0] = targ->getPosition()[0]; projpos[1] = targ->getPosition()[1]; projpos[2] = targ->getPosition()[2]; } } void RobotPlayer::doUpdate(float dt) { LocalPlayer::doUpdate(dt); float tankRadius = BZDBCache::tankRadius; const float shotRange = BZDB.eval(StateDatabase::BZDB_SHOTRANGE); const float shotRadius = BZDB.eval(StateDatabase::BZDB_SHOTRADIUS); // fire shot if any available timerForShot -= dt; if (timerForShot < 0.0f) timerForShot = 0.0f; if (getFiringStatus() != Ready) return; bool shoot = false; const float azimuth = getAngle(); // Allow shooting only if angle is near and timer has elapsed if ((!path.empty()) && timerForShot <= 0.0f) { float p1[3]; getProjectedPosition(target, p1); const float* p2 = getPosition(); float shootingAngle = atan2f(p1[1] - p2[1], p1[0] - p2[0]); if (shootingAngle < 0.0f) shootingAngle += (float)(2.0 * M_PI); float azimuthDiff = shootingAngle - azimuth; if (azimuthDiff > M_PI) azimuthDiff -= (float)(2.0 * M_PI); else if (azimuthDiff < -M_PI) azimuthDiff += (float)(2.0 * M_PI); const float targetdistance = hypotf(p1[0] - p2[0], p1[1] - p2[1]) - BZDB.eval(StateDatabase::BZDB_MUZZLEFRONT) - tankRadius; const float missby = fabs(azimuthDiff) * (targetdistance - BZDBCache::tankLength); // only shoot if we miss by less than half a tanklength and no building inbetween if (missby < 0.5f * BZDBCache::tankLength && p1[2] < shotRadius) { float pos[3] = {getPosition()[0], getPosition()[1], getPosition()[2] + BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT)}; float dir[3] = {cosf(azimuth), sinf(azimuth), 0.0f}; Ray tankRay(pos, dir); float maxdistance = targetdistance; if (!ShotStrategy::getFirstBuilding(tankRay, -0.5f, maxdistance)) { shoot=true; // try to not aim at teammates for (int i=0; i <= World::getWorld()->getCurMaxPlayers(); i++) { Player *p = 0; if (i < World::getWorld()->getCurMaxPlayers()) p = World::getWorld()->getPlayer(i); else p = LocalPlayer::getMyTank(); if (!p || p->getId() == getId() || validTeamTarget(p) || !p->isAlive()) continue; float relpos[3] = {getPosition()[0] - p->getPosition()[0], getPosition()[1] - p->getPosition()[1], getPosition()[2] - p->getPosition()[2]}; Ray ray(relpos, dir); float impact = rayAtDistanceFromOrigin(ray, 5 * BZDBCache::tankRadius); if (impact > 0 && impact < shotRange) { shoot=false; timerForShot = 0.1f; break; } } if (shoot && fireShot()) { // separate shot by 0.2 - 0.8 sec (experimental value) timerForShot = float(bzfrand()) * 0.6f + 0.2f; } } } } } void RobotPlayer::doUpdateMotion(float dt) { if (isAlive()) { bool evading = false; // record previous position const float oldAzimuth = getAngle(); const float* oldPosition = getPosition(); float position[3]; position[0] = oldPosition[0]; position[1] = oldPosition[1]; position[2] = oldPosition[2]; float azimuth = oldAzimuth; float tankAngVel = BZDB.eval(StateDatabase::BZDB_TANKANGVEL); float tankSpeed = BZDBCache::tankSpeed; // basically a clone of Roger's evasive code for (int t=0; t <= World::getWorld()->getCurMaxPlayers(); t++) { Player *p = 0; if (t < World::getWorld()->getCurMaxPlayers()) p = World::getWorld()->getPlayer(t); else p = LocalPlayer::getMyTank(); if (!p || p->getId() == getId()) continue; const int maxShots = p->getMaxShots(); for (int s = 0; s < maxShots; s++) { ShotPath* shot = p->getShot(s); if (!shot || shot->isExpired()) continue; // ignore invisible bullets completely for now (even when visible) if (shot->getFlag() == Flags::InvisibleBullet) continue; const float* shotPos = shot->getPosition(); if ((fabs(shotPos[2] - position[2]) > BZDBCache::tankHeight) && (shot->getFlag() != Flags::GuidedMissile)) continue; const float dist = TargetingUtils::getTargetDistance(position, shotPos); if (dist < 150.0f) { const float *shotVel = shot->getVelocity(); float shotAngle = atan2f(shotVel[1], shotVel[0]); float shotUnitVec[2] = {cosf(shotAngle), sinf(shotAngle)}; float trueVec[2] = {(position[0]-shotPos[0])/dist,(position[1]-shotPos[1])/dist}; float dotProd = trueVec[0]*shotUnitVec[0]+trueVec[1]*shotUnitVec[1]; if (dotProd > 0.97f) { float rotation; float rotation1 = (float)((shotAngle + M_PI/2.0) - azimuth); if (rotation1 < -1.0f * M_PI) rotation1 += (float)(2.0 * M_PI); if (rotation1 > 1.0f * M_PI) rotation1 -= (float)(2.0 * M_PI); float rotation2 = (float)((shotAngle - M_PI/2.0) - azimuth); if (rotation2 < -1.0f * M_PI) rotation2 += (float)(2.0 * M_PI); if (rotation2 > 1.0f * M_PI) rotation2 -= (float)(2.0 * M_PI); if (fabs(rotation1) < fabs(rotation2)) rotation = rotation1; else rotation = rotation2; setDesiredSpeed(1.0f); setDesiredAngVel(rotation); evading = true; } } } } // when we are not evading, follow the path if (!evading && dt > 0.0 && pathIndex < (int)path.size()) { float distance; float v[2]; const float* endPoint = path[pathIndex].get(); // find how long it will take to get to next path segment v[0] = endPoint[0] - position[0]; v[1] = endPoint[1] - position[1]; distance = hypotf(v[0], v[1]); float tankRadius = BZDBCache::tankRadius; // smooth path a little by turning early at corners, might get us stuck, though if (distance <= 2.5f * tankRadius) pathIndex++; float segmentAzimuth = atan2f(v[1], v[0]); float azimuthDiff = segmentAzimuth - azimuth; if (azimuthDiff > M_PI) azimuthDiff -= (float)(2.0 * M_PI); else if (azimuthDiff < -M_PI) azimuthDiff += (float)(2.0 * M_PI); if (fabs(azimuthDiff) > 0.01f) { // drive backward when target is behind, try to stick to last direction if (drivingForward) drivingForward = fabs(azimuthDiff) < M_PI/2*0.9 ? true : false; else drivingForward = fabs(azimuthDiff) < M_PI/2*0.3 ? true : false; setDesiredSpeed(drivingForward ? 1.0f : -1.0f); // set desired turn speed if (azimuthDiff >= dt * tankAngVel) { setDesiredAngVel(1.0f); } else if (azimuthDiff <= -dt * tankAngVel) { setDesiredAngVel(-1.0f); } else { setDesiredAngVel(azimuthDiff / dt / tankAngVel); } } else { drivingForward = true; // tank doesn't turn while moving forward setDesiredAngVel(0.0f); // find how long it will take to get to next path segment if (distance <= dt * tankSpeed) { pathIndex++; // set desired speed setDesiredSpeed(distance / dt / tankSpeed); } else { setDesiredSpeed(1.0f); } } } } LocalPlayer::doUpdateMotion(dt); } void RobotPlayer::explodeTank() { LocalPlayer::explodeTank(); target = NULL; path.clear(); } void RobotPlayer::restart(const float* pos, float _azimuth) { LocalPlayer::restart(pos, _azimuth); // no target path.clear(); target = NULL; pathIndex = 0; } float RobotPlayer::getTargetPriority(const Player* _target) const { // don't target teammates or myself if (!this->validTeamTarget(_target)) return 0.0f; // go after closest player // FIXME -- this is a pretty stupid heuristic const float worldSize = BZDBCache::worldSize; const float* p1 = getPosition(); const float* p2 = _target->getPosition(); float basePriority = 1.0f; // give bonus to non-paused player if (!_target->isPaused()) basePriority += 2.0f; // give bonus to non-deadzone targets if (obstacleList) { float nearest[2]; const BzfRegion* targetRegion = findRegion (p2, nearest); if (targetRegion && targetRegion->isInside(p2)) basePriority += 1.0f; } return basePriority - 0.5f * hypotf(p2[0] - p1[0], p2[1] - p1[1]) / worldSize; } void RobotPlayer::setObstacleList(std::vector* _obstacleList) { obstacleList = _obstacleList; } const Player* RobotPlayer::getTarget() const { return target; } void RobotPlayer::setTarget(const Player* _target) { static int mailbox = 0; path.clear(); target = _target; if (!target) return; // work backwards (from target to me) float proj[3]; getProjectedPosition(target, proj); const float *p1 = proj; const float* p2 = getPosition(); float q1[2], q2[2]; BzfRegion* headRegion = findRegion(p1, q1); BzfRegion* tailRegion = findRegion(p2, q2); if (!headRegion || !tailRegion) { // if can't reach target then forget it return; } mailbox++; headRegion->setPathStuff(0.0f, NULL, q1, mailbox); RegionPriorityQueue queue; queue.insert(headRegion, 0.0f); BzfRegion* next; while (!queue.isEmpty() && (next = queue.remove()) != tailRegion) findPath(queue, next, tailRegion, q2, mailbox); // get list of points to go through to reach the target next = tailRegion; do { p1 = next->getA(); path.push_back(p1); next = next->getTarget(); } while (next && next != headRegion); if (next || tailRegion == headRegion) path.push_back(q1); else path.clear(); pathIndex = 0; } BzfRegion* RobotPlayer::findRegion(const float p[2], float nearest[2]) const { nearest[0] = p[0]; nearest[1] = p[1]; const int count = obstacleList->size(); for (int o = 0; o < count; o++) if ((*obstacleList)[o]->isInside(p)) return (*obstacleList)[o]; // point is outside: find nearest region float distance = maxDistance; BzfRegion* nearestRegion = NULL; for (int i = 0; i < count; i++) { float currNearest[2]; float currDistance = (*obstacleList)[i]->getDistance(p, currNearest); if (currDistance < distance) { nearestRegion = (*obstacleList)[i]; distance = currDistance; nearest[0] = currNearest[0]; nearest[1] = currNearest[1]; } } return nearestRegion; } float RobotPlayer::getRegionExitPoint( const float p1[2], const float p2[2], const float a[2], const float targetPoint[2], float mid[2], float& priority) { float b[2]; b[0] = targetPoint[0] - a[0]; b[1] = targetPoint[1] - a[1]; float d[2]; d[0] = p2[0] - p1[0]; d[1] = p2[1] - p1[1]; float vect = d[0] * b[1] - d[1] * b[0]; float t = 0.0f; // safe value if (fabs(vect) > ZERO_TOLERANCE) { // compute intersection along (p1,d) with (a,b) t = (a[0] * b[1] - a[1] * b[0] - p1[0] * b[1] + p1[1] * b[0]) / vect; if (t > 1.0f) t = 1.0f; else if (t < 0.0f) t = 0.0f; } mid[0] = p1[0] + t * d[0]; mid[1] = p1[1] + t * d[1]; const float distance = hypotf(a[0] - mid[0], a[1] - mid[1]); // priority is to minimize distance traveled and distance left to go priority = distance + hypotf(targetPoint[0] - mid[0], targetPoint[1] - mid[1]); // return distance traveled return distance; } void RobotPlayer::findPath(RegionPriorityQueue& queue, BzfRegion* region, BzfRegion* targetRegion, const float targetPoint[2], int mailbox) { const int numEdges = region->getNumSides(); for (int i = 0; i < numEdges; i++) { BzfRegion* neighbor = region->getNeighbor(i); if (!neighbor) continue; const float* p1 = region->getCorner(i).get(); const float* p2 = region->getCorner((i+1)%numEdges).get(); float mid[2], priority; float total = getRegionExitPoint(p1, p2, region->getA(), targetPoint, mid, priority); priority += region->getDistance(); if (neighbor == targetRegion) total += hypotf(targetPoint[0] - mid[0], targetPoint[1] - mid[1]); total += region->getDistance(); if (neighbor->test(mailbox) || total < neighbor->getDistance()) { neighbor->setPathStuff(total, region, mid, mailbox); queue.insert(neighbor, priority); } } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RobotPlayer.h000066400000000000000000000041461200563112200201130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * */ #ifndef BZF_ROBOT_PLAYER_H #define BZF_ROBOT_PLAYER_H #include "common.h" /* system interface headers */ #include /* interface header */ #include "LocalPlayer.h" /* local interface headers */ #include "Region.h" #include "RegionPriorityQueue.h" #include "ServerLink.h" class RobotPlayer : public LocalPlayer { public: RobotPlayer(const PlayerId&, const char* name, ServerLink*, const char* _motto); float getTargetPriority(const Player*) const; const Player* getTarget() const; void setTarget(const Player*); static void setObstacleList(std::vector*); void restart(const float* pos, float azimuth); void explodeTank(); private: void doUpdate(float dt); void doUpdateMotion(float dt); BzfRegion* findRegion(const float p[2], float nearest[2]) const; float getRegionExitPoint( const float p1[2], const float p2[2], const float a[2], const float targetPoint[2], float mid[2], float& priority); void findPath(RegionPriorityQueue& queue, BzfRegion* region, BzfRegion* targetRegion, const float targetPoint[2], int mailbox); void projectPosition(const Player *targ,const float t,float &x,float &y,float &z) const; void getProjectedPosition(const Player *targ, float *projpos) const; private: const Player* target; std::vector path; int pathIndex; float timerForShot; bool drivingForward; static std::vector* obstacleList; }; #endif // BZF_ROBOT_PLAYER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RoofTops.cxx000066400000000000000000000042071200563112200177750ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "RoofTops.h" // local interface headers #include "Obstacle.h" #include "Ray.h" #include "CollisionManager.h" #include "Teleporter.h" /****************************************************************************/ // NOTE - this could also be used with a 'rain on windshield' effect // FIXME - this should use a pregenerated list of 3D polygons // - use something like a split quadtree (16 divs top layer, etc...) // - splitting polygons is only helpful if they break into diff cells // - return the isFlatTop() state? (for making puddles) // - return the plane normal? (also for making puddles) // - check the hit position for under-the-wall leaks? void RoofTops::load() { return; } void RoofTops::clear() { return; } float RoofTops::getTopHeight(float x, float y, float maxHeight) { const float zSpeed = -1.0f; // setup the test ray const float dir[3] = { 0.0f, 0.0f, zSpeed }; const float org[3] = { x, y, maxHeight }; Ray ray(org, dir); // get the obstacle list const ObsList* olist = COLLISIONMGR.rayTest (&ray, MAXFLOAT); float minTime = MAXFLOAT; for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; const float t = obs->intersect(ray); if (obs->getType() == Teleporter::getClassName()) { // the physics for teles is whacked, imho continue; } else if ((t > 0.0f) && (t < minTime)) { minTime = t; } } float height = maxHeight + (minTime * zSpeed); if (height < 0.0f) { height = 0.0f; } return height; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/RoofTops.h000066400000000000000000000015521200563112200174220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_ROOF_TOPS_H #define BZF_ROOF_TOPS_H // common header #include "common.h" namespace RoofTops { void load(); void clear(); // returns 0.0f if there are no buildings float getTopHeight(float x, float y, float maxHeight); } #endif // BZF_ROOF_TOPS_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Roster.cxx000066400000000000000000000055531200563112200175050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Roster.h" /* local implementation headers */ #include "World.h" NameList silencePlayers; int curMaxPlayers = 0; RemotePlayer** remotePlayers = NULL; #ifdef ROBOT RobotPlayer* robots[MAX_ROBOTS]; #endif int numRobots = 0; Player* lookupPlayer(PlayerId id) { // check my tank first LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank && myTank->getId() == id) return myTank; if (id == ServerPlayer) { World* world = World::getWorld(); if (world) return world->getWorldWeapons(); else return NULL; } if (id < curMaxPlayers && remotePlayers[id] && remotePlayers[id]->getId() == id) return remotePlayers[id]; // it's nobody we know about return NULL; } int lookupPlayerIndex(PlayerId id) { // check my tank first if (LocalPlayer::getMyTank()->getId() == id) return -2; if (id == ServerPlayer) return ServerPlayer; if (id < curMaxPlayers && remotePlayers[id] && remotePlayers[id]->getId() == id) return id; // it's nobody we know about return -1; } Player* getPlayerByIndex(int index) { if (index == -2) return LocalPlayer::getMyTank(); if (index == ServerPlayer) return World::getWorld()->getWorldWeapons(); if (index == -1 || index >= curMaxPlayers) return NULL; return remotePlayers[index]; } Player* getPlayerByName(const char* name) { for (int i = 0; i < curMaxPlayers; i++) if (remotePlayers[i] && strcmp( remotePlayers[i]->getCallSign(), name ) == 0) return remotePlayers[i]; World *world = World::getWorld(); if (!world) return NULL; WorldPlayer *worldWeapons = world->getWorldWeapons(); if (strcmp(worldWeapons->getCallSign(), name) == 0) return worldWeapons; return NULL; } BaseLocalPlayer* getLocalPlayer(PlayerId id) { LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank->getId() == id) return myTank; #ifdef ROBOT for (int i = 0; i < numRobots; i++) if (robots[i] && robots[i]->getId() == id) return robots[i]; #endif return NULL; } TeamColor PlayerIdToTeam(PlayerId id) { if (LastRealPlayer < id && id <= FirstTeam) return TeamColor(FirstTeam - id); else return NoTeam; } PlayerId TeamToPlayerId(TeamColor team) { if (team == NoTeam) return NoPlayer; else return FirstTeam - team; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Roster.h000066400000000000000000000027351200563112200171310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __ROSTER_H__ #define __ROSTER_H__ // common - 1st #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "global.h" #include "Team.h" /* local interface headers */ #include "RobotPlayer.h" #include "BaseLocalPlayer.h" #include "RemotePlayer.h" // // misc utility routines // typedef std::vector NameList; extern int curMaxPlayers; extern RemotePlayer** remotePlayers; #ifdef ROBOT extern RobotPlayer* robots[MAX_ROBOTS]; #endif extern int numRobots; extern NameList silencePlayers; Player* lookupPlayer(PlayerId id); int lookupPlayerIndex(PlayerId id); Player* getPlayerByIndex(int index); Player* getPlayerByName(const char* name); BaseLocalPlayer* getLocalPlayer(PlayerId id); TeamColor PlayerIdToTeam(PlayerId id); PlayerId TeamToPlayerId(TeamColor team); #endif /* __ROSTER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SaveWorldMenu.cxx000066400000000000000000000071701200563112200207570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "SaveWorldMenu.h" /* common implementation headers */ #include "FontManager.h" /* local implementation headers */ #include "MenuDefaultKey.h" #include "World.h" #include "MainMenu.h" SaveWorldMenu::SaveWorldMenu() { // add controls std::vector& listHUD = getControls(); HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString("Save World"); listHUD.push_back(label); filename = new HUDuiTypeIn; filename->setFontFace(MainMenu::getFontFace()); filename->setLabel("File Name:"); filename->setMaxLength(255); listHUD.push_back(filename); status = new HUDuiLabel; status->setFontFace(MainMenu::getFontFace()); status->setString(""); status->setPosition(0.5f * (float)width, status->getY()); listHUD.push_back(status); // only navigate to the file name initNavigation(listHUD, 1,1); } SaveWorldMenu::~SaveWorldMenu() { } HUDuiDefaultKey* SaveWorldMenu::getDefaultKey() { return MenuDefaultKey::getInstance(); } void SaveWorldMenu::execute() { World *pWorld = World::getWorld(); if (pWorld == NULL) { status->setString("No world loaded to save"); } else { std::string fullname; BZDB.set("saveAsMeshes", "0"); BZDB.set("saveFlatFile", "0"); BZDB.set("saveAsOBJ", "0"); if (World::getWorld()->writeWorld(filename->getString(), fullname)) { std::string newLabel = "World Saved: "; newLabel += fullname; status->setString(newLabel); } else { std::string newLabel = "Error Saving: "; newLabel += fullname; status->setString(newLabel); } } FontManager &fm = FontManager::instance(); const float statusWidth = fm.getStrLength(status->getFontFace(), status->getFontSize(), status->getString()); status->setPosition(0.5f * ((float)width - statusWidth), status->getY()); } void SaveWorldMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // use a big font for the body, bigger for the title const float titleFontSize = (float)_height / 18.0f; float fontSize = (float)_height / 36.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(title->getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(title->getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * ((float)_width - 0.75f * titleWidth); y -= 0.6f * 3 * titleHeight; const float h = fm.getStrHeight(listHUD[1]->getFontFace(), fontSize, " "); const int count = listHUD.size(); int i; for (i = 1; i < count-1; i++) { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); y -= 1.0f * h; } x = 100.0f; y -= 100.0f; listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SaveWorldMenu.h000066400000000000000000000021211200563112200203730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SAVEWORLDMENU_H__ #define __SAVEWORLDMENU_H__ // common - 1st #include "common.h" /* local interface headers */ #include "HUDDialog.h" #include "HUDuiDefaultKey.h" #include "HUDuiTypeIn.h" #include "HUDuiLabel.h" class SaveWorldMenu : public HUDDialog { public: SaveWorldMenu(); ~SaveWorldMenu(); HUDuiDefaultKey* getDefaultKey(); void execute(); void resize(int width, int height); private: HUDuiTypeIn* filename; HUDuiLabel* status; }; #endif /* __SAVEWORLDMENU_H__ */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SceneBuilder.cxx000066400000000000000000000506011200563112200205650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "SceneBuilder.h" // local implemenation headers #include "ZSceneDatabase.h" #include "BSPSceneDatabase.h" #include "World.h" // scene node implemenation headers #include "MeshPolySceneNode.h" #include "TankSceneNode.h" #include "BoxSceneNodeGenerator.h" #include "WallSceneNodeGenerator.h" #include "MeshSceneNodeGenerator.h" #include "BaseSceneNodeGenerator.h" #include "PyramidSceneNodeGenerator.h" #include "ObstacleSceneNodeGenerator.h" #include "TeleporterSceneNodeGenerator.h" #include "EighthDimShellNode.h" #include "EighthDBoxSceneNode.h" #include "EighthDPyrSceneNode.h" #include "EighthDBaseSceneNode.h" // common implementation headers #include "StateDatabase.h" #include "SceneRenderer.h" #include "BZDBCache.h" #include "TextureManager.h" #include "ObstacleList.h" #include "ObstacleMgr.h" // uncomment for cheaper eighth dimension scene nodes //#define SHELL_INSIDE_NODES // // SceneDatabaseBuilder // static const GLfloat black[3] = { 0.0f, 0.0f, 0.0f }; const GLfloat SceneDatabaseBuilder::wallColors[4][4] = { { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.4f, 0.4f, 0.4f, 1.0f }, { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.6f, 0.6f, 0.6f, 1.0f } }; const GLfloat SceneDatabaseBuilder::wallModulateColors[4][4] = { { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.4f, 0.4f, 0.4f, 1.0f }, { 0.5f, 0.5f, 0.5f, 1.0f }, { 0.6f, 0.6f, 0.6f, 1.0f } }; const GLfloat SceneDatabaseBuilder::wallLightedColors[1][4] = { { 0.5f, 0.5f, 0.5f, 1.0f } }; const GLfloat SceneDatabaseBuilder::wallLightedModulateColors[1][4] = { { 0.5f, 0.5f, 0.5f, 1.0f } }; const GLfloat SceneDatabaseBuilder::boxColors[6][4] = { { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.63f, 0.25f, 0.25f, 1.0f }, { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.75f, 0.375f, 0.375f, 1.0f }, { 0.875f, 0.5f, 0.5f, 1.0f }, { 0.275f, 0.2f, 0.2f, 1.0f } }; const GLfloat SceneDatabaseBuilder::boxModulateColors[6][4] = { { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.63f, 0.63f, 0.63f, 1.0f }, { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.69f, 0.69f, 0.69f, 1.0f }, { 0.875f, 0.875f, 0.875f, 1.0f }, { 0.375f, 0.375f, 0.375f, 1.0f } }; const GLfloat SceneDatabaseBuilder::boxLightedColors[6][4] = { { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.75f, 0.25f, 0.25f, 1.0f }, { 0.875f, 0.5f, 0.5f, 1.0f }, { 0.875f, 0.5f, 0.5f, 1.0f } }; const GLfloat SceneDatabaseBuilder::boxLightedModulateColors[6][4] = { { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.75f, 0.75f, 0.75f, 1.0f }, { 0.875f, 0.875f, 0.875f, 1.0f }, { 0.875f, 0.875f, 0.875f, 1.0f } }; const GLfloat SceneDatabaseBuilder::pyramidColors[5][4] = { { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.13f, 0.13f, 0.51f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.375f, 0.375f, 0.75f, 1.0f }, { 0.175f, 0.175f, 0.35f, 1.0f } }; const GLfloat SceneDatabaseBuilder::pyramidModulateColors[5][4] = { { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.13f, 0.13f, 0.51f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.375f, 0.375f, 0.75f, 1.0f }, { 0.175f, 0.175f, 0.35f, 1.0f } }; const GLfloat SceneDatabaseBuilder::pyramidLightedColors[5][4] = { { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f } }; const GLfloat SceneDatabaseBuilder::pyramidLightedModulateColors[5][4] = { { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f }, { 0.25f, 0.25f, 0.63f, 1.0f } }; const GLfloat SceneDatabaseBuilder::teleporterColors[3][4] = { { 1.0f, 0.875f, 0.0f, 1.0f }, { 0.9f, 0.8f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 0.5f } }; const GLfloat SceneDatabaseBuilder::teleporterModulateColors[3][4] = { { 1.0f, 1.0f, 1.0f, 1.0f }, { 0.9f, 0.9f, 0.9f, 1.0f }, { 0.0f, 0.0f, 0.0f, 0.5f } }; const GLfloat SceneDatabaseBuilder::teleporterLightedColors[3][4] = { { 1.0f, 0.875f, 0.0f, 1.0f }, { 1.0f, 0.875f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 0.5f } }; const GLfloat SceneDatabaseBuilder::teleporterLightedModulateColors[3][4] = { { 1.0f, 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 0.5f } }; SceneDatabaseBuilder::SceneDatabaseBuilder(const SceneRenderer* _renderer) : renderer(_renderer), wallMaterial(black, black, 0.0f), wallLOD(), boxMaterial(black, black, 0.0f), boxLOD(), pyramidMaterial(black, black, 0.0f), pyramidLOD(), baseLOD(), teleporterMaterial(black, black, 0.0f), teleporterLOD() { // FIXME -- should get texture heights from resources TextureManager &tm = TextureManager::instance(); // make styles -- first the outer wall int wallTexture = tm.getTextureID( "wall" ); wallTexWidth = wallTexHeight = 10.0f; if (wallTexture>=0) wallTexWidth = tm.GetAspectRatio(wallTexture) * wallTexHeight; // make box styles int boxTexture = tm.getTextureID( "boxwall" ); boxTexWidth = boxTexHeight = 0.2f * BZDB.eval(StateDatabase::BZDB_BOXHEIGHT); if (boxTexture>=0) boxTexWidth = tm.GetAspectRatio(boxTexture) * boxTexHeight; // lower maximum tank lod if lowdetail is true if (renderer->useQuality() == 0) TankSceneNode::setMaxLOD(2); } SceneDatabaseBuilder::~SceneDatabaseBuilder() { // do nothing } SceneDatabase* SceneDatabaseBuilder::make(const World* world) { // set LOD flags const bool doLODs = BZDBCache::lighting && BZDBCache::zbuffer; wallLOD = baseLOD = boxLOD = pyramidLOD = teleporterLOD = doLODs; // pick type of database SceneDatabase* db; if (BZDBCache::zbuffer) db = new ZSceneDatabase; else db = new BSPSceneDatabase; // FIXME -- when making BSP tree, try several shuffles for best tree if (!world) { return db; } // free any prior inside nodes world->freeInsideNodes(); // add nodes to database unsigned int i; const ObstacleList& walls = OBSTACLEMGR.getWalls(); for (i = 0; i < walls.size(); i++) { addWall(db, *((WallObstacle*) walls[i])); } const ObstacleList& boxes = OBSTACLEMGR.getBoxes(); for (i = 0; i < boxes.size(); i++) { addBox (db, *((BoxBuilding*) boxes[i])); } const ObstacleList& bases = OBSTACLEMGR.getBases(); for (i = 0; i < bases.size(); i++) { addBase (db, *((BaseBuilding*) bases[i])); } const ObstacleList& pyramids = OBSTACLEMGR.getPyrs(); for (i = 0; i < pyramids.size(); i++) { addPyramid (db, *((PyramidBuilding*) pyramids[i])); } const ObstacleList& teles = OBSTACLEMGR.getTeles(); for (i = 0; i < teles.size(); i++) { addTeleporter (db, *((Teleporter*) teles[i]), world); } const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); for (i = 0; i < meshes.size(); i++) { addMesh (db, (MeshObstacle*) meshes[i]); } // add the water level node addWaterLevel(db, world); db->finalizeStatics(); return db; } void SceneDatabaseBuilder::addWaterLevel(SceneDatabase* db, const World* world) { float plane[4] = { 0.0f, 0.0f, 1.0f, 0.0f }; const float level = world->getWaterLevel(); plane[3] = -level; // don't draw it if it isn't active if (level < 0.0f) { return; } // setup the vertex and texture coordinates float size = BZDBCache::worldSize; GLfloat3Array v(4); GLfloat3Array n(0); GLfloat2Array t(4); v[0][0] = v[0][1] = v[1][1] = v[3][0] = -size/2.0f; v[1][0] = v[2][0] = v[2][1] = v[3][1] = +size/2.0f; v[0][2] = v[1][2] = v[2][2] = v[3][2] = level; t[0][0] = t[0][1] = t[1][1] = t[3][0] = 0.0f; t[1][0] = t[2][0] = t[2][1] = t[3][1] = 2.0f; // get the material const BzMaterial* mat = world->getWaterMaterial(); const bool noRadar = mat->getNoRadar(); const bool noShadow = mat->getNoShadow(); MeshPolySceneNode* node = new MeshPolySceneNode(plane, noRadar, noShadow, v, n, t); // setup the material MeshSceneNodeGenerator::setupNodeMaterial(node, mat); db->addStaticNode(node, false); return; } void SceneDatabaseBuilder::addWall(SceneDatabase* db, const WallObstacle& o) { if (o.getHeight() <= 0.0f) { return; } int part = 0; WallSceneNode* node; ObstacleSceneNodeGenerator* nodeGen = new WallSceneNodeGenerator (&o); TextureManager &tm = TextureManager::instance(); int wallTexture = -1; bool useColorTexture = false; // try object, standard, then default if (o.userTextures[0].size()) wallTexture = tm.getTextureID(o.userTextures[0].c_str(),false); if (wallTexture < 0) wallTexture = tm.getTextureID( "wall" ); else useColorTexture = wallTexture >= 0; while ((node = nodeGen->getNextNode(o.getBreadth() / wallTexWidth, o.getHeight() / wallTexHeight, wallLOD))) { node->setColor(wallColors[part]); node->setModulateColor(wallModulateColors[part]); node->setLightedColor(wallLightedColors[0]); node->setLightedModulateColor(wallLightedModulateColors[0]); node->setMaterial(wallMaterial); node->setTexture(wallTexture); node->setUseColorTexture(useColorTexture); db->addStaticNode(node, false); part = (part + 1) % 5; } delete nodeGen; } void SceneDatabaseBuilder::addMesh(SceneDatabase* db, MeshObstacle* mesh) { WallSceneNode* node; MeshSceneNodeGenerator* nodeGen = new MeshSceneNodeGenerator (mesh); while ((node = nodeGen->getNextNode(wallLOD))) { // make the inside node const bool ownTheNode = db->addStaticNode(node, true); // The BSP can split a MeshPolySceneNode and then delete it, which is // not good for the EighthDimShellNode's referencing scheme. If the // BSP would have split and then deleted this node, ownTheNode will // return true, and the EighthDimShellNode will then own the node. EighthDimShellNode* inode = new EighthDimShellNode(node, ownTheNode); mesh->addInsideSceneNode(inode); } delete nodeGen; } void SceneDatabaseBuilder::addBox(SceneDatabase* db, BoxBuilding& o) { // this assumes boxes have six parts: four sides, a roof, and a bottom. int part = 0; WallSceneNode* node; ObstacleSceneNodeGenerator* nodeGen = new BoxSceneNodeGenerator(&o); TextureManager &tm = TextureManager::instance(); int boxTexture = -1; bool useColorTexture[2] = {false,false}; // try object, standard, then default if (o.userTextures[0].size()) boxTexture = tm.getTextureID(o.userTextures[0].c_str(),false); if (boxTexture < 0) boxTexture = tm.getTextureID(BZDB.get("boxWallTexture").c_str(),true); useColorTexture[0] = boxTexture >= 0; int boxTopTexture = -1; if (o.userTextures[1].size()) boxTopTexture = tm.getTextureID(o.userTextures[1].c_str(),false); if (boxTopTexture < 0) boxTopTexture = tm.getTextureID(BZDB.get("boxTopTexture").c_str(),true); useColorTexture[1] = boxTopTexture >= 0; float texutureFactor = BZDB.eval("boxWallTexRepeat"); if (renderer->useQuality() >= 2) texutureFactor = BZDB.eval("boxWallHighResTexRepeat"); while ((node = ((part < 4) ? nodeGen->getNextNode( -texutureFactor*boxTexWidth, -texutureFactor*boxTexWidth, boxLOD) : // I'm using boxTexHeight for roof since textures are same // size and this number is available nodeGen->getNextNode( -boxTexHeight, -boxTexHeight, boxLOD)))) { node->setColor(boxColors[part]); node->setModulateColor(boxModulateColors[part]); node->setLightedColor(boxLightedColors[part]); node->setLightedModulateColor(boxLightedModulateColors[part]); node->setMaterial(boxMaterial); if (part < 4){ node->setTexture(boxTexture); node->setUseColorTexture(useColorTexture[0]); } else{ node->setTexture(boxTopTexture); node->setUseColorTexture(useColorTexture[1]); } #ifdef SHELL_INSIDE_NODES const bool ownTheNode = db->addStaticNode(node, true); EighthDimShellNode* inode = new EighthDimShellNode(node, ownTheNode); o.addInsideSceneNode(inode); #else db->addStaticNode(node, false); #endif // SHELL_INSIDE_NODES part = (part + 1) % 6; } #ifndef SHELL_INSIDE_NODES // add the inside node GLfloat obstacleSize[3]; obstacleSize[0] = o.getWidth(); obstacleSize[1] = o.getBreadth(); obstacleSize[2] = o.getHeight(); SceneNode* inode = new EighthDBoxSceneNode(o.getPosition(), obstacleSize, o.getRotation()); o.addInsideSceneNode(inode); #endif // SHELL_INSIDE_NODES delete nodeGen; } void SceneDatabaseBuilder::addPyramid(SceneDatabase* db, PyramidBuilding& o) { // this assumes pyramids have four parts: four sides int part = 0; WallSceneNode* node; ObstacleSceneNodeGenerator* nodeGen = new PyramidSceneNodeGenerator(&o); TextureManager &tm = TextureManager::instance(); int pyramidTexture = -1; bool useColorTexture = false; // try object, standard, then default if (o.userTextures[0].size()) pyramidTexture = tm.getTextureID(o.userTextures[0].c_str(),false); if (pyramidTexture < 0) pyramidTexture = tm.getTextureID(BZDB.get("pyrWallTexture").c_str(),false); useColorTexture = pyramidTexture >= 0; // Using boxTexHeight since it's (currently) the same and it's already available float textureFactor = BZDB.eval("pyrWallTexRepeat"); if (renderer->useQuality() >= 2) textureFactor = BZDB.eval("pyrWallHighResTexRepeat"); while ((node = nodeGen->getNextNode(-textureFactor * boxTexHeight, -textureFactor * boxTexHeight, pyramidLOD))) { node->setColor(pyramidColors[part]); node->setModulateColor(pyramidModulateColors[part]); node->setLightedColor(pyramidLightedColors[part]); node->setLightedModulateColor(pyramidLightedModulateColors[part]); node->setMaterial(pyramidMaterial); node->setTexture(pyramidTexture); node->setUseColorTexture(useColorTexture); #ifdef SHELL_INSIDE_NODES const bool ownTheNode = db->addStaticNode(node, true); EighthDimShellNode* inode = new EighthDimShellNode(node, ownTheNode); o.addInsideSceneNode(inode); #else db->addStaticNode(node, false); #endif // SHELL_INSIDE_NODES part = (part + 1) % 5; } #ifndef SHELL_INSIDE_NODES // add the inside node GLfloat obstacleSize[3]; obstacleSize[0] = o.getWidth(); obstacleSize[1] = o.getBreadth(); obstacleSize[2] = o.getHeight(); SceneNode* inode = new EighthDPyrSceneNode(o.getPosition(), obstacleSize, o.getRotation()); o.addInsideSceneNode(inode); #endif // SHELL_INSIDE_NODES delete nodeGen; } void SceneDatabaseBuilder::addBase(SceneDatabase *db, BaseBuilding &o) { WallSceneNode* node; ObstacleSceneNodeGenerator* nodeGen = new BaseSceneNodeGenerator(&o); TextureManager &tm = TextureManager::instance(); int boxTexture = -1; bool useColorTexture[2] = {false,false}; // try object, standard, then default if (o.userTextures[0].size()) boxTexture = tm.getTextureID(o.userTextures[0].c_str(),false); if (boxTexture < 0) { std::string teamBase = Team::getImagePrefix((TeamColor)o.getTeam()); teamBase += BZDB.get("baseWallTexture"); boxTexture = tm.getTextureID(teamBase.c_str(),false); } if (boxTexture < 0) boxTexture = tm.getTextureID( BZDB.get("boxWallTexture").c_str() ); useColorTexture[0] = boxTexture >= 0; int baseTopTexture = -1; if (o.userTextures[1].size()) baseTopTexture = tm.getTextureID(o.userTextures[1].c_str(),false); if (baseTopTexture < 0) { std::string teamBase = Team::getImagePrefix((TeamColor)o.getTeam()); teamBase += BZDB.get("baseTopTexture").c_str(); baseTopTexture = tm.getTextureID(teamBase.c_str(),false); } if (baseTopTexture < 0) baseTopTexture = -1; else useColorTexture[1] = baseTopTexture >= 0; // this assumes bases have 6 parts - if they don't, it still works int part = 0; // repeat the textue once for the top and bottom, else use the old messed up way // There are 3 cases for the texture ordering: // 1. getNextNode() only returns the top texture // 2. getNextNode() returns the top texture(0), and the 4 sides(1-4) // 3. getNextNode() returns the top texture(0), and the 4 sides(1-4), and the bottom(5) while ((node = ( ((part % 5) == 0) ? nodeGen->getNextNode(1,1, boxLOD) : nodeGen->getNextNode(o.getBreadth(), o.getHeight(), boxLOD)))) { if ((part % 5) != 0) { node->setColor(boxColors[part - 2]); node->setModulateColor(boxModulateColors[part - 2]); node->setLightedColor(boxLightedColors[part - 2]); node->setLightedModulateColor(boxLightedModulateColors[part - 2]); node->setMaterial(boxMaterial); node->setTexture(boxTexture); node->setUseColorTexture(useColorTexture[0]); } else{ if (useColorTexture[1]) { // only set the texture if we have one and are using it node->setTexture(baseTopTexture); node->setUseColorTexture(useColorTexture[1]); } } part++; #ifdef SHELL_INSIDE_NODES const bool ownTheNode = db->addStaticNode(node, true); EighthDimShellNode* inode = new EighthDimShellNode(node, ownTheNode); o.addInsideSceneNode(inode); #else db->addStaticNode(node, false); #endif // SHELL_INSIDE_NODES } #ifndef SHELL_INSIDE_NODES // add the inside node GLfloat obstacleSize[3]; obstacleSize[0] = o.getWidth(); obstacleSize[1] = o.getBreadth(); obstacleSize[2] = o.getHeight(); SceneNode* inode = new EighthDBaseSceneNode(o.getPosition(), obstacleSize, o.getRotation()); o.addInsideSceneNode(inode); #endif // SHELL_INSIDE_NODES delete nodeGen; } void SceneDatabaseBuilder::addTeleporter(SceneDatabase* db, const Teleporter& o, const World* world) { // this assumes teleporters have fourteen parts: 12 border sides, 2 faces int part = 0; WallSceneNode* node; ObstacleSceneNodeGenerator* nodeGen = new TeleporterSceneNodeGenerator(&o); TextureManager &tm = TextureManager::instance(); int teleporterTexture = -1; bool useColorTexture = false; // try object, standard, then default if (o.userTextures[0].size()) teleporterTexture = tm.getTextureID(o.userTextures[0].c_str(),false); if (teleporterTexture < 0) teleporterTexture = tm.getTextureID(BZDB.get("cautionTexture").c_str(),true); useColorTexture = teleporterTexture >= 0; int numParts = o.isHorizontal() ? 18 : 14; while ((node = nodeGen->getNextNode(1.0, o.getHeight() / o.getBreadth(), teleporterLOD))) { if (o.isHorizontal ()) { if (part >= 0 && part <= 15) { node->setColor (teleporterColors[0]); node->setModulateColor (teleporterModulateColors[0]); node->setLightedColor (teleporterLightedColors[0]); node->setLightedModulateColor (teleporterLightedModulateColors[0]); node->setMaterial (teleporterMaterial); node->setTexture (teleporterTexture); node->setUseColorTexture (useColorTexture); } } else { if (part >= 0 && part <= 1) { node->setColor (teleporterColors[0]); node->setModulateColor (teleporterModulateColors[0]); node->setLightedColor (teleporterLightedColors[0]); node->setLightedModulateColor (teleporterLightedModulateColors[0]); node->setMaterial (teleporterMaterial); node->setTexture (teleporterTexture); node->setUseColorTexture (useColorTexture); } else if (part >= 2 && part <= 11) { node->setColor (teleporterColors[1]); node->setModulateColor (teleporterModulateColors[1]); node->setLightedColor (teleporterLightedColors[1]); node->setLightedModulateColor (teleporterLightedModulateColors[1]); node->setMaterial (teleporterMaterial); node->setTexture (teleporterTexture); node->setUseColorTexture (useColorTexture); } } db->addStaticNode(node, false); part = (part + 1) % numParts; } MeshPolySceneNode* linkNode; const BzMaterial* mat = world->getLinkMaterial(); linkNode = MeshSceneNodeGenerator::getMeshPolySceneNode(o.getBackLink()); MeshSceneNodeGenerator::setupNodeMaterial(linkNode, mat); db->addStaticNode(linkNode, false); linkNode = MeshSceneNodeGenerator::getMeshPolySceneNode(o.getFrontLink()); MeshSceneNodeGenerator::setupNodeMaterial(linkNode, mat); db->addStaticNode(linkNode, false); delete nodeGen; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SceneBuilder.h000066400000000000000000000055561200563112200202230ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * SceneDatabaseBuilder: * Encapsulates creation of display database */ #ifndef BZF_SCENE_BUILDER_H #define BZF_SCENE_BUILDER_H #include "common.h" #include "OpenGLMaterial.h" class SceneRenderer; class SceneDatabase; class WallObstacle; class MeshObstacle; class BoxBuilding; class PyramidBuilding; class BaseBuilding; class Teleporter; class World; class SceneDatabaseBuilder { public: SceneDatabaseBuilder(const SceneRenderer*); ~SceneDatabaseBuilder(); SceneDatabase* make(const World*); protected: void addWall(SceneDatabase*, const WallObstacle&); void addMesh(SceneDatabase*, MeshObstacle*); void addBox(SceneDatabase*, BoxBuilding&); void addPyramid(SceneDatabase*, PyramidBuilding&); void addBase(SceneDatabase*, BaseBuilding&); void addTeleporter(SceneDatabase*, const Teleporter&, const World*); void addWaterLevel(SceneDatabase*, const World*); private: // disallow duplication SceneDatabaseBuilder(const SceneDatabaseBuilder&); SceneDatabaseBuilder& operator=(const SceneDatabaseBuilder&); private: const SceneRenderer *renderer; OpenGLMaterial wallMaterial; float wallTexWidth, wallTexHeight; bool wallLOD; OpenGLMaterial boxMaterial; float boxTexWidth, boxTexHeight; bool boxLOD; OpenGLMaterial pyramidMaterial; bool pyramidLOD; bool baseLOD; OpenGLMaterial teleporterMaterial; bool teleporterLOD; static const GLfloat wallColors[4][4]; static const GLfloat wallModulateColors[4][4]; static const GLfloat wallLightedColors[1][4]; static const GLfloat wallLightedModulateColors[1][4]; static const GLfloat boxColors[6][4]; static const GLfloat boxModulateColors[6][4]; static const GLfloat boxLightedColors[6][4]; static const GLfloat boxLightedModulateColors[6][4]; static const GLfloat pyramidColors[5][4]; static const GLfloat pyramidModulateColors[5][4]; static const GLfloat pyramidLightedColors[5][4]; static const GLfloat pyramidLightedModulateColors[5][4]; static const GLfloat teleporterColors[3][4]; static const GLfloat teleporterModulateColors[3][4]; static const GLfloat teleporterLightedColors[3][4]; static const GLfloat teleporterLightedModulateColors[3][4]; }; #endif // BZF_SCENE_BUILDER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SceneRenderer.cxx000066400000000000000000000774211200563112200207560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* FIXME -- ugh.. the class header for this file is listed as a public header * and is used by other libs, yet this cxx is here.. bad bad bad. need to * decouple this file from the bzflag front-end specific sources so that it * may be moved elsewhere. */ // interface header #include "SceneRenderer.h" /* common implementation headers */ #include "SceneDatabase.h" #include "MainWindow.h" #include "DynamicColor.h" #include "TextureMatrix.h" #include "TankSceneNode.h" #include "StateDatabase.h" #include "TextUtils.h" #include "ParseColor.h" #include "BZDBCache.h" #include "MeshSceneNode.h" /* FIXME - local implementation dependancies */ #include "BackgroundRenderer.h" #include "LocalPlayer.h" #include "daylight.h" #include "World.h" #include "TrackMarks.h" static bool mapFog; static bool setupMapFog(); #ifdef GL_ABGR_EXT static int strrncmp(const char* s1, const char* s2, int num) { int len1 = strlen(s1) - 1; int len2 = strlen(s2) - 1; for (; len1 >= 0 && len2 >= 0 && num > 0; len1--, len2--, num--) { const int d = (int)s1[len1] - (int)s2[len2]; if (d != 0) return d; } return 0; } #endif // // FlareLight // FlareLight::FlareLight(const float* _pos, const float* _color) { pos[0] = _pos[0]; pos[1] = _pos[1]; pos[2] = _pos[2]; color[0] = _color[0]; color[1] = _color[1]; color[2] = _color[2]; } FlareLight::~FlareLight() { // do nothing } // // SceneRenderer // const GLint SceneRenderer::SunLight = 0; // also for the moon const float SceneRenderer::dimDensity = 0.75f; const GLfloat SceneRenderer::dimnessColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat SceneRenderer::blindnessColor[4] = { 1.0f, 1.0f, 0.0f, 1.0f }; /* initialize the singleton */ template <> SceneRenderer* Singleton::_instance = (SceneRenderer*)0; SceneRenderer::SceneRenderer() : window(NULL), blank(false), invert(false), sunBrightness(1.0f), scene(NULL), background(NULL), abgr(false), useQualityValue(2), useDepthComplexityOn(false), useWireframeOn(false), useHiddenLineOn(false), panelOpacity(0.3f), radarOpacity(0.3f), radarSize(4), maxMotionFactor(5), viewType(Normal), inOrder(false), depthRange(0), numDepthRanges(1), depthRangeSize(1.0), useDimming(false), canUseHiddenLine(false), exposed(true), lastFrame(true), sameFrame(false), needStyleUpdate(true), rebuildTanks(true), fogActive(false) { lightsSize = 4; lights = new OpenGLLight*[lightsSize]; lightsCount = 0; dynamicLights = 0; // init the track mark manager TrackMarks::init(); return; } void SceneRenderer::setWindow(MainWindow* _window) { window = _window; // get visual info window->getWindow()->makeCurrent(); GLint bits; if (!BZDB.isSet("zbuffer")) { // glGetIntegerv(GL_DEPTH_BITS, &bits); BZDB.set("zbuffer", "1"); } glGetIntegerv(GL_STENCIL_BITS, &bits); useStencilOn = (bits > 0); // see if abgr extention is available and system is known to be // faster with abgr. const char* vendor = (const char*)glGetString(GL_VENDOR); const char* renderer = (const char*)glGetString(GL_RENDERER); const char* version = (const char*)glGetString(GL_VERSION); const char* extensions = (const char*)glGetString(GL_EXTENSIONS); (void)vendor; (void)renderer; (void)version; (void)extensions; // silence g++ #ifdef GL_ABGR_EXT if ((extensions != NULL && strstr(extensions, "GL_EXT_abgr") != NULL) && (vendor != NULL && strcmp(vendor, "SGI") == 0)) { // old hardware is faster with ABGR. new hardware isn't. if ((renderer != NULL) && (strncmp(renderer, "GR1", 3) == 0 || strncmp(renderer, "VGX", 3) == 0 || strncmp(renderer, "LIGHT", 5) == 0 || strrncmp(renderer, "-XS", 3) == 0 || strrncmp(renderer, "-XSM", 4) == 0 || strrncmp(renderer, "-XS24", 5) == 0 || strrncmp(renderer, "-XS24-Z", 7) == 0 || strrncmp(renderer, "-XZ", 3) == 0 || strrncmp(renderer, "-Elan", 5) == 0 || strrncmp(renderer, "-Extreme", 8) == 0)) abgr = true; } #endif // can only do hidden line if polygon offset is available canUseHiddenLine = true; // prepare context with stuff that'll never change glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); glGetIntegerv(GL_MAX_LIGHTS, &maxLights); reservedLights = 1; // only one light between sun and moon maxLights -= reservedLights; // can't use the reserved lights // prepare sun setTimeOfDay(unixEpoch); // force nodes to update their styles notifyStyleChange(); } SceneRenderer::~SceneRenderer() { // free database delete scene; // free lights list delete[] lights; // kill the track manager TrackMarks::kill(); } bool SceneRenderer::useABGR() const { return abgr; } bool SceneRenderer::useStencil() const { return useStencilOn; } SceneRenderer::ViewType SceneRenderer::getViewType() const { return viewType; } void SceneRenderer::setZBufferSplit(bool on) { if (!on) { if (numDepthRanges != 1) { numDepthRanges = 1; depthRangeSize = 1.0; glDepthRange(0.0, 1.0); } } else { GLint bits; glGetIntegerv(GL_DEPTH_BITS, &bits); if (bits > 18) { // number of independent slices to split depth buffer into numDepthRanges = 1 << (bits - 18); // size of a single range depthRangeSize = 1.0 / (double)numDepthRanges; } else { numDepthRanges = 1; depthRangeSize = 1.0; } } } void SceneRenderer::setQuality(int value) { // 0 = Low // 1 = Medium // 2 = High // 3 = Experimental if (value < 0) { value = 0; } else if (value > BZDB.eval("maxQuality")) { value = (int)BZDB.eval("maxQuality"); } if (useQualityValue != value) { rebuildTanks = true; } useQualityValue = value; notifyStyleChange(); if (useQualityValue >= 1) { glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // GL_NICEST for polygon smoothing seems to make some drivers // cause massive slowdowns and "spikes" when drawing the radar glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); } else { glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST); } if (useQualityValue >= 2) TankSceneNode::setMaxLOD(-1); else if (useQualityValue >= 1) TankSceneNode::setMaxLOD(3); else TankSceneNode::setMaxLOD(2); if (useQualityValue >= 2) BZDB.set("flagChunks","32"); else if (useQualityValue >= 1) BZDB.set("flagChunks","12"); else BZDB.set("flagChunks","8"); if (useQualityValue >= 2) BZDB.set("moonSegments","64"); else if (useQualityValue >= 1) BZDB.set("moonSegments","24"); else BZDB.set("moonSegments","12"); if (useQualityValue > 0) { // this can be modified by OpenGLMaterial glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); } else { // OpenGLMaterial will not modify if (quality <= 0) glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); } // this setting helps keep those specular highlights // highlighting when applied to a dark textured surface. // It was mainlined in OpenGL Version 1.2 // (there's also the GL_EXT_separate_specular_color extension) #ifdef GL_LIGHT_MODEL_COLOR_CONTROL if (useQualityValue >= 1) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); else glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR); # else // in case someone includes at some point # ifdef GL_LIGHT_MODEL_COLOR_CONTROL_EXT if (useQualityValue >= 1) glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT, GL_SEPARATE_SPECULAR_COLOR_EXT); else glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT, GL_SINGLE_COLOR_EXT); # endif #endif BZDB.set("useQuality", TextUtils::format("%d", value)); } bool SceneRenderer::useDepthComplexity() const { return useDepthComplexityOn; } void SceneRenderer::setDepthComplexity(bool on) { if (on) { GLint bits; glGetIntegerv(GL_STENCIL_BITS, &bits); if (bits < 3) return; } useDepthComplexityOn = on; } void SceneRenderer::setRebuildTanks() { rebuildTanks = true; } void SceneRenderer::setupBackgroundMaterials() { if (background) { background->setupSkybox(); background->setupGroundMaterials(); } return; } void SceneRenderer::setWireframe(bool on) { useWireframeOn = on; } bool SceneRenderer::useWireframe() const { return useWireframeOn; } void SceneRenderer::setHiddenLine(bool on) { useHiddenLineOn = on && BZDBCache::zbuffer && canUseHiddenLine; if (!useHiddenLineOn) { depthRange = 0; return; } glPolygonOffset(1.0f, 2.0f); } bool SceneRenderer::useHiddenLine() const { return useHiddenLineOn; } void SceneRenderer::setPanelOpacity(float opacity) { bool needtoresize = opacity == 1.0f || panelOpacity == 1.0f; panelOpacity = opacity; notifyStyleChange(); if (needtoresize) { if (window) { window->setFullView(panelOpacity < 1.0f); window->getWindow()->callResizeCallbacks(); } } } void SceneRenderer::setRadarOpacity(float opacity) { radarOpacity = opacity; } float SceneRenderer::getPanelOpacity() const { return panelOpacity; } float SceneRenderer::getRadarOpacity() const { return radarOpacity; } void SceneRenderer::setRadarSize(int size) { radarSize = size; notifyStyleChange(); if (window) { window->getWindow()->callResizeCallbacks(); } } int SceneRenderer::getRadarSize() const { return radarSize; } void SceneRenderer::setMaxMotionFactor(int factor) { if (factor < -11) factor = -11; maxMotionFactor = factor; notifyStyleChange(); if (window) { window->getWindow()->callResizeCallbacks(); } } int SceneRenderer::getMaxMotionFactor() const { return maxMotionFactor; } void SceneRenderer::setDim(bool on) { useDimming = on; } void SceneRenderer::setViewType(ViewType _viewType) { viewType = _viewType; } void SceneRenderer::setExposed() { exposed = true; } void SceneRenderer::clearRadar(float opacity) { int size = window->getHeight() - window->getViewHeight(); float op = (opacity > 1.0f) ? 1.0f : (opacity < 0.0f) ? 0.0f : opacity; glScissor(window->getOriginX(), 0, size, size); glClearColor(0.0f, 0.0f, 0.0f, op); glClear(GL_COLOR_BUFFER_BIT); } void SceneRenderer::setSceneDatabase(SceneDatabase* db) { // update the styles needStyleUpdate = true; // free the current database delete scene; scene = db; if (scene) { inOrder = scene->isOrdered(); } else { inOrder = false; } // update the background materials setupBackgroundMaterials(); return; } void SceneRenderer::setBackground(BackgroundRenderer* br) { background = br; } void SceneRenderer::getGroundUV(const float p[2], float uv[2]) const { float repeat = 0.01f; if (BZDB.isSet("groundTexRepeat")) repeat = BZDB.eval("groundTexRepeat"); if (useQualityValue >= 3) repeat = BZDB.eval("groundHighResTexRepeat"); uv[0] = repeat * p[0]; uv[1] = repeat * p[1]; } void SceneRenderer::enableLight(int index, bool on) { OpenGLLight::enableLight(index + reservedLights, on); } void SceneRenderer::enableSun(bool on) { if (BZDBCache::lighting && sunOrMoonUp) { theSun.enableLight(SunLight, on); } } void SceneRenderer::setupSun() { if (BZDBCache::lighting && sunOrMoonUp) { theSun.execute(SunLight, BZDB.isTrue("lightLists")); } } void SceneRenderer::addLight(OpenGLLight& light) { // add a light, and grow the maximum list size if required lightsCount++; if (lightsCount > lightsSize) { OpenGLLight** newList = new OpenGLLight*[lightsSize * 2]; memcpy (newList, lights, lightsSize * sizeof(OpenGLLight*)); delete[] lights; lights = newList; lightsSize = lightsSize * 2; } lights[lightsCount - 1] = &light; return; } void SceneRenderer::addFlareLight(const float* pos, const float* color) { flareLightList.push_back(FlareLight(pos, color)); } int SceneRenderer::getNumLights() const { return dynamicLights; } int SceneRenderer::getNumAllLights() const { return lightsCount; } void SceneRenderer::clearLights() { lightsCount = 0; dynamicLights = 0; return; } void SceneRenderer::setTimeOfDay(double julianDay) { // get position of sun and moon at 0,0 lat/long float sunDir[3], moonDir[3]; float latitude, longitude; if (!BZDB.isTrue(StateDatabase::BZDB_SYNCLOCATION)) { // use local (client) settings latitude = BZDB.eval("latitude"); longitude = BZDB.eval("longitude"); } else { // server settings latitude = BZDB.eval(StateDatabase::BZDB_LATITUDE); longitude = BZDB.eval(StateDatabase::BZDB_LONGITUDE); } getSunPosition(julianDay, latitude, longitude, sunDir); getMoonPosition(julianDay, latitude, longitude, moonDir); ::getCelestialTransform(julianDay, latitude, longitude, celestialTransform); // set sun position if (sunDir[2] >= -0.009f) { // sun is our source of illumination sunOrMoonUp = true; theSun.setDirection(sunDir); } else if (moonDir[2] > -0.009f) { // moon is our source of illumination sunOrMoonUp = true; theSun.setDirection(moonDir); } else { // `the moon is down' (well, so is the sun, but that's not Shakespeare) // -- ambient only sunOrMoonUp = false; } // set sun and ambient colors ::getSunColor(sunDir, sunColor, ambientColor, sunBrightness); theSun.setColor(sunColor); GLfloat maxComponent = sunColor[0]; if (sunColor[1] > maxComponent) maxComponent = sunColor[1]; if (sunColor[2] > maxComponent) maxComponent = sunColor[2]; if (maxComponent <= 0.0f) maxComponent = 1.0f; sunScaledColor[0] = sunColor[0] / maxComponent; sunScaledColor[1] = sunColor[1] / maxComponent; sunScaledColor[2] = sunColor[2] / maxComponent; ambientColor[3] = 1.0f; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor); if (background) background->setCelestial(*this, sunDir, moonDir); } static int sortLights (const void* a, const void* b) { // the higher getImportance(), the closer it is to the beginning const OpenGLLight* lightA = *((const OpenGLLight**) a); const OpenGLLight* lightB = *((const OpenGLLight**) b); const float valA = lightA->getImportance(); const float valB = lightB->getImportance(); // first sort by cull if (valA < 0.0f) { if (valB >= 0.0f) { return +1; } else { return 0; } } if (valB < 0.0f) { if (valA >= 0.0f) { return -1; } else { return 0; } } // sort by grounded state const bool groundedA = lightA->getOnlyGround(); const bool groundedB = lightB->getOnlyGround(); if (groundedA && !groundedB) { return +1; } if (!groundedA && groundedB) { return -1; } // sort by importance if (valA > valB) { return -1; } else { return +1; } } void SceneRenderer::render(bool _lastFrame, bool _sameFrame, bool fullWindow) { lastFrame = _lastFrame; sameFrame = _sameFrame; triangleCount = 0; RenderNode::resetTriangleCount(); if (background) { background->resetTriangleCount(); } // update the SceneNode, Background, and TrackMark styles if (needStyleUpdate) { if (scene) { scene->updateNodeStyles(); } if (background) { background->notifyStyleChange(); } TrackMarks::notifyStyleChange(); needStyleUpdate = false; } if (rebuildTanks) { TankGeometryMgr::deleteLists(); TankGeometryMgr::buildLists(); rebuildTanks = false; } // update the dynamic colors DYNCOLORMGR.update(); // update the texture matrices TEXMATRIXMGR.update(); // make sure there is something to render on if (!window) { return; } // setup the viewport LOD scale MeshSceneNode::setLodScale(window->getWidth(), frustum.getFOVx(), window->getViewHeight(), frustum.getFOVy()); { const int pixelsX = window->getWidth(); const int pixelsY = window->getViewHeight(); const float fovx = frustum.getFOVx(); const float fovy = frustum.getFOVy(); const float lppx = 2.0f * sinf(fovx * 0.5f) / (float)pixelsX; const float lppy = 2.0f * sinf(fovy * 0.5f) / (float)pixelsY; const float lpp = (lppx < lppy) ? lppx : lppy; lengthPerPixel = lpp * BZDB.eval("lodScale"); } // get the track mark sceneNodes (only for BSP) if (scene) { TrackMarks::addSceneNodes(scene); } // turn on fog for teleporter blindness if close to a teleporter teleporterProximity = 0.0f; if (!blank && LocalPlayer::getMyTank() && (LocalPlayer::getMyTank()->getTeam() != ObserverTeam)) { teleporterProximity = LocalPlayer::getMyTank()->getTeleporterProximity(); } // fog setup mapFog = setupMapFog(); mirror = (BZDB.get(StateDatabase::BZDB_MIRROR) != "none") && BZDB.isTrue("userMirror"); clearZbuffer = true; drawGround = true; if (mirror) { drawGround = false; // flip for the reflection drawing frustum.flipVertical(); glFrontFace(GL_CW); // different occluders for the mirror if (scene) { scene->setOccluderManager(1); } // the reflected scene renderScene(_lastFrame, _sameFrame, fullWindow); // different occluders for the mirror if (scene) { scene->setOccluderManager(0); } // flip back frustum.flipVertical(); glFrontFace(GL_CCW); float mirrorColor[4]; if (!parseColorString(BZDB.get(StateDatabase::BZDB_MIRROR), mirrorColor)) { mirrorColor[0] = mirrorColor[1] = mirrorColor[2] = 0.0f; mirrorColor[3] = 0.5f; } else if (mirrorColor[3] == 1.0f) { // probably a mistake mirrorColor[3] = 0.5f; } if (invert) { mirrorColor[0] = 1.0f - mirrorColor[0]; mirrorColor[2] = 1.0f - mirrorColor[2]; mirrorColor[3] = 0.2f; } // darken the reflection if (!mapFog) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // if low quality then use stipple -- it's probably much faster if (BZDBCache::blend && (useQualityValue >= 1)) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4fv(mirrorColor); glRectf(-1.0f, -1.0f, +1.0f, +1.0f); glDisable(GL_BLEND); } else { float stipple = mirrorColor[3]; glColor3fv(mirrorColor); OpenGLGState::setStipple(stipple); glEnable(GL_POLYGON_STIPPLE); glRectf(-1.0f, -1.0f, +1.0f, +1.0f); glDisable(GL_POLYGON_STIPPLE); } } else { // need the proper matrices for fog generation // if low quality then use stipple -- it's probably much faster frustum.executeView(); frustum.executeProjection(); const float extent = BZDBCache::worldSize * 10.0f; if (BZDBCache::blend && (useQualityValue >= 1)) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4fv(mirrorColor); glRectf(-extent, -extent, +extent, +extent); glDisable(GL_BLEND); } else { float stipple = mirrorColor[3]; glColor3fv(mirrorColor); OpenGLGState::setStipple(stipple); glEnable(GL_POLYGON_STIPPLE); glRectf(-extent, -extent, +extent, +extent); glDisable(GL_POLYGON_STIPPLE); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } clearZbuffer = false; } // the real scene renderScene(_lastFrame, _sameFrame, fullWindow); // finalize dimming if (mapFog) { glDisable(GL_FOG); } renderDimming(); triangleCount = RenderNode::getTriangleCount(); if (background) { triangleCount += background->getTriangleCount(); } return; } void SceneRenderer::renderScene(bool UNUSED(_lastFrame), bool UNUSED(_sameFrame), bool fullWindow) { int i; const bool lightLists = BZDB.isTrue("lightLists"); // avoid OpenGL calls as long as possible -- there's a good // chance we're waiting on the vertical retrace. // get a list of the dynamic lights getLights(); // get the obstacle sceneNodes and shadowNodes getRenderNodes(); // prepare transforms // note -- lights should not be positioned before view is set frustum.executeDeepProjection(); glPushMatrix(); frustum.executeView(); // turn sunlight on -- the ground needs it if (BZDBCache::lighting && sunOrMoonUp) { theSun.execute(SunLight, lightLists); theSun.enableLight(SunLight, true); } // set scissor glScissor(window->getOriginX(), window->getOriginY() + window->getHeight() - window->getViewHeight(), window->getWidth(), window->getViewHeight()); if (useDepthComplexityOn) { if (BZDBCache::stencilShadows) { BZDB.set("stencilShadows", "0"); } glEnable(GL_STENCIL_TEST); if (!mirror || (clearZbuffer)) { glClear(GL_STENCIL_BUFFER_BIT); } glStencilFunc(GL_ALWAYS, 0, 0xf); glStencilOp(GL_KEEP, GL_INCR, GL_INCR); } if (useHiddenLineOn) { if (!mirror || (clearZbuffer)) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); } else if (useWireframeOn) { if (!mirror || (clearZbuffer)) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } // prepare z buffer if (BZDBCache::zbuffer) { if (sameFrame && ++depthRange == numDepthRanges) { depthRange = 0; } if (exposed || useHiddenLineOn || --depthRange < 0) { depthRange = numDepthRanges - 1; if (clearZbuffer) { glClear(GL_DEPTH_BUFFER_BIT); } exposed = false; } if (!sameFrame && numDepthRanges != 1) { if (useHiddenLineOn) { glDepthRange(0.0, 1.0); } else { GLclampd x_near = (GLclampd)depthRange * depthRangeSize; glDepthRange(x_near, x_near + depthRangeSize); } } } // draw start of background (no depth testing) OpenGLGState::resetState(); if (background) { background->setBlank(blank); background->setInvert(invert); const bool avoidSkyFog = (mapFog && BZDB.isTrue("_fogNoSky")); if (avoidSkyFog) { glDisable(GL_FOG); background->renderSky(*this, fullWindow, mirror); glEnable(GL_FOG); } else { background->renderSky(*this, fullWindow, mirror); } if (drawGround) { background->renderGround(*this, fullWindow); } } // prepare the other lights but don't turn them on yet -- // we may need to turn them on when drawing the background. if (BZDBCache::lighting) { for (i = 0; i < dynamicLights; i++) { lights[i]->execute(i + reservedLights, lightLists); } } // draw rest of background // (ground grid, shadows, fake shot lights, mountains, clouds) if (background) { background->renderGroundEffects(*this, mirror && clearZbuffer); } if (!blank) { if (BZDBCache::lighting) { // now turn on the remaining lights for (i = 0; i < dynamicLights; i++) { OpenGLLight::enableLight(i + reservedLights, true); } } frustum.executeProjection(); if (BZDBCache::zbuffer) { glEnable(GL_DEPTH_TEST); } if (useHiddenLineOn) { glEnable(GL_POLYGON_OFFSET_FILL); } /////////////////////// // THE BIG RENDERING // /////////////////////// doRender(); if (scene && BZDBCache::showCullingGrid) { scene->drawCuller(); } const World* world = World::getWorld(); if (scene && BZDBCache::showCollisionGrid && (world != NULL)) { world->drawCollisionGrid(); } if (useHiddenLineOn) { glDisable(GL_POLYGON_OFFSET_FILL); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); doRender(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } OpenGLGState::resetState(); // shut off lights if (BZDBCache::lighting) { theSun.enableLight(SunLight, false); for (i = 0; i < dynamicLights; i++) { OpenGLLight::enableLight(i + reservedLights, false); } } if (BZDBCache::zbuffer) { glDisable(GL_DEPTH_TEST); } // FIXME -- must do post-rendering: flare lights, etc. // flare lights are in world coordinates. trace ray to that world // position and calculate opacity. if opaque then don't render // flare, otherwise modulate input color by opacity and draw a // billboard texture (constant size in screen space). } // back to original state if (!useHiddenLineOn && useWireframeOn) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } glPopMatrix(); // do depth complexity if (useDepthComplexityOn) { renderDepthComplexity(); } return; } void SceneRenderer::doRender() { const bool mirrorPass = (mirror && clearZbuffer); // render the ground tank tracks if (!mirrorPass) { TrackMarks::renderGroundTracks(); } // NOTE -- this should go into a separate thread // now draw each render node list OpenGLGState::renderLists(); // render the environmental conditions if (background) { // do not update for the second mirror pass background->renderEnvironment(*this, !mirror || clearZbuffer); } // draw all the stuff in the ordered list. turn // off depth buffer updates for potentially transparent stuff. glDepthMask(GL_FALSE); orderedList.render(); glDepthMask(GL_TRUE); // render the ground tank tracks if (!mirrorPass) { TrackMarks::renderObstacleTracks(); } return; } static bool setupMapFog() { RENDERER.setFogActive(false); if (BZDB.get(StateDatabase::BZDB_FOGMODE) == "none") { glDisable(GL_FOG); glHint(GL_FOG_HINT, GL_FASTEST); return false; } RENDERER.setFogActive(true); GLenum fogMode = GL_EXP; GLfloat fogDensity = 0.001f; GLfloat fogStart = 0.5f * BZDBCache::worldSize; GLfloat fogEnd = BZDBCache::worldSize; GLfloat fogColor[4] = {0.25f, 0.25f, 0.25f, 0.25f}; // parse the values; const std::string modeStr = BZDB.get("_fogMode"); if (modeStr == "linear") { fogMode = GL_LINEAR; } else if (modeStr == "exp") { fogMode = GL_EXP; } else if (modeStr == "exp2") { fogMode = GL_EXP2; } else { fogMode = GL_EXP; } fogDensity = BZDB.eval(StateDatabase::BZDB_FOGDENSITY); fogStart = BZDB.eval(StateDatabase::BZDB_FOGSTART); fogEnd = BZDB.eval(StateDatabase::BZDB_FOGEND); if (!parseColorString(BZDB.get(StateDatabase::BZDB_FOGCOLOR), fogColor)) { fogColor[0] = fogColor[1] = fogColor[2] = 0.1f; fogColor[3] = 0.0f; // has no effect } if (BZDB.evalInt("fogEffect") >= 1) { glHint(GL_FOG_HINT, GL_NICEST); } else { glHint(GL_FOG_HINT, GL_FASTEST); } // setup GL fog glFogi(GL_FOG_MODE, fogMode); glFogf(GL_FOG_DENSITY, fogDensity); glFogf(GL_FOG_START, fogStart); glFogf(GL_FOG_END, fogEnd); glFogfv(GL_FOG_COLOR, fogColor); glEnable(GL_FOG); RENDERER.setFogColor(fogColor); return true; } void SceneRenderer::renderDimming() { float density = 0.0f; const GLfloat* color = NULL; if (useDimming) { color = dimnessColor; density = dimDensity; } else if (teleporterProximity > 0.0f) { color = blindnessColor; density = (teleporterProximity > 0.75f) ? 1.0f : teleporterProximity / 0.75f; } if (density > 0.0f && color != NULL) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glColor4f(color[0], color[1], color[2], density); // if low quality then use stipple -- it's probably much faster if (BZDBCache::blend && (useQualityValue >= 1)) { glEnable(GL_BLEND); glRectf(-1.0f, -1.0f, 1.0f, 1.0f); glDisable(GL_BLEND); } else { OpenGLGState::setStipple(density); glEnable(GL_POLYGON_STIPPLE); glRectf(-1.0f, -1.0f, 1.0f, 1.0f); glDisable(GL_POLYGON_STIPPLE); } } return; } void SceneRenderer::renderDepthComplexity() { static const GLfloat depthColors[][3] = { { 0.0f, 0.0f, 0.0f }, // black -- 0 times { 0.5f, 0.0f, 1.0f }, // purple -- 1 time { 0.0f, 0.0f, 1.0f }, // blue -- 2 times { 0.0f, 1.0f, 1.0f }, // cyan -- 3 times { 0.0f, 1.0f, 0.0f }, // green -- 4 times { 1.0f, 1.0f, 0.0f }, // yellow -- 5 times { 1.0f, 0.5f, 0.0f }, // orange -- 6 times { 1.0f, 0.0f, 0.0f } // red -- 7 or more }; static const int numColors = countof(depthColors); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); for (int i = 0; i < numColors; i++) { glStencilFunc(i == numColors - 1 ? GL_LEQUAL : GL_EQUAL, i, 0xf); glColor3fv(depthColors[i]); glRectf(-1.0f, -1.0f, 1.0f, 1.0f); } glDisable(GL_STENCIL_TEST); return; } void SceneRenderer::getRenderNodes() { // get the nodes to draw if (!blank) { // empty the render node lists in preparation for the next frame OpenGLGState::clearLists(); orderedList.clear(); shadowList.clear(); flareLightList.clear(); // make the lists of render nodes sorted in optimal rendering order if (scene) { scene->addRenderNodes(*this); } // sort ordered list in reverse depth order if (!inOrder) { orderedList.sort(frustum.getEye()); } // add the shadow rendering nodes if (scene && BZDBCache::shadows && !BZDB.isTrue(StateDatabase::BZDB_NOSHADOWS) && (!mirror || !clearZbuffer)) { scene->addShadowNodes(*this); } } return; } void SceneRenderer::getLights() { // get the important lights in the scene if (!sameFrame) { lightsCount = 0; dynamicLights = 0; if (scene && !blank && BZDBCache::lighting) { // get the potential dynamic lights scene->addLights(*this); // calculate the light importances int i; for (i = 0; i < lightsCount; i++) { lights[i]->calculateImportance(frustum); } // sort by cull state, grounded state, and importance qsort (lights, lightsCount, sizeof(OpenGLLight*), sortLights); // count the unculled valid lights and potential dynamic lights // (negative values indicate culled lights) int unculledCount = 0; for (i = 0; i < lightsCount; i++) { // any value below 0.0f is culled if (lights[i]->getImportance() >= 0.0f) { unculledCount++; if (!lights[i]->getOnlyGround()) { dynamicLights++; } } } // set the total light count to the number of unculled lights lightsCount = unculledCount; // limit the dynamic OpenGL light count if (dynamicLights > maxLights) { dynamicLights = maxLights; } } } return; } void SceneRenderer::disableLights(const float mins[3], const float maxs[3]) { // temporarily turn off non-applicable lights for big meshes for (int i = 0; i < dynamicLights; i++) { const float* pos = lights[i]->getPosition(); const float dist = lights[i]->getMaxDist(); if ((pos[0] < (mins[0] - dist)) || (pos[0] > (maxs[0] + dist)) || (pos[1] < (mins[1] - dist)) || (pos[1] > (maxs[1] + dist)) || (pos[2] < (mins[2] - dist)) || (pos[2] > (maxs[2] + dist))) { lights[i]->enableLight(i + reservedLights, false); } } return; } void SceneRenderer::reenableLights() { // reenable the disabled lights for (int i = 0; i < dynamicLights; i++) { lights[i]->enableLight(i + reservedLights, true); } return; } void SceneRenderer::notifyStyleChange() { needStyleUpdate = true; return; } const RenderNodeList& SceneRenderer::getShadowList() const { return shadowList; } const GLfloat* SceneRenderer::getSunDirection() const { if (background) { return background->getSunDirection(); } else { return NULL; } } const Extents* SceneRenderer::getVisualExtents() const { if (scene) { return scene->getVisualExtents(); } else { return NULL; } } int SceneRenderer::getFrameTriangleCount() const { return triangleCount; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ScoreboardRenderer.cxx000066400000000000000000000624711200563112200220030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ScoreboardRenderer.h" /* common implementation headers */ #include "Bundle.h" #include "Team.h" #include "FontManager.h" #include "BZDBCache.h" #include "OpenGLGState.h" #include "TextUtils.h" #include "TimeKeeper.h" /* local implementation headers */ #include "LocalPlayer.h" #include "World.h" #include "sound.h" // because of the 'player' crap, we can't #include "Roaming.h" easily extern Player* getRoamTargetTank(); #define DEBUG_SHOWRATIOS 1 std::string ScoreboardRenderer::scoreSpacingLabel("88% 8888 888-888 [88]"); std::string ScoreboardRenderer::scoreLabel("Score"); std::string ScoreboardRenderer::killSpacingLabel("888~888 Hunt->"); std::string ScoreboardRenderer::killLabel(" Kills"); std::string ScoreboardRenderer::teamScoreSpacingLabel("88 (888-888) 88"); std::string ScoreboardRenderer::teamCountSpacingLabel("888"); std::string ScoreboardRenderer::playerLabel("Player"); // NOTE: order of sort labels must match SORT_ consts const char* ScoreboardRenderer::sortLabels[] = { "[Score]", "[Normalized Score]", "[Callsign]", "[Team Kills]", "[TK ratio]", "[Team]", "[1on1]", NULL }; int ScoreboardRenderer::sortMode = 0; bool ScoreboardRenderer::alwaysShowTeamScore = 0; ScoreboardRenderer::ScoreboardRenderer() : winX(), winY(), winWidth (0.0), winHeight(), dim(false), huntIndicator(false), huntPosition(0), huntSelectEvent(false), huntPositionEvent(0), huntState(HUNT_NONE), huntAddMode(false), teamScoreYVal(0.0f), roaming(false), minorFontFace(), minorFontSize(), labelsFontFace(), labelsFontSize(), scoreLabelWidth(), killsLabelWidth(), teamScoreLabelWidth(), teamCountLabelWidth(), huntArrowWidth(), huntPlusesWidth(), huntedArrowWidth(), tkWarnRatio(), numHunted(0) { // initialize message color (white) messageColor[0] = 1.0f; messageColor[1] = 1.0f; messageColor[2] = 1.0f; sortMode = BZDB.getIntClamped("scoreboardSort", 0, SORT_MAXNUM); alwaysShowTeamScore = (BZDB.getIntClamped("alwaysShowTeamScore", 0, 1) != 0); } /* Set window size and location to be used to render the scoreboard. * Values are relative to .... when render() is invoked. */ void ScoreboardRenderer::setWindowSize (float x, float y, float width, float height) { winX = x; winY = y; winWidth = width; winHeight = height; setMinorFontSize (winHeight); setLabelsFontSize (winHeight); } ScoreboardRenderer::~ScoreboardRenderer() { // no destruction needed } const char **ScoreboardRenderer::getSortLabels () { return sortLabels; } void ScoreboardRenderer::setSort (int _sortby) { sortMode = _sortby; BZDB.setInt ("scoreboardSort", sortMode); } int ScoreboardRenderer::getSort () { return sortMode; } void ScoreboardRenderer::setAlwaysTeamScore (bool _onoff) { alwaysShowTeamScore = _onoff; BZDB.set ("alwaysShowTeamScores", _onoff ? "1" : "0"); } bool ScoreboardRenderer::getAlwaysTeamScore () { return alwaysShowTeamScore; } void ScoreboardRenderer::setMinorFontSize(float height) { FontManager &fm = FontManager::instance(); minorFontFace = fm.getFaceID(BZDB.get("consoleFont")); switch (static_cast(BZDB.eval("scorefontsize"))) { case 0: { // auto const float s = height / 72.0f; minorFontSize = floorf(s); break; } case 1: // tiny minorFontSize = 6; break; case 2: // small minorFontSize = 8; break; case 3: // medium minorFontSize = 12; break; case 4: // big minorFontSize = 16; break; } huntArrowWidth = fm.getStrLength(minorFontFace, minorFontSize, "->"); huntPlusesWidth = fm.getStrLength(minorFontFace, minorFontSize, "@>"); huntedArrowWidth = fm.getStrLength(minorFontFace, minorFontSize, "Hunt->"); scoreLabelWidth = fm.getStrLength(minorFontFace, minorFontSize, scoreSpacingLabel); killsLabelWidth = fm.getStrLength(minorFontFace, minorFontSize, killSpacingLabel); teamScoreLabelWidth = fm.getStrLength(minorFontFace, minorFontSize, teamScoreSpacingLabel); teamCountLabelWidth = fm.getStrLength(minorFontFace, minorFontSize, teamCountSpacingLabel); const float spacing = fm.getStrLength(minorFontFace, minorFontSize, " "); scoreLabelWidth += spacing; killsLabelWidth += spacing; } void ScoreboardRenderer::setLabelsFontSize(float height) { const float s = height / 96.0f; FontManager &fm = FontManager::instance(); labelsFontFace = fm.getFaceID(BZDB.get("consoleFont")); labelsFontSize = floorf(s); } void ScoreboardRenderer::setDim(bool _dim) { dim = _dim; } static const float dimFactor = 0.2f; void ScoreboardRenderer::hudColor3fv(const GLfloat* c) { if (dim) glColor3f(dimFactor * c[0], dimFactor * c[1], dimFactor * c[2]); else glColor3fv(c); } void ScoreboardRenderer::exitSelectState (void){ playLocalSound(SFX_HUNT_SELECT); if (numHunted > 0) { setHuntState(HUNT_ENABLED); } else { setHuntState(HUNT_NONE); } } void ScoreboardRenderer::render(bool forceDisplay) { FontManager &fm = FontManager::instance(); if (dim) { fm.setOpacity(dimFactor); } if (BZDB.isTrue("displayScore") || forceDisplay){ OpenGLGState::resetState(); renderScoreboard(); } else { if (getHuntState() == HUNT_SELECTING){ // 'S' pressed while selecting ... exitSelectState (); } if (BZDB.isTrue("alwaysShowTeamScores") && World::getWorld()->allowTeams()){ OpenGLGState::resetState(); renderTeamScores(winWidth, winY, FontManager::instance().getStrHeight(minorFontFace, minorFontSize, " ")); } } if (dim) { fm.setOpacity(1.0f); } } int ScoreboardRenderer::teamScoreCompare(const void* _c, const void* _d) { Team* c = World::getWorld()->getTeams()+*(int*)_c; Team* d = World::getWorld()->getTeams()+*(int*)_d; return (d->getWins()-d->getLosses()) - (c->getWins()-c->getLosses()); } // invoked by playing.cxx when 'prev' is pressed void ScoreboardRenderer::setHuntPrevEvent() { huntPositionEvent = -1; --huntPosition; } // invoked by playing.cxx when 'next' is pressed void ScoreboardRenderer::setHuntNextEvent() { huntPositionEvent = 1; ++huntPosition; } // invoked by playing.cxx when select (fire) is pressed void ScoreboardRenderer::setHuntSelectEvent () { huntSelectEvent = true; } // invoked by clientCommands.cxx when '7' or 'U' is pressed void ScoreboardRenderer::huntKeyEvent (bool isAdd) { if (getHuntState() == HUNT_ENABLED) { if (isAdd) { setHuntState(HUNT_SELECTING); playLocalSound(SFX_HUNT_SELECT); } else { setHuntState(HUNT_NONE); playLocalSound(SFX_HUNT); } huntAddMode = isAdd; } else if (getHuntState() == HUNT_SELECTING) { exitSelectState (); } else { setHuntState(HUNT_SELECTING); playLocalSound(SFX_HUNT_SELECT); huntAddMode = isAdd; if (!BZDB.isTrue("displayScore")) BZDB.set("displayScore", "1"); } } void ScoreboardRenderer::setHuntState (int _huntState) { if (huntState == _huntState) return; if (_huntState != HUNT_SELECTING) huntAddMode = false; if (_huntState==HUNT_NONE){ clearHuntedTanks(); } else if (_huntState==HUNT_SELECTING) { huntPosition = 0; } huntState = _huntState; } int ScoreboardRenderer::getHuntState() const { return huntState; } // invoked when joining a server void ScoreboardRenderer::huntReset() { huntState = HUNT_NONE; numHunted = 0; } void ScoreboardRenderer::renderTeamScores (float x, float y, float dy){ // print teams sorted by score int teams[NumTeams]; int teamCount = 0; int i; float xn, xl; std::string label; if (teamScoreYVal > 0.0) y = teamScoreYVal; if (World::getWorld()->allowRabbit()) return; Bundle *bdl = BundleMgr::getCurrentBundle(); FontManager &fm = FontManager::instance(); hudColor3fv(messageColor); label = bdl->getLocalString("Team Score"); xl = xn = x - teamScoreLabelWidth; fm.drawString(xl, y, 0, minorFontFace, minorFontSize, label); for (i = RedTeam; i < NumTeams; i++) { if (!Team::isColorTeam(TeamColor(i))) continue; const Team* team = World::getWorld()->getTeams() + i; if (team->size == 0) continue; teams[teamCount++] = i; } qsort(teams, teamCount, sizeof(int), teamScoreCompare); y -= dy; char score[44]; for (i = 0 ; i < teamCount; i++){ Team& team = World::getWorld()->getTeam(teams[i]); sprintf(score, "%3d (%3d-%-3d) %3d", team.getWins() - team.getLosses(), team.getWins(), team.getLosses(), team.size); hudColor3fv(Team::getRadarColor((TeamColor)teams[i])); fm.drawString(xn, y, 0, minorFontFace, minorFontSize, score); y -= dy; } } // not used yet - new feature coming void ScoreboardRenderer::renderCtfFlags (){ int i; RemotePlayer* player; const int curMaxPlayers = World::getWorld()->getCurMaxPlayers(); char flagColor[200]; FontManager &fm = FontManager::instance(); const float x = winX; const float y = winY; const float dy = fm.getStrHeight(minorFontFace, minorFontSize, " "); float y0 = y - dy; hudColor3fv(messageColor); fm.drawString(x, y, 0, minorFontFace, minorFontSize, "Team Flags"); fm.setDimFactor(dimFactor); for (i=0; i < curMaxPlayers; i++) { if ((player = World::getWorld()->getPlayer(i))) { FlagType* flagd = player->getFlag(); TeamColor teamIndex = player->getTeam(); if (flagd!=Flags::Null && flagd->flagTeam != NoTeam) { // if player has team flag ... std::string playerInfo = ColorStrings[flagd->flagTeam]; snprintf(flagColor, 200, "%-12s", flagd->flagName.c_str()); playerInfo += flagColor; playerInfo += ColorStrings[teamIndex]; playerInfo += player->getCallSign(); fm.drawString(x, y0, 0, minorFontFace, minorFontSize, playerInfo); y0 -= dy; } } } renderTeamScores (winWidth, y, dy); } void ScoreboardRenderer::clearHuntedTanks () { World *world = World::getWorld(); if (!world) return; const int curMaxPlayers = world->getCurMaxPlayers(); Player *p; for (int i=0; igetPlayer(i))) p->setHunted (false); } numHunted = 0; } void ScoreboardRenderer::renderScoreboard(void) { int i=0; int numPlayers; int mottoLen; Player** players; Player* player; bool haveObs = false; if ( (players = newSortedList (sortMode, true, &numPlayers)) == NULL) return; LocalPlayer* myTank = LocalPlayer::getMyTank(); Bundle *bdl = BundleMgr::getCurrentBundle(); FontManager &fm = FontManager::instance(); const float x1 = winX; const float x2 = x1 + scoreLabelWidth; const float x3 = x2 + killsLabelWidth; const float y0 = winY; hudColor3fv(messageColor); std::string psLabel = bdl->getLocalString(playerLabel); if (sortMode != SORT_SCORE){ psLabel += " "; psLabel += sortLabels[sortMode]; } fm.drawString(x1, y0, 0, minorFontFace, minorFontSize, bdl->getLocalString(scoreLabel)); fm.drawString(x2, y0, 0, minorFontFace, minorFontSize, bdl->getLocalString(killLabel)); fm.drawString(x3, y0, 0, minorFontFace, minorFontSize, psLabel); const float dy = fm.getStrHeight(minorFontFace, minorFontSize, " "); float y = y0 - dy; // make room for the status marker const float xs = x3 - fm.getStrLength(minorFontFace, minorFontSize, "+|"); if (huntState == HUNT_SELECTING){ std::string huntStr = ColorStrings[YellowColor]; huntStr += ColorStrings[PulsatingColor]; huntStr += " *SEL*"; fm.drawString(xs - huntedArrowWidth, y0, 0, minorFontFace, minorFontSize, huntStr); } // grab the tk warning ratio tkWarnRatio = BZDB.eval("tkwarnratio"); if (huntState == HUNT_SELECTING){ if (numPlayers<1 || (numPlayers==1 && players[0]==myTank)){ setHuntState (HUNT_NONE); } else { if (players[huntPosition] == myTank){ if (huntPositionEvent < 0) --huntPosition; else ++huntPosition; } if (huntPosition>=numPlayers) huntPosition = 0; if (huntPosition<0) huntPosition = numPlayers-1; if (huntSelectEvent){ // if 'fire' was pressed ... if (!huntAddMode) clearHuntedTanks (); if (huntAddMode && players[huntPosition]->isHunted()) { // UNselect players[huntPosition]->setHunted(false); if (--numHunted != 0) playLocalSound(SFX_HUNT_SELECT); } else { // else select players[huntPosition]->setHunted(true); if (++numHunted == 1) playLocalSound(SFX_HUNT); else playLocalSound(SFX_HUNT_SELECT); } huntState = HUNT_ENABLED; } } } mottoLen = BZDB.getIntClamped ("mottoDispLen", 0, 128); huntSelectEvent = false; huntPositionEvent = 0; numHunted = 0; const int maxLines = BZDB.evalInt("maxScoreboardLines"); int lines = 0; int hiddenLines = 0; while ((player = players[i]) != NULL) { if ((maxLines > 0) && (lines >= maxLines)) { hiddenLines++; } else { if (player->isHunted()) { ++numHunted; } if (player->getTeam()==ObserverTeam && !haveObs){ y -= dy; haveObs = true; } if (huntState==HUNT_SELECTING && i==huntPosition) { drawPlayerScore(player, x1, x2, x3, xs, (float)y, mottoLen, true); } else { drawPlayerScore(player, x1, x2, x3, xs, (float)y, mottoLen, false); } y -= dy; } ++i; ++lines; } if (hiddenLines > 0) { char buf[64]; snprintf(buf, sizeof(buf), "...%i...", hiddenLines); fm.drawString(x1, y, 0, minorFontFace, minorFontSize, buf); fm.drawString(x2, y, 0, minorFontFace, minorFontSize, buf); fm.drawString(x3, y, 0, minorFontFace, minorFontSize, buf); } if (huntState==HUNT_ENABLED && !numHunted) { huntState = HUNT_NONE; // last hunted player must have left the game huntAddMode = false; playLocalSound(SFX_HUNT); } delete[] players; if (World::getWorld()->allowTeams()) renderTeamScores(winWidth, y0, dy); } void ScoreboardRenderer::stringAppendNormalized (std::string *s, float n) { char fmtbuf[10]; sprintf (fmtbuf, " [%4.2f]", n); *s += fmtbuf; } void ScoreboardRenderer::drawRoamTarget(float _x0, float _y0, float _x1, float UNUSED(_y1)) { static const TimeKeeper startTime = TimeKeeper::getCurrent(); const float x0 = floorf(_x0) + 0.5f; const float y0 = floorf(_y0) + 0.5f; const float x1 = floorf(_x1) + 0.5f; const float y1 = y0 + 1.0f; const float black[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; const float white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; const float* c0 = black; const float* c1 = white; const double diff = (TimeKeeper::getCurrent() - startTime); if (fmod(diff, 0.5) > 0.25) { c0 = white; c1 = black; } glPushAttrib(GL_ALL_ATTRIB_BITS); glDisable(GL_BLEND); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glColor4fv(c0); glVertex2f(x0, y1); glVertex2f(x1, y1); glColor4fv(c1); glVertex2f(x0, y0); glVertex2f(x1, y0); glEnd(); glPopAttrib(); } void ScoreboardRenderer::drawPlayerScore(const Player* player, float x1, float x2, float x3, float xs, float y, int mottoLen, bool huntCursor) { // score char score[40], kills[40]; bool highlightTKratio = false; if (tkWarnRatio > 0.0) { if (((player->getWins() > 0) && (player->getTKRatio() > tkWarnRatio)) || ((player->getWins() == 0) && (player->getTeamKills() >= 3))) { highlightTKratio = true; } } if (World::getWorld()->allowRabbit()) { sprintf(score, "%2d%% %4d %3d-%-3d%s[%2d]", player->getRabbitScore(), player->getScore(), player->getWins(), player->getLosses(), highlightTKratio ? ColorStrings[CyanColor].c_str() : "", player->getTeamKills()); } else if (World::getWorld()->allowTeams()) { sprintf(score, "%4d %4d-%-4d%s[%2d]", player->getScore(), player->getWins(), player->getLosses(), highlightTKratio ? ColorStrings[CyanColor].c_str() : "", player->getTeamKills()); } else { sprintf(score, "%4d %4d-%-4d%s", player->getScore(), player->getWins(), player->getLosses(), highlightTKratio ? ColorStrings[CyanColor].c_str() : ""); } // kills if (LocalPlayer::getMyTank() != player) { sprintf(kills, "%3d~%-3d", player->getLocalWins(), player->getLocalLosses()); } else { kills[0] = '\0'; } // team color TeamColor teamIndex = player->getTeam(); if (teamIndex < RogueTeam) { teamIndex = RogueTeam; } std::string teamColor; if (player->getId() < 200) { teamColor = ColorStrings[teamIndex]; } else { teamColor = ColorStrings[CyanColor]; // replay observers } // authentication status std::string statusInfo; if (BZDBCache::colorful) { statusInfo += ColorStrings[CyanColor]; } else { statusInfo += teamColor; } if (player->isAdmin()) { statusInfo += '@'; } else if (player->isVerified()) { statusInfo += '+'; } else if (player->isRegistered()) { statusInfo += '-'; } else { statusInfo = ""; // don't print } std::string playerInfo; // team color playerInfo += teamColor; // Slot number only for admins (playerList perm check, in case they have // hideAdmin) LocalPlayer* localPlayer = LocalPlayer::getMyTank(); if (localPlayer->isAdmin() || localPlayer->hasPlayerList()) { char slot[10]; sprintf(slot, "%3d",player->getId()); playerInfo += slot; playerInfo += " - "; } if (roaming && BZDB.isTrue("showVelocities")) { float vel[3] = {0}; memcpy(vel,player->getVelocity(),sizeof(float)*3); float linSpeed = sqrt(vel[0]*vel[0]+vel[1]*vel[1]); float badFactor = 1.5f; if (linSpeed > player->getMaxSpeed()*badFactor) playerInfo += ColorStrings[RedColor]; if (linSpeed > player->getMaxSpeed()) playerInfo += ColorStrings[YellowColor]; else if (linSpeed < 0.0001f) playerInfo += ColorStrings[GreyColor]; else playerInfo += ColorStrings[WhiteColor]; playerInfo += TextUtils::format("%5.2f ",linSpeed); playerInfo += teamColor; } // callsign playerInfo += player->getCallSign(); // motto in parentheses if (player->getMotto()[0] != '\0' && mottoLen>0) { playerInfo += " ("; playerInfo += TextUtils::str_trunc_continued (player->getMotto(), mottoLen); playerInfo += ")"; } // carried flag bool coloredFlag = false; FlagType* flagd = player->getFlag(); if (flagd != Flags::Null) { // color special flags if (BZDBCache::colorful) { if ((flagd == Flags::ShockWave) || (flagd == Flags::Genocide) || (flagd == Flags::Laser) || (flagd == Flags::GuidedMissile)) { playerInfo += ColorStrings[WhiteColor]; } else if (flagd->flagTeam != NoTeam) { // use team color for team flags playerInfo += ColorStrings[flagd->flagTeam]; } coloredFlag = true; } playerInfo += "/"; playerInfo += (flagd->endurance == FlagNormal ? flagd->flagName : flagd->flagAbbv); // back to original color if (coloredFlag) { playerInfo += teamColor; } } // status if (player->isPaused()) playerInfo += "[p]"; else if (player->isNotResponding()) playerInfo += "[nr]"; else if (player->isAutoPilot()) playerInfo += "[auto]"; #if DEBUG_SHOWRATIOS if (sortMode == SORT_NORMALIZED) stringAppendNormalized (&playerInfo, player->getNormalizedScore()); else if (sortMode == SORT_MYRATIO) stringAppendNormalized (&playerInfo, player->getLocalNormalizedScore()); else if (sortMode == SORT_TKRATIO) stringAppendNormalized (&playerInfo, player->getTKRatio()); #endif FontManager &fm = FontManager::instance(); fm.setDimFactor(dimFactor); if (player == getRoamTargetTank()) { const float w = fm.getStrLength(minorFontFace, minorFontSize, playerInfo); const float h = fm.getStrHeight(minorFontFace, minorFontSize, playerInfo); drawRoamTarget(x3, y, x3 + w, y + h); } // draw if (player->getTeam() != ObserverTeam) { hudColor3fv(Team::getRadarColor(teamIndex)); fm.drawString(x1, y, 0, minorFontFace, minorFontSize, score); hudColor3fv(Team::getRadarColor(teamIndex)); fm.drawString(x2, y, 0, minorFontFace, minorFontSize, kills); } fm.drawString(x3, y, 0, minorFontFace, minorFontSize, playerInfo); if (statusInfo.size() > 0) { fm.drawString(xs, y, 0, minorFontFace, minorFontSize, statusInfo); } if (BZDB.isTrue("debugHud")) { printf ("playerInfo: %s\n", playerInfo.c_str()); //FIXME } // draw huntEnabled status if (player->isHunted()) { std::string huntStr = ColorStrings[WhiteColor]; huntStr += "Hunt->"; fm.drawString(xs - huntedArrowWidth, y, 0, minorFontFace, minorFontSize, huntStr.c_str()); } else if (huntCursor && !huntAddMode) { std::string huntStr = ColorStrings[WhiteColor]; huntStr += ColorStrings[PulsatingColor]; huntStr += "->"; fm.drawString(xs - huntArrowWidth, y, 0, minorFontFace, minorFontSize, huntStr.c_str()); } if (huntCursor && huntAddMode) { std::string huntStr = ColorStrings[WhiteColor]; huntStr += ColorStrings[PulsatingColor]; huntStr += "@>"; fm.drawString(xs - huntPlusesWidth, y, 0, minorFontFace, minorFontSize, huntStr.c_str()); } } // get current 'leader' (NULL if no player) Player* ScoreboardRenderer::getLeader(std::string *label) { int sortType=sortMode; if (sortMode==SORT_CALLSIGN || sortMode==SORT_MYRATIO || sortMode==SORT_TEAM){ sortType = SORT_SCORE; } if (label != NULL){ if (sortMode==SORT_TKS) *label = "TK Leader "; else if (sortMode==SORT_TKRATIO) *label = "TK Ratio Leader "; else *label = "Leader "; } Player** list = newSortedList (sortType, true); Player* top; if (!list) top = NULL; else top = list[0]; delete[] list; if (top==NULL || top->getTeam()==ObserverTeam) return NULL; return top; } /************************ Sort logic follows .... **************************/ struct st_playersort{ Player *player; int i1; int i2; const char *cp; }; typedef struct st_playersort sortEntry; int ScoreboardRenderer::sortCompareCp(const void* _a, const void* _b) { sortEntry *a = (sortEntry *)_a; sortEntry *b = (sortEntry *)_b; return strcasecmp (a->cp, b->cp); } int ScoreboardRenderer::sortCompareI2(const void* _a, const void* _b) { const sortEntry *a = (sortEntry *)_a; const sortEntry *b = (sortEntry *)_b; if (a->i1 != b->i1 ) { return b->i1 - a->i1; } return b->i2 - a->i2; } // creates (allocates) a null-terminated array of Player* Player ** ScoreboardRenderer::newSortedList (int sortType, bool obsLast, int *_numPlayers) { LocalPlayer *myTank = LocalPlayer::getMyTank(); World *world = World::getWorld(); if (!myTank || !world) return NULL; const int curMaxPlayers = world->getCurMaxPlayers() +1; int i,j; int numPlayers=0; int numObs=0; Player* p; sortEntry* sorter = new sortEntry [curMaxPlayers]; // fill the array with remote players for (i=0; igetPlayer(i))){ if (obsLast && p->getTeam()==ObserverTeam) sorter[curMaxPlayers - (++numObs)].player = p; else sorter[numPlayers++].player = p; } } // add my tank if (obsLast && myTank->getTeam()==ObserverTeam) sorter[curMaxPlayers - (++numObs)].player = myTank; else sorter[numPlayers++].player = myTank; // sort players ... if (numPlayers > 0){ for (i=0; igetTeamKills(); sorter[i].i2 = 0 - (int)(p->getNormalizedScore() * 100000); break; case SORT_TKRATIO: sorter[i].i1 = (int)(p->getTKRatio() * 1000); sorter[i].i2 = 0 - (int)(p->getNormalizedScore() * 100000); break; case SORT_TEAM: sorter[i].i1 = p->getTeam(); sorter[i].i2 = (int)(p->getNormalizedScore() * 100000); break; case SORT_MYRATIO: if (p == myTank) sorter[i].i1 = -100001; else sorter[i].i1 = 0 - (int)(p->getLocalNormalizedScore() * 100000); sorter[i].i2 = (int)(p->getNormalizedScore() * 100000); break; case SORT_NORMALIZED: sorter[i].i1 = (int)(p->getNormalizedScore() * 100000); sorter[i].i2 = 0; break; case SORT_CALLSIGN: sorter[i].cp = p->getCallSign(); break; default: if (world->allowRabbit()) sorter[i].i1 = p->getRabbitScore(); else sorter[i].i1 = p->getScore(); sorter[i].i2 = 0; } } if (sortType == SORT_CALLSIGN) qsort (sorter, numPlayers, sizeof(sortEntry), sortCompareCp); else qsort (sorter, numPlayers, sizeof(sortEntry), sortCompareI2); } // TODO: Sort obs here (by time joined, when that info is available) Player** players = new Player *[numPlayers + numObs + 1]; for (i=0; i& players) { players.clear(); int playerCount; Player** pList = newSortedList(getSort(), true, &playerCount); if (pList == NULL) { return; } for (int i = 0; i < playerCount; i++) { Player* p = pList[i]; if (p && (p->getTeam() != ObserverTeam)) { players.push_back(p); } } delete[] pList; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ScoreboardRenderer.h000066400000000000000000000103431200563112200214170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SCOREBOARDRENDERER_H__ #define __SCOREBOARDRENDERER_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "bzfgl.h" /* local interface headers */ #include "Player.h" /** * ScoreboardRenderer: * Encapsulates information about rendering the scoreboard display. */ class ScoreboardRenderer { public: ScoreboardRenderer(); ~ScoreboardRenderer(); void setDim(bool); void setWindowSize (float x, float y, float width, float height); void render(bool forceDisplay); static Player* getLeader(std::string *label = NULL); static const int HUNT_NONE = 0; static const int HUNT_SELECTING = 1; static const int HUNT_ENABLED = 2; void setHuntState(int _state); int getHuntState() const; void setHuntNextEvent (); // invoked when 'down' button pressed void setHuntPrevEvent (); // invoked when 'up' button pressed void setHuntSelectEvent (); // invoked when 'fire' button pressed void huntKeyEvent (bool isAdd); // invoked when '7' or 'U' is pressed void clearHuntedTanks (); void huntReset (); // invoked when joining a server static void setAlwaysTeamScore (bool onoff); static bool getAlwaysTeamScore (); static void setSort (int _sortby); static int getSort (); static const char **getSortLabels(); static const int SORT_SCORE = 0; static const int SORT_NORMALIZED = 1; static const int SORT_CALLSIGN = 2; static const int SORT_TKS = 3; static const int SORT_TKRATIO = 4; static const int SORT_TEAM = 5; static const int SORT_MYRATIO = 6; static const int SORT_MAXNUM = SORT_MYRATIO; void setTeamScoreY ( float val ){teamScoreYVal = val;} void setRoaming ( bool val ){roaming = val;} // does not include observers static void getPlayerList(std::vector& players); protected: void hudColor3fv(const GLfloat*); void renderTeamScores (float y, float x, float dy); void renderScoreboard(); void renderCtfFlags(); void drawRoamTarget(float x0, float y0, float x1, float y1); void drawPlayerScore(const Player*, float x1, float x2, float x3, float xs, float y, int mottoLen, bool huntInd); static const char *sortLabels[SORT_MAXNUM+2]; static int sortMode; static bool alwaysShowTeamScore; void stringAppendNormalized (std::string *s, float n); private: void setMinorFontSize(float height); void setLabelsFontSize(float height); static int teamScoreCompare(const void* _a, const void* _b); static int sortCompareCp(const void* _a, const void* _b); static int sortCompareI2(const void* _a, const void* _b); static Player** newSortedList(int sortType, bool obsLast, int *_numPlayers=NULL); void exitSelectState (void); private: float winX; float winY; float winWidth; float winHeight; bool dim; bool huntIndicator; int huntPosition; bool huntSelectEvent; int huntPositionEvent; int huntState; bool huntAddMode; // valid only if state == SELECTING float teamScoreYVal; bool roaming; GLfloat messageColor[3]; int minorFontFace; float minorFontSize; int labelsFontFace; float labelsFontSize; float scoreLabelWidth; float killsLabelWidth; float teamScoreLabelWidth; float teamCountLabelWidth; float huntArrowWidth; float huntPlusesWidth; float huntedArrowWidth; float tkWarnRatio; static std::string scoreSpacingLabel; static std::string scoreLabel; static std::string killSpacingLabel; static std::string killLabel; static std::string teamScoreSpacingLabel; static std::string playerLabel; static std::string teamCountSpacingLabel; int numHunted; }; #endif /* __SCOREBOARDRENDERER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SegmentedShotStrategy.cxx000066400000000000000000000616671200563112200225330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "SegmentedShotStrategy.h" /* system implementation headers */ #include /* common implementation headers */ #include "TextureManager.h" #include "Intersect.h" #include "BZDBCache.h" #include "WallObstacle.h" /* local implementation headers */ #include "sound.h" #include "LocalPlayer.h" #include "World.h" #include "effectsRenderer.h" #include "playing.h" SegmentedShotStrategy::SegmentedShotStrategy(ShotPath* _path, bool useSuperTexture, bool faint) : ShotStrategy(_path), bbox(), firstSegment() { // initialize times prevTime = getPath().getStartTime(); lastTime = currentTime = prevTime; // start at first segment lastSegment = segment = 0; // get team if (_path->getPlayer() == ServerPlayer) { TeamColor tmpTeam = _path->getFiringInfo().shot.team; team = (tmpTeam < RogueTeam) ? RogueTeam : (tmpTeam > HunterTeam) ? RogueTeam : tmpTeam; } else { Player* p = lookupPlayer(_path->getPlayer()); team = p ? p->getTeam() : RogueTeam; } // initialize scene nodes boltSceneNode = new BoltSceneNode(_path->getPosition(),_path->getVelocity(),useSuperTexture); const float* c = Team::getRadarColor(team); if (faint) { boltSceneNode->setColor(c[0], c[1], c[2], 0.2f); boltSceneNode->setTextureColor(1.0f, 1.0f, 1.0f, 0.3f); } else { boltSceneNode->setColor(c[0], c[1], c[2], 1.0f); } TextureManager &tm = TextureManager::instance(); std::string imageName = Team::getImagePrefix(team); if (useSuperTexture) imageName += BZDB.get("superPrefix"); imageName += BZDB.get("boltTexture"); int texture = tm.getTextureID(imageName.c_str()); if (texture >= 0) boltSceneNode->setTexture(texture); } SegmentedShotStrategy::~SegmentedShotStrategy() { // free scene nodes delete boltSceneNode; } void SegmentedShotStrategy::update(float dt) { prevTime = currentTime; currentTime += dt; // see if we've moved to another segment const int numSegments = segments.size(); if (segment < numSegments && segments[segment].end <= currentTime) { lastSegment = segment; while (segment < numSegments && segments[segment].end <= currentTime) { if (++segment < numSegments) { switch (segments[segment].reason) { case ShotPathSegment::Ricochet: { // play ricochet sound. ricochet of local player's shots // are important, others are not. const PlayerId myTankId = LocalPlayer::getMyTank()->getId(); const bool important = (getPath().getPlayer() == myTankId); const float* pos = segments[segment].ray.getOrigin(); playWorldSound(SFX_RICOCHET, pos, important); // this is fugly but it's what we do float dir[3]; const float* newDir = segments[segment].ray.getDirection(); const float* oldDir = segments[segment - 1].ray.getDirection(); dir[0] = newDir[0] - oldDir[0]; dir[1] = newDir[1] - oldDir[1]; dir[2] = newDir[2] - oldDir[2]; float rots[2]; const float horiz = sqrtf((dir[0]*dir[0]) + (dir[1]*dir[1])); rots[0] = atan2f(dir[1], dir[0]); rots[1] = atan2f(dir[2], horiz); EFFECTS.addRicoEffect( pos, rots); break; } case ShotPathSegment::Boundary: break; default: { // this is fugly but it's what we do float dir[3]; dir[0] = segments[segment].ray.getDirection()[0]; dir[1] = segments[segment].ray.getDirection()[1]; dir[2] = segments[segment].ray.getDirection()[2]; float rots[2]; const float horiz = sqrtf((dir[0]*dir[0]) + (dir[1]*dir[1])); rots[0] = atan2f(dir[1], dir[0]); rots[1] = atan2f(dir[2], horiz); const float* pos = segments[segment].ray.getOrigin(); EFFECTS.addShotTeleportEffect( pos, rots); } break; } } } } // if ran out of segments then expire shot on next update if (segment == numSegments) { setExpiring(); if (numSegments > 0) { ShotPathSegment &segm = segments[numSegments - 1]; const float *dir = segm.ray.getDirection(); const float speed = hypotf(dir[0], hypotf(dir[1], dir[2])); float pos[3]; segm.ray.getPoint(float(segm.end - segm.start - 1.0 / speed), pos); /* NOTE -- comment out to not explode when shot expires */ addShotExplosion(pos); } } // otherwise update position and velocity else { float p[3]; segments[segment].ray.getPoint(float(currentTime - segments[segment].start), p); setPosition(p); setVelocity(segments[segment].ray.getDirection()); } } void SegmentedShotStrategy::setCurrentTime(const TimeKeeper& _currentTime) { currentTime = _currentTime; } const TimeKeeper& SegmentedShotStrategy::getLastTime() const { return lastTime; } bool SegmentedShotStrategy::isOverlapping( const float (*bbox1)[3], const float (*bbox2)[3]) const { if (bbox1[1][0] < bbox2[0][0]) return false; if (bbox1[0][0] > bbox2[1][0]) return false; if (bbox1[1][1] < bbox2[0][1]) return false; if (bbox1[0][1] > bbox2[1][1]) return false; if (bbox1[1][2] < bbox2[0][2]) return false; if (bbox1[0][2] > bbox2[1][2]) return false; return true; } void SegmentedShotStrategy::setCurrentSegment(int _segment) { segment = _segment; } float SegmentedShotStrategy::checkHit(const BaseLocalPlayer* tank, float position[3]) const { float minTime = Infinity; // expired shot can't hit anything if (getPath().isExpired()) return minTime; // get tank radius float radius = tank->getRadius(); const float radius2 = radius * radius; // tank is positioned from it's bottom so shift position up by // half a tank height. const float tankHeight = tank->getDimensions()[2]; Ray tankLastMotionRaw = tank->getLastMotion(); float lastTankPositionRaw[3]; lastTankPositionRaw[0] = tankLastMotionRaw.getOrigin()[0]; lastTankPositionRaw[1] = tankLastMotionRaw.getOrigin()[1]; lastTankPositionRaw[2] = tankLastMotionRaw.getOrigin()[2] + 0.5f * tankHeight; Ray tankLastMotion(lastTankPositionRaw, tankLastMotionRaw.getDirection()); // if bounding box of tank and entire shot doesn't overlap then no hit const float (*tankBBox)[3] = tank->getLastMotionBBox(); if (!isOverlapping(bbox, tankBBox)) return minTime; float shotRadius = BZDB.eval(StateDatabase::BZDB_SHOTRADIUS); // check each segment in interval (prevTime,currentTime] const float dt = float(currentTime - prevTime); const int numSegments = segments.size(); for (int i = lastSegment; i <= segment && i < numSegments; i++) { // can never hit your own first laser segment if (i == 0 && getPath().getFlag() == Flags::Laser && getPath().getPlayer() == tank->getId()) continue; /* // skip segments that don't overlap in time with current interval if (segments[i].end <= prevTime) continue; if (currentTime <= segments[i].start) break; */ // if shot segment and tank bboxes don't overlap then no hit const ShotPathSegment& s = segments[i]; if (!isOverlapping(s.bbox, tankBBox)) continue; // construct relative shot ray: origin and velocity relative to // my tank as a function of time (t=0 is start of the interval). Ray relativeRay(rayMinusRay(s.ray, float(prevTime - s.start), tankLastMotion, 0.0f)); // get hit time float t; if (tank->getFlag() == Flags::Narrow) { // find closest approach to narrow box around tank. width of box // is shell radius so you can actually hit narrow tank head on. static float tankBase[3] = { 0.0f, 0.0f, -0.5f * tankHeight }; t = timeRayHitsBlock(relativeRay, tankBase, tank->getAngle(), 0.5f * BZDBCache::tankLength, shotRadius, tankHeight); } else { // find time when shot hits sphere around tank t = rayAtDistanceFromOrigin(relativeRay, 0.99f * radius); } // short circuit if time is greater then smallest time so far if (t > minTime) continue; // make sure time falls within segment if (t < 0.0f || t > dt) continue; if (t > s.end - prevTime) continue; // check if shot hits tank -- get position at time t, see if in radius float closestPos[3]; relativeRay.getPoint(t, closestPos); if (closestPos[0] * closestPos[0] + closestPos[1] * closestPos[1] + closestPos[2] * closestPos[2] < radius2) { // save best time so far minTime = t; // compute location of tank at time of hit float tankPos[3]; tank->getLastMotion().getPoint(t, tankPos); // compute position of intersection position[0] = tankPos[0] + closestPos[0]; position[1] = tankPos[1] + closestPos[1]; position[2] = tankPos[2] + closestPos[2]; //printf("%u:%u %u:%u\n", tank->getId().port, tank->getId().number, getPath().getPlayer().port, getPath().getPlayer().number); } } return minTime; } void SegmentedShotStrategy::addShot( SceneDatabase* scene, bool colorblind) { const ShotPath& shotPath = getPath(); boltSceneNode->move(shotPath.getPosition(), shotPath.getVelocity()); if (boltSceneNode->getColorblind() != colorblind) { boltSceneNode->setColorblind(colorblind); TeamColor currentTeam = colorblind ? RogueTeam : team; const float* c = Team::getRadarColor(currentTeam); boltSceneNode->setColor(c[0], c[1], c[2]); TextureManager &tm = TextureManager::instance(); std::string imageName = Team::getImagePrefix(currentTeam); imageName += BZDB.get("boltTexture"); int texture = tm.getTextureID(imageName.c_str()); if (texture >= 0) boltSceneNode->setTexture(texture); } scene->addDynamicNode(boltSceneNode); } void SegmentedShotStrategy::radarRender() const { const float *orig = getPath().getPosition(); const int length = (int)BZDBCache::linedRadarShots; const int size = (int)BZDBCache::sizedRadarShots; float shotTailLength = BZDB.eval(StateDatabase::BZDB_SHOTTAILLENGTH); // Display leading lines if (length > 0) { const float* vel = getPath().getVelocity(); const float d = 1.0f / hypotf(vel[0], hypotf(vel[1], vel[2])); float dir[3]; dir[0] = vel[0] * d * shotTailLength * length; dir[1] = vel[1] * d * shotTailLength * length; dir[2] = vel[2] * d * shotTailLength * length; glBegin(GL_LINES); glVertex2fv(orig); if (BZDB.eval("leadingShotLine") == 1) { //leading glVertex2f(orig[0] + dir[0], orig[1] + dir[1]); glEnd(); } else if(BZDB.eval("leadingShotLine") == 0) { //lagging glVertex2f(orig[0] - dir[0], orig[1] - dir[1]); glEnd(); } else if(BZDB.eval("leadingShotLine") == 2) { //both glVertex2f(orig[0] + dir[0], orig[1] + dir[1]); glEnd(); glBegin(GL_LINES); glVertex2fv(orig); glVertex2f(orig[0] - dir[0], orig[1] - dir[1]); glEnd(); } // draw a "bright" bullet tip if (size > 0) { glColor3f(0.75, 0.75, 0.75); glPointSize((float)size); glBegin(GL_POINTS); glVertex2f(orig[0], orig[1]); glEnd(); glPointSize(1.0f); } } else { if (size > 0) { // draw a sized bullet glPointSize((float)size); glBegin(GL_POINTS); glVertex2fv(orig); glEnd(); glPointSize(1.0f); } else { // draw the tiny little bullet glBegin(GL_POINTS); glVertex2fv(orig); glEnd(); } } } void SegmentedShotStrategy::makeSegments(ObstacleEffect e) { // compute segments of shot until total length of segments exceeds the // lifetime of the shot. const ShotPath &shotPath = getPath(); const float *v = shotPath.getVelocity(); TimeKeeper startTime = shotPath.getStartTime(); float timeLeft = shotPath.getLifetime(); float minTime = BZDB.eval(StateDatabase::BZDB_MUZZLEFRONT) / hypotf(v[0], hypotf(v[1], v[2])); // if all shots ricochet and obstacle effect is stop, then make it ricochet if (e == Stop && World::getWorld()->allShotsRicochet()) { e = Reflect; } // prepare first segment float o[3], d[3]; d[0] = v[0]; d[1] = v[1]; d[2] = v[2]; // use v[2] to have jumping affect shot velocity o[0] = shotPath.getPosition()[0]; o[1] = shotPath.getPosition()[1]; o[2] = shotPath.getPosition()[2]; segments.clear(); ShotPathSegment::Reason reason = ShotPathSegment::Initial; int i; const int maxSegment = 100; float worldSize = BZDBCache::worldSize / 2.0f - 0.01f; for (i = 0; (i < maxSegment) && (timeLeft > Epsilon); i++) { // construct ray and find the first building, teleporter, or outer wall float o2[3]; o2[0] = o[0] - minTime * d[0]; o2[1] = o[1] - minTime * d[1]; o2[2] = o[2] - minTime * d[2]; // Sometime shot start outside world if (o2[0] <= -worldSize) o2[0] = -worldSize; if (o2[0] >= worldSize) o2[0] = worldSize; if (o2[1] <= -worldSize) o2[1] = -worldSize; if (o2[1] >= worldSize) o2[1] = worldSize; Ray r(o2, d); Ray rs(o, d); float t = timeLeft + minTime; int face; bool hitGround = getGround(r, Epsilon, t); Obstacle* building = (Obstacle*)((e == Through) ? NULL : getFirstBuilding(r, Epsilon, t)); const Teleporter* teleporter = getFirstTeleporter(r, Epsilon, t, face); t -= minTime; minTime = 0.0f; bool ignoreHit = false; // if hit outer wall with ricochet and hit is above top of wall // then ignore hit. if (!teleporter && building && (e == Reflect) && (building->getType() == WallObstacle::getClassName()) && ((o[2] + t * d[2]) > building->getHeight())) { ignoreHit = true; } // construct next shot segment and add it to list TimeKeeper endTime(startTime); if (t < 0.0f) { endTime += Epsilon; } else { endTime += t; } ShotPathSegment segm(startTime, endTime, rs, reason); segments.push_back(segm); startTime = endTime; // used up this much time in segment if (t < 0.0f) { timeLeft -= Epsilon; } else { timeLeft -= t; } // check in reverse order to see what we hit first reason = ShotPathSegment::Through; if (ignoreHit) { // uh...ignore this. usually used if you shoot over the boundary wall. // just move the point of origin and build the next segment o[0] += t * d[0]; o[1] += t * d[1]; o[2] += t * d[2]; reason = ShotPathSegment::Boundary; } else if (teleporter) { // entered teleporter -- teleport it unsigned int seed = shotPath.getShotId() + i; int source = World::getWorld()->getTeleporter(teleporter, face); int target = World::getWorld()->getTeleportTarget(source, seed); int outFace; const Teleporter* outTeleporter = World::getWorld()->getTeleporter(target, outFace); o[0] += t * d[0]; o[1] += t * d[1]; o[2] += t * d[2]; teleporter->getPointWRT(*outTeleporter, face, outFace, o, d, 0.0f, o, d, NULL); reason = ShotPathSegment::Teleport; } else if (building) { // hit building -- can bounce off or stop, buildings ignored for Through switch (e) { case Stop: { if(!building->canRicochet()) { timeLeft = 0.0f; break; } else { } } case Reflect: { // move origin to point of reflection o[0] += t * d[0]; o[1] += t * d[1]; o[2] += t * d[2]; // reflect direction about normal to building float normal[3]; building->get3DNormal(o, normal); reflect(d, normal); reason = ShotPathSegment::Ricochet; break; } case Through: { assert(0); break; } } } else if (hitGround) { // we hit the ground switch (e) { case Stop: case Through: { timeLeft = 0.0f; break; } case Reflect: { // move origin to point of reflection o[0] += t * d[0]; o[1] += t * d[1]; o[2] += t * d[2]; // reflect direction about normal to ground float normal[3]; normal[0] = 0.0f; normal[1] = 0.0f; normal[2] = 1.0f; reflect(d, normal); reason = ShotPathSegment::Ricochet; break; } } } } lastTime = startTime; // make bounding box for entire path const int numSegments = segments.size(); if (numSegments > 0) { const ShotPathSegment& firstSeg = segments[0]; bbox[0][0] = firstSeg.bbox[0][0]; bbox[0][1] = firstSeg.bbox[0][1]; bbox[0][2] = firstSeg.bbox[0][2]; bbox[1][0] = firstSeg.bbox[1][0]; bbox[1][1] = firstSeg.bbox[1][1]; bbox[1][2] = firstSeg.bbox[1][2]; for (i = 1; i < numSegments; i++) { const ShotPathSegment& segm = segments[i]; if (bbox[0][0] > segm.bbox[0][0]) bbox[0][0] = segm.bbox[0][0]; if (bbox[1][0] < segm.bbox[1][0]) bbox[1][0] = segm.bbox[1][0]; if (bbox[0][1] > segm.bbox[0][1]) bbox[0][1] = segm.bbox[0][1]; if (bbox[1][1] < segm.bbox[1][1]) bbox[1][1] = segm.bbox[1][1]; if (bbox[0][2] > segm.bbox[0][2]) bbox[0][2] = segm.bbox[0][2]; if (bbox[1][2] < segm.bbox[1][2]) bbox[1][2] = segm.bbox[1][2]; } } else { bbox[0][0] = bbox[1][0] = 0.0f; bbox[0][1] = bbox[1][1] = 0.0f; bbox[0][2] = bbox[1][2] = 0.0f; } } const std::vector& SegmentedShotStrategy::getSegments() const { return segments; } // // NormalShotStrategy // NormalShotStrategy::NormalShotStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false) { // make segments makeSegments(Stop); } NormalShotStrategy::~NormalShotStrategy() { // do nothing } // // RapidFireStrategy // RapidFireStrategy::RapidFireStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false) { // speed up shell and decrease lifetime FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_RFIREADLIFE); float fireAdVel = BZDB.eval(StateDatabase::BZDB_RFIREADVEL); f.shot.vel[0] *= fireAdVel; f.shot.vel[1] *= fireAdVel; f.shot.vel[2] *= fireAdVel; setReloadTime(_path->getReloadTime() / BZDB.eval(StateDatabase::BZDB_RFIREADRATE)); // make segments makeSegments(Stop); } RapidFireStrategy::~RapidFireStrategy() { // do nothing } // // ThiefStrategy // ThiefStrategy::ThiefStrategy(ShotPath *_path) : SegmentedShotStrategy(_path, false),cumTime(0.0f) { // speed up shell and decrease lifetime FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_THIEFADLIFE); float thiefAdVel = BZDB.eval(StateDatabase::BZDB_THIEFADSHOTVEL); f.shot.vel[0] *= thiefAdVel; f.shot.vel[1] *= thiefAdVel; f.shot.vel[2] *= thiefAdVel; setReloadTime(_path->getReloadTime() / BZDB.eval(StateDatabase::BZDB_THIEFADRATE)); // make segments makeSegments(Stop); setCurrentTime(getLastTime()); endTime = f.lifetime; // make thief scene nodes const int numSegments = getSegments().size(); thiefNodes = new LaserSceneNode*[numSegments]; TextureManager &tm = TextureManager::instance(); int texture = tm.getTextureID("thief"); for (int i = 0; i < numSegments; i++) { const ShotPathSegment& segm = getSegments()[i]; const float t = float(segm.end - segm.start); const Ray& ray = segm.ray; const float* rawdir = ray.getDirection(); float dir[3]; dir[0] = t * rawdir[0]; dir[1] = t * rawdir[1]; dir[2] = t * rawdir[2]; thiefNodes[i] = new LaserSceneNode(ray.getOrigin(), dir); if (texture >= 0) thiefNodes[i]->setTexture(texture); if (i == 0) { thiefNodes[i]->setFirst(); } thiefNodes[i]->setColor(0,1,1); thiefNodes[i]->setCenterColor(0,0,0); } setCurrentSegment(numSegments - 1); } ThiefStrategy::~ThiefStrategy() { const int numSegments = getSegments().size(); for (int i = 0; i < numSegments; i++) delete thiefNodes[i]; delete[] thiefNodes; } void ThiefStrategy::update(float dt) { cumTime += dt; if (cumTime >= endTime) setExpired(); } void ThiefStrategy::addShot(SceneDatabase* scene, bool) { // laser is so fast we always show every segment const int numSegments = getSegments().size(); for (int i = 0; i < numSegments; i++) scene->addDynamicNode(thiefNodes[i]); } void ThiefStrategy::radarRender() const { // draw all segments const std::vector& segmts = getSegments(); const int numSegments = segmts.size(); glBegin(GL_LINES); for (int i = 0; i < numSegments; i++) { const ShotPathSegment& segm = segmts[i]; const float* origin = segm.ray.getOrigin(); const float* direction = segm.ray.getDirection(); const float dt = float(segm.end - segm.start); glVertex2fv(origin); glVertex2f(origin[0] + dt * direction[0], origin[1] + dt * direction[1]); } glEnd(); } bool ThiefStrategy::isStoppedByHit() const { return false; } // // MachineGunStrategy // MachineGunStrategy::MachineGunStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false) { // speed up shell and decrease lifetime FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_MGUNADLIFE); float mgunAdVel = BZDB.eval(StateDatabase::BZDB_MGUNADVEL); f.shot.vel[0] *= mgunAdVel; f.shot.vel[1] *= mgunAdVel; f.shot.vel[2] *= mgunAdVel; setReloadTime(_path->getReloadTime() / BZDB.eval(StateDatabase::BZDB_MGUNADRATE)); // make segments makeSegments(Stop); } MachineGunStrategy::~MachineGunStrategy() { // do nothing } // // RicochetStrategy // RicochetStrategy::RicochetStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false) { // make segments that bounce makeSegments(Reflect); } RicochetStrategy::~RicochetStrategy() { // do nothing } // // SuperBulletStrategy // SuperBulletStrategy::SuperBulletStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, true) { // make segments that go through buildings makeSegments(Through); } SuperBulletStrategy::~SuperBulletStrategy() { // do nothing } PhantomBulletStrategy::PhantomBulletStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false,true) { // make segments that go through buildings makeSegments(Through); } PhantomBulletStrategy::~PhantomBulletStrategy() { // do nothing } // // LaserStrategy // LaserStrategy::LaserStrategy(ShotPath* _path) : SegmentedShotStrategy(_path, false), cumTime(0.0f) { // speed up shell and decrease lifetime FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_LASERADLIFE); float laserAdVel = BZDB.eval(StateDatabase::BZDB_LASERADVEL); f.shot.vel[0] *= laserAdVel; f.shot.vel[1] *= laserAdVel; f.shot.vel[2] *= laserAdVel; setReloadTime(_path->getReloadTime() / BZDB.eval(StateDatabase::BZDB_LASERADRATE)); // make segments makeSegments(Stop); setCurrentTime(getLastTime()); endTime = f.lifetime; // make laser scene nodes const int numSegments = getSegments().size(); laserNodes = new LaserSceneNode*[numSegments]; const LocalPlayer* myTank = LocalPlayer::getMyTank(); TeamColor tmpTeam = (myTank->getFlag() == Flags::Colorblindness) ? RogueTeam : team; TextureManager &tm = TextureManager::instance(); std::string imageName = Team::getImagePrefix(tmpTeam); imageName += BZDB.get("laserTexture"); int texture = tm.getTextureID(imageName.c_str()); for (int i = 0; i < numSegments; i++) { const ShotPathSegment& segm = getSegments()[i]; const float t = float(segm.end - segm.start); const Ray& ray = segm.ray; const float* rawdir = ray.getDirection(); float dir[3]; dir[0] = t * rawdir[0]; dir[1] = t * rawdir[1]; dir[2] = t * rawdir[2]; laserNodes[i] = new LaserSceneNode(ray.getOrigin(), dir); if (texture >= 0) laserNodes[i]->setTexture(texture); const float* color = Team::getRadarColor(tmpTeam); laserNodes[i]->setColor(color[0], color[1], color[2]); if (i == 0) { laserNodes[i]->setFirst(); } } setCurrentSegment(numSegments - 1); } LaserStrategy::~LaserStrategy() { const int numSegments = getSegments().size(); for (int i = 0; i < numSegments; i++) delete laserNodes[i]; delete[] laserNodes; } void LaserStrategy::update(float dt) { cumTime += dt; if (cumTime >= endTime) setExpired(); } void LaserStrategy::addShot(SceneDatabase* scene, bool) { // laser is so fast we always show every segment const int numSegments = getSegments().size(); for (int i = 0; i < numSegments; i++) scene->addDynamicNode(laserNodes[i]); } void LaserStrategy::radarRender() const { // draw all segments const std::vector& segmts = getSegments(); const int numSegments = segmts.size(); glBegin(GL_LINES); for (int i = 0; i < numSegments; i++) { const ShotPathSegment& segm = segmts[i]; const float* origin = segm.ray.getOrigin(); const float* direction = segm.ray.getDirection(); const float dt = float(segm.end - segm.start); glVertex2fv(origin); glVertex2f(origin[0] + dt * direction[0], origin[1] + dt * direction[1]); } glEnd(); } bool LaserStrategy::isStoppedByHit() const { return false; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SegmentedShotStrategy.h000066400000000000000000000067571200563112200221570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SEGMENTEDSHOTSTRATEGY_H__ #define __SEGMENTEDSHOTSTRATEGY_H__ /* interface header */ #include "ShotStrategy.h" /* system interface headers */ #include /* common interface headers */ #include "SceneDatabase.h" #include "TimeKeeper.h" #include "LaserSceneNode.h" /* local interface headers */ #include "BaseLocalPlayer.h" #include "ShotPathSegment.h" #include "BoltSceneNode.h" class SegmentedShotStrategy : public ShotStrategy { public: SegmentedShotStrategy(ShotPath*, bool useSuperTexture, bool faint = false); ~SegmentedShotStrategy(); void update(float dt); float checkHit(const BaseLocalPlayer*, float[3]) const; void addShot(SceneDatabase*, bool colorblind); void radarRender() const; TeamColor team; protected: enum ObstacleEffect { Stop = 0, Through = 1, Reflect = 2 }; void makeSegments(ObstacleEffect = Stop); const std::vector& getSegments() const; void setCurrentTime(const TimeKeeper&); const TimeKeeper& getLastTime() const; bool isOverlapping(const float (*bbox1)[3], const float (*bbox2)[3]) const; void setCurrentSegment(int segment); private: TimeKeeper prevTime; TimeKeeper currentTime; TimeKeeper lastTime; int segment, lastSegment; std::vector segments; BoltSceneNode* boltSceneNode; float bbox[2][3]; int firstSegment; }; class NormalShotStrategy : public SegmentedShotStrategy { public: NormalShotStrategy(ShotPath*); ~NormalShotStrategy(); }; class RapidFireStrategy : public SegmentedShotStrategy { public: RapidFireStrategy(ShotPath*); ~RapidFireStrategy(); }; class ThiefStrategy : public SegmentedShotStrategy { public: ThiefStrategy(ShotPath*); ~ThiefStrategy(); void update(float dt); bool isStoppedByHit() const; void addShot(SceneDatabase*, bool colorblind); void radarRender() const; private: float cumTime; float endTime; LaserSceneNode** thiefNodes; }; class MachineGunStrategy : public SegmentedShotStrategy { public: MachineGunStrategy(ShotPath*); ~MachineGunStrategy(); }; class LaserStrategy : public SegmentedShotStrategy { public: LaserStrategy(ShotPath*); ~LaserStrategy(); void update(float dt); bool isStoppedByHit() const; void addShot(SceneDatabase*, bool colorblind); void radarRender() const; private: float cumTime; float endTime; LaserSceneNode** laserNodes; }; class RicochetStrategy : public SegmentedShotStrategy { public: RicochetStrategy(ShotPath*); ~RicochetStrategy(); }; class SuperBulletStrategy : public SegmentedShotStrategy { public: SuperBulletStrategy(ShotPath*); ~SuperBulletStrategy(); }; class PhantomBulletStrategy : public SegmentedShotStrategy { public: PhantomBulletStrategy(ShotPath*); ~PhantomBulletStrategy(); }; #endif /* __SEGMENTEDSHOTSTRATEGY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerCommandKey.cxx000066400000000000000000000326621200563112200214460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ServerCommandKey.h" #include "LocalPlayer.h" #include "HUDRenderer.h" #include "TextUtils.h" #include "KeyManager.h" #include "playing.h" #include "HUDui.h" const ServerCommandKey::Mode ServerCommandKey::nonAdminModes [6] = {LagStats, IdleStats, FlagHistory, Report, Password, ClientQuery}; /* FIXME - note the important numModes and numNonAdminModes values inited here * when new commands are added, the indices need to be adjusted here. */ ServerCommandKey::ServerCommandKey(): mode(LagStats), startIndex(-1), numModes(35), numNonAdminModes(6) { return; } void ServerCommandKey::nonAdminInit() { // if we are in a non admin mode stay there bool inNonAdminCommand = false; for (int i = 0; i < numNonAdminModes; i++) { if (nonAdminModes[i] == mode) { inNonAdminCommand = true; break; } } if (!inNonAdminCommand) mode = nonAdminModes[0]; updatePrompt(); } void ServerCommandKey::adminInit() { updatePrompt(); } void ServerCommandKey::init() { updatePrompt(); } void ServerCommandKey::updatePrompt() { std::string composePrompt; // decide what should be on the composing prompt LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!myTank) { // make sure we actually have a tank return; } const Player * recipient = myTank->getRecipient(); if (mode >= Kick && mode <= Ghost) { // more complicated modes here if (recipient) { switch (mode) { case Kick: composePrompt = "Kick -> "; composePrompt = composePrompt + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); break; case BanIp: case Ban1: case Ban2: case Ban3: // Set the prompt and enable editing/composing --> allows to enter ban time /* FIXME FIXME FIXME * temporarily breaking bans for playerid->ubyte banPattern = makePattern(recipient->id.serverHost); composePrompt = "Ban " + banPattern + " -> " + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); */ break; case Kill: composePrompt = "Kill -> "; composePrompt = composePrompt + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); break; case Setgroup: composePrompt = "Set players group "; composePrompt = composePrompt + " -> " + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); break; case Removegroup: composePrompt = "Remove player from group "; composePrompt = composePrompt + " -> " + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); break; case Ghost: composePrompt = "Ghost player [enter your pass] "; composePrompt = composePrompt + " -> " + recipient->getCallSign() + " :"; hud->setComposing(composePrompt, true); break; case Showgroup: composePrompt = "Show player's groups "; composePrompt = composePrompt + " -> " + recipient->getCallSign(); hud->setComposing(composePrompt, false); break; default: /* shouldn't happen */ break; } } else { // no recipient -- we are in editing mode -- kick or ban switch (mode) { case Kick: hud->setComposing("Kick :", true); break; case Kill: hud->setComposing("Kill :", true); break; case BanIp: case Ban1: case Ban2: case Ban3: hud->setComposing("Ban :", true); break; case Setgroup: composePrompt = "Set player's group :"; hud->setComposing(composePrompt, true); break; case Removegroup: composePrompt = "Remove player from group :"; hud->setComposing(composePrompt, true); break; case Ghost: composePrompt = "Ghost :"; hud->setComposing(composePrompt, true); break; case Showgroup: composePrompt = "Show players group :"; hud->setComposing(composePrompt, true); break; default: /* shouldn't happen */ break; } } } else { // not kick or ban stuff -- should be less complicated switch (mode) { case Unban: hud->setComposing("Unban :", true); break; case Banlist: hud->setComposing("Show ban list", false); break; case Playerlist: hud->setComposing("Show player list", false); break; case FlagReset: hud->setComposing("Reset Flags", false); break; case FlagUnusedReset: hud->setComposing("Reset Unused Flags", false); break; case FlagUp: hud->setComposing("Remove Flags", false); break; case GameOver: hud->setComposing("End Game", false); break; case CountDown: hud->setComposing("Restart Countdown:", true); break; case FlagShow: hud->setComposing("Show Flag Info", false); break; case Shutdown: hud->setComposing("Shut Down Server", false); break; case SuperKill: hud->setComposing("Disconnect all Players", false); break; case LagWarn: hud->setComposing("Lag Warning threshold:", true); break; case LagDrop: hud->setComposing("Maximum lag warnings:", true); break; case IdleStats: hud->setComposing("Idle Stats", false); break; case ClientQuery: hud->setComposing("Client Version Query", false); break; case LagStats: hud->setComposing("Lag / Ping Stats", false); break; case FlagHistory: hud->setComposing("Flag History", false); break; case Password: hud->setComposing("Admin Password:", true); break; case Report: hud->setComposing("Send Report to Server:", true); break; case Grouplist: hud->setComposing("List Groups", false); break; case Groupperms: hud->setComposing("List Permissions", false); break; case Vote: hud->setComposing("Vote:", true); break; case Poll: hud->setComposing("Call a Poll:", true); break; case Veto: hud->setComposing("Cancel a Poll", false); break; default: /* shouldn't happen */ break; } } } // return the right ban pattern 123.32.12.* for example depending on the // mode of the class. Returns an empty string on errors. std::string ServerCommandKey::makePattern(const InAddr& address) { const char * c = inet_ntoa(address); if (c == NULL) return ""; std::string dots = c; std::vector dotChunks = TextUtils::tokenize(dots, "."); if (dotChunks.size() != 4) return ""; switch (mode) { case BanIp: return dots; case Ban1: return dotChunks[0] + "." + dotChunks[1] + "." + dotChunks[2] + ".*"; case Ban2: return dotChunks[0] + "." + dotChunks[1] + ".*.*"; case Ban3: return dotChunks[0] + ".*.*.*"; default: break; } return ""; } bool ServerCommandKey::keyPress(const BzfKeyEvent& key) { bool sendIt; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (KEYMGR.get(key, true) == "jump") { // jump while typing myTank->setJump(); } if (myTank->getInputMethod() != LocalPlayer::Keyboard) { if ((key.button == BzfKeyEvent::Up) || (key.button == BzfKeyEvent::Down) || (key.button == BzfKeyEvent::Left) || (key.button == BzfKeyEvent::Right)) return true; } switch (key.ascii) { case 3: // ^C case 27: // escape // case 127: // delete sendIt = false; // finished composing -- don't send break; case 4: // ^D case 13: // return sendIt = true; break; default: return false; } if (sendIt) { std::string message = hud->getComposeString(); std::string sendMsg, displayMsg, name; const Player * troll = myTank->getRecipient(); if (mode >= Kick && mode <=Ghost){ // handle more complicated modes if (troll) { // cases where we select recipient with keys name = troll->getCallSign(); switch (mode) { case Kick: // escape the name name = TextUtils::replace_all(name, "\\", "\\\\"); name = TextUtils::replace_all(name, "\"", "\\\""); sendMsg="/kick \"" + name + "\""; if (message != "") sendMsg = sendMsg + " " + message; break; case Kill: // escape the name name = TextUtils::replace_all(name, "\\", "\\\\"); name = TextUtils::replace_all(name, "\"", "\\\""); sendMsg="/kill \"" + name + "\""; if (message != "") sendMsg = sendMsg + " " + message; break; case BanIp: case Ban1: case Ban2: case Ban3: /* FIXME FIXME FIXME * temporarily break ban-by-name for playerid->ubyte banPattern = makePattern(troll->id.serverHost); sendMsg="/ban " + banPattern; if (message != ""){ // add ban length if something is there sendMsg = sendMsg + " " + message; } */ break; case Setgroup: sendMsg = "/setgroup"; sendMsg = sendMsg + " \"" + name + "\"" +" " + message; break; case Removegroup: sendMsg = "/removegroup"; sendMsg = sendMsg + " \"" + name + "\"" +" " + message; break; case Ghost: sendMsg = "/ghost"; sendMsg = sendMsg + " \"" + name + "\"" +" " + message; break; case Showgroup: sendMsg = "/showgroup"; sendMsg = sendMsg + " \"" + name + "\""; break; default: /* shouldn't happen */ break; } } else { // no recipient -- editing mode switch (mode) { case Kick: sendMsg = "/kick"; break; case Kill: sendMsg = "/kill"; break; case BanIp: sendMsg = "/ban"; break; case Setgroup: sendMsg = "/setgroup"; break; case Removegroup: sendMsg = "/removegroup"; break; case Ghost: sendMsg = "/ghost"; break; case Showgroup: sendMsg = "/showgroup"; break; default: /* shouldn't happen */ break; } if (message != "") sendMsg = sendMsg + " " + message; } } else { // handle less complicated messages switch (mode) { case Unban: sendMsg = "/unban " + message; break; case Banlist: sendMsg = "/banlist"; break; case Playerlist: sendMsg = "/playerlist"; break; case FlagReset: sendMsg = "/flag reset"; break; case FlagUnusedReset: sendMsg = "/flag reset unused"; break; case FlagUp: sendMsg = "/flag up"; break; case GameOver: sendMsg = "/gameover"; break; case CountDown: sendMsg = "/countdown " + message; break; case FlagShow: sendMsg = "/flag show"; break; case Shutdown: sendMsg = "/shutdownserver"; break; case SuperKill: sendMsg = "/superkill"; break; case LagWarn: sendMsg = "/lagwarn " + message; break; case LagDrop: sendMsg = "/lagdrop " + message; break; case IdleStats: sendMsg = "/idlestats"; break; case LagStats: sendMsg = "/lagstats"; break; case ClientQuery: sendMsg = "/clientquery"; break; case FlagHistory: sendMsg = "/flaghistory"; break; case Password: sendMsg = "/password "+ message; break; case Report: sendMsg = "/report "+ message; break; case Grouplist: sendMsg = "/grouplist"; break; case Groupperms: sendMsg = "/groupperms"; break; case Vote: sendMsg = "/vote " + message; break; case Poll: sendMsg = "/poll " + message; break; case Veto: sendMsg = "/veto " + message; break; default: /* shouldn't happen */ break; } } // send the message on its way if it isn't empty if (sendMsg != "") { displayMsg = "-> \"" + sendMsg + "\""; if (sendMsg.find("/password", 0) == std::string::npos) addMessage(NULL, displayMsg, 2); void* buf = messageMessage; buf = nboPackUByte(buf, ServerPlayer); char messageBuffer[MessageLen]; strncpy(messageBuffer, sendMsg.c_str(), MessageLen - 1); messageBuffer[MessageLen - 1] = '\0'; buf = nboPackString(buf, messageBuffer, MessageLen); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); } } hud->setComposing(std::string()); //myTank->setRecipient(NULL); HUDui::setDefaultKey(NULL); return true; } bool ServerCommandKey::keyRelease(const BzfKeyEvent& key) { LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank->getInputMethod() != LocalPlayer::Keyboard) { if (key.button == BzfKeyEvent::Up || key.button == BzfKeyEvent::Down || key.button == BzfKeyEvent::Left || key.button == BzfKeyEvent::Right) { if (key.button == BzfKeyEvent::Left || key.button == BzfKeyEvent::Right) // robot stay on the recipient list - to ban eventually ?? selectNextRecipient(key.button == BzfKeyEvent::Right, true); const Player *recipient = myTank->getRecipient(); // choose which mode we are in int maxModes; if (myTank->isAdmin()) { maxModes = numModes; } else { maxModes = numNonAdminModes; } if (key.button == BzfKeyEvent::Down) { int newMode = mode; if (!myTank->isAdmin()) { bool foundIt = false; for (int i = 0; i < numNonAdminModes; i++) { if (mode == nonAdminModes[i]) { newMode = i; foundIt = true; } } if (!foundIt) newMode = 0; } newMode++; if (newMode >= maxModes) newMode = 0; mode = (myTank->isAdmin() ? ((Mode)newMode) : nonAdminModes[newMode]); // if no recipient skip Ban1,2,3 -- applies to admin mode if (!recipient && (mode >= Ban1 && mode <= Ban3)) mode = Unban; } else if (key.button == BzfKeyEvent::Up) { int newMode = (int) mode; bool foundIt = false; if (!myTank->isAdmin()) { for (int i = 0; i < numNonAdminModes; i++) { if (mode == nonAdminModes[i]) { newMode = i; foundIt = true; } } if (!foundIt) newMode = 0; } newMode--; if (newMode < 0) newMode = maxModes -1; mode = (myTank->isAdmin() ? ((Mode) newMode) : nonAdminModes[newMode]); // if no recipient skip Ban1,2,3 -- applies to admin mode if (!recipient && (mode >= Ban1 && mode <= Ban3)) mode = BanIp; } //update composing prompt updatePrompt(); return false; } } return keyPress(key); } bzflag-2.4.2+ds1/src/bzflag/ServerCommandKey.h000066400000000000000000000032501200563112200210620ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERCOMMANDKEY_H__ #define __SERVERCOMMANDKEY_H__ // Ancestor class #include "HUDuiDefaultKey.h" #include #include "Address.h" class ServerCommandKey : public HUDuiDefaultKey { public: ServerCommandKey(); bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); void init(); void adminInit(); void nonAdminInit(); private: std::string makePattern(const InAddr& address); void updatePrompt(); private: enum Mode { Kick, Kill, BanIp, Ban1, Ban2, Ban3, Showgroup, Setgroup, Removegroup, Ghost, Unban, Banlist, Playerlist, FlagReset, FlagUnusedReset, FlagUp, FlagShow, FlagHistory, IdleStats, ClientQuery, LagStats, Report, LagWarn, LagDrop, GameOver, CountDown, SuperKill, Shutdown, Grouplist, Groupperms, Vote, Poll, Veto, Password // leave this as the last item }; Mode mode; int startIndex; const int numModes; const int numNonAdminModes; static const Mode nonAdminModes[6]; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerLink.cxx000066400000000000000000000554041200563112200203130ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(_MSC_VER) #pragma warning(disable: 4786) #endif // interface header #include "ServerLink.h" // #include "MsgStrings.h" #if defined(DEBUG) #define NETWORK_STATS #endif // system headers #include #include #include #include #include #if !defined(_WIN32) #include #include #endif #include #include // common implementation headers #include "ErrorHandler.h" // invoke persistent rebuilding for current version dates #include "version.h" #if defined(NETWORK_STATS) #include "bzfio.h" #endif #include "TimeKeeper.h" #define UDEBUG if (UDEBUGMSG) printf #define UDEBUGMSG false #if defined(NETWORK_STATS) static TimeKeeper startTime; static uint32_t bytesSent; static uint32_t bytesReceived; static uint32_t packetsSent; static uint32_t packetsReceived; #endif #if defined(_WIN32) DWORD ThreadID; // Thread ID HANDLE hConnected; // "Connected" event HANDLE hThread; // Connection thread typedef struct { int query; CNCTType* addr; int saddr; } TConnect; TConnect conn; DWORD WINAPI ThreadConnect(LPVOID params) { TConnect *conn = (TConnect*)params; if(connect(conn->query, conn->addr, conn->saddr) >= 0) { SetEvent(hConnected); // Connect successful } ExitThread(0); return 0; } #endif // !defined(_WIN32) // FIXME -- packet recording FILE* packetStream = NULL; TimeKeeper packetStartTime; static const unsigned long serverPacket = 1; static const unsigned long endPacket = 0; ServerLink* ServerLink::server = NULL; ServerLink::ServerLink(const Address& serverAddress, int port) : state(SocketError), // assume failure fd(-1), // assume failure udpLength(0), udpBufferPtr(), ubuf() { int i; struct protoent* p; #if defined(_WIN32) BOOL off = FALSE; #else int off = 0; #endif // standard server has no special abilities; server_abilities = Nothing; // queue is empty urecvfd = -1; ulinkup = false; // initialize version to a bogus number strcpy(version, "BZFS0000"); // open connection to server. first connect to given port. // don't wait too long. int query = socket(AF_INET, SOCK_STREAM, 0); if (query < 0) return; struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr = serverAddress; UDEBUG("Remote %s\n", inet_ntoa(addr.sin_addr)); // for UDP, used later memcpy((unsigned char *)&usendaddr,(unsigned char *)&addr, sizeof(addr)); bool okay = true; int fdMax = query; struct timeval timeout; fd_set write_set; fd_set read_set; int nfound; #if !defined(_WIN32) okay = true; fdMax = query; if (BzfNetwork::setNonBlocking(query) < 0) { close(query); return; } if (connect(query, (CNCTType*)&addr, sizeof(addr)) < 0) { if (getErrno() != EINPROGRESS) { close(query); return; } FD_ZERO(&write_set); FD_SET((unsigned int)query, &write_set); timeout.tv_sec = long(5); timeout.tv_usec = 0; nfound = select(fdMax + 1, NULL, (fd_set*)&write_set, NULL, &timeout); if (nfound <= 0) { close(query); return; } int connectError; socklen_t errorLen = sizeof(int); if (getsockopt(query, SOL_SOCKET, SO_ERROR, &connectError, &errorLen) < 0) { close(query); return; } if (connectError != 0) { close(query); return; } } #else // Connection timeout for Windows // Initialize structure conn.query = query; conn.addr = (CNCTType*)&addr; conn.saddr = sizeof(addr); // Create event hConnected = CreateEvent(NULL, FALSE, FALSE, "Connected Event"); hThread = CreateThread(NULL, 0, ThreadConnect, &conn, 0, &ThreadID); okay = (WaitForSingleObject(hConnected, 5000) == WAIT_OBJECT_0); if(!okay) TerminateThread(hThread ,1); // Do some cleanup CloseHandle(hConnected); CloseHandle(hThread); #endif // !defined(_WIN32) if (!okay) { close(query); return; } // send out the connect header // this will let the server know we are BZFS protocol. // after the server gets this it will send back a version for us to check int sendRepply = ::send(query,BZ_CONNECT_HEADER,(int)strlen(BZ_CONNECT_HEADER),0); logDebugMessage(2,"CONNECT:send in connect returned %d\n",sendRepply); // wait to get data back. we are still blocking so these // calls should be sync. FD_ZERO(&read_set); FD_ZERO(&write_set); FD_SET((unsigned int)query, &read_set); FD_SET((unsigned int)query, &write_set); timeout.tv_sec = long(10); timeout.tv_usec = 0; // pick some limit to time out on ( in seconds ) double thisStartTime = TimeKeeper::getCurrent().getSeconds(); double connectTimeout = 30.0; if (BZDB.isSet("connectionTimeout")) connectTimeout = BZDB.eval("connectionTimeout") ; bool gotNetData = false; // loop calling select untill we read some data back. // its only 8 bytes so it better come back in one packet. int loopCount = 0; while(!gotNetData) { loopCount++; nfound = select(fdMax + 1, (fd_set*)&read_set, (fd_set*)&write_set, NULL, &timeout); // there has to be at least one socket active, or we are screwed if (nfound <= 0) { logDebugMessage(1,"CONNECT:select in connect failed, nfound = %d\n",nfound); close(query); return; } // try and get data back from the server i = recv(query, (char*)version, 8, 0); // if we got some, then we are done if (i > 0) { logDebugMessage(2,"CONNECT:got net data in connect, bytes read = %d\n",i); logDebugMessage(2,"CONNECT:Time To Connect = %f\n",(TimeKeeper::getCurrent().getSeconds() - thisStartTime)); gotNetData = true; } else { // if we have waited too long, then bail if ((TimeKeeper::getCurrent().getSeconds() - thisStartTime) > connectTimeout) { logDebugMessage(1,"CONNECT:connect time out failed\n"); logDebugMessage(2,"CONNECT:connect loop count = %d\n",loopCount); close(query); return; } TimeKeeper::sleep(0.25f); } } logDebugMessage(2,"CONNECT:connect loop count = %d\n",loopCount); // if we got back less then the expected connect responce (BZFSXXXX) // then something went bad, and we are done. if (i < 8) { close(query); return; } // since we are connected, we can go non blocking // on BSD sockets systems // all other messages after this are handled via the normal // message system #if !defined(_WIN32) if (BzfNetwork::setNonBlocking(query) < 0) { close(query); return; } #endif // FIXME is it ok to try UDP always? server_abilities |= CanDoUDP; if (strcmp(version, getServerVersion()) != 0) { state = BadVersion; if (strcmp(version, BanRefusalString) == 0) { state = Refused; char message[512]; int len = recv(query, (char*)message, 512, 0); if (len > 0) { message[len - 1] = 0; } else { message[0] = 0; } rejectionMessage = message; } close(query); return; } // read local player's id #if !defined(_WIN32) FD_ZERO(&read_set); FD_SET((unsigned int)query, &read_set); timeout.tv_sec = long(5); timeout.tv_usec = 0; nfound = select(fdMax + 1, (fd_set*)&read_set, NULL, NULL, &timeout); if (nfound <= 0) { close(query); return; } #endif // !defined(_WIN32) i = recv(query, (char *) &id, sizeof(id), 0); if (i < (int) sizeof(id)) return; if (id == 0xff) { state = Rejected; close(query); return; } #if !defined(_WIN32) if (BzfNetwork::setBlocking(query) < 0) { close(query); return; } #endif // !defined(_WIN32) fd = query; // turn on TCP no delay p = getprotobyname("tcp"); if (p) setsockopt(fd, p->p_proto, TCP_NODELAY, (SSOType)&off, sizeof(off)); // changed state = Okay; #if defined(NETWORK_STATS) bytesSent = 0; bytesReceived = 0; packetsSent = 0; packetsReceived = 0; #endif // FIXME -- packet recording if (getenv("BZFLAGSAVE")) { packetStream = fopen(getenv("BZFLAGSAVE"), "w"); packetStartTime = TimeKeeper::getCurrent(); } return; } ServerLink::~ServerLink() { if (state != Okay) return; shutdown(fd, 2); close(fd); if (urecvfd >= 0) close(urecvfd); urecvfd = -1; ulinkup = false; // FIXME -- packet recording if (packetStream) { long dt = (long)((TimeKeeper::getCurrent() - packetStartTime) * 10000.0f); size_t items_written = fwrite(&endPacket, sizeof(endPacket), 1, packetStream); if (items_written == 1) items_written = fwrite(&dt, sizeof(dt), 1, packetStream); if (items_written != 1) printError("Error writing on packetStream"); fclose(packetStream); } #if defined(NETWORK_STATS) const float dt = float(TimeKeeper::getCurrent() - startTime); logDebugMessage(1,"Server network statistics:\n"); logDebugMessage(1," elapsed time : %f\n", dt); logDebugMessage(1," bytes sent : %d (%f/sec)\n", bytesSent, (float)bytesSent / dt); logDebugMessage(1," packets sent : %d (%f/sec)\n", packetsSent, (float)packetsSent / dt); if (packetsSent != 0) logDebugMessage(1," bytes/packet : %f\n", (float)bytesSent / (float)packetsSent); logDebugMessage(1," bytes recieved : %d (%f/sec)\n", bytesReceived, (float)bytesReceived / dt); logDebugMessage(1," packets received: %d (%f/sec)\n", packetsReceived, (float)packetsReceived / dt); if (packetsReceived != 0) logDebugMessage(1," bytes/packet : %f\n", (float)bytesReceived / (float)packetsReceived); #endif } ServerLink* ServerLink::getServer() // const { return server; } void ServerLink::setServer(ServerLink* _server) { server = _server; } void ServerLink::send(uint16_t code, uint16_t len, const void* msg) { bool needForSpeed=false; if (state != Okay) return; // if (code != MsgPlayerUpdateSmall && code != MsgPlayerUpdate) // logDebugMessage(1,"send %s len %d\n",MsgStrings::strMsgCode(code),len); char msgbuf[MaxPacketLen]; void* buf = msgbuf; buf = nboPackUShort(buf, len); buf = nboPackUShort(buf, code); if (msg && len != 0) buf = nboPackString(buf, msg, len); if ((urecvfd>=0) && ulinkup ) { switch (code) { case MsgShotBegin: case MsgShotEnd: case MsgPlayerUpdate: case MsgPlayerUpdateSmall: case MsgGMUpdate: case MsgUDPLinkRequest: case MsgUDPLinkEstablished: needForSpeed=true; break; } } // MsgUDPLinkRequest always goes udp if (code == MsgUDPLinkRequest) needForSpeed=true; if (needForSpeed) { #ifdef TESTLINK if ((random()%TESTQUALTIY) != 0) #endif sendto(urecvfd, (const char *)msgbuf, (char*)buf - msgbuf, 0, &usendaddr, sizeof(usendaddr)); // we don't care about errors yet return; } int r = ::send(fd, (const char*)msgbuf, len + 4, 0); (void)r; // silence g++ #if defined(_WIN32) if (r == SOCKET_ERROR) { const int e = WSAGetLastError(); if (e == WSAENETRESET || e == WSAECONNABORTED || e == WSAECONNRESET || e == WSAETIMEDOUT) state = Hungup; r = 0; } #endif #if defined(NETWORK_STATS) bytesSent += r; packetsSent++; #endif } #ifdef WIN32 /* This is a really really fugly hack to get around winsock sillyness * The newer versions of winsock have a socken_t typedef, and there * doesn't seem to be any way to tell the versions apart. However, * VC++ helps us out here by treating typedef as #define * If we've got a socklen_t typedefed, define HAVE_SOCKLEN_T to * avoid #define'ing it in common.h */ #ifndef socklen_t #define socklen_t int #endif #endif //WIN32 int ServerLink::read(uint16_t& code, uint16_t& len, void* msg, int blockTime) { code = MsgNull; len = 0; if (state != Okay) return -1; if ((urecvfd >= 0) /* && ulinkup */) { if (!udpLength) { AddrLen recvlen = sizeof(urecvaddr); int n = recvfrom(urecvfd, ubuf, MaxPacketLen, 0, &urecvaddr, (socklen_t*) &recvlen); if (n > 0) { udpLength = n; udpBufferPtr = ubuf; } } if (udpLength) { // unpack header and get message udpLength -= 4; if (udpLength < 0) { udpLength = 0; return -1; } udpBufferPtr = (char *)nboUnpackUShort(udpBufferPtr, len); udpBufferPtr = (char *)nboUnpackUShort(udpBufferPtr, code); // if (code != MsgPlayerUpdateSmall && code != MsgPlayerUpdate && code != MsgGameTime) // logDebugMessage(1,"rcvd %s len %d\n",MsgStrings::strMsgCode(code),len); UDEBUG("<** UDP Packet Code %x Len %x\n",code, len); if (len > udpLength) { udpLength = 0; return -1; } memcpy((char *)msg, udpBufferPtr, len); udpBufferPtr += len; udpLength -= len; return 1; } if (UDEBUGMSG) printError("Fallback to normal TCP receive"); len = 0; code = MsgNull; blockTime = 0; } // block for specified period. default is no blocking (polling) struct timeval timeout; timeout.tv_sec = blockTime / 1000; timeout.tv_usec = blockTime - 1000 * timeout.tv_sec; // only check server fd_set read_set; FD_ZERO(&read_set); FD_SET((unsigned int)fd, &read_set); int nfound = select(fd+1, (fd_set*)&read_set, NULL, NULL, (struct timeval*)(blockTime >= 0 ? &timeout : NULL)); if (nfound == 0) return 0; if (nfound < 0) return -1; // printError("<** TCP Packet Code Received %d", time(0)); // FIXME -- don't really want to take the chance of waiting forever // on the remaining select() calls, but if the server and network // haven't been hosed then the data will get here soon. And if the // server or network is down then we don't really care anyway. // get packet header -- keep trying until we get 4 bytes or an error char headerBuffer[4]; int rlen = 0; rlen = recv(fd, (char*)headerBuffer, 4, 0); int tlen = rlen; while (rlen >= 1 && tlen < 4) { printError("ServerLink::read() loop"); FD_ZERO(&read_set); FD_SET((unsigned int)fd, &read_set); nfound = select(fd+1, (fd_set*)&read_set, NULL, NULL, NULL); if (nfound == 0) continue; if (nfound < 0) return -1; rlen = recv(fd, (char*)headerBuffer + tlen, 4 - tlen, 0); if (rlen >= 0) tlen += rlen; } if (tlen < 4) return -1; #if defined(NETWORK_STATS) bytesReceived += 4; packetsReceived++; #endif // unpack header and get message void* buf = headerBuffer; buf = nboUnpackUShort(buf, len); buf = nboUnpackUShort(buf, code); // logDebugMessage(1,"rcvd %s len %d\n",MsgStrings::strMsgCode(code),len); if (len > MaxPacketLen) return -1; if (len > 0) rlen = recv(fd, (char*)msg, int(len), 0); else rlen = 0; #if defined(NETWORK_STATS) if (rlen >= 0) bytesReceived += rlen; #endif if (rlen != int(len)) { // keep reading until we get the whole message tlen = rlen; while (rlen >= 1 && tlen < int(len)) { FD_ZERO(&read_set); FD_SET((unsigned int)fd, &read_set); nfound = select(fd+1, (fd_set*)&read_set, 0, 0, NULL); if (nfound == 0) continue; if (nfound < 0) return -1; rlen = recv(fd, (char*)msg + tlen, int(len) - tlen, 0); if (rlen >= 0) tlen += rlen; #if defined(NETWORK_STATS) if (rlen >= 0) bytesReceived += rlen; #endif } if (tlen < int(len)) return -1; } // FIXME -- packet recording if (packetStream) { long dt = (long)((TimeKeeper::getCurrent() - packetStartTime) * 10000.0f); size_t items_written = fwrite(&serverPacket, sizeof(serverPacket), 1, packetStream); if (items_written == 1) items_written = fwrite(&dt, sizeof(dt), 1, packetStream); if (items_written == 1) items_written = fwrite(headerBuffer, 4, 1, packetStream); if (items_written == 1) items_written = fwrite(msg, len, 1, packetStream); if (items_written != 1) printError("Error writing on packetStream"); } return 1; } void ServerLink::sendEnter(PlayerType type, TeamColor team, const char* name, const char* motto, const char* token) { if (state != Okay) return; char msg[PlayerIdPLen + 4 + CallSignLen + MottoLen + TokenLen + VersionLen]; ::memset(msg, 0, sizeof(msg)); void* buf = msg; buf = nboPackUShort(buf, uint16_t(type)); buf = nboPackUShort(buf, uint16_t(team)); ::memcpy(buf, name, ::strlen(name)); buf = (void*)((char*)buf + CallSignLen); ::memcpy(buf, motto, ::strlen(motto)); buf = (void*)((char*)buf + MottoLen); ::memcpy(buf, token, ::strlen(token)); buf = (void*)((char*)buf + TokenLen); ::memcpy(buf, getAppVersion(), ::strlen(getAppVersion()) + 1); buf = (void*)((char*)buf + VersionLen); send(MsgEnter, sizeof(msg), msg); } bool ServerLink::readEnter (std::string& reason, uint16_t& code, uint16_t& rejcode) { // wait for response uint16_t len; char msg[MaxPacketLen]; while (true) { if (this->read(code, len, msg, -1) < 0) { reason = "Communication error joining game [No immediate respose]."; return false; } if (code == MsgAccept) { return true; } else if (code == MsgSuperKill) { reason = "Server forced disconnection."; return false; } else if (code == MsgReject) { void *buf; char buffer[MessageLen]; buf = nboUnpackUShort (msg, rejcode); // filler for now buf = nboUnpackString (buf, buffer, MessageLen); buffer[MessageLen - 1] = '\0'; reason = buffer; return false; } // ignore other codes so that bzadmin doesn't choke // on the MsgMessage's that the server can send before // the MsgAccept (authorization holdoff, etc...) } return true; } void ServerLink::sendCaptureFlag(TeamColor team) { char msg[2]; nboPackUShort(msg, uint16_t(team)); send(MsgCaptureFlag, sizeof(msg), msg); } void ServerLink::sendGrabFlag(int flagIndex) { char msg[2]; nboPackUShort(msg, uint16_t(flagIndex)); send(MsgGrabFlag, sizeof(msg), msg); } void ServerLink::sendDropFlag(const float* position) { char msg[12]; void* buf = msg; buf = nboPackVector(buf, position); send(MsgDropFlag, sizeof(msg), msg); } void ServerLink::sendKilled(const PlayerId& killer, int reason, int shotId, const FlagType* flagType, int phydrv) { char msg[PlayerIdPLen + 2 + 2 + FlagPackSize + 4]; void* buf = msg; buf = nboPackUByte(buf, killer); buf = nboPackUShort(buf, int16_t(reason)); buf = nboPackShort(buf, int16_t(shotId)); buf = flagType->pack(buf); if (reason == PhysicsDriverDeath) { buf = nboPackInt(buf, phydrv); } send(MsgKilled, (char*)buf - (char*)msg, msg); } #ifndef BUILDING_BZADMIN void ServerLink::sendPlayerUpdate(Player* player) { char msg[PlayerUpdatePLenMax]; // Send the time frozen at each start of scene iteration, as all // dead reckoning use that const float timeStamp = float(TimeKeeper::getTick() - TimeKeeper::getNullTime()); void* buf = msg; uint16_t code; buf = nboPackFloat(buf, timeStamp); buf = nboPackUByte(buf, player->getId()); // code will be MsgPlayerUpdate or MsgPlayerUpdateSmall buf = player->pack(buf, code); // variable length const int len = (char*)buf - (char*)msg; send(code, len, msg); } #endif void ServerLink::sendBeginShot(const FiringInfo& info) { char msg[FiringInfoPLen]; void* buf = msg; buf = info.pack(buf); send(MsgShotBegin, sizeof(msg), msg); } void ServerLink::sendEndShot(const PlayerId& source, int shotId, int reason) { char msg[PlayerIdPLen + 4]; void* buf = msg; buf = nboPackUByte(buf, source); buf = nboPackShort(buf, int16_t(shotId)); buf = nboPackUShort(buf, uint16_t(reason)); send(MsgShotEnd, sizeof(msg), msg); } void ServerLink::sendAlive() { send(MsgAlive, 0, NULL); } void ServerLink::sendTeleport(int from, int to) { char msg[4]; void* buf = msg; buf = nboPackUShort(buf, uint16_t(from)); buf = nboPackUShort(buf, uint16_t(to)); send(MsgTeleport, sizeof(msg), msg); } void ServerLink::sendTransferFlag(const PlayerId& from, const PlayerId& to) { char msg[PlayerIdPLen*2]; void* buf = msg; buf = nboPackUByte(buf, from); buf = nboPackUByte(buf, to); send(MsgTransferFlag, sizeof(msg), msg); } void ServerLink::sendNewRabbit() { send(MsgNewRabbit, 0, NULL); } void ServerLink::sendPaused(bool paused) { uint8_t p = paused; send(MsgPause, 1, &p); } void ServerLink::sendAutoPilot(bool autopilot) { uint8_t p = autopilot; send(MsgAutoPilot, 1, &p); } void ServerLink::sendUDPlinkRequest() { if ((server_abilities & CanDoUDP) != CanDoUDP) return; // server does not support udp (future list server test) char msg[1]; unsigned short localPort; void* buf = msg; struct sockaddr_in serv_addr; if ((urecvfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { return; // we cannot comply } #if 1 AddrLen addr_len = sizeof(serv_addr); if (getsockname(fd, (struct sockaddr*)&serv_addr, (socklen_t*) &addr_len) < 0) { printError("Error: getsockname() failed, cannot get TCP port?"); return; } if (bind(urecvfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0) { printError("Error: getsockname() failed, cannot get TCP port?"); return; // we cannot get udp connection, bail out } #else // TODO if nobody complains kill this old port 17200 code for (int port=17200; port < 65000; port++) { ::memset((unsigned char *)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(port); if (bind(urecvfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == 0) { break; } } #endif localPort = ntohs(serv_addr.sin_port); memcpy((char *)&urecvaddr,(char *)&serv_addr, sizeof(serv_addr)); if (debugLevel >= 1) { std::vector args; char lps[10]; sprintf(lps, "%d", localPort); args.push_back(lps); printError("Network: Created local UDP downlink port {1}", &args); } buf = nboPackUByte(buf, id); if (BzfNetwork::setNonBlocking(urecvfd) < 0) { printError("Error: Unable to set NonBlocking for UDP receive socket"); } send(MsgUDPLinkRequest, sizeof(msg), msg); } // heard back from server that we can send udp void ServerLink::enableOutboundUDP() { ulinkup = true; if (debugLevel >= 1) printError("Server got our UDP, using UDP to server"); } // confirm that server can send us UDP void ServerLink::confirmIncomingUDP() { // This is really a hack. enableOutboundUDP will be setting this // but frequently the udp handshake will finish first so might as // well start with udp as soon as we can ulinkup = true; if (debugLevel >= 1) printError("Got server's UDP packet back, server using UDP"); send(MsgUDPLinkEstablished, 0, NULL); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerLink.h000066400000000000000000000070561200563112200177400ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Encapsulates communication between local player and the server. */ #ifndef BZF_SERVER_LINK_H #define BZF_SERVER_LINK_H #include "common.h" #include #include "global.h" #include "Address.h" #include "Protocol.h" #include "ShotPath.h" #include "Flag.h" class ServerLink { public: enum State { Okay = 0, SocketError = 1, Rejected = 2, BadVersion = 3, Hungup = 4, // only used by Winsock CrippledVersion = 5, Refused = 6 }; enum Abilities { Nothing = 0, CanDoUDP = 1, SendScripts = 2, SendTextures = 4, HasMessageLink = 8 }; ServerLink(const Address& serverAddress, int port = ServerPort); ~ServerLink(); State getState() const; const std::string& getRejectionMessage() { return rejectionMessage; } int getSocket() const; // file descriptor actually const PlayerId& getId() const; const char* getVersion() const; void send(uint16_t code, uint16_t len, const void* msg); // if millisecondsToBlock < 0 then block forever int read(uint16_t& code, uint16_t& len, void* msg, int millisecondsToBlock = 0); void sendEnter(PlayerType, TeamColor, const char* name, const char* motto, const char* token); bool readEnter(std::string& reason, uint16_t& code, uint16_t& rejcode); void sendCaptureFlag(TeamColor); void sendGrabFlag(int flagIndex); void sendDropFlag(const float* position); void sendKilled(const PlayerId&, int reason, int shotId, const FlagType* flag, int phydrv); // FIXME -- This is very ugly, but required to build bzadmin with gcc 2.9.5. // It should be changed to something cleaner. #ifndef BUILDING_BZADMIN void sendPlayerUpdate(Player*); #endif void sendBeginShot(const FiringInfo&); void sendEndShot(const PlayerId&, int shotId, int reason); void sendAlive(); void sendTeleport(int from, int to); void sendTransferFlag(const PlayerId&, const PlayerId&); void sendNewRabbit(); void sendPaused(bool paused); void sendAutoPilot(bool autopilot); void sendUDPlinkRequest(); static ServerLink* getServer(); // const static void setServer(ServerLink*); void enableOutboundUDP(); void confirmIncomingUDP(); private: State state; int fd; struct sockaddr usendaddr; int urecvfd; struct sockaddr urecvaddr; // the clients udp listen address bool ulinkup; PlayerId id; char version[9]; static ServerLink* server; int server_abilities; std::string rejectionMessage; int udpLength; char *udpBufferPtr; char ubuf[MaxPacketLen]; }; #define SEND 1 #define RECEIVE 0 // // ServerLink // inline ServerLink::State ServerLink::getState() const { return state; } inline int ServerLink::getSocket() const { return fd; } inline const PlayerId& ServerLink::getId() const { return id; } inline const char* ServerLink::getVersion() const { return version; } #endif // BZF_SERVER_LINK_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerListFilter.cxx000066400000000000000000000511741200563112200214770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "ServerListFilter.h" // system headers #include #include #include #include // common implementation headers #include "AnsiCodes.h" #include "ServerItem.h" #include "TextUtils.h" #include "bzglob.h" #include "global.h" // local headers #include "playing.h" std::map ServerListFilter::boolMap; std::map ServerListFilter::rangeMap; std::map ServerListFilter::patternMap; //============================================================================// static void errorMessage(const std::string& msg) { addMessage(NULL, ANSI_STR_FG_RED "ServerListFilter: " + msg); } //============================================================================// ServerListFilter::ServerListFilter() : orFilter(NULL) { fflush(stdout); reset(); } ServerListFilter::ServerListFilter(const std::string& filter) : orFilter(NULL) { fflush(stdout); parse(filter); } //============================================================================// void ServerListFilter::reset() { source = ""; // OR clauses if (orFilter) { delete orFilter; orFilter = NULL; } // pattern filters addrPat .reset(); descPat .reset(); addrDescPat .reset(); // boolean filters jump .reset(); rico .reset(); flags .reset(); teams .reset(); handi .reset(); rabbit .reset(); replay .reset(); inertia .reset(); antidote .reset(); favorite .reset(); cached .reset(); // range filters shots .reset(); players .reset(); freeSlots .reset(); validTeams .reset(); maxTime .reset(); maxPlayers .reset(); maxTeamScore .reset(); maxPlayerScore .reset(); shakeWins .reset(); shakeTime .reset(); rogueCount .reset(); redCount .reset(); greenCount .reset(); blueCount .reset(); purpleCount .reset(); observerCount .reset(); rogueMax .reset(); redMax .reset(); greenMax .reset(); blueMax .reset(); purpleMax .reset(); observerMax .reset(); rogueFree .reset(); redFree .reset(); greenFree .reset(); blueFree .reset(); purpleFree .reset(); observerFree .reset(); } //============================================================================// static int countPlayers(const ServerItem& item) { const PingPacket& ping = item.ping; int players = 0; players += ping.rogueCount; players += ping.redCount; players += ping.greenCount; players += ping.blueCount; players += ping.purpleCount; return players; } static int countFreeSlots(const ServerItem& item) { const PingPacket& ping = item.ping; int freeSlots = 0; freeSlots += (ping.rogueMax - ping.rogueCount); freeSlots += (ping.redMax - ping.redCount); freeSlots += (ping.greenMax - ping.greenCount); freeSlots += (ping.blueMax - ping.blueCount); freeSlots += (ping.purpleMax - ping.purpleCount); // also check against the 'maxPlayers' limit const int totalPlayers = countPlayers(item) + ping.observerCount; const int totalFreeSlots = ping.maxPlayers - totalPlayers; if (freeSlots > totalFreeSlots) { freeSlots = totalFreeSlots; } return freeSlots; } static int countValidTeams(const ServerItem& item) { const PingPacket& ping = item.ping; int count = 0; if (ping.rogueMax > 0) { count++; } if (ping.redMax > 0) { count++; } if (ping.greenMax > 0) { count++; } if (ping.blueMax > 0) { count++; } if (ping.purpleMax > 0) { count++; } return count; } static bool isReplay(const ServerItem& item) { return ((item.ping.observerMax == 16) && (item.ping.maxPlayers == 200)); } //============================================================================// bool ServerListFilter::check(const ServerItem& item) const { // OR clauses if (orFilter && orFilter->check(item)) { return true; } // pattern filters std::string addr, desc; item.splitAddrTitle(addr, desc); if (!addrPat.check(addr)) { return false; } if (!descPat.check(desc)) { return false; } if (!addrDescPat.check(addr) && !addrDescPat.check(desc)) { return false; } const PingPacket& p = item.ping; // boolean filters const uint16_t type = p.gameType; if (!flags .check(type == TeamFFA)) { return false; } if (!teams .check(type == ClassicCTF)) { return false; } if (!rabbit .check(type == RabbitChase)) { return false; } const uint16_t options = p.gameOptions; if (!jump .check(options & JumpingGameStyle)) { return false; } if (!rico .check(options & RicochetGameStyle)) { return false; } if (!handi .check(options & HandicapGameStyle)) { return false; } if (!inertia .check(options & InertiaGameStyle)) { return false; } if (!antidote .check(options & AntidoteGameStyle)) { return false; } if (!replay .check(isReplay(item))) { return false; } if (!favorite .check(item.favorite)) { return false; } if (!cached .check(item.cached)) { return false; } // range filters if (!shots .check(p.maxShots)) { return false; } if (!players .check(countPlayers(item))) { return false; } if (!freeSlots .check(countFreeSlots(item))) { return false; } if (!validTeams .check(countValidTeams(item))) { return false; } if (!maxTime .check(p.maxTime)) { return false; } if (!maxPlayers .check(p.maxPlayers)) { return false; } if (!maxTeamScore .check(p.maxTeamScore)) { return false; } if (!maxPlayerScore .check(p.maxPlayerScore)) { return false; } if (!shakeWins .check(p.shakeWins)) { return false; } if (!shakeTime .check(p.shakeTimeout)) { return false; } if (!rogueCount .check(p.rogueCount)) { return false; } if (!redCount .check(p.redCount)) { return false; } if (!greenCount .check(p.greenCount)) { return false; } if (!blueCount .check(p.blueCount)) { return false; } if (!purpleCount .check(p.purpleCount)) { return false; } if (!observerCount .check(p.observerCount)) { return false; } if (!rogueMax .check(p.rogueMax)) { return false; } if (!redMax .check(p.redMax)) { return false; } if (!greenMax .check(p.greenMax)) { return false; } if (!blueMax .check(p.blueMax)) { return false; } if (!purpleMax .check(p.purpleMax)) { return false; } if (!observerMax .check(p.observerMax)) { return false; } const int totalFree = p.maxPlayers - (countPlayers(item) + p.observerCount); #define FREE_SLOTS(T) std::min(totalFree, p. T ## Max - p.T ## Count) if (!rogueFree .check(FREE_SLOTS(rogue))) { return false; } if (!redFree .check(FREE_SLOTS(red))) { return false; } if (!greenFree .check(FREE_SLOTS(green))) { return false; } if (!blueFree .check(FREE_SLOTS(blue))) { return false; } if (!purpleFree .check(FREE_SLOTS(purple))) { return false; } if (!observerFree .check(FREE_SLOTS(observer))) { return false; } #undef FREE_SLOTS return true; } //============================================================================// static std::string stripLeadingWhite(const std::string& s) { if (s.empty()) { return s; } const std::string::size_type pos = s.find_first_not_of(" \t"); if (pos == std::string::npos) { return s; } return s.substr(pos); } bool ServerListFilter::parse(const std::string& filter) { setupBoolMap(); setupRangeMap(); setupPatternMap(); reset(); source = filter; std::string adGlobStr; std::string filterStr; const std::string::size_type optPos = source.find_first_of('/'); if (optPos == std::string::npos) { adGlobStr = source; } else { adGlobStr = source.substr(0, optPos); filterStr = source.substr(optPos + 1); const std::string::size_type orPos = filterStr.find_first_of('/'); if (orPos != std::string::npos) { orFilter = new ServerListFilter; orFilter->parse("/" + filterStr.substr(orPos + 1)); filterStr.resize(orPos); } } if (!adGlobStr.empty()) { addrDescPat.setupGlob(adGlobStr, true); } const std::vector filters = TextUtils::tokenize(filterStr, ","); for (size_t i = 0; i < filters.size(); i++) { parseFilter(filters[i]); } return true; } //============================================================================// bool ServerListFilter::parseFilter(const std::string& f) { char op; std::string label, param; switch (parseFilterType(f, op, label, param)) { case '#': { return true; } case 'b': { return parseBoolFilter(label, op); } case 'r': { return parseRangeFilter(label, op, param); } case 'p': { return parsePatternFilter(label, op, param); } default: { errorMessage("invalid filter, '" + f + "'"); return false; } } } char ServerListFilter::parseFilterType(const std::string& _f, char& op, std::string& label, std::string& param) { const std::string f = stripLeadingWhite(_f); if (f.empty() || (f[0] == '#')) { return '#'; // comment } if ((f[0] == '+') || (f[0] == '-')) { label = f.substr(1); param = ""; op = f[0]; return 'b'; // boolean } const char* s = f.c_str(); const char* c = s; while ((*c != 0) && (isalnum(*c) || (*c == '_'))) { c++; } switch (*c) { case '=': case '>': case '<': { label = std::string(s, c - s); if ((*c == '=') || (*(c + 1) != '=')) { param = std::string(c + 1); op = *c; } else { param = std::string(c + 2); op = *c + 0x3f; // map [<>] to [{}] } return 'r'; // range } case ')': case ']': { label = std::string(s, c - s); param = std::string(c + 1); op = *c; return 'p'; // pattern } } return 0; // invalid } //============================================================================// bool ServerListFilter::parseBoolFilter(const std::string& label, char op) { std::map::const_iterator it = boolMap.find(label); if (it == boolMap.end()) { errorMessage("unknown boolean label, '" + label + "'"); return false; } BoolFilter* bf = (BoolFilter*)((char*)this + it->second); bf->active = true; bf->value = (op == '+'); return true; } bool ServerListFilter::parseRangeFilter(const std::string& label, char op, const std::string& param) { std::map::const_iterator it = rangeMap.find(label); if (it == rangeMap.end()) { errorMessage("unknown range label, '" + label + "'"); return false; } const char* s = param.c_str(); char* e; float value = (float)strtod(s, &e); if ((e == s) || (param.size() != size_t(e - s))) { errorMessage("bad range value, '" + param + "'"); return false; } RangeFilter* rf = (RangeFilter*)((char*)this + it->second); switch (op) { case '<': { rf->maxActive = true; rf->maxValue = value; break; } case '{': { rf->maxActive = true; rf->maxValue = value + 1.0f; break; } case '>': { rf->minActive = true; rf->minValue = value; break; } case '}': { rf->minActive = true; rf->minValue = value - 1.0f; break; } case '=': { rf->minActive = true; rf->maxActive = true; rf->minValue = value - 1.0f; rf->maxValue = value + 1.0f; break; } default: { return false; } } return true; } bool ServerListFilter::parsePatternFilter(const std::string& label, char op, const std::string& param) { const std::string lower = TextUtils::tolower(label); std::map::const_iterator it = patternMap.find(lower); if (it == patternMap.end()) { errorMessage("unknown pattern label, '" + label + "'"); return false; } bool useGlob; switch (op) { case ')': { useGlob = true; break; } case ']': { useGlob = false; break; } default: { return false; } } bool noCase = islower(label[0]); PatternFilter* pf = (PatternFilter*)((char*)this + it->second); return useGlob ? pf->setupGlob(param, noCase) : pf->setupRegex(param, noCase); } //============================================================================// // // Filter name maps // #undef OFFSETOF #define OFFSETOF(x) (size_t)((char*)&this->x - (char*)this) void ServerListFilter::setupBoolMap() { if (!boolMap.empty()) { return; } std::map& m = boolMap; m["j"] = m["jump"] = OFFSETOF(jump); m["r"] = m["rico"] = OFFSETOF(rico); m["f"] = m["flags"] = OFFSETOF(flags); m["t"] = m["teams"] = OFFSETOF(teams); m["h"] = m["handicap"] = OFFSETOF(handi); m["R"] = m["rabbit"] = OFFSETOF(rabbit); m["P"] = m["replay"] = OFFSETOF(replay); m["i"] = m["inertia"] = OFFSETOF(inertia); m["a"] = m["antidote"] = OFFSETOF(antidote); m["F"] = m["favorite"] = OFFSETOF(favorite); m["C"] = m["cached"] = OFFSETOF(cached); } void ServerListFilter::setupRangeMap() { if (!rangeMap.empty()) { return; } std::map& m = rangeMap; m["s"] = m["shots"] = OFFSETOF(shots); m["p"] = m["players"] = OFFSETOF(players); m["f"] = m["freeSlots"] = OFFSETOF(freeSlots); m["vt"] = m["validTeams"] = OFFSETOF(validTeams); m["mt"] = m["maxTime"] = OFFSETOF(maxTime); m["mp"] = m["maxPlayers"] = OFFSETOF(maxPlayers); m["mts"] = m["maxTeamScore"] = OFFSETOF(maxTeamScore); m["mps"] = m["maxPlayerScore"] = OFFSETOF(maxPlayerScore); m["sw"] = m["shakeWins"] = OFFSETOF(shakeWins); m["st"] = m["shakeTime"] = OFFSETOF(shakeTime); m["Rm"] = m["rogueMax"] = OFFSETOF(rogueMax); m["rm"] = m["redMax"] = OFFSETOF(redMax); m["gm"] = m["greenMax"] = OFFSETOF(greenMax); m["bm"] = m["blueMax"] = OFFSETOF(blueMax); m["pm"] = m["purpleMax"] = OFFSETOF(purpleMax); m["om"] = m["observerMax"] = OFFSETOF(observerMax); m["Rp"] = m["roguePlayers"] = OFFSETOF(rogueCount); m["rp"] = m["redPlayers"] = OFFSETOF(redCount); m["gp"] = m["greenPlayers"] = OFFSETOF(greenCount); m["bp"] = m["bluePlayers"] = OFFSETOF(blueCount); m["pp"] = m["purplePlayers"] = OFFSETOF(purpleCount); m["op"] = m["observerPlayers"] = OFFSETOF(observerCount); m["Rf"] = m["rogueFree"] = OFFSETOF(rogueFree); m["rf"] = m["redFree"] = OFFSETOF(redFree); m["gf"] = m["greenFree"] = OFFSETOF(greenFree); m["bf"] = m["blueFree"] = OFFSETOF(blueFree); m["pf"] = m["purpleFree"] = OFFSETOF(purpleFree); m["of"] = m["observerFree"] = OFFSETOF(observerFree); } void ServerListFilter::setupPatternMap() { if (!patternMap.empty()) { return; } std::map& m = patternMap; m["a"] = m["addr"] = m["address"] = OFFSETOF(addrPat); m["d"] = m["desc"] = m["description"] = OFFSETOF(descPat); m["ad"] = m["addrdesc"] = OFFSETOF(addrDescPat); } bool ServerListFilter::isBoolLabel(const std::string& label) { return boolMap.find(label) != boolMap.end(); } bool ServerListFilter::isRangeLabel(const std::string& label) { return rangeMap.find(label) != rangeMap.end(); } bool ServerListFilter::isPatternLabel(const std::string& label) { return patternMap.find(TextUtils::tolower(label)) != patternMap.end(); } //============================================================================// void ServerListFilter::print(const std::string& origIndent) const { printf("%sServerListFilter <'%s'>\n", origIndent.c_str(), source.c_str()); const std::string indent = origIndent + " "; // pattern filters addrPat .print("addrPat", indent); descPat .print("descPat", indent); addrDescPat .print("addrDescPat", indent); // boolean filters jump .print("jump", indent); rico .print("rico", indent); flags .print("flags", indent); teams .print("teams", indent); handi .print("handi", indent); rabbit .print("rabbit", indent); replay .print("replay", indent); inertia .print("inertia", indent); antidote .print("antidote", indent); favorite .print("favorite", indent); cached .print("cached", indent); // range filters shots .print("shots", indent); players .print("players", indent); freeSlots .print("freeSlots", indent); validTeams .print("validTeams", indent); maxTime .print("maxTime", indent); maxPlayers .print("maxPlayers", indent); maxTeamScore .print("maxTeamScore", indent); maxPlayerScore .print("maxPlayerScore", indent); shakeWins .print("shakeWins", indent); shakeTime .print("shakeTime", indent); rogueCount .print("rogueCount", indent); redCount .print("redCount", indent); greenCount .print("greenCount", indent); blueCount .print("blueCount", indent); purpleCount .print("purpleCount", indent); observerCount .print("observerCount", indent); rogueMax .print("rogueMax", indent); redMax .print("redMax", indent); greenMax .print("greenMax", indent); blueMax .print("blueMax", indent); purpleMax .print("purpleMax", indent); observerMax .print("observerMax", indent); rogueFree .print("rogueFree", indent); redFree .print("redFree", indent); greenFree .print("greenFree", indent); blueFree .print("blueFree", indent); purpleFree .print("purpleFree", indent); observerFree .print("observerFree", indent); // OR clauses if (orFilter) { orFilter->print(indent); } } //============================================================================// // // ServerListFilter::PatternFilter // void ServerListFilter::PatternFilter::reset() { type = NoPattern; noCase = true; pattern = ""; if (re) { regfree(re); delete re; re = NULL; } } bool ServerListFilter::PatternFilter::setupGlob(const std::string& _pattern, bool _noCase) { reset(); noCase = _noCase; pattern = _pattern; if (pattern.empty()) { reset(); return false; } if (noCase) { pattern = TextUtils::tolower(pattern); } if ((pattern.find("*") == std::string::npos) && (pattern.find("?") == std::string::npos)) { pattern = "*" + pattern + "*"; } type = GlobPattern; return true; } bool ServerListFilter::PatternFilter::setupRegex(const std::string& _pattern, bool _noCase) { reset(); noCase = _noCase; pattern = _pattern; int opts = REG_EXTENDED | REG_NOSUB; if (noCase) { opts |= REG_ICASE; } re = new regex_t; const int errcode = regcomp(re, pattern.c_str(), opts); if (errcode != 0) { char errbuf[256]; const size_t len = regerror(errcode, re, errbuf, sizeof(errbuf)); const std::string errstr(errbuf, len); errorMessage("bad regex, " + errstr + " '" + pattern + "'"); reset(); return false; } type = RegexPattern; return true; } bool ServerListFilter::PatternFilter::check(const std::string& s) const { switch (type) { case NoPattern: { break; } case RegexPattern: { return (regexec(re, s.c_str(), 0, NULL, 0) == 0); } case GlobPattern: { if (noCase) { return glob_match(pattern, TextUtils::tolower(s)); } else { return glob_match(pattern, s); } } } return true; } //============================================================================// // // ServerListFilter::*Filter::print() // void ServerListFilter::BoolFilter::print(const std::string& name, const std::string& indent) const { if (active) { printf("%s%s = %s\n", indent.c_str(), name.c_str(), value ? "true" : "false"); } } void ServerListFilter::RangeFilter::print(const std::string& name, const std::string& indent) const { if (!minActive && !maxActive) { return; } else if (minActive && maxActive) { printf("%s%.3g < %s < %.3g\n", indent.c_str(), minValue, name.c_str(), maxValue); } else if (minActive) { printf("%s%s > %.3g\n", indent.c_str(), name.c_str(), minValue); } else if (maxActive) { printf("%s%s < %.3g\n", indent.c_str(), name.c_str(), maxValue); } } void ServerListFilter::PatternFilter::print(const std::string& name, const std::string& indent) const { if (type == NoPattern) { return; } const char* typeStr = (type == GlobPattern) ? "glob" : "regex"; const char* caseStr = noCase ? "nocase" : "case"; printf("%s%s = '%s' <%s|%s>\n", indent.c_str(), name.c_str(), pattern.c_str(), typeStr, caseStr); } //============================================================================// bzflag-2.4.2+ds1/src/bzflag/ServerListFilter.h000066400000000000000000000122371200563112200211210ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERLISTFILTER_H__ #define __SERVERLISTFILTER_H__ #include "common.h" #include #include class ServerItem; class ServerListFilter { private: struct BoolFilter { static bool parse(const std::string& s); BoolFilter() { reset(); } void reset() { active = false; value = false; } bool check(bool v) const { return !active || (v == value); } void print(const std::string& name, const std::string& indent) const; bool active; bool value; }; struct RangeFilter { static bool parse(const std::string& s); RangeFilter(): minValue(), maxValue() { reset(); } void reset() { minActive = maxActive = false; } bool check(float v) const { return !(minActive && (v <= minValue)) && !(maxActive && (v >= maxValue)); } bool check(int v) const { return check(float(v)); } void print(const std::string& name, const std::string& indent) const; float minValue, maxValue; bool minActive, maxActive; }; struct PatternFilter { enum PatternType { NoPattern = 0, GlobPattern = 1, RegexPattern = 2 }; static bool parse(const std::string& s); PatternFilter() : re(NULL) { reset(); } ~PatternFilter() { reset(); } bool setupGlob(const std::string& pattern, bool noCase); bool setupRegex(const std::string& pattern, bool noCase); void reset(); bool check(const std::string& s) const; void print(const std::string& name, const std::string& indent) const; PatternType type; bool noCase; std::string pattern; regex_t* re; private: // no copying PatternFilter(const PatternFilter&); PatternFilter& operator=(const PatternFilter&); }; //==========================================================================// public: ServerListFilter(); ServerListFilter(const std::string& filter); bool parse(const std::string& filter); const std::string& getSource() const { return source; } bool check(const ServerItem& item) const; bool operator==(const ServerListFilter& f) const { return (source == f.source); } bool operator!=(const ServerListFilter& f) const { return (source != f.source); } void print(const std::string& indent = "") const; private: // no copying ServerListFilter(const ServerListFilter&); ServerListFilter& operator=(const ServerListFilter&); public: static bool isBoolLabel(const std::string& label); static bool isRangeLabel(const std::string& label); static bool isPatternLabel(const std::string& label); static char parseFilterType(const std::string& f, char& op, std::string& label, std::string& param); private: void reset(); bool parseFilter(const std::string& f); bool parseBoolFilter(const std::string& label, char op); bool parseRangeFilter(const std::string& label, char op, const std::string& param); bool parsePatternFilter(const std::string& label, char op, const std::string& param); private: std::string source; // 'OR' clause chaining ServerListFilter* orFilter; // pattern filters PatternFilter addrPat; PatternFilter descPat; PatternFilter addrDescPat; // boolean filters BoolFilter jump; BoolFilter rico; BoolFilter flags; BoolFilter teams; BoolFilter handi; BoolFilter rabbit; BoolFilter replay; BoolFilter inertia; BoolFilter antidote; BoolFilter favorite; BoolFilter cached; // range filters RangeFilter shots; RangeFilter players; RangeFilter freeSlots; RangeFilter validTeams; RangeFilter maxTime; RangeFilter maxPlayers; RangeFilter maxTeamScore; RangeFilter maxPlayerScore; RangeFilter shakeWins; RangeFilter shakeTime; RangeFilter rogueCount; RangeFilter redCount; RangeFilter greenCount; RangeFilter blueCount; RangeFilter purpleCount; RangeFilter observerCount; RangeFilter rogueMax; RangeFilter redMax; RangeFilter greenMax; RangeFilter blueMax; RangeFilter purpleMax; RangeFilter observerMax; RangeFilter rogueFree; RangeFilter redFree; RangeFilter greenFree; RangeFilter blueFree; RangeFilter purpleFree; RangeFilter observerFree; private: void setupBoolMap(); void setupRangeMap(); void setupPatternMap(); static std::map boolMap; static std::map rangeMap; static std::map patternMap; }; #endif /* __SERVERLISTFILTER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerMenu.cxx000066400000000000000000000654571200563112200203330ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ServerMenu.h" // system headers #include /* common implementation headers */ #include "FontManager.h" #include "TextUtils.h" #include "AnsiCodes.h" /* local implementation headers */ #include "MainMenu.h" #include "HUDDialogStack.h" #include "playing.h" #include "HUDui.h" #include "ServerListFilter.h" const int ServerMenu::NumReadouts = 24; const int ServerMenu::NumItems = 10; static std::string colorizeSearch(const std::string& s); bool ServerMenuDefaultKey::keyPress(const BzfKeyEvent& key) { if (key.ascii == 0) { switch (key.button) { case BzfKeyEvent::Up: { if (HUDui::getFocus()) { if (!menu->getFind()) { menu->setSelected(menu->getSelected() - 1); } else { menu->setFind(false); } } return true; } case BzfKeyEvent::Down: { if (HUDui::getFocus()) { if (!menu->getFind()) { menu->setSelected(menu->getSelected() + 1); } else { menu->setFind(false); } } return true; } case BzfKeyEvent::PageUp: { if (HUDui::getFocus()) { if (!menu->getFind()) { menu->setSelected(menu->getSelected() - ServerMenu::NumItems); } else { menu->setFind(false); } } return true; } case BzfKeyEvent::PageDown: { if (HUDui::getFocus()) { if (!menu->getFind()) { menu->setSelected(menu->getSelected() + ServerMenu::NumItems); } else { menu->setFind(false); } } return true; } } } else if (key.ascii == '\t') { if (HUDui::getFocus()) { menu->setSelected(menu->getSelected() + 1); } return true; } else if (key.ascii == '/') { if (HUDui::getFocus() && !menu->getFind()) { menu->setFind(true, (key.shift & BzfKeyEvent::AltKey) != 0); return true; } } else if (key.ascii == 'f') { if (HUDui::getFocus() && !menu->getFind()) { menu->toggleFavView(); return true; } } else if (key.ascii == '+') { if (HUDui::getFocus() && !menu->getFind()) { menu->setFav(true); return true; } } else if (key.ascii == '-') { if (HUDui::getFocus() && !menu->getFind()) { menu->setFav(false); return true; } } else if ((key.ascii >= '0') && (key.ascii <= '9')) { if (HUDui::getFocus() && !menu->getFind()) { menu->setFindIndex(key.ascii - '0'); return true; } } else if (key.ascii == 27) { if (HUDui::getFocus()) { // escape drops out of find mode // note that this is handled by MenuDefaultKey if we're not in find mode if (menu->getFind()) { menu->setFind(false); return true; } } } return MenuDefaultKey::keyPress(key); } bool ServerMenuDefaultKey::keyRelease(const BzfKeyEvent& key) { switch (key.button) { case BzfKeyEvent::Up: case BzfKeyEvent::Down: case BzfKeyEvent::PageUp: case BzfKeyEvent::PageDown: { return true; } } switch (key.ascii) { case 27: // escape case 13: { // return return true; } } return false; } ServerMenu::ServerMenu() : defaultKey(this) , selectedIndex(0) , serversFound(0) , realServersFound(0) , findMode(false) , favView(false) , newfilter(true) , listFilter(BZDB.get("listFilter")) , lastWidth(0) , lastHeight(0) { if (debugLevel > 0) { listFilter.print(); } // add controls addLabel("Servers", ""); addLabel("Players", ""); addLabel("Rogue", ""); addLabel("Red", ""); addLabel("Green", ""); addLabel("Blue", ""); addLabel("Purple", ""); addLabel("Observers", ""); addLabel("", ""); // max shots addLabel("", ""); // capture-the-flag/free-style/rabbit chase addLabel("", ""); // super-flags addLabel("", ""); // antidote-flag addLabel("", ""); // shaking time addLabel("", ""); // shaking wins addLabel("", ""); // jumping addLabel("", ""); // ricochet addLabel("", ""); // inertia addLabel("", ""); // time limit addLabel("", ""); // max team score addLabel("", ""); // max player score addLabel("", ""); // cached status addLabel("", ""); // cached age addLabel("", ""); // search status addLabel("", ""); // page readout status = (HUDuiLabel*)(getControls()[NumReadouts - 2]); pageLabel = (HUDuiLabel*)(getControls()[NumReadouts - 1]); // add server list items for (int i = 0; i < NumItems; ++i) addLabel("", ""); // find server search = new HUDuiTypeIn; search->setFontFace(MainMenu::getFontFace()); search->setMaxLength(42); search->setString(listFilter.getSource()); search->setColorFunc(colorizeSearch); getControls().push_back(search); setFind(false); // short key help help = new HUDuiLabel; help->setFontFace(MainMenu::getFontFace()); help->setString("Press +/- add/remove favorites f - toggle view"); getControls().push_back(help); // set initial focus setFocus(status); } void ServerMenu::addLabel(const char* msg, const char* _label) { HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); label->setString(msg); label->setLabel(_label); getControls().push_back(label); } void ServerMenu::setFindLabel(const std::string& label) { search->setLabel(label); if (lastWidth && lastHeight) { resize(lastWidth, lastHeight); // overkill... } } void ServerMenu::setFind(bool mode, bool clear) { const std::string oldFilterSource = listFilter.getSource();; if (clear) { search->setString(""); } if (mode) { // filter is being typed in setFindLabel(ANSI_STR_FG_GREEN "Edit Filter:"); search->setFocus(); } else { listFilter.parse(search->getString()); BZDB.set("listFilter", search->getString()); if (listFilter.getSource().empty()) { setFindLabel("Press '/' to search"); } else { setFindLabel(ANSI_STR_FG_RED "Using filter:"); } // select the first item in the list setSelected(0); } if (debugLevel > 0) { listFilter.print(); } findMode = mode; newfilter = (listFilter.getSource() != oldFilterSource); } void ServerMenu::setFindIndex(int index) { if ((index >= 0) && (index <= 9)) { std::string name = "listFilter"; name += (index + '0'); search->setString(BZDB.get(name)); setFind(false); } } bool ServerMenu::getFind() const { return findMode; } void ServerMenu::toggleFavView() { favView = !favView; newfilter = true; updateStatus(); } void ServerMenu::setFav(bool fav) { if (selectedIndex < 0 || (int)serverList.size() <= selectedIndex) return; // no such entry (server list may be empty) const ServerItem& item = serverList.getServers()[selectedIndex]; std::string addrname = item.getAddrName(); ServerListCache *cache = ServerListCache::get(); ServerListCache::SRV_STR_MAP::iterator i = cache->find(addrname); if (i != cache->end()) { i->second.favorite = fav; } else { // FIXME should not ever come here, but what to do? } realServerList.markFav(addrname, fav); serverList.markFav(addrname, fav); setSelected(getSelected()+1, true); } int ServerMenu::getSelected() const { return selectedIndex; } void ServerMenu::setSelected(int index, bool forcerefresh) { // clamp index if (index < 0) index = serverList.size() - 1; else if (index != 0 && index >= (int)serverList.size()) index = 0; // ignore if no change if (!forcerefresh && selectedIndex == index) { return; } // update selected index and get old and new page numbers const int oldPage = (selectedIndex < 0) ? -1 : (selectedIndex / NumItems); selectedIndex = index; const int newPage = (selectedIndex / NumItems); // if page changed then load items for this page if (oldPage != newPage || forcerefresh) { // fill items std::vector& listHUD = getControls(); const int base = newPage * NumItems; for (int i = 0; i < NumItems; ++i) { HUDuiLabel* label = (HUDuiLabel*)listHUD[i + NumReadouts]; if (base + i < (int)serverList.size()) { const ServerItem &server = serverList.getServers()[base + i]; const short gameType = server.ping.gameType; const short gameOptions = server.ping.gameOptions; std::string fullLabel; if (BZDB.isTrue("listIcons")) { // game mode if ((server.ping.observerMax == 16) && (server.ping.maxPlayers == 200)) { fullLabel += ANSI_STR_FG_CYAN "* "; // replay } else if (gameType == ClassicCTF) { fullLabel += ANSI_STR_FG_RED "* "; // ctf } else if (gameType == RabbitChase) { fullLabel += ANSI_STR_FG_WHITE "* "; // white rabbit } else { fullLabel += ANSI_STR_FG_YELLOW "* "; // free-for-all } // jumping? if (gameOptions & JumpingGameStyle) { fullLabel += ANSI_STR_BRIGHT ANSI_STR_FG_MAGENTA "J "; } else { fullLabel += ANSI_STR_DIM ANSI_STR_FG_WHITE "J "; } // superflags ? if (gameOptions & SuperFlagGameStyle) { fullLabel += ANSI_STR_BRIGHT ANSI_STR_FG_BLUE "F "; } else { fullLabel += ANSI_STR_DIM ANSI_STR_FG_WHITE "F "; } // ricochet? if (gameOptions & RicochetGameStyle) { fullLabel += ANSI_STR_BRIGHT ANSI_STR_FG_GREEN "R"; } else { fullLabel += ANSI_STR_DIM ANSI_STR_FG_WHITE "R"; } fullLabel += ANSI_STR_RESET " "; // colorize server descriptions by shot counts const int maxShots = server.ping.maxShots; if (maxShots <= 0) { label->setColor(0.4f, 0.0f, 0.6f); // purple } else if (maxShots == 1) { label->setColor(0.25f, 0.25f, 1.0f); // blue } else if (maxShots == 2) { label->setColor(0.25f, 1.0f, 0.25f); // green } else if (maxShots == 3) { label->setColor(1.0f, 1.0f, 0.25f); // yellow } else { // graded orange/red const float shotScale = std::min(1.0f, log10f((float)(maxShots - 3))); const float rf = 1.0f; const float gf = 0.4f * (1.0f - shotScale); const float bf = 0.25f * gf; label->setColor(rf, gf, bf); } } else { // colorize servers: many shots->red, jumping->green, CTF->blue const float rf = std::min(1.0f, logf((float)server.ping.maxShots) / logf(20.0f)); const float gf = gameOptions & JumpingGameStyle ? 1.0f : 0.0f; const float bf = (gameType == ClassicCTF) ? 1.0f : 0.0f; label->setColor(0.5f + rf * 0.5f, 0.5f + gf * 0.5f, 0.5f + bf * 0.5f); } std::string addr, desc; server.splitAddrTitle(addr, desc); if (server.favorite) fullLabel += ANSI_STR_FG_ORANGE; else fullLabel += ANSI_STR_FG_WHITE; fullLabel += addr; if (!desc.empty()) { fullLabel += ANSI_STR_RESET " "; fullLabel += desc; } label->setString(fullLabel); label->setDarker(server.cached); } else { label->setString(""); } } // change page label if ((int)serverList.size() > NumItems) { char msg[50]; std::vector args; sprintf(msg, "%d", newPage + 1); args.push_back(msg); sprintf(msg, "%ld", (long int)(serverList.size() + NumItems - 1) / NumItems); args.push_back(msg); pageLabel->setString("Page {1} of {2}", &args); } } // set focus to selected item if (serverList.size() > 0) { const int indexOnPage = selectedIndex % NumItems; getControls()[NumReadouts + indexOnPage]->setFocus(); } // update readouts pick(); } void ServerMenu::pick() { if (serverList.size() == 0) { return; } // get server info const ServerItem& item = serverList.getServers()[selectedIndex]; const PingPacket& ping = item.ping; // update server readouts char buf[60]; std::vector& listHUD = getControls(); const uint8_t maxes [] = { ping.maxPlayers, ping.rogueMax, ping.redMax, ping.greenMax, ping.blueMax, ping.purpleMax, ping.observerMax }; // if this is a cached item set the player counts to "?/max count" if (item.cached && item.getPlayerCount() == 0) { for (int i = 1; i <=7; i ++){ sprintf(buf, "?/%d", maxes[i-1]); ((HUDuiLabel*)listHUD[i])->setLabel(buf); } } else { // not an old item, set players #s to info we have sprintf(buf, "%d/%d", ping.rogueCount + ping.redCount + ping.greenCount + ping.blueCount + ping.purpleCount + ping.observerCount, ping.maxPlayers); ((HUDuiLabel*)listHUD[1])->setLabel(buf); if (ping.rogueMax == 0) buf[0]=0; else if (ping.rogueMax >= ping.maxPlayers) sprintf(buf, "%d", ping.rogueCount); else sprintf(buf, "%d/%d", ping.rogueCount, ping.rogueMax); ((HUDuiLabel*)listHUD[2])->setLabel(buf); if (ping.redMax == 0) buf[0]=0; else if (ping.redMax >= ping.maxPlayers) sprintf(buf, "%d", ping.redCount); else sprintf(buf, "%d/%d", ping.redCount, ping.redMax); ((HUDuiLabel*)listHUD[3])->setLabel(buf); if (ping.greenMax == 0) buf[0]=0; else if (ping.greenMax >= ping.maxPlayers) sprintf(buf, "%d", ping.greenCount); else sprintf(buf, "%d/%d", ping.greenCount, ping.greenMax); ((HUDuiLabel*)listHUD[4])->setLabel(buf); if (ping.blueMax == 0) buf[0]=0; else if (ping.blueMax >= ping.maxPlayers) sprintf(buf, "%d", ping.blueCount); else sprintf(buf, "%d/%d", ping.blueCount, ping.blueMax); ((HUDuiLabel*)listHUD[5])->setLabel(buf); if (ping.purpleMax == 0) buf[0]=0; else if (ping.purpleMax >= ping.maxPlayers) sprintf(buf, "%d", ping.purpleCount); else sprintf(buf, "%d/%d", ping.purpleCount, ping.purpleMax); ((HUDuiLabel*)listHUD[6])->setLabel(buf); if (ping.observerMax == 0) buf[0]=0; else if (ping.observerMax >= ping.maxPlayers) sprintf(buf, "%d", ping.observerCount); else sprintf(buf, "%d/%d", ping.observerCount, ping.observerMax); ((HUDuiLabel*)listHUD[7])->setLabel(buf); } std::vector args; sprintf(buf, "%d", ping.maxShots); args.push_back(buf); if (ping.maxShots == 1) ((HUDuiLabel*)listHUD[8])->setString("{1} Shot", &args ); else ((HUDuiLabel*)listHUD[8])->setString("{1} Shots", &args ); if (ping.gameType == ClassicCTF) ((HUDuiLabel*)listHUD[9])->setString("Classic Capture-the-Flag"); else if (ping.gameType == RabbitChase) ((HUDuiLabel*)listHUD[9])->setString("Rabbit Chase"); else if (ping.gameType == OpenFFA) ((HUDuiLabel*)listHUD[9])->setString("Open (Teamless) Free-For-All"); else ((HUDuiLabel*)listHUD[9])->setString("Free-style"); if (ping.gameOptions & SuperFlagGameStyle) ((HUDuiLabel*)listHUD[10])->setString("Super Flags"); else ((HUDuiLabel*)listHUD[10])->setString(""); if (ping.gameOptions & AntidoteGameStyle) ((HUDuiLabel*)listHUD[11])->setString("Antidote Flags"); else ((HUDuiLabel*)listHUD[11])->setString(""); if ((ping.gameOptions & ShakableGameStyle) && ping.shakeTimeout != 0) { std::vector dropArgs; sprintf(buf, "%.1f", 0.1f * float(ping.shakeTimeout)); dropArgs.push_back(buf); if (ping.shakeWins == 1) ((HUDuiLabel*)listHUD[12])->setString("{1} sec To Drop Bad Flag", &dropArgs); else ((HUDuiLabel*)listHUD[12])->setString("{1} secs To Drop Bad Flag", &dropArgs); } else { ((HUDuiLabel*)listHUD[13])->setString(""); } if ((ping.gameOptions & ShakableGameStyle) && ping.shakeWins != 0) { std::vector dropArgs; sprintf(buf, "%d", ping.shakeWins); dropArgs.push_back(buf); dropArgs.push_back(ping.shakeWins == 1 ? "" : "s"); if (ping.shakeWins == 1) ((HUDuiLabel*)listHUD[12])->setString("{1} Win Drops Bad Flag", &dropArgs); else ((HUDuiLabel*)listHUD[12])->setString("{1} Wins Drops Bad Flag", &dropArgs); } else { ((HUDuiLabel*)listHUD[13])->setString(""); } if (ping.gameOptions & JumpingGameStyle) { ((HUDuiLabel*)listHUD[14])->setString("Jumping"); } else { ((HUDuiLabel*)listHUD[14])->setString(""); } if (ping.gameOptions & RicochetGameStyle) { ((HUDuiLabel*)listHUD[15])->setString("Ricochet"); } else { ((HUDuiLabel*)listHUD[15])->setString(""); } if (ping.gameOptions & HandicapGameStyle) { ((HUDuiLabel*)listHUD[16])->setString("Handicap"); } else { ((HUDuiLabel*)listHUD[16])->setString(""); } if (ping.maxTime != 0) { std::vector pingArgs; if (ping.maxTime >= 3600) sprintf(buf, "%d:%02d:%02d", ping.maxTime / 3600, (ping.maxTime / 60) % 60, ping.maxTime % 60); else if (ping.maxTime >= 60) sprintf(buf, "%d:%02d", ping.maxTime / 60, ping.maxTime % 60); else sprintf(buf, "0:%02d", ping.maxTime); pingArgs.push_back(buf); ((HUDuiLabel*)listHUD[17])->setString("Time limit: {1}", &pingArgs); } else { ((HUDuiLabel*)listHUD[17])->setString(""); } if (ping.maxTeamScore != 0) { std::vector scoreArgs; sprintf(buf, "%d", ping.maxTeamScore); scoreArgs.push_back(buf); ((HUDuiLabel*)listHUD[18])->setString("Max team score: {1}", &scoreArgs); } else { ((HUDuiLabel*)listHUD[18])->setString(""); } if (ping.maxPlayerScore != 0) { std::vector scoreArgs; sprintf(buf, "%d", ping.maxPlayerScore); scoreArgs.push_back(buf); ((HUDuiLabel*)listHUD[19])->setString("Max player score: {1}", &scoreArgs); } else { ((HUDuiLabel*)listHUD[19])->setString(""); } if (item.cached) { ((HUDuiLabel*)listHUD[20])->setString("Cached"); ((HUDuiLabel*)listHUD[21])->setString(item.getAgeString()); } else { ((HUDuiLabel*)listHUD[20])->setString(""); ((HUDuiLabel*)listHUD[21])->setString(""); } } void ServerMenu::show() { // clear server readouts std::vector& listHUD = getControls(); ((HUDuiLabel*)listHUD[1])->setLabel(""); ((HUDuiLabel*)listHUD[2])->setLabel(""); ((HUDuiLabel*)listHUD[3])->setLabel(""); ((HUDuiLabel*)listHUD[4])->setLabel(""); ((HUDuiLabel*)listHUD[5])->setLabel(""); ((HUDuiLabel*)listHUD[6])->setLabel(""); ((HUDuiLabel*)listHUD[7])->setLabel(""); ((HUDuiLabel*)listHUD[8])->setString(""); ((HUDuiLabel*)listHUD[9])->setString(""); ((HUDuiLabel*)listHUD[10])->setString(""); ((HUDuiLabel*)listHUD[11])->setString(""); ((HUDuiLabel*)listHUD[12])->setString(""); ((HUDuiLabel*)listHUD[13])->setString(""); ((HUDuiLabel*)listHUD[14])->setString(""); ((HUDuiLabel*)listHUD[15])->setString(""); ((HUDuiLabel*)listHUD[16])->setString(""); ((HUDuiLabel*)listHUD[17])->setString(""); ((HUDuiLabel*)listHUD[18])->setString(""); ((HUDuiLabel*)listHUD[19])->setString(""); ((HUDuiLabel*)listHUD[20])->setString(""); ((HUDuiLabel*)listHUD[21])->setString(""); // add cache items w/o re-caching them serversFound = 0; realServerList.updateFromCache(); // update the status updateStatus(); // focus to no-server setFocus(status); // *** NOTE *** start ping here // listen for echos addPlayingCallback(&playingCB, this); realServerList.startServerPings(getStartupInfo()); } void ServerMenu::execute() { const bool endFind = (HUDui::getFocus() == search); if (endFind) { setFind(false); status->setFocus(); return; } if (selectedIndex < 0 || selectedIndex >= (int)serverList.size()) { return; } // update startup info StartupInfo* info = getStartupInfo(); strncpy(info->serverName, serverList.getServers()[selectedIndex].name.c_str(), sizeof(info->serverName) - 1); info->serverName[sizeof(info->serverName) - 1] = '\0'; info->serverPort = ntohs((unsigned short) serverList.getServers()[selectedIndex].ping.serverId.port); // all done HUDDialogStack::get()->pop(); } void ServerMenu::dismiss() { // no more callbacks removePlayingCallback(&playingCB, this); // save any new token we got // FIXME myTank.token = serverList.token; } void ServerMenu::resize(int _width, int _height) { lastWidth = _width; lastHeight = _height; // remember size HUDDialog::resize(_width, _height); std::vector& listHUD = getControls(); // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; FontManager &fm = FontManager::instance(); // reposition title float x, y; { HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(title->getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(title->getFontFace(), titleFontSize, " "); x = 0.5f * ((float)_width - titleWidth); y = (float)_height - titleHeight; title->setPosition(x, y); } // reposition server readouts int i; const float y0 = y; float fontSize = (float)_height / 54.0f; float fontHeight = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); for (i = 1; i < NumReadouts - 2; i++) { if (i % 7 == 1) { x = (0.125f + 0.25f * (float)((i - 1) / 7)) * (float)_width; y = y0; } HUDuiLabel* label = (HUDuiLabel*)listHUD[i]; label->setFontSize(fontSize); y -= 1.0f * fontHeight; label->setPosition(x, y); } y = ((HUDuiLabel*)listHUD[7])->getY(); //reset bottom to last team label // reposition search status readout { fontSize = (float)_height / 36.0f; float fontHt = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); status->setFontSize(fontSize); const float statusWidth = fm.getStrLength(status->getFontFace(), fontSize, status->getString()); x = 0.5f * ((float)_width - statusWidth); y -= 1.5f * fontHt; status->setPosition(x, y); } // reposition find server input { fontSize = (float)_height / 36.0f; float fontHt = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); search->setFontSize(fontSize); const float searchWidth = fm.getStrLength(search->getFontFace(), fontSize, search->getLabel()); x = (0.1f * (float)_width) + searchWidth; search->setPosition(x, fontHt * 2 /* near bottom of screen */); } // reposition key help { fontSize = (float)_height / 54.0f; float fontHt = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); help->setFontSize(fontSize); const float searchWidth = fm.getStrLength(help->getFontFace(), fontSize, help->getString()); x = 0.5f * ((float)_width - searchWidth); help->setPosition(x, fontHt / 2 /* near bottom of screen */); } // position page readout and server item list fontSize = (float)_height / 54.0f; fontHeight = fm.getStrHeight(MainMenu::getFontFace(), fontSize, " "); x = 0.125f * (float)_width; const bool useIcons = BZDB.isTrue("listIcons"); for (i = -1; i < NumItems; ++i) { HUDuiLabel* label = (HUDuiLabel*)listHUD[i + NumReadouts]; label->setFontSize(fontSize); y -= 1.0f * fontHeight; if (useIcons && (i >= 0)) { const float offset = fm.getStrLength(status->getFontFace(), fontSize, "* J F R "); label->setPosition(x - offset, y); } else { label->setPosition(x, y); } } } void ServerMenu::setStatus(const char* msg, const std::vector *parms) { status->setString(msg, parms); FontManager &fm = FontManager::instance(); const float statusWidth = fm.getStrLength(status->getFontFace(), status->getFontSize(), status->getString()); status->setPosition(0.5f * ((float)width - statusWidth), status->getY()); } void ServerMenu::updateStatus() { // nothing here to see if (!realServerList.serverFound()) { setStatus("Searching"); return; } // don't run unnecessarily if (realServersFound == realServerList.size() && !newfilter) { return; } // do filtering and counting int playerCount = 0; int observerCount = 0; serverList.clear(); for (unsigned int i = 0; i < realServerList.size(); ++i) { const ServerItem &item = realServerList.getServers()[i]; const PingPacket& ping = item.ping; playerCount += ping.rogueCount; playerCount += ping.redCount; playerCount += ping.greenCount; playerCount += ping.blueCount; playerCount += ping.purpleCount; observerCount += ping.observerCount; // filter is already lower case. do case insensitive matching. if (listFilter.check(item) && (!favView || item.favorite)) { serverList.addToList(item); } } newfilter = false; // update the status label std::vector args; char buffer [80]; sprintf(buffer, "%d", (unsigned int)serverList.size()); args.push_back(buffer); sprintf(buffer, "%d", (unsigned int)realServerList.size()); args.push_back(buffer); sprintf(buffer, "%d", playerCount); args.push_back(buffer); sprintf(buffer, "%d", observerCount); args.push_back(buffer); if (favView) { setStatus("Favorite servers: {1}/{2} ({3} players, {4} observers)", &args); } else { setStatus("Servers found: {1}/{2} ({3} players, {4} observers)", &args); } pageLabel->setString(""); selectedIndex = -1; setSelected(0); serversFound = serverList.size(); realServersFound = realServerList.size(); } void ServerMenu::playingCB(void* _self) { ((ServerMenu*)_self)->realServerList.checkEchos(getStartupInfo()); ((ServerMenu*)_self)->updateStatus(); } static std::string colorizeSearch(const std::string& in) { std::string out; std::vector filters; std::vector separators; const char *c, *s, *s0 = in.c_str(); for (c = s = s0; true; c++) { if (*c == 0) { filters.push_back(std::string(s, c - s)); s = c + 1; break; } else if ((*c == '/') || (*c == ',')) { filters.push_back(std::string(s, c - s)); separators.push_back(*c); s = c + 1; } } static const std::string controlColor = ANSI_STR_FG_CYAN; static const std::string badColor = ANSI_STR_FG_ORANGE; static const std::string unknownColor = ANSI_STR_FG_RED; static const std::string commentColor = ANSI_STR_FG_BLACK; static const std::string boolColor = ANSI_STR_FG_YELLOW; static const std::string rangeColor = ANSI_STR_FG_GREEN; static const std::string globColor = ANSI_STR_FG_BLUE; static const std::string regexColor = ANSI_STR_FG_MAGENTA; out += filters[0]; for (size_t i = 1; i < filters.size(); i++) { out += controlColor; out += separators[i - 1]; char op; std::string lbl, param; const char type = ServerListFilter::parseFilterType(filters[i], op, lbl, param); switch (type) { case 'p': { if (ServerListFilter::isPatternLabel(lbl)) { out += (op == ')') ? globColor : regexColor; } else { out += unknownColor; } break; } case 'b': { out += ServerListFilter::isBoolLabel(lbl) ? boolColor : unknownColor; break; } case 'r': { out += ServerListFilter::isRangeLabel(lbl) ? rangeColor : unknownColor; break; } case '#': { out += commentColor; break; } default: { out += badColor; break; } } out += filters[i]; } return out; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerMenu.h000066400000000000000000000050171200563112200177420ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERMENU_H__ #define __SERVERMENU_H__ // ancestor classes #include "MenuDefaultKey.h" #include "HUDDialog.h" /* system interface headers */ #include #include #include /* common interface headers */ #include "BzfEvent.h" #include "ServerItem.h" #include "ServerList.h" /* local interface headers */ #include "HUDuiDefaultKey.h" #include "HUDuiLabel.h" #include "HUDuiTypeIn.h" #include "ServerListFilter.h" class ServerMenu; class ServerMenuDefaultKey : public MenuDefaultKey { public: ServerMenuDefaultKey(ServerMenu* _menu) : menu(_menu) { } ~ServerMenuDefaultKey() { } bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); private: ServerMenu* menu; }; class ServerMenu : public HUDDialog { public: ServerMenu(); ~ServerMenu() { } HUDuiDefaultKey* getDefaultKey() { return &defaultKey; } int getSelected() const; void setSelected(int, bool forcerefresh=false); void show(); void execute(); void dismiss(); void resize(int width, int height); void updateStatus(); void setFindLabel(const std::string& label); bool getFind() const; void setFind(bool mode, bool clear = false); void setFindIndex(int index); void toggleFavView(); void setFav(bool); static void playingCB(void*); static const int NumItems; private: void addLabel(const char* str, const char* label); void setStatus(const char*, const std::vector *parms = NULL); void pick(); ServerItem& serversAt(int index); private: ServerList realServerList; ServerList serverList; ServerMenuDefaultKey defaultKey; HUDuiLabel* status; HUDuiLabel* help; HUDuiLabel* pageLabel; int selectedIndex; unsigned int serversFound; unsigned int realServersFound; HUDuiTypeIn* search; bool findMode; bool favView; bool newfilter; ServerListFilter listFilter; int lastWidth, lastHeight; static const int NumReadouts; }; #endif /* __SERVERMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerStartMenu.cxx000066400000000000000000000425601200563112200213370ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ServerStartMenu.h" /* system implementation headers */ #include #include #include #include #include #ifndef _WIN32 # include # include # include # include # ifndef GUSI_20 # include # endif #else # define _WINSOCKAPI_ # include # include # include # define _POSIX_ # include # undef _POSIX_ # include #endif /* common implementation headers */ #include "DirectoryNames.h" #include "StateDatabase.h" #include "FontManager.h" #include "TextUtils.h" /* local implementation headers */ #include "MenuDefaultKey.h" #include "MainMenu.h" #include "HUDuiList.h" #include "playing.h" #include "bzflag.h" #include "HUDui.h" char ServerStartMenu::settings[] = "bfaaaaabaaaaa"; ServerStartMenu::ServerStartMenu() { // add controls std::vector& controls = getControls(); HUDuiList* listHUD; std::vector* items; // 0 controls.push_back(createLabel("Start Server")); // 1 listHUD = createList("Style:"); items = &listHUD->getList(); items->push_back("Capture the Flag"); items->push_back("Free for All"); items->push_back("Rabbit Hunt (Random Selection)"); items->push_back("Rabbit Hunt (Score-based Selection)"); items->push_back("Rabbit Hunt (Killer Selection)"); listHUD->update(); controls.push_back(listHUD); // 2 listHUD = createList("Max Players:"); items = &listHUD->getList(); items->push_back("2"); items->push_back("3"); items->push_back("4"); items->push_back("8"); items->push_back("20"); items->push_back("40"); listHUD->update(); controls.push_back(listHUD); // 3 listHUD = createList("Max Shots:"); items = &listHUD->getList(); items->push_back("1"); items->push_back("2"); items->push_back("3"); items->push_back("4"); items->push_back("5"); items->push_back("8"); items->push_back("10"); items->push_back("15"); items->push_back("20"); listHUD->update(); controls.push_back(listHUD); // 4 listHUD = createList("Teleporters:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("yes"); listHUD->update(); controls.push_back(listHUD); // 5 listHUD = createList("Ricochet:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("yes"); listHUD->update(); controls.push_back(listHUD); // 6 listHUD = createList("Jumping:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("yes"); listHUD->update(); controls.push_back(listHUD); // 7 listHUD = createList("Handicap:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("yes"); listHUD->update(); controls.push_back(listHUD); // 8 listHUD = createList("Superflags:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("good flags only"); items->push_back("all flags"); listHUD->update(); controls.push_back(listHUD); // 9 listHUD = createList("Max Superflags:"); items = &listHUD->getList(); items->push_back("10"); items->push_back("20"); items->push_back("30"); items->push_back("40"); listHUD->update(); controls.push_back(listHUD); // 10 listHUD = createList("Bad Flag Antidote:"); items = &listHUD->getList(); items->push_back("no"); items->push_back("yes"); listHUD->update(); controls.push_back(listHUD); // 11 listHUD = createList("Bad Flag Time Limit:"); items = &listHUD->getList(); items->push_back("no limit"); items->push_back("15 seconds"); items->push_back("30 seconds"); items->push_back("60 seconds"); items->push_back("180 seconds"); listHUD->update(); controls.push_back(listHUD); // 12 listHUD = createList("Bad Flag Win Limit:"); items = &listHUD->getList(); items->push_back("no limit"); items->push_back("drop after 1 win"); items->push_back("drop after 2 wins"); items->push_back("drop after 3 wins"); listHUD->update(); controls.push_back(listHUD); // 13 listHUD = createList("Game Over:"); items = &listHUD->getList(); items->push_back("never"); items->push_back("after 5 minutes"); items->push_back("after 15 minutes"); items->push_back("after 60 minutes"); items->push_back("after 3 hours"); items->push_back("when a player gets +3"); items->push_back("when a player gets +10"); items->push_back("when a player gets +25"); items->push_back("when a team gets +3"); items->push_back("when a team gets +10"); items->push_back("when a team gets +25"); items->push_back("when a team gets +100"); listHUD->update(); controls.push_back(listHUD); // 14 listHUD = createList("Server Reset:"); items = &listHUD->getList(); items->push_back("no, quit after game"); items->push_back("yes, reset for more games"); listHUD->update(); controls.push_back(listHUD); // 15 listHUD = createList("World Map:"); items = &listHUD->getList(); items->push_back("random map"); // add a list of .bzw files found in the world file dir std::string searchDir = getWorldDirName(); scanWorldFiles (searchDir, items); // add a list of .bzw files found in the config file dir searchDir = getConfigDirName(); scanWorldFiles (searchDir, items); // add a list of .bzw files found in the data or current dir searchDir = BZDB.get("directory"); // could be an empty string #ifdef _WIN32 if (searchDir.length() == 0) { long availDrives = GetLogicalDrives(); for (int i = 2; i < 31; i++) { if (availDrives & (1 << i)) { searchDir = 'a' + i; searchDir += ":"; break; } } } searchDir += DirectorySeparator; #else if (searchDir.length() > 0) { searchDir += DirectorySeparator; } else { searchDir = "."; } #endif // _WIN32 scanWorldFiles (searchDir, items); listHUD->update(); controls.push_back(listHUD); // 16 start = createLabel("Start"); controls.push_back(start); // 17 status = createLabel(""); controls.push_back(status); // 18 failedMessage = createLabel(""); controls.push_back(failedMessage); initNavigation(controls, 1, controls.size()-3); // set settings loadSettings(); } ServerStartMenu::~ServerStartMenu() { } void ServerStartMenu::scanWorldFiles (const std::string& searchDir, std::vector* items) { #ifdef _WIN32 std::vector pattern; pattern.push_back(searchDir + "*.bzw"); for (unsigned int i=0; ipush_back(file); } while (FindNextFile(h, &findData)); } } #else /* add a list of .bzw files found in the current dir */ DIR *directory = opendir(searchDir.c_str()); if (directory) { struct dirent* contents; std::string file; std::string suffix; while ((contents = readdir(directory))) { file = contents->d_name; if (file.length() > 4) { suffix = file.substr(file.length()-4, 4); if (TextUtils::compare_nocase(suffix, ".bzw") == 0) { worldFiles[file] = searchDir + file; items->push_back(file); } } } closedir(directory); } #endif // _WIN32 return; } HUDuiDefaultKey* ServerStartMenu::getDefaultKey() { return MenuDefaultKey::getInstance(); } void ServerStartMenu::setSettings(const char* _settings) { if (strlen(_settings) != strlen(settings)) return; strcpy(settings, _settings); } void ServerStartMenu::loadSettings() { std::vector& controls = getControls(); const char* scan = settings; for (int i = 1; *scan; i++, scan++) ((HUDuiList*)controls[i])->setIndex(*scan - 'a'); } void ServerStartMenu::show() { setStatus(""); } void ServerStartMenu::dismiss() { std::vector& controls = getControls(); char* scan = settings; for (int i = 1; *scan; i++, scan++) *scan = (char)('a' + ((HUDuiList*)controls[i])->getIndex()); } void ServerStartMenu::execute() { static const char* serverApp = "bzfs"; bool success = false; std::vector& listHUD = getControls(); HUDuiControl* _focus = HUDui::getFocus(); if (_focus == start) { // start it up: // without: -p, -i, -q, -a, +f, -synctime // -b if -c // -h, -r if !-c // +s if superflags != no // -f for all bad flags if superflags == good only // // other options as they were set // get path to server from path to client // add 256 for flags room char serverCmd[PATH_MAX + 256]; strcpy(serverCmd, argv0); char* base = strrchr(serverCmd, '/'); #if defined(_WIN32) char* base2 = strrchr(serverCmd, '\\'); if (base2 && (!base || base2 - serverCmd > base - serverCmd)) base = base2; #endif if (!base) base = serverCmd; else base++; strcpy(base, serverApp); // prepare arguments for starting server const char* args[30]; int arg = 0; args[arg++] = serverApp; #if defined(_WIN32) // always try a fallback port if default port is busy // (unix-like OSes will instead try to kill off the old process) args[arg++] = "-pf"; #endif // load the world map first, so that later arguments can // override any that are present in a map's "options" block if (((HUDuiList*)listHUD[15])->getIndex() != 0) { // not random args[arg++] = "-world"; std::vector fileList = ((HUDuiList*)listHUD[15])->getList(); std::string filename = fileList[((HUDuiList*)listHUD[15])->getIndex()].c_str(); args[arg++] = worldFiles[filename].c_str(); } // game style if (((HUDuiList*)listHUD[1])->getIndex() == 0) { args[arg++] = "-c"; args[arg++] = "-b"; } else if (((HUDuiList*)listHUD[1])->getIndex() == 1){ args[arg++] = "-h"; } else { static const char* rabbitStyles[] = { "random", "score", "killer" }; args[arg++] = "-rabbit"; args[arg++] = rabbitStyles[(((HUDuiList*)listHUD[1])->getIndex()) - 2]; } // max players static const char* numPlayers[] = { "2", "3", "4", "8", "20", "40" }; args[arg++] = "-mp"; args[arg++] = numPlayers[((HUDuiList*)listHUD[2])->getIndex()]; // max shots static const char* numShots[] = { "1", "2", "3", "4", "5", "8", "10", "15", "20" }; args[arg++] = "-ms"; args[arg++] = numShots[((HUDuiList*)listHUD[3])->getIndex()]; // teleporters if (((HUDuiList*)listHUD[4])->getIndex() == 1) args[arg++] = "-t"; // ricochet if (((HUDuiList*)listHUD[5])->getIndex() == 1) args[arg++] = "+r"; // jumping if (((HUDuiList*)listHUD[6])->getIndex() == 1) args[arg++] = "-j"; // handicap if (((HUDuiList*)listHUD[7])->getIndex() == 1) args[arg++] = "-handicap"; // superflags const int superflagOption = ((HUDuiList*)listHUD[8])->getIndex(); if (superflagOption != 0) { if (superflagOption == 1) { args[arg++] = "-f"; args[arg++] = "bad"; } args[arg++] = "+s"; // max superflags static const char* numFlagsList[] = { "10", "20", "30", "40" }; args[arg++] = numFlagsList[((HUDuiList*)listHUD[9])->getIndex()]; } // shaking static const char* shakingTime[] = { "", "15", "30", "60", "180" }; static const char* shakingWins[] = { "", "1", "2", "3" }; if (((HUDuiList*)listHUD[10])->getIndex() == 1) args[arg++] = "-sa"; if (((HUDuiList*)listHUD[11])->getIndex() != 0) { args[arg++] = "-st"; args[arg++] = shakingTime[((HUDuiList*)listHUD[11])->getIndex()]; } if (((HUDuiList*)listHUD[12])->getIndex() != 0) { args[arg++] = "-sw"; args[arg++] = shakingWins[((HUDuiList*)listHUD[12])->getIndex()]; } // game over static const char* gameOverArg[] = { "", "-time", "-time", "-time", "-time", "-mps", "-mps", "-mps", "-mts", "-mts", "-mts", "-mts" }; static const char* gameOverValue[] = { "", "300", "900", "3600", "10800", "3", "10", "25", "3", "10", "25", "100" }; if (((HUDuiList*)listHUD[13])->getIndex() != 0) { args[arg++] = gameOverArg[((HUDuiList*)listHUD[13])->getIndex()]; args[arg++] = gameOverValue[((HUDuiList*)listHUD[13])->getIndex()]; } // server reset if (((HUDuiList*)listHUD[14])->getIndex() == 0) args[arg++] = "-g"; // no more arguments args[arg++] = NULL; // start the server #if defined(_WIN32) // Windows int result = _spawnvp(_P_DETACH, serverCmd, (char* const*) args); if (result < 0) { if (errno == ENOENT) setStatus("Failed... can't find server program."); else if (errno == ENOMEM) setStatus("Failed... not enough memory."); else if (errno == ENOEXEC) setStatus("Failed... server program is not executable."); else setStatus(TextUtils::format("Failed... unknown error (%d).", errno, serverCmd).c_str()); logDebugMessage(1,"Failed to start server (%s) - error %d.\n", serverCmd, errno); } else { setStatus("Server started."); success = true; } #else /* defined(_WIN32) */ // UNIX static pid_t pid = -1; // try to kill off the old process if (pid != -1) { int i; for (i = 0; i < 12; i++) { if (kill(pid, SIGTERM) == 0) { TimeKeeper::sleep(0.25); // be gracious for max 3 seconds } else { if (errno == ESRCH) { break; // the pid doesn't exist } } } if (i == 12) { kill(pid, SIGKILL); // be brutal } } // fork pid = fork(); if (pid == -1) { setStatus("Failed... cannot fork."); } else if (pid == 0) { // child process. close down stdio. close(0); close(1); close(2); // exec server execvp(serverCmd, (char* const*)args); // If execvp returns, bzfs wasnt at the anticipated location. // Let execvp try to find it in $PATH by feeding it the "bzfs" name by it self execvp(serverApp, (char* const*)args); // If that returns too, something bad has happened. Exit. exit(2); } else if (pid != 0) { // parent process. wait a bit and check if child died. TimeKeeper::sleep(1.0); int pStatus; if (waitpid(pid, &pStatus, WNOHANG) != 0) { pid = -1; char failBuf[64]; if (WIFEXITED(pStatus)) { snprintf(failBuf, 64, "Failed (exit = %i).", WEXITSTATUS(pStatus)); } else if (WIFSIGNALED(pStatus)) { snprintf(failBuf, 64, "Failed (signal = %i).", WTERMSIG(pStatus)); } else { strcpy(failBuf, "Failed."); } setStatus(failBuf); } else { setStatus("Server started."); success = true; } } #endif /* defined(_WIN32) */ if (success) { // set server/port in join menu to localhost:5154 StartupInfo* info = getStartupInfo(); strcpy(info->serverName, "localhost"); info->serverPort = 5154; //note that if bzfs had to use a fallback port this will be wrong } // success } } void ServerStartMenu::setStatus(const char* msg, const std::vector *parms) { status->setString(msg, parms); FontManager &fm = FontManager::instance(); const float widt = fm.getStrLength(status->getFontFace(), status->getFontSize(), status->getString()); status->setPosition(center - 0.5f * widt, status->getY()); } void ServerStartMenu::resize(int _width, int _height) { HUDDialog::resize(_width, _height); center = 0.5f * (float)_width; // use a big font for title, smaller font for the rest const float titleFontSize = (float)_height / 15.0f; const float fontSize = (float)_height / 54.0f; FontManager &fm = FontManager::instance(); // reposition title std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(title->getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(title->getFontFace(), titleFontSize, " "); float x = 0.5f * ((float)_width - titleWidth); float y = (float)_height - titleHeight; title->setPosition(x, y); // reposition options x = 0.5f * (float)_width; y -= 0.6f * titleHeight; const float h = fm.getStrHeight(listHUD[1]->getFontFace(), fontSize, " "); const int count = listHUD.size(); for (int i = 1; i < count; i++) { if (listHUD[i] == start) { y -= 1.5f * h; listHUD[i]->setFontSize(1.5f * fontSize); listHUD[i]->setPosition(x, y); } else { listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); } y -= 1.0f * h; } } HUDuiList* ServerStartMenu::createList(const char* str) { HUDuiList* listHUD = new HUDuiList; listHUD->setFontFace(MainMenu::getFontFace()); if (str) listHUD->setLabel(str); return listHUD; } HUDuiLabel* ServerStartMenu::createLabel(const char* str) { HUDuiLabel* label = new HUDuiLabel; label->setFontFace(MainMenu::getFontFace()); if (str) label->setString(str); return label; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ServerStartMenu.h000066400000000000000000000033061200563112200207570ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SERVERSTARTMENU_H__ #define __SERVERSTARTMENU_H__ #include "common.h" /* interface header */ #include "HUDDialog.h" /* system interface headers */ #include #include #include /* local interface headers */ #include "HUDuiDefaultKey.h" #include "HUDuiList.h" #include "HUDuiLabel.h" class ServerStartMenu : public HUDDialog { public: ServerStartMenu(); ~ServerStartMenu(); HUDuiDefaultKey* getDefaultKey(); void execute(); void show(); void dismiss(); void resize(int width, int height); static const char* getSettings() { return settings; } static void setSettings(const char*); private: HUDuiList* createList(const char*); HUDuiLabel* createLabel(const char*); void setStatus(const char*, const std::vector *parms = NULL); void loadSettings(); void scanWorldFiles (const std::string& searchDir, std::vector* items); private: float center; HUDuiLabel* start; HUDuiLabel* status; HUDuiLabel* failedMessage; static char settings[]; std::map worldFiles; }; #endif /* __SERVERSTARTMENU_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShockWaveStrategy.cxx000066400000000000000000000104151200563112200216350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ShockWaveStrategy.h" /* common implementation headers */ #include "SceneRenderer.h" /* local implementation headers */ #include "LocalPlayer.h" #include "playing.h" #include "World.h" ShockWaveStrategy::ShockWaveStrategy(ShotPath *_path) : ShotStrategy(_path), radius(BZDB.eval(StateDatabase::BZDB_SHOCKINRADIUS)), radius2(radius * radius) { // setup shot FiringInfo& f = getFiringInfo(_path); f.lifetime *= BZDB.eval(StateDatabase::BZDB_SHOCKADLIFE); // make scene node const float* pos = _path->getPosition(); if (RENDERER.useQuality() >= 2) { shockNode = new SphereLodSceneNode(pos, radius); shockNode->setShockWave(true); } else { shockNode = new SphereBspSceneNode(pos, radius); } // get team if (_path->getPlayer() == ServerPlayer) { TeamColor tmpTeam = _path->getFiringInfo().shot.team; team = (tmpTeam < RogueTeam) ? RogueTeam : (tmpTeam > HunterTeam) ? RogueTeam : tmpTeam; } else { Player* p = lookupPlayer(_path->getPlayer()); team = p ? p->getTeam() : RogueTeam; } const float* c = Team::getRadarColor(team); if (RENDERER.useQuality() >= 2) { shockNode->setColor(c[0], c[1], c[2], 0.5f); } else { shockNode->setColor(c[0], c[1], c[2], 0.75f); } } ShockWaveStrategy::~ShockWaveStrategy() { delete shockNode; } void ShockWaveStrategy::update(float dt) { radius += dt * (BZDB.eval(StateDatabase::BZDB_SHOCKOUTRADIUS) - BZDB.eval(StateDatabase::BZDB_SHOCKINRADIUS)) / getPath().getLifetime(); radius2 = radius * radius; // update shock wave scene node shockNode->move(getPath().getPosition(), radius); // team color const LocalPlayer* myTank = LocalPlayer::getMyTank(); TeamColor currentTeam; if ((myTank->getFlag() == Flags::Colorblindness) && (getPath().getPlayer() != ServerPlayer)) { currentTeam = RogueTeam; } else { currentTeam = team; } const float* c = Team::getRadarColor(currentTeam); // fade old-style shockwaves if (RENDERER.useQuality() >= 2) { shockNode->setColor(c[0], c[1], c[2], 0.5f); } else { const float shockIn = BZDB.eval(StateDatabase::BZDB_SHOCKINRADIUS); const float shockOut = BZDB.eval(StateDatabase::BZDB_SHOCKOUTRADIUS); const GLfloat frac = (radius - shockIn) / (shockOut - shockIn); shockNode->setColor(c[0], c[1], c[2], 0.75f - (0.5f * frac)); } // expire when full size if (radius >= BZDB.eval(StateDatabase::BZDB_SHOCKOUTRADIUS)) setExpired(); } float ShockWaveStrategy::checkHit(const BaseLocalPlayer* tank, float position[3]) const { // return if player is inside radius of destruction -- note that a // shock wave can kill anything inside the radius, be it behind or // in a building or even zoned. const float* playerPos = tank->getPosition(); const float* shotPos = getPath().getPosition(); const float dx = playerPos[0] - shotPos[0]; const float dy = playerPos[1] - shotPos[1]; const float dz = playerPos[2] - shotPos[2]; if (dx * dx + dy * dy + dz * dz <= radius2) { position[0] = playerPos[0]; position[1] = playerPos[1]; position[2] = playerPos[2]; return 0.5f; } else { return Infinity; } } bool ShockWaveStrategy::isStoppedByHit() const { return false; } void ShockWaveStrategy::addShot(SceneDatabase* scene, bool) { scene->addDynamicSphere(shockNode); } void ShockWaveStrategy::radarRender() const { // draw circle of current radius static const int sides = 20; const float* shotPos = getPath().getPosition(); glBegin(GL_LINE_LOOP); for (int i = 0; i < sides; i++) { const float angle = (float)(2.0 * M_PI * double(i) / double(sides)); glVertex2f(shotPos[0] + radius * cosf(angle), shotPos[1] + radius * sinf(angle)); } glEnd(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShockWaveStrategy.h000066400000000000000000000025141200563112200212630ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SHOCKWAVESTRATEGY_H__ #define __SHOCKWAVESTRATEGY_H__ /* interface header */ #include "ShotStrategy.h" /* common interface headers */ #include "SceneDatabase.h" #include "SphereSceneNode.h" /* local interface headers */ #include "BaseLocalPlayer.h" #include "ShotPath.h" class ShockWaveStrategy : public ShotStrategy { public: ShockWaveStrategy(ShotPath*); ~ShockWaveStrategy(); void update(float dt); float checkHit(const BaseLocalPlayer*, float[3]) const; bool isStoppedByHit() const; void addShot(SceneDatabase*, bool colorblind); void radarRender() const; private: SphereSceneNode* shockNode; float radius; float radius2; TeamColor team; }; #endif /* __SHOCKWAVESTRATEGY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotPath.cxx000066400000000000000000000123511200563112200177530ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "ShotPath.h" /* system headers */ #include /* local implementation headers */ #include "SegmentedShotStrategy.h" #include "GuidedMissleStrategy.h" #include "ShockWaveStrategy.h" // // FiringInfo (with BaseLocalPlayer) // FiringInfo::FiringInfo(const BaseLocalPlayer& tank, int id) { shot.player = tank.getId(); shot.id = uint16_t(id); tank.getMuzzle(shot.pos); const float* dir = tank.getForward(); const float* tankVel = tank.getVelocity(); float shotSpeed = BZDB.eval(StateDatabase::BZDB_SHOTSPEED); shot.vel[0] = tankVel[0] + shotSpeed * dir[0]; shot.vel[1] = tankVel[1] + shotSpeed * dir[1]; shot.vel[2] = tankVel[2] + shotSpeed * dir[2]; shot.dt = 0.0f; flagType = tank.getFlag(); // wee bit o hack -- if phantom flag but not phantomized // the shot flag is normal -- otherwise FiringInfo will have // to be changed to add a real bitwise status variable if (tank.getFlag() == Flags::PhantomZone && !tank.isFlagActive()){ flagType = Flags::Null; } lifetime = BZDB.eval(StateDatabase::BZDB_RELOADTIME); } // // ShotPath // ShotPath::ShotPath(const FiringInfo& info) : firingInfo(info), reloadTime(BZDB.eval(StateDatabase::BZDB_RELOADTIME)), startTime(TimeKeeper::getTick()), currentTime(TimeKeeper::getTick()), expiring(false), expired(false) { // eek! a giant switch statement, how un-object-oriented! // each flag should be a flyweight object derived from a // base Flag class with a virtual makeShotStrategy() member. // just remember -- it's only a game. if (firingInfo.flagType->flagShot == NormalShot) strategy = new NormalShotStrategy(this); else { if (firingInfo.flagType == Flags::RapidFire) strategy = new RapidFireStrategy(this); else if (firingInfo.flagType == Flags::MachineGun) strategy = new MachineGunStrategy(this); else if (firingInfo.flagType == Flags::GuidedMissile) strategy = new GuidedMissileStrategy(this); else if (firingInfo.flagType == Flags::Laser) strategy = new LaserStrategy(this); else if (firingInfo.flagType == Flags::Ricochet) strategy = new RicochetStrategy(this); else if (firingInfo.flagType == Flags::SuperBullet) strategy = new SuperBulletStrategy(this); else if (firingInfo.flagType == Flags::ShockWave) strategy = new ShockWaveStrategy(this); else if (firingInfo.flagType == Flags::Thief) strategy = new ThiefStrategy(this); else if (firingInfo.flagType == Flags::PhantomZone) strategy = new PhantomBulletStrategy(this); else assert(0); // shouldn't happen } } ShotPath::~ShotPath() { delete strategy; } float ShotPath::checkHit(const BaseLocalPlayer* player, float position[3]) const { return strategy->checkHit(player, position); } bool ShotPath::isStoppedByHit() const { return strategy->isStoppedByHit(); } void ShotPath::addShot(SceneDatabase* scene, bool colorblind) { strategy->addShot(scene, colorblind); } void ShotPath::radarRender() const { if (!isExpired()) strategy->radarRender(); } void ShotPath::updateShot(float dt) { // get new time step and set current time currentTime += dt; // update shot if (!expired) { if (expiring) setExpired(); else getStrategy()->update(dt); } } void ShotPath::setReloadTime(float _reloadTime) { reloadTime = _reloadTime; } void ShotPath::setPosition(const float* p) { firingInfo.shot.pos[0] = p[0]; firingInfo.shot.pos[1] = p[1]; firingInfo.shot.pos[2] = p[2]; } void ShotPath::setVelocity(const float* v) { firingInfo.shot.vel[0] = v[0]; firingInfo.shot.vel[1] = v[1]; firingInfo.shot.vel[2] = v[2]; } void ShotPath::setExpiring() { expiring = true; } void ShotPath::setExpired() { expiring = true; expired = true; getStrategy()->expire(); } void ShotPath::boostReloadTime(float dt) { reloadTime += dt; } // // LocalShotPath // LocalShotPath::LocalShotPath(const FiringInfo& info) : ShotPath(info) { // do nothing } LocalShotPath::~LocalShotPath() { // do nothing } void LocalShotPath::update(float dt) { getFiringInfo().shot.dt += dt; updateShot(dt); // send updates if necessary getStrategy()->sendUpdate(getFiringInfo()); } // // RemoteShotPath // RemoteShotPath::RemoteShotPath(const FiringInfo& info) : ShotPath(info) { // do nothing } RemoteShotPath::~RemoteShotPath() { // do nothing } void RemoteShotPath::update(float dt) { // update shot updateShot(dt); } void RemoteShotPath::update(const ShotUpdate& shot, uint16_t code, void* msg) { // update shot info getFiringInfo().shot = shot; // let the strategy see the message getStrategy()->readUpdate(code, msg); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotPath.h000066400000000000000000000104601200563112200173770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * ShotPath: * Encapsulates the path a shot follows. Most paths can * be computed at the instant of firing (though they may * terminate early because of a hit). Some paths need * to be updated continuously during flight. * * RemoteShotPath: * A ShotPath acting as a proxy for a remote ShotPath. * Created by a LocalPlayer on behalf of a RemotePlayer. */ #ifndef __SHOTPATH_H__ #define __SHOTPATH_H__ #include "common.h" /* common interface headers */ #include "TimeKeeper.h" #include "Flag.h" #include "ShotUpdate.h" /* local interface headers */ #include "BaseLocalPlayer.h" #include "ShotStrategy.h" #include "SceneDatabase.h" class ShotStrategy; class ShotPath { public: virtual ~ShotPath(); bool isExpiring() const; bool isExpired() const; bool isReloaded() const; const PlayerId& getPlayer() const; uint16_t getShotId() const; FlagType* getFlag() const; float getLifetime() const; float getReloadTime() const; const TimeKeeper& getStartTime() const; const TimeKeeper& getCurrentTime() const; const float* getPosition() const; const float* getVelocity() const; float checkHit(const BaseLocalPlayer*, float position[3]) const; void setExpiring(); void setExpired(); bool isStoppedByHit() const; void boostReloadTime(float dt); void addShot(SceneDatabase*, bool colorblind); void radarRender() const; FiringInfo& getFiringInfo(); TeamColor getTeam() const; protected: ShotPath(const FiringInfo&); void updateShot(float dt); const ShotStrategy* getStrategy() const; ShotStrategy* getStrategy(); friend class ShotStrategy; void setReloadTime(float); void setPosition(const float*); void setVelocity(const float*); private: ShotStrategy* strategy; // strategy for moving shell FiringInfo firingInfo; // shell information float reloadTime; // time to reload TimeKeeper startTime; // time of firing TimeKeeper currentTime; // current time bool expiring; // shot has almost terminated bool expired; // shot has terminated }; class LocalShotPath : public ShotPath { public: LocalShotPath(const FiringInfo&); ~LocalShotPath(); void update(float dt); }; class RemoteShotPath : public ShotPath { public: RemoteShotPath(const FiringInfo&); ~RemoteShotPath(); void update(float dt); void update(const ShotUpdate& shot, uint16_t code, void* msg); }; // // ShotPath // inline bool ShotPath::isExpiring() const { return expiring; } inline bool ShotPath::isExpired() const { return expired; } inline bool ShotPath::isReloaded() const { return (currentTime - startTime >= reloadTime); } inline const PlayerId& ShotPath::getPlayer() const { return firingInfo.shot.player; } inline uint16_t ShotPath::getShotId() const { return firingInfo.shot.id; } inline FlagType* ShotPath::getFlag() const { return firingInfo.flagType; } inline float ShotPath::getLifetime() const { return firingInfo.lifetime; } inline float ShotPath::getReloadTime() const { return reloadTime; } inline const TimeKeeper &ShotPath::getStartTime() const { return startTime; } inline const TimeKeeper &ShotPath::getCurrentTime() const { return currentTime; } inline const float* ShotPath::getPosition() const { return firingInfo.shot.pos; } inline const float* ShotPath::getVelocity() const { return firingInfo.shot.vel; } inline FiringInfo& ShotPath::getFiringInfo() { return firingInfo; } inline TeamColor ShotPath::getTeam() const { return firingInfo.shot.team; } inline const ShotStrategy* ShotPath::getStrategy() const { return strategy; } inline ShotStrategy* ShotPath::getStrategy() { return strategy; } #endif /* __SHOTPATH_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotPathSegment.cxx000066400000000000000000000044101200563112200212730ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ShotPathSegment.h" ShotPathSegment::ShotPathSegment(): reason(), bbox() { // do nothing } ShotPathSegment::ShotPathSegment(const TimeKeeper& _start, const TimeKeeper& _end, const Ray& _ray, Reason _reason) : start(_start), end(_end), ray(_ray), reason(_reason) { // compute bounding box ray.getPoint(0.0f, bbox[0]); ray.getPoint(float(end - start), bbox[1]); if (bbox[0][0] > bbox[1][0]) { const float tmp = bbox[0][0]; bbox[0][0] = bbox[1][0]; bbox[1][0] = tmp; } if (bbox[0][1] > bbox[1][1]) { const float tmp = bbox[0][1]; bbox[0][1] = bbox[1][1]; bbox[1][1] = tmp; } if (bbox[0][2] > bbox[1][2]) { const float tmp = bbox[0][2]; bbox[0][2] = bbox[1][2]; bbox[1][2] = tmp; } } ShotPathSegment::ShotPathSegment(const ShotPathSegment& segment) : start(segment.start), end(segment.end), ray(segment.ray), reason(segment.reason) { // copy bounding box bbox[0][0] = segment.bbox[0][0]; bbox[0][1] = segment.bbox[0][1]; bbox[0][2] = segment.bbox[0][2]; bbox[1][0] = segment.bbox[1][0]; bbox[1][1] = segment.bbox[1][1]; bbox[1][2] = segment.bbox[1][2]; } ShotPathSegment::~ShotPathSegment() { // do nothing } ShotPathSegment& ShotPathSegment::operator=(const ShotPathSegment& segment) { if (this != &segment) { start = segment.start; end = segment.end; ray = segment.ray; reason = segment.reason; bbox[0][0] = segment.bbox[0][0]; bbox[0][1] = segment.bbox[0][1]; bbox[0][2] = segment.bbox[0][2]; bbox[1][0] = segment.bbox[1][0]; bbox[1][1] = segment.bbox[1][1]; bbox[1][2] = segment.bbox[1][2]; } return *this; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotPathSegment.h000066400000000000000000000023451200563112200207250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SHOTPATHSEGMENT_H__ #define __SHOTPATHSEGMENT_H__ /* common interface headers */ #include "TimeKeeper.h" #include "Ray.h" class ShotPathSegment { public: enum Reason { Initial, Through, Ricochet, Teleport, Boundary }; ShotPathSegment(); ShotPathSegment(const TimeKeeper& start, const TimeKeeper& end, const Ray& r, Reason = Initial); ShotPathSegment(const ShotPathSegment&); ~ShotPathSegment(); ShotPathSegment& operator=(const ShotPathSegment&); public: TimeKeeper start; TimeKeeper end; Ray ray; Reason reason; float bbox[2][3]; }; #endif /* __SHOTPATHSEGMENT_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStatistics.cxx000066400000000000000000000113011200563112200212030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // Interface header #include "ShotStatistics.h" #include "TimeKeeper.h" ShotStatistics::ShotStatistics() : normalFired(0), normalHit(0), guidedMissileFired(0), guidedMissileHit(0), laserFired(0), laserHit(0), superBulletFired(0), superBulletHit(0), shockWaveFired(0), shockWaveHit(0), thiefFired(0), thiefHit(0) { lastShotTimeDelta = 0; lastShotTime = 0; lastShotDeviation = 0; } ShotStatistics::~ShotStatistics() { } int ShotStatistics::getTotalPerc() const { if (getTotalFired() == 0) return 100; return (int)(100 * ((float)getTotalHit() / (float)getTotalFired())); } void ShotStatistics::recordFire(FlagType* flag, const float *pVec, const float *shotVec ) { if (flag == Flags::GuidedMissile) guidedMissileFired++; else if (flag == Flags::Laser) laserFired++; else if (flag == Flags::SuperBullet) superBulletFired++; else if (flag == Flags::ShockWave) shockWaveFired++; else if (flag == Flags::Thief) thiefFired++; else normalFired++; double currentTime = TimeKeeper::getCurrent().getSeconds(); if (lastShotTime > 0) { lastShotTimeDelta = currentTime-lastShotTime; } lastShotTime = currentTime; float playerNorm[3]; float shotNorm[3]; float playerMag,shotMag; playerMag = sqrt((pVec[0]*pVec[0])+(pVec[1]*pVec[1])+pVec[2]*pVec[2]); shotMag = sqrt((shotVec[0]*shotVec[0])+(shotVec[1]*shotVec[1])+shotVec[2]*shotVec[2]); playerNorm[0] = pVec[0]/playerMag; playerNorm[1] = pVec[1]/playerMag; playerNorm[2] = pVec[2]/playerMag; shotNorm[0] = shotVec[0]/shotMag; shotNorm[1] = shotVec[1]/shotMag; shotNorm[2] = shotVec[2]/shotMag; float dot = (shotNorm[0] * playerNorm[0]) + (shotNorm[1] * playerNorm[1]) + shotNorm[2] * playerNorm[2]; double cos = acos(dot); double radToDeg = 180.0/3.1415; lastShotDeviation = (float)(cos*radToDeg); } void ShotStatistics::recordHit(FlagType* flag) { if (flag == Flags::GuidedMissile) guidedMissileHit++; else if (flag == Flags::Laser) laserHit++; else if (flag == Flags::SuperBullet) superBulletHit++; else if (flag == Flags::ShockWave) shockWaveHit++; else if (flag == Flags::Thief) thiefHit++; else normalHit++; } typedef std::pair FlagStat; FlagType* ShotStatistics::getFavoriteFlag() const { /* return the flag the player fired most */ std::vector flags; FlagStat greatest = std::make_pair(Flags::Null, 0.0f); // no entry for none/null - looking for favorite *flag* flags.push_back(std::make_pair(Flags::GuidedMissile, (float)guidedMissileFired)); flags.push_back(std::make_pair(Flags::Laser, (float)laserFired)); flags.push_back(std::make_pair(Flags::SuperBullet, (float)superBulletFired)); flags.push_back(std::make_pair(Flags::ShockWave, (float)shockWaveFired)); flags.push_back(std::make_pair(Flags::Thief, (float)thiefFired)); // we don't deal with the case where there are two "equally favorite" // flags; doesn't really matter for (int i = 0; i < (int)flags.size(); i++) { if (flags[i].second > greatest.second) greatest = flags[i]; } return greatest.first; } FlagType* ShotStatistics::getBestFlag() const { /* return the flag with the best hits/fired ratio */ std::vector flags; FlagStat greatest = std::make_pair(Flags::Null, 0.0f); // normal shots have the opportunity to be best flags.push_back(std::make_pair(Flags::Null, ((float)normalHit / normalFired))); flags.push_back(std::make_pair(Flags::GuidedMissile, ((float)guidedMissileHit / guidedMissileFired))); flags.push_back(std::make_pair(Flags::Laser, ((float)laserHit / laserFired))); flags.push_back(std::make_pair(Flags::SuperBullet, ((float)superBulletHit / superBulletFired))); flags.push_back(std::make_pair(Flags::ShockWave, ((float)shockWaveHit / shockWaveFired))); flags.push_back(std::make_pair(Flags::Thief, ((float)thiefHit / thiefFired))); // we don't deal with the case where there are two "equally best" // flags; doesn't really matter for (int i = 0; i < (int)flags.size(); i++) { if (flags[i].second > greatest.second) greatest = flags[i]; } return greatest.first; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStatistics.h000066400000000000000000000064011200563112200206350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SHOTSTATISTICS_H__ #define __SHOTSTATISTICS_H__ #include "common.h" #include "Flag.h" /** ShotStatistics stores and calculates a set of statistics on player's shots * and accuracy */ class ShotStatistics { public: ShotStatistics(); ~ShotStatistics(); // raw stats returns int getNormalFired() const; int getNormalHit() const; int getGMFired() const; int getGMHit() const; int getLFired() const; int getLHit() const; int getSBFired() const; int getSBHit() const; int getSWFired() const; int getSWHit() const; int getTHFired() const; int getTHHit() const; // stats processing int getTotalFired() const; int getTotalHit() const; int getTotalPerc() const; FlagType* getFavoriteFlag() const; FlagType* getBestFlag() const; // tally functions void recordFire(FlagType* flag, const float *pVec, const float *shotVec); void recordHit(FlagType* flag); double getLastShotTimeDelta ( void ) const {return lastShotTimeDelta;} double getLastShotDeviation ( void ) const {return lastShotDeviation;} private: int normalFired; int normalHit; int guidedMissileFired; int guidedMissileHit; int laserFired; int laserHit; int superBulletFired; int superBulletHit; int shockWaveFired; int shockWaveHit; int thiefFired; int thiefHit; double lastShotTimeDelta; double lastShotTime; float lastShotDeviation; }; inline int ShotStatistics::getNormalFired() const { return normalFired; } inline int ShotStatistics::getNormalHit() const { return normalHit; } inline int ShotStatistics::getGMFired() const { return guidedMissileFired; } inline int ShotStatistics::getGMHit() const { return guidedMissileHit; } inline int ShotStatistics::getLFired() const { return laserFired; } inline int ShotStatistics::getLHit() const { return laserHit; } inline int ShotStatistics::getSBFired() const { return superBulletFired; } inline int ShotStatistics::getSBHit() const { return superBulletHit; } inline int ShotStatistics::getSWFired() const { return shockWaveFired; } inline int ShotStatistics::getSWHit() const { return shockWaveHit; } inline int ShotStatistics::getTHFired() const { return thiefFired; } inline int ShotStatistics::getTHHit() const { return thiefHit; } inline int ShotStatistics::getTotalFired() const { return normalFired + guidedMissileFired + laserFired + superBulletFired + shockWaveFired + thiefFired; } inline int ShotStatistics::getTotalHit() const { return normalHit + guidedMissileHit + laserHit + superBulletHit + shockWaveHit + thiefHit; } #endif // __SHOTSTATISTICS_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStats.cxx000066400000000000000000000137571200563112200201700ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface headers */ #include "ShotStats.h" /* common implementation headers */ #include "FontManager.h" #include "TextUtils.h" /* local implementation headers */ #include "ShotStatsDefaultKey.h" #include "HUDDialogStack.h" #include "HUDuiLabel.h" #include "LocalPlayer.h" #include "Roster.h" ShotStats::ShotStats() : HUDDialog() { std::vector& listHUD = getControls(); // add title createLabel("Shot Statistics", listHUD); // key createLabel("Shots Hit/Fired", listHUD); columns = 11; rows = 0; // section headings (upper) createLabel("", listHUD); createLabel("", listHUD); createLabel("", listHUD); createLabel("", listHUD); createLabel("", listHUD); createLabel("", listHUD); createLabel("Super", listHUD); createLabel("Shock", listHUD); createLabel("", listHUD); createLabel("Fave.", listHUD); createLabel("Best", listHUD); ++rows; // section headings (lower) createLabel("Player", listHUD); createLabel("Hit%", listHUD); createLabel("Total", listHUD); createLabel("Norm", listHUD); createLabel("GM", listHUD); createLabel("Laser", listHUD); createLabel("Bullet", listHUD); createLabel("Wave", listHUD); createLabel("Thief", listHUD); createLabel("Flag", listHUD); createLabel("Flag", listHUD); ++rows; // my statistics first LocalPlayer* myTank = LocalPlayer::getMyTank(); if (myTank->getTeam() != ObserverTeam) { addStats((Player*)myTank, listHUD); } // add statistics for each player for (int i = 0; i < curMaxPlayers; ++i) { if (remotePlayers[i] && (remotePlayers[i]->getTeam() != ObserverTeam)) { addStats((Player*)remotePlayers[i], listHUD); } } resize(HUDDialog::getWidth(), HUDDialog::getHeight()); initNavigation(listHUD, 1, 1); } ShotStats::~ShotStats() { } void ShotStats::createLabel(const std::string &str, std::vector &_list) { HUDuiLabel* control = new HUDuiLabel; control->setFontFace(getFontFace()); control->setString(str); _list.push_back(control); } void ShotStats::addStats(Player *_player, std::vector &_list) { const ShotStatistics* stats = _player->getShotStatistics(); createLabel(_player->getCallSign(), _list); createLabel(TextUtils::format("%2d%%", stats->getTotalPerc()), _list); createLabel(TextUtils::format("%d/%d", stats->getTotalHit(), stats->getTotalFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getNormalHit(), stats->getNormalFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getGMHit(), stats->getGMFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getLHit(), stats->getLFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getSBHit(), stats->getSBFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getSWHit(), stats->getSWFired()), _list); createLabel(TextUtils::format("%d/%d", stats->getTHHit(), stats->getTHFired()), _list); std::string flagName = stats->getFavoriteFlag()->flagAbbv; if (flagName.empty()) flagName = "None"; createLabel(flagName, _list); flagName = stats->getBestFlag()->flagAbbv; if (flagName.empty()) flagName = "None"; createLabel(flagName, _list); ++rows; } int ShotStats::getFontFace() { // create font return FontManager::instance().getFaceID(BZDB.get("sansSerifFont")); } HUDuiDefaultKey* ShotStats::getDefaultKey() { return ShotStatsDefaultKey::getInstance(); } void ShotStats::execute() { HUDDialogStack::get()->pop(); } void ShotStats::resize(int _width, int _height) { HUDDialog::resize(_width, _height); // Reposition everything -- that's gonna be a challenge! FontManager &fm = FontManager::instance(); // set up table // total width / (number of columns + 3 columns extra for player name + 2 columns margin) const float columnWidth = _width / (columns + 5.0f); const float fontSize = (float) columnWidth / 6; const float rowHeight = fm.getStrHeight(getFontFace(), fontSize, " ") * 1.2f; // center title const float titleFontSize = (float)_height / 15.0f; std::vector& listHUD = getControls(); HUDuiLabel* title = (HUDuiLabel*)listHUD[0]; title->setFontSize(titleFontSize); const float titleWidth = fm.getStrLength(getFontFace(), titleFontSize, title->getString()); const float titleHeight = fm.getStrHeight(getFontFace(), titleFontSize, " "); const float titleY = (float)_height - titleHeight; float x = 0.5f * ((float)_width - titleWidth); float y = titleY; title->setPosition(x, y); // center key HUDuiLabel* key = (HUDuiLabel*)listHUD[1]; key->setFontSize(fontSize); const float keyCenter = ((columns / 2) + 4) * columnWidth; const float keyWidth = fm.getStrLength(getFontFace(), fontSize, key->getString()); const float keyY = titleY - 2 * fm.getStrHeight(getFontFace(), fontSize, " "); y = keyY; x = keyCenter - 0.5f * keyWidth; key->setPosition(x, y); for (int i = 2; i < (int)listHUD.size(); ++i) { // determine row & column (i - 2 to account for title & key) int row = (i - 2) / columns; int column = (i - 2) - (columns * row) + 1; // account for 3 extra columns in player name if (column > 1) column = column + 3; // find coordinates corresponding to this row & column x = column * columnWidth; y = keyY - (row + 1) * rowHeight; // move label to the specified coordinates listHUD[i]->setFontSize(fontSize); listHUD[i]->setPosition(x, y); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStats.h000066400000000000000000000023561200563112200176060ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SHOTSTATS_H__ #define __SHOTSTATS_H__ #include "common.h" #include "HUDDialog.h" #include "HUDuiControl.h" #include "HUDuiDefaultKey.h" class Player; /** ShotStats displays a set of statistics on player's shots and accuracies */ class ShotStats : public HUDDialog { public: ShotStats(); ~ShotStats(); HUDuiDefaultKey* getDefaultKey(); void resize(int width, int height); void execute(void); void addStats(Player* player, std::vector& list); static int getFontFace(); private: void createLabel(const std::string &str, std::vector& list); int rows; int columns; }; #endif // __SHOTSTATS_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStatsDefaultKey.cxx000066400000000000000000000033501200563112200221320ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ShotStatsDefaultKey.h" /* common implementation headers */ #include "KeyManager.h" #include "CommandManager.h" /* local implementation headers */ #include "HUDDialogStack.h" #include "HUDDialog.h" ShotStatsDefaultKey ShotStatsDefaultKey::instance; ShotStatsDefaultKey::ShotStatsDefaultKey() { } ShotStatsDefaultKey::~ShotStatsDefaultKey() { } ShotStatsDefaultKey* ShotStatsDefaultKey::getInstance() { return &instance; } bool ShotStatsDefaultKey::keyPress(const BzfKeyEvent& key) { // special keys to get out switch (key.ascii) { case 27: // escape HUDDialogStack::get()->pop(); return true; case 13: // return HUDDialogStack::get()->top()->execute(); return true; } if (key.button == BzfKeyEvent::Home) { HUDDialogStack::get()->pop(); return true; } // allow all commands to run std::string keyCommand = KEYMGR.get(key, true); if (keyCommand != "") { CMDMGR.run(keyCommand); return true; } // all other keys return HUDDialogStack::get()->pop(); return true; } bool ShotStatsDefaultKey::keyRelease(const BzfKeyEvent& UNUSED(key)) { return true; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStatsDefaultKey.h000066400000000000000000000021271200563112200215600ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SHOTSTATSDEFAULTKEY_H__ #define __SHOTSTATSDEFAULTKEY_H__ /* common interface headers */ #include "BzfEvent.h" /* local interface headers */ #include "HUDuiDefaultKey.h" class ShotStatsDefaultKey : public HUDuiDefaultKey { public: ShotStatsDefaultKey(); ~ShotStatsDefaultKey(); bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); static ShotStatsDefaultKey* getInstance(); private: static ShotStatsDefaultKey instance; }; #endif /* __SHOTSTATSDEFAULTKEY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStrategy.cxx000066400000000000000000000107521200563112200206640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "ShotStrategy.h" /* common implementation headers */ #include "CollisionManager.h" #include "Obstacle.h" #include "ObstacleList.h" #include "WallObstacle.h" #include "ObstacleMgr.h" ShotStrategy::ShotStrategy(ShotPath* _path) : path(_path) { // do nothing } ShotStrategy::~ShotStrategy() { // do nothing } bool ShotStrategy::isStoppedByHit() const { return true; } void ShotStrategy::sendUpdate(const FiringInfo&) const { // do nothing by default -- normal shots don't need updates } void ShotStrategy::readUpdate(uint16_t, void*) { // do nothing by default -- normal shots don't need updates } void ShotStrategy::expire() { // do nothing by default } void ShotStrategy::setReloadTime(float t) const { path->setReloadTime(t); } void ShotStrategy::setPosition(const float* p) const { path->setPosition(p); } void ShotStrategy::setVelocity(const float* v) const { path->setVelocity(v); } void ShotStrategy::setExpiring() const { path->setExpiring(); } void ShotStrategy::setExpired() const { path->setExpired(); } FiringInfo& ShotStrategy::getFiringInfo(ShotPath* p) const { return p->getFiringInfo(); } const Obstacle* ShotStrategy::getFirstBuilding(const Ray& ray, float min, float& t) { const Obstacle* closestObstacle = NULL; unsigned int i = 0; // check walls const ObstacleList& walls = OBSTACLEMGR.getWalls(); for (i = 0; i < walls.size(); i++) { const WallObstacle* wall = (const WallObstacle*) walls[i]; if (!wall->isShootThrough()) { const float wallt = wall->intersect(ray); if (wallt > min && wallt < t) { t = wallt; closestObstacle = wall; } } } //check everything else const ObsList* olist = COLLISIONMGR.rayTest (&ray, t); for (i = 0; i < (unsigned int)olist->count; i++) { const Obstacle* obs = olist->list[i]; if (!obs->isShootThrough()) { const float timet = obs->intersect(ray); if (obs->getType() == Teleporter::getClassName()) { const Teleporter* tele = (const Teleporter*) obs; int face; if ((timet > min) && (timet < t) && (tele->isTeleported(ray, face) < 0.0f)) { t = timet; closestObstacle = obs; } } else { if ((timet > min) && (timet < t)) { t = timet; closestObstacle = obs; } } } } return closestObstacle; } void ShotStrategy::reflect(float* v, const float* n) // const { // normal is assumed to be normalized, v needn't be float d = -2.0f * ((n[0] * v[0]) + (n[1] * v[1]) + (n[2] * v[2])); if (d >= 0.0f) { // normal reflection v[0] += d * n[0]; v[1] += d * n[1]; v[2] += d * n[2]; } else { // refraction due to inverted normal (still using the 2X factor) float oldSpeed = sqrtf((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2])); d = -2.0f * d; // now using 4X refraction factor v[0] += d * n[0]; v[1] += d * n[1]; v[2] += d * n[2]; // keep the same speed as the incoming vector float newSpeed = sqrtf((v[0] * v[0]) + (v[1] * v[1]) + (v[2] * v[2])); const float scale = (oldSpeed / newSpeed); v[0] *= scale; v[1] *= scale; v[2] *= scale; } return; } const Teleporter* ShotStrategy::getFirstTeleporter(const Ray& ray, float min, float& t, int& f) const { const Teleporter* closestTeleporter = NULL; int face; const ObstacleList& teles = OBSTACLEMGR.getTeles(); for (unsigned int i = 0; i < teles.size(); i++) { const Teleporter& tele = *((const Teleporter*) teles[i]); const float telet = tele.isTeleported(ray, face); if (telet > min && telet < t) { t = telet; f = face; closestTeleporter = &tele; } } return closestTeleporter; } bool ShotStrategy::getGround(const Ray& r, float min, float &t) const { if (r.getDirection()[2] >= 0.0f) return false; float groundT = r.getOrigin()[2] / -r.getDirection()[2]; if ((groundT > min) && (groundT < t)) { t = groundT; return true; } return false; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/ShotStrategy.h000066400000000000000000000046771200563112200203220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * ShotStrategy: * Interface for all shot flight path strategies. A * strategy encapsulates the algorithm for computing * the path taken by a shot. */ #ifndef __SHOTSTRATEGY_H__ #define __SHOTSTRATEGY_H__ #include "common.h" /* common interface headers */ #include "Ray.h" #include "Obstacle.h" #include "Teleporter.h" #include "SceneDatabase.h" /* local interface headers */ #include "BaseLocalPlayer.h" #include "ShotPath.h" class ShotPath; class ShotStrategy { public: ShotStrategy(ShotPath*); virtual ~ShotStrategy(); virtual void update(float dt) = 0; virtual float checkHit(const BaseLocalPlayer*, float pos[3]) const = 0; virtual bool isStoppedByHit() const; virtual void addShot(SceneDatabase*, bool colorblind) = 0; virtual void expire(); virtual void radarRender() const = 0; // first part of message must be the // ShotUpdate portion of FiringInfo. virtual void sendUpdate(const FiringInfo&) const; // update shot based on message. code is the message code. msg // points to the part of the message after the ShotUpdate portion. virtual void readUpdate(uint16_t code, void* msg); static const Obstacle* getFirstBuilding(const Ray&, float min, float& t); static void reflect(float* v, const float* n); // const protected: const ShotPath& getPath() const; FiringInfo& getFiringInfo(ShotPath*) const; void setReloadTime(float) const; void setPosition(const float*) const; void setVelocity(const float*) const; void setExpiring() const; void setExpired() const; const Teleporter* getFirstTeleporter(const Ray&, float min, float& t, int& f) const; bool getGround(const Ray&, float min, float &t) const; private: ShotPath* path; }; inline const ShotPath& ShotStrategy::getPath() const { return *path; } #endif /* __SHOTSTRATEGY_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/SilenceDefaultKey.cxx000066400000000000000000000115621200563112200215640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "SilenceDefaultKey.h" // system headers #include // common implementation headers #include "KeyManager.h" // local implementation headers #include "LocalPlayer.h" #include "HUDRenderer.h" #include "HUDui.h" #include "Roster.h" #include "playing.h" // THIS IS TEMPORARY..TO BE REMOVED..BABY STEPS // // Choose person to silence SilenceDefaultKey::SilenceDefaultKey() { } bool SilenceDefaultKey::keyPress(const BzfKeyEvent& key) { bool sendIt; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank && KEYMGR.get(key, true) == "jump") { // jump while typing myTank->setJump(); } if (myTank && myTank->getInputMethod() != LocalPlayer::Keyboard) { if ((key.button == BzfKeyEvent::Up) || (key.button == BzfKeyEvent::Down) || (key.button == BzfKeyEvent::Left) || (key.button == BzfKeyEvent::Right)) return true; } switch (key.ascii) { case 3: // ^C case 27: // escape // case 127: // delete sendIt = false; // finished composing -- don't send break; case 4: // ^D case 13: // return sendIt = true; break; default: return false; } if (sendIt) { std::string message = hud->getComposeString(); // find the name of the person to silence, // either by picking through arrow keys or by compose const char* name = NULL; if (myTank && message.size() == 0) { // silence just by picking arrowkeys const Player * silenceMe = myTank->getRecipient(); if (silenceMe) { name = silenceMe->getCallSign(); } } else if (message.size() > 0) { // typed in name name = message.c_str(); } // if name is NULL we skip if (name != NULL) { // bad indent :) int inListPos = -1; for (unsigned int i = 0; i < silencePlayers.size(); i++) { if (strcmp(silencePlayers[i].c_str(),name) == 0) { inListPos = i; } } bool isInList = (inListPos != -1); Player *loudmouth = getPlayerByName(name); if (loudmouth) { // we know this person exists if (!isInList) { // exists and not in silence list silencePlayers.push_back(name); std::string silenceMessage = "Silenced "; silenceMessage += (name); addMessage(NULL, silenceMessage); } else { // exists and in list --> remove from list silencePlayers.erase(silencePlayers.begin() + inListPos); std::string silenceMessage = "Unsilenced "; silenceMessage += (name); addMessage(NULL, silenceMessage); } } else { // person does not exist, but may be in silence list if (isInList) { // does not exist but is in list --> remove silencePlayers.erase(silencePlayers.begin() + inListPos); std::string silenceMessage = "Unsilenced "; silenceMessage += (name); if (strcmp (name, "*") == 0) { // to make msg fancier silenceMessage = "Unblocked Msgs"; } addMessage(NULL, silenceMessage); } else { // does not exist and not in list -- duh if (name != NULL) { if (strcmp (name,"*") == 0) { // check for * case silencePlayers.push_back(name); std::string silenceMessage = "Silenced All Msgs"; addMessage(NULL, silenceMessage); } else { std::string silenceMessage = name; silenceMessage += (" Does not exist"); addMessage(NULL, silenceMessage); } } } } } } hud->setComposing(std::string()); HUDui::setDefaultKey(NULL); return true; } bool SilenceDefaultKey::keyRelease(const BzfKeyEvent& key) { LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!myTank) return false; if (myTank->getInputMethod() != LocalPlayer::Keyboard) { if (key.button == BzfKeyEvent::Up || key.button==BzfKeyEvent::Down ||key.button==BzfKeyEvent::Left||key.button==BzfKeyEvent::Right) { // exclude robots from silence recipient list they don't talk selectNextRecipient(key.button == BzfKeyEvent::Up || key.button == BzfKeyEvent::Right, false); const Player *recipient = myTank->getRecipient(); if (recipient) { const std::string name = recipient->getCallSign(); bool isInList = false; for (unsigned int i = 0; i < silencePlayers.size(); i++) { if (silencePlayers[i] == name) { isInList = true; break; } } std::string composePrompt = "Silence -->"; if (isInList) composePrompt = "Un" + composePrompt; composePrompt += name; // Set the prompt and disable editing/composing hud->setComposing(composePrompt, false); } return false; } } return keyPress(key); } bzflag-2.4.2+ds1/src/bzflag/SilenceDefaultKey.h000066400000000000000000000015451200563112200212110ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __SILENCEDEFAULTKEY_H__ #define __SILENCEDEFAULTKEY_H__ #include "HUDuiDefaultKey.h" class SilenceDefaultKey : public HUDuiDefaultKey { public: SilenceDefaultKey(); bool keyPress(const BzfKeyEvent&); bool keyRelease(const BzfKeyEvent&); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/TargetingUtils.cxx000066400000000000000000000100461200563112200211650ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "TargetingUtils.h" // system headers #include // common headers #include "Ray.h" // local headers #include "ShotStrategy.h" // These routines are 2 dimensional float TargetingUtils::normalizeAngle(float ang) { if (ang < -1.0f * M_PI) ang += (float)(2.0 * M_PI); if (ang > 1.0f * M_PI) ang -= (float)(2.0 * M_PI); return ang; } void TargetingUtils::getUnitVector( const float *src, const float *target, float unitVector[3] ) { unitVector[0] = target[0] - src[0]; unitVector[1] = target[1] - src[1]; unitVector[2] = 0.0f; float len = (float) sqrt(unitVector[0] * unitVector[0] + unitVector[1] * unitVector[1]); if (len == 0.0f) return; unitVector[0] /= len; unitVector[1] /= len; } void TargetingUtils::get3DUnitVector( const float *src, const float *target, float unitVector[3] ) { unitVector[0] = target[0] - src[0]; unitVector[1] = target[1] - src[1]; unitVector[2] = target[2] - src[1]; float len = (float) sqrt(unitVector[0] * unitVector[0] + unitVector[1] * unitVector[1] + unitVector[2] * unitVector[2]); if (len == 0.0f) return; unitVector[0] /= len; unitVector[1] /= len; unitVector[2] /= len; } float TargetingUtils::getTargetDistance( const float *src, const float *target ) { float vec[2]; vec[0] = target[0] - src[0]; vec[1] = target[1] - src[1]; return (float) sqrt(vec[0] * vec[0] + vec[1] * vec[1]); } float TargetingUtils::getTargetAzimuth( const float *src, const float *target ) { return atan2f((target[1] - src[1]), (target[0] - src[0])); } float TargetingUtils::getTargetRotation( const float startAzimuth, float targetAzimuth ) { float targetRotation = targetAzimuth - startAzimuth; if (targetRotation < -1.0f * M_PI) targetRotation += (float)(2.0 * M_PI); if (targetRotation > 1.0f * M_PI) targetRotation -= (float)(2.0 * M_PI); return targetRotation; } float TargetingUtils::getTargetAngleDifference( const float *src, float srcAzimuth, const float *target ) { float targetUnitVector[3]; float srcUnitVector[3]; getUnitVector(src, target, targetUnitVector); srcUnitVector[0] = cosf(srcAzimuth); srcUnitVector[1] = sinf(srcAzimuth); srcUnitVector[2] = 0.0f; return acos( targetUnitVector[0]*srcUnitVector[0] + targetUnitVector[1]*srcUnitVector[1] ); } bool TargetingUtils::isLocationObscured( const float *src, const float *target ) { float dir[3]; getUnitVector(src, target, dir); Ray tankRay( src, dir ); float targetDistance = getTargetDistance(src, target); const Obstacle *building = ShotStrategy::getFirstBuilding(tankRay, -0.5f, targetDistance); return building != NULL; } float TargetingUtils::getOpenDistance( const float *src, const float azimuth ) { float t = MAXFLOAT; //Some constant? float dir[3] = { cosf(azimuth), sinf(azimuth), 0.0f }; *((float *) &src[2]) += 0.1f; //Don't hit building because your sitting on one Ray tankRay( src, dir ); *((float *) &src[2]) -= 0.1f; ShotStrategy::getFirstBuilding(tankRay, -0.5f, t); return t; } bool TargetingUtils::getFirstCollisionPoint( const float *src, const float *target, float *collisionPt ) { float t = MAXFLOAT; float dir[3]; get3DUnitVector(src, target, dir); Ray tankRay( src, dir ); const Obstacle *building = ShotStrategy::getFirstBuilding(tankRay, 0.0f, t); if (building == NULL) return false; collisionPt[0] = src[0] + dir[0] * t; collisionPt[1] = src[1] + dir[1] * t; collisionPt[2] = src[2] + dir[2] * t; return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/TargetingUtils.h000066400000000000000000000030071200563112200206110ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef _TARGETINGUTILS__H_ #define _TARGETINGUTILS__H_ // common - 1st #include "common.h" class TargetingUtils { public: static float normalizeAngle( float ang ); static void getUnitVector( const float *src, const float *target, float unitVector[3] ); static void get3DUnitVector( const float *src, const float *target, float unitVector[3] ); static float getTargetDistance( const float *src, const float *target ); static float getTargetAzimuth( const float *src, const float *target ); static float getTargetRotation( const float startAzimuth, float targetAzimuth ); static float getTargetAngleDifference( const float *src, float srcAzimuth, const float *target ); static bool isLocationObscured( const float *src, const float *target ); static float getOpenDistance( const float *src, const float azimuth ); static bool getFirstCollisionPoint( const float *src, const float *target, float *collisionPt ); }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/TrackMarks.cxx000066400000000000000000000453771200563112200203010ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // Interface header #include "TrackMarks.h" // Common interface headers #include "StateDatabase.h" #include "BZDBCache.h" #include "Obstacle.h" #include "CollisionManager.h" #include "PhysicsDriver.h" #include "Ray.h" #include "TextureManager.h" #include "SceneDatabase.h" #include "SceneRenderer.h" #include "SceneNode.h" using namespace TrackMarks; //#define FANCY_TREADMARKS // uses glPolygonOffset() (only for zbuffer) enum TrackType { TreadsTrack = 0, PuddleTrack = 1, SmokeTrack = 2 }; enum TrackSides { LeftTread = (1 << 0), RightTread = (1 << 1), BothTreads = (LeftTread | RightTread) }; // // Helper Classes (TrackEntry, TrackList, TrackRenderNode, TrackSceneNode) // class TrackEntry { public: ~TrackEntry(); TrackEntry* getNext(); protected: TrackEntry* next; TrackEntry* prev; public: float pos[3]; float angle; float scale; char sides; int phydrv; float lifeTime; class TrackSceneNode* sceneNode; friend class TrackList; }; inline TrackEntry* TrackEntry::getNext() { return next; } class TrackList { public: TrackList() { start = end = NULL; } ~TrackList() { clear(); } void clear(); TrackEntry* getStart() { return start; } TrackEntry* getEnd() { return end; } void addNode(TrackEntry&); TrackEntry* removeNode(TrackEntry*); // return the next entry private: TrackEntry* start; TrackEntry* end; }; inline void TrackList::addNode(TrackEntry& te) { TrackEntry* copy = new TrackEntry; *copy = te; copy->next = NULL; if (end == NULL) { copy->prev = NULL; start = end = copy; } else { copy->prev = end; end->next = copy; end = copy; } return; } inline TrackEntry* TrackList::removeNode(TrackEntry* te) { TrackEntry* const next = te->next; TrackEntry* const prev = te->prev; if (next != NULL) { next->prev = prev; } else { end = prev; } if (prev != NULL) { prev->next = next; } else { start = next; } delete te; // delete it (and its sceneNode, in ~TrackEntry()) return next; } class TrackRenderNode : public RenderNode { public: TrackRenderNode(const TrackEntry* te, TrackType type); ~TrackRenderNode(); void render(); void renderShadow() { return; } const GLfloat* getPosition() const { return te->pos; } private: TrackType type; const TrackEntry* te; }; class TrackSceneNode : public SceneNode { public: TrackSceneNode(const TrackEntry*, TrackType, const OpenGLGState*); ~TrackSceneNode(); void addRenderNodes(SceneRenderer&); void update(); // set the sphere properties private: TrackType type; const TrackEntry* te; const OpenGLGState* gstate; TrackRenderNode renderNode; }; // // Local Variables // static TrackList SmokeList; static TrackList PuddleList; static TrackList TreadsGroundList; static TrackList TreadsObstacleList; static float TrackFadeTime = 5.0f; static float UserFadeScale = 1.0f; static AirCullStyle AirCull = FullAirCull; // FIXME - get these from AnimatedTreads static const float TreadOutside = 1.4f; static const float TreadInside = 0.875f; static const float TreadMiddle = 0.5f * (TreadOutside + TreadInside); static const float TreadMarkWidth = 0.2f; static OpenGLGState smokeGState; static const char smokeTexture[] = "puddle"; // FIXME - not implemented static OpenGLGState puddleGState; static const char puddleTexture[] = "puddle"; static OpenGLGState treadsGState; #ifndef FANCY_TREADMARKS static const float TextureHeightOffset = 0.05f; #else static const float TextureHeightOffset = 0.0f; #endif // FANCY_TREADMARKS // // Function Prototypes // static void setup(); static void drawSmoke(const TrackEntry& te); static void drawPuddle(const TrackEntry& te); static void drawTreads(const TrackEntry& te); static bool onBuilding(const float pos[3]); static void updateList(TrackList& list, float dt); static void addEntryToList(TrackList& list, TrackEntry& te, TrackType type); /****************************************************************************/ // // TrackMarks // void TrackMarks::init() { clear(); setup(); setUserFade(BZDB.eval("userTrackFade")); setAirCulling((AirCullStyle)BZDB.evalInt("trackMarkCulling")); return; } void TrackMarks::kill() { clear(); return; } void TrackMarks::clear() { SmokeList.clear(); PuddleList.clear(); TreadsGroundList.clear(); TreadsObstacleList.clear(); return; } void TrackMarks::setUserFade(float value) { if (value < 0.0f) { value = 0.0f; } else if (value > 1.0f) { value = 1.0f; } UserFadeScale = value; BZDB.setFloat("userTrackFade", value); return; } float TrackMarks::getUserFade() { return BZDB.eval("userTrackFade"); } void TrackMarks::setAirCulling(AirCullStyle style) { if ((style < NoAirCull) || (style > FullAirCull)) { style = NoAirCull; } AirCull = style; BZDB.setInt("trackMarkCulling", style); return; } AirCullStyle TrackMarks::getAirCulling() { return (AirCullStyle)BZDB.evalInt("trackMarkCulling"); } static void addEntryToList(TrackList& list, TrackEntry& te, TrackType type) { // push the entry list.addNode(te); // make a sceneNode for the BSP rendering, if not on the ground if (!BZDBCache::zbuffer && (te.pos[2] != TextureHeightOffset)) { const OpenGLGState* gstate = NULL; if (type == TreadsTrack) { gstate = &treadsGState; } else if (type == PuddleTrack) { gstate = &puddleGState; } else if (type == SmokeTrack) { gstate = &smokeGState; } else { return; } TrackEntry* copy = list.getEnd(); copy->sceneNode = new TrackSceneNode(copy, type, gstate); } return; } bool TrackMarks::addMark(const float pos[3], float scale, float angle, int phydrv) { TrackEntry te; TrackType type; te.lifeTime = 0.0f; te.sceneNode = NULL; // determine the track mark type if ((pos[2] <= 0.1f) && BZDB.get(StateDatabase::BZDB_MIRROR) != "none") { type = PuddleTrack; if (pos[2] < 0.0f) { scale = 0.0f; // single puddle, like Narrow tanks } } else { type = TreadsTrack; if (scale < 0.01f) { return false; // Narrow tanks don't draw tread marks } if (pos[2] < 0.0f) { return false; // Burrowed tanks don't draw tread marks } } // copy some parameters te.pos[0] = pos[0]; te.pos[1] = pos[1]; if (pos[2] < 0.0f) { te.pos[2] = TextureHeightOffset; } else { te.pos[2] = pos[2] + TextureHeightOffset; } te.scale = scale; te.angle = (float)(angle * (180.0 / M_PI)); // in degress, for glRotatef() // only use the physics driver if it matters const PhysicsDriver* driver = PHYDRVMGR.getDriver(phydrv); if (driver == NULL) { te.phydrv = -1; } else { const float* v = driver->getLinearVel(); const float av = driver->getAngularVel(); if ((v[0] == 0.0f) && (v[1] == 0.0f) && (av == 0.0f)) { te.phydrv = -1; } else { te.phydrv = phydrv; } } if (type == PuddleTrack) { // Puddle track marks addEntryToList(PuddleList, te, type); } else { // Treads track marks if (pos[2] == 0.0f) { // no culling required te.sides = BothTreads; addEntryToList(TreadsGroundList, te, type); } else if ((AirCull & InitAirCull) == 0) { // do not cull the air marks te.sides = BothTreads; addEntryToList(TreadsObstacleList, te, type); } else { // cull based on track mark support te.sides = 0; float markPos[3]; markPos[2] = pos[2]; const float dx = -sinf(angle) * TreadMiddle; const float dy = +cosf(angle) * TreadMiddle; // left tread markPos[0] = pos[0] + dx; markPos[1] = pos[1] + dy; if (onBuilding(markPos)) { te.sides |= LeftTread; } // right tread markPos[0] = pos[0] - dx; markPos[1] = pos[1] - dy; if (onBuilding(markPos)) { te.sides |= RightTread; } // add if required if (te.sides != 0) { addEntryToList(TreadsObstacleList, te, type); } else { return false; } } } return true; } static bool onBuilding(const float pos[3]) { const float dir[3] = {0.0f, 0.0f, -1.0f}; const float org[3] = {pos[0], pos[1], pos[2] + 0.1f}; Ray ray(org, dir); const ObsList* olist = COLLISIONMGR.rayTest (&ray, 0.5f); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (obs->isFlatTop()) { const float top = obs->getExtents().maxs[2]; if ((pos[2] >= (top - 0.1f)) && (pos[2] <= (top + 0.1f))) { const float hitTime = obs->intersect(ray); if (hitTime >= 0.0f) { return true; } } } } return false; } static void updateList(TrackList& list, float dt) { TrackEntry* ptr = list.getStart(); while (ptr != NULL) { TrackEntry& te = *ptr; // increase the lifeTime te.lifeTime += dt; // see if this mark has expired if (te.lifeTime > TrackFadeTime) { ptr = list.removeNode(ptr); continue; } // update for the Physics Driver const PhysicsDriver* phydrv = PHYDRVMGR.getDriver(te.phydrv); if (phydrv != NULL) { const float* v = phydrv->getLinearVel(); te.pos[0] += (v[0] * dt); te.pos[1] += (v[1] * dt); const float av = phydrv->getAngularVel(); if (av != 0.0f) { const float* ap = phydrv->getAngularPos(); const float da = (av * dt); const float cos_val = cosf(da); const float sin_val = sinf(da); const float dx = te.pos[0] - ap[0]; const float dy = te.pos[1] - ap[1]; te.pos[0] = ap[0] + ((cos_val * dx) - (sin_val * dy)); te.pos[1] = ap[1] + ((cos_val * dy) + (sin_val * dx)); te.angle += (float)(da * (180.0 / M_PI)); } if ((AirCull & PhyDrvAirCull) != 0) { // no need to cull ground marks if (te.pos[2] == 0.0f) { continue; } // cull the track marks if they aren't supported float markPos[3]; markPos[2] = te.pos[2] - TextureHeightOffset; const float radians = (float)(te.angle * (M_PI / 180.0)); const float dx = -sinf(radians) * TreadMiddle; const float dy = +cosf(radians) * TreadMiddle; // left tread if ((te.sides & LeftTread) != 0) { markPos[0] = te.pos[0] + dx; markPos[1] = te.pos[1] + dy; if (!onBuilding(markPos)) { te.sides &= ~LeftTread; } } // right tread if ((te.sides & RightTread) != 0) { markPos[0] = te.pos[0] - dx; markPos[1] = te.pos[1] - dy; if (!onBuilding(markPos)) { te.sides &= ~RightTread; } } // cull this node if (te.sides == 0) { ptr = list.removeNode(ptr); continue; } } } ptr = ptr->getNext(); } return; } void TrackMarks::update(float dt) { TrackFadeTime = BZDB.eval(StateDatabase::BZDB_TRACKFADE); TrackFadeTime = TrackFadeTime * UserFadeScale; if (TrackFadeTime <= 0.0f) { clear(); return; } updateList(SmokeList, dt); updateList(PuddleList, dt); updateList(TreadsGroundList, dt); updateList(TreadsObstacleList, dt); return; } static void setup() { OpenGLGStateBuilder gb; int puddleTexId = -1; if (BZDBCache::texture) { TextureManager &tm = TextureManager::instance(); puddleTexId = tm.getTextureID(puddleTexture, false); } gb.reset(); gb.setShading(GL_FLAT); gb.setAlphaFunc(GL_GEQUAL, 0.1f); gb.setBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gb.enableMaterial(false); // no lighting if (puddleTexId >= 0) { gb.setTexture(puddleTexId); } puddleGState = gb.getState(); int smokeTexId = -1; if (BZDBCache::texture) { TextureManager &tm = TextureManager::instance(); smokeTexId = tm.getTextureID(smokeTexture, false); } gb.reset(); gb.setShading(GL_FLAT); gb.setBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gb.enableMaterial(false); // no lighting if (smokeTexId >= 0) { gb.setTexture(smokeTexId); } smokeGState = gb.getState(); gb.reset(); gb.setShading(GL_FLAT); gb.setBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gb.enableMaterial(false); // no lighting treadsGState = gb.getState(); return; } void TrackMarks::notifyStyleChange() { setup(); return; } void TrackMarks::renderGroundTracks() { TrackEntry* ptr; // disable the zbuffer for drawing on the ground if (BZDBCache::zbuffer) { glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); } // draw ground treads treadsGState.setState(); for (ptr = TreadsGroundList.getStart(); ptr != NULL; ptr = ptr->getNext()) { drawTreads(*ptr); } // draw puddles puddleGState.setState(); for (ptr = PuddleList.getStart(); ptr != NULL; ptr = ptr->getNext()) { drawPuddle(*ptr); } // re-enable the zbuffer if (BZDBCache::zbuffer) { glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); } return; } void TrackMarks::renderObstacleTracks() { if (!BZDBCache::zbuffer) { return; // this is not for the BSP rendering } TrackEntry* ptr; // disable the zbuffer writing (these are the last things drawn) // this helps to avoid the zbuffer fighting/flickering effect glDepthMask(GL_FALSE); // draw treads #ifdef FANCY_TREADMARKS glDepthFunc(GL_LEQUAL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(-1.0f, -1.0f); #endif // FANCY_TREADMARKS treadsGState.setState(); for (ptr = TreadsObstacleList.getStart(); ptr != NULL; ptr = ptr->getNext()) { drawTreads(*ptr); } #ifdef FANCY_TREADMARKS glDepthFunc(GL_LESS); glDisable(GL_POLYGON_OFFSET_FILL); #endif // FANCY_TREADMARKS // draw smoke smokeGState.setState(); for (ptr = SmokeList.getStart(); ptr != NULL; ptr = ptr->getNext()) { drawSmoke(*ptr); } // re-enable the zbuffer writing glDepthMask(GL_TRUE); return; } static void drawPuddle(const TrackEntry& te) { const float ratio = (te.lifeTime / TrackFadeTime); const float scale = 2.0f * ratio; const float offset = te.scale * TreadMiddle; glColor4f(1.0f, 1.0f, 1.0f, 1.0f - ratio); glPushMatrix(); { glTranslatef(te.pos[0], te.pos[1], te.pos[2]); glRotatef(te.angle, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, +offset, 0.0f); glScalef(scale, scale, 1.0f); glBegin(GL_QUADS); { glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(+1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(+1.0f, +1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, +1.0f, 0.0f); } glEnd(); } glPopMatrix(); // Narrow tanks only need 1 puddle if (offset > 0.01f) { glPushMatrix(); { glTranslatef(te.pos[0], te.pos[1], te.pos[2]); glRotatef(te.angle, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, -offset, 0.0f); glScalef(scale, scale, 1.0f); glBegin(GL_QUADS); { glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(+1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(+1.0f, +1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, +1.0f, 0.0f); } glEnd(); } glPopMatrix(); } return; } static void drawTreads(const TrackEntry& te) { const float ratio = (te.lifeTime / TrackFadeTime); glColor4f(0.0f, 0.0f, 0.0f, 1.0f - ratio); glPushMatrix(); { glTranslatef(te.pos[0], te.pos[1], te.pos[2]); glRotatef(te.angle, 0.0f, 0.0f, 1.0f); glScalef(1.0f, te.scale, 1.0f); const float halfWidth = 0.5f * TreadMarkWidth; if ((te.sides & LeftTread) != 0) { glRectf(-halfWidth, +TreadInside, +halfWidth, +TreadOutside); } if ((te.sides & RightTread) != 0) { glRectf(-halfWidth, -TreadOutside, +halfWidth, -TreadInside); } } glPopMatrix(); return; } static void drawSmoke(const TrackEntry& te) { const float ratio = (te.lifeTime / TrackFadeTime); glColor4f(0.0f, 0.0f, 0.0f, 1.0f - ratio); glPushMatrix(); { glTranslatef(te.pos[0], te.pos[1], te.pos[2]); glRotatef(te.angle, 0.0f, 0.0f, 1.0f); glScalef(1.0f, te.scale, 1.0f); const float halfWidth = 0.5f * TreadMarkWidth; if ((te.sides & LeftTread) != 0) { glRectf(-halfWidth, +TreadInside, +halfWidth, +TreadOutside); } if ((te.sides & RightTread) != 0) { glRectf(-halfWidth, -TreadOutside, +halfWidth, -TreadInside); } } glPopMatrix(); return; } void TrackMarks::addSceneNodes(SceneDatabase* scene) { // Depth Buffer does not need to use SceneNodes if (BZDBCache::zbuffer) { return; } // tread track marks on obstacles TrackEntry* ptr; for (ptr = TreadsObstacleList.getStart(); ptr != NULL; ptr = ptr->getNext()) { const TrackEntry& te = *ptr; if (te.sceneNode != NULL) { te.sceneNode->update(); scene->addDynamicNode(te.sceneNode); } } // smoke track marks in the air for (ptr = SmokeList.getStart(); ptr != NULL; ptr = ptr->getNext()) { const TrackEntry& te = *ptr; if (te.sceneNode != NULL) { te.sceneNode->update(); scene->addDynamicNode(te.sceneNode); } } return; } /****************************************************************************/ // // TrackEntry // TrackEntry::~TrackEntry() { delete sceneNode; return; } // // TrackList // void TrackList::clear() { TrackEntry* te = start; while (te != NULL) { TrackEntry* next = te->next; delete te; te = next; } start = end = NULL; return; } // // TrackRenderNode // TrackRenderNode::TrackRenderNode(const TrackEntry* _te, TrackType _type) { te = _te; type = _type; return; } TrackRenderNode::~TrackRenderNode() { return; } void TrackRenderNode::render() { if (type == TreadsTrack) { drawTreads(*te); } else if (type == PuddleTrack) { drawPuddle(*te); } else if (type == SmokeTrack) { drawSmoke(*te); } return; } // // TrackSceneNode // TrackSceneNode::TrackSceneNode(const TrackEntry* _te, TrackType _type, const OpenGLGState* _gstate) : renderNode(_te, _type) { te = _te; type = _type; gstate = _gstate; return; } TrackSceneNode::~TrackSceneNode() { return; } void TrackSceneNode::addRenderNodes(SceneRenderer& renderer) { renderer.addRenderNode(&renderNode, gstate); return; } void TrackSceneNode::update() { // update the position setCenter(te->pos); // update the radius squared (for culling) float radius = 0; if (type == TreadsTrack) { radius = (te->scale * TreadOutside); } else if (type == PuddleTrack) { radius = (te->scale * (TreadMiddle + 1.0f)); } else if (type == SmokeTrack) { radius = (te->scale * TreadOutside); } setRadius(radius * radius); return; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/TrackMarks.h000066400000000000000000000027231200563112200177120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_TRACKS_H #define BZF_TRACKS_H // BZFlag common header #include "common.h" class SceneDatabase; namespace TrackMarks { void init(); void kill(); void clear(); void update(float dt); void addSceneNodes(SceneDatabase* scene); void notifyStyleChange(); void renderGroundTracks(); // zbuffer is not used void renderObstacleTracks(); // zbuffer is used bool addMark(const float pos[3], float scale, float angle, int phydrv); void setUserFade(float); float getUserFade(); enum AirCullStyle { NoAirCull = 0, InitAirCull = (1 << 0), // cull for initial air mark conditions PhyDrvAirCull = (1 << 1), // cull for physics driver effects FullAirCull = (InitAirCull | PhyDrvAirCull) }; void setAirCulling(AirCullStyle style); AirCullStyle getAirCulling(); const float updateTime = (1.0f / 20.0f); } #endif // BZF_TRACKS_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Weapon.cxx000066400000000000000000000022471200563112200174550ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // implementation header #include "Weapon.h" Weapon::Weapon() { type = Flags::Null; pos[0] = pos[1] = pos[2] = 0.0f; dir = 0.0f; initDelay = 0.0f; delay.clear(); } void* Weapon::unpack(void* buf) { uint16_t delayCount; buf = FlagType::unpack(buf, type); buf = nboUnpackVector(buf, pos); buf = nboUnpackFloat(buf, dir); buf = nboUnpackFloat(buf, initDelay); buf = nboUnpackUShort(buf, delayCount); int i; for (i = 0; i < delayCount; i++) { float delayValue; buf = nboUnpackFloat(buf, delayValue); delay.push_back(delayValue); } return buf; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/Weapon.h000066400000000000000000000016501200563112200170770ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __WEAPON_H__ #define __WEAPON_H__ // BZFlag common header #include "common.h" #include #include "Flag.h" class Weapon { public: Weapon(); void* unpack(void*); public: FlagType *type; float pos[3]; float dir; float initDelay; std::vector delay; }; #endif /* __WEAPON_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WeatherRenderer.cxx000066400000000000000000000562161200563112200213170ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "WeatherRenderer.h" // common impl headers #include "TextureManager.h" #include "StateDatabase.h" #include "BZDBCache.h" #include "TimeKeeper.h" #include "TextUtils.h" #include "ParseColor.h" #include "Intersect.h" #include "Extents.h" // local impl headers #include "RoofTops.h" // for debug #define _CULLING_RAIN false static void bzdbCallBack(const std::string& UNUSED(name), void *userData) { static_cast(userData)->set(); } WeatherRenderer::WeatherRenderer() { rainColor[0][0] = 0.75f; rainColor[0][1] = 0.75f; rainColor[0][2] = 0.75f; rainColor[0][3] = 0.75f; rainColor[1][0] = 0.0f; rainColor[1][1] = 0.0f; rainColor[1][2] = 0.0f; rainColor[1][3] = 0.0f; rainSize[0] = rainSize[1] = 1.0f; rainDensity = 1000; rainSpeed = -100.0f; rainSpeedMod = 10.0f; rainSpread = 500.0f; doPuddles = true; doLineRain = true; doBillBoards = false; spinRain = false; cullRoofTops = true; roofPuddles = false; rainStartZ = -1.0f; rainEndZ = 0.0f; lastRainTime = 0.0f; maxPuddleTime = 5.0f; puddleSpeed = 1.0f; puddleColor[0] = puddleColor[1] = puddleColor[2] = puddleColor[3] = 1.0f; dropList = puddleList = INVALID_GL_LIST_ID; gridSize = 200.0f; keyFactor = 1.0f / gridSize; rainCount = 0; cellCount = 0; // install callbacks BZDB.addCallback("_rainType", bzdbCallBack, this); BZDB.addCallback("_rainDensity", bzdbCallBack, this); BZDB.addCallback("_rainSpread", bzdbCallBack, this); BZDB.addCallback("_rainSpeedMod", bzdbCallBack, this); BZDB.addCallback("_rainStartZ", bzdbCallBack, this); BZDB.addCallback("_rainEndZ", bzdbCallBack, this); BZDB.addCallback("_rainBaseColor", bzdbCallBack, this); BZDB.addCallback("_useRainPuddles", bzdbCallBack, this); BZDB.addCallback("_useLineRain", bzdbCallBack, this); BZDB.addCallback("_useRainBillboards", bzdbCallBack, this); BZDB.addCallback("_rainPuddleSpeed", bzdbCallBack, this); BZDB.addCallback("_rainMaxPuddleTime", bzdbCallBack, this); BZDB.addCallback("_rainPuddleColor", bzdbCallBack, this); BZDB.addCallback("_rainPuddleTexture", bzdbCallBack, this); BZDB.addCallback("_rainTexture", bzdbCallBack, this); BZDB.addCallback("_rainSpins", bzdbCallBack, this); BZDB.addCallback("_rainRoofs", bzdbCallBack, this); BZDB.addCallback("userRainScale", bzdbCallBack, this); } WeatherRenderer::~WeatherRenderer() { freeContext(); // free the display lists BZDB.removeCallback("_rainType", bzdbCallBack, this); BZDB.removeCallback("_rainDensity", bzdbCallBack, this); BZDB.removeCallback("_rainSpread", bzdbCallBack, this); BZDB.removeCallback("_rainSpeedMod", bzdbCallBack, this); BZDB.removeCallback("_rainStartZ", bzdbCallBack, this); BZDB.removeCallback("_rainEndZ", bzdbCallBack, this); BZDB.removeCallback("_rainBaseColor", bzdbCallBack, this); BZDB.removeCallback("_useRainPuddles", bzdbCallBack, this); BZDB.removeCallback("_useLineRain", bzdbCallBack, this); BZDB.removeCallback("_useRainBillboards", bzdbCallBack, this); BZDB.removeCallback("_rainPuddleSpeed", bzdbCallBack, this); BZDB.removeCallback("_rainMaxPuddleTime", bzdbCallBack, this); BZDB.removeCallback("_rainPuddleColor", bzdbCallBack, this); BZDB.removeCallback("_rainPuddleTexture", bzdbCallBack, this); BZDB.removeCallback("_rainTexture", bzdbCallBack, this); BZDB.removeCallback("_rainSpins", bzdbCallBack, this); BZDB.removeCallback("_rainRoofs", bzdbCallBack, this); BZDB.removeCallback("userRainScale", bzdbCallBack, this); } void WeatherRenderer::init(void) { OpenGLGStateBuilder gstate; TextureManager& tm = TextureManager::instance(); gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA, (GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); rainGState = gstate.getState(); // just set up some default textures gstate.setTexture(tm.getTextureID("snowflake")); texturedRainState = gstate.getState(); gstate.setTexture(tm.getTextureID("puddle")); puddleState = gstate.getState(); buildPuddleList(); } void WeatherRenderer::set(void) { // check the bzdb and see if we need to change any rain stuff rainDensity = 0; if (dbItemSet("_rainType") || dbItemSet("_rainDensity")) { // default rain desnity rainDensity = (int)(1000.0f * BZDB.eval("userRainScale")); // some defaults doLineRain = false; rainSize[0] = 1.0f; rainSize[1] = 1.0f; rainSpeed = -100.0f; rainSpeedMod = 50.0f; doPuddles = true; rainColor[0][0] = 0.75f; rainColor[0][1] = 0.75f; rainColor[0][2] = 0.85f; rainColor[0][3] = 0.75f; rainColor[1][0] = 0.0f; rainColor[1][1] = 0.0f; rainColor[1][2] = 0.0f; rainColor[1][3] = 0.0f; rainSize[0] = rainSize[1] = 1.0f; maxPuddleTime = 1.5f; puddleSpeed = 1.0f; puddleColor[0] = puddleColor[1] = puddleColor[2] = puddleColor[3] = 1.0f; spinRain = true; cullRoofTops = true; roofPuddles = false; rainSpread = 500.0f; TextureManager& tm = TextureManager::instance(); OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA, (GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); OpenGLGStateBuilder puddleGStateBuilder(puddleState); puddleGStateBuilder.setTexture(tm.getTextureID("puddle")); if (dbItemSet("_rainType")) { std::string rainType = TextUtils::tolower(BZDB.get("_rainType")); if (rainType == "snow") { doBillBoards = false; gstate.setTexture (tm.getTextureID("snowflake")); rainSpeed = -20.0f; rainSpeedMod = 5.0f; doPuddles = false; } else if (rainType == "fatrain") { doBillBoards = false; rainSize[0] = 0.5f; rainSize[1] = 0.75f; gstate.setTexture(tm.getTextureID("raindrop")); rainSpeed = -50.0f; rainSpeedMod = 25.0f; spinRain = false; } else if (rainType == "frog") { gstate.setTexture(tm.getTextureID ("frog")); rainSpeed = -100.0f; rainSpeedMod = 5.0f; doPuddles = true; doBillBoards = true; // ewww puddleSpeed = 3.0f; puddleColor[0] = 0.75f; puddleColor[1] = puddleColor[2] = 0.0f; rainSize[0] = 2.0f; rainSize[1] = 2.0f; } else if (rainType == "particle") { rainDensity = (int)(500.0f * BZDB.eval("userRainScale")); gstate.setTexture(tm.getTextureID ("red_super_bolt")); rainSpeed = -20.0f; rainSpeedMod = 5.0f; doPuddles = true; doBillBoards = true; puddleSpeed = 10.0f; // ewww puddleColor[0] = 1.0f; puddleColor[1] = puddleColor[2] = 0.0f; rainSize[0] = 1.0f; rainSize[1] = 1.0f; } else if (rainType == "bubble") { gstate.setTexture(tm.getTextureID("bubble")); rainSpeed = 20.0f; rainSpeedMod = 1.0f; doBillBoards = true; doPuddles = false; } else if (rainType == "rain") { puddleColor[0] = 1.0f; puddleColor[1] = puddleColor[2] = 1.0f; doLineRain = true; rainSize[0] = 0.0f; rainSize[1] = 0.75f; puddleGStateBuilder.setTexture(tm.getTextureID("puddle")); } } if (dbItemSet("_rainPuddleTexture")) { puddleGStateBuilder.setTexture( tm.getTextureID(BZDB.get("_rainPuddleTexture").c_str())); } // see if the texture is specificly overiden if (dbItemSet("_rainTexture")) { gstate.setTexture ( tm.getTextureID(BZDB.get("_rainTexture").c_str())); } texturedRainState = gstate.getState(); // if there is a specific overides for stuff if (dbItemSet("_rainSpread")) rainSpread = BZDB.eval("_rainSpread"); if (dbItemSet("_rainDensity")) rainDensity = (int)(BZDB.eval("_rainDensity") * BZDB.eval("userRainScale")); if (dbItemSet("_rainSpeed")) rainSpeed = BZDB.eval("_rainSpeed"); if (dbItemSet("_rainSpeedMod")) rainSpeedMod = BZDB.eval("_rainSpeedMod"); if (dbItemSet("_rainSize")) BZDB.evalPair("_rainSize", rainSize); if (dbItemSet("_rainStartZ")) rainStartZ = BZDB.eval("_rainStartZ"); if (dbItemSet("_rainEndZ")) rainEndZ = BZDB.eval("_rainEndZ"); if (dbItemSet("_rainBaseColor")) parseColorString(BZDB.get("_rainBaseColor"), rainColor[0]); if (dbItemSet("_rainTopColor")) parseColorString(BZDB.get("_rainTopColor"), rainColor[1]); if (dbItemSet("_useRainPuddles")) doPuddles = BZDB.isTrue("_useRainPuddles"); if (dbItemSet("_useLineRain")) doLineRain = BZDB.isTrue("_useLineRain"); if (dbItemSet("_useRainBillboards")) doBillBoards = BZDB.isTrue("_useRainBillboards"); if (dbItemSet("_rainPuddleColor")) parseColorString(BZDB.get("_rainPuddleColor"), puddleColor); if (dbItemSet("_rainPuddleSpeed")) puddleSpeed = BZDB.eval("rainPuddleSpeed"); if (dbItemSet("_rainMaxPuddleTime")) maxPuddleTime = BZDB.eval("_rainMaxPuddleTime"); if (dbItemSet("_rainSpins")) spinRain = BZDB.isTrue("_rainSpins"); if (dbItemSet("_rainRoofs")) { cullRoofTops = (BZDB.evalInt("_rainRoofs") >= 1); roofPuddles = (BZDB.evalInt("_rainRoofs") >= 2); } // update the actual puddle material puddleState = puddleGStateBuilder.getState(); // make sure we know where to start and stop the rain // we want to compute the heights for us if (rainStartZ == -1 && rainEndZ == 0) { // check the dir if (rainSpeed < 0) { // rain going down rainStartZ = 120.0f * BZDBCache::tankHeight; // same as the clouds rainEndZ = 0; } else { // rain going up (tiny bubbles) if (rainSpeed == 0) rainSpeed = 0.1f; rainEndZ = 120.0f * BZDBCache::tankHeight; // same as the clouds rainStartZ = 0; } } else { // the specified rain start and end values, // make sure they make sense with the directon if (rainSpeed < 0) { // rain going down if (rainEndZ > rainStartZ) { float temp = rainStartZ; rainStartZ = rainEndZ; rainEndZ = temp; } } else { // rain going up if (rainEndZ < rainStartZ) { float temp = rainStartZ; rainStartZ = rainEndZ; rainEndZ = temp; } } } float rainHeightDelta = rainEndZ - rainStartZ; int totalRain = rainCount; if (!_CULLING_RAIN) totalRain = raindrops.size(); if (totalRain < rainDensity) { for (int drops = totalRain; drops < rainDensity; drops++) { rain drop; drop.speed = rainSpeed + (((float) bzfrand() * 2.0f - 1.0f) * rainSpeedMod); drop.pos[0] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); drop.pos[1] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); drop.pos[2] = rainStartZ + (((float) bzfrand()) * rainHeightDelta); if (cullRoofTops) { drop.roofTop = RoofTops::getTopHeight(drop.pos[0], drop.pos[1], drop.pos[2]); } else { drop.roofTop = 0.0f; } if (_CULLING_RAIN) { addDrop (drop); } else { raindrops.push_back (drop); } } lastRainTime = float(TimeKeeper::getCurrent().getSeconds()); } // recompute the drops based on the posible new size buildDropList(); if (_CULLING_RAIN) { // need to update the bbox depths on all the chunks std::map::iterator itr = chunkMap.begin(); while (itr != chunkMap.end()) { itr->second.bbox.mins[2] = rainStartZ > rainEndZ ? rainEndZ : rainStartZ; itr->second.bbox.maxs[2] = rainStartZ > rainEndZ ? rainStartZ : rainEndZ; itr++; } } } else { raindrops.clear(); chunkMap.clear(); rainCount = 0; } } void WeatherRenderer::update(void) { // update the time float frameTime = float(TimeKeeper::getCurrent().getSeconds() - lastRainTime); lastRainTime = float(TimeKeeper::getCurrent().getSeconds()); std::vector dropsToAdd; // clamp the update time // its not an important sim so just keep it smooth if (frameTime > 0.06f) frameTime = 0.06f; if (!_CULLING_RAIN) { // update all the drops in the world std::vector::iterator itr = raindrops.begin(); while (itr != raindrops.end()) { if (updateDrop(itr, frameTime, dropsToAdd)) itr++; } } else { std::map::iterator itr = chunkMap.begin(); while (itr != chunkMap.end()) { if (!itr->second.drops.size()) { // kill any empty chunks // cellCount--; // itr == chunkMap.erase(itr); } else { std::vector::iterator dropItr = itr->second.drops.begin(); while (dropItr != itr->second.drops.end()) { if (updateDrop(dropItr, frameTime, dropsToAdd)) { dropItr++; } else { dropItr = itr->second.drops.erase(dropItr); rainCount--; } } itr++; } } // add in any new drops std::vector::iterator dropItr = dropsToAdd.begin(); while (dropItr != dropsToAdd.end()) { addDrop(*dropItr); dropItr++; } } // update all the puddles std::vector::iterator puddleItr = puddles.begin(); while (puddleItr != puddles.end()) { if (updatePuddle(puddleItr, frameTime)) puddleItr++; } } void WeatherRenderer::draw(const SceneRenderer& sr) { if (!_CULLING_RAIN) { if (raindrops.empty()) return; } else { if (!rainCount) return; } glDisable(GL_CULL_FACE); glMatrixMode(GL_MODELVIEW); glColor4f(1, 1, 1, 1.0f); glDepthMask(GL_FALSE); if (doLineRain) { // we are doing line rain rainGState.setState(); glPushMatrix(); glBegin(GL_LINES); } else { texturedRainState.setState(); } if (!_CULLING_RAIN) { // draw ALL the rain std::vector::iterator itr = raindrops.begin(); while (itr != raindrops.end()) { drawDrop(*itr, sr); itr++; } } else { // do the smart thing and just draw the rain that is VISIBLE std::map::iterator itr = chunkMap.begin(); const Frustum *frustum = &sr.getViewFrustum(); while (itr != chunkMap.end()) { if (itr->second.drops.size()) { // skip any empty chunks // see if the chunk is visible Extents exts; // FIXME - possible nasty slowdown // Not using an Extents bbox directly because it is nice to // block the Extents copy constructor to avoid passing by value. exts.set(itr->second.bbox.mins, itr->second.bbox.maxs); if (testAxisBoxInFrustum(exts, frustum) != Outside) { std::vector::iterator dropItr = itr->second.drops.begin(); while (dropItr != itr->second.drops.end()) { drawDrop(*dropItr, sr); dropItr++; } } } itr++; } } if (doLineRain) { glEnd(); glPopMatrix(); } if (doPuddles) { std::vector::iterator puddleItr = puddles.begin(); puddleState.setState(); while (puddleItr != puddles.end()) { drawPuddle(*puddleItr); puddleItr++; } } glEnable(GL_CULL_FACE); glColor4f(1, 1, 1, 1); glDepthMask(GL_TRUE); } void WeatherRenderer::freeContext(void) { if (dropList != INVALID_GL_LIST_ID) { glDeleteLists(dropList, 1); dropList = INVALID_GL_LIST_ID; } if (puddleList != INVALID_GL_LIST_ID) { glDeleteLists(puddleList, 1); puddleList = INVALID_GL_LIST_ID; } return; } void WeatherRenderer::rebuildContext(void) { buildDropList(); buildPuddleList(); return; } void WeatherRenderer::buildDropList(bool _draw) { if (!_draw) { if (dropList != INVALID_GL_LIST_ID) { glDeleteLists(dropList, 1); dropList = INVALID_GL_LIST_ID; } dropList = glGenLists(1); glNewList(dropList, GL_COMPILE); } if (doBillBoards) { glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-rainSize[0], -rainSize[1], 0); glTexCoord2f(1, 0); glVertex3f(rainSize[0], -rainSize[1], 0); glTexCoord2f(1, 1); glVertex3f(rainSize[0], rainSize[1], 0); glTexCoord2f(0, 1); glVertex3f(-rainSize[0], rainSize[1], 0); glEnd(); } else { glPushMatrix(); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-rainSize[0], 0, -rainSize[1]); glTexCoord2f(1, 0); glVertex3f(rainSize[0], 0, -rainSize[1]); glTexCoord2f(1, 1); glVertex3f(rainSize[0], 0, rainSize[1]); glTexCoord2f(0, 1); glVertex3f(-rainSize[0], 0, rainSize[1]); glEnd(); glRotatef(120, 0, 0, 1); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-rainSize[0], 0, -rainSize[1]); glTexCoord2f (1, 0); glVertex3f(rainSize[0], 0, -rainSize[1]); glTexCoord2f (1, 1); glVertex3f(rainSize[0], 0, rainSize[1]); glTexCoord2f (0, 1); glVertex3f(-rainSize[0], 0, rainSize[1]); glEnd(); glRotatef(120, 0, 0, 1); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-rainSize[0], 0, -rainSize[1]); glTexCoord2f(1, 0); glVertex3f(rainSize[0], 0, -rainSize[1]); glTexCoord2f(1, 1); glVertex3f(rainSize[0], 0, rainSize[1]); glTexCoord2f(0, 1); glVertex3f(-rainSize[0], 0, rainSize[1]); glEnd(); glPopMatrix(); } if (!_draw) { glEndList(); } } void WeatherRenderer::buildPuddleList(bool _draw) { float scale = 1; if (!_draw) { if (puddleList != INVALID_GL_LIST_ID) { glDeleteLists(puddleList, 1); puddleList = INVALID_GL_LIST_ID; } puddleList = glGenLists(1); glNewList(puddleList, GL_COMPILE); } glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-scale, -scale, 0); glTexCoord2f(1, 0); glVertex3f(scale, -scale, 0); glTexCoord2f(1, 1); glVertex3f(scale, scale, 0); glTexCoord2f(0, 1); glVertex3f(-scale, scale, 0); glEnd(); if (!_draw) { glEndList(); } } bool WeatherRenderer::updateDrop(std::vector::iterator& drop, float frameTime, std::vector &toAdd) { drop->pos[2] += drop->speed * frameTime; bool killDrop = false; if (drop->speed < 0) { if (cullRoofTops) { killDrop = (drop->pos[2] < drop->roofTop); } else { killDrop = (drop->pos[2] < rainEndZ); } } else { killDrop = (drop->pos[2] > rainEndZ); } if (killDrop) { if (doPuddles && (roofPuddles || !(cullRoofTops && (drop->speed < 0.0f) && (drop->roofTop != 0.0f)))) { puddle thePuddle; thePuddle.pos[0] = drop->pos[0]; thePuddle.pos[1] = drop->pos[1]; if (!cullRoofTops) { thePuddle.pos[2] = rainEndZ; } else { thePuddle.pos[2] = drop->roofTop + 0.05f; } thePuddle.time = 0.001f; puddles.push_back (thePuddle); } if (!_CULLING_RAIN) { if ((int)(raindrops.size()) <= rainDensity) { // reset this drop drop->pos[2] = rainStartZ; drop->speed = rainSpeed + ((float) (bzfrand() * 2.0f - 1.0f) * rainSpeedMod); drop->pos[0] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); drop->pos[1] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); if (cullRoofTops) { drop->roofTop = RoofTops::getTopHeight (drop->pos[0], drop->pos[1], drop->pos[2]); // clamp the rain to the valid rain range. if ( rainSpeed > 0) { if ( drop->roofTop < rainEndZ ) drop->roofTop = rainEndZ; else if ( drop->roofTop > rainEndZ ) drop->roofTop = rainEndZ; } } else { drop->roofTop = rainEndZ; } return true; } else { // we need less rain, so don't do this one drop = raindrops.erase(drop); return false; } } else { if (rainCount <= rainDensity) { rain newDrop; newDrop.pos[2] = rainStartZ; newDrop.speed = rainSpeed + ((float) (bzfrand() * 2.0f - 1.0f) * rainSpeedMod); newDrop.pos[0] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); newDrop.pos[1] = (((float) bzfrand() * 2.0f - 1.0f) * rainSpread); if (cullRoofTops) { newDrop.roofTop = RoofTops::getTopHeight (newDrop.pos[0], newDrop.pos[1], newDrop.pos[2]); // clamp the rain to the valid rain range. if ( rainSpeed > 0) { if ( newDrop.roofTop < rainEndZ ) newDrop.roofTop = rainEndZ; else if ( newDrop.roofTop > rainEndZ ) newDrop.roofTop = rainEndZ; } } else { newDrop.roofTop = rainEndZ; } toAdd.push_back(newDrop); } // kill the drop return false; } } return true; } bool WeatherRenderer::updatePuddle(std::vector::iterator& splash, float frameTime) { if (splash->time > maxPuddleTime) { splash = puddles.erase(splash); return false; } splash->time += frameTime; return true; } void WeatherRenderer::drawDrop(rain& drop, const SceneRenderer& sr) { if (doLineRain) { float alphaMod = 0; if (drop.pos[2] < 5.0f) alphaMod = 1.0f - (5.0f / drop.pos[2]); float alphaVal = rainColor[0][3] - alphaMod; if (alphaVal < 0) alphaVal = 0; glColor4f(rainColor[0][0], rainColor[0][1], rainColor[0][2], alphaVal); glVertex3fv(drop.pos); alphaVal = rainColor[1][3] - alphaMod; if (alphaVal < 0) alphaVal = 0; glColor4f(rainColor[1][0], rainColor[1][1], rainColor[1][2], alphaVal); glVertex3f(drop.pos[0], drop.pos[1], drop.pos[2] + (rainSize[1] - (drop.speed * 0.15f))); } else { float alphaMod = 0; if (drop.pos[2] < 2.0f) alphaMod = (2.0f - drop.pos[2]) * 0.5f; glColor4f(1, 1, 1, 1.0f - alphaMod); glPushMatrix(); glTranslatef(drop.pos[0], drop.pos[1], drop.pos[2]); if (doBillBoards) sr.getViewFrustum().executeBillboard(); else if (spinRain) glRotatef(lastRainTime * 10.0f * rainSpeed * 0.85f, 0, 1, 0); if (spinRain) glRotatef(lastRainTime * 10.0f * rainSpeed, 0, 0, 1); if (1) { glCallList(dropList); } else { buildDropList(true); } glPopMatrix(); } } void WeatherRenderer::drawPuddle(puddle& splash) { glPushMatrix(); glTranslatef(splash.pos[0], splash.pos[1], splash.pos[2]); float scale = fabsf(splash.time * rainSpeed * 0.035f * puddleSpeed); float lifeTime = splash.time / maxPuddleTime; glColor4f(puddleColor[0], puddleColor[1], puddleColor[2], 1.0f - lifeTime); glScalef(scale, scale, scale); if (1) { glCallList(puddleList); } else { buildPuddleList(true); } glPopMatrix(); } void WeatherRenderer::addDrop(rain& drop) { int key = keyFromPos(drop.pos[0], drop.pos[1]); std::map::iterator itr = chunkMap.find(key); rainCount++; if (itr != chunkMap.end()) { itr->second.drops.push_back(drop); return; } visibleChunk chunk; setChunkFromDrop(chunk, drop); chunk.drops.push_back(drop); chunkMap[key] = chunk; cellCount++; } int WeatherRenderer::keyFromPos(float x, float y) const { union { short pos[2]; int key; } temp; temp.pos[0] = (short)(x * keyFactor); temp.pos[1] = (short)(y * keyFactor); return temp.key; } void WeatherRenderer::setChunkFromDrop(visibleChunk& chunk, rain& drop) { int keyX = (int)(drop.pos[0] * keyFactor); int keyY = (int)(drop.pos[1] * keyFactor); chunk.bbox.mins[0] = keyX * gridSize; chunk.bbox.mins[1] = keyY * gridSize; chunk.bbox.mins[2] = rainStartZ > rainEndZ ? rainEndZ : rainStartZ; chunk.bbox.maxs[0] = keyX * gridSize + gridSize; chunk.bbox.maxs[1] = keyY * gridSize + gridSize; chunk.bbox.maxs[2] = rainStartZ > rainEndZ ? rainStartZ : rainEndZ; } bool WeatherRenderer::dbItemSet(const char *name) { if (!BZDB.isSet(name)) return false; if (TextUtils::tolower(BZDB.get(name)) == "none") return false; return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WeatherRenderer.h000066400000000000000000000063231200563112200207360ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * WeatherRenderer: * Encapsulates rendering of weather stuff (rain and clouds) * */ #ifndef BZF_WEATHER_RENDERER_H #define BZF_WEATHER_RENDERER_H #include "common.h" /* system headers */ #include #include #include /* common interface headers */ #include "bzfgl.h" #include "OpenGLGState.h" #include "SceneRenderer.h" class WeatherRenderer { public: WeatherRenderer(); ~WeatherRenderer(); // called once to setup the rain state, load lists and materials and stuff void init(void); // called each time the rain state needs to change, i.e. when the bzdb stuff changes void set(void); // called to update the rain simulation state. void update(void); // called to draw the rain for the current frame void draw(const SceneRenderer& sr); // called when the GL lists need to be deleted void freeContext(void); // called when the GL lists need to be remade void rebuildContext(void); protected: OpenGLGState rainGState; OpenGLGState texturedRainState; OpenGLGState puddleState; std::string rainSkin; std::vector rainTextures; float rainColor[2][4]; float rainSize[2]; int rainDensity; float rainSpeed; float rainSpeedMod; float rainSpread; bool doPuddles; bool doLineRain; bool doBillBoards; bool spinRain; bool cullRoofTops; bool roofPuddles; float rainStartZ; float rainEndZ; float maxPuddleTime; float puddleSpeed; float puddleColor[4]; GLuint dropList; GLuint puddleList; public: typedef struct { float pos[3]; float speed; float roofTop; int texture; } rain; protected: std::vector raindrops; typedef struct { float pos[3]; float time; int texture; } puddle; std::vector puddles; float lastRainTime; void buildDropList(bool draw = false); void buildPuddleList(bool draw = false); bool updateDrop(std::vector::iterator &drop, float frameTime, std::vector &toAdd); bool updatePuddle(std::vector::iterator &splash, float frameTime); void drawDrop(rain &drop, const SceneRenderer& sr); void drawPuddle(puddle &splash); // some kinda culling void addDrop(rain &drop); int keyFromPos(float x, float y) const; float gridSize; float keyFactor; public: typedef struct { float mins[3]; float maxs[3]; } copyExtents; protected: typedef struct { std::vector drops; copyExtents bbox; } visibleChunk; std::map chunkMap; void setChunkFromDrop(visibleChunk &chunk, rain &drop); bool dbItemSet(const char* name); int rainCount; int cellCount; }; #endif // BZF_WEATHER_RENDERER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/World.cxx000066400000000000000000001070051200563112200173110ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "World.h" /* system implementation headers */ #include #include #include /* common implementation headers */ #include "BZDBCache.h" #include "TextureManager.h" #include "FileManager.h" #include "CollisionManager.h" #include "DynamicColor.h" #include "TextureMatrix.h" #include "PhysicsDriver.h" #include "FlagSceneNode.h" #include "ObstacleMgr.h" #include "MeshDrawInfo.h" #include "MeshDrawMgr.h" #include "DirectoryNames.h" #include "GameTime.h" #include "WallObstacle.h" #include "MeshObstacle.h" // // World // World* World::playingField = NULL; BundleMgr* World::bundleMgr; std::string World::locale(""); int World::flagTexture(-1); World::World() : gameType(TeamFFA), gameOptions(0), linearAcceleration(0.0f), angularAcceleration(0.0f), maxPlayers(0), curMaxPlayers(0), maxShots(1), maxFlags(0), shakeTimeout(), shakeWins(), players(NULL), flags(NULL), flagNodes(NULL), flagWarpNodes(NULL), wind(), oldFogEffect(), oldUseDrawInfo() { worldWeapons = new WorldPlayer(); waterLevel = -1.0f; waterMaterial = NULL; linkMaterial = NULL; drawInfoCount = 0; drawInfoArray = NULL; } World::~World() { int i; freeFlags(); freeInsideNodes(); freeMeshDrawMgrs(); for (i = 0; i < curMaxPlayers; i++) delete players[i]; delete[] players; delete worldWeapons; for (i = 0; i < NumTeams; i++) { bases[i].clear(); } // clear the managers links.clear(); DYNCOLORMGR.clear(); TEXMATRIXMGR.clear(); MATERIALMGR.clear(); PHYDRVMGR.clear(); TRANSFORMMGR.clear(); OBSTACLEMGR.clear(); COLLISIONMGR.clear(); return; } void World::init() { TextureManager &tm = TextureManager::instance(); flagTexture = tm.getTextureID( "flag" ); } void World::done() { flagTexture = 0; } void World::loadCollisionManager() { COLLISIONMGR.load(); return; } void World::checkCollisionManager() { if (COLLISIONMGR.needReload()) { // reload the collision grid COLLISIONMGR.load(); } return; } void World::setFlagTexture(FlagSceneNode* flag) { flag->setTexture(flagTexture); } void World::setWorld(World* _playingField) { playingField = _playingField; } int World::getTeleportTarget(int source) const { return links.getTeleportTarget(source); } int World::getTeleportTarget(int source, unsigned int seed) const { return links.getTeleportTarget(source, seed); } int World::getTeleporter(const Teleporter* teleporter, int face) const { // search for teleporter const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); const int count = teleporters.size(); for (int i = 0; i < count; i++) { if (teleporter == (const Teleporter*)teleporters[i]) { return ((2 * i) + face); } } printf ("World::getTeleporter() error\n"); fflush(stdout); exit(1); } const Teleporter* World::getTeleporter(int source, int& face) const { const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); assert(source >= 0 && source < (int)(2 * teleporters.size())); face = (source & 1); return ((const Teleporter*) teleporters[source / 2]); } TeamColor World::whoseBase(const float* pos) const { if (gameType != ClassicCTF) return NoTeam; for (int i = 1; i < NumTeams; i++) { for (TeamBases::const_iterator it = bases[i].begin(); it != bases[i].end(); ++it) { float nx = pos[0] - it->p[0]; float ny = pos[1] - it->p[1]; float rx = (float) (cosf(atanf(ny / nx) - it->p[3]) * sqrt((ny * ny) + (nx * nx))); float ry = (float) (sinf(atanf(ny / nx) - it->p[3]) * sqrt((ny * ny) + (nx * nx))); if(fabsf(rx) < it->p[4] && fabsf(ry) < it->p[5]) { float nz = it->p[2] + it->p[6]; float rz = pos[2] - nz; if(fabsf(rz) < 0.1) { // epsilon kludge return TeamColor(i); } } } } return NoTeam; } const Obstacle* World::inBuilding(const float* pos, float radius, float height) const { // check everything but walls const ObsList* olist = COLLISIONMGR.cylinderTest (pos, radius, height); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (obs->inCylinder(pos, radius, height)) { return obs; } } return NULL; } const Obstacle* World::inBuilding(const float* pos, float angle, float dx, float dy, float dz) const { // check everything but the walls const ObsList* olist = COLLISIONMGR.boxTest (pos, angle, dx, dy, dz); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (obs->inBox(pos, angle, dx, dy, dz)) { return obs; } } return NULL; } const Obstacle* World::hitBuilding(const float* pos, float angle, float dx, float dy, float dz) const { // check walls const ObstacleList& walls = OBSTACLEMGR.getWalls(); for (unsigned int w = 0; w < walls.size(); w++) { const WallObstacle* wall = (const WallObstacle*) walls[w]; if (wall->inBox(pos, angle, dx, dy, dz)) { return wall; } } // check everything else const ObsList* olist = COLLISIONMGR.boxTest (pos, angle, dx, dy, dz); for (int i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (!obs->isDriveThrough() && obs->inBox(pos, angle, dx, dy, dz)) { return obs; } } return NULL; } static inline int compareHeights(const Obstacle*& obsA, const Obstacle* obsB) { const Extents& eA = obsA->getExtents(); const Extents& eB = obsB->getExtents(); if (eA.maxs[2] > eB.maxs[2]) { return -1; } else { return +1; } } static int compareObstacles(const void* a, const void* b) { // - normal object come first (from lowest to highest) // - then come the mesh face (highest to lowest) // - and finally, the mesh objects (checkpoints really) const Obstacle* obsA = *((const Obstacle**)a); const Obstacle* obsB = *((const Obstacle**)b); const char* typeA = obsA->getType(); const char* typeB = obsB->getType(); bool isMeshA = (typeA == MeshObstacle::getClassName()); bool isMeshB = (typeB == MeshObstacle::getClassName()); if (isMeshA) { if (!isMeshB) { return +1; } else { return compareHeights(obsA, obsB); } } if (isMeshB) { if (!isMeshA) { return -1; } else { return compareHeights(obsA, obsB); } } bool isFaceA = (typeA == MeshFace::getClassName()); bool isFaceB = (typeB == MeshFace::getClassName()); if (isFaceA) { if (!isFaceB) { return +1; } else { return compareHeights(obsA, obsB); } } if (isFaceB) { if (!isFaceA) { return -1; } else { return compareHeights(obsA, obsB); } } return compareHeights(obsB, obsA); // reversed } static int compareHitNormal (const void* a, const void* b) { const MeshFace* faceA = *((const MeshFace**) a); const MeshFace* faceB = *((const MeshFace**) b); // Up Planes come first if (faceA->isUpPlane() && !faceB->isUpPlane()) { return -1; } if (faceB->isUpPlane() && !faceA->isUpPlane()) { return +1; } // highest Up Plane comes first if (faceA->isUpPlane() && faceB->isUpPlane()) { if (faceA->getPosition()[2] > faceB->getPosition()[2]) { return -1; } else { return +1; } } // compare the dot products if (faceA->scratchPad < faceB->scratchPad) { return -1; } else { return +1; } } const Obstacle* World::hitBuilding(const float* oldPos, float oldAngle, const float* pos, float angle, float dx, float dy, float dz, bool directional) const { // check walls const ObstacleList& walls = OBSTACLEMGR.getWalls(); for (unsigned int w = 0; w < walls.size(); w++) { const WallObstacle* wall = (const WallObstacle*) walls[w]; if (wall->inMovingBox(oldPos, oldAngle, pos, angle, dx, dy, dz)) { return wall; } } // get the list of potential hits from the collision manager const ObsList* olist = COLLISIONMGR.movingBoxTest (oldPos, oldAngle, pos, angle, dx, dy, dz); // sort the list by type and height qsort (olist->list, olist->count, sizeof(Obstacle*), compareObstacles); int i; // check non-mesh obstacles for (i = 0; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; const char* type = obs->getType(); if ((type == MeshFace::getClassName()) || (type == MeshObstacle::getClassName())) { break; } if (!obs->isDriveThrough() && obs->inMovingBox(oldPos, oldAngle, pos, angle, dx, dy, dz)) { return obs; } } if (i == olist->count) { return NULL; // no more obstacles, we are done } // do some prep work for mesh faces int hitCount = 0; float vel[3]; vel[0] = pos[0] - oldPos[0]; vel[1] = pos[1] - oldPos[1]; vel[2] = pos[2] - oldPos[2]; bool goingDown = (vel[2] <= 0.0f); // check mesh faces for (/* do nothing */; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; const char* type = obs->getType(); if (type == MeshObstacle::getClassName()) { break; } if (!obs->isDriveThrough() && obs->inMovingBox(oldPos, oldAngle, pos, angle, dx, dy, dz)) { const MeshFace* face = (const MeshFace*) obs; const float facePos2 = face->getPosition()[2]; if (face->isUpPlane() && (!goingDown || (oldPos[2] < (facePos2 - 1.0e-3f)))) { continue; } else if (face->isDownPlane() && ((oldPos[2] >= facePos2) || goingDown)) { continue; } else { // add the face to the hitlist olist->list[hitCount] = (Obstacle*) obs; hitCount++; // compute its dot product and stick it in the scratchPad const float* p = face->getPlane(); const float dot = (vel[0] * p[0]) + (vel[1] * p[1]) + (vel[2] * p[2]); face->scratchPad = dot; } } } // sort the list by dot product (this sort will be replaced with a running tab qsort (olist->list, hitCount, sizeof(Obstacle*), compareHitNormal); // see if there as a valid meshface hit if (hitCount > 0) { const MeshFace* face = (const MeshFace*) olist->list[0]; if (face->isUpPlane() || (face->scratchPad < 0.0f) || !directional) { return face; } } if (i == olist->count) { return NULL; // no more obstacles, we are done } // check mesh obstacles for (/* do nothing */; i < olist->count; i++) { const Obstacle* obs = olist->list[i]; if (!obs->isDriveThrough() && obs->inMovingBox(oldPos, oldAngle, pos, angle, dx, dy, dz)) { return obs; } } return NULL; // no more obstacles, we are done } bool World::crossingTeleporter(const float* pos, float angle, float dx, float dy, float dz, float* plane) const { const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); for (unsigned int i = 0; i < teleporters.size(); i++) { const Teleporter* teleporter = (const Teleporter*) teleporters[i]; if (teleporter->isCrossing(pos, angle, dx, dy, dz, plane)) { return true; } } return false; } const Teleporter* World::crossesTeleporter(const float* oldPos, const float* newPos, int& face) const { // check teleporters const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); for (unsigned int i = 0; i < teleporters.size(); i++) { const Teleporter* teleporter = (const Teleporter*) teleporters[i]; if (teleporter->hasCrossed(oldPos, newPos, face)) { return teleporter; } } // didn't cross return NULL; } const Teleporter* World::crossesTeleporter(const Ray& r, int& face) const { // check teleporters const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); for (unsigned int i = 0; i < teleporters.size(); i++) { const Teleporter* teleporter = (const Teleporter*) teleporters[i]; if (teleporter->isTeleported(r, face) > Epsilon) { return teleporter; } } // didn't cross return NULL; } float World::getProximity(const float* p, float r) const { // get maximum over all teleporters float bestProximity = 0.0; const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); for (unsigned int i = 0; i < teleporters.size(); i++) { const Teleporter* teleporter = (const Teleporter*) teleporters[i]; const float proximity = teleporter->getProximity(p, r); if (proximity > bestProximity) { bestProximity = proximity; } } return bestProximity; } void World::freeFlags() { int i; if (flagNodes) for (i = 0; i < maxFlags; i++) delete flagNodes[i]; if (flagWarpNodes) for (i = 0; i < maxFlags; i++) delete flagWarpNodes[i]; delete[] flags; delete[] flagNodes; delete[] flagWarpNodes; flags = NULL; flagNodes = NULL; flagWarpNodes = NULL; } void World::makeMeshDrawMgrs() { // make the display list managers for source meshes std::vector sourceMeshes; OBSTACLEMGR.getSourceMeshes(sourceMeshes); unsigned int count = sourceMeshes.size(); drawInfoArray = new MeshDrawInfo*[count]; drawInfoCount = 0; for (unsigned int i = 0; i < count; i++) { MeshDrawInfo* di = (MeshDrawInfo*) sourceMeshes[i]->getDrawInfo(); if ((di != NULL) && !di->isCopy()) { MeshDrawMgr* dm = new MeshDrawMgr(di); di->setDrawMgr(dm); drawInfoArray[drawInfoCount] = di; drawInfoCount++; } } return; } void World::freeMeshDrawMgrs() { for (int i = 0; i < drawInfoCount; i++) { MeshDrawInfo* di = drawInfoArray[i]; MeshDrawMgr* dm = di->getDrawMgr(); delete dm; di->setDrawMgr(NULL); } drawInfoCount = 0; delete[] drawInfoArray; drawInfoArray = NULL; return; } void World::updateAnimations(float UNUSED(dt)) { const double gameTime = GameTime::getStepTime(); for (int i = 0; i < drawInfoCount; i++) { MeshDrawInfo* di = drawInfoArray[i]; di->updateAnimation(gameTime); } return; } void World::freeInsideNodes() const { unsigned int i; int j; const ObstacleList& boxes = OBSTACLEMGR.getBoxes(); for (i = 0; i < boxes.size(); i++) { Obstacle* obs = boxes[i]; for (j = 0; j < obs->getInsideSceneNodeCount(); j++) { delete obs->getInsideSceneNodeList()[j]; } obs->freeInsideSceneNodeList(); } const ObstacleList& pyramids = OBSTACLEMGR.getPyrs(); for (i = 0; i < pyramids.size(); i++) { Obstacle* obs = pyramids[i]; for (j = 0; j < obs->getInsideSceneNodeCount(); j++) { delete obs->getInsideSceneNodeList()[j]; } obs->freeInsideSceneNodeList(); } const ObstacleList& basesR = OBSTACLEMGR.getBases(); for (i = 0; i < basesR.size(); i++) { Obstacle* obs = basesR[i]; for (j = 0; j < obs->getInsideSceneNodeCount(); j++) { delete obs->getInsideSceneNodeList()[j]; } obs->freeInsideSceneNodeList(); } const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); for (i = 0; i < meshes.size(); i++) { Obstacle* obs = meshes[i]; for (j = 0; j < obs->getInsideSceneNodeCount(); j++) { delete obs->getInsideSceneNodeList()[j]; } obs->freeInsideSceneNodeList(); } return; } void World::makeLinkMaterial() { const std::string name = "LinkMaterial"; linkMaterial = MATERIALMGR.findMaterial(name); if (linkMaterial != NULL) { return; } int dyncolId = DYNCOLORMGR.findColor(name); if (dyncolId < 0) { DynamicColor* dyncol = new DynamicColor; dyncol->setLimits(0, 0.0f, 0.25f); // red dyncol->setLimits(1, 0.0f, 0.25f); // green dyncol->setLimits(2, 0.0f, 0.25f); // blue dyncol->setLimits(3, 0.75f, 0.75f); // alpha // period, offset, weight float params[3] = {2.0f, 0.0f, 1.0f}; params[1] = 0.0f * (params[0] / 3.0f); // red dyncol->addSinusoid(0, params); params[1] = 1.0f * (params[0] / 3.0f); // green dyncol->addSinusoid(1, params); params[1] = 2.0f * (params[0] / 3.0f); // blue dyncol->addSinusoid(2, params); dyncol->setName(name); dyncol->finalize(); dyncolId = DYNCOLORMGR.addColor (dyncol); } int texmatId = TEXMATRIXMGR.findMatrix(name); if (texmatId < 0) { TextureMatrix* texmat = new TextureMatrix; texmat->setDynamicShift(0.0f, -0.05f); texmat->setName(name); texmat->finalize(); texmatId = TEXMATRIXMGR.addMatrix (texmat); } BzMaterial mat; const float color[4] = {0.0f, 0.0f, 0.0f, 0.5f}; mat.setDiffuse(color); mat.setDynamicColor(dyncolId); mat.setTexture("telelink"); mat.setTextureMatrix(texmatId); mat.setNoLighting(true); mat.setName(name); linkMaterial = MATERIALMGR.addMaterial(&mat); return; } void World::initFlag(int index) { // make sure the server has not sent us a bogus value. if (index >= maxFlags || index < 0) return; // set color of flag (opaque) const float* color = flags[index].type->getColor(); flagNodes[index]->setColor(color[0], color[1], color[2]); // if coming or going then position warp Flag& flag = flags[index]; if (flag.status == FlagComing || flag.status == FlagGoing) { GLfloat pos[3]; pos[0] = flag.position[0]; pos[1] = flag.position[1]; pos[2] = 0.5f * flag.flightEnd * (flag.initialVelocity + 0.25f * BZDBCache::gravity * flag.flightEnd) + flag.position[2]; flagWarpNodes[index]->move(pos); flagWarpNodes[index]->setSizeFraction(0.0f); } } void World::updateWind(float UNUSED(dt)) { const float minWindSpeed = 0.0f; // FIXME - BZDB const float maxWindSpeed = 10.0f; // FIXME - BZDB // pretty cheezy, should be fields and such const double gt = GameTime::getStepTime(); const double oneMinuteFactor = (1.0 / (60.0 * (M_PI * 2.0))); const float wsf = (float)(0.5 + (0.5 * cos(gt * 15.0f * oneMinuteFactor))); const float windSpeed = ((1.0f - wsf) * minWindSpeed) + (wsf * maxWindSpeed); const float windAngle = (float)((M_PI * 2.0) * (cos(gt * 3.0f * oneMinuteFactor) + cos(gt * 10.0f * oneMinuteFactor))); wind[0] = windSpeed * cosf(windAngle); wind[1] = windSpeed * sinf(windAngle); wind[2] = 0.0f; } void World::updateFlag(int index, float dt) { if (!flagNodes) return; const GLfloat* color = flagNodes[index]->getColor(); GLfloat alpha = color[3]; Flag& flag = flags[index]; switch (flag.status) { default: // do nothing (don't move cos either it's not moving or we // don't know the position to move it to) break; case FlagInAir: flag.flightTime += dt; if (flag.flightTime >= flag.flightEnd) { // touchdown flag.status = FlagOnGround; flag.position[0] = flag.landingPosition[0]; flag.position[1] = flag.landingPosition[1]; flag.position[2] = flag.landingPosition[2]; } else { // still flying float t = flag.flightTime / flag.flightEnd; flag.position[0] = (1.0f - t) * flag.launchPosition[0] + t * flag.landingPosition[0]; flag.position[1] = (1.0f - t) * flag.launchPosition[1] + t * flag.landingPosition[1]; flag.position[2] = (1.0f - t) * flag.launchPosition[2] + t * flag.landingPosition[2] + flag.flightTime * (flag.initialVelocity + 0.5f * BZDBCache::gravity * flag.flightTime); } break; case FlagComing: flag.flightTime += dt; if (flag.flightTime >= flag.flightEnd) { // touchdown flag.status = FlagOnGround; flag.position[2] = 0.0f; alpha = 1.0f; } else if (flag.flightTime >= 0.5f * flag.flightEnd) { // falling flag.position[2] = flag.flightTime * (flag.initialVelocity + 0.5f * BZDBCache::gravity * flag.flightTime) + flag.landingPosition[2]; alpha = 1.0f; } else { // hovering flag.position[2] = 0.5f * flag.flightEnd * (flag.initialVelocity + 0.25f * BZDBCache::gravity * flag.flightEnd) + flag.landingPosition[2]; // flag is fades in during first half of hovering period // and is opaque during the second half. flag warp grows // to full size during first half, and shrinks to nothing // during second half. if (flag.flightTime >= 0.25f * flag.flightEnd) { // second half float t = (flag.flightTime - 0.25f * flag.flightEnd) / (0.25f * flag.flightEnd); alpha = 1.0f; flagWarpNodes[index]->setSizeFraction(1.0f - t); } else { // first half float t = flag.flightTime / (0.25f * flag.flightEnd); alpha = t; flagWarpNodes[index]->setSizeFraction(t); } } break; case FlagGoing: flag.flightTime += dt; if (flag.flightTime >= flag.flightEnd) { // all gone flag.status = FlagNoExist; } else if (flag.flightTime < 0.5f * flag.flightEnd) { // rising flag.position[2] = flag.flightTime * (flag.initialVelocity + 0.5f * BZDBCache::gravity * flag.flightTime) + flag.landingPosition[2]; alpha = 1.0f; } else { // hovering flag.position[2] = 0.5f * flag.flightEnd * (flag.initialVelocity + 0.25f * BZDBCache::gravity * flag.flightEnd) + flag.landingPosition[2]; // flag is opaque during first half of hovering period // and fades out during the second half. flag warp grows // to full size during first half, and shrinks to nothing // during second half. if (flag.flightTime < 0.75f * flag.flightEnd) { // first half float t = (0.75f * flag.flightEnd - flag.flightTime) / (0.25f * flag.flightEnd); alpha = 1.0f; flagWarpNodes[index]->setSizeFraction(1.0f - t); } else { // second half float t = (flag.flightEnd - flag.flightTime) / (0.25f * flag.flightEnd); alpha = t; flagWarpNodes[index]->setSizeFraction(t); } } break; } // update alpha if changed if (alpha != color[3]) flagNodes[index]->setColor(color[0], color[1], color[2], alpha); // move flag scene node flagNodes[index]->move(flags[index].position); // setup the flag angle if (flag.status != FlagOnTank) { flagNodes[index]->setWind(wind, dt); flagNodes[index]->setBillboard(true); } else { const Player* flagPlayer = NULL; for (int i = 0; i < curMaxPlayers; i++) { const Player* p = players[i]; if (p && p->getId() == flag.owner) { flagPlayer = p; break; } } if (flagPlayer != NULL) { if (flag.type == Flags::Narrow) { flagNodes[index]->setAngle(flagPlayer->getAngle()); flagNodes[index]->setBillboard(false); } else { float myWind[3]; getWind(myWind, flagPlayer->getPosition()); const float* vel = flagPlayer->getVelocity(); myWind[0] -= vel[0]; myWind[1] -= vel[1]; if (flagPlayer->isFalling()) { myWind[2] -= vel[2]; } flagNodes[index]->setWind(myWind, dt); flagNodes[index]->setBillboard(true); } } else { flagNodes[index]->setWind(wind, dt); // assumes homogeneous wind flagNodes[index]->setBillboard(true); } } } void World::addFlags(SceneDatabase* scene, bool seerView) { if (!flagNodes) return; for (int i = 0; i < maxFlags; i++) { // if not showing flags, only allow FlagOnTank through if (flags[i].status != FlagOnTank && !BZDBCache::displayMainFlags) { continue; } if (flags[i].status == FlagNoExist) continue; // skip flag on a tank that isn't alive. also skip // Cloaking flag on a tank if we don't have a Seer flag. if (flags[i].status == FlagOnTank) { if ((flags[i].type == Flags::Cloaking) && !seerView) { continue; } int j; for (j = 0; j < curMaxPlayers; j++) if (players[j] && players[j]->getId() == flags[i].owner) break; if (j < curMaxPlayers && !(players[j]->getStatus() & PlayerState::Alive)) continue; } scene->addDynamicNode(flagNodes[i]); // add warp if coming/going and hovering if ((flags[i].status == FlagComing && flags[i].flightTime < 0.5 * flags[i].flightEnd) || (flags[i].status == FlagGoing && flags[i].flightTime >= 0.5 * flags[i].flightEnd)) scene->addDynamicNode(flagWarpNodes[i]); } } static std::string indent = ""; static void writeDefaultOBJMaterials(std::ostream& out) { typedef struct { const char* name; const char* texture; float color[4]; } MatProps; const MatProps defaultMats[] = { {"std_ground", "std_ground.png", {0.5f, 0.5f, 0.5f, 1.0f}}, {"boxtop", "roof.png", {1.0f, 1.0f, 0.9f, 1.0f}}, {"boxwall", "boxwall.png", {1.0f, 0.9f, 0.8f, 1.0f}}, {"pyrwall", "pyrwall.png", {0.8f, 0.8f, 1.0f, 1.0f}}, {"telefront", "telelink.png", {1.0f, 0.0f, 0.0f, 0.5f}}, {"teleback", "telelink.png", {0.0f, 1.0f, 0.0f, 0.5f}}, {"telerim", "caution.png", {1.0f, 1.0f, 0.0f, 0.5f}}, {"basetop_team1", "red_basetop.png", {1.0f, 0.8f, 0.8f, 1.0f}}, {"basewall_team1", "red_basewall.png", {1.0f, 0.8f, 0.8f, 1.0f}}, {"basetop_team2", "green_basetop.png", {0.8f, 1.0f, 0.8f, 1.0f}}, {"basewall_team2", "green_basewall.png", {0.8f, 1.0f, 0.8f, 1.0f}}, {"basetop_team3", "blue_basetop.png", {0.8f, 0.8f, 1.0f, 1.0f}}, {"basewall_team3", "blue_basewall.png", {0.8f, 0.8f, 1.0f, 1.0f}}, {"basetop_team4", "purple_basetop.png", {1.0f, 0.8f, 1.0f, 1.0f}}, {"basewall_team4", "purple_basewall.png", {1.0f, 0.8f, 1.0f, 1.0f}} }; const int count = sizeof(defaultMats) / sizeof(defaultMats[0]); BzMaterial mat; for (int i = 0; i < count; i++) { const MatProps& mp = defaultMats[i]; mat.setName(mp.name); mat.setTexture(mp.texture); mat.setDiffuse(mp.color); mat.printMTL(out, ""); } return; } static void writeOBJGround(std::ostream& out) { const float ws = BZDBCache::worldSize / 2.0f; const float ts = BZDBCache::worldSize / 100.0f; out << "o bzground" << std::endl; out << "v " << -ws << " " << -ws << " 0" << std::endl; out << "v " << +ws << " " << -ws << " 0" << std::endl; out << "v " << +ws << " " << +ws << " 0" << std::endl; out << "v " << -ws << " " << +ws << " 0" << std::endl; out << "vt " << -ts << " " << -ts << std::endl; out << "vt " << +ts << " " << -ts << std::endl; out << "vt " << +ts << " " << +ts << std::endl; out << "vt " << -ts << " " << +ts << std::endl; out << "vn 0 0 1" << std::endl; out << "usemtl std_ground" << std::endl; out << "f -4/-4/-1 -3/-3/-1 -2/-2/-1 -1/-1/-1" << std::endl; out << std::endl; return; } static void writeBZDBvar (const std::string& name, void *userData) { std::ofstream& out = *((std::ofstream*)userData); if ((BZDB.getPermission(name) == StateDatabase::Server) && (BZDB.get(name) != BZDB.getDefault(name)) && (name != "poll")) { std::string qmark = ""; if (BZDB.get(name).find(' ') != std::string::npos) { qmark = '"'; } out << indent << " -set " << name << " " << qmark << BZDB.get(name) << qmark << std::endl; } return; } bool World::writeWorld(const std::string& filename, std::string& fullname) { const bool saveAsOBJ = BZDB.isTrue("saveAsOBJ"); if (saveAsOBJ) { indent = "# "; } else { indent = ""; } fullname = getWorldDirName(); fullname += filename; if (saveAsOBJ) { if (strstr(fullname.c_str(), ".obj") == NULL) { fullname += ".obj"; } } else { if (strstr(fullname.c_str(), ".bzw") == NULL) { fullname += ".bzw"; } } std::ostream *stream = FILEMGR.createDataOutStream(fullname.c_str()); if (stream == NULL) { return false; } // for notational convenience std::ostream& out = *stream; time_t nowTime = time (NULL); out << "# BZFlag client: saved world on " << ctime(&nowTime) << std::endl; // Write the Server Options { out << indent << "options" << std::endl; // FIXME - would be nice to get a few other thing // -fb, -sb, rabbit style, a real -mp, etc... (also, flags?) if (allowTeamFlags()) { out << indent << " -c" << std::endl; out << indent << " -mp 2,"; for (int t = RedTeam; t <= PurpleTeam; t++) { if (getBase(t, 0) != NULL) out << "2,"; else out << "0,"; } out << "2" << std::endl; } if (allowRabbit()) out << indent << " -rabbit" << std::endl; if (allowJumping()) out << indent << " -j" << std::endl; if (allShotsRicochet()) out << indent << " +r" << std::endl; if (allowHandicap()) out << indent << " -handicap" << std::endl; if (allowAntidote()) { out << indent << " -sa" << std::endl; out << indent << " -st " << getFlagShakeTimeout() << std::endl; out << indent << " -sw " << getFlagShakeWins() << std::endl; } if ((getLinearAcceleration() != 0.0f) || (getAngularAcceleration() != 0.0f)) { out << indent << " -a " << getLinearAcceleration() << " " << getAngularAcceleration() << std::endl; } out << indent << " -ms " << getMaxShots() << std::endl; // Write BZDB server variables that aren't defaults BZDB.iterate (writeBZDBvar, &out); out << indent << "end" << std::endl << std::endl; } // Write World object { float worldSize = BZDBCache::worldSize; float flagHeight = BZDB.eval(StateDatabase::BZDB_FLAGHEIGHT); if ((worldSize != atof(BZDB.getDefault(StateDatabase::BZDB_WORLDSIZE).c_str())) || (flagHeight != atof(BZDB.getDefault(StateDatabase::BZDB_FLAGHEIGHT).c_str()))) { out << indent << "world" << std::endl; if (worldSize != atof(BZDB.getDefault(StateDatabase::BZDB_WORLDSIZE).c_str())) { out << indent << " size " << worldSize / 2.0f << std::endl; } if (flagHeight != atof(BZDB.getDefault(StateDatabase::BZDB_FLAGHEIGHT).c_str())) { out << indent << " flagHeight " << flagHeight << std::endl; } out << indent << "end" << std::endl << std::endl; } } // Write dynamic colors DYNCOLORMGR.print(out, indent); // Write texture matrices TEXMATRIXMGR.print(out, indent); // Write materials if (!saveAsOBJ) { MATERIALMGR.print(out, indent); } else { const std::string mtlname = filename + ".mtl"; const std::string mtlfile = getWorldDirName() + mtlname; std::ostream* mtlStream = FILEMGR.createDataOutStream(mtlfile.c_str()); if (mtlStream != NULL) { out << "mtllib " << mtlname << std::endl; // index the mtl file out << std::endl; *mtlStream << "# BZFlag client: saved world on " << ctime(&nowTime); *mtlStream << std::endl; writeDefaultOBJMaterials(*mtlStream); MATERIALMGR.printMTL(*mtlStream, ""); delete mtlStream; } } // Write physics drivers PHYDRVMGR.print(out, indent); // Write obstacle transforms TRANSFORMMGR.print(out, indent); // Write water level { if (waterLevel >= 0.0f) { out << indent << "waterLevel" << std::endl; out << indent << " height " << waterLevel << std::endl; out << indent << " matref "; MATERIALMGR.printReference(out, waterMaterial); out << std::endl; out << indent << "end" << std::endl << std::endl; } } // Write the world obstacles { if (saveAsOBJ) { writeOBJGround(out); } OBSTACLEMGR.print(out, indent); } // Write links { links.print(out, indent); } // Write weapons { for (std::vector::iterator it = weapons.begin(); it != weapons.end(); ++it) { Weapon weapon = *it; out << indent << "weapon" << std::endl; if (weapon.type != Flags::Null) { out << indent << " type " << weapon.type->flagAbbv << std::endl; } out << indent << " position " << weapon.pos[0] << " " << weapon.pos[1] << " " << weapon.pos[2] << std::endl; out << indent << " rotation " << ((weapon.dir * 180.0) / M_PI) << std::endl; out << indent << " initdelay " << weapon.initDelay << std::endl; if (!weapon.delay.empty()) { out << indent << " delay"; for (std::vector::iterator dit = weapon.delay.begin(); dit != weapon.delay.end(); ++dit) { out << " " << (float)*dit; } out << std::endl; } out << indent << "end" << std::endl << std::endl; } } // Write entry zones { for (std::vector::iterator it = entryZones.begin(); it != entryZones.end(); ++it) { EntryZone zone = *it; out << indent << "zone" << std::endl; out << indent << " position " << zone.pos[0] << " " << zone.pos[1] << " " << zone.pos[2] << std::endl; out << indent << " size " << zone.size[0] << " " << zone.size[1] << " " << zone.size[2] << std::endl; out << indent << " rotation " << ((zone.rot * 180.0) / M_PI) << std::endl; if (!zone.flags.empty()) { out << indent << " flag"; std::vector::iterator fit; for (fit = zone.flags.begin(); fit != zone.flags.end(); ++fit) { out << " " << (*fit)->flagAbbv; } out << std::endl; } if (!zone.teams.empty()) { out << indent << " team"; std::vector::iterator tit; for (tit = zone.teams.begin(); tit != zone.teams.end(); ++tit) { out << " " << (*tit); } out << std::endl; } if (!zone.safety.empty()) { out << indent << " safety"; std::vector::iterator sit; for (sit = zone.safety.begin(); sit != zone.safety.end(); ++sit) { out << " " << (*sit); } out << std::endl; } out << indent << "end" << std::endl << std::endl; } } delete stream; return true; } static void drawLines (int count, float (*vertices)[3], int color) { const float colors[][4] = { { 0.25f, 0.25f, 0.25f, 0.8f }, // gray (branch node) { 0.25f, 0.25f, 0.0f, 0.8f }, // yellow (regular) { 0.0f, 0.25f, 0.25f, 0.8f }, // cyan (meshed) { 0.25f, 0.0f, 0.25f, 0.8f }, // purple (meshed + regular) }; const int colorCount = sizeof(colors) / sizeof(colors[0]); if (color < 0) { color = 0; } else if (color >= colorCount) { color = colorCount - 1; } glColor4fv (colors[color]); glBegin (GL_LINE_STRIP); for (int i = 0; i < count; i++) { glVertex3fv (vertices[i]); } glEnd (); return; } static void drawInsideOutsidePoints() { std::vector insides; std::vector outsides; const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); for (unsigned int i = 0; i < meshes.size(); i++) { const MeshObstacle* mesh = (const MeshObstacle*) meshes[i]; const int checkCount = mesh->getCheckCount(); const char* checkTypes = mesh->getCheckTypes(); const afvec3* checkPoints = mesh->getCheckPoints(); for (int c = 0; c < checkCount; c++) { switch (checkTypes[c]) { case MeshObstacle::CheckInside: { insides.push_back(checkPoints[c]); break; } case MeshObstacle::CheckOutside: { outsides.push_back(checkPoints[c]); break; } default: { break; } } } } glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_POINT_BIT | GL_LINE_BIT); glDisable(GL_DEPTH_TEST); glEnable(GL_POINT_SMOOTH); glEnable(GL_LINE_SMOOTH); glLineWidth(1.49f); glPointSize(4.49f); glBegin(GL_POINTS); { glColor4f(0.0f, 1.0f, 0.0f, 0.8f); for (size_t i = 0; i < insides.size(); i++) { glVertex3fv(insides[i]); } glColor4f(1.0f, 0.0f, 0.0f, 0.8f); for (size_t i = 0; i < outsides.size(); i++) { glVertex3fv(outsides[i]); } } glEnd(); glBegin(GL_LINES); { glColor4f(0.0f, 1.0f, 0.0f, 0.2f); for (size_t i = 0; i < insides.size(); i++) { glVertex3f(insides[i][0], insides[i][1], 0.0f); glVertex3fv(insides[i]); } glColor4f(1.0f, 0.0f, 0.0f, 0.2f); for (size_t i = 0; i < outsides.size(); i++) { glVertex3f(outsides[i][0], outsides[i][1], 0.0f); glVertex3fv(outsides[i]); } } glEnd(); glPopAttrib(); } void World::drawCollisionGrid() const { GLboolean usingTextures; glGetBooleanv (GL_TEXTURE_2D, &usingTextures); glDisable (GL_TEXTURE_2D); COLLISIONMGR.draw (&drawLines); drawInsideOutsidePoints(); if (usingTextures) { glEnable (GL_TEXTURE_2D); } return; } RemotePlayer* World::getCurrentRabbit() const { if (players == NULL) { return NULL; } for (int i = 0; i < curMaxPlayers; i++) { RemotePlayer* p = players[i]; if (p && p->isAlive() && (p->getTeam() == RabbitTeam)) { return p; } } return NULL; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/World.h000066400000000000000000000221621200563112200167360ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __WORLD_H__ #define __WORLD_H__ #include "common.h" /* system interface headers */ #include #include /* common interface headers */ #include "Team.h" #include "FlagWarpSceneNode.h" #include "BundleMgr.h" #include "LinkManager.h" /* local interface headers */ #include "RemotePlayer.h" #include "WorldPlayer.h" #include "Weapon.h" #include "EntryZone.h" class FlagSceneNode; class MeshDrawInfo; /** * World: * Game database -- buildings, teleporters, game style */ class World { friend class WorldBuilder; public: World(); ~World(); bool allowTeamFlags() const; bool allowTeamKills() const; bool allowSuperFlags() const; bool allowJumping() const; bool allShotsRicochet() const; bool allowAntidote() const; bool allowShakeTimeout() const; bool allowShakeWins() const; bool allowRabbit() const; bool allowHandicap() const; bool allowTeams() const; float getWaterLevel() const; const BzMaterial* getWaterMaterial() const; const BzMaterial* getLinkMaterial() const; float getLinearAcceleration() const; float getAngularAcceleration() const; float getFlagShakeTimeout() const; int getFlagShakeWins() const; int getMaxPlayers() const; int getCurMaxPlayers() const; void setCurMaxPlayers(int curMaxPlayers); int getMaxShots() const; int getMaxFlags() const; float getShakeTimeout() const; int getShakeWins() const; const Team* getTeams() const; const Team& getTeam(int index) const; Team* getTeams(); Team& getTeam(int index); RemotePlayer** getPlayers() const; RemotePlayer*& getPlayer(int index) const; RemotePlayer* getCurrentRabbit() const; WorldPlayer* getWorldWeapons() const; Flag& getFlag(int index) const; const float* getBase(int, int=0) const; const Teleporter* getTeleporter(int source, int& face) const; int getTeleporter(const Teleporter*, int face) const; int getTeleportTarget(int source) const; int getTeleportTarget(int source, unsigned int seed) const; TeamColor whoseBase(const float* pos) const; const Obstacle* inBuilding(const float* pos, float radius, float tankHeight) const; const Obstacle* inBuilding(const float* pos, float angle, float tankWidth, float tankBreadth, float tankHeight) const; const Obstacle* hitBuilding(const float* pos, float angle, float tankWidth, float tankBreadth, float tankHeight) const; const Obstacle* hitBuilding(const float* oldPos, float oldAngle, const float* pos, float angle, float tankWidth, float tankBreadth, float tankHeight, bool directional) const; bool crossingTeleporter(const float* oldPos, float angle, float tankWidth, float tankBreadth, float tankHeight, float* plane) const; const Teleporter* crossesTeleporter(const float* oldPos, const float* newPos, int& face) const; const Teleporter* crossesTeleporter(const Ray& r, int& face) const; float getProximity(const float* pos, float radius) const; void initFlag(int index); void updateFlag(int index, float dt); void updateAnimations(float dt); void addFlags(SceneDatabase*, bool seerView); void updateWind(float dt); void getWind(float wind[3], const float pos[3]) const; void makeMeshDrawMgrs(); static World* getWorld(); static void setWorld(World*); static BundleMgr* getBundleMgr(); static void setBundleMgr(BundleMgr *bundleMgr); static std::string getLocale(); static void setLocale(const std::string &locale); static void init(); static void done(); static void setFlagTexture(FlagSceneNode*); void makeLinkMaterial(); void loadCollisionManager(); void checkCollisionManager(); bool writeWorld(const std::string& filename, std::string& fullname); void drawCollisionGrid() const; void freeInsideNodes() const; private: // disallow copy and assignment World(const World&); World& operator=(const World&); void freeFlags(); void freeMeshDrawMgrs(); private: short gameType; short gameOptions; float linearAcceleration; float angularAcceleration; int maxPlayers; int curMaxPlayers; int maxShots; int maxFlags; float shakeTimeout; int shakeWins; float waterLevel; const BzMaterial* waterMaterial; const BzMaterial* linkMaterial; typedef struct { float p[7]; } BaseParms; typedef std::vector TeamBases; TeamBases bases[NumTeams]; Team team[NumTeams]; std::vector weapons; std::vector entryZones; RemotePlayer** players; WorldPlayer* worldWeapons; Flag* flags; FlagSceneNode** flagNodes; FlagWarpSceneNode** flagWarpNodes; int drawInfoCount; MeshDrawInfo** drawInfoArray; float wind[3]; LinkManager links; // required graphics settings int oldFogEffect; bool oldUseDrawInfo; static World* playingField; static BundleMgr *bundleMgr; static std::string locale; static int flagTexture; }; // // World // inline bool World::allowTeams() const { return gameType != OpenFFA; } inline bool World::allowTeamFlags() const { return gameType == ClassicCTF; } inline bool World::allowTeamKills() const { return (gameOptions & short(NoTeamKillsGameStyle)) == 0 || !allowTeams(); } inline bool World::allowSuperFlags() const { return (gameOptions & short(SuperFlagGameStyle)) != 0; } inline bool World::allowJumping() const { return (gameOptions & short(JumpingGameStyle)) != 0; } inline bool World::allShotsRicochet() const { return (gameOptions & short(RicochetGameStyle)) != 0; } inline bool World::allowAntidote() const { return (gameOptions & short(AntidoteGameStyle)) != 0; } inline bool World::allowShakeTimeout() const { return (gameOptions & short(ShakableGameStyle)) != 0 && shakeTimeout != 0.0f; } inline bool World::allowShakeWins() const { return (gameOptions & short(ShakableGameStyle)) != 0 && shakeWins != 0; } inline bool World::allowRabbit() const { return gameType == RabbitChase; } inline bool World::allowHandicap() const { return (gameOptions & short(HandicapGameStyle)) != 0; } inline float World::getWaterLevel() const { return waterLevel; } inline const BzMaterial* World::getWaterMaterial() const { return waterMaterial; } inline const BzMaterial* World::getLinkMaterial() const { return linkMaterial; } inline float World::getLinearAcceleration() const { return linearAcceleration; } inline float World::getAngularAcceleration() const { return angularAcceleration; } inline float World::getFlagShakeTimeout() const { return shakeTimeout; } inline int World::getFlagShakeWins() const { return shakeWins; } inline int World::getMaxPlayers() const { return maxPlayers; } inline int World::getCurMaxPlayers() const { return curMaxPlayers; } inline void World::setCurMaxPlayers(int _curMaxPlayers) { curMaxPlayers = _curMaxPlayers; } inline int World::getMaxShots() const { return maxShots; } inline int World::getMaxFlags() const { return maxFlags; } inline float World::getShakeTimeout() const { return shakeTimeout; } inline int World::getShakeWins() const { return shakeWins; } inline const Team* World::getTeams() const { return team; } inline Team* World::getTeams() { return team; } inline const Team& World::getTeam(int index) const { return team[index]; } inline Team& World::getTeam(int index) { return team[index]; } inline RemotePlayer** World::getPlayers() const { return players; } inline RemotePlayer*& World::getPlayer(int index) const { return players[index]; } inline WorldPlayer* World::getWorldWeapons() const { return worldWeapons; } inline Flag& World::getFlag(int index) const { return flags[index]; } inline const float* World::getBase(int _team, int base) const { const TeamBases &b = bases[_team]; if ((base < 0) || (base >= (int)b.size())) return NULL; return b[base].p; } inline World* World::getWorld() { return playingField; } inline BundleMgr* World::getBundleMgr() { return World::bundleMgr; } inline void World::setBundleMgr(BundleMgr *_bundleMgr) { bundleMgr = _bundleMgr; } inline std::string World::getLocale() { return locale; } inline void World::setLocale(const std::string& _locale) { locale = _locale; } inline void World::getWind(float w[3], const float[3]) const { // homogeneous, for now w[0] = wind[0]; w[1] = wind[1]; w[2] = wind[2]; return; } #endif /* __WORLD_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WorldBuilder.cxx000066400000000000000000000210251200563112200206150ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "WorldBuilder.h" /* common implementation headers */ #include "TextUtils.h" #include "Protocol.h" #include "DynamicColor.h" #include "TextureMatrix.h" #include "PhysicsDriver.h" #include "FlagSceneNode.h" #include "ObstacleMgr.h" #include "BaseBuilding.h" /* compression library header */ #include WorldBuilder::WorldBuilder() { world = new World; owned = true; } WorldBuilder::~WorldBuilder() { if (owned) delete world; } void* WorldBuilder::unpack(void* buf) { TimeKeeper start = TimeKeeper::getCurrent(); // unpack world database from network transfer // read style header uint16_t code, len; buf = nboUnpackUShort(buf, len); buf = nboUnpackUShort(buf, code); if (code != WorldCodeHeader) return NULL; // read style uint16_t serverMapVersion; buf = nboUnpackUShort(buf, serverMapVersion); if (serverMapVersion != mapVersion) { logDebugMessage(1,"WorldBuilder::unpack() bad map version\n"); return NULL; } // decompress uint32_t compressedSize, uncompressedSize; buf = nboUnpackUInt (buf, uncompressedSize); buf = nboUnpackUInt (buf, compressedSize); uLongf destLen = uncompressedSize; char *uncompressedWorld = new char[destLen]; char *compressedWorld = (char*) buf; if (uncompress ((Bytef*)uncompressedWorld, &destLen, (Bytef*)compressedWorld, compressedSize) != Z_OK) { delete[] uncompressedWorld; logDebugMessage(1,"WorldBuilder::unpack() could not decompress\n"); return NULL; } char* uncompressedEnd = uncompressedWorld + uncompressedSize;; buf = uncompressedWorld; // setup the buffer overrun checking nboUseErrorChecking(true); nboSetBufferLength(uncompressedSize); nboClearBufferError(); // unpack dynamic colors DYNCOLORMGR.clear(); buf = DYNCOLORMGR.unpack(buf); // unpack texture matrices TEXMATRIXMGR.clear(); buf = TEXMATRIXMGR.unpack(buf); // unpack materials MATERIALMGR.clear(); buf = MATERIALMGR.unpack(buf); // unpack physics drivers PHYDRVMGR.clear(); buf = PHYDRVMGR.unpack(buf); // unpack obstacle transforms TRANSFORMMGR.clear(); buf = TRANSFORMMGR.unpack(buf); // unpack the obstacles OBSTACLEMGR.clear(); buf = OBSTACLEMGR.unpack(buf); // unpack the teleporter links world->links.clear(); buf = world->links.unpack(buf); // unpack water level buf = nboUnpackFloat(buf, world->waterLevel); if (world->waterLevel >= 0.0f) { int32_t matindex; buf = nboUnpackInt(buf, matindex); world->waterMaterial = MATERIALMGR.getMaterial(matindex); } uint32_t i, count; // unpack the weapons buf = nboUnpackUInt(buf, count); for (i = 0; i < count; i++) { Weapon weapon; buf = weapon.unpack(buf); world->weapons.push_back(weapon); } // unpack the entry zones buf = nboUnpackUInt(buf, count); for (i = 0; i < count; i++) { EntryZone zone; buf = zone.unpack(buf); world->entryZones.push_back(zone); } // check if the unpacking was successful nboUseErrorChecking(false); if (nboGetBufferError()) { delete[] uncompressedWorld; logDebugMessage(1,"WorldBuilder::unpack() overrun\n"); return NULL; } if ((char*)buf != uncompressedEnd) { delete[] uncompressedWorld; logDebugMessage(1,"WorldBuilder::unpack() ending mismatch (%i)\n", (char*)buf - uncompressedEnd); return NULL; } // switch back to the original buffer buf = compressedWorld + compressedSize; buf = nboUnpackUShort(buf, len); buf = nboUnpackUShort(buf, code); if ((code != WorldCodeEnd) || (len != WorldCodeEndSize)) { delete[] uncompressedWorld; logDebugMessage(1,"WorldBuilder::unpack() bad ending\n"); return NULL; } // delete the buffer delete[] uncompressedWorld; // build the world obstacles OBSTACLEMGR.makeWorld(); // link the teleporters world->links.doLinking(); // make the team bases if (world->gameType == ClassicCTF) { const ObstacleList& bases = OBSTACLEMGR.getBases(); for (i = 0; i < bases.size(); i++) { const BaseBuilding* base = (const BaseBuilding*) bases[i]; setBase((TeamColor)base->getTeam(), base->getPosition(), base->getRotation(), base->getWidth(), base->getBreadth(), base->getHeight()); } } else { OBSTACLEMGR.replaceBasesWithBoxes(); } world->makeLinkMaterial(); world->makeMeshDrawMgrs(); // NOTE: relying on checkCollisionManager() to do the first loading // of ColiisionManager, because the BZDB variables come in later, // and would cause a double loading if we did it now. if (debugLevel >= 3) { TimeKeeper end = TimeKeeper::getCurrent(); const float elapsed = (float)(end - start); logDebugMessage(0,"WorldBuilder::unpack() processed in %f seconds.\n", elapsed); } return buf; } void* WorldBuilder::unpackGameSettings(void* buf) { // read style uint16_t gameType, gameOptions, maxPlayers, maxShots, maxFlags; float worldSize; buf = nboUnpackFloat(buf, worldSize); BZDB.set(StateDatabase::BZDB_WORLDSIZE, TextUtils::format("%f", worldSize)); buf = nboUnpackUShort(buf, gameType); setGameType(short(gameType)); buf = nboUnpackUShort(buf, gameOptions); setGameOptions(short(gameOptions)); buf = nboUnpackUShort(buf, maxPlayers); setMaxPlayers(int(maxPlayers)); buf = nboUnpackUShort(buf, maxShots); setMaxShots(int(maxShots)); buf = nboUnpackUShort(buf, maxFlags); setMaxFlags(int(maxFlags)); buf = nboUnpackFloat(buf, world->linearAcceleration); buf = nboUnpackFloat(buf, world->angularAcceleration); uint16_t shakeTimeout = 0, shakeWins; buf = nboUnpackUShort(buf, shakeTimeout); setShakeTimeout(0.1f * float(shakeTimeout)); buf = nboUnpackUShort(buf, shakeWins); setShakeWins(shakeWins); uint32_t UsedToBeSyncTime; // FIXME buf = nboUnpackUInt(buf, UsedToBeSyncTime); return buf; } void WorldBuilder::preGetWorld() { // prepare players array if (world->players) { delete[] world->players; } // FIXME // world->maxPlayers do not work as bzfs uses more player slot than // real players. Any tcp connection is assigned a slot. // So I put now 216. We should fix it though. const int maxPlayers = 216; world->players = new RemotePlayer*[maxPlayers]; int i; for (i = 0; i < maxPlayers; i++) { world->players[i] = NULL; } // prepare flags array world->freeFlags(); world->flags = new Flag[world->maxFlags]; world->flagNodes = new FlagSceneNode*[world->maxFlags]; world->flagWarpNodes = new FlagWarpSceneNode*[world->maxFlags]; for (i = 0; i < world->maxFlags; i++) { world->flags[i].type = Flags::Null; world->flags[i].status = FlagNoExist; world->flags[i].position[0] = 0.0f; world->flags[i].position[1] = 0.0f; world->flags[i].position[2] = 0.0f; world->flagNodes[i] = new FlagSceneNode(world->flags[i].position); world->flagWarpNodes[i] = new FlagWarpSceneNode(world->flags[i].position); world->flagNodes[i]->setTexture(World::flagTexture); } return; } World* WorldBuilder::getWorld() { owned = false; preGetWorld(); return world; } World* WorldBuilder::peekWorld() { preGetWorld(); return world; } void WorldBuilder::setGameType(short gameType) { world->gameType = gameType; } void WorldBuilder::setGameOptions(short gameOptions) { world->gameOptions = gameOptions; } void WorldBuilder::setMaxPlayers(int maxPlayers) { world->maxPlayers = maxPlayers; } void WorldBuilder::setMaxShots(int maxShots) { world->maxShots = maxShots; } void WorldBuilder::setMaxFlags(int maxFlags) { world->maxFlags = maxFlags; } void WorldBuilder::setShakeTimeout(float timeout) const { world->shakeTimeout = timeout; } void WorldBuilder::setShakeWins(int wins) const { world->shakeWins = wins; } void WorldBuilder::setBase(TeamColor team, const float* pos, float rotation, float w, float b, float h) { int teamIndex = int(team); World::BaseParms bp; bp.p[0] = pos[0]; bp.p[1] = pos[1]; bp.p[2] = pos[2]; bp.p[3] = rotation; bp.p[4] = w; bp.p[5] = b; bp.p[6] = h; world->bases[teamIndex].push_back( bp ); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WorldBuilder.h000066400000000000000000000027401200563112200202450ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __WORLDBUILDER_H__ #define __WORLDBUILDER_H__ #include "common.h" /* local interface headers */ #include "World.h" /** builds a bzlfag world */ class WorldBuilder { public: WorldBuilder(); ~WorldBuilder(); void* unpack(void*); void *unpackGameSettings(void*); World* getWorld(); World* peekWorld(); // doesn't give up ownership void setGameType(short gameType); void setGameOptions(short gameOptions); void setMaxPlayers(int maxPlayers); void setMaxShots(int maxSimultaneousShots); void setMaxFlags(int maxFlags); void setShakeTimeout(float timeout) const; void setShakeWins(int wins) const; void setBase(TeamColor team, const float* pos, float rotation, float w, float b, float h); private: void preGetWorld(); private: bool owned; World* world; }; #endif /* __WORLDBUILDER_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WorldPlayer.cxx000066400000000000000000000060161200563112200204660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "WorldPlayer.h" WorldPlayer::WorldPlayer() : Player(ServerPlayer, RogueTeam, "world weapon", "", ComputerPlayer) { } WorldPlayer::~WorldPlayer() { for (std::vector::iterator it = shots.begin(); it != shots.end(); ++it) { RemoteShotPath *shot = *it; delete shot; } shots.clear(); } void WorldPlayer::addShot(const FiringInfo& info) { RemoteShotPath* newShot = new RemoteShotPath(info); int shotNum = int(newShot->getShotId() & 255); if (shotNum >= (int)shots.size()) { shots.resize(shotNum+1); } else { if (shots[shotNum] != NULL) delete shots[shotNum]; } shots[shotNum] = newShot; } ShotPath* WorldPlayer::getShot(int index) const { if ((index & 255) >= (int)shots.size()) return NULL; return shots[index & 255]; } bool WorldPlayer::doEndShot( int ident, bool isHit, float* pos) { const int index = ident & 255; const int salt = (ident >> 8) & 127; // special id used in some messages (and really shouldn't be sent here) if (ident == -1) return false; // ignore bogus shots (those with a bad index or for shots that don't exist) if (index < 0 || index >= (int)shots.size() || !shots[index]) return false; // ignore shots that already ending if (shots[index]->isExpired() || shots[index]->isExpiring()) return false; // ignore shots that have the wrong salt. since we reuse shot indices // it's possible for an old MsgShotEnd to arrive after we've started a // new shot. that's where the salt comes in. it changes for each shot // so we can identify an old shot from a new one. if (salt != ((shots[index]->getShotId() >> 8) & 127)) return false; // don't stop if it's because were hitting something and we don't stop // when we hit something. if (isHit && !shots[index]->isStoppedByHit()) return false; // end it const float* shotPos = shots[index]->getPosition(); pos[0] = shotPos[0]; pos[1] = shotPos[1]; pos[2] = shotPos[2]; shots[index]->setExpired(); return true; } void WorldPlayer::updateShots(float dt) { for (int i = 0; i < (int)shots.size(); i++) if (shots[i]) shots[i]->update(dt); } void WorldPlayer::addShots(SceneDatabase* scene, bool colorblind) const { const int count = shots.size(); for (int i = 0; i < count; i++) { ShotPath* shot = getShot(i); if (shot && !shot->isExpiring() && !shot->isExpired()) shot->addShot(scene, colorblind); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/WorldPlayer.h000066400000000000000000000023461200563112200201150ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_WORLD_PLAYER_H #define BZF_WORLD_PLAYER_H #include "common.h" #include "Player.h" #include "ShotPath.h" #include class WorldPlayer : public Player { public: WorldPlayer(); ~WorldPlayer(); void addShot(const FiringInfo&); ShotPath* getShot(int index) const; void updateShots(float dt); int getMaxShots() const; void addShots(SceneDatabase* scene, bool colorblind) const; private: bool doEndShot(int index, bool isHit, float* pos); private: std::vector shots; }; inline int WorldPlayer::getMaxShots() const { return shots.size(); } #endif // BZF_WORLD_PLAYER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/bzflag.cxx000066400000000000000000001244111200563112200174670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // get our interface #include "bzflag.h" /* system headers */ #include #include #include #include #include #include #include #include #include #include #include #if defined(_WIN32) # include # include # include # include #else # include # include #endif /* defined(_WIN32) */ /* common headers */ #include "Address.h" #include "AresHandler.h" #include "BZDBCache.h" #include "BZDBLocal.h" #include "BundleMgr.h" #include "BzfMedia.h" #include "BzfVisual.h" #include "BzfWindow.h" #include "CommandManager.h" #include "CommandsStandard.h" #include "ConfigFileManager.h" #include "DirectoryNames.h" #include "ErrorHandler.h" #include "FileManager.h" #include "FontManager.h" #include "GUIOptionsMenu.h" #include "KeyManager.h" #include "OSFile.h" #include "OpenGLGState.h" #include "ParseColor.h" #include "PlatformFactory.h" #include "Protocol.h" #include "ServerListCache.h" #include "StateDatabase.h" #include "Team.h" #include "TextUtils.h" #include "TextureManager.h" #include "TimeBomb.h" #include "WordFilter.h" #include "World.h" #include "bzfSDL.h" #include "bzfgl.h" #include "bzfio.h" /* local headers */ #include "ActionBinding.h" #include "ServerStartMenu.h" #include "callbacks.h" #include "playing.h" #include "sound.h" #include "playing.h" // invoke incessant rebuilding for build versioning #include "version.h" // defaults for bzdb #include "defaultBZDB.h" // client prefrences #include "clientConfig.h" int beginendCount = 0; const char* argv0; std::string alternateConfig; static bool noAudio = false; struct tm userTime; bool echoToConsole = false; bool echoAnsi = false; int debugLevel = 0; static BzfDisplay* display = NULL; #ifdef ROBOT // ROBOT -- tidy up int numRobotTanks = 0; #endif // // application initialization // // so that Windows can kill the wsa stuff if needed int bail ( int returnCode ) { #ifdef _WIN32 WSACleanup(); #endif return returnCode; } static void setTeamColor(TeamColor team, const std::string& str) { float color[4]; parseColorString(str, color); // don't worry about alpha, Team::setColors() doesn't use it Team::setColors(team, color, Team::getRadarColor(team)); } static void setRadarColor(TeamColor team, const std::string& str) { float color[4]; parseColorString(str, color); // don't worry about alpha, Team::setColors() doesn't use it Team::setColors(team, Team::getTankColor(team), color); } static void setVisual(BzfVisual* visual) { // sine qua non visual->setLevel(0); visual->setDoubleBuffer(true); visual->setRGBA(1, 1, 1, 0); // ask for a zbuffer if not disabled. we might // choose not to use it if we do ask for it. if (!BZDB.isSet("zbuffer") || (BZDB.get("zbuffer") != "disable")) { int depthLevel = 16; if (BZDB.isSet("forceDepthBits")) { depthLevel = BZDB.evalInt("forceDepthBits"); } visual->setDepth(depthLevel); } // optional visual->setStencil(4); #if defined(DEBUG_RENDERING) visual->setStencil(4); #else visual->setStencil(1); #endif if (BZDB.isTrue("multisample")) visual->setMultisample(4); #ifdef USE_GL_STEREO if (BZDB.isSet("view") && BZDB.get("view") == configViewValues[1]) visual->setStereo(true); #endif } static void usage() { printFatalError("usage: %s" " [-badwords ]" " [-config ]" " [-configdir ]" " [-d | -debug]" #ifdef DEBUG " [-date mm/dd/yyyy]" #endif " [{-dir | -directory} ]" " [-e | -echo]" " [-ea | -echoAnsi]" " [-eyesep separation]" " [-focal distance]" " [-h | -help | --help]" " [-latitude ] [-longitude ]" " [-list ] [-nolist]" " [-locale ]" " [-m | -mute]" " [-motd ] [-nomotd]" " [-multisample]" #ifdef ROBOT " [-solo ]" #endif " [-team {red|green|blue|purple|rogue|observer}]" " [-time hh:mm:ss] [-notime]" " [-v | -version | --version]" " [-view {normal|stereo|stacked|three|anaglyph|interlaced}]" " [-window ]" " [-zbuffer {on|off}]" " [callsign[:password]@]server[:port]\n\nExiting.", argv0); if (display != NULL) { delete display; display=NULL; } exit(1); } static void checkArgc(int& i, int argc, const char* option, const char *type = "Missing") { if ((i+1) == argc) { printFatalError("%s argument for %s\n", type, option); usage(); } i++; // just skip the option argument string } static void parse(int argc, char** argv) { // = 9; for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-config") == 0) { checkArgc(i, argc, argv[i]); // the setting has already been done in parseConfigName() } else if (strcmp(argv[i], "-configdir") == 0) { checkArgc(i, argc, argv[i]); // the setting has already been done in parseConfigName() } else if ((strcmp(argv[i], "-dir") == 0) || (strcmp(argv[i], "-directory") == 0)) { checkArgc(i, argc, argv[i]); if (strlen(argv[i]) == 0) { BZDB.unset("directory"); } else { BZDB.set("directory", argv[i]); } } else if (strcmp(argv[i], "-e") == 0 || strcmp(argv[i], "-echo") == 0) { echoToConsole = true; } else if (strcmp(argv[i], "-ea") == 0 || strcmp(argv[i], "-echoAnsi") == 0) { echoToConsole = true; echoAnsi = true; } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { usage(); } else if (strcmp(argv[i], "-latitude") == 0) { checkArgc(i, argc, argv[i]); double latitude = atof(argv[i]); if (latitude < -90.0 || latitude > 90.0) { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } BZDB.set("latitude", argv[i]); } else if (strcmp(argv[i], "-longitude") == 0) { checkArgc(i, argc, argv[i]); double longitude = atof(argv[i]); if (longitude < -180.0 || longitude > 180.0) { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } BZDB.set("longitude", argv[i]); } else if (strcmp(argv[i], "-list") == 0) { checkArgc(i, argc, argv[i]); if (strcmp(argv[i], "default") == 0) { BZDB.set("list", BZDB.getDefault("list")); } else { startupInfo.listServerURL = argv[i]; BZDB.set("list", argv[i]); } } else if (strcmp(argv[i], "-locale") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("locale", argv[i]); } else if (strcmp(argv[i], "-motd") == 0) { checkArgc(i, argc, argv[i]); if (strcmp(argv[i], "default") == 0) { BZDB.set("motdServer", BZDB.getDefault("motdServer")); } else { BZDB.set("motdServer", argv[i]); } BZDB.unset("disableMOTD"); } else if (strcmp(argv[i], "-nomotd") == 0) { BZDB.set("disableMOTD", "1"); } else if (strcmp(argv[i], "-nolist") == 0) { startupInfo.listServerURL = ""; BZDB.set("list", ""); } else if (strcmp(argv[i], "-m") == 0 || strcmp(argv[i], "-mute") == 0) { noAudio = true; } else if (strcmp(argv[i], "-multisample") == 0) { BZDB.set("_multisample", "1"); #ifdef ROBOT } else if (strcmp(argv[i], "-solo") == 0) { checkArgc(i, argc, argv[i]); numRobotTanks = atoi(argv[i]); if (numRobotTanks < 1 || numRobotTanks > MAX_ROBOTS) { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } #endif } else if (strcmp(argv[i], "-team") == 0) { checkArgc(i, argc, argv[i]); if ((strcmp(argv[i], "a") == 0) || (strcmp(argv[i], "auto") == 0) || (strcmp(argv[i], "automatic") == 0)) { startupInfo.team = AutomaticTeam; } else if (strcmp(argv[i], "r") == 0 || strcmp(argv[i], "red") == 0) { startupInfo.team = RedTeam; } else if (strcmp(argv[i], "g") == 0 || strcmp(argv[i], "green") == 0) { startupInfo.team = GreenTeam; } else if (strcmp(argv[i], "b") == 0 || strcmp(argv[i], "blue") == 0) { startupInfo.team = BlueTeam; } else if (strcmp(argv[i], "p") == 0 || strcmp(argv[i], "purple") == 0) { startupInfo.team = PurpleTeam; } else if (strcmp(argv[i], "z") == 0 || strcmp(argv[i], "rogue") == 0) { startupInfo.team = RogueTeam; } else if (strcmp(argv[i], "o") == 0 || strcmp(argv[i], "observer") == 0) { startupInfo.team = ObserverTeam; } else { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } } else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "-version") == 0 || strcmp(argv[i], "--version") == 0) { printFatalError("BZFlag client %s (protocol %s) http://BZFlag.org/\n%s", getAppVersion(), getProtocolVersion(), bzfcopyright); bail(0); exit(0); } else if (strcmp(argv[i], "-window") == 0) { BZDB.set("_window", "1"); checkArgc(i, argc, argv[i]); int w, h, x, y, count; char xs ='+', ys='+'; if (strcmp(argv[i], "default") != 0 && (((count = sscanf(argv[i], "%dx%d%c%d%c%d", &w, &h, &xs, &x, &ys, &y)) != 6 && count != 2) || (xs != '-' && xs != '+') || (ys != '-' && ys != '+'))) { printFatalError("Invalid argument for %s. \nCorrect format is x[+|-][+|-].", argv[i-1]); usage(); } BZDB.set("geometry", argv[i]); #ifdef DEBUG } else if (strcmp(argv[i], "-date") == 0) { checkArgc(i, argc, argv[i]); int month, day, year; // FIXME: should use iso yyyy.mm.dd format if (sscanf(argv[i], "%d/%d/%d", &month, &day, &year) != 3 || day < 1 || day > 31 || // FIXME -- upper limit loose month < 1 || month > 12 || (year < 0 || (year > 100 && (year < 1970 || year > 2100)))) { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } if (year > 100) year = year - 1900; else if (year < 70) year += 100; userTime.tm_mday = day; userTime.tm_mon = month - 1; userTime.tm_year = year; #endif } else if (strcmp(argv[i], "-time") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("fixedTime", argv[i]); } else if (strcmp(argv[i], "-notime") == 0) { BZDB.unset("fixedTime"); } else if (strcmp(argv[i], "-view") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("view", argv[i]); } else if (strcmp(argv[i], "-zbuffer") == 0) { checkArgc(i, argc, argv[i]); if (strcmp(argv[i], "on") == 0) { BZDB.set("zbuffer", "1"); } else if (strcmp(argv[i], "off") == 0) { BZDB.set("zbuffer", "disable"); } else { printFatalError("Invalid argument for %s.", argv[i-1]); usage(); } } else if (strcmp(argv[i], "-eyesep") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("eyesep", argv[i]); } else if (strcmp(argv[i], "-focal") == 0) { checkArgc(i, argc, argv[i]); BZDB.set("focal", argv[i]); } else if (strncmp(argv[i], "-psn", 4) == 0) { std::vector args; args.push_back(argv[i]); printError("Ignoring Finder argument \"{1}\"", &args); // ignore process serial number argument (-psn_x_xxxx for MacOS X } else if (strcmp(argv[i], "-badwords") == 0) { checkArgc(i, argc, argv[i], "Missing bad word filter file"); BZDB.set("filterFilename", argv[i], StateDatabase::ReadOnly); } else if (argv[i][0] != '-') { if (i == (argc - 1)) { // find the beginning of the server name, parse the callsign char *serverName = strchr(argv[i], '@'); if (serverName == NULL) { serverName = argv[i]; } else { *serverName++ = '\0'; char *password = strchr(startupInfo.callsign, ':'); if (password != NULL) { *password++ = '\0'; if (strlen(password) >= sizeof(startupInfo.password)) { printFatalError("Password truncated."); } // Flawfinder: ignore strncpy(startupInfo.password, password, sizeof(startupInfo.password) - 1); startupInfo.password[sizeof(startupInfo.password) - 1] = '\0'; } // Flawfinder: ignore if (strlen(argv[i]) >= sizeof(startupInfo.callsign)) { printFatalError("Callsign truncated."); } // Flawfinder: ignore strncpy(startupInfo.callsign, argv[i], sizeof(startupInfo.callsign) - 1); startupInfo.callsign[sizeof(startupInfo.callsign) - 1] = '\0'; } // find the beginning of the port number, parse it char *portNumber = strchr(serverName, ':'); if (portNumber == NULL) { startupInfo.serverPort = ServerPort; // use the default } else { *portNumber++ = '\0'; startupInfo.serverPort = atoi(portNumber); if (startupInfo.serverPort < 1 || startupInfo.serverPort > 65535) { startupInfo.serverPort = ServerPort; printFatalError("Bad port, using default %d.", startupInfo.serverPort); } } if (strlen(serverName) >= sizeof(startupInfo.serverName)) { printFatalError("Server name too long. Ignoring."); } else { // Flawfinder: ignore strncpy(startupInfo.serverName, serverName, sizeof(startupInfo.serverName) - 1); startupInfo.serverName[sizeof(startupInfo.serverName) - 1] = '\0'; startupInfo.autoConnect = true; } } else { printFatalError("Unexpected: %s. Server must go after all options.", argv[i]); } } else if (strcmp(argv[i], "-debug") == 0) { debugLevel++; } // has to be the last option that starts with -d else if (strncmp(argv[i], "-d", 2) == 0) { const char num = argv[i][2]; if ((num >= '0') && (num <= '9') && (argv[i][3] == 0)) { debugLevel = num - '0'; } else { const char* c = argv[i] + 2; while (*c != 0) { if (*c != 'd') { printFatalError("Unknown option %s.", argv[i]); usage(); } c++; } debugLevel += (int)((c - argv[i]) - 1); } } else { printFatalError("Unknown option %s.", argv[i]); usage(); } } } static void parseConfigName(int argc, char** argv) { for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-configdir") == 0) { checkArgc(i, argc, argv[i]); setCustomConfigDir(argv[i]); alternateConfig += argv[i]; } } for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-config") == 0) { checkArgc(i, argc, argv[i]); alternateConfig = getConfigDirName(); alternateConfig += argv[i]; } } } // // resource database dumping. used during initial startup to save // preferences in case anything catastrophic goes wrong afterwards // (so user won't have to wait through performance testing again). // void dumpResources() { // collect new configuration // only dump username and password if we're allowed to, otherwise // erase them if they exist if (BZDB.eval("saveIdentity") > 0) BZDB.set("callsign", startupInfo.callsign); else BZDB.set("callsign", ""); if (BZDB.eval("saveIdentity") > 1) BZDB.set("password", startupInfo.password); else BZDB.set("password", ""); BZDB.set("team", Team::getName(startupInfo.team)); BZDB.set("server", startupInfo.serverName); if (startupInfo.serverPort != ServerPort) { BZDB.set("port", TextUtils::format("%d", startupInfo.serverPort)); } else { BZDB.unset("port"); } BZDB.set("list", startupInfo.listServerURL); if (isSoundOpen()) { BZDB.set("volume", TextUtils::format("%d", getSoundVolume())); } if (RENDERER.getWindow().getWindow()->hasGammaControl()) { BZDB.set("gamma", TextUtils::format("%f", RENDERER.getWindow().getWindow()->getGamma())); } BZDB.set("quality", configQualityValues[RENDERER.useQuality()]); if (!BZDB.isSet("_window") && display->getResolution() != -1 && display->getResolution(display->getResolution())) { BZDB.set("resolution", display->getResolution(display->getResolution())->name); } BZDB.set("startcode", ServerStartMenu::getSettings()); BZDB.set("panelopacity", TextUtils::format("%f", RENDERER.getPanelOpacity())); BZDB.set("radaropacity", TextUtils::format("%f", RENDERER.getRadarOpacity())); BZDB.set("radarsize", TextUtils::format("%d", RENDERER.getRadarSize())); BZDB.set("mouseboxsize", TextUtils::format("%d", RENDERER.getMaxMotionFactor())); // don't save these configurations BZDB.setPersistent("_window", false); BZDB.setPersistent("_multisample", false); const std::vector list = getSilenceList(); // add entries silencedPerson0 silencedPerson1 etc.. // to the database. Stores silenceList // By only allowing up to a certain # of people can prevent // the vague chance of buffer overrun. const int bufferLength = 30; int maxListSize = 1000000; //do even that many play bzflag? char buffer [bufferLength]; if ((int)list.size() < maxListSize) maxListSize = list.size(); for (int i = 0; i < maxListSize; i++) { sprintf(buffer, "silencedPerson%d", i); BZDB.set(TextUtils::format("silencedPerson%d", i), list[i]); } BZDB.set("motto", startupInfo.motto); BZDB.set("serverCacheAge", TextUtils::format("%1d", (long)(ServerListCache::get())->getMaxCacheAge())); (ServerListCache::get())->saveCache(); } static bool needsFullscreen() { // fullscreen if not in a window if (!BZDB.isSet("_window")) return true; // not fullscreen if view is default (normal) if (!BZDB.isSet("view")) return false; // fullscreen if view is not default std::string value = BZDB.get("view"); for (int i = 1; i < (int)configViewValues.size(); i++) if (value == configViewValues[i]) return true; // bogus view, default to normal so no fullscreen return false; } static void createCacheSignature () { // This file is to be used by archiving and mirroring tools avoid // this directory (and any of its sub-directories). Please see: // < http://www.brynosaurus.com/cachedir/ > const char cacheSignature[] = "Signature: 8a477f597d28d172789f06886806bc55\n"; const char cacheComment[] = "# This file is a cache directory tag created by BZFlag.\n" "# For information about cache directory tags, see:\n" "# http://www.brynosaurus.com/cachedir/\n"; std::string cacheTagName = getCacheDirName(); cacheTagName += "CACHEDIR.TAG"; std::ostream* cacheTag = FILEMGR.createDataOutStream(cacheTagName, true, true); if (cacheTag != NULL) { cacheTag->write(cacheSignature, strlen(cacheSignature)); // Flawfinder: ignore cacheTag->write(cacheComment, strlen(cacheComment)); // Flawfinder: ignore } delete cacheTag; return; } // // main() // initialize application and enter event loop // #if defined(_WIN32) && !defined(HAVE_SDL) int myMain(int argc, char** argv) #else /* defined(_WIN32) */ int main(int argc, char** argv) #endif /* defined(_WIN32) */ { #ifdef _WIN32 // startup winsock static const int major = 2, minor = 2; WSADATA wsaData; if (WSAStartup(MAKEWORD(major, minor), &wsaData)) { printFatalError("Failed to initialize winsock. Terminating.\n"); return 1; } if (LOBYTE(wsaData.wVersion) != major || HIBYTE(wsaData.wVersion) != minor) { printFatalError("Version mismatch in winsock;" " got %d.%d, expected %d.%d. Terminating.\n", (int)LOBYTE(wsaData.wVersion), (int)HIBYTE(wsaData.wVersion), major, minor); return bail(1); } #endif initGlobalAres(); WordFilter *filter = (WordFilter *)NULL; argv0 = argv[0]; // init libs //init_packetcompression(); // check time bomb if (timeBombBoom()) { printFatalError("This release expired on %s. \n" "Please upgrade to the latest release. \n" "Exiting.", timeBombString()); bail(0); exit(0); } #if defined(_WIN32) { /* write HKEY_CURRENT_USER\Software\BZFlag\CurrentRunningPath with the * current path. this lets Xfire know that this bzflag.exe running from * here really is bzflag, not some imposter. * since it may be useful to someone else, it's not protected by USE_XFIRE */ // get our path char temppath[MAX_PATH], temppath2[MAX_PATH]; char tempdrive[10]; GetModuleFileName(NULL, temppath, MAX_PATH); // strip filename/extension _splitpath(temppath, tempdrive, temppath2, NULL, NULL); _makepath(temppath, tempdrive, temppath2, NULL, NULL); // write the registry key in question HKEY key = NULL; if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\BZFlag", 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) == ERROR_SUCCESS) { RegSetValueEx(key, "CurrentRunningPath", 0, REG_SZ, (LPBYTE)temppath, (DWORD)strlen(temppath)); } } #endif createCacheSignature(); // initialize global objects and classes bzfsrand((unsigned int)time(0)); // set default DB entries for (unsigned int gi = 0; gi < numGlobalDBItems; ++gi) { assert(globalDBItems[gi].name != NULL); if (globalDBItems[gi].value != NULL) { BZDB.set(globalDBItems[gi].name, globalDBItems[gi].value); BZDB.setDefault(globalDBItems[gi].name, globalDBItems[gi].value); } BZDB.setPersistent(globalDBItems[gi].name, globalDBItems[gi].persistent); BZDB.setPermission(globalDBItems[gi].name, globalDBItems[gi].permission); } BZDBCache::init(); BZDBLOCAL.init(); Flags::init(); if (getenv("BZFLAGID")) { BZDB.set("callsign", getenv("BZFLAGID")); strncpy(startupInfo.callsign, getenv("BZFLAGID"), sizeof(startupInfo.callsign) - 1); startupInfo.callsign[sizeof(startupInfo.callsign) - 1] = '\0'; } else if (getenv("BZID")) { BZDB.set("callsign", getenv("BZID")); // Flawfinder: ignore strncpy(startupInfo.callsign, getenv("BZID"), sizeof(startupInfo.callsign) - 1); startupInfo.callsign[sizeof(startupInfo.callsign) - 1] = '\0'; } time_t timeNow; time(&timeNow); userTime = *localtime(&timeNow); CommandsStandard::add(); unsigned int i; initConfigData(); loadBZDBDefaults(); // parse for the config filename // the rest of the options are parsed after the config file // has been loaded to allow for command line overrides parseConfigName(argc, argv); // read resources if (alternateConfig != "") { if (CFGMGR.read(alternateConfig)) { startupInfo.hasConfiguration = true; } } if (!startupInfo.hasConfiguration) { findConfigFile(); if (CFGMGR.read(getCurrentConfigFileName())) { startupInfo.hasConfiguration = true; updateConfigFile(); } } if (startupInfo.hasConfiguration) ActionBinding::instance().getFromBindings(); else // bind default keys ActionBinding::instance().resetBindings(); ServerListCache::get()->loadCache(); // restore some configuration (command line overrides these) if (startupInfo.hasConfiguration) { if (BZDB.isSet("callsign")) { // Flawfinder: ignore strncpy(startupInfo.callsign, BZDB.get("callsign").c_str(), sizeof(startupInfo.callsign) - 1); startupInfo.callsign[sizeof(startupInfo.callsign) - 1] = '\0'; } if (BZDB.isSet("password")) { // Flawfinder: ignore strncpy(startupInfo.password, BZDB.get("password").c_str(), sizeof(startupInfo.password) - 1); startupInfo.password[sizeof(startupInfo.password) - 1] = '\0'; } if (BZDB.isSet("team")) { std::string value = BZDB.get("team"); startupInfo.team = Team::getTeam(value); } if (BZDB.isSet("server")) { // Flawfinder: ignore strncpy(startupInfo.serverName, BZDB.get("server").c_str(), sizeof(startupInfo.serverName) - 1); startupInfo.serverName[sizeof(startupInfo.serverName) - 1] = '\0'; } if (BZDB.isSet("port")) { startupInfo.serverPort = atoi(BZDB.get("port").c_str()); } // check for reassigned team colors if (BZDB.isSet("roguecolor")) setTeamColor(RogueTeam, BZDB.get("roguecolor")); if (BZDB.isSet("redcolor")) setTeamColor(RedTeam, BZDB.get("redcolor")); if (BZDB.isSet("greencolor")) setTeamColor(GreenTeam, BZDB.get("greencolor")); if (BZDB.isSet("bluecolor")) setTeamColor(BlueTeam, BZDB.get("bluecolor")); if (BZDB.isSet("purplecolor")) setTeamColor(PurpleTeam, BZDB.get("purplecolor")); // check for reassigned radar colors if (BZDB.isSet("rogueradar")) setRadarColor(RogueTeam, BZDB.get("rogueradar")); if (BZDB.isSet("redradar")) setRadarColor(RedTeam, BZDB.get("redradar")); if (BZDB.isSet("greenradar")) setRadarColor(GreenTeam, BZDB.get("greenradar")); if (BZDB.isSet("blueradar")) setRadarColor(BlueTeam, BZDB.get("blueradar")); if (BZDB.isSet("purpleradar")) setRadarColor(PurpleTeam, BZDB.get("purpleradar")); // ignore window name in config file (it's used internally) BZDB.unset("_window"); BZDB.unset("_multisample"); // however, if the "__window" setting is enabled, let it through if (BZDB.isSet("__window")) if (BZDB.isTrue("__window")) BZDB.set("_window", "1"); } // use UDP? yes startupInfo.useUDPconnection=true; // parse arguments parse(argc, argv); #ifdef _WIN32 // this is cheap but it will work on windows // clear out the stdout file if (echoToConsole){ FILE *fp = fopen ("stdout.txt","w"); if (fp) { fprintf(fp,"stdout started\r\n" ); fclose(fp); } } #endif if (BZDB.isSet("directory")) { //Convert to unix paths so that escaping isn't an issue std::string directory = BZDB.get("directory"); OSFileOSToStdDir(directory); BZDB.set("directory", directory); } if (debugLevel >= 4) BZDB.setDebug(true); // set time from BZDB if (BZDB.isSet("fixedTime")) { int hours, minutes, seconds; char dbTime[256]; // Flawfinder: ignore strncpy(dbTime, BZDB.get("fixedTime").c_str(), sizeof(dbTime) - 1); dbTime[sizeof(dbTime) - 1] = '\0'; if (sscanf(dbTime, "%d:%d:%d", &hours, &minutes, &seconds) != 3 || hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) { printFatalError("Invalid argument for fixedTime = %s", dbTime); } userTime.tm_sec = seconds; userTime.tm_min = minutes; userTime.tm_hour = hours; } // see if there is a _default_ badwords file if (!BZDB.isSet("filterFilename")) { std::string name; name = getConfigDirName(); name += "badwords.txt"; // get a handle on a filter object to attempt a load if (BZDB.isSet("filter")) { filter = (WordFilter *)BZDB.getPointer("filter"); if (filter == NULL) { filter = new WordFilter(); } } else { // filter is not set filter = new WordFilter(); } // XXX should stat the file first and load with interactive feedback unsigned int count = filter->loadFromFile(name, false); if (count > 0) { std::cout << "Loaded " << count << " words from \"" << name << "\"" << std::endl; } } // load the bad word filter, regardless of a default, if it was set if (BZDB.isSet("filterFilename")) { std::string filterFilename = BZDB.get("filterFilename"); std::cout << "Filter file name specified is \"" << filterFilename << "\"" << std::endl; if (filterFilename.length() != 0) { if (filter == NULL) { filter = new WordFilter(); } std::cout << "Loading " << filterFilename << std::endl; unsigned int count = filter->loadFromFile(filterFilename, true); std::cout << "Loaded " << count << " words" << std::endl; // stash the filter into the database for retrieval later BZDB.setPointer("filter", (void *)filter, StateDatabase::ReadOnly ); BZDB.setPersistent("filter", false); } else { std::cerr << "WARNING: A proper file name was not given for the -badwords argument" << std::endl; } } // use empty motto string unless previously set std::string motto = BZDB.get("motto"); motto = motto.substr(0, sizeof(startupInfo.motto) - 1); //Flawfinder: ignore strcpy(startupInfo.motto, motto.c_str()); // make platform factory PlatformFactory* platformFactory = PlatformFactory::getInstance(); // open display display = platformFactory->createDisplay(NULL, NULL); if (!display) { printFatalError("Can't open display. Exiting."); return bail(1); } // choose visual BzfVisual* visual = platformFactory->createVisual(display); setVisual(visual); // make the window BzfWindow* window = platformFactory->createWindow(display, visual); if (!window->isValid()) { printFatalError("Can't create window. Exiting."); return bail(1); } window->setTitle("bzflag"); // create & initialize the joystick BzfJoystick* joystick = platformFactory->createJoystick(); joystick->initJoystick(BZDB.get("joystickname").c_str()); joystick->setXAxis(BZDB.get("jsXAxis")); joystick->setYAxis(BZDB.get("jsYAxis")); // Change audio driver if requested if (BZDB.isSet("audioDriver")) PlatformFactory::getMedia()->setDriver(BZDB.get("audioDriver")); // Change audio device if requested if (BZDB.isSet("audioDevice")) PlatformFactory::getMedia()->setDevice(BZDB.get("audioDevice")); // set data directory if user specified if (BZDB.isSet("directory")) { /* already specified, so just set/use it */ PlatformFactory::getMedia()->setMediaDirectory(BZDB.get("directory")); } else { #if (defined(_WIN32) || defined(WIN32)) char exePath[MAX_PATH]; char dataPath[MAX_PATH]; GetModuleFileName(NULL,exePath,MAX_PATH); char* last = strrchr(exePath,'\\'); if (last) *last = '\0'; strcpy(dataPath,exePath); char temp[MAX_PATH]; getcwd(temp,MAX_PATH); // find the data dir strcat(dataPath,"\\data"); if (chdir(dataPath) != 0) { strcpy(dataPath,exePath); char* last = strrchr(dataPath,'\\'); if (last) *last = '\0'; strcat(dataPath,"\\data"); } chdir(temp); BzfMedia *media = PlatformFactory::getMedia(); if (media) media->setMediaDirectory(dataPath); FileManager::instance().setDataPath(std::string(dataPath)); #else // It's only checking existence of l10n directory std::string mediadir = DEFAULT_MEDIA_DIR; mediadir += "/l10n"; DIR *localedir = opendir(mediadir.c_str()); if (localedir != NULL) { /* found 'data' dir */ BzfMedia *media = PlatformFactory::getMedia(); if (media) media->setMediaDirectory(DEFAULT_MEDIA_DIR); closedir(localedir); } else { /* bah, just set the compile-time path */ PlatformFactory::getMedia()->setMediaDirectory(INSTALL_DATA_DIR); } #endif } // initialize font system FontManager &fm = FontManager::instance(); // load fonts from data directory fm.loadAll(PlatformFactory::getMedia()->getMediaDirectory() + "/fonts"); // try to get a font - only returns -1 if there are no fonts at all if (fm.getFaceID(BZDB.get("consoleFont")) < 0) { printFatalError("No fonts found (the -directory option may help). Exiting"); return bail(1); } // initialize locale system BundleMgr *bm = new BundleMgr(PlatformFactory::getMedia()->getMediaDirectory(), "bzflag"); World::setBundleMgr(bm); std::string locale = BZDB.isSet("locale") ? BZDB.get("locale") : "default"; World::setLocale(locale); bm->getBundle(World::getLocale()); bool setPosition = false, setSize = false; int x = 0, y = 0, w = 0, h = 0; // set window size (we do it here because the OpenGL context isn't yet bound) if (BZDB.isSet("geometry")) { char xs, ys; const std::string geometry = BZDB.get("geometry"); const int count = sscanf(geometry.c_str(), "%dx%d%c%d%c%d", &w, &h, &xs, &x, &ys, &y); if (geometry == "default" || (count != 6 && count != 2) || w < 0 || h < 0) { BZDB.unset("geometry"); } else if (count == 6 && ((xs != '-' && xs != '+') || (ys != '-' && ys != '+'))) { BZDB.unset("geometry"); } else { setSize = true; if (w < 256) w = 256; if (h < 192) h = 192; if (count == 6) { if (xs == '-') x = display->getWidth() - x - w; if (ys == '-') y = display->getHeight() - y - h; setPosition = true; } // must call this before setFullscreen() is called display->setPassthroughSize(w, h); } } // set window size (we do it here because the OpenGL context isn't yet // bound.) const bool useFullscreen = needsFullscreen(); if (useFullscreen) { #ifndef HAVE_SDL // tell window to be fullscreen window->setFullscreen(true); #endif // set the size if one was requested. this overrides the default // size (which is the display or passthrough size). if (setSize) window->setSize(w, h); } else if (setSize) { window->setSize(w, h); } else { window->setSize(640, 480); } if (setPosition) window->setPosition(x, y); // now make the main window wrapper. this'll cause the OpenGL context // to be bound for the first time. MainWindow* pmainWindow = new MainWindow(window, joystick); if (pmainWindow->isInFault()) { printFatalError("Error creating window - Exiting"); return bail(1); } std::string videoFormat; int format = -1; if (BZDB.isSet("resolution")) { videoFormat = BZDB.get("resolution"); if (videoFormat.length() != 0) { format = display->findResolution(videoFormat.c_str()); if (format >= 0) { display->setFullScreenFormat(format); } } }; // set fullscreen again so MainWindow object knows it's full screen if (useFullscreen) // this will also call window create pmainWindow->setFullscreen(); else window->create(); // get sound files. must do this after creating the window because // DirectSound is a bonehead API. if (!noAudio) { openSound("bzflag"); if (startupInfo.hasConfiguration && BZDB.isSet("volume")) setSoundVolume(static_cast(BZDB.eval("volume"))); } // set main window's minimum size (arbitrary but should be big enough // to see stuff in control panel) pmainWindow->setMinSize(256, 192); // initialize graphics state pmainWindow->getWindow()->makeCurrent(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0); glClearStencil(0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_SCISSOR_TEST); // glEnable(GL_CULL_FACE); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); if (!OpenGLGState::haveGLContext()) { // DIE printFatalError("ERROR: Unable to initialize an OpenGL context"); if (display != NULL) { delete display; display=NULL; } bail(1); exit(1); } OpenGLGState::init(); // sanity check - make sure OpenGL was actually initialized or // there's no sense in continuing. const char* const glRenderer = (const char*)glGetString(GL_RENDERER); if (!glRenderer) { // bad code, no doughnut for you GLenum error = GL_NO_ERROR; while ((error = glGetError()) != GL_NO_ERROR) { switch (error) { case GL_INVALID_ENUM: std::cerr << "ERROR: GL_INVALID_ENUM" << std::endl; break; case GL_INVALID_VALUE: std::cerr << "ERROR: GL_INVALID_VALUE" << std::endl; break; case GL_INVALID_OPERATION: std::cerr << "ERROR: GL_INVALID_OPERATION" << std::endl; break; case GL_STACK_OVERFLOW: std::cerr << "ERROR: GL_STACK_OVERFLOW" << std::endl; break; case GL_STACK_UNDERFLOW: std::cerr << "ERROR: GL_STACK_UNDERFLOW" << std::endl; break; case GL_OUT_OF_MEMORY: std::cerr << "ERROR: GL_OUT_OF_MEMORY" << std::endl; break; #ifdef GL_VERSION_1_2 case GL_TABLE_TOO_LARGE: std::cerr << "ERROR: GL_TABLE_TOO_LARGE" << std::endl; break; #endif case GL_NO_ERROR: // should not reach std::cerr << "ERROR: GL_NO_ERROR" << std::endl; break; default: // should not reach std::cerr << "ERROR: UNKNOWN CODE: " << error << std::endl; } } // DIE printFatalError("ERROR: Unable to initialize an OpenGL renderer"); if (display != NULL) { delete display; display=NULL; } bail(1); exit(1); } // add the zbuffer callback here, after the OpenGL context is initialized BZDB.addCallback("zbuffer", setDepthBuffer, NULL); //add a fake cursor. Let the defaults file override this, though. if (!BZDB.isSet("fakecursor")) { // check that the glrenderer is Mesa Glide if ((glRenderer != NULL) && (strncmp(glRenderer, "Mesa Glide", 10) == 0)){ BZDB.set("fakecursor", "1"); } } // set gamma if set in resources and we have gamma control if (BZDB.isSet("gamma")) { if (pmainWindow->getWindow()->hasGammaControl()) pmainWindow->getWindow()->setGamma ((float)atof(BZDB.get("gamma").c_str())); } // set the scene renderer's window RENDERER.setWindow(pmainWindow); // restore rendering configuration if (startupInfo.hasConfiguration) { if (BZDB.isSet("zbuffersplit")) { RENDERER.setZBufferSplit(BZDB.isTrue("zbuffersplit")); } if (BZDB.isSet("quality")) { std::string value = BZDB.get("quality"); const int qualityLevels = (int)configQualityValues.size(); for (int j = 0; j < qualityLevels; j++) { if (value == configQualityValues[j]) { RENDERER.setQuality(j); break; } } } TextureManager& tm = TextureManager::instance(); tm.setMaxFilter(BZDB.get("texture")); BZDB.set("texture", tm.getMaxFilterName()); BZDB.set("texturereplace", (!BZDBCache::lighting && RENDERER.useQuality() < 2) ? "1" : "0"); BZDB.setPersistent("texturereplace", false); if (BZDB.isSet("view")) { RENDERER.setViewType(SceneRenderer::Normal); std::string value = BZDB.get("view"); for (i = 0; i < configViewValues.size(); i++) if (value == configViewValues[i]) { RENDERER.setViewType((SceneRenderer::ViewType)i); break; } } if (BZDB.isSet("startcode")) ServerStartMenu::setSettings(BZDB.get("startcode").c_str()); if (BZDB.isSet("panelopacity")) RENDERER.setPanelOpacity(BZDB.eval("panelopacity")); if (BZDB.isSet("radaropacity")) RENDERER.setRadarOpacity(BZDB.eval("radaropacity")); if (BZDB.isSet("radarsize")) RENDERER.setRadarSize(BZDB.getIntClamped("radarsize", 0, GUIOptionsMenu::maxRadarSize)); if (BZDB.isSet("mouseboxsize")) RENDERER.setMaxMotionFactor(atoi(BZDB.get("mouseboxsize").c_str())); } // grab the mouse only if allowed if (BZDB.isSet("mousegrab") && !BZDB.isTrue("mousegrab")) { pmainWindow->setNoMouseGrab(); pmainWindow->enableGrabMouse(false); } else { pmainWindow->enableGrabMouse(true); } // set window quadrant if (RENDERER.getViewType() == SceneRenderer::ThreeChannel) pmainWindow->setQuadrant(MainWindow::UpperRight); else if (RENDERER.getViewType() == SceneRenderer::Stacked) pmainWindow->setQuadrant(MainWindow::LowerHalf); #ifndef USE_GL_STEREO else if (RENDERER.getViewType() == SceneRenderer::Stereo) pmainWindow->setQuadrant(MainWindow::UpperRight); #endif // clear the grid graphics if they are not accessible #if !defined(DEBUG_RENDERING) if (debugLevel <= 0) { BZDB.set("showCullingGrid", "0"); BZDB.set("showCollisionGrid", "0"); } #endif // set server list URL if (BZDB.isSet("list")) startupInfo.listServerURL = BZDB.get("list"); // setup silence list std::vector& list = getSilenceList(); // search for entries silencedPerson0 silencedPerson1 etc.. // to the database. Stores silenceList // By only allowing up to a certain # of people can prevent // the vague chance of buffer overrun. const int bufferLength = 30; const int maxListSize = 1000000; // do even that many play bzflag? char buffer [bufferLength]; bool keepGoing = true; for (int s = 0; keepGoing && (s < maxListSize); s++) { sprintf(buffer,"silencedPerson%d",s); // could do %-10d if (BZDB.isSet(buffer)) { list.push_back(BZDB.get(buffer)); // remove the value from the database so when we save // it saves the list's new values in order BZDB.unset(buffer); } else { keepGoing = false; } } if (BZDB.isSet("serverCacheAge")) { (ServerListCache::get())->setMaxCacheAge(atoi(BZDB.get("serverCacheAge").c_str())); } // start playing startPlaying(display, RENDERER); // save resources if (BZDB.isTrue("saveSettings")) { dumpResources(); if (alternateConfig == "") { CFGMGR.write(getCurrentConfigFileName()); } else { CFGMGR.write(alternateConfig); } } // shut down killGlobalAres(); AresHandler::globalShutdown(); if (filter != NULL) delete filter; filter = NULL; display->setDefaultResolution(); delete pmainWindow; delete joystick; delete window; delete visual; closeSound(); delete display; delete platformFactory; delete bm; Flags::kill(); #if defined(_WIN32) { /* clear HKEY_CURRENT_USER\Software\BZFlag\CurrentRunningPath if it * exists */ HKEY key = NULL; if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\BZFlag", 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) { RegSetValueEx(key, "CurrentRunningPath", 0, REG_SZ, (LPBYTE)"\0", 1); } } #endif #ifdef _WIN32 // clean up WSACleanup(); #endif // clean up singletons // delete FILEMGR; // delete CMDMGR; // delete BZDB; return 0; } // #if defined(_WIN32) && !defined(HAVE_SDL) // // WinMain() // windows entry point. forward to main() // int WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPSTR _cmdLine, int) { // convert command line to argc and argv. note that it's too late // to do this right because spaces that were embedded in a single // argument now look like like normal spaces. not much we can do // about that. // FIXME -- argc and argv can be accessible; use them instead of this. char* cmdLine = strdup(_cmdLine); // count number of arguments int argc = 1; char* scan = cmdLine; while (isspace(*scan) && *scan != 0) scan++; while (*scan) { argc++; while (!isspace(*scan) && *scan != 0) scan++; while (isspace(*scan) && *scan != 0) scan++; } // get path to application. this is ridiculously simple. char appName[MAX_PATH]; GetModuleFileName(instance,appName,MAX_PATH); // make argument list and assign arguments char** argv = new char*[argc]; argc = 0; argv[argc++] = appName; scan = cmdLine; while (isspace(*scan) && *scan != 0) scan++; while (*scan) { argv[argc++] = scan; while (!isspace(*scan) && *scan != 0) scan++; if (*scan) *scan++ = 0; while (isspace(*scan) && *scan != 0) scan++; } const int exitCode = myMain(argc, argv); // clean up and return exit code delete[] argv; free(cmdLine); return exitCode; } #endif /* defined(_WIN32) */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/bzflag.h000066400000000000000000000016571200563112200171220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_BZFLAG_H #define BZF_BZFLAG_H #include "common.h" // system includes #include extern void dumpResources(); extern bool echoToConsole; extern bool echoAnsi; extern std::string alternateConfig; extern const char *argv0; extern struct tm userTime; #ifdef ROBOT extern int numRobotTanks; #endif #endif // BZF_BZFLAG_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/callbacks.cxx000066400000000000000000000026641200563112200201460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "callbacks.h" /* local headers */ #include "LocalPlayer.h" #include "HUDRenderer.h" #include "playing.h" void setFlagHelp(const std::string& name, void*) { if (LocalPlayer::getMyTank() == NULL) return; static const float FlagHelpDuration = 60.0f; if (BZDB.isTrue(name)) hud->setFlagHelp(LocalPlayer::getMyTank()->getFlag(), FlagHelpDuration); else hud->setFlagHelp(Flags::Null, 0.0); } void setDepthBuffer(const std::string& name, void*) { /* if zbuffer was set and not available, unset it */ if (BZDB.isTrue(name)) { GLint value; glGetIntegerv(GL_DEPTH_BITS, &value); if (value == 0) { // temporarily remove ourself BZDB.removeCallback(name, setDepthBuffer, NULL); BZDB.set(name, "0"); // add it again BZDB.addCallback(name, setDepthBuffer, NULL); } } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/callbacks.h000066400000000000000000000014131200563112200175620ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // common - 1st #include "common.h" // system headers #include void setFlagHelp(const std::string& name, void*); void setDepthBuffer(const std::string& name, void*); // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/clientCommands.cxx000066400000000000000000000702561200563112200211710ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "commands.h" /* system implementation headers */ #ifndef _WIN32 # include # include #endif #include #include /* common implementation headers */ #include "BZDBCache.h" #include "TextUtils.h" #include "FileManager.h" #include "DirectoryNames.h" #include "version.h" #include "SceneRenderer.h" #include "bzglob.h" #include "BzPNG.h" /* local implementation headers */ #include "LocalPlayer.h" #include "sound.h" #include "ComposeDefaultKey.h" #include "SilenceDefaultKey.h" #include "ServerCommandKey.h" #include "Roaming.h" #include "playing.h" #include "HUDRenderer.h" #include "HUDui.h" /** jump */ static std::string cmdJump(const std::string&, const CommandManager::ArgList& args, bool*); /** fire weapon */ static std::string cmdFire(const std::string&, const CommandManager::ArgList& args, bool*); /** drop a flag */ static std::string cmdDrop(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle radar visibility */ static std::string cmdToggleRadar(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle console visibility */ static std::string cmdToggleConsole(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle flags */ static std::string cmdToggleFlags(const std::string&, const CommandManager::ArgList& args, bool*); /** identify to a server */ static std::string cmdIdentify(const std::string&, const CommandManager::ArgList& args, bool*); /** restart/respawn */ static std::string cmdRestart(const std::string&, const CommandManager::ArgList& args, bool*); /** self-destruct */ static std::string cmdDestruct(const std::string&, const CommandManager::ArgList& args, bool*); /** pause */ static std::string cmdPause(const std::string&, const CommandManager::ArgList& args, bool*); /** select tabbed message */ static std::string cmdMessagePanel(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle auto-pilot */ static std::string cmdAutoPilot(const std::string&, const CommandManager::ArgList& args, bool*); /** change radar scale */ static std::string cmdRadarZoom(const std::string&, const CommandManager::ArgList& args, bool*); /** change view angle */ static std::string cmdViewZoom(const std::string&, const CommandManager::ArgList& args, bool*); /** send */ static std::string cmdSend(const std::string&, const CommandManager::ArgList& args, bool*); /** capture a screenshot */ static std::string cmdScreenshot(const std::string&, const CommandManager::ArgList& args, bool*); /** time */ static std::string cmdTime(const std::string&, const CommandManager::ArgList& args, bool*); /** roam */ static std::string cmdRoam(const std::string&, const CommandManager::ArgList& args, bool*); /** silence another player */ static std::string cmdSilence(const std::string&, const CommandManager::ArgList& args, bool*); /** perform a server command */ static std::string cmdServerCommand(const std::string&, const CommandManager::ArgList& args, bool*); /** scroll the chat panel */ static std::string cmdScrollPanel(const std::string&, const CommandManager::ArgList& args, bool*); /** hunt a player */ static std::string cmdHunt(const std::string&, const CommandManager::ArgList& args, bool*); /** hunt another player */ static std::string cmdAddHunt(const std::string&, const CommandManager::ArgList& args, bool*); /** iconify window */ static std::string cmdIconify(const std::string&, const CommandManager::ArgList& args, bool*); /** mouse box size flags */ static std::string cmdMouseBox(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle mouse capture */ static std::string cmdMouseGrab(const std::string&, const CommandManager::ArgList& args, bool*); /** toggle Full Screen */ static std::string cmdToggleFS(const std::string&, const CommandManager::ArgList& args, bool*); const struct CommandListItem commandList[] = { { "fire", &cmdFire, "fire: fire a shot" }, { "jump", &cmdJump, "jump: make player jump" }, { "drop", &cmdDrop, "drop: drop the current flag" }, { "identify", &cmdIdentify, "identify: identify/lock-on-to player in view" }, { "restart", &cmdRestart, "restart: restart playing" }, { "destruct", &cmdDestruct, "destruct: self destruct" }, { "pause", &cmdPause, "pause: pause/resume" }, { "send", &cmdSend, "send {all|team|nemesis|recipient|admin}: start composing a message" }, { "screenshot", &cmdScreenshot, "screenshot: take a screenshot" }, { "time", &cmdTime, "time {forward|backward}: adjust the current time" }, { "roam", &cmdRoam, "roam {zoom|cycle} : roam around" }, { "silence", &cmdSilence, "silence: silence/unsilence a player" }, { "servercommand", &cmdServerCommand, "servercommand: quick admin" }, { "scrollpanel", &cmdScrollPanel, "scrollpanel {up|down}: scroll message panel" }, { "hunt", &cmdHunt, "hunt: hunt a specific player" }, { "addhunt", &cmdAddHunt, "addhunt: add/modify hunted player(s)" }, { "iconify", &cmdIconify, "iconify: iconify & pause bzflag" }, { "mousebox", &cmdMouseBox, "mousebox : change the mousebox size"}, { "mousegrab", &cmdMouseGrab, "mousegrab: toggle exclusive mouse mode" }, { "fullscreen", &cmdToggleFS, "fullscreen: toggle fullscreen mode" }, { "autopilot",&cmdAutoPilot, "autopilot: set/unset autopilot bot code" }, { "radarZoom", &cmdRadarZoom, "radarZoom {in/out}: change maxRadar range"}, { "viewZoom", &cmdViewZoom, "viewZoom {in/out/toggle}: change view angle"}, { "messagepanel", &cmdMessagePanel, "messagepanel {all|chat|server|misc}: set message tab" }, { "toggleRadar", &cmdToggleRadar, "toggleRadar: toggle radar visibility"}, { "toggleConsole", &cmdToggleConsole, "toggleConsole: toggle console visibility"}, { "toggleFlags", &cmdToggleFlags, "toggleFlags {main|radar}: turn off/on field radar flags"} }; static std::string cmdToggleFS(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: fullscreen"; mainWindow->toggleFullscreen(); mainWindow->getWindow()->callResizeCallbacks(); return std::string(); } static std::string cmdMouseBox(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 1) { return "usage: mousebox "; } const char* start = args[0].c_str(); char* end; const int value = (int) strtol(args[0].c_str(), &end, 10); if (start == end) { return "bad number"; } RENDERER.setMaxMotionFactor(value); return std::string(); } static std::string cmdMouseGrab(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: mousegrab"; const bool grabbing = !(BZDB.isTrue("mousegrab")); BZDB.set("mousegrab", grabbing ? "true" : "false"); mainWindow->enableGrabMouse(grabbing); return std::string(); } static std::string cmdIconify(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: iconify"; if (!BZDB.isTrue("Win32NoMin")) mainWindow->iconify(); return std::string(); } static std::string cmdJump(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: jump"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank != NULL) myTank->setJump(); return std::string(); } static std::string cmdToggleFlags(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 1) return "usage: main|radar"; if (args[0] == "main") { CMDMGR.run("toggle displayMainFlags"); warnAboutMainFlags(); } else if (args[0] == "radar") { CMDMGR.run("toggle displayRadarFlags"); warnAboutRadarFlags(); } else { return "usage: main|radar"; } return std::string(); } static std::string cmdToggleRadar(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) { return "usage: toggleRadar"; } CMDMGR.run("toggle displayRadar"); warnAboutRadar(); return std::string(); } static std::string cmdToggleConsole(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) { return "usage: toggleConsole"; } CMDMGR.run("toggle displayConsole"); warnAboutConsole(); return std::string(); } static std::string cmdFire(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: fire"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (fireButton && myTank != NULL && myTank->isAlive() && myTank->getTeam() != ObserverTeam) myTank->fireShot(); return std::string(); } static std::string cmdDrop(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: drop"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank != NULL) { FlagType* flag = myTank->getFlag(); if ((flag != Flags::Null) && !myTank->isPaused() && (flag->endurance != FlagSticky) && !myTank->isPhantomZoned() && !(flag == Flags::OscillationOverthruster && myTank->getLocation() == LocalPlayer::InBuilding)) { serverLink->sendDropFlag(myTank->getPosition()); // changed: on windows it may happen the MsgDropFlag // never comes back to us, so we drop it right away handleFlagDropped(myTank); } } return std::string(); } static std::string cmdIdentify(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: identify"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank != NULL) if (myTank->isAlive() && !myTank->isPaused()) setTarget(); return std::string(); } static std::string cmdRestart(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: restart"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank != NULL) if (!gameOver && !myTank->isSpawning() && (myTank->getTeam() != ObserverTeam) && !myTank->isAlive() && !myTank->isExploding()) { serverLink->sendAlive(); myTank->setSpawning(true); CommandManager::ArgList zoomArgs; std::string resetArg = "reset"; zoomArgs.push_back(resetArg); cmdViewZoom("", zoomArgs,NULL); } return std::string(); } static std::string cmdDestruct(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: destruct"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (myTank != NULL) { if (destructCountdown > 0.0f) { destructCountdown = 0.0f; hud->setAlert(1, "Self Destruct cancelled", 1.5f, true); } else { destructCountdown = 5.0f; char msgBuf[40]; sprintf(msgBuf, "Self Destructing in %d", (int)(destructCountdown + 0.99f)); hud->setAlert(1, msgBuf, 1.0f, false); } } return std::string(); } static std::string cmdPause(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: pause"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!pausedByUnmap && myTank && myTank->isAlive() && !myTank->isAutoPilot()) { if (myTank->isPaused()) { // already paused, so unpause myTank->setPause(false); controlPanel->addMessage("Resumed"); // restore the sound if (savedVolume != -1) { setSoundVolume(savedVolume); savedVolume = -1; } // grab mouse if (shouldGrabMouse()) mainWindow->grabMouse(); } else if (pauseCountdown > 0.0f) { // player aborted pause pauseCountdown = 0.0f; hud->setAlert(1, "Pause cancelled", 1.5f, true); } else if (myTank->getLocation() == LocalPlayer::InBuilding) { // custom message when trying to pause while in a building // (could get stuck on un-pause if flag is taken) hud->setAlert(1, "Can't pause while inside a building", 1.0f, false); } else if (myTank->getLocation() == LocalPlayer::InAir) { // custom message when trying to pause when jumping/falling hud->setAlert(1, "Can't pause when you are in the air", 1.0f, false); } else if (myTank->getLocation() != LocalPlayer::OnGround && myTank->getLocation() != LocalPlayer::OnBuilding) { // catch-all message when trying to pause when you should not hud->setAlert(1, "Unable to pause right now", 1.0f, false); } else { // update the pause alert message pauseCountdown = 5.0f; char msgBuf[40]; sprintf(msgBuf, "Pausing in %d", (int) (pauseCountdown + 0.99f)); hud->setAlert(1, msgBuf, 1.0f, false); } } return std::string(); } static std::string cmdAutoPilot(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: autopilot"; // don't enable autopilot until we've fully joined and checked the value // of the server-side _disableBots if (! BZDB.isSet(StateDatabase::BZDB_DISABLEBOTS)) return std::string(); LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!BZDB.isTrue(StateDatabase::BZDB_TANKWIDTH)) return std::string(); if ((myTank == NULL) || (myTank->getTeam() == ObserverTeam)) return std::string(); if (myTank->isAutoPilot()) { myTank->activateAutoPilot(false); hud->setAlert(0, "autopilot disabled", 1.0f, true); // grab mouse if (shouldGrabMouse()) mainWindow->grabMouse(); } else if (BZDB.isTrue(StateDatabase::BZDB_DISABLEBOTS)) { hud->setAlert(0, "autopilot not allowed on this server", 1.0f, true); } else { // don't enable the AutoPilot if you have within the last 5 secs static TimeKeeper LastAutoPilotEnable = TimeKeeper::getSunGenesisTime(); if ((TimeKeeper::getCurrent() - LastAutoPilotEnable) > 5) { // reset timer LastAutoPilotEnable = TimeKeeper::getCurrent(); // enable autopilot myTank->activateAutoPilot(); hud->setAlert(0, "autopilot enabled", 1.0f, true); // ungrab mouse mainWindow->ungrabMouse(); } else { controlPanel->addMessage("You may not enable the Autopilot more than once every five seconds."); } } return std::string(); } static std::string cmdRadarZoom(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 1) return "usage: radarZoom {in|out}"; float range = BZDB.eval("displayRadarRange"); if (args[0] == "out") { range *= 1.05f; if (range > 2.0f) range = 2.0f; BZDB.setFloat("displayRadarRange", range); } else if (args[0] == "in") { range /= 1.05f; if (range < 0.005f) range = 0.005f; BZDB.setFloat("displayRadarRange", range); } else { return "usage: radarZoom {in|out}"; } return std::string(); } static std::string cmdViewZoom(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 1) return "usage: viewZoom {in|out|toggle}"; float fov = BZDB.eval("displayFOV"); float defFov = BZDB.eval("defaultFOV"); if (args[0] == "out") { fov += 1.0f; if (fov > defFov) fov = defFov; BZDB.setFloat("displayFOV", fov); } else if (args[0] == "in") { fov -= 1.0f; if (fov < 15.0f) fov = 15.0f; BZDB.setFloat("displayFOV", fov); } else if (args[0] == "toggle") { if (fov < 15.5f) { fov = defFov; } else { fov = 15.0f; } BZDB.setFloat("displayFOV", fov); // also toggle the observer fov if (ROAM.getZoom() != defFov) { ROAM.setZoom(defFov); } else { ROAM.setZoom(15.0f); } } else if (args[0] == "reset") { fov = defFov; ROAM.setZoom(defFov); BZDB.setFloat("displayFOV", fov); } else { return "usage: viewZoom {in|out|toggle|reset}"; } return std::string(); } static std::string cmdMessagePanel(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 1) return "usage: messagepanel {all|chat|server|misc}"; int oldMode = controlPanel->getMessagesMode(); int newMode; if (args[0] == "all") newMode = 0; else if (args[0] == "chat") newMode = 1; else if (args[0] == "server") newMode = 2; else if (args[0] == "misc") newMode = 3; else return "usage: messagepanel {all|chat|server|misc}"; if (newMode == oldMode) newMode = -1; controlPanel->setMessagesMode(newMode); return std::string(); } static std::string cmdSend(const std::string&, const CommandManager::ArgList& args, bool*) { static ComposeDefaultKey composeKeyHandler; if (args.size() != 1) return "usage: send {all|team|nemesis|recipient|admin}"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!myTank) return "use send only when connected"; std::string composePrompt; if (args[0] == "all") { void* buf = messageMessage; buf = nboPackUByte(buf, AllPlayers); composePrompt = "Send to all: "; } else if (args[0] == "team") { if (World::getWorld()->allowTeams() || myTank->getTeam() == ObserverTeam) { void* buf = messageMessage; buf = nboPackUByte(buf, TeamToPlayerId(myTank->getTeam())); composePrompt = "Send to teammates: "; } else { void* buf = messageMessage; buf = nboPackUByte(buf, AllPlayers); composePrompt = "Send to all: "; } } else if (args[0] == "nemesis") { const Player* nemesis = myTank->getNemesis(); if (!nemesis) return std::string(); void* buf = messageMessage; buf = nboPackUByte(buf, nemesis->getId()); composePrompt = "Send to "; composePrompt += nemesis->getCallSign(); composePrompt += ": "; } else if (args[0] == "recipient") { const Player* recipient = myTank->getRecipient(); if (!recipient) { for (int i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) { myTank->setRecipient(remotePlayers[i]); break; } } } recipient = myTank->getRecipient(); if (recipient) { void* buf = messageMessage; buf = nboPackUByte(buf, recipient->getId()); composePrompt = "Send to "; composePrompt += recipient->getCallSign(); composePrompt += ": "; } } else if (args[0] == "admin") { void* buf = messageMessage; buf = nboPackUByte(buf, AdminPlayers); composePrompt = "Send to Admin : "; } else { return "usage: send {all|team|nemesis|recipient|admin}"; } messageHistoryIndex = 0; hud->setComposing(composePrompt); HUDui::setDefaultKey(&composeKeyHandler); return std::string(); } struct ScreenshotData { std::string renderer; unsigned char* pixels; int xsize; int ysize; int channels; }; #ifdef _WIN32 static DWORD WINAPI writeScreenshot(void* data) #else static void* writeScreenshot(void* data) #endif { ScreenshotData* ssdata = (ScreenshotData*)data; const std::string dirname = getScreenShotDirName(); const std::string prefix = "bzfi"; const std::string ext = ".png"; // scan the directory and start numbering with the filename // that follows the existing filename with the highest snap number int snap = 0; #ifdef _WIN32 const std::string pattern = dirname + prefix + "*" + ext; WIN32_FIND_DATA findData; HANDLE h = FindFirstFile(pattern.c_str(), &findData); if (h != INVALID_HANDLE_VALUE) { std::string file = findData.cFileName; snap = atoi((file.substr(file.length() - 8, 4)).c_str()); while (FindNextFile(h, &findData)) { file = findData.cFileName; const int number = atoi((file.substr(file.length() - 8, 4)).c_str()); if (snap < number) { snap = number; } } } #else const std::string pattern = prefix + "*" + ext; DIR* directory = opendir(dirname.c_str()); if (directory) { struct dirent* contents; std::string file; while ((contents = readdir(directory))) { file = contents->d_name; if (glob_match(pattern, file)) { const int number = atoi((file.substr(file.length() - 8, 4)).c_str()); if (snap < number) { snap = number; } } } closedir(directory); } #endif // _WIN32 snap++; std::string filename = dirname + prefix + TextUtils::format("%04d", snap) + ext; std::ostream* f = FILEMGR.createDataOutStream(filename.c_str(), true, true); if (f != NULL) { delete(f); const std::string& renderer = ssdata->renderer; unsigned char* pixels = ssdata->pixels; const int xsize = ssdata->xsize; const int ysize = ssdata->ysize; const int channels = ssdata->channels; // Gamma-correction is preapplied by BZFlag's gamma table // This ignores the PNG gAMA chunk, but so do many viewers (including Mozilla) if (BZDB.isSet("gamma")) { const float gamma = BZDB.eval("gamma"); if (gamma != 1.0f) { unsigned char gammaTable[256]; for (int i = 0; i < 256; i++) { const float lum = float(i) / 256.0f; const float lumadj = pow(lum, 1.0f / gamma); gammaTable[i] = (unsigned char) (lumadj * 256); } const int pixelCount = (xsize * ysize * channels); for (int i = 0; i < pixelCount; i++) { pixels[i] = gammaTable[pixels[i]]; } } } const std::string versionStr = std::string("BZFlag") + getAppVersion(); std::vector chunks; chunks.push_back(BzPNG::Chunk("tEXt", "Software", versionStr)); chunks.push_back(BzPNG::Chunk("tEXt", "GL Renderer", renderer)); char buf[128]; if (BzPNG::save(filename, chunks, xsize, ysize, channels, pixels)) { snprintf(buf, sizeof(buf), "%s: %dx%d", filename.c_str(), xsize, ysize); } else { snprintf(buf, sizeof(buf), "%s: failed to save", filename.c_str()); } ControlPanel::addMutexMessage(buf); } delete[] ssdata->pixels; delete ssdata; return NULL; } static std::string cmdScreenshot(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) { return "usage: screenshot"; } ScreenshotData* ssdata = new ScreenshotData; ssdata->renderer += (const char*)(glGetString(GL_VENDOR)); ssdata->renderer += ": "; ssdata->renderer += (const char*)(glGetString(GL_RENDERER)); ssdata->renderer += " (OpenGL "; ssdata->renderer += (const char*)(glGetString(GL_VERSION)); ssdata->renderer += ")"; int w = mainWindow->getWidth(); int h = mainWindow->getHeight(); ssdata->xsize = w; ssdata->ysize = h; ssdata->channels = 3; // GL_RGB ssdata->pixels = new unsigned char[h * w * 3]; glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, ssdata->pixels); glPopClientAttrib(); #if defined(HAVE_PTHREADS) pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread, &attr, writeScreenshot, (void *) ssdata); pthread_attr_destroy(&attr); #elif defined(_WIN32) CreateThread( NULL, // Security attributes 0, // Stack size (0 -> default) writeScreenshot, ssdata, 0, // creation flags (0 -> run immediately) NULL); // thread id return value (NULL -> don't care) #else // no threads? sucks to be you, but we'll still write the screenshot writeScreenshot(ssdata); #endif return std::string(); } static std::string cmdTime(const std::string&, const CommandManager::ArgList& args, bool*) { // FIXME - time should be moved into BZDB if (args.size() != 1) return "usage: time {forward|backward}"; if (args[0] == "forward") { clockAdjust += 5.0f * 60.0f; } else if (args[0] == "backward") { clockAdjust -= 5.0f * 60.0f; } else { return "usage: time {forward|backward}"; } return std::string(); } static std::string cmdRoam(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() == 0) return "usage: roam {zoom|cycle} "; if (!ROAM.isRoaming()) return std::string(); if (args[0] == "zoom") { if (args.size() != 2) return "usage: roam zoom {in|out|normal|stop}"; if (!roamButton || args[1] == "stop") { roamDZoom = 0.0f; } else if (args[1] == "out") { roamDZoom = +2.0f * BZDBCache::tankSpeed; } else if (args[1] == "in") { roamDZoom = -2.0f * BZDBCache::tankSpeed; } else if (args[1] == "normal") { ROAM.setZoom(60.0f); } else { return "usage: roam zoom {in|out|normal|stop}"; } } else if (args[0] == "cycle") { if (args.size() != 3) return "usage: roam cycle {type|subject} {forward|backward}"; if (args[1] == "type") { if (args[2] == "forward") { ROAM.setMode(Roaming::RoamingView((ROAM.getMode() + 1) % Roaming::roamViewCount)); } else if (args[2] == "backward") { int setto = (ROAM.getMode() - 1) % Roaming::roamViewCount; if (setto < 0) setto += Roaming::roamViewCount; ROAM.setMode(Roaming::RoamingView(setto)); } else { return "usage: roam cycle {type|subject} {forward|backward}"; } } else if (args[1] == "subject") { if (args[2] == "forward") { ROAM.changeTarget(Roaming::next); } else if (args[2] == "backward") { ROAM.changeTarget(Roaming::previous); } else { return "usage: roam cycle {type|subject} {forward|backward}"; } } else { return "usage: roam cycle {type|subject} {forward|backward}"; } } else { return "usage: roam {zoom|cycle} "; } return std::string(); } static std::string cmdSilence(const std::string&, const CommandManager::ArgList& args, bool*) { static SilenceDefaultKey silenceKeyHandler; if (args.size() != 0) return "usage: silence"; messageHistoryIndex = 0; hud->setComposing("[Un]Silence: "); HUDui::setDefaultKey(&silenceKeyHandler); return std::string(); } static std::string cmdServerCommand(const std::string&, const CommandManager::ArgList& args, bool*) { static ServerCommandKey serverCommandKeyHandler; if (args.size() != 0) return "usage: servercommand"; LocalPlayer *myTank = LocalPlayer::getMyTank(); if (!myTank) return "use only when connected"; static bool prevAdmin = myTank->isAdmin(); if (!prevAdmin && myTank->isAdmin()) serverCommandKeyHandler.adminInit(); if (prevAdmin && !myTank->isAdmin()) serverCommandKeyHandler.nonAdminInit(); prevAdmin = myTank->isAdmin(); messageHistoryIndex = 0; serverCommandKeyHandler.init(); HUDui::setDefaultKey(&serverCommandKeyHandler); return std::string(); } static std::string cmdScrollPanel(const std::string&, const CommandManager::ArgList& args, bool*) { if ((args.size() < 1) || (args.size() > 2)) { return "usage: scrollpanel {up|up_page|down|down_page|top|bottom} [count]\n"; } int count = 1; int linecount = 2; if (args.size() == 2) { count = atoi(args[1].c_str()); linecount = count; } // whence - (0 = set, 1 = cur, 2 = end) if (args[0] == "up") { controlPanel->setMessagesOffset(+linecount, 1 /* current */, false); } else if (args[0] == "down") { controlPanel->setMessagesOffset(-linecount, 1 /* current */, false); } else if (args[0] == "up_page") { controlPanel->setMessagesOffset(+count, 1 /* current */, true); } else if (args[0] == "down_page") { controlPanel->setMessagesOffset(-count, 1 /* current */, true); } else if (args[0] == "top") { controlPanel->setMessagesOffset(123456789, 0 /* set */, false); } else if (args[0] == "bottom") { controlPanel->setMessagesOffset(0, 0 /* set */, false); } return std::string(); } static std::string cmdHunt(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: hunt"; hud->getScoreboard()->huntKeyEvent (false); return std::string(); } static std::string cmdAddHunt(const std::string&, const CommandManager::ArgList& args, bool*) { if (args.size() != 0) return "usage: addhunt"; hud->getScoreboard()->huntKeyEvent (true); return std::string(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/clientConfig.cxx000066400000000000000000000223321200563112200206250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // BZFlag common header #include "common.h" #include #include #if defined(_WIN32) # include # include #else # include # include #endif /* defined(_WIN32) */ #include "clientConfig.h" #include "version.h" #include "StateDatabase.h" #include "KeyManager.h" #include "TextUtils.h" #include "DirectoryNames.h" #include "ErrorHandler.h" std::vector configQualityValues; std::vector configViewValues; void initConfigData ( void ) { configQualityValues.push_back(std::string("low")); configQualityValues.push_back(std::string("medium")); configQualityValues.push_back(std::string("high")); configQualityValues.push_back(std::string("experimental")); configViewValues.push_back(std::string("normal")); configViewValues.push_back(std::string("stereo")); configViewValues.push_back(std::string("stacked")); configViewValues.push_back(std::string("three")); configViewValues.push_back(std::string("anaglyph")); configViewValues.push_back(std::string("interlaced")); } std::string getOldConfigFileName(void) { #if !defined(_WIN32) std::string name = getConfigDirName("2.0"); name += "config.cfg"; // add in hostname on UNIX if (getenv("HOST")) { name += "."; name += getenv("HOST"); } return name; #elif defined(_WIN32) /* !defined(_WIN32) */ std::string name("C:"); char dir[MAX_PATH]; ITEMIDLIST* idl; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL , &idl))) { if (SHGetPathFromIDList(idl, dir)) { struct stat statbuf; if (stat(dir, &statbuf) == 0 && (statbuf.st_mode & _S_IFDIR) != 0) name = dir; } IMalloc* shalloc; if (SUCCEEDED(SHGetMalloc(&shalloc))) { shalloc->Free(idl); shalloc->Release(); } } name += "\\My BZFlag Files\\2.0\\config.cfg"; return name; #endif /* !defined(_WIN32) */ } #if !defined(_WIN32) // who uses this sucker any more? static std::string getReallyOldConfigFileName() { std::string name = getConfigDirName(); name += "config"; return name; } #endif std::string getCurrentConfigFileName(void) { std::string configFile = BZ_CONFIG_FILE_NAME; std::string name = getConfigDirName(BZ_CONFIG_DIR_VERSION); name += configFile; #if !defined(_WIN32) // add in hostname on UNIX if (getenv("HOST")) { name += "."; name += getenv("HOST"); } #endif return name; } #if !defined(_WIN32) static void copyConfigFile(const char *oldConfigName, std::string configName) { FILE *fp = fopen(oldConfigName, "rb"); if (!fp) return; // there is an old config so lets copy it to the new dir and let the // update take care of it. mkdir(getConfigDirName(BZ_CONFIG_DIR_VERSION).c_str(), 0755); FILE *newFile = fopen(configName.c_str(),"wb"); if (!newFile) { fclose(fp); return; } fseek(fp, 0, SEEK_END); const int len = ftell(fp); fseek(fp, 0, SEEK_SET); unsigned char *temp = (unsigned char *)malloc(len); if (temp == NULL) { printError("Unsufficient Memory"); fclose(fp); fclose(newFile); return; } size_t items_read = fread(temp, len, 1, fp); fclose(fp); if (items_read != 1) printError("Old config file is not readable"); size_t items_written = fwrite(temp, len, 1, newFile); fclose(newFile); if (items_written != 1) printError("New config file is not writable"); free (temp); } #endif // this function will look for the config, if it's not there, // it will TRY and find an old one and copy it // so that the update function can upgrade it to the current version // the assumption is that there is a unique config per version void findConfigFile(void) { // look for the current file std::string configName = getCurrentConfigFileName(); FILE *fp = fopen(configName.c_str(), "rb"); if (fp) { // we found the current file, nothing to do, just return fclose(fp); return; } // try and find the old file std::string oldConfigName = getOldConfigFileName(); #if defined(_WIN32) fp = fopen(oldConfigName.c_str(), "rb"); if (fp) { // there is an old config so lets copy it to the new dir and // let the update take care of it. fclose(fp); // make the dir if we need to std::string configDir = getConfigDirName(BZ_CONFIG_DIR_VERSION); mkdir(configDir.c_str()); // copy the old config to the new dir location with the new name CopyFile(oldConfigName.c_str(), configName.c_str(),true); } #else // the other OSs should do what they need to do copyConfigFile(oldConfigName.c_str(), configName); #endif // try and find the REALLY old file // who uses this sucker any more? #if !defined(_WIN32) std::string realyOldConfigName = getReallyOldConfigFileName(); // apparently only linux needs this so do the magic copyConfigFile(realyOldConfigName.c_str(), configName); #endif } void updateConfigFile(void) { int configVersion = 0; if (BZDB.isSet("config_version")) configVersion = (int)BZDB.eval("config_version"); switch (configVersion) { case 0: // 1.10-1.12 // update from old unversioned config // roaming fixes - remove keys bound to "roam translate *" and "roam rotate *" KEYMGR.unbindCommand("roam translate left"); KEYMGR.unbindCommand("roam translate right"); KEYMGR.unbindCommand("roam translate up"); KEYMGR.unbindCommand("roam translate down"); KEYMGR.unbindCommand("roam translate forward"); KEYMGR.unbindCommand("roam translate backward"); KEYMGR.unbindCommand("roam rotate left"); KEYMGR.unbindCommand("roam rotate right"); KEYMGR.unbindCommand("roam rotate up"); KEYMGR.unbindCommand("roam rotate down"); KEYMGR.unbindCommand("roam rotate stop"); // add new default keybindings if there's no conflict // iconify BzfKeyEvent key; if (KEYMGR.stringToKeyEvent("F4", key) && (KEYMGR.get(key, true) == "")) KEYMGR.bind(key, true, "iconify"); // toggle console & radar if (KEYMGR.stringToKeyEvent("Q", key) && (KEYMGR.get(key, true) == "")) KEYMGR.bind(key, true, "toggleRadar"); if (KEYMGR.stringToKeyEvent("W", key) && (KEYMGR.get(key, true) == "")) KEYMGR.bind(key, true, "toggleConsole"); // controlpanel tabs - all or nothing if (KEYMGR.stringToKeyEvent("Shift+F1", key) && (KEYMGR.get(key, true) == "") && KEYMGR.stringToKeyEvent("Shift+F2", key) && (KEYMGR.get(key, true) == "") && KEYMGR.stringToKeyEvent("Shift+F3", key) && (KEYMGR.get(key, true) == "") && KEYMGR.stringToKeyEvent("Shift+F4", key) && (KEYMGR.get(key, true) == "")) { KEYMGR.stringToKeyEvent("Shift+F1", key); KEYMGR.bind(key, true, "messagepanel all"); KEYMGR.stringToKeyEvent("Shift+F2", key); KEYMGR.bind(key, true, "messagepanel chat"); KEYMGR.stringToKeyEvent("Shift+F3", key); KEYMGR.bind(key, true, "messagepanel server"); KEYMGR.stringToKeyEvent("Shift+F4", key); KEYMGR.bind(key, true, "messagepanel misc"); } // TODO - any other breaking changes from 1.10 to 2.0 case 1: // 1.11.20 if (KEYMGR.stringToKeyEvent("Tab", key) && (KEYMGR.get(key, false) == "")) KEYMGR.bind(key, false, "jump"); case 2: // 2.0 if (KEYMGR.stringToKeyEvent("7", key) && (KEYMGR.get(key, true) == "")) KEYMGR.bind(key, true, "addhunt"); case 3: // Upgrade from 2.0.x to 2.4.0 // Convert from email to motto // If the email is set, see if we should convert it if (BZDB.isSet("email")) { std::string email = BZDB.get("email"); // If the email is set and does not contain an @ sign, move it to motto if (!email.empty() && email.find('@') == std::string::npos) { BZDB.set("motto", email); } BZDB.unset("email"); // discard email string from before version 2.4 } if (BZDB.isSet("emailDispLen")) { BZDB.set("mottoDispLen", BZDB.get("emailDispLen")); BZDB.unset("emailDispLen"); // discard setting from before version 2.4 } if (BZDB.isSet("hideEmails")) { BZDB.setBool("hideMottos", BZDB.isTrue("hideEmails")); BZDB.unset("hideEmails"); // discard setting from before version 2.4 } // Get rid of geometry and lastScreenshot settings BZDB.unset("geometry"); BZDB.unset("lastScreenshot"); // Turn off dithering (since none of our automatic performance checks turn it on anymore) BZDB.setBool("dither", false); case 4: // Upgrade 2.4.0 to 2.4.2 BZDB.unset("displayZoom"); // removed in r22109 BZDB.unset("radarShotLineType"); // existed only in r22117 break; default: // hm, we don't know about this one... printError(TextUtils::format("Config file is tagged version \"%d\", " "which was not expected (too new perhaps). " "Trying to load anyhow.", configVersion)); break; } // set us as the updated version configVersion = BZ_CONFIG_FILE_VERSION; BZDB.setInt("config_version", configVersion); } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/clientConfig.h000066400000000000000000000021231200563112200202460ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * clientConfig.h: * setup and load the client side prefrences */ #ifndef __CLIENT_CONFIG_H__ #define __CLIENT_CONFIG_H__ // common - 1st #include "common.h" #include #include extern std::vector configQualityValues; extern std::vector configViewValues; void initConfigData ( void ); std::string getOldConfigFileName(void); std::string getCurrentConfigFileName(void); void findConfigFile(void); void updateConfigFile(void); #endif // __CLIENT_CONFIG_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/commands.h000066400000000000000000000020141200563112200174420ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __COMMANDS_H__ #define __COMMANDS_H__ // common - 1st #include "common.h" /* common interface headers */ #include "CommandManager.h" typedef struct CommandListItem { const char* name; CommandManager::CommandFunction func; const char* help; } CmdListItem; /* FIXME -- gcc is not liking array type with sizeof() without size * for some reason */ extern const CmdListItem commandList[27]; #endif /* __COMMANDS_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/daylight.cxx000066400000000000000000000315131200563112200200270ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "daylight.h" // common headers #include "StateDatabase.h" #include "ParseColor.h" static const double radPerDeg = M_PI / 180.0; static const double radPerHour = M_PI / 12.0; static const double siderealHoursPerHour = 1.002737908; static const double epoch = 2415020.0; static double getGreenwichSideral(double julianDay) { // true position requires sidereal time of midnight at prime meridian. // get midnight of given julian day (midnight has decimal of .5) double jdMidnight = floor(julianDay); if (julianDay - jdMidnight >= 0.5) jdMidnight += 0.5; else jdMidnight -= 0.5; // get fraction of a day double dayFraction = (julianDay - jdMidnight) * 24.0; // get Greenwich midnight sidereal time (in hours) double T = (jdMidnight - epoch) / 36525.0; const double greenwichMidnight = fmod((0.00002581 * T + 2400.051262) * T + 6.6460656, 24.0); // return Greenwich sidereal time return radPerHour * (greenwichMidnight + dayFraction * siderealHoursPerHour); } static void gettruePosition(double julianDay, float latitude, float longitude, double sx, double sy, double sz, float pos[3]) { // get local sidereal time const float localSidereal = (float)(getGreenwichSideral(julianDay) - longitude * M_PI / 180.0); // rotate around polar axis (y-axis) by local sidereal time float tx = float(sx * cosf(localSidereal) - sz * sinf(localSidereal)); float ty = float(sy); float tz = float(sz * cosf(localSidereal) + sx * sinf(localSidereal)); // rotate by latitude to local position pos[0] = tx; pos[1] = ty * cosf((float)(latitude*M_PI/180.0)) - tz * sinf((float)(latitude*M_PI/180.0)); pos[2] = tz * cosf((float)(latitude*M_PI/180.0)) + ty * sinf((float)(latitude*M_PI/180.0)); } void getCelestialTransform(double julianDay, float latitude, float longitude, GLfloat (&xform)[4][4]) { // get local sidereal time const float localSidereal = (float)(getGreenwichSideral(julianDay) - longitude * M_PI / 180.0); // localSidereal is the amount the celestial sphere should be // rotated from the vernal equinox about the celestial axis. // construct the matrix that transforms points in the celestial // coordinate system (x points to vernal equinox, z points to // celestial north pole) to the local coordinate system on earth // where z is up and y points in the horizontal plane towards // north. const float cls = cosf(localSidereal); const float sls = sinf(localSidereal); const float cla = cosf((float)(latitude * M_PI / 180.0)); const float sla = sinf((float)(latitude * M_PI / 180.0)); // constant stuff xform[0][3] = xform[1][3] = xform[2][3] = 0.0f; xform[3][0] = xform[3][1] = xform[3][2] = 0.0f; xform[3][3] = 1.0f; // fill in rotation xform[0][0] = -sls; xform[1][0] = cls; xform[2][0] = 0.0f; xform[0][1] = -cls * sla; xform[1][1] = -sls * sla; xform[2][1] = cla; xform[0][2] = cls * cla; xform[1][2] = sls * cla; xform[2][2] = sla; } void getSunPosition(double julianDay, float latitude, float longitude, float pos[3]) { double T = (julianDay - epoch) / 36525.0; double geometricMeanLongitude = radPerDeg * ((0.0003025 * T + 36000.76892) * T + 279.69668); geometricMeanLongitude = fmod(geometricMeanLongitude, 2.0 * M_PI); double meanAnomaly = radPerDeg * (358.47583 + ((0.0000033 * T + 0.000150) * T + 35999.04975) * T); meanAnomaly = fmod(meanAnomaly, 2.0 * M_PI); // double eccentricity = 0.01675104 + // T * (-0.000000126 * T - 0.0000418); double C = radPerDeg * (sin(meanAnomaly) * (1.919460 - (0.004789 + 0.000014 * T) * T) + sin(2.0 * meanAnomaly) * (0.020094 - 0.0001 * T) + sin(3.0 * meanAnomaly) * 0.000293); C = fmod(C, 2.0 * M_PI); double trueLongitude = geometricMeanLongitude + C; trueLongitude = fmod(trueLongitude, 2.0 * M_PI); // get obliquity (earth's tilt) double obliquity = radPerDeg * (23.452294 + (-0.0130125 + (-0.00000164 + 0.000000503 * T) * T) * T); obliquity = fmod(obliquity, 2.0 * M_PI); // position of sun if earth didn't rotate: double sx, sy, sz; sx = sin(trueLongitude) * cos(obliquity); sy = sin(trueLongitude) * sin(obliquity); sz = cos(trueLongitude); // get true position gettruePosition(julianDay, latitude, longitude, sx, sy, sz, pos); } void getMoonPosition(double julianDay, float latitude, float longitude, float pos[3]) { double T = (julianDay - epoch) / 36525.0; double e = 1.0 + (-0.002495 - 0.00000752 * T) * T; double meanLongitude = radPerDeg * (270.434164 + (481267.8831 + (-0.001133 + 0.0000019 * T)*T)*T); meanLongitude = fmod(meanLongitude, 2.0 * M_PI); double meanAnomaly = radPerDeg * (296.104608 + (477198.8491 + (0.009192 + 0.0000144 * T)*T)*T); meanAnomaly = fmod(meanAnomaly, 2.0 * M_PI); double meanElongation = radPerDeg * (350.737486 + (445267.1142 + (-0.001436 + 0.0000019 * T)*T)*T); meanElongation = fmod(meanElongation, 2.0 * M_PI); double meanElongation2 = 2.0 * meanElongation; double distFromAscendingNode = radPerDeg * (11.250889 + (483202.0251 + (-0.003211 - 0.0000003 * T)*T)*T); distFromAscendingNode = fmod(distFromAscendingNode, 2.0 * M_PI); // get sun's meanAnomaly double solMeanAnomaly = radPerDeg * (358.47583 + ((0.0000033 * T + 0.000150) * T + 35999.04975) * T); solMeanAnomaly = fmod(solMeanAnomaly, 2.0 * M_PI); // get moon's geocentric latitude and longitude double geocentricLongitude = meanLongitude + radPerDeg * (6.288750 * sin(meanAnomaly) + 1.274018 * sin(meanElongation2 - meanAnomaly) + 0.658309 * sin(meanElongation2) + 0.213616 * sin(2.0 * meanAnomaly) + -0.185596 * sin(solMeanAnomaly) * e + -0.114336 * sin(2.0 * distFromAscendingNode)); double geocentricLatitude = radPerDeg * (5.128189 * sin(distFromAscendingNode) + 0.280606 * sin(meanAnomaly + distFromAscendingNode) + 0.277693 * sin(meanAnomaly - distFromAscendingNode) + 0.173238 * sin(meanElongation2 - distFromAscendingNode) + 0.055413 * sin(meanElongation2 + distFromAscendingNode - meanAnomaly) + 0.046272 * sin(meanElongation2 - distFromAscendingNode - meanAnomaly) + 0.032573 * sin(meanElongation2 + distFromAscendingNode) + 0.017198 * sin(2.0 * meanAnomaly + distFromAscendingNode)); geocentricLongitude = fmod(geocentricLongitude, 2.0 * M_PI); geocentricLatitude = fmod(geocentricLatitude, 2.0 * M_PI); // get obliquity (earth's tilt) double obliquity = radPerDeg * (23.452294 + (-0.0130125 + (-0.00000164 + 0.000000503 * T) * T) * T); obliquity = fmod(obliquity, 2.0 * M_PI); // position of moon if earth didn't rotate: double sx, sy, sz; sx = cos(geocentricLatitude) * sin(geocentricLongitude) * cos(obliquity) - sin(geocentricLatitude) * sin(obliquity); sy = sin(geocentricLatitude) * cos(obliquity) + cos(geocentricLatitude) * sin(geocentricLongitude) * sin(obliquity); sz = cos(geocentricLatitude) * cos(geocentricLongitude); // get true position gettruePosition(julianDay, latitude, longitude, sx, sy, sz, pos); } static void lerpColor(GLfloat out[3], const GLfloat t0[3], const GLfloat t1[3], float t) { out[0] = (1.0f - t) * t0[0] + t * t1[0]; out[1] = (1.0f - t) * t0[1] + t * t1[1]; out[2] = (1.0f - t) * t0[2] + t * t1[2]; } static const float nightElevation = -0.25f; // ~sin(-15) static const float duskElevation = -0.17f; // ~sin(-10) static const float twilightElevation = -0.087f; // ~sin(-5) static const float dawnElevation = 0.0f; // sin(0) static const float dayElevation = 0.087f; // ~sin(5) void getSunColor(const float sunDir[3], GLfloat color[3], GLfloat ambient[3], GLfloat& brightness) { static const GLfloat highSunColor[3] = { 1.75f, 1.75f, 1.4f }; static const GLfloat lowSunColor[3] = { 0.75f, 0.27f, 0.0f }; static const GLfloat moonColor[3] = { 0.4f, 0.4f, 0.4f }; static const GLfloat nightAmbient[3] = { 0.3f, 0.3f, 0.3f }; static const GLfloat dayAmbient[3] = { 0.35f, 0.5f, 0.5f }; if (sunDir[2] <= -0.009f) { // it's the moon color[0] = moonColor[0]; color[1] = moonColor[1]; color[2] = moonColor[2]; brightness = 0.0f; } else if (sunDir[2] < dayElevation) { const GLfloat t = (sunDir[2] - dawnElevation) / (dayElevation - dawnElevation); lerpColor(color, lowSunColor, highSunColor, t); brightness = t; } else { color[0] = highSunColor[0]; color[1] = highSunColor[1]; color[2] = highSunColor[2]; brightness = 1.0f; } // now ambient if (sunDir[2] < duskElevation) { ambient[0] = nightAmbient[0]; ambient[1] = nightAmbient[1]; ambient[2] = nightAmbient[2]; } else if (sunDir[2] < dayElevation) { const GLfloat t = (sunDir[2] - duskElevation) / (dayElevation - duskElevation); lerpColor(ambient, nightAmbient, dayAmbient, t); } else { ambient[0] = dayAmbient[0]; ambient[1] = dayAmbient[1]; ambient[2] = dayAmbient[2]; } } bool getSunsetTop(const float sunDir[3], float& topAltitude) { if (sunDir[2] > nightElevation && sunDir[2] < dayElevation) { topAltitude = (sunDir[2]-nightElevation) / (dayElevation-nightElevation); return true; } return false; } void getSkyColor(const float sunDir[3], GLfloat sky[4][3]) { static const GLfloat nightColor[3] = { 0.04f, 0.04f, 0.08f }; static const GLfloat zenithColor[3] = { 0.25f, 0.55f, 0.86f }; static const GLfloat horizonColor[3] = { 0.43f, 0.75f, 0.95f }; static const GLfloat sunrise1Color[3] = { 0.30f, 0.12f, 0.08f }; static const GLfloat sunrise2Color[3] = { 0.47f, 0.12f, 0.08f }; // sky colors if (sunDir[2] < nightElevation) { // nighttime sky[0][0] = nightColor[0]; sky[0][1] = nightColor[1]; sky[0][2] = nightColor[2]; sky[1][0] = nightColor[0]; sky[1][1] = nightColor[1]; sky[1][2] = nightColor[2]; sky[2][0] = nightColor[0]; sky[2][1] = nightColor[1]; sky[2][2] = nightColor[2]; sky[3][0] = nightColor[0]; sky[3][1] = nightColor[1]; sky[3][2] = nightColor[2]; } else if (sunDir[2] < twilightElevation) { // twilight const float t = (sunDir[2] - nightElevation) / (twilightElevation - nightElevation); sky[0][0] = nightColor[0]; sky[0][1] = nightColor[1]; sky[0][2] = nightColor[2]; lerpColor(sky[1], nightColor, sunrise1Color, t); sky[2][0] = nightColor[0]; sky[2][1] = nightColor[1]; sky[2][2] = nightColor[2]; sky[3][0] = nightColor[0]; sky[3][1] = nightColor[1]; sky[3][2] = nightColor[2]; } else if (sunDir[2] < dawnElevation) { // sunrise or sunset const float t = (sunDir[2] - twilightElevation) / (dawnElevation - twilightElevation); sky[0][0] = nightColor[0]; sky[0][1] = nightColor[1]; sky[0][2] = nightColor[2]; lerpColor(sky[1], sunrise1Color, sunrise2Color, t); sky[2][0] = nightColor[0]; sky[2][1] = nightColor[1]; sky[2][2] = nightColor[2]; sky[3][0] = nightColor[0]; sky[3][1] = nightColor[1]; sky[3][2] = nightColor[2]; } else if (sunDir[2] < dayElevation) { // early morning/late evening const float t = (sunDir[2] - dawnElevation) / (dayElevation - dawnElevation); lerpColor(sky[0], nightColor, zenithColor, t); lerpColor(sky[1], sunrise2Color, horizonColor, t); lerpColor(sky[2], nightColor, horizonColor, t); lerpColor(sky[3], nightColor, horizonColor, t); } else { // day time sky[0][0] = zenithColor[0]; sky[0][1] = zenithColor[1]; sky[0][2] = zenithColor[2]; sky[1][0] = horizonColor[0]; sky[1][1] = horizonColor[1]; sky[1][2] = horizonColor[2]; sky[2][0] = horizonColor[0]; sky[2][1] = horizonColor[1]; sky[2][2] = horizonColor[2]; sky[3][0] = horizonColor[0]; sky[3][1] = horizonColor[1]; sky[3][2] = horizonColor[2]; } // user adjustment for the sky color if (BZDB.get("_skyColor") != "white") { float skyColor[4]; parseColorString(BZDB.get("_skyColor"), skyColor); sky[0][0] *= skyColor[0]; sky[0][1] *= skyColor[1]; sky[0][2] *= skyColor[2]; sky[1][0] *= skyColor[0]; sky[1][1] *= skyColor[1]; sky[1][2] *= skyColor[2]; sky[2][0] *= skyColor[0]; sky[2][1] *= skyColor[1]; sky[2][2] *= skyColor[2]; sky[3][0] *= skyColor[0]; sky[3][1] *= skyColor[1]; sky[3][2] *= skyColor[2]; } } bool areShadowsCast(const float sunDir[3]) { return sunDir[2] > 0.5 * dayElevation; } bool areStarsVisible(const float sunDir[3]) { return sunDir[2] < dawnElevation; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/daylight.h000066400000000000000000000043441200563112200174560ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Compute position of sun for given julian day. Note that * julian days are big numbers so doubles are a must. */ #ifndef BZF_DAYLIGHT_H #define BZF_DAYLIGHT_H #include "common.h" #include "bzfgl.h" // julian day of midnight 1/1/1970 static const double unixEpoch = 2440587.5; // return direction of sun given julian day void getSunPosition(double julianDay, float latitude, float longitude, float pos[3]); // return direction of moon given julian day void getMoonPosition(double julianDay, float latitude, float longitude, float pos[3]); // transform a direction from the celestial coordinate system void getCelestialTransform(double julianDay, float latitude, float longitude, GLfloat (&xform)[4][4]); // sets color of sun. if it's nighttime, the sun is actually the moon. void getSunColor(const float sunDir[3], GLfloat color[3], GLfloat ambient[3], GLfloat& brightness); // make sky colors given sun direction. sun direction should be normalized. // sky is filled with the colors for the zenith, horizon towards sun, and // horizon away from sun, respectively. void getSkyColor(const float sunDir[3], GLfloat sky[4][3]); // true if sun is high enough to cast shadows. sun direction should be // normalized. bool areShadowsCast(const float sunDir[3]); // true if sun is low enough to let stars be visible. sun direction // should be normalized. bool areStarsVisible(const float sunDir[3]); // true if near sunset and sky color interpolation shouldn't be from // zenith, but from somewhere lower to flatten out the colors. bool getSunsetTop(const float sunDir[3], float& topAltitude); #endif // BZF_DAYLIGHT_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/defaultBZDB.cxx000066400000000000000000000310151200563112200203050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // BZFlag common header #include "common.h" #include #include "defaultBZDB.h" #include "Protocol.h" #include "callbacks.h" DefaultDBItem defaultDBItems[] = { { "fpsLimit", "30", true, StateDatabase::ReadWrite, NULL }, { "saveEnergy", "0", true, StateDatabase::ReadWrite, NULL }, { "saveSettings", "1", true, StateDatabase::ReadWrite, NULL }, { "udpnet", "1", true, StateDatabase::ReadWrite, NULL }, { "timedate", "0", true, StateDatabase::ReadWrite, NULL }, { "motto", "", true, StateDatabase::ReadWrite, NULL }, { "team", "Rogue", true, StateDatabase::ReadWrite, NULL }, { "list", DefaultListServerURL, true, StateDatabase::ReadWrite, NULL }, { "motdServer", DefaultMOTDServer, true, StateDatabase::ReadWrite, NULL }, { "volume", "10", true, StateDatabase::ReadWrite, NULL }, { "latitude", "37.5", true, StateDatabase::ReadWrite, NULL }, { "longitude", "122", true, StateDatabase::ReadWrite, NULL }, { "radarStyle", "3", true, StateDatabase::ReadWrite, NULL }, { "radarTankPixels", "2.0", true, StateDatabase::ReadWrite, NULL }, { "coloredradarshots", "1", true, StateDatabase::ReadWrite, NULL }, { "linedradarshots", "0", true, StateDatabase::ReadWrite, NULL }, { "sizedradarshots", "0", true, StateDatabase::ReadWrite, NULL }, { "panelopacity", "0.3", true, StateDatabase::ReadWrite, NULL }, { "radaropacity", "0.3", true, StateDatabase::ReadWrite, NULL }, { "radarsize", "4", true, StateDatabase::ReadWrite, NULL }, { "mouseboxsize", "5", true, StateDatabase::ReadWrite, NULL }, { "mouseClamp", "0", true, StateDatabase::ReadWrite, NULL }, { "cpanelfontsize", "0", true, StateDatabase::ReadWrite, NULL }, { "scorefontsize", "0", true, StateDatabase::ReadWrite, NULL }, { "colorful", "1", true, StateDatabase::ReadWrite, NULL }, { "tkwarnratio", "0.0", true, StateDatabase::ReadWrite, NULL }, { "showtabs", "2", true, StateDatabase::ReadWrite, NULL }, { "underlineColor", "cyan", true, StateDatabase::ReadWrite, NULL }, { "useMeshForRadar", "0", true, StateDatabase::ReadWrite, NULL }, { "zbuffer", "1", true, StateDatabase::ReadWrite, NULL }, { "highlightPattern", "", true, StateDatabase::ReadWrite, NULL }, { "killerhighlight", "1", true, StateDatabase::ReadWrite, NULL }, { "serverCacheAge", "0", true, StateDatabase::ReadWrite, NULL }, { "slowKeyboard", "0", false, StateDatabase::ReadWrite, NULL }, { "displayRadarFlags", "1", false, StateDatabase::ReadWrite, NULL }, { "displayMainFlags", "1", false, StateDatabase::ReadWrite, NULL }, { "displayScore", "1", true, StateDatabase::ReadWrite, NULL }, { "displayFlagHelp", "1", true, StateDatabase::ReadWrite, setFlagHelp }, { "displayConsole", "1", false, StateDatabase::ReadWrite, NULL }, { "displayReloadTimer", "1", true, StateDatabase::ReadWrite, NULL }, { "displayRadar", "1", false, StateDatabase::ReadWrite, NULL }, { "displayRadarRange", "0.5", false, StateDatabase::ReadWrite, NULL }, { "radarPosition", "0", true, StateDatabase::ReadWrite, NULL }, { "defaultFOV", "60.0", false, StateDatabase::ReadWrite, NULL }, { "displayFOV", "60.0", false, StateDatabase::ReadWrite, NULL }, { "roamZoomMax", "120", false, StateDatabase::ReadWrite, NULL }, { "roamZoomMin", "15", false, StateDatabase::ReadWrite, NULL }, { "maxQuality", "3", false, StateDatabase::ReadWrite, NULL }, { "groundTexRepeat", "0.1", true, StateDatabase::ReadWrite, NULL }, { "groundHighResTexRepeat", "0.05", true, StateDatabase::ReadWrite, NULL }, { "boxWallTexRepeat", "1.5", true, StateDatabase::ReadWrite, NULL }, { "boxWallHighResTexRepeat", "5.0", true, StateDatabase::ReadWrite, NULL }, { "pyrWallTexRepeat", "3.0", true, StateDatabase::ReadWrite, NULL }, { "pyrWallHighResTexRepeat", "8.0", true, StateDatabase::ReadWrite, NULL }, { "allowInputChange", "1", true, StateDatabase::ReadWrite, NULL }, { "pulseDepth", "0.4", true, StateDatabase::ReadWrite, NULL }, { "pulseRate", "1.0", true, StateDatabase::ReadWrite, NULL }, { "userRainScale", "1.0", true, StateDatabase::ReadWrite, NULL }, { "userMirror", "1", true, StateDatabase::ReadWrite, NULL }, { "showTreads", "0", true, StateDatabase::ReadWrite, NULL }, { "animatedTreads", "1", true, StateDatabase::ReadWrite, NULL }, { "shotLength", "1", true, StateDatabase::ReadWrite, NULL }, { "treadStyle", "1", true, StateDatabase::ReadWrite, NULL }, { "userTrackFade", "1.0", true, StateDatabase::ReadWrite, NULL }, { "trackMarkCulling", "3", true, StateDatabase::ReadWrite, NULL }, { "scrollPages", "20", true, StateDatabase::ReadWrite, NULL }, { "remoteSounds", "1", true, StateDatabase::ReadWrite, NULL }, { "leadingShotLine", "0", true, StateDatabase::ReadWrite, NULL }, { "saveIdentity", "2", true, StateDatabase::ReadWrite, NULL }, { "showCollisionGrid", "0", true, StateDatabase::ReadWrite, NULL }, { "showCullingGrid", "0", true, StateDatabase::ReadWrite, NULL }, { "showCoordinates", "0", true, StateDatabase::ReadWrite, NULL }, { "showVelocities", "0", true, StateDatabase::ReadWrite, NULL }, { "jumpTyping", "1", true, StateDatabase::ReadWrite, NULL }, { "maxCacheMB", "32", true, StateDatabase::ReadWrite, NULL }, { "doDownloads", "1", true, StateDatabase::ReadWrite, NULL }, { "updateDownloads", "0", true, StateDatabase::ReadWrite, NULL }, { "roamSmoothTime", "0.5", true, StateDatabase::ReadWrite, NULL }, { "roamView", "fps", true, StateDatabase::ReadWrite, NULL }, { "listIcons", "1", true, StateDatabase::ReadWrite, NULL }, { "maxTextureSize", "512", true, StateDatabase::ReadWrite, NULL }, { "lodScale", "1.0", true, StateDatabase::ReadWrite, NULL }, { "radarLodScale", "1.0", true, StateDatabase::ReadWrite, NULL }, { "stencilShadows", "0", true, StateDatabase::ReadWrite, NULL }, { "shadowAlpha", "0.5", true, StateDatabase::ReadWrite, NULL }, { "aniso", "1", true, StateDatabase::ReadWrite, NULL }, // roam smooth follow settings { "followDist", "32.0", true, StateDatabase::ReadWrite, NULL }, { "followHeight", "8.0", true, StateDatabase::ReadWrite, NULL }, { "followOffsetZ", "1.0", true, StateDatabase::ReadWrite, NULL }, { "followSpeedX", "2.5", true, StateDatabase::ReadWrite, NULL }, { "followSpeedY", "1.0", true, StateDatabase::ReadWrite, NULL }, { "followSpeedZ", "1.0", true, StateDatabase::ReadWrite, NULL }, // hidden graphics rendering params { "useDrawInfo", "1", true, StateDatabase::ReadWrite, NULL }, { "f2bsort", "1", true, StateDatabase::ReadWrite, NULL }, { "meshLists", "1", true, StateDatabase::ReadWrite, NULL }, { "flagLists", "0", true, StateDatabase::ReadWrite, NULL }, { "lightLists", "0", true, StateDatabase::ReadWrite, NULL }, { "noMeshClusters", "0", true, StateDatabase::ReadWrite, NULL }, // default texture names { "stdGroundTexture", "std_ground", true, StateDatabase::ReadWrite, NULL }, { "zoneGroundTexture", "zone_ground", true, StateDatabase::ReadWrite, NULL }, { "boxWallTexture", "boxwall", true, StateDatabase::ReadWrite, NULL }, { "boxTopTexture", "roof", true, StateDatabase::ReadWrite, NULL }, { "pyrWallTexture", "pyrwall", true, StateDatabase::ReadWrite, NULL }, { "cautionTexture", "caution", true, StateDatabase::ReadWrite, NULL }, { "waterTexture", "water", true, StateDatabase::ReadWrite, NULL }, // default fonts { "consoleFont", "DejaVuSansMonoBold", true, StateDatabase::ReadWrite, NULL }, { "sansSerifFont", "DejaVuSansCondensedBold", true, StateDatabase::ReadWrite, NULL }, { "serifFont", "DejaVuSerifBold", true, StateDatabase::ReadWrite, NULL }, // team based object sufixes { "tankTexture", "tank", true, StateDatabase::ReadWrite, NULL }, { "boltTexture", "bolt", true, StateDatabase::ReadWrite, NULL }, { "laserTexture", "laser", true, StateDatabase::ReadWrite, NULL }, { "baseTopTexture", "basetop", true, StateDatabase::ReadWrite, NULL }, { "baseWallTexture", "basewall", true, StateDatabase::ReadWrite, NULL }, // team prefixes { "redTeamPrefix", "red_", true, StateDatabase::ReadWrite, NULL }, { "blueTeamPrefix", "blue_", true, StateDatabase::ReadWrite, NULL }, { "greenTeamPrefix", "green_", true, StateDatabase::ReadWrite, NULL }, { "purpleTeamPrefix", "purple_", true, StateDatabase::ReadWrite, NULL }, { "rabbitTeamPrefix", "rabbit_", true, StateDatabase::ReadWrite, NULL }, { "hunterTeamPrefix", "hunter_", true, StateDatabase::ReadWrite, NULL }, { "rogueTeamPrefix", "rogue_", true, StateDatabase::ReadWrite, NULL }, { "observerTeamPrefix", "observer_", true, StateDatabase::ReadWrite, NULL }, // type prefixes { "superPrefix", "super_", true, StateDatabase::ReadWrite, NULL }, // effects options { "useFancyEffects", "1", true, StateDatabase::ReadWrite, NULL }, { "spawnEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "enableLocalSpawnEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "shotEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "enableLocalShotEffect", "0", true, StateDatabase::ReadWrite, NULL }, { "deathEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "useVelOnShotEffects", "1", true, StateDatabase::ReadWrite, NULL }, { "landEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "gmPuffEffect", "3", true, StateDatabase::ReadWrite, NULL }, { "gmPuffTime", "1/8", true, StateDatabase::ReadWrite, NULL }, { "ricoEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "tpEffect", "1", true, StateDatabase::ReadWrite, NULL }, { "fogEffect", "1", true, StateDatabase::ReadWrite, NULL }, // URL timeouts { "httpTimeout", "15", true, StateDatabase::ReadWrite, NULL }, // hud drawing { "hudGUIBorderOpacityFactor", "0.75", true, StateDatabase::ReadWrite, NULL }, { "hudWayPMarkerSize", "15", true, StateDatabase::ReadWrite, NULL }, // hud drawing { "hudGUIBorderOpacityFactor","0.75", true, StateDatabase::ReadWrite, NULL }, { "hideMottos", "0", true, StateDatabase::ReadWrite, NULL }, { "mottoDispLen", "32", true, StateDatabase::ReadWrite, NULL }, { "scoreboardSort", "0", true, StateDatabase::ReadWrite, NULL }, // listFilters { "listFilter", "", true, StateDatabase::ReadWrite, NULL }, { "listFilter0", "", true, StateDatabase::ReadWrite, NULL }, { "listFilter1", "/p>1, # busy", true, StateDatabase::ReadWrite, NULL }, { "listFilter2", "/p>1,s>1,s<4, # busy - 2 or 3 shots", true, StateDatabase::ReadWrite, NULL }, { "listFilter3", "/p>1,+rabbit, # busy rabbit", true, StateDatabase::ReadWrite, NULL }, { "listFilter4", "/-j,+r,-f,s=2,+t,vt=2, # ducati", true, StateDatabase::ReadWrite, NULL }, { "listFilter5", "/vt=3,+t,Rm<1, # three-way", true, StateDatabase::ReadWrite, NULL }, { "listFilter6", "/d)replay, # replay servers", true, StateDatabase::ReadWrite, NULL }, { "listFilter7", "/a]\\.bz(:[0-9]+)?$, # .bz servers", true, StateDatabase::ReadWrite, NULL }, { "listFilter8", "/d)louman/d)ahs3/d)spazzy, # fancy maps", true, StateDatabase::ReadWrite, NULL }, { "listFilter9", "/d]louman|ahs3|spazzy, # fancy maps2", true, StateDatabase::ReadWrite, NULL }, // We don't want to keep the geometry settings { "geometry", "", false, StateDatabase::ReadWrite, NULL } }; void loadBZDBDefaults ( void ) { for (int i = 0; i < (int)countof(defaultDBItems); ++i) { assert(defaultDBItems[i].name != NULL); if (defaultDBItems[i].value != NULL) { BZDB.set(defaultDBItems[i].name, defaultDBItems[i].value); BZDB.setDefault(defaultDBItems[i].name, defaultDBItems[i].value); } BZDB.setPersistent(defaultDBItems[i].name, defaultDBItems[i].persistent); BZDB.setPermission(defaultDBItems[i].name, defaultDBItems[i].permission); BZDB.addCallback(defaultDBItems[i].name, defaultDBItems[i].callback, NULL); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/defaultBZDB.h000066400000000000000000000020031200563112200177250ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * defaultBZDB.h: * defaults for the BZDB */ #ifndef __DEFAULT_BZDB_H__ #define __DEFAULT_BZDB_H__ #include "StateDatabase.h" // default database entries struct DefaultDBItem { const char* name; const char* value; bool persistent; StateDatabase::Permission permission; StateDatabase::Callback callback; }; extern DefaultDBItem defaultDBItems[]; void loadBZDBDefaults ( void ); #endif // __DEFAULT_BZDB_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/effectsRenderer.cxx000066400000000000000000001144531200563112200213350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "effectsRenderer.h" // common impl headers #include "TextureManager.h" #include "StateDatabase.h" #include "TimeKeeper.h" #include "Flag.h" #include "playing.h" class StdSpawnEffect : public BasicEffect { public: StdSpawnEffect(); virtual ~StdSpawnEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class ConeSpawnEffect : public StdSpawnEffect { public: virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); }; class RingSpawnEffect : public StdSpawnEffect { public: RingSpawnEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); private: void drawRing(int n, float coreAlpha); float maxZ; float ringRange; float numRings; }; class StdShotEffect : public BasicEffect { public: StdShotEffect(); virtual ~StdShotEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class FlashShotEffect : public StdShotEffect { public: FlashShotEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); private: float length; }; class RingsDeathEffect : public DeathEffect { public: RingsDeathEffect(); virtual ~RingsDeathEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class SquishDeathEffect : public DeathEffect { public: SquishDeathEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); virtual bool SetDeathRenderParams ( TankDeathOverride::DeathParams ¶ms); virtual bool GetDeathVector( fvec3 & v ); virtual bool ShowExplosion ( void ){return false;} protected: }; class FadeToHeaven : public DeathEffect { public: FadeToHeaven(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); virtual bool SetDeathRenderParams ( TankDeathOverride::DeathParams ¶ms); virtual bool GetDeathVector( fvec3 & v ); virtual bool ShowExplosion ( void ){return false;} protected: float vertDist; bool done; }; class SpikesDeathEffect : public DeathEffect { public: SpikesDeathEffect(); virtual ~SpikesDeathEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState spikeState; OpenGLGState smokeState; class Spike { public: float size; fvec2 rots; float alphaMod; }; std::vector Spikes; std::vector Puffs; float explodeFraction; }; class StdLandEffect : public BasicEffect { public: StdLandEffect(); virtual ~StdLandEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class StdGMPuffEffect : public BasicEffect { public: StdGMPuffEffect(); virtual ~StdGMPuffEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class SmokeGMPuffEffect : public BasicEffect { public: SmokeGMPuffEffect(); virtual ~SmokeGMPuffEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; fvec3 jitter; float u,v,du,dv; }; class StdRicoEffect : public BasicEffect { public: StdRicoEffect(); virtual ~StdRicoEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; class StdShotTeleportEffect : public BasicEffect { public: StdShotTeleportEffect(); virtual ~StdShotTeleportEffect(); virtual bool update ( float time ); virtual void draw ( const SceneRenderer& sr ); protected: int texture; OpenGLGState ringState; float radius; }; template <> EffectsRenderer* Singleton::_instance = (EffectsRenderer*)0; // utils for geo static void drawRingYZ(float rad, float z, float topsideOffset = 0, float bottomUV = 0, float ZOffset = 0, float topUV = 1.0f, int segments = 32); static void drawRingXY(float rad, float z, float topsideOffset = 0, float bottomUV = 0, float topUV = 1.0f, int segments = 32); static void RadialToCartesian(float angle, float rad, float *pos); #define deg2Rad 0.017453292519943295769236907684886f EffectsRenderer::EffectsRenderer() { } EffectsRenderer::~EffectsRenderer() { for ( unsigned int i = 0; i < effectsList.size(); i++ ) delete(effectsList[i]); effectsList.clear(); } void EffectsRenderer::init(void) { for ( unsigned int i = 0; i < effectsList.size(); i++ ) delete(effectsList[i]); effectsList.clear(); } void EffectsRenderer::update(void) { tvEffectsList::iterator itr = effectsList.begin(); float time = (float)TimeKeeper::getCurrent().getSeconds(); while ( itr != effectsList.end() ) { if ( (*itr)->update(time) ) { delete((*itr)); itr = effectsList.erase(itr); } else ++itr; } } void EffectsRenderer::draw(const SceneRenderer& sr) { // really should check here for only the things that are VISIBILE!!! for ( unsigned int i = 0; i < effectsList.size(); i++ ) effectsList[i]->draw(sr); } void EffectsRenderer::freeContext(void) { for ( unsigned int i = 0; i < effectsList.size(); i++ ) effectsList[i]->freeContext(); } void EffectsRenderer::rebuildContext(void) { for ( unsigned int i = 0; i < effectsList.size(); i++ ) effectsList[i]->rebuildContext(); } void EffectsRenderer::addSpawnEffect ( const float* rgb, const float* pos ) { if (!BZDB.isTrue("useFancyEffects")) return; int flashType = static_cast(BZDB.eval("spawnEffect")); if (flashType == 0) return; BasicEffect *effect = NULL; switch(flashType) { case 1: effect = new StdSpawnEffect; break; case 2: effect = new ConeSpawnEffect; break; case 3: effect = new RingSpawnEffect; break; } if (effect) { effect->setPos(pos,NULL); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); effect->setColor(rgb); effectsList.push_back(effect); } } std::vector EffectsRenderer::getSpawnEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Blossom")); ret.push_back(std::string("Cone")); ret.push_back(std::string("Rings")); return ret; } void EffectsRenderer::addShotEffect ( const float* rgb, const float* pos, float rot, const float *vel, int _type) { if (!BZDB.isTrue("useFancyEffects")) return; int flashType = _type; if (flashType < 0) flashType = static_cast(BZDB.eval("shotEffect")); if (flashType == 0) return; float rots[3] = {0}; rots[2] = rot; BasicEffect *effect = NULL; switch(flashType) { case 1: effect = new StdShotEffect; break; case 2: effect = new FlashShotEffect; break; case 3: // composite effect addShotEffect(rgb, pos, rot, vel,1); addShotEffect(rgb, pos, rot, vel,2); break; } if (effect) { effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); if (BZDB.isTrue("useVelOnShotEffects")) effect->setVel(vel); effect->setColor(rgb); effectsList.push_back(effect); } } std::vector EffectsRenderer::getShotEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Smoke Rings")); ret.push_back(std::string("Muzzle Flash")); ret.push_back(std::string("Smoke and Flash")); return ret; } void EffectsRenderer::addGMPuffEffect ( const float* pos, float rot[2], const float* vel) { if (!BZDB.isTrue("useFancyEffects")) return; int flashType = static_cast(BZDB.eval("gmPuffEffect")); if (flashType == 0) return; float rots[3] = {0}; rots[2] = rot[0]; rots[1] = rot[1]; BasicEffect *effect = NULL; switch(flashType) { case 1: // handled outside this manager in the "old" code break; case 2: effect = new StdGMPuffEffect; break; case 3: effect = new SmokeGMPuffEffect; break; } if (effect) { effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); if (BZDB.isTrue("useVelOnShotEffects")) effect->setVel(vel); effectsList.push_back(effect); } } std::vector EffectsRenderer::getGMPuffEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Classic Puff")); ret.push_back(std::string("Shock Cone")); ret.push_back(std::string("Smoke")); return ret; } DeathEffect* EffectsRenderer::addDeathEffect (const float *rgb, const float *pos, float rot, int, Player* player, FlagType *) { if (!BZDB.isTrue("useFancyEffects")) return NULL; int effectType = static_cast(BZDB.eval("deathEffect")); if (effectType == 0) return NULL; DeathEffect *effect = NULL; float rots[3] = {0}; rots[2] = rot; // if (reason == GotKilledMsg) // effect = new FadeToHeaven(); // else if (reason == GotRunOver || flag == Flags::Steamroller) // effect = new SquishDeathEffect; // else if (flag == Flags::GuidedMissile) // effect = new SpikesDeathEffect; // else effect = new RingsDeathEffect; if (effect) { effect->setPlayer(player); effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); effect->setColor(rgb); effectsList.push_back(effect); } return effect; } std::vector EffectsRenderer::getDeathEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Fancy Deaths")); return ret; } // landing effects void EffectsRenderer::addLandEffect ( const float* rgb, const float* pos, float rot ) { if (!BZDB.isTrue("useFancyEffects")) return; int effectType = static_cast(BZDB.eval("landEffect")); if (effectType == 0) return; BasicEffect *effect = NULL; float rots[3] = {0}; rots[2] = rot; switch(effectType) { case 1: effect = new StdLandEffect; break; } if (effect) { effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); effect->setColor(rgb); effectsList.push_back(effect); } } std::vector EffectsRenderer::getLandEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Dirt Flash")); return ret; } void EffectsRenderer::addRicoEffect ( const float* pos, float rot[2], const float* vel) { if (!BZDB.isTrue("useFancyEffects")) return; int flashType = static_cast(BZDB.eval("ricoEffect")); if (flashType == 0) return; float rots[3] = {0}; rots[2] = rot[0]; rots[1] = rot[1]; BasicEffect *effect = NULL; switch(flashType) { case 1: effect = new StdRicoEffect; break; } if (effect) { effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); if (BZDB.isTrue("useVelOnShotEffects")) effect->setVel(vel); effectsList.push_back(effect); } } std::vector EffectsRenderer::getRicoEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("Off")); ret.push_back(std::string("Ring")); // ret.push_back(std::string("Sparks")); return ret; } void EffectsRenderer::addShotTeleportEffect ( const float* pos, float rot[2], const float* vel) { if (!BZDB.isTrue("useFancyEffects")) return; int flashType = static_cast(BZDB.eval("tpEffect")); if (flashType == 0) return; float rots[3] = {0}; rots[2] = rot[0]; rots[1] = rot[1]; BasicEffect *effect = NULL; switch(flashType) { case 1: effect = new StdShotTeleportEffect; break; } if (effect) { effect->setPos(pos,rots); effect->setStartTime((float)TimeKeeper::getCurrent().getSeconds()); if (BZDB.isTrue("useVelOnShotEffects")) effect->setVel(vel); effectsList.push_back(effect); } } std::vector EffectsRenderer::getShotTeleportEffectTypes ( void ) { std::vector ret; ret.push_back(std::string("None")); ret.push_back(std::string("IDL")); // ret.push_back(std::string("Sparks")); return ret; } //****************** effects base class******************************* BasicEffect::BasicEffect(): age() { position[0] = position[1] = position[2] = 0.0f; rotation[0] = rotation[1] = rotation[2] = 0.0f; velocity[0] = velocity[1] = velocity[2] = 0.0f; color[0] = color[1] = color[2] = 0.0f; startTime = (float)TimeKeeper::getCurrent().getSeconds(); lifetime = 0; lastTime = startTime; deltaTime = 0; lifeParam = 1.0; } void BasicEffect::setPos ( const float *pos, const float *rot ) { if (pos) { position[0] = pos[0]; position[1] = pos[1]; position[2] = pos[2]; } if (rot) { rotation[0] = rot[0]; rotation[1] = rot[1]; rotation[2] = rot[2]; } } void BasicEffect::setVel ( const float *vel ) { if (vel) { velocity[0] = vel[0]; velocity[1] = vel[1]; velocity[2] = vel[2]; } } void BasicEffect::setColor ( const float *rgb ) { color[0] = rgb[0]; color[1] = rgb[1]; color[2] = rgb[2]; } void BasicEffect::setStartTime ( float time ) { startTime = time; lastTime = time; deltaTime = 0; } bool BasicEffect::update( float time ) { age = time - startTime; if ( age >= lifetime) return true; deltaTime = time - lastTime; lastTime = time; if (lifetime != 0 && age != 0) lifeParam = age/lifetime; return false; } //******************StdSpawnEffect**************** StdSpawnEffect::StdSpawnEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("blend_flash",false); lifetime = 2.0f; radius = 1.75f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdSpawnEffect::~StdSpawnEffect() { } bool StdSpawnEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*5; return false; } void StdSpawnEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]+0.1f); ringState.setState(); float ageParam = age/lifetime; glColor4f(color[0],color[1],color[2],1.0f-(age/lifetime)); glDepthMask(0); drawRingXY(radius*0.1f,2.5f+(age*2)); drawRingXY(radius*0.5f,1.5f + (ageParam/1.0f * 2),0.5f,0.5f); drawRingXY(radius,2); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************ConeSpawnEffect**************** bool ConeSpawnEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*5; return false; } void ConeSpawnEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]+0.1f); ringState.setState(); glColor4f(color[0],color[1],color[2],1.0f-(age/lifetime)); glDepthMask(0); drawRingXY(radius*0.5f,1.25f); glTranslatef(0,0,2); drawRingXY(radius*0.6f,1.5f); glTranslatef(0,0,2); drawRingXY(radius*0.75f,1.75f); glTranslatef(0,0,2); drawRingXY(radius*0.85f,1.89f); glTranslatef(0,0,2); drawRingXY(radius,2.0f); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************RingSpawnEffect**************** RingSpawnEffect::RingSpawnEffect(): ringRange(), numRings() { radius = 4.0f; maxZ = 10.0f; } bool RingSpawnEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage return false; } void RingSpawnEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]); ringState.setState(); glDepthMask(0); ringRange = lifetime / 4.0f; // first 3/4ths of the life are rings, last is fade ringRange = (ringRange * 3) / 4.0f; // of the ring section there are 4 ring segments const float bigRange = ringRange * 3; float coreAlpha = 1; if (age >= bigRange) coreAlpha = 1.0f - ((age - bigRange) / (lifetime - bigRange)); for (int n = 0; n < 4; ++n) drawRing(n, coreAlpha); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } void RingSpawnEffect::drawRing(int n, float coreAlpha) { float posZ; float alpha; if (age <= (ringRange * (n-1))) // this ring in? return; if (age < ringRange * n) { // the ring is still coming in posZ = maxZ - ((age - ringRange * (n-1)) / ringRange) * (maxZ - n * 2.5f); alpha = (age - ringRange) / (ringRange * n); } else { posZ = n * 2.5f; alpha = coreAlpha; } glPushMatrix(); glTranslatef(0, 0, posZ); glColor4f(color[0], color[1], color[2], alpha); drawRingXY(radius, 2.5f * n); glPopMatrix(); } //******************StdShotEffect**************** StdShotEffect::StdShotEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("blend_flash",false); lifetime = 1.5f; radius = 0.125f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdShotEffect::~StdShotEffect() { } bool StdShotEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*6; return false; } void StdShotEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0],pos[1],pos[2]); glRotatef(180+rotation[2]/deg2Rad,0,0,1); ringState.setState(); color[0] = color[1] = color[2] = 1; float alpha = 0.5f-(age/lifetime); if (alpha < 0.001f) alpha = 0.001f; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); drawRingYZ(radius,0.5f /*+ (age * 0.125f)*/,1.0f+age*5,0.65f,pos[2]); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************FlashShotEffect**************** FlashShotEffect::FlashShotEffect() : StdShotEffect(), length() { // we use the jump jet texture upside-down to get a decent muzzle flare effect texture = TextureManager::instance().getTextureID("jumpjets",false); lifetime = 0.75f; radius = 0.5f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } bool FlashShotEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if (BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage if (age < lifetime / 2) length = 6 * (age / lifetime); else length = 6 * (1 - (age / lifetime)); return false; } void FlashShotEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0],pos[1],pos[2]); glRotatef(270+rotation[2]/deg2Rad,0,0,1); ringState.setState(); color[0] = color[1] = color[2] = 1; float alpha = 0.8f-(age/lifetime); if (alpha < 0.001f) alpha = 0.001f; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); // draw me here glBegin(GL_QUADS); // side 1 glTexCoord2f(0,1); glVertex3f(0,0,radius); glTexCoord2f(0,0); glVertex3f(0,length,radius); glTexCoord2f(1,0); glVertex3f(0,length,-radius); glTexCoord2f(1,1); glVertex3f(0,0,-radius); // side 2 glTexCoord2f(0,0); glVertex3f(0,0,-radius); glTexCoord2f(0,1); glVertex3f(0,length,-radius); glTexCoord2f(1,1); glVertex3f(0,length,radius); glTexCoord2f(1,0); glVertex3f(0,0,radius); glEnd(); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************SquishDeathEffect**************** SquishDeathEffect::SquishDeathEffect() : DeathEffect() { lifetime = 10.0f; } bool SquishDeathEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; return false; } void SquishDeathEffect::draw ( const SceneRenderer& UNUSED(sr) ) {} bool SquishDeathEffect::SetDeathRenderParams (TankDeathOverride::DeathParams ¶ms) { params.scale = fvec3(1,1,0); params.pos = fvec3(0,0,0.1f); return true; } bool SquishDeathEffect::GetDeathVector( fvec3 & vel ) { if (!player) return false; const float *v = player->getVelocity(); vel = fvec3(v[0],v[1],v[2]); return true; } //******************FadeToHeaven**************** FadeToHeaven::FadeToHeaven() : DeathEffect() { lifetime = BZDB.eval(StateDatabase::BZDB_EXPLODETIME); vertDist = 5.0; done = false; } bool FadeToHeaven::update ( float time ) { if (!done) return true; // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; return false; } void FadeToHeaven::draw ( const SceneRenderer& UNUSED(sr) ) { } bool FadeToHeaven::SetDeathRenderParams (TankDeathOverride::DeathParams ¶ms) { done = params.explodeParam < 0.0001f; params.color[3] = params.explodeParam; params.pos = fvec3(0,0,vertDist*params.explodeParam); return true; } bool FadeToHeaven::GetDeathVector( fvec3 & vel ) { if (!player) return false; vel = fvec3(0,0,0); return true; } //******************RingsDeathEffect**************** RingsDeathEffect::RingsDeathEffect() : DeathEffect() { texture = TextureManager::instance().getTextureID("blend_flash",false); lifetime = 1.5f; radius = 2.0f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } RingsDeathEffect::~RingsDeathEffect() { } bool RingsDeathEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*20; return false; } void RingsDeathEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]); glRotatef(180+rotation[2]/deg2Rad,0,0,1); ringState.setState(); color[0] = 108.0f/256.0f; color[1] = 16.0f/256.0f; color[2] = 16.0f/256.0f; float deltas[3]; deltas[0] = 1.0f - color[0]; deltas[1] = 1.0f - color[1]; deltas[2] = 1.0f - color[2]; float ageParam = age/lifetime; float alpha = 1.0f-(ageParam*0.5f); if (alpha < 0.005f) alpha = 0.005f; color[0] += deltas[0] *ageParam; color[1] += deltas[1] *ageParam; color[2] += deltas[2] *ageParam; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); glPushMatrix(); glTranslatef(0,0,0.5f); drawRingXY(radius*0.75f,1.5f + (ageParam/1.0f * 10),0.5f*age,0.5f); drawRingXY(radius,-0.5f,0.5f+ age,0.5f); glTranslatef(-1.5,0,0); glRotatef(90,0,0,1); drawRingYZ(radius,3,0,0,position[2]+0.5f); glPopMatrix(); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************SpikesDeathEffect**************** SpikesDeathEffect::SpikesDeathEffect() : DeathEffect() { texture = TextureManager::instance().getTextureID("puff",false); lifetime = 4.5f; explodeFraction = 0.5f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); spikeState = gstate.getState(); if (texture >-1) gstate.setTexture(texture); smokeState = gstate.getState(); int spikes = (int)((bzfrand() * 25)) + 10; for ( int i = 0; i < spikes; i++) { Spike s; s.alphaMod = ((float)bzfrand() * 0.5f) + 0.5f; s.size = ((float)bzfrand() * 1.5f) + 0.5f; s.rots = fvec2((float)bzfrand()* 360.0f,(float)bzfrand() * 180.0f); Spikes.push_back(s); } int puffs = (int)((bzfrand() * 25)) + 10; for ( int i = 0; i < puffs; i++) Puffs.push_back(fvec3((float)bzfrand()*4-2,(float)bzfrand()*4-2,(float)bzfrand()*2)); } SpikesDeathEffect::~SpikesDeathEffect() { } bool SpikesDeathEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage return false; } void SpikesDeathEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]); glRotatef(180+rotation[2]/deg2Rad,0,0,1); color[0] = 108.0f/256.0f; color[1] = 16.0f/256.0f; color[2] = 16.0f/256.0f; /*float deltas[3]; deltas[0] = 1.0f - color[0]; deltas[1] = 1.0f - color[1]; deltas[2] = 1.0f - color[2]; float ageParam = age/lifetime; float alpha = 1.0f-(ageParam*0.5f); if (alpha < 0.005f) alpha = 0.005f; color[0] += deltas[0] *ageParam; color[1] += deltas[1] *ageParam; color[2] += deltas[2] *ageParam; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); glPushMatrix(); glTranslatef(0,0,0.5f); drawRingXY(radius*0.75f,1.5f + (ageParam/1.0f * 10),0.5f*age,0.5f); drawRingXY(radius,-0.5f,0.5f+ age,0.5f); glTranslatef(-1.5,0,0); glRotatef(90,0,0,1); drawRingYZ(radius,3,0,0,position[2]+0.5f); glPopMatrix(); glColor4f(1,1,1,1); glDepthMask(1);*/ glPopMatrix(); } //******************StdLandEffect**************** StdLandEffect::StdLandEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("dusty_flare",false); lifetime = 1.0f; radius = 2.5f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdLandEffect::~StdLandEffect() { } bool StdLandEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime * 3.5f; return false; } void StdLandEffect::draw(const SceneRenderer &) { glPushMatrix(); glTranslatef(position[0],position[1],position[2]); ringState.setState(); color[0] = 1; color[1] = 1; color[2] = 1; glColor4f(color[0],color[1],color[2],1.0f-(age/lifetime)); glDepthMask(0); drawRingXY(radius,0.5f + age,0.05f*radius,0.0f,0.9f); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************StdGMPuffEffect**************** StdGMPuffEffect::StdGMPuffEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("blend_flash",false); lifetime = 6.5f; radius = 0.125f; if (RENDERER.useQuality() >= 3) radius = 0.001f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdGMPuffEffect::~StdGMPuffEffect() { } bool StdGMPuffEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*0.5f; return false; } void StdGMPuffEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0],pos[1],pos[2]); glRotatef(180+rotation[2]/deg2Rad,0,0,1); glRotatef(rotation[1]/deg2Rad,0,1,0); ringState.setState(); color[0] = color[1] = color[2] = 1; float alpha = 0.5f-(age/lifetime); if (alpha < 0.000001f) alpha = 0.000001f; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); drawRingYZ(radius,-0.25f -(age * 0.125f),0.5f+age*0.75f,0.50f,pos[2]); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************StdGMPuffEffect**************** SmokeGMPuffEffect::SmokeGMPuffEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("puffs",false); lifetime = 3.5f; radius = 0.125f; if (RENDERER.useQuality() >= 3) radius = 0.001f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); float randMod = 0.5f; jitter.x = ((float)bzfrand() * (randMod*2)) - randMod; jitter.y = ((float)bzfrand() * (randMod*2)) - randMod; jitter.z = ((float)bzfrand() * (randMod*2)) - randMod; du = dv = 0.5f; if (bzfrand() < 0.5) u = 0; else u = 0.5f; if (bzfrand() < 0.5) v = 0; else v = 0.5f; } SmokeGMPuffEffect::~SmokeGMPuffEffect() { } bool SmokeGMPuffEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*0.5f; return false; } void QuadGuts ( float u0, float v0, float u1, float v1, float h, float v) { glTexCoord2f(u0, v0); glVertex2f(-h, -v); glTexCoord2f(u1, v0); glVertex2f(+h, -v); glTexCoord2f(u1, v1); glVertex2f(+h, +v); glTexCoord2f(u0, v1); glVertex2f(-h, +v); } void DrawTextureQuad ( float u0, float v0, float u1, float v1, float h, float v) { glBegin(GL_QUADS); QuadGuts(u0,v0,u1,v1,h,v); glEnd(); } void SmokeGMPuffEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; float vertDrift = 1.5f * age; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0]+jitter.x,pos[1]+jitter.y,pos[2]+jitter.z+vertDrift); glPushMatrix(); RENDERER.getViewFrustum().executeBillboard(); glRotatef(age*180,0,0,1); ringState.setState(); glColor4f(1,1,1,1); color[0] = color[1] = color[2] = 1; float alpha = 0.5f-(age/lifetime); if (alpha < 0.000001f) alpha = 0.000001f; glColor4f(1,1,1,alpha); glDepthMask(0); float size = 0.5f + (age * 1.25f); DrawTextureQuad ( (float)u, (float)v, (float)u + du, (float)v + dv, size, size); glPopMatrix(); glDepthMask(1); glPopMatrix(); } //******************StdRicoEffect**************** StdRicoEffect::StdRicoEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("blend_flash",false); lifetime = 0.5f; radius = 0.25f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdRicoEffect::~StdRicoEffect() { } bool StdRicoEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage radius += deltaTime*6.5f; return false; } void StdRicoEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0],pos[1],pos[2]); glRotatef((rotation[2]/deg2Rad)+180,0,0,1); glRotatef(rotation[1]/deg2Rad,0,1,0); ringState.setState(); color[0] = color[1] = color[2] = 1; float alpha = 0.5f-(age/lifetime); if (alpha < 0.000001f) alpha = 0.000001f; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); drawRingYZ(radius,-0.5f,0.5f,0.50f,pos[2]); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************StdShotTeleportEffect**************** StdShotTeleportEffect::StdShotTeleportEffect() : BasicEffect() { texture = TextureManager::instance().getTextureID("dusty_flare",false); lifetime = 4.0f; radius = 0.25f; OpenGLGStateBuilder gstate; gstate.reset(); gstate.setShading(); gstate.setBlending((GLenum) GL_SRC_ALPHA,(GLenum) GL_ONE_MINUS_SRC_ALPHA); gstate.setAlphaFunc(); if (texture >-1) gstate.setTexture(texture); ringState = gstate.getState(); } StdShotTeleportEffect::~StdShotTeleportEffect() { } bool StdShotTeleportEffect::update ( float time ) { // see if it's time to die // if not update all those fun times if ( BasicEffect::update(time)) return true; // nope it's not. // we live another day // do stuff that maybe need to be done every time to animage //radius += deltaTime*6.5f; return false; } void StdShotTeleportEffect::draw(const SceneRenderer &) { glPushMatrix(); float pos[3]; pos[0] = position[0] + velocity[0] * age; pos[1] = position[1] + velocity[1] * age; pos[2] = position[2] + velocity[2] * age; glTranslatef(pos[0],pos[1],pos[2]); glRotatef((rotation[2]/deg2Rad),0,0,1); glRotatef(rotation[1]/deg2Rad,0,1,0); glRotatef(age*90,1,0,0); ringState.setState(); color[0] = color[1] = color[2] = 1; float alpha = 1.0f; glColor4f(color[0],color[1],color[2],alpha); glDepthMask(0); float mod = age-(int)age; mod -= 0.5f; drawRingYZ(radius,0.5f + mod*0.5f,0.125f,0.00f,pos[2],0.8f,6); glColor4f(1,1,1,1); glDepthMask(1); glPopMatrix(); } //******************************** geo utiliys******************************** static void RadialToCartesian(float angle, float rad, float *pos) { pos[0] = sinf(angle*deg2Rad)*rad; pos[1] = cosf(angle*deg2Rad)*rad; } static void drawRingXY(float rad, float z, float topsideOffset, float bottomUV, float topUV, int segments ) { for ( int i = 0; i < segments; i ++) { float thisAng = 360.0f/segments * i; float nextAng = 360.0f/segments * (i+1); if ( i+1 >= segments ) nextAng = 0; float thispos[2]; float nextPos[2]; float thispos2[2]; float nextPos2[2]; float thisNormal[3] = {0}; float nextNormal[3] = {0}; RadialToCartesian(thisAng,rad,thispos); RadialToCartesian(thisAng,1,thisNormal); RadialToCartesian(nextAng,rad,nextPos); RadialToCartesian(nextAng,1,nextNormal); RadialToCartesian(thisAng,rad+topsideOffset,thispos2); RadialToCartesian(nextAng,rad+topsideOffset,nextPos2); glBegin(GL_QUADS); // the "inside" glNormal3f(-thisNormal[0],-thisNormal[1],-thisNormal[2]); glTexCoord2f(0,bottomUV); glVertex3f(thispos[0],thispos[1],0); glNormal3f(-nextNormal[0],-nextNormal[1],-nextNormal[2]); glTexCoord2f(1,bottomUV); glVertex3f(nextPos[0],nextPos[1],0); glNormal3f(-nextNormal[0],-nextNormal[1],-nextNormal[2]); glTexCoord2f(1,topUV); glVertex3f(nextPos2[0],nextPos2[1],z); glNormal3f(-thisNormal[0],-thisNormal[1],-thisNormal[2]); glTexCoord2f(0,topUV); glVertex3f(thispos2[0],thispos2[1],z); // the "outside" glNormal3f(thisNormal[0],thisNormal[1],thisNormal[2]); glTexCoord2f(0,topUV); glVertex3f(thispos2[0],thispos2[1],z); glNormal3f(nextNormal[0],nextNormal[1],nextNormal[2]); glTexCoord2f(1,topUV); glVertex3f(nextPos2[0],nextPos2[1],z); glNormal3f(nextNormal[0],nextNormal[1],nextNormal[2]); glTexCoord2f(1,bottomUV); glVertex3f(nextPos[0],nextPos[1],0); glNormal3f(thisNormal[0],thisNormal[1],thisNormal[2]); glTexCoord2f(0,bottomUV); glVertex3f(thispos[0],thispos[1],0); glEnd(); } } static float clampedZ(float z, float offset) { if ( z +offset > 0.0f) return z; return -offset; } static void drawRingYZ(float rad, float z, float topsideOffset, float bottomUV, float ZOffset, float topUV, int segments) { for ( int i = 0; i < segments; i ++) { float thisAng = 360.0f/segments * i; float nextAng = 360.0f/segments * (i+1); if ( i+1 >= segments ) nextAng = 0; float thispos[2]; float nextPos[2]; float thispos2[2]; float nextPos2[2]; float thisNormal[3] = {0}; float nextNormal[3] = {0}; RadialToCartesian(thisAng,rad,thispos); RadialToCartesian(thisAng,1,thisNormal); RadialToCartesian(nextAng,rad,nextPos); RadialToCartesian(nextAng,1,nextNormal); RadialToCartesian(thisAng,rad+topsideOffset,thispos2); RadialToCartesian(nextAng,rad+topsideOffset,nextPos2); glBegin(GL_QUADS); // the "inside" glNormal3f(-thisNormal[0],-thisNormal[1],-thisNormal[2]); glTexCoord2f(0,bottomUV); glVertex3f(0,thispos[1],clampedZ(thispos[0],ZOffset)); glNormal3f(-nextNormal[0],-nextNormal[1],-nextNormal[2]); glTexCoord2f(1,bottomUV); glVertex3f(0,nextPos[1],clampedZ(nextPos[0],ZOffset)); glNormal3f(-nextNormal[0],-nextNormal[1],-nextNormal[2]); glTexCoord2f(1,topUV); glVertex3f(z,nextPos2[1],clampedZ(nextPos2[0],ZOffset)); glNormal3f(-thisNormal[0],-thisNormal[1],-thisNormal[2]); glTexCoord2f(0,topUV); glVertex3f(z,thispos2[1],clampedZ(thispos2[0],ZOffset)); // the "outside" glNormal3f(thisNormal[0],thisNormal[1],thisNormal[2]); glTexCoord2f(0,topUV); glVertex3f(z,thispos2[1],clampedZ(thispos2[0],ZOffset)); glNormal3f(nextNormal[0],nextNormal[1],nextNormal[2]); glTexCoord2f(1,topUV); glVertex3f(z,nextPos2[1],clampedZ(nextPos2[0],ZOffset)); glNormal3f(nextNormal[0],nextNormal[1],nextNormal[2]); glTexCoord2f(1,bottomUV); glVertex3f(0,nextPos[1],clampedZ(nextPos[0],ZOffset)); glNormal3f(thisNormal[0],thisNormal[1],thisNormal[2]); glTexCoord2f(0,bottomUV); glVertex3f(0,thispos[1],clampedZ(thispos[0],ZOffset)); glEnd(); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/effectsRenderer.h000066400000000000000000000076411200563112200207620ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * EffectsRenderer: * Encapsulates rendering of effects ( spawn flashes, sparks, explosions, etc...) * */ #ifndef BZF_EFFECTS_RENDERER_H #define BZF_EFFECTS_RENDERER_H #include "common.h" /* system headers */ #include #include /* common interface headers */ #include "OpenGLGState.h" #include "SceneRenderer.h" #include "Singleton.h" #include "TankSceneNode.h" #include "Flag.h" #include "Player.h" #define EFFECTS (EffectsRenderer::instance()) class BasicEffect { public: BasicEffect(); virtual ~BasicEffect(){}; virtual void setPos ( const float *pos, const float *rot ); virtual void setVel ( const float *vel ); virtual void setColor( const float *rgb ); virtual void setStartTime ( float time ); virtual void freeContext(void){}; virtual void rebuildContext(void){}; virtual bool update ( float time ); virtual void draw(const SceneRenderer &) {}; protected: float position[3]; float rotation[3]; float velocity[3]; float color[3]; float startTime; float lifetime; float lastTime; float deltaTime; float age; float lifeParam; }; class DeathEffect : public BasicEffect, public TankDeathOverride { public: DeathEffect() : BasicEffect(),TankDeathOverride(),player(NULL) {}; virtual ~DeathEffect(){/*if(player)player->setDeathEffect(NULL)*/;} virtual bool SetDeathRenderParams ( TankDeathOverride::DeathParams &UNUSED(params) ){return false;} virtual bool ShowExplosion ( void ){return true;} virtual bool GetDeathVector ( fvec3 &UNUSED(vel) ){return false;} void setPlayer ( Player* p){player=p;} protected: Player *player; }; typedef std::vector tvEffectsList; class EffectsRenderer : public Singleton { public: // called once to setup the effects system void init(void); // called to update the various effects void update(void); // called to draw all the current effects void draw(const SceneRenderer& sr); // called when the GL lists need to be deleted void freeContext(void); // called when the GL lists need to be remade void rebuildContext(void); // spawn flashes void addSpawnEffect ( const float* rgb, const float* pos ); std::vector getSpawnEffectTypes ( void ); // shot flashes void addShotEffect ( const float* rgb, const float* pos, float rot, const float* vel = NULL, int _type = -1 ); std::vector getShotEffectTypes ( void ); // gm puffs void addGMPuffEffect ( const float* pos, float rot[2], const float* vel = NULL ); std::vector getGMPuffEffectTypes ( void ); // death effects DeathEffect* addDeathEffect ( const float* rgb, const float* pos, float rot, int reason, Player *player, FlagType* flag = NULL ); std::vector getDeathEffectTypes ( void ); // landing effects void addLandEffect ( const float* rgb, const float* pos, float rot ); std::vector getLandEffectTypes ( void ); // rico effect void addRicoEffect ( const float* pos, float rot[2], const float* vel = NULL ); std::vector getRicoEffectTypes ( void ); // shot teleport effect void addShotTeleportEffect ( const float* pos, float rot[2], const float* vel = NULL ); std::vector getShotTeleportEffectTypes ( void ); protected: friend class Singleton; protected: EffectsRenderer(); ~EffectsRenderer(); tvEffectsList effectsList; }; #endif // BZF_EFFECTS_RENDERER_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/motd.cxx000066400000000000000000000063031200563112200171640ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning( 4: 4786) #endif // interface header #include "motd.h" // system headers #include // common implementation headers #include "TextUtils.h" #include "AnsiCodes.h" #include "version.h" // local implementation headers #include "playing.h" #include "NewVersionMenu.h" #include "HUDDialogStack.h" typedef struct { std::string title; std::string date; std::string text; std::string version; } MOTD_message; static NewVersionMenu* nvMenu; void MessageOfTheDay::finalization(char *_data, unsigned int length, bool good) { unsigned int i; unsigned int j; std::vector messages; if (good) { std::string data(_data, length); // parse into messages std::vector lines = TextUtils::tokenize(data, "\n"); if (lines.size() % 4) { data = "MOTD contains unexpected data"; } else { for (i = 0; i < lines.size(); ++i) { MOTD_message msg; msg.title = lines[i++]; msg.date = lines[i++]; msg.text = lines[i++]; msg.version = lines[i].substr(lines[i].find(':') + 2); // backwards compatibility - if it's not a regex already, go by our old rules if (isdigit(msg.version[0])) { if (msg.version == "0.0") { msg.version = "[a-z0-9\\.-]*"; } else { msg.version.insert(0, "^"); msg.version += "[a-z0-9\\.-]*"; } } messages.push_back(msg); } } if (messages.empty()) { MOTD_message msg; msg.text = data; messages.push_back(msg); } } else { MOTD_message msg; msg.text = ""; msg.version = "[a-z0-9\\.-]*"; messages.push_back(msg); } regex_t re; std::vector msgs; for (i = 0; i < messages.size(); ++i) { if (regcomp(&re, messages[i].version.c_str(), REG_EXTENDED | REG_ICASE) == 0) { if (regexec(&re, getAppVersion(), 0, NULL, 0) == 0) { if (messages[i].title.substr(0, 9) == "UPGRADE: ") { // new version released. handle appropriately. std::string announce = messages[i].title.substr(9, messages[i].title.length() - 9); nvMenu = new NewVersionMenu(announce, messages[i].text, messages[i].date); HUDDialogStack::get()->push(nvMenu); } else { // standard MOTD msgs.push_back(messages[i].text); } } regfree(&re); } } controlPanel->addMessage(ColorStrings[UnderlineColor] + ColorStrings[WhiteColor] + "Message of the day: "); for (j = 0; j < msgs.size(); ++j) controlPanel->addMessage(ColorStrings[WhiteColor] + "* " + msgs[j]); } void MessageOfTheDay::getURL(const std::string &URL) { // get all up on the internet and go get the thing setURL(URL); addHandle(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/motd.h000066400000000000000000000017111200563112200166070ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __MOTD_H__ #define __MOTD_H__ // bzflag global header #include "common.h" // system interface header #include // common interface headers #include "cURLManager.h" class MessageOfTheDay : cURLManager { public: virtual void finalization(char *data, unsigned int length, bool good); void getURL(const std::string &URL); }; #endif //__MOTD_H__ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/playing.cxx000066400000000000000000006366671200563112200177120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "playing.h" // system includes #ifdef _WIN32 #include #include #include #include #else #include #include #include #include #include #endif #include // common headers #include "AccessList.h" #include "AnsiCodes.h" #include "AresHandler.h" #include "BackgroundRenderer.h" #include "BaseBuilding.h" #include "BillboardSceneNode.h" #include "BZDBCache.h" #include "BzfMedia.h" #include "bzsignal.h" #include "CommandsStandard.h" #include "DirectoryNames.h" #include "ErrorHandler.h" #include "FileManager.h" #include "FlagSceneNode.h" #include "GameTime.h" #include "KeyManager.h" #include "md5.h" #include "ObstacleList.h" #include "ObstacleMgr.h" #include "PhysicsDriver.h" #include "PlatformFactory.h" #include "QuadWallSceneNode.h" #include "ServerList.h" #include "SphereSceneNode.h" #include "TankGeometryMgr.h" #include "TextureManager.h" #include "TextUtils.h" #include "TimeBomb.h" #include "version.h" #include "WordFilter.h" #include "ZSceneDatabase.h" // local implementation headers #include "AutoPilot.h" #include "bzflag.h" #include "commands.h" #include "daylight.h" #include "Downloads.h" #include "effectsRenderer.h" #include "FlashClock.h" #include "ForceFeedback.h" #include "LocalPlayer.h" #include "HUDDialogStack.h" #include "HUDRenderer.h" #include "MainMenu.h" #include "motd.h" #include "RadarRenderer.h" #include "Roaming.h" #include "RobotPlayer.h" #include "Roster.h" #include "SceneBuilder.h" #include "ScoreboardRenderer.h" #include "sound.h" #include "ShotStats.h" #include "TrackMarks.h" #include "World.h" #include "WorldBuilder.h" #include "HUDui.h" #include "CollisionManager.h" #include //#include "messages.h" static const float FlagHelpDuration = 60.0f; StartupInfo startupInfo; static MainMenu* mainMenu; ServerLink* serverLink = NULL; static World *world = NULL; static LocalPlayer *myTank = NULL; static BzfDisplay* display = NULL; MainWindow* mainWindow = NULL; static SceneRenderer* sceneRenderer = NULL; ControlPanel* controlPanel = NULL; static RadarRenderer* radar = NULL; HUDRenderer* hud = NULL; static ScoreboardRenderer* scoreboard = NULL; static SceneDatabaseBuilder* sceneBuilder = NULL; static Team* teams = NULL; int numFlags = 0; static bool joinRequested = false; static bool waitingDNS = false; static bool serverError = false; static bool serverDied = false; bool fireButton = false; bool roamButton = false; static bool firstLife = false; static bool showFPS = false; static bool showDrawTime = false; bool pausedByUnmap = false; static bool unmapped = false; static int preUnmapFormat = -1; static double epochOffset; static double lastEpochOffset; float clockAdjust = 0.0f; float pauseCountdown = 0.0f; float destructCountdown = 0.0f; static float testVideoFormatTimer = 0.0f; static int testVideoPrevFormat = -1; static std::vector playingCallbacks; bool gameOver = false; static std::vector explosions; static std::vector prototypeExplosions; int savedVolume = -1; static bool grabMouseAlways = false; static FlashClock pulse; static bool wasRabbit = false; static bool justJoined = false; int sentForbidIdentify = 0; float roamDZoom = 0.0f; static MessageOfTheDay *motd = NULL; DefaultCompleter completer; char messageMessage[PlayerIdPLen + MessageLen]; double lastObserverUpdateTime = -1; static void setHuntTarget(); static void setTankFlags(); static void* handleMsgSetVars(void *msg); static void handlePlayerMessage(uint16_t, uint16_t, void*); static void handleFlagTransferred(Player* fromTank, Player* toTank, int flagIndex); static void enteringServer(void *buf); static void joinInternetGame2(); static void cleanWorldCache(); static void markOld(std::string &fileName); #ifdef ROBOT static void setRobotTarget(RobotPlayer* robot); #endif static ResourceGetter *resourceDownloader = NULL; // Far and Near Frustum clipping planes static const float FarPlaneScale = 1.5f; // gets multiplied by BZDB_WORLDSIZE static const float FarPlaneDefault = FarPlaneScale * 800.0f; static const float FarDeepPlaneScale = 10.0f; static const float FarDeepPlaneDefault = FarPlaneDefault * FarDeepPlaneScale; static const float NearPlaneNormal = 1.0f; static const float NearPlaneClose = 0.25f; // for drawing in the cockpit static bool FarPlaneCull = false; static float FarPlane = FarPlaneDefault; static float FarDeepPlane = FarDeepPlaneDefault; static float NearPlane = NearPlaneNormal; static bool leftMouseButton = false; static bool rightMouseButton = false; static bool middleMouseButton = false; static const char* blowedUpMessage[] = { NULL, "Got shot by ", "Got flattened by ", "Team flag was captured by ", "Teammate hit with Genocide by ", "Tank Self Destructed", "Tank Rusted" }; static bool gotBlowedUp(BaseLocalPlayer* tank, BlowedUpReason reason, PlayerId killer, const ShotPath *hit = NULL, int physicsDriver = -1); #ifdef ROBOT static void handleMyTankKilled(int reason); static ServerLink* robotServer[MAX_ROBOTS]; #endif static double userTimeEpochOffset; static bool entered = false; static bool joiningGame = false; static WorldBuilder *worldBuilder = NULL; static std::string worldUrl; static std::string worldCachePath; static std::string md5Digest; static uint32_t worldPtr = 0; static char *worldDatabase = NULL; static bool isCacheTemp; static std::ostream *cacheOut = NULL; static bool downloadingInitialTexture = false; static AresHandler* ares = NULL; void initGlobalAres() { ares = new AresHandler(0); } void killGlobalAres() { delete ares; ares = NULL; } static Address serverNetworkAddress = Address(); static AccessList ServerAccessList("ServerAccess.txt", NULL); // access silencePlayers from bzflag.cxx std::vector& getSilenceList() { return silencePlayers; } // try to select the next recipient in the specified direction // eventually avoiding robots void selectNextRecipient (bool forward, bool robotIn) { LocalPlayer *my = LocalPlayer::getMyTank(); const Player *recipient = my->getRecipient(); int rindex; if (!recipient) { rindex = - 1; forward = true; } else { const PlayerId id = recipient->getId(); rindex = lookupPlayerIndex(id); } int i = rindex; while (true) { if (forward) { i++; if (i == curMaxPlayers) { // if no old rec id we have just ended our search if (recipient == NULL) break; else // wrap around i = 0; } } else { if (i == 0) // wrap around i = curMaxPlayers; i--; } if (i == rindex) break; if (remotePlayers[i] && (robotIn || remotePlayers[i]->getPlayerType() == TankPlayer)) { my->setRecipient(remotePlayers[i]); break; } } } // // should we grab the mouse? // static void setGrabMouse(bool grab) { grabMouseAlways = grab; } bool shouldGrabMouse() { #if defined(_WIN32) && defined(DEBUG) return false; #endif return grabMouseAlways && !unmapped && (myTank == NULL || !myTank->isPaused() || myTank->isAutoPilot()); } // // some simple global functions // void warnAboutMainFlags() { // warning message for hidden flags if (!BZDBCache::displayMainFlags){ std::string showFlagsMsg = ColorStrings[YellowColor]; showFlagsMsg += "Flags on field hidden, to show them "; std::vector keys = KEYMGR.getKeysFromCommand("toggleFlags main", true); if (!keys.empty()) { showFlagsMsg += "hit \"" + ColorStrings[WhiteColor]; showFlagsMsg += tolower(keys[0][0]); showFlagsMsg += ColorStrings[YellowColor] + "\""; } else { showFlagsMsg += " bind a key to Toggle Flags on Field"; } addMessage(NULL, showFlagsMsg); } } void warnAboutRadarFlags() { if (!BZDB.isTrue("displayRadarFlags")){ std::string showFlagsMsg = ColorStrings[YellowColor]; showFlagsMsg += "Flags on radar hidden, to show them "; std::vector keys = KEYMGR.getKeysFromCommand("toggleFlags radar", true); if (keys.empty()) { showFlagsMsg += " bind a key to Toggle Flags on Radar"; } else { showFlagsMsg += "hit \"" + ColorStrings[WhiteColor]; showFlagsMsg += tolower(keys[0][0]); showFlagsMsg += ColorStrings[YellowColor] + "\""; } addMessage(NULL, showFlagsMsg); } } void warnAboutRadar() { if (!BZDB.isTrue("displayRadar")) { std::string message = ColorStrings[YellowColor]; message += "To toggle the radar "; std::vector keys = KEYMGR.getKeysFromCommand("toggleRadar", true); if (keys.empty()) { message += " bind a key to Toggle Radar"; } else { message += "hit \"" + ColorStrings[WhiteColor]; message += keys[0]; message += ColorStrings[YellowColor] + "\""; } addMessage(NULL, message); } } void warnAboutConsole() { if (!BZDB.isTrue("displayConsole")) { std::string message = ColorStrings[YellowColor]; message += "To toggle the console "; std::vector keys = KEYMGR.getKeysFromCommand("toggleConsole", true); if (keys.empty()) { message += " bind a key to Toggle Console"; } else { message += "hit \"" + ColorStrings[WhiteColor]; message += keys[0]; message += ColorStrings[YellowColor] + "\""; } // can't use a console message for this one hud->setAlert(3, message.c_str(), 2.0f, true); } } inline bool isViewTank(Player* tank) { return (((tank != NULL) && (tank == LocalPlayer::getMyTank())) || (ROAM.isRoaming() && (ROAM.getMode() == Roaming::roamViewFP) && (ROAM.getTargetTank() == tank))); } BzfDisplay* getDisplay() { return display; } MainWindow* getMainWindow() { return mainWindow; } SceneRenderer* getSceneRenderer() { return sceneRenderer; } void setSceneDatabase() { SceneDatabase *scene; // FIXME - test the zbuffer here // delete the old database sceneRenderer->setSceneDatabase(NULL); // make the scene, and record the processing time TimeKeeper startTime = TimeKeeper::getCurrent(); scene = sceneBuilder->make(world); float elapsed = float(TimeKeeper::getCurrent() - startTime); // print debugging info if (BZDBCache::zbuffer) { logDebugMessage(2,"ZSceneDatabase processed in %.3f seconds.\n", elapsed); } else { logDebugMessage(2,"BSPSceneDatabase processed in %.3f seconds.\n", elapsed); } // set the scene sceneRenderer->setSceneDatabase(scene); } StartupInfo* getStartupInfo() { return &startupInfo; } bool setVideoFormat(int index, bool test) { #if defined(_WIN32) // give windows extra time to test format (context reloading takes a while) static const float testDuration = 10.0f; #else static const float testDuration = 5.0f; #endif // ignore bad formats or when the format test timer is running if (testVideoFormatTimer != 0.0f || !display->isValidResolution(index)) return false; // ignore if no change if (display->getResolution() == index) return true; // change it testVideoPrevFormat = display->getResolution(); if (!display->setResolution(index)) return false; // handle resize mainWindow->setFullscreen(); mainWindow->getWindow()->callResizeCallbacks(); mainWindow->warpMouse(); if (test) testVideoFormatTimer = testDuration; else if (shouldGrabMouse()) mainWindow->grabMouse(); return true; } void addPlayingCallback(PlayingCallback cb, void* data) { PlayingCallbackItem item; item.cb = cb; item.data = data; playingCallbacks.push_back(item); } void removePlayingCallback(PlayingCallback _cb, void* data) { std::vector::iterator it = playingCallbacks.begin(); while (it != playingCallbacks.end()) { if (it->cb == _cb && it->data == data) { playingCallbacks.erase(it); break; } ++it; } } static void callPlayingCallbacks() { const int count = playingCallbacks.size(); for (int i = 0; i < count; i++) { const PlayingCallbackItem& cb = playingCallbacks[i]; (*cb.cb)(cb.data); } } void joinGame() { if (joiningGame) { if (worldBuilder) { delete worldBuilder; worldBuilder = NULL; } if (worldDatabase) { delete[] worldDatabase; worldDatabase = NULL; } HUDDialogStack::get()->setFailedMessage("Download stopped by user action"); joiningGame = false; } joinRequested = true; } // // handle signals that should kill me quickly // static void dying(int sig) { bzSignal(sig, SIG_DFL); display->setDefaultResolution(); raise(sig); } // // handle signals that should kill me nicely // static void suicide(int sig) { bzSignal(sig, SIG_PF(suicide)); CommandsStandard::quit(); } // // handle signals that should disconnect me from the server // static void hangup(int sig) { bzSignal(sig, SIG_PF(hangup)); serverDied = true; serverError = true; } static ServerLink* lookupServer(const Player *_player) { PlayerId id = _player->getId(); if (myTank->getId() == id) return serverLink; #ifdef ROBOT for (int i = 0; i < numRobots; i++) if (robots[i] && robots[i]->getId() == id) return robotServer[i]; #endif return NULL; } // // user input handling // #if defined(DEBUG) #define FREEZING #endif #if defined(FREEZING) static bool motionFreeze = false; #endif static enum { None, Left, Right, Up, Down } keyboardMovement; static int shiftKeyStatus; static bool doKeyCommon(const BzfKeyEvent& key, bool pressed) { keyboardMovement = None; shiftKeyStatus = key.shift; const std::string cmd = KEYMGR.get(key, pressed); if (key.ascii == 27) { if (pressed) { mainMenu->createControls(); HUDDialogStack::get()->push(mainMenu); } return true; } else if (scoreboard->getHuntState() == ScoreboardRenderer::HUNT_SELECTING) { if (key.button == BzfKeyEvent::Down || KEYMGR.get(key, true) == "identify") { if (pressed) scoreboard->setHuntNextEvent(); return true; } else if (key.button == BzfKeyEvent::Up || KEYMGR.get(key, true) == "drop") { if (pressed) scoreboard->setHuntPrevEvent(); return true; } else if (KEYMGR.get(key, true) == "fire") { if (pressed) { scoreboard->setHuntSelectEvent(); } return true; } } std::string cmdDrive = cmd; if (cmdDrive.empty()) { // Check for driving keys BzfKeyEvent cleanKey = key; cleanKey.shift = 0; cmdDrive = KEYMGR.get(cleanKey, pressed); } if (cmdDrive == "turn left") { keyboardMovement = Left; } else if (cmdDrive == "turn right") { keyboardMovement = Right; } else if (cmdDrive == "drive forward") { keyboardMovement = Up; } else if (cmdDrive == "drive reverse") { keyboardMovement = Down; } if (myTank) { switch (keyboardMovement) { case Left: myTank->setKey(BzfKeyEvent::Left, pressed); break; case Right: myTank->setKey(BzfKeyEvent::Right, pressed); break; case Up: myTank->setKey(BzfKeyEvent::Up, pressed); break; case Down: myTank->setKey(BzfKeyEvent::Down, pressed); break; case None: break; } } if (!cmd.empty()) { if (cmd == "fire") { fireButton = pressed; } roamButton = pressed; if (keyboardMovement == None) { std::string result = CMDMGR.run(cmd); if (!result.empty()) std::cerr << result << std::endl; } return true; } // if we don't have a tank, the following key commands don't apply if (!myTank) return false; { // built-in unchangeable keys. only perform if not masked. switch (key.ascii) { case 'T': case 't': // toggle frames-per-second display if (pressed) { showFPS = !showFPS; if (!showFPS) { hud->setFPS(-1.0); } } return true; case 'Y': case 'y': // toggle milliseconds for drawing if (pressed) { showDrawTime = !showDrawTime; if (!showDrawTime) { hud->setDrawTime(-1.0); } } return true; // for testing forced recreation of OpenGL context #if defined(DEBUG_RENDERING) case 'X': if (pressed && ((shiftKeyStatus & BzfKeyEvent::AltKey) != 0)) { // destroy OpenGL context getMainWindow()->getWindow()->freeContext(); // recreate OpenGL context getMainWindow()->getWindow()->makeContext(); // force a redraw (mainly for control panel) getMainWindow()->getWindow()->callExposeCallbacks(); // cause sun/moon to be repositioned immediately lastEpochOffset = epochOffset - 5.0; // reload display lists and textures and initialize other state OpenGLGState::initContext(); } return true; #endif // DEBUG_RENDERING case ']': case '}': // plus 30 seconds if (pressed) clockAdjust += 30.0f; return true; case '[': case '{': // minus 30 seconds if (pressed) clockAdjust -= 30.0f; return true; default: break; } // end switch on key // Shot/Accuracy Statistics display if (key.button == BzfKeyEvent::Home && pressed) { HUDDialogStack::get()->push(new ShotStats); return true; } } // end key handle return false; } static void doKeyNotPlaying(const BzfKeyEvent&, bool, bool) { } static void doKeyPlaying(const BzfKeyEvent& key, bool pressed, bool haveBinding) { #if defined(FREEZING) if (key.ascii == '`' && pressed && !haveBinding && key.shift) { // toggle motion freeze motionFreeze = !motionFreeze; if (motionFreeze) { addMessage(NULL, "The tank's motion is now frozen! ... Press Shift+` to unfreeze"); } return; } #endif if (key.ascii == 0 && key.button >= BzfKeyEvent::F1 && key.button <= BzfKeyEvent::F10 && (key.shift & (BzfKeyEvent::ControlKey + BzfKeyEvent::AltKey)) != 0 && !haveBinding) { // [Ctrl]-[Fx] is message to team // [Alt]-[Fx] is message to all if (pressed) { char name[32]; int msgno = (key.button - BzfKeyEvent::F1) + 1; void* buf = messageMessage; if (key.shift == BzfKeyEvent::ControlKey && world->allowTeams()) { sprintf(name, "quickTeamMessage%d", msgno); buf = nboPackUByte(buf, TeamToPlayerId(myTank->getTeam())); } else { sprintf(name, "quickMessage%d", msgno); buf = nboPackUByte(buf, AllPlayers); } if (BZDB.isSet(name)) { char messageBuffer[MessageLen]; strncpy(messageBuffer, BZDB.get(name).c_str(), MessageLen - 1); messageBuffer[MessageLen - 1] = '\0';; nboPackString(buf, messageBuffer, MessageLen); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); } } } else if (myTank->isAlive()) { // Might be a direction key. Save it for later. if ((myTank->getInputMethod() != LocalPlayer::Keyboard) && pressed) { if (keyboardMovement != None) if (BZDB.isTrue("allowInputChange")) myTank->setInputMethod(LocalPlayer::Keyboard); } } } static bool roamMouseWheel(const BzfKeyEvent& key, bool pressed) { if ((key.button != BzfKeyEvent::WheelUp) && (key.button != BzfKeyEvent::WheelDown)) { return false; } if (middleMouseButton || (leftMouseButton == rightMouseButton)) { return false; } if (!ROAM.isRoaming() || !myTank || (myTank->getTeam() != ObserverTeam)) { return false; } if (pressed) { const bool roamMouseWheelSwap = BZDB.isTrue("roamMouseWheelSwap"); const bool up = (key.button == BzfKeyEvent::WheelUp); if (leftMouseButton != roamMouseWheelSwap) { ROAM.changeTarget(up ? Roaming::next : Roaming::previous); } else if (rightMouseButton != roamMouseWheelSwap) { const int newMode = ROAM.getMode() + (up ? +1 : -1); if ((newMode < int(Roaming::roamViewCount)) && (newMode > int(Roaming::roamViewDisabled))) { ROAM.setMode(Roaming::RoamingView(newMode)); } } } return true; } static void doKey(const BzfKeyEvent& key, bool pressed) { switch (key.button) { case BzfKeyEvent::LeftMouse: { leftMouseButton = pressed; break; } case BzfKeyEvent::RightMouse: { rightMouseButton = pressed; break; } case BzfKeyEvent::MiddleMouse: { middleMouseButton = pressed; break; } } if (roamMouseWheel(key, pressed)) { return; } if (myTank) { const std::string cmd = KEYMGR.get(key, pressed); if (cmd == "jump") { myTank->setJumpPressed(pressed); } } if (HUDui::getFocus()) { if ((pressed && HUDui::keyPress(key)) || (!pressed && HUDui::keyRelease(key))) { return; } } bool haveBinding = doKeyCommon(key, pressed); if (!myTank) doKeyNotPlaying(key, pressed, haveBinding); else doKeyPlaying(key, pressed, haveBinding); } static void doMotion() { float rotation = 0.0f, speed = 1.0f; const int noMotionSize = hud->getNoMotionSize(); const int maxMotionSize = hud->getMaxMotionSize(); int keyboardRotation = myTank->getRotation(); int keyboardSpeed = myTank->getSpeed(); /* see if controls are reversed */ if (myTank->getFlag() == Flags::ReverseControls) { keyboardRotation = -keyboardRotation; keyboardSpeed = -keyboardSpeed; } // mouse is default steering method; query mouse pos always, not doing so // can lead to stuttering movement with X and software rendering (uncertain why) int mx = 0, my = 0; mainWindow->getMousePosition(mx, my); // determine if joystick motion should be used instead of mouse motion // when the player bumps the mouse, LocalPlayer::getInputMethod return Mouse; // make it return Joystick when the user bumps the joystick if (mainWindow->haveJoystick()) { if (myTank->getInputMethod() == LocalPlayer::Joystick) { // if we're using the joystick right now, replace mouse coords with joystick coords mainWindow->getJoyPosition(mx, my); } else { // if the joystick is not active, and we're not forced to some other input method, // see if it's moved and autoswitch if (BZDB.isTrue("allowInputChange")) { int jx = 0, jy = 0; mainWindow->getJoyPosition(jx, jy); // if we aren't using the joystick, but it's moving, start using it if ((jx < -noMotionSize * 2) || (jx > noMotionSize * 2) || (jy < -noMotionSize * 2) || (jy > noMotionSize * 2)) { myTank->setInputMethod(LocalPlayer::Joystick); } // joystick motion } // allowInputChange } // getInputMethod == Joystick } // mainWindow->Joystick /* see if controls are reversed */ if (myTank->getFlag() == Flags::ReverseControls) { mx = -mx; my = -my; } #if defined(FREEZING) if (motionFreeze) return; #endif if (myTank->isAutoPilot()) { doAutoPilot(rotation, speed); } else if (myTank->getInputMethod() == LocalPlayer::Keyboard) { rotation = (float)keyboardRotation; speed = (float)keyboardSpeed; if (speed < 0.0f) speed /= 2.0; rotation *= BZDB.eval("displayFOV") / 60.0f; if (BZDB.isTrue("slowKeyboard")) { rotation *= 0.5f; speed *= 0.5f; } } else { // both mouse and joystick // calculate desired rotation if (keyboardRotation && !devDriving) { rotation = float(keyboardRotation); rotation *= BZDB.eval("displayFOV") / 60.0f; if (BZDB.isTrue("slowKeyboard")) { rotation *= 0.5f; } } else if (mx < -noMotionSize) { rotation = float(-mx - noMotionSize) / float(maxMotionSize - noMotionSize); if (rotation > 1.0f) rotation = 1.0f; } else if (mx > noMotionSize) { rotation = -float(mx - noMotionSize) / float(maxMotionSize - noMotionSize); if (rotation < -1.0f) rotation = -1.0f; } // calculate desired speed if (keyboardSpeed && !devDriving) { speed = float(keyboardSpeed); if (speed < 0.0f) { speed *= 0.5f; } if (BZDB.isTrue("slowKeyboard")) { speed *= 0.5f; } } else if (my < -noMotionSize) { speed = float(-my - noMotionSize) / float(maxMotionSize - noMotionSize); if (speed > 1.0f) speed = 1.0f; } else if (my > noMotionSize) { speed = -float(my - noMotionSize) / float(maxMotionSize - noMotionSize); if (speed < -0.5f) speed = -0.5f; } else { speed = 0.0f; } } myTank->setDesiredAngVel(rotation); myTank->setDesiredSpeed(speed); } static void mouseClamp(const BzfMotionEvent& event) { // only clamp when it might be useful if ((myTank == NULL) || !myTank->isAlive() || myTank->isPaused() || (myTank->getTeam() == ObserverTeam)) { return; } // do not clamp if CTRL is being held down bool alt, ctrl, shift; display->getModState(alt, ctrl, shift); if (ctrl) { return; } // calculate the max motion size in pixels const int clampFudge = 2; const int w = mainWindow->getWidth(); const int vh = mainWindow->getViewHeight(); const float xScale = (float)w / (float) MinX; const float yScale = (float)vh / (float) MinY; const float scale = (xScale < yScale) ? xScale : yScale; const float effScale = scale * (0.7f + RENDERER.getMaxMotionFactor() / 16.667f); const int maxMotionSize = (int)((float)MaxMotionSize * effScale); const int pixels = maxMotionSize + clampFudge; // calculate the clamp extents const int xc = (w / 2); const int xn = xc - pixels; const int xp = xc + pixels; const int yc = (vh / 2); const int yn = yc - pixels; const int yp = yc + pixels; // clamp, as required if (event.x < xn) { mainWindow->getWindow()->warpMouse(xn, event.y); } if (event.x > xp) { mainWindow->getWindow()->warpMouse(xp, event.y); } if (event.y < yn) { mainWindow->getWindow()->warpMouse(event.x, yn); } if (event.y > yp) { mainWindow->getWindow()->warpMouse(event.x, yp); } } static void doEvent(BzfDisplay *disply) { BzfEvent event; if (!disply->getEvent(event)) return; switch (event.type) { case BzfEvent::Quit: CommandsStandard::quit(); break; case BzfEvent::Redraw: mainWindow->getWindow()->callExposeCallbacks(); sceneRenderer->setExposed(); break; case BzfEvent::Resize: if (mainWindow->getWidth() != event.resize.width || mainWindow->getHeight() != event.resize.height){ mainWindow->getWindow()->setSize(event.resize.width, event.resize.height); mainWindow->getWindow()->callResizeCallbacks(); } break; case BzfEvent::Map: // window has been mapped. this normally occurs when the game // is uniconified. if the player was paused because of an unmap // then resume. if (pausedByUnmap) { pausedByUnmap = false; pauseCountdown = 0.0f; if (myTank && myTank->isAlive() && myTank->isPaused()) { myTank->setPause(false); controlPanel->addMessage("Resumed"); } } // restore the resolution we want if full screen if (mainWindow->getFullscreen()) { if (preUnmapFormat != -1) { disply->setResolution(preUnmapFormat); mainWindow->warpMouse(); } } // restore the sound if (savedVolume != -1) { setSoundVolume(savedVolume); savedVolume = -1; } unmapped = false; if (shouldGrabMouse()) mainWindow->grabMouse(); break; case BzfEvent::Unmap: // begin pause countdown when unmapped if: we're not already // paused because of an unmap (shouldn't happen), we're not // already counting down to pausing, we're alive, and we're not // already paused. if (!pausedByUnmap && (pauseCountdown == 0.0f) && myTank && myTank->isAlive() && !myTank->isPaused() && !myTank->isAutoPilot() && !BZDB.isTrue("noUnmapPause")) { // handy for testing // get ready to pause (no cheating through instantaneous pausing) pauseCountdown = 5.0f; // set this even though we haven't really paused yet pausedByUnmap = true; } // ungrab the mouse if we're running full screen if (mainWindow->getFullscreen()) { preUnmapFormat = -1; if (disply->getNumResolutions() > 1) { preUnmapFormat = disply->getResolution(); disply->setDefaultResolution(); } } // clear the mouse button states leftMouseButton = rightMouseButton = middleMouseButton = false; // turn off the sound if (savedVolume == -1) { savedVolume = getSoundVolume(); setSoundVolume(0); } unmapped = true; mainWindow->ungrabMouse(); break; case BzfEvent::KeyUp: doKey(event.keyUp, false); break; case BzfEvent::KeyDown: doKey(event.keyDown, true); break; case BzfEvent::MouseMove: if (myTank && myTank->isAlive() && (myTank->getInputMethod() != LocalPlayer::Mouse) && (BZDB.isTrue("allowInputChange"))) myTank->setInputMethod(LocalPlayer::Mouse); if (BZDB.isTrue("mouseClamp")) { mouseClamp(event.mouseMove); } break; default: /* unset */ break; } } void addMessage(const Player *_player, const std::string& msg, int mode, bool highlight, const char* oldColor) { std::string fullMessage; if (BZDB.isTrue("colorful")) { if (_player) { if (highlight) { if (BZDB.get("killerhighlight") == "1") fullMessage += ColorStrings[PulsatingColor]; else if (BZDB.get("killerhighlight") == "2") fullMessage += ColorStrings[UnderlineColor]; } const PlayerId pid = _player->getId(); if (pid < 200) { int color = _player->getTeam(); if (color < 0 || (color > 4 && color != HunterTeam)) { // non-teamed, rabbit are white (same as observer) color = WhiteColor; } fullMessage += ColorStrings[color]; } else if (pid == ServerPlayer) { fullMessage += ColorStrings[YellowColor]; } else { fullMessage += ColorStrings[CyanColor]; //replay observers } fullMessage += _player->getCallSign(); if (highlight) fullMessage += ColorStrings[ResetColor]; #ifdef BWSUPPORT fullMessage += " ("; fullMessage += Team::getName(_player->getTeam()); fullMessage += ")"; #endif fullMessage += ColorStrings[DefaultColor] + ": "; } fullMessage += msg; } else { if (oldColor != NULL) fullMessage = oldColor; if (_player) { fullMessage += _player->getCallSign(); #ifdef BWSUPPORT fullMessage += " ("; fullMessage += Team::getName(_player->getTeam()); fullMessage += ")"; #endif fullMessage += ": "; } fullMessage += stripAnsiCodes(msg); } controlPanel->addMessage(fullMessage, mode); } static void updateNumPlayers() { int i, numPlayers[NumTeams]; for (i = 0; i < NumTeams; i++) numPlayers[i] = 0; for (i = 0; i < curMaxPlayers; i++) if (remotePlayers[i]) numPlayers[remotePlayers[i]->getTeam()]++; if (myTank) numPlayers[myTank->getTeam()]++; } static void updateHighScores() { /* check scores to see if my team and/or have the high score. change * `>= bestScore' to `> bestScore' if you want to share the number * one spot. */ bool anyPlayers = false; int i; for (i = 0; i < curMaxPlayers; i++) if (remotePlayers[i]) { anyPlayers = true; break; } #ifdef ROBOT if (!anyPlayers) { for (i = 0; i < numRobots; i++) if (robots[i]) { anyPlayers = true; break; } } #endif if (!anyPlayers) { hud->setPlayerHasHighScore(false); hud->setTeamHasHighScore(false); return; } bool haveBest = true; int bestScore = myTank ? myTank->getScore() : 0; for (i = 0; i < curMaxPlayers; i++) if (remotePlayers[i] && remotePlayers[i]->getScore() >= bestScore) { haveBest = false; break; } #ifdef ROBOT if (haveBest) { for (i = 0; i < numRobots; i++) if (robots[i] && robots[i]->getScore() >= bestScore) { haveBest = false; break; } } #endif hud->setPlayerHasHighScore(haveBest); if (myTank && Team::isColorTeam(myTank->getTeam())) { const Team& myTeam = World::getWorld()->getTeam(int(myTank->getTeam())); bestScore = myTeam.getWins() - myTeam.getLosses(); haveBest = true; for (i = 0; i < NumTeams; i++) { if (i == int(myTank->getTeam())) continue; const Team& team = World::getWorld()->getTeam(i); if (team.size > 0 && team.getWins() - team.getLosses() >= bestScore) { haveBest = false; break; } } hud->setTeamHasHighScore(haveBest); } else { hud->setTeamHasHighScore(false); } } static void updateFlag(FlagType* flag) { if (flag == Flags::Null) { hud->setColor(1.0f, 0.625f, 0.125f); hud->setAlert(2, NULL, 0.0f); } else { const float* color = flag->getColor(); hud->setColor(color[0], color[1], color[2]); hud->setAlert(2, flag->flagName.c_str(), 3.0f, flag->endurance == FlagSticky); } if (BZDB.isTrue("displayFlagHelp")) hud->setFlagHelp(flag, FlagHelpDuration); if ((!radar && !myTank) || !World::getWorld()) return; radar->setJammed(flag == Flags::Jamming); hud->setAltitudeTape(flag == Flags::Jumping || World::getWorld()->allowJumping()); } void notifyBzfKeyMapChanged() { std::string restartLabel = "Right Mouse"; std::vector keys = KEYMGR.getKeysFromCommand("restart", false); if (keys.empty()) { // found nothing on down binding, so try up keys = KEYMGR.getKeysFromCommand("identify", true); if (keys.empty()) { std::cerr << "There does not appear to be any key bound to enter the game" << std::endl; } } if (keys.size() >= 1) { // display single letter keys as a quoted lowercase letter if (keys[0].size() == 1) { restartLabel = '\"'; restartLabel += tolower(keys[0][0]); restartLabel += '\"'; } else { restartLabel = keys[0]; } } // only show the first 2 keys found to keep things simple if (keys.size() > 1) { restartLabel.append(" or "); // display single letter keys as quoted lowercase letter if (keys[1].size() == 1) { restartLabel += '\"'; restartLabel += tolower(keys[1][0]); restartLabel += '\"'; } else { restartLabel.append(keys[1]); } } hud->setRestartKeyLabel(restartLabel); } // // server message handling // static Player* addPlayer(PlayerId id, void* msg, int showMessage) { uint16_t team, type, wins, losses, tks; char callsign[CallSignLen]; char motto[MottoLen]; msg = nboUnpackUShort (msg, type); msg = nboUnpackUShort (msg, team); msg = nboUnpackUShort (msg, wins); msg = nboUnpackUShort (msg, losses); msg = nboUnpackUShort (msg, tks); msg = nboUnpackString (msg, callsign, CallSignLen); msg = nboUnpackString (msg, motto, MottoLen); // Strip any ANSI color codes strncpy (callsign, stripAnsiCodes (std::string (callsign)).c_str (), 32); // id is slot, check if it's empty const int i = id; // sanity check if (i < 0) { printError (TextUtils::format ("Invalid player identification (%d)", i)); std:: cerr << "WARNING: invalid player identification when adding player with id " << i << std::endl; return NULL; } if (remotePlayers[i]) { // we're not in synch with server -> help! not a good sign, but not fatal. printError ("Server error when adding player, player already added"); std::cerr << "WARNING: player already exists at location with id " << i << std::endl; return NULL; } if (i >= curMaxPlayers) { curMaxPlayers = i + 1; World::getWorld ()->setCurMaxPlayers (curMaxPlayers); } // add player if (PlayerType (type) == TankPlayer || PlayerType (type) == ComputerPlayer) { remotePlayers[i] = new RemotePlayer (id, TeamColor (team), callsign, motto, PlayerType (type)); remotePlayers[i]->changeScore (short (wins), short (losses), short (tks)); } #ifdef ROBOT if (PlayerType (type) == ComputerPlayer) for (int j = 0; j < numRobots; j++) if (robots[j] && !strncmp (robots[j]->getCallSign (), callsign, CallSignLen)) { robots[j]->setTeam (TeamColor (team)); break; } #endif // show the message if we don't have the playerlist // permission. if * we do, MsgAdminInfo should arrive // with more info. if (showMessage && !myTank->hasPlayerList ()) { std::string message ("joining as "); if (team == ObserverTeam) { message += "an observer"; } else { switch (PlayerType (type)) { case TankPlayer: message += "a tank"; break; case ComputerPlayer: message += "a robot tank"; break; default: message += "an unknown type"; break; } } if (!remotePlayers[i]) { std::string name (callsign); name += ": " + message; message = name; } addMessage (remotePlayers[i], message); } completer.registerWord(callsign, true /* quote spaces */); return remotePlayers[i]; } static void printIpInfo (const Player *_player, const Address& addr, const std::string ¬e) { if (_player == NULL) { return; } std::string colorStr; if (_player->getId() < 200) { int color = _player->getTeam(); if (color == RabbitTeam || color < 0 || color > LastColor) { // non-teamed, rabbit are white (same as observer) color = WhiteColor; } colorStr = ColorStrings[color]; } else { colorStr = ColorStrings[CyanColor]; // replay observers } const std::string addrStr = addr.getDotNotation(); std::string message = ColorStrings[CyanColor]; // default color message += "IPINFO: "; if (BZDBCache::colorful) message += colorStr; message += _player->getCallSign(); if (BZDBCache::colorful) message += ColorStrings[CyanColor]; message += "\t from: "; if (BZDBCache::colorful) message += colorStr; message += addrStr; message += ColorStrings[WhiteColor]; for (int i = 0; i < (17 - (int)addrStr.size()); i++) { message += " "; } message += note; // print into the Server Menu controlPanel->addMessage(message, 2); return; } static bool removePlayer (PlayerId id) { int playerIndex = lookupPlayerIndex(id); if (playerIndex < 0) { return false; } Player* p = remotePlayers[playerIndex]; Address addr; std::string msg = "signing off"; if (!p->getIpAddress(addr)) { addMessage(p, "signing off"); } else { msg += " from "; msg += addr.getDotNotation(); p->setIpAddress(addr); addMessage(p, msg); if (BZDB.evalInt("showips") > 1) { printIpInfo (p, addr, "(leave)"); } } if (myTank->getRecipient() == p) myTank->setRecipient(0); if (myTank->getNemesis() == p) myTank->setNemesis(0); completer.unregisterWord(p->getCallSign()); delete remotePlayers[playerIndex]; remotePlayers[playerIndex] = NULL; while ((playerIndex >= 0) && (playerIndex+1 == curMaxPlayers) && (remotePlayers[playerIndex] == NULL)) { playerIndex--; curMaxPlayers--; } World::getWorld()->setCurMaxPlayers(curMaxPlayers); updateNumPlayers(); return true; } static bool isCached(char *hexDigest) { std::istream *cachedWorld; bool cached = false; worldCachePath = getCacheDirName(); worldCachePath += hexDigest; worldCachePath += ".bwc"; if ((cachedWorld = FILEMGR.createDataInStream(worldCachePath, true))) { cached = true; delete cachedWorld; } return cached; } int curlProgressFunc(void* UNUSED(clientp), double dltotal, double dlnow, double UNUSED(ultotal), double UNUSED(ulnow)) { // FIXME: beaucoup cheeze here in the aborting style // we should be using async dns and multi-curl // abort the download? BzfEvent event; if (display->isEventPending()) { if (display->peekEvent(event)) { switch (event.type) { case BzfEvent::Quit: return 1; // terminate the curl call case BzfEvent::KeyDown: display->getEvent(event); // flush the event if (event.keyDown.ascii == 27) { return 1; // terminate the curl call } break; case BzfEvent::KeyUp: display->getEvent(event); // flush the event break; case BzfEvent::MouseMove: display->getEvent(event); // flush the event break; case BzfEvent::Unset: case BzfEvent::Map: case BzfEvent::Unmap: case BzfEvent::Redraw: case BzfEvent::Resize: // leave the event, it might be important break; } } } // update the status double percentage = 0.0; if ((int)dltotal > 0) { percentage = 100.0 * dlnow / dltotal; } char buffer[128]; sprintf (buffer, "%2.1f%% (%i/%i)", percentage, (int)dlnow, (int)dltotal); HUDDialogStack::get()->setFailedMessage(buffer); return 0; } static void loadCachedWorld() { // can't get a cache from nothing if (worldCachePath == std::string("")) { joiningGame = false; return; } // lookup the cached world std::istream *cachedWorld = FILEMGR.createDataInStream(worldCachePath, true); if (!cachedWorld) { HUDDialogStack::get()->setFailedMessage("World cache files disappeared. Join canceled"); drawFrame(0.0f); remove(worldCachePath.c_str()); joiningGame = false; return; } // status update HUDDialogStack::get()->setFailedMessage("Loading world into memory..."); drawFrame(0.0f); // get the world size cachedWorld->seekg(0, std::ios::end); std::streampos size = cachedWorld->tellg(); unsigned long charSize = std::streamoff(size); // load the cached world cachedWorld->seekg(0); char *localWorldDatabase = new char[charSize]; if (!localWorldDatabase) { HUDDialogStack::get()->setFailedMessage("Error loading cached world. Join canceled"); drawFrame(0.0f); remove(worldCachePath.c_str()); joiningGame = false; return; } cachedWorld->read(localWorldDatabase, charSize); delete cachedWorld; // verify HUDDialogStack::get()->setFailedMessage("Verifying world integrity..."); drawFrame(0.0f); MD5 md5; md5.update((unsigned char *)localWorldDatabase, charSize); md5.finalize(); std::string digest = md5.hexdigest(); if (digest != md5Digest) { if (worldBuilder) delete worldBuilder; worldBuilder = NULL; delete[] localWorldDatabase; HUDDialogStack::get()->setFailedMessage("Error on md5. Removing offending file."); remove(worldCachePath.c_str()); joiningGame = false; return; } // make world HUDDialogStack::get()->setFailedMessage("Preparing world..."); drawFrame(0.0f); if (world) { delete world; world = NULL; } if (!worldBuilder->unpack(localWorldDatabase)) { // world didn't make for some reason if (worldBuilder) delete worldBuilder; worldBuilder = NULL; delete[] localWorldDatabase; HUDDialogStack::get()->setFailedMessage("Error unpacking world database. Join canceled."); remove(worldCachePath.c_str()); joiningGame = false; return; } delete[] localWorldDatabase; // return world world = worldBuilder->getWorld(); if (worldBuilder) delete worldBuilder; worldBuilder = NULL; HUDDialogStack::get()->setFailedMessage("Downloading files..."); const bool doDownloads = BZDB.isTrue("doDownloads"); const bool updateDownloads = BZDB.isTrue("updateDownloads"); Downloads::startDownloads(doDownloads, updateDownloads, false); downloadingInitialTexture = true; } class WorldDownLoader : cURLManager { public: void start(char * hexDigest); private: void askToBZFS(); virtual void finalization(char *data, unsigned int length, bool good); }; void WorldDownLoader::start(char * hexDigest) { if (isCached(hexDigest)) { loadCachedWorld(); } else if (worldUrl.size()) { HUDDialogStack::get()->setFailedMessage (("Loading world from " + worldUrl).c_str()); setProgressFunction(curlProgressFunc, (char*)worldUrl.c_str()); setURL(worldUrl); addHandle(); worldUrl = ""; // clear the state } else { askToBZFS(); } } void WorldDownLoader::finalization(char *data, unsigned int length, bool good) { if (good) { worldDatabase = data; theData = NULL; MD5 md5; md5.update((unsigned char *)worldDatabase, length); md5.finalize(); std::string digest = md5.hexdigest(); if (digest != md5Digest) { HUDDialogStack::get()->setFailedMessage("Download from URL failed"); askToBZFS(); } else { std::ostream* cache = FILEMGR.createDataOutStream(worldCachePath, true, true); if (cache != NULL) { cache->write(worldDatabase, length); delete cache; loadCachedWorld(); } else { HUDDialogStack::get()->setFailedMessage("Problem writing cache"); askToBZFS(); } } } else { askToBZFS(); } } void WorldDownLoader::askToBZFS() { HUDDialogStack::get()->setFailedMessage("Downloading World..."); char message[MaxPacketLen]; // ask for world nboPackUInt(message, 0); serverLink->send(MsgGetWorld, sizeof(uint32_t), message); worldPtr = 0; if (cacheOut) delete cacheOut; cacheOut = FILEMGR.createDataOutStream(worldCachePath, true, true); } static WorldDownLoader *worldDownLoader; static void dumpMissingFlag(char *buf, uint16_t len) { int i; int nFlags = len/2; std::string flags; for (i = 0; i < nFlags; i++) { /* We can't use FlagType::unpack() here, since it counts on the * flags existing in our flag database. */ if (i) flags += ", "; flags += buf[0]; if (buf[1]) flags += buf[1]; buf += 2; } std::vector args; args.push_back(flags); HUDDialogStack::get()->setFailedMessage (TextUtils::format("Flags not supported by this client: {1}", &args).c_str()); } static bool processWorldChunk(void *buf, uint16_t len, int bytesLeft) { int totalSize = worldPtr + len + bytesLeft; int doneSize = worldPtr + len; if (cacheOut) cacheOut->write((char *)buf, len); HUDDialogStack::get()->setFailedMessage (TextUtils::format ("Downloading World (%2d%% complete/%d kb remaining)...", (100 * doneSize / totalSize), bytesLeft / 1024).c_str()); return bytesLeft == 0; } static void sendMeaCulpa(PlayerId victim) { char meaculpa[MessageLen]; char *buf; if (!myTank->isAutoPilot()) return; strncpy(meaculpa, "sorry, i'm just a silly machine", MessageLen); buf = messageMessage; buf = (char*)nboPackUByte(buf, victim); nboPackString(buf, meaculpa, MessageLen-1); serverLink->send(MsgMessage, sizeof(messageMessage), messageMessage); } static void handleNearFlag (void *msg, uint16_t) { float pos[3]; std::string flagName; msg = nboUnpackVector(msg, pos); msg = nboUnpackStdString(msg, flagName); std::string fullMessage = "Closest Flag: " + flagName; addMessage(NULL, ColorStrings[YellowColor]+fullMessage+ColorStrings[DefaultColor], 2, false, NULL); if (myTank) { hud->setAlert(0, fullMessage.c_str(), 5.0f, false); } } static void handleServerMessage(bool human, uint16_t code, uint16_t len, void* msg) { std::vector args; bool checkScores = false; static WordFilter *wordfilter = (WordFilter *)BZDB.getPointer("filter"); switch (code) { case MsgNearFlag: // MsgNearFlag may arrive up to 1 lag period after dropping ID, // so process this only when carrying the ID flag if (myTank && myTank->getFlag() == Flags::Identify) handleNearFlag(msg,len); break; case MsgFetchResources: if (BZDB.isSet ("_noRemoteFiles") && BZDB.isTrue ("_noRemoteFiles")) { break; } else { uint16_t numItems; void *buf; buf = nboUnpackUShort (msg, numItems); // the type for (int i = 0; i < numItems; i++) { uint16_t itemType; char buffer[MessageLen]; uint16_t stringLen; trResourceItem item; buf = nboUnpackUShort (buf, itemType); item.resType = (teResourceType) itemType; // URL buf = nboUnpackUShort (buf, stringLen); buf = nboUnpackString (buf, buffer, stringLen); buffer[stringLen] = '\0'; item.URL = buffer; item.filePath = PlatformFactory::getMedia ()->getMediaDirectory() + DirectorySeparator; std::vector < std::string > temp = TextUtils::tokenize (item.URL, std::string ("/")); item.fileName = temp[temp.size () - 1]; item.filePath += item.fileName; std::string hostname; parseHostname (item.URL, hostname); if (authorizedServer (hostname)) { if (!resourceDownloader) resourceDownloader = new ResourceGetter; resourceDownloader->addResource (item); } } } break; case MsgCustomSound: // bail out if we don't want to do remote sounds if (BZDB.isSet ("_noRemoteSounds") && BZDB.isTrue ("_noRemoteSounds")) { break; } else { void *buf; char buffer[MessageLen]; uint16_t soundType; uint16_t stringLen; std::string soundName; buf = nboUnpackUShort (msg, soundType); // the type buf = nboUnpackUShort (buf, stringLen); // how long our str is buf = nboUnpackString (buf, buffer, stringLen); buffer[stringLen] = '\0'; soundName = buffer; if (soundType == LocalCustomSound) playLocalSound (soundName); } break; case MsgUDPLinkEstablished: // server got our initial UDP packet serverLink->enableOutboundUDP(); break; case MsgUDPLinkRequest: // we got server's initial UDP packet serverLink->confirmIncomingUDP(); break; case MsgSuperKill: printError("Server forced a disconnect"); serverError = true; break; case MsgAccept: break; case MsgReject: { void *buf; char buffer[MessageLen]; uint16_t rejcode; std::string reason; buf = nboUnpackUShort (msg, rejcode); // filler for now buf = nboUnpackString (buf, buffer, MessageLen); buffer[MessageLen - 1] = '\0'; reason = buffer; printError(reason); serverError = true; break; } case MsgNegotiateFlags: { if (len > 0) { dumpMissingFlag((char *)msg, len); break; } serverLink->send(MsgWantSettings, 0, NULL); break; } case MsgGameSettings: { if (worldBuilder) delete worldBuilder; worldBuilder = new WorldBuilder; worldBuilder->unpackGameSettings(msg); serverLink->send(MsgWantWHash, 0, NULL); HUDDialogStack::get()->setFailedMessage("Requesting World Hash..."); break; } case MsgCacheURL: { char *cacheURL = new char[len]; nboUnpackString(msg, cacheURL, len); worldUrl = cacheURL; delete [] cacheURL; break; } case MsgWantWHash: { char *hexDigest = new char[len]; nboUnpackString(msg, hexDigest, len); isCacheTemp = hexDigest[0] == 't'; md5Digest = &hexDigest[1]; worldDownLoader->start(hexDigest); delete [] hexDigest; break; } case MsgGetWorld: { // create world uint32_t bytesLeft; void *buf = nboUnpackUInt(msg, bytesLeft); bool last = processWorldChunk(buf, len - 4, bytesLeft); if (!last) { char message[MaxPacketLen]; // ask for next chunk worldPtr += len - 4; nboPackUInt(message, worldPtr); serverLink->send(MsgGetWorld, sizeof(uint32_t), message); break; } if (cacheOut) delete cacheOut; cacheOut = NULL; loadCachedWorld(); if (isCacheTemp) markOld(worldCachePath); break; } case MsgGameTime: { GameTime::unpack(msg); GameTime::update(); break; } case MsgTimeUpdate: { int32_t timeLeft; msg = nboUnpackInt(msg, timeLeft); hud->setTimeLeft(timeLeft); if (timeLeft == 0) { gameOver = true; myTank->explodeTank(); controlPanel->addMessage("Time Expired"); hud->setAlert(0, "Time Expired", 10.0f, true); #ifdef ROBOT for (int i = 0; i < numRobots; i++) if (robots[i]) robots[i]->explodeTank(); #endif } else if (timeLeft < 0) { hud->setAlert(0, "Game Paused", 10.0f, true); } break; } case MsgScoreOver: { // unpack packet PlayerId id; uint16_t team; msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, team); Player* _player = lookupPlayer(id); // make a message std::string msg2; if (team == (uint16_t)NoTeam) { // a player won if (_player) { msg2 = _player->getCallSign(); msg2 += " ("; msg2 += Team::getName(_player->getTeam()); msg2 += ")"; } else { msg2 = "[unknown player]"; } } else { // a team won msg2 = Team::getName(TeamColor(team)); } msg2 += " won the game"; gameOver = true; hud->setTimeLeft((uint32_t)~0); myTank->explodeTank(); controlPanel->addMessage(msg2); hud->setAlert(0, msg2.c_str(), 10.0f, true); #ifdef ROBOT for (int i = 0; i < numRobots; i++) if (robots[i]) robots[i]->explodeTank(); #endif break; } case MsgAddPlayer: { PlayerId id; msg = nboUnpackUByte(msg, id); #if defined(FIXME) && defined(ROBOT) saveRobotInfo(id, msg); #endif if (id == myTank->getId()) { // it's me! should be the end of updates enteringServer(msg); } else { addPlayer(id, msg, entered); updateNumPlayers(); checkScores = true; // update the tank flags when in replay mode. if (myTank->getId() >= 200) { setTankFlags(); } } break; } case MsgRemovePlayer: { PlayerId id; msg = nboUnpackUByte(msg, id); if (removePlayer (id)) { checkScores = true; } break; } case MsgFlagUpdate: { uint16_t count; uint16_t flagIndex; msg = nboUnpackUShort(msg, count); for (int i = 0; i < count; i++) { msg = nboUnpackUShort(msg, flagIndex); msg = world->getFlag(int(flagIndex)).unpack(msg); world->initFlag(int(flagIndex)); } break; } case MsgTeamUpdate: { uint8_t numTeams; uint16_t team; msg = nboUnpackUByte(msg,numTeams); for (int i = 0; i < numTeams; i++) { msg = nboUnpackUShort(msg, team); msg = teams[int(team)].unpack(msg); } updateNumPlayers(); checkScores = true; break; } case MsgAlive: { PlayerId id; float pos[3], forward; msg = nboUnpackUByte(msg, id); msg = nboUnpackVector(msg, pos); msg = nboUnpackFloat(msg, forward); int playerIndex = lookupPlayerIndex(id); if ((playerIndex >= 0) || (playerIndex == -2)) { static const float zero[3] = { 0.0f, 0.0f, 0.0f }; Player* tank = getPlayerByIndex(playerIndex); if (tank == myTank) { wasRabbit = tank->getTeam() == RabbitTeam; myTank->restart(pos, forward); firstLife = false; justJoined = false; if (!myTank->isAutoPilot()) mainWindow->warpMouse(); hud->setAltitudeTape(World::getWorld()->allowJumping()); #ifdef ROBOT } else if (tank->getPlayerType() == ComputerPlayer) { for (int r = 0; r < numRobots; r++) { if (robots[r] && robots[r]->getId() == playerIndex) { robots[r]->restart(pos,forward); setRobotTarget(robots[r]); break; } } #endif } tank->setDeathEffect(NULL); if (SceneRenderer::instance().useQuality() >= 2) { if (((tank != myTank) && ((ROAM.getMode() != Roaming::roamViewFP) || (tank != ROAM.getTargetTank()))) || BZDB.isTrue("enableLocalSpawnEffect")) { if (myTank->getFlag() == Flags::Colorblindness) { static float cbColor[4] = {1,1,1,1}; EFFECTS.addSpawnEffect(cbColor, pos); } else { EFFECTS.addSpawnEffect(tank->getColor(), pos); } } } tank->setStatus(PlayerState::Alive); tank->move(pos, forward); tank->setVelocity(zero); tank->setAngularVelocity(0.0f); tank->setDeadReckoning(); tank->spawnEffect(); if (tank == myTank) { myTank->setSpawning(false); } playSound(SFX_POP, pos, true, isViewTank(tank)); } break; } case MsgAutoPilot: { PlayerId id; msg = nboUnpackUByte(msg, id); uint8_t autopilot; nboUnpackUByte(msg, autopilot); Player* tank = lookupPlayer(id); if (!tank) break; tank->setAutoPilot(autopilot != 0); addMessage(tank, autopilot ? "Roger taking controls" : "Roger releasing controls"); break; } case MsgPause: { PlayerId id; msg = nboUnpackUByte(msg, id); uint8_t Pause; nboUnpackUByte(msg, Pause); Player* tank = lookupPlayer(id); if (!tank) break; tank->setPausedMessageState(Pause == 0); addMessage(tank, Pause ? "has paused" : "has unpaused" ); break; } case MsgKilled: { PlayerId victim, killer; FlagType* flagType; int16_t shotId, reason; int phydrv = -1; msg = nboUnpackUByte(msg, victim); msg = nboUnpackUByte(msg, killer); msg = nboUnpackShort(msg, reason); msg = nboUnpackShort(msg, shotId); msg = FlagType::unpack(msg, flagType); if (reason == (int16_t)PhysicsDriverDeath) { int32_t inPhyDrv; msg = nboUnpackInt(msg, inPhyDrv); phydrv = int(inPhyDrv); } BaseLocalPlayer* victimLocal = getLocalPlayer(victim); BaseLocalPlayer* killerLocal = getLocalPlayer(killer); Player* victimPlayer = lookupPlayer(victim); Player* killerPlayer = lookupPlayer(killer); if (victimPlayer) victimPlayer->reportedHits++; #ifdef ROBOT if (victimPlayer == myTank) { // uh oh, i'm dead if (myTank->isAlive()) { serverLink->sendDropFlag(myTank->getPosition()); handleMyTankKilled(reason); } } #endif if (victimLocal) { // uh oh, local player is dead if (victimLocal->isAlive()){ gotBlowedUp(victimLocal, GotKilledMsg, killer); } } else if (victimPlayer) { victimPlayer->setExplode(TimeKeeper::getTick()); const float* pos = victimPlayer->getPosition(); const bool localView = isViewTank(victimPlayer); if (reason == GotRunOver) { playSound(SFX_RUNOVER, pos, killerLocal == myTank, localView); } else { playSound(SFX_EXPLOSION, pos, killerLocal == myTank, localView); } float explodePos[3]; explodePos[0] = pos[0]; explodePos[1] = pos[1]; explodePos[2] = pos[2] + victimPlayer->getMuzzleHeight(); // TODO hook this back up for 2.4.4 or later TankDeathOverride* death = NULL; EFFECTS.addDeathEffect(victimPlayer->getColor(), pos, victimPlayer->getAngle(),reason,victimPlayer,flagType); victimPlayer->setDeathEffect(death); if (!death || death->ShowExplosion()) addTankExplosion(explodePos); } if (killerLocal) { // local player did it if (shotId >= 0) { // terminate the shot killerLocal->endShot(shotId, true); } if (victimPlayer && killerLocal != victimPlayer) { if ((victimPlayer->getTeam() == killerLocal->getTeam()) && (killerLocal->getTeam() != RogueTeam) && !(killerPlayer == myTank && wasRabbit) && World::getWorld()->allowTeams()) { // teamkill if (killerPlayer == myTank) { hud->setAlert(1, "Don't kill teammates!!!", 3.0f, true); playLocalSound(SFX_KILL_TEAM); sendMeaCulpa(victimPlayer->getId()); } } else { // enemy if (myTank->isAutoPilot()) { if (killerPlayer) { const ShotPath* shot = killerPlayer->getShot(int(shotId)); if (shot != NULL) teachAutoPilot(shot->getFlag(), 1); } } } } } // handle my personal score against other players if ((killerPlayer == myTank || victimPlayer == myTank) && !(killerPlayer == myTank && victimPlayer == myTank)) { if (killerLocal == myTank) { if (victimPlayer) victimPlayer->changeLocalScore(1, 0, 0); myTank->setNemesis(victimPlayer); } else { if (killerPlayer) killerPlayer->changeLocalScore(0, 1, killerPlayer->getTeam() == victimPlayer->getTeam() ? 1 : 0); myTank->setNemesis(killerPlayer); } } // add message if (human && victimPlayer) { std::string message(ColorStrings[WhiteColor]); if (killerPlayer == victimPlayer) { message += "blew myself up"; addMessage(victimPlayer, message); } else if (killer >= LastRealPlayer) { addMessage(victimPlayer, "destroyed by the server"); } else if (!killerPlayer) { addMessage(victimPlayer, "destroyed by a (GHOST)"); } else if (reason == WaterDeath) { message += "fell in the water"; addMessage(victimPlayer, message); } else if (reason == PhysicsDriverDeath) { const PhysicsDriver* driver = PHYDRVMGR.getDriver(phydrv); if (driver == NULL) { message += "Unknown Deadly Obstacle"; } else { message += driver->getDeathMsg(); } addMessage(victimPlayer, message); } else { std::string playerStr; if (World::getWorld()->allowTeams() && (killerPlayer->getTeam() == victimPlayer->getTeam()) && (killerPlayer->getTeam() != RogueTeam) && (killerPlayer->getTeam() != ObserverTeam)) { playerStr += "teammate "; } if (victimPlayer == myTank) { if (BZDB.get("killerhighlight") == "1") playerStr += ColorStrings[PulsatingColor]; else if (BZDB.get("killerhighlight") == "2") playerStr += ColorStrings[UnderlineColor]; } int color = killerPlayer->getTeam(); playerStr += ColorStrings[color]; playerStr += killerPlayer->getCallSign(); if (victimPlayer == myTank) playerStr += ColorStrings[ResetColor]; playerStr += ColorStrings[WhiteColor]; // Give more informative kill messages if (flagType == Flags::Laser) message += "was fried by " + playerStr + "'s laser"; else if (flagType == Flags::GuidedMissile) message += "was destroyed by " + playerStr + "'s guided missile"; else if (flagType == Flags::ShockWave) message += "felt the effects of " + playerStr + "'s shockwave"; else if (flagType == Flags::InvisibleBullet) message += "didn't see " + playerStr + "'s bullet"; else if (flagType == Flags::MachineGun) message += "was turned into swiss cheese by " + playerStr + "'s machine gun"; else if (flagType == Flags::SuperBullet) message += "got skewered by " + playerStr + "'s super bullet"; else message += "killed by " + playerStr; addMessage(victimPlayer, message, 3, killerPlayer==myTank); } } if (World::getWorld()->allowTeams()) // geno only works in team games :) { // blow up if killer has genocide flag and i'm on same team as victim // (and we're not rogues, unless in rabbit mode) if (human && killerPlayer && victimPlayer && victimPlayer != myTank && (victimPlayer->getTeam() == myTank->getTeam()) && (myTank->getTeam() != RogueTeam) && shotId >= 0) { // now see if shot was fired with a GenocideFlag const ShotPath* shot = killerPlayer->getShot(int(shotId)); if (shot && shot->getFlag() == Flags::Genocide) { gotBlowedUp(myTank, GenocideEffect, killerPlayer->getId()); } } #ifdef ROBOT // blow up robots on victim's team if shot was genocide if (killerPlayer && victimPlayer && shotId >= 0) { const ShotPath* shot = killerPlayer->getShot(int(shotId)); if (shot && shot->getFlag() == Flags::Genocide) for (int i = 0; i < numRobots; i++) if (robots[i] && victimPlayer != robots[i] && victimPlayer->getTeam() == robots[i]->getTeam() && robots[i]->getTeam() != RogueTeam) gotBlowedUp(robots[i], GenocideEffect, killerPlayer->getId()); } #endif } checkScores = true; break; } case MsgGrabFlag: { // ROBOT -- FIXME -- robots don't grab flag at the moment PlayerId id; uint16_t flagIndex; msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, flagIndex); msg = world->getFlag(int(flagIndex)).unpack(msg); Player* tank = lookupPlayer(id); if (!tank) break; // player now has flag tank->setFlag(world->getFlag(flagIndex).type); if (tank == myTank) { // grabbed flag playLocalSound(myTank->getFlag()->endurance != FlagSticky ? SFX_GRAB_FLAG : SFX_GRAB_BAD); updateFlag(myTank->getFlag()); } else if (isViewTank(tank)) { playLocalSound(tank->getFlag()->endurance != FlagSticky ? SFX_GRAB_FLAG : SFX_GRAB_BAD); } else if (myTank->getTeam() != RabbitTeam && tank && tank->getTeam() != myTank->getTeam() && world->getFlag(flagIndex).type->flagTeam == myTank->getTeam()) { hud->setAlert(1, "Flag Alert!!!", 3.0f, true); playLocalSound(SFX_ALERT); } else { FlagType* fd = world->getFlag(flagIndex).type; if ( fd->flagTeam != NoTeam && fd->flagTeam != tank->getTeam() && ((tank && (tank->getTeam() == myTank->getTeam()))) && (Team::isColorTeam(myTank->getTeam()))) { hud->setAlert(1, "Team Grab!!!", 3.0f, false); const float* pos = tank->getPosition(); playWorldSound(SFX_TEAMGRAB, pos, false); } } std::string message("grabbed "); message += tank->getFlag()->flagName; message += " flag"; addMessage(tank, message); break; } case MsgDropFlag: { PlayerId id; uint16_t flagIndex; msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, flagIndex); msg = world->getFlag(int(flagIndex)).unpack(msg); Player* tank = lookupPlayer(id); if (!tank) break; handleFlagDropped(tank); break; } case MsgCaptureFlag: { PlayerId id; uint16_t flagIndex, team; msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, flagIndex); msg = nboUnpackUShort(msg, team); Player* capturer = lookupPlayer(id); if (flagIndex >= world->getMaxFlags()) break; Flag capturedFlag = world->getFlag(int(flagIndex)); if (capturedFlag.type == Flags::Null) break; int capturedTeam = world->getFlag(int(flagIndex)).type->flagTeam; // player no longer has flag if (capturer) { capturer->setFlag(Flags::Null); if (capturer == myTank) { updateFlag(Flags::Null); } // add message if (int(capturer->getTeam()) == capturedTeam) { std::string message("took my flag into "); message += Team::getName(TeamColor(team)); message += " territory"; addMessage(capturer, message); if (capturer == myTank) { hud->setAlert(1, "Don't capture your own flag!!!", 3.0f, true); playLocalSound( SFX_KILL_TEAM ); sendMeaCulpa(myTank->getTeam()); } } else { std::string message("captured "); message += Team::getName(TeamColor(capturedTeam)); message += "'s flag"; addMessage(capturer, message); } } // play sound -- if my team is same as captured flag then my team lost, // but if I'm on the same team as the capturer then my team won. if (capturedTeam == int(myTank->getTeam())) playLocalSound(SFX_LOSE); else if (capturer && capturer->getTeam() == myTank->getTeam()) playLocalSound(SFX_CAPTURE); // blow up if my team flag captured if (capturedTeam == int(myTank->getTeam())) { gotBlowedUp(myTank, GotCaptured, id); } #ifdef ROBOT //kill all my robots if they are on the captured team for (int r = 0; r < numRobots; r++) { if (robots[r] && robots[r]->getTeam() == capturedTeam) { gotBlowedUp(robots[r], GotCaptured, robots[r]->getId()); } } #endif // everybody who's alive on capture team will be blowing up // but we're not going to get an individual notification for // each of them, so add an explosion for each now. don't // include me, though; I already blew myself up. for (int i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i] && remotePlayers[i]->isAlive() && remotePlayers[i]->getTeam() == capturedTeam) { const float* pos = remotePlayers[i]->getPosition(); playWorldSound(SFX_EXPLOSION, pos, false); float explodePos[3]; explodePos[0] = pos[0]; explodePos[1] = pos[1]; explodePos[2] = pos[2] + remotePlayers[i]->getMuzzleHeight(); // todo hook this back up for 2.4.4. or later TankDeathOverride *death = NULL; EFFECTS.addDeathEffect(remotePlayers[i]->getColor(), pos, remotePlayers[i]->getAngle(),GotCaptured,remotePlayers[i],NULL); remotePlayers[i]->setDeathEffect(death); if (!death || death->ShowExplosion()) addTankExplosion(explodePos); } } checkScores = true; break; } case MsgNewRabbit: { PlayerId id; msg = nboUnpackUByte(msg, id); Player *rabbit = lookupPlayer(id); for (int i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) remotePlayers[i]->setHunted(false); if (i != id && remotePlayers[i] && remotePlayers[i]->getTeam() != HunterTeam && remotePlayers[i]->getTeam() != ObserverTeam) { remotePlayers[i]->changeTeam(HunterTeam); } } if (rabbit != NULL) { rabbit->changeTeam(RabbitTeam); if (rabbit == myTank) { wasRabbit = true; if (myTank->isPaused()) serverLink->sendNewRabbit(); else { hud->setAlert(0, "You are now the rabbit.", 10.0f, false); playLocalSound(SFX_HUNT_SELECT); } scoreboard->setHuntState(ScoreboardRenderer::HUNT_NONE); } else if (myTank->getTeam() != ObserverTeam) { myTank->changeTeam(HunterTeam); if (myTank->isPaused() || myTank->isAlive()) wasRabbit = false; rabbit->setHunted(true); scoreboard->setHuntState(ScoreboardRenderer::HUNT_ENABLED); } addMessage(rabbit, "is now the rabbit", 3, true); } #ifdef ROBOT for (int r = 0; r < numRobots; r++) if (robots[r]) { if (robots[r]->getId() == id) robots[r]->changeTeam(RabbitTeam); else robots[r]->changeTeam(HunterTeam); } #endif break; } case MsgShotBegin: { FiringInfo firingInfo; msg = firingInfo.unpack(msg); const int shooterid = firingInfo.shot.player; RemotePlayer* shooter = remotePlayers[shooterid]; if (shooterid != ServerPlayer) { if (shooter && remotePlayers[shooterid]->getId() == shooterid) { shooter->addShot(firingInfo); if (SceneRenderer::instance().useQuality() >= 2) { float shotPos[3]; shooter->getMuzzle(shotPos); // if you are driving with a tank in observer mode // and do not want local shot effects, // disable shot effects for that specific tank if ((ROAM.getMode() != Roaming::roamViewFP) || (!ROAM.getTargetTank()) || (shooterid != ROAM.getTargetTank()->getId()) || BZDB.isTrue("enableLocalShotEffect")) { EFFECTS.addShotEffect(shooter->getColor(), shotPos, shooter->getAngle(), shooter->getVelocity()); } } } else { break; } } else { World::getWorld()->getWorldWeapons()->addShot(firingInfo); } if (human) { const float* pos = firingInfo.shot.pos; const bool importance = false; const bool localSound = isViewTank(shooter); if (firingInfo.flagType == Flags::ShockWave) { playSound(SFX_SHOCK, pos, importance, localSound); } else if (firingInfo.flagType == Flags::Laser) { playSound(SFX_LASER, pos, importance, localSound); } else if (firingInfo.flagType == Flags::GuidedMissile) { playSound(SFX_MISSILE, pos, importance, localSound); } else if (firingInfo.flagType == Flags::Thief) { playSound(SFX_THIEF, pos, importance, localSound); } else { playSound(SFX_FIRE, pos, importance, localSound); } } break; } case MsgShotEnd: { PlayerId id; int16_t shotId; uint16_t reason; msg = nboUnpackUByte(msg, id); msg = nboUnpackShort(msg, shotId); msg = nboUnpackUShort(msg, reason); BaseLocalPlayer* localPlayer = getLocalPlayer(id); if (localPlayer) localPlayer->endShot(int(shotId), false, reason == 0); else { Player *pl = lookupPlayer(id); if (pl) pl->endShot(int(shotId), false, reason == 0); } break; } case MsgHandicap: { PlayerId id; uint8_t numHandicaps; int16_t handicap; msg = nboUnpackUByte(msg, numHandicaps); for (uint8_t s = 0; s < numHandicaps; s++) { msg = nboUnpackUByte(msg, id); msg = nboUnpackShort(msg, handicap); Player *sPlayer = NULL; if (id == myTank->getId()) { sPlayer = myTank; } else { int i = lookupPlayerIndex(id); if (i >= 0) sPlayer = remotePlayers[i]; else logDebugMessage(1, "Received handicap update for unknown player!\n"); } if (sPlayer) { // a relative score of -50 points will provide maximum handicap float normalizedHandicap = float(handicap) / BZDB.eval(StateDatabase::BZDB_HANDICAPSCOREDIFF); /* limit how much of a handicap is afforded, and only provide * handicap advantages instead of disadvantages. */ if (normalizedHandicap > 1.0f) // advantage normalizedHandicap = 1.0f; else if (normalizedHandicap < 0.0f) // disadvantage normalizedHandicap = 0.0f; sPlayer->setHandicap(normalizedHandicap); } } break; } case MsgScore: { uint8_t numScores; PlayerId id; uint16_t wins, losses, tks; msg = nboUnpackUByte(msg, numScores); for (uint8_t s = 0; s < numScores; s++) { msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, wins); msg = nboUnpackUShort(msg, losses); msg = nboUnpackUShort(msg, tks); Player *sPlayer = NULL; if (id == myTank->getId()) { sPlayer = myTank; } else { int i = lookupPlayerIndex(id); if (i >= 0) sPlayer = remotePlayers[i]; else logDebugMessage(1,"Received score update for unknown player!\n"); } if (sPlayer) sPlayer->changeScore(wins - sPlayer->getWins(), losses - sPlayer->getLosses(), tks - sPlayer->getTeamKills()); } break; } case MsgSetVar: { msg = handleMsgSetVars(msg); break; } case MsgTeleport: { PlayerId id; uint16_t from, to; msg = nboUnpackUByte(msg, id); msg = nboUnpackUShort(msg, from); msg = nboUnpackUShort(msg, to); Player* tank = lookupPlayer(id); if (tank && tank != myTank) { int face; const Teleporter* teleporter = world->getTeleporter(int(to), face); const float* pos = teleporter->getPosition(); tank->setTeleport(TimeKeeper::getTick(), short(from), short(to)); playWorldSound(SFX_TELEPORT, pos); } break; } case MsgTransferFlag: { PlayerId fromId, toId; unsigned short flagIndex; msg = nboUnpackUByte(msg, fromId); msg = nboUnpackUByte(msg, toId); msg = nboUnpackUShort(msg, flagIndex); msg = world->getFlag(int(flagIndex)).unpack(msg); Player* fromTank = lookupPlayer(fromId); Player* toTank = lookupPlayer(toId); handleFlagTransferred( fromTank, toTank, flagIndex); break; } case MsgMessage: { PlayerId src; PlayerId dst; uint8_t type; msg = nboUnpackUByte(msg, src); msg = nboUnpackUByte(msg, dst); msg = nboUnpackUByte(msg, type); // Only bother processing the message if we know how to handle it if (MessageType(type) != ChatMessage && MessageType(type) != ActionMessage) break; Player* srcPlayer = lookupPlayer(src); Player* dstPlayer = lookupPlayer(dst); TeamColor dstTeam = PlayerIdToTeam(dst); bool toAll = (dst == AllPlayers); bool fromServer = (src == ServerPlayer); bool toAdmin = (dst == AdminPlayers); std::string dstName; const std::string srcName = fromServer ? "SERVER" : (srcPlayer ? srcPlayer->getCallSign() : "(UNKNOWN)"); if (dstPlayer){ dstName = dstPlayer->getCallSign(); } else if (toAdmin){ dstName = "Admin"; } else { dstName = "(UNKNOWN)"; } std::string fullMsg; bool ignore = false; unsigned int i; for (i = 0; i < silencePlayers.size(); i++) { const std::string &silenceCallSign = silencePlayers[i]; if (srcName == silenceCallSign || "*" == silenceCallSign) { ignore = true; break; } } if (ignore) { #ifdef DEBUG // to verify working std::string msg2 = "Ignored Msg"; if (silencePlayers[i] != "*") { msg2 += " from " + silencePlayers[i]; } else { //if * just echo a generic Ignored } addMessage(NULL,msg2); #endif break; } // if filtering is turned on, filter away the goo if (wordfilter != NULL) { wordfilter->filter((char *)msg); } std::string origText = stripAnsiCodes(std::string((char*)msg)); std::string text = BundleMgr::getCurrentBundle()->getLocalString(origText); if (toAll || toAdmin || srcPlayer == myTank || dstPlayer == myTank || dstTeam == myTank->getTeam()) { // message is for me std::string colorStr; if (srcPlayer == NULL) { colorStr += ColorStrings[RogueTeam]; } else { const PlayerId pid = srcPlayer->getId(); if (pid < 200) { if (srcPlayer && srcPlayer->getTeam() != NoTeam) colorStr += ColorStrings[srcPlayer->getTeam()]; else colorStr += ColorStrings[RogueTeam]; } else if (pid == ServerPlayer) { colorStr += ColorStrings[YellowColor]; } else { colorStr += ColorStrings[CyanColor]; // replay observers } } fullMsg += colorStr; // direct message to or from me if (dstPlayer) { //if (fromServer && (origText == "You are now an administrator!" // || origText == "Password Accepted, welcome back.")) //admin = true; // talking to myself? that's strange if (dstPlayer == myTank && srcPlayer == myTank) { fullMsg = text; } else { if (BZDB.get("killerhighlight") == "1") fullMsg += ColorStrings[PulsatingColor]; else if (BZDB.get("killerhighlight") == "2") fullMsg += ColorStrings[UnderlineColor]; if (srcPlayer == myTank) { if (MessageType(type) == ActionMessage) { fullMsg += "[->" + dstName + "][" + srcName + " " + text + "]"; } else { fullMsg += "[->" + dstName + "]"; fullMsg += ColorStrings[ResetColor] + " "; fullMsg += ColorStrings[CyanColor] + text; } } else { if (MessageType(type) == ActionMessage) { fullMsg += "[" + srcName + " " + text + "]"; } else { fullMsg += "[" + srcName + "->]"; fullMsg += ColorStrings[ResetColor] + " "; fullMsg += ColorStrings[CyanColor] + text; } if (srcPlayer) myTank->setRecipient(srcPlayer); // play a sound on a private message not from self or server bool playSound = !fromServer; if (BZDB.isSet("beepOnServerMsg") && BZDB.isTrue("beepOnServerMsg")) playSound = true; if (playSound) { static TimeKeeper lastMsg = TimeKeeper::getSunGenesisTime(); if (TimeKeeper::getTick() - lastMsg > 2.0f) playLocalSound( SFX_MESSAGE_PRIVATE ); lastMsg = TimeKeeper::getTick(); } } } } else { // team / admin message if (toAdmin) { // play a sound on a private message not from self or server if (!fromServer) { static TimeKeeper lastMsg = TimeKeeper::getSunGenesisTime(); if (TimeKeeper::getTick() - lastMsg > 2.0f) playLocalSound( SFX_MESSAGE_ADMIN ); lastMsg = TimeKeeper::getTick(); } fullMsg += "[Admin] "; } if (dstTeam != NoTeam) { #ifdef BWSUPPORT fullMsg = "[to "; fullMsg += Team::getName(TeamColor(dstTeam)); fullMsg += "] "; #else fullMsg += "[Team] "; #endif // play a sound if I didn't send the message if (srcPlayer != myTank) { static TimeKeeper lastMsg = TimeKeeper::getSunGenesisTime(); if (TimeKeeper::getTick() - lastMsg > 2.0f) playLocalSound(SFX_MESSAGE_TEAM); lastMsg = TimeKeeper::getTick(); } } // display action messages differently if (MessageType(type) == ActionMessage) { fullMsg += srcName + " " + text; } else { fullMsg += srcName + colorStr + ": " + ColorStrings[CyanColor] + text; } } std::string oldcolor = ""; if (!srcPlayer || srcPlayer->getTeam() == NoTeam) oldcolor = ColorStrings[RogueTeam]; else if (srcPlayer->getTeam() == ObserverTeam) oldcolor = ColorStrings[CyanColor]; else oldcolor = ColorStrings[srcPlayer->getTeam()]; if (fromServer) addMessage(NULL, fullMsg, 2, false, oldcolor.c_str()); else addMessage(NULL, fullMsg, 1, false, oldcolor.c_str()); if (!srcPlayer || srcPlayer!=myTank) hud->setAlert(0, fullMsg.c_str(), 3.0f, false); } break; } case MsgReplayReset: { int i; unsigned char lastPlayer; msg = nboUnpackUByte(msg, lastPlayer); // remove players up to 'lastPlayer' // any PlayerId above lastPlayer is a replay observers for (i=0 ; igetFlag(i); flag.owner = (PlayerId) -1; flag.status = FlagNoExist; world->initFlag (i); } break; } case MsgAdminInfo: { uint8_t numIPs; msg = nboUnpackUByte(msg, numIPs); /* if we're getting this, we have playerlist perm */ myTank->setPlayerList(true); // replacement for the normal MsgAddPlayer message if (numIPs == 1) { uint8_t ipsize; uint8_t index; Address ip; void* tmpMsg = msg; // leave 'msg' pointing at the first entry tmpMsg = nboUnpackUByte(tmpMsg, ipsize); tmpMsg = nboUnpackUByte(tmpMsg, index); tmpMsg = ip.unpack(tmpMsg); int playerIndex = lookupPlayerIndex(index); Player* tank = getPlayerByIndex(playerIndex); if (!tank) { break; } std::string name(tank->getCallSign()); std::string message("joining as "); if (tank->getTeam() == ObserverTeam) { message += "an observer"; } else { switch (tank->getPlayerType()) { case TankPlayer: message += "a tank"; break; case ComputerPlayer: message += "a robot tank"; break; default: message += "an unknown type"; break; } } message += " from " + ip.getDotNotation(); tank->setIpAddress(ip); addMessage(tank, message); } // print fancy version to be easily found if ((numIPs != 1) || (BZDB.evalInt("showips") > 0)) { uint8_t playerId; uint8_t addrlen; Address addr; for (int i = 0; i < numIPs; i++) { msg = nboUnpackUByte(msg, addrlen); msg = nboUnpackUByte(msg, playerId); msg = addr.unpack(msg); int playerIndex = lookupPlayerIndex(playerId); Player *_player = getPlayerByIndex(playerIndex); if (!_player) continue; printIpInfo(_player, addr, "(join)"); _player->setIpAddress(addr); // save for the signoff message } // end for loop } break; } case MsgFlagType: { FlagType* typ = NULL; FlagType::unpackCustom(msg, typ); logDebugMessage(1, "Got custom flag type from server: %s\n", typ->information().c_str()); break; } case MsgPlayerInfo: { uint8_t numPlayers; int i; msg = nboUnpackUByte(msg, numPlayers); for (i = 0; i < numPlayers; ++i) { PlayerId id; msg = nboUnpackUByte(msg, id); Player *p = lookupPlayer(id); uint8_t info; // parse player info bitfield msg = nboUnpackUByte(msg, info); if (!p) continue; p->setAdmin((info & IsAdmin) != 0); p->setRegistered((info & IsRegistered) != 0); p->setVerified((info & IsVerified) != 0); } break; } // inter-player relayed message case MsgPlayerUpdate: case MsgPlayerUpdateSmall: case MsgGMUpdate: case MsgLagPing: handlePlayerMessage(code, 0, msg); break; } if (checkScores) updateHighScores(); } // // player message handling // static void handlePlayerMessage(uint16_t code, uint16_t, void* msg) { switch (code) { case MsgPlayerUpdate: case MsgPlayerUpdateSmall: { float timestamp; // could be used to enhance deadreckoning, but isn't for now PlayerId id; int32_t order; void *buf = msg; buf = nboUnpackFloat(buf, timestamp); buf = nboUnpackUByte(buf, id); Player* tank = lookupPlayer(id); if (!tank || tank == myTank) break; nboUnpackInt(buf, order); // peek! don't update the msg pointer if (order <= tank->getOrder()) break; short oldStatus = tank->getStatus(); tank->unpack(msg, code); short newStatus = tank->getStatus(); if ((oldStatus & short(PlayerState::Paused)) != (newStatus & short(PlayerState::Paused))) addMessage(tank, (tank->getStatus() & PlayerState::Paused) ? "Paused" : "Resumed"); if ((oldStatus & short(PlayerState::Exploding)) == 0 && (newStatus & short(PlayerState::Exploding)) != 0) { // player has started exploding and we haven't gotten killed // message yet -- set explosion now, play sound later (when we // get killed message). status is already !Alive so make player // alive again, then call setExplode to kill him. tank->setStatus(newStatus | short(PlayerState::Alive)); tank->setExplode(TimeKeeper::getTick()); // ROBOT -- play explosion now } break; } case MsgGMUpdate: { ShotUpdate shot; msg = shot.unpack(msg); Player* tank = lookupPlayer(shot.player); if (!tank || tank == myTank) break; RemotePlayer* remoteTank = (RemotePlayer*)tank; RemoteShotPath* shotPath = (RemoteShotPath*)remoteTank->getShot(shot.id); if (shotPath) shotPath->update(shot, code, msg); PlayerId targetId; msg = nboUnpackUByte(msg, targetId); Player* targetTank = lookupPlayer(targetId); if (targetTank && (targetTank == myTank) && (myTank->isAlive())) { static TimeKeeper lastLockMsg; if (TimeKeeper::getTick() - lastLockMsg > 0.75) { playWorldSound(SFX_LOCK, shot.pos); lastLockMsg=TimeKeeper::getTick(); addMessage(tank, "locked on me"); } } break; } // just echo lag ping message case MsgLagPing: serverLink->send(MsgLagPing,2,msg); break; } } // // message handling // static void doMessages() { char msg[MaxPacketLen]; uint16_t code, len; int e = 0; // handle server messages if (serverLink) { while (!serverError && (e = serverLink->read(code, len, msg, 0)) == 1) handleServerMessage(true, code, len, msg); if (e == -2) { printError("Server communication error"); serverError = true; return; } } #ifdef ROBOT for (int i = 0; i < numRobots; i++) { while (robotServer[i] && (e = robotServer[i]->read(code, len, msg, 0)) == 1) ; if (code == MsgKilled || code == MsgShotBegin || code == MsgShotEnd) handleServerMessage(false, code, len, msg); } #endif } static void updateFlags(float dt) { for (int i = 0; i < numFlags; i++) { Flag& flag = world->getFlag(i); if (flag.status == FlagOnTank) { // position flag on top of tank Player* tank = lookupPlayer(flag.owner); if (tank) { const float* pos = tank->getPosition(); flag.position[0] = pos[0]; flag.position[1] = pos[1]; flag.position[2] = pos[2] + tank->getDimensions()[2]; } } world->updateFlag(i, dt); } FlagSceneNode::waveFlag(dt); } bool addExplosion(const float* _pos, float size, float duration, bool grounded) { // ignore if no prototypes available; if (prototypeExplosions.empty()) return false; // don't show explosions if quality is low if (sceneRenderer->useQuality() < 1) return false; // don't add explosion if blending or texture mapping are off if (!BZDBCache::blend || !BZDBCache::texture) return false; // pick a random prototype explosion const int index = (int)(bzfrand() * (float)prototypeExplosions.size()); // make a copy and initialize it BillboardSceneNode* newExplosion = prototypeExplosions[index]->copy(); GLfloat pos[3]; pos[0] = _pos[0]; pos[1] = _pos[1]; pos[2] = _pos[2]; newExplosion->move(pos); newExplosion->setSize(size); newExplosion->setDuration(duration); newExplosion->setAngle((float)(2.0 * M_PI * bzfrand())); newExplosion->setLight(); newExplosion->setLightColor(1.0f, 0.8f, 0.5f); newExplosion->setLightAttenuation(0.05f, 0.0f, 0.03f); newExplosion->setLightScaling(size / BZDBCache::tankLength); newExplosion->setLightFadeStartTime(0.7f * duration); if (grounded) { newExplosion->setGroundLight(true); } // add copy to list of current explosions explosions.push_back(newExplosion); // the rest of the stuff is for tank explosions if (size < (3.0f * BZDBCache::tankLength)) { return true; } // bring on the noise, a tank blew up int boom = (int) (bzfrand() * 8.0) + 3; const float lightGain = (float)boom + 1.0f; // turn up the volume newExplosion->setLightColor(1.0f * lightGain, 0.8f * lightGain, 0.5f * lightGain); while (boom--) { // pick a random prototype explosion const int idx = (int)(bzfrand() * (float)prototypeExplosions.size()); // make a copy and initialize it BillboardSceneNode* newExpl = prototypeExplosions[idx]->copy(); GLfloat explPos[3]; explPos[0] = _pos[0]+(float)(bzfrand()*12.0 - 6.0); explPos[1] = _pos[1]+(float)(bzfrand()*12.0 - 6.0); explPos[2] = _pos[2]+(float)(bzfrand()*10.0); newExpl->move(explPos); newExpl->setSize(size); newExpl->setDuration(duration); newExpl->setAngle((float)(2.0 * M_PI * bzfrand())); // add copy to list of current explosions explosions.push_back(newExpl); } return true; } void addTankExplosion(const float* pos) { addExplosion(pos, BZDB.eval(StateDatabase::BZDB_TANKEXPLOSIONSIZE), 1.2f, false); } void addShotExplosion(const float* pos) { // only play explosion sound if you see an explosion if (addExplosion(pos, 1.2f * BZDBCache::tankLength, 0.8f, false)) playWorldSound(SFX_SHOT_BOOM, pos); } void addShotPuff(const float* pos, float azimuth, float elevation) { bool useClasicPuff = false; if (BZDB.evalInt("gmPuffEffect") == 1) { useClasicPuff = true; } if (useClasicPuff) { addExplosion(pos, 0.3f * BZDBCache::tankLength, 0.8f, true); return; } float rots[2] = {azimuth,elevation}; EFFECTS.addGMPuffEffect(pos, rots, NULL); } // process pending input events void processInputEvents(float maxProcessingTime) { if (mainWindow && display) { TimeKeeper start = TimeKeeper::getCurrent(); while (display->isEventPending() && !CommandsStandard::isQuit() && (TimeKeeper::getCurrent() - start < maxProcessingTime)) { // process one event doEvent(display); } } } static void updateExplosions(float dt) { // update time of all explosions int i; const int count = explosions.size(); for (i = 0; i < count; i++) { explosions[i]->updateTime(dt); } // reap expired explosions for (i = count - 1; i >= 0; i--) { if (explosions[i]->isAtEnd()) { delete explosions[i]; std::vector::iterator it = explosions.begin(); for (int j = 0; j < i; j++) ++it; explosions.erase(it); } } } static void addExplosions(SceneDatabase* scene) { const int count = explosions.size(); for (int i = 0; i < count; i++) scene->addDynamicNode(explosions[i]); } #ifdef ROBOT static void handleMyTankKilled(int reason) { // blow me up myTank->explodeTank(); if (reason == GotRunOver) playLocalSound(SFX_RUNOVER); else playLocalSound(SFX_DIE); } #endif static void *handleMsgSetVars(void *msg) { uint16_t numVars; uint8_t nameLen, valueLen; char name[MaxPacketLen]; char value[MaxPacketLen]; msg = nboUnpackUShort(msg, numVars); for (int i = 0; i < numVars; i++) { msg = nboUnpackUByte(msg, nameLen); msg = nboUnpackString(msg, name, nameLen); name[nameLen] = '\0'; msg = nboUnpackUByte(msg, valueLen); msg = nboUnpackString(msg, value, valueLen); value[valueLen] = '\0'; if ((name[0] != '_') && (name[0] != '$')) { logDebugMessage(1, "Server BZDB change blocked: '%s' = '%s'\n", name, value); } else { BZDB.set(name, value); BZDB.setPersistent(name, false); BZDB.setPermission(name, StateDatabase::Locked); } } return msg; } void handleFlagDropped(Player* tank) { // skip it if player doesn't actually have a flag if (tank->getFlag() == Flags::Null) return; if (tank == myTank) { // make sure the player must reload after theft if (tank->getFlag() == Flags::Thief) { myTank->forceReload(BZDB.eval(StateDatabase::BZDB_THIEFDROPTIME)); } //drop lock if i had GM if(myTank->getFlag() == Flags::GuidedMissile) myTank->setTarget(NULL); // update display and play sound effects playLocalSound(SFX_DROP_FLAG); updateFlag(Flags::Null); } else if (isViewTank(tank)) { playLocalSound(SFX_DROP_FLAG); } // add message std::string message("dropped "); message += tank->getFlag()->flagName; message += " flag"; addMessage(tank, message); // player no longer has flag tank->setFlag(Flags::Null); } static void handleFlagTransferred( Player *fromTank, Player *toTank, int flagIndex) { Flag f = world->getFlag(flagIndex); fromTank->setFlag(Flags::Null); toTank->setFlag(f.type); if ((fromTank == myTank) || (toTank == myTank)) updateFlag(myTank->getFlag()); const float *pos = toTank->getPosition(); if (f.type->flagTeam != ::NoTeam) { if ((toTank->getTeam() == myTank->getTeam()) && (f.type->flagTeam != myTank->getTeam())) playWorldSound(SFX_TEAMGRAB, pos); else if ((fromTank->getTeam() == myTank->getTeam()) && (f.type->flagTeam == myTank->getTeam())) { hud->setAlert(1, "Flag Alert!!!", 3.0f, true); playLocalSound(SFX_ALERT); } } std::string message(toTank->getCallSign()); message += " stole "; message += fromTank->getCallSign(); message += "'s flag"; addMessage(toTank, message); } static bool gotBlowedUp(BaseLocalPlayer* tank, BlowedUpReason reason, PlayerId killer, const ShotPath* hit, int phydrv) { if (tank && (tank->getTeam() == ObserverTeam || !tank->isAlive())) return false; int shotId = -1; FlagType* flagType = Flags::Null; if (hit) { shotId = hit->getShotId(); flagType = hit->getFlag(); } // you can't take it with you const FlagType* flag = tank->getFlag(); if (flag != Flags::Null) { if (myTank->isAutoPilot()) teachAutoPilot( myTank->getFlag(), -1 ); // tell other players I've dropped my flag lookupServer(tank)->sendDropFlag(tank->getPosition()); // drop it handleFlagDropped(tank); } // restore the sound, this happens when paused tank dies // (genocide or team flag captured) if (savedVolume != -1) { setSoundVolume(savedVolume); savedVolume = -1; } // take care of explosion business -- don't want to wait for // round trip of killed message. waiting would simplify things, // but the delay (2-3 frames usually) can really fool and irritate // the player. we have to be careful to ignore our own Killed // message when it gets back to us -- do this by ignoring killed // message if we're already dead. // don't die if we had the shield flag and we've been shot. if (reason != GotShot || flag != Flags::Shield) { // blow me up // todo hook this back up for 2.4.4. or later TankDeathOverride *death = NULL; EFFECTS.addDeathEffect(tank->getColor(), tank->getPosition(), tank->getAngle(),reason,tank, flagType); tank->setDeathEffect(death); tank->explodeTank(); if (isViewTank(tank)) { if (reason == GotRunOver) { playLocalSound(SFX_RUNOVER); } else { playLocalSound(SFX_DIE); } ForceFeedback::death(); } else { const float* pos = tank->getPosition(); if (reason == GotRunOver) { playWorldSound(SFX_RUNOVER, pos, getLocalPlayer(killer) == myTank); } else { playWorldSound(SFX_EXPLOSION, pos, getLocalPlayer(killer) == myTank); } } if (tank != myTank &&(!death || death->ShowExplosion())) { const float* pos = tank->getPosition(); float explodePos[3]; explodePos[0] = pos[0]; explodePos[1] = pos[1]; explodePos[2] = pos[2] + tank->getMuzzleHeight(); addTankExplosion(explodePos); } // tell server I'm dead in case it doesn't already know if (reason == GotShot || reason == GotRunOver || reason == GenocideEffect || reason == SelfDestruct || reason == WaterDeath || reason == DeathTouch) lookupServer(tank)->sendKilled(killer, reason, shotId, flagType, phydrv); } // print reason if it's my tank if ((tank == myTank) && (((reason < LastReason) && blowedUpMessage[reason]) || (reason == PhysicsDriverDeath))) { std::string blowedUpNotice; if (reason < LastReason) { blowedUpNotice = blowedUpMessage[reason]; } else if (reason == PhysicsDriverDeath) { const PhysicsDriver* driver = PHYDRVMGR.getDriver(phydrv); if (driver) { blowedUpNotice = driver->getDeathMsg(); } else { blowedUpNotice = "Killed by unknown obstacle"; } } else { blowedUpNotice = "Invalid reason"; } // first, check if i'm the culprit if (reason == GotShot && getLocalPlayer(killer) == myTank) { blowedUpNotice = "Shot myself"; } else { // 1-4 are messages sent when the player dies because of someone else if (reason >= GotShot && reason <= GenocideEffect) { Player *killerPlayer = lookupPlayer(killer); if (!killerPlayer) { blowedUpNotice = "Killed by the server"; } else { // matching the team-display style of other kill messages TeamColor team = killerPlayer->getTeam(); if (hit) team = hit->getTeam(); if (World::getWorld()->allowTeams() && (myTank->getTeam() == team) && (team != RogueTeam) && (team != ObserverTeam)) { blowedUpNotice += "teammate " ; blowedUpNotice += killerPlayer->getCallSign(); } else { blowedUpNotice += killerPlayer->getCallSign(); blowedUpNotice += " ("; blowedUpNotice += Team::getName(killerPlayer->getTeam()); blowedUpNotice += ")"; if (flagType != Flags::Null) { blowedUpNotice += " with "; blowedUpNotice += flagType->flagAbbv; } } } } } hud->setAlert(0, blowedUpNotice.c_str(), 4.0f, true); controlPanel->addMessage(blowedUpNotice); } // make sure shot is terminated locally (if not globally) so it can't // hit me again if I had the shield flag. this is important for the // shots that aren't stopped by a hit and so may stick around to hit // me on the next update, making the shield useless. return (reason == GotShot && flag == Flags::Shield && shotId != -1); } static void checkEnvironment() { if (!myTank) return; if (myTank->getTeam() == ObserverTeam ) { if (BZDB.evalInt("showVelocities") <= 2) return; // Check for an observed tanks hit. Player *target = ROAM.getTargetTank(); const ShotPath* hit = NULL; FlagType* flagd; float minTime = Infinity; int i; // Always a possibility of failure if (target == NULL) return; if (ROAM.getMode() != Roaming::roamViewFP) // Only works if we are driving with the target return; if (!target->isAlive() || target->isPaused()) // If he's dead or paused, don't bother checking return; flagd = target->getFlag(); if ((flagd == Flags::Narrow) || (flagd == Flags::Tiny)) // Don't bother trying to figure this out with a narrow or tiny flag yet. return; myTank->checkHit(myTank, hit, minTime); for (i = 0; i < curMaxPlayers; i++) if (remotePlayers[i]) myTank->checkHit(remotePlayers[i], hit, minTime); if (!hit) return; Player* hitter = lookupPlayer(hit->getPlayer()); std::ostringstream smsg; if (hitter->getId() == target->getId()) return; // Don't report collisions when teammates can't be killed. // This is required because checkHit() tests as if we were observer. TeamColor team = hitter->getTeam(); if (!World::getWorld()->allowTeamKills() && team == target->getTeam() && team != RogueTeam && team != ObserverTeam) return; smsg << "local collision with " << hit->getShotId() << " from " << hitter->getCallSign() << std::endl; addMessage(target, smsg.str()); if (target->hitMap.find(hit->getShotId()) == target->hitMap.end()) target->computedHits++; target->hitMap[hit->getShotId()] = true; return; } // skip this if i'm dead or paused if (!myTank->isAlive() || myTank->isPaused()) return; FlagType* flagd = myTank->getFlag(); if (flagd->flagTeam != NoTeam) { // have I captured a flag? TeamColor base = world->whoseBase(myTank->getPosition()); TeamColor team = myTank->getTeam(); if ((base != NoTeam) && ((flagd->flagTeam == team && base != team) || (flagd->flagTeam != team && base == team))) serverLink->sendCaptureFlag(base); } else if (flagd == Flags::Null && (myTank->getLocation() == LocalPlayer::OnGround || myTank->getLocation() == LocalPlayer::OnBuilding)) { // Don't grab too fast static TimeKeeper lastGrabSent; if (TimeKeeper::getTick()-lastGrabSent > 0.2) { // grab any and all flags i'm driving over const float* tpos = myTank->getPosition(); const float radius = myTank->getRadius(); const float radius2 = (radius + BZDBCache::flagRadius) * (radius + BZDBCache::flagRadius); for (int i = 0; i < numFlags; i++) { if (world->getFlag(i).type == Flags::Null || world->getFlag(i).status != FlagOnGround) continue; const float* fpos = world->getFlag(i).position; if ((fabs(tpos[2] - fpos[2]) < 0.1f) && ((tpos[0] - fpos[0]) * (tpos[0] - fpos[0]) + (tpos[1] - fpos[1]) * (tpos[1] - fpos[1]) < radius2)) { serverLink->sendGrabFlag(i); lastGrabSent=TimeKeeper::getTick(); } } } } // see if i've been shot const ShotPath* hit = NULL; float minTime = Infinity; myTank->checkHit(myTank, hit, minTime); int i; for (i = 0; i < curMaxPlayers; i++) if (remotePlayers[i]) myTank->checkHit(remotePlayers[i], hit, minTime); // Check Server Shots myTank->checkHit( World::getWorld()->getWorldWeapons(), hit, minTime); // used later float waterLevel = World::getWorld()->getWaterLevel(); if (hit) { // i got shot! terminate the shot that hit me and blow up. // force shot to terminate locally immediately (no server round trip); // this is to ensure that we don't get shot again by the same shot // after dropping our shield flag. if (hit->isStoppedByHit()) serverLink->sendEndShot(hit->getPlayer(), hit->getShotId(), 1); FlagType* killerFlag = hit->getFlag(); bool stopShot; if (killerFlag == Flags::Thief) { if (myTank->getFlag() != Flags::Null) { serverLink->sendTransferFlag(myTank->getId(), hit->getPlayer()); } stopShot = true; } else { stopShot = gotBlowedUp(myTank, GotShot, hit->getPlayer(), hit); } if (stopShot || hit->isStoppedByHit()) { Player* hitter = lookupPlayer(hit->getPlayer()); if (hitter) hitter->endShot(hit->getShotId()); } } // if not dead yet, see if i'm sitting on death else if (myTank->getDeathPhysicsDriver() >= 0) { gotBlowedUp(myTank, DeathTouch, ServerPlayer, NULL, myTank->getDeathPhysicsDriver()); } // if not dead yet, see if i've dropped below the death level else if ((waterLevel > 0.0f) && (myTank->getPosition()[2] <= waterLevel)) { gotBlowedUp(myTank, WaterDeath, ServerPlayer); } // if not dead yet, see if i got run over by the steamroller else { const float* myPos = myTank->getPosition(); const float myRadius = myTank->getRadius(); for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i] && !remotePlayers[i]->isPaused() && ((remotePlayers[i]->getFlag() == Flags::Steamroller) || ((myPos[2] < 0.0f) && remotePlayers[i]->isAlive() && !remotePlayers[i]->isPhantomZoned()))) { const float* pos = remotePlayers[i]->getPosition(); if (pos[2] < 0.0f) continue; if (remotePlayers[i]->getTeam() != RogueTeam && !World::getWorld()->allowTeamKills() && remotePlayers[i]->getTeam() == myTank->getTeam()) continue; if (!myTank->isPhantomZoned()) { const float radius = myRadius + BZDB.eval(StateDatabase::BZDB_SRRADIUSMULT) * remotePlayers[i]->getRadius(); const float distSquared = hypotf(hypotf(myPos[0] - pos[0], myPos[1] - pos[1]), (myPos[2] - pos[2]) * 2.0f); if (distSquared < radius) { gotBlowedUp(myTank, GotRunOver, remotePlayers[i]->getId()); } } } } } } bool inLookRange(float angle, float distance, float bestDistance, RemotePlayer *player) { // usually about 17 degrees if (angle >= BZDB.eval(StateDatabase::BZDB_TARGETINGANGLE)) return false; if (distance > BZDB.eval(StateDatabase::BZDB_TARGETINGDISTANCE) || distance > bestDistance) return false; if (myTank->getFlag() == Flags::Blindness) return false; if (player->getFlag() == Flags::Stealth || player->getFlag() == Flags::Cloaking) return myTank->getFlag() == Flags::Seer; return true; } static bool isKillable(const Player *target) { if (target == myTank) return false; if (target->getTeam() == RogueTeam) return true; if (myTank->getFlag() == Flags::Colorblindness) return true; if (World::getWorld()->allowTeamKills() || target->getTeam() != myTank->getTeam()) return true; return false; } static bool isFriendly(const Player *target) { if (target == myTank) return true; if (!World::getWorld()->allowTeams()) return false; if (target->getTeam() == RogueTeam) return false; if (myTank->getFlag() == Flags::Colorblindness) return false; return target->getTeam() == myTank->getTeam(); } void setLookAtMarker(void) { // get info about my tank const float c = cosf(- myTank->getAngle()); const float s = sinf(- myTank->getAngle()); const float *p = myTank->getPosition(); const fvec3 myPos(p[0],p[1],p[2]); // initialize best target Player *bestTarget = NULL; float bestDistance = Infinity; // figure out which tank is centered in my sights for (int i = 0; i < curMaxPlayers; i++) { if (!remotePlayers[i] || !remotePlayers[i]->isAlive()) continue; // compute position in my local coordinate system const fvec3 rPos(remotePlayers[i]->getPosition()[0],remotePlayers[i]->getPosition()[1],remotePlayers[i]->getPosition()[2]); const float x = (c * (rPos.x - myPos.x)) - (s * (rPos.y - myPos.y)); const float y = (s * (rPos.x - myPos.x)) + (c * (rPos.y - myPos.y)); // ignore things behind me if (x < 0.0f) continue; // get distance and sin(angle) from directly forward const float d = hypotf(x, y); const float a = fabsf(y / d); if (inLookRange(a, d, bestDistance, remotePlayers[i])) { // check and see if we can cast a ray from our point to the object fvec3 vec = rPos - myPos; Ray ray = Ray(myPos, vec); // get the list of objects that fall in this ray const ObsList *olist = COLLISIONMGR.rayTest (&ray, d); bool blocked = false; if (olist && olist->count > 0) { for (int o = 0; o < olist->count; o++) { const Obstacle *obs = olist->list[o]; const float timet = obs->intersect(ray); if (timet > 1.0f) { blocked = true; break; } } } // if there is nothing between us then go and add it to the list if (!blocked) { // is it better? bestTarget = remotePlayers[i]; bestDistance = d; } } } if (!bestTarget) return; if (myTank->getFlag() == Flags::Blindness) return; std::string label = bestTarget->getCallSign(); if (bestTarget->getFlag() != Flags::Null) { std::string flagName = bestTarget->getFlag()->flagAbbv; label += std::string("(") + flagName + std::string(")"); } // Color enhanced marker depending on Local and RemotePlayer's Flag TeamColor markercolor = bestTarget->getTeam(); if (bestTarget->getFlag() == Flags::Masquerade && myTank->getFlag() != Flags::Seer) markercolor = myTank->getTeam(); if (myTank->getFlag() == Flags::Colorblindness) markercolor = RogueTeam; hud->AddEnhancedNamedMarker(Float3ToVec3(bestTarget->getPosition()), Float3ToVec4(Team::getRadarColor(markercolor)), label, isFriendly(bestTarget), 2.0f); } static inline bool tankHasShotType(const Player* tank, const FlagType* ft) { const int maxShots = tank->getMaxShots(); for (int i = 0; i < maxShots; i++) { const ShotPath* sp = tank->getShot(i); if ((sp != NULL) && (sp->getFlag() == ft)) { return true; } } return false; } void setTarget() { // get info about my tank const float c = cosf(-myTank->getAngle()); const float s = sinf(-myTank->getAngle()); const float x0 = myTank->getPosition()[0]; const float y0 = myTank->getPosition()[1]; // initialize best target Player* bestTarget = NULL; float bestDistance = Infinity; bool lockedOn = false; // figure out which tank is centered in my sights for (int i = 0; i < curMaxPlayers; i++) { if (!remotePlayers[i] || !remotePlayers[i]->isAlive()) continue; // compute position in my local coordinate system const float* pos = remotePlayers[i]->getPosition(); const float x = c * (pos[0] - x0) - s * (pos[1] - y0); const float y = s * (pos[0] - x0) + c * (pos[1] - y0); // ignore things behind me if (x < 0.0f) continue; // get distance and sin(angle) from directly forward const float d = hypotf(x, y); const float a = fabsf(y / d); // see if it's inside lock-on angle (if we're trying to lock-on) if (a < BZDB.eval(StateDatabase::BZDB_LOCKONANGLE) && // about 8.5 degrees ((myTank->getFlag() == Flags::GuidedMissile) || // am i locking on? tankHasShotType(myTank, Flags::GuidedMissile)) && remotePlayers[i]->getFlag() != Flags::Stealth && // can't lock on stealth !remotePlayers[i]->isPaused() && // can't lock on paused !remotePlayers[i]->isNotResponding() && // can't lock on not responding d < bestDistance) { // is it better? bestTarget = remotePlayers[i]; bestDistance = d; lockedOn = true; } else if (a < BZDB.eval(StateDatabase::BZDB_TARGETINGANGLE) && // about 17 degrees ((remotePlayers[i]->getFlag() != Flags::Stealth) || (myTank->getFlag() == Flags::Seer)) && // can't "see" stealth unless have seer d < bestDistance && !lockedOn) { // is it better? bestTarget = remotePlayers[i]; bestDistance = d; } } if (!lockedOn) myTank->setTarget(NULL); if (!bestTarget) return; const bool forbidIdentify = BZDB.isTrue("_forbidIdentify"); if (lockedOn) { myTank->setTarget(bestTarget); myTank->setNemesis(bestTarget); std::string msg("Locked on "); if (!forbidIdentify) { msg += bestTarget->getCallSign(); msg += " ("; msg += Team::getName(bestTarget->getTeam()); if (bestTarget->getFlag() != Flags::Null) { msg += ") with "; msg += bestTarget->getFlag()->flagName; } else { msg += ")"; } } hud->setAlert(1, msg.c_str(), 2.0f, 1); msg = ColorStrings[DefaultColor] + msg; addMessage(NULL, msg); } else if (forbidIdentify) { if (sentForbidIdentify == 10 || sentForbidIdentify == 0) { addMessage(NULL, "'identify' disabled on this server"); } if(sentForbidIdentify == 10) { sentForbidIdentify = 0; } if(sentForbidIdentify < 10) { sentForbidIdentify++; } } else if (myTank->getFlag() == Flags::Colorblindness) { std::string msg("Looking at a tank"); hud->setAlert(1, msg.c_str(), 2.0f, 0); msg = ColorStrings[DefaultColor] + msg; addMessage(NULL, msg); } else { std::string msg("Looking at "); msg += bestTarget->getCallSign(); msg += " ("; msg += Team::getName(bestTarget->getTeam()); msg += ")"; if (bestTarget->getFlag() != Flags::Null) { msg += " with "; msg += bestTarget->getFlag()->flagName; } hud->setAlert(1, msg.c_str(), 2.0f, 0); msg = ColorStrings[DefaultColor] + msg; addMessage(NULL, msg); myTank->setNemesis(bestTarget); } } static void setHuntTarget() { if (BZDB.isTrue("_forbidHunting")) { return; } // get info about my tank const float c = cosf(-myTank->getAngle()); const float s = sinf(-myTank->getAngle()); const float x0 = myTank->getPosition()[0]; const float y0 = myTank->getPosition()[1]; // initialize best target Player* bestTarget = NULL; float bestDistance = Infinity; bool lockedOn = false; // figure out which tank is centered in my sights for (int i = 0; i < curMaxPlayers; i++) { if (!remotePlayers[i] || !remotePlayers[i]->isAlive()) continue; // compute position in my local coordinate system const float* pos = remotePlayers[i]->getPosition(); const float x = c * (pos[0] - x0) - s * (pos[1] - y0); const float y = s * (pos[0] - x0) + c * (pos[1] - y0); // ignore things behind me if (x < 0.0f) continue; // get distance and sin(angle) from directly forward const float d = hypotf(x, y); const float a = fabsf(y / d); // see if it's inside lock-on angle (if we're trying to lock-on) if (a < BZDB.eval(StateDatabase::BZDB_LOCKONANGLE) && // about 8.5 degrees myTank->getFlag() == Flags::GuidedMissile && // am i locking on? remotePlayers[i]->getFlag() != Flags::Stealth && // can't lock on stealth !remotePlayers[i]->isPaused() && // can't lock on paused !remotePlayers[i]->isNotResponding() && // can't lock on not responding d < bestDistance) { // is it better? bestTarget = remotePlayers[i]; bestDistance = d; lockedOn = true; } else if (a < BZDB.eval(StateDatabase::BZDB_TARGETINGANGLE) && // about 17 degrees ((remotePlayers[i]->getFlag() != Flags::Stealth) || (myTank->getFlag() == Flags::Seer)) && // can't "see" stealth unless have seer d < bestDistance && !lockedOn) { // is it better? bestTarget = remotePlayers[i]; bestDistance = d; } } if (!bestTarget) return; if (bestTarget->isHunted() && myTank->getFlag() != Flags::Blindness && myTank->getFlag() != Flags::Colorblindness && bestTarget->getFlag() != Flags::Stealth) { if (myTank->getTarget() == NULL) { // Don't interfere with GM lock display std::string msg("SPOTTED: "); msg += bestTarget->getCallSign(); msg += " ("; msg += Team::getName(bestTarget->getTeam()); if (bestTarget->getFlag() != Flags::Null) { msg += ") with "; msg += bestTarget->getFlag()->flagName; } else { msg += ")"; } hud->setAlert(1, msg.c_str(), 2.0f, 0); } if (!pulse.isOn()) { const float* bestTargetPosition = bestTarget->getPosition(); playWorldSound(SFX_HUNT, bestTargetPosition); pulse.setClock(1.0f); } } } static void updateDaylight(double offset, SceneRenderer& renderer) { static const double SecondsInDay = 86400.0; // update sun, moon & sky renderer.setTimeOfDay(unixEpoch + offset / SecondsInDay); } #ifdef ROBOT // // some robot stuff // static std::vector obstacleList; // for robots static void addObstacle(std::vector& rgnList, const Obstacle& obstacle) { float p[4][2]; const float* c = obstacle.getPosition(); const float tankRadius = BZDBCache::tankRadius; if (BZDBCache::tankHeight < c[2]) return; const float a = obstacle.getRotation(); const float w = obstacle.getWidth() + tankRadius; const float h = obstacle.getBreadth() + tankRadius; const float xx = w * cosf(a); const float xy = w * sinf(a); const float yx = -h * sinf(a); const float yy = h * cosf(a); p[0][0] = c[0] - xx - yx; p[0][1] = c[1] - xy - yy; p[1][0] = c[0] + xx - yx; p[1][1] = c[1] + xy - yy; p[2][0] = c[0] + xx + yx; p[2][1] = c[1] + xy + yy; p[3][0] = c[0] - xx + yx; p[3][1] = c[1] - xy + yy; int numRegions = rgnList.size(); for (int k = 0; k < numRegions; k++) { BzfRegion* region = rgnList[k]; int side[4]; if ((side[0] = region->classify(p[0], p[1])) == 1 || (side[1] = region->classify(p[1], p[2])) == 1 || (side[2] = region->classify(p[2], p[3])) == 1 || (side[3] = region->classify(p[3], p[0])) == 1) continue; if (side[0] == -1 && side[1] == -1 && side[2] == -1 && side[3] == -1) { rgnList[k] = rgnList[numRegions-1]; rgnList[numRegions-1] = rgnList[rgnList.size()-1]; rgnList.pop_back(); numRegions--; k--; delete region; continue; } for (int j = 0; j < 4; j++) { if (side[j] == -1) continue; // to inside // split const float* p1 = p[j]; const float* p2 = p[(j+1)&3]; BzfRegion* newRegion = region->orphanSplitRegion(p2, p1); if (!newRegion) continue; // no split if (region != rgnList[k]) rgnList.push_back(region); region = newRegion; } if (region != rgnList[k]) delete region; } } static void makeObstacleList() { const float tankRadius = BZDBCache::tankRadius; int i; const int count = obstacleList.size(); for (i = 0; i < count; i++) delete obstacleList[i]; obstacleList.clear(); // FIXME -- shouldn't hard code game area float gameArea[4][2]; float worldSize = BZDBCache::worldSize; gameArea[0][0] = -0.5f * worldSize + tankRadius; gameArea[0][1] = -0.5f * worldSize + tankRadius; gameArea[1][0] = 0.5f * worldSize - tankRadius; gameArea[1][1] = -0.5f * worldSize + tankRadius; gameArea[2][0] = 0.5f * worldSize - tankRadius; gameArea[2][1] = 0.5f * worldSize - tankRadius; gameArea[3][0] = -0.5f * worldSize + tankRadius; gameArea[3][1] = 0.5f * worldSize - tankRadius; obstacleList.push_back(new BzfRegion(4, gameArea)); const ObstacleList& boxes = OBSTACLEMGR.getBoxes(); const int numBoxes = boxes.size(); for (i = 0; i < numBoxes; i++) { addObstacle(obstacleList, *boxes[i]); } const ObstacleList& pyramids = OBSTACLEMGR.getPyrs(); const int numPyramids = pyramids.size(); for (i = 0; i < numPyramids; i++) { addObstacle(obstacleList, *pyramids[i]); } const ObstacleList& teleporters = OBSTACLEMGR.getTeles(); const int numTeleporters = teleporters.size(); for (i = 0; i < numTeleporters; i++) { addObstacle(obstacleList, *teleporters[i]); } const ObstacleList& meshes = OBSTACLEMGR.getMeshes(); const int numMeshes = meshes.size(); for (i = 0; i < numMeshes; i++) { addObstacle(obstacleList, *meshes[i]); } if (World::getWorld()->allowTeamFlags()) { const ObstacleList& bases = OBSTACLEMGR.getBases(); const int numBases = bases.size(); for (i = 0; i < numBases; i++) { const BaseBuilding* base = (const BaseBuilding*) bases[i]; if ((base->getHeight() != 0.0f) || (base->getPosition()[2] != 0.0f)) { addObstacle(obstacleList, *base); } } } } static void setRobotTarget(RobotPlayer* robot) { Player* bestTarget = NULL; float bestPriority = 0.0f; for (int j = 0; j < curMaxPlayers; j++) if (remotePlayers[j] && remotePlayers[j]->getId() != robot->getId() && remotePlayers[j]->isAlive() && robot->validTeamTarget(remotePlayers[j])) { if (remotePlayers[j]->isPhantomZoned() && !robot->isPhantomZoned()) continue; if (World::getWorld()->allowTeamFlags() && ((robot->getTeam() == RedTeam && remotePlayers[j]->getFlag() == Flags::RedTeam) || (robot->getTeam() == GreenTeam && remotePlayers[j]->getFlag() == Flags::GreenTeam) || (robot->getTeam() == BlueTeam && remotePlayers[j]->getFlag() == Flags::BlueTeam) || (robot->getTeam() == PurpleTeam && remotePlayers[j]->getFlag() == Flags::PurpleTeam))) { bestTarget = remotePlayers[j]; break; } const float priority = robot->getTargetPriority(remotePlayers[j]); if (priority > bestPriority) { bestTarget = remotePlayers[j]; bestPriority = priority; } } if (myTank->isAlive() && ((robot->getTeam() == RogueTeam) || robot->validTeamTarget(myTank))) { const float priority = robot->getTargetPriority(myTank); if (priority > bestPriority) { bestTarget = myTank; bestPriority = priority; } } robot->setTarget(bestTarget); } static void updateRobots(float dt) { static float newTargetTimeout = 1.0f; static float clock = 0.0f; bool pickTarget = false; int i; // see if we should look for new targets clock += dt; if (clock > newTargetTimeout) { while (clock > newTargetTimeout) { clock -= newTargetTimeout; } pickTarget = true; } // start dead robots for (i = 0; i < numRobots; i++) { if (!gameOver && robots[i] && !robots[i]->isAlive() && !robots[i]->isExploding() && pickTarget) { robotServer[i]->sendAlive(); } } // retarget robots for (i = 0; i < numRobots; i++) { if (robots[i] && robots[i]->isAlive() && (pickTarget || !robots[i]->getTarget() || !robots[i]->getTarget()->isAlive())) { setRobotTarget(robots[i]); } } // do updates for (i = 0; i < numRobots; i++) if (robots[i]) { robots[i]->update(); } } static void checkEnvironment(RobotPlayer* tank) { // skip this if i'm dead or paused if (!tank->isAlive() || tank->isPaused()) return; // see if i've been shot const ShotPath* hit = NULL; float minTime = Infinity; tank->checkHit(myTank, hit, minTime); int i; for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i] && remotePlayers[i]->getId() != tank->getId()) { tank->checkHit(remotePlayers[i], hit, minTime); } } // Check Server Shots tank->checkHit( World::getWorld()->getWorldWeapons(), hit, minTime); float waterLevel = World::getWorld()->getWaterLevel(); if (hit) { // i got shot! terminate the shot that hit me and blow up. // force shot to terminate locally immediately (no server round trip); // this is to ensure that we don't get shot again by the same shot // after dropping our shield flag. if (hit->isStoppedByHit()) lookupServer(tank)->sendEndShot(hit->getPlayer(), hit->getShotId(), 1); FlagType* killerFlag = hit->getFlag(); bool stopShot; if (killerFlag == Flags::Thief) { if (tank->getFlag() != Flags::Null) { serverLink->sendTransferFlag(tank->getId(), hit->getPlayer()); } stopShot = true; } else { stopShot = gotBlowedUp(tank, GotShot, hit->getPlayer(), hit); } if (stopShot || hit->isStoppedByHit()) { Player* hitter = lookupPlayer(hit->getPlayer()); if (hitter) hitter->endShot(hit->getShotId()); } } // if not dead yet, see if i'm sitting on death else if (tank->getDeathPhysicsDriver() >= 0) { gotBlowedUp(tank, DeathTouch, ServerPlayer, NULL, tank->getDeathPhysicsDriver()); } // if not dead yet, see if the robot dropped below the death level else if ((waterLevel > 0.0f) && (tank->getPosition()[2] <= waterLevel)) { gotBlowedUp(tank, WaterDeath, ServerPlayer); } // if not dead yet, see if i got run over by the steamroller else { bool dead = false; const float* myPos = tank->getPosition(); const float myRadius = tank->getRadius(); if (((myTank->getFlag() == Flags::Steamroller) || ((tank->getFlag() == Flags::Burrow) && myTank->isAlive() && !myTank->isPhantomZoned())) && !myTank->isPaused()) { const float* pos = myTank->getPosition(); if (pos[2] >= 0.0f) { const float radius = myRadius + (BZDB.eval(StateDatabase::BZDB_SRRADIUSMULT) * myTank->getRadius()); const float distSquared = hypotf(hypotf(myPos[0] - pos[0], myPos[1] - pos[1]), (myPos[2] - pos[2]) * 2.0f); if (distSquared < radius) { gotBlowedUp(tank, GotRunOver, myTank->getId()); dead = true; } } } for (i = 0; !dead && i < curMaxPlayers; i++) { if (remotePlayers[i] && !remotePlayers[i]->isPaused() && ((remotePlayers[i]->getFlag() == Flags::Steamroller) || ((tank->getFlag() == Flags::Burrow) && remotePlayers[i]->isAlive() && !remotePlayers[i]->isPhantomZoned()))) { const float* pos = remotePlayers[i]->getPosition(); if (pos[2] < 0.0f) continue; const float radius = myRadius + (BZDB.eval(StateDatabase::BZDB_SRRADIUSMULT) * remotePlayers[i]->getRadius()); const float distSquared = hypotf(hypotf(myPos[0] - pos[0], myPos[1] - pos[1]), (myPos[2] - pos[2]) * 2.0f); if (distSquared < radius) { gotBlowedUp(tank, GotRunOver, remotePlayers[i]->getId()); dead = true; } } } } } static void checkEnvironmentForRobots() { for (int i = 0; i < numRobots; i++) if (robots[i]) checkEnvironment(robots[i]); } static void sendRobotUpdates() { for (int i = 0; i < numRobots; i++) if (robots[i] && robotServer[i] && robots[i]->isDeadReckoningWrong()) { robotServer[i]->sendPlayerUpdate(robots[i]); } } static void addRobots() { uint16_t code, len; char msg[MaxPacketLen]; char callsign[CallSignLen]; int i, j; // add solo robots only when the server allows them if (BZDB.isTrue(StateDatabase::BZDB_DISABLEBOTS)) { numRobots = 0; if (numRobotTanks > 0) addMessage(NULL, "Solo robots are prohibited on this server."); return; } for (i = 0, j = 0; i < numRobotTanks; i++) { robotServer[j] = new ServerLink(serverNetworkAddress, startupInfo.serverPort); if (!robotServer[j] || robotServer[j]->getState() != ServerLink::Okay) { delete robotServer[j]; continue; } else { snprintf(callsign, CallSignLen, "%s%2.2d", myTank->getCallSign(), j); robots[j] = new RobotPlayer(robotServer[j]->getId(), callsign, robotServer[j], myTank->getMotto()); robots[j]->setTeam(AutomaticTeam); robotServer[j]->sendEnter(ComputerPlayer, robots[j]->getTeam(), robots[j]->getCallSign(), robots[j]->getMotto(), ""); } j++; } numRobots = j; for (j = 0; j < numRobots; j++) { // wait for response if (robotServer[j] && (robotServer[j]->read(code, len, msg, -1) < 0 || code != MsgAccept)) { delete robots[j]; delete robotServer[j]; robots[j] = NULL; robotServer[j] = NULL; } } int k; // packing for (k = 0, j = 0; j < numRobots; j++) { if (k != j) { robotServer[k] = robotServer[j]; robots[k] = robots[j]; } if (robotServer[j]) k++; } numRobots = k; if (numRobots > 0) { makeObstacleList(); RobotPlayer::setObstacleList(&obstacleList); } } #endif static void setTankFlags() { // scan through flags and, for flags on // tanks, tell the tank about its flag. const int maxFlags = world->getMaxFlags(); for (int i = 0; i < maxFlags; i++) { const Flag& flag = world->getFlag(i); if (flag.status == FlagOnTank) { for (int j = 0; j < curMaxPlayers; j++) { if (remotePlayers[j] && remotePlayers[j]->getId() == flag.owner) { remotePlayers[j]->setFlag(flag.type); break; } } } } } static void enteringServer(void *buf) { // the server sends back the team the player was joined to void *tmpbuf = buf; uint16_t team, type, wins, losses, tks; char callsign[CallSignLen]; char motto[MottoLen]; tmpbuf = nboUnpackUShort(tmpbuf, type); tmpbuf = nboUnpackUShort(tmpbuf, team); tmpbuf = nboUnpackUShort(tmpbuf, wins); // not used tmpbuf = nboUnpackUShort(tmpbuf, losses); // not used tmpbuf = nboUnpackUShort(tmpbuf, tks); // not used tmpbuf = nboUnpackString(tmpbuf, callsign, CallSignLen); // not used tmpbuf = nboUnpackString(tmpbuf, motto, MottoLen); // if server assigns us a different team, display a message std::string teamMsg; if (myTank->getTeam() != AutomaticTeam) { teamMsg = TextUtils::format("%s team was unavailable, you were joined ", Team::getName(myTank->getTeam())); if ((TeamColor)team == ObserverTeam) { teamMsg += "as an Observer"; } else { teamMsg += TextUtils::format("to the %s", Team::getName((TeamColor)team)); } } else { if ((TeamColor)team == ObserverTeam) { teamMsg = "You were joined as an observer"; } else { if (team != RogueTeam) teamMsg = TextUtils::format("You joined the %s", Team::getName((TeamColor)team)); else teamMsg = TextUtils::format("You joined as a %s", Team::getName((TeamColor)team)); } } if (myTank->getTeam() != (TeamColor)team) { myTank->setTeam((TeamColor)team); hud->setAlert(1, teamMsg.c_str(), 8.0f, (TeamColor)team==ObserverTeam?true:false); addMessage(NULL, teamMsg.c_str(), 3, true); } // observer colors are actually cyan, make them black const bool observer = (myTank->getTeam() == ObserverTeam); const GLfloat* borderColor; if (observer) { static const GLfloat black[4] = {0.0f, 0.0f, 0.0f, 1.0f}; borderColor = black; } else { borderColor = Team::getRadarColor(myTank->getTeam()); } controlPanel->setControlColor(borderColor); radar->setControlColor(borderColor); if ((myTank->getTeam() == ObserverTeam) || devDriving) { const std::string roamStr = BZDB.get("roamView"); Roaming::RoamingView roamView = ROAM.parseView(roamStr); if (roamView <= Roaming::roamViewDisabled) { roamView = Roaming::roamViewFP; } ROAM.setMode(roamView); // ROAM.resetCamera(); } else { ROAM.setMode(Roaming::roamViewDisabled); } myTank->setMotto(motto); // use motto provided by the server setTankFlags(); // clear now invalid token startupInfo.token[0] = '\0'; // add robot tanks #if defined(ROBOT) addRobots(); #endif // resize background and adjust time (this is needed even if we // don't sync with the server) sceneRenderer->getBackground()->resize(); float syncTime = BZDB.eval(StateDatabase::BZDB_SYNCTIME); if (syncTime < 0.0f) { updateDaylight(epochOffset, *sceneRenderer); } else { epochOffset = (double)syncTime; updateDaylight(epochOffset, *sceneRenderer); } lastEpochOffset = epochOffset; // restore the sound if (savedVolume != -1) { setSoundVolume(savedVolume); savedVolume = -1; } // initialize some other stuff updateNumPlayers(); updateFlag(Flags::Null); updateHighScores(); hud->setHeading(myTank->getAngle()); hud->setAltitude(myTank->getPosition()[2]); hud->setTimeLeft((uint32_t)~0); fireButton = false; firstLife = true; BZDB.setBool("displayMainFlags", true); BZDB.setBool("displayRadarFlags", true); BZDB.setBool("displayRadar", true); BZDB.setBool("displayConsole", true); entered = true; } static void cleanWorldCache() { // setup the world cache limit int cacheLimit = (10 * 1024 * 1024); if (BZDB.isSet("worldCacheLimit")) { const int dbCacheLimit = BZDB.evalInt("worldCacheLimit"); // the old limit was 100 Kbytes, too small if (dbCacheLimit == (100 * 1024)) { BZDB.setInt("worldCacheLimit", cacheLimit); } else { cacheLimit = dbCacheLimit; } } else { BZDB.setInt("worldCacheLimit", cacheLimit); } const std::string worldPath = getCacheDirName(); while (true) { char *oldestFile = NULL; int oldestSize = 0; int totalSize = 0; #ifdef _WIN32 std::string pattern = worldPath + "*.bwc"; WIN32_FIND_DATA findData; HANDLE h = FindFirstFile(pattern.c_str(), &findData); if (h != INVALID_HANDLE_VALUE) { FILETIME oldestTime; while (FindNextFile(h, &findData)) { if ((oldestFile == NULL) || (CompareFileTime(&oldestTime, &findData.ftLastAccessTime) > 0)) { if (oldestFile) { free(oldestFile); } oldestFile = strdup(findData.cFileName); oldestSize = findData.nFileSizeLow; oldestTime = findData.ftLastAccessTime; } totalSize += findData.nFileSizeLow; } FindClose(h); } #else DIR *directory = opendir(worldPath.c_str()); if (directory) { struct dirent* contents; struct stat statbuf; time_t oldestTime = 0; while ((contents = readdir(directory))) { const std::string filename = contents->d_name; const std::string fullname = worldPath + filename; stat(fullname.c_str(), &statbuf); if (S_ISREG(statbuf.st_mode) && (filename.size() > 4) && (filename.substr(filename.size() - 4) == ".bwc")) { if ((oldestFile == NULL) || (statbuf.st_atime < oldestTime)) { if (oldestFile) { free(oldestFile); } oldestFile = strdup(contents->d_name); oldestSize = statbuf.st_size; oldestTime = statbuf.st_atime; } totalSize += statbuf.st_size; } } closedir(directory); } #endif // any valid cache files? if (oldestFile == NULL) { return; } // is the cache small enough? if (totalSize < cacheLimit) { if (oldestFile != NULL) { free(oldestFile); oldestFile = NULL; } return; } // remove the oldest file logDebugMessage(1,"cleanWorldCache: removed %s\n", oldestFile); remove((worldPath + oldestFile).c_str()); free(oldestFile); totalSize -= oldestSize; } } static void markOld(std::string &fileName) { #ifdef _WIN32 FILETIME ft; HANDLE h = CreateFile(fileName.c_str(), FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { SYSTEMTIME st; memset(&st, 0, sizeof(st)); st.wYear = 1900; st.wMonth = 1; st.wDay = 1; SystemTimeToFileTime(&st, &ft); SetFileTime(h, &ft, &ft, &ft); GetLastError(); CloseHandle(h); } #else struct utimbuf times; times.actime = 0; times.modtime = 0; utime(fileName.c_str(), ×); #endif } static void sendFlagNegotiation() { char msg[MaxPacketLen]; FlagTypeMap::iterator i; char *buf = msg; /* Send MsgNegotiateFlags to the server with * the abbreviations for all the flags we support. */ for (i = FlagType::getFlagMap().begin(); i != FlagType::getFlagMap().end(); ++i) buf = (char*) i->second->pack(buf); serverLink->send(MsgNegotiateFlags, buf - msg, msg); } #if defined(FIXME) && defined(ROBOT) static void saveRobotInfo(Playerid id, void *msg) { for (int i = 0; i < numRobots; i++) if (robots[i]) { void *tmpbuf = msg; uint16_t team, type, wins, losses, tks; char callsign[CallSignLen]; char motto[MottoLen]; tmpbuf = nboUnpackUShort(tmpbuf, type); tmpbuf = nboUnpackUShort(tmpbuf, team); tmpbuf = nboUnpackUShort(tmpbuf, wins); tmpbuf = nboUnpackUShort(tmpbuf, losses); tmpbuf = nboUnpackUShort(tmpbuf, tks); tmpbuf = nboUnpackString(tmpbuf, callsign, CallSignLen); tmpbuf = nboUnpackString(tmpbuf, motto, MottoLen); std::cerr << "id " << id.port << ':' << id.number << ':' << callsign << ' ' << robots[i]->getId().port << ':' << robots[i]->getId().number << ':' << robots[i]->getCallsign() << std::endl; if (strncmp(robots[i]->getCallSign(), callsign, CallSignLen)) { // check for real robot id char buffer[100]; snprintf(buffer, 100, "id test %p %p %p %8.8x %8.8x\n", robots[i], tmpbuf, msg, *(int *)tmpbuf, *((int *)tmpbuf + 1)); std::cerr << buffer; if (tmpbuf < (char *)msg + len) { PlayerId id; tmpbuf = nboUnpackUByte(tmpbuf, id); robots[i]->id.serverHost = id.serverHost; robots[i]->id.port = id.port; robots[i]->id.number = id.number; robots[i]->server->send(MsgIdAck, 0, NULL); } } } } #endif static void resetServerVar(const std::string& name, void*) { // reset server-side variables if (BZDB.getPermission(name) == StateDatabase::Locked) { const std::string defval = BZDB.getDefault(name); BZDB.set(name, defval); } } void leaveGame() { entered = false; joiningGame = false; // no more radar // radar->setWorld(NULL); // controlPanel->setRadarRenderer(NULL); /* delete radar; radar = NULL; */ #if defined(ROBOT) // shut down robot connections int i; for (i = 0; i < numRobots; i++) { if (robots[i] && robotServer[i]) robotServer[i]->send(MsgExit, 0, NULL); delete robots[i]; delete robotServer[i]; robots[i] = NULL; robotServer[i] = NULL; } numRobots = 0; const int count = obstacleList.size(); for (i = 0; i < count; i++) delete obstacleList[i]; obstacleList.clear(); #endif // my tank goes away const bool sayGoodbye = (myTank != NULL); LocalPlayer::setMyTank(NULL); delete myTank; myTank = NULL; // reset the daylight time const bool syncTime = (BZDB.eval(StateDatabase::BZDB_SYNCTIME) >= 0.0f); const bool fixedTime = BZDB.isSet("fixedTime"); if (syncTime) { // return to the desired user time epochOffset = userTimeEpochOffset; } else if (fixedTime) { // save the current user time userTimeEpochOffset = epochOffset; } else { // revert back to when the client was started? epochOffset = userTimeEpochOffset; } updateDaylight(epochOffset, *sceneRenderer); lastEpochOffset = epochOffset; BZDB.set(StateDatabase::BZDB_SYNCTIME, BZDB.getDefault(StateDatabase::BZDB_SYNCTIME)); // flush downloaded textures (before the BzMaterials are nuked) Downloads::removeTextures(); // delete world World::setWorld(NULL); delete world; world = NULL; teams = NULL; curMaxPlayers = 0; numFlags = 0; remotePlayers = NULL; // update UI hud->setPlaying(false); hud->setCracks(false); hud->setPlayerHasHighScore(false); hud->setTeamHasHighScore(false); hud->setHeading(0.0f); hud->setAltitude(0.0f); hud->setAltitudeTape(false); // shut down server connection if (sayGoodbye) serverLink->send(MsgExit, 0, NULL); ServerLink::setServer(NULL); delete serverLink; serverLink = NULL; serverNetworkAddress = Address(); // reset viewpoint float eyePoint[3], targetPoint[3]; eyePoint[0] = 0.0f; eyePoint[1] = 0.0f; eyePoint[2] = 0.0f + BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); targetPoint[0] = eyePoint[0] - 1.0f; targetPoint[1] = eyePoint[1] + 0.0f; targetPoint[2] = eyePoint[2] + 0.0f; sceneRenderer->getViewFrustum().setProjection((float)(60.0 * M_PI / 180.0), NearPlaneNormal, FarPlaneDefault, FarDeepPlaneDefault, mainWindow->getWidth(), mainWindow->getHeight(), mainWindow->getViewHeight()); sceneRenderer->getViewFrustum().setView(eyePoint, targetPoint); // reset some flags gameOver = false; serverError = false; serverDied = false; // delete scene database (after the world has been destroyed) sceneRenderer->setSceneDatabase(NULL); // reset the BZDB variables BZDB.iterate(resetServerVar, NULL); // purge any custom flags we may have accumulated Flags::clearCustomFlags(); return; } static void joinInternetGame() { // check server address if (serverNetworkAddress.isAny()) { HUDDialogStack::get()->setFailedMessage("Server not found"); return; } // check for a local server block ServerAccessList.reload(); std::vector nameAndIp; nameAndIp.push_back(startupInfo.serverName); nameAndIp.push_back(serverNetworkAddress.getDotNotation()); if (!ServerAccessList.authorized(nameAndIp)) { HUDDialogStack::get()->setFailedMessage("Server Access Denied Locally"); std::string msg = ColorStrings[WhiteColor]; msg += "NOTE: "; msg += ColorStrings[GreyColor]; msg += "server access is controlled by "; msg += ColorStrings[YellowColor]; msg += ServerAccessList.getFileName(); addMessage(NULL, msg); return; } // open server ServerLink* _serverLink = new ServerLink(serverNetworkAddress, startupInfo.serverPort); #if defined(ROBOT) numRobots = 0; #endif serverLink = _serverLink; // assume everything's okay for now serverDied = false; serverError = false; if (!serverLink) { HUDDialogStack::get()->setFailedMessage("Memory error"); return; } // printError("Join Game"); // check server if (serverLink->getState() != ServerLink::Okay) { switch (serverLink->getState()) { case ServerLink::BadVersion: { static char versionError[] = "Incompatible server version XXXXXXXX"; strncpy(versionError + strlen(versionError) - 8, serverLink->getVersion(), 8); HUDDialogStack::get()->setFailedMessage(versionError); break; } // you got banned case ServerLink::Refused:{ const std::string& rejmsg = serverLink->getRejectionMessage(); // add to the HUD std::string msg = ColorStrings[RedColor]; msg += "You have been banned from this server"; HUDDialogStack::get()->setFailedMessage(msg.c_str()); // add to the console msg = ColorStrings[RedColor]; msg += "You have been banned from this server:"; addMessage(NULL, msg); msg = ColorStrings[YellowColor]; msg += rejmsg; addMessage(NULL, msg); break; } case ServerLink::Rejected: // the server is probably full or the game is over. if not then // the server is having network problems. HUDDialogStack::get()->setFailedMessage ("Game is full or over. Try again later."); break; case ServerLink::SocketError: HUDDialogStack::get()->setFailedMessage("Error connecting to server."); break; case ServerLink::CrippledVersion: // can't connect to (otherwise compatible) non-crippled server HUDDialogStack::get()->setFailedMessage ("Cannot connect to full version server."); break; default: HUDDialogStack::get()->setFailedMessage (TextUtils::format ("Internal error connecting to server (error code %d).", serverLink->getState()).c_str()); break; } return; } // use parallel UDP if desired and using server relay if (startupInfo.useUDPconnection) serverLink->sendUDPlinkRequest(); else printError("No UDP connection, see Options to enable."); HUDDialogStack::get()->setFailedMessage("Connection Established..."); sendFlagNegotiation(); joiningGame = true; scoreboard->huntReset(); GameTime::reset(); } static void addVarToAutoComplete(const std::string& name, void* UNUSED(userData)) { if ((name.size() <= 0) || (name[0] != '_')) { return; // we're skipping "poll" } if (BZDB.getPermission(name) == StateDatabase::Server) { completer.registerWord(name); } return; } static void joinInternetGame2() { justJoined = true; HUDDialogStack::get()->setFailedMessage("Entering game..."); ServerLink::setServer(serverLink); World::setWorld(world); // prep teams teams = world->getTeams(); // prep players curMaxPlayers = 0; remotePlayers = world->getPlayers(); // reset the autocompleter completer.setDefaults(); BZDB.iterate(addVarToAutoComplete, NULL); // prep flags numFlags = world->getMaxFlags(); // make scene database setSceneDatabase(); mainWindow->getWindow()->yieldCurrent(); // make radar // radar = new RadarRenderer(*sceneRenderer, *world); // mainWindow->getWindow()->yieldCurrent(); radar->setWorld(world); controlPanel->setRadarRenderer(radar); controlPanel->resize(); // make local player myTank = new LocalPlayer(serverLink->getId(), startupInfo.callsign, startupInfo.motto); myTank->setTeam(startupInfo.team); LocalPlayer::setMyTank(myTank); if (world->allowRabbit() && myTank->getTeam() != ObserverTeam) myTank->setTeam(HunterTeam); // tell server we want to join serverLink->sendEnter(TankPlayer, myTank->getTeam(), myTank->getCallSign(), myTank->getMotto(), startupInfo.token); startupInfo.token[0] = '\0'; // hopefully it worked! pop all the menus. HUDDialogStack* stack = HUDDialogStack::get(); while (stack->isActive()) stack->pop(); joiningGame = false; } static void renderDialog() { if (HUDDialogStack::get()->isActive()) { const int width = mainWindow->getWidth(); const int height = mainWindow->getHeight(); const int ox = mainWindow->getOriginX(); const int oy = mainWindow->getOriginY(); glScissor(ox, oy, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, 0.0, height, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); OpenGLGState::resetState(); HUDDialogStack::get()->render(); glPopMatrix(); } } static void checkDirtyControlPanel(ControlPanel *cp) { if (cp) { if (HUDDialogStack::get()->isActive()) { cp->invalidate(); } } return; } static void renderRoamMouse() { if (!ROAM.isRoaming() || !myTank || (myTank->getTeam() != ObserverTeam) || !(leftMouseButton || rightMouseButton || middleMouseButton)) { return; } const int sx = mainWindow->getWidth(); const int sy = mainWindow->getHeight(); const int ox = mainWindow->getOriginX(); const int oy = mainWindow->getOriginY(); int mx, my; mainWindow->getWindow()->getMouse(mx, my); my = sy - my - 1; // flip the y axis const int xc = ox + (sx / 2); const int y2 = oy + (mainWindow->getViewHeight() / 2); const int yc = (sy - y2 - 1); // flip the y axis glPushAttrib(GL_ALL_ATTRIB_BITS); glScissor(ox, oy, sx, sy); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, sx, 0.0, sy, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glShadeModel(GL_SMOOTH); glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); static const float color0[4] = { 0.0f, 0.0f, 0.0f, 0.1f }; static const float color1[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; glLineWidth(1.49f); glBegin(GL_LINES); glColor4fv(color0); glVertex2i(xc, yc); glColor4fv(color1); glVertex2i(mx, my); glEnd(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glPopAttrib(); } static void drawUI() { // setup the triangle counts (FIXME: hackish) if (showFPS && showDrawTime) { hud->setFrameTriangleCount(sceneRenderer->getFrameTriangleCount()); // NOTE: the radar triangle count is actually from the previous frame if (radar) { hud->setFrameRadarTriangleCount(radar->getFrameTriangleCount()); } else { hud->setFrameRadarTriangleCount(0); } } else { hud->setFrameTriangleCount(0); hud->setFrameRadarTriangleCount(0); } // update the HUD (player list, alerts) if (World::getWorld() && hud) { hud->render(*sceneRenderer); } // draw the control panel if (controlPanel) { controlPanel->render(*sceneRenderer); } // draw the radar if (radar) { const bool showBlankRadar = !myTank || (myTank && myTank->isPaused()); const bool observer = myTank && (myTank->getTeam() == ObserverTeam); radar->render(*sceneRenderer, showBlankRadar, observer); } // update the HUD (menus) renderDialog(); // render the drag-line renderRoamMouse(); return; } // // stuff to draw a frame // static bool trackPlayerShot(Player* target, float* eyePoint, float* targetPoint) { // follow the first shot if (BZDB.isTrue("trackShots")) { const int maxShots = target->getMaxShots(); const ShotPath* sp = NULL; // look for the oldest active shot float remaining = +MAXFLOAT; for (int s = 0; s < maxShots; s++) { const ShotPath* spTmp = target->getShot(s); if (spTmp != NULL) { const float t = float(spTmp->getReloadTime() - (spTmp->getCurrentTime() - spTmp->getStartTime())); if ((t > 0.0f) && (t < remaining)) { sp = spTmp; remaining = t; } } } if (sp != NULL) { const float* pos = sp->getPosition(); const float* vel = sp->getVelocity(); const float speed = sqrtf(vel[0]*vel[0] + vel[1]*vel[1] + vel[2]*vel[2]); if (speed > 0.0f) { const float ilen = 1.0f / speed; const float dir[3] = {ilen * vel[0], ilen * vel[1], ilen * vel[2]}; float topDir[3] = {1.0f, 0.0f, 0.0f}; const float hlen = sqrtf(dir[0]*dir[0] + dir[1]*dir[1]); if (hlen > 0.0f) { topDir[2] = hlen; const float hfactor = -fabsf(dir[2] / hlen); topDir[0] = hfactor * dir[0]; topDir[1] = hfactor * dir[1]; } const float offset = -10.0f; const float tOffset = +2.0f; eyePoint[0] = pos[0] + (offset * dir[0]) + (tOffset * topDir[0]); eyePoint[1] = pos[1] + (offset * dir[1]) + (tOffset * topDir[1]); eyePoint[2] = pos[2] + (offset * dir[2]) + (tOffset * topDir[2]); targetPoint[0] = eyePoint[0] + dir[0]; targetPoint[1] = eyePoint[1] + dir[1]; targetPoint[2] = eyePoint[2] + dir[2]; return true; } } } return false; } static void setupNearPlane() { NearPlane = NearPlaneNormal; const bool showTreads = BZDB.isTrue("showTreads"); if (!showTreads || !myTank) { return; } const Player* tank = myTank; if (ROAM.isRoaming()) { if (ROAM.getMode() != Roaming::roamViewFP) { return; } if (!devDriving) { tank = ROAM.getTargetTank(); } } if (tank == NULL) { return; } const float halfLength = 0.5f * BZDBCache::tankLength; const float length = tank->getDimensions()[1]; if (fabsf(length - halfLength) > 0.1f) { NearPlane = NearPlaneClose; } return; } static void setupFarPlane() { FarPlane = FarPlaneScale * BZDBCache::worldSize; FarPlaneCull = false; FarDeepPlane = FarPlane * FarDeepPlaneScale; const bool mapFog = BZDB.get(StateDatabase::BZDB_FOGMODE) != "none"; float farDist = FarPlane; if (BZDB.get("_cullDist") == "fog") { if (mapFog && !BZDB.isTrue("_fogNoSky")) { const float fogMargin = 1.01f; const std::string& fogMode = BZDB.get("_fogMode"); if (fogMode == "linear") { farDist = fogMargin * BZDB.eval("_fogEnd"); } else { const float density = BZDB.eval("_fogDensity"); if (density > 0.0f) { const float fogFactor = 0.01f; if (fogMode == "exp2") { farDist = fogMargin * sqrtf(-logf(fogFactor)) / density; } else { // default to 'exp' farDist = fogMargin * -logf(fogFactor) / density; } } else { // default far plane } } } else { // default far plane } } else { const float dist = BZDB.eval("_cullDist"); if (dist > 0.0f) { farDist = dist; } else { // default far plane } } if (farDist < FarPlane) { FarPlane = farDist; FarPlaneCull = true; } return; } void drawFrame(const float dt) { // get view type (constant for entire game) static SceneRenderer::ViewType viewType = sceneRenderer->getViewType(); // get media object static BzfMedia* media = PlatformFactory::getMedia(); static const float defaultPos[3] = { 0.0f, 0.0f, 0.0f }; static const float defaultDir[3] = { 1.0f, 0.0f, 0.0f }; static int frameCount = 0; static float cumTime = 0.0f; const float* myTankPos; const float* myTankDir; GLfloat fov; GLfloat eyePoint[3]; GLfloat targetPoint[3]; checkDirtyControlPanel(controlPanel); if (!unmapped) { // compute fps frameCount++; cumTime += float(dt); if (cumTime >= 2.0) { if (showFPS) hud->setFPS(float(frameCount) / cumTime); cumTime = 0.00000001f; frameCount = 0; } // drift clouds sceneRenderer->getBackground()->addCloudDrift(1.0f * dt, 0.731f * dt); // get tank camera info float muzzleHeight; if (!myTank) { myTankPos = defaultPos; myTankDir = defaultDir; muzzleHeight = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); fov = BZDB.eval("defaultFOV"); } else { myTankPos = myTank->getPosition(); myTankDir = myTank->getForward(); muzzleHeight = myTank->getMuzzleHeight(); if (myTank->getFlag() == Flags::WideAngle) { fov = 120.0f; } else { fov = BZDB.eval("displayFOV"); } if (viewType == SceneRenderer::ThreeChannel) { fov *= 0.75f; } } fov *= (float)(M_PI / 180.0); // set projection and view eyePoint[0] = myTankPos[0]; eyePoint[1] = myTankPos[1]; eyePoint[2] = myTankPos[2] + muzzleHeight; targetPoint[0] = eyePoint[0] + myTankDir[0]; targetPoint[1] = eyePoint[1] + myTankDir[1]; targetPoint[2] = eyePoint[2] + myTankDir[2]; if (devDriving || ROAM.isRoaming()) { hud->setAltitude(-1.0f); float roamViewAngle; const Roaming::RoamingCamera* roam = ROAM.getCamera(); if (!(ROAM.getMode() == Roaming::roamViewFree) && (ROAM.getTargetTank() || (devDriving && myTank))) { Player *target; if (!devDriving) { target = ROAM.getTargetTank(); } else { target = myTank; } const float *targetTankDir = target->getForward(); // fixed camera tracking target if (ROAM.getMode() == Roaming::roamViewTrack) { eyePoint[0] = roam->pos[0]; eyePoint[1] = roam->pos[1]; eyePoint[2] = roam->pos[2]; targetPoint[0] = target->getPosition()[0]; targetPoint[1] = target->getPosition()[1]; targetPoint[2] = target->getPosition()[2] + target->getMuzzleHeight(); } // camera following target else if (ROAM.getMode() == Roaming::roamViewFollow) { if (!trackPlayerShot(target, eyePoint, targetPoint)) { const bool slowKB = BZDB.isTrue("slowKeyboard"); if (slowKB == (BZDB.eval("roamSmoothTime") < 0.0f)) { eyePoint[0] = target->getPosition()[0] - targetTankDir[0] * 40; eyePoint[1] = target->getPosition()[1] - targetTankDir[1] * 40; eyePoint[2] = target->getPosition()[2] + muzzleHeight * 6; targetPoint[0] = target->getPosition()[0]; targetPoint[1] = target->getPosition()[1]; targetPoint[2] = target->getPosition()[2]; } else { // the same as for the roamViewTrack mode eyePoint[0] = roam->pos[0]; eyePoint[1] = roam->pos[1]; eyePoint[2] = roam->pos[2]; targetPoint[0] = target->getPosition()[0]; targetPoint[1] = target->getPosition()[1]; targetPoint[2] = target->getPosition()[2] + target->getMuzzleHeight(); if (BZDB.isSet("followOffsetZ")) { targetPoint[2] += BZDB.eval("followOffsetZ"); } } } } // target's view else if (ROAM.getMode() == Roaming::roamViewFP) { if (!trackPlayerShot(target, eyePoint, targetPoint)) { eyePoint[0] = target->getPosition()[0]; eyePoint[1] = target->getPosition()[1]; eyePoint[2] = target->getPosition()[2] + target->getMuzzleHeight(); targetPoint[0] = eyePoint[0] + targetTankDir[0]; targetPoint[1] = eyePoint[1] + targetTankDir[1]; targetPoint[2] = eyePoint[2] + targetTankDir[2]; hud->setAltitude(target->getPosition()[2]); } } // track team flag else if (ROAM.getMode() == Roaming::roamViewFlag) { Flag* targetFlag = ROAM.getTargetFlag(); eyePoint[0] = roam->pos[0]; eyePoint[1] = roam->pos[1]; eyePoint[2] = roam->pos[2]; targetPoint[0] = targetFlag->position[0]; targetPoint[1] = targetFlag->position[1]; targetPoint[2] = targetFlag->position[2]; if (targetFlag->status != FlagOnTank) { targetPoint[2] += muzzleHeight; } else { targetPoint[2] -= (BZDBCache::tankHeight - BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT)); } } roamViewAngle = (float) (atan2(targetPoint[1]-eyePoint[1], targetPoint[0]-eyePoint[0]) * 180.0f / M_PI); } // free Roaming else { float dir[3]; dir[0] = cosf((float)(roam->phi * M_PI / 180.0)) * cosf((float)(roam->theta * M_PI / 180.0)); dir[1] = cosf((float)(roam->phi * M_PI / 180.0)) * sinf((float)(roam->theta * M_PI / 180.0)); dir[2] = sinf((float)(roam->phi * M_PI / 180.0)); eyePoint[0] = roam->pos[0]; eyePoint[1] = roam->pos[1]; eyePoint[2] = roam->pos[2]; targetPoint[0] = eyePoint[0] + dir[0]; targetPoint[1] = eyePoint[1] + dir[1]; targetPoint[2] = eyePoint[2] + dir[2]; roamViewAngle = roam->theta; } if (!devDriving) { float virtPos[] = {eyePoint[0], eyePoint[1], 0}; if (myTank) { myTank->move(virtPos, (float)(roamViewAngle * M_PI / 180.0)); } } fov = (float)(roam->zoom * M_PI / 180.0); moveSoundReceiver(eyePoint[0], eyePoint[1], eyePoint[2], 0.0, false); } // only use a close plane for drawing in the // cockpit, and even then only for odd sized tanks setupNearPlane(); // based on fog and _cullDist setupFarPlane(); ViewFrustum& viewFrustum = sceneRenderer->getViewFrustum(); viewFrustum.setProjection(fov, NearPlane, FarPlane, FarDeepPlane, mainWindow->getWidth(), mainWindow->getHeight(), mainWindow->getViewHeight()); viewFrustum.setFarPlaneCull(FarPlaneCull); viewFrustum.setView(eyePoint, targetPoint); // add dynamic nodes SceneDatabase* scene = sceneRenderer->getSceneDatabase(); if (scene && myTank) { int i; const bool seerView = (myTank->getFlag() == Flags::Seer); const bool showTreads = BZDB.isTrue("showTreads"); // add my tank if required const bool inCockpit = (!devDriving || (ROAM.getMode() == Roaming::roamViewFP)); const bool showMyTreads = showTreads || (devDriving && (ROAM.getMode() != Roaming::roamViewFP)); myTank->addToScene(scene, myTank->getTeam(), inCockpit, seerView, showMyTreads, showMyTreads /*showIDL*/); // add my shells myTank->addShots(scene, false); // add server shells if (world) { world->getWorldWeapons()->addShots(scene, false); } // add antidote flag myTank->addAntidote(scene); // add flags world->addFlags(scene, seerView); // add other tanks and shells for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) { const bool colorblind = (myTank->getFlag() == Flags::Colorblindness); remotePlayers[i]->addShots(scene, colorblind); TeamColor effectiveTeam = RogueTeam; if (!colorblind){ if ((remotePlayers[i]->getFlag() == Flags::Masquerade) && (myTank->getFlag() != Flags::Seer) && (myTank->getTeam() != ObserverTeam)) { effectiveTeam = myTank->getTeam(); } else { effectiveTeam = remotePlayers[i]->getTeam(); } } const bool inCockpt = ROAM.isRoaming() && !devDriving && (ROAM.getMode() == Roaming::roamViewFP) && ROAM.getTargetTank() && (ROAM.getTargetTank()->getId() == i); const bool showPlayer = !inCockpt || showTreads; // add player tank if required remotePlayers[i]->addToScene(scene, effectiveTeam, inCockpt, seerView, showPlayer, showPlayer /*showIDL*/); } } // add explosions addExplosions(scene); // if inside a building, add some eighth dimension scene nodes. const std::vector& list = myTank->getInsideBuildings(); for (unsigned int n = 0; n < list.size(); n++) { const Obstacle* obs = list[n]; const int nodeCount = obs->getInsideSceneNodeCount(); SceneNode** nodeList = obs->getInsideSceneNodeList(); for (int o = 0; o < nodeCount; o++) { scene->addDynamicNode(nodeList[o]); } } } // turn blanking and inversion on/off as appropriate sceneRenderer->setBlank(myTank && (myTank->isPaused() || myTank->getFlag() == Flags::Blindness)); sceneRenderer->setInvert(myTank && myTank->isPhantomZoned()); // turn on scene dimming when showing menu, when we're dead // and no longer exploding, or when we are in a building. bool insideDim = false; if (myTank) { const float hnp = 0.5f * NearPlane; // half near plane distance const float* eye = viewFrustum.getEye(); const float* dir = viewFrustum.getDirection(); float clipPos[3]; clipPos[0] = eye[0] + (dir[0] * hnp); clipPos[1] = eye[1] + (dir[1] * hnp); clipPos[2] = eye[2]; const Obstacle* obs; obs = world->inBuilding(clipPos, myTank->getAngle(), hnp, 0.0f, 0.0f); if (obs != NULL) { insideDim = true; } } sceneRenderer->setDim(HUDDialogStack::get()->isActive() || insideDim || ((myTank && !ROAM.isRoaming() && !devDriving) && !myTank->isAlive() && !myTank->isExploding())); // turn on panel dimming when showing the menu (both radar and chat) if (HUDDialogStack::get()->isActive()) { if (controlPanel) { controlPanel->setDimming(0.8f); } if (radar) { radar->setDimming(0.8f); } } else { if (controlPanel) { controlPanel->setDimming(0.0f); } if (radar) { radar->setDimming(0.0f); } } // set hud state hud->setDim(HUDDialogStack::get()->isActive()); hud->setPlaying(myTank && (myTank->isAlive() && !myTank->isPaused())); hud->setRoaming(ROAM.isRoaming()); hud->setCracks(myTank && !firstLife && !justJoined && !myTank->isAlive()); // get frame start time if (showDrawTime) { #if defined(DEBUG_RENDERING) // get an accurate measure of frame time (at expense of frame rate) if (BZDB.isTrue("glFinish")) { glFinish(); } #endif media->stopwatch(true); } // so observers can have enhanced radar if (ROAM.isRoaming() && myTank && !devDriving) { if (ROAM.getMode() == Roaming::roamViewFP && ROAM.getTargetTank()) myTank->setZpos(ROAM.getTargetTank()->getPosition()[2]); else myTank->setZpos(ROAM.getCamera()->pos[2]); } // let the hud save off the view matrix so it can do view projections if (hud) { hud->saveMatrixes(viewFrustum.getViewMatrix(), viewFrustum.getProjectionMatrix()); } // draw frame if (viewType == SceneRenderer::ThreeChannel) { // draw center channel sceneRenderer->render(false); drawUI(); // set up for drawing left channel mainWindow->setQuadrant(MainWindow::LowerLeft); // FIXME -- this assumes up is along +z const float cFOV = cosf(fov); const float sFOV = sinf(fov); targetPoint[0] = eyePoint[0] + cFOV*myTankDir[0] - sFOV*myTankDir[1]; targetPoint[1] = eyePoint[1] + cFOV*myTankDir[1] + sFOV*myTankDir[0]; targetPoint[2] = eyePoint[2] + myTankDir[2]; viewFrustum.setView(eyePoint, targetPoint); // draw left channel sceneRenderer->render(false, true, true); // set up for drawing right channel mainWindow->setQuadrant(MainWindow::LowerRight); // FIXME -- this assumes up is along +z targetPoint[0] = eyePoint[0] + cFOV*myTankDir[0] + sFOV*myTankDir[1]; targetPoint[1] = eyePoint[1] + cFOV*myTankDir[1] - sFOV*myTankDir[0]; targetPoint[2] = eyePoint[2] + myTankDir[2]; viewFrustum.setView(eyePoint, targetPoint); // draw right channel sceneRenderer->render(true, true, true); #if defined(DEBUG_RENDERING) // set up for drawing rear channel mainWindow->setQuadrant(MainWindow::UpperLeft); // FIXME -- this assumes up is along +z targetPoint[0] = eyePoint[0] - myTankDir[0]; targetPoint[1] = eyePoint[1] - myTankDir[1]; targetPoint[2] = eyePoint[2] + myTankDir[2]; viewFrustum.setView(eyePoint, targetPoint); // draw rear channel sceneRenderer->render(true, true, true); #endif // back to center channel mainWindow->setQuadrant(MainWindow::UpperRight); } else if (viewType == SceneRenderer::Stacked) { float EyeDisplacement = 0.25f * BZDBCache::tankWidth; float FocalPlane = BZDB.eval(StateDatabase::BZDB_BOXBASE); if (BZDB.isSet("eyesep")) EyeDisplacement = BZDB.eval("eyesep"); if (BZDB.isSet("focal")) FocalPlane = BZDB.eval("focal"); // setup view for left eye viewFrustum.setOffset(EyeDisplacement, FocalPlane); // draw left eye's view sceneRenderer->render(false); drawUI(); // set up view for right eye mainWindow->setQuadrant(MainWindow::UpperHalf); viewFrustum.setOffset(-EyeDisplacement, FocalPlane); // draw right eye's view sceneRenderer->render(true, true); drawUI(); // draw common stuff // back to left channel mainWindow->setQuadrant(MainWindow::LowerHalf); } else if (viewType == SceneRenderer::Stereo) { float EyeDisplacement = 0.25f * BZDBCache::tankWidth; float FocalPlane = BZDB.eval(StateDatabase::BZDB_BOXBASE); if (BZDB.isSet("eyesep")) EyeDisplacement = BZDB.eval("eyesep"); if (BZDB.isSet("focal")) FocalPlane = BZDB.eval("focal"); // setup view for left eye #ifdef USE_GL_STEREO glDrawBuffer(GL_BACK_LEFT); #endif viewFrustum.setOffset(EyeDisplacement, FocalPlane); // draw left eye's view sceneRenderer->render(false); #ifndef USE_GL_STEREO drawUI(); #endif // set up view for right eye #ifdef USE_GL_STEREO glDrawBuffer(GL_BACK_RIGHT); #else mainWindow->setQuadrant(MainWindow::UpperLeft); #endif viewFrustum.setOffset(-EyeDisplacement, FocalPlane); // draw right eye's view sceneRenderer->render(true, true); #ifndef USE_GL_STEREO drawUI(); #endif // draw common stuff #ifdef USE_GL_STEREO glDrawBuffer(GL_BACK); drawUI(); #endif #ifndef USE_GL_STEREO // back to left channel mainWindow->setQuadrant(MainWindow::UpperRight); #endif } else if (viewType == SceneRenderer::Anaglyph) { float EyeDisplacement = 0.25f * BZDBCache::tankWidth; float FocalPlane = BZDB.eval(StateDatabase::BZDB_BOXBASE); if (BZDB.isSet("eyesep")) EyeDisplacement = BZDB.eval("eyesep"); if (BZDB.isSet("focal")) FocalPlane = BZDB.eval("focal"); // setup view for left eye glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); viewFrustum.setOffset(EyeDisplacement, FocalPlane); // draw left eye's view sceneRenderer->render(false); drawUI(); // set up view for right eye glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); // for red/blue to somewhat work ... //glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE); viewFrustum.setOffset(-EyeDisplacement, FocalPlane); // draw right eye's view sceneRenderer->render(true, true); drawUI(); } else if (viewType == SceneRenderer::Interlaced) { float EyeDisplacement = 0.25f * BZDBCache::tankWidth; float FocalPlane = BZDB.eval(StateDatabase::BZDB_BOXBASE); const int width = mainWindow->getWidth(); const int height = mainWindow->getHeight(); if (BZDB.isSet("eyesep")) EyeDisplacement = BZDB.eval("eyesep"); if (BZDB.isSet("focal")) FocalPlane = BZDB.eval("focal"); if (BZDBCache::stencilShadows) { BZDB.set("stencilShadows", "0"); addMessage(NULL, "Disabled stencilShadows for interlaced mode"); } OpenGLGState::resetState(); // enable stencil test glEnable(GL_STENCIL_TEST); // clear stencil glClearStencil(0); // Clear color and stencil buffer glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // All drawing commands fail the stencil test, and are not // drawn, but increment the value in the stencil buffer. glStencilFunc(GL_NEVER, 0x0, 0x0); glStencilOp(GL_INCR, GL_INCR, GL_INCR); glColor3f(1.0f, 1.0f, 1.0f); for (int y=0;y<=height;y+=2) { glBegin(GL_LINES); glVertex2i(0, y); glVertex2i(width, y); glEnd(); } // draw except where the stencil pattern is 0x1 // do not change the stencil buffer glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // setup view for left eye viewFrustum.setOffset(EyeDisplacement, FocalPlane); // draw left eye's view sceneRenderer->render(false); // draw where the stencil pattern is 0x1 // do not change the stencil buffer glStencilFunc(GL_EQUAL, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // set up view for right eye viewFrustum.setOffset(-EyeDisplacement, FocalPlane); // draw right eye's view sceneRenderer->render(true, true); glStencilFunc(GL_ALWAYS, 0x1, 0x1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); drawUI(); } else { // normal rendering sceneRenderer->render(); // draw other stuff drawUI(); } // get frame end time if (showDrawTime) { #if defined(DEBUG_RENDERING) // get an accurate measure of frame time (at expense of frame rate) if (BZDB.isTrue("glFinish")) { glFinish(); } #endif hud->setDrawTime((float)media->stopwatch(false)); } // draw a fake cursor if requested. this is mostly intended for // pass through 3D cards that don't have cursor support. if (BZDB.isTrue("fakecursor")) { int mx, my; const int width = mainWindow->getWidth(); const int height = mainWindow->getHeight(); const int ox = mainWindow->getOriginX(); const int oy = mainWindow->getOriginY(); mainWindow->getWindow()->getMouse(mx, my); my = height - my - 1; glScissor(ox, oy, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, width, 0.0, height, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glColor3f(0.0f, 0.0f, 0.0f); glRecti(mx - 8, my - 2, mx - 2, my + 2); glRecti(mx + 2, my - 2, mx + 8, my + 2); glRecti(mx - 2, my - 8, mx + 2, my - 2); glRecti(mx - 2, my + 2, mx + 2, my + 8); glColor3f(1.0f, 1.0f, 1.0f); glRecti(mx - 7, my - 1, mx - 3, my + 1); glRecti(mx + 3, my - 1, mx + 7, my + 1); glRecti(mx - 1, my - 7, mx + 1, my - 3); glRecti(mx - 1, my + 3, mx + 1, my + 7); glPopMatrix(); } mainWindow->getWindow()->swapBuffers(); // remove dynamic nodes from this frame if (scene) { scene->removeDynamicNodes(); } } else { // wait around a little to avoid spinning the CPU when iconified TimeKeeper::sleep(0.05f); } } //============================================================================// static void roamSmoothFollow(Roaming::RoamingCamera& deltaCamera) { Player* p = ROAM.getTargetTank(); if (!p) { return; } const float dist = BZDB.eval("followDist"); const float height = BZDB.eval("followHeight"); const float speedX = BZDB.eval("followSpeedX"); const float speedY = BZDB.eval("followSpeedY"); const float speedZ = BZDB.eval("followSpeedZ"); const float* pos = p->getPosition(); const float* fwd = p->getForward(); const float target[3] = { pos[0] - (fwd[0] * dist), pos[1] - (fwd[1] * dist), pos[2] + height }; const float* current = ROAM.getCamera()->pos; const float delta[3] = { target[0] - current[0], target[1] - current[1], target[2] - current[2] }; const float theta = ROAM.getCamera()->theta; const float c = cosf(theta * (float)(M_PI / 180.0f)); const float s = sinf(theta * (float)(M_PI / 180.0f)); const float f[2] = { +c, +s }; const float r[2] = { +s, -c }; deltaCamera.pos[0] = +speedX * ((delta[0] * f[0]) + (delta[1] * f[1])); deltaCamera.pos[1] = -speedY * ((delta[0] * r[0]) + (delta[1] * r[1])); deltaCamera.pos[2] = +speedZ * delta[2]; deltaCamera.theta = 0.0f; deltaCamera.phi = 0.0f; } enum MouseButtonBits { leftMouseBit = (1 << 0), rightMouseBit = (1 << 1), middleMouseBit = (1 << 2) }; enum MouseCtrlType { NoCtrl, ShiftX, // left/right ShiftY, // backwards/forewards ShiftZ, // up/down SpinX, // tilt (phi) SpinY, // -- not used -- SpinZ // heading (theta) }; struct MouseCtrlPair { MouseCtrlType x; MouseCtrlType y; }; static const uint8_t mouseCtrlMask = 0x7; static const MouseCtrlPair mouseCtrlMap[8] = { // X Y { NoCtrl, NoCtrl }, // . . . { SpinZ, ShiftY }, // L . . { SpinZ, SpinX }, // . R . { ShiftX, ShiftY }, // L R . { ShiftX, ShiftZ }, // . . M { SpinZ, ShiftZ }, // L . M { SpinZ, ShiftZ }, // . R M { ShiftX, ShiftY } // L R M }; static void setupRoamingCamera(float dt) { static Roaming::RoamingCamera prevDeltaCamera; static bool inited = false; static int prevMouseBits = 0; int currMouseBits = (leftMouseButton ? leftMouseBit : 0) | (rightMouseButton ? rightMouseBit : 0) | (middleMouseButton ? middleMouseBit : 0); if (!inited) { memset(&prevDeltaCamera, 0, sizeof(Roaming::RoamingCamera)); inited = true; } Roaming::RoamingCamera deltaCamera; memset(&deltaCamera, 0, sizeof(Roaming::RoamingCamera)); // move roaming camera if (myTank) { int mx, my; mainWindow->getMousePosition(mx, my); const MouseCtrlPair currCtrl = mouseCtrlMap[currMouseBits]; const MouseCtrlPair prevCtrl = mouseCtrlMap[prevMouseBits]; if (currCtrl.x == prevCtrl.x) { if (currCtrl.y != prevCtrl.y) { mainWindow->warpMouseCenterY(); my = 0; } } else if (currCtrl.y == prevCtrl.y) { mainWindow->warpMouseCenterX(); mx = 0; } else { mainWindow->warpMouse(); mx = my = 0; } if (currMouseBits != 0) { // mouse control const float spinMult = -100.0f; const float shiftMult = -1.25f * BZDBCache::worldSize; const int wx = mainWindow->getWidth(); const int wy = mainWindow->getViewHeight(); const int ws = (wx < wy) ? wx : wy; const float wf = 1.0f / (float(ws * ws) * 0.25f); const float sx = float(mx * abs(mx)) * wf; const float sy = float(my * abs(my)) * wf; switch (currCtrl.x) { case SpinZ: { deltaCamera.theta = spinMult * sx; break; } case ShiftX: { deltaCamera.pos[1] = shiftMult * sx; break; } default: { break; } } switch (currCtrl.y) { case SpinX: { deltaCamera.phi = spinMult * sy; break; } case ShiftY: { deltaCamera.pos[0] = shiftMult * sy; break; } case ShiftZ: { deltaCamera.pos[2] = shiftMult * sy; break; } default: { break; } } } else { // keyboard control bool control = ((shiftKeyStatus & BzfKeyEvent::ControlKey) != 0); bool alt = ((shiftKeyStatus & BzfKeyEvent::AltKey) != 0); bool shift = ((shiftKeyStatus & BzfKeyEvent::ShiftKey) != 0); if (display->hasGetKeyMode()) { display->getModState (shift, control, alt); } if (!control && !shift) { deltaCamera.pos[0] = (float)(4 * myTank->getSpeed()) * BZDBCache::tankSpeed; } if (alt) { deltaCamera.pos[1] = (float)(4 * myTank->getRotation()) * BZDBCache::tankSpeed; } else { deltaCamera.theta = ROAM.getZoom() * (float)myTank->getRotation(); } if (control) { deltaCamera.phi = -2.0f * ROAM.getZoom() / 3.0f * (float)myTank->getSpeed(); } if (shift) { deltaCamera.pos[2] = (float)(-4 * myTank->getSpeed()) * BZDBCache::tankSpeed; } } } // adjust for slow keyboard float st = BZDB.eval("roamSmoothTime"); if (BZDB.isTrue("slowKeyboard") != (st < 0.0f)) { if (ROAM.getMode() == Roaming::roamViewFollow) { roamSmoothFollow(deltaCamera); } st = fabsf(st); if (st < 0.1f) { st = 0.1f; } const float at = (dt / st); const float bt = 1.0f - at; deltaCamera.pos[0] = (at * deltaCamera.pos[0]) + (bt * prevDeltaCamera.pos[0]); deltaCamera.pos[1] = (at * deltaCamera.pos[1]) + (bt * prevDeltaCamera.pos[1]); deltaCamera.pos[2] = (at * deltaCamera.pos[2]) + (bt * prevDeltaCamera.pos[2]); deltaCamera.theta = (at * deltaCamera.theta) + (bt * prevDeltaCamera.theta); deltaCamera.phi = (at * deltaCamera.phi) + (bt * prevDeltaCamera.phi); } deltaCamera.zoom = roamDZoom; ROAM.updatePosition(&deltaCamera, dt); // copy the old delta values memcpy(&prevDeltaCamera, &deltaCamera, sizeof(Roaming::RoamingCamera)); prevMouseBits = currMouseBits; return; } //============================================================================// static void prepareTheHUD() { // prep the HUD if (myTank) { const float* myPos = myTank->getPosition(); hud->setHeading(myTank->getAngle()); hud->setAltitude(myPos[2]); if (world->allowTeamFlags()) { const float* myTeamColor = Team::getTankColor(myTank->getTeam()); // markers for my team flag for (int i = 0; i < numFlags; i++) { Flag& flag = world->getFlag(i); if ((flag.type->flagTeam == myTank->getTeam()) && ((flag.status != FlagOnTank) || (flag.owner != myTank->getId()))) { const float* flagPos = flag.position; float heading = atan2f(flagPos[1] - myPos[1],flagPos[0] - myPos[0]); hud->addMarker(heading, myTeamColor); hud->AddEnhancedMarker(Float3ToVec3(flagPos), Float3ToVec4(myTeamColor), false, BZDBCache::flagPoleSize * 2.0f); } } } if (myTank->getAntidoteLocation()) { // marker for my antidote flag const GLfloat* antidotePos = myTank->getAntidoteLocation(); float heading = atan2f(antidotePos[1] - myPos[1], antidotePos[0] - myPos[0]); const float antidoteColor[] = {1.0f, 1.0f, 0.0f,1.0f}; hud->addMarker(heading, antidoteColor); hud->AddEnhancedMarker(Float3ToVec3(antidotePos), Float4ToVec4(antidoteColor), false, BZDBCache::flagPoleSize * 2.0f); } } return; } static void updatePauseCountdown(float dt) { if (!myTank) { pauseCountdown = 0.0f; } if (pauseCountdown > 0.0f && !myTank->isAlive()) { pauseCountdown = 0.0f; hud->setAlert(1, NULL, 0.0f, true); } if (pauseCountdown > 0.0f) { const int oldPauseCountdown = (int)(pauseCountdown + 0.99f); pauseCountdown -= dt; if (pauseCountdown <= 0.0f) { /* make sure it is really safe to pause.. since the server * might make us drop our flag, make sure the player is on the * ground and not in a building. prevents getting kicked * later for being in places we shouldn't without holding the * right flags. */ if (myTank->getLocation() == LocalPlayer::InBuilding) { // custom message when trying to pause while in a building // (could get stuck on un-pause if flag is taken/lost) hud->setAlert(1, "Can't pause while inside a building", 1.0f, false); } else if (myTank->getLocation() == LocalPlayer::InAir) { // custom message when trying to pause when jumping/falling hud->setAlert(1, "Can't pause when you are in the air", 1.0f, false); } else if (myTank->getLocation() != LocalPlayer::OnGround && myTank->getLocation() != LocalPlayer::OnBuilding) { // catch-all message when trying to pause when you should not hud->setAlert(1, "Unable to pause right now", 1.0f, false); } else if (myTank->isPhantomZoned()) { // custom message when trying to pause while zoned hud->setAlert(1, "Can't pause when you are in the phantom zone", 1.0f, false); } else { // okay, now we pause. first drop any team flag we may have. const FlagType* flagd = myTank->getFlag(); if (flagd->flagTeam != NoTeam) serverLink->sendDropFlag(myTank->getPosition()); if (World::getWorld()->allowRabbit() && (myTank->getTeam() == RabbitTeam)) serverLink->sendNewRabbit(); // now actually pause myTank->setPause(true); hud->setAlert(1, NULL, 0.0f, true); controlPanel->addMessage("Paused"); // turn off the sound if (savedVolume == -1) { savedVolume = getSoundVolume(); setSoundVolume(0); } // ungrab mouse mainWindow->ungrabMouse(); } } else if ((int)(pauseCountdown + 0.99f) != oldPauseCountdown && !pausedByUnmap) { // update countdown alert char msgBuf[40]; sprintf(msgBuf, "Pausing in %d", (int)(pauseCountdown + 0.99f)); hud->setAlert(1, msgBuf, 1.0f, false); } } return; } static void updateDestructCountdown(float dt) { if (!myTank) { destructCountdown = 0.0f; } if (destructCountdown > 0.0f && !myTank->isAlive()) { destructCountdown = 0.0f; hud->setAlert(1, NULL, 0.0f, true); } if (destructCountdown > 0.0f) { const int oldDestructCountdown = (int)(destructCountdown + 0.99f); destructCountdown -= dt; if (destructCountdown <= 0.0f) { // now actually destruct gotBlowedUp( myTank, SelfDestruct, myTank->getId() ); hud->setAlert(1, NULL, 0.0f, true); } else if ((int)(destructCountdown + 0.99f) != oldDestructCountdown) { // update countdown alert char msgBuf[40]; sprintf(msgBuf, "Self Destructing in %d", (int)(destructCountdown + 0.99f)); hud->setAlert(1, msgBuf, 1.0f, false); } } return; } // // main playing loop // static void playingLoop() { int i; // main loop while (!CommandsStandard::isQuit()) { BZDBCache::update(); // set this step game time GameTime::setStepTime(); // get delta time TimeKeeper prevTime = TimeKeeper::getTick(); TimeKeeper::setTick(); const float dt = float(TimeKeeper::getTick() - prevTime); mainWindow->getWindow()->yieldCurrent(); // see if the world collision grid needs to be updated if (world) { world->checkCollisionManager(); } mainWindow->getWindow()->yieldCurrent(); // try to join a game if requested. do this *before* handling // events so we do a redraw after the request is posted and // before we actually try to join. if (joinRequested) { // if already connected to a game then first sign off if (myTank) leaveGame(); // get token if we need to (have a password but no token) if ((startupInfo.token[0] == '\0') && (startupInfo.password[0] != '\0')) { ServerList* serverList = new ServerList; serverList->startServerPings(&startupInfo); // wait no more than 10 seconds for a token for (int j = 0; j < 40; j++) { serverList->checkEchos(getStartupInfo()); cURLManager::perform(); if (startupInfo.token[0] != '\0') break; TimeKeeper::sleep(0.25f); } delete serverList; } // don't let the bad token specifier slip through to the server, // just erase it if (strcmp(startupInfo.token, "badtoken") == 0) startupInfo.token[0] = '\0'; ares->queryHost(startupInfo.serverName); waitingDNS = true; // don't try again joinRequested = false; } if (waitingDNS) { fd_set readers, writers; int nfds = -1; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; FD_ZERO(&readers); FD_ZERO(&writers); ares->setFd(&readers, &writers, nfds); nfds = select(nfds + 1, (fd_set*)&readers, (fd_set*)&writers, 0, &timeout); ares->process(&readers, &writers); struct in_addr inAddress; AresHandler::ResolutionStatus status = ares->getHostAddress(&inAddress); if (status == AresHandler::Failed) { HUDDialogStack::get()->setFailedMessage("Server not found"); waitingDNS = false; } else if (status == AresHandler::HbNSucceeded) { // now try connecting serverNetworkAddress = Address(inAddress); joinInternetGame(); waitingDNS = false; } } mainWindow->getWindow()->yieldCurrent(); // handle pending events for some small fraction of time clockAdjust = 0.0f; processInputEvents(0.1f); if (mainWindow->haveJoystick()) { static const BzfKeyEvent::Button button_map[] = { BzfKeyEvent::BZ_Button_1, BzfKeyEvent::BZ_Button_2, BzfKeyEvent::BZ_Button_3, BzfKeyEvent::BZ_Button_4, BzfKeyEvent::BZ_Button_5, BzfKeyEvent::BZ_Button_6, BzfKeyEvent::BZ_Button_7, BzfKeyEvent::BZ_Button_8, BzfKeyEvent::BZ_Button_9, BzfKeyEvent::BZ_Button_10, BzfKeyEvent::BZ_Button_11, BzfKeyEvent::BZ_Button_12, BzfKeyEvent::BZ_Button_13, BzfKeyEvent::BZ_Button_14, BzfKeyEvent::BZ_Button_15, BzfKeyEvent::BZ_Button_16, BzfKeyEvent::BZ_Button_17, BzfKeyEvent::BZ_Button_18, BzfKeyEvent::BZ_Button_19, BzfKeyEvent::BZ_Button_20, BzfKeyEvent::BZ_Button_21, BzfKeyEvent::BZ_Button_22, BzfKeyEvent::BZ_Button_23, BzfKeyEvent::BZ_Button_24, BzfKeyEvent::BZ_Button_25, BzfKeyEvent::BZ_Button_26, BzfKeyEvent::BZ_Button_27, BzfKeyEvent::BZ_Button_28, BzfKeyEvent::BZ_Button_29, BzfKeyEvent::BZ_Button_30, BzfKeyEvent::BZ_Button_31, BzfKeyEvent::BZ_Button_32, }; static unsigned long old_buttons = 0; const int button_count = countof(button_map); unsigned long new_buttons = mainWindow->getJoyButtonSet(); if (old_buttons != new_buttons) for (int j = 0; j < button_count; j++) { if ((old_buttons & (1<getNumHats(); if (num_hats > max_hats) num_hats = max_hats; // num_hats min= max_hats; static std::vector hats(max_hats, -1); const float variance = 360 / num_buttons / 2; // 45/2 or 22.5 BzfKeyEvent ev; // must be out here because of false doKey ev.ascii = 0; ev.shift = 0; for (int hat = 0; hat < num_hats; hat++) { float hatX, hatY; mainWindow->getJoyHat(hat, hatX, hatY); if (hatX == 0 && hatY == 0) { if (hats[hat] != -1) { doKey(ev, false); // unset when centered hats[hat] = -1; } } else { int button = -1; // buttons are counted clockwise to left float angle = atan2(hatY, hatX) * 180 / (float)M_PI; for (int b = -1; b < num_buttons; b++) { float testangle = -180 + 2 * variance * (b + 1); // -180 to 180 by 45 if (testangle - variance <= angle && angle < testangle + variance) { button = b; // 0 to 7 if (b == -1) button = num_buttons - 1; // 7 if (button != hats[hat]) { if (hats[hat] != -1) doKey(ev, false); // unset when spinning ev.button = hat_map[button + hat * num_buttons]; doKey(ev, true); hats[hat] = button; } } } } } } mainWindow->getWindow()->yieldCurrent(); // invoke callbacks callPlayingCallbacks(); mainWindow->getWindow()->yieldCurrent(); // quick out if (CommandsStandard::isQuit()) { break; } // if server died then leave the game (note that this may cause // further server errors but that's okay). if (serverError || (serverLink && serverLink->getState() == ServerLink::Hungup)) { // if we haven't reported the death yet then do so now if (serverDied || (serverLink && serverLink->getState() == ServerLink::Hungup)) { printError("Server has unexpectedly disconnected"); } leaveGame(); } // update time of day -- update sun and sky every few seconds float syncTime = BZDB.eval(StateDatabase::BZDB_SYNCTIME); if (syncTime < 0.0f) { if (!BZDB.isSet("fixedTime")) { epochOffset += (double)dt; } epochOffset += (double)(50.0f * dt * clockAdjust); } else { epochOffset = (double)syncTime; lastEpochOffset += (double)dt; } if (fabs(epochOffset - lastEpochOffset) >= 4.0) { updateDaylight(epochOffset, *sceneRenderer); lastEpochOffset = epochOffset; } // update the wind if (world) { world->updateWind(dt); } // move roaming camera if (ROAM.isRoaming()) { setupRoamingCamera(dt); ROAM.buildRoamingLabel(); } // update test video format timer if (testVideoFormatTimer > 0.0f) { testVideoFormatTimer -= dt; if (testVideoFormatTimer <= 0.0f) { testVideoFormatTimer = 0.0f; setVideoFormat(testVideoPrevFormat); } } // update the countdowns updatePauseCountdown(dt); updateDestructCountdown(dt); // notify if input changed if ((myTank != NULL) && (myTank->queryInputChange() == true)) { controlPanel->addMessage( LocalPlayer::getInputMethodName(myTank->getInputMethod()) + " movement"); } // update other tank's shots for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) { remotePlayers[i]->updateShots(dt); } } // update servers shots const World *_world = World::getWorld(); if (_world) { _world->getWorldWeapons()->updateShots(dt); } // update track marks (before any tanks are moved) TrackMarks::update(dt); // do dead reckoning on remote players for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) { const bool wasNotResponding = remotePlayers[i]->isNotResponding(); remotePlayers[i]->doDeadReckoning(); const bool isNotResponding = remotePlayers[i]->isNotResponding(); if (!wasNotResponding && isNotResponding) { addMessage(remotePlayers[i], "not responding"); } else if (wasNotResponding && !isNotResponding) { addMessage(remotePlayers[i], "okay"); } } } // do motion if (myTank) { if (myTank->isAlive() && !myTank->isPaused()) { doMotion(); if (scoreboard->getHuntState()==ScoreboardRenderer::HUNT_ENABLED) { setHuntTarget(); //spot hunt target } if (myTank->getTeam() != ObserverTeam && ((fireButton && myTank->getFlag() == Flags::MachineGun) || (myTank->getFlag() == Flags::TriggerHappy))) { myTank->fireShot(); } setLookAtMarker(); // see if we have a target, if so lock on to the bastage const Player* targetdPlayer = myTank->getTarget(); if (targetdPlayer && targetdPlayer->isAlive() && targetdPlayer->getFlag() != Flags::Stealth) { hud->AddLockOnMarker(Float3ToVec3(myTank->getTarget()->getPosition()), myTank->getTarget()->getCallSign(), !isKillable(myTank->getTarget())); } else // if we should not have a target, force that target to be cleared myTank->setTarget(NULL); } else { int mx, my; mainWindow->getMousePosition(mx, my); } myTank->update(); } #ifdef ROBOT if (entered) { updateRobots(dt); } #endif // check for flags and hits checkEnvironment(); #ifdef ROBOT if (entered) { checkEnvironmentForRobots(); } #endif // adjust properties based on flags (dimensions, cloaking, etc...) if (myTank) { myTank->updateTank(dt, true); } for (i = 0; i < curMaxPlayers; i++) { if (remotePlayers[i]) { remotePlayers[i]->updateTank(dt, false); } } // reposition flags updateFlags(dt); // update explosion animations updateExplosions(dt); // update mesh animations if (world) { world->updateAnimations(dt); } // prep the HUD prepareTheHUD(); // draw the frame drawFrame(dt); // play the sounds updateSound(); bool sendUpdate = myTank && myTank->isDeadReckoningWrong(); if (myTank && myTank->getTeam() == ObserverTeam) { if (BZDB.isTrue("sendObserverHeartbeat")) { double heartbeatTime = BZDB.isSet("observerHeartbeat") ? BZDB.eval("observerHeartbeat") : 30.0f; if (lastObserverUpdateTime + heartbeatTime < TimeKeeper::getTick().getSeconds()) { lastObserverUpdateTime = TimeKeeper::getTick().getSeconds(); sendUpdate = true; } else { sendUpdate = false; } } else { sendUpdate = false; } } // send my data if ( sendUpdate) { // also calls setDeadReckoning() serverLink->sendPlayerUpdate(myTank); } #ifdef ROBOT if (entered) { sendRobotUpdates(); } #endif FlagSceneNode::freeFlag(); cURLManager::perform(); // check if we are waiting for initial texture downloading if (Downloads::requestFinalized()) { // downloading is terminated. go! Downloads::finalizeDownloads(); if (downloadingInitialTexture) { joinInternetGame2(); downloadingInitialTexture = false; } else { setSceneDatabase(); } } // limit the fps to save battery life by minimizing cpu usage if (BZDB.isTrue("saveEnergy")) { static TimeKeeper lastTime = TimeKeeper::getCurrent(); float fpsLimit = BZDB.eval("fpsLimit"); if (fpsLimit < 15 || isnan(fpsLimit)) fpsLimit = 15; TimeKeeper nextTime(lastTime); nextTime += 1.0f / fpsLimit; float remaining; while (1) { remaining = (float)(nextTime - TimeKeeper::getCurrent()); if (remaining > 1.0f) break; if (remaining <= 0.0f) break; // Instead of sleeping try to handle network packets char msg[MaxPacketLen]; uint16_t code, len; // handle server messages if (serverLink && !serverError) { int e = 0; e = serverLink->read(code, len, msg, int(remaining * 1000.0f)); if (e == 1) handleServerMessage(true, code, len, msg); if (e == -2) { printError("Server communication error"); serverError = true; break; } } else { TimeKeeper::sleep(remaining); break; } } lastTime = TimeKeeper::getCurrent(); } // end energy saver check // handle incoming packets doMessages(); } // end main client loop } // // game initialization // static float timeConfiguration(bool useZBuffer) { // prepare depth buffer if requested BZDB.set("zbuffer","1" ); if (useZBuffer) { glEnable(GL_DEPTH_TEST); glClear(GL_DEPTH_BUFFER_BIT); } // use glFinish() to get accurate timings //glFinish(); TimeKeeper startTime = TimeKeeper::getCurrent(); sceneRenderer->setExposed(); sceneRenderer->render(); // glFinish(); TimeKeeper endTime = TimeKeeper::getCurrent(); // turn off depth buffer if (useZBuffer) glDisable(GL_DEPTH_TEST); return float(endTime - startTime); } static void timeConfigurations() { static const float MaxFrameTime = 0.050f; // seconds TextureManager& tm = TextureManager::instance(); // ignore results of first test. OpenGL could be doing lazy setup. BZDB.set("blend", "1"); BZDB.set("smooth", "1"); BZDB.set("lighting", "2"); BZDB.set("texture", "1"); sceneRenderer->setQuality(3); BZDB.set("dither", "0"); BZDB.set("shadows", "1"); BZDB.set("radarStyle", "0"); tm.setMaxFilter(OpenGLTexture::Max); timeConfiguration(true); // try the best looking thing, most modern hardware can do it printError(" full quality"); BZDB.set("blend", "1"); BZDB.set("smooth", "1"); BZDB.set("lighting", "1"); tm.setMaxFilter(OpenGLTexture::Max); BZDB.set("texture", tm.getMaxFilterName()); sceneRenderer->setQuality(3); BZDB.set("dither", "0"); BZDB.set("shadows", "1"); BZDB.set("stencilShadows", "1"); BZDB.set("radarStyle", "3"); BZDB.set("shotLength", "6"); if (timeConfiguration(true) < MaxFrameTime) return; if (timeConfiguration(false) < MaxFrameTime) return; // turn stencil shadows off printError(" Stipple Shadows"); BZDB.set("stencilShadows", "0"); if (timeConfiguration(true) < MaxFrameTime) return; if (timeConfiguration(false) < MaxFrameTime) return; // turn blending off printError(" no Blend"); BZDB.set("blend", "0"); if (timeConfiguration(true) < MaxFrameTime) return; if (timeConfiguration(false) < MaxFrameTime) return; // turn blending on and texturing off printError(" no Blend"); BZDB.set("blend", "1"); BZDB.set("texture", "0"); BZDB.set("shotLength", "0"); if (timeConfiguration(true) < MaxFrameTime) return; if (timeConfiguration(false) < MaxFrameTime) return; // time lowest quality with and without blending. some systems // stipple very slowly even though everything else is fast. we // don't want to conclude the system is slow because of stippling. printError(" lowest quality"); const float timeNoBlendNoZ = timeConfiguration(false); const float timeNoBlendZ = timeConfiguration(true); BZDB.set("blend", "1"); const float timeBlendNoZ = timeConfiguration(false); const float timeBlendZ = timeConfiguration(true); if (timeNoBlendNoZ > MaxFrameTime && timeNoBlendZ > MaxFrameTime && timeBlendNoZ > MaxFrameTime && timeBlendZ > MaxFrameTime) { if (timeNoBlendNoZ < timeNoBlendZ && timeNoBlendNoZ < timeBlendNoZ && timeNoBlendNoZ < timeBlendZ) { // no depth, no blending definitely fastest BZDB.set("zbuffer", "1"); BZDB.set("blend", "1"); } if (timeNoBlendZ < timeBlendNoZ && timeNoBlendZ < timeBlendZ) { // no blending faster than blending BZDB.set("zbuffer", "1"); BZDB.set("blend", "1"); } if (timeBlendNoZ < timeBlendZ) { // blending faster than depth BZDB.set("zbuffer", "1"); BZDB.set("blend", "1"); } // blending and depth faster than without either BZDB.set("zbuffer", "1"); BZDB.set("blend", "1"); return; } } static void findFastConfiguration() { // time the rendering of the background with various rendering styles // until we find one fast enough. these tests assume that we're // going to be fill limited. each test comes in a pair: with and // without the zbuffer. // // this, of course, is only a rough estimate since we're not drawing // a normal frame (no radar, no HUD, no buildings, etc.). the user // can always turn stuff on later and the settings are remembered // across invocations. // setup projection float muzzleHeight = BZDB.eval(StateDatabase::BZDB_MUZZLEHEIGHT); static const GLfloat eyePoint[3] = { 0.0f, 0.0f, muzzleHeight }; static const GLfloat targetPoint[3] = { 0.0f, 10.0f, muzzleHeight }; sceneRenderer->getViewFrustum().setProjection((float)(45.0 * M_PI / 180.0), NearPlaneNormal, FarPlaneDefault, FarDeepPlaneDefault, mainWindow->getWidth(), mainWindow->getHeight(), mainWindow->getViewHeight()); sceneRenderer->getViewFrustum().setView(eyePoint, targetPoint); // add a big wall in front of where we're looking. this is important // because once textures are off, the background won't draw much of // anything. this will ensure that we continue to test polygon fill // rate. with one polygon it doesn't matter if we use a z or bsp // database. static const GLfloat base[3] = { -10.0f, 10.0f, 0.0f }; static const GLfloat sEdge[3] = { 20.0f, 0.0f, 0.0f }; static const GLfloat tEdge[3] = { 0.0f, 0.0f, 10.0f }; static const GLfloat color[4] = { 1.0f, 1.0f, 1.0f, 0.5f }; SceneDatabase* timingScene = new ZSceneDatabase; WallSceneNode* node = new QuadWallSceneNode(base, sEdge, tEdge, 1.0f, 1.0f, true); node->setColor(color); node->setModulateColor(color); node->setLightedColor(color); node->setLightedModulateColor(color); node->setTexture(HUDuiControl::getArrow()); node->setMaterial(OpenGLMaterial(color, color)); timingScene->addStaticNode(node, false); timingScene->finalizeStatics(); sceneRenderer->setSceneDatabase(timingScene); sceneRenderer->setDim(false); timeConfigurations(); sceneRenderer->setSceneDatabase(NULL); } static void defaultErrorCallback(const char* msg) { std::string message = ColorStrings[RedColor]; message += msg; controlPanel->addMessage(message); } static void startupErrorCallback(const char* msg) { controlPanel->addMessage(msg); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); controlPanel->render(*sceneRenderer); mainWindow->getWindow()->swapBuffers(); } void startPlaying(BzfDisplay* _display, SceneRenderer& renderer) { // initalization display = _display; sceneRenderer = &renderer; mainWindow = &sceneRenderer->getWindow(); lastObserverUpdateTime = TimeKeeper::getTick().getSeconds(); // register some commands for (unsigned int c = 0; c < countof(commandList); ++c) { CMDMGR.add(commandList[c].name, commandList[c].func, commandList[c].help); } // initialize the tank display lists // (do this before calling SceneRenderer::render()) TankGeometryMgr::init(); SphereLodSceneNode::init(); // make control panel ControlPanel _controlPanel(*mainWindow, *sceneRenderer); controlPanel = &_controlPanel; // make the radar RadarRenderer _radar(*sceneRenderer, world); radar = &_radar; // tie the radar to the control panel controlPanel->setRadarRenderer(radar); // tell the control panel how many frame buffers there are. we // cheat when drawing the control panel, not drawing it if it // hasn't changed. that only works if we've filled all the // frame buffers (e.g. front and back buffers) with the correct // data. // FIXME -- assuming the contents of any frame buffer except the // front buffer are anything but garbage violates the OpenGL // spec. we really should redraw the control panel every frame // but this works on every system so far. { int n = 3; // assume triple buffering switch (sceneRenderer->getViewType()) { case SceneRenderer::Stacked: case SceneRenderer::Stereo: #ifndef USE_GL_STEREO // control panel drawn twice per frame n *= 2; #endif break; case SceneRenderer::ThreeChannel: default: // only one copy of control panel visible break; } controlPanel->setNumberOfFrameBuffers(n); } // if no configuration go into a decent setup for a modern machine if (!startupInfo.hasConfiguration) { BZDB.set("blend", "1"); BZDB.set("smooth", "1"); BZDB.set("lighting", "2"); BZDB.set("tesselation", "1"); // lighting set to 0 overrides BZDB.set("texture", "1"); sceneRenderer->setQuality(3); BZDB.set("dither", "0"); BZDB.set("shadows", "2"); BZDB.set("radarStyle", "1"); TextureManager::instance().setMaxFilter(OpenGLTexture::Max); } // should we grab the mouse? #if defined(DEBUG) // don't grab for debug builds setGrabMouse(false); #elif defined(__linux__) // linux usually has a virtual root window so grab mouse always setGrabMouse(true); #else if (!BZDB.isSet("_window")) // otherwise, grab if fullscreen. { setGrabMouse(true); } #endif // show window and clear it immediately mainWindow->showWindow(true); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glDisable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); mainWindow->getWindow()->swapBuffers(); // resize and draw basic stuff glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_SCISSOR_TEST); controlPanel->resize(); sceneRenderer->render(); controlPanel->render(*sceneRenderer); mainWindow->getWindow()->swapBuffers(); // startup error callback adds message to control panel and // forces an immediate redraw. setErrorCallback(startupErrorCallback); // initialize epoch offset (time) userTimeEpochOffset = (double)mktime(&userTime); epochOffset = userTimeEpochOffset; updateDaylight(epochOffset, *sceneRenderer); lastEpochOffset = epochOffset; // catch kill signals before changing video mode so we can // put it back even if we die. ignore a few signals. bzSignal(SIGILL, SIG_PF(dying)); bzSignal(SIGABRT, SIG_PF(dying)); bzSignal(SIGSEGV, SIG_PF(dying)); bzSignal(SIGTERM, SIG_PF(suicide)); #if !defined(_WIN32) if (bzSignal(SIGINT, SIG_IGN) != SIG_IGN) bzSignal(SIGINT, SIG_PF(suicide)); bzSignal(SIGPIPE, SIG_PF(hangup)); bzSignal(SIGHUP, SIG_IGN); if (bzSignal(SIGQUIT, SIG_IGN) != SIG_IGN) bzSignal(SIGQUIT, SIG_PF(dying)); #ifndef GUSI_20 bzSignal(SIGBUS, SIG_PF(dying)); #endif bzSignal(SIGUSR1, SIG_IGN); bzSignal(SIGUSR2, SIG_IGN); #endif /* !defined(_WIN32) */ std::string videoFormat; int format = -1; if (BZDB.isSet("resolution")) { videoFormat = BZDB.get("resolution"); if (videoFormat.length() != 0) { format = display->findResolution(videoFormat.c_str()); if (format >= 0) { mainWindow->getWindow()->callResizeCallbacks(); } } }; // set the resolution (only if in full screen mode) if (!BZDB.isSet("_window") && BZDB.isSet("resolution")) { if (videoFormat.length() != 0) { if (display->isValidResolution(format) && display->getResolution() != format && display->setResolution(format)) { // handle resize if (BZDB.isSet("geometry")) { int w, h, x, y, count; char xs, ys; count = sscanf(BZDB.get("geometry").c_str(), "%dx%d%c%d%c%d", &w, &h, &xs, &x, &ys, &y); if (w < 256) w = 256; if (h < 192) h = 192; if (count == 6) { if (xs == '-') x = display->getWidth() - x - w; if (ys == '-') y = display->getHeight() - y - h; mainWindow->setPosition(x, y); } mainWindow->setSize(w, h); } else { mainWindow->setFullscreen(); } // more resize handling mainWindow->getWindow()->callResizeCallbacks(); mainWindow->warpMouse(); } } } // grab mouse if we should if (shouldGrabMouse()) mainWindow->grabMouse(); // draw again glClear(GL_COLOR_BUFFER_BIT); sceneRenderer->render(); controlPanel->render(*sceneRenderer); mainWindow->getWindow()->swapBuffers(); mainWindow->getWindow()->yieldCurrent(); // make heads up display HUDRenderer _hud(display, renderer); hud = &_hud; scoreboard = hud->getScoreboard(); // initialize control panel and hud updateNumPlayers(); updateFlag(Flags::Null); updateHighScores(); notifyBzfKeyMapChanged(); // make background renderer BackgroundRenderer background(renderer); sceneRenderer->setBackground(&background); // if no configuration file try to determine rendering settings // that yield reasonable performance. if (!startupInfo.hasConfiguration) { printError("testing performance; please wait..."); findFastConfiguration(); dumpResources(); } static const GLfloat zero[3] = { 0.0f, 0.0f, 0.0f }; TextureManager &tm = TextureManager::instance(); bool done = false; int explostion = 1; while (!done) { char text[256]; sprintf(text, "explode%d", explostion); int tex = tm.getTextureID(text, false); if (tex < 0) { done = true; } else { // make explosion scene node BillboardSceneNode* explosion = new BillboardSceneNode(zero); explosion->setTexture(tex); explosion->setTextureAnimation(8, 8); // add it to list of prototype explosions prototypeExplosions.push_back(explosion); explostion++; } } // let other stuff do initialization sceneBuilder = new SceneDatabaseBuilder(sceneRenderer); World::init(); // prepare dialogs mainMenu = new MainMenu; // normal error callback (doesn't force a redraw) setErrorCallback(defaultErrorCallback); // print debugging info { // Application version logDebugMessage(1,"BZFlag version: %s\n", getAppVersion()); // Protocol version logDebugMessage(1,"BZFlag protocol: %s\n", getProtocolVersion()); // OpenGL Driver Information logDebugMessage(1,"OpenGL vendor: %s\n", (const char*)glGetString(GL_VENDOR)); logDebugMessage(1,"OpenGL version: %s\n", (const char*)glGetString(GL_VERSION)); logDebugMessage(1,"OpenGL renderer: %s\n", (const char*)glGetString(GL_RENDERER)); // Depth Buffer bitplanes GLint zDepth; glGetIntegerv(GL_DEPTH_BITS, &zDepth); logDebugMessage(1,"Depth Buffer: %i bitplanes\n", zDepth); } // windows version can be very helpful in debug logs #ifdef _WIN32 if (debugLevel >= 1) { OSVERSIONINFO info; ZeroMemory(&info, sizeof(OSVERSIONINFO)); info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&info); logDebugMessage(1,"Running on Windows %s%d.%d %s\n", (info.dwPlatformId == VER_PLATFORM_WIN32_NT) ? "NT " : "", info.dwMajorVersion, info.dwMinorVersion, info.szCSDVersion); } #endif // print expiration if (timeBombString()) { // add message about date of expiration char bombMessage[80]; sprintf(bombMessage, "This release will expire on %s", timeBombString()); controlPanel->addMessage(bombMessage); } // send informative header to the console { std::string tmpString; controlPanel->addMessage(""); // print app version tmpString = ColorStrings[RedColor]; tmpString += "BZFlag version: "; tmpString += getAppVersion(); tmpString += " ("; tmpString += getProtocolVersion(); tmpString += ")"; controlPanel->addMessage(tmpString); // print copyright tmpString = ColorStrings[YellowColor]; tmpString += bzfcopyright; controlPanel->addMessage(tmpString); // print license tmpString = ColorStrings[CyanColor]; tmpString += "Distributed under the terms of the LGPL"; controlPanel->addMessage(tmpString); // print author tmpString = ColorStrings[GreenColor]; tmpString += "Author: Chris Schoeneman "; controlPanel->addMessage(tmpString); // print maintainer tmpString = ColorStrings[CyanColor]; tmpString += "Maintainer: Tim Riker "; controlPanel->addMessage(tmpString); // print audio driver std::string audioStr; PlatformFactory::getMedia()->audioDriver(audioStr); if (tmpString != "") { tmpString = ColorStrings[BlueColor]; tmpString += "Audio Driver: " + audioStr; controlPanel->addMessage(tmpString); } // print GL renderer tmpString = ColorStrings[PurpleColor]; tmpString += "OpenGL Driver: "; tmpString += (const char*)glGetString(GL_RENDERER); controlPanel->addMessage(tmpString); } // get current MOTD if (!BZDB.isTrue("disableMOTD")) { motd = new MessageOfTheDay; motd->getURL(BZDB.get("motdServer")); } // inform user of silencePlayers on startup for (unsigned int j = 0; j < silencePlayers.size(); j ++){ std::string aString = silencePlayers[j]; aString += " Silenced"; if (silencePlayers[j] == "*") { aString = "Silenced All Msgs"; } controlPanel->addMessage(aString); } // enter game if we have all the info we need, otherwise // pop up main menu if (startupInfo.autoConnect && startupInfo.callsign[0] && startupInfo.serverName[0]) { joinRequested = true; // show join menu to see connection errors mainMenu->createControls(); HUDDialogStack::get()->push(mainMenu); mainMenu->execute(); HUDui::setFocus(HUDui::getFocus()->getNext()); // select "Connect" HUDDialogStack::get()->top()->execute(); // show "Trying Automatic Connection..." } else { mainMenu->createControls(); HUDDialogStack::get()->push(mainMenu); } if (BZDB.isTrue("fakecursor")) mainWindow->getWindow()->hideMouse(); // start timing TimeKeeper::setTick(); updateDaylight(epochOffset, *sceneRenderer); worldDownLoader = new WorldDownLoader; // start game loop playingLoop(); delete worldDownLoader; // restore the sound. if we don't do this then we'll save the // wrong volume when we dump out the configuration file if the // app exits when the game is paused. if (savedVolume != -1) { setSoundVolume(savedVolume); savedVolume = -1; } // hide window mainWindow->showWindow(false); // clean up TankGeometryMgr::kill(); SphereLodSceneNode::kill(); if (resourceDownloader) delete resourceDownloader; delete motd; for (unsigned int ext = 0; ext < prototypeExplosions.size(); ext++) delete prototypeExplosions[ext]; prototypeExplosions.clear(); leaveGame(); setErrorCallback(NULL); while (HUDDialogStack::get()->isActive()) HUDDialogStack::get()->pop(); delete mainMenu; delete sceneBuilder; sceneRenderer->setBackground(NULL); sceneRenderer->setSceneDatabase(NULL); World::done(); mainWindow = NULL; sceneRenderer = NULL; display = NULL; cleanWorldCache(); } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/playing.h000066400000000000000000000070051200563112200173110ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * main game loop stuff */ #ifndef BZF_PLAYING_H #define BZF_PLAYING_H #include "common.h" // system includes #include #include /* common headers */ #include "StartupInfo.h" #include "AutoCompleter.h" /* local headers */ #include "MainWindow.h" #include "ControlPanel.h" #include "HUDRenderer.h" #include "Protocol.h" #define MAX_MESSAGE_HISTORY (20) typedef void (*JoinGameCallback)(bool success, void* data); typedef void (*ConnectStatusCallback)(std::string& str); typedef void (*PlayingCallback)(void*); struct PlayingCallbackItem { public: PlayingCallback cb; void* data; }; class BzfDisplay; class MainWindow; class SceneRenderer; class Player; class ServerLink; BzfDisplay* getDisplay(); MainWindow* getMainWindow(); SceneRenderer* getSceneRenderer(); void setSceneDatabase(); StartupInfo* getStartupInfo(); void notifyBzfKeyMapChanged(); bool setVideoFormat(int, bool test = false); Player* lookupPlayer(PlayerId id); void startPlaying(BzfDisplay* display, SceneRenderer&); bool addExplosion(const float* pos, float size, float duration); void addTankExplosion(const float* pos); void addShotExplosion(const float* pos); void addShotPuff(const float* pos, float azimuth, float elevation); void warnAboutMainFlags(); void warnAboutRadarFlags(); void warnAboutRadar(); void warnAboutConsole(); void addPlayingCallback(PlayingCallback, void* data); void removePlayingCallback(PlayingCallback, void* data); void joinGame(JoinGameCallback, void* userData); void leaveGame(); std::vector& getSilenceList(); void updateEvents(); void addMessage(const Player* player, const std::string& msg, int mode = 3, bool highlight = false, const char* oldColor = NULL); int curlProgressFunc(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow); void selectNextRecipient (bool forward, bool robotIn); void handleFlagDropped(Player* tank); void setTarget(); bool shouldGrabMouse(); void setRoamingLabel(); void drawFrame(const float dt); void initGlobalAres(); void killGlobalAres(); extern void joinGame(); extern HUDRenderer *hud; extern char messageMessage[PlayerIdPLen + MessageLen]; extern ServerLink* serverLink; extern int numFlags; extern StartupInfo startupInfo; extern DefaultCompleter completer; extern bool gameOver; extern ControlPanel *controlPanel; extern bool fireButton; extern float destructCountdown; extern bool pausedByUnmap; extern int savedVolume; extern MainWindow *mainWindow; extern float pauseCountdown; extern float clockAdjust; extern float roamDZoom; extern bool roamButton; #define MAX_DT_LIMIT 0.1f #define MIN_DT_LIMIT 0.001f enum BlowedUpReason { GotKilledMsg, GotShot, GotRunOver, GotCaptured, GenocideEffect, SelfDestruct, WaterDeath, LastReason, DeathTouch = PhysicsDriverDeath }; #endif // BZF_PLAYING_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/sound.cxx000066400000000000000000001004201200563112200173440ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "sound.h" // system headers #include #include #include // common headers #include "BzfMedia.h" #include "TimeKeeper.h" #include "PlatformFactory.h" #include "BZDBCache.h" #include "TextUtils.h" static const float SpeedOfSound(343.0f); // meters/sec static const size_t MaxEvents(30); static const float InterAuralDistance(0.1f); // meters /* NOTE: * world sounds use the ptrFrac member, local sounds the ptr member. * world sounds only use the monoaural samples so the ptrFrac member * is incremented by 1 for each sample. local sounds are in stereo * and ptr is incremented by 2 for each (stereo) sample. */ /* last position of the receiver */ static float lastX, lastY, lastZ, lastTheta; static float lastXLeft, lastYLeft; static float lastXRight, lastYRight; static float forwardX, forwardY; static float leftX, leftY; static int positionDiscontinuity; /* motion info for Doppler shift */ static float velX; static float velY; /* volume */ static float volumeAtten = 1.0f; static int mutingOn = 0; /* * producer/consumer shared data types and defines */ /* sound queue commands */ #define SQC_CLEAR 0 /* no code; no data */ #define SQC_SET_POS 1 /* no code; x,y,z,t */ #define SQC_SET_VEL 2 /* no code; x,y,z */ #define SQC_SET_VOLUME 3 /* code = new volume; no data */ #define SQC_LOCAL_SFX 4 /* code=sfx; no data */ #define SQC_WORLD_SFX 5 /* code=sfx; x,y,z of sfx source */ #define SQC_FIXED_SFX 6 /* code=sfx; x,y,z of sfx source */ #define SQC_JUMP_POS 7 /* no code; x,y,z,t */ #define SQC_QUIT 8 /* no code; no data */ #define SQC_IWORLD_SFX 9 /* code=sfx; x,y,z of sfx source */ // This structure is held in the audio queue until it is processed here struct SoundCommand { public: enum CMD {CLEAR, // no code, no data SET_POS, // no code; x,y,z,t SET_VEL, // no code; x,y,z SET_VOL, // code = new volume; no data LOCAL_SFX, // code = sfx; no data WORLD_SFX, // code = sfx; x,y,z of sfx source FIXED_SFX, // code = sfx; x,y,z of sfx source JUMP_POS, // no code; x,y,z,y QUIT, // no code; no data IWORLD_SFX // code = sfx; x,y,z of sfx source }; SoundCommand(); explicit SoundCommand(SoundCommand::CMD, int code_=-1, float x_=0, float y_=0, float z_=0, float t_=0); CMD cmd; int code; float x,y,z,t; }; SoundCommand::SoundCommand() : cmd(CLEAR), code(-1), x(0), y(0), z(0), t(0) { } SoundCommand::SoundCommand(CMD cmd_, int code_, float x_, float y_, float z_, float t_) : cmd(cmd_), code(code_), x(x_), y(y_), z(z_), t(t_) { } class AudioSamples { public: AudioSamples(); bool resample(const float* in, // stereo sampled data int frames, // number of stereo (left, right) frames int rate, // sample rate std::string const& name); // sound name size_t length() const; // size of the (stereo) data long mlength; /* total number samples in mono */ double dmlength; /* mlength as a double minus one */ std::vector data; /* left in even, right in odd */ std::vector monoRaw; /* mono with silence before & after */ size_t monoIdx; // index to start of mono samples double duration; /* time to play sound */ std::string file; }; AudioSamples::AudioSamples() : mlength(0), dmlength(0), data(), monoRaw(), monoIdx(0), duration(0) { } size_t AudioSamples::length() const { return data.size(); } bool AudioSamples::resample(const float* in, int frames, int rate, std::string const& name) { // safety check... SNH if (in == 0) return false; // attenuation on all sounds static const float GlobalAtten(0.5f); float const outputRate( (float)PlatformFactory::getMedia()->getAudioOutputRate() ); if (rate != outputRate) { std::cout << name << " rate is " << rate << "; audio output is " << outputRate << "\n"; // FIXME -- should resample -- let it through at wrong sample rate // return false; } // compute safety margin for left/right ear time discrepancy. since // each ear can hear a sound at slightly different times one ear might // be hearing a sound before the other hears it or one ear may no longer // be hearing a sound that the other is still hearing. if we didn't // account for this we'd end up sampling outside the mono buffer (and // only the mono buffer because the data buffer is only used for local // sounds, which don't have this effect). to avoid doing a lot of tests // in inner loops, we'll just put some silent samples before and after // the sound effect. here we compute how many samples can be needed. const int safetyMargin((int)(1.5f + InterAuralDistance / SpeedOfSound * outputRate)); // fill in samples structure file = name; data.resize( 2 * frames ); mlength = frames; dmlength = double(mlength - 1); duration = (float)mlength / outputRate; monoRaw.assign( frames + (2 * safetyMargin), 0.0f ); // fill with silence monoIdx = safetyMargin; // start after the (leading) safety margin // filter samples size_t localIdx( monoIdx ); for (long dst(0); dst < (2 * frames); dst += 2) { data[dst] = GlobalAtten * in[dst]; data[dst+1] = GlobalAtten * in[dst+1]; monoRaw[ localIdx++ ] = (data[dst] + data[dst+1])/2; } return 1; } /* * local functions */ static void sendSound(SoundCommand* s); static void audioLoop(void*); static bool allocAudioSamples(); static void freeAudioSamples(void); /* * general purpose audio stuff */ static bool usingAudio(false); static const char* soundFiles[] = { "fire", "explosion", "ricochet", "flag_grab", "flag_drop", "flag_won", "flag_lost", "flag_alert", "jump", "land", "teleport", "laser", "shock", "pop", "explosion", "flag_grab", "boom", "killteam", "phantom", "missile", "lock", "teamgrab", "hunt", "hunt_select", "steamroller", "thief", "burrow", "message_private", "message_team", "message_admin", "flap", "bounce" }; #define STD_SFX_COUNT ((int)(countof(soundFiles))) // the number of "Standard" sounds /* * producer/consumer shared arena */ static std::vector soundSamples; static std::map customSamples; static size_t audioBufferSize(0); static int soundLevel(0); static BzfMedia* media(0); /* speed of sound stuff */ static float timeSizeOfWorld(0); /* in seconds */ static TimeKeeper startTime; static double prevTime(0), curTime(0); struct SoundEvent { SoundEvent(); void reset(AudioSamples* audioSample, float attenuation, float x=0, float y=0, float z=0); bool isWorld() const; bool isFixed() const; bool isIgnoring() const; bool isImportant() const; void setWorld(bool val); void setFixed(bool val); void setIgnoring(bool val); void setImportant(bool val); void recalcDistance(); AudioSamples* samples; /* event sound effect */ bool busy; /* true iff in use */ size_t ptr; /* current sample */ double ptrFracLeft; /* fractional step ptr */ double ptrFracRight; /* fractional step ptr */ float x, y, z; /* event location */ double time; /* time of event */ float lastLeftAtten; float lastRightAtten; float dx, dy, dz; /* last relative position */ float d; /* last relative distance */ float dLeft; /* last relative distance */ float dRight; /* last relative distance */ float amplitude; /* last sfx amplitude */ private: float calcDistance(float prevX, float prevY, float d3); bool world; bool fixed; bool ignoring; bool important; }; SoundEvent::SoundEvent() : samples(0), busy(false), ptr(0), ptrFracLeft(0), ptrFracRight(0), x(0), y(0), z(0), time(0), lastLeftAtten(0), lastRightAtten(0), dx(0), dy(0), dz(0), d(0), dLeft(0), dRight(0), amplitude(0), world(false), fixed(false), ignoring(false), important(false) { } void SoundEvent::reset(AudioSamples* sample_, float attenuation_, float x_, float y_, float z_) { samples = sample_; busy = true; ptr = 0; ptrFracLeft = ptrFracRight = 0; // not explicit? x = x_; y = y_; z = z_; time = curTime; lastLeftAtten = lastRightAtten = attenuation_; dx = dy = dz = 0; // not explicit? d = dLeft = dRight = 0; // not explicit? amplitude = 0; // not explicit? world = fixed = ignoring = important = false; } bool SoundEvent::isWorld() const { return world; } bool SoundEvent::isFixed() const { return fixed; } bool SoundEvent::isIgnoring() const { return ignoring; } bool SoundEvent::isImportant() const { return important; } void SoundEvent::setWorld(bool val) { world = val; } void SoundEvent::setFixed(bool val) { fixed = val; } void SoundEvent::setIgnoring(bool val) { ignoring = val; } void SoundEvent::setImportant(bool val) { important = val; } void SoundEvent::recalcDistance() { dx = x - lastX; dy = y - lastY; dz = z - lastZ; const float d2 = dx * dx + dy * dy; const float d3 = dz * dz; if (d2 <= 1.0f) { d = 0.0f; dLeft = 0.0f; dRight = 0.0f; } else { const float delta = 1.0f / sqrtf(d2); dx *= delta; dy *= delta; d = sqrtf(d2 + d3); // Since we are on a forked process, we cannot use BZDB_TANKRADIUS // We put in the old tankRadius value (4.32) float minEventDist = 20.0f * 4.32f; amplitude = (d < minEventDist) ? 1.0f : minEventDist / d; // compute distance to each ear dLeft = calcDistance(lastXLeft, lastYLeft, d3); dRight = calcDistance(lastXRight, lastYRight, d3); } } float SoundEvent::calcDistance(float prevX, float prevY, float d3) { float deltaX( x - prevX ); float deltaY( y - prevY ); return sqrtf( deltaX*deltaX + deltaY*deltaY + d3 ); } /* list of events currently pending */ static SoundEvent events[MaxEvents]; static int portUseCount; static double endTime; /* fade in/out table */ const size_t FadeDuration(16); // is this supposed to be global? static std::vector fadeIn(FadeDuration); static std::vector fadeOut(FadeDuration); /* scratch buffer for adding contributions from sources */ static std::vector scratch; static bool usingSameThread = false; static bool audioInnerLoop(); void openSound(const char*) { if (usingAudio) return; // already opened media = PlatformFactory::getMedia(); if (!media->openAudio()) return; // open audio data files if (!allocAudioSamples()) { media->closeAudio(); #ifndef DEBUG std::cout << "WARNING: Unable to open audio data files" << std::endl; #endif return; // couldn't get samples } audioBufferSize = media->getAudioBufferChunkSize() * 2; /* initialize */ timeSizeOfWorld = 1.414f * BZDBCache::worldSize / SpeedOfSound; portUseCount = 0; for (int i = 0; i < (int)FadeDuration; i += 2) { fadeIn[i] = fadeIn[i+1] = sinf((float)(M_PI / 2.0 * (double)i / (double)(FadeDuration-2))); fadeOut[i] = fadeOut[i+1] = 1.0f - fadeIn[i]; } scratch.resize(audioBufferSize); startTime = TimeKeeper::getCurrent(); curTime = 0.0; endTime = -1.0; usingSameThread = !media->hasAudioThread(); if (media->hasAudioCallback()) { media->startAudioCallback(audioInnerLoop); } else { // start audio thread if (!usingSameThread && !media->startAudioThread(audioLoop, NULL)) { media->closeAudio(); freeAudioSamples(); #ifndef DEBUG std::cout << "WARNING: Unable to start the audio thread" << std::endl; #endif return; } } setSoundVolume(10); usingAudio = true; } void closeSound(void) { if (!usingAudio) return; // send stop command to audio thread SoundCommand s(SoundCommand::QUIT); sendSound(&s); // stop audio thread PlatformFactory::getMedia()->stopAudioThread(); // reset audio hardware PlatformFactory::getMedia()->closeAudio(); // free memory used for sfx samples freeAudioSamples(); usingAudio = false; } bool isSoundOpen() { return usingAudio; } static bool allocAudioSamples() { bool anyFile = false; soundSamples.reserve(STD_SFX_COUNT + 10); // if the world loads sounds, we don't want to resize // load the default samples for (int i = 0; i < STD_SFX_COUNT; i++) { std::string sound( TextUtils::tolower(soundFiles[i]) ); // read it int numFrames, rate; float* samples = PlatformFactory::getMedia()->readSound(sound.c_str(), numFrames, rate); AudioSamples newSample; if (newSample.resample(samples, numFrames, rate, sound)) anyFile = true; soundSamples.push_back(newSample); // If a "custom" sound wants to play this, make it available customSamples[sound] = i; delete[] samples; } return anyFile; } static void freeAudioSamples(void) { // do nothing. // the samples are self freeing now } /* * sound fx producer stuff */ static void sendSound(SoundCommand* s) { if (!usingAudio) return; PlatformFactory::getMedia()->writeSoundCommand(s, sizeof(SoundCommand)); } void moveSoundReceiver(float x, float y, float z, float t, int discontinuity) { if (soundLevel <= 0) { return; } SoundCommand::CMD cmd( discontinuity ? SoundCommand::JUMP_POS : SoundCommand::SET_POS ); SoundCommand s(cmd, 0, x, y, z, t); sendSound(&s); } void speedSoundReceiver(float vx, float vy, float vz) { SoundCommand s(SoundCommand::SET_VEL, 0, vx, vy, vz); sendSound(&s); } void playSound(int soundCode, const float pos[3], bool important, bool localSound) { if (localSound) { playLocalSound(soundCode); } else { playWorldSound(soundCode, pos, important); } return; } void playWorldSound(int soundCode, const float pos[3], bool important) { if (soundLevel <= 0) { return; } if ((int)soundSamples.size() <= soundCode) return; if (soundSamples[soundCode].length() == 0) return; SoundCommand s(important ? SoundCommand::IWORLD_SFX : SoundCommand::WORLD_SFX, soundCode, pos[0], pos[1], pos[2]); sendSound(&s); } void playLocalSound(int soundCode) { // Check for conditions which preclude sounds if (soundLevel <= 0 // no volume || soundCode > (int)soundSamples.size() // unknown sound || soundSamples[soundCode].length() == 0) { // empty sound return; } SoundCommand s(SoundCommand::LOCAL_SFX, soundCode); sendSound(&s); } void playLocalSound(std::string sound) { sound = TextUtils::tolower(sound); // modify the local copy int soundCode( -1 ); std::map::iterator itr = customSamples.find(sound); if (itr == customSamples.end()) { int numFrames(0), rate(0); float* samples( PlatformFactory::getMedia()->readSound(sound.c_str(), numFrames, rate) ); AudioSamples newSample; if (newSample.resample(samples, numFrames, rate, sound)) { soundSamples.push_back(newSample); soundCode = (int)soundSamples.size()-1; customSamples[sound] = soundCode; } delete[] samples; } else { soundCode = itr->second; } if (soundCode > 0) playLocalSound(soundCode); } void playFixedSound(int soundCode, float x, float y, float z) { // Check for conditions which preclude sounds if (soundLevel <= 0 // no volume || soundCode > (int)soundSamples.size() // unknown sound || soundSamples[soundCode].length() == 0) { // empty sound return; } SoundCommand s(SoundCommand::FIXED_SFX, soundCode, x, y, z); sendSound(&s); } void setSoundVolume(int newLevel) { soundLevel = newLevel; if (soundLevel < 0) soundLevel = 0; else if (soundLevel > 10) soundLevel = 10; SoundCommand s(SoundCommand::SET_VOL, soundLevel); sendSound(&s); } int getSoundVolume() { return soundLevel; } /* * Below this point is stuff for real-time audio thread */ static int recalcEventIgnoring(SoundEvent* e) { if (e->isFixed() || !e->isWorld()) return 0; float travelTime = (float)(curTime - e->time); if (travelTime > e->samples->duration + timeSizeOfWorld) { // sound front has passed all points in world e->busy = false; return (e->isIgnoring()) ? 0 : -1; } int useChange = 0; float eventDistance = e->d / SpeedOfSound; if (travelTime < eventDistance) { if (e->isIgnoring()) { /* do nothing -- still ignoring */ } else { /* ignoring again */ e->setIgnoring(true); useChange = -1; } /* don't sleep past the time the sound front will pass by */ endTime = eventDistance; } else { if (e->isIgnoring()) { float timeFromFront; /* compute time from sound front */ timeFromFront = travelTime - e->dLeft / SpeedOfSound; if (!positionDiscontinuity && timeFromFront < 0.0f) timeFromFront = 0.0f; /* recompute sample pointers */ e->ptrFracLeft = timeFromFront * (float)PlatformFactory::getMedia()->getAudioOutputRate(); if (e->ptrFracLeft >= 0.0 && e->ptrFracLeft < e->samples->dmlength) { /* not ignoring anymore */ e->setIgnoring(false); useChange = 1; } /* now do it again for right ear */ timeFromFront = travelTime - e->dRight / SpeedOfSound; if (!positionDiscontinuity && timeFromFront < 0.0f) timeFromFront = 0.0f; e->ptrFracRight = timeFromFront * (float)PlatformFactory::getMedia()->getAudioOutputRate(); if (e->ptrFracRight >= 0.0 && e->ptrFracRight < e->samples->dmlength) { e->setIgnoring(false); useChange = 1; } } else { /* do nothing -- still not ignoring */ } } return useChange; } static void receiverMoved(float x, float y, float z, float t) { // save data lastX = x; lastY = y; lastZ = z; lastTheta = t; // compute forward and left vectors forwardX = cosf(lastTheta); forwardY = sinf(lastTheta); leftX = -forwardY; leftY = forwardX; // compute position of each ear lastXLeft = lastX + 0.5f * InterAuralDistance * leftX; lastYLeft = lastY + 0.5f * InterAuralDistance * leftY; lastXRight = lastX - 0.5f * InterAuralDistance * leftX; lastYRight = lastY - 0.5f * InterAuralDistance * leftY; for (size_t i(0); i < MaxEvents; i++) if (events[i].busy && (events[i].isWorld())) events[i].recalcDistance(); } static void receiverVelocity(float vx, float vy) { static const float s = 1.0f / SpeedOfSound; velX = s * vx; velY = s * vy; } static int addLocalContribution(SoundEvent* e, size_t& len) { size_t numSamples( e->samples->length() - e->ptr ); if (numSamples > audioBufferSize) numSamples = audioBufferSize; if (!mutingOn && numSamples != 0) { /* initialize new areas of scratch space and adjust output sample count */ if (numSamples > len) { for (size_t n = len; n < numSamples; n += 2) scratch[n] = scratch[n+1] = 0.0f; len = numSamples; } float* src( &e->samples->data.at(e->ptr) ); try { if (numSamples <= FadeDuration) { for (size_t n = 0; n < numSamples; n += 2) { int fs = int(FadeDuration * float(n) / float(numSamples)) & ~1; scratch[n] += src[n] * (fadeIn[fs] * volumeAtten + fadeOut[fs] * e->lastLeftAtten); scratch[n+1] += src[n+1] * (fadeIn[fs] * volumeAtten + fadeOut[fs] * e->lastRightAtten); } } else { for (size_t n(0); n < numSamples; n += 2) { if (n < FadeDuration) { scratch[n] += src[n] * (fadeIn[n] * volumeAtten + fadeOut[n] * e->lastLeftAtten); scratch[n+1] += src[n+1] * (fadeIn[n] * volumeAtten + fadeOut[n] * e->lastRightAtten); } else { scratch[n] += src[n] * volumeAtten; scratch[n+1] += src[n+1] * volumeAtten; } } } e->lastLeftAtten = e->lastRightAtten = volumeAtten; } catch (std::exception const& ex) { std::cout << "Exception on sound " << e->samples->file << "\n" << ex.what() << std::endl; } } /* free event if ran out of samples */ if ((e->ptr += numSamples) == e->samples->length()) { e->busy = false; return -1; } return 0; } static void getWorldStuff(SoundEvent *e, float* la, float* ra, double* sampleStep) { float leftAtten, rightAtten; // compute left and right attenuation factors // FIXME -- should be a more general HRTF if (e->d == 0.0f) { leftAtten = 1.0f; rightAtten = 1.0f; } else { const float ff = (2.0f + forwardX * e->dx + forwardY * e->dy) / 3.0f; const float fl = (2.0f + leftX * e->dx + leftY * e->dy) / 3.0f; leftAtten = ff * fl * e->amplitude; rightAtten = ff * (4.0f/3.0f - fl) * e->amplitude; } if (e->ptrFracLeft == 0.0f || e->ptrFracRight == 0.0f) { e->lastLeftAtten = leftAtten; e->lastRightAtten = rightAtten; } *la = mutingOn ? 0.0f : leftAtten * volumeAtten; *ra = mutingOn ? 0.0f : rightAtten * volumeAtten; /* compute doppler effect */ // FIXME -- should be per ear *sampleStep = double(1.0 + velX * e->dx + velY * e->dy); } static int addWorldContribution(SoundEvent* e, size_t& len) { bool fini(false); size_t n; long nmL, nmR; float* src( &e->samples->monoRaw[ e->samples->monoIdx ] ); float leftAtten, rightAtten, fracL, fracR, fsampleL, fsampleR; double sampleStep; if (e->isIgnoring()) return 0; getWorldStuff(e, &leftAtten, &rightAtten, &sampleStep); if (sampleStep <= 0.0) fini = true; /* initialize new areas of scratch space and adjust output sample count */ if (audioBufferSize > len) { for (n = len; n < audioBufferSize; n += 2) scratch[n] = scratch[n+1] = 0.0f; len = audioBufferSize; } try { // add contribution with crossfade for (n = 0; !fini && n < audioBufferSize; n += 2) { // get sample position (to subsample resolution) nmL = (long)e->ptrFracLeft; nmR = (long)e->ptrFracRight; fracL = (float)(e->ptrFracLeft - floor(e->ptrFracLeft)); fracR = (float)(e->ptrFracRight - floor(e->ptrFracRight)); // get sample (lerp closest two samples) fsampleL = (1.0f - fracL) * src[nmL] + fracL * src[nmL+1]; fsampleR = (1.0f - fracR) * src[nmR] + fracR * src[nmR+1]; // filter and accumulate if (n < FadeDuration) { scratch[n] += fsampleL * (fadeIn[n] * leftAtten + fadeOut[n] * e->lastLeftAtten); scratch[n+1] += fsampleR * (fadeIn[n] * rightAtten + fadeOut[n] * e->lastRightAtten); } else { scratch[n] += fsampleL * leftAtten; scratch[n+1] += fsampleR * rightAtten; } // next sample if ((e->ptrFracLeft += sampleStep) >= e->samples->dmlength) fini = true; if ((e->ptrFracRight += sampleStep) >= e->samples->dmlength) fini = true; } e->lastLeftAtten = leftAtten; e->lastRightAtten = rightAtten; } catch (std::exception const& ex) { std::cout << "Exception on sound " << e->samples->file << "\n" << ex.what() << std::endl; } /* NOTE: running out of samples just means the world sound front * has passed our location. if we teleport it may pass us again. * so we can't free the event until the front passes out of the * world. compute time remaining until that happens and set * endTime if smaller than current endTime. */ if (fini) { double et = e->samples->duration + timeSizeOfWorld - (prevTime - e->time); if (endTime == -1.0 || et < endTime) endTime = et; e->setIgnoring(true); return -1; } return 0; } static int addFixedContribution(SoundEvent* e, size_t& len) { size_t n; long nmL, nmR; float* src( &e->samples->monoRaw[ e->samples->monoIdx ] ); float leftAtten, rightAtten, fracL, fracR, fsampleL, fsampleR; double sampleStep; getWorldStuff(e, &leftAtten, &rightAtten, &sampleStep); /* initialize new areas of scratch space and adjust output sample count */ if (audioBufferSize > len) { for (n = len; n < audioBufferSize; n += 2) scratch[n] = scratch[n+1] = 0.0f; len = audioBufferSize; } // add contribution with crossfade for (n = 0; n < audioBufferSize; n += 2) { // get sample position (to subsample resolution) nmL = (long)e->ptrFracLeft; nmR = (long)e->ptrFracRight; fracL = (float)(e->ptrFracLeft - floor(e->ptrFracLeft)); fracR = (float)(e->ptrFracRight - floor(e->ptrFracRight)); // get sample (lerp closest two samples) fsampleL = (1.0f - fracL) * src[nmL] + fracL * src[nmL+1]; fsampleR = (1.0f - fracR) * src[nmR] + fracR * src[nmR+1]; // filter and accumulate if (n < FadeDuration) { scratch[n] += fsampleL * (fadeIn[n] * leftAtten + fadeOut[n] * e->lastLeftAtten); scratch[n+1] += fsampleR * (fadeIn[n] * rightAtten + fadeOut[n] * e->lastRightAtten); } else { scratch[n] += fsampleL * leftAtten; scratch[n+1] += fsampleR * rightAtten; } // next sample if ((e->ptrFracLeft += sampleStep) >= e->samples->dmlength) e->ptrFracLeft -= e->samples->dmlength; if ((e->ptrFracRight += sampleStep) >= e->samples->dmlength) e->ptrFracRight -= e->samples->dmlength; } e->lastLeftAtten = leftAtten; e->lastRightAtten = rightAtten; return 0; } static size_t findBestWorldSlot() { size_t i; // the best slot is an empty one for (i = 0; i < MaxEvents; i++) if (!events[i].busy) return i; // no available slots. find an existing sound that won't be missed // (much). this will cause a pop or crackle if the replaced sound is // currently playing. first see if there are any world events. for (i = 0; i < MaxEvents; i++) if (events[i].isWorld() && !events[i].isFixed()) break; // give up if no (non-fixed) world events if (i == MaxEvents) return MaxEvents; // found a world event. see if there's an event that's // completely passed us. const size_t first(i); for (i = first; i < MaxEvents; i++) { if (events[i].isFixed() || !events[i].isWorld()) continue; if (!(events[i].isIgnoring())) continue; const float travelTime = (float)(curTime - events[i].time); const float eventDistance = events[i].d / SpeedOfSound; if (travelTime > eventDistance) return i; } // if no sound front has completely passed our position // then pick the most distant one that hasn't reached us // yet that isn't important. int farthestEvent = -1; float farthestDistance = 0.0f; for (i = first; i < MaxEvents; i++) { if (events[i].isImportant()) continue; if (events[i].isFixed() || !events[i].isWorld()) continue; if (!(events[i].isIgnoring())) continue; const float eventDistance = events[i].d / SpeedOfSound; if (eventDistance > farthestDistance) { farthestEvent = i; farthestDistance = eventDistance; } } if (farthestEvent != -1) return farthestEvent; // same thing but look at important sounds for (i = first; i < MaxEvents; i++) { if (!(events[i].isImportant())) continue; if (events[i].isFixed() || !events[i].isWorld()) continue; if (!(events[i].isIgnoring())) continue; const float eventDistance = events[i].d / SpeedOfSound; if (eventDistance > farthestDistance) { farthestEvent = i; farthestDistance = eventDistance; } } if (farthestEvent != -1) return farthestEvent; // we've only got playing world sounds to choose from. pick the // most distant one since it's probably the quietest. farthestEvent = first; farthestDistance = events[farthestEvent].d / SpeedOfSound; for (i = first + 1; i < MaxEvents; i++) { if (events[i].isFixed() || !events[i].isWorld()) continue; const float eventDistance = events[i].d / SpeedOfSound; if (eventDistance > farthestDistance) { farthestEvent = i; farthestDistance = eventDistance; } } // replacing an active sound portUseCount--; return farthestEvent; } static size_t findBestLocalSlot() { // better to lose a world sound size_t slot( findBestWorldSlot() ); if (slot != MaxEvents) return slot; // find the first local event size_t i; for (i = 0; i < MaxEvents; i++) if (!(events[i].isFixed())) break; // no available slot if only fixed sounds are playing (highly unlikely) if (i == MaxEvents) return MaxEvents; // find the local sound closest to completion. size_t minEvent = i; size_t minSamplesLeft = events[i].samples->length() - events[i].ptr; for (i++; i < MaxEvents; i++) { if (events[i].isFixed()) continue; if (events[i].samples->length() - events[i].ptr < minSamplesLeft) { minEvent = i; minSamplesLeft = events[i].samples->length() - events[i].ptr; } } // replacing an active sound portUseCount--; return minEvent; } // // audioLoop() simply generates samples and keeps the audio hw fed // static bool audioInnerLoop() { size_t slot(MaxEvents); /* get time step */ prevTime = curTime; curTime = TimeKeeper::getCurrent() - startTime; endTime = -1.0; positionDiscontinuity = 0; /* get new commands from queue */ SoundCommand cmd; SoundEvent* event(0); while (media->readSoundCommand(&cmd, sizeof(SoundCommand))) { switch (cmd.cmd) { case SoundCommand::QUIT: return true; case SoundCommand::CLEAR: /* FIXME */ break; case SoundCommand::SET_POS: case SoundCommand::JUMP_POS: { positionDiscontinuity = (cmd.cmd == SoundCommand::JUMP_POS); receiverMoved(cmd.x, cmd.y, cmd.z, cmd.t); break; } case SoundCommand::SET_VEL: receiverVelocity(cmd.x, cmd.y); break; case SoundCommand::SET_VOL: volumeAtten = 0.2f * cmd.code; if (volumeAtten <= 0.0f) { mutingOn = true; volumeAtten = 0.0f; } else if (volumeAtten >= 2.0f) { mutingOn = false; volumeAtten = 2.0f; } else { mutingOn = false; } break; case SoundCommand::LOCAL_SFX: slot = findBestLocalSlot(); if (slot == MaxEvents) break; event = events + slot; event->reset(&soundSamples[cmd.code], volumeAtten); portUseCount++; break; case SoundCommand::IWORLD_SFX: case SoundCommand::WORLD_SFX: if (cmd.cmd == SoundCommand::IWORLD_SFX) { slot = findBestWorldSlot(); } else { for (slot = 0; slot < MaxEvents; slot++) if (!events[slot].busy) break; } if (slot == MaxEvents) break; event = events + slot; event->reset(&soundSamples[cmd.code], volumeAtten, cmd.x, cmd.y, cmd.z); event->setWorld(true); event->setIgnoring(true); if (cmd.cmd == SoundCommand::IWORLD_SFX) event->setImportant(true); /* don't increment use count because we're ignoring the sound */ event->recalcDistance(); break; case SoundCommand::FIXED_SFX: for (slot = 0; slot < MaxEvents; slot++) if (!events[slot].busy) break; if (slot == MaxEvents) break; event = events + slot; event->reset(&soundSamples[cmd.code], volumeAtten, cmd.x, cmd.y, cmd.z); event->setFixed(true); event->setWorld(true); portUseCount++; event->recalcDistance(); break; } } for (slot = 0; slot < MaxEvents; slot++) if (events[slot].busy) { int deltaCount = recalcEventIgnoring(events + slot); portUseCount += deltaCount; } /* sum contributions to the port and output samples */ if (media->isAudioTooEmpty()) { size_t numSamples(0); if (portUseCount != 0) { for (size_t j = 0; j < MaxEvents; j++) { if (!events[j].busy) continue; int deltaCount; if (events[j].isWorld()) { if (events[j].isFixed()) { deltaCount = addFixedContribution(events + j, numSamples); } else { deltaCount = addWorldContribution(events + j, numSamples); } } else { deltaCount = addLocalContribution(events + j, numSamples); } portUseCount += deltaCount; } } // replace all samples with silence if muting is on if (mutingOn) numSamples = 0; // fill out partial buffers with silence for (size_t j = numSamples; j < audioBufferSize; j++) scratch[j] = 0.0f; // write samples media->writeAudioFrames(&scratch.front(), audioBufferSize/2); } return false; } static void audioLoop(void*) { // loop until requested to stop while (true) { // sleep until audio buffers hit low water mark or new command available media->audioSleep(true, endTime); if (audioInnerLoop()) break; } } void updateSound() { if (isSoundOpen() && usingSameThread) { // sleep until audio buffers hit low water mark or new command available media->audioSleep(true, 0.0); audioInnerLoop(); } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/sound.h000066400000000000000000000066621200563112200170060ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * Sound effect stuff */ #ifndef BZF_SOUND_H #define BZF_SOUND_H #include "common.h" #include #define SFX_FIRE 0 /* shell fired */ #define SFX_EXPLOSION 1 /* something other than me blew up */ #define SFX_RICOCHET 2 /* shot bounced off building */ #define SFX_GRAB_FLAG 3 /* grabbed a good flag */ #define SFX_DROP_FLAG 4 /* dropped a flag */ #define SFX_CAPTURE 5 /* my team captured enemy flag */ #define SFX_LOSE 6 /* my flag captured */ #define SFX_ALERT 7 /* my team flag grabbed by enemy */ #define SFX_JUMP 8 /* jumping sound */ #define SFX_LAND 9 /* landing sound */ #define SFX_TELEPORT 10 /* teleporting sound */ #define SFX_LASER 11 /* laser fired sound */ #define SFX_SHOCK 12 /* shockwave fired sound */ #define SFX_POP 13 /* tank appeared sound */ #define SFX_DIE 14 /* my tank exploded */ #define SFX_GRAB_BAD 15 /* grabbed a bad flag */ #define SFX_SHOT_BOOM 16 /* shot exploded */ #define SFX_KILL_TEAM 17 /* shot a teammate */ #define SFX_PHANTOM 18 /* Went into Phantom zone */ #define SFX_MISSILE 19 /* guided missile fired */ #define SFX_LOCK 20 /* missile locked on me */ #define SFX_TEAMGRAB 21 /* grabbed an opponents team flag */ #define SFX_HUNT 22 /* hunting sound */ #define SFX_HUNT_SELECT 23 /* hunt target selected */ #define SFX_RUNOVER 24 /* steamroller sound */ #define SFX_THIEF 25 /* thief sound */ #define SFX_BURROW 26 /* burrow sound */ #define SFX_MESSAGE_PRIVATE 27 /* private message received */ #define SFX_MESSAGE_TEAM 28 /* team message received */ #define SFX_MESSAGE_ADMIN 29 /* admin message received */ #define SFX_FLAP 30 /* wings flapping sound */ #define SFX_BOUNCE 31 /* bouncing sound */ /* prepare sound effects generator and shut it down */ void openSound(const char* pname); void closeSound(void); bool isSoundOpen(); /* reposition sound receiver (no Doppler) or move it (w/Doppler effect) */ void moveSoundReceiver(float x, float y, float z, float t, int discontinuity); void speedSoundReceiver(float vx, float vy, float vz); /* sound effect event at given position in world, or possible locally */ void playSound(int soundCode, const float pos[3], bool important, bool localSound); /* sound effect event at given position in world */ void playWorldSound(int soundCode, const float pos[3], bool important = false); /* sound effect positioned at receiver */ void playLocalSound(int soundCode); void playLocalSound(std::string sound); /* start playing a sound effect repeatedly at world position */ void playFixedSound(int soundCode, float x, float y, float z); /* change volume; 0 is mute, else 1-10 (min-max) */ void setSoundVolume(int newLevel); /* get current volume */ int getSoundVolume(); /* update sound stuff (only does something when running sound in same process */ void updateSound(); #endif // BZF_SOUND_H // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/stars.cxx000066400000000000000000000661261200563112200173660ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "stars.h" const float stars[][6] = { { 1.00f, 1.00f, 1.00f, -0.18746032f, 0.93921369f, -0.28763914f }, { 1.00f, 1.00f, 1.00f, -0.06323564f, 0.60291260f, -0.79529721f }, { 1.00f, 1.00f, 1.00f, -0.78377002f, -0.52700269f, 0.32859191f }, { 1.00f, 1.00f, 1.00f, 0.18718566f, 0.73014212f, 0.65715599f }, { 0.99f, 0.99f, 0.99f, 0.12507832f, -0.76942003f, 0.62637711f }, { 0.99f, 0.99f, 0.99f, 0.13051330f, 0.68228769f, 0.71933979f }, { 0.98f, 0.98f, 0.98f, 0.19507207f, 0.97036278f, -0.14262892f }, { 0.94f, 0.94f, 0.94f, -0.37387931f, -0.31261155f, -0.87320572f }, { 0.94f, 0.94f, 0.94f, -0.41809806f, 0.90381104f, 0.09121194f }, { 0.92f, 0.92f, 0.92f, 0.49255905f, 0.22369388f, -0.84103900f }, { 0.90f, 0.90f, 0.90f, -0.42400947f, -0.25435105f, -0.86920738f }, { 0.88f, 0.88f, 0.88f, 0.45922387f, -0.87484610f, 0.15413558f }, { 0.87f, 0.87f, 0.87f, -0.44939077f, -0.05239382f, -0.89179754f }, { 0.87f, 0.87f, 0.87f, 0.02091211f, 0.99145067f, 0.12879559f }, { 0.86f, 0.86f, 0.86f, 0.34393576f, 0.89501035f, 0.28401536f }, { 0.84f, 0.84f, 0.84f, -0.91413081f, -0.35632819f, -0.19337822f }, { 0.82f, 0.82f, 0.82f, -0.34477949f, -0.82641578f, -0.44515619f }, { 0.81f, 0.81f, 0.81f, -0.39155090f, 0.79122889f, 0.46972838f }, { 0.81f, 0.81f, 0.81f, 0.83737743f, -0.23360345f, -0.49419478f }, { 0.79f, 0.79f, 0.79f, 0.45576218f, -0.53630841f, 0.71039015f }, { 0.79f, 0.79f, 0.79f, -0.49362421f, -0.10432278f, -0.86339557f }, { 0.77f, 0.77f, 0.77f, -0.86449331f, 0.45788679f, 0.20734258f }, { 0.75f, 0.75f, 0.75f, -0.22139786f, 0.84642529f, -0.48430070f }, { 0.73f, 0.73f, 0.73f, -0.09167211f, -0.79229814f, -0.60320795f }, { 0.73f, 0.73f, 0.73f, 0.15061858f, 0.98238552f, 0.11060166f }, { 0.73f, 0.73f, 0.73f, 0.12870057f, 0.86849886f, 0.47869188f }, { 0.72f, 0.72f, 0.72f, -0.53791767f, -0.07360590f, -0.83977783f }, { 0.72f, 0.72f, 0.72f, -0.25883171f, 0.23061061f, -0.93798983f }, { 0.72f, 0.72f, 0.72f, 0.10363775f, 0.99439460f, -0.02094242f }, { 0.71f, 0.71f, 0.71f, 0.60287035f, -0.31976473f, -0.73095679f }, { 0.70f, 0.70f, 0.70f, -0.45912650f, 0.11504068f, 0.88089073f }, { 0.70f, 0.70f, 0.70f, -0.54442662f, -0.13078900f, 0.82854927f }, { 0.70f, 0.70f, 0.70f, 0.40505084f, 0.50168633f, 0.76435900f }, { 0.69f, 0.69f, 0.69f, 0.08686216f, -0.82069385f, -0.56472701f }, { 0.69f, 0.69f, 0.69f, -0.36286592f, 0.57215303f, -0.73550612f }, { 0.69f, 0.69f, 0.69f, -0.26337534f, 0.85611504f, -0.44463518f }, { 0.69f, 0.69f, 0.69f, -0.07226745f, -0.72777444f, -0.68199837f }, { 0.69f, 0.69f, 0.69f, -0.58142883f, -0.29476303f, 0.75832397f }, { 0.69f, 0.69f, 0.69f, -0.29565978f, 0.41252938f, -0.86162919f }, { 0.68f, 0.68f, 0.68f, 0.00144110f, 0.70772213f, 0.70648944f }, { 0.68f, 0.68f, 0.68f, -0.85243040f, 0.39757028f, 0.33955887f }, { 0.68f, 0.68f, 0.68f, 0.32557604f, -0.44146630f, -0.83612663f }, { 0.68f, 0.68f, 0.68f, -0.15716268f, 0.94635260f, 0.28234145f }, { 0.68f, 0.68f, 0.68f, -0.10958351f, -0.34063178f, -0.93378878f }, { 0.68f, 0.68f, 0.68f, -0.38031429f, 0.43474835f, -0.81630564f }, { 0.67f, 0.67f, 0.67f, -0.09407244f, 0.94666320f, -0.30818695f }, { 0.67f, 0.67f, 0.67f, -0.77790534f, 0.61004680f, -0.15068571f }, { 0.67f, 0.67f, 0.67f, -0.34062544f, 0.77780986f, 0.52819133f }, { 0.67f, 0.67f, 0.67f, 0.81966311f, 0.57047671f, -0.05204546f }, { 0.67f, 0.67f, 0.67f, -0.45141363f, -0.77794683f, 0.43706343f }, { 0.67f, 0.67f, 0.67f, 0.77976841f, 0.48331988f, 0.39794865f }, { 0.66f, 0.66f, 0.66f, 0.93399954f, 0.17978951f, -0.30874035f }, { 0.66f, 0.66f, 0.66f, 0.01034223f, 0.00802346f, 0.99991435f }, { 0.66f, 0.66f, 0.66f, 0.08377425f, 0.99590361f, -0.03402735f }, { 0.66f, 0.66f, 0.66f, 0.77559036f, 0.24355093f, 0.58235943f }, { 0.66f, 0.66f, 0.66f, 0.05259512f, 0.98439729f, -0.16791590f }, { 0.66f, 0.66f, 0.66f, 0.21409547f, -0.87054640f, -0.44307119f }, { 0.66f, 0.66f, 0.66f, 0.87332904f, 0.03195992f, 0.48608121f }, { 0.66f, 0.66f, 0.66f, -0.10654096f, -0.97021127f, 0.21757543f }, { 0.66f, 0.66f, 0.66f, -0.68517464f, -0.42269087f, -0.59318477f }, { 0.66f, 0.66f, 0.66f, -0.20078707f, -0.18514585f, 0.96198004f }, { 0.65f, 0.65f, 0.65f, -0.44938698f, -0.05242649f, -0.89179754f }, { 0.65f, 0.65f, 0.65f, 0.63384563f, 0.38041386f, 0.67344266f }, { 0.65f, 0.65f, 0.65f, 0.64494330f, -0.22627737f, -0.72996348f }, { 0.64f, 0.64f, 0.64f, -0.96675450f, 0.04615476f, 0.25150633f }, { 0.64f, 0.64f, 0.64f, 0.51465893f, 0.55278999f, 0.65540016f }, { 0.64f, 0.64f, 0.64f, -0.64575577f, -0.11827565f, -0.75432777f }, { 0.63f, 0.63f, 0.63f, 0.12179551f, 0.99254143f, -0.00523596f }, { 0.63f, 0.63f, 0.63f, 0.44379860f, -0.62094009f, 0.64612401f }, { 0.63f, 0.63f, 0.63f, 0.54285669f, 0.09698264f, 0.83420676f }, { 0.63f, 0.63f, 0.63f, -0.00923830f, -0.62267375f, 0.78242707f }, { 0.63f, 0.63f, 0.63f, -0.52917659f, -0.71961868f, 0.44957885f }, { 0.63f, 0.63f, 0.63f, -0.53109062f, 0.49525002f, -0.68751013f }, { 0.62f, 0.62f, 0.62f, -0.38729382f, 0.33341944f, -0.85955513f }, { 0.62f, 0.62f, 0.62f, -0.39334756f, 0.65734452f, -0.64278764f }, { 0.62f, 0.62f, 0.62f, -0.53642911f, -0.20573670f, 0.81848413f }, { 0.62f, 0.62f, 0.62f, 0.51238209f, 0.02050475f, 0.85851276f }, { 0.62f, 0.62f, 0.62f, -0.53964424f, -0.25130597f, -0.80351067f }, { 0.62f, 0.62f, 0.62f, -0.46038586f, -0.80009717f, -0.38456386f }, { 0.62f, 0.62f, 0.62f, -0.24783947f, -0.78804439f, -0.56352603f }, { 0.62f, 0.62f, 0.62f, -0.51482832f, -0.43944606f, -0.73609710f }, { 0.61f, 0.61f, 0.61f, -0.57718515f, -0.46531403f, -0.67107385f }, { 0.60f, 0.60f, 0.60f, -0.53590840f, 0.13896967f, 0.83276027f }, { 0.60f, 0.60f, 0.60f, 0.73477256f, 0.08463706f, -0.67301250f }, { 0.60f, 0.60f, 0.60f, -0.66943967f, -0.58699673f, 0.45528594f }, { 0.60f, 0.60f, 0.60f, 0.81717455f, -0.55024052f, 0.17164253f }, { 0.60f, 0.60f, 0.60f, -0.05931236f, -0.77451193f, -0.62977242f }, { 0.59f, 0.59f, 0.59f, -0.20677552f, -0.94014233f, -0.27088046f }, { 0.59f, 0.59f, 0.59f, -0.59179771f, 0.01597055f, 0.80592829f }, { 0.59f, 0.59f, 0.59f, 0.35089511f, -0.29815134f, 0.88768148f }, { 0.59f, 0.59f, 0.59f, -0.31281772f, 0.81403309f, -0.48938245f }, { 0.59f, 0.59f, 0.59f, 0.55013937f, -0.62063617f, 0.55871052f }, { 0.58f, 0.58f, 0.58f, -0.44258744f, 0.36446258f, -0.81931883f }, { 0.58f, 0.58f, 0.58f, 0.93712717f, -0.23032479f, 0.26218918f }, { 0.58f, 0.58f, 0.58f, 0.69823539f, 0.71228886f, 0.07149744f }, { 0.58f, 0.58f, 0.58f, -0.59380007f, -0.32756990f, -0.73491460f }, { 0.57f, 0.57f, 0.57f, 0.85585463f, -0.21424818f, 0.47075528f }, { 0.57f, 0.57f, 0.57f, -0.91784972f, 0.18632171f, 0.35047984f }, { 0.57f, 0.57f, 0.57f, 0.47423589f, 0.11977998f, 0.87221158f }, { 0.57f, 0.57f, 0.57f, -0.34768119f, -0.91950518f, -0.18337947f }, { 0.57f, 0.57f, 0.57f, 0.11298976f, 0.94522208f, -0.30624920f }, { 0.57f, 0.57f, 0.57f, -0.63273555f, -0.02306323f, -0.77402443f }, { 0.57f, 0.57f, 0.57f, -0.95127195f, -0.06575470f, -0.30126059f }, { 0.57f, 0.57f, 0.57f, 0.23399331f, -0.83502078f, -0.49798331f }, { 0.56f, 0.56f, 0.56f, -0.64402556f, -0.74742848f, -0.16303897f }, { 0.56f, 0.56f, 0.56f, -0.45099273f, -0.82574946f, -0.33873791f }, { 0.56f, 0.56f, 0.56f, 0.07344438f, 0.82496053f, -0.56039810f }, { 0.56f, 0.56f, 0.56f, 0.82027239f, 0.44838849f, 0.35510695f }, { 0.56f, 0.56f, 0.56f, -0.55467093f, -0.82453036f, 0.11175800f }, { 0.56f, 0.56f, 0.56f, 0.00098470f, 0.79652929f, 0.60459912f }, { 0.56f, 0.56f, 0.56f, -0.51931322f, -0.51270866f, -0.68369848f }, { 0.56f, 0.56f, 0.56f, -0.90744573f, -0.13717063f, -0.39714789f }, { 0.55f, 0.55f, 0.55f, -0.61741239f, 0.20428927f, -0.75964981f }, { 0.55f, 0.55f, 0.55f, 0.46206892f, 0.18158694f, 0.86805445f }, { 0.55f, 0.55f, 0.55f, -0.83253479f, -0.45524886f, 0.31564903f }, { 0.55f, 0.55f, 0.55f, 0.07938872f, -0.86398113f, -0.49722639f }, { 0.55f, 0.55f, 0.55f, 0.22726129f, 0.80580777f, 0.54683280f }, { 0.55f, 0.55f, 0.55f, -0.35151672f, -0.05753685f, -0.93441182f }, { 0.55f, 0.55f, 0.55f, -0.10119151f, -0.78901100f, -0.60598838f }, { 0.55f, 0.55f, 0.55f, -0.26344872f, 0.75281799f, -0.60320795f }, { 0.55f, 0.55f, 0.55f, 0.43951896f, -0.87913579f, 0.18423727f }, { 0.55f, 0.55f, 0.55f, -0.19410953f, -0.43589216f, 0.87881714f }, { 0.55f, 0.55f, 0.55f, -0.44397655f, -0.89373249f, -0.06424203f }, { 0.54f, 0.54f, 0.54f, -0.70603108f, -0.65198237f, -0.27647609f }, { 0.54f, 0.54f, 0.54f, -0.75255895f, -0.27608043f, -0.59785837f }, { 0.54f, 0.54f, 0.54f, 0.10641714f, 0.98896384f, -0.10308187f }, { 0.54f, 0.54f, 0.54f, -0.40814400f, 0.14263014f, -0.90170676f }, { 0.54f, 0.54f, 0.54f, -0.44473919f, -0.60738111f, -0.65825164f }, { 0.54f, 0.54f, 0.54f, 0.22470157f, 0.97039086f, -0.08860456f }, { 0.54f, 0.54f, 0.54f, -0.07184886f, -0.99423265f, 0.07961901f }, { 0.54f, 0.54f, 0.54f, -0.35528347f, -0.86002839f, 0.36623058f }, { 0.54f, 0.54f, 0.54f, -0.07864413f, -0.60621691f, 0.79140139f }, { 0.53f, 0.53f, 0.53f, 0.21930589f, 0.02474445f, -0.97534233f }, { 0.53f, 0.53f, 0.53f, -0.48145169f, 0.77386057f, -0.41151434f }, { 0.53f, 0.53f, 0.53f, -0.28682154f, -0.80198014f, 0.52398592f }, { 0.53f, 0.53f, 0.53f, -0.51764023f, -0.03426811f, -0.85491186f }, { 0.53f, 0.53f, 0.53f, 0.80342811f, -0.52658290f, -0.27787358f }, { 0.53f, 0.53f, 0.53f, -0.31620046f, -0.82247835f, -0.47280711f }, { 0.53f, 0.53f, 0.53f, 0.96348435f, 0.05569476f, 0.26190847f }, { 0.53f, 0.53f, 0.53f, -0.94582248f, -0.26311484f, 0.19023786f }, { 0.53f, 0.53f, 0.53f, 0.10992763f, -0.89637017f, -0.42946059f }, { 0.53f, 0.53f, 0.53f, 0.12913544f, 0.92617595f, -0.35429105f }, { 0.53f, 0.53f, 0.53f, -0.23176520f, -0.38250154f, -0.89441460f }, { 0.53f, 0.53f, 0.53f, -0.08535831f, -0.55945241f, -0.82445556f }, { 0.53f, 0.53f, 0.53f, 0.44324550f, 0.72425640f, 0.52819133f }, { 0.53f, 0.53f, 0.53f, 0.44834271f, -0.21264909f, -0.86819881f }, { 0.52f, 0.52f, 0.52f, 0.41362095f, 0.23584551f, -0.87937170f }, { 0.52f, 0.52f, 0.52f, 0.31192467f, -0.63275260f, 0.70875043f }, { 0.52f, 0.52f, 0.52f, 0.49882481f, 0.76434493f, 0.40859598f }, { 0.52f, 0.52f, 0.52f, -0.37689880f, -0.81943631f, -0.43182340f }, { 0.52f, 0.52f, 0.52f, -0.76126260f, -0.18992166f, 0.62000728f }, { 0.52f, 0.52f, 0.52f, 0.79371262f, -0.60046172f, -0.09729340f }, { 0.52f, 0.52f, 0.52f, 0.38922885f, 0.65979165f, 0.64278764f }, { 0.52f, 0.52f, 0.52f, 0.27979490f, -0.89055741f, -0.35863951f }, { 0.52f, 0.52f, 0.52f, -0.09241690f, 0.91913372f, 0.38295215f }, { 0.52f, 0.52f, 0.52f, -0.23498127f, -0.27736655f, -0.93158555f }, { 0.52f, 0.52f, 0.52f, -0.36729315f, 0.91887981f, 0.14406836f }, { 0.52f, 0.52f, 0.52f, -0.45284608f, -0.77534127f, -0.44020039f }, { 0.51f, 0.51f, 0.51f, -0.13715194f, 0.61950535f, -0.77291816f }, { 0.51f, 0.51f, 0.51f, 0.87835246f, -0.47798163f, -0.00552685f }, { 0.51f, 0.51f, 0.51f, -0.07894433f, -0.63949174f, -0.76473403f }, { 0.51f, 0.51f, 0.51f, 0.41170254f, 0.42931941f, 0.80385685f }, { 0.51f, 0.51f, 0.51f, -0.95061666f, -0.12451831f, -0.28429425f }, { 0.51f, 0.51f, 0.51f, 0.81581420f, -0.28489506f, 0.50327134f }, { 0.51f, 0.51f, 0.51f, 0.49335873f, 0.83783549f, -0.23372820f }, { 0.50f, 0.50f, 0.50f, -0.76283687f, 0.50562882f, 0.40301293f }, { 0.50f, 0.50f, 0.50f, 0.18071502f, 0.69835424f, 0.69256294f }, { 0.50f, 0.50f, 0.50f, 0.09080715f, 0.92820776f, 0.36081082f }, { 0.50f, 0.50f, 0.50f, -0.86528879f, -0.31031537f, -0.39367452f }, { 0.50f, 0.50f, 0.50f, 0.27336812f, -0.93157470f, 0.23966326f }, { 0.50f, 0.50f, 0.50f, -0.17248498f, 0.88873875f, 0.42472619f }, { 0.50f, 0.50f, 0.50f, 0.02181781f, -0.86194307f, -0.50653547f }, { 0.50f, 0.50f, 0.50f, -0.92219621f, -0.04080162f, -0.38456386f }, { 0.50f, 0.50f, 0.50f, 0.69190150f, 0.43881172f, 0.57333815f }, { 0.50f, 0.50f, 0.50f, 0.67753023f, -0.41546214f, -0.60691357f }, { 0.50f, 0.50f, 0.50f, -0.69631726f, 0.15543282f, 0.70070177f }, { 0.50f, 0.50f, 0.50f, -0.07655677f, 0.86205029f, -0.50100732f }, { 0.50f, 0.50f, 0.50f, 0.37837088f, 0.55527788f, 0.74060917f }, { 0.50f, 0.50f, 0.50f, -0.04141130f, -0.76361197f, -0.64434606f }, { 0.50f, 0.50f, 0.50f, -0.24842143f, 0.88034546f, -0.40407753f }, { 0.50f, 0.50f, 0.50f, -0.68194920f, 0.30964497f, 0.66262007f }, { 0.49f, 0.49f, 0.49f, -0.61809450f, -0.48327029f, 0.62000728f }, { 0.49f, 0.49f, 0.49f, -0.19964445f, -0.23947904f, 0.95015359f }, { 0.49f, 0.49f, 0.49f, -0.36514327f, -0.07475945f, -0.92794472f }, { 0.49f, 0.49f, 0.49f, 0.55809754f, -0.78956836f, -0.25516450f }, { 0.49f, 0.49f, 0.49f, 0.11829176f, -0.36111328f, 0.92498881f }, { 0.49f, 0.49f, 0.49f, 0.34054390f, -0.81492847f, 0.46895781f }, { 0.48f, 0.48f, 0.48f, 0.43050832f, -0.52426434f, -0.73471731f }, { 0.48f, 0.48f, 0.48f, 0.06157411f, -0.79870981f, -0.59855765f }, { 0.48f, 0.48f, 0.48f, -0.68904048f, 0.71727097f, 0.10366054f }, { 0.48f, 0.48f, 0.48f, 0.03197347f, 0.81077379f, -0.58448571f }, { 0.48f, 0.48f, 0.48f, -0.91544139f, 0.29032198f, -0.27871174f }, { 0.48f, 0.48f, 0.48f, -0.43345651f, 0.32896170f, -0.83898729f }, { 0.48f, 0.48f, 0.48f, -0.14801188f, -0.53949875f, -0.82887489f }, { 0.48f, 0.48f, 0.48f, -0.52659851f, -0.52270663f, -0.67042661f }, { 0.48f, 0.48f, 0.48f, -0.45120066f, 0.04785443f, -0.89113855f }, { 0.48f, 0.48f, 0.48f, -0.17692153f, -0.89012104f, 0.41998014f }, { 0.48f, 0.48f, 0.48f, -0.23067285f, -0.75293034f, -0.61634892f }, { 0.48f, 0.48f, 0.48f, -0.63449681f, 0.52747136f, 0.56496704f }, { 0.47f, 0.47f, 0.47f, -0.47122213f, 0.47445437f, 0.74353397f }, { 0.47f, 0.47f, 0.47f, -0.35264847f, 0.23098658f, -0.90679890f }, { 0.47f, 0.47f, 0.47f, -0.15604344f, -0.78537965f, 0.59902358f }, { 0.47f, 0.47f, 0.47f, 0.17390932f, 0.73164678f, 0.65912712f }, { 0.47f, 0.47f, 0.47f, -0.11961512f, 0.71928978f, -0.68433505f }, { 0.47f, 0.47f, 0.47f, 0.26297542f, -0.20426042f, 0.94293243f }, { 0.47f, 0.47f, 0.47f, -0.32116202f, -0.27551231f, -0.90606177f }, { 0.47f, 0.47f, 0.47f, -0.49654025f, 0.37129071f, 0.78459609f }, { 0.47f, 0.47f, 0.47f, -0.09111156f, -0.40102944f, 0.91152292f }, { 0.47f, 0.47f, 0.47f, 0.17636789f, -0.87337679f, -0.45399049f }, { 0.47f, 0.47f, 0.47f, 0.29911578f, 0.94651359f, 0.12100314f }, { 0.47f, 0.47f, 0.47f, 0.64441282f, -0.57549721f, 0.50352269f }, { 0.47f, 0.47f, 0.47f, 0.21797466f, 0.89871138f, -0.38053244f }, { 0.47f, 0.47f, 0.47f, -0.05988827f, 0.92193645f, 0.38268343f }, { 0.47f, 0.47f, 0.47f, -0.03533501f, -0.79732746f, -0.60251170f }, { 0.47f, 0.47f, 0.47f, -0.26476842f, -0.95042938f, 0.16303897f }, { 0.47f, 0.47f, 0.47f, -0.48421040f, -0.58409816f, -0.65143657f }, { 0.46f, 0.46f, 0.46f, 0.21357986f, -0.01931197f, 0.97673470f }, { 0.46f, 0.46f, 0.46f, -0.42782041f, -0.90014207f, -0.08193851f }, { 0.46f, 0.46f, 0.46f, -0.27625582f, 0.67330223f, -0.68581831f }, { 0.46f, 0.46f, 0.46f, 0.54202003f, -0.84024471f, -0.01425304f }, { 0.46f, 0.46f, 0.46f, 0.21405357f, -0.81399381f, 0.53999555f }, { 0.46f, 0.46f, 0.46f, 0.84575307f, 0.14659369f, 0.51304197f }, { 0.46f, 0.46f, 0.46f, 0.09268724f, -0.99442381f, -0.05030242f }, { 0.46f, 0.46f, 0.46f, 0.20995440f, 0.53300029f, -0.81965226f }, { 0.46f, 0.46f, 0.46f, -0.09822376f, 0.46013153f, -0.88240075f }, { 0.46f, 0.46f, 0.46f, -0.76105374f, -0.46812725f, -0.44905910f }, { 0.46f, 0.46f, 0.46f, 0.92328894f, -0.27064458f, -0.27256012f }, { 0.46f, 0.46f, 0.46f, 0.14859778f, 0.22715329f, -0.96245521f }, { 0.45f, 0.45f, 0.45f, -0.14958394f, -0.89387834f, -0.42261827f }, { 0.45f, 0.45f, 0.45f, 0.65730232f, 0.19496182f, -0.72797221f }, { 0.45f, 0.45f, 0.45f, -0.32280341f, -0.40196517f, 0.85686755f }, { 0.45f, 0.45f, 0.45f, -0.54291767f, -0.03661582f, 0.83898729f }, { 0.45f, 0.45f, 0.45f, -0.43981728f, 0.17766052f, -0.88033944f }, { 0.45f, 0.45f, 0.45f, -0.30542991f, 0.15269795f, -0.93989146f }, { 0.45f, 0.45f, 0.45f, 0.25499839f, -0.84816056f, -0.46432686f }, { 0.45f, 0.45f, 0.45f, -0.08326543f, -0.54733652f, -0.83276027f }, { 0.45f, 0.45f, 0.45f, 0.19582930f, 0.94011426f, -0.27899113f }, { 0.45f, 0.45f, 0.45f, -0.62792563f, -0.65061462f, -0.42709485f }, { 0.45f, 0.45f, 0.45f, -0.15101212f, -0.71274817f, -0.68497109f }, { 0.44f, 0.44f, 0.44f, 0.20550896f, 0.41407076f, -0.88674206f }, { 0.44f, 0.44f, 0.44f, -0.94479841f, 0.19114837f, 0.26611695f }, { 0.44f, 0.44f, 0.44f, -0.00422795f, -0.98544830f, -0.16992286f }, { 0.44f, 0.44f, 0.44f, 0.15421760f, 0.98716140f, -0.04158502f }, { 0.44f, 0.44f, 0.44f, -0.41642070f, 0.80608112f, -0.42050806f }, { 0.44f, 0.44f, 0.44f, -0.29821402f, 0.38770521f, 0.87221158f }, { 0.44f, 0.44f, 0.44f, -0.19141783f, 0.95578170f, 0.22325011f }, { 0.44f, 0.44f, 0.44f, 0.46831468f, -0.24158593f, 0.84989268f }, { 0.44f, 0.44f, 0.44f, -0.45052665f, -0.54978323f, -0.70339471f }, { 0.44f, 0.44f, 0.44f, -0.91578776f, -0.40152600f, -0.01047178f }, { 0.44f, 0.44f, 0.44f, 0.36386406f, -0.92986393f, 0.05436927f }, { 0.44f, 0.44f, 0.44f, -0.66100901f, 0.74200892f, 0.11175800f }, { 0.44f, 0.44f, 0.44f, 0.38923788f, 0.21221939f, 0.89635754f }, { 0.44f, 0.44f, 0.44f, -0.96902460f, -0.23980923f, 0.05901600f }, { 0.44f, 0.44f, 0.44f, -0.43215251f, 0.20825201f, -0.87742537f }, { 0.43f, 0.43f, 0.43f, 0.92505246f, -0.33007839f, 0.18795274f }, { 0.43f, 0.43f, 0.43f, -0.39145190f, -0.67892623f, -0.62114781f }, { 0.43f, 0.43f, 0.43f, -0.41047239f, -0.45701069f, -0.78908408f }, { 0.43f, 0.43f, 0.43f, 0.05306834f, 0.45894864f, -0.88687646f }, { 0.43f, 0.43f, 0.43f, -0.38399485f, 0.25597170f, -0.88714510f }, { 0.43f, 0.43f, 0.43f, 0.67417717f, 0.27358362f, -0.68603003f }, { 0.43f, 0.43f, 0.43f, -0.05223639f, -0.88358033f, 0.46535707f }, { 0.43f, 0.43f, 0.43f, 0.37326720f, 0.88652366f, 0.27339965f }, { 0.43f, 0.43f, 0.43f, -0.66319853f, -0.34340242f, -0.66501313f }, { 0.43f, 0.43f, 0.43f, 0.48571777f, 0.84696811f, 0.21615562f }, { 0.43f, 0.43f, 0.43f, 0.76590681f, 0.41189557f, 0.49368894f }, { 0.43f, 0.43f, 0.43f, 0.54339010f, 0.53515434f, -0.64678979f }, { 0.43f, 0.43f, 0.43f, 0.31167477f, -0.35451192f, 0.88157821f }, { 0.43f, 0.43f, 0.43f, 0.26600966f, -0.30345955f, -0.91495967f }, { 0.43f, 0.43f, 0.43f, 0.18100056f, -0.81531858f, 0.54999495f }, { 0.43f, 0.43f, 0.43f, 0.28402635f, -0.95503008f, -0.08512709f }, { 0.43f, 0.43f, 0.43f, -0.82599336f, 0.39974546f, 0.39741483f }, { 0.43f, 0.43f, 0.43f, 0.52045333f, 0.11323932f, 0.84634811f }, { 0.43f, 0.43f, 0.43f, -0.38155916f, 0.34668523f, -0.85686755f }, { 0.43f, 0.43f, 0.43f, 0.94048357f, 0.29022917f, -0.17679845f }, { 0.42f, 0.42f, 0.42f, -0.65976042f, 0.31787598f, 0.68093395f }, { 0.42f, 0.42f, 0.42f, 0.75550532f, 0.65271008f, 0.05640237f }, { 0.42f, 0.42f, 0.42f, -0.82416737f, 0.15095326f, 0.54585826f }, { 0.42f, 0.42f, 0.42f, -0.23505063f, 0.85165226f, -0.46844387f }, { 0.42f, 0.42f, 0.42f, -0.29367635f, 0.52556175f, -0.79846042f }, { 0.42f, 0.42f, 0.42f, -0.65471596f, -0.33943284f, -0.67537570f }, { 0.42f, 0.42f, 0.42f, -0.80977929f, 0.56097937f, 0.17192909f }, { 0.42f, 0.42f, 0.42f, -0.54960877f, -0.62947369f, 0.54926592f }, { 0.42f, 0.42f, 0.42f, 0.59488690f, -0.19171357f, -0.78061223f }, { 0.42f, 0.42f, 0.42f, 0.46696907f, -0.81896025f, 0.33353263f }, { 0.42f, 0.42f, 0.42f, -0.53401983f, -0.54318553f, 0.64789838f }, { 0.42f, 0.42f, 0.42f, 0.86717367f, -0.27334976f, 0.41628081f }, { 0.42f, 0.42f, 0.42f, -0.19042586f, -0.94975334f, 0.24840812f }, { 0.42f, 0.42f, 0.42f, 0.08164751f, -0.69026470f, -0.71893555f }, { 0.42f, 0.42f, 0.42f, 0.47126061f, -0.88182133f, 0.01745241f }, { 0.42f, 0.42f, 0.42f, 0.86414129f, 0.42178112f, -0.27451870f }, { 0.42f, 0.42f, 0.42f, 0.23254204f, -0.90350789f, -0.35999683f }, { 0.42f, 0.42f, 0.42f, 0.38470000f, -0.12188006f, 0.91495967f }, { 0.42f, 0.42f, 0.42f, 0.53821993f, 0.56313294f, 0.62705708f }, { 0.41f, 0.41f, 0.41f, 0.88222283f, -0.45827830f, 0.10799935f }, { 0.41f, 0.41f, 0.41f, -0.55384320f, 0.81712651f, 0.15988119f }, { 0.41f, 0.41f, 0.41f, -0.31759623f, 0.87120867f, 0.37433687f }, { 0.41f, 0.41f, 0.41f, -0.84410006f, 0.45197052f, 0.28847480f }, { 0.41f, 0.41f, 0.41f, -0.25677931f, -0.73427385f, 0.62841570f }, { 0.41f, 0.41f, 0.41f, 0.55381840f, 0.81517404f, -0.16963618f }, { 0.41f, 0.41f, 0.41f, 0.36669397f, 0.87038088f, 0.32859191f }, { 0.41f, 0.41f, 0.41f, -0.49786922f, 0.29659346f, -0.81495923f }, { 0.41f, 0.41f, 0.41f, -0.09407933f, -0.95949417f, -0.26555610f }, { 0.41f, 0.41f, 0.41f, -0.84354466f, 0.09984009f, -0.52769727f }, { 0.41f, 0.41f, 0.41f, 0.05501411f, 0.96510792f, -0.25600818f }, { 0.41f, 0.41f, 0.41f, 0.98458898f, 0.08368783f, -0.15356073f }, { 0.41f, 0.41f, 0.41f, 0.51513886f, 0.34910315f, -0.78278923f }, { 0.41f, 0.41f, 0.41f, 0.35807529f, 0.74987817f, -0.55629563f }, { 0.41f, 0.41f, 0.41f, -0.51334995f, -0.62172925f, -0.59154421f }, { 0.41f, 0.41f, 0.41f, -0.53775209f, -0.84099400f, -0.05959675f }, { 0.41f, 0.41f, 0.41f, -0.56938469f, -0.39647010f, -0.72014755f }, { 0.41f, 0.41f, 0.41f, 0.02724542f, -0.29556635f, 0.95493364f }, { 0.41f, 0.41f, 0.41f, -0.09863980f, 0.31889999f, -0.94264150f }, { 0.41f, 0.41f, 0.41f, -0.40082386f, 0.81773162f, 0.41310441f }, { 0.41f, 0.41f, 0.41f, 0.55308396f, -0.80436671f, -0.21700758f }, { 0.41f, 0.41f, 0.41f, -0.22924352f, -0.75374138f, -0.61589068f }, { 0.41f, 0.41f, 0.41f, -0.95178890f, 0.17068234f, -0.25488323f }, { 0.41f, 0.41f, 0.41f, -0.48841876f, 0.47324172f, 0.73313665f }, { 0.41f, 0.41f, 0.41f, -0.32039970f, 0.90352762f, 0.28457311f }, { 0.41f, 0.41f, 0.41f, -0.68017197f, -0.53061265f, 0.50578284f }, { 0.41f, 0.41f, 0.41f, 0.21505727f, -0.34178066f, -0.91484225f }, { 0.41f, 0.41f, 0.41f, 0.60158956f, 0.27410734f, 0.75030339f }, { 0.40f, 0.40f, 0.40f, 0.18263824f, 0.97591895f, -0.11927044f }, { 0.40f, 0.40f, 0.40f, -0.60498190f, 0.46129021f, -0.64900553f }, { 0.40f, 0.40f, 0.40f, 0.61407155f, -0.74791521f, 0.25206935f }, { 0.40f, 0.40f, 0.40f, -0.51517010f, -0.71572614f, -0.47152501f }, { 0.40f, 0.40f, 0.40f, -0.06157968f, -0.48574832f, -0.87192690f }, { 0.40f, 0.40f, 0.40f, 0.61877620f, 0.76971698f, 0.15700907f }, { 0.40f, 0.40f, 0.40f, -0.34942970f, 0.70649987f, -0.61543220f }, { 0.40f, 0.40f, 0.40f, -0.49179676f, -0.04598343f, -0.86949492f }, { 0.40f, 0.40f, 0.40f, -0.18932696f, 0.80746388f, 0.55871052f }, { 0.40f, 0.40f, 0.40f, 0.06259237f, 0.92209119f, -0.38187706f }, { 0.40f, 0.40f, 0.40f, 0.92404860f, 0.35478613f, -0.14234102f }, { 0.40f, 0.40f, 0.40f, 0.65539765f, 0.60047364f, 0.45813251f }, { 0.40f, 0.40f, 0.40f, -0.86757469f, 0.44882801f, -0.21416709f }, { 0.40f, 0.40f, 0.40f, -0.99870187f, 0.04054843f, 0.03082926f }, { 0.40f, 0.40f, 0.40f, -0.30486819f, -0.08492956f, -0.94860023f }, { 0.40f, 0.40f, 0.40f, -0.09859344f, 0.31891432f, -0.94264150f }, { 0.40f, 0.40f, 0.40f, 0.88851464f, 0.37479037f, 0.26471469f }, { 0.40f, 0.40f, 0.40f, -0.38818985f, 0.46139854f, -0.79775935f }, { 0.40f, 0.40f, 0.40f, 0.71581513f, -0.18540023f, 0.67322761f }, { 0.40f, 0.40f, 0.40f, -0.02655304f, -0.42600515f, -0.90433097f }, { 0.39f, 0.39f, 0.39f, -0.39449832f, 0.02481967f, -0.91856140f }, { 0.39f, 0.39f, 0.39f, 0.49345389f, 0.76838762f, 0.40753371f }, { 0.39f, 0.39f, 0.39f, 0.40777862f, 0.87249523f, 0.26920000f }, { 0.39f, 0.39f, 0.39f, -0.20809567f, -0.70914137f, -0.67365772f }, { 0.39f, 0.39f, 0.39f, 0.58154839f, 0.09462435f, 0.80798990f }, { 0.39f, 0.39f, 0.39f, 0.36152646f, -0.37826082f, -0.85218388f }, { 0.39f, 0.39f, 0.39f, -0.37042993f, -0.22345768f, 0.90158099f }, { 0.39f, 0.39f, 0.39f, -0.50194037f, -0.70804209f, -0.49672151f }, { 0.39f, 0.39f, 0.39f, -0.36118892f, 0.27333024f, 0.89153415f }, { 0.39f, 0.39f, 0.39f, 0.92191952f, -0.38738132f, -0.00029089f }, { 0.39f, 0.39f, 0.39f, 0.10666521f, 0.97921681f, 0.17250219f }, { 0.39f, 0.39f, 0.39f, 0.78493893f, -0.54919469f, -0.28680322f }, { 0.39f, 0.39f, 0.39f, 0.90994221f, -0.20402180f, -0.36108211f }, { 0.39f, 0.39f, 0.39f, -0.53143394f, -0.80430645f, 0.26583657f }, { 0.39f, 0.39f, 0.39f, 0.01856304f, -0.64118099f, -0.76716512f }, { 0.39f, 0.39f, 0.39f, -0.53849858f, -0.68811131f, 0.48633540f }, { 0.39f, 0.39f, 0.39f, -0.98320395f, -0.18074743f, -0.02530457f }, { 0.39f, 0.39f, 0.39f, 0.29422757f, 0.95074064f, 0.09758290f }, { 0.38f, 0.38f, 0.38f, 0.54333377f, 0.30101991f, -0.78369343f }, { 0.38f, 0.38f, 0.38f, -0.54781771f, 0.63251108f, -0.54756325f }, { 0.38f, 0.38f, 0.38f, 0.98097295f, -0.18550418f, 0.05727362f }, { 0.38f, 0.38f, 0.38f, -0.00850191f, -0.87245458f, 0.48862123f }, { 0.38f, 0.38f, 0.38f, 0.59852648f, 0.71024871f, -0.37055743f }, { 0.38f, 0.38f, 0.38f, 0.50751889f, 0.75859994f, 0.40859598f }, { 0.38f, 0.38f, 0.38f, -0.67069167f, 0.04087443f, 0.74060917f }, { 0.38f, 0.38f, 0.38f, 0.47919452f, -0.87060165f, 0.11146893f }, { 0.38f, 0.38f, 0.38f, -0.53265584f, -0.84271425f, 0.07816910f }, { 0.38f, 0.38f, 0.38f, 0.01522965f, 0.96946830f, -0.24474335f }, { 0.38f, 0.38f, 0.38f, -0.35717896f, 0.67022651f, -0.65055329f }, { 0.38f, 0.38f, 0.38f, 0.00118872f, 0.58377624f, 0.81191373f }, { 0.38f, 0.38f, 0.38f, 0.28271061f, 0.95825225f, 0.04274754f }, { 0.38f, 0.38f, 0.38f, 0.60961920f, 0.77445608f, 0.16906281f }, { 0.38f, 0.38f, 0.38f, 0.86973280f, 0.45977125f, -0.17937458f }, { 0.38f, 0.38f, 0.38f, 0.52006382f, -0.49814272f, 0.69382089f }, { 0.38f, 0.38f, 0.38f, 0.03161889f, -0.98558581f, 0.16619509f }, { 0.38f, 0.38f, 0.38f, 0.59160018f, -0.51973379f, 0.61634892f }, { 0.38f, 0.38f, 0.38f, 0.09249251f, 0.99467951f, -0.04536299f }, { 0.38f, 0.38f, 0.38f, -0.74782109f, -0.66307187f, 0.03315518f }, { 0.38f, 0.38f, 0.38f, 0.59040618f, 0.79017019f, -0.16447377f }, { 0.38f, 0.38f, 0.38f, -0.39199558f, -0.85949266f, 0.32804239f }, { 0.38f, 0.38f, 0.38f, -0.62340361f, 0.23525384f, -0.74566984f }, { 0.38f, 0.38f, 0.38f, 0.72514129f, -0.57336760f, -0.38133928f }, { 0.38f, 0.38f, 0.38f, -0.05271227f, -0.99748433f, 0.04739701f }, { 0.38f, 0.38f, 0.38f, -0.48997906f, 0.47254783f, -0.73254287f }, { 0.38f, 0.38f, 0.38f, -0.01542062f, -0.54637170f, 0.83740085f }, { 0.38f, 0.38f, 0.38f, 0.59171128f, -0.24122198f, 0.76921374f }, { 0.38f, 0.38f, 0.38f, -0.15511373f, -0.49034050f, -0.85761642f }, { 0.37f, 0.37f, 0.37f, 0.25864050f, -0.89218408f, -0.37028724f }, { 0.37f, 0.37f, 0.37f, 0.79617882f, -0.42780229f, 0.42788377f }, { 0.37f, 0.37f, 0.37f, 0.39189056f, 0.86928928f, 0.30126059f }, { 0.37f, 0.37f, 0.37f, -0.24029249f, 0.32552803f, -0.91448951f }, { 0.37f, 0.37f, 0.37f, 0.94871718f, -0.28726330f, -0.13196805f }, { 0.37f, 0.37f, 0.37f, 0.61701846f, -0.73761857f, 0.27423897f }, { 0.37f, 0.37f, 0.37f, 0.40852863f, 0.61256278f, 0.67666179f }, { 0.37f, 0.37f, 0.37f, 0.41218764f, 0.38002291f, 0.82806033f }, { 0.37f, 0.37f, 0.37f, 0.65894055f, -0.73386419f, -0.16504760f }, { 0.37f, 0.37f, 0.37f, 0.23625541f, -0.57248890f, 0.78513682f }, { 0.37f, 0.37f, 0.37f, 0.19701055f, -0.56322998f, 0.80247045f }, { 0.37f, 0.37f, 0.37f, 0.17973220f, -0.12412395f, -0.97585326f } }; const unsigned int NumStars = countof(stars); // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzflag/stars.h000066400000000000000000000014531200563112200170030ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __STARS_H__ #define __STARS_H__ #include "common.h" /** array of star positions */ extern const float stars[][6]; /** how many stars */ extern const unsigned int NumStars; #endif /* __STARS_H__ */ // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/000077500000000000000000000000001200563112200151725ustar00rootroot00000000000000bzflag-2.4.2+ds1/src/bzfs/AccessControlList.cxx000066400000000000000000000526411200563112200213240ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "common.h" /* class interface header */ #include "AccessControlList.h" /* system interface headers */ #include #include #include #include #include #include #include #include #include /* common interface headers */ #include "global.h" #include "bzglob.h" #include "network.h" #include "Address.h" #include "TimeKeeper.h" #include "TextUtils.h" // bzfs specific headers #include "bzfs.h" void AccessControlList::ban(in_addr &ipAddr, const char *bannedBy, int period, const char *reason, bool fromMaster) { BanInfo toban(ipAddr, bannedBy, period,fromMaster); if (reason) toban.reason = reason; banList_t::iterator oldit = std::find(banList.begin(), banList.end(), toban); if (oldit != banList.end()) // IP already in list? -> replace *oldit = toban; else banList.push_back(toban); } bool AccessControlList::ban(std::string &ipList, const char *bannedBy, int period, const char *reason, bool fromMaster) { return ban(ipList.c_str(), bannedBy, period, reason,fromMaster); } bool AccessControlList::ban(const char *ipList, const char *bannedBy, int period, const char *reason, bool fromMaster) { char *buf = strdup(ipList); char *pStart = buf; char *pSep; bool added = false; in_addr mask; while ((pSep = strchr(pStart, ',')) != NULL) { *pSep = 0; if (convert(pStart, mask)) { ban(mask, bannedBy, period, NULL, fromMaster); added = true; } *pSep = ','; pStart = pSep + 1; } if (convert(pStart, mask)) { ban(mask, bannedBy, period, reason, fromMaster); added = true; } free(buf); return added; } void AccessControlList::hostBan(std::string hostpat, const char *bannedBy, int period, const char *reason, bool fromMaster) { HostBanInfo toban(hostpat, bannedBy, period,fromMaster); if (reason) toban.reason = reason; hostBanList_t::iterator oldit = std::find(hostBanList.begin(), hostBanList.end(), toban); if (oldit != hostBanList.end()) { *oldit = toban; } else { hostBanList.push_back(toban); } } void AccessControlList::idBan(std::string idpat, const char *bannedBy, int period, const char *reason, bool fromMaster) { IdBanInfo toban(idpat, bannedBy, period, fromMaster); if (reason) toban.reason = reason; idBanList_t::iterator oldit = std::find(idBanList.begin(), idBanList.end(), toban); if (oldit != idBanList.end()) { *oldit = toban; } else { idBanList.push_back(toban); } } bool AccessControlList::unban(in_addr &ipAddr) { banList_t::iterator it = std::remove(banList.begin(), banList.end(), BanInfo(ipAddr)); if (it != banList.end()) { banList.erase(it, banList.end()); return true; } return false; } bool AccessControlList::unban(std::string &ipList) { return unban(ipList.c_str()); } bool AccessControlList::unban(const char *ipList) { char *buf = strdup(ipList); char *pStart = buf; char *pSep; bool success = false; in_addr mask; while ((pSep = strchr(pStart, ',')) != NULL) { *pSep = 0; if (convert(pStart, mask)) success|=unban(mask); *pSep = ','; pStart = pSep + 1; } if (convert(pStart, mask)) success|=unban(mask); free(buf); return success; } bool AccessControlList::hostUnban(std::string hostpat) { hostBanList_t::iterator it = std::remove(hostBanList.begin(), hostBanList.end(), HostBanInfo(hostpat)); if (it != hostBanList.end()) { hostBanList.erase(it, hostBanList.end()); return true; } return false; } bool AccessControlList::idUnban(std::string idpat) { idBanList_t::iterator it = std::remove(idBanList.begin(), idBanList.end(), IdBanInfo(idpat)); if (it != idBanList.end()) { idBanList.erase(it, idBanList.end()); return true; } return false; } bool AccessControlList::validate(const in_addr &ipAddr, BanInfo *info) { expire(); const in_addr_t player_ip = ntohl(ipAddr.s_addr); for (banList_t::iterator it = banList.begin(); it != banList.end(); ++it) { in_addr_t banned = ntohl(it->addr.s_addr); if ((banned & 0x00ffffff) == 0x00ffffff) // class A banned = (banned & 0xff000000) | (player_ip & 0x00ffffff); else if ((banned & 0x0000ffff) == 0x0000ffff) // class B banned = (banned & 0xffff0000) | (player_ip & 0x0000ffff); else if ((banned & 0x000000ff) == 0x000000ff) // class C banned = (banned & 0xffffff00) | (player_ip & 0x000000ff); // else the IP address represents a single host if (player_ip == banned) { if (info) *info = *it; return false; } } return true; } bool AccessControlList::hostValidate(const char *hostname, HostBanInfo *info) { expire(); const std::string upperHost = TextUtils::toupper(hostname); for (hostBanList_t::iterator it = hostBanList.begin(); it != hostBanList.end(); ++it) { const std::string upperPattern = TextUtils::toupper(it->hostpat); if (glob_match(upperPattern, upperHost)) { if (info) *info = *it; return false; } } return true; } bool AccessControlList::idValidate(const char *id, IdBanInfo *info) { expire(); if (strlen(id) == 0) { return true; } for (idBanList_t::iterator it = idBanList.begin(); it != idBanList.end(); ++it) { if (strcmp(id, it->idpat.c_str()) == 0) { if (info) *info = *it; return false; } } return true; } static std::string makeGlobPattern(const char* str) { if (str == NULL) { return "*"; } while ((*str != '\0') && isspace(*str)) str++; if (*str == '\0') { return "*"; } std::string pattern = str; pattern = TextUtils::toupper(pattern); if (pattern.find('*') == std::string::npos) { pattern = "*" + pattern + "*"; } printf ("PATTERN = \"%s\"\n", pattern.c_str()); return pattern; } std::string AccessControlList::getBanMaskString(in_addr mask) { std::ostringstream os; os << (ntohl(mask.s_addr) >> 24) << '.'; if ((ntohl(mask.s_addr) & 0x00ffffff) == 0x00ffffff) { os << "*.*.*"; } else { os << ((ntohl(mask.s_addr) >> 16) & 0xff) << '.'; if ((ntohl(mask.s_addr) & 0x0000ffff) == 0x0000ffff) { os << "*.*"; } else { os << ((ntohl(mask.s_addr) >> 8) & 0xff) << '.'; if ((ntohl(mask.s_addr) & 0x000000ff) == 0x000000ff) os << "*"; else os << (ntohl(mask.s_addr) & 0xff); } } return os.str(); } void AccessControlList::sendBan(PlayerId id, const BanInfo &baninfo) { std::ostringstream os; os << getBanMaskString(baninfo.addr); // print duration when < 1 year double duration = baninfo.banEnd - TimeKeeper::getCurrent(); if (duration < 365.0f * 24 * 3600) os << std::setiosflags(std::ios::fixed) << std::setprecision(1) << " (" << duration/60 << " minutes)"; if( baninfo.fromMaster ) os << " (m)"; if (baninfo.bannedBy.length()) os << " banned by: " << baninfo.bannedBy; bz_sendTextMessage(BZ_SERVER, id, os.str().c_str()); // add reason, if any if (baninfo.reason.size()) { std::ostringstream ost; ost << " reason: " << baninfo.reason; bz_sendTextMessage(BZ_SERVER, id, ost.str().c_str()); } } void AccessControlList::sendBans(PlayerId id, const char* pattern) { expire(); bz_sendTextMessage(BZ_SERVER, id, "IP Ban List"); bz_sendTextMessage(BZ_SERVER, id, "-----------"); const std::string glob = makeGlobPattern(pattern); // masterbans first for (banList_t::iterator it = banList.begin(); it != banList.end(); ++it) { const BanInfo& bi = *it; if (bi.fromMaster && (glob_match(glob, getBanMaskString(bi.addr)) || glob_match(glob, TextUtils::toupper(bi.reason)) || glob_match(glob, TextUtils::toupper(bi.bannedBy)))) { sendBan(id, *it); } } // normal bans last for (banList_t::iterator it = banList.begin(); it != banList.end(); ++it) { const BanInfo& bi = *it; if (!bi.fromMaster && (glob_match(glob, getBanMaskString(bi.addr)) || glob_match(glob, TextUtils::toupper(bi.reason)) || glob_match(glob, TextUtils::toupper(bi.bannedBy)))) { sendBan(id, *it); } } } void AccessControlList::sendHostBans(PlayerId id, const char* pattern) { expire(); sendMessage(ServerPlayer, id, "Host Ban List"); sendMessage(ServerPlayer, id, "-------------"); const std::string glob = makeGlobPattern(pattern); char banlistmessage[MessageLen]; for (hostBanList_t::iterator it = hostBanList.begin(); it != hostBanList.end(); ++it) { const HostBanInfo& bi = *it; if (!glob_match(glob, TextUtils::toupper(bi.hostpat)) && !glob_match(glob, TextUtils::toupper(bi.reason)) && !glob_match(glob, TextUtils::toupper(bi.bannedBy))) { continue; } char *pMsg = banlistmessage; snprintf(pMsg, MessageLen, "%s", bi.hostpat.c_str()); // print duration when < 1 year double duration = bi.banEnd - TimeKeeper::getCurrent(); int remaining; remaining = MessageLen - strlen(pMsg); if (duration < 365.0f * 24 * 3600) { snprintf(pMsg + strlen(pMsg), remaining, " (%.1f minutes)", duration / 60); } remaining = MessageLen - strlen(pMsg); if (bi.bannedBy.length()) { snprintf(pMsg + strlen(pMsg), remaining, " banned by: %s", bi.bannedBy.c_str()); } remaining = MessageLen - strlen(pMsg); if (bi.fromMaster) { snprintf(pMsg + strlen(pMsg), remaining, "(m)"); } sendMessage(ServerPlayer, id, banlistmessage); // add reason, if any if (bi.reason.size()) { pMsg = banlistmessage; snprintf(pMsg, MessageLen, " reason: %s", bi.reason.c_str()); sendMessage(ServerPlayer, id, banlistmessage); } } } void AccessControlList::sendIdBans(PlayerId id, const char* pattern) { expire(); sendMessage(ServerPlayer, id, "BZID Ban List"); sendMessage(ServerPlayer, id, "-------------"); const std::string glob = makeGlobPattern(pattern); char banlistmessage[MessageLen]; for (idBanList_t::iterator it = idBanList.begin(); it != idBanList.end(); ++it) { const IdBanInfo& bi = *it; if (!glob_match(glob, TextUtils::toupper(bi.idpat)) && !glob_match(glob, TextUtils::toupper(bi.reason)) && !glob_match(glob, TextUtils::toupper(bi.bannedBy))) { continue; } char *pMsg = banlistmessage; bool useQuotes = (bi.idpat.find_first_of(" \t") != std::string::npos); if (useQuotes) { snprintf(pMsg, MessageLen, "\"%s\"", bi.idpat.c_str()); } else { snprintf(pMsg, MessageLen, "%s", bi.idpat.c_str()); } // print duration when < 1 year double duration = bi.banEnd - TimeKeeper::getCurrent(); int remaining; remaining = MessageLen - strlen(pMsg); if (duration < 365.0f * 24 * 3600) { snprintf(pMsg + strlen(pMsg), remaining, " (%.1f minutes)", duration / 60); } remaining = MessageLen - strlen(pMsg); if (bi.bannedBy.length()) { snprintf(pMsg + strlen(pMsg), remaining, " banned by: %s", bi.bannedBy.c_str()); } remaining = MessageLen - strlen(pMsg); if (bi.fromMaster) { snprintf(pMsg + strlen(pMsg), remaining, "(m)"); } sendMessage(ServerPlayer, id, banlistmessage); // add reason, if any if (bi.reason.size()) { pMsg = banlistmessage; snprintf(pMsg, MessageLen, " reason: %s", bi.reason.c_str()); sendMessage(ServerPlayer, id, banlistmessage); } } } bool AccessControlList::load() { // clear all local bans purgeLocals(); if (banFile.size() == 0) return true; // try to open the ban file std::ifstream is(banFile.c_str()); if (!is.good()) // file does not exist, but that's OK, we'll create it later if needed return true; // try to read ban entries std::string ipAddress, hostpat, bzId, bannedBy, reason, tmp; long banEnd; is >> std::ws; while (!is.eof()) { is >> ipAddress; if (ipAddress == "host:") { is >> hostpat; } else if (ipAddress == "bzid:") { is.ignore(1); std::getline(is, bzId); } is >> tmp; if (tmp != "end:") { logDebugMessage(3,"Banfile: bad 'end:' line\n"); return false; } is >> banEnd; if (banEnd != 0) { // banEnd is absolute time - get delay from now, in minute // ban command use minute as ban time banEnd -= long(time(NULL)); banEnd /= 60; if (banEnd == 0) banEnd = -1; } is >> tmp; if (tmp != "banner:") { logDebugMessage(3,"Banfile: bad 'banner:' line\n"); return false; } is.ignore(1); std::getline(is, bannedBy); is >> tmp; if (tmp != "reason:") { logDebugMessage(3,"Banfile: bad 'reason:' line\n"); return false; } is.ignore(1); std::getline(is, reason); is >> std::ws; if (banEnd < 0) continue; if (ipAddress == "host:") { hostBan(hostpat, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL)); } else if (ipAddress == "bzid:") { idBan(bzId, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL)); } else { std::string::size_type n; while ((n = ipAddress.find('*')) != std::string::npos) { ipAddress.replace(n, 1, "255"); } if (!ban(ipAddress, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL))) { logDebugMessage(3,"Banfile: bad ban\n"); return false; } } } return true; } int AccessControlList::merge(const std::string& banData) { if (!banData.size()) { return 0; } int bansAdded = 0; std::stringstream is(banData,std::stringstream::in); // try to read ban entries std::string ipAddress, hostpat, bzId, bannedBy, reason, tmp; long banEnd; is>>std::ws; while (!is.eof()) { is >> ipAddress; if (ipAddress == "host:") { is >> hostpat; } else if (ipAddress == "bzid:") { is.ignore(1); std::getline(is, bzId); } is >> tmp; if (tmp != "end:") { logDebugMessage(3,"Banfile: bad 'end:' line\n"); return bansAdded; } is >> banEnd; if (banEnd != 0) { banEnd -= long(time(NULL)); banEnd /= 60; if (banEnd == 0) banEnd = -1; } is >> tmp; if (tmp != "banner:") { logDebugMessage(3,"Banfile: bad 'banner:' line\n"); return bansAdded; } is.ignore(1); std::getline(is, bannedBy); is >> tmp; if (tmp != "reason:") { logDebugMessage(3,"Banfile: bad 'reason:' line\n"); return bansAdded; } is.ignore(1); std::getline(is, reason); is >> std::ws; if (banEnd < 0) continue; if (ipAddress == "host:") { hostBan(hostpat, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL),true); bansAdded++; } else if (ipAddress == "bzid:") { idBan(bzId, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL)); } else { std::string::size_type n; while ((n = ipAddress.find('*')) != std::string::npos) { ipAddress.replace(n, 1, "255"); } if (!ban(ipAddress, (bannedBy.size() ? bannedBy.c_str(): NULL), banEnd, (reason.size() > 0 ? reason.c_str() : NULL),true)) { logDebugMessage(3,"Banfile: bad ban\n"); return bansAdded; } bansAdded++; } } return bansAdded; } void AccessControlList::save() { if (banFile.size() == 0) return; std::ofstream os(banFile.c_str()); if (!os.good()) { std::cerr<<"Could not open "<fromMaster) { // don't save stuff from the master list // print address in_addr mask = it->addr; os << ((ntohl(mask.s_addr) >> 24) % 256) << '.'; if ((ntohl(mask.s_addr) & 0x00ffffff) == 0x00ffffff) { os << "*.*.*"; } else { os << ((ntohl(mask.s_addr) >> 16) % 256) << '.'; if ((ntohl(mask.s_addr) & 0x0000ffff) == 0x0000ffff) { os << "*.*"; } else { os << ((ntohl(mask.s_addr) >> 8) % 256) << '.'; if ((ntohl(mask.s_addr) & 0x000000ff) == 0x000000ff) os << "*"; else os << (ntohl(mask.s_addr) % 256); } } os << '\n'; // print ban end, banner, and reason if (it->banEnd.getSeconds() == TimeKeeper::getSunExplodeTime().getSeconds()) { os << "end: 0" << '\n'; } else { os << "end: " << (long(it->banEnd.getSeconds() + time(NULL) - TimeKeeper::getCurrent().getSeconds()))<<'\n'; } os << "banner: " << it->bannedBy << '\n'; os << "reason: " << it->reason << '\n'; os << '\n'; } } for (hostBanList_t::const_iterator ith = hostBanList.begin(); ith != hostBanList.end(); ++ith) { // print address os << "host: " << ith->hostpat << '\n'; // print ban end, banner, and reason if (ith->banEnd.getSeconds() == TimeKeeper::getSunExplodeTime().getSeconds()) { os << "end: 0" << '\n'; } else { os << "end: " << (long(ith->banEnd.getSeconds() + time(NULL) - TimeKeeper::getCurrent().getSeconds()))<<'\n'; } os << "banner: " << ith->bannedBy << '\n'; os << "reason: " << ith->reason << '\n'; os << '\n'; } for (idBanList_t::const_iterator iti = idBanList.begin(); iti != idBanList.end(); ++iti) { // print bzid os << "bzid: " << iti->idpat << '\n'; // print ban end, banner, and reason if (iti->banEnd.getSeconds() == TimeKeeper::getSunExplodeTime().getSeconds()) { os << "end: 0" << '\n'; } else { os << "end: " << (long(iti->banEnd.getSeconds() + time(NULL) - TimeKeeper::getCurrent().getSeconds())) << '\n'; } os << "banner: " << iti->bannedBy << '\n'; os << "reason: " << iti->reason << '\n'; os << '\n'; } } void AccessControlList::purge(bool master) { // selectively remove bans, depending on their origin // (local or from master list) banList_t::iterator bItr = banList.begin(); while (bItr != banList.end()){ if (bItr->fromMaster == master) bItr = banList.erase(bItr); else ++bItr; } hostBanList_t::iterator hItr = hostBanList.begin(); while (hItr != hostBanList.end()) { if (hItr->fromMaster == master) hItr = hostBanList.erase(hItr); else ++hItr; } idBanList_t::iterator iItr = idBanList.begin(); while (iItr != idBanList.end()) { if (iItr->fromMaster == master) { iItr = idBanList.erase(iItr); } else { ++iItr; } } } void AccessControlList::purgeLocals(void) { // remove any local bans AccessControlList::purge(false); } void AccessControlList::purgeMasters(void) { // remove any bans from the master server AccessControlList::purge(true); } std::vector > AccessControlList::listMasterBans(void) const { std::vector > bans; std::string explain; banList_t::const_iterator bItr; for (bItr = banList.begin(); bItr != banList.end(); ++bItr) { if (bItr->fromMaster) { explain = TextUtils::format("%s (banned by %s)", bItr->reason.c_str(), bItr->bannedBy.c_str()); const std::pair baninfo = std::make_pair(std::string(inet_ntoa(bItr->addr)), explain); bans.push_back(baninfo); } } hostBanList_t::const_iterator hItr; for (hItr = hostBanList.begin(); hItr != hostBanList.end(); ++hItr) { if (hItr->fromMaster) { explain = TextUtils::format("%s (banned by %s)", hItr->reason.c_str(), hItr->bannedBy.c_str()); const std::pair baninfo = std::make_pair(hItr->hostpat, explain); bans.push_back(baninfo); } } idBanList_t::const_iterator iItr; for (iItr = idBanList.begin(); iItr != idBanList.end(); ++iItr) { if (iItr->fromMaster) { explain = TextUtils::format("%s (banned by %s)", iItr->reason.c_str(), iItr->bannedBy.c_str()); const std::pair baninfo = std::make_pair(iItr->idpat, explain); bans.push_back(baninfo); } } return bans; } bool AccessControlList::convert(char *ip, in_addr &mask) { unsigned char b[4]; char *pPeriod; for (int i = 0; i < 3; i++) { pPeriod = strchr(ip, '.'); if (pPeriod) { *pPeriod = 0; if (strcmp("*", ip) == 0) b[i] = 255; else b[i] = atoi(ip); *pPeriod = '.'; ip = pPeriod + 1; } else { return false; } } if (strcmp("*", ip) == 0) b[3] = 255; else b[3] = atoi(ip); mask.s_addr= htonl(((unsigned int)b[0] << 24) | ((unsigned int)b[1] << 16) | ((unsigned int)b[2] << 8) | (unsigned int)b[3]); return true; } void AccessControlList::expire() { TimeKeeper now = TimeKeeper::getCurrent(); for (banList_t::iterator it = banList.begin(); it != banList.end();) { if (it->banEnd <= now) { it = banList.erase(it); } else { ++it; } } for (hostBanList_t::iterator ith = hostBanList.begin(); ith != hostBanList.end();) { if (ith->banEnd <= now) { ith = hostBanList.erase(ith); } else { ++ith; } } for (idBanList_t::iterator iti = idBanList.begin(); iti != idBanList.end();) { if (iti->banEnd <= now) { iti = idBanList.erase(iti); } else { ++iti; } } } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/AccessControlList.h000066400000000000000000000256101200563112200207450ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __ACCESSCONTROLLIST_H__ #define __ACCESSCONTROLLIST_H__ #include #include #include #include "TimeKeeper.h" #include "Address.h" /** This struct contains information about a ban - the address that was banned, the time the ban will expire, the callsign of the player who performed the ban, and the reason. It also has operators defined for checking if two bans are equal. */ struct BanInfo { /** This constructor creates a new BanInfo with the address @c banAddr, the ban performer @c bannedBy, and the expiration time @c period minutes from now. */ BanInfo(in_addr &banAddr, const char *_bannedBy = NULL, int period = 0, bool isFromMaster = false ) { memcpy( &addr, &banAddr, sizeof( in_addr )); if (_bannedBy) bannedBy = _bannedBy; if (period == 0) { banEnd = TimeKeeper::getSunExplodeTime(); } else { banEnd = TimeKeeper::getCurrent(); banEnd += period * 60.0f; } fromMaster = isFromMaster; } /** BanInfos with same IP are identical. */ bool operator==(const BanInfo &rhs) const { return addr.s_addr == rhs.addr.s_addr; } /** Only BanInfos with the same IP are identical. */ bool operator!=(const BanInfo &rhs) const { return addr.s_addr != rhs.addr.s_addr; } in_addr addr; TimeKeeper banEnd; std::string bannedBy; // Who did perform the ban std::string reason; // reason for banning bool fromMaster; // where the ban came from, local or master list. }; /** This struct contains information about a hostban - the host pattern that was banned, the time the ban will expire, the callsign of the player who performed the ban, and the reason. It also has operators defined for checking if two bans are equal. */ struct HostBanInfo { /** This constructor creates a new HostBanInfo with the host pattern @c hostpat, the ban performer @c bannedBy, and the expiration time @c period minutes from now. */ HostBanInfo(std::string _hostpat, const char *_bannedBy = NULL, int period = 0, bool isFromMaster = false ) { hostpat = _hostpat; if (_bannedBy) bannedBy = _bannedBy; if (period == 0) { banEnd = TimeKeeper::getSunExplodeTime(); } else { banEnd = TimeKeeper::getCurrent(); banEnd += period * 60.0f; } fromMaster = isFromMaster; } /** HostBanInfos with same host pattern are identical. */ bool operator==(const HostBanInfo &rhs) const { return hostpat == rhs.hostpat; } /** Only HostBanInfos with same host pattern are identical. */ bool operator!=(const HostBanInfo& rhs) const { return hostpat != rhs.hostpat; } std::string hostpat; TimeKeeper banEnd; std::string bannedBy; std::string reason; bool fromMaster; // where the ban came from, local or master list. }; /** This struct contains information about an idban - the databaseid pattern that was banned, the time the ban will expire, the callsign of the player who performed the ban, and the reason. It also has operators defined for checking if two bans are equal. */ struct IdBanInfo { /** This constructor creates a new IdBanInfo with the id pattern @c idpat, the ban performer @c bannedBy, and the expiration time @c period minutes from now. */ IdBanInfo(std::string _idpat, const char *_bannedBy = NULL, int period = 0, bool isFromMaster = false ) { idpat = _idpat; if (_bannedBy) bannedBy = _bannedBy; if (period == 0) { banEnd = TimeKeeper::getSunExplodeTime(); } else { banEnd = TimeKeeper::getCurrent(); banEnd += period * 60.0f; } fromMaster = isFromMaster; } /** IdBanInfos with same id pattern are identical. */ bool operator==(const IdBanInfo &rhs) const { return idpat == rhs.idpat; } /** Only IdBanInfos with same id pattern are identical. */ bool operator!=(const IdBanInfo& rhs) const { return idpat != rhs.idpat; } std::string idpat; TimeKeeper banEnd; std::string bannedBy; std::string reason; bool fromMaster; // where the ban came from, local or master list. }; /* FIXME the AccessControlList assumes that 255 is a wildcard. it "should" * include a cidr mask with each address. it's still useful as is, though * see wildcard conversion occurs in convert(). */ /** This class handles the lists of bans and hostbans. It has functions for adding and removing bans and hostbans, checking if a certain IP or host is banned, sending the ban lists to a player, and reading and writing the ban lists to a file. */ class AccessControlList { public: /** This function will add a ban for the address @c ipAddr with the given parameters. If that address already is banned the old ban will be replaced. */ void ban(in_addr &ipAddr, const char *bannedBy, int period = 0, const char *reason=NULL, bool fromMaster = false); /** This function takes a list of addresses as a string and tries to ban them using the given parameters. The string should be comma separated, like this: "1.2.3.4,5.6.7.8,9.10.11.12". */ bool ban(std::string &ipList, const char *bannedBy=NULL, int period = 0, const char *reason=NULL, bool fromMaster = false); /** This function takes a list of addresses as a const char* and tries to ban them using the given parameters. The string should be comma separated, like this: "1.2.3.4,5.6.7.8,9.10.11.12". */ bool ban(const char *ipList, const char *bannedBy=NULL, int period = 0, const char *reason=NULL, bool fromMaster = false); /** This function adds a hostban for the host pattern @c hostpat with the given parameters. If the host pattern already is banned the old ban will be replaced. */ void hostBan(std::string hostpat, const char *bannedBy, int period = 0, const char *reason = NULL, bool fromMaster = false); /** This function adds an idban for the id pattern @c idpat with the given parameters. If the idban pattern already is banned the old ban will be replaced. */ void idBan(std::string hostpat, const char *bannedBy, int period = 0, const char *reason = NULL, bool fromMaster = false); /** This function removes any ban for the address @c ipAddr. @returns @c true if there was a ban for that address, @c false if there wasn't. */ bool unban(in_addr &ipAddr); /** This function unbans any addresses given in @c ipList, which should be a comma separated string in the same format as in the ban() functions. @returns @c true if there was a ban for any of the addresses, @c false if none of the addresses were banned. */ bool unban(std::string &ipList); /** This function unbans any addresses given in @c ipList, which should be a comma separated string in the same format as in the ban() functions. @returns @c true if there was a ban for any of the addresses, @c false if none of the addresses were banned. */ bool unban(const char *ipList); /** This function removes any ban for the host pattern @c hostpat. @returns @c true if there was a ban for the host pattern, @c false otherwise. */ bool hostUnban(std::string hostpat); /** This function removes any ban for the database id @c idpat. @returns @c true if there was a ban for the database id, @c false otherwise. */ bool idUnban(std::string idpat); /** This function checks if an address is "valid" or not. Valid in this case means that it has not been banned. @returns @c true if the address is valid, @c false if not. */ bool validate(const in_addr &ipAddr, BanInfo *info = NULL); /** This function checks that a hostname is "valid". In this case valid means "not banned". @returns @c true if the hostname is valid, @c false if it isn't. */ bool hostValidate(const char *hostname, HostBanInfo *info = NULL); /** This function checks that an id is "valid". In this case valid means "not banned". @returns @c true if the id is valid, @c false if it isn't. */ bool idValidate(const char *idname, IdBanInfo *info = NULL); /** This function sends a textual list of the given IP ban to a player. */ void sendBan(PlayerId id, const BanInfo&); /** This function sends a textual list of all IP bans to a player. */ void sendBans(PlayerId id, const char* pattern); /** This function sends a textual list of all host bans to a player. */ void sendHostBans(PlayerId id, const char* pattern); /** This function sends a textual list of all id bans to a player. */ void sendIdBans(PlayerId id, const char* pattern); /** This function tells this object where to save the banlist, and where to load it from. */ void setBanFile(const std::string& filename); /** This function loads a banlist from the ban file, if it has been set. It only returns @c false if the file exist but is not in the correct format, otherwise @c true is returned. */ bool load(); /** This function saves the banlist to the ban file, if it has been set. */ void save(); /** This function merges in a banlist from the master ban list ban file, if it has been set. It only returns @c false if the file exist but is not in the correct format, otherwise @c true is returned. */ int merge(const std::string& banData); /** This function purges any bans that are flagged as from the master ban list, presumably so it can be remerged */ void purgeMasters(void); std::string getBanMaskString(in_addr mask); std::vector > listMasterBans(void) const; typedef std::vector banList_t; banList_t banList; typedef std::vector hostBanList_t; hostBanList_t hostBanList; typedef std::vector idBanList_t; idBanList_t idBanList; std::string banFile; private: /** This function converts a char* containing an IP mask to an @c in_addr. */ bool convert(char *ip, in_addr &mask); /** This function checks all bans to see if any of them have expired, and removes those who have. */ void expire(); /** This function removes bans dependent on their origin (local or from master list) **/ void purge(bool master); /** This function purges all local bans so the local banfile can be reloaded **/ void purgeLocals(void); }; inline void AccessControlList::setBanFile(const std::string& filename) { banFile = filename; } #endif /* __ACCESSCONTROLLIST_H__ */ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/Authentication.cxx000066400000000000000000000013201200563112200206710ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* interface header */ #include "Authentication.h" Authentication::Authentication() : globallyAuthenticated(false) { } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/Authentication.h000066400000000000000000000016551200563112200203310ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef BZF_AUTHENTICATION_H #define BZF_AUTHENTICATION_H /* bzflag special common - 1st one */ #include "common.h" class Authentication { public: Authentication(); bool isGlobal(void) const {return globallyAuthenticated;}; void global(bool set) {globallyAuthenticated = set;} private: bool globallyAuthenticated; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/BZWError.cxx000066400000000000000000000032021200563112200173670ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "BZWError.h" // implementation-specific system headers #include #include BZWError::BZWError(std::string _location) : hadError(false), hadWarning(false), location(_location) { } BZWError::~BZWError() { } bool BZWError::fatalError(std::string errorMsg, int line) { // toggle flag hadError = true; // sanity if (line < 0) return false; if (errorMsg == "") errorMsg = "unspecified error"; // report error std::cerr << location << ": error"; if (line != 0) std::cerr << " (line " << line << ")" ; std::cerr << ": " << errorMsg << std::endl << std::flush; return true; } bool BZWError::warning(std::string warningMsg, int line) { // toggle flag hadWarning = true; // sanity if (line < 0) return false; if (warningMsg == "") warningMsg = "unspecified warning"; // report warning std::cerr << location << ": warning"; if (line != 0) std::cerr << " (line " << line << ")" ; std::cerr << ": " << warningMsg << std::endl << std::flush; return true; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/BZWError.h000066400000000000000000000023441200563112200170220ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZWERROR_H__ #define __BZWERROR_H__ #include "common.h" /* implementation-specific system headers */ #include class BZWError { public: BZWError(std::string _location); ~BZWError(); /* return false if error reporting failed, true otherwise */ bool fatalError(std::string errorMsg, int line); bool warning(std::string warningMsg, int line); /* status */ bool hasHadError() const {return hadError;}; bool hasHadWarning() const {return hadWarning;}; private: /* data */ bool hadError; bool hadWarning; std::string location; /* no public default constructor */ BZWError(); }; #endif //__BZWERROR_H__ // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/BZWReader.cxx000066400000000000000000000317661200563112200175200ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "BZWReader.h" // implementation-specific system headers #include #include #include // implementation-specific bzflag headers #include "BZDBCache.h" // implementation-specific bzfs-specific headers #include "TeamBases.h" #include "WorldFileObject.h" #include "CustomGroup.h" #include "CustomBox.h" #include "CustomPyramid.h" #include "CustomGate.h" #include "CustomLink.h" #include "CustomBase.h" #include "CustomWeapon.h" #include "CustomWorld.h" #include "CustomZone.h" #include "CustomTetra.h" #include "CustomMesh.h" #include "CustomArc.h" #include "CustomCone.h" #include "CustomSphere.h" #include "CustomWaterLevel.h" #include "CustomDynamicColor.h" #include "CustomTextureMatrix.h" #include "CustomMaterial.h" #include "CustomPhysicsDriver.h" #include "CustomMeshTransform.h" // common headers #include "ObstacleMgr.h" #include "BaseBuilding.h" #include "TextUtils.h" #include "StateDatabase.h" // bzfs specific headers #include "bzfs.h" BZWReader::BZWReader(std::string filename) : cURLManager(), location(filename), input(NULL) { static const std::string httpProtocol("http://"); static const std::string ftpProtocol("ftp://"); static const std::string fileProtocol("file:/"); errorHandler = new BZWError(location); if ((filename.substr(0, httpProtocol.size()) == httpProtocol) || (filename.substr(0, ftpProtocol.size()) == ftpProtocol) || (filename.substr(0, fileProtocol.size()) == fileProtocol)) { setURL(location); performWait(); input = new std::istringstream(httpData); } else { input = new std::ifstream(filename.c_str(), std::ios::in); } // .BZW is the official worldfile extension, warn for others if ((filename.length() < 4) || (strcasecmp(filename.substr(filename.length() - 4, 4).c_str(), ".bzw") != 0)) { errorHandler->warning(std::string( "world file extension is not .bzw, trying to load anyway"), 0); } if (input->peek() == EOF) { errorHandler->fatalError(std::string("could not find bzflag world file"), 0); } } BZWReader::~BZWReader() { // clean up delete errorHandler; delete input; } void BZWReader::finalization(char *data, unsigned int length, bool good) { if (good) httpData = std::string(data, length); else httpData = ""; } void BZWReader::readToken(char *buffer, int n) { int c = -1; // skip whitespace while (input->good() && (c = input->get()) != -1 && isspace(c) && c != '\n') ; // read up to whitespace or n - 1 characters into buffer int i = 0; if (c != -1 && c != '\n') { buffer[i++] = c; while (input->good() && i < n - 1 && (c = input->get()) != -1 && !isspace(c)) buffer[i++] = (char)c; } // terminate string buffer[i] = 0; // put back last character we didn't use if (c != -1 && isspace(c)) input->putback(c); } static bool parseNormalObject(const char* token, WorldFileObject** object) { WorldFileObject* tmpObj = NULL; if (strcasecmp(token, "box") == 0) { tmpObj = new CustomBox; } else if (strcasecmp(token, "pyramid") == 0) { tmpObj = new CustomPyramid(); } else if (strcasecmp(token, "base") == 0) { tmpObj = new CustomBase; } else if (strcasecmp(token, "link") == 0) { tmpObj = new CustomLink(); } else if (strcasecmp(token, "mesh") == 0) { tmpObj = new CustomMesh; } else if (strcasecmp(token, "arc") == 0) { tmpObj = new CustomArc(false); } else if (strcasecmp(token, "meshbox") == 0) { tmpObj = new CustomArc(true); } else if (strcasecmp(token, "cone") == 0) { tmpObj = new CustomCone(false); } else if (strcasecmp(token, "meshpyr") == 0) { tmpObj = new CustomCone(true); } else if (strcasecmp(token, "sphere") == 0) { tmpObj = new CustomSphere; } else if (strcasecmp(token, "tetra") == 0) { tmpObj = new CustomTetra(); } else if (strcasecmp(token, "weapon") == 0) { tmpObj = new CustomWeapon; } else if (strcasecmp(token, "zone") == 0) { tmpObj = new CustomZone; } else if (strcasecmp(token, "waterLevel") == 0) { tmpObj = new CustomWaterLevel; } else if (strcasecmp(token, "dynamicColor") == 0) { tmpObj = new CustomDynamicColor; } else if (strcasecmp(token, "textureMatrix") == 0) { tmpObj = new CustomTextureMatrix; } else if (strcasecmp(token, "material") == 0) { tmpObj = new CustomMaterial; } else if (strcasecmp(token, "physics") == 0) { tmpObj = new CustomPhysicsDriver; } else if (strcasecmp(token, "transform") == 0) { tmpObj = new CustomMeshTransform; } if (tmpObj != NULL) { *object = tmpObj; return true; } else { return false; } } bool BZWReader::readWorldStream(std::vector& wlist, GroupDefinition* groupDef) { // make sure input is valid if (input->peek() == EOF) { errorHandler->fatalError(std::string("unexpected EOF"), 0); return false; } int line = 1; char buffer[1024]; WorldFileObject* object = NULL; WorldFileObject* newObject = NULL; WorldFileObject* const fakeObject = (WorldFileObject*)((char*)NULL + 1); GroupDefinition* const worldDef = (GroupDefinition*)OBSTACLEMGR.getWorld(); GroupDefinition* const startDef = groupDef; std::string customObject; std::vector customLines; bool gotWorld = false; while (!input->eof() && !input->fail() && input->good()) { // watch out for starting a new object when one is already in progress if (newObject) { if (object) { errorHandler->warning( std::string("discarding incomplete object"), line); if (object != fakeObject) { delete object; } else if (customObject.size()) { customObject = ""; customLines.clear(); } } object = newObject; newObject = NULL; } // read first token but do not skip newlines readToken(buffer, sizeof(buffer)); if (strcmp(buffer, "") == 0) { // ignore blank line } else if (buffer[0] == '#') { // ignore comment } else if (strcasecmp(buffer, "end") == 0) { if (object) { if (object != fakeObject) { if (object->usesManager()) { object->writeToManager(); delete object; } else if (object->usesGroupDef()) { object->writeToGroupDef(groupDef); delete object; } else { wlist.push_back(object); } } else if (customObject.size()) { bz_CustomMapObjectInfo data; data.name = bz_ApiString(customObject); for (unsigned int i = 0; i < customLines.size(); i++) data.data.push_back(customLines[i]); customObjectMap[customObject]->MapObject(bz_ApiString(customObject),&data); object = NULL; } object = NULL; } else { errorHandler->fatalError( std::string("unexpected \"end\" token"), line); return false; } } else if (parseNormalObject(buffer, &newObject)) { // newObject has already been assigned } else if (strcasecmp(buffer, "define") == 0) { if (groupDef != worldDef) { errorHandler->warning( std::string("group definitions can not be nested \"") + std::string(buffer) + std::string("\" - skipping"), line); } else { readToken(buffer, sizeof(buffer)); if (strlen(buffer) > 0) { if (OBSTACLEMGR.findGroupDef(buffer) != NULL) { errorHandler->warning( std::string("duplicate group definition \"") + std::string(buffer) + std::string("\" - using newest"), line); } groupDef = new GroupDefinition(buffer); } else { errorHandler->warning( std::string("missing group definition name"), line); } } } else if (strcasecmp(buffer, "enddef") == 0) { if (groupDef == worldDef) { errorHandler->warning( std::string("enddef without define - skipping"), line); } else { OBSTACLEMGR.addGroupDef(groupDef); groupDef = worldDef; } } else if (strcasecmp(buffer, "group") == 0) { readToken(buffer, sizeof(buffer)); if (strlen(buffer) <= 0) { errorHandler->warning( std::string("missing group definition reference"), line); } newObject = new CustomGroup(buffer); } else if (strcasecmp(buffer, "teleporter") == 0) { readToken(buffer, sizeof(buffer)); newObject = new CustomGate(buffer); } else if (strcasecmp(buffer, "options") == 0) { newObject = fakeObject; } else if (strcasecmp(buffer, "include") == 0) { // NOTE: intentionally undocumented (at the moment) readToken(buffer, sizeof(buffer)); std::string incName = buffer; if (object == NULL) { // FIXME - check for recursion // - better filename handling ("", spaces, and / vs. \\) // - make relative names work from the base file location logDebugMessage(1,"%s: (line %i): including \"%s\"\n", location.c_str(), line, incName.c_str()); BZWReader incFile(incName); std::vector incWlist; if (incFile.readWorldStream(incWlist, groupDef)) { // add the included objects for (unsigned int i = 0; i < incWlist.size(); i++) { wlist.push_back(incWlist[i]); } } else { // empty the failed list emptyWorldFileObjectList(incWlist); errorHandler->fatalError( TextUtils::format("including \"%s\"", incName.c_str()), line); return false; } } else { errorHandler->warning( TextUtils::format("including \"%s\" within an obstacle, skipping", incName.c_str()), line); } } else if (strcasecmp(buffer, "world") == 0) { if (!gotWorld) { newObject = new CustomWorld(); gotWorld = true; } else { errorHandler->warning( std::string("multiple \"world\" sections found"), line); } } else if (object) { if (object != fakeObject) { if (!object->read(buffer, *input)) { // unknown token errorHandler->warning( std::string("unknown object parameter \"") + std::string(buffer) + std::string("\" - skipping"), line); // delete object; // return false; } } else if (customObject.size()) { std::string thisline = buffer; thisline += " "; while (input->good() && input->peek() != '\n') { input->get(buffer, sizeof(buffer)); thisline += buffer; } thisline = TextUtils::replace_all(thisline,std::string("\r"),std::string("")); thisline = TextUtils::replace_all(thisline,std::string("\n"),std::string("")); customLines.push_back(thisline); } } else { // filling the current object // unknown token if (customObjectMap.find(TextUtils::toupper(std::string(buffer))) != customObjectMap.end()) { customObject = TextUtils::toupper(std::string(buffer)); object = fakeObject; customLines.clear(); } else { errorHandler->warning( std::string("invalid object type \"") + std::string(buffer) + std::string("\" - skipping"), line); if (object != fakeObject) delete object; } // return false; } // discard remainder of line while (input->good() && input->peek() != '\n') input->get(buffer, sizeof(buffer)); input->getline(buffer, sizeof(buffer)); ++line; } bool retval = true; if (object) { errorHandler->fatalError(std::string("missing \"end\" parameter"), line); if (object != fakeObject) { delete object; } retval = false; } if (groupDef != startDef) { errorHandler->fatalError(std::string("missing \"enddef\" parameter"), line); if (startDef == worldDef) { delete groupDef; } retval = false; } return retval; } WorldInfo* BZWReader::defineWorldFromFile() { // create world object WorldInfo *myWorld = new WorldInfo; if (!myWorld) { errorHandler->fatalError(std::string("WorldInfo failed to initialize"), 0); return NULL; } // read file std::vector list; GroupDefinition* worldDef = (GroupDefinition*)OBSTACLEMGR.getWorld(); if (!readWorldStream(list, worldDef)) { emptyWorldFileObjectList(list); errorHandler->fatalError(std::string("world file failed to load."), 0); delete myWorld; return NULL; } if (!BZDB.isTrue("noWalls")) makeWalls(); // generate group instances OBSTACLEMGR.makeWorld(); // make local bases unsigned int i; const ObstacleList& baseList = OBSTACLEMGR.getBases(); for (i = 0; i < baseList.size(); i++) { const BaseBuilding* base = (const BaseBuilding*) baseList[i]; TeamColor color = (TeamColor)base->getTeam(); if (bases.find(color) == bases.end()) { bases[color] = TeamBases((TeamColor)color); } bases[color].addBase(base->getPosition(), base->getSize(), base->getRotation()); } // add objects const unsigned int n = list.size(); for (i = 0; i < n; ++i) { list[i]->writeToWorld(myWorld); } // clean up emptyWorldFileObjectList(list); myWorld->finishWorld(); return myWorld; } // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/BZWReader.h000066400000000000000000000027511200563112200171350ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef __BZWREADER_H__ #define __BZWREADER_H__ // bzflag common header #include "common.h" #include "network.h" // system headers #include #include #include /* bzflag common headers */ #include "BZWError.h" #include "cURLManager.h" class WorldFileObject; class WorldInfo; class BZWReader : cURLManager { public: BZWReader(std::string filename); ~BZWReader(); // external interface WorldInfo *defineWorldFromFile(); private: // functions for internal use void readToken(char *buffer, int n); bool readWorldStream(std::vector& wlist, class GroupDefinition* groupDef); void finalization(char *data, unsigned int length, bool good); // stream to open std::string location; std::istream *input; // data/dependent objects BZWError *errorHandler; // no default constructor BZWReader(); std::string httpData; }; #endif // Local Variables: *** // mode:C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/BanCommands.cxx000066400000000000000000001062241200563112200201050ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ // interface header #include "commands.h" // system headers #include #include // common implementation headers #include "TextUtils.h" #include "WorldEventManager.h" // local implementation headers #include "ServerCommand.h" #include "MasterBanList.h" #include "bzfs.h" class KickCommand : ServerCommand { public: KickCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class KillCommand : ServerCommand { public: KillCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class BanListCommand : ServerCommand { public: BanListCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class CheckIPCommand : ServerCommand { public: CheckIPCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class HostbanListCommand : ServerCommand { public: HostbanListCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class IdBanListCommand : ServerCommand { public: IdBanListCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class BanCommand : ServerCommand { public: BanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class HostbanCommand : ServerCommand { public: HostbanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class IdBanCommand : ServerCommand { public: IdBanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class UnbanCommand : ServerCommand { public: UnbanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class HostUnbanCommand : ServerCommand { public: HostUnbanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class IdUnbanCommand : ServerCommand { public: IdUnbanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class MuteCommand : ServerCommand { public: MuteCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class UnmuteCommand : ServerCommand { public: UnmuteCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class MuteListCommand : ServerCommand { public: MuteListCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; class MasterBanCommand : ServerCommand { public: MasterBanCommand(); virtual bool operator() (const char *commandLine, GameKeeper::Player *playerData); }; static KickCommand kickCommand; static KillCommand killCommand; static CheckIPCommand checkIPCommand; static BanCommand banCommand; static UnbanCommand unbanCommand; static BanListCommand banListCommand; static HostbanCommand hostbanCommand; static HostUnbanCommand hostUnbanCommand; static HostbanListCommand hostbanListCommand; static IdBanCommand idBanCommand; static IdUnbanCommand idUnbanCommand; static IdBanListCommand idBanListCommand; static MuteCommand muteCommand; static UnmuteCommand unmuteCommand; static MuteListCommand muteListCommand; static MasterBanCommand masterBanCommand; KickCommand::KickCommand() : ServerCommand("/kick", "<#slot|PlayerName|\"Player Name\"> - kick the player off the server") {} KillCommand::KillCommand() : ServerCommand("/kill", "<#slot|PlayerName|\"Player Name\"> [reason] - kill a player") {} BanListCommand::BanListCommand() : ServerCommand("/banlist", "[pattern] - List the IPs currently banned from this server") {} CheckIPCommand::CheckIPCommand() : ServerCommand("/checkip", " - check if IP is banned and print corresponding ban info") {} BanCommand::BanCommand() : ServerCommand("/ban", "<#slot|PlayerName|\"Player Name\"|ip> - ban a player, ip or ip range off the server") {} UnbanCommand::UnbanCommand() : ServerCommand("/unban", " - remove a ip pattern from the ban list") {} HostbanCommand::HostbanCommand() : ServerCommand("/hostban", " [duration] [reason] - ban using host pattern off the server") {} HostUnbanCommand::HostUnbanCommand() : ServerCommand("/hostunban", " - remove a host pattern from the host ban list") {} HostbanListCommand::HostbanListCommand() : ServerCommand("/hostbanlist", "[pattern] - List the host patterns currently banned from this server") {} IdBanCommand::IdBanCommand() : ServerCommand("/idban", "<#slot|+id|PlayerName|\"Player Name\"> - ban using BZID") {} IdUnbanCommand::IdUnbanCommand() : ServerCommand("/idunban", " - remove a BZID from the ban list") {} IdBanListCommand::IdBanListCommand(): ServerCommand("/idbanlist", "[pattern] - List the BZIDs currently banned from this server") {} MuteCommand::MuteCommand() : ServerCommand("/mute", "<#slot|PlayerName|\"Player Name\"> - remove the ability for a player to communicate with other players") {} UnmuteCommand::UnmuteCommand() : ServerCommand("/unmute", "<#slot|PlayerName|\"Player Name\"> - restore the TALK permission to a previously muted player") {} MuteListCommand::MuteListCommand() : ServerCommand("/mutelist", "list the players current muted") {} MasterBanCommand::MasterBanCommand() : ServerCommand("/masterban", " - manage the masterban list") {} bool MuteCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::mute)) { sendMessage(ServerPlayer, t, "You do not have permission to run the mute command"); return true; } std::vector argv = TextUtils::tokenize(message, " \t", 3, true); if (argv.size() < 2) { sendMessage(ServerPlayer, t, "Syntax: /mute <#slot | PlayerName | \"Player Name\">"); return true; } int i = GameKeeper::Player::getPlayerIDByName(argv[1]); char msg[MessageLen]; // Player not found if (i < 0) { snprintf(msg, MessageLen, "player \"%s\" not found", argv[1].c_str()); sendMessage(ServerPlayer, t, msg); return true; } // mute the player GameKeeper::Player *muteData = GameKeeper::Player::getPlayerByIndex(i); if (muteData) { muteData->accessInfo.revokePerm(PlayerAccessInfo::talk); snprintf(msg, MessageLen, "You have been muted by %s.", playerData->player.getCallSign()); sendMessage(ServerPlayer, i, msg); // confirm player is muted snprintf(msg, MessageLen, "player id #%d \"%s\" has been muted by %s.", i, muteData->player.getCallSign(), playerData->player.getCallSign()); sendMessage(ServerPlayer, AdminPlayers, msg); if (!playerData->accessInfo.isAdmin()) { snprintf(msg, MessageLen, "player id #%d \"%s\" is now muted.", i, muteData->player.getCallSign()); sendMessage(ServerPlayer, t, msg); } } return true; } bool UnmuteCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::mute)) { sendMessage(ServerPlayer, t, "You do not have permission to run the unmute command"); return true; } std::vector argv = TextUtils::tokenize(message, " \t", 3, true); if (argv.size() < 2) { sendMessage(ServerPlayer, t, "Syntax: /unmute <#slot | PlayerName | \"Player Name\">"); return true; } int i = GameKeeper::Player::getPlayerIDByName(argv[1]); char msg[MessageLen]; // Player not found if (i < 0) { snprintf(msg, MessageLen, "player \"%s\" not found", argv[1].c_str()); sendMessage(ServerPlayer, t, msg); return true; } // unmute the player GameKeeper::Player *unmuteData = GameKeeper::Player::getPlayerByIndex(i); if (unmuteData) { unmuteData->accessInfo.grantPerm(PlayerAccessInfo::talk); snprintf(msg, MessageLen, "You have been unmuted by %s.", playerData->player.getCallSign()); sendMessage(ServerPlayer, i, msg); // confirm player is unmuted snprintf(msg, MessageLen, "player id #%d \"%s\" has been unmuted by %s.", i, unmuteData->player.getCallSign(), playerData->player.getCallSign()); sendMessage(ServerPlayer, AdminPlayers, msg); if (!playerData->accessInfo.isAdmin()) { snprintf(msg, MessageLen, "player id #%d \"%s\" is now unmuted.", i, unmuteData->player.getCallSign()); sendMessage(ServerPlayer, t, msg); } } return true; } bool MuteListCommand::operator() (const char * UNUSED(message), GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::mute)) { sendMessage(ServerPlayer, t, "You do not have permission to run the mutelist command"); return true; } sendMessage(ServerPlayer, t, "Muted Players"); sendMessage(ServerPlayer, t, "-------------"); for (int i = 0; i < curMaxPlayers; i++) { GameKeeper::Player *iPlayerData = GameKeeper::Player::getPlayerByIndex(i); if (iPlayerData) { if (!iPlayerData->accessInfo.hasPerm(PlayerAccessInfo::talk)) { sendMessage(ServerPlayer, t, iPlayerData->player.getCallSign()); } } } return true; } bool KickCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::kick)) { sendMessage(ServerPlayer, t, "You do not have permission to run the kick command"); return true; } int i; std::vector argv = TextUtils::tokenize(message, " \t", 3, true); if (argv.size() < 3) { sendMessage(ServerPlayer, t, "Syntax: /kick <#slot | PlayerName | \"Player Name\"> " ""); sendMessage(ServerPlayer, t, " Please keep in mind that reason is displayed to the " "user."); return true; } i = GameKeeper::Player::getPlayerIDByName(argv[1]); if (i >= 0) { // call any plugin events registered for /kick bz_KickEventData_V1 kickEvent; kickEvent.kickerID = t; kickEvent.kickedID = i; kickEvent.reason = argv[2].c_str(); worldEventManager.callEvents(bz_eKickEvent,&kickEvent); // need to update playerIndex ? if (t != kickEvent.kickerID) { playerData = GameKeeper::Player::getPlayerByIndex(kickEvent.kickerID); if (!playerData) return true; } char kickmessage[MessageLen]; GameKeeper::Player *p = GameKeeper::Player::getPlayerByIndex(kickEvent.kickedID); // operators can override antiperms if (!playerData->accessInfo.isOperator()) { // otherwise make sure the player is not protected with an antiperm if ((p != NULL) && (p->accessInfo.hasPerm(PlayerAccessInfo::antikick))) { snprintf(kickmessage, MessageLen, "%s is protected from being kicked.", p->player.getCallSign()); sendMessage(ServerPlayer,kickEvent.kickerID, kickmessage); return true; } } snprintf(kickmessage, MessageLen, "You were kicked off the server by %s", playerData->player.getCallSign()); sendMessage(ServerPlayer, kickEvent.kickedID, kickmessage); if (kickEvent.reason.size() > 0) { snprintf(kickmessage, MessageLen, " reason given : %s", kickEvent.reason.c_str()); sendMessage(ServerPlayer, kickEvent.kickedID, kickmessage); } snprintf(kickmessage, MessageLen, "%s kicked by %s, reason: %s", p->player.getCallSign(), playerData->player.getCallSign(), kickEvent.reason.c_str()); sendMessage(ServerPlayer, AdminPlayers, kickmessage); removePlayer(kickEvent.kickedID, "/kick"); } else { char errormessage[MessageLen]; snprintf(errormessage, MessageLen, "player \"%s\" not found", argv[1].c_str()); sendMessage(ServerPlayer, t, errormessage); } return true; } bool KillCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::kill)) { sendMessage(ServerPlayer, t, "You do not have permission to run the kill command"); return true; } int i; std::vector argv = TextUtils::tokenize(message, " \t", 3, true); if (argv.size() < 2) { sendMessage(ServerPlayer, t, "Syntax: /kill <#slot | PlayerName | \"Player Name\"> " "[reason]"); sendMessage(ServerPlayer, t, " Please keep in mind that reason is displayed to the " "user."); return true; } i = GameKeeper::Player::getPlayerIDByName(argv[1]); // Don't kill players who aren't alive GameKeeper::Player *p = GameKeeper::Player::getPlayerByIndex(i); if (p != NULL && !p->player.isAlive()) { char buffer[MessageLen]; snprintf(buffer, MessageLen, "%s is not alive.", p->player.getCallSign()); sendMessage(ServerPlayer, t, buffer); return true; } if (i >= 0) { // call any plugin events registered for /kill bz_KillEventData_V1 killEvent; killEvent.killerID = t; killEvent.killedID = i; if (argv.size() > 2) killEvent.reason = argv[2].c_str(); // need to update playerIndex ? if (t != killEvent.killerID) { playerData = GameKeeper::Player::getPlayerByIndex(killEvent.killerID); if (!playerData) return true; } char killmessage[MessageLen]; // operators can override antiperms if (!playerData->accessInfo.isOperator()) { // otherwise make sure the player is not protected with an antiperm p = GameKeeper::Player::getPlayerByIndex(killEvent.killedID); if ((p != NULL) && (p->accessInfo.hasPerm(PlayerAccessInfo::antikill))) { snprintf(killmessage, MessageLen, "%s is protected from being killed.", p->player.getCallSign()); sendMessage(ServerPlayer, t, killmessage); return true; } } snprintf(killmessage, MessageLen, "You were killed by %s", playerData->player.getCallSign()); sendMessage(ServerPlayer, killEvent.killedID, killmessage); if (killEvent.reason.size() > 0) { snprintf(killmessage, MessageLen, " reason given : %s", killEvent.reason.c_str()); sendMessage(ServerPlayer, killEvent.killedID, killmessage); } // call the event worldEventManager.callEvents(bz_eKillEvent,&killEvent); // kill the player playerKilled(killEvent.killedID, ServerPlayer, 0, -1, Flags::Null, -1); } else { char errormessage[MessageLen]; snprintf(errormessage, MessageLen, "player \"%s\" not found", argv[1].c_str()); sendMessage(ServerPlayer, t, errormessage); } return true; } bool CheckIPCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::banlist)) { sendMessage(ServerPlayer, t, "You do not have permission to run the banlist command"); return true; } std::vector argv = TextUtils::tokenize(message, " \t"); if (argv.size() != 2) { sendMessage(ServerPlayer, t, "Syntax: /checkip "); return true; } in_addr ip = Address(argv[1]); BanInfo baninfo(ip); const bool banned = !clOptions->acl.validate(ip, &baninfo); if (banned) { std::string bannedmsg = argv[1] + " is banned:"; sendMessage(ServerPlayer, t, bannedmsg.c_str()); clOptions->acl.sendBan(t, baninfo); } else { std::string notbannedmsg = argv[1] + " is not banned."; sendMessage(ServerPlayer, t, notbannedmsg.c_str()); } return true; } bool BanListCommand::operator() (const char* message, GameKeeper::Player* playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::banlist)) { sendMessage(ServerPlayer, t, "You do not have permission to run the banlist command"); return true; } clOptions->acl.sendBans(t, message + commandName.size()); return true; } bool HostbanListCommand::operator() (const char* message, GameKeeper::Player* playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::banlist)) { sendMessage(ServerPlayer, t, "You do not have permission to run the banlist command"); return true; } clOptions->acl.sendHostBans(t, message + commandName.size()); return true; } bool IdBanListCommand::operator() (const char* message, GameKeeper::Player* playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::banlist)) { sendMessage(ServerPlayer, t, "You do not have permission to run the banlist command"); return true; } clOptions->acl.sendIdBans(t, message + commandName.size()); return true; } static void addNamePrefix(std::string& reason, const std::string& name) { // add the name prefix if the name isn't already contained if (strstr(reason.c_str(), name.c_str()) == NULL) { reason = "(" + name + ") " + reason; } return; } static bool doBanKick(GameKeeper::Player *victim, GameKeeper::Player *banner, const char* reason) { if ((victim == NULL) || (banner == NULL)) { return true; // proceed with the ban } char buffer[MessageLen]; const int victimID = victim->getIndex(); const int bannerID = banner->getIndex(); // operators can override antiperms, except for other operators if (victim->accessInfo.isOperator() || !banner->accessInfo.isOperator()) { // make sure this player isn't protected if (victim->accessInfo.hasPerm(PlayerAccessInfo::antiban)) { snprintf(buffer, MessageLen, "%s is protected from being banned (skipped).", victim->player.getCallSign()); sendMessage(ServerPlayer, bannerID, buffer); return false; // do not use the ban } } // send a notice to the victim snprintf(buffer, MessageLen, "You were banned from this server by %s", banner->player.getCallSign()); sendMessage(ServerPlayer, victimID, buffer); if (strlen(reason) > 0) { snprintf(buffer, MessageLen, "Reason given: %s", reason); sendMessage(ServerPlayer, victimID, buffer); } // send a notice to the admins snprintf(buffer, MessageLen, "%s banned by %s, reason: %s", victim->player.getCallSign(), banner->player.getCallSign(), reason); sendMessage(ServerPlayer, AdminPlayers, buffer); // you're outta here removePlayer(victimID, "/ban"); return true; } bool BanCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::ban) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::shortBan)) { sendMessage(ServerPlayer, t, "You do not have permission to run the ban command"); return true; } std::string msg = message; std::vector argv = TextUtils::tokenize(msg, " \t", 4, true); if (argv.size() != 4) { sendMessage(ServerPlayer, t, "Syntax: /ban <#slot | PlayerName | \"Player Name\" | ip> " " "); sendMessage(ServerPlayer, t, " can be 'short' or 'default' for the default" " ban time "); sendMessage(ServerPlayer, t, " or 'forever' or 'max' for infinite bans "); sendMessage(ServerPlayer, t, " or a time in the format WD" "HM "); sendMessage(ServerPlayer, t, " or just a number of minutes "); sendMessage(ServerPlayer, t, " Please keep in mind that reason is displayed to the " "user."); return true; } std::string ip = argv[1]; int victim = GameKeeper::Player::getPlayerIDByName(argv[1]); GameKeeper::Player* victimPlayer = NULL; if (victim >= 0) { // valid slot or callsign victimPlayer = GameKeeper::Player::getPlayerByIndex(victim); if (victimPlayer) { if (victimPlayer->accessInfo.hasPerm(PlayerAccessInfo::antiban)){ char buffer[MessageLen]; snprintf(buffer, MessageLen, "%s is protected from being banned (skipped).", victimPlayer->player.getCallSign()); sendMessage(ServerPlayer, t, buffer); return true; } ip = victimPlayer->netHandler->getTargetIP(); } } // setup the ban duration int durationInt = clOptions->banTime; int specifiedDuration; if (!TextUtils::parseDuration(argv[2].c_str(), specifiedDuration)) { sendMessage(ServerPlayer, t, "Error: invalid ban duration"); sendMessage(ServerPlayer, t, "Duration examples: 30m 1h 1d 1w and mixing: 1w2d4h " "1w2d1m"); return true; } if (specifiedDuration >= 0) { if ((durationInt > 0) && ((specifiedDuration > durationInt) || (specifiedDuration <= 0)) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::ban)) { sendMessage (ServerPlayer, t, "You only have SHORTBAN privileges," " using default ban time"); } else { durationInt = specifiedDuration; } } // set the ban reason std::string reason; reason = argv[3]; if (victimPlayer) { addNamePrefix(reason, victimPlayer->player.getCallSign()); } // call any plugin events registered for /ban bz_BanEventData_V1 banEvent; banEvent.bannerID = t; banEvent.ipAddress = ip.c_str(); banEvent.reason = reason.c_str(); banEvent.duration = durationInt; // if we know for sure who is to be banned, submit it if (victim >= 0) { banEvent.banneeID = victim; } worldEventManager.callEvents(bz_eBanEvent,&banEvent); // a plugin might have changed bannerID if (t != banEvent.bannerID) { playerData = GameKeeper::Player::getPlayerByIndex(banEvent.bannerID); if (!playerData) return true; } // handle the case of a single intended victim if (victimPlayer) { if (!doBanKick(victimPlayer, playerData, banEvent.reason.c_str())) { return true; // could not ban, bail } // add a bzId ban if we can const std::string& bzid = victimPlayer->getBzIdentifier(); if (bzid.size() > 0) { clOptions->acl.load(); clOptions->acl.idBan(bzid, playerData->player.getCallSign(), banEvent.duration, banEvent.reason.c_str()); clOptions->acl.save(); sendMessage(ServerPlayer, t, "Pattern added to the BZID banlist"); } } // reload the banlist in case anyone else has added clOptions->acl.load(); // add the ban, and kick any that it applies to if (clOptions->acl.ban(banEvent.ipAddress.c_str(), playerData->player.getCallSign(), banEvent.duration, banEvent.reason.c_str())) { clOptions->acl.save(); sendMessage(ServerPlayer, t, "Pattern added to the IP banlist"); for (int i = 0; i < curMaxPlayers; i++) { GameKeeper::Player *tmpVictim = GameKeeper::Player::getPlayerByIndex(i); if (tmpVictim && !clOptions->acl.validate(tmpVictim->netHandler->getIPAddress())) { // ignore the return code doBanKick(tmpVictim, playerData, banEvent.reason.c_str()); } } } else { char buffer[MessageLen]; snprintf(buffer, MessageLen, "Malformed address or invalid Player/Slot: %s", argv[1].c_str()); sendMessage(ServerPlayer, t, buffer); } return true; } bool HostbanCommand::operator() (const char* message, GameKeeper::Player* playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::ban) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::shortBan)) { sendMessage(ServerPlayer, t, "You do not have permission to run the ban command"); return true; } std::string msg = message; std::vector argv = TextUtils::tokenize(msg, " \t", 4); if (argv.size() < 2) { sendMessage(ServerPlayer, t, "Syntax: /hostban [duration] [reason]"); sendMessage(ServerPlayer, t, " Please keep in mind that reason is displayed to the " "user."); return true; } std::string hostpat = argv[1]; // set the ban time int durationInt = clOptions->banTime; if (argv.size() >= 3) { int specifiedDuration; // setup the ban duration if (!TextUtils::parseDuration(argv[2].c_str(), specifiedDuration)) { sendMessage(ServerPlayer, t, "Error: invalid ban duration"); sendMessage(ServerPlayer, t, "Duration examples: 30m 1h 1d 1w and mixing: 1w2d4h " "1w2d1m"); return true; } if (specifiedDuration >= 0) { if ((durationInt > 0) && ((specifiedDuration > durationInt) || (specifiedDuration <= 0)) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::ban)) { sendMessage (ServerPlayer, t, "You only have SHORTBAN privileges," " using default ban time"); } else { durationInt = specifiedDuration; } } } // set the ban reason std::string reason; if (argv.size() == 4) { reason = argv[3]; } // call any plugin events registered for /hostban bz_HostBanEventData_V1 hostBanEvent; hostBanEvent.bannerID = t; hostBanEvent.hostPattern = hostpat.c_str(); hostBanEvent.reason = reason.c_str(); hostBanEvent.duration = durationInt; worldEventManager.callEvents(bz_eHostBanModifyEvent,&hostBanEvent); // a plugin might have changed bannerID if (t != hostBanEvent.bannerID) { playerData = GameKeeper::Player::getPlayerByIndex(hostBanEvent.bannerID); if (!playerData) return true; } // reload the banlist in case anyone else has added clOptions->acl.load(); clOptions->acl.hostBan(hostBanEvent.hostPattern.c_str(), playerData->player.getCallSign(), hostBanEvent.duration, hostBanEvent.reason.c_str()); clOptions->acl.save(); GameKeeper::Player::setAllNeedHostbanChecked(true); sendMessage(ServerPlayer, t, "Pattern added to the HOSTNAME banlist"); return true; } bool IdBanCommand::operator() (const char* message, GameKeeper::Player* playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::ban) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::shortBan)) { sendMessage(ServerPlayer, t, "You do not have permission to run the ban command"); return true; } std::string msg = message; std::vector argv = TextUtils::tokenize(msg, " \t", 4, true); if (argv.size() != 4) { sendMessage(ServerPlayer, t, "Syntax: /idban <#slot|+id|PlayerName|\"Player Name\"> "); sendMessage(ServerPlayer, t, " Please keep in mind that reason is displayed to the user."); return true; } // get the ban pattern or victim std::string idpat = argv[1]; int victim = -1; GameKeeper::Player *victimPlayer = NULL; if (idpat[0] == '+') { idpat = idpat.c_str() + 1; // strip the '+' for a raw id pattern if (idpat.size() <= 0) { sendMessage(ServerPlayer, t, "Error: invalid id pattern"); return true; } // check for a player that matches for (int i = 0; i < curMaxPlayers; i++) { GameKeeper::Player *tmpPlayer = GameKeeper::Player::getPlayerByIndex(i); if ((tmpPlayer != NULL) && (tmpPlayer->getBzIdentifier().size() > 0)) { const std::string& bzId = tmpPlayer->getBzIdentifier(); if (idpat == bzId) { victim = i; victimPlayer = tmpPlayer; break; } } } } else { // looking for a specific player victim = GameKeeper::Player::getPlayerIDByName(idpat); victimPlayer = GameKeeper::Player::getPlayerByIndex(victim); if ((victim < 0) || (victimPlayer == NULL)) { char buffer[MessageLen]; snprintf(buffer, MessageLen, "could not find player (%s)", idpat.c_str()); sendMessage(ServerPlayer, t, buffer); return true; } // found the player, check for a BZID const std::string& bzId = victimPlayer->getBzIdentifier(); if (bzId.size() <= 0) { char buffer[MessageLen]; snprintf(buffer, MessageLen, "no BZID for player (%s)", idpat.c_str()); sendMessage(ServerPlayer, t, buffer); return true; } idpat = bzId; // success } // setup the ban duration int durationInt = clOptions->banTime; int specifiedDuration; if (!TextUtils::parseDuration(argv[2].c_str(), specifiedDuration)) { sendMessage(ServerPlayer, t, "Error: invalid ban duration"); sendMessage(ServerPlayer, t, "Duration examples: 30m 1h 1d 1w and mixing: 1w2d4h " "1w2d1m"); return true; } if (specifiedDuration >= 0) { if ((durationInt > 0) && ((specifiedDuration > durationInt) || (specifiedDuration <= 0)) && !playerData->accessInfo.hasPerm(PlayerAccessInfo::ban)) { sendMessage (ServerPlayer, t, "You only have SHORTBAN privileges," " using default ban time"); } else { durationInt = specifiedDuration; } } // set the ban reason std::string reason = argv[3]; if (victimPlayer) { addNamePrefix(reason, victimPlayer->player.getCallSign()); } // remove the victim if we have one if (victimPlayer) { if (!doBanKick(victimPlayer, playerData, reason.c_str())) { return true; // could not ban, bail } } // // FIXME: add to the plugin system // // reload the banlist in case anyone else has added clOptions->acl.load(); clOptions->acl.idBan(idpat, playerData->player.getCallSign(), durationInt, reason.c_str()); clOptions->acl.save(); sendMessage(ServerPlayer, t, "Pattern added to the BZID banlist"); return true; } bool UnbanCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::unban)) { sendMessage(ServerPlayer, t, "You do not have permission to run the unban command"); return true; } if (clOptions->acl.unban(message + 7)) { sendMessage(ServerPlayer, t, "Removed IP pattern from the ban list"); clOptions->acl.save(); } else { sendMessage(ServerPlayer, t, "No pattern removed"); } return true; } bool HostUnbanCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::unban)) { sendMessage(ServerPlayer, t, "You do not have permission to run the /hostunban command"); return true; } if (clOptions->acl.hostUnban(message + 11)) { sendMessage(ServerPlayer, t, "Removed host pattern from the ban list"); clOptions->acl.save(); } else { sendMessage(ServerPlayer, t, "No pattern removed"); } return true; } bool IdUnbanCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::unban)) { sendMessage(ServerPlayer, t, "You do not have permission to run the /idunban command"); return true; } if (clOptions->acl.idUnban(message + 9)) { sendMessage(ServerPlayer, t, "Removed id from the ban list"); clOptions->acl.save(); } else { sendMessage(ServerPlayer, t, "No pattern removed"); } return true; } /** /masterban command * * /masterban flush # remove all master ban entries from this server * /masterban reload # reread and reload all master ban entries * /masterban list # output a list of who is banned */ bool MasterBanCommand::operator() (const char *message, GameKeeper::Player *playerData) { int t = playerData->getIndex(); std::string callsign = std::string(playerData->player.getCallSign()); logDebugMessage(2,"\"%s\" has requested masterban: %s\n", callsign.c_str(), message); if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::masterBan)) { sendMessage(ServerPlayer, t, TextUtils::format("%s, you are presently not authorized to " "run /masterban", callsign.c_str()).c_str()); return true; } logDebugMessage(3,"Player has permission to run /masterban\n"); if (!clOptions->publicizeServer) { sendMessage(ServerPlayer, t, "This is not a public server. Private servers do not use the" " master ban list."); } if (clOptions->suppressMasterBanList) { sendMessage(ServerPlayer, t, "The master ban list is disabled on this " "server."); } std::string argument = &message[10]; /* skip "/masterban" */ std::string cmd = ""; // allow for arbitrary whitespace size_t start = 0; while ((start < argument.size()) && (isspace(argument[start]))) { start++; } size_t end = 0; while ((end < argument.size()) && (!isspace(argument[end]))) { end++; } // make sure the command is lower case for comparison // simplicity/insensitivity cmd = argument.substr(start, end - start); std::transform(cmd.begin(), cmd.end(), cmd.begin(), tolower); if (cmd == "reload") { if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::ban) || !playerData->accessInfo.hasPerm(PlayerAccessInfo::unban)) { sendMessage(ServerPlayer, t, "You do not have permission to reload the master ban list."); sendMessage(ServerPlayer, t, "Permission to ban and unban is required to reload the " "master ban list."); return true; } if (clOptions->publicizeServer && !clOptions->suppressMasterBanList) { MasterBanList banList; sendMessage(ServerPlayer, t, "Previous master ban list entries have been flushed, reloading in background"); bz_reloadMasterBans(); } else { sendMessage(ServerPlayer, t, "No action taken."); } } else if (cmd == "flush") { if (!playerData->accessInfo.hasPerm(PlayerAccessInfo::unban)) { sendMessage(ServerPlayer, t, "You do not have permission to reload the master ban list."); sendMessage(ServerPlayer, t, "Permission to unban is required to flush the master ban " "list."); return true; } clOptions->acl.purgeMasters(); sendMessage(ServerPlayer, t, "The master ban list has been flushed."); } else if (cmd == "list") { std::vector > bans = clOptions->acl.listMasterBans(); if (bans.size() > 20) { sendMessage(ServerPlayer, t, TextUtils::format("There are %d bans, only displaying the " "first 20", bans.size()).c_str()); } else if (bans.empty()) { sendMessage(ServerPlayer, t, "There are no master bans loaded."); } else { // print out a list header std::string banmsg = TextUtils::format("Master Bans from %s:", DefaultMasterBanURL); sendMessage(ServerPlayer, t, banmsg.c_str()); for (size_t i = 0; i < banmsg.size(); i++) { banmsg[i] = '-'; } sendMessage(ServerPlayer, t, banmsg.c_str()); } // print out the bans int counter = 0; for (std::vector >::const_iterator j = bans.begin(); j != bans.end() && counter < 20; ++j, counter++) { sendMessage(ServerPlayer, t, TextUtils::format("%s: %s", (j->first).c_str(), (j->second).c_str()).c_str()); } } else { if (cmd.size() > 0) { sendMessage(ServerPlayer, t, TextUtils::format("Unknown masterban command [%s]", cmd.c_str()).c_str()); } sendMessage(ServerPlayer, t, TextUtils::format("Usage: /masterban list|reload|flush") .c_str()); } return true; } // Local Variables: *** // mode: C++ *** // tab-width: 8 *** // c-basic-offset: 2 *** // indent-tabs-mode: t *** // End: *** // ex: shiftwidth=2 tabstop=8 bzflag-2.4.2+ds1/src/bzfs/CmdLineOptions.cxx000066400000000000000000001600351200563112200206120ustar00rootroot00000000000000/* bzflag * Copyright (c) 1993-2012 Tim Riker * * This package is free software; you can redistribute it and/or * modify it under the terms of the license found in the file * named COPYING that should have accompanied this file. * * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifdef _MSC_VER #pragma warning(4:4786) #endif /* this should be the only header necessary except for headers specific * to the class implementation (such as version.h) */ #include "CmdLineOptions.h" // System headers #include // implementation-specific bzflag headers #include "version.h" #include "Team.h" #include "TextUtils.h" #include "BZDBCache.h" #include "BzMaterial.h" /* FIXME implementation specific header for global that should eventually go away */ #include #include // for -pidfile option #ifdef _WIN32 #include #else #include #include #endif // implementation-specific bzfs-specific headers #include "bzfs.h" #include "RecordReplay.h" #include "BZWError.h" #include "Permissions.h" #include "EntryZones.h" // import from TextUtils for convenience using TextUtils::compare_nocase; const char *usageString = "[-a ] " "[-adminlagannounce